From 64e870c207570b06f1be264462c287e34733c490 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Sat, 2 May 2026 17:45:56 -0500 Subject: [PATCH] add El SDK CI/CD pipeline and install script - .gitea/workflows/sdk-release.yaml: build elc from bootstrap, run tests, publish latest release, dispatch el-sdk-updated to downstream repos - install.sh: one-command El SDK install from Gitea release --- .DS_Store | Bin 0 -> 8196 bytes .gitea/workflows/sdk-release.yaml | 166 + dist/elc-bootstrap.c | 4793 ++++++++++++ dist/elc-new.c | 4773 ++++++++++++ dist/platform/elc-asan | Bin 0 -> 705496 bytes .../elc-asan.dSYM/Contents/Info.plist | 20 + .../Contents/Resources/DWARF/elc-asan | Bin 0 -> 376196 bytes .../Relocations/aarch64/elc-asan.yml | 5 + dist/platform/elc-new | Bin 0 -> 221480 bytes dist/platform/elc.prelaunch.bak | Bin 0 -> 375272 bytes dist/platform/elc.prev7 | Bin 0 -> 221472 bytes dist/platform/elc.prev8 | Bin 0 -> 221480 bytes dist/platform/elc.prev9 | Bin 0 -> 221480 bytes el-compiler/runtime/el_runtime.c | 3 + el-compiler/runtime/el_runtime.js | 679 ++ el-compiler/src/codegen-js.el | 943 +++ install.sh | 80 + releases/v1.0.0-20260501/RELEASE.md | 28 + releases/v1.0.0-20260501/el_runtime.c | 6693 +++++++++++++++++ releases/v1.0.0-20260501/el_runtime.h | 507 ++ spec/codegen-js.md | 236 + 21 files changed, 18926 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitea/workflows/sdk-release.yaml create mode 100644 dist/elc-bootstrap.c create mode 100644 dist/elc-new.c create mode 100755 dist/platform/elc-asan create mode 100644 dist/platform/elc-asan.dSYM/Contents/Info.plist create mode 100644 dist/platform/elc-asan.dSYM/Contents/Resources/DWARF/elc-asan create mode 100644 dist/platform/elc-asan.dSYM/Contents/Resources/Relocations/aarch64/elc-asan.yml create mode 100755 dist/platform/elc-new create mode 100755 dist/platform/elc.prelaunch.bak create mode 100755 dist/platform/elc.prev7 create mode 100755 dist/platform/elc.prev8 create mode 100755 dist/platform/elc.prev9 create mode 100644 el-compiler/runtime/el_runtime.js create mode 100644 el-compiler/src/codegen-js.el create mode 100644 install.sh create mode 100644 releases/v1.0.0-20260501/RELEASE.md create mode 100644 releases/v1.0.0-20260501/el_runtime.c create mode 100644 releases/v1.0.0-20260501/el_runtime.h create mode 100644 spec/codegen-js.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e4ea543c1003853be3e8bdb34cbcf33ed4a103b8 GIT binary patch literal 8196 zcmeHM-A)rh6g~q8TPw2sRH@NqV{c5rNT~@i#!w4J2{8~_u?SdqyF=Zu-D!5Wl%J6F zUT=H=AHYX2CdNyjz&qn3=nI&5W@jqeLc*0XbS9bk&d!`~w&&ZK-91|XAi27o1{enb z4J$`Ij?FQJkMr75dSp*OB0)ZY301fWHe%S}tvZwfN&%&SQa~x76!;$$z-Klu+6m8n zF{)anfKs3<72x*=11ra@#HPUL)`3lw0wDHbcT~{EJRss260;JU0wXHUDY6G5sYIq2 zM9^{E;O>Z7iA{lm4n)v_$TJg}p^)h8$TK2$AX$N`RSGBtIu+o#dmJcuPyzq1{N1z~ zLCtcRg&yy%n(GAN)YKQ!)7y8he?S}1;@W2ZC2QnEGpq+W(_iOD1;$*fWt-NjLmMT1 zY>s)M>3GzS2#!tBW#g&i*{qRcbFG&h zCNpz*7}FA|TX$DV+iulkuS7&d-W6c5EyC9)hv$@cWO(FbE4**I-U={wK7L{F;*dT( zGCDjqoJb@tT^>(fNnS1Kqn26TuK4_i&oP(zIk!&NE52jrYi8N;D#eiQhIwb7mh_P} z*A;3%Kk6#%)zD|`s3V&0p--t7&9}6*70|HwhrL$Phk~-tTz8oTPUtXiZ6iS07eZQH z@U|G9aR((|s_~&{&c|x9%b;0jxUE^zVJ_*D|n9!-nJ#=CQ{Ia3iOJY$9ew$;N dist/elc-gen3.c + gcc -O2 \ + -I el-compiler/runtime \ + dist/elc-gen3.c \ + el-compiler/runtime/el_runtime.c \ + -lcurl -lpthread \ + -o dist/platform/elc + chmod +x dist/platform/elc + echo "gen3 (self-hosted) elc built" + dist/platform/elc --version || true + + # Run all four test suites with gen3 elc + - name: Run tests — text + run: | + ELC="$(pwd)/dist/platform/elc" \ + EL_HOME="$(pwd)" \ + bash tests/text/run.sh + + - name: Run tests — calendar + run: | + ELC="$(pwd)/dist/platform/elc" \ + EL_HOME="$(pwd)" \ + bash tests/calendar/run.sh + + - name: Run tests — time + run: | + ELC="$(pwd)/dist/platform/elc" \ + EL_HOME="$(pwd)" \ + bash tests/time/run.sh + + - name: Run tests — html_sanitizer + run: | + ELC="$(pwd)/dist/platform/elc" \ + EL_HOME="$(pwd)" \ + bash tests/html_sanitizer/run.sh + + # Publish / update the `latest` release with the three SDK assets + - name: Publish latest release + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_API: https://git.neuralplatform.ai/api/v1 + REPO: neuron-technologies/el + run: | + # Delete existing `latest` release if it exists + EXISTING_ID=$(curl -sf \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_API}/repos/${REPO}/releases/tags/latest" \ + | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['id'])" 2>/dev/null || true) + + if [ -n "${EXISTING_ID}" ]; then + echo "Deleting existing release id=${EXISTING_ID}" + curl -sf -X DELETE \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_API}/repos/${REPO}/releases/${EXISTING_ID}" + fi + + # Delete and re-create the `latest` tag so it points at HEAD + curl -sf -X DELETE \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_API}/repos/${REPO}/tags/latest" || true + + # Create the release + RELEASE_ID=$(curl -sf -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + "${GITEA_API}/repos/${REPO}/releases" \ + -d "{ + \"tag_name\": \"latest\", + \"name\": \"El SDK (latest)\", + \"body\": \"Latest El SDK build from commit ${GITHUB_SHA}.\nBuilt $(date -u +%Y-%m-%dT%H:%M:%SZ).\", + \"draft\": false, + \"prerelease\": false + }" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") + + echo "Created release id=${RELEASE_ID}" + + # Upload assets + upload_asset() { + local filepath="$1" + local name="$2" + echo "Uploading ${name}..." + curl -sf -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -F "attachment=@${filepath};filename=${name}" \ + "${GITEA_API}/repos/${REPO}/releases/${RELEASE_ID}/assets" + } + + upload_asset dist/platform/elc elc + upload_asset el-compiler/runtime/el_runtime.c el_runtime.c + upload_asset el-compiler/runtime/el_runtime.h el_runtime.h + + echo "Release published successfully" + + # Dispatch el-sdk-updated event to downstream repos + - name: Dispatch to foundation/engram + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_API: https://git.neuralplatform.ai/api/v1 + run: | + curl -sf -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + "${GITEA_API}/repos/neuron-technologies/engram/dispatches" \ + -d "{ + \"type\": \"el-sdk-updated\", + \"inputs\": { + \"el_version\": \"latest\", + \"commit\": \"${GITHUB_SHA}\" + } + }" + echo "Dispatched el-sdk-updated to foundation/engram" + + - name: Dispatch to neuron-technologies/forge + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_API: https://git.neuralplatform.ai/api/v1 + run: | + curl -sf -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + "${GITEA_API}/repos/neuron-technologies/forge/dispatches" \ + -d "{ + \"type\": \"el-sdk-updated\", + \"inputs\": { + \"el_version\": \"latest\", + \"commit\": \"${GITHUB_SHA}\" + } + }" + echo "Dispatched el-sdk-updated to neuron-technologies/forge" diff --git a/dist/elc-bootstrap.c b/dist/elc-bootstrap.c new file mode 100644 index 0000000..c5a042d --- /dev/null +++ b/dist/elc-bootstrap.c @@ -0,0 +1,4793 @@ +#include +#include +#include "el_runtime.h" + +el_val_t is_digit(el_val_t ch); +el_val_t is_alpha(el_val_t ch); +el_val_t is_alnum_or_underscore(el_val_t ch); +el_val_t is_whitespace(el_val_t ch); +el_val_t make_tok(el_val_t kind, el_val_t value); +el_val_t keyword_kind(el_val_t word); +el_val_t scan_digits(el_val_t chars, el_val_t start, el_val_t total); +el_val_t scan_ident(el_val_t chars, el_val_t start, el_val_t total); +el_val_t scan_string(el_val_t chars, el_val_t start, el_val_t total); +el_val_t lex(el_val_t source); +el_val_t tok_at(el_val_t tokens, el_val_t pos); +el_val_t tok_kind(el_val_t tokens, el_val_t pos); +el_val_t tok_value(el_val_t tokens, el_val_t pos); +el_val_t expect(el_val_t tokens, el_val_t pos, el_val_t kind); +el_val_t make_result(el_val_t node, el_val_t pos); +el_val_t skip_type(el_val_t tokens, el_val_t pos); +el_val_t parse_params(el_val_t tokens, el_val_t pos); +el_val_t parse_primary(el_val_t tokens, el_val_t pos); +el_val_t parse_if(el_val_t tokens, el_val_t pos); +el_val_t parse_match(el_val_t tokens, el_val_t pos); +el_val_t parse_pattern(el_val_t tokens, el_val_t pos); +el_val_t parse_for_expr(el_val_t tokens, el_val_t pos); +el_val_t parse_block(el_val_t tokens, el_val_t pos); +el_val_t parse_postfix(el_val_t tokens, el_val_t pos); +el_val_t op_precedence(el_val_t kind); +el_val_t is_binop(el_val_t kind); +el_val_t parse_binop(el_val_t tokens, el_val_t pos, el_val_t min_prec); +el_val_t parse_expr(el_val_t tokens, el_val_t pos); +el_val_t parse_stmt(el_val_t tokens, el_val_t pos); +el_val_t parse(el_val_t tokens); +el_val_t c_escape(el_val_t s); +el_val_t c_str_lit(el_val_t s); +el_val_t el_type_to_c(el_val_t type_str); +el_val_t emit_line(el_val_t line); +el_val_t emit_blank(void); +el_val_t binop_to_c(el_val_t op); +el_val_t cg_expr(el_val_t expr); +el_val_t next_match_id(void); +el_val_t cg_match(el_val_t expr); +el_val_t next_if_id(void); +el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var); +el_val_t cg_if_expr(el_val_t expr); +el_val_t list_contains(el_val_t lst, el_val_t s); +el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared); +el_val_t strip_outer_parens(el_val_t s); +el_val_t cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared); +el_val_t cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared); +el_val_t param_decl(el_val_t param, el_val_t idx); +el_val_t params_to_c(el_val_t params); +el_val_t transform_implicit_return(el_val_t body); +el_val_t is_int_name(el_val_t name); +el_val_t is_int_call(el_val_t call_expr); +el_val_t is_int_expr(el_val_t expr); +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name); +el_val_t is_self_formation_call(el_val_t fn_name); +el_val_t is_dharma_call(el_val_t fn_name); +el_val_t is_llm_call(el_val_t fn_name); +el_val_t cap_check_call(el_val_t fn_name); +el_val_t emit_cap_violations(void); +el_val_t builtin_arity(el_val_t name); +el_val_t arity_record_violation(el_val_t fn_name, el_val_t expected, el_val_t actual); +el_val_t arity_check_call(el_val_t fn_name, el_val_t actual); +el_val_t emit_arity_violations(void); +el_val_t add_int_name(el_val_t name); +el_val_t build_int_names_for_params(el_val_t params); +el_val_t cg_fn(el_val_t stmt); +el_val_t is_fndef(el_val_t stmt); +el_val_t is_top_level_decl(el_val_t stmt); +el_val_t cgi_arg(el_val_t value, el_val_t has_value); +el_val_t vbd_is_restricted_name(el_val_t name); +el_val_t vbd_expr_has_restricted_call(el_val_t expr); +el_val_t vbd_has_restricted_call(el_val_t stmts); +el_val_t codegen(el_val_t stmts, el_val_t source); +el_val_t js_escape(el_val_t s); +el_val_t js_str_lit(el_val_t s); +el_val_t js_emit_line(el_val_t line); +el_val_t js_emit_blank(void); +el_val_t js_binop(el_val_t op); +el_val_t js_is_int_name(el_val_t name); +el_val_t js_add_int_name(el_val_t name); +el_val_t js_build_int_names_for_params(el_val_t params); +el_val_t js_is_int_call(el_val_t call_expr); +el_val_t js_cg_expr(el_val_t expr); +el_val_t js_next_match_id(void); +el_val_t js_cg_match(el_val_t expr); +el_val_t js_list_contains(el_val_t lst, el_val_t s); +el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared); +el_val_t js_strip_outer_parens(el_val_t s); +el_val_t js_cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t js_cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared); +el_val_t js_cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t js_cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared); +el_val_t js_params_str(el_val_t params); +el_val_t js_transform_implicit_return(el_val_t body); +el_val_t js_cg_fn(el_val_t stmt); +el_val_t js_is_fndef(el_val_t stmt); +el_val_t js_is_top_level_decl(el_val_t stmt); +el_val_t codegen_js(el_val_t stmts, el_val_t source); +el_val_t compile(el_val_t source); +el_val_t compile_js(el_val_t source); +el_val_t compile_dispatch(el_val_t tgt, el_val_t source); +el_val_t detect_target(el_val_t argv); +el_val_t strip_flags(el_val_t argv); + +el_val_t _argv; +el_val_t _target; +el_val_t _positional; +el_val_t _argc; + +el_val_t is_digit(el_val_t ch) { + if (str_eq(ch, EL_STR("0"))) { + return 1; + } + if (str_eq(ch, EL_STR("1"))) { + return 1; + } + if (str_eq(ch, EL_STR("2"))) { + return 1; + } + if (str_eq(ch, EL_STR("3"))) { + return 1; + } + if (str_eq(ch, EL_STR("4"))) { + return 1; + } + if (str_eq(ch, EL_STR("5"))) { + return 1; + } + if (str_eq(ch, EL_STR("6"))) { + return 1; + } + if (str_eq(ch, EL_STR("7"))) { + return 1; + } + if (str_eq(ch, EL_STR("8"))) { + return 1; + } + if (str_eq(ch, EL_STR("9"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_alpha(el_val_t ch) { + if (str_eq(ch, EL_STR("a"))) { + return 1; + } + if (str_eq(ch, EL_STR("b"))) { + return 1; + } + if (str_eq(ch, EL_STR("c"))) { + return 1; + } + if (str_eq(ch, EL_STR("d"))) { + return 1; + } + if (str_eq(ch, EL_STR("e"))) { + return 1; + } + if (str_eq(ch, EL_STR("f"))) { + return 1; + } + if (str_eq(ch, EL_STR("g"))) { + return 1; + } + if (str_eq(ch, EL_STR("h"))) { + return 1; + } + if (str_eq(ch, EL_STR("i"))) { + return 1; + } + if (str_eq(ch, EL_STR("j"))) { + return 1; + } + if (str_eq(ch, EL_STR("k"))) { + return 1; + } + if (str_eq(ch, EL_STR("l"))) { + return 1; + } + if (str_eq(ch, EL_STR("m"))) { + return 1; + } + if (str_eq(ch, EL_STR("n"))) { + return 1; + } + if (str_eq(ch, EL_STR("o"))) { + return 1; + } + if (str_eq(ch, EL_STR("p"))) { + return 1; + } + if (str_eq(ch, EL_STR("q"))) { + return 1; + } + if (str_eq(ch, EL_STR("r"))) { + return 1; + } + if (str_eq(ch, EL_STR("s"))) { + return 1; + } + if (str_eq(ch, EL_STR("t"))) { + return 1; + } + if (str_eq(ch, EL_STR("u"))) { + return 1; + } + if (str_eq(ch, EL_STR("v"))) { + return 1; + } + if (str_eq(ch, EL_STR("w"))) { + return 1; + } + if (str_eq(ch, EL_STR("x"))) { + return 1; + } + if (str_eq(ch, EL_STR("y"))) { + return 1; + } + if (str_eq(ch, EL_STR("z"))) { + return 1; + } + if (str_eq(ch, EL_STR("A"))) { + return 1; + } + if (str_eq(ch, EL_STR("B"))) { + return 1; + } + if (str_eq(ch, EL_STR("C"))) { + return 1; + } + if (str_eq(ch, EL_STR("D"))) { + return 1; + } + if (str_eq(ch, EL_STR("E"))) { + return 1; + } + if (str_eq(ch, EL_STR("F"))) { + return 1; + } + if (str_eq(ch, EL_STR("G"))) { + return 1; + } + if (str_eq(ch, EL_STR("H"))) { + return 1; + } + if (str_eq(ch, EL_STR("I"))) { + return 1; + } + if (str_eq(ch, EL_STR("J"))) { + return 1; + } + if (str_eq(ch, EL_STR("K"))) { + return 1; + } + if (str_eq(ch, EL_STR("L"))) { + return 1; + } + if (str_eq(ch, EL_STR("M"))) { + return 1; + } + if (str_eq(ch, EL_STR("N"))) { + return 1; + } + if (str_eq(ch, EL_STR("O"))) { + return 1; + } + if (str_eq(ch, EL_STR("P"))) { + return 1; + } + if (str_eq(ch, EL_STR("Q"))) { + return 1; + } + if (str_eq(ch, EL_STR("R"))) { + return 1; + } + if (str_eq(ch, EL_STR("S"))) { + return 1; + } + if (str_eq(ch, EL_STR("T"))) { + return 1; + } + if (str_eq(ch, EL_STR("U"))) { + return 1; + } + if (str_eq(ch, EL_STR("V"))) { + return 1; + } + if (str_eq(ch, EL_STR("W"))) { + return 1; + } + if (str_eq(ch, EL_STR("X"))) { + return 1; + } + if (str_eq(ch, EL_STR("Y"))) { + return 1; + } + if (str_eq(ch, EL_STR("Z"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_alnum_or_underscore(el_val_t ch) { + if (is_digit(ch)) { + return 1; + } + if (is_alpha(ch)) { + return 1; + } + if (str_eq(ch, EL_STR("_"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_whitespace(el_val_t ch) { + if (str_eq(ch, EL_STR(" "))) { + return 1; + } + if (str_eq(ch, EL_STR("\t"))) { + return 1; + } + if (str_eq(ch, EL_STR("\n"))) { + return 1; + } + if (str_eq(ch, EL_STR("\r"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t make_tok(el_val_t kind, el_val_t value) { + return el_map_new(2, "kind", kind, "value", value); + return 0; +} + +el_val_t keyword_kind(el_val_t word) { + if (str_eq(word, EL_STR("let"))) { + return EL_STR("Let"); + } + if (str_eq(word, EL_STR("fn"))) { + return EL_STR("Fn"); + } + if (str_eq(word, EL_STR("type"))) { + return EL_STR("Type"); + } + if (str_eq(word, EL_STR("enum"))) { + return EL_STR("Enum"); + } + if (str_eq(word, EL_STR("match"))) { + return EL_STR("Match"); + } + if (str_eq(word, EL_STR("return"))) { + return EL_STR("Return"); + } + if (str_eq(word, EL_STR("if"))) { + return EL_STR("If"); + } + if (str_eq(word, EL_STR("else"))) { + return EL_STR("Else"); + } + if (str_eq(word, EL_STR("for"))) { + return EL_STR("For"); + } + if (str_eq(word, EL_STR("in"))) { + return EL_STR("In"); + } + if (str_eq(word, EL_STR("while"))) { + return EL_STR("While"); + } + if (str_eq(word, EL_STR("import"))) { + return EL_STR("Import"); + } + if (str_eq(word, EL_STR("from"))) { + return EL_STR("From"); + } + if (str_eq(word, EL_STR("as"))) { + return EL_STR("As"); + } + if (str_eq(word, EL_STR("with"))) { + return EL_STR("With"); + } + if (str_eq(word, EL_STR("sealed"))) { + return EL_STR("Sealed"); + } + if (str_eq(word, EL_STR("activate"))) { + return EL_STR("Activate"); + } + if (str_eq(word, EL_STR("where"))) { + return EL_STR("Where"); + } + if (str_eq(word, EL_STR("test"))) { + return EL_STR("Test"); + } + if (str_eq(word, EL_STR("seed"))) { + return EL_STR("Seed"); + } + if (str_eq(word, EL_STR("assert"))) { + return EL_STR("Assert"); + } + if (str_eq(word, EL_STR("protocol"))) { + return EL_STR("Protocol"); + } + if (str_eq(word, EL_STR("impl"))) { + return EL_STR("Impl"); + } + if (str_eq(word, EL_STR("retry"))) { + return EL_STR("Retry"); + } + if (str_eq(word, EL_STR("times"))) { + return EL_STR("Times"); + } + if (str_eq(word, EL_STR("fallback"))) { + return EL_STR("Fallback"); + } + if (str_eq(word, EL_STR("reason"))) { + return EL_STR("Reason"); + } + if (str_eq(word, EL_STR("parallel"))) { + return EL_STR("Parallel"); + } + if (str_eq(word, EL_STR("trace"))) { + return EL_STR("Trace"); + } + if (str_eq(word, EL_STR("requires"))) { + return EL_STR("Requires"); + } + if (str_eq(word, EL_STR("deploy"))) { + return EL_STR("Deploy"); + } + if (str_eq(word, EL_STR("to"))) { + return EL_STR("To"); + } + if (str_eq(word, EL_STR("via"))) { + return EL_STR("Via"); + } + if (str_eq(word, EL_STR("target"))) { + return EL_STR("Target"); + } + if (str_eq(word, EL_STR("true"))) { + return EL_STR("Bool"); + } + if (str_eq(word, EL_STR("false"))) { + return EL_STR("Bool"); + } + if (str_eq(word, EL_STR("cgi"))) { + return EL_STR("Cgi"); + } + if (str_eq(word, EL_STR("service"))) { + return EL_STR("Service"); + } + if (str_eq(word, EL_STR("manager"))) { + return EL_STR("Manager"); + } + if (str_eq(word, EL_STR("engine"))) { + return EL_STR("Engine"); + } + if (str_eq(word, EL_STR("accessor"))) { + return EL_STR("Accessor"); + } + if (str_eq(word, EL_STR("vessel"))) { + return EL_STR("Vessel"); + } + return EL_STR(""); + return 0; +} + +el_val_t scan_digits(el_val_t chars, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t text = EL_STR(""); + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = native_list_get(chars, i); + if (is_digit(ch)) { + text = el_str_concat(text, ch); + i = (i + 1); + } else { + running = 0; + } + } + } + return el_map_new(2, "text", text, "pos", i); + return 0; +} + +el_val_t scan_ident(el_val_t chars, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t text = EL_STR(""); + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = native_list_get(chars, i); + if (is_alnum_or_underscore(ch)) { + text = el_str_concat(text, ch); + i = (i + 1); + } else { + running = 0; + } + } + } + return el_map_new(2, "text", text, "pos", i); + return 0; +} + +el_val_t scan_string(el_val_t chars, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t text = EL_STR(""); + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("\\"))) { + el_val_t next_i = (i + 1); + if (next_i < total) { + el_val_t next_ch = native_list_get(chars, next_i); + if (str_eq(next_ch, EL_STR("\""))) { + text = el_str_concat(text, EL_STR("\"")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("n"))) { + text = el_str_concat(text, EL_STR("\n")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("t"))) { + text = el_str_concat(text, EL_STR("\t")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("r"))) { + text = el_str_concat(text, EL_STR("\r")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("\\"))) { + text = el_str_concat(text, EL_STR("\\")); + i = (next_i + 1); + } else { + text = el_str_concat(text, next_ch); + i = (next_i + 1); + } + } + } + } + } + } else { + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("\""))) { + i = (i + 1); + running = 0; + } else { + text = el_str_concat(text, ch); + i = (i + 1); + } + } + } + } + return el_map_new(2, "text", text, "pos", i); + return 0; +} + +el_val_t lex(el_val_t source) { + el_val_t chars = native_string_chars(source); + el_val_t total = native_list_len(chars); + el_val_t tokens = native_list_empty(); + el_val_t i = 0; + while (i < total) { + el_val_t ch = native_list_get(chars, i); + if (is_whitespace(ch)) { + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("/"))) { + el_val_t next_i = (i + 1); + if (next_i < total) { + el_val_t next_ch = native_list_get(chars, next_i); + if (str_eq(next_ch, EL_STR("/"))) { + i = (i + 2); + el_val_t running2 = 1; + while (running2) { + if (i >= total) { + running2 = 0; + } else { + el_val_t lch = native_list_get(chars, i); + if (str_eq(lch, EL_STR("\n"))) { + running2 = 0; + } else { + i = (i + 1); + } + } + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Slash"), EL_STR("/"))); + i = (i + 1); + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Slash"), EL_STR("/"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("\""))) { + el_val_t result = scan_string(chars, (i + 1), total); + el_val_t str_text = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + tokens = native_list_append(tokens, make_tok(EL_STR("Str"), str_text)); + i = new_pos; + } else { + if (is_digit(ch)) { + el_val_t result = scan_digits(chars, i, total); + el_val_t num_text = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + if (new_pos < total) { + el_val_t dot_ch = native_list_get(chars, new_pos); + if (str_eq(dot_ch, EL_STR("."))) { + el_val_t after_dot = (new_pos + 1); + if (after_dot < total) { + el_val_t after_dot_ch = native_list_get(chars, after_dot); + if (is_digit(after_dot_ch)) { + el_val_t frac_result = scan_digits(chars, after_dot, total); + el_val_t frac_text = el_get_field(frac_result, EL_STR("text")); + el_val_t frac_pos = el_get_field(frac_result, EL_STR("pos")); + tokens = native_list_append(tokens, make_tok(EL_STR("Float"), el_str_concat(el_str_concat(num_text, EL_STR(".")), frac_text))); + i = frac_pos; + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + if (is_alpha(ch) || str_eq(ch, EL_STR("_"))) { + el_val_t result = scan_ident(chars, i, total); + el_val_t word = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + el_val_t kw = keyword_kind(word); + if (str_eq(kw, EL_STR(""))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Ident"), word)); + } else { + tokens = native_list_append(tokens, make_tok(kw, word)); + } + i = new_pos; + } else { + el_val_t peek_i = (i + 1); + el_val_t peek_ch = EL_STR(""); + if (peek_i < total) { + peek_ch = native_list_get(chars, peek_i); + } + if (str_eq(ch, EL_STR("="))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("EqEq"), EL_STR("=="))); + i = (i + 2); + } else { + if (str_eq(peek_ch, EL_STR(">"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("FatArrow"), EL_STR("=>"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Eq"), EL_STR("="))); + i = (i + 1); + } + } + } else { + if (str_eq(ch, EL_STR("!"))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("NotEq"), EL_STR("!="))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Not"), EL_STR("!"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("<"))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LtEq"), EL_STR("<="))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Lt"), EL_STR("<"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR(">"))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("GtEq"), EL_STR(">="))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Gt"), EL_STR(">"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("&"))) { + if (str_eq(peek_ch, EL_STR("&"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("And"), EL_STR("&&"))); + i = (i + 2); + } else { + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("|"))) { + if (str_eq(peek_ch, EL_STR("|"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Or"), EL_STR("||"))); + i = (i + 2); + } else { + if (str_eq(peek_ch, EL_STR(">"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("PipeOp"), EL_STR("|>"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Pipe"), EL_STR("|"))); + i = (i + 1); + } + } + } else { + if (str_eq(ch, EL_STR("-"))) { + if (str_eq(peek_ch, EL_STR(">"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Arrow"), EL_STR("->"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Minus"), EL_STR("-"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR(":"))) { + if (str_eq(peek_ch, EL_STR(":"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("ColonColon"), EL_STR("::"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Colon"), EL_STR(":"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("+"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Plus"), EL_STR("+"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("*"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Star"), EL_STR("*"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("%"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Percent"), EL_STR("%"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("("))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LParen"), EL_STR("("))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR(")"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("RParen"), EL_STR(")"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("{"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LBrace"), EL_STR("{"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("}"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("RBrace"), EL_STR("}"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("["))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LBracket"), EL_STR("["))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("]"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("RBracket"), EL_STR("]"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR(","))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Comma"), EL_STR(","))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("."))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Dot"), EL_STR("."))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR(";"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Semicolon"), EL_STR(";"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("@"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("At"), EL_STR("@"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("?"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("QuestionMark"), EL_STR("?"))); + i = (i + 1); + } else { + i = (i + 1); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + tokens = native_list_append(tokens, make_tok(EL_STR("Eof"), EL_STR(""))); + return tokens; + return 0; +} + +el_val_t tok_at(el_val_t tokens, el_val_t pos) { + return native_list_get(tokens, pos); + return 0; +} + +el_val_t tok_kind(el_val_t tokens, el_val_t pos) { + el_val_t t = native_list_get(tokens, pos); + return el_get_field(t, EL_STR("kind")); + return 0; +} + +el_val_t tok_value(el_val_t tokens, el_val_t pos) { + el_val_t t = native_list_get(tokens, pos); + return el_get_field(t, EL_STR("value")); + return 0; +} + +el_val_t expect(el_val_t tokens, el_val_t pos, el_val_t kind) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, kind)) { + return (pos + 1); + } + return (pos + 1); + return 0; +} + +el_val_t make_result(el_val_t node, el_val_t pos) { + return el_map_new(2, "node", node, "pos", pos); + return 0; +} + +el_val_t skip_type(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t p = (pos + 1); + p = skip_type(tokens, p); + p = expect(tokens, p, EL_STR("RBracket")); + return p; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Lt"))) { + p = (p + 1); + el_val_t depth = 1; + el_val_t running = 1; + while (running) { + el_val_t kk = tok_kind(tokens, p); + if (str_eq(kk, EL_STR("Eof"))) { + running = 0; + } else { + if (str_eq(kk, EL_STR("Lt"))) { + depth = (depth + 1); + p = (p + 1); + } else { + if (str_eq(kk, EL_STR("Gt"))) { + depth = (depth - 1); + p = (p + 1); + if (depth <= 0) { + running = 0; + } + } else { + p = (p + 1); + } + } + } + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("QuestionMark"))) { + p = (p + 1); + } + return p; + } + if (str_eq(k2, EL_STR("QuestionMark"))) { + return (p + 1); + } + return p; + } + return (pos + 1); + return 0; +} + +el_val_t parse_params(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("LParen")); + el_val_t params = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RParen"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t pname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t ptype = EL_STR(""); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ptype = tok_value(tokens, p); + } + p = skip_type(tokens, p); + el_val_t param = el_map_new(2, "name", pname, "type", ptype); + params = native_list_append(params, param); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + return el_map_new(2, "params", params, "pos", p); + return 0; +} + +el_val_t parse_primary(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + el_val_t v = tok_value(tokens, pos); + if (str_eq(k, EL_STR("Int"))) { + return make_result(el_map_new(2, "expr", EL_STR("Int"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Float"))) { + return make_result(el_map_new(2, "expr", EL_STR("Float"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Str"))) { + return make_result(el_map_new(2, "expr", EL_STR("Str"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Bool"))) { + return make_result(el_map_new(2, "expr", EL_STR("Bool"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Ident"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("LParen"))) { + el_val_t r = parse_expr(tokens, (pos + 1)); + el_val_t node = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + p = expect(tokens, p, EL_STR("RParen")); + return make_result(node, p); + } + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t p = (pos + 1); + el_val_t elems = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBracket"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_expr(tokens, p); + el_val_t elem = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + elems = native_list_append(elems, elem); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBracket")); + return make_result(el_map_new(2, "expr", EL_STR("Array"), "elems", elems), p); + } + if (str_eq(k, EL_STR("LBrace"))) { + el_val_t no_block = state_get(EL_STR("__no_block_expr")); + if (str_eq(no_block, EL_STR("1"))) { + return make_result(el_map_new(1, "expr", EL_STR("Nil")), pos); + } + el_val_t p = (pos + 1); + el_val_t pairs = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t key = tok_value(tokens, p); + el_val_t new_p = (p + 1); + new_p = expect(tokens, new_p, EL_STR("Colon")); + el_val_t r = parse_expr(tokens, new_p); + el_val_t val_node = el_get_field(r, EL_STR("node")); + new_p = el_get_field(r, EL_STR("pos")); + el_val_t pair = el_map_new(2, "key", key, "value", val_node); + pairs = native_list_append(pairs, pair); + el_val_t k3 = tok_kind(tokens, new_p); + if (str_eq(k3, EL_STR("Comma"))) { + new_p = (new_p + 1); + } + if (new_p <= p) { + p = (p + 1); + } else { + p = new_p; + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(2, "expr", EL_STR("Map"), "pairs", pairs), p); + } + if (str_eq(k, EL_STR("If"))) { + el_val_t r = parse_if(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("Match"))) { + el_val_t r = parse_match(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("For"))) { + el_val_t r = parse_for_expr(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("Not"))) { + el_val_t r = parse_primary(tokens, (pos + 1)); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "expr", EL_STR("Not"), "inner", inner), p); + } + if (str_eq(k, EL_STR("Minus"))) { + el_val_t r = parse_primary(tokens, (pos + 1)); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "expr", EL_STR("Neg"), "inner", inner), p); + } + if (str_eq(k, EL_STR("Target"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("To"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Via"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Deploy"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Reason"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Times"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Fallback"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Retry"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Parallel"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Trace"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Requires"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Where"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("As"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("With"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Manager"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Engine"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Accessor"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Vessel"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + return make_result(el_map_new(1, "expr", EL_STR("Nil")), (pos + 1)); + return 0; +} + +el_val_t parse_if(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("If")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t cond = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t then_stmts = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_val_t has_else = 0; + el_val_t else_stmts = native_list_empty(); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Else"))) { + p = (p + 1); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("If"))) { + el_val_t r3 = parse_if(tokens, p); + el_val_t nested = el_get_field(r3, EL_STR("node")); + p = el_get_field(r3, EL_STR("pos")); + else_stmts = native_list_append(else_stmts, el_map_new(2, "stmt", EL_STR("Expr"), "value", nested)); + has_else = 1; + } else { + el_val_t r3 = parse_block(tokens, p); + else_stmts = el_get_field(r3, EL_STR("stmts")); + p = el_get_field(r3, EL_STR("pos")); + has_else = 1; + } + } + return make_result(el_map_new(5, "expr", EL_STR("If"), "cond", cond, "then", then_stmts, "else", else_stmts, "has_else", has_else), p); + return 0; +} + +el_val_t parse_match(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("Match")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t subject = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t arms = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r2 = parse_pattern(tokens, p); + el_val_t pattern = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + p = expect(tokens, p, EL_STR("FatArrow")); + el_val_t r3 = parse_expr(tokens, p); + el_val_t body = el_get_field(r3, EL_STR("node")); + p = el_get_field(r3, EL_STR("pos")); + el_val_t arm = el_map_new(2, "pattern", pattern, "body", body); + arms = native_list_append(arms, arm); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "expr", EL_STR("Match"), "subject", subject, "arms", arms), p); + return 0; +} + +el_val_t parse_pattern(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Ident"))) { + el_val_t v = tok_value(tokens, pos); + if (str_eq(v, EL_STR("_"))) { + return make_result(el_map_new(1, "pattern", EL_STR("Wildcard")), (pos + 1)); + } + return make_result(el_map_new(2, "pattern", EL_STR("Binding"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Int"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitInt"), "value", tok_value(tokens, pos)), (pos + 1)); + } + if (str_eq(k, EL_STR("Str"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitStr"), "value", tok_value(tokens, pos)), (pos + 1)); + } + if (str_eq(k, EL_STR("Bool"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitBool"), "value", tok_value(tokens, pos)), (pos + 1)); + } + return make_result(el_map_new(1, "pattern", EL_STR("Wildcard")), (pos + 1)); + return 0; +} + +el_val_t parse_for_expr(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("For")); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("In")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t list_expr = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(4, "expr", EL_STR("For"), "item", item_name, "list", list_expr, "body", body), p); + return 0; +} + +el_val_t parse_block(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("LBrace")); + el_val_t stmts = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_stmt(tokens, p); + el_val_t stmt = el_get_field(r, EL_STR("node")); + el_val_t new_p = el_get_field(r, EL_STR("pos")); + stmts = native_list_append(stmts, stmt); + if (new_p <= p) { + p = (p + 1); + } else { + p = new_p; + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return el_map_new(2, "stmts", stmts, "pos", p); + return 0; +} + +el_val_t parse_postfix(el_val_t tokens, el_val_t pos) { + el_val_t r = parse_primary(tokens, pos); + el_val_t node = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("LParen"))) { + p = (p + 1); + el_val_t args = native_list_empty(); + el_val_t run2 = 1; + while (run2) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RParen"))) { + run2 = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + run2 = 0; + } else { + el_val_t r2 = parse_expr(tokens, p); + el_val_t arg = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + args = native_list_append(args, arg); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + node = el_map_new(3, "expr", EL_STR("Call"), "func", node, "args", args); + } else { + if (str_eq(k, EL_STR("Dot"))) { + el_val_t field = tok_value(tokens, (p + 1)); + p = (p + 2); + node = el_map_new(3, "expr", EL_STR("Field"), "object", node, "field", field); + } else { + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t r2 = parse_expr(tokens, (p + 1)); + el_val_t idx = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + p = expect(tokens, p, EL_STR("RBracket")); + node = el_map_new(3, "expr", EL_STR("Index"), "object", node, "index", idx); + } else { + if (str_eq(k, EL_STR("QuestionMark"))) { + p = (p + 1); + node = el_map_new(2, "expr", EL_STR("Try"), "inner", node); + } else { + running = 0; + } + } + } + } + } + return make_result(node, p); + return 0; +} + +el_val_t op_precedence(el_val_t kind) { + if (str_eq(kind, EL_STR("Or"))) { + return 1; + } + if (str_eq(kind, EL_STR("And"))) { + return 2; + } + if (str_eq(kind, EL_STR("EqEq"))) { + return 3; + } + if (str_eq(kind, EL_STR("NotEq"))) { + return 3; + } + if (str_eq(kind, EL_STR("Lt"))) { + return 4; + } + if (str_eq(kind, EL_STR("Gt"))) { + return 4; + } + if (str_eq(kind, EL_STR("LtEq"))) { + return 4; + } + if (str_eq(kind, EL_STR("GtEq"))) { + return 4; + } + if (str_eq(kind, EL_STR("Plus"))) { + return 5; + } + if (str_eq(kind, EL_STR("Minus"))) { + return 5; + } + if (str_eq(kind, EL_STR("Star"))) { + return 6; + } + if (str_eq(kind, EL_STR("Slash"))) { + return 6; + } + return 0; + return 0; +} + +el_val_t is_binop(el_val_t kind) { + if (str_eq(kind, EL_STR("Or"))) { + return 1; + } + if (str_eq(kind, EL_STR("And"))) { + return 1; + } + if (str_eq(kind, EL_STR("EqEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("NotEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("Lt"))) { + return 1; + } + if (str_eq(kind, EL_STR("Gt"))) { + return 1; + } + if (str_eq(kind, EL_STR("LtEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("GtEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("Plus"))) { + return 1; + } + if (str_eq(kind, EL_STR("Minus"))) { + return 1; + } + if (str_eq(kind, EL_STR("Star"))) { + return 1; + } + if (str_eq(kind, EL_STR("Slash"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t parse_binop(el_val_t tokens, el_val_t pos, el_val_t min_prec) { + el_val_t r = parse_postfix(tokens, pos); + el_val_t left = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + el_val_t prec = op_precedence(k); + if (is_binop(k)) { + if (prec >= min_prec) { + el_val_t op = k; + el_val_t r2 = parse_binop(tokens, (p + 1), (prec + 1)); + el_val_t right = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + left = el_map_new(4, "expr", EL_STR("BinOp"), "op", op, "left", left, "right", right); + } else { + running = 0; + } + } else { + running = 0; + } + } + return make_result(left, p); + return 0; +} + +el_val_t parse_expr(el_val_t tokens, el_val_t pos) { + return parse_binop(tokens, pos, 1); + return 0; +} + +el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Let"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t ltype = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Colon"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ltype = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + p = expect(tokens, p, EL_STR("Eq")); + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(4, "stmt", EL_STR("Let"), "name", name, "value", val, "type", ltype), p); + } + if (str_eq(k, EL_STR("Return"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", el_map_new(1, "expr", EL_STR("Nil"))), p); + } + if (str_eq(k2, EL_STR("Eof"))) { + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", el_map_new(1, "expr", EL_STR("Nil"))), p); + } + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", val), p); + } + if (str_eq(k, EL_STR("Fn"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = parse_params(tokens, p); + el_val_t params = el_get_field(r, EL_STR("params")); + p = el_get_field(r, EL_STR("pos")); + el_val_t ret_type = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Arrow"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ret_type = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(5, "stmt", EL_STR("FnDef"), "name", name, "params", params, "body", body, "ret_type", ret_type), p); + } + if (str_eq(k, EL_STR("Type"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t fields = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + p = skip_type(tokens, p); + fields = native_list_append(fields, el_map_new(1, "name", fname)); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "stmt", EL_STR("TypeDef"), "name", name, "fields", fields), p); + } + if (str_eq(k, EL_STR("Enum"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t variants = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t vname = tok_value(tokens, p); + p = (p + 1); + variants = native_list_append(variants, el_map_new(1, "name", vname)); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "stmt", EL_STR("EnumDef"), "name", name, "variants", variants), p); + } + if (str_eq(k, EL_STR("Import"))) { + el_val_t p = (pos + 1); + el_val_t path = tok_value(tokens, p); + p = (p + 1); + return make_result(el_map_new(2, "stmt", EL_STR("Import"), "path", path), p); + } + if (str_eq(k, EL_STR("From"))) { + el_val_t p = (pos + 1); + el_val_t module_name = tok_value(tokens, p); + p = (p + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Import"))) { + p = (p + 1); + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("LBrace"))) { + p = (p + 1); + el_val_t running = 1; + while (running) { + el_val_t k4 = tok_kind(tokens, p); + if (str_eq(k4, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k4, EL_STR("Eof"))) { + running = 0; + } else { + p = (p + 1); + el_val_t k5 = tok_kind(tokens, p); + if (str_eq(k5, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + } + return make_result(el_map_new(2, "stmt", EL_STR("Import"), "path", module_name), p); + } + if (str_eq(k, EL_STR("While"))) { + el_val_t p = (pos + 1); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t cond = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(3, "stmt", EL_STR("While"), "cond", cond, "body", body), p); + } + if (str_eq(k, EL_STR("For"))) { + el_val_t p = (pos + 1); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("In")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t list_expr = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(4, "stmt", EL_STR("For"), "item", item_name, "list", list_expr, "body", body), p); + } + if (str_eq(k, EL_STR("At"))) { + el_val_t p = (pos + 1); + el_val_t dec_name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = parse_stmt(tokens, p); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p2 = el_get_field(r, EL_STR("pos")); + el_val_t inner_kind = el_get_field(inner, EL_STR("stmt")); + if (str_eq(inner_kind, EL_STR("FnDef"))) { + el_val_t with_dec = el_map_new(6, "stmt", EL_STR("FnDef"), "name", el_get_field(inner, EL_STR("name")), "params", el_get_field(inner, EL_STR("params")), "body", el_get_field(inner, EL_STR("body")), "ret_type", el_get_field(inner, EL_STR("ret_type")), "decorator", dec_name); + return make_result(with_dec, p2); + } + return r; + } + if (str_eq(k, EL_STR("Cgi"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t dharma_id = EL_STR(""); + el_val_t principal = EL_STR(""); + el_val_t network = EL_STR(""); + el_val_t engram = EL_STR(""); + el_val_t has_dharma_id = 0; + el_val_t has_principal = 0; + el_val_t has_network = 0; + el_val_t has_engram = 0; + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t fval = tok_value(tokens, p); + p = (p + 1); + if (str_eq(fname, EL_STR("dharma_id"))) { + dharma_id = fval; + has_dharma_id = 1; + } + if (str_eq(fname, EL_STR("principal"))) { + principal = fval; + has_principal = 1; + } + if (str_eq(fname, EL_STR("network"))) { + network = fval; + has_network = 1; + } + if (str_eq(fname, EL_STR("engram"))) { + engram = fval; + has_engram = 1; + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(10, "stmt", EL_STR("CgiBlock"), "name", name, "dharma_id", dharma_id, "principal", principal, "network", network, "engram", engram, "has_dharma_id", has_dharma_id, "has_principal", has_principal, "has_network", has_network, "has_engram", has_engram), p); + } + if (str_eq(k, EL_STR("Service"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t sponsor = EL_STR(""); + el_val_t domain = EL_STR(""); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t fval = tok_value(tokens, p); + p = (p + 1); + if (str_eq(fname, EL_STR("sponsor"))) { + sponsor = fval; + } + if (str_eq(fname, EL_STR("domain"))) { + domain = fval; + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(4, "stmt", EL_STR("ServiceBlock"), "name", name, "sponsor", sponsor, "domain", domain), p); + } + el_val_t r = parse_expr(tokens, pos); + el_val_t val = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "stmt", EL_STR("Expr"), "value", val), p); + return 0; +} + +el_val_t parse(el_val_t tokens) { + el_val_t total = native_list_len(tokens); + el_val_t stmts = native_list_empty(); + el_val_t pos = 0; + el_val_t running = 1; + while (running) { + if (pos >= total) { + running = 0; + } else { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_stmt(tokens, pos); + el_val_t stmt = el_get_field(r, EL_STR("node")); + el_val_t new_pos = el_get_field(r, EL_STR("pos")); + stmts = native_list_append(stmts, stmt); + if (new_pos <= pos) { + pos = (pos + 1); + } else { + pos = new_pos; + } + } + } + } + return stmts; + return 0; +} + +el_val_t c_escape(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t total = native_list_len(chars); + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < total) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("\""))) { + out = el_str_concat(out, EL_STR("\\\"")); + } else { + if (str_eq(ch, EL_STR("\\"))) { + out = el_str_concat(out, EL_STR("\\\\")); + } else { + if (str_eq(ch, EL_STR("\n"))) { + out = el_str_concat(out, EL_STR("\\n")); + } else { + if (str_eq(ch, EL_STR("\r"))) { + out = el_str_concat(out, EL_STR("\\r")); + } else { + if (str_eq(ch, EL_STR("\t"))) { + out = el_str_concat(out, EL_STR("\\t")); + } else { + out = el_str_concat(out, ch); + } + } + } + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t c_str_lit(el_val_t s) { + return el_str_concat(el_str_concat(EL_STR("\""), c_escape(s)), EL_STR("\"")); + return 0; +} + +el_val_t el_type_to_c(el_val_t type_str) { + if (str_eq(type_str, EL_STR("String"))) { + return EL_STR("const char*"); + } + if (str_eq(type_str, EL_STR("Int"))) { + return EL_STR("int64_t"); + } + if (str_eq(type_str, EL_STR("Bool"))) { + return EL_STR("int"); + } + if (str_eq(type_str, EL_STR("Float"))) { + return EL_STR("double"); + } + if (str_eq(type_str, EL_STR("Void"))) { + return EL_STR("void"); + } + if (str_eq(type_str, EL_STR("void"))) { + return EL_STR("void"); + } + return EL_STR("void*"); + return 0; +} + +el_val_t emit_line(el_val_t line) { + println(line); + return 0; +} + +el_val_t emit_blank(void) { + println(EL_STR("")); + return 0; +} + +el_val_t binop_to_c(el_val_t op) { + if (str_eq(op, EL_STR("Plus"))) { + return EL_STR("+"); + } + if (str_eq(op, EL_STR("Minus"))) { + return EL_STR("-"); + } + if (str_eq(op, EL_STR("Star"))) { + return EL_STR("*"); + } + if (str_eq(op, EL_STR("Slash"))) { + return EL_STR("/"); + } + if (str_eq(op, EL_STR("EqEq"))) { + return EL_STR("=="); + } + if (str_eq(op, EL_STR("NotEq"))) { + return EL_STR("!="); + } + if (str_eq(op, EL_STR("Lt"))) { + return EL_STR("<"); + } + if (str_eq(op, EL_STR("Gt"))) { + return EL_STR(">"); + } + if (str_eq(op, EL_STR("LtEq"))) { + return EL_STR("<="); + } + if (str_eq(op, EL_STR("GtEq"))) { + return EL_STR(">="); + } + if (str_eq(op, EL_STR("And"))) { + return EL_STR("&&"); + } + if (str_eq(op, EL_STR("Or"))) { + return EL_STR("||"); + } + return op; + return 0; +} + +el_val_t cg_expr(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Int"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("Float"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("el_from_float("), v), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Str"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(v)), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Bool"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + if (str_eq(v, EL_STR("true"))) { + return EL_STR("1"); + } + return EL_STR("0"); + } + if (str_eq(kind, EL_STR("Nil"))) { + return EL_STR("EL_NULL"); + } + if (str_eq(kind, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return name; + } + if (str_eq(kind, EL_STR("Not"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = cg_expr(inner); + return el_str_concat(EL_STR("!"), inner_c); + } + if (str_eq(kind, EL_STR("Neg"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = cg_expr(inner); + return el_str_concat(el_str_concat(EL_STR("(-"), inner_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + el_val_t left = el_get_field(expr, EL_STR("left")); + el_val_t right = el_get_field(expr, EL_STR("right")); + el_val_t left_c = cg_expr(left); + el_val_t right_c = cg_expr(right); + el_val_t left_kind = el_get_field(left, EL_STR("expr")); + el_val_t right_kind = el_get_field(right, EL_STR("expr")); + if (str_eq(op, EL_STR("Plus"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (is_int_expr(left)) { + if (is_int_expr(right)) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + } + if (str_eq(left_kind, EL_STR("Int"))) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("BinOp"))) { + el_val_t left_op = el_get_field(left, EL_STR("op")); + if (str_eq(left_op, EL_STR("Plus"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(right_kind, EL_STR("BinOp"))) { + el_val_t right_op = el_get_field(right, EL_STR("op")); + if (str_eq(right_op, EL_STR("Plus"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("NotEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t arity = native_list_len(args); + el_val_t func_kind = el_get_field(func, EL_STR("expr")); + el_val_t args_c = EL_STR(""); + el_val_t i = 0; + while (i < arity) { + el_val_t arg = native_list_get(args, i); + el_val_t arg_c = cg_expr(arg); + if (i > 0) { + args_c = el_str_concat(args_c, EL_STR(", ")); + } + args_c = el_str_concat(args_c, arg_c); + i = (i + 1); + } + if (str_eq(func_kind, EL_STR("Ident"))) { + el_val_t fn_name = el_get_field(func, EL_STR("name")); + cap_check_call(fn_name); + arity_check_call(fn_name, arity); + return el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(func_kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(func, EL_STR("object")); + el_val_t field = el_get_field(func, EL_STR("field")); + el_val_t obj_c = cg_expr(obj); + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(", ")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(")")); + } + el_val_t fn_c = cg_expr(func); + return el_str_concat(el_str_concat(el_str_concat(fn_c, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t field = el_get_field(expr, EL_STR("field")); + el_val_t obj_c = cg_expr(obj); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", EL_STR(")), c_str_lit(field)), EL_STR("))")); + } + if (str_eq(kind, EL_STR("Index"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t idx = el_get_field(expr, EL_STR("index")); + el_val_t obj_c = cg_expr(obj); + el_val_t idx_c = cg_expr(idx); + el_val_t idx_kind = el_get_field(idx, EL_STR("expr")); + if (str_eq(idx_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_get("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + if (n == 0) { + return EL_STR("el_list_empty()"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t elem = native_list_get(elems, i); + el_val_t elem_c = cg_expr(elem); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(items, elem_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_new("), native_int_to_str(n)), EL_STR(", ")), items), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + if (n == 0) { + return EL_STR("el_map_new(0)"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t key = el_get_field(pair, EL_STR("key")); + el_val_t val = el_get_field(pair, EL_STR("value")); + el_val_t val_c = cg_expr(val); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(el_str_concat(el_str_concat(items, c_str_lit(key)), EL_STR(", ")), val_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_map_new("), native_int_to_str(n)), EL_STR(", ")), items), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + return cg_expr(inner); + } + if (str_eq(kind, EL_STR("If"))) { + return cg_if_expr(expr); + } + if (str_eq(kind, EL_STR("Match"))) { + return cg_match(expr); + } + return EL_STR("EL_NULL"); + return 0; +} + +el_val_t next_match_id(void) { + el_val_t csv = state_get(EL_STR("__match_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__match_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_match(el_val_t expr) { + el_val_t subject = el_get_field(expr, EL_STR("subject")); + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t subj_c = cg_expr(subject); + el_val_t id = next_match_id(); + el_val_t subj_var = el_str_concat(EL_STR("_match_subj_"), id); + el_val_t result_var = el_str_concat(EL_STR("_match_result_"), id); + el_val_t done_label = el_str_concat(EL_STR("_match_done_"), id); + el_val_t out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), subj_var), EL_STR(" = ")), subj_c), EL_STR("; el_val_t ")), result_var), EL_STR(" = 0; ")); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t pat = el_get_field(arm, EL_STR("pattern")); + el_val_t body = el_get_field(arm, EL_STR("body")); + el_val_t pkind = el_get_field(pat, EL_STR("pattern")); + el_val_t body_c = cg_expr(body); + if (str_eq(pkind, EL_STR("Wildcard"))) { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("Binding"))) { + el_val_t bname = el_get_field(pat, EL_STR("name")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ el_val_t ")), bname), EL_STR(" = ")), subj_var), EL_STR("; ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("LitInt"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" == ")), v), EL_STR(") { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("LitStr"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (str_eq(")), subj_var), EL_STR(", EL_STR(")), c_str_lit(v)), EL_STR("))) { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("LitBool"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t bv = EL_STR("0"); + if (str_eq(v, EL_STR("true"))) { + bv = EL_STR("1"); + } + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" == ")), bv), EL_STR(") { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } + } + } + } + } + i = (i + 1); + } + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, done_label), EL_STR(":; ")), result_var), EL_STR("; })")); + return out; + return 0; +} + +el_val_t next_if_id(void) { + el_val_t csv = state_get(EL_STR("__if_expr_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__if_expr_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var) { + el_val_t n = native_list_len(stmts); + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t s = native_list_get(stmts, i); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + el_val_t is_last = 0; + if (str_eq(i, (n - 1))) { + is_last = 1; + } + if (str_eq(sk, EL_STR("Let"))) { + el_val_t name = el_get_field(s, EL_STR("name")); + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("el_val_t ")), name), EL_STR(" = ")), val_c), EL_STR("; ")); + } else { + if (str_eq(sk, EL_STR("Return"))) { + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, result_var), EL_STR(" = (")), val_c), EL_STR("); ")); + } else { + if (str_eq(sk, EL_STR("Expr"))) { + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + if (is_last) { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, result_var), EL_STR(" = (")), val_c), EL_STR("); ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("(void)(")), val_c), EL_STR("); ")); + } + } else { + } + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t cg_if_expr(el_val_t expr) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = cg_expr(cond); + el_val_t id = next_if_id(); + el_val_t result_var = el_str_concat(EL_STR("_if_result_"), id); + el_val_t then_c = cg_if_expr_arm(then_stmts, result_var); + el_val_t else_c = EL_STR(""); + if (has_else) { + else_c = cg_if_expr_arm(else_stmts, result_var); + } + el_val_t out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), result_var), EL_STR(" = 0; if (")), cond_c), EL_STR(") { ")), then_c), EL_STR("} else { ")), else_c), EL_STR("} ")), result_var), EL_STR("; })")); + return out; + return 0; +} + +el_val_t list_contains(el_val_t lst, el_val_t s) { + el_val_t n = native_list_len(lst); + el_val_t i = 0; + while (i < n) { + el_val_t item = native_list_get(lst, i); + if (str_eq(item, s)) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = cg_expr(val); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + add_int_name(name); + } + if (list_contains(declared, name)) { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("el_val_t ")), name), EL_STR(" = ")), val_c), EL_STR(";"))); + return native_list_append(declared, name); + } + } + if (str_eq(kind, EL_STR("Return"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("Nil"))) { + emit_line(el_str_concat(indent, EL_STR("return 0;"))); + } else { + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("return ")), val_c), EL_STR(";"))); + } + return declared; + } + if (str_eq(kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + cg_if_stmt(val, indent, declared); + return declared; + } + if (str_eq(val_kind, EL_STR("For"))) { + cg_for_stmt(val, indent, declared); + return declared; + } + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(indent, val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("While"))) { + el_val_t cond = el_get_field(stmt, EL_STR("cond")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t cond_c = cg_expr(cond); + cond_c = strip_outer_parens(cond_c); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("while (")), cond_c), EL_STR(") {"))); + cg_stmts(body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("For"))) { + el_val_t item = el_get_field(stmt, EL_STR("item")); + el_val_t list_expr = el_get_field(stmt, EL_STR("list")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + cg_for_body(item, list_expr, body, indent, declared); + return declared; + } + if (str_eq(kind, EL_STR("FnDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("TypeDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Import"))) { + return declared; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return declared; + } + return declared; + return 0; +} + +el_val_t strip_outer_parens(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t n = native_list_len(chars); + if (n < 2) { + return s; + } + el_val_t first = native_list_get(chars, 0); + el_val_t last = native_list_get(chars, (n - 1)); + if (str_eq(first, EL_STR("("))) { + if (str_eq(last, EL_STR(")"))) { + el_val_t depth = 1; + el_val_t i = 1; + el_val_t balanced = 1; + while (i < (n - 1)) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("("))) { + depth = (depth + 1); + } + if (str_eq(ch, EL_STR(")"))) { + depth = (depth - 1); + if (depth == 0) { + balanced = 0; + i = n; + } + } + i = (i + 1); + } + if (balanced) { + el_val_t inner = EL_STR(""); + el_val_t j = 1; + while (j < (n - 1)) { + el_val_t ch = native_list_get(chars, j); + inner = el_str_concat(inner, ch); + j = (j + 1); + } + return inner; + } + } + } + return s; + return 0; +} + +el_val_t cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = cg_expr(cond); + cond_c = strip_outer_parens(cond_c); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("if (")), cond_c), EL_STR(") {"))); + cg_stmts(then_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + if (has_else) { + emit_line(el_str_concat(indent, EL_STR("} else {"))); + cg_stmts(else_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + } + emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared) { + el_val_t list_c = cg_expr(list_expr); + el_val_t idx = EL_STR("_el_i"); + el_val_t list_tmp = EL_STR("_el_lst"); + el_val_t len_tmp = EL_STR("_el_len"); + emit_line(el_str_concat(indent, EL_STR("{"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), list_tmp), EL_STR(" = ")), list_c), EL_STR(";"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), len_tmp), EL_STR(" = el_list_len(")), list_tmp), EL_STR(");"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" for (el_val_t ")), idx), EL_STR(" = 0; ")), idx), EL_STR(" < ")), len_tmp), EL_STR("; ")), idx), EL_STR("++) {"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), item), EL_STR(" = el_list_get(")), list_tmp), EL_STR(", ")), idx), EL_STR(");"))); + el_val_t body_decl = native_list_clone(declared); + body_decl = native_list_append(body_decl, item); + cg_stmts(body, el_str_concat(indent, EL_STR(" ")), body_decl); + emit_line(el_str_concat(indent, EL_STR(" }"))); + emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t item = el_get_field(expr, EL_STR("item")); + el_val_t list_expr = el_get_field(expr, EL_STR("list")); + el_val_t body = el_get_field(expr, EL_STR("body")); + cg_for_body(item, list_expr, body, indent, declared); + return 0; +} + +el_val_t cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + el_val_t decl = declared; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + decl = cg_stmt(stmt, indent, decl); + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t param_decl(el_val_t param, el_val_t idx) { + el_val_t name = el_get_field(param, EL_STR("name")); + return el_str_concat(EL_STR("el_val_t "), name); + return 0; +} + +el_val_t params_to_c(el_val_t params) { + el_val_t n = native_list_len(params); + if (n == 0) { + return EL_STR("void"); + } + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t param = native_list_get(params, i); + el_val_t decl = param_decl(param, i); + if (i > 0) { + out = el_str_concat(out, EL_STR(", ")); + } + out = el_str_concat(out, decl); + i = (i + 1); + } + return out; + return 0; +} + +el_val_t transform_implicit_return(el_val_t body) { + el_val_t n = native_list_len(body); + if (n == 0) { + return body; + } + el_val_t last = native_list_get(body, (n - 1)); + el_val_t last_kind = el_get_field(last, EL_STR("stmt")); + if (str_eq(last_kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(last, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + return body; + } + if (str_eq(val_kind, EL_STR("For"))) { + return body; + } + el_val_t new_body = native_list_empty(); + el_val_t i = 0; + while (i < (n - 1)) { + new_body = native_list_append(new_body, native_list_get(body, i)); + i = (i + 1); + } + el_val_t return_stmt = el_map_new(2, "stmt", EL_STR("Return"), "value", val); + new_body = native_list_append(new_body, return_stmt); + return new_body; + } + return body; + return 0; +} + +el_val_t is_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_int_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 1; + } + if (str_eq(name, EL_STR("json_array_len"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_node_count"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_edge_count"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("time_diff"))) { + return 1; + } + if (str_eq(name, EL_STR("time_add"))) { + return 1; + } + if (str_eq(name, EL_STR("time_from_parts"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 1; + } + if (str_eq(name, EL_STR("el_min"))) { + return 1; + } + if (str_eq(name, EL_STR("float_to_int"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_int_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Int"))) { + return 1; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return is_int_name(name); + } + if (str_eq(k, EL_STR("Call"))) { + return is_int_call(expr); + } + if (str_eq(k, EL_STR("Neg"))) { + return is_int_expr(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(k, EL_STR("Not"))) { + return 1; + } + if (str_eq(k, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + if (str_eq(op, EL_STR("EqEq"))) { + return 1; + } + if (str_eq(op, EL_STR("NotEq"))) { + return 1; + } + if (str_eq(op, EL_STR("Lt"))) { + return 1; + } + if (str_eq(op, EL_STR("Gt"))) { + return 1; + } + if (str_eq(op, EL_STR("LtEq"))) { + return 1; + } + if (str_eq(op, EL_STR("GtEq"))) { + return 1; + } + if (str_eq(op, EL_STR("And"))) { + return 1; + } + if (str_eq(op, EL_STR("Or"))) { + return 1; + } + if (str_eq(op, EL_STR("Plus"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Minus"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Star"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Slash"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + return 0; + } + return 0; + return 0; +} + +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(kind, EL_STR(":")), fn_name); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__cap_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t is_self_formation_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_dharma_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("dharma_connect"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_send"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_activate"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_strengthen"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_relationship"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_peers"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_llm_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_system"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_vision"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_models"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t cap_check_call(el_val_t fn_name) { + el_val_t kind = state_get(EL_STR("__program_kind")); + if (str_eq(kind, EL_STR("cgi"))) { + return 1; + } + if (str_eq(kind, EL_STR("service"))) { + if (is_self_formation_call(fn_name)) { + cap_record_violation(EL_STR("service"), fn_name); + return 0; + } + return 1; + } + if (is_dharma_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + if (is_llm_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + return 1; + return 0; +} + +el_val_t emit_cap_violations(void) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t colon = str_index_of(entry, EL_STR(":")); + if (colon > 0) { + el_val_t kind = str_slice(entry, 0, colon); + el_val_t fn_name = str_slice(entry, (colon + 1), str_len(entry)); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("#error \"capability violation: '"), kind), EL_STR("' programs may not call '")), fn_name), EL_STR("' (self-formation primitive — only 'cgi' programs may use it)\""))); + } + i = ((i + next_comma) + 1); + } + return 0; +} + +el_val_t builtin_arity(el_val_t name) { + if (str_eq(name, EL_STR("println"))) { + return 1; + } + if (str_eq(name, EL_STR("print"))) { + return 1; + } + if (str_eq(name, EL_STR("readline"))) { + return 0; + } + if (str_eq(name, EL_STR("el_str_concat"))) { + return 2; + } + if (str_eq(name, EL_STR("str_eq"))) { + return 2; + } + if (str_eq(name, EL_STR("str_starts_with"))) { + return 2; + } + if (str_eq(name, EL_STR("str_ends_with"))) { + return 2; + } + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_concat"))) { + return 2; + } + if (str_eq(name, EL_STR("int_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_slice"))) { + return 3; + } + if (str_eq(name, EL_STR("str_contains"))) { + return 2; + } + if (str_eq(name, EL_STR("str_replace"))) { + return 3; + } + if (str_eq(name, EL_STR("str_to_upper"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_lower"))) { + return 1; + } + if (str_eq(name, EL_STR("str_trim"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 2; + } + if (str_eq(name, EL_STR("str_split"))) { + return 2; + } + if (str_eq(name, EL_STR("str_char_at"))) { + return 2; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 2; + } + if (str_eq(name, EL_STR("str_pad_left"))) { + return 3; + } + if (str_eq(name, EL_STR("str_pad_right"))) { + return 3; + } + if (str_eq(name, EL_STR("str_format"))) { + return 2; + } + if (str_eq(name, EL_STR("str_lower"))) { + return 1; + } + if (str_eq(name, EL_STR("str_upper"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 2; + } + if (str_eq(name, EL_STR("el_min"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_get"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_append"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_empty"))) { + return 0; + } + if (str_eq(name, EL_STR("el_list_clone"))) { + return 1; + } + if (str_eq(name, EL_STR("list_push"))) { + return 2; + } + if (str_eq(name, EL_STR("list_push_front"))) { + return 2; + } + if (str_eq(name, EL_STR("list_join"))) { + return 2; + } + if (str_eq(name, EL_STR("list_range"))) { + return 2; + } + if (str_eq(name, EL_STR("el_get_field"))) { + return 2; + } + if (str_eq(name, EL_STR("el_map_get"))) { + return 2; + } + if (str_eq(name, EL_STR("el_map_set"))) { + return 3; + } + if (str_eq(name, EL_STR("http_get"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post"))) { + return 2; + } + if (str_eq(name, EL_STR("http_post_json"))) { + return 2; + } + if (str_eq(name, EL_STR("http_get_with_headers"))) { + return 2; + } + if (str_eq(name, EL_STR("http_post_with_headers"))) { + return 3; + } + if (str_eq(name, EL_STR("http_post_form_auth"))) { + return 3; + } + if (str_eq(name, EL_STR("http_get_to_file"))) { + return 3; + } + if (str_eq(name, EL_STR("http_post_to_file"))) { + return 4; + } + if (str_eq(name, EL_STR("http_serve"))) { + return 2; + } + if (str_eq(name, EL_STR("http_set_handler"))) { + return 1; + } + if (str_eq(name, EL_STR("fs_read"))) { + return 1; + } + if (str_eq(name, EL_STR("fs_write"))) { + return 2; + } + if (str_eq(name, EL_STR("fs_write_bytes"))) { + return 3; + } + if (str_eq(name, EL_STR("fs_list"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get"))) { + return 2; + } + if (str_eq(name, EL_STR("json_parse"))) { + return 1; + } + if (str_eq(name, EL_STR("json_stringify"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_string"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_float"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_bool"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_raw"))) { + return 2; + } + if (str_eq(name, EL_STR("json_set"))) { + return 3; + } + if (str_eq(name, EL_STR("json_array_len"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 0; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 0; + } + if (str_eq(name, EL_STR("sleep_secs"))) { + return 1; + } + if (str_eq(name, EL_STR("sleep_ms"))) { + return 1; + } + if (str_eq(name, EL_STR("time_format"))) { + return 2; + } + if (str_eq(name, EL_STR("time_to_parts"))) { + return 1; + } + if (str_eq(name, EL_STR("time_from_parts"))) { + return 3; + } + if (str_eq(name, EL_STR("time_add"))) { + return 3; + } + if (str_eq(name, EL_STR("time_diff"))) { + return 3; + } + if (str_eq(name, EL_STR("uuid_new"))) { + return 0; + } + if (str_eq(name, EL_STR("uuid_v4"))) { + return 0; + } + if (str_eq(name, EL_STR("env"))) { + return 1; + } + if (str_eq(name, EL_STR("state_set"))) { + return 2; + } + if (str_eq(name, EL_STR("state_get"))) { + return 1; + } + if (str_eq(name, EL_STR("state_del"))) { + return 1; + } + if (str_eq(name, EL_STR("state_keys"))) { + return 0; + } + if (str_eq(name, EL_STR("float_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("int_to_float"))) { + return 1; + } + if (str_eq(name, EL_STR("float_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("format_float"))) { + return 2; + } + if (str_eq(name, EL_STR("decimal_round"))) { + return 2; + } + if (str_eq(name, EL_STR("str_to_float"))) { + return 1; + } + if (str_eq(name, EL_STR("math_sqrt"))) { + return 1; + } + if (str_eq(name, EL_STR("math_log"))) { + return 1; + } + if (str_eq(name, EL_STR("math_ln"))) { + return 1; + } + if (str_eq(name, EL_STR("math_sin"))) { + return 1; + } + if (str_eq(name, EL_STR("math_cos"))) { + return 1; + } + if (str_eq(name, EL_STR("math_pi"))) { + return 0; + } + if (str_eq(name, EL_STR("bool_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("exit_program"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_connect"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_send"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_activate"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_emit"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_field"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_strengthen"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_relationship"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_peers"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_node"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_node_full"))) { + return 8; + } + if (str_eq(name, EL_STR("engram_get_node"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_strengthen"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_forget"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_node_count"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_search"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_scan_nodes"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_connect"))) { + return 4; + } + if (str_eq(name, EL_STR("engram_edge_between"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_neighbors"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_neighbors_filtered"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_edge_count"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_activate"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_save"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_load"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_get_node_json"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_search_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_scan_nodes_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_neighbors_json"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_activate_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_stats_json"))) { + return 0; + } + if (str_eq(name, EL_STR("llm_call"))) { + return 2; + } + if (str_eq(name, EL_STR("llm_call_system"))) { + return 3; + } + if (str_eq(name, EL_STR("llm_call_agentic"))) { + return 4; + } + if (str_eq(name, EL_STR("llm_vision"))) { + return 4; + } + if (str_eq(name, EL_STR("llm_models"))) { + return 0; + } + if (str_eq(name, EL_STR("llm_register_tool"))) { + return 2; + } + if (str_eq(name, EL_STR("sha256_hex"))) { + return 1; + } + if (str_eq(name, EL_STR("sha256_bytes"))) { + return 1; + } + if (str_eq(name, EL_STR("hmac_sha256_hex"))) { + return 2; + } + if (str_eq(name, EL_STR("hmac_sha256_bytes"))) { + return 2; + } + if (str_eq(name, EL_STR("base64_encode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64_decode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64url_encode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64url_decode"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_get"))) { + return 2; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_append"))) { + return 2; + } + if (str_eq(name, EL_STR("native_list_empty"))) { + return 0; + } + if (str_eq(name, EL_STR("native_list_clone"))) { + return 1; + } + if (str_eq(name, EL_STR("native_string_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("native_int_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("append"))) { + return 2; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("get"))) { + return 2; + } + if (str_eq(name, EL_STR("map_get"))) { + return 2; + } + if (str_eq(name, EL_STR("map_set"))) { + return 3; + } + return (-1); + return 0; +} + +el_val_t arity_record_violation(el_val_t fn_name, el_val_t expected, el_val_t actual) { + el_val_t csv = state_get(EL_STR("__arity_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("|")), native_int_to_str(expected)), EL_STR("|")), native_int_to_str(actual)); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__arity_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t arity_check_call(el_val_t fn_name, el_val_t actual) { + el_val_t expected = builtin_arity(fn_name); + if (expected < 0) { + return 1; + } + if (expected == actual) { + return 1; + } + arity_record_violation(fn_name, expected, actual); + return 1; + return 0; +} + +el_val_t emit_arity_violations(void) { + el_val_t csv = state_get(EL_STR("__arity_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t p1 = str_index_of(entry, EL_STR("|")); + if (p1 > 0) { + el_val_t fn_name = str_slice(entry, 0, p1); + el_val_t rest = str_slice(entry, (p1 + 1), str_len(entry)); + el_val_t p2 = str_index_of(rest, EL_STR("|")); + if (p2 > 0) { + el_val_t exp_s = str_slice(rest, 0, p2); + el_val_t act_s = str_slice(rest, (p2 + 1), str_len(rest)); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("#error \"arity error: '"), fn_name), EL_STR("' takes ")), exp_s), EL_STR(" arguments, but called with ")), act_s), EL_STR("\""))); + } + } + i = ((i + next_comma) + 1); + } + return 0; +} + +el_val_t add_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__int_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t build_int_names_for_params(el_val_t params) { + state_set(EL_STR("__int_names"), EL_STR(",")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR("Int"))) { + add_int_name(pname); + } + pi = (pi + 1); + } + return 1; + return 0; +} + +el_val_t cg_fn(el_val_t stmt) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + return 0; + } + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); + el_val_t params_c = params_to_c(params); + el_val_t decorator = el_get_field(stmt, EL_STR("decorator")); + if (vbd_has_restricted_call(body)) { + if (!str_eq(decorator, EL_STR("manager"))) { + emit_line(el_str_concat(el_str_concat(EL_STR("#error \"VBD violation: dharma_emit/dharma_field called from non-@manager fn '"), fn_name), EL_STR("'\""))); + } + } + build_int_names_for_params(params); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(") {"))); + el_val_t decl = native_list_empty(); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + decl = native_list_append(decl, pname); + pi = (pi + 1); + } + el_val_t body_xformed = body; + if (!str_eq(ret_type, EL_STR("Void"))) { + body_xformed = transform_implicit_return(body); + } + cg_stmts(body_xformed, EL_STR(" "), decl); + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + return 0; +} + +el_val_t is_fndef(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_top_level_decl(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("TypeDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("Import"))) { + return 1; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t cgi_arg(el_val_t value, el_val_t has_value) { + if (has_value) { + return el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(value)), EL_STR(")")); + } + return EL_STR("EL_NULL"); + return 0; +} + +el_val_t vbd_is_restricted_name(el_val_t name) { + if (str_eq(name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_field"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t vbd_expr_has_restricted_call(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (str_eq(fk, EL_STR("Ident"))) { + el_val_t fname = el_get_field(func, EL_STR("name")); + if (vbd_is_restricted_name(fname)) { + return 1; + } + } + if (vbd_expr_has_restricted_call(func)) { + return 1; + } + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t an = native_list_len(args); + el_val_t ai = 0; + while (ai < an) { + el_val_t a = native_list_get(args, ai); + if (vbd_expr_has_restricted_call(a)) { + return 1; + } + ai = (ai + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t l = el_get_field(expr, EL_STR("left")); + el_val_t r = el_get_field(expr, EL_STR("right")); + if (vbd_expr_has_restricted_call(l)) { + return 1; + } + if (vbd_expr_has_restricted_call(r)) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Not"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Neg"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Field"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("object"))); + } + if (str_eq(kind, EL_STR("Index"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("object")))) { + return 1; + } + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("index")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Try"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + el_val_t i = 0; + while (i < n) { + el_val_t e = native_list_get(elems, i); + if (vbd_expr_has_restricted_call(e)) { + return 1; + } + i = (i + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t v = el_get_field(pair, EL_STR("value")); + if (vbd_expr_has_restricted_call(v)) { + return 1; + } + i = (i + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("If"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("cond")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("then")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("else")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("For"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("list")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("body")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Match"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("subject")))) { + return 1; + } + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t body = el_get_field(arm, EL_STR("body")); + if (vbd_expr_has_restricted_call(body)) { + return 1; + } + i = (i + 1); + } + return 0; + } + return 0; + return 0; +} + +el_val_t vbd_has_restricted_call(el_val_t stmts) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t s = native_list_get(stmts, i); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + if (str_eq(sk, EL_STR("Let"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("Return"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("Expr"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("While"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("cond")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(s, EL_STR("body")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("For"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("list")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(s, EL_STR("body")))) { + return 1; + } + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t codegen(el_val_t stmts, el_val_t source) { + el_val_t n_top = native_list_len(stmts); + el_val_t cgi_count = 0; + el_val_t cgi_block = el_map_new(1, "stmt", EL_STR("None")); + el_val_t svc_count = 0; + el_val_t svc_block = el_map_new(1, "stmt", EL_STR("None")); + el_val_t ti = 0; + while (ti < n_top) { + el_val_t s = native_list_get(stmts, ti); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + if (str_eq(sk, EL_STR("CgiBlock"))) { + cgi_count = (cgi_count + 1); + if (cgi_count == 1) { + cgi_block = s; + } + } + if (str_eq(sk, EL_STR("ServiceBlock"))) { + svc_count = (svc_count + 1); + if (svc_count == 1) { + svc_block = s; + } + } + ti = (ti + 1); + } + if (cgi_count > 1) { + emit_line(EL_STR("#error \"El: multiple cgi blocks in program (only one allowed)\"")); + } + if (svc_count > 1) { + emit_line(EL_STR("#error \"El: multiple service blocks in program (only one allowed)\"")); + } + if (cgi_count >= 1) { + if (svc_count >= 1) { + emit_line(EL_STR("#error \"El: program declares both cgi and service blocks (mutually exclusive — pick one)\"")); + } + } + el_val_t kind = EL_STR("utility"); + if (cgi_count >= 1) { + kind = EL_STR("cgi"); + } + if (svc_count >= 1) { + kind = EL_STR("service"); + } + state_set(EL_STR("__program_kind"), kind); + state_set(EL_STR("__cap_violations"), EL_STR("")); + state_set(EL_STR("__arity_violations"), EL_STR("")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include \"el_runtime.h\"")); + emit_blank(); + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (!str_eq(fn_name, EL_STR("main"))) { + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t params_c = params_to_c(params); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(");"))); + } + } + i = (i + 1); + } + emit_blank(); + el_val_t has_toplevel_lets = 0; + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + add_int_name(name); + } + emit_line(el_str_concat(el_str_concat(EL_STR("el_val_t "), name), EL_STR(";"))); + has_toplevel_lets = 1; + } + i = (i + 1); + } + if (has_toplevel_lets) { + emit_blank(); + } + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + cg_fn(stmt); + } + i = (i + 1); + } + emit_line(EL_STR("int main(int argc, char** argv) {")); + emit_line(EL_STR(" el_runtime_init_args(argc, argv);")); + if (cgi_count >= 1) { + el_val_t cname = el_get_field(cgi_block, EL_STR("name")); + el_val_t cdid = el_get_field(cgi_block, EL_STR("dharma_id")); + el_val_t cprin = el_get_field(cgi_block, EL_STR("principal")); + el_val_t cnet = el_get_field(cgi_block, EL_STR("network")); + el_val_t ceng = el_get_field(cgi_block, EL_STR("engram")); + el_val_t has_did = el_get_field(cgi_block, EL_STR("has_dharma_id")); + el_val_t has_prin = el_get_field(cgi_block, EL_STR("has_principal")); + el_val_t has_net = el_get_field(cgi_block, EL_STR("has_network")); + el_val_t has_eng = el_get_field(cgi_block, EL_STR("has_engram")); + el_val_t arg_name = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(cname)), EL_STR(")")); + el_val_t arg_did = cgi_arg(cdid, has_did); + el_val_t arg_prin = cgi_arg(cprin, has_prin); + el_val_t arg_net = cgi_arg(cnet, has_net); + el_val_t arg_eng = cgi_arg(ceng, has_eng); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" el_cgi_init("), arg_name), EL_STR(", ")), arg_did), EL_STR(", ")), arg_prin), EL_STR(", ")), arg_net), EL_STR(", ")), arg_eng), EL_STR(");"))); + } + el_val_t main_decl = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + main_decl = native_list_append(main_decl, name); + } + i = (i + 1); + } + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + } else { + if (is_top_level_decl(stmt)) { + } else { + main_decl = cg_stmt(stmt, EL_STR(" "), main_decl); + } + } + i = (i + 1); + } + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + emit_cap_violations(); + emit_arity_violations(); + return EL_STR(""); + return 0; +} + +el_val_t js_escape(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t total = native_list_len(chars); + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < total) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("\""))) { + out = el_str_concat(out, EL_STR("\\\"")); + } else { + if (str_eq(ch, EL_STR("\\"))) { + out = el_str_concat(out, EL_STR("\\\\")); + } else { + if (str_eq(ch, EL_STR("\n"))) { + out = el_str_concat(out, EL_STR("\\n")); + } else { + if (str_eq(ch, EL_STR("\r"))) { + out = el_str_concat(out, EL_STR("\\r")); + } else { + if (str_eq(ch, EL_STR("\t"))) { + out = el_str_concat(out, EL_STR("\\t")); + } else { + out = el_str_concat(out, ch); + } + } + } + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_str_lit(el_val_t s) { + return el_str_concat(el_str_concat(EL_STR("\""), js_escape(s)), EL_STR("\"")); + return 0; +} + +el_val_t js_emit_line(el_val_t line) { + println(line); + return 0; +} + +el_val_t js_emit_blank(void) { + println(EL_STR("")); + return 0; +} + +el_val_t js_binop(el_val_t op) { + if (str_eq(op, EL_STR("Plus"))) { + return EL_STR("+"); + } + if (str_eq(op, EL_STR("Minus"))) { + return EL_STR("-"); + } + if (str_eq(op, EL_STR("Star"))) { + return EL_STR("*"); + } + if (str_eq(op, EL_STR("Slash"))) { + return EL_STR("/"); + } + if (str_eq(op, EL_STR("Percent"))) { + return EL_STR("%"); + } + if (str_eq(op, EL_STR("EqEq"))) { + return EL_STR("==="); + } + if (str_eq(op, EL_STR("NotEq"))) { + return EL_STR("!=="); + } + if (str_eq(op, EL_STR("Lt"))) { + return EL_STR("<"); + } + if (str_eq(op, EL_STR("Gt"))) { + return EL_STR(">"); + } + if (str_eq(op, EL_STR("LtEq"))) { + return EL_STR("<="); + } + if (str_eq(op, EL_STR("GtEq"))) { + return EL_STR(">="); + } + if (str_eq(op, EL_STR("And"))) { + return EL_STR("&&"); + } + if (str_eq(op, EL_STR("Or"))) { + return EL_STR("||"); + } + return op; + return 0; +} + +el_val_t js_is_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_int_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t js_add_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_int_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__js_int_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t js_build_int_names_for_params(el_val_t params) { + state_set(EL_STR("__js_int_names"), EL_STR(",")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR("Int"))) { + js_add_int_name(pname); + } + pi = (pi + 1); + } + return 1; + return 0; +} + +el_val_t js_is_int_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 1; + } + if (str_eq(name, EL_STR("el_min"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_cg_expr(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Int"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("Float"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("Str"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return js_str_lit(v); + } + if (str_eq(kind, EL_STR("Bool"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + if (str_eq(v, EL_STR("true"))) { + return EL_STR("true"); + } + return EL_STR("false"); + } + if (str_eq(kind, EL_STR("Nil"))) { + return EL_STR("null"); + } + if (str_eq(kind, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return name; + } + if (str_eq(kind, EL_STR("Not"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(EL_STR("!"), inner_c); + } + if (str_eq(kind, EL_STR("Neg"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(el_str_concat(EL_STR("(-"), inner_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + el_val_t left = el_get_field(expr, EL_STR("left")); + el_val_t right = el_get_field(expr, EL_STR("right")); + el_val_t left_c = js_cg_expr(left); + el_val_t right_c = js_cg_expr(right); + el_val_t left_kind = el_get_field(left, EL_STR("expr")); + el_val_t right_kind = el_get_field(right, EL_STR("expr")); + if (str_eq(op, EL_STR("Plus"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Call"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_call(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(right_kind, EL_STR("Ident"))) { + if (str_eq(left_kind, EL_STR("Call"))) { + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(rname)) { + if (js_is_int_call(left)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Call"))) { + if (str_eq(right_kind, EL_STR("Call"))) { + if (js_is_int_call(left)) { + if (js_is_int_call(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(op, EL_STR("NotEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + el_val_t op_c = js_binop(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t arity = native_list_len(args); + el_val_t func_kind = el_get_field(func, EL_STR("expr")); + el_val_t args_c = EL_STR(""); + el_val_t i = 0; + while (i < arity) { + el_val_t arg = native_list_get(args, i); + el_val_t arg_c = js_cg_expr(arg); + if (i > 0) { + args_c = el_str_concat(args_c, EL_STR(", ")); + } + args_c = el_str_concat(args_c, arg_c); + i = (i + 1); + } + if (str_eq(func_kind, EL_STR("Ident"))) { + el_val_t fn_name = el_get_field(func, EL_STR("name")); + return el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(func_kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(func, EL_STR("object")); + el_val_t field = el_get_field(func, EL_STR("field")); + el_val_t obj_c = js_cg_expr(obj); + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(", ")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(")")); + } + el_val_t fn_c = js_cg_expr(func); + return el_str_concat(el_str_concat(el_str_concat(fn_c, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t field = el_get_field(expr, EL_STR("field")); + el_val_t obj_c = js_cg_expr(obj); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), js_str_lit(field)), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Index"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t idx = el_get_field(expr, EL_STR("index")); + el_val_t obj_c = js_cg_expr(obj); + el_val_t idx_c = js_cg_expr(idx); + el_val_t idx_kind = el_get_field(idx, EL_STR("expr")); + if (str_eq(idx_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_get("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + if (n == 0) { + return EL_STR("[]"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t elem = native_list_get(elems, i); + el_val_t elem_c = js_cg_expr(elem); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(items, elem_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(EL_STR("["), items), EL_STR("]")); + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + if (n == 0) { + return EL_STR("{}"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t key = el_get_field(pair, EL_STR("key")); + el_val_t val = el_get_field(pair, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(el_str_concat(el_str_concat(items, js_str_lit(key)), EL_STR(": ")), val_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(EL_STR("{"), items), EL_STR("}")); + } + if (str_eq(kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + return js_cg_expr(inner); + } + if (str_eq(kind, EL_STR("If"))) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t cond_c = js_cg_expr(cond); + return el_str_concat(el_str_concat(EL_STR("("), cond_c), EL_STR(" ? 1 : 0)")); + } + if (str_eq(kind, EL_STR("Match"))) { + return js_cg_match(expr); + } + return EL_STR("null"); + return 0; +} + +el_val_t js_next_match_id(void) { + el_val_t csv = state_get(EL_STR("__js_match_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__js_match_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t js_cg_match(el_val_t expr) { + el_val_t subject = el_get_field(expr, EL_STR("subject")); + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t subj_c = js_cg_expr(subject); + el_val_t id = js_next_match_id(); + el_val_t subj_var = el_str_concat(EL_STR("_match_subj_"), id); + el_val_t out = el_str_concat(el_str_concat(EL_STR("(("), subj_var), EL_STR(") => { ")); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t pat = el_get_field(arm, EL_STR("pattern")); + el_val_t body = el_get_field(arm, EL_STR("body")); + el_val_t pkind = el_get_field(pat, EL_STR("pattern")); + el_val_t body_c = js_cg_expr(body); + if (str_eq(pkind, EL_STR("Wildcard"))) { + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("return (")), body_c), EL_STR("); ")); + } else { + if (str_eq(pkind, EL_STR("Binding"))) { + el_val_t bname = el_get_field(pat, EL_STR("name")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ const ")), bname), EL_STR(" = ")), subj_var), EL_STR("; return (")), body_c), EL_STR("); } ")); + } else { + if (str_eq(pkind, EL_STR("LitInt"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" === ")), v), EL_STR(") return (")), body_c), EL_STR("); ")); + } else { + if (str_eq(pkind, EL_STR("LitStr"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (str_eq(")), subj_var), EL_STR(", ")), js_str_lit(v)), EL_STR(")) return (")), body_c), EL_STR("); ")); + } else { + if (str_eq(pkind, EL_STR("LitBool"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t bv = EL_STR("false"); + if (str_eq(v, EL_STR("true"))) { + bv = EL_STR("true"); + } + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" === ")), bv), EL_STR(") return (")), body_c), EL_STR("); ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("return (")), body_c), EL_STR("); ")); + } + } + } + } + } + i = (i + 1); + } + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("return null; })(")), subj_c), EL_STR(")")); + return out; + return 0; +} + +el_val_t js_list_contains(el_val_t lst, el_val_t s) { + el_val_t n = native_list_len(lst); + el_val_t i = 0; + while (i < n) { + el_val_t item = native_list_get(lst, i); + if (str_eq(item, s)) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + js_add_int_name(name); + } + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + js_add_int_name(name); + } + if (js_list_contains(declared, name)) { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("let ")), name), EL_STR(" = ")), val_c), EL_STR(";"))); + return native_list_append(declared, name); + } + } + if (str_eq(kind, EL_STR("Return"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("Nil"))) { + js_emit_line(el_str_concat(indent, EL_STR("return null;"))); + } else { + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("return ")), val_c), EL_STR(";"))); + } + return declared; + } + if (str_eq(kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + js_cg_if_stmt(val, indent, declared); + return declared; + } + if (str_eq(val_kind, EL_STR("For"))) { + js_cg_for_stmt(val, indent, declared); + return declared; + } + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(indent, val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("While"))) { + el_val_t cond = el_get_field(stmt, EL_STR("cond")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t cond_c = js_cg_expr(cond); + cond_c = js_strip_outer_parens(cond_c); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("while (")), cond_c), EL_STR(") {"))); + js_cg_stmts(body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("For"))) { + el_val_t item = el_get_field(stmt, EL_STR("item")); + el_val_t list_expr = el_get_field(stmt, EL_STR("list")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + js_cg_for_body(item, list_expr, body, indent, declared); + return declared; + } + if (str_eq(kind, EL_STR("FnDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("TypeDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Import"))) { + return declared; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + el_val_t cname = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// cgi block '")), cname), EL_STR("' — no-op in JS target (server-side concept)"))); + return declared; + } + if (str_eq(kind, EL_STR("ServiceBlock"))) { + el_val_t sname = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// service block '")), sname), EL_STR("' — no-op in JS target"))); + return declared; + } + return declared; + return 0; +} + +el_val_t js_strip_outer_parens(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t n = native_list_len(chars); + if (n < 2) { + return s; + } + el_val_t first = native_list_get(chars, 0); + el_val_t last = native_list_get(chars, (n - 1)); + if (str_eq(first, EL_STR("("))) { + if (str_eq(last, EL_STR(")"))) { + el_val_t depth = 1; + el_val_t i = 1; + el_val_t balanced = 1; + while (i < (n - 1)) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("("))) { + depth = (depth + 1); + } + if (str_eq(ch, EL_STR(")"))) { + depth = (depth - 1); + if (depth == 0) { + balanced = 0; + i = n; + } + } + i = (i + 1); + } + if (balanced) { + el_val_t inner = EL_STR(""); + el_val_t j = 1; + while (j < (n - 1)) { + el_val_t ch = native_list_get(chars, j); + inner = el_str_concat(inner, ch); + j = (j + 1); + } + return inner; + } + } + } + return s; + return 0; +} + +el_val_t js_cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = js_cg_expr(cond); + cond_c = js_strip_outer_parens(cond_c); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("if (")), cond_c), EL_STR(") {"))); + js_cg_stmts(then_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + if (has_else) { + js_emit_line(el_str_concat(indent, EL_STR("} else {"))); + js_cg_stmts(else_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + } + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t js_cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared) { + el_val_t list_c = js_cg_expr(list_expr); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("for (const ")), item), EL_STR(" of ")), list_c), EL_STR(") {"))); + el_val_t body_decl = native_list_clone(declared); + body_decl = native_list_append(body_decl, item); + js_cg_stmts(body, el_str_concat(indent, EL_STR(" ")), body_decl); + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t js_cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t item = el_get_field(expr, EL_STR("item")); + el_val_t list_expr = el_get_field(expr, EL_STR("list")); + el_val_t body = el_get_field(expr, EL_STR("body")); + js_cg_for_body(item, list_expr, body, indent, declared); + return 0; +} + +el_val_t js_cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + el_val_t decl = declared; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + decl = js_cg_stmt(stmt, indent, decl); + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t js_params_str(el_val_t params) { + el_val_t n = native_list_len(params); + if (n == 0) { + return EL_STR(""); + } + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t param = native_list_get(params, i); + el_val_t name = el_get_field(param, EL_STR("name")); + if (i > 0) { + out = el_str_concat(out, EL_STR(", ")); + } + out = el_str_concat(out, name); + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_transform_implicit_return(el_val_t body) { + el_val_t n = native_list_len(body); + if (n == 0) { + return body; + } + el_val_t last = native_list_get(body, (n - 1)); + el_val_t last_kind = el_get_field(last, EL_STR("stmt")); + if (str_eq(last_kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(last, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + return body; + } + if (str_eq(val_kind, EL_STR("For"))) { + return body; + } + el_val_t new_body = native_list_empty(); + el_val_t i = 0; + while (i < (n - 1)) { + new_body = native_list_append(new_body, native_list_get(body, i)); + i = (i + 1); + } + el_val_t return_stmt = el_map_new(2, "stmt", EL_STR("Return"), "value", val); + new_body = native_list_append(new_body, return_stmt); + return new_body; + } + return body; + return 0; +} + +el_val_t js_cg_fn(el_val_t stmt) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); + el_val_t params_str = js_params_str(params); + js_build_int_names_for_params(params); + if (str_eq(fn_name, EL_STR("main"))) { + js_emit_line(el_str_concat(el_str_concat(EL_STR("function main("), params_str), EL_STR(") {"))); + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("function "), fn_name), EL_STR("(")), params_str), EL_STR(") {"))); + } + el_val_t decl = native_list_empty(); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + decl = native_list_append(decl, pname); + pi = (pi + 1); + } + el_val_t body_xformed = body; + if (!str_eq(ret_type, EL_STR("Void"))) { + body_xformed = js_transform_implicit_return(body); + } + js_cg_stmts(body_xformed, EL_STR(" "), decl); + js_emit_line(EL_STR("}")); + js_emit_blank(); + return 0; +} + +el_val_t js_is_fndef(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_is_top_level_decl(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("TypeDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("Import"))) { + return 1; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return 1; + } + if (str_eq(kind, EL_STR("ServiceBlock"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t codegen_js(el_val_t stmts, el_val_t source) { + state_set(EL_STR("__js_int_names"), EL_STR("")); + state_set(EL_STR("__js_match_counter"), EL_STR("")); + js_emit_line(EL_STR("// Generated by elc --target=js")); + js_emit_line(EL_STR("// Runtime: foundation/el/el-compiler/runtime/el_runtime.js")); + js_emit_line(EL_STR("import \"./el_runtime.js\";")); + js_emit_line(EL_STR("const {")); + js_emit_line(EL_STR(" println, print, el_str_concat, str_concat, str_eq, str_starts_with, str_ends_with,")); + js_emit_line(EL_STR(" str_len, int_to_str, str_to_int, str_slice, str_contains, str_replace,")); + js_emit_line(EL_STR(" str_to_upper, str_to_lower, str_trim, str_index_of, str_split, str_char_at,")); + js_emit_line(EL_STR(" str_char_code, str_lower, str_upper, el_abs, el_max, el_min,")); + js_emit_line(EL_STR(" el_list_new, el_list_len, el_list_get, el_list_append, el_list_empty, el_list_clone,")); + js_emit_line(EL_STR(" list_push, list_join, list_range,")); + js_emit_line(EL_STR(" el_map_new, el_get_field, el_map_get, el_map_set,")); + js_emit_line(EL_STR(" http_get, http_post, http_post_json,")); + js_emit_line(EL_STR(" fs_read, fs_write, fs_list,")); + js_emit_line(EL_STR(" json_parse, json_stringify, json_get, json_get_string, json_get_int,")); + js_emit_line(EL_STR(" time_now, time_now_utc, sleep_ms, bool_to_str, exit_program,")); + js_emit_line(EL_STR(" el_retain, el_release,")); + js_emit_line(EL_STR(" append, len, get, map_get, map_set,")); + js_emit_line(EL_STR(" native_list_get, native_list_len, native_list_append, native_list_empty,")); + js_emit_line(EL_STR(" native_list_clone, native_string_chars, native_int_to_str,")); + js_emit_line(EL_STR(" args, state_set, state_get, state_del, state_keys, env,")); + js_emit_line(EL_STR(" dharma_connect, dharma_send, dharma_emit, dharma_field, dharma_activate,")); + js_emit_line(EL_STR(" engram_node, engram_search, engram_activate,")); + js_emit_line(EL_STR(" llm_call, llm_call_system,")); + js_emit_line(EL_STR("} = globalThis.__el;")); + js_emit_blank(); + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (js_is_fndef(stmt)) { + js_cg_fn(stmt); + } + i = (i + 1); + } + el_val_t has_main = 0; + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("FnDef"))) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + has_main = 1; + } + } + i = (i + 1); + } + el_val_t main_decl = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (js_is_fndef(stmt)) { + } else { + if (js_is_top_level_decl(stmt)) { + } else { + main_decl = js_cg_stmt(stmt, EL_STR(""), main_decl); + } + } + i = (i + 1); + } + if (has_main) { + js_emit_blank(); + js_emit_line(EL_STR("main();")); + } + return EL_STR(""); + return 0; +} + +el_val_t compile(el_val_t source) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + return codegen(stmts, source); + return 0; +} + +el_val_t compile_js(el_val_t source) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + return codegen_js(stmts, source); + return 0; +} + +el_val_t compile_dispatch(el_val_t tgt, el_val_t source) { + if (str_eq(tgt, EL_STR("js"))) { + return compile_js(source); + } + return compile(source); + return 0; +} + +el_val_t detect_target(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_starts_with(a, EL_STR("--target="))) { + el_val_t v = str_slice(a, 9, str_len(a)); + return v; + } + i = (i + 1); + } + return EL_STR("c"); + return 0; +} + +el_val_t strip_flags(el_val_t argv) { + el_val_t out = native_list_empty(); + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (!str_starts_with(a, EL_STR("--"))) { + out = native_list_append(out, a); + } + i = (i + 1); + } + return out; + return 0; +} + +int main(int argc, char** argv) { + el_runtime_init_args(argc, argv); + _argv = args(); + _target = detect_target(_argv); + _positional = strip_flags(_argv); + _argc = native_list_len(_positional); + if (_argc >= 1) { + el_val_t _src_path = native_list_get(_positional, 0); + el_val_t _source = fs_read(_src_path); + el_val_t _out = compile_dispatch(_target, _source); + if (_argc >= 2) { + el_val_t _out_path = native_list_get(_positional, 1); + fs_write(_out_path, _out); + } + } + return 0; +} + diff --git a/dist/elc-new.c b/dist/elc-new.c new file mode 100644 index 0000000..4f147e0 --- /dev/null +++ b/dist/elc-new.c @@ -0,0 +1,4773 @@ +#include +#include +#include "el_runtime.h" + +el_val_t is_digit(el_val_t ch); +el_val_t is_alpha(el_val_t ch); +el_val_t is_alnum_or_underscore(el_val_t ch); +el_val_t is_whitespace(el_val_t ch); +el_val_t make_tok(el_val_t kind, el_val_t value); +el_val_t keyword_kind(el_val_t word); +el_val_t scan_digits(el_val_t chars, el_val_t start, el_val_t total); +el_val_t scan_ident(el_val_t chars, el_val_t start, el_val_t total); +el_val_t scan_string(el_val_t chars, el_val_t start, el_val_t total); +el_val_t lex(el_val_t source); +el_val_t tok_at(el_val_t tokens, el_val_t pos); +el_val_t tok_kind(el_val_t tokens, el_val_t pos); +el_val_t tok_value(el_val_t tokens, el_val_t pos); +el_val_t expect(el_val_t tokens, el_val_t pos, el_val_t kind); +el_val_t make_result(el_val_t node, el_val_t pos); +el_val_t skip_type(el_val_t tokens, el_val_t pos); +el_val_t parse_params(el_val_t tokens, el_val_t pos); +el_val_t parse_primary(el_val_t tokens, el_val_t pos); +el_val_t parse_if(el_val_t tokens, el_val_t pos); +el_val_t parse_match(el_val_t tokens, el_val_t pos); +el_val_t parse_pattern(el_val_t tokens, el_val_t pos); +el_val_t parse_for_expr(el_val_t tokens, el_val_t pos); +el_val_t parse_block(el_val_t tokens, el_val_t pos); +el_val_t parse_postfix(el_val_t tokens, el_val_t pos); +el_val_t op_precedence(el_val_t kind); +el_val_t is_binop(el_val_t kind); +el_val_t parse_binop(el_val_t tokens, el_val_t pos, el_val_t min_prec); +el_val_t parse_expr(el_val_t tokens, el_val_t pos); +el_val_t parse_stmt(el_val_t tokens, el_val_t pos); +el_val_t parse(el_val_t tokens); +el_val_t c_escape(el_val_t s); +el_val_t c_str_lit(el_val_t s); +el_val_t el_type_to_c(el_val_t type_str); +el_val_t emit_line(el_val_t line); +el_val_t emit_blank(void); +el_val_t binop_to_c(el_val_t op); +el_val_t cg_expr(el_val_t expr); +el_val_t next_match_id(void); +el_val_t cg_match(el_val_t expr); +el_val_t next_if_id(void); +el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var); +el_val_t cg_if_expr(el_val_t expr); +el_val_t list_contains(el_val_t lst, el_val_t s); +el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared); +el_val_t strip_outer_parens(el_val_t s); +el_val_t cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared); +el_val_t cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared); +el_val_t param_decl(el_val_t param, el_val_t idx); +el_val_t params_to_c(el_val_t params); +el_val_t transform_implicit_return(el_val_t body); +el_val_t is_int_name(el_val_t name); +el_val_t is_int_call(el_val_t call_expr); +el_val_t is_int_expr(el_val_t expr); +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name); +el_val_t is_self_formation_call(el_val_t fn_name); +el_val_t is_dharma_call(el_val_t fn_name); +el_val_t is_llm_call(el_val_t fn_name); +el_val_t cap_check_call(el_val_t fn_name); +el_val_t emit_cap_violations(void); +el_val_t builtin_arity(el_val_t name); +el_val_t arity_record_violation(el_val_t fn_name, el_val_t expected, el_val_t actual); +el_val_t arity_check_call(el_val_t fn_name, el_val_t actual); +el_val_t emit_arity_violations(void); +el_val_t add_int_name(el_val_t name); +el_val_t build_int_names_for_params(el_val_t params); +el_val_t cg_fn(el_val_t stmt); +el_val_t is_fndef(el_val_t stmt); +el_val_t is_top_level_decl(el_val_t stmt); +el_val_t cgi_arg(el_val_t value, el_val_t has_value); +el_val_t vbd_is_restricted_name(el_val_t name); +el_val_t vbd_expr_has_restricted_call(el_val_t expr); +el_val_t vbd_has_restricted_call(el_val_t stmts); +el_val_t codegen(el_val_t stmts, el_val_t source); +el_val_t js_escape(el_val_t s); +el_val_t js_str_lit(el_val_t s); +el_val_t js_emit_line(el_val_t line); +el_val_t js_emit_blank(void); +el_val_t js_binop(el_val_t op); +el_val_t js_is_int_name(el_val_t name); +el_val_t js_add_int_name(el_val_t name); +el_val_t js_build_int_names_for_params(el_val_t params); +el_val_t js_is_int_call(el_val_t call_expr); +el_val_t js_cg_expr(el_val_t expr); +el_val_t js_next_match_id(void); +el_val_t js_cg_match(el_val_t expr); +el_val_t js_list_contains(el_val_t lst, el_val_t s); +el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared); +el_val_t js_strip_outer_parens(el_val_t s); +el_val_t js_cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t js_cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared); +el_val_t js_cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t js_cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared); +el_val_t js_params_str(el_val_t params); +el_val_t js_transform_implicit_return(el_val_t body); +el_val_t js_cg_fn(el_val_t stmt); +el_val_t js_is_fndef(el_val_t stmt); +el_val_t js_is_top_level_decl(el_val_t stmt); +el_val_t codegen_js(el_val_t stmts, el_val_t source); +el_val_t compile(el_val_t source); +el_val_t compile_js(el_val_t source); +el_val_t compile_dispatch(el_val_t tgt, el_val_t source); +el_val_t detect_target(el_val_t argv); +el_val_t strip_flags(el_val_t argv); + +el_val_t is_digit(el_val_t ch) { + if (str_eq(ch, EL_STR("0"))) { + return 1; + } + if (str_eq(ch, EL_STR("1"))) { + return 1; + } + if (str_eq(ch, EL_STR("2"))) { + return 1; + } + if (str_eq(ch, EL_STR("3"))) { + return 1; + } + if (str_eq(ch, EL_STR("4"))) { + return 1; + } + if (str_eq(ch, EL_STR("5"))) { + return 1; + } + if (str_eq(ch, EL_STR("6"))) { + return 1; + } + if (str_eq(ch, EL_STR("7"))) { + return 1; + } + if (str_eq(ch, EL_STR("8"))) { + return 1; + } + if (str_eq(ch, EL_STR("9"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_alpha(el_val_t ch) { + if (str_eq(ch, EL_STR("a"))) { + return 1; + } + if (str_eq(ch, EL_STR("b"))) { + return 1; + } + if (str_eq(ch, EL_STR("c"))) { + return 1; + } + if (str_eq(ch, EL_STR("d"))) { + return 1; + } + if (str_eq(ch, EL_STR("e"))) { + return 1; + } + if (str_eq(ch, EL_STR("f"))) { + return 1; + } + if (str_eq(ch, EL_STR("g"))) { + return 1; + } + if (str_eq(ch, EL_STR("h"))) { + return 1; + } + if (str_eq(ch, EL_STR("i"))) { + return 1; + } + if (str_eq(ch, EL_STR("j"))) { + return 1; + } + if (str_eq(ch, EL_STR("k"))) { + return 1; + } + if (str_eq(ch, EL_STR("l"))) { + return 1; + } + if (str_eq(ch, EL_STR("m"))) { + return 1; + } + if (str_eq(ch, EL_STR("n"))) { + return 1; + } + if (str_eq(ch, EL_STR("o"))) { + return 1; + } + if (str_eq(ch, EL_STR("p"))) { + return 1; + } + if (str_eq(ch, EL_STR("q"))) { + return 1; + } + if (str_eq(ch, EL_STR("r"))) { + return 1; + } + if (str_eq(ch, EL_STR("s"))) { + return 1; + } + if (str_eq(ch, EL_STR("t"))) { + return 1; + } + if (str_eq(ch, EL_STR("u"))) { + return 1; + } + if (str_eq(ch, EL_STR("v"))) { + return 1; + } + if (str_eq(ch, EL_STR("w"))) { + return 1; + } + if (str_eq(ch, EL_STR("x"))) { + return 1; + } + if (str_eq(ch, EL_STR("y"))) { + return 1; + } + if (str_eq(ch, EL_STR("z"))) { + return 1; + } + if (str_eq(ch, EL_STR("A"))) { + return 1; + } + if (str_eq(ch, EL_STR("B"))) { + return 1; + } + if (str_eq(ch, EL_STR("C"))) { + return 1; + } + if (str_eq(ch, EL_STR("D"))) { + return 1; + } + if (str_eq(ch, EL_STR("E"))) { + return 1; + } + if (str_eq(ch, EL_STR("F"))) { + return 1; + } + if (str_eq(ch, EL_STR("G"))) { + return 1; + } + if (str_eq(ch, EL_STR("H"))) { + return 1; + } + if (str_eq(ch, EL_STR("I"))) { + return 1; + } + if (str_eq(ch, EL_STR("J"))) { + return 1; + } + if (str_eq(ch, EL_STR("K"))) { + return 1; + } + if (str_eq(ch, EL_STR("L"))) { + return 1; + } + if (str_eq(ch, EL_STR("M"))) { + return 1; + } + if (str_eq(ch, EL_STR("N"))) { + return 1; + } + if (str_eq(ch, EL_STR("O"))) { + return 1; + } + if (str_eq(ch, EL_STR("P"))) { + return 1; + } + if (str_eq(ch, EL_STR("Q"))) { + return 1; + } + if (str_eq(ch, EL_STR("R"))) { + return 1; + } + if (str_eq(ch, EL_STR("S"))) { + return 1; + } + if (str_eq(ch, EL_STR("T"))) { + return 1; + } + if (str_eq(ch, EL_STR("U"))) { + return 1; + } + if (str_eq(ch, EL_STR("V"))) { + return 1; + } + if (str_eq(ch, EL_STR("W"))) { + return 1; + } + if (str_eq(ch, EL_STR("X"))) { + return 1; + } + if (str_eq(ch, EL_STR("Y"))) { + return 1; + } + if (str_eq(ch, EL_STR("Z"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_alnum_or_underscore(el_val_t ch) { + if (is_digit(ch)) { + return 1; + } + if (is_alpha(ch)) { + return 1; + } + if (str_eq(ch, EL_STR("_"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_whitespace(el_val_t ch) { + if (str_eq(ch, EL_STR(" "))) { + return 1; + } + if (str_eq(ch, EL_STR("\t"))) { + return 1; + } + if (str_eq(ch, EL_STR("\n"))) { + return 1; + } + if (str_eq(ch, EL_STR("\r"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t make_tok(el_val_t kind, el_val_t value) { + return el_map_new(2, "kind", kind, "value", value); + return 0; +} + +el_val_t keyword_kind(el_val_t word) { + if (str_eq(word, EL_STR("let"))) { + return EL_STR("Let"); + } + if (str_eq(word, EL_STR("fn"))) { + return EL_STR("Fn"); + } + if (str_eq(word, EL_STR("type"))) { + return EL_STR("Type"); + } + if (str_eq(word, EL_STR("enum"))) { + return EL_STR("Enum"); + } + if (str_eq(word, EL_STR("match"))) { + return EL_STR("Match"); + } + if (str_eq(word, EL_STR("return"))) { + return EL_STR("Return"); + } + if (str_eq(word, EL_STR("if"))) { + return EL_STR("If"); + } + if (str_eq(word, EL_STR("else"))) { + return EL_STR("Else"); + } + if (str_eq(word, EL_STR("for"))) { + return EL_STR("For"); + } + if (str_eq(word, EL_STR("in"))) { + return EL_STR("In"); + } + if (str_eq(word, EL_STR("while"))) { + return EL_STR("While"); + } + if (str_eq(word, EL_STR("import"))) { + return EL_STR("Import"); + } + if (str_eq(word, EL_STR("from"))) { + return EL_STR("From"); + } + if (str_eq(word, EL_STR("as"))) { + return EL_STR("As"); + } + if (str_eq(word, EL_STR("with"))) { + return EL_STR("With"); + } + if (str_eq(word, EL_STR("sealed"))) { + return EL_STR("Sealed"); + } + if (str_eq(word, EL_STR("activate"))) { + return EL_STR("Activate"); + } + if (str_eq(word, EL_STR("where"))) { + return EL_STR("Where"); + } + if (str_eq(word, EL_STR("test"))) { + return EL_STR("Test"); + } + if (str_eq(word, EL_STR("seed"))) { + return EL_STR("Seed"); + } + if (str_eq(word, EL_STR("assert"))) { + return EL_STR("Assert"); + } + if (str_eq(word, EL_STR("protocol"))) { + return EL_STR("Protocol"); + } + if (str_eq(word, EL_STR("impl"))) { + return EL_STR("Impl"); + } + if (str_eq(word, EL_STR("retry"))) { + return EL_STR("Retry"); + } + if (str_eq(word, EL_STR("times"))) { + return EL_STR("Times"); + } + if (str_eq(word, EL_STR("fallback"))) { + return EL_STR("Fallback"); + } + if (str_eq(word, EL_STR("reason"))) { + return EL_STR("Reason"); + } + if (str_eq(word, EL_STR("parallel"))) { + return EL_STR("Parallel"); + } + if (str_eq(word, EL_STR("trace"))) { + return EL_STR("Trace"); + } + if (str_eq(word, EL_STR("requires"))) { + return EL_STR("Requires"); + } + if (str_eq(word, EL_STR("deploy"))) { + return EL_STR("Deploy"); + } + if (str_eq(word, EL_STR("to"))) { + return EL_STR("To"); + } + if (str_eq(word, EL_STR("via"))) { + return EL_STR("Via"); + } + if (str_eq(word, EL_STR("target"))) { + return EL_STR("Target"); + } + if (str_eq(word, EL_STR("true"))) { + return EL_STR("Bool"); + } + if (str_eq(word, EL_STR("false"))) { + return EL_STR("Bool"); + } + if (str_eq(word, EL_STR("cgi"))) { + return EL_STR("Cgi"); + } + if (str_eq(word, EL_STR("service"))) { + return EL_STR("Service"); + } + if (str_eq(word, EL_STR("manager"))) { + return EL_STR("Manager"); + } + if (str_eq(word, EL_STR("engine"))) { + return EL_STR("Engine"); + } + if (str_eq(word, EL_STR("accessor"))) { + return EL_STR("Accessor"); + } + if (str_eq(word, EL_STR("vessel"))) { + return EL_STR("Vessel"); + } + return EL_STR(""); + return 0; +} + +el_val_t scan_digits(el_val_t chars, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t text = EL_STR(""); + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = native_list_get(chars, i); + if (is_digit(ch)) { + text = el_str_concat(text, ch); + i = (i + 1); + } else { + running = 0; + } + } + } + return el_map_new(2, "text", text, "pos", i); + return 0; +} + +el_val_t scan_ident(el_val_t chars, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t text = EL_STR(""); + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = native_list_get(chars, i); + if (is_alnum_or_underscore(ch)) { + text = el_str_concat(text, ch); + i = (i + 1); + } else { + running = 0; + } + } + } + return el_map_new(2, "text", text, "pos", i); + return 0; +} + +el_val_t scan_string(el_val_t chars, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t text = EL_STR(""); + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("\\"))) { + el_val_t next_i = (i + 1); + if (next_i < total) { + el_val_t next_ch = native_list_get(chars, next_i); + if (str_eq(next_ch, EL_STR("\""))) { + text = el_str_concat(text, EL_STR("\"")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("n"))) { + text = el_str_concat(text, EL_STR("\n")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("t"))) { + text = el_str_concat(text, EL_STR("\t")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("r"))) { + text = el_str_concat(text, EL_STR("\r")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("\\"))) { + text = el_str_concat(text, EL_STR("\\")); + i = (next_i + 1); + } else { + text = el_str_concat(text, next_ch); + i = (next_i + 1); + } + } + } + } + } + } else { + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("\""))) { + i = (i + 1); + running = 0; + } else { + text = el_str_concat(text, ch); + i = (i + 1); + } + } + } + } + return el_map_new(2, "text", text, "pos", i); + return 0; +} + +el_val_t lex(el_val_t source) { + el_val_t chars = native_string_chars(source); + el_val_t total = native_list_len(chars); + el_val_t tokens = native_list_empty(); + el_val_t i = 0; + while (i < total) { + el_val_t ch = native_list_get(chars, i); + if (is_whitespace(ch)) { + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("/"))) { + el_val_t next_i = (i + 1); + if (next_i < total) { + el_val_t next_ch = native_list_get(chars, next_i); + if (str_eq(next_ch, EL_STR("/"))) { + i = (i + 2); + el_val_t running2 = 1; + while (running2) { + if (i >= total) { + running2 = 0; + } else { + el_val_t lch = native_list_get(chars, i); + if (str_eq(lch, EL_STR("\n"))) { + running2 = 0; + } else { + i = (i + 1); + } + } + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Slash"), EL_STR("/"))); + i = (i + 1); + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Slash"), EL_STR("/"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("\""))) { + el_val_t result = scan_string(chars, (i + 1), total); + el_val_t str_text = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + tokens = native_list_append(tokens, make_tok(EL_STR("Str"), str_text)); + i = new_pos; + } else { + if (is_digit(ch)) { + el_val_t result = scan_digits(chars, i, total); + el_val_t num_text = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + if (new_pos < total) { + el_val_t dot_ch = native_list_get(chars, new_pos); + if (str_eq(dot_ch, EL_STR("."))) { + el_val_t after_dot = (new_pos + 1); + if (after_dot < total) { + el_val_t after_dot_ch = native_list_get(chars, after_dot); + if (is_digit(after_dot_ch)) { + el_val_t frac_result = scan_digits(chars, after_dot, total); + el_val_t frac_text = el_get_field(frac_result, EL_STR("text")); + el_val_t frac_pos = el_get_field(frac_result, EL_STR("pos")); + tokens = native_list_append(tokens, make_tok(EL_STR("Float"), el_str_concat(el_str_concat(num_text, EL_STR(".")), frac_text))); + i = frac_pos; + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Int"), num_text)); + i = new_pos; + } + } else { + if (is_alpha(ch) || str_eq(ch, EL_STR("_"))) { + el_val_t result = scan_ident(chars, i, total); + el_val_t word = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + el_val_t kw = keyword_kind(word); + if (str_eq(kw, EL_STR(""))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Ident"), word)); + } else { + tokens = native_list_append(tokens, make_tok(kw, word)); + } + i = new_pos; + } else { + el_val_t peek_i = (i + 1); + el_val_t peek_ch = EL_STR(""); + if (peek_i < total) { + peek_ch = native_list_get(chars, peek_i); + } + if (str_eq(ch, EL_STR("="))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("EqEq"), EL_STR("=="))); + i = (i + 2); + } else { + if (str_eq(peek_ch, EL_STR(">"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("FatArrow"), EL_STR("=>"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Eq"), EL_STR("="))); + i = (i + 1); + } + } + } else { + if (str_eq(ch, EL_STR("!"))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("NotEq"), EL_STR("!="))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Not"), EL_STR("!"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("<"))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LtEq"), EL_STR("<="))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Lt"), EL_STR("<"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR(">"))) { + if (str_eq(peek_ch, EL_STR("="))) { + tokens = native_list_append(tokens, make_tok(EL_STR("GtEq"), EL_STR(">="))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Gt"), EL_STR(">"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("&"))) { + if (str_eq(peek_ch, EL_STR("&"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("And"), EL_STR("&&"))); + i = (i + 2); + } else { + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("|"))) { + if (str_eq(peek_ch, EL_STR("|"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Or"), EL_STR("||"))); + i = (i + 2); + } else { + if (str_eq(peek_ch, EL_STR(">"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("PipeOp"), EL_STR("|>"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Pipe"), EL_STR("|"))); + i = (i + 1); + } + } + } else { + if (str_eq(ch, EL_STR("-"))) { + if (str_eq(peek_ch, EL_STR(">"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Arrow"), EL_STR("->"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Minus"), EL_STR("-"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR(":"))) { + if (str_eq(peek_ch, EL_STR(":"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("ColonColon"), EL_STR("::"))); + i = (i + 2); + } else { + tokens = native_list_append(tokens, make_tok(EL_STR("Colon"), EL_STR(":"))); + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("+"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Plus"), EL_STR("+"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("*"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Star"), EL_STR("*"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("%"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Percent"), EL_STR("%"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("("))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LParen"), EL_STR("("))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR(")"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("RParen"), EL_STR(")"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("{"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LBrace"), EL_STR("{"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("}"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("RBrace"), EL_STR("}"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("["))) { + tokens = native_list_append(tokens, make_tok(EL_STR("LBracket"), EL_STR("["))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("]"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("RBracket"), EL_STR("]"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR(","))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Comma"), EL_STR(","))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("."))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Dot"), EL_STR("."))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR(";"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Semicolon"), EL_STR(";"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("@"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("At"), EL_STR("@"))); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("?"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("QuestionMark"), EL_STR("?"))); + i = (i + 1); + } else { + i = (i + 1); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + tokens = native_list_append(tokens, make_tok(EL_STR("Eof"), EL_STR(""))); + return tokens; + return 0; +} + +el_val_t tok_at(el_val_t tokens, el_val_t pos) { + return native_list_get(tokens, pos); + return 0; +} + +el_val_t tok_kind(el_val_t tokens, el_val_t pos) { + el_val_t t = native_list_get(tokens, pos); + return el_get_field(t, EL_STR("kind")); + return 0; +} + +el_val_t tok_value(el_val_t tokens, el_val_t pos) { + el_val_t t = native_list_get(tokens, pos); + return el_get_field(t, EL_STR("value")); + return 0; +} + +el_val_t expect(el_val_t tokens, el_val_t pos, el_val_t kind) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, kind)) { + return (pos + 1); + } + return (pos + 1); + return 0; +} + +el_val_t make_result(el_val_t node, el_val_t pos) { + return el_map_new(2, "node", node, "pos", pos); + return 0; +} + +el_val_t skip_type(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t p = (pos + 1); + p = skip_type(tokens, p); + p = expect(tokens, p, EL_STR("RBracket")); + return p; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Lt"))) { + p = (p + 1); + el_val_t depth = 1; + el_val_t running = 1; + while (running) { + el_val_t kk = tok_kind(tokens, p); + if (str_eq(kk, EL_STR("Eof"))) { + running = 0; + } else { + if (str_eq(kk, EL_STR("Lt"))) { + depth = (depth + 1); + p = (p + 1); + } else { + if (str_eq(kk, EL_STR("Gt"))) { + depth = (depth - 1); + p = (p + 1); + if (depth <= 0) { + running = 0; + } + } else { + p = (p + 1); + } + } + } + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("QuestionMark"))) { + p = (p + 1); + } + return p; + } + if (str_eq(k2, EL_STR("QuestionMark"))) { + return (p + 1); + } + return p; + } + return (pos + 1); + return 0; +} + +el_val_t parse_params(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("LParen")); + el_val_t params = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RParen"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t pname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t ptype = EL_STR(""); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ptype = tok_value(tokens, p); + } + p = skip_type(tokens, p); + el_val_t param = el_map_new(2, "name", pname, "type", ptype); + params = native_list_append(params, param); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + return el_map_new(2, "params", params, "pos", p); + return 0; +} + +el_val_t parse_primary(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + el_val_t v = tok_value(tokens, pos); + if (str_eq(k, EL_STR("Int"))) { + return make_result(el_map_new(2, "expr", EL_STR("Int"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Float"))) { + return make_result(el_map_new(2, "expr", EL_STR("Float"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Str"))) { + return make_result(el_map_new(2, "expr", EL_STR("Str"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Bool"))) { + return make_result(el_map_new(2, "expr", EL_STR("Bool"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Ident"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("LParen"))) { + el_val_t r = parse_expr(tokens, (pos + 1)); + el_val_t node = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + p = expect(tokens, p, EL_STR("RParen")); + return make_result(node, p); + } + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t p = (pos + 1); + el_val_t elems = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBracket"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_expr(tokens, p); + el_val_t elem = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + elems = native_list_append(elems, elem); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBracket")); + return make_result(el_map_new(2, "expr", EL_STR("Array"), "elems", elems), p); + } + if (str_eq(k, EL_STR("LBrace"))) { + el_val_t no_block = state_get(EL_STR("__no_block_expr")); + if (str_eq(no_block, EL_STR("1"))) { + return make_result(el_map_new(1, "expr", EL_STR("Nil")), pos); + } + el_val_t p = (pos + 1); + el_val_t pairs = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t key = tok_value(tokens, p); + el_val_t new_p = (p + 1); + new_p = expect(tokens, new_p, EL_STR("Colon")); + el_val_t r = parse_expr(tokens, new_p); + el_val_t val_node = el_get_field(r, EL_STR("node")); + new_p = el_get_field(r, EL_STR("pos")); + el_val_t pair = el_map_new(2, "key", key, "value", val_node); + pairs = native_list_append(pairs, pair); + el_val_t k3 = tok_kind(tokens, new_p); + if (str_eq(k3, EL_STR("Comma"))) { + new_p = (new_p + 1); + } + if (new_p <= p) { + p = (p + 1); + } else { + p = new_p; + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(2, "expr", EL_STR("Map"), "pairs", pairs), p); + } + if (str_eq(k, EL_STR("If"))) { + el_val_t r = parse_if(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("Match"))) { + el_val_t r = parse_match(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("For"))) { + el_val_t r = parse_for_expr(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("Not"))) { + el_val_t r = parse_primary(tokens, (pos + 1)); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "expr", EL_STR("Not"), "inner", inner), p); + } + if (str_eq(k, EL_STR("Minus"))) { + el_val_t r = parse_primary(tokens, (pos + 1)); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "expr", EL_STR("Neg"), "inner", inner), p); + } + if (str_eq(k, EL_STR("Target"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("To"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Via"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Deploy"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Reason"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Times"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Fallback"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Retry"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Parallel"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Trace"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Requires"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Where"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("As"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("With"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Manager"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Engine"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Accessor"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Vessel"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + return make_result(el_map_new(1, "expr", EL_STR("Nil")), (pos + 1)); + return 0; +} + +el_val_t parse_if(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("If")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t cond = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t then_stmts = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_val_t has_else = 0; + el_val_t else_stmts = native_list_empty(); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Else"))) { + p = (p + 1); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("If"))) { + el_val_t r3 = parse_if(tokens, p); + el_val_t nested = el_get_field(r3, EL_STR("node")); + p = el_get_field(r3, EL_STR("pos")); + else_stmts = native_list_append(else_stmts, el_map_new(2, "stmt", EL_STR("Expr"), "value", nested)); + has_else = 1; + } else { + el_val_t r3 = parse_block(tokens, p); + else_stmts = el_get_field(r3, EL_STR("stmts")); + p = el_get_field(r3, EL_STR("pos")); + has_else = 1; + } + } + return make_result(el_map_new(5, "expr", EL_STR("If"), "cond", cond, "then", then_stmts, "else", else_stmts, "has_else", has_else), p); + return 0; +} + +el_val_t parse_match(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("Match")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t subject = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t arms = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r2 = parse_pattern(tokens, p); + el_val_t pattern = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + p = expect(tokens, p, EL_STR("FatArrow")); + el_val_t r3 = parse_expr(tokens, p); + el_val_t body = el_get_field(r3, EL_STR("node")); + p = el_get_field(r3, EL_STR("pos")); + el_val_t arm = el_map_new(2, "pattern", pattern, "body", body); + arms = native_list_append(arms, arm); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "expr", EL_STR("Match"), "subject", subject, "arms", arms), p); + return 0; +} + +el_val_t parse_pattern(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Ident"))) { + el_val_t v = tok_value(tokens, pos); + if (str_eq(v, EL_STR("_"))) { + return make_result(el_map_new(1, "pattern", EL_STR("Wildcard")), (pos + 1)); + } + return make_result(el_map_new(2, "pattern", EL_STR("Binding"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Int"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitInt"), "value", tok_value(tokens, pos)), (pos + 1)); + } + if (str_eq(k, EL_STR("Str"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitStr"), "value", tok_value(tokens, pos)), (pos + 1)); + } + if (str_eq(k, EL_STR("Bool"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitBool"), "value", tok_value(tokens, pos)), (pos + 1)); + } + return make_result(el_map_new(1, "pattern", EL_STR("Wildcard")), (pos + 1)); + return 0; +} + +el_val_t parse_for_expr(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("For")); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("In")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t list_expr = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(4, "expr", EL_STR("For"), "item", item_name, "list", list_expr, "body", body), p); + return 0; +} + +el_val_t parse_block(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("LBrace")); + el_val_t stmts = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_stmt(tokens, p); + el_val_t stmt = el_get_field(r, EL_STR("node")); + el_val_t new_p = el_get_field(r, EL_STR("pos")); + stmts = native_list_append(stmts, stmt); + if (new_p <= p) { + p = (p + 1); + } else { + p = new_p; + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return el_map_new(2, "stmts", stmts, "pos", p); + return 0; +} + +el_val_t parse_postfix(el_val_t tokens, el_val_t pos) { + el_val_t r = parse_primary(tokens, pos); + el_val_t node = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("LParen"))) { + p = (p + 1); + el_val_t args = native_list_empty(); + el_val_t run2 = 1; + while (run2) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RParen"))) { + run2 = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + run2 = 0; + } else { + el_val_t r2 = parse_expr(tokens, p); + el_val_t arg = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + args = native_list_append(args, arg); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + node = el_map_new(3, "expr", EL_STR("Call"), "func", node, "args", args); + } else { + if (str_eq(k, EL_STR("Dot"))) { + el_val_t field = tok_value(tokens, (p + 1)); + p = (p + 2); + node = el_map_new(3, "expr", EL_STR("Field"), "object", node, "field", field); + } else { + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t r2 = parse_expr(tokens, (p + 1)); + el_val_t idx = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + p = expect(tokens, p, EL_STR("RBracket")); + node = el_map_new(3, "expr", EL_STR("Index"), "object", node, "index", idx); + } else { + if (str_eq(k, EL_STR("QuestionMark"))) { + p = (p + 1); + node = el_map_new(2, "expr", EL_STR("Try"), "inner", node); + } else { + running = 0; + } + } + } + } + } + return make_result(node, p); + return 0; +} + +el_val_t op_precedence(el_val_t kind) { + if (str_eq(kind, EL_STR("Or"))) { + return 1; + } + if (str_eq(kind, EL_STR("And"))) { + return 2; + } + if (str_eq(kind, EL_STR("EqEq"))) { + return 3; + } + if (str_eq(kind, EL_STR("NotEq"))) { + return 3; + } + if (str_eq(kind, EL_STR("Lt"))) { + return 4; + } + if (str_eq(kind, EL_STR("Gt"))) { + return 4; + } + if (str_eq(kind, EL_STR("LtEq"))) { + return 4; + } + if (str_eq(kind, EL_STR("GtEq"))) { + return 4; + } + if (str_eq(kind, EL_STR("Plus"))) { + return 5; + } + if (str_eq(kind, EL_STR("Minus"))) { + return 5; + } + if (str_eq(kind, EL_STR("Star"))) { + return 6; + } + if (str_eq(kind, EL_STR("Slash"))) { + return 6; + } + return 0; + return 0; +} + +el_val_t is_binop(el_val_t kind) { + if (str_eq(kind, EL_STR("Or"))) { + return 1; + } + if (str_eq(kind, EL_STR("And"))) { + return 1; + } + if (str_eq(kind, EL_STR("EqEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("NotEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("Lt"))) { + return 1; + } + if (str_eq(kind, EL_STR("Gt"))) { + return 1; + } + if (str_eq(kind, EL_STR("LtEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("GtEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("Plus"))) { + return 1; + } + if (str_eq(kind, EL_STR("Minus"))) { + return 1; + } + if (str_eq(kind, EL_STR("Star"))) { + return 1; + } + if (str_eq(kind, EL_STR("Slash"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t parse_binop(el_val_t tokens, el_val_t pos, el_val_t min_prec) { + el_val_t r = parse_postfix(tokens, pos); + el_val_t left = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + el_val_t prec = op_precedence(k); + if (is_binop(k)) { + if (prec >= min_prec) { + el_val_t op = k; + el_val_t r2 = parse_binop(tokens, (p + 1), (prec + 1)); + el_val_t right = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + left = el_map_new(4, "expr", EL_STR("BinOp"), "op", op, "left", left, "right", right); + } else { + running = 0; + } + } else { + running = 0; + } + } + return make_result(left, p); + return 0; +} + +el_val_t parse_expr(el_val_t tokens, el_val_t pos) { + return parse_binop(tokens, pos, 1); + return 0; +} + +el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Let"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t ltype = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Colon"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ltype = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + p = expect(tokens, p, EL_STR("Eq")); + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(4, "stmt", EL_STR("Let"), "name", name, "value", val, "type", ltype), p); + } + if (str_eq(k, EL_STR("Return"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", el_map_new(1, "expr", EL_STR("Nil"))), p); + } + if (str_eq(k2, EL_STR("Eof"))) { + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", el_map_new(1, "expr", EL_STR("Nil"))), p); + } + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", val), p); + } + if (str_eq(k, EL_STR("Fn"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = parse_params(tokens, p); + el_val_t params = el_get_field(r, EL_STR("params")); + p = el_get_field(r, EL_STR("pos")); + el_val_t ret_type = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Arrow"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ret_type = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(5, "stmt", EL_STR("FnDef"), "name", name, "params", params, "body", body, "ret_type", ret_type), p); + } + if (str_eq(k, EL_STR("Type"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t fields = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + p = skip_type(tokens, p); + fields = native_list_append(fields, el_map_new(1, "name", fname)); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "stmt", EL_STR("TypeDef"), "name", name, "fields", fields), p); + } + if (str_eq(k, EL_STR("Enum"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t variants = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t vname = tok_value(tokens, p); + p = (p + 1); + variants = native_list_append(variants, el_map_new(1, "name", vname)); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "stmt", EL_STR("EnumDef"), "name", name, "variants", variants), p); + } + if (str_eq(k, EL_STR("Import"))) { + el_val_t p = (pos + 1); + el_val_t path = tok_value(tokens, p); + p = (p + 1); + return make_result(el_map_new(2, "stmt", EL_STR("Import"), "path", path), p); + } + if (str_eq(k, EL_STR("From"))) { + el_val_t p = (pos + 1); + el_val_t module_name = tok_value(tokens, p); + p = (p + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Import"))) { + p = (p + 1); + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("LBrace"))) { + p = (p + 1); + el_val_t running = 1; + while (running) { + el_val_t k4 = tok_kind(tokens, p); + if (str_eq(k4, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k4, EL_STR("Eof"))) { + running = 0; + } else { + p = (p + 1); + el_val_t k5 = tok_kind(tokens, p); + if (str_eq(k5, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + } + return make_result(el_map_new(2, "stmt", EL_STR("Import"), "path", module_name), p); + } + if (str_eq(k, EL_STR("While"))) { + el_val_t p = (pos + 1); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t cond = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(3, "stmt", EL_STR("While"), "cond", cond, "body", body), p); + } + if (str_eq(k, EL_STR("For"))) { + el_val_t p = (pos + 1); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("In")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t list_expr = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + return make_result(el_map_new(4, "stmt", EL_STR("For"), "item", item_name, "list", list_expr, "body", body), p); + } + if (str_eq(k, EL_STR("At"))) { + el_val_t p = (pos + 1); + el_val_t dec_name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = parse_stmt(tokens, p); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p2 = el_get_field(r, EL_STR("pos")); + el_val_t inner_kind = el_get_field(inner, EL_STR("stmt")); + if (str_eq(inner_kind, EL_STR("FnDef"))) { + el_val_t with_dec = el_map_new(6, "stmt", EL_STR("FnDef"), "name", el_get_field(inner, EL_STR("name")), "params", el_get_field(inner, EL_STR("params")), "body", el_get_field(inner, EL_STR("body")), "ret_type", el_get_field(inner, EL_STR("ret_type")), "decorator", dec_name); + return make_result(with_dec, p2); + } + return r; + } + if (str_eq(k, EL_STR("Cgi"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t dharma_id = EL_STR(""); + el_val_t principal = EL_STR(""); + el_val_t network = EL_STR(""); + el_val_t engram = EL_STR(""); + el_val_t has_dharma_id = 0; + el_val_t has_principal = 0; + el_val_t has_network = 0; + el_val_t has_engram = 0; + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t fval = tok_value(tokens, p); + p = (p + 1); + if (str_eq(fname, EL_STR("dharma_id"))) { + dharma_id = fval; + has_dharma_id = 1; + } + if (str_eq(fname, EL_STR("principal"))) { + principal = fval; + has_principal = 1; + } + if (str_eq(fname, EL_STR("network"))) { + network = fval; + has_network = 1; + } + if (str_eq(fname, EL_STR("engram"))) { + engram = fval; + has_engram = 1; + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(10, "stmt", EL_STR("CgiBlock"), "name", name, "dharma_id", dharma_id, "principal", principal, "network", network, "engram", engram, "has_dharma_id", has_dharma_id, "has_principal", has_principal, "has_network", has_network, "has_engram", has_engram), p); + } + if (str_eq(k, EL_STR("Service"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t sponsor = EL_STR(""); + el_val_t domain = EL_STR(""); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t fval = tok_value(tokens, p); + p = (p + 1); + if (str_eq(fname, EL_STR("sponsor"))) { + sponsor = fval; + } + if (str_eq(fname, EL_STR("domain"))) { + domain = fval; + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(4, "stmt", EL_STR("ServiceBlock"), "name", name, "sponsor", sponsor, "domain", domain), p); + } + el_val_t r = parse_expr(tokens, pos); + el_val_t val = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(2, "stmt", EL_STR("Expr"), "value", val), p); + return 0; +} + +el_val_t parse(el_val_t tokens) { + el_val_t total = native_list_len(tokens); + el_val_t stmts = native_list_empty(); + el_val_t pos = 0; + el_val_t running = 1; + while (running) { + if (pos >= total) { + running = 0; + } else { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_stmt(tokens, pos); + el_val_t stmt = el_get_field(r, EL_STR("node")); + el_val_t new_pos = el_get_field(r, EL_STR("pos")); + stmts = native_list_append(stmts, stmt); + if (new_pos <= pos) { + pos = (pos + 1); + } else { + pos = new_pos; + } + } + } + } + return stmts; + return 0; +} + +el_val_t c_escape(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t total = native_list_len(chars); + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < total) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("\""))) { + out = el_str_concat(out, EL_STR("\\\"")); + } else { + if (str_eq(ch, EL_STR("\\"))) { + out = el_str_concat(out, EL_STR("\\\\")); + } else { + if (str_eq(ch, EL_STR("\n"))) { + out = el_str_concat(out, EL_STR("\\n")); + } else { + if (str_eq(ch, EL_STR("\r"))) { + out = el_str_concat(out, EL_STR("\\r")); + } else { + if (str_eq(ch, EL_STR("\t"))) { + out = el_str_concat(out, EL_STR("\\t")); + } else { + out = el_str_concat(out, ch); + } + } + } + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t c_str_lit(el_val_t s) { + return el_str_concat(el_str_concat(EL_STR("\""), c_escape(s)), EL_STR("\"")); + return 0; +} + +el_val_t el_type_to_c(el_val_t type_str) { + if (str_eq(type_str, EL_STR("String"))) { + return EL_STR("const char*"); + } + if (str_eq(type_str, EL_STR("Int"))) { + return EL_STR("int64_t"); + } + if (str_eq(type_str, EL_STR("Bool"))) { + return EL_STR("int"); + } + if (str_eq(type_str, EL_STR("Float"))) { + return EL_STR("double"); + } + if (str_eq(type_str, EL_STR("Void"))) { + return EL_STR("void"); + } + if (str_eq(type_str, EL_STR("void"))) { + return EL_STR("void"); + } + return EL_STR("void*"); + return 0; +} + +el_val_t emit_line(el_val_t line) { + println(line); + return 0; +} + +el_val_t emit_blank(void) { + println(EL_STR("")); + return 0; +} + +el_val_t binop_to_c(el_val_t op) { + if (str_eq(op, EL_STR("Plus"))) { + return EL_STR("+"); + } + if (str_eq(op, EL_STR("Minus"))) { + return EL_STR("-"); + } + if (str_eq(op, EL_STR("Star"))) { + return EL_STR("*"); + } + if (str_eq(op, EL_STR("Slash"))) { + return EL_STR("/"); + } + if (str_eq(op, EL_STR("EqEq"))) { + return EL_STR("=="); + } + if (str_eq(op, EL_STR("NotEq"))) { + return EL_STR("!="); + } + if (str_eq(op, EL_STR("Lt"))) { + return EL_STR("<"); + } + if (str_eq(op, EL_STR("Gt"))) { + return EL_STR(">"); + } + if (str_eq(op, EL_STR("LtEq"))) { + return EL_STR("<="); + } + if (str_eq(op, EL_STR("GtEq"))) { + return EL_STR(">="); + } + if (str_eq(op, EL_STR("And"))) { + return EL_STR("&&"); + } + if (str_eq(op, EL_STR("Or"))) { + return EL_STR("||"); + } + return op; + return 0; +} + +el_val_t cg_expr(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Int"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("Float"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("el_from_float("), v), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Str"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(v)), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Bool"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + if (str_eq(v, EL_STR("true"))) { + return EL_STR("1"); + } + return EL_STR("0"); + } + if (str_eq(kind, EL_STR("Nil"))) { + return EL_STR("EL_NULL"); + } + if (str_eq(kind, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return name; + } + if (str_eq(kind, EL_STR("Not"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = cg_expr(inner); + return el_str_concat(EL_STR("!"), inner_c); + } + if (str_eq(kind, EL_STR("Neg"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = cg_expr(inner); + return el_str_concat(el_str_concat(EL_STR("(-"), inner_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + el_val_t left = el_get_field(expr, EL_STR("left")); + el_val_t right = el_get_field(expr, EL_STR("right")); + el_val_t left_c = cg_expr(left); + el_val_t right_c = cg_expr(right); + el_val_t left_kind = el_get_field(left, EL_STR("expr")); + el_val_t right_kind = el_get_field(right, EL_STR("expr")); + if (str_eq(op, EL_STR("Plus"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (is_int_expr(left)) { + if (is_int_expr(right)) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + } + if (str_eq(left_kind, EL_STR("Int"))) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("BinOp"))) { + el_val_t left_op = el_get_field(left, EL_STR("op")); + if (str_eq(left_op, EL_STR("Plus"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(right_kind, EL_STR("BinOp"))) { + el_val_t right_op = el_get_field(right, EL_STR("op")); + if (str_eq(right_op, EL_STR("Plus"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("NotEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t arity = native_list_len(args); + el_val_t func_kind = el_get_field(func, EL_STR("expr")); + el_val_t args_c = EL_STR(""); + el_val_t i = 0; + while (i < arity) { + el_val_t arg = native_list_get(args, i); + el_val_t arg_c = cg_expr(arg); + if (i > 0) { + args_c = el_str_concat(args_c, EL_STR(", ")); + } + args_c = el_str_concat(args_c, arg_c); + i = (i + 1); + } + if (str_eq(func_kind, EL_STR("Ident"))) { + el_val_t fn_name = el_get_field(func, EL_STR("name")); + cap_check_call(fn_name); + arity_check_call(fn_name, arity); + return el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(func_kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(func, EL_STR("object")); + el_val_t field = el_get_field(func, EL_STR("field")); + el_val_t obj_c = cg_expr(obj); + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(", ")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(")")); + } + el_val_t fn_c = cg_expr(func); + return el_str_concat(el_str_concat(el_str_concat(fn_c, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t field = el_get_field(expr, EL_STR("field")); + el_val_t obj_c = cg_expr(obj); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", EL_STR(")), c_str_lit(field)), EL_STR("))")); + } + if (str_eq(kind, EL_STR("Index"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t idx = el_get_field(expr, EL_STR("index")); + el_val_t obj_c = cg_expr(obj); + el_val_t idx_c = cg_expr(idx); + el_val_t idx_kind = el_get_field(idx, EL_STR("expr")); + if (str_eq(idx_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_get("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + if (n == 0) { + return EL_STR("el_list_empty()"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t elem = native_list_get(elems, i); + el_val_t elem_c = cg_expr(elem); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(items, elem_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_new("), native_int_to_str(n)), EL_STR(", ")), items), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + if (n == 0) { + return EL_STR("el_map_new(0)"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t key = el_get_field(pair, EL_STR("key")); + el_val_t val = el_get_field(pair, EL_STR("value")); + el_val_t val_c = cg_expr(val); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(el_str_concat(el_str_concat(items, c_str_lit(key)), EL_STR(", ")), val_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_map_new("), native_int_to_str(n)), EL_STR(", ")), items), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + return cg_expr(inner); + } + if (str_eq(kind, EL_STR("If"))) { + return cg_if_expr(expr); + } + if (str_eq(kind, EL_STR("Match"))) { + return cg_match(expr); + } + return EL_STR("EL_NULL"); + return 0; +} + +el_val_t next_match_id(void) { + el_val_t csv = state_get(EL_STR("__match_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__match_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_match(el_val_t expr) { + el_val_t subject = el_get_field(expr, EL_STR("subject")); + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t subj_c = cg_expr(subject); + el_val_t id = next_match_id(); + el_val_t subj_var = el_str_concat(EL_STR("_match_subj_"), id); + el_val_t result_var = el_str_concat(EL_STR("_match_result_"), id); + el_val_t done_label = el_str_concat(EL_STR("_match_done_"), id); + el_val_t out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), subj_var), EL_STR(" = ")), subj_c), EL_STR("; el_val_t ")), result_var), EL_STR(" = 0; ")); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t pat = el_get_field(arm, EL_STR("pattern")); + el_val_t body = el_get_field(arm, EL_STR("body")); + el_val_t pkind = el_get_field(pat, EL_STR("pattern")); + el_val_t body_c = cg_expr(body); + if (str_eq(pkind, EL_STR("Wildcard"))) { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("Binding"))) { + el_val_t bname = el_get_field(pat, EL_STR("name")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ el_val_t ")), bname), EL_STR(" = ")), subj_var), EL_STR("; ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("LitInt"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" == ")), v), EL_STR(") { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("LitStr"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (str_eq(")), subj_var), EL_STR(", EL_STR(")), c_str_lit(v)), EL_STR("))) { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + if (str_eq(pkind, EL_STR("LitBool"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t bv = EL_STR("0"); + if (str_eq(v, EL_STR("true"))) { + bv = EL_STR("1"); + } + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" == ")), bv), EL_STR(") { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } ")); + } + } + } + } + } + i = (i + 1); + } + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, done_label), EL_STR(":; ")), result_var), EL_STR("; })")); + return out; + return 0; +} + +el_val_t next_if_id(void) { + el_val_t csv = state_get(EL_STR("__if_expr_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__if_expr_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var) { + el_val_t n = native_list_len(stmts); + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t s = native_list_get(stmts, i); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + el_val_t is_last = 0; + if (str_eq(i, (n - 1))) { + is_last = 1; + } + if (str_eq(sk, EL_STR("Let"))) { + el_val_t name = el_get_field(s, EL_STR("name")); + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("el_val_t ")), name), EL_STR(" = ")), val_c), EL_STR("; ")); + } else { + if (str_eq(sk, EL_STR("Return"))) { + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, result_var), EL_STR(" = (")), val_c), EL_STR("); ")); + } else { + if (str_eq(sk, EL_STR("Expr"))) { + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + if (is_last) { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, result_var), EL_STR(" = (")), val_c), EL_STR("); ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("(void)(")), val_c), EL_STR("); ")); + } + } else { + } + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t cg_if_expr(el_val_t expr) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = cg_expr(cond); + el_val_t id = next_if_id(); + el_val_t result_var = el_str_concat(EL_STR("_if_result_"), id); + el_val_t then_c = cg_if_expr_arm(then_stmts, result_var); + el_val_t else_c = EL_STR(""); + if (has_else) { + else_c = cg_if_expr_arm(else_stmts, result_var); + } + el_val_t out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), result_var), EL_STR(" = 0; if (")), cond_c), EL_STR(") { ")), then_c), EL_STR("} else { ")), else_c), EL_STR("} ")), result_var), EL_STR("; })")); + return out; + return 0; +} + +el_val_t list_contains(el_val_t lst, el_val_t s) { + el_val_t n = native_list_len(lst); + el_val_t i = 0; + while (i < n) { + el_val_t item = native_list_get(lst, i); + if (str_eq(item, s)) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = cg_expr(val); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + add_int_name(name); + } + if (list_contains(declared, name)) { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("el_val_t ")), name), EL_STR(" = ")), val_c), EL_STR(";"))); + return native_list_append(declared, name); + } + } + if (str_eq(kind, EL_STR("Return"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("Nil"))) { + emit_line(el_str_concat(indent, EL_STR("return 0;"))); + } else { + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("return ")), val_c), EL_STR(";"))); + } + return declared; + } + if (str_eq(kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + cg_if_stmt(val, indent, declared); + return declared; + } + if (str_eq(val_kind, EL_STR("For"))) { + cg_for_stmt(val, indent, declared); + return declared; + } + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(indent, val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("While"))) { + el_val_t cond = el_get_field(stmt, EL_STR("cond")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t cond_c = cg_expr(cond); + cond_c = strip_outer_parens(cond_c); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("while (")), cond_c), EL_STR(") {"))); + cg_stmts(body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("For"))) { + el_val_t item = el_get_field(stmt, EL_STR("item")); + el_val_t list_expr = el_get_field(stmt, EL_STR("list")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + cg_for_body(item, list_expr, body, indent, declared); + return declared; + } + if (str_eq(kind, EL_STR("FnDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("TypeDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Import"))) { + return declared; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return declared; + } + return declared; + return 0; +} + +el_val_t strip_outer_parens(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t n = native_list_len(chars); + if (n < 2) { + return s; + } + el_val_t first = native_list_get(chars, 0); + el_val_t last = native_list_get(chars, (n - 1)); + if (str_eq(first, EL_STR("("))) { + if (str_eq(last, EL_STR(")"))) { + el_val_t depth = 1; + el_val_t i = 1; + el_val_t balanced = 1; + while (i < (n - 1)) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("("))) { + depth = (depth + 1); + } + if (str_eq(ch, EL_STR(")"))) { + depth = (depth - 1); + if (depth == 0) { + balanced = 0; + i = n; + } + } + i = (i + 1); + } + if (balanced) { + el_val_t inner = EL_STR(""); + el_val_t j = 1; + while (j < (n - 1)) { + el_val_t ch = native_list_get(chars, j); + inner = el_str_concat(inner, ch); + j = (j + 1); + } + return inner; + } + } + } + return s; + return 0; +} + +el_val_t cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = cg_expr(cond); + cond_c = strip_outer_parens(cond_c); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("if (")), cond_c), EL_STR(") {"))); + cg_stmts(then_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + if (has_else) { + emit_line(el_str_concat(indent, EL_STR("} else {"))); + cg_stmts(else_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + } + emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared) { + el_val_t list_c = cg_expr(list_expr); + el_val_t idx = EL_STR("_el_i"); + el_val_t list_tmp = EL_STR("_el_lst"); + el_val_t len_tmp = EL_STR("_el_len"); + emit_line(el_str_concat(indent, EL_STR("{"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), list_tmp), EL_STR(" = ")), list_c), EL_STR(";"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), len_tmp), EL_STR(" = el_list_len(")), list_tmp), EL_STR(");"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" for (el_val_t ")), idx), EL_STR(" = 0; ")), idx), EL_STR(" < ")), len_tmp), EL_STR("; ")), idx), EL_STR("++) {"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), item), EL_STR(" = el_list_get(")), list_tmp), EL_STR(", ")), idx), EL_STR(");"))); + el_val_t body_decl = native_list_clone(declared); + body_decl = native_list_append(body_decl, item); + cg_stmts(body, el_str_concat(indent, EL_STR(" ")), body_decl); + emit_line(el_str_concat(indent, EL_STR(" }"))); + emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t item = el_get_field(expr, EL_STR("item")); + el_val_t list_expr = el_get_field(expr, EL_STR("list")); + el_val_t body = el_get_field(expr, EL_STR("body")); + cg_for_body(item, list_expr, body, indent, declared); + return 0; +} + +el_val_t cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + el_val_t decl = declared; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + decl = cg_stmt(stmt, indent, decl); + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t param_decl(el_val_t param, el_val_t idx) { + el_val_t name = el_get_field(param, EL_STR("name")); + return el_str_concat(EL_STR("el_val_t "), name); + return 0; +} + +el_val_t params_to_c(el_val_t params) { + el_val_t n = native_list_len(params); + if (n == 0) { + return EL_STR("void"); + } + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t param = native_list_get(params, i); + el_val_t decl = param_decl(param, i); + if (i > 0) { + out = el_str_concat(out, EL_STR(", ")); + } + out = el_str_concat(out, decl); + i = (i + 1); + } + return out; + return 0; +} + +el_val_t transform_implicit_return(el_val_t body) { + el_val_t n = native_list_len(body); + if (n == 0) { + return body; + } + el_val_t last = native_list_get(body, (n - 1)); + el_val_t last_kind = el_get_field(last, EL_STR("stmt")); + if (str_eq(last_kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(last, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + return body; + } + if (str_eq(val_kind, EL_STR("For"))) { + return body; + } + el_val_t new_body = native_list_empty(); + el_val_t i = 0; + while (i < (n - 1)) { + new_body = native_list_append(new_body, native_list_get(body, i)); + i = (i + 1); + } + el_val_t return_stmt = el_map_new(2, "stmt", EL_STR("Return"), "value", val); + new_body = native_list_append(new_body, return_stmt); + return new_body; + } + return body; + return 0; +} + +el_val_t is_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_int_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 1; + } + if (str_eq(name, EL_STR("json_array_len"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_node_count"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_edge_count"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("time_diff"))) { + return 1; + } + if (str_eq(name, EL_STR("time_add"))) { + return 1; + } + if (str_eq(name, EL_STR("time_from_parts"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 1; + } + if (str_eq(name, EL_STR("el_min"))) { + return 1; + } + if (str_eq(name, EL_STR("float_to_int"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_int_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Int"))) { + return 1; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return is_int_name(name); + } + if (str_eq(k, EL_STR("Call"))) { + return is_int_call(expr); + } + if (str_eq(k, EL_STR("Neg"))) { + return is_int_expr(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(k, EL_STR("Not"))) { + return 1; + } + if (str_eq(k, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + if (str_eq(op, EL_STR("EqEq"))) { + return 1; + } + if (str_eq(op, EL_STR("NotEq"))) { + return 1; + } + if (str_eq(op, EL_STR("Lt"))) { + return 1; + } + if (str_eq(op, EL_STR("Gt"))) { + return 1; + } + if (str_eq(op, EL_STR("LtEq"))) { + return 1; + } + if (str_eq(op, EL_STR("GtEq"))) { + return 1; + } + if (str_eq(op, EL_STR("And"))) { + return 1; + } + if (str_eq(op, EL_STR("Or"))) { + return 1; + } + if (str_eq(op, EL_STR("Plus"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Minus"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Star"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Slash"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + return 0; + } + return 0; + return 0; +} + +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(kind, EL_STR(":")), fn_name); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__cap_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t is_self_formation_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_dharma_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("dharma_connect"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_send"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_activate"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_strengthen"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_relationship"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_peers"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_llm_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_system"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_vision"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_models"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t cap_check_call(el_val_t fn_name) { + el_val_t kind = state_get(EL_STR("__program_kind")); + if (str_eq(kind, EL_STR("cgi"))) { + return 1; + } + if (str_eq(kind, EL_STR("service"))) { + if (is_self_formation_call(fn_name)) { + cap_record_violation(EL_STR("service"), fn_name); + return 0; + } + return 1; + } + if (is_dharma_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + if (is_llm_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + return 1; + return 0; +} + +el_val_t emit_cap_violations(void) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t colon = str_index_of(entry, EL_STR(":")); + if (colon > 0) { + el_val_t kind = str_slice(entry, 0, colon); + el_val_t fn_name = str_slice(entry, (colon + 1), str_len(entry)); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("#error \"capability violation: '"), kind), EL_STR("' programs may not call '")), fn_name), EL_STR("' (self-formation primitive — only 'cgi' programs may use it)\""))); + } + i = ((i + next_comma) + 1); + } + return 0; +} + +el_val_t builtin_arity(el_val_t name) { + if (str_eq(name, EL_STR("println"))) { + return 1; + } + if (str_eq(name, EL_STR("print"))) { + return 1; + } + if (str_eq(name, EL_STR("readline"))) { + return 0; + } + if (str_eq(name, EL_STR("el_str_concat"))) { + return 2; + } + if (str_eq(name, EL_STR("str_eq"))) { + return 2; + } + if (str_eq(name, EL_STR("str_starts_with"))) { + return 2; + } + if (str_eq(name, EL_STR("str_ends_with"))) { + return 2; + } + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_concat"))) { + return 2; + } + if (str_eq(name, EL_STR("int_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_slice"))) { + return 3; + } + if (str_eq(name, EL_STR("str_contains"))) { + return 2; + } + if (str_eq(name, EL_STR("str_replace"))) { + return 3; + } + if (str_eq(name, EL_STR("str_to_upper"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_lower"))) { + return 1; + } + if (str_eq(name, EL_STR("str_trim"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 2; + } + if (str_eq(name, EL_STR("str_split"))) { + return 2; + } + if (str_eq(name, EL_STR("str_char_at"))) { + return 2; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 2; + } + if (str_eq(name, EL_STR("str_pad_left"))) { + return 3; + } + if (str_eq(name, EL_STR("str_pad_right"))) { + return 3; + } + if (str_eq(name, EL_STR("str_format"))) { + return 2; + } + if (str_eq(name, EL_STR("str_lower"))) { + return 1; + } + if (str_eq(name, EL_STR("str_upper"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 2; + } + if (str_eq(name, EL_STR("el_min"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_get"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_append"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_empty"))) { + return 0; + } + if (str_eq(name, EL_STR("el_list_clone"))) { + return 1; + } + if (str_eq(name, EL_STR("list_push"))) { + return 2; + } + if (str_eq(name, EL_STR("list_push_front"))) { + return 2; + } + if (str_eq(name, EL_STR("list_join"))) { + return 2; + } + if (str_eq(name, EL_STR("list_range"))) { + return 2; + } + if (str_eq(name, EL_STR("el_get_field"))) { + return 2; + } + if (str_eq(name, EL_STR("el_map_get"))) { + return 2; + } + if (str_eq(name, EL_STR("el_map_set"))) { + return 3; + } + if (str_eq(name, EL_STR("http_get"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post"))) { + return 2; + } + if (str_eq(name, EL_STR("http_post_json"))) { + return 2; + } + if (str_eq(name, EL_STR("http_get_with_headers"))) { + return 2; + } + if (str_eq(name, EL_STR("http_post_with_headers"))) { + return 3; + } + if (str_eq(name, EL_STR("http_post_form_auth"))) { + return 3; + } + if (str_eq(name, EL_STR("http_serve"))) { + return 2; + } + if (str_eq(name, EL_STR("http_set_handler"))) { + return 1; + } + if (str_eq(name, EL_STR("fs_read"))) { + return 1; + } + if (str_eq(name, EL_STR("fs_write"))) { + return 2; + } + if (str_eq(name, EL_STR("fs_list"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get"))) { + return 2; + } + if (str_eq(name, EL_STR("json_parse"))) { + return 1; + } + if (str_eq(name, EL_STR("json_stringify"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_string"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_float"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_bool"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_raw"))) { + return 2; + } + if (str_eq(name, EL_STR("json_set"))) { + return 3; + } + if (str_eq(name, EL_STR("json_array_len"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 0; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 0; + } + if (str_eq(name, EL_STR("sleep_secs"))) { + return 1; + } + if (str_eq(name, EL_STR("sleep_ms"))) { + return 1; + } + if (str_eq(name, EL_STR("time_format"))) { + return 2; + } + if (str_eq(name, EL_STR("time_to_parts"))) { + return 1; + } + if (str_eq(name, EL_STR("time_from_parts"))) { + return 3; + } + if (str_eq(name, EL_STR("time_add"))) { + return 3; + } + if (str_eq(name, EL_STR("time_diff"))) { + return 3; + } + if (str_eq(name, EL_STR("uuid_new"))) { + return 0; + } + if (str_eq(name, EL_STR("uuid_v4"))) { + return 0; + } + if (str_eq(name, EL_STR("env"))) { + return 1; + } + if (str_eq(name, EL_STR("state_set"))) { + return 2; + } + if (str_eq(name, EL_STR("state_get"))) { + return 1; + } + if (str_eq(name, EL_STR("state_del"))) { + return 1; + } + if (str_eq(name, EL_STR("state_keys"))) { + return 0; + } + if (str_eq(name, EL_STR("float_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("int_to_float"))) { + return 1; + } + if (str_eq(name, EL_STR("float_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("format_float"))) { + return 2; + } + if (str_eq(name, EL_STR("decimal_round"))) { + return 2; + } + if (str_eq(name, EL_STR("str_to_float"))) { + return 1; + } + if (str_eq(name, EL_STR("math_sqrt"))) { + return 1; + } + if (str_eq(name, EL_STR("math_log"))) { + return 1; + } + if (str_eq(name, EL_STR("math_ln"))) { + return 1; + } + if (str_eq(name, EL_STR("math_sin"))) { + return 1; + } + if (str_eq(name, EL_STR("math_cos"))) { + return 1; + } + if (str_eq(name, EL_STR("math_pi"))) { + return 0; + } + if (str_eq(name, EL_STR("bool_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("exit_program"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_connect"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_send"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_activate"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_emit"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_field"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_strengthen"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_relationship"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_peers"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_node"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_node_full"))) { + return 8; + } + if (str_eq(name, EL_STR("engram_get_node"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_strengthen"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_forget"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_node_count"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_search"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_scan_nodes"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_connect"))) { + return 4; + } + if (str_eq(name, EL_STR("engram_edge_between"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_neighbors"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_neighbors_filtered"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_edge_count"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_activate"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_save"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_load"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_get_node_json"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_search_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_scan_nodes_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_neighbors_json"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_activate_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_stats_json"))) { + return 0; + } + if (str_eq(name, EL_STR("llm_call"))) { + return 2; + } + if (str_eq(name, EL_STR("llm_call_system"))) { + return 3; + } + if (str_eq(name, EL_STR("llm_call_agentic"))) { + return 4; + } + if (str_eq(name, EL_STR("llm_vision"))) { + return 4; + } + if (str_eq(name, EL_STR("llm_models"))) { + return 0; + } + if (str_eq(name, EL_STR("llm_register_tool"))) { + return 2; + } + if (str_eq(name, EL_STR("sha256_hex"))) { + return 1; + } + if (str_eq(name, EL_STR("sha256_bytes"))) { + return 1; + } + if (str_eq(name, EL_STR("hmac_sha256_hex"))) { + return 2; + } + if (str_eq(name, EL_STR("hmac_sha256_bytes"))) { + return 2; + } + if (str_eq(name, EL_STR("base64_encode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64_decode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64url_encode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64url_decode"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_get"))) { + return 2; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_append"))) { + return 2; + } + if (str_eq(name, EL_STR("native_list_empty"))) { + return 0; + } + if (str_eq(name, EL_STR("native_list_clone"))) { + return 1; + } + if (str_eq(name, EL_STR("native_string_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("native_int_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("append"))) { + return 2; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("get"))) { + return 2; + } + if (str_eq(name, EL_STR("map_get"))) { + return 2; + } + if (str_eq(name, EL_STR("map_set"))) { + return 3; + } + return (-1); + return 0; +} + +el_val_t arity_record_violation(el_val_t fn_name, el_val_t expected, el_val_t actual) { + el_val_t csv = state_get(EL_STR("__arity_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("|")), native_int_to_str(expected)), EL_STR("|")), native_int_to_str(actual)); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__arity_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t arity_check_call(el_val_t fn_name, el_val_t actual) { + el_val_t expected = builtin_arity(fn_name); + if (expected < 0) { + return 1; + } + if (expected == actual) { + return 1; + } + arity_record_violation(fn_name, expected, actual); + return 1; + return 0; +} + +el_val_t emit_arity_violations(void) { + el_val_t csv = state_get(EL_STR("__arity_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t p1 = str_index_of(entry, EL_STR("|")); + if (p1 > 0) { + el_val_t fn_name = str_slice(entry, 0, p1); + el_val_t rest = str_slice(entry, (p1 + 1), str_len(entry)); + el_val_t p2 = str_index_of(rest, EL_STR("|")); + if (p2 > 0) { + el_val_t exp_s = str_slice(rest, 0, p2); + el_val_t act_s = str_slice(rest, (p2 + 1), str_len(rest)); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("#error \"arity error: '"), fn_name), EL_STR("' takes ")), exp_s), EL_STR(" arguments, but called with ")), act_s), EL_STR("\""))); + } + } + i = ((i + next_comma) + 1); + } + return 0; +} + +el_val_t add_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + csv; + EL_NULL; + EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__int_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t build_int_names_for_params(el_val_t params) { + state_set(EL_STR("__int_names"), EL_STR(",")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR("Int"))) { + add_int_name(pname); + } + pi = (pi + 1); + } + return 1; + return 0; +} + +el_val_t cg_fn(el_val_t stmt) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + return 0; + } + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); + el_val_t params_c = params_to_c(params); + el_val_t decorator = el_get_field(stmt, EL_STR("decorator")); + if (vbd_has_restricted_call(body)) { + if (!str_eq(decorator, EL_STR("manager"))) { + emit_line(el_str_concat(el_str_concat(EL_STR("#error \"VBD violation: dharma_emit/dharma_field called from non-@manager fn '"), fn_name), EL_STR("'\""))); + } + } + build_int_names_for_params(params); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(") {"))); + el_val_t decl = native_list_empty(); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + decl = native_list_append(decl, pname); + pi = (pi + 1); + } + el_val_t body_xformed = body; + if (!str_eq(ret_type, EL_STR("Void"))) { + body_xformed = transform_implicit_return(body); + } + cg_stmts(body_xformed, EL_STR(" "), decl); + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + return 0; +} + +el_val_t is_fndef(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_top_level_decl(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("TypeDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("Import"))) { + return 1; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t cgi_arg(el_val_t value, el_val_t has_value) { + if (has_value) { + return el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(value)), EL_STR(")")); + } + return EL_STR("EL_NULL"); + return 0; +} + +el_val_t vbd_is_restricted_name(el_val_t name) { + if (str_eq(name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_field"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t vbd_expr_has_restricted_call(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (str_eq(fk, EL_STR("Ident"))) { + el_val_t fname = el_get_field(func, EL_STR("name")); + if (vbd_is_restricted_name(fname)) { + return 1; + } + } + if (vbd_expr_has_restricted_call(func)) { + return 1; + } + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t an = native_list_len(args); + el_val_t ai = 0; + while (ai < an) { + el_val_t a = native_list_get(args, ai); + if (vbd_expr_has_restricted_call(a)) { + return 1; + } + ai = (ai + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t l = el_get_field(expr, EL_STR("left")); + el_val_t r = el_get_field(expr, EL_STR("right")); + if (vbd_expr_has_restricted_call(l)) { + return 1; + } + if (vbd_expr_has_restricted_call(r)) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Not"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Neg"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Field"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("object"))); + } + if (str_eq(kind, EL_STR("Index"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("object")))) { + return 1; + } + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("index")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Try"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + el_val_t i = 0; + while (i < n) { + el_val_t e = native_list_get(elems, i); + if (vbd_expr_has_restricted_call(e)) { + return 1; + } + i = (i + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t v = el_get_field(pair, EL_STR("value")); + if (vbd_expr_has_restricted_call(v)) { + return 1; + } + i = (i + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("If"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("cond")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("then")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("else")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("For"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("list")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("body")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Match"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("subject")))) { + return 1; + } + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t body = el_get_field(arm, EL_STR("body")); + if (vbd_expr_has_restricted_call(body)) { + return 1; + } + i = (i + 1); + } + return 0; + } + return 0; + return 0; +} + +el_val_t vbd_has_restricted_call(el_val_t stmts) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t s = native_list_get(stmts, i); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + if (str_eq(sk, EL_STR("Let"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("Return"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("Expr"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("While"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("cond")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(s, EL_STR("body")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("For"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("list")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(s, EL_STR("body")))) { + return 1; + } + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t codegen(el_val_t stmts, el_val_t source) { + el_val_t n_top = native_list_len(stmts); + el_val_t cgi_count = 0; + el_val_t cgi_block = el_map_new(1, "stmt", EL_STR("None")); + el_val_t svc_count = 0; + el_val_t svc_block = el_map_new(1, "stmt", EL_STR("None")); + el_val_t ti = 0; + while (ti < n_top) { + el_val_t s = native_list_get(stmts, ti); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + if (str_eq(sk, EL_STR("CgiBlock"))) { + cgi_count = (cgi_count + 1); + if (cgi_count == 1) { + cgi_block = s; + } + } + if (str_eq(sk, EL_STR("ServiceBlock"))) { + svc_count = (svc_count + 1); + if (svc_count == 1) { + svc_block = s; + } + } + ti = (ti + 1); + } + if (cgi_count > 1) { + emit_line(EL_STR("#error \"El: multiple cgi blocks in program (only one allowed)\"")); + } + if (svc_count > 1) { + emit_line(EL_STR("#error \"El: multiple service blocks in program (only one allowed)\"")); + } + if (cgi_count >= 1) { + if (svc_count >= 1) { + emit_line(EL_STR("#error \"El: program declares both cgi and service blocks (mutually exclusive — pick one)\"")); + } + } + el_val_t kind = EL_STR("utility"); + if (cgi_count >= 1) { + kind = EL_STR("cgi"); + } + if (svc_count >= 1) { + kind = EL_STR("service"); + } + state_set(EL_STR("__program_kind"), kind); + state_set(EL_STR("__cap_violations"), EL_STR("")); + state_set(EL_STR("__arity_violations"), EL_STR("")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include \"el_runtime.h\"")); + emit_blank(); + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (!str_eq(fn_name, EL_STR("main"))) { + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t params_c = params_to_c(params); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(");"))); + } + } + i = (i + 1); + } + emit_blank(); + el_val_t has_toplevel_lets = 0; + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + add_int_name(name); + } + emit_line(el_str_concat(el_str_concat(EL_STR("el_val_t "), name), EL_STR(";"))); + has_toplevel_lets = 1; + } + i = (i + 1); + } + if (has_toplevel_lets) { + emit_blank(); + } + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + cg_fn(stmt); + } + i = (i + 1); + } + emit_line(EL_STR("int main(int argc, char** argv) {")); + emit_line(EL_STR(" el_runtime_init_args(argc, argv);")); + if (cgi_count >= 1) { + el_val_t cname = el_get_field(cgi_block, EL_STR("name")); + el_val_t cdid = el_get_field(cgi_block, EL_STR("dharma_id")); + el_val_t cprin = el_get_field(cgi_block, EL_STR("principal")); + el_val_t cnet = el_get_field(cgi_block, EL_STR("network")); + el_val_t ceng = el_get_field(cgi_block, EL_STR("engram")); + el_val_t has_did = el_get_field(cgi_block, EL_STR("has_dharma_id")); + el_val_t has_prin = el_get_field(cgi_block, EL_STR("has_principal")); + el_val_t has_net = el_get_field(cgi_block, EL_STR("has_network")); + el_val_t has_eng = el_get_field(cgi_block, EL_STR("has_engram")); + el_val_t arg_name = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(cname)), EL_STR(")")); + el_val_t arg_did = cgi_arg(cdid, has_did); + el_val_t arg_prin = cgi_arg(cprin, has_prin); + el_val_t arg_net = cgi_arg(cnet, has_net); + el_val_t arg_eng = cgi_arg(ceng, has_eng); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" el_cgi_init("), arg_name), EL_STR(", ")), arg_did), EL_STR(", ")), arg_prin), EL_STR(", ")), arg_net), EL_STR(", ")), arg_eng), EL_STR(");"))); + } + el_val_t main_decl = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + main_decl = native_list_append(main_decl, name); + } + i = (i + 1); + } + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + } else { + if (is_top_level_decl(stmt)) { + } else { + main_decl = cg_stmt(stmt, EL_STR(" "), main_decl); + } + } + el_release(stmt); + i = (i + 1); + } + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + emit_cap_violations(); + emit_arity_violations(); + return EL_STR(""); + return 0; +} + +el_val_t js_escape(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t total = native_list_len(chars); + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < total) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("\""))) { + out = el_str_concat(out, EL_STR("\\\"")); + } else { + if (str_eq(ch, EL_STR("\\"))) { + out = el_str_concat(out, EL_STR("\\\\")); + } else { + if (str_eq(ch, EL_STR("\n"))) { + out = el_str_concat(out, EL_STR("\\n")); + } else { + if (str_eq(ch, EL_STR("\r"))) { + out = el_str_concat(out, EL_STR("\\r")); + } else { + if (str_eq(ch, EL_STR("\t"))) { + out = el_str_concat(out, EL_STR("\\t")); + } else { + out = el_str_concat(out, ch); + } + } + } + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_str_lit(el_val_t s) { + return el_str_concat(el_str_concat(EL_STR("\""), js_escape(s)), EL_STR("\"")); + return 0; +} + +el_val_t js_emit_line(el_val_t line) { + println(line); + return 0; +} + +el_val_t js_emit_blank(void) { + println(EL_STR("")); + return 0; +} + +el_val_t js_binop(el_val_t op) { + if (str_eq(op, EL_STR("Plus"))) { + return EL_STR("+"); + } + if (str_eq(op, EL_STR("Minus"))) { + return EL_STR("-"); + } + if (str_eq(op, EL_STR("Star"))) { + return EL_STR("*"); + } + if (str_eq(op, EL_STR("Slash"))) { + return EL_STR("/"); + } + if (str_eq(op, EL_STR("Percent"))) { + return EL_STR("%"); + } + if (str_eq(op, EL_STR("EqEq"))) { + return EL_STR("==="); + } + if (str_eq(op, EL_STR("NotEq"))) { + return EL_STR("!=="); + } + if (str_eq(op, EL_STR("Lt"))) { + return EL_STR("<"); + } + if (str_eq(op, EL_STR("Gt"))) { + return EL_STR(">"); + } + if (str_eq(op, EL_STR("LtEq"))) { + return EL_STR("<="); + } + if (str_eq(op, EL_STR("GtEq"))) { + return EL_STR(">="); + } + if (str_eq(op, EL_STR("And"))) { + return EL_STR("&&"); + } + if (str_eq(op, EL_STR("Or"))) { + return EL_STR("||"); + } + return op; + return 0; +} + +el_val_t js_is_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_int_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t js_add_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_int_names")); + if (str_eq(csv, EL_STR(""))) { + csv; + EL_NULL; + EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__js_int_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t js_build_int_names_for_params(el_val_t params) { + state_set(EL_STR("__js_int_names"), EL_STR(",")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR("Int"))) { + js_add_int_name(pname); + } + pi = (pi + 1); + } + return 1; + return 0; +} + +el_val_t js_is_int_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 1; + } + if (str_eq(name, EL_STR("el_min"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_cg_expr(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Int"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("Float"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("Str"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return js_str_lit(v); + } + if (str_eq(kind, EL_STR("Bool"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + if (str_eq(v, EL_STR("true"))) { + return EL_STR("true"); + } + return EL_STR("false"); + } + if (str_eq(kind, EL_STR("Nil"))) { + return EL_STR("null"); + } + if (str_eq(kind, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return name; + } + if (str_eq(kind, EL_STR("Not"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(EL_STR("!"), inner_c); + } + if (str_eq(kind, EL_STR("Neg"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(el_str_concat(EL_STR("(-"), inner_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + el_val_t left = el_get_field(expr, EL_STR("left")); + el_val_t right = el_get_field(expr, EL_STR("right")); + el_val_t left_c = js_cg_expr(left); + el_val_t right_c = js_cg_expr(right); + el_val_t left_kind = el_get_field(left, EL_STR("expr")); + el_val_t right_kind = el_get_field(right, EL_STR("expr")); + if (str_eq(op, EL_STR("Plus"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Call"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_call(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(right_kind, EL_STR("Ident"))) { + if (str_eq(left_kind, EL_STR("Call"))) { + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(rname)) { + if (js_is_int_call(left)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Call"))) { + if (str_eq(right_kind, EL_STR("Call"))) { + if (js_is_int_call(left)) { + if (js_is_int_call(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(op, EL_STR("NotEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + el_val_t op_c = js_binop(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t arity = native_list_len(args); + el_val_t func_kind = el_get_field(func, EL_STR("expr")); + el_val_t args_c = EL_STR(""); + el_val_t i = 0; + while (i < arity) { + el_val_t arg = native_list_get(args, i); + el_val_t arg_c = js_cg_expr(arg); + if (i > 0) { + args_c = el_str_concat(args_c, EL_STR(", ")); + } + args_c = el_str_concat(args_c, arg_c); + i = (i + 1); + } + if (str_eq(func_kind, EL_STR("Ident"))) { + el_val_t fn_name = el_get_field(func, EL_STR("name")); + return el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(func_kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(func, EL_STR("object")); + el_val_t field = el_get_field(func, EL_STR("field")); + el_val_t obj_c = js_cg_expr(obj); + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(", ")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(")")); + } + el_val_t fn_c = js_cg_expr(func); + return el_str_concat(el_str_concat(el_str_concat(fn_c, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t field = el_get_field(expr, EL_STR("field")); + el_val_t obj_c = js_cg_expr(obj); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), js_str_lit(field)), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Index"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t idx = el_get_field(expr, EL_STR("index")); + el_val_t obj_c = js_cg_expr(obj); + el_val_t idx_c = js_cg_expr(idx); + el_val_t idx_kind = el_get_field(idx, EL_STR("expr")); + if (str_eq(idx_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_get("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + if (n == 0) { + return EL_STR("[]"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t elem = native_list_get(elems, i); + el_val_t elem_c = js_cg_expr(elem); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(items, elem_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(EL_STR("["), items), EL_STR("]")); + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + if (n == 0) { + return EL_STR("{}"); + } + el_val_t items = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t key = el_get_field(pair, EL_STR("key")); + el_val_t val = el_get_field(pair, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + if (i > 0) { + items = el_str_concat(items, EL_STR(", ")); + } + items = el_str_concat(el_str_concat(el_str_concat(items, js_str_lit(key)), EL_STR(": ")), val_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(EL_STR("{"), items), EL_STR("}")); + } + if (str_eq(kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + return js_cg_expr(inner); + } + if (str_eq(kind, EL_STR("If"))) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t cond_c = js_cg_expr(cond); + return el_str_concat(el_str_concat(EL_STR("("), cond_c), EL_STR(" ? 1 : 0)")); + } + if (str_eq(kind, EL_STR("Match"))) { + return js_cg_match(expr); + } + return EL_STR("null"); + return 0; +} + +el_val_t js_next_match_id(void) { + el_val_t csv = state_get(EL_STR("__js_match_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__js_match_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t js_cg_match(el_val_t expr) { + el_val_t subject = el_get_field(expr, EL_STR("subject")); + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t subj_c = js_cg_expr(subject); + el_val_t id = js_next_match_id(); + el_val_t subj_var = el_str_concat(EL_STR("_match_subj_"), id); + el_val_t out = el_str_concat(el_str_concat(EL_STR("(("), subj_var), EL_STR(") => { ")); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t pat = el_get_field(arm, EL_STR("pattern")); + el_val_t body = el_get_field(arm, EL_STR("body")); + el_val_t pkind = el_get_field(pat, EL_STR("pattern")); + el_val_t body_c = js_cg_expr(body); + if (str_eq(pkind, EL_STR("Wildcard"))) { + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("return (")), body_c), EL_STR("); ")); + } else { + if (str_eq(pkind, EL_STR("Binding"))) { + el_val_t bname = el_get_field(pat, EL_STR("name")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("{ const ")), bname), EL_STR(" = ")), subj_var), EL_STR("; return (")), body_c), EL_STR("); } ")); + } else { + if (str_eq(pkind, EL_STR("LitInt"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" === ")), v), EL_STR(") return (")), body_c), EL_STR("); ")); + } else { + if (str_eq(pkind, EL_STR("LitStr"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (str_eq(")), subj_var), EL_STR(", ")), js_str_lit(v)), EL_STR(")) return (")), body_c), EL_STR("); ")); + } else { + if (str_eq(pkind, EL_STR("LitBool"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t bv = EL_STR("false"); + if (str_eq(v, EL_STR("true"))) { + bv = EL_STR("true"); + } + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, EL_STR("if (")), subj_var), EL_STR(" === ")), bv), EL_STR(") return (")), body_c), EL_STR("); ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("return (")), body_c), EL_STR("); ")); + } + } + } + } + } + i = (i + 1); + } + out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("return null; })(")), subj_c), EL_STR(")")); + return out; + return 0; +} + +el_val_t js_list_contains(el_val_t lst, el_val_t s) { + el_val_t n = native_list_len(lst); + el_val_t i = 0; + while (i < n) { + el_val_t item = native_list_get(lst, i); + if (str_eq(item, s)) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + js_add_int_name(name); + } + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + js_add_int_name(name); + } + if (js_list_contains(declared, name)) { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("let ")), name), EL_STR(" = ")), val_c), EL_STR(";"))); + return native_list_append(declared, name); + } + } + if (str_eq(kind, EL_STR("Return"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("Nil"))) { + js_emit_line(el_str_concat(indent, EL_STR("return null;"))); + } else { + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("return ")), val_c), EL_STR(";"))); + } + return declared; + } + if (str_eq(kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + js_cg_if_stmt(val, indent, declared); + return declared; + } + if (str_eq(val_kind, EL_STR("For"))) { + js_cg_for_stmt(val, indent, declared); + return declared; + } + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(indent, val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("While"))) { + el_val_t cond = el_get_field(stmt, EL_STR("cond")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t cond_c = js_cg_expr(cond); + cond_c = js_strip_outer_parens(cond_c); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("while (")), cond_c), EL_STR(") {"))); + js_cg_stmts(body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("For"))) { + el_val_t item = el_get_field(stmt, EL_STR("item")); + el_val_t list_expr = el_get_field(stmt, EL_STR("list")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + js_cg_for_body(item, list_expr, body, indent, declared); + return declared; + } + if (str_eq(kind, EL_STR("FnDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("TypeDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Import"))) { + return declared; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + el_val_t cname = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// cgi block '")), cname), EL_STR("' — no-op in JS target (server-side concept)"))); + return declared; + } + if (str_eq(kind, EL_STR("ServiceBlock"))) { + el_val_t sname = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// service block '")), sname), EL_STR("' — no-op in JS target"))); + return declared; + } + return declared; + return 0; +} + +el_val_t js_strip_outer_parens(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t n = native_list_len(chars); + if (n < 2) { + return s; + } + el_val_t first = native_list_get(chars, 0); + el_val_t last = native_list_get(chars, (n - 1)); + if (str_eq(first, EL_STR("("))) { + if (str_eq(last, EL_STR(")"))) { + el_val_t depth = 1; + el_val_t i = 1; + el_val_t balanced = 1; + while (i < (n - 1)) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("("))) { + depth = (depth + 1); + } + if (str_eq(ch, EL_STR(")"))) { + depth = (depth - 1); + if (depth == 0) { + balanced = 0; + i = n; + } + } + i = (i + 1); + } + if (balanced) { + el_val_t inner = EL_STR(""); + el_val_t j = 1; + while (j < (n - 1)) { + el_val_t ch = native_list_get(chars, j); + inner = el_str_concat(inner, ch); + j = (j + 1); + } + return inner; + } + } + } + return s; + return 0; +} + +el_val_t js_cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = js_cg_expr(cond); + cond_c = js_strip_outer_parens(cond_c); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("if (")), cond_c), EL_STR(") {"))); + js_cg_stmts(then_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + if (has_else) { + js_emit_line(el_str_concat(indent, EL_STR("} else {"))); + js_cg_stmts(else_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + } + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t js_cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared) { + el_val_t list_c = js_cg_expr(list_expr); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("for (const ")), item), EL_STR(" of ")), list_c), EL_STR(") {"))); + el_val_t body_decl = native_list_clone(declared); + body_decl = native_list_append(body_decl, item); + js_cg_stmts(body, el_str_concat(indent, EL_STR(" ")), body_decl); + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t js_cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t item = el_get_field(expr, EL_STR("item")); + el_val_t list_expr = el_get_field(expr, EL_STR("list")); + el_val_t body = el_get_field(expr, EL_STR("body")); + js_cg_for_body(item, list_expr, body, indent, declared); + return 0; +} + +el_val_t js_cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + el_val_t decl = declared; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + decl = js_cg_stmt(stmt, indent, decl); + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t js_params_str(el_val_t params) { + el_val_t n = native_list_len(params); + if (n == 0) { + return EL_STR(""); + } + el_val_t out = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t param = native_list_get(params, i); + el_val_t name = el_get_field(param, EL_STR("name")); + if (i > 0) { + out = el_str_concat(out, EL_STR(", ")); + } + out = el_str_concat(out, name); + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_transform_implicit_return(el_val_t body) { + el_val_t n = native_list_len(body); + if (n == 0) { + return body; + } + el_val_t last = native_list_get(body, (n - 1)); + el_val_t last_kind = el_get_field(last, EL_STR("stmt")); + if (str_eq(last_kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(last, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + return body; + } + if (str_eq(val_kind, EL_STR("For"))) { + return body; + } + el_val_t new_body = native_list_empty(); + el_val_t i = 0; + while (i < (n - 1)) { + new_body = native_list_append(new_body, native_list_get(body, i)); + i = (i + 1); + } + el_val_t return_stmt = el_map_new(2, "stmt", EL_STR("Return"), "value", val); + new_body = native_list_append(new_body, return_stmt); + return new_body; + } + return body; + return 0; +} + +el_val_t js_cg_fn(el_val_t stmt) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); + el_val_t params_str = js_params_str(params); + js_build_int_names_for_params(params); + if (str_eq(fn_name, EL_STR("main"))) { + js_emit_line(el_str_concat(el_str_concat(EL_STR("function main("), params_str), EL_STR(") {"))); + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("function "), fn_name), EL_STR("(")), params_str), EL_STR(") {"))); + } + el_val_t decl = native_list_empty(); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + decl = native_list_append(decl, pname); + pi = (pi + 1); + } + el_val_t body_xformed = body; + if (!str_eq(ret_type, EL_STR("Void"))) { + body_xformed = js_transform_implicit_return(body); + } + js_cg_stmts(body_xformed, EL_STR(" "), decl); + js_emit_line(EL_STR("}")); + js_emit_blank(); + return 0; +} + +el_val_t js_is_fndef(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_is_top_level_decl(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("TypeDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("Import"))) { + return 1; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return 1; + } + if (str_eq(kind, EL_STR("ServiceBlock"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t codegen_js(el_val_t stmts, el_val_t source) { + state_set(EL_STR("__js_int_names"), EL_STR("")); + state_set(EL_STR("__js_match_counter"), EL_STR("")); + js_emit_line(EL_STR("// Generated by elc --target=js")); + js_emit_line(EL_STR("// Runtime: foundation/el/el-compiler/runtime/el_runtime.js")); + js_emit_line(EL_STR("import \"./el_runtime.js\";")); + js_emit_line(EL_STR("const {")); + js_emit_line(EL_STR(" println, print, el_str_concat, str_concat, str_eq, str_starts_with, str_ends_with,")); + js_emit_line(EL_STR(" str_len, int_to_str, str_to_int, str_slice, str_contains, str_replace,")); + js_emit_line(EL_STR(" str_to_upper, str_to_lower, str_trim, str_index_of, str_split, str_char_at,")); + js_emit_line(EL_STR(" str_char_code, str_lower, str_upper, el_abs, el_max, el_min,")); + js_emit_line(EL_STR(" el_list_new, el_list_len, el_list_get, el_list_append, el_list_empty, el_list_clone,")); + js_emit_line(EL_STR(" list_push, list_join, list_range,")); + js_emit_line(EL_STR(" el_map_new, el_get_field, el_map_get, el_map_set,")); + js_emit_line(EL_STR(" http_get, http_post, http_post_json,")); + js_emit_line(EL_STR(" fs_read, fs_write, fs_list,")); + js_emit_line(EL_STR(" json_parse, json_stringify, json_get, json_get_string, json_get_int,")); + js_emit_line(EL_STR(" time_now, time_now_utc, sleep_ms, bool_to_str, exit_program,")); + js_emit_line(EL_STR(" el_retain, el_release,")); + js_emit_line(EL_STR(" append, len, get, map_get, map_set,")); + js_emit_line(EL_STR(" native_list_get, native_list_len, native_list_append, native_list_empty,")); + js_emit_line(EL_STR(" native_list_clone, native_string_chars, native_int_to_str,")); + js_emit_line(EL_STR(" args, state_set, state_get, state_del, state_keys, env,")); + js_emit_line(EL_STR(" dharma_connect, dharma_send, dharma_emit, dharma_field, dharma_activate,")); + js_emit_line(EL_STR(" engram_node, engram_search, engram_activate,")); + js_emit_line(EL_STR(" llm_call, llm_call_system,")); + js_emit_line(EL_STR("} = globalThis.__el;")); + js_emit_blank(); + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (js_is_fndef(stmt)) { + js_cg_fn(stmt); + } + i = (i + 1); + } + el_val_t has_main = 0; + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("FnDef"))) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + has_main = 1; + } + } + i = (i + 1); + } + el_val_t main_decl = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (js_is_fndef(stmt)) { + } else { + if (js_is_top_level_decl(stmt)) { + } else { + main_decl = js_cg_stmt(stmt, EL_STR(""), main_decl); + } + } + i = (i + 1); + } + if (has_main) { + js_emit_blank(); + js_emit_line(EL_STR("main();")); + } + return EL_STR(""); + return 0; +} + +el_val_t compile(el_val_t source) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + el_release(tokens); + return codegen(stmts, source); + return 0; +} + +el_val_t compile_js(el_val_t source) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + el_release(tokens); + return codegen_js(stmts, source); + return 0; +} + +el_val_t compile_dispatch(el_val_t tgt, el_val_t source) { + if (str_eq(tgt, EL_STR("js"))) { + return compile_js(source); + } + return compile(source); + return 0; +} + +el_val_t detect_target(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_starts_with(a, EL_STR("--target="))) { + el_val_t v = str_slice(a, 9, str_len(a)); + return v; + } + i = (i + 1); + } + return EL_STR("c"); + return 0; +} + +el_val_t strip_flags(el_val_t argv) { + el_val_t out = native_list_empty(); + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (!str_starts_with(a, EL_STR("--"))) { + out = native_list_append(out, a); + } + i = (i + 1); + } + return out; + return 0; +} + +int main(int argc, char** argv) { + el_runtime_init_args(argc, argv); + return 0; +} + diff --git a/dist/platform/elc-asan b/dist/platform/elc-asan new file mode 100755 index 0000000000000000000000000000000000000000..8b4727a6229ff0bb7bce3689ab2c3276c72da30d GIT binary patch literal 705496 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
-;O`C*H&o0jXcDMY^pb225rgjO{6P>
zzWRl}{K|QtWBA=E^$ET>gZNlE>7G-(vM)e>cTfg|T`Kb1A^G#1S!vFY;rss~&MxHc
z@r;lC2z(p+L7_{Up9-Bv$@`;}o9=go<~BF&gxIqgY44M?#9u=CrNkWpZ{HL;4?Fxc
zDVntXhbdz(-?#Cd_(C(hjsC){j|y)aCdBq+&|d_7`aSeP#-1&trL6jkEH}aDCh|GJ
zb7qv@XDRJW=EI`%dicJZbR#^UiJbxKgz*QH@QXZWeq(&B>@<8=X*PT&_TQwzMx<=~
z3g0_X;a?6vS#dT@jJ?(^4R;N}v+~)uaSU(V8FaK;n(I^=X`A++>{ando7{*Dc%Di+
z+3)ZZe*O3y$~oe->p5dyzMD44dvptBNjy_8Guz;|h_BipaRNLyQ5S7odFC9ec%q*p
z3p=d#IA>oUho=X?KE~cRp4~pTin3ViNy<1kP5eVToH@&@D~V5->|y&^gY&#wl~ZY~
z=58JKIyMshtisrfKbv>e2Y@N(bbQ>sQ!78M`^$k+Pty0WIaniNpEi6v5KLZc^TA&H
zt9ch0NFJQ{*Tu#NZ%0*KR(-C@AMYb|S{aYNNnX>^d8WjM>TtQ2cZhygG&!Shki3Kc
z@9-jWyIHGI>wv}R(eydR#Xs7ynP2~xi@zm%
zL*zVJ@y+@NFw~kI>pL%LfBwUq>nQ!MeMa|TpFXGC=d5qb*lx!2n{?beW$hjRio@+g
z+YYx3WgUGHXXq~MnhDO6q?fVWxj)qMt-z09v+jFZ+w=QY{Ko{RZpvPQV(MmV`+_!q
zsJN^Zyw(<;*%!s$khWHf$MPPIuc+{qm7l-D2V=M4NBLlAenxcXN6Psl@$^^tYkbM@
zgujL>BX2IAkO?vje0kv9z(t;c9lqkSPG9l+9L$arYYUX`N0>TFbsZm#8G*qJj{9N^V-~&{OIOJW#Kcy+~-w`XTSn
zWV5SE9-=kQVH`(X=Xe>?uf;?E3D;I51320|re`zk(>!b3(*
zp5&e(>u#YI%O|--Xw1)%r}#wT04#KA<~!+gEPRiB*1bgSmhW*pzQ?}m
z9C@qm`hty9F^9a(>5_gfm8T0b@^m42x-eBYd;_dJ%^^>>X2;_D92?6=Jo41>o;RK?
zPaWrFO!B7mr~WB_u|)s!c!w{$U)l-22Q8eA_d@Z`^Ll>39C*Jfr(S7!qTfq)yhop>
z{iqY~q}t+!vvTQ`7iej@;3+SzwMrfb!XQBjVbgx
zM+K7|zj&xRF!6_t^!fCOoL56VP&h+8oVCQK1@cLk8yKGtWPewcTu8hI9|Nmp+H~EsWQC+;@SQI{M`6g{cY!Bkor)*S160W6I|5Bzx$o3(1lYabD|jfVIT4@-B86
z)_0S|*Q(#RpK#=S|I}fQO{5On*%EAL6Nc+|Y-q3ZT#v0s&Pd7AxNVai|mCQ}DO^r=$T
za&Lk5#fposa;xznp}fRCSV#RCbRK&t?_T=u1JIPSQdK<~
zN*wC^Sm~drL)3>fKg^em4Ul+p-=fqRV*`}BQw86Z{C2yqnz*K}_=!XPjtfuu>d00p
zn_k`5w$tt3Md|&`ZmXV*82aJr3H?jndV>A?mJeG`@L}_Jtb3UJseVuL7?!>zqn?at
z#_#T9)f4&+?B5aW-%8Gu6IhewTb}t@&@V)vQ1=!vK60Y)tN&dg>r18BIZL}F
zZ$<}@K5D7%qyAC8qf5xxy`M4NvCmz`d%BLWIg5^vO+VNhzhy|W6!~bC@;g_cLkoHSc_OkYcZE`oW=my;|`2H0eqh*1@P&&TYQY8;P
z(FHPe`__t~Df$%)+Vbi4Yc2Y+mh0;FmW*UC^vBib=iBtPKA$Nc(VOgj(ut3t$KPPn
zM~_l-R<$1M$ft_BVeHMazdB8KXI^2-TFnE{xw4gmoTqq|#z|P~v8J9Wn>+PxsoHlh
z^-HkP)1+)Nb@-34KHJ}5`cit@56Wc?;uh90ojV0G^>;awQO;dFfu6Vj1I|}OPfYM^
z#uIr?z>__m$h+i4)@e_o6aFvvp4d8mdjFidlNp*n_n)MHma$95rrn=%)++6Byg~QH
zMhB!1GI#o@Hf@jPtX3FvGqd0m2I<2JpJo-x={WSX;
zl1m2SgIX0#UV~0h%XcsOfz%5*S4+k)wXVpxRZu?|M|{$JX#Ie=#q|H8OZrDx`awg`
z8JqPS!PX&Lq`dnT(hqv3>jzhVf;~}SsQNcW-HV}ohS`g7(<1K7SWEp!@8QhPxTJ_4EOeo$vW_G
zZ?9M_^=^2`ACvX|xAEa>Sd@Nu#?{FE+sOZ_khwdfa;xlB>El(ppgX6D5T}^9jOocf
z#FhDue7m4d%{vavT(tA-Ozz0tD&fuQ4DV#0-Og{x^NxPl=cL@n(epqRGLK3;uUEhC
z)OT}uoxL9+ugsOkSE4Vv^Q4fTbF9|&1=^xdIzHRpGhfwy$xEhFr*~4fcW}QPeUv(f
zycz#X^r0f^^>^9l)(^RgPr01&F8{fjTKvt~|_{
z1m?Xun0!~B7f?p;2IFC9_kpg|?`VlfWSA7+VX4C<&{y;Ee)yv>CoeAcI`ij%`i=W1
zd!;VlKTYtF(~=^1fbOTEUk8pnOWpmH#;e=Lx){%Q_Y1~Xf?W@Gqy+gclD>sAo1p(A
z@Ef526Yv|L|5NDSy<4^Q_)6Lk?IpP~bZ_NZ(GLA&3X@*oWCvnCD7MI2NGRB
zfzGGS-Z$x>oj@l_OUJvUJBeLZ^d|A!_zk+`e`ANM6CH}*bL*z#W9IGV|7Pr(M(4Uk
z_=a9Coy+AlL+2`@FS`G|biFH|Za3j$;*11maVAa{pB(0o-?aT~(sV#yFMAAr#@}&F*W8|^+WD8O31s>0Uz+NZ%Ti&$JX`M*vfrWcT?YL`KH=C{biVOQ|W&)
z-lyq*JyT;VVJiLuw3)Te*eZTXa`*C8&Fp_%r1d|>!Gii9V|fYfBbWV;_MR-EovGhC
z{R@T~Ki8+`^u@a^+s}U5nC9Js&GS>#?b^MbWOy(6d&-l%R`&Q2=Th2{*>fen{Nl5-
zMShEq?ht=|v7wJ3t+d(Nos8eKbJ4Z5&C%SGl=Rad(ElWxChGBRqKt1n-0`iHdLKqs
z5&DaAEwXDIxg`2)RoToCVROO*b~N>{#tOQzlM)DnI|=k
z*Zho6A8$t)e)x_a6pxN?j(?T9BR)`S>_sOMe?yly`~Wu_8_7<1qmR$Z8{ZFT-q<4*
zSNWapj9FtMW!I@XBfJQY@b)@9N}QKu{q=jE$qD)WvUhS5XPPvX@rQocv`yDF`fNE*
zTXb2oKf>?DM#I>2zsV0}8YP~}1Gtb^2Y;WN
z?EkZ8bx_}Tq~19@I14_`{_nW|66A@z)bj}L_R{|As?HG};9G=n
zNgI{-D~=8gT<#f2{Zr@CL>ZUG}HE7^@hcH=GCVFz=|zX92e&mlX$UvFerL%eY*
zUBc*ost%z4F^`MCr01c`x#A)_v2)9KsNztL)RS14@^7Y|sBhASc7i>^b4K)cIqOFG
zqi*826y9YVwskG^yjD|hXTi@%hwp4_QMH8iH@r)~Rw}fe^&!C&87bNH19zY$n{k$G
z#(^==!N{~T)$;v+M(cJY*3?Z#^`{=KTNFdWI?^U5<8Lx=qTaSNFPmMbwXIV=XovMINGg;01FWGSH
z;1%>Ai^wZugnt0%3~Xa;-lFrggM4fWsQ_luPdM}0t*U>m@~HEh+;Mxa)xYkgf1Q=1f93ll@HkxN{X)A+`s?6i_5!Oj(V}1|
z`t%24|8ePWv*>Swet8c1d|#*Oi|&Bl8y^FGzqh1njM2X&pE72V?{>y4xrh9&k;qMC
zGlH`zkk|M4E;bhNGH*IG~MCM)8&vSN%DJBgc@Mk_Cktfp&OfuUqI8v11x{Y4i2MbIzHL7(rRGO`+ttfps?6&OlZM@rWO+Gn-zTr{kwB$u>4!w{UxbLg1y{14C-diHqUSK1YE3XSJ}+P}=l6+eF~3L3d)n~?dz9onXJoa1x2&W7rQ%h8ByydMIs1Gme=Gc_+hk9Q#P=6_
z1~Q)=ApTZQ>N$sm-Jvmn!Elhz-tr=F6`>O`gQYC$>4_tMw6?U&!4L=zJO%yB%xVnPseS@nKcC*Jr`K
zp82}Q75)^(Oig!B1S-ou=Q&YOI#kHPFqJ)iu}-Onz9y?ij1)j_7a>-y*Np
zio4pVqo0=Nsr;p62rhQata%xx^D-(+UPc9zU$gUq&#IJ>*fTR}nY!PJ{Zo}Uw$g5S
zz=runn;y2#-(x4;0!^7;OCRs&u1=}*oxL?3Y^dGnU>{v&WPy!Td{EIbRDXSLT{ZiJ
z=U^x8q58q$=sV}z#Xq!!KBdU%Qv%cl%0Hp|7s->D*o{Q
zl(-$#73tgl8o$$DX?h9j3}gJ{bL*<8D@Be?J>zak@$ET9UH=VrP~8nleHFW>*zUzf
zznk(FJN;qCc-ixr^Ik}6KQ;3GhW{M%FXq#JHUFBxne=MD)$&c+y!d0u++WSPL_bZNb6LJ*gsJ%GyHRx9`f=!M=%!*9yb2v?B|4_^
zQ$WuwIOiJ4T*=#gFZE_Qld$=QnE(01UCKv6^t=Tg<*ShJbbVjpqm#LNs+rHsAP?vn
z&v>{C`(4S`Eb?&k|2ZaS$BG}qW^)c4e9L@C&c^w;y6P-lAH?3|=ZuL~eV>Z>E`&$&
z4SiJV$utjhV6e)uOMafZE9ZsE-gRjgj=y2?Tf>cQbGp#-ocWHiZSpR>tGq%}=9Fg7
zwE9*>ICHLWIcKjTuK@BIbMCR1*Gn_{*UOadwwr!-
z4}GurCl%@||G->9`ft(2l%IT0{D~N|W&RUjyx7N?Lk^vxy6?37+uXi$Vb`x*I-ENr
z{%iD~lD7`6ABoHy4Ds2&q$@B&eBG_Hf($KmtCw6_auHscc5Ge|cxOS+lCI9iy_OM<*CyrC0lwq%JTvD{RJRl^^tlZrJDtMRr=o=}yLO_db~3
zVD?F+`zUu$|8cmUAGqW7ZRmG3`{;KHj@h#QEn~IpAKH!Hc8c-)H_%xGul87-b{;}Y
z@hkLU&zN=MR_@Yb&e>-At;f;p{uv!l&MuI>?)$jYD^ni3xTEVu&37yN*k#}QG^KBe
zUncw3eb)V4ZhM;3^{kzSed;O=I-~6G-RHCRy1Qv^?fQ<9&-ax+gI>$Lwa6I<6gKa&
zXSd^DQ}TD~@V|2Yq)Gp@lV0k+-?Q2Xr#!e_zHq;)N{r0%P^AbdzXxu+@g
zA@~@n`M{TheROhW+`=v|>xNESf-m?fV(+#O9rRO*-ca%-b8yd@t1P~Ll7+7;Wt^Zq
z_Y+^}$~d$S8Hw+-IkQ6cEOXYF+eQ+%S$l48W6$jqw8t!d)+hM>X;T)DJG!alyBQsE
z#D*R*m3Om#A#*-tj&11^a^{_qdHaI4#5AwFW|)}9x@TW!&G6T(=kH)V5PIGo8>$CO
zz8T+I8PCRO-B7|F%93aNdQ_gpt|0rQJHBP*?RqP3*ORwz<;WY~&#~`F#`47WRNkJN
zB=>I3={m7h>NkDA(WbXL^F85T>Y3P1gV7tLZORK)*gk-<4xMa~31V707X^k>l;^
zOh!}J_KFOBB13FteN10s#qsovNx!iRU8fcO2>dk)kyiS~XoS^>pxd@w}V3dx&!BsT=~uAynG}7nL(wm(0-I&{|VZnGiT`^>zb(RHM)bMR{^~l
zS;}JuXEU4fsGvO1Aq+if(}y{mM(VMu`O_d$xGD(%)MaXu(
z^wnxUAkQYvK0POC)qThaXu9b)^o*V29P#1Mc&Mj|Um_98panGV<9J(o5%k2W^1s|6g1W8xV)NA=jP##7|G
zkGRfwTBDxDhgrtbyQB@&4*c;af5lx#Ix?zsB`>F3FG^rvnp=0
z`DVr2t-lGa=N;eF;**viY7{%Ro=5J`(r%Ug7dzIGJBc*951W;YCo;Y
z0{UX-lKrW&S5^GK()Ow@A?*^*6QT|Zeg|t!wIjv$23DoQy5B#?!D-=)J@F?9W1lOF
zr1*pfg-N|om`ey38seWMHi!dWr{9%y@DgY4_8H+#;?!X`AK~d0dl%Zm$HPVXJVwIK
z$Tv4m&)6S$mvmudrTiLJJ3eW}(3E|&wCng?KF>F!z0flxA7$Oop7+Y01Tf1t^osp2
zb^LsVCsvE!E%#`|!$pp-WteginNe=vRd~EhpRs{+J=8lgmG>`^J`8{Id_T|9e!0sc
zUL$!MNB)sjG4+G8OZurB$O&6#il;HW%boy-pWd<83_nl7&r^l@xif>G+bw?PTl|cL
zpE_hw`$jOnd1pi^VEj;D|{cWzst9}CDdE;
z@?*YZV^Za5WR*>J*Jki~wZ&^0&rQfp(o4CPAv5Fu7(i}HP9}^pH(^o-#m0OSZD1^Q
zwS@B;qU_NqqrS?wGTMjw4d`Fmk-P^6D4LUH4MElfvie!ThsTRfNPT&PeIgRq_OloS
zKdO9*BjsB>LjQ*JZ=L>a*1x;;@AJ;D|D>u9PM+6OU#)&ybU$P|Pvr3rU}ySYocHy_
z9*zINx8+&>KdF22<+%fhagEE;M|
ztGKic|ASAQtU!kJX|29X&!KAHFf?^~bzt#%jBTdcUjK
z)xG3h=!vZ4?rl38Jf>W@$E1HOX2o&xx3G=*UR=$a(c4Au
zH@Zw>g_X}0pyF!zZ4rPI=_sq
z`^bmrr)n;lp$E6>`X+0o`|b4oNsk_=(j!O4F6c0~MOPDD(B#ogkM6g_r1!x;`r8<=
zRUM@+w^pR;k?6MP*3Ct)t;P=9)3L+0i0{sYv^)HFDwOZeH(VPkbyfU!j15&}E$b_?
ze&h0i9jn!xdCsd*I}kc_d?KEt}K|DC!n@8-UVR(&_3v+>#MpB=ef)<*qietenM-36aAxL)v?cVHg~j6g@C
zZ*t{e%9H-!YJ)=?QtJzhLDK&jf2Et0PJCJ0CY4{Ew+Ya!gC=dZ8%^5Z#YS$(qJz0?
zpf9wq^e|tzv#XQ(AHe^@ZUb)ppnezIX|JSyQNIKCM=49Ofs!BUcAy#TQCYA@afb9z
zryr1VQ0of=z@|PcZ02?fn|9KTZ)poUt;|DYuIIl$Lisv?DxQ{xD_UZ2=H{l1&Ld@(JoXY5|y54T^Y`t#QIJJW0?LQ~ny
zl|A&bu4T-nOx$zp=FnDe<-7*RC+2*GoN00a^H876LsRXPby;&B+DlrFVKru6fE|YU
znZj`POe#Fpj%6K$^^lg!Qf;~7a_j7m)EQ^~Ea#gwxOL*ru42~TrQJ}6R=2ia+IB+w
zNjvAI$a*pBy_C6IKU%CaOj;JU10-`xH}8X&WvMdv^q<)~thQxk-Dm+X}jeyN`&mDc(Vw$%@1G;Rc5>!jIhi?6pb^
zd2FcQsIqBa*hU$u{ZZn(=-3cTyJVlTTi-VHjg7?K_ettK`kc~JRe5{+sq&VxXssx1
ztJ3wgPTGm5zjNnbfi$vj%av!wnDtR?H>WSrx&!TA<&(RrX`}P(`j@SZZq{Ro-A22W
z7wz+9L!a?Z(dQ0&ukqs$I|6f3sryD2V#h*8e0SP}`7Zp(pV%tSt-Bc;g+3dl0w3Mp
zo_L~nFrM&v;{Fl7)z9^D_)qwl?_H7c9>{pVHsk$!J<`+1Gv5C#XlCa#*Ft{GT!H8ywA^gUzYJ6$$0rou6N1y#F%e{nr`qC!Kfdt}eF=
zV+nL1_uV@{z2D`AJMVXxcke(IKHt1IJMVMc_dzQB7W3}?gnF+u@6FEpjpp5ZkqQsF
z?}OF5+UF?s$~#28Pd4Gr&iiM~yZ2%hE_)rFdg#1gZQi|?sPKUMK2*J5Vcwga_YvmZ
zd#MV)+Ul7}n>=!=VK1}tkyV@6{|5l*;
zdbRG`{SKEp%5ubpKCw18kA`fiD%u<0x4j|Zmt`dhZ+
zmt;&f^Hus*Z9D#k*h?eOqwjmhf2KT_?f99%Zgu~-yHEHg>F3+K*^ZwHH1{oNJN~k#ne=tx7mUeoIkGM{+qn$+AvB{)4sRld`W$lL`*tIT6(R@9
z`JIce+x5=v*Zmv(3C@Y9#WryVYit^8Ay|totQRe;7r|Pb1B>rpF<4I%Z=tdsOjh+3
z+RpmUC0)-WS0{ghDdz|>*PIRJTnqC_3-d{6&CP+y_prg7?f61Sc{x}YD_P4tUi@H5rF#6FhN^)*hW4Q-u;
zvkn~Q_*r#*zF%Q*n7^y~%)CW(eZdhKiw#clrk=N}^$kbwCx1pB|E6S5eU)$2z0@8X
z{4tb#JZHq-^`i{=?8nx|*@b6RS!K+N5=*T-EF}-jf3oI*@BcGcx5=>?vSQBjoU6|}
zvP#3uoFmP&FlU09XO8rm!8CIuBR4RWte9g-p4BtMk>ggq%`sP_+xz2)PsqkqlFleri+x5-8>d%zley)#aVEO#NRzYte+QnA%aelJt9
zaQsrj+P=KYM}9TmOAX(Alk!*f4c(vvz0T+dAH{F9&hUyZk;W_Z-_m2c=yk&DE5sGP
z?LR&4DO*xl_s=p`C>skhmGSs6b`D8n@4FKJg&}fhOvX6w$YoL2`Ig=pJ^`t->(g}*
zXFrmn&-~rlTZG>{dWn%otJarf9b%-;ugvwuzN&nYvBNp(^6yC+WMoBKlJP8nz9oIc
z5!e3W;AftZYVc3czKSgT4(xRbAAMTto8dQcjn#Iqq3u$Svi28zPh6z?3#FSgcC8t9
zUF(`Ruk+KtK4;cDFAQ!P|=r+
ztPD?LpL|mDq;x07IFYUFQ&8zz^nL}~mhRSz1zrDS(lQRKy`iRTweOfilk#QlNA5`O
zj(>aCRzpK{H`=Shr;kh9lhAJ6o7T>~X+GL;78{wY)2w#siLVm+88)3%83~5ew~P24
z+?^l#v=utN^l@X5g()K`57F7bi9e({!)*+EjNLq<*QedR=E`Y)SGCKN=%?ayBr-<7
zSG)}B3NTmMhtEtbSw2aH$u~g?NkH7eMLqo}!d(s3y(^tIRy5p>U
zPTM|o?Cdh0({-^+?^Z{~fA+3^-fagCKisQB9<%$E_tWV+4vQ|Al5u9gb|3Q-r;pM!
zzfYV0L8{H0dVJys*#AG_v}q}ij_>O};z{8FzqzM9Ns)0bKlM(XHt}STJE%x&WL)O7
zedz3ufefwrlbc88
zNAoqds*fwQ%$WnJ`p7&;)yJi&yt!$Y29wiu+QdT2d@*TteN4?SbbDZKlWYIeXKehr
z8h-}yXQnU{k6B~pW5{zR@v@aU-!C;h&Cq53FP_!SnQeX=^ea;I-8@yW|3|0qn3i7V
zH);K+(JuRp`HV~FdTe@wtai?vMfx&XQ&Dog#^cC!LKYq-1e1T#X%k~fa}8;8$#oR@
zxH1ckD}%{5ZTwLhe+cm}O~vQzfYe&cG~{|I@v_O4@Bd+V8WMEc5`Aemxn}4(t~>?>
zlRwbuJNl=~)zt6HY`OZ7kF=@Y7Oz9BHYI1j_jY*A+NKEme+-^4)us%V^wp}ruDGj>
zImznavGb1ZluKW2PxoO>*JqU7ETzw|Hs|Uy=rXb{X!->s57|$2pD7=78D}3&kg-nd
zGw3mDtVK8KmX>iNY|^5)D<1(}Kis}nXwp}RE+aZpHyY?cw;37=U+Xi>>-I6GT~f>FqC5mpNzJhM~ERKBFns4ow|C!T9)s%M-pe>vSK(
zc&Pd~#zQrB+?OToeZl1Sb=m}Do*ExbA9ra=mwAA)mND;Gjg)_CtQ&G|sy?i?>O;Og
zKi{%>U7>mXkmKCf46h5}HQP96WR+)}TW90{4aT`T!_y4iAKT-c;U~{HcbiV1cbqeH
z@{Dsg+WGp3F!Ot_!U18(@4aT`Xh9@)5(azj)&hV3Gob&4RdB-_J=Wj61
zy*0q;XF76>b7Gf~F>b@jLStOIO(tz$LCb~izJjoeb{l&n7dv!eQxB;-6Us)Qi*O!W#5zkl@;(?Zc$1N%@RqR;z4mA**`&)Q3}2BKxE~w2
zMBeo#n@;=UD(wN%9?X*VU?_Qyo%VoEyO;Qax!(moYR)|s?>B`#@ozgn*S
zEfhaOXD9UbWTCMql)Tl@5Z-rc{D+DEXexeqqR-VG!xJmwkw=M_MK`GB`$R+U;SlA>
z*!4Z^Q|A0(!4Q77K!00`z8Pm~w}s?9yl)Q2cUJMfMf0K#IQ0&jX~<=_6}H$xL0v)J2u2252;9q0tyhzIUOOrv{y;
zCBzq5EcZHP9L81o
zHXk*bk1FENO2rTFElQR3-g3^@%pqI8|G?0z3dvgdIr!ZZ4PY)%(ZSq^5F7LhA8Qt_#NIx}8`l+GhKN+5+u1(Q-97lYS^>{7o
ziCNN43?;vA(vFk3q}A6VkA_}Z78+%t(t?1SriE^?aqovHZYH&S*Z>P$S+NxW?G<$H;tcUt*#Oy0x0TZiFI$>-fr_d5Irn5R;h
zuB=aSmsfwMy+__i*T1C>r^)*`G+xg_<8}OhH4RngkL!FMCBD?-mpzWWk7Y@FESUV2
zNqaO%T+-@#Tr@gWZxo#)(0d^ZjTeH+qlSi*_YsYMkoeE0;)mB;a$b*|pCw*4IrIG)
zL+@bFsmFis?LIC%1^ojl`mRh51e1GBdg13O&Cedm89&VLqgm2E8ceRX(#kos
zN^jVt({1rMWxOp*+HLH&GHEvj)!D(OjJu8f>!G(X3yqEJ?Kd<;rt39+Bk|X!;>#Ug
zo3(v2{4RT0))FsU8S{OTq1PC6%9ydX+t?q4enX1BE6WD_|4n+~C#v~bMEoVG_+j=m
zy8N)WF|s5FKYSl#=q=Lxpor;Mwzq^)B9snbTv={Kj-SJ`9#dVD)F$Nq`Xosxytlwk6>&BsK|
zM;Yc_rX?Xt=C1oplL3!}3F{i0!K^^d;(L}TS08UuS>U^N)m
zr!YS1e%1Ll26ny5Cw5kM?E7wGsEBQvIV5`x`6kG{!J6VqlE2Fz{P*G4NgM7!_2yM^+5NM%fs{I9qhU*Q@u{{%d39
zGL10^jNM?cHsbmSXEwM4^Pa>cBR(0f0k2h9EGzRTH@GoHWu`q^N
z7{kDzKgo$f*qIBQK0^8AJpPZ>{x3b*IOc9oJm0>y^!A;)t9uXa-0mZ#eM$egRQJt~
z(s!tROZ07ji~G3`YTg~1&i&l@*wP;?X8)zMZ#grX_U)CnXZioMTkX4@_Kn>%myF~*
zn#U}hjtSg3N}Jyj3dY~^mF%zQKC!LzLCUA@N>AGPM2Uqd9f!5-cn5V+aJuc4;``TZ
zjK%D4zEbTko~-i1+N$J1_O!WmX@*tKGoVc!%#{c6A#2d|)p^tKE_a~r);gW^=W^ci
z&>qs?%l={HC-rwkdi`zH>poI9@3Qz+d!erY-|LT6s(zL9Qa6R?zoKqd8J>HizaV27
zd*n}i_RW~JT=|5h_JpOap|P`b>LEXqR9uao2
zkppY5%D)fU?qi&E=>PR~&tvFQ=loJ`Cq1i=7~dy_$vNrmceRRyLiZcG3DtD1_uKZ@K0asW)a~1f^u@;;akMG}c^NY`1W`1cWA1=Qc{%`FU
zwWabqpZu~`oHf7myT0z`cb=PHXAd)eIh=DM&+0BD<_&9z>$Cw!7P3yP>M(22rf+Di
z_=Gj?r}oNZ8_RaF7QMpYOL?-!9FRK9da|m+_|+-BD#ux@3$3*KIg9m4)|4xyFX-E6
ztJ4>VZg!#8&8#(QvxbbHU6n;+A7`@$MuaAJtn$)-#xcX4?lUCY}6<|od&fWBC
z;PT+Z9k*%z7D6Kle~VKz5-+A~u89}R+1rtWKfd>~Fgh2)-)-=h)cnoX{LM|#cKhJD
zq2ymmoOUXH(;c%7f44gPP1F2UK;zHwHzP$OvEAZtJN(Va!5`mGTNs@c@HY+q{;c_%
zr1`r(Mcd`?`cU#et+XAJ41c#f{9UQ}8w-sy@OMp$Mq-7<-wOD#h0glcMeN*C&+xJ1cERZ^K{M;qN_X{?hTkjI$l^ciz$sdRzSUhQIUF
z+idNF?+q44=l=$i9q*xcbZGwm2yJN}@1$tE{Jj%Q-f5-n_#+sqeca>l_on9WH_-Sk
z{QWLPBk@|wcA9t%U(4U+;E(UqEsW0Jz~7tj_gl^1Yns1brD(hS{faYxt+XAl8UDWL
z@b{wT@5j(M34cFJ(MUXD@%IG${VWH6d@t1)9Y4me{zYs_CuQ%3oIkOs>jlmqJFMr-
ztul5FVC6{v>!M
zKJIGo+o#^#xk{fE7atnY7nHvGv?uNC>clE5->bm=*BtrgJLg9z9YOUyoW0!nw9!}T
zS05)&%y-kyYMyK5X)d&%$df0+*dLLi|2T2y=g8BQsXSE;@C@kmm6WNxZ6|NvvSiBn
z&1O87^PBUXr@YU`zLLCcxAL}?yw#Dnhb-Eoth|ka_CtB{M%Y%H{#N4Nkt1*KF_+Qh
zg^etgw-kIz=1E=S(BTX_pvd7Dk%=34kqTX}mL{JA;u#`hjJ_IC0%+sa!7
zc@ula42w2}k7YUXhAqaelXI-RO(JjCTlh^@-kQkU
z^*Qp!_n+F>*mpW7S$P{v-gc9>Yb@GJt-LLT_B9Ueta&5sX`B97;zn}h4f~9nw>m3t
z!^qnx3m;pN+m~3jqHgVNR51Cdjg8GmpF8I0pEAc5`^^xG_5>?$6Uf_;Jb5GRi#Gj1
z#JxL5-g;YkTW#g7H+k!0;SaO&X4#Lr<*iRJxmaT-dc$XLSx51t=84!vS{eJw*{^rL
zrGMJKygWW&&-lNC57^7-Lo#m{f3Ra-xm);8{wsn>zt`~rQ}5b-FaBb(Hc|J!j%WLU
zy>9t|UA5uZ9Qdu}o6MiWud~kbg4gi_I|`od2i9!eolBUCf1I_8WB7rwh7mc+-y0vz
z4@~A};UivsK5Wke0sO!M_<>b=J;@TW;o}FUo!_bYNB
zrHh6eEZ?Vwig@Hec0IS2@2~cD`j4>Ce2RGZ=tQRa;tu_aIQyIj1fDP3D!yTny%t7|
zg;4{>-W(Wwf7Zf?P9^Rh2PbgDg>wUSC1sJ(7GAN&dlbAK7Ty#KZwfSa$gzfz+-=L
zS@hkac=UyqcyzrNU7mHpjTTOc&+Y5OCE#pyaI*D>wS?Vku-+}lj{>aq`03nVrq*`C
zQb#DOF!d&UglBZB@DX2pwecsBaBL#caaJ7?8hmFz^y=v8qIlp(l=E7Pzq3Ut{?3BA
zHV=Pe
zv%ReLC^CGuJic;IdAxpad3@|I>)Yxp2hFX&<>oT#R#kM1g}qH?{ezPT8%f=!rNrwZ31s<9z4RnpNZE9-dc_4?b9c^K;zv2
z-Xe{Mf1a_Ig&Qoq2Jpt`!6WQjnRttI8J1f((>2a$3#Z1ysR3tn9vs4&GjQt5%j41M
zx_(~Ldv4X`)Xy>tbDYK;YGF>bFsFh!G!G_WpU=RIj?;M?XyFXjIQ=Y~(H72VaQfxJ
zA*?DBr;PeJka8QW>*tLF=hj#1`uV=sY4=ioA9$VqrO3kWXJPjPyC@GfVPi9~7l8YI
zD8BN8Q2eT2u57FCdvg`-qEGac#%0Wmp4PbUrgWt+K6^&T4&%2Mc{iAI4MzM4`)1;v
z3dQSBhg5r1crOTEOFVkoJ78ZVnE|%qIn6;1Z#4oU?ZvQWcublLu=x15__^+X#
zsWJNl`r6mQ#TF5H!@@mc;U0n38+r0b*nb*a>APPiF1Cos+rGH+3was(*aafTEc#Db
z^q+$Mu{`t%`=L$$W#VENh;(ZDN1)H#-1ajJKWfo`6#6gZp-wGr-gV1Mw966==-w%D}sF9~E`7F2iUk?9Ikp^2{R{Dh9
zYt!FPT;`~eH#Gg7&}W_)*<;b4WznAn{XKc;6LzOfeJB3mr}OD+1P(BG1WK4DiG`kR7DKXawFQr6t+!8!igTQI?^Pu-?n*fR#7>)E>q%B}eno&Y4I>YbPtoz#Tlwr|<+B(0T%RYO
zgq>wASM6<(cIdSKc>M#x`@
z#7|Q2qQt*H+Q#~SpYY3+-`f@OFn|7@MRWbdm1R+$5q7POHwC-~@aS(9-d*5OFOZ)j&vD>M-#gyIi&}V5@W$uC
zBkUp@Zyb0v;L-moygG2GkL1U}8wsBD#iK2}Y74I#ywQ2^2usS{7_xs!>dQ#*rh-R*
ztnikBLpy-JgEtsF>6?dIcvCFADc}vwgGbn}ZM?zYjRueYS>fT66rr!gU)8}Y0Z;ns
zeiq(H3vVQN{qo=u_PoJ+f&3i`CF_rbk}FGs$-Dan<6ouk4tV?a`6|9jE3tuy{p73I
zK~`c1QNP$hNQB?4cWpq=<8|)Z;NYQehQYD#+UPHKBH|PiN7-0L=--h3t<%5F
z&aZ#Bvbm`KLVQ%QQ)RvHS@PBGZjBZ>tEw3P)S{S5r|nyE&c67k?#8!D&Q=}c-V-l=
zI^w^08NXT10%*Cj>&sexvPL7mvvS7jJmp8R82_2znT^^nOTN!i-=PUcV1(z4oP{N}
z(9CnR_W6xaTb!?ljTpbH9S2jzx
zj)ZsWcVpX(V%yxNzu9)p2FtF={??1&wU%#coN5Sh|GTzpE&|K8YkIByt%RxgQQFpW
z+SZZ~cQ5hRsO_4w^#0cB{QFy#T@yP+iPvd^wq3J$1b61V*5iP`Y3EsyU(;YcmJViY
zt@EsYQrAE6n+^~3#UJ2)*>DZ*jWVab#r>qG-cD}nrPK8y-9@Q%tvcP8DTgrm5c^uB
z+?$N{YGI!2Rd*gls*pkEKH92K@;lsFp!!ZpSB?y(GiT(!1=+W!=u8wkqVstMC>zC3
zv1v`sLThR$xx=P~eIPm!d9E#wSN*ac-<*=8k&&9_XiYN!&6=WkKxmH3LUUXw`4yYy
zNNA3RW{pL2pr$!k)4Tzi6E)4!EHq2m|7+762+hIJoM_Q3(lmQ%nyl|c2Wy)Bve4`o
zN-nf%&VptUG<(rc4=#__|8k|Ajd(QruE!~p_dQOTe9*nk)qcPpAw%n3bQ7WVzM8Y*
z`$YLt7RoM3U09F))l{VGL=oSuI^k!(g4CtercNlHC`as=-=@CI?E90U^npybeMNzhwO@;B0u1YO}iV-mo?4KEHpcV$^Mx%U)D5_=b?E}
z(|jWf%{RDz4L<`_mrn(g(c_Nn>JNtE0jYoInqCd`EZL9Fdo;X>ec~VJy|N#a$NkGv
zZ7HnfCTCEowzP>nzu>@igKgY80bBwuw<|lF#es*Hxc!6?6Zhq>*
zm|vDTJ5EC7(GFNw*XKsEO|n8FILwdP)HnR^`!=AMHS_K4v}
z_&-l5;+Q+}4y54(1
zebp5|-a#L`KeAlc)hPUkY#ZP~WZRhH!If=eFv(%GPMZ;`VGNk<^5x+r%oMG
z{f^Whsgu;FyQSYbtLxQSzFX~QOp(*??4VvXy{+TCO&qIl+N|SxNFfJx1>*60N;m#YOIOQg4WyQy;|qJCJT)k{DlmSSwW{?tG4=C
z;aT!a9)2$Q?bLbcOwUU~=SAJ+VEV^Su%~P6sw~)5!Q{^jwn;NRm@H%5jZT4gFtYZk
z?D13mba@t<<+T4yn(PHs{q#6ZleNHZ{WSXz70roRXinsuFPr8RWIQgIls34My^2+8
zTpPPZjqRnn-i-uH%2DzledH`nzbp&=GW-Gz{Zh(cq|gq=-M$eTstl0*9@95UeUtu@
z`d6p>#^~Udcyyp?cbCT^gSG63X2Bd9Ox|NKMfQWi92j(To?bc+CH(fwlD40^Q^Bcs
z=x5OqyShD`B&v@m$yw`f(Z#_R{Js+^14_eR9TF-~9=OflL_1)!}dhb5d=GUSd5jx1OWc
zbA$EVXg#mBo*%HD*IUmUt>;bF^A_uQoAvy#_57&yyu*6lX+7_;p7&bM`>p4vtmgyP
z^FizRS?l?b^?by7e!+S^YCXSfJs-24k6X{LThDJ;&!?>C)7EpR_58N=eAaq?*Lr^6
zdj7zAF0$%&FYCF)dhTaEGw*Wi&tU6$sP)WT&5bkCdLC^(ms!u_tmpC8^F-@;iuF9z
zdM>w~r(4fe*7Gdux!QWJv7Q%L&x@Srn`e7HSG~tc@Hzf{D#v&8nR}S>{u`e+lpA{r
zgnzm~_-6`)bN^x9f0OctdOX(^2sK;|}f$%RB
z2wz(u{JsL=Un~%Qe}V7^3WSFWgrm>p{a2AU)Z<~#V%~o@<_-0DrWXk3jEcPfZps_#
z@nG}F`;WUR^ZuKeH`L>~xj^_W1;SaA$omhyJnz3-^M-mna|(o47YLtQAe^<9y#MCs
z4fS|x3WVQQApG_M;mqCh{#%eY)ZE-=bSs;Ab$~AfAcVmI@<*V|KpwkP4nq_q>m*wdJ<`xLATY7I~
zZQZ>&iy%}W{J!wA#+-?%8MhS(zjxW1Jf+9tX@T%H%kt&k9;nd%pX{BLNfAfaZ|1{>)5$S*OhTj{xds)6JIH^`P
zUv|&RRe1{Va|OchEil2FS0H?CB>xP%ra<_;b&V_XsR;85gx}kkS3U8RugcxFqD;p++*x51;Up#tcWz^sh~F&2(MeZblI9U
zxd-u3f$+7Y&fU7u-wTA_yX=d3`}ccRzG`o_E_lp6{Vn3|V5^Y^-YLye8A
za+*1AC_o@TcOK7(0{F95-J6%hhywW|eO`pm<_%^3pC8`y*#h`C=ZE*qC_sN|0s1ov
z&>vkOf1&)-OV8*61in;&{_OnC%k!lI1a6Jovut)ABjT3|)IUj|kHxF=1rnCG@)Le_
z0sLDc4PVID15PP`U$JWCss{C6_J~so5Xh5M5yX!p@4s7D=4IbgmNzx}ISNF+C|BeQ
zB<$8@jZ5?OkYfs@zZnH_Sswi}P#}GEf%NMNq`$d5zk>PY0_m#@q+eJdy~3~0t-;+@
zAicuRlm4m#=_^*YwgR<2rFzc?$@tVqtO+y7ihq-BoZemjsQUn7_u=AmWgcZeo3<8kV~Q@
zPNKw0q9leW=wwT_l$<3+I{yeUWFZC&m?EfY3>b0+)3{)YDF)ouB?lNV)Su#l0e`4l
zuB~ZIF<^?@xYUsEYi8cFyEnIU_g47+@qIkLcZvMI-FZLf$9v{IGdnxGCoTKXaHZ58
z=k~!0oj+oj7#y9fP<&@}Y^=iU+;Q$0u6ze?Dz`pYDSi=NsfpZJ#r|u?D-XcAkxIRn
zs#5OHG`AZ6|C#AzCAi-
zuY;b^T*WCg!YfYU5nk~Ub2K+xaeXj5T6z8I2CPn0s{gec#wy;T#^rOR=H=WpI-Io{
z4+)P~t{!J?75$z44*^lcVcKDkjJ>g
z2t0IfVAR%zCMHM6){IUJ+8XiLaBkCh^w1`oJ=QNU0NFhN>o3=f(ZQx6`maiP6ycTf
zD8eh{QTC4&@;EgyK2~A*#2Ff2KUnD=2(1rU%h+FK0i(al0!V*_xvQ{gf5p)q;gy^N
zJUY)x-LHf3X)5QgK`V-$>5q=(+LHtJL=bMPdU<|me8cKWH;C>Xw>DkLZ)Ai==UioL
zI6EM25e=*r>o^e?6F2q@+}(FqL;#fv;dk8A(?dt)qNU0OCeokEO%A}!Ya-Kcb<5)n
zpK-6brlN+3eE4B|{@p7o^H)@f0QtxI@POATFN8S;bX&_Z2bDc33MTwTH4BK><`Nh=3k8d5
zROD6z3dbFW4cT0T289oej}1qJI!?=@F0zPS00TK!rx})RNBM-7{WH3@O8(r+B@}!m7g@AuQNx5k7|~Ffd&Rf*UBp|YYX&MBfnH^JRnd%k(@r+B0Atj_9_x-qS}|e7T$vP
zIW=rIVdd6=`JvpOfi|o&Y)A?>&IX5a|3ZZ(g4zv~BfhzA#L3VpUB1w%lCQY98yGD)
zQ+go6vlT8;WO#*3NVmHGixfl`oE;u3ujfTJ!%{X~7duegmTJwcv{0cVcexunD*t-b
zRh4VN#ivr@Xn(qVkwc8&%To=`xNhYYJox8WZa}Q!L|-I`z5|90A~e2k
z*B4l18X8tToQ{|&i60(X_xyOVe*&pn?|wFnLG`iMy4JyM2hisQ;jtrMG
zRIKzxTqdG^23JQnEomWyuOF;%fiJ=Gi2&$-j
zp+JOh9Gybb@sW}*B78lZKWk}O16Umx7fTQW(K}@~`
zs=9t-?s6BFQDh4h;gi_oW!r@&!jb-liHV4dM@k>z+3`&k!qH-)b5Hr7fD2d@Wd6ncz_N=)
zgij0(VQ`LKht=V>byyLu+IDmXM7XtZRDP>*5RUex*9RgK(BXqHa8wtp!{z!xL<~B7
z4Q??;-H4NkPi(O6G4jL3GE>APO@==>ZXJSU_~hW&x~Rle`Tg~mi0ljdi1iETM1}h6
z8&kIMkzB3(FfrJVy0J~2OYok?tu~XCYFJw9F=GM^q*%00WVtVz~F|;
z%k5>k@beERU0Zppdl@TE1nED&2qZ5yF9%1=;YY|jm&e6|*#!mZsG#%IA}erU;o
z3db%3i~aoT8`OVP6f{4u)IRnnOVg^`2T?rk&yB9f>g*)ehoihmjDN!OZQDpODI6J?
zdf561gAC7(TW_GN@Q99=GOOaZ4nK|zUt{0IE5j%3D^$WQDowD4H;?A@6h6v+q3i#s
zV6-ne`IqYhYd2KB7atV?@nQ^(+=@fts3v@S9@k&QqnSjvVIBYQ;AG@;YC3$);F!#y
zr5Q&RO`ap(dVNaaa(!eq?)45=Sc{5Eg!r*x+=pL19(|1%#p!bwkuEQ2KuT%nJ5yZq
zq8px?F$`NyjSR+9?U)!^*03ntGP}V1YW?7vfeMj?!>y4Rbs9cgJvcRt8{orZmi1K%
z7uz%<*I!lmhRLiwig0pe-vi#7L>Uu45nlg|>Y>8nwri+xeCGEsZ@b1anecI#w_SsU
z_08|ZtJ$4g37=UHN_@3t0yA0vxSGwPZ0^JOQt{%A!tJvsJl{Tm4Mw>~p7#o^ULTXO
zxN@APIwm5X;sU#z%eF>h>fnjY|S*N(B*^uqaDSY?IIbt~VYyd!$q
z!B0Y$@5XGGyB=EzMklhvE|v>jxhHqZ9Tf|Ta)H!sk!y*F&&2{I){}-ftA~;C(?fIr
zZ>8ZECgMvteO(arbXn}`pK@1^qm_ul;@Z|VGS#wvLv8~K`iMKcc?}+7&)3jL(y2j%DbzSFWiO1WM1rOZBZ%7B&ysXw#KXi
zWc;XN8F%^ZXXlzK54c@XC42yr5^?v`c8hkb$~A?1m0Pg{*q>E#2M+dMRSdts$^#mY
zR=)l0bXCrt<6i5=+%7kA?~^E)v=1)wDr|A8SpJrXItv4f+-qKM-`(Nw->}B=sH=7;
zhT{x>zgqXNmKdxcW+b-qSaK20ap`xwzr`&*Q+gDRzcfT0EnOOn
z22lgpLV1^IY<%(fgcvJsy&L1TxKtIlrLd?txp-<6ouAmAI6RT7xDzQVbv&QDw6tT6
z%0o1%&f4-h-&@lLl)@@+RTZ;Vk}Nyk>m;1lF71s>_jdrP_(G{uwoob9Mj|T*
z+eMTd9b+UY$7gwy3X8;&lLyk^h*Tb+I|)M61yOJ;FA9T0d5yN`lS>YKQi7WyjJOlB5k
zDEGqu=nhV+_#$uB$Zx`GoM>HF-l33pSX$M0buEp%DReBW*T2u9LW3abV#LAl3o=1Gy03
zAL*54Zh}Uk(Y}H^6e8#Hb_L$*h2?(#@DE4>{U7b1L!U?AXs;D3$8W&~*mc?Q)q~l-
zkE8O`
z_2ZL|T&z>5EN{NCucAWl%DXEn+<@5xR<{<5=Low*UxA5+n!<@5vtraT(9UmOylK-W
zxo>PSmXFl}bo4!pN~v6j4G-g!qi>dZ>T<8FJ|iuSt^3BF8~bi7Jr_O-_9t{<0*2>Q
zMu%MSMnCt;Ayy4c;n_j!&0!?88k44QdggaA&Q-dlb-&2q19IjtJcbPbSQ>KMmdO9Q
zI9U|$Uz)Jpyhdh%@(*l`KMxbg{J9(Be?S&Zlaw4+TR(VItUJj*#BD^?Oi
z<%8Dwq7UCNHNPub@5;*V>$J|NJwcWTTIY)=*e!uba&mQay87&hT$vQl0%EHY>TUZ`oy;`|DPpS
zwk3w%Xw4fZ;1P^;mGsu5e;lcxFjVpF6!5R{4VB}^`*-ZSlW>0#H|8q!AoiU#D%0RA
z{}}&2U~9r|B1SgCn|i=Dq2>|K$XBNtvg2)c;%AU*&bbx3f11vr)FP^#WVqr
zX_se4bS+&=m*Nre!R!bweY!e3lJRmi>zVtpHvE8#H7cx(=N{?8EOhEW7
zI1oz^@*#I|Ku?Q{uWB}iZ>*sxG7l{q&?Qz_7`t6gHX>1Z@;*FVAGPmH6L^2=_?l77
zjr9pbVoqb6DLt&x{G7;5FQF)CYKo2NV$}u)tLUvEkiHI2hyfVy=n)G(YehX(c-dk(
z4*#C0I3;;>z9<3u$onH;oO+;jzS!GhRd}Gv`nilfI%;{g^3&<~eF`=Iv&JCeuk-?n
z?BHta-Zl|wZgjX}|CbxA{C<)3xb(%EqV*L`Q<$+;sx!5IIB2caYPB9}U-A)ZtD!6b
zc)cTTInhguBW8kYuzM9tueR;&&V~t;zCyTcJeIV@Y58bYg+?G286&dg$EY97@lP0E
zHi?Z@60t);$Q+s|-7S
z9##I-qkk$Dm80;PsC4}Zs(e{9Vwso{r>|MCf{FnwTNWGo|A(+RHD)U)OGAz}*i!!>yH)AkzRN9T*T
z|5%GJ>_0L1h}a$&t%GotM0Bv=#R4WSg4Rz&c~MY5!y7S&DYH?fcM}O^%3K+zPxy)J
z6NU`i-w2Y2^X0>LQ8`!It@Cle02_QC8XiM0kZfDl9u67Zq{n>FCNIWAABdr-h87_|M<_s!0r0b*Lgz-&;PvHW}IPD+${TrS_ST`K%t^5Ei
z9^$n4w@WNGyrs&3;>WDMh`FP!Z3zuO8Eg7#2P?9$et2kfP|k%_PFm-S$e&lPf=puH
zw0I_W98dqbG7B?Y<5cZmlJ4_)zH7Yl&yP5&^tcig`-9!JgSeeOm@0m|(h@vY70!?OUGa9MC7Xs{>%6E=jW?t-o>%s
ze#MLK(MYARO_m}e5aUm!5ePdOvAb|Fx=*Z2EKV*?MZ{6*6!GJ@0S>yOOqIe%21g&-
z@I0b-uw`-lVJw=!hwzy9L&LadChkx#es}|V(hcjy(u#UoeahW1Hnu1Px$#c|>jioVkNwmyF&V6I;?&o(SGfwxX}EccAZ<+izTXPv5}pcbDr_
zI&lk0GG
z|Ee@?aU_hlG`1v$`#G59R7YNafXSD#UL
zAM{bVtoFolwfE!d{0sY($L>_!f2ny@{_+?CQ4_oCQDG}Gvv<$^6sH8^435uIr=D{l+piu!hg
zTK|a(lIO(lqfB6GX;Zjk+@>*0_CqBR2NoE%kU#0M~EXh)0a0K{|Vr<+)G|;rFfF
zm3Z#Zw#bLyw{UMC#|wr=qs!2T4i+znoqWW-3)3sC0hC{2>ZBs2U$W=PUq3hm5^D^W
zXT0wj6OY`BJJ8YjziE7O_2>|mjU#i1_jjZGm27zXFk&Bah1zxMsRv6$meZ*GwYX((
zwc5>9p3k^v3{NeHpXd?8qI;vfOJPYW@^s($xQpKq64fV-XkY1w#GPBjTPeo|v+mt;
zJFk1Ac->93YUEjAIPn{0!{Qm8h$<5Gdo!-hHd*e|iDa?0(nUSbd~$#sQQU4H7Ez+^
zb=)oQE=Oivo;1eajd9x$j9tRwy*=_)H+nh!z69L0w=M126Agt_dw*-S=L`Pe_Xn>I
zWhUZlf5q85-XCmpJc{cNegAO(2Hb(RJliRfa48*|m_LezIa?skhn7zxwOZxWDF}G{vDv_$I~64=;}lK@(z$CRHUz$
zwxd;A=c_wF$Xn!fJlRj)0eU|9$Ni6r>rrL*=Q}z&A}*t>bu8a*R-p&&#-wun;N7;{
z19X4D8oi_VUfe#2*17JEz7=<^?7iiNf$Ms28My7nH$QWyh-l_(9^ycoAn
z7GvA0>%1&wHt_jO3`0}^)ay!ukOZ)Wincp$Ib7V+dP~S%#R3^dD-${KiX=Q;wq{A?opRB+sy|FwIU{rW|}e#7p!
zU;DuyylLKNc7FQ8^*hCiI3)f{n4*}b@Zbr
z-+A*_e)Y|def82Kf7-ZUy!B^`KfN_~>xn<#*Z<>f|FiL~J72$Z{WoKK4lk_V_pQg?
z@bqt9Sp4SAA9(5qcdq%)1?v_qYJSJXUtZXG#VePbU*CHBOD^fWyKm~^;lH`~!HrA4
z{k6BfqjmCwe|qZaPu#Zl6?-P$d)wDOd1v-pFF*Cce^_wAhky8v)SR;u`3IX`_SM}l
zpPlV^bEm~-{LZfXe>1*hi-)#K76n}H^
z*MPrE@pl>iUV^_%@YjgHI{Y=`Zw~%mhQEvOcLDxp;jh|9=!o=$zQ~J+U!*q=e+%#@
z9)A$4`XUVx|10q)x_hy{C-U}k{9T1V@m2zn_l5Yo27e+yt@x|<(RqBkr!?QAr00nL
z9LIaFIu>P--`+;&FH+~d_drQ}wkhG@yeGb*EK-73Qk=xOcY8|KldL1DgyUUIUx@c~
zdLHTNe9TtylD1?0JpcZy%Ja2roF&-KB>!0wQzEWJLW!gjDJ9yK=uo0liDgQ}+DKA7
zF^VWgF~umV7{wK%$YK;*jG~KCd~u2|uJc9l#VNix#TTde;uK$;;)_#!af&ZN@g*p}
zgf1w>m!S9(6kmekOHh0XiZ4O&B`Lln#fJ^Q!j?;t+Hw?MlHyBJd`XHgN%18qz7)lm
zqWDr2Uy9;OQG6+iFGcaCD83ZMm!kOEDZX}!ubtv+r})|_zIKYQo#Jb!_}VGHc8U)d
zOtO3(6ki9$*Fo`hP<$N}UkAn4LGg7^d>s^DC&kxE@pV#sofKau#n(ykby9qt6kjLB
z*Gcg$qxhCle9I`lWfb2sifucVgOkV%mFR+I?c$e`4B!VhL>x?Lsl_Low|{G3`Y$?M5-}M=|Y4
zG3`k)?MgB2OR=Q3v-YN#cBh#3r5shD=EnD(lecB`27tC)7InD(rg
zcCDE9t(bPMnD(xicCVQBub6hQnD(%kcCncDv6yzUnD(-mcC(oFvzT_YnD(@ocD0!H
zwU~CcnD(}qcDI=Jx0rUgnD)4scDb1LxtMmknD)AucDtDNyO?&onD)GwcD2jkiY2jkiY2jkiY2jkiY
z2jkiY2l1R1*+=_eT>D^L`(RxAU|joPT>D^L`(RxAU|joP
zT>D^L`(RxAU|joPT>D^L`(RxAU|joPT>D^L`(RxAU|jnkUY1Cu&^{Q~J{Z?N7}q`+
z*FG56J{Z?N7}q`+*FG56J{Z?N7}q`+*FG56J{Z?N7}q`+*FG56J{Z?N7}q`+*FG56
zJ{Z?N7}q`+*FG56J{Z?N7}q`+*FG56J{Z?N7}q`+*FG56J{Z?N7}q`+*FG56J{Z?N
z7}q`+*FG56J{Z?Nn9x3$&_0;ZKA6xxn9x3$&_0;ZKA6xxn9x3$&_0;ZKA6xxn9x3$
z&_0;ZKA6xxn9x3$&_0;ZKA6xxn9x3$&_0;ZKA6xxn9x3$&_0;ZKA6xxn9x3$&_0;Z
zKA6xxn9x3$&_0;ZKA6xxn9x3$&_0;ZKA6xxn9x3$&_0;ZKA6xxn9x3mr!kd-B(x7E
zv=1h<4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<
z4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<4<@t^
zCbSPGv=1h<4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<4<@t^CbSPGv=1h<4<@t^CbSPG
zv=1h=4<@w_CbbVHwGSq>4<@w_CbbVHwGSq>4`PeEYClQsgGud!N$rD4?So0}gGud!
zN$rD4?So0}gGud!N$rD4?So0}gGud!N$rD4?So0}gGud!N$rD4?So0}gGud!N$rD4
z?So0}gGud!N$rD4?So0}gGud!N$rD4?So0}gGud!N$rD4?So0}gGud!N$rD4?So0}
zgGud!N$rD4?So0}gGud!c;=d_N&8?@`(RT0U{d>FQu|<1`(RT0U{d>FQu|<1`(RT0
zU{d>FQu|<1`(RT0U{d>FQu|<1`(RT0U{d>FQu|<1`(RT0U{d>FQu|<1`(RT0U{d>F
zQu|<1`(RT0U{d>FQu|<1`(RT0U{d>FQu|<1`(RT0U{d>FQu|<1`(RT0U`qR7O8a0+
z`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@
zU`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7
zO8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+
z`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`(R4@U`qR7O8a0+`yk$|pxivAeK4hcFr|Gk
zrF}4^eK4hcFr|GkrF}4^eK4hcFr|GkrF}4^eK4hcFr|GkrF}4^eK4hcFr|GkrF}4^
zeK4hcFr|GkrF}4^eK4hcFr|GkrF}4^eK4hcFr|GkrG2nn`(V5F!FKpy%uU2y@z9pr
zfwwQO?GkGP@*Ga9Gvd-vp6PVk@%oxBF-r*_i;gKSVu>fAFuA&`BNcNIAFe~(Sev-*
zDdO!wYmrpx=}y=tC9~jmx{nM`bz%9V(@l1|v37Tvi(f^Y#F_Rsx3f*0>BL^(QJmT>f?~9*G{!cp#|iioRTQkUexeK4?aR~|tO=oZ@va3dha}5R
z!I30~p43IM*g(DJA^bcHv^(M9sul(RAfjy3ysZ7zNCO^Psv@quf(8N=OxtAx5pk?;
z$1!@FQbdg1@(e1y!_95%!c}ry8?fD-!f_{BThfJj5WZd^8Ks=_6J5649bf@GFqL@&`;mPi>I7+z#Xl+y@f;nESwI3c*ZSPRg
zcDi`FL>~M37rDiRKFCW7Cpy|>pVlc`+eDYBIGqvdIxyo$f7I@h(}>5J<xj;fly5JWFakI1%qkis7`RK<(&PWG@aKbQogm$JBtZJ!YNKC^)~&
zT|c#M3THadS*qx?I@^#NxWAv92Pc-L#HnQpL)Ou;%V!e1FmGKZJ7VF8
z@Se#@oPu$2v7*Mk)i}nSLYV~`qV$-6(it&2w7YA%FwYAd7h}ZGC?0#xbz$B`ilSE<
z>%xqaT8Q*-{D28mFhh{NJF?a8K7^>y-H28$vWcEyU=%;nD9$27D4;$&PG^^4U}zJA
z1BxVG#Dn}}(Zt2Yx*WPx=2GZT5u?a0hT2#sbo3aa%ALhPgNY<%R>T&Rp&fH!Rs6O#
z)T1a?d(h)_$R4KyQ`b(B3z=v2WKI|ErNEG)Q$h~$Vn_WOfZ}Hh5s0>e(I2@=$Urqt
zW8IRnNsN3w=@5QoYaGKA7BkTfWrJEKMommBur7({F|}|p2bdb%Bwj`%Udt!<{fb}=
z7GySz3vx?2UR^sjjG#{8RA{uKC&s(6N3%GG$(bxG%&h7f3-P);Lknql*P{~klm~Xk
zK!-XM^GEe6HF^MSVEqQ;gn9)^iP99Q$ZfX6dRsc3L@~yKSmcq?3y0&i4<#`s)w?rF
zPfjK2xHO%lBcH#MPp2*sKf;5z0AaVkj)4vaC-iyPbP`*E9PzXB;>Dio$Nj{Sc!$5-
z45$y(n+L?(QS=%AHBJ5*dRLQwtX|mU3=m7N){qu3PLU-`&mv!RLcVMv%&8NiehnS*
zfS7Sg7*ss=FE_b~I`j`HReg-~L`$2>EfHtb&m1q2U5a=wX
z_@Rm5oUo02CPBQ&0W-Y;ypT+slfSz+H9S0oXEKyk2Gnaj{k&@9;MsGhr|0$oynODu
zdwTGM<4U}Z}N&A5wZqd`D}b
z-z-{!j%+kHB~Csxyk^ZHri-JYgUONc@X;E%FGlQd5udOWdt6pw^Gq62{B3!*0spG+
z@(cYV^kzHnn$ZpqhHbW+_
zaGX7mEeoIrc?|Eam|KVKIM{Hr0&)f9X2@yCJ&=vqbaNas13A0isc*uYQqzztu;FGi
zWW!3N3z>v0LY}`9@ijR0r}`YH7jpVu?3009u*z`?kaO`0fpd^Y9>zYt7vOj!-e(87
zVzcAqAveDn>521OkpByu`d&PmpN3ri7}A6EAooC?LZOdCHoXn`x)An&?1Vh~INlEe
zd1M##Ak&{fz93IQHqA!4cOyQ?Ly!}YLw^Q6$gO*!2if>p=w0O0?|@80u7FWDLpq;_
z9^{rULl1J*0q9-q)Svk)*bUPAYv@7lJqUY1cK$8&AWuFGd%O_G1?WL`e-(O=nXf|+
zvgNSjoD$*RhF+snKl?k-gWUFa(1YA}1nEK+{vPo`?l}d$OPu=CKZAWCz0X1FytA?bC9QA551S5Uav)bkWJS^
z4{|{_^dNUZo`XDjBlMb)zgrO>WH012pj{-#yDY3V9at45a%Wl>1e%*EH${a?2A)
z7jpK8VQK$E|3jB
zMSEC)cJ%MigWUBD><78+KVUz|?q5R>a`u0tey>D(Igk2^f&3IbOH;o!UFT#VGdI*ZJ0Tl->YStE{C#!K>_yOfW1W+R+|rMH
zK~6*NfjpV1bBd6~p*m;o>yWSEI;RtI%UYxhSzL$sAP8c>wa{TToue!*7NCmZ1GT2Kzx~AU(+KkozDHKo%iSLN+Z$zv3aEke!edkf$K?
zkaHiebB;rvd$eo`>{Up&|_o3X7$tazh^d0`wsBUxZ!?={*fS$bFC=rhh}eAUB^vdXPtc
zj`TX=x4%Sskb8cOdV^eX9_?8iL!N=mH`hBY%g~NqUhiZev#+Ulc0!(bUA=P@GILYC
zGrJ4*y`tVpL*{O)cQ!*d-(K(RgWP{dy>kk(@y>e3y&Cb{Q}3*ToZVmVOhfK@u--Wg
zx#D5$Kwb{LT)oo?IkchP8G$^o5$QoTZ$WyHc@ODbgLoi2AsgON?@U0tyXu`ikUgKM
zcZ!hBpQ?A}z8?AeY`xP9+4hBcXB%Yym+GB@kcaD?bCAdXuHI?87XJD@qzBpegL)?q
zIs1o55AxWLkX{<+PojK~C!Rt1ASZr~@l9z
z0_40`H8|%W_bzO3+O7w;q`?`1JO;TF(plQz9EMx~c@DA{vgHQY0df`OHpp#|xj5p3
z+zELG@(`rk4gY}bg=|hVI38pgavx+4vIyCbZgA$_h<*=p1?1f8p$D1iZg37jZo3Kb
zLFQK=-J1~aZ4FKavZbfNnTFhR2l59w($|0oqLKf5P!7mEWCn8fz0iYfg)BfeK7evS
zwn4V6!1y=-J;<5{9AM6ZSoJKhyXYXimPC*`moO?U$@gc+qx%p2JAEfgn;)5*ap$EC|&ru(DpgrwF
zy+JlU4ZA>&6c8U|&moi-^6WQZzm=%RAEF&V?)_PVlZVXx9QlWA#dSwhFX{&}4e8(`
zo&^w}S#Q3}nYH=Vvzi(&ciM0~7k~Tj`t5V#gJDvAy5~%+Xna-E$7g-4uD&p<@$!ik
zbDV$vCmEK+zdiU{)u))b7b(Q)o^!OmhoFzv?`o(&H@oq2oD$?eo{)R_w?eh^0mW@6
z3|yN|t1j1gc^f6witzpT+d=wA1O2qGf1vU5bV&asbdqmU@%KgOZwb^LQI2MmcNOXP
z2jy^e{IVF`7d2k)%0y5KN0tNAO=rtGl@6xp>JzeA-SNO=q8wYGzkGzJFY>h)`sYdi
ztQ0y$_*7vUz`IEsdV;=hbhFTdroP2cD%T(JoAu7>su8k
z@+&_fu1^yP5aF0+I4z`)>sIv%)#F4^jZ%LL^wTrY-wXX!q>oES9e+^oLqSD~{G5RP
zZqnz}dm}vJFzI7x)$#8O?7I{8#i3!}ZgAoBa{RVT!Ll=m!EjPNVa{p<&1E;5L6$aXSJoA8=d1;n3jF{W-^W
zDK6v}p?VX3QC@H7!A(D@xc%Y*C-Di{QTq9=muYKC`-}1=U*I^6Us4=~GW9|EO6}6x
zfHIcYB@52|YsIw%_Vj}C%|$+OXq0a^xVZ;s&Yb|)^cBVB1AB(*VOv=}2)}8*0QK;+
z;yME^==1t2dF(7I4Y0DXv>tvBdsaZFz(V{k_m%LHZ*>
zIzhgAgM3N<7y0_SioYcy{$3;gMm#XLne^R2zp0ysFX%UQQ{9MiFNgjJ=^qN}vl!Ip
zUeqTJjrz=iJNpflFRTZskJ;`Db9L_gcDEPYj(=8M4s|O(-E*c(+g;xa8ZXBwktRrC
zhm+ur{+r_V5QcW%tA~xc>Bh@@DU(9Kc{c2PQt77yJNx?eEwD2ILcbgOtA48Vu_UKH
z-E)F|d27%w3%li@e~9!$?XnQqO|(lK8g|6}zc>l5
z`4@`YMi|Q9=9fP-Fv;>`%+E6QW&4NzA=2L;w1YE2d3K>4;4oAkke972A&=NRMIc9B+z-^|1M`|{tbbovMjw;RkG^|VyYf1sZs{l>s<6WVNb
zXM_2l$k!GT|8pvSG1roxl5w&Dc{*BBe!=Yr=g#_HIX6EXj6X&{um|H$X+Llp+`bnm
zt|=;i=Ysr+_BpQ+>EoJp8?6Do(NQ>f55{7*G_NzPMn@{!!2cbW2
zk<#B2q+_(}Z6)nm~X
zq3ng*w>i%_3;itVyMexSp0l6{^+@{XgZ6>}O^*jB(Oz&E@&j4_;M|+ZZb3S}f1C4;
z?a<#z`qjoM5&uExcdt(eK`cek)#%(Y8Uw&l%tQq2IVs>Ca?*-vRE-CdD-e
z{)UNw_P6sGcS`34B7aA~9eG4?q5d%FKaKwRJoKC2tn^m|{d2}orVYu^crE(D)@J-Y
zs`M8G?fFdU^+yBRGfsut^ANbXk5M{-o&A0~H2s$Is2$L6n}Plz=&vCCOho*3D}r%A
z*y$|vHgG)ZH(h>2PcPsv;-=WGU;*g(E`QV;vtE1?b{cD&Ic_ePOqGX!}j?R$McVdZV
zfqr0@ZGl}x{O6&+jr4a0`a%3&Y5bzkJwy7(qx1`<`u)(~xn1R_KhO{C(_Lzx?a)6&
z`XYbw6KV&2x`q%S>Q(qqf%HXL-8j>T&P|}ykaeI>mTv*CDK`dHnWfPw+HEj
z+I23nUH5})m{#e8#_OOy(7}b<>2~P%lYVGi*cbE<;<^uqq5eVS?-0232UR*}g8bzJ
z?l|&?LxVdH?%W^GoJ*pQ-}fQK?Sw7mr+ZE)pI%u$g+JkTnbWjWacM=#erYrONra1a
z-Zl#F4#M3n6uuYXeU@-huSXERnZoA=yx;GkyDwR%6YIPg(hskH2X@<6Rt{lrvCezu
zBdQ$Y-hlj=?d~j4quq&h-a{W#+%CdO<~v&h{}Jizf_~e_m3~i9uc3CAENgdyI|i=%
zNlFK6Jn|FDpPZL&Exk`AxJIlU?b)NaEr^4-eCfQjAM1!XMdP^O#5(Wk&nj+@%^uUG
z{j1=_T2=q&6&IR!7X$l?c{dJ?cDo964RX&Qyll++Va~POvKXRQ{KiIt_@?~ex~FvB
z)`NK)PEr0vK9aab-u`XHiFo8El>hL2M1&7Pf130|b}Aizhy3!&@mHj?3*52qs&qP4
zDkA?rhiR*_5WzJykE-~GqVzFQ3a=Biigj7i53LuT3EJHb
zv^yMz+MUSP5V-x{Q|XKZ=>+2dF2uv*zz*o2CVer-ke}{3UXad$GQXGQ2Y2TCym}G(
z=b?X=^s|%<>>K0@18z89tytq|JEr2_9?@>)c$+J)$02ZAf2_FBJSj*A^Q3S(JD`7v
z^h5qV9h6`AHx5H~7VYc^xFaW2I@lVeJ|*LlSj*j4#x-F5v-2m4n+KnepHMrK!7(==jA$jG4Q_-cNi60-i~_2
zx@*1S&f4nlM0x#f1$X>{nWfhXyNGpOZ?@vHK|X`=pf4B?g#KyhAG}EEpTe>Hgx8Ue
z`ps4Lr}NM*a~CW9Em83gmBufwiwZAP`tt()Uf-IJ({nJ7Hl(vUs
zs3N01><5>*RB;Dw{m|~xen_Nu8r;d3Do*STkRS99rQ_XhG$fn~jn@mXE;{iFDp!!+
z(NgX_=0!La;>0>{pG)bXuch=#%eU8`hxzSYtn(HZDbBOmWu)9LN5HkTDy~1sr!jw9
z4#Skr-x{z8&=XhOOs=DrgKJ7EF4V9494Z+N4nfUc7vPfQ0X*B
z*ip`B&(GG0`S-<7fa^&s4$o(l*?QVqcr0~2774sn9uj+7JPi`g0kz>%GeTRy#HOPNx
z{?Ls44esk!ahWxeFp`t|o`w%`t;i2nRzrEIr%T{Wz
zLVqjtx4uKgHx$?@(C-QKlhEG}{R8h*`eF~G{FvoEQfgPhod!3wO>wh>_EuUSXUaLT
z&YOIX;!fM_bga})qFnvpPQ6cY{VJCw*DrObNZmgQeX-8l{6|V3SydlPy$gM@&U=pH
z-yP_u^>|xntUsTIewN}t8I=EM;BR8j9u7nPCem4eJ#ceBpz?JtNXM@qaXUo!KSI9`
z`bE+YwGZFUSf16zmhEM$*kkuW6@RsPiKs`hC+`61hvs$Y&>BPYIvg71I1O&k4wcT4
zpd5j{_Lp9V%)>ps?hh&b#=u^FIiz2mEp0EtKl;GUeL`_j{do@I%@p1ebP|rt7>v=i!=YB-#X9N8<
zT@7`(er%&k5bYuh{XWtc$MO^M+wl6X2;T+$-Wlj0fqu^n^v^?o#SHXYu}7qP2KxQb
zPm_MAp8b9t(<6U9Qj~W)^gBs^pR!KrIKMNnzo_Sf&_6)>p?#x;zz@W}Q5=T+KyYWl
z?c1g5?TD>i?=Np3t*=0Ko>W|8(C<$8^?lY~ev*FO4}CYU^gDy{`0WGhH@bPK>tE=%
zkbYw@j^#_|*{9Lb;*=;8-4{Ou?))eD>70dr!)~R&-8NszmCsjN@nZz5KBKsELHSGl
zs#w||h3
zLiQ5nIRyRL`&Im*bxdDh=BuwfU+2MP4k!*^)h9IGqFze;v-MTzUr7I0pda*)2Lt~U
z<>-h08PX56f8YO64nKZTj_uGtNBW_C6#1ZDJTxvG8ufAr+^WA;O4?^QVWZN=qn*Q49~>w16vJ_|1MeZ@@#m+lbyuH~b@`1^9Qc*s4uLy2icmiVzq
zFF7Cf{GH;agM1zh?710v#Gzr&EVwPtDXu5zH>OMN(u(wODrA@4;HK+-C)Z>1wso9s
zrRzANotyx7u2FFrWfd`>3i=zPoix4%?eP+&Ka>4@-QZ3wP~3vR{-ym$Bg`L~Zwota
z0e5VX;_!YE^$Gcn9Ji+Ze#BoN+z+lhp*XznB$``QK7Tn4ZcCTqwu(7}_=M7v<3#qA
zI-mYHu>g~n!}loe^elyeL&MkCTgM{(pdZ|p`xMtw?{lSgX+m`ycG&?g`$om(gY>3@
z^tK^A92)KG2)JYS&zx(x5`Oo9;#LLixip_?G-)HB%fa;zDDFUmrF{9)d55U?9Jmu}
z6esST%TK5tWWBfgL=rSf5IFp}Fgr!1c*!S!w?&X(S`^7Q7t7XA8L6?e#H
z7x5@l$S%U~`oML+O>wJ&`U}S4G^&rrVWGbj`q{TD{k}jy<2SG6(9fva7WUf@{prV*
ze*X)k6-wH%v|o3*znuoRf1BdA+v+P@y
zXd^RsaKk_}rZ3)sV?GJ{^`>h^ubAPC~(0!?+rTam4
zp(1c9G`?*Gx9f!B3N}9zk6svlb`acxpD1oWRXfU;)_zmBt8_kj8v1)k|486xp?-CL
zWWT!Lb?6`eMWy34TH4o0V@du*d+rCf^%siUX0zi&xgB?aJ9b8KI|A-Z&@Q(C!lBVF
zkAQ1CtGL4#S@OBBd^~Nq3imC4r#QTyOntiN81uE`CG$1WFDwV=)%{-1OQs1cu|F0%
z)09bJk1X_yq%ZaY$dB0``~3S4etX;vu6d41XF-I&$#J{U_cwpsJ^{{onc|Mv#*6*s
z<3%$Hw_^d7>tahjH~aG~Kc79|PA^ehXn)9bY5UKj{o@q1e__Y1_$QrG+%8HEb`0ie
zTZ8$$(BF@L_L9ChmYH=Z|NeD;cj!7_
z#Gixy7G{1#yV(u>3DW1@Cl~3Q0Jor1*_Bi7#wF;#NMG>sQ^Bswq2D}%__NTTJ%jjn
zLBC-J`bVJekiM{+{Dj&O_NA4qH=Ym0Ki%l-`~AH1tIdAD=3mDrm!fa$R(4Gj7H+R2
zMmj^#&yxPJ$bR==WWT!$-0YiFIxB4BLR;y$Aj*9V+}st43*8^_%O%HWvGpZ1o(Qh7
z4e8ygxVg6UoN}%k+^O3XC-zFq51u~``fD*Zm(C+Z``QBT*d2-+A}nl2To?KkCi1se
z6kJ@J{+d;6;RQBT{U(Ip!$!}8S
z;H1+H{mrC5llHa++(<^Hv)NWJneuws4{pz};yCNJC!xQC^sALemOp{#B1m5x%a5fW
z6zO+Ee`|SuT)lr|2;p9NxIaFinfvR&BE22Z&yqf-u<8>^-@HF~2>L_J{EGO`LO(Nu
z{479Y>S5+bw7Wk1(@pxT8vOk4D_!Ri8~t!9G!NbmZfI21Yp5OV3;L1r{d%H2hrsnc
zq_`eR4*iHf56%VCFuBfl7WxyUf6CU694+tXT2r{6HKx+>f^vDK^P3FHg;SyV%@DYe
zNyT+X1(heh#V0e!HOqdechppbiMN
zpSs;a1&Q{C-wkr+eL(3C1^WK@D#k5kGDpTg1pQvp=hVv%=udo5#lOuq-=8R-?;inI
z_=w_)LH$n$b`twmaTu}_Tmf?|w9j3NJ8DbsKzVx0#Z9eGDeh!M`;qPRh`;XOUzg;-
z?fs16#Iry0W460Y>2-;)`(ALT|4MQFLHRO%`|d{ZGC})30sXmuL-`BZjnUo?m9@9#
zW$07BqPRUl{}5_#)94&Z+ncas54hx46}S6RRV?&Fe!GzN*nX*Q9KJoag3BLOT=PrH
zIpv4`d)WNzt%KmU{F~wq2lmJZ^}P=U!J$##XTdf8RB;Dv*P;2+>ri3;)-J43ol%@9
zul$6{7k=(T==Vc^n)IuU(-d1x)GSc5K+OU*3)C!7vp~%PH4D@%P_sbI0yPWNEKsvR
z%>p$G)GSc5K+OU*3)C!7vp~%PH4D@%P_sbI0yPWNEKsvR%>p$G)GSc5K+OU*3)C!7
zvp~%PH4D@%P_sbI0yPWNEKsvR%>p$G)GSc5K+OU*3)C!7vp~%P{~xtLlcyf%Y@*j(
zGN(IR53in;
z=kW?wDe=luDP59RkepBQH6+Dz-6Fm#NxqgOUS)<)lc(O7(B$D&SMnIIgpyLc3Q2^E
z=Te2lt8t{nD`2F=D^sMzt3ss2t23m;t0SbuD-)zt&%HKzcywMK;}LTy@#wXbc;r}0
zJYp*)9)XqeYLd%IUPJQrB(EizCV3sn>q*`~QoTQ*$-9w`Zz6d!$rU7TA$cpw+er41
zyq)A7Bv+E`C3z>wyGY(mvXA6FB=048AIViD-$3$>B=0BLPx1khZz4HBGDC8Z8%tV*yLoMZIEYb|I{o{vp~%P
zH4D@%P_sbI0yPWNEKsvR%>p$G)GSc5K+OU*3)C!7vp~%PH4D@%P_sbI0yPWNEKsvR
z%>p$G)GSc5K+OU*3)C!7vp~%PH4D@%P_sbI0yPWNEKsvR%>p$G)GSc5K+OU*3)C!7
zvp~%PH4D@%P_sbI0yPWNEKsw+|NktIKQEp)Zgcd{PP=4+k8TrB{5Lt?<3gtCY#^Sa
zPr<_HnS9a0KgHyo-$m#DFPOY*;lIe_(-!_9lh0WAuQPei!heU!=Pmp{F!_RoKhETf
z7XBwp-uZoW{XfIxT?_v!CZD$O&ocRpg@2C8dlvq}ck}!=Z{aUx@&yZj8Ivzs_{*8R
z^IUZOFJ$trg%5J|WVaYQ>WAHUWy
zdDp^^Gx@ZI-^AoI7XC3N?^*bFG5NfOe?OBiSokNHe9^)`$>g0`(e?inlXorr=a_uj
z!he~`XDs~FOy0Bb-(vE43;$gvU$F2$V)8``{}U$f)J50-GfdvK@V{d6X$$`>lh0WA
z=a{@_;V*m-bNsjPmooW+g};o+7cKndOx~%FuK$Hh-nH;cnS9#9cQE;kg};``dlvp?
zCZD(PE17)3!r#Z_ixz%>$vX|v^}mkEyB2<&$)_#+CMKV;@Q*Qh&%(cp$>%Nn`}ix&P#ChxpJ)xY>xd|dgj<2=RWUEG#xC#*;SN`ibUuNXA_gpSop`7yhprQ|LG#
zdjD}y{|A_S#=?J<$$P|`{`VawpSSSeXYvK&&GvtS$rmmBPno=Pv8sPF{a-S9*TO%`
z%NnE17(Oc+>t1n0(Q~FJ|)23swD_?Z2JL
zyB7XhCZD$OE0}!7!r#f{J>t#!eQx
zh5s&-PZMv>|Bo~IjD`OfChrk%+W$Y8eBQ$UhRGL*H~atdOulI0U+_K=WA*XVnWO68
z^uIYw-X-3wzss0>+QPd`K100v9gSfAxQNMn7Cz48^A`SUCSS1d-AuknyxD$lXY$Ua
zs{T#>UMBAnZ}y)9Og?SlN0@xZlK+R9yl3Ix%;YnVEBlFGpAa8c{_8l8Gxwr#N>;_oBP*3&g7jYReqCyipjecejk%h6L0okf5qf8#GCf}8k6@d
z`Tsj6pSR@y7?Uqp^8ZgvzGzAR-o3jZ)5M$pdkd4#
z5O4NhcQJX7c(eW9&*bx#@((fjf`wntoIiex$-Bgx?dK?yPZMwY
z-~VOu8RE_M^RGM%`hDM^
z{LM_hK)hLhuVV5=;zeo2$Cdv&&TE;x^Kw=HCcl))yTqIQM<w`8@Ha|LkV+1q=UKCSSDhUt;pkE2I7YX(sOyZ;s!GnS7dfbN=}cOg>}D
z|BsoxXG#Cxn0(%n{%Iy(Al|g!e=+%@CI7!?^3FU}|7QPv;RnR|>f@(t;hUIzns~GR
zU(Vz+#GC#%zl5hjF(mZ!`<{irs)SF6NcC0oc?+Lp@&yZj4U;cg_?wu#^D0&UX8*mC
z$-Bgx?PnE}Pg~L-Wbzpc{~(k1Ec_Ic&l7KspIexG!IJ(vn0%3VbN>5BOx}65s(;ge
zo?!AW@n-wUGx@ZI|8pjvA>Qmi|B}gj#GC!k-!S<+@n-u!#N-Q>^#2c&FIvj~LniNB
z9$o)GVe&5V=JnqxCZD$Ozh?3o3;$at?-6g-fBgrAU8;|NdE(9bZ)EZX;?4H^QYK#{
zeh!ULF3DFjdB;`tZ}JP7yi0tek$xMKPZMvhKQCkQ8RE_QyPnB=#GCbZ8+wUJU`8@Gv
z``g9j3&flAhfgv2qNV(Q!Q`F!(f$9InY?S^3rs#uyg7gPHj~c~f2q;`e2>X{#GCc^
zk4!#q;ZHL80`aE*{esCCE#?1jChxo^+W((p@-Fcr7V&ZAzm7BekHwkl<7b+9)BZ1F
z@)=9|uVC^X@#gsZ8YZ77-W)$$nS6nGbN-ZK@G#IsW}Alg|)u*59X@yhpq_fA|8E&l7L@-$5o{Al~dhzro~-#GC!s-!pmVwW|Kj
z^nb+UUE)pq7nyvTc+-AAWAYhG{{NH7dlvqGnS9<-{)QdGqSeR00`X@1yM)OXi8uY{
zWlY{#7+wFDGkKTz7t^?(CfUN|GsK(YUyR9n#GB>sV)A+7&H2X-Ouj(8+5UT&e35wb
z`u83t@3g4;Gwt^#Chrn&`rkSxpSGkw!Q?ZuL!w;O$3KsFp)EeH
z{MT_VV)A+7P5Zr=$rp$>+utjhe35w5e-
z?bprZi^QAb_w7vHX;bz$`FokXOT5|s2AF)Bcyst#z`-hl(o_MqUew@h{h&ShdPciu-@#grqkI6f6Wk1t@
z{))-F#GCp58k0{GZ~D*QG5L&zKgQ%e;?4QbKQZ|{@n-+`?@YcxygB~;ipdu(>7Qfr
zPD0hcng3Z&i1XFQKbLs3{a?)F)5M$he+iS%5O3OV9+USh<-d~2=ZQDl{}Lu&Al_{M
z9ZbGRylKBQlXsG;{!RWCChrn&+W#&lpC;ZM|L$k<8RAX*4>5Vq!mnrYdE!m`ZDjHV
z;?4f|F(zNMq`!^HJ1JHFX8Zd9lXr`LredPcr$8h2P8MJ>t#&>x)c2PrO(*2cLkF#TJrxoChv4A
z`m^hXG#A)CZ8wX9RD&*zCgU$e~&WxBJpPZ
zO)`0BS+xH>%H&<*&Gff2`84t7{N;U2K0~}||36{!o+bZJGWk65X8*B=$rp$>*Y7{i
z(*2
z`#(&+Xi2~B!@Tj&xjMT3U&!QL;!Xc=X7Xv`P5*fnlh0Vve=U>uEc{X?pSR?{lgSr|
zH~YWqn0%3Vv;E)7}97X7Voa=KQOl$!CZ+$M0b#?-6g#KgXDSfq2vZHZl34
zh4+}ebB(gUng4e)`84t7{ON;CK0~~D{qRvHpC{g||J_W!NW8gz{aGgOzFyhSY(HOO
z@@eAD_Wv}K&sg}wOx`2@rN;H&KQQ?M@h>s>A2WI9T4g`;`t#qIe42Rk`u8-G_lP&k
z|6feLK)mTczi0AJT9x0Ne_Z$xalZQXqf5Nm|28rCH1THpeL0iQ5O0=$ehE*FBP9Ii
z_lY`0g2}rU
zKF{RS#GCEs&zZbOyxD*MC6g}@Z_eNUhRGL+e--r*x~DkAHgeBv@B+n9Ww_yq>P
zjLADIRQ}ER|Mg7XCEn~mZ)5Ul3*X1&GnV{6z~nvRg%!ldmH#@jfh|Y-oxZw3;)MVK5gN5G5HMf=KABOn7l{4Iez{HlP_5E|79j$
zB;K4q6qvkotExY9{QWkQcP;$)n0%Ue^ZMr>nS6$Lv;CiB@}4FAUoiPR@#gsZ-%P$h
zym|fb9Fuo$Q}t)|KeKmORNo0+^vylMYlCZ8wX?El`tQo&e#YeU#J`sEogw+3Oy0R$<^ML~Jd*#*f>LL_%4ILgvqD-qVxYUCSM@l9RDt7^6otM%
z*?)F1`2z9g^}`KJzDT?|e)TYU=U!z$GyQv*eDQI`&!YC@lKkj4alXk(OPQv#fza#M
zE~PKD#mANZI!>O+r-^?hacPoIF?o-8^ZNTQn0(%n|1UE60`Zp{`9H|yo%@vi+lbGQ
z{5q4*5O1zue}~EEi8t4e|AEODb_uf0NmITvB)|J-y!MmHE8g_KB9r%scjyNwJd$Ub
zyz|NE^y{DE<-b7oGyAXOO#3;jRQ;Rw{|S?Ki5Ibmk1PLmoM)JP+LHdSn0$tKoo<@a
zf0oJTE$KhUi@!b^ZdtogKGb;p>~rYc`1|65O0oumoa&dc=P`I3jL8=)`F|IaFA{Is
z@BK{P=~wnQ%l`zEcZoOc|0I)76K{_HPciw7h5sCr_lP(B_sdK^PrPZrrf`j@_QEk8%#cL;lIb^3l{z)mnZv~>)*d(+OKFy|G$~(7b$&n{_`v|ednoY
z|G8j~Xi<#ygEy)6yTb6_=a}i|i8rqwFMJO#{Q~i3|9dHuFIv*SjLAC#s{H2q&*esw6T
zU9IZh9Dl#d)hTpI=zYxB$F=^Z`R*aOx{_m+Mike&oOzIc(eQmn0%Uev;BOP
z$!CZ+{r@{m-Xq@hzwa~oJn?4#ae~Pgh&Su+r%b*`yjg$0Wb)~ctM!MpF@CIM`cKB<
ze;Fq4S@j6IoBMAUF!>_!EoAo$$;C`QJrZ4i?MyyHyxIR=%j7-c&HHC7
zn0%i2*BRx%lgT?zM*Hs*dwA_HZ}Gp~Ouj(8qbGpmNc)+*Gpg#(+`sfjX8F^^oBp$g
z$!CZ+`~NJH_lP(9?+r{oPrTXw-pb?)#GC&6E+$_j-W-3YnY{C$sz0;*A7=6{@n-%%
z!Q|7#yW~G7
zo_KTp^};W{;kA$B>$r%{WP5ogib%5Rq31c_Zuef
z5pS-aooDg|;&u1wQWjtEK9R5L^M@kw=KB2{Chx9SExbj~}CZ8eR
zY(I;byhps*f5n-6o_I6=S2Otn@uvN{nS7CWv;4O+d1p-3pIQEUnY>H9IsY19@*eT#
z^UEVlzCgUW{`fGHFA{I=-+eQacgL0e%KlU;C49%a-@z?otk+16gZ-&x0uYdlE
znSP#lv;BXK$rp%UXw=`|G5P<8y}J*$YRn%$exIjKkBTHzS}DrYNk&Ny|Bb512QrW;X|DMT5W7NR_iGNO>_MiinDWn@~2LZ*y|LZ;un_UHXEobR~4
z`;Xu6kKc9Wy7un8_FnIGuf5jVYp=c2+0iAk{O*9-BMtm((lK5i}|zYkA>|&wqDkM)9v4~z&@sLy8pH>uy^!L
zw}0mX`-Hyf=MQ@o*n9e>`_E4b>{I%t+rLkNy=jp3-}Lp<7T8DhP5=Jp6@N^3@oru=_B@g%b!CF?4w3m|4q05hyr^{-*o>UU0@&6H+}y!
zuE5^WH{E}3D6miHo1VY?slYy^Z@T^NDzG=hW&JnZ{~jo?kLa5|{~sx^xAaY4KmS%>
z?|!6TTww3%n|}VXyud#Fk;ngLfxQ{=-`D@U1@_U8^dA@4Tl%K!|MLQSN8j}M^KF5B
zLZ7XL?7t{~ZA`O?*)9M3`Io0}`u?|VfxQ_i>%ZyqZ`T5QOW*YTwOfI`qi=ftvu}ZY
zLf>@%J*2?i(>MM92ahhWH6`Aq4;9$^2eR_O@BaEk_n(~$eE(@Kll`aZ-##yngQ||)%_(%F93hWd5rq7>a3+z38)BXP!1@{_~dtdr#l=_3P0B`{YL+|9J&I
z{*>{X?tcpl9N+)Q_yY?ZKN>CjPt)zcq`>hl{ob5+$Nc$9fqg=sEk*WUl)pCS?*;b$
zNBZ{)>{I%t$L|dV_Qw79@9uM=TG?!*>e5w=MU~j`gR5Op1$ex
zXSV|Tl)mZt&z=SL<_cN=O^^Tk71&4gO^=_47T8<*9_+U}c_@jc_F{JFTmKG~Z6pDW?hAD2A?+8K{6PO-!0TbbVD2%9UU
zx7gwsJM6T_iS}1AzVlj~qoNA9vG2`P1oAHc~Esn9nPJ5haKY{VJ$Eo(%lrTPyu(_V`vBfcV
z*lCXw?f=O5+T&DvY)Tm)N7zhcd~9)y9d_E|MEgmMuRTt+$EJ+&afHncjE^mjvBOS#
zoM?X|<7mnOJL6-EW9+cg9w*xWneny9
zsrJ~kW_%oBGoA6V#W8l+X^#`_6UNsbr`luFhVgNP%^i%7Esn9nPJ5hae<$N>k5lcj
z*@5wKgw0)yk1dX|!%lmgXg`DTwa2OU*tBJQ9AR@e<710s?6A{b@4rgsXYP?c(H?v4
zajHEw?dWGpA7P6vb~wf!JMCvNzV_H_k5lcj*^%+@WqfS0#SX{VW2gOnjITZR+T&Dv
zY<6P&`xzfwY_Y>J_Sk9v0OM>
z#-Gjj*kX$vjW<0>~M@dcG}NneC@H<9;e!4(~QX}_HDwZ~q2oNABF
zUX1?=<7100b~wf!JMCX(eC@H<9;e!4vp3_v#`xG`iye-!$4>hdjITZR+T&DvYO
z>x_>rjZ#>Wx%*kbcG
z<711R_BhcVd+q3
zwa2OUIQof<=W&e9yV5&sae^K8+T&FF_oO$yW&Rdh?6AWgC)li&-fNFj?XfwK<;M{=
z?@Mp7#W8j`(H^JTe;|E)5X+Apb~wQvdu-N8pK6cI!7@LGBkZxoWmnqEjAk%A6x9S$BFjXYyS!3
zYmd!gjE^JivBl<}jE^mL+T%of?6u#>_}b&>aK^_m_Bg?26Fs&#>O+q$_IZcDHpJ#r
z=@V?R*B+QY5y7HYmdG5IMp7TBN_j5#>W<0>~M@dcG`cz
z_}XKyJx;a9=BJGRCF5g@Ep|A@9y{$fGrsoNYmZayu{nzIw=h1o*kXrc?6K4SE5_Fz
zd+l+mJvK)({@09;Esn9n4twmi|3>;$du)!8`8#Z}$1yfrS$=GBsy&W=CiC;yV)L!^
zF}B!YhrRaL^yTsYTY8HvcGzK$JvNqpoAeR3*kXrc>~W&K$^H+PcE)RuQ|)ndERP?@
z*c3_cu*DubY<^CUEjGpU*kX?zPPND8I39nA^bxk$Vuu~}*lS-ZeX2cLI6`F`E7|6uvP+_3*)`TpDR{}1iR^8b>@kLCMmLyzVAWZ0
zzR=KP`Toza{2io^&SCj+j2%v}#~zzqq))ZS=2tR5r}tka_Bi5x(@}bhEq2=D1bghY
z-&K0~KE|;AuzbH_c>GwtFEKoREZ=_^9{+CA%l8?E9?SO=h91lJ4Tc`e_Xmc4cg8=D
z^@k(uu*Dw7*mROU(H_h9~;Ju
zEdTi|KbG%j3q6+aTMIpw?@tTk?;*W>A6gh6n_sj2afCg#*mRXX#uhv6aiTr;+D9z^
z1uQ>~u)`L69Anc>dapfBwa4Z{nZL&oHhW5MvBfcV*lCXw?YlF+_BhoZn|qiJN7(dW
zd~C6NzfjnISiUbPY(FgD{}Z;~Ued?fV}~71u*V*oy;-h{SpPWXey8SskIhW!Oi%eU
z`VBpn?}rJ?kLCMb!t!JJ{+6)(y_ipq9!J<=i#?99*++V(J@(pT6SMtsgw4LvTWoQR
z9d_E|MEm`u_uAuBdu%EgA4k~i&-mEl7(48=$BFg_FuwLU)gDI!7#~|~ejj5bGaD*kg;$
z;nK(0Vy8V$w8viiK8&wDmfsH@)<2GUd>%V}{6|PHzmGY*{$Mkh<;M~B*kW@e%a1K~
z+T%ofoNE75>E-tUhw-uee&4YCSbkq`IDTRI{k!4#b(HjGI`hE^kI!MRk6)*+X8$>w
z4qF^!haL7f(f%0ez4kcO9-H6FcpgXC{EYFj#q#@2!{f*D`%1&($L3;|zpwNWw%B5a
z6YR14{?4%eEX%Jwmfx=##>eveGQ;>feGTIuE4}>_6#5maEM0=cSk8M56f3oy3w%B2Z
z6YR0q{uk1x+GEqe^5Y159Ak3|%a1Mg+T&Dv95u51r%G?J#W8l+VUH8-Ph2(KU5T+a6Uwe%6TSpI!~=yA;b9y{$Xklt&LQ|z$$1Iv#i
zY%Y}EalEzIa=+92wZ~rji+KFn<5YVr|K2)0ejJVF@&878i!DyD!ybE_YM+zdIGLZt
z5q8*Oj~zC#^j>?MYLDgL%ZBC0^6y{6>rVyCe+A=X`S+<|`(gR_rlHsAujKI$V0>(`
z{QJ((tFMyjJ(hoe8OE=aUj990IRC)%?;}H>_na*L!GAOFzwh85-0*)H|F7rxqA
z{=dA)KbYPB>*fD{J^%mT*N^_5`yXtS?;*{fuiEe3^1~ma{PE$(@3;TU{g>otcc9a`
z>hD>R+s${k>;2pR+`b03uYv7rVEY=_z6Q3hf$eKx`x@B32DYz(?Q3BB8rZ%Dwy%Nh
zYhe2t*uDm~uYv7rVEY=_z6Q3hf$eKx`x@B32DYz(?Q3BB8rZ%Dwy%NzKi5DM7P~H7
zjtF03RUiK3SFneljQRfmaFcz<_<{LbjmdxCxDEeiIlJ&*)gMPZDh
zUg2_5xC{%I8^h)Ca7m3RZdqiCJBLg7CGf?A!sYkjGAUf{371F1Wl^{+50^At{v9r@
zi%oG9F8hW{Soq@O!{zL785l10;o`#O#&Ai(<-u@yJY1H9%NybHLAZPwF3n0z@t)yw
zc(|MtF24?!--b(LxQq#x8^dK*xI7*%FNDjAa9JBJJC~Z`pM}e?aG4w~bHimtxP;%g
zUfiq96dxKcHeAjOm+)^Mio^fcTO9shtn7Q8il>Fk+;I6@xV#!J?}p3g;Zoep6z>o&
zdxy*6;c{ZQ{3=`qh0A5(a$UI02$x60<+*TqBV0ZRm+)`-i%ZK*@h;`2q*u6v|F^EB
zFpA7cTz_mpxjTl3#?&h;X?xTwV^B-CLTH+o$Mxys@7HMy#ahEci7nyQLn!|T3(Q}wXw#_zkXs(w&y
z{m}2<)KJw}Tla&B8XD`X>g#LknW~|tx}h;wQCC+rY~T-W8dP6Zm8+IO~e{+3RMOen{v4!h~s;Y~_AB|Pnf(#m2U)>mP
z4Sm(H5&1vss>8G_Ozoh76{CWNW=oa}i&EV%uzGN|1l0`4lN-t-
z8hUYl!G~20t8J*MstPM0TeAFZVRPlTLtX7ilhXyQYaEg-V|b*)2IdCT*H#RytY`?M
z{NVP6>cPV*!ZQEh#%#d`j;zQQ=?Awrxhc#&dzd=Oz^brG!+KK>9o|@VX?O^gVa@#T
zw&BCLHNPh7E3)mDEo%O;gdb!J)>l=Al~-Riw01-orM_xpe)~4$_pY!rHiQ}HcgTk7
zu%;S@>BG)$uL?`v@ZAkEK-j&qTN~@cTBxcV8dhKS^N_Iqvp>~!Vao&$%$^?M&q1>H
zgr91%?GgSQ_WgXAcHxfvy^Xcup#+3IQvVD;$V|d*wIi#-bd9yc!;>WZkjqsxR1C`v
z2`iwcDmSb)Jjll3^T2s7!f?
zksDB3+ZcAuitN-OynyG-3;TpWOU-=0N4WOk+7wrs79&jC?8`Ar&651>%d^`{E9wWE
z4nv28BV|=(cv|O%glB8mgS*t#HdJRjUO0qwYYY>GJ+f!1+4|4o&`*88T{homTZZdd
z;blBrzY@N-wOAIiGJ8Q78lK~|^#gMws%vX1viX<>Q#`oAgrni8oEc?G1`f=Hqi!y2
zzAAHpys}i(n_G)Y&A11440D`+U-%-O;(=i<1FOu!qN-u}AD#{OPk21LKe_*V_pj0W
z-w)>^IrCys_KIje4inG0GFv?Nc($nS&605KZ_gI>KchE<*Ma(6T}6Gx&;~QLxUqUz
zt|A=eN0~o|G8|A2Kh$h1svcHb7oOd@N;9FjwzekwF*`8aSUfzu!p$fyHOs#)3iDnN
z&V@{IRYPS(U6uK~I7|`__>Jc4Fv0p~^Xq9+ll63S$^TeUx0RHd&&Os{ul;+r!1KS(
ze%|z1*mlJOY6p%o%Ssv=hc=qm!@18e^L$BIdh=FjCcl+Ux9IueqVNEQn$6*+RhzP?
z>e9M;^Q}bJm4?|a%_e-{tL)mnTU^v&?kP28`Kg{M8Du^#sUDOwlS=bDo=HmcgFO(s
zRqL~b&zVO{tHTI`&8lo(2Ri*${4-dUJNm^2y;`vv^>2c-afPulaXr
zxOYrh*tnC+!v1+(IK>)RH8>o2|5ZA)uDYhmgcGsSoN*-;bvbiK$zb!3(pqy*n11ay
zEyCQkgn5SDD;(5na`m;t!>h{Dvi#wYJ@eHt<(TVs2vbg2-zHoq^Ru5PzmQ$8n$k90
zubz}$Pu`Ntu2`;V;Ri`YeC{SLNBu
z$+j@noN$U8&VO^}>gJc4TbqX^%imC8rZ*3-wD*M@mOPxzVcZ?rVoaN!O`WZ#r<#Z3
zSbd{e9H!X%U^e$~o*7Q4o@jo_@TzcTXkKdGSP|y%cDR4(qHLvacqV(oC1cCO_0sp6
z73D@8Y_1LGv;$@3RE?+#&;5$}`s#23@NF2pI#W12T-D;c1Eail)|-hfveo)t^Wnqt
zXI1957GYbv><}>H!E6DCR2+QR;kf~$8mk&|!_2!a!gDTcyUK7%us%%bwuNV8i;4ja
z=DP9$`Db%Z4kcmQN#&J;tHV(!Y~EY4wVIPnJgq!`x@(>*A8O__uQ#u@XfXe5(KxEE
ziX%YF@c3TKo|%*K2bVdwWY-5RTRtn-5!tW5W0E*x0hB
zI&9W2!pvs9p6!*hzG{^{hr*F^POC8M=URo^mafdMmuv}V`NadO8b?-zjs8Nb%J2+m
zG|R(Oo2F*>&%HhC{l8n%ZwmLUe!X?LZPt6){p03`?-VT_R9zEJ45|j2>sseWnbbN=
zwK|MxZV5k4doY_a`8a(0U9rr6ZtFqA!-4$qaOb4w!>o;O9X3Su;2{HQ!~TC?>+HDv
zO1Lw*Hydfu{n;{%nXixG^Kj3EJG0xiKB%{iYZD&JyV-3ECTEYRqOn09@U%AHJqxp>
zBJ33ZY+V`7pN54&8qC+Nt180zocUv$Ml-98Y5v`_^wF>?Fzm7=W>Rgq
zBkYZJ^|jgE=FuJMvZKI)uv3Rulp9-yV?oY*({h-ZwZo<6sgTY1GCM%6_%xegctJCt
z?2x@Md=~Cmn!jh-vg|qFUdpb=y`Ejqc{aNq^Fnq#ZAp2N?7Qafw%IW_oV_)e>)U2~
zpt-57yfL`7ZFUN6rni-MANRKn&%fG=#%ymiU+oay%!Qu^Ww)5IZ5zUYr)@a==AVD-
z-)~nG-k*fkFw$JrF6^VTvZu|gso5)M{t07lZ8xOqQZqf=H)lom%wL6|hg(c(_8v1=F}!hz
z+0ZV(yZx)3&Tq>P=lAb0m$lDl^Bc2ccw)`Wubdn5E9w(Da6BDuPseAsOjs|stk^Mp
ztPu8+B|A29j$Lp5zN0A{SXC2Flg%UTvR&ZacHtbR(foDCaAsInJ1iWp7VH?VJ_zm5
zipuOXG&^vZyW2H3hC|}lVUVp~WZQDnyzHm}KRaZk*JRgAAIn~c{i1OAD9KMZt9|~Z_`&x1bECOo@^MqL3Fn6oK*AI4gKXX_
z!U9`~p)&F-?Hj6U24&|tVOPmc
zEA!*5Y#-kC=W4>SxF)>2sH`z>w;wqqyuFoos_(TAk5u-tXLkyF)%vg;b8asUOEBS<
z{Ppzk^=)B~4}-7SIh+Ok$O+Z^;nSH#GqYgQnCwMm(>K}Av%bjU{K?F;4*BzoJ3C}2
zGq-fePG)9x2vh$nn{L6%?0W6j+4b`GO2e7T@(!G-OzJSm%bu!ICcTqguMgk67Y+gW<(dCwHrM=F
z;Vm7j>vG}qj___RoPAaeYcSI~h9^|^HFYh+`2Ns0Q2$Am4m~vsza5zcbDq0
zIo=JACA{*6<6rj58_umd4y(GfF?^zsy;%q!NnF=a&S>+esgpWpd-0te!&`)54f$tg
z_0YPS>dJ5|<9+FqVdOEhv%P=J)D}fqR6T64nYU}UljaYV;raCBuGu-qOX0RTE1QQY
zSG<;8PhOr~FJF~i&$%=Fqo%U(ZluP%v#UIT*6o@v`*=I(xb`R@raFv-CCfxK!b}qSM
zN%*GJ;_xmzoR?IZboYi);f?oD^Ff$k^4)F2W7`mZn!h?b^;^9x3#L6D{&8ig911!O
z4X;e$jrsUa-<|I?W~=RnP9v(bH-2VHCsR^oChVSVWb@?i;hAi1?-X{ZTg$>Dn@|_7
zX6zS+4~MqlHI3$-PK~t}n-9VSlk?}AK3s>_x3I3ZcFIovuIwBh^R{gBPRL)U|IRjQ
zcyOJ=$53~MJ14pP3d!F&H-Be%=#O>2B%Jgu?3}HX26Id28Z)bNUA1|*bAx#{+!&^K
ztJB5dMfc-Q;rKbOb9jv~uZDSjzBYTzGyaiXugzaC&tI>2JG;e&pG_Gjw^w(OliTrK
z5}bew|5E8!8KvxlI&T=8?J4g<=pJ9F0w0y_r+mXFfW8@C;UCzzGL3Z
z-tmOPLU;~*+2y;Z!`3d@=|(u)%$em~vL}kUa*yyN-H;uv*KW(g`7ZzFCVwEDy+?zb
z>OB%B+VXie(WJj*@9gr2yO;OKf5x>U+&AXW*?sHp&93L>fA-;>W_a;1U+xk1s;yy?
zt#=iLjWuaRm}179Y##adnKyN94A1*vW@^{)0`Oio#gfayBdsuh?iyaR2322bW_PU*
zZ+GfPnMcATQ^RNOrhI_;`yTn1hL83LPvY>7J-n^kv`4kMva1~YuJ2lB9`Bkz9=@7I
zTZ+P7xTO7qfGKCE+@IaT+!-ybNAkWp0lyt{RoSAG<3|GA%#J
z=PzUvt_s(tB&?N+x^U_gg>&cZhv#(irD5{r&u8-rJLs!XHj7;TgU9e`SC!cq?wypM
z&4O$;r9(yys1K(j=H8H-FQRNhbA7k)Sx5FXzo}c;-gjrm-xYV471e}yH{HStsW&%7
zm*mW?-LlVUjSthTy(fDLtoT{DT4cl3+@EI)n7y<%n6=%i2ZraP`LG*Dntz61(Uk0g
zq~o%sl(U|RduC@nH}4saSmCn-Q=C5!xNXlva@h~rUH6B-he+!}wdl3%Ns}(io-X0z
zffx4-A22qUS3;S7oZYkK!|Zz8rtEs@J7KEQ@U%AX@0sn!AMY8~X@mJRG>v9+NTyzs
zKlY5z_KbcZm&;Dg%YM*6G7G&4!ugE6c@^JQw7hWx@%+o!>t45<)(j$8}
z$k;E3Xvw$P=aMR>)WHv1;&CA`Z%=+$f#$vwe9zGxrpE%bJGTXX`gJh4o@Zq<)zeo5uvnKmg
zeL;@~v!X|%nZ1|HdqJ4dhAG){xG%E9!JwLo@ZR$3y?^jxJAUu%mE-BX!i%uEA^aTP
z_UFvEd)Ax#_BLhNn-B9@w{TYX(4H5EDYAEe=D9ty59f1c<(`e^(Y?dY^FsEpw=T`D
zCq0&3r_X0QO8zvHh7-ZgSn?1v>Z8yZ+xl^@ye&_J%(x%f31H$9Fa-UT@
ztty$i(}besMQ5+xX;aarqR-17*lYijPWt`XbIRtIF6e&XlClkDvq~nHd|o#9fThjn
zl+GzlO6C`DC^>$8aj$4m*{Xv+Z#k>T7f&lnN|M&&ipCYqEt_Aowe{+vsU?$&9w?nq
z^g!9!6N;ymE@?3-{9URmnN>Wgbp0WViYJ$?Et*y4%PyTZGCt
z&33MvU%a&_DVkces_4S~x0YNup=4aqw9-u_n@XmZ+2fDjbxGNTX48t67Ef!xwdJhx
z70rC<&iij|owk`!;)^ykKXhyBBjSM%lnq%>d}z&tHg&#qM%lC-TxpLvc`j#u2O)6X3Ea?z$={=+6toECB
z7}IA%$*g8!la;J0o!??n>!eH4CTz^&6~(JtPH54?H=p*C2U;&FTiR}Us|T979$T9&
zXyeP~7A-AtyNxTKT)w3JmKKwWHtaH^-O?_TI!tIYt!V!q`|sRiLs^gT=l+LI+Rd&g
zSyDQybZY60W&>TBZ?(K=$dDdsn;x@Dx3uisWB<;bd+p!3*Q(~TN>5#1=2{%Te&^-I
zlUr|T_CWcDX0w_tC>prDc-)R@$?_f7w%O8ob@AHrS!FZ2PTqS-$^4FoW*`0=voyR%
z-65PVoZ7$0gg?wbu)~{h@+-OjTRayx?NGJjd=Ne;;Zq}C&g3M3&r=~P55D)ER*}6!7EmYm*TB|7r%~I
zuNHrRmxuqiAzQwUcu4c&ytiTBPP{|-A271@J#J@l7d)+t_+UJFKk>2n_Xmj2#AB@Z
zH+X)ncqpFJARdKhHHs(T^fK|SxL5cqglzfm#9PAuf021MKKg#~6L{)h#4qF3bHs1s
zLmv`s5M*D_y?FI_L5
ziWh}V}+Uz|AcnRpSd
z!UsMq_m99AJ}SNqpB?`GCR_doaq~CCPv8|R#V_F_z7W5Q5BysE8TPnUCt3deo0aD0
z-vgf>K9bDFI~qR_&Hyr>jgPnD0eIJ+i-+TJCyKAa$w}fH@vL8p@5KB6N<1H*mlMB)
zHw+Z7#H|O3*WrP`6@P&z)QC$v%i~*xcg4O|?(c(oK6zIftybjzmFH;Z*i~ic~G|gckUvO=h9om`(ra*d<0Gt@yU43
zz2funKs;?@hrzr#bkcsxFJk@$A}`E%k2@zgiO&)^3>6u*iaKNi1-_unl30>`*K
z{4I0X^-Qu=?r(!V?toL=1)K1xS+;)m!Vx|ITYMOf@iExp6L5l0!ycc5Q~Vno{?0N#
z{$L#8I&ASM9OEmo!{c#+Cu5Iq$0@!Cn{6`wY#ibF*y5*fj9?4PvR6mhfRr$zYIq>e4vwmK3V(@j`2s>
z;m>e_w_=aWBAH)`cfh7p#_xzD9AS(1!7)A~MRW;Lh0Ny>N7Eq(^a_$BP{
zN}S+#u*V9N`u{Wcyg$9>=%~cDN@_@Ilz)qi~8(z-A{Izdw%f`Pkx0
z9OI$b;gLAOS749F;}qYFO?w%CI*#zY*y4wAjGx2~FUARe1$+D!PVxKL>@4GN#1Z}q
zTU@diuRpjAcDN%>a5wDnemKR4Vbejz?~5aRGPd|E9OH|y!-H{xFTo!F4yX8PY<7|H
zC*la-iY>ki$M`SU;dwa0PhpQ=#3_Cqn~pO68XVydvBjU^7=Mc$F5g?WPl9*E9(Tei
z-V2*uW&GYa!bf6@kHaxO4Lf`;PH+YG_+p&m;n?gZz7|`26OQri*x{Kt!4F}N
zpTH@87MtB={AD=8Z(@tz!!iB@JG>buxTvRW506{n6nDU;lZ@XLM|dA>@gX?I$6$y1
z;RK(7J-z^^xC)!jGJY+N@F;BYRXE1iV~3~U1mA%@z8|Of5p251_zQ7_pT`!zhGYCT
zc6c35@Tb`0Z*Ypsddc=Nd&u~0afEln7I()nJ^(x12PgPg?C~i$#phttRmRWZ2v=i^
z8*q#-#}1Fh3BCb)d>c;j-PlAj{%joK$FRlE;26Jz9bSnO{0{c`W1QkIu<0h_Z^IF8
zv5#yYi`(NEcfk(##0fqKdwdj5@d?=MDdYFY5k4PVT!~{m6gxZ;C-@5N@pzo#o3ZIG
z<4?yCz872kFplw)*x|)E!LMMC-@++=ADbRB{ze?(udu}>`^xr+aU1M#N1Whp*yH_h
ziVwqPFB!itj_}FY;5vRBlHoauLy>NtkV~dZ(F+L7E
zd>T&hx!B_hoZ^eI*+<47jw3u8TYN2!@lDv_+i`+tVvirfW?vca2^`^PvBk@9jNil#
zzlRh23HEq1PI1xxyuR!wQ?tm@sietPFcK8sS;A61I{cwuUz-E6L{{n1r6?V85
zCwLV0_$r*@>#;dN=062T_zrCG{W!*tV22mt1V4{c{2GpaBICV{W4sPK{3%ZGH`wE{
z17!Q8xGgrlW&XQii@Rfo55NiTgFQYLr}z|X4wU(ygCm^77FXjKH{b+cj#E5Vr$0#M
ze*<>-Htq4<*yGta#gAcgu*~ln9O0L+#Vc`)-@y)lj1&9?_IMjkaf_eu{5eF%Z;vC~
z1zX$`$M_)Z@KHFyCt#2J;}oBd&7m@WC64e=Z1G4O<14Vk<8gv-#vV_{DZUq*!({x2
zafF}57B9vzeg!-H7EbW{*yD{j#b4p*a2da(w``9Xx4{YSh*R7RM}4H<4_kZ~cDOH2
z@X6TYvv7(p!sZB>|6m;9OR&Yi!!f=ZJ3J95_*U%kT{y*m!RAOAe;$tTQ`q7cag1Nb
z4zIxp{t$co8BX!H*!)z+FF#PWPlR{G7I(ri-U~b28z=Zk?D26p#iwC&l#G8aj&KFG
z_+lL6;n?BPIKkIqk8i>$z8#yRW&D{q!VlpXKY<;77JIx5r}#~5j*~SBQ;$v}iyv+X;Z1FkT}096LN#r$14q
zzd`TEw_%U(*6I7n^s}+WkKqJAqtl-x)4zlxyi$Ao4vz81*x@g5g12FhTO7jk2e-%O
zWEsB;j&M(G@j*DoM`4Fgz#jLE~gGpTa4A5!
z*y5fz#s^}LkHjhdIW`x{{7=CVJ{wzn5svX7>~Jkk@TJ(}D{zXh!|_Ej{!Q57X*j`m
zV~-!iDV~R;-^l#D_V{`2@vGY7x3I}czZOUM6KwI9IL6zs!_E6}yu>?V6U+Q}#}V$1
zE#4o;_%Q77&v1hKVUJJ8DLx;Y3K@R@j_}3U;zk_f%dx}P-~>;^9#6$7z5_=CWc>TE
z#Sh~cFTf5zixd1Z_IM>uaf(f)jQ1gq@V~Id-{2UR9wFP$;WjwIyI_yIVlz<2>xE-{
z5O(;dIKjtZk59!ZJ_nmBng4Haga>1b>u`)mVTZ582_BCZTrBf@
z8%KB@w)j(=;BTZiYPs0g57kgZRQ+zQtzmxHY;|Pz&F}@Zj_$Hj<+qM6_%x|Xl_#y4_6WHTtaf+8=
zbGgj#O&sC(aEw2}4sXUD7yV4OM~Yiv^9PxK2OQz9*y4S#!-rsxkHIPKhqLbsFA5(c
zo`JLP2hV%~PH+|WxE7~)6gE!!t8j#`#}-e)4&Q-2z8|Of5p1rI`7gu~ejZ!=8cy)r
z+FvRCI-MSu^yT@0+u-ObnZA4Gvhev3J^-iq5FCDeWPbgfrqkmA*yE8nx>}|mqtjm_
zz7ePR4!wV@+&?>WtFWP5v;26^V2j_x4sXOBms$Go%NVom-3eQK5O%m9_V^+ke&uAo
zZ_plJt36J%$MdwmO8S?z$M0*8w`z~uAItKOk$zun@v+$9^RUOY+FvdGHQM9bwa0U{
z$1iGsjr8wokH69$xBIy)ug5*H87uwIu*K(KhikOQS7|>^`afxpAJQH#(H^hS{#xn3
z)E>7vPL|i<9@yifu(?k9GqJ_h+GD3Zo}&GD=^xY{KdU`ntv&us`w7ywJYJU9;%?aC
zBe2K)vAJIQLE7WXwa1gS$M1wQ-lRP)KY{%>{7Td!W6U1d;={1Rr(%yQ
zwVx#YW!mE#w8yiw#|yQ;LHake$De4AOHX9~#htLZQTl_i#V2EjW9{)s?Za=H%^v?B
zwa0gBj~8f~KHqaSof?q#vn0o~S*ZsXbn({WR%UYL7Q+kIR3-{)@X}bG!6?u*Lnc!-KWQ
zqqYCD^i#CQv$e;Iwa06;pDz7o?Qz>v*#5XD_P8(3ej#-B{5cm}T&q1Et395s{TIB2E-IB2E?7wP+8i~D1T2WyWq7hx=iVbJ#pA
z{YdTcMD6iR?eRkG=Ssg)d%RJ5Tz(eYA9uy(5$XG2i~D1T2WyWIB2F8>wVA9uy(N$LAwi~D1T2WyW<
zYyUUtr)ZC7YmXOekJo6wQ2Nc<{&9xv2>k@PFI#~ZcB<>#~gaaU}f
zmA((QxIcDyu=aSg_RmQ_MSDD3d%ReCyhi)Q(r?xtxBWHSANRx__r+$3^ygxWYqiH?
zwa3%7e_r}|+T&%~<8|8OZQ8#eea8#f{{&9xv2>sq`zg
z#~ZcB{&9xv2>h4d@6#~ZcB`(clB*t{kENbT`N?eR?Q@j~raOTSWkyit1`el59dKin0Yx25lcE$)vU9;`hc
zt^GfwpQ1gUtvz0>Jzk^z8tFG{kK0zV{c%t1abIjw>CeR$*J_W)YLBOD|Bm$Yw8zV|
z$LqAm+q8dI`i=wH{{&9xv2>t@JCk#~ZcBU9tH@`aam={@CHc+T+pM|5N%Y+T+>UUJjw8zV|$LqAm+q7>fea8m2Kkkhk?uR|jVbe0{r)$5X^z*dG%e2Sqw8z`D-%0w8BiR19H+Hxm
z_Be-4d+A4Nk0)x6XKIfZYQMAeE49ZPwa4WnS%0`IHXWqzgDvil9UiPb9`{zi0j7U9rc#vDs7l6S2h?X^$JV$K$o{F8!U_t$CN_IXU#&g9Mtgjx_V^j?_m+OG_V^p^@$P?+<@5L;Y3@kW
zuEGxgUVD6#_J>G+pZ54E?eQw@@kZ?rm44@|*njb%*x^&K#{;lAO!`sU<4M}%S=wW-
z{o&HD(jITp9ycGu`oj@6eWX7ETYNfpxK4X~qxMHgKUaIaLVLVHdt7?8ERQ)-`p($m
zL$SlBVvh%E|5NFIuRWfuJ$^uYyh!__q+hK)-l9G3cn#|hAB4@((w~eiuD}kD(jMQS
z{V~$tt37^7d;F&M_*3nFCVh*s?0>i$cKAr_@fq0kmA+bge1-P-R_*aa+FR-0)E?~6VDIW{Lt|7&b5ylPka2d_NPhzckS`Nw8t&4m*w?%Pi%fE
z{ZFyQXJUtct3AF_`~K4ZNqhWP?ePoR<9D?`UHY%J$2{&DT`tJ>p_w8zC0+5TrqzdN@0VC?WOu*Ua
z(!ZlU{z`ki%Otix{s}g}lKw<&@o%uhBechV)c#!Q@6jIrO?&)?_V}OLpC^5@8)W$`
z-UB;)IQICL*qkr@AnoxVw8yt-j~~?j*U~?yJ^qLGxadaKAKnd{3#2~?TYNHhxI%k8
zO8X0?zd?KaSMBi&+T(Y%zexJ8wZ|Q9lI3;y0POKe*!)KN7+ZX)_IQ%^c$W4#>Am)N
zmG*d(_PF_ESw0g>A7P7+zz&~|JszTch4fB)JXL!VT-TS9{)LWYhyhAD_)M5;1vG@Z^EBrGf>8Bd5g@i9gc8>561`MQ?bPZ@agzc
z9OH?&4&Q?veiBc@D{z88#&dA-6dpg`4KK$B;uQD8oA7V2sglP(9Jj+0aD?x|2ja)E
z#joJg@p>HNZMY8aGF6t};REm_d^}F@1$Yjw#~xpcm*WJdcplz_U&dyTJpT7_JG>P~
zxc#lNya(cavBk&Y)A4yY#G%j71u*09=Nx1aS
zvb+iIgy-OcvBxLl1A!2aU`9*BKB0vGXk9N=lV
z3D3nLUW7|{C64eqT*g~*jJw^({^LG4!Gm!XkH#sUgll*v_QtdSxPX^nAGhHm-iQNS
zcR%}&8*qsG;Sz4d5pKq1JO#&iHm=|noZwbm#cObiH{%+ve}Mg;!2aU`9*BKB0vGXk
z9N=lV3D3nLUW7|{C64eqT*g~*jJwTe|8XCj;K8_xN8=Pv!Zkb-dnNWC7w{77<2GEx
z8*zZ^7O?-g0f)FBF5yNT;bvUMQ*exD;|gxU32wzzyauOuGp^zK2igCL>_0Bxf!N0*
za1oEk0iK4N@LU|?MYx1l;s~$9WxN%~xZ5Auf7}NrcrdQw(KyAEa1GDI-f!7|T)<1P
zkK1q&Z^Qwvdx-tV4LHR8a0xf!2sh(0o`PdM8&_}(PH-!(;x#zMn{f@-Kg|AL$o}I3
z9*BKB0vGXk9N=lV3D3nLUW7|{C64eqT*g~*jJrL;{^LG4!Gm!XkH#sUgll*v_AX-o
zaRD#EK5oNByb%Yuu7&-_4LHR8a0xf!2sh(0o`PdM8&_}(PH-!(;x#zMn{f@-FJ%8O
zX8&;k55ztmfs1%N4)8SGgy-TAFTy3f5=VF)F5|5@#@#CHKkkDQJQ!E;Xq@6nxQ1t9
zZxZ{D3wR0kaT_k;jX1z{kFx)`0f)FBF5yNT;bvUMQ*exD;|gxU32wzzyauOuGp^zK
zKe7Ll*?(NX1F?@s;36K613V2k;kh`(i*O0A#1USH%Xlk}akt0Vf7}NrcrdQw(KyAE
za1GDI-X-imF5o5D$8ETXH{t--J;99*BKB0vGXk9N=lV3D3nLUW7|{C64eqT*g~*jJrL_{^LG4
z!Gm!XkH#sUgll*v_O4+6aRD#EK5oNByb%Yu?l0^=Zonb#hfBB-N4Oc6@e~~6*|>sR
zaDrQL6|cc5-i&Lw{wenVO7?O?WO2@giKpD{+L^;WFNeW8Cd&
z_8<4b2_B5Acr;G&BwWKYu{VYN#|69u`?w7k@kSirx@Xvb+<-&e50`Kwj&L(B<0&}C
zvvCEt-~_kgDqe$AycySU{Sx+nD*KNMcp&!i2wcSDae$}cCOj91co8n)l{muda2apK
zG48gM{l|T9f(PR&9*t8x3D@vU>_zN9F5o5D$8ETXH{t--CG0;`*?(NX1F?@s;36K613V2k;kh`(i*O0A
z#1USH%Xlk}akm%Pf7}NrcrdQw(KyAEa1GDI-Zkt$F5o5D$8ETXH{t--wX*-X0f)FB
zF5yNT;bvUMQ*exD;|gxU32wzzyauOuGp^zK_0Bxf!N0*a1oEk0iK4N@LU|?
zMYx1l;s~$9WxN%~xZ4W$ANRot9*nDaG*0m(T*EW5H;w(r1-u0NxD6NaMjYU}7ukQ@
zfJ595mvAGFa5FCBDLBTnaRs;F1h?WUUV~G-8P{_0Bxf!N0*a1oEk0iK4N
z@LU|?MYx1l;s~$9WxN%~xZ6wYKkkDQJQ!E;Xq@6nxQ1t9ZwC913wR0kaT_k;jX1z{
zFSGx+0f)FBF5yNT;bvUMQ*exD;|gxU32wzzyauOuGp^zKSJ?mS*neEW1F?@s;36K6
z13V2k;kh`(i*O156-PM5WxN^3xbsT(AO9y#@Bm!JjX1?)aSdOFz2EEo-;N9T8SLY?
zaS?CB0p5KT`;QO8AwC9|@Go(MC*m@mfn$6>uHaUj;P-G9cdY95r1(d;hEKrW^?Lum
z#sz#S_Hh{(@q8TMCAbN{fkV6jm+h(qVKX4fzf@3@sSMV5|;45(z-;7iI5U%0p
zuy=#r|690#YuLvf|EAYl#0@yWhv6nX42SqET*8;(2;Ydycma;_Qe44r;{<FcF5)9_fKS3r_*@*~2$%329N`vR#xLL)
zzk@6IGo0X^+Vpy>cwe020l0>TV{ew;e={!NE3uDn#zp)P4)Alh3BQFyT*D>YakXA=
zgd1=fABJN*3|H`3IKh|UD!vh?cmb~ArPwR${kP!){sjBD%bR+=Mf@Wi;G=L8J_U#P
zJY2%R!x6p>mvIHhcsZ`%H8{cBzs3IJ{cwtZhHLml?A@sMe-19-so2MJa1k%W0bY)q
z@LC+=Ex3fc{15w&d*L!3gkwAgSMXIh!S~`SejcazZCt~jVeh~7{&#*`ucv_b!#+L&
z7xBqBz~|v6d^Ha79k_%a!x4T7m+^WWHW4Hwqv^?5hz
z{rAQN9AF=h!bM!d0iJ=IaEwFz1TNt!j_`-LjJ>sbeKFnxS8x$0cqp#o5U2POT*GDT
z-Jp`cJJ!-
zrFc(V!-rsRw%-5oxPX6!eS9e{;u~>*AH+@gSsdcGa0!2kBfR53^m@y9UmWAZaRr}<
z6MQbN;;V3qZ^JeGDE8*){lAC{_+9MduW%9X`X2j_55P_MXdL3xa0ySu5xx$W@!dGa
zPvQ!G6({&3T*ceH&;H{*aSb1Wy<6FTT)@A=KE4ze@r^jZ58@{LEDrHoxP(8&5#I3w
z_8;$yV|+NS;1h9z&&5@I6;APOxP~9a-fepSRb0RyVju6YPOq_6Tg*YHu;yIt@9R9wIpU>{$Li})@a;6LLg
z{0a_n4VQ4I5B2&Y?Bg;XfMeW*EBG9o;0Rao-8jWh;u?Mxdw1yle}oIT!$*33KHeJ_
zaeo}(;kXHp!y%rEOLz{B@IqY1%W;g?;tJk^6WryWdc9TL3#WJxuHli`yHoFf0xsa`
z*vIp55iiC8eit|4uW*RFeyrD5!UJ%GPr+q85y$us;$5v&WxjFkUlXk!9^K<1iN&95~7`3B5?%2umdODVQ&+NyW
z@*q3pO=E5@eQ{@A$2;cGBK#{TaFYcjwZd(nFs+
z-9>w|^|jpk?p*p~eeFM?H-BI6&ZR$eU+ur5H(USt5A*`Wjn4UE>3e4{l01Hm`!~za
z$?Ny<53_${hgf=dF8%BMbXK2zu94T@EayvqQ1(L(vGnd-dau9Ey3w1hA1ZNnSntlI
zA4>1jo4>Dj=hBzy_o>tCH(P&&F8}TN?p*rL1N7Q1;r-8Seg6H=ol76m_o>(Q&DK|P
z`{&N3FC3xk|A75BTR$MzyL0J>9;JOBdb9OUXJ0eq5H~vKi>2={TxZKV>-C#uF8g21
ze#jw~-knQ-D1AzAwthwK`rWzoU!SPY{RO?*`VG0>olE~=wn1`kmELUq0(p=f@GL1I?p*pkPS^e@db9P9cgvn6
zJH)cSJD2|Di8|{+Z?=9|hxYv2-krCvKS}$`x&J+|^~K!l@6M$kdWrU**w+vIeZ8G8
zbLlU+O#45wzS;U%9%P5SX>`sPw_ktu0WOd4wd=?7bMpERkO$czZ={$1Zl^q!AJR8n
zsgLWj$MX5lEOY5M$b;;VH`2Rv>5rVMvqJV*dUN)$y+2ms><~-u&ZUp&{cNA4H_Q35
z{yFj>JLHY@?p*p0Bb_zVo8^4zduKo7u-=_ZU${zV$I+Xu_uK35dUq~;k^Z^tJh^_e
z^~-YaKki)m&#%_!K013Wz1jLV_s|OvH|FNjzkH|mz4`vbZ2d(${Cn@tr4R1W{xEv8
z^$Rrr_Vsh;(tk+5SN2%0-)wy#53)nv$o0E(>3iR&v+UDQdvBKWW&g6zn0#>0^129r8xjcjwZNeL!b7WsjvdXAj$ZKl{2Whgf=dF8wtR>+Jl_+MBJP
z(O!SoyL0I~Kccgc-u!*NJD2`u`pMa2xqh?tkLTY1+`05aE4u!heE(#&{)yc6yL0Ki
zN438zdo1glt-m7o`nhxIuUM@8&$3i{v-R)f)_3R9kIF7k&Yhn9Lwd9Pob3Ot@*q3p
zO=E5@eeFq|jm{oRZ_XaJ_hpH*LoB^Jmp=N7&f@IXveKL7d|CgX-0SborGNNo?H|Y<
zOK-ORhU_`y5X<`RT>1ge=eP?-)9r8x5-
z%+^Qp!0Fw&^fO-4{^zW3w!U|+cjwYqUe^A^>~)g+H(OuGz5ec8`eY^7pIxK$X6rxP
zv;FeFy?=Ku{elm*KZo9I{ju^OJLFBHbG}&m4Ik;O57%#&xxD^2=dRzKOCN2}KKtX=
z_UkuW|94YK(C3~=Z?^u{?7rj>%lhtI`VHUc?8)r0T)#PcsQZ_F
zU6eyCy*row=1$wS&rZmGpGA7JoG9Lo$9r}koC>hFUYO$
z&ZV!=U&s1p>+|0~xO3@m=%VZ2M{l-1|MBn6r7vY)AmrS$xPG(sr);k`AZ~Qd7fZiv
zH|?KieY4Ev{pZW>**~&FEWJCI{^tFBCo`2iBbLq=P?H{5yTR%hdZ+mwx
z{T_#Ce;d8o`uz8g?p*pR{qFQ;>x1m;q8#Ez=X|mBg~N6IuXz2;GMCpc|NWmkmwv&|
zwEu|SY<)R<4mrfKzB`wGz!BQN$@QD9&wu~t&ZQrFl=l15o2|d0ef96wcjwaA=-=Y{
z&DMXJ>)pBZ9}d*@pJ9Eo_4)7L+`06h57K@Uz1jNw_iyf8`ohn(UuFA;t?!!q{9)(I
zT>75JYCnSY&DQ6?ezH5!QkLB~fS?2Qo*E9F=
z=gy_?lzrnM=dR5DA-!3CPWqwQ4>`oLzB`w`iT>D{^X8&1&szlmQznXSJs*SmA+%fqz)Ex&(l
zw*Kkd`;R-9e%NsBw`6}lCD(7Z{?Od|?p*qaeoglKl+v56-#gdaykmps{V03ih`;X8
z{@U(>6TCZ4@jlr5M$g|L`}klS;KOi;kHQf?4#)TxIKijl6pzNbu-8e~?~i>P-~bgv##F*`}hDH;Gg0UAB7`41jqP9oZ!=OiqFPgXI*~+_VJ}Sz*plC{{csM4vz8N
zIKdC$6#p4}yXg8$v5#NG0e%gK`0qHv>v4=f#R>iwPVo-=>Hc{2x_%ez<2`YJ_roDR
z7)Q82j`7hr!6)DppNhRMy8amK<8yIe#
z=W&Q%!4Y1KWBe{o@W(jCUtn)nU4I+)@s2%pe*(N44)H!X!o6^e55WmO0;l*m?EO&J
zAC7%|8V>MTIK&s=2v5c_z6vM!dYs~0u(zA8KM(u(K^)-6aEPD55nhgC{3=fH+c?D^
zV6UsLzX|*JD;(hM_vh;m-UUavJC5eY$KVkE0!Mfxj`6Q>g3rS#z8HIZ>iSc$kFUc4
zz6po;E*#bIKo44j8DV~J{_m{Z0zl=>rcQwz7z-eY8>J};0VvbF}@oo_#vF)
zKVxqnU4JR|@ryXXui+5?9Y=UQj`62B!T-W3-l4bdkJq5+d;9A8+pv#!JV5s+z`NlP?}H=U3&;2noZusHijTwIf9m?fv5!x~
z0X_?d_yQc^$vDPW;RIigQ+x~d_S5y}VIMz;1N;~c@iREW%W;ff#R+~Jr}zWx_0;t@
zVIO~m1HAo@bw5J93yyGi9OHd)f)B(gJ`8*N>-vMRkB`RzJ{gDjOdR2HIK~rkf-lD@
zz7~5w()DLyAK!)pd@m01BRIl~ag3kE34RHu_zmp!()HJ3AAf{H{27k$H#o)}59I3&
z-W8{KFYNW!_4da;?u!F_I1ceKIKsccF&>E%{41Q|^RRb-u75H1@l+h(>u`u~!V$g;
z$9O(Y@T1uKv99+N_VEiiz^ibG-@*}o56AcuoZu}u#oHak*Ovoz{hhIocgF$lfkS)%
zj_^-$jE}+z9)eSRBK8i_^-sqEJ{w1P0*>*eIKfxr6#oHx2kZ0C!9Knl2lycz;y>dE
zFU2u_5vTYy?Dx_2{*FVu9!L079OHlC1n+RL?oW!lV6U$}|DHI&`{4*5jAPs%C-`Wb
z;uEk})aO4H`*;iv@VPj|7vdOSiBmk?&Obz-|3)0)JFLg|;{-3nDSi@rKhfuV9{cze
z9N^VB#P8w=e~e@N1y1lboZ=n(@bU9gU4J+1<9%>|d*Kitf+Ktcj`49g!NYNiPs84!
zy8c<%#~0uLPsSm>3P<>Q9OGMXg6H8BKZw1VAZH7aZg6IK}&7zrXee;s76pBRmMl_;{S)lW~gA#NGgX{&CpH6LEkq
z$05EJM|c*F@ohN4_u>>kg1y6a{l(bF&*A{TghTuWj__I>UR&%p`48>jdo>>sV`
z{TYXNDUR@qIKi)B@8{b89S3;5_4rfk@xO42clZfkUyjk|>whqs~1AMCWc#QSc+znwos&tHfG{3MR?
z^LGAFJ^vN#Rz!*zZ#
zj`5k;Z_@cV9N~#L#h2sYL_PmnJ0H)&-bp&Y4Ttz%9OFmq{FC+k#W=#x;uODxgH!bU
zH*kX2V*gZ~e}qH)8IJKc*5i(c@$rIp#oh>gzWoMe^BuB(U*u}_Lh;UC_7}YB+W-E~
z^Ekk7;RtWS3Em-~ze@YPaDWfN5gvjQe5Uok)BZy1@pabY*m}I!`m42HX+8eHdi=HZ
zc(~H#c&+u+xsS-=O_Y$LjS4cwZdh0XV_KvG)h@FdEbSX`fDgkF9)=Tqmi1-rFS8!sXgywFJzi@4joP<
zcNon3FWw7#|E>K`aDb1;5e}`#ldZo=`n@MTaRC}{$}m}X+7R<2=Bjm51in>
z*t~~0_h{dJ82gX=;s_7H2_A#J
zd$pfzJ)UJfo^L%~YW;oMueKgW
zFSj1AwSK<#Tdc=j8rgr`3nzFG_7-SA5(jvK^?17Vc%JnSYQNZeyvlmK-g>;v`af#l
zeK`A%`{D=>!3iFNy@#})Y(1W3J)UnpUTXcr+OM`AZ?YbDY-0a$59~dneSaL_;W)zM
ztjANWZ_$2^^?0H6c)9g>t@R7F-(o%Paw7YWd*K8R!d^xDkvPB;tjE)>$MdXzRQtu&
z<5kw<_15EU*8fTS?kBPTxG#?I5S-vK*n3R-$=2gp*5mos(TaVXTzf}7z
z*5fWC*?-&%CwLI{675Ig08g+UPq!Y=v;JA_7h8{4S&!FSkGEO>oc7&EvH!R)j_?qi
z;4#>HUi-<`<5||@`PSp5)-Th3we@(D^|<3{>_6^-y%)6aj{`g$M|hm|c&hcS+Rw2b
zFSH&nw;r#xe!2ErtjAq`$^PSBIKhLkw?g}oIKUIE$J4FH^Q?bS`^DDdRo3J6*5hr~
z|5f|$*?%`pKE49n7e{yqPVgA)y`=qQ>+vk>@qFv?QtMyVezo;@ll8dc8SFpqfxTC>
z?~emK97lMZ^?0iFE480vJzi)%UT!^JYyB$iw^)z6oXP&+y8!
z@jUBa)qb({c$M{dz4dsT^?%d8`)Kwb_r(z&f)hLjd#`Cf*?K(7dOY8Hywv*FwO?&L
z-ef)QIEMYlJ+SwN_Wf~yhvNv3vmQ^izD@f%*5ifN#fJztp6YFyZ?&)$9-{xhu{Q{!QR{2PqrS<
zvL4U39xt{29qm_Jk2hJ5JN}ye$33w3ckTP*01w9z9%ntCYW*7R=U9&yT921okJnni
zR{Jg1<1S~h|F{=U@F47^+K|a8
z{T%D@LhJEz>+xFa*K5DUdfcU%{l~pPwl&pWB+kq9N{52!DF!ZvG$X#$Fr=*^R35At>2*iYU}YP>v6|(*nivud!K0E
z9|w3ij_^3^@l@+KYCp$%ywG~Q++v@0|5y9&zhVDzUmW2fIKgAE_nG#St;e&h$MdbnORfK0`_t@T^9-(o%Paz6Wyd*K8R
z!rqtKkHi6qud*Jmw;pe^{s-E3FR}l)
zFOKjKoZvCo+g|(0*5g^$9Jj~7~xms^k5THjIoE!N{Mzh(b%FPz{(*z2VINF3k^*5m2c<9XKasQqH=@ha=_
zdh78v>vz(=`-SX3?u#Ql1Sfb5_IB2Ovh{eD^?1JZc&YWBwO?&L-ef)QcoF-Ldth%D
z?fc^Z562N6XFZ;3eZBT`tj7zj$IGq9Ypw61{TAzSmy6kd+zTgo5cUe%kHi6$_<`$9lZbdOY`*Z2iujmz<^N{|Q&|3Y_9K
zxQ0K+-dOE-nyt@Qz&`eIKU~DaaDab}oA4z##ItY-KY%0r3@+o>ag0C475sxa+&|tE
zS8)-icnGfH(bzj%@Bd<4z&BtY-;0a*FF3%j;wJnd4)Hcz!rgAw>yPlkxQvg*F+Lqv
z@NaQ~uftUw;}kE(HM|mg&3gYI-~#>{`*^q8^m>c<$2h=8<0d=`hj;=m;b}O+ci}RA
z9LM-2T*3dq3H}OKap88o-W2!3H9Qb|s;bU%&7x85{
zz&GM1ya0!IDK6nQ9N|xJ8F!eg*Bj%#a0UMaC-`_=#UW1dWL(2DvG*Ij{|9gZFTp-;
z!$rIi2e@vYUT+g_z#;C3OSln7xEYu66ddE(xPn`7f?IJFufZwajBB_)*6a1o)BFDs
zF5rRK$0KkNkH-O?hMVwQ9O6Z|gjeDSuft`$700;S-Fm$h+y^IkFs|a!IK`824bQ~h
z`RqR~;3e3{ZMcXx;sDp(!~Ww29O8bsgd1^$n{gRW!7-kVE4T$GxD{9N8l2+IxQ6TR
zW&bZ=|8W5i#6BK@i+DT^@HE_n=i(4A!X>;CM|d4B;CM|d4BZ
zgHya2*KqxV?Egge9~baI?Bfx*h{xjqPs2@kE)MY`T*51HgxBFR-il+~?T_p~?t>FN
z7+3LVoZ?BihG$~$x9mSI;3e3{ZMcXx;sDn@#Qx(39O8bsgd1^$n{gRW!7-kVE4T$G
zxD{9N8l2+IxQ6Q=X8$i_|8W5i#6BK@i+DT^@HE_n=i(4A!X>;CM|d4BZgHya2*Kqxx*#F7wKQ7>b*vBJq5s$|Ko`#$7TpZ#>xP({Y2(QCs
zycNf|+hgoM?t>FN7+3LVoZ?BihG$~$680Y#@Dl9fHeAFTae(U{Xa8{n4skzR!i_k>
z&A5!G;26)w72JXo+={Ds4Nmc9T*LK$X8$i`|8W5i#6BK@i+DT^@HE_n=i(4A!X>;C
zM|d4BLsB9O8bs
zgd1^$n{gRW!7-kVE4T$GxD{9N8l2+IxQ6SWVE->?|8W5i#6BK@i+DT^@HE_n=i(4A
z!X>;CM|d4BFb33Xbt?T){0k!L7K8*WeUy#x-336#IWA`;QBFAolSHT*TvXfT!Um
zJQs&}5ia4CIKu028E?fg?)EhMkNe;R55`qI8mD*?uHl*3o5KF%0$zfB+=h#IBMxxg
zGweTZz#;C3OSln7xEYu66ddE(xPn`7f?IJFufZwajBB`l3Hv{l{l^775c_xpF5>Yx
zz|(LOo{K}g2$%3m9N~4ijJM(#cU#K-<32dSgK-s)#wnhJYj`I1BK98_@Dl9fHeAFT
zae(U*_8&Lk5ck6++=wIGjLUcmj`3_b
z*vBJq5s$|Ko`#$7TpZ#>xP({Y2(QCsycNf|+Y9VJ?t>FN7+3LVoZ?BihG$~$8ulL-
z@Dl9fHeAFTae(Vu*?-)CL);ISa3hXzGcMyPIL5Pa1-IY?x8f>ZgHya2*KqxE_WxS;
z9~baI?Bfx*h{xjqPs2@kE)MY`T*51HgxBFR-il+~Z3X*}```o*##KBTr+5;s;hET*
z#{T01UV?qxhKqP34shLz>_2Y6A?}AuxDiLV8JF=C9OK!zf?IHcTX7Yy!71L1YqZgHya2
z*KqwS?EiJ_KQ7>b*vBJq5s$|Ko`#$7TpZ#XH+Y`!eRupId+2({oO|YcNY2}39xMOg
z*l|;4L-ux5&Sz(C_O|o7-}L#pa+;*_|98BT|G(q-?e+ifXqLHLLw4Eihq%!>Uo8EM
zCjI|Qj;1%uTzXG#G&{u7yYu$`B<)|>Mc1E!tsmB2JH0cP{&n0+Z??Xi>)pBZV^7xg
z+vv^KADP{k9AdeCcP@QALi<`by?(RxUEAyLdUr1U@8Hm;Ouo
z{#~>;TYqb=cjwZVf2r&LiS^CaznSaZx%B6puKj!TX6w($_3m8yW%Rewo2@@6*SmA+
zYxGMy>iwIo|5_eohrDTY&KFC+;Y_{$5xjn8nalp=uiu?ZKXkPA`_h}Ozd;^khrE&X
z-MRFykJ0`1*d`|KHhpJsn#g$i-)exG^`EzId+o
zKj-tW+4^JK>+gDZF8xLH|3z>9zTTZn{{;PqT))}+J#y>2bLp$}yYczQZ2gMd>*vm;
zzx8~*|6RF$v-O>GpTFI?^!H8Bz5~74`a5&i@6M$UO4@JX{>|18lLy%$ZyKHR#nRs}
zQTrF^%`%sdpF8CngX|DX@6M&~eYy5;(VMNmVu$wp+uof^e_y2ikL~`k^$T*ZpPesr
z>4#mTeGm4}Z2c*@-knPyPuISI_084?x&3$N(x=yP{j6`cKL7RColE~Y{ZqVtX6y5x
zzumd?{_l1Deq6uV`YY=G{q=X}(%)Iu{wG|&+4?lsyL0KUn4^8f`ey6%pTFI?^qp?g
z{#e#GTc7CVfBXL9&ZS>Le-i7Ptv|oRzu&(*m;TVXy8hp?`;^arX6p~lt?$mIKZpJ_
zuHS5Z{`Gg~(!YP7uD=6cf6dkp$gS_rrQiF0?f0iQTOa0ncP{-E^x410+kXFM>&NDL
zcP@QO|7&~y$JRfb`}nc*WiI^<3-tPja{XrO&&jRt&ZYmHzCdrb{z!R{9rC8pIbSS&
z@sGOx3*5h1=JNS3zyI!B`myxy(3`D4KYI>2#In9Sm%d7W5wD-w`Wv$6mBV^>F8vvg
z>h&MS{hO`NfB){zrGJ_JSw4Qu*5^O}xpV0|Kd$Tlp7qVv-nqvo
z>h|tj`uKTWe+{p{+4}tJ@6M%9U(o(eUO%(-`Pbi_OMlG@?Xy3YZGZjE*5_Y;ciw*e
ztF(WN`;W2p!*ZX0-MRD|Uei8geY5o+=6ZK7{p)XP|2*rPt?!+C|8wWkfBiq&zf5no
zK9vXAA#WO;^TpD?^N#j!(3@p0?>nF8_TQaLU(FVfbJx+Et;JI5{_g(Wx%3@A&_1F!TYrT-$PRfU>$`L5qjlQ<
zlHM%m%ldoEgY1wu(z|o%?_96_aC)OFUx)Z
z?#`wEaEBkXU)$~UX6vKe>*vm;Kc|!Sn|S{fO2YHy^0|Pq==w^?S?W*&&wo-MRD?`bO3_TOUiD9oD;Z>6;GH^)IJ4TYr!|aC&zx
z{S^mme>B%`w!Zhy|K7WE>F*n${R6CTwm!{$|KiT2zb5+vFXx`b`ey6j$$k8}bLqol
zv_F*f&DP)7>EEy4olD_wUZzuYaWW`_Ny5t@m>uKki)m`+lkYdVc@P
zY<>3Sz5S3kjn4UE>906L`%mf3GMD$?{I9>=x%6fF7wOH`pVA?FlI#%6`tDr%_d{KO
z8@<{3uXFeB&ZSSsYTrh0w!W!-_3zeq=h7F?*8XvNv-SDk|8eKiU(u}n5_+@sW9311
z$eTvzd~y5rkJJ7be*ZPaGMCps`}U&!kT=r1bLp3ztNr2j``1{`mp=RQ(tcQP=ZmF(
z`8@4M^Yzng{f6A@@6M%vVgfxMe`f3Rzklt{rSDqO{v6gfTc3abbLZ0crr(M0Kg`zO
zr?>y@>+jCn@1K4muiwkq`uB6MpF5Yna-m-T1>C>c`Y&_qyL0ImT%`S_^k(bx@4xO`
z`Y-8!$@QD9&wu~v&ZSQ;*7b+m`yaMG|NXz6FLUWTU84Qj^k(Z{&fUK|m;QD7pR#{u
z>pSOOe|O$~{g>(bH}LwU*!uj}Pj@c;*PQ<-zkV`X-#d5x?p*qwm+SibbN%M;>)pBZ
z!|0EuH(Q_o^9Oe>{rgwy`d?&^<@+bI_3!7d-y*rowefqoU&EMC%
zbLk7&FA(J1CG=+N^Y4G|T>1g@Z}9PFw!V_ve|IkZhx7-r|7PopxsN}0F8v-?>-As3
z`ey52&h_qG`uDHZ{yKWI^_}HGcF3DX=X|mBwQ1UKp*PE1zWxo!e#jw~-knR|d%E_w
z@%h7SediAC`M140m;TV}wcml)&uo2ueRnSX`SdSx{buWL$bJ9o&ZYk{`-4Y0_a3g_
zZ2gz=AUotuWA+bsE`9B0?Kjx#hvj^E{p5!n*4z1F>AT*d{S5Bk{C&MUmwo{K|MLB>
z+4}tF4|gv8So&}1&DLL$d;fFi(x-Fu`q$H&t-mw3|L$D+EAG_3o{wL%_1Cn&df&Z%
z?p%8BF6~!l59RZx+4>;+DLKTAxw-TK{XaWvZ?-=F=Qr+L`iJk<^}F!($83Fm|J}Lt
zRr*`#&DQ6?{yd
z_Y>*O*54`*vP0f9=H}9uv)>?=*~skAX{9&I&&g}|aQ3>$A(q~qOMm1;+Arke*KB?E
z%d7UodUr1Ut&eE`6usH{V{_lXyL0K^sc65F-faCSUH;qacjwX{`l$AQr#D;QK^|m>
zylHgK7fV0jPuhP*Zg#W|zA6v0L*B^x?p*r#&)QFB|IBi}
ztRLro|H++8A1u{=Z3kW7Y<($v4mrfKzB`w`Lf@V1H(P&XZvWl6^c$Yl^$(yoTi=xX
z{R?+4{gHpwehc?+w*JuE`tDr%QuYO2&aHC)X6qN^)_3R9@9~EAM{)gT>pSGucjwaY
zy;}RRT))}+FuOK6#Es7RV(G7-f0o`XbJ_ndbL+cv=`Z>pUH??B-)w#M*8|!Qc_Zt)
zbLl(0qy22wH_Q35{($UtmBV^>F8z@y_s{xf>tD}ZzdM({@SgU!vVUgl&&jUKUEiHc
zf60g1U(5Pt>+^qq#GOn3^2gdQV12Xo<=pkVbLr36sQqrderD^3$?5<>z{4Kd#v;`$u+&rFZAjhl90mWqq^t8{|QD$Q$Y1x%9(^YX3KSvz#yM_s+fl
zxO3?*IzjvQ>CM*1@*q3pjjZp^rSJL+?Kjh#<$PH`-@9|^A8*vY#`}-i`cb)$A9pT&
z=M%NB^7@;tebKn2CbLl&sp?yGawm!~&T_T5A)_3R9
zFZhl2zvKSR-}brn-MREbCu;vb>zl1#mV5o&x%8bc(!OVQo_zmjwtkd6$PRfU*YD1y
zAA7O(o&H06vz#yce~LWF4tXQJJD2{6NvuzAmh+`QBfBp-tasu<>I
zzdM&cj|n
z@_ml%pV|6@a_>LxT>4@6Xn#Gwelc6WB70sr#Es7RV(Giyul>>X`eT{PYd0+S{ga(<
zefWs>*>6L&U%%OU`M8!tEbF^-S-<$0_Gk0@o2@@6_xaDAOMk{9?I+Qjt@nP|zWlfA
zyYu#bh4yE1{byk7vv<$-LoCwthzL^>^pezq4NZlj+UY-<<2+x%8!vweLx9wthwK`ww?6
z{eUmDe}(%uTmNP5^M^Z^zWD#N{|CL<`m(-!-@bnCT>6CmGkUZ2=V$jNhq%!>Uo8DW
zbsgGgJ7?eL$mbuk%w_+2=05)2x%5r-+V`Y4TmN$I>!&-He(!y>Z|3zkTVKw7|Le}B
zf4G;`ms#fW`sIKB(49-~
z_0{!%MsK!Woo;4UU*DZe-$dVy_087j|NPUPOFx!=dwR3=`RjM*
z($Anjf!=KWhTP{rcP{-!Khf9k9q!+3eSUp+F8!_aL$jAw-v7C4&Id0F3VeSUp+E`8UZ>iy5+{>|UlyL0IS`djJE)*qU^E^>$)o%6-g
zUqpX9U;oT9mwPW~`znW6dUq~;hwK|HnQhHJPs{zA<>#aivLAAYrFZAjA4`7J4ZHJiyHmg{%t(hoRQ`&rps
z-v7*UzFhw~*$+9y(z|o%WBN)qm)j!r(edjZE{khrm%k`VB&#&*!r7zO^y#JW3&%gh>bLmHo(eZ_IL5`Uz@G}|NZ$7=gVCB4fqw-H(Q^-e|Ii@;cQ+1PpogYKL7dKolAct{ZsU2
z>+{#|&ZQqkKa<}4eZ4!E{v!IR^k(aOXRnhS;zs9uvGjM+m*~whm)9K&Y|0aEh?1hq#U$dMq>wlR0{Oiu8PbTR4d(fM$
zk8=0#&ZQ47(!Mvn+4^I%Ymh@M*YD1yzlQ!udb9QCRspWV6ioo?2?joxhi)7fh%hq%!>Uo8DH`VZ*M
zGMCqXZ1zJAvGnd-`rfzb`rpu-t1&DNhG53)nvG&<*tr9UUp{&IS=%;o;G-wtX&#L~NS>4z=T{(5?|
z^$T*J|J=FspSNm%7roi~`?9}RB!^hmcjwaI+NOOAz1jM%yS3-v_U>Hzhdm=YRd@&ZQ6Ozo0i;
zpM6-iA7Z(Fo9}g4_TNwH;CcRt9onyLKOEo#afE-0V|)Zo@G)5aB8;qc0uJ%X*5lKy
z$7fkTO8fJ%k1xgno`OR>9mlwg6MP%?PSfYV$9nt_j_~8w<7aS+Te0^`eZE!L$8X{Q
zzl%fsPaNUTaE!mk3GUoa_sct7*V`TYxB&;a7Y=a|C-`uj;-6#r1Eco+!#+L*2lz}J
z;$|G-2{^`=-~?ZVQ~Y}zo~i5Kgd=<>j`96C!7Vt&i?KgipD(c
zeeB~;aDX@C5O2c~?$lrRFTuNFFVyG%5A5UpaDWfOAwCR8cp#4P5S-v9oZ{24_bXlh
z*VxDB;Q(KRLwqHU@H8CbSvbMB;uPPF{a@?)f5ZWP42Sq>9N`ymj920Wuf{1(v3HiP
z_YwB-|Kb4u3x~MF0NuX`?}B684JWt<_Oid2Bp*+`aflDW5&jvD@i92T!*GgE#opQa
z{G+jt$Ke2%aELF(5&j*H@%1>tH{%rFg}r87e?Io{qd34%;Sj%oBfJX7_${2^_i&0o
z!QMDse+%~Uc8BYJ1$bv1;@xqCd*B!!fK&Wa9AtkXO7`<89O5B3!YASwpN_qAwLcpN
zcmfXbr8vS@;~4(|CwLA{@!i<_jjs0)_VJ%_fS2M3zlan38urf9=leVM@p>HKPjQU@
zg%iBP&)A>y_4&Hs2=9p#ydO^S!Pvh*`~EnUGGZl
zV414t}f8e;f|+a2(;&aE#Bw3BCZQcrx}b)aSnn`}les;#+Wp
z=ivlDh*SI+_Ak=se+CD5IS%owIKpq^7=M6Mya{_3>+^qweZ2jV><8WjN4Psq@V+?3
z2V!rMKL26Z$AfTykH--{8OQicoZxZTo2<`25eN8k9N}wmjA!8l--f+Q^!e_^K7IrT
zc(L{PS)AgRuy?6G-y7J+YjJ=-!Xf?)NBA2Y!;oZ`K(cbTrgKlX879N@!o
zh>yV${soTlNSxqb;S`^Ty~}m|i?NTV;t>CT?Y#$l6-E2^edtvUU62wK6r?1lg`z+}
zdJRoFC+&oUw3Cwr2qFdnX(FL1AV@%Z4JZf-5{fhtA|OR6K~O+J0#XDl&y?Rxc28#R
z`~ST6=l;CU`#$Jr$@%WN<~ln&``f*CcITQY;7ssra4vX}C_je#TPezeH;MA#FTmO0
zufVzBV_?gh+}~NSKlm~@6nqn$4t@a61{Z3{+aniT25cG2{Z|6}gKL3?*jXS4}pWhC%~ED^P>FQy!=&R4=&OQdH_EK_8-sf8&M|DmU6*%uw?@Oz8g3c
z91hL~j|BTqp
z!F|Bl;8;=qIbQy4Q64;Blm~AW<-w;#d6Mvo#>aO>dGNENvH!qLz}euzU`q{NJ{cSg
zo+`?Nmx%J3n-F4SD(Jz`}aG`N%
zfAF(lO8_q)01gJX2d9IFi1OeRQ9h8DpC-zKmx}V>?V>z5N0hhn@>fN9@ZX|5*#B*8
zKe!3lV&mnzgM-0ta5{L5C=Z@3%G-JQHKIItwydo+ZjR<>fyW<-sRKdGHNU9$a)H-yTadUcNdw80-M2gS&#W!I7eTb6$RoC=Z?^
z%7fR5^5A`<{42ctIZ+<`hbRxO@(%VN*b271%FA~G2ZO`F>EJX`9z0W&Z^6s27UjXa
zMS1X9Q679-lyAw)mzsp*4_q6Z4sHg{2KNM8TJiERqC9wEIYq9z0HzZ^O&a7v;g5M0xNbQ679rlz)wve<;d>
z%T3|in+~oI&IY#zTiWvS1Hi%HBvBqbMU)3G5#`(Q^7}-2@KsSB{EsLPt}>NxpQSx7
z9{>&pcL1k@hl8`hZ;SFBc=-jQJb1Gx4?Zl)gMSp|JM!|6M0s%eY1n_@m%-WKHegF9
zUVb1r80;10!Ba(f@KRB}GcW(SC=Wg^%7cFq<-vvD#s2HU%U1&jgKgk+aA$BfI9!zP
z%FB-y<-xN=dGH!h9=u1C@5al2FUo`Oi1Ogl)A{yhgP#Xmy7ThQ!NK5O;B@eCQ6BuZ
zDBpvZUm(hZH;eM%!=gO+M^Qe6mwzP6gUi2%_6NTV&IY#uTYB>H1Hr*yuP6_mD$0YG
zit@d9`Oigp@NrQd{EH|LE=*p)rT4>@-n@J@a4^^gP6u}eXM@8<`98e-Xi*+KOOyw%
z5#_;qMESnF{3THy{7{q!S0)2<*!?@WG1&4tFW(*<3?2$j2agct!S9Lk{doBmqCEIZ
zQ679sln4JN%J=8xi_hfS7YwcmP6r2pv%%fLmI1tclqe4#E6Ri47v;elMEQZd{C-g$
zd_j~47n+6r2d)aX4C3Xj;9zhka5^|lln1AY@`HK#nW8*+vnUTfEXsp_6y=BT@{dG$
zaHZLNd(**D9I
z-QZyG+oC*p>o>$-Su%ca3b#KDP6y|LGr;%3nc%WVdHF2x^Wbc7Q*aKrJ2)2{3C;tL
z23w}`?O6c!1MdX;gMR=Ag8u;rgDV~5+ZO_E2o43m2KImlg44lC;0*9&a3**;I19WV
zoDIGV&H82lwT1pFO16nq2h0T=m}
zZ(lmN8aM-N1!sagg0sLba5nf&a1MA5I2XJYoCn?mw!F*he-`Wq&I9{{OC0Ch8wjom
z4hB2HA>gjyP;dm;10D@d2hRj&fLDPt!Mng&;2*%*;CtX4aD@|SfAGuTJaB8UWje2a
zf3P1o73>e52@V8r1_y&rfJ4B)fJ4EhPV(*Xfc?Sg;FjPFa9?mHI1Zcz9uLk2F97F&
zH-U4(2f=yZi(t!py#DvWe&DCRGt^*DPzXA>h_X3B2W5A){bg&2f0XQAJ0h|H;
z3Y-Z(2hIZj4$cObKE<~;2V5JR3vLR|1NQ)1X7Kt)f&IX5g8jjBz=7bk;9&3`a0vJ;
zI24=*_JB*A=G&VNt_jWnJHeUYuHYB(+{1(_B`~f%+yb&A>J^&5@Uj&DOAAmjJXTC@KgI@w?fLnnx!7gwX
zcpNwz{4qEOyce7c{sEi^{vB+Y#p_?@2fjUi;1|ID;8(zb;NIY1a4a|kJRTeh{t)Z|
ze*#Vie+|w6Uj=7^i=X4$mj(6*XM>x9bHE|sTyQiv51bCR%;xo<2lfMJf&IY;!GYjh
za4`4}a0uA%Jm20>a6PaG91Kne_XlTyJ>X36WN;QZ6Pyh`2+jfLf^)%tfb+n97x?yB
z=J5L01N(u4!T#X>;6Shk91NZe4gqI^L&4j?9&ipg9efR(0k&M^+m{J`7MukR1ZRUg
zf^)#3;9T%1a2_}VY?;gJ{|VR+dVp8I(P~=
z1H1&B3EmFQ0)Gq6244r~fD2vX+m{Qj3eE#t!It-V{X2pEz+qs2a2hxeJQExYUJVWb
z?*@m0&w@SR+u(F?sUP|FW`JvhGr`TkS>T@FY;X)X2Rsg(3!V?o18)LbKH&8~1oi`8
z0{ep>f&;WON
z>EOBG4DfnzCip9G7Wh0k8+;F(1Agi%+8OFJIYU6EVbg;Bq(N5BxkhcR4TL3~X7!xdYfA+#4JWjsS;(z2J0kIye(N8=MVZ0nP<~2DYr^
zzkdMi5552n2Iql8!9{=L^-Bjo3(f@B2WNwwg4gliYY)x^_XS(l^Y05;$k=ZB5B@7m
z{yyVJ@~fadN`ZsHww)oHFr0<}+^J5iIgIg@8pq_SeDn
zmT~)N@G5d1qnnuy7Wr3ZfJHu-kH8{7N)}k;d)WgH9LN0~1&e(9O^e{a)nD+5i^w
z1JL=#>GxtjaXSAyWih`yozI=Jn6I7Y0inDthWmd27W2&)EyBMS^V63Di}~(rg2nvl
zbiQ}$Z&^C`7X%jbleYl};`cg(Q^0h-Z(3f==RFiWnIvo=t1SuOg*`Z@gT?&gG~X#L
zFY=wP1&jF^=zPfZdokbf1+bWZ_iwPsCswW~x3ANW|DHcM9r_|^{+PcTBu=2)*ADDA
zj&o0N))CH8;A`oeX?|_GJtBWL%@@oV`GaZxbIKyWIn77TwjcS)X?}0YB7b)dSmd*(
z`TyznBENqgSmawSUW|V)@>f>?i+tpD!6LtSFj(X}?gtk0N04El?Ds^zdopZ>v6!D=
zir|VozvcU2kw1PlSma~g4Ho(BbHF0s^A)hjfBXO}<^!PfuhII8`PJxrB9zxH;rY>P
zfHRu#_Mr1+(eK54Sakj`%3^*mIv*BgG2a!PpO&(if0oX7OIgfkOXr`ZEasP`^Z8O1
z^YzmCc`1wechkXQK3$sskA5%m`_cJKD2w?@Xnr%wB7Ygpw?|V81q;&w}$>aJ~*+)tvJ~Vc(2%
zNwOcP{~aWdp#Cd?bF7?egCpUuG5AJl{(TGZK5!TCoRa+e*THq#a*hCdNMJ*MFBx1C
z^&byj2>bcqXR$qN!5M+P{7&$-mYk1()3H5gz)fG_-`@h?ZN-_+r%LND=1ZmXqf!?0
zpVIkSDU117>HN)<#r(|O!D7B!IzKP{Ud+Es=li8B=JTcV-%=Ly+tT@rDU11v>HN-=
z#r(~5zFNv+K3Y2eGG#IUayIynO8odbD!xa)(G%c$b@=yZz#U28O59lJd{oq*m~V>C
zk40I`e?{lJqAcdKdYb5rvY20r=Ch_O@>SFP%9KU^4FpB=$@D)`DS&hLYpW^?{n*pK17
z20Uss=g+_ye50bLT_ek?QQhpWr3ipFg_TtCyH{i+OQ{c$n{QF#RpIUtTZ-U$UbAAYR)aG3L
zY5sd6pDWEzOMhSFpQZUaDT{oZjm7uS51r4KelO38oAm`oS{sTDE
z`3$K)F<&8_pOUhefATUo8vg10gY17zgHXFk=!^F
zGYg&1lG=;;Dw}}+!1mGkPU-hzKGWC1H-_-?;oxY}NkaX3z@x%Bj|KOS;!Nj1r2fSG
zhO@ypy72Ea!Rep#
zL(}=3DU11%&)l_%9!>P~N<~&3w4K54(MMj1SND;Wa+I+lSBi@IxQ2Ux95O
z>9yeh*?hRI5BKxoa37BI;gLQ($%kk7@cTZz(1(}#@Fza}xexF2;X|CsA;|wb=fgLA
z_#YoG$L}L#`MN&b)Q7uqmixDl4-fR=a33D-!%03o%7@4K@MIsJ;lp!%c%ct}?89q)
z_!A%g!iNv}@ChG2=fgkw@J%1SesSkhd!+U+WNevQ9k);_~
znv>;Kva}#eOR}^gOE6hllcfz=UL#9eva};h2eNb|3(Z&CnJit%(v>XT$kLrGJ;)M5
zmY!tkN0$C%p}A=Xl4THC29sq7S%#9uMV3&qgpnnjED>ahB#WCYQDhlLmT0oXkcH-_
zjU`JQS>nl(K$b+Zc*v4O7B5+n$&x~rRI-d9%Sf_}B1;-sMw5l+s2xL=H_0-VEN_t|
zoh;+X@-|te&WU@>l%T%(^9JTL~Wja~jBg+i3WRPVhS!R)CHd*G7
zWiDCXC(8$9nMaoSWLZF#56QBSEQ`qU5m^?KC6g>m$g-3yACqMnS(cM!1zA>-WffWe
z)qWEDx)-tQO_n}n=}VS>x9^|q-~9dCgzPV)7G5FzKh;BfV*5YQgulh*3iA$&;D1Jt
zKk?Bn_b7KnYKq$x?GB4{d&xRaVscDMOkzS<9Dx*K?@qC}!XhJGF$pQIgs^xwA&d@i}4@-6jIb4zCi%8-I
z=uR+VsyEKZfUc1?F$swtS4yIbR3bbvF^+yrP9d8eo*EOEzlq7Ns6?;J6Xp$zCmTq=
zONmL~n`LoDxZKGRVIHyp5wxr;E{0T)tT0u9a={8j3?uu?Lw=5Yh$0oDf5;DoCq|}8
zNKT2T{)V|?qVkRLnQTJ5_)glzhowYBv$b*+{XjN6Vpt3*F^qg5`)in+{viM08cx4W
zjQ7OE(Q5DyuE>~V4}4(_H6wdFCO$0Ai%5wX5tc%n
zVMRn@LISaq?2e~<313FVxZ|iRUe@Dwd+G0R^169zCr8J4ItX;fds0Zl2xLdH
zfH?d-^ON8n$;{$Os|zdo*|VTAv4;#h*#_(+<6?T*3nyvG?lTzJeyI6IJt>9#$
zBVO9;P6-nQQxj5R;@x7$xktE(z{0%Vm=SP>@97SphXLPBUaa-Hhmk$t_PV0O5+dWM
za_R4BzI2VSvG0?k!)(qVS9n^AI~lu}Du6V0L>S+`lr)bU`l3xvewT_{YM5>VT^$}5
zmJo~2R4N4w;$m1sBn%@GG#p)|;f*WEaZJw(SSyb?usd>?+ZFCk8R=$i#f!3)5#(5=
z+sjuG3GzncNRN{Qc7nn8VuktF;u6EiF$|Lgcg(Qp@I-nX`>r9!TpZcYZiTVgq3Jg%
zko{`hOtva2m7XB+8_8j;srhD;b5a7^?)+`YUuFKKWOtaCo-%|RhCU`KVJXSJs|>nJ
zAg6!#DAJN1Zz63HN**ToD6(V7`5}>>?=3D#>?}+6G&x)GmE^l*>LQt*smMnvB=#Xb
zHZq1Bj%1aWTvOPGk>n^M2Q^v6KJf$4!lg!9#}gAtYEC2=9Un%{$%cc}yeisFq!*o%
z;vr|TIC35Xu*PSrX-ktWCoN|9&NVV7B^uW^vZ>6FT;#~c%8&FcP7c%56tYwESMq~1
zpUs}B3zciHJK2+%Ku-v)WU|{!8#(_o(;_e>U%kF-m>Ip~(qE-bVqq6xLaZfXl3ihO
z390cea`_?Wb#ewK7hCc>Y`rHsjC~5HS4;K@r(S+}CN_~V!{}L+e2OB4qu3|E
zztj;M3jE4XATBOG-z?c37sYlSyTa$MPa#+7IC4f~*K%^elX4@Y$uU4KP!VJ+hm);0
zMHFNOHkN++7uRy~wY&)P&-6NsPx4Zn&-{|gnOua8i0dx@&iDnczT^wzxlSNIvr$46
zK|bd1M-KVBGN1Vlp9OH2%l1PrlJ#P3&@rETNvx7S(-V+xSK?F~(K&f7~&k|`!&h#s!dQ>*-OLn#8pV)@PM3D=5
ztUGNa4Jl(|Xe7fnCyt&HeD)o~;feGz%RYKilZme7M^}`W>}ISW`)3&W&HRH}d~$`6
zfGZ`2#F=tUavHhdk~1Y;5l_zVaipE-XL%`3ArUEGH6kXNMZEFsVjmwC>n2vosd40I
z8KfkVtEY@M=m%C|(%RAFszLm+PjRFM{6ivX3HHeogAd8HdTdp45{)eqhyq8rP3H)#
zVigx5yKx<&CF3eYOvY8Lt&J<#e#Z*lek5`xO-HtY9>q2_)zBs2Flo0lg%8_L75-BR@}gl3dYg;a+mtqR|(*V8zlp$(7_d
zWzjlW6YGwr)eQ5H-2)_hz=$SeTF#XmGmPxsRC+omMJTZkBivr50uK=;trz`6j}Us5
zG6ODp+ochLZmQ!F{7(0GuPk8`^{E_yG;KP9^(
z=w}jRknq(_+K_)_hYJ5lY9%e$p-q0B9VRY%C6mDK{1_qz#b=xbDUo2BTs_D&oR@Pa
z@xMG4;h)L*z&*;9NE)6NUh0*YytS@j9
zXSWFCVrg;ln}wJtQcLzx>;Mkl#CUp$(qN3OVDXgr4>{j^0VJPa_-_*NE^)CQTv}8V%C=MWnbR5hu`ZwO^1+
zs-XbCc#`gmWD+FvJ021-5(|DU!x#Kk5fJZ=kMI!P<|8`}fr%d4B|#2eb~j8~mvmmF
zCc9l>QS=Jx<5!;G$*F+ck_?MW3=g9xfA}JYPog))MQ9GN)M6&NV}8rDWRm1_+icxkfF61{1z$TYIQV*aninQE@ETiXs&t$4yis=_n+B*tLqB
zx1v0$Y&C8S$$>=HCA;0^x=wUQcSaO$6-jwFy+~U2%h(PjyN5Nkhu(mS4fUi%(`}?ZBayCf
zFHv?x7`ETHJM)4zD?NM=t-A3x#bEUj=THF
zMDl^O1UbpjTMTlKKs~Vg`pCrmZV7_}vR&*R%hjWI?~!4iP6;X2Ae12YIk7ZoV8uDG
z9)aQEWLxOLMLuvbkq_)PmEVq%UC6&7r;_0$=BBq);+ifjafxSlS5f4^p!Zb5hsE~2(%)=@-^%^?(t$=J5D
z%CKMx-CN`oKs=yt&r7axv?Gn2T(F8n9PEYz7!~6sXRZWsOM)Q-}=B{7_ABI
z%*@{aR&&-%NSj7(7jIqK7mC%xT&xL3(vrjI8Im5@vTK~LpZF7kC4>DmpW
zK|8%*(49a|Zscd_iGrU&Xa}q-BAovs?LnpIRT7>s0f+*klYkYWov7%prRCT-E+o%P<}j+Yq~p*TzX;1+D~`RY1%uWtNw%)Y0?1aiz^9C0i!sJd)o>FD=2$E!m~qo
zb_mZ7;n^WPJA`Ma@azQR&q2a-knkKN
zJO>HSLBey8@EjyO2MNzjgy$y0a}(jYiSXP+cy1y*HxZtj2+vJ~=O)5)Q{lO(@Z3~*
zZYn%C6`q?4&rOBrrowYm;kl{s+)Q|GCOkJ2o|_5J&4lM>!ZVqWmhawX!gDj>xtZ{6
zr7GnIeW37d4HV9;fx^2rP`I}S3jbCz1Fk45e!&_je!?0kf5RY0`5XCy%vWT-B=a?y
zFG{QYjeJ>Jl)Os}!$Qs@E#zYnA#XT_WN)
zq=Kzd!d9tas}!+Ss@N)JY?V5;N+DaNlC4t8R;gvH6th*T*(&91m3p>HL0hGwty0of
zscEYewNjZIkM@Np;(#x@}V3
zHmPo#RJTp4+a}d*lj^ofb=#!6ZBpGfscxH8w@s?sCe>||>b6OB+oZZ}Qr$MGZktrM
zO{&`_)oqjNwn=r{q`GZV-8QLin^d<=s@oYN0C(3VZ=+$MEylRCFa
zo!g|&ZBpkpsdJmuxlQWaCUtI;I=4xk+oaBIQs*|QbDPw;P3qhxb#9Y7w@IDbq|R+p
z=QgQxo7A~Y>f9!EZj(BfA1M
zZkIZ@OP$-L&h1j?cByl_)VW>i+%9!)mpZpgo!h0(?NaAfA1MZkIZ@OP$-L&h1j?
zcByl_)VW>i+%9!)mpZpgo!h0(?NaAfA1MZkIZ@OP$-L&h1j?cByl_)VW>i+%9!)
zmpZpgo!h0(?NaAf9l9?vOfnNS!;R&K*+c4ykj8)VV|I+#z-DkUDorojat?9a85G
zsdIf9l9?vOfnNS!;R&K*+c4ykj8)VV|I+#z-DkUDorojat?9a85GsdIf9l9?vOfnNS!;R
z&K*+c4ykj8)VV|I+#z-DkUDorojat?9a85GsdIf9-H?vy%rN}W5U&Ye={PN{RJ)VWjY
z+$nYLlsb1xojaw@ol@scsdJ~)xl`)gDRu6YI(JH)JEhK@Qs+*obEnj~Q|jC)b?%fp
zcS@Z*rOusF=T50}r_{Mq>f9-H?vy%rN}W5U&Ye={PN{RJ)VWjY+$nYLlsb1xojaw@
zol@scsdJ~)xl`)gDRu6YI(JH)JEhK@Qs+*obEnj~Q|jC)b?%fpcS@Z*rOusF=T50}
zr_{Mq>f9-H?vy%rN}W5U&Ye={PN{RJ)VWjY+$nYLlsb1xojaw@ol@scsdJ~)xl`)g
zDRu6YI(JH)JEhK@Qs+*obEnj~Q|jC)b?%fpcS@Z*rOusF=T50})<@2I--4vhgQU(y
zUzzBQ6Mb=_Cr?0WT*_RkT#8(3TuNLjTnb$3TgqFiTZ&t1TS{9hTMAq1TFP3g
zT8dg~T1q-!(PF>n>sd5qzM5rYiq_1RvS`nIA&VB3GL|ZqB9<0+#xf@|Eh9
z;+5K!(v`}U!j-y}vX!cpqLrGJl9h^;f|Yuea+PY8VwGBzQk6=TLX|p|GLR|INMQLby-*$;lBRHT|TY+}rp`KRMY4@?!j?pPcLs8E>VN-q@f+dGg5{OCXMrC3XEj#aDGwWIO0
z%357N8f&Yp)itDXxXM~xM;fE6tkt!o@w>vBM)RuG>RQrBUuCVXCA|w!S*vSF?+8@Z
z>RQsf1%)-ecTlZX*OH#fRMzTR(t8e-wYrw{ene%ht|h%!QCX{NN$+D6*7UAMwOU0OkRPh?0EM}g_TDMi
zt1HUht5e#mtIFQFQ`)O5Yo$H^N_%y6*}HlwduE
zV(&gG?KSO7duWyRn)=fITcy3GzO;8&Wv>a6*t?cWdrkXl;w1J~rqYk5zO)-zX|Jg-
z?PONkYwD{Bm)LusDnFWliS>FZ?KSO7pG+z3HT9)Wt(5kf`qDdWmAxi#vT7nH_HL@u
zkLG+uJJpr;n)=c%ccs0izO+MLX|JiTCWNxm-g}iFO%TQ2npN6s>Pvh6mG+wY(&qw7
zdrf_552MOn6HKwUbd~lR{c7SV_CBxDkEXu#@r2S|Q(yYF>tF%|w
zm%SgYwAa*E6JN16sa1Y7@fCZ^T4}FtU-kyJ(q7%Z?Cor&y}Etbo7*aTO?<`P>Q>sT
z^~>J)R@!UotLt^r#8>Q1aixDveKkE#?45FzANmwqxn5IW`ixs?uc@ylzGCmGEB$DW
zXH6Frd!t?DM-yMMx80TYn)+(uEB0Qz(vL>Jn)r&nL9g_qX#p#hzfO{Al7UHVQy#uc@!5Z;Fif@P>m{Hkl;wv_qMrp69ucrTsjk{6$(X_87zG5SE
zlzuez)x=k9ERV{MCca|he3bT@<5~B3PZM9U@j*)en&Vj$U$K!yDnFX|ij6W-+H2ZZ
z6JN3MNJ>AN_SM8!Y~+&CkEVS!@f926r1GPQuh{q}rM;$oHIMw*NGYWsjea%#S8Pm`
z(vRkRrHQZD=qr^U`r4;*y{5jJ{wp?WOX){bU(NGBHoi;gM^j%-{}mevrt+idzha}r
zl=hnQv!?%wjVDw3(dbw6D3FajQ~A-vS8P<8(q7ZPn*J*`eog5|qhC#Y#YVa*{b=;7
ziLcn0IF%nwe8tAgDeX1Kv*ytt8(F9HqdA^6{a0)Zp3;x{cxL1C6!vVio^rjqec4Dp
zrM>!iW~2O+_Uihw5r9g2b^Ef>fhv1V{}mfKsI=GASMz+3jWJaEQ6JB2{GrlbtzR}a
zQE9JfUrl_)Mlq`V(BTlu_3Go9jdxVqYwD|suh_^)r5{cEYT_$4hEnB66JN3Ml}dX}
zeKqkF8;Pm(qdA^6&j;CsDnFX|ij7lN+H2ZZ6JN0r
z%}PHS{c7SXHuhQRN3CBrE?QyFMoBBztJ{~2pjO(ek7qWzT4}GYFB^HSv{$z;8kNI{%{VSGtLFGsDHapA7ptRQ<&zk3hEPI2}
zkLGyRywlF|JShEWj%UsLS1coh%8%y#E0!%nX|Fk+HO~iGUJ0ci&GD>xKFBgqDEzQ|
z6w3AL=VdHcML~Pzy@J|5KU{y!dxDyHQTll&BnG}u`{6W42oRcLxmH9@_m&r}oAYu@UOP9Plc3Fq!t7%%@cFcrt%aCU_<3SbQ#L*!$cAosQ>UTNI3M*)hwe
z#4vltdUeof)rR-#TPUk8z}H3i1w(wkJ^#HyxA_wgDcV6!PNbHA_*#ANTc3>N<&CH5
zN&YX6>Obw+8i`n!%s{N@6jM>yZN_)+TLK7Ray-(I?{Dj+lbx<*NwE>SkYn6efcC211Qu&KyYel!VZ
z*feEI`vSXy*X#eB0nvzoeP(9n>0VVeDi}W!5BUjN%|&Q%E9YyLSz-&=7*e|GzGDeq
zwO{6^dnL0;lPTnxuI0gLSZ7H0YFwLtel)Jle-vR{o8O|wwfV=dac%z5Yh0Tj0UFol
zp8$+&^N(BOTEoTCv^u}X#k5*oJwtzs$y!}OLvM@8T3toMmCj_XuB4$;#At1J9BEpu
zuBGAKI+L}!73nk&IGjw@>UK1YTQFIxThj1Woyl6=mWG}XqqSkkf@!t7Ee$W!nXJ{d
zG<0s5tkrF47_4BjR=1_$f@QQe^lO+_tJ~7>aL{C}ZcD=xI+L}!Ee-F`nXJ`qX~kj-dqc*tg2t!_(0Z-U8M-Ij*F1e3M8
zEe#LZOxEhQG(2Q8S{u3%OsmyxX?VzHvR1dH;USyJTHTh0u?Hq=bz2%9p_#1JZE1Lf
zX0$duLNl#ax253`n#o$-mWD@YCTn$D8U`GgtkrF4NJnP0Hl}+uuUEGwn>bx@5j3WI
zHTzLl)tK(pY_G1Y@#&Y@UR_;dx>u9EHVo3#*YM=Y>_>h4S`AO0%=YRd*lNgqZ?;z-
z!&XD~d$YazD7I<>B4fH&lOIh;#HN>5wYw%LVpGp6?KSOdcoECIJ(~744Cgf2YeFOA
zLn5=iTDZn^uV#DA@vMoDj1Pazel+cCNS9%@*R-!DNHV5-HTltmNmj!>yV+h-UqfPi
zv%RK$4R_yWdrkWqh8vjdHQ|ym-K*JN)4rOB$!d6PWA>xbuOUai*Z|FBGNyYq`_UZFn)u3??$zW+(;sCsJl!zcYtC1i_{yf~lQO1zHT&1JuO_}S
zrh7H{(ZpBAbgyQ6P5Wx%D`UD>vmZ_SYPzS4>0Zr#H0`U2uZ-zlO@1_eRK|3#W_wNh
z8r}sr+iU8piLY#$o+@LySF?Z3^+*$68PmO*{Al7Un9R7Wdo^#5
zrhPT>l`-9`$&aSr%4T@y#cZ!>Url^v)AU^#)4iJgYxJv$uZ-zljed;jUd`*({W->T
zuV#C7eU0f}&Gzc!*_iItY_G1bG2N@#UVS_p)4iJP4I?AX>(%EgW4c$fy*l17rh7Hp
ztK$u0x>vKk`gk^`do|f>;wxjiSF^pQzMA;TnC{i=N7KHV$9l$euVz1*`fB1UW4c$9
zA5DB^O!sQG*BsB9_{y&7zcQwKHT%~b&zktknC{i&M-yKe)4iJQHSMd3uZ-zl&3-iP
ztBJ3S>0Zr#H0`U2uZ-zlO@1`-l`-9`*_<~yP5+fK-K)uuVWgdTy{3IN@s(Zk
z9MG8V)$CuRUrqm&G2N@lk0!n{rh7HpYxJv$uZ-zl&3-ic)x=lEbgyPV8vSbGD`UD>
zlOIidWlZ;Kw%4?;CcZMJdo}yf9M77kgT{2PWvmZ@;HSv`(-K*J;rhPT>l`-9`$&V(!GNyYq+pG2K
z(8O29bgyPVn&VmX29+`0tJ#mHeKqlwG2N@lkLLNHLla*)bT3kAo)0=S@s%;%t9g4g
z?W>8ejOkuYel+owG2N@#Uemss_{x~>)$B*pzMA;TnC{i=N7KHV_{x~>)#OJLUm4TA
zn(Z~`XU+3LW4c$fAItBJ3S>0Zr#)cQ51do|h{)4iJ4tJ~L@?$vCs)~_+$tJz*%Ut_vg
zv%R`~jp<%Z_L}(0nC{hVuc@ylzA~nJHTzK?&&G7GW_z`Mjp<&^_L}z9#8<|2uO>g5
z_{x~>)oib6U(NGDW4c$fA5DEV&j*d^UQK>9?_U|yy_)Sc?W=h{XiWEN_M>TE&GSKH
zx>vIw&GD>xN8On2)#S%8X3D%?Q(sMdWlZ;K_M@qvKkM!%Z)%9!re
z>_?+tO?+ic_iFN^iLZ?5Ud{HJ<5?458PmO*{b-J7&GSKHx>vIw&GD>xm))4|)#S&J
zGRnMOQ(sMd<0Zr#G{>{%{VQX-SCb#j^Fd>}SF^q5c-A~0
zG^Tqs`_UZFn&*SYbgxD~#&oad_3Gz?#&oX+d*!=VY7gq;Lw&Z>>?`H3sgDcwUMipg
zQ?6EHrYO|W{Jl9#k;)|5cN0}PN_}nEFjndLKjA=r`f^X#WjrC3UYO1Fy
z-D^PuLpm(emzs31Dx2g2$AD^A7BFJ_^2zv0p5zhxRg>-&-||7!YQ1QJTumRMCdAeB
zAlfx21oas~(|xFWI;%b@X!;Iyk7m`9EZA|VO!q2|>4NEA&ENQ@do{L-CRWyUMHbj|
zG%H8Jbg$y~$(IGvz50AtFx{(5&;;~`90kVxtqJEfPop&tqcyR-=2btcYosV0Eeyx*tk9@Rwen$A&8?5=sWPZPOo0(Z@OeFeKkebd1h(n1;!Fil+l|G}}U
zz7)zc;0ORa%(Ry(%pV#uy^4J(^11qC#`pcYz)ci3TC)>1
zJ;_f-@*;bmCeZ%h7|Hu@)4iGwUQJB?WW+DpLlcu)H9@IW)8lOY?~V8+cLv&YuV`wR
zDAT=~js{J?wK3hR*g5P}rF6)ofqjhK!%c
zG|{kC6AoK7@vv1B5L-17u~iciTQxE9lcB{BtR_BwGPD@`NAv1{RnxU?)r7HDO&n|0
z1hQ65B>QA&F>jau;?QDx>Q$wCHJ<(yBahYTUd@Hnr~fCzlF_ER9$8J7?EeeHlEvMY
zD&4E8sWow;P4i}gG2N@#kNWcdzcF%IpYGN4Lz?bbW4c$feSz!0D&4EONP!+xRk~Mm
zkpkVNEXuHHUU+yiAR0>g&j&;!2L4y+UQI1kFn%N+3Z#2Q5gOcT)4k@~6ioM8;5%cw
z*MeWtbgwLmHqCj-*5p43%tzMqVeYHqk4;Sz=CD3J(;8Mz-v6`jX$@0SJTBvG4GJZi
zG-Fmn3VpocP6#7a5FcG~DoURNltNlSuS(a
z{t?}G#+9_kg0XorO0m}b(9~Ekf8tByTK4Qy;g6mi%u@>*pDyvw`OlNc{xv@QA!vBq
z140|I`TVfT_((^Tk(2Xbg?td>b0mm;V_r@7j_F`P7o2GwI^E
z2WezjN=#xxfIBWAlC*z-CoU`{D$yGsU~$JqG>)(Yj0p1*yEu{;nK*R>3{SB}1U9iY
z3rram85tWGZfg=ba@43{5rO2tVF>|!h@*%`5lzCHhC3Q3TG&IE#_@@fsc~d>$dp9y
zf3SJ(xJD6)@t&ACw>Q8`=1z@?chik@;q(8qZ55>(xgAbNl#Oh%`M*aO%4S*NiVzdB}WMP#w$t_scB#
zso25#WzHV_F}B3)?iWUS9dnYxroK`9#xGUI#}8=VboQ=)&NZtTdD@wrQvCVXz6)$r
zan?`!HeA?nacFwAJqu<&_to8Z60VM&mlSyVyZ7!se!11c%gwz{)%Y`Y!8@ydnwYmG
zrtyji3lA@U%Jz5kb!SS_n@L~P+p)Ms*VZXrD;#YdzN7Aq$7T9NhZm}QDABXyvom`x
z|JV-2yH=f_UZr+Z4z4wQt-zxl1|FzK>JEp(nw8ng0
zy!qp5jKI~-C15Wa{SXjEn2m_dua1tUfuhQ?cqf~ucun~Q(a!@Iezz}kz1xF
zA1&E&?%_@)tIhB)>-cNHqy1lWs@m;2d+EfhjTL%SK48GSdCv@AW$WPB7
znp?8-{OjJqTRLY=oPKoo;(l-$S>x3&at1|5_HeHaYPmPN
zcEAhM>$O?i)?c=KNK)g$Wjl<2
z>#c@2W=(q0e^}1sA|)!=?tJn3v~6vk8t~qOo)Z$rk8IY^zjCALFWNpXJ^LOl>Cy7g;u&361vDBu;hT+*Hy1wmk>$|~
zQ?0E6Mt#0_c9X2}zh+O(=rSSlTKFIJAC7VD3|>7p!M^73_l>*O+qw7Rp?g=>ZY^B(
z?}QigVs_2BoAG6b@^4)G`mM7S&Ls{1yF*e3clF;J%uhM>{gs}pZVm2R?`FBSNsjJ6
z-YdCp(*CMNBj?_!wzNs_S*;Rxma4j;_r8>$e=K+Za?vRtOk7}F_;hN~9-EI`vYm?B
zc+WZi`hzw}GrqiB^YM`#|6Ewwy6V&O9yJ{BvCZ#B*NpPdRQ#r-cSQYndX-MS8C7H9
z?85!)Z+O@;dPd~5a=SLw{JziLmRA;s47xn-#s^KOJzUp&$%(H<9Q^!x=nr!`O$)ja
zIQEZkKAZY!y*UztYRf-QkTCCLY1MT|VyS+2L&HUFV9_!VrVfKKZ+)p3)piOA&
zVm}^BPL3P?XRo5~I*$&m+J52hzgO9EclrL`ezArpzCL=nr`4u8cSqe$x@ig9a%IBd
z^RG|;C;NDjLVlTX#iHVzEt3A+b8BqI>SLc(ZurdgOMfrg+G*t6S&t{QUvTWuSIer0
zMzk#V*4$U?m5F~Yh|^oUMq_2aAeYc*R~ZOpB2)_rB~(PC(mS(Wzny4j&~(N={<
zzdiHyN`B|7+z5ZI^!%kK#;)JBV%tZ4H%C`~_;I~5=fmyJTJ@gmvNh<`FJHn*7^H-X^%QwzH@$N*13V#n?yI>
z7gTOnR@)c7B$NiYAp%d%+Vf-M)!Dw*9r=+gup;+t{VYKbSjU?8Ug#OFyjq(bkneJ$~ow^q{@t
z9>3Npqw2-eX);`BCJk{ywvD^1fHCTUX_`bQ_-x^ry%MtY|bdGs1HU8t6
zu-I##9lJYZ!DpGJKj=1YQ)JWDWrly4IJVW!i!a2Dp8NdHE&ChVg6Etm7MW6X+x0$i
znMZa^?eIdULe9SXYJGA4$95mDZu9#0+ds0^d9TIpHO-gLORGI%&EZ1>&rLb^S5AkG
zCG%ne*0ebmJH5WG;k2#|8op6}{M4eAH}*-pw5IO;zRSnmpP2KS<v~Mo@$#2rB6s(nQupc2Q*y3VTF}4Iv7%E>Y>BXaQ+dpk%@KDGTscr-V3(fDddw<0
zU{Uq+M+STT>X8(@;(V12g&H0Ds^OS5Yi5N#yFYG1Zt>D-W8ylt8h0#Y>8K*x{+K#-
zRkKsy?^?BN$*rxkn@_$LTfB8{`qHEf$NCoEtaz^4!i=*Qt-t+N>sF7#Y5qN8^CG9b
zv2o1o&&NIA#=mma@EUguxBdN_b2-OSKaDR{Gca)DgC&PgJ~Ly+x7XTqc24=Z=){<&
zf4)${Yc1{9bllwu4=;aEwn5O@v#%_y(sR;;4y7M7_`3S49fxXublH>JbI0kiw?nH9
zD|S6{`=!F7dtbgWcthlf4z+ef6dmyD
zhC8*p)=obhHK0bX3dtv*D!sGvr0uPiom#lBe7&A+YMl=_F!`f75gX2&Y1m@I$xo)e
z{d$dJU3Ugw|Gs+7j)89t9y>1RT7Q1>#o4u|Q+gd}USUR~
z<;zN(tvmb7ty1CDs|@=nBxB+;)7n)$)Uy7en8E=qgZDgWy`bV=i@*QEcRrZ*#`?G}
z$1fb{8(aE*Vsm@U%eK4K)?a(KH}AFn9dut(?hxBvV!pji21
z&8IJl{B1;Q|BrWU&a5@xWu4ce*notD;|crf5BU9?Mdh9?@=~35{#v$UUF~9po;{lA
zY2NwJucH_IaOd@_NuIuK8{EIU>+ZH`@fiaGliJ*lUNyb$H^2UK|F2&&JJ)@0)yTbd
z7FHj%anYm;tttk!>v(cb_3NcOH@^5{&C~@17eIX8E#q<+SQKEA5vSzV%Xx>;7A_`hB*4_RdQs21o5pD`9PAnbhm&
z;VDzoMmPHWMpnIhNo8JmB|ahH#*vEUzWjU8^mfg+46W6EWAlxTs!X_Be(kG6c4ePF
zx8lRPBj>zQc3EU(M5lx0#};}0{UKN5TutAc>0STUy3PF)_g|07E_(XgZ(|Gh=wIxg
zF`teZJ@NaU(>hLRxbi>!{_vrVle5bG@Ttk9;>FAZhGxHy3=@)lnq&v#22f
z|Ed3fSN{15*(2_rNGo}!)8)r4=A@olIrX};-;aZvbf`7(=$B=e4v4+=xK`-{VNFWT
zSZF~y)96e4?86@{{_u+*
zE?(XIQtG3hdgZ;Jb>enLof#V{@AzuLougGlO8jme9NhMHzuVQXjhySMH>>fE&v#y_
z+^B4~DkuNGS~;gf`wP7<%x-@F{&H);mjTPhdka;2`%d?XLu_gN&wTyV)+w!OxTp9fEjz4P~XmP!Fx8E^U(3-l(=9ox-+
z`Nd%ug9m=!?c?d=t}d
z<#xFh&U&Y}ELsv`o8RV}$M0JF0
zVKu9a`Sa+iWj8-ueSA*&Yb{H?+vj3~CALQOTeS!scc9GU%&N<;eERJAxjh!Xo7Jvk
z`IM{%0gqD4W;tV44(qcxIn5jQdc}$TrX)Mx+85b(%>_r74LPsg>$<-4(I$UB3h#a5PwR8XRJC=sE
zi|y6ny=T5H^79UFV2AgPbQmz}h~wWKU;pm=;l&eH^ly79qw~No2i_WFse5?+jfx4s
z_FdOwO|^|9uiW@{_Rv9T`)WjWxiO{Rb4M;$9MdGUdD3?Ok*}=$^{00y_uaVYsjn;7
z2)VQS*||Ztdc9ftQu`h!`tJGT+8f=b5Ak+9lkmxoZ(d1t@80<9@$X8vS=`mWeE+`a
zVW0izY&GSj)zja7HFZ?+s;i%#w>hTlXB8Xt{ruF@4zv8Gy!&~QtzqVwF@1CQj)}{e
ze57XE@S`oJkGS}#NyQDpryiegdb{$V-7U-AAAYd#!+XQC!_Owy3E6yn^o{xNc((Vx
zHF*99Wgc5*)@+qkrmVe7x5aguq<(CjH)288KduH8_vFPcS~=-PkFTo)j4AeF{V#Sk
zbWa)d_2rrqN>+@Y{;1KB3L$Mlf?GCCi3X
zo7Zh!T=Yu^dN*s*qJQGw7RTA=aueTAuy36=>G_A=N`bdMqjDD?jHxpH*!7L?#{RIO
zSGz}5i~V@D;-)UouQ=s?biVDB-9L1wJLSU5)!#23esDPrD@AmJwe$2EXZ(iL}HTs?L(<)Ms;SMtEg
z7ya7Qe6DWY9trzP9;`P#<w$Pnu*)_TCzC}@YCIs}Hxu@mzp-W3lYVhc{
zlG|PNtNxMRq;iM#jqY8K-Quc~oBMlO-j(hDe0t(ap*N2#`f@@>`(3q8+wEh2hzPm%
zV8@^V-L5_J<;0GwGybU@Zhf}fqZJiLgq{AWQlYkcj@SOHZre}a2(cV%bE{~L!!O=g
zwz%k4U=
z#;0{&G3nE9i-h`}_+#=j)!z7Jba448@q@n|aeU(BzZN{WUoo`qn2x_4y3uh+PN8k}
z{%Dlc^@qdTJ1uZLs55Eou@i;AFJ+DWZgZn0cXrplJo=60BRii@&+A-l(v{}lK0bdZ
z=wz>lt;)o0A@^^UM|?fy!*l&Yk1s17H-E^5v+Z8!J8jqFcb6_)`*iG6LvDZBCo*@+
zz)~}|9bH!a#*ar|D|PzulD!+gpLM5nNbqkxH#MKw{pf|nYB>!qj_h;d<%!RnD1WNt
zsUti4-mSPJX4q@h`+hU-`i7KB=T3zE^z6!v$KUn$&$?bUsr|a=6L!5*Y{?Z{)j=~F
zFa6}7h}QxhEpIq-++O>S-TyrQtMz>O7iV|=EpY$gxJx60W?#shpB$gNzJ3Mo%T*rO
zx>c&OeL$40`ukNPo_Ce`uEb|OU)x-&!t;mv_?11pWz<%>{)SpUWK}A
z>Nx!^=|v`#nD=tfg@(?{t3$TBhaG+^wfyQ^#k(hMtWslWfb*Z&2wX$@!q

literal 0
HcmV?d00001

diff --git a/dist/platform/elc-asan.dSYM/Contents/Info.plist b/dist/platform/elc-asan.dSYM/Contents/Info.plist
new file mode 100644
index 0000000..509e0bc
--- /dev/null
+++ b/dist/platform/elc-asan.dSYM/Contents/Info.plist
@@ -0,0 +1,20 @@
+
+
+
+	
+		CFBundleDevelopmentRegion
+		English
+		CFBundleIdentifier
+		com.apple.xcode.dsym.elc-asan
+		CFBundleInfoDictionaryVersion
+		6.0
+		CFBundlePackageType
+		dSYM
+		CFBundleSignature
+		????
+		CFBundleShortVersionString
+		1.0
+		CFBundleVersion
+		1
+	
+
diff --git a/dist/platform/elc-asan.dSYM/Contents/Resources/DWARF/elc-asan b/dist/platform/elc-asan.dSYM/Contents/Resources/DWARF/elc-asan
new file mode 100644
index 0000000000000000000000000000000000000000..aac088b82206bc3960637330c3e30f0c8b15c63e
GIT binary patch
literal 376196
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

aoRqczvY}j?Te0S~3?q$3BRkD_2?zj>5r>%L= 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
%0`*@oTvG!udFC&d7jId zghZKw(6_wMcSwIrLf;|%Erb$rDovr~jeTPhQpF@=qnUn`*><_>JI^cJJAQ?&k;SLHaajGnXm8suus*B41 z<}@2w=P`*$AjdnAd0a9_A`>J7L@~I{*&f5?{R@ut^0a~m$vO!uw8cPQk^;!p5zSTG%Q$-l)wXu2Z1KyxK`PlGI7*vYKm=af+<}_Z7x9Nh9cy z9r-nl;8aS}NZ3VGPw-S3wQBAS z0{_HO-*IXsV6%<&;3)`bN!Oi{fTpO0jjQmPJckw)(&9O^s6Y!Mf)=MBFfC3&U|Q5k z;5$V8Z1govn0=u!l#v*}| zcGp!&wr6`~MsCPdOVN;Y?hP7{+}Bhy>%wt-K)8;_%BNg4Jq~?9vXlnGlP3%f+{oh* z){81mL4ud;Vt&--R3x|M>3PN9o{B_2f-HqF&pwwnFQN@d7Dy%tkDtV9Q#VPaHg%I! zYEu^pRpl=h9`>WncoaCSu@j_zQeS@za22CDM@88Yki9#%A4f&q4mN7A>F4&V5UNNY z#r{s?l&3_e2ODQYdL0jaLEDoUYEerM4wkx^{rKuV=`5G^4#FNJ%tQiEbxuFVD?F2X z{*0d`#5KXj&C#^% z{cv#L*Q=Ju=`7ZcG$;Sc3TF~(q_e{5!nqJ{u6L;=oeoPkyT;Ffzo?N;y>Y5h_g`s8 zO09^~>~u}9H}PF^n{j=(@~alxS8e4Sj^BJkOWw3_i}Yz*`LsoR+EzZTH9kvS>5Pq3 z40B5rS%nU2<3`a1FAWjYKi;i{WO0=%qTJ{!`b2-C6}%hkHuNkan}uXkL^hn_!j3uJ zySy}w>VVkdz8VAE_D*<1=IiDn7zis(1{L-OZSyx;O>dA}n-o_}c4{c|{EgINCb4Y*ZIsCMqFL?>Y_S8>+3_c^ogmK*?a{<)o#?RD#%$xUP@er4h?b2 zf-?t~ve1`SyU}VES}BohQp^xEp;_cwmEhli#F<3l#@EkG#Bz(fL`|T%`j!NiATS4k zC1`*&EGmZCcC?HdsaMk|aW1m`QZp5aD9ISj{s)c`j-AktJMl2Fb+DQ8>0i=eLBKoV|ApB^2crSAKn(FQ_IKW zN;_eGP3w!IU?4JUN_7vm+gV8s6A}|UCnO{!@qa=>s{h+REg>Nh?AZ1CTk}7oAN!{$ z{p8;!dipW5T}@(Q#_)e6$WC0Il$_8v`GE%$67wpte6XzKk%^;_vmypx2|gz&c}3Ei zq=dv(1iB{o?3IwXI)-Eo_@LxRA5TbJTZyfUNnam>7l22_HRgjWb^697CrnF9&P`fI zKHm~pn3P<=TLlS;-x0`h$!lDJOGrFUpg1x4U}8CXeovrBa_>F~i6_9uMUv-4=0y?` ze<095c}(IsNKS$eNlhM?Iw3V7@kaui5|c|3OG){Oz?jpL=bSe0w1mW;36v)$591nT zLgJ8Quj87e0s>DGC{Icr;)aoXHi6vaLrh=Kc;>{ z;&1}fQj(XYtVl^ne2PF>TJpGh6Y3=-jv!Ewl6)|woRpCSO#P?9mbFSQZndjbLgF(7 z<|QYuNiHChX9?saCNE1|fy$!@PynNn$B;6bz_`vh` z35k>886&c^kt-5`hwze9Rq(Y%+m9$pZ%^B)$Sx=8{jk zA$-jg0=Z`=7oJ^oc0%WR)-Ixbplf~W3%wc}EDkWIiG_~`*!Kbp=LXobm4$Nx?AF@C z#{z8D#=_kLOmA!9)O3Tr1AH*RF##3@IJtw-HS1__V1UB{%n7g{z^-&!_2#kwi?6hB z!c_))1vn~(F3|Fyvu*BR^+;Di9j{Kn#& z^)xszz$4dNIQ@nYAK-)lJKt#W$-gz&Ex^b7Sa@E5-F|1`lL2=9y@ekQ@L*pHkGaEO zgMJ442H3X0g^L4hcDIEG-(#>K!18-7JZ_-DX7?NH@dtxB0hR~YeUQaZ4zMi1gg;vR z$N*FS&BC1n%nC5$0gLa+Xsr63{O<-^{D;A|4;st~uspzSe-88kmIYY&7mF|cFN4Pe z?EF^?X9f6RmW7W5*z92o_j=UeqmLOp8DPfWEZppIgA)QQ2(ZuJExy%13}!rGa7cg$ zhgi7blLos6cxw zvhbh)2TZVVS%7OMTDZl_28#piI?2N6lMNOI*lUV~8%#CWW4ghE0jB3zxFEnmvqJhD zgE_Am?EJdH+yHyeweYZc1{=I#a9n^{^DSH)V6O!h&Iz#BLJJQIFkz8}a~B&tw!~of zT!Z5R%vx&UZf_cV{4In1ml-^=+~ANrgAe2zJQ-ly6&9Ws;IRO^ueA8G)dst-F}NbY zo@*`KaGk+{>kX!FGT8kcgQ@Qt9QmHXg@qx!+2F|l*KD!yoP!3-4;d^vY_R9&Aw9q$ z69yj-FyRLa zcMGumq=kF`Xs|rM0!9gq6T^}Wt_ZL+z=6)Y$*}{Dy2HT!ya6o_!Q!P9$z(Hvi z9#YR>L4f4}HmGm$sb?5m7~rTgEu7HM;NSoY&bDw_Q-dweG1xc2F#)z{7UBcU3Gifq z-P&3Dm;h7TTeyFKeJ--_t^jk>E!?n!!G!@f=xE{c0Mk2JctsRmY~lWw7+e!zdKU{% z3vf(V3pcyeVBY|X0$g*s#V1^0uxEhN0vvLs#rL?%V4v;==LFdB7a@GL!S2@>Y?Wa! zH^7nr2VHCN^8!2);K5&7{DZ$Tcr3s*JuKYtI)kHrW3X*cgOdX+V-2D9_INLYy8>)@ zlZCSaOwF`#p8zKWcs#&fH(UCH0hR~Yy|=}W39#F(7CshWk5ShC3j%EWyoFo+(_oJ< z?(_)#YfW?GfBZay=`9R)Ze?)rg$9p@@;uql?8WFBsOQ&~z9zu(0OwtVp-DNkN;lX$ zz-hfKTpZxYKE~hTcLqn^X0SNGLBF@~v^xyu23Qne+kO^5pufTXcN#n%;F!BC{J`A? z3j#b6VEH{3-|Jq3#rGK;FwkJh{RSWXgTb-@9~fle;sE>q(ZWX_Fxd4^2D1WO7GP0; z6CMoo|7kGi&jx!8HaO}p28#n6_g4$2|IJ{|5Q8V5G}wEX!D%B5CX6&#`n17g0k(R^ z!js1sJQ!fle_HtQmkg#(G`K0i-jgic{S|}VrWkx6z`-*tT$W?7#Y}^b2Ur?l=UEm% zYL3BU0p`4B;jXV6928(tfCCm;d|`mi7F)PMuEFvEj|7;r)Z!PuX>dTE!NQdW2d@g@ z)dr6QxNEJ26V@4=w%%ZQfTbHOyk?`pf&d?V+rq;(8SGkUaN1Ubx!VjD2Uz}o2=6j@ za<{>f5`zQw87wL_xNyJ07G(yLKQ%byGlP>47#w-n;IwjssoxrWJis{t&il^d+nzKy z5RZuZ>%oY@2T~0doMCWHLxWu#861g2LG*o_1lZKz(ajlqHo4K_|USlq$j zxK0Ka2H2;wg&)7zVArk&M_y)d(B%emx*HsIwZT5u7#x{laLBa=hxITx@HYkr_cEB= z+u(rT8O#ZASicay%i!Y!42}t~>|P6(4K!Ff$Y9rhHTd`+L;SxPEclbb!v8SX>^}`I z`?JBugAJw!SQuc#|FZane>GSX;G8TA9}lqfAq%&C*kI>J45mIB!T}ZsSo)a7pA4|= z-z?laz_Pzvc+)=&c6-9$zyL=DxGcc302>Z5y6yoU46t#w#Wx#juxz-&BTpGjA7OBS zoI$jwaZelU_N>7N1MK;{g^!Olcx0Tx#xEM|9^jw=CkI#(VChRnw`-!oW|Is)KH1=$ z025xZaE}1zy=vj20LuexG2P06G}vvC!S0I6ZA4lXpfX^X+!B7-fq8Em%0VE+JHd|=_n z101l+!bbwk+HK)hdkiL*80@w;#D8QkqtxI70gef<;U^aV=s|;ppBwC2Zg9Yt2A2gm z=j%Xs%;52F3>KU)*z2UhIRU2rY~jHHPImaiXkTL@2K%HKOg`P=4lr0W&|t>>26z3zVBdc=IO+j|4gX|t&c7SXdeC66 zzZh(gWpL0#1}6l#>|qNhKWeb?;|8Y6T{3_dESFYPF&$Y4=`yS7<)+;)R~cNk3FX|OoJt{;SO6z;X~@sADmEi+hh zz+l!PgM&XeIPyz_MPD1-bktz?ZwwX(crw6E-&%av69(4=xbWvdk27B1(>cZ9vNVHz z&M?^EY=b?|F__%kV2hRp`(I$NS1W@(+ZgPAiNWFk6S`QqZGe3O92DTl06Sl5bXk`f zoDg6^fCmF?e7U9f2rw(ahTSZFQ}+O`F__%LV9x-XU1#BeJq?b$!C=A72Ge^RoO7$e z2EQ{{e4D|(zc=_mUxVFmH#jZ8)H^KPIlv+PELYhE4}|c2f{kA&kJVfj|=Os31R)S=_8Au@P)z7Um2X!%;wK|*BUGz zZE#eu!!lmB@Psg5xBAM$1HU!6EX=PDhWWL}zu0(F66TjRLoHkw#{beV?q|JV@pHm> zTpGsP$HVwIWWS~7hHFM!g%#y=!Xyd zo5fH2e+>41*5I;G56}Hc{*S~|nj-D7WkO<-^Ekm|zk#e!(v?bmD9uefY25BQrL%>T zkd(k7pv07v)YFXU(KNRv5Lv|E(p+g=#6Qwp!jC4#D4tAnt>PkvrMVt)5hK#vz_^HK z_z|?Yh|%a47cmAs;vy!XM_j}t^!O=Ok16O87x5~3#6{$wM_j~g^oWai9X;YA-awDI zh=u487qJ9AevZ}SP4tM1SdJcX5i8ImE@Cx$#6_$_kGO~p=n)sO2|eN>-a`*Hh06Ng zf*x@Z+t4E}q8L5mB0fNmxQN~85f`x+J>nut(IYP66ZA-o)#Eeth>JLc9&r)n=n)t3 z6?())RG>#(#5d>>7jYat;v#-PkEB>VenO8BahmTCiHRr@7n4lPz_^&xh#3+WQ;(Qw zaWSV8vnDR4Au*+KF=rE#;7lFMy(uxR;$qGvrbk>%3t|Sw#auwlkhqvO#7v8eX-CYO zxR`WeO5a$lUCErR8{S@_oWz01uaoq zP>iMT8#EfVwAyAe)DmkFs-g>1im1|{h}s54P+EIXj6EoVBKH69oO{n?M*lt^={?_j z?z!jg_qoqA&yz!T28rg7{Xk+lVN|AII{Tc48Ze;{EcQi?M{qB-O&keHJ7?Auh3ge86Tkmuw{Y%OAwsxM`k29nAl zbs%Xa;>mOnCokK#^FYE%qz*3tiRO?CL1IcIubCi;9C8szQi+stHb^Rm%mGO&ky6A# zoP6t#kOq*j67l(BkZ2CM1SFPtN|gCufD3rJFl_;v$GDu>JiN#~IHAWmU++uZ~b zRwDl23=+*D3qWE@#KT1(i5#*RB&kIFxfLXpLy{nAB~q^2K%9QoA0fAcgmcIpAkiFh zCrC_*_|pcG$RT%wB$Y_H?g2^VkmVq0C1U435GQ2)5wZd#tVBG#A0(PX9sr3ckyI-| z5;^1{kfajv=Mj)p4(R|%E0I3A3dGsW`Xl5qkgyUNYfpegbI6k*F(r~$3M7$3o(4%O zk@k8PB$Y!}gQS&6*`Eh-Hn;vr?k|FbbI3~|Q6;ApqPMRBiCNOu+w+|~iG2mJi5&g4 zAjurE4kV>SO7uENI)}Ug;&|C@_ZCPvhrA6ERU&q}Kw>%MU66#5;r-zM`>Zq9Snl(m zoII(w9>gY9U+RQON{Q?Zid}e{Lk593(B=)6S-~fQgq28bp9&IHB9?1GVoJpFg&+wf zk}3|8R3fP^21zLqotr??O2p1>AWnblkCbaENLY#VJtk2llIkvym=ZG*K@v(NRU1e$ zhui~_QX+QRLDEXZ!v{bdJgYDDBX*dCl}NcB0*NXSJCB0Ilt?Ka14$?`BM2m!L!Jal zDUnpGLDEVj6%(f<+n*Oe!b&9fmqDUR#KTuWVoJmglY|mU^#({%iRioqlG=o%l}NvR z7dp;>Y=4-9l}IVpgG7}`ULS+Rlt?{)3X)JFxid*B5uGnUQcA?m*C1&n<2T0`*#P1U zH2(CBk$#TZ1#xWH#+p6Y_aIRvV)G}Em=f`SBS=Dt===(jR3bXPASorH^9M*;iOev6 zf;fY0U5U;=AYmm^pN+BK@DoUE6OvHk?+@R8flktrzVa4X-+B?7Qhlkzet!6tLxzAj zL#%I-FOzT%*&ZaSMC|MW5>q0nW`HD=NQvfxBsU?c9C8hG(wh)x3+s>c7S;(Xk#VsM zB&tO6ViHp#Ix9gEN<@cAQi)i80wkqGQauHdRw6C+42Ux{yX~F>2`iCQogh&qlGl2W z*d`>ALx$qjF3C+uY7>%HBJ~_WDyKZ#A0}ZX8J%bj83mo#CM2Om+H`yNM~T>J1xYE9 z@xmmnL`urU8J69Dn1pl4#~@K9Qu9n=N~8||0ZAxX&)0xVl1fBpiy-__B6gUhm54tP z5U0ZWBXh!;AmJQxB}g=fTniFYB6+odB$S9hH-aRUNbXBOQcC6xfX__Qmh_Fs&7HhV ztP{4rtycZ8C4KrKCr{QUwiZ==@u~wPrbN7Y3?!jM=BwvHl1idnlN&)&IpkN6bPo9) z#EDqnB-LLa;T+=R!5<}(`v8!b5-HI@kc1NPxeO$!M0(m5ASoqcXBbFYiL_%F#2Ie= zF)a%cRwDg#BuG@rfI%qf6p)xDef8^q<0f_@hL6$Uz`UCDMDDq?AbROwvlE#j8M^5!N4B z7mfu9D-oU3L83||uQNenN~G;(f+UoPohw0-O2p31ASoqMKMO$8N`O2lU-DJ4?U)gWmlVws7vwe@FB8T#!@AYn`T`fah3Cw<^E#Ku%# zY<>ljP$K>92au!^@y%ZVPn5`fQV5b(B9@srqpT-V4@|;JL}yQss1nI*FOXOcnFNwh zA|5hHDiO;^fuxj}mI6sDkrBND#M#FBBYCxhgmcLKAWxWV+kv{2xM3r1p4&QbJiCNO;TiD4==%>yLWz`gEJ#v`^#A=pQc9$s8~~D5BDHZ4h_j2e zEU79%!b+rm4hM%;_Pnyk&?E7gq4WSJs{B> zavw-ciPY--APFUs*GiCNhVbt35s;LUGr}ONK+=}<_3%MX-X$FS1Y*N`7~lG0OPxF! zxhcfPY;2y)HqU}2mB@I1p6x4$`#B#{?Ac-8Z3rJFllwx;~loGKs1|+RSa^D-o z**m*__5}$mk&^BY5>+C#aUe)6ha3!&P$H=g1xYHAdY%Z9QX>9Tfuxm)&e-PA5oA ziPZngAjur^Do9F+)Z}X*=^XMVNO*snyX5r_NKA>;!v`P}td&H;EmAt6d(~Z?fe|TT*G+|9B{A4jBs) zRU)a50f{M*8haijp+xL_0g_ZAyUK78%9TULgQS(9zdLjrh;xYbN614U;T-ZbNK}c; z)vtiWlt@o|2PC0H>~w>qlt}+%l2#&p??({lP@B7uUqJ9yA2aG@9$*qxBIRNdQzAOQ zgCvwlANw05sYJ$jQGfWOMCx#N5a%$Pm&`ExfP|Gu%})o3Dp{}%YK%$DlD^)xlbsu9 zAU37?FR?xoXM)M4Pk*qJCw@N8_HC@WbIl~CM0_YIM(Hwy@7fFmNh*=6mBT<%N)Ff- zIuk&giT}=bti67jh}f8oHFx|EXPZjo6(>iq%}p#E^@Fj;r56<8L{b2V)wF^PeE+-XzQEw&lpHbiOlDx zf`pH;IhA+dD-oS1L7Zca<@~%3c6S>5N#cz~c!HuJ z1(5ICrJxi47P!L#g@OG1exg-Z;H$D)`5__a7WgWaY$jxSfp3f@fz9*s3myDy)uCFC z&gbZUZVTRDAVH^)$_hBDKiy=bVnrtCgxqW33Dp+U7~;6i+@_);8+JmzbrM-Z<836{ zG+`&?KUyLO&~X|$b6{V%ZjcQ-p}=Ixy_6=aVyw)DolvkxtPG})G;-#UzHr?Zec_s+ zHoUpp5-X>)=p$S`j6SyErqLDjiG;npO4!}pZ5mZXUkY)YP`=44OdEx4=C&ZOOc;4( z!pO^nO8Yl>L;e<9{Ud%3ypmD-b z{F<$7n6n;22MXt`htfeBt{O?>HC$Ov2TR!VM&bDhXhw_Z5JQT_YNo^KaD)1P#%TZx1;k!@CMB^%H8oD=mLXE!v>|}JJJk;%GMYMy5c+0MFtI? zY0$d(XqqhuK6S=-ra3C4;=5422+%|+hP0a$9r11GdR1zVm(dL>w85`=DkS5((v2p$ zx5Weu8`y7+??#JNp*g-g-C`8bqC+ua(V~0MM4uhJc&A7v?Cfd7PN{sPH31(v=>!pCDJe_GGUYGc$=tVj^wmAovexKMrOiIWqbC8 ziw4>-8yHKcSOZ}*t?WbpQv);i?F-lKX~Rw^f}iiAO#9JPRYXpiaLt}J%w2md)ryWc z{6KCFbnqxmGx>R2Cb{J?prUkvAnw)s(}gC%h|#8BbTk}57nx{Z(>kYuW~q>J#!<6T z-fAUV_ce7o2htotke$%TG2-Y!bgM9)c1HGvQ6j^UZ%vev#x9&5PfIjhT|u`=*xUL* z<89SgT58BByk$rHKbY=O{b(iKXTm%Q96~EpXm2=_R$8H{%h{hE7JL+n&LGaDEf%EfdWne_wiAg|>z$y(5C-Z8zD} zYZ7d|Dzr8nP9Lby+)zOuir{VkxG~+>us@{@+TnbI63FdKP0|}bg1S}ciI1aiM1ZEZ zBi=E<-gU>T@Z1a!76|Eh6mL$nLRb7qygAVd>*5u7bs`JiPDdM0JLCJ~or!`*hYU)^ zCsDv}lXS$7BE0j^SZ*bFVs)E>xktVKU87p{?O0x=4j&!^t#Dg;sQz*&=vj@X9Kw+Jotrb&eL%8G@5V1T*TAy5=rYwJ9_^D5xlWuOmAyz7>l<@a=f<>Z)DKG zNz}^inxwVi3|gu}GfH)r3XKg@s7-}L!+&X+6`C4pe_AdA42Je?LrzrtKYCS=nW!>h zOjIUpCaSf@2BwJ`TBl*W>gNp&S79E|aOIiwj)tQr(z_bMo3P3KW3?7Ln?BJnrpZqw>_t1cf@G@t+>rh23_4;?X{(<>6-LE7a*?e7D2z~r z*7}*Wl?u(saBCGBVSPIhyh+xf1bp1lprfoqy>l+2(FPqIHE#FJnMGp+L3X@jHX7VL zCrSqjMx~_Z98U+S&^2cw9jwB-IVaE|Ds;{{kq%QKHD?M<5W(?|mAwxp4H!LA724<2 z&?FVwki#)5B$2~$Dzwfyla5!R89AJ&LL+jREP~@5S7#d?Ih?8ry|ZW2X)5&0o=9h? z&^`NDnxaB__8j`J3SG17>3<@4)$2`FteYLDGXjuexSw>+#yY5pQnTx*PKA!y z4RoFg?Xwd^=d08<`(mOCR7%digy=$*T4&ECnxRtj>`RGes?<39GNOxAO3c2TXqHO7 zvnpt|2;K=Yv0(QwYk#UY=tO&U)IIBbx>S>-XI(*bg-Tts#?j3paQjcrH|1M5D@sdM zrE^vt-JwEiRwGfHm6|#OR}$T=QYuhE%S7-_%9j>t>Ih(=GU()#RA^Is;Cy;ele7ik z%)=@r1LNpP5uoaXPMP56S@H$N$}<|L+1+dslW2iKr`uuNiuJrm z(=<0+OVnSbM(kV$h=3A#XUJ-X*{R_=q6&k(DXmg5Exni_M`*g9coWf9nlSX=(XxGM zCK@A*SGIvR?1cVjVq1t#&5AW)CsdO}(Wv%%qN_9(7c!YJR_IK)<_1+lJ;o-|)sleg zcOKC-DpW=3S`AlL&~*~_&UCm2QO#qi*~D@M-$>MA;?G)cirL;UpJ<+Hw4v&5v_ezb zxru1LNZkHs^A3t?TZz_6r!ZR!6GldLLusAqIoPkBO|NMf{o-{EV{7q-guSVYID5Bg z^jPXLq*fXOM@JCIkRJ(|1b2)S5{W`KRf)hHI$2Zk3CMvPf zEp@l3;Dn}+lGL{nZJSA*RKY1aFD%hZh<1|b(D|#SN8LuWTgDt3#t2U6g03>o?RKJ* zG&;6a1?~_y1&|2uLbeQ2HGyJ69B;;M21O^(85YeP!-#vt1gf#@qDsTs!KPX^D{NR> zLmgdc*=(CO*>Eh)5(Y!94R;XDwiWQQKU9M7h{7%f1Dy8Fh5jCpR6>lTDQl)kAyD@B3O2n5D4b7JgfBb0US0}T1qTzTA z7N!{9Y+-^d?O?jt(Ejk5E3G|#57AwgVQ0#$Exw%SUdzIUCFA!JbqeDeir+`{qSe6V z2d8Rgjo($Hkv0A>8jg1{4KTBRZ~Y3Qu#^Bvdg?JFMpWvqZzmeAQo88!_0xwWdK>Q@qt63OxA(gdT^QU4IpXiG1pq@nHg z4-@U7DckBXo9?Mnvi=dwk|u@YT}F1wZRR8gs8S;*8K+W$lN@N0c$ZVkWYRkaDJoT` zXAUOhLsaUXgA|9Vl%CT;beKwAa~>s{Ad=%x;cl_QL558XBE-WDy8N;MpUg* z$DDFHUIedEYpQ+D5p<#|w9R>(XtGFHQm(|Qzcg)f&XM$A)oJAn{-;tiXK=PkjmTiC z2;NmBvmzFxImggBs?a-o5>2y0Q?q{>)v3_ve}d>-k&yM(WKJ}i68>XpwxywK=zP8d zTl*xOEaXvusgkD-BkSoER$G?6Q}Wq7efFERov4hz1QgQ<$ffQC`rFhSa-2;6XgGEODg(5kj8z>y)YIqqlk2+Wb z2aNy+W2e!L>QwdVG+)D2Ylv=AfgNd8A^Hj?EF-WZaBG1|?G3LIEmWzk0gfzEDcOL| zxLBpuhH|<^1aBVU6?-x*;cz3V3XKhGiI%98z){0(D)h$J5#6p*Py98ar6PGZ>NxL? zzm6@bK*yV}G##Hn_gZ)pCCrfQ0=(bCR%*556!0N|nEN{8Z(w_BRIozdOpVeD-^5a2 zRM6(=c~@GYsR#wV%BY7HSmn1c31=(6l&$=-RbEIdWjTJE=q*9qo6hbF*P*UW1ovO$ z^0u1f4aPevV1v;mVQ&$ocv`@+ynyIEjjw!%=zSHUT}11R_F|oAIM@~u%pg(j&(D)e29 zE9tg8{NBqFYT&(z!SD;C+(o9ZyG>=~)L+8h65|Yp=lj?WncnY&ZlgKU{nrzftLfO( zzHs#iSrJtqs(>1+97w~A<=bh5sYD#mgax6<9Vl`{g?29TaFyC{cC)1l$%c=xx{2g? zOQka)bu&`$rYemMX`A&CysF5MyNxJWP}>Dh!J2ib^SVfA!<8pdQo~V{Z;1#_=pJeocRwY1N|4PqBXG7EfwMINJC6!US({B| zXVTLeE}BBmSo6zidl|T&VO>=7b?CH4;OZDc(`~wz7&`EIDpY-rD}EI!zrY2*2>r)! zb71*9fM%OmKIAN?IVz-_FNx|!^6oWLncFm`h#CYr-hDJxEHsTimaa94aE;SVbe&1F zLO$BX#Vev_lLq>scDhFD=_{fagqj&B6Xt5l2wY7@u*0%bGs3WZQNu-F6TKvYcfaY~ zxT2X#YXl+72WYv}-8b0C3PYAPsPl{vJF_obJ*6*P1z$2smGH#~Tx%PM?lbxGNX3?I zg-Y!W-x9T})YkAF(fukV8@?xcL?kElplrpdwuk6VL0l7uX2MNHuxcVu`20G0%cfgN ze1C~*f53#R>FUPYF!uzs{`(REp?V?FM^^(#=(|Dr}rB5_EjC%Z31XS9? zG*l|>N22e9!MnOCHf(eG-llA+Mz{J&g{q&3Hj3aqq7z%?H2Ov3qnJ~EH3HY&Mxwt} zYR8)Wj|y!KKVv_lJF^bz^mD0yAsVPVv)HdHa7kAX4U!lLRlP)|DqvRK!k7s?N<~t4 zzoGfm3Jy3j;Tr7Ui~u7s%rGm|NcHbT4_cvV^dwqoEv}+<(x3kzdLm;HR*c|;9;1Zh z_$Se;+3`kjLXXoZiT{h}o9uWaIH4z~NZR3Vq9L-GgkyDZYzq~5un$)O3-gu|_MW6a zrG;Cn{=or{##f>g+o%vtxU{X&eu~a#ZJq)K()LEd*OYQlkR3!qY$!$DgSiPVc4>Ek z=n}Cy8+JlZ6Cc1*?IkY#BM&8UkAZ=VP=jr4Mu=gL_4A9=`;L8wT&(v zCX@&JcpK&>z0#$LCNW0vRW2Pag7<>iF`=Rlr79cWH0oeFQp4d&nj~Rl(n)PnLsz>r zSr|9aR2$}MMu|?c30o@1)2SMcPNCCGm`CJvI$eeKhHG3pL#4KcYh9Y6QnCT_MXgG$ z4Jg4mDm6Et2-B>D+lbe>bfHMzi!@g13wMkTrE^t3(Qq(L7Xih1iBeLGCe--m_R6mA zY#T-~c!JwWA|T*VuhA0rUZyV7&eaQucG37MY(;k!0hZUuW|3-}UAkCu<1RYYhB3>Q z4Wvtq7ok^Zfb`}Tm#)fEHDPvQAYE-$UzIL^lTVixWmE@c!cAp2XoM45Ydx6f(o(D2 zR8(ifPG}u2g1DR9=+X)`#TT_k;3gbM?GoX=CYPT;Rhal55C)+V6W@bI;7*Gpl_ykc zYnboSlPV<}ZgS}AKiT zuS)A+Fv66;S9aEQ=FT}GuNema$#-oYncusBSmHdw3>!FyLN zCgcC5h$^&VgF0LU*b2QzZTu#%+J!D1FA%*62gI3hY%3e)c3b4q3C0XsY_Urxs!(|g zMym?ZTU|QI2s{##E}g7Wd&3f!PEo0~VIa*>p_wmyuTrTIi|ExVq~o`_v_Pfy`0Xw| zviTKf@?782Ucc0(wLbIA?H78>LunGxYeS9~fhHVM;|G&!upJ=mls?2MmFOH@eV z`s5B3I^wwYxl<%q{8&@B!Qv`Iy-#QY&kDGNjNjqX^O~|Xey2+>sMH+4%cV}08slv) zy{J+memA70)K!0 zWir*SbZM|>W^cK_U<4=h6^(+!RQr%i!!q$nj6x9{Z05N@RQs??TM7z&Lwq}wY9DcF zlugl6hf_NvIH3*p(5}O!qcib!Hq0f#CgB)kJ@l=;s(cjVEKApft?tPZ!B-rU=nR|g zJG*|ba`6bYU6ZhWn=scLR=;UBovhz=B6#0tt>4paJg?v9X&CGG`4UFe_0Z8cr=r@& zT#5_hKkmzmKdh`gbG!4bg3~D`hj{&*$Td!*REE04KV_&U=6unBD^1^ zu7Pk<T)O<^`j$X9zSCWfOKE^qg zUJ-}^DR)+0wJN>34)Cp&*HuMst-N7Xexsow8Od^QN$#zDpi(2>9676q+qwS{=#B8UlkaGJs|qQ;qw$?cPX7~)Mh9#3S~kV7 zcGh#nkkfyfVQs9pt1y|Cps}0Pm~Av#S>t%sXl5HH7!Ak!og54XBuvE78O~9qUcP%W zO{E^bds3%TH{U%uSEV%HJ(;dj7w(>%r$UnNo?Io8_lM3k>-g@;1*+1?cTX-9$?^Ww zc1_h|@{e2kmrlbSd@JMN|cTd_x!qRk!8#b#@8}6PwpgKv;;6asIIfF-3 zYDNYfB6xG%MJ9tr+&x*P3W+(B=rI*~XHTQYRp^=h1h#!5A?r)s5t6#86?acwFx0!u zjT+eOKY?Dh37Z=IIM7;S6NWB#-uH;)HM(}2*vp6aKMTa2Eu}r!FaBoXRc=fw2u}o0pua4<+MQ`2 zAM;axo*pm|yZG?l6$!DSYg}`9|0MQSk`6V+hxhMTK@RV`jK$EkZU@rfev?ZB#RAXx z@8MKK1wNQIf;|BnWU`fm=~4-M*SQC>TjpSTurT=1LOGZouaX>0A7N5>^V~L*fDfjRRuw*&K1KyO zm_F9(-{@8weL0vuS#|he`V zy}%?ghtUg7n#C^0Di0AHMlUvLActuyLh2oPiOaqxtcN&Tunx>L-7^O2#3+H zYM2kB*NWiXYI?LBM!zNqSti|H~CyR=FeXNfw`2z6)ng=?ntg=6p~qf`xFjDT9J z!eR7dn*W&ZG54FyLQ7n8Qv8BT?`mE+DK=qlCQP~S*@SXZ{GnRGN%2P#_HHv1A!_qb z`dFjGb@YjZQJ~vhb5Pvr(zn7;ARH8%u+8K;Gp;~mH43eZx!UA*jLQcG5op1<;P2?_C=Ta3F8W$YQyk{k0e79!Oo4R%`_aF zLYr&2dOCR;u6oI(A{8ppyrn8cvFR@}0y~H!ufbMoN;^363XA03>DnVN{&~$7s^5kq zuc0Eq>APfQ!A*3W$O_|1oNB}9ZaA3Q&gh2P+)BBKTjSEMS*j+?MH)!ES=GDU5q_?U zS6r%8RUA-c!Z@HXVI-?YUpPaQAXJsp6b(mT#U+mscmt0kgIOYZ%iJ-jZ)jIerT+ z!>E=b{I)_k!ue-Yi%Az+VUw+MsWmH^37cd$XC+%;leLQvRQsAsOKh^HqSv#8{H<(+ z6T08sD4xB6iCwd(ds78&2Gr*=n+YFM-Xme}0k=jft!Wg_)$TRyL0gec;R&=t5L7}d z-KCPlTP}47vi?ARZ}KMk6?i)a$L@<*=eU2nJKD+f^Ozln*w`kqc$4FBjy;m|+9Vd= zHHmWUVR++hYLi&JRYcNGM66S7@-?0x3ldf$I@KUiCGumM<3VDU^wk^Q(I)ya#3pm} z$MCyimAuVfRq~r*kNh@bq1->8i>WHCrgiQJ8N4kWRO z1=m{O*rbgO(Q27>KXmDjpo`x@mwe<-<8z(Ap_H;p7;&+*Dqt}4J&QksR}3^0DhBgE z!EHUWC&Dmy^4{GH0xvQjyLeKZqdYeSqhP!ix(4|!HE2b{CocK&{;oiubR6GoP#HJ< zodM$j@~#J<@%*OR6aQUf_+pUs{1Dzm8Md*e&iUPxQ6+D(g~vf+n^?fRTI`@iaaCV( zTnqiQ5^2YEAkO6Me)}3oSc&w**FmB=;Q^W5$vav@0EPl_Cl9_Cw9B&J9PWiWey!Bpc=|aSY zZLI0}GeDwBq#geTi78pbHXXc$C$Wi5ym#_zj&%{6+9VclzY=SHeuGcU)~by3F(6?j zGM4uNi7JuyJpd%8L~5SjI+Rc%I`cu2N~HE~0!b;6+GqtyD-k<4gE*&VxAFpza1L1r z5>+De$s&+g4!H#+p+w4cD@ZbjBtcS22JzMT5|FedeZ2+mnU%hD8)Cz!W!Kg1AkiGM z6eOlZN^~DcLW$JFlORbYqVp6;N{N&x1(H@Gy^G(|Y%NJY8~_ql zBJEfP5>+C0wg!nQ5kL0^Nhpz48wZk9BIBYGB&9?w9}1FIB6f}hasF%l5j!V?gq29{ zb3md>q#kYti7AnCEdWUk@gCvx!W}7>MBrWO7aa+63EGR)q&$KqBT;(89B~q&uATcFUhg*Xrl!zyLf+Uql z+4llTDUlZ34>L2%oMm&DR0o5EmCWP)SQSWA$^3pG)gTE=`bsp^u2yFtHl_N~ zmzqGFv$Jzy5?1mx+nfgywWQA`-ZLdL&rOI;s{W7=^zQ;mZK8ju^X}JGiKKc4B&kF!Gf62C zJI{iom53cC&N()B>7Va`gp~}(?v6eJNm$ZXZ+L5-%*G!hHl_M?X3xr`ZvTrBC!WlyK%Q@4%dAH-Ei!oD}kw-Q7)j$voulL&w2(*3?cMR2G4OkDZ3$O<#a>AxSzB6zNLSNyToj~zf z2>pMVi!V;e*KR8(8j3NUy36La6hv~1Is@-R_#2mo6c72vEy9_P&9AJO^Lv?-4lYK1 zZy~e+r}xFh?;+HepR>ic?r*GhP~qn3TaEpN1ui!3-?=nyXc_HS{=K^uM2b4)JudI) zY5)B4A57?gBBz)uxL{ZCAKkz%1!EET$@L${@ABGWqkA;#k1yQ3S53<`wprBp!>) zblG-(#~+KTvmHaG3;x7ZREbQdAA-azDf!ubh%x5&RlD|yx z`J+fN+X+klcBQL51m@UoQSy(;v;!=>*koFg@JXetVy1c*`|6PmJqnhvdIgt*T;j{G zC}=`pt}l4buuFZTg9oZ}2eETJM1$k8&wiYf?}i?kvgPe_7w^WC86m>o{5jWFuIvE# z3rJBVGBPLfH-D5!1N;S&P$Ki1pRc!-?8a}~*$gCYNngI(*%{#_&SkpIS7zteI2R@2 z+dG_#5?NW7gCv!RxA%dhl!$K&K+;NN{#pp)oM-crUD{t<%}Qh*bf6PcvXT8~lCY%D zf4sXtC zzmXMIB6-aOi7JtjUIda*BJDd1B&kGJzS$rtB~tb|AkGY%mrMusAWJpH!B_)^nWLCQYy*R1^@^YUH=6T$+?=S;5Pp-uy zI2?(pEou8+=%kcLX*c4;BCSMpcEguVoQtdnLUsoU=a4->qB&$wkXQ~G1Cq!g{{czn zki9@sN~E;=f}|}exx!38B{(BUEw@urqp5)dz??fRyV5ZJwnbRkRlX58`Jw&6qLvkJ z12S+|{JGjk`xRoz8(Ua9Nh)ujLZ@_)g!V1O6eXM09?oKxsfdzme7xM!^*B6;X%^S| z_;87qf+aKyJ{Kyv&P4FL^pmRGWZ0cxDP_%u-369b)?ygHb>FdTXvy`y9?s|o*0c3c z{4?)zM4+N?#zUotI&Fq3LgHV0e)U zz5>IGP4HD1zQqLB!tkvoxUS!*(xeH#)^Bv_65sFa#OwXWl-_27Z}f|n-fn_#_Ny#i zYW#VtUsdTHCir&0>e4$+@ST3K(z{Hst6z;1X!H5=i~V>$YvAVibGMJa=r`nUUlqNd z@p?VHUS_iY0AAl?f*-=`We6De? zog?lytPL!zrk^bFoYIF(@HQ{M z^kEac-76}6!~~amWll+laqbgx(X zn6Y#pvU=PES0JmcWcalsrzcE@yWcA-eG;FNgwY4Quv5%-N}e*gJcL{lTF8{yuXTVW ztvBZ2^f}hjs+P&O1efqBC9>=f;7fibqEiau#BBqK&IpjOB_&Ur>1!TX!tQd-jhZDO zQB5b?o!ePQi42QnASorXtlkfjRwB902MITr{7arOxiL#>Zk2rGbR$SqwVpLv%u=c) zi(eO~Q?1pe)rR5X#j#o?&zVkB&W9AXKFtP|U(cMfDa|0~S2CxSNayBPGCK)dQ!)Vf z)yQEbvXS6dBS&)xzZyBAL~7+VTrs4S$ROuW0jHJ7)@u#tb+OG$+UZTsONrcCc$@Q5 zBDM4hNK%PR7GJWRON^Zg|26V6+~<8Xy@b18$qT+8hN5!M<11jR#5Y|!Ss@gWd!BsH zdwPkz&r^GA*f2V!(xYP|1@k2)o5Ong4#Q#L+t9H%&J0EjJ0-!vC- zN?!4u&hd4K4_{_2P6P4tz0#;NfPE^c$Ddby1r>p{zC3?L-Uz;dQ@hSbe+-a&RImBu z9@U?0W3I8mcZFYP1zTNpZ?Isis|Gdn*8r|*FF%1>Y`BMoyWD?EG;04%-!JUaGhE2a ztxN7O>r$CBfW0Ys%P2horL4cUHnE!Uc!m&pW=tia?hyFF(w- z{GmT6@~+Q`yyv6H`#v|a-sg*a;PXd5^aUax`GS$OFE8@3FF*2$uORZNuQ2kNuV3VI zUnug0Z?njkzRe@uJ}>f>uPE}huYcqlUvXrEuO#xVZ$RWb-@wTCzCn>5UuonAUs>cw z-{8nkz9Er~zAYj@`-Vn-@s&q@^$m;k`YIy7`NEOkeUZo?zTuHSeOpHU@{Nf6?b|By zk8flo;omxPv42$L68|=lx&Cb{9}rpW9~ZgBe_-TR|3Q(Ye|%(#|KP}N{>sSh{zD>5{f9>G z@E;br(?20{mw#fU&3}00ZvPRHW&WzjJ^mvj%l(rg_xg{D+~+?!vci8%q}_jPr$koyW0A-Fr$!$4pB8z-e|qFe z{~3{|{8Jn`z)1Nw8$LYnv_GGU^TSwAit*}(FZj8W)1gS(X@ZB5-zny^n|}X{;{G55 zIBD?~2o2l{f8O%bt?r;QTIiO(ZdO%10$ciqnco+?`K9)h=oS~pL`Nb)!3p^Dwtv8F z!`|_?4wzfs<=c5vmcxvb~V`W}- z`RD!@nB7=Y{)MqOzpngC|5|1@pI_eXf1g7OW|V(rQY@ZX{FvXr{~Cnd5#(^6LE1p$FOnH z94sM;DOd>D;~#Kr!BPZ%@DDsnP9}f!`?o57fD>iR59Z4#Yil5-9yy{HEbpGXlT({rQ1H);n0>|a>pMIL`74k2h zM`9{3r;~Z^cATyHO%T<;{B(IgJUE3%4=(3{GSY2w{`S)qTta87P_rogk&= z&^1P>r4CBhic;ZbV||=aB0wz?8JwG>;Feg*>H43phehAqHo~egPcq(m^8svf+9d%> zur|zc-U)6XXOveb`OOWG94*7KB1G14KI~YOrpsbeGy-Y>`B6Go5;}$b`OQRBduadz z#+aRXSzovgPiG599n|0{s71zN3zj8XY{S)81SrWq!tm(E04=fMQCQ?|Gwv1tDehev zpcxFfN><^;3P!P|E=n^+udpO3dRGPLZtF}PoU!4iGB_h)WK;xamf7Ov!=X`= zTN<@j2dG^Q;6V`$*IZ*c41`fX_ge#H*9PbTHFjNqR!WT*4(t+dngZ03WlY00&6ZnZ zkE*ej0IgDE*9YivTOG~~0eZq19wd9x+Iazb#u#oYf|nA8F>cmp*??16y1jUCV}LrX zB0q|zVF%@wuv1v}r?ley0Id;4-`p+-H7vr&;M{eN=~u7JgPKz~*yMjxfL_naU&1#3 zH%$IRt`W1X0qQb}Ep>2I!!=uEg0Y*e3i=5@jq|RpfHCO5@AKjSyQ3Eb=p!5EzL7R< zzD1*yabbYI$jZZpo5~hh4g=h!ztoyt9H4IFu(mJZm_tN9zCX0DddTWy7YD z8^8$soFr+M~p!Dz{F+}4Z~q$cv*movke=;8ZOB; zJTTkvAY(YvXSh@i4{w#p^PT_=%{FWVYq&hya5&rWa53y`vt<;er)kRrw5?jnN9l~< zY%}6OiM}^L+i7$e#zjUb!oV=RyN;lJrf6>- zoZG=u{R06yi<}$K`rE8S)==ssy!TDaJKH*;Z5N3{4+iiS25tY9DsXMW;srMU?f9p< z_+@B-W@YPUgqnvn1_@(GINK)Neo+A@d?Y{@Yr+^Z$q3a)*f7#nbp+@VQv|+Ddo(}` zOkMEP&8q^mNaDO5q%`PqK$n_qyd6{A4S7%@RgjeDEb%4z4UJl@^Jm(;lv)$Mf{?fEH0oq&cAVU?;obRowWebS*G1*~j z7Nz~%jl7}WexIrQWMl0s0h-9xYbM}dYdr?*M~HQA-=)w+hShjA#3YyJ8pqo&ZCDlR z>3CC(PAIw?Al1Gapnh_rf?q)Uu+Iuk#r~!p*P=(5cI4i^jwP<1&3x$A(9TF{n$jn9 z;eGM+jk^wePnoXp80@$1V9ZWBUA>NF(&Y;+3u13zt#r3!4W7B)4B&l;qj@$v;Ar;T zH#fxtEg*+-=#S&Zi0f|!$jf#;BRErRgcCY2CaQ0v(^=J)nebbMrlNN=hJU<(Y8>Db zx3SlqNP{Ga6FTS&G13*F9kY$7&{XuU##kdeWf>W5j8u#_ufKW^Jy~MWgmp+aRHD&f zHORc&rjx-u%*TVlJ9sR2L-{pGSk7_#uYxxKm18L)HG*(-0u47|9y_b>Vph3Kl`f56 z^=~EDuSgcEtdXL;AE4c{i;@xWn;{K1mBBqD@UJ!C-X2=4{E4)uDOTtZj2LvI^#K~2 zZ7?I$eUKGX^PvjxnLF)1THtCdyZhPFG>yhv=f#+JXtgP86^gXKDH3)@DA577M4`h> zH~uIDI5&4%&xX#n3ln!uxiS9}bb={`GX zQoOQYj9lQeW8_U9BUj59krDP8);_uO326kL@I1 z1?Ur>oIYT>JZ30A+FSc|fDR0xvU~A?2!v!w;;P@E5^AiQz75d$fNXz#b3el?eGU!q zQ3ImZ({}-yV5A_XCbYx%0XjSzjP60-3+%I7{>PYJX`+i@z6Gbaf@2WV10JH~Uz1cdGMUlXNc z@_CU!Q;ovvaY8m#R=`Q1?mmp_4Hh`sL3vN)=1L#Fmgv4*SYWg?5C}@c9L9O7#iCI z_#y?>z#uv!SB_1wvUg%Ta)ikgVP@Dazn4fgIzyklDZo#uc_;Vv$pr!1Cr>eb^3MP*vniLEJWQXw zN6dJ!tUlQ;CG}42>y!5zW8P_5eexlxIri;z(XUkCZkE)IEss%z-84SAfscgn3A6ZdS&+`v##=|12k~JL zxuE7Dazzjy2C;3KB3w4kFq-yS4j0_Bf}`ibkO8sAAU^RS2QE9DIZCF@D}y+?=gy79 z#rda0*V*B$G)6nVpAp1M)@{_*62%=Klfu^dGQVM?f%$b*zV!JW&fX})`|2R=l#edh z%HHf`Qej!cH5nvM=1qN*=MvxCCSI3zk-4M)n_R)cxd|TS*92*w{5^2d#jeyESFR1> zP4d>2h`KTZ=_C2$STA%AUm;QLbwRqyR5(0sQUNPL%?!HQR1NmCSRJno%IauNfSOHZ zW5&A}=bWY=;Yb8G{BDq{c0$v-kqKTi7sNMDWZpOCGeS*^#_(=r1}(68HH}*6qlGGz zA>+lGF~9QpR{NW!Y)t7qVwDW++fM$Zq@ zy()}CUiSsf0YMXcaeu}OWc;9d5yINP(sU>6V6pT+BmzDmF;rZ-DM(LbyJQ4YyH9Ff z;rH++T+!m4Piv5#4%ToFT4o(+D?egY=5A$bAG2W+e2EMw&sd8k@nn zy?j=;f;v@C5{f}08=!GIIGXtf-%+!mxgjqhjy z|Ls{)qyO1}jYEYb{7Zv0#*_tHAm1eVj|$zsJA$;gDH#@KAFAojAnlviF<+`O?K^|^ zvqhcT<%`n6ny|yS1s$tGyAS8G)y4`|Vjn8#cuD2WD&wsXS`O-mt9mD^SE+i6)sGZ) z6m51wI@eu6`Yls5Lc16VmKu3F`rVic&h6pe)fS{b^PV#v_d0k*jHGlb=1i6*zB@=? zXPOwgU+4YGx^BxUn1sHS`gcP0f66dfhACS1Q@q20DI=f<$&ojv#S8LzPIh*Pn;rE% zL40F@ubB~bww>IXknU_T;)EKi(biPEJV;-u*>;TWKBJ+n-D*pK1HA_^QL4140W-=HHQC&-GDvO44gP-JLqWXGpT}PRUr{31=WmBD7XsO- zm`gMHH$b%y2kBzzIb1|k$i>>U)i_MM)bucv5#22#RHC$Z%41WS-%mlHp71BR2L`F*4C3gQDKs_h8U&!%y)vY>4h(0Wz4s3G?k5|0u2{M@r4R@&k0?P({VQVL=Zm@%rck}V9=~e05&^RF#q_rv>eE_Y~F;ayA^O_11VCQuaye1r3i|xbE z%ic759#lj#rRB=>=^(yOAQi#u8(KRfb-I)Kgp@nT3YaH4T-5Y1Q)XNSxnrq9g{1pT zkhU{Y5If=EmV9q@`vTcX@~OnLLE6hy5Ece^H8yMo-C_9Wo4b*o3)1)k9_3z(d7-?q z5Qc><#e(BqZ(qqgx79_x@2J@}ySV2$TI}LAQSyZcSnS1__r7A@!FNA+BLc_=;Rg%s zFT=_=_e&9`gZXD}gU@F_z(0qIdgxj<;h%Xh`z7#_Z z8Uby^Yxs%AMNDY8d2*Wk*2%jGr&Q7;QIz2fQ9z5dQbM}Oi$T1wKg(Q3sKzZ1BfxeQ zY@eU8jW^w0Aht1Abzu3QV=}s#R_c~u3yRyy!i^4O+aQv+Kn566$p=#|u`PoWW%S*- zrtiYFg%p-`u$UBT_+B?|kn#|mm zQC(R=_}wg_>^&9G)A&C1d&UXO->dk80``6(H^X`n_}eEFq~YEV;=2O2_s&FNG6El{ zWrUjb8pHGUV?p}ZR3Khn^8q%`HUqf^_*8}b4}S80yGKXpeOcs^V{x7Dpbu_d^Mt z!ZXk<@v&heTb_6K=rmAz}Wk$!Ai)?jTLbN|p)N46+=ZCN`EP zS`#h!%JJbEuEfH0WFh~;#am8~v+vl}d=;eQ3uR7qD(;n!m*K=Th+j*x9u`XYc90mr zheqUd4j1L+_{F11GHQkC+qK^WX$r5lcwC4ZYKmF$+sRyjZwS&ESzenka<3UnQ>=G5 zwsh%#k}KZoMCO#^TWqnj(wVSHH`O@x0NJ~ncpLIL;*|HGd5I~eX?z4_x^)!qaiTR+ z@!th$j@X2qneXA#Dk9)Z9Id8C>dGl@6XD|;c1`f@!(Gzuy7rxQi0r!dwR^379o>HI3kO0S_O;AE1nC-E^d=to zMsV=uj8RgIAA{7KiHAo{9O$b|0fo#?06$MMbFrl`74NzlCXcFXJy1t z?cYJ_uqosqE+f?7(IX?EtYMV(Q5_9s{{(533i*jVdfe8+YLZ_x)LxuNPiNcA2sM{z z3|b@xo6lG?E!A`L=vfu2(Dhe~0jNdsq}of;>17WSrI(Ew-w#LLYee#%vwJ&yR0AFI zRjZGunXq43TPS;N{=mi>>3^5z(YwY!UQ5xY8L17^r4i8mlK74kgA-LLzBqk^rs(3To`ZimtA~iX9adJ9g~Y5gS;s zqoT6v>ihlu&OMXC-RJ**pXYhsd_LdI>HYjpz4yArOefP{X`G1BY54p~qd_wXpBbC7 z3&okPuWdzqW0NM6Nx3uTbW7)*88(}ou1h9~-)o`ApV5+_=Hyd*KdK9luWvf3YMda7+9a@CCr=l3Hk9e- zg-zc)nco#|XFaa)%gg{x5|!r-dC_dvsYGYkq+~~XjofWaxgG7*(sWai>}dcS*EJE{ zT<5bNJ81)06gI`19S!L4`wnmg7uxcALs?FL<8bE5>u$^4BrgM>D(TU|S!_hUMX>3p&N zCa0Npiqm-cA8M7()MN36psJUJ&4he$MOz!h zyx(O~PL3w31v!?v zGACMhG6A~M=@?9x&ZDKBWLsLWZ!^y}XBmBI&!@N++$rsOfzx%&<7tM4PB&jZA#|$K zZJv8)*qr8c8|TvUFR;y*Pl(u~hUH=NcbD+yr|9FV5y5y@*j#SC(wM2*D>OA;@wY}U zjj>A}HX${V#*EKU;8?p%56uW)8hK7cH*LDeYrWKOw7O z9J8Jtp*G&&@68B}ZAI8zl`q2PUQvjgz+p3KygCytL0n_gIQR#){UwU~!sZt7Rg14% zoUiHly4Cp-8M4gv?{Q4uZr5ZI_(;NA?rMM=z+v-{TE%}1_8fIfZiUTNe6z`6MAUj5 zZyvS||7p%fmSEN;#}X^^`{RQQj?~*7YsFy9z zpUv5s@{HS*$=h|rj0bOsbhNVDgFUE4SAAY?eaOD ztYtLQo^l#OldAsB<#QZa^LpxJjjCS7eA{XyYh;v5u+qe&ThbHc(UG_Kryr$$(he3r?(mBEsDb|$`8E7CEz!{=Rg6!&vs zQ`l2V_r?&4V3eJHQ0-N6>dkTZOHN&We-8RQ1o?Om}AXlhBn z)sRYQ#Cy0@P9v3j+O$x72b#gEj-TbrajXRh}96lG-4a)Vw;3KDRr?)FF8W}#Lw~N!3+(($duXmN?cDNzVWVnmd;zv z_}X1|G>Gz^GLwK%57SG$pB%H&}d9R20jAYOmI_A9*<~x#sZvMPAVZI|7 z=r+%NGi+*|zm0R(I$iuc|80ACv0*NI!VS*Jy18$K`M6||hBb5F4)bwIsiJtNzsyQj z`5NHyYF1coi*c2FQLx1osE{0n^h*{$_qvnW#)h}Dc{+UP({;fu66-xdBi zr0NAWWwbsj>_Ux25+weGoR6xguRW??cAwo^M*a&Uqg( z5cYi6>N@6q%t+|M+&K4>u(`YE2i9)G+znxKpR-#x_tPxhnz^5a&Hc`9)!fh7#_74i z`rCNY7h&^$&o6^ePWm!zK2VqP{S`Z|%}2;xZ_O_9hgmcI4&>6H`Nl8ydGuO}cJ

    9bUr^`7I)CohVY9lYZWV?WZ9ZvZ*t}%ZK($}$FSkiv#}~3T*cf!J%Lji> z`X@qrw;i<$wpcSQ7k*D+-&N3T9AX2MEnLZ@X3~EhuLgn@UE-a})$(slhxY`uv6P`Rd zepklTUAX!_EPVyTi1Tn4Z{O?JiH9G;W_?edzF(j5u)aIk^?3Nk#<0F;feU7RPo~^_ zI%OvvJbq-J)=S3>E(CFn%4%4WcK9RBh+ekKaw;XB6P%(1i~9Y01-mlq4GP;;8n93+1g9GDqmFjP|KC2a*;W(m*mQecLk%Wp7I`Q4ZR^t{G~cy z|7Y05d&vdE9G36#URB(rLD!js7>)PRDP``0jvVItY!eLVrJLzPuJW68&*`VI*-`z5 z@VjHiZ-@rAW3O+e>El=KFX49&>zB`=EZjx}!_Q$;XUm1*XI7w=!C|C1&Xx*;C%LY- zxu)Y^#wGk-_8KQ0pFORXUUqel2Tr{>AiFb$nB0 zjcvg)1vw!otZV&Ew$;g=-Tc7tI)5+|Vwzot%wW!Qfz6l4IXYdmo9FVOwM8yT8|VIt zoa&|HQ2cs-qwS9C=HmZu=U+e9dXMwJTKunY{#VWY4cXF5<^W9mmik}Nhj@-WVye|Q zvys^&1GQItgTEU&;ltArGhPFr2A3Iv8*d%UP3-bOL(A*p-qHk{2a1RtaozE)%kS;=z7nXD*lD_fZdgW2V+t zc1JE}$ZF=r@Af-&BDY|EZjsqv4GZU3XPbKHmU_JROtkeD)4-KMt=rF-SLqe+}e!u^r z%H9QwLq(?2X8*LHltMqTbsV>ko6^D;MNF*=bF+Vb#MC+6M*o6{InL=e_!mY@z0*`WRCmE}fPP?8oYsCF$V3M2mk|8W&N7e~y=E`-H0B%fm2V{qw!Q?3PZdjR{O zKaJ#?hD#!R<}_FmHZKna8iZOcLhEZAKZ9C<`8F=Er(EB(Ld#NyJ3dDHsgOn}K4x*)f!cpvloHad6B zI$}PsP172T?B&f!vS zrkbA4uFG5%F}<8_vAH^8;#L>jKc?3g6a=EKlRIfw@5c z*v;N`5wlH!)TdYcn0^@4G+ZAsKLu5MUWAKI^$EdY~E45X5w6>kpC3Y+GZbbaKa#|5ZI;PAn zu9#NjAx(z3Vp^7WQ^f355Qxg9c{fMQP^at4yCq_VsV=@srzQlxIIqa;t-ihZ)Bc5Q zUt`#b;Q?w`c!llW^Yf^T16?eeV^qdLt}-^psEk8gWo(F18Hc*GuZ!_S&?uL$HL+VG z=CA_0G+D4LhN$_Ivs)UwEn@!S!t9KVG_`6Kf5w;72`Qu4vWOXH-P0i`hv~QTmaKx{ zhW)A-J^#o88HwW0>Zib@>|%$QvH}@f3vaYJSrJ1{k1w!OG_UX;YuXhXZ~p2My*PG9 z#3VE#FaDgroc2Oc9We&mnJ&5WV|OCAG6fQ4mek-9zcIQz!k3AqJ>qXe^g9k;T&CAW z?~0gKr&|+6YPLIE%xtGy6}=~7=Gat_rRV*=HmNJ4yr#p}m^b(Zf3V8>6%lhz z0j+AYe}4#7FpO{XA8(vjPUhg)#WmQvLp9m*EpBSLnl|cQd;WMIIp%1@I^O4>0&N& zjm=JcwQqM&xf07FTMgqc`N3`1PM;>Y)P>dI(*$pD$(Zlc1aERpa5K-O-J)ecxxMV4 zXl0`;uI{iAd4pfkeJb{kBYc}!rsWjdJ(_)y<&;`RQ@b-CEY?zDs{C-o+*=@T5%uz4 z^~+dY@FCiWS>?*RGlyWTP8v)O<^8nv%gKwZs2*X&D3CjLSkKR4w)v8VhHhPm1AtF8 zp!jQkvz0iTLytzxYtG5W5ObB+oo+*jCzd}bkQo%4p0D%7w4~;-h#6U^?SP?WWMQTq zu+wREM76l$d&KvTEKUkMHPejZEaZ0uJNl{3wXr@0U8WB@yrmb=s2F*!NN6bU&EWXB< zduy1DdnRI5>ZpchB%=8dI}&@vZ~9(u$@jAnzHzK87S>R)=R~J5g%;c#dtP+GOtVXb z#Lp@uD2c@)QGRhXv{EE15{2&~+ZtLEMN|wc45oCeqwMG&=!#)gl!^Gks*A7nJ8XS* z#)|lWvPzrB1Gy>E#@8Tdi*NaIg@A}RN9h*@g*pXfOqP%bsy{FOwqI-AY!EktoSSvx zW)JJe%YVl|QOov)2;Tw@DtWb`%B_wVRv9XJimT+M(lIY%HRvi?45X3+0~y4rWHZ+{6)4AsJNFRW=0U` zqRn#|)#hmk@%Q|}noG6>icFolD11qajBNpm?6{!R*%shBe3K1ajvZc(nC3z|r;4w0 zdsMROpQVAs*SkHcj(O!~cHx7^OL_Cq3wu;^)CJY>zJ4DUPmjGc`ZxVX7DN0~pO?i-m)V%Z@VnZ1*&sVzFWJ};o;eJ^FWZ7dUgf+KF|Vr2 z!gr-jA>;^Do@#o%FxW0xo%3$QyrDkgpZU9K%UiH2=RIcU*5l`5#ADKU>@w@v*Kj^p z=B$sHw}Y(8K=8TWp?&fFi22#&c7?QvjBc6vAWOH@eCTv!ORu*7;U16EBWC9=lk*L2$9_$P{OQAcv>nqsXgfM3?ximZ^#*_8U#KbkIKt<4X*XP6*;B2g z4SgbpI#r>KY>1e_y|p6f;=KJ~h|}XjsOGBS!>AFInXXzG)zHmB9q%-s-&AxYNkXHMA85e)D$&l&ISCpO8ZS=oJ zd|Mrl@`;SwNTKuz%3y;}f%*1z$JToKHxZNTtk?OJU?g}OGK1W=EKQtlwf`MUlRjE3 zJYnu{ikJd@>v8;Rf0%8LtNibI->VuH>Q+%$Q_#gj?0sDnEBzlLW=9vy3ZF*5a~~~U zipT#kV)l1-Oa09ebAYw80j)FtjF^cwq#$VjCnUHF`$GTch&je4YNJ1$mME>s|Ah&F zecdy|n@>L)rFp_S{*6D`y6O;DmCn_Caa9$#8uG2b8NqBC{>98%+Da|0sQd@2>Rb5 z<|wD@nm0dc%AIchypyBmSp9SmQhW2L6=CS3)E#{Z^@dCLB!cby#sN!IOo);x!4xTKb<)1%sDN}m!hS;6&8y}9^G-` z>@w%GBj@y}`Mdhmk{R-ozmv{uJECT$YXCDd4S;;kw29U||9YpM#NJv9H0 zrvAxcyK^v-49*F}Me#5GbF>uh_eS}cw0M#-%%!E>Xd`0!l1ofCTF;>ckLS|XZ&H^O z&x+iU=4Q2u|I0rFxg$lEOJvKP`>tGKyUP{l;#`XJZdaV0xfJKU&Sgg~an|d$wlyZk8`7ZY}!p+dz=?F>zv)<9-UFM z-X?p$?qo}wc-$ttaHOqq$xWBR{OKS&zu8MA6k`uou&>%GDLg`4Bb0g|3)Z@%F72@> zYTnYMO54bvAL`U&`SW?Rr3x;oHj(lf-71mt8QsbdGog%bMd$+OPht|e-rVtL6PfD_ zjp_qUdHm$iU&s;(=?GmMHJvVq`5{`)A{C8Zp*_iD(77aPE_Dgm=r4|%%d9SVsPj^K zP#@X7CAf9|Wl^)lIbP%cJ!-CUfv@&2kD9BUZk4Q!uhFRDr-ZJtsoCIP5j9uX_`SlU zt(BENCu+C!3C_0fC1p=Imz(8y<4K#c1-6`Qan3haM$K(~q8)UjC^e`-sPqsM%!O3l}E2zn#%|JZWh)UjAvJoiwnkqGofpW2^DshILKUc={cH{4;{kuZ@}|QWo;U+i<*eFr-{nN zWvioNmzv9X8oX~XdUu)KO-voe&kC_iC{kIUaHBSQ_LU_9<#Tor>Ge^wRVGr3)@r=` zbAl`_jhY=Y_9QB!Axl=xm6#wb9>Cu*+pX1j`R4^;-4Hc9W!q;oQr1?(6Vrj?8>43D zjN_ZKG+udN;pHz1jnJ~ZIcjzZ+%B4pTcQwoyU$W@iPhL6BGt^q&OeQYp^A<&c;YFdxnI~ho z7{eW`p_hMgXrvav9Z@sQWkfz8F)hf*c?D!-T9Cr?BBbz`e$pMi;!8rWvWhSbcScQV zUoj%1vvFLipOYXv&5z}nBl;HZNTjxKCa5!S$l}mAZH~(sD*DQHjz@&g+b>qI6!Hk< zc?|@+4f4Ry^XidCsE?enC;dWSz1W_AX=pbM=`N;BHuVzP-A+ft-ssV=6SlY|G#co1 zo0}lCd!i=UZ^~lH(Pg0l8rlksT>R=kX*)*XgCHu^n&+)U)mnP@Momqo^oZVSm|Mx6 z@fks7>vif{joiz>JTzb9x-V+#UCLK*AfC}I;{oJAr~UH~)8KNUtExt)Tg)fjO_R+N z>kIQ>)HJ&scF3yXp{P0D=5WXrp_RIk_Hfj^E+xN$R|mZA3VxZtQjE3DA`yHhjBhx* zF8`4zy1-7S-fLW?bjUHMwnz#E((Z~N0 zl2>Gq&kNZa{iv_>6fTa0rt#wf3{mZ$*=mn>g{F7gbmn05jkWRemxNYhWf~rjn%S8e zVXwrgn<-VRkw$rlnG;lwUQs^5X{J%6f3tvYR}Rn!c#_RM1Zr$rYC_m%!LQM0ejkF)?Xw7+IZrruJO&qmFG{gP6b>@UgyJW_>) zv_k*6s2ODinJmZF`)0HYh&M*$m`VMlyT`8!4Uqa_%IEW{h~c)l;@5{dt?6V92njZiqJXmFFWO9G={=PYjS~4ZIA6IM^f0I&*NN&^*f9>`OCjCD4XY_ z=ECf4y45kQS-ek8Ip|9_hxC(64KGH``~9>p zA;sReVpA5tNU`_TFLq0%ls|B#yis~3ue$oMU!yJME}thjKeE=6>D5v5alaF+T_;8G zi7Vv!K9c`S)x~cKdA84VaM|%wHS^-PhJtrxZ04mvUs*%1;I`1Vl#gk6DaxmWWwa_@ z78KRXQM0X@$c%vwzwK7iN_eO`7(-v7EoAK9Fx?st$JWN%{SF&^)2mT)P~dpcfY-7# z1vt*wL|%6`UcsF~!rq9QgVksL^3ZOY)HP9aNG4*!vKlY{t{`D=M$I2G_9QH$@zy#U zui)+=__w0wP#gR`LGW)!%^x$~-*Fmm-xZ;045y~y-KZJI<@l5t~ z4xo<|A&7b!ZxAn&J${}sx;JQ9?=d^pcR4dLU*d1IJ$A+Sg~~KX>!N14ekoVR$@QX< zkkK^1-)+O2+p;tTABsjcrVt78FwR{XfLDBfXoHR(A0blp^Srd(Wjssww$tcV+q-tT zFN4CZx#m5!E9{Vd6ucUWRpolS3m{v$g#W&}Awv&@=4&~89Ocs&q)|3XZqN*&na*k2 z4gNgZCmMPE{|!O19@Lis@xFqnsnWNtVlP>((%0{zk*qo!&1yy?S*_Byu}W515mf8D zZMlvRs?}xL24+qA85V-6<>inW&Gb*j#vQhNmZh2WdDO(6&A2a|MrK;P_Nh;fR3!7E z74zt-8QrpZNW8u|!7Oa?yf2w@I$h_yucBr*r|X#ab=2(cbo1wJjG7@%w{Gq?NXnex zX5gB+-$u=7XSZtZcTqFN=~m9&6g5*bX_=ccN2^u*;ZVKyZ~MlVqMQwbXh!jsp;l|U zdG7a7Gu%3TB=iM#WM$*rACT=Xunlv6jGFz_2|gbUt+0+(&)pm~W36%gv5?(1TeNI0 z75Nt%3-<{4yruMmeW6RA`a;CU{BjkS9ZZb?Ett1yc?} z?`?U9=LTD63_@%jZphIwDEQ#aDI6B4EzPkDkvQz))O=^dXH+xuV`h^rhp-0TX-;?tG2U$0$<0@LulT9ZY$n&H;j|d<3e!Cw zy2)kSkJc1PH#uEwE|##LSW$>6jw-a@>CEo1zI8 zN7K%YnX5Gav>JJ{{Iwc#{JGF<5lD1N&cyYjVTI?5fpp75%+jDj$$Xi)A&Av0em+#M z(ViFM)jZOqh?-YZTQy-JwtrP~Z_gJ(yNT1L&X}onb&*3s)@ng|#V>{)Ab+M|QOum~ zDsDFIHlt}~cQf#K-T)rIKV4f@e6`&^{G5U$VR=bh92A&|WTznNMBNo9A8};~m<8h}}5%QQqI9iHxra zaf%@oEDuzDs4n7fhMu#LpEs|7_mSIoO~==U3arZwbNK+rcP{94b1$KDyP((1T^uvt zYg#yh4&7|SSv|Lj*Z+zT*S{feht{b)yEJCn!?c#!>>0M}O912V*jW5U@~+w0_BD@Q z@w=hbTI`q62eMxZ`AX)^ffV~|Y7>7iG+2s&u3T=`>MH}K*vrg&YRwd2UFbuVjDL@r zN3sKZBoo+L8i5ULeP|pFRst(Ct6Tu@hi2=R^5rpeqYZ$$YM4CSXhUFS8{Wp;M{Y?#@+VCZ7y(_lEV}eDMb%x%O)s{t+{Sbf;GOQZwqHdDXIo zyMtQ9KMZ{+rAzxOGCKvk-9tVK$*oD#aAnLa?kggoOBAOvIq-&j99pW=lqHAf1*=T@y14be|zi{0povDL)dhKofv8|02w50~V@BbQ{75vW)J- zFfAjaTNmcdH5uL8Vb1e2x;0^DE*agcVeS!RbgRQ0OJ{V?g|Cfu>sE!Y%jh`Il`5in zE$n+H#Yl1<4;PtJbybXJWthDntMiIK3$4=HyFO+ns{<+6k*I^&SuGz(o!s|g35IH8 zh4!buhwLa-^Lc269`r1YnWts-vN)H~>gj%e$7TGBP=qNLQC*mOL(Dv*i?YHirBYZ0 z$@#&JG4pJ{E}OQF+yl|b7e3>BdQ%*Q7A)lc@N>ah?yHcztqViBRQ!S(#=j2XSImCt zL0(o{mtK5hNG{rAyqOEXuUMzwgzOR6f=%M|Rp<2Ekj`VNMKONUy8SMYA`8C2|61!b zzA3cO#=il>w*vpf-ut!lJ#XMmv4Z@2V!;<1^H;%ATN18$4uH)pvwUcU(x$+B4fN&djwV+8}-P5(P$ zuMZ;1S$w(j&e(gRoXvYDm&fMdf8ZSB_rEK4iYQMoIsNaB$@R*Ce=`v;x(cWF#I`9O zxFVJ_aER%DZ|ov*winroK8)Rcv2BZ^*JE^ltf*K`9*E_%MeoJr!Ps`i(MM4{6w7Vz z{S=A=AC7s0a%U9%tTX-GTCZqj>`TmZ>mo(J_&c)Mn|mA|sQebA?H-8@$UU&=(O7>m zJ;*D1EGA2l+=C-Uk6S;7;Bs3m53(O|?9TtjVz1vpSUeFk)&9UIVgtn^MceuJWUTn;Z99s~ik{Lp-V~4bidMyBMqNB1QuMS{O)MyS zMqg}GJZV7Dv)0{FgNmNBw&lAOJ#SSN!-`(8wv!JidNKB?gfeAh(dyWHL{vO=zSsLh z6g$2Y>-`142fiE|kTa;c=#|*8i#%^ovsd(Lpo$c|7L)oI)Lc;XdZ6lE^oG{#pys|s zYhnkgkAC)hw{OOBcIhq^FUQ+%ZLD*LyNlk687^V%aJN_Vc5GW!6wz1T=q6%?(Dm8+_6(fYvefTH*Hg>*aIJ*en|KsBuB!$38%=%YY2sp#X_JoP)h z=#yB7s%nci#4b}+bJ3?UX+%5R-CFcnpqgFud907xo>=rn>}FNX_o6WrU&gjCj*8t^ zv3@1`M#HaTIXgyo#$;n`$6{@(-^BWrtK!?(PQ_6v!S7=Ij)<1xW>aiu+d{vO^*cKH zXH0&G?P5)SjP)D0-R4-quG<&=GbUeL-E~K==qIhcU3a1v$j3f^j_p<)U4*Y+V!IdX zS3mz1>o+EPH738t_OJ>2E!J;rNInRvANTaLJF)Nedl9Ge^GwPgI6rTIndSE%DZ`v$ z4%+`xonM$aw8<+qXXXTHlX3>V-N|_cd+rdVYtNm$qEqtvGn3zQXVN8wu^_MC)a_o) zJs@vF(L#O8O5Q}T=v1qklv8w?RUH*6I^C+u^NTvHs-mFi46B;lx9Ci(nlhm1EUTKj zZPD3Qb@ZU3bMmC^=S|zK=v;k+Ox`iWZ03S5Mt6V3v>?lT=PWg?{27wncfwY5Gr7&s zTW&V$8Eo&N2~_gbW?wavryqO&D2{Xbqmqke{qhjn=jEBkzFRe$y1vLv+3z*S@u}0! zJpI(^%)TT0FUpglz|{90*Z=&yQgP7GcT(0DR!4dvajR)Y!pclf)q}i{Y~xvJYrK$z zq83|wItS>zkgyK!E!+Ox0gUu?7SdZBcl(eX?n1Nkz&<@f15Y_|;Mem8w)8LPzs8Je0Yj%*#6zWjOHCL%c*r zU|!nik6XJiqFdoPG*GmB<#I105se&R4R+mHTvBg6JU=j!`0}@K)x){!nQ_%aT=g2^ zJgGLGr$I9s?d4^~k?~!aXQoJP#Yqld>bA)wRhsI)yQpcuOj;?Xt@@a}JaOQ8{d;Pr zL~{VS7|@Sm*_Cu}-9x<%>|>-XtlMoeA!`wC8-#+lqD&}x63TWNUucT|JA882F@{Z|oG$D_W=Ce08`)-i{0-$GU3#X>{w=IA< z%T_^H40u{mJtSa8^L|D=9J~wJ_PkNe&Go54RrSfn8H3tWE$O|VHvXuXw#5A`wRku~OlJr!iS5=#A z@e+wq<>jM}NmP{nsU$J^m`No(tDQ);%xL#g^@;XmeWKN?Yi!+b1i$r76psA!60NvM zwR(x>rgWWTEm^Ogs=T(wblr@`RJC^V4-ptgTSxqg~2{jUxm##`S+8ENB zo3xiEWvyOoQ!6Q|^IB80TfLUH#>P4lt&Z!esVA#Ux3-9JBW@CP_J?HFr)GQUrnVN+ zK=i4`wDUjQtH-(}m2RsifYz3T2Hu#OC57Nge$=44sWpMSWKCIG8!PT{p_S75-kl$5do6@Z{b+akC8QS=Vi^|iCd3DvZy{2YDPgSMpNpuprZDn0!Q*+?i zsvGJW)eXI=hC;+OzPy&Y8MQ%?dR2)O{gK9*_L|y|57cf;q8>?s)R7XU?zSTLXkAy$uytuGS(+U|NDBDTxSdveku^~zISL%QR3=c=Yo)d5 z|C+YODvF`5b&e-WTSHPnc&usUA8M;q=S`Kzd4LH87W~(k8a-)zwgX`mm`Hhu2klkJdJ)gG`ub!GxoMxNMWnGOtE;t`Y|&^o)enB9 zXRBI7dUJvXMb*<;MS9mDn}}B;uT0WnXt&;RF2b}%B{~U0<%Lb5O=xQatpI5xznXbT zm^AccgY?WmnGV`&OR_O7qk5vQp}D@UiUx~RXhRN3be zOs#vmjtqJ2bxq6}7-;G7t%zdEGo7lhkz`W=nA_%oaUcdXG%5A^25Y5VMp{!QCg(7_GfZiLxZW2(rBd* z*UL=IR!r55I+?_%V5E~VP)Z=U%L+pqk{FA;_>U1J8@*(mm-Ogg6i{_)Myk=HH6R-# z{3<4PNG?>tu+d%>n59u!v(`FI0$yz5>QjscnrJ#6{X)cUkYd}etEKyh@b;<@+Flg` z-b#1Oom^Li*aqTUg^zj{DI_7tuLdFtaVftN)Nu@`R_>y5B3BGE^3`dqbVX++Itofp z#FR#ac8mTf?*8k_?)I$B5-mMWrLB&y} zALK!I7-=bu?5>a2woWM-v26V>yL8|)({=+76p?L_*#Cz{X`4{uI6Je^A(!6QTvsp6 zOMk`ADOoBYdu0wdLqsBr3g#G8q^-_&nS&ziYU+~=(;60bRbC?9QbjhHX(WPatjI%8 z{#j${@PDy>N!1St($_MSiFIpTLyA>QB2coJX=_1%HA-*sYGo?j?lpO&si|?v*?{p@BAf@ZFTJ_kC~~>m6U;$F2lNA z9A&2~(a^@Ey0#^itVYRfKRf7uvuJ8g9^b~y{NFsVs3JwyddrdtM2=00O`0p`z#+qJ zqa?#RQJu?zrc_O;+B3;SU;Up_>CAtZNN1d#>kvSxrN2O}3_- zmq0^J1m-g0v5@vE#Fed3DSKMGl@A)8h+!28VkMgH>98~Do)S9~H!XJhU^Z=k5;N+X zm@#-II$y3}R7$brsU{)vKS-@rCRwt|)G$>&18eyoSX-sDwjoWBu0f%-k}n&St|07W ztF?}`QmgjpRBMuLgQS;E*4NpYc0+ShORLOa#CwgbWKn8W22%hXkaV^Ym{Pb^G(8zH znZ>m=6QEUAH?>tFb!>`CNH8nYCT1?xEG^}KODdRd%u4B`T?1t*CAH;d81&{w3R_y% z?~Isc{JWVZ?sqQJ-dJ7SjIm+qU`p(jNtS#3B1>dhuhF1&o*CvDhqB_e2FxkzgYZhk zg%=p>5;!@hz9~uW=&Lj^=5sRC{4T^=I_d9>=oV#V;}c^`4jVP4Y;t1!#IYr1YBIH? zyrOjC1XYikRGOGlUgqg!OT>?+EhBWSXrZJk*+sFUQ3g_0sI;!uN>*VlERPT%Of|h3 z>=*=2MUv`{NhK0LFiW>mld_8vn5Aoz!}r}UG1F@!#C?X-Z8IA%BIogi5O(rdw_=#` zN~@B%u$`Hzs!GmGFcs_8wA40b>k#P#r5iw*u)BAH#*p!n#Ka>#tC%vOV#=gR6U!%; zj7>}`pE!Bqn2BY9)nTJb%P=jSP&(N;E-y=rA60hP#Pac@oY{nllM|z-lv38E69Q*r zCQd0EJ7IF7yrg1c+0+sVciJ)kh26M`6)q&_ZOp_86H3N7)1ymD%f}`vO3JA~LY!3Q zLMksAKXGzNV$_&1B^4D^_=M7uu`cD4C#m_Q$qAc@EOQ&)q*3_E4(+gRFOy5hmrR`E z;unjIpQ-=m$65^^zJFqiQW0NcMo|WbmrPD%<#F8P$&-d>rN-sC0%x+97g$XiRX(|N zR9WIMYT!S(E-#r}o^3aAGzDEUxn%gT!0}O2q-aXY%O{oxCK54;pFE{}0(F{gb98y> z@7!jB8xeS(GO29hsIgm?WqAoE+2K%RiHV0L##1fju8t;7Dk&c|nQoVmLLJ*(s+lMb z%*viL!!0AxVhmc-l!_8EkZCP0gne9bmXDfn_8z+IO9V}93-i(BXY9nI zCumlQXv+9Z(Nha}agAC^qPt$o#*Wge)_zbr!8JiOt|%E*K4#pOS#s$f;p*zJDHFzM z5lIM#O`MVmV$^8cEk_?iQz|PPJ!*{Ww35_}w^8MXlhg^Wy=KC9l~+1pa!L7NqsEl{ z7wOn9sDa57C(^km977?GEiI=5R=C=qaO4EaB{6Z5Br`Ci!J-e$5*5cxm^^A)VC7P< zughV^VDG@i;pCLujw_vTxC@R-DVcD1>4Xxo$Swt`uE2&kx9H9lB@?!6f~0!t7Im75 zdH<|<#*~y#MkI|cD;b|{S~_W5iR&$sN)R@I{6p@P9#%R=n{l>#O0?V+x>N{lYBJS8 zV#iDz+nqC)g#BDQmA0dM_a)QDl$4Ck2rX&flG%UHqL@%CM|ZcbtU?j-yoHyti4^0O z@^G^Bqu-UQn$bO783f{VY-z=jw5>8X2&l8tva*uHM{Qv=#Wspk*WLr~lDS05w9<-9 z>j~nnm@;M@Idlc=N@f3jgCflsxaO$cRLeL)>1K7f?3jMvWhyGhWmQqdxG9sRM{ilA zqYfXH8L2c92DL3?5Yy6%iYc^#Yyl^QI0+HDWpL$_E9n0fB}Z-HR!u7ym_+vdJ`nA` zQcz`-Q;=RtX95MULvCO+VWN{$63D2j*o~smW@T_vDI?|BNmE82S#k_T!Js@QJO8B< zrj9Br9V_j$V)CfTQ(TAEK`2o%84=!H`%DKaN*SzWZY1I+h-TE3$>X-jfOy^~usmu? z=@^&BEgWT!_*%wgrF4y~4l`u}eRU#TOLCN$G%*vONTD)Bn$0FkN=T+NtogF%N_rAj zQeVdIq*q(rBD13zte~04+KGKh{W#`^OwAjTGwRq(PSw~+T}l0Trn;Pbu*EOCOlcNr znVFbX?!8}jMCn?l@PVTPut+BpHOYp$`Z=O@E6vQxGcb@zEB2WcX`mm+B6@UNji-${ zkx1KLX5Jj?&GLecfkch$E+i^zn4MPENPr$|lct$<@>}1;*$P`?GVNt8HWPnrabwh0 z$)ajD+aD+it*w%15{>%59;?dwnKq=Rnwm6|Qx{%pB;Yn0AoLgn59QUeq6Urdf z({yovGzS`~mQixnQ0>()T@OwigSCpxfLV@HJp@4jT734bQL7L8mK3XJ_F9?YQ_5Ke zDUOz8`PW+CDBC7hO*JN~^*BM2jq6!0Y>$dHYJRHQngbOj)>uVylI>n4ySW}^V4a9Z zTqaV->yO6EF(xNBa_CXRnwtL{rPQ;nAkG@A1KV^Pmi$vo*$58;l4-fP3?d}Ovbl_j zn#$UYS-m(&v%}1}82L({;C$Fkb@uQj=t?zhNpaSULs{Lmv$ktj6$-Du#^W4QmK_98 zO}p1~YL;7V9I8kRMAp{aOq&lh^-Z&!hVwuvfMlf{WU!GrTYuQIM5jA;sRj-b?H)QC z+D&raU@h1H_vkTBE7=tfdf2Q!Wp_(X0W?T8Ns?3lJ%Hdb_A!^EF(FC-~@=^SVyO%JLu+!#HotvCa)pYTH8b< z(#gb!9D{o;w5ygDX;iET)g}EW@FOaA2ic^TfA$o?g{mzs6G{-8=E$jabuU@Wg!(%_ zvOT9!=m|!$jTWpbJ*^OJ5PXmUvW1+;#7|pMIYV=5cKeKKS=}VK5YV$U)j%6%wYE9fhn~qm|2TfW*X#ido6#(#F=k_hT}cR}az6al&krav4K34Ku5`29Qp+vw0+Y8gj}byTf~X zwZpyky*E)nNsd0{2vVJ}Jx|#mM-FJMdWpdv?x>}$!Md6`nLKA% zO1}=O*g2MiyfkT2eGNi~-4IUJpbC-tmi9nHPk=tQj zLz~2+W3CN>Vy#W2k4K)VimPOSqS5}Q8FbX9ii<(2U<*$|(6KYo#I&T+<2IF=r8$m9 zm0}WN=OHp*k_}<;pla=qqHE@uLho$Ms;ibs48kEWX7Hu2I5+kxhv-}zpyjb;%%!R3 zdKpt?5ObnONjO6Ktv9!aeq6+a|-x*Mz-Q=aNQR=_(l=2N*SN+$U+B;moA(YnId5SwJYN zVYWxwyiS&EY*Z|ka%syRW@Pzp(zD80h}0^3?JfvKWvv8D{&c1n6rY#`o8>{+sbmZ1 zpG@kx@=#yL8MXZ9xL?{WO++t|)F$QLS&A8g%Zgs~lkmA)WEUv>WGtB^NW4s+IkTRV z$Q-XA0==1;A|m)kxlk4)S>~FF;CRQTO^TaSy7({}MIb)d! zF`=O!F=u8RlpA@Bjl?52I~uA*#LGPF$ zMcl-ts~KJsJNa1&+@d($p^#T8i=^&@Bdf1%YGwwSN^;wXeolcRV)-A`NKK1ZBa;uW zMvqx)WEwuUWXz~zWJ*N8!)p+iT&0{Pq3f@Pnrar&T0v;`_)aVjlRhq|UFxFTUaJg} zE^`Hs`HahnTu#vTB16{}rdkWxrh3YwbGO3Ti4#l398_Z&e67m3>k!PLW_H z&P}l@xf04WDyzA<`m_;i0ZGSnJu=a*Wy=qePyc0Fw~T0M>&+eA1?@f1Y8ORv>Cu~9 z@}x}!Rx&pK&PG@KRgKO?TGnfU6Mm)1Hl$~0`c*!rxhGRA^Cg`SsY2`-14SmW<4~{j zY!@6$BCd33dC9-v0!y%*bBU5Oc^Q5r)Z=BEnI_jvRatyVt7dU;4>IZH36_o8#JN93 z(xh0ekV62-43BFTOor{X)+pmV z>8U00%jJPoy9>*Qb=4Cw*PHMXPlpe-u7rY?9{tGTyK>- zgUs`qZK1R=5B0Cc0h2hCrQ8y~Ruy#B$L^j%V?rQ($`!v^lsA$`peM zI2VO+!X+~obs{~7)greI^+$$(NrFW0)KW*-2B`@amvUa~7LD8wv6l!M8@hu{a_g&= zO}`*`&5ylf(#oW54tIu#ggDq#;o=F`plYPG6N}vXv)8+|Em1*aNX4seVj$%0dXm3UZbjC;ZEK~~SvQqo;4 zO_N<{GW%9vvq?O~ory4506IrvZf|!<^iq*3@Wm_TUsv5s^OR-3bP}t=ltrNQTTPnG z2}l?oJ*KM?oD6b^a^}L^m5@cDT)*6J1O|*{YG_x&;!Rq0nu6fggWOc)Mqpji6USm{ zb)piJ1}^=}DvhW$8f|MVGidd+Je@VOh5(I_x!S1U8jk-uqCu_Ld;ZFLcbIXX^Li@%;aO$rM z?*zHEJENKXt-zZ7Fg9kHdfPh!avMu)hgk;KR5WH=Te{G;j_g{V{RetVw>R!gq^T%x zCX*Cdcc^&FawHReU0Txc^_M3YWa%(dZY*(cF)KJ5!4^4IA-&%SX$8T>vA{amDCjPs zU}h`*gOQSzx}?0GepOk=1jPE1U;>ZiV4s9skC3d}VzYWzGTb#q3?47ShfdCx^$e=7 zje9ZXij=2s7wR0+47=~?3Sq8FQ zMLK5^CtJ28QtzfE*cD{sN_L)*CrnovZ|pXdY|tdCD!Hu1TtK$i8yiv$m0p{!Wz~r+ zw57c;-FN)#6~^k-Zcd6)ZxV_^Hv&cBwxEJbuiX0;H^DAR z8o4Yx^g07zf`{moN|M8r+Tac~a}Soadcn6==6T}Wn$=cnh1RmiE-NJoL(?a_bS%+z zx)W?V$`nK7iQSB2iJwW9U7EDp^ooU!mpE>sD~MET)W@|Lf;o%OOmPv44YX>;w{(*I zVb*lriDw8t4{@R14}*=0?r6Et&0REhB`2jmbtLw^DhqjL!U@$~Lnp zX{EhOmt>>eR#Cf@Rg?Tf7;_v$Fl@!SX?12-j@@rrJZ1E{z0|E`nqA4@M_TM|hl~h1 zwAh-?5^>t{t6E+6mCkH$v1Pf@shZq{W=@%rjhU;vUMo9C!^K8UkGdlWZa&rQz2C55 zp52A1lgBiH1eiQIkCGfcaW!gQHQvh2msMXivMUwhD} zM!HiiX5vmwPDr&hi9{0{J>Lqf>`&kl3)#@7`1KUcT~N&!xqG8oXN6ftzq_|7j@S%O zHqy1IT*OT#r_NKbmrh6H2Cr;Yk!gg#2JEGuT&@S%L0_|J-HrmXKp z9_Z#iTNcR%X`mAikcmt<$|u}N2DnZ!6DTZ1|ym0#JQk+Uxim>;gFif)GeX$f32 zmtZ{PsXO(Wtziw)ZBtp-(psBspyfbtDmP_s9F;vrMQJlFk&$kG>bd&OIE3nWt0MC3 zI(J&;8G7qaCOX;nfnIZzZBCKdn|zE#S*=7aGg)YDmwi|Ef)kv7aA8r8 za>+uKOm(D|>~-mkNsznW*-0s2B+X`$Y`=5cl|qwEI|62It&JwQcr9A)BFhPKYlDp( z`ADxqSIZ-s^4n0&8ccqfP4Y8`mAL%Q3XJCjzjbLj;>2P`L#s3vR3`-Ig~2=rAwxWJ z;3G|k35EPfLrHm)czpm*6ni|F>>Wb zZEznv0nfwBuol+Cr|=#83L)Oal?U>!!htXdc7{D+UpNFt!Qn6wD&QDMKrI{x%`gj2 zf-~SExD=Mcy|5CVhF9S&co#ke`Qq}A;PGa*FciQxPz*c6U>FYj!WftU$HH`|g?2ar z=E3Q3E?fea!PT$~?uVyfEv$o&;49b&|Ab$GcN=-~y{Cb&1IU-8_lGfXEX;srI1%LS zbLYcFa3d^(r{HyXAASJCXDY(b4+g_%D1jqj5=@2Tp%rGqNpKo;!WD2AJOry@4ZIKk zgspfD)z+{rYzKp22iOCK!9g$?#I0ZW39Jl}$!xeBX+zNNYL+}*52y0*+ zY=Cd!Ul8MM2m@ey7zQKZuh0OqVIf=u*TL;@4?F>{!e{UU^vI{b!7w-w#=;~>K{L#O zli_T*0+zsSupCyx6YvbY3U9-D_#D25BX|MT6gUR{0)K_+&;;{g0bBrA1K*VQo`jd+ zUHA+(!7pHV7fcxP!o_eITnl%@)9@OsgAMR4{0On$q#K67 zflvbFPziJ3Bsdw)fOB98+y#%oGw=p{1Yf{6@ICmv#-jj=U>7(LM#Hht1PkC|xC5St z58xN*-;-$n!7v)iVHzZ$ z5}Kh6PK0@|5YC26;3~KU?t%N^A$S&6!>h0kK8DZWYxowvht2RCgm}YL6ymTg><+`> zKo|*!!xWef_0R-=gOlMLxB#w#>)=*c4)?(-cm>{tb?_N{4?n?gkUNMz0NcS(7!Lcw zA7KER zz+$)xZh>X+FuVY7!x!*9`~tC^m=D1K*a3Ee-C-zc*x6kn+Iobg12M56@D21b-8PYHx&VX~F3$B6Xa4$Rx&%pDr8aBbN&|@g= z0Cs`Fun+79BcT)~!c<7W@o*BH3Kzqba2?zN%V0U&56{Az@DY3ozd?K$^8wfq_JEy?%e1@`;2gLZu7vC1CU_8@fw$ok_!2gO*@w9eYzMo*?l2gJ!5`spmLsh4t_?{02P^pnpRj*ail}p)dx@U>Zz^na~O+!D-M5i{VPR0q%q+ zVKsaJ-$RcBk$W&0hQom{3QAx+Ooi!C2Q6?SoCb^F?{GET40po4@EAM?uff~!0el7D z!B5~Hgq(ujur&;V-C$oB4HIEH)ItlK1gF6{a0x7d>)~!#2~WWr@E&Z0AE3v~#2%8~t2;&v>hyU?Q8~+;~ z|0ge&9Limmq1-mAZ>vrX<#x+ZJwr+VuY;2Jfc-a;{{P~wng93qYI2UF?=9F%o@L2? z3FrUiB{sY|C-aOTer*Ye!X93r`X9Wp^WO_LIA!}^2loF>4gIf^AxEeG>p+33cRHt#MHo5=)t5vtCDBcjmk>~%fFHHJxHBFAk+~KU8ZKkDFI)mW#LfJ-ge3obx z6ZcfAQ_Cr!sO9vHU#UE`l0G9Riq4%pzKU9ool|O<^~9>U2_9M%r37U?@|KdiCNUx~ z9@7-n#EQ{8CNz;l)E2bz#DbUx2k0p48bzNu01q^JjBcZKhumW0ax6CXG+0daOcaG2 z+KJwtfr=_P1{I~Abc#YxH$~wNI7O|8nxb&0n1MRe@zph_m6$Vcm$@y!KDfXB2HB3m zQ5Zy^tZeG|VZ1q5?9Z=b{=jbtav==zmk0UK6M92m=m+vQ00zP~qT!G2Cy#9xZxF~I z%X*Kct|!YwmR_8C%}m?7v{q$un|Z-e};gZJS>_yoR$ui+cm1pkCz;5U#4U?2qYmlOQ<;5Q6> z?AXf-%;Zd2{^I<~+45GfH4FszHwd+yH}492z+e~#BVb>Uzy0_<01k#j;g2v9E`Mnmdhox{M+zhwD?QjR&4f1ynzxTld@E|+{ zkHJ&03Z4b|dyd~1;gvxD8oz5m&fVXEb?_m41RujEumL`YuV5p513$n&LC)xZ1A{Ec zfn11yoZ07toZH8t56Jnw{PpK|Ybb*4pcn>$``ZEaj`05!btZ5E*vP2D8BV@_QnkBMtEw=2TGT9ZfWGAwXrL6zwIp;sGpV#Z% zr*rSQ_nz%;=XtKE^VbE``uUH4^S%K%_33l+wx;<@sf#FkKSF0ezJJb zhE}H!_LyJr;L)EMm&*!2ww&(&HvCmBi^Z1yvzJ#Jwd+%qmush2VqEO$WkutTW)3=-G`08gwsmf`w>DchHz~Yf zynS(?I5KS8%0IqNIcgnW^Ua%oCmGf}7;kCRVqvR}0~a`ypOMtAcjxSMr&#l>sO4|n z8lJ0je9HJA#SfOY@|hJ{#r?(YYrSoDY0qBOo@r@+Hht2tPAQ8nm$};1ox8)K%av|5 zqE~zQ&c5^H#E-m@-b2k#ju=(T_v?(ij#jo-p%G(-3|f?!yuA43CbJ1eA#rhbFD6(S z3S6sLm>z7oUhfy_GA`D%cHQxd3aT`3JNRr?@W{Q{p|MUmapoCam$?K4UrQPn`@p^0 zfnGnZAH3DCe5J{+GyL8zFZ^oLboae=RsYPqy3?uqj>&-?S{@uZJgidrdR8yYcMScz zUiXlvK6fIIRz6#h7cjjfZJ0w9xBl@dH*N+RZwqtWJoveP#m7Di$DUqeKh!6s@ZjS3 zmA}~9%xhgz{)KVx4t_~}esryJAZ_^iFCG_cI^-GRT2!eK@odlesMHEI=j>={SkUo{ zgMsDKb#97A-Nr^h~bIlc}-k)`|zjwJ-eyfkQ zM*x<8efjv}9hdu`zuK-b4s2OsQQ-a2qeVe)4m z%je18(^CFzR`Tn-ppN$8$vNd}89c(KuZ}WHTCp+odBnTP6&E&(yw&YxwM4&H{l1j? z`v#@v9*PPtoLIk=L+t%$%{N{!nY%TzzjpfXW|q54x3!p%SF`O}_pqL`i=JN`7PF)J zwq}#xp0@wdcwxP@h6t4B-Q&<74%aS?j*C0A*lcgYfIeTAOf6Rh@j> z>K~XD7i(JBe??UNfwwLknpM}sztD2X=+_pL7JWQF^W^n9`xmY9crpIMkNy3&Z~Gim zWqnkaibqPLJwxWS>@;%DBQ1XM^}W+g=S1%AT#_|Acv@=fMM-zfm$$3dJ>S1uMXQB7 zn^Zh*J=(r_SWxms9LM*0!qo6G!|R|=?W&jN|I)8v=7snzhY}N><@UI!`@46=TgHjr&SR>a}F2k9)5@z@p@W(#Y%zS9dcrpE-q^k-LFSQf2-y1FWZOCGEMH^aQo@S zmmMy@G+Ef}T+pS$sGxIBgY?C2nLVnH^Gy6*9NW~)*?Dz&&$L&|0ygw;35mQueCxCD z6Sux~yw$VvZ=VNWs!@ETB>!{4h^Zd;qN;wdHN?G-4VazX<3}ain8+{QNJMwY@s~&9C1!rqA)!cWU@<{cxwoORpYVT~-C1om|JRrte7I?%7#~ zOyeGw+nD;TnMb!(mF)*zNH41MrkV52knn0P-cRT--eF?ZxS0b^G|ud}?wr$upZkAH zw>U5|`qz$85AJS#c*Df4e8iEB!#s~KOSzg>aq_nfSC$^EFm&@Elq2Fw+G?M~w@;6b z`)=*KJNl2eSwqq{w$HQc;p#>XcR#EcX4U=F z&3RAPMCXU)8}7Cbi#6TvKFYOKL`uKy8Pg+&JFbXwKR5Dcn#J9!PPZ=(GWq9q?@qBU z#R(^eT2`HznmhBDgL|oPYgVE!8+*IzANiBx7bhG!9AT_gczSKgqD4<`?@UaX8@6ZK zc9*|acDB5_VZ3+P$^COoE_Lx8QSo_Wad^jus-7{9IWxaRO}83xe5FI7{ov?FJ{ynx znS8KEhE2|i=ybi0$)#o`t{L_Iy;$(z)1dl>yg}nOGfRmHto^i;xqI3nrmgSsl5oBAd zU|X;BYBj#O)z&68o4aUzm!!0F$vHOL^E>aH+CJiaqlBnqzgQOc@8|o~>$G$0N8Rq{ zWadA*XH`|{jK!hb6N3`skxh<=Zdx7tNXq` zI6ZRO)h9V|&f^Zd3|m?!qIZXTu6J@m_n&v|(eQ}-gP%H`o>6{GaLn9@n-`BC>G=9{ z@Z`5+dNIZsTl3_S<*P0^D>uMT}Soa?4e zLhX-p;neM^>(gsP?+WMWIA2N6B7IKO!l`|8UYxoWwH|r|Ip0kUks3F(Ir=o|x1(o( znizF_&YjXr#<_RuAoRR&9+CbR&V^FPrFVdOEp>YO-sowec1{l&eNdd&rXPvkHtNUp zz0h+&4-vhW)T^ma(rZbN4)s=Qk({TeMn|6&y$GDAq+Uti7WGo<{M7sDsiMwC-x0M` z>i+Z+QiI|1FMXYpaf}y^c-O;n>Rp_Rrp`;Ea)WGNm3cxWqugtk- z`aY>iQcI(L&3S5i&FJ5vhRQj9&PP+Hk3pH}9ic8x-v~8J`Vgp_)8|DW5_MkcxYV<# zi&Gb---e-whrY_eG^`S40ovy^e*~4Auq~JKjSQHN3E3FDK&9= z2dR_NLq%6fV|0FeI>f`j#P}`;+MlFcC0ex1S`=@5^fjUz| z;e0l|kZ-ULdU80IO^+Yv-KlTVvqSF=H9C3-sISjLUh1#Z*Sex^oFAtbm-;ikWqhyc zi+WNcr4B?N9JOX@@bn(g-$h?uZmH6}_1B=~0`Y$A)?^{e09y=%JuzgdUvXC@(z()M%+cQ*WWKhkiclwe&Dj8=*It zdJlcK^k~wLNsVnJ>STuU)9X1Ak^V^PW%QoX^Guzcx);42^Z`+`p?*RiA$@q%G3hm> zj!a#O8r>Xh!}nHev;jSn)YU(uy!1d(pP<)>ei3Ra!PrNIO6XJUkDdd1E9oPoXO`Xq z`kkro&{sq)kGdm00@SwYZKQ5N-Hd(?`Uf&_O!_hCg`j7F`Zc|%)Ya&7p&x-78huCf zgVMu7&7XcsdXD*SP7Rm782VV~mFdf|jAhhp=pUkmq4RNU`oN5_ z&)Fy+eWvufG{JIuCFzZzuZ3Pa6sv z(mO|uv^vU9?=7`K`qStir;o=I<))@j|0TUO)Mn`mp})t-72^?k>5Zkoi~2eJ&%fiC zI@F6kQ|eA4n{^!!;Gl=mny` zm7Y4OQKC$vQD)AG(0f47JN?hpoT*V7P%rvO=xL*eDim!IVdOfVESsPW7DHX z?*e@<^oLUSr1zLwHZ@Xuap+N^hr|tKrKX*WeAJPt!{5Zdsm)R6qaT@GWqJ;Cy`ct64;8iRA{?9ETz>CBJ)1s7YPHmDseRJ(K)sdT)xM}J{g3n`Q*S+s zItOF_{8tX3x#YYpb|L3wQCtnxlXI?rAa(%VKrb*53>Z>R_=1I}sH0i3UD3|ay& z-~)U?UoZp&gVA6DmukPqQPvyZ&Q|mRbT^10ee6?$OLCVF1P}2g8Sep zC;=b9SD-WC{s^pq9dH27zzsA7ZGboE3i^Wp5CX=6iGbgz%ma(T3cznvHiI1?9b|$t zAQxN#H^F^S4BmlK@Za|;<`~Po=GX&%ui^~cKvU2Lc!RFM9}ED2U?dm^CV^-$8^nQS zU=`qXGzIJd=^zuF0lDA`xC!oqr=SFU0AGR580`YAfE{oE{C4Gc;0{^ zU@!;*qrjga63hm1U>V>&VgpD4dq6tK1ZO}lxB_m1``{@k0Uy9upu@>s9#{c8-~eg^ ze#hbtT7b5o6X*f@fZ-qvj0aNypBv|bMIZsJ0h_>fz-Nks;5ax7{sGs(ZSVj*2XDY9 z@EsU%9W@1&Ko#H!egiJR1GECXcXkGTU=SD%!oYYi1E4w;55hq zmq7vGv)2po7JLRjfDx|wX22R$1x~;Pv;8UQN5CnN4K9Iv@Cfi8_zskUpTHRRD05%~ z>_JW740tbX3fcf~&=vTD0U!{J1rtFOm<1Mqr63U`fvsRS;Pb;NkPR+@d~g>$27Cs3 z56S=q&T_y4`~s?hUx5qo0Ifhf!27Eo=m&;^5nv360Mo!sFdr-dE5UlO1?&Q;;0QPc zvcV;A2Rs6N=XeK7!B1d}8@4&H0rr6J8_vKDGzD#dH{dh9KNtW4!ALL;OajqhHi!eu zz&el&c7g-oFgOX$gNxt>xC0)6V(<=>0wX+wm;ufSR0U3;E^q}+Kx@z*bOAjUEFFxSm3ma76 z1Cc?zM{%%jqYBq;xK3E{p-6~oBW3XKC`0RL1ii5RRfaV+5p-gL+UFru#UM`OC&IVC zWjMbaL1>@&FebF}{Tal%x-yJ%mSMX(j$J>QIy00(JBNon=T3yx6RR&<4PFS%=g(zz; z!y}nfbM%y{3F8>FOx5r;WzUMoDtvI2>q7oOFc$n9@4VAuPZrM9Id`j)Y*LUes2VYS2Y)5a1zmTCh~cf`4HC{|`BB ztX$DDUS{jp2SFzd;5f=+*%De)Jr<&o5qs;P|<5DmDoMfsKt0{!3YSV^lT^aXTP6XlYh&LOo z?|6w#zC0WCLa05JsLGA?WERcaok0}($yAZ*|B9hV8ALqKJiXAX zCbUskjaTwgq6K%A+ci<++peD6JVOpWF+&|;t~#yE84SX4rOfi8r`*nmZ<{*t9Zip; zSC5k+RbAZX4`WJ;R#%Pftg24*W?6LFR#|^BmlYG*Jyp$zGNv_KAeF^DO>a8Sc%zUl!#bxt*7U+Tqb*;v|2Io`AccBx+6ca*_SRb^}dQU=js z1%eQ+EVW)_JIZi^!B`x_7~pdr)(>tiLtsY+t-m_h=|OVg7gb1ef28zcx;pgeCUV_Y zHkeL4t<046o2yKHv6kzsWJ`&yJPCE;n~hu;kI{hR1*o>U!o%u?r-RJG=K`$TtB!8j zO)h-Gg?bUm)-Z@y2{Owx)%rb~$#u>g?mF?216XMFd9^ZxYLs`LAyco_#h2eTAlnb@P-PQc*+)Xe zsN;5*brG)@W1&IJWSMm0A6DK-e6f`|qyA*jE_Iiw!T=d2$I5V&MKcjD|0_k3YL(vV z@~|jKW*gO4h8^w*dSTD=LNBc4=n|Z5LV5bD{&hpA8$=8IM2_w#fI;+QG0=$Ya-HBu z;mDqoWHA*QM!_94 zF4bX5+oL+|qPpNjvz_!}poLsFx~&Y8RErjbGbJd}AQY+YtHqRFEUPIOewrXtZt6O~ zPs)(9D(j#V3FdO$W?3<9RtK4C%9LJ=Nsw6_Ily#cs5-?$+0aIs7k`R&_=$b#RVTTq z*0Ec{g_Emn74m0ILckSAl{PCzE)4D` z7e-sj)W-TUl*~cErOjHVnyc>iXKB$HYV*@_{Ai}?Vm>@T=G+t_vl#4HN(=l%MY^#$ zj6^yI67GLI|AgqJ2DvlKrx(v1WuS(KbxYaALOf=3=tLYlL5O-B2|{?vL8hITBTvis zmJ9vWz3SppnM!8g2+c=c3Pmp*)<~NfDpx(|DZ^wrjzo?s!*W%FZt?^Yy*N71v}_!m zu;swhi*}B3;ilO#RYA7!N!hfTnYzB!S|nE`t8tg3P7GspV{vhoTUQA~&xu-*_QlFVyC+={(;E5uU z>$La7WR}w`xDY;S1N%O5ohb*H5SAQSI?`Z-%8bu#5R8P2YMNt1!0aIFCH9qHr z%9LXp8D^_`-S|sx;JySwFH9U|>MvOZF-o2Q;!h8`u)5rfc2=ED^LZr}!i1LqyaaJT z3o%r6@?f=2rQ`rqqqPOBpK7l3^mxXPw~xT!Fpt143-RbtZydO#y^g)nAs8Hpb?N-c2&DcGsn05w literal 0 HcmV?d00001 diff --git a/dist/platform/elc-asan.dSYM/Contents/Resources/Relocations/aarch64/elc-asan.yml b/dist/platform/elc-asan.dSYM/Contents/Resources/Relocations/aarch64/elc-asan.yml new file mode 100644 index 0000000..b55aedf --- /dev/null +++ b/dist/platform/elc-asan.dSYM/Contents/Resources/Relocations/aarch64/elc-asan.yml @@ -0,0 +1,5 @@ +--- +triple: 'arm64-apple-darwin' +binary-path: '/Users/will/Development/neuron-technologies/foundation/el/dist/platform/elc-asan' +relocations: [] +... diff --git a/dist/platform/elc-new b/dist/platform/elc-new new file mode 100755 index 0000000000000000000000000000000000000000..68ee155ca98639dbb36ba479e4cecc48c02a5058 GIT binary patch literal 221480 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 literal 0 HcmV?d00001 diff --git a/dist/platform/elc.prelaunch.bak b/dist/platform/elc.prelaunch.bak new file mode 100755 index 0000000000000000000000000000000000000000..9b68a4017fa2566e22a8363d38cecce77eaa874c GIT binary patch literal 375272 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 z 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 literal 0 HcmV?d00001 diff --git a/dist/platform/elc.prev8 b/dist/platform/elc.prev8 new file mode 100755 index 0000000000000000000000000000000000000000..68ee155ca98639dbb36ba479e4cecc48c02a5058 GIT binary patch literal 221480 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 literal 0 HcmV?d00001 diff --git a/dist/platform/elc.prev9 b/dist/platform/elc.prev9 new file mode 100755 index 0000000000000000000000000000000000000000..68ee155ca98639dbb36ba479e4cecc48c02a5058 GIT binary patch literal 221480 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 literal 0 HcmV?d00001 diff --git a/el-compiler/runtime/el_runtime.c b/el-compiler/runtime/el_runtime.c index c54ddc6..8f8a602 100644 --- a/el-compiler/runtime/el_runtime.c +++ b/el-compiler/runtime/el_runtime.c @@ -3099,6 +3099,9 @@ el_val_t json_get_raw(el_val_t json_str, el_val_t key) { const char* json = EL_CSTR(json_str); const char* k = EL_CSTR(key); const char* p = json_find_key(json, k); + /* Clear fs_read binary-length hint — result is a fresh null-terminated + * string, not the raw file bytes, so Content-Length must use strlen. */ + _tl_fs_read_len = 0; if (!p) return el_wrap_str(el_strdup("")); const char* end = json_skip_value(p); size_t n = (size_t)(end - p); diff --git a/el-compiler/runtime/el_runtime.js b/el-compiler/runtime/el_runtime.js new file mode 100644 index 0000000..e5c7a79 --- /dev/null +++ b/el-compiler/runtime/el_runtime.js @@ -0,0 +1,679 @@ +/* + * el_runtime.js — El language JS runtime. + * + * The browser/Node analog of el_runtime.c. Compiled-from-El JS source + * imports this file once; it side-effects globalThis.__el with every + * builtin, so generated programs can destructure the names they need + * (see codegen-js.el's preamble). + * + * Value model: + * El's tagged el_val_t collapses into JS native types here: + * String -> string + * Int -> number (caveat: only 53 bits of integer precision) + * Float -> number (already a double) + * Bool -> boolean + * [T] -> Array + * Map<,> -> plain object + * Void -> undefined + * null -> null + * + * Runtime mode auto-detection: + * typeof window === 'undefined' -> Node mode + * otherwise -> Browser mode + * + * See spec/codegen-js.md for the full design rationale. + */ + +const IS_NODE = typeof window === 'undefined' && typeof process !== 'undefined' && process.versions != null && process.versions.node != null; + +// ── I/O ───────────────────────────────────────────────────────────────────── + +function println(s) { + if (IS_NODE) { + process.stdout.write(String(s) + '\n'); + } else { + console.log(String(s)); + } +} + +function print(s) { + if (IS_NODE) { + process.stdout.write(String(s)); + } else { + // Browser has no stdout — fall back to console with no newline group + console.log(String(s)); + } +} + +// ── String builtins ───────────────────────────────────────────────────────── + +// Coerce both args to string and concat. Mirrors el_str_concat in C; +// the C version handles both string-and-string and string-and-int. +function el_str_concat(a, b) { + return String(a) + String(b); +} + +function str_concat(a, b) { return el_str_concat(a, b); } + +// Strict equality with string coercion. Matches str_eq() in C — which +// strcmp's the underlying char*. Here we just === after coercion. +function str_eq(a, b) { + if (a === null || b === null) return a === b; + return String(a) === String(b); +} + +function str_starts_with(s, prefix) { + return String(s).startsWith(String(prefix)); +} + +function str_ends_with(s, suffix) { + return String(s).endsWith(String(suffix)); +} + +function str_len(s) { + return String(s).length; +} + +function int_to_str(n) { + return String(n); +} + +function str_to_int(s) { + const n = parseInt(String(s), 10); + return Number.isNaN(n) ? 0 : n; +} + +function str_slice(s, start, end) { + return String(s).slice(start, end); +} + +function str_contains(s, sub) { + return String(s).indexOf(String(sub)) >= 0; +} + +function str_replace(s, from, to) { + // Replace ALL occurrences (matches C runtime semantics). + return String(s).split(String(from)).join(String(to)); +} + +function str_to_upper(s) { return String(s).toUpperCase(); } +function str_to_lower(s) { return String(s).toLowerCase(); } +function str_upper(s) { return String(s).toUpperCase(); } +function str_lower(s) { return String(s).toLowerCase(); } + +function str_trim(s) { return String(s).trim(); } + +function str_index_of(s, sub) { + return String(s).indexOf(String(sub)); +} + +function str_split(s, sep) { + return String(s).split(String(sep)); +} + +function str_char_at(s, i) { + return String(s).charAt(i); +} + +function str_char_code(s, i) { + const c = String(s).charCodeAt(i); + return Number.isNaN(c) ? 0 : c; +} + +function str_pad_left(s, width, pad) { + return String(s).padStart(width, String(pad)); +} + +function str_pad_right(s, width, pad) { + return String(s).padEnd(width, String(pad)); +} + +// ── Math ──────────────────────────────────────────────────────────────────── + +function el_abs(n) { return Math.abs(n); } +function el_max(a, b) { return a > b ? a : b; } +function el_min(a, b) { return a < b ? a : b; } + +// ── Refcount (no-op — JS has GC) ──────────────────────────────────────────── + +function el_retain(_v) { /* no-op */ } +function el_release(_v) { /* no-op */ } + +// ── List ──────────────────────────────────────────────────────────────────── + +// Variadic constructor matching el_list_new(count, items...). Exposed so +// codegen-js can emit the same call shape if we ever want it (currently +// codegen-js emits JS array literals directly). +function el_list_new(_count, ...items) { + return items.slice(0); +} + +function el_list_empty() { return []; } +function el_list_clone(list) { return Array.isArray(list) ? list.slice() : []; } +function el_list_len(list) { return Array.isArray(list) ? list.length : 0; } + +function el_list_get(list, index) { + if (!Array.isArray(list)) return null; + if (index < 0 || index >= list.length) return null; + return list[index]; +} + +function el_list_append(list, elem) { + if (!Array.isArray(list)) return [elem]; + const out = list.slice(); + out.push(elem); + return out; +} + +function list_push(list, elem) { return el_list_append(list, elem); } + +function list_push_front(list, elem) { + if (!Array.isArray(list)) return [elem]; + return [elem, ...list]; +} + +function list_join(list, sep) { + if (!Array.isArray(list)) return ''; + return list.map(String).join(String(sep)); +} + +function list_range(start, end) { + const out = []; + for (let i = start; i < end; i++) out.push(i); + return out; +} + +// ── Map ───────────────────────────────────────────────────────────────────── + +// Variadic constructor (key, val, key, val, ...). +function el_map_new(_pairCount, ...kvs) { + const out = {}; + for (let i = 0; i < kvs.length; i += 2) { + out[String(kvs[i])] = kvs[i + 1]; + } + return out; +} + +function el_get_field(map, key) { + if (map === null || map === undefined) return null; + if (typeof map !== 'object') return null; + const k = String(key); + if (Object.prototype.hasOwnProperty.call(map, k)) return map[k]; + return null; +} + +function el_map_get(map, key) { return el_get_field(map, key); } + +function el_map_set(map, key, value) { + // Match the C runtime: shallow-copy + set, persistent semantics. + const out = (map && typeof map === 'object') ? { ...map } : {}; + out[String(key)] = value; + return out; +} + +// ── Method-call shorthand aliases ────────────────────────────────────────── +// `obj.method(args)` compiles to `method(obj, args)` per El convention. + +function append(list, elem) { return el_list_append(list, elem); } +function len(v) { + if (Array.isArray(v)) return v.length; + if (typeof v === 'string') return v.length; + if (v && typeof v === 'object') return Object.keys(v).length; + return 0; +} +function get(list, index) { return el_list_get(list, index); } +function map_get(m, k) { return el_get_field(m, k); } +function map_set(m, k, v) { return el_map_set(m, k, v); } + +// ── Native VM aliases ────────────────────────────────────────────────────── + +function native_list_get(list, index) { return el_list_get(list, index); } +function native_list_len(list) { return el_list_len(list); } +function native_list_append(list, elem) { return el_list_append(list, elem); } +function native_list_empty() { return []; } +function native_list_clone(list) { return el_list_clone(list); } +function native_string_chars(s) { return String(s).split(''); } +function native_int_to_str(n) { return String(n); } + +// ── HTTP ─────────────────────────────────────────────────────────────────── +// +// fetch() is async. These return Promise. Generated El code does +// not yet emit await — that's the async-taint pass (see spec §5). For +// programs that don't touch HTTP this is fine; for programs that do, +// the value will appear as "[object Promise]" until the taint pass lands. + +function http_get(url) { + if (typeof fetch === 'undefined') { + throw new Error('http_get: fetch() not available in this runtime'); + } + return fetch(String(url)).then(r => r.text()); +} + +function http_post(url, body) { + if (typeof fetch === 'undefined') { + throw new Error('http_post: fetch() not available in this runtime'); + } + return fetch(String(url), { method: 'POST', body: String(body) }).then(r => r.text()); +} + +function http_post_json(url, jsonBody) { + if (typeof fetch === 'undefined') { + throw new Error('http_post_json: fetch() not available in this runtime'); + } + return fetch(String(url), { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: String(jsonBody), + }).then(r => r.text()); +} + +function http_get_with_headers(url, headersMap) { + if (typeof fetch === 'undefined') { + throw new Error('http_get_with_headers: fetch() not available'); + } + return fetch(String(url), { headers: headersMap || {} }).then(r => r.text()); +} + +function http_post_with_headers(url, body, headersMap) { + if (typeof fetch === 'undefined') { + throw new Error('http_post_with_headers: fetch() not available'); + } + return fetch(String(url), { + method: 'POST', + headers: headersMap || {}, + body: String(body), + }).then(r => r.text()); +} + +function http_serve(_port, _handler) { + throw new Error('http_serve: not supported in JS target — needs server-side runtime mode'); +} + +function http_set_handler(_name) { + throw new Error('http_set_handler: not supported in JS target'); +} + +// ── Filesystem (Node-only) ───────────────────────────────────────────────── + +function _ensureNode(name) { + if (!IS_NODE) { + throw new Error(`${name}: not supported in browser runtime`); + } +} + +function fs_read(path) { + _ensureNode('fs_read'); + const fs = require('node:fs'); + try { + return fs.readFileSync(String(path), 'utf8'); + } catch (_e) { + return ''; + } +} + +function fs_write(path, content) { + _ensureNode('fs_write'); + const fs = require('node:fs'); + try { + fs.writeFileSync(String(path), String(content)); + return true; + } catch (_e) { + return false; + } +} + +function fs_list(path) { + _ensureNode('fs_list'); + const fs = require('node:fs'); + try { + return fs.readdirSync(String(path)); + } catch (_e) { + return []; + } +} + +// ── JSON ─────────────────────────────────────────────────────────────────── + +function json_parse(s) { + try { return JSON.parse(String(s)); } + catch (_e) { return null; } +} + +function json_stringify(v) { + try { return JSON.stringify(v); } + catch (_e) { return ''; } +} + +function json_get(jsonStr, key) { + const o = json_parse(jsonStr); + if (o === null) return null; + return el_get_field(o, key); +} + +function json_get_string(jsonStr, key) { + const v = json_get(jsonStr, key); + return v === null ? '' : String(v); +} + +function json_get_int(jsonStr, key) { + const v = json_get(jsonStr, key); + if (typeof v === 'number') return Math.trunc(v); + if (typeof v === 'string') return str_to_int(v); + return 0; +} + +function json_get_float(jsonStr, key) { + const v = json_get(jsonStr, key); + return typeof v === 'number' ? v : 0; +} + +function json_get_bool(jsonStr, key) { + const v = json_get(jsonStr, key); + return v === true; +} + +function json_get_raw(jsonStr, key) { + const v = json_get(jsonStr, key); + return v === null ? '' : json_stringify(v); +} + +function json_set(jsonStr, key, value) { + const o = json_parse(jsonStr) ?? {}; + o[String(key)] = value; + return json_stringify(o); +} + +function json_array_len(jsonStr) { + const o = json_parse(jsonStr); + return Array.isArray(o) ? o.length : 0; +} + +// ── Time ─────────────────────────────────────────────────────────────────── + +function time_now() { + return Math.floor(Date.now() / 1000); +} + +function time_now_utc() { + // In the C runtime this returns nanoseconds since epoch. JS number + // can't represent that range past ~2^53. We return milliseconds — a + // safe range — and document the divergence. + return Date.now(); +} + +function sleep_secs(secs) { + if (!IS_NODE) { + throw new Error('sleep_secs: blocking sleep not supported in browser'); + } + // Simple sync sleep via Atomics.wait on a SharedArrayBuffer-backed Int32. + const sab = new SharedArrayBuffer(4); + const i32 = new Int32Array(sab); + Atomics.wait(i32, 0, 0, Math.floor(secs * 1000)); + return secs; +} + +function sleep_ms(ms) { + if (!IS_NODE) { + throw new Error('sleep_ms: blocking sleep not supported in browser'); + } + const sab = new SharedArrayBuffer(4); + const i32 = new Int32Array(sab); + Atomics.wait(i32, 0, 0, Math.floor(ms)); + return ms; +} + +// ── Bool ─────────────────────────────────────────────────────────────────── + +function bool_to_str(b) { return b ? 'true' : 'false'; } + +// ── Process ──────────────────────────────────────────────────────────────── + +function exit_program(code) { + if (IS_NODE) { + process.exit(code | 0); + } else { + throw new Error(`exit_program(${code}) called in browser`); + } +} + +// ── args() ───────────────────────────────────────────────────────────────── + +function args() { + if (IS_NODE) { + // process.argv is [node, script, ...args] — slice off node + script. + return process.argv.slice(2); + } + return []; +} + +// ── env ──────────────────────────────────────────────────────────────────── + +function env(key) { + if (IS_NODE) { + const v = process.env[String(key)]; + return v === undefined ? null : v; + } + return null; +} + +// ── In-process state K/V ─────────────────────────────────────────────────── + +const _stateMap = new Map(); + +function state_set(key, value) { + _stateMap.set(String(key), value); + return value; +} + +function state_get(key) { + const v = _stateMap.get(String(key)); + return v === undefined ? '' : v; +} + +function state_del(key) { + return _stateMap.delete(String(key)); +} + +function state_keys() { + return Array.from(_stateMap.keys()); +} + +// ── UUID ─────────────────────────────────────────────────────────────────── + +function uuid_v4() { + // RFC 4122-ish — uses crypto when available, falls back to Math.random. + if (typeof crypto !== 'undefined' && crypto.randomUUID) { + return crypto.randomUUID(); + } + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} +function uuid_new() { return uuid_v4(); } + +// ── Float formatting ─────────────────────────────────────────────────────── + +function float_to_str(f) { return String(f); } +function int_to_float(n) { return n; } +function float_to_int(f) { return Math.trunc(f); } + +function format_float(f, decimals) { + return Number(f).toFixed(decimals); +} + +function decimal_round(f, decimals) { + const m = Math.pow(10, decimals); + return Math.round(f * m) / m; +} + +function str_to_float(s) { + const n = parseFloat(String(s)); + return Number.isNaN(n) ? 0 : n; +} + +// ── Math (Float-aware) ───────────────────────────────────────────────────── + +function math_sqrt(f) { return Math.sqrt(f); } +function math_log(f) { return Math.log10(f); } +function math_ln(f) { return Math.log(f); } +function math_sin(f) { return Math.sin(f); } +function math_cos(f) { return Math.cos(f); } +function math_pi() { return Math.PI; } + +// ── Stubs for not-yet-supported features ─────────────────────────────────── +// +// These compile but throw when called. See spec/codegen-js.md §7. + +function _notSupported(name) { + return () => { throw new Error(`${name}: not supported in JS target — needs server-side delegation`); }; +} + +// CGI identity +function el_cgi_init(_name, _did, _principal, _network, _engram) { + // No-op — UI code is not a CGI principal. See spec §7. +} + +// DHARMA — all stubbed. +const dharma_connect = _notSupported('dharma_connect'); +const dharma_send = _notSupported('dharma_send'); +const dharma_activate = _notSupported('dharma_activate'); +const dharma_emit = _notSupported('dharma_emit'); +const dharma_field = _notSupported('dharma_field'); +const dharma_strengthen = _notSupported('dharma_strengthen'); +const dharma_relationship = _notSupported('dharma_relationship'); +const dharma_peers = _notSupported('dharma_peers'); + +// Engram — stubbed (could be ported to in-browser later). +const engram_node = _notSupported('engram_node'); +const engram_node_full = _notSupported('engram_node_full'); +const engram_get_node = _notSupported('engram_get_node'); +const engram_strengthen = _notSupported('engram_strengthen'); +const engram_forget = _notSupported('engram_forget'); +const engram_node_count = _notSupported('engram_node_count'); +const engram_search = _notSupported('engram_search'); +const engram_scan_nodes = _notSupported('engram_scan_nodes'); +const engram_connect = _notSupported('engram_connect'); +const engram_edge_between = _notSupported('engram_edge_between'); +const engram_neighbors = _notSupported('engram_neighbors'); +const engram_neighbors_filtered = _notSupported('engram_neighbors_filtered'); +const engram_edge_count = _notSupported('engram_edge_count'); +const engram_activate = _notSupported('engram_activate'); +const engram_save = _notSupported('engram_save'); +const engram_load = _notSupported('engram_load'); + +// LLM — stubbed (browser cannot hold API keys safely). +const llm_call = _notSupported('llm_call'); +const llm_call_system = _notSupported('llm_call_system'); +const llm_call_agentic = _notSupported('llm_call_agentic'); +const llm_vision = _notSupported('llm_vision'); +const llm_models = _notSupported('llm_models'); +const llm_register_tool = _notSupported('llm_register_tool'); + +// Crypto — stubbed; could be backed by SubtleCrypto later. +const sha256_hex = _notSupported('sha256_hex'); +const sha256_bytes = _notSupported('sha256_bytes'); +const hmac_sha256_hex = _notSupported('hmac_sha256_hex'); +const hmac_sha256_bytes = _notSupported('hmac_sha256_bytes'); +const base64_encode = _notSupported('base64_encode'); +const base64_decode = _notSupported('base64_decode'); +const base64url_encode = _notSupported('base64url_encode'); +const base64url_decode = _notSupported('base64url_decode'); + +// ── Export to globalThis.__el ────────────────────────────────────────────── +// +// Generated programs destructure off this object. Keeping it on globalThis +// means a single `import "./el_runtime.js"` is enough; no per-call namespace +// prefix is required at codegen time. + +const __el = { + // I/O + println, print, + // String + el_str_concat, str_concat, str_eq, str_starts_with, str_ends_with, + str_len, int_to_str, str_to_int, str_slice, str_contains, str_replace, + str_to_upper, str_to_lower, str_trim, str_index_of, str_split, str_char_at, + str_char_code, str_lower, str_upper, str_pad_left, str_pad_right, + // Math + el_abs, el_max, el_min, + // Refcount + el_retain, el_release, + // List + el_list_new, el_list_empty, el_list_clone, el_list_len, el_list_get, + el_list_append, list_push, list_push_front, list_join, list_range, + // Map + el_map_new, el_get_field, el_map_get, el_map_set, + // Method-call shortforms + append, len, get, map_get, map_set, + // Native VM aliases + native_list_get, native_list_len, native_list_append, native_list_empty, + native_list_clone, native_string_chars, native_int_to_str, + // HTTP + http_get, http_post, http_post_json, http_get_with_headers, + http_post_with_headers, http_serve, http_set_handler, + // FS + fs_read, fs_write, fs_list, + // JSON + json_parse, json_stringify, json_get, json_get_string, json_get_int, + json_get_float, json_get_bool, json_get_raw, json_set, json_array_len, + // Time + time_now, time_now_utc, sleep_secs, sleep_ms, + // Bool + bool_to_str, + // Process + exit_program, + // Args / env + args, env, + // State + state_set, state_get, state_del, state_keys, + // UUID + uuid_v4, uuid_new, + // Float / math + float_to_str, int_to_float, float_to_int, format_float, decimal_round, + str_to_float, math_sqrt, math_log, math_ln, math_sin, math_cos, math_pi, + // CGI / DHARMA / Engram / LLM (stubs) + el_cgi_init, + dharma_connect, dharma_send, dharma_activate, dharma_emit, dharma_field, + dharma_strengthen, dharma_relationship, dharma_peers, + engram_node, engram_node_full, engram_get_node, engram_strengthen, + engram_forget, engram_node_count, engram_search, engram_scan_nodes, + engram_connect, engram_edge_between, engram_neighbors, + engram_neighbors_filtered, engram_edge_count, engram_activate, + engram_save, engram_load, + llm_call, llm_call_system, llm_call_agentic, llm_vision, + llm_models, llm_register_tool, + // Crypto (stubs) + sha256_hex, sha256_bytes, hmac_sha256_hex, hmac_sha256_bytes, + base64_encode, base64_decode, base64url_encode, base64url_decode, +}; + +globalThis.__el = __el; + +// Also re-export as ES module exports for consumers that prefer that style. +export { __el as default }; +export { + println, print, + el_str_concat, str_concat, str_eq, str_starts_with, str_ends_with, + str_len, int_to_str, str_to_int, str_slice, str_contains, str_replace, + str_to_upper, str_to_lower, str_trim, str_index_of, str_split, str_char_at, + str_char_code, str_lower, str_upper, + el_abs, el_max, el_min, + el_retain, el_release, + el_list_new, el_list_empty, el_list_clone, el_list_len, el_list_get, + el_list_append, list_push, list_push_front, list_join, list_range, + el_map_new, el_get_field, el_map_get, el_map_set, + append, len, get, map_get, map_set, + native_list_get, native_list_len, native_list_append, native_list_empty, + native_list_clone, native_string_chars, native_int_to_str, + http_get, http_post, http_post_json, + fs_read, fs_write, fs_list, + json_parse, json_stringify, json_get, json_get_string, json_get_int, + time_now, time_now_utc, sleep_ms, + bool_to_str, exit_program, args, env, + state_set, state_get, state_del, state_keys, + el_cgi_init, + dharma_connect, dharma_send, dharma_activate, dharma_emit, dharma_field, + engram_node, engram_search, engram_activate, + llm_call, llm_call_system, +}; diff --git a/el-compiler/src/codegen-js.el b/el-compiler/src/codegen-js.el new file mode 100644 index 0000000..62b4edb --- /dev/null +++ b/el-compiler/src/codegen-js.el @@ -0,0 +1,943 @@ +// codegen-js.el — El compiler JavaScript source code generator +// +// Input: list of AST statement maps (from parser.el) +// Output: JavaScript source printed to stdout (streamed, one line at a time) +// +// Each El program compiles to a single .js file that imports el_runtime.js +// (which side-effects globals so call sites stay flat — println(x), not +// el.println(x)). Functions map to JS function declarations; top-level +// statements run at module load. +// +// Entry point: fn codegen_js(stmts: [Map], source: String) -> String +// Returns "" — output goes to stdout via println(). +// +// This file mirrors codegen.el (the C backend). Where the C backend has to +// fight the int64_t-everywhere convention to dispatch arithmetic vs concat +// or `==` vs `str_eq`, the JS backend can usually let JS's own operator +// semantics do the right thing. We retain the dispatch logic for clarity +// and so that explicit calls to `el_str_concat` or `str_eq` still work. + +// ── String helpers ──────────────────────────────────────────────────────────── + +// Escape a JS string literal (double-quotes, backslashes, newlines, etc.). +fn js_escape(s: String) -> String { + let chars: [String] = native_string_chars(s) + let total: Int = native_list_len(chars) + let out = "" + let i = 0 + while i < total { + let ch: String = native_list_get(chars, i) + if ch == "\"" { + let out = out + "\\\"" + } else { + if ch == "\\" { + let out = out + "\\\\" + } else { + if ch == "\n" { + let out = out + "\\n" + } else { + if ch == "\r" { + let out = out + "\\r" + } else { + if ch == "\t" { + let out = out + "\\t" + } else { + let out = out + ch + } + } + } + } + } + let i = i + 1 + } + out +} + +fn js_str_lit(s: String) -> String { + "\"" + js_escape(s) + "\"" +} + +// ── Code emission ───────────────────────────────────────────────────────────── + +fn js_emit_line(line: String) -> Void { + println(line) +} + +fn js_emit_blank() -> Void { + println("") +} + +// ── Operator helpers ────────────────────────────────────────────────────────── + +fn js_binop(op: String) -> String { + if op == "Plus" { return "+" } + if op == "Minus" { return "-" } + if op == "Star" { return "*" } + if op == "Slash" { return "/" } + if op == "Percent" { return "%" } + if op == "EqEq" { return "===" } + if op == "NotEq" { return "!==" } + if op == "Lt" { return "<" } + if op == "Gt" { return ">" } + if op == "LtEq" { return "<=" } + if op == "GtEq" { return ">=" } + if op == "And" { return "&&" } + if op == "Or" { return "||" } + op +} + +// ── Int-name tracking (mirrors codegen.el) ──────────────────────────────────── + +fn js_is_int_name(name: String) -> Bool { + let csv: String = state_get("__js_int_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn js_add_int_name(name: String) -> Bool { + let csv: String = state_get("__js_int_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__js_int_names", csv + name + ",") + return true +} + +fn js_build_int_names_for_params(params: [Map]) -> Bool { + state_set("__js_int_names", ",") + let np: Int = native_list_len(params) + let pi = 0 + while pi < np { + let param = native_list_get(params, pi) + let pname: String = param["name"] + let ptype: String = param["type"] + if str_eq(ptype, "Int") { + js_add_int_name(pname) + } + let pi = pi + 1 + } + return true +} + +fn js_is_int_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "str_len") { return true } + if str_eq(name, "str_index_of") { return true } + if str_eq(name, "str_to_int") { return true } + if str_eq(name, "str_char_code") { return true } + if str_eq(name, "native_list_len") { return true } + if str_eq(name, "el_list_len") { return true } + if str_eq(name, "len") { return true } + if str_eq(name, "json_get_int") { return true } + if str_eq(name, "time_now") { return true } + if str_eq(name, "time_now_utc") { return true } + if str_eq(name, "el_abs") { return true } + if str_eq(name, "el_max") { return true } + if str_eq(name, "el_min") { return true } + return false +} + +// ── Expression codegen ──────────────────────────────────────────────────────── +// +// js_cg_expr returns a JS expression string (not a statement). +// +// Note: the C backend's `+` dispatch is preserved here for two reasons: +// 1) Generated output stays grep-equivalent across targets +// 2) Explicit `el_str_concat()` lives in the runtime; codegen routes +// through it for ambiguous (Ident+Ident, Call+Call) cases. JS's +// own `+` would also work, but el_str_concat coerces both sides +// to strings — closer to the C semantics. + +fn js_cg_expr(expr: Map) -> String { + let kind: String = expr["expr"] + + if kind == "Int" { + let v: String = expr["value"] + return v + } + + // DurationLit — postfix-literal time value (e.g. 30.seconds, 1.hour). + // The JS backend lowers to a literal integer nanosecond count. The C + // backend uses the typed wrapper el_duration_from_nanos to make intent + // explicit at the runtime boundary; JS has no equivalent shim yet, so + // we lower directly. A future Phase 2 JS time runtime can route through + // a wrapper once added. + if kind == "DurationLit" { + let count: String = expr["count"] + let unit: String = expr["unit"] + let mult_ns = "1" + if str_eq(unit, "nano") { let mult_ns = "1" } + if str_eq(unit, "nanos") { let mult_ns = "1" } + if str_eq(unit, "milli") { let mult_ns = "1000000" } + if str_eq(unit, "millis") { let mult_ns = "1000000" } + if str_eq(unit, "millisecond") { let mult_ns = "1000000" } + if str_eq(unit, "milliseconds") { let mult_ns = "1000000" } + if str_eq(unit, "second") { let mult_ns = "1000000000" } + if str_eq(unit, "seconds") { let mult_ns = "1000000000" } + if str_eq(unit, "minute") { let mult_ns = "60000000000" } + if str_eq(unit, "minutes") { let mult_ns = "60000000000" } + if str_eq(unit, "hour") { let mult_ns = "3600000000000" } + if str_eq(unit, "hours") { let mult_ns = "3600000000000" } + if str_eq(unit, "day") { let mult_ns = "86400000000000" } + if str_eq(unit, "days") { let mult_ns = "86400000000000" } + return "(" + count + " * " + mult_ns + ")" + } + + if kind == "Float" { + // JS numbers are already doubles — no bit-cast trick needed. + let v: String = expr["value"] + return v + } + + if kind == "Str" { + let v: String = expr["value"] + return js_str_lit(v) + } + + if kind == "Bool" { + let v: String = expr["value"] + if v == "true" { return "true" } + return "false" + } + + if kind == "Nil" { + return "null" + } + + if kind == "Ident" { + let name: String = expr["name"] + return name + } + + if kind == "Not" { + let inner = expr["inner"] + let inner_c: String = js_cg_expr(inner) + return "!" + inner_c + } + + if kind == "Neg" { + let inner = expr["inner"] + let inner_c: String = js_cg_expr(inner) + return "(-" + inner_c + ")" + } + + if kind == "BinOp" { + let op: String = expr["op"] + let left = expr["left"] + let right = expr["right"] + let left_c: String = js_cg_expr(left) + let right_c: String = js_cg_expr(right) + let left_kind: String = left["expr"] + let right_kind: String = right["expr"] + + // Plus dispatch — same shape as C backend, but we route through + // el_str_concat for the string-concat path (its JS impl coerces + // and matches C's behavior). Arithmetic uses bare JS `+`. + if op == "Plus" { + if left_kind == "Str" { + return "el_str_concat(" + left_c + ", " + right_c + ")" + } + if right_kind == "Str" { + return "el_str_concat(" + left_c + ", " + right_c + ")" + } + if left_kind == "Int" { + return "(" + left_c + " + " + right_c + ")" + } + if right_kind == "Int" { + return "(" + left_c + " + " + right_c + ")" + } + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if js_is_int_name(lname) { + if js_is_int_name(rname) { + return "(" + left_c + " + " + right_c + ")" + } + } + } + } + if left_kind == "Ident" { + if right_kind == "Call" { + let lname: String = left["name"] + if js_is_int_name(lname) { + if js_is_int_call(right) { + return "(" + left_c + " + " + right_c + ")" + } + } + } + } + if right_kind == "Ident" { + if left_kind == "Call" { + let rname: String = right["name"] + if js_is_int_name(rname) { + if js_is_int_call(left) { + return "(" + left_c + " + " + right_c + ")" + } + } + } + } + if left_kind == "Call" { + if right_kind == "Call" { + if js_is_int_call(left) { + if js_is_int_call(right) { + return "(" + left_c + " + " + right_c + ")" + } + } + } + return "el_str_concat(" + left_c + ", " + right_c + ")" + } + if right_kind == "Call" { + return "el_str_concat(" + left_c + ", " + right_c + ")" + } + // Fallback: when in doubt, route through el_str_concat. JS's + // own + handles strings and numbers natively, but el_str_concat + // gives us a single point of control if behavior needs to diverge. + if left_kind == "Ident" { + return "el_str_concat(" + left_c + ", " + right_c + ")" + } + if right_kind == "Ident" { + return "el_str_concat(" + left_c + ", " + right_c + ")" + } + } + + // Equality dispatch — C backend disambiguates via str_eq for + // strings and == for ints. JS does both with === if we know + // the types are uniform; for ambiguous identifier pairs we + // route through str_eq for safety (it falls back to === in JS). + if op == "EqEq" { + if left_kind == "Int" { return "(" + left_c + " === " + right_c + ")" } + if right_kind == "Int" { return "(" + left_c + " === " + right_c + ")" } + if left_kind == "Bool" { return "(" + left_c + " === " + right_c + ")" } + if right_kind == "Bool" { return "(" + left_c + " === " + right_c + ")" } + if left_kind == "Nil" { return "(" + left_c + " === " + right_c + ")" } + if right_kind == "Nil" { return "(" + left_c + " === " + right_c + ")" } + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if js_is_int_name(lname) { + if js_is_int_name(rname) { + return "(" + left_c + " === " + right_c + ")" + } + } + } + } + if left_kind == "Str" { return "str_eq(" + left_c + ", " + right_c + ")" } + if right_kind == "Str" { return "str_eq(" + left_c + ", " + right_c + ")" } + // Default: === (works for strings, numbers, bools in JS) + return "(" + left_c + " === " + right_c + ")" + } + + if op == "NotEq" { + if left_kind == "Int" { return "(" + left_c + " !== " + right_c + ")" } + if right_kind == "Int" { return "(" + left_c + " !== " + right_c + ")" } + if left_kind == "Bool" { return "(" + left_c + " !== " + right_c + ")" } + if right_kind == "Bool" { return "(" + left_c + " !== " + right_c + ")" } + if left_kind == "Nil" { return "(" + left_c + " !== " + right_c + ")" } + if right_kind == "Nil" { return "(" + left_c + " !== " + right_c + ")" } + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if js_is_int_name(lname) { + if js_is_int_name(rname) { + return "(" + left_c + " !== " + right_c + ")" + } + } + } + } + if left_kind == "Str" { return "!str_eq(" + left_c + ", " + right_c + ")" } + if right_kind == "Str" { return "!str_eq(" + left_c + ", " + right_c + ")" } + return "(" + left_c + " !== " + right_c + ")" + } + + let op_c: String = js_binop(op) + return "(" + left_c + " " + op_c + " " + right_c + ")" + } + + if kind == "Call" { + let func = expr["func"] + let args = expr["args"] + let arity: Int = native_list_len(args) + let func_kind: String = func["expr"] + + let args_c = "" + let i = 0 + while i < arity { + let arg = native_list_get(args, i) + let arg_c: String = js_cg_expr(arg) + if i > 0 { + let args_c = args_c + ", " + } + let args_c = args_c + arg_c + let i = i + 1 + } + + if func_kind == "Ident" { + let fn_name: String = func["name"] + return fn_name + "(" + args_c + ")" + } + + if func_kind == "Field" { + // El's `obj.method(args)` becomes `method(obj, args)` — same + // convention as the C backend. The runtime exports method + // shortforms (append, len, get, map_get, map_set) that match. + let obj = func["object"] + let field: String = func["field"] + let obj_c: String = js_cg_expr(obj) + if arity > 0 { + return field + "(" + obj_c + ", " + args_c + ")" + } + return field + "(" + obj_c + ")" + } + + let fn_c: String = js_cg_expr(func) + return fn_c + "(" + args_c + ")" + } + + if kind == "Field" { + // El's `obj.foo` becomes JS `obj["foo"]` — works on plain objects + // (maps) and on JS objects with prototype. el_get_field is a + // runtime helper for callers that want EL_NULL on missing keys. + let obj = expr["object"] + let field: String = expr["field"] + let obj_c: String = js_cg_expr(obj) + return "el_get_field(" + obj_c + ", " + js_str_lit(field) + ")" + } + + if kind == "Index" { + // Map vs list dispatch on the index expression kind, same as C. + let obj = expr["object"] + let idx = expr["index"] + let obj_c: String = js_cg_expr(obj) + let idx_c: String = js_cg_expr(idx) + let idx_kind: String = idx["expr"] + if str_eq(idx_kind, "Str") { + return "el_get_field(" + obj_c + ", " + idx_c + ")" + } + return "el_list_get(" + obj_c + ", " + idx_c + ")" + } + + if kind == "Array" { + let elems = expr["elems"] + let n: Int = native_list_len(elems) + if n == 0 { return "[]" } + let items = "" + let i = 0 + while i < n { + let elem = native_list_get(elems, i) + let elem_c: String = js_cg_expr(elem) + if i > 0 { + let items = items + ", " + } + let items = items + elem_c + let i = i + 1 + } + return "[" + items + "]" + } + + if kind == "Map" { + let pairs = expr["pairs"] + let n: Int = native_list_len(pairs) + if n == 0 { return "{}" } + let items = "" + let i = 0 + while i < n { + let pair = native_list_get(pairs, i) + let key: String = pair["key"] + let val = pair["value"] + let val_c: String = js_cg_expr(val) + if i > 0 { + let items = items + ", " + } + let items = items + js_str_lit(key) + ": " + val_c + let i = i + 1 + } + return "{" + items + "}" + } + + if kind == "Try" { + let inner = expr["inner"] + return js_cg_expr(inner) + } + + if kind == "If" { + let cond = expr["cond"] + let cond_c: String = js_cg_expr(cond) + // If as expression: ternary. Body of the if-expression is not + // currently emitted as expression-form for compound bodies; this + // matches the C backend's if-expr stub. + return "(" + cond_c + " ? 1 : 0)" + } + + if kind == "Match" { + return js_cg_match(expr) + } + + "null" +} + +// ── Match codegen (basic) ───────────────────────────────────────────────────── +// +// Lower a match expression to an IIFE with if/else chain. Works for +// LitInt / LitStr / LitBool / Wildcard / Binding patterns. Tagged-union +// destructuring is not implemented — it's stubbed and falls through to +// the wildcard path. + +fn js_next_match_id() -> String { + let csv: String = state_get("__js_match_counter") + let n = 0 + if !str_eq(csv, "") { + let n = str_to_int(csv) + } + let n = n + 1 + state_set("__js_match_counter", native_int_to_str(n)) + native_int_to_str(n) +} + +fn js_cg_match(expr: Map) -> String { + let subject = expr["subject"] + let arms = expr["arms"] + let subj_c: String = js_cg_expr(subject) + let id: String = js_next_match_id() + let subj_var: String = "_match_subj_" + id + let out: String = "((" + subj_var + ") => { " + let n: Int = native_list_len(arms) + let i = 0 + while i < n { + let arm = native_list_get(arms, i) + let pat = arm["pattern"] + let body = arm["body"] + let pkind: String = pat["pattern"] + let body_c: String = js_cg_expr(body) + if str_eq(pkind, "Wildcard") { + let out = out + "return (" + body_c + "); " + } else { + if str_eq(pkind, "Binding") { + let bname: String = pat["name"] + let out = out + "{ const " + bname + " = " + subj_var + "; return (" + body_c + "); } " + } else { + if str_eq(pkind, "LitInt") { + let v: String = pat["value"] + let out = out + "if (" + subj_var + " === " + v + ") return (" + body_c + "); " + } else { + if str_eq(pkind, "LitStr") { + let v: String = pat["value"] + let out = out + "if (str_eq(" + subj_var + ", " + js_str_lit(v) + ")) return (" + body_c + "); " + } else { + if str_eq(pkind, "LitBool") { + let v: String = pat["value"] + let bv = "false" + if str_eq(v, "true") { let bv = "true" } + let out = out + "if (" + subj_var + " === " + bv + ") return (" + body_c + "); " + } else { + // unknown pattern → wildcard + let out = out + "return (" + body_c + "); " + } + } + } + } + } + let i = i + 1 + } + let out = out + "return null; })(" + subj_c + ")" + out +} + +// ── Variable scope tracking ─────────────────────────────────────────────────── +// +// El allows `let x = ...` to redeclare in the same scope. JS would throw +// with `let` (Identifier already declared). We track declared names and +// emit bare `x = ...` on redeclaration, `let x = ...` first time. + +fn js_list_contains(lst: [String], s: String) -> Bool { + let n: Int = native_list_len(lst) + let i = 0 + while i < n { + let item: String = native_list_get(lst, i) + if item == s { return true } + let i = i + 1 + } + false +} + +// ── Statement codegen ───────────────────────────────────────────────────────── + +fn js_cg_stmt(stmt: Map, indent: String, declared: [String]) -> [String] { + let kind: String = stmt["stmt"] + + if kind == "Let" { + let name: String = stmt["name"] + let val = stmt["value"] + let val_c: String = js_cg_expr(val) + let ltype: String = stmt["type"] + if str_eq(ltype, "Int") { + js_add_int_name(name) + } + let vk: String = val["expr"] + if str_eq(vk, "Int") { + js_add_int_name(name) + } + if js_list_contains(declared, name) { + js_emit_line(indent + name + " = " + val_c + ";") + return declared + } else { + // Use `let` (not `const`) — El semantics allow rebinding. + js_emit_line(indent + "let " + name + " = " + val_c + ";") + return native_list_append(declared, name) + } + } + + if kind == "Return" { + let val = stmt["value"] + let val_kind: String = val["expr"] + if val_kind == "Nil" { + js_emit_line(indent + "return null;") + } else { + let val_c: String = js_cg_expr(val) + js_emit_line(indent + "return " + val_c + ";") + } + return declared + } + + // Bare reassignment: `name = expr`. Mirrors the C backend — emits a + // plain JS assignment without `let` so we don't shadow an outer binding. + if kind == "Assign" { + let name: String = stmt["name"] + let val = stmt["value"] + let val_c: String = js_cg_expr(val) + js_emit_line(indent + name + " = " + val_c + ";") + return declared + } + + if kind == "Expr" { + let val = stmt["value"] + let val_kind: String = val["expr"] + if val_kind == "If" { + js_cg_if_stmt(val, indent, declared) + return declared + } + if val_kind == "For" { + js_cg_for_stmt(val, indent, declared) + return declared + } + let val_c: String = js_cg_expr(val) + js_emit_line(indent + val_c + ";") + return declared + } + + if kind == "While" { + let cond = stmt["cond"] + let body = stmt["body"] + let cond_c: String = js_cg_expr(cond) + let cond_c = js_strip_outer_parens(cond_c) + js_emit_line(indent + "while (" + cond_c + ") {") + js_cg_stmts(body, indent + " ", native_list_clone(declared)) + js_emit_line(indent + "}") + return declared + } + + if kind == "For" { + let item: String = stmt["item"] + let list_expr = stmt["list"] + let body = stmt["body"] + js_cg_for_body(item, list_expr, body, indent, declared) + return declared + } + + if kind == "FnDef" { return declared } + if kind == "TypeDef" { return declared } + if kind == "EnumDef" { return declared } + if kind == "Import" { return declared } + if kind == "CgiBlock" { + // CGI blocks compile to a no-op + warning comment in JS target. + // The runtime cgi identity is server-side; UI code is not a CGI + // principal. See spec/codegen-js.md §7. + let cname: String = stmt["name"] + js_emit_line(indent + "// cgi block '" + cname + "' — no-op in JS target (server-side concept)") + return declared + } + if kind == "ServiceBlock" { + let sname: String = stmt["name"] + js_emit_line(indent + "// service block '" + sname + "' — no-op in JS target") + return declared + } + declared +} + +// Strip a single layer of surrounding parentheses from a JS expression string. +fn js_strip_outer_parens(s: String) -> String { + let chars: [String] = native_string_chars(s) + let n: Int = native_list_len(chars) + if n < 2 { return s } + let first: String = native_list_get(chars, 0) + let last: String = native_list_get(chars, n - 1) + if first == "(" { + if last == ")" { + let depth = 1 + let i = 1 + let balanced = true + while i < n - 1 { + let ch: String = native_list_get(chars, i) + if ch == "(" { + let depth = depth + 1 + } + if ch == ")" { + let depth = depth - 1 + if depth == 0 { + let balanced = false + let i = n + } + } + let i = i + 1 + } + if balanced { + let inner = "" + let j = 1 + while j < n - 1 { + let ch: String = native_list_get(chars, j) + let inner = inner + ch + let j = j + 1 + } + return inner + } + } + } + s +} + +fn js_cg_if_stmt(expr: Map, indent: String, declared: [String]) -> Void { + let cond = expr["cond"] + let then_stmts = expr["then"] + let else_stmts = expr["else"] + let has_else: Bool = expr["has_else"] + let cond_c: String = js_cg_expr(cond) + let cond_c = js_strip_outer_parens(cond_c) + js_emit_line(indent + "if (" + cond_c + ") {") + js_cg_stmts(then_stmts, indent + " ", native_list_clone(declared)) + if has_else { + js_emit_line(indent + "} else {") + js_cg_stmts(else_stmts, indent + " ", native_list_clone(declared)) + } + js_emit_line(indent + "}") +} + +fn js_cg_for_body(item: String, list_expr: Map, body: [Map], indent: String, declared: [String]) -> Void { + let list_c: String = js_cg_expr(list_expr) + js_emit_line(indent + "for (const " + item + " of " + list_c + ") {") + let body_decl = native_list_clone(declared) + let body_decl = native_list_append(body_decl, item) + js_cg_stmts(body, indent + " ", body_decl) + js_emit_line(indent + "}") +} + +fn js_cg_for_stmt(expr: Map, indent: String, declared: [String]) -> Void { + let item: String = expr["item"] + let list_expr = expr["list"] + let body = expr["body"] + js_cg_for_body(item, list_expr, body, indent, declared) +} + +fn js_cg_stmts(stmts: [Map], indent: String, declared: [String]) -> [String] { + let n: Int = native_list_len(stmts) + let i = 0 + let decl = declared + while i < n { + let stmt = native_list_get(stmts, i) + let decl = js_cg_stmt(stmt, indent, decl) + let i = i + 1 + } + decl +} + +// ── Function declaration codegen ────────────────────────────────────────────── + +fn js_params_str(params: [Map]) -> String { + let n: Int = native_list_len(params) + if n == 0 { return "" } + let out = "" + let i = 0 + while i < n { + let param = native_list_get(params, i) + let name: String = param["name"] + if i > 0 { + let out = out + ", " + } + let out = out + name + let i = i + 1 + } + out +} + +// Same implicit-return transform as the C backend. +fn js_transform_implicit_return(body: [Map]) -> [Map] { + let n: Int = native_list_len(body) + if n == 0 { return body } + let last: Map = native_list_get(body, n - 1) + let last_kind: String = last["stmt"] + if last_kind == "Expr" { + let val = last["value"] + let val_kind: String = val["expr"] + if val_kind == "If" { return body } + if val_kind == "For" { return body } + let new_body: [Map] = native_list_empty() + let i = 0 + while i < n - 1 { + let new_body = native_list_append(new_body, native_list_get(body, i)) + let i = i + 1 + } + let return_stmt: Map = { "stmt": "Return", "value": val } + let new_body = native_list_append(new_body, return_stmt) + return new_body + } + body +} + +fn js_cg_fn(stmt: Map) -> Void { + let fn_name: String = stmt["name"] + let params = stmt["params"] + let body = stmt["body"] + let ret_type: String = stmt["ret_type"] + let params_str: String = js_params_str(params) + js_build_int_names_for_params(params) + + // Special-case `fn main` — emit as a regular function and call it + // at module bottom (after all top-level statements). This matches + // the C backend's behavior where `fn main` is the entry point. + if fn_name == "main" { + js_emit_line("function main(" + params_str + ") {") + } else { + js_emit_line("function " + fn_name + "(" + params_str + ") {") + } + + let decl = native_list_empty() + let np: Int = native_list_len(params) + let pi = 0 + while pi < np { + let param = native_list_get(params, pi) + let pname: String = param["name"] + let decl = native_list_append(decl, pname) + let pi = pi + 1 + } + let body_xformed = body + if !str_eq(ret_type, "Void") { + let body_xformed = js_transform_implicit_return(body) + } + js_cg_stmts(body_xformed, " ", decl) + js_emit_line("}") + js_emit_blank() +} + +// ── Top-level codegen ───────────────────────────────────────────────────────── + +fn js_is_fndef(stmt: Map) -> Bool { + let kind: String = stmt["stmt"] + if kind == "FnDef" { return true } + false +} + +fn js_is_top_level_decl(stmt: Map) -> Bool { + let kind: String = stmt["stmt"] + if kind == "TypeDef" { return true } + if kind == "EnumDef" { return true } + if kind == "Import" { return true } + if kind == "CgiBlock" { return true } + if kind == "ServiceBlock" { return true } + false +} + +// ── Entry point ─────────────────────────────────────────────────────────────── + +fn codegen_js(stmts: [Map], source: String) -> String { + // Reset per-compile state. + state_set("__js_int_names", "") + state_set("__js_match_counter", "") + + // Preamble: inline the runtime via a single import that side-effects + // globalThis. The runtime path is resolved relative to the generated + // output; users running `elc --target=js` are responsible for ensuring + // el_runtime.js is reachable. For self-contained output, the runtime + // could be inlined; that is a follow-up. + js_emit_line("// Generated by elc --target=js") + js_emit_line("// Runtime: foundation/el/el-compiler/runtime/el_runtime.js") + js_emit_line("import \"./el_runtime.js\";") + js_emit_line("const {") + js_emit_line(" println, print, el_str_concat, str_concat, str_eq, str_starts_with, str_ends_with,") + js_emit_line(" str_len, int_to_str, str_to_int, str_slice, str_contains, str_replace,") + js_emit_line(" str_to_upper, str_to_lower, str_trim, str_index_of, str_split, str_char_at,") + js_emit_line(" str_char_code, str_lower, str_upper, el_abs, el_max, el_min,") + js_emit_line(" el_list_new, el_list_len, el_list_get, el_list_append, el_list_empty, el_list_clone,") + js_emit_line(" list_push, list_join, list_range,") + js_emit_line(" el_map_new, el_get_field, el_map_get, el_map_set,") + js_emit_line(" http_get, http_post, http_post_json,") + js_emit_line(" fs_read, fs_write, fs_list,") + js_emit_line(" json_parse, json_stringify, json_get, json_get_string, json_get_int,") + js_emit_line(" time_now, time_now_utc, sleep_ms, bool_to_str, exit_program,") + js_emit_line(" el_retain, el_release,") + js_emit_line(" append, len, get, map_get, map_set,") + js_emit_line(" native_list_get, native_list_len, native_list_append, native_list_empty,") + js_emit_line(" native_list_clone, native_string_chars, native_int_to_str,") + js_emit_line(" args, state_set, state_get, state_del, state_keys, env,") + js_emit_line(" dharma_connect, dharma_send, dharma_emit, dharma_field, dharma_activate,") + js_emit_line(" engram_node, engram_search, engram_activate,") + js_emit_line(" llm_call, llm_call_system,") + js_emit_line("} = globalThis.__el;") + js_emit_blank() + + // Function definitions + let n: Int = native_list_len(stmts) + let i = 0 + while i < n { + let stmt = native_list_get(stmts, i) + if js_is_fndef(stmt) { + js_cg_fn(stmt) + } + let i = i + 1 + } + + // Top-level statements (those that are not FnDef and not declarative) + // run at module load. If the program defines `fn main`, we additionally + // call main() at the end so the C-backend mental model of "fn main is + // the entry point" carries over. + let has_main = false + let i = 0 + while i < n { + let stmt = native_list_get(stmts, i) + let sk: String = stmt["stmt"] + if str_eq(sk, "FnDef") { + let fn_name: String = stmt["name"] + if str_eq(fn_name, "main") { + let has_main = true + } + } + let i = i + 1 + } + + let main_decl = native_list_empty() + let i = 0 + while i < n { + let stmt = native_list_get(stmts, i) + if js_is_fndef(stmt) { + // skip + } else { + if js_is_top_level_decl(stmt) { + // skip + } else { + let main_decl = js_cg_stmt(stmt, "", main_decl) + } + } + let i = i + 1 + } + + if has_main { + js_emit_blank() + js_emit_line("main();") + } + + // Return empty string — output was streamed via println + "" +} diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..9604ec3 --- /dev/null +++ b/install.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# install.sh — Install the El SDK from the latest Gitea release. +# +# Usage: +# bash install.sh +# EL_VERSION=v1.0.0 bash install.sh # pin a specific release tag +# EL_PREFIX=/opt/el bash install.sh # custom install prefix +# +# Environment variables: +# EL_VERSION Release tag to download (default: latest) +# EL_PREFIX Install prefix (default: /usr/local) + +set -euo pipefail + +REPO_BASE="https://git.neuralplatform.ai/neuron-technologies/el" +VERSION="${EL_VERSION:-latest}" +PREFIX="${EL_PREFIX:-/usr/local}" + +BIN_DIR="${PREFIX}/bin" +LIB_DIR="${PREFIX}/lib/el" + +RELEASE_BASE="${REPO_BASE}/releases/download/${VERSION}" + +echo "==> Installing El SDK ${VERSION}" +echo " prefix : ${PREFIX}" +echo " bin : ${BIN_DIR}" +echo " lib : ${LIB_DIR}" +echo + +# Create directories +mkdir -p "${BIN_DIR}" "${LIB_DIR}" + +# Download helper +download() { + local url="$1" + local dest="$2" + echo " Downloading $(basename "${dest}")..." + if command -v curl >/dev/null 2>&1; then + curl -fsSL "${url}" -o "${dest}" + elif command -v wget >/dev/null 2>&1; then + wget -q "${url}" -O "${dest}" + else + echo "Error: neither curl nor wget found" >&2 + exit 1 + fi +} + +# Download assets +TMP_DIR="$(mktemp -d)" +trap 'rm -rf "${TMP_DIR}"' EXIT + +download "${RELEASE_BASE}/elc" "${TMP_DIR}/elc" +download "${RELEASE_BASE}/el_runtime.c" "${TMP_DIR}/el_runtime.c" +download "${RELEASE_BASE}/el_runtime.h" "${TMP_DIR}/el_runtime.h" + +# Install +install -m 755 "${TMP_DIR}/elc" "${BIN_DIR}/elc" +install -m 644 "${TMP_DIR}/el_runtime.c" "${LIB_DIR}/el_runtime.c" +install -m 644 "${TMP_DIR}/el_runtime.h" "${LIB_DIR}/el_runtime.h" + +echo +echo "==> El SDK installed successfully" +echo +echo " elc binary : ${BIN_DIR}/elc" +echo " runtime : ${LIB_DIR}/el_runtime.c" +echo " header : ${LIB_DIR}/el_runtime.h" +echo +echo "Add the following to your Makefile to build El programs:" +echo +echo " EL_LIB := ${LIB_DIR}" +echo " ELC := elc" +echo " CC := cc" +echo " CFLAGS := -std=c11 -O2 -I\$(EL_LIB)" +echo +echo " dist/myapp.c: src/myapp.el" +echo " \t\$(ELC) src/myapp.el > dist/myapp.c" +echo +echo " dist/myapp: dist/myapp.c" +echo " \t\$(CC) \$(CFLAGS) -o dist/myapp dist/myapp.c \$(EL_LIB)/el_runtime.c -lcurl -lpthread" +echo diff --git a/releases/v1.0.0-20260501/RELEASE.md b/releases/v1.0.0-20260501/RELEASE.md new file mode 100644 index 0000000..280af6e --- /dev/null +++ b/releases/v1.0.0-20260501/RELEASE.md @@ -0,0 +1,28 @@ +# El Compiler Release v1.0.0 — 2026-05-02 + +## Components +- `bootstrap.py` — El language compiler (Python, recursive descent parser, emits C) +- `el_runtime.c` — El runtime (C, HTTP server, engram, DHARMA, LLM chain) +- `el_runtime.h` — Runtime public API header + +## Changes in this release + +### Critical bug fixes +- `state_set`/`state_get` are now thread-safe (pthread_mutex). Was racing across 64 worker threads. +- `looks_like_string` threshold raised from 1,000,000 to 4GB. Unix timestamps were being dereferenced as heap pointers. +- `fs_read` guards against negative `ftell` result (pipe/special file overflow). + +### Engram architecture (major) +- Two-layer activation: `background_activation` (Layer 1, broad fan-out) + `working_memory_weight` (Layer 2, executive filter) +- Inhibitory edges: `EngramEdge.inhibitory` flag suppresses working memory promotion without affecting background activation +- Suppression memory: `suppression_count` — nodes activated-but-suppressed accumulate pressure toward breakthrough +- Temporal decay: `temporal_decay_rate`, `created_at`, `last_activated_at`, `activation_count` on EngramNode +- Per-type activation thresholds (Safety: 0.05, Canonical: 0.15, Lesson: 0.25, Note: 0.40) +- Temporal range query: `engram_query_range(start_ms, end_ms)` +- Layered consciousness: `EngramLayer` struct, `layer_id` on nodes and edges, `EngramStore.layers[]` +- Layer 0 override pass: safety layer fires last and cannot be suppressed + +## SHA256 +bootstrap.py +el_runtime.c +el_runtime.h diff --git a/releases/v1.0.0-20260501/el_runtime.c b/releases/v1.0.0-20260501/el_runtime.c new file mode 100644 index 0000000..ab09b89 --- /dev/null +++ b/releases/v1.0.0-20260501/el_runtime.c @@ -0,0 +1,6693 @@ +/* + * el_runtime.c — El language C runtime implementation + * + * All functions use el_val_t (= int64_t) as the universal value type. + * Strings are transported as their pointer address cast to int64_t. + * On any 64-bit system sizeof(pointer) <= sizeof(int64_t), so this is safe. + * + * Compile with: + * cc -std=c11 -I -lcurl -lpthread -o .c el_runtime.c + * + * Link requirements: -lcurl (HTTP client + LLM), -lpthread (HTTP server). + */ + +/* Feature-test macros must be set before any standard headers. _GNU_SOURCE + * exposes clock_gettime/CLOCK_REALTIME, strcasecmp, and the dlfcn extensions + * (RTLD_DEFAULT) — all of which macOS hands us without asking but glibc on + * Debian gates behind an explicit opt-in. */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include "el_runtime.h" + +#include +#include /* strcasecmp */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* dlsym for http_set_handler fallback */ +#include +#include +#include +#include +#include + +/* ── Internal allocators ─────────────────────────────────────────────────── */ + +/* + * Per-request string arena + * + * Every El string allocated via el_strbuf / el_strdup during an HTTP request + * is registered in a thread-local arena. When el_request_end() is called at + * the end of the worker thread, every arena entry is freed — recovering all + * the intermediate strings from el_str_concat chains (build_system_prompt, + * engram_compile, etc.) that are otherwise leaked forever. + * + * Long-lived allocations (state_set values, engram internal storage) call + * el_strdup_persist() / el_strbuf_persist() which bypass the arena entirely. + */ + +#define EL_ARENA_INITIAL 512 + +typedef struct { + char** ptrs; + size_t count; + size_t cap; +} ElArena; + +static _Thread_local ElArena _tl_arena = {NULL, 0, 0}; +static _Thread_local int _tl_arena_active = 0; + +/* Binary-safe fs_read length — set by fs_read, consumed by http_send_response. + * Allows serving PNGs and other binary files without strlen truncation. */ +static _Thread_local size_t _tl_fs_read_len = 0; + +static void el_arena_track(char* p) { + if (!_tl_arena_active || !p) return; + if (_tl_arena.count >= _tl_arena.cap) { + size_t nc = _tl_arena.cap == 0 ? EL_ARENA_INITIAL : _tl_arena.cap * 2; + char** grown = realloc(_tl_arena.ptrs, nc * sizeof(char*)); + if (!grown) return; /* can't track — will leak this one ptr, but don't crash */ + _tl_arena.ptrs = grown; + _tl_arena.cap = nc; + } + _tl_arena.ptrs[_tl_arena.count++] = p; +} + +/* Called by http_worker before dispatching the El handler. */ +void el_request_start(void) { + _tl_arena.count = 0; + _tl_arena_active = 1; +} + +/* Called by http_worker after the El handler returns and the response is sent. + * Frees every intermediate string allocated during the request. */ +void el_request_end(void) { + _tl_arena_active = 0; + for (size_t i = 0; i < _tl_arena.count; i++) { + free(_tl_arena.ptrs[i]); + } + _tl_arena.count = 0; +} + +/* Persistent allocation — bypasses the arena (state_set, engram internals). */ +static char* el_strdup_persist(const char* s) { + if (!s) return strdup(""); + return strdup(s); +} +static char* el_strbuf_persist(size_t n) { + char* p = malloc(n + 1); + if (!p) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + p[0] = '\0'; + return p; +} + +static char* el_strdup(const char* s) { + if (!s) { char* p = strdup(""); el_arena_track(p); return p; } + char* p = strdup(s); + el_arena_track(p); + return p; +} + +static char* el_strbuf(size_t n) { + char* p = malloc(n + 1); + if (!p) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + p[0] = '\0'; + el_arena_track(p); + return p; +} + +/* Wrap an allocated C string as el_val_t */ +static el_val_t el_wrap_str(char* s) { + return EL_STR(s); +} + +/* ── I/O ──────────────────────────────────────────────────────────────────── */ + +void println(el_val_t s) { + const char* str = EL_CSTR(s); + if (str) puts(str); + else puts(""); +} + +void print(el_val_t s) { + const char* str = EL_CSTR(s); + if (str) fputs(str, stdout); +} + +el_val_t readline(void) { + char buf[4096]; + if (!fgets(buf, sizeof(buf), stdin)) return el_wrap_str(el_strdup("")); + size_t len = strlen(buf); + if (len > 0 && buf[len - 1] == '\n') buf[len - 1] = '\0'; + return el_wrap_str(el_strdup(buf)); +} + +/* ── String builtins ─────────────────────────────────────────────────────── */ + +el_val_t el_str_concat(el_val_t av, el_val_t bv) { + const char* a = EL_CSTR(av); + const char* b = EL_CSTR(bv); + if (!a) a = ""; + if (!b) b = ""; + size_t la = strlen(a); + size_t lb = strlen(b); + char* out = el_strbuf(la + lb); + memcpy(out, a, la); + memcpy(out + la, b, lb); + out[la + lb] = '\0'; + return el_wrap_str(out); +} + +el_val_t str_eq(el_val_t av, el_val_t bv) { + const char* a = EL_CSTR(av); + const char* b = EL_CSTR(bv); + if (!a || !b) return (el_val_t)(a == b); + return (el_val_t)(strcmp(a, b) == 0); +} + +el_val_t str_starts_with(el_val_t sv, el_val_t prefv) { + const char* s = EL_CSTR(sv); + const char* prefix = EL_CSTR(prefv); + if (!s || !prefix) return 0; + size_t lp = strlen(prefix); + return (el_val_t)(strncmp(s, prefix, lp) == 0); +} + +el_val_t str_ends_with(el_val_t sv, el_val_t sufv) { + const char* s = EL_CSTR(sv); + const char* suffix = EL_CSTR(sufv); + if (!s || !suffix) return 0; + size_t ls = strlen(s); + size_t lsuf = strlen(suffix); + if (lsuf > ls) return 0; + return (el_val_t)(strcmp(s + ls - lsuf, suffix) == 0); +} + +el_val_t str_len(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return 0; + return (el_val_t)strlen(s); +} + +el_val_t str_concat(el_val_t a, el_val_t b) { + return el_str_concat(a, b); +} + +el_val_t int_to_str(el_val_t n) { + char buf[32]; + snprintf(buf, sizeof(buf), "%lld", (long long)n); + return el_wrap_str(el_strdup(buf)); +} + +el_val_t str_to_int(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return 0; + return (el_val_t)atoll(s); +} + +el_val_t str_slice(el_val_t sv, el_val_t start, el_val_t end) { + const char* s = EL_CSTR(sv); + if (!s) return el_wrap_str(el_strdup("")); + int64_t len = (int64_t)strlen(s); + if (start < 0) start = 0; + if (end > len) end = len; + if (start >= end) return el_wrap_str(el_strdup("")); + int64_t sz = end - start; + char* out = el_strbuf((size_t)sz); + memcpy(out, s + start, (size_t)sz); + out[sz] = '\0'; + return el_wrap_str(out); +} + +el_val_t str_contains(el_val_t sv, el_val_t subv) { + const char* s = EL_CSTR(sv); + const char* sub = EL_CSTR(subv); + if (!s || !sub) return 0; + return (el_val_t)(strstr(s, sub) != NULL); +} + +el_val_t str_replace(el_val_t sv, el_val_t fromv, el_val_t tov) { + const char* s = EL_CSTR(sv); + const char* from = EL_CSTR(fromv); + const char* to = EL_CSTR(tov); + if (!s || !from || !to) return el_wrap_str(el_strdup(s ? s : "")); + size_t ls = strlen(s); + size_t lf = strlen(from); + size_t lt = strlen(to); + if (lf == 0) return el_wrap_str(el_strdup(s)); + size_t count = 0; + const char* p = s; + while ((p = strstr(p, from)) != NULL) { count++; p += lf; } + size_t out_sz = ls + count * lt + 1; + char* out = el_strbuf(out_sz); + char* dst = out; + p = s; + const char* found; + while ((found = strstr(p, from)) != NULL) { + size_t chunk = (size_t)(found - p); + memcpy(dst, p, chunk); dst += chunk; + memcpy(dst, to, lt); dst += lt; + p = found + lf; + } + strcpy(dst, p); + return el_wrap_str(out); +} + +el_val_t str_to_upper(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return el_wrap_str(el_strdup("")); + size_t n = strlen(s); + char* out = el_strbuf(n); + for (size_t i = 0; i < n; i++) out[i] = (char)toupper((unsigned char)s[i]); + out[n] = '\0'; + return el_wrap_str(out); +} + +el_val_t str_to_lower(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return el_wrap_str(el_strdup("")); + size_t n = strlen(s); + char* out = el_strbuf(n); + for (size_t i = 0; i < n; i++) out[i] = (char)tolower((unsigned char)s[i]); + out[n] = '\0'; + return el_wrap_str(out); +} + +el_val_t str_trim(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return el_wrap_str(el_strdup("")); + while (*s && isspace((unsigned char)*s)) s++; + size_t n = strlen(s); + while (n > 0 && isspace((unsigned char)s[n - 1])) n--; + char* out = el_strbuf(n); + memcpy(out, s, n); + out[n] = '\0'; + return el_wrap_str(out); +} + +/* ── Math ────────────────────────────────────────────────────────────────── */ + +el_val_t el_abs(el_val_t n) { return n < 0 ? -n : n; } +el_val_t el_max(el_val_t a, el_val_t b) { return a > b ? a : b; } +el_val_t el_min(el_val_t a, el_val_t b) { return a < b ? a : b; } + +/* ── Refcounted heap objects ────────────────────────────────────────────────── + * + * ElList and ElMap carry a magic-tagged header at offset 0: + * { uint32_t magic; uint32_t refcount; ... payload ... } + * + * The magic tag distinguishes refcounted objects from raw C strings (whose + * first byte is printable ASCII < 0x80) and from small integers (which can't + * be dereferenced). el_retain / el_release sniff the magic and act only on + * matching values; everything else is a safe no-op. + * + * Both ElList and ElMap use INDIRECTION: the header is fixed-size and never + * moves. The payload arrays (elems, keys, values) live in separate heap + * allocations, so realloc-grow on append never invalidates the caller's + * pointer to the header. This is what lets us mutate-in-place safely when + * the refcount is 1 and copy-on-write when it's higher. + * + * Memory model in practice: + * Single-owner accumulator (the cg_stmts pattern) — refcount stays at 1, + * appends amortize to O(1), total memory O(N) for an N-element list. + * Multi-owner branching (the cg_if_stmt pattern) — refcount > 1, each + * append on a shared list copies, so the original is preserved for the + * else-branch. Persistent semantics where they're needed; mutation where + * they're not. */ + +#define EL_MAGIC_LIST 0xE15710A1u /* >= 0x80 in MSB so 'looks_like_string' rejects */ +#define EL_MAGIC_MAP 0xE19A704Bu + +typedef struct { + uint32_t magic; + uint32_t refcount; +} ElHeader; + +/* ── List ────────────────────────────────────────────────────────────────── */ + +typedef struct { + ElHeader hdr; + int64_t length; + int64_t capacity; + el_val_t* elems; +} ElList; + +static ElList* list_alloc(int64_t cap) { + if (cap < 4) cap = 4; + ElList* lst = malloc(sizeof(ElList)); + if (!lst) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + lst->hdr.magic = EL_MAGIC_LIST; + lst->hdr.refcount = 1; + lst->length = 0; + lst->capacity = cap; + lst->elems = malloc((size_t)cap * sizeof(el_val_t)); + if (!lst->elems) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + return lst; +} + +el_val_t el_list_empty(void) { + return EL_STR(list_alloc(4)); +} + +el_val_t el_list_new(el_val_t count, ...) { + ElList* lst = list_alloc(count > 0 ? count : 4); + va_list ap; + va_start(ap, count); + for (int64_t i = 0; i < count; i++) { + lst->elems[i] = va_arg(ap, el_val_t); + } + va_end(ap); + lst->length = count; + return EL_STR(lst); +} + +el_val_t el_list_len(el_val_t listv) { + ElList* lst = (ElList*)(uintptr_t)listv; + if (!lst) return 0; + return lst->length; +} + +el_val_t el_list_get(el_val_t listv, el_val_t index) { + ElList* lst = (ElList*)(uintptr_t)listv; + if (!lst) return 0; + if (index < 0 || index >= lst->length) return 0; + return lst->elems[index]; +} + +el_val_t el_list_append(el_val_t listv, el_val_t elem) { + ElList* old = (ElList*)(uintptr_t)listv; + if (!old) { + ElList* fresh = list_alloc(4); + fresh->elems[0] = elem; + fresh->length = 1; + return EL_STR(fresh); + } + + /* Uniquely owned: grow the elems buffer in place. The header pointer the + * caller holds doesn't move (we only realloc the inner array). This is + * the common case in compiler accumulators, and it's amortized O(1). */ + if (old->hdr.refcount <= 1) { + if (old->length >= old->capacity) { + int64_t new_cap = old->capacity > 0 ? old->capacity * 2 : 4; + el_val_t* grown = realloc(old->elems, (size_t)new_cap * sizeof(el_val_t)); + if (!grown) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + old->elems = grown; + old->capacity = new_cap; + } + old->elems[old->length++] = elem; + return listv; + } + + /* Shared: copy-on-write. The original is preserved for its other owners. */ + int64_t new_cap = old->length + 1; + if (new_cap < 4) new_cap = 4; + ElList* fresh = malloc(sizeof(ElList)); + if (!fresh) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + fresh->hdr.magic = EL_MAGIC_LIST; + fresh->hdr.refcount = 1; + fresh->length = old->length + 1; + fresh->capacity = new_cap; + fresh->elems = malloc((size_t)new_cap * sizeof(el_val_t)); + if (!fresh->elems) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + if (old->length > 0) { + memcpy(fresh->elems, old->elems, (size_t)old->length * sizeof(el_val_t)); + } + fresh->elems[old->length] = elem; + return EL_STR(fresh); +} + +el_val_t el_list_clone(el_val_t listv) { + /* Shallow copy: the new ElList owns its own header and elems buffer, but + * the elements themselves are shared (which is what callers want for the + * cg_if_stmt 'declared' pattern — cloning the spine, not its contents). + * Used by codegen at scope branch points where two child scopes need to + * see the same starting set of declared names without each other's + * mutations. */ + ElList* old = (ElList*)(uintptr_t)listv; + if (!old) return el_list_empty(); + int64_t cap = old->capacity > 0 ? old->capacity : 4; + if (cap < old->length) cap = old->length; + if (cap < 4) cap = 4; + ElList* fresh = malloc(sizeof(ElList)); + if (!fresh) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + fresh->hdr.magic = EL_MAGIC_LIST; + fresh->hdr.refcount = 1; + fresh->length = old->length; + fresh->capacity = cap; + fresh->elems = malloc((size_t)cap * sizeof(el_val_t)); + if (!fresh->elems) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + if (old->length > 0) { + memcpy(fresh->elems, old->elems, (size_t)old->length * sizeof(el_val_t)); + } + return EL_STR(fresh); +} + +/* ── Map ─────────────────────────────────────────────────────────────────── */ + +typedef struct { + ElHeader hdr; + int64_t count; + int64_t capacity; + el_val_t* keys; + el_val_t* values; +} ElMap; + +static ElMap* map_alloc(int64_t cap) { + if (cap < 4) cap = 4; + ElMap* m = malloc(sizeof(ElMap)); + if (!m) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + m->hdr.magic = EL_MAGIC_MAP; + m->hdr.refcount = 1; + m->count = 0; + m->capacity = cap; + m->keys = malloc((size_t)cap * sizeof(el_val_t)); + m->values = malloc((size_t)cap * sizeof(el_val_t)); + if (!m->keys || !m->values) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + return m; +} + +el_val_t el_map_new(el_val_t pair_count, ...) { + ElMap* m = map_alloc(pair_count > 0 ? pair_count : 4); + va_list ap; + va_start(ap, pair_count); + for (int64_t i = 0; i < pair_count; i++) { + m->keys[i] = va_arg(ap, el_val_t); + m->values[i] = va_arg(ap, el_val_t); + } + va_end(ap); + m->count = pair_count; + return EL_STR(m); +} + +static ElMap* as_map(el_val_t v) { return (ElMap*)(uintptr_t)v; } + +el_val_t el_map_get(el_val_t mapv, el_val_t keyv) { + ElMap* m = as_map(mapv); + const char* key = EL_CSTR(keyv); + if (!m || !key) return 0; + for (int64_t i = 0; i < m->count; i++) { + const char* k = EL_CSTR(m->keys[i]); + if (k && strcmp(k, key) == 0) return m->values[i]; + } + return 0; +} + +el_val_t el_get_field(el_val_t mapv, el_val_t keyv) { + return el_map_get(mapv, keyv); +} + +/* Internal: in-place set on a uniquely-owned map. */ +static el_val_t map_set_in_place(ElMap* m, el_val_t keyv, el_val_t value) { + const char* key = EL_CSTR(keyv); + if (key) { + for (int64_t i = 0; i < m->count; i++) { + const char* k = EL_CSTR(m->keys[i]); + if (k && strcmp(k, key) == 0) { m->values[i] = value; return EL_STR(m); } + } + } + if (m->count >= m->capacity) { + int64_t new_cap = m->capacity > 0 ? m->capacity * 2 : 4; + el_val_t* gk = realloc(m->keys, (size_t)new_cap * sizeof(el_val_t)); + el_val_t* gv = realloc(m->values, (size_t)new_cap * sizeof(el_val_t)); + if (!gk || !gv) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + m->keys = gk; + m->values = gv; + m->capacity = new_cap; + } + m->keys[m->count] = keyv; + m->values[m->count] = value; + m->count++; + return EL_STR(m); +} + +el_val_t el_map_set(el_val_t mapv, el_val_t keyv, el_val_t value) { + ElMap* m = as_map(mapv); + if (!m) return 0; + if (m->hdr.refcount <= 1) { + return map_set_in_place(m, keyv, value); + } + /* Shared: copy then set. The original is preserved for its other owners. */ + int64_t new_cap = m->count + 1; + if (new_cap < 4) new_cap = 4; + ElMap* fresh = malloc(sizeof(ElMap)); + if (!fresh) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + fresh->hdr.magic = EL_MAGIC_MAP; + fresh->hdr.refcount = 1; + fresh->count = m->count; + fresh->capacity = new_cap; + fresh->keys = malloc((size_t)new_cap * sizeof(el_val_t)); + fresh->values = malloc((size_t)new_cap * sizeof(el_val_t)); + if (!fresh->keys || !fresh->values) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + if (m->count > 0) { + memcpy(fresh->keys, m->keys, (size_t)m->count * sizeof(el_val_t)); + memcpy(fresh->values, m->values, (size_t)m->count * sizeof(el_val_t)); + } + return map_set_in_place(fresh, keyv, value); +} + +/* ── Refcount ops ─────────────────────────────────────────────────────────── */ +/* + * Both retain and release sniff the magic header to decide whether a value + * is a refcounted heap object. For small integers, raw C strings, and any + * value whose magic word doesn't match, both functions are no-ops. This lets + * codegen emit them on every let-binding without having to track types. + * + * Safety: we filter out obvious non-pointers (small magnitudes, misaligned + * addresses) before dereferencing. For any value that passes the filter and + * lives in a mapped page, reading the first 4 bytes is safe — strings start + * with printable ASCII (< 0x80), so their magic word will never collide with + * EL_MAGIC_LIST (0xE1...) or EL_MAGIC_MAP (0xE1...). Random integers that + * happen to look like aligned heap pointers are exceedingly unlikely to land + * on a page whose first 4 bytes match either magic. */ + +static int looks_like_heap_obj(el_val_t v) { + if (v == 0) return 0; + int64_t s = (int64_t)v; + if (s > -0x10000 && s < 0x10000) return 0; /* small ints */ + uintptr_t p = (uintptr_t)v; + if (p < 0x10000) return 0; /* low addresses */ + if (p & 0x7) return 0; /* malloc returns 8-aligned */ + return 1; +} + +void el_retain(el_val_t v) { + if (!looks_like_heap_obj(v)) return; + ElHeader* h = (ElHeader*)(uintptr_t)v; + if (h->magic == EL_MAGIC_LIST || h->magic == EL_MAGIC_MAP) { + h->refcount++; + } +} + +void el_release(el_val_t v) { + if (!looks_like_heap_obj(v)) return; + ElHeader* h = (ElHeader*)(uintptr_t)v; + if (h->magic == EL_MAGIC_LIST) { + if (h->refcount > 0 && --h->refcount == 0) { + ElList* l = (ElList*)h; + free(l->elems); + l->hdr.magic = 0; /* poison so use-after-free is detected */ + free(l); + } + } else if (h->magic == EL_MAGIC_MAP) { + if (h->refcount > 0 && --h->refcount == 0) { + ElMap* m = (ElMap*)h; + free(m->keys); + free(m->values); + m->hdr.magic = 0; + free(m); + } + } +} + +/* ── Batch 2/3 forward decls (defined later in JSON section) ────────────── */ + +typedef struct JsonBuf JsonBuf; +typedef struct JsonParser JsonParser; +static void jb_init(JsonBuf* b); +static void jb_putc(JsonBuf* b, char c); +static void jb_puts(JsonBuf* b, const char* s); +static void jb_emit_escaped(JsonBuf* b, const char* s); +static int looks_like_string(el_val_t v); +static const char* json_find_key(const char* s, const char* key); +static const char* json_skip_value(const char* p); +static char* jp_parse_string_raw(JsonParser* jp); + +/* Struct definitions are visible here because batch 2/3 helpers above use + * them by value; the bodies (jb_init, etc.) appear in the JSON section. */ +struct JsonBuf { + char* buf; + size_t len; + size_t cap; +}; + +struct JsonParser { + const char* p; + const char* end; + int err; +}; + +/* ── Batch 2: Real HTTP (libcurl client + POSIX-socket server) ───────────── */ +/* + * Client: blocking libcurl easy-handle calls. Errors are returned as a JSON + * fragment {"error":"..."} so callers can detect via str_starts_with("{") / + * json_get_string("error", ...). + * + * Server: bind/listen/accept loop on a TCP socket. Each accepted connection + * is handled in its own pthread (detached). A semaphore-style counter caps + * concurrent in-flight connections at HTTP_MAX_CONNS (64). When the cap is + * reached, accept() blocks until a worker exits. This prevents runaway + * thread creation under high load. + * + * Handler dispatch: El does not expose first-class function references at + * the runtime layer, so the second argument to http_serve(port, handler) is + * treated as a string name (or any el_val_t — the runtime ignores its + * value and uses the registry). Callers register a C-level handler via + * + * extern void el_runtime_register_handler(const char* name, + * el_val_t (*fn)(el_val_t, + * el_val_t, + * el_val_t)); + * + * and select the active handler by calling http_set_handler("name") from + * El, or by setting it directly through the C registry. If no handler is + * registered, the server replies with a 200 carrying a default message so + * the loop is observable. + */ + +/* ── HTTP client write-callback buffer ───────────────────────────────────── */ + +typedef struct { + char* data; + size_t len; + size_t cap; +} HttpBuf; + +static void httpbuf_init(HttpBuf* b) { + b->cap = 1024; + b->len = 0; + b->data = malloc(b->cap); + if (!b->data) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + b->data[0] = '\0'; +} + +static void httpbuf_append(HttpBuf* b, const void* src, size_t n) { + if (b->len + n + 1 > b->cap) { + while (b->len + n + 1 > b->cap) b->cap *= 2; + b->data = realloc(b->data, b->cap); + if (!b->data) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + } + memcpy(b->data + b->len, src, n); + b->len += n; + b->data[b->len] = '\0'; +} + +static size_t http_write_cb(char* ptr, size_t size, size_t nmemb, void* ud) { + size_t n = size * nmemb; + httpbuf_append((HttpBuf*)ud, ptr, n); + return n; +} + +/* JSON-escape an arbitrary C string into an allocated buffer. */ +static char* json_escape_alloc(const char* s) { + if (!s) return el_strdup(""); + JsonBuf b; jb_init(&b); + for (const char* p = s; *p; p++) { + unsigned char c = (unsigned char)*p; + switch (c) { + case '"': jb_puts(&b, "\\\""); break; + case '\\': jb_puts(&b, "\\\\"); break; + case '\n': jb_puts(&b, "\\n"); break; + case '\r': jb_puts(&b, "\\r"); break; + case '\t': jb_puts(&b, "\\t"); break; + default: + if (c < 0x20) { + char tmp[8]; snprintf(tmp, sizeof(tmp), "\\u%04x", c); + jb_puts(&b, tmp); + } else jb_putc(&b, (char)c); + } + } + return b.buf; +} + +static el_val_t http_error_json(const char* msg) { + char* esc = json_escape_alloc(msg ? msg : "unknown error"); + char* buf = el_strbuf(strlen(esc) + 16); + sprintf(buf, "{\"error\":\"%s\"}", esc); + free(esc); + return el_wrap_str(buf); +} + +/* HTTP timeout (ms) — read once from EL_HTTP_TIMEOUT_MS, default 60000. + * Applied via CURLOPT_TIMEOUT_MS on every libcurl request. */ +static long _el_http_timeout_ms = -1; +static long el_http_timeout_ms(void) { + long v = __atomic_load_n(&_el_http_timeout_ms, __ATOMIC_ACQUIRE); + if (v >= 0) return v; + const char* s = getenv("EL_HTTP_TIMEOUT_MS"); + long parsed = 60000L; + if (s && *s) { + char* end = NULL; + long n = strtol(s, &end, 10); + if (end != s && n > 0) parsed = n; + } + __atomic_store_n(&_el_http_timeout_ms, parsed, __ATOMIC_RELEASE); + return parsed; +} + +/* Internal: do a libcurl request; takes optional body/headers, optional method override. */ +static el_val_t http_do(const char* method, const char* url, const char* body, + struct curl_slist* extra_headers) { + if (!url || !*url) return http_error_json("empty url"); + CURL* c = curl_easy_init(); + if (!c) return http_error_json("curl_easy_init failed"); + HttpBuf rb; httpbuf_init(&rb); + char errbuf[CURL_ERROR_SIZE]; errbuf[0] = '\0'; + curl_easy_setopt(c, CURLOPT_URL, url); + curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, http_write_cb); + curl_easy_setopt(c, CURLOPT_WRITEDATA, &rb); + curl_easy_setopt(c, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(c, CURLOPT_TIMEOUT_MS, el_http_timeout_ms()); + curl_easy_setopt(c, CURLOPT_NOSIGNAL, 1L); + curl_easy_setopt(c, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(c, CURLOPT_USERAGENT, "el-runtime/1.0"); + if (extra_headers) curl_easy_setopt(c, CURLOPT_HTTPHEADER, extra_headers); + if (method && strcmp(method, "POST") == 0) { + curl_easy_setopt(c, CURLOPT_POST, 1L); + curl_easy_setopt(c, CURLOPT_POSTFIELDS, body ? body : ""); + curl_easy_setopt(c, CURLOPT_POSTFIELDSIZE, (long)(body ? strlen(body) : 0)); + } else if (method && strcmp(method, "DELETE") == 0) { + curl_easy_setopt(c, CURLOPT_CUSTOMREQUEST, "DELETE"); + } + CURLcode rc = curl_easy_perform(c); + curl_easy_cleanup(c); + if (rc != CURLE_OK) { + free(rb.data); + const char* m = errbuf[0] ? errbuf : curl_easy_strerror(rc); + return http_error_json(m); + } + return el_wrap_str(rb.data); +} + +el_val_t http_get(el_val_t url) { + return http_do("GET", EL_CSTR(url), NULL, NULL); +} + +el_val_t http_post(el_val_t url, el_val_t body) { + return http_do("POST", EL_CSTR(url), EL_CSTR(body), NULL); +} + +el_val_t http_post_json(el_val_t url, el_val_t json_body) { + struct curl_slist* h = NULL; + h = curl_slist_append(h, "Content-Type: application/json"); + el_val_t r = http_do("POST", EL_CSTR(url), EL_CSTR(json_body), h); + curl_slist_free_all(h); + return r; +} + +/* Build a curl_slist from an ElMap of name -> value strings. */ +static struct curl_slist* headers_from_map(el_val_t headers_map) { + struct curl_slist* h = NULL; + ElMap* m = as_map(headers_map); + if (!m) return NULL; + for (int64_t i = 0; i < m->count; i++) { + const char* k = EL_CSTR(m->keys[i]); + const char* v = EL_CSTR(m->values[i]); + if (!k || !v) continue; + size_t n = strlen(k) + strlen(v) + 4; + char* line = malloc(n); + if (!line) continue; + snprintf(line, n, "%s: %s", k, v); + h = curl_slist_append(h, line); + free(line); + } + return h; +} + +el_val_t http_get_with_headers(el_val_t url, el_val_t headers_map) { + struct curl_slist* h = headers_from_map(headers_map); + el_val_t r = http_do("GET", EL_CSTR(url), NULL, h); + if (h) curl_slist_free_all(h); + return r; +} + +el_val_t http_post_with_headers(el_val_t url, el_val_t body, el_val_t headers_map) { + struct curl_slist* h = headers_from_map(headers_map); + el_val_t r = http_do("POST", EL_CSTR(url), EL_CSTR(body), h); + if (h) curl_slist_free_all(h); + return r; +} + +el_val_t http_post_form_auth(el_val_t url, el_val_t form_body, el_val_t auth_header) { + struct curl_slist* h = NULL; + h = curl_slist_append(h, "Content-Type: application/x-www-form-urlencoded"); + const char* a = EL_CSTR(auth_header); + if (a && *a) { + size_t n = strlen(a) + 32; + char* line = malloc(n); + snprintf(line, n, "Authorization: %s", a); + h = curl_slist_append(h, line); + free(line); + } + el_val_t r = http_do("POST", EL_CSTR(url), EL_CSTR(form_body), h); + curl_slist_free_all(h); + return r; +} + +/* HTTP DELETE — mirrors http_post but with CURLOPT_CUSTOMREQUEST=DELETE. + * Returns response body on success; on transport failure returns an error + * JSON fragment (same convention as http_get/http_post). Callers that + * expect "" on failure should check for a leading '{' and an "error" key. */ +el_val_t http_delete(el_val_t url) { + return http_do("DELETE", EL_CSTR(url), NULL, NULL); +} + +/* ── HTTP → file streaming ──────────────────────────────────────────────── + * + * Why this exists: el_val_t strings are NUL-terminated by convention, so + * accumulating an HTTP response into an httpbuf and then wrapping its + * `.data` pointer with el_wrap_str() loses the byte length. Any consumer + * that does strlen() on the wrapped pointer truncates the body at the + * first embedded NUL. Audio (MP3, WAV, OGG), images (PNG, JPEG), and any + * other binary payload hits this. The vessels that download such bodies + * (e.g. ElevenLabs TTS → MP3) get silently corrupted files. + * + * The fix: wire libcurl's CURLOPT_WRITEFUNCTION directly to fwrite() + * against a fopen()-ed FILE*. The bytes never pass through an el_val_t + * string, so embedded NULs are preserved verbatim. Caller's contract is + * just "a file at this path with the response body in it". */ + +static size_t http_file_write_cb(char* ptr, size_t size, size_t nmemb, void* ud) { + FILE* f = (FILE*)ud; + return fwrite(ptr, size, nmemb, f); +} + +/* Internal: stream body to file. method is "GET" or "POST". body may be NULL + * (GET) or NUL-terminated (POST). headers may be NULL. Returns 1/0. */ +static el_val_t http_do_to_file(const char* method, const char* url, + const char* body, struct curl_slist* extra_headers, + const char* output_path) { + if (!url || !*url) return 0; + if (!output_path || !*output_path) return 0; + FILE* f = fopen(output_path, "wb"); + if (!f) return 0; + + CURL* c = curl_easy_init(); + if (!c) { fclose(f); remove(output_path); return 0; } + + char errbuf[CURL_ERROR_SIZE]; errbuf[0] = '\0'; + curl_easy_setopt(c, CURLOPT_URL, url); + curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, http_file_write_cb); + curl_easy_setopt(c, CURLOPT_WRITEDATA, f); + curl_easy_setopt(c, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(c, CURLOPT_TIMEOUT_MS, el_http_timeout_ms()); + curl_easy_setopt(c, CURLOPT_NOSIGNAL, 1L); + curl_easy_setopt(c, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(c, CURLOPT_USERAGENT, "el-runtime/1.0"); + curl_easy_setopt(c, CURLOPT_FAILONERROR, 1L); /* 4xx/5xx → CURLE_HTTP_RETURNED_ERROR */ + if (extra_headers) curl_easy_setopt(c, CURLOPT_HTTPHEADER, extra_headers); + + if (method && strcmp(method, "POST") == 0) { + curl_easy_setopt(c, CURLOPT_POST, 1L); + curl_easy_setopt(c, CURLOPT_POSTFIELDS, body ? body : ""); + /* For the request body we still rely on strlen — POST bodies are + * caller-controlled and JSON/text in every known El use case. + * If a future caller needs a binary POST body, add a *_bytes + * variant that takes an explicit length, mirroring fs_write_bytes. */ + curl_easy_setopt(c, CURLOPT_POSTFIELDSIZE, (long)(body ? strlen(body) : 0)); + } + + CURLcode rc = curl_easy_perform(c); + curl_easy_cleanup(c); + + /* Flush + close before signalling success, so the file is fully on disk + * by the time the caller reads back. */ + int flush_ok = (fflush(f) == 0); + int close_ok = (fclose(f) == 0); + + if (rc != CURLE_OK || !flush_ok || !close_ok) { + remove(output_path); + return 0; + } + return 1; +} + +el_val_t http_get_to_file(el_val_t url, el_val_t headers_map, el_val_t output_path) { + struct curl_slist* h = headers_from_map(headers_map); + el_val_t r = http_do_to_file("GET", EL_CSTR(url), NULL, h, EL_CSTR(output_path)); + if (h) curl_slist_free_all(h); + return r; +} + +el_val_t http_post_to_file(el_val_t url, el_val_t body, el_val_t headers_map, el_val_t output_path) { + struct curl_slist* h = headers_from_map(headers_map); + el_val_t r = http_do_to_file("POST", EL_CSTR(url), EL_CSTR(body), h, EL_CSTR(output_path)); + if (h) curl_slist_free_all(h); + return r; +} + +/* ── HTTP server (POSIX sockets + pthreads) ──────────────────────────────── */ + +#define HTTP_MAX_CONNS 64 + +typedef el_val_t (*http_handler_fn)(el_val_t method, el_val_t path, el_val_t body); + +typedef struct { + char* name; + http_handler_fn fn; +} HttpHandlerEntry; + +static HttpHandlerEntry _http_handlers[32]; +static size_t _http_handler_count = 0; +static char* _http_active_handler = NULL; +static pthread_mutex_t _http_handler_mu = PTHREAD_MUTEX_INITIALIZER; + +static pthread_mutex_t _http_conn_mu = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t _http_conn_cv = PTHREAD_COND_INITIALIZER; +static int _http_conn_active = 0; + +/* Public C-level API: register a handler by name. Programs that want El + * `http_serve` to dispatch into their handler call this from main() before + * http_serve. Not declared in the header to keep the public API minimal — + * extern lookup works since C symbols are global. */ +void el_runtime_register_handler(const char* name, http_handler_fn fn); +void el_runtime_register_handler(const char* name, http_handler_fn fn) { + if (!name || !fn) return; + pthread_mutex_lock(&_http_handler_mu); + for (size_t i = 0; i < _http_handler_count; i++) { + if (strcmp(_http_handlers[i].name, name) == 0) { + _http_handlers[i].fn = fn; + pthread_mutex_unlock(&_http_handler_mu); + return; + } + } + if (_http_handler_count < sizeof(_http_handlers) / sizeof(_http_handlers[0])) { + _http_handlers[_http_handler_count].name = el_strdup(name); + _http_handlers[_http_handler_count].fn = fn; + _http_handler_count++; + } + pthread_mutex_unlock(&_http_handler_mu); +} + +void http_set_handler(el_val_t name) { + const char* n = EL_CSTR(name); + pthread_mutex_lock(&_http_handler_mu); + free(_http_active_handler); + _http_active_handler = el_strdup(n ? n : ""); + /* If the name is not yet in the registry, try dlsym lookup against + * the running binary's symbol table. Every El `fn name(...)` compiles + * to a global C symbol with that exact name, so El programs can self- + * register their own handlers just by calling http_set_handler("name"). */ + if (n && *n) { + int found = 0; + for (size_t i = 0; i < _http_handler_count; i++) { + if (strcmp(_http_handlers[i].name, n) == 0) { found = 1; break; } + } + if (!found) { + void* sym = dlsym(RTLD_DEFAULT, n); + if (sym && _http_handler_count < sizeof(_http_handlers) / sizeof(_http_handlers[0])) { + _http_handlers[_http_handler_count].name = el_strdup(n); + _http_handlers[_http_handler_count].fn = (http_handler_fn)sym; + _http_handler_count++; + } + } + } + pthread_mutex_unlock(&_http_handler_mu); +} + +static http_handler_fn http_lookup_active(void) { + http_handler_fn out = NULL; + pthread_mutex_lock(&_http_handler_mu); + if (_http_active_handler) { + for (size_t i = 0; i < _http_handler_count; i++) { + if (strcmp(_http_handlers[i].name, _http_active_handler) == 0) { + out = _http_handlers[i].fn; break; + } + } + } + pthread_mutex_unlock(&_http_handler_mu); + return out; +} + +/* Auto-detect Content-Type from response body. */ +static const char* http_detect_content_type(const char* body) { + if (!body) return "text/plain; charset=utf-8"; + const char* p = body; + /* Binary magic bytes — check before stripping whitespace */ + if ((unsigned char)p[0] == 0x89 && p[1]=='P' && p[2]=='N' && p[3]=='G') + return "image/png"; + if ((unsigned char)p[0] == 0xFF && (unsigned char)p[1] == 0xD8) + return "image/jpeg"; + if (strncmp(p, "GIF8", 4) == 0) return "image/gif"; + if (strncmp(p, "RIFF", 4) == 0) return "image/webp"; + if (strncmp(p, "wOFF", 4) == 0) return "font/woff"; + if (strncmp(p, "wOF2", 4) == 0) return "font/woff2"; + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + if (strncasecmp(p, "= cap) { + if (cap >= 1024 * 1024) { free(buf); return -1; } + cap *= 2; + buf = realloc(buf, cap); + if (!buf) return -1; + } + ssize_t n = recv(fd, buf + len, cap - len - 1, 0); + if (n <= 0) { free(buf); return -1; } + len += (size_t)n; + buf[len] = '\0'; + if (strstr(buf, "\r\n\r\n")) break; + } + /* Parse request line */ + char* sp1 = strchr(buf, ' '); + if (!sp1) { free(buf); return -1; } + *sp1 = '\0'; + *out_method = el_strdup(buf); + char* path_start = sp1 + 1; + char* sp2 = strchr(path_start, ' '); + if (!sp2) { free(*out_method); *out_method = NULL; free(buf); return -1; } + *sp2 = '\0'; + *out_path = el_strdup(path_start); + char* hdr_end = strstr(sp2 + 1, "\r\n\r\n"); + /* Capture the raw header block (after the request line's CRLF, up to + * but not including the terminating \r\n\r\n) for callers that asked + * for it. The legacy 3-arg path passes NULL and skips this. */ + if (out_headers_block) { + char* hdr_start = strstr(sp2 + 1, "\r\n"); + if (hdr_start && hdr_start < hdr_end) { + hdr_start += 2; + size_t hb_len = (size_t)(hdr_end - hdr_start); + char* hb = malloc(hb_len + 1); + if (hb) { + memcpy(hb, hdr_start, hb_len); + hb[hb_len] = '\0'; + *out_headers_block = hb; + } + } else { + *out_headers_block = el_strdup(""); + } + } + /* Find Content-Length */ + long content_length = 0; + char* hp = sp2 + 1; + while (hp < hdr_end) { + char* line_end = strstr(hp, "\r\n"); + /* line_end == hdr_end means we're on the LAST header line — its + * trailing \r\n is the same \r\n that begins the \r\n\r\n header + * terminator. Process this line; only stop when line_end is past + * hdr_end (which means the parser walked off the end of the + * header block). The previous condition (line_end >= hdr_end) + * silently dropped any Content-Length that appeared as the last + * header — exactly what real curl/clients tend to emit. */ + if (!line_end || line_end > hdr_end) break; + if (strncasecmp(hp, "Content-Length:", 15) == 0) { + content_length = strtol(hp + 15, NULL, 10); + if (content_length < 0) content_length = 0; + if (content_length > 64 * 1024 * 1024) content_length = 64 * 1024 * 1024; + } + hp = line_end + 2; + } + /* Body: any bytes already read past hdr_end, plus more recv */ + char* body_start = hdr_end + 4; + size_t body_have = (buf + len) - body_start; + char* body = malloc((size_t)content_length + 1); + if (!body) { free(*out_method); free(*out_path); *out_method=NULL; *out_path=NULL; free(buf); return -1; } + if ((long)body_have > content_length) body_have = (size_t)content_length; + if (body_have > 0) memcpy(body, body_start, body_have); + while ((long)body_have < content_length) { + ssize_t n = recv(fd, body + body_have, (size_t)content_length - body_have, 0); + if (n <= 0) break; + body_have += (size_t)n; + } + body[body_have] = '\0'; + *out_body = body; + free(buf); + return 0; +} + +/* Reason phrase for common HTTP statuses. Falls back to "Status" for the + * long tail — clients only care about the numeric code. */ +static const char* http_reason_phrase(int status) { + switch (status) { + case 200: return "OK"; + case 201: return "Created"; + case 202: return "Accepted"; + case 204: return "No Content"; + case 301: return "Moved Permanently"; + case 302: return "Found"; + case 303: return "See Other"; + case 304: return "Not Modified"; + case 307: return "Temporary Redirect"; + case 308: return "Permanent Redirect"; + case 400: return "Bad Request"; + case 401: return "Unauthorized"; + case 403: return "Forbidden"; + case 404: return "Not Found"; + case 405: return "Method Not Allowed"; + case 409: return "Conflict"; + case 410: return "Gone"; + case 422: return "Unprocessable Entity"; + case 429: return "Too Many Requests"; + case 500: return "Internal Server Error"; + case 501: return "Not Implemented"; + case 502: return "Bad Gateway"; + case 503: return "Service Unavailable"; + case 504: return "Gateway Timeout"; + default: return "Status"; + } +} + +/* Best-effort send with retry on partial writes. */ +static int http_send_all(int fd, const char* p, size_t left) { + while (left > 0) { + ssize_t w = send(fd, p, left, 0); + if (w <= 0) return -1; + p += w; left -= (size_t)w; + } + return 0; +} + +/* Discriminator that http_response() embeds at the start of its envelope. + * A handler returning a string starting with this exact prefix is treated + * as a structured response; anything else is treated as a raw body. */ +#define EL_HTTP_RESPONSE_TAG "{\"el_http_response\":1" + +/* Keys that conflict with runtime-managed headers are silently dropped to + * avoid double-emission — the runtime always emits its own Content-Length + * and Connection: close. Content-Type from the envelope IS allowed and + * overrides auto-detection. */ +static int http_header_is_managed(const char* k) { + return strcasecmp(k, "Content-Length") == 0 + || strcasecmp(k, "Connection") == 0; +} + +/* Walk an ElMap of header pairs and emit each as `K: V\r\n` into JsonBuf b. + * Sets *out_saw_content_type to 1 if the map contained an explicit + * Content-Type so the caller can skip auto-detection. */ +static void http_emit_headers_from_map(JsonBuf* b, el_val_t headers_map, + int* out_saw_content_type) { + *out_saw_content_type = 0; + if (headers_map == 0) return; + ElMap* m = (ElMap*)(uintptr_t)headers_map; + if (!m || m->hdr.magic != EL_MAGIC_MAP) return; + for (int64_t i = 0; i < m->count; i++) { + const char* k = EL_CSTR(m->keys[i]); + const char* v = EL_CSTR(m->values[i]); + if (!k || !v) continue; + if (http_header_is_managed(k)) continue; + if (strcasecmp(k, "Content-Type") == 0) *out_saw_content_type = 1; + jb_puts(b, k); + jb_puts(b, ": "); + jb_puts(b, v); + jb_puts(b, "\r\n"); + } +} + +/* Parse the envelope produced by http_response(). On success returns 1 and + * populates *out_status, *out_headers_map (an ElMap el_val_t — caller must + * el_release), and *out_body (allocated). On failure returns 0. + * + * Implementation: feeds the entire envelope through the recursive-descent + * JSON parser (which builds proper ElMap/ElList values), then pulls the + * three top-level fields by name. Avoids re-stringifying the headers map + * since json_stringify() does not support nested objects. */ +static int http_parse_envelope(const char* s, int* out_status, + el_val_t* out_headers_map, char** out_body, + el_val_t* out_parsed_root) { + if (!s) return 0; + if (strncmp(s, EL_HTTP_RESPONSE_TAG, + sizeof(EL_HTTP_RESPONSE_TAG) - 1) != 0) return 0; + + el_val_t parsed = json_parse(EL_STR(s)); + if (parsed == EL_NULL) return 0; + + int status = 200; + el_val_t hmap = 0; + char* body = NULL; + + el_val_t sv = el_map_get(parsed, EL_STR("status")); + if (sv != 0) { + /* status comes back as an integer — el_val_t holds it directly. */ + long sc = (long)sv; + if (sc >= 100 && sc <= 599) status = (int)sc; + } + + el_val_t hv = el_map_get(parsed, EL_STR("headers")); + if (hv != 0) { + ElMap* hm = (ElMap*)(uintptr_t)hv; + if (hm && hm->hdr.magic == EL_MAGIC_MAP) hmap = hv; + } + + el_val_t bv = el_map_get(parsed, EL_STR("body")); + if (bv != 0) { + const char* bs = EL_CSTR(bv); + if (bs) body = el_strdup(bs); + } + if (!body) body = el_strdup(""); + + *out_status = status; + *out_headers_map = hmap; + *out_body = body; + *out_parsed_root = parsed; /* caller releases to free hmap + entries */ + return 1; +} + +/* Send a fully-built HTTP response. If `body` starts with the envelope tag, + * unpack status/headers/body. Otherwise emit the historical 200-OK with + * auto-detected Content-Type. */ +static void http_send_response(int fd, const char* body) { + if (!body) body = ""; + + int status = 200; + el_val_t env_headers_map = 0; + char* env_body = NULL; + el_val_t env_parsed_root = 0; + int is_envelope = http_parse_envelope(body, &status, + &env_headers_map, &env_body, + &env_parsed_root); + + const char* eff_body = is_envelope ? env_body : body; + /* Use the real byte count from fs_read if available (handles binary files + * with embedded null bytes — PNG, WOFF2, etc.). Fall back to strlen for + * normal text/JSON responses where _tl_fs_read_len is 0. */ + size_t blen = (_tl_fs_read_len > 0) ? _tl_fs_read_len : strlen(eff_body); + _tl_fs_read_len = 0; /* consume — one-shot per response */ + + JsonBuf hdrs; jb_init(&hdrs); + int saw_content_type = 0; + if (is_envelope) { + http_emit_headers_from_map(&hdrs, env_headers_map, + &saw_content_type); + } + if (!saw_content_type) { + jb_puts(&hdrs, "Content-Type: "); + jb_puts(&hdrs, http_detect_content_type(eff_body)); + jb_puts(&hdrs, "\r\n"); + } + + char status_line[64]; + int sl = snprintf(status_line, sizeof(status_line), + "HTTP/1.1 %d %s\r\n", + status, http_reason_phrase(status)); + if (sl < 0) { + if (env_parsed_root) el_release(env_parsed_root); + free(env_body); free(hdrs.buf); return; + } + + char tail[128]; + int tl = snprintf(tail, sizeof(tail), + "Content-Length: %zu\r\n" + "Connection: close\r\n" + "\r\n", blen); + if (tl < 0) { + if (env_parsed_root) el_release(env_parsed_root); + free(env_body); free(hdrs.buf); return; + } + + if (http_send_all(fd, status_line, (size_t)sl) == 0 + && http_send_all(fd, hdrs.buf, hdrs.len) == 0 + && http_send_all(fd, tail, (size_t)tl) == 0 + && http_send_all(fd, eff_body, blen) == 0) { + /* sent successfully */ + } + + if (env_parsed_root) el_release(env_parsed_root); + free(env_body); + free(hdrs.buf); +} + +typedef struct { + int fd; +} HttpWorkerArg; + +static void* http_worker(void* arg) { + HttpWorkerArg* a = (HttpWorkerArg*)arg; + int fd = a->fd; + free(a); + char *method = NULL, *path = NULL, *body = NULL; + if (http_read_request(fd, &method, &path, &body, NULL) == 0) { + http_handler_fn h = http_lookup_active(); + char* response = NULL; + el_request_start(); /* begin per-request arena */ + if (h) { + el_val_t r = h(EL_STR(method), EL_STR(path), EL_STR(body)); + const char* rs = EL_CSTR(r); + /* Copy response out BEFORE arena teardown. + * For binary files, _tl_fs_read_len holds the real byte count — + * use memcpy instead of strdup so null bytes are preserved. */ + size_t rlen = _tl_fs_read_len > 0 ? _tl_fs_read_len : (rs ? strlen(rs) : 0); + response = malloc(rlen + 1); + if (response && rs) { memcpy(response, rs, rlen); response[rlen] = '\0'; } + else if (response) { response[0] = '\0'; } + } else { + response = el_strdup_persist("el-runtime: no http handler registered"); + } + el_request_end(); /* free all intermediate strings */ + http_send_response(fd, response); + free(response); + } + free(method); free(path); free(body); + close(fd); + /* release a slot */ + pthread_mutex_lock(&_http_conn_mu); + _http_conn_active--; + pthread_cond_signal(&_http_conn_cv); + pthread_mutex_unlock(&_http_conn_mu); + return NULL; +} + +void http_serve(el_val_t port, el_val_t handler) { + /* If `handler` looks like a string name, register it as the active handler. */ + const char* hname = EL_CSTR(handler); + if (hname && looks_like_string(handler)) { + http_set_handler(handler); + } + int p = (int)port; + if (p <= 0 || p > 65535) { fprintf(stderr, "http_serve: invalid port %d\n", p); return; } + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { perror("socket"); return; } + int yes = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons((uint16_t)p); + if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + perror("bind"); close(sock); return; + } + if (listen(sock, 64) < 0) { perror("listen"); close(sock); return; } + fprintf(stderr, "[http] listening on 0.0.0.0:%d\n", p); + while (1) { + struct sockaddr_in cli; + socklen_t clen = sizeof(cli); + int cfd = accept(sock, (struct sockaddr*)&cli, &clen); + if (cfd < 0) { + if (errno == EINTR) continue; + perror("accept"); break; + } + pthread_mutex_lock(&_http_conn_mu); + while (_http_conn_active >= HTTP_MAX_CONNS) { + pthread_cond_wait(&_http_conn_cv, &_http_conn_mu); + } + _http_conn_active++; + pthread_mutex_unlock(&_http_conn_mu); + HttpWorkerArg* arg = malloc(sizeof(HttpWorkerArg)); + if (!arg) { close(cfd); continue; } + arg->fd = cfd; + pthread_t tid; + if (pthread_create(&tid, NULL, http_worker, arg) != 0) { + close(cfd); free(arg); + pthread_mutex_lock(&_http_conn_mu); + _http_conn_active--; + pthread_cond_signal(&_http_conn_cv); + pthread_mutex_unlock(&_http_conn_mu); + continue; + } + pthread_detach(tid); + } + close(sock); +} + +/* ── HTTP server v2 — request headers + structured response ──────────────── */ +/* + * v2 widens the handler signature from + * (method, path, body) -> body_string + * to + * (method, path, headers_map, body) -> body_string_or_envelope + * + * The response envelope is detected uniformly inside http_send_response — so + * 4-arg handlers can return either a plain body or http_response(...). The + * 3-arg path stays untouched in spirit (its handlers still build plain + * bodies; the envelope tag, being `{"el_http_response":1`, will never + * collide with normal JSON the legacy server.el routes return). + * + * Registry is parallel to the 3-arg handler registry: separate name table, + * separate active-handler slot, separate dlsym fallback. Mixing v1 and v2 + * handlers in the same process is fine — they don't share the active slot. */ + +typedef el_val_t (*http_handler4_fn)(el_val_t method, el_val_t path, + el_val_t headers_map, el_val_t body); + +typedef struct { + char* name; + http_handler4_fn fn; +} HttpHandler4Entry; + +static HttpHandler4Entry _http_handlers4[32]; +static size_t _http_handler4_count = 0; +static char* _http_active_handler4 = NULL; + +void el_runtime_register_handler_v2(const char* name, http_handler4_fn fn); +void el_runtime_register_handler_v2(const char* name, http_handler4_fn fn) { + if (!name || !fn) return; + pthread_mutex_lock(&_http_handler_mu); + for (size_t i = 0; i < _http_handler4_count; i++) { + if (strcmp(_http_handlers4[i].name, name) == 0) { + _http_handlers4[i].fn = fn; + pthread_mutex_unlock(&_http_handler_mu); + return; + } + } + if (_http_handler4_count < + sizeof(_http_handlers4) / sizeof(_http_handlers4[0])) { + _http_handlers4[_http_handler4_count].name = el_strdup(name); + _http_handlers4[_http_handler4_count].fn = fn; + _http_handler4_count++; + } + pthread_mutex_unlock(&_http_handler_mu); +} + +void http_set_handler_v2(el_val_t name) { + const char* n = EL_CSTR(name); + pthread_mutex_lock(&_http_handler_mu); + free(_http_active_handler4); + _http_active_handler4 = el_strdup(n ? n : ""); + if (n && *n) { + int found = 0; + for (size_t i = 0; i < _http_handler4_count; i++) { + if (strcmp(_http_handlers4[i].name, n) == 0) { found = 1; break; } + } + if (!found) { + void* sym = dlsym(RTLD_DEFAULT, n); + if (sym && _http_handler4_count < + sizeof(_http_handlers4) / sizeof(_http_handlers4[0])) { + _http_handlers4[_http_handler4_count].name = el_strdup(n); + _http_handlers4[_http_handler4_count].fn = + (http_handler4_fn)sym; + _http_handler4_count++; + } + } + } + pthread_mutex_unlock(&_http_handler_mu); +} + +static http_handler4_fn http_lookup_active_v2(void) { + http_handler4_fn out = NULL; + pthread_mutex_lock(&_http_handler_mu); + if (_http_active_handler4) { + for (size_t i = 0; i < _http_handler4_count; i++) { + if (strcmp(_http_handlers4[i].name, + _http_active_handler4) == 0) { + out = _http_handlers4[i].fn; break; + } + } + } + pthread_mutex_unlock(&_http_handler_mu); + return out; +} + +/* Build an ElMap from the raw header block produced by http_read_request. + * Keys are lowercased (RFC 7230 — case-insensitive); values have leading + * whitespace trimmed. Repeated headers with the same name are joined with + * ", " in arrival order, matching standard library behaviour elsewhere. */ +static el_val_t http_build_headers_map(const char* hdr_block) { + el_val_t m = el_map_new(0); + if (!hdr_block || !*hdr_block) return m; + const char* p = hdr_block; + while (*p) { + const char* line_end = strstr(p, "\r\n"); + const char* end = line_end ? line_end : p + strlen(p); + const char* colon = NULL; + for (const char* c = p; c < end; c++) { + if (*c == ':') { colon = c; break; } + } + if (colon && colon > p) { + size_t klen = (size_t)(colon - p); + char* key = malloc(klen + 1); + if (key) { + for (size_t i = 0; i < klen; i++) { + unsigned char ch = (unsigned char)p[i]; + key[i] = (char)tolower(ch); + } + key[klen] = '\0'; + const char* vstart = colon + 1; + while (vstart < end && (*vstart == ' ' || *vstart == '\t')) vstart++; + size_t vlen = (size_t)(end - vstart); + /* Strip trailing OWS just in case. */ + while (vlen > 0 + && (vstart[vlen - 1] == ' ' + || vstart[vlen - 1] == '\t')) vlen--; + /* Coalesce repeats: if key already present, append ", value". */ + el_val_t existing = el_map_get(m, EL_STR(key)); + if (existing != 0 && looks_like_string(existing)) { + const char* old = EL_CSTR(existing); + size_t olen = strlen(old); + char* combined = malloc(olen + 2 + vlen + 1); + if (combined) { + memcpy(combined, old, olen); + memcpy(combined + olen, ", ", 2); + memcpy(combined + olen + 2, vstart, vlen); + combined[olen + 2 + vlen] = '\0'; + m = el_map_set(m, EL_STR(key), EL_STR(combined)); + } + free(key); + } else { + char* val = malloc(vlen + 1); + if (val) { + memcpy(val, vstart, vlen); + val[vlen] = '\0'; + m = el_map_set(m, EL_STR(key), EL_STR(val)); + } else { + free(key); + } + } + } + } + if (!line_end) break; + p = line_end + 2; + } + return m; +} + +static void* http_worker_v2(void* arg) { + HttpWorkerArg* a = (HttpWorkerArg*)arg; + int fd = a->fd; + free(a); + char *method = NULL, *path = NULL, *body = NULL, *hdr_block = NULL; + if (http_read_request(fd, &method, &path, &body, &hdr_block) == 0) { + http_handler4_fn h = http_lookup_active_v2(); + char* response = NULL; + el_request_start(); /* begin per-request arena */ + if (h) { + el_val_t hmap = http_build_headers_map(hdr_block ? hdr_block : ""); + el_val_t r = h(EL_STR(method), EL_STR(path), hmap, EL_STR(body)); + const char* rs = EL_CSTR(r); + size_t rlen = _tl_fs_read_len > 0 ? _tl_fs_read_len : (rs ? strlen(rs) : 0); + response = malloc(rlen + 1); + if (response && rs) { memcpy(response, rs, rlen); response[rlen] = '\0'; } + else if (response) { response[0] = '\0'; } + el_release(hmap); + } else { + response = el_strdup_persist( + "el-runtime: no v2 http handler registered " + "(call http_set_handler_v2)"); + } + el_request_end(); /* free all intermediate strings */ + http_send_response(fd, response); + free(response); + } + free(method); free(path); free(body); free(hdr_block); + close(fd); + pthread_mutex_lock(&_http_conn_mu); + _http_conn_active--; + pthread_cond_signal(&_http_conn_cv); + pthread_mutex_unlock(&_http_conn_mu); + return NULL; +} + +void http_serve_v2(el_val_t port, el_val_t handler) { + const char* hname = EL_CSTR(handler); + if (hname && looks_like_string(handler)) { + http_set_handler_v2(handler); + } + int p = (int)port; + if (p <= 0 || p > 65535) { + fprintf(stderr, "http_serve_v2: invalid port %d\n", p); + return; + } + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { perror("socket"); return; } + int yes = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons((uint16_t)p); + if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + perror("bind"); close(sock); return; + } + if (listen(sock, 64) < 0) { perror("listen"); close(sock); return; } + fprintf(stderr, "[http v2] listening on 0.0.0.0:%d\n", p); + while (1) { + struct sockaddr_in cli; + socklen_t clen = sizeof(cli); + int cfd = accept(sock, (struct sockaddr*)&cli, &clen); + if (cfd < 0) { + if (errno == EINTR) continue; + perror("accept"); break; + } + pthread_mutex_lock(&_http_conn_mu); + while (_http_conn_active >= HTTP_MAX_CONNS) { + pthread_cond_wait(&_http_conn_cv, &_http_conn_mu); + } + _http_conn_active++; + pthread_mutex_unlock(&_http_conn_mu); + HttpWorkerArg* arg = malloc(sizeof(HttpWorkerArg)); + if (!arg) { close(cfd); continue; } + arg->fd = cfd; + pthread_t tid; + if (pthread_create(&tid, NULL, http_worker_v2, arg) != 0) { + close(cfd); free(arg); + pthread_mutex_lock(&_http_conn_mu); + _http_conn_active--; + pthread_cond_signal(&_http_conn_cv); + pthread_mutex_unlock(&_http_conn_mu); + continue; + } + pthread_detach(tid); + } + close(sock); +} + +/* Build the response envelope a 4-arg handler can return. We hand-write + * the JSON so the discriminator key always lands first — the runtime's + * http_parse_envelope() detects it via prefix match. headers_json must be + * either "" (empty), "{}" (empty object), or a well-formed JSON object + * literal; anything else will produce a malformed envelope and the runtime + * will treat the whole string as a plain body (no envelope detected). */ +el_val_t http_response(el_val_t status, el_val_t headers_json, el_val_t body) { + long sc = (long)status; + if (sc < 100 || sc > 599) sc = 200; + const char* hj = EL_CSTR(headers_json); + if (!hj || !*hj) hj = "{}"; + /* Light validation: must start with '{' and end with '}'. */ + size_t hlen = strlen(hj); + int hj_ok = (hlen >= 2 && hj[0] == '{' && hj[hlen - 1] == '}'); + if (!hj_ok) hj = "{}"; + const char* b = EL_CSTR(body); + if (!b) b = ""; + + JsonBuf out; jb_init(&out); + jb_puts(&out, EL_HTTP_RESPONSE_TAG); /* {"el_http_response":1 */ + jb_puts(&out, ",\"status\":"); + char num[32]; + snprintf(num, sizeof(num), "%ld", sc); + jb_puts(&out, num); + jb_puts(&out, ",\"headers\":"); + jb_puts(&out, hj); + jb_puts(&out, ",\"body\":"); + jb_emit_escaped(&out, b); + jb_putc(&out, '}'); + return el_wrap_str(out.buf); +} + +/* ── Filesystem ──────────────────────────────────────────────────────────── */ + +el_val_t fs_read(el_val_t pathv) { + const char* path = EL_CSTR(pathv); + _tl_fs_read_len = 0; + if (!path) return el_wrap_str(el_strdup("")); + FILE* f = fopen(path, "rb"); + if (!f) return el_wrap_str(el_strdup("")); + fseek(f, 0, SEEK_END); + long sz = ftell(f); + rewind(f); + if (sz < 0) { fclose(f); return el_wrap_str(el_strdup("")); } /* pipe/special file */ + char* buf = el_strbuf((size_t)sz); + size_t got = fread(buf, 1, (size_t)sz, f); + buf[got] = '\0'; + _tl_fs_read_len = got; /* store real byte count for binary-safe send */ + fclose(f); + return el_wrap_str(buf); +} + +el_val_t fs_write(el_val_t pathv, el_val_t contentv) { + const char* path = EL_CSTR(pathv); + const char* content = EL_CSTR(contentv); + if (!path || !content) return 0; + FILE* f = fopen(path, "wb"); + if (!f) return 0; + size_t n = strlen(content); + size_t written = fwrite(content, 1, n, f); + fclose(f); + return written == n ? 1 : 0; +} + +/* fs_write_bytes — explicit-length binary write. Bypasses strlen so embedded + * NULs survive. Caller must know the byte count (e.g. from base64_decode, + * or the fixed 32-byte sha256_bytes/hmac_sha256_bytes outputs). + * + * If `length` is negative, treats as failure. If `length` is 0, creates an + * empty file (still useful as a "touch with content" primitive). */ +el_val_t fs_write_bytes(el_val_t pathv, el_val_t bytesv, el_val_t lengthv) { + const char* path = EL_CSTR(pathv); + const char* bytes = EL_CSTR(bytesv); + int64_t n = (int64_t)lengthv; + if (!path || !bytes) return 0; + if (n < 0) return 0; + FILE* f = fopen(path, "wb"); + if (!f) return 0; + size_t written = (n > 0) ? fwrite(bytes, 1, (size_t)n, f) : 0; + int flush_ok = (fflush(f) == 0); + int close_ok = (fclose(f) == 0); + if (!flush_ok || !close_ok || written != (size_t)n) { + remove(path); + return 0; + } + return 1; +} + +el_val_t fs_list(el_val_t pathv) { + const char* path = EL_CSTR(pathv); + el_val_t lst = el_list_empty(); + if (!path) return lst; + DIR* d = opendir(path); + if (!d) return lst; + struct dirent* e; + while ((e = readdir(d)) != NULL) { + if (strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0) continue; + lst = el_list_append(lst, el_wrap_str(el_strdup(e->d_name))); + } + closedir(d); + return lst; +} + +/* fs_exists — true iff stat(path) succeeds. Symlinks are followed. */ +el_val_t fs_exists(el_val_t pathv) { + const char* path = EL_CSTR(pathv); + if (!path || !*path) return 0; + struct stat st; + return (el_val_t)(stat(path, &st) == 0 ? 1 : 0); +} + +/* fs_mkdir — create directory at path with mode 0755, mkdir -p semantics. + * Returns 1 if path exists or was created (incl. all parents); 0 on failure. + * Walks the path component-by-component so missing intermediate dirs are + * also created. An existing leaf is not an error. */ +el_val_t fs_mkdir(el_val_t pathv) { + const char* path = EL_CSTR(pathv); + if (!path || !*path) return 0; + size_t n = strlen(path); + char* buf = malloc(n + 1); + if (!buf) return 0; + memcpy(buf, path, n + 1); + /* Walk components; create each prefix in turn. */ + for (size_t i = 1; i <= n; i++) { + if (buf[i] == '/' || buf[i] == '\0') { + char saved = buf[i]; + buf[i] = '\0'; + if (buf[0] != '\0') { + if (mkdir(buf, 0755) != 0 && errno != EEXIST) { + /* Tolerate the case where this prefix exists as a non-dir + * only when stat says it's a directory. */ + struct stat st; + if (stat(buf, &st) != 0 || !S_ISDIR(st.st_mode)) { + free(buf); + return 0; + } + } + } + buf[i] = saved; + } + } + free(buf); + return 1; +} + +/* ── URL encoding ─────────────────────────────────────────────────────────── */ + +/* RFC 3986 percent-encoding for URL components (form bodies, query strings). + * Unreserved set: A-Z a-z 0-9 - _ . ~ — passed through verbatim. + * Everything else (including space) becomes %XX hex. */ +el_val_t url_encode(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return el_wrap_str(el_strdup("")); + static const char hex[] = "0123456789ABCDEF"; + size_t n = strlen(s); + char* out = el_strbuf(n * 3); + size_t o = 0; + for (size_t i = 0; i < n; i++) { + unsigned char c = (unsigned char)s[i]; + if ((c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || + c == '-' || c == '_' || c == '.' || c == '~') { + out[o++] = (char)c; + } else { + out[o++] = '%'; + out[o++] = hex[(c >> 4) & 0xF]; + out[o++] = hex[c & 0xF]; + } + } + out[o] = '\0'; + return el_wrap_str(out); +} + +/* Decode percent-encoded URL component. '+' becomes space (form-encoded); + * malformed %-escapes are emitted verbatim. */ +el_val_t url_decode(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return el_wrap_str(el_strdup("")); + size_t n = strlen(s); + char* out = el_strbuf(n); + size_t o = 0; + for (size_t i = 0; i < n; i++) { + char c = s[i]; + if (c == '+') { + out[o++] = ' '; + } else if (c == '%' && i + 2 < n) { + char h1 = s[i + 1], h2 = s[i + 2]; + int v1 = (h1 >= '0' && h1 <= '9') ? h1 - '0' + : (h1 >= 'a' && h1 <= 'f') ? h1 - 'a' + 10 + : (h1 >= 'A' && h1 <= 'F') ? h1 - 'A' + 10 : -1; + int v2 = (h2 >= '0' && h2 <= '9') ? h2 - '0' + : (h2 >= 'a' && h2 <= 'f') ? h2 - 'a' + 10 + : (h2 >= 'A' && h2 <= 'F') ? h2 - 'A' + 10 : -1; + if (v1 >= 0 && v2 >= 0) { + out[o++] = (char)((v1 << 4) | v2); + i += 2; + } else { + out[o++] = c; + } + } else { + out[o++] = c; + } + } + out[o] = '\0'; + return el_wrap_str(out); +} + +/* ── JSON ────────────────────────────────────────────────────────────────── */ + +el_val_t json_get(el_val_t jsonv, el_val_t keyv) { + const char* json = EL_CSTR(jsonv); + const char* key = EL_CSTR(keyv); + if (!json || !key) return el_wrap_str(el_strdup("")); + size_t klen = strlen(key); + /* Use a stack buffer for the pattern to avoid arena double-free. + * Keys in El maps are typically short; 512 bytes is a safe upper bound. */ + char stack_pat[512]; + char* pattern; + if (klen + 5 <= sizeof(stack_pat)) { + pattern = stack_pat; + } else { + pattern = malloc(klen + 5); + if (!pattern) return el_wrap_str(el_strdup("")); + } + snprintf(pattern, klen + 5, "\"%s\":", key); + const char* p = strstr(json, pattern); + if (pattern != stack_pat) free(pattern); + if (!p) return el_wrap_str(el_strdup("")); + p += strlen(key) + 3; /* skip "key": */ + while (*p == ' ' || *p == '\t' || *p == '\n') p++; + if (*p == '"') { + p++; + /* Unescape the JSON string value into a clean buffer. */ + size_t cap = strlen(p) + 1; + char* out = el_strbuf(cap); + char* w = out; + while (*p && *p != '"') { + if (*p == '\\' && *(p+1)) { + p++; + switch (*p) { + case '"': *w++ = '"'; break; + case '\\': *w++ = '\\'; break; + case '/': *w++ = '/'; break; + case 'n': *w++ = '\n'; break; + case 'r': *w++ = '\r'; break; + case 't': *w++ = '\t'; break; + default: *w++ = *p; break; + } + } else { + *w++ = *p; + } + p++; + } + *w = '\0'; + return el_wrap_str(out); + } + const char* start = p; + while (*p && *p != ',' && *p != '}' && *p != ']' && *p != '\n') p++; + size_t len = (size_t)(p - start); + char* out = el_strbuf(len); + memcpy(out, start, len); + out[len] = '\0'; + return el_wrap_str(out); +} + +/* ── Float bit-cast helpers ──────────────────────────────────────────────── */ +/* `el_to_float` and `el_from_float` are exposed in el_runtime.h as static + * inlines so generated programs (which #include the header) can call them + * for Float literals. No definitions are needed here. */ + +/* ── JSON parser (recursive descent) ─────────────────────────────────────── */ +/* + * Parsed JSON representation: + * - object -> ElMap (keys & values are el_val_t) + * - array -> ElList + * - string -> EL_STR-wrapped char* (allocated) + * - number -> int (el_val_t) if integer, otherwise el_from_float(double) + * - true -> 1 + * - false -> 0 + * - null -> EL_NULL (0) + * + * Note: there is no runtime type tag — parsed numbers cannot be + * distinguished from booleans by the runtime alone. The codegen tracks + * types separately. This matches the rest of el_val_t's type-erased model. + */ + +/* JsonParser struct is forward-declared near the HTTP/Engram section. */ + +static void jp_skip_ws(JsonParser* jp) { + while (jp->p < jp->end) { + char c = *jp->p; + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') jp->p++; + else break; + } +} + +static el_val_t jp_parse_value(JsonParser* jp); + +/* Parse a JSON string literal (the opening " has NOT yet been consumed). */ +static char* jp_parse_string_raw(JsonParser* jp) { + if (jp->p >= jp->end || *jp->p != '"') { jp->err = 1; return el_strdup(""); } + jp->p++; + size_t cap = 32, len = 0; + char* out = malloc(cap); + if (!out) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + while (jp->p < jp->end && *jp->p != '"') { + char c = *jp->p++; + if (c == '\\' && jp->p < jp->end) { + char esc = *jp->p++; + switch (esc) { + case '"': c = '"'; break; + case '\\': c = '\\'; break; + case '/': c = '/'; break; + case 'b': c = '\b'; break; + case 'f': c = '\f'; break; + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case 'u': { + /* Skip 4 hex digits; emit '?' as a placeholder */ + for (int i = 0; i < 4 && jp->p < jp->end; i++) jp->p++; + c = '?'; + break; + } + default: c = esc; break; + } + } + if (len + 1 >= cap) { + cap *= 2; + out = realloc(out, cap); + if (!out) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + } + out[len++] = c; + } + if (jp->p < jp->end && *jp->p == '"') jp->p++; + else jp->err = 1; + out[len] = '\0'; + return out; +} + +static el_val_t jp_parse_number(JsonParser* jp) { + const char* start = jp->p; + int is_float = 0; + if (jp->p < jp->end && (*jp->p == '-' || *jp->p == '+')) jp->p++; + while (jp->p < jp->end && isdigit((unsigned char)*jp->p)) jp->p++; + if (jp->p < jp->end && *jp->p == '.') { + is_float = 1; jp->p++; + while (jp->p < jp->end && isdigit((unsigned char)*jp->p)) jp->p++; + } + if (jp->p < jp->end && (*jp->p == 'e' || *jp->p == 'E')) { + is_float = 1; jp->p++; + if (jp->p < jp->end && (*jp->p == '+' || *jp->p == '-')) jp->p++; + while (jp->p < jp->end && isdigit((unsigned char)*jp->p)) jp->p++; + } + size_t n = (size_t)(jp->p - start); + char buf[64]; + if (n >= sizeof(buf)) n = sizeof(buf) - 1; + memcpy(buf, start, n); + buf[n] = '\0'; + if (is_float) return el_from_float(strtod(buf, NULL)); + return (el_val_t)strtoll(buf, NULL, 10); +} + +static el_val_t jp_parse_array(JsonParser* jp) { + if (jp->p < jp->end && *jp->p == '[') jp->p++; + el_val_t lst = el_list_empty(); + jp_skip_ws(jp); + if (jp->p < jp->end && *jp->p == ']') { jp->p++; return lst; } + while (jp->p < jp->end) { + jp_skip_ws(jp); + el_val_t v = jp_parse_value(jp); + lst = el_list_append(lst, v); + jp_skip_ws(jp); + if (jp->p < jp->end && *jp->p == ',') { jp->p++; continue; } + if (jp->p < jp->end && *jp->p == ']') { jp->p++; break; } + jp->err = 1; + break; + } + return lst; +} + +static el_val_t jp_parse_object(JsonParser* jp) { + if (jp->p < jp->end && *jp->p == '{') jp->p++; + el_val_t m = el_map_new(0); + jp_skip_ws(jp); + if (jp->p < jp->end && *jp->p == '}') { jp->p++; return m; } + while (jp->p < jp->end) { + jp_skip_ws(jp); + char* key = jp_parse_string_raw(jp); + jp_skip_ws(jp); + if (jp->p < jp->end && *jp->p == ':') jp->p++; + else { jp->err = 1; free(key); break; } + jp_skip_ws(jp); + el_val_t v = jp_parse_value(jp); + m = el_map_set(m, EL_STR(key), v); + jp_skip_ws(jp); + if (jp->p < jp->end && *jp->p == ',') { jp->p++; continue; } + if (jp->p < jp->end && *jp->p == '}') { jp->p++; break; } + jp->err = 1; + break; + } + return m; +} + +static el_val_t jp_parse_value(JsonParser* jp) { + jp_skip_ws(jp); + if (jp->p >= jp->end) { jp->err = 1; return EL_NULL; } + char c = *jp->p; + if (c == '"') return el_wrap_str(jp_parse_string_raw(jp)); + if (c == '{') return jp_parse_object(jp); + if (c == '[') return jp_parse_array(jp); + if (c == '-' || isdigit((unsigned char)c)) return jp_parse_number(jp); + if (c == 't' && jp->p + 4 <= jp->end && strncmp(jp->p, "true", 4) == 0) { jp->p += 4; return 1; } + if (c == 'f' && jp->p + 5 <= jp->end && strncmp(jp->p, "false", 5) == 0) { jp->p += 5; return 0; } + if (c == 'n' && jp->p + 4 <= jp->end && strncmp(jp->p, "null", 4) == 0) { jp->p += 4; return EL_NULL; } + jp->err = 1; + return EL_NULL; +} + +el_val_t json_parse(el_val_t sv) { + const char* s = EL_CSTR(sv); + if (!s) return EL_NULL; + JsonParser jp = { .p = s, .end = s + strlen(s), .err = 0 }; + el_val_t v = jp_parse_value(&jp); + if (jp.err) return EL_NULL; + return v; +} + +/* ── JSON stringify ──────────────────────────────────────────────────────── */ +/* + * Stringify policy: el_val_t is type-erased, so we cannot perfectly + * round-trip arbitrary values. We use these heuristics: + * - If value is an ElList pointer (in the heap range), serialize as array. + * - If value is an ElMap pointer, serialize as object. + * - If value looks like a printable string pointer, serialize as string. + * - Otherwise serialize as integer. + * This is best-effort. Programs that need exact control should build the + * string directly. A pointer test is the cheapest way to disambiguate + * from small integers without a separate type tag. + */ + +/* JsonBuf struct is forward-declared near the HTTP section so HTTP helpers + * can use it. Its definition appears there. */ + +static void jb_init(JsonBuf* b) { + b->cap = 64; b->len = 0; + b->buf = malloc(b->cap); + if (!b->buf) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + b->buf[0] = '\0'; +} + +static void jb_reserve(JsonBuf* b, size_t add) { + if (b->len + add + 1 > b->cap) { + while (b->len + add + 1 > b->cap) b->cap *= 2; + b->buf = realloc(b->buf, b->cap); + if (!b->buf) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + } +} + +static void jb_putc(JsonBuf* b, char c) { + jb_reserve(b, 1); + b->buf[b->len++] = c; + b->buf[b->len] = '\0'; +} + +static void jb_puts(JsonBuf* b, const char* s) { + size_t n = strlen(s); + jb_reserve(b, n); + memcpy(b->buf + b->len, s, n); + b->len += n; + b->buf[b->len] = '\0'; +} + +static void jb_emit_escaped(JsonBuf* b, const char* s) { + jb_putc(b, '"'); + for (; *s; s++) { + unsigned char c = (unsigned char)*s; + switch (c) { + case '"': jb_puts(b, "\\\""); break; + case '\\': jb_puts(b, "\\\\"); break; + case '\b': jb_puts(b, "\\b"); break; + case '\f': jb_puts(b, "\\f"); break; + case '\n': jb_puts(b, "\\n"); break; + case '\r': jb_puts(b, "\\r"); break; + case '\t': jb_puts(b, "\\t"); break; + default: + if (c < 0x20) { + char tmp[8]; + snprintf(tmp, sizeof(tmp), "\\u%04x", c); + jb_puts(b, tmp); + } else { + jb_putc(b, (char)c); + } + break; + } + } + jb_putc(b, '"'); +} + +/* Heuristic: is this el_val_t likely a pointer to an ElList? + * We can't fully verify, but pointers are large addresses, integers small. + * Treat values whose magnitude exceeds 2^32 as potential pointers and + * sniff by reading the header conservatively. + * + * Simpler heuristic: if the value reads as a printable string, treat as + * string; otherwise as integer. Lists/Maps are encoded as struct pointers, + * which have leading binary bytes — so they won't look like strings. */ + +static int looks_like_string(el_val_t v) { + if (v == 0) return 0; + /* Treat plausible heap addresses as candidates. + * Threshold: 4 GiB (0x100000000). On 64-bit systems heap addresses from + * malloc/mmap start well above 4 GiB (ASLR pushes them to ~0x7f...). + * El integer values (counters, unix timestamps up to ~2106) all fit below + * 0x100000000 (4294967296). The old threshold of 1,000,000 caused unix + * timestamps (~1.7e9) to be misidentified as string pointers — a segfault + * risk in json_stringify and jb_emit_value. */ + uintptr_t p = (uintptr_t)v; + if (p < 0x100000000ULL) return 0; /* integers, timestamps, counters */ + if (p < 0x1000) return 0; + /* Sniff first bytes for printable */ + const unsigned char* s = (const unsigned char*)p; + for (int i = 0; i < 16; i++) { + unsigned char c = s[i]; + if (c == '\0') return i > 0; /* terminated string */ + if (c < 0x09 || (c > 0x0d && c < 0x20) || c >= 0x7f) return 0; + } + return 1; /* 16+ printable bytes — call it a string */ +} + +static void jb_emit_value(JsonBuf* b, el_val_t v); + +static void jb_emit_int(JsonBuf* b, int64_t n) { + char tmp[32]; + snprintf(tmp, sizeof(tmp), "%lld", (long long)n); + jb_puts(b, tmp); +} + +static void jb_emit_value(JsonBuf* b, el_val_t v) { + if (v == EL_NULL) { jb_puts(b, "null"); return; } + if (looks_like_string(v)) { + jb_emit_escaped(b, EL_CSTR(v)); + return; + } + jb_emit_int(b, (int64_t)v); +} + +el_val_t json_stringify(el_val_t v) { + JsonBuf b; jb_init(&b); + jb_emit_value(&b, v); + return el_wrap_str(b.buf); +} + +/* ── JSON substring accessors ────────────────────────────────────────────── */ +/* + * These walk the raw JSON string looking for "key": at the top level (depth 1) + * of an object. They handle escaped quotes, nested objects/arrays, and + * whitespace around the colon. + */ + +/* Find "key": at object-depth == 1 inside the JSON object string `s`. + * Returns pointer to the first byte of the value, or NULL. */ +static const char* json_find_key(const char* s, const char* key) { + if (!s || !key) return NULL; + size_t klen = strlen(key); + int depth = 0; + int in_str = 0; + int escape = 0; + const char* p = s; + while (*p) { + char c = *p; + if (in_str) { + if (escape) { escape = 0; } + else if (c == '\\') { escape = 1; } + else if (c == '"') { + /* End of string. If we're at depth 1, check if this was a key. */ + p++; + if (depth == 1) { + /* The string just ended at p-1. Check if it matches key + * and is followed by a colon. We need to backtrack to find + * the start of this string and compare. */ + } + in_str = 0; + continue; + } + p++; + continue; + } + if (c == '"') { + /* Start of a string literal */ + const char* str_start = p + 1; + const char* q = str_start; + int e = 0; + while (*q) { + if (e) { e = 0; q++; continue; } + if (*q == '\\') { e = 1; q++; continue; } + if (*q == '"') break; + q++; + } + size_t slen = (size_t)(q - str_start); + const char* after = (*q == '"') ? q + 1 : q; + /* If at depth 1 and matches key and followed by ':' -> got it */ + if (depth == 1 && slen == klen && strncmp(str_start, key, klen) == 0) { + const char* r = after; + while (*r == ' ' || *r == '\t' || *r == '\n' || *r == '\r') r++; + if (*r == ':') { + r++; + while (*r == ' ' || *r == '\t' || *r == '\n' || *r == '\r') r++; + return r; + } + } + p = after; + continue; + } + if (c == '{' || c == '[') depth++; + else if (c == '}' || c == ']') depth--; + p++; + } + return NULL; +} + +/* Skip a JSON value starting at p; return pointer past the value end. */ +static const char* json_skip_value(const char* p) { + if (!p || !*p) return p; + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + if (*p == '"') { + p++; + int e = 0; + while (*p) { + if (e) { e = 0; p++; continue; } + if (*p == '\\') { e = 1; p++; continue; } + if (*p == '"') { p++; break; } + p++; + } + return p; + } + if (*p == '{' || *p == '[') { + char open = *p; + char close = (open == '{') ? '}' : ']'; + int depth = 0; + int in_str = 0; + int e = 0; + while (*p) { + char c = *p; + if (in_str) { + if (e) { e = 0; } + else if (c == '\\') { e = 1; } + else if (c == '"') in_str = 0; + p++; + continue; + } + if (c == '"') { in_str = 1; p++; continue; } + if (c == open) depth++; + else if (c == close) { depth--; p++; if (depth == 0) return p; continue; } + p++; + } + return p; + } + /* scalar: number, true/false/null */ + while (*p && *p != ',' && *p != '}' && *p != ']' && + *p != ' ' && *p != '\t' && *p != '\n' && *p != '\r') p++; + return p; +} + +el_val_t json_get_string(el_val_t json_str, el_val_t key) { + const char* json = EL_CSTR(json_str); + const char* k = EL_CSTR(key); + const char* p = json_find_key(json, k); + if (!p || *p != '"') return el_wrap_str(el_strdup("")); + p++; + JsonParser jp = { .p = p - 1, .end = json + (json ? strlen(json) : 0), .err = 0 }; + char* parsed = jp_parse_string_raw(&jp); + if (jp.err) { free(parsed); return el_wrap_str(el_strdup("")); } + return el_wrap_str(parsed); +} + +el_val_t json_get_int(el_val_t json_str, el_val_t key) { + const char* json = EL_CSTR(json_str); + const char* k = EL_CSTR(key); + const char* p = json_find_key(json, k); + if (!p) return 0; + if (*p == '"' || *p == '{' || *p == '[') return 0; + return (el_val_t)strtoll(p, NULL, 10); +} + +el_val_t json_get_float(el_val_t json_str, el_val_t key) { + const char* json = EL_CSTR(json_str); + const char* k = EL_CSTR(key); + const char* p = json_find_key(json, k); + if (!p) return 0; + if (*p == '"' || *p == '{' || *p == '[') return 0; + return el_from_float(strtod(p, NULL)); +} + +el_val_t json_get_bool(el_val_t json_str, el_val_t key) { + const char* json = EL_CSTR(json_str); + const char* k = EL_CSTR(key); + const char* p = json_find_key(json, k); + if (!p) return 0; + if (strncmp(p, "true", 4) == 0) return 1; + return 0; +} + +el_val_t json_get_raw(el_val_t json_str, el_val_t key) { + const char* json = EL_CSTR(json_str); + const char* k = EL_CSTR(key); + const char* p = json_find_key(json, k); + if (!p) return el_wrap_str(el_strdup("")); + const char* end = json_skip_value(p); + size_t n = (size_t)(end - p); + char* out = el_strbuf(n); + memcpy(out, p, n); + out[n] = '\0'; + return el_wrap_str(out); +} + +el_val_t json_set(el_val_t json_str, el_val_t key, el_val_t value) { + const char* json = EL_CSTR(json_str); + const char* k = EL_CSTR(key); + if (!k) k = ""; + if (!json || !*json) { + /* Build a fresh object */ + JsonBuf b; jb_init(&b); + jb_putc(&b, '{'); + jb_emit_escaped(&b, k); + jb_putc(&b, ':'); + jb_emit_value(&b, value); + jb_putc(&b, '}'); + return el_wrap_str(b.buf); + } + const char* existing = json_find_key(json, k); + JsonBuf b; jb_init(&b); + if (existing) { + const char* end = json_skip_value(existing); + /* Copy [json .. existing) */ + size_t prefix = (size_t)(existing - json); + jb_reserve(&b, prefix); + memcpy(b.buf + b.len, json, prefix); + b.len += prefix; + b.buf[b.len] = '\0'; + jb_emit_value(&b, value); + jb_puts(&b, end); + return el_wrap_str(b.buf); + } + /* Insert before closing '}'. Find last '}' */ + size_t jl = strlen(json); + if (jl == 0) { free(b.buf); return el_wrap_str(el_strdup("{}")); } + /* Find last '}' from the end */ + ssize_t close_idx = -1; + for (ssize_t i = (ssize_t)jl - 1; i >= 0; i--) { + if (json[i] == '}') { close_idx = i; break; } + } + if (close_idx < 0) { + free(b.buf); + return el_wrap_str(el_strdup(json)); + } + /* Determine if object is empty: scan between last '{' and '}' for non-ws */ + int empty = 1; + for (ssize_t i = close_idx - 1; i >= 0; i--) { + char c = json[i]; + if (c == '{') break; + if (c != ' ' && c != '\t' && c != '\n' && c != '\r') { empty = 0; break; } + } + /* Copy json[0..close_idx) */ + jb_reserve(&b, (size_t)close_idx); + memcpy(b.buf + b.len, json, (size_t)close_idx); + b.len += (size_t)close_idx; + b.buf[b.len] = '\0'; + if (!empty) jb_putc(&b, ','); + jb_emit_escaped(&b, k); + jb_putc(&b, ':'); + jb_emit_value(&b, value); + /* Append from close_idx onward */ + jb_puts(&b, json + close_idx); + return el_wrap_str(b.buf); +} + +el_val_t json_array_len(el_val_t json_str) { + const char* s = EL_CSTR(json_str); + if (!s) return 0; + while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; + if (*s != '[') return 0; + s++; + while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; + if (*s == ']') return 0; + int64_t count = 0; + while (*s) { + const char* end = json_skip_value(s); + if (end == s) break; + count++; + s = end; + while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; + if (*s == ',') { s++; continue; } + if (*s == ']' || *s == '\0') break; + } + return (el_val_t)count; +} + +/* json_array_get — return the i-th element of a JSON array as a JSON + * fragment string. Nested objects and arrays are returned verbatim + * (json_skip_value tracks brace/bracket depth so nested structures are + * preserved intact). Out-of-range index → "". */ +el_val_t json_array_get(el_val_t json_str, el_val_t index) { + const char* s = EL_CSTR(json_str); + int64_t idx = (int64_t)index; + if (!s || idx < 0) return el_wrap_str(el_strdup("")); + while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; + if (*s != '[') return el_wrap_str(el_strdup("")); + s++; + while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; + if (*s == ']') return el_wrap_str(el_strdup("")); + int64_t i = 0; + while (*s) { + const char* start = s; + const char* end = json_skip_value(s); + if (end == s) break; + if (i == idx) { + size_t n = (size_t)(end - start); + char* out = el_strbuf(n); + memcpy(out, start, n); + out[n] = '\0'; + return el_wrap_str(out); + } + i++; + s = end; + while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; + if (*s == ',') { s++; while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; continue; } + if (*s == ']' || *s == '\0') break; + } + return el_wrap_str(el_strdup("")); +} + +/* json_array_get_string — same as json_array_get, but assume the element + * is a JSON string and return the unquoted/unescaped value. Non-string + * elements yield "". */ +el_val_t json_array_get_string(el_val_t json_str, el_val_t index) { + el_val_t raw = json_array_get(json_str, index); + const char* s = EL_CSTR(raw); + if (!s || *s != '"') return el_wrap_str(el_strdup("")); + JsonParser jp = { + .p = s, + .end = s + strlen(s), + .err = 0, + }; + char* parsed = jp_parse_string_raw(&jp); + if (jp.err) { + free(parsed); + return el_wrap_str(el_strdup("")); + } + return el_wrap_str(parsed); +} + +/* ── Time ────────────────────────────────────────────────────────────────── */ + +el_val_t time_now(void) { + struct timeval tv; + gettimeofday(&tv, NULL); + int64_t ms = (int64_t)tv.tv_sec * 1000LL + (int64_t)tv.tv_usec / 1000LL; + return (el_val_t)ms; +} + +el_val_t time_now_utc(void) { + return time_now(); +} + +el_val_t time_format(el_val_t ts, el_val_t fmt) { + int64_t ms = (int64_t)ts; + time_t s = (time_t)(ms / 1000); + int msec = (int)(ms % 1000); + if (msec < 0) { msec += 1000; s -= 1; } + struct tm tm; + gmtime_r(&s, &tm); + const char* fmt_str = EL_CSTR(fmt); + if (!fmt_str || strcmp(fmt_str, "ISO") == 0) { + char buf[64]; + snprintf(buf, sizeof(buf), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec, msec); + return el_wrap_str(el_strdup(buf)); + } + char buf[256]; + if (strftime(buf, sizeof(buf), fmt_str, &tm) == 0) buf[0] = '\0'; + return el_wrap_str(el_strdup(buf)); +} + +el_val_t time_to_parts(el_val_t ts) { + int64_t ms = (int64_t)ts; + time_t s = (time_t)(ms / 1000); + int msec = (int)(ms % 1000); + if (msec < 0) { msec += 1000; s -= 1; } + struct tm tm; + gmtime_r(&s, &tm); + el_val_t m = el_map_new(0); + m = el_map_set(m, EL_STR(el_strdup("year")), (el_val_t)(tm.tm_year + 1900)); + m = el_map_set(m, EL_STR(el_strdup("month")), (el_val_t)(tm.tm_mon + 1)); + m = el_map_set(m, EL_STR(el_strdup("day")), (el_val_t)tm.tm_mday); + m = el_map_set(m, EL_STR(el_strdup("hour")), (el_val_t)tm.tm_hour); + m = el_map_set(m, EL_STR(el_strdup("minute")), (el_val_t)tm.tm_min); + m = el_map_set(m, EL_STR(el_strdup("second")), (el_val_t)tm.tm_sec); + m = el_map_set(m, EL_STR(el_strdup("ms")), (el_val_t)msec); + return m; +} + +el_val_t time_from_parts(el_val_t secs, el_val_t ns, el_val_t tz) { + (void)tz; + int64_t s = (int64_t)secs; + int64_t n = (int64_t)ns; + int64_t ms = s * 1000LL + n / 1000000LL; + return (el_val_t)ms; +} + +el_val_t time_add(el_val_t ts, el_val_t n, el_val_t unit) { + const char* u = EL_CSTR(unit); + int64_t cur = (int64_t)ts; + int64_t d = (int64_t)n; + int64_t add_ms = d; + if (u) { + if (strcmp(u, "ms") == 0) add_ms = d; + else if (strcmp(u, "sec") == 0) add_ms = d * 1000LL; + else if (strcmp(u, "min") == 0) add_ms = d * 60000LL; + else if (strcmp(u, "hour") == 0) add_ms = d * 3600000LL; + else if (strcmp(u, "day") == 0) add_ms = d * 86400000LL; + } + return (el_val_t)(cur + add_ms); +} + +el_val_t time_diff(el_val_t ts1, el_val_t ts2, el_val_t unit) { + int64_t d = (int64_t)ts2 - (int64_t)ts1; + const char* u = EL_CSTR(unit); + if (!u || strcmp(u, "ms") == 0) return (el_val_t)d; + if (strcmp(u, "sec") == 0) return (el_val_t)(d / 1000LL); + if (strcmp(u, "min") == 0) return (el_val_t)(d / 60000LL); + if (strcmp(u, "hour") == 0) return (el_val_t)(d / 3600000LL); + if (strcmp(u, "day") == 0) return (el_val_t)(d / 86400000LL); + return (el_val_t)d; +} + +/* Block the calling thread for `secs` seconds. Negative values are clamped + * to 0. Used by El programs that poll external resources (e.g. RunPod + * /status, Engram readiness probes). */ +el_val_t sleep_secs(el_val_t secs) { + int64_t s = (int64_t)secs; + if (s < 0) s = 0; + struct timespec ts; + ts.tv_sec = (time_t)s; + ts.tv_nsec = 0; + nanosleep(&ts, NULL); + return 0; +} + +el_val_t sleep_ms(el_val_t ms) { + int64_t m = (int64_t)ms; + if (m < 0) m = 0; + struct timespec ts; + ts.tv_sec = (time_t)(m / 1000LL); + ts.tv_nsec = (long)((m % 1000LL) * 1000000LL); + nanosleep(&ts, NULL); + return 0; +} + +/* ── UUID v4 ─────────────────────────────────────────────────────────────── */ + +static int _el_uuid_seeded = 0; + +static void _el_uuid_seed(void) { + if (!_el_uuid_seeded) { + srand((unsigned)time(NULL) ^ (unsigned)(uintptr_t)&_el_uuid_seeded); + _el_uuid_seeded = 1; + } +} + +el_val_t uuid_new(void) { + _el_uuid_seed(); + unsigned char b[16]; + for (int i = 0; i < 16; i++) b[i] = (unsigned char)(rand() & 0xff); + /* Version 4 */ + b[6] = (b[6] & 0x0f) | 0x40; + /* RFC 4122 variant */ + b[8] = (b[8] & 0x3f) | 0x80; + char buf[37]; + snprintf(buf, sizeof(buf), + "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + b[0], b[1], b[2], b[3], + b[4], b[5], + b[6], b[7], + b[8], b[9], + b[10], b[11], b[12], b[13], b[14], b[15]); + return el_wrap_str(el_strdup(buf)); +} + +el_val_t uuid_v4(void) { return uuid_new(); } + +/* ── Environment ─────────────────────────────────────────────────────────── */ + +el_val_t env(el_val_t key) { + const char* k = EL_CSTR(key); + if (!k) return el_wrap_str(el_strdup("")); + const char* v = getenv(k); + return el_wrap_str(el_strdup(v ? v : "")); +} + +/* ── In-process state K/V ────────────────────────────────────────────────── */ + +typedef struct { + char* key; + char* value; +} StateEntry; + +static StateEntry* _state_entries = NULL; +static size_t _state_count = 0; +static size_t _state_cap = 0; +/* Mutex protecting all _state_entries access. state_set/state_get are called + * concurrently from 64 HTTP worker threads — without this lock, realloc and + * free race, producing corruption, double-free, and segfaults. */ +static pthread_mutex_t _state_mu = PTHREAD_MUTEX_INITIALIZER; + +static StateEntry* state_find(const char* key) { + for (size_t i = 0; i < _state_count; i++) { + if (strcmp(_state_entries[i].key, key) == 0) return &_state_entries[i]; + } + return NULL; +} + +el_val_t state_set(el_val_t key, el_val_t value) { + const char* k = EL_CSTR(key); + const char* v = EL_CSTR(value); + if (!k) return 0; + if (!v) v = ""; + pthread_mutex_lock(&_state_mu); + StateEntry* e = state_find(k); + if (e) { + free(e->value); + e->value = el_strdup_persist(v); + pthread_mutex_unlock(&_state_mu); + return 1; + } + if (_state_count >= _state_cap) { + size_t nc = _state_cap == 0 ? 16 : _state_cap * 2; + StateEntry* grown = realloc(_state_entries, nc * sizeof(StateEntry)); + if (!grown) { pthread_mutex_unlock(&_state_mu); fputs("el_runtime: out of memory\n", stderr); exit(1); } + _state_entries = grown; + _state_cap = nc; + } + _state_entries[_state_count].key = el_strdup_persist(k); + _state_entries[_state_count].value = el_strdup_persist(v); + _state_count++; + pthread_mutex_unlock(&_state_mu); + return 1; +} + +el_val_t state_get(el_val_t key) { + const char* k = EL_CSTR(key); + if (!k) return el_wrap_str(el_strdup("")); + pthread_mutex_lock(&_state_mu); + StateEntry* e = state_find(k); + char* result = el_strdup_persist(e ? e->value : ""); + pthread_mutex_unlock(&_state_mu); + /* wrap in arena-tracked copy for the caller's request lifetime */ + char* copy = el_strdup(result); + return el_wrap_str(copy); +} + +el_val_t state_del(el_val_t key) { + const char* k = EL_CSTR(key); + if (!k) return 0; + pthread_mutex_lock(&_state_mu); + for (size_t i = 0; i < _state_count; i++) { + if (strcmp(_state_entries[i].key, k) == 0) { + free(_state_entries[i].key); + free(_state_entries[i].value); + for (size_t j = i + 1; j < _state_count; j++) { + _state_entries[j - 1] = _state_entries[j]; + } + _state_count--; + pthread_mutex_unlock(&_state_mu); + return 1; + } + } + pthread_mutex_unlock(&_state_mu); + return 1; +} + +el_val_t state_keys(void) { + pthread_mutex_lock(&_state_mu); + el_val_t lst = el_list_empty(); + for (size_t i = 0; i < _state_count; i++) { + lst = el_list_append(lst, el_wrap_str(el_strdup(_state_entries[i].key))); + } + pthread_mutex_unlock(&_state_mu); + return lst; +} + +/* ── Float formatting ────────────────────────────────────────────────────── */ + +el_val_t float_to_str(el_val_t f) { + char buf[64]; + snprintf(buf, sizeof(buf), "%g", el_to_float(f)); + return el_wrap_str(el_strdup(buf)); +} + +el_val_t int_to_float(el_val_t n) { + return el_from_float((double)(int64_t)n); +} + +el_val_t float_to_int(el_val_t f) { + return (el_val_t)(int64_t)el_to_float(f); +} + +el_val_t format_float(el_val_t f, el_val_t decimals) { + int d = (int)(int64_t)decimals; + if (d < 0) d = 0; + if (d > 30) d = 30; + char buf[128]; + snprintf(buf, sizeof(buf), "%.*f", d, el_to_float(f)); + return el_wrap_str(el_strdup(buf)); +} + +el_val_t decimal_round(el_val_t f, el_val_t decimals) { + int d = (int)(int64_t)decimals; + if (d < 0) d = 0; + if (d > 15) d = 15; + double mul = pow(10.0, (double)d); + double v = el_to_float(f); + double r = (v >= 0.0 ? floor(v * mul + 0.5) : -floor(-v * mul + 0.5)) / mul; + return el_from_float(r); +} + +el_val_t str_to_float(el_val_t s) { + const char* str = EL_CSTR(s); + if (!str) return el_from_float(0.0); + return el_from_float(strtod(str, NULL)); +} + +/* ── Math (Float-aware) ──────────────────────────────────────────────────── */ + +el_val_t math_sqrt(el_val_t f) { return el_from_float(sqrt(el_to_float(f))); } +el_val_t math_log(el_val_t f) { return el_from_float(log(el_to_float(f))); } +el_val_t math_ln(el_val_t f) { return el_from_float(log(el_to_float(f))); } +el_val_t math_sin(el_val_t f) { return el_from_float(sin(el_to_float(f))); } +el_val_t math_cos(el_val_t f) { return el_from_float(cos(el_to_float(f))); } +el_val_t math_pi(void) { return el_from_float(3.141592653589793238462643383279502884); } + +/* ── String additions ────────────────────────────────────────────────────── */ + +el_val_t str_index_of(el_val_t s, el_val_t sub) { + const char* str = EL_CSTR(s); + const char* sb = EL_CSTR(sub); + if (!str || !sb) return -1; + const char* hit = strstr(str, sb); + if (!hit) return -1; + return (el_val_t)(int64_t)(hit - str); +} + +el_val_t str_split(el_val_t s, el_val_t sep) { + const char* str = EL_CSTR(s); + const char* sp = EL_CSTR(sep); + el_val_t lst = el_list_empty(); + if (!str) return lst; + if (!sp || !*sp) { + lst = el_list_append(lst, el_wrap_str(el_strdup(str))); + return lst; + } + size_t lp = strlen(sp); + const char* p = str; + const char* hit; + while ((hit = strstr(p, sp)) != NULL) { + size_t n = (size_t)(hit - p); + char* out = el_strbuf(n); + memcpy(out, p, n); + out[n] = '\0'; + lst = el_list_append(lst, el_wrap_str(out)); + p = hit + lp; + } + lst = el_list_append(lst, el_wrap_str(el_strdup(p))); + return lst; +} + +el_val_t str_char_at(el_val_t s, el_val_t i) { + const char* str = EL_CSTR(s); + int64_t idx = (int64_t)i; + if (!str) return el_wrap_str(el_strdup("")); + int64_t n = (int64_t)strlen(str); + if (idx < 0 || idx >= n) return el_wrap_str(el_strdup("")); + char buf[2]; + buf[0] = str[idx]; + buf[1] = '\0'; + return el_wrap_str(el_strdup(buf)); +} + +el_val_t str_char_code(el_val_t s, el_val_t i) { + const char* str = EL_CSTR(s); + int64_t idx = (int64_t)i; + if (!str) return 0; + int64_t n = (int64_t)strlen(str); + if (idx < 0 || idx >= n) return 0; + return (el_val_t)(unsigned char)str[idx]; +} + +static el_val_t str_pad(const char* s, int64_t width, const char* pad, int left) { + if (!s) s = ""; + if (!pad || !*pad) pad = " "; + int64_t lp = (int64_t)strlen(pad); + int64_t ls = (int64_t)strlen(s); + if (ls >= width) return el_wrap_str(el_strdup(s)); + int64_t need = width - ls; + char* out = el_strbuf((size_t)width); + if (left) { + for (int64_t i = 0; i < need; i++) out[i] = pad[i % lp]; + memcpy(out + need, s, (size_t)ls); + } else { + memcpy(out, s, (size_t)ls); + for (int64_t i = 0; i < need; i++) out[ls + i] = pad[i % lp]; + } + out[width] = '\0'; + return el_wrap_str(out); +} + +el_val_t str_pad_left(el_val_t s, el_val_t width, el_val_t pad) { + return str_pad(EL_CSTR(s), (int64_t)width, EL_CSTR(pad), 1); +} + +el_val_t str_pad_right(el_val_t s, el_val_t width, el_val_t pad) { + return str_pad(EL_CSTR(s), (int64_t)width, EL_CSTR(pad), 0); +} + +el_val_t str_format(el_val_t template, el_val_t data) { + const char* tpl = EL_CSTR(template); + if (!tpl) return el_wrap_str(el_strdup("")); + JsonBuf b; jb_init(&b); + const char* p = tpl; + while (*p) { + if (*p == '{') { + const char* q = p + 1; + while (*q && *q != '}') q++; + if (*q == '}') { + size_t klen = (size_t)(q - p - 1); + char keybuf[256]; + if (klen < sizeof(keybuf)) { + memcpy(keybuf, p + 1, klen); + keybuf[klen] = '\0'; + el_val_t v = el_map_get(data, EL_STR(keybuf)); + if (v != 0 && looks_like_string(v)) { + jb_puts(&b, EL_CSTR(v)); + p = q + 1; + continue; + } else if (v != 0) { + jb_emit_int(&b, (int64_t)v); + p = q + 1; + continue; + } + } + /* Unknown key — leave {key} verbatim */ + jb_reserve(&b, klen + 2); + memcpy(b.buf + b.len, p, klen + 2); + b.len += klen + 2; + b.buf[b.len] = '\0'; + p = q + 1; + continue; + } + } + jb_putc(&b, *p); + p++; + } + return el_wrap_str(b.buf); +} + +el_val_t str_lower(el_val_t s) { return str_to_lower(s); } +el_val_t str_upper(el_val_t s) { return str_to_upper(s); } + +/* ── List additions ──────────────────────────────────────────────────────── */ + +el_val_t list_push(el_val_t list, el_val_t elem) { + return el_list_append(list, elem); +} + +el_val_t list_push_front(el_val_t listv, el_val_t elem) { + ElList* lst = (ElList*)(uintptr_t)listv; + if (!lst) { + el_val_t nl = el_list_empty(); + return el_list_append(nl, elem); + } + /* Append to grow capacity, then shift right */ + listv = el_list_append(listv, elem); + lst = (ElList*)(uintptr_t)listv; + for (int64_t i = lst->length - 1; i > 0; i--) { + lst->elems[i] = lst->elems[i - 1]; + } + lst->elems[0] = elem; + return EL_STR(lst); +} + +el_val_t list_join(el_val_t listv, el_val_t sep) { + ElList* lst = (ElList*)(uintptr_t)listv; + const char* sp = EL_CSTR(sep); + if (!sp) sp = ""; + if (!lst || lst->length == 0) return el_wrap_str(el_strdup("")); + JsonBuf b; jb_init(&b); + for (int64_t i = 0; i < lst->length; i++) { + if (i > 0) jb_puts(&b, sp); + el_val_t v = lst->elems[i]; + if (v == 0) continue; + if (looks_like_string(v)) { + jb_puts(&b, EL_CSTR(v)); + } else { + char tmp[32]; + snprintf(tmp, sizeof(tmp), "%lld", (long long)v); + jb_puts(&b, tmp); + } + } + return el_wrap_str(b.buf); +} + +el_val_t list_range(el_val_t start, el_val_t end) { + int64_t a = (int64_t)start; + int64_t b = (int64_t)end; + el_val_t lst = el_list_empty(); + for (int64_t i = a; i < b; i++) lst = el_list_append(lst, (el_val_t)i); + return lst; +} + +/* ── Bool helpers ────────────────────────────────────────────────────────── */ + +el_val_t bool_to_str(el_val_t b) { + return el_wrap_str(el_strdup(b ? "true" : "false")); +} + +/* ── Numeric parsing ─────────────────────────────────────────────────────── */ + +/* parse_int — strtoll with a default. str_to_int already exists but does not + * distinguish "0" from a parse failure, so callers that need a sentinel use + * this. Skips leading whitespace; accepts an optional leading +/-; returns + * default_val on empty input or no consumed digits. Trailing junk is ignored + * (atoi-style). */ +el_val_t parse_int(el_val_t sv, el_val_t default_val) { + const char* s = EL_CSTR(sv); + if (!s) return default_val; + while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++; + if (*s == '\0') return default_val; + char* end = NULL; + long long n = strtoll(s, &end, 10); + if (end == s) return default_val; + return (el_val_t)n; +} + +/* ── Process ─────────────────────────────────────────────────────────────── */ + +void exit_program(el_val_t code) { + exit((int)code); +} + +/* getpid_now — current process id. Named with the _now suffix to avoid + * colliding with the libc `getpid` declaration that the runtime already + * sees via (calling it `getpid` would fight the prototype). */ +el_val_t getpid_now(void) { + return (el_val_t)getpid(); +} + +/* ── args() — command-line argument access ────────────────────────────────── + * Compiled El programs call args() to get a list of CLI arguments. + * Call el_runtime_init_args(argc, argv) at the start of C main() to populate. + * The args list excludes argv[0] (the program name). */ + +static el_val_t _el_args_list = 0; + +void el_runtime_init_args(int argc, char** argv) { + _el_args_list = el_list_empty(); + for (int i = 1; i < argc; i++) { + _el_args_list = el_list_append(_el_args_list, EL_STR(argv[i])); + } +} + +el_val_t args(void) { + if (!_el_args_list) _el_args_list = el_list_empty(); + return _el_args_list; +} + +/* ── CGI identity ──────────────────────────────────────────────────────────── + * Called once at program start by the generated main() of a cgi {} program. + * Stores CGI identity so dharma_* builtins can reference it. */ + +static const char* _el_cgi_name = NULL; +static const char* _el_cgi_dharma_id = NULL; +static const char* _el_cgi_principal = NULL; +static const char* _el_cgi_network = NULL; +static const char* _el_cgi_engram = NULL; + +void el_cgi_init(el_val_t name, el_val_t dharma_id, el_val_t principal, + el_val_t network, el_val_t engram) { + _el_cgi_name = EL_CSTR(name); + _el_cgi_dharma_id = EL_CSTR(dharma_id); + _el_cgi_principal = EL_CSTR(principal); + _el_cgi_network = EL_CSTR(network) ? EL_CSTR(network) : "dharma-mainnet"; + _el_cgi_engram = EL_CSTR(engram) ? EL_CSTR(engram) : "http://localhost:8742"; + printf("[cgi] identity: name=%s dharma_id=%s principal=%s network=%s engram=%s\n", + _el_cgi_name ? _el_cgi_name : "(unset)", + _el_cgi_dharma_id ? _el_cgi_dharma_id : "(unset)", + _el_cgi_principal ? _el_cgi_principal : "(unset)", + _el_cgi_network, + _el_cgi_engram); +} + + +/* ── Batch 3: Engram in-process graph store ──────────────────────────────── */ +/* + * Single global EngramStore allocated lazily on first call. All node and + * edge content strings are owned (strdup'd) by the store. Linear arrays + * with doubling capacity for both nodes and edges. + * + * Two-layer activation algorithm (engram_activate): + * + * LAYER 1 — Broad fan-out (background activation): + * 1. Find seed nodes whose content/label/tags contain query (case-insens). + * 2. BFS up to `depth` hops along ALL edges (excitatory and inhibitory). + * Every reachable node fires — nothing is filtered at this layer. + * 3. bg_act = seed.salience * temporal_decay * dampening + * propagated as: new_bg = parent_bg * edge_weight * 0.7 * (1 + tbonus) + * where tbonus ∈ {0, 0.10, 0.20} for co-temporal nodes. + * 4. If reached by multiple paths, take max background_activation. + * 5. Persist background_activation to EngramNode.background_activation. + * + * LAYER 2 — Executive filter (working memory promotion): + * 6. For each inhibitory edge where source has background_activation > 0: + * inhibition[target] = max(bg[source] * e->weight) + * 7. For each background-activated node: + * raw_wm = bg * goal_bias(node, query) * confidence + * * (1 - (1 - INHIBITION_FACTOR) * inhibition) + * 8. Per-type threshold gate: raw_wm >= type_threshold → promoted. + * Safety/DharmaSelf: 0.05 Canonical: 0.15 Lesson: 0.25 + * Belief/Entity: 0.30 Note/Memory/Working: 0.40 + * 9. If not promoted: suppression_count++. After + * ENGRAM_SUPPRESSION_BREAKTHROUGH suppressions → force breakthrough + * at ENGRAM_BREAKTHROUGH_WEIGHT (latent tension surfacing). + * 10. Persist working_memory_weight to EngramNode.working_memory_weight. + * 11. Sort: promoted nodes (wm > 0) first by wm desc, then background- + * only by bg desc. Context compilation uses ONLY promoted nodes. + * + * Temporal decay: + * decay_factor = exp(-lambda * age_hours / T_half) + * T_half = 168.0 h (one week), lambda = ln(2) + * + * Activation dampening: + * dampen = 1.0 / (1.0 + log(1 + activation_count)) + * + * engram_query_range(start_ms, end_ms): + * Returns nodes whose created_at OR last_activated falls within + * [start_ms, end_ms], sorted by created_at ascending. + */ + +/* Temporal decay constants. + * T_HALF_HOURS: half-life in hours — one week. After one week of no + * activation a node retains 50% of its base salience contribution. + * DECAY_LAMBDA: ln(2) ≈ 0.693147 */ +#define ENGRAM_T_HALF_HOURS 168.0 +#define ENGRAM_DECAY_LAMBDA 0.693147 + +/* Two-layer activation constants. + * ENGRAM_WM_THRESHOLD: minimum background_activation for a node to be + * considered for working-memory promotion (layer 2 candidate gate). + * ENGRAM_WM_DECAY: per-turn decay applied to working_memory_weight for + * nodes NOT re-activated in the current turn (conversational thread + * continuity: a node promoted in turn N persists with reduced weight + * into turn N+1 without re-activation cost). + * ENGRAM_SUPPRESSION_BREAKTHROUGH: after this many consecutive suppressions + * a latent node forces itself into working memory at reduced weight, + * modelling the brain's "intrusive thought" / unresolved-tension surfacing. + * ENGRAM_BREAKTHROUGH_WEIGHT: the reduced working_memory_weight assigned + * when a suppressed node breaks through. + * ENGRAM_INHIBITION_FACTOR: multiplier applied to working_memory_weight when + * an inhibitory edge fires against a node (0 = full suppress, 0.3 = partial). */ +#define ENGRAM_WM_THRESHOLD 0.15 +#define ENGRAM_WM_DECAY 0.7 +#define ENGRAM_SUPPRESSION_BREAKTHROUGH 5 +#define ENGRAM_BREAKTHROUGH_WEIGHT 0.25 +#define ENGRAM_INHIBITION_FACTOR 0.1 + +/* Per-node-type activation thresholds. + * Lower tier / safety-critical nodes fire more readily. */ +static double engram_type_threshold(const char* node_type, const char* tier) { + if (node_type) { + if (strcmp(node_type, "DharmaSelf") == 0) return 0.05; + if (strcmp(node_type, "Safety") == 0) return 0.05; + } + if (tier) { + if (strcmp(tier, "Canonical") == 0) return 0.15; + if (strcmp(tier, "Lesson") == 0) return 0.25; + } + if (node_type) { + if (strcmp(node_type, "Belief") == 0) return 0.30; + if (strcmp(node_type, "Entity") == 0) return 0.30; + } + return 0.40; /* Note / Memory / Working (most nodes) */ +} + +typedef struct EngramNode { + char* id; + char* content; + char* node_type; + char* label; + char* tier; + char* tags; + char* metadata; + double salience; + double importance; + double confidence; + double temporal_decay_rate; /* per-node override for lambda; 0 = use default */ + int64_t activation_count; + int64_t last_activated; + int64_t created_at; + int64_t updated_at; + /* Two-layer activation fields ───────────────────────────────────────── + * background_activation: Layer 1. Set by BFS fan-out on every query. + * Every reachable node fires here — nothing is filtered at this stage. + * Models the brain's massive parallel sub-threshold activation of all + * associated content in response to a stimulus. + * working_memory_weight: Layer 2. Executive filter output. Only nodes + * that survive goal-state / attentional-bias scoring receive a + * non-zero weight here. Context compilation ONLY uses this field. + * Background-activated nodes with working_memory_weight == 0 remain + * latent — real, available, but silent. + * suppression_count: Consecutive turn count where this node was + * background-activated but NOT promoted to working memory. High + * values signal the node "wants to surface." After + * ENGRAM_SUPPRESSION_BREAKTHROUGH consecutive suppressions the node + * is force-promoted at a reduced weight (breakthrough activation). */ + double background_activation; + double working_memory_weight; + int32_t suppression_count; +} EngramNode; + +typedef struct EngramEdge { + char* id; + char* from_id; + char* to_id; + char* relation; + char* metadata; + double weight; + double confidence; + int64_t created_at; + int64_t updated_at; + int64_t last_fired; + /* Inhibitory flag: when 1, activating the source node SUPPRESSES the + * working_memory_weight of the target node rather than exciting it. + * Models attentional inhibition: "I am focused on code work" creates + * inhibitory edges to personal/emotional nodes, preventing them from + * surfacing even if they have high background_activation. */ + int inhibitory; +} EngramEdge; + +typedef struct EngramStore { + EngramNode* nodes; + int64_t node_count; + int64_t node_capacity; + EngramEdge* edges; + int64_t edge_count; + int64_t edge_capacity; +} EngramStore; + +static EngramStore* engram_global = NULL; + +static EngramStore* engram_get(void) { + if (engram_global) return engram_global; + engram_global = calloc(1, sizeof(EngramStore)); + if (!engram_global) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + engram_global->node_capacity = 16; + engram_global->nodes = calloc((size_t)engram_global->node_capacity, sizeof(EngramNode)); + engram_global->edge_capacity = 16; + engram_global->edges = calloc((size_t)engram_global->edge_capacity, sizeof(EngramEdge)); + return engram_global; +} + +static int64_t engram_now_ms(void) { + struct timeval tv; gettimeofday(&tv, NULL); + return (int64_t)tv.tv_sec * 1000LL + (int64_t)tv.tv_usec / 1000LL; +} + +static EngramNode* engram_find_node(const char* id) { + if (!id) return NULL; + EngramStore* g = engram_get(); + for (int64_t i = 0; i < g->node_count; i++) { + if (g->nodes[i].id && strcmp(g->nodes[i].id, id) == 0) return &g->nodes[i]; + } + return NULL; +} + +static int64_t engram_find_node_index(const char* id) { + if (!id) return -1; + EngramStore* g = engram_get(); + for (int64_t i = 0; i < g->node_count; i++) { + if (g->nodes[i].id && strcmp(g->nodes[i].id, id) == 0) return i; + } + return -1; +} + +static void engram_grow_nodes(void) { + EngramStore* g = engram_get(); + if (g->node_count < g->node_capacity) return; + int64_t nc = g->node_capacity * 2; + g->nodes = realloc(g->nodes, (size_t)nc * sizeof(EngramNode)); + if (!g->nodes) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + memset(g->nodes + g->node_capacity, 0, + (size_t)(nc - g->node_capacity) * sizeof(EngramNode)); + g->node_capacity = nc; +} + +static void engram_grow_edges(void) { + EngramStore* g = engram_get(); + if (g->edge_count < g->edge_capacity) return; + int64_t nc = g->edge_capacity * 2; + g->edges = realloc(g->edges, (size_t)nc * sizeof(EngramEdge)); + if (!g->edges) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + memset(g->edges + g->edge_capacity, 0, + (size_t)(nc - g->edge_capacity) * sizeof(EngramEdge)); + g->edge_capacity = nc; +} + +/* Build a fresh UUID string. Reuses uuid_new but takes the underlying char*. */ +static char* engram_new_id(void) { + el_val_t v = uuid_new(); + const char* s = EL_CSTR(v); + return el_strdup(s ? s : ""); +} + +/* Convert a node into an ElMap of its fields. */ +static el_val_t engram_node_to_map(const EngramNode* n) { + el_val_t m = el_map_new(0); + m = el_map_set(m, EL_STR(el_strdup("id")), EL_STR(el_strdup(n->id ? n->id : ""))); + m = el_map_set(m, EL_STR(el_strdup("content")), EL_STR(el_strdup(n->content ? n->content : ""))); + m = el_map_set(m, EL_STR(el_strdup("node_type")), EL_STR(el_strdup(n->node_type ? n->node_type : ""))); + m = el_map_set(m, EL_STR(el_strdup("label")), EL_STR(el_strdup(n->label ? n->label : ""))); + m = el_map_set(m, EL_STR(el_strdup("tier")), EL_STR(el_strdup(n->tier ? n->tier : "Working"))); + m = el_map_set(m, EL_STR(el_strdup("tags")), EL_STR(el_strdup(n->tags ? n->tags : ""))); + m = el_map_set(m, EL_STR(el_strdup("metadata")), EL_STR(el_strdup(n->metadata ? n->metadata : "{}"))); + m = el_map_set(m, EL_STR(el_strdup("salience")), el_from_float(n->salience)); + m = el_map_set(m, EL_STR(el_strdup("importance")), el_from_float(n->importance)); + m = el_map_set(m, EL_STR(el_strdup("confidence")), el_from_float(n->confidence)); + m = el_map_set(m, EL_STR(el_strdup("temporal_decay_rate")), el_from_float(n->temporal_decay_rate)); + m = el_map_set(m, EL_STR(el_strdup("activation_count")), (el_val_t)n->activation_count); + m = el_map_set(m, EL_STR(el_strdup("last_activated")), (el_val_t)n->last_activated); + m = el_map_set(m, EL_STR(el_strdup("created_at")), (el_val_t)n->created_at); + m = el_map_set(m, EL_STR(el_strdup("updated_at")), (el_val_t)n->updated_at); + m = el_map_set(m, EL_STR(el_strdup("background_activation")), el_from_float(n->background_activation)); + m = el_map_set(m, EL_STR(el_strdup("working_memory_weight")), el_from_float(n->working_memory_weight)); + m = el_map_set(m, EL_STR(el_strdup("suppression_count")), (el_val_t)n->suppression_count); + return m; +} + +/* (Node JSON serialization is provided by `engram_emit_node_json` further + * down in the persistence section — reused by the *_json builtins below.) */ +static void engram_emit_node_json(JsonBuf* b, const EngramNode* n); +static void engram_emit_edge_json(JsonBuf* b, const EngramEdge* e); + +/* Salience may arrive either as a float bit-pattern or as a small integer + * (e.g. 1, meaning 1.0). Heuristic: if interpreted as double it's in + * [0.0, 100.0] use it; otherwise treat as int and convert. */ +static double engram_decode_score(el_val_t v) { + double f = el_to_float(v); + if (!isnan(f) && !isinf(f) && f >= 0.0 && f <= 100.0) return f; + int64_t n = (int64_t)v; + return (double)n; +} + +static char* engram_first_n_chars(const char* s, size_t n) { + if (!s) return el_strdup(""); + size_t l = strlen(s); + if (l > n) l = n; + char* out = el_strbuf(l); + memcpy(out, s, l); + out[l] = '\0'; + return out; +} + +el_val_t engram_node(el_val_t content, el_val_t node_type, el_val_t salience) { + EngramStore* g = engram_get(); + engram_grow_nodes(); + EngramNode* n = &g->nodes[g->node_count]; + memset(n, 0, sizeof(*n)); + n->id = engram_new_id(); + const char* c = EL_CSTR(content); + const char* nt = EL_CSTR(node_type); + n->content = el_strdup(c ? c : ""); + n->node_type = el_strdup(nt && *nt ? nt : "Memory"); + n->label = engram_first_n_chars(c, 60); + n->tier = el_strdup("Working"); + n->tags = el_strdup(""); + n->metadata = el_strdup("{}"); + n->salience = engram_decode_score(salience); + if (n->salience <= 0.0 || n->salience > 1.0) n->salience = 0.5; + n->importance = 0.5; + n->confidence = 1.0; + n->temporal_decay_rate = 0.0; /* 0 = use global default ENGRAM_DECAY_LAMBDA */ + n->activation_count = 0; + int64_t now = engram_now_ms(); + n->last_activated = now; + n->created_at = now; + n->updated_at = now; + g->node_count++; + return el_wrap_str(el_strdup(n->id)); +} + +el_val_t engram_node_full(el_val_t content, el_val_t node_type, el_val_t label, + el_val_t salience, el_val_t importance, el_val_t confidence, + el_val_t tier, el_val_t tags) { + EngramStore* g = engram_get(); + engram_grow_nodes(); + EngramNode* n = &g->nodes[g->node_count]; + memset(n, 0, sizeof(*n)); + n->id = engram_new_id(); + const char* c = EL_CSTR(content); + const char* nt = EL_CSTR(node_type); + const char* lb = EL_CSTR(label); + const char* ti = EL_CSTR(tier); + const char* tg = EL_CSTR(tags); + n->content = el_strdup(c ? c : ""); + n->node_type = el_strdup(nt && *nt ? nt : "Memory"); + n->label = el_strdup(lb && *lb ? lb : (c ? engram_first_n_chars(c, 60) : "")); + n->tier = el_strdup(ti && *ti ? ti : "Working"); + n->tags = el_strdup(tg ? tg : ""); + n->metadata = el_strdup("{}"); + n->salience = engram_decode_score(salience); + n->importance = engram_decode_score(importance); + n->confidence = engram_decode_score(confidence); + if (n->salience <= 0.0 || n->salience > 1.0) n->salience = 0.5; + if (n->importance <= 0.0 || n->importance > 1.0) n->importance = 0.5; + if (n->confidence <= 0.0 || n->confidence > 1.0) n->confidence = 1.0; + n->temporal_decay_rate = 0.0; /* 0 = use global default ENGRAM_DECAY_LAMBDA */ + n->activation_count = 0; + int64_t now = engram_now_ms(); + n->last_activated = now; + n->created_at = now; + n->updated_at = now; + g->node_count++; + return el_wrap_str(el_strdup(n->id)); +} + +el_val_t engram_get_node(el_val_t id) { + const char* sid = EL_CSTR(id); + EngramNode* n = engram_find_node(sid); + if (!n) return el_map_new(0); + return engram_node_to_map(n); +} + +void engram_strengthen(el_val_t node_id) { + const char* sid = EL_CSTR(node_id); + EngramNode* n = engram_find_node(sid); + if (!n) return; + n->salience += 0.05; + if (n->salience > 1.0) n->salience = 1.0; + n->activation_count++; + n->last_activated = engram_now_ms(); + n->updated_at = n->last_activated; +} + +void engram_forget(el_val_t node_id) { + const char* sid = EL_CSTR(node_id); + if (!sid) return; + EngramStore* g = engram_get(); + int64_t idx = engram_find_node_index(sid); + if (idx < 0) return; + /* Free node strings */ + EngramNode* n = &g->nodes[idx]; + free(n->id); free(n->content); free(n->node_type); free(n->label); + free(n->tier); free(n->tags); free(n->metadata); + /* Shift remaining nodes down */ + for (int64_t i = idx + 1; i < g->node_count; i++) { + g->nodes[i - 1] = g->nodes[i]; + } + g->node_count--; + memset(&g->nodes[g->node_count], 0, sizeof(EngramNode)); + /* Remove all incident edges */ + int64_t w = 0; + for (int64_t r = 0; r < g->edge_count; r++) { + EngramEdge* e = &g->edges[r]; + int incident = (e->from_id && strcmp(e->from_id, sid) == 0) || + (e->to_id && strcmp(e->to_id, sid) == 0); + if (incident) { + free(e->id); free(e->from_id); free(e->to_id); + free(e->relation); free(e->metadata); + } else { + if (w != r) g->edges[w] = g->edges[r]; + w++; + } + } + g->edge_count = w; +} + +el_val_t engram_node_count(void) { + return (el_val_t)engram_get()->node_count; +} + +static int istr_contains(const char* hay, const char* needle) { + if (!hay || !needle || !*needle) return 0; + size_t nl = strlen(needle); + for (const char* p = hay; *p; p++) { + if (strncasecmp(p, needle, nl) == 0) return 1; + } + return 0; +} + +el_val_t engram_search(el_val_t query, el_val_t limit) { + EngramStore* g = engram_get(); + const char* q = EL_CSTR(query); + int64_t lim = (int64_t)limit; + if (lim <= 0) lim = 100; + el_val_t lst = el_list_empty(); + if (!q || !*q) return lst; + int64_t found = 0; + for (int64_t i = 0; i < g->node_count && found < lim; i++) { + EngramNode* n = &g->nodes[i]; + if (istr_contains(n->content, q) || + istr_contains(n->label, q) || + istr_contains(n->tags, q)) { + lst = el_list_append(lst, engram_node_to_map(n)); + found++; + } + } + return lst; +} + +/* Sort node indices by salience desc (small N, insertion sort is fine). */ +static void engram_sort_indices_by_salience(int64_t* arr, int64_t n, + const EngramNode* nodes) { + for (int64_t i = 1; i < n; i++) { + int64_t key = arr[i]; + double ks = nodes[key].salience; + int64_t j = i - 1; + while (j >= 0 && nodes[arr[j]].salience < ks) { + arr[j + 1] = arr[j]; + j--; + } + arr[j + 1] = key; + } +} + +el_val_t engram_scan_nodes(el_val_t limit, el_val_t offset) { + EngramStore* g = engram_get(); + int64_t lim = (int64_t)limit; if (lim <= 0) lim = 100; + int64_t off = (int64_t)offset; if (off < 0) off = 0; + el_val_t lst = el_list_empty(); + if (g->node_count == 0) return lst; + int64_t* idx = malloc((size_t)g->node_count * sizeof(int64_t)); + if (!idx) return lst; + for (int64_t i = 0; i < g->node_count; i++) idx[i] = i; + engram_sort_indices_by_salience(idx, g->node_count, g->nodes); + int64_t end = off + lim; + if (end > g->node_count) end = g->node_count; + for (int64_t i = off; i < end; i++) { + lst = el_list_append(lst, engram_node_to_map(&g->nodes[idx[i]])); + } + free(idx); + return lst; +} + +void engram_connect(el_val_t from_id, el_val_t to_id, el_val_t weight, el_val_t relation) { + EngramStore* g = engram_get(); + const char* f = EL_CSTR(from_id); + const char* t = EL_CSTR(to_id); + const char* r = EL_CSTR(relation); + if (!f || !t) return; + engram_grow_edges(); + EngramEdge* e = &g->edges[g->edge_count]; + memset(e, 0, sizeof(*e)); + e->id = engram_new_id(); + e->from_id = el_strdup(f); + e->to_id = el_strdup(t); + e->relation = el_strdup(r && *r ? r : "associate"); + e->metadata = el_strdup("{}"); + e->weight = engram_decode_score(weight); + if (e->weight <= 0.0 || e->weight > 1.0) e->weight = 0.5; + e->confidence = 1.0; + int64_t now = engram_now_ms(); + e->created_at = now; + e->updated_at = now; + e->last_fired = 0; + g->edge_count++; +} + +el_val_t engram_edge_between(el_val_t from_id, el_val_t to_id) { + EngramStore* g = engram_get(); + const char* f = EL_CSTR(from_id); + const char* t = EL_CSTR(to_id); + if (!f || !t) return 0; + for (int64_t i = 0; i < g->edge_count; i++) { + EngramEdge* e = &g->edges[i]; + if (e->from_id && e->to_id && + strcmp(e->from_id, f) == 0 && strcmp(e->to_id, t) == 0) return 1; + } + return 0; +} + +/* Reserved helper: edge -> ElMap. Kept around for future builtins. */ +static el_val_t engram_edge_to_map(const EngramEdge* e) __attribute__((unused)); +static el_val_t engram_edge_to_map(const EngramEdge* e) { + el_val_t m = el_map_new(0); + m = el_map_set(m, EL_STR(el_strdup("id")), EL_STR(el_strdup(e->id ? e->id : ""))); + m = el_map_set(m, EL_STR(el_strdup("from_id")), EL_STR(el_strdup(e->from_id ? e->from_id : ""))); + m = el_map_set(m, EL_STR(el_strdup("to_id")), EL_STR(el_strdup(e->to_id ? e->to_id : ""))); + m = el_map_set(m, EL_STR(el_strdup("relation")), EL_STR(el_strdup(e->relation ? e->relation : ""))); + m = el_map_set(m, EL_STR(el_strdup("metadata")), EL_STR(el_strdup(e->metadata ? e->metadata : "{}"))); + m = el_map_set(m, EL_STR(el_strdup("weight")), el_from_float(e->weight)); + m = el_map_set(m, EL_STR(el_strdup("confidence")), el_from_float(e->confidence)); + m = el_map_set(m, EL_STR(el_strdup("created_at")), (el_val_t)e->created_at); + m = el_map_set(m, EL_STR(el_strdup("updated_at")), (el_val_t)e->updated_at); + m = el_map_set(m, EL_STR(el_strdup("last_fired")), (el_val_t)e->last_fired); + m = el_map_set(m, EL_STR(el_strdup("inhibitory")), (el_val_t)(e->inhibitory ? 1 : 0)); + return m; +} + +el_val_t engram_neighbors(el_val_t node_id) { + EngramStore* g = engram_get(); + const char* sid = EL_CSTR(node_id); + el_val_t lst = el_list_empty(); + if (!sid) return lst; + for (int64_t i = 0; i < g->edge_count; i++) { + EngramEdge* e = &g->edges[i]; + const char* other = NULL; + if (e->from_id && strcmp(e->from_id, sid) == 0) other = e->to_id; + else if (e->to_id && strcmp(e->to_id, sid) == 0) other = e->from_id; + if (!other) continue; + EngramNode* n = engram_find_node(other); + if (n) lst = el_list_append(lst, engram_node_to_map(n)); + } + return lst; +} + +el_val_t engram_neighbors_filtered(el_val_t node_id, el_val_t max_depth, el_val_t direction) { + EngramStore* g = engram_get(); + const char* sid = EL_CSTR(node_id); + int64_t md = (int64_t)max_depth; if (md <= 0) md = 1; + const char* dir = EL_CSTR(direction); /* "out" | "in" | "both" (default) */ + el_val_t lst = el_list_empty(); + if (!sid || g->node_count == 0) return lst; + int64_t start = engram_find_node_index(sid); + if (start < 0) return lst; + /* BFS with depth tracking */ + int64_t* visited = calloc((size_t)g->node_count, sizeof(int64_t)); + int64_t* queue = calloc((size_t)g->node_count, sizeof(int64_t)); + int64_t* depths = calloc((size_t)g->node_count, sizeof(int64_t)); + if (!visited || !queue || !depths) { + free(visited); free(queue); free(depths); return lst; + } + int64_t qh = 0, qt = 0; + queue[qt++] = start; + visited[start] = 1; + depths[start] = 0; + while (qh < qt) { + int64_t cur = queue[qh++]; + const char* cur_id = g->nodes[cur].id; + int64_t cur_depth = depths[cur]; + if (cur_depth >= md) continue; + for (int64_t i = 0; i < g->edge_count; i++) { + EngramEdge* e = &g->edges[i]; + const char* other = NULL; + int outgoing = e->from_id && strcmp(e->from_id, cur_id) == 0; + int incoming = e->to_id && strcmp(e->to_id, cur_id) == 0; + if (dir && strcmp(dir, "out") == 0 && !outgoing) continue; + if (dir && strcmp(dir, "in") == 0 && !incoming) continue; + if (outgoing) other = e->to_id; + else if (incoming) other = e->from_id; + else continue; + int64_t oi = engram_find_node_index(other); + if (oi < 0 || visited[oi]) continue; + visited[oi] = 1; + depths[oi] = cur_depth + 1; + queue[qt++] = oi; + } + } + /* Emit all visited except the seed */ + for (int64_t i = 0; i < g->node_count; i++) { + if (visited[i] && i != start) { + lst = el_list_append(lst, engram_node_to_map(&g->nodes[i])); + } + } + free(visited); free(queue); free(depths); + return lst; +} + +el_val_t engram_edge_count(void) { + return (el_val_t)engram_get()->edge_count; +} + +/* Compute temporal decay factor for a node given current time. + * effective contribution = salience * exp(-lambda * age_hours / T_half) + * Clamped to [0.05, 1.0] so very old nodes retain a meaningful floor. */ +static double engram_temporal_decay(const EngramNode* n, int64_t now_ms) { + int64_t age_ms = now_ms - n->last_activated; + if (age_ms <= 0) return 1.0; + double lambda = (n->temporal_decay_rate > 0.0) ? n->temporal_decay_rate + : ENGRAM_DECAY_LAMBDA; + double age_hours = (double)age_ms / 3600000.0; + double factor = exp(-lambda * age_hours / ENGRAM_T_HALF_HOURS); + if (factor < 0.05) factor = 0.05; + return factor; +} + +/* Activation dampening: high activation_count nodes are "well-known" context + * and get less marginal boost per firing. + * count=0 → 1.0, count=2 → ~0.74, count=9 → ~0.59, count=99 → ~0.43 */ +static double engram_activation_dampen(const EngramNode* n) { + return 1.0 / (1.0 + log(1.0 + (double)n->activation_count)); +} + +/* Temporal proximity bonus: boost propagation along edges connecting + * co-temporal nodes. Returns a multiplier bonus in [0, 0.2]. */ +static double engram_temporal_proximity_bonus(int64_t node_created, + int64_t seed_epoch) { + int64_t diff = node_created - seed_epoch; + if (diff < 0) diff = -diff; + if (diff < 86400000LL) return 0.20; /* within 1 day */ + if (diff < 604800000LL) return 0.10; /* within 7 days */ + return 0.0; +} + +/* ── Two-layer activation (biologically-motivated) ─────────────────────────── + * + * Layer 1 — Broad fan-out (background activation): + * BFS + spreading activation fires on ALL nodes reachable from seeds, + * regardless of relevance to the current goal. Every reachable node gets + * a background_activation score. Nothing is filtered here. Models the + * brain's massive parallel sub-threshold activation of all associated + * content in response to a stimulus. Temporal decay and activation + * dampening are applied at this layer (as before), but no threshold gate. + * + * Layer 2 — Executive filter (working memory promotion): + * A second pass asks: given the query (goal intent), attentional bias, + * and inhibitory edge topology — which background-activated nodes should + * break through into working memory? + * + * wm_weight = bg_activation * goal_bias(node, query) * confidence + * * inhibitory_suppression_factor + * + * Only nodes where wm_weight >= ENGRAM_WM_THRESHOLD are promoted to + * working memory (working_memory_weight > 0). Background-activated nodes + * that don't cross the threshold accumulate suppression_count. After + * ENGRAM_SUPPRESSION_BREAKTHROUGH consecutive suppressed turns, the node + * force-breaks through at ENGRAM_BREAKTHROUGH_WEIGHT (latent tension + * surfacing — models intrusive memory / unresolved cognitive load). + * + * Inhibitory edges: + * An edge with inhibitory=1 suppresses the TARGET node's working memory + * promotion when the SOURCE is background-activated. Background activation + * of the target is NOT affected — the node fires in layer 1. Only the + * executive filter (layer 2) is gated. Models attentional inhibition: + * "focused on code work" suppresses personal memories from surfacing + * even if they have high background_activation. + * + * Goal bias: + * A lightweight heuristic rates how well each background-activated node + * aligns with the apparent intent of the current query. Technical queries + * boost Belief/Canonical/Lesson nodes; relational queries boost Memory/ + * Entity nodes. Direct lexical overlap gives a 50% bonus. + * + * Working memory persistence (turn continuity): + * Nodes promoted in the previous turn retain a decayed working_memory_weight + * (weight *= ENGRAM_WM_DECAY) without needing re-activation. This models + * conversational thread continuity — once a topic is in working memory, + * it persists slightly into the next turn. + * + * Returns ElList of {node, activation_strength, working_memory_weight, + * epistemic_confidence, hops, promoted}. + * "promoted" = 1 if working_memory_weight > 0, 0 if background-only. + * Context compilation uses ONLY nodes with promoted=1. + * + * Temporal decay (preserved from prior implementation): + * effective_salience = salience * exp(-lambda * age_hours / T_half) + * where T_half = 168 h (one week), lambda = ln(2) + * + * Activation dampening (preserved): + * dampen = 1 / (1 + log(1 + activation_count)) + * + * Temporal proximity bonus (preserved): + * edge_strength *= (1 + tbonus) where tbonus ∈ {0, 0.10, 0.20} + * + * Per-type threshold gates apply only to working memory promotion (layer 2): + * Safety/DharmaSelf: 0.05 Canonical: 0.15 Lesson: 0.25 + * Belief/Entity: 0.30 Note/Memory/Working: 0.40 + */ + +/* Compute goal-state bias multiplier for a node given the query. + * Returns a value in [0.3, 2.0]. This is a lightweight heuristic — + * a production implementation may use LLM-derived intent classification. */ +static double engram_goal_bias(const EngramNode* n, const char* query) { + if (!query || !*query) return 1.0; + double bias = 1.0; + /* Direct lexical overlap: node content/label/tags share text with query. */ + if (istr_contains(n->content, query) || istr_contains(n->label, query) || + istr_contains(n->tags, query)) { + bias += 0.5; + } + /* Node-type resonance with query intent. */ + int technical_query = istr_contains(query, "code") || + istr_contains(query, "function") || + istr_contains(query, "implement") || + istr_contains(query, "error") || + istr_contains(query, "bug") || + istr_contains(query, "build") || + istr_contains(query, "system") || + istr_contains(query, "design") || + istr_contains(query, "architecture"); + int personal_query = istr_contains(query, "feel") || + istr_contains(query, "emotion") || + istr_contains(query, "remember") || + istr_contains(query, "personal") || + istr_contains(query, "story") || + istr_contains(query, "relationship"); + if (n->node_type) { + int is_knowledge = (strcmp(n->node_type, "Belief") == 0) || + (strcmp(n->node_type, "DharmaSelf") == 0) || + (strcmp(n->node_type, "Safety") == 0); + int is_personal = (strcmp(n->node_type, "Memory") == 0) || + (strcmp(n->node_type, "Entity") == 0); + if (technical_query && is_knowledge) bias += 0.3; + if (technical_query && is_personal) bias -= 0.3; + if (personal_query && is_personal) bias += 0.3; + if (personal_query && is_knowledge) bias -= 0.1; + } + /* Tier-based bonus: promote higher-confidence knowledge nodes. */ + if (n->tier) { + if (strcmp(n->tier, "Canonical") == 0) bias += 0.2; + if (strcmp(n->tier, "Lesson") == 0) bias += 0.1; + } + if (bias < 0.3) bias = 0.3; + if (bias > 2.0) bias = 2.0; + return bias; +} + +el_val_t engram_activate(el_val_t query, el_val_t depth) { + EngramStore* g = engram_get(); + const char* q = EL_CSTR(query); + int64_t max_depth = (int64_t)depth; if (max_depth <= 0) max_depth = 2; + el_val_t out = el_list_empty(); + if (!q || g->node_count == 0) return out; + + int64_t now_ms = engram_now_ms(); + + /* Per-node layer-1 tracking. */ + double* best_bg = calloc((size_t)g->node_count, sizeof(double)); + int64_t* best_hops = calloc((size_t)g->node_count, sizeof(int64_t)); + int* reached = calloc((size_t)g->node_count, sizeof(int)); + if (!best_bg || !best_hops || !reached) { + free(best_bg); free(best_hops); free(reached); return out; + } + + /* ── LAYER 1: broad fan-out (background activation) ───────────────── + * Find seeds, apply temporal decay + dampening, BFS with edge weights. + * Inhibitory edges propagate activation normally at this layer — they + * only gate working memory promotion in layer 2. */ + typedef struct { int64_t idx; double act; int64_t created_at; } SeedEntry; + SeedEntry* seeds = malloc((size_t)g->node_count * sizeof(SeedEntry)); + int64_t seed_count = 0; + if (!seeds) { + free(best_bg); free(best_hops); free(reached); return out; + } + for (int64_t i = 0; i < g->node_count; i++) { + EngramNode* n = &g->nodes[i]; + if (istr_contains(n->content, q) || + istr_contains(n->label, q) || + istr_contains(n->tags, q)) { + double tdecay = engram_temporal_decay(n, now_ms); + double dampen = engram_activation_dampen(n); + double act = n->salience * tdecay * dampen; + seeds[seed_count].idx = i; + seeds[seed_count].act = act; + seeds[seed_count].created_at = n->created_at; + seed_count++; + best_bg[i] = act; + best_hops[i] = 0; + reached[i] = 1; + } + } + /* Compute mean seed created_at for temporal proximity bonus. */ + int64_t seed_epoch = 0; + if (seed_count > 0) { + seed_epoch = seeds[0].created_at; + for (int64_t s = 1; s < seed_count; s++) + seed_epoch = (seed_epoch + seeds[s].created_at) / 2; + } + typedef struct { int64_t idx; int64_t hops; double act; } Frontier; + Frontier* fr = malloc((size_t)(g->node_count * (max_depth + 1)) * sizeof(Frontier) + 16 * sizeof(Frontier)); + if (!fr) { + free(best_bg); free(best_hops); free(reached); free(seeds); return out; + } + int64_t fhead = 0, ftail = 0; + int64_t fcap = (int64_t)((size_t)(g->node_count * (max_depth + 1)) + 16); + for (int64_t s = 0; s < seed_count; s++) { + if (ftail >= fcap) break; + fr[ftail].idx = seeds[s].idx; + fr[ftail].hops = 0; + fr[ftail].act = seeds[s].act; + ftail++; + } + const double SPREAD_DECAY = 0.7; + while (fhead < ftail) { + Frontier f = fr[fhead++]; + if (f.hops >= max_depth) continue; + const char* cur_id = g->nodes[f.idx].id; + for (int64_t ei = 0; ei < g->edge_count; ei++) { + EngramEdge* e = &g->edges[ei]; + const char* other = NULL; + if (e->from_id && strcmp(e->from_id, cur_id) == 0) other = e->to_id; + else if (e->to_id && strcmp(e->to_id, cur_id) == 0) other = e->from_id; + else continue; + int64_t oi = engram_find_node_index(other); + if (oi < 0) continue; + EngramNode* on = &g->nodes[oi]; + double tbonus = engram_temporal_proximity_bonus(on->created_at, seed_epoch); + double tdecay = engram_temporal_decay(on, now_ms); + double dampen = engram_activation_dampen(on); + double new_act = f.act * e->weight * SPREAD_DECAY * (1.0 + tbonus) + * tdecay * dampen; + int64_t new_hops = f.hops + 1; + if (!reached[oi] || new_act > best_bg[oi]) { + best_bg[oi] = new_act; + best_hops[oi] = new_hops; + reached[oi] = 1; + if (ftail < fcap) { + fr[ftail].idx = oi; + fr[ftail].hops = new_hops; + fr[ftail].act = new_act; + ftail++; + } + } + } + } + /* Persist layer-1 background_activation to node store. */ + for (int64_t i = 0; i < g->node_count; i++) { + g->nodes[i].background_activation = reached[i] ? best_bg[i] : 0.0; + } + + /* ── LAYER 2: executive filter → working memory promotion ────────── */ + /* Step A: collect inhibitory suppressions from fired inhibitory edges. */ + double* inhibition = calloc((size_t)g->node_count, sizeof(double)); + if (!inhibition) { + free(best_bg); free(best_hops); free(reached); free(seeds); free(fr); + return out; + } + for (int64_t ei = 0; ei < g->edge_count; ei++) { + EngramEdge* e = &g->edges[ei]; + if (!e->inhibitory) continue; + int64_t src = engram_find_node_index(e->from_id); + int64_t tgt = engram_find_node_index(e->to_id); + if (src < 0 || tgt < 0) continue; + if (!reached[src] || best_bg[src] <= 0.0) continue; + /* Inhibition strength proportional to source background activation + * and edge weight. Takes the maximum if multiple inhibitory edges + * target the same node. */ + double inh = best_bg[src] * e->weight; + if (inh > inhibition[tgt]) inhibition[tgt] = inh; + } + /* Step B: compute working_memory_weight per candidate node. */ + double* wm_weights = calloc((size_t)g->node_count, sizeof(double)); + if (!wm_weights) { + free(best_bg); free(best_hops); free(reached); free(seeds); + free(fr); free(inhibition); return out; + } + for (int64_t i = 0; i < g->node_count; i++) { + if (!reached[i] || best_bg[i] <= 0.0) continue; + EngramNode* n = &g->nodes[i]; + /* Per-type threshold: safety nodes break through more easily. */ + double type_threshold = engram_type_threshold(n->node_type, n->tier); + /* Goal bias weights the node's relevance to current intent. */ + double bias = engram_goal_bias(n, q); + /* Raw working memory score. */ + double raw_wm = best_bg[i] * bias * n->confidence; + /* Apply inhibitory suppression. Full inhibition → scale by factor. */ + double inh = inhibition[i]; + if (inh > 1.0) inh = 1.0; + double suppress = 1.0 - (1.0 - ENGRAM_INHIBITION_FACTOR) * inh; + raw_wm *= suppress; + /* Threshold gate: must exceed per-type threshold to enter working + * memory. Type threshold replaces the old flat 0.2 filter. */ + if (raw_wm >= type_threshold) { + wm_weights[i] = raw_wm > 1.0 ? 1.0 : raw_wm; + if (n->suppression_count > 0) n->suppression_count = 0; + } else { + /* Node didn't make it through — increment suppression counter. + * After N consecutive suppressions: force breakthrough. */ + n->suppression_count++; + if (n->suppression_count >= ENGRAM_SUPPRESSION_BREAKTHROUGH) { + wm_weights[i] = ENGRAM_BREAKTHROUGH_WEIGHT; + n->suppression_count = 0; + } else { + wm_weights[i] = 0.0; + } + } + } + /* Persist layer-2 working_memory_weight to node store. */ + for (int64_t i = 0; i < g->node_count; i++) { + g->nodes[i].working_memory_weight = wm_weights[i]; + } + + /* ── Collect all background-activated nodes for the return value ──── + * Callers see both layers. Context compilation uses only promoted nodes + * (working_memory_weight > 0). Sort: promoted first by wm_weight desc, + * then background-only by background_activation desc. */ + typedef struct { int64_t idx; double bg; double wm; double epist; int64_t hops; } Result; + Result* results = malloc((size_t)g->node_count * sizeof(Result)); + int64_t rcount = 0; + if (!results) { + free(best_bg); free(best_hops); free(reached); free(seeds); + free(fr); free(inhibition); free(wm_weights); return out; + } + for (int64_t i = 0; i < g->node_count; i++) { + if (!reached[i]) continue; + double epist = best_bg[i] * g->nodes[i].confidence; + /* Include if promoted to working memory OR if background activation + * is meaningful enough to report (epist >= 0.1). */ + if (epist < 0.1 && wm_weights[i] <= 0.0) continue; + results[rcount].idx = i; + results[rcount].bg = best_bg[i]; + results[rcount].wm = wm_weights[i]; + results[rcount].epist = epist; + results[rcount].hops = best_hops[i]; + rcount++; + } + /* Sort: promoted nodes first (by wm_weight desc), then background-only + * by background_activation desc. */ + for (int64_t i = 1; i < rcount; i++) { + Result key = results[i]; + int64_t j = i - 1; + while (j >= 0 && (results[j].wm < key.wm || + (results[j].wm == key.wm && results[j].bg < key.bg))) { + results[j + 1] = results[j]; + j--; + } + results[j + 1] = key; + } + for (int64_t i = 0; i < rcount; i++) { + el_val_t entry = el_map_new(0); + entry = el_map_set(entry, EL_STR(el_strdup("node")), + engram_node_to_map(&g->nodes[results[i].idx])); + entry = el_map_set(entry, EL_STR(el_strdup("activation_strength")), + el_from_float(results[i].bg)); + entry = el_map_set(entry, EL_STR(el_strdup("working_memory_weight")), + el_from_float(results[i].wm)); + entry = el_map_set(entry, EL_STR(el_strdup("epistemic_confidence")), + el_from_float(results[i].epist)); + entry = el_map_set(entry, EL_STR(el_strdup("hops")), + (el_val_t)results[i].hops); + entry = el_map_set(entry, EL_STR(el_strdup("promoted")), + (el_val_t)(results[i].wm > 0.0 ? 1 : 0)); + out = el_list_append(out, entry); + } + free(best_bg); free(best_hops); free(reached); + free(seeds); free(fr); free(inhibition); free(wm_weights); free(results); + return out; +} + +/* ── Engram persistence (JSON snapshot) ─────────────────────────────────── */ + +static void engram_emit_node_json(JsonBuf* b, const EngramNode* n) { + jb_putc(b, '{'); + jb_puts(b, "\"id\":"); jb_emit_escaped(b, n->id ? n->id : ""); + jb_puts(b, ",\"content\":"); jb_emit_escaped(b, n->content ? n->content : ""); + jb_puts(b, ",\"node_type\":"); jb_emit_escaped(b, n->node_type ? n->node_type : ""); + jb_puts(b, ",\"label\":"); jb_emit_escaped(b, n->label ? n->label : ""); + jb_puts(b, ",\"tier\":"); jb_emit_escaped(b, n->tier ? n->tier : "Working"); + jb_puts(b, ",\"tags\":"); jb_emit_escaped(b, n->tags ? n->tags : ""); + jb_puts(b, ",\"metadata\":"); jb_emit_escaped(b, n->metadata ? n->metadata : "{}"); + char tmp[80]; + snprintf(tmp, sizeof(tmp), ",\"salience\":%g", n->salience); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"importance\":%g", n->importance); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"confidence\":%g", n->confidence); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"temporal_decay_rate\":%g", n->temporal_decay_rate); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"activation_count\":%lld", (long long)n->activation_count); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"last_activated\":%lld", (long long)n->last_activated); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"created_at\":%lld", (long long)n->created_at); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"updated_at\":%lld", (long long)n->updated_at); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"background_activation\":%g", n->background_activation); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"working_memory_weight\":%g", n->working_memory_weight); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"suppression_count\":%d", n->suppression_count); jb_puts(b, tmp); + jb_putc(b, '}'); +} + +static void engram_emit_edge_json(JsonBuf* b, const EngramEdge* e) { + jb_putc(b, '{'); + jb_puts(b, "\"id\":"); jb_emit_escaped(b, e->id ? e->id : ""); + jb_puts(b, ",\"from_id\":"); jb_emit_escaped(b, e->from_id ? e->from_id : ""); + jb_puts(b, ",\"to_id\":"); jb_emit_escaped(b, e->to_id ? e->to_id : ""); + jb_puts(b, ",\"relation\":"); jb_emit_escaped(b, e->relation ? e->relation : ""); + jb_puts(b, ",\"metadata\":"); jb_emit_escaped(b, e->metadata ? e->metadata : "{}"); + char tmp[64]; + snprintf(tmp, sizeof(tmp), ",\"weight\":%g", e->weight); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"confidence\":%g", e->confidence); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"created_at\":%lld", (long long)e->created_at); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"updated_at\":%lld", (long long)e->updated_at); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"last_fired\":%lld", (long long)e->last_fired); jb_puts(b, tmp); + snprintf(tmp, sizeof(tmp), ",\"inhibitory\":%d", e->inhibitory ? 1 : 0); jb_puts(b, tmp); + jb_putc(b, '}'); +} + +el_val_t engram_save(el_val_t path) { + const char* p = EL_CSTR(path); + if (!p || !*p) return 0; + EngramStore* g = engram_get(); + JsonBuf b; jb_init(&b); + jb_puts(&b, "{\"nodes\":["); + for (int64_t i = 0; i < g->node_count; i++) { + if (i > 0) jb_putc(&b, ','); + engram_emit_node_json(&b, &g->nodes[i]); + } + jb_puts(&b, "],\"edges\":["); + for (int64_t i = 0; i < g->edge_count; i++) { + if (i > 0) jb_putc(&b, ','); + engram_emit_edge_json(&b, &g->edges[i]); + } + jb_puts(&b, "]}"); + FILE* f = fopen(p, "wb"); + if (!f) { free(b.buf); return 0; } + size_t w = fwrite(b.buf, 1, b.len, f); + fclose(f); + int ok = (w == b.len); + free(b.buf); + return ok ? 1 : 0; +} + +/* Helper: extract a string field from a JSON object substring. */ +static char* eg_get_str_field(const char* obj, const char* key) { + const char* p = json_find_key(obj, key); + if (!p) return el_strdup(""); + if (*p != '"') return el_strdup(""); + JsonParser jp = { .p = p, .end = p + strlen(p), .err = 0 }; + char* out = jp_parse_string_raw(&jp); + if (jp.err) { free(out); return el_strdup(""); } + return out; +} + +static double eg_get_num_field(const char* obj, const char* key) { + const char* p = json_find_key(obj, key); + if (!p || *p == '"' || *p == '{' || *p == '[') return 0.0; + return strtod(p, NULL); +} + +static int64_t eg_get_int_field(const char* obj, const char* key) { + const char* p = json_find_key(obj, key); + if (!p || *p == '"' || *p == '{' || *p == '[') return 0; + return strtoll(p, NULL, 10); +} + +/* Iterate the top-level nodes/edges arrays in a saved snapshot. */ +static const char* eg_skip_ws(const char* p) { + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + return p; +} + +el_val_t engram_load(el_val_t path) { + const char* p = EL_CSTR(path); + if (!p || !*p) return 0; + FILE* f = fopen(p, "rb"); + if (!f) return 0; + fseek(f, 0, SEEK_END); + long sz = ftell(f); + rewind(f); + if (sz <= 0) { fclose(f); return 0; } + char* data = malloc((size_t)sz + 1); + if (!data) { fclose(f); return 0; } + size_t got = fread(data, 1, (size_t)sz, f); + fclose(f); + data[got] = '\0'; + + /* Reset store */ + EngramStore* g = engram_get(); + for (int64_t i = 0; i < g->node_count; i++) { + free(g->nodes[i].id); free(g->nodes[i].content); free(g->nodes[i].node_type); + free(g->nodes[i].label); free(g->nodes[i].tier); free(g->nodes[i].tags); + free(g->nodes[i].metadata); + } + g->node_count = 0; + for (int64_t i = 0; i < g->edge_count; i++) { + free(g->edges[i].id); free(g->edges[i].from_id); free(g->edges[i].to_id); + free(g->edges[i].relation); free(g->edges[i].metadata); + } + g->edge_count = 0; + + /* Walk nodes array */ + const char* nodes_p = json_find_key(data, "nodes"); + if (nodes_p) { + nodes_p = eg_skip_ws(nodes_p); + if (*nodes_p == '[') { + nodes_p++; + nodes_p = eg_skip_ws(nodes_p); + while (*nodes_p && *nodes_p != ']') { + if (*nodes_p != '{') { nodes_p++; continue; } + const char* end = json_skip_value(nodes_p); + size_t n = (size_t)(end - nodes_p); + char* obj = malloc(n + 1); + memcpy(obj, nodes_p, n); obj[n] = '\0'; + engram_grow_nodes(); + EngramNode* nn = &g->nodes[g->node_count]; + memset(nn, 0, sizeof(*nn)); + nn->id = eg_get_str_field(obj, "id"); + nn->content = eg_get_str_field(obj, "content"); + nn->node_type = eg_get_str_field(obj, "node_type"); + nn->label = eg_get_str_field(obj, "label"); + nn->tier = eg_get_str_field(obj, "tier"); + nn->tags = eg_get_str_field(obj, "tags"); + nn->metadata = eg_get_str_field(obj, "metadata"); + if (!nn->metadata || !*nn->metadata) { free(nn->metadata); nn->metadata = el_strdup("{}"); } + nn->salience = eg_get_num_field(obj, "salience"); + nn->importance = eg_get_num_field(obj, "importance"); + nn->confidence = eg_get_num_field(obj, "confidence"); + nn->temporal_decay_rate = eg_get_num_field(obj, "temporal_decay_rate"); + /* temporal_decay_rate defaults to 0 (use global) if absent in snapshot */ + nn->activation_count = eg_get_int_field(obj, "activation_count"); + nn->last_activated = eg_get_int_field(obj, "last_activated"); + nn->created_at = eg_get_int_field(obj, "created_at"); + nn->updated_at = eg_get_int_field(obj, "updated_at"); + nn->background_activation = eg_get_num_field(obj, "background_activation"); + nn->working_memory_weight = eg_get_num_field(obj, "working_memory_weight"); + nn->suppression_count = (int32_t)eg_get_int_field(obj, "suppression_count"); + g->node_count++; + free(obj); + nodes_p = end; + nodes_p = eg_skip_ws(nodes_p); + if (*nodes_p == ',') { nodes_p++; nodes_p = eg_skip_ws(nodes_p); } + } + } + } + /* Walk edges array */ + const char* edges_p = json_find_key(data, "edges"); + if (edges_p) { + edges_p = eg_skip_ws(edges_p); + if (*edges_p == '[') { + edges_p++; + edges_p = eg_skip_ws(edges_p); + while (*edges_p && *edges_p != ']') { + if (*edges_p != '{') { edges_p++; continue; } + const char* end = json_skip_value(edges_p); + size_t n = (size_t)(end - edges_p); + char* obj = malloc(n + 1); + memcpy(obj, edges_p, n); obj[n] = '\0'; + engram_grow_edges(); + EngramEdge* ee = &g->edges[g->edge_count]; + memset(ee, 0, sizeof(*ee)); + ee->id = eg_get_str_field(obj, "id"); + ee->from_id = eg_get_str_field(obj, "from_id"); + ee->to_id = eg_get_str_field(obj, "to_id"); + ee->relation = eg_get_str_field(obj, "relation"); + ee->metadata = eg_get_str_field(obj, "metadata"); + if (!ee->metadata || !*ee->metadata) { free(ee->metadata); ee->metadata = el_strdup("{}"); } + ee->weight = eg_get_num_field(obj, "weight"); + ee->confidence = eg_get_num_field(obj, "confidence"); + ee->created_at = eg_get_int_field(obj, "created_at"); + ee->updated_at = eg_get_int_field(obj, "updated_at"); + ee->last_fired = eg_get_int_field(obj, "last_fired"); + ee->inhibitory = (int)eg_get_int_field(obj, "inhibitory"); + g->edge_count++; + free(obj); + edges_p = end; + edges_p = eg_skip_ws(edges_p); + if (*edges_p == ',') { edges_p++; edges_p = eg_skip_ws(edges_p); } + } + } + } + free(data); + return 1; +} + +/* ── Engram JSON-string accessors ───────────────────────────────────────── + * These return pre-serialized JSON strings so callers (especially HTTP + * handlers) don't have to round-trip ElList/ElMap through json_stringify + * — which can't reliably distinguish those structures from raw pointers + * due to el_val_t's type erasure. The runtime knows the real C types and + * can serialize directly. */ + +el_val_t engram_get_node_json(el_val_t id) { + const char* sid = EL_CSTR(id); + EngramNode* n = engram_find_node(sid); + if (!n) return el_wrap_str(el_strdup("{}")); + JsonBuf b; jb_init(&b); + engram_emit_node_json(&b, n); + return el_wrap_str(b.buf); +} + +el_val_t engram_search_json(el_val_t query, el_val_t limit) { + EngramStore* g = engram_get(); + const char* q = EL_CSTR(query); + int64_t lim = (int64_t)limit; + if (lim <= 0) lim = 100; + JsonBuf b; jb_init(&b); + jb_putc(&b, '['); + int first = 1; + int64_t found = 0; + if (q && *q) { + for (int64_t i = 0; i < g->node_count && found < lim; i++) { + EngramNode* n = &g->nodes[i]; + if (istr_contains(n->content, q) || + istr_contains(n->label, q) || + istr_contains(n->tags, q)) { + if (!first) jb_putc(&b, ','); + engram_emit_node_json(&b, n); + first = 0; + found++; + } + } + } + jb_putc(&b, ']'); + return el_wrap_str(b.buf); +} + +el_val_t engram_scan_nodes_json(el_val_t limit, el_val_t offset) { + EngramStore* g = engram_get(); + int64_t lim = (int64_t)limit; if (lim <= 0) lim = 100; + int64_t off = (int64_t)offset; if (off < 0) off = 0; + JsonBuf b; jb_init(&b); + jb_putc(&b, '['); + if (g->node_count == 0) { jb_putc(&b, ']'); return el_wrap_str(b.buf); } + int64_t* idx = malloc((size_t)g->node_count * sizeof(int64_t)); + if (!idx) { jb_putc(&b, ']'); return el_wrap_str(b.buf); } + for (int64_t i = 0; i < g->node_count; i++) idx[i] = i; + engram_sort_indices_by_salience(idx, g->node_count, g->nodes); + int64_t end = off + lim; + if (end > g->node_count) end = g->node_count; + int first = 1; + for (int64_t i = off; i < end; i++) { + if (!first) jb_putc(&b, ','); + engram_emit_node_json(&b, &g->nodes[idx[i]]); + first = 0; + } + free(idx); + jb_putc(&b, ']'); + return el_wrap_str(b.buf); +} + +el_val_t engram_neighbors_json(el_val_t node_id, el_val_t max_depth, el_val_t direction) { + /* Re-implement here directly so we serialize without going through + * the ElList path. Walks BFS to max_depth, emits {node, edge, hops} + * triples. */ + EngramStore* g = engram_get(); + const char* sid = EL_CSTR(node_id); + int64_t depth = (int64_t)max_depth; if (depth <= 0) depth = 1; + const char* dir = EL_CSTR(direction); if (!dir) dir = "both"; + int allow_out = (strcmp(dir, "out") == 0) || (strcmp(dir, "both") == 0); + int allow_in = (strcmp(dir, "in") == 0) || (strcmp(dir, "both") == 0); + JsonBuf b; jb_init(&b); + jb_putc(&b, '['); + if (!sid || !*sid) { jb_putc(&b, ']'); return el_wrap_str(b.buf); } + + /* Frontier of (node_id, hops). Cap to a sane size. */ + char** frontier = calloc(1024, sizeof(char*)); + int64_t* frontier_h = calloc(1024, sizeof(int64_t)); + int64_t fc = 0; + char** visited = calloc(1024, sizeof(char*)); + int64_t vc = 0; + if (!frontier || !frontier_h || !visited) { + free(frontier); free(frontier_h); free(visited); + jb_putc(&b, ']'); return el_wrap_str(b.buf); + } + frontier[fc] = el_strdup(sid); frontier_h[fc] = 0; fc++; + visited[vc++] = el_strdup(sid); + + int first = 1; + while (fc > 0) { + char* cur = frontier[0]; int64_t h = frontier_h[0]; + for (int64_t k = 1; k < fc; k++) { frontier[k-1] = frontier[k]; frontier_h[k-1] = frontier_h[k]; } + fc--; + if (h >= depth) { free(cur); continue; } + for (int64_t i = 0; i < g->edge_count; i++) { + EngramEdge* e = &g->edges[i]; + const char* peer = NULL; + if (allow_out && e->from_id && strcmp(e->from_id, cur) == 0) peer = e->to_id; + else if (allow_in && e->to_id && strcmp(e->to_id, cur) == 0) peer = e->from_id; + if (!peer) continue; + int seen = 0; + for (int64_t v = 0; v < vc; v++) { + if (strcmp(visited[v], peer) == 0) { seen = 1; break; } + } + if (seen) continue; + EngramNode* n = engram_find_node(peer); + if (!n) continue; + if (!first) jb_putc(&b, ','); + jb_puts(&b, "{\"node\":"); + engram_emit_node_json(&b, n); + jb_puts(&b, ",\"edge\":"); + engram_emit_edge_json(&b, e); + char tmp[64]; snprintf(tmp, sizeof(tmp), ",\"hops\":%lld}", (long long)(h + 1)); + jb_puts(&b, tmp); + first = 0; + if (vc < 1024) visited[vc++] = el_strdup(peer); + if (fc < 1024 && h + 1 < depth) { frontier[fc] = el_strdup(peer); frontier_h[fc] = h + 1; fc++; } + } + free(cur); + } + for (int64_t i = 0; i < fc; i++) free(frontier[i]); + for (int64_t i = 0; i < vc; i++) free(visited[i]); + free(frontier); free(frontier_h); free(visited); + jb_putc(&b, ']'); + return el_wrap_str(b.buf); +} + +el_val_t engram_activate_json(el_val_t query, el_val_t depth) { + /* Run two-layer engram_activate and serialize the result list to JSON. + * Each entry includes both activation_strength (layer 1 background) and + * working_memory_weight (layer 2 executive filter), plus promoted flag. + * Callers performing context compilation should filter to promoted=1. */ + el_val_t lst = engram_activate(query, depth); + ElList* arr = (ElList*)(uintptr_t)lst; + JsonBuf b; jb_init(&b); + jb_putc(&b, '['); + if (arr) { + for (int64_t i = 0; i < arr->length; i++) { + if (!arr->elems[i]) continue; + el_val_t node_map = el_map_get(arr->elems[i], EL_STR("node")); + el_val_t strength_v = el_map_get(arr->elems[i], EL_STR("activation_strength")); + el_val_t wm_v = el_map_get(arr->elems[i], EL_STR("working_memory_weight")); + el_val_t epist_v = el_map_get(arr->elems[i], EL_STR("epistemic_confidence")); + el_val_t hops_v = el_map_get(arr->elems[i], EL_STR("hops")); + el_val_t promoted_v = el_map_get(arr->elems[i], EL_STR("promoted")); + /* Look up underlying EngramNode by id to emit canonical JSON. */ + el_val_t id_v = el_map_get(node_map, EL_STR("id")); + const char* id_s = EL_CSTR(id_v); + EngramNode* n = id_s ? engram_find_node(id_s) : NULL; + if (i > 0) jb_putc(&b, ','); + jb_puts(&b, "{\"node\":"); + if (n) { + engram_emit_node_json(&b, n); + } else { + jb_puts(&b, "{}"); + } + char tmp[80]; + snprintf(tmp, sizeof(tmp), ",\"activation_strength\":%g", el_to_float(strength_v)); jb_puts(&b, tmp); + snprintf(tmp, sizeof(tmp), ",\"working_memory_weight\":%g", el_to_float(wm_v)); jb_puts(&b, tmp); + snprintf(tmp, sizeof(tmp), ",\"epistemic_confidence\":%g", el_to_float(epist_v)); jb_puts(&b, tmp); + snprintf(tmp, sizeof(tmp), ",\"hops\":%lld", (long long)(int64_t)hops_v); jb_puts(&b, tmp); + snprintf(tmp, sizeof(tmp), ",\"promoted\":%d}", (int)(int64_t)promoted_v); jb_puts(&b, tmp); + } + } + jb_putc(&b, ']'); + return el_wrap_str(b.buf); +} + +el_val_t engram_stats_json(void) { + EngramStore* g = engram_get(); + char buf[128]; + snprintf(buf, sizeof(buf), + "{\"node_count\":%lld,\"edge_count\":%lld}", + (long long)g->node_count, (long long)g->edge_count); + return el_wrap_str(el_strdup(buf)); +} + +/* engram_query_range — temporal range query. + * Returns a JSON array of nodes whose created_at OR last_activated falls + * within [start_ms, end_ms], sorted by created_at ascending. + * Enables "what was I working on last Tuesday?" style queries by passing + * unix-millisecond timestamps for the start and end of the target interval. + * Both endpoints are inclusive. Pass 0 for start_ms to mean "beginning of + * time"; pass 0 for end_ms to mean "now". */ +el_val_t engram_query_range(el_val_t start_ms_v, el_val_t end_ms_v) { + EngramStore* g = engram_get(); + int64_t start_ms = (int64_t)start_ms_v; + int64_t end_ms = (int64_t)end_ms_v; + if (end_ms <= 0) end_ms = engram_now_ms(); + + /* Collect matching indices. */ + int64_t* idx = malloc((size_t)g->node_count * sizeof(int64_t)); + if (!idx) return el_wrap_str(el_strdup("[]")); + int64_t mc = 0; + for (int64_t i = 0; i < g->node_count; i++) { + EngramNode* n = &g->nodes[i]; + int in_created = (n->created_at >= start_ms && n->created_at <= end_ms); + int in_activated = (n->last_activated >= start_ms && n->last_activated <= end_ms); + if (in_created || in_activated) idx[mc++] = i; + } + /* Sort by created_at ascending (insertion sort — N is small in practice). */ + for (int64_t i = 1; i < mc; i++) { + int64_t key = idx[i]; + int64_t kts = g->nodes[key].created_at; + int64_t j = i - 1; + while (j >= 0 && g->nodes[idx[j]].created_at > kts) { + idx[j + 1] = idx[j]; + j--; + } + idx[j + 1] = key; + } + JsonBuf b; jb_init(&b); + jb_putc(&b, '['); + for (int64_t i = 0; i < mc; i++) { + if (i > 0) jb_putc(&b, ','); + engram_emit_node_json(&b, &g->nodes[idx[i]]); + } + jb_putc(&b, ']'); + free(idx); + return el_wrap_str(b.buf); +} + +/* ── DHARMA network ───────────────────────────────────────────────────────── + * Real implementation. Peers are addressed by `dharma_id` — either bare + * (e.g. "ntn-genesis", transport defaults to http://localhost:7770) or + * "@" where is the peer's Engram-exposed daemon. + * + * Channels are logical handles cached per-cgi: `dharma_connect` is + * idempotent and returns "ch:". The channel registry below tracks + * every cgi_id we've connected to and its resolved transport URL. + * + * Relationship weights live in the local Engram graph: edges of type + * "dharma-relation" between a synthetic local node ("dharma:self") and + * synthetic peer nodes ("dharma:peer:"). Hebbian increments + * accumulate in EngramEdge.weight, clamped to [0.0, 1.0]. + * + * Events arrive over HTTP via the application's request handler, which is + * expected to call el_runtime_dharma_event_arrive() when it sees a + * /dharma/event POST. dharma_field() blocks on a per-event-type queue. + */ + +#define DHARMA_DEFAULT_URL "http://localhost:7770" + +/* Channel registry — one entry per known peer. */ +typedef struct DharmaChannel { + char* cgi_id; /* full dharma_id including any @ suffix */ + char* base_id; /* registry-id portion (before @) for relationship lookup */ + char* url; /* resolved transport URL */ + char* channel_id; /* "ch:" */ +} DharmaChannel; + +static DharmaChannel* _dharma_channels = NULL; +static size_t _dharma_channel_count = 0; +static size_t _dharma_channel_cap = 0; +static pthread_mutex_t _dharma_channel_mu = PTHREAD_MUTEX_INITIALIZER; + +/* Event queue — per-type linked list. dharma_field blocks on _dharma_event_cv. */ +typedef struct DharmaEvent { + char* event_type; + char* payload; + char* source; + int64_t timestamp; + struct DharmaEvent* next; +} DharmaEvent; + +static DharmaEvent* _dharma_event_head = NULL; +static DharmaEvent* _dharma_event_tail = NULL; +static pthread_mutex_t _dharma_event_mu = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t _dharma_event_cv = PTHREAD_COND_INITIALIZER; + +/* Split "@" → (base_id, url). If no "@", base_id = full, url = default. + * Returned strings are heap-allocated; caller must free. */ +static void dharma_parse_id(const char* full, char** out_base, char** out_url) { + if (!full) full = ""; + const char* at = strchr(full, '@'); + if (at) { + size_t bn = (size_t)(at - full); + char* b = malloc(bn + 1); + memcpy(b, full, bn); b[bn] = '\0'; + *out_base = b; + *out_url = el_strdup(at + 1); + if (!**out_url) { free(*out_url); *out_url = el_strdup(DHARMA_DEFAULT_URL); } + } else { + *out_base = el_strdup(full); + *out_url = el_strdup(DHARMA_DEFAULT_URL); + } +} + +/* Find existing channel by full cgi_id. Caller must hold _dharma_channel_mu. */ +static DharmaChannel* dharma_find_channel_locked(const char* cgi_id) { + if (!cgi_id) return NULL; + for (size_t i = 0; i < _dharma_channel_count; i++) { + if (_dharma_channels[i].cgi_id && + strcmp(_dharma_channels[i].cgi_id, cgi_id) == 0) { + return &_dharma_channels[i]; + } + } + return NULL; +} + +/* Add a new channel entry. Caller must hold _dharma_channel_mu. */ +static DharmaChannel* dharma_add_channel_locked(const char* cgi_id) { + if (_dharma_channel_count >= _dharma_channel_cap) { + size_t nc = _dharma_channel_cap ? _dharma_channel_cap * 2 : 8; + _dharma_channels = realloc(_dharma_channels, nc * sizeof(DharmaChannel)); + if (!_dharma_channels) { fputs("el_runtime: out of memory\n", stderr); exit(1); } + memset(_dharma_channels + _dharma_channel_cap, 0, + (nc - _dharma_channel_cap) * sizeof(DharmaChannel)); + _dharma_channel_cap = nc; + } + DharmaChannel* ch = &_dharma_channels[_dharma_channel_count++]; + char* base = NULL; char* url = NULL; + dharma_parse_id(cgi_id, &base, &url); + ch->cgi_id = el_strdup(cgi_id ? cgi_id : ""); + ch->base_id = base; + ch->url = url; + size_t cn = strlen(ch->cgi_id) + 4; + ch->channel_id = malloc(cn); + snprintf(ch->channel_id, cn, "ch:%s", ch->cgi_id); + return ch; +} + +el_val_t dharma_connect(el_val_t cgi_id) { + const char* id = EL_CSTR(cgi_id); + if (!id || !*id) return el_wrap_str(el_strdup("")); + pthread_mutex_lock(&_dharma_channel_mu); + DharmaChannel* ch = dharma_find_channel_locked(id); + if (!ch) ch = dharma_add_channel_locked(id); + char* out = el_strdup(ch->channel_id); + pthread_mutex_unlock(&_dharma_channel_mu); + return el_wrap_str(out); +} + +/* Build an error JSON body — same shape http_error_json uses. */ +static el_val_t dharma_error_json(const char* msg) { + return http_error_json(msg); +} + +el_val_t dharma_send(el_val_t channel, el_val_t content) { + const char* ch_id = EL_CSTR(channel); + const char* msg = EL_CSTR(content); + if (!ch_id || strncmp(ch_id, "ch:", 3) != 0) { + return dharma_error_json("invalid channel"); + } + const char* peer_id = ch_id + 3; + /* Look up channel; if unknown (caller fabricated), auto-register. */ + pthread_mutex_lock(&_dharma_channel_mu); + DharmaChannel* ch = dharma_find_channel_locked(peer_id); + if (!ch) ch = dharma_add_channel_locked(peer_id); + char* url = el_strdup(ch->url); + pthread_mutex_unlock(&_dharma_channel_mu); + /* Build /dharma/recv body. */ + const char* from = _el_cgi_dharma_id ? _el_cgi_dharma_id : "(unknown)"; + char* esc_ch = json_escape_alloc(ch_id); + char* esc_from = json_escape_alloc(from); + char* esc_msg = json_escape_alloc(msg ? msg : ""); + JsonBuf b; jb_init(&b); + jb_puts(&b, "{\"channel\":\""); jb_puts(&b, esc_ch); + jb_puts(&b, "\",\"from\":\""); jb_puts(&b, esc_from); + jb_puts(&b, "\",\"content\":\""); jb_puts(&b, esc_msg); + jb_puts(&b, "\"}"); + free(esc_ch); free(esc_from); free(esc_msg); + size_t ul = strlen(url) + 16; + char* full_url = malloc(ul); + snprintf(full_url, ul, "%s/dharma/recv", url); + struct curl_slist* h = NULL; + h = curl_slist_append(h, "Content-Type: application/json"); + el_val_t resp = http_do("POST", full_url, b.buf, h); + curl_slist_free_all(h); + free(b.buf); free(full_url); free(url); + return resp; +} + +el_val_t dharma_activate(el_val_t query) { + const char* q = EL_CSTR(query); + if (!q) q = ""; + el_val_t out = el_list_empty(); + char* esc_q = json_escape_alloc(q); + JsonBuf body; jb_init(&body); + jb_puts(&body, "{\"query\":\""); jb_puts(&body, esc_q); jb_puts(&body, "\"}"); + free(esc_q); + + /* Snapshot the channel list under lock so we can iterate without + * holding the mutex during network I/O. */ + pthread_mutex_lock(&_dharma_channel_mu); + size_t n = _dharma_channel_count; + char** urls = calloc(n ? n : 1, sizeof(char*)); + char** ids = calloc(n ? n : 1, sizeof(char*)); + char** bases = calloc(n ? n : 1, sizeof(char*)); + for (size_t i = 0; i < n; i++) { + urls[i] = el_strdup(_dharma_channels[i].url); + ids[i] = el_strdup(_dharma_channels[i].cgi_id); + bases[i] = el_strdup(_dharma_channels[i].base_id); + } + pthread_mutex_unlock(&_dharma_channel_mu); + + for (size_t i = 0; i < n; i++) { + size_t ul = strlen(urls[i]) + 32; + char* full_url = malloc(ul); + snprintf(full_url, ul, "%s/api/activate", urls[i]); + struct curl_slist* h = NULL; + h = curl_slist_append(h, "Content-Type: application/json"); + el_val_t resp = http_do("POST", full_url, body.buf, h); + curl_slist_free_all(h); + free(full_url); + const char* rs = EL_CSTR(resp); + if (!rs || !*rs) continue; + if (rs[0] == '{' && strstr(rs, "\"error\"")) continue; + + /* Look up relationship weight (attenuation). */ + double rel_weight = 1.0; + { + const char* self_id = "dharma:self"; + char peer_node[512]; + snprintf(peer_node, sizeof(peer_node), "dharma:peer:%s", bases[i]); + EngramStore* g = engram_get(); + for (int64_t k = 0; k < g->edge_count; k++) { + EngramEdge* e = &g->edges[k]; + if (e->from_id && e->to_id && + strcmp(e->from_id, self_id) == 0 && + strcmp(e->to_id, peer_node) == 0 && + e->relation && strcmp(e->relation, "dharma-relation") == 0) { + rel_weight = e->weight; + break; + } + } + } + + /* Iterate the response array. Expect either a top-level array + * or an object whose "results" field is an array. */ + const char* arr = rs; + while (*arr == ' ' || *arr == '\t' || *arr == '\n' || *arr == '\r') arr++; + char* arr_owned = NULL; + if (*arr == '{') { + el_val_t r = json_get_raw(EL_STR(rs), EL_STR("results")); + const char* rr = EL_CSTR(r); + if (rr && *rr == '[') { + arr_owned = el_strdup(rr); + arr = arr_owned; + } else { + continue; + } + } + if (*arr != '[') { free(arr_owned); continue; } + const char* p = arr + 1; + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + while (*p && *p != ']') { + const char* end = json_skip_value(p); + size_t en = (size_t)(end - p); + char* obj = el_strbuf(en); + memcpy(obj, p, en); obj[en] = '\0'; + + /* Pull activation_strength if present, else 1.0. */ + el_val_t act_v = json_get_float(EL_STR(obj), EL_STR("activation_strength")); + double act = el_to_float(act_v); + if (!(act > 0.0 && act <= 100.0)) act = 1.0; + double final_act = act * rel_weight; + + el_val_t entry = el_map_new(0); + /* node = the inner JSON if present, else the entire obj. */ + el_val_t node_raw = json_get_raw(EL_STR(obj), EL_STR("node")); + const char* nr = EL_CSTR(node_raw); + entry = el_map_set(entry, EL_STR(el_strdup("node")), + (nr && *nr) ? node_raw : EL_STR(el_strdup(obj))); + entry = el_map_set(entry, EL_STR(el_strdup("source_cgi")), + EL_STR(el_strdup(ids[i]))); + entry = el_map_set(entry, EL_STR(el_strdup("activation_strength")), + el_from_float(final_act)); + out = el_list_append(out, entry); + free(obj); + p = end; + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || *p == ',') p++; + } + free(arr_owned); + } + for (size_t i = 0; i < n; i++) { free(urls[i]); free(ids[i]); free(bases[i]); } + free(urls); free(ids); free(bases); + free(body.buf); + return out; +} + +void dharma_emit(el_val_t event_type, el_val_t payload) { + const char* et = EL_CSTR(event_type); + const char* pay = EL_CSTR(payload); + if (!et) et = ""; + if (!pay) pay = ""; + const char* src = _el_cgi_dharma_id ? _el_cgi_dharma_id : "(unknown)"; + int64_t ts = engram_now_ms(); + + char* esc_et = json_escape_alloc(et); + char* esc_pay = json_escape_alloc(pay); + char* esc_src = json_escape_alloc(src); + JsonBuf b; jb_init(&b); + jb_puts(&b, "{\"type\":\""); jb_puts(&b, esc_et); + jb_puts(&b, "\",\"payload\":\""); jb_puts(&b, esc_pay); + jb_puts(&b, "\",\"source\":\""); jb_puts(&b, esc_src); + jb_puts(&b, "\",\"timestamp\":"); jb_emit_int(&b, ts); + jb_putc(&b, '}'); + free(esc_et); free(esc_pay); free(esc_src); + + /* Snapshot URLs to avoid holding the channel mutex during I/O. */ + pthread_mutex_lock(&_dharma_channel_mu); + size_t n = _dharma_channel_count; + char** urls = calloc(n ? n : 1, sizeof(char*)); + for (size_t i = 0; i < n; i++) urls[i] = el_strdup(_dharma_channels[i].url); + pthread_mutex_unlock(&_dharma_channel_mu); + + for (size_t i = 0; i < n; i++) { + size_t ul = strlen(urls[i]) + 32; + char* full_url = malloc(ul); + snprintf(full_url, ul, "%s/dharma/event", urls[i]); + struct curl_slist* h = NULL; + h = curl_slist_append(h, "Content-Type: application/json"); + el_val_t r = http_do("POST", full_url, b.buf, h); + (void)r; /* fire-and-forget — emit is not synchronous */ + curl_slist_free_all(h); + free(full_url); + } + for (size_t i = 0; i < n; i++) free(urls[i]); + free(urls); + free(b.buf); +} + +void el_runtime_dharma_event_arrive(const char* event_type, const char* payload, + const char* source) { + DharmaEvent* ev = calloc(1, sizeof(DharmaEvent)); + if (!ev) return; + ev->event_type = el_strdup(event_type ? event_type : ""); + ev->payload = el_strdup(payload ? payload : ""); + ev->source = el_strdup(source ? source : ""); + ev->timestamp = engram_now_ms(); + ev->next = NULL; + pthread_mutex_lock(&_dharma_event_mu); + if (_dharma_event_tail) _dharma_event_tail->next = ev; + else _dharma_event_head = ev; + _dharma_event_tail = ev; + pthread_cond_broadcast(&_dharma_event_cv); + pthread_mutex_unlock(&_dharma_event_mu); +} + +el_val_t dharma_field(el_val_t event_type) { + const char* et = EL_CSTR(event_type); + if (!et) et = ""; + + /* Compute deadline: now + 30 seconds. */ + struct timespec deadline; + clock_gettime(CLOCK_REALTIME, &deadline); + deadline.tv_sec += 30; + + DharmaEvent* found = NULL; + pthread_mutex_lock(&_dharma_event_mu); + while (1) { + /* Scan queue for matching type; pop and return first match. */ + DharmaEvent* prev = NULL; + DharmaEvent* cur = _dharma_event_head; + while (cur) { + if (cur->event_type && strcmp(cur->event_type, et) == 0) { + if (prev) prev->next = cur->next; + else _dharma_event_head = cur->next; + if (_dharma_event_tail == cur) _dharma_event_tail = prev; + cur->next = NULL; + found = cur; + break; + } + prev = cur; cur = cur->next; + } + if (found) break; + int rc = pthread_cond_timedwait(&_dharma_event_cv, &_dharma_event_mu, &deadline); + if (rc == ETIMEDOUT) break; + } + pthread_mutex_unlock(&_dharma_event_mu); + + if (!found) return el_map_new(0); + el_val_t m = el_map_new(0); + m = el_map_set(m, EL_STR(el_strdup("type")), + EL_STR(el_strdup(found->event_type ? found->event_type : ""))); + m = el_map_set(m, EL_STR(el_strdup("payload")), + EL_STR(el_strdup(found->payload ? found->payload : ""))); + m = el_map_set(m, EL_STR(el_strdup("source_cgi")), + EL_STR(el_strdup(found->source ? found->source : ""))); + m = el_map_set(m, EL_STR(el_strdup("timestamp")), (el_val_t)found->timestamp); + free(found->event_type); free(found->payload); free(found->source); free(found); + return m; +} + +/* Locate (or create) the local "dharma:self" node and the synthetic peer + * node "dharma:peer:". Returns the index of the dharma-relation + * edge, or -1 if not found. If `create` is non-zero, ensure the nodes + * and edge exist (creating them as needed) and return the edge index. */ +static int64_t dharma_find_or_create_relation_edge(const char* peer_base, int create) { + if (!peer_base || !*peer_base) return -1; + EngramStore* g = engram_get(); + const char* self_id = "dharma:self"; + char peer_node[512]; + snprintf(peer_node, sizeof(peer_node), "dharma:peer:%s", peer_base); + + /* Look for the edge first. */ + for (int64_t i = 0; i < g->edge_count; i++) { + EngramEdge* e = &g->edges[i]; + if (e->from_id && e->to_id && + strcmp(e->from_id, self_id) == 0 && + strcmp(e->to_id, peer_node) == 0 && + e->relation && strcmp(e->relation, "dharma-relation") == 0) { + return i; + } + } + if (!create) return -1; + + /* Ensure self node exists. We use a fixed id (not engram_new_id) so + * subsequent calls reuse the same one. */ + if (!engram_find_node(self_id)) { + engram_grow_nodes(); + EngramNode* n = &g->nodes[g->node_count]; + memset(n, 0, sizeof(*n)); + n->id = el_strdup(self_id); + n->content = el_strdup(_el_cgi_dharma_id ? _el_cgi_dharma_id : "(self)"); + n->node_type = el_strdup("DharmaSelf"); + n->label = el_strdup("dharma:self"); + n->tier = el_strdup("Working"); + n->tags = el_strdup("dharma"); + n->metadata = el_strdup("{}"); + n->salience = 1.0; n->importance = 1.0; n->confidence = 1.0; + int64_t now = engram_now_ms(); + n->created_at = now; n->updated_at = now; n->last_activated = now; + g->node_count++; + } + if (!engram_find_node(peer_node)) { + engram_grow_nodes(); + EngramNode* n = &g->nodes[g->node_count]; + memset(n, 0, sizeof(*n)); + n->id = el_strdup(peer_node); + n->content = el_strdup(peer_base); + n->node_type = el_strdup("DharmaPeer"); + n->label = el_strdup(peer_node); + n->tier = el_strdup("Working"); + n->tags = el_strdup("dharma"); + n->metadata = el_strdup("{}"); + n->salience = 0.5; n->importance = 0.5; n->confidence = 1.0; + int64_t now = engram_now_ms(); + n->created_at = now; n->updated_at = now; n->last_activated = now; + g->node_count++; + } + /* Create the edge with weight 0.0 — caller will increment. */ + engram_grow_edges(); + EngramEdge* e = &g->edges[g->edge_count]; + memset(e, 0, sizeof(*e)); + e->id = engram_new_id(); + e->from_id = el_strdup(self_id); + e->to_id = el_strdup(peer_node); + e->relation = el_strdup("dharma-relation"); + e->metadata = el_strdup("{}"); + e->weight = 0.0; + e->confidence = 1.0; + int64_t now = engram_now_ms(); + e->created_at = now; e->updated_at = now; + int64_t idx = g->edge_count; + g->edge_count++; + return idx; +} + +void dharma_strengthen(el_val_t cgi_id, el_val_t weight) { + const char* id = EL_CSTR(cgi_id); + if (!id || !*id) return; + char* base = NULL; char* url = NULL; + dharma_parse_id(id, &base, &url); + free(url); + int64_t ei = dharma_find_or_create_relation_edge(base, 1); + free(base); + if (ei < 0) return; + EngramStore* g = engram_get(); + double inc = engram_decode_score(weight); + if (!(inc >= 0.0)) inc = 0.0; + double w = g->edges[ei].weight + inc; + if (w < 0.0) w = 0.0; + if (w > 1.0) w = 1.0; + g->edges[ei].weight = w; + g->edges[ei].updated_at = engram_now_ms(); + g->edges[ei].last_fired = g->edges[ei].updated_at; +} + +el_val_t dharma_relationship(el_val_t cgi_id) { + const char* id = EL_CSTR(cgi_id); + if (!id || !*id) return el_from_float(0.0); + char* base = NULL; char* url = NULL; + dharma_parse_id(id, &base, &url); + free(url); + int64_t ei = dharma_find_or_create_relation_edge(base, 0); + free(base); + if (ei < 0) return el_from_float(0.0); + EngramStore* g = engram_get(); + return el_from_float(g->edges[ei].weight); +} + +el_val_t dharma_peers(void) { + /* Walk dharma-relation edges out of "dharma:self", weight > 0, sort desc. */ + EngramStore* g = engram_get(); + const char* self_id = "dharma:self"; + typedef struct { char* peer_base; double weight; } PeerEntry; + PeerEntry* peers = malloc((size_t)(g->edge_count + 1) * sizeof(PeerEntry)); + int64_t pcount = 0; + if (!peers) return el_list_empty(); + for (int64_t i = 0; i < g->edge_count; i++) { + EngramEdge* e = &g->edges[i]; + if (!e->from_id || !e->to_id) continue; + if (strcmp(e->from_id, self_id) != 0) continue; + if (!e->relation || strcmp(e->relation, "dharma-relation") != 0) continue; + if (e->weight <= 0.0) continue; + const char* prefix = "dharma:peer:"; + size_t pl = strlen(prefix); + if (strncmp(e->to_id, prefix, pl) != 0) continue; + peers[pcount].peer_base = el_strdup(e->to_id + pl); + peers[pcount].weight = e->weight; + pcount++; + } + /* Sort desc by weight. */ + for (int64_t i = 1; i < pcount; i++) { + PeerEntry key = peers[i]; + int64_t j = i - 1; + while (j >= 0 && peers[j].weight < key.weight) { + peers[j + 1] = peers[j]; j--; + } + peers[j + 1] = key; + } + el_val_t out = el_list_empty(); + for (int64_t i = 0; i < pcount; i++) { + out = el_list_append(out, EL_STR(peers[i].peer_base)); + } + free(peers); + return out; +} + +/* ── Batch 4: LLM (Anthropic API client) ─────────────────────────────────── */ +/* + * All LLM builtins call https://api.anthropic.com/v1/messages with the API + * key from env ANTHROPIC_API_KEY. Default model is "claude-sonnet-4-5" + * when the supplied model is empty/null. + * + * `llm_call_agentic` runs a real multi-turn tool_use/tool_result loop. + * Tool handlers are registered with `llm_register_tool(name, fn_name)`, + * which dlsym()s the named symbol. Each tool handler has the C signature + * el_val_t handler(el_val_t input_json); + * and returns a JSON-string el_val_t result. Iteration is capped at 10. + */ + +static const char* LLM_DEFAULT_MODEL = "claude-sonnet-4-5"; +static const char* LLM_API_URL = "https://api.anthropic.com/v1/messages"; +static const char* LLM_VERSION = "2023-06-01"; + +static const char* llm_resolve_model(const char* m) { + if (!m || !*m) return LLM_DEFAULT_MODEL; + return m; +} + +/* + * ── Configurable LLM provider chain ────────────────────────────────────────── + * + * Providers are configured via indexed env vars. The runtime tries each in + * order (0, 1, 2, ...) and returns the first successful non-empty response. + * + * Per provider (N = 0, 1, 2, ...): + * NEURON_LLM_N_URL — endpoint URL (base URL; /v1/chat/completions appended + * if format is "openai" and not already in URL) + * NEURON_LLM_N_KEY — API key + * NEURON_LLM_N_FORMAT — "openai" (default) or "anthropic" + * NEURON_LLM_N_MODEL — model name override (optional) + * + * Example — Neuron inference primary, Anthropic fallback: + * NEURON_LLM_0_URL=https://soma.../v1/chat/completions + * NEURON_LLM_0_KEY=svc-key + * NEURON_LLM_0_FORMAT=openai + * NEURON_LLM_0_MODEL=neuron + * NEURON_LLM_1_URL=https://api.anthropic.com/v1/messages + * NEURON_LLM_1_KEY=sk-ant-... + * NEURON_LLM_1_FORMAT=anthropic + * + * If no NEURON_LLM_0_URL is set, falls back to legacy ANTHROPIC_API_KEY. + */ + +#define LLM_MAX_PROVIDERS 16 + +/* forward declarations */ +static el_val_t llm_extract_text(el_val_t resp_val); +static el_val_t llm_extract_text_openai(el_val_t resp_val); + +static el_val_t llm_extract_text_openai(el_val_t resp_val) { + const char* resp = EL_CSTR(resp_val); + if (!resp || !*resp) return el_wrap_str(el_strdup("")); + if (resp[0] == '{' && strstr(resp, "\"error\"")) return el_wrap_str(el_strdup("")); + const char* choices = json_find_key(resp, "choices"); + if (!choices || *choices != '[') return el_wrap_str(el_strdup("")); + choices++; + while (*choices == ' ' || *choices == '\t') choices++; + if (*choices != '{') return el_wrap_str(el_strdup("")); + const char* end = json_skip_value(choices); + size_t n = (size_t)(end - choices); + char* obj = malloc(n + 1); memcpy(obj, choices, n); obj[n] = '\0'; + const char* msg = json_find_key(obj, "message"); + if (!msg || *msg != '{') { free(obj); return el_wrap_str(el_strdup("")); } + const char* msg_end = json_skip_value(msg); + size_t mn = (size_t)(msg_end - msg); + char* msg_obj = malloc(mn + 1); memcpy(msg_obj, msg, mn); msg_obj[mn] = '\0'; + const char* content = json_find_key(msg_obj, "content"); + el_val_t result = el_wrap_str(el_strdup("")); + if (content && *content == '"') { + JsonParser jp = { .p = content, .end = content + strlen(content), .err = 0 }; + char* text = jp_parse_string_raw(&jp); + if (!jp.err && text) result = el_wrap_str(text); + } + free(msg_obj); free(obj); + return result; +} + +/* Send a request to one provider. Returns the raw response string. + * format: 0 = openai, 1 = anthropic */ +static el_val_t llm_provider_request(const char* url, const char* key, + int format, const char* model, + const char* system_str, + const char* user_str) { + char* esc_sys = system_str && *system_str ? json_escape_alloc(system_str) : NULL; + char* esc_user = json_escape_alloc(user_str ? user_str : ""); + JsonBuf b; jb_init(&b); + struct curl_slist* h = NULL; + h = curl_slist_append(h, "Content-Type: application/json"); + + if (format == 0) { /* OpenAI */ + char full_url[1024]; + if (strstr(url, "/chat/completions") || strstr(url, "/messages")) { + snprintf(full_url, sizeof(full_url), "%s", url); + } else { + snprintf(full_url, sizeof(full_url), "%s/v1/chat/completions", url); + } + { size_t n = strlen(key)+24; char* l=malloc(n); snprintf(l,n,"Authorization: Bearer %s",key); h=curl_slist_append(h,l); free(l); } + jb_putc(&b, '{'); + jb_puts(&b, "\"model\":"); jb_emit_escaped(&b, model ? model : "neuron"); + jb_puts(&b, ",\"max_tokens\":4096,\"messages\":["); + if (esc_sys && *esc_sys) { jb_puts(&b,"{\"role\":\"system\",\"content\":\""); jb_puts(&b,esc_sys); jb_puts(&b,"\"},"); } + jb_puts(&b, "{\"role\":\"user\",\"content\":\""); jb_puts(&b, esc_user); jb_puts(&b, "\"}]}"); + el_val_t resp = http_do("POST", full_url, b.buf, h); + curl_slist_free_all(h); free(b.buf); + if (esc_sys) free(esc_sys); free(esc_user); + return llm_extract_text_openai(resp); + } else { /* Anthropic */ + { size_t n = strlen(key)+16; char* l=malloc(n); snprintf(l,n,"x-api-key: %s",key); h=curl_slist_append(h,l); free(l); } + { size_t n = strlen(LLM_VERSION)+32; char* l=malloc(n); snprintf(l,n,"anthropic-version: %s",LLM_VERSION); h=curl_slist_append(h,l); free(l); } + jb_putc(&b, '{'); + jb_puts(&b, "\"model\":"); jb_emit_escaped(&b, model ? model : LLM_DEFAULT_MODEL); + jb_puts(&b, ",\"max_tokens\":4096"); + if (esc_sys && *esc_sys) { jb_puts(&b,",\"system\":\""); jb_puts(&b,esc_sys); jb_puts(&b,"\""); } + jb_puts(&b, ",\"messages\":[{\"role\":\"user\",\"content\":\""); jb_puts(&b, esc_user); jb_puts(&b, "\"}]}"); + el_val_t resp = http_do("POST", url, b.buf, h); + curl_slist_free_all(h); free(b.buf); + if (esc_sys) free(esc_sys); free(esc_user); + return llm_extract_text(resp); + } +} + +static el_val_t llm_chain_call(const char* system_str, const char* user_str) { + char url_key[64], key_key[64], fmt_key[64], model_key[64]; + for (int i = 0; i < LLM_MAX_PROVIDERS; i++) { + snprintf(url_key, sizeof(url_key), "NEURON_LLM_%d_URL", i); + snprintf(key_key, sizeof(key_key), "NEURON_LLM_%d_KEY", i); + snprintf(fmt_key, sizeof(fmt_key), "NEURON_LLM_%d_FORMAT", i); + snprintf(model_key, sizeof(model_key), "NEURON_LLM_%d_MODEL", i); + const char* url = getenv(url_key); + const char* key = getenv(key_key); + if (!url || !*url || !key || !*key) break; /* end of chain */ + const char* fmt_s = getenv(fmt_key); + int fmt = (fmt_s && strcmp(fmt_s, "anthropic") == 0) ? 1 : 0; + const char* model = getenv(model_key); + fprintf(stderr, "[llm] trying provider %d (%s)\n", i, url); + el_val_t result = llm_provider_request(url, key, fmt, model, system_str, user_str); + const char* t = EL_CSTR(result); + if (t && *t && t[0] != '{') return result; /* success */ + fprintf(stderr, "[llm] provider %d failed or empty, trying next\n", i); + } + /* Legacy fallback: ANTHROPIC_API_KEY */ + const char* api_key = getenv("ANTHROPIC_API_KEY"); + if (!api_key || !*api_key) return http_error_json("no LLM providers configured"); + fprintf(stderr, "[llm] using legacy ANTHROPIC_API_KEY fallback\n"); + return llm_provider_request(LLM_API_URL, api_key, 1, NULL, system_str, user_str); +} + +/* Legacy llm_request — kept for backward compat with agentic loop internals */ +static el_val_t llm_request(const char* json_body) { + const char* api_key = getenv("ANTHROPIC_API_KEY"); + if (!api_key || !*api_key) return http_error_json("ANTHROPIC_API_KEY not set"); + struct curl_slist* h = NULL; + h = curl_slist_append(h, "Content-Type: application/json"); + { size_t n=strlen(api_key)+16; char* l=malloc(n); snprintf(l,n,"x-api-key: %s",api_key); h=curl_slist_append(h,l); free(l); } + { size_t n=strlen(LLM_VERSION)+32; char* l=malloc(n); snprintf(l,n,"anthropic-version: %s",LLM_VERSION); h=curl_slist_append(h,l); free(l); } + el_val_t resp = http_do("POST", LLM_API_URL, json_body, h); + curl_slist_free_all(h); + return resp; +} + +/* Extract concatenated assistant text from an Anthropic /v1/messages + * response. The response shape is: + * {"content":[{"type":"text","text":"..."}, ...], ...} + * If parsing fails, returns the raw response so the caller can inspect. + */ +static el_val_t llm_extract_text(el_val_t resp_val) { + const char* resp = EL_CSTR(resp_val); + if (!resp || !*resp) return el_wrap_str(el_strdup("")); + /* If error JSON, propagate as-is. */ + if (resp[0] == '{' && strstr(resp, "\"error\"")) { + return el_wrap_str(el_strdup(resp)); + } + /* Find "content":[ ... ] */ + const char* p = json_find_key(resp, "content"); + if (!p) return el_wrap_str(el_strdup(resp)); + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + if (*p != '[') return el_wrap_str(el_strdup(resp)); + p++; + JsonBuf out; jb_init(&out); + while (*p && *p != ']') { + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || *p == ',') p++; + if (*p != '{') break; + const char* end = json_skip_value(p); + size_t n = (size_t)(end - p); + char* obj = malloc(n + 1); + memcpy(obj, p, n); obj[n] = '\0'; + const char* type_p = json_find_key(obj, "type"); + if (type_p && *type_p == '"') { + JsonParser jp = { .p = type_p, .end = type_p + strlen(type_p), .err = 0 }; + char* type_s = jp_parse_string_raw(&jp); + if (!jp.err && type_s && strcmp(type_s, "text") == 0) { + const char* tp = json_find_key(obj, "text"); + if (tp && *tp == '"') { + JsonParser jp2 = { .p = tp, .end = tp + strlen(tp), .err = 0 }; + char* text_s = jp_parse_string_raw(&jp2); + if (!jp2.err && text_s) jb_puts(&out, text_s); + free(text_s); + } + } + free(type_s); + } + free(obj); + p = end; + } + return el_wrap_str(out.buf); +} + +el_val_t llm_call(el_val_t model, el_val_t prompt) { + const char* u = EL_CSTR(prompt); if (!u) u = ""; + return llm_chain_call(NULL, u); +} + +el_val_t llm_call_system(el_val_t model, el_val_t system_prompt, el_val_t user_prompt) { + const char* s = EL_CSTR(system_prompt); if (!s) s = ""; + const char* u = EL_CSTR(user_prompt); if (!u) u = ""; + return llm_chain_call(s, u); +} + +/* ── Tool registry for llm_call_agentic ─────────────────────────────────── */ + +typedef el_val_t (*llm_tool_fn)(el_val_t input); + +typedef struct LlmToolEntry { + char* name; + llm_tool_fn fn; +} LlmToolEntry; + +static LlmToolEntry _llm_tools[64]; +static size_t _llm_tool_count = 0; +static pthread_mutex_t _llm_tool_mu = PTHREAD_MUTEX_INITIALIZER; + +static llm_tool_fn llm_tool_lookup(const char* name) { + if (!name) return NULL; + llm_tool_fn fn = NULL; + pthread_mutex_lock(&_llm_tool_mu); + for (size_t i = 0; i < _llm_tool_count; i++) { + if (strcmp(_llm_tools[i].name, name) == 0) { fn = _llm_tools[i].fn; break; } + } + pthread_mutex_unlock(&_llm_tool_mu); + return fn; +} + +void llm_register_tool(el_val_t name, el_val_t handler_fn_name) { + const char* nm = EL_CSTR(name); + const char* sym = EL_CSTR(handler_fn_name); + if (!nm || !*nm || !sym || !*sym) return; + void* p = dlsym(RTLD_DEFAULT, sym); + if (!p) { + fprintf(stderr, "[llm_register_tool] symbol not found: %s\n", sym); + return; + } + pthread_mutex_lock(&_llm_tool_mu); + /* Replace existing entry by name. */ + for (size_t i = 0; i < _llm_tool_count; i++) { + if (strcmp(_llm_tools[i].name, nm) == 0) { + _llm_tools[i].fn = (llm_tool_fn)p; + pthread_mutex_unlock(&_llm_tool_mu); + return; + } + } + if (_llm_tool_count < sizeof(_llm_tools) / sizeof(_llm_tools[0])) { + _llm_tools[_llm_tool_count].name = el_strdup(nm); + _llm_tools[_llm_tool_count].fn = (llm_tool_fn)p; + _llm_tool_count++; + } + pthread_mutex_unlock(&_llm_tool_mu); +} + +/* Serialize the El `tools` list into the JSON `tools:[...]` field expected + * by the Anthropic API. Each tool is an ElMap with name/description/ + * input_schema. input_schema is treated as either a JSON-object string + * (passed through verbatim) or a missing field (substitute {}). */ +static void llm_emit_tools_json(JsonBuf* b, el_val_t tools_list) { + jb_putc(b, '['); + ElList* lst = (ElList*)(uintptr_t)tools_list; + int64_t n = lst ? lst->length : 0; + for (int64_t i = 0; i < n; i++) { + if (i > 0) jb_putc(b, ','); + ElMap* tm = as_map(lst->elems[i]); + const char* name = ""; + const char* desc = ""; + const char* schema = "{}"; + if (tm) { + for (int64_t k = 0; k < tm->count; k++) { + const char* key = EL_CSTR(tm->keys[k]); + const char* val = EL_CSTR(tm->values[k]); + if (!key || !val) continue; + if (strcmp(key, "name") == 0) name = val; + else if (strcmp(key, "description") == 0) desc = val; + else if (strcmp(key, "input_schema") == 0) schema = val; + } + } + char* esc_name = json_escape_alloc(name); + char* esc_desc = json_escape_alloc(desc); + jb_puts(b, "{\"name\":\""); jb_puts(b, esc_name); + jb_puts(b, "\",\"description\":\""); jb_puts(b, esc_desc); + jb_puts(b, "\",\"input_schema\":"); jb_puts(b, schema && *schema ? schema : "{}"); + jb_putc(b, '}'); + free(esc_name); free(esc_desc); + } + jb_putc(b, ']'); +} + +/* Walk the assistant `content` array and emit each block back into b, + * preserving the verbatim JSON of every block — used to re-include the + * assistant turn in the next request. */ +static void llm_emit_content_blocks(JsonBuf* b, const char* resp) { + const char* p = json_find_key(resp, "content"); + jb_putc(b, '['); + if (!p) { jb_putc(b, ']'); return; } + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + if (*p != '[') { jb_putc(b, ']'); return; } + p++; + int first = 1; + while (*p && *p != ']') { + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || *p == ',') p++; + if (*p != '{') break; + const char* end = json_skip_value(p); + if (!first) jb_putc(b, ','); + first = 0; + size_t n = (size_t)(end - p); + jb_reserve(b, n); + memcpy(b->buf + b->len, p, n); + b->len += n; + b->buf[b->len] = '\0'; + p = end; + } + jb_putc(b, ']'); +} + +/* Concatenate all "text" blocks from a response. Returns owned string. */ +static char* llm_concat_text_blocks(const char* resp) { + JsonBuf out; jb_init(&out); + if (!resp) return out.buf; + const char* p = json_find_key(resp, "content"); + if (!p) return out.buf; + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + if (*p != '[') return out.buf; + p++; + while (*p && *p != ']') { + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || *p == ',') p++; + if (*p != '{') break; + const char* end = json_skip_value(p); + size_t n = (size_t)(end - p); + char* obj = malloc(n + 1); + memcpy(obj, p, n); obj[n] = '\0'; + const char* tp = json_find_key(obj, "type"); + if (tp && *tp == '"') { + JsonParser jp = { .p = tp, .end = tp + strlen(tp), .err = 0 }; + char* tname = jp_parse_string_raw(&jp); + if (!jp.err && tname && strcmp(tname, "text") == 0) { + const char* xp = json_find_key(obj, "text"); + if (xp && *xp == '"') { + JsonParser jp2 = { .p = xp, .end = xp + strlen(xp), .err = 0 }; + char* txt = jp_parse_string_raw(&jp2); + if (!jp2.err && txt) jb_puts(&out, txt); + free(txt); + } + } + free(tname); + } + free(obj); + p = end; + } + return out.buf; +} + +/* Build tool_result message blocks for every tool_use in a response. + * Appends to `b` an array element for each tool_use; caller wraps. */ +static int llm_build_tool_results(JsonBuf* b, const char* resp) { + int any = 0; + const char* p = json_find_key(resp, "content"); + if (!p) return 0; + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; + if (*p != '[') return 0; + p++; + while (*p && *p != ']') { + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || *p == ',') p++; + if (*p != '{') break; + const char* end = json_skip_value(p); + size_t n = (size_t)(end - p); + char* obj = malloc(n + 1); + memcpy(obj, p, n); obj[n] = '\0'; + + const char* tp = json_find_key(obj, "type"); + char* type_s = NULL; + if (tp && *tp == '"') { + JsonParser jp = { .p = tp, .end = tp + strlen(tp), .err = 0 }; + type_s = jp_parse_string_raw(&jp); + } + if (type_s && strcmp(type_s, "tool_use") == 0) { + /* Extract id, name, input. */ + char* id_s = NULL; char* name_s = NULL; + const char* idp = json_find_key(obj, "id"); + if (idp && *idp == '"') { + JsonParser jp = { .p = idp, .end = idp + strlen(idp), .err = 0 }; + id_s = jp_parse_string_raw(&jp); + } + const char* np = json_find_key(obj, "name"); + if (np && *np == '"') { + JsonParser jp = { .p = np, .end = np + strlen(np), .err = 0 }; + name_s = jp_parse_string_raw(&jp); + } + el_val_t input_raw = json_get_raw(EL_STR(obj), EL_STR("input")); + const char* input_s = EL_CSTR(input_raw); + if (!input_s || !*input_s) input_s = "{}"; + + llm_tool_fn fn = llm_tool_lookup(name_s ? name_s : ""); + char* result = NULL; + int is_error = 0; + if (!fn) { + size_t en = strlen(name_s ? name_s : "(null)") + 64; + result = malloc(en); + snprintf(result, en, "{\"error\":\"tool not registered: %s\"}", + name_s ? name_s : "(null)"); + is_error = 1; + } else { + el_val_t out = fn(EL_STR(input_s)); + const char* os = EL_CSTR(out); + result = el_strdup(os ? os : ""); + } + + if (any) jb_putc(b, ','); + char* esc_id = json_escape_alloc(id_s ? id_s : ""); + char* esc_res = json_escape_alloc(result ? result : ""); + jb_puts(b, "{\"type\":\"tool_result\",\"tool_use_id\":\""); + jb_puts(b, esc_id); + jb_puts(b, "\",\"content\":\""); + jb_puts(b, esc_res); + jb_puts(b, "\""); + if (is_error) jb_puts(b, ",\"is_error\":true"); + jb_putc(b, '}'); + free(esc_id); free(esc_res); free(result); + free(id_s); free(name_s); + any = 1; + } + free(type_s); + free(obj); + p = end; + } + return any; +} + +el_val_t llm_call_agentic(el_val_t model, el_val_t system, el_val_t user, el_val_t tools) { + /* Empty tools list → degrade to plain system call. */ + ElList* tl = (ElList*)(uintptr_t)tools; + if (!tl || tl->length == 0) { + return llm_call_system(model, system, user); + } + const char* m = llm_resolve_model(EL_CSTR(model)); + const char* sys_p = EL_CSTR(system); if (!sys_p) sys_p = ""; + const char* usr_p = EL_CSTR(user); if (!usr_p) usr_p = ""; + + /* Build the static parts: tools JSON and system prompt — these don't + * change across iterations. */ + JsonBuf tools_buf; jb_init(&tools_buf); + llm_emit_tools_json(&tools_buf, tools); + char* esc_sys = json_escape_alloc(sys_p); + + /* messages array, accumulated as a mutable JSON fragment (no surrounding + * brackets — emitted at request time). */ + JsonBuf msgs; jb_init(&msgs); + /* First user message. */ + char* esc_user = json_escape_alloc(usr_p); + jb_puts(&msgs, "{\"role\":\"user\",\"content\":\""); + jb_puts(&msgs, esc_user); + jb_puts(&msgs, "\"}"); + free(esc_user); + + char* last_text = el_strdup(""); + el_val_t final_out = 0; + int reached_cap = 1; + + for (int iter = 0; iter < 10; iter++) { + /* Build request body. */ + JsonBuf body; jb_init(&body); + jb_putc(&body, '{'); + jb_puts(&body, "\"model\":"); jb_emit_escaped(&body, m); + jb_puts(&body, ",\"max_tokens\":4096"); + if (*sys_p) { + jb_puts(&body, ",\"system\":\""); + jb_puts(&body, esc_sys); + jb_puts(&body, "\""); + } + jb_puts(&body, ",\"tools\":"); + jb_puts(&body, tools_buf.buf); + jb_puts(&body, ",\"messages\":["); + jb_puts(&body, msgs.buf); + jb_puts(&body, "]}"); + + el_val_t resp_v = llm_request(body.buf); + free(body.buf); + const char* resp = EL_CSTR(resp_v); + if (!resp || !*resp) { + final_out = http_error_json("empty response"); + reached_cap = 0; + break; + } + if (resp[0] == '{' && strstr(resp, "\"error\"") && + !json_find_key(resp, "content")) { + final_out = el_wrap_str(el_strdup(resp)); + reached_cap = 0; + break; + } + + /* Update last_text from this response. */ + free(last_text); + last_text = llm_concat_text_blocks(resp); + + /* Inspect stop_reason. */ + el_val_t sr_v = json_get_string(EL_STR(resp), EL_STR("stop_reason")); + const char* sr = EL_CSTR(sr_v); if (!sr) sr = ""; + + if (strcmp(sr, "end_turn") == 0) { + final_out = el_wrap_str(el_strdup(last_text)); + reached_cap = 0; + break; + } + if (strcmp(sr, "max_tokens") == 0) { + size_t ln = strlen(last_text) + 16; + char* out = malloc(ln); + snprintf(out, ln, "%s\n[truncated]", last_text); + final_out = el_wrap_str(out); + reached_cap = 0; + break; + } + if (strcmp(sr, "tool_use") != 0) { + /* Unexpected stop reason; return the text we have. */ + final_out = el_wrap_str(el_strdup(last_text)); + reached_cap = 0; + break; + } + + /* Append the assistant turn (raw content blocks) to messages. */ + JsonBuf ab; jb_init(&ab); + jb_puts(&ab, ",{\"role\":\"assistant\",\"content\":"); + llm_emit_content_blocks(&ab, resp); + jb_putc(&ab, '}'); + jb_puts(&msgs, ab.buf); + free(ab.buf); + + /* Build tool_result message. */ + JsonBuf tr; jb_init(&tr); + jb_puts(&tr, ",{\"role\":\"user\",\"content\":["); + int any = llm_build_tool_results(&tr, resp); + jb_puts(&tr, "]}"); + if (any) { + jb_puts(&msgs, tr.buf); + } + free(tr.buf); + } + + if (reached_cap) { + size_t ln = strlen(last_text) + 32; + char* out = malloc(ln); + snprintf(out, ln, "[loop_cap_reached]\n%s", last_text); + final_out = el_wrap_str(out); + } + free(last_text); + free(esc_sys); + free(tools_buf.buf); + free(msgs.buf); + return final_out; +} + +/* base64-encode arbitrary bytes (returns owned C string). + * Internal helper for llm_vision; the public crypto entry point that El + * programs call is `base64_encode(el_val_t)` defined in the crypto block + * at the end of this file. */ +static char* el_b64_encode_internal(const unsigned char* src, size_t n) { + static const char tbl[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + size_t out_len = 4 * ((n + 2) / 3); + char* out = malloc(out_len + 1); + if (!out) return NULL; + size_t o = 0; + for (size_t i = 0; i < n;) { + uint32_t v = 0; int got = 0; + v |= (uint32_t)src[i++] << 16; got++; + if (i < n) { v |= (uint32_t)src[i++] << 8; got++; } + if (i < n) { v |= (uint32_t)src[i++]; got++; } + out[o++] = tbl[(v >> 18) & 0x3f]; + out[o++] = tbl[(v >> 12) & 0x3f]; + out[o++] = (got > 1) ? tbl[(v >> 6) & 0x3f] : '='; + out[o++] = (got > 2) ? tbl[v & 0x3f] : '='; + } + out[o] = '\0'; + return out; +} + +el_val_t llm_vision(el_val_t model, el_val_t system, el_val_t prompt, el_val_t image_url_or_b64) { + const char* m = llm_resolve_model(EL_CSTR(model)); + const char* s = EL_CSTR(system); if (!s) s = ""; + const char* u = EL_CSTR(prompt); if (!u) u = ""; + const char* img = EL_CSTR(image_url_or_b64); if (!img) img = ""; + + /* Choose source mode */ + char* image_block = NULL; + if (strncasecmp(img, "http://", 7) == 0 || strncasecmp(img, "https://", 8) == 0) { + char* esc_url = json_escape_alloc(img); + size_t n = strlen(esc_url) + 128; + image_block = malloc(n); + snprintf(image_block, n, + "{\"type\":\"image\",\"source\":{\"type\":\"url\",\"url\":\"%s\"}}", + esc_url); + free(esc_url); + } else if (strncmp(img, "data:", 5) == 0) { + /* Inline data URL: split media-type and base64 */ + const char* semi = strchr(img + 5, ';'); + const char* comma = strchr(img + 5, ','); + char media[64] = "image/png"; + if (semi && comma && semi < comma) { + size_t ml = (size_t)(semi - (img + 5)); + if (ml >= sizeof(media)) ml = sizeof(media) - 1; + memcpy(media, img + 5, ml); media[ml] = '\0'; + } + const char* b64 = comma ? comma + 1 : ""; + char* esc_media = json_escape_alloc(media); + char* esc_b64 = json_escape_alloc(b64); + size_t n = strlen(esc_media) + strlen(esc_b64) + 192; + image_block = malloc(n); + snprintf(image_block, n, + "{\"type\":\"image\",\"source\":{\"type\":\"base64\"," + "\"media_type\":\"%s\",\"data\":\"%s\"}}", + esc_media, esc_b64); + free(esc_media); free(esc_b64); + } else if (*img) { + /* Treat as file path: read, base64-encode, attach. */ + FILE* f = fopen(img, "rb"); + if (!f) { + char err[256]; snprintf(err, sizeof(err), "cannot open image: %s", img); + return http_error_json(err); + } + fseek(f, 0, SEEK_END); + long sz = ftell(f); + rewind(f); + if (sz <= 0) { fclose(f); return http_error_json("empty image file"); } + unsigned char* buf = malloc((size_t)sz); + if (!buf) { fclose(f); return http_error_json("oom"); } + size_t got = fread(buf, 1, (size_t)sz, f); + fclose(f); + char* b64 = el_b64_encode_internal(buf, got); + free(buf); + if (!b64) return http_error_json("base64 encode failed"); + const char* media = "image/png"; + size_t ilen = strlen(img); + if (ilen >= 4) { + if (strcasecmp(img + ilen - 4, ".jpg") == 0 || + (ilen >= 5 && strcasecmp(img + ilen - 5, ".jpeg") == 0)) media = "image/jpeg"; + else if (strcasecmp(img + ilen - 4, ".gif") == 0) media = "image/gif"; + else if (strcasecmp(img + ilen - 4, ".webp") == 0) media = "image/webp"; + } + char* esc_b64 = json_escape_alloc(b64); free(b64); + size_t n = strlen(esc_b64) + 192; + image_block = malloc(n); + snprintf(image_block, n, + "{\"type\":\"image\",\"source\":{\"type\":\"base64\"," + "\"media_type\":\"%s\",\"data\":\"%s\"}}", + media, esc_b64); + free(esc_b64); + } + + char* esc_sys = json_escape_alloc(s); + char* esc_user = json_escape_alloc(u); + JsonBuf b; jb_init(&b); + jb_putc(&b, '{'); + jb_puts(&b, "\"model\":"); jb_emit_escaped(&b, m); + jb_puts(&b, ",\"max_tokens\":4096"); + if (*s) { + jb_puts(&b, ",\"system\":\""); + jb_puts(&b, esc_sys); + jb_puts(&b, "\""); + } + jb_puts(&b, ",\"messages\":[{\"role\":\"user\",\"content\":["); + if (image_block) { + jb_puts(&b, image_block); + jb_putc(&b, ','); + } + jb_puts(&b, "{\"type\":\"text\",\"text\":\""); + jb_puts(&b, esc_user); + jb_puts(&b, "\"}]}]}"); + free(esc_sys); free(esc_user); free(image_block); + el_val_t resp = llm_request(b.buf); + free(b.buf); + return llm_extract_text(resp); +} + +el_val_t llm_models(void) { + el_val_t lst = el_list_empty(); + lst = el_list_append(lst, el_wrap_str(el_strdup("claude-sonnet-4-5"))); + lst = el_list_append(lst, el_wrap_str(el_strdup("claude-opus-4-7"))); + lst = el_list_append(lst, el_wrap_str(el_strdup("claude-haiku-4-5"))); + return lst; +} + +/* ── Native VM builtin aliases ────────────────────────────────────────────── + * El source files use native_* names (El VM builtins). + * When compiled to C, these map directly to el_* runtime functions. */ + +el_val_t native_list_get(el_val_t list, el_val_t index) { + return el_list_get(list, index); +} + +el_val_t native_list_len(el_val_t list) { + return el_list_len(list); +} + +el_val_t native_list_append(el_val_t list, el_val_t elem) { + return el_list_append(list, elem); +} + +el_val_t native_list_empty(void) { + return el_list_empty(); +} + +el_val_t native_list_clone(el_val_t list) { + return el_list_clone(list); +} + +el_val_t native_string_chars(el_val_t sv) { + const char* s = EL_CSTR(sv); + el_val_t result = el_list_empty(); + if (!s) return result; + while (*s) { + char buf[2]; + buf[0] = *s; + buf[1] = '\0'; + result = el_list_append(result, EL_STR(strdup(buf))); + s++; + } + return result; +} + +el_val_t native_int_to_str(el_val_t n) { + return int_to_str(n); +} + +/* ── Method-call shorthand aliases ────────────────────────────────────────── + * Short names that result from the method-call convention: + * myList.append(x) → append(myList, x) + * myList.len() → len(myList) + * myList.get(i) → get(myList, i) + * myMap.map_get(k) → map_get(myMap, k) + * myMap.map_set(k,v) → map_set(myMap, k, v) */ + +el_val_t append(el_val_t list, el_val_t elem) { return el_list_append(list, elem); } +el_val_t len(el_val_t list) { return el_list_len(list); } +el_val_t get(el_val_t list, el_val_t index) { return el_list_get(list, index); } +el_val_t map_get(el_val_t map, el_val_t key) { return el_map_get(map, key); } +el_val_t map_set(el_val_t map, el_val_t key, el_val_t value) { return el_map_set(map, key, value); } + +/* ── Crypto primitives ────────────────────────────────────────────────────── + * + * SHA-256 implementation adapted from Brad Conte's public-domain reference + * (https://github.com/B-Con/crypto-algorithms/blob/master/sha256.c, public + * domain per the project's LICENSE). HMAC follows RFC 2104. Base64 encoding + * follows RFC 4648; the URL-safe variant uses the alphabet from §5 of the + * RFC and omits padding (per JWT/JWS convention). + * + * Self-contained: no OpenSSL/libcrypto dependency. The runtime keeps its + * existing `-lcurl -lpthread -ldl -lm` link line. + * + * Binary outputs (sha256_bytes, hmac_sha256_bytes) tag their buffer with a + * magic header so base64_encode/base64url_encode can recover the exact byte + * length even when the payload contains embedded NULs. Plain C strings + * (without the header) fall back to strlen(), preserving the existing API + * shape for normal text inputs. */ + +/* Magic-header for length-tagged binary buffers. Layout: + * [ uint32_t magic = EL_MAGIC_BIN ][ uint32_t length ][ data... ][ \0 ] + * The returned el_val_t points at `data`, so consumers that strlen() it still + * get a sensible (though possibly truncated) view. el_bin_len() recovers the + * true length by sniffing the 8 bytes preceding the pointer. + * + * Magic value chosen with high MSB so it cannot collide with printable ASCII + * (the same discriminator pattern used by EL_MAGIC_LIST / EL_MAGIC_MAP). */ +#define EL_MAGIC_BIN 0xE1B17EAFu + +typedef struct { + uint32_t magic; + uint32_t length; +} el_bin_hdr_t; + +/* Allocate a length-tagged binary buffer; returns pointer to the data area. */ +static unsigned char* el_bin_alloc(size_t len) { + el_bin_hdr_t* hdr = (el_bin_hdr_t*)malloc(sizeof(el_bin_hdr_t) + len + 1); + if (!hdr) { fputs("el_runtime: out of memory (bin)\n", stderr); exit(1); } + hdr->magic = EL_MAGIC_BIN; + hdr->length = (uint32_t)len; + unsigned char* data = (unsigned char*)(hdr + 1); + data[len] = '\0'; /* keep NUL-terminated for accidental strlen calls */ + return data; +} + +/* Recover length from a possibly-tagged buffer. Returns 1 if tagged. */ +static int el_bin_lookup(const void* p, size_t* out_len) { + if (!p) { *out_len = 0; return 0; } + /* Avoid reading off the front of a page on tiny pointers (e.g. NULs + * passed in as int-cast values). 4096 is a safe lower bound on any + * platform we target. */ + if ((uintptr_t)p < 4096) return 0; + const el_bin_hdr_t* hdr = (const el_bin_hdr_t*)((const char*)p - sizeof(el_bin_hdr_t)); + if (hdr->magic != EL_MAGIC_BIN) return 0; + *out_len = hdr->length; + return 1; +} + +/* Effective input length: tagged length if present, else strlen. */ +static size_t el_input_len(const char* s) { + size_t n; + if (el_bin_lookup(s, &n)) return n; + return s ? strlen(s) : 0; +} + +/* ─── SHA-256 (Brad Conte / public domain) ──────────────────────────────── */ + +typedef struct { + unsigned char data[64]; + uint32_t datalen; + uint64_t bitlen; + uint32_t state[8]; +} el_sha256_ctx_t; + +static const uint32_t el_sha256_k[64] = { + 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, + 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, + 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, + 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, + 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, + 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070, + 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, + 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 +}; + +#define EL_ROTR(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) +#define EL_CH(x,y,z) (((x) & (y)) ^ (~(x) & (z))) +#define EL_MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) +#define EL_EP0(x) (EL_ROTR(x,2) ^ EL_ROTR(x,13) ^ EL_ROTR(x,22)) +#define EL_EP1(x) (EL_ROTR(x,6) ^ EL_ROTR(x,11) ^ EL_ROTR(x,25)) +#define EL_SIG0(x) (EL_ROTR(x,7) ^ EL_ROTR(x,18) ^ ((x) >> 3)) +#define EL_SIG1(x) (EL_ROTR(x,17) ^ EL_ROTR(x,19) ^ ((x) >> 10)) + +static void el_sha256_transform(el_sha256_ctx_t* ctx, const unsigned char* data) { + uint32_t a, b, c, d, e, f, g, h, t1, t2, m[64]; + int i, j; + for (i = 0, j = 0; i < 16; ++i, j += 4) { + m[i] = ((uint32_t)data[j] << 24) | ((uint32_t)data[j + 1] << 16) + | ((uint32_t)data[j + 2] << 8) | (uint32_t)data[j + 3]; + } + for (; i < 64; ++i) { + m[i] = EL_SIG1(m[i-2]) + m[i-7] + EL_SIG0(m[i-15]) + m[i-16]; + } + a = ctx->state[0]; b = ctx->state[1]; c = ctx->state[2]; d = ctx->state[3]; + e = ctx->state[4]; f = ctx->state[5]; g = ctx->state[6]; h = ctx->state[7]; + for (i = 0; i < 64; ++i) { + t1 = h + EL_EP1(e) + EL_CH(e,f,g) + el_sha256_k[i] + m[i]; + t2 = EL_EP0(a) + EL_MAJ(a,b,c); + h = g; g = f; f = e; e = d + t1; d = c; c = b; b = a; a = t1 + t2; + } + ctx->state[0] += a; ctx->state[1] += b; ctx->state[2] += c; ctx->state[3] += d; + ctx->state[4] += e; ctx->state[5] += f; ctx->state[6] += g; ctx->state[7] += h; +} + +static void el_sha256_init(el_sha256_ctx_t* ctx) { + ctx->datalen = 0; + ctx->bitlen = 0; + ctx->state[0] = 0x6a09e667; ctx->state[1] = 0xbb67ae85; + ctx->state[2] = 0x3c6ef372; ctx->state[3] = 0xa54ff53a; + ctx->state[4] = 0x510e527f; ctx->state[5] = 0x9b05688c; + ctx->state[6] = 0x1f83d9ab; ctx->state[7] = 0x5be0cd19; +} + +static void el_sha256_update(el_sha256_ctx_t* ctx, const unsigned char* data, size_t len) { + for (size_t i = 0; i < len; ++i) { + ctx->data[ctx->datalen++] = data[i]; + if (ctx->datalen == 64) { + el_sha256_transform(ctx, ctx->data); + ctx->bitlen += 512; + ctx->datalen = 0; + } + } +} + +static void el_sha256_final(el_sha256_ctx_t* ctx, unsigned char hash[32]) { + uint32_t i = ctx->datalen; + if (ctx->datalen < 56) { + ctx->data[i++] = 0x80; + while (i < 56) ctx->data[i++] = 0x00; + } else { + ctx->data[i++] = 0x80; + while (i < 64) ctx->data[i++] = 0x00; + el_sha256_transform(ctx, ctx->data); + memset(ctx->data, 0, 56); + } + ctx->bitlen += (uint64_t)ctx->datalen * 8; + ctx->data[63] = (unsigned char)( ctx->bitlen & 0xff); + ctx->data[62] = (unsigned char)((ctx->bitlen >> 8) & 0xff); + ctx->data[61] = (unsigned char)((ctx->bitlen >> 16) & 0xff); + ctx->data[60] = (unsigned char)((ctx->bitlen >> 24) & 0xff); + ctx->data[59] = (unsigned char)((ctx->bitlen >> 32) & 0xff); + ctx->data[58] = (unsigned char)((ctx->bitlen >> 40) & 0xff); + ctx->data[57] = (unsigned char)((ctx->bitlen >> 48) & 0xff); + ctx->data[56] = (unsigned char)((ctx->bitlen >> 56) & 0xff); + el_sha256_transform(ctx, ctx->data); + for (i = 0; i < 4; ++i) { + hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0xff; + hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0xff; + hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0xff; + hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0xff; + hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0xff; + hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0xff; + hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0xff; + hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0xff; + } +} + +static void el_sha256_oneshot(const unsigned char* data, size_t len, unsigned char out[32]) { + el_sha256_ctx_t c; + el_sha256_init(&c); + el_sha256_update(&c, data, len); + el_sha256_final(&c, out); +} + +/* ─── HMAC-SHA-256 (RFC 2104) ───────────────────────────────────────────── */ + +static void el_hmac_sha256(const unsigned char* key, size_t key_len, + const unsigned char* msg, size_t msg_len, + unsigned char out[32]) { + unsigned char k[64]; + unsigned char k_ipad[64]; + unsigned char k_opad[64]; + unsigned char inner[32]; + + if (key_len > 64) { + el_sha256_oneshot(key, key_len, k); + memset(k + 32, 0, 32); + } else { + memcpy(k, key, key_len); + memset(k + key_len, 0, 64 - key_len); + } + for (int i = 0; i < 64; ++i) { + k_ipad[i] = k[i] ^ 0x36; + k_opad[i] = k[i] ^ 0x5c; + } + { + el_sha256_ctx_t c; + el_sha256_init(&c); + el_sha256_update(&c, k_ipad, 64); + el_sha256_update(&c, msg, msg_len); + el_sha256_final(&c, inner); + } + { + el_sha256_ctx_t c; + el_sha256_init(&c); + el_sha256_update(&c, k_opad, 64); + el_sha256_update(&c, inner, 32); + el_sha256_final(&c, out); + } +} + +/* ─── Hex helper ────────────────────────────────────────────────────────── */ + +static el_val_t el_hex_encode(const unsigned char* data, size_t len) { + static const char digits[] = "0123456789abcdef"; + char* out = el_strbuf(len * 2); + for (size_t i = 0; i < len; ++i) { + out[i * 2] = digits[(data[i] >> 4) & 0xf]; + out[i * 2 + 1] = digits[ data[i] & 0xf]; + } + out[len * 2] = '\0'; + return el_wrap_str(out); +} + +/* ─── Base64 (RFC 4648) ─────────────────────────────────────────────────── */ + +static const char el_b64_std_alphabet[64] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const char el_b64_url_alphabet[64] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + +el_val_t el_base64_encode_n(const unsigned char* data, size_t len, int url_safe) { + const char* alphabet = url_safe ? el_b64_url_alphabet : el_b64_std_alphabet; + /* Standard form is padded to multiple of 4; URL-safe omits padding. */ + size_t out_cap = ((len + 2) / 3) * 4 + 1; + char* out = el_strbuf(out_cap); + size_t i = 0, j = 0; + while (i + 3 <= len) { + uint32_t v = ((uint32_t)data[i] << 16) | ((uint32_t)data[i+1] << 8) | (uint32_t)data[i+2]; + out[j++] = alphabet[(v >> 18) & 0x3f]; + out[j++] = alphabet[(v >> 12) & 0x3f]; + out[j++] = alphabet[(v >> 6) & 0x3f]; + out[j++] = alphabet[ v & 0x3f]; + i += 3; + } + size_t rem = len - i; + if (rem == 1) { + uint32_t v = (uint32_t)data[i] << 16; + out[j++] = alphabet[(v >> 18) & 0x3f]; + out[j++] = alphabet[(v >> 12) & 0x3f]; + if (!url_safe) { out[j++] = '='; out[j++] = '='; } + } else if (rem == 2) { + uint32_t v = ((uint32_t)data[i] << 16) | ((uint32_t)data[i+1] << 8); + out[j++] = alphabet[(v >> 18) & 0x3f]; + out[j++] = alphabet[(v >> 12) & 0x3f]; + out[j++] = alphabet[(v >> 6) & 0x3f]; + if (!url_safe) { out[j++] = '='; } + } + out[j] = '\0'; + return el_wrap_str(out); +} + +/* Decode either alphabet — accepts both '+/' and '-_' transparently, and + * tolerates missing padding (which JWTs typically omit). Whitespace is + * skipped for robustness. Invalid characters cause the decode to stop and + * the partial result so far is returned. */ +static el_val_t el_base64_decode_any(const char* in) { + if (!in) { + unsigned char* empty = el_bin_alloc(0); + return EL_STR((char*)empty); + } + size_t in_len = strlen(in); + /* Worst case: 3 output bytes per 4 input chars, +1 NUL slack. */ + unsigned char* out = el_bin_alloc(((in_len + 3) / 4) * 3 + 1); + + int8_t lut[256]; + for (int i = 0; i < 256; ++i) lut[i] = -1; + for (int i = 0; i < 64; ++i) lut[(unsigned char)el_b64_std_alphabet[i]] = (int8_t)i; + /* Allow URL-safe characters too (so one decoder handles both forms). */ + lut[(unsigned char)'-'] = 62; + lut[(unsigned char)'_'] = 63; + + uint32_t buf = 0; + int bits = 0; + size_t o = 0; + for (size_t i = 0; i < in_len; ++i) { + unsigned char c = (unsigned char)in[i]; + if (c == '=' || c == '\r' || c == '\n' || c == ' ' || c == '\t') continue; + int8_t v = lut[c]; + if (v < 0) break; /* invalid char — stop */ + buf = (buf << 6) | (uint32_t)v; + bits += 6; + if (bits >= 8) { + bits -= 8; + out[o++] = (unsigned char)((buf >> bits) & 0xff); + } + } + /* Patch the length header to the actual decoded length. */ + el_bin_hdr_t* hdr = (el_bin_hdr_t*)((char*)out - sizeof(el_bin_hdr_t)); + hdr->length = (uint32_t)o; + out[o] = '\0'; + return EL_STR((char*)out); +} + +/* ─── Public crypto entry points ────────────────────────────────────────── */ + +el_val_t el_sha256_bytes_n(const unsigned char* data, size_t len) { + unsigned char* out = el_bin_alloc(32); + el_sha256_oneshot(data, len, out); + return EL_STR((char*)out); +} + +el_val_t sha256_hex(el_val_t input) { + const char* s = EL_CSTR(input); + size_t n = el_input_len(s); + unsigned char digest[32]; + el_sha256_oneshot((const unsigned char*)(s ? s : ""), n, digest); + return el_hex_encode(digest, 32); +} + +el_val_t sha256_bytes(el_val_t input) { + const char* s = EL_CSTR(input); + size_t n = el_input_len(s); + return el_sha256_bytes_n((const unsigned char*)(s ? s : ""), n); +} + +el_val_t hmac_sha256_hex(el_val_t key, el_val_t message) { + const char* k = EL_CSTR(key); + const char* m = EL_CSTR(message); + size_t kn = el_input_len(k); + size_t mn = el_input_len(m); + unsigned char mac[32]; + el_hmac_sha256((const unsigned char*)(k ? k : ""), kn, + (const unsigned char*)(m ? m : ""), mn, + mac); + return el_hex_encode(mac, 32); +} + +el_val_t hmac_sha256_bytes(el_val_t key, el_val_t message) { + const char* k = EL_CSTR(key); + const char* m = EL_CSTR(message); + size_t kn = el_input_len(k); + size_t mn = el_input_len(m); + unsigned char* out = el_bin_alloc(32); + el_hmac_sha256((const unsigned char*)(k ? k : ""), kn, + (const unsigned char*)(m ? m : ""), mn, + out); + return EL_STR((char*)out); +} + +el_val_t base64_encode(el_val_t input) { + const char* s = EL_CSTR(input); + size_t n = el_input_len(s); + return el_base64_encode_n((const unsigned char*)(s ? s : ""), n, /*url_safe=*/0); +} + +el_val_t base64url_encode(el_val_t input) { + const char* s = EL_CSTR(input); + size_t n = el_input_len(s); + return el_base64_encode_n((const unsigned char*)(s ? s : ""), n, /*url_safe=*/1); +} + +el_val_t base64_decode(el_val_t input) { + return el_base64_decode_any(EL_CSTR(input)); +} + +el_val_t base64url_decode(el_val_t input) { + return el_base64_decode_any(EL_CSTR(input)); +} + +/* ── Post-quantum cryptography (liboqs + OpenSSL) ─────────────────────────── + * + * Algorithm choices (per CNSA 2.0 / NIST PQ guidance, as of 2024): + * Signatures: CRYSTALS-Dilithium-3 (NIST security level 3, balanced) + * KEM: CRYSTALS-Kyber-768 (NIST security level 3) + * Hash: SHA3-256 (Keccak) (PQ-aware protocols favour SHA3 over SHA2) + * Hybrid: X25519 || Kyber-768, combined via HKDF-SHA256 + * + * Why hybrid: Kyber is new. X25519 has 20+ years of analysis. Hybridizing + * preserves classical security if Kyber falls to a future cryptanalytic + * advance, and preserves PQ security if X25519 falls to a quantum adversary. + * "Recordable now, decryptable later" already threatens long-lived classical + * key exchange — the only safe move for keys protecting durable doctrine + * (CGI lineage, KindredGrants, Principal-CGI covenants) is to encapsulate + * with PQ today, even if the classical leg is what the wire shows. + * + * Compile-time detection: when is unavailable the pq_* functions + * compile to stubs that return a JSON error envelope. SHA3-256 stays + * available regardless (it's implemented inline, no liboqs dep). This lets + * the runtime build cleanly on dev machines without liboqs while production + * gets the full PQ stack. */ + +/* ─── SHA3-256 (Keccak, FIPS 202) ──────────────────────────────────────────── + * Inline reference implementation. ~120 LoC, no external dependency. + * rate=1088 bits, capacity=512 bits, output=256 bits, padding=0x06. */ + +static const uint64_t el_keccak_rc[24] = { + 0x0000000000000001ULL, 0x0000000000008082ULL, 0x800000000000808aULL, + 0x8000000080008000ULL, 0x000000000000808bULL, 0x0000000080000001ULL, + 0x8000000080008081ULL, 0x8000000000008009ULL, 0x000000000000008aULL, + 0x0000000000000088ULL, 0x0000000080008009ULL, 0x000000008000000aULL, + 0x000000008000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, + 0x8000000000008003ULL, 0x8000000000008002ULL, 0x8000000000000080ULL, + 0x000000000000800aULL, 0x800000008000000aULL, 0x8000000080008081ULL, + 0x8000000000008080ULL, 0x0000000080000001ULL, 0x8000000080008008ULL +}; + +static const unsigned el_keccak_rho[24] = { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 +}; + +static const unsigned el_keccak_pi[24] = { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 +}; + +#define EL_ROTL64(x, n) (((x) << (n)) | ((x) >> (64 - (n)))) + +static void el_keccak_f1600(uint64_t s[25]) { + for (int round = 0; round < 24; ++round) { + uint64_t bc[5], t; + for (int i = 0; i < 5; ++i) + bc[i] = s[i] ^ s[i+5] ^ s[i+10] ^ s[i+15] ^ s[i+20]; + for (int i = 0; i < 5; ++i) { + t = bc[(i+4) % 5] ^ EL_ROTL64(bc[(i+1) % 5], 1); + for (int j = 0; j < 25; j += 5) s[j+i] ^= t; + } + t = s[1]; + for (int i = 0; i < 24; ++i) { + int j = el_keccak_pi[i]; + bc[0] = s[j]; + s[j] = EL_ROTL64(t, el_keccak_rho[i]); + t = bc[0]; + } + for (int j = 0; j < 25; j += 5) { + for (int i = 0; i < 5; ++i) bc[i] = s[j+i]; + for (int i = 0; i < 5; ++i) + s[j+i] = bc[i] ^ ((~bc[(i+1) % 5]) & bc[(i+2) % 5]); + } + s[0] ^= el_keccak_rc[round]; + } +} + +static void el_sha3_256_oneshot(const unsigned char* data, size_t len, + unsigned char out[32]) { + uint64_t st[25] = {0}; + unsigned char* sb = (unsigned char*)st; + const size_t rate = 136; /* 1088 bits / 8 */ + size_t i = 0; + while (len - i >= rate) { + for (size_t k = 0; k < rate; ++k) sb[k] ^= data[i + k]; + el_keccak_f1600(st); + i += rate; + } + size_t rem = len - i; + for (size_t k = 0; k < rem; ++k) sb[k] ^= data[i + k]; + sb[rem] ^= 0x06; /* SHA3 domain-separation byte */ + sb[rate - 1] ^= 0x80; /* final-block padding bit (high bit of last byte) */ + el_keccak_f1600(st); + memcpy(out, sb, 32); +} + +el_val_t sha3_256_hex(el_val_t input) { + const char* s = EL_CSTR(input); + size_t n = el_input_len(s); + unsigned char digest[32]; + el_sha3_256_oneshot((const unsigned char*)(s ? s : ""), n, digest); + return el_hex_encode(digest, 32); +} + +/* ─── Hex decode helper ───────────────────────────────────────────────────── + * Returns a length-tagged binary buffer (so embedded NULs survive); on + * odd-length / invalid input returns NULL with *out_len = 0. Caller is + * responsible for emitting the error envelope. */ + +static int el_hex_nibble(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return -1; +} + +__attribute__((unused)) +static unsigned char* el_hex_decode(const char* s, size_t* out_len) { + *out_len = 0; + if (!s) return NULL; + size_t n = strlen(s); + if (n & 1) return NULL; + size_t blen = n / 2; + unsigned char* out = el_bin_alloc(blen); + for (size_t i = 0; i < blen; ++i) { + int hi = el_hex_nibble(s[i*2]); + int lo = el_hex_nibble(s[i*2 + 1]); + if (hi < 0 || lo < 0) return NULL; + out[i] = (unsigned char)((hi << 4) | lo); + } + *out_len = blen; + return out; +} + +/* JSON error envelope reused across all PQ entry points. */ +static el_val_t pq_error(const char* msg) { + return http_error_json(msg); +} + +#if __has_include() +#include +#define EL_HAVE_LIBOQS 1 +#else +#define EL_HAVE_LIBOQS 0 +#endif + +#if EL_HAVE_LIBOQS && __has_include() +#include +#define EL_HAVE_OPENSSL 1 +#else +#define EL_HAVE_OPENSSL 0 +#endif + +#if !EL_HAVE_LIBOQS + +/* ─── Stubs (liboqs unavailable) ─────────────────────────────────────────── + * Each entry point returns the same JSON error so callers can inspect a + * single canonical "missing primitive" string. pq_verify is the lone + * exception — verifying without liboqs simply means "not verified", so + * returning Bool false (0) keeps the type contract intact. */ + +#define EL_PQ_NO_LIB "liboqs not linked, post-quantum primitives unavailable" + +el_val_t pq_keygen_signature(void) { return pq_error(EL_PQ_NO_LIB); } +el_val_t pq_sign(el_val_t sk, el_val_t msg) { (void)sk; (void)msg; return pq_error(EL_PQ_NO_LIB); } +el_val_t pq_verify(el_val_t pk, el_val_t msg, el_val_t sig) { (void)pk; (void)msg; (void)sig; return EL_INT(0); } +el_val_t pq_kem_keygen(void) { return pq_error(EL_PQ_NO_LIB); } +el_val_t pq_kem_encaps(el_val_t pk) { (void)pk; return pq_error(EL_PQ_NO_LIB); } +el_val_t pq_kem_decaps(el_val_t sk, el_val_t ct) { (void)sk; (void)ct; return pq_error(EL_PQ_NO_LIB); } +el_val_t pq_hybrid_keygen(void) { return pq_error(EL_PQ_NO_LIB); } +el_val_t pq_hybrid_handshake(el_val_t pub) { (void)pub; return pq_error(EL_PQ_NO_LIB); } + +#else /* EL_HAVE_LIBOQS */ + +/* ─── Dilithium-3 / ML-DSA-65 signatures ──────────────────────────────── + * + * NIST FIPS 204 standardized CRYSTALS-Dilithium as ML-DSA. ML-DSA-65 is the + * FIPS form of what we historically called Dilithium-3 — same algorithm + * family, same security level, identical key/sig sizes, but with a couple + * of standardization-driven tweaks (e.g. domain separation in the message + * binding). liboqs 0.12+ exposes both names; 0.15+ retired the legacy + * "Dilithium" constants in favour of "ML-DSA". We prefer ML-DSA-65 if the + * header advertises it, fall back to Dilithium-3 otherwise. Anything + * already signed with the older constant remains verifiable against that + * same constant — callers should pin the algorithm via the OQS_SIG handle's + * method_name field if they need to interoperate with archival signatures. */ + +#if defined(OQS_SIG_alg_ml_dsa_65) +# define EL_DILITHIUM_ALG OQS_SIG_alg_ml_dsa_65 +#elif defined(OQS_SIG_alg_dilithium_3) +# define EL_DILITHIUM_ALG OQS_SIG_alg_dilithium_3 +#else +# define EL_DILITHIUM_ALG "ML-DSA-65" /* string fallback; runtime probe catches misconfig */ +#endif + +el_val_t pq_keygen_signature(void) { + OQS_SIG* sig = OQS_SIG_new(EL_DILITHIUM_ALG); + if (!sig) return pq_error("OQS_SIG_new(dilithium-3) failed"); + unsigned char* pk = (unsigned char*)malloc(sig->length_public_key); + unsigned char* sk = (unsigned char*)malloc(sig->length_secret_key); + if (!pk || !sk) { free(pk); free(sk); OQS_SIG_free(sig); return pq_error("oom"); } + if (OQS_SIG_keypair(sig, pk, sk) != OQS_SUCCESS) { + free(pk); free(sk); OQS_SIG_free(sig); + return pq_error("dilithium-3 keypair generation failed"); + } + el_val_t pk_hex = el_hex_encode(pk, sig->length_public_key); + el_val_t sk_hex = el_hex_encode(sk, sig->length_secret_key); + OQS_MEM_secure_free(sk, sig->length_secret_key); + free(pk); + + const char* pks = EL_CSTR(pk_hex); + const char* sks = EL_CSTR(sk_hex); + char* buf = el_strbuf(strlen(pks) + strlen(sks) + 64); + sprintf(buf, "{\"public_key\":\"%s\",\"secret_key\":\"%s\"}", pks, sks); + OQS_SIG_free(sig); + return el_wrap_str(buf); +} + +el_val_t pq_sign(el_val_t secret_key_hex, el_val_t message) { + size_t sk_len = 0; + unsigned char* sk = el_hex_decode(EL_CSTR(secret_key_hex), &sk_len); + if (!sk) return pq_error("invalid hex in secret_key"); + + OQS_SIG* sig = OQS_SIG_new(EL_DILITHIUM_ALG); + if (!sig) return pq_error("OQS_SIG_new(dilithium-3) failed"); + if (sk_len != sig->length_secret_key) { + OQS_SIG_free(sig); + return pq_error("secret_key length mismatch for dilithium-3"); + } + + const char* msg = EL_CSTR(message); + size_t msg_len = el_input_len(msg); + unsigned char* signature = (unsigned char*)malloc(sig->length_signature); + size_t signature_len = sig->length_signature; + if (!signature) { OQS_SIG_free(sig); return pq_error("oom"); } + + if (OQS_SIG_sign(sig, signature, &signature_len, + (const unsigned char*)(msg ? msg : ""), msg_len, sk) != OQS_SUCCESS) { + free(signature); OQS_SIG_free(sig); + return pq_error("dilithium-3 sign failed"); + } + el_val_t sig_hex = el_hex_encode(signature, signature_len); + free(signature); OQS_SIG_free(sig); + return sig_hex; +} + +el_val_t pq_verify(el_val_t public_key_hex, el_val_t message, el_val_t signature_hex) { + size_t pk_len = 0, sig_len = 0; + unsigned char* pk = el_hex_decode(EL_CSTR(public_key_hex), &pk_len); + unsigned char* signature = el_hex_decode(EL_CSTR(signature_hex), &sig_len); + if (!pk || !signature) return EL_INT(0); + + OQS_SIG* sig = OQS_SIG_new(EL_DILITHIUM_ALG); + if (!sig) return EL_INT(0); + if (pk_len != sig->length_public_key) { OQS_SIG_free(sig); return EL_INT(0); } + + const char* msg = EL_CSTR(message); + size_t msg_len = el_input_len(msg); + OQS_STATUS rc = OQS_SIG_verify(sig, + (const unsigned char*)(msg ? msg : ""), msg_len, + signature, sig_len, pk); + OQS_SIG_free(sig); + return (rc == OQS_SUCCESS) ? EL_INT(1) : EL_INT(0); +} + +/* ─── Kyber-768 / ML-KEM-768 KEM ──────────────────────────────────────── + * + * NIST FIPS 203 standardized CRYSTALS-Kyber as ML-KEM. ML-KEM-768 is the + * FIPS form of what we historically called Kyber-768. Same situation as + * Dilithium → ML-DSA: prefer the standardized constant, fall back to the + * legacy name. liboqs 0.15.0 still exposes OQS_KEM_alg_kyber_768; the + * algorithm is identical at the wire level to ML-KEM-768 except for FIPS + * domain-separation tweaks, so the two ciphertexts/keys are NOT + * cross-compatible. Pin the constant for archival material. */ + +#if defined(OQS_KEM_alg_ml_kem_768) +# define EL_KYBER_ALG OQS_KEM_alg_ml_kem_768 +#elif defined(OQS_KEM_alg_kyber_768) +# define EL_KYBER_ALG OQS_KEM_alg_kyber_768 +#else +# define EL_KYBER_ALG "ML-KEM-768" +#endif + +el_val_t pq_kem_keygen(void) { + OQS_KEM* kem = OQS_KEM_new(EL_KYBER_ALG); + if (!kem) return pq_error("OQS_KEM_new(kyber-768) failed"); + unsigned char* pk = (unsigned char*)malloc(kem->length_public_key); + unsigned char* sk = (unsigned char*)malloc(kem->length_secret_key); + if (!pk || !sk) { free(pk); free(sk); OQS_KEM_free(kem); return pq_error("oom"); } + if (OQS_KEM_keypair(kem, pk, sk) != OQS_SUCCESS) { + free(pk); free(sk); OQS_KEM_free(kem); + return pq_error("kyber-768 keypair generation failed"); + } + el_val_t pk_hex = el_hex_encode(pk, kem->length_public_key); + el_val_t sk_hex = el_hex_encode(sk, kem->length_secret_key); + OQS_MEM_secure_free(sk, kem->length_secret_key); + free(pk); + + const char* pks = EL_CSTR(pk_hex); + const char* sks = EL_CSTR(sk_hex); + char* buf = el_strbuf(strlen(pks) + strlen(sks) + 64); + sprintf(buf, "{\"public_key\":\"%s\",\"secret_key\":\"%s\"}", pks, sks); + OQS_KEM_free(kem); + return el_wrap_str(buf); +} + +el_val_t pq_kem_encaps(el_val_t public_key_hex) { + size_t pk_len = 0; + unsigned char* pk = el_hex_decode(EL_CSTR(public_key_hex), &pk_len); + if (!pk) return pq_error("invalid hex in public_key"); + + OQS_KEM* kem = OQS_KEM_new(EL_KYBER_ALG); + if (!kem) return pq_error("OQS_KEM_new(kyber-768) failed"); + if (pk_len != kem->length_public_key) { + OQS_KEM_free(kem); + return pq_error("public_key length mismatch for kyber-768"); + } + unsigned char* ct = (unsigned char*)malloc(kem->length_ciphertext); + unsigned char* ss = (unsigned char*)malloc(kem->length_shared_secret); + if (!ct || !ss) { free(ct); free(ss); OQS_KEM_free(kem); return pq_error("oom"); } + if (OQS_KEM_encaps(kem, ct, ss, pk) != OQS_SUCCESS) { + free(ct); free(ss); OQS_KEM_free(kem); + return pq_error("kyber-768 encapsulation failed"); + } + el_val_t ct_hex = el_hex_encode(ct, kem->length_ciphertext); + el_val_t ss_hex = el_hex_encode(ss, kem->length_shared_secret); + free(ct); + OQS_MEM_secure_free(ss, kem->length_shared_secret); + + const char* cts = EL_CSTR(ct_hex); + const char* sss = EL_CSTR(ss_hex); + char* buf = el_strbuf(strlen(cts) + strlen(sss) + 64); + sprintf(buf, "{\"ciphertext\":\"%s\",\"shared_secret\":\"%s\"}", cts, sss); + OQS_KEM_free(kem); + return el_wrap_str(buf); +} + +el_val_t pq_kem_decaps(el_val_t secret_key_hex, el_val_t ciphertext_hex) { + size_t sk_len = 0, ct_len = 0; + unsigned char* sk = el_hex_decode(EL_CSTR(secret_key_hex), &sk_len); + unsigned char* ct = el_hex_decode(EL_CSTR(ciphertext_hex), &ct_len); + if (!sk || !ct) return pq_error("invalid hex in inputs"); + + OQS_KEM* kem = OQS_KEM_new(EL_KYBER_ALG); + if (!kem) return pq_error("OQS_KEM_new(kyber-768) failed"); + if (sk_len != kem->length_secret_key || ct_len != kem->length_ciphertext) { + OQS_KEM_free(kem); + return pq_error("input length mismatch for kyber-768"); + } + unsigned char* ss = (unsigned char*)malloc(kem->length_shared_secret); + if (!ss) { OQS_KEM_free(kem); return pq_error("oom"); } + /* Kyber is IND-CCA via Fujisaki-Okamoto: decaps always returns *some* + * shared_secret even on tampered ciphertext (an implicit-rejection value + * derived from sk). Protocols MUST confirm the shared_secret matches via + * a subsequent step (e.g. AEAD tag, key-confirmation MAC) — do not + * assume decaps success implies authenticity. */ + if (OQS_KEM_decaps(kem, ss, ct, sk) != OQS_SUCCESS) { + free(ss); OQS_KEM_free(kem); + return pq_error("kyber-768 decapsulation failed"); + } + el_val_t ss_hex = el_hex_encode(ss, kem->length_shared_secret); + OQS_MEM_secure_free(ss, kem->length_shared_secret); + OQS_KEM_free(kem); + return ss_hex; +} + +/* ─── Hybrid handshake (X25519 + Kyber-768, HKDF-SHA256 combined) ─────── */ + +#if !EL_HAVE_OPENSSL + +el_val_t pq_hybrid_keygen(void) { + return pq_error("hybrid handshake requires OpenSSL (X25519); rebuild with -lcrypto"); +} +el_val_t pq_hybrid_handshake(el_val_t pub) { + (void)pub; + return pq_error("hybrid handshake requires OpenSSL (X25519); rebuild with -lcrypto"); +} + +#else /* EL_HAVE_OPENSSL */ + +/* HKDF-SHA256 (RFC 5869) — Extract+Expand. Reuses the inline HMAC-SHA256 + * already in this file. Empty salt → 32 zero bytes per the RFC. */ +static void el_hkdf_sha256(const unsigned char* salt, size_t salt_len, + const unsigned char* ikm, size_t ikm_len, + const unsigned char* info, size_t info_len, + unsigned char* out, size_t out_len) { + unsigned char zero_salt[32] = {0}; + if (salt_len == 0) { salt = zero_salt; salt_len = 32; } + unsigned char prk[32]; + el_hmac_sha256(salt, salt_len, ikm, ikm_len, prk); + + unsigned char t[32]; + size_t produced = 0; + unsigned char counter = 1; + unsigned char* buf = (unsigned char*)malloc(32 + info_len + 1); + if (!buf) { fputs("el_runtime: hkdf oom\n", stderr); return; } + while (produced < out_len) { + size_t off = 0; + if (counter > 1) { memcpy(buf, t, 32); off = 32; } + if (info && info_len) { memcpy(buf + off, info, info_len); off += info_len; } + buf[off++] = counter; + el_hmac_sha256(prk, 32, buf, off, t); + size_t chunk = (out_len - produced > 32) ? 32 : (out_len - produced); + memcpy(out + produced, t, chunk); + produced += chunk; + counter++; + } + free(buf); +} + +/* X25519 keygen via OpenSSL EVP. Returns 1 on success. + * Fills pk[32] and sk[32] (raw X25519 byte strings, no DER wrapper). */ +static int el_x25519_keygen(unsigned char pk[32], unsigned char sk[32]) { + EVP_PKEY_CTX* pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_X25519, NULL); + if (!pctx) return 0; + if (EVP_PKEY_keygen_init(pctx) != 1) { EVP_PKEY_CTX_free(pctx); return 0; } + EVP_PKEY* key = NULL; + if (EVP_PKEY_keygen(pctx, &key) != 1) { EVP_PKEY_CTX_free(pctx); return 0; } + EVP_PKEY_CTX_free(pctx); + + size_t plen = 32, slen = 32; + if (EVP_PKEY_get_raw_public_key (key, pk, &plen) != 1 || plen != 32) { + EVP_PKEY_free(key); return 0; + } + if (EVP_PKEY_get_raw_private_key(key, sk, &slen) != 1 || slen != 32) { + EVP_PKEY_free(key); return 0; + } + EVP_PKEY_free(key); + return 1; +} + +/* X25519 ECDH: derive 32-byte shared secret from local sk and remote pk. */ +static int el_x25519_derive(const unsigned char sk[32], const unsigned char rpk[32], + unsigned char ss[32]) { + EVP_PKEY* my = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, sk, 32); + EVP_PKEY* rem = EVP_PKEY_new_raw_public_key (EVP_PKEY_X25519, NULL, rpk, 32); + if (!my || !rem) { EVP_PKEY_free(my); EVP_PKEY_free(rem); return 0; } + EVP_PKEY_CTX* dctx = EVP_PKEY_CTX_new(my, NULL); + if (!dctx) { EVP_PKEY_free(my); EVP_PKEY_free(rem); return 0; } + int ok = 0; + size_t out_len = 32; + if (EVP_PKEY_derive_init(dctx) == 1 && + EVP_PKEY_derive_set_peer(dctx, rem) == 1 && + EVP_PKEY_derive(dctx, ss, &out_len) == 1 && + out_len == 32) ok = 1; + EVP_PKEY_CTX_free(dctx); + EVP_PKEY_free(my); + EVP_PKEY_free(rem); + return ok; +} + +/* Hybrid wire layout (binary form, before hex encode): + * public_key = x25519_pub (32) || kyber_pub (1184) → 1216 bytes + * secret_key = x25519_sec (32) || kyber_sec (2400) → 2432 bytes + * ciphertext = ephem_x25519_pub (32) || kyber_ct (1088) → 1120 bytes + * shared_secret = HKDF-SHA256(x25519_ss || kyber_ss, info="el-pq-hybrid-v1", 32 bytes) + * The keygen result also exposes the four component hex fields for callers + * that prefer to handle the legs independently. */ + +el_val_t pq_hybrid_keygen(void) { + OQS_KEM* kem = OQS_KEM_new(EL_KYBER_ALG); + if (!kem) return pq_error("OQS_KEM_new(kyber-768) failed"); + + unsigned char xpk[32], xsk[32]; + if (!el_x25519_keygen(xpk, xsk)) { + OQS_KEM_free(kem); + return pq_error("X25519 keygen failed"); + } + + unsigned char* kpk = (unsigned char*)malloc(kem->length_public_key); + unsigned char* ksk = (unsigned char*)malloc(kem->length_secret_key); + if (!kpk || !ksk) { free(kpk); free(ksk); OQS_KEM_free(kem); return pq_error("oom"); } + if (OQS_KEM_keypair(kem, kpk, ksk) != OQS_SUCCESS) { + free(kpk); free(ksk); OQS_KEM_free(kem); + return pq_error("kyber-768 keypair generation failed"); + } + + size_t pub_len = 32 + kem->length_public_key; + size_t sec_len = 32 + kem->length_secret_key; + unsigned char* pub_buf = (unsigned char*)malloc(pub_len); + unsigned char* sec_buf = (unsigned char*)malloc(sec_len); + if (!pub_buf || !sec_buf) { + free(pub_buf); free(sec_buf); free(kpk); + OQS_MEM_secure_free(ksk, kem->length_secret_key); + OQS_KEM_free(kem); return pq_error("oom"); + } + memcpy(pub_buf, xpk, 32); memcpy(pub_buf + 32, kpk, kem->length_public_key); + memcpy(sec_buf, xsk, 32); memcpy(sec_buf + 32, ksk, kem->length_secret_key); + + el_val_t x_pub_hex = el_hex_encode(xpk, 32); + el_val_t x_sec_hex = el_hex_encode(xsk, 32); + el_val_t k_pub_hex = el_hex_encode(kpk, kem->length_public_key); + el_val_t k_sec_hex = el_hex_encode(ksk, kem->length_secret_key); + el_val_t pub_hex = el_hex_encode(pub_buf, pub_len); + el_val_t sec_hex = el_hex_encode(sec_buf, sec_len); + + OQS_MEM_secure_free(ksk, kem->length_secret_key); + free(kpk); free(pub_buf); free(sec_buf); + OQS_KEM_free(kem); + memset(xsk, 0, 32); /* best-effort wipe of stack copy */ + + const char* xph = EL_CSTR(x_pub_hex); + const char* xsh = EL_CSTR(x_sec_hex); + const char* kph = EL_CSTR(k_pub_hex); + const char* ksh = EL_CSTR(k_sec_hex); + const char* pubh = EL_CSTR(pub_hex); + const char* sech = EL_CSTR(sec_hex); + + char* buf = el_strbuf(strlen(xph) + strlen(xsh) + strlen(kph) + strlen(ksh) + + strlen(pubh) + strlen(sech) + 256); + sprintf(buf, + "{\"x25519_pub\":\"%s\",\"x25519_sec\":\"%s\"," + "\"kyber_pub\":\"%s\",\"kyber_sec\":\"%s\"," + "\"public_key\":\"%s\",\"secret_key\":\"%s\"}", + xph, xsh, kph, ksh, pubh, sech); + return el_wrap_str(buf); +} + +/* Initiator-side handshake. Caller supplies the responder's combined public + * key (x25519_pub || kyber_pub, hex-encoded). The runtime: + * 1. Generates an ephemeral X25519 keypair, runs ECDH against the + * responder's static x25519_pub. + * 2. Runs Kyber-768 encaps against the responder's kyber_pub → kyber_ct, + * kyber_ss. + * 3. Combined shared = HKDF-SHA256(salt="", ikm = x25519_ss || kyber_ss, + * info = "el-pq-hybrid-v1", L = 32). + * 4. Returns combined ciphertext (= ephemeral_x25519_pub || kyber_ct) and + * the derived shared_secret. + * + * Responder side composition (intentionally not a separate runtime fn — + * trivial to express in El given pq_kem_decaps + a future x25519_derive + * primitive): split the ciphertext into ephem_xpk (32) and kyber_ct, run + * X25519(static_xsk, ephem_xpk) and pq_kem_decaps(static_kyber_sk, kyber_ct), + * then HKDF-SHA256 with the same salt/info to recover the same shared_secret. + * If a separate x25519 entry point becomes valuable, add `pq_hybrid_open` + * here taking (secret_key_combined, ciphertext_combined). */ +el_val_t pq_hybrid_handshake(el_val_t remote_pub_combined) { + size_t pub_len = 0; + unsigned char* rpub = el_hex_decode(EL_CSTR(remote_pub_combined), &pub_len); + if (!rpub) return pq_error("invalid hex in remote_pub_combined"); + + OQS_KEM* kem = OQS_KEM_new(EL_KYBER_ALG); + if (!kem) return pq_error("OQS_KEM_new(kyber-768) failed"); + if (pub_len != 32 + kem->length_public_key) { + OQS_KEM_free(kem); + return pq_error("remote_pub_combined length mismatch (expected x25519_pub || kyber_pub)"); + } + + unsigned char e_xpk[32], e_xsk[32], x_ss[32]; + if (!el_x25519_keygen(e_xpk, e_xsk)) { + OQS_KEM_free(kem); + return pq_error("X25519 ephemeral keygen failed"); + } + if (!el_x25519_derive(e_xsk, rpub, x_ss)) { + memset(e_xsk, 0, 32); + OQS_KEM_free(kem); + return pq_error("X25519 derive failed"); + } + memset(e_xsk, 0, 32); /* ephemeral; not needed after derive */ + + unsigned char* k_ct = (unsigned char*)malloc(kem->length_ciphertext); + unsigned char* k_ss = (unsigned char*)malloc(kem->length_shared_secret); + if (!k_ct || !k_ss) { + free(k_ct); free(k_ss); OQS_KEM_free(kem); + return pq_error("oom"); + } + if (OQS_KEM_encaps(kem, k_ct, k_ss, rpub + 32) != OQS_SUCCESS) { + free(k_ct); free(k_ss); OQS_KEM_free(kem); + return pq_error("kyber-768 encapsulation failed"); + } + + /* HKDF combine: ikm = x_ss || k_ss. */ + size_t ikm_len = 32 + kem->length_shared_secret; + unsigned char* ikm = (unsigned char*)malloc(ikm_len); + if (!ikm) { + free(k_ct); OQS_MEM_secure_free(k_ss, kem->length_shared_secret); + OQS_KEM_free(kem); + return pq_error("oom"); + } + memcpy(ikm, x_ss, 32); + memcpy(ikm + 32, k_ss, kem->length_shared_secret); + unsigned char combined[32]; + static const char info_str[] = "el-pq-hybrid-v1"; + el_hkdf_sha256(NULL, 0, ikm, ikm_len, + (const unsigned char*)info_str, sizeof(info_str) - 1, + combined, 32); + + memset(x_ss, 0, 32); + OQS_MEM_secure_free(k_ss, kem->length_shared_secret); + OQS_MEM_secure_free(ikm, ikm_len); + + /* Combined ciphertext = ephemeral_x25519_pub || kyber_ct. */ + size_t ct_len = 32 + kem->length_ciphertext; + unsigned char* combined_ct = (unsigned char*)malloc(ct_len); + if (!combined_ct) { free(k_ct); OQS_KEM_free(kem); return pq_error("oom"); } + memcpy(combined_ct, e_xpk, 32); + memcpy(combined_ct + 32, k_ct, kem->length_ciphertext); + free(k_ct); + OQS_KEM_free(kem); + + el_val_t ct_hex = el_hex_encode(combined_ct, ct_len); + el_val_t ss_hex = el_hex_encode(combined, 32); + free(combined_ct); + memset(combined, 0, 32); + + const char* cts = EL_CSTR(ct_hex); + const char* sss = EL_CSTR(ss_hex); + char* buf = el_strbuf(strlen(cts) + strlen(sss) + 64); + sprintf(buf, "{\"ciphertext\":\"%s\",\"shared_secret\":\"%s\"}", cts, sss); + return el_wrap_str(buf); +} + +#endif /* EL_HAVE_OPENSSL */ +#endif /* EL_HAVE_LIBOQS */ diff --git a/releases/v1.0.0-20260501/el_runtime.h b/releases/v1.0.0-20260501/el_runtime.h new file mode 100644 index 0000000..693c210 --- /dev/null +++ b/releases/v1.0.0-20260501/el_runtime.h @@ -0,0 +1,507 @@ +/* + * el_runtime.h — El language C runtime header + * + * Declares all built-in functions available to compiled El programs. + * Include this in every generated .c file. + * + * Value model: + * All El values are represented as el_val_t (= int64_t). + * On 64-bit systems a pointer fits in int64_t. + * String values are cast: (el_val_t)(uintptr_t)"hello" + * Integer values are stored directly. + * This lets arithmetic work naturally while still passing strings around. + * + * Type conventions (El -> C): + * String -> el_val_t (holds const char* via uintptr_t cast) + * Int -> el_val_t + * Bool -> el_val_t (0 = false, nonzero = true) + * Any -> el_val_t + * Void -> void + * + * Macros for convenience: + * EL_STR(s) cast string literal to el_val_t + * EL_CSTR(v) cast el_val_t back to const char* + * EL_INT(v) identity — el_val_t is already int64_t + * + * Link requirements: + * -lcurl — required for the HTTP client (http_get, http_post, llm_*). + * -lpthread — required for the HTTP server (one detached thread per + * connection, capped at 64 concurrent). + * -loqs — optional; required only when liboqs is installed and the + * pq_* / sha3_256_hex entry points are needed. Detected at + * compile time via __has_include(). + * -lcrypto — optional; pulled in alongside -loqs. Used for X25519 in + * pq_hybrid_* and HKDF-SHA256 derivation. + * + * Canonical compile command: + * cc -std=c11 -I el-compiler/runtime -lcurl -lpthread \ + * -o .c el-compiler/runtime/el_runtime.c + * + * With liboqs (post-quantum stack): + * cc -std=c11 -I el-compiler/runtime -lcurl -lpthread -loqs -lcrypto \ + * -o .c el-compiler/runtime/el_runtime.c + */ + +#pragma once + +#include +#include + +typedef int64_t el_val_t; + +#define EL_STR(s) ((el_val_t)(uintptr_t)(s)) +#define EL_CSTR(v) ((const char*)(uintptr_t)(v)) +#define EL_INT(v) (v) +#define EL_NULL ((el_val_t)0) + +/* Float values share the el_val_t (int64) slot via a bit-cast. + * The codegen emits Float literals as `el_from_float()` so the + * underlying bits represent the IEEE 754 double. Float-aware builtins + * (math, format, json) round-trip via these helpers. */ +static inline double el_to_float(el_val_t v) { + union { int64_t i; double f; } u; + u.i = (int64_t)v; + return u.f; +} + +static inline el_val_t el_from_float(double f) { + union { double f; int64_t i; } u; + u.f = f; + return (el_val_t)u.i; +} + +#ifdef __cplusplus +extern "C" { +#endif + +/* ── I/O ──────────────────────────────────────────────────────────────────── */ + +void println(el_val_t s); +void print(el_val_t s); +el_val_t readline(void); + +/* ── String builtins ─────────────────────────────────────────────────────── */ + +el_val_t el_str_concat(el_val_t a, el_val_t b); +el_val_t str_eq(el_val_t a, el_val_t b); +el_val_t str_starts_with(el_val_t s, el_val_t prefix); +el_val_t str_ends_with(el_val_t s, el_val_t suffix); +el_val_t str_len(el_val_t s); +el_val_t str_concat(el_val_t a, el_val_t b); +el_val_t int_to_str(el_val_t n); +el_val_t str_to_int(el_val_t s); +el_val_t str_slice(el_val_t s, el_val_t start, el_val_t end); +el_val_t str_contains(el_val_t s, el_val_t sub); +el_val_t str_replace(el_val_t s, el_val_t from, el_val_t to); +el_val_t str_to_upper(el_val_t s); +el_val_t str_to_lower(el_val_t s); +el_val_t str_trim(el_val_t s); + +/* ── Math ────────────────────────────────────────────────────────────────── */ + +el_val_t el_abs(el_val_t n); +el_val_t el_max(el_val_t a, el_val_t b); +el_val_t el_min(el_val_t a, el_val_t b); + +/* ── Refcount (ARC) ────────────────────────────────────────────────────────── + * Lists and Maps carry a refcount. Strings and ints do not — el_retain and + * el_release are safe no-ops on non-refcounted values (they sniff a magic + * header at offset 0 and only act if the magic matches). + * + * Codegen emits these at let-binding shadowing, function entry (params), and + * function exit (locals other than the returned value). The refcount lets + * el_list_append and el_map_set mutate in place when uniquely owned (cheap) + * and copy-on-write when shared (preserves persistent semantics across + * accumulator patterns in the compiler itself). */ + +void el_retain(el_val_t v); +void el_release(el_val_t v); + +/* ── List ────────────────────────────────────────────────────────────────── */ + +el_val_t el_list_new(el_val_t count, ...); +el_val_t el_list_len(el_val_t list); +el_val_t el_list_get(el_val_t list, el_val_t index); +el_val_t el_list_append(el_val_t list, el_val_t elem); +el_val_t el_list_empty(void); +el_val_t el_list_clone(el_val_t list); + +/* ── Map ─────────────────────────────────────────────────────────────────── */ + +el_val_t el_map_new(el_val_t pair_count, ...); +el_val_t el_get_field(el_val_t map, el_val_t key); +el_val_t el_map_get(el_val_t map, el_val_t key); +el_val_t el_map_set(el_val_t map, el_val_t key, el_val_t value); + +/* ── HTTP ─────────────────────────────────────────────────────────────────── */ + +el_val_t http_get(el_val_t url); +el_val_t http_post(el_val_t url, el_val_t body); +el_val_t http_post_json(el_val_t url, el_val_t json_body); +el_val_t http_get_with_headers(el_val_t url, el_val_t headers_map); +el_val_t http_post_with_headers(el_val_t url, el_val_t body, el_val_t headers_map); +el_val_t http_post_form_auth(el_val_t url, el_val_t form_body, el_val_t auth_header); +el_val_t http_delete(el_val_t url); +void http_serve(el_val_t port, el_val_t handler); +void http_set_handler(el_val_t name); + +/* HTTP server v2 ───────────────────────────────────────────────────────────── + * Same dispatch model as http_serve, but the handler signature is widened: + * + * el_val_t handler(method, path, headers_map, body) + * + * `headers_map` is an ElMap from lowercased header name → header value (both + * Strings). Repeated headers are joined with ", " per RFC 7230. + * + * Response value: the handler may return either + * (a) a plain body string — same auto-content-type / 200-OK behaviour as + * http_serve (3-arg) — or + * (b) a response envelope built with `http_response(status, headers_json, + * body)`. The runtime detects the envelope discriminator + * `"el_http_response":1` at the start of the returned string and + * unpacks status / headers / body before sending. + * + * The 3-arg http_serve(port, handler) remains supported unchanged for + * existing handlers (e.g. products/web/server.el): it dispatches with + * (method, path, body), hardcodes 200 OK, and auto-detects content type. */ +void http_serve_v2(el_val_t port, el_val_t handler); +void http_set_handler_v2(el_val_t name); + +/* Build an HTTP response envelope. `headers_json` should be a JSON object + * literal like `{"WWW-Authenticate":"Basic"}` (or "" / "{}" for none). The + * returned string carries the discriminator `{"el_http_response":1,...}` + * which the runtime's send-path detects and unpacks. Detection happens + * uniformly inside http_send_response, so a 3-arg handler may also return + * an envelope. The 3-arg variant remains documented as a fixed 200-OK + * auto-content-type contract for legacy handlers that return plain bodies. */ +el_val_t http_response(el_val_t status, el_val_t headers_json, el_val_t body); + +/* HTTP timeout — every libcurl request honors EL_HTTP_TIMEOUT_MS (default + * 60000ms). Read lazily on first use, so setting the env var any time before + * the first http_* call is sufficient. */ + +/* Streaming variants — write the response body straight to a file via + * libcurl's CURLOPT_WRITEFUNCTION = fwrite. These bypass the el_val_t string + * wrapper entirely, so binary payloads (audio/mpeg, image/png, etc.) survive + * embedded NUL bytes that would truncate a strlen()-based code path. + * + * Both honor EL_HTTP_TIMEOUT_MS, follow redirects, and accept the same + * `headers_map` shape as http_post_with_headers (ElMap of String→String). + * + * Return value: 1 on success (file fully written), 0 on any failure + * (network, file open, partial write). On failure the output file is removed + * so callers cannot mistake a partially-written file for a valid one. */ +el_val_t http_post_to_file(el_val_t url, el_val_t body, el_val_t headers_map, el_val_t output_path); +el_val_t http_get_to_file(el_val_t url, el_val_t headers_map, el_val_t output_path); + +/* ── URL encoding ────────────────────────────────────────────────────────── */ + +el_val_t url_encode(el_val_t s); /* RFC 3986 unreserved set */ +el_val_t url_decode(el_val_t s); /* '+' → space, %XX → byte */ + +/* ── Filesystem ──────────────────────────────────────────────────────────── */ + +el_val_t fs_read(el_val_t path); +el_val_t fs_write(el_val_t path, el_val_t content); +el_val_t fs_list(el_val_t path); +el_val_t fs_exists(el_val_t path); +el_val_t fs_mkdir(el_val_t path); /* mkdir -p, mode 0755 */ + +/* Length-explicit binary write. `length` is an Int (el_val_t holding the + * byte count). The caller knows the length from context — typically because + * `bytes` came from base64_decode (which produces a magic-tagged binary + * buffer with embedded NULs possible) and the caller already tracks the + * decoded length, OR because the bytes came from a fixed-size source + * (sha256_bytes = 32, hmac_sha256_bytes = 32). Bypasses strlen entirely. + * + * Returns 1 on success, 0 on failure (invalid path, can't open, partial + * write, negative length). On partial-write failure, the file is removed + * so callers cannot read back a truncated artefact. */ +el_val_t fs_write_bytes(el_val_t path, el_val_t bytes, el_val_t length); + +/* ── JSON ────────────────────────────────────────────────────────────────── */ + +el_val_t json_get(el_val_t json, el_val_t key); +el_val_t json_parse(el_val_t s); +el_val_t json_stringify(el_val_t v); +el_val_t json_get_string(el_val_t json_str, el_val_t key); +el_val_t json_get_int(el_val_t json_str, el_val_t key); +el_val_t json_get_float(el_val_t json_str, el_val_t key); +el_val_t json_get_bool(el_val_t json_str, el_val_t key); +el_val_t json_get_raw(el_val_t json_str, el_val_t key); +el_val_t json_set(el_val_t json_str, el_val_t key, el_val_t value); +el_val_t json_array_len(el_val_t json_str); +el_val_t json_array_get(el_val_t json_str, el_val_t index); +el_val_t json_array_get_string(el_val_t json_str, el_val_t index); + +/* ── Time ────────────────────────────────────────────────────────────────── */ + +el_val_t time_now(void); +el_val_t time_now_utc(void); +el_val_t sleep_secs(el_val_t secs); +el_val_t sleep_ms(el_val_t ms); +el_val_t time_format(el_val_t ts, el_val_t fmt); +el_val_t time_to_parts(el_val_t ts); +el_val_t time_from_parts(el_val_t secs, el_val_t ns, el_val_t tz); +el_val_t time_add(el_val_t ts, el_val_t n, el_val_t unit); +el_val_t time_diff(el_val_t ts1, el_val_t ts2, el_val_t unit); + +/* ── UUID ────────────────────────────────────────────────────────────────── */ + +el_val_t uuid_new(void); +el_val_t uuid_v4(void); + +/* ── Environment ─────────────────────────────────────────────────────────── */ + +el_val_t env(el_val_t key); + +/* ── In-process state K/V ────────────────────────────────────────────────── */ + +el_val_t state_set(el_val_t key, el_val_t value); +el_val_t state_get(el_val_t key); +el_val_t state_del(el_val_t key); +el_val_t state_keys(void); + +/* ── Float formatting ────────────────────────────────────────────────────── */ + +el_val_t float_to_str(el_val_t f); +el_val_t int_to_float(el_val_t n); +el_val_t float_to_int(el_val_t f); +el_val_t format_float(el_val_t f, el_val_t decimals); +el_val_t decimal_round(el_val_t f, el_val_t decimals); +el_val_t str_to_float(el_val_t s); + +/* ── Math (Float-aware) ──────────────────────────────────────────────────── */ + +el_val_t math_sqrt(el_val_t f); +el_val_t math_log(el_val_t f); +el_val_t math_ln(el_val_t f); +el_val_t math_sin(el_val_t f); +el_val_t math_cos(el_val_t f); +el_val_t math_pi(void); + +/* ── String additions ────────────────────────────────────────────────────── */ + +el_val_t str_index_of(el_val_t s, el_val_t sub); +el_val_t str_split(el_val_t s, el_val_t sep); +el_val_t str_char_at(el_val_t s, el_val_t i); +el_val_t str_char_code(el_val_t s, el_val_t i); +el_val_t str_pad_left(el_val_t s, el_val_t width, el_val_t pad); +el_val_t str_pad_right(el_val_t s, el_val_t width, el_val_t pad); +el_val_t str_format(el_val_t template, el_val_t data); +el_val_t str_lower(el_val_t s); +el_val_t str_upper(el_val_t s); + +/* ── List additions ──────────────────────────────────────────────────────── */ + +el_val_t list_push(el_val_t list, el_val_t elem); +el_val_t list_push_front(el_val_t list, el_val_t elem); +el_val_t list_join(el_val_t list, el_val_t sep); +el_val_t list_range(el_val_t start, el_val_t end); + +/* ── Bool helpers ────────────────────────────────────────────────────────── */ + +el_val_t bool_to_str(el_val_t b); + +/* ── Numeric parsing ─────────────────────────────────────────────────────── */ + +el_val_t parse_int(el_val_t s, el_val_t default_val); + +/* ── Process ─────────────────────────────────────────────────────────────── */ + +void exit_program(el_val_t code); +el_val_t getpid_now(void); + +/* ── CGI identity ───────────────────────────────────────────────────────────── + * Called at the start of main() in CGI programs (those with a `cgi {}` block). + * Records the program's DHARMA identity before any other code executes. */ + +void el_cgi_init(el_val_t name, el_val_t dharma_id, el_val_t principal, + el_val_t network, el_val_t engram); + +/* ── DHARMA network builtins ───────────────────────────────────────────────── + * Available to CGI programs (declared with a `cgi {}` block). + * + * Peers are addressed by `dharma_id` of the form + * "@" e.g. "ntn-genesis@http://localhost:7770" + * If the @ portion is omitted, transport defaults to + * "http://localhost:7770" (the local CGI daemon assumption). + * + * Wire protocol (all peers expose): + * POST /dharma/recv { channel, from, content } → response body + * POST /dharma/event { type, payload, source, timestamp } + * POST /api/activate { query } → list of nodes + * + * Hosting application's responsibility: an El program with a `cgi {}` block + * runs http_serve() with its own request handler; that handler should route + * "/dharma/event" requests by calling el_runtime_dharma_event_arrive() so + * incoming events feed dharma_field() queues. The runtime itself does not + * intercept any /dharma path. */ + +el_val_t dharma_connect(el_val_t cgi_id); +el_val_t dharma_send(el_val_t channel, el_val_t content); +el_val_t dharma_activate(el_val_t query); +void dharma_emit(el_val_t event_type, el_val_t payload); +el_val_t dharma_field(el_val_t event_type); +void dharma_strengthen(el_val_t cgi_id, el_val_t weight); +el_val_t dharma_relationship(el_val_t cgi_id); +el_val_t dharma_peers(void); + +/* Public C API: called by an El program's HTTP handler when a /dharma/event + * request arrives. Pushes onto the per-event-type queue and signals any + * pending dharma_field() blockers. All three arguments must be NUL-terminated + * C strings (or NULL — then treated as empty). */ +void el_runtime_dharma_event_arrive(const char* event_type, + const char* payload, + const char* source); + +/* ── Engram local graph primitives ─────────────────────────────────────────── + * Operate on the CGI's local Engram knowledge graph. + * `engram_activate` queries the local graph only; `dharma_activate` is + * network-wide across all connected CGI graphs. */ + +el_val_t engram_node(el_val_t content, el_val_t node_type, el_val_t salience); +el_val_t engram_node_full(el_val_t content, el_val_t node_type, el_val_t label, + el_val_t salience, el_val_t importance, el_val_t confidence, + el_val_t tier, el_val_t tags); +el_val_t engram_get_node(el_val_t id); +void engram_strengthen(el_val_t node_id); +void engram_forget(el_val_t node_id); +el_val_t engram_node_count(void); +el_val_t engram_search(el_val_t query, el_val_t limit); +el_val_t engram_scan_nodes(el_val_t limit, el_val_t offset); +void engram_connect(el_val_t from_id, el_val_t to_id, el_val_t weight, el_val_t relation); +el_val_t engram_edge_between(el_val_t from_id, el_val_t to_id); +el_val_t engram_neighbors(el_val_t node_id); +el_val_t engram_neighbors_filtered(el_val_t node_id, el_val_t max_depth, el_val_t direction); +el_val_t engram_edge_count(void); +el_val_t engram_activate(el_val_t query, el_val_t depth); +el_val_t engram_save(el_val_t path); +el_val_t engram_load(el_val_t path); + +/* JSON-string accessors — return pre-serialized JSON so HTTP handlers + * can pass results straight through without round-tripping ElList/ElMap + * through json_stringify. */ +el_val_t engram_get_node_json(el_val_t id); +el_val_t engram_search_json(el_val_t query, el_val_t limit); +el_val_t engram_scan_nodes_json(el_val_t limit, el_val_t offset); +el_val_t engram_neighbors_json(el_val_t node_id, el_val_t max_depth, el_val_t direction); +el_val_t engram_activate_json(el_val_t query, el_val_t depth); +el_val_t engram_stats_json(void); + +/* ── LLM (Anthropic API client) ───────────────────────────────────────────── + * All functions call https://api.anthropic.com/v1/messages with the API key + * from env ANTHROPIC_API_KEY. Default model when empty: claude-sonnet-4-5. */ + +el_val_t llm_call(el_val_t model, el_val_t prompt); +el_val_t llm_call_system(el_val_t model, el_val_t system_prompt, el_val_t user_prompt); +el_val_t llm_call_agentic(el_val_t model, el_val_t system, el_val_t user, el_val_t tools); +el_val_t llm_vision(el_val_t model, el_val_t system, el_val_t prompt, el_val_t image_url_or_b64); +el_val_t llm_models(void); + +/* Register a tool handler by name. The handler is looked up via dlsym + * (mirroring http_set_handler), so any El `fn (input)` compiles to + * a global C symbol that this function can locate at runtime. + * Handler signature: `el_val_t handler(el_val_t input_json)` — receives + * the tool input as a JSON-string el_val_t and returns a JSON-string + * el_val_t result. Used by llm_call_agentic. */ +void llm_register_tool(el_val_t name, el_val_t handler_fn_name); + +/* ── args() ───────────────────────────────────────────────────────────────── + * Provides access to command-line arguments passed to the program. + * Populated by el_runtime_init_args() before main() runs. */ + +el_val_t args(void); +void el_runtime_init_args(int argc, char** argv); + +/* ── Crypto primitives ───────────────────────────────────────────────────── + * SHA-256, HMAC-SHA-256, and base64 (standard + URL-safe). + * Self-contained — no OpenSSL/libcrypto dependency. The implementations are + * adapted from public-domain reference code (Brad Conte / RFC 4648). + * + * Bytes-returning variants (sha256_bytes, hmac_sha256_bytes) return a string + * value whose contents are raw binary; callers usually feed these into + * base64_encode. Note that el_val_t strings are NUL-terminated by convention, + * so the binary payload may contain embedded NULs — pass it directly into + * base64_encode (which uses an explicit length) rather than treating it as + * a printable C string. + * + * The "base64" variants emit/accept RFC 4648 standard alphabet with padding. + * The "base64url" variants use URL-safe alphabet (`-`/`_`) with no padding, + * as used in JWTs. */ + +el_val_t sha256_hex(el_val_t input); +el_val_t sha256_bytes(el_val_t input); +el_val_t hmac_sha256_hex(el_val_t key, el_val_t message); +el_val_t hmac_sha256_bytes(el_val_t key, el_val_t message); +el_val_t base64_encode(el_val_t input); +el_val_t base64_decode(el_val_t input); +el_val_t base64url_encode(el_val_t input); +el_val_t base64url_decode(el_val_t input); + +/* Length-aware variants (internal — exposed for the rare caller that already + * has a known-length binary buffer and doesn't want to round-trip through + * a NUL-terminated el_val_t string). Sha256_bytes and hmac_sha256_bytes feed + * these implicitly. */ +el_val_t el_sha256_bytes_n(const unsigned char* data, size_t len); +el_val_t el_base64_encode_n(const unsigned char* data, size_t len, int url_safe); + +/* ── Post-quantum primitives (liboqs-backed) ──────────────────────────────── + * All inputs/outputs hex-encoded. Algorithm choices: + * Signature: CRYSTALS-Dilithium-3 (NIST level 3, balanced) + * KEM: CRYSTALS-Kyber-768 (NIST level 3) + * Hash: SHA3-256 (Keccak) (PQ-aware protocols favour SHA3 over SHA2) + * + * If liboqs is not linked (detected via __has_include() at compile + * time), the pq_* entry points return a JSON-shaped error string so callers + * fail loudly rather than silently fall back to classical schemes: + * {"error":"liboqs not linked, post-quantum primitives unavailable"} + * + * The hybrid handshake pairs X25519 with Kyber-768 per NIST PQ guidance and + * CNSA 2.0. Combined shared secret is HKDF-SHA256(x25519_ss || kyber_ss). + * Even if Kyber falls, X25519 holds; if X25519 falls under quantum attack, + * Kyber holds. SHA3-256 also remains usable independent of liboqs (the + * Keccak permutation is PQ-OK as a primitive). */ + +el_val_t pq_keygen_signature(void); +el_val_t pq_sign(el_val_t secret_key_hex, el_val_t message); +el_val_t pq_verify(el_val_t public_key_hex, el_val_t message, el_val_t signature_hex); + +el_val_t pq_kem_keygen(void); +el_val_t pq_kem_encaps(el_val_t public_key_hex); +el_val_t pq_kem_decaps(el_val_t secret_key_hex, el_val_t ciphertext_hex); + +el_val_t pq_hybrid_keygen(void); +el_val_t pq_hybrid_handshake(el_val_t remote_pub_combined); + +el_val_t sha3_256_hex(el_val_t input); + +/* ── Native VM builtin aliases (for compiled El source) ───────────────────── + * These match the El VM's native_* builtins so that El source compiled + * to C can call the same names without modification. */ + +el_val_t native_list_get(el_val_t list, el_val_t index); +el_val_t native_list_len(el_val_t list); +el_val_t native_list_append(el_val_t list, el_val_t elem); +el_val_t native_list_empty(void); +el_val_t native_list_clone(el_val_t list); +el_val_t native_string_chars(el_val_t s); +el_val_t native_int_to_str(el_val_t n); + +/* ── Method-call shorthand aliases ────────────────────────────────────────── + * The El method-call convention `obj.method(args)` compiles to + * `method(obj, args)`. These aliases expose the runtime functions under + * the short names that result from method calls in El source. + * + * Example: `myList.append(x)` → `append(myList, x)` (calls this alias) + * `myList.len()` → `len(myList)` (calls this alias) */ + +el_val_t append(el_val_t list, el_val_t elem); /* el_list_append */ +el_val_t len(el_val_t list); /* el_list_len */ +el_val_t get(el_val_t list, el_val_t index); /* el_list_get */ +el_val_t map_get(el_val_t map, el_val_t key); /* el_map_get */ +el_val_t map_set(el_val_t map, el_val_t key, el_val_t value); /* el_map_set */ + +#ifdef __cplusplus +} +#endif diff --git a/spec/codegen-js.md b/spec/codegen-js.md new file mode 100644 index 0000000..4920bc4 --- /dev/null +++ b/spec/codegen-js.md @@ -0,0 +1,236 @@ +# El JavaScript Backend (codegen-js) + +**Status:** scaffolded. Hello-world compiles and runs. ~50% language coverage. Core runtime (~30 builtins) implemented. CGI / DHARMA / LLM / Engram intentionally stubbed. + +**Authoritative files** + +| File | Role | +|---|---| +| `el-compiler/src/codegen-js.el` | El → JS code generator (mirrors `codegen.el`) | +| `el-compiler/runtime/el_runtime.js` | Browser/Node runtime that compiled programs link against | +| `el-compiler/src/compiler.el` | Adds `compile_js()` and `--target=js` CLI dispatch | +| `spec/codegen-js.md` | This document | + +--- + +## 1. Why a JS backend exists + +El compiles to C today. C is the right substrate for the agent runtime, the DHARMA daemon, and Engram. But three first-class consumers of El need to **run in a browser**, where C is not an option: + +1. **`el-ui/runtime/`** — the activation-based frontend framework written in JS. The long-term plan is to author components and the runtime itself in El and compile them down to JS. +2. **`cgi-studio`** — the web app for cultivating CGIs. Today it is hand-written JS. Once the JS backend is mature, the studio's UI logic can be authored in El and share types/identifier names with the CGI it cultivates. +3. **Marketplace plugin UIs** — third parties writing browser-side El that runs untrusted in a sandbox. They need a JS target. + +A secondary motivation: **El-on-Node**. CLI tooling, build scripts, and tests benefit from a tight `el → js → node` cycle without a `cc` step. + +--- + +## 2. Type representation strategy + +The C backend pretends every value is `int64_t`. That is a deliberate runtime trick to avoid dynamic dispatch in generated C. JavaScript already has tagged dynamic values, so the JS backend is **simpler**: every El value is a native JS value, and the tag of `el_val_t` collapses into the JS type system. + +| El type | C representation | JS representation | +|---|---|---| +| `Int` | `int64_t` (direct) | `number` (with `Number.isSafeInteger` caveat — see §6) | +| `Float` | `int64_t` bit-cast of `double` via `el_from_float` | `number` (no bit-cast — JS number IS a double) | +| `Bool` | `int64_t`, 0 = false, nonzero = true | `boolean` | +| `String` | `(int64_t)(uintptr_t)cstring` | `string` | +| `Void` | C `void` | `undefined` | +| `[T]` (List) | `el_val_t` pointer to refcounted struct | `Array` | +| `Map` | `el_val_t` pointer to refcounted struct | plain object `{[key]: any}` | +| `EL_NULL` (`0`) | `(el_val_t)0` | `null` | +| Any | `el_val_t` | `any` (no compile-time check) | + +**Key consequences:** + +- `+` on two strings is JS `+` (string concat) — no `el_str_concat()` runtime call needed for the common case. The runtime DOES export `el_str_concat` for the cases where codegen does not know the types. +- `==` on strings is `===` — not `str_eq()`. Same disambiguation logic as the C backend (look at left/right kind, fall back to `str_eq` for identifiers without int annotation). +- `Map` access `m["foo"]` compiles to JS `m["foo"]` (no `el_get_field`). For `Field` access (`m.foo`) we emit `m["foo"]` so it works on plain objects regardless of prototype shape. +- List access `arr[i]` is JS `arr[i]`. No bounds checking — same as C (which segfaults on bad index). Could add `el_list_get` wrapper later for safe access. +- `EL_NULL` becomes JS `null`, not `undefined`. The runtime checks for `=== null` consistently. This avoids the JS undefined/null fork and matches El's single null value. + +--- + +## 3. Builtin runtime layer (`el_runtime.js`) + +Same function names as `el_runtime.c` wherever possible, so codegen-js can emit the same call sites. The runtime is a single ES module that exposes every builtin as a named export AND attaches them to a `globalThis.__el` namespace (so generated code can do either `import * as el from './el_runtime.js'` or assume globals). + +**The codegen-js generated output uses the global-namespace style:** every emitted file starts with `import './el_runtime.js'` (which side-effects the globals) so call sites stay flat — `println(x)` not `el.println(x)`. This matches the C backend's flat call surface and keeps the generated code grep-compatible across targets. + +### Implemented today (~30 builtins) + +| Category | Functions | +|---|---| +| I/O | `println`, `print` | +| String | `el_str_concat`, `str_concat`, `str_eq`, `str_starts_with`, `str_ends_with`, `str_len`, `int_to_str`, `str_to_int`, `str_slice`, `str_contains`, `str_replace`, `str_to_upper`, `str_to_lower`, `str_trim`, `str_index_of`, `str_split`, `str_char_at`, `str_char_code`, `str_lower`, `str_upper` | +| Math | `el_abs`, `el_max`, `el_min` | +| List | `el_list_new`, `el_list_len`, `el_list_get`, `el_list_append`, `el_list_empty`, `el_list_clone`, `list_push`, `list_join`, `list_range` | +| Map | `el_map_new`, `el_get_field`, `el_map_get`, `el_map_set` | +| HTTP | `http_get`, `http_post`, `http_post_json` (via `fetch()`, returns `Promise` — see §5 async caveat) | +| FS | `fs_read`, `fs_write`, `fs_list` (Node-only, throw in browser) | +| JSON | `json_parse`, `json_stringify`, `json_get`, `json_get_string`, `json_get_int` | +| Time | `time_now`, `time_now_utc`, `sleep_secs` (Node), `sleep_ms` | +| Bool | `bool_to_str` | +| Process | `exit_program` (Node `process.exit`, throw in browser) | +| Refcount | `el_retain`, `el_release` (no-ops — JS has GC) | +| ARC method-call shortforms | `append`, `len`, `get`, `map_get`, `map_set` | +| Native VM aliases | `native_list_get`, `native_list_len`, `native_list_append`, `native_list_empty`, `native_list_clone`, `native_string_chars`, `native_int_to_str` | +| `args` | `args()` returns `process.argv.slice(2)` in Node, `[]` in browser | +| `state_*` | In-memory `Map` keyed by string | +| `env` | `process.env[k]` in Node, throws in browser | + +### Stubbed (throw at runtime) + +Every function in this list compiles successfully but throws `Error("not supported in JS target — needs server-side delegation: ")` when called. This is a **runtime** error, not a compile error, so it doesn't block compilation of code that has dead-code paths through these functions. + +- All `dharma_*` (membership in DHARMA network requires the daemon) +- All `engram_*` (needs the embedded SQLite + activation engine — could be reimplemented in JS later) +- All `llm_*` (CORS + API key handling — must go through a server-side proxy) +- `http_serve` (browsers don't host servers; Node could, but that's a separate runtime mode) +- `el_cgi_init` (CGI identity is a server-side concept) +- Crypto: `sha256_*`, `hmac_sha256_*`, `base64*` (deferred — can use `crypto.subtle` later) + +### Browser-side specific behavior + +When running in a browser: +- `println` / `print` map to `console.log` (no stdout in browsers) +- `http_get` / `http_post` use `fetch()` (CORS applies) +- `fs_*` throws (browsers have no fs) +- `args()` returns `[]` +- `env(k)` throws (or could read from a global config object — TBD) + +When running in Node: +- `println` / `print` map to `console.log` and `process.stdout.write` +- `fs_*` use `node:fs/promises` (sync versions for the simple cases) +- `args()` returns `process.argv.slice(2)` +- `env(k)` returns `process.env[k] ?? null` + +The runtime auto-detects via `typeof window === 'undefined'`. + +--- + +## 4. Tradeoffs vs the C backend + +| Concern | C backend | JS backend | +|---|---|---| +| **Static types** | El's `Int` becomes `int64_t`, real arithmetic | El's `Int` becomes `number` — loses precision past 2^53 | +| **Linking model** | Static link against `el_runtime.c` + libcurl + libpthread | ES module import of `el_runtime.js` | +| **Dynamic dispatch** | `dlsym` for `http_set_handler` / `llm_register_tool` (requires `-rdynamic`) | JS function value lookup via `globalThis[name]` — no compiler flag | +| **Tool registry** | dlsym walks symbol table; tool fns must be top-level C symbols | Tool fns live as exports of the generated module; trivially callable | +| **Memory model** | Refcounted lists/maps with `el_retain`/`el_release` to avoid leaks | JS GC handles all of it; `el_retain`/`el_release` are no-ops | +| **`+` overload** | Has to dispatch in codegen between `el_str_concat` and integer `+` because at C level both are `int64_t` | JS `+` is already overloaded: `"a" + "b"` → `"ab"`, `1 + 2` → `3`. Codegen still preserves the existing dispatch for safety, but the runtime fallback is correct | +| **Concurrency** | `pthread`-backed `http_serve` | Single-threaded event loop; `http_serve` not supported in this target | +| **HTTP client** | libcurl, blocking, returns body string | `fetch()` is async — see §5 | +| **CGI identity** | `el_cgi_init` runs at start of `main()` | Not supported; UI code is not a CGI principal | +| **DHARMA / LLM** | Native, blocking, libcurl-backed | Not supported — all such calls throw and the program is expected to delegate to a server-side El daemon via plain HTTP | +| **Compile speed** | El → C → cc → binary (cc is the slow step) | El → JS → done. Faster iteration | +| **Output size** | Static binary ~2MB | Source `.js` + ~10kb runtime | + +--- + +## 5. The async problem (the big deferred decision) + +`fetch()` is async. The C backend's `http_get(url)` is synchronous and returns the body string directly. El source was written assuming sync. Three options: + +1. **Pretend it's sync from El's POV; use synchronous XHR (browser) or `child_process.execSync('curl …')` (Node).** Bad: synchronous XHR is deprecated and frozen on the main thread; `execSync` is a hack. +2. **Make every `http_*` builtin in the JS runtime return a `Promise`, and rewrite codegen-js to insert `await` everywhere.** This requires turning every El function that transitively calls a network builtin into an `async fn` in JS. Doable, but invasive — the El AST does not currently mark async-ness. +3. **Compile El's call sites with implicit await; compile-time taint tracking marks every fn that transitively calls a network builtin as `async`. Generated JS uses `async function` and `await`.** This is the right answer long-term. + +**Decision for this scaffold:** option 3, but only the runtime side is implemented. `http_get` in `el_runtime.js` returns a `Promise`. `codegen-js.el` does NOT yet emit `async`/`await`. Calling `http_get` from compiled El will return a Promise that the El program will treat as a string (which produces `"[object Promise]"`). This is documented and accepted for the scaffold; the compile-time taint pass is a follow-up. + +For now, programs that don't touch HTTP work correctly. That covers `el-ui/runtime` (which only manipulates the DOM and a graph), most of cgi-studio's pure UI components, and all hello-world style programs. + +--- + +## 6. Number precision + +JS `number` is IEEE 754 double — only 53 bits of integer precision. El `Int` is `int64_t` and the runtime sometimes uses the full 64 bits (e.g. `time_now_utc` returns nanoseconds-since-epoch, which exceeds 2^53 in practice). + +**Decision for this scaffold:** accept the precision loss. Document it. UI code does not use 64-bit timestamps. If/when a use case demands it, `time_now_utc` can return a `BigInt` and we can introduce a `BigInt` sub-mode. That's a follow-up. + +--- + +## 7. What's NOT supported in JS target initially + +This is the canonical list. Programs that use any of these compile (no `#error`-style fail-fast like the C backend's capability check) but throw at runtime or behave as documented. + +| Feature | Status | Notes | +|---|---|---| +| `cgi {}` block | Compiled to a no-op + warning comment | CGI identity is server-side. UI code is not a CGI. | +| `service {}` block | Compiled to a no-op + warning comment | Same. | +| All `dharma_*` | Stub throws | Programs needing DHARMA must call a server-side daemon over HTTP | +| All `engram_*` | Stub throws | Could be ported to in-browser (IndexedDB-backed) later | +| All `llm_*` | Stub throws | Browser cannot hold API keys; route through server | +| `llm_register_tool` | Stub throws | Same | +| `http_serve` | Stub throws | Browsers cannot serve. Node-mode could, deferred | +| `http_set_handler` | Stub throws | Same | +| `match` expressions | Compiled (basic) | LitInt/LitStr/LitBool/Wildcard/Binding all work via `if/else` chain. Tagged-union match deferred | +| `type` (struct) defs | Skipped at codegen | Treated as documentation; structs are plain JS objects. `t["field"]` works | +| `enum` defs | Skipped at codegen | Same — enum values are bare strings or ints | +| `?` postfix (nil-prop) | No-op | Same as C backend's current state | +| `try` postfix | Stripped to inner | Same as C backend | +| Capability enforcement | Not enforced | The C backend uses `#error` directives; the JS backend lets the runtime stubs throw. Future: emit `throw new Error('capability violation')` at compile time | +| VBD role check | Not enforced | Same | +| Float bit-cast | Not needed | JS number is already a double | +| Crypto primitives | Stub throws | Easy to add via `crypto.subtle` later | +| `state_*` | In-memory only | No persistence; resets on page reload | +| `args()` | Node-only | Browser returns `[]` | +| `fs_*` | Node-only | Browser throws | + +--- + +## 8. CLI dispatch — `--target=js` + +The compiler entry point `compiler.el` adds a `compile_js(source: String) -> String` alongside the existing `compile()`. The CLI behavior: + +``` +elc # default — emit C +elc --target=c # explicit — emit C +elc --target=js # emit JS + +elc --target=js source.el # write JS to stdout (no out path) +``` + +The argv parser scans for a `--target=` token; remaining positional args are `` and optional ``. The dispatch logic stays in El: a `compile_dispatch(target, source) -> String` switch. + +--- + +## 9. The path to compiling el-ui/runtime through this backend + +This is the real-world test. `el-ui/runtime/src/` is currently 5 hand-written `.js` files. The path to authoring them in El: + +1. **Phase 1 — Hello-world** (this scaffold). Done. +2. **Phase 2 — language coverage.** Get codegen-js to ~95% parity with codegen.el for non-network features. Specifically: `match`, struct/enum field access, `?`-propagation, full `for`-over-list, complete unary/binary operators, lexical closures (the C backend doesn't have these but we'll need them for el-ui's component model). +3. **Phase 3 — DOM bridge.** Add `dom_*` builtins to el_runtime.js: `dom_create_element`, `dom_set_text`, `dom_append_child`, `dom_query`, `dom_listen`, etc. These are Node-as-El builtins for the browser; the C backend will add a stub set that errors. Source-shareable El UI code becomes possible. +4. **Phase 4 — Component class lowering.** El doesn't have classes; el-ui's `Component` is a JS class. Decide: extend El with a `component` keyword that compiles to JS class + C struct? Or have el-ui authors define components as `fn render_(state) -> String` and provide a small bootstrap. The latter is the lower-impact path. +5. **Phase 5 — Async taint pass.** Implement compile-time async tracking so `http_get` and friends produce `await fetch()` correctly. Required before authoring code that fetches data. +6. **Phase 6 — Port `el-ui/runtime/`.** Translate the 5 JS files to El, compile to JS, swap in. Run el-ui's existing tests. Iterate. +7. **Phase 7 — Port cgi-studio UI.** Larger surface area; same pattern. +8. **Phase 8 — Marketplace plugins.** Open the door for third-party UI El. + +The blocking item between phase 1 and phase 2 is incremental — every El construct used by el-ui's source needs codegen-js coverage. Phase 5 (async) is the architectural decision that needs explicit user buy-in, because it changes the language's effective semantics on the JS target. + +--- + +## 10. Test + +```bash +echo 'fn main() -> Void { println("hello from el-js") }' > /tmp/hello.el +elc --target=js /tmp/hello.el > /tmp/hello.js +node /tmp/hello.js +# → hello from el-js +``` + +This should pass after the bootstrap rebuild. See §11. + +--- + +## 11. Bootstrap status + +Adding `--target=js` to `compile()` requires regenerating the shipped `elc` binary at `dist/platform/elc`. The rebuild path is: + +1. Existing `elc` binary compiles updated `elc-combined.el` (which now includes `codegen-js.el` and the `--target=js` dispatch) → `elc.c`. +2. `cc` compiles `elc.c` → new `elc` binary. +3. New `elc` binary supports `--target=js`. + +The scaffold checks all four scaffold files in. The bootstrap rebuild happens as a follow-up step, gated on review of this design doc.