From 5934f0abba875073942b929d323923d7a31808f5 Mon Sep 17 00:00:00 2001 From: yhirose Date: Fri, 1 Jul 2022 22:15:21 -0400 Subject: [PATCH] Resolve #228 --- CMakeLists.txt | 4 +- README.md | 30 +++++++++++ docs/native.wasm | Bin 423155 -> 431489 bytes example/CMakeLists.txt | 3 -- example/symbol_check.cc | 69 ------------------------- peglib.h | 77 +++++++++++++++++++++++++--- test/test2.cc | 109 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 213 insertions(+), 79 deletions(-) delete mode 100644 example/symbol_check.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index a4d4a61..ff0861b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,9 +19,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(add_link_deps Threads::Threads) endif() -add_subdirectory(example) add_subdirectory(lint) +add_subdirectory(example) +# add_subdirectory(cymbol) + if (${PEGLIB_BUILD_TESTS}) add_subdirectory(test) enable_testing() diff --git a/README.md b/README.md index f3e33de..ae4dfeb 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,9 @@ The PEG syntax is well described on page 2 in the [document](http://www.brynosau * `%recovery(` ... `)` (Error recovery operator) * `exp⇑label` or `exp^label` (Syntax sugar for `(exp / %recover(label))`) * `label { message "..." }` (Error message instruction) + * `{ no_ast_opt }` (No AST node optimazation instruction) + * `{ declare_symbol "..." }` (Declare symbol instruction) + * `{ check_symbol "..." }` (Check symbol instruction) 'End of Input' check will be done as default. In order to disable the check, please call `disable_eoi_check`. @@ -456,6 +459,33 @@ It internally calls `peg::AstOptimizer` to do the job. You can make your own AST See actual usages in the [AST calculator example](https://github.com/yhirose/cpp-peglib/blob/master/example/calc3.cc) and [PL/0 language example](https://github.com/yhirose/cpp-peglib/blob/master/pl0/pl0.cc). +Symbol Table +------------ + +Simple symbol table support is available with `declare_symbol` and `check_symbol` instructions. + +```peg +S <- (Decl / Ref)* +Decl <- 'decl' symbol(Name) +Ref <- 'ref' is_symbol(Name) +Name <- < [a-zA-Z]+ > +%whitespace <- [ \t\r\n]* + +# 'var_table' is a table name. +symbol(s) <- s { declare_symbol var_table } # Declare symbol instruction +is_symbol(s) <- s { check_symbol var_table } # Check symbol instruction +``` + +If we parse the following text with the above grammar, it will fail. + +``` +decl aaa +ref aaa +ref bbb +``` + +It is because the line 3 references undeclared 'bbb'. + Make a parser with parser combinators ------------------------------------- diff --git a/docs/native.wasm b/docs/native.wasm index 9cbaa0e450db947a5123883a3ffeda980cdac27f..dc1c4e8ee99cab87c6b5b8e800d44aac40c374af 100755 GIT binary patch delta 100969 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 $^k~gG5XlCr|v#?31&ghIK{7u2u5d3F1w2 zU9CLB7LS@OwX$%cI4(<7rN)cv@v2*+#|ziFlSOv<@-^K$*13v0w$w0&hS%u?#1cZ4b59V1FIcfFrDGRr@Zhffm6cmbDp% z{MCsfFAGOa)8NPI*uG5Hfh*N9Ve_(Xbv(S3uu$Z&YZnr>!yb4WYq9GYMg`phn@2HJ zKi`OAXlmA~`9=bfHsEd96!B}JqI>f4DdGfu+xYqvvBq@n=S~xg4I@MTaJa}bH!N1Y zGd9SJCX1Y$^^3c8Zq*I)Im%oku~g;5z?EjPl|=-GtSy?`8gxBDD8W#_k`g4qR0oJHG2y z$JYPIi;fZ@pnCI>m|7Si?>kELFLb0FJUlX%DEg;KZ+oYz(AX|(j>N!h?(A0I!~atC zc{k9&c;w6Y?8hqI@Qv=}hHn}JM~nN6tzIiCi3nOJv!9Zy(EyV?^GNy04-HOv=f2pGg3&|E3!}t9Ho~j}hUb#mp{; zz>H2+IK>1y)wt#uF_jtT$#;J(%8W6Mdwwl$FkBRpq5yTqIIpflLyIeoNoaXTw>CS! z@PPBSD_zhuo>(hKrknu%kS?d6018Q$@2(WN87<=y_^frjy!{06zxi>zp6(BhaYhci zFDX*MRguEx&$>0c?Nj;eiQ+NyP9|$k62tu{sz<%KT|RY^D6DF3SEvKh`V8b%F#y?W{N4^ReMbPnQ?OQOwr$w29M7aXM4AQ;<0yqBKw>yn*3Y0 zsy0l!`L)J>o-CRTuf${(rcD}76?y)af8cE@@VWgh`O2wcrZZV?(q#FF)5Mmf<(nX{ zHhE<7EHOR$aN;a6+?j_rX&(NjS>l@L%ktC3@YHQ@sCrGi{dEt$9w=9wE>7~UZ}->_ zx67|i7lWeT_dY{R&t1YG{C)OT#G*jwK|FFBSi0s6QEuEQ?>$4@6#ahMnc~z0V(`Wh z!-fwX(*ID6N_hQ;-Eg_;1HxskB8HZCl`1Nfm1l`udH4yU#B17c!9B8Vj3~~meK%1F zwZ1D?oh8PMh6b~je*i|JDRo3$;I_a}4q^UGD@JeuRe~psst-hiNeHcJ+I07Jx2f(G z?r7`Qy{%}o$bXys_1U6t6z2J7ixUs-EVdVB*h`A-N6Uhk>9b(HsQE(==DR3>jJbZm zW4FEw73Xx!v(kDkPxd}X6gazSoA$%~W%D_rSe|u`$nExHUH2ak?e6z zB3d^q(FP{jc>&D8%g+~M&2?|-k8xEWKm2Cm$H*>GAD=o$Txiz3DPNi+=F#=23&irw zRofCjUbT%rE;X){@4aXi$bJ`!EOXl%x&d5O17M|u-n73iTQ3xYTpl)vhwr#lER;(x z5`7&;hE+UDK6#Ni#LapE0leAB=8CV3n|49f=Lg)MBL|WrH%bs2T`lBuNM1vwW9ZA_%CRsUjEG?D}xA< zK5ayM2OCDGEVxokmwPS~ft1~qPKio+<&|PZWBujgBIk<}Qfm6^m#g|U;^lFMx$QLv zU9Sp~5}8?_ry9NpVtP1~$44=}N>7WN`zKLYa2e4iJuf$HmJEz1p8i+r>BHTnA0Vy$z%ag0Bml&K@V zNewFsbe~C2EPuP3@YwYa5+2t}d!eX`3Xe+{igSBw;n7*-3J+z0Vjc&1*pU7nTRS=I zny4Z<=o)ddt2`JfkDKs=;r>GE;(!VkAuLYSrV2E0O*11w=S;Oz1un3YuT(hJyN+2?d=p zXNi~^MZpGS9KcOW#DHkQua=0Jl@94LkS=wF1P>%G|;y4=1|%yO6klU)58@4XQ&aDsk}HGs(rIXsyTg`2Q(G ztHh*ew*f=BT(T-|aNb%aF5pXXa+j<;i~)bE#W;uc1`t_09Q z4bOE0sN?Sh&=DSUf)(|<;)x!feebi#2Zw2SoaLd|{0Z8(SG!Kf`QQ3k``-(m?bgta zr>UXcU;z?2K?Lg{a?DUF9$JxJC*;4SD4DD{%`!?AqDcrj zor*HGnHOJ1&a4%sj>$K#7O6#o%mD;jtB@>0#>fb!a?b=MjZv6`{!mCCNXVfB8c@G# z)gt=^(~@Y%A`7DRDTFYd!skx^OgIfn6q2FNf+&s-@-PUWDlm~sMZ8cQ!OU3d9Q*Zq zUc1LQD!{?uRBfNS#LSf1i9smSRh=DSp8lZr9$#m7A5R?iLp^TNMKbkk)rgbMkf}X_) zCskt}l&pVb+qkHyQl_0kO%ZlF#QIvn6T}OIw|sp;Hlmx3Y{6zh zQrpF9t{Wo(LkKOwKCxS$#t1y^7?<=rMwA8DU{a1S?p1R$;XKR_SxEMxG&jFpK06Z1 zR~S`iTX=(a(SjwEqu~$3>BK#P$4G7wX2c}SV}_K2{P0l z6viw7L>=J@`miXJOf9+pEYJcnEF)B?C=87n3+g8og>mc-{-sZ+9LFFULp3l|X?h>J z7%9HRLXWP2cUCQ5mjF?J{qcQMLS516wM6!Cs*A{}q0}(OCqN++ z^8f&q8mx(o%w(#qn1D&fyK?l*LceSe9a5<1g?d8$C=Rn~yL=9)16c@3cFPAlM^e^j zGLl2eE&U3U>K8*kV8E=T=|%Q)_yl!+u(PRnT2VL+AE&8e7+2htpASJ1#JUJLf92<6 zuo8d-i#R~yE;csmAqFFrJsX9?`w1+yYJnKC^I26T*EO&~!bMi#OE(2i>a< z%R%X;6=5{&sU+1>2_7sYBXok;9Gs>>bONVH9;rq#U$p}Q(J)8lDz5{0MxrHFGonEx z2qvr37gf6<;u)ka6@%H(1;!}J6>Y<1(nA=bqz&Da9UVYQPS625@JFnPJ>tATX}=$({LzuBIDQ(c1^M)I&~Qq)6^ncB`?xhDQ@zj z{tTQz#X!x(t2lr+nk0$jMMQbs0-i@nzJ6Lq;r_a8NB7mPwL`g;d@r zX-qpp%U#?bl)wk6`;gTI6_=x4Kms92Q?Ukh%a2@b@GLF^!5InU+=XX*WLd@dBrcT1 zNwsi;!N6=k$q7145%6P(f~)aK9uQd$O{m5h`M-!VP?ms7LPNT#$M# z6^-Ku%1#C$j_Z zI@)~&IVPlhDJS32YG_MihfEeQ0A289KUP6n0eA5JNDhOn)k6jSGEj#q+#kpwBi;$K zBK4Ml(y>Sh;HDa|-F6awuwA>6~c=f)c79BS;Ghvmlxr_6jSG z3>W~=PkC!8J%iwNJMPu}$7fFeaR=IV0l*WjI*0+_{y+erY!3h^(+TD2>`w3m;He_x z1ILdNcPO5)G*4gw$57oo#@lHgcNJrG^C(VFZu74Gjd6q8T}hp6qzqgl4se8w{Ku%A zW@Tbju#ovM9sy0lWW>UjC`luOUXe7tCz8%Y#=4(KRQHI8mfBUn$RF+$g(Y;%4_pI^ zMPVmC?k}bZMVjivCR(Fq+R>s!9&?u%YVH~(XDt?o$mY95lJhWJ?zu~NGZx|GJMF)w z;z9wLJJyLBO9kc81&=>X{X8=9tC7;aTZ}BBul)LpRm0scu2arg!#F)jL^FJH)H*St z&yKMP0qo{+iC&pswZBT%twRi}{%(<$*=J=LyGff+5o)E_L3s-ZS_(lHe9?|>o#ogz3TMz1j zk$Z(95cvaDknG~{)Ec<<+ptpwWym2_Iyg}_-y;emHHONAV2g02<}TBhS^9$H73#_a z{e+!D$nFnFOu4+k-V`$b|U? z;~JCcS?0*Fhny$_92i0|&?!yt=g5-vB5h0s{2vdj5votQKOWqAlqsUBz~{5V^b%`u zbuF|QS5@=>6m~9fRaNN%-{-(yJ`O4>zEMF@Nf8lH@sUEl@clp&O$CIbUO);eK_ow$N=V)>PC=7uMt#J;FL z(|pB9{;q@s+4@>otz|rG!{QElmEqxQf}A+H@=)FyDwiIam7!uL*BxI64>g}dN%7^7 z+Tt2MIz^lR;+rpKhja>cJe<`Rci8<}o(YNO+Tu&deZ6NLJtEwrZ`^68gl!J-B{Wud2 zUhC{g-faf1k~O`8t`g_Ky-GI5*Ky4Y9=S@C>~nmlDrdZCU-5WXdn%_LWL4w`*sET) zwP#snn=1PoujjCC@F)9`&aZf!+r0Z_z@YC1F7xn95{v(GTEFrqdr^bigAYrheA8v+ zD!=yGb4aS0_t6ZooVxY;qg{4XZ~hxDxe_e-%NXV=i;~kIW8sXA^K$Rn*sSSkIuJUH z4(OM5+jmFHr5pZONLypGfF`*lxVZRl#^hG7!e7&GBzniJc%!*|n6b~7_DFO2FvGUe z_BQsl#g-etxs0u}Emyp0JAUzo_e!%y^07Hr4kwylbcGKw6T{0@5gNY6>+_}j+d38q z(>A6|QS`YjnTuUt-D9_CRL7By-fO3L?$R^%+INt=x7Qxl_$kjd*P-D<^yz(eeCQDR zp~IhJ-M@REJ+@~DXC@tqGbdI$>XGmQAD))WOmYGbc<>C-ji0kml88U&C_#^|;1{cR z=?xY3K7P15biX~6X;*$VK8TZ>U6_2Uh$Y^P_Zb=Q;nAV8g%MTf z#RMxOy9U=)pGrGE;I^QWAK(tr4_4akRyfrXiwpp>C@flDmEy-(ZuwQJ+%GUmZTRDC zt69K(PHT>TM@t-VzvUs5O*~7B2~+eWgG6e8UT zt?kZ{7i@o@A-)Dy+RL57U*$p~_s6CtXLc1Qd(>HP+(Tc8WmP6s%Xg3XOj7L~#aWw^t;wzgRwOe|^ zix-#qOS5_oE?AURR(z|!sIt?$_MbeSi~94w*tayxud=KiJa%nAXc5!cCqJ;e=>^B^ z*e;@qCZ{qyXrH??C9yDzdcAls)c3EK<5^i3A12)Qi*?FN``;o zVt-Mtf4GS$9KAqH8_3T_FAK6k+Q@NYTJ@eCGfUb?M<)=|Ve)g($%Q=dgK498!eoDm zzpS9Fpty)Z7Q2d|c2Zhe)?9SwK|V-31x`CRyl=-ui~hx+c1qBnkIt=72n%%4`*tfc zwPsQk2>)D5z2dk%K)?IG9oJoaY^E|0YZzlwitQpOgT)|H(n_y6fl=3K}Nk?Mm<))c--!0Mm-;$z=$QZv8=V|+y}pfb=rHv&bUb~unVYFlO87( z@q+YQ(pb#6K+}#V`abs^ECyF$*jT)#M+ceiLYrCO1oy6HIGMsSdPewX>{8seTN82U~QL z5AAm5(mRJ*;7k^x_Bho~z>^>zx9SNW+9Qp}SgHda&yfE;)qjBhf^E9;Lwk&g|Myf$ z{2NF`g5y6W8M65&-HRgV04`PME!AN z)l&C7ZFgxe^$j~(R@5t&b)Gtr*p7VfW3X?vM^7Aq-b-mJR_{D*ckdv|_o6I4PbU@e zz#a^a4bk77womsHo$@G0r#q>L(TOryV|y&f_5j-gK0MV8KeoFmF+Lxq`+aQxAyFFf zM>|IU>>x6z`~W+1K4$dY7p9wDunTnACw4E>?enfu9)o@eKQHU3FYJyoHqrXV#_9%L z)JQedJwCN3Mo7CoQIkY z32(s>cpKi?bk=^Wp?Ext)$tDcOjk8qCw*oQGSMBtg~-^hj;lZGqQ4W}e|=^jHb!f@ z)EfQub9<0!KNDq<^W7YyzmY!4AOQA zMN+#Hq;C9`-TB&lY^a-mX^%F`K-mo@CZo9n&2PwEgi9b1eJjgAH~sXNc9gk!9D1-Q4xp*baGi%b0(xy2>5x5abV2G)T>Y+It=3R;7VVjGXH z8md@q&f8Hlq_J3(0*!4Y-xkGo5DD$UG}g~;Yq-;+4d?|L3Fk)J0lkh81=0vl`=&8^nV6y}|hHqW64lM-LW*5|jeL zpCjKL#U2m`J;4N@GTEP7yu@F6yR!>BZW@s(I!kx#s2b}#F4##eWu9K9Mr2(t=VFTY z=$kL|g}sv4#w#aj~-AHa7w__WXW%+uYPNfHlDK+jpvMi*bl_ZYI-}iBA8lx zq9o@m(D&}(cTw(^*cgmf4MqhSn;g>f)mM>kR( z_2$cVwRsHT^B1$G<|SL!us*uzJ9~-gV`iVA6EgLC_k6%%1&i`N!GADE?b|PV1!~036dGwMib?o1(u_u_RH!Q_Dp`yMV^(=zV zh8&QoH^-gQB|o}TIvJ(F)VoYR7sWjA!(6@pNBqigJx7%c^;S|5FUS;^^gLzWP-n3$ z|H+LxVt}aOd!Q5ZJdb|KfgY6%g zq?{qI8sZH3_>8iotgOW3lAMClQNs#`6$~G49xXSfntA`o*XlNNHY@Nbl75rp`Ccwh z73^6z^(tpJtW2wo?66lkvtbH$BIkxW_Uk?R`+9Zk_lCIkQK($&S*UA&nL?3rRzVpV z?a`YW)UlsryY^MXYVGSQ*M1{*BC#VK`zN_teRb?FDc3%GM6Lbyddj)iCu1jaINh;- zikY?@o`z@OS=a$PVV7KYF|uf7>Idt)UgaS>(5v(YZdAu86v-d$c-_sYG^!I-?}o1Z z)=|dZtZ?@;s`~4OYM|MMEX7zPY^>v?k`NBS3-BWR4;+M-;80L#@A=dO^K3b6jJUSa zwr%$KE+px}lT?(R5~j8o@9B6ISvStzx8bDc6$ZH?O` zWSQx;nQD>h@s{;EmWR1enmHXGt>-pYbIm4jEwyr|2_roS*EWIdT$-q+W?~+tTqK;A z6EZRQNny)~Iz#ww6L$#HC)A#T@^JSQM9NDIWX~kW{y3LRi#qlTo4WSrPz{{I*k-Q% zLF_~(W;pg|xG-APv2WVkwJ)DsYk#=8Yd;e^k&9Ct`*Tcz)`&K|Te@BkPp$RZpp_bEMs*9`L=rL` zuQeWhN4q*vecQ^l&!1Ln|8#5Deh_vdN2fdXmRGlJkNw7u>JI%-8#Ugn`}L`nM<9`u z8SL^{m>WPtkageZm90z{-J`8)-$^Dy4F-XAe=7!IC^mw|(8R0fw^f79!at9?YV>E4 zico!R;onS|v+!r>p6%RGta25n%yi-n$AV7`tY*+0BA^AdgjV{&j_OX`GSVG@b+^Y*uV^cWW;!`=ccF+lA zY&x5<>879Rz%J@6FW<~FdK8+00oqPJ2JJ4;6}suiJ1FN#VFOjplY-fXrI{vCQ&AiM9$|p4imh3T{k8{ zacLS!!I=QCRb81b;cgEBg9L?q7d zn5KI5k?xq5#ki(#CZX-PG2(LEF$F-P{Y}n5&$h??jdE)rE0^3*vMv9f*%r>CP5(o{4W| zta{80V;LqQ_2)aL6TLbt-Z8yh|E9aDr{B53HBBurrcvEp(+EsNw%_WQW_tCGUIEh% zahMkMa81vk%DJfOp&oN)112Kr3mnsI&Uy~afn3M~Kg@-BG8>lbLp^cWxTouIWubAH z-P3hA1xF(1iX4ae7#6^MxD^Uv0Te;8<8XE_9PWyD9Y$ezyu+qmuD{D1ijse1hw*s@Md$HNkbb5l14irH;d;7~T$dz%p14cfxOAg>mRf z(#&{gan4?7yfO4yo<92HVN8jwKiQqlSSI69pOd^r_DqAhO*kl;UWg>P`n== zfc3Be9)yQr1P)}&lL$$W3=dPj5gvg}zz*8dq?_SUcnk(p_B+xokVf7-1STfvKPIX+ zX0vgWh64}eYnJHx$*RMO>ov9w2Y-bBhNnOp+fMp4JOj^yG`53uCtPc+ci(F-0n7(K z{!+8`liNrBlG?T-ZgXB+@AC4-dN&UCz+Tt~&%yPAs-S#7JP(y1K^-7{0bYdv0SW3L z=}S->RPxw@qFb*8wuq1t6hiRchUFGCf);?PfJ!E%~@ZE+rWSiT54H;qxv|UfDhn9I0+xY_4<5@^3!kzJ_hOY zC#0XkS@;a3&!3Zi0kwTj(cdMj7AA-&8V&?;g#0-a{|;ZmS8yJ_h6^A;d_x*M^)7OJ z3BHAYfCO=w^gH+-egFxghV)0M4Wf@;+ebAuFS#m$f*5u?FQicX8Log_Fu&*teN{$` zoS4g~2JWM4Q2iB^t6+t2p8#FbSG8^JoWy+U120at-62=FK69gL*{~jZ^`SwC_MGMI zK}J8d+br-0F>r2sQ93R~ZAwg~#XVSxoL|oV2P^pqGz=O+V`u{5z!zq$X2xS@eRZJ9 z)pzt)hs`_8JF%45H!tJFke{fV_E(Ym=m3?bD+Z|9=FP>;ce0gug@Hmrq=I9*lX{~n z*1sF5nlzSJj+#P(T%lK{s+Nsg(`FlJ3+19XHah=xwk8DiWXtr(&v>w>{*obeowrRmX1R=8E0Qq}CfY&I+jv5+c} z&8r>fU2xJBxWGQ4>Mke76w;_QdPAC;ZJZ|KOk~I1&YIsBWB!bnl>+@?01SjdaHDZLL}%Tk zo;5SI8sos`FZLd$HcCSv6*}WIO}{);O*4HthX3scb<{95z-&K~?~(1ti%~L2OYgDL zsvhwA-d6`YvQW8fe3@nZWj$cH8r`fKty}KJBjSNQ9rcCbOqzYeRd-Wa@h_E*QCPXL z2{LN0=Z#Q36UAeGok~Y>eD4JRfy zolIxyuXQT(1CWsO_8AW#`~pN>y= z-KO7X+H8^+s4Th9O56H~UY)K+crQJo-%M9s8$P?q>+^(JX_cGwPwA>{!_VY6+)BH& zNp~2<@spb4W>(s>THiEEbsqW&$Bo-E5^dYczX;!hcz82P5mwrhq%B%Wq4}plgk&xL zrS5IfX=$aM*sQmYQgJ=DJ?iy&hlTLv4Knqwy22k(f6VJ!-#q1hUYBD#oOv=rUmc}d zjgadnhT^zCPZcZU5NNh9F&wQnF=4f?~ zXT`P+ylKQ}G>n0AU1egeuU@~OD6qpJ(Lw#u-If;*H9A`oe@e5Kmo#PoWc0Ef5 zggWY0%!5o(%4ddfqrQT&AceCioDIuS-T+~)!9nV>D9;9QA`M7c4##ugGRK0H<#L<{ zJFrjZcqWv<8aPH-6^KMV#BMi)jnG__13jNdJ|BX6Ucj;Rd_G9eZ`IAmsb1zvO`((N z8}-<6s;`;cB^z}4IF)EFvmMll$TgU^K_5ZKFIUp#I_2Dc2t3fw;DHSEDR>~SGl2g( zetO<`mDE<6T1S@&*z$t7ku>H(T`^vbHn;GT)XVu#rCcQMVOC)b7C;KeGR#s|#BniH zaV$t#3C9aXk73*b$KgE4XWtP}O@0q#!&peAN<>Z(r*efkmw`s4FmNsdjYwJGT&5b+ zx)Uv+7d$@VPb6r9S%(Q&2%cZ#GxU`SYD9rt4Uq&ZZ3S#wZ{&f4jxBJC9mWhp<_*)%2^#d7dj7r_itzb{(=?rCid{q_HPTa!B#0M(BnWCuP4y2CS6A=BA1P{Eop_D zO8LZRoOll5<9@w%mg=SV%v5nx#Ya4K;v8pUv}~Oyw=q%ec7bpDMgDHl*ld4w2HDcoQ&b1r}dY!Ra+Bira2Z@+yZFyeMaPO?&usRJpmtp z$Ytt3B!3cQ^ge=9a2iB5>~u!=498OcF?<4_!ddtXK8G*hT!_`s`a78~;VXTAmbxuh zCdbYAkTaP|Dk8Ut5;rg9SFY3Xr91gEHXnL@Z+h}}IT4)4sYLKKT!3%jB3#nGIjWsr zovmhOh___)MgF;!i*Ad-!#j2tKNk7O>pSHcyW44{29MIpkMI-xtlyo(OiIsDWmBXt z&CoM32elGMnTV7haLa>RN#4yWcFOBJHdX8wM(Q;A|0=jnLpP@_|3&Zubjn6)Ie>Bm~jXsjJJ#>JM5CzfD3FKaCq2HN& z40M66&`tm1SIu<0T)ryPGfzz$F0s8wBNE64X$-kuAT>dOY{PMPob>=1#yI^(p31sW zT-{BTxJo4zkv;?#vn^8QZsKB|<4Fngc-KWQ?f0uOQ^oY;e=t3OsVq1Nu4!-5L`Z^U z=mUMBAEZEky=op)C~~ff8Z9Ai#$MW4PAU={;vUN6SR}5(X=eaFq?ZFp2f>XnI8@J` z$9JjL%u^A1&s`WX$iMTr)%7^c^*Ee#1dN1q7zLwY42*?w5_#Jh3By^zB;qyy z!GFYlC*twgO2iXLC&DC{3>h#5rozoIP5gH>t9;FWaDBjaor#&ao=!SLpO~j|hsc<2 zqFN%HNGeii1om5LC%@u4@yvYQiSHKI$xPB&dRe~89V|`;P%Ta_U&qOm=dH9=UweIz zdMX_svt1uqq}lrA0@Xq%7O3$inp3W$&7>m1(bV8*+Xabco9ijZ^)!bxS3Knom1tH| zEzt}j6$y5-rIK&dedG1LP(Sj36HcD%#7{aG=4t2P&K0suqXTUsvPx?ec_~g{OlOwVJ*9OTX&SSMstu zDa6|XD1yLKTXI&`qI|yUo|lzdytv40Xw2f2cTm?WR-L-a5R|(+8(9_clUDts*Oz#n z!bTJn=h0ZrV?JX|Z}o9s8NFZs2?*Tv(!F&4WzMOH7ql^%EsL z2#ZndAvVT`^gDs$Oy~I5z;QXp%Ma=Jg{r&JKj75QS*Q}t+m7?5o?wtdUQUz}(;_H? z#jr%buu%0dH|JqgN20z2)dccOVOWuqUqgP5TfTvOuAARNKHtr6C!gcyE66W$^Ht=_ z-24&p1#bR0`T0(Mg>{yLLbu`~`2}wN3i+jOzJ3)S8o2og@^jsM6!|M`Sap+%MLm zcOQsEy~IAMA>oQaJ^o|1eML}?gR)BHVGV{ zqoM=_MLONi7-PP6A z)z#G}W0o}h`9NrSTcOPl%yTXfjYC9a>bhb2l1#D!0nHHg5(B!fo6c}iKN?6*_6t*x zZV>qbBA^SOXexa5$P|IZfRV&GB2b^|lMp_D%>)PtBTy%x2Ph%IFibp6B2mk%m6D<- z2vnyhBmi3kjKn0M=wxa>VKzv_|3+Q1&Ot>Y!N&zDr-Pwus7e^Zp9ln>5eNi8!$-o` zAm9rcfg~XklXM+fXo-#&_)kkF!|AMDVxYl7I7M1UR1-q4m1qP5!r)vq+tBqu_IW_i zjl?pAN}M1_@z%vPSz+nnKV@8OZI7+nP8$Dx=#Tn`j=q(@Lw?K z7is>ql$2;nia#YK+2`l~l1V*$TBu=dtu|>I00BtzYwipF&1JYao<6^6X!zepAgUT? z_)^`zBJH*j97d^BE`Z?_VV#@FLjrDNK%A%a7S1}orE^?AKaeO$`0>KI&^X_jYlNIC zJyHG4HlhiddWZK;BeOx&2cUj-N-YctQ7{l%O8I`qa}mFF?I~PX_2> z-xC4q?JEh;B|aHQIGI8|J4(TVgtEX?(+Rw1{_OA3W1coSFe$Lh-(!})(Eqfy*<5F? zHeWWUn8%Hy#t+6m<6C35@xJkn@wic7oX}6|zv$hL>Y*zAd;L3or~bZPsaNQsxAc{I zx6o_)a{Wbpf&Ppxk(!}T)+gwvwEfynty}1G?IZ17ZB`T1JeRi15*M;fr&^>2#gOD2F3-( z2F4&&5IF5Wfh@B#Q!k}Zt-vSf8^if4}Iw0h*ul@ANb$*SNh+>t9SkD{p`9n+nOZG28F>XZk}k z{Kfugc4)f)asM=QcB+30-c9yT@)!9-6a5pA81EnFAL|c|@fRR*+B{{RG*6g+nB79h z&EL&q=5J=`SMwJ$J9O0i+5E{29Wkqr_|g2q{N4;5HV+|j&^%!7H$&f<`;hq7+-rVg zhW41dk=SMKG`}{Zp&jOSq`or0G`}!I+sx0A_{{v&+-inCF+WCPi}{hc$qapHZbV{( z`GNVq8LBkjMPj|V)_lhdtuZT*c-wr-TxEvdG~YmCrCDyq%pRfF&DW4xVV0S%nxR+B zO&^sF%-eJM5O8P6C! zLQflWk$TE_(s%-?57k$XpY$Vo=tn*DgZ?ZX*4rJ@59$Z> zAw%}-`}A-1DzO(o-_VcZ8-0(yhYpC{`YwGXeNA8M+w~p#S9&>pqHond)<2KxpXs0K zG5U(O=$rMA^iBGgv{!tnZ`8k_4f+Rq{p{bh-?a7GT5XN?w)U3xhE}eZRcSwh&=1=8+F>p9q&^mps{*E46qra`M)>rA3 zqEfu6zoD1wG5vKtv_db_U)5jH*NEsE@v^>5e@S1eFVRDb^+oy%`t$li{W<+veZC$l z)#vF?>vQ#|^e6Qv^b!z$OU%({>$7x6pQ#t??`iL7tF`6YQf;O78oKb7n65vrPt&LB zQ}jvtI;}!`Q(LAj)?!+j_CC!LMLPeUsE1ynm*~3du3HfmLxv5jPN~FFTFS4={+bxC z7wVyL`dB?QMlaAqr?rz>=vi?>Ylq)|XzhADuPqCNUeI2~x|N;%QXsT6P#RbeSP}@$ z4=fBU4uqZ!JRewu5_tbiV2qe1o(`l;6Jzi%^i&{m(vS7$IajAVlDgou$PvCi$rSd5 zDKFb+FFGxpeJPQKt4@o&-VMVdtmTNL2=&&x+p|s!{&6C;UddiJM$3!nKn-hn71qPl z4lpH?U4l~hagNp+txsdj3ae+8P2A7?{q%gk~I{Psl%Jf+%6z9g7wmgx(IDR?wV1f3zf zE{JVR#AK&Rr(;^nD6^wLgcV!%gS74I1d%j{Ppfn6- z4_|xD7Z&^oyJd1zN<88|3KgBsG!;)SR7~Oa4ESby8AWIar>Aj)sFQEDuyd>i5e<22 zM2j1@6G<4^1rg`MP}4yRympu3$>TTIMc0;l&vJfWP*4Dw7ZqH_&w}Af0AtumdF@1r zS9p<#)lMOcNIKu|?IZJR(KBW9(=Q&)3kkqCx`bJg3GM?nOU2UuJKiEoDn1=TeL3v>=LGc};x5WC&}R!en){ zo~Gc3g0!f8v`}m1^I_zx3THNH9R0AqJw1YP_Kmhr<3In1bn8Iurwwfb*U8en> zWfvyebAuN7f)la1iZ=Gy;rs|S;SoV^lkhm?+;;vT{jh1h=)88mq>IW1TyPChsk89H zF620SE?i18%ci$`nW)(5)}a+mFT1+~uqp(LioL3_UE0KIlk5XwD?j1~VLc4Jxm-k& zAO-CJi0<)!{Gwb$On$C%Hg&9@R4$+a!YX5hQ`K=?>MHJJ(AI&8`Jsms+KCm;#7@^H zx_z?7lh3)Sb3;e#JUCD;Y&{?4oEti~pz+Rx&Yftwv!-)Pjg@#+=Z?)-jYU`-*8yO) z1L+7ve4efkoAzU2asLR%?pojZcb8U5o6qi2nE4kpH1`ae)4uBs5v3pvPfKTOA_`)t zXmrF^ts+-+?Ucrvn->mNtYMa-q$EftT4!E#Cu`z+FB+{B^S+D5Xq=tbZ3eQ-PIfbi zUmNz7s!>DiCaTytJHIU`aZkhm%tu#oqk0Hm*pFegtwG4<%2cgt;c!X^)^jfCQ7;K8 zr4E&rzp6)@Yr1o{96a5$i7aC5PS@sIP=z~;`T9#;RuV|iYo*ii*w%Z-p1(bz9TH?IlvwiYe zw4LN$>GYV>qE{Hd`}b-tj*fNi?{y9mrM*J<{bsLonxPu53Z!ivi!)XuVV`2n)(^T& zSdV36s#uRXi5KT|L1VoJhfQ})w<{H9*vDK1taM1wmH2prb+^IyTzpQ{wMQa88uP|86}f2EZ%-cCWk#u|_E^Zl~S zUwg`xhu`f-nEKUhKL*as%N9I1sh3Om^m!r7tjHE;3>o_KEM3z-&FR#4 zZde&J24oD=P|28E(6xAYYW~`HqV^9=+t9ClyX|AO<^pzr1=+#CDL7yw7wG_$+24)p zuCY#s{&)R1ZCv5D4--A!KJn-F%^vVgW3-Rk?hE?|BrA49##k+I^%w>I!IW;P?LR4; z4+e&rVTT8%Db3>_^zMJtkn^0Z!DG|USbpIIw;iI|;9E8L-A2lI_VGBgU5!QlLYKt6FiJ zS^r>>hx3nzmh9!N%er0>A*br97FjFk;$U51^U4nLNvNSV`5FcTP%UWKOA?OdM z&vmn%^R8|{9i6^czo}ulmXFLAAwO2~P7TAR)8YCK*>6%d6bYCXqWgYrJOlcfq*~I?vsB2NgMq zH{D3<%ZA=`k}a4!Zn+Y_-@N6)ls@4^J2ww{K!k(VqfXCT=itScw=UxsXcTV`67pff z$lFFSV(|9SDHRTyKO1X3_-Os?OuPNu#z@)~b2ux2EcH6y7WZWvP;~~Igaxz9zPkN3 zLsU3Ux4eJ1bvc#|Ey_H^-hz3^d_zNceMrYpf-80u%~JW!r+J@KXXmB-TkEt3JMG+j z3;^Z|*Ehfk4|^Cd=MKA=x;T4=^{dmNMiG;X40O8P{cpTnc=vF6)2V+?bNudpPrbT- zKXMJ6=si2p*_-eEk!)ws@Dk5}WCK6j@91ZK%Tk^6L(ZIQL*2DiYT;aL@;SsfWW0PW9GqK2fg66zE{*J&X z>@;}W;nbaU7dAC!kwH$=3H?M>6KCXvX;eIO;_oTDltEkMw^vy(Xr18X<{*CIH zA-253ux2{Z$+i=nG|j1)JgnZ<<~)bF<2I%;cU`ldbL=S(mrZ+p1(hv(w1^rtLIJn` zkR9uORt7mj2S8T+VA+#XuNJA3Aw^-GmrblvR+cij9esM6%*n*os}7k;8U{lXR^r7_ zH7Ly#COel+Z<#zXi*4{FetSo1A{~tg)`%ZJ@(W z?yOlgWe9Vtdfx)5(Ahal?OTq`Qu~(7*_VmEO`Q?58&U~2E2&QD>~Cvsd;TJ|rE}s^ ztMKg+?d11a)b9V(Brzqq?D}0zHF&d}f^T~K|6BdP-RggLZU#}*)-64P4XER-bt|AV z{k+y)ikB>I0c$a33pplLOLZE}>r9KB>*n1@14e14# zf^tN%XdzcOCVz&v2F?({)kFsG5wVpsc#mjpabl%Is7TftM-7~F=O1%BJE@cN#j!45KQZvc9ef|~c2VvS_oDC)Hm^juO6fsdyvk%JXtyC{` z0ERF2-Ovn}t0o?Lp4B#@SxaX=+s~Qx+*`ECxqQLHqIA9U(Sj^~R4r(4Y*foq%Y|!c zi&M35*|pJIb>+Tl;A|PU+4*wH<#dPB zYU;m~WulCZvYX2Klj!bql3qKHra9eS8)ufT7xo+LoyylnVQ=5%^~>sXAZ)hbC7R<- z1!!8Q^{A#Z-$)c2Ta+ce(UdSUv4Q|jb)8pN&92!Iojbzys8!Hfz-!=ACuMd0U|n7& zAi#w}l zDOo?O?B~kf%W zz36EO8;mHACGjPxQe~@5d!q;Q<_$JmIl)$iuhn`4He(v|r=rBuQ{grE>6<>hvEDE29r8BOVLxvRc?Z^g(|Jws zbTO?L}o+vv>MG*;~(Amhpd<23oGcYF^CPa5wb*|{J0`^!^XDcf22 zQHJuhto!H@_Yk0(CX7ekk%j{`4gqf6ypDcxnr$ggvf=y2CcQs|YlZX9mU9(NPOA497Cc}*?^BP zB7gBIpIvgwS2pvL1m)*@dh2@j{r>B-JM~EQrf5~%Q>o|K2OC*aVJz6YP6)e}bNI`V z)XBN|t3LSs;#cP-RaDQ>3U`i{o&M^yMtNnYcYcpaTK4_k3#h@KBz7YjK6cR06lgDI z9$RP~_Km^JePdr1et)^|incZPQy2%UCH5eT3`*pMq?oWVL63#Kc^-tK1Ay)G9BY3) zv1^`l&i<_CyD)w|*n2d*y|}byu~l5&2TSn?JcbY{=idFJDc{+<|7uuIoe$Ww+j;cB z6|~FQa-hRdwwK`Kg}nrm3NF+pED#tlt&?v$Z$^YYo!G9*Zy1D?4@ZbUoX7?p^ge3X z#|5^{Q-ZJD63jTy7Tc?`RZF-LBMyf8J_~^tb_bSafey0U9AtcU^*Ag#GY()F4@0m4 z3h*+Wa|usjhCap`?EHABdGdRLC({M zE>3wegYCa=1#x~n8C zN95K{z)n*O8`iY4TYsEKwYPY16yo zm_91I`)7nxO&#ZqKf224@#`^hxYX(L+mtRIL;tKv&M*}2wz&3C%yc*7Rt%PRS@&NA zUDU|)Dr*oRrEslp`CNn#D!@{IXQM;dV~$~JVteY`emq+C!ylC-3JRU_lY6jtf9lj2>R8t3 z^kmGs*^B5T-o#!Y8mZCmvY|oWHJF4*Gc*B{n(WiQ0m&rPF4Q@G{L2v3njL}&*-^u$ zAoLwN!$%f0$E2oY%Vs7u1DydT-52>oBol;`yKC5$#7pmHAOD8tz(DEN@3Flm-9t$S ztEccmcM2ykL)ePZ*_&$JC?7GP5pa$%=Y7>Qn`DS)cuO7MJbsmS`xu*Q1Q4 z@Me%bEn+ok$Wu?pB!tB}@hr5*BQ?+-26o^2w1N)H)AgxD`V(nd@^-|fRck?c{U0JL zcA-V*3H|59GpB=Bxn_iW3YPH<4nx3nwKB5Ww5qBZQxz*~K&Mz=%CZnOk@XwVFwZhF z*fN4JRquk>GLla>B4rxA-iUY~Bg5&`PS(k!bnJ#?n@pH83wS#uhh)vK=1(!)~ePKkrv%MVRU)u4}_;NVCgx<&H27N_5Y6CgXfZCf5-c$h>U2 z&#U+U1K&c&vzzOA7M_cH7H*f9G^MM=_HX4gO{t~-2r1(@wxuaON7kw^1f*r2k|y0Q z%an!ZUt*~*k>=;6WfwQH_!!h5NHT7$q|EK58klWhO-FWoQrE_UrY-BDO)Ecupm?JDG7_NwI`bFyS3Z5?4$%#5#zxyI&$#7e0 z)^HJYybr!ZKJx`iCtn4goGzEg+oFfIyzV@jNp|e;c@$Lr{r!CUkRFg*5~!v8`2xCt zX2_fisX29&mtTk`zd-W-3n`O2#^zi|I~B(L?WtQrclahS`>lDgx7*WTN?CD|7Ze<@ z+iO#;^|Db%>LZGe%Ap;p)zy<#vvthY;!SMcT9esNhLvm+tXXRj1=ak;>wPYGIq4am6eDSR21aG=9_F^Y$1AQrvcgE&)>Nwe`3pKf6 zsyd_Pkx61J*gY2VGRaED;c(DKQssktO55A-Cfe|2PDFeLe#jP9s&xtn7Wjdek2UKG zfGy<9ZA3jWMaXyCh}I4MWU{+z*IFclxuS`v_(`_S74^W^OL9f7EbT%gSxuyNrLJK4 z%;oiJq?)#3fY^Z>Y1;~So2_0{xcO9rJ+4*y4U++ z0ABAI^m@ zxs+eC0kEiMxut3lRNk@YdHQnQJW!0u?$g#*G}m4cM_CTQ>koq-X$FfoRQHFI?7`>$ ztOBfPmILrG8T2q2T(GekQzbpjb#csS#TirvJyZsFxvj69u2~!&p&HKlOFbG}0jt_K z1Mq5R&?CWM`G?iDb8>};xgD^=+%`R0jk@g&DuYWmRikopm4~`Fj=BqgS1E&DrTYOc z+ve*`*d_riu2e)0qYIISsso(M4kTvZ3BXa+j$?p4Vhno33W~KJ%dn5BF!&gpUzEG_ zii)f0aW1>7lz0_;-6{d#kz>#!$6(>d)xF~6u5nQpbpaBpC8Yp7R0cg%29JGGjmpXW zo?tEotS}b=@Gu$lFd5vaqHI+6ImrezH+KbKpE`wJ4#-1g&_iW##pl(Pa`Kpmx(cwW zv>bqk$)JbH;MASfn4ByvbSqs4SYcKG0H&&+VGotT(p}Z4oLuCgZUn4QD*SwrUPcC0fQQMThsj{+UblW$37oF|q`StT3wpc$f@& zm<;aUSB;4z^uLFCB940O3@U>jY604~xk{mO?ul&*aGCb z)y-hkLuI(|Ks72S_j{YBVqu9OflVfi7o5prMb_D* za7)9auwhJaX*|vOhrSpQ(>G22Y1F5cGd46E${oUL9lV9S>5F^TsTOv_e8<{bPb_e2F zF=H@w6ZD|G_;PH@UshB={-eub7`nAIyfmDs+?vYt%Mnd*>hIRM>~Bf~>5nVuh78s& z-Z^@?0<+lPsy3_#<;W|kJsp&bucXoFR@PNi2(+87#vWkvRTQ8_HL^z206Fw_%9YwR z)H`Ld2wQ4fVok&?FbFK@mB?0EA!{JQTtYIIhySFfY1+!DF6!}W9*-7TNJ9wU2qI}t#@7ot1i zLCLpX5ZPMTvhJ2`Z=e@Z=Bpbhqz`~kMy|ezTDIi22Ecmw-mqIiGlD8d#rp+#Xv1|b zPR4;|I0YmI523au;hocy-pw6=YO>{4CR^0?2L}xkTX37Jh?KfkbFOdyz zq3xy z`WN5 z1iQI#WBFnp)ut};%{*$AhNugSTa!PJTbDWcbS+3+myba0E^=Q!^^{-TOfBRU!zk6f zgmKbj7IsaztqJu+b}Q>`xqBEKGYe$G-MCfss(k+*>W)X^y_7C*y@&3kGB>M?vpUi= z`NAk_6B~6e-arq0HJn-*%g7MjW!n+dDAr;GeMdMEtuu;d(exO~I$W&tebhpKkV{Rw z52YsD2c4K&O4)uiVzYAH!PzhJta)=@68V^(^Y5qANmGd#XKzD(dpY7gaTC2KH@_zu z)VjpYWn8@LEZaUv*EgS@!v3m&^_jr7lQqXbIgI6s2kF8jcpXtDJBd$KF&iD{nm#`g^|hP zhpE?J&>Ll(g}jY*!apE4llMGAUC;5_YH|bA%7=N%0YM1Z$gw^J7lk?;l5-!Ww1A#u zsOSgz(<3zQ{|Ra%)#Fu<;=ElT%sR#WLtI^;|wq_MS{l&E2)(!+%qbm`qK~?->3}J~f##E-I>T zeMZXJN6<2G7J)|6Fnjs)7@V_T*f0LMs6AQ!GMPHSGv0a%b?G@d!$J%nW}s$&Q4gRZ zhQ-6)iYp874Y%@<-MV+O2--e`+ssmas|bRnG@PTuUxqV;74oGi@Y-x$DBqugrN%AN zPK3FzI-ley9=z42QnR{tB*8r)OyC%vmN>@UFS|^o&h%64fvL1oOa2^7IF7M;_^cbW z?y~l5XyiMK=@UxH2W0DW%04F{*vl|SvjsMvG z5%%uqL|#iDbOlc;2H zmZV4Nb6KZ^T3Opf2e_?p?<5ee8&0+M%0VTxgkF<>l+Yl0L-u=uUZ6K(KR-bTFkBHk z@)T?_9Miyogp-Ofr=c8hOcTp_nwE={jp!6Bx>{&?#r)X5dGr}#3*}q$X&5bxwRo21 zX!M0#vye)Z^bL8QN@=G&`8@6kel5Rvftp(n*}hBQ$qZjQVnl@UtQoS-B6{M2hgcL? zAFX3!nfbB{dc0n^K{)jVYX{EInrpi#yFNenb08R(jqO|n2R5pEW{Ib0Qdl;$OX)7vj;1f60W%~mgTEFY$7Pf&D(1_=W$5X4xnvn#jNBv3sFgTYD#I_+Q+OMD z>t*U7MDcw2+bdW=XT#3|bZG)k_dzRausaDWry zIkj+t^-%1{N*W+&eyrOn+{pyrGgs54c-*;~2Br1HXcdb*h?&t`TO=L@fNNM*Pq}F| z=5SAWWHr9T&{GE9#^m9$yilTmTYf*GJj(Wnzg=GQZKe12k+-R7s;Y+<*&ekf09h!! z*WRY{)tds!>j4KW*RI~gPP|PUSg%#Cp+0!jd522R#RVIVT&)Ge7&i$JU*X-w(IDGs zeD{dp$EA@ZwCL-1s7EsD1PAK$Fu1ZWRq8Rj!wXN8$fyfdz4)_fO9u&$ud+B zErO$TJ44?79$i6xS^gfi9A@%OvI2b&<|4Ln_eByAK4pdz`lPEnS{gD>@QsE(=?J*u z%PL-JUYEsas{t;H1%Z>u9@t2tij9EG1IyPJgPnj`s#%%bV!);xTuBHUlcRAwX{j&@ z(HmM+v;qxN{!j_qwx4YIJ~fOY^eEjL)DUMeOj2j%iB7L-Y;Wf~L(nx~UVG7j&uUZ& z1Z3ohoQOKZh59Yz^;jJ&f%(jrB(-mYg;(29TP{S<=+M+0NRzEZtG$Mxl(1?Jibs7B z1Nz;DlU|XreKsVqwuT^W2rv`2URR!Z-0tCWXG#I|x#iRbWw1@SXf#;yB}ZJ#c2_u= zD>cF?{J@M0*8;$MA%uhSIN?aOT^*6;)y(6?gO(c$fcX;(N^Cu{EZmJ(c0?3`x`!$&~cO;Y{8~uJPwMF(w~l9{SmdM z4u$a>bXKiw?BQ{iqE4H~V@+bOGx{zb6OY(PV=aK+zP6{l=Q+mu#VP zNJCJK9Pu%QKCWf65*0`{xu9>2TcU6R$}cP8ZY&*>d=9|hN8w$pz^!`O&zG)hpf*tcI|4Wnc7 z^6m5y9+4e%iI_J{=I_83=(pIq9XLA_%V)@IchW&@?R)N`8?)ca3{!d}DUt{gPH-=1 z#-Et{0qcNVvx_dHzOwFaEHS^z>vmIbq)K#PKt)h>z@B$gZaBbY0;zCK`+Nw}EUZ}!{ zLcH0xec8!;@uzDxE_*@lWWhJ+*m3#AH&{d~X2>V@(g1vI0(8EUhxgL8(N(_*dv&Un zXm16utrm87d^Ib<-i74OWF!ir2)?j{eT?7N%s7mU&p5+}O)3f$9uxKws5>r~q zijnm!XQ9Yx4HIAB=0(KR^*X!a!YQT<`cCn|`w*2;XoPthn z2w+7K?m*fl~#x@Fmsl0rMp8*IrNv&syFS*XE!Wgzx$6mufMnGk7eSLDYw<$+72t zpm)eUscixe-jpi3lA^KQRS3hO?J@sP@P*NA`O44KzaCbv$d~I+qI<8)LnpDN+8%3iik=g-aX(jGk@#Ih zAURmGu`Fj9;*)OCL}2zu;sLZ_NUD}?q7A`DJ{7MnAJc?M;j*c(ch#=jj;~FzDYQ$= zj|5-~1-Qm-s5eKv zi?j=|`5c{{gaHJR5{mdaC?vq1i=n)QBD)CIC`YUU3C+d#AHcw&@`NrL=MIIr!)VKE zq78P@N^7EZ&u6T`F4kadmH13PHw^!2r4~U$vD~Qc;&(2bb5Qtx&$emhE0=@tWwZu4 zOx8Tp5_|^%-OP~>8=~<&IlTJ{G}j(zuURfMob4y5akK&}wo>T`mkz*C3McU%Np%Ik zyXWH$LLHAm#?FWh0KSajJI+Ku1QJ9P@=X6G(|7dQ!-2hG1 za>#a+3lGK}ajwNB(LLWK(Y=~PQg*!LP*oBPc8daV%U*k?tbE@TY3a8|f;_aX5Q2m4 zEQYw1uNb;-6k>AZ2~%WHMJ(ip11?yhcHtP`lO)FmV9PyCv6TVQiUOyw2Ih$UB!5T{ zGcw)4e-%fjL3oX|hAuXe3jDBI9fdFn>G>fd0=E z<_5*B-c11&;BR=Bc{Ehdmw8Y1S?DvBAn#YdmCrRSY5XL#bxn%9=vMxo+51|9#z!f+=LXzip}{|>20U#c z`teV3ZhdRPdTru;%pe}@w$s2;Sl%Ueq>fmmqM)8i75|c5>x&GpacW%rJQ`>mTw?KY zVa8yy!;CT93mJxYAtSYp!OG^We03>eL;bVa9luWjU$44P@n?49vg;XkHbUB;-8xHMriVK<8~eUi)5MQiy}NOa?+1^QYkGk#a3 z-sR#_>jP@nhBuE$yCK4=9?0f3k2g7wU{lC(c8oThD{LWutfiSW)P)C$Jo{i8uZU{Vt>FgNK zCXF$%Im?0c`C9qX!83dkC5~aJbXe;b@ux>40Uk`WI+DQj6T(J1teAk69>MkMAa1z& zdBXQe=i3Ivt>n(59>8qNW8AQ$`yxL0hr+ry5XE zE_VQR2dSoTv9W!=I#oS4bKC6V&l4+9S~T-N_oG55tz$QY%NRB7xc@u z5E8KADPgN%7cXJh9k8_!W_JkuEp~#k4WRz9^>trj>D=hEY}w`8qioDL^>puxR zw+g)HP&e5hkHmK3Qa1$xTsFYfG}nsY;^R#h>c%i&+X5IXC&=IjE+zcN`h?$=xZ}xr zxp@)u%({v8<%l}nBZ<6}@yl$OsR+@R59f%+U2_D4Sgo2KzFP2WESo4gGy)8+!==EB zp(1fDlgN&!DUMvV*+;cA*~hf%>|JiQ0XxB9 z?7dnf5q6~}KWi>pChdZ83Zg7qdu2)skwz8roED;K9f%?ne@#)8H?(-)ek_{vMLGPN9Ts1_Dh~nD{ zd?Co*k`zo~RpFWnJ}^ANXCIxQAuJ-;6kEcH>{-H6%XxO`2f~_!t@%XwN7((unOuIa zTOJER)r5F?hFT zv#RNrRu@N}UFecWrdJ-BT)t41j|Rc4;%WqB+NT5D8RU88krzzI@;zP4_G#TQL`nHp z!w6XXxTfwq-Hp*v1TZ)!RO~R0wouv|FBEg}tOyPwfrnR&$4{H0YWPsbUS1`vX7&j{ zs}uy9ssT)s>tgR69>LnI?(qZNoFjVG#)^r??T=RyZ`@|DarxL)$K#ie#v6yyUgI`L z+7)U@QZm=r#=$ZM^2D;lT~5h|`NVq;#swrT4k{@s=Ep zx1<8~drd*Xv-t#4swH@OEkO}`(P3uOQb3goDhG5}LF)h&e$Q_=1DdO#?SPglXg{C| z1sw&nRY3*Qw5VOBz^T&^74`!omjEhP&;mf)6|@{s!H@iQ6`*1TRRSti&{jap6|@VG zTk&B)6)Nu-pv?*@L`QZhs2EU{f}(Q)7N`MV1gKa+D*%-$2pn@c4UXC9K64rm=5%qK zUvW-XO>#N?3d-z{b9!%_(@^mE zSpbgK0#FLz4}P^2z|(aBlmmE+bJhX)H37h80BJQ0dSNHEdcO!5`g6ZRAs9GEKEU8C4jArwH3gp+_GI+|QJgVxj#d=89Q~HyK8bU5dz_>DC&f96a%YP!Ub&M9 z+;bH)ir8BZumo)cRHdM8fTB|ma^_xuOBGbb1r>Ax&@lxSfy}H!Ty7Sias`zFs#MTY zK-&~l4rsrE)&V-Epv{1a)cn{Es6;{Ni_3)V<8vUUMM|vjU?!Bu`x0kD@kG@ZIsY>w zl@`m_KQsD8r_|+JK5qo=&+!QkU+{DAXIq>kBYzF&yFr?4 z&s!hj&JUJz*bTU#jf5YGmcE2wCWk2E>a_Zd3KV$2jk~bwVFQRY-z^qUxYlg`(h@S& zHKaLSq6%KX*n&>twm>$2#^Rr71-BZc%W!Xz6FaY`SS(^0y+thzcLH1X5d(8J;@pbT zE!?7k#m1W#wh`ScI1R%d%-4YAvwg&*>TmF1Lma;!BrobKnu6NxeZ{%-L9Dp1xSQA& z*iVc>#6dxS@pv^>Vhyb90peb}q05L`mx=a`euHy%NmBR;$uW6qgG)RoE zrjSsB!gqs2Kl(tPKUmz3N6BCjGZlO0%iAv#--+Uta=_)H4L={dTx3Y=3ZVyVkG#yi zT%?PFm)s(F#)}yAl&pV+kc?(sDRTL_`wG#D%W}GH!At5W4Y#C5b6fso|ogU6g>o zts-F99qDJ>k(PqG4Hm2h+2%%ZLEsa1+cK^E8{w}zAd7Cq z=6`o>`Ob~v53ico+MC2VHHkN2;$fHg>$hMW%;(RvCx-S!i5AM!w}~Z9;fev7=68sgy#7u&gbvC_?-X~@5;^T2 z(O4!96@zJF?1rHNe?Q?_EhuXz7!BlvyTpHJqda++cpWTTkq2peP6qSgzUVA-^TiYp zS(PtF)?cEI!+rMHj2xe@oiE01`y*ZU8YWtR3E=B;1onmR7Ts`b?3TO5g)VxkTzohD z?W!T2e(%t=(Wfi8E;XByk?}B;Wn#f%CB&La|8m;T6AlRY&=R_ z5U*g^DD?Vixv@QX_JI7cy~qJa(mKE~`+&T@gXoG>Ne76_>+*C5@hHwS9_uIu;<2eC z9BCho5`FL{G+JDhy&0d-QZ9f9e{3O&*OFLsD@53Fy z&`Ob%#y&0f2I0)J1AD*Wq_N6n>3_t3%scVjf~5MA9uQ&K<$lq;*|GJA`N6(F4TY;b z*aE!YgYh9vd)In7<$e*)RmiFQ)q#?C&tMgMFk=;YFk=->AUiUheT!*RS^oI>UVj1^Zwm$Z>vFkvm)Lo zAvMoZg%jN_wRu=HYgY8$nZ^}(FykMqfnODGoSgfx_&lU&z|CaXsb_I5CZ|3khCvE{ ze?$xjw1>2+HV=GMv`n!1t~R!c=g87`jE?f%iEwW$eiY*zlNS_;p0Za|w3UmBL<*Hl z+z1{kUoR4M<(#O#g_ z)!8Er@3uSAZ}LcI%Bf?-RpwB*I56Dv$GO9uBioFHTo0Akj}_<9(Ac!GJTL=gpirDw ztHW6X(}f47k-Vc&j6_T^k50t*hE(Kt<2phjx@dIZfNCIbf&_O|sh zA8%37^zmXe9{L2aHKfX(VRChY-;hTpfXQ9tO%p}aKnIt}T_l*CDPNo@QWCn=H>?+Je7HZiku|`3>t%zMY0ILeO-MZWU1!g+Uw$YqLHytpehDRyzY ztUkGjMOVe2d)x~i_CCH`TFtwEs<)c(+4UAXA`hYI7tIsHajoLzd7>fPLe_pcWtQlc z5+8^m=mW-K+bl?|8i$s$&1^BV2IoJRtvDZ=Q9 z!TCE%nDcT8&Ku6K{*#h8>q~$Zoes1+pA-YmUc>{uh(9=2G(KxEc0b93A;U98PuxvN zd|KStGR~F$YB1E?fwL8HPFO<>d@9ziIWiwUg_+%(M~3m+%oTT^H8TGr`RW1q3;BMr zudWhVn&o|q+WitBzL6t$K7*6P>1uFf{w$GhAZXUwDL2g%4|`v*l7mXcbBTPJg$#UV;E)Xr%Wdh{l9ilwl%LJ)1aiO>d6pp;0DC}5RgTj7A z;rR2Quuk6mf_EJOxuCG?4236N_-`nzmp{Dtf1uDvUc6YePA&a^d{N?EIb;3bUzBK@ z@UZK&+}upQHAIY(tC#){HQXXPBWz)*Nd3FJ7;R;%m;VQvH(?j>kFEY+NpASZ8zXIH zaD~_nrLpFH@h_MQm%S!hBzO*8mp8-ZL$8TJaS{FKHSwJMsT4ON8pTA*K=o~iU*`+^ zZ-nwMmm=22#1-ZzO6yB{OZ1R8m5cKe+{-~ZVxzR56Z2%pmEz*0k6lqMfiQKDlUFKH z{c)uys>p?)A#6B)+2W!%#8vbO?#)~;e|Q6nvbwaf@=ehr;L%YRHd@KtRid-DPIQzv zFBSFFu>GZpd~c(Ua$UP$xZ@q`KHVn^UIX37-heUqU)H0q$2Q=MeEeNSm(hQ5$)tuD z|Bp0oKTA;mj!2^fwG?rWW$-Zs>--n(sv)RC!k1P;i`4dPnbE3-F>&S^2v z{}ITyzB&WONKV*@jaqqZ(MIuwpu@4TABpEE>FYB^zLssbh`Q&kJd*?Ptlj9P?8D}- zKC4YD+)h}8^AJ>tdh602g-$=Zsc&9*=wm@0e)d9|Hv94;%5LRD=1Xy6gJ6UHqPzQ# zsbRB%ojHJ{NPt7a-rkDcP=C39t9Uc&!+r#z9oMQqcyO%>>ZuL}vS0(@{0Ct@d?<(8 z3VD$L-!DO;xt7DRJ?bR8iF%85)IAHuyD*3Y_6s8QKqR5Az|@_ zaAJ?M2Q&{yZLNF@RD6kvYp~zNwta~+GMtVd`AS6UZC5A22vo#4sYa?IIomOuDDub- z?DAfh^LB{lDZTi!{fdc6t$er0&vuB+U@k`*AXppK%G0=DLAkN;*Kj1@`eKKju)X~< zf2X+S>RzxIs8&8_qf3(1XtGWnBPY@p(71AoZF9-oQ7t-A~cd%;9Az^54^EvxWcueiyOGsF9?Pc}(s2=eEx24;f7Z1xZR){WD@vw69 z9_;*&$9~x(x|#^)J^z4spkYmlx!9^8(g(q)9Ahij9}pc;?DPRKsCzF2OX(Q(a5BF8 zjw`gV9dLw|iSOOv8{qzMfN$s|sf&~vLb5J|vnA1*gR@-3Z&`W$a9g(9ArX=z0> z3NbYyHW+$kO2yN%+cRQ5j^RKP4ss*-rF?h`oFoOZWD9o91&9b+yG7(^Rbz$xev4>J zQ)Sl2;==QklJY7Hn)uTg6GSkTiRkQD;@}6ne7xwL9^6mZ+2TtnxL0|p)<7=rpatZk zKZoin2xH?DcyApfmoj%#YVQHJbo0e(~ffJ z@8U_B^s9KmL>JL2x$;+RU5jP2->_8!-PmvN44g&x5nzGP1UwM_3>q=em?!?t9fwRn za|Xh-(DWwYjn&=9Uui;|P=OjfQo58Kl#Q6H0Yv%y^&Pfn7?28l2l-C}viCH}2TzFH z?AJ39-U~T}*V}$P09bj1)W`I6du=*CrZ@1EXf9sQlnBG)>}_fLrqwJ=1M zSMdEm6&!S?jAp%uyC;~?3$o+H-p^)YUYYB%)}2I0(X+6xxxn96@j8^GI)r!9J}v6j zUvZND+=s0vNameJD8S*L$UgCtoOT+auLtEzr^T(2sedp{tZ9ld_@uN-W3N9|$sjP~ zE4OLsGV6LH(6A9#4|gel9s-}@8}6pja8xnt z*k7uc^_vU|tqsRfuWKy32`wYeja!9wK8=yHh1RygQ4SBrwXSe>ijo@p*K9k{%9lHY zb}l&x7S=k_ZrMTC@SRa9HLXLNzkX;GZCjlMm7bqXu5${ZZSd2HAS|G z_Y9*y%W!22qiCIAKN}l45NH15V(8-LKy??72efRtIG|;E{roUc-A}xV_x_>;ZDPhG z5M*k&;}JmkluHxSh-q@~;|)zpRCwsS9Gs{%&YXHQKAF&nKWT@lN9Bw}Ej4=L=fB8N z!OsK*z1Z+U*}~z&A4}!m80lQ)1Vc9Qg|>B#tv2d(458!r>rD8Hovp#C2c@s(AS4>5 ziOTl~ML2Yqhn(#_vPuvQ7==c|Nh8;jiXcHqJ@b^^r&z`aKu(@D26F`}iOszXuA9HP z<{QWhK2w6-XED@Va8w#wU<#YVFVy6<8X<>QkyPNa|0;rp0S#YoLj`hmlGY*$y9*9o za0uw0aeAgC{=#3roq9LBV$gW|!zar2@gF`?L~tjUU%_I)9{@y)(SKY&+{i_+^zYmF z#Q6v#^l;pJimAi!ZTAKkM7WTL!N0?bPTrZU;o6y;o~+fsOoP3GcleksW)vP8cMN?| z3m!U);6UyT&o?M3L~e#rBB{N=U*U8AU<2eG$2kE!{OD0w$X}DSPW4^?&0pU2PSF}` zkSsYYMayir;Dc@4ps=gWk$5^7lR1^5uQEJFSBm`D8cVAuf=5{M z!Y)QYoZMYU``Ei{L4)LHb+z%;sn}zwT7N=vLp?2mmp|0gmLT2q+wrN^#QMFH2M6|R-SWa1N;kfBgY(<*3 znnaN%M>o{Q*KA=-PuF(pBx8HCw6(0;=}`1*&HctS zlnFK`5L?9Z8lK345nf0u?`%{^YXtW*E{$mE5Ki7?aineCvmg)LzL)7s%J}_xo`Fv5V-T2@ME<%QlY?f3=K8)duk;ZGn3`R%+;mA^B8=Aiu zfCsC=1nhi*Y#IC6q~?fZEuAIQO6SE>&D0Ec{&7RoRQxqNdr^?Pke+R7-Oy z#^6dZzffCs0I$wzo{IiHkpx`+L+ed6!@?C`CYKmS0XKL!5q&~2d=?-H#<~Y#1;EIYlM-BcQ<0v4dj=&A%>3O38E2!zOh{irRC#;Ap^#^RBF!Mu(601 zU?1rAlLrDjY95O)_{#bU7B-us(rf}f5SFc*Xic?naHXu>6sB=jB0g^OOcO1LH;bES zWp%#EZB6CYNcG-la>Dh%9g<1${7uCY1Z1MLlvW5TZ zf~nqlVpS1q(8_9N6|?!A0_WW)ur-?Ir=?gaqP{0<=UlK$?CQxzSoi);&vRmOFV;7I z!7hN0nHsDALas+hguyv?qI(7;qvRF8YsT zc?oj|N7<(Jb>f*5*|n~!H*kvA8#SH!u{E@CKzuTQEf)!+ScdkoSal)K62A^*UB&G~ zS+`CVK|1k4!|EQhJZNbibVO(jqN{O7!*;Q2BFhw0hO=&>a2V^X)~1NFhp}6I?NH9?ppE%0(ZWs`FtdclLNr-Pl9~U6tA4k z(wq%jWSv|+0KZnK- zTeq~(wa>jFocJWL$CUy%WirTc>5gLKV)s&rvmJ0oBc1dC7=Z+|1 zYS@kat-#-*fewbDm<`%43eI5X@}@y%*;o5cFF*?6p{cS%6V?rgs;YjF`1{$cK)Xjgcs9#JUg|-yb0TOh@qCuruJ&cJJMNLA zH>`@5qqkUeXTX78OA)6|1Q01=%UQfb%J!d0h((qDWPkC{MAj)a#Ug6Mc@pSA(RJNR zl1fI)^={Y5x%Q=duz6Az@FT?D)e5NEv$%i~ug4$`xJCV+)*(FNzn> zgTBN4gn4O=gz4yV9tF8a4Bc#6Y6c3ZBS?t(1#5b=a-EGf8wf3i~wf_R=+Yl5Et~+C9Ip7i&w#T(theKEsKsfawU(X8<3b(TDpO3 zmbO3?2#S|q(HfLokvo~4;M|xZPM^%WUr>M+77%Lu>gF~I;P#XUWv8n#cBXVjQ;XDE z$4uEM8t`aFI+d7dWKyl^NFbM0E4|MYyC$==&iRO>-*$-1I8&YRS$D`OhZ1HzcKop_ zg9U+234)ihpzkdog>g8yLq?kKhzXanJcchs|2Zu0gqVJg_vm>|g3Pm-(rabfv4zqI z@OT?{8i`cF+B50HyXUZsqTAb%a?t81Q(1C5(@@Z za9}K~0oavtjbj}7!m$)E29^d=E5wldb$N!t{zsr28((6y@Kh|iOCJ_@0FfNDyUpB= zV(>Z)xDVf@$BM7U>gk!!P{q$B0UP}s)s&9y=XjRxPm11`TcA$79G-=RjF#tCh<(fT zW#a1Kf+Hz~ z62oiJld-DXPbIpk#JsCnPHgz+zN=Y(QFuL~RPSYIL4>Q^`As@YvXxmXgc zBb9*eLhROsTakF?Hfh4BV3mj??G8$bOu=mrzHjofoxHC4a;$*(Ju;vWT^pn zAcKB+gI;{%HPGV7PaJ_1kvW}>(Nm#ru(=~oVlhUtD4hP_I4H+E$fIeQpDlu?1Bzn8nvkUgE4YnB1j1P5d@t(0aWM}XI;yB zh=Fr-Z%y5`>}4(9;y4hnW`g7Hx{h@?mAC=n!L(&UkgVKV+_~b3?JN+7CzU?QfsOPP z@x*78sPIXiplun5U~6q+KYU#@2Vx5{DM{X=J24+!Wp?@q6tYwiLSV#G# zJfwuhfv82X76!_awaRBiav+c7Kr{-eQfm5!J=D?ckLmU{ZI8gBnaUk)GGw3Fsma9i;;iP1_SSoSwjW!3$pY>IG zfAQcAA^Mi3`7K_GLurzi>TggSh>s-)%CAnI8U2-y=n-5&UrAnS^{Yu$x?T+WOE=Tu zcB7@MQ0}o-#JQ~9N84CgrZR_I*LxSSU^hnQ;_gIoGSGIDLeB~anmf8CEwjQiw%{DPiL{N zmfn)mFSV3i5Hm+pN@zh>C?S6t+bgpkE@K_Le3c^Ubu*RsjnV^eP#SuTR56h&6o(Sw z6K=J1&8in!j_5L4_ea(=VzfR$tEfqsP2Nb-VNmrQ<6ln=m%jxI0OnYF3+g-&|E;QA z0`q-}SZBZ7F^6@JEE+)c6y-PSapDYY=r1mw%L z+X|$Wu6uSaT2&!{fX~Fs^VmXP)aRn?JC?;2mjLH^qT)7IB4Lm?Ul@V&dnL|ulv*UF zoKJNq5m2Qo5g@wX&XUtCrU&+HwW}&2kTAReNC2(3>zO|(?eOb90ng^V%u2F!d^>Qr((x{mFj8iTU+-of($Lc0J7t0%8`~}C2Yt9gA_o zrDFQlif`9k>3_daiJVZ8;_Z7FZDJv)K(X&0W*;yro7Y19|Ni&+qPjrW#m0p!(K0`* zl9U)D^FxZUV=3v1a+d1c)=Au2&i)IIy=4)`_My(q44^ZP%j(qb7t`-$NqLLIb|#4r zGLgw1pMN~|rfkOd_eN_V+Xlpj5v^(<3==F3G-8Po`BRrb1JR0n>}6%{?kwJU1?Ees zNB4>km#|Ke)?hn}QoPZWB6lVtYY@hTWev){eP9`jjSWAud)E+)m$HmVyAV+rQZIz; z!s*K*NCd^mQAYUtfy-D-F%>Lnnl>(irm@#HNlUW@(fm${dzP_bq;b&8*sey55^TS1 z)1XVFO>(K0 zeYQpNA4*sw5R%D65u0t^hJO}sVMGyc3)g)tIkIbP!=qWZhq^{~yEN2Ky)V@5y+zqH z=8IGw8}4H#rCLKAX_jHA_Bpi*23GF-66K|oQA`;fL8!CDR24^hwjoj_lM=o`*oTo2DiAebG6Dbd{;tVC;W09{4 zUswk5W`qie^B!OY-IcN=yBRU6Hoer+u2NFc{EH?~pYbcZhSJZA>Ib6Qfdv9qJN6*j zCaN7(Ry%%CKK39Blpa>D3wVb# zbB@wg2Ph4p_7mDTRV;Ak3Pnt1RDGo~{N_>`fZc{W!8IugtUWNEa+G4f2189rmI&N1*U0LygPdl* zAkKe?Wn4h0h&6KX0FjC|7?T2+vNUmI?Nr?MD`RpJl0PUz_F^Pa^&USVvO-#u1D28L1(4fz%3dRCSTxoi@Jy zoslaJC$dJaNc~QMT{<15W!a&Ekouj1^4rt?qG*}hG+@2wDN85M+Dj&n98f_V@-1$B zoQ)OE=`6)RDNsme-zBymNqqe{J3S@|_I#3&B!)l1`VC9Pk5ocX$UB4&N&?;JyPm;h zyiGPDj$)$6g@F>f6$P{LHrvP+8=hckF=_abW?;IAeq`WB2Ke?6{Yb%&6u6YKo@5Uc zq4~+JxTIW0p$rNow#l|#QsRpz*%@ApCwdxon@9YU^(=+oYq-&};VuJ*)>5>4GI4mz zrn`(1l4ULf5f5h=R^uZ8cNyI&PR&K4;e5k_C+d9B zO*3q;+dsvw6kk8ZiaKPFI}K>TCltCQC7sKDWV_Qcg#T%{)7Iky@kke5B!)hXRAw?P z@K3t%oKD2kR1SKuc{%ctT~3nN`!u^S%7qtMr}XOCdA(wIwQ}K|nPTLTbWfjhReMWo0Kk+6ZK#5{uI z6(EFaiZ`$uoLt&XqH=_uF8(rA=Y--wAG9C77~5(i*A3i5$_A*_u_8no691wx&u!V# zKOsAEzR2B#paZmH&?fe_>c(YaUsoLi4SNnpq`b;{Nig9&8l@7m;0QUm0AcAbzG@9I z;GzqNUtYDGd98SXO2oX^Sh3wr?XKP^W0fLC}v!J8TP!w@l&f1lf~*ap9$UmM(`tfe$djUm>n}pFJhp9{zoo z`1c2hodWfUz!W`A^NQbA>ay>1AJ88YZ+(cMBVeKF!w?q2=>K@Th5qavAymW=D$d&x zLWM;C6Fb-pPX8#aVUrVR$cQ04{-ps?tbd?*`jc?8Xz*xH z%f3WuH0u@IjW}!+sbLsKh}!=N>s){iprSB8flb3_SXM2%1ZRme%pc(XB%?W@q%`cV zNb(rG>c$JWG++ln7l=1MWu0mkf65YcpJn^Yj(b5=e`fXclY3ZJq7NHY(;lRIprXjN zbFhav{23b(7xDX@5qf)Z)#og+8He<>GP&rZt)H{@ooSFRjhc{)PkD@pv?0hqjle(6 zaCpUrU*JFLx|`+azm_D&shg>rwy62vt<+VR1%Y%?gY4^ehuqha1fJd(9}%xuTJy z;HaB$f5j4x1yKcJ{#PvdPh-pd^)X`W)UTtlb;s8&u+?$dH|$g}&A4yE)Cp{dsPhR* zgF2tKdji{-O6pwn4J!#@Z}T_o38yzSlI7+TqVzk<0ap1PJ0*7@`cdnIK!QGOK8_!0 zPHDLZKr|p&MKmsDxVq%VpCnop(a4p9G%@WH`!CZm;qg5)Y@(5UYZ1*lYAW<)1$p_1 zk)HiNga#RK@ZI+zG)NIT;YZ8`P2LyknHZv+Is3wtqYxq*_F0tk+dkGc2AoN=-8Cod zXQw-Tp}{`KV4o&Ea-^^$;7KnZU`de#@`vD^bKn@^ef2;zyxNZ~;GNOl>X8cch?GX~ zpgc@{9j&&$`O%sMi~Wgp4uRb7CpN|zZ}F>SmMux*-X_*T!o04D4eLyHf^y){Oi^6O z7-&Vzbozx2Zq5@z{K67rLvCiVY#KAfyT7m#FQ$THq*B84kSZ3FL*D3#i`JaHNtWY* zCN7lYAv!og&Qyeh6T&|cW)SIkNVtY&avB0AiT8eGlOx@#IIu|$*JxZyUWexK4@BXh zNz7fy_=oV%R;mzh{+FfZsMrCTkAO&~uv-L;;U5GvbAQDP2N|~ECJJ{SV&_CQ#A~_U zsUd2TMuv8T{JY_r;or?s{t(%&mkzPP9U;9Pas(+ipQb5FwYMt8_?Q&ai0Whf4~xKW zY!=M>%HP=gsu`r(6SG^e_tI7Rr2OYnq??N-75|wc9b*o&kmP`3c5XubOIzSgP0vZX z702*26A~z;z4&bpixWjoJ;k>y!jh~AS&~;d^^Ly8>Xqc$C1M~`hQL2c zUB0RrtLxWm5f1>>m11UBfjWa_LES@$*#~IWemEfiZfW{i=yn`VtZ6RGqFS0;8=ao2#XE3vp%ds8U?Av6!;Y7O!cw>Mx|MRi8#h zI;;_Q$EimAGcLLj_Potdv}B`4m!k)-9xbK3`iXX_)l@k}V$pq#nC4ZbF7WFA#sap} ze6oN=K0V{a8OUHagCZ&s3DXM!@k+d2)ma{>X6ABv-BKMe<>#3fAj0<+O0Kd33{wH1jis!-KiGKrBan?aN1DYq-#Y6{uJ2`n+WFu z-Wmw}nUtsxO}D%u(Qn;>9I-Z0FA%S_=l*dXI&rZNnwUz_Ch549fZ=4LQ>pFA@cP7I zH9Nh-ifd_Fl3&ANJ6|FSkAw4OV3IyE6RwzS+Z7Y_K1Zxf(mM=+Ej5!x7{AL-y%s&OV%&EATmrTGHukzXZ_Ol&>qwc6wr-=yf7X*lHS$S;$R_A>iuFAI+R zvM@H>gzQv3`$WrCNMiy_%t!~q5@#!f5=Z_9YoGu!g$+JERsS(bg@9oMpm0qJLtIpi zg&3@cCDv4?>HA#RQ)yAIp6sl(0xFexg^_ud7~Dnoiyw0J^uV4tYd#~!Y>ZQa9(Ytn zyowkp%F_p4x=Dq|Bgn~o*^ZW%!!pQbIXePFk30v_K_E0U`eU5*Aw)-Fek-eDB=ZS8 z2xk=%@^+pcjJZ#lYBcVDT$Fdz2a9pvF|YX6(9^x4c5w4$kr2?;tZk2g-m%>iG+9Nv z%x@-9|FpO~pew6xen1bTyiGGQL5PN0dix#;-=J5l59n!9C2tStrc7jG{g!s07!lOf zw9<7!JwO_l^apVNK+yW2HmHx2AH?PBfqZ0;bGqJsj=h%L{}y+`Bj$LO34Ut6RmI|b z{f@}c1v_#o7KAHjCypg_fr235GI+i~KhcU{$P?|_>kZKGd)w>ZXz>yqR@m{=K9M~Y zKA=M#^?2E6QvD+HR_66tE*^=q`C?F^QWO^!hGe_6!QoiR6Nm0Xyvr5qKw}d->HcQp zw2Lm*lf@mKbdM}wbkZrx2yrsY#HoKptnbyG^)>R1O@4)?za~m@oi447HLe#A|;Zt!forQCuOi7CG227>L(CED|Bg@wXi>Fj4rZ+X;#F;J3HE~OcKF01+NepYnh8}v7EPu#QDqk!b zp#N9I_0S9D!=sjVc@I4_kUw&1KZu>ZKuA_(oNVzHaj=)J0_0IawkVyX$3)n6;@qCc z(o9vb9aSd_MpWIQUY59Mwd66qkEP_F#P^-yN8R2>S8-mg7S*fou@v=RvGK$(E?a_{ z+3(m&d9?r0N;%yB_e!ZjzvinE!BPA4>w&*l5>dzx;_AV=Ki-O_kf^Uab}HO8_}Jq8%se!%`ksb=MO6DHu7V|J@}my+!p!x-Zf*>L083wJd(@{n}HUHdY^=iD3uL z&4yfD5$j;8$LeR<&6Ao4&6Az+kjOg45@7>R(Yr>f!J6z-F_w(CkSn|5P*RkL9;aut z=G)yePPd&d($||jULV$_RoqA=#z^Lp76j=jt8eyreNLp!VY?hC>YH2+!k7@T_6M<` zQBip+<}w+>3N=?9!iS2TL=4tCv1Nk(q)vfcBn7HP?l`@OBCK7a@l3r$eBWJ9!mj$O zPS=y14<(T*EU?0icb=}F7U^)TYQ^C=?hL)4J!~vLpn`5*LD1nR^lx*wgQ!5(f^gOa zR#xIc*b{N^gxm##%xb2bR_ZIBI#XYyJ*OJ?WD>1DvS&!hLlPrh` z@2C*>Ow(5ru&GK<)SeyI6Gzs)Srd;IatY3mIn|##xku^vJc8Ptv+`8wCok=j;><;B;6+-JYVr^N?#>PSM0(9PYeYi7^3VTiHl+F4jY?ZE0=Sz}og`@mAoTB$7GtG&7JKhT2lQrx}pjpLG4gYs>5?NBtWmq$)vCl$cr>VPoAO|gD|1SlEht8^f`7cvHTM2qcGCy z&}`z}XO}K19;N?%sudEkZho`^L%8X&DKL9wpB$b|nkJhB;j_j0wnr_ae9hBr8RalZ zt+X&fs}%dM)KfELNVANNB`K-qU{t6h)=;VykrW+EG$)78a%PVP&tlwFR{Lq`B<) zU8@(Qk*{AxmD0F{f@LW(!7E;wsb@zz3eUe$?H;odb%&Prj=II zsg*>^_>fCu;Bs;=dl3tG4!jiUc5=0JJ1KU(^9Frj|1GpO78HsBy4&0&fApq}8ltEb z17-?jCD)U+D3FHu!Z}m#IP@2f6CE!)@ivbV^0GdN+6G9p7BXk|poMQLD#Q&TMuS@i1RZ$;gW z7CU@)qu!C0Ps{mBkp3afC-I`zd~IrhYOS3(>t?-U>Dvk9d2`UJ;MWo)8ekrquc&0$ z*CNp!;cKxMR>JQEaQ$TdDzDkl1z6l(HXB!IA19`5vGkbEA8?tUC?^V){(jhr(k?=v zpo`pMNB(nDm=!(`7v_Qz<+Ro-??yq{XzuBFJWZbu?FT|9ZG9v@bN8KQK) z&NGiZ#1s$CZ)=s{V1+kk8{Sqjf*rBj%pu{U3g3-i+9UGfg$0;!@`F{_=KS#tsqyvd@VOR z(&QMQ+_~?P23LFXu+8F`Vm-ZMgu6w~tID1X`fvifrS0X&d##xMqUG}^14ewhNH1(( zLCYzF&>D0u{9^f|k5VBKqF;1btY^TTzVAgn=!V^>RM6Fn^%Ojux7bnuO3#o;C*y_` zfKTjL9Bte{0i2a$@kN={xH)vM7E|uE8h7Wtx;_6dWtzS8&SwqAtwk0gnI?y`&172m znZ0x_U(8&h+gmcoa(yxs)EVBA;pkF_1S7yLT&mlPGh``ol7mz!;HBS{UE@o2YmMf? zrFtUG)BBfUx5)2mPFSYu7AZPtX@y>mEQr=p%0Y@!iADU_d?xgN3Y@Y}P7XKONQ9~aU zO1iJNz`(7$ICQ_>(Yr(`KN_lVgrf?Fd;;@p;`>=`uog-YUIbdjuhusbbngdMuTB!$bN;yJDL9 zGEwnK4_g&q^RTM8>fz{$?^>;2Eh|2>I#jU?3>@%?KHLh;l@;Ilh^qM0N2p@)^gr~% z;t)L`W-Ck>N1Pt(TDsv@wJl!RU|b9mm^_HVQtlyqFDEAi^g!T?}d{x2ET;d7k;U zHG)NZaV`BA5P|JQ<)eC+Tzfkmm?Z5i1|jw(2Ei^4V*mY+tuR95z73LB?R^^}gOm1G zVQOqrm7W@190hQz#IB2ylRWA*cm#*XS z;=U>RxuSZ3KE@j|7`gd=Byp2U$ZUtsf;(Nhdf$w2L)RyXe$VM05+Zbg9N{Z&cS4ch zg1vy+sfe@CfIvL`oZh<^J;WB6C>iFvy&e(PT6*oQ(8S7e)}Tv+6>II^73GKFANH-+&kze= z(ECcsK#NS$tnCw{ErRmkvKl=%vil*)(S1tTSGO+g;aX5p49(_V3U#?b*W~s31%WXX z(gJ}^D>!JJiLG97-U5EYNsf~j{Nu#u>-CdM%iL3g8nze1;@!SjmWr_;l65f%xv8gd zp|vAdEv3ndSxX6PN3Lp>xjF{4hmdi4vnOT>d8LSe%*Gg+?A;z?4TSc@(BT=h*c)V4 zAEWkp(n=`srzu8mR7TYroHi?y>p)boO;oIWLEqKIh>L#GGrKm$&|ZV64I3f5{Q1~? zt(5A7M1>u3H2c= z(|*iN{V`VVXbAKGxCReCG zjW9o=_SRsnf2}QGJ$o}?t$iCX)GJu)3D!n}mAo_H3xaLv!U*pS0OW*#cDO}t@FU$o zkYV`txO%#WC5{@y;D@0{ds>6O_v>u|{mZWd`uQIL`dS5jEkVDzwVs|I(bEh5bWd*% zgBsD(sJ%5gdG+7|Gw+NzJ4x_TGjo3G%TPw-U`e6aXzuB{mD*?*0`mBjaH+N zyGiUwO>=xeimvr~YLVT4sHGK{P@;T6*2;GNhmD?S9r{&0dUN%E0AZbiu#OYtiO(kVTDj`Aa_Y58>b2%T zZfYAKD_a0bmJh0Jg;2#a+u8!izVAbZ&OHbqo5-Ps2^1Yb&LJC=ZPGx1*B3} zyr5=BkKghU+6NIb6qU6GTCWe<0p#L@<255~6v_=ALAC2;w8+F#wPYIf}!Oro6 z7UH^nIGd0bIe<=#FtMWc)?j_{!?u8R$abRD+1QMnCRb7OW`cD)!5V4QMNYZdMjfs9 zjavFg1(xdm(Ki1=sw{0xg^45B;OmE$Sz5SE6 zfG_@2XwKaW#jc&uoROq@q|sO8f|c;x_;E6-W$HDtkeDJq%~rl3cr;t<&(g-WfY-GP z{W&(vp zt8FO!YvYFH&+lDcdjuEB@wl++mjQik>caY8XyoRKmW^yAKU?0hxC~qKv&~(O5^ELJ zV6IfIgpym!*ft7{=S*wyhZ1mVN$i^A9}JyfyGu8R$tJAIXr{K6G41)Ew*}RF{y8MV z>IX#0Zaw)-?7$ZVowcvCgzkH_7vJ$iC+^uDF$$_|6&PSrzMxT1C2ONm(C9Bnn6E-N z&R5-t*)ixWn(ebG@SVq(-v95%-+lD0wy~!xT67=T)2Oz!{ww^lE&A{2F9GE4)c|rI zO$o{!KB2uVAW4Fm?^VrPY39Ge% z{hxrfHVkWo{zdH}U?X7t>YKKJ^_snab@Q`;73UNYrDBs@4BstEl@k{m-&ncj%Wvze z_qC0Yk*gfOw+`fa-?jyipM47;_q+fgn*bt!Y@)+M<`a<3Jxf-Iz3fnHciiK5 zfrf~8ei+t>4n^&)b?B?#wFRuFd=FT01{e%R1uHh!f|w3J=EyXQI0(&IKR4DonQG0)4 zv@ag{Sx@L<&wHQ+t$>Rb$rnT+m$#9@e{PdLx^%_6fPK7#9XpKE7P--|AIZ}Z6&3bJ zJKE*!CgV;fg#>t*%F&uu@E}h7Meq3Mqb6SY1)#5cAE5V@p!Wsjqnbf}Bxh`7INP7- z^&uxxUn2O(az%$B@7o&SXdFGKZ~C@T|M&Z^eo|?}b|Ar!NHBne64Yal_TKt*-u>1wlTj-S^?E)eXP*+px)unck;6b^^=?jKNbfM>glDVj)vaViqt|dm>IQ}>5mh$ zq~-Khz;sVR7-7q4_D2u31(-#@=_idXbK|^HI;fJC_B#;6Wn_lVyv(QJS-Nx|8ky9J zd?TNZE=R}Hv6mWU#imSjzBXmb7q9%LmpE7K6#IYEb2Mx;b67tex4$0NCulc_=MU@i zJXP3*?N<9)r>*_o8@9kEN}YF~rH8qd-4MUIot#6B*|oP3&gM-5}V ztCo^YA@s$LY7IPuBti}SL7y0@^Fpjryjtg{Yf0j27th0Op^Im0-esJ3$E#0WJm=yV zhLe$KOQk6|6SLGLZ5KZUbN1LCp$tcT`W%@ioekHhO*iYbkp_ZCr($C%=eX(ghPJ2O zhc}IQ<29Lj=)l7!Jlv;^G@aLBE#xzt7bg2`NJ)`l6I%T16W?-P{JU+OfE*<;JQ=t8 zBu*RiqQEq9T@3Hg`%ZaShl7G#XUk*u91c3Y1ilOemK!)ax)A%D#R3wlv(Un}PXw}f zwkMM|7n1~0Q1f#PAC2Yppa66W_A^7^uVZu|3EPX&3AhkAI57^pDNc$77B3ZLvHUzN z8fb{+UA;Ks0uk(mbVPiGNR8vKXk)|&alC!pxJ;Y}Z(zB`OyTnIYjLz4j?Q!jTO4o`LA%+aaA1TiU-CwmjZ{fRXqUL4_@B<@b&ng06>BMt``$C^Xv z;EjLgh>T?3UNj`|zu>s#S|869%RD@*b4#eaA*fQPpl~_&cr$<%fARA!rzA_bG=eKF z46On@5?aVg1#oj{6>Jh(uY%Uw5?bu)9D){{J2i+-1+?vxBA|_=-Xv2WorP#p$O%xg zg#Ym)!G9Sz%g;0aKL`KgDDYQ?yZ^E=UJsZKQV!U{=5)k@B;2rn9}-|ezv7j?*y0-p z@+QH@4iYSO%mg8j%o^d-ObtG55<)()Fp;Nu`F(_CKcJ7Dj1rJ3I*iS3|NZI1XYnP)l=CyC4y9uPam z@O&3IAG;`uOHz3M{1p(~2+nmIZoiep&g6Cy@)1d~K826(CHL%$H%tE($N_+`)NmjT zL2T;R2GRgZ0z_-9x%x9{U!{?>0k4W-sk|Tan&qM_m8Z*?#0>B0k`a42+M*X#DNrhxLaZ`*%A<5$g>Cmkp`ZQG2#On@JUC=2VJ5( z8y%S=UdZNoX*p92z}j3Iq>1er+;n+K&Ur;1h-0)jLZf*@8V!dCO~w9|A&uq@AtNm; z6TFc!Ax+$k;{1mUBPC3L?@LA~5MO5U$(mD)&Eo0F(C;`w2k5B%T-n&9BW7mt;`}T; zB!VHr*^0Y?`;e)D1YjslQqAVwqBe_w={xh7WS@|=!o zAU#XVpF!)AD#HR<=hIx8(6+Yb6(gRlAGl@;L1T*pSEHZzh1&8+-)b=mC77meO$(OX>Ot zcz4f&52ZDUJ8qQPsKEQ_zXwqm;Pa6^f z644aH6wM68?XX%*M8@QtWEqM%00KD-RX{(SaI)i(vx9K21E)#?9t|*RlHHbqL@D=8&(%O$9tx+aT^Q;HM?$ zKnT!s`9=q9P?%+DK+CfBJcF;xH}`cAx#8r1_PkHLp|(U#(o5x8LASQ&seO>MqR`(B zCwc*G=tbR>-{Ogzo?!77;wvEB0s-}L0$@on62x2Wd2U8BencN7WYFi81!7SLp4=TV zN>C%@M?k8R)8B`UqLGA`)^5-%KmC*J&+!<6h|f;&k|CwO#Ll(WmwnZjG}w*&&>it% zx?NvM=&M5cm3X-WFC-B?*6-V2)Qib4!& za>Q+gJWvXQ7Of!@5?T^TDbpa{kd!hF;tffuB~c5O3X|qgVvSD;V9_sXc1aCm>bQMKADYU@ae+B{b-9lwxHZUc}MCQP|*uj*$Wr`z05m z7roeOnhrPIF8@uJbcx||dIAT%6gl$M>M8VMIu=jSlO*(@q9r$;m=3Sgy6|)QgX|-> zbdEfVD*D(e+NK!>hC>b=!IJ)YBDRQ|r_ni_AaI~{fPb==B%t|bk{JV;2vUbM)M@os zvBQJ0pW6$KWeZ40SU^?|Flz^d#G^wjFXAVbW)wN@b*lE_V6OR20s;0~C)T$Qeo519 z$W$PQCK*w#zZWP)sf?%wxjis@F`x{IgDf+S!~rHHgHm!Mok6~fB~EI30gZ_|B7@l3 zmG>{rGqhlgBz@p1)yO^xVi&P3o?yHx4;m%A2;DFF8tye>?`$KrlT#8PQj#_$-13J* zp6KQu1G=Gn)VFj-Bm|h2C0`lwhK7ZT+`v%YV+?|&TI{HI_Hz`$n*$W@138gn2gw5( zd3msB_6SHQSnwqF$u!e#n#5?~s&4#C_;t=K;T>?hxrAS@?Grzg@NW|HLDRu_=`jLV z1>)fv+Si@8Zidx)aw@V=o|Cy-kh0gt3Z(bG)8&k$*arG>r55J=nsBLrx6Nwl+ zX1#MtKz3fe6V4@4*omY@6VWkdGK4phM4^rZ>A=LwRearquT=|G8EC31W6!aaQK||l zXR;7LtqMUx6;j5Ixgk}m4B%0ffrKif;wWX5hM+NYGO_^B9&n^g0xDoEh;<*b+fW{; zMaNULj{F74OFdldI0(730LUU*V6tPYfdp&wBp3J)n5BZyPc$M0A3@P-p!-7SFo&F6 zz^`;LeNWs=ra&symr3G6--7g{uyq7AC{dDv*u8*uc0!$bxNSP5iHRrjExOO#m?Ap% zYjTe}}lLKcD7$a-P$CZk}lD z&pRi;)vidh(7D%%?)KDV4dDH?j7&K+jyKZB5l^SnsMtx)K=^P6N+0gTVLaQHi6P7s zBLVt%N+46*I*cd5>okZ55;F1I&;qnih%`gIqQ@ZKdqC^MFszZB8uW*4jqsq?AGS5T zV)YC>1UZ>*ALA+EuTyyDQepu6nh)Yd=g?3ofoBW}? zF)&Dq98;BMf@wX81e@E)r1>@28e-8~EMFy{sh=#uGKB%|ZOXD|-EFc}XS=m=FPGH)HhJ0v|X^8gL)skgoag$#BmpOR z#{U`!iMXYb$;cW{CmhxSwFG_J&mmE)Jg>rYl9u=vTxt^Qp$$RJzgLrSvyy8`QXGejutbC^N);?YDlKw6 z;S9C2Qkpg)IIE!D zXr4U?iB8M_Z@|7!#O1^obqHh;q>@gEEHrdt9ehEOFC?CTa9Ddw#OkWV~g zcwW0i;t4YR@*E!XP=Yvd49_Y^gf>bf@wlssknE-BP)Q7G(AX*0N6QfM;*brGJo;S9^$cxSg_>Amt-m&-h6l`_iE zBcvOpF^Dz|nL5SX9ATGjwbG+tb=nqKk>iFC7fz$D$@M>^k>yE#{hMKql4%-~1@hk@ zV3TM0JThVkHIeWU1IP1>PP?+CTa6~`cBmvo2Z|s8=EUffI73>oq7>Q5Y8oP2N9unJ zNHFB3aApyZWVAZ7{E)~HW@AFF8$zwalZV6Nt%AgxEDEL6;A6ASIR)clR8Mt4UbRv| zm*1(OC4B!0!}oP__!3*dcTO9_N60F4J_jNb`^WQS@B!KUW<7xmQ|b4>{XJ-?E*f1wXmJ6@!AAXFAm9jzVWj`6(R|5_uSq(+qe z-)jW9Q_#hVnjPi>HyItE^#9VRn8p?~=mn)KO4zFf9i+wog5YKRhm0`LeX)Bf#oIn3H;HBT}< z)X5lu6w%GfHQLB5&lrc?>IrMqpTXA@sDaPK`ZIVJjO@NXgP)f)+RmXiy2nC@p7MQ? zN7hEV%dMJ-X!~6gS!T_pXCee3Mz$IYVCa$Pb2jhP?%)claiOMZrDo&LPVvmeEDH_^ z9hh~RN#fLrICnTnY&nZ}DBArqjm$^-G`JsNEpQkKjawZjk&~3Bw*nj^1XbzW<+6rR za#>LbKMv?rg8RVzE#R)cpIR}>;T%GKV@J>dTa=M^&#dTgR`nO9XY-DeZXiTsF3IDO zxTi%>4o`x^bR)#mVai2Oz^24(MT;7m1l8~X(|9Q=!I{XY1Z0LZryEo!V<8pdp0lftaXJD0mN6RDG&1PjcpcEBFGUgA4Z znCJ2iDVv&FAi80ZxcOYZ!#Q`UIQu;Qg0pI=Xm>t8BS{tobf74O`uX=t)SoEV0k%MW z)8ZD*Y+OXmyhn3trP?fW-%e3|F%IVb=r7zOw*H0pN^IB}-Q`U?#o!D0X)b_dqE+Go z-o;LDzJPbK(?4Ipi|ush3&VNNyO0-^!WD|1GB};bhk(TpKkZ&feM;R-{N&I*Sq?hj z-KGdS&>cv_r(h>f4v{SNy=FH5PSM%6g)M+xcMk!ZF~9*!*AF!VOBc$x5P@^}r>FlF z(d}}co&+lt&m-EkX@NrOCR!{T(LPnra~R(@;7^x*Ac!epM|TMzdlM*d(1&40JJVKQ6=9x>rkp5~l;n<{cHtpIOPT`!3Ejj{7)h-3n*Nd5#g+Ilf4C>Rl2j!mxWkS% z5=?ErDE}Kz2{i3(QFr4v4)A(|)NGXlNU^1e!_)Z?Va|efKL1+oFQh(2;iM3ta7d*= zG3aJ>|0pF_J3uVCmcO16K>_X1Aj<~8K0*rNd%m)IaZih;)cucG`#1g~_6HR+uH(H6 z@vV~9RbR;d0J1wdbuhCMYF;VS@J^VAok^M7ziLt7x;+HjQ_E)X60S64uNi!#YunFG z^U40=))~CBB}J-d@X4-CyB%i3Zjp68ul1~ZN7m>xtKO~o^m<;Wbz10y6qQps&H#f` zN!lKa#^^f4LG^az_ad?BL-FcNex5b`@1*JfE;sTwdD9@XY_K?dBOhZWC;XlFwxSB0 z6jiY3@BB9FRqjo^x3_MaEYWG!zvrNrMPk8C{9MnH zKRi)TDi~7)FjWSLNk@V@Ot@xAWTThepdL(RNm~pXh*?796WOrLZJ)Gg*g902>)h-Cb>z%2h zpp0i)TO2#hxgAAa8P67%l=0LS4=YR=Ue&nV9dr_i7`L20Gj`ilt1Ex**x=9 z8Ertp3NZI|vjQG)<&=TPrphU!f8k~=u#GZc%l<$O1)!jV5Jv~VC&d^xh~=|+5Mu`M z%4|OD1gue$?=a;COVmX_@F)gTgqU-4WvQ2#GIwFp4US5xQuLa`Pw`YaVRXR)gJ)3O zJqPY*v*ztN{AbNK4|e5H4TBCKaJzVC88@A{-+Bihn7E08U6cW$?D-GH{`ovv+;|%w z=v?rj%&aXCWq0sFi7P&c&WrdMnfJom`PI%n?~Au@=d^^D9*bQuV)#(3D(CaWJ$Les7SCdo&|AE6CqK~+ z*>NIdr-t3d|D(k|t_2wkdH)je+X6nd*$0`TbP?wwuAEO6Ki`e=)Gd)e2`z>UdfF&Lvlk7hA_iL@l2t?kZ@Iolt`~ie!i_Z7%7ewc%a!&q$*(# z@iCfBeLASG=A4INb)~4|?RAQhf=na})9HV>=C;+;y_UqlZkb91*1k;=qpKqM4AJ)= z7z#GLsd^H3qWj)^w?@;w{hLrw^>zysl)ptNI3Us=<)bVVT=ppM*Fm9RT?-W0<3Wss zF}4-2J<7XSpZ)SEKhLIHMs)j^DxPkUI3p6jwTjvd3zoyh+?Q1RCRrxBl>kFv{n+A!CMzJ(e-50yx z-}1e4qMH;fjakKn6Isewa+pE6IZb-piXpXaP?RB6HaOZ@Kto>=zbMi3h3NJa9~Opf znw8x96u$~!o%b}qI!?&|jsx6lwmr>zguucs!3wOZO%kjg6`NXswf$cN)+r9M_3ZIv zB)QLihPS_jhW=33XBZ9wY@%{B$X$&ihW+Zd8ustq(4wMkbyU%sR4tW+jWx)02IBFf z9`S!J;aS6TMo6R0aFSY>>o21p+!BkNog5{EZ%I>5Zej0cb)4~mzyqAnxI5MlxY7!$Y9hz6Ms zwS&z1LCT=P`Rh0>jC#s2Xs2+Nj;v7N>bQ1nBTkLiNBT-B3`(czU+hPxpn938QzR<~k#{y2$*SN7EC@LltW8*YptSKX;Bsgx$D1SKUiJY@R9a92$Msqfh zo#e0aloG-ae+lO}VU>X4@FoKoDg6xHLbsFH%n?YT8;+YtW8`u5R&b5StDxw+*A9|_|q*VuvRvIEF7fD*(e;+0@DRYdR>I!0F znHfG>po|4Rh=U5Kuy?8iD+Ms&kwzUuwHC_I2Bd*LoSA@#KPPn(I@;RCD~_TK-2t6? zhL9;0Xes815p8b=Wg^fpNun4L&q#ZypY8t)P9YD7mn(K;MTb=)%+pU}LBl^L7@HNO zNI8@Ob5_Dlab8(Lw~^q-XA~ZRe4~979fqzhMdY3&Dm)zLgBI5j-bk$ra-Z%6Ufn24 zen~#dSac~2bT}DL_2F|#3tUe9ku%fnF$-zLii+i#ELaNQ2(}9mX{^!CB2uJmA}ytL zB$ScdReiEF|=&S3-TQy?MoLIf~`xl^+cVW_&-f#0gC zaNov;Cbf}`EKd5EDhkiX`#Y&>Wvx_QDe99If&b7Ae)7^ngisi{k};4nf?NzBSo8~s zf~HLow_gZq#jOZ5aop4@NuEa9+$cqPUW6|b(;|9-D#{=il01Z98F)M$bd2y%8SY6= zC5*x;wm{C?2XOd83|dV=0ccK4P*+p@AZ+wt7*#eCgi*z9RN=G+3s?AFb_z*fY8&R5 z$qS$p9wjQkr`cHVL7EtVLqOqiAy#aVNDB*Kishn^WiSOvbP6oPhv{y{uq@IDLyQmQKMpmUk=ZA<>xK>=6JOT@5iAShHL>kdh2hsFauq(JPB;$0On_Qh( zAw_K98>l{%1l*|~h4iFIjlAVsJRoBOpNs;Wv@ZS$D1%%TgyCm?CuG$u)LJ^WrC<8Kr7}2)|0gM6FZm3ui2FPYL zAE`oTsoj40E3*Ce18P6MZKeIvAj9{`ii8OqB4Mn+BVv{$Y$y_T$zW}&9vy2{j}*aA z=mTNOUsm-9L6M3gOuKTsNO>%!L?=;!9|R20<>EbMt^gt0RN2euMfnIy#Etk%!%H4p zxHMrjF~l>2;bAVpE<@Lf%rV?A;=5|DY=(t<9!Zg*&~mg;hL*d;x$Ajm4jrBn;qv!n zho@Z1`-(;D`FLkTA5poH53%mO(>?KUV!+WrAClO(L!)mh`pbz$IsGN>tm8vEZ0i>_ zG^pwyJv8umWieu39h@ukUg1|7w`*o;0KDq3YUpX#pmO#U`|Ge8v3(tHpG{dkD%-&x zQP~dmplpG}I-D2?)Ru_-n|KeWx)*j(Wo+seRfhG`bEm}HW;G+5B%Y!X z*ggN|-lRCn?j&OzbdC{}(~J}U{5NlZ^46Bqv$frtVf7yz^Pl9Ep#K9p#w3-xH4R3) zg+jS+b@)w@{VLBa#Xc%z>z8S2kamr_O;oo5xS=K3e}h_reJ3a@B4iLt!DdplC6>5> zn`KLphBbO}Yw1bYw1FDw4>e0VU(ql_H48HBH=qWg2KH#OUqf z!Z+Z{+}4G7=|qw60iPQ?Sn-#7*8394_x_bEQ+~}I=40`mOrQ~ZQBpf5G7dP+y+1nr z-Au&j-0TnQW{DUMCA@QJQ=Qur{zDIf|F8z>q^F?JB4}Hk{YO}@1AM(HBcGh-2 zJVy$$-Ecdi96<7@7AjBo4-(hx;9d1W7=(#cJ20K}^L9Qqem-SY&9Sp+gT#Y7cmrL7+%pu#PF@yo zzyVcp|}1@M$wv1k7|OdROO-q;ObYk(ApPjJMx>6SrU{rPCuAr=53u2`!6*~8fr$L8MA=Rr9Iy%kso2q5 z0!RfJIxSf9DE(wnho^_#@6=m18T#jncXsmZw2ULX3^elWl0md61~dcA%e%x>2r$Ic zGitsbZvK^xd~&Bjo>+&uCE)+J=AhL7_+=^q~PfMPJd2Z>yV~< zdLr(+!y(4~$TJG@fC?Cbhm?W->XAm|rlT{iF1Ye>6^W;Rx~P?+sZonI>dO7tD|ro;Q1F)B^AhIH!3~Z;W!Z) zp=WSNxWh33m#n0F$!U|XnS9+9*IjY-RU;GzbmX-wnve8A7c=`Yj zULaA1Om;!-2<+k+@F6MHP** zQ2iq>8c6l*iKyp%U~n|@oQ!J>uCci2uMXv$g8Qks#^IuJ##1?k;>#a-et^oEi9B|D z4dmW#geLRn%Ya>LI*0x_XM2f8rU%5~vf#T{F4QSy%k+ zitDZhP(*Kcrz#{~hkGS1`pZreSwHfA;)b7jJJIuJo*`RNkGFO!D$*Q|YmxJBxUR!B zLtOPUKfN0jcotp}0T02Q{vrvu9M3?&W?eVWm!5)j@dVYwHn{nNOOFY$tokkWkam>FX`(KcSDjJ15{Y6%^0?&w3=&vZl;h2ScDXubHgyCCN zPxbhP7fRR~k>9TRa^#fp5|UWFB1oE$o&F*r8G?5ric34##4=z8BXLTuX6@`d=}$=uOh#od5C^Sv5yKs(K&3rN5}E z@y@P#Gt$fOUf`<0MOEJ?p8hXC=?VgLE?(PJA4K|oyk3rL1+JC2B=Pkgec4r4UkmA= zC~hzE*~lD~<8VBH=MUnl#I*|7L%1HswHntWxc(tb%~c@s+^&nn?t}bJDMk-wtHOHX zJ|st!9pZy>h&ZlAfs+8&8MxD5c@Ac_`+H_DvJj&y756Z8pgBlO~?I#FZhsCAwnb zC?}P3MxI!Gm_O8mzIoI7zIj=5Bc2=3M%(Hfo;$r_!U)%S;+}!7_@%pC-MY)d4Ap?G z0f*yJB&%>ehU;-$PvCkI*FSMRh3jcT-=h*~OOc&=&A@$AKp63^E@DWLE4k-iR2#SB zIsGN0m#J5(aXo`;4X$T#J%{UgTrc3NQN41t&oxn0G8Y%$IbA2mQR!oYvP-%TbX_1G zWUhg-#Rd@${+=sPMb{$zBCfT#Uc!a%9KeiYJ+4WzN&U1dx z@27T_$vA>Z2`S;2*8ROyZ?B^*ENp6ng<(of8z9cr^cM@B#Pi2Jet+-YfTRKGn{W)o z$+z?qN;wOwifZ@nZZ*K;IZpN4@D98S`iN2i9Z8s3y+CW8=*GE?ZLD+t$V>ws+mGvS zd~oi4$2sojJ!W$`O%q%)A%Lg&DN-N6hae7pB%90B$>RM9thf$^-r(_^rut(z1D}9| zdQ6-p{uKTUe}QxG8T?g$)JFBq{+eVqG{QIVEnI{p&;c4Q{9UhKcLvXz#k7OZy*ba~b{x{Bp6loeFfe zTI$^0;UwuR)XSpt0 z`1|ypPPFA$OPwe&0!U}G$`iv8wPPOQ04uUQ;41liC4NOOIH)m%S-I-l- zw{yr!pq+EGE!Cg5S25AD5>hFY(8RG$)^B&jJ)kE9LN5q{U5_??x@C?F5-tu2i%FnoGyA}Dir!a81#jH&>zB07c2EI zI;q*=GEn(n_~cHXHMcY-EiF2>I3urQT0y~NCeG}Ur-xnba*V#mU&Wg)FQbyMmBXiu zY5=AO!i_Kp215i4fuW|$d-R8wTes8so$Zd)5NU>Xq_f&IRQBIbu_OV3r-$8hrF=(= z@(7OnXV2;K8`MaDnT~YwJ3sUIy_0z$Mn`r~A^gOaGp(*2ta|I#UDRt`rBzvsa}OMk zW)miTn@;mmH|n8Xl&|g-peC4^JrX0E#8UlgfQm8ua(t|D$8&PHj8OY`Qh{n5*2mik ze6p*WZLU#!8o2x4{BCNjQJp92-0BX2L9(t;2e7Rb|Y*sFK<9C6>_gD3L-Lf3?Nz ziA_DM!{xT2|7hc|Uso04JF(T@eH5oWwW$RyN_G4eg#kf&Ms zs$N!po<{CWRrEqWCPiA}}!NHjQ zDA;76%A1tO5|F99Jg&t8K&A9!z1>ldckI_C z82g_GV*f68)S>REX>@heq1Y4yk?%$Z>1_XQ!ZbVnEFjxMoT9vp`JbeNT= zB9qWK(Z~mcAivKYU0*97NTu8R;l9Yr`&s#AY9!RM(z(Gu?~Q!3l`rgX_?}J=h`M<-hJajzkQJTeIOQQ z5-!Y;6PsQfu0p)_%jU7tEbLN>Tb#(cca*!~5`_}_&D3oMvf&)$jyxoqnfgx=D#zIU zBH7t+@`;0HUOmz&y=sW+YFb3jbgUH5GM?|hk?r9(SUO_8PZ(-vU>6PD%Qt=~6Zr3; zYIw9bQjS!D{~R&l@%$F~tMEJEm5S$ecms|?gEf10m^GU;yV>j~!!Y}Jq@B|s%t@%b z$#_-}!JP6J+;}Xl)KyVdex63ISCvu7$3xm__+_EoG=5E7G}@CBN<^EG;m-S3akUc&rTqstqK&KKQE=P^Ab zUQIW{t+~BXzUK#_YO{I2s%P1 z@Yn6fs$OQ1HPXyEGd*rrMgUDE>|JR5`f3z@^}w&UOzU&hxt`pcG3K*hY_=n4 z$Z?#G!ntUOfmj$0eD}aFLwId!?x$H(dG!5!ib^t9!h_D8iR7tvCQec)Avf1CItuY< z7z6Pz7RJGNNWf^h{wj$LeQc67x?^#((F;k|Xeq`d_%3mbCL*2y6JZiehAA)=l8n)f z(=qz-G;1^=ui0qLbbHSPU`)cUrD9ZHnan*i$B2g{Bd(ZX#b;^f4l^RziVq-?kW^sA zPfSHT--zFyi8y$s6<6gqi;vH=;uJ&@&KDZ-_-TmKjksVo;={A7IFx#~=lt1fY?xfj zCJH5#6>~mfyo(?cWF=;qmDoo|%vHN9Wd+t1HLpPbW!wie%z?#_3wf{vmIABLlTR#5 ziS^=1hXV42Pz1#wcg!;45?BtUAk(;l_)d_4nU6)$kvb(s_3S22G~%iIk#r|c+~uub zo~;5auh-!!j8sAutOn_D4e`CO7S@4uxSsevxY}XVh^rrkC+22nE;TQSoo%R^KHdIf zOFSMne-B@jReJ8nzyq)WYG5N=t6Z-!df0^-zz#1Fw%co@W~M~F2vI~ALpSGe@5 zW6LKy4h7-Fj&4CH2n}SmA$k;k29E)MORF+Pg+%Qn{S-V6zl2?|8=iqZuow2hv#=lP zw7OOGHdlVH>BH$Fbvf^gsD2(^fCKO=_%$4a>y7ykxmD;EAShTF&`oR zEi{igPVc-`bu~^T(6Kx77f8QK!{5Pc@H)H!N1*}4i8qN`-hRi(zXiwPZ4f8kA$}K5 z!0$nv_yh4Dq1lPyI&PloJVI{2lP#PmFLf^eNgDGI_xy=io}Tg~IzKHW)ZB7GXo z$8ZK@(SBkdpAXMd5$3(|P8zw7&Da&ZHKO6C@Mri7=*{y~AfEwca6PDZUuvY>>Fkc@ zX!9BT6+Vaa@CE!0zGRz;*Cq4SezS$=BX@R~P(5RTdc+(n)3GCAdl?T$G+)8r;cIAw zZ{ShhV= zmaDiQ_5C3n27oN6fy6h$AQ%j?iX(`JK=Xo%9%&ZRwHx|LoN!lE?ix;3h=xHV^uHS%1w0YB0x<<}JFNMk_JG6%Hkni*MdryUiFfPlzzK$yFlqPeZ4;HR#rQeow8hI-Fn{5 zZPcCf)D-XMHt7XZg-myOX3os9Q`}tn6fiHB(ZthZcKT96%aBia!deaiseTuB5 zEQ)u&Vyt=&kZwbg-HD7Ks=0vaWEbdAQ2|OM3@AVVG8&<{d^y21efq%kg{pyr$fyKmIk!4 z?X#$xL3y$d=bg(m7Nl?{g|ncZ#wWnJ9_*&n&8B<~h!N>P%5EZmGc=JGq--wv6u5xC zn*4UCgV!K{!J6+?iPAT*Y52tOT{Ml|k`wbAaT}4J+VklH@j;P zlOuOV0_75RZf2WCa0kSZmkS_e3(2R!5%PkRrIXKqGHjfN9+X8u0;E7IXrz1x)IfrC zK)8$_T;xh~mEBIH(7noTCsO8Kh3%=Y7f4=jGZm$$b)8o@k|_gOUjfXah}B5r`c9cKFBxP zPwU`PHA7Wx<(abkU}33h?d4askJ{R8{Oc6Y9bC0SUGeg(eUXwKkMqUFVJT_lrEAL6 zkKQ|8*Z1G8j;h8ty!}4#(VJGPew9tXh~rmHEFyo6TFvkdsxP@!wfIfWdnP{C26 zJ^MejWmfx&(fU`YVS4H+6<~Ie6zU}Wv|qhql^SH~w_U&f#Z@ZAY@es8FMmpZx=M93 zdHHDqd9O;F4|Vc=$QyeJ)^x7jw5 z4fa)L9Hjnjcn97E2`6?t^LoOEDX7q)tGFB9qwak;1s}kN z@R1IxQg@}v-S7w!nf5AT3Gx)EvuP=hx9OHsdT2NQIM^S({f>Fp|C%B`!x*T#%S>(h^qf4y+pn2JE2zEhd8X2PLy$Vsa64c&w3Slhd6VJmSVB~Iu;u#6Xzu4 z*EtpkS&M^-BVY&&g<%j0Q4kF=+P|93fBb#Q*L<{@gI+?*!M3!2*4mFnTj8TuuUFkV zj3zw>;$f`V3%o6IG8>Bc``Z7om-3wB?>J+Rb0u*CB*Fxk2$NtkOo6FlzxOCH9f$P4 zxq8W(PC_P^b{g??om;Ik$IFbqN41!#y`GupJc--Sag%#(f8OzLhBcB*JX5#3-x|4x zYB3T^e625ApXVoTULqormK3Aicy%S9}53(8<_>8R|o%Vib~8exdEYcB%wV5F;ZcT%q@+I&d)AfT$*bI)XBIn(Ox=~kYF{dM5Djn zs=AxoE`s7yhqeF1s@v@%Nha@hBX2)sT~#8fGJcIJy}LL&Ew3=ANKDGOs%SH}G)~@w bWM(Wcb>4nBHWKUp -#include -#include -#include - -using namespace peg; - -int main(void) { - parser parser(R"( -S <- (Decl / Ref)* -Decl <- 'decl' symbol(Name) -Ref <- 'ref' symbol_reference(Name) -Name <- < [a-zA-Z]+ > -%whitespace <- [ \t\r\n]* - -symbol(s) <- < s > -symbol_reference(s) <- < s > -)"); - - std::set dic; - - parser[R"(symbol)"].predicate = - [&](const SemanticValues &vs, const std::any & /*dt*/, std::string &msg) { - auto tok = vs.token_to_string(); - if (dic.find(tok) != dic.end()) { - msg = "'" + tok + "' already exists..."; - return false; - } - dic.insert(tok); - return true; - }; - - parser[R"(symbol_reference)"].predicate = - [&](const SemanticValues &vs, const std::any & /*dt*/, std::string &msg) { - auto tok = vs.token_to_string(); - if (dic.find(tok) == dic.end()) { - msg = "'" + tok + "' doesn't exists..."; - return false; - } - return true; - }; - - parser.enable_ast(); - - parser.log = [](size_t line, size_t col, const std::string &msg) { - std::cerr << line << ":" << col << ": " << msg << "\n"; - }; - - const auto source = R"(decl aaa -ref aaa -ref bbb -)"; - - std::shared_ptr ast; - if (parser.parse(source, ast)) { - ast = parser.optimize_ast(ast); - std::cout << ast_to_s(ast); - return 0; - } - - return -1; -} diff --git a/peglib.h b/peglib.h index 4503d55..da9e89d 100644 --- a/peglib.h +++ b/peglib.h @@ -833,6 +833,8 @@ public: std::any trace_data; const bool verbose_trace; + std::map> symbol_tables; + Log log; Context(const char *path, const char *s, size_t l, size_t def_count, @@ -1950,7 +1952,7 @@ struct DetectLeftRecursion : public Ope::Visitor { private: std::string name_; - std::set refs_; + std::unordered_set refs_; bool done_ = false; }; @@ -2425,6 +2427,10 @@ public: std::string error_message; bool no_ast_opt = false; + bool declare_symbol = false; + bool check_symbol = false; + std::string symbol_table_name; + bool eoi_check = true; private: @@ -2691,13 +2697,40 @@ inline size_t Holder::parse_core(const char *s, size_t n, SemanticValues &vs, c.rule_stack.pop_back(); std::string msg; - if (outer_->predicate && !outer_->predicate(vs, dt, msg)) { + + if (success(len)) { + if (outer_->predicate && !outer_->predicate(vs, dt, msg)) { + len = static_cast(-1); + } else if (outer_->declare_symbol) { + assert(outer_->is_token()); + auto symbol = vs.token_to_string(); + auto &table = c.symbol_tables[outer_->symbol_table_name]; + auto ret = table.find(symbol) != table.end(); + if (ret) { + msg = "'" + symbol + "' already exists."; + len = static_cast(-1); + } else { + table.insert(symbol); + } + } else if (outer_->check_symbol) { + assert(outer_->is_token()); + auto symbol = vs.token_to_string(); + auto &table = c.symbol_tables[outer_->symbol_table_name]; + auto ret = table.find(symbol) != table.end(); + if (!ret) { + msg = "'" + symbol + "' doesn't exist."; + len = static_cast(-1); + } + } + } + + if (fail(len)) { if (c.log && !msg.empty() && c.error_info.message_pos < s) { c.error_info.message_pos = s; c.error_info.message = msg; } - len = static_cast(-1); } + return len; } @@ -3378,8 +3411,9 @@ private: opt(seq(g["InstructionItem"], zom(seq(g["InstructionItemSeparator"], g["InstructionItem"])))), g["EndBlacket"]); - g["InstructionItem"] <= - cho(g["PrecedenceClimbing"], g["ErrorMessage"], g["NoAstOpt"]); + g["InstructionItem"] <= cho(g["PrecedenceClimbing"], g["ErrorMessage"], + g["NoAstOpt"], g["DeclareSymbol"], + g["CheckSymbol"]); ~g["InstructionItemSeparator"] <= seq(chr(';'), g["Spacing"]); ~g["SpacesZom"] <= zom(g["Space"]); @@ -3412,6 +3446,12 @@ private: // No Ast node optimazation instruction g["NoAstOpt"] <= seq(lit("no_ast_opt"), g["SpacesZom"]); + // Symbol table instruction + g["DeclareSymbol"] <= seq(lit("declare_symbol"), g["SpacesZom"], + g["Identifier"], g["SpacesZom"]); + g["CheckSymbol"] <= seq(lit("check_symbol"), g["SpacesZom"], + g["Identifier"], g["SpacesZom"]); + // Set definition names for (auto &x : g) { x.second.name = x.first; @@ -3441,13 +3481,16 @@ private: if (has_instructions) { auto index = is_macro ? 5 : 4; - std::set types; + std::unordered_set types; for (const auto &instruction : std::any_cast>(vs[index])) { const auto &type = instruction.type; if (types.find(type) == types.end()) { data.instructions[name].push_back(instruction); types.insert(instruction.type); + if (type == "declare_symbol" || type == "check_symbol") { + if (!TokenChecker::is_token(*ope)) { ope = tok(ope); } + } } else { data.duplicates_of_instruction.emplace_back(type, instruction.sv.data()); @@ -3811,6 +3854,22 @@ private: return instruction; }; + g["DeclareSymbol"] = [](const SemanticValues &vs) { + Instruction instruction; + instruction.type = "declare_symbol"; + instruction.data = std::string("default"); + instruction.sv = vs.sv(); + return instruction; + }; + + g["CheckSymbol"] = [](const SemanticValues &vs) { + Instruction instruction; + instruction.type = "check_symbol"; + instruction.data = std::string("default"); + instruction.sv = vs.sv(); + return instruction; + }; + g["Instruction"] = [](const SemanticValues &vs) { return vs.transform(); }; @@ -4061,6 +4120,12 @@ private: rule.error_message = std::any_cast(instruction.data); } else if (instruction.type == "no_ast_opt") { rule.no_ast_opt = true; + } else if (instruction.type == "declare_symbol") { + rule.declare_symbol = true; + rule.symbol_table_name = std::any_cast(instruction.data); + } else if (instruction.type == "check_symbol") { + rule.check_symbol = true; + rule.symbol_table_name = std::any_cast(instruction.data); } } } diff --git a/test/test2.cc b/test/test2.cc index 71db796..846936c 100644 --- a/test/test2.cc +++ b/test/test2.cc @@ -861,6 +861,115 @@ TEST(PredicateTest, Semantic_predicate_test) { EXPECT_FALSE(parser.parse("200", val)); } +TEST(SymbolTableTest, symbol_instruction_test) { + parser parser(R"( +S <- (Decl / Ref)* +Decl <- 'decl' symbol(Name) +Ref <- 'ref' is_symbol(Name) +Name <- < [a-zA-Z]+ > +%whitespace <- [ \t\r\n]* + +symbol(s) <- s { declare_symbol var_table } +is_symbol(s) <- s { check_symbol var_table } +)"); + + { + const auto source = R"(decl aaa +ref aaa +ref bbb +)"; + parser.log = [](size_t line, size_t col, const std::string &msg) { + EXPECT_EQ(3, line); + EXPECT_EQ(5, col); + EXPECT_EQ("'bbb' doesn't exist.", msg); + }; + EXPECT_FALSE(parser.parse(source)); + } + + { + const auto source = R"(decl aaa +ref aaa +decl aaa +)"; + parser.log = [](size_t line, size_t col, const std::string &msg) { + EXPECT_EQ(3, line); + EXPECT_EQ(6, col); + EXPECT_EQ("'aaa' already exists.", msg); + }; + EXPECT_FALSE(parser.parse(source)); + } +} + +TEST(SymbolTableTest, with_predicate_test) { + parser parser(R"( +S <- (Decl / Ref)* +Decl <- 'decl' symbol(Name) +Ref <- 'ref' is_symbol(Name) +Name <- < [a-zA-Z]+ > +%whitespace <- [ \t\r\n]* + +# These must be tokens. +symbol(s) <- < s > +is_symbol(s) <- < s > +)"); + + std::set dic; + + parser[R"(symbol)"].predicate = + [&](const SemanticValues &vs, const std::any & /*dt*/, std::string &msg) { + auto tok = vs.token_to_string(); + if (dic.find(tok) != dic.end()) { + msg = "'" + tok + "' already exists."; + return false; + } + dic.insert(tok); + return true; + }; + + parser[R"(is_symbol)"].predicate = + [&](const SemanticValues &vs, const std::any & /*dt*/, std::string &msg) { + auto tok = vs.token_to_string(); + if (dic.find(tok) == dic.end()) { + msg = "'" + tok + "' doesn't exist."; + return false; + } + return true; + }; + + parser.enable_ast(); + + { + const auto source = R"(decl aaa +ref aaa +ref bbb +)"; + parser.log = [](size_t line, size_t col, const std::string &msg) { + EXPECT_EQ(3, line); + EXPECT_EQ(5, col); + EXPECT_EQ("'bbb' doesn't exist.", msg); + }; + std::shared_ptr ast; + dic.clear(); + EXPECT_FALSE(parser.parse(source, ast)); + } + + { + const auto source = R"(decl aaa +ref aaa +decl aaa +)"; + parser.log = [](size_t line, size_t col, const std::string &msg) { + std::cerr << line << ":" << col << ": " << msg << "\n"; + EXPECT_EQ(3, line); + EXPECT_EQ(6, col); + EXPECT_EQ("'aaa' already exists.", msg); + }; + std::shared_ptr ast; + dic.clear(); + EXPECT_FALSE(parser.parse(source, ast)); + } +} + TEST(UnicodeTest, Japanese_character) { peg::parser parser(u8R"( 文 <- 修飾語? 主語 述語 '。'