boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs

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:
MMakefile | 8+++++++-
Ahello.scm | 2++
Mlisp.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