diff options
author | Marvin Borner | 2024-01-18 23:07:21 +0100 |
---|---|---|
committer | Marvin Borner | 2024-01-18 23:07:21 +0100 |
commit | 5c713d1e2da06b50fa0016086c2e8443624cbb68 (patch) | |
tree | 152e71c0e985daf0d1c550784a8af7abca86e239 | |
parent | 11a94bd667c706466e7c281f59e918155cba1321 (diff) |
Bitmaps should've been recursive
I think? Maybe the topological sort implementation is just wrong
-rw-r--r-- | readme.md | 57 | ||||
-rw-r--r-- | src/targets/blc.c | 54 | ||||
-rw-r--r-- | src/targets/unblc.c | 1 | ||||
-rw-r--r-- | test/aoc.blc.io (renamed from test/aoc.blc.i) | 2 | ||||
-rw-r--r-- | test/huh.blc.io | 1 | ||||
-rw-r--r-- | test/huh.blc.io.in | 1 | ||||
-rw-r--r-- | test/huh.bruijn | 18 |
7 files changed, 65 insertions, 69 deletions
@@ -10,16 +10,47 @@ benchmarking, or general term optimization. ## Targets -- BLC (sharing by abstraction): Terms having BLoC entry indices get - abstracted and applied to the respective term. The indices get - converted to De Bruijn indices. The dependency graph is resolved by - a topological sort. Flag `bblc` (bits) and `blc` (ASCII 0/1). -- BLC (unshared): Every BLoC entry gets reinserted into the original - term. Do not use this if you want efficiency or small files. Flag - `unbblc` (bits) and `unblc` (ASCII 0/1). -- Planned: [Effekt](https://effekt-lang.org), Scala, HVM, C, NASM, - LLVM, JS, Haskell - -## Benchmarks - -To be evaluated. +- BLC (sharing by abstraction): Terms having BLoC entry indices get + abstracted and applied to the respective term. The indices get + converted to De Bruijn indices. The dependency graph is resolved by a + topological sort. Flag `bblc` (bits) and `blc` (ASCII 0/1). +- BLC (unshared): Every BLoC entry gets reinserted into the original + term. Do not use this if you want efficiency or small files. Flag + `unbblc` (bits) and `unblc` (ASCII 0/1). +- Planned: “normal” programming languages + +## Shared `bblc` benchmarks + +Some deliberately unoptimized test cases from `test/`, evaluated using +`./run` and measured in bits: + +| file | bloc | unbblc/orig | bblc | +|:--------------|:-----|:------------|:------| +| echo | 56 | 4 | 4 | +| reverse | 248 | 172 | 172 | +| churchadd1 | 296 | 390 | 159 | +| churchadd2 | 368 | 433 | 207 | +| churcharith | 560 | 1897 | 339 | +| uni | 576 | 459 | 448 | +| ternaryvarmod | 1248 | 2330 | 1824 | +| collatz | 1904 | 2884 | 1986 | +| ternaryadd | 2240 | 19422 | 2708 | +| ternaryfac | 2792 | 9599 | 3091 | +| aoc | 7480 | 50062 | 10861 | + +*Huge* and convoluted programs like +[@woodrush](https:://github.com/woodrush)’s +[lambda-8cc](https://github.com/woodrush/lambda-8cc) will not get +smaller by compiling them to shared BLC. The *many* sharable terms get +abstracted to so many levels that the (unary) BLC indices (in case of +8cc) can literally be 50 kilobit long. One solution would obviously be a +BLC variant with binary indices, or just storing and interpreting such +files in the BLoC format directly (which also uses binary reference +indices). A better algorithm than standard topological sort for +resolving the dependencies would also help. + +8cc, measured in megabit: + +| file | bloc | unbblc/orig | bblc | +|:-----------|:-----|:------------|:--------| +| lambda-8cc | 5.13 | 40.72 | 3267.88 | diff --git a/src/targets/blc.c b/src/targets/blc.c index 82e0bc4..3d76966 100644 --- a/src/targets/blc.c +++ b/src/targets/blc.c @@ -7,6 +7,7 @@ #include <stdlib.h> #include <string.h> +#include <assert.h> #include <stdio.h> #include <target.h> @@ -47,6 +48,11 @@ static void fprint_blc_substituted(struct term *term, struct bloc_parsed *bloc, depth + (positions_inv[term->u.ref.index] - position) - 1; + debug("index=%d depth=%ld ref=%ld inv=%ld pos=%ld sub=%ld\n", + index, depth, term->u.ref.index, + positions_inv[term->u.ref.index], position, + positions_inv[term->u.ref.index] - position); + assert(index >= 0); for (int i = 0; i <= index; i++) fprintf(file, "1"); fprintf(file, "0"); @@ -91,39 +97,19 @@ static void fprint_blc(size_t *positions, void *closed, free(positions_inv); } -static void bitmap_deps(struct bloc_parsed *bloc, char *bitmap, - struct term *term) -{ - switch (term->type) { - case ABS: - bitmap_deps(bloc, bitmap, term->u.abs.term); - break; - case APP: - bitmap_deps(bloc, bitmap, term->u.app.lhs); - bitmap_deps(bloc, bitmap, term->u.app.rhs); - break; - case VAR: - break; - case REF: - if (term->u.ref.index + 1 >= bloc->length) - fatal("invalid ref index %ld\n", term->u.ref.index); - bitmap[term->u.ref.index] = 1; - break; - default: - fatal("invalid type %d\n", term->type); - } -} - // TODO: memoize META_CLOSED with term->meta (more complex than you'd think!) +// TODO: memoize bitmap deps (should be easy) static unsigned int annotate(struct bloc_parsed *bloc, struct term *term, - int depth) + char *bitmap, int depth) { switch (term->type) { case ABS: - return annotate(bloc, term->u.abs.term, depth + 1); + return annotate(bloc, term->u.abs.term, bitmap, depth + 1); case APP:; - unsigned int left = annotate(bloc, term->u.app.lhs, depth); - unsigned int right = annotate(bloc, term->u.app.rhs, depth); + unsigned int left = + annotate(bloc, term->u.app.lhs, bitmap, depth); + unsigned int right = + annotate(bloc, term->u.app.rhs, bitmap, depth); if ((left & META_OPEN) || (right & META_OPEN)) return META_OPEN; return META_CLOSED; @@ -134,8 +120,9 @@ static unsigned int annotate(struct bloc_parsed *bloc, struct term *term, case REF: if (term->u.ref.index + 1 >= bloc->length) fatal("invalid ref index %ld\n", term->u.ref.index); - struct term *sub = bloc->entries[term->u.ref.index]; - return annotate(bloc, sub, depth); + bitmap[term->u.ref.index] = 1; + return annotate(bloc, bloc->entries[term->u.ref.index], bitmap, + depth); default: fatal("invalid type %d\n", term->type); } @@ -196,14 +183,13 @@ static void write_blc(struct bloc_parsed *bloc, FILE *file) { char **bitmaps = malloc(bloc->length * sizeof(*bitmaps)); for (size_t i = 0; i < bloc->length; i++) { - unsigned int meta = annotate(bloc, bloc->entries[i], 0); + char *bitmap = calloc(bloc->length, 1); + unsigned int meta = annotate(bloc, bloc->entries[i], bitmap, 0); if (!(meta & META_CLOSED)) { - bitmaps[i] = 0; + free(bitmap); + bitmaps[i] = 0; // won't be needed continue; } - - char *bitmap = calloc(bloc->length, 1); - bitmap_deps(bloc, bitmap, bloc->entries[i]); bitmaps[i] = bitmap; } diff --git a/src/targets/unblc.c b/src/targets/unblc.c index 1b59f7f..2d10418 100644 --- a/src/targets/unblc.c +++ b/src/targets/unblc.c @@ -40,7 +40,6 @@ static void fprint_unblc(struct term *term, struct bloc_parsed *bloc, static void write_unblc(struct bloc_parsed *bloc, FILE *file) { fprint_unblc(bloc->entries[bloc->length - 1], bloc, file); - fprintf(file, "\n"); } struct target_spec target_unblc = { diff --git a/test/aoc.blc.i b/test/aoc.blc.io index edc2c7a..17928ef 100644 --- a/test/aoc.blc.i +++ b/test/aoc.blc.io @@ -1 +1 @@ -0001000101000000010110111011001000110000011010010101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101010001010101100000110000000100000001000101100000100101000000010110111011001000110000011010010111100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110110010001100000101000000000011001110111101001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010000010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011011010010100000001011011101100100011000001101100101111001000110000010110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110110100101000000010110111011001000110000011011001011110010001100000101101001110010101000000010111101011001000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101011100100011000001101001000000010110111011001000110000011010001001011110110010001100000101001000110000010100101000000010111101011001000000010111101011000000100010110000010000011001010000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010110100100011000001101001000101000000010110111011010000010010001100000110100111001010100000001011110101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010101110010001100000110100100000001011011101100100011000001101000100101111011001000110000010100100011000001010010100000001011110101100100000001011110101100000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010010001100000110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101000000010110111011001110010001100000110100101111011001000110000010100101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100100010100000001011011101100100011000001101001011111011100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100100010101000101100000000000100000110100000100100011000001010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101110010001100000110100101111011001000110000010101001010000000111100111010000101100000100000110110101101000010101011000001100000001000000010001001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101001010000000111100111010010101000100011100001011101101000011100001011101101000000000010101000101100000000000100000110101100101011111011100101111011001000110000011010010001100000101000000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101001010000010101011100000000011110000101000001010000010100010000010111010000000100101010110000001010110010001000110000010010101011001010000000101101110110000000001111000000000011110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011100101010111111011110111011010100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100100010001100000100101010110010100000001011011101100000000011110000000000111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011110010101011111101111011101101010000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011000000001010101110010001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010110000101011100100000000000110010101011111101111011101101001011111010000000111001000000000001111001010101111110111101110110100101111101000000010010000000000011100101010111111011110111011010010111110100000001110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000000010101011100100010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001011000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000010010000000000011001010101111110111101110110100101111101000000011001000000000001111001010101111110111101110110100101111101000000011000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000000001010101110010001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011001000101010110000000001111000000000000111101111100000000000011101111100000000000011011111010110010000000000010101011111101111011011101010010000000000011001010101111110111101110110101011000010100000101000100000101110100000001001010101100000010101100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110000000010101011100100010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000101100001010111001000000000001100101010111111011110111011010010111110100000001110010000000000011110010101011111101111011101101001011111010000000100100000000000111001010101111110111101110110100101111101000000011100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100000000101010111001000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000100100000000000110010101011111101111011101101001011111010000000110010000000000011110010101011111101111011101101001011111010000000110000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000000010101011100100010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110010001010101100000000011110000000000001111011111000000000000111011111000000000000110111110100100000000000110010101011111101111011101101010110000100000000000110010101011111101111011101101010000000000111001100111011110110100000000011110010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101000010101000100011100001011101101000011100001011101101000000001010100010101100000110000000100010101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000100011000001001010110010100000001011011101100000001110000000111000011000000101000000010110111011001000000000111001010111110111011010110010000000001100101011111011101101011000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101010100000000011110010100000101010100000101000101011000010001010110000011000000010001001010001101000000101011000000011100001000000000111001010111110111011010010001011111011110101000010000000001100101011111011101101001000101111101111010101000000101011000001000011110100000001000000101011001110100000001000011110101100100010101100000001110000000000111011110000000000110111101010110000000111001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010001000001011101000001001010110000001011001000100011000001001010110010100000001011011101100000001110000000011101110000110000001010000000101101110110010000000001110010101111101110110101100100000000011001010111110111011010100001100000010100000001011011101100100000000011001010111110111011010110010000000001110010101111101110110101100101000110100000010101100000001110000100000000011100101011111011101101001000101111101111010100001000000000110010101111101110110100100010111110111101010110010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101011000000001010111001000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000101100001010000000000010101111110110100101011111011101101011001011111010000011000010111001000000000110010101111101110110100101111101000001100100000000011100101011111011101101001011111010000010000000010101110010001010000000000010101111110110100101011111011101101011001011111010000010110000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000100001010000000000010101111110110100101011111011101101011001011111010000010110010001010110000000111000000000011101111000000000011011110100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101101001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101011010000000011001100110011001110011100110011011100101000100011100001011101101000011100001011101101000000100010101000101100000000000100000110010001100000101001000101000000010110111011010000010010001100000110100101000000010110111011001000110000011010011110010001100000100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101011100100011000001101001011110110010001100000101010010100000001111001110100001011000001000001101101001000001010001010110000100010101100000110000000100010010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101010000001010110000010000111101000000010000001010110011101000000010000111101011001000101011000000011100000000001110111100000000001101111010000000011001110011001110011001100110011011101010 +0001000101000000010110111011001000110000011010010101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101010001010101100000110000000100000001000101100000100101000000010110111011001000110000011010010111100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110110010001100000101000000000011001110111101001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010000010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011011010010100000001011011101100100011000001101100101111001000110000010110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110110100101000000010110111011001000110000011011001011110010001100000101101001110010101000000010111101011001000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101011100100011000001101001000000010110111011001000110000011010001001011110110010001100000101001000110000010100101000000010111101011001000000010111101011000000100010110000010000011001010000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010110100100011000001101001000101000000010110111011010000010010001100000110100111001010100000001011110101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010101110010001100000110100100000001011011101100100011000001101000100101111011001000110000010100100011000001010010100000001011110101100100000001011110101100000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010010001100000110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101000000010110111011001110010001100000110100101111011001000110000010100101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100100010100000001011011101100100011000001101001011111011100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100100010101000101100000000000100000110100000100100011000001010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101110010001100000110100101111011001000110000010101001010000000111100111010000101100000100000110110101101000010101011000001100000001000000010001001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101001010000000111100111010010101000100011100001011101101000011100001011101101000000000010101000101100000000000100000110101100101011111011100101111011001000110000011010010001100000101000000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101001010000010101011100000000011110000101000001010000010100010000010111010000000100101010110000001010110010001000110000010010101011001010000000101101110110000000001111000000000011110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011100101010111111011110111011010100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100100010001100000100101010110010100000001011011101100000000011110000000000111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011110010101011111101111011101101010000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011000000001010101110010001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010110000101011100100000000000110010101011111101111011101101001011111010000000111001000000000001111001010101111110111101110110100101111101000000010010000000000011100101010111111011110111011010010111110100000001110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000000010101011100100010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001011000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000010010000000000011001010101111110111101110110100101111101000000011001000000000001111001010101111110111101110110100101111101000000011000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000000001010101110010001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011001000101010110000000001111000000000000111101111100000000000011101111100000000000011011111010110010000000000010101011111101111011011101010010000000000011001010101111110111101110110101011000010100000101000100000101110100000001001010101100000010101100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110000000010101011100100010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000101100001010111001000000000001100101010111111011110111011010010111110100000001110010000000000011110010101011111101111011101101001011111010000000100100000000000111001010101111110111101110110100101111101000000011100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100000000101010111001000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000100100000000000110010101011111101111011101101001011111010000000110010000000000011110010101011111101111011101101001011111010000000110000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000000010101011100100010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110010001010101100000000011110000000000001111011111000000000000111011111000000000000110111110100100000000000110010101011111101111011101101010110000100000000000110010101011111101111011101101010000000000111001100111011110110100000000011110010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101000010101000100011100001011101101000011100001011101101000000001010100010101100000110000000100010101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000100011000001001010110010100000001011011101100000001110000000111000011000000101000000010110111011001000000000111001010111110111011010110010000000001100101011111011101101011000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101010100000000011110010100000101010100000101000101011000010001010110000011000000010001001010001101000000101011000000011100001000000000111001010111110111011010010001011111011110101000010000000001100101011111011101101001000101111101111010101000000101011000001000011110100000001000000101011001110100000001000011110101100100010101100000001110000000000111011110000000000110111101010110000000111001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010001000001011101000001001010110000001011001000100011000001001010110010100000001011011101100000001110000000011101110000110000001010000000101101110110010000000001110010101111101110110101100100000000011001010111110111011010100001100000010100000001011011101100100000000011001010111110111011010110010000000001110010101111101110110101100101000110100000010101100000001110000100000000011100101011111011101101001000101111101111010100001000000000110010101111101110110100100010111110111101010110010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101011000000001010111001000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000101100001010000000000010101111110110100101011111011101101011001011111010000011000010111001000000000110010101111101110110100101111101000001100100000000011100101011111011101101001011111010000010000000010101110010001010000000000010101111110110100101011111011101101011001011111010000010110000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000100001010000000000010101111110110100101011111011101101011001011111010000010110010001010110000000111000000000011101111000000000011011110100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101101001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101011010000000011001100110011001110011100110011011100101000100011100001011101101000011100001011101101000000100010101000101100000000000100000110010001100000101001000101000000010110111011010000010010001100000110100101000000010110111011001000110000011010011110010001100000100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101011100100011000001101001011110110010001100000101010010100000001111001110100001011000001000001101101001000001010001010110000100010101100000110000000100010010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101010000001010110000010000111101000000010000001010110011101000000010000111101011001000101011000000011100000000001110111100000000001101111010000000011001110011001110011001100110011011101010
\ No newline at end of file diff --git a/test/huh.blc.io b/test/huh.blc.io deleted file mode 100644 index 36edb97..0000000 --- a/test/huh.blc.io +++ /dev/null @@ -1 +0,0 @@ -000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101001010100010001110000101110110100001110000101110110100000000101100000000101111111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011111011011000000000111100101000000010110111011000100101000000010110111011000100100010100000001011011101101000001000100000000011110
\ No newline at end of file diff --git a/test/huh.blc.io.in b/test/huh.blc.io.in deleted file mode 100644 index 8a0f05e..0000000 --- a/test/huh.blc.io.in +++ /dev/null @@ -1 +0,0 @@ -01 diff --git a/test/huh.bruijn b/test/huh.bruijn deleted file mode 100644 index 7db06c7..0000000 --- a/test/huh.bruijn +++ /dev/null @@ -1,18 +0,0 @@ -:import std/Number/Ternary . -:import std/List . - -# main map [ternary! (0 - 0)] - -# main [sub (+1b) (+1b)] - -# main [pad (+1b) (+2b)] - -# main [pad-right (+6) 'a' "hah"] - -# main [|((+6) - ∀"hah")] - -# main [(+1) - ∀"aa"] - -# main [∀([0] : ([0] : {}[0])) - (+0)] - -main [∀([0] : ([0] : {}[0])) + (+0)] |