commit 7b8fc6e712c67be4391639a71c4c3f568fb1dec1
parent 2f343a495eeffb8e75e24123a3b7b1527401af2f
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Tue, 21 Apr 2026 07:36:15 -0700
lisp: TAIL, argv[1] scripts
Diffstat:
| M | Makefile | | | 8 | +++++++- |
| A | hello.scm | | | 2 | ++ |
| M | lisp.M1 | | | 585 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------- |
3 files changed, 501 insertions(+), 94 deletions(-)
diff --git a/Makefile b/Makefile
@@ -23,6 +23,12 @@
PROG ?= hello
ARCH ?= aarch64
+# Per-program runtime arguments. The lisp interpreter reads its script
+# from argv[1] (LISP.md step 8); supply hello.scm by default so
+# `make run-all` stays a smoke test.
+RUN_ARGS_lisp ?= hello.scm
+RUN_ARGS := $(RUN_ARGS_$(PROG))
+
# Map P1 ARCH -> Linux-platform tag for the container.
PLATFORM_aarch64 := linux/arm64
PLATFORM_amd64 := linux/amd64
@@ -107,7 +113,7 @@ $(OUT_DIR)/$(PROG): $(OUT_DIR)/$(PROG).hex2 ELF-$(ARCH).hex2 $(TOOLS_DIR)/hex2-0
$(TOOLS_DIR)/hex2-0 $(OUT_DIR)/$(PROG).linked.hex2 $(OUT_DIR)/$(PROG)'
run: $(OUT_DIR)/$(PROG)
- $(PODMAN) ./$(OUT_DIR)/$(PROG)
+ $(PODMAN) ./$(OUT_DIR)/$(PROG) $(RUN_ARGS)
# `-` prefix: continue past non-zero exit. demo.M1 exits with the computed
# result (5), which is a legitimate program outcome, not a make failure.
diff --git a/hello.scm b/hello.scm
@@ -0,0 +1,2 @@
+(define id (lambda (x) x))
+(id 42)
diff --git a/lisp.M1 b/lisp.M1
@@ -1,18 +1,16 @@
## lisp.M1 — Seed Lisp interpreter (portable across aarch64/amd64/riscv64)
##
-## Steps 1-3 of LISP.md §"Staged implementation plan". Builds on the
-## step-2 tagged-value layer (fixnum/pair/singleton + cons/car/cdr)
-## with strings + symbol interning:
+## Steps 1-8 of LISP.md §"Staged implementation plan". On top of the
+## step-6 evaluator, step 8 replaces the embedded `src_text` blob with
+## a runtime file read: _start takes the script path from argv[1],
+## openat/read/closes it into :src_buf, and seeds src_base/src_len for
+## the reader. argc < 2, open failure, and files ≥ 16 KiB each land on
+## a dedicated error() message.
##
-## Step 3: symbol interning via open-addressing 4096-slot symbol
-## table. `intern(name_ptr, name_len)` returns the same
-## tagged symbol pointer for equal names. `make_symbol` /
-## `make_string` allocate headered heap objects.
-##
-## Observable test (`make PROG=lisp run-all`): exit 42 on pass. The
-## driver interns "foo" twice and checks pointer eq, then interns
-## "bar" and checks pointer-distinct. Any failure runs `error` which
-## writes a diagnostic to fd 2 and exits 1.
+## Observable test (`make PROG=lisp run-all`): exit 42 on pass when
+## run against `hello.scm`. The script evaluates
+## `(define id (lambda (x) x)) (id 42)` — identity applied to 42,
+## exit status = decoded fixnum of the final result.
##
## Tag table (low 3 bits, LISP.md §"Value representation"):
## 001 fixnum / 010 pair / 011 vector / 100 string / 101 symbol /
@@ -40,16 +38,88 @@
## ---- _start ----------------------------------------------------------
-## Step 6 driver: loops over top-level forms from src_text, evaluates
-## each in an empty local env (so unqualified lookups fall through to
-## the global hash), keeps the last result. Final result is displayed
+## Step 8 driver: read the .scm file named on the command line into
+## src_buf, then loop over its top-level forms. Each form is evaluated
+## in an empty local env (so unqualified lookups fall through to the
+## global hash) and the last result is kept. Final result is displayed
## with write (closing the step-5 read-print cycle) and its fixnum
## payload becomes the exit status — lets test harnesses assert via $?.
##
-## r4 holds the running last_result. It survives read_expr/eval across
-## iterations because r4 is callee-saved; _start itself has no PROLOGUE
-## and never returns, so its r4 is sovereign.
+## r4 holds the running last_result once the intern loop finishes. It
+## survives read_expr/eval across iterations because r4 is callee-saved;
+## _start itself has no PROLOGUE and never returns, so its r4 is
+## sovereign. Early in _start r4 doubles as the source fd across the
+## read_file_all CALL (same callee-saved guarantee).
:_start
+ ## Kernel layout at entry: [sp+0]=argc, [sp+8..]=argv[0..argc-1],
+ ## then NULL, then envp. We need argc and argv[1] before any CALL
+ ## (no PROLOGUE on _start — CALL would bury the kernel frame under
+ ## a pushed retaddr on amd64).
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_0 ## r0 = argc
+ P1_LI_R1
+ '02000000'
+ P1_LI_BR
+ &err_usage
+ P1_BLT_R0_R1 ## argc < 2 → err_usage
+ P1_LD_R2_R3_16 ## r2 = argv[1] (survives SYSCALL)
+
+ ## openat(AT_FDCWD=-100, argv[1], O_RDONLY=0, mode=0) → r0 = fd.
+ ## Use openat rather than open because open is amd64-only
+ ## (removed from the asm-generic table used by aarch64/riscv64).
+ ## LI zero-extends; low 32 bits 0xFFFFFF9C decode as -100 in int32.
+ P1_LI_R0
+ SYS_OPENAT
+ P1_LI_R1
+ '9CFFFFFF'
+ P1_LI_R3
+ '00000000'
+ P1_LI_R4
+ '00000000'
+ P1_SYSCALL
+
+ P1_LI_R1
+ '00000000'
+ P1_LI_BR
+ &err_open
+ P1_BLT_R0_R1 ## fd < 0 → err_open
+
+ ## read_file_all(fd, src_buf, SRC_BUF_SIZE) → r0 = bytes_read.
+ ## Stash fd in r4 so it survives the CALL; r4 is callee-saved.
+ P1_MOV_R4_R0
+ P1_MOV_R1_R0
+ P1_LI_R2
+ &src_buf
+ P1_LI_R3
+ '00400000' ## 16384-byte capacity
+ P1_LI_BR
+ &read_file_all
+ P1_CALL
+
+ ## Filling the buffer exactly means the file was ≥ SRC_BUF_SIZE —
+ ## bail out rather than silently truncate.
+ P1_LI_R1
+ '00400000'
+ P1_LI_BR
+ &err_src_too_big
+ P1_BEQ_R0_R1
+
+ ## Publish src_base/src_len so the reader can walk the source.
+ P1_LI_R1
+ &src_len
+ P1_ST_R0_R1_0
+ P1_LI_R1
+ &src_base
+ P1_LI_R2
+ &src_buf
+ P1_ST_R2_R1_0
+
+ ## close(fd). r4 still holds fd; SYSCALL clobbers r0 only.
+ P1_LI_R0
+ SYS_CLOSE
+ P1_MOV_R1_R4
+ P1_SYSCALL
+
## Align heap_next up to 8 (pair/closure tags need 8-aligned raw
## pointers — see step 2).
P1_LI_R4
@@ -119,19 +189,6 @@
&sym_define
P1_ST_R0_R2_0
- ## Seed reader globals.
- P1_LI_R1
- &src_base
- P1_LI_R2
- &src_text
- P1_ST_R2_R1_0
- P1_LI_R1
- &src_len
- P1_LI_R2
- &src_text_len
- P1_LD_R2_R2_0
- P1_ST_R2_R1_0
-
## r4 = last_result. Initial unspec (0x27) so an empty source exits 0.
P1_LI_R4
'27000000'
@@ -190,6 +247,55 @@
P1_SYSCALL
+## ---- read_file_all(r1=fd, r2=buf, r3=cap) -> r0 = total_bytes ------
+## Read loop. r4-r7 are callee-saved AND preserved across SYSCALL, so
+## we can park state there across each read() call. No PROLOGUE needed:
+## we only issue syscalls, never CALL. (Ported from kaem-minimal.M1.)
+:read_file_all
+ P1_MOV_R4_R1 ## r4 = fd
+ P1_MOV_R5_R2 ## r5 = cur buf ptr
+ P1_MOV_R6_R3 ## r6 = remaining capacity
+ P1_LI_R7
+ '00000000' ## r7 = total_read
+
+:read_file_all_loop
+ ## Capacity exhausted → stop; _start checks for the exact-full
+ ## case and escalates to err_src_too_big.
+ P1_LI_R1
+ '00000000'
+ P1_LI_BR
+ &read_file_all_done
+ P1_BEQ_R6_R1
+
+ P1_LI_R0
+ SYS_READ
+ P1_MOV_R1_R4
+ P1_MOV_R2_R5
+ P1_MOV_R3_R6
+ P1_SYSCALL ## r0 = n (0=EOF, <0=err)
+
+ ## n <= 0 → done. Check < 0 first, then == 0.
+ P1_LI_R1
+ '00000000'
+ P1_LI_BR
+ &read_file_all_done
+ P1_BLT_R0_R1
+ P1_LI_BR
+ &read_file_all_done
+ P1_BEQ_R0_R1
+
+ P1_ADD_R5_R5_R0 ## buf += n
+ P1_SUB_R6_R6_R0 ## cap -= n
+ P1_ADD_R7_R7_R0 ## total += n
+ P1_LI_BR
+ &read_file_all_loop
+ P1_B
+
+:read_file_all_done
+ P1_MOV_R0_R7
+ P1_RET
+
+
## ---- hash(r1=ptr, r2=len) -> r0 = u64 hash --------------------------
## DJB-style: h' = 31*h + b. Implemented as (h<<5) - h + b to avoid
## stashing 31 in a register. Uses r6 (zero constant) across the loop;
@@ -569,6 +675,33 @@
&error
P1_B
+:err_usage
+ P1_LI_R1
+ &msg_usage
+ P1_LI_R2
+ '16000000' ## strlen("usage: lisp <file.scm>") == 22
+ P1_LI_BR
+ &error
+ P1_B
+
+:err_open
+ P1_LI_R1
+ &msg_open_fail
+ P1_LI_R2
+ '1A000000' ## strlen("failed to open source file") == 26
+ P1_LI_BR
+ &error
+ P1_B
+
+:err_src_too_big
+ P1_LI_R1
+ &msg_src_too_big
+ P1_LI_R2
+ '15000000' ## strlen("source file too large") == 21
+ P1_LI_BR
+ &error
+ P1_B
+
## err_reader_bad: "error: reader: malformed input at LINE:COL\n" → stderr.
## Doesn't go through :error because we want line:col tacked on; easier to
## inline the syscalls than thread a format through error().
@@ -664,8 +797,8 @@
## ---- Reader state (globals) -----------------------------------------
-## src_base/src_len are set by _start to point at src_text. src_cursor
-## starts at 0; src_line/src_col start at 1.
+## src_base/src_len are set by _start after it reads argv[1] into
+## src_buf. src_cursor starts at 0; src_line/src_col start at 1.
:src_base
'00000000'
'00000000'
@@ -2040,10 +2173,8 @@
P1_MOV_R3_SP
P1_LD_R1_R3_24
P1_LI_BR
- &cons
- P1_CALL
- P1_EPILOGUE_N3
- P1_RET
+ &cons ## tail: cons is last work in this frame
+ P1_TAIL_N3
:eval_args_done
P1_LI_R0
@@ -2094,9 +2225,7 @@
P1_LD_R1_R3_24 ## r1 = body
P1_LI_BR
&eval
- P1_CALL
- P1_EPILOGUE_N4
- P1_RET
+ P1_TAIL_N4 ## Scheme tail call: closure body
## ---- eval(r1=expr, r2=env) -> r0 = value ---------------------------
@@ -2151,9 +2280,7 @@
P1_LD_R2_R3_16
P1_LI_BR
&lookup
- P1_CALL
- P1_EPILOGUE_N3
- P1_RET
+ P1_TAIL_N3
:eval_pair
## Compound expression. Dispatch on car against cached sym_*
@@ -2227,9 +2354,7 @@
P1_LD_R1_R3_24
P1_LI_BR
&apply
- P1_CALL
- P1_EPILOGUE_N3
- P1_RET
+ P1_TAIL_N3 ## Scheme tail call: application
## ---- eval_quote / eval_if / eval_begin -----------------------------
@@ -2243,10 +2368,8 @@
P1_CALL ## r0 = (x)
P1_MOV_R1_R0
P1_LI_BR
- &car
- P1_CALL ## r0 = x
- P1_EPILOGUE_N3
- P1_RET
+ &car ## tail: r0 = x
+ P1_TAIL_N3
:eval_if
## (if cond then else). Save (then else) tail into slot 3, eval
@@ -2294,10 +2417,8 @@
P1_MOV_R3_SP
P1_LD_R2_R3_16
P1_LI_BR
- &eval
- P1_CALL
- P1_EPILOGUE_N3
- P1_RET
+ &eval ## Scheme tail: then-branch
+ P1_TAIL_N3
:eval_if_else
## Else branch: eval car(cdr(slot3))
@@ -2314,16 +2435,15 @@
P1_MOV_R3_SP
P1_LD_R2_R3_16
P1_LI_BR
- &eval
- P1_CALL
- P1_EPILOGUE_N3
- P1_RET
+ &eval ## Scheme tail: else-branch
+ P1_TAIL_N3
:eval_begin
- ## (begin e1 e2 ...). Slot 1 holds the moving cursor (we overwrite
- ## the original expr arg since it's no longer needed). Slot 3
- ## accumulates the running last-result so it survives the cdr
- ## call each iteration.
+ ## (begin e1 e2 ... en). Slot 1 = cursor over the body list. The
+ ## last form (en) is Scheme tail-position, so the loop peeks
+ ## cdr(cursor): nil next → TAIL eval the current head; otherwise
+ ## CALL eval and advance. Slot 3 bridges the saved next-cursor
+ ## across the CALL eval in the non-tail branch.
P1_MOV_R3_SP
P1_LD_R1_R3_8
P1_LI_BR
@@ -2332,20 +2452,31 @@
P1_MOV_R3_SP
P1_ST_R0_R3_8 ## slot 1 := cursor
- P1_LI_R0
- '07000000'
- P1_ST_R0_R3_24 ## slot 3 := nil (empty-begin result)
-
:eval_begin_loop
P1_MOV_R3_SP
- P1_LD_R2_R3_8
+ P1_LD_R1_R3_8
+ P1_LI_R2
+ '07000000'
+ P1_LI_BR
+ &eval_begin_empty
+ P1_BEQ_R1_R2 ## cursor == nil → empty begin → nil
+
+ ## next = cdr(cursor)
+ P1_LI_BR
+ &cdr
+ P1_CALL ## r0 = next
+
P1_LI_R1
'07000000'
P1_LI_BR
- &eval_begin_done
- P1_BEQ_R2_R1
+ &eval_begin_tail
+ P1_BEQ_R0_R1 ## next == nil → tail-eval last form
- P1_MOV_R1_R2
+ ## Non-tail: stash next in slot 3, CALL eval(car(cursor), env),
+ ## discard result, advance cursor := next.
+ P1_MOV_R3_SP
+ P1_ST_R0_R3_24 ## slot 3 := next
+ P1_LD_R1_R3_8
P1_LI_BR
&car
P1_CALL
@@ -2357,21 +2488,29 @@
P1_CALL
P1_MOV_R3_SP
- P1_ST_R0_R3_24 ## slot 3 = last result
+ P1_LD_R0_R3_24
+ P1_ST_R0_R3_8 ## cursor := next
+ P1_LI_BR
+ &eval_begin_loop
+ P1_B
+:eval_begin_tail
+ ## Scheme tail: TAIL eval(car(cursor), env). Frame torn down.
+ P1_MOV_R3_SP
P1_LD_R1_R3_8
P1_LI_BR
- &cdr
- P1_CALL
+ &car
+ P1_CALL ## r0 = head expr
+ P1_MOV_R1_R0
P1_MOV_R3_SP
- P1_ST_R0_R3_8
+ P1_LD_R2_R3_16
P1_LI_BR
- &eval_begin_loop
- P1_B
+ &eval
+ P1_TAIL_N3
-:eval_begin_done
- P1_MOV_R3_SP
- P1_LD_R0_R3_24
+:eval_begin_empty
+ P1_LI_R0
+ '07000000'
P1_EPILOGUE_N3
P1_RET
@@ -2407,10 +2546,8 @@
P1_LD_R1_R3_8 ## r1 = params
P1_LD_R3_R3_16 ## r3 = env
P1_LI_BR
- &make_closure
- P1_CALL
- P1_EPILOGUE_N3
- P1_RET
+ &make_closure ## tail: no Scheme-visible work after
+ P1_TAIL_N3
:eval_define
## (define sym val-expr). gset-binds the evaluated val into the
@@ -2511,6 +2648,12 @@
"arity mismatch"
:msg_not_callable
"not callable"
+:msg_usage
+"usage: lisp <file.scm>"
+:msg_open_fail
+"failed to open source file"
+:msg_src_too_big
+"source file too large"
## Interned name samples used by the self-test.
:str_foo
@@ -2531,16 +2674,6 @@
:str_define
"define"
-## Step-6 test source. `(define id (lambda (x) x))` binds the identity
-## function globally; `(id 42)` applies it. Expected exit status = 42.
-:src_text
-"(define id (lambda (x) x))(id 42)"
-## 8-byte LE length of the preceding src_text literal. Loaded at
-## startup into src_len so the reader knows where EOF is.
-:src_text_len
-'21000000'
-'00000000'
-
## ---- Special-form symbol slots --------------------------------------
## Zero-initialized; _start populates each slot with the interned
@@ -3351,4 +3484,270 @@
'0000000000000000000000000000000000000000000000000000000000000000'
:heap_tail
+
+## ---- Source buffer (16 KiB) -----------------------------------------
+## Receives the contents of the file named by argv[1]. Sized to cover
+## the step-9 test fixtures with headroom; widen once those exist.
+## Kept out of the Scheme heap so the reader's raw byte pointers don't
+## fight the bump allocator.
+:src_buf
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+:src_buf_end
+
+
:ELF_end