From 5888258c9fbf333137ab200cfd6f7aa0d17d51c7 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Mon, 4 May 2026 13:27:01 -0500 Subject: [PATCH] rebuild elc: reporter=json, line numbers, em-dash FAIL format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rebuild elc binary from the feat/native-testing source to match the full reporter implementation: - Lexer tracks line numbers in every token via state (__lex_line) - Parser propagates line numbers into TestDef and Assert AST nodes - Text reporter: " FAIL " (em dash, stderr) - JSON reporter (--reporter=json): newline-delimited JSON to stdout with suite_start, test_start, test_pass, test_fail, suite_end events - All fields: file (basename), line (test block), assert_line, message - Fixed point verified: gen2 == gen3 elc-combined.el regenerated from source. --- dist/elc-new.c | 2094 +++++++++++++++++++++++++++++++++- dist/platform/elc | Bin 521464 -> 451720 bytes elc-combined.el | 2775 ++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 4538 insertions(+), 331 deletions(-) diff --git a/dist/elc-new.c b/dist/elc-new.c index d7ab52c..9375c79 100644 --- a/dist/elc-new.c +++ b/dist/elc-new.c @@ -1,5 +1,6 @@ #include #include +#include #include "el_runtime.h" el_val_t lex_is_digit(el_val_t ch); @@ -19,10 +20,19 @@ 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 tok_line(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 is_html_tag_name(el_val_t name); +el_val_t is_void_element(el_val_t name); +el_val_t parse_html_text_tokens(el_val_t tokens, el_val_t pos); +el_val_t parse_html_attrs(el_val_t tokens, el_val_t pos); +el_val_t parse_html_children(el_val_t tokens, el_val_t pos, el_val_t parent_tag); +el_val_t parse_html_each_body(el_val_t tokens, el_val_t pos); +el_val_t parse_html_element(el_val_t tokens, el_val_t pos); +el_val_t parse_html_template(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); @@ -47,6 +57,12 @@ 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 duration_unit_nanos(el_val_t unit); +el_val_t next_html_id(void); +el_val_t cg_html_parts(el_val_t children, el_val_t acc_var); +el_val_t cg_html_attrs_str(el_val_t attrs, el_val_t acc_var); +el_val_t cg_html_element_str(el_val_t elem, el_val_t acc_var); +el_val_t cg_html_each(el_val_t node, el_val_t acc_var); +el_val_t cg_html_template(el_val_t expr); 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); @@ -123,19 +139,38 @@ 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 cg_stmt_assert_text(el_val_t stmt, el_val_t test_name); +el_val_t cg_stmt_assert_json(el_val_t stmt, el_val_t test_name, el_val_t file_name, el_val_t test_line); +el_val_t cg_stmts_in_test(el_val_t stmts, el_val_t indent, el_val_t declared, el_val_t test_name, el_val_t reporter, el_val_t file_name, el_val_t test_line); +el_val_t cg_test_fn(el_val_t test_def, el_val_t idx, el_val_t reporter, el_val_t file_name); +el_val_t codegen_test(el_val_t stmts, el_val_t reporter, el_val_t file_name); el_val_t codegen(el_val_t stmts, el_val_t source); +el_val_t codegen_with_tests(el_val_t stmts, el_val_t source, el_val_t reporter, el_val_t file_name); +el_val_t codegen_inner(el_val_t stmts, el_val_t source, el_val_t test_mode, el_val_t reporter, el_val_t file_name); 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_el_method(el_val_t name); +el_val_t js_is_async_builtin(el_val_t name); +el_val_t js_register_async_fn(el_val_t name); +el_val_t js_is_async_fn(el_val_t name); 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_next_html_id(void); +el_val_t js_cg_html_parts(el_val_t children, el_val_t acc_var); +el_val_t js_cg_html_attrs_str(el_val_t attrs, el_val_t acc_var); +el_val_t js_cg_html_element_str(el_val_t elem, el_val_t acc_var); +el_val_t js_cg_html_each(el_val_t node, el_val_t acc_var); +el_val_t js_cg_html_template(el_val_t 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_next_lambda_id(void); +el_val_t js_cg_lambda(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); @@ -148,18 +183,45 @@ 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 js_cg_stmt_assert_text(el_val_t stmt, el_val_t test_name); +el_val_t js_cg_stmt_assert_json(el_val_t stmt, el_val_t test_name, el_val_t file_name, el_val_t test_line); +el_val_t js_cg_stmts_in_test(el_val_t stmts, el_val_t indent, el_val_t declared, el_val_t test_name, el_val_t reporter, el_val_t file_name, el_val_t test_line); +el_val_t js_cg_test_fn(el_val_t test_def, el_val_t idx, el_val_t reporter, el_val_t file_name); +el_val_t js_codegen_test(el_val_t stmts, el_val_t reporter, el_val_t file_name); el_val_t codegen_js(el_val_t stmts, el_val_t source); +el_val_t codegen_js_test(el_val_t stmts, el_val_t source, el_val_t reporter, el_val_t file_name); +el_val_t codegen_js_bundle(el_val_t stmts, el_val_t source, el_val_t runtime_content); +el_val_t codegen_js_inner(el_val_t stmts, el_val_t source, el_val_t bundle_mode, el_val_t runtime_content, el_val_t test_mode, el_val_t reporter, el_val_t file_name); +el_val_t js_strip_es_exports(el_val_t content); el_val_t compile(el_val_t source); el_val_t compile_js(el_val_t source); +el_val_t compile_js_with_bundle(el_val_t source, el_val_t runtime_path); +el_val_t compile_test(el_val_t source, el_val_t reporter, el_val_t file_name); +el_val_t compile_js_test(el_val_t source, el_val_t reporter, el_val_t file_name); el_val_t compile_dispatch(el_val_t tgt, el_val_t source); +el_val_t compile_dispatch_test(el_val_t tgt, el_val_t source, el_val_t reporter, el_val_t file_name); +el_val_t compile_dispatch_bundle(el_val_t tgt, el_val_t source, el_val_t runtime_path); el_val_t detect_target(el_val_t argv); el_val_t strip_flags(el_val_t argv); el_val_t detect_emit_header(el_val_t argv); +el_val_t detect_bundle(el_val_t argv); +el_val_t detect_minify(el_val_t argv); +el_val_t detect_obfuscate(el_val_t argv); +el_val_t detect_test(el_val_t argv); +el_val_t detect_reporter(el_val_t argv); +el_val_t basename_of(el_val_t path); +el_val_t make_temp_path(el_val_t suffix); +el_val_t js_reserved_names(void); +el_val_t find_node_tool(el_val_t tool_name, el_val_t src_dir); +el_val_t apply_minify(el_val_t js_path, el_val_t out_path, el_val_t src_dir); +el_val_t apply_obfuscate(el_val_t js_path, el_val_t out_path, el_val_t src_dir); +el_val_t resolve_runtime_path(el_val_t src_path); el_val_t type_node_to_el(el_val_t t); el_val_t emit_header(el_val_t stmts, el_val_t hdr_path); el_val_t dirname_of(el_val_t path); el_val_t parse_import_line(el_val_t trimmed, el_val_t dir); el_val_t resolve_imports(el_val_t src_path); +el_val_t run_with_postprocess(el_val_t tgt, el_val_t source, el_val_t src_path, el_val_t do_bundle, el_val_t do_obfuscate, el_val_t argc, el_val_t positional); el_val_t lex_is_digit(el_val_t ch) { if (str_eq(ch, EL_STR("0"))) { @@ -389,7 +451,12 @@ el_val_t lex_is_whitespace(el_val_t ch) { } el_val_t make_tok(el_val_t kind, el_val_t value) { - return el_map_new(2, "kind", kind, "value", value); + el_val_t ln_s = state_get(EL_STR("__lex_line")); + el_val_t ln = 1; + if (!str_eq(ln_s, EL_STR(""))) { + ln = str_to_int(ln_s); + } + return el_map_new(3, "kind", kind, "value", value, "line", ln); return 0; } @@ -523,6 +590,12 @@ el_val_t keyword_kind(el_val_t word) { if (str_eq(word, EL_STR("extern"))) { return EL_STR("Extern"); } + if (str_eq(word, EL_STR("try"))) { + return EL_STR("Try"); + } + if (str_eq(word, EL_STR("catch"))) { + return EL_STR("Catch"); + } return EL_STR(""); return 0; } @@ -839,9 +912,15 @@ el_val_t lex(el_val_t source) { el_val_t total = native_list_len(chars); el_val_t tokens = native_list_empty(); el_val_t i = 0; + el_val_t line_num = 1; + state_set(EL_STR("__lex_line"), EL_STR("1")); while (i < total) { el_val_t ch = native_list_get(chars, i); if (lex_is_whitespace(ch)) { + if (str_eq(ch, EL_STR("\n"))) { + line_num = (line_num + 1); + state_set(EL_STR("__lex_line"), native_int_to_str(line_num)); + } i = (i + 1); } else { if (str_eq(ch, EL_STR("/"))) { @@ -1070,7 +1149,12 @@ el_val_t lex(el_val_t source) { tokens = native_list_append(tokens, make_tok(EL_STR("QuestionMark"), EL_STR("?"))); i = (i + 1); } else { - i = (i + 1); + if (str_eq(ch, EL_STR("#"))) { + tokens = native_list_append(tokens, make_tok(EL_STR("Hash"), EL_STR("#"))); + i = (i + 1); + } else { + i = (i + 1); + } } } } @@ -1121,6 +1205,16 @@ el_val_t tok_value(el_val_t tokens, el_val_t pos) { return 0; } +el_val_t tok_line(el_val_t tokens, el_val_t pos) { + el_val_t t = native_list_get(tokens, pos); + el_val_t ln = el_get_field(t, EL_STR("line")); + if (ln <= 0) { + return 1; + } + return ln; + 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)) { @@ -1221,6 +1315,643 @@ el_val_t parse_params(el_val_t tokens, el_val_t pos) { return 0; } +el_val_t is_html_tag_name(el_val_t name) { + if (str_eq(name, EL_STR("a"))) { + return 1; + } + if (str_eq(name, EL_STR("abbr"))) { + return 1; + } + if (str_eq(name, EL_STR("address"))) { + return 1; + } + if (str_eq(name, EL_STR("area"))) { + return 1; + } + if (str_eq(name, EL_STR("article"))) { + return 1; + } + if (str_eq(name, EL_STR("aside"))) { + return 1; + } + if (str_eq(name, EL_STR("audio"))) { + return 1; + } + if (str_eq(name, EL_STR("b"))) { + return 1; + } + if (str_eq(name, EL_STR("base"))) { + return 1; + } + if (str_eq(name, EL_STR("blockquote"))) { + return 1; + } + if (str_eq(name, EL_STR("body"))) { + return 1; + } + if (str_eq(name, EL_STR("br"))) { + return 1; + } + if (str_eq(name, EL_STR("button"))) { + return 1; + } + if (str_eq(name, EL_STR("canvas"))) { + return 1; + } + if (str_eq(name, EL_STR("caption"))) { + return 1; + } + if (str_eq(name, EL_STR("cite"))) { + return 1; + } + if (str_eq(name, EL_STR("code"))) { + return 1; + } + if (str_eq(name, EL_STR("col"))) { + return 1; + } + if (str_eq(name, EL_STR("colgroup"))) { + return 1; + } + if (str_eq(name, EL_STR("data"))) { + return 1; + } + if (str_eq(name, EL_STR("datalist"))) { + return 1; + } + if (str_eq(name, EL_STR("dd"))) { + return 1; + } + if (str_eq(name, EL_STR("del"))) { + return 1; + } + if (str_eq(name, EL_STR("details"))) { + return 1; + } + if (str_eq(name, EL_STR("dfn"))) { + return 1; + } + if (str_eq(name, EL_STR("dialog"))) { + return 1; + } + if (str_eq(name, EL_STR("div"))) { + return 1; + } + if (str_eq(name, EL_STR("dl"))) { + return 1; + } + if (str_eq(name, EL_STR("dt"))) { + return 1; + } + if (str_eq(name, EL_STR("em"))) { + return 1; + } + if (str_eq(name, EL_STR("embed"))) { + return 1; + } + if (str_eq(name, EL_STR("fieldset"))) { + return 1; + } + if (str_eq(name, EL_STR("figcaption"))) { + return 1; + } + if (str_eq(name, EL_STR("figure"))) { + return 1; + } + if (str_eq(name, EL_STR("footer"))) { + return 1; + } + if (str_eq(name, EL_STR("form"))) { + return 1; + } + if (str_eq(name, EL_STR("h1"))) { + return 1; + } + if (str_eq(name, EL_STR("h2"))) { + return 1; + } + if (str_eq(name, EL_STR("h3"))) { + return 1; + } + if (str_eq(name, EL_STR("h4"))) { + return 1; + } + if (str_eq(name, EL_STR("h5"))) { + return 1; + } + if (str_eq(name, EL_STR("h6"))) { + return 1; + } + if (str_eq(name, EL_STR("head"))) { + return 1; + } + if (str_eq(name, EL_STR("header"))) { + return 1; + } + if (str_eq(name, EL_STR("hr"))) { + return 1; + } + if (str_eq(name, EL_STR("html"))) { + return 1; + } + if (str_eq(name, EL_STR("i"))) { + return 1; + } + if (str_eq(name, EL_STR("iframe"))) { + return 1; + } + if (str_eq(name, EL_STR("img"))) { + return 1; + } + if (str_eq(name, EL_STR("input"))) { + return 1; + } + if (str_eq(name, EL_STR("ins"))) { + return 1; + } + if (str_eq(name, EL_STR("kbd"))) { + return 1; + } + if (str_eq(name, EL_STR("label"))) { + return 1; + } + if (str_eq(name, EL_STR("legend"))) { + return 1; + } + if (str_eq(name, EL_STR("li"))) { + return 1; + } + if (str_eq(name, EL_STR("link"))) { + return 1; + } + if (str_eq(name, EL_STR("main"))) { + return 1; + } + if (str_eq(name, EL_STR("map"))) { + return 1; + } + if (str_eq(name, EL_STR("mark"))) { + return 1; + } + if (str_eq(name, EL_STR("menu"))) { + return 1; + } + if (str_eq(name, EL_STR("meta"))) { + return 1; + } + if (str_eq(name, EL_STR("meter"))) { + return 1; + } + if (str_eq(name, EL_STR("nav"))) { + return 1; + } + if (str_eq(name, EL_STR("noscript"))) { + return 1; + } + if (str_eq(name, EL_STR("object"))) { + return 1; + } + if (str_eq(name, EL_STR("ol"))) { + return 1; + } + if (str_eq(name, EL_STR("optgroup"))) { + return 1; + } + if (str_eq(name, EL_STR("option"))) { + return 1; + } + if (str_eq(name, EL_STR("output"))) { + return 1; + } + if (str_eq(name, EL_STR("p"))) { + return 1; + } + if (str_eq(name, EL_STR("param"))) { + return 1; + } + if (str_eq(name, EL_STR("picture"))) { + return 1; + } + if (str_eq(name, EL_STR("pre"))) { + return 1; + } + if (str_eq(name, EL_STR("progress"))) { + return 1; + } + if (str_eq(name, EL_STR("q"))) { + return 1; + } + if (str_eq(name, EL_STR("rp"))) { + return 1; + } + if (str_eq(name, EL_STR("rt"))) { + return 1; + } + if (str_eq(name, EL_STR("ruby"))) { + return 1; + } + if (str_eq(name, EL_STR("s"))) { + return 1; + } + if (str_eq(name, EL_STR("samp"))) { + return 1; + } + if (str_eq(name, EL_STR("script"))) { + return 1; + } + if (str_eq(name, EL_STR("section"))) { + return 1; + } + if (str_eq(name, EL_STR("select"))) { + return 1; + } + if (str_eq(name, EL_STR("small"))) { + return 1; + } + if (str_eq(name, EL_STR("source"))) { + return 1; + } + if (str_eq(name, EL_STR("span"))) { + return 1; + } + if (str_eq(name, EL_STR("strong"))) { + return 1; + } + if (str_eq(name, EL_STR("style"))) { + return 1; + } + if (str_eq(name, EL_STR("sub"))) { + return 1; + } + if (str_eq(name, EL_STR("summary"))) { + return 1; + } + if (str_eq(name, EL_STR("sup"))) { + return 1; + } + if (str_eq(name, EL_STR("table"))) { + return 1; + } + if (str_eq(name, EL_STR("tbody"))) { + return 1; + } + if (str_eq(name, EL_STR("td"))) { + return 1; + } + if (str_eq(name, EL_STR("template"))) { + return 1; + } + if (str_eq(name, EL_STR("textarea"))) { + return 1; + } + if (str_eq(name, EL_STR("tfoot"))) { + return 1; + } + if (str_eq(name, EL_STR("th"))) { + return 1; + } + if (str_eq(name, EL_STR("thead"))) { + return 1; + } + if (str_eq(name, EL_STR("time"))) { + return 1; + } + if (str_eq(name, EL_STR("title"))) { + return 1; + } + if (str_eq(name, EL_STR("tr"))) { + return 1; + } + if (str_eq(name, EL_STR("track"))) { + return 1; + } + if (str_eq(name, EL_STR("u"))) { + return 1; + } + if (str_eq(name, EL_STR("ul"))) { + return 1; + } + if (str_eq(name, EL_STR("var"))) { + return 1; + } + if (str_eq(name, EL_STR("video"))) { + return 1; + } + if (str_eq(name, EL_STR("wbr"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_void_element(el_val_t name) { + if (str_eq(name, EL_STR("area"))) { + return 1; + } + if (str_eq(name, EL_STR("base"))) { + return 1; + } + if (str_eq(name, EL_STR("br"))) { + return 1; + } + if (str_eq(name, EL_STR("col"))) { + return 1; + } + if (str_eq(name, EL_STR("embed"))) { + return 1; + } + if (str_eq(name, EL_STR("hr"))) { + return 1; + } + if (str_eq(name, EL_STR("img"))) { + return 1; + } + if (str_eq(name, EL_STR("input"))) { + return 1; + } + if (str_eq(name, EL_STR("link"))) { + return 1; + } + if (str_eq(name, EL_STR("meta"))) { + return 1; + } + if (str_eq(name, EL_STR("param"))) { + return 1; + } + if (str_eq(name, EL_STR("source"))) { + return 1; + } + if (str_eq(name, EL_STR("track"))) { + return 1; + } + if (str_eq(name, EL_STR("wbr"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t parse_html_text_tokens(el_val_t tokens, el_val_t pos) { + el_val_t parts = native_list_empty(); + el_val_t p = pos; + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Lt"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("LBrace"))) { + running = 0; + } else { + el_val_t v = tok_value(tokens, p); + parts = native_list_append(parts, v); + p = (p + 1); + } + } + } + } + return el_map_new(2, "text", str_join(parts, EL_STR(" ")), "pos", p); + return 0; +} + +el_val_t parse_html_attrs(el_val_t tokens, el_val_t pos) { + el_val_t attrs = native_list_empty(); + el_val_t p = pos; + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("Gt"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Slash"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t attr_name = tok_value(tokens, p); + p = (p + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Eq"))) { + p = (p + 1); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Str"))) { + el_val_t attr_val = tok_value(tokens, p); + p = (p + 1); + attrs = native_list_append(attrs, el_map_new(3, "name", attr_name, "kind", EL_STR("static"), "value", attr_val)); + } else { + if (str_eq(k3, EL_STR("LBrace"))) { + el_val_t r = parse_expr(tokens, (p + 1)); + el_val_t val_node = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + p = expect(tokens, p, EL_STR("RBrace")); + attrs = native_list_append(attrs, el_map_new(3, "name", attr_name, "kind", EL_STR("dynamic"), "value", val_node)); + } else { + } + } + } else { + attrs = native_list_append(attrs, el_map_new(2, "name", attr_name, "kind", EL_STR("bool"))); + } + } + } + } + } + return el_map_new(2, "attrs", attrs, "pos", p); + return 0; +} + +el_val_t parse_html_children(el_val_t tokens, el_val_t pos, el_val_t parent_tag) { + el_val_t children = native_list_empty(); + el_val_t p = pos; + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Lt"))) { + el_val_t k2 = tok_kind(tokens, (p + 1)); + if (str_eq(k2, EL_STR("Slash"))) { + p = (p + 2); + el_val_t close_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Gt")); + running = 0; + } else { + if (str_eq(k2, EL_STR("Not"))) { + el_val_t k3_v = tok_value(tokens, (p + 2)); + if (str_eq(k3_v, EL_STR("doctype"))) { + p = (p + 2); + el_val_t scanning = 1; + while (scanning) { + el_val_t ck = tok_kind(tokens, p); + if (str_eq(ck, EL_STR("Eof"))) { + scanning = 0; + } + if (str_eq(ck, EL_STR("Gt"))) { + p = (p + 1); + scanning = 0; + } else { + p = (p + 1); + } + } + children = native_list_append(children, el_map_new(1, "html", EL_STR("Doctype"))); + } else { + p = (p + 1); + } + } else { + el_val_t r = parse_html_element(tokens, p); + el_val_t child = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + children = native_list_append(children, child); + } + } + } else { + if (str_eq(k, EL_STR("LBrace"))) { + el_val_t k2 = tok_kind(tokens, (p + 1)); + if (str_eq(k2, EL_STR("Hash"))) { + el_val_t k3_v = tok_value(tokens, (p + 2)); + if (str_eq(k3_v, EL_STR("each"))) { + p = (p + 3); + 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_list = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t list_expr = el_get_field(r_list, EL_STR("node")); + p = el_get_field(r_list, EL_STR("pos")); + p = expect(tokens, p, EL_STR("As")); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("RBrace")); + el_val_t r_body = parse_html_each_body(tokens, p); + el_val_t body_children = el_get_field(r_body, EL_STR("children")); + p = el_get_field(r_body, EL_STR("pos")); + el_val_t each_node = el_map_new(4, "html", EL_STR("Each"), "list", list_expr, "item", item_name, "body", body_children); + children = native_list_append(children, each_node); + } else { + p = (p + 1); + } + } else { + if (str_eq(k2, EL_STR("Slash"))) { + p = (p + 2); + p = (p + 1); + p = expect(tokens, p, EL_STR("RBrace")); + running = 0; + } else { + el_val_t r = parse_expr(tokens, (p + 1)); + el_val_t interp_val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + p = expect(tokens, p, EL_STR("RBrace")); + el_val_t is_raw_call = 0; + el_val_t interp_kind = el_get_field(interp_val, EL_STR("expr")); + if (str_eq(interp_kind, EL_STR("Call"))) { + el_val_t fn_node = el_get_field(interp_val, EL_STR("func")); + el_val_t fn_kind = el_get_field(fn_node, EL_STR("expr")); + if (str_eq(fn_kind, EL_STR("Ident"))) { + el_val_t fn_name_v = el_get_field(fn_node, EL_STR("name")); + if (str_eq(fn_name_v, EL_STR("raw"))) { + is_raw_call = 1; + } + } + } + if (is_raw_call) { + el_val_t raw_args = el_get_field(interp_val, EL_STR("args")); + el_val_t raw_inner = native_list_get(raw_args, 0); + children = native_list_append(children, el_map_new(2, "html", EL_STR("Raw"), "value", raw_inner)); + } else { + children = native_list_append(children, el_map_new(2, "html", EL_STR("Interp"), "value", interp_val)); + } + } + } + } else { + el_val_t r_text = parse_html_text_tokens(tokens, p); + el_val_t text_str = el_get_field(r_text, EL_STR("text")); + p = el_get_field(r_text, EL_STR("pos")); + el_val_t text_trimmed = str_trim(text_str); + if (!str_eq(text_trimmed, EL_STR(""))) { + children = native_list_append(children, el_map_new(2, "html", EL_STR("Text"), "text", text_trimmed)); + } + } + } + } + } + return el_map_new(2, "children", children, "pos", p); + return 0; +} + +el_val_t parse_html_each_body(el_val_t tokens, el_val_t pos) { + return parse_html_children(tokens, pos, EL_STR("__each__")); + return 0; +} + +el_val_t parse_html_element(el_val_t tokens, el_val_t pos) { + el_val_t p = pos; + p = expect(tokens, p, EL_STR("Lt")); + el_val_t tag_name = tok_value(tokens, p); + p = (p + 1); + el_val_t r_attrs = parse_html_attrs(tokens, p); + el_val_t attrs = el_get_field(r_attrs, EL_STR("attrs")); + p = el_get_field(r_attrs, EL_STR("pos")); + el_val_t k = tok_kind(tokens, p); + el_val_t self_closing = 0; + if (str_eq(k, EL_STR("Slash"))) { + p = (p + 1); + p = expect(tokens, p, EL_STR("Gt")); + self_closing = 1; + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", native_list_empty(), "self_closing", 1), p); + } + p = expect(tokens, p, EL_STR("Gt")); + if (is_void_element(tag_name)) { + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", native_list_empty(), "self_closing", 1), p); + } + el_val_t r_children = parse_html_children(tokens, p, tag_name); + el_val_t children = el_get_field(r_children, EL_STR("children")); + p = el_get_field(r_children, EL_STR("pos")); + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", children, "self_closing", 0), p); + return 0; +} + +el_val_t parse_html_template(el_val_t tokens, el_val_t pos) { + el_val_t p = pos; + el_val_t doctype = 0; + el_val_t k = tok_kind(tokens, p); + el_val_t k2 = tok_kind(tokens, (p + 1)); + if (str_eq(k, EL_STR("Lt"))) { + if (str_eq(k2, EL_STR("Not"))) { + el_val_t k3_v = tok_value(tokens, (p + 2)); + if (str_eq(k3_v, EL_STR("doctype"))) { + doctype = 1; + p = (p + 2); + el_val_t scanning = 1; + while (scanning) { + el_val_t ck = tok_kind(tokens, p); + if (str_eq(ck, EL_STR("Eof"))) { + scanning = 0; + } + if (str_eq(ck, EL_STR("Gt"))) { + p = (p + 1); + scanning = 0; + } else { + p = (p + 1); + } + } + } + } + } + el_val_t r = parse_html_element(tokens, p); + el_val_t root = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t root_with_doctype = root; + if (doctype) { + root_with_doctype = el_map_new(6, "html", el_get_field(root, EL_STR("html")), "tag", el_get_field(root, EL_STR("tag")), "attrs", el_get_field(root, EL_STR("attrs")), "children", el_get_field(root, EL_STR("children")), "self_closing", el_get_field(root, EL_STR("self_closing")), "doctype", 1); + } + return make_result(el_map_new(2, "expr", EL_STR("HtmlTemplate"), "root", root_with_doctype), 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); @@ -1236,6 +1967,18 @@ el_val_t parse_primary(el_val_t tokens, el_val_t pos) { 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("Lt"))) { + el_val_t k2 = tok_kind(tokens, (pos + 1)); + if (str_eq(k2, EL_STR("Not"))) { + return parse_html_template(tokens, pos); + } + if (str_eq(k2, EL_STR("Ident"))) { + el_val_t tag_candidate = tok_value(tokens, (pos + 1)); + if (is_html_tag_name(tag_candidate)) { + return parse_html_template(tokens, pos); + } + } + } if (str_eq(k, EL_STR("Ident"))) { return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); } @@ -1323,6 +2066,26 @@ el_val_t parse_primary(el_val_t tokens, el_val_t pos) { el_val_t r = parse_for_expr(tokens, pos); return r; } + if (str_eq(k, EL_STR("Fn"))) { + el_val_t p = (pos + 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(4, "expr", EL_STR("Lambda"), "params", params, "body", body, "ret_type", ret_type), p); + } 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")); @@ -1474,6 +2237,11 @@ el_val_t parse_pattern(el_val_t tokens, el_val_t pos) { if (str_eq(v, EL_STR("_"))) { return make_result(el_map_new(1, "pattern", EL_STR("Wildcard")), (pos + 1)); } + el_val_t next_k = tok_kind(tokens, (pos + 1)); + if (str_eq(next_k, EL_STR("ColonColon"))) { + el_val_t variant_name = tok_value(tokens, (pos + 2)); + return make_result(el_map_new(3, "pattern", EL_STR("Variant"), "enum_name", v, "variant", variant_name), (pos + 3)); + } return make_result(el_map_new(2, "pattern", EL_STR("Binding"), "name", v), (pos + 1)); } if (str_eq(k, EL_STR("Int"))) { @@ -1855,6 +2623,10 @@ el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { el_val_t p = (pos + 1); el_val_t name = tok_value(tokens, p); p = (p + 1); + el_val_t pk = tok_kind(tokens, p); + if (str_eq(pk, EL_STR("Eq"))) { + p = (p + 1); + } p = expect(tokens, p, EL_STR("LBrace")); el_val_t fields = native_list_empty(); el_val_t running = 1; @@ -1976,6 +2748,34 @@ el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { 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("Try"))) { + el_val_t p = (pos + 1); + el_val_t r_try = parse_block(tokens, p); + el_val_t try_body = el_get_field(r_try, EL_STR("stmts")); + p = el_get_field(r_try, EL_STR("pos")); + el_val_t catch_name = EL_STR("err"); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Catch"))) { + p = (p + 1); + p = expect(tokens, p, EL_STR("LParen")); + el_val_t kn = tok_kind(tokens, p); + if (str_eq(kn, EL_STR("Ident"))) { + catch_name = tok_value(tokens, p); + p = (p + 1); + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Colon"))) { + p = (p + 1); + p = skip_type(tokens, p); + } + p = expect(tokens, p, EL_STR("RParen")); + el_val_t r_catch = parse_block(tokens, p); + el_val_t catch_body = el_get_field(r_catch, EL_STR("stmts")); + p = el_get_field(r_catch, EL_STR("pos")); + return make_result(el_map_new(4, "stmt", EL_STR("TryCatch"), "try_body", try_body, "catch_name", catch_name, "catch_body", catch_body), p); + } + return make_result(el_map_new(4, "stmt", EL_STR("TryCatch"), "try_body", try_body, "catch_name", catch_name, "catch_body", native_list_empty()), p); + } if (str_eq(k, EL_STR("At"))) { el_val_t p = (pos + 1); el_val_t dec_name = tok_value(tokens, p); @@ -2080,6 +2880,31 @@ el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { 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); } + if (str_eq(k, EL_STR("Assert"))) { + el_val_t assert_line = tok_line(tokens, pos); + el_val_t p = (pos + 1); + el_val_t r = parse_expr(tokens, p); + el_val_t expr_node = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_val_t msg = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + msg = tok_value(tokens, p); + p = (p + 1); + } + return make_result(el_map_new(4, "stmt", EL_STR("Assert"), "expr", expr_node, "msg", msg, "line", assert_line), p); + } + if (str_eq(k, EL_STR("Test"))) { + el_val_t test_line = tok_line(tokens, pos); + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + 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("TestDef"), "name", name, "body", body, "line", test_line), p); + } if (str_eq(k, EL_STR("Ident"))) { el_val_t k2 = tok_kind(tokens, (pos + 1)); if (str_eq(k2, EL_STR("Eq"))) { @@ -2330,6 +3155,136 @@ el_val_t duration_unit_nanos(el_val_t unit) { return 0; } +el_val_t next_html_id(void) { + el_val_t csv = state_get(EL_STR("__html_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__html_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_html_parts(el_val_t children, el_val_t acc_var) { + el_val_t n = native_list_len(children); + el_val_t i = 0; + el_val_t out = EL_STR(""); + while (i < n) { + el_val_t child = native_list_get(children, i); + el_val_t html_kind = el_get_field(child, EL_STR("html")); + if (str_eq(html_kind, EL_STR("Text"))) { + el_val_t text = el_get_field(child, EL_STR("text")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(")), c_str_lit(text)), EL_STR(")); ")); + } + if (str_eq(html_kind, EL_STR("Doctype"))) { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"\")); ")); + } + if (str_eq(html_kind, EL_STR("Interp"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", html_escape(")), val_c), EL_STR(")); ")); + } + if (str_eq(html_kind, EL_STR("Raw"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", html_raw(")), val_c), EL_STR(")); ")); + } + if (str_eq(html_kind, EL_STR("Element"))) { + el_val_t elem_c = cg_html_element_str(child, acc_var); + out = el_str_concat(out, elem_c); + } + if (str_eq(html_kind, EL_STR("Each"))) { + el_val_t each_c = cg_html_each(child, acc_var); + out = el_str_concat(out, each_c); + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t cg_html_attrs_str(el_val_t attrs, el_val_t acc_var) { + el_val_t n = native_list_len(attrs); + el_val_t i = 0; + el_val_t out = EL_STR(""); + el_val_t close_q = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(EL_STR("\""))), EL_STR(")")); + while (i < n) { + el_val_t attr = native_list_get(attrs, i); + el_val_t attr_name = el_get_field(attr, EL_STR("name")); + el_val_t kind = el_get_field(attr, EL_STR("kind")); + el_val_t open_val = el_str_concat(el_str_concat(EL_STR(" "), attr_name), EL_STR("=\"")); + el_val_t open_attr = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(open_val)), EL_STR(")")); + if (str_eq(kind, EL_STR("static"))) { + el_val_t sv = el_get_field(attr, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), open_attr), EL_STR("); ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(")), c_str_lit(sv)), EL_STR(")); ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), close_q), EL_STR("); ")); + } else { + if (str_eq(kind, EL_STR("dynamic"))) { + el_val_t val_node = el_get_field(attr, EL_STR("value")); + el_val_t val_c = cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), open_attr), EL_STR("); ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", html_escape(")), val_c), EL_STR(")); ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), close_q), EL_STR("); ")); + } else { + el_val_t bool_attr = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(el_str_concat(EL_STR(" "), attr_name))), EL_STR(")")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), bool_attr), EL_STR("); ")); + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t cg_html_element_str(el_val_t elem, el_val_t acc_var) { + el_val_t tag = el_get_field(elem, EL_STR("tag")); + el_val_t attrs = el_get_field(elem, EL_STR("attrs")); + el_val_t children = el_get_field(elem, EL_STR("children")); + el_val_t self_closing = el_get_field(elem, EL_STR("self_closing")); + el_val_t out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"<")), tag), EL_STR("\")); ")); + out = el_str_concat(out, cg_html_attrs_str(attrs, acc_var)); + if (self_closing) { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"/>\")); ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\">\")); ")); + out = el_str_concat(out, cg_html_parts(children, acc_var)); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"\")); ")); + } + return out; + return 0; +} + +el_val_t cg_html_each(el_val_t node, el_val_t acc_var) { + el_val_t list_expr = el_get_field(node, EL_STR("list")); + el_val_t item_name = el_get_field(node, EL_STR("item")); + el_val_t body_children = el_get_field(node, EL_STR("body")); + el_val_t id = next_html_id(); + el_val_t list_var = el_str_concat(EL_STR("_html_list_"), id); + el_val_t len_var = el_str_concat(EL_STR("_html_len_"), id); + el_val_t idx_var = el_str_concat(EL_STR("_html_i_"), id); + el_val_t list_c = cg_expr(list_expr); + el_val_t inner_c = cg_html_parts(body_children, acc_var); + return 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(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(el_str_concat(el_str_concat(EL_STR("{ el_val_t "), list_var), EL_STR(" = (")), list_c), EL_STR("); el_val_t ")), len_var), EL_STR(" = el_list_len(")), list_var), EL_STR("); for (el_val_t ")), idx_var), EL_STR(" = 0; ")), idx_var), EL_STR(" < ")), len_var), EL_STR("; ")), idx_var), EL_STR("++) { el_val_t ")), item_name), EL_STR(" = el_list_get(")), list_var), EL_STR(", ")), idx_var), EL_STR("); ")), inner_c), EL_STR("} } ")); + return 0; +} + +el_val_t cg_html_template(el_val_t expr) { + el_val_t root = el_get_field(expr, EL_STR("root")); + el_val_t id = next_html_id(); + el_val_t acc = el_str_concat(EL_STR("_html_"), id); + el_val_t doctype_flag = el_get_field(root, EL_STR("doctype")); + el_val_t doctype_prefix = EL_STR(""); + if (doctype_flag) { + doctype_prefix = el_str_concat(el_str_concat(el_str_concat(acc, EL_STR(" = el_str_concat(")), acc), EL_STR(", EL_STR(\"\")); ")); + } + el_val_t body = cg_html_element_str(root, acc); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), acc), EL_STR(" = EL_STR(\"\"); ")), doctype_prefix), body), acc), EL_STR("; })")); + 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"))) { @@ -2866,6 +3821,9 @@ el_val_t cg_expr(el_val_t expr) { if (str_eq(kind, EL_STR("Match"))) { return cg_match(expr); } + if (str_eq(kind, EL_STR("HtmlTemplate"))) { + return cg_html_template(expr); + } return EL_STR("EL_NULL"); return 0; } @@ -2923,7 +3881,12 @@ el_val_t cg_match(el_val_t expr) { } parts = native_list_append(parts, 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("if ("), subj_var), EL_STR(" == ")), bv), EL_STR(") { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); } else { - parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ "), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + if (str_eq(pkind, EL_STR("Variant"))) { + el_val_t variant = el_get_field(pat, EL_STR("variant")); + parts = native_list_append(parts, 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("if (str_eq("), subj_var), EL_STR(", EL_STR(")), c_str_lit(variant)), EL_STR("))) { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } else { + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ "), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } } } } @@ -3171,6 +4134,21 @@ el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { if (str_eq(kind, EL_STR("CgiBlock"))) { return declared; } + if (str_eq(kind, EL_STR("ServiceBlock"))) { + return declared; + } + if (str_eq(kind, EL_STR("TestDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Assert"))) { + return declared; + } + if (str_eq(kind, EL_STR("TryCatch"))) { + el_val_t try_body = el_get_field(stmt, EL_STR("try_body")); + emit_line(el_str_concat(indent, EL_STR("/* try (C target: exception handling not supported) */"))); + cg_stmts(try_body, indent, native_list_clone(declared)); + return declared; + } return declared; return 0; } @@ -4569,6 +5547,15 @@ el_val_t builtin_arity(el_val_t name) { if (str_eq(name, EL_STR("exit_program"))) { return 1; } + if (str_eq(name, EL_STR("getpid_now"))) { + return 0; + } + if (str_eq(name, EL_STR("stdout_to_file"))) { + return 1; + } + if (str_eq(name, EL_STR("stdout_restore"))) { + return 0; + } if (str_eq(name, EL_STR("exec_command"))) { return 1; } @@ -5069,6 +6056,9 @@ el_val_t is_top_level_decl(el_val_t stmt) { if (str_eq(kind, EL_STR("ExternFn"))) { return 1; } + if (str_eq(kind, EL_STR("TestDef"))) { + return 1; + } return 0; return 0; } @@ -5262,7 +6252,169 @@ el_val_t vbd_has_restricted_call(el_val_t stmts) { return 0; } +el_val_t cg_stmt_assert_text(el_val_t stmt, el_val_t test_name) { + el_val_t expr_node = el_get_field(stmt, EL_STR("expr")); + el_val_t msg = el_get_field(stmt, EL_STR("msg")); + el_val_t expr_c = cg_expr(expr_node); + expr_c = strip_outer_parens(expr_c); + el_val_t disp_msg = EL_STR("assert failed"); + if (!str_eq(msg, EL_STR(""))) { + disp_msg = msg; + } + emit_line(el_str_concat(el_str_concat(EL_STR(" if (!("), expr_c), EL_STR(")) {"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" fprintf(stderr, \" FAIL "), c_escape(test_name)), EL_STR(" \\xe2\\x80\\x94 ")), c_escape(disp_msg)), EL_STR("\\n\");"))); + emit_line(EL_STR(" return 1;")); + emit_line(EL_STR(" }")); + return 0; +} + +el_val_t cg_stmt_assert_json(el_val_t stmt, el_val_t test_name, el_val_t file_name, el_val_t test_line) { + el_val_t expr_node = el_get_field(stmt, EL_STR("expr")); + el_val_t msg = el_get_field(stmt, EL_STR("msg")); + el_val_t assert_line = el_get_field(stmt, EL_STR("line")); + el_val_t expr_c = cg_expr(expr_node); + expr_c = strip_outer_parens(expr_c); + el_val_t disp_msg = EL_STR("assert failed"); + if (!str_eq(msg, EL_STR(""))) { + disp_msg = msg; + } + el_val_t json_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("{\"type\":\"test_fail\",\"name\":\""), c_escape(test_name)), EL_STR("\",\"file\":\"")), c_escape(file_name)), EL_STR("\",\"line\":")), native_int_to_str(test_line)), EL_STR(",\"assert_line\":")), native_int_to_str(assert_line)), EL_STR(",\"message\":\"")), c_escape(disp_msg)), EL_STR("\"}")); + emit_line(el_str_concat(el_str_concat(EL_STR(" if (!("), expr_c), EL_STR(")) {"))); + emit_line(el_str_concat(el_str_concat(EL_STR(" puts("), c_str_lit(json_line)), EL_STR(");"))); + emit_line(EL_STR(" return 1;")); + emit_line(EL_STR(" }")); + return 0; +} + +el_val_t cg_stmts_in_test(el_val_t stmts, el_val_t indent, el_val_t declared, el_val_t test_name, el_val_t reporter, el_val_t file_name, el_val_t test_line) { + 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); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("Assert"))) { + if (str_eq(reporter, EL_STR("json"))) { + cg_stmt_assert_json(stmt, test_name, file_name, test_line); + } else { + cg_stmt_assert_text(stmt, test_name); + } + } else { + decl = cg_stmt(stmt, indent, decl); + } + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t cg_test_fn(el_val_t test_def, el_val_t idx, el_val_t reporter, el_val_t file_name) { + el_val_t fn_name = el_str_concat(EL_STR("el_test_"), native_int_to_str(idx)); + el_val_t test_name = el_get_field(test_def, EL_STR("name")); + el_val_t test_line = el_get_field(test_def, EL_STR("line")); + el_val_t body = el_get_field(test_def, EL_STR("body")); + emit_line(el_str_concat(el_str_concat(EL_STR("static int "), fn_name), EL_STR("(void) {"))); + cg_stmts_in_test(body, EL_STR(" "), native_list_empty(), test_name, reporter, file_name, test_line); + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + return fn_name; + return 0; +} + +el_val_t codegen_test(el_val_t stmts, el_val_t reporter, el_val_t file_name) { + el_val_t n = native_list_len(stmts); + el_val_t test_defs = native_list_empty(); + el_val_t 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("TestDef"))) { + test_defs = native_list_append(test_defs, stmt); + } + i = (i + 1); + } + el_val_t n_tests = native_list_len(test_defs); + el_val_t ti = 0; + while (ti < n_tests) { + el_val_t fn_name = el_str_concat(EL_STR("el_test_"), native_int_to_str(ti)); + emit_line(el_str_concat(el_str_concat(EL_STR("static int "), fn_name), EL_STR("(void);"))); + ti = (ti + 1); + } + emit_blank(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (!str_eq(fn_name, EL_STR("main"))) { + cg_fn(stmt); + } + } + i = (i + 1); + } + ti = 0; + while (ti < n_tests) { + el_val_t test_def = native_list_get(test_defs, ti); + cg_test_fn(test_def, ti, reporter, file_name); + ti = (ti + 1); + } + el_val_t test_word = EL_STR("tests"); + if (n_tests == 1) { + test_word = EL_STR("test"); + } + emit_line(EL_STR("int main(void) {")); + emit_line(EL_STR(" int pass = 0; int fail = 0;")); + if (str_eq(reporter, EL_STR("json"))) { + el_val_t suite_start_json = el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"type\":\"suite_start\",\"file\":\""), c_escape(file_name)), EL_STR("\",\"total\":")), native_int_to_str(n_tests)), EL_STR("}")); + emit_line(el_str_concat(el_str_concat(EL_STR(" puts("), c_str_lit(suite_start_json)), EL_STR(");"))); + ti = 0; + while (ti < n_tests) { + el_val_t test_def = native_list_get(test_defs, ti); + el_val_t test_name = el_get_field(test_def, EL_STR("name")); + el_val_t test_line = el_get_field(test_def, EL_STR("line")); + el_val_t fn_name = el_str_concat(EL_STR("el_test_"), native_int_to_str(ti)); + el_val_t start_json = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"type\":\"test_start\",\"name\":\""), c_escape(test_name)), EL_STR("\",\"file\":\"")), c_escape(file_name)), EL_STR("\",\"line\":")), native_int_to_str(test_line)), EL_STR("}")); + el_val_t pass_json = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"type\":\"test_pass\",\"name\":\""), c_escape(test_name)), EL_STR("\",\"file\":\"")), c_escape(file_name)), EL_STR("\",\"line\":")), native_int_to_str(test_line)), EL_STR(",\"duration_ms\":0}")); + emit_line(el_str_concat(el_str_concat(EL_STR(" puts("), c_str_lit(start_json)), EL_STR(");"))); + emit_line(el_str_concat(el_str_concat(EL_STR(" if ("), fn_name), EL_STR("() == 0) {"))); + emit_line(EL_STR(" pass++;")); + emit_line(el_str_concat(el_str_concat(EL_STR(" puts("), c_str_lit(pass_json)), EL_STR(");"))); + emit_line(EL_STR(" } else { fail++; }")); + ti = (ti + 1); + } + emit_line(EL_STR(" printf(\"{\\\"type\\\":\\\"suite_end\\\",\\\"passed\\\":%d,\\\"failed\\\":%d}\\n\", pass, fail);")); + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" fprintf(stderr, \"==> running "), native_int_to_str(n_tests)), EL_STR(" ")), test_word), EL_STR("\\n\\n\");"))); + ti = 0; + while (ti < n_tests) { + el_val_t test_def = native_list_get(test_defs, ti); + el_val_t test_name = el_get_field(test_def, EL_STR("name")); + el_val_t fn_name = el_str_concat(EL_STR("el_test_"), native_int_to_str(ti)); + emit_line(el_str_concat(el_str_concat(EL_STR(" fprintf(stderr, \" RUN "), c_escape(test_name)), EL_STR("\\n\");"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" if ("), fn_name), EL_STR("() == 0) { pass++; fprintf(stderr, \" PASS ")), c_escape(test_name)), EL_STR("\\n\"); }"))); + emit_line(EL_STR(" else { fail++; }")); + ti = (ti + 1); + } + emit_line(EL_STR(" fprintf(stderr, \"\\n%d passed, %d failed\\n\", pass, fail);")); + } + emit_line(EL_STR(" return fail > 0 ? 1 : 0;")); + emit_line(EL_STR("}")); + emit_blank(); + return 0; +} + el_val_t codegen(el_val_t stmts, el_val_t source) { + return codegen_inner(stmts, source, 0, EL_STR("text"), EL_STR("")); + return 0; +} + +el_val_t codegen_with_tests(el_val_t stmts, el_val_t source, el_val_t reporter, el_val_t file_name) { + return codegen_inner(stmts, source, 1, reporter, file_name); + return 0; +} + +el_val_t codegen_inner(el_val_t stmts, el_val_t source, el_val_t test_mode, el_val_t reporter, el_val_t file_name) { 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")); @@ -5310,6 +6462,7 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { state_set(EL_STR("__time_violations"), EL_STR("")); emit_line(EL_STR("#include ")); emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include ")); emit_line(EL_STR("#include \"el_runtime.h\"")); el_val_t imp_n = native_list_len(stmts); el_val_t imp_i = 0; @@ -5385,6 +6538,13 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { if (has_toplevel_lets) { emit_blank(); } + if (test_mode) { + codegen_test(stmts, reporter, file_name); + emit_cap_violations(); + emit_arity_violations(); + emit_time_violations(); + return EL_STR(""); + } el_val_t has_el_main = 0; el_val_t has_toplevel_stmts = 0; i = 0; @@ -5594,6 +6754,69 @@ el_val_t js_binop(el_val_t op) { return 0; } +el_val_t js_is_el_method(el_val_t name) { + if (str_eq(name, EL_STR("append"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("get"))) { + return 1; + } + if (str_eq(name, EL_STR("map_get"))) { + return 1; + } + if (str_eq(name, EL_STR("map_set"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_is_async_builtin(el_val_t name) { + if (str_eq(name, EL_STR("http_get"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post_json"))) { + return 1; + } + if (str_eq(name, EL_STR("http_get_with_headers"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post_with_headers"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_register_async_fn(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_async_fns")); + 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_async_fns"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t js_is_async_fn(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_async_fns")); + 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_is_int_name(el_val_t name) { el_val_t csv = state_get(EL_STR("__js_int_names")); if (str_eq(csv, EL_STR(""))) { @@ -5684,6 +6907,133 @@ el_val_t js_is_int_call(el_val_t call_expr) { return 0; } +el_val_t js_next_html_id(void) { + el_val_t csv = state_get(EL_STR("__js_html_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_html_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t js_cg_html_parts(el_val_t children, el_val_t acc_var) { + el_val_t n = native_list_len(children); + el_val_t i = 0; + el_val_t out = EL_STR(""); + while (i < n) { + el_val_t child = native_list_get(children, i); + el_val_t html_kind = el_get_field(child, EL_STR("html")); + if (str_eq(html_kind, EL_STR("Text"))) { + el_val_t text = el_get_field(child, EL_STR("text")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(text)), EL_STR("; ")); + } + if (str_eq(html_kind, EL_STR("Doctype"))) { + out = el_str_concat(el_str_concat(out, acc_var), EL_STR(" += \"\"; ")); + } + if (str_eq(html_kind, EL_STR("Interp"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = js_cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += html_escape(")), val_c), EL_STR("); ")); + } + if (str_eq(html_kind, EL_STR("Raw"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = js_cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += html_raw(")), val_c), EL_STR("); ")); + } + if (str_eq(html_kind, EL_STR("Element"))) { + el_val_t elem_c = js_cg_html_element_str(child, acc_var); + out = el_str_concat(out, elem_c); + } + if (str_eq(html_kind, EL_STR("Each"))) { + el_val_t each_c = js_cg_html_each(child, acc_var); + out = el_str_concat(out, each_c); + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_cg_html_attrs_str(el_val_t attrs, el_val_t acc_var) { + el_val_t n = native_list_len(attrs); + el_val_t i = 0; + el_val_t out = EL_STR(""); + while (i < n) { + el_val_t attr = native_list_get(attrs, i); + el_val_t attr_name = el_get_field(attr, EL_STR("name")); + el_val_t kind = el_get_field(attr, EL_STR("kind")); + el_val_t open_val = el_str_concat(el_str_concat(EL_STR(" "), attr_name), EL_STR("=\"")); + if (str_eq(kind, EL_STR("static"))) { + el_val_t sv = el_get_field(attr, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(open_val)), EL_STR("; ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(sv)), EL_STR("; ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(EL_STR("\""))), EL_STR("; ")); + } else { + if (str_eq(kind, EL_STR("dynamic"))) { + el_val_t val_node = el_get_field(attr, EL_STR("value")); + el_val_t val_c = js_cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(open_val)), EL_STR("; ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += html_escape(")), val_c), EL_STR("); ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(EL_STR("\""))), EL_STR("; ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(el_str_concat(EL_STR(" "), attr_name))), EL_STR("; ")); + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_cg_html_element_str(el_val_t elem, el_val_t acc_var) { + el_val_t tag = el_get_field(elem, EL_STR("tag")); + el_val_t attrs = el_get_field(elem, EL_STR("attrs")); + el_val_t children = el_get_field(elem, EL_STR("children")); + el_val_t self_closing = el_get_field(elem, EL_STR("self_closing")); + el_val_t out = el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" += ")), js_str_lit(el_str_concat(EL_STR("<"), tag))), EL_STR("; ")); + out = el_str_concat(out, js_cg_html_attrs_str(attrs, acc_var)); + if (self_closing) { + out = el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += \"/>\"")), EL_STR("; ")); + } else { + out = el_str_concat(el_str_concat(out, acc_var), EL_STR(" += \">\"; ")); + out = el_str_concat(out, js_cg_html_parts(children, acc_var)); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(el_str_concat(el_str_concat(EL_STR("")))), EL_STR("; ")); + } + return out; + return 0; +} + +el_val_t js_cg_html_each(el_val_t node, el_val_t acc_var) { + el_val_t list_expr = el_get_field(node, EL_STR("list")); + el_val_t item_name = el_get_field(node, EL_STR("item")); + el_val_t body_children = el_get_field(node, EL_STR("body")); + el_val_t id = js_next_html_id(); + el_val_t list_var = el_str_concat(EL_STR("_html_list_"), id); + el_val_t len_var = el_str_concat(EL_STR("_html_len_"), id); + el_val_t idx_var = el_str_concat(EL_STR("_html_i_"), id); + el_val_t list_c = js_cg_expr(list_expr); + el_val_t inner_c = js_cg_html_parts(body_children, acc_var); + return 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(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(el_str_concat(el_str_concat(EL_STR("{ const "), list_var), EL_STR(" = ")), list_c), EL_STR("; const ")), len_var), EL_STR(" = el_list_len(")), list_var), EL_STR("); for (let ")), idx_var), EL_STR(" = 0; ")), idx_var), EL_STR(" < ")), len_var), EL_STR("; ")), idx_var), EL_STR("++) { const ")), item_name), EL_STR(" = el_list_get(")), list_var), EL_STR(", ")), idx_var), EL_STR("); ")), inner_c), EL_STR("} } ")); + return 0; +} + +el_val_t js_cg_html_template(el_val_t expr) { + el_val_t root = el_get_field(expr, EL_STR("root")); + el_val_t id = js_next_html_id(); + el_val_t acc = el_str_concat(EL_STR("_html_"), id); + el_val_t doctype_flag = el_get_field(root, EL_STR("doctype")); + el_val_t doctype_prefix = EL_STR(""); + if (doctype_flag) { + doctype_prefix = el_str_concat(acc, EL_STR(" += \"\"; ")); + } + el_val_t body = js_cg_html_element_str(root, acc); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("(() => { let "), acc), EL_STR(" = \"\"; ")), doctype_prefix), body), EL_STR("return ")), acc), EL_STR("; })()")); + 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"))) { @@ -5937,16 +7287,29 @@ el_val_t js_cg_expr(el_val_t expr) { el_val_t args_c = str_join(args_parts, EL_STR(", ")); 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(")")); + el_val_t call_expr = el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); + if (js_is_async_builtin(fn_name)) { + return el_str_concat(EL_STR("await "), call_expr); + } + if (js_is_async_fn(fn_name)) { + return el_str_concat(EL_STR("await "), call_expr); + } + return call_expr; } 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(")")); + if (js_is_el_method(field)) { + 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(")")); } - return el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(")")); + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(obj_c, EL_STR(".")), field), EL_STR("(")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(obj_c, EL_STR(".")), field), 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(")")); @@ -5954,8 +7317,14 @@ el_val_t js_cg_expr(el_val_t expr) { 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_kind = el_get_field(obj, EL_STR("expr")); + if (str_eq(obj_kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(obj, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), inner_c), EL_STR(")?.[")), js_str_lit(field)), EL_STR("] ?? null")); + } 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(")")); + return el_str_concat(el_str_concat(el_str_concat(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")); @@ -5963,6 +7332,12 @@ el_val_t js_cg_expr(el_val_t expr) { 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")); + el_val_t obj_kind = el_get_field(obj, EL_STR("expr")); + if (str_eq(obj_kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(obj, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), inner_c), EL_STR(")?.[")), idx_c), EL_STR("] ?? null")); + } 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(")")); } @@ -6014,6 +7389,12 @@ el_val_t js_cg_expr(el_val_t expr) { if (str_eq(kind, EL_STR("Match"))) { return js_cg_match(expr); } + if (str_eq(kind, EL_STR("Lambda"))) { + return js_cg_lambda(expr); + } + if (str_eq(kind, EL_STR("HtmlTemplate"))) { + return js_cg_html_template(expr); + } return EL_STR("null"); return 0; } @@ -6069,7 +7450,12 @@ el_val_t js_cg_match(el_val_t expr) { } parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if ("), subj_var), EL_STR(" === ")), bv), EL_STR(") return (")), body_c), EL_STR("); "))); } else { - parts = native_list_append(parts, el_str_concat(el_str_concat(EL_STR("return ("), body_c), EL_STR("); "))); + if (str_eq(pkind, EL_STR("Variant"))) { + el_val_t variant = el_get_field(pat, EL_STR("variant")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if (str_eq("), subj_var), EL_STR(", ")), js_str_lit(variant)), EL_STR(")) return (")), body_c), EL_STR("); "))); + } else { + parts = native_list_append(parts, el_str_concat(el_str_concat(EL_STR("return ("), body_c), EL_STR("); "))); + } } } } @@ -6082,6 +7468,47 @@ el_val_t js_cg_match(el_val_t expr) { return 0; } +el_val_t js_next_lambda_id(void) { + el_val_t csv = state_get(EL_STR("__js_lambda_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_lambda_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t js_cg_lambda(el_val_t expr) { + el_val_t params = el_get_field(expr, EL_STR("params")); + el_val_t body = el_get_field(expr, EL_STR("body")); + el_val_t ret_type = el_get_field(expr, EL_STR("ret_type")); + el_val_t id = js_next_lambda_id(); + el_val_t lambda_name = el_str_concat(EL_STR("__lambda_"), id); + el_val_t params_str = js_params_str(params); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("function "), lambda_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_build_int_names_for_params(params); + js_cg_stmts(body_xformed, EL_STR(" "), decl); + js_emit_line(EL_STR("}")); + js_emit_blank(); + return lambda_name; + 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; @@ -6180,14 +7607,36 @@ el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { if (str_eq(kind, EL_STR("Import"))) { return declared; } + if (str_eq(kind, EL_STR("TestDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Assert"))) { + return declared; + } + if (str_eq(kind, EL_STR("TryCatch"))) { + el_val_t try_body = el_get_field(stmt, EL_STR("try_body")); + el_val_t catch_name = el_get_field(stmt, EL_STR("catch_name")); + el_val_t catch_body = el_get_field(stmt, EL_STR("catch_body")); + js_emit_line(el_str_concat(indent, EL_STR("try {"))); + js_cg_stmts(try_body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("} catch (")), catch_name), EL_STR(") {"))); + js_cg_stmts(catch_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("ExternFn"))) { + el_val_t ename = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// extern fn ")), ename), EL_STR(" \xe2\x80\x94 provided by the JS environment"))); + 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)"))); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// cgi block '")), cname), EL_STR("' \xe2\x80\x94 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"))); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// service block '")), sname), EL_STR("' \xe2\x80\x94 no-op in JS target"))); return declared; } return declared; @@ -6330,12 +7779,22 @@ el_val_t js_cg_fn(el_val_t stmt) { 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 decorator = el_get_field(stmt, EL_STR("decorator")); 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(") {"))); + if (str_eq(decorator, EL_STR("async"))) { + js_register_async_fn(fn_name); + if (str_eq(fn_name, EL_STR("main"))) { + js_emit_line(el_str_concat(el_str_concat(EL_STR("async function main("), params_str), EL_STR(") {"))); + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("async function "), fn_name), EL_STR("(")), 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(") {"))); + 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); @@ -6382,40 +7841,264 @@ el_val_t js_is_top_level_decl(el_val_t stmt) { if (str_eq(kind, EL_STR("ServiceBlock"))) { return 1; } + if (str_eq(kind, EL_STR("ExternFn"))) { + return 1; + } + if (str_eq(kind, EL_STR("TestDef"))) { + 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 js_cg_stmt_assert_text(el_val_t stmt, el_val_t test_name) { + el_val_t expr_node = el_get_field(stmt, EL_STR("expr")); + el_val_t msg = el_get_field(stmt, EL_STR("msg")); + el_val_t expr_c = js_cg_expr(expr_node); + el_val_t disp_msg = EL_STR("assert failed"); + if (!str_eq(msg, EL_STR(""))) { + disp_msg = msg; + } + js_emit_line(el_str_concat(el_str_concat(EL_STR(" if (!("), expr_c), EL_STR(")) {"))); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" process.stderr.write(\" FAIL "), js_escape(test_name)), EL_STR(" \xe2\x80\x94 ")), js_escape(disp_msg)), EL_STR("\\n\");"))); + js_emit_line(EL_STR(" return false;")); + js_emit_line(EL_STR(" }")); + return 0; +} + +el_val_t js_cg_stmt_assert_json(el_val_t stmt, el_val_t test_name, el_val_t file_name, el_val_t test_line) { + el_val_t expr_node = el_get_field(stmt, EL_STR("expr")); + el_val_t msg = el_get_field(stmt, EL_STR("msg")); + el_val_t assert_line = el_get_field(stmt, EL_STR("line")); + el_val_t expr_c = js_cg_expr(expr_node); + el_val_t disp_msg = EL_STR("assert failed"); + if (!str_eq(msg, EL_STR(""))) { + disp_msg = msg; + } + js_emit_line(el_str_concat(el_str_concat(EL_STR(" if (!("), expr_c), EL_STR(")) {"))); + js_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(" process.stdout.write(JSON.stringify({type:\"test_fail\",name:"), js_str_lit(test_name)), EL_STR(",file:")), js_str_lit(file_name)), EL_STR(",line:")), native_int_to_str(test_line)), EL_STR(",assert_line:")), native_int_to_str(assert_line)), EL_STR(",message:")), js_str_lit(disp_msg)), EL_STR("}) + \"\\n\");"))); + js_emit_line(EL_STR(" return false;")); + js_emit_line(EL_STR(" }")); + return 0; +} + +el_val_t js_cg_stmts_in_test(el_val_t stmts, el_val_t indent, el_val_t declared, el_val_t test_name, el_val_t reporter, el_val_t file_name, el_val_t test_line) { 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); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("Assert"))) { + if (str_eq(reporter, EL_STR("json"))) { + js_cg_stmt_assert_json(stmt, test_name, file_name, test_line); + } else { + js_cg_stmt_assert_text(stmt, test_name); + } + } else { + decl = js_cg_stmt(stmt, indent, decl); + } + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t js_cg_test_fn(el_val_t test_def, el_val_t idx, el_val_t reporter, el_val_t file_name) { + el_val_t fn_name = el_str_concat(EL_STR("el_test_"), native_int_to_str(idx)); + el_val_t test_name = el_get_field(test_def, EL_STR("name")); + el_val_t test_line = el_get_field(test_def, EL_STR("line")); + el_val_t body = el_get_field(test_def, EL_STR("body")); + js_emit_line(el_str_concat(el_str_concat(EL_STR("async function "), fn_name), EL_STR("() {"))); + js_cg_stmts_in_test(body, EL_STR(" "), native_list_empty(), test_name, reporter, file_name, test_line); + js_emit_line(EL_STR(" return true;")); + js_emit_line(EL_STR("}")); + js_emit_blank(); + return fn_name; + return 0; +} + +el_val_t js_codegen_test(el_val_t stmts, el_val_t reporter, el_val_t file_name) { + el_val_t n = native_list_len(stmts); + el_val_t test_defs = native_list_empty(); + el_val_t 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("TestDef"))) { + test_defs = native_list_append(test_defs, stmt); + } + i = (i + 1); + } + el_val_t n_tests = native_list_len(test_defs); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (js_is_fndef(stmt)) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (!str_eq(fn_name, EL_STR("main"))) { + js_cg_fn(stmt); + } + } + i = (i + 1); + } + el_val_t ti = 0; + while (ti < n_tests) { + el_val_t test_def = native_list_get(test_defs, ti); + js_cg_test_fn(test_def, ti, reporter, file_name); + ti = (ti + 1); + } + el_val_t test_word = EL_STR("tests"); + if (n_tests == 1) { + test_word = EL_STR("test"); + } + js_emit_line(EL_STR("(async () => {")); + js_emit_line(EL_STR(" let pass = 0; let fail = 0;")); + if (str_eq(reporter, EL_STR("json"))) { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" process.stdout.write(JSON.stringify({type:\"suite_start\",file:"), js_str_lit(file_name)), EL_STR(",total:")), native_int_to_str(n_tests)), EL_STR("}) + \"\\n\");"))); + ti = 0; + while (ti < n_tests) { + el_val_t test_def = native_list_get(test_defs, ti); + el_val_t test_name = el_get_field(test_def, EL_STR("name")); + el_val_t test_line = el_get_field(test_def, EL_STR("line")); + el_val_t fn_name = el_str_concat(EL_STR("el_test_"), native_int_to_str(ti)); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" process.stdout.write(JSON.stringify({type:\"test_start\",name:"), js_str_lit(test_name)), EL_STR(",file:")), js_str_lit(file_name)), EL_STR(",line:")), native_int_to_str(test_line)), EL_STR("}) + \"\\n\");"))); + js_emit_line(el_str_concat(el_str_concat(EL_STR(" if (await "), fn_name), EL_STR("()) {"))); + js_emit_line(EL_STR(" pass++;")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" process.stdout.write(JSON.stringify({type:\"test_pass\",name:"), js_str_lit(test_name)), EL_STR(",file:")), js_str_lit(file_name)), EL_STR(",line:")), native_int_to_str(test_line)), EL_STR(",duration_ms:0}) + \"\\n\");"))); + js_emit_line(EL_STR(" } else { fail++; }")); + ti = (ti + 1); + } + js_emit_line(EL_STR(" process.stdout.write(JSON.stringify({type:\"suite_end\",passed:pass,failed:fail}) + \"\\n\");")); + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" process.stderr.write(\"==> running "), native_int_to_str(n_tests)), EL_STR(" ")), test_word), EL_STR("\\n\\n\");"))); + ti = 0; + while (ti < n_tests) { + el_val_t test_def = native_list_get(test_defs, ti); + el_val_t test_name = el_get_field(test_def, EL_STR("name")); + el_val_t fn_name = el_str_concat(EL_STR("el_test_"), native_int_to_str(ti)); + js_emit_line(el_str_concat(el_str_concat(EL_STR(" process.stderr.write(\" RUN "), js_escape(test_name)), EL_STR("\\n\");"))); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" if (await "), fn_name), EL_STR("()) { pass++; process.stderr.write(\" PASS ")), js_escape(test_name)), EL_STR("\\n\"); }"))); + js_emit_line(EL_STR(" else { fail++; }")); + ti = (ti + 1); + } + js_emit_line(EL_STR(" process.stderr.write(\"\\n\" + pass + \" passed, \" + fail + \" failed\\n\");")); + } + js_emit_line(EL_STR(" process.exit(fail > 0 ? 1 : 0);")); + js_emit_line(EL_STR("})();")); + return 0; +} + +el_val_t codegen_js(el_val_t stmts, el_val_t source) { + return codegen_js_inner(stmts, source, 0, EL_STR(""), 0, EL_STR("text"), EL_STR("")); + return 0; +} + +el_val_t codegen_js_test(el_val_t stmts, el_val_t source, el_val_t reporter, el_val_t file_name) { + return codegen_js_inner(stmts, source, 0, EL_STR(""), 1, reporter, file_name); + return 0; +} + +el_val_t codegen_js_bundle(el_val_t stmts, el_val_t source, el_val_t runtime_content) { + return codegen_js_inner(stmts, source, 1, runtime_content, 0, EL_STR("text"), EL_STR("")); + return 0; +} + +el_val_t codegen_js_inner(el_val_t stmts, el_val_t source, el_val_t bundle_mode, el_val_t runtime_content, el_val_t test_mode, el_val_t reporter, el_val_t file_name) { + state_set(EL_STR("__js_int_names"), EL_STR("")); + state_set(EL_STR("__js_match_counter"), EL_STR("")); + state_set(EL_STR("__js_async_fns"), EL_STR("")); + state_set(EL_STR("__js_lambda_counter"), EL_STR("")); + js_emit_line(EL_STR("// Generated by elc --target=js")); + if (bundle_mode) { + js_emit_line(EL_STR("// Bundle mode: runtime inlined, no import statement needed.")); + js_emit_line(EL_STR("")); + js_emit_line(EL_STR(";(function() {")); + js_emit_line(EL_STR("\"use strict\";")); + js_emit_line(js_strip_es_exports(runtime_content)); + js_emit_line(EL_STR("")); + } else { + js_emit_line(EL_STR("// Runtime: foundation/el/el-compiler/runtime/el_runtime.js")); + js_emit_line(EL_STR("import \"./el_runtime.js\";")); + } + if (!bundle_mode) { + 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(" dom_get_element, dom_get_value, dom_set_value, dom_get_text, dom_set_text,")); + js_emit_line(EL_STR(" dom_set_prop, dom_get_prop, dom_set_style, dom_add_class, dom_remove_class,")); + js_emit_line(EL_STR(" dom_show, dom_hide, dom_listen, dom_query, dom_query_all, dom_create,")); + js_emit_line(EL_STR(" dom_append, dom_remove, dom_is_null,")); + js_emit_line(EL_STR(" dom_set_attr, dom_get_attr, dom_remove_attr, dom_set_html, dom_get_html,")); + js_emit_line(EL_STR(" dom_get_parent, dom_contains_class, dom_get_checked, dom_set_checked,")); + js_emit_line(EL_STR(" set_timeout, set_interval, clear_interval,")); + js_emit_line(EL_STR(" local_storage_get, local_storage_set, local_storage_remove,")); + js_emit_line(EL_STR(" window_location, window_redirect, window_on_load,")); + js_emit_line(EL_STR(" console_log,")); + js_emit_line(EL_STR(" window_set, window_get, native_js, native_js_call,")); + js_emit_line(EL_STR(" promise_then, promise_catch, promise_resolve, promise_reject,")); + js_emit_line(EL_STR(" object_assign, object_keys, object_values, json_deep_clone,")); + js_emit_line(EL_STR(" array_from, type_of, instanceof_check,")); + 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); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("Import"))) { + el_val_t ipath = el_get_field(stmt, EL_STR("path")); + el_val_t is_url = str_starts_with(ipath, EL_STR("http://")); + is_url = (is_url || str_starts_with(ipath, EL_STR("https://"))); + el_val_t is_js = !str_ends_with(ipath, EL_STR(".el")); + if (is_url || is_js) { + if (bundle_mode) { + js_emit_line(el_str_concat(EL_STR("// external: "), ipath)); + } else { + js_emit_line(el_str_concat(el_str_concat(EL_STR("import "), js_str_lit(ipath)), EL_STR(";"))); + } + } + } + i = (i + 1); + } + js_emit_blank(); + n = native_list_len(stmts); + 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 dec = el_get_field(stmt, EL_STR("decorator")); + if (str_eq(dec, EL_STR("async"))) { + el_val_t aname = el_get_field(stmt, EL_STR("name")); + js_register_async_fn(aname); + } + } + i = (i + 1); + } + if (test_mode) { + js_codegen_test(stmts, reporter, file_name); + return EL_STR(""); + } + i = 0; while (i < n) { el_val_t stmt = native_list_get(stmts, i); if (js_is_fndef(stmt)) { @@ -6453,10 +8136,37 @@ el_val_t codegen_js(el_val_t stmts, el_val_t source) { js_emit_blank(); js_emit_line(EL_STR("main();")); } + if (bundle_mode) { + js_emit_line(EL_STR("")); + js_emit_line(EL_STR("})();")); + } return EL_STR(""); return 0; } +el_val_t js_strip_es_exports(el_val_t content) { + el_val_t lines = str_split(content, EL_STR("\n")); + el_val_t n = native_list_len(lines); + el_val_t out = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t line = native_list_get(lines, i); + el_val_t trimmed = str_trim(line); + if (str_starts_with(trimmed, EL_STR("export {"))) { + i = n; + } else { + if (str_starts_with(trimmed, EL_STR("export default"))) { + i = n; + } else { + out = native_list_append(out, line); + } + } + i = (i + 1); + } + return str_join(out, EL_STR("\n")); + return 0; +} + el_val_t compile(el_val_t source) { el_val_t tokens = lex(source); el_val_t stmts = parse(tokens); @@ -6473,6 +8183,35 @@ el_val_t compile_js(el_val_t source) { return 0; } +el_val_t compile_js_with_bundle(el_val_t source, el_val_t runtime_path) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + el_release(tokens); + el_val_t runtime_content = fs_read(runtime_path); + if (str_eq(runtime_content, EL_STR(""))) { + println(el_str_concat(EL_STR("el-compiler: warning: --bundle: could not read runtime at "), runtime_path)); + println(EL_STR("el-compiler: warning: bundle output will be incomplete")); + } + return codegen_js_bundle(stmts, source, runtime_content); + return 0; +} + +el_val_t compile_test(el_val_t source, el_val_t reporter, el_val_t file_name) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + el_release(tokens); + return codegen_with_tests(stmts, source, reporter, file_name); + return 0; +} + +el_val_t compile_js_test(el_val_t source, el_val_t reporter, el_val_t file_name) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + el_release(tokens); + return codegen_js_test(stmts, source, reporter, file_name); + 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); @@ -6481,6 +8220,22 @@ el_val_t compile_dispatch(el_val_t tgt, el_val_t source) { return 0; } +el_val_t compile_dispatch_test(el_val_t tgt, el_val_t source, el_val_t reporter, el_val_t file_name) { + if (str_eq(tgt, EL_STR("js"))) { + return compile_js_test(source, reporter, file_name); + } + return compile_test(source, reporter, file_name); + return 0; +} + +el_val_t compile_dispatch_bundle(el_val_t tgt, el_val_t source, el_val_t runtime_path) { + if (str_eq(tgt, EL_STR("js"))) { + return compile_js_with_bundle(source, runtime_path); + } + 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; @@ -6525,6 +8280,170 @@ el_val_t detect_emit_header(el_val_t argv) { return 0; } +el_val_t detect_bundle(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_eq(a, EL_STR("--bundle"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_minify(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_eq(a, EL_STR("--minify"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_obfuscate(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_eq(a, EL_STR("--obfuscate"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_test(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_eq(a, EL_STR("--test"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_reporter(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("--reporter="))) { + el_val_t v = str_slice(a, 11, str_len(a)); + return v; + } + i = (i + 1); + } + return EL_STR("text"); + return 0; +} + +el_val_t basename_of(el_val_t path) { + el_val_t n = str_len(path); + el_val_t i = (n - 1); + while (i >= 0) { + el_val_t c = str_slice(path, i, (i + 1)); + if (str_eq(c, EL_STR("/"))) { + return str_slice(path, (i + 1), n); + } + i = (i - 1); + } + return path; + return 0; +} + +el_val_t make_temp_path(el_val_t suffix) { + el_val_t pid = getpid_now(); + el_val_t ts = time_now(); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("/tmp/elc-"), native_int_to_str(pid)), EL_STR("-")), native_int_to_str(ts)), EL_STR(".")), suffix); + return 0; +} + +el_val_t js_reserved_names(void) { + return EL_STR("neuronDemoToggle,neuronDemoSend,neuronDemoReset,signInWith,signInWithEmail,signUpWithEmail,sendMagicLink,signOut,resetPassword,sendResetEmail,updatePassword,showSignIn,showSignUp,hideReset,setSort,addFamilyMember,removeFamilyMember,copyForPlatform,entHeadcountChange,NEURON_CFG"); + return 0; +} + +el_val_t find_node_tool(el_val_t tool_name, el_val_t src_dir) { + el_val_t cand1 = el_str_concat(el_str_concat(src_dir, EL_STR("/node_modules/.bin/")), tool_name); + el_val_t check1 = str_trim(exec_capture(el_str_concat(el_str_concat(EL_STR("test -x "), cand1), EL_STR(" && echo yes 2>/dev/null")))); + if (str_eq(check1, EL_STR("yes"))) { + return cand1; + } + el_val_t parent_dir = dirname_of(src_dir); + el_val_t cand2 = el_str_concat(el_str_concat(parent_dir, EL_STR("/node_modules/.bin/")), tool_name); + el_val_t check2 = str_trim(exec_capture(el_str_concat(el_str_concat(EL_STR("test -x "), cand2), EL_STR(" && echo yes 2>/dev/null")))); + if (str_eq(check2, EL_STR("yes"))) { + return cand2; + } + el_val_t npx_path = str_trim(exec_capture(EL_STR("which npx 2>/dev/null"))); + if (!str_eq(npx_path, EL_STR(""))) { + return el_str_concat(EL_STR("npx --yes "), tool_name); + } + return EL_STR(""); + return 0; +} + +el_val_t apply_minify(el_val_t js_path, el_val_t out_path, el_val_t src_dir) { + el_val_t terser = find_node_tool(EL_STR("terser"), src_dir); + if (str_eq(terser, EL_STR(""))) { + println(EL_STR("el-compiler: error: terser not found. Run 'npm install terser' in your project directory.")); + return 0; + } + el_val_t names = js_reserved_names(); + el_val_t compress_opts = EL_STR("passes=2,drop_console=false,drop_debugger=true"); + el_val_t mangle_reserved = el_str_concat(el_str_concat(EL_STR("'reserved=["), names), EL_STR("]'")); + el_val_t cmd = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(terser, EL_STR(" ")), js_path), EL_STR(" --compress ")), compress_opts), EL_STR(" --mangle ")), mangle_reserved), EL_STR(" --output ")), out_path); + el_val_t ret = exec_command(cmd); + if (ret == 0) { + return 1; + } + println(el_str_concat(el_str_concat(EL_STR("el-compiler: error: terser failed (exit "), native_int_to_str(ret)), EL_STR(")"))); + return 0; + return 0; +} + +el_val_t apply_obfuscate(el_val_t js_path, el_val_t out_path, el_val_t src_dir) { + el_val_t obfuscator = find_node_tool(EL_STR("javascript-obfuscator"), src_dir); + if (str_eq(obfuscator, EL_STR(""))) { + println(EL_STR("el-compiler: error: javascript-obfuscator not found. Run 'npm install javascript-obfuscator' in your project directory.")); + return 0; + } + el_val_t names = js_reserved_names(); + el_val_t cmd = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(obfuscator, EL_STR(" ")), js_path), EL_STR(" --output ")), out_path), EL_STR(" --compact true --simplify true --string-array true --string-array-encoding base64 --string-array-threshold 0.75 --identifier-names-generator hexadecimal --rename-globals false --self-defending false --reserved-names ")), names); + el_val_t ret = exec_command(cmd); + if (ret == 0) { + return 1; + } + println(el_str_concat(el_str_concat(EL_STR("el-compiler: error: javascript-obfuscator failed (exit "), native_int_to_str(ret)), EL_STR(")"))); + return 0; + return 0; +} + +el_val_t resolve_runtime_path(el_val_t src_path) { + el_val_t src_dir = dirname_of(src_path); + el_val_t candidate = el_str_concat(src_dir, EL_STR("/el_runtime.js")); + el_val_t existing = fs_read(candidate); + if (!str_eq(existing, EL_STR(""))) { + return candidate; + } + return EL_STR(""); + return 0; +} + el_val_t type_node_to_el(el_val_t t) { el_val_t k = el_get_field(t, EL_STR("kind")); if (str_eq(k, EL_STR("Simple"))) { @@ -6547,7 +8466,7 @@ el_val_t emit_header(el_val_t stmts, el_val_t hdr_path) { el_val_t n = native_list_len(stmts); el_val_t i = 0; el_val_t parts = native_list_empty(); - parts = native_list_append(parts, EL_STR("// auto-generated by elc --emit-header - do not edit\n")); + parts = native_list_append(parts, EL_STR("// auto-generated by elc --emit-header \xe2\x80\x94 do not edit\n")); while (i < n) { el_val_t stmt = native_list_get(stmts, i); el_val_t kind = el_get_field(stmt, EL_STR("stmt")); @@ -6661,17 +8580,78 @@ el_val_t resolve_imports(el_val_t src_path) { return 0; } +el_val_t run_with_postprocess(el_val_t tgt, el_val_t source, el_val_t src_path, el_val_t do_bundle, el_val_t do_obfuscate, el_val_t argc, el_val_t positional) { + el_val_t src_dir = dirname_of(src_path); + el_val_t tmp_gen = make_temp_path(EL_STR("js")); + el_val_t tmp_min = make_temp_path(EL_STR("min.js")); + stdout_to_file(tmp_gen); + if (do_bundle) { + el_val_t runtime_path = resolve_runtime_path(src_path); + compile_dispatch_bundle(tgt, source, runtime_path); + } else { + compile_dispatch(tgt, source); + } + stdout_restore(); + el_val_t ok_min = apply_minify(tmp_gen, tmp_min, src_dir); + if (!ok_min) { + exec_command(el_str_concat(el_str_concat(el_str_concat(EL_STR("rm -f "), tmp_gen), EL_STR(" ")), tmp_min)); + exit(1); + } + state_set(EL_STR("__elc_final_js"), tmp_min); + if (do_obfuscate) { + el_val_t tmp_obf = make_temp_path(EL_STR("obf.js")); + el_val_t ok_obf = apply_obfuscate(tmp_min, tmp_obf, src_dir); + if (!ok_obf) { + exec_command(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("rm -f "), tmp_gen), EL_STR(" ")), tmp_min), EL_STR(" ")), tmp_obf)); + exit(1); + } + state_set(EL_STR("__elc_final_js"), tmp_obf); + } + el_val_t final_path = state_get(EL_STR("__elc_final_js")); + el_val_t final_js = fs_read(final_path); + exec_command(el_str_concat(el_str_concat(el_str_concat(EL_STR("rm -f "), tmp_gen), EL_STR(" ")), tmp_min)); + if (do_obfuscate) { + exec_command(el_str_concat(EL_STR("rm -f "), final_path)); + } + if (argc >= 2) { + el_val_t out_path = native_list_get(positional, 1); + el_val_t ok = fs_write(out_path, final_js); + if (ok) { + return 0; + } else { + println(EL_STR("el-compiler: failed to write output")); + exit(1); + } + } + print(final_js); + return 0; +} + int main(int _argc, char** _argv) { el_runtime_init_args(_argc, _argv); el_val_t argv = args(); el_val_t tgt = detect_target(argv); el_val_t do_emit_header = detect_emit_header(argv); + el_val_t do_bundle = detect_bundle(argv); + el_val_t do_minify = detect_minify(argv); + el_val_t do_obfuscate = detect_obfuscate(argv); + el_val_t do_test = detect_test(argv); + el_val_t reporter = detect_reporter(argv); + if (do_obfuscate) { + do_minify = 1; + } el_val_t positional = strip_flags(argv); el_val_t argc = native_list_len(positional); if (argc < 1) { - println(EL_STR("el-compiler: usage: elc [--target=c|js] [--emit-header] []")); + println(EL_STR("el-compiler: usage: elc [--target=c|js] [--test] [--reporter=text|json] [--bundle] [--minify] [--obfuscate] [--emit-header] []")); exit(1); } + if (do_minify) { + if (!str_eq(tgt, EL_STR("js"))) { + println(EL_STR("el-compiler: error: --minify and --obfuscate require --target=js")); + exit(1); + } + } el_val_t src_path = native_list_get(positional, 0); if (do_emit_header) { el_val_t raw_source = fs_read(src_path); @@ -6683,7 +8663,31 @@ int main(int _argc, char** _argv) { el_release(hdr_stmts); } el_val_t source = resolve_imports(src_path); - el_val_t out = compile_dispatch(tgt, source); + el_val_t file_name = basename_of(src_path); + if (do_test) { + el_val_t out = compile_dispatch_test(tgt, source, reporter, file_name); + if (argc >= 2) { + el_val_t out_path = native_list_get(positional, 1); + el_val_t ok = fs_write(out_path, out); + if (ok) { + exit(0); + } + println(EL_STR("el-compiler: failed to write output")); + exit(1); + } + exit(0); + } + if (do_minify) { + run_with_postprocess(tgt, source, src_path, do_bundle, do_obfuscate, argc, positional); + exit(0); + } + el_val_t out = EL_STR(""); + if (do_bundle) { + el_val_t runtime_path = resolve_runtime_path(src_path); + out = compile_dispatch_bundle(tgt, source, runtime_path); + } else { + out = compile_dispatch(tgt, source); + } if (argc >= 2) { el_val_t out_path = native_list_get(positional, 1); el_val_t ok = fs_write(out_path, out); diff --git a/dist/platform/elc b/dist/platform/elc index 4d31bd55904a0f84c50734b8a93df2162ab32258..3c2861eaf690359ab1183702624071a5f72fec21 100755 GIT binary patch literal 451720 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�gLEbl7L)BICwG!@8AcTGcUDw_Ki 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

@L|Kv-<20GyD(Wi?u(l;J;*dDt(syu^-*> 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 literal 521464 zcmd444S1Es(Kmj=A?83p#DEdQXAuKNjEIVel#`?sAu7f2AtWIpTEtW-MoMX_ps7Vg zOHx!yd3*q=@)3QAMT07X{=eVO?8)YEYwhd*dasx3 z3is^J&g|^$?C$L6+3~N#pSKHzl0x{`3V&(%yX1^e=z-93K%r0<{9S{;l9KP_j2J#? z_zj~O+wz|wZW(o2hf6(4$X_h07^>A?w)mXSv)F{-+w*V+VJbD;xX*9?@PZHe$@q%fMNHa%bW4wH{;H-<^m_m_x&@HrSeohhFfxUxs%_lJ7-V7 z^Oln7cYb$<;onle@23jCm%>8FaH32uN7m~v44-f1jLj*@8-0C&)Gq2z>Qz(Q`i)AM z?D@wuXW_4;WZI18QZgLO?-wdp2>dJv@(`*ybO!QbO}6 z(Ep@_mR}JHr2_m8{`l`>{p$*YZih6ky_p2gfAiL+gknzEf@cEgi9fdY>{(@ZWq)t_ z&Dpoi`Q9xE^Ir!3D96vetY1u8H|VD?O-g#^*T0&cc`4$0;!nzS9t1wmz(#jTe{Ovt zaE?kteNhzhX+5B2>tnuG;*U7Nv;maTEDPkBI_s|QU3}TakZStPK$?H2(_M=mBdG;l z!JM+YZ@uH|M&8do{ zs+?A#k9)=1R$YT{zY&H z6sg-wQl)MOqke4N<^Z;JI})(1+cAJ`-A)8->vjrYTes5z_t1Kt3Aneya{y;5d>`N} zg&zW(t#B3KfeJ4HJV@acfQKl&2JkS2p9h?$@J7HR6y5?jU*XpQk5+gm-~xr;1w29F zdccJW9{^mU@KL~174`v7Q#h$zRYR%5Z2-?uxFg^)g}bzaEuXD64mg~qHqLm32Qa>q z#1Ce?!a0oZEb${5ukaYgpCj=T8L#jZ#-~gCbjB+@lkw+D{2azBd>`YxNc=;LSGbDt z=Sln$#w)yn@fi}ohVcqN&-ktqzmf3@Z(+Q)@7EdM4ff1-J=y!)g2Xo6-CLT3He=fK zWbe%Y{37B_o1X0bF#x}Sc+;jQd%q9BR}gR7^knaU1MuaIb!`*i@mjCj+gCwprH z@TJ7}V4I)pJr#hTN_=m@|1tnyNPMQ?e;$A@AU;d*4+r4$iO&}N{Q>wq;s*-;M*;XD z#19huT>XE5nm|y3j^?t#Fq&E8v*!z#7`Ccc>(y{#7`6a*#Y=n z#Fq-bZ2*2d@iPS9DgeKg_%gx&>*3Se-zMN!RNP?N=O+R9^~8q@4E|sMzS__Wes2JN zrJ)}y?LPp&)X)q5%>eu&LqE>Y|1ki+z|af+_W}3{LqFco|8D@k+|UdD*8%u4LqEaL zuMNPL8hXJ$6@Z^==x;RizYM?^8hXM1JOE!{=qDQbhXe5WhFr;L{8}eWuCYr~rJbp%;8^ z06q+SE&NLHi6+A*Dq8c|jKVeWhr}=18iK#u3jS`0zEE9cC&qF3LNWM2F^oG`pK4m1 z=!arX)`__4037Avct(8p)8y&li9D{4mJ1&(B(j9*dxzJYLKwbxU9Z2k6PfBoCL`Yg zz>v+rM*+h>vp#dHfc&Um>ofoBp~Uvz!=rw!&-_UM-jv6TuO;5W0Q~9Y$y?JDR-ey=d!i zF3SiU!`1L{*J3WP8n$sD9ICn&d>`r8zUrc+ke`(t^79cc9ooJst4+wiuzkoMh483x z?W->A81nme4*54>UeV@fp~qZ5`Lh|ngO8lF=2Tv&s;MG%r>TeA+Dkn=)ZY5Zb&(Z- zZ9TjW81*1^0$BXyx=61xt)E;MnFv_?XF@W=x{~W;LCxaHS z_{pFJEPgU*J6b=vE;16Z_{qo@u=vS!ku`wDPp*p`1zf89`<-q5WRxAS_{qo%@N7+U z0C2g&z0#^0<|;fGaD~DX0nb;s3h)AjHv(R$@J_&s6g~=gvBCp7RW&SCcqZUw3a%zRe&oLp2B!D$Ek~4&Ul4SorQQa$El0F3|Qtnb&*FI zZ{|34ky{zB@LVR0qT>{4!vf?|_!^X1-Gwxr6a$j#C%8j`0e2W4xK;)I|=Q ziFk!y1uXL&*eB!7e5Wq*0OQRZ2l6mp;h~H-bDX+J8^$aAUVFrwIZj>VMZhxOsf#?$ zcr)KYTVQJYW8Tm8ja%rCVtn9u_JoTM3%-bWj2*=P%*9s}8TzrroBnvR z_fr=i7W}ourwRSNF217B(0_|~o$vg>#fJrdHSs#%xzoj0OfvMB5wG)|@4EP~;L-QS z=R1>Ke8ogVe?IYfcOz2-#IQm zEcm|@pD*|`U3|q@L;n}zM+^Q87atb3SFZge|_)UUu4Sd4}fvryoKdFP1jUR_997b z8W)5@=)Oapnvjm=;2JI0d-K5~mX7&GderavucpP(B%xi7F@t^e1kHoIBFQ0)H{H!V zf_%u2fBTx6(oMe)nm%uY92qX=|3xfMKp-sIb@u_cjbK;F7@W z74lD&yjZ`R8BResHR{ukc;KgIe)NK|JK$*_v{h^#b!tLB4Umap;y-|mG<2ZtyYo+H zkHDFKT3e@$9^8)df>#W*)hbUDWM~R&IUvUY$ip(<-b%{Bw3Kfz;#Z0^>49v9x*r|bs zBEARvFqv1+LY>-m`72PT?8C0Xx1l%7+Rdwle_IQGw-)|yE&O5n$1Kxo_@Qgi23Xe@ zUTAH0GTKOy*M)rGQ`f@BUQK`0sc-t-LJvPPD4zajP(1y{w$dMp-#N*9?Sar^(bn2W zhKtdMPV&w)d2>CXNc%|2FflG`TeVC2)hiJHkJc>nxmZ^MJ$%d08AiER8$a_rLu>k4 z=mFc=omLzFR^sXVvn&^z_#*EbYZI{HgPYmRC&jiYT`o)3mAkf?u+9a|y4l{Y@NA|2bTsb}EtMn0U+#0H`N8Wi;hJ34Ga zTJ}A0n^FC+j32SD?9IMX?4Ike?0;FtzT^>+GM*;qK$UYK`m>bgG^fdlblHxaqbMi& zXG6~HsNVs3SR1$UaXqLZtGSNWIyTKY(_r#oJ!FDMX4L=uC+N4;4oPS2xe0j(mHVs4 zQ9tNQzNB8Qt>#dd+E(6zjGNUqWZkc;v`N@SmoMQ(-ATVZ$$KS{2ilR9 zC-Nmca5h5c(v!UPi9FE0ERPf6FSb>;?1#T3oh`fjeeQGkY_Kur^U@#bgM9}+=xD4> zx7PLGFxG=pu^!y2d5p0AJo|Io&vRU`{XF;1(a)PcpZni-OyM3m?83xz-59oHV6H90 z<_wJSf@>dk?05a#Ei4p{9g?@EVe1;!ovboU0(45WRqen6Au(3tfH(98^=Vc%ueH$cwQv3&|Bb+K!+NP~D;o2`iqK>QI+GZFAH zh3^4;Lg5vFPb&N>;3kC+01j)}JD&$XQQ;iGsR}=dygDdMe>hFyB}kL5@Nt?*#L1qycqJVD_$fD08q0R5LJ{5;^P3cm+lB^|c)h~I0dG*aGvG}M4+dPT@L|})R)v!gzfEDZ(T42`qkT5) zQ1}g`-=*-&fZtL0X~4S`eiZN?g=YcYr!eOt`;*WI%KT&8Yt8eIb6V-xf^U6ej*q#| z+SrjCtf9y}#QFt|{}XzQeGL5}>rY+yqn2|JFNwTlY3b4)+J@&3?b zH|coMJU-CpDDo&rz2;r#J7pYs+NxZ!3FP}zN9rEw9bk$LR)fdp+M15l2 zj^k?qwu+Lt<9rcHOoaLCiO~ATd{SMYA=Wi3e0it z=_vP&-tm)7i#Kbz8SagBrRCTwVp(H*w0x^V{tE01jJL9`iuymcvWB^z(AB#FGE%;) zj${3zgVdFsTTr&+Sg#Y=kT3QSE{V%_jtO66WIG3TF+Oe=ZQHqaG2Y8(opoS&Iz#qx z-dWH^w2k$P#_M?989c_td8|Fd6M|Hf6 zIv($xI-z#7Eb8};r{|uD%#T~pEESrMEzQ!Xf6l+7Su8aBEY0Gm-{#-ZEE1ZxEzP2+ z|5-?F-0bIwY%jDD8_1>&=vjpNtzx%NLnoV)Pq&M8R@c}UU5>qzwOFS!Hj6z|hMz%r zIrdVQW8cKcyaD{M&$=A@AeG=bFG+aDcBvj0LRO@$wz4ja`a4xt&OuClEkJ#Np6OQD zbPJ;XHccmeC-+&pdiSDCTnD#n0Bf+{%l+Tg*k`f*m%9eA0`V&hpR-IGs^2E%zZJ4B zxAT3*VISru#Klzp`fWLWY^#=Ge#kGka?OwW!cY4X?fZJM585Ssu6Oy=g3l)9QxWo~ zTRs(0f1#~2^cl7fHGLA~iEU7txgo#E(#(ze_q#M)Q&&5rj;?@i>bFbz`a_1Owk1<$ zl&`NV*LujcPV*=a`FS>v@~A)E%|pv)o#E{!A8LGGopuFya3n|HdN z-bY;A4wgcu#mc`li?^WV@gZg3>rIEF~8lC-&5cnZwrh=eowmj z%}0I}nqNuCf63-o67}B?$j@yH3tT>P!KYmL6o&j~ET6)t|EB;x#^xYTY_`%&2>DAa z&4j35>(V&7WLvnC<=Z3WyB#vb+k&>yTV1)zAlD4dqaftZvw0Lm{b$@f+&TvDSgF#C z4*6x4W^~kF;?g*BVGXrY{XUUtxGNLmp!29J(=^C5Rr%+K{6fn=KkDD-@^@tdpIC{~ zj0pMHTbdD3|8AGYk?9+hX}`$S)6E}ou|nmQ7xIT#UU^t64dB&*d>Vz%nJyp1#U?19 zVIjYtPVbpMfF&7{*xRV+@S?T>|)QC7+YR=MOF)#KlG^ zpX`udZ~0_L{gePcHRRJId|q(*ATE}te6m9R4$CJi>L35y=@Yc>pCq3!eYZmIDVGo8 zV#AbAX2^fp^2v<)`vUkpOg<^Xr_$wvxY!Wo(>vr>TRy!p{s-`xO+Kl@=U$f&;$nl8 zPY<+z%clq0e*m9b$ftww`JT%Maj}8QCnMy~w|p|9{&N9*#*j~%@R{WDL0l|b`J{*Z zS(Zfai`CumGzzx#jdum5LQtJ?sZU(YiO znDeEC{IjjhDN+AQm6>bQO?hc8&q-A9?6jPf<(@R!tseso_aM#z9nVxWRp{B~mglT1 zBRHqaJx;DQ*F#TSBj$R31axK(1N_MA?^u&ORqmXTPUM60y+M5bd8#F!KPK{V_L8xt zSQ){&V8aLd{q?AS?)P$!_XEoZGIG!TC9aV|wg$)+NeUf(R`!Kku>R+StBFk$Sd7%zt=*MH|zt15r zt=lHh^`TtIi?|Lfr_Q0=bt<+|Q)c96`XKakOdm#i>uYQJqm;)@Z{lIIkJxiaDy!*( z9KLSf^JlCJS@}Cqe%NFT<3|kR#z*%w+oqcj=^17l;M$bgr-SbP7L*=oB2Ieg4{g1= z=Tt_bFKKn!zSuWlgSj_#5nJTCF>EMqXVxycCJdQPyq>c#FzppOFfiAvvtWOahxZX= z&#J`hWNZib4bTtpyo9uK-T$h<{+F%+n)I-rKYR`y(f*7L6?;#j%(jkeE4q0jsSk{m z>`$Laz~unv^4SX=)9#w>oNK4jF8+ah%vlYrr?Q@H{4>lSwrAHs??E0|vv`4ZV$-Zc zn&qHzirT^*fNg*EsMBAq0BrlKEr6}9y$jgd+F;p#H9U_Z9&O#g$z7XmZ2(}{ znu#9{7`id=7{Ks>4SWaSK?*+vc!ecr0)W_ zK;wr3o}lnZz=aA=1YDx<9Kcf*ehBb1g`Wmos_=_|XDGY{aGAny0G_SzyMW6TJ_>lQ z!kxRDyB$Wh9KiE6z8LTVh35cXsPLnJ7b(01@M49Z2E0_^=K(KM_+`K=6@DG?Duv$y zT&?f{!0QxF?qT*1jXWIzZ_xOesMAdf_d$HE!a0DqDm(`8Hif4H-mdT*z&jLv2=Fe2 zR{(xT;gMDi zr0_$4!%1RGPXkU-_<6vo3cm%ogThAvrzy<4_~{C_?`8H6jXZq-_t5y^fO{)E4sfQz zyt|*J@EpWvEBpZ9feKdv9;7hu^bb+^X~Yjxcw;Y|S2)Wv`Mw1hYnTQ;&iIZ3cl-w8 z748QZ>#ruwaKe}f zOMHL8*oQDOjA8t_0#9eW!m}9PMdBZ2yuvFOf1bo|WW2(!GCo7%@y-G7tQh|9F&^iq z=%*cEdWC()<17c`JD!ht`a9xZ9W6)yt>cA^b=|!}?$gi*LjQXp0AD~n`~u?Z1MvC8 z!|x&f-2i+Z@$h4a-x+`(LcAGMCws34;0F?K#?;B)mH>Pf@f=IRe`5f?H}UYHh<`o+ zpFupwRN&VH;M0i57)Shy0DLO(82gA{5`YgAKTz;h0r-<#`yC|shXU}&h#w;O`vUNd z#19kvoB;ej;`0PQGXTGv_z{Ai9)RCPe7@kP1mL$5KU(k;1MpjkFA)5g0Q@H6CkTFI z0De93g@Vrsz*iGrBKW}p_?5&@75snz{8Hkl3BF$dei8Adg6|c8UqJi}!FLJ3R}fz& z_>KYia^hzTzD)qWjQDcFCk5b3iJvQY|3{~{@2SLB2>xgQzL5C&flMf@_sZw$cqCVr*hpAW!i5WhBhXU}&h~Fgm`vUNd#McUbP5^!% z@mmEyGXTGv_-%rp9)RCP{C2@l3BYeBeuv;E2H>|6zf16A0`QxNe@E~m1MusK-!1r@ z0DLv^djvl?0Kby>eS#klfL}`de!=$(z%L@cQSiM2@C%4PBKR%=_zL2W3BF?hzMS|I zf^QRmFC+e>;FALIrNlQ0-k%fD{)y)rHpZu;0r*1Vxi$^_fdG5~@mzBTzCHk-PdwL> zfqypupGQ2`h=Jc3fFD9U*M5P2JpezDc&_OJza;>lMLgGPf!`Q_?@c_`Y>9t90G~lT z)`p2+6M#=69&6CVuL!`W5|6cR;+F*A!^C4vo%pH%{7J4EVC|mxhXU}&h{qlQ@%IJb z8;QqW1o3kM@cV#YfqgULX9nPR6JH_t=>hm%hJK8ppAvxIZs-L+F#yj!9iCZW{$m30 zn+(0+M+V^68+v(zCMN)2ZRiC*H~_!W(90V%0|M|%4ZYy|1>hGMdU=DUR{(y2p%;9Y z0DOg^mp5oS2H?vLz2Msf;L8lXyg`!`fG;)lg7<$I(Ebg*yg_p`0AFb61%Ds_Uts7b zn)<5`z~>u!!M_`T&olJ$2F=a@{18Jg_}2sQ0}VaSal?ML1mLp_z2G+n;CmbTB18Xt z06xRe3w})iKF!b<8~POi_*6qL_$2}OF!1ghHBDRFx7=sRx+vu_b4ku4)QOT2Ff;Ax98mn`wV8GxrP%3QLwEiFa`Tp0+4+$rA5^06c9`=8`2| z_W-=uB5kR}J0}1ywn$qk@y-mui!BQNi~zjY;$%br`Rv5D-oq1H6#PE}@M4SZy8AV_ zkD}}Djvbo%eivtYtvzvH$J!J3eylz5TsQ2=uB&ICfJ|o1n)^_vucu#Q&(d+78}0cM zo-@p#J#<5vioMq%v%8*d?(p;=zS#SH0U zrX&dAj>THFn~!+0wN>4#}Nb)Tm&_W5*uxGuso-T4}iGx)k5 zRTmkGwIErK!h1hl7sB~k)YS^q(-xx>?r~uap8Wv!z3iDep4Gjklig#04pA3BVZCLs zUa&WT{e;36`tRyJ&brAazQ`M!fP0jZwUA_-!(ct{f$gN4C%3^#+NS)NmnW-ZPV^Ny>VC-)V(k5r8_AiO8a zy_1Vz3y)y$1n;4kx2P}&tt-Wzw|$Gs*ar5l-M6T|3)?VfUoxZqB-OX+Px2_&B(E)G zS{`p7tcPNAMtW=rbR(Fi3uK?@b@(yD`7FDHQxSd&=bTL&QvFP3S#ZW#&bUE-v{8|N z;{UPyS6KObNBs*`e!PJk-`8P#Y#1W<7Z0F+SPOkoSE8F1dpUKZpeuKusfXo_ww|WE z?S7H{PDZ<2i@Km*;(TYG@9uBcCGKx?J>^vS4Y+qV2Jf)xy}ODpKG*OK*!|V#kf!-; zLyJ2~Tifh3eIwhdZJ+E9hd6E0wol%(ugU<|wVXwM>Qxn;UG_y7SFyL~9Uk5x_ z;r9Sn*m(3o^KCrf1q$=s=!FX7?Izv7sflz0?P8730lZXU-fdZ?@I&CUQsFg#S1HW? zu{s2Mm%iyK_##V=qivvHGW`?Rx!FIV@1bpQKl8!Moc;;@l{pK{{sC*{Ji9gU2hO+x zy2YH6!B&a82)NB>Hq+a?3HdxDJAv&?`j~GZ-A(bc3C(AbP5*&B#~}UQYVt(?fv}ui zK>x@#iSQiYIS%p8_(aGpYgUC`JMz{0#!PGS$9ct}%zq{GN1ug$rxnYfXATU1J<}+C zwY`5o(R)zO#M*qjkdNsr(O=*`#mBQ8U7$~)4rP4{eFJcIKiMq<@BGW&eRH`;XWpDx zg*MMNiLs0A5`ACIDD1ECO_ILJc$Wlqm5Fr=d+sko>oSPn+2CpAjwXSokox2}b)&bF zJlGFn3}g5Wu7yCK^bJ;^uS-_Gw!i4cIyQZNp|_sp>UMe^zsYlr1=8bf?2eOR(^lU(E0nYE#=fbGmb27MdycbqbR!qQY|~%9nS{E>lNpE?&0|b+8Fi+m*b7BE3F=Q zuLI%BsC(+w(fxezGy4gMtJV7+xTp4**+bx+54?qy4jGr*v+1Rzzro|$q3lD*J&h>y%6O3&wbzm}WNRLmI5%B$2PXe~0|7z4N;o>nyL?eCJBOVep96;(SJJ z6la&v7NO^Z6*#l8DI{kCvvA&R6W(}{vAU)d^@=q$duFU=6#W>~YhToB6!e#&-b`E0 ziu!%E&N%iTEJt0SEz(z7jq-j~emyO}%&6Z<`MG7fQ0t6+=sURQRi6jhH=sNla2}qt z=o4b=CH$JPsjeQ+JMKV#Nk1vJ4!Ctu|JQe;ZMTxQMh}iwS>YEo0QZHm@;l=%`vf8S60GBxc9#ndY~=F`C>e5q0@wU!yfQ$+S;b&x5;$gQP)IrE--Tf?g_8J*lNzr zVQl643VmyyiI(}8gqJc5TX%h8oAx!-2m4+-54a8b=X)z=+zl6bx3E4O-ah~@zR$uj zwU)kkxX`;6^>UMrYkRd``oYc)j0nkjNQZtk=o?Vq;@8SJ%lQ!BUZJnG5Owk_`iRD1 zQU4(9glSm^2lBt5&zf>U%RY<#q}yjfZ|t*rcGEs=<^@$3_JU6Pg#6`@aVF}GI(yRS zsJmB$`ezxeetyh&$`4!kDef%Boco}h>lwKRh5RXyyBcyI90-{Qsmw#PUqyR#<{34m zklC4M)Qp16cAjDDy06MCwsJvLU&;)5t=xGk_Y9T$Vzx1@|EC~p9`0nWz&K}pk58E1 z)GK|6N!~vYrk+{0YNV&HzXo#?jB92-YsZK7Ng=;ovX%pKw?kV>ZLi}4%XJU;{H3z z9rxeaZsk0Qwn=k_1nrq^QsJio%XyNT2<90&e>d%!ZQlCD;tS&rwXrYy7RBCwf7(3G zvt1`)j9Y>@Q+F8uXoue~3q2Onw`;_oD)LGZ7q#bEp;JQ(|MI^;Yv!8jM^8aIYs2D$ zcQf}1`ys7)?-}iy^}>77E&b49Z?=&GHp6z0`R?`L6<_O7I@6Z`H-h=-I7eB;mu6Wr z)DLZrV}A5Q`L%!IYZZGu3n^z4#D|W;hQ!|!JH8rWIXjGZs4$;4eVoE4Bii-BA!y&|n@pdC{>rwK z7Jk%M?33t6x$V0r+KIK#zWo5Rz4s6KoADjNwFQ)q`dN#1&9}4SW79neW7E6n1_ZbAK>Dj$!wHV$)XX=^R!#ue>3H?E2B?SPXi3*Qcazi8sQb_E?8m~R|Ie+F)z zKi5Rq&Y(9F&-1&`k%9S6gl&I3lWyA|*T8K1!#lt6_J_B9|4Q-t&#mpZQM2 zROQcimZvGqx0Op3=9|ki6y`h2WeVdB<@o#=?~~b^ct*caU}dT*>#5b^cr#;rr3cG(F#yUa2tOn_i_b-=VHnxLc+@ z|5zDeU$tK2*;m1bf^I7#Zz0Vlg>mLq&p%e0H&(W4Jm1mSrtqyuzg^*b0Pj%vJ@kva z6z00XI|_5nVzWjm-$^m~5*f714;E0_<~Ct9_} zyd*mcIf}jWT;7QLPk5I&ydPHHjq!71#a`IujlSeR;eCz6yG(iig}l)pQSL)C9i1TV zKjA&V;a#M>UnXz#bL9ONcyD&zDzN(d^b^zz`a$bAZbv%X-`l#(&~xEy$S;p+i@YsJ zXYYqFo#pol_}R6dd(lrN@`@<0C&0^&5yG?Bd)6&K^7+#8V-3yi8;@c>W@YHA<-dpW zj*#*{PI>Kmj3e(Jz8|ojX=H8bm(Zg*1EfCj6A14;K|IGT`r%l2W*HgA_{eZb^P9r_ z@+H4H)MNbJl48&J(OK$8V-089$DzmgRvgCy`Zm-B-_>}~j{VFFW7Z?ApCe2Me*^yg zRO(2_<66*Vf=ZI7~0Xce}E$d0KUHC1K|3>}2LmcFUFOW_-b&bN#FR?CGISPG@ zyDm1x<2`vfeVupX)oFwBE*g*QDy2mZ`UKUU%wiH`8Gq z2kSM*zwg#tC-1s=y^Zz$k$@W>uQ%bdcR%=GeP%U$9pitQH4@rlf%k37>x8r7^^A2B z%>6$?xr{yQ`p8~{nSL$SdALRquY>-X?!5T4KDP_$xTb>jrxjRNX=m(%>tZ6u-lJ+C zI1kRZF*c%1ar=OrR&HbG2(MvT@V4on^o~@#Z1Bl>w{JDl&_B1f#P2h-C!N~$ zWk0xwx{)_q;$=x3Kdx(OPak2POZv05uFbj50@fAYw1eC|)n26S6no!q#j?wr9emq- z8qX0t^~wNnaL_{#B%p;S7EQ&K@!SXr?cb^wW?&sy&z~8Gyxq8CC@;@3#xlSQ z=gEdznQ_m7;lT(W+95JG;=I>EoJniIxiHr6f!@YfuY3-5?D*=HkHBAY);udqvBv4F zA5@N70vqT8pQW3udEN>epv+Z}kA2D~c8wY~(3ZLg7%MX|SFOib5le%dX*qreD>v?K zFr13;!C}DTPDcaI;eDY!zTDCtb14hX_1&qm?4T@DrT+KN2$rR_l?8W6VmLE+h&(nR zZ`?CsxB=mVn-Ffox*Ec6~eps*Wi7d z!+VkP{uF(c>?aj_?Y;)@F%It^EARKndx6M({LcULwsV!k`&Q-s2l8Ghyx;#Cyn8#m zuUFpd$a|6S-u5+kw{v(8Qr^EH@5REq=4w& zdx^vQ73JNBysL%x(67P!euwvS%A0Q~S%2N=F~MJ-<@u&Fb>zbcn|BzPAAH26+*8K*Z0F%0#?#9gjCxJaeV;yu>8o-sE3_Z~ z13peZX|XPgIoGy3;D5y5U~gXQwdp@#`fQ}fJeFq~HX;2y>pLmW<$TY;$j&wM8@(-Y zc_jQY!rX5$>%W*!^Gx1q%ysFrm^Src^W4PPLc%`iCz#{eebA2%NqOWf#(CaZup=w$ zxVT^K5D?xFTaJGQn1j7zVFAreH^Fu zeLe7U4yec*%zB}{=swBi2=6ua%>6sD(+80!?PV70y8`!cv9`{;xvVeldE6F%FGA8^ zMLX?H81jxjeUEcu1Q$Mfn9c6g2hwr0-*TtYgtFI9*> z18=daZfw5(VQH%|^kcCRQNQkc&Kw;!XXfb0*V;Y5&vDLe^d@?|5M^oXA>~_(Ho<*U z%4cjHZNcu38e5+Oc_ANv6V%AN1h$U0V1E;|wc7e6;CZTi4E8g=gSSWYY+xSWva3F!U%@$_7`Eb_jG@UyUcmZ3U~-%zh;t{c-YIrC*x zS2z=7=gX$9aAwHPm*cjDe#*|5mtaoJcY^+%@3Y39SFa zuH$VR_6*&{--1a?z;!omTk7acwrykEGOlv%(DWJF52Yc@-~2G^LeP1>%E$FU`#TEF z>sj_~o$m5h71Gd7+_v=w+g3W;lH^~Y<#yj+F?9o*wP#jL-9T?{yT255bE@2Vx2J+_ zr#;4qu-3&n*vIZF_Rl>*tAFkT+IGZ!K-+en>)YI>s`@pzqgjCMm@*Nt9c%EuKi^9* z^^UjT<85tlKg4UB-PsrMv{ke_=)t^o1bh0+A)aq2LYQ%rz3Ni<8@BHbi(cL{Y1lT{ zrxtrpAx+G#>7uQ%|1o+&|LCsi9>RQ%ZI^rR=|;Cbyeif=_}cgv$Q$FioQ=WyA9!z$ z?-OV`?5Y12>3D9N?bDonM*CvErY#}g7X9AQgnq9}zZU)8AFNzBr+5^6Y5%;hvli`_ za~kqB^$xx*>OEmD@q*=p^6gPR<~%EH7`nWXWzju0tM7-A?tu87ah<6T6UPMPF)SdDnao4R|F4wC{Z1awX&z=@18s(RTo91Q zjm!gn8T!<(l*e=@kH<6*GspN6`zdm0<|_@`FWc*>^6M~G1^jkKMc19C9pE==`FjKg z#&6y7?HdCRN1wM|VeWx%Q20f_n-qQzaIM1ly`%BE*H^LL~Sd%pH;cWBvje&Xg9_yqAreBFQR0Go|#rmp&%@|_iL5uZb6HosX z>(B<~n`2nRHt-!tgY{olLHuU-vF+QOaY9y zZw!pN2Y)-mz;|4PIiSKk!=JA(_v%M044;g@ong{r&6&TQVc;&vx6sBzZzT%%L;O^Q zdA4Gj!rWIcRha(H429|MlqpPqXSTvyAX~Y@4*;I4FwYBAC_EDJ^A+ZKgazCW=#KuF z?v0lP*%rvrf_lnOzpSq6yU9op?I`k8ND^dM& zGrxvDF+WHFjl9t+^XK=GK5F-F7RXvZ#>2YAJA(W8At09&y(!cJkQiT|CNk#u9v!)&vKqt7tD`!F~R%QLDa}iKU=?DS7@g;I&!TYTWd+iM`l&wLHU+BL+Sn?}x6# zVfhW~S^|u~88s~xsWI31$ zSs;(jaq1p{?KpEB+_6O)#(1Y|J9VR;zNp0<=TXXvy4?t#w2h~EKCf2#)Jq}T^7e9G zhV9qrYq9F!0P;Dd;Y;^$lE`1l;+yzLigGx5(5Jb0jNQ!~R^K=SCZL2iM;< zw*D4H{i|7jkk`s~Hf3Y|y#v|a0sS<`=AE+Jy5o17TYpHC2Of>(-~pW+Y=kV3=PTD= zeargmMp?mgBzUs^E@%C1mHPWVWLvKOhV6eFc4=95<@!e(a4rXFV>_TDgpGcHZ`dL7 z82>17Oiu3KVol=|=6v;_?Wg&7X8zkG|EG|DEMZJ;*sl3+&-HgA|JXL<2iWB8;9dfb z<%n&Cp10=u3tc@s>8W2+H;Ahy4ehWNG_|?@{iM+~r~|-r?YSS?`T^wAuu1K2Q?B1& z_d(cCAl(x3VSlp$d^Y6z-v^&~e*?Pnto;EuJpsr2m_gkr!UFIG7h=lU0bX73Ehxd^s{u(4MMe?9PVJs|!g>cG|8 z!d8CM&sA@r&vNy)0D4=P>z@GL=xsr+zn8L7Z}XuCgx^Ov=H&N?)msJd6}kS~HvL=) zzlpFpn+2N2MY;aL`Ow{5(cOWCU*P|>Tx+f?ZMoK5mv|rbbIkYZQI-o;pEysa@75K2 zE1}Pu^t@->p2}69<+*;5m47zmot^7HW92WCFxL(n3ZZY%G|XtG`}Ka zFO6lW*BPkSLao;Yre13j=DanJT-V>-L#Qd8+28f+YeqeZKHZt~KFE57Y%f4I_7%%< z&anY`@t#Hl^Q*w`8GeX%2{{hV#ky_<`XbCLcwYl^>>BzY?UFFRhA)IMq^1=4r@{wm z+uqD0aR07;nHl58{W=%ij-v;@Iy2+Wp+cf{jG=H3B)AtUGz4p{|;yKF+TDKE& zFNa1($qeT~w<8eF&-IfShQA)mLpU$j|HrME zui3j!`G`jvkFt&iJR@YnpE6v4aG8WZW_SX^vn6~8Va@>#&A|PpGTd*P4c!%J{goU4 zzb3)|uSxL#YZCnbngsv9#>~@t;SMJJf2=RmjCvjQ+YkL7n z{i{^Z7qFh87w&(UH$Znw-&lik$I=u0z*6-Chp6s{E;x8M2S@_FD|JWOUJ@A)-zjW|O(=j>?Hs_q%t_SZLwi2j*FTbt_K}tAAI{A6 z5B1LV8+)K{%76~ibB%8cKiN-$E%y2#v#J;RhMwpfLI{WYW>ob=-!K4uLq~)MeA2&a z0Q!bY&^O>W{%X!T@8YUU&^KhGZ|H#V5v>1a!?rJmZDX!n^JlC9Ukuys58KB6Y0Yyh zF0Sf70OvX`*S_f8i>odgjJfhq?Tb2QS7qg3J~Uk0MoxCsg(J~6uERb`(!4iEV!eR& zH4Eir-#3NlCHF`>_{S~idz`tlnGa3XcF>e0Hqw;iXMonshfXH>4G5cd;NbIsH|=05 z+5zGZoWS2Pq&*_%uN#g)x9%JmJU;zU?Y%Jx^Q;_yJ7kI5JLs;Wef2=y0{2P+?ow+5 z%E#FI{$Sa}|YzFBYm~STd?rWJowm-*Ti+q+_``L%ID2K7jETjkisYE==7`I38 zt|f2U_w|cX-$nQqi9+Bo_@Hm9C=#;tfB*vo?kmH!FtsW@(g7FY@ zVrNgirWE@T&N^4kDC|kNgm*~z7KFKW7y}J|bK2Ac=F3nbe$i78$ZN+=mWg_rN*T90daBj(*5>%5h}#7D0h_WpxHtGdPZ&Dd09|az z@zbpi*Go7J;X^6FgQjs4%DNt9-Ku4s@C9W}v0o-)(I?Yqm=c7 zsm=3FmX-c5_qM}GYu3xwLC$qK{@;-9Ci{Mw>ZBdZU9CF7el~yO+}OaX9KXA@ot2

Wb_jZFxH=3q6-yiCe$eKKcVs3u`uNZu?#zia18Dddej2Wt6vN6off z*4;_$vl=^IioBQR_`k8TESB)E5$1i-*do;7Vv)o6f-Tn*BwyH=JsZXKl=?+EerL_s z72B;ZVYWndEMNQ;&oOeh;pG^2Yz^MxRfIBGM@j~+ks7aFpI9=ms z0nSjk3UCjFp9kDq;WsYC`3Q4Hqb70~F!tXJpQJ3rE8GQexVyynV?57H$Qz)=sB_zA za*XD0Lh(#NeF|--#2XiYci#ZLE&yLh`VK-rJOFRbEvE^7XaGK+^yz}XJOJ;$0op$R zKZNu>guYJzejxF^1>Y?Ip9MVk*jWC~0eJTf(DniN3`1XR=#vBRX~d&_k^iZiPuG8{ zp%?t|0Q{G}0a|ee&U&7Uvz}dWj^_-qLGHa{>@jx1y?6Quv`6%(yfbfLobTapsTg<) z_SNI|h5h_YO@qBjJu_Dm8JcC!_tZqV|2$CB@NWMggE6jcD(F*fzyaI)}hmStf$jSYGj1}zL-E-61acxr+_ki4r9oS9>{93&h!%Is4TnLGe;k8-vwn~X8)w^J8#f+(R-;{{vWbj11XQ3Jsr*R z$LGD+zenG3fc+E7M*dIM!*5_4#9d>)dBS{nHamV#S^3^fzN48=&Q=em?$w8@1)Vw1 zGlBRC-lYjRb5B|MlyiTsgz|BZb%J+=t#j_LB77;rroOQU&G*`FhkWuboz!oXaukwY z@Bbn%>-)K94XnQSHTRT_?80Lvcr+GJR-E+;^Zh6}gBw_9c;hh(UG>J zcE-DWt+VOKNBXLX-X~KalRabR*ivuio6mgp?KrJtkzt(K%L|kNzc1B7hUZ(_&4nt% z2+A;sx|!(hgbX3;BRDc-#P!d+z2m&ML2KHa*>4`_y@~MNJkgDuD=zZ-Q0@_~zGOf6 zE6G~lQr0HS9ckn2d*zHY?tMd6tkt~0y5jvxw;t^qr0@Y+yc+@Es&Z7qJ3CV4{;K4g3@yk!^0U8@Sb zVF_P_d)Noy$6_6>#l3$szI43ET}!Ae?RJs7=2AIo0QR-JU>?{__5h}FeFM6XdXVzF z@XH(nkS}fIVd$X6U5Bkn=>N~ayL3s?@6(43Yn`yJ>=?kh!Wh8%p&qW>!!fOgH;P}> zRW0g9^e=a9IFGk?8u*sn8q_1-##o?lWAOKE@vZ7BT!j!ZD0d9LxE84(F(h4e0aNfWE~W9SpNR zA;0@@K(@s zsERsV4IQ>=g>x3|U;icb%J2b{A=0r;BYDIC?}u&0P!}rc%KiF4>j&h-!7Qbtr z7uv~m4ZuaVgpTGXiQSs;hb@0+oV>eg*$h58sb%^uNiBYtoaxVU(?5`qe#zmSA|B80+{QiaW z7N@EA>)@xF_9AWORx2;s#VjLl)Gx!g<=dRi{h#rFH(w(CAnz1`m*LBMM9_i2t}i^G z*5E+AGI4S@&878LiJtJ#yX4oZ~_{I0i3v z@z53VJj=y?hxmmq9{n)!Z1eWFappVt2G|MlorqVTc&>{_T@&Aqc);X8I{K#wBW%cH8$=kS}f__x) zfz=~TuL#y+@Qv`jMesE+<`e8w4b0y` z4EhuUa~_ka@NvNKVN84%O^~>) zdt7yNid< zMZBD86#QRYJp3!-ORL+=(OJw1rH;zvAL?Z-RK!7UTh$b%4X0wx-Kxsi@M~Carwu+uHW8oae(uFYE;*7bOk zM%UvFtn2Xx*7bM;>w3I_u^u0{VXVi;Z5ZqEaT_-4@oI-=Jzn7@?61@g@42+uCWivH zHkr(LwaJ~*znOg3u-|L8$!U(xjBgD+eUEjnHdzvYzlC`CM68nuE?)abW7BGrqXY29 zrqw1#1mKNLb36q9VF7q!(`u80T)eg!W7Awy1bub@-q^I-WTuPP{@K{H+GLLays>Gu z$#fU5ZO+)V+GK|SJZ*Xf+6U!Jaq-$FY11pvzKCxsa@)MLNwH~xn{7HD>jHXb+VO8q z-@WbnWH%`xHwE z|K99FoOqDwqW+bLYvBu5w0uv(*dOyBp?xvm&bIA}zmH?v6@O31jt!?SZ5|tj4{RPA z?f`7Z2L7gu9UJaLyd4|(dpB8{7xyIW*l-GI?AY)g(%7+K@MUHn!pNBed4?%1f7d3D zI_e(ZKiIt+>((QvKY5qiu9eegTLU}dyyoGK)`x}viukRdk#-~V-o;q&5ucUw*+TCp z(0@<6zHiz`k@qvM37PqBk(rxafHdr{&&QW@wQn$tw$Kw_j^(`n_9W-%>JOerJlev! z_;S6Obt!%=-mqYt^`&8Z1!%dw*qkNYsDZgeQ7`VHkP6iEliwVUibhdXv>lSom#k!*sk4hcMRb zUvcU3gsxKn-H^7_fzn}L<2MeS@$b!ix0`pDnb#JX0!{_ZZW7LoPRMlI5 ziM}z;(HNWMUYqru_#U@yACCgI?L+V3oAkV+Y1_veNMqXv-{!XMgKtLL_Q7?bA=)Om z*Jj%X_v6q$3{TysGcezA&bRFkd`2tGJ-z~k`Ih$th543up~83@pL>yp&+~)LUZjDs z=FYuH1LNIIzTa*9_BYVJXK4K6Xvbv=-vj@1w!(OWl<#*NTJ{HXm6rFUD>ObCY36JE z6vQu3xEJ7sng;tJ<{k$7Q|vGB{ca<};dbWzZUesvc$uchehJ_2HuE|C&n122-h3U7SP?-Mw zNrmadHz~~DpA4%F555ZHQnk?SJ%4maLg z2b`~IHX_Yvh5Mgj?{HT}?gKnQ>i>;l zuz!X9p|F32M}8Cbuke$AS1Q~K>2c1-*x1uUVE+pHfY&M92Yl8mJQDF66ix!XN#TvK zhgyY;0dG}!C+%P1F|e`i3Rk7U{uQoAo$gYYcii7mcslxx-3nu`ykU>R*e7q;r|_#+ z!u}N=gS;Af&Pmq7S7L3e9%mr!J0g{nFrMo;B5zkt_I_#Bzhpg%e)uI3onOIc_zBb7 z@pKRPV2u13dE$&B$0&v$HuT~@?8LoIu6OdxBIm1I)9MZ$^^G}xSA6M1p2u)C#(#Y2 zzjR`L827jaeH-F7C&+gf_#2+vFn@yIK|i$(dCZRbDas>E9`v8VV*=u02|T7yM)d)H z#Ix&^5oh*JOcXxH@ue(BQ@{tl1^EmIpPsr0Yjri6WyhI6`xe&K%-^2d#CbjH4?a() z2AoGE{2uuk-=x?Z;HI6*xnOtiE#m2?AisXh&&s_CanS8RBRB7M^FDre?{%h!f5PGhn$IoQK6dc*ldzPC;vVUw0~1Nj&~rr1kmzP6mor?cTBcg|Z|KHJDA z9enUxb*i^j%5Nq4!Iz<2)G2=7>jmT2?GU+=sJC5&K*i#wPLeDc;9y1>s>uqIR0{wKR2mLgBNq;NDpr6XL zpf3TvDgPeIHo^Nf;uGb1j%h954kA|p`GD^je93n-!{B=z(}M3vN3JIsmq4G#^q|kd zm-NFJ2K`W`1^r+v*FKT!5yU6THJ@oM-xQInKly-f7QW=$k74l5WLog;?Z`!)Cen9f zdeCR!OZqMhgFc;UL7%2_v5sdMzm|8~$9s1X=3DQG_e?zRu#fkSn|Q#8-%Wqk++`o{ z{nhxkc#j?NNvVwIZ`Y0YJ~#3Ft-JAFCgOQllJVyg-r5RwJ%;PpVzb7cCV0akn{5|- zH-5F%3C_RLh8k{^GJS+E%k%-mDAQhiS*G{#j)Sp*{i5puE%=RT=7+Pdzzb=t5McU%;%$9diu&fFeAoi*URG5fs* z4zH$K))(H&*M67#iVcV}<-mIaf$?}FATXZw8o;NaHrMa_&6f7C1@dl=-)k)JuF-L^ zg>B&cE_E}7x`4fx;7i*mW*D|nh%aqp0?K3FYOrO-8RQtw7(dH04yrP=d)g~{e{&0qv>8@0|D@X@Emnq$)N_R2n*haQN zrjV6$A>^#c@$aXcI9p6P&$n_qZG`P?qf0km=75A`?O)x!+vp)|+8lzJ!=J^V%UGkQ28dbj{( z=xOU5a@e**ep5jk?_Z~hEU&68TUC}VDod@(vdNYSdW`cz9epQ}7xeLKMfoJ*?4=bNfS^w{4?iRb=wQdnvXJjX+*`IsWs^D_`;|aLao_bow;tW9rMW zE%deeWglnDJ4|F4&OA}xJbYQ+9EMTeVfeDVL!7cS^KtrwA;M>%@)@9fvXxJN<%2u_ zW=u1-dQ#-1PXDc(gM@zu`9aPu_)^Yvh9PHXd?{zge<$Za;nPO>q$r@9p=R6gsK&-2P>o${%6CljMhbUy3jFxrAZpb1}Zu=c0cnXNK@upnM)uKJ%5&1Ip(dU+d{7qeT zJf~le_nY1zjcrHi!oQ6CAm>bcDd!A^A?F=T3puBQf4$BNUS?bZ{Zyt0{SNHW` zDNGN2C*w={FvFlvVp`DStbou%zA=nTsIL>_g#I|bq(8vFYuX+4k^Z1+Q@mI}*zlUdRmH9x<%*1?P9|LSY)ySth z*Y6&X&nueG?=_#zn$PbvpZ~S_nDvISUi$zZ>y^jz%441Kcusk&p*~0tIZrVzL7yv` z9`&&TU+Qxi!_eoGObdN3u`+01cL?z~)AxcYKkcYuthb+OE#D2`RWZ(clzh^1`~~=u z??ViO?|h~O-wMj5cK8nC66o(?deE2SOZqtsgMK#Cg1(IOnNrW&7?(hQ2h)ST6kpO$ zXBhO;m=^R?Ej{$IfpH1+#Y_+SLVQU-kzvqJU|P@@kY4L$731t0hU)q$#Kp9~sNY06 z$9vCW-G*>%mCR*Vb3JG!>|<4~e+GPusM>05Wv<_f^W_AYuA~f*=?Z))(`5`prc3dq zOcz5Y){FgPp0A`d^JTxa8R0~}-%!3im2Y?D+g16Vt9tb}qYn5| zw)PA|wp6BtZ07gyv>&EU6X}zf9`sFPh5i)2q(6x-=}+(-4Apmj0R2&>2mKMHKdkhP zO26OIqrQg((AO*d9;JUz>31vrJEYfsEh~V2r_%3G`Ztt*yV7s7^vFLWfPRb8*DC$X zO20|zH-O%>xqWQQ6TG(Ik=PECUA`Nn9afW1YL34~`L0sFPb=RQluO&;amFRs+)}0o z{StgxuZtN*y*$pesFy0zYdidqaS8Mbm>%>G;Y<4Y41@jwrUm_dmL7U}i*X6`m;TfE|Yfn2ZUow(GHj44JMBBwjD0b z^?P!hPmpOmWq?d$@uf^RFbtW#gD+*e7Bbm3$S>RB-ZPr{vK?Zr=`_Ak<@-(Ld$sbt zO8H))eCxFxQm1j*QluSblLqaeKfaVLi($ytk7*%WAL>inA$6Ka--GEv-wj{VXD|%< zE=&vh&W^sPGtTNp^Y6g)pl^>a=~Ed7eH*3)eX^xTeNSXu0)10~(4WGW^d}hxy^k;H zkMm6mZHFTR=#MDz6?jKxuB@?{x33m(y{=8;g?bK{ z^!0P$FEVX8=*x5cf8uR{*lfTRz|F>cLdu8q=G+eW9p?F6)GyQU_kh^;Vr8J2pX+~E z02|l!Hq*W!(-EwT@GYs>j9kAAV-LUekmUuy<~Jb`eg|~cPivr@$)Te;j+{wYFHEK^ zrQlPV>)+fO>k8IxwnzQ?vRr>Acu=o1@TFc$wVq6$xfL=ZpO=B_sr`e^=f1Fq~O|>r|e6 zm1l%25A22Ve2Zxyd#U0JT*PSdy5^k-;&-F(m52NE{&~YAgoR{l=dIR!V74<*C*W48uk?YUkT@uzsTGT&8JoYUQ;>$99 zgudAPCKd9(3i-!$y-t2dZnDSq*!smN$1usC>#=1eo(IeI%R>rxA8kL*MF7Y*-?M1%2o^6VoN3M?=d4v>D)=fj5ru`#`aDz`cP>&-Di=AJUt?qKEVqG4RR* z&eX{Q`2RPE9v;vy@AZ(!$zN!i4pIMJ;-H%!=E`|$lf^D6jO7@cpo_kxkBxr9N7^A};9t4U7RTm?V9 z<)oy@C>7KUC2z6p<)N#j2=`IaAH}J{q--UAlYjiGk zd(Ky(KT_J^7IfC?2c5WALo4RcIeRp;_AAL7-G9#p-31Wb!3R5y&S&cor|&wbp>>$k z>kn#Jg`R`?FCW>^N?jR!AvCgR^nK7hoX!)rPYG>}GhU_PtlXC*2mO>sbT-g&Jy`Yu z*h_=`i?Y)n1RajrWPjO*2-o?>+T_vWG#98%9>$ce!S7_J3?4MID)}v@bTxE_Tsqq7 z8|8m3`iYVYopHP;`YA<6-|IK%E!HM?fGNG(6d&Pkk)8f(rH2_z`A5IY-S0B@yHs}M z^LqCy9;EB5zD9BF%ACh!6S=$6{lvKH6_#{=h$+99$xeH|RCe-rvFts{@)u!7eMyDg zJpX9U;rV&w3hDcH<4zIYkSj$8Dc1dD>RENqJ)N!aV>I^^73yzYs{T42+*W@FLQ{X{ ze+qPzn+u_%+*}JC<>ndaC^ub4waLvC=;0pE9Ow~FUjRMI>C2%xQ59CPaJ#=}BOIo!aW;9O^TzUwc!G7x`XU*B9Lp^ndU#`Q90G z8D}bb%Z_~aG<#LDlkC*{jPz5r4=~ifZic>Wwdm;#yTw>(D6=7hmwB7{0v2> zlYYZ!=^)Z?7<~z0kvpRY?Gbfq>vM-eBX{O5y>#TxXz80GcSa*4u2YMD;z#a+|ANkW zeNMXT$ep=M9~8Nh9L2k7zS@K=P-d+fM<}aRDIN2@^d7t1$Cl-nQ%0IgEW^}UYW2ry z{qv)Hwbwr%OuQzK^r6zJ{)jb)aCRuzwI16hgS)^_RdT7)K>jYaG>|)FsAGzU?+b^A z^JQAUsy1;#vR3~69C!G~uS#Cg8i%!+pi@0pVUWc+n9>KIEjzM!hV1BI&5|8iJPp(I z-{^1T?_{|XZif6}KS_3Et`<{ctnMHA6K`q9zHXXuWV8}99nU1W6VGv&if5wiq(8yz zoJE(N^v7W;+}AZeYOElC*Wz}5QT~=If2JcoHTe;3u}$y0COJfLk=DVOO6wrmN$ZQU zlh*@eC$0T4(>(4Ycf##0e}vmhcG}+_W}lkuE<1S}h?x$ztK12CJbZT|2_^ug8M2cdt-IAHW8srIOI zC9yrKZ6XKeN9RFedq0e@vAxfMj_v&}Xxe)`qkN#r>40Q^=7827tUslF*3~4BDo>ID z_4$mGd#TM(2AVG@KX%qW&e=N2UrlnK$^-LWh3!(7zenYPUzhp@ZRy(^3fl$G3W zm4E7Fm4&ZPR>-96Z#FyQjd0rLGR$^oaZB6o1+lW@ynvMjI{tn>tUf3G{ZcO@>Gj9* zlAd@hFX@BF@{+E1EHCMg$No|JWl`npNDL;O{L>O;t6RjPFvo#uv zx!V#y=g0L$%1m{4FMjUfT=MymC-q;r--SDGa};z}`1)w|MvY z7~+oYz~kP;I>fmdace#H?2NdN_qf%!iwCV8zK-5I=NoF71hZK z;@Cffw`I7m%i!(bYon?EsZ!mCP|Dfll7@#kYcz;{{BfN*QoE!r8twhK(dvI`ud#hB zfDg&Bt#?cw?U}*vZt#1x_ZjK(?Oep~%bustEZ;iGLr3oG zmWv#?_&SjMxWf<{wjm;=6327Zq4;Q`-11D_*&M8LPn!0mp|Q33zw*S0RB zlN6qRV5R>L@HkfKe@^xI$#ErD9*{9seTe%$8ROst;)`SS(a`!wRot&+#Jzzy`ewxa z8ty$Z;^wS&A#UBbr*$dC{cuLy&l1Nr8F4?3`zIN5i{kOy-rgqe+cV<6mpIR4->m+Z z_M-nctqoQ4=>lKh+Ar|6wug-s#@Bn$q|vIi+g1D7cp@IF zi+DVqbc@@p-N);5iDSSY^nOLMIC>|>3eQtBew2p~yO&(4{PiV&aSYI&h5XM*`zN3B z|EBv_dC1SNGyJS~Kiad1ab}iB`o0Y6WIba>Gkw={%puS}vAf(>mL$Ja*cgxQVQYc+ zR`}8W(=xwTEaH+C#i9AsU+}ZEU)I=mII>dWveI@Bjm`CT*gMSi2JPK84$a|wd>n^H z;?6kKqBW6oc5EAmvga#Hj;^IHmU`Lp z7W+!xWVLdpzE*N3&gk3a-aU-p)XPfF(3$&sx$hL{_vC-4;DVu})Pl zac-fyj&qA?@DS$~dLul}EpEqsjMwR*++9@R^fc(PPM-xm-suMDiB7L2>?F_EAb6;B zclKZWo`(9|ez@1VpW~osxSzhnGt=EK$9DxEpwlg{0vilyxvu=cv5XF>;;Vy&Af3n^GLM| zonc$^u;ER51l;T@dmLG|^3_ZdTvM(;nA1FI~4VN9h_A|UP874b?4K;gJGDLRx z+Eb?Z8o>Uu^L3s08Xx#N6TCT=m-BUQ^ftKDUgMy(-y^DLy}zsW|$T<*#u*zau^;20o7> z-1$+D$NBua_?*wUxd1<$Ll5tePe~5LZ=7Sa)F}@=L;tUGR$h99y!=^dQpSJ6Tvj(Z zd0BSK_>X3v^o&FKAjJuTO8--KGcVMcFZ<8H9Z;>57SIQ2b zKQnt(a+B=vd8176*^TpOPXs=D!Dn-&mrEzoC%$XskNB>}RD4&;PJBNydsR{|JMsNc zrsC_w`ST}2eCkiKKJ_uSk3*mH*MFf~ILy;5RsLxIikr00QJllk|BrE(vj0rn;eSW{ z*9pm+i%YKDvL@HiUXP^ho?hmU@0NVh)z&)b!<*tgX1_k0c;HoY-FT1L&q?RO)IDb3 zR9#W#%0uxzW?jUG@(WLooF#vpamB6OJ!Yx-q4CkuZ7V*m$>2j}n&#v1&)}o=@isn| zJ0E|=tsNf~9ohfx!Txto^eZ}Qei+Juc5F0n6#4wHDR)lT4>Nb>B)(43l*{91nEUT~ zK%7f7X>Hx-5>2*mJ<7*Q<|jUvXtHrL&LyTXSFG@OwC6q6Y0VABd)NcHN9|e+M7M%c*UHMG4(8!%>e3H^F;d5aavod>&HFUnjeO6oRxfU zt9iK35!Vlvd{ia-sy?FL;t0hzJvo@TY^>8biv5d>Onp%HF=hGR%9K3OZ&p1X@;Fod#*n~67kFrn>&T-554|i+_RSf4 zx7Ax&z}YR z+%xhf?_g<6Ur9U7MSe)v(xlH)nu~}-`?!}VEz(>l)BBn|9uIl5|IrE$M;nv>^W6XZ z=$|&Vv-?+F4-%jB2jcTF{G3=+Cu`x;>cs9ZnVvjj|FYq}lHch4F3P=mQc2*I{!M2p zPE=a-%{4Nqhv_oCAIm=$c-@9{m45n5zx7co{pf!1MY%uvL$$rh>`6~T|D@wq|MOa7 zUvK49oBWaZ)xX3$wp-|r?EY}gy<8Vs|ETJxekZ^5kLqvqKcX^?<68W8>;#XBLw&3M z+5Qe+`ZpHe`nTFVzwKYX{eMa4wbHrb-=ssJqP-3r*DS7*Xf6#?{~TtdbQKtcS3J%N6EvxL&rh$e`+*+^(y{P_5ZGW zV{fEyRv+*-Yd6cduO;f1yfPN~^*5h1&yt@FT6dZ+TKzNY|5^{Ce^&c$(i~^0FzjG2 z%kOgR_TO?s@)+?&`B(q@Xa2J!=h6+=ykK<^&RysMzct|Z7U73P{LX;iS%jY)@w)@Q zq6q&{#P1FG(jt6y#P1LIk|O-?5nmnf#YK4E(!l>R{v(yYg+=(05$B&$_<|ywvy+y8 zmF-37vZu@LVJ|yjInD#8v45nnCB%`&20G6QH#*-w+%YNao}zH)rm%HI>D`jT{#k_m zF@-%{6z6uS{JmF%9psq(8^G(>C`&$GA5>IUyuA?0ivC>xU-hi%Hpg|yy5RQwk;vm> z=Kq-bcX?L!h0Omkf64ps8V_|p#R$$nEaRVE>(q~!-|5L3`6cW_X0J+C%TCw_Fjwep zc~5uRqiPSkCA;ek1@i*wPj!aZ!oQ=notmVF^0Pp=bm*of-DJN4duf;(d_ug zh|lTCqhJrl|3EK`CZ%a*5yt(eWv^3Ngm>5OBh0`;T^`Rok+Pt?>yeR|FWaXYqA~)j|5~}}?zAb%rB-gDC+pn%mFs88A9m8*kGS;C;4q~-oBw~z9;B=P!hBFFTPbSl>JP_5$AtZ;-My)Bfe{e z>t3*$g6=Duf@IflJRsb4BG-Wm=s6SA>rV_?{WK_Nl@e)byl(29EBR zuLVs{dS&2y2_GNg@0x+@jgPPvGCk=CUZ{sjgrVHKsoX0?tE|!gJEG*u2Hv9AT{_y! zwzct2C075(s{T89{db{HO38J&FFf>PVGfC|=9{Ush zmia+rO1GeKsB{aIK6Bug&m>*sF0Q4%0FSYp^{=hIQ)%kITKhIe=wVSz{xS`B`}?cizTe zrt`G)bMiF8!yPEo^K{dHlc%42exANll&8~3^Rx1_gY&jMW;#!&e@>qM_0>?npUCt) z&Hiul)HLXGWp8v*o(}q)JiX|=t;0;`DcyHu$=(wl?y*#!zVzSZspsyWo2TuH^0b9C zKdYW@blz^jOy{ZObL#0z5BDRPUQZqWn>dQ97&D!xt3M}C`*^s$WqO{j`)~5} z$Is8x%%VJ$>e!0&?vT>;KJb_#wzQ>XI($gi!(rue-ggWv1n zcXS577Z>q++y4*zez&N6XJ+s_2R|2N@H@ST-yh`uzc1foiufI!!S50HnV-S$0Y&^? z`tR_YIv3$uuVfB zDCk%<4%M2Y{^5{i&8OpAt2-*+{KrLonjK{Cqj|Q@2=IQV?EQoX`?lC^jgJ3@_y4AU z@~~IJKU8Y(gg1Q-*T3cTl0 z-$H9d=wn`~b@Nl>e<0^85|!E!I!iKSyoyE7?ik z{-5h=lV4!h8ovIW?LV44Er*|*$bSPo27Xfi7Hibcg|}L*AJaP>@L;sgo2L4-9WGYg z1YMJ79)d2_nPJ{l>|F95WjQ&l#e_G?Ceoj&%ypm1z4B}I&HfMmJFv&~bKEQ+{glV* zWS+`4-leVlAQNZeHqhPFuiKd%@-00trPV?n_4aDqGdtbyPKf_v*Tytd9+X23@x^|% z1sSw`i9R7ND?|KD!OsoePrIM@EM5FR?t8IYNMHHT`i1z2yjXm=z05v`^cwe$>pGOb z{0|}zyzl#7N7}RMbvqB6E;rF(ZzT0DY)WPnZds~*%_5H)3yr5bcp|UH59zm3KH5us z)9+tVypoAY3PZg%Q_lJ){fp$D^-{@=__lnI$9Kqw%5C%fl)MzZg=KQG9^EG5Gdd4V zJVy8J8THfabIXt=_%!!JaUbBc_GPI9-0O4fL%6PbeU3Bm(t|Por{RCB(`P{sasTL+ z`5th6j`Q%YPsUp$&?DUcefS^c^jhfA9+tE5u206>@(0B|;Kp3%Ug)dsEZw!nTz}D~ z&t9LSf79M++ylN5d0tMRbrbu(TH||?qA z3-e3zKP1HeHR1GiM++ZTmOskvN6J3DEdN!rpO73b`-rl9nd4uPeND$8l$UX+v z58At5=xf<0QeUg~BzaZaIQdA|#iC!AJgZOmq^wAHp-%l}IJ;spE7=LM&v|&>WmR0X zPmKXTP=4tz?TyTM?+x;yHyowkU2o;FTe8LbAoVx#o$z-1t+=0pU$t}V*RelAnS?b{ z)}4^IGd-?!zoz|GfCD?W@=(*=sGdN$G10Z!3?ojPi(YT563{Wu~&y_^=OtZJxjwBmV!ze@j@~4`&PC zDx)utXJxG|)g+tbhc;nz31s6v+0_ozMv=ci6DIy&#B@0y+f(gA_#ZOx1Hku!7tKRf z)0VBTrah^i;^!2|%KfJxip*P;uziNK+Hudu+ZBXmT$YR4& z^ntS|`(YhQ^80iw$v=txXv%z_&b-UswIpB0_|ZZCZ}cbHV^q8QfHcHgeDgA_k%lq2 zt*+bje>vlZ{D!l5(g}Hxey)VIMCKgzwl<3V8tvzG}o_Wv{aVmgQs@&JbL+z!_xNedbzppBTs2x_T^tWj zf)4GiF?TI=Xm5?VhoIv)*`ZHtZ;iQf=+NF8a~D7l^ElhiYcY;-Mk|hi6AI_G8go}c zhcU1*w-$PghwaYzT;X&%^jN2lgC6hnh0qh7eh7M!)17yTI@OK2?;@OjLijH-@Y2+t>unkM$Lh!QA4T|^GVu3> ztDgk_Ne2FwaP^(wS7zX^3%9;>dU9C?{)%w#M}LrkzaX5xPVt|cfj=dj`G@fT$-vhL zXFekQTN(KM!Zk+$|7He$w{Yew!l!58cD}wM;FB}(l z;9t(b7YUyf@Pjh&I^mT8-!}uFFT5(?dt~5qh1Ujr*9?3Xxb6m3`Si@dX9#BxS@;ea zc$I}e-tcWR@JSXv;GcYD>-I6;!dF`O4>Iry3m@>mXW*kPJab9-`)dY1!ommqPZ{_y z3(p*r@W0Q%2V3}nKb?X1v+yTa_=hv_9u_{}zsbP6Sa|h6wEqme6kPpI7&~jwovTEr z?|9CvZx?j>Ds)#$j(yKSSyNt~w2UYIQOu0}pkYo(~ZpUb^Pop*G z;D3g3j{j)hqYm>A?#BslQ=9ub=uo%yxn8{e8tS$_cN}z_?>9ilx?Kw$>$dx#IRB{6 zO@j{ekNVuTgBVBk4;=n^dKT6Bjzx98`LOnNUa2x-ZYcTCx=5)1FvtG~e%p_u1CsIb zZ*ozcyqSSl2)A*TF+2lTKM`f((6K4CQ~-fRwqwp;3iWx&Q>SC%fL;h zY@Dr5ew~4vOxZYFo%}olmrU8b1paQxz_*sEaojuLGPU*Gza9v`)SU~={f$n| z{jWSdw8J>}znnBbZ|*-FKdQ(5Wcu9yhm!w)f9_vj!XEQy@%8N@zGnU#e06rdI;HqJ z^*`l{ed5pJ>!>2W%Kr_%UjK3^uk|v$ybk|Q`C_m4v-sM*h_8PC244?2U-zf@+Vwx> zi~ZWq;_H*s$TRIZ%GV~+`aJns;(T3|;_E~5^B>6sw2uX){)B7==A*HK-TW!{9r=356$XGYkIMcu7#$KVqNT}^0d5!y4Xc_jf1{E z*9rbtt`DR{+@wbS$bXkH3Q$eEK~a{|IJ)0 zmfu~e^4pv$zj5627-jqt=qTf_LdW@4_rf_h?pTFp?rimNGIX3@EerR?#d`P+>sIMG z^{-@4&8crD@9BEbK3tqr->x+;E8{S~`f)}%Rmi`W^N%v{^!(}43_Lx5`hEs(ZO-RU z-_5|S&H4Q4%nUp|e>yz_PtTvek%3E2;{54^418-jNzI>9YyVrdIoeI3%~9`LwK=V+ zN15r)eFXH2u};UTUaZVR+p3UVvg~c^0QgMTX&=>*_j8BHFa4a(J2%rl_sqzXwGEB2 z;Qcf3t@E7P8~DHE`84tw^L$nNJa1o=XIqa=<@xRzxJZ6evHzpNuZLv#x9=`IJ0(+deeKM+^BczO(L6 zhpNBlycwp_)tSV46N0Ybuhh5gBb<`eoWjQ@F=G+#@pmf8&r-vh?9n z{Xl8kzLE8PN9_~VBQD>^cO=aVz|uyXQpuFk-%oV=W;WZ+g#Ud|ITaFbIn=OZ%kbU7WCfp1+-X?>fv zb->u?P)^~#1m=rI)8DvkHs$DV3T5*IWfo;~-2OK2v@*U6n*X@|w0T>fbQ$dpZ_G1( z5%#zSB$HC|)vXBo8kp++d&&=TZu?xwzQRh^De5t7pYuBq@GDum5qYtGhw{9IyC(F1 zCf$#V{a!NdCy(^F_4>+32L3b9eRe->!4>kExm?WPD`(0w$svUnCrCk8s<4Iy@vVG zKlB2prPomB^k(8;=(Kbk7C9{)hs92pqn~w!(`P_0ar%1b>zrN>z0~PFM>e!9clu=L z6;3xm-|F-O(04k$0s3yIJ0IN8a<9|lpznA30_fFFKLEYP>Gz-?b9&EF4J}VOeKPcO zPTvgug464uUvxST{fg7*O|-n`GbU| z&>uV9_t1uxEl!t1mv#s;c>#1Mr&mFDae5teH>W#)3Hf(=By=CAPlE2}^o7s^oW31; zu+y#3L!2%jjr==(J@jy=H$snay6=~ff2XUVM>~BU^cbg?L035a5cF85H$abfy8B_s zzta<-Cpj%$m`bNF$GytwC!lMc?(h}l-|3OiGo6<1%q*v+BQx7+>B!7=dK&)cMgP$A zon8gK!0DHu>zqb+re&ei=+v|ey4ASUhVX&&}*FT&KcduoIVu#DW|KU zpL6;==og$`2K}Pbk3hfT^akkHobJV2ZLd2$4*CtJ&w_r->ARrcae5>4`%VukMgEmKMTr#C>?I^C-i^6&I%&@-cd z=vhv8&msTOPmX`49m7A<1JK;#Li|m+yYw&BJ<$9U=$=t?=bu3Lj2g{9f$kYKTK@su zGio&d2fB|E`rTZ|&bV`jo#+Fhxo^+tljY96d~&~8?oMx%JNF&Reb4Q2ce)xHeKd1l zCU>Vd$elZ`#54MI(nkwnyWq}UTZ(56H2P>p-zRtUo#ozP2i%=L4jO$lbH7&ZMl%Q0 zJ?g&Se~;XqenkG6J1d?Ia@Rac|C=?*9tSgz^Lc#KKfA3X^FR9ss!4Xuz;6<6|3EcK zPw=+6<8I0I!tDR2Ch3|Adld6){o`IG+~#uZ;b-8N3%CDF^j1c;@fO2hDBRYG(BaL% z&l9dSVe+;yg~z;|C0u*z;2TnSjQ*;0k6)$Hwd2<@F^)g#{a7D*#V!B!ejjFgwGB55gGV1!siA2unhbW z;qwDNG6R1=_=14%mx13Sye{B-X5hCAUl{QIDLm%yX5oth-YWyYUijjGcg?`B5`IO% zJ7(aQ3ttlO%?Gu$|5$z(3coJkn^Jh>?>ym41HLf>KTG)XfN#ja&k(*M;IF3enEuJa zZw>gm47^(SodJI)1D_)N?tnj%flm;AZ@?eOz>g4qf57j_zz-9?I^efw;3I{v3HZ$! z_>eL<9}87I{}}N!ejjF zgufr~BQo%3gntz9!@$#H>!ZRx4%oq|urcl53f~g&{Zn{M`K8~2mIL#{CMFb0{&$Z^CB<{P+|e^Z#ezvjct%c)IPrC~R)P#ui~s!sZ36EF<2>h0hQ8 zAsP6C!WRVmfD|6f^;g2{0={<&k9;=@Ul{O#DLm$TrSL@o-#G)nLHOc;@0fvKBm9bh z=fKnD(jaU}z&aFRmkPTsVE_DLTYnJw{=V>~0slt|kNN(t@Z|x2Glj?SX9`~t@V{i> zrwhL|;4g!x`JN%{&Vap;5w=SB-2s0p1D_=P-hi*kz{d-}Kj8PL@R+v>;j06FcLqLM z_?m#`GeHwt?zVAUC6Hwb?x;8Tjia*r!x zd%%v#2>S=&9|io#4E$N)9|!y^8Tg~Zw*>s)4E(pkOAoj4eg6#nm%=**e6JK9W$F&$ zT>`#a3Xd}LGvVC=-aCcI@IMvaBj8_1;W7Nx!ute#yA&S7|4?|pfdA{jt=s!W!UqKW zL-4drED$z0VDF^Dp6Y$~JmEtE{zeMVbqMPcvxN@}_-iRV@;+1e@PNOVf!7Kj5%A|S z@JivM0{$3yn)hRcjSkp@sj#tJjuJj5;J?bi%Y;`1yfKAe?0G*#_}GB2OyM#91B8zc z_zfvM=6!GB69axt3P083A1HiM!0W-&dFv~zGGLda!p5|_3$F_J1t~nH-C1~Tz|YCR zI|!c<@HrWHUVE7{1AbZxkLkZBd{)3u%E0YSme~QHmcnD+*Aw3EHDyPax2Jubg%5a_4EzcU&ly2@D^1}s{zVo(;2$5* z))z#)&cbs>knr!P@ReGVr+;o-=}ke?0@AW#I$ALxZ zbAFKUH)Y`3hqv?1;6F*>k+(f8yv{qJnEtL7KH!(7@EE?Qg|D{oKghtPf2O;Q z75}*@{8X2%ZNYOT=l>|)vnsvuEfswl+P$Mv+IB9%b?}->w&g9AZgy@d++WboY3bng zaJu`>4Z7n>cNys2*c(|Vuc;2Y0r7l5Wr`==E2Q;w>9T}%>)Pa>!^539;;Zpa!n!Wr z2e`}6KZJKFv2l83#JiN`|Bk!qlPFHs>!qvxhQeUqpfCdnL%C>u`-oJV3FRK{g%hrD zFL}5ZWh(t{W%;A0XX)*w&IwfLZjT)}7h2kI1A7!IFZK-T?cJH-wx?TfdL}9#xl>lI zm(Y|uF5LHldsFUq=)vZPeGcd$?qB*R!%Fhot2~Emog$nAETuf#vdh-`CqE~Q%6|!WL1gI?sZA>GVqGG&k+A0w^iLLA_%>al z+dIXy+H{GQh`*>yglrXbiI6|(5{*`z)JeR%dQnV+y&T;)_HCu1Js$4u$f2*qy5wZ# zQP_>RNnh!EN<(`>xS2kQ{6>8x+;&%-o!a!3&ctr=h5SelMEXh-B_D&!@)Iz1SI~Ib zhm_^V$sED`-!g|GZ#7j&`~i=fv0}Ge1+H*&{Q$LGDh!BzNvpQk;W0 zCq=m$eUfNPt9~fwTv|)L-RnJyPEPAR3fian*LxJ9&uAQ~_b5U?(KuA^QP2*|kKUsQ zeM#d`y+=ViHFv#7K|3&7?@`bWjOIOxR@#BlyhqWhwuLU+H>#)u>ZF-+uZ{F5?sbav z=(7AYr*&8U@sZ}f2}t%k!z!`<%|h(ZM1Yh)kmpMKd@)i zJ8Q}v!JSOVHSSHh^LS$txrT1c>5Z$2K{VZb#fl%)7JOzmT1lu_oXkC--4{wBp1j|e;V(D zJP*72U)95IdS6O1rM|VaCb6|c`Uc&fK%akQbG&QSTWVi*Zamh2+O+c zFU(E-Aw2(zuz$)3J5=pTeIkDD#Lo{i-Y*{*QwyUjA3^uh?on(WYygzOU~B`VzhUWpcoqU6MJw*Oa=_+M(J_yu+h7IR<_$2(c9hkx!=s&@ zpubnU8k51}FqI*5IpL!+@WH}OHfxgM8F=Ab0^x^b;5`)H`pBAOKnC7LxMYj)eKPQ^ z%P@6*qqOZjkd@b6hqm<#r=d?9`vu)0OTVCU(K~ax8}roEy{LOUOF!=aQp@(GUdiuL zOr7P|KVb{?ta+5=DBO#hI>WQ3?S98)nsfespYU%ZojcNx^3tsMisZxcPT4n;-XAmY zt@ECepEaErtNSxn@3v}lU8e?

y}NvD(U_LH$MYi@BfIr%jI5g|XV)ufA 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

vv?(O(2VgG#`Jv@@3^ z-^t+WHrY@L^M$~>)Wd9koxa}XUVoRby|wT8pu&PrvN4YTDc@>ynD3Y2XbO4Z1=2;K zt%_%Z{+qj;WE<@PX<>-Pi>Ex7p`?iE+yH$1Z{W zRJPM!(8u7nA9#(G3F~a}m9Rdbtx$itUPpgSuM1_R*R`iUd(y$T)h(|IYcZ#j3#O1? zy1)2WswcAskPk}Auk=lwO+la0cPrn4pXvK4><;nwu1sSBKYSBoB^s#ld}XHhHP(5M zIDXAw=i5EHEWU#|%KWGkUySq5%(!^bM;zbmGH~wLF5mmXE|PL@IudX1Bwe)CFU(tH#TlGi&vCY-lk&P_ zq;^HugE(x?4h?p|($GjX9WvPnr#weugV zu_G|&ZH*#5nsz1c-ljQE{pdWKHP?ZAt>hkfY}G!O^$EKob)F>nRj0R4nSQRgUOZt( z=^m5n9mSjwZ^>n7i~rgI*4Dngo=y~}bx+OEq*ZNvTDbE0DO1-mE#U_rKqj^aJ&W|0 z!22n`c09gOWt0bc*dFB>OWWFSTM^PDd!=A&@#)J#`r}3YiT%~Oa~T8Hy4HW?KkRZ> z-#H;aa<#fBXRVJpeCy+WvadEzxKf`IaFEejV%>1_8~7>pkM?Jg4G*NNJn~OCu`}tX zgtj=Vk|}Qsy)|wtSE;Qn!}Ir3*EeVj-fFsF+7{*2mhdiFZ#YDk=+#bHpDMJovwCKY z_38df?f5>a9oY!1{b(B^*52p`b>14f)qU60WxC;(U+GT&XrHWX z&Dx%Y{(l?LiLaUV4f5+%$xGVv-0eS~uTGES3z9qX5IT5XwrNt(^M1L>E_BOL@d%x^W6 z=>&g%Enu?B=cx!QdU~o0$ME>IKwHpF;xxfZxxfpYJYxK;2mW!m)i?w4tL|HHwb4^7i-KsIwgIC2blfZ&F%Ifeyn_b>QjmzpH{Js z1?W!;w$%l@LVd7{%1(e?p(*}`hpaE^7}z1W7cBlp2iX>Xqbro;$L`P+r=uS&jlX}) znRLE&r`Swv59*)7vNtGvGT{zv3<|%Ea1J|x!V{Fohu=(irVrN=ZuVi>Flu~w3}MFB z_$jvcRvVY0ZvLNHHZCz9ZC@c;XD-jUu_>n?jXnB)YfgSnv?ITr4t)FstMS4GZtRrL z=QY~%d#?L7hV?(Rr#H}TJqqoK4<7LvY4Nk4bhP*}{;du6Bs!_13m$7{g`sWvP1ax! zIahPO0^QtShKrzswEKBo-fzhYi}Q2M+NDkHZ%B`j?M3UH(mRi$d#PfbF6(@(1ef@$ zt&fl&(lz9B_Gk7S+p@%?qpXQ^1Icd11z4MWAJRDZ8a!a0!4~qt+gABF@gcjXi8Stx z**ycA$$)d|S1RN9Q>0724w%39{}as5Fy_7Aq>W&9wwYJZSziH%{35%^>*&vIee@^j z%kA*mu$FlMnAUrnF#3nBU2OlUFTAcUUB}9wL9`HbX01h~zsg2^nc#q)NB2V~u5iB{ za}j#*`v#u>Z+X7w&ad&)xQb@l$iwJR`Q+V0oYwyDy~@3Z zth+J9M|A#PdG7Xg7ilK4jj;|Eyn+k){Fw4M7>jQ*=v#e!nY57Jr;bD3G_736iPOq; z9MWD@$59^XFTiU$PAGFDd)`6EiSp>p*8s0%)J(5qW8*67spPT#`g%=I4fU4msbzUh zPYrnmLzv4E45qV2-_pGUKATfqBR6AS5bBhk<8{w4CY(j8>$-GX-6rHvGj~3nNx59+ z#-lqfN$R-cqgApbeS5>|q2JzypVpx_H;@T4gWk?QB7Ey4;Yww-uIQNHWcdc)C+5i< z^kn3dPoux9d|HrSDzBfl6OWVXB7cd_51etn9}6$!>!fe+=S#K+Tw?Px*+t)MPe*w! zae3MUKXrM`Pcp6(yI(6fHamjiMZ>dz?>}g(9L~q1ahVbKBkZZ5$Id*+;Yf9f#x=)k zu@82Twlt!@Gz~peX{p{4mqRC2+WMe##A#YLke2G=aay@99;elo>EfiNb4uqusMGq5 z9sbFniz|;GE9}N8Z7QGaq4;8ZTVC<5sb*{znuAFdYn}n@L1vQfsw(tgYzH}XOS?NG zYkq0APVRuuX)itX@5Q!2`^IbBJxi*(%Q)XkzCEOi z7w`Lov%`vCcM+#N(s4ScB;B2q>GI#xw0{KbpBC)oZJ)?JXTYQP3r~n(zsbY?C;Z3T z#>212Niu zO@VI#N7^T~r#=CXcyv4PX`Hd)_a0-?G{zrgj5`T;FqUSUVr&CFq&nubqW`GsTg958 z8rl>*qGzKeWcfWB^MTxv4P754x+Wax`tSekzHNMHF9Tja;%Vf82*1`xqjlNhqdUeb z*%+x`b2Zr2=zG4CxLW2huWUr-0My^Lf?Z61XH6 zkehwNOj@5Xlh!B9qk!xZ^zX zcd~Ek1K?&`oQJsOUjOJvU$ziS9OBj2Y;mpf7Wy7ef+eR z_!Di~xMa)dKE`F7Cc2Mt8K;TvV_cF}Lid$$sXU@(?BYg4p$v2%#-z=|{Rv=h^l*b` zd@YJ)EA|23lawCFo6c+XfwYt!;xzSvw9vM-p>YegO48I8Hq0VDL~xY!fw2zyZ0N(g zfWO}NVIB2^eQwtd>#0MX{-|&1qFOVqM-K_>uV8Op=4t3E!Gc^0`p5Pl=b)j^5sptY zCU!6PPia>=iRloe1%HXBu7Ka7SIFKHWRmh6;o-c{w_$S-*=O|0cvZwX_NG2@9@(ABm7EjJJG&W1>PWEA=%+xLRSs`VD8TJMTL$M9s!NtSk!|; zn_r;4JA9j?p##$|R>ynr)Prs!UGD6UJGotH5B?PCC*tuFqkTB&?O&n2(AG7ybCqw) z_Tfms!heg_oGmNvZ?r$(z#YHXY3}s2Jm_lqq71sb^O&aA+9Ch>1=GENQ#w<8Zu6Cu zTk)q!@|^8v&vkqAHr{tE^%KqQGM%H&=^c?E_A4`2>)wWxA zv=N4#6==z5;PJ{ThEpR@p@-=DO+b^FP-L!iz{rNtyHU&SVz5VK} zucY^*%*#J<g<72uX zb0Qv}=7y15^k#1uAA8%E@v(T|fbZ>BIitY~l3ltdKA}Ge^tKxFZ*1Ad+y=;sJdyLQ9&KOrSb}x|^d=~57dGGG04qE?`eC?E9dzym7@{Z=uHW*<{z& z9mj6bx>oXa^X18|aT)A@tN9TafPWF+&5f9h_g?i%XW*{vGtZl>-U>Tag)8f3ZEyCuo*E~^*2 zq1nE)Rv%9vM3Zg*kG;2#udAx^|If{B=uO(tmQtXUK7@+Bp)dstwzWW0gF^uoY=P1O zeGnZA2-?x_r~{5IK`mCL_bUz~s3cY;4L%eEZ4_-WJ`@mzq9VgMBrV8I0!WJwH`+{p z@6S4WpS#aZQc&mjdj0nL%|4aC9;(w{i@V_MLcvkgiFqSjS-nn~y(5Cd4 z()}2T54UuFZd;<`V>`-Xh&9iq*T!!qmNXmtpPL4s`T5`Hh2h&^zBgW#zf3x`lFusg z`~J@SzYl&W2k?*9g}Or}lm*Y*(na!tN>w*YgtK=8) zsGqaa`6D}{9H(y=Am$& zZ0kH~TU+PF<#htjTE|&>mV3OlPH^{-w{&J6(>m^tYnkKz%C(u=_&e8To3u7tM%!KJ z%Po%|xOFo>>0h_5O6U@l&w&Xz>a1NxZC&ZS^{F zdv6w0~sl>=Bv5Z{LIM4DP$xukLd8lz2qt?c1v8<1BH2TAx#A(~W1&Ej&q` zZuGO-VP70P8vEY>KJ0DmO7>aVUlQHy`=EimgnaP`aAF%YxDN#W4!=QC8SfH*D>@wq zeKmcS|7fSPnTk<-ep+QUmo#ea+*MV0KRC+o`S6%BEsOs9#-eLA^NPvum0+;yyM{`e}*^Z>-YI%8?`l3(x#P*tjpL5P zYJ537AJ5q9n>XmHLjK7S3C$*hqvrRtZ58<1vXYbdn`(p31b|=8?=v%|+GF^{t^>Dz zl%HgK31gr>oJ|}4+fkB@AJT7qSIzFksi=QFb^pcHZ?gKjFN$wuP*1*7&-=mI=B+m( zC&w7f%SxOxv2)G(j`W8_Uu0AJw&E4|?_Tkno^$LSgS)M*S&tj;m(lK0*S6w~bOXf#t#$PXg1^kio-v)K?&IVSKgQxY6%Je{M)va^;hraDIC^y%Y zl@C<@+rhDMul!B5c)ux$A+vtX0B*g5Jr&rVKW`V!!2frLmU%d#5qz0L-lQWePRYq^ ztZShSe718G^^h44@8hBseH=wwe!n5>+7;d7wQ_k4S9$h1Twf(}8NFoRq&&syuPA*> zIA;}Ox1uCoI@yhn^lW7v^BX9gvc^C3bvXX{#Je@ljs5M+5gKPbzd)MgQ{$|$OK4+b zU5alDSn$N_#52%O^QRy8w44R8cG&@`K11t8*-Ww*MSM^lwirApxnJmFC*u3S$~@)YHODx4i@(3lyXh?W z(fpU_1^C?bnCFpHd3Z+UyWm^d0NwDS_r0kN@!$F6`~EQ>*!hSbvEO8Uvc6{4j&gWL z*cKOypYaLUS(^PfEY7{={(puCS>spW0?(&#;oWdS=Y6j>*2S8S+MtnO;iCWsGO6b} zw(|ioKEA z_6BHjWy7HzHuj8h{)5MtR35e68fdR)7V;Ct-{4}L;X(W}cd`~GU9{+##Xc0}8n`Ep-#_Ov zcPwwiUuFK9sAOkvwg5}(cJZ&ykQt8v3%GH<;QD;pwtW0GTbe$<&C6_i_Ve2gDzl7d zd*`LwG=E=7yi*%L&N8eWefLdA3m5HC34iJ7zU=7snb^7VpUJ<~ayjb>_&bZOme{+O zW(t$9g-@gh7$ecX*6DC(+a`3B{H=2Srz2Dc8A*Mo6n{u~&+q~Ci*)xIzX!*220qNd z|A$H6xVTuAkuH*N_@io@XVIn`y(Bwtcf&oqZrJtUKJ5BkQ>d4UQ}R9-=|ALTgWoHg z>SAqWFDz_K?!i;saxJh`78`~-R<8qnYC6j9_N0v3XI;`!_R(m5ap#korf!qnzMFY& z5A;-Qu*x%sisv6~I5~#Z>vTX5dRaDTuA99M?x~dxpgv%;UK=0VvNq_6gIcPfv5bTJ6!^ZKMq-n?H@xJg%O&e1mvq#s_VF@)CgO|?DMym-+( zrFKZ_|A1`LPHL^uXS)I-b}1Pkbs|HD|5@ZiY1RVS3{d)G&s54&i$6+T!99~@7c$fwy!cDDqyw7nb3gf?tS7Ax@TX8ww@>vsLeHQ+{l zt*wg18_IkJ-b#bdY!A$y;Vt2w!g&a|inHNcRc0Tm{~Bk`tP+b5^fjpG?dfjXSN{~( zvCj3+p9PXm2xPN@F9Wz0wx;fg)_TLkeyRet?r1Yx1A0i$-r?|8dr>vx1nzf>-YGc< z?5w6h_hjQcj(l4?XlsY-NAyfIEBkT`XP#@*_U)139J)jHkL+>jogC-jx*cEV4*YIc zl)2&yzuyYppo^rRY)wc1WXp!WKu=%h z#BWKCq_-q*)UiD)r7`{k(XUsp!2TMj=RZ1X^%Qtj=a&W^cI~QMrM@`OS&n1KSIqzN z;dM`k{xhJrAjV=a%oBoB`cyxMR-ibiLORGabG&E{*=&g7PQC-&Z~k`0|tKo;SwU z*3@CzYQDpub@sHN+)8~Hi8R|6cXgM$G~G2Xdl5X*veM9_U+p+Iza#8CECdS z{@)(YWw;k+K7260vHzdd?i}Xt+5Bc9!<2hbX^g$$J`37_zxessGvd8IecKUR(D)Vm zfjddKYjnW_^K_TsdbhqQDqnH8z!V&n?-d+$x}6KgzBo3Ce|GS6E&v#IF4);0j1Ts` zJJ&rshS>w&!l%j4vwD}GO?{dJfAIb>*Dtm0@wGd(z(;Z>yn86y3rssBO8@;C(fF)T zx!*r+9HU7YGGcfsFK(brze*?N>d_lS1b%Vu{Cac_K)vPMhV z(fQi#%@gMuy`SX_g|n}$4Bu$k<7skhV@EA@uUCYzb57wczz_`>6Yfr-Kc^DM?R^2lpYOe7 zos9QGMH!Q88Qx=$-3w;dTFlDX%(p51{pI3R&wEiG% zZ;WH|hJp9ejkNs?@T~2Fm$kN^bZs-=#cj88zmNChQ2*ojX*`b@?=D~su>e_h^Y8|p zKPS!PqLNOOJLs5$Ylp}6;AIWhuRB~@Jg)a0giarO<+gA0Z6Ca>wSBW|d!29lk%P3| z{K{=#=i5GbS!??}uI*L6?T>JN$;nu+#u)i-_`{q6bM#BOo;ihcPR5sZ_f5AQl=jHm za^RlhVNM_p-OKImPHq>DdsT9~2spa4(|ETBx;Qye`xa+1oK6CVdDNBf)yKHYchVz1 zLhs+;zQv~5jlNa8ru$`|F@MZ=-;7e(gZ-p$C#hX* z1!9+dO#Mc|_H$UX*B#7RF6Mq?O5p?v-Z(B3yFQG?_k=ul4UDmTR-Ap`!wMo8!N}UbrI{< zHrB05voXR};`<4}(78(aM*04CUCbZqyV0BeD5g(iruSanQ+D`F(y>YW*+SU^dN=wh zFScR!dK-qj4P%>pPGFPIhz44kmzP?hTVh+u#)fAmY25I6iic$v3-30{CgZIAqr=^q z4WBL>=rh<+{`;>ky#b!lxyhY}#^tv+PnsLT!Z%syM$YR`nrGilYo_g}Dz@v@k3{CD z53&Is)qd|~j3@pP&C><>kLOq5n!sUGVl!TBT)Q+6gWHMgZ;!sD{@+Mw0;Pfwa_{c~kC7XBxkPu5r= z1Ey!-fAN6Hsna=$obuk|^JQ~tthKHny;m~9cnhx974kWooKn73bU{uB)*z?6s~zJr zc!Rqb;{8N$lgvuau%k@Q%;u?R=h2`Y-(SO5HZAS;0^4j_V0)X^_cf%!W#~4Kr|O$N zp#BLDqYuW!{W@JV9s|B3ll4m?)56p1gU9Jt?6U~Zg_h5B|8M95`CiQ4{{N^BXn|Ih zI^bwGRtMDqM-HO{{5Pa4b-=h+&;jp?W%LHx{%dr=rHrBRhm%q5y@&i&sROPG;J+Fj zaApO3_SqBof2$6d8|M{{u7Ig^LmPKANsoAX7`|S=pj)o|qGR4PjE))qP+7;kM)ZCaI_5j{ zYmkl!{G0L}%HO&hT@~T?n6Ex$v4gVc)Ezf3UNqnN_T_UWEnjW>9+sc4;Ta#CrPpzO zkNlJ$wF$q_jL7_FyV3D`(5*%J#h7=bqs^~~?lfN^`d4;}WT_^)WmnCSU)lHInjIF` zF5O=nZQRwH+rF|jb;rSf@nziwNL@z{^F!Km4fsQY^u9#k|7}XgOXlcjj(+Z> zpXz&#J{IX?8+{Z_a`bHxF?gbr--rBSHogngls0wr1VKw-q<~=Z9|lII#tzh%3C>;><_&6+h#ZtXPPa?n6Z|4$*)=Bb;o3Qg;+(m zFWRN^Z~rl`@D%iUg5Nd9XT(^HV}ILyJ5J?oUqa`oh>vNZTw~c!ZuPsB_oaD-WASPJ zEBQa*HgCip&Gjn*dYW65Sp;!hMi+-Z3`r2G8F)`4tjkILXoM-CV zo;u$Y>5v^{`8Fqt?Bhl8AwGKJwt0oO{1fq_@U5q6G>R4o1)SllESIHLiRHIS%2~lXo>g^;!G!;W&$~tDGF21TMqw$s-@q?Ox}cTq^5I zec#k#PsqxY$<}=o1rpLp1C>{4c zRN0NYdeGfl(A`=;OUHR##(HMZ*^^W|F2?(>t>@>yq1#FC{VDE1dyRe!cl-$*=y=KE ziJ0@QH6B`7(tM-6IlqV3Lmb6T#8H@EKyx%at2u=H4!7Ue!Tc3JOAn58GRB+%zwN!o z`9RqR>R@lV<6@g%j# z_6)9;4q%UBoZvJ(aD1QLRZm&w=MMDeIKxZN`0;$~r|MWb_*fbGA^G?Pc9-b}V6}~i z_ZdSRDZ7`rn0Spj41Pxfr-y#YJ^=5Hw1Zt^?btmR{<+q{*&v^lGqLIEecv#?6aHjRq??!x>?zwjO!hn`;fJRGp^jVQbTo5L zN4Spx{#RR!6Z8qo)V?lVpD|u*`!J4<))##jb9~f+y`VWf*3+EP$*pBfrbZp(>7(I> z9rCc#LH5o#ea*e^%t9N==3LntoqdyEcH!hg?#U~+DbHxdepeEcft@Gcq0TkSmXy6> zIJ3UJhVU=?t8Ik@5%zuu|D$M<<1<$p~1 zq|eA@D)xx{?+YIK(e4Itve)L%3ebk;Vc8Ztv6t+-f4rM4(I4v<;~Gt%pZurRogwbj zQUB2!7JIP+Sc*N^FIv;4;HwWM_ipfMJ4L6Ee~~NQZLkCUKPCLpE8_Qh#w){k_5Q); zRg-z^7yXm%3GeKZ-VuE9qt>qZiCWi{>pm6MC0+U`smrs~7421bGX3U1bxwTFSH- z#+%ePIy1J=%4FZt>pk3XT|U@WQjBIeHt&o3Y__*-Bk5Q3ajF0CKo|4O9Q2j=S>vKR zfOH2icDeDH`jz$z1oL&px2BSH|IGBd-`4exkK^_H6a^kLcd!ntiEXX&eo&lNoZ;+q zKlkx&d^AJ&;1|deQ^QweQAbM+2Wb`sBBuKa|nh zz8!yq_xC8K=a0zLU^uG7S(WO>f!5|r_gg$zZuOL0^now5x&1WXM!cuy;AfYo;BUc? ztoh%cVfFWZJ@0H3!O%HYUq-amyYPC{;iWh*qw}CKa`APn_a%FI=?I=}eDI4|{Jph3 zrSv_)5)BwD(Y(vGZ~X>`xcw=mZ@O~yo7jE6F*{S^tiC;Xo6gAUylm^{s>kLN-()yV zjNx7F=D{S5aU+hwY+awmo?eH;)4mU4c+P6%?tux!vtPI^N1awzM{{Me?j}#qR(>Ys zvy{(XxNS>z={E4bx|g!l9T(c9ZJmcxCg#oDalt)*N}CM7&WLfbc6c_}Gl1QEkb3ph zn;z8T+3HPK9}eHvHNC1JeJ=XQAM}^EBfH4*md*>dS)7m7A?EMmU4E`6{%>YovN4iv za9Hs!{5RAQ&AXb=WlfBM&dWHzRl+-t)@sk-(s#l2Fn&7>48s*4mv}3V(}ce#O4nS* z_fIY>y+~Z5zWFJ-MU%_vMWxRHAN*fEb7DF3Hn!5d?$4(db;-a zY1{e=2gk>5R#oJ$RGa8}{ZliT7* zWLr8Mew$8xTMHp;_{{d!xce2n{W@9jiJKKHd`JV)Tw-TOVKa_u9LP;uHRVSRrrx8* zIL~n6eZzv!?8>kB&c3#@f4VQ%``o?^F~O3{Xxi#2H5bPBGWd3|gY6ql@%XM}e1kKu zo!a|6l>5Z8d$<`$;)`0BzKJne}tqo)vSM!w$=3j(%O+o+)z~_qn+VdY||@z5zP-&gKMw_jMi+{&!8NO zM_YsXboEX4$;(QoobQ+KXW0I3H&^xody%Ifez zoxvw24{++xVLw^P@bogI`_xk0{-fDe3~>C_qfz=W* zc%-h)?1@2#ikPIWH$GEUn8uiCz5O2Wx{9CdrGx2@qg5V08Fp_0ex`3Wuf6@ZlKEi0 z7w8$S)kTBH!85{!PnRpl%%Bg_{hN+25c|7`J?-~Stlqk1wYSj47DU8Q}_MB3A z8{#~(56Blj8e7%1vpCM4C_bxk4%WYc40$~*Jy&GB(aq+!(b=K@q@MITz8}Fw->%#B zIq?65OE1f3!23h+&>O`=J62EmvEgxWew#ztml>DuzKXIZP?kH{ZrS=O%GOi13EaQ@ zD#{)~*?$7=Z53txT$$VakzE@$wC`K9;D`J2nc_a3$-3FfI)7uuoFG57&7qnT#m}NO zGTr9qMrg~k(H%R^?t#!f8j|~N@=g=apy!L(!Q~Wts&u!n)0g&n1oLOMtdj=aZ-U(~ zJAC^OWuIstns@K_$ZCBs)%N^lW5XZ!8sGDrBbINcn@hD;)>=mQpuFjU1Gg^VXL^)A zEc%g$8^d}%IO{H#0m+|RtNV4h?jq6p>VWdJx1M!(nINZbecmVgTyp*tZAc$V-*r=O zH))Drd}Ku&t7G;z_Pk;S4L|8L${yu$gSPb!H`}{FXK7t8T>e}3tNH}ph0|E-)cShR zdwfNo%Cb;CFCX3~8PYtp-v`d=KtIk)=JFp;{_ax;WcV)}{2=v9P_{dd_DI-L)mK^o!u)N$#|JMve|N1UO9JIUJmq^XypBp(y6lXc2j>k zHZQ)D^qJbu!E0IFgR!}j`vq8&!rL|u{M&g!)+n|vmOLbU&$IEp+fTBxPmZ?x{f&0y zpQS#-Ls}=F>G)Xu<-h&V=lZPte}(SvbF^OqZR{L3WknnDiPq%xj?Z;Z$0GOru9Tf) zJXF(nmA7%gL445%-&V%u2zT*;_Ts|0+r%z}$NJ!X<1OGSHnoEVpb;zS#=G0(}2+L*#k{NQYH*>wTv*Sh8P z!*D!9{}#XB)1Aourf0o8BEzcS7 z`pb57)%>WxS+vV$3U~aRxr?&$Ra$>c_i#?p#m>uq%IW@mzW1}xeJ|9~LM*`4 zQ=|2r_H8q9%q{!Maos=geJy?S%I(`yzXN`?J1(q@gC*NNtkdd!&cNx3bz&d%-|KxT zxy*>YZ})y`@-x5@e{}7MzX_F{wr<~Xcw7FKHh<>? z&z~cv8=L+V_08gRpws^mozx%U3a!2+Tq&D(^?W(qPZyT^s^b%*6F6jQ6nB;>{Liz% zn+{$xV&3isf5~PQ`Qq<0z+3M%yca1WyyesPb$maHuG=#nP2lQ2Xy-@aF z_;tm$$}*wdjo$V5?N!c|e%#eJuaosGy|y9P{n^SbQM(4Ywx0SAOHy%)X z;O=Ak1YhsD>Z9?KRVClj3H7t;C3VGLz%m&YzO-ZggNKv2i6O@57<5uphZWVjy`KB-)9i^NpO;WiRS7TFrOFAiPZrY(+go8 zqrq@}uCQ4`AC?~z*&Nefp&vQ_eMoSM7?;jVxeq+}PUI-+3%{JRgOmP(m-T`1_Wd$^ zgTC2!h$)xmr@&?(VoW^l8iNLh`%wG@?P7W*{FGVi?T&=UuFS0cq_Z27G|p%Gy{ROP zbCG^;s*?WJC$-`D(7s1M+?c#Vf3){8oP4x7eoAn9AR3J4v*kUsSHjc2TRI$`&1Kyh z+U$@54u0yQsd_O`@Z%_sH9! zJY>2hm>bn^-L1xV@A`i4+E$vk=>@~SLx_$`^HZp+U%6kewm*KI>ihF?;S4>LF5Nd& zzpM=XTIK2G`lR{A^riX({-$r~k9|82T{&!jDr9`Pb#^j7z)!}9=Wu+&{)l&w9~+Zc zZ}DwT$A6lOm8N-qq5ACC@TB>*nDCXarc&Pd2G5bc9pw%3ZN3V=6J3)&7>`AJIro2o z!DBvGtj#;Wci`5Q{AA~ztahk#tQ#NkVb0m7Ew21B$}Vx`rPozPcAM>`GM2LSqwmA- zj7iGIxAtrLYQ4`Lx@qm!OMS%)#A^rQGI*D5_1y9}F4|F>`N+&WR>^sb&)Mc6M#6TjMR#{6`s!qjfx&t2^ef-1>5vHLi@}TM{_q zCLfl2pj>8yE5n*raSH}hIE23*;#5uVNuKD7<^}Pj#zB50#j$D}KEgOyS;GhWmj3Eq zL@N(XB!4yz)PLmun2*#>%&&pHQ!x(1*=&{k_B~*J+rgc$KGROZ(>zNqi%xH9jP9oF zU9S8r%8MVb)fm!8?|}a2+?^xJmz}5BpercX=)SRQx-+It-`U~;4XpZhq06t2w)cHf|e)bKvL6YECJC z11elERO0+e;C#%%nhDOL-#Hp9`f6iEe{+7U!0$?LV^dDDq;ZPyZ*G01eh7}n3Apmf z$v&K-ae|iWlh}0*9bk;z{pCG#dzp1Y4Ye&TSi{WCqHCB|{RNrz!VJrT{A?fOHO>kg+BlsyCSl<{9 ze{H+#{-N-Hhif8=%{^CpzIxON`!>gj*rc(>`!?h96&iEHzS07TmBVHH( z{m@fxA-@KNjZFdCR3Uhce?e8Y+%7Y+rjqbHCGsHa9-_TzZQ6! z3vT~TFc)afCQWm}CzlSM3(Q`Tjf*b&b%)!V#b)ge=PexUwoT1wlHqPMS+Fhi6QU4gp&3QETc==@4FYU+l%rN-zcl3h27w#X1H>ofFr=7{vKhnd< zVsBK?rab0nv)@wX_FK}n68sa}VALPP$IWH_DC+#=JmD4dtG>C^YP@put?+v_*c;U>vGaxTA`_WPA~ zqv?a#Z^e9R>mwUe%@^>M^%=g>xOm%C`pCwCbej_x3!8fwn_kkwd)lQh1m}0sW1>BE z6%P-N)>c|a2kU{bkKk;vZ=xw>KI7HxgsGL;URKL~ouWUC&3pxi7}6!9nmj3iWWv&d>o2Lhc~YF zeqxmq4@A%MeKGi^XUw{e4E+3kU=-mQ!SHqA<#B?g{mt;qsmD*Sa=?M6HnxWbcnC&} z)0xPF`f72gh@Lwb~Mo zR%eL?iof@!_%W;V2i3Q^-*mV=GY=$n7E*_I;j1~<>hzD0ZOEOd);Fu?-*sj$soODv z_FP@fB{QP9-U}7=c-K4=*3-Muc{;Mpyl?RLR@CENb9<_ui$8guIrfDaaZHcu*8YLI z!nvQgd-VN@=$jL&qyCvSeA}ch()VcknIpJIC0l4U9t(AGunq{uaG2HU%-Ni>pYN9sIKkqFZ|9$6&rdE*S%K8S|mHE1gb==T+oNbBOxM z*v99do!*k38vAW{Q*h{ybYI@@Ve#x__7umnrWX@>JvqYko$|Wi?f?0fg9A+@%j-G! z_Jqd~8X0|lKcet^Uk;kJh-S?3zw>DmtlXw(bVH%nr%jaI$2ZPAtjW=U;X65wEw1r; zNqrzKGxpjkIxpnseJiVYW9nHyR8H^p4vxwn=bniTjvC_UsV7GLbUfBYl4a`UPliVR z`PATfUKHmuM)^-h9oo;#Gme_u^P;QTWPI#)l%?L{Pq;domusn0!yRos z@WI)PmtaIS)PuhkQ%=4r^;6{<;V=E4J;9ZmK)F%tb}bS-%G8iIjq#26zw6vMP4Lol zao~>(bn^qOzcq(SKj)yA+SM61n{S=YKaqZ0zS4CUXErV`dKTfk8gR~VHnLavP+#(3 z<;g!7T~<+EboobDPx9y6_wuLxCAHzxg_qi^qCLr@WU+4v?Yc5~Xek~`&E3KHE_dIK zFnMJhL_e=@^?WcneXa3LK*!Lg$r3B-Z5cOTc-cCNdYTX9gO;84EBb5mEA2VocOSOM z1&NGjK=SE^NXg{PqDp)Ty!emLbW|Y#?|%~R31MGKh6g5liaK9hLO>! z_@E9~K00#NG6Fyc& z@A*;11Sb4qV`Y8kjD^lH81En#=wUnm!rn@JW`gq;DP0rD9{xvtcW_sS@el77XX>4}k{SAs*O#`=WR5S+YAnkV&svMS zIWInw$Gh=0x_HTb4t_QDW(IQ}&$-x6jpsbxHLtokZ);9-o?CZnj$7#A)BtBj0Eg!k z9Nw|@`fbf9+?-0SG6xth6egdacV zT={Gw|IVB%-^_ma!^Zcxh;zb>bH!Zl(<oU;`SFXW{intqAj zz;)+xzq>y#TRxxGHmVW3Xt13h%AxMNC=SSXGO2W|qq*iewLeG}Ip?eMyrC?fvN*cs zeAOe}%VK=T1+qBD$>MDOWuHq%C6kiT?DAk8vAlFJS$vOpNARnm(VT#vc~0>&?+25` z6&{XcadrTQ=M)^?y(|h(FN-ZaOBRo(zpqvn7y34lMYFfCZ%^}SlB-#bWx3*6@|TjU zKpy|W*PB2+^v)W8K8R=GU-WTWyg$phRnZWA3J$?jy+~ubMx+9M^dqNEe?=mdE+=ce2cP4C3)}vRvceCCeJe zN?CSkgJeqSp)BjYQkGrXuywsGt6ZflyR@O}2C}SjUY2>5EWchnpg9FyXmmO`cs@0F zMwT_dX&ouKZ*$)i!#*hAze2iv5BiQfbhfp8Wxlmx>xK$lAl#7GJHL70)>eM0^PHjm z*EDt8i~GTuc_MXwW(@Z9Wbsc;-y8jXJf!6&I@@hR93y4+GCF9D!%y~#rDe+BhivsW zB6ElAyc}i3BbuM2yR@#@gD*p|$HqIXNmF~)ow5NB;Z6qbbIq3b7B=IXcn11?U-&ae z+dR)4t2OLSKPT~w-kP_;@0-)cRkW=+_+8Mo%g?90(+Bn-b$`p$(rV#%Bz2*I)^82< zf>YDi?7xkqJkpB39ry0n8S*pPcjdFOJQSJ#q&sXq2Mx7e&h%XO_`}GQx2YGE*J8gr%2-fEdMSXtAOj*7`x6dmzT`?viW+4m+%IkKK`$yug5bU zS51!kb8dVu*4mkILx*>WW)D5jT3zqe;$QX;dB%s)AwPuf%FGGJOte;a)5%wP_5{|n z%;Tvv?#0r%MWy8^XE5CTSd5j?zsv{0d8LqV;RB7gA7?#Rj`MMh!JPjWcsqjMwWhg= zu|O`(FDaV*ZM=A-5r(S`&IazvyG-yv|Tt z;wj`ovXBdO#u36rX^g#F7xt}kIz#tOTORi20zN2!(L0n2d_%tZ0Y2#9DLoyTZy%xp7GvN;JbCO;bL|r`>Nn${p4N!lTAy% z_6i4`qmaEA=3C#v(fUq*6|=h?do)g8P9LEQI&t@*P9{QJnIk=(`u0!+&HgOE1@@@y zFZqAbzgxK_uJFsdU3`GnIJ0A3-HpDx7awR+e!8t|wnq6$g$F6GJ!C7(IPUcGgzEBM zWZrW2oSm!HyKvUI>hGwn8SMS)&W-8BG=y!8bbihcR2Q~-oZxe7hcOdQH;3hsQJX_{ zRu{hH%QJtde9Z*T=%BB$1v|WcE@o@mtB7y=w-5&NmciIxUHCLGSg&?;3pdR>z-i$A zw#xd~hV_}7t^Nsz6q>{O%sEyc*{-a=!qu1mwwtlI-pQjM*Lb{-E`5ygmaVz|JbdAl zP5Y7FyyZZXTmJ;UG(X=;?{z`Dak2xPUSgcg&Jr)Y-}%2ZPWVUq7f??6SvbV;4}ni@ z2>2TuEZH?DQ0ErDgCL)nzAY{o(pj4Ow4M@=9`AJ~Y3M@i@W7vc<&~ukRc^m~h7(>F~gaOU?2?67M5I8#cZ(Labr>_te1 zrF(3g53eoMFwQOLD2<8w;`!gdOE-o5?{!rRvi#?**sRE{_+M-Or@}T^ms%UsY6~w> zE{-9g4QQBZgLmnSR2xo@$#2xHHqa&3M)M`5AB1gif0nh;SX+2PZJc-Nhb zsWy0z`D0mWr}bmG>j%0hY=iH=w#c^IFtzY~>&L{njk=09cyG%dm2QJ~Ya@Gc=^NIM zWv(9=mo|lMWRHydv8J~0W$VY0aU0_*+Tgvd`3P$R8g9zr@6mhQkBdtGZv9y5`mwZR za^c6kc|zRA^|gghSU--4+n7+%2Jgj7Ds&$2YNP9t#{LgkKQ40pxUjS$=tpsh(;u5^ z3-6^|*U|`l8S{x1ZSY<^FKOe^TwOy!@7Bh7eE*la-AkQbUDDY9rmzjKC-1E-ELR)I zsoKz*^s--24_PvOjP9Hh)*J6|`*m&M&8j!X)nh$+p6a0^t=@R#Jghg#)f+LYaE9uk zBdtBwq6<|I-Dvfg4eJz}-PHpUe zJ}f)il|5l}A>+$3e^}Xh_#eWu^Ih4CM;HG14f;7Jiu-wb<3Ru8;6KOpb3XSmh4q?T zy{Md*>=u^D~u3l4P|Bu3YXSsS?M;HE+dPbkK9BwzQ>-bJs_FPvMyWr=( z?74B-+$ZBX`0K8`=B9z`F5;Z}h1^|NJ?J|?nos^-q-Ml=l0cWuOPqL_9uOQrO(3BwNL5xFm0{Hc<0dh`4icnV@|R%C&z8( z7+)(hFP59sTA(vnhdaF6vhh01<9Z*s{%1)#Gyc}Yy_z!}udH!Cj;~TiW3G8Yww&KH zi{~cI8Tft4`@~x`r^nxOxye7Hb3f{z>o`y3pT{-!uk+6n&?o*Go$#-ErXBU!+gavo z1qVO(CUfy&1%or0S8bdXG>qr!yvs2d9jy*C9CetnV!7n+wD` z;^*iH<4!f6M^Rt?2jMZnKLh(P|4d)T_-Fb$nrAy7Av=*is_%Rk&#i44PxYNV-}hvU z98E+I8za#MScW6zZH%C=-W}d?+W4sd%Z!_RG&XkQybJ_Bh#~B}HYcap(soZ(9=H>c z0m<=jw%*6RPYt;iKUCU!ML%vsXNHO54@P z4L$!S?j#$bct9W16v#VruGq0Xl!@heC2|_ucakaNed5rNZ5y8rqsxBG7qJE7`7Mak zMXu@hJZKl=56y-DBJdO6`?z)a6ePQRW5S&us@1vZj#?kP0bfWS#T&&t(|oz;ka(}x zWM4D}mX|l_8XspEp|gpRxMh`#)tm+n^0Aq`fae+H?eI3W(%~=Jr*lciFBapkbo7qW zUl*4@#m0et6|<}}$e+c2ip?vG&7yl^n#fma{79cw-s(serK`p;&p3WeuWJH+Yz|^@ zIZr@49UHXHpv@xfZ18K4&Z*mS>KAD>x^LV0>2mnr(r1N+k3IKs0(sAy;JMSUYlU;@ zXQe$m2d^^dGp)JIXM{{xA7j3rm-BlQyqm2Aowifn^R@Jp@DuJyJ<$d@isjTfD5VcN z=ae0Mx7#U$cvn1_=2`Ky;7QlV@#>eAxZm(wO52`|^WGqSmfZzkO2@W28rxndJbanz zyFB@ZMymf#Mk>oLrtBbHPhCGR)jB~v& zqLAO7g?{ok$kr76Dr7{wYrZCvPx+SNBgRmARxiolV`Nb5^K!(>e+nL#tSul z5BYde`AitEqz}T4ahC7J_eHw<3jCiYAMnCDM`I7u@jzsP4~b`Ep0_7>aEiEjBZZJJ$>As_gE{;GSg=AAbF=-+E- zpRr5y56`(U=7M+8#I46)$}M9J;KoRPo@YFqI_IY&{@`h!HjcFB6{Tl9E)y7Ma7CwE zOihiSZ(Q0SJ6q}6lcb)}#@?~JCq@G&qj$W|Nj#OGOh4d%d#>l1w5i8M@jLo1e__05 zl81g8zdX1JX6l~uK=1$0AAnCkjW4KUJ|*TN$t!zZ7pQI$3#arj7LKthYEEE06bm;) zas{oTItP#ZMdf{|O}Wz?Jw~#HO@5gk(lg6X)mUOnw>CiLbQRuwE&w=o|Vj)v|7VwO>tJ}T* zjWqGF@b!H#{&jO|t{V8>7YEL=oAbfD>;}zc8ECo6+Xs}3D5tX=f1$6z{AT+VIq)*R zp-qjs_;&D~MHr_pdc=2~X}{t_(8BLm=uV!3*1k?|p@sQ0W!Fkyo-GtJ{lK)?nUpZdb|^3SGupV9`IF9 zcp9$IZjI{;KHI}(Q+?6-RK8daBVKeaZUB>;>p1U#9j=a)E83`N#V>rAxKvk_R8fx@o@M>2#{;Px|f0 zOfdq&X$0S?kuS7MdxZEgwJ+jh27H;nKoh@S&Sba?nz6d(Y|alc2C)w_UQ4g>Y4|yP z`O8Ub!FQ=R4DdGno{Gh3URHv>#z%_v`LfDqmzOqMy=A3V{yiQ~f(Q2Ht^@Pol{rzr z_Jr=D?DKPwHPSx`&0iq>st=yPe%5mGE-9V;!I|vUEVKQi#8#P)3{pq>;vxS{b>Q@n zempRGfp6!pW=HU~Y&pu$4(ua*;&E)zvXauR>`e69O!2(Nr>5^}rypet9hl){Vn%uX zvbO!+k(=9k$WO_{boz;{QJgM*a<%|#;6H!|ZNw z!9X6&o?u;_f_C=m?PA|^ zuc)(Lb+#Q^cr>iTH)eeun@@nT)89eo@YbGLE#uGrQaVqvOkNdvQ~0UhUDzxqXn!6( zCEZkXcj1Z$&ECZJp*`b8$-81*WYbEP%no84CBNbuOP6g#{uX$o7rrsu7d}h)iE%S| zXPmWfv_@l|(u2e)fTza1*W2B~MS22U5}nVx?S)dV?2jOpXJo*KlnHIyt^H-&_Q9{m zaxWU_C!5CWA>FYo`FdngEME`npZ-0_zn3r7iP!Mu?_u~g{9j&X4L`QLhTs40@3Uu< z;ao0frLvtM$zZJCFD@a!i+Q(oyZB1@i2t?Er8{c3v!`Tm;loF~9MZP* zVjFqXhbJe*>-6k}hOcDyoWwUsns6o0_fK~xyYnF%&!)bR=eOc*A{yi@~kQM(N z4&RM8ewX}&?c^4U7URi3EXJ>Sani?HcSgCbc?o@7lA6Qnjg}g}#id$sHGeR3;1+Pa zi}L!`eg4XshVvHQy}wv-Gx4}DPSTJ`#{B~7mdiyo;sx5&Sb@9IiMHbR!%Dw`cE#ti z_w3yNoZbK5l09sHOv@OK#;EoP@4qE2dqGL_cssO6@D6s9)6{*6`RHls!N_;IuIC%o_ec^u1LpMN{w+gLrN`{B4;_fO*gu1@j7`8M{&?a~9-Sm4Dx zxh?PS`sx%9F@KWISynqk^A^XyT|u67MRB{viFuo{URT(&(-k4Vd!Lx-<9S>B9^s5 zZ^KW4F1nv|+34TVKX`4k_hqGT+4}{hd-?Y|>2p=A3BT$3_RX}+eB9lAZa7M2$WO`4 zH)#7C;PCd8yW%pEg>UHnPTucApZo70+*#&z#mX2zkuN&t96uQy zNfRA)&I#M_0?}`p%6s|&Cq+N}qc2sNZ{KX)2?iUUbZ~^DmjUir80gyEI3POq0LSy} z3$C3oPduCO3G}eBfqr*aj7=Rh?z)4%-T_}%mDf)f+E^?vEwQm!R(hMgFDspA?-!Kb z!haWdoXfu-quCmx+ua!5p60*WF;{iRochq+do~+(Li@|<3QKOGJHLEf0}pTo$F*#Y2Htl zYGY0;gUavX*<^4I?J-88o#`X+&)sC}vgBLvqQlgi;x*fm;Ml`^US)`x&6BQtt1}^5 zJJb6MJTe<-mB7e$Y|^G)#SdzshY zP2b+z*uN%_!}pRW9l2Kj=*V~5`?AtC_I^R>YW^jMSLz>}uHfIx<9YaG4qWZ}ado;M zyTDL&m6o^ zH#UfuNbjNFz3;|$fhOMG4{;D(ddLs$ej8HO`f9r^%zx;~eDyUChi9AiK` zHeQT}@j7kTJGA^d<0t#Rc)82FJjP3NY`cqlFkDElr7wPuzw7d4m&7`%sC^>mM%!cF^DW`Es7Y)6%c77>f8VR0mIM5s$O>%sgJ64x+(}XF>yT z^)#?OEI9_w#vg9KLi|jVWr@VcW{nu?4K9H znd;!o9a(s*hcjsiICYH!ZxNhH4$joZ{uv>h=?=~(Mix$UaLivl9eQfag1%KT2OkyI zo$2bfj4YfO)}1-Hu6SE~D&0`?OL))4d5>`LTAGQ8WeksPFZ-s7v~6+;53GY1QO zpGaRGr+;+YbbDV`s<-zGN>lllzMQOo^yMV|(~pV#d%Y<>(_S0?sDjRk?|=6X+ID1D z{%Xi?gHg`TN}LQX=m6V;WK6IL6Cai49OCHq&z4@r4<9wqSNi#go11(Z{0I%A!xx>h zVb`JuzPWGF&L8dbYgOe5udXaM0cYU5^u0j7PnawIY}cBGqJ2*|`FkX*!`n;$d`ZS4Tb0x%FFj|v}GKMZVyp=)z)4#zwnZH%I~E;7u~a_ z4Q zrxo7oVIilDm3?`~X$8fX7%i1w*_RtnD_kDtSN5gtw8AA}eq~>NdRk#gm|xkKXHF}e zOMcQ9a1brggB{kFN!mN(99#`+ggU4_V%LnXd>M2^HYl^o z`z|yu`7-E*Kff{92MpqW3=j4NQ!sx$qVOW+t=%j!yFkeH&5 z4X!TxWF2|;EdIx5de0hU-{z`74pMc9?;W}YIrp3^h2?pbB`j+K2B%-=!&ur@*G2+m}UV}I{3&SZ@!pgV)_P7{BxeJ%E9w6CH) zmPEH|za@;-%uX!*5!|1DUbf$nrLJsML9ui5zln~-UNt)YaAaXA?|d7zU;X56aD1;z z%loB%-A;N=`!?QZ2CVhf>lXJ?SM_W!DTCcXIltCbjJDc*hWIfL+w4x-(z#^i84fRv zEWBPg%y&4!{jQ5gJ8(tN?R!$rsWC~fMc@w z?x^FyY=_Hihs)#`m$xVWIQGsa(iZu4{&^O5)-1tB$2hy?U83i^ZNJ=fyZS4decs`l z)7*oe#edOZW5YUQ^_X>wKSTa*WZK|mI6Lj`?P%Fd>?7-(Z0)*Td&XnyWwY&HVlKMz zf?VOTM)qD=%P7unk7AJdH`;z8S9sdJ3tk5N26z|zJ=oid!?SkAmD@?+Zp{_G8^C>J zsCu%+u*1$7!Fhl1EM{xl^O*p*qiPE60gU^Hf}yzOgTZ)5P2sZvjJt+{G5Hl>e6^;q zA%JlkFpNgfd!8E)VjE)KVC-*5@n=opQH~@?4w&|B!FCxXxaj1s_o7hvbo-#B%G- z1+D9HoZoE&w%XFZUU5`pFBMi;9+?8AZU7PA(68|RcpIJ;Z=Wi0vy9n&;~ zexZ$4+xJ~o5z7q>1yXUCW3+M8#_D%nwhtN4mym-973s0RD$7^n&PVPAFZ022f zi-z6w`O*;PNv9WH?_d_2@GS@?d`iFWwZ6LdB6>qHpb1Q;vqUq+9h?=yTy=V(-or%J z4JPw+3MTKmvnU0VceUAtp6H%K+;j-@KTa=<_AucQgNeRL!Q@@BNhz4T8%+31aXynn zm^)4{{E3)o8&CMjV2-PR$$JsL5zIExQ}=f9ZZP4cZulq{!hGiR!fp?9x`T;*oWhfL z#qFf<V0vx5(`#cQ(`!}eM&i3WOuwCWM&Yvy&~NA~;d2)-xIevP4?ZB~ zS;Hl&FT+dp*9XohYz*pseyDoK4N>p@GYTIH>fJn4J$w-!|D?TWLE+s&z4b%X%bkeK zJALlzZMt#Ig2L*c-g}3tck&SRe!8HrB&he!q3WGFsNU8a^HJeVLA|9z)tfg&z4t|h zIYGU%ho~2wJ_KEMM1_W+-u$8JEgV#D(~YG=3zLF+Ck|0h`!W^u+ z*asO@Z&Rjl;EXb#jia9NKRQr%GAN!FejoB%!GEIOz;$m!&z{dc`d-hL?`8|@DehCT zo~@ie*O_(c*#EG$E{W$CbnHIP(ON91#d0ckGnBRXJRmfT zz1-v>WE9zcYfx|1Q1$AEsE2Gf2K5#XRqwbV>V2ZB@VcPhnM2hhe&C??-LI<(^#P38 zL&3OkXn7qU)H{xP#+%5K#$Wdo0#Mx&^gx;w2&_h5|2COVw^g185RcuI@swlgyo zaoph=i}MPfChkjjTCP`YZT^hHn}8k1VCsxn92>BmayO|Q`zD-|+4V-|x3^fi%SswA zeJewGKjzuTnE%w-aY~;-x?p?&7|M@W!(3tY^&vx$)dj!zN?(ALNBN|R3MlHB&2l;M5SBQSS{u}{m(n*Tl)q1ZNS=C;R z&afU1++J)5=>=aV*vIJ~eXxA=$B2XFBm4VLKL~u}`u7LRpTOM(2g}EXd4_!1L9vch zOx)2Wog+|x6jQeyooxB&S-UrrHjOrZ&tCloPsKfH9oma-^0awGZDU&*ZCsgnX#2Dcprz#DfU+}y2!QN z$KMB>WUa`ZIoqIt#qDN9U$=(jo|}7oIy{x6b2rUbeR@rtzFy2*PQ?tp3W z={9~2KKHiV=F=wx<+*F+7N0&*c0laMC?<1Z{EpntTjTxilwpqQp91aHX|I;^btCW4 zT&Q$!bGUZ7XC>*c?g#b#n_oO8KJuXP+9+afN4M95hoczS&e`3%t?lgJ8 zr=J|8bAQQqefp_EI(L=a=hNo}>D)`Q!KV|Wm*CI7@(n(HVUW(fBAZE<&kUQOUGYLm z9qtiXv*W<6_$bZJ2-E*PtiwH@T89aS{7ZMCNA%GVjt8nI})>@riV_P4MUYQsDEHSei+hwNb@p($6jQ9 zOsJ!gd32}uDXN@eP`b`-g#5@nI{roA7<|bpGXGs@pjZvow{g2lA6r*ol8)0E&!qfG zb%k&EbYwnBUsPAv;?wJbbYyt5Paj7=X-D>~mtp@N%CO-=nG>Ofm*FG6zm8p{&j z-?Xt%+>O~5*!be-H~Kha*%s*H9`Xm@C7I46W~Tpc`Y0T2{tD{Jj#0YW5l!TG(_Ou0 z<1mI{jEHc4I*M_&I=m+`jgQ99<5oxZfS98%ywA%X>wukO` z(tbqZBc0Ft{8*;jByX&DyIAMSpSYWJ$#f0r*bTM^;N{u+4jql2^)WsDeZQ7RnwK5_ zZfB`SM*7}eeBUq6)|Zi#oz1+-IA~6k&sg{U{#^LX0>4@1bJf`7$+>EiInGs|MLC_T zK2dm5*5hRN{Q}FsYs|y@et-3ba``-SuG&@EJaQ$x3~%tU`r;Yg$vPAI%mhE$BQB() zito^gMxDSC-PVgwk*k*(+aAi9%;`R0pT}L4&xd*Af;{e>e3rc8NL!b+`&bOY$xjH% zaku1C!oa+Bk7t8INXsqhZU$&W7od7D3r$+LJe@AnsZ|IDw@Z{Wim zV0WUwNWXQDP8WH7Jg)+tzBRNlC?{GPT}4Cb3h6WG@wDg?6iP)Zi|7z4v#?-#w#<=eA z`(q=CCE1bDFoOV)KZ96&Hf;xT*ZTT3_y6uAI)7 zs$9?IQK1Jsh}%F8xf>uW`)x((HIk_;vadT#txw3nc;bU+^4)9c;!)I@8SHhBBK|kv zgT<~L$-H8yhCeetIIc+hEZwyEJm1$;e5CN;T)@3XN1lD()_I!yH1uGXThFMDmAfXh zw$-KSJc;&+6<6LxKC-;)kKml%J0AYNQsmz5C=zZz`d`9ry~9oSpXxqlkJlUdR^KmU z+#E0KzV`sPir66S$&2sB^Iz$OZj6jz!eH zSN;wm&PWv`k5{UF+FU&fo1J(|$t3>M4xK$V-%(9G{+_qCC{1K zKIAKP2bRC**zUjzIQ{*kM`1dC6O~^}`ZRyH+^k@48=7cu`?t_Uv{#(2==3c2r5%7K;aO!Y{6Gx<3&0<1{3so= zg5TgfLtx`br0=z4Jd`fhg4nIy0_|erZsSWCW!qrvmitfHR0RM_+;^EYJ_{7)g&H<1g`oyGn z&I|Z)qQ^zLs-mp+jI{TnJ075`&6$cz(Vcs*MTSy5P2C>wmk;$^?2$fjOzwdo&v*fx ze<2%%a@xlhy>tiKUhs+i-FD{KYy*=K%7{OGoEEWh%tLX%ji-sxQ9bEYqXoLn?v4m~ zns}Oor=h8MdNVYQdD_uPcvE)}PgDMO?vjGu9Ui{*gZ7N4skgw!E*|Gky0NMs#M9>x zt|q_UAF;yIyX?4x?_61Y6&glxyJ(@((^MnjKv_OL5EV*6mVURz`R8 zz&9VA6Yn8wJ!SD#mq-2UE7MjYTbD%r*O9J!uMaGN|1a10#O)VXGENSc;!^n0&pnj6 zUvWC>_}%94o2vVT=-2JM3x3Zf=zd?WvYjYCt6gXFE< zuUmu{>71p*wg)es&(XcQ!V5S_o^THGJUqi2`0^dNe(Y60v<~zBz`LByDxclEpx0xR zO~pLor}lRVoO5{GAG^N-d&puM@$vb68pRIk{-d_0i?-#wEi_;B3+@NtT{c!X?frrF zcKBF-m6N`szT)uPvK27M+u(UXFnAY?XDVR;TQEceqr)6*B`1g1l6K$@Qf-m0vAmD+28(waGwSL4^9QE8`qL?EeGlr37f4tA zFZ=quTYc);_v>ln3*<@fd`|z=xs89XcZ$$edhvStF1;um>|1&xBa2Z)m%ZfYAK}iN zeu2s~2-Zl&C|-=uV<|S-A+gURtNDv>Qe4Lz#{KH>+oQP&lL|%f*`VhFcR=*$A67*2vqNfs=}vb}*%DtS+%??{RfyQ{13>$jBM5 zRBz3g!rOy-@1tI-9c0z(xTLLLj450g)VZRv&Ur)B$&D>63hFGUj^|U!x$aC_f}Zen zmo4!!Ww`sP^s!s%3%XVDZ=uYDay$pvajfxDTS65vKw(|!hugqcXD?cs&;#h09?s@=A!E`5ZP3bMVkgIX)7JmA;rAu; z{{9x~ingCK+Ab}f1g?r#*ayGL20ValX$-U{Y4>#r9{Tc&ZhrA`w>{)n?*GJfE-LlH zGqyGYo?jbzn5NTd!+%RGJWKEAh2&de*xcGjlb(`%Cv79!);4DbiXUSxmHaP=@s_QG zO{s4MroSbIKGnX}7GU;L<{a!ht%E$Ao{z~sKghSlgbVc=s3&|p9GgqkrtSp*hc0+n zdMM1dzN;UyZ_!sjqKw%%@5e@BPOyA*p6~w;#(G^H;7q>9S91z?QCG{GpIb*!MrBDl*l+|Ixam0UBsNAb@{d8HU8I2A9AMS zD&7qaac5T@9Lw@svADY#`V5_aPH$^aoDEgI1e&MI3Z_} zowI=v#xfc{6KtI|+#+K@0}xK_&z+W();m@+;uMd5{qSj3a=d zKD9DV_wnp`!gvNA`2aklHRxs35e+57cTrAz!3+L9mSNSgIR25+J;UqD=VyDHr(&Nc zD_!Znr;cx0`zRlJTCmIeDL3@-z9)L@p)Vh}b$in>+qP$q+2(zY!c}@_wQwZHPv`QP zUu|uUz4fT}x+a3_c;SoweH?tZ6YCeQ6ZGAd26#w1r#9Jhc0OiwUCPHp%yy3R_$PWh zlze^DUH8ID|J()al>Q;#=!x!>UjrH3CA-aNJ(IfBQ@iax#t>LNq?`Vkf&KwEttoqu zgGxN`YYk}a;cX1vt)A#1e1#`^{pnx`Px+9%9;$?g+zr@WA-d0l`i3KZ%QpXQL*YjK zvObF8nLbk6(nnLHe%<@2eM;Y+r-yJgTG0OoD3kWH#dPR(_g4FU8w_MP^dCX5jox=A zpWDor%06IQUp8I3jk(A9FrvrS>nulpTwyuSpCk?sTD!DoLGY4*c6F#M;>al$S>_&&7@elJB)Lt#3&Om_Hun{@O7F}(5j zJ*5Xix$gDy705!!|N6e3;t6U_Wvz`5HkKpyrjP^dF;7ppmz>y z>pU9W1e}vA;Eb<;Lw*Vl`RW_KS!@E%qF;jlwR8D4>@njD*5V!TwDE=Yjj?FQKO5^D z?%&35r26`q4mA6AlEv^2);aP0lVzQA>8sK?Ir^@(sFP!pb;B9ixA@jEQAe&SzLTgd zzn7ZMsgwu7>S3Oj?khe49jR-u#)SF?yrfsm_KD%3yW;Og1p3D8AJaGKG6t_g=WySe z?W4~5QY<5~WB`ujPPy&KXPlkz!WV9536OE>s`tbj7b~f-`SJ(Z&Aw+%& zqDDkTL=w@G5G`7KLZt*El?R^+sI5;iB#}fQfh4GmTCvcI(g(iQ)wXUcpql-K)XWMZpnY8{NJDRz4w><`z6tKz6`(nc<#C9o^$TG=RSPN z(|3bvfFs=*V0=X|(4kii!M%pHQTSd*?l}Urv&H)Zw732?aEiZa@OXjSS9$z8V<;S(AUrH%xSD|n4jf;=muxY8|TZwqq6^%W;RqIx&yfKf9On@+12M3CUdBloPQSP=s|!M0yd=7B z0iR6e>GrJ%<2U%JlX+9;iP+Bv2g0%s4Bzy-3hqn+po#`RIzV7Hu}4EVU-^8N2PZ}aKNuRIf<8AI=uSzzuKPf+q`0=31kw4Db!{6ia zDdt!EzPV?uBA*O$6yCX)ew9xB>#@4K6@5b{(my8qvouGgFo!vNX7=3op46OjUjJQ^ zwP#)O0CW={iZ3*N(ksB2RZ)`K86n>Lh?~Wmm$Q(wt_)}FUJ2ip;hmEV=jvQIB{0bXWQV-Wd>jQYtyq|vU`OCW4NpQp-Yl>aMAZ{vT2(yNm@wLn~&MFZI>j?q+JlF z{mCUs18MrMXtrGEB}px5YD0Ku9_6hDzZN=7Tw@*HY}j6d%?zIwY9DjZzqV`hC$CIq zF@Cm(0-lS3C!X(l=tI#`?>?sEo1Sl!{^?~Ly>Bl2u8C})dp&I~ z5U()K@pqAOzIU+c)cq#6cb{SY91Ckd;AW>iuwAxKu+(Y)Gz(ukx%&un`4MF1XZ-$b za89>6@{^FRKJ3Ph?mh&sQKlI^)BPWWH=UH|yywq%5Wn8b@CD^gX4yn#JhN*K+REMzDxhAdiUDerxFY@IyUGHx9ft$u?x#xHFLHj9Ydyp^N zK{~hqxw7-u-(;_r^fGMmP)7ENY>@uMm-)ufG6tupdf=BTvxjzpp?zoJCp^p^0k0px zSAnK=&@_I(JK#F+axZJ(qW8D8pYjZ4GaKQ}FEgfJt{ym(c=s0xe~~dH-s{WC&K_0| z-ZDOU0Q#Kx0(HJ%d|-O;dC`ot9^f4OHhPde`1z>x;5*q%*E`uNzg^`h^G$yBPIm9} zjLq|rtx8yW2c9%rbshWn%FpO*EN4Z_!+s@ck4gt`8=th&2imeZsX4r(_N+U;h5XE4 zjZb<%LmQ$cG>H4vT|Xu%tj>}3ZJWEtC+`He|M)j>eg+ zThg?jr8kpv?#FzbHa|`tV_D(fZ?ZT%(&^u;Q{48*Kg0K8G!A~_BV7p|I#+#SD|8F> z81DiT@W6K^a{<3cJe?lNqf>oEr#Me^A}>p)I8SsUFH0x#a_B^!(TO*6 zvvg7!(Fr_6C(HNsY`tB}eC&M!%yTKca1Vt%D_;w|@#%T?ZpzFSEjK`y4e+nkVg3Ce za{6HPz$2nrJK=Wtki3JW$xdGTcILsGp(E*iq#+A-Z(8O4pkArnUi{!!UOdwPTx~o zwcuV0E_d=<&+jxRowH5v^nPX=`BkLfiTnk5AuKv~dRtukqdE_$xm@@^sXD}kgY7F% zqu*1j2iD>*R=d{5SuVBj-gidwA(bCb`Zu7(-=+HXQPQ+OaL}K9S{~P(;_LF(?}Ms4 ziN5gu^#=N)wTac4Qay01uhV@oi()0$Kd!d^w)Ta4+0MqhdU3F+bOz#>E(}c z%jSt6$;--goF{%HZ&+TH?2S1Z0}Fn&dVPrktiuD++z{Y~tD z^17*ev3{vjrQdI(&-vB&FtiT!dltKfJE!sT#grdgJ#b>vsY%Y;zMBT$IMI4eXXbC=#<&^mU2 z?<%ElE8Nrn-wLxn)LRYzW$9Ymac<~TH}Jq`;IUKvT+(?)@}!UJdk7zk^Y)#QYz=v= zmA1rrnF-0}kjI+w(Kzqg3CY7DkM--~eQA5zZ<@GWINsI&b!e=+xL?yR^}ot5^Vu%> zq%LHfj2^NZuSDjqMDGW?k+8-uYc~=WZ8cu98<%VBW-^!0@O(A{o}rHB@ll@747U78 z;1kJXWiWG7qCui0|i8{^v>Q#~*`)GKxatKRT!k4yV7 zrPO?)@bKuQ16mlL70u83|AZ%gxLuW`RZv!KgtUs{qI4X5nTnz!`B#Bel-vxgG(0+~ zBdosXysNz@_e{U(BIzXhGDP2aUBo=QWC#AbPca5||7SfuDSUVOK6q%W#<%q{`!Lp* zV)-M(S$@8sSLA&|$gzA7Te5GL;-ez2J8^4;yMF^$dpW(qpQJja_}oboEo8UKAEPwU zD9|I&F!<(Q^)`fHSvlw=dZ@1GuV4ArbXUv5;2z)#_XEhW_Mn7gf${9QP zG5ev*_C1q!cka1!cjlN|Tj$%AJ^7WaE*PC07yW=2=q&r?)AG&1@3e7-;-4UH_6a&c zzNmX;w`?Dmto^Xld{10`m0T~UuJni55$FK($)l4b-|{DKR2#b| zB=1oh=mLXTl-CCFFu#CnDkI3FwE-V4R2#uoLGGu^HVJJYOV$Rq(HymbOj;Yod2JBy zMSez-r%TiZa%}w=TRl)3w^8WZ`2K|CZ7L@_tFYSI88xnY;3QvG?TX(n^<$xR*4smv z_Nz3Ol&R!b^vU(VMfV7pAG6;h&Y#~?S$avd@qXp(y7e~FcHp~{5BwlLBHeA$e9U=a zJ9jnK+P|m29GQDsY0y|c*COEqox}Iht^>}s-%Dw!JEgx;cr14H*wn6mG1$-g?iT67 zMSDNCCIwEsCe?ZnAC|qRk1x^Q^UrX8;j=M}=*|A{Eu3&K#BB5^Kfj&Bj7>Nr?szw$ z^7|*AKEl|<<+9&lDR;xBXUdshz`v5QJPiKX@2gyx^5F3e(YK2WqrERbHV4IX%oRcQ z7BK&%_SO`$x3mvYkm2nq=qz8K_M8@You#n+abZzq_9>0eIH>?pii2Qj27^v`8fO@RGL>k@FC!t{9IO;v_^F_ zrn>hj+?z?4E*Gp&wjro3biyZiJ@&$5oMF3uP(~FNev~y| zLWaKT+}Jztt$gac@ZTKsGafbH$~E+f^1)Z6@72UUl?Lc9pGx0!?3F9iF*N_!oIzho zN${nRW_){PF5lXDvzg=}!LcTyp5@Cu$0M6k=P9}4Z0{(E$36+&1n0KEBubJX#k`*%ZHu}|AIKG`4A#`&~gk52w6q?LM}>nu#Z5z;1D zIlHI))sQw3o)E73W)^QCS(rDE?3Xu=rb>rZQ3k!+N4bj2qwuUKe5p(Gp@-fC63r^a z1ISbb{m@v5-)@J-+lx~gU;I`yo(7Gl<DuM(s-NKYh2PXA|}S^Zmhke&IRU1vmbVe!@>h;>GbP z%@d`8r{X8TNAuHOe@9j@fANJB<~U%^{0?Qu(9bdSS>s9Bcr0!1_vJ-{^c+d_HbBkb zz49_(X`j1Eb0_|D>mU6TZADM_i}!sy1D@Jj)ZV^)7@gj~QOR0JcJA}Ep>>1Wk}YQ6 zI#PXTT$25kG%&$cXP;tRvv-D(b!g~m$~vI9TKik(N4Z9DvG=9(wWhcWd>FgS)ZS%2 zPq3MXv-M;BeoIuoBEZ5vl08Hl%LGSbMfhl@;LPlP@nVe+a$#+QPY?3OeT4y~hxRe> z4L9K{{?zx(Hf&AzS9PDf68gF3N_YnRX;bvGd*-F#yVRUHgU;c-h15yzmlLA|9^?-xca`>I_aYW~V3deAF>m2TGP2ybENlE8$ zHdhV(e8kiB5%$98y0s;zXZ^Na!Je{vedsfLUl*Mb_N5Qvcijx!%|{E9Co9}j;m!=c z|EMnaG|-*?O#QaaSB*{{8=-7>ePNOc zA4@RJ(WDP`nM1J7x|@$>WE&~J1^ z1|L0mr~USE?PqTHy2k1)b^|lOJ0GXO3)WZOof6H}KjDj9m$Dbo)e5g~q%UsENy$dx ziH_1dx;N05u;|1$>8os>)|q%7^0=Cx~WRgX#D1FS9Bn{NI*JL3}idp>l<9yoBa z`b~YqXEA*r`{wiNFQ!o***d=APVPzF!CAmD{=VY~YdPi}!A$4ARQE3ka!9(hi*9)< zSyh{o*NG?ep330*DCgUJ$bP>6UN*J)0<-googW+IVdmy6jS0s*d=oU)UQii!(@)fI z^sjUy^t3swGv+kNDa9ckS8kx%!+ZTpKd$- zRsUwtuG-A;V{XztSl)2hFp+O{oRr>!{ovVl_f_`C4(yMe%!|*;r^kF6-VzC8Vtzhs zgiJWs&U~PEHFjciq-W^P>z}1J0!U|4V&6gcM(zeqdIlUgHdYICmPY$FqzgyQ$$A%A zZzK;XL%Par-^1PtayUijACN!orSO;-cGI2xAOCOJN&YS!`r=H==sT1jA-z{?3v`6u zm#CxN@*kd=yj?Iz+rb^2Djz0qo6fvVv%0tSKLEc}Q(ouwYZ;I2g=b=)P3V_>+*vb$ zyD}4Yr?}s`JHwt|iGR1Cdum~#dEz(RUDjE(I`(8XD0tcTzFX>2T@nM?K$b|Jd;149Y(P|CKN=g>>FH?&LiR)=9=g zDnGF0#MA%9-*(1Dupbnk6yDZ9hWg6ypMLVev~);@Oc?fl+uxaaVs(v5!P z89pzaoqQ5_v}=75{2$QfccOORD|(0W-#Rt8?Wg)(~Y0U0-3HTUcO+al5ngd_1!(uTsFg~%22aVK&%4PDt; zbL;M2|2~HLc&%uvvsW{q7 z{URsp?DzKmc7AogJnS<|M<3ttUgq5Q@O_SOH#xl{)LR(I17XPn{Wacc(s}h8=h^&< zoqLAL2K%>r4C~Sw=fA0>^eaqWWYVT3*Vtmk#jrruqrRyW@SN;+|srJQ#F7LzEd%^aC z&ed9Xn|-eb8&0}?@0ipsjo*!k-+y}1`z&p3MjL%op&M<;XJTokQ5w2cwpeGd#n7v? zXEJPORmqzxU05+Gc~Rr%X|Hvg*1{8@jpmO!*#%FXob1Ri!ycBs3mD3L?c_u}8N<=p z7|}8Q>lMzL+nIm%!mrBHKK##rjhvvnwHM!~Fgn@BQtkJjoNRqs`m45IcjmVEu;ErV zF4-LN(A$s3c}?Szhlz(X|FU;0f_+R_x)u7EjF~MwCfXkwSD9UN1v~D34_k6y%y?^V z`I`%oC)$09U-iZKgZ^n9y@vh?XWg$kPTk`h79t1!t*Aor?iki;1$KvqIpC=5=)VL` z`Zl8NnZA_5Ozpp3KSow|*SLiB3T3DCUr)Q*^N~FPO?GKt{$9aR8Zvkd<08E(oOBLD zINMnbcusbScsAI9+Vj^sPkuLj?+*QXbo0F>$(dFMJBB(718l+%5SF~kR&xvI4V0-Z z=^J=b{PPU?vJVeV@!!6KFEz*O?0Saspb zz?bq-X;18@wBw-ZfyZbYT_PPXeG~d){!3_B5B=(IIVE|``c>OMoq8&JD)n;K1o4?3 zwehUm|CgWeI?T(h*@%qyFC;Ux#aQnvXTJYjXR2e&KFlk7kg~=@j8*nrmdC6^+%<;&Kr_vZO^RkT5v|%cBr52oBBOt@T{6(Wb@Q-^1@lQoILfL zykTjgzLPhECgH3ad4^Z|Zs!o1=&V|{FW7nTw9$60jq%<6$Lwvfbe$3IYliiP_WAaR zuUJ3m?2=@2C;C&edjaX`9aNo(NY6{E%v|vdd;U|5XVUcs_bpOA!y3WH^KrNK(c&=1 z+_}b<=|dOj43unc&6iqFn5@Ce@cfI?foey7m=haZ*C~4EZ6#QqEED9Pc^IR~mSls>x}cnVvbK3w7B zqU}thxz>Y|`Y{IOcP06mRd*&H6`l@+9a#^a;> zEI*6aPmTCF&J(Ybm*wX;PrOcEmY>PXk#X|Wch=W~GOjW<=be|zc&LMnzY^I=ng_1| z-*)Poo#gAJYsK@@b)v6p@;)|__W(1ZCxBMGAJ1W~$bFa$iuF${hty03+({`?)vPgc$;;r(>93)@5Ve(YIheTNC z4l2mc6r{eG{CYues4dy_pNj06*St*R_)YSB&%h|+Jx>eI2f$M}hOz-?!8ab>8uPG+5qOw9Yj-R9=c1U0Bitp& zkHtJ3<*Co)4f1f5r#_Q6EIrh3@`lhO@GyCX7iSCxd3dmoDG&R;L_B&9EN=}Oyl`D=i|JeL}@P^D%jsQ2U)`BrMTuM`MVyZeeZ97v3pKBC+Hi$ zFK?Q-`(EkY=q$%J2#ED@_G|yJL#9G-74QM^Jm)b8T9dt-4kt2 zO5dW@-5B-xNwXsaV`+bHD|2saw5}%{uj|nV>Gx?VC;rk~cb(b2R{GAoEZduMyKK*k zxXN|2R=f0E?Bfe(*71E`0!!{Ze^YY&c`Y9@nOo4t}-V+M%(1q$ydK@a&izK z*KGK_EcnSoUdQBQ6n7P_P@eb0s@~%o)2+bR${j(Imr)7x#X$FC)dSB%vu?rv7;AXq zy5BYo-|yP|xpR_Yl_h^Qzmu37JWjjH-#01Q2~LxMz5V1=kJ|mi3EamX!yX^$ypv*m zbfk%&e@CZ1C^LeEA5!d`PFRT@mMjtDI ztMuLtw6j5F3XVPN=k?w(_ykEedQ-N5vIi++`{GsUzW6_}2WfiJ>Za=}D^GiSgU?NE zGvAG**UabiVA`jPMDup&`XIO|+)B8;df=bbZ}gY+h4_}f**;CiWwvGtIB&O-yp^n_ zR4$AQ@x#=WF4owDJ!ScJG|!@!c5QxYQnEw)sFW*GUCI{nyGwjXpQX3AOh|P~mY4X> z>JioP`jR(KjE_}5@Id#oMTyo_g=K?xT&=yYoSS@5b*EGhd`2?yMd(gjl39Eu_HEXm z8tm$UpXs-revwzJKGzE$ckH5Y9)t8(D8pKL7hly&wt9H~DtMIro$90CrOPYAJ_vQb z80x%da`Jv(=Nqa+xr5X@M457M`3Kd%Gj0FR4Hmq9C-;XP>9>7SfjN}X5yy208nJf?*{%^^~dAWM*pn_mrz&hL#uz+l;j^(=2Y67Q$6riA5LLUN&Z1` z@E9lBl0VjH%wD~IXChnwkNg?Xh45&l&8Qyug5ww2R9n4YWDLeSTW4;G<~r$3_ip1d=Qo8)ILVs9q(Z|hw}Tk{vYq!}42E`IIPTlmd9T>MP>4ItjsL06tC zJfNrSDcUssqBoE}NLxC;nDb87rgZ&#@RSr6eV>FfUFL^{CVC&}FtjReZoUe5oOddo z&N8SF?Ui{J6u_FCSXp=tSAD7Jo|^1tY)^eh;6%6d6Cgw=gqZ zXM&pGn@quZiS~^6PSMs%`0g-tIRa0tqHjNk9*YXbZe3X5X7y3O^5K)0GOwN9S6Dn< zx=N?K_#5754q@%7HKLwWwfp7#apbKSl{mOG?IU&PBs;L@4pn^`*~jJWz;># z*Z(zevt{vde2q6r@MS0ej;O`*M#xchy?R`|>nfmE{|M7RwPisSc`sqe=27jW{-+Fw__d&hwhj<@y zTUd9b_00!T75PBugW(cvOITt=|lg?r(pgMbh-Q=SHip6lVfhR`vj6L z`Swq=yRNcl(>Z~+76$$H%nMn+J>j{M0sQml0w?RYPyG;pSGXD~Qdg^1X%3NBo{591A^;V^aC=#ST8P*meDn-uPi2$3Eynmzf-E-+Hf?N9`So z7k|eYU5%mU_Zy(A!WO3w3w&JkpKmmm-~K%F+slVF&GWd*%eR{2yWcZ-cK3-*sVvwY zGq^J^ZgbzClAKHZGx?*hc2{r;>vhSDl^f&Bm6au@Q|9DQj($#v%Q0RC@7}T`Lzz*b z+*syvUoOQhItRQd_w6p)xA(hxpk+6>=DgvRSGJq>zws7jVt9x1${yeFGT%LN$$U$H zweyw2+V7qiri~AQ`&;25UHoQcVm$Wd;W1pB$y=0(;eFx{C_Cqad3Z*=q4Dlv3=cBi z!9TBie1BwhqA}YeTWRnuN1X@Vi67!cd=Smp0F_1O>I~wpOwpudQGr{VDSiCYsm+9+ z-`i6e?5WIe-v4dWPkx`j3VxBCihxp zfIq^!&C-9elg#GD&MQWz%Vv|U$C>nD$3VKRhCl05u{*|hOMh=(fEH;#*?;?k`)PIl zfPRX!v(8ud+0q zJC9|3aPA26L8ja#TKnvikK6MYxZB!ii{ySbK9YiJ%?0>7PD?&cInH-4SBaX>ww^ABR%qKZ?nAv@YR^w+87-5mV)%~*Ex$XybBmJ8z1`gX1MRx=dNu= z<{Ql`g6jqz`SxGIqZ*SF5ghS=Xg(^uXD_}0zUirlM~^Qa=hu0qQ6_qdPohG5O1dBA``!&+x^r=+-MNU`*fe-n6dudozZAW77H-ET z?N{mye!3SepRLX!eo*aCWsIlseIbRhQ*F<{Ej9-q zNkPHd@IAP`IUBo#zigJ*PqJ@0FFHcni}j=SFKn*5O8MgV$2oTbT^1cC{z84>e)%eF zd<0K^AmHmehPwMDxm+|s^2zyb;ApQwdSkUu>#3qYj9qgmbEt5?Wbuy`e>OeyeKld( zdD1;QXzw24I-8;RD8}v%l_lH*Upz)wzN47_@fiLCG&r#*ljOYrwP&ckD47X&W@Q^{ zt^QrcWV>uZ=Fe{vmMy5cs#amfK>oPEj|zwV#wb%iJD6PbDpB>@HHE|Sg&l;dPQ@_;lknl4C1BUL&?v+pR_EEEX^*g0- z7H@TQotViVyeVIA;JrTjC7D>BNpTfjf=@6bU%Y=GI`bR1w%VWn;GUwL?|CKQr#Swg z>Nw8XnpeV}pYrjk)%o}Z&{in`RIFG-+E33PdmYK+U zh(7dk1~oI0e$p2Um%FtnHKTKgTORfLRQAHx&dE&1Z;L+A`pVWy&>+w)(81wno zj`UJ4KVw6pdty883*txmGLjuv5$1J2Cz`%Q4+T3eo(sDK3p#i^ZrHhSmHGvZa`aAN z5%>H~=bqnq&f$+va&blmk*OYJhV$?P-8JZT=7v!dc{2`~KLWhoLg-1qGNssXG0$oY zz*Rh(DIaxgkKcQa_b!wk?lMYlRo=ec!8};PoF!WIp+6;$74SG`^cG>?&$4kO-FN}o z=-aTuZ7eo7{&#qSy?W>>AFlC&$3uJ)-*Gpa4E%=Rz}U;4%i=(MSR6<<9N?#)t1aOR zeY0hYrexQi6_e+I|HLH~lSj=mI%@vIu92Tk^P%SYer)GA2UO4SM?88xWzI$R!_5KqzQ+0kOE32|yv}fOQC-Qc?8#usN zHt9Zb>Gj!tz!UXu;49M0waDF4bjQ-1GcZRpA3Wdox=lvzq|D8fxp}ZmR;Q3|Wp1a; zV#+KYrVQySQ^EJI>|7~r&85HPpFBUg2if25_t4)pWG0Y3GG}Mm)U!MQbQRR_L>9yAD*Agj_P)L9PQ3lDD&I%lgpwq6{Au-$Hwr_ zn3_~YWjcKs^?SHKowH(Xm6Vqias~3y1BV$S+WK2%EnIfl4x&xL@QlaCfv;;&GriLb@qMQ)&~*bN+^?<>m-ld5rizowM=c>?po)I#*m2eRL8xDLEFUo@m9p-<lW`JF^GiBktLcNqT^DT|v6ufu|1eR(Hyy_29z%^Jcp7 zOKJ;!id-egRqk4$Mr(!i?Nj85^Vsvcnmj!oghu!3orR63C-*acA%CyW4|(^Iw@PJ& z>nBf3iiii_6=jXqve{*eL3`Vekz6$E{mgfd>I!g{QST1m$QQmXZEu?^9W&sN@h1fn zzqj`8q1UlWZ^wa?=>U7n2fu5kx$mmX-@ELa{0nqfl=|6xZ}(_Ss~HQo@3iC%=o9YL zfuF}W-Mb6CVe23CyLe-Pcx+;6qP33T$o6Om_+DI)&JmZDCVND8=333W0j|x#G0%~w zxi<^5cOU_gD9eP;C9UJPHQXQBGF_~d_Sua|k(T|Rd}VNc_2 zqH#5J&^RhxuyfAkM?9c$v;771ZG4_W<0pGV^fh_pYy^F}Ot4bBf;|J)h_Y#Vry-N% z`@F8brT(s0fDvrvT5RQ7Y?sFwuW&A#@s+I;`>D6EKBui&c5WjtZ^7s^Z;kK}EWY1T z@O!`#KMc3;aCd;iTHybR)826@P74Dp_LBdvuoj$>!n!=bVh!?tg|)@QDi5$&-@KSd zE8PVVuWJnWHr$cJ&{TRZe2+%!X4zxtv3>dm%_oCh`D)o#*_Fi}_DJ*w7qd3@?}ldgb=0Slf^7#_yBeRDhkHY$hdjRHD1WGZC;rRO<}mW8 zJhd@a^^n<$^;M}JQ=I;ewf4SAdt;xG{HQ!@yMED0y5&ZXqqPB^Df~*_ph;n?Y}}_& zUiLfbuV8H7Q_ET9!S`iyY_BUmumssTnqzzIIca~Bblfb>kN8z&d)&0Ks0d*bI)RVK9~ ze!<-Q`5mKj?1|~)upvsZA)e*^(p(#2-{#DP36}+Q-n6Ut_B+~7JdV>A$UJ5$KO~u_>JVae(F1))c-Tq z-*zulW5QVM^?XsGv7V1jPP*E#IcobENyagUarc4Wt_A*W)LS&xoRy$#m)2H)uJ{al zSL{XPcu^bi{Q8>zGABGTX3d|!BOx2OU3mAeazTRFx`Kq46 zg5+-KEgKVic?tG%o7v0ojPW+SC%@i}wBf1?lGimh@RoQfhqihfhag`Xv9}*wM(o|7Pxp>*jMe4b|P7rViEJSMqK>GB`wMqhsGK ze9@V<)~rA89e{z)fm>LUWp(JGf~*cT+vTNcNi*$p?z@Y5 zqAL@x!EE1Wa1G{UJ9AD`>)1oIE&ee5NuP{Yt^tR)(4WiHR?wfD^44I5L+zMP^DUJ8 z@zOcx@wBbEUc4!O+Uv(_fpqC-d6UGi9c1@ttstM~C$)D0Uw6aPYta9)@r8GKHf+!? z$oKj5!N(cs?Z((SP8Z%9B}|*sp$jZ}mC$RK;8H zH+{b+{Vnvr?2&e6eIj>Tp8A`?zSFx9`i6Gkwd-fdBPq|@&^Me|w8yJlVbevWjQ(j^;u zKT&6(1+$O3;honlUbksn#pl)Jg)tVaYom7lnRc`;v37t}u6E!9)0L!azcuvfCu)QF zReR^*47KWJ%RE<={7_}8&<9o68Q~ry;l3HE41YD;T_i2T*-P`IlGmp=GHz?1X(`M( zf;AObQ{i*JcIhS@&Mio`{`7QoG--X*k-e#YD6V&pD+Dwl0 zUIBUf4wU*Knra=SG+XOTDV(P> z#8-b#dXU?zM8i{|2e4y&)mE54l%GN7iv3)p`9GY&)7ZWZc-ekMu)>)c$+vLTTr2q& zY=w31MzVdJ`oZQ^JNSK<37)=-q&X&SpL(K!XysvL`G~mQ%o87}e=Wd!8J#8=sh?u_ z?@ViNa--(uGM9XVIt%o@_}6N(-!YBPwk;&D@*n3JjYb98C}f;@1J>%zJ=5NxRk#2c zzXBd}v++(J?Y){jaK)r?Ah zJats^P1!<^VbeZ_P3z^s>dlGDW5;SQp*#30=FmrARxrML_d{*!PcS+|nZ=ZW|3@pG zc4L{AucjJWy6T*@d)7CSpQkmH*DgXCg&)pDDpShY}j#ecqBYW>5;0UkR zD9gU5y%Fo$f>U%X~XCRL`$-MrvnA)Xw9+oyYj)4D1N6tk*$yWIFX|mt)-WuIAc&2%QWNz}sb{5*gvk0TNE0lie zx#pAB{*&&h?!?A>cGKkk=dhimv$uGALwf9f+R{5+w7admdUmpN)W!pS;D?SdUR0Sn zU&h|Lkj=9xe%oluZoPxcns-2Q-&u3+?w7Hp^c_dtJNk=<;KOOo&T=8&FR9;JLz|y- zDs_^AV^v|Dq4?d!$3EwEbT4tiQyu-uo)*kc2&SJO7X+A^Q;>Jf*;|5-lQ4R#tGW22 zOBT-jN*nZDxg)@)eDDn!Y~(<&9}#S1Tl07pj$|A;(|T&JpXVi8-)o~R{S5fY-s$zU zEn^&HYy5LmrnBa*-5PWFzbk#qE}d6YFW4%gt?XmUn10LkiAQJ53&jhA?`?*0&L7`q zvz@h89DD<|n027|xsv@9Y^}k&hS)^eJl)464_R2I{>fg-=J|VwF3QUQGow3*XR((? zJ=I~HyP%hyD^vZ{UiI%LDy}-*HH6o!4e{D+;Tx45(zbA(`X)G&HzLmDjfgXOhV#^s zao&R6X6p~|)7$5B8)f*}!zSTTiNnQM2U1Rh4mioQlfN#k&JkA1-0?)U5?%KT&n;d`kB*|zcumlHP zGPaX83P41U{)k%4D+FIrh~D&#e1Y-#2Jf5cl8$fk_-W5x z@i0Gu-%EbHhs=HVdY-(NI`P>}tph7rH^}}7Z*ps{%Zy9cQuZb{wuPmYMro`wv|j2A zYhP@DfY%h-&|2=FvD<0)GU0TNPn#=S<2@HAe+#`|@wSuk8axI5Hg@u7X}*7zJD&=d zOV^%Vnf$$v%ij1~A2xWb$Nz@7+OahqV<0|-&~AO zWlH~F2oCLQE!8XAMrT$p9JO|b=T%E9La)pnJilRS#iY$DSX&ot8r2;~+T?<@uX_4h zJG`T#b`rG{;2$r{tye^wb%nY0c>hNAHi?$hv%cT;_T&SsH#S7{v^IG6Mr9w0%dSbw zuE{UUdp9b(Ixf38E!&u1_ET@SvdiPLucT$~$S?bywCwGawXp$b>Eo>ZF=kNyMTcyj z(lt;5dT&hpBUm3F0=X*LVR@^FAed}r}1$i{-ZQr9O4&WZuPUWvO0|ykT3bn zes3e13$!N^_MlWQl|%fJ-XAAFW3->M$`Z0{Za#v=@dBI<~s{j~Z z2VPmOztYP50sczE>mlH1{BrtG6YXmiPU+WKo73>`+xb}RqP^ZWk&UD|ywlqovZXZN zof_81h3DBGv+P@y+gp~}EdD*uZROY(e@^?le<+(4IA&)lEZa-Gr@FE^ROd;`df&F4 zGt?N%ehPbLcIS}0xk@*me4*CE#YYZ?wMn6WkC-*ujO?ytkx2t*?<}}^${iW6( z_zp7X1ia)&NYA%6PYm|;U|Rfs@lQ|IKAPW)IxDUJGW$w~8~Z{2{o*6%2Rj|OFOV+2 zHk!7dbJh0tJFaS{&*@t~cl7gZ&Z|Ow!x4D8+mq%GzK3i$YhIp_`ce93R1dr;T4=pi zP;x|Tvh1B6^0M}U`~cCq$M!h1&Xe6BA4Ih7$ywKVe}t9y?dqFs+80#YCY#=;(^o~@ z@Zeq=YYP0U%hV^;RUUT!v0}~_OBT(S!W$CEy>#qN_*UhO3=znb>Pe#MvuA6bUAjrE1`a`gFr z<#}IOr{AB`zE%(Q4&oQndgc(i?Hgm=Q-`F($kQH<_O#2TgPyu9nTMRcoR=?t&^oFI z`pC!nW%5JaO41LDW(6hiOu9!G`ldBhAN`ZeiXM8y=nQb2BwABPIL{W&er<*y++h&mP#gbCd9@e+NuHbhdO-7stzW@icaR74rY_?lyuDB zO$Vg=y;>h#Bbxa+3Vm*C9NM#Qbruxpn~JRKIqUL8=%BMMpA!8TZ#yqh;B4KKo}EbX z$+0oxGYRP3@ScYBY|xFp^m$9Pj;^3jS`#h?FVl@Kb7Z6Mhvq@>IV0yz->GR|4`%fa zXKLsd-($S$UcSv|HZJf&+MT3f@4m!qDeOWCxd<~!OY^Qdcu*h(>;FS zsCS8kKlfs~IQNu(FD$k5jaRH+jH&PlYx$jFFHwCaPr4d7{Glh&pRWX6r8xR2tGg6u zjrB_4F~wP1_4v5js1Q7Gtbk9nU!gy(tFpFL9)I}x*WYUqF2zT7X6L%}yiG>>o3&7A z$Ig{U?Wq5n-_Mp$-R9Za{+Br)HXQ81c{GBJf2-WLnGak1D7mhs4Ye~I%$@$5+uASL zp>t{cZsAQf@rc5IG6F8c_LF&iq<-qGg5k%wSCp~_hG+JbxTj=~s~x@Dq2Igs7Mu3A zb>=?UrcXz-dFT(p2jAUD`24-}3hjx9gjbfoh8sUia|1~dwFW4M8TLY~3pjmN-0`EVtF;vb#+ zwSIYgVwgMq8(SLBQrgw;kq`4*$QV+;2f1IkW)Qc`2)G4)%E2ufzkJ+&#Q24>Irs$m z_qc{Wjzl|+pTYKgY5ny5R(OaXV$T z<;`#o?c~${V0fd#_sQ`7A4c8OveEn6d8(^AI@wL1V17 z#4uz0R7|gE59s%%7xt^>v*3dt^7cOKL(y070~}-xXy-Q2+j=|bKQq`u$dG*S!DeNB z(Ul47dd_(0Tv!QwI8SrUR5zgcK`_F3v10O+ZeutV-Y#@z!!<=RC;aa9bo&u)cB5-@ zzTX&~Er|CVvgboLq5rW>wSKj;n8=RSqS`Y*llM!5t(v_rJ?^znZ^s7E+O+3c)&$Iv z?}E;@htC``ifiwi=Cg5*^HhlM0HuX{W^I1v#b0?mb-KKY&U*2@yZhh-1$S7ya zcfVXSW%u??Kf1Q8VB_rVoBsXUvZ9T%ZJh#Mp9B6Az}G#Gt-!CGz}r@gCq9G}e&*_A zG4M6V^ufD2le>sL(-$|LyZePboChhK419ej>j&35ga5;89q^53fIlq$jL`!6+qr3C z+D7%&$ve~rW01CSPX80!?|*UAIka&OZA_w#Nwo2XZ{y$Ix(#@yi8gxg| zM704QsSTZ_eZ6qwlEd8B?`!29pLTv9#2(x9kJd)_rmw$s8_aE6)W$WwjpwdToW=t9 zS{qAlOL!0e@M2)!OdCu2y$jI)26kcr2P$6hj-AuL@EZ(pXkzJ)U9d+3+zqj&rWTiNT8uSclA zsd`Wz3G04jjyw`KST%fSMX)v?ll6tkuJtFLKCzPUN_+2cpT6h%^D)RNX}weCc5Nw5 z&oXvD?R}WP9g}<$K1cuCnl+n#T_*WQ(zk~_PRjQcrfZPyL!*(w9ZG~)3$LUe9T z{s)7zHqdde@`^tZKW^$*>&7jT(zD?o7R_BJ2WEt^;t=vOkypb#W zrfm=7Gmi5EdJ{!_&?;I`=F|KN*U;x~!hcMfwF&GeRj!tAE9so*Gj8C6;#J1yYK;%y zt3`GPy6>zW_>#)qPWX0kBA!1!2e0?v0G{Rsj5qErNhYWcxb#qGfrZoh>j<;1J*qR+ z`Udb6wY8D9mXg2J<2;4A{Cd6tJgu7Vxs!e~aL9|l0c`E?4dDMh$+tt9w}*BJ->ILHEXQoM*PPXeHaiVBsS>Q*h4maQM#0QO>lzB|nV! zW6L)`eylTa-j@vkyjj>LcIMj2Z^qfa z?=_uxdOv@%m%6|sEtmQ*UiEgSe4Nl>pT4p132;ZJy(F9ijIUGw6%PX$U=3yEkCty6 zo813|*7@gw6Z;Bbzk#r1S>GE5*0LDZ7lHG659^PGkIFJ<%Xg`AiWgH?^S=43v2_Cs zD=WCcPaWC8d&3#N2wv*T_qgD*32;Kcwt>eJ9+x)ti@LvJtsC}F!rnx%CmncxjWN=< zGi6iSHw5s>ORru?dN>yu>@t;su1CvvjZMmoPI~W@w@b5h^7|*?R-GM-yZYY`tbpSR z@T>DUE;JnP>VM5}Oz#4{06g)K-A_R-h2t~gBXo#-?>oppNV;(RZ4rD+S|9O%qsoBe zK7AMTf8?*6iaznYvw(Kz@n`Gcspy|@Plm9K@8j(I1pggreVhDu1(4HT;~{?4-N7E{Vz%(i=(_^QDC227D0waSIEX*=C!8+_rsz9Uu+ek5{_f}u z>M;J9Ey3T5OjH0*{@i;RC%65i!bxa6S@zyuF32&$;&?{hN8T!uAoh zX800y%c4ERkpEVDh(E>m5!&azlC8CJ`xEWCdVi|cV^ikhkI?Uh&U~u9|MVwID&~H^ zt>WF-XQX%T`{O0OtG?V;acdf1(DG+X_I~8~wu<-q`160Zr1yoF+A8i& z3H#MCO@*82InVnQ%qEAX;z{W++4N@5&#mq{QdsihO78P-rLWqTfu^&}CMQqt(mtA% z8~mNrL$-L+j{A!j3SK6ufHo>GS_S^m_(|u8KYs}AbM_2|!9TR8y|56@^tiQQUs-9a z$GY_P<|1(A`$t`RlTY^sgs<9VP0*z}VQoKLogkCH0VkbJ8?MZ-aG}HR3s?Rx(do~i zlftaemuQ_U{qR5BHxRC&kNO@`mX_n7y{BcSe6EdA#c@9tqV@3w-_A^~e$vVh#Ob#T zrvD~Rf6rk0u{izS!Sr9m=}m*_eR2Al!StWR=?@L2_i#7S_ZvBTigSg=3pOUDjH5qy zWc_|O<|Zn%-qtYnfZ%o2OLSOdgK1x zAv~S%qJ`s^F1m3s-wrET6sKn@7p3vZZmr6ZKi2Yj4He>SCV$o z8!LB*a24T|^G{#8a^Vfr`EJ>wIDOH$#f!3Vq3>Wj8@q<1$E(ml^Lhpuu{U=WMh1B2 zqRZ0ZbG;>FVR#vvBn`u_z0-Ucp6s3K!_9>8S6lhjgeNiPjC)Myl5i%FbN7d*Rd@CA zS2=-iQcPSl{Rm;DEvg*5bkW6&r!zk+%BIy#T)L<+O+&AaRlUPgsasG|VrB4;FDj@i zQ61%r4=Uls%F-!G<$BROP1CrBxXx(wT?wB2Wr{{E%@i-3eweV*DlZ+kwDR&rj3aNJ zhqPPITw3|wG)-j=W8~E&9lHk|Pic&;rQJ#zZCDy(Y-!jKoRvt^ z7;8(zj<7LOUB=wf>PQ2BtIOD1S|e%D-_qa#OKT>LF}5^#!O~W{F27#NxqpTZw>8Bw z?zJ7?a2xBSTk$)k@6+nNjqH9nx@oVs^?I>6^mc&uuyw{;Hbm zzaq=Mg_J1(C%*Mj$+teBcXq#CT;IxfhI`?k6j{HRv&}(nlJ8G|I(<+Ban>|b# z^FgS47`QKB2ZgtCdeydg23+)gi4#*jPK>K?TIBZ(#i!DjpN9s;Y@u|F1;n^dBKzHr^`IKTP_{f|FNPzOk~u^7td)t}H5f5g4!AdI6dn zE#RF@qg#8}+kQvzBdEWU7qw9$J~ldxeZAt1^vyTrforM8M(;uy9O0{e(I4LXJxl8d z#*%w=@CkBfW#CDT$0ASnzDejtjbGi=1lsSGPEftRvo_jTXsy^Qd??4eC;JxlT#ziJ zT&DcBPb0GfM@V11e&y~G?yjo;l^60}d;xE^YrX=8Xs*2r;gD@#ID(J%NcF8vOP5?j zgD3nvl%qEplRz88jk20M&^==_Z#4Hy*X4{ac}53xuV|B-Dh48yo5|mgH$H zHP%DMlf0G8yFN8) z#Pfbdf#kI0b;+O6MlvKg$kavDkxd%Q95@^aI;4jC$j3Jf-fM~d*2Sl7TT+j3dzggT@QCX#9a{w2; zQ^Z;uT-?2SlWAM_ZCw0&`!;VcO$upCdj@Wt>&lFSJ_T;==e_(W-O|dd*OvISGU0X6 z_=IojCgs5F@bBareGSj*0WJaSzB}&+lq7cwf5FekU$FD=FBbkjJqLg2=gNk`|CaH| zw^axE85V!ihsA&28NBhUx0BPm`NG}sH$1BcE&%`S!k>5is)WDbd;FUM{RP|Ozqc@@ z{~NyS5c(f-LuvopGm_`Py&GOMy8*hd4s;ivLi59Z4lfB3sd-GQMWO4uYrp~g&?`szLw&OaBsiSwWJ_CK&ck6%I{CU9ST~58< z8FZ2Km+F-OyCi*gGd-7p-hdC5iMHmWD=$1|@70p-`K7C=(BD<0zTjxyYVv+Y!BmPnF7lVWA-c;KWxST|)5QHA=lfj; z-YTOvS?*GN$Wao%XzTL5ffmgs! zd%n}50saNfhZJw!!k%13@Gtm$oqrAR3ZUmf>>RD_kHfP%7nACZ^evH4PIRw>R^pYz zqBFWFJNN&dbnk-hqG7x*tuYJym;avXU(%k+=lZ##?+O>5#5$2R;)b*MPK2!!Bb({G ze)@ehv-VwGd;Q*^#b0IbiG7Nzp=ozL?@mnP++W$o1Leqg`Ms6Nd&CdZ@c&QQc;GU^ zR_EfmSzlv_V-JM=tbO(-HE|oqsnCzLsg=7luO4xo5%T+B`!afSnz-s=>ynr1>girr z>kYt)VmE;9KI&d6w(pte?G5hR{IxR^eB`E=Dw$`gdvxL2lVt0s_*4NG{(dtXS@TLa zbUwb}cI@Qa_>RL#L-%KEO83X}W4sQhulw}YH^0WKvL~Q=l`mdK7+p6n;k(z9I@Qio!QV z;U!V{wkUi@6uu`4FOS0aMdACSa7z>(6@^cV!X;7olqh_96h1QwpA&`KqVNMz_>ZFS z`=js&qVR{J@Dow^qfz+DDEx^i{OKtCXHj@(6#nxl{9+XT%P9QUQTT77@ZUz^e~7|g zjly4#!mmf+15x<9QTX4Y@V`glgW2$|(|#I-4@cqujKaT)!v7tG|6dgTT@)TQH}LJQ z(@u)QB~kd4D13SpJ~IlR6NS%31-tCsSrEZzK)!pW9ckglUb$7U0 zSLTXc3Cow-+EtAY)vju8X>@L7b4!DJpl;Q=MrR4D8avz#{N2~$-qqqd)~{)F%k)oU z%evKWzW!NV*HPc(ZnS^f8avjtwYVkePxF0l;eD=gRePhGuYc}qZFBG9uerr7Y;g}Z zHLq%Px7)wXtJk!)b-0D;&wXvJtKGZwPhGp4+wLB0?r3ti>!0?b!0ZfW{cSKrb6 zKwU?pn;QZTHZ`^hrvB|{Z0~T(^iO-E)#0DI_Vz~FnVbHsX>09ht#4iBZV3VKSS2i0 zIeOBzULE1zj^@>k?QWU|ytkpfxT<31%ucNMQ1*Bh={&ci4Ci7ZB7aX8w z{fcH+!yi3*pqUny`rp-cEp;mz+Zd7bx3Oh~Ms|MsQ&(T#*xt?{%ngADh=cEK=}+TB z9gU3O{Pah?U&dd(jc$$o+d&bxrnTK&+g{(+yrzTSj`fV>ed}5n1}JfjyUR^;=ev8| z40pAg?v}2qYj1K(JKEga-Mdz`)-ld4{53T4?`$`J?fkWF_H6e~DB3Z%t*!MzH~XEW zx^j0@YlnVkE8wnmHz;=PY<}JK3chnTzwT{rE*$%|x4HMZo7>#`-sf&0_$E_Amvw$%%{3U>pe*x2GK z-I6r0!QC*=2J&IIBn{k|rmSR~?oQJbya>3fSJ%1gKzwQA>SmY>!c@Dt9d3?$_d1vo zLfu%`w$e>?3q+myt@pW>)`mvcQn$L%t$}w|x4XLK%iCOCLjw#$1U}=Rj^=u3UDw`B z*}8QN&8=>E9n7$NRcrmqwd-0DhUKjd>m3!Buj}Zb(fYcU2N0wBx-~X9_01HiS4(1i z{#LZLu3O_8>N@J|pH`nMI)oVs#(fuC8`Hivbt^!e~@xD zI*EVi2>$@HrS1V}>Y224`TdRc9gaS?uIWhoOhD|~x~@YF8O`0A=6W<3BVd26D~$AQ zYaB|WZQb(quDx#c8s|Z_15f~v9)WIOjo`cX)^#wCYhP1GMn_v~%L;xZ9_{Ov^9NHP zPVG>1UI%wT0RCOErqM@Q*mrsFO~v zwN5m*v@pImHHx;YJ5W}_y%olQR4uNluD#YKoi%h_$_&!m;McX$#_e>mzOJpo-B#Du zTnCPt$!bmPprxhEV-6IuH#B!hQ}H9^#gA#RIf9>wNb#07eYYR=%uXW(Cu7%*cBx$Lx2>-= z<}}@(5-1H?Y6G1DNhXqpCg@sM+uVTAG`G|@uc=$*S{geZY(*rQdyr>MQ}d*tY-k3{ zYoG?}C>HA35Tko5r0lrjvRWw|^k3^b3FmFC zbn1cd&vbX`4L7(;FR}jyLqv&OktXY3Vl$(t;#Xa9*iij5fFWf_!nHG;PfPnCEm7-yxUnS!n`_+$bqZ6mwxdivq$}6trjTv5 zS2ea+Ci6sDMNXYd=zH0-rFh@n14QiXfC?BOzxhO5Xc7&>#l`hQK?!S+TB77HU~lSx&UMy{x6R zqYT~M`e0*2S;e~c#xm;FcC^+qwRWHYsS)%|rMskT#`Lmf3vZlXyX?KU%&(olWXa7- zuFi#+*TD1{!qvkXL^LEAqCSGs3N40EE_x$09|~8Mg;3gPb_Ahph0Df#lO0(#N)OTF zWw~voq{vqC+PR{ovJ5V~>Fqu~5=8>VJZSJy3xkx*Yiz`h<}=y$gO(7`6Dx;s{pvN@ zf)FPi_-nJQ_WKfONWDC))MOSPwdva*9Q69e ziZt5L+R}&z0<7anVS`OkD_EABo-SiOpm_tuZ=s-9D=RJOYP5N6ZS#F*yk;8*O+V>W zXzoUnt4L^`7MWBG?89ZU5(S%?V`0i8S+>b4)oei8)h%gS-_f+%-5{-goy>I$Synd9 zVt3F#8LYTNXfT9Qr$^c)S61dwwk)yBDr(Bowf@y*jStl~+Pb8ysjj7gRn7|2->ewq zA!%%=EQ1>Z<_Egfd=wOiOk zCmYW)rVM78=WW)ae$5uGWgV-CO)sp82+F)-a9D9#%*@$r$Z}ISW(?IXUyt8ru%vmV z;y7kyLmbCHg`pd#G&HYhX3d}`a6EM6;&mTb`ZilIu^(v6S|DQYV2xl%x48T9>X@KN zom!+$OBL&HYS*%QYG_RP&Re>*jSVY8O2_|a@9pE`obvwhbInX1nm(m;DT)!PrX+1z zX+^ZvhxCc`VcXOe?M^3|NisT_88eeMq3#W0MFmBcAP9mW2!bp@5d>L^APBNHR*+pm z5Cp&X=bXV<2gfOZLDSVi;Vl`0eplDG!SdW^c14x%H=1OBJa`- zuhDkD;EmTjC=9ZLGDSw&QRzv*q0O{qxjZ3%=DhUT6xg(9VJO;)Cp@x>WJd;9sYmR7 zmgjvlto%nMCi#wzmS~U0NP0A;xo(sVDL%qsi0oM4LLMu0qjQialDi_k0~V^XW#@1> zf^xKoI7^{Vih`>5K<`T9$fzL7&qxP6i^fUi-Hp~!6iHN!h7PQCoETt96(S`=nKO}J z26fR$7%cbqu?f1Nb)bG=76vL4s$Mjz5i7Wn73IYxxKJt{G(b{~sB$W+02Xf;`jnMf zX(kRqm4$^Z#OA1Q?(L*2;1C$~%ulTP*m8&4y^U7KQP5lFfF@DWCB~|wpt}&OB{vO^P|WZ`80tZ+IMpIr&dDagTF^&|C3Xvu=8L~0ns3uB46RL})PAsy zs#j#K$OG-3iap?_k5LCGF`dcXl1p*_v+ z_j$|g)1lkmCjwfxc)~N1A_pZpoisvrnVT%TR6&HjK4oIobX zUkp%IX&VZFNBJcuNX}Nk>B0m9Ee-`FptL!J6kpO|B)XAQ%<0!bYC7_d{J1&RAbMC3 zosz8acmk+XcY&ug$|6)!FxrB0#j~gkqT*Dao)9ug^RB>`oNwvF=|$IvGR+-Ca|gx- z59aa!aRL;e?ST?m;RI#I^J%02kmZp;=8%|)n)oGCQG$ZPQoZUp!;f(ZJzpw3LQZJO zJZGt%PHG9-J)vQNzMZHKbRZK-2{(eEo@ar(N%4;lDnLZGQ6CUHP!CeXq58!}Q9)V6i)=8^l|{rMDT$0g zsbh{fl4@8*gwm^J2&QYaBU+j`pnjEOFE?fRjjp1^o{|!eixw9`er(TxNVOe}jx;Ak zrTQX%)fa70s4r-YLnHDLN?>+al~a|NLjkBQJIq~tK;?nR6beJ1C`XV2+VNzF1qrmL zXho&&e8`a47@*cE0k&#r4}yTQ$tyJFOSwlBEqxZ0pu4jLwZ>=vh`dVY4p`raplL-bVc<^;r0%C>pX?7ATxvz^ZkZF8OBwSQ z?c&=DusMn5WtXe@BS=$jKN|?kUD{L#7o?!4K`uzOC)w@G7q7~p1@7ij_ngh8ndzHL zkI%4UO8^>S8H6LBeS$bUi3EzItRy-=;Gi^;Qj zEX+cX`=qyXWc=7+45i4Ck!A`RwH&=X`F3R0E|jVQ`Bxt&$kPiU8p!Ol?GbTCVPO?O zf~?2@qC853l(^(cXK$9p*qoHLIVn_vpWVg{b8pUSe#?h@k^1& zETh8&!!i&NBIB4A`lUFD88b?3JE$rWDKkh{m2OrOmExFV6#u`PBzgL8QbZZdWd>## zB%4kpk;$5h63G$Lf_~#)aRdQDrbUUm@tHNvMSRJ2CXtGmoKt0#O1rXeb6c=rp*>jQ z^O5ofZOo+g7n^mLtT-s-=wng6DOMH*A1s8J#Q$tFI`3X4!rgY_o5gOGfH; zrP}eyg&}_SDF$}|*_syG)9okPXWO$#ceRFOBXcxZ=FPGfW1Z;^mKRL6MzY+DhURk9zotr)S88;dd+ z_6t?`g-Hm3t--VH5E`(j3au`GV9O0shdl)g26GdST~esoFSMU+mrfYLk|+||o`dF@ z_gPI7+o#cctfO~W_t{?+v~TAlxd`hoH+AzvBiGkiFWDn z^ey7-a|G6pW~-l}xP+L8^9&|kDWr;)IX3mVDabDO8@YoCMe>X&i>Pn*MXAXWs`$O~ zU_&GUD1?+n;Tsz~HGIyBCHlwqPc2XiJe2VL^4S!mc0wR|*L3i}7;)zlT~P>9Q( zS7wJ+z<$yOJEUn3)-v)~20}!-u3V8*7@t4QAE15=&q^C@$3h+JieMU@Hlq3@)$|NX zZ&VNa7ctP$AA1Vdx7}ZWDxlV>-gfiEn404DwH)C<&VU%WY3TOT@wJ(1W}hh+H7QZk zJC#Fvj0|Sb@S8JCBq*eD4tmmtwb<%2*E}g_)6_p|=BIfMGdxZDFlbtXL9;_ptx$n@ zvd8>61MMwIjrM5TB#Ur1=;+=FB1M+n&aEDL*K83R7?}6QTuXiu4mTKVvqa0rLdvmMh#i7lj40?DuYOzCA5X_2dO-gvfmf z7QL9ZNwb$l5(>>$=<(F7kprLKuFm1w<+_?i3cC+SXWg!u;)E2lv&xp8MCv%|H~HZt zneuuSSr*26q#?CDv)o?%pN6Gv0KF$Ti_?Q$WTHf_IK`xyqwNu^8a1dFN%_j_gTz8| zeX1QXAZ?7Aq|HmEe2n^bpQ-Gmw5qgu$|9oNOGTs<3hMh*l;70uDPK?s$W+Kfh*W)% z6r`?CAy)R85t;hFNDNY=#RwWd^<}E)6q0Hz^~oAQGq%W%nR1PaOKQy|0oWmuCbo!_ z>G4r;P$M-|(4$Ce31l%%7p(q9T-1ti1k3g12$YLUidIHLnz2;%NvbgZl)5lZnpTr$ z%CwA^YdaYouQwy#(CAPYQ$I#0mY^vkwOG`rT$+gib}bTILX>ZG*TM{eNAfQi?#qz1+2QlDi>ONR`#GEQQ96ZK1O@2)npl= ze#d!mH#wLb%UY0GiIBmoZ}Jtrrk9?gEo9JW3p37WJ5_i4M5Subj9nF7=?Bo?(M_@O z6V?7Hw~#ie*|FNq{FGTzwots8wxoGOaedpV1iYR{ucTdzR1?#-MFh~oKLWUQa5z&# zBe_)iC(>n6^m6w>DXStd+Pk@MmW4I%Z5>XiumONub4vhF6LF6Wn`zlA;W5NQ3R*Mue=q~otPMfqbV=JN-N3KN> zveXwfY#N!!_RJD@uq^76)cXqNL$w>0EsXq`En*}cEuMQK_f9)i^GAVi=|0iZEL z|0`IHG<(;?bMOh6uK3vQ`EOSU1wS$f_<%2nW*$TF#2L=lS0szU8-pT4JB@5 zP=jS3*qtPGB!!_V$dCO~=z^o7kjb!TnG5bnXP}xRpK|k$0-vg<6M7Xq1T-{VzGgSxe>VDO|68g zY?Y60E=7GV17Ti?HwMUwF~YBQ7JBk?aIrzUu0@|fyKslsq3-F}ODYYeGGY~^BtT~g zMqDwHY>)}2hWK-1AeBZH&Wt;}0VPVsptKyf1H5Ic>HbC#Y0#)N$|~O=;JFJ*^ar zv7?T%yYq|u_A+Q`<}94$a&Mm{m)yW~8VV~|U!Zi93*odh@{ee+GZh@&4j^m$gIRXv zB-@RYIcM4-gW9M20>!F*qg5y`(}C?}IAu?ri+Yt^b$EZUY^ESF+#OmlC)I@!ouo+W z?+fGwD`n+!=am%VI@JPs{c1W@2$saI1<)Q$7sw_xI#`lE9PJ6zK)$9=Zk_)s>q^MS ziDyU>c5#Li*L38Csz__Z`G-+GfJ^?1KK~^VzZl|Q^1>ylRF}$0#&;p6h%~!v~UqU%lggSN3X@AMj@%CartGfVFC&#VAMo&RVthr_OykO z@ij@vO%dpeFa$Y}s>6{*>ct|uK{69VU9i}m2E~eU$N4twZo(EL8aa+?KU^Rju9S)s z9zjR@DWQ!E97Dw7@$|?bn!odm&=!d?Hp-94=tzU<2twvV)sm50M85vzAieh04 zG_LZ#6w0&Ee)@dXX%=o7oh7a$bGVi&-l!oPN)~yk5=~%au{+I+n=&IS%`7S_>7R-* z*agcH#ENCPV%^#exwxkXiNhC8%O%YZ$?90~spTsb>R&jQrtR3VLmpyD!+xIH{&R`N z*pl}LJ!i=%vh34vmuFedvfO2I5{2}Gu_FuP5n7A~YI&M3r@0bvX$%rlSYYI&yKN-= ziPLF8v_-DA+;Stq@3Wttm9+(16801q)Y<4wxB@mKLC}p(+`=3=2jJK~=NHnD5!$!U z`M2Uco7CAdMsy##fP=lP+1Ti!6+lTSDN9TPy{SojTmd*WiEahqBbbMaXkuiTpGDIF zPE_Fkw0tqmC1%bPM|s1LE^q=xgo63vD7vUO3K(_mRgQe}YJwMhUIjuvSb< z&v2zpOP`}&x%8D4dCi=beyr;>Q3h#I6r(cHFL2xdJLhz2avFlr|GCo;g8rX5?O4~( zZE+deL5KUC;VjhH#@wYMXYJC(IbvFVBpI<9wtRRoOSUdJl}105Luv6ZK1?sBDW(;Q zX)}*5;1gPyK`c%s(d?kpK5>zM@xex%*8N}~!Qwt*|c0SGOCF;+?mCG_5Rl^l1UTe|0 zJ;aXYjq_i0AerVpkG#bQB>)ck&{_Z-(Htu;H)3w}=X*%1Lhp-?1rq_XgQ}uSVo2Jd zx}{?WohHDModER#TwtULxq!-xBSc010IsP)kj0f!7xGF%2O0?G;nXBLnP7g)TuYE- z76AKrC1{~Umu#xPP#*RYT`JoBLnz#|G|R>|BPEm;Th0+OF9J*>oVY{k^~fSA-4{vX6woZFd9aO+2;jIe>GPtwlR_BkhK@AxwRfZ|*McrO z5vim?`APTG>8dM^JdYH4q~=haDl$o*oMx!DN&kf-nDSgGMnJ9;nP34{N-orJktffC zdAUqAkq}P7pe|LFNP;Os`9YNik}w#b11d){LHaw{0^nE(mtSlL?Dk8oft^O8M;vC` zfE!X%xlsj#4RWBG$!HtZLL>|DbXLhZ;`E%wr!HHM?N8cDzy-XGOLI4_U!1cgL7cv9 z&5HGlSKF7aU6Z?PQ!Z@si?Tq58q1-xL(lb6-`WNxl5Ylbz;@=r0kmEIT8Ixq z%)%mcI|9iCKf5>so>^ukizGP@Ch<^_MdFV6O$R$^2uSK!Dk_ogTwpkqlPql* zA^|?$AaIr;;4Gu1F6T=5VnC~M3RPFHD68n8(8|FD zU%V3|JHOP1K{Qaamw<{OKxg4-PKSW#kUvu~5;2OHa5@BCQYgD!ThIrf=|iSOY9x!a z07qec;pluux$j$q)4_wE))df*B4I4FU0V`RN0AD^IW+VVltorfQdYzP;smVeoh1k2 zbL7SRtbZe{!-vW&J<-5+vQ0$zrUD| zFk$wf15Layfu%pf%nD%6n0ZD(zHk*=S)LKV=S-X+WK3T(cewL#OF;&bpQEZO!tl=- zj8H;SCW<8uI)-!37W^lmNW-pu8tN4DTv|rjT+_x6RWwsjfs~ z*F&nMNa>t*W(jJxq?l$;brd;dFTw8zV5P2RGOT{-3|Fu$5H{t_kbN!q+pr-Ad)uBo z>Ey>|cMuCkTrr1U0w)sEyvkmzTC;qu$X&m9=`sj}OE#_$zgxV1jeM3FLylYBm)lP%lh+QtxBO8k;htXV4O7K%itI72~ zEi^48hhgadJUFpMQzkB!%i#*is_Bth93n2kP<3{avk*UkP$*^DT(k~4ZjBryWz9)V z@`P6V(T4m!PkvGsEfG}{TZfH-Fm*r#4y{6GiRAy6N+ol&<(zZS{V;sVQJRLaY4eUf z{r4p59y?o^U?6MS?DRRXPQXq*&B^)hRWxp?+~UU;Mo@G)=*T)GR}_d&F6I6ru^0}1 z*#Tjsu#15lZ6DDfqiO(DJq0~fC zwQD!#I#zF>0%HUeE0-7anaZ!@@M?5f24n;i5@DI+mQfJ&Ai zM*t;FX?PaSzI%K)^g*Y_-Qfi#;exbGv0~NoOtF5|^5tU3TD%Gn->ezGnl?Ym~%H{jZn#Zo06$=|#QkodU9Z|A~^ z)lh!9?D)wSC~qLTdCTwsE`C@M|l}-FeW$;D?RyV<4+hxRXkJc)VDW7owm6u@-c$@o&dZE#-?1aKrc|a`BT& zzoS|$D!~sJHPinHdG@1{D@*bMPY?r_tIlT`XU<2`fXj28A?V;6`=e z*D&0y!UDop2f9NV4Xrq$in{_3^)VbHa-78!+44Hh1`^;lsL)HDIP?m|gIDCBnvt<3 zZmbas@H-u{t`VAlP({js_-UU)JeXw!U){k{h<^Nnj&tLzr}_z-0yo4_tnjFl3n+P| zwpZX%3gSmXv}uA1RV*sXYeGpL43?0i@>Rc=-%_`$L`JyCU*VDVw60MfSlh@CbA2O$ zxyHdfMe_Z~N{20w1h044;ulsu>=LzVFa>qY2Qo9!YasYm)+1}7h}FoNC}Q=CYa>oE zvI;a;NU&E4ss%A1ttUw@hozEYffh~j%VbmnwRqxaN0v~qP?f%1g(>Dj<#p*BGk2Vdc=N{3hTr4kRTSX z$z8dA?YdP<9gEkka!{Ty)gjN3s6*HYLYtu9jdF49II4-X@taT1{4)E`A|MT~{3*5s zF$>d9coy&fpt<9)i@6rS7%^-6?4NtsM^U!~>LV&1e%MFu@t}G~RtIX?F-mBK5W-6r zUW!EZ8j?>_rHm>{)3Ag~!)BeF?IYx-(RD02_aebj@kXNER~SyhYSWLgn)C?raJiTR zc_=M?UK;MzQj4J-IwUqTlE_T(K}C-+fk8suN{Lo7k@G$QuXGE6OE zkq>iGCVLvK{IIvpk;%=OUsdP4>FAtJdTK(a*vxTYt)`rOO;^ z7O!4La~y<;(GI69Tfbq|+BG75CjLXtkQ=#P%kk5&2Qk;QKnD&%&cxQ4JK`o03DPW+ zj>v^*AxYR(UQfTG?-9 z=A*-KpF%_Vw}O#c_1{ScRYJ=YG3wvQuS_jovNU_ya$elhiuix_Perq0<*JiT&RM-? z?YiHt-;lfUl;3SS^)&S}R)s~LGq!n)eg43i!BDtl`;OAGvqmzJ=J?OTA2Tb-K^H`@ z+;KRPPy+m|H!+pX!}c-BZC|_pGF4kF_yx0*pFU^Y#_*QMgFoK)Uis~@-PeUbzwXH=J=gXA zamC}GJ$wC=6FY7im+VjdIPK1g@JZcwG;Myn^4sm}f4i`z_}SSF?bEGI&;8-lC%zop z^X!VtZ-4!_`7gv4&X_Uzf`o^sXC86L%;DnH)%%an+>jeea6g)G#`c-dKXvW}slh95 z>U-kmlM4=R2wZ&fQ@8xq``kf&SGL^fG6t@iuWFOSk8`>(;sYY z%6MSh)Z6y=tR44y(88}J6gTGrZ#^RZTXFohvJors_k%%WA&u{Qd!DGWS5zm2m_Qx|G5B`R; zu;9V(a*GLg4!|=8Pb?mTABvAKrA6T>KB{~Coeq(P=QunR2ZcWb5B_!tey3KYeGtrJ z@Zh(>W!|R4T!4qtOT|NJ(7*G_r6G1Hvs}=BLX=;uF!_^T=d%46WnaDvp6DNbXI=h- zeK~y~uhK+#Ws)WAE-F{1l}!tq$`IuV{K4VN&GgFIpP3K*-D0vSH?<@9{y+VX>OcA) z)ho3TYKQ6UKqmXMp>5jGKrOFLAn+!qU(f_C&juWqnTq}JE(Pao@ zfEwj^Vc5{9U55yx>InSN@nm77q5*a<6h`%Lg$Qhf`>FV&3#SUB*M+{|7KZ&?Av!J; zM$N54*c*h=e76v#4+=~2Lqb&S5ys9>gb4QwW6u{ttcx*>wsD5&9B&x8lMK-}$uQEV z8e;b`hB1F8{wmHK!$>(E=6b^z7leDMVU(YZALcJNjP?uh$H6Z$jH-+AhY&6?jAr~o z{$RCXRNi8UP4^o{&R#?0ylNN&ZyF-`EyGBC-w^SChy7=UNE|eb{;!eFkBG-+5s5Jt zqYHlkBwa z(PC|0WD)%VpuCW;7)+4@CEJpjO7LmHuV#{_~EJaR>*tFeZ^p>J( z&bJt?S6M`6oyAgFXAyl37Rzvh#i+TwCi@df&EKGTyO>?rw`^@_QER=Jza??jDPg@d4t+AE~YR41bw) z0QvsLVkBb(8;-ZeR*tcXaS2wVcAQl-Ote}`6Rje=pVb=J-)igL-zsVkuv%IUu!`h^ zt;V{;tzuoe)##gJ6+1Jmw#jp?B6F_Q7C+A_I_6nz*_ntd+iI!Ewu%;*!(=YAS~f4Y zioxYpOXdoz@UF00nqX#ot;X&%VSko2E^#OFa)H%os6qH^t=2u)T1D4QR-^7NtH`+* z={;t(R6cGMQ`@aZJ^mu;y4S46-Z!nH|L<0#VgPyj-fD!=)N5=uqa)5HddJv|MH6k7 zs);r+^$?qpGQ%eJWZ8_0`8Kg~q0JatWD^~WZAR5nn;2SZvrf*oiIinFqX~aVseX;k z7+hx)TXStj#wqANTWv;TzD;!cZI+meXqyK3JGy|Fe&46Y=GoTsJ3}^;41DXNN zfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ z3}^;41DXNNfM!55pc(jo&Ol;0U3kFFxN>#bA+cQDBuXq-H;xj^>An)V(|tEG>24jF zbdQcqx*JC(T{|L^?%k0|_vpwR&nDf4BTV<@$fUb?WYQfyGU=WknRE}2Ou7$8Cf%(g zlkVY>Nq6lg(Ldsykqb<+B;jVe?ovGuWKV<~%m(ZXv}> z_X){7p3N*aPhfLCn{>C3{Ly_wGEZc45u1zIT*Bs3HnZ7W#^!Q1SFpK~%~fok#OBFt z=CHY%%{6SUWpf>yxQ>Q@iRJ6r+`y)~>y}u)k?|>P{*KK}Y~mUl{w0>5#^&j4Zf0`} zo4;q%!RA&roowc@na?J!#o=FKxtq-bHVfG-V$;Ls8EkH2)5~Ttn?5%EYzEjolg*$s zMY%HcTQi^;&Gy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O` zngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8% zXa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNN zfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ z3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe z&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`|ECzZ{jNLb{GTeYF05uiGoTsJ3}^;4 z1DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y= zGoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#W zGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#W{uday{jNLb{4XSGy|Fe z&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O` zngPwg|0xD;zw6F9|4D&=;(xvt8=^@R*R%Qj!wM%c-p=?2HV98PDc8HWS&L%;pp}r?P2hGnvg4HdEP5XETG%Og87UxrohdHdnIw zlO+cEOcaA`e*F#QbGP_U+d&Ai2$5bc4ZNoC$G-OQzha;GEB0(HR6L^G#FT6OPcxty z&Gy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#Wo&3L--{D^0=MOaesEW~pfo+3P@c>ajz z3OqOC*@NdLJRjic$MYQ?n^jm6@f?QdXgnEsvhn2N$-@)CvlGvycxv(7iRU3aZFpYA z^8ubO@Qkww%Tzp>cyjO*;3>tk3r{VcMm*2r*^8$K&j20~BP2ToA$gz_2ra8@V|OoF17>C}LAs;tV1?4o4{LLRu)b{Pg(DFMmmx zKZ7IbyGw}=XMVn$itG&gDff9ESum8upN|6Kz0FbR4u?I(ZV5xC;qnkC{*Z9EyrD9% z=pwf9nj;+UQg=S$QVF~lHtf_|qf-x)&wM%jlv zg+3<;8D&YSyLLFKRHN+ou|n*`q3OltMtefln7Ftk>@KCkgZ9yOCBD(NA-A^xeq^Nu zoz#9P>_+GWvKC>6sN%>(va%#m7_{_37!rtwUJikATD4hY!O@>3f zp92$fkg$o`7i@SByojG|uz(Y1&>`FMcuGNi?r#(A?c`|?Bf3r0Jwsl>fG@1vGud2d z6E!cBk3FxF4^**oKaJhD+C)F*17UFqNr`ej%O=|XLZPZV;TDSqFAj2*1f5}z-=}=c zK}BTCt{}>dU{P7Ps8~7dHqP?-ngJl?9x(v5ZeZ2=CeV^g? zKtv@*bDL;-4!?L|DaP1bP$tSP{=9+`)Gpd3&7ssfzB9aK4pC*XiLR#c2vB<^Wpj7{ z)4CaI=IV)@Rzsq#L5A(1?Ty3S9M?4JA1Fck| zc^TqGE7hUHUm&_*-FdE+;%KBYR1L-8J#ZhD!G-ZiRZWP-K}WzDbQXui_tvn-=Wt?} zD--A15ab&)lo+&g@t)P=^9Rt>9QooitKaXXPinPaSxYc6TxcspmBXsYT{=hHgP_&l zqUfUM2Si|TgWP~yd~8Di3~*ub89elVH5MMKhv+>#Nbh>Qg)P4fv#29bM5*qIp}7+M zZFdYB!c{Ryz~ht6Pt?XBdzVwK4BfO(t^6hCXSMPgM?Uo{aUni`^iT z$aoIk1}`BGO^}p?%^3~{L(=8ZShx5~ENI3Y^Fb_na{%qdE&3?l21>uK+Gc?HVsT}h zO*FhinZXj z*o~3@&*(?rcDC7=?9pa_9km!YF{cVULPNs2TY=O8pwkTW-ivAhvDR79!IIxb= zwW`#=LK2Wb3VdQ$Jo-=-rR@;A<2}f6p=g6$??aSw%^lRc%CDw(djndeHLt|y@}l{~ zdwf0&QN8gpQ=cG2%T@6hjRx@5(?DT|UPG)l<*h6JjF8whM*6KDv%?cEl7$J0YsVnt z55*#29ll!bqlES}QPbyy{-OfC2G^c@DS@}}Re7(>*4^Y!#`%?slf!&ZQ8kk1a}!W= z_fWoFn3*L5pN>IRY7%6yo8dfg7kO+*pkbyEWBSu$iUS^$@JYCJ44?tWIK)>rr}#dm zP`nWD7cVBr_Ke{|jD}=#z580|UH7PbL-e$Xibp8VAQ|KO z9b>6J?;R^*Io}tLbr*ZW=yFcTU*htyJf2-Wc4R!eer(Vk@CUF5q?tL*o8%LAM$) zLq(o|Xc-q0FJNKO{uGtE@;Mp~n&i9ZS^92!h2FjLU5~f07JIx9mBhp2rMx2^8;{8t zGD}E2Js$1wLiD~E_HrwGxhvx3zVR4H#Pj1zAe&=4fxIOCjuFx=&Kp;RF6eZK_r`gG z<~Vxecyme;{fN8wGs;T!r(+F=%U$3s@rK1y6VTc&97Fm1oM_s8AC0&5?c}lId3rbg zh29;qEW;i08*h*(&Yu_-7fr+rBW?R%RJPZ^_D0xt%W%CirZ&7$eP~GH!HFe#;?apB z9s-Z}bb`yXU3@;leWv(kLP5|^Gb9!1hY5w^vWZ@C>qMVh+&eKOoK$_&CT>xc=<*a4 zh$|A2mzu;vac81e>`6rOFC>Oa@}!r&2wHzBWuoIsdN*7|@5W2$-CrebF2X zmGlAp^*jJKi;Kh)(KktoIi|-SCkYF!vcw&eNb+`wiv3XXYbiq&SJS)pdSuH=so%37 zrQ5t830sfAS6wAsESOpL>{lu}VbLosoZ{{MFl&7Xi^eA5^ehj-G#Kg2s(-&Fncj5?A@QLw0{2*pCm(c zBawk2YQsaaul0ORgJF?#&fIy9JWTN+hfmxxnN}B6nM&fhV=`uS^gRer;@-)~v;;jjJD9OAGhmvX#_WcR@g&xdJ7!f|4V8-AOFHZ!o4mCoQC(4N^+DFx}VR#BO(cWy(!S6;LHP&SZpl9Dnp4#t$P!TUBp%LLOBtHF3p4aKyCO-cS zB${Z4Z+;_b7eD-lhvV}P@QObjQ0xu|J^AA110=l>DKR7(kW$B;RGa-Z6AXu($g2)S zre7V844K2|6$heYd7WjbsX93BX{7+=7fgT`IqN7lw@Zb8>_9c-J`JzUyC%SEXAODH zbBA}h(O>!w%*Uu77XO5M%jeXF>Mo@S2R|6kIkEq_7omE8q$vM}ue!^~cf+@45id9x)qX$Ol@Ad8&TvREddFvgYAbwifes(C0&)2uw-ZZ0aq+=naqGb%!6|M7#p3w`-L686FoOp|dZhuQ zatbwX3L~ngctz_JpSb@Z^zLAp18d7dw|M3twMON-e(|7?cno=JevO8!LWt&I@Zjy@ z?n6+eKT@}E|CZhZLp1O>1L2aOTReA&zqpvz!GAdf92ANt56Ks=A;7@*7$L+*_^QRY zVHJD-0OsBK;)_EtE(C&pie3yK5}?WYys41(gOIi&;!67j422(0COJdgbAV4ga7d}R z5Zb@?C#VxOz9Yxow7eNk`&wt_fF~3e?HAK{pZrVr-I%UU&t}=YkGGLB4=_` z5q~^X#6WQqf^_`PsiXoCgHx4W{9td{u{IMrxw?uE5ve-(^g1 z)4Tgw*kTsg3;U)w$)@vZW%I$|P_UxezHvANMIQ9~4i_;lw-@>k@$_M6nPT9u0Q6X5 z&*4FLDBy?oK)i4`UV{irOM?3k3uAJtv;#Tw9U(Ovh^r0@izYj2_e+}F>Yt`}$4hda zlkY0LX^kz#v|hU@o_&I7JRyJPy!6@PJv$_@QY->sCj}SNq03IydBG8AFR~q#e@nBa zs@A3>sEs{zgs_gZ(pT+DCn2smLbZg}Bdnq)2|4P&iaNBfq}YLF97JBoo>;KE#ivJL zg$Zjn4bKBes1s^(j1ia7Jkj?$EwoxM#1vpfPwXqcN`h4=( zSsC%zt~|b^Ja#6@DIR(iabJ>}VBbdA_FF0J;Gbyt>N}6VcYiCFqXQIMWf!JTn@o21 zkuuq; zqwH|vA4k$+FYGK-+LSL5q~<3|y?>B$vgb3bKULAMO_q76OO|=KEg1vK=j5^NkMthA zEaLHLXd zczc?vn(q*-;W|0}LJ@WOQP8cCu1?%|6voRiEun^!y~T?4^QQU5tw({|Yp6(_f1<={ z-lW9(FN!4g`cbkl?;Iry^H+Eux`jNpT||}BbS(v~Xfp5~yqdlnZzR{Dw#L?qZJfAgI;l)Lj=;eC%ybm-BPwXiTlB8@n3M)G&tIlMW%Mf= zsBcqH_HQUa`B!mxSAI$F&VR-suvE@8&5-(#hh|Vpcg`T?OzRBP@k8XV^*;H&n|zaU z=DitF%9&nxYyX_0?rDXGDCJDo47d1XhEmS_G$W#%x!`D$d??1+7wKL7gnXY%Ghg$M zl!hFypE_FUU*Nm;0&?qmBQ8q+0_&l!xG4S0(a^uZvh6~QY4NgZ>t_^*ju}e-a`Dm7 zzsMps9qn}%=eeBXp`%$DbF{So3hA*j<`~eli-yKRXk(6nd;yJwQv19Dry5E8Ko=3O z#Mb^}yd>*>0mqh3vX=Au&@oCscTp;;?5~ph4`mos6ZCO<( zLfhsS`*~pBEL&KhM1_0KAlSHNAY^(O2xH?_uoRVa%fu%i|IaX^Iy5z9&sGL!ZrQkPBZS?~Q+>psf&4zzakP zEO%5^P>R2$K?$}U0yE_`BtAx9^g!0N5DX$;ssyHvEzMx(oz#?8T7 zrTRNOG~R`=-4>~Xw`ZT>N8|399iY9z{@F?r{~jJY>u3SoT8m%5wm8wF!VnSa=kO-X zopaE4{*(wpn(#H)PhOj^r+5Ee1W*(AGjod38NCnz=R}s=QdoU`&UQ}-3Qf*dN<%Lth8rXb!;(mTqLeIwhXHaQFAQ3+(=$3ZWsstZa9`^EAb$#YZ}SAO}<;C z2BaKsVJq@O71MDn)PZQb;?-l7I;iVdC4!0f5VZe>aVSCWu}T>t9#xTEh$8`2OHgWb zXot8w!@n(r*1pY+hKr@kO&O#j+dG?DvN(4Rrb6-8Ieu|l2D0`6jeD)-G?z6z9*=r# zokkt0IDnpmvV4H3L|+C(QFn+GX5ATK@ehRSMeRfSfznL1+e_z?PNjM-`n=S#)%}%9 z*xp0$TD+;go9AMo{s_EuNXJ3xIPkt&f{0hiH*Su1&pd!E9OfI_}?9QvBt zNr{y2wc~b(_m87_4~ij&_ude`nH znG{nrb|b(7E16gdD-(Wa$|Lhx-2Y|3OuFazN{eh=)p4aF#NREB4~V`cq>y* z=O1Tc;HD`gC_c+nv--2gd&Jkrt7-hwtblkdOHSplBXIqo1zqu-EYMLb9?8UDdBq7x zR_#NXz|fe#q~oHhb;@^o&*-4fg(--u*4q?bTjk`vRp$eF=UV z9wFBu`QGy)eOK?HclTrT?veHtPtbQO-ZTi7iCqh^z*JO< zzb{Z)zWxQWDj`99u|Uq`P8<;lilGHKvh(ADkUK#S>sBm;@@<>AY9XfKZZKeV zi`oThCtKXMu*Bz(YkXROLm88gpyG#xRxy}`L39wLh~c$Vv$V*A+U-P-i-hmHPvq(O z{u9CRPc%-oeNTg^Qe?b#B6a1r;8t}RRXS;J#rr27>!1&E`V3CH&!tx1yoUylt|#PL zJtTH7!XyzAS1kfduMk~7N%i!m+?QP_cD3QL;gYZfa}=|;F! zd_$r7zoK{5Fuhy9qjv-BG0RYA4TxwM#HGd`)?49;CdXE6N%Z4=y=V zJPOC|a*{Rn{DZPWnkkjst4q|zb=MNeG>a(o50vAtNUQ9hJNi zlNd&tT6%ZhL<6cSLa(r(#MBuP^H#;n@TZX=j$sP?sX082v z(sm7Z3S?bo)9hM*UgslzdQm#MQcZy;RF1*EKlVySx>25&J8tBOHX+qituumn4} zOA5q$OK|Q$3@(Wf|I-pFB~~p(qhA`JGaTr1mlt@Q*o1k1`KT4ehs#MQ{?l?Q@2AT#29g%zsYNb$g5Gse zP*ktLIIvKjj)C0#@QDzNzdCUnypxVw>{=xEVnppC?6j^Z$wST281~=_RNW)gbL$_Y zcl87Gu7nNBFAr3Fy@ECh)slA@zRRVL*83qol!Ws|%}Uf^g;Yd5gg~)a--u6E$j!Zh z6$RqFm83%lnkXkbJiTItNg3*Q#GxAUz7d74K1j z8{VRK`D-YF6@t9@XjLIbs(-Aa@#;(XDt{4OBZdw;iHBGEw>iXltAbAPj^ zB`ujSOOrVL%}IRL=LfjgzD!NJPU`zTj~;3Fzq zbsxPu@Qofw+o7T^$6tWckl4u2q4v?30~+cm&%1lZq5r6o@^+psH_;1abH+~Ve`1)}Xxs*CRqEfSC0J>r8DoU-^S9rFnd%nsQ+E}rcb zPh=E3#ZPm6;`~f#rZ8&cyDwdsMAOOJ^FUD7$)t=D zujB|UDZ8vS`&Aixjb@`_a=E44GGx>l?MB16irCuesVi5OdUGpcT5K)TDq}h=)p6-V zi7l}iEwQynwa4_wG+3*x1F;<^RK`?~ZL&4l>Z~o6^v#V%hb_C$l45U*>5Qo~+G3km z4_SL`{c)|9dRu*5lR^KLTbjny7`rVMMxAwVLZwk@l*d&Y?UOr=pZ}*qG#NG4-A28& z%4m$q?KJwWHAaomFn+JK(?(w-|J7SNEDg3nV-V%&K#BGm<<UR!lcPwb*bBWLAq%j7`6v9r(c?nZL0Mowy# zkyB$S-EG^88f&*K%FdqBXS5lMN*iKYto=rnrN@|@I%plXRv?uoOGbZe=2lmyrKr!y z@D9fY8ZDL9J+U>G=s{=E&sOudwYfU&93sI<c zTVH&wk(!)3IXM~c)QrZsMK#9GCL`Q!xGIsGy+%<{a#Kulld;D-H92+a)Ra{GpHUfC zVQYzL!9|8f+a60NIz_pWGhj4YvU?NSjM}&=Tld&*OK(g=Y^~u!b&lyrk?WB0HrpO+ zV_dtX*Vd8H8oL*EdyJmgo_KWVxcZphm>w(_<-fb3C7FPg<={MvfFT}X9Dkg`&oFL3 zUg5or_u#S$`R`^N$Wizs#+%nD{2Alj>l8MQQt2gbQ1}27Z&dhj#-*n!JezUrW`&n9 zt}Re_Bje^mh4UGAF%B>;4Jh|=#?>VXU&MIwc7?BCT+8?t6XSjhmA8>`>h%gg%D9g4 z3ycRCcQbCjLHYlbapsK*$4^&$v@V@o|hBZd2~d7!NT%)pWl@xo=|} zxLe_~7{}kQ@WqTPA5{1n#wiae+{n20&kDCPPHt8BMaIpKDf~9$y-zCqnd$#Ig@0sR z->&e)6jlDpy$T<~m=rt2cPiufuN6L?ae(nE#+f+mOa4z|Oox977c-_~z=Z!`y2n~2 z-p#l!LE)PjkK142`x*C6QTQ3g6;l;{)AWC+!o8+{#@{fmwk!9z8LGV5GZa36@yeqW zPGVdIMJVO>7{;59S2&aL-c<@OW4!Yuh1W7pIa%RNjO!RXP4^t-egu4(0wHap#!|FJ;^uRQPv{ThCV5&p7A56s}_2!1y}GE*#Dx{#zMmS19~4<0&^P{CCC~ zbqb4PRDO3dK7w)jP0Ia5#=9Ax!q|3;axY@s(5Ubq7$@GZ@KuaA;Z7Xo?`FnBjGGzv zJ)_*8WnA&B!d;Bh|E}<$8J_XPRF(hSPnCNT<5I?R83!PEQ~JvpR~rg%V;nzL;jlOi<=(_N9fyx7{wEo?Gk(kTkMk_#{srTzBNR?ZQ~9sK&J(#OF&>BA z4#F9Xo1h>hyoB*e=CoGd`+1C8vK6jjJReI*a=)AL6fCg_ zKg`&^R^jIuC;wLAw-|SCQ1~OpyH8d48^)qyA*zp@t%tn{(^Dxr3%NVtMUb|RQL$SjaMl=hw;v<6<)%4YK_9VjJp}T8PBg( z?q@NstyB0S#u+y$e61P2Ug6srmt&8I+T#O^U3V(n&baL^gM*9C7<0lyp zF*f3q`}o<)|6;~CV04=YZ%{0I1U9X zSME;9~loZ-Vc8jo8r$rSH+*qxRmic#tn?K8TT<>XNI@L zN%PK;6Mtz(?R*u!`c<8ug)5n>bL8yRnA+{$<><2M->G5(x! zfN@L);!6;slJUWecQZcP#BnNrix}51-oUtyv4?R3jJp_jG5(Zs591#h_c5M0SCw~w@!^bz7|&xY5>$RyGLC1wnQzJA7w7=O=rCF8_-s=VtM zAIW$V@6Bw^d zR_<#UhmTZvE91H(g?)@`rYn3N<3%$Ru4e2_QMiF|+ffStnepVK6>ewjf~J)CdxLQ% z<6g#n*g=>4GLBDD>!0r!Hyx?)Sa_oHZQ7*dy-AE~$EfsBEa|?pRN)gCSF^lx65}>( z>EKhG%D4y`eZt!qr?UTZ7zYkh>C?$jO22cD;vYXXA#v&{DnGX{9=B7aj~#sJKCnsQ zml#()s={|Ou5MNM?~HpMSNLB556T^C42i`Yg*}WH%~E(flRA2R%DU4;V z#F>{WJcn_3w!-rn4_~hE8pg?2DtsE_c$|Qs^zu#j>lDT^PsZ*{>x@JfD zsljiOQ21*Zm$N&TQPO=SyFbQwYqg61MaDySDEvO-f#0b3`WW{dsPK1;Tc#+yKV&0H ze-Y!O8E2y5P=0WzM!HvWcytSi%h}z*IGx>#8RrbC@aHgYnyLCjmFfQw<$fLG>Vp-= z5i}Wp2fIJcxM-?!-^;k}P=)`>*nW`01B`9#{sZI9|4`{qh*9x}aS55qho4iC=?#9Z z@G*?5zE}8o#;tK`JXpcFH&)@zjJrTI#phw%`J=)+8LvD-<*$-)<=+&>A#Ry|6XQD= zZ)N-_<2IZoqWE8C+{^d_#&p_<+`nO5^R((e<6>3()#w=HK9zCrHwtGk?pdnve8z2= zs(kAh@8CX5$##0%;$+-VR6(7z+ zOTN0<9S5Byc5(Wc_9f0{dvLx?uEW4Ye4N0zjq|sbv5muTWn9JS`x$R$jGxJo z>7_Ehgz+$kuVvi9_%6n+?EewQy`26_jFVTW{Nd+zWc(eg6#fU}hHQn088d#)r2QY3}rreKY+;@O#pIMB^B4O^A}WsED%P}t2l!1|R^#zWk{=w>a&*ORII<9e&a$xo>M*1))_OpV7+ zFmB$X++SoI*r?ol7}sxB{jHyI=5!T5ZmG%mt2n$3YXwTbhUFz%I}o0{QH4K*@yg$+ z_-8ZrR;ltYVVv{2!kZYUdlWu{@uK$>zL0VGc?w_6IO76^8yV+v{7*1$DOK(-F%GkS z^L@tl=alu+ym9Cj&pI`BdKj>B(vQT%izi*O?*cEW#Sys|-I`uzfOcl|+O>o|p5 zFj15LBN@A%SNH_R4V<5o7}qgBzh^v|`8boYV16qYH?uzeBE|#fsP=Oiy!AYVlNj5|6h4OWrn3~D%Q*RLg_kkT0T8-o$w-lra};=@Ha5-&Q-X9@j7;Ygz@B4mHR7#yI&h*YulHoteo`3c zKBU~|Fz#KU#marx{R)r|>7H|F0DOmT~Qe3dilQ z%3J-u!jl=7_A6{R-Gv$tG8t$5q}|uGH$afd@f@Vqwp1sYnacQ z7zY^N%Q*8+75^iQn{ca?;(wWO`TYvN&$#(sg$EdK{z2g%7#HF41%)3!S(SeZ*YBZ> z+t~lHjC;9!%NQ?WzE5Fn>r?T081MW@;jxO$Uq8S&mCOGG<6hP; zbefpk%cqRJAFKGr{6>{0y;Jdf5aXOKh0_^teMR9#jJ-U6p2T?3bIScx#(`%Q_AqXJ zM&TWd+u8pGjH_Ff`&Ep^pB28DaYu*3jg0#qRk)RL0QE%m^8(|^EHAvwnD)WRy_4}u ztSbnAV1~!KlkfoJe)My~Rw!U;JZn2p@wFf0!S!l|{J2n_QHBkZ~A_8^Zs^xS8EAXY9o-VRFBov2CJC?+(W8zft(lj7u56 z$T)>@H{&4=-_O|l|CRR@z*QvM`xgih7F}Sm1X~DBaDp!o0t5&yLBfp-QF0Rk!Ce@0Yg;3k4|l;rm9DA=wV_ot`e28}sAKyW!3@3DgS!MudeJ5;d0 z^!GTyQw9Gf__NqY77Jbse{PB8*9dMYc&lJX!TSZD5qwN=jNl7`)2eWNw*(&*d-p5B z-hwlNqhuUUiv|BAc#`09g7XNjE4YE+R)Qt<_Ea^K1m)^$LJ0^HtO}^em!KPY_Q&fKR=M3%rNbsm#jNb^Z zGoG=jFt-nU>reS}2%b8Yv7_MBo{XIZCrW--!JR`ny}Mw?V8-Es$4UAK!IOG$`aHq6 zhciwT+^Yh&&rZQ%UAg@a3r-xx`Ogc^@5=a&;4>2#zYsii1LIGElOh=ZP=ueq!DPk- z1m_X^Kt;jnt@wR!DENfnHi8!m?kRYb;68#s!^i&EA43HLkv;K(?u1Gh(*UQxtAFUznCAhQf2j>Zn0^jVIf0f{J z^*H}l!K3OkJ}UTyq+b!7qY-T}Z@}q}g4@*R>sJ(9vmWCb zf_pXQ{H}tNYBO#pIIIM>zo+1Ing0U?Z!}*;AC*EaTRq%`(j2jBJm;7x7H;{Bs!NUXx3T~E>uRmCDn_FDpB*F6= z@%_vYd_wR-!JfZx`YOSB1aB35p$E@5M+EzKV|+#MWm&(|1l#?=*Z(Sb)eFYCN^tuO zgM(XapP~voF?JR_Nc4&Nf;$U#7aT0*y9=&4hRX*CEz9;Y`~`sIN5-&8E}dLzcS#r2K?24 z?S7_lok6v4K?5#p!1WBcjRAWbu*HDKG0v#2H^qQw81Os;UShy24S1aaZ!_S127JVT zPZ{t91HNIvsRsPmfL|JLx&ePO;7p~cKQgNJ$!@@f47h{=I~#Bv19mguwg%kIfV~Yk z*nndVINpFq81MuGo@T&v4S0zGuQT8+2E5mRj~MW21HNd$*9d=|>28ArypA2tpAE@M(hywu2_vvYB8TXM(Mn3AT5pk`R7|Pzpk6 z2(Se-m4N`Nf~gz?P!UY9EizSv0NWo^WeD&YlL=H!Q&k9{@|s{L%sNW_~u}z@XnwmiXb=CwbuL;z66R6rI zIF2#3f&j+~COF!_KW{RD3Tve()eY}zW?kjl+vt> zHRRe>9GO)InlQ7tZiX28ML`!b*sbChjlD*ZfZd>SA~;VY8Myn9u0$MV(OEPh=?7L>N&dG33`&r79tLIaNZSQIorhvK}xKTk*W_V3&9XhrcsD#N`R0Lcg3$4pH65WN_ zwZ6)#RnKC+T^0W(k-d3YAA&Q=9ojO%;G3c2VgX2GEUK(PJ;jU4qTXT2qI-!&qLIF+ z65xpp-K}VlT1@yNG}0Ec2*5=qQMV{e1TG3NNrOU6=Aw`drHc|W+nQ7j16lFKKwoGS zD;k*uOi$!5+$vz_l~$}g>{uo6rhZcjWX6IZ`nIf&0R|WxZ9Lx_Ff<*Ly?_@WGm=~2 zuaVvYWg5W+0&Rgn2TC>qFI8A+q%K#5xGaJ_^lr7}uJzM}M*j^oO#V_9J#`)uU6u(L2A_hS-8hE2MPP_{6jj4%Qq4v!T@)S0pH1NTcOPjl7ltdXCe_1!)Vt)FKmhJ*jN%BO zh|tP{hzM9PP55tBOt@QkB7-re*j3EII-U^r!f7Ky52U=BCvs=s8X25HO3W{S(8vU(3{mR6ZwH*n7~fah6hEHVm}ILie5(aDN6ZKH9%gHYuXNO zK(XD(JtmF^L^Ke<37}8dx8x}3U7dWeD}odh&;|_|i?y4^2(Z)YCA|62OL&*d5}Hl* zg-D<;LjtXc(nr;0*dIJzP}8fl+BAt)ohGr?r#MoGNCoR*Is%NrpwttjkjRE31tqG9 zwW}(Dc2OnJu8Ga9%N~O-ENDtpncDFK05%@?TVK>qJBlVCjtt_T!a z*+~%D@ROiG#~Xl<>?PW55Ylc!XG`e=gI`bQ0F${I{22Q;<_JiJEil)~akK+SOfv;o zG4H(@8w~d2yM3UARskNv^oV@RYSyFC0IFhDHD5OpCD0*jZm5%GJz^7{3DV< z-g>UW`hr?9k8H-qVFyyuk~AU-tdyL9Qy+wY=A#5wq7qF+ZH%t`Q3Cx1tjjzV1JpEY zjjjYU!HT1&EI|>>-E7U`I5-2=QI<#s5ZX8zM)5zBia;tjENAKtT5xSKUJ+SF^x0^q zMA@tbaD^sL5zdHERvncQmmjGHQ)$iD(rm5*jRTIUxgy#UQ8vzkj_A!c&SGH#h5ipi z%>w?Rp+O`f3dzzTY5Ix5(3u3u=QDRRv4dEn!Y9H4rVPSr zd2kHq1|)*pHA)0>4~|&)x{%+36d+*#Arb+-x+5a$Vr3)H%fwEg7m2MvFQVbD7tqiX z0gq2{0&kcWXp&$e4^FX81`#$S9I$&cl6T+L+8Kpy9!O zLf#?zQEQk0=u7AT2E1Z%T%)d#H0!#ga+5@3-q2^mg-Yz*Tp49mjA8nm)^$mj5e>|+ z$`i|nWDbFo0nWj^5%Auj@kc~Bm2i|=QUMSlnY|>zm;=oU1`g*$#U4G*D=0J`0(sSo z>T4Db3@i19*(wwc4wQrjgk!rS*@l8}0-}dDnGM7nScKR$Fe3aK;N+U7NczF?j=L{@ zYBsOxi81gMBW4W6s-X#N$TgG-hO`zc&g2$y2%=OpGEj@nNMuTj)(VO>MUtuEfdW8P zt7F4ZBH+YOQCnsVB}IM=n$)CD#LUHEhR5Iy9(J4J$1sBm5W&hiT$ljUVsKooB6^z> zWMkS&+IvFW%7tOJXx{YA7P3j<*x?w=au|pGdjM`qRg`7`mO}SxIcSx##E|cP=oq5E zfWm}v|AiExw00wV0=nt90`dsYkcpI4oJlYQAvuLLsl6+&|H}69}=NrFeoJ&ZM{C)Jt1dISU=oj#K2?wKqenQzkn!^`@}@z!~#|- zs2Ml;kudN;p@W-%zQvv)h+7JfS_0to5n`xW`cePDo(mEJfD;%hwTg(UUWcOsqH*}^ zvp}0f;vHBE!L3OXk_;vnurDfwQzr_H4hZ1+&_B#F04nvzi^D(F*#ZpD!w(I^18lN% z-|!n4hKz;gKzJ^={lLg5-1@*>K_>-rCtxI&62*247Xq0DiKxs#RfR1TDAru4g)GqU z8w`sq4G1E*- zP&ka0ckUt{VxYqZgwsnWX6Nuw?lRhW;Hr#DFV=+rQr|^Mb3l*KXpQ3ZDAbcxD@4Tv zV*@}xgK^w98qP3)$`-oHMovU%&>%KKyt;p!4~{q+xj_WA1L>TW1&-h8`wdkj9C%Rr z<3;Ta>(F-8i|}i~ zj>BKLEDcQB86m=hMGMz%LA4342rnfHV~Fb54`(in2SYF6uV5OMfCITtAf}dQ&~-sa zl57zw0vV`$OeEe(OfK7vefRhylJ6DGP1|f=+wJj!6RMy3G2Vt^&9pGLo3vb?Ox76XhNeQ?0gC1}ar3ns=!<13Cie z;|uqKgA5|v`4A!d7u&g@{Wt|CGulkSQ%VU9LOGSng-9{f<>!hiKP(vjJ`q6y(UGxe zcq2MmzAq%#WfQ8D3;~{J=oc!6%@{{*i<+MZwI1UvF`zd(I+7>pGivP#2GbS&a~y3qbF-_|Zb&2ki%76HrkOn5Jqxei{cfqgKkTRT4FW~5o*yuq- z=SrAHwl<8&+7QK7dn(4dy_}@Nngg%39AQU;?ue=vw26p7X(GF+z`&4bSXAKzjp$QV zCjQtE_JK$}sD!A8;+{?`35x-pBY#JPhrhf8YL^A01m(89x}3IZRVY1?W(ob3D1r7u zT3)G646-n&k<$?d7c{lisw{O_khK(w0}mb?J`8}DDJ%p`4A!R$!luHH0<2Gn)|JR; z7@cUEfOkQvl5Z4{n$jPXR9sCZMJoVX?EWD@3O)c-tcX}^joKYsU~-0WZV3U-SZi@4 zNyFvM5*!%@Lq%#0iiBJ64Z;1ONN502gW&sZE2i%nL=2xLs)-;V2$c{V!7v~LsCJg% zv8Am9My8U;$)Vb(!e)RLZ;xsv zlL4Hsz)1DQr-TMaIaP%N3Wk?W0-s^wMeq*5MvFZJT~)g#bQEnFd0NAHj4JAnn=G)+ z!4)_sPV~IWLOC(5z;*)qpEH0e4+Ms!B|ru|TU8$hBeZ@Vz_o!60hg9{msCowm5nr7 zy}F(3K+@t!U8!`tCvvAr>Y?KeR_n7oyUJZLj~9fX5SP zaRFhV%1TBSqLu~=wjquB_n%Z0{+LwtK9NQ8=z%-Lv!1BnXlQo*?LdbL&8amIlVpyOh5PvS+i)C2@=9ymCjFa(+7D%1N{7a zV7pwccGapffR)-vquD>2j#em+6Gv<`*g@!hm)vM0Wy=G45La z`05~pO}9=+o%!7X=M35j>95qxdhNs6AMH+Z4a4N&9OG;A^zh#J5cMvxr{d>a{^md!nLIS*V?=X!tdhXck1#^qKS2$s-B3oExYaVCmywy< zCKpSn3T;$S3F;Bp)WYcEd51qC)F4itxH{9*;{rr1L|l zDb*R46lo){n9!6KcVC7SDx{b3C1BSb26KXZhG;Xau=6MrU&;Di7fWfV zsrlWeV9oDWSM&Szp_oUfx(PwJca;=a%cDcoXo9c$)fam>An?<3R$dj70gg(F5}|Fx zFCA5l&*mO^v25pSXJQwITcT=vs+n7a%Bhz z^Q(-8>5bLPPA@m6e&#J-)&$nxIcP$O9lITBJvo*6^^|2jmp_Oub>-rPRh6$yyzsPf zfsQrLt$l3&uoZqh^LM4zy~dr-UOk)rlO4a*XcV<+(v@+4r9Sc;@_OT{s%|L{ zT2)zON${=PvU{=5m2Y*ORL`zkh8c>D4!^K($KXrFYY+I-1n@rtvy9cg$urk~91#hmbnrL1$_0*jLpY|rM-TnDm@#9~r zR1fjm7?c$y_GTUPRrl_m==}GV&BL;eZ$4=A;)9j#_nALuj%(6rds?kK)9MB< zygxb9hsc;*+k9H=`!YMr(&1U(o=>q`TYlE5jteXWod&jiS%1lrQ#supm0Dl_ZqK4i zZqF)t_2$gU=e$=?@Tfk?`U7yq%N<^v3SP z{(3PXsonY!d**h3KYm93XB}SL-83ctnL*7Cn|{90zg%IUgN|z1@Lk!MiD{cES37k# z`gUK}cAZyV%Xs?NZ4c&D@~S=S?b3an=8PEhbF+v!qn$@gj7oT)`_dlQx}lpkO!H`4 zqx^x(U*|_xc0YXS?Jv8A4huebVZf{f0}?$8Mux0Dalg*&3mv+@db6a|Gy7AILwlEa z(7r+?bNybwuCbJV(Z%P-_St@!I5s+4(*a(0TAur`yy3M212^=WKC|4|(diy0*J2ZV zs!Ry5`}69Wh_*)~P8D%4SMB`sxuqVJ*m<$a^HA9NZ`3FManJwvUZ89-Tt+HeVqPWnWj9)%jXCj z^ZI_K@gp;|f7vwlLD;%Q5qk$W82Z<`lZi!&-!7AuDPP0Nv+Zss+&oup)3nQl!?xyK za@J}2!ilX%9yw9BRMNickzK0QIlQ-gXz2-t4$4bMeL3-D;G) z^jpa;%Q7TYh$>&ERPU}io;JBx_czC-he~u^)w5XrGwvz-EU)*w=gZw;YN7KF-2w*Y zIDP%gwF%x{jk0fz9sP92l;KfLdR;c#zq>o;?EXrfU+wJFJ0a?3;K%xZuPeI$P3qe& zPE!MS)W5XgX^Z}ECr(SunzDXMal6=OOB(iD?Q(BQ(+l_V*RcPW&&vf%gI2aJa_Z+A zTi&+XP}0BXxv-_qFWU#Vn->>U&10GOz2>_IKX=@^qT-eQmokJdzn(T>f0v-F!Rs>m zS+bAcJG<(XpIlowZ2Vec%Zs?>;Z^JA?>YGE$)dgu#=P%)JUF?~{rJc6<_*W5F8=Z6 z_@fiwj}1;=_DkhM`_C-My`yc1vrEE;{N`P+=A(D7)0{r~kN5U&UBdCs?e?{s=l3ra zSGeNp{i}B!w|`b-#fV*JYrY@m+->GbuLm>dJ^pQTPrFJdk{u@gni6^}-p@OIbk^!a zGCtaT{I=!Bn7Q6RChYbM9<|QRzT%-|%kB7)3%zn3d0Sw1r7a6b<=C}!?ia_S*@8=^ zWKHqt=Dwx(lL9xl#4gTRqfdhoIkt36ySHhDLxI%DGBcfDxGZQLztQEz*H7CoJ1nd4 zA=T?;)*+kC<@>CiR(5I5501OMNA_Bg%jwaf89}D|Wk$MZEC2ODTy=*kL-L%QmH4{X z=7M>9eC^Np9pZJVZkyWOOISusUA8Xna{qyg-^^W5*L6rtqb#N8 zW!rwY$5ZC3 zG9B&`nI&(QrR)7>=lwXU%MX3L?LDSctKzWNv&-9eVdEUS6;F9yD9|COP@%*&t*iNs z8T#{=tW{n&ALo*-Q&@7ZeXczhpM5vuZtSCnjq03uyr}-NnTwA9Icmbw^v`=HcJuNN zIFSF?=H`COhBk0(c)W3;ED^@vPY2uBezWrLS z>3D76$4SjIcY5_aab2dMc?mz1+11s3Nx;5~d2$Zl^X~ZSe#b`EsdpgP($`fwt{D@V zv%`c*Wk#I}-8#5{|6;#q$v^ELySdq4UYqwW-Eqb<{P50V@%?&bPiY>zHstS&E8bMy zc5l-DziS6(zpy6#Wy;m!O)7Qzy>^BbpSGJl?pE)So^_sbgx2bxeWxn34dzRUF zzF3C6Q>tEl>stE9qh_}!B|270e)9bBf>o6}>{*m!=3n((vwP?4Rk}&{g>`Oq`0djd z&#CEIqTjT4`optk;=CajV;dyho4MmaL8q`a_cDEXQhIKqG>EY#BXnai9*_J7>pozW++M}fHq?xoZ!oU;1*l#gYT z>zDIbZ7#U(>YxV~TuRvu*s#-X_mUNz+b#MU@3pQ^$9{<&U&ZIzaPLXg{au&c{&V|> zVTXPGI(Gf<+ zI{%U4_WazABm1Ls4r`oYQ0&IFxqVmOs@MEb@ai9zEo_!?=cK56+m|FI-0HLGONEg8 z0f%~htuu61&>FY?lONxoedk)s8`qAMFM4a|5>rv97cCx4Zt-PW!^fwdynXj_*PP^` zTk}`_+G)V;!KF7Y4_Kb_fPMAb=S+fbtpV=y{aBAJF_ZJ;p-L&x1 zhQGC*ljT|ACj0Z=^9Wi${%OZuAHsfr^YN=skEBw4&O98qXIxar)`O}gu69qme#5C# z%kX?_?s{!l@BG{$ZL;&4Bkwjeoq6wmz*EPa;eRc5{W(W@kJgvNn=a~;~LY&+RKYN4BdZp_R0b=v)+Y;ugK~&>e|NJU!9JZ-Fdu7OwLh1Wqy+< zp_WJf=d&WG=bo|l>hoTePdgPY-7@Nj_suW5U;X`GV-L2Ee`}xj$GPFPKURCOZ_(A^ z#WQDGHafwl<~jFHIqtV~?0d}r#H{o$C+zSaJMB~U&i(O* z{e_%`$KD#9)Ua`#`4>k{e(2ifKD&i|Wrk)G1+X!o^LiU4q(dpR>|q?!C@e-EKH# z+~=0Mw`jom#J#nW#ujY7VDYtk_xBur-({cIvB;tW177#|G$J*v^u8iqr-#MucTHVC zbln!u$YW0flkBb~Cx>Qi=b8EIplyTVN8j8(vE}$mEC18vAK5>jjy!ODWSjr`^|NM3?fBY#|KOi8mI{77bN4yNzC#Y*jjnj?P)e^l+3a_A>l4?}#d5x@`sVkX?iFH=1$XGREH-p`9p@28_aDA>x>fkIw;kT>+xmCY zh3OVJSEqM?k)xM6@Rqo-Kj3u%_skM_}XFF26N(=a+Nxtd7av? zU9lRgmwah9b#>I)4(-b3%6KNpam3_Phl+l@UFcR)^OFa2w(k|%e(AYcbJ8PLw94XG zykXnG`O7kg&8<9Uh~-&>FGYigUjF!Z{n6tVF5Er1SY+=fz9qc2{Wv{;=>4>zi_UjB z;k0IAQ2Tzjrk3-l)Z%lGb=}s_>hC$C<>3l}`#!i8{N-VfqjzTRp7h((%Ln_eZ9eGv z Bool { } fn make_tok(kind: String, value: String) -> Map { - { "kind": kind, "value": value } + let ln_s: String = state_get("__lex_line") + let ln: Int = 1 + if !str_eq(ln_s, "") { let ln = str_to_int(ln_s) } + { "kind": kind, "value": value, "line": ln } } // ── Keyword lookup ──────────────────────────────────────────────────────────── @@ -146,6 +149,9 @@ fn keyword_kind(word: String) -> String { if word == "engine" { return "Engine" } if word == "accessor" { return "Accessor" } if word == "vessel" { return "Vessel" } + if word == "extern" { return "Extern" } + if word == "try" { return "Try" } + if word == "catch" { return "Catch" } "" } @@ -156,7 +162,7 @@ fn keyword_kind(word: String) -> String { // Returns { "text": ..., "pos": i } fn scan_digits(chars: [String], start: Int, total: Int) -> Map { let i = start - let text = "" + let parts: [String] = native_list_empty() let running = true while running { if i >= total { @@ -164,20 +170,20 @@ fn scan_digits(chars: [String], start: Int, total: Int) -> Map { } else { let ch: String = native_list_get(chars, i) if lex_is_digit(ch) { - let text = text + ch + let parts = native_list_append(parts, ch) let i = i + 1 } else { let running = false } } } - { "text": text, "pos": i } + { "text": str_join(parts, ""), "pos": i } } // scan_ident — advance i while chars[i] is alphanumeric or underscore fn scan_ident(chars: [String], start: Int, total: Int) -> Map { let i = start - let text = "" + let parts: [String] = native_list_empty() let running = true while running { if i >= total { @@ -185,14 +191,14 @@ fn scan_ident(chars: [String], start: Int, total: Int) -> Map { } else { let ch: String = native_list_get(chars, i) if is_alnum_or_underscore(ch) { - let text = text + ch + let parts = native_list_append(parts, ch) let i = i + 1 } else { let running = false } } } - { "text": text, "pos": i } + { "text": str_join(parts, ""), "pos": i } } // ── Code-bearing string detection + comment strip ──────────────────────────── @@ -253,7 +259,7 @@ fn looks_like_code(s: String) -> Bool { fn strip_code_comments(s: String) -> String { let chars: [String] = native_string_chars(s) let total: Int = native_list_len(chars) - let out = "" + let out_parts: [String] = native_list_empty() let i = 0 let in_squote = false let in_dquote = false @@ -269,11 +275,11 @@ fn strip_code_comments(s: String) -> String { if in_js_string { // Backslash escape: consume next char verbatim regardless of which. if ch == "\\" { - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let next_i = i + 1 if next_i < total { let nc: String = native_list_get(chars, next_i) - let out = out + nc + let out_parts = native_list_append(out_parts, nc) let prev = nc let i = next_i + 1 } else { @@ -292,7 +298,7 @@ fn strip_code_comments(s: String) -> String { } } } - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let prev = ch let i = i + 1 } @@ -308,7 +314,7 @@ fn strip_code_comments(s: String) -> String { if next_ch == "/" { // URL guard: prev char ':' means this is "://", not a comment. if prev == ":" { - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let prev = ch let i = i + 1 } else { @@ -360,7 +366,7 @@ fn strip_code_comments(s: String) -> String { } let prev = "" } else { - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let prev = ch let i = i + 1 } @@ -369,23 +375,23 @@ fn strip_code_comments(s: String) -> String { // Open a JS string? if ch == "'" { let in_squote = true - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let prev = ch let i = i + 1 } else { if ch == "\"" { let in_dquote = true - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let prev = ch let i = i + 1 } else { if ch == "`" { let in_btick = true - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let prev = ch let i = i + 1 } else { - let out = out + ch + let out_parts = native_list_append(out_parts, ch) let prev = ch let i = i + 1 } @@ -394,14 +400,14 @@ fn strip_code_comments(s: String) -> String { } } } - out + str_join(out_parts, "") } // scan_string — scan a quoted string literal, handling \" escapes. // Starts AFTER the opening quote. Returns { "text": content, "pos": i_after_close } fn scan_string(chars: [String], start: Int, total: Int) -> Map { let i = start - let text = "" + let parts: [String] = native_list_empty() let running = true while running { if i >= total { @@ -414,26 +420,26 @@ fn scan_string(chars: [String], start: Int, total: Int) -> Map { if next_i < total { let next_ch: String = native_list_get(chars, next_i) if next_ch == "\"" { - let text = text + "\"" + let parts = native_list_append(parts, "\"") let i = next_i + 1 } else { if next_ch == "n" { - let text = text + "\n" + let parts = native_list_append(parts, "\n") let i = next_i + 1 } else { if next_ch == "t" { - let text = text + "\t" + let parts = native_list_append(parts, "\t") let i = next_i + 1 } else { if next_ch == "r" { - let text = text + "\r" + let parts = native_list_append(parts, "\r") let i = next_i + 1 } else { if next_ch == "\\" { - let text = text + "\\" + let parts = native_list_append(parts, "\\") let i = next_i + 1 } else { - let text = text + next_ch + let parts = native_list_append(parts, next_ch) let i = next_i + 1 } } @@ -448,13 +454,13 @@ fn scan_string(chars: [String], start: Int, total: Int) -> Map { let i = i + 1 let running = false } else { - let text = text + ch + let parts = native_list_append(parts, ch) let i = i + 1 } } } } - { "text": text, "pos": i } + { "text": str_join(parts, ""), "pos": i } } // ── Main lexer ──────────────────────────────────────────────────────────────── @@ -464,12 +470,18 @@ fn lex(source: String) -> [Map] { let total: Int = native_list_len(chars) let tokens: [Map] = native_list_empty() let i: Int = 0 + let line_num: Int = 1 + state_set("__lex_line", "1") while i < total { let ch: String = native_list_get(chars, i) - // Skip whitespace + // Skip whitespace; track newlines for line-number reporting if lex_is_whitespace(ch) { + if ch == "\n" { + let line_num = line_num + 1 + state_set("__lex_line", native_int_to_str(line_num)) + } let i = i + 1 } else { // Line comments: // @@ -710,8 +722,13 @@ fn lex(source: String) -> [Map] { let tokens = native_list_append(tokens, make_tok("QuestionMark", "?")) let i = i + 1 } else { - // unknown char — skip - let i = i + 1 + if ch == "#" { + let tokens = native_list_append(tokens, make_tok("Hash", "#")) + let i = i + 1 + } else { + // unknown char — skip + let i = i + 1 + } } } } @@ -773,6 +790,15 @@ fn tok_value(tokens: [Map], pos: Int) -> String { t["value"] } +// tok_line — return the source line number of the token at pos (1-indexed). +// Returns 1 if the token has no "line" field or line is 0. +fn tok_line(tokens: [Map], pos: Int) -> Int { + let t = native_list_get(tokens, pos) + let ln: Int = t["line"] + if ln <= 0 { return 1 } + ln +} + fn expect(tokens: [Map], pos: Int, kind: String) -> Int { let k = tok_kind(tokens, pos) if k == kind { @@ -888,6 +914,460 @@ fn parse_params(tokens: [Map], pos: Int) -> Map { // ── Expression parsing ──────────────────────────────────────────────────────── +// ── HTML template parser ────────────────────────────────────────────────────── +// +// HTML templates are written as unquoted HTML in expression position: +// return

{title}

+// +// The parser detects an HTML template when parse_primary sees Lt followed +// by a lowercase ident (a known or assumed HTML element name) or `!` (for +// ). It then recursively parses the HTML into an AST. +// +// AST nodes produced: +// { "expr": "HtmlTemplate", "root": child_node } +// { "html": "Element", "tag": "div", "attrs": [...], "children": [...], "self_closing": bool } +// { "html": "Text", "text": "..." } +// { "html": "Interp", "value": expr_node } +// { "html": "Each", "list": expr_node, "item": "name", "body": [...] } +// { "html": "Doctype" } +// { "html": "Raw", "value": expr_node } + +fn is_html_tag_name(name: String) -> Bool { + if str_eq(name, "a") { return true } + if str_eq(name, "abbr") { return true } + if str_eq(name, "address") { return true } + if str_eq(name, "area") { return true } + if str_eq(name, "article") { return true } + if str_eq(name, "aside") { return true } + if str_eq(name, "audio") { return true } + if str_eq(name, "b") { return true } + if str_eq(name, "base") { return true } + if str_eq(name, "blockquote") { return true } + if str_eq(name, "body") { return true } + if str_eq(name, "br") { return true } + if str_eq(name, "button") { return true } + if str_eq(name, "canvas") { return true } + if str_eq(name, "caption") { return true } + if str_eq(name, "cite") { return true } + if str_eq(name, "code") { return true } + if str_eq(name, "col") { return true } + if str_eq(name, "colgroup") { return true } + if str_eq(name, "data") { return true } + if str_eq(name, "datalist") { return true } + if str_eq(name, "dd") { return true } + if str_eq(name, "del") { return true } + if str_eq(name, "details") { return true } + if str_eq(name, "dfn") { return true } + if str_eq(name, "dialog") { return true } + if str_eq(name, "div") { return true } + if str_eq(name, "dl") { return true } + if str_eq(name, "dt") { return true } + if str_eq(name, "em") { return true } + if str_eq(name, "embed") { return true } + if str_eq(name, "fieldset") { return true } + if str_eq(name, "figcaption") { return true } + if str_eq(name, "figure") { return true } + if str_eq(name, "footer") { return true } + if str_eq(name, "form") { return true } + if str_eq(name, "h1") { return true } + if str_eq(name, "h2") { return true } + if str_eq(name, "h3") { return true } + if str_eq(name, "h4") { return true } + if str_eq(name, "h5") { return true } + if str_eq(name, "h6") { return true } + if str_eq(name, "head") { return true } + if str_eq(name, "header") { return true } + if str_eq(name, "hr") { return true } + if str_eq(name, "html") { return true } + if str_eq(name, "i") { return true } + if str_eq(name, "iframe") { return true } + if str_eq(name, "img") { return true } + if str_eq(name, "input") { return true } + if str_eq(name, "ins") { return true } + if str_eq(name, "kbd") { return true } + if str_eq(name, "label") { return true } + if str_eq(name, "legend") { return true } + if str_eq(name, "li") { return true } + if str_eq(name, "link") { return true } + if str_eq(name, "main") { return true } + if str_eq(name, "map") { return true } + if str_eq(name, "mark") { return true } + if str_eq(name, "menu") { return true } + if str_eq(name, "meta") { return true } + if str_eq(name, "meter") { return true } + if str_eq(name, "nav") { return true } + if str_eq(name, "noscript") { return true } + if str_eq(name, "object") { return true } + if str_eq(name, "ol") { return true } + if str_eq(name, "optgroup") { return true } + if str_eq(name, "option") { return true } + if str_eq(name, "output") { return true } + if str_eq(name, "p") { return true } + if str_eq(name, "param") { return true } + if str_eq(name, "picture") { return true } + if str_eq(name, "pre") { return true } + if str_eq(name, "progress") { return true } + if str_eq(name, "q") { return true } + if str_eq(name, "rp") { return true } + if str_eq(name, "rt") { return true } + if str_eq(name, "ruby") { return true } + if str_eq(name, "s") { return true } + if str_eq(name, "samp") { return true } + if str_eq(name, "script") { return true } + if str_eq(name, "section") { return true } + if str_eq(name, "select") { return true } + if str_eq(name, "small") { return true } + if str_eq(name, "source") { return true } + if str_eq(name, "span") { return true } + if str_eq(name, "strong") { return true } + if str_eq(name, "style") { return true } + if str_eq(name, "sub") { return true } + if str_eq(name, "summary") { return true } + if str_eq(name, "sup") { return true } + if str_eq(name, "table") { return true } + if str_eq(name, "tbody") { return true } + if str_eq(name, "td") { return true } + if str_eq(name, "template") { return true } + if str_eq(name, "textarea") { return true } + if str_eq(name, "tfoot") { return true } + if str_eq(name, "th") { return true } + if str_eq(name, "thead") { return true } + if str_eq(name, "time") { return true } + if str_eq(name, "title") { return true } + if str_eq(name, "tr") { return true } + if str_eq(name, "track") { return true } + if str_eq(name, "u") { return true } + if str_eq(name, "ul") { return true } + if str_eq(name, "var") { return true } + if str_eq(name, "video") { return true } + if str_eq(name, "wbr") { return true } + false +} + +fn is_void_element(name: String) -> Bool { + if str_eq(name, "area") { return true } + if str_eq(name, "base") { return true } + if str_eq(name, "br") { return true } + if str_eq(name, "col") { return true } + if str_eq(name, "embed") { return true } + if str_eq(name, "hr") { return true } + if str_eq(name, "img") { return true } + if str_eq(name, "input") { return true } + if str_eq(name, "link") { return true } + if str_eq(name, "meta") { return true } + if str_eq(name, "param") { return true } + if str_eq(name, "source") { return true } + if str_eq(name, "track") { return true } + if str_eq(name, "wbr") { return true } + false +} + +// Collect tokens as text content until we hit Lt, LBrace, Eof, or a +// closing-tag marker (Lt Slash). Returns { "text": "...", "pos": p } +fn parse_html_text_tokens(tokens: [Map], pos: Int) -> Map { + let parts: [String] = native_list_empty() + let p = pos + let running = true + while running { + let k = tok_kind(tokens, p) + if str_eq(k, "Eof") { + let running = false + } else { + if str_eq(k, "Lt") { + let running = false + } else { + if str_eq(k, "LBrace") { + let running = false + } else { + // Check for ). +fn parse_html_attrs(tokens: [Map], pos: Int) -> Map { + let attrs: [Map] = native_list_empty() + let p = pos + let running = true + while running { + let k = tok_kind(tokens, p) + if str_eq(k, "Gt") { + let running = false + } else { + if str_eq(k, "Slash") { + let running = false + } else { + if str_eq(k, "Eof") { + let running = false + } else { + // Attribute name: could be Ident or keyword used as attr name + let attr_name = tok_value(tokens, p) + let p = p + 1 + let k2 = tok_kind(tokens, p) + if str_eq(k2, "Eq") { + let p = p + 1 + let k3 = tok_kind(tokens, p) + if str_eq(k3, "Str") { + // static: attr="value" + let attr_val = tok_value(tokens, p) + let p = p + 1 + let attrs = native_list_append(attrs, { "name": attr_name, "kind": "static", "value": attr_val }) + } else { + if str_eq(k3, "LBrace") { + // dynamic: attr={expr} + let r = parse_expr(tokens, p + 1) + let val_node = r["node"] + let p = r["pos"] + let p = expect(tokens, p, "RBrace") + let attrs = native_list_append(attrs, { "name": attr_name, "kind": "dynamic", "value": val_node }) + } else { + // malformed, skip + } + } + } else { + // boolean attribute + let attrs = native_list_append(attrs, { "name": attr_name, "kind": "bool" }) + } + } + } + } + } + { "attrs": attrs, "pos": p } +} + +// Parse the children of an HTML element until we see the closing tag +// or EOF. Returns { "children": [...], "pos": p_after_closing_tag } +fn parse_html_children(tokens: [Map], pos: Int, parent_tag: String) -> Map { + let children: [Map] = native_list_empty() + let p = pos + let running = true + while running { + let k = tok_kind(tokens, p) + if str_eq(k, "Eof") { + let running = false + } else { + if str_eq(k, "Lt") { + // Check for closing tag: — consume and stop + let p = p + 2 + // skip tag name + let close_name = tok_value(tokens, p) + let p = p + 1 + // consume > + let p = expect(tokens, p, "Gt") + let running = false + } else { + if str_eq(k2, "Not") { + // Possible + let k3_v = tok_value(tokens, p + 2) + if str_eq(k3_v, "doctype") { + // consume + let p = p + 2 + // skip until > + let scanning = true + while scanning { + let ck = tok_kind(tokens, p) + if str_eq(ck, "Eof") { let scanning = false } + if str_eq(ck, "Gt") { + let p = p + 1 + let scanning = false + } else { + let p = p + 1 + } + } + let children = native_list_append(children, { "html": "Doctype" }) + } else { + let p = p + 1 + } + } else { + // nested element + let r = parse_html_element(tokens, p) + let child = r["node"] + let p = r["pos"] + let children = native_list_append(children, child) + } + } + } else { + if str_eq(k, "LBrace") { + // Interpolation: {expr} or {#each ...} or {/each} + let k2 = tok_kind(tokens, p + 1) + if str_eq(k2, "Hash") { + // {#each list as item} + let k3_v = tok_value(tokens, p + 2) + if str_eq(k3_v, "each") { + let p = p + 3 + // parse list expr up to "as" keyword + let prev_no_block: String = state_get("__no_block_expr") + state_set("__no_block_expr", "1") + let r_list = parse_expr(tokens, p) + state_set("__no_block_expr", prev_no_block) + let list_expr = r_list["node"] + let p = r_list["pos"] + // expect "as" + let p = expect(tokens, p, "As") + // item variable name + let item_name = tok_value(tokens, p) + let p = p + 1 + // consume closing } + let p = expect(tokens, p, "RBrace") + // parse body until {/each} + let r_body = parse_html_each_body(tokens, p) + let body_children = r_body["children"] + let p = r_body["pos"] + let each_node: Map = { "html": "Each", "list": list_expr, "item": item_name, "body": body_children } + let children = native_list_append(children, each_node) + } else { + let p = p + 1 + } + } else { + if str_eq(k2, "Slash") { + // {/each} — end of each block, stop + // skip {/each} + let p = p + 2 + // skip "each" + let p = p + 1 + // skip } + let p = expect(tokens, p, "RBrace") + let running = false + } else { + // regular {expr} + let r = parse_expr(tokens, p + 1) + let interp_val = r["node"] + let p = r["pos"] + let p = expect(tokens, p, "RBrace") + // Check if the expr is a call to raw() + let is_raw_call = false + let interp_kind: String = interp_val["expr"] + if str_eq(interp_kind, "Call") { + let fn_node = interp_val["func"] + let fn_kind: String = fn_node["expr"] + if str_eq(fn_kind, "Ident") { + let fn_name_v: String = fn_node["name"] + if str_eq(fn_name_v, "raw") { + let is_raw_call = true + } + } + } + if is_raw_call { + let raw_args = interp_val["args"] + let raw_inner = native_list_get(raw_args, 0) + let children = native_list_append(children, { "html": "Raw", "value": raw_inner }) + } else { + let children = native_list_append(children, { "html": "Interp", "value": interp_val }) + } + } + } + } else { + // Text tokens — collect run of non-special tokens + let r_text = parse_html_text_tokens(tokens, p) + let text_str: String = r_text["text"] + let p = r_text["pos"] + let text_trimmed: String = str_trim(text_str) + if !str_eq(text_trimmed, "") { + let children = native_list_append(children, { "html": "Text", "text": text_trimmed }) + } + } + } + } + } + { "children": children, "pos": p } +} + +// Parse body of {#each} until {/each}. Mirrors parse_html_children but +// stops at the {/each} sentinel rather than a closing element tag. +fn parse_html_each_body(tokens: [Map], pos: Int) -> Map { + parse_html_children(tokens, pos, "__each__") +} + +// Parse a single HTML element: children +// or self-closing: +// Pos points to the Lt token. +fn parse_html_element(tokens: [Map], pos: Int) -> Map { + let p = pos + // consume < + let p = expect(tokens, p, "Lt") + // tag name + let tag_name = tok_value(tokens, p) + let p = p + 1 + // parse attributes + let r_attrs = parse_html_attrs(tokens, p) + let attrs = r_attrs["attrs"] + let p = r_attrs["pos"] + // check for self-closing /> or void element + let k = tok_kind(tokens, p) + let self_closing = false + if str_eq(k, "Slash") { + // /> + let p = p + 1 + let p = expect(tokens, p, "Gt") + let self_closing = true + return make_result({ "html": "Element", "tag": tag_name, "attrs": attrs, "children": native_list_empty(), "self_closing": true }, p) + } + // consume > + let p = expect(tokens, p, "Gt") + // void elements have no children, no closing tag + if is_void_element(tag_name) { + return make_result({ "html": "Element", "tag": tag_name, "attrs": attrs, "children": native_list_empty(), "self_closing": true }, p) + } + // parse children + let r_children = parse_html_children(tokens, p, tag_name) + let children = r_children["children"] + let p = r_children["pos"] + make_result({ "html": "Element", "tag": tag_name, "attrs": attrs, "children": children, "self_closing": false }, p) +} + +// Entry point for HTML template parsing. +// Pos points to Lt (or Lt Not for ). +// May parse an optional prefix followed by the root element. +fn parse_html_template(tokens: [Map], pos: Int) -> Map { + let p = pos + // Check for + let doctype = false + let k = tok_kind(tokens, p) + let k2 = tok_kind(tokens, p + 1) + if str_eq(k, "Lt") { + if str_eq(k2, "Not") { + let k3_v = tok_value(tokens, p + 2) + if str_eq(k3_v, "doctype") { + let doctype = true + // consume + let p = p + 2 + let scanning = true + while scanning { + let ck = tok_kind(tokens, p) + if str_eq(ck, "Eof") { let scanning = false } + if str_eq(ck, "Gt") { + let p = p + 1 + let scanning = false + } else { + let p = p + 1 + } + } + } + } + } + // Parse root element + let r = parse_html_element(tokens, p) + let root = r["node"] + let p = r["pos"] + let root_with_doctype = root + if doctype { + let root_with_doctype = { "html": root["html"], "tag": root["tag"], "attrs": root["attrs"], "children": root["children"], "self_closing": root["self_closing"], "doctype": true } + } + make_result({ "expr": "HtmlTemplate", "root": root_with_doctype }, p) +} + fn parse_primary(tokens: [Map], pos: Int) -> Map { let k = tok_kind(tokens, pos) let v = tok_value(tokens, pos) @@ -912,6 +1392,22 @@ fn parse_primary(tokens: [Map], pos: Int) -> Map { return make_result({ "expr": "Bool", "value": v }, pos + 1) } + // HTML template literal: ... or ... + // Detected in value position only; `<` in comparison position is already + // consumed by parse_binop before parse_primary is reached. + if k == "Lt" { + let k2 = tok_kind(tokens, pos + 1) + if str_eq(k2, "Not") { + return parse_html_template(tokens, pos) + } + if str_eq(k2, "Ident") { + let tag_candidate = tok_value(tokens, pos + 1) + if is_html_tag_name(tag_candidate) { + return parse_html_template(tokens, pos) + } + } + } + // Identifier if k == "Ident" { return make_result({ "expr": "Ident", "name": v }, pos + 1) @@ -1025,6 +1521,30 @@ fn parse_primary(tokens: [Map], pos: Int) -> Map { return r } + // Anonymous function literal (lambda): fn(params) -> RetType { body } + // Used for inline callbacks: dom_listen(el, "click", fn(e: Any) -> Void { ... }) + // Produces a Lambda expression node (distinct from a named FnDef statement). + if k == "Fn" { + let p = pos + 1 + let r = parse_params(tokens, p) + let params = r["params"] + let p = r["pos"] + let ret_type = "" + let k2 = tok_kind(tokens, p) + if k2 == "Arrow" { + let p = p + 1 + let kt = tok_kind(tokens, p) + if kt == "Ident" { + let ret_type = tok_value(tokens, p) + } + let p = skip_type(tokens, p) + } + let r2 = parse_block(tokens, p) + let body = r2["stmts"] + let p = r2["pos"] + return make_result({ "expr": "Lambda", "params": params, "body": body, "ret_type": ret_type }, p) + } + // Unary not if k == "Not" { let r = parse_primary(tokens, pos + 1) @@ -1154,6 +1674,13 @@ fn parse_pattern(tokens: [Map], pos: Int) -> Map { if v == "_" { return make_result({ "pattern": "Wildcard" }, pos + 1) } + // Check for Enum::Variant pattern (Color::Red, Status::Ok, etc.) + // Lexed as: Ident ColonColon Ident + let next_k = tok_kind(tokens, pos + 1) + if next_k == "ColonColon" { + let variant_name = tok_value(tokens, pos + 2) + return make_result({ "pattern": "Variant", "enum_name": v, "variant": variant_name }, pos + 3) + } return make_result({ "pattern": "Binding", "name": v }, pos + 1) } if k == "Int" { @@ -1433,6 +1960,29 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { return make_result({ "stmt": "Return", "value": val }, p) } + // extern fn declaration (no body — forward declaration for separate compilation) + if k == "Extern" { + let p = pos + 1 + let k2: String = tok_kind(tokens, p) + if str_eq(k2, "Fn") { + let p = p + 1 + let name: String = tok_value(tokens, p) + let p = p + 1 + let r = parse_params(tokens, p) + let params = r["params"] + let p = r["pos"] + let ret_type = "" + let k3: String = tok_kind(tokens, p) + if str_eq(k3, "Arrow") { + let p = p + 1 + let kt: String = tok_kind(tokens, p) + if str_eq(kt, "Ident") { let ret_type = tok_value(tokens, p) } + let p = skip_type(tokens, p) + } + return make_result({ "stmt": "ExternFn", "name": name, "params": params, "ret_type": ret_type }, p) + } + } + // fn definition if k == "Fn" { let p = pos + 1 @@ -1460,11 +2010,16 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { return make_result({ "stmt": "FnDef", "name": name, "params": params, "body": body, "ret_type": ret_type }, p) } - // type definition + // type definition: `type Name = { field: Type, ... }` + // The `=` between the name and the brace is optional in the spec but + // present in practice. Skip it if present before consuming the LBrace. if k == "Type" { let p = pos + 1 let name = tok_value(tokens, p) let p = p + 1 + // Consume optional `=` before the opening brace + let pk = tok_kind(tokens, p) + if pk == "Eq" { let p = p + 1 } let p = expect(tokens, p, "LBrace") let fields: [Map] = native_list_empty() let running = true @@ -1599,6 +2154,40 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { return make_result({ "stmt": "For", "item": item_name, "list": list_expr, "body": body }, p) } + // try/catch statement + // try { body } catch (name: Type) { handler } + // The catch variable name and type are both captured; type is skipped. + if k == "Try" { + let p = pos + 1 + let r_try = parse_block(tokens, p) + let try_body = r_try["stmts"] + let p = r_try["pos"] + let catch_name = "err" + let k2 = tok_kind(tokens, p) + if str_eq(k2, "Catch") { + let p = p + 1 + let p = expect(tokens, p, "LParen") + // catch variable name + let kn = tok_kind(tokens, p) + if str_eq(kn, "Ident") { + let catch_name = tok_value(tokens, p) + let p = p + 1 + } + // optional type annotation: : Type + let k3 = tok_kind(tokens, p) + if str_eq(k3, "Colon") { + let p = p + 1 + let p = skip_type(tokens, p) + } + let p = expect(tokens, p, "RParen") + let r_catch = parse_block(tokens, p) + let catch_body = r_catch["stmts"] + let p = r_catch["pos"] + return make_result({ "stmt": "TryCatch", "try_body": try_body, "catch_name": catch_name, "catch_body": catch_body }, p) + } + return make_result({ "stmt": "TryCatch", "try_body": try_body, "catch_name": catch_name, "catch_body": native_list_empty() }, p) + } + // @decorator — capture decorator name and attach to following stmt if k == "At" { let p = pos + 1 @@ -1737,6 +2326,35 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { }, p) } + // assert statement: assert or assert , "msg" + if k == "Assert" { + let assert_line: Int = tok_line(tokens, pos) + let p = pos + 1 + let r = parse_expr(tokens, p) + let expr_node = r["node"] + let p = r["pos"] + let msg = "" + let k2 = tok_kind(tokens, p) + if k2 == "Comma" { + let p = p + 1 + let msg = tok_value(tokens, p) + let p = p + 1 + } + return make_result({ "stmt": "Assert", "expr": expr_node, "msg": msg, "line": assert_line }, p) + } + + // test block: test "name" { stmts } + if k == "Test" { + let test_line: Int = tok_line(tokens, pos) + let p = pos + 1 + let name = tok_value(tokens, p) + let p = p + 1 + let r2 = parse_block(tokens, p) + let body = r2["stmts"] + let p = r2["pos"] + return make_result({ "stmt": "TestDef", "name": name, "body": body, "line": test_line }, p) + } + // Bare reassignment: `name = expr`. Handled BEFORE the expression // fallback so we don't drop the assign on the floor and emit three // orphan expressions (the original silent-miscompile bug). El's `let` @@ -1792,7 +2410,7 @@ fn parse(tokens: [Map]) -> [Map] { } stmts } -// codegen.el — El compiler C source code generator +// codegen.el - El compiler C source code generator // // Input: list of AST statement maps (from parser.el) // Output: C source printed to stdout (streamed, one line at a time) @@ -1801,37 +2419,90 @@ fn parse(tokens: [Map]) -> [Map] { // Functions map directly to C functions; top-level statements become main(). // // Entry point: fn codegen(stmts: [Map], source: String) -> String -// Returns "" — output goes to stdout via println(). +// Returns "" - output goes to stdout via println(). // -// Streaming output avoids O(n²) string concatenation: each emitted line is +// Streaming output avoids O(n-) string concatenation: each emitted line is // printed immediately rather than appended to a growing string. -// ── String helpers ──────────────────────────────────────────────────────────── +// -- String helpers ------------------------------------------------------------ // Escape a C string literal (double-quotes and backslashes). +// Hex-encode a single nibble (0-15) as a lowercase hex character. +fn nibble_to_hex(n: Int) -> String { + str_char_at("0123456789abcdef", n) +} + +// Encode a byte value (0-255) as a two-character hex string. +fn byte_to_hex2(b: Int) -> String { + let hi: Int = (b / 16) + let lo: Int = (b - hi * 16) + nibble_to_hex(hi) + nibble_to_hex(lo) +} + +// Return true if the byte value is a C hex digit (0-9, a-f, A-F). +// Used to determine whether a \xNN escape needs a string-literal split +// to prevent the C preprocessor from greedily consuming following hex chars. +fn is_hex_digit_byte(b: Int) -> Bool { + if b >= 48 { if b <= 57 { return true } } // 0-9 + if b >= 65 { if b <= 70 { return true } } // A-F + if b >= 97 { if b <= 102 { return true } } // a-f + false +} + fn c_escape(s: String) -> String { - let chars: [String] = native_string_chars(s) - let total: Int = native_list_len(chars) - let out = "" - let i = 0 + // Use index-based byte scanning via str_char_code(s, i) and str_char_at(s, i). + // This avoids native_string_chars + str_join, which corrupts high-byte (>= 0x80) + // characters because list_join's looks_like_string heuristic rejects strings + // whose first byte is >= 0x7F and emits them as decimal pointer values instead. + // + // IMPORTANT: after a \xNN hex escape, if the next byte is a hex digit + // (0-9, a-f, A-F), we emit `""` to split the C string literal so the C + // compiler does not greedily read extra hex digits as part of the escape. + // E.g. "\xad" followed by "bamos" must become "\xad" "bamos" because 'b' + // is a hex digit and C would otherwise read "\xadb" (= 0xADB, out of range). + let total: Int = str_len(s) + let parts: [String] = native_list_empty() + let i: Int = 0 + let prev_was_hex_escape: Bool = false while i < total { - let ch: String = native_list_get(chars, i) - if ch == "\"" { - let out = out + "\\\"" + let bval: Int = str_char_code(s, i) + // If the previous token was a \xNN escape and the current byte is a + // hex digit, insert an empty string literal ("") to break the escape. + if prev_was_hex_escape { + if is_hex_digit_byte(bval) { + let parts = native_list_append(parts, "\"\"") + } + } + let prev_was_hex_escape = false + if bval == 34 { + // 34 = '"' + let parts = native_list_append(parts, "\\\"") } else { - if ch == "\\" { - let out = out + "\\\\" + if bval == 92 { + // 92 = '\\' + let parts = native_list_append(parts, "\\\\") } else { - if ch == "\n" { - let out = out + "\\n" + if bval == 10 { + // 10 = '\n' + let parts = native_list_append(parts, "\\n") } else { - if ch == "\r" { - let out = out + "\\r" + if bval == 13 { + // 13 = '\r' + let parts = native_list_append(parts, "\\r") } else { - if ch == "\t" { - let out = out + "\\t" + if bval == 9 { + // 9 = '\t' + let parts = native_list_append(parts, "\\t") } else { - let out = out + ch + if bval >= 128 { + // Escape non-ASCII bytes (>= 0x80) as \xNN so + // Clang does not misinterpret multi-byte UTF-8 + // sequences in C string literals. + let parts = native_list_append(parts, "\\x" + byte_to_hex2(bval)) + let prev_was_hex_escape = true + } else { + let parts = native_list_append(parts, str_char_at(s, i)) + } } } } @@ -1839,14 +2510,14 @@ fn c_escape(s: String) -> String { } let i = i + 1 } - out + str_join(parts, "") } fn c_str_lit(s: String) -> String { "\"" + c_escape(s) + "\"" } -// ── Type mapping ────────────────────────────────────────────────────────────── +// -- Type mapping -------------------------------------------------------------- fn el_type_to_c(type_str: String) -> String { if type_str == "String" { return "const char*" } @@ -1858,7 +2529,7 @@ fn el_type_to_c(type_str: String) -> String { "void*" } -// ── Code emission ───────────────────────────────────────────────────────────── +// -- Code emission ------------------------------------------------------------- // // emit_line/emit_blank stream output directly via println. // This avoids building a large string in memory. @@ -1871,7 +2542,7 @@ fn emit_blank() -> Void { println("") } -// ── Operator helpers ────────────────────────────────────────────────────────── +// -- Operator helpers ---------------------------------------------------------- fn binop_to_c(op: String) -> String { if op == "Plus" { return "+" } @@ -1889,11 +2560,11 @@ fn binop_to_c(op: String) -> String { op } -// ── Expression codegen ──────────────────────────────────────────────────────── +// -- Expression codegen -------------------------------------------------------- // // cg_expr returns a C expression string (not a statement). -// duration_unit_nanos — multiplier from a postfix-literal unit name to +// duration_unit_nanos - multiplier from a postfix-literal unit name to // nanoseconds. Singular and plural forms collapse to the same multiplier; // the parser already restricted `unit` to the set is_duration_unit accepts. // Returns the multiplier as a decimal string suitable for splicing into @@ -1916,6 +2587,167 @@ fn duration_unit_nanos(unit: String) -> String { "1LL" } +// ── HTML template codegen ───────────────────────────────────────────────── +// +// cg_html_template(expr) emits a C statement-expression `({ ... })` that +// builds the HTML string by chaining el_str_concat calls. +// +// Interpolated values are passed through html_escape(); the raw() form +// bypasses escaping. {#each} blocks compile to C for-loops that index into +// the list with el_list_get / el_list_len. +// +// A per-template accumulator variable `_html_N` holds the growing string. +// A global counter stored in state keeps names unique. + +fn next_html_id() -> String { + let csv: String = state_get("__html_counter") + let n = 0 + if !str_eq(csv, "") { + let n = str_to_int(csv) + } + let n = n + 1 + state_set("__html_counter", native_int_to_str(n)) + native_int_to_str(n) +} + +// Emit children nodes into a flat list of C fragment strings (parts). +// Each part is either a static string fragment (already C-literal form) or +// a dynamic expression that produces an el_val_t string. +// We build them all into parts, then the caller wraps with concat chain. + +fn cg_html_parts(children: [Map], acc_var: String) -> String { + let n: Int = native_list_len(children) + let i = 0 + let out = "" + while i < n { + let child: Map = native_list_get(children, i) + let html_kind: String = child["html"] + if str_eq(html_kind, "Text") { + let text: String = child["text"] + let out = out + acc_var + " = el_str_concat(" + acc_var + ", EL_STR(" + c_str_lit(text) + ")); " + } + if str_eq(html_kind, "Doctype") { + let out = out + acc_var + " = el_str_concat(" + acc_var + ", EL_STR(\"\")); " + } + if str_eq(html_kind, "Interp") { + let val_node = child["value"] + let val_c: String = cg_expr(val_node) + let out = out + acc_var + " = el_str_concat(" + acc_var + ", html_escape(" + val_c + ")); " + } + if str_eq(html_kind, "Raw") { + let val_node = child["value"] + let val_c: String = cg_expr(val_node) + let out = out + acc_var + " = el_str_concat(" + acc_var + ", html_raw(" + val_c + ")); " + } + if str_eq(html_kind, "Element") { + let elem_c: String = cg_html_element_str(child, acc_var) + let out = out + elem_c + } + if str_eq(html_kind, "Each") { + let each_c: String = cg_html_each(child, acc_var) + let out = out + each_c + } + let i = i + 1 + } + out +} + +// Generate open-tag attribute fragments inline. +// Parser stores attrs with "kind": "static" | "dynamic" | "bool". +// Static: "value" is the raw string value (not an expr node). +// Dynamic: "value" is an expr node. +// Bool: no "value" field. +fn cg_html_attrs_str(attrs: [Map], acc_var: String) -> String { + let n: Int = native_list_len(attrs) + let i = 0 + let out = "" + // Closing-quote snippet: EL_STR("\"") in C text. + let close_q: String = "EL_STR(" + c_str_lit("\"") + ")" + while i < n { + let attr: Map = native_list_get(attrs, i) + let attr_name: String = attr["name"] + let kind: String = attr["kind"] + // Build: EL_STR(" name=\"") + let open_val: String = " " + attr_name + "=\"" + let open_attr: String = "EL_STR(" + c_str_lit(open_val) + ")" + if str_eq(kind, "static") { + // Static attribute: value is a raw string. + let sv: String = attr["value"] + let out = out + acc_var + " = el_str_concat(" + acc_var + ", " + open_attr + "); " + let out = out + acc_var + " = el_str_concat(" + acc_var + ", EL_STR(" + c_str_lit(sv) + ")); " + let out = out + acc_var + " = el_str_concat(" + acc_var + ", " + close_q + "); " + } else { + if str_eq(kind, "dynamic") { + // Dynamic attribute: value is an expr node — html_escape it. + let val_node = attr["value"] + let val_c: String = cg_expr(val_node) + let out = out + acc_var + " = el_str_concat(" + acc_var + ", " + open_attr + "); " + let out = out + acc_var + " = el_str_concat(" + acc_var + ", html_escape(" + val_c + ")); " + let out = out + acc_var + " = el_str_concat(" + acc_var + ", " + close_q + "); " + } else { + // Boolean attribute (no value): emit " name" + let bool_attr: String = "EL_STR(" + c_str_lit(" " + attr_name) + ")" + let out = out + acc_var + " = el_str_concat(" + acc_var + ", " + bool_attr + "); " + } + } + let i = i + 1 + } + out +} + +// Generate code for a single element, appending into acc_var. +fn cg_html_element_str(elem: Map, acc_var: String) -> String { + let tag: String = elem["tag"] + let attrs: [Map] = elem["attrs"] + let children: [Map] = elem["children"] + let self_closing: Bool = elem["self_closing"] + // Open tag: + let out = out + acc_var + " = el_str_concat(" + acc_var + ", EL_STR(\"/>\")); " + } else { + // Close open tag: > + let out = out + acc_var + " = el_str_concat(" + acc_var + ", EL_STR(\">\")); " + let out = out + cg_html_parts(children, acc_var) + let out = out + acc_var + " = el_str_concat(" + acc_var + ", EL_STR(\"\")); " + } + out +} + +// Generate code for {#each list as item} ... {/each}. +fn cg_html_each(node: Map, acc_var: String) -> String { + let list_expr = node["list"] + let item_name: String = node["item"] + let body_children: [Map] = node["body"] + let id: String = next_html_id() + let list_var: String = "_html_list_" + id + let len_var: String = "_html_len_" + id + let idx_var: String = "_html_i_" + id + let list_c: String = cg_expr(list_expr) + let inner_c: String = cg_html_parts(body_children, acc_var) + // Emit: { el_val_t _list = expr; int _len = el_list_len(_list); + // for (int _i = 0; _i < _len; _i++) { + // el_val_t item = el_list_get(_list, _i); inner_c } } + "{ el_val_t " + list_var + " = (" + list_c + "); el_val_t " + len_var + " = el_list_len(" + list_var + "); for (el_val_t " + idx_var + " = 0; " + idx_var + " < " + len_var + "; " + idx_var + "++) { el_val_t " + item_name + " = el_list_get(" + list_var + ", " + idx_var + "); " + inner_c + "} } " +} + +// Top-level HTML template codegen — returns a C statement-expression string. +fn cg_html_template(expr: Map) -> String { + let root = expr["root"] + let id: String = next_html_id() + let acc: String = "_html_" + id + // If the root element has doctype:true the parser tagged it from + let doctype_flag: Bool = root["doctype"] + let doctype_prefix: String = "" + if doctype_flag { + let doctype_prefix = acc + " = el_str_concat(" + acc + ", EL_STR(\"\")); " + } + let body: String = cg_html_element_str(root, acc) + "({ el_val_t " + acc + " = EL_STR(\"\"); " + doctype_prefix + body + acc + "; })" +} + fn cg_expr(expr: Map) -> String { let kind: String = expr["expr"] @@ -1924,7 +2756,7 @@ fn cg_expr(expr: Map) -> String { return v } - // DurationLit — postfix-literal time value (e.g. 30.seconds, 1.hour). + // DurationLit - postfix-literal time value (e.g. 30.seconds, 1.hour). // Lowered to a literal int64 nanosecond count, wrapped in the runtime // entry point so the intent is explicit at the C level. The arithmetic // is fully constant-folded by any optimising C compiler. @@ -1938,7 +2770,7 @@ fn cg_expr(expr: Map) -> String { if kind == "Float" { // Wrap Float literals in el_from_float() so the bit pattern is // preserved through the el_val_t (int64) slot. Without this, - // implicit double→int64 conversion in C truncates `0.8` to `0` + // implicit double->int64 conversion in C truncates `0.8` to `0` // when passed to a builtin that expects el_val_t. let v: String = expr["value"] return "el_from_float(" + v + ")" @@ -1985,7 +2817,26 @@ fn cg_expr(expr: Map) -> String { let left_kind: String = left["expr"] let right_kind: String = right["expr"] - // ── Temporal-type dispatch (Instant + Duration first-class) ──────── + // -- String/equality fast-path: skip O(N-) temporal traversals -------- + // The 10 temporal predicates below each recurse into the left subtree: + // O(depth) state_get calls per predicate, O(N-) total for a chain of N + // string-concat BinOps (e.g. the 70-100-part HTML chains in soul.el). + // When either operand is a bare Str literal the result is always concat + // or str_eq - no temporal dispatch is possible. Exit immediately. + if str_eq(op, "Plus") { + if str_eq(left_kind, "Str") { return "el_str_concat(" + left_c + ", " + right_c + ")" } + if str_eq(right_kind, "Str") { return "el_str_concat(" + left_c + ", " + right_c + ")" } + } + if str_eq(op, "EqEq") { + if str_eq(left_kind, "Str") { return "str_eq(" + left_c + ", " + right_c + ")" } + if str_eq(right_kind, "Str") { return "str_eq(" + left_c + ", " + right_c + ")" } + } + if str_eq(op, "NotEq") { + if str_eq(left_kind, "Str") { return "!str_eq(" + left_c + ", " + right_c + ")" } + if str_eq(right_kind, "Str") { return "!str_eq(" + left_c + ", " + right_c + ")" } + } + + // -- Temporal-type dispatch (Instant + Duration first-class) -------- // Run BEFORE the int / string / generic paths so typed temporal // operands route through the runtime wrappers and invalid combos // become #error directives rather than silently falling through to @@ -2171,7 +3022,7 @@ fn cg_expr(expr: Map) -> String { if right_is_dur { return "el_duration_ne(" + left_c + ", " + right_c + ")" } } } - // Fall through — let the existing path handle anything we + // Fall through - let the existing path handle anything we // didn't explicitly cover (typically string-concat with a // typed temporal value, e.g. for debug prints, which works // because both share the int64 slot). @@ -2190,7 +3041,7 @@ fn cg_expr(expr: Map) -> String { // builtin, or BinOp arithmetic over Ints) participates in // arithmetic, not string concat. Recursion into BinOp lets // `a + b + c` (chained Int adds) and `acc * 16 + d` route to - // arithmetic instead of falling to el_str_concat — both sides + // arithmetic instead of falling to el_str_concat - both sides // are Int so the outer `+` is too. if is_int_expr(left) { if is_int_expr(right) { @@ -2211,7 +3062,7 @@ fn cg_expr(expr: Map) -> String { return "(" + left_c + " " + op_c + " " + right_c + ")" } // Otherwise: BinOp(+) with a Call/Ident side without int-typed - // evidence — fall back to string concat (the historical default). + // evidence - fall back to string concat (the historical default). if left_kind == "Call" { return "el_str_concat(" + left_c + ", " + right_c + ")" } @@ -2243,7 +3094,7 @@ fn cg_expr(expr: Map) -> String { // identifiers tracked in __int_names (typed Int via `let x: Int = ...`). // Without the int-name check, `seen == idx` between two Int locals // miscompiles to str_eq(seen, idx), strcmp'ing what are integer values - // dressed as char* — segfault on the first non-printable byte. + // dressed as char* - segfault on the first non-printable byte. if op == "EqEq" { if left_kind == "Int" { return "(" + left_c + " == " + right_c + ")" @@ -2359,17 +3210,15 @@ fn cg_expr(expr: Map) -> String { let arity: Int = native_list_len(args) let func_kind: String = func["expr"] - let args_c = "" + let args_parts: [String] = native_list_empty() let i = 0 while i < arity { let arg = native_list_get(args, i) let arg_c: String = cg_expr(arg) - if i > 0 { - let args_c = args_c + ", " - } - let args_c = args_c + arg_c + let args_parts = native_list_append(args_parts, arg_c) let i = i + 1 } + let args_c: String = str_join(args_parts, ", ") if func_kind == "Ident" { let fn_name: String = func["name"] @@ -2379,17 +3228,17 @@ fn cg_expr(expr: Map) -> String { // violations to be emitted as #error directives at the // top of the generated C, so cc fails with a clear msg. cap_check_call(fn_name) - // Arity check against the builtin table — refuse, with a clear + // Arity check against the builtin table - refuse, with a clear // El-source message, when a known builtin gets the wrong arg // count (e.g. `http_serve(port)` instead of `http_serve(port, // handler)`). User-defined fns and variadic builtins pass // through (builtin_arity returns -1). arity_check_call(fn_name, arity) - // sleep(Duration) — Phase 1 of the typed-time work. When the + // sleep(Duration) - Phase 1 of the typed-time work. When the // single arg is provably a Duration we lower to el_sleep_duration // so the runtime sees nanos directly. Existing sleep() callers // that pass an Int still emit `sleep()`, which falls through - // to the no-such-symbol path — those call sites must migrate to + // to the no-such-symbol path - those call sites must migrate to // a typed Duration. Acceptable: the spec marks them out for an // audit pass during Phase 1. if str_eq(fn_name, "sleep") { @@ -2400,6 +3249,20 @@ fn cg_expr(expr: Map) -> String { } } } + // el_from_float takes a raw C double - do not wrap the float + // argument in el_from_float() again. Without this, the float + // literal codegen (which wraps every Float in el_from_float()) + // produces el_from_float(el_from_float(0.7)) - double-encoded. + if str_eq(fn_name, "el_from_float") { + if arity == 1 { + let only_arg = native_list_get(args, 0) + let arg_kind: String = only_arg["expr"] + if str_eq(arg_kind, "Float") { + let v: String = only_arg["value"] + return "el_from_float(" + v + ")" + } + } + } return fn_name + "(" + args_c + ")" } @@ -2433,8 +3296,8 @@ fn cg_expr(expr: Map) -> String { // El programs use `t["field"]` for map access and `arr[i]` for // list access. The parser emits the same Index node for both. // Dispatch at codegen time on the index expression kind: string- - // literal index → map field access (`el_get_field`); anything - // else → list element access (`el_list_get`). + // literal index -> map field access (`el_get_field`); anything + // else -> list element access (`el_list_get`). let obj = expr["object"] let idx = expr["index"] let obj_c: String = cg_expr(obj) @@ -2452,18 +3315,15 @@ fn cg_expr(expr: Map) -> String { // Empty literal: el_list_new(0, ) generates malformed C (trailing // comma in a varargs call). Emit el_list_empty() directly. if n == 0 { return "el_list_empty()" } - let items = "" + let items_parts: [String] = native_list_empty() let i = 0 while i < n { let elem = native_list_get(elems, i) let elem_c: String = cg_expr(elem) - if i > 0 { - let items = items + ", " - } - let items = items + elem_c + let items_parts = native_list_append(items_parts, elem_c) let i = i + 1 } - return "el_list_new(" + native_int_to_str(n) + ", " + items + ")" + return "el_list_new(" + native_int_to_str(n) + ", " + str_join(items_parts, ", ") + ")" } if kind == "Map" { @@ -2471,23 +3331,20 @@ fn cg_expr(expr: Map) -> String { let n: Int = native_list_len(pairs) // Empty literal: `el_map_new(0, )` is malformed C (trailing comma in // a varargs call). Emit `el_map_new(0)` directly so empty-map - // shadowing inside for/while/if bodies — `let acc: Map = {}` — + // shadowing inside for/while/if bodies - `let acc: Map = {}` - // doesn't fail downstream cc with parse errors. if n == 0 { return "el_map_new(0)" } - let items = "" + let items_parts: [String] = native_list_empty() 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 = cg_expr(val) - if i > 0 { - let items = items + ", " - } - let items = items + c_str_lit(key) + ", " + val_c + let items_parts = native_list_append(items_parts, c_str_lit(key) + ", " + val_c) let i = i + 1 } - return "el_map_new(" + native_int_to_str(n) + ", " + items + ")" + return "el_map_new(" + native_int_to_str(n) + ", " + str_join(items_parts, ", ") + ")" } if kind == "Try" { @@ -2503,10 +3360,14 @@ fn cg_expr(expr: Map) -> String { return cg_match(expr) } + if kind == "HtmlTemplate" { + return cg_html_template(expr) + } + "EL_NULL" } -// ── Match codegen ───────────────────────────────────────────────────────────── +// -- Match codegen ------------------------------------------------------------- // // Lower a match expression to a GCC/Clang statement-expression. // A unique label suffix is allocated per match via state_set("__match_counter"). @@ -2530,7 +3391,9 @@ fn cg_match(expr: Map) -> String { let subj_var: String = "_match_subj_" + id let result_var: String = "_match_result_" + id let done_label: String = "_match_done_" + id - let out: String = "({ el_val_t " + subj_var + " = " + subj_c + "; el_val_t " + result_var + " = 0; " + // Accumulate arm fragments into a list to avoid O(n-) string growth. + let parts: [String] = native_list_empty() + let parts = native_list_append(parts, "({ el_val_t " + subj_var + " = " + subj_c + "; el_val_t " + result_var + " = 0; ") let n: Int = native_list_len(arms) let i = 0 while i < n { @@ -2540,19 +3403,19 @@ fn cg_match(expr: Map) -> String { let pkind: String = pat["pattern"] let body_c: String = cg_expr(body) if str_eq(pkind, "Wildcard") { - let out = out + "{ " + result_var + " = (" + body_c + "); goto " + done_label + "; } " + let parts = native_list_append(parts, "{ " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") } else { if str_eq(pkind, "Binding") { let bname: String = pat["name"] - let out = out + "{ el_val_t " + bname + " = " + subj_var + "; " + result_var + " = (" + body_c + "); goto " + done_label + "; } " + let parts = native_list_append(parts, "{ el_val_t " + bname + " = " + subj_var + "; " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") } else { if str_eq(pkind, "LitInt") { let v: String = pat["value"] - let out = out + "if (" + subj_var + " == " + v + ") { " + result_var + " = (" + body_c + "); goto " + done_label + "; } " + let parts = native_list_append(parts, "if (" + subj_var + " == " + v + ") { " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") } else { if str_eq(pkind, "LitStr") { let v: String = pat["value"] - let out = out + "if (str_eq(" + subj_var + ", EL_STR(" + c_str_lit(v) + "))) { " + result_var + " = (" + body_c + "); goto " + done_label + "; } " + let parts = native_list_append(parts, "if (str_eq(" + subj_var + ", EL_STR(" + c_str_lit(v) + "))) { " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") } else { if str_eq(pkind, "LitBool") { let v: String = pat["value"] @@ -2560,10 +3423,17 @@ fn cg_match(expr: Map) -> String { if str_eq(v, "true") { let bv = "1" } - let out = out + "if (" + subj_var + " == " + bv + ") { " + result_var + " = (" + body_c + "); goto " + done_label + "; } " + let parts = native_list_append(parts, "if (" + subj_var + " == " + bv + ") { " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") } else { - // unknown pattern → wildcard - let out = out + "{ " + result_var + " = (" + body_c + "); goto " + done_label + "; } " + if str_eq(pkind, "Variant") { + // Enum::Variant pattern — match against the variant name + // string (El enums compile to plain strings). + let variant: String = pat["variant"] + let parts = native_list_append(parts, "if (str_eq(" + subj_var + ", EL_STR(" + c_str_lit(variant) + "))) { " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") + } else { + // unknown pattern -> wildcard + let parts = native_list_append(parts, "{ " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") + } } } } @@ -2571,11 +3441,11 @@ fn cg_match(expr: Map) -> String { } let i = i + 1 } - let out = out + done_label + ":; " + result_var + "; })" - out + let parts = native_list_append(parts, done_label + ":; " + result_var + "; })") + str_join(parts, "") } -// ── If-as-expression codegen ───────────────────────────────────────────────── +// -- If-as-expression codegen ------------------------------------------------- // // Lower `if cond { thenBody } else { elseBody }` used in expression position // (e.g. `let x = if a { b } else { c }`) to a GCC/Clang statement-expression @@ -2603,7 +3473,8 @@ fn next_if_id() -> String { // result var stays at its initial 0. fn cg_if_expr_arm(stmts: [Map], result_var: String) -> String { let n: Int = native_list_len(stmts) - let out = "" + // Collect statement fragments into a list to avoid O(n-) string growth. + let parts: [String] = native_list_empty() let i = 0 while i < n { let s = native_list_get(stmts, i) @@ -2614,31 +3485,31 @@ fn cg_if_expr_arm(stmts: [Map], result_var: String) -> String { let name: String = s["name"] let val = s["value"] let val_c: String = cg_expr(val) - let out = out + "el_val_t " + name + " = " + val_c + "; " + let parts = native_list_append(parts, "el_val_t " + name + " = " + val_c + "; ") } else { if str_eq(sk, "Return") { let val = s["value"] let val_c: String = cg_expr(val) - let out = out + result_var + " = (" + val_c + "); " + let parts = native_list_append(parts, result_var + " = (" + val_c + "); ") } else { if str_eq(sk, "Expr") { let val = s["value"] let val_c: String = cg_expr(val) if is_last { - let out = out + result_var + " = (" + val_c + "); " + let parts = native_list_append(parts, result_var + " = (" + val_c + "); ") } else { - let out = out + "(void)(" + val_c + "); " + let parts = native_list_append(parts, "(void)(" + val_c + "); ") } } else { if str_eq(sk, "Assign") { - // Real reassignment in an expression-position arm — + // Real reassignment in an expression-position arm - // emit the store; the arm's "value" stays whatever // result_var was last set to, which is the El // semantics (assignment is a statement, not a value). let aname: String = s["name"] let aval = s["value"] let aval_c: String = cg_expr(aval) - let out = out + aname + " = " + aval_c + "; " + let parts = native_list_append(parts, aname + " = " + aval_c + "; ") } else { // Non-trivial stmt kinds (While/For) shouldn't appear in // expression-position arm bodies; emit nothing rather @@ -2649,7 +3520,7 @@ fn cg_if_expr_arm(stmts: [Map], result_var: String) -> String { } let i = i + 1 } - out + str_join(parts, "") } fn cg_if_expr(expr: Map) -> String { @@ -2669,7 +3540,7 @@ fn cg_if_expr(expr: Map) -> String { out } -// ── Variable scope tracking ─────────────────────────────────────────────────── +// -- Variable scope tracking --------------------------------------------------- // // El allows `let x = expr` to both declare and reassign x in the same scope. // C doesn't allow redeclaring the same name in the same block. @@ -2688,7 +3559,7 @@ fn list_contains(lst: [String], s: String) -> Bool { false } -// ── Statement codegen ───────────────────────────────────────────────────────── +// -- Statement codegen --------------------------------------------------------- // // cg_stmt emits C lines via println. declared is a list of already-declared // variable names in the current C scope; returns updated declared list. @@ -2737,7 +3608,7 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin if str_eq(ltype, "Zone") { add_zone_name(name) } - // Inference from RHS — duration literals and known-typed calls + // Inference from RHS - duration literals and known-typed calls // propagate even when the let is unannotated. if is_instant_expr(val) { add_instant_name(name) @@ -2792,7 +3663,7 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin } // Bare reassignment: `name = expr`. Always emits a plain C assignment - // (no `el_val_t` prefix) — by construction the parser only produces + // (no `el_val_t` prefix) - by construction the parser only produces // Assign for an existing identifier. If the name happens NOT to be in // `declared` for the current C scope (it was let-bound by an enclosing // block) the emit still resolves at C level because the variable lives @@ -2827,7 +3698,7 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin let cond_c: String = cg_expr(cond) let cond_c = strip_outer_parens(cond_c) emit_line(indent + "while (" + cond_c + ") {") - // Body lives in its own C block — clone so let-bindings inside the + // Body lives in its own C block - clone so let-bindings inside the // loop don't leak into the parent's `declared` list (which would make // a sibling scope's `let x` emit assignment on an undeclared name). cg_stmts(body, indent + " ", native_list_clone(declared)) @@ -2847,7 +3718,24 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin if kind == "TypeDef" { return declared } if kind == "EnumDef" { return declared } if kind == "Import" { return declared } + if kind == "ExternFn" { return declared } if kind == "CgiBlock" { return declared } + if kind == "ServiceBlock" { return declared } + // TestDef: skip in normal (non-test) mode. + // In test mode the body is emitted by cg_test_fn, not here. + if kind == "TestDef" { return declared } + // Assert: no-op in normal mode. In test mode, cg_stmt_assert is used + // directly when emitting the per-test function body. + if kind == "Assert" { return declared } + // TryCatch: browser-only control flow. In the C target, emit a comment + // noting that the try body runs unconditionally; error handling is a no-op. + // Programs that rely on catching JS exceptions should compile with --target=js. + if kind == "TryCatch" { + let try_body = stmt["try_body"] + emit_line(indent + "/* try (C target: exception handling not supported) */") + cg_stmts(try_body, indent, native_list_clone(declared)) + return declared + } declared } @@ -2878,14 +3766,7 @@ fn strip_outer_parens(s: String) -> String { 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 + return str_slice(s, 1, n - 1) } } } @@ -2900,7 +3781,7 @@ fn cg_if_stmt(expr: Map, indent: String, declared: [String]) -> Voi let cond_c: String = cg_expr(cond) let cond_c = strip_outer_parens(cond_c) emit_line(indent + "if (" + cond_c + ") {") - // Each branch gets its own clone of `declared` — variables let-bound + // Each branch gets its own clone of `declared` - variables let-bound // inside the then/else block live only in that C scope, and must not // leak back to the parent (or to the sibling branch) through shared // list mutation. Cheap shallow copy; the entries (variable name strings) @@ -2952,7 +3833,7 @@ fn cg_stmts(stmts: [Map], indent: String, declared: [String]) -> [S decl } -// ── Function declaration codegen ─────────────────────────────────────────────── +// -- Function declaration codegen ----------------------------------------------- fn param_decl(param: Map, idx: Int) -> String { let name: String = param["name"] @@ -2962,18 +3843,15 @@ fn param_decl(param: Map, idx: Int) -> String { fn params_to_c(params: [Map]) -> String { let n: Int = native_list_len(params) if n == 0 { return "void" } - let out = "" + let parts: [String] = native_list_empty() let i = 0 while i < n { let param = native_list_get(params, i) let decl: String = param_decl(param, i) - if i > 0 { - let out = out + ", " - } - let out = out + decl + let parts = native_list_append(parts, decl) let i = i + 1 } - out + str_join(parts, ", ") } // Transform a function body so that an implicit-return final expression @@ -3024,7 +3902,7 @@ fn is_int_name(name: String) -> Bool { // Same shape as is_int_name, for Instant- and Duration-typed bindings. // Used by the BinOp/comparison codegen to dispatch arithmetic through the -// typed runtime wrappers (el_instant_add_dur, el_duration_lt, …) and to +// typed runtime wrappers (el_instant_add_dur, el_duration_lt, -) and to // surface mismatches (Instant + Instant, Duration + Int) as #error // directives at the top of the generated C. fn is_instant_name(name: String) -> Bool { @@ -3086,7 +3964,7 @@ fn is_int_call(call_expr: Map) -> Bool { } // Builtins that return an Instant. Used by is_instant_expr and the BinOp -// dispatch — `now() + 5.seconds` types as Instant only because we can see +// dispatch - `now() + 5.seconds` types as Instant only because we can see // that now() is an Instant-returning Call. fn is_instant_call(call_expr: Map) -> Bool { let func = call_expr["func"] @@ -3122,7 +4000,7 @@ fn is_duration_call(call_expr: Map) -> Bool { return false } -// Phase 1.5 — Calendar / CalendarTime / Rhythm / LocalDate / LocalTime / +// Phase 1.5 - Calendar / CalendarTime / Rhythm / LocalDate / LocalTime / // LocalDateTime / Zone are first-class boxed types. Each has its own name // set in process state, populated from typed `let` bindings and parameter // annotations. The BinOp dispatcher consults these to forbid mismatched @@ -3310,7 +4188,7 @@ fn is_zone_expr(expr: Map) -> Bool { // Recursive type predicates for Instant / Duration. Mirror is_int_expr. // is_instant_expr / is_duration_expr return true only when the expression // is provably of that type at codegen time. Anything ambiguous returns -// false — the BinOp dispatcher then leaves the expression on the +// false - the BinOp dispatcher then leaves the expression on the // untyped-int path, which is the safest fallback because at the runtime // level all three types share the int64 slot. fn is_instant_expr(expr: Map) -> Bool { @@ -3325,8 +4203,8 @@ fn is_instant_expr(expr: Map) -> Bool { if str_eq(k, "BinOp") { let op: String = expr["op"] if str_eq(op, "Plus") { - // Instant + Duration → Instant - // Duration + Instant → Instant + // Instant + Duration -> Instant + // Duration + Instant -> Instant if is_instant_expr(expr["left"]) { if is_duration_expr(expr["right"]) { return true } } @@ -3336,7 +4214,7 @@ fn is_instant_expr(expr: Map) -> Bool { return false } if str_eq(op, "Minus") { - // Instant - Duration → Instant + // Instant - Duration -> Instant if is_instant_expr(expr["left"]) { if is_duration_expr(expr["right"]) { return true } } @@ -3363,15 +4241,15 @@ fn is_duration_expr(expr: Map) -> Bool { if str_eq(k, "BinOp") { let op: String = expr["op"] if str_eq(op, "Plus") { - // Duration + Duration → Duration + // Duration + Duration -> Duration if is_duration_expr(expr["left"]) { if is_duration_expr(expr["right"]) { return true } } return false } if str_eq(op, "Minus") { - // Duration - Duration → Duration - // Instant - Instant → Duration (caught here, not in is_instant_expr) + // Duration - Duration -> Duration + // Instant - Instant -> Duration (caught here, not in is_instant_expr) if is_duration_expr(expr["left"]) { if is_duration_expr(expr["right"]) { return true } } @@ -3381,8 +4259,8 @@ fn is_duration_expr(expr: Map) -> Bool { return false } if str_eq(op, "Star") { - // Duration * Int → Duration - // Int * Duration → Duration + // Duration * Int -> Duration + // Int * Duration -> Duration if is_duration_expr(expr["left"]) { if is_int_expr(expr["right"]) { return true } } @@ -3392,7 +4270,7 @@ fn is_duration_expr(expr: Map) -> Bool { return false } if str_eq(op, "Slash") { - // Duration / Int → Duration + // Duration / Int -> Duration if is_duration_expr(expr["left"]) { if is_int_expr(expr["right"]) { return true } } @@ -3423,13 +4301,13 @@ fn time_record_violation(kind: String, detail: String) -> Bool { // the outer dispatch only checks the immediate kind, not the inner. // // Rules: -// Int literal → Int -// Ident in __int_names → Int -// Call to known-Int builtin → Int -// Neg of Int → Int -// BinOp arithmetic of two Ints → Int (Plus, Minus, Star, Slash, Percent) -// BinOp comparison/logical → Int (yields 0/1; safe to treat as Int) -// anything else → not provably Int +// Int literal -> Int +// Ident in __int_names -> Int +// Call to known-Int builtin -> Int +// Neg of Int -> Int +// BinOp arithmetic of two Ints -> Int (Plus, Minus, Star, Slash, Percent) +// BinOp comparison/logical -> Int (yields 0/1; safe to treat as Int) +// anything else -> not provably Int fn is_int_expr(expr: Map) -> Bool { let k: String = expr["expr"] if str_eq(k, "Int") { return true } @@ -3448,7 +4326,7 @@ fn is_int_expr(expr: Map) -> Bool { } if str_eq(k, "BinOp") { let op: String = expr["op"] - // Comparisons and logicals always yield 0/1 — safe Int. + // Comparisons and logicals always yield 0/1 - safe Int. if str_eq(op, "EqEq") { return true } if str_eq(op, "NotEq") { return true } if str_eq(op, "Lt") { return true } @@ -3457,7 +4335,7 @@ fn is_int_expr(expr: Map) -> Bool { if str_eq(op, "GtEq") { return true } if str_eq(op, "And") { return true } if str_eq(op, "Or") { return true } - // Arithmetic propagates: Int op Int → Int. + // Arithmetic propagates: Int op Int -> Int. if str_eq(op, "Plus") { if is_int_expr(expr["left"]) { if is_int_expr(expr["right"]) { return true } @@ -3487,7 +4365,7 @@ fn is_int_expr(expr: Map) -> Bool { return false } -// ── Capability-kind enforcement ────────────────────────────────────────────── +// -- Capability-kind enforcement ---------------------------------------------- // // A program's top-level block (cgi / service / none) determines which // runtime primitives it may call. The compiler records violations in @@ -3496,11 +4374,11 @@ fn is_int_expr(expr: Map) -> Bool { // downstream cc step fails with a clear message. // // Capability tiers: -// "cgi" — full self-formation. All primitives. -// "service" — bounded. Cannot call self-formation primitives: +// "cgi" - full self-formation. All primitives. +// "service" - bounded. Cannot call self-formation primitives: // llm_call_agentic, llm_register_tool, dharma_emit, // dharma_field. Single-turn LLM calls are allowed. -// "utility" — default. No DHARMA, no LLM. Pure compute + I/O. +// "utility" - default. No DHARMA, no LLM. Pure compute + I/O. // // The compiler-level rule is structural: the binary either CAN or CANNOT // emit the call. There is no runtime check, no opt-in, no override. @@ -3515,7 +4393,7 @@ fn cap_record_violation(kind: String, fn_name: String) -> Bool { return true } -// Self-formation primitives — the cut between CGI and service. A program +// Self-formation primitives - the cut between CGI and service. A program // that emits these calls IS structurally a CGI; we forbid them everywhere // else. fn is_self_formation_call(fn_name: String) -> Bool { @@ -3526,7 +4404,7 @@ fn is_self_formation_call(fn_name: String) -> Bool { return false } -// Any DHARMA primitive — utilities have zero network presence. +// Any DHARMA primitive - utilities have zero network presence. fn is_dharma_call(fn_name: String) -> Bool { if str_eq(fn_name, "dharma_connect") { return true } if str_eq(fn_name, "dharma_send") { return true } @@ -3539,7 +4417,7 @@ fn is_dharma_call(fn_name: String) -> Bool { return false } -// Any LLM primitive — utilities have no LLM access at all. +// Any LLM primitive - utilities have no LLM access at all. fn is_llm_call(fn_name: String) -> Bool { if str_eq(fn_name, "llm_call") { return true } if str_eq(fn_name, "llm_call_system") { return true } @@ -3589,14 +4467,14 @@ fn emit_cap_violations() -> Void { if colon > 0 { let kind: String = str_slice(entry, 0, colon) let fn_name: String = str_slice(entry, colon + 1, str_len(entry)) - emit_line("#error \"capability violation: '" + kind + "' programs may not call '" + fn_name + "' (self-formation primitive — only 'cgi' programs may use it)\"") + emit_line("#error \"capability violation: '" + kind + "' programs may not call '" + fn_name + "' (self-formation primitive - only 'cgi' programs may use it)\"") } let i = i + next_comma + 1 } } // Surface temporal-type violations as #error directives. The cg_expr BinOp -// dispatcher records each violation (Instant + Instant, Duration + Int, …) +// dispatcher records each violation (Instant + Instant, Duration + Int, -) // as a CSV entry "kind:detail" via time_record_violation. Each entry maps // to a single #error so downstream cc fails the build with a clear El- // source-level message before the bogus C even links. @@ -3619,7 +4497,7 @@ fn emit_time_violations() -> Void { } } -// ── Builtin arity table ─────────────────────────────────────────────────────── +// -- Builtin arity table ------------------------------------------------------- // // El programs sometimes call runtime builtins with the wrong number of // arguments (e.g. `http_serve(port)` instead of `http_serve(port, handler)`). @@ -3629,7 +4507,7 @@ fn emit_time_violations() -> Void { // // Strategy: a small static table mirrors el_runtime.h. Variadic builtins // (el_list_new, el_map_new, args) and unknown identifiers (user fns, -// dynamic dispatch) return -1 → no check. A mismatch records a violation +// dynamic dispatch) return -1 -> no check. A mismatch records a violation // in process state, which emit_arity_violations() turns into #error // directives at the top of the generated C. fn builtin_arity(name: String) -> Int { @@ -3771,6 +4649,16 @@ fn builtin_arity(name: String) -> Int { if str_eq(name, "bool_to_str") { return 1 } // Process if str_eq(name, "exit_program") { return 1 } + // Process info + if str_eq(name, "getpid_now") { return 0 } + // stdout redirect (used by elc post-processing) + if str_eq(name, "stdout_to_file") { return 1 } + if str_eq(name, "stdout_restore") { return 0 } + // Subprocess execution + if str_eq(name, "exec_command") { return 1 } + if str_eq(name, "exec_capture") { return 1 } + if str_eq(name, "exec") { return 1 } + if str_eq(name, "exec_bg") { return 1 } // CGI / DHARMA if str_eq(name, "dharma_connect") { return 1 } if str_eq(name, "dharma_send") { return 2 } @@ -3833,7 +4721,7 @@ fn builtin_arity(name: String) -> Int { if str_eq(name, "get") { return 2 } if str_eq(name, "map_get") { return 2 } if str_eq(name, "map_set") { return 3 } - // -1 sentinel: variadic / unknown / user-defined → no check. + // -1 sentinel: variadic / unknown / user-defined -> no check. return -1 } @@ -4031,7 +4919,7 @@ fn build_int_names_for_params(params: [Map]) -> Bool { fn cg_fn(stmt: Map) -> Void { let fn_name: String = stmt["name"] - // Skip El's `fn main()` — C provides its own main() for top-level stmts + // Skip El's `fn main()` - C provides its own main() for top-level stmts // and a duplicate `el_val_t main(void)` would collide with it. if fn_name == "main" { return } let params = stmt["params"] @@ -4063,8 +4951,8 @@ fn cg_fn(stmt: Map) -> Void { } // Lift the final bare expression into an explicit return so implicit // returns ("fn lex(s) { ... tokens }") actually return their value. - // Void-returning functions skip this — wrapping `println(x)` in - // `return …` is a C type error. + // Void-returning functions skip this - wrapping `println(x)` in + // `return -` is a C type error. let body_xformed = body if !str_eq(ret_type, "Void") { let body_xformed = transform_implicit_return(body) @@ -4075,7 +4963,7 @@ fn cg_fn(stmt: Map) -> Void { emit_blank() } -// ── Top-level codegen ───────────────────────────────────────────────────────── +// -- Top-level codegen --------------------------------------------------------- fn is_fndef(stmt: Map) -> Bool { let kind: String = stmt["stmt"] @@ -4089,6 +4977,8 @@ fn is_top_level_decl(stmt: Map) -> Bool { if kind == "EnumDef" { return true } if kind == "Import" { return true } if kind == "CgiBlock" { return true } + if kind == "ExternFn" { return true } + if kind == "TestDef" { return true } false } @@ -4100,7 +4990,7 @@ fn cgi_arg(value: String, has_value: Bool) -> String { return "EL_NULL" } -// ── VBD role enforcement ────────────────────────────────────────────────────── +// -- VBD role enforcement ------------------------------------------------------ // // Scan a function body for direct calls to DHARMA-restricted builtins // (dharma_emit, dharma_field). These may only appear inside @manager fns. @@ -4233,16 +5123,202 @@ fn vbd_has_restricted_call(stmts: [Map]) -> Bool { false } -// ── Entry point ──────────────────────────────────────────────────────────────── +// -- Test mode codegen ---------------------------------------------------------- +// +// reporter = "text" → human-readable output to stderr +// reporter = "json" → newline-delimited JSON to stdout +// +// Each test function signature: static int el_test_N(void) +// Returns 0 = pass, non-zero = fail. +// +// Text assert: if (!expr) { fprintf(stderr, " FAIL \n"); return 1; } +// JSON assert: stores the assert_line for the runner's suite_end emission. +// Emits {"type":"test_fail",...} to stdout then returns 1. + +fn cg_stmt_assert_text(stmt: Map, test_name: String) -> Void { + let expr_node = stmt["expr"] + let msg: String = stmt["msg"] + let expr_c: String = cg_expr(expr_node) + let expr_c = strip_outer_parens(expr_c) + let disp_msg = "assert failed" + if !str_eq(msg, "") { let disp_msg = msg } + emit_line(" if (!(" + expr_c + ")) {") + emit_line(" fprintf(stderr, \" FAIL " + c_escape(test_name) + " \\xe2\\x80\\x94 " + c_escape(disp_msg) + "\\n\");") + emit_line(" return 1;") + emit_line(" }") +} + +fn cg_stmt_assert_json(stmt: Map, test_name: String, file_name: String, test_line: Int) -> Void { + let expr_node = stmt["expr"] + let msg: String = stmt["msg"] + let assert_line: Int = stmt["line"] + let expr_c: String = cg_expr(expr_node) + let expr_c = strip_outer_parens(expr_c) + let disp_msg = "assert failed" + if !str_eq(msg, "") { let disp_msg = msg } + // Embed all compile-time-known strings as C string literals (no %s runtime formatting). + let json_line: String = "{\"type\":\"test_fail\",\"name\":\"" + c_escape(test_name) + "\",\"file\":\"" + c_escape(file_name) + "\",\"line\":" + native_int_to_str(test_line) + ",\"assert_line\":" + native_int_to_str(assert_line) + ",\"message\":\"" + c_escape(disp_msg) + "\"}" + emit_line(" if (!(" + expr_c + ")) {") + emit_line(" puts(" + c_str_lit(json_line) + ");") + emit_line(" return 1;") + emit_line(" }") +} + +// cg_stmts_in_test: emit test body statements, routing Assert to the +// appropriate handler based on reporter mode. +fn cg_stmts_in_test(stmts: [Map], indent: String, declared: [String], test_name: String, reporter: String, file_name: String, test_line: Int) -> [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 sk: String = stmt["stmt"] + if str_eq(sk, "Assert") { + if str_eq(reporter, "json") { + cg_stmt_assert_json(stmt, test_name, file_name, test_line) + } else { + cg_stmt_assert_text(stmt, test_name) + } + } else { + let decl = cg_stmt(stmt, indent, decl) + } + let i = i + 1 + } + decl +} + +// cg_test_fn: emit a single test function. +fn cg_test_fn(test_def: Map, idx: Int, reporter: String, file_name: String) -> String { + let fn_name: String = "el_test_" + native_int_to_str(idx) + let test_name: String = test_def["name"] + let test_line: Int = test_def["line"] + let body = test_def["body"] + emit_line("static int " + fn_name + "(void) {") + cg_stmts_in_test(body, " ", native_list_empty(), test_name, reporter, file_name, test_line) + emit_line(" return 0;") + emit_line("}") + emit_blank() + fn_name +} + +// codegen_test: emit a complete test binary. +// reporter: "text" (stderr human-readable) or "json" (stdout ndjson) +// file_name: basename of the source file (used in JSON output) +fn codegen_test(stmts: [Map], reporter: String, file_name: String) -> Void { + // Collect all TestDef nodes in order. + let n: Int = native_list_len(stmts) + let test_defs: [Map] = native_list_empty() + let i = 0 + while i < n { + let stmt = native_list_get(stmts, i) + let sk: String = stmt["stmt"] + if str_eq(sk, "TestDef") { + let test_defs = native_list_append(test_defs, stmt) + } + let i = i + 1 + } + let n_tests: Int = native_list_len(test_defs) + + // Emit forward declarations for test functions. + let ti = 0 + while ti < n_tests { + let fn_name: String = "el_test_" + native_int_to_str(ti) + emit_line("static int " + fn_name + "(void);") + let ti = ti + 1 + } + emit_blank() + + // Emit all non-test, non-main function definitions. + let i = 0 + while i < n { + let stmt = native_list_get(stmts, i) + if is_fndef(stmt) { + let fn_name: String = stmt["name"] + if !str_eq(fn_name, "main") { + cg_fn(stmt) + } + } + let i = i + 1 + } + + // Emit each test function. + let ti = 0 + while ti < n_tests { + let test_def = native_list_get(test_defs, ti) + cg_test_fn(test_def, ti, reporter, file_name) + let ti = ti + 1 + } + + // Emit the test runner main(). + let test_word = "tests" + if n_tests == 1 { let test_word = "test" } + emit_line("int main(void) {") + emit_line(" int pass = 0; int fail = 0;") + + if str_eq(reporter, "json") { + // JSON reporter: all strings are compile-time constants; use puts. + // Only suite_end needs runtime pass/fail counts (printf). + let suite_start_json: String = "{\"type\":\"suite_start\",\"file\":\"" + c_escape(file_name) + "\",\"total\":" + native_int_to_str(n_tests) + "}" + emit_line(" puts(" + c_str_lit(suite_start_json) + ");") + let ti = 0 + while ti < n_tests { + let test_def = native_list_get(test_defs, ti) + let test_name: String = test_def["name"] + let test_line: Int = test_def["line"] + let fn_name: String = "el_test_" + native_int_to_str(ti) + let start_json: String = "{\"type\":\"test_start\",\"name\":\"" + c_escape(test_name) + "\",\"file\":\"" + c_escape(file_name) + "\",\"line\":" + native_int_to_str(test_line) + "}" + let pass_json: String = "{\"type\":\"test_pass\",\"name\":\"" + c_escape(test_name) + "\",\"file\":\"" + c_escape(file_name) + "\",\"line\":" + native_int_to_str(test_line) + ",\"duration_ms\":0}" + emit_line(" puts(" + c_str_lit(start_json) + ");") + emit_line(" if (" + fn_name + "() == 0) {") + emit_line(" pass++;") + emit_line(" puts(" + c_str_lit(pass_json) + ");") + emit_line(" } else { fail++; }") + let ti = ti + 1 + } + // suite_end needs runtime pass/fail counts + emit_line(" printf(\"{\\\"type\\\":\\\"suite_end\\\",\\\"passed\\\":%d,\\\"failed\\\":%d}\\n\", pass, fail);") + } else { + // Text reporter: human-readable to stderr + emit_line(" fprintf(stderr, \"==> running " + native_int_to_str(n_tests) + " " + test_word + "\\n\\n\");") + let ti = 0 + while ti < n_tests { + let test_def = native_list_get(test_defs, ti) + let test_name: String = test_def["name"] + let fn_name: String = "el_test_" + native_int_to_str(ti) + emit_line(" fprintf(stderr, \" RUN " + c_escape(test_name) + "\\n\");") + emit_line(" if (" + fn_name + "() == 0) { pass++; fprintf(stderr, \" PASS " + c_escape(test_name) + "\\n\"); }") + emit_line(" else { fail++; }") + let ti = ti + 1 + } + emit_line(" fprintf(stderr, \"\\n%d passed, %d failed\\n\", pass, fail);") + } + + emit_line(" return fail > 0 ? 1 : 0;") + emit_line("}") + emit_blank() +} + +// -- Entry point ---------------------------------------------------------------- fn codegen(stmts: [Map], source: String) -> String { + codegen_inner(stmts, source, false, "text", "") +} + +// codegen_with_tests: emit a test binary. +// reporter: "text" or "json" +// file_name: basename of the source file (used in JSON output) +fn codegen_with_tests(stmts: [Map], source: String, reporter: String, file_name: String) -> String { + codegen_inner(stmts, source, true, reporter, file_name) +} + +fn codegen_inner(stmts: [Map], source: String, test_mode: Bool, reporter: String, file_name: String) -> String { // Detect cgi/service blocks: at most one declarative top-level block. // The block determines the program's CAPABILITY KIND: - // "cgi" — full self-formation. Calls all primitives. - // "service" — bounded. Cannot call self-formation primitives + // "cgi" - full self-formation. Calls all primitives. + // "service" - bounded. Cannot call self-formation primitives // (llm_call_agentic, llm_register_tool, dharma_emit, // dharma_field, mindlink-creation). - // "utility" — default; no DHARMA membership, no LLM, no agentic. + // "utility" - default; no DHARMA membership, no LLM, no agentic. // Codegen enforces this with #error directives at every restricted // call site. The capability boundary is structural: a binary either // CAN or CANNOT do a thing, and the compiler decides at emission time. @@ -4277,7 +5353,7 @@ fn codegen(stmts: [Map], source: String) -> String { } if cgi_count >= 1 { if svc_count >= 1 { - emit_line("#error \"El: program declares both cgi and service blocks (mutually exclusive — pick one)\"") + emit_line("#error \"El: program declares both cgi and service blocks (mutually exclusive - pick one)\"") } } // Stash the program kind so cg_expr's Call branch can enforce @@ -4293,13 +5369,54 @@ fn codegen(stmts: [Map], source: String) -> String { // Clear temporal-type-violation accumulator from any prior compile. state_set("__time_violations", "") + // In test mode, delegate to the test-specific path which emits test + // functions and a test runner main() instead of the normal program. + // Test mode still needs the standard preamble (#includes, forward + // decls) so we emit that before branching. + // // Preamble emit_line("#include ") emit_line("#include ") + emit_line("#include ") emit_line("#include \"el_runtime.h\"") + + // Cross-module forward declarations: for each imported module, emit + // #include "module.elh" so Clang sees the function signatures from + // that module without needing the full source inlined. The .elh files + // are generated by `elc --emit-header` and live in the same dist/ + // directory as the generated .c files. We use basename only (strip + // the directory prefix and .el extension) so the include resolves + // correctly regardless of the source tree layout. + let imp_n: Int = native_list_len(stmts) + let imp_i = 0 + while imp_i < imp_n { + let imp_stmt = native_list_get(stmts, imp_i) + let imp_kind: String = imp_stmt["stmt"] + if str_eq(imp_kind, "Import") { + let imp_path: String = imp_stmt["path"] + // Extract basename: find last '/' and strip from there. + let imp_path_len: Int = str_len(imp_path) + let imp_last_slash: Int = -1 + let imp_j: Int = 0 + while imp_j < imp_path_len { + let imp_c: String = str_slice(imp_path, imp_j, imp_j + 1) + if str_eq(imp_c, "/") { let imp_last_slash = imp_j } + let imp_j = imp_j + 1 + } + let imp_base: String = str_slice(imp_path, imp_last_slash + 1, imp_path_len) + // Strip .el extension if present. + let imp_base_len: Int = str_len(imp_base) + let imp_bname: String = imp_base + if str_ends_with(imp_base, ".el") { + let imp_bname = str_slice(imp_base, 0, imp_base_len - 3) + } + emit_line("#include \"" + imp_bname + ".elh\"") + } + let imp_i = imp_i + 1 + } emit_blank() - // Forward declarations (skip `main` — C provides its own) + // Forward declarations (skip `main` - C provides its own) let n: Int = native_list_len(stmts) let i = 0 while i < n { @@ -4313,11 +5430,17 @@ fn codegen(stmts: [Map], source: String) -> String { emit_line("el_val_t " + fn_name + "(" + params_c + ");") } } + if kind == "ExternFn" { + let fn_name: String = stmt["name"] + let params = stmt["params"] + let params_c: String = params_to_c(params) + emit_line("el_val_t " + fn_name + "(" + params_c + ");") + } let i = i + 1 } emit_blank() - // Top-level `let` bindings → file-scope storage. El programs use + // Top-level `let` bindings -> file-scope storage. El programs use // top-level `let GREETING = "..."` as module constants that any // function below should be able to read. Without this pass, a top- // level Let only declares the name inside main()'s scope and any @@ -4351,6 +5474,45 @@ fn codegen(stmts: [Map], source: String) -> String { emit_blank() } + // Test mode: emit test functions and test runner instead of normal program. + if test_mode { + codegen_test(stmts, reporter, file_name) + emit_cap_violations() + emit_arity_violations() + emit_time_violations() + return "" + } + + // Detect whether this compilation unit has an entry point. + // A unit is a library (no C main emitted) when there is no fn main() + // and no top-level executable statements. This supports separate + // compilation: library .c files contain only function definitions. + let has_el_main = false + let has_toplevel_stmts = 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_chk: String = stmt["name"] + if str_eq(fn_name_chk, "main") { let has_el_main = true } + } + if !is_fndef(stmt) { + if !is_top_level_decl(stmt) { + if !str_eq(sk, "Let") { + let has_toplevel_stmts = true + } + } + } + let i = i + 1 + } + let is_library = false + if !has_el_main { + if !has_toplevel_stmts { + let is_library = true + } + } + // Function definitions let i = 0 while i < n { @@ -4361,6 +5523,9 @@ fn codegen(stmts: [Map], source: String) -> String { let i = i + 1 } + // Skip C main() for library units (no fn main, no top-level stmts) + if is_library { return "" } + // main(). Use _argc/_argv so El programs are free to declare their own // local `argv` / `argc` (compiler.el itself does this) without colliding // with the C-side parameters when fn main()'s body is folded in below. @@ -4432,7 +5597,7 @@ fn codegen(stmts: [Map], source: String) -> String { let main_decl = cg_stmt(stmt, " ", main_decl) } } - // Release AST node after final use — each stmt is fully processed + // Release AST node after final use - each stmt is fully processed // by this point (forward decls, fn defs, top-level lets, and now // the main-body pass are all done). Releasing here prevents the // accumulated AST from exhausting memory on large source files. @@ -4455,17 +5620,17 @@ fn codegen(stmts: [Map], source: String) -> String { // Emit any accumulated capability-violation #error directives. cc // will fail on the first one and surface the message; placement at - // the bottom is fine — preprocessor errors halt the build wherever + // the bottom is fine - preprocessor errors halt the build wherever // they appear. emit_cap_violations() // Same for builtin-arity violations: cc halts on the first #error, // so a misuse of a known builtin (wrong arg count) fails the build // with a clear message naming the builtin and its expected arity. emit_arity_violations() - // Temporal-type violations (Instant + Instant, Duration + Int, …). + // Temporal-type violations (Instant + Instant, Duration + Int, -). emit_time_violations() - // Return empty string — output was streamed via println + // Return empty string - output was streamed via println "" } // codegen-js.el — El compiler JavaScript source code generator @@ -4493,26 +5658,26 @@ fn codegen(stmts: [Map], source: String) -> String { fn js_escape(s: String) -> String { let chars: [String] = native_string_chars(s) let total: Int = native_list_len(chars) - let out = "" + let parts: [String] = native_list_empty() let i = 0 while i < total { let ch: String = native_list_get(chars, i) if ch == "\"" { - let out = out + "\\\"" + let parts = native_list_append(parts, "\\\"") } else { if ch == "\\" { - let out = out + "\\\\" + let parts = native_list_append(parts, "\\\\") } else { if ch == "\n" { - let out = out + "\\n" + let parts = native_list_append(parts, "\\n") } else { if ch == "\r" { - let out = out + "\\r" + let parts = native_list_append(parts, "\\r") } else { if ch == "\t" { - let out = out + "\\t" + let parts = native_list_append(parts, "\\t") } else { - let out = out + ch + let parts = native_list_append(parts, ch) } } } @@ -4520,7 +5685,7 @@ fn js_escape(s: String) -> String { } let i = i + 1 } - out + str_join(parts, "") } fn js_str_lit(s: String) -> String { @@ -4556,6 +5721,57 @@ fn js_binop(op: String) -> String { op } +// ── Known El runtime method names ───────────────────────────────────────────── +// +// These are the method shortforms exported by el_runtime.js and used by the +// El C-backend convention of `obj.method(args)` -> `method(obj, args)`. +// Any method name NOT in this set is treated as a native JS method call on the +// receiver object, emitting `obj.method(args)` directly. +// +// This is the mechanism that makes `client.auth.signInWithOtp(payload)` work +// without `native_js_call`: the receiver is Any-typed, the method is unknown +// to El, so codegen emits the JS call directly. + +fn js_is_el_method(name: String) -> Bool { + if str_eq(name, "append") { return true } + if str_eq(name, "len") { return true } + if str_eq(name, "get") { return true } + if str_eq(name, "map_get") { return true } + if str_eq(name, "map_set") { return true } + false +} + +// ── Async function tracking ─────────────────────────────────────────────────── +// +// Functions decorated with @async are recorded here. Any call to a known-async +// builtin (http_get, http_post, http_post_json) or to a user-declared @async +// function gets an `await` prefix in generated JS. +// +// Known-async builtins — these return Promise in el_runtime.js. +fn js_is_async_builtin(name: String) -> Bool { + if str_eq(name, "http_get") { return true } + if str_eq(name, "http_post") { return true } + if str_eq(name, "http_post_json") { return true } + if str_eq(name, "http_get_with_headers") { return true } + if str_eq(name, "http_post_with_headers") { return true } + false +} + +fn js_register_async_fn(name: String) -> Bool { + let csv: String = state_get("__js_async_fns") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__js_async_fns", csv + name + ",") + return true +} + +fn js_is_async_fn(name: String) -> Bool { + let csv: String = state_get("__js_async_fns") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + // ── Int-name tracking (mirrors codegen.el) ──────────────────────────────────── fn js_is_int_name(name: String) -> Bool { @@ -4610,6 +5826,138 @@ fn js_is_int_call(call_expr: Map) -> Bool { return false } +// ── HTML template codegen (JS) ──────────────────────────────────────────────── +// +// HTML template expressions compile to a JS IIFE that builds the HTML string +// using string concatenation. Interpolated values go through html_escape(); +// raw() bypasses escaping. {#each} blocks compile to Array.forEach or a +// for-loop that pushes fragments into a parts array. +// +// Entry point: js_cg_html_template(expr) → JS expression string. + +fn js_next_html_id() -> String { + let csv: String = state_get("__js_html_counter") + let n = 0 + if !str_eq(csv, "") { + let n = str_to_int(csv) + } + let n = n + 1 + state_set("__js_html_counter", native_int_to_str(n)) + native_int_to_str(n) +} + +fn js_cg_html_parts(children: [Map], acc_var: String) -> String { + let n: Int = native_list_len(children) + let i = 0 + let out = "" + while i < n { + let child: Map = native_list_get(children, i) + let html_kind: String = child["html"] + if str_eq(html_kind, "Text") { + let text: String = child["text"] + let out = out + acc_var + " += " + js_str_lit(text) + "; " + } + if str_eq(html_kind, "Doctype") { + let out = out + acc_var + " += \"\"; " + } + if str_eq(html_kind, "Interp") { + let val_node = child["value"] + let val_c: String = js_cg_expr(val_node) + let out = out + acc_var + " += html_escape(" + val_c + "); " + } + if str_eq(html_kind, "Raw") { + let val_node = child["value"] + let val_c: String = js_cg_expr(val_node) + let out = out + acc_var + " += html_raw(" + val_c + "); " + } + if str_eq(html_kind, "Element") { + let elem_c: String = js_cg_html_element_str(child, acc_var) + let out = out + elem_c + } + if str_eq(html_kind, "Each") { + let each_c: String = js_cg_html_each(child, acc_var) + let out = out + each_c + } + let i = i + 1 + } + out +} + +fn js_cg_html_attrs_str(attrs: [Map], acc_var: String) -> String { + let n: Int = native_list_len(attrs) + let i = 0 + let out = "" + while i < n { + let attr: Map = native_list_get(attrs, i) + let attr_name: String = attr["name"] + let kind: String = attr["kind"] + // open-attr snippet: " name=\"" + let open_val: String = " " + attr_name + "=\"" + if str_eq(kind, "static") { + let sv: String = attr["value"] + let out = out + acc_var + " += " + js_str_lit(open_val) + "; " + let out = out + acc_var + " += " + js_str_lit(sv) + "; " + let out = out + acc_var + " += " + js_str_lit("\"") + "; " + } else { + if str_eq(kind, "dynamic") { + let val_node = attr["value"] + let val_c: String = js_cg_expr(val_node) + let out = out + acc_var + " += " + js_str_lit(open_val) + "; " + let out = out + acc_var + " += html_escape(" + val_c + "); " + let out = out + acc_var + " += " + js_str_lit("\"") + "; " + } else { + // Boolean attribute + let out = out + acc_var + " += " + js_str_lit(" " + attr_name) + "; " + } + } + let i = i + 1 + } + out +} + +fn js_cg_html_element_str(elem: Map, acc_var: String) -> String { + let tag: String = elem["tag"] + let attrs: [Map] = elem["attrs"] + let children: [Map] = elem["children"] + let self_closing: Bool = elem["self_closing"] + let out = acc_var + " += " + js_str_lit("<" + tag) + "; " + let out = out + js_cg_html_attrs_str(attrs, acc_var) + if self_closing { + let out = out + acc_var + " += \"/>\"" + "; " + } else { + let out = out + acc_var + " += \">\"; " + let out = out + js_cg_html_parts(children, acc_var) + let out = out + acc_var + " += " + js_str_lit("") + "; " + } + out +} + +fn js_cg_html_each(node: Map, acc_var: String) -> String { + let list_expr = node["list"] + let item_name: String = node["item"] + let body_children: [Map] = node["body"] + let id: String = js_next_html_id() + let list_var: String = "_html_list_" + id + let len_var: String = "_html_len_" + id + let idx_var: String = "_html_i_" + id + let list_c: String = js_cg_expr(list_expr) + let inner_c: String = js_cg_html_parts(body_children, acc_var) + "{ const " + list_var + " = " + list_c + "; const " + len_var + " = el_list_len(" + list_var + "); for (let " + idx_var + " = 0; " + idx_var + " < " + len_var + "; " + idx_var + "++) { const " + item_name + " = el_list_get(" + list_var + ", " + idx_var + "); " + inner_c + "} } " +} + +fn js_cg_html_template(expr: Map) -> String { + let root = expr["root"] + let id: String = js_next_html_id() + let acc: String = "_html_" + id + let doctype_flag: Bool = root["doctype"] + let doctype_prefix: String = "" + if doctype_flag { + let doctype_prefix = acc + " += \"\"; " + } + let body: String = js_cg_html_element_str(root, acc) + "(() => { let " + acc + " = \"\"; " + doctype_prefix + body + "return " + acc + "; })()" +} + // ── Expression codegen ──────────────────────────────────────────────────────── // // js_cg_expr returns a JS expression string (not a statement). @@ -4835,34 +6183,50 @@ fn js_cg_expr(expr: Map) -> String { let arity: Int = native_list_len(args) let func_kind: String = func["expr"] - let args_c = "" + let args_parts: [String] = native_list_empty() 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 args_parts = native_list_append(args_parts, arg_c) let i = i + 1 } + let args_c: String = str_join(args_parts, ", ") if func_kind == "Ident" { let fn_name: String = func["name"] - return fn_name + "(" + args_c + ")" + let call_expr: String = fn_name + "(" + args_c + ")" + if js_is_async_builtin(fn_name) { + return "await " + call_expr + } + if js_is_async_fn(fn_name) { + return "await " + call_expr + } + return call_expr } 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 + ")" + // If the method is a known El runtime shortform, keep the El + // convention: `method(obj, args)`. This preserves backward + // compatibility with list.append(x), map.map_get(k), etc. + if js_is_el_method(field) { + if arity > 0 { + return field + "(" + obj_c + ", " + args_c + ")" + } + return field + "(" + obj_c + ")" } - return field + "(" + obj_c + ")" + // Unknown method — emit as a native JS method call on the + // receiver. This handles Any-typed values (third-party library + // objects, DOM elements, Promises, etc.) without requiring + // native_js_call. Example: `client.auth.signInWithOtp(payload)` + // emits `client["auth"].signInWithOtp(args_c)`. + if arity > 0 { + return obj_c + "." + field + "(" + args_c + ")" + } + return obj_c + "." + field + "()" } let fn_c: String = js_cg_expr(func) @@ -4870,22 +6234,39 @@ fn js_cg_expr(expr: Map) -> String { } 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. + // El's `obj.foo` becomes JS `obj["foo"]` — direct bracket access. + // This works for plain El map objects AND for real JS objects with + // prototype-inherited properties (DOM elements, third-party library + // objects, Promises, etc.). el_get_field used hasOwnProperty which + // silently returned null for inherited props, breaking e.g. client.auth. + // + // Nil-propagation: `obj?.foo` emits `(obj)?.["foo"] ?? null`. let obj = expr["object"] let field: String = expr["field"] + let obj_kind: String = obj["expr"] + if str_eq(obj_kind, "Try") { + let inner = obj["inner"] + let inner_c: String = js_cg_expr(inner) + return "(" + inner_c + ")?.[" + js_str_lit(field) + "] ?? null" + } let obj_c: String = js_cg_expr(obj) - return "el_get_field(" + obj_c + ", " + js_str_lit(field) + ")" + return obj_c + "[" + js_str_lit(field) + "]" } if kind == "Index" { // Map vs list dispatch on the index expression kind, same as C. + // If the object is a Try (nil-propagation), use JS optional indexing. 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"] + let obj_kind: String = obj["expr"] + if str_eq(obj_kind, "Try") { + let inner = obj["inner"] + let inner_c: String = js_cg_expr(inner) + return "(" + inner_c + ")?.[" + idx_c + "] ?? null" + } if str_eq(idx_kind, "Str") { return "el_get_field(" + obj_c + ", " + idx_c + ")" } @@ -4896,41 +6277,41 @@ fn js_cg_expr(expr: Map) -> String { let elems = expr["elems"] let n: Int = native_list_len(elems) if n == 0 { return "[]" } - let items = "" + let items_parts: [String] = native_list_empty() 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 items_parts = native_list_append(items_parts, elem_c) let i = i + 1 } - return "[" + items + "]" + return "[" + str_join(items_parts, ", ") + "]" } if kind == "Map" { let pairs = expr["pairs"] let n: Int = native_list_len(pairs) if n == 0 { return "{}" } - let items = "" + let items_parts: [String] = native_list_empty() 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 items_parts = native_list_append(items_parts, js_str_lit(key) + ": " + val_c) let i = i + 1 } - return "{" + items + "}" + return "{" + str_join(items_parts, ", ") + "}" } if kind == "Try" { + // Postfix `?` — nil-propagation guard. + // When used as `expr?.field` the Field handler above intercepts and + // emits `(expr)?.["field"]`. Here, a bare `expr?` (not followed by + // field/index access) passes through to the inner expression unchanged + // (it acts as an identity but marks the value as "nil-propagating" for + // its caller). This matches the C backend's current behavior. let inner = expr["inner"] return js_cg_expr(inner) } @@ -4948,6 +6329,17 @@ fn js_cg_expr(expr: Map) -> String { return js_cg_match(expr) } + // Lambda (anonymous function literal): fn(params) -> RetType { body } + // Emitted as a JS arrow function expression: (params) => { body }. + // Used for inline callbacks: dom_listen(el, "click", fn(e: Any) -> Void { ... }) + if kind == "Lambda" { + return js_cg_lambda(expr) + } + + if kind == "HtmlTemplate" { + return js_cg_html_template(expr) + } + "null" } @@ -4975,7 +6367,8 @@ fn js_cg_match(expr: Map) -> String { 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 parts: [String] = native_list_empty() + let parts = native_list_append(parts, "((" + subj_var + ") => { ") let n: Int = native_list_len(arms) let i = 0 while i < n { @@ -4985,28 +6378,36 @@ fn js_cg_match(expr: Map) -> String { let pkind: String = pat["pattern"] let body_c: String = js_cg_expr(body) if str_eq(pkind, "Wildcard") { - let out = out + "return (" + body_c + "); " + let parts = native_list_append(parts, "return (" + body_c + "); ") } else { if str_eq(pkind, "Binding") { let bname: String = pat["name"] - let out = out + "{ const " + bname + " = " + subj_var + "; return (" + body_c + "); } " + let parts = native_list_append(parts, "{ 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 + "); " + let parts = native_list_append(parts, "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 + "); " + let parts = native_list_append(parts, "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 + "); " + let parts = native_list_append(parts, "if (" + subj_var + " === " + bv + ") return (" + body_c + "); ") } else { - // unknown pattern → wildcard - let out = out + "return (" + body_c + "); " + if str_eq(pkind, "Variant") { + // Enum::Variant patterns — El enums compile to plain + // strings (the variant name) or ints. Match the subject + // against the variant name string. + let variant: String = pat["variant"] + let parts = native_list_append(parts, "if (str_eq(" + subj_var + ", " + js_str_lit(variant) + ")) return (" + body_c + "); ") + } else { + // unknown pattern → wildcard + let parts = native_list_append(parts, "return (" + body_c + "); ") + } } } } @@ -5014,8 +6415,67 @@ fn js_cg_match(expr: Map) -> String { } let i = i + 1 } - let out = out + "return null; })(" + subj_c + ")" - out + let parts = native_list_append(parts, "return null; })(" + subj_c + ")") + str_join(parts, "") +} + +// ── Lambda codegen ──────────────────────────────────────────────────────────── +// +// Anonymous function literals: fn(params) -> RetType { body } +// +// Strategy: emit the lambda as a hoisted JS function declaration with a +// generated name (__lambda_N), then return the name as the expression value. +// This works because JS function declarations are hoisted within their scope, +// so the generated name is valid at any use site within the same function or +// module. The emitted code looks like: +// +// function __lambda_1(event) { dom_hide(spinner); } +// ... +// dom_listen(btn, "click", __lambda_1); +// +// This approach is clean, debuggable, and avoids any need for a string-buffer +// mode in the codegen. + +fn js_next_lambda_id() -> String { + let csv: String = state_get("__js_lambda_counter") + let n = 0 + if !str_eq(csv, "") { + let n = str_to_int(csv) + } + let n = n + 1 + state_set("__js_lambda_counter", native_int_to_str(n)) + native_int_to_str(n) +} + +fn js_cg_lambda(expr: Map) -> String { + let params = expr["params"] + let body = expr["body"] + let ret_type: String = expr["ret_type"] + let id: String = js_next_lambda_id() + let lambda_name: String = "__lambda_" + id + let params_str: String = js_params_str(params) + // Emit the function definition immediately into the output stream. + // It will appear before the statement containing this expression. + js_emit_line("function " + lambda_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_build_int_names_for_params(params) + js_cg_stmts(body_xformed, " ", decl) + js_emit_line("}") + js_emit_blank() + // Return the function name as the expression value. + lambda_name } // ── Variable scope tracking ─────────────────────────────────────────────────── @@ -5123,6 +6583,31 @@ fn js_cg_stmt(stmt: Map, indent: String, declared: [String]) -> [St if kind == "TypeDef" { return declared } if kind == "EnumDef" { return declared } if kind == "Import" { return declared } + // TestDef: skip in normal mode; handled by js_codegen_test in test mode. + if kind == "TestDef" { return declared } + // Assert: no-op in normal mode; handled by js_cg_stmt_assert in test mode. + if kind == "Assert" { return declared } + + if kind == "TryCatch" { + let try_body = stmt["try_body"] + let catch_name: String = stmt["catch_name"] + let catch_body = stmt["catch_body"] + js_emit_line(indent + "try {") + js_cg_stmts(try_body, indent + " ", native_list_clone(declared)) + js_emit_line(indent + "} catch (" + catch_name + ") {") + js_cg_stmts(catch_body, indent + " ", native_list_clone(declared)) + js_emit_line(indent + "}") + return declared + } + + // ExternFn: the function exists in the JS environment (loaded via