vextoly/cryn
0.2.1
Commit efe20b6 · Vextoly · 2026-10-05T11:44:49+02:00
Comments
No comments yet.
Diff
diff --git a/README.md b/README.md
index ac76751..a84872f 100644
--- a/README.md
+++ b/README.md
@@ -169,7 +169,7 @@ The runtime (`src/rt/cryn_rt.*`) provides only:
|-----------------|----------------------------------|--------------------------------|
| `malloc`/`free` | `make <size> of`, anonymous `make`, `free` | 16-byte header for sizes plus a mutex-protected registry of live blocks; validation of stale addresses is defined, never undefined reads |
| value stack | `push`, `pop`, `swap`, `call` | growable array, per thread |
-| focus history | `move` (relative), `back`, `home`| fixed 256 entries per context (shared across active frames) |
+| focus history | `move` (relative), `back`, `home`| fixed 1024 entries per context (shared across active frames) |
| FILE* streams | `input`, `output`, `open`, `use`, `close`, `flush`| stdin/stdout by default; `use` routes the context's streams through a handle |
| `system()` | `system` | shell escape |
| pthreads | `spawn`, `wait` | join is an ordering guarantee |
@@ -186,7 +186,7 @@ library beyond the above.
make test
```
-45 checks: arithmetic (including overflow wrap and division edge cases),
+46 checks: arithmetic (including overflow wrap and division edge cases),
unsigned arithmetic, floats, all six comparison conditions, branches,
loops, nested loops, functions, recursion, mutual recursion, the value
stack, cells and focus navigation, arrays (sieve of Eratosthenes),
@@ -194,8 +194,9 @@ strings, manual memory, pointer arithmetic, linked lists, callbacks
through transform references, file I/O with first-class handles
(two files interleaved, append mode, flush), threads (`spawn`/`wait`),
a spinlock built from `exchange`, a word
-counter, bubble sort, a free-list allocator, and sixteen programs that
-must fail to compile.
+counter, bubble sort, a free-list allocator, a limits stress test
+(301 cells, 300 labels, 302-deep focus, 1100-deep value stack), and
+sixteen programs that must fail to compile.
## Current limitations
@@ -226,9 +227,12 @@ These are honest boundaries of the first implementation, not pretenses:
cells or addresses.
* **Bounds checks abort** with a diagnostic. A release mode that removes
them is future work.
-* **Fixed limits:** 256 focus history entries, 256 labels, 256 cells per
- transformation, 64 concurrent spawns per context, 64 open files per
- context.
+* **Fixed limits:** 1024 focus history entries, 4096 labels, 4096 cells
+ per transformation, 4096 provable value stack depth, 256 concurrent
+ spawns per context, 256 open files per context. A single
+ `make <size> of` allocation is capped at 16 TiB (the cap is
+ overflow-safe in bytes, not elements); the type table is bounded only
+ by memory.
* **No separate compilation** yet: one `.cryn` file per program.
* **The compiler itself is not yet written in Cryn.** Self-hosting is the
long-term goal; the architecture (small passes, plain data structures,
diff --git a/src/be_c.c b/src/be_c.c
index db203e4..c9246ae 100644
--- a/src/be_c.c
+++ b/src/be_c.c
@@ -310,21 +310,25 @@ static void emit_fn(Buf* o, ProgramIR* p, int fi) {
break;
case I_MAKE_DYN: {
uint64_t esz = type_size(in->t);
+ /* byte cap: n * esz may not exceed 16 TiB, so the product
+ can never overflow uint64; maxn folds the cap into an
+ element count for the emitted check */
+ uint64_t maxn = (UINT64_C(1) << 44) / (esz ? esz : 1);
if (in->b == 1)
buf_printf(o, " { uint64_t n = (uint64_t)%" PRIu64 ";"
- " if (n > 1099511627776ULL) crn_die(\"allocation too large\");"
+ " if (n > (uint64_t)%" PRIu64 "ULL) crn_die(\"allocation too large\");"
" wv.u = (uint64_t)(uintptr_t)crn_alloc(n * %" PRIu64 "); }\n",
- in->imm.u, esz);
+ in->imm.u, maxn, esz);
else if (in->b == 0)
buf_printf(o, " { uint64_t n = (uint64_t)(int64_t)l_%s;"
- " if (n > 1099511627776ULL) crn_die(\"allocation too large\");"
+ " if (n > (uint64_t)%" PRIu64 "ULL) crn_die(\"allocation too large\");"
" wv.u = (uint64_t)(uintptr_t)crn_alloc(n * %" PRIu64 "); }\n",
- fn->locals[in->a].name, esz);
+ fn->locals[in->a].name, maxn, esz);
else
buf_printf(o, " { uint64_t n = (uint64_t)(int64_t)g_%s;"
- " if (n > 1099511627776ULL) crn_die(\"allocation too large\");"
+ " if (n > (uint64_t)%" PRIu64 "ULL) crn_die(\"allocation too large\");"
" wv.u = (uint64_t)(uintptr_t)crn_alloc(n * %" PRIu64 "); }\n",
- p->globs[in->a].name, esz);
+ p->globs[in->a].name, maxn, esz);
cur = ty_addr_to(ty_array(in->t, 0));
break;
}
diff --git a/src/check.c b/src/check.c
index a0804a6..5abac09 100644
--- a/src/check.c
+++ b/src/check.c
@@ -25,10 +25,10 @@
* with `result <type>`.
*/
-#define MAX_FOC 256
-#define MAX_STK 1024
-#define MAX_LOCALS 256
-#define MAX_LABELS 256
+#define MAX_FOC 1024
+#define MAX_STK 4096
+#define MAX_LOCALS 4096
+#define MAX_LABELS 4096
typedef struct FocusEnt {
int is_frame;
diff --git a/src/main.c b/src/main.c
index 9d254da..8ba3f7b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -14,7 +14,7 @@
#include <time.h>
#include <unistd.h>
-#define CRYN_VERSION "0.2.0"
+#define CRYN_VERSION "0.2.1"
static void usage(void) {
printf(
diff --git a/src/rt/cryn_rt.c b/src/rt/cryn_rt.c
index be8dbb8..d4d769f 100644
--- a/src/rt/cryn_rt.c
+++ b/src/rt/cryn_rt.c
@@ -41,7 +41,11 @@ Val crn_pop(void) { return cr_ctx.stk[--cr_ctx.sp]; }
/* ---- focus ---- */
void crn_focus_push(void* f) {
- if (cr_ctx.fh_sp >= CR_FH_MAX) crn_die("focus history overflow");
+ if (cr_ctx.fh_sp >= CR_FH_MAX) {
+ char msg[64];
+ snprintf(msg, sizeof msg, "focus history overflow (limit %d)", CR_FH_MAX);
+ crn_die(msg);
+ }
cr_ctx.fh[cr_ctx.fh_sp++] = f;
}
@@ -160,6 +164,8 @@ static int reg_take(void* p) {
}
void* crn_alloc(uint64_t nbytes) {
+ /* the header and padding additions must not wrap */
+ if (nbytes > (uint64_t)-32) crn_die("allocation too large");
CrHdr* h = malloc(sizeof(CrHdr) + (size_t)nbytes + 16);
if (!h) crn_die("out of memory");
h->magic = CR_MAGIC;
@@ -482,8 +488,12 @@ static void* crn_thread_main(void* argp) {
void crn_spawn(CrFnRef* f) {
if (f->np != 0)
crn_die("spawn of a transformation that takes parameters");
- if (cr_ctx.nspawned >= CR_SPAWN_MAX)
- crn_die("too many outstanding spawned contexts (limit 64)");
+ if (cr_ctx.nspawned >= CR_SPAWN_MAX) {
+ char msg[80];
+ snprintf(msg, sizeof msg,
+ "too many outstanding spawned contexts (limit %d)", CR_SPAWN_MAX);
+ crn_die(msg);
+ }
CrSpawnArg* a = malloc(sizeof(CrSpawnArg));
if (!a) crn_die("out of memory");
a->fn = f;
diff --git a/src/rt/cryn_rt.h b/src/rt/cryn_rt.h
index 939ce6b..cc82ed2 100644
--- a/src/rt/cryn_rt.h
+++ b/src/rt/cryn_rt.h
@@ -32,9 +32,9 @@ typedef struct CrFnRef {
int np;
} CrFnRef;
-#define CR_FH_MAX 256
-#define CR_SPAWN_MAX 64
-#define CR_FILES_MAX 64
+#define CR_FH_MAX 1024
+#define CR_SPAWN_MAX 256
+#define CR_FILES_MAX 256
typedef struct CrCtx {
Val* stk; /* value stack */
diff --git a/src/types.c b/src/types.c
index ae1a235..1659ca5 100644
--- a/src/types.c
+++ b/src/types.c
@@ -5,23 +5,36 @@
#include <stdlib.h>
#include <string.h>
-#define MAX_TYPES 65536
-static Type g_types[MAX_TYPES];
+/* Interned types. Pointer equality is type equality, so every entry is
+ individually allocated and stable for the life of the compiler; only
+ the index array grows. The table is bounded by memory alone. */
+static Type** g_types = NULL;
static int g_ntypes = 0;
+static int g_cap = 0;
static Type* intern(Type t) {
for (int i = 0; i < g_ntypes; i++) {
- Type* a = &g_types[i];
+ Type* a = g_types[i];
if (a->kind == t.kind && a->inner == t.inner && a->count == t.count &&
a->litval == t.litval && a->litneg == t.litneg)
return a;
}
- if (g_ntypes >= MAX_TYPES) {
- fprintf(stderr, "cryn: too many distinct types\n");
+ if (g_ntypes >= g_cap) {
+ g_cap = g_cap ? g_cap * 2 : 1024;
+ g_types = realloc(g_types, (size_t)g_cap * sizeof(Type*));
+ if (!g_types) {
+ fprintf(stderr, "cryn: out of memory\n");
+ exit(1);
+ }
+ }
+ Type* t2 = malloc(sizeof(Type));
+ if (!t2) {
+ fprintf(stderr, "cryn: out of memory\n");
exit(1);
}
- g_types[g_ntypes] = t;
- return &g_types[g_ntypes++];
+ *t2 = t;
+ g_types[g_ntypes++] = t2;
+ return t2;
}
static Type base(TypeKind k) {
diff --git a/tests/30_limits.cryn b/tests/30_limits.cryn
new file mode 100644
index 0000000..7e60bcd
--- /dev/null
+++ b/tests/30_limits.cryn
@@ -0,0 +1,4618 @@
+[# limits: 301 cells, 300 labels, focus depth 302, value stack depth 1100 #]
+define main
+ make address c1
+ make address c2
+ make address c3
+ make address c4
+ make address c5
+ make address c6
+ make address c7
+ make address c8
+ make address c9
+ make address c10
+ make address c11
+ make address c12
+ make address c13
+ make address c14
+ make address c15
+ make address c16
+ make address c17
+ make address c18
+ make address c19
+ make address c20
+ make address c21
+ make address c22
+ make address c23
+ make address c24
+ make address c25
+ make address c26
+ make address c27
+ make address c28
+ make address c29
+ make address c30
+ make address c31
+ make address c32
+ make address c33
+ make address c34
+ make address c35
+ make address c36
+ make address c37
+ make address c38
+ make address c39
+ make address c40
+ make address c41
+ make address c42
+ make address c43
+ make address c44
+ make address c45
+ make address c46
+ make address c47
+ make address c48
+ make address c49
+ make address c50
+ make address c51
+ make address c52
+ make address c53
+ make address c54
+ make address c55
+ make address c56
+ make address c57
+ make address c58
+ make address c59
+ make address c60
+ make address c61
+ make address c62
+ make address c63
+ make address c64
+ make address c65
+ make address c66
+ make address c67
+ make address c68
+ make address c69
+ make address c70
+ make address c71
+ make address c72
+ make address c73
+ make address c74
+ make address c75
+ make address c76
+ make address c77
+ make address c78
+ make address c79
+ make address c80
+ make address c81
+ make address c82
+ make address c83
+ make address c84
+ make address c85
+ make address c86
+ make address c87
+ make address c88
+ make address c89
+ make address c90
+ make address c91
+ make address c92
+ make address c93
+ make address c94
+ make address c95
+ make address c96
+ make address c97
+ make address c98
+ make address c99
+ make address c100
+ make address c101
+ make address c102
+ make address c103
+ make address c104
+ make address c105
+ make address c106
+ make address c107
+ make address c108
+ make address c109
+ make address c110
+ make address c111
+ make address c112
+ make address c113
+ make address c114
+ make address c115
+ make address c116
+ make address c117
+ make address c118
+ make address c119
+ make address c120
+ make address c121
+ make address c122
+ make address c123
+ make address c124
+ make address c125
+ make address c126
+ make address c127
+ make address c128
+ make address c129
+ make address c130
+ make address c131
+ make address c132
+ make address c133
+ make address c134
+ make address c135
+ make address c136
+ make address c137
+ make address c138
+ make address c139
+ make address c140
+ make address c141
+ make address c142
+ make address c143
+ make address c144
+ make address c145
+ make address c146
+ make address c147
+ make address c148
+ make address c149
+ make address c150
+ make address c151
+ make address c152
+ make address c153
+ make address c154
+ make address c155
+ make address c156
+ make address c157
+ make address c158
+ make address c159
+ make address c160
+ make address c161
+ make address c162
+ make address c163
+ make address c164
+ make address c165
+ make address c166
+ make address c167
+ make address c168
+ make address c169
+ make address c170
+ make address c171
+ make address c172
+ make address c173
+ make address c174
+ make address c175
+ make address c176
+ make address c177
+ make address c178
+ make address c179
+ make address c180
+ make address c181
+ make address c182
+ make address c183
+ make address c184
+ make address c185
+ make address c186
+ make address c187
+ make address c188
+ make address c189
+ make address c190
+ make address c191
+ make address c192
+ make address c193
+ make address c194
+ make address c195
+ make address c196
+ make address c197
+ make address c198
+ make address c199
+ make address c200
+ make address c201
+ make address c202
+ make address c203
+ make address c204
+ make address c205
+ make address c206
+ make address c207
+ make address c208
+ make address c209
+ make address c210
+ make address c211
+ make address c212
+ make address c213
+ make address c214
+ make address c215
+ make address c216
+ make address c217
+ make address c218
+ make address c219
+ make address c220
+ make address c221
+ make address c222
+ make address c223
+ make address c224
+ make address c225
+ make address c226
+ make address c227
+ make address c228
+ make address c229
+ make address c230
+ make address c231
+ make address c232
+ make address c233
+ make address c234
+ make address c235
+ make address c236
+ make address c237
+ make address c238
+ make address c239
+ make address c240
+ make address c241
+ make address c242
+ make address c243
+ make address c244
+ make address c245
+ make address c246
+ make address c247
+ make address c248
+ make address c249
+ make address c250
+ make address c251
+ make address c252
+ make address c253
+ make address c254
+ make address c255
+ make address c256
+ make address c257
+ make address c258
+ make address c259
+ make address c260
+ make address c261
+ make address c262
+ make address c263
+ make address c264
+ make address c265
+ make address c266
+ make address c267
+ make address c268
+ make address c269
+ make address c270
+ make address c271
+ make address c272
+ make address c273
+ make address c274
+ make address c275
+ make address c276
+ make address c277
+ make address c278
+ make address c279
+ make address c280
+ make address c281
+ make address c282
+ make address c283
+ make address c284
+ make address c285
+ make address c286
+ make address c287
+ make address c288
+ make address c289
+ make address c290
+ make address c291
+ make address c292
+ make address c293
+ make address c294
+ make address c295
+ make address c296
+ make address c297
+ make address c298
+ make address c299
+ make address c300
+ make int64 sink
+ set 42
+ move sink
+ write
+ address sink
+ convert address
+ move c300
+ write
+ address c300
+ convert address
+ move c299
+ write
+ address c299
+ convert address
+ move c298
+ write
+ address c298
+ convert address
+ move c297
+ write
+ address c297
+ convert address
+ move c296
+ write
+ address c296
+ convert address
+ move c295
+ write
+ address c295
+ convert address
+ move c294
+ write
+ address c294
+ convert address
+ move c293
+ write
+ address c293
+ convert address
+ move c292
+ write
+ address c292
+ convert address
+ move c291
+ write
+ address c291
+ convert address
+ move c290
+ write
+ address c290
+ convert address
+ move c289
+ write
+ address c289
+ convert address
+ move c288
+ write
+ address c288
+ convert address
+ move c287
+ write
+ address c287
+ convert address
+ move c286
+ write
+ address c286
+ convert address
+ move c285
+ write
+ address c285
+ convert address
+ move c284
+ write
+ address c284
+ convert address
+ move c283
+ write
+ address c283
+ convert address
+ move c282
+ write
+ address c282
+ convert address
+ move c281
+ write
+ address c281
+ convert address
+ move c280
+ write
+ address c280
+ convert address
+ move c279
+ write
+ address c279
+ convert address
+ move c278
+ write
+ address c278
+ convert address
+ move c277
+ write
+ address c277
+ convert address
+ move c276
+ write
+ address c276
+ convert address
+ move c275
+ write
+ address c275
+ convert address
+ move c274
+ write
+ address c274
+ convert address
+ move c273
+ write
+ address c273
+ convert address
+ move c272
+ write
+ address c272
+ convert address
+ move c271
+ write
+ address c271
+ convert address
+ move c270
+ write
+ address c270
+ convert address
+ move c269
+ write
+ address c269
+ convert address
+ move c268
+ write
+ address c268
+ convert address
+ move c267
+ write
+ address c267
+ convert address
+ move c266
+ write
+ address c266
+ convert address
+ move c265
+ write
+ address c265
+ convert address
+ move c264
+ write
+ address c264
+ convert address
+ move c263
+ write
+ address c263
+ convert address
+ move c262
+ write
+ address c262
+ convert address
+ move c261
+ write
+ address c261
+ convert address
+ move c260
+ write
+ address c260
+ convert address
+ move c259
+ write
+ address c259
+ convert address
+ move c258
+ write
+ address c258
+ convert address
+ move c257
+ write
+ address c257
+ convert address
+ move c256
+ write
+ address c256
+ convert address
+ move c255
+ write
+ address c255
+ convert address
+ move c254
+ write
+ address c254
+ convert address
+ move c253
+ write
+ address c253
+ convert address
+ move c252
+ write
+ address c252
+ convert address
+ move c251
+ write
+ address c251
+ convert address
+ move c250
+ write
+ address c250
+ convert address
+ move c249
+ write
+ address c249
+ convert address
+ move c248
+ write
+ address c248
+ convert address
+ move c247
+ write
+ address c247
+ convert address
+ move c246
+ write
+ address c246
+ convert address
+ move c245
+ write
+ address c245
+ convert address
+ move c244
+ write
+ address c244
+ convert address
+ move c243
+ write
+ address c243
+ convert address
+ move c242
+ write
+ address c242
+ convert address
+ move c241
+ write
+ address c241
+ convert address
+ move c240
+ write
+ address c240
+ convert address
+ move c239
+ write
+ address c239
+ convert address
+ move c238
+ write
+ address c238
+ convert address
+ move c237
+ write
+ address c237
+ convert address
+ move c236
+ write
+ address c236
+ convert address
+ move c235
+ write
+ address c235
+ convert address
+ move c234
+ write
+ address c234
+ convert address
+ move c233
+ write
+ address c233
+ convert address
+ move c232
+ write
+ address c232
+ convert address
+ move c231
+ write
+ address c231
+ convert address
+ move c230
+ write
+ address c230
+ convert address
+ move c229
+ write
+ address c229
+ convert address
+ move c228
+ write
+ address c228
+ convert address
+ move c227
+ write
+ address c227
+ convert address
+ move c226
+ write
+ address c226
+ convert address
+ move c225
+ write
+ address c225
+ convert address
+ move c224
+ write
+ address c224
+ convert address
+ move c223
+ write
+ address c223
+ convert address
+ move c222
+ write
+ address c222
+ convert address
+ move c221
+ write
+ address c221
+ convert address
+ move c220
+ write
+ address c220
+ convert address
+ move c219
+ write
+ address c219
+ convert address
+ move c218
+ write
+ address c218
+ convert address
+ move c217
+ write
+ address c217
+ convert address
+ move c216
+ write
+ address c216
+ convert address
+ move c215
+ write
+ address c215
+ convert address
+ move c214
+ write
+ address c214
+ convert address
+ move c213
+ write
+ address c213
+ convert address
+ move c212
+ write
+ address c212
+ convert address
+ move c211
+ write
+ address c211
+ convert address
+ move c210
+ write
+ address c210
+ convert address
+ move c209
+ write
+ address c209
+ convert address
+ move c208
+ write
+ address c208
+ convert address
+ move c207
+ write
+ address c207
+ convert address
+ move c206
+ write
+ address c206
+ convert address
+ move c205
+ write
+ address c205
+ convert address
+ move c204
+ write
+ address c204
+ convert address
+ move c203
+ write
+ address c203
+ convert address
+ move c202
+ write
+ address c202
+ convert address
+ move c201
+ write
+ address c201
+ convert address
+ move c200
+ write
+ address c200
+ convert address
+ move c199
+ write
+ address c199
+ convert address
+ move c198
+ write
+ address c198
+ convert address
+ move c197
+ write
+ address c197
+ convert address
+ move c196
+ write
+ address c196
+ convert address
+ move c195
+ write
+ address c195
+ convert address
+ move c194
+ write
+ address c194
+ convert address
+ move c193
+ write
+ address c193
+ convert address
+ move c192
+ write
+ address c192
+ convert address
+ move c191
+ write
+ address c191
+ convert address
+ move c190
+ write
+ address c190
+ convert address
+ move c189
+ write
+ address c189
+ convert address
+ move c188
+ write
+ address c188
+ convert address
+ move c187
+ write
+ address c187
+ convert address
+ move c186
+ write
+ address c186
+ convert address
+ move c185
+ write
+ address c185
+ convert address
+ move c184
+ write
+ address c184
+ convert address
+ move c183
+ write
+ address c183
+ convert address
+ move c182
+ write
+ address c182
+ convert address
+ move c181
+ write
+ address c181
+ convert address
+ move c180
+ write
+ address c180
+ convert address
+ move c179
+ write
+ address c179
+ convert address
+ move c178
+ write
+ address c178
+ convert address
+ move c177
+ write
+ address c177
+ convert address
+ move c176
+ write
+ address c176
+ convert address
+ move c175
+ write
+ address c175
+ convert address
+ move c174
+ write
+ address c174
+ convert address
+ move c173
+ write
+ address c173
+ convert address
+ move c172
+ write
+ address c172
+ convert address
+ move c171
+ write
+ address c171
+ convert address
+ move c170
+ write
+ address c170
+ convert address
+ move c169
+ write
+ address c169
+ convert address
+ move c168
+ write
+ address c168
+ convert address
+ move c167
+ write
+ address c167
+ convert address
+ move c166
+ write
+ address c166
+ convert address
+ move c165
+ write
+ address c165
+ convert address
+ move c164
+ write
+ address c164
+ convert address
+ move c163
+ write
+ address c163
+ convert address
+ move c162
+ write
+ address c162
+ convert address
+ move c161
+ write
+ address c161
+ convert address
+ move c160
+ write
+ address c160
+ convert address
+ move c159
+ write
+ address c159
+ convert address
+ move c158
+ write
+ address c158
+ convert address
+ move c157
+ write
+ address c157
+ convert address
+ move c156
+ write
+ address c156
+ convert address
+ move c155
+ write
+ address c155
+ convert address
+ move c154
+ write
+ address c154
+ convert address
+ move c153
+ write
+ address c153
+ convert address
+ move c152
+ write
+ address c152
+ convert address
+ move c151
+ write
+ address c151
+ convert address
+ move c150
+ write
+ address c150
+ convert address
+ move c149
+ write
+ address c149
+ convert address
+ move c148
+ write
+ address c148
+ convert address
+ move c147
+ write
+ address c147
+ convert address
+ move c146
+ write
+ address c146
+ convert address
+ move c145
+ write
+ address c145
+ convert address
+ move c144
+ write
+ address c144
+ convert address
+ move c143
+ write
+ address c143
+ convert address
+ move c142
+ write
+ address c142
+ convert address
+ move c141
+ write
+ address c141
+ convert address
+ move c140
+ write
+ address c140
+ convert address
+ move c139
+ write
+ address c139
+ convert address
+ move c138
+ write
+ address c138
+ convert address
+ move c137
+ write
+ address c137
+ convert address
+ move c136
+ write
+ address c136
+ convert address
+ move c135
+ write
+ address c135
+ convert address
+ move c134
+ write
+ address c134
+ convert address
+ move c133
+ write
+ address c133
+ convert address
+ move c132
+ write
+ address c132
+ convert address
+ move c131
+ write
+ address c131
+ convert address
+ move c130
+ write
+ address c130
+ convert address
+ move c129
+ write
+ address c129
+ convert address
+ move c128
+ write
+ address c128
+ convert address
+ move c127
+ write
+ address c127
+ convert address
+ move c126
+ write
+ address c126
+ convert address
+ move c125
+ write
+ address c125
+ convert address
+ move c124
+ write
+ address c124
+ convert address
+ move c123
+ write
+ address c123
+ convert address
+ move c122
+ write
+ address c122
+ convert address
+ move c121
+ write
+ address c121
+ convert address
+ move c120
+ write
+ address c120
+ convert address
+ move c119
+ write
+ address c119
+ convert address
+ move c118
+ write
+ address c118
+ convert address
+ move c117
+ write
+ address c117
+ convert address
+ move c116
+ write
+ address c116
+ convert address
+ move c115
+ write
+ address c115
+ convert address
+ move c114
+ write
+ address c114
+ convert address
+ move c113
+ write
+ address c113
+ convert address
+ move c112
+ write
+ address c112
+ convert address
+ move c111
+ write
+ address c111
+ convert address
+ move c110
+ write
+ address c110
+ convert address
+ move c109
+ write
+ address c109
+ convert address
+ move c108
+ write
+ address c108
+ convert address
+ move c107
+ write
+ address c107
+ convert address
+ move c106
+ write
+ address c106
+ convert address
+ move c105
+ write
+ address c105
+ convert address
+ move c104
+ write
+ address c104
+ convert address
+ move c103
+ write
+ address c103
+ convert address
+ move c102
+ write
+ address c102
+ convert address
+ move c101
+ write
+ address c101
+ convert address
+ move c100
+ write
+ address c100
+ convert address
+ move c99
+ write
+ address c99
+ convert address
+ move c98
+ write
+ address c98
+ convert address
+ move c97
+ write
+ address c97
+ convert address
+ move c96
+ write
+ address c96
+ convert address
+ move c95
+ write
+ address c95
+ convert address
+ move c94
+ write
+ address c94
+ convert address
+ move c93
+ write
+ address c93
+ convert address
+ move c92
+ write
+ address c92
+ convert address
+ move c91
+ write
+ address c91
+ convert address
+ move c90
+ write
+ address c90
+ convert address
+ move c89
+ write
+ address c89
+ convert address
+ move c88
+ write
+ address c88
+ convert address
+ move c87
+ write
+ address c87
+ convert address
+ move c86
+ write
+ address c86
+ convert address
+ move c85
+ write
+ address c85
+ convert address
+ move c84
+ write
+ address c84
+ convert address
+ move c83
+ write
+ address c83
+ convert address
+ move c82
+ write
+ address c82
+ convert address
+ move c81
+ write
+ address c81
+ convert address
+ move c80
+ write
+ address c80
+ convert address
+ move c79
+ write
+ address c79
+ convert address
+ move c78
+ write
+ address c78
+ convert address
+ move c77
+ write
+ address c77
+ convert address
+ move c76
+ write
+ address c76
+ convert address
+ move c75
+ write
+ address c75
+ convert address
+ move c74
+ write
+ address c74
+ convert address
+ move c73
+ write
+ address c73
+ convert address
+ move c72
+ write
+ address c72
+ convert address
+ move c71
+ write
+ address c71
+ convert address
+ move c70
+ write
+ address c70
+ convert address
+ move c69
+ write
+ address c69
+ convert address
+ move c68
+ write
+ address c68
+ convert address
+ move c67
+ write
+ address c67
+ convert address
+ move c66
+ write
+ address c66
+ convert address
+ move c65
+ write
+ address c65
+ convert address
+ move c64
+ write
+ address c64
+ convert address
+ move c63
+ write
+ address c63
+ convert address
+ move c62
+ write
+ address c62
+ convert address
+ move c61
+ write
+ address c61
+ convert address
+ move c60
+ write
+ address c60
+ convert address
+ move c59
+ write
+ address c59
+ convert address
+ move c58
+ write
+ address c58
+ convert address
+ move c57
+ write
+ address c57
+ convert address
+ move c56
+ write
+ address c56
+ convert address
+ move c55
+ write
+ address c55
+ convert address
+ move c54
+ write
+ address c54
+ convert address
+ move c53
+ write
+ address c53
+ convert address
+ move c52
+ write
+ address c52
+ convert address
+ move c51
+ write
+ address c51
+ convert address
+ move c50
+ write
+ address c50
+ convert address
+ move c49
+ write
+ address c49
+ convert address
+ move c48
+ write
+ address c48
+ convert address
+ move c47
+ write
+ address c47
+ convert address
+ move c46
+ write
+ address c46
+ convert address
+ move c45
+ write
+ address c45
+ convert address
+ move c44
+ write
+ address c44
+ convert address
+ move c43
+ write
+ address c43
+ convert address
+ move c42
+ write
+ address c42
+ convert address
+ move c41
+ write
+ address c41
+ convert address
+ move c40
+ write
+ address c40
+ convert address
+ move c39
+ write
+ address c39
+ convert address
+ move c38
+ write
+ address c38
+ convert address
+ move c37
+ write
+ address c37
+ convert address
+ move c36
+ write
+ address c36
+ convert address
+ move c35
+ write
+ address c35
+ convert address
+ move c34
+ write
+ address c34
+ convert address
+ move c33
+ write
+ address c33
+ convert address
+ move c32
+ write
+ address c32
+ convert address
+ move c31
+ write
+ address c31
+ convert address
+ move c30
+ write
+ address c30
+ convert address
+ move c29
+ write
+ address c29
+ convert address
+ move c28
+ write
+ address c28
+ convert address
+ move c27
+ write
+ address c27
+ convert address
+ move c26
+ write
+ address c26
+ convert address
+ move c25
+ write
+ address c25
+ convert address
+ move c24
+ write
+ address c24
+ convert address
+ move c23
+ write
+ address c23
+ convert address
+ move c22
+ write
+ address c22
+ convert address
+ move c21
+ write
+ address c21
+ convert address
+ move c20
+ write
+ address c20
+ convert address
+ move c19
+ write
+ address c19
+ convert address
+ move c18
+ write
+ address c18
+ convert address
+ move c17
+ write
+ address c17
+ convert address
+ move c16
+ write
+ address c16
+ convert address
+ move c15
+ write
+ address c15
+ convert address
+ move c14
+ write
+ address c14
+ convert address
+ move c13
+ write
+ address c13
+ convert address
+ move c12
+ write
+ address c12
+ convert address
+ move c11
+ write
+ address c11
+ convert address
+ move c10
+ write
+ address c10
+ convert address
+ move c9
+ write
+ address c9
+ convert address
+ move c8
+ write
+ address c8
+ convert address
+ move c7
+ write
+ address c7
+ convert address
+ move c6
+ write
+ address c6
+ convert address
+ move c5
+ write
+ address c5
+ convert address
+ move c4
+ write
+ address c4
+ convert address
+ move c3
+ write
+ address c3
+ convert address
+ move c2
+ write
+ address c2
+ convert address
+ move c1
+ write
+ set 0
+ jump L1
+ mark L1
+ jump L2
+ mark L2
+ jump L3
+ mark L3
+ jump L4
+ mark L4
+ jump L5
+ mark L5
+ jump L6
+ mark L6
+ jump L7
+ mark L7
+ jump L8
+ mark L8
+ jump L9
+ mark L9
+ jump L10
+ mark L10
+ jump L11
+ mark L11
+ jump L12
+ mark L12
+ jump L13
+ mark L13
+ jump L14
+ mark L14
+ jump L15
+ mark L15
+ jump L16
+ mark L16
+ jump L17
+ mark L17
+ jump L18
+ mark L18
+ jump L19
+ mark L19
+ jump L20
+ mark L20
+ jump L21
+ mark L21
+ jump L22
+ mark L22
+ jump L23
+ mark L23
+ jump L24
+ mark L24
+ jump L25
+ mark L25
+ jump L26
+ mark L26
+ jump L27
+ mark L27
+ jump L28
+ mark L28
+ jump L29
+ mark L29
+ jump L30
+ mark L30
+ jump L31
+ mark L31
+ jump L32
+ mark L32
+ jump L33
+ mark L33
+ jump L34
+ mark L34
+ jump L35
+ mark L35
+ jump L36
+ mark L36
+ jump L37
+ mark L37
+ jump L38
+ mark L38
+ jump L39
+ mark L39
+ jump L40
+ mark L40
+ jump L41
+ mark L41
+ jump L42
+ mark L42
+ jump L43
+ mark L43
+ jump L44
+ mark L44
+ jump L45
+ mark L45
+ jump L46
+ mark L46
+ jump L47
+ mark L47
+ jump L48
+ mark L48
+ jump L49
+ mark L49
+ jump L50
+ mark L50
+ jump L51
+ mark L51
+ jump L52
+ mark L52
+ jump L53
+ mark L53
+ jump L54
+ mark L54
+ jump L55
+ mark L55
+ jump L56
+ mark L56
+ jump L57
+ mark L57
+ jump L58
+ mark L58
+ jump L59
+ mark L59
+ jump L60
+ mark L60
+ jump L61
+ mark L61
+ jump L62
+ mark L62
+ jump L63
+ mark L63
+ jump L64
+ mark L64
+ jump L65
+ mark L65
+ jump L66
+ mark L66
+ jump L67
+ mark L67
+ jump L68
+ mark L68
+ jump L69
+ mark L69
+ jump L70
+ mark L70
+ jump L71
+ mark L71
+ jump L72
+ mark L72
+ jump L73
+ mark L73
+ jump L74
+ mark L74
+ jump L75
+ mark L75
+ jump L76
+ mark L76
+ jump L77
+ mark L77
+ jump L78
+ mark L78
+ jump L79
+ mark L79
+ jump L80
+ mark L80
+ jump L81
+ mark L81
+ jump L82
+ mark L82
+ jump L83
+ mark L83
+ jump L84
+ mark L84
+ jump L85
+ mark L85
+ jump L86
+ mark L86
+ jump L87
+ mark L87
+ jump L88
+ mark L88
+ jump L89
+ mark L89
+ jump L90
+ mark L90
+ jump L91
+ mark L91
+ jump L92
+ mark L92
+ jump L93
+ mark L93
+ jump L94
+ mark L94
+ jump L95
+ mark L95
+ jump L96
+ mark L96
+ jump L97
+ mark L97
+ jump L98
+ mark L98
+ jump L99
+ mark L99
+ jump L100
+ mark L100
+ jump L101
+ mark L101
+ jump L102
+ mark L102
+ jump L103
+ mark L103
+ jump L104
+ mark L104
+ jump L105
+ mark L105
+ jump L106
+ mark L106
+ jump L107
+ mark L107
+ jump L108
+ mark L108
+ jump L109
+ mark L109
+ jump L110
+ mark L110
+ jump L111
+ mark L111
+ jump L112
+ mark L112
+ jump L113
+ mark L113
+ jump L114
+ mark L114
+ jump L115
+ mark L115
+ jump L116
+ mark L116
+ jump L117
+ mark L117
+ jump L118
+ mark L118
+ jump L119
+ mark L119
+ jump L120
+ mark L120
+ jump L121
+ mark L121
+ jump L122
+ mark L122
+ jump L123
+ mark L123
+ jump L124
+ mark L124
+ jump L125
+ mark L125
+ jump L126
+ mark L126
+ jump L127
+ mark L127
+ jump L128
+ mark L128
+ jump L129
+ mark L129
+ jump L130
+ mark L130
+ jump L131
+ mark L131
+ jump L132
+ mark L132
+ jump L133
+ mark L133
+ jump L134
+ mark L134
+ jump L135
+ mark L135
+ jump L136
+ mark L136
+ jump L137
+ mark L137
+ jump L138
+ mark L138
+ jump L139
+ mark L139
+ jump L140
+ mark L140
+ jump L141
+ mark L141
+ jump L142
+ mark L142
+ jump L143
+ mark L143
+ jump L144
+ mark L144
+ jump L145
+ mark L145
+ jump L146
+ mark L146
+ jump L147
+ mark L147
+ jump L148
+ mark L148
+ jump L149
+ mark L149
+ jump L150
+ mark L150
+ jump L151
+ mark L151
+ jump L152
+ mark L152
+ jump L153
+ mark L153
+ jump L154
+ mark L154
+ jump L155
+ mark L155
+ jump L156
+ mark L156
+ jump L157
+ mark L157
+ jump L158
+ mark L158
+ jump L159
+ mark L159
+ jump L160
+ mark L160
+ jump L161
+ mark L161
+ jump L162
+ mark L162
+ jump L163
+ mark L163
+ jump L164
+ mark L164
+ jump L165
+ mark L165
+ jump L166
+ mark L166
+ jump L167
+ mark L167
+ jump L168
+ mark L168
+ jump L169
+ mark L169
+ jump L170
+ mark L170
+ jump L171
+ mark L171
+ jump L172
+ mark L172
+ jump L173
+ mark L173
+ jump L174
+ mark L174
+ jump L175
+ mark L175
+ jump L176
+ mark L176
+ jump L177
+ mark L177
+ jump L178
+ mark L178
+ jump L179
+ mark L179
+ jump L180
+ mark L180
+ jump L181
+ mark L181
+ jump L182
+ mark L182
+ jump L183
+ mark L183
+ jump L184
+ mark L184
+ jump L185
+ mark L185
+ jump L186
+ mark L186
+ jump L187
+ mark L187
+ jump L188
+ mark L188
+ jump L189
+ mark L189
+ jump L190
+ mark L190
+ jump L191
+ mark L191
+ jump L192
+ mark L192
+ jump L193
+ mark L193
+ jump L194
+ mark L194
+ jump L195
+ mark L195
+ jump L196
+ mark L196
+ jump L197
+ mark L197
+ jump L198
+ mark L198
+ jump L199
+ mark L199
+ jump L200
+ mark L200
+ jump L201
+ mark L201
+ jump L202
+ mark L202
+ jump L203
+ mark L203
+ jump L204
+ mark L204
+ jump L205
+ mark L205
+ jump L206
+ mark L206
+ jump L207
+ mark L207
+ jump L208
+ mark L208
+ jump L209
+ mark L209
+ jump L210
+ mark L210
+ jump L211
+ mark L211
+ jump L212
+ mark L212
+ jump L213
+ mark L213
+ jump L214
+ mark L214
+ jump L215
+ mark L215
+ jump L216
+ mark L216
+ jump L217
+ mark L217
+ jump L218
+ mark L218
+ jump L219
+ mark L219
+ jump L220
+ mark L220
+ jump L221
+ mark L221
+ jump L222
+ mark L222
+ jump L223
+ mark L223
+ jump L224
+ mark L224
+ jump L225
+ mark L225
+ jump L226
+ mark L226
+ jump L227
+ mark L227
+ jump L228
+ mark L228
+ jump L229
+ mark L229
+ jump L230
+ mark L230
+ jump L231
+ mark L231
+ jump L232
+ mark L232
+ jump L233
+ mark L233
+ jump L234
+ mark L234
+ jump L235
+ mark L235
+ jump L236
+ mark L236
+ jump L237
+ mark L237
+ jump L238
+ mark L238
+ jump L239
+ mark L239
+ jump L240
+ mark L240
+ jump L241
+ mark L241
+ jump L242
+ mark L242
+ jump L243
+ mark L243
+ jump L244
+ mark L244
+ jump L245
+ mark L245
+ jump L246
+ mark L246
+ jump L247
+ mark L247
+ jump L248
+ mark L248
+ jump L249
+ mark L249
+ jump L250
+ mark L250
+ jump L251
+ mark L251
+ jump L252
+ mark L252
+ jump L253
+ mark L253
+ jump L254
+ mark L254
+ jump L255
+ mark L255
+ jump L256
+ mark L256
+ jump L257
+ mark L257
+ jump L258
+ mark L258
+ jump L259
+ mark L259
+ jump L260
+ mark L260
+ jump L261
+ mark L261
+ jump L262
+ mark L262
+ jump L263
+ mark L263
+ jump L264
+ mark L264
+ jump L265
+ mark L265
+ jump L266
+ mark L266
+ jump L267
+ mark L267
+ jump L268
+ mark L268
+ jump L269
+ mark L269
+ jump L270
+ mark L270
+ jump L271
+ mark L271
+ jump L272
+ mark L272
+ jump L273
+ mark L273
+ jump L274
+ mark L274
+ jump L275
+ mark L275
+ jump L276
+ mark L276
+ jump L277
+ mark L277
+ jump L278
+ mark L278
+ jump L279
+ mark L279
+ jump L280
+ mark L280
+ jump L281
+ mark L281
+ jump L282
+ mark L282
+ jump L283
+ mark L283
+ jump L284
+ mark L284
+ jump L285
+ mark L285
+ jump L286
+ mark L286
+ jump L287
+ mark L287
+ jump L288
+ mark L288
+ jump L289
+ mark L289
+ jump L290
+ mark L290
+ jump L291
+ mark L291
+ jump L292
+ mark L292
+ jump L293
+ mark L293
+ jump L294
+ mark L294
+ jump L295
+ mark L295
+ jump L296
+ mark L296
+ jump L297
+ mark L297
+ jump L298
+ mark L298
+ jump L299
+ mark L299
+ jump L300
+ mark L300
+ move c1
+ read
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ move at
+ home
+ set 7
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ push
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ pop
+ output
+ move sink
+ read
+ output
+ set 0
+ stop
+end
diff --git a/tests/expected/30_limits.txt b/tests/expected/30_limits.txt
new file mode 100644
index 0000000..6dca33d
--- /dev/null
+++ b/tests/expected/30_limits.txt
@@ -0,0 +1 @@
+742
\ No newline at end of file