From f6c25c8979eabdc270b7a14bcc0980588a5a7f80 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 2 Jul 2020 16:46:29 -0500 Subject: [PATCH] Code cleanup and optimizations --- include/onyxparser.h | 35 ++++++-------- include/onyxsempass.h | 6 +-- include/onyxwasm.h | 2 +- onyx | Bin 222344 -> 222736 bytes progs/test.onyx | 2 + src/onyx.c | 82 +++++++++++++++++++++------------ src/onyxparser.c | 14 +++--- src/onyxsempass.c | 86 +++++++++++++++-------------------- src/onyxsymres.c | 58 +++++++----------------- src/onyxtypecheck.c | 53 ++++------------------ src/onyxutils.c | 17 ++----- src/onyxwasm.c | 103 +++++++++++------------------------------- 12 files changed, 171 insertions(+), 287 deletions(-) diff --git a/include/onyxparser.h b/include/onyxparser.h index 137a1987..1adf8287 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -16,12 +16,11 @@ typedef struct OnyxAstNodeBlock OnyxAstNodeBlock; typedef struct OnyxAstNodeIf OnyxAstNodeIf; typedef struct OnyxAstNodeWhile OnyxAstNodeWhile; typedef struct OnyxAstNodeParam OnyxAstNodeParam; -typedef struct OnyxAstNodeFuncDef OnyxAstNodeFuncDef; +typedef struct OnyxAstNodeFunction OnyxAstNodeFunction; typedef struct OnyxAstNodeForeign OnyxAstNodeForeign; typedef struct OnyxAstNodeGlobal OnyxAstNodeGlobal; typedef struct OnyxAstNodeCall OnyxAstNodeCall; typedef struct OnyxAstNodeUse OnyxAstNodeUse; -typedef struct OnyxAstNodeFile OnyxAstNodeFile; typedef struct OnyxParser { OnyxTokenizer *tokenizer; // NOTE: not used since all tokens are lexed before parsing starts @@ -41,7 +40,7 @@ typedef enum OnyxAstNodeKind { ONYX_AST_NODE_KIND_PROGRAM, ONYX_AST_NODE_KIND_USE, - ONYX_AST_NODE_KIND_FUNCDEF, + ONYX_AST_NODE_KIND_FUNCTION, ONYX_AST_NODE_KIND_FOREIGN, ONYX_AST_NODE_KIND_BLOCK, ONYX_AST_NODE_KIND_SCOPE, @@ -222,7 +221,7 @@ struct OnyxAstNodeWhile { OnyxAstNodeBlock *body; }; -struct OnyxAstNodeFuncDef { +struct OnyxAstNodeFunction { OnyxAstNodeKind kind; u32 flags; OnyxToken *token; // This will point to the symbol token to identify it @@ -262,7 +261,7 @@ struct OnyxAstNodeCall { u64 data; OnyxAstNode *next; OnyxAstNode *callee; // NOTE: Function definition node - OnyxAstNode *arguments; // NOTE: Expressions that form the actual param list + OnyxAstNode *arguments; // NOTE: Expressions that form the actual param list // They will be chained down using the "next" property // unless this becomes used by something else }; @@ -277,16 +276,6 @@ struct OnyxAstNodeUse { OnyxToken *filename; }; -struct OnyxAstNodeFile { - OnyxAstNodeKind kind; - u32 flags; - OnyxToken *token; // NOTE: unused - OnyxTypeInfo *type; // NOTE: unused - u64 data; - OnyxAstNodeFile *next; // NOTE: next file - OnyxAstNode *contents; // NOTE: the first top-level element -}; - union OnyxAstNode { // Generic node structure for capturing all binary ops and statements @@ -302,7 +291,6 @@ union OnyxAstNode { }; OnyxAstNodeBlock as_block; - OnyxAstNodeFuncDef as_funcdef; OnyxAstNodeParam as_param; OnyxAstNodeLocal as_local; OnyxAstNodeScope as_scope; @@ -310,18 +298,25 @@ union OnyxAstNode { OnyxAstNodeNumLit as_numlit; OnyxAstNodeBinOp as_binop; OnyxAstNodeUnaryOp as_unaryop; - OnyxAstNodeForeign as_foreign; - OnyxAstNodeGlobal as_global; OnyxAstNodeIf as_if; OnyxAstNodeWhile as_while; OnyxAstNodeUse as_use; - OnyxAstNodeFile as_file; + OnyxAstNodeFunction as_function; + OnyxAstNodeGlobal as_global; + OnyxAstNodeForeign as_foreign; }; +typedef struct OnyxProgram { + bh_arr(OnyxAstNodeUse *) uses; + bh_arr(OnyxAstNodeGlobal *) globals; + bh_arr(OnyxAstNodeFunction *) functions; + bh_arr(OnyxAstNodeForeign *) foreigns; +} OnyxProgram; + const char* onyx_ast_node_kind_string(OnyxAstNodeKind kind); void* onyx_ast_node_new(bh_allocator alloc, OnyxAstNodeKind kind); OnyxParser onyx_parser_create(bh_allocator alloc, OnyxTokenizer *tokenizer, OnyxMessages* msgs); void onyx_parser_free(OnyxParser* parser); -OnyxAstNodeFile* onyx_parse(OnyxParser *parser); +OnyxAstNode* onyx_parse(OnyxParser *parser); #endif // #ifndef ONYXPARSER_H diff --git a/include/onyxsempass.h b/include/onyxsempass.h index 2174c3f3..eec02722 100644 --- a/include/onyxsempass.h +++ b/include/onyxsempass.h @@ -28,13 +28,13 @@ typedef struct OnyxSemPassState { } OnyxSemPassState; // NOTE: Resolving all symbols in the tree -void onyx_resolve_symbols(OnyxSemPassState* state, OnyxAstNodeFile* root_node); +void onyx_resolve_symbols(OnyxSemPassState* state, OnyxProgram* program); // NOTE: Inferring and checking types in the tree -void onyx_type_check(OnyxSemPassState* state, OnyxAstNodeFile* root_node); +void onyx_type_check(OnyxSemPassState* state, OnyxProgram* program); // NOTE: Full semantic pass OnyxSemPassState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc, OnyxMessages* msgs); -void onyx_sempass(OnyxSemPassState* state, OnyxAstNodeFile* root_node); +void onyx_sempass(OnyxSemPassState* state, OnyxProgram* program); #endif diff --git a/include/onyxwasm.h b/include/onyxwasm.h index 327b08b7..1e6dcb90 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -308,7 +308,7 @@ typedef struct OnyxWasmModule { } OnyxWasmModule; OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc, OnyxMessages* msgs); -void onyx_wasm_module_compile(OnyxWasmModule* module, OnyxAstNodeFile* program); +void onyx_wasm_module_compile(OnyxWasmModule* module, OnyxProgram* program); void onyx_wasm_module_free(OnyxWasmModule* module); void onyx_wasm_module_write_to_file(OnyxWasmModule* module, bh_file file); diff --git a/onyx b/onyx index c8eaac115b5090e2c5c48a211ceb77d0c451fd4f..28115a9de62cdf4498bb6fd3a3889669ce38740f 100755 GIT binary patch delta 82122 zcmc${2Y405*FV0qH@SCnA<0c|gmef!^xg>sK?q2b8UzFc>4-{MG_)9l#8nps1VyC_ z7$G1a0Sl-|v7!QE4+2V45h3^YIWxO^Hy3=L@Be+@|L>RQ8P1uRGv}N+)6dLZmV6Mr z>`3skOgVR0aqTniY&VnWFWaq!v-&}0?RiWp)4H?$VQ=0oGA*dZ$$KIEjfKR-Z8mZht+LMBwT8&uW#q>C zEQ6sm7U+$OM0pwmXa`XIhuWOf)d&|gO=9epLDWNfO&PGDl zGQV86)(5#EM(!oQ+;HtNpf+COJtlg?RGiBChNm^JoQ_m^PUY=9fK?&U{g}z-@ z@P1BF+tm&xmESDU>OIHUDy?>dhvoE*C9gEt!jhM6lB68a6nvRea6G%sSU?6x%)Bg>qgVrxsqOuzhd(A&RVUed)UU3pPHUT=&T+EZ=P}bEW$>&>ZS>5C00S8N7?LHzqYhP_i9G142>$WYY;6P5nr#S`3V2F;ph;lcLot%OzWQg`K zE)2UZC%-)QPzMiXBf1`T_T&^~?>aX(kSFZQDMWgQOoS|?AJ_J5X)PBn(uy}lYf1N3 zX}yumU6>6rC8u!iHj`svuBT`kE12TR8Fet{z*$F5QKT!Uuw!OUfqd@G03lgBJfM*_ zYg34JWJ_)NorNY#`TLDp!t06J)&Yt(XJ9q$?JX_j3}0>+UvB)M9aj0@@~!g08?5qu z?oF^L`uHfOthXrE3|6#1@6EKRRzGg>d3&9Ws+vW?d=$xciU6(Ckm_ukHgZTrr@uCc zD&{OKn-O8zq=RQ+S?I#7f4ttD{Onz@7nwWPBOuHU;utfc^*I}#zAN>FP1G9;Fd z&Z!fSL4A2fVEJ3`5{q|phjbh|Ogk|;LaTnxsa+ouBezb{!iGkrtVrPEucOhDa|#ZX zM<(%s6b3$*DDKv}4QqS#7cmcB+ zn(8by6$<1U5Cx5<;#|;F)q1Zrc+%i0=RC_R^Gq{%(o6}S=MidtwS1b% zH5Obio$n0NOJY1`6-ou!r}F2Xa?EhzUu9;hm6w|Z)U3(!zeG(ol9ltbFPTzf4XLsA zn#9svK$>eS8=^A7q;d_(I#t#d^8+tOj9X+7go-oa?8 z5ToU<1CUtMHUOmML0Z7{uUMjXX8QE_f6DxM>JDo7cayc_qm#A58DSxxfy7k&a9PR5 z8M#cBWbNk6sS(}w`Zj)a4@HE;ltol z*dc&#T%s-d!Js!YrTps=p^M)QlB9w%ER_q1eNIu}P!OAKl?&YHWSk+5Mwo%-_{_rG z02AdlCP}T@?$~Q8eQ7$0;_68nrLcA=GX1UdQH&p_-mmRR0R(areOPus}p7Wpb7x3#$1 z%F4>;GL~C1QmvfvT*h+9SZ>KEYFpdN?~Z(48`?mjY6*qh07bdXOciFYPcx`cPPETI zu4Y!rWP1Yzg7VxM7iF3avI`{kR`DFu2FIZXg0O*sD`HeoGFB!8KK}0BZQ5q+6s`s3 zbM>1Tc9~fRHW^vhqU&Izvvg=dIwT71h=ZtDRV0|!UEmG0_*bgsE$rydeIKZ8RhxBt z3X_nShc-;+)Q3%NDs>f}YHUqV+H8AM>{zY$WAV-r#J8K~eym2)ccmuVYMiYwlSv*( z-WQhn1?IbijxanKfUf%y|$`w zsaYa#7q(-DETQijS}28Lm741*5T48DnWBQ&-+>MR^X?RycR5Of&%h16DOpLPe>xUm z*G^(3{9Lrbe|UN<*!1p%$eGwQk9RkP_?@!8vT~&YhLDgvaC5$@YnB=nm61 zuTG@7aiukHb+K{^k&~aj67$wd+q^Z?%AbIIyWQ49dZw`3Fvx}Cl)`6g$X0#pe( z;kCH%HJ0$hR!%4vz6QeA*n|gI!hfG|yKuug-~DL`=Nng1an)F)M_VGcfW@KgS1jQ@ ztsD(G`Pr{P_$xNy&sh1>?;t!@)O?IjxM-StXeSR-XzxDm8QccB=bG^pvzwG56T$4q z9Hpq}3%g59Q(b$YQiaW7WElJh?XiW4(eM3n`>-#OXoRIdhpclN>S}8-KOWPGM`Zuo zc+9vuJZc>T6RLrK|O^sGGZvRN!LQQ54u58lU@;uNi@@2>(dnO$pyG z@D_xZ2)rfX>jd7K@D(=vDS>mI`2ufDG_zbPBo+lWp~wW0(TwmB0_W-X2t13@y9t~t z(OTdQDZPQf8xWpmqmQxCR1tV1qVdvXPI4jt+*J|bf`75$-`MbDHvAnM&eyCWVWCYT zy&VZyE%45SYXZ+9e6hfL5?hyE7;Oe=*XyqyjoJJYv1^y7>-wOOu!ao)GT*40td_LiO z1pXM|TLu0&;cEq+Pq;4d1%wyc(p8SDfxPf^k)aaNSQ|dXhWEDNoo#q?8(znTC)w}_ z8}1VLJd*W~N{dxd;2etlE^uDsA8h!SHvA(SzTbwI*zk2We1#2v%7*6){9#_>St7#C zK0)9!NTCq|=S_2uz^71pH-S$gytTk565c@I4-lRvaNhPY0_Xjsiokgv@;W4yYJVRU zxJs*DQQ%0ze-U^d;ok_H(;TzWykny&6*%vtn{4T;ZSA5{YR=Vse7CJUSk z9wl(jbfCb8lR`ag>FsUwjcs^M8=hdJ4;47);~-ou3gp86qLsHOkPAC6a8C5Cz=x6G zPi^UkZ1j5s&iQN=IJe?jTe>cA&a+V9oTsXa$WRh6-Ig)dR$zz??`^|7+vuAMob#z; z!;@?@5d!B*xCE|pP5+^#%xL@H1j8q0f-BmpY!2Bq6i7faTEonl`LKgx6p?@wJa?~J~ve>EAFVZUFKm- z>$U7*`I{a*{l*l{v$BI$r+A9&6e$@~K-pJrvsCN7EK1AOgS19Z-(=IZ23o58^d#h^ zXfw3d)mLM$_f{CUcT?9JWTCc^0OjkR^m@x5*FM(n4LQEuw+DH5yVm5HzgU`9_t{an z9a;8lNBMYHZPjxr^6wM0vggvYxaT^^nRB%v08WvSK^Yz69t797S_(ls;HZY6+FK#0 zzZS12$x#J{nseD_+EG1~UDYn@#d1;?t?0!>)~V#>Hd5=jDpj68nkVS1+RGoc;}-pO6i=!5;&3^-9oM3zw&}$=>{0E>7pu#w?$b8E zSW}z4`ek`p8&1D?Re=)Ie4B{ z@7bo>!!Pfs+i)$nu<#-rkZwO5$yp_jS2_JFE9TDy1c3-aqNxXnKvrsb~7 z(sEu&k$;*E1Gd&)du5(Hw>i&TITV?VwArr?mX9>!Dd&gql)A6=l52{Tt|H~cYlG#7 zni36rR_ncPrM$BVkHBW@=g83_0&A{+TFz_CS*e3KtK}Qo$d5k6o9_IEuE9~Od_5&d zYq#+p*QIfAqh)XAH&sU);yNcqzBm9^IcZwLrbeuZ)@xHoIb5VS|<@mmX7kK`jp2$)Z$<7S?5Ezg2bWyTt_leaLpC4TSq>7Hf^tS zyS)XP@^7bV#jjUqt4p@MexJ-HY7yIeDIMxi{>IP*9T3dgmP10%F4 zT7XveTBx>jdkTEiC%3PWYt`m;&*{zUe(a58_^U6ykxJZ3UatSacktL^`G%MLPlBUslD`OqMUKJR`zDM zkXdJKT!&~;J9f)aJ+51A?JA1HA+BZ7~v3XjP z(kwY;h<1PJv+OnPW@!!iKzHhp+R$Bn*fs6-UDf57?%L5^*@^cJk)&nNw9>s+jjY-jD`x9hQU+COhM)NZ^TqP5zep0%(OkuB^1 z?`BR>Zca{N(~8fLQW)q3=(x*+7TV2tGx1C40ov02)!84~mi={QcPH(e{Yiai2>O`- zyW9FGf9q;vylg&Y6gJHfwB7w^4-#!*RBe%4N9$P@+xsQn!=fA_Er38#5mz(+z&P%! zKS;gcQ9*XKUJXa{~T^;!Ph z&m1!cX_pUF(;B`LS1YHmKeEGf3j1;+(BOA-aD2+ zVP4`&Z_<(^dH@b{^$wN)NS>4Y?2`)8%5n;GV+Dkkw!6Amey?^i^zqYlqhMaV(Jf#* zVij6C{{>X1CjhKF#Fp0q070Gp3~) zU*?vw?gHP`}gm<(d}Q!vUj5ydq`XN-c$0=_iElt>Dtiu zkF!f!$HVos!H0g9PYu-Akwzsm4v%JXmjS@*mN-BBo3X?>!JsybMz_RXm}nFBh*ol+Bxi5_Zo&tfEU6NZY!L*-9t^-n*_ zBDD>tKVgq)bI#O}cXTY-aHbxUzv!Ty{PqlUmXw}Nk>w-zmwf$wsm!WqPydv`qO@H< z^-MX8UCgj|`sWnmzc0vZZ^h zl}EZ)8S0CIO~n?o(j6e;vM&blKl)-&?Mq(_YJcd9xt0X(qgYYk)-77M@=mpKMj}Qd zq`{%=Yka1M2gpoIKpJ)jL|#vOqr4qZD%4S;MUsteD?YCd6 z%iEf2A?I7mpEl8YoUbjHHqmCCUx+K~TjvMM?={wvXGQ8~B0xIlLQ8pUW3A$Rnl}GJ zsCMo`O;%M4yO_dSl{CJ%MP_YEzWcozV@X=YrJ?dc>|?IPX&o-@lYgy;@sX(wz0#N! zY0IvhkzcQ?O}Sd1P106hO<;YsJy(CgdcOKvo#0N`i`$ye^-}EV=uyU>0()kFSb5`)K2?UzhjR(C+*DTF9B+zMM~b zmyEvQVeybfhI$NkO31YWcH+_+t)e9IO<@M@?RaguCcQ>2N z=IJAkLO>DR%md!YPxRc+0+XuWj=E0X(FHEljh{-%oF zIg*``-)p9)MX|o_N9nc>Ch)p-HHy`7_b}ogy7f1s*j+(4nu`2~N?p+`lrg6s6T{}! z&4{NeEu2ET23j-t9lU^#d_1GOo3inM0Yzl}pjKv-)o_taj>% zmb^q6mH4O?5%ecpMVhwy(WSSFW%tQvocfEgtbW?S#-^-AV8{2g=U$+OrX8fXF4KRH zWf#;nhMJf|BJgk7bHD<4aUT>a~o+dRhYeuu6UHt z#pKbcbj{rZ#Y~5Dd*GF>xeMoCm%@=o*QaKMk*0<1jcp^`+(pZ;)8I1ipFn>*IVIt7 z3-$$ApQQ7F<=gb!1Xexi)1OIC!(G1ZHa=RzZ>wc4qepAc)ArsZoG)RB`)MRGomFSC zZ64-(z~!9czoz$B=~S8CCxImd|PVbQxmJHABI(aJV#3}x3dVif1L#H~G zbh?d^Pp8Y3ngS0#{q3Yw)`?SCI^B`pU#BMfg`EceXt&dCj7TSy+U|TZHuXyzU{n7x zDOc3=wfY3wZUiV_B#ZZT%P<0yski3j&s`>kF6_ZCt&NT$x>P~-@^i`D;>dU68G&|>$7>5&Pn zwfw<8UN`x|_xh9s)~->0_HuMsLycv(^-pfxM2mp*)N;=z#4ithd>P;2ijsk6sp6Ov zCJ)iSOkk<jHIztN2ELwI}UsjDJ z$=e3&+pDpzv8`-Od<^b6pob>1rqwR)w~NTLiI5NId5NrryyhqUg+!Jm_dTm0No0%V z#cv54Z2VTAQJs~BKZ@(Ag6swPa~A~8PztjboU5<5O=9!o2GlZVn~#oIGI|!xKdXO{ z#M+N z`|A}cEG;kN9o_=2U9`)F2b0DYUxyqu%~t6Bp|5<=5@KA~AA>i0IW;UlA0FI}wG1~p z=&{4dy->|u{(^4kkEOCywdo#Wf#*=v<E9V8jGBPvMa&x? z@GbZ~Igee)L}w}3cZ%Ne6zn(-FgmADJlDk_FK<{@{_YOS;t#Ubf}?nmy<6%)ybq#_ z)tH2dX!c$Z6t#^fyzM?B4r~WJry#05fugn@C?|U-r)om@pM)0#wh&Y;In}~Tq(b37 zQlYSj>r>b?nz9O`VgR}qT+dNaq5O-)=hmovzo)fZeYF1`Fs10pQ^P^cKsP&85#-VcMw{r3?DCMDlmL_GeFz3!JHh=~6>)yMUes4qeera+e zR#jHl)c1P7MmTN2J%AGtni+93ooJRIJl@djU5&6C^Ay2<3!{;D7s3~yyNcieUJrq4 zFn!eIDPu-V95eEvF{PWDurO9%Z38>C^?H8*Yze3X)-MW*!KM&6TvW83JzHf6Qj zz1H6A-SZ!YV$iik=!-BGVNUzfzRlPqN3VfBy?4`B2=!aoQRAWTB2gYZ5W_y-r# znNSHTM_mk973=c{uJ?V5zZt0h2TJKLlF`X zY9cg7XphhXVIaaNgvkiA5f&q82&)k`A(SG#gK!Mt8-!o7RhR>a7oiHw7lV+7&;X$| zLN|na5Jn(OK$wM)kMI=23WRkCB?$WwK0^2s;Rl4@5&l7N!PF55NeFcinj>^Z=#4N0 zVXTUOrXvt6M9>k|B5Xz2gK!ApQ-p63&LjMV;6OWuA|xQxL}-lA9-#-qK!i~UlM!Yk zEJn}}RwHaeC`EV&;TXa<2=_y@st7c78~gir^eIYMWI-UvhP@~YmkK&B(82!#kb!dir_ z2zw9?A$*GPEy8((zYrYgoS_H_2sIHJBeX}zLFj`p7-1B`M1+|L^AHvzEJJu6;bnwP z2ygaqc)j~{)|EBS{->AM8`=9m3*Uow7(z#cM-ZMxcpc$z>D;cY3afu<3?`AWUT>38 z7?lWw#{%BGPvDzJi#$rNdcVH28+%`M6ro-SHwt~hOuG{_>C8NeoA`eNs+M3X?9cqa z!SMg1GSNc&hEICE;}BLL97WI%^l-%L>$|fz)pu57dPC3=2w!7B!p*P&_!~xi4`A=t z(aR9VB1}h65eg9+Z$pPc=z%a0VHCn-gfy&jk#B$&;alLgP}?5yp7A5dDe)2SE)DF# z_On6Lr;TbbdD0^f*B>Qirgoq7(8!77M<>siJSBPJn1{wpOrA7(^qADT$yv3ejQi>n z9W6HzCoq>Iy#KM++v&L1JLwpP58`Hc;V2Anq$gXTPMJ1&)R^hhM@*kQbK0meBkmtR zag4+g9Ie;GfOQqTtJwvlClYP~P6T}NmkRGPz;@>< zyxRaTT&(bZ1~}!n3hy<*_$w9O*dPeHTH$R07&amJ-Hu{pky!r9GD6QfN~8m z0KB&*7yu?^f&t(Vz{pUTycQS$dTK)fz+VAp0A8t!@_^6RLwUeA0Y3x026zqdW($<} zNK$M^lm}eb5fgVmAU|R&@-W~AEX*qbM`6t?1Ei(vEZ}jh00Ci8v=>Yd*rOjz4|oD_ zBA_%7lQQ6hp%4t%b)?sO5^xeG$eVzRFp(z1Uw0Z4Wf#Ex6EHmhCQMSj-Y0=<~#ugfLk&Beg=33@ETw=Ca=gSNoon$1aKN) zKfvbzX8^tr_zYlj5y}H@1pEx}SHNq4t(KyEv?MJ6Yy$WdU_ZbHPr>4VYF8l3f&2-$ z3$Vj7ulE#S3E)k@j{&R2z=WFD+X1ldGhS~V;10m~fX4vW06L#TlL6)fo(232P>O}6 z0Fwa+FGqR6_W|<&r#_GJu^9gWFMt6OTr0o;@CCrLfQJF4I7#{)Fd1;$N-zNY1~3n> z^(rs`tnwnt1Lgsi0lp1*7BCL;wiGW(vjCF;KLP9j=vssFfL#IS$7B321hNJRX8_9p z|9%PM9dP5z81D&^^b24n;QqDP830y$1)T@*8sHMZKCgPc>jAS~!^#b~1h5=1Zym~4 z!#o0*3HaQ4bXvgL8_;P1gEyk@sX)d8*$kMv+3P(5*z9$$_X1!B7Kf^dl2i;>7w|K{ zo`93FNK6F$2k=S2z^=Pc9DZ3zVdn(09HMPngh-Oyq2O@+{03tq^I;_F>Hz6vLCCNy8Gh_ zZzPj&WDM~vk~;@G9ignMOOaq+X%51cqk6?a7Of}uX8|=6CiwAbi-F=ea=JoaeLstHb%Dq)5%D4tI2w_v`uP4ViFMEm2#nS@ z5Llvr(4VEr*Usp_^@p2&ksdsNr7@4*Z~!uA=zS2AZJAj-7WTM}rb-wWV)I;me>K7L)VJ_y$9p?4evsq=48a=bo&5DQ?cz7T0l(Ki5O)WkaaBsKz;fx12E z$PaMLcfw9&)e8ZV^pt*i5KBt=PR91AlJQ$v#;;4hFumcuEGczg0J=#fGG7}_1ljgL z{l)uPe8!W&_XcA3hLVY^%h z^@f8%R;u7!VJDj=nx1%11ldtNY%oh0LzQ0>gk8IxbdHa7Gx850pMTfF>UMRlnjb;_ zCvLCzF?)GgFyID6eq;SIG-5OLupv;ayb5-Ol??Q?#jPjyRO|FUAY;$#QwdDei>Xi) zwi(MSiO{S{(}t`_KS9)c^veXg>S03xUnd}8++MVzUt8)tv&KL+VkaCE#6Ne z{{y`kY*OBghohwu+2)Q#$>n8}*)-Mwnt%r>QII1@!@SEO;Ky`g8fgHVO7znNM(MW*EY}mq0(_yjB@m_$BhXu)OW+B86@k_IJ_2v+rwN?a zZxM*r6UU(!1TWS*jbo|o1%1poq?YOn2~5^sC9qk4kHBdCCju|&f#U)4^b7*a^=tyU z`WOP^^o8SLm`?fzitW@tAn=HOjzEbX^Z-CFy%vE^dUpUh>{dUpVM+H$=Db8g@Q%0zIe>Mel!o6%i3Ph zOveUl1V}6zc`#Qc9Z9E<{|538*oR?GzQggR9KngGTo;4@Yz+s!rMoAyt^xD0;nGuT zIwDG^OlBz|dih-3JhrG^nmUio3sB8(OpP+WkYs*UYO)bGzaurrh?`%IDlp>ax1ydk z;^x<()*5m1dr;erxcLRB{UY8;GC%rs*dQ=J^Yo<=rz+8(`GF@9lO$TI=3#+Wt-o4!ZD8jQ9Dw0xPF>d;dvVf2| zrA-UjaK>Dv&pgR~VAzR1yp&ZB-;4u7fK(0LU19Y3n5v1T>zA^23}bKhK|ELLqR(5# z>RBRh*hFSIQ7ZH)9PDEQ+sK}UhGhsraUpNjhL9R@l$0Ejt@nF|rKv>d z%5*G7T5trEi*?oZL^@H1EaR#p3={G@RC3h|rwoteRL+9hLDa7LjthiO1Fi%mG(vt1 z;VqOH=DLYkY%r=FHy3^^C4)uxMLpssMIlmyMV~}socanXqSR#3<6wZe7Q`l#MW3dK zMv+=9>U~r%u7D!7SfE3PxftWt+XPo>Bt@KoxuSdtdk1+`J?v53z|Py-TFpG6NK zLB~i=0~Xl_jN-OJDJ6@=-CadR>@F(Qkj3;NLC>SHltwJ}7!oDN5Mtp@Qy?gq@GPZB zA*mtlQjoDU>M}KO$dbm0JQZ{iIQlJGNm=Ik6|JCzQ1@1fBlbbKCuB6SemX1{kyzdq ziWaUm1Bc|04QWw~zF0@NsWS6=)e7jHT z5-vvwRh0rEH6##SK)cP3NP4ISYfEpr9POg zAH&r)7es4obqFWaTAwM%`)F7;Kr)Yt4% z*BMe5f~B%P<_}0vA@y%Een`qWl1g}%vO}SsDx~hTOD(la-DQ`$+b;DjLuwiIg*`D0 zl}rw)PX^x0r9x-~4T;bcbvOhCQ>2BmU!iU*q?XyG97}sqfnB`kqnO zr?C7f@AF7z$QM-R5Z4E7yc7zlil_QnQh_2Zln)geEJB5k>?$0wtMIX*0&mx&T&gGJ z59;d2xFDmEj~gmnB6FWGRCt-{{Rxjih5agxiLjLWkQ%%ncnjrog(e1}!WVWGzO<`w z(r){&>{j^NZiR2`Dx5M@;3hd8<3g)ssgmOcsSut*zV=|kvy@HB-RSZ{h0S&qw%Ap8 z-LAq`y9(RvDr}GW2mLHLgm=0(%;uj;{XQc7UKN6ZDbhkYtI(Vyq<&|Y`n_H15BBE& z(Ju8TyVReJiu1bu!t0tD(iZ%ca;^_-FHuXVk!jzM3KVIfoL6WL6e?V>t8md!;S8z$ zo4w+{+f}$^SK+du!aSO~ukbRNAx@gQuksvHArkYi5|ug(QiCOK`#%+$?}Z9~*;Tl1 zx5D3c6>iv7_{XloO+$s3NbOrZf}vL*{auMp{seMDRf@DwB&N{9;NjCc_7Z$v_wadL zW9cX4<8AEOvv`oI;%LD5bk-8tnL!AOwS`EToEx?KnEfxROIRgc!Yk<#Vd^prn-?Wgl*^QYgQ~**EtEJctW<)q?VkR1+v(Xm1NnJh&G5M^DTpt#-(WusS=Hc>L=Kg58yL2h}lXunJ~k&!p4{A*;I|!f27)?O-P6t`A&xGyLmt zKZs%h?lzc90^OIOkJJ4%$X)J^;G?(?p#KKBF9UbGkE0`1aVG<>>ZW_3VE0k!D0xCP$951@3cGQe{hY{dW=7)>IikS)}q1{nk3Vk1QE4LgPmCB7fc=z~QLOY+25 zr}z*fUfmNP4lR_SMm*6IUl;t8VMe@~Cte*(3Jf!(Qq0{EwUFKY@Na^uZ9?`MC2TP;w7J zYclunFxX#~97Lr|br7qdry;>8F+GHKE$%72M1NS1xj*6-ejfii+~?3d0q%QY$v}5L z?-AcXsLTBY3MuX(P%_B91ajPxgP1Dw9Yc}hRH#;oit=J0HUO$reLOZGVRYuGJ`q@K z7-9DVOX^72Xkaz^0YgFB06F>c1STA(Z9-BDC7uN?!9WnxM*@qpO&`@*@I@335YtB@ zi{u+aF@02LF)H60iuogn1=GPJR?HvCESm2PJ$!GNB4U{yzD-LNu`Fmq(-!_kHJyCb za`IKA+7Z|z$Qeb)n($*_x)2`Qh3xooSn2q0Ew-fiq=XCrRK|bWKcvd z&Pi_xQntV`o==i;@woK<)P)u~B4}QbiwC9uKs{u!!^qD=^*SLZ<1R{89nLO>m?TTg zI!lb|NE2elNvT!PZ`pW9)lT~UmsnKaPUuT%S43J}vW}zp(!4a9`9Rc(ranjUd^L@x zH6#q7dCgH=J};fC|A50oIyj2gs5QpVknpMv)4yKhWtKdWYVIgrj_#Z~pX@fo;d&OD z_3R_mTWx8nTM7(u)F1`q;tpxF?4U?n>Nk$!y=r=6l0Vd}{2(dw9ev%)EOGotRGL!{ za5N`sxp<;f>n;p(_O~2GO31y0s5*2^#UERF7`ejyf6J}OE{@{$YVB4A-4H=0Wq>N( zjn2ew$tg?1^m=Pq%-9~3xSHzYaa8Bri*u!#ZF`F{Cq?T^=~t*tVjR_|YdeZ}sp+&h zvTBYb>fDavZEEe+Mv*awG@2YmB{LkU&Gb!cSzM2KxP4{K9hpl}cNhhfwZ>wEv+qR3 zoOg?|Hw_kSWkWQhsMvRMN73Me>TE$b>Zm8Y!jeXFhQGne3}Rm2&*d1ZuUwp$&Lw|o zlU%C>HRzji;xmAKdI;`imXJnpn2MUbDR(x7yhV*sD#ue18W6O5W4mR(eS?siyA3w= zFp2TMbUG5S{iYhIaIN}Orbv#bE$FY^1=(1m+1Se0EU`s$8&m9;)R@anF}dk$F~zax z&3ImVU-TgMf*Bt~jeie%napA3Tk{|-6!;rt*f%{5*I(>7OBGYVAfe9ZW;`$bBK4W? z%s85>X1Y<&mjx$Duu#u4K8pr;+YW+gYS~I=~ zq_+`_=*Nci$5!@FFg0$?_yD1PlKw08?=~!na%ojar@aR2AXMg!MB5G4(N~9e8qt*8 z$)wn(riYRNyD;uxaumO!rr$-?&NiE%L%m6Q_l+ziX#^$XZgdD_VFN&V6YAvtwEEe4 z!A6#-K1*uy^{obLK$|~W-x`FI3D)tNU1=t2^g5Or`eQ4di8wUz<#}CwF($9iOXg#6 zJs-)mp4V>QT#&aCK)MMz$$U_~ZmnyzA8B4&WEUG$S?Ko3u_V0Ipz4skj5^fr45!|E z6B^?=qBu@AI&7?dYt-a6WW*1Qj=o+^-c0$Qq*jHZv=}D;L011NNes>eSB>V z45@a!p=O?;$6k`Mh79jb59eI4(Ww1sE9}eZZ8~xdlehBryliq0&(upRPcJk>gvmpD$M(MTVs$VAEgTB$5H|COy;ZK z6UN+~+i=F@2@)%;qJxvHzp$A_Mr+iW)zU(;y!yF}4zyus>LzL~gzq4WRdW@0uZ`)($>!=SjC zxbTMWW`dIFW+I}*cQfHcnsqawQ5oZAg4@fynV<~1nHT|R-b_p&+_;(84%~M$L7$e4 z{Q}+Ix|ukEVQt+^48&CByP5a}1JAmd7)o^J%|tfFfps%6jmXTKiAxY*-As@)>t^B} z%+=P-#OD+-ZzhftH}huV2ze%~n~CF?gRGm0UWiyX6ZFAM>t=$a3dh0HsGHb@-1%l= zCR)L|nOFoPST_@Ki1=f-Q6 zeNvZ%`-IZX1ea>wOi%OJc-NINm6Vw-k)R*m2{ca{~QeU-8^}Cr6QjMF5w;|MaGeLd_>t=#_s*t+VF4ga5 z!X|aMU8>*B#D@@M-As^F+sy=dIINoq>b62^nO&;i&4iF@+)Ri@<`(w5nGkg~ZYC&V z-As@^Xk+tcVg#gGHxo2igbE+oRq(r+5Gvg1W`YD+Hxohy<7PsrVBAbl1S*&}6W@^v z=FJ363_^u3>?-)(OxSGymEHD!Hxo7$P8mJjxS2RkR`A_SjDl3_X5xsY!e+Y)em4^~ z6}H+{@Vl9Kmp8w0GhsBpaWipJC8_4k1kE|3;@{b&`rS;}n*T?;RKJ@EQE}sDg6eAB zOprdXy?HY+7*eg937P|i3K#4u_}xs{D*n4&1;3jKp@MNUL1nC)38VSVn~76g1#H-| zls^@k?}Z9~*;VknnXsvF!>)qg&4f_FxS61c?`DF$dA6GgS{SUG2|lm?%gqFrY~4)o z@%Jw`6I{4;Gr^@>Hxm>?BbYZ6r$`y=W`Z(>F1VSn>2ll6giROROxSd}?PfygV%|*f z#=t`Us)`lcsXUK=gUA7IxP)tjkkJ1dmjtTqmH@7!|L~IFUT9bOl3*Zq|Nos!0@Zd) zfDI@v2^4U$E(yvJ5q)uBG>Q0Mza&s?w*>!oNiYh6E4%n<3*qPD$3EWj@YBzEDtq{8 z^}nNsAN!yGj*CA7{G19|CxKl2G^tgyJp9!x4}Uf8;ctrlbT#hbr|(Ok9Bm|=3QhA) zRiX9WsnB|x$X)z>a5Ax6{It2OQh9^?Q!!HtpA|mcVos&aqBS#I2 zj-l;9X2=TS7RTq1tdR3mC?ScswSYKUpqz>W|2jxeP&EhnBdXK&huaxNtdpjp1ncYk zb_fiHzi9%%b8rNd$<>-sZU*5vn!Bi^2i~)g<5Ui#Dk<^ADL(j~{(=R) z$frNH@<&WiqG)_=x-cQ=$hblgMj|iK>ADN9?tY6T0`kh<*t;0HhIcPp3Bx%-R zoz5TDVVzC_)?uA?Mb=@RzhpFD5z>y4&gxjd@r;nRu-0Ln{-+D;uuf9N0=_gV1Ox2O zhxNyJdyt0>&j^&P?V6v>oS^RUhzFPhH?sp3LvzFn%{VcjNm zkzMNIa5@efQkQT+hKHa)NHx#uP(h_lq;Xh(0#dERy6+|9a=QwChjp6@D-0FxbXXS^ zCkG>55xxlJth2hB!XGc1&j@{w7hkqZ^*gNFq`qpG>UUTdQjNnpKfze92>IJZdPS(x zGeY0v#hrGkeus6N)ZKQeeuwo_sGfCLH>4WR2>IJZ^A#cW+K_f?3T#qlm+E&|7gCMG zy69SWI;@Mj8i#d?Sci4e2W?D;b-W^+0IAkl9b-i``q@Wz75onCLWMgW)=7|cSQjc7 zhjpQXaagAaRG{-YUJ+g-70k1`N)vR;GZ@H?#AZ2y(r_I`(Tn+m6lu5KLGzZX_8 zUJ*`)P;pjQ@r=;-l5w+L1;4|(O@*y?75onC?>!RYuVV&w~9o9)7*q$HOBh&7ORO_rxbD%10f5EPT-(lTW@!#z# z_#M`T3dUib%2?-&j)`bejVVxqr z!#cfP47FYn(z+nd2rBjXy4-eHx9Nhzx=okc4(mb}^RUhv0}DB&Iu-J<BO%3j_f4*|HhHM z(urODPmk;qpnT;c`*_m#fA+2~g4X|jj(Bjgj_fxO5j}EXG>Q0MKeAUkvD5g!!@Itj z5M24lP8*5;;>hkqcI6{G?E&t1WXDd&_b5;Ok6-0A2S2Am*5OBXn%e&T$WD*)#F5>2 zlt>OBb*MYN&K9Ct79II<4&DOFM>@9e|m+p=uQ|N+7MgM6J5(L*dfy%Gi)Av&?ehtny*xhI8PyD6n@MqtXYM>X=YY{`w_mmi@F#pkfid5V&CM^A_V6|S_6Yg1A|G; z84pg8*x7hN58Gw-AZbUc(k1ta(SpkS#V1=ypSKa}9x+TdE{Q+bI?`EifV$69UEdF0 z#tUQq>uBj4hFyUu{k~P%9h^FwvV^CH4tVKXNr|n&FOCvruUIVlSuD2JGVSFh7F*j> zmS90!@AOBB#YQ!FtihwX#Y4AvY~)=TO;n4&)!Nw6s>BiE`EqcuQFyRb_y?=-%MDGN ze@UWV&NggbgFmTS%lD_UipNapLn(hjaDvh7zS<8+TPSekA?l&>}Vo|X=>1qAlO`?8GmI($MN*%NWw$G ziwz02ED3L05+1VJi@#EPs4Ha&WAi<*lUNMrou*ZuD1SFP5cZ!)Us(gj6xAGV^;7;@ zb-3A2)1EU*4Ht!_8pny_s92h&_z=pRLX%LQpL=h}p^~EeU;F7`CWQZ%|iq zzo=tP6RwPu_M=g>8j$R}gC8?W*RkZ%bSY|f zx6uaUlK2D1yStF0cx*c``jg7ooMdnsPcr7CK7j1j%h#NC$W(gQq&Nh&wxZ-q+8*%Nnc24y4h4%$e!z z=8429hWp>}+vkPI@PD=wj-})-{)9>iC(oR-N7(xy^GFWj;Oy!61Tm*VY$`h#Uq#9t z9gG+b|3Cfi*l;k`faD14XUEsf3c|riI!P+82Rw{a56i2!R&EF~02O(lj2P6F`Db{o_CK8$X8fXRhtFfksk)*|% zKUA(D4(1P)=VSGVHJ<~`#snE_J_njbDwrO|*(AvPo$}wvu^f!_`)kX=NK(adV`7-{Ekc^I!l9qTm^MQ{Q(UIWp8hhn`3qKXTt`H*S}U7(7e z7>S=pFZ9@?E{d>8T^v5vCv{1HfvBSjsXOgb{Tz&_D(WwOjlSD1)z8CN3PF~K(U59*7?+S#)5A!; zR!A+gOZ9Uw3IiJsMpZQOoji=9u7-z^B9@1d^g$yp#SR=EMmL6spM%lX{69uar}}$Bc=P*t7)8Ym4tKjEgG;9wxiu${~;(i`Rp@QLIq(YX5(P)0d!?>8MfPFZ<2BP_1sPLCv z1wRL)sRHI-<%V4aKM$i&!SFCr#OGnW2|+#&BdrU8({ zgh(Wc974#wmFs=rVM9!5SF2wiUTFbZ8v4u@)*_LuAZl|6|`GxfV;n z+j1>x;41p!z-W?iyK52izww*lIKSTv$NBwcIL_}k!*PDU8IJq6*FfYbi6l)nBE(Ax z#!rSp@YX^`I!x{-B8VB2EP>g$h7h1gAnvc6I)ss2zMgmUq%Nd~Wkj+J-W` zleW=wn|D%-9@9HXF~d8l;y1$-HQkfsom@!r%?Cvk@p&hU5%YN`R}rE0plAbPm z9E1b9>75k2|2sV>ssK;&PGbIndy+O3)`KFlqvf3>ZseUD&i!|nNT~6k=qB)_PjF(y z*QlKD&Vq{g`&s}TqpzcYcttdvWm1HG62sk-!&#dO9?wnrY!>am@i$5U>2qYHa$jX0 z3nXKcOCzoM!y?bHmafbW=SuFU|nS!K^B|?GEPt+od zwG<-8CAY;I0P?%3vyjo!Ta$`uEI8OG|Grf|$10!3)W#+Q?x{*+-7E$(h=Gd*@0>15 z4z$d;#A4uLS!Q|OYA$vcb$L=CBZ|te4X!dp6yJmcF8#5UCsDix_gt@Sq8i0(a4*~1 z97B3d@)ebXF37R1nISjw6_lnle)f%&T*N1%h@^}S-uED9F7<+of&S3e*pCP)W9thc zIW=@n+?BHMa4ZwvH&tTe;zh%c%e+n|pA#dRc~Is`qMpk)ov2XeLW-*VGi-8kKXf)) zIx|L7>fqoEL;i9h9`ZL>@&_CJU|bFETOFK3S!5!oGGE2cIiol6=ovh8qA2`<#p8m- zqi0>yP~5rNvlC?r9(3x+s7)+d1dpE}%3ift&>>owp@rF0HHLEHE@bO*#G}?eO7H}m zexGp5h@zyYi7A{rRy}4b;s4*lrZ7Ny35*OE(g6Hklpdg2U*I!ZeMsp`7g=BOAYJ>7 zJ%P{BslT&4+YhjUs)YQEVxc>+ph%(o({Q2u({Q2u({Q2u({Q0Q{{)8ePs4@sPs4@s zPs4@sPs4@sPs4?d1BWW1ufwiYL;0uSLiwlRLiwlRLiwlRLX9_IoybQMl;Ri*$&tcG z6O`s@3Y8=1X;Dym6zL>Ik*g^vBWwsFN(B8pI;ch*Q6)!Y>uWBtwANHMDARET1mW~> zD>kUMM@rK1@1CuzmswN;{ywl}9ipTuBYqof&+0l~dsHx4XYm@3Rzl%-F0+hG zvtblc34d&5InTxPiH|xHFGul`d9kf@&lT2Qz8CgR%ALfw@$`zC_7MgjuJIaOc<~76& z7q$p0gp)hUh41Dq#x5e9+)*xkH!m119!~Bk7e1S}3cinU7;otDlE6FK;9_SUwkmo^@3f66^06QT6WpLo99|(s6g&0*Nb)N z^CX5l$`zclfuwSGllM{5^;Nr6yF1FY&X7u;0oVGNNkS^Q zqg){=)gef@qg*=_>Zn5MPPw`un zca+OhJql8VJIeK;LSsd!@R3~wyF1GDv7rJN%DqwejS2s5p6eJFWc0J+h6?14a-A?# zAa|7O6CQyIk8qg+2573X#R zh1XTMqg>@&A5@&&QLe}|4}fq-xy~yz2MQG~*j2E*qg=n)D(?E7tDqXTx4WZUmkkxj z9p$>h3ki3W>nhJ770C8csZVnifM>b>RA{~zD*RU;%PRxnh!@ zCSCZ0Hy1veM|naQ{5Z{~i|LLMy5O^UrY^Mpz#S!&;lt8&M+sf<-8`WSxuab8ZXOk+ zE2<%YHb<1JMhJ=fj~r2UKa~1E`*Xj5yBDW8f4u5(6{Sch94@bUliHj_wl+Yazwd&AFqodN0iI= z@wzB-M7eyA+@i=4ij~`%Q>2vaxHnxQeZ`>HHB6>Z(JZJ0mrWZ-{dVG1#?Da4jyhzmPRZk@E^`;w1 z^m=@GPV{kCA2!fsdn{>AFQ_Nu1_}A2eQ%Q09m|L~b|5Mw0z*kXi|D#jRoSZY^Bs7oZ1oC|0wXAVMk%Wus_(GJ{2uoy1pL()1HklN{Kq-Z}9Rw1G5yt#&1(ly5MGrJ5q zAMv;Xo+F3^JiA4O=LMe8#d|P?=p;>4p@}Z`jFPl{A z7Sg;)4rNBsc%*En6yBE^UPx0np0A9e3y=WALC+{=n~{lywA7+gd5Y*e)?ZQ<-l&;g zNG%mx2u9IfB+%ho#k~J9zjGSONv3#4kwTS{312bqI;<`ros-9#QABnS11W_K>~89k z!@8Mb6fHpljwFP9c2C=qw}-79Zlh>!uMG`xweIQA`SDJGRzMx#=kM2g$z22R6i4b zgG}`7zjdYHxc?aWUEmixR*(3pIETk7&+Uas%W`V)IAXu-PjjrxVhfQH%F7v#6#G^G z8^>CYeS)jQ79Cq(m1cF%xU>k*{hiDhwMX@~e?pp7S@m{r#1)!0pExtM2ej!tVyX`z zKbsz#oo#0JCYAhpr{Bb3PrL%2c^^BicSDamEF{ZLpc6{H{a-C` zQ0M>u9{fKYk~`534IlhpMUP?w{V&t4#KHd*MaS#JJ6MT>|35~igh9=6%0rC`2mf>J z1O_#fK#CcP-{5#1`UF&9PeZRc@)Gtm)A3l6Pdh0Efj!NAm?a7Vdz$_jhYJ!1|34Q+ zC@`owgy;f;nsN+11%W{gxtSIO1~uf9T|he+bnrh(D+ugq>QVfHz@FwI3eW}y9sGYU zaSQBew$Q=H1%W}$y_l8@0)v`b1QG@{wm87S|25!{FsPw`-oe1Z|9tWa?_l8I|MrttRwPTkIGQB&l4PkX zbCRT9n!U1J>Z(_sOAQQaD1e2vHmD&()`UR~RS_@hB5RW&T%Qc#hGYmgY6vtG z;oyJjx4PgrX$ZmbI%|PW?_l8Ie>%u6VNgSDL8NX-mU?Tl)Q!nf|CTKEwq&WdYpL3v z<^>2%I$mci1SJe=sHKY3hmxhXB};ucS?VLnQnzWT`r!Y!AShu^LsC&xZBOGpPErGd z8fvy8bw{$)oyk)FuBB>&8mVN~@KecUeOi~5o?vnCztl0!@;LaP@Su)q1A`9!9}1}n zgBt2A0^!AE2rnf=cv(YWsjslq#KHe0NLTVM4ME$}2n20UqnlZ9yw2YVLg2DT1A{<# zD;dJ>WC(93>wZtN?*Eyrg?Ex6ysNdqD*0FLyQGEo<8?+tYQmsqO9H~?WC&Z5A>5q| z;htm&TazK&o4bpvU)$5@>eu!(kC1y>!k~u694Yv|WT_t{OZ_mp`aepR`tM|^|Ir2K zvVP2EP1w^A9@;%X%cFz;2SIAWpoYdkf$&8#gfBG&eei$M;P!Pgg#F17zR?i0Jq_ha z*wg6h502M)j3Lkt1`KLwycY;RB||untc9PGb^l8;gkO^({H7sjdm3(miG%<9K#poZ z_@5?*Y}&zyUVp%7+m;l_Ql2y2KT>g?g`ky;2|!XHZbVmf09?6 zO&b_=@IOn>4i5g;8VHWpd5pklmpwB=iGl??7)e;LgOP*7&H2#U<46U8Jcx*Xy0^PFZ%xb!0%b9h!Lq=M3gd;R1gd?;R z2uEmY7Q>knu+)-nf-R4vZh|cjR-$xSY9g4KkbV+a&QPc# zo3=b6*z%xIouLvZ@oXgdf#D1VjO^ef9{QYjBs(~X=TU@Ic5o68nM}|V*`4^s@gOwt z;P@Q`aF2lywk~{6b5J<)3g6Srz$XCFNjy|+y8usJ(P#&Hs!Q94h$0V9TG8~}FX?^- zC3cYe`FM1T#^ioy8SXRqK6U~PQc+K-24Q2EyL7-y> zQ8`8q#m&QQd^k#L*u*5-$u31qbO`Rnv@4pQaXm~6-2HgYMdL%f>5l1!$6)uJ3i>9; zF^IQa`uKFZ=MF|f$i220>|GmJkz7ij?3fL?G56{o0Oy_#(oFYSWL9nw=(AkA5^HsL zB3Ku?*@!Q8FUC_|iTez4mAcK~(9QiP@|L;dp_dAG4(==61<*^Cdp_u^-7w;Nx}J-u zUTzbLU*n#EzqRhyU|r|_iNC$wU%;r3+YK~*-D%~9QSUCm-v)ORg!OZGfWFaP4A%YK zqfvkX?nH3g%ss-x&v4g9`9`=k z_&d_w4UvbrgMo3Bdj;-CyVHSmjJphf$GUYW{Wy04;tzL!!P4#sw-w-ybU#4MQSMjx zd$d~$5aZoH0AhmsGlU)EwgT=%_fp83|G-Hg9W z+){uz&8>%+rS2n$S?0cp5-)exfa&S(P566;+aIvbbdSd0v)mt1jI-VO(9=2YaQr>j z9S*_gxtBu|=ewgJzS%thKA!7<^9AmEbbq1yIesp3>w##6+aK93cK-zFCGG)~b)~xn z@t3;W@OPE_Axd_cyAFRZcYA^IFYb8|d4+o!C|A3i0Q9eJHAG(N_Cm}Ww*h);ac6?t zRc;@ExY|{?zs5}m^lRP!AoV)Wje@oB?nH*QZYLyM?_LCSH@K?+>qd7Un6|n{g6U1J zi&Ea~Mj-wcw;l~@oqHBi*SnRt-{3BTZfTI*xl_$A?zOaFJQ6Ny$OHsbpP0su!pwJB5V4S-S6&s8JR*~KCHMLw}L*xEe$Wj-{D7s&f zsZ&OOlqvcR?~@rBol)56w;V7t3V}ZQ9S5w8u@v~81F&qdiAD4Wdjzrj3UE~PC-n@m zTY|cb9?&D|t;FuSfV14k zfyy>Ai8dNB?Lttgw^6)E6dzmi5aP)-nr?O^21eG&bI-!GVse>6M&{eyNEI>DoLk>f-CBkW(cTigIeQtA_L0!K?3ll|$m;0* z1T5hQ&8*?bOQ^tbg!CVdkTSy&Y6+R7r)a%t??s@9UY)qnjh`Yq;UGoqq)@jzg~ zRr&|TL=jUG#JJ#Wx`-(aVmeVwI%2vZ#-nWAz6VaTgQ6uw)GpJ6Ie$YZ+JKbY;h=H( zuMM|U#FT}Lk)g#brDVL9871O5$D2V8hjTba+T)aC7;3^CZIx1T)ZQ^#a%6gnINfB& zen)&dtqikJEgiN%Vh6f|4n9Rub1IP11K|KgF7C@7AfC6_S(Fg97xKF@L>Ex>x*+;A z9o;>jI>67NaNXNri>og|pz@ooo57&`M5r0*4HTdk8|6+tM;vw~0MPr4vH=)H&0j*9 zgoxgW;1mO(?r|u(u(>zXfzUtn7O}=eM9guSttTQ?c<&9>3h%XE`46Z@ zR}+_gA?{;#%Vw|a9E_9ZzZ25R3P}1V0l_A(VnNev!~8VF8~p^h^7!2%bf)|mWhY?R zFuw{p)Zpdhz8=qza$Xd${y(JtjiLnFp9w8zdoffh*#fjLhWaMJ&Lb=@r(k<4z_wXq z+nt2%-~UL#Hk*LF>4h8`4h3A*kW$3055+Ry6yjA0TvO5K%Q?&XP;bhCmsO&~^`Q|2 z3-uuy+8`*bmg%CPTLlD}fA%<^n!veI_@7=Q8K{5$f<11{)_;)@F8sNnGAevR$ho10 zKnT~>o3ssDfUo5XHxc;6_jHR49UmC4S#$R8D5q8ODV=Q`sj}q{X2a^#GzN%cl0RIMkUU zsAdMChRoAKF?uJ(9~ya$TITXl%##>;^VXvqaTz9xx%(C2{YgSE9~K9C85Zg-dikVT zn!vEoNNJgSn?*0f12sTV+>H*Crpg84el$i?jK;fNsiLt#V_oHyl~C6^B4Bc{S9#p4 z0%wQ(h#rq@*JHDPZ+8slh!MTvlRK<8M2Oz-!48!0BT`F|l<@SIgx3J5gf6r7%95aj zML`LJzE>2K5RAFzivw`MK+z2)^uQ|756T0IV5H~~6c8gt(aRzP> zE`*N`ul79EG zoia{;Y!6S2e60OX?37{pbDJgwIx<#|LSF?Gf%d<)lg8=iMR;?7mdBiL?c{O#T>|^6 zfZgz{5VoJ)urUGl)g-VU&nmB`qTLl>!Pk0N`)@E>2Kyk58gB&z4|pf&_ScP3dRBM46^ zqXnC}Q>60HU0#fc`$cGHEp!bD#bvhML^2PdBf~*cMtzWkj<4Zxt&Bn=Ww5wEP!EPF z9ts|4m&%pN~ui$yRh9WKSmj! zwlvq~-8_8v2OBjtPfFTKP12M2utU^R+o6p$vSg`#Ac>0FpK%P4@d$Cc?a*!<9raW_ z@G0RkM>9Js!R(xX8Qeo|N}&=y=LdY|lUCmZ%U)}tTC?6(wEjEcapAezX8EM51K?iH zrykea4YX9p3a`1G-5Bcaar8`snW(vpSDX!YoVY-B%|_L;7*)-<9eZ`V@cb+C(q*=` zpbPEVBT7z`y+s&B3SiBfUxeQQmmtx=w`9|aflJBuHTfvvK5n=rap zevC4&7z80NC=SN4uS*aUw&U%~mMW9Rt<6@f#a~m&xMO&zqQ$_5f}%W zdy+lZW@`*>%F?mbqOvVw{lZK3Da7y|D}$cf0IS+7eMmS4xIPC#SvA$^6PDKWH5%GZ zs~uY9M>=0nLuFT@MVPMyd9LuvdeI>AhE;SwkVftA^a_Sa0-vZoY#b~=;76N$sq6b5g96WuI zzIvR5KjuXiPp1R#m;A>iYW5N=p+uz@1uEU-u}UurREj66Xc4J!g_U)QpHXXd_890& zi{G50dzaDfw0Wth92%A{T((%eD`K}i;Ypob8xV}Fta(5K2^uX=L^oQwG7(KdVW{@6 z1v)MazN0ppRC|UME4@!Y4dv;)X6uiMLY!ggA#zN436=W{YaAs4lYDIP4C_RCNx+L= z+UCLcFL`^0#wdJj4GpB~n_@&yuwuX5Ef6ab&F|i7tt$`dRf%rEf+kpFNDy^{@}Gsn z9HQs%_pzj70!c&5I+402Tl_u{qin_U#q(16iN&Z4F{)#^l35kdFL z?xJ~jk;NNm^d(w=pB@4DlPK#iW~}H=0sl@&e$CdxUO`3wVzxi8F!o=}qXhc}p13{! zV$K#V9cV6N?7zw;7L|@hF3+e2x2U~Wx9{plwKy79=$h0Mt(iMV)aodxTaoFkyCgXv zJD12_qIoqdAj1N@x_+~ejnozVB*-cj&?8a4RaOVd)42YQrZ!n%705VuwI_?oLaT%} z>`>!I6NYrM+V>-t!EZ1lsXnP`UumWs>mFxyBY zMapsd_*{AhbiTO+IChz_2R5=WK5(7x%+?1%DxGVWsV4(W#jNvP=Ha6AtzP*D#mr!y zv=@Bd(PO2*CQ3)stlfqFS~h^>yk(Zsdrm&+u&M{O;Pqzgk_{rcHqot5#ga-SuQ#iu zr3RAMn`0A_*{pKCIh)A&d5;Be@Dh^CENZG7&FJY+A?EwCK@`5vo9$9FyUMYq38Z**P!+lj@XJlWAmwtb)mm;l{ zA1L!bNS7k5lm?6igXnUlv|lKyoc%#pO7kT+T%JpV;>>xK6~4dz#% z7C?uav0x}Ps+Vdq!R%p!8XSf0XrZGHRXz8HgSm}PP)!Y}#u$}bG}XZhI3b`IPYNJQ zs;UpEF;$zf#n%ekj=KGNIQ6b~pnz&qZzBW^xY|5A(SZ3R#cFeolmuOeE4*h=8RNPA z9SUCX+YSb+ZCaY1fsJ$|%V1S&^6ZZ@8ILe3FTPGd1!OW%)oT*iU`rDw=G=sH;Eaj; zs`sf!e(`6Z53&Svg*ikW-c z=`3kx2Kn8nf<_{~99b+C#(hXFLm47! z9{O&kkxMzu4Abrg+D@0ZOH^ik#wyDHHgX#360BHERSNMCNn~c+v}Yqdmplhd?KzP5 zwtwv*R^`#;IbgzbU;{CIrCsG+%#1&Y=f&tlhB_SuFx7f+22Y|gOH6wY((_s{hgINc z4K>k$(M6gcJJc%lcvGd^WOe5iko}w4!zA4q#YQgWFe^;E12W{Dg=K2UoNcP}Df=*h zHs_epdr&jLONr)O)1FC`?A3tTUA@MFs9f-B;Ce4$dE3qCv&g3kR`|CcYQ@;c!GwiCT&jkUN73cLrh2`!fBl z916t?$eqE2I|DZ{BbVG6Ot>>tp@4bp&R`C<)YAwR$k_#!hD+b?HQ~*$o#Adr*Tm@p zQ6kJUT)%CIm03vH&7qb}-;c^A-v$%D4Md;!n7)Diohlq2_}_ zy1F}xw|R=ss8D=Hh1voYWGX(RLg_Oq3VU|Im|tQ)0piZ$#eg#^Rs%>g!W>uBxY5EN zaNmW!7+f5~@B~&8UH{qk79Z{Mh@?vmt48x5mY!Q1gxHyNQ8XStqi^0V? z4C^RBUJNeIVYm!qZxMMhxHyO5A(XL*yck@Z!%$BF@?voDZkePNkr#uDV;FoAL|zOo zj$t7GxFYgmaN)%eM}sONF9sLKFerruRS|hHxHyL)PJ+mb!NoZYSAkx<7+km8i=fDv z26lDs>Ig|?cR}~B9UlM^gZ*{gE4gE$F+hO3Mr{GC2z%?gEjfoGtBTJh)>mb{hMzok z6m;Rm@H5DZ<774GUXx7$47%jG;HH-hMPv?pF}N2+sNf=XMY7b3lcipgEOlkF)JwDb z0D_jfisgt<&%I2fvUj3;IR~^CgWI9>?*xH78tPm>LRBOX)+R%^J{iId$q;VT5NM2Z zTe(MT2sdd6?8V^TTs;!#P;feX!HtzPLQoE$!{DxuP+JhG8g`%88I-%5a?gO!z>C4nDA`O>=}d+?_rVCYRFV2nvedR@sShVheI!}xHZ7IB7~Ji- z7eP>Qyap`YM_DS0N{$O|W{FpV*c|p^aG!`!vlXd3lBMoUmil)sl}ruYCzGW-b-F=1w6>;)naGzy7ffs|Ty533<$fcpb`$B{|i$HiW8Ny4+5MI_0xL#jjsVe>h zGP!odbZtUJPzl33;sMuor{-j|dG60^zM>2)mOZyq&E3 zJ;_@5XR;RFNrv#QhQKQMSMDk(qfUD5mL9#=m%y8D9aCocv!r>rx5WFdzF{oTD08goSIzGSH%Buo7;x%xj!miq5x zssGUh=dymxWvz%GLId3=j7NJhxbR}2&sye?OGAJ6^9YTB0^y5f2w!Rl)x16UU9;TuDJ5C`8ag4ui$I@c3&7m_H>f9gs0}uk?r(_5RlC|)2 zGK61}A^e&Q;WrI|ycpcyIe@NLLo-IF;%gC!4J8EnyM`H|iJ^eJ7+iQU@VH(;4Wbk=In@GK{q*{@Q9GM&^(jjIqQ~d<2C0Cx)yv#jX=-CpbsdH`LVBE;OWcRgC)% z>P-|Qrd|Q#4D}&NR522wy5nz_Dsxf(Y_%G~a@2!}imN-Z4&%u+Y&u5Y z9cgDFJ+s|)!X1^72|Ie|pY9kUuiu%5zegM0$YQ^6)MgIN~l?nQ& zVXvjfMR$_D13x*ZAa|ZSS*=4(=>W%dA`u2Zpt)0Y2Ox_;cWTybG|EUZxlXvpOA1^k zin~&HnhtkW#pF8SPS@css+e3S+!J)Tvnuw;b;3PSM+B}D?hLyS88bVRhC_n@!Cja^ z>lU>F~)4^8MNe3OE|-^D7vX$Wc6H+zqa}mx(%tR zbgG@BR-k=_)jQBkntBVh9Z}Ozdr`Fta$LhEuI>f)zaSwTA?=hz+?ySmzDrLw+?%uL zfunQ*?(*KIyLq@PqEpLC=i;uM4opBkTD^pMZUGOzr#as1*5Abu5YbLS=Z8N;Qip>- zL{f)?KSWZ8gFi%4hrU`Td>**!;`C+W^ui+I)*s?3@f(h8M!d7WZXzJVpm6=Oc_{Wpq47hj2#{ zQ%1*Qbcp1oQ9Rjrc8GF3yL-f<9q0i!hdno9N^K^<^lB{T4aJ@tiaj?Jdu}N9 z+)(Vep{^|kcTchBhGNeR#hx3AJvS74ZYcKLQ0%#(*mFa%=Z0d>4aJ@t>KULdRqVN; z*mFa%=Z2co!!Rlpdv2)nEAXyFvFC7 zkdcZ#HxzqrDE8b??75-Xb3?J`hGNeR#hx3AJvS74ZYcKLQ0%#({s4#xiaj?Jdu}N9 z+)(Vfq1ban?JtMphGNGJb$nN}zp08nHxzqrDE8b??75-Xb3?J`hGNeR#hx3AJvS74 zZYcKLQ0%#(*mFa%=LVeE;JKmLb3;u;OFKoyOX0bp;JINeQ0%y&;JD!#ixhiqDE8b? z?75-Xb3?J`hGNeR#hx3AJvS74ZYcKLQ0%#(*mFa%=Z0d>4Rtv*alT^D4aJ@tiaj?J zd2U>&*l|PE1CX~uvFC4aJ@tiaj?Jdu}N9+)(Vfq1banvFCW-`C)EkC;$-v^JD`WmTZ!Gzagq~?)7y&JFI|X=<_ZGL zt{Jgk?R~_Cd@NM#cSY9RQj$M-ur=c3ni2a`P!+IiMhvbQ!YG%r#o(Gzfoz@HT{B{E z&F~SW*fm43YldRi4D~or*+wqW#^9Q9DyZ_97+f=G9J-)@Tr*;D z&6tYNDqd#9uzfZIp*00@n)u+FaVwOuw%|_U3D*n?-B3WT88NtKP^h(_wQLrGaLu6L z%>~Pd6s{Q*T2~OGTI(yJ4QLId+i+wwL|{Tk;}1tVLrLKXRYy2Ny2ZKSxX&fE#o(z? zhp6&7{%KQS6Z}qHu%@&MGPZy~?Wi{JcS{YeDL<^`MJN$jUF}s!&Up~`6;`oI2PR&Y zSS5N{@?it0N^_V=@o~s+mFbmlQ9M4VH^Suwlq)a(*S-k!phY%TXh27+ZJQWd74{<# zlKD)}1gffxNywu%)f1|GU^7(~QZ2Q;A2O+hKp0X#Ag^QCl+EgGcR_~EAA@vy|=-~o2n>~PXVtk{?9%XDx=WM`1^#cfeW-IUO|}}il|+!i%;c16$Q4& zXE0d<1$M;isc4PGBxhIrGg3l-F6Z04HnRq1(}UUGIGG|^gR(BbGV4H(e-hc?c$0_H z=9y3dy~D5xvvr6)6Zk7ysVr%xb1o2nTMh-`;uelyv(<;N$|GD=(FZ zf}I?(yX8PLb~w6e=`0%*zmlA{3Z!)3H&b6AW%Rn1@GQypDB*6@09`ZDpXoAN zmv;kXhPb3b5CSq6VaZe}!rtZ@7QUqE9^|lF-fm`x9BY|Iyw2<01WQ}%^c;F6M`yJ4 zo;Sy^&g;Y#4I7;D_tBy)Zv{UMaEa-YdzS1GQ;GY~o92rF1RhLB3c$MIUFGId`7z4r zv^VPxhaPHhUbI&?RTC5j1Rqk(+?gpL*LuL}K8ioYH+?wTKX!)FsI)dc zW`%vt9!($enLk-Ni+*SIB>hs;>U%bk4=JSTs@0~4^DUw$L}XH3LpH3|kU`WfNMkkJ zA%={S{&0;~!~J2%F*}iinn(F^YW+iXZ`kV9J<-vVl3pP{M(>ji>j;OQbHxm*{uDGH z^N2{eO&hnLMbdGZtuF&WWfNvsBzK_z8S;iBG$+)z0=YRN5{*@+u2sfq7UYx*x!-mbpen&qhS_k7QAX zCvyZmm6|RL4hbRsBjp;J$mky#e2|O*UW$-`NkVRew#@p7LsGBTLNIdjWwySP5KPRck}{}9+B{~*#h$QME=9eNfUTOK}oe^miAwwJJoOuuoqon|u z+%+y(e5PS$22v+g?WX!rL3oOw$_m2M8~NL@*^xNC;UxEf`ZQ8yG!ni?BSNd<%k)}R zkDx_FBb~J#jrtAL?yN|7w9YU;$j~}IL2o7KE7_Raiquk1AXBS;Q%Uc8(zxzE&lELG zmmf5cYrvy{3=8*oY1I@!f9roA>el=u&AckGsD`g6npeM1sIV`mw&8j5<=PQD9 zwPKRK6oA20CBM0TIqguI56Dcjk!0;k%Ow^B4`%APs~=vA_HRC!7Ct&dptXM?WF+cH z*glz7B5cRhP1j^UYUz#eEO;s{gQSpSfl+@FLA^OG{O=CJ?-cn#iSw~66Mi?Rl@dSd z-@u9S2N`+^(2brng`3k33C7E+C?-R5eH!ogQdb;=dBeOljbFT@?Nsr1Qg2Nwrx)?m zbw?0{+tYN{9a{A+Rph21JhG9UCGHIPP4TKWP=no)#%nvf<#DfnBL-sgu{87fm_}bw zP9&G4IV9tEt)ov8HE?&LXqTjQ)vA&jxFoGobTd-QbxGO)Dc8fElxtO*rwcY;3U+x= zuqgs`bpUjx;9Mg(t(M6~#luw6MbgA7HL5ogs79bQiNY79pjwoS%7Z)KqEuL?1yVJt zWhto62+}pGvy)KmrJ;9#=<42xXz;AWtkD^@A*cojD)@xJ-;CSq0KsLqJfNGwfB@Gf zt**iCavQ1ehos2^Udvd~-jD$2`2N>Y{~MoX-V+rFqRx>4gDIlU(a=Aw>8+M=QthXt znZLP`qiO+WZu6L+TqHRqmd`Y5c)oH~Pz{FD5O_R+^>M=Dzk6D1l zkQbpAQ*j=RPhEudurvX%BfpAOcFew26)B`o=*i2OoB!FXWIXa#^KKw!X5*Y$_>TE|;mkLn416!A${;oE z4YNrUKEpi4sCbVm;*BuR6$3SlV-qm$2MiJWMmS&UVu}cPD-eRRw9+v7xbV2Z7QJsv z@Mwet;qiF5Q1cM|d5?$7qyi^3Fw)1veIz_ygzOB2%&dD;^Bu4GHlkophcihPv|cnS z&O$YrHwcLCmVlThKWJ1`Ows2JVSc8=Ox56VE4v}wi%_*I^oDT1K%oNbhVV#<*s3*r zV>_;Iw5VW}N4V|^=V)A2$B=3^hxt8cp^~JLgsnrG_~xtmoSKM*X8CV0<`ym=-W1 zAz)-e!1zD_=uap5vElHZKZS5Xg8mv!kM+mcL>HgL86TgSlWc;=pPQ7H1_|QAoUNMn{|=uGJg~C zTQrO+gS2Lb3&^aIp1Wk~vBH@G;bE`#O`YX<)IVo##>m$=$1vmJ><1b4J)Tk9_jh4D zPkxMzAgbc^cz!sG9+7BeTYIynYSL6MB&fOuR8x%F$RCm%RKWg#$}_u#v*^_xEemVU z)?@**I8@Sz!dHfKNS&AkjJgjsO)$DpdQFf%zj1+K)=FQai5!_=X9)Hc$3UX_s?^+D zKMR^T`9#xYwuYf|sk&F40;#%(o2lwvb-Ih*wl-I?W?yv%h-No8%hSoL&SCPvxURWz z_UZGm&~;p5N6*BvJbc|r7nW}~SFxSx8xC)b*)6-gW_eh6!>OZJq1eS~u1cc{{D;F& zdv?p4&4x>r(g`f-i5-wDx}f!%cS~Uk^;0@2kuI}!N1`lu2W5GV%W`*6mL0k*cRQXg z%%i$6cRPm>BeWY`n0rzSb8l*4?h6X@rY_5UL0NV+8~yH~_PR-+?)*t0qTTUjww8K$ z(ybgskGq?ku2RQSNbQ@PDpEUIMZ>bCXqlUwzPbfSbG}2m1C9F?caS!25fShGD6BtB zh`1iirDkt&@}(M9u{LgT%08m;7k#c-dgU!nU+I+x&L7ywy>6X|K|gM8q;9(2iA`qp ztZOzZDyeAKIcdanoR)h{LT)z<+A^SA=alM2lZd&_X&^E5?N$5ovwm-RkN-( zFF>rT?ScR?Ra-r=JyV*?N8WeB5Q{;+%+{xwFHv-*TiTxCA^S|HmlR+;7vM~1pj6rz z!GBf)|8>cgc6Lx{v{m|22m=v~Y33pk?|diYkMVv&d~fXRG++=}?>`A+YkG4cUJCp)~M zNyBr+aO!9?gy*hrgjsuqyc6&Q3D-4Y*A+4|1?sE-sz){Q61AbJ!grbG+m5vc%}G=+ z)hSMfI@RfQ5Y*$7ppK&}YXa+p6s*StSP814vAN#iwepFY z?;#1bJ_5d#*W+0NB)w=~l*gwNNNqixY})zV^0g4(tMkC+t9U>#Q1o;L2V0qyw7HB- zM+>+$UKQ6yFDW89q&8wZ*{pRE`^iSd->J$AM9x)TiGV`gnatKp6JiRSLlR;;NtvXim?-v_FNNEX1k>7q0n?b%S-RzXSx?5CiY*|c_2}QI8O5A_GI8L+ z=6sAkW>k1?{~tV85Kk$8G(f7EMx7o9F^xJ638tekyPAfRN!$7>HB-pp%WU190BShp zdi-dl7XhZ}@S6Y>R)%lOp>;0p|1N-+FG2q$#44@UOs6H777hwZ|4WER1yboVG{XNH z3RG%TWKn6q7alKvA(>B1@K~JS@qL0v<#)X>{vc0xsh9D>^oJy-v#7n}h%O>ns+qO} zyFbD7t5B&ft?>9diN{@p^b_F`PXUJZpEfus-6x@7$gLdHlk-#@1Pq6X=>}vBeu_%F zH`IYPr=R#-ig|3JwC8|l139qm4e9-Y>B4evs7AA_yoxw@dqanj0~0h_$r{}oI)*Z1 za+Yesk!O;D25`Eo_<@@Lt`H9aUwjsliTjD(BXQm=~cc<3fL7of%ws0rJ#8_aV5&0s`Bd-VO=+y(|t>{UmdS1|7 zsnN|$pxcl@_q^yD``=Rp-t(bA*#htRP(SGdW29p}9~vorU})te>H^P)CJQ#~kMmmT zg#g=pqu*8n_hg7W$y|*Bn@D__tv@7CJn4nXba&?JdNOp#wOku>WdM9Kbfk><=*^AP zM>Yx1TR#aQe#Y&e3l}({T$i)qNAHs7}hzC{FaFtz6?f=e@e&R$& zJc%lIqX;=q3&GPkUwG-15VA4UUE>y}8$*o(bf!^JLF&0#cpRm9pc`o(-z0e49P073 z2YFNlJlx+L8X!!@SKUWA)`hYK`2wR~5ovUVFx{>K8A|1i)FfF0O$}udY1E#t*FaT!sLrN^*b$Bws%z0kUjYq2$)w?|V&dZ+CX%~r z$?fH894e9z3l)&bDYj2U@?oJ8kvv5tj|ycHY1E#1kYpUAMkPu}9t|3nY#aS9C1}+w z*fY-gkCgc?`9YcYf|MRaszbTbYsXZMrLnL&R79_Z5{vbop-du;+T#PsGiVyFO-QaH zXJ4}p$GM{D)Ny%2?bBWjXEk^rs1NDAC2p_RW=H{NBB7Hy2L`ie#<@3o*Tc$ytSz4R7Q`HByOdt*Z7w~h!@u1PSAiOLZc zm5&saBTPbAqpb5p#8!`#&O$`z9$tm9(m^6hU*}c*P7}~NJCh_*vt^}k2!KwhQ(6Jb zv;wNu67a2d$sL>l`?0X=vFR^)H23?1I{I3voRf92g37@n;6r4Rr{%SFwH9gAccr#; znH}D{PlQ~SPV%9})`JX9+0!uN#xBbNN)3*UzYm8VJg zCFFvKy9EOj6cTJAgsEc^nJ7)qy0|WI;=W`>U6vvqp^!xQr(+6-yF$q&|dd3 zcGN@_qa_+f-NL<+@|Y&5>O)O!X226KD46H0fG6J5oa^a4$xP=2Ovi&!I6{W!{W7WV zHA)*gNozM~LuPBqD2#(t>_&Tl6dV2fQ>u_!JN*5>1W(Xf&DJFWd9CgB)M~0TG}kE_ zJr%FchTl97JlHe8ky=ot9llfZ8>b1))>{I8m3F`m5BoGExzZkfc~@w+CbBe)miB=5 zr)d%cD8dH~pa@H&(*tNC%mXOrm$rbnncS5@kQhI?>!t^lKi@dyHJVUtQRIj3a{a?R zFoCPSit6k)E4*4mo}5U!3XmIUzuGF4PBC64fZwcAc>_Mis3;_zAF%j!b$`v_*aU~~ zHHQOMnQ)j{$=}&Uj%r~srLvmTcED=X{Y={b0ZWgX5HXZQd@mxtdPjJ-SH&naL<0G} z)j1HsJ@tF5+d&e(w`y5}N1Gcq)$D#@d9!9oZI3Rqb**N(-|7~y?> z{u;DV@e}o?FNEWXn&VLBM;!mDIer1Z|3H<@@(T<5lG2^}9ZiF9rR7jnzWGnddwGJz z@nca=e&0}ORqAze0~;7rTKX;8qy|11rP3NC?=Z$!T|+C&Dmejw9!9Z?;8n{Z19-PY z`{&hG2O*wm9Qqhv7)jc4>o>6Z`Gb!;1 zb!a*bC`a>C+c?dy4z5~!VY|?8y$HwW_nJ?$^5INXuBplrQp-`%JyE-dS3Sx?78t$m zA+DpD{>wc=h+PQ2%+|@8eso1Ze`o{gUUo+l6e}&aKW5`ru-H%z%+0%CW3hTy*Uv#ikIk|2;9){3IO;sz%rfZ0S6caL-6ias*IS*kkSBsX=|P?ffB$t> z+^@UDN-L^__3J^2RU~0-PJKRculDa=ZRMLi{pVI&&-=w!Sfzw1)8BNll{F4V)fwrI zFeYqq(;S;aHyuliu{pKrc=eD=B1J3j;c=A#jaIW zJeDk|Z+ksB^@$Q@H-HyaNurMX`FX3XE{8TE??Lf!kPTEp)?NdW)A89BpfCn;RXF%? zi@*8?tI#~ezXL!12RB#+QPS8D5_{ccR>!vAZm{OW(hje4ob68c+vjbvtWd8*ozDI# zcUni8gZ)SDw7xg{`gh-Db?InWp-|Xrh&vUL9H(ZvQ#j6vUhJQ?(JF;|suhZatqD0! zzo|~qIH%JYj+*Bbw>X_wIPr^|jx9`<-Z^X?6;FzoR}i))cA|(zFfivihtkhQPA&b6 za|TRxdR*ibu5gY;*sgI3DS8|B3ayZ}-049-$a%ce^CG9u3TMDYPW3paV1-k2k<;}O zCwIG3G}XzQ=j3bQ^Fgk26-Rz7V;*1*Zm^~~DJBtsXVc5pQ{u6gv z1N?{Xvo5ucJGpJh{nizxS<1J*;9Imutq26Y{VcJcjxVVj!;Z2v`?ZHBM%`#x;# zw{AYGt@|TZwwaa@B4Hav*qPg`W#%UT^KDjxKXAL%Gu$I@9Va3zUBmA#lwA#!g+HQZz zy2U#F$Z({Tv`dXMp|YHloYKwC5xbq)o1NHOPT#@K;N?yXwHP_WL0Z{n=cwJzTuy5k z>>SEzR4gkpO|)w-k4)hzstwzj&pAUx!AH^0W>LUfP7Q?yOK5qr@^gDZOFGN=gR<29 z-)6}QU;AGa`~Rfxwn@9J1&*~dx9#u$u)3KRrjd`|vR=zJ_xq20YPFg({mGwMa=$%_~H z6UNwi{)|7Yob*}CX3W#EZKwTVh0V5${huQOI z%z$0ijCo6&n%W*JwELR=_nqyx{iP*#Zra3SM~paZ;za+&F7|mHm~3v-f~Mt7i~JE? z?fHJU$#z!TuCDe<)1O^zAC|s+@u^LVMD_k{#r6pQr(*lQ$kN4&m(PI8+HNngH=6z_ z-Rvy|jacc>wL$;>-a*1f?CN1wr-C3lmWY;QTatt5wL003NpeV%3w89=|DOD^7S$W` zKV9UkPuF`c%MPM3@aky!-ABo}`8xJ5`gfns{E=i1qT?92>H0_~e=NyC^f;aTu}=O> zl7r|7<`}v@)5%{-au9u+PX1CS@0a9rAVEmH$BxyT*LL&#JI<&6#bL_;JiD{9(Q99{Cfd z3-u7K^1oyE#WG^X8vnvxc5eQ{6D3)Da2W6FHEKTuXHFN&b3DzF8*+ zxmW4rHU4Wzu6%8-_==k&{621#z zy67N5D(T6(Y~M+=VWJsP{PYD9@w|?wWdp^>PM3&hbbP7A_c6LJl$f)Gh<>y5^>4atNz_!3vJ1@@HAcF6|G798aKx~31#PR@{I z;}cE)z($EU6=Av#==jvL%bhUG_0Q~MXL*GZFm{X4{;a;x;XRr< z^}8OA>G;&Ijy$j9H$NjVe$;UG==jvHwtS)EA9_v*=_M3he@eV(q<&;4jxn9uLh9GB zdg%DnF9;3R@pr!>jDv3{(Q%N(=ek`IKT8X4((ymNM)7Eb!I!X>=>&WqjISb{fxa0{ zj2?PR;?L3XSNZqWW4yc`$tDhT30{9Gp)xl3`zZM?ogBPD4AhU=qXEf}Y38Z625-VPQQ7l>+4+L|VPM+$|Lh{&U z=zErdB~h`C*FTGqEgQ}H|h9P{}wvYfN-YznLMWBQ(y7EtmEM>z+xxx zU&Hu7;yokPIPyy*WMQ}szPlKd^7nv|-c!9?GwO&16ah;0_^#CPsfKPtbi8;29*2*~ zYDSZELU1NCwubqdt>aU@Ko{xwBXwODYI-`wi)$?Z22GLb!+3)K+Auq}H@Qd?@`FB_ z2qrJ-_*6Hkcl@0L&;UNr$*C`Kzt!=0C&E|oN+g8#PhwJi+q3+Vfne87C#QPB_15uw z_X)epPb7(Zy9Xo&RVXMQ|)e6==fBNy%rsxYR-C# zj!$*+xSPe~)5)!*^5A2nfy!U=cLIg^0aNw}ki#@RalsWU~MLndh_)o&uM<5LYXD|CFS*~m~GpK9544C1Mx z)^J7nHA8LJJ5|%Bz5+c@$M2{VB{b>Ie1(orwS>G$$EO-RZ`1Lc^pGFHC_&fr5`Vmr z>a9R$Op+2(k2%<@<5OSYeWBx1O}e`IS(q`#zN{PV1tlW4R(_0MbhcDGAQuZZ5`ToA zb#Kx1o&D3m&g{YS5MHdTM<{=cCRUS#YJ?sarZd&7B|16vIG59Pe5&Q|MLPbYZo+OH z8VX%4I{vJaB>cV>a~q2pyIm)z`eDAH<5SNR*sbGJO{70!cHWOVx&1?OA~hpRG?Qwv zU#R0#&F;JF_*8F%emXwYPIS1$pZGt{o;XTpNIjEdx{gn^eLqLXr@AH5(dRsn&Z0A; zsFG8y*~#0D;!_WjcvQ!y+DAO4{_~67LzQ=A4h}45?(C$N5`kW(*I1yry5vAbEE(t@pOoB zWs25UuD|mzD5S4WPc;}hM905BP3V{EY~yr%s(?UPB z81buS*fnmj7R9FN>>2hbY?|IN!>)}6PlXTo`)1gU(V3H^QOs;BnQ32YnH&5&W+VEV z74k%Mq5mm@ZpRxX_`)%M)f~HD^!+a-+}}TWj@>`nU2h@U{+&qen5VxqS5Yi#E5XlZ e|A#qtb#&+$A${1doD04Orb%#u=~qp+yZ&Ft9rMBf delta 81802 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 exmV3H%flN+aMD5d;aL!~a0&;files); } -OnyxAstNodeFile* parse_source_file(CompilerState* compiler_state, bh_file_contents* file_contents) { +OnyxAstNode* parse_source_file(CompilerState* compiler_state, bh_file_contents* file_contents) { // NOTE: Maybe don't want to recreate the tokenizer and parser for every file OnyxTokenizer tokenizer = onyx_tokenizer_create(compiler_state->token_alloc, file_contents); bh_printf("[Lexing] %s\n", file_contents->filename); @@ -126,44 +124,57 @@ CompilerProgress process_source_file(CompilerState* compiler_state, OnyxCompileO bh_file_contents fc = bh_file_read_contents(compiler_state->token_alloc, &file); bh_file_close(&file); - bh_table_put(bh_file_contents, compiler_state->loaded_files, (char *) filename, fc); // NOTE: Need to reget the value out of the table so token references work + bh_table_put(bh_file_contents, compiler_state->loaded_files, (char *) filename, fc); fc = bh_table_get(bh_file_contents, compiler_state->loaded_files, (char *) filename); - OnyxAstNodeFile* file_node = parse_source_file(compiler_state, &fc); + OnyxAstNode* root_node = parse_source_file(compiler_state, &fc); if (opts->print_ast) { - onyx_ast_print((OnyxAstNode *) file_node, 0); + onyx_ast_print(root_node, 0); bh_printf("\n"); } - if (!compiler_state->first_file) - compiler_state->first_file = file_node; - - if (compiler_state->last_processed_file) - compiler_state->last_processed_file->next = file_node; - - compiler_state->last_processed_file = file_node; - - - // HACK: This is very cobbled together right now but it will - // do for now - OnyxAstNode* walker = file_node->contents; + OnyxAstNode* walker = root_node; while (walker) { - if (walker->kind == ONYX_AST_NODE_KIND_USE) { - OnyxAstNodeUse* use_node = &walker->as_use; - - char* formatted_name = bh_aprintf( - global_heap_allocator, - "%b.onyx", - use_node->filename->token, use_node->filename->length); - - bh_arr_push(compiler_state->queued_files, formatted_name); + switch (walker->kind) { + case ONYX_AST_NODE_KIND_USE: + bh_arr_push(compiler_state->program.uses, &walker->as_use); + break; + + case ONYX_AST_NODE_KIND_GLOBAL: + bh_arr_push(compiler_state->program.globals, &walker->as_global); + break; + + case ONYX_AST_NODE_KIND_FOREIGN: + bh_arr_push(compiler_state->program.foreigns, &walker->as_foreign); + break; + + case ONYX_AST_NODE_KIND_FUNCTION: + bh_arr_push(compiler_state->program.functions, &walker->as_function); + break; + + case ONYX_AST_NODE_KIND_PROGRAM: + // Dummy initial node + break; + + default: + assert(("Invalid top level node", 0)); + break; } walker = walker->next; } + bh_arr_each(OnyxAstNodeUse *, use_node, compiler_state->program.uses) { + char* formatted_name = bh_aprintf( + global_heap_allocator, + "%b.onyx", + (*use_node)->filename->token, (*use_node)->filename->length); + + bh_arr_push(compiler_state->queued_files, formatted_name); + } + if (onyx_message_has_errors(&compiler_state->msgs)) { return ONYX_COMPILER_PROGRESS_FAILED_PARSE; @@ -212,7 +223,7 @@ i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { // NOTE: Check types and semantic rules bh_printf("[Checking semantics]\n"); OnyxSemPassState sp_state = onyx_sempass_create(compiler_state->sp_alloc, compiler_state->ast_alloc, &compiler_state->msgs); - onyx_sempass(&sp_state, compiler_state->first_file); + onyx_sempass(&sp_state, &compiler_state->program); if (onyx_message_has_errors(&compiler_state->msgs)) { return ONYX_COMPILER_PROGRESS_FAILED_SEMPASS; @@ -222,7 +233,7 @@ i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { // NOTE: Generate WASM instructions bh_printf("[Generating WASM]\n"); compiler_state->wasm_mod = onyx_wasm_module_create(opts->allocator, &compiler_state->msgs); - onyx_wasm_module_compile(&compiler_state->wasm_mod, compiler_state->first_file); + onyx_wasm_module_compile(&compiler_state->wasm_mod, &compiler_state->program); if (onyx_message_has_errors(&compiler_state->msgs)) { return ONYX_COMPILER_PROGRESS_FAILED_BINARY_GEN; @@ -259,9 +270,20 @@ int main(int argc, char *argv[]) { OnyxCompileOptions compile_opts = compile_opts_parse(global_heap_allocator, argc, argv); CompilerState compile_state = { + .program = { + .uses = NULL, + .foreigns = NULL, + .globals = NULL, + .functions = NULL + }, .wasm_mod = { 0 } }; + bh_arr_new(global_heap_allocator, compile_state.program.uses, 4); + bh_arr_new(global_heap_allocator, compile_state.program.foreigns, 4); + bh_arr_new(global_heap_allocator, compile_state.program.globals, 4); + bh_arr_new(global_heap_allocator, compile_state.program.functions, 4); + CompilerProgress compiler_progress = ONYX_COMPILER_PROGRESS_FAILED_READ; switch (compile_opts.action) { diff --git a/src/onyxparser.c b/src/onyxparser.c index 5cf6f232..d3379eba 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -8,7 +8,7 @@ static const char* ast_node_names[] = { "PROGRAM", "USE", - "FUNCDEF", + "FUNCTION", "FOREIGN", "BLOCK", "SCOPE", @@ -77,7 +77,7 @@ static OnyxAstNodeBlock* parse_block(OnyxParser* parser); static OnyxAstNode* parse_statement(OnyxParser* parser); static OnyxTypeInfo* parse_type(OnyxParser* parser); static OnyxAstNodeParam* parse_function_params(OnyxParser* parser); -static OnyxAstNodeFuncDef* parse_function_definition(OnyxParser* parser); +static OnyxAstNodeFunction* parse_function_definition(OnyxParser* parser); static OnyxAstNode* parse_top_level_statement(OnyxParser* parser); static void parser_next_token(OnyxParser* parser) { @@ -689,10 +689,10 @@ static OnyxAstNodeParam* parse_function_params(OnyxParser* parser) { return first_param; } -static OnyxAstNodeFuncDef* parse_function_definition(OnyxParser* parser) { +static OnyxAstNodeFunction* parse_function_definition(OnyxParser* parser) { expect(parser, TOKEN_TYPE_KEYWORD_PROC); - OnyxAstNodeFuncDef* func_def = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_FUNCDEF); + OnyxAstNodeFunction* func_def = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_FUNCTION); OnyxAstNodeParam* params = parse_function_params(parser); func_def->params = params; @@ -896,10 +896,10 @@ void onyx_parser_free(OnyxParser* parser) { bh_table_free(parser->identifiers); } -OnyxAstNodeFile* onyx_parse(OnyxParser *parser) { - OnyxAstNodeFile* program = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_PROGRAM); +OnyxAstNode* onyx_parse(OnyxParser *parser) { + OnyxAstNode* program = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_PROGRAM); - OnyxAstNode** prev_stmt = &program->contents; + OnyxAstNode** prev_stmt = &program->next; OnyxAstNode* curr_stmt = NULL; while (parser->curr_token->type != TOKEN_TYPE_END_STREAM) { curr_stmt = parse_top_level_statement(parser); diff --git a/src/onyxsempass.c b/src/onyxsempass.c index 9ce783a8..856055f5 100644 --- a/src/onyxsempass.c +++ b/src/onyxsempass.c @@ -23,80 +23,68 @@ OnyxSemPassState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc // WASM, this function may not be needed. It brings all of the locals // defined in sub-scopes up to the function-block level. This is a // requirement of WASM, but not of other targets. -static void collapse_scopes(OnyxAstNodeFile* root_node) { +static void collapse_scopes(OnyxProgram* program) { bh_arr(OnyxAstNodeBlock*) traversal_queue = NULL; bh_arr_new(global_scratch_allocator, traversal_queue, 4); bh_arr_set_length(traversal_queue, 0); - OnyxAstNode* walker; - OnyxAstNodeFile* top_walker = root_node; - while (top_walker) { + bh_arr_each(OnyxAstNodeFunction *, func, program->functions) { + OnyxAstNodeScope* top_scope = (*func)->body->scope; - walker = top_walker->contents; - while (walker) { - if (walker->kind == ONYX_AST_NODE_KIND_FUNCDEF) { - OnyxAstNodeScope* top_scope = walker->as_funcdef.body->scope; + bh_arr_push(traversal_queue, (*func)->body); + while (!bh_arr_is_empty(traversal_queue)) { + OnyxAstNodeBlock* block = traversal_queue[0]; - bh_arr_push(traversal_queue, walker->as_funcdef.body); - while (!bh_arr_is_empty(traversal_queue)) { - OnyxAstNodeBlock* block = traversal_queue[0]; + if (block->kind == ONYX_AST_NODE_KIND_IF) { + OnyxAstNodeIf* if_node = (OnyxAstNodeIf *) block; + if (if_node->true_block) + bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) if_node->true_block); - if (block->kind == ONYX_AST_NODE_KIND_IF) { - OnyxAstNodeIf* if_node = (OnyxAstNodeIf *) block; - if (if_node->true_block) - bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) if_node->true_block); + if (if_node->false_block) + bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) if_node->false_block); - if (if_node->false_block) - bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) if_node->false_block); + } else { - } else { + if (block->scope != top_scope && block->scope->last_local != NULL) { + OnyxAstNodeLocal* last_local = block->scope->last_local; + while (last_local && last_local->prev_local != NULL) last_local = last_local->prev_local; - if (block->scope != top_scope && block->scope->last_local != NULL) { - OnyxAstNodeLocal* last_local = block->scope->last_local; - while (last_local && last_local->prev_local != NULL) last_local = last_local->prev_local; - - last_local->prev_local = top_scope->last_local; - top_scope->last_local = block->scope->last_local; - block->scope->last_local = NULL; - } - - OnyxAstNode* walker = block->body; - while (walker) { - if (walker->kind == ONYX_AST_NODE_KIND_BLOCK) { - bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) walker); + last_local->prev_local = top_scope->last_local; + top_scope->last_local = block->scope->last_local; + block->scope->last_local = NULL; + } - } else if (walker->kind == ONYX_AST_NODE_KIND_WHILE) { - bh_arr_push(traversal_queue, walker->as_while.body); + OnyxAstNode* walker = block->body; + while (walker) { + if (walker->kind == ONYX_AST_NODE_KIND_BLOCK) { + bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) walker); - } else if (walker->kind == ONYX_AST_NODE_KIND_IF) { - if (walker->as_if.true_block) - bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) walker->as_if.true_block); + } else if (walker->kind == ONYX_AST_NODE_KIND_WHILE) { + bh_arr_push(traversal_queue, walker->as_while.body); - if (walker->as_if.false_block) - bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) walker->as_if.false_block); - } + } else if (walker->kind == ONYX_AST_NODE_KIND_IF) { + if (walker->as_if.true_block) + bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) walker->as_if.true_block); - walker = walker->next; - } + if (walker->as_if.false_block) + bh_arr_push(traversal_queue, (OnyxAstNodeBlock *) walker->as_if.false_block); } - bh_arr_deleten(traversal_queue, 0, 1); + walker = walker->next; } } - walker = walker->next; + bh_arr_deleten(traversal_queue, 0, 1); } - - top_walker = top_walker->next; } } -void onyx_sempass(OnyxSemPassState* state, OnyxAstNodeFile* root_node) { - onyx_resolve_symbols(state, root_node); +void onyx_sempass(OnyxSemPassState* state, OnyxProgram* program) { + onyx_resolve_symbols(state, program); if (onyx_message_has_errors(state->msgs)) return; - onyx_type_check(state, root_node); + onyx_type_check(state, program); if (onyx_message_has_errors(state->msgs)) return; - collapse_scopes(root_node); + collapse_scopes(program); } diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 636f05b6..37c39aea 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -17,7 +17,7 @@ static void symres_while(OnyxSemPassState* state, OnyxAstNodeWhile* whilenode); static void symres_statement_chain(OnyxSemPassState* state, OnyxAstNode* walker, OnyxAstNode** trailer); static b32 symres_statement(OnyxSemPassState* state, OnyxAstNode* stmt); static void symres_block(OnyxSemPassState* state, OnyxAstNodeBlock* block); -static void symres_function_definition(OnyxSemPassState* state, OnyxAstNodeFuncDef* func); +static void symres_function(OnyxSemPassState* state, OnyxAstNodeFunction* func); static void symbol_introduce(OnyxSemPassState* state, OnyxAstNode* symbol) { onyx_token_null_toggle(*symbol->token); @@ -238,7 +238,7 @@ static void symres_block(OnyxSemPassState* state, OnyxAstNodeBlock* block) { scope_leave(state); } -static void symres_function_definition(OnyxSemPassState* state, OnyxAstNodeFuncDef* func) { +static void symres_function(OnyxSemPassState* state, OnyxAstNodeFunction* func) { forll(OnyxAstNodeParam, param, func->params, next) { symbol_introduce(state, (OnyxAstNode *) param); } @@ -250,50 +250,24 @@ static void symres_function_definition(OnyxSemPassState* state, OnyxAstNodeFuncD } } -void onyx_resolve_symbols(OnyxSemPassState* state, OnyxAstNodeFile* root_node) { - OnyxAstNode* walker; - OnyxAstNodeFile* top_walker = root_node; - while (top_walker) { - - walker = top_walker->contents; - while (walker) { - switch (walker->kind) { - case ONYX_AST_NODE_KIND_FUNCDEF: - case ONYX_AST_NODE_KIND_GLOBAL: - if (!symbol_unique_introduce(state, walker)) return; - break; - - case ONYX_AST_NODE_KIND_FOREIGN: - if (walker->as_foreign.import->kind == ONYX_AST_NODE_KIND_FUNCDEF - || walker->as_foreign.import->kind == ONYX_AST_NODE_KIND_GLOBAL) { - if (!symbol_unique_introduce(state, walker->as_foreign.import)) return; - } - break; - - default: break; - } +void onyx_resolve_symbols(OnyxSemPassState* state, OnyxProgram* program) { - walker = walker->next; - } + // NOTE: First, introduce all global symbols + bh_arr_each(OnyxAstNodeGlobal *, global, program->globals) + if (!symbol_unique_introduce(state, (OnyxAstNode *) *global)) return; - top_walker = top_walker->next; - } + bh_arr_each(OnyxAstNodeFunction *, function, program->functions) + if (!symbol_unique_introduce(state, (OnyxAstNode *) *function)) return; - top_walker = root_node; - while (top_walker) { + bh_arr_each(OnyxAstNodeForeign *, foreign, program->foreigns) { + OnyxAstNodeKind import_kind = (*foreign)->import->kind; - walker = top_walker->contents; - while (walker) { - switch (walker->kind) { - case ONYX_AST_NODE_KIND_FUNCDEF: - symres_function_definition(state, &walker->as_funcdef); - break; - default: break; - } + if (import_kind == ONYX_AST_NODE_KIND_FUNCTION || import_kind == ONYX_AST_NODE_KIND_GLOBAL) + if (!symbol_unique_introduce(state, (*foreign)->import)) return; + } - walker = walker->next; - } - top_walker = top_walker->next; - } + // NOTE: Then, resolve all symbols in all functions + bh_arr_each(OnyxAstNodeFunction *, function, program->functions) + symres_function(state, *function); } diff --git a/src/onyxtypecheck.c b/src/onyxtypecheck.c index b64bc427..9d2f96e3 100644 --- a/src/onyxtypecheck.c +++ b/src/onyxtypecheck.c @@ -1,7 +1,7 @@ #define BH_DEBUG #include "onyxsempass.h" -static void typecheck_function_defintion(OnyxSemPassState* state, OnyxAstNodeFuncDef* func); +static void typecheck_function(OnyxSemPassState* state, OnyxAstNodeFunction* func); static void typecheck_block(OnyxSemPassState* state, OnyxAstNodeBlock* block); static void typecheck_statement_chain(OnyxSemPassState* state, OnyxAstNode* start); static void typecheck_statement(OnyxSemPassState* state, OnyxAstNode* stmt); @@ -101,7 +101,7 @@ static void typecheck_while(OnyxSemPassState* state, OnyxAstNodeWhile* whilenode } static void typecheck_call(OnyxSemPassState* state, OnyxAstNodeCall* call) { - OnyxAstNodeFuncDef* callee = (OnyxAstNodeFuncDef *) call->callee; + OnyxAstNodeFunction* callee = (OnyxAstNodeFunction *) call->callee; if (callee->kind == ONYX_AST_NODE_KIND_SYMBOL) { onyx_message_add(state->msgs, @@ -111,7 +111,7 @@ static void typecheck_call(OnyxSemPassState* state, OnyxAstNodeCall* call) { return; } - if (callee->kind != ONYX_AST_NODE_KIND_FUNCDEF) { + if (callee->kind != ONYX_AST_NODE_KIND_FUNCTION) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_CALL_NON_FUNCTION, call->token->pos, @@ -322,7 +322,7 @@ static void typecheck_block(OnyxSemPassState* state, OnyxAstNodeBlock* block) { } } -static void typecheck_function_defintion(OnyxSemPassState* state, OnyxAstNodeFuncDef* func) { +static void typecheck_function(OnyxSemPassState* state, OnyxAstNodeFunction* func) { forll(OnyxAstNodeParam, param, func->params, next) { if (!param->type->is_known) { onyx_message_add(state->msgs, @@ -347,46 +347,11 @@ static void typecheck_function_defintion(OnyxSemPassState* state, OnyxAstNodeFun } } -void onyx_type_check(OnyxSemPassState* state, OnyxAstNodeFile* root_node) { - // TODO: This code is very ugly, but the types of globals need to - // be resolved before any function can use them +void onyx_type_check(OnyxSemPassState* state, OnyxProgram* program) { - OnyxAstNode* walker; - OnyxAstNodeFile* top_walker = root_node; - while (top_walker) { + bh_arr_each(OnyxAstNodeGlobal *, global, program->globals) + typecheck_global(state, *global); - walker = top_walker->contents; - while (walker) { - switch (walker->kind) { - case ONYX_AST_NODE_KIND_GLOBAL: - typecheck_global(state, &walker->as_global); - break; - - default: break; - } - - walker = walker->next; - } - - top_walker = top_walker->next; - } - - top_walker = root_node; - while (top_walker) { - - walker = top_walker->contents; - while (walker) { - switch (walker->kind) { - case ONYX_AST_NODE_KIND_FUNCDEF: - typecheck_function_defintion(state, &walker->as_funcdef); - break; - - default: break; - } - - walker = walker->next; - } - - top_walker = top_walker->next; - } + bh_arr_each(OnyxAstNodeFunction *, function, program->functions) + typecheck_function(state, *function); } diff --git a/src/onyxutils.c b/src/onyxutils.c index b40a44c0..20726026 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -17,17 +17,6 @@ void onyx_ast_print(OnyxAstNode* node, i32 indent) { bh_printf("(%d) %s ", node->flags, onyx_ast_node_kind_string(node->kind)); switch (node->kind) { - case ONYX_AST_NODE_KIND_PROGRAM: { - OnyxAstNodeFile* file_node = &node->as_file; - if (file_node->contents) - onyx_ast_print(file_node->contents, indent + 1); - - if (node->next) - onyx_ast_print(node->next, indent); - - break; - } - case ONYX_AST_NODE_KIND_USE: { OnyxAstNodeUse* use_node = &node->as_use; bh_printf("%b", use_node->filename->token, use_node->filename->length); @@ -38,10 +27,10 @@ void onyx_ast_print(OnyxAstNode* node, i32 indent) { break; } - case ONYX_AST_NODE_KIND_FUNCDEF: { + case ONYX_AST_NODE_KIND_FUNCTION: { if (node->token) bh_printf("(%b) ", node->token->token, node->token->length); - OnyxAstNodeFuncDef* fd = &node->as_funcdef; + OnyxAstNodeFunction* fd = &node->as_function; print_indent; bh_printf("Params "); @@ -151,7 +140,7 @@ void onyx_ast_print(OnyxAstNode* node, i32 indent) { case ONYX_AST_NODE_KIND_CALL: { OnyxAstNodeCall* call = &node->as_call; if (call->callee) { - if (call->callee->kind == ONYX_AST_NODE_KIND_FUNCDEF) { + if (call->callee->kind == ONYX_AST_NODE_KIND_FUNCTION) { bh_printf("function: %b", call->callee->token->token, call->callee->token->length); } else { onyx_ast_print(call->callee, indent + 1); diff --git a/src/onyxwasm.c b/src/onyxwasm.c index fd9690bf..206883f2 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -209,7 +209,7 @@ static WasmType onyx_type_to_wasm_type(OnyxTypeInfo* type) { return WASM_TYPE_VOID; } -static void compile_function_body(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNodeFuncDef* fd); +static void compile_function_body(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNodeFunction* fd); static void compile_block(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNodeBlock* block); static void compile_statement(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNode* stmt); static void compile_assign_lval(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNode* lval); @@ -222,7 +222,7 @@ static void compile_expression(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pco static void compile_cast(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNodeUnaryOp* cast); static void compile_return(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNode* ret); -static void compile_function_body(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNodeFuncDef* fd) { +static void compile_function_body(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, OnyxAstNodeFunction* fd) { if (fd->body == NULL) return; bh_arr(WasmInstruction) code = *pcode; @@ -639,7 +639,7 @@ static void compile_return(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, *pcode = code; } -static i32 generate_type_idx(OnyxWasmModule* mod, OnyxAstNodeFuncDef* fd) { +static i32 generate_type_idx(OnyxWasmModule* mod, OnyxAstNodeFunction* fd) { static char type_repr_buf[128]; char* t = type_repr_buf; @@ -681,7 +681,7 @@ static i32 generate_type_idx(OnyxWasmModule* mod, OnyxAstNodeFuncDef* fd) { return type_idx; } -static void compile_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* fd) { +static void compile_function(OnyxWasmModule* mod, OnyxAstNodeFunction* fd) { i32 type_idx = generate_type_idx(mod, fd); WasmFunc wasm_func = { @@ -786,8 +786,8 @@ static void compile_global_declaration(OnyxWasmModule* module, OnyxAstNodeGlobal } static void compile_foreign(OnyxWasmModule* module, OnyxAstNodeForeign* foreign) { - if (foreign->import->kind == ONYX_AST_NODE_KIND_FUNCDEF) { - i32 type_idx = generate_type_idx(module, &foreign->import->as_funcdef); + if (foreign->import->kind == ONYX_AST_NODE_KIND_FUNCTION) { + i32 type_idx = generate_type_idx(module, &foreign->import->as_function); WasmImport import = { .kind = WASM_FOREIGN_FUNCTION, @@ -861,88 +861,37 @@ OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc, OnyxMessages* msgs) { return module; } -void onyx_wasm_module_compile(OnyxWasmModule* module, OnyxAstNodeFile* program) { - OnyxAstNode* walker; - OnyxAstNodeFile* top_walker = program; - while (top_walker) { +void onyx_wasm_module_compile(OnyxWasmModule* module, OnyxProgram* program) { - walker = top_walker->contents; - while (walker) { - if (walker->kind == ONYX_AST_NODE_KIND_FOREIGN) { - if (walker->as_foreign.import->kind == ONYX_AST_NODE_KIND_FUNCDEF) - module->next_func_idx++; + // NOTE: First, introduce all indicies for globals and functions + bh_arr_each(OnyxAstNodeForeign *, foreign, program->foreigns) { + OnyxAstNodeKind import_kind = (*foreign)->import->kind; - if (walker->as_foreign.import->kind == ONYX_AST_NODE_KIND_GLOBAL) - module->next_global_idx++; - } - - walker = walker->next; + if (import_kind == ONYX_AST_NODE_KIND_FUNCTION) { + module->next_func_idx++; + bh_imap_put(&module->func_map, (u64) (*foreign)->import, module->next_import_func_idx++); } - - top_walker = top_walker->next; - } - - top_walker = program; - while (top_walker) { - - walker = top_walker->contents; - while (walker) { - if (walker->kind == ONYX_AST_NODE_KIND_FUNCDEF) { - i32 func_idx = module->next_func_idx++; - bh_imap_put(&module->func_map, (u64) walker, func_idx); - } - - if (walker->kind == ONYX_AST_NODE_KIND_GLOBAL) { - i32 global_idx = module->next_global_idx++; - bh_imap_put(&module->global_map, (u64) walker, global_idx); - } - - if (walker->kind == ONYX_AST_NODE_KIND_FOREIGN) { - OnyxAstNodeForeign* foreign = &walker->as_foreign; - - if (foreign->import->kind == ONYX_AST_NODE_KIND_FUNCDEF) { - i32 func_idx = module->next_import_func_idx++; - bh_imap_put(&module->func_map, (u64) foreign->import, func_idx); - } - - if (foreign->import->kind == ONYX_AST_NODE_KIND_GLOBAL) { - i32 global_idx = module->next_import_global_idx++; - bh_imap_put(&module->global_map, (u64) foreign->import, global_idx); - } - } - - walker = walker->next; + else if (import_kind == ONYX_AST_NODE_KIND_GLOBAL) { + module->next_global_idx++; + bh_imap_put(&module->global_map, (u64) (*foreign)->import, module->next_import_func_idx++); } - top_walker = top_walker->next; + compile_foreign(module, *foreign); } - top_walker = program; - while (top_walker) { + bh_arr_each(OnyxAstNodeFunction *, function, program->functions) + bh_imap_put(&module->func_map, (u64) *function, module->next_func_idx++); - walker = top_walker->contents; - while (walker) { - switch (walker->kind) { - case ONYX_AST_NODE_KIND_FUNCDEF: - compile_function_definition(module, &walker->as_funcdef); - break; + bh_arr_each(OnyxAstNodeGlobal *, global, program->globals) + bh_imap_put(&module->global_map, (u64) *global, module->next_global_idx++); - case ONYX_AST_NODE_KIND_GLOBAL: - compile_global_declaration(module, &walker->as_global); - break; - case ONYX_AST_NODE_KIND_FOREIGN: - compile_foreign(module, &walker->as_foreign); - break; + // NOTE: Then, compile everything + bh_arr_each(OnyxAstNodeFunction *, function, program->functions) + compile_function(module, *function); - default: break; - } - - walker = walker->next; - } - - top_walker = top_walker->next; - } + bh_arr_each(OnyxAstNodeGlobal *, global, program->globals) + compile_global_declaration(module, *global); } void onyx_wasm_module_free(OnyxWasmModule* module) { -- 2.25.1