From faa7f64873bd7538ef8b930fa8a5205c1fd4a08f Mon Sep 17 00:00:00 2001 From: cppbear Date: Sat, 10 Oct 2026 11:18:43 +0800 Subject: [PATCH 1/4] feat(site): illustrate PALM analysis and test generation --- site/README.md | 14 +- site/assets/icons.svg | 16 + site/assets/social-preview.png | Bin 0 -> 151957 bytes site/assets/social-preview.svg | 24 + site/index.html | 901 +++++++++---- site/main.js | 101 +- site/styles.css | 2297 +++++++++++++++++++++++++------- 7 files changed, 2634 insertions(+), 719 deletions(-) create mode 100644 site/assets/icons.svg create mode 100644 site/assets/social-preview.png create mode 100644 site/assets/social-preview.svg diff --git a/site/README.md b/site/README.md index 2c936dc242..1893d5e923 100644 --- a/site/README.md +++ b/site/README.md @@ -6,8 +6,18 @@ The GitHub Pages site is plain HTML, CSS, and JavaScript. Preview from the repos python3 -m http.server 8000 --directory site ``` -Open `http://localhost:8000`. The branch selector is an illustration of `examples/minimal`, not a live model or Rust execution. Keep detailed instructions in the repository and link to them from the site. +Open `http://localhost:8000`. Keep detailed instructions in the repository and link to them from the site. + +The page illustrates the offline fixture in `examples/minimal`; it does not execute Rust or call a model. The source, branch choices, and assertions come from `examples/minimal/src/lib.rs` and `scripts/check_minimal.py`. The extracted conditions are `support::positive(value)` being true or false. The context excerpt marks the omitted `threshold` body explicitly; its arithmetic behavior is explained using the original source, not presented as a normalized analysis result. + +The optional path walkthrough highlights source, branch, and assertion in sequence. It can be stopped or replayed; changing the input cancels the current sequence. At the single-column breakpoint (760px and below), or with reduced-motion preferences, **Show path summary** displays the complete explanation immediately. Switching into either mode ends an active sequence. Without JavaScript, the fixed example and native context disclosure remain available, while inactive controls stay hidden. + +The `nested::double` compilation repair is a separate fixed-response example from that script. Status labels describe the fixture checks, not a live execution or a measurement of model quality. Display snippets omit test wrappers and helper assertions. The Pages workflow publishes only this directory after relevant changes reach `main`. In repository **Settings → Pages**, select **GitHub Actions** as the source. Project-relative asset URLs work under `/PALM/`. -The self-hosted Sora semibold font is from [Google Fonts](https://github.com/google/fonts/tree/main/ofl/sora), licensed under the [SIL Open Font License](assets/OFL-Sora.md). The geometric PALM mark is part of this project's MIT-licensed source. +The self-hosted Sora semibold font is from [Google Fonts](https://github.com/google/fonts/tree/main/ofl/sora), licensed under the [SIL Open Font License](assets/OFL-Sora.md). The geometric PALM mark and interface icons are part of this project's MIT-licensed source. + +Sharing metadata uses the canonical URL `https://cppbear.github.io/PALM/` and `assets/social-preview.png`. The 1200 × 630 PNG is a browser export of the editable `assets/social-preview.svg`, which embeds the same licensed Sora font. To refresh it, open the SVG in a browser at 1200 × 630, wait for fonts to load, and capture the viewport at device scale 1. Keep the image dimensions and descriptions in `index.html` in sync. These assets are static; no build step is needed to serve the site. Social-platform previews can be checked after deployment. + +The research section links to the maintained paper, poster, presentation, and citation. The poster and presentation describe the paper’s experiments rather than a new evaluation of the maintained implementation. diff --git a/site/assets/icons.svg b/site/assets/icons.svg new file mode 100644 index 0000000000..c4c3365fa6 --- /dev/null +++ b/site/assets/icons.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/site/assets/social-preview.png b/site/assets/social-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..c3691a684f2702dd748852e8a93f22acf27ecef1 GIT binary patch literal 151957 zcmZ_0WmMZ;*Y%4PEAH;nLUFg?ZUu@$>mfobjA@ykEm0?ELrIbN%LAn?$_UQN_ol!9_tq!B^8|fge`ad*x40V^d8in#%<^&x<|xiobsQ_VwG>@bGXBFKwHdUD+Rf zBtbv=OcEDtdMmTZYF>XY4flL)@+F~Tv{uvf_6YXWA=U&*2f@bDec>I)hi91&;*ev% zYZwIa>sYJ({Afg1wq424CVHy%2CCm$9W%G&FIb(-;BRq1`M6edxVi)6@l3|gvAw1M zI2bMOgWEnX{IPjLahszjujW}T`++>B^wk@Y(bH8v?d{XenOR9Axoo!Ero-g z&hCAZ=ysaMlhe12zIA97lJ2sg^7D+Eu<;uyP6SMXscv)O0KWk{q>5~vAB3>^ygD;0HD*)^HL3DD!i{nc@>g@IOqkqs!*s;M5~JDpEcQov(cr8F0jpsB~vWAjNZ)Y$|?T>Q!B zq1hbZZtwlZL23k^h3RA!w!JW?wQ9K+Ei~{GB*+3N+Rk`|3W!?%dxc0dgC&A^*g{QBLXom?cM47T)-mJ?6%w(vJ z!Dac5HH$)~0*qR-*>$dFv0zq$_XFv+GEVKAA-b-5kbz8xU4*KIO}6HNk$CS{tzJ{6 zMG}oM4e``5UeYL#u-@J;=8SdFU1o2iWCsh&qUD}SuijZY+^Z8zA;H#)@ir?5f3LyB zg*K6bkEezHAa3DN`BpfFd_GopNoZY*NwCJ2uqQ`nMJEq9zC!VyyuXtVm0T`*@WnE` zQ~N!JRM_6>G7OeecZi_?p}n{LG&A;B?%@x`%JuA0CK2Y+Y@uIonbL_pj3STq=0tWBO~9@PBt37tRduZ@ji}n=}D9JAq&ecG@w3jWTeTk ziiOD`oA@|ke6^Wp`@Gor$20LLKFUoxbM?c4!>+u&TFWD^u}xQ0(-3i6LbJIKW(pC* z&ojynY~GOdF?hssEO9V9Z&*HCD5`E-VNI*o+gbSG^Fs<%c^Sxz-Drd^a&$g|$rMWg|DM~IsIDex&|x_ug(}X< zc(yU7b+a)=M6BA5KZDY|DP(*Fn^{dJ-lE$E!NF2E-`) zW_2L;IbQX>#*Rv!3qI!tonx7Aa?K9N$W2V0151trHTKNU=CizM!FQ9M!xTS*vtUks zAEtaLZhXk+PEQBDPY-s>t1v$CEA%gYi~3s&M~@dip+rmaHteVTeZzg=HpxrVg)E2^l4pj zM|jLLIjE))7Mn*S;T}3#0JD`Wr7_^f4mTal^Jm`y8$ikrce1mOgQP~h*8Xq43@R{p z+ja;};QEP1MzzP4rHrbdgDl|7mQsE1+8`_^!L>eGPBCB#@j?z~b8!Li*c?lf;rRFC z^X($6#DQaG7o$+4>}#TwkZUhyG))0Njqs+S5Xh0IgPi${a|*a^$iV}%Mh-)ITj(bs zV!WnXBTU>TK7K*TS85mzutW4o%$O#60RT-in;;|qCzj~cEAjK;KJye_@KM+@GXSe) zRbuPS*L&oNVQr;;%T_bpocWnURMl?MmS-~9)WmEPCMvd_ibH!Wp;Hf+)(NevbKpK3 z_np$;W7l(R41PZ8;~~B{d`yOndx_F!vfOgkFx&aMg5va0Qf}CO@pAk z)bhWFV0Xz$D~voBpO}n$A+#$>fAa`hmc5T;bDD_0*1(sPC$qvTZfwWEHP+DKlbE4KFau@Ic<2zB4b zRr1_PLa-vM-pv~+beMV?aJVVzRVO&sDvKKaTH*AwKpz618tVI_Ynqi9SUWlDi!HVB zN;_+aYXlA!P!=bvhzuT;+JdCKwlN}TbpM9BM;Dt)04{97=Qy{6PW{25;hxb^pjQa%2Vpg(v&b7h5$9L{r6q zfFyb_imQ4t|3H)Sm??}?oBOR~V|UD~#gU5vcLT$8IhOV&7G4Fq4I{i>ejsrfc2!$( zj5yrKkx_gB)oXcp?pL4B2{{k9j>%uYcwWlq|LdMN~KY2`Ce{6%G$e&T8L-szuyG!s`+~MG&JxqBKbeD?Dw8y%yo}9{y zB%0L^UfrHdWeWZG$2!9d?y+oqPKvvqBNoxzuzUbHQh`^tJPS%2TqT^fD$_u4&|}zW zv4J~Cfby8G^-^>EFB`%vVF4vu^q9HN1m^`)@{ruG1{u{r(TG_hSy1vs%{#Wwv|nHJ znF1XMNmoB4xK07{7un2AbLR2$imqF9aq4D@&yeyp2_&&(C^+_Rm_q0Y!G! zxjfBu@cM5XkRY$Gpuu@5i$4LKB9Z(ey))^I}2NLmh z6?z%J%3{559GI{}H)>3tIKr)8mJ`$f7_2ZngW`nko^ed_W6YXtX$>lm!Ma^*b%z`B zNHSf*o%v$xsw<8R`@j@dSveIj<5w(YHNELeuTF0%dyalOu+!7!=SwgnPv=Cfutyv5 z3XaQPXKTm)xB}FdcVrcuYl>>Zn~OA*ItnX_NIox8wB;(-T!IrIyb>li@obnS1)YZB z3)TgSbOLH>2mdZPl-j#{F`V&jm>0!=G?)VJCbi5(iA3KN;EEK?GZBZfV95hu?#_9! zlKnt6mU}~OXoj;Rem&y4esMPB`cBYsxJl=Qi}y@ry^a;vKPZN)>+#cvx5H2Pn0ZXD zybnB0dX^N;#z+Od;2PsnnERlYBz$Cv2{c;Y(z=KBZu?>zy93}o)Tx3F*Zhn88bm=e zI@Yh=a+i4NigS*zK?lj;pQG24546Crob&`8zO~q89Jtmnt-nyAv8me)`rC_IQiU{Q z>ySJ}h#*XWG;4-{!>6d=7fJ%F`~rgjO#Vg+7{9QMy?&sY5&$9fHv5ux628e>Pvcs( z#UMh~AN7|Wz7sUgUp4F%G#*&jzeF1!F^=!G>KH*dq;y)_bKX+sJcOrHC=6-aWEL!yy)i|o~=nXsM zcBYvjD?q@!eLqx)60JDoIax=By|-CDy!>BVWy+N4mcpTH*Pw7Jq1#cDAtCh~3UdDP zW>ZUa0o5oqGesRB8?}TFtR;?4D4s3>bKJ5bN`G2=_iOykZ|8)pZrTrt{)tCP+}&Bc zSs`rN5{G|KOl#&p#ZS~3)H3UP(|DSdJh@;K!<`1PBo^XPwH*s-{n)bkwNRYskCyW! z_lPexDeZ0Pg^buPWXK)%dk)8@Znol-O=^2tc>u{Q;iQzGwm_lcByUKZ2iFwEhv9U! z_l>k~1QRTe3cGaZ-fw`)b@y&vbCKsK3)y*vV4p2K2oPV9h$RRRg5$LPo#>f9q4X+$ z7MEn#-(u{xRTwp+KKmOMHu-T`betZIwaMBY{YR@|@jH*L$8f)07M-5Ykz2o9PY?4X z6sdmZ)9QZVpv(A4U1bRWi}>h^!{EYR@l}K7dMrqYR8~=(;$M}t-=hZ>?s0I?;$FCz z-e~QS@5lt}r*EHs3>Bj1LmEK~ua*c`!AaH-ayk8C4#Y~#_$Va|qhj~F{vjElcNknB zFf1`p$5@wiMbSVr*jX347p44~*T(CaYe`&0TZp!$80zu(U%6G~`0!==---(Y>k<)o zGufaaz3e1!vyVET`AL4_qtNrf1g@nxdqox<_O$;e3urby(@w$J07Od1b3N$qyPF9})dV;8aNs+(oEB+#+UCsKKWN|BN3>?p zRKO}0!Mg?F_Yl3rV~kAZ1IMEG!Q1CF*Y0bp^BTX^JTP4%b(UCVtiBN(REl#?_wIA9 z%LF4lbjsG$0dd?gCabTR$>XjK*6tiPjVfP?-fxRPul=!oPPOrm>bZ@=t-OtQC)@36 z6D&~mA)_bs5>RF~oK){WAf#h3-FOFk;lX>jU{bbcP;QV;QJTv(nqAQ~7*yaFQ+Tv9 z_2KwkxgpLKXvu(#0i90+Wt054 z>@Xa8zI8cf5I%k*MDS>^+ahE7_iLgvfhmgf$rB`;S+YfpBU)q%#c5juA{Ll={(xqS zJYxz=FD`B(GuYy&;P2;889k#_~_ix6G9IF!XfxW_`(W||7y=n}= zktYU)7vK=>Gard9P!<>wyeTkMZer}kf#lOMJJypg8R~#0Z@1c2{?pIIf4a~$cFU!f zjVz=9j>l}o5TCJ~#;SC>99c_cEDvs>@cA}t%9_c>u9h|RT~=WvVw4Il;Ss&-A3a2R zq2NvsX3uRkNyz}I;}%&}z+b z?X=)99H`f(cST%4ANgOY%gYA>^QCw$^658Ma4ysVqvwZKNHI;=#QVv=p-t@jNd>@( zwA_LV9aXc@N^E8B={k!~o#)E}8(QCkPr zumz$~oj#*LJ>qX}6PbZ}jYe4EcyI>k-HGbLU;>R=#STk5Y4<|fi*hiGNcEeBjq8Rl z_GzZ6$G_GBWS83ZvYJ%Y^oDNVz^?5ZuII_iQ?&jEaN>BoF5jL+|yCOxREVlLDWacs?5{=OeUDM$0u>z zw7?sZ{ztO#f1KFGt3>dMf z4vxKiX*u|5PAjuMjtZ!7(%xbJF%>SCN^h$StGAJK+=KGjIdxRqgME>I=$9PNS}+!C z_cF@FU>MsgSOUGTLm34-Ot`~Iq_VE*BWV`# zmh><@f^mC8BqFKy+wPnKR3e3}Uwck5I5IDJ zp&$zhf|T(fp>RrT;10-~o*tsz5ysz1nsgZ2u-6>Eh*W#zhxRhNr#l>^tC2M9VuL~} z4l!jq{_aHZ%hNT`%qKg@OP!FJPyy#f{#wmmXfv(B%&<;zj$i^JX!~U~mL#v~P8tDq zk^X;6*e}Z`dA5)+1ByhgJ145DZDT5DF%`tgfxcXOv&RSweNq~T+%=RuOm!I#ek0DFdMvuHxd zqdbOe6+Vdn53#DB>+J|4U!OZWSpTnbpc$9fok@h*bI@|1_+oP+q;tdvx0KV+318&Y z#qO6kdx58ZQ^H&fm?_;USJQ=Byvf7k3i&S}tS5{P0Uol&uFM&n^t(v3+9%>dKKXL4 zyk989M%63-Whtg|Lhb~o0|O*XnIG2MWg=n94Y_ei;G+~R78pBRzLex2dU;jvAqjX* z+CRz$wWXF_UW!3Fcb&5q13}wp-}`RgS}Gn%{9y>xFsv$+js#j!y z(7I4n_kA^$N%3Whz~czxmJPat@ZzILm__zDtF)8C@ODX7DCwr!Yw82|80ov}aOB7H z{M+;~2_7_u5g<8)+;fkhBfRL^21z+P@#}T@uuu_p&)13cXNN3XfkLa<$m07C1nG8! zoh3sE^Ck17_%+s6xk^x=nZw}kwf4AW)&Znq`FD(R z!Z=D89sA+k?UvqV3J(e7>e2bf^;-Wnw%lrQV?V6=Fu%wc;(vrehvxFUb+#Gy8yR&k zr2WMKj$}rY5gCQQN~cg)X_leMx+8e@$!5C{5zm~HGAu^Ndj1}q1}1zL%QA3#)M0e? zUyaC`;L7*>KQw}e>R*j$LTZGH#3Iuci+$5hom3#_?RQ??iJO*%xbz6sCfxWX)*i1293l3DX=?|TSKk=pd`x4q#XslaB zOH5UF(6oJQDSfN$kEfQZ?H*!*z+vMk~pIL z2Jwon6}g~zZKRM`|A$KK`~3(vFgB1%yz~73g^-!?TP((RJ-|vEgqeDSZ;yoT13(H< z-UEpH$Fm7@&n0I@j7ta$EfO8L=$=Wew(NWzPfrwE(Xp1c3Kkhg{{aGK&}^9!_Y=!R z9U7t1Pk4m2+r*r^^65;G8C|hB41%?2YUY*j_B<_Q>X8*@VyKmY%2NKhMaBjabm9$@ zGhsAhnO!J)^(4-DRDZ$0LEOKJJdT`*6`ph@h$c)(!X4>r;U*4S_3BHO8+WNY!Q=ju zoOj(>edbCOonh77O+uIdK*{rdJzeoTWx|jKw#1|}WkCK%tu!spEN?#P4&&nGbMeV0 zJe-ikIJ^F1jE?}M#PYY8C>e#C8|pu3@QH8fvt*>z!yzu!Qat}@Itv@f2n#9K6??=@ zLW|bk2Wm>g)(jGP27^k!IYRsAtw+2iKXe;4Kc&k;sv>OVdK{ zHoWNI_paEalpG!MQ$BEhfx_CD>+2M_BXrvPP#C0 zT_5wArT~z>f|341-!*Q-K5)=3-``&C#dqlhayQM@3AV()cX-U@>vlHpN19S?(mRZ! zr|3)5l<^z0d1ZB31KuXZ=+{Y+*j^!<6F5cxW8!$aM<@?(wKjOCK?wR%#{R#aEpzItM4|SwB0=|Ur+~Iw{hh?mqrBBn-bT8S^zR@gJT7U8ZLO|9G-RU0`Uw8bIeIKmA zYPfgrthIR-UTtu(wj?s?Cyoo@7*Npn$@lInw)VQ^SgVKpqGY9PlKL4|T{Ii}Pi7S+ zX5qV|7|^lVZC({{@#xF&_I^mHlrg>I4_BR-mF;N7{L;Io^yR~!u^P^|$Vf}v3}UeI zPoA~@zw)fWr)W5iNCS32I;05_yP*vT4SXoyAdLd9tpyqRd7?gYl+R^z0h zn5fy`B6_5}&UB(Cx(`U!h3eX-q@V_Z*g_Hg5?>U(-kp77JToec}CWA*E ze`no|`i=t*kM55BEnCeoK7EBha6M5XJZrIGFxWmkO-zz)Uf^H=&8I)t%g?R`C9+znEi~iwzQr$J>)~ zv$_we`VAhvj4O^vs%SJlU-16WfG`qzlN;PT-VuuV0##m*Q{qjB*)lzqEIkmRUMQ2yOw^UI3ndTQLhbQvnI(otl1d6*^?3l zT}~0zaYBY;cvgvYRH+vHPi4^bvH`{44+*Z<3&5ayG*4oC@|?>%r(Mh?ivP(1@+INx zW4JCCh|I7WWH&n@nH~P+f`j;Hs`2JuV_2E|{(ymlR^?25+5{<3&)`bP5F>39LcymF z&gv2h9^LZAR{l?FMl7rus7~;y1+UcV8=HWScTn(3LR7zwjvH$hCqzZaQG^uIrP%fp zjG=U3D7W~j{NU<~!{A?G5BNl}G!R?DHKdUgM)b#O!y01CA^nN_^Kb}Z^tj8!NSo}> zUkrSU)(&T=1I#lNaHF(ogjb0gGd?X;2-(R-Wnd9fJTh9Jm6rDF`;M8nkx>>3(!JKM z%1OA3&dA3pfOQtzKai@<*{<6I%{LWPo!{s zS0%J|GrmQ+T}dA4d7-9%AqkeK@GX!d1f%zl^y8VBPmN1CS)>T>$)L+}vzTkSip`MJ znsoeD{5<$8&VTc`^7R%c^ag4vw(NvC*>TB*9B0%}H8~lMr})-(i{1tb1-nc$Hwmpn zf_?tk@qJKs=aJz6#eW7GyJKI!kIQJU?%Y$C80wVkiKYJ& z{+@QFyET&w@e3vn60`(rzKy9RpNs88vS=^-J|zDf|MLA}Z<(Tx4}`UCrI*$nYZxSz zcf~=HdmilW{#7q^!A8Gu0l%%auta#>R>CYBw4*lAz8 zo6>f&*lF(c`8`Uw=&)(@hi0Ha+UkYdg)c)q^-%&L(!D4ke$giqjxqWs|Msvq+w5|( z5Csg5Tb#D79BPa$PflX3oKUet+dRyN;FA@*&qt)3Ak#}kRD2x2i~2ec$T&l)Ufa|7 zHSxpq>(9(s6rn}zFy#BmEtg@BWGMC4I4QE2vfJtm>W$fdW|-medbX^4lQE!KJ3>HX zvA8YU8RNHp@99DrKn;6rniqF~KQVau7L8Ns05!ihx%__CFm_#{u6TH`&WMswp% zS`qt@X_yWB2{EGlbg4UEe40Y&|M%JQp)_feqhEuN%=(y^BvW0YUze!i_#84%r1#g8 z;-T2|M+QAC5JTiWAnc5vrh484%kT_+lr@T@`k@<$Vi=|!`$zRQZq`8w0fd8xFNpv& zB(=(2eEO86F6rjr;-%8l)O$*HK(~W|FPGVwz&0qXQ8Ffrbwf14FxrMRQkEfTaWsbD zQl90pX;qJo5dT3Po`=F74z#_y*^+c}DJ&V~iH9<%arf@uC+F}UGYbz5(8Lcos2Ha` zAkMI67c@7vy`-vKYj}ynyx5t4=Zf-7bx_;c;`6ST_V7n^zg^WKUmR$nlWwUB|P@v8(E*IB&r$+7^v|)|n$Pq+&L6gZtxW z>5Cy=RJU+_KU)V&i_Uh}aUgmBVoNqHl=_#R;YT4olr=9O!UH=1y5(F=N%77Cu`3n+ zeMPl$V>=p(k|FW5DUId3{RJE_!N+Cyr3sowVC{9|qHnz?(0mN8)}+2Ra@n_fGxl-0 zC1dWLS&I%jfR%Q}qyKO~X9JXnAKn=`tLAHLgyT5xCj1w5H3)y;rO(&K3$^M4scg#> zo&n(4AySxQJ>zHWJ{Q72ml0bWR2RNs9R&*RV(6S`f~WUbv=0x&Zf7jg_!G&jm_@7_QEg$ zfhlDcp63k@9XN)KZ_Sd-q?Wwje?G1dlP*0Q1~plhEsStS?^l|6p09)%a!^Z_cZwC7?KhMC z(5D__G}Eyk4c$^}hDR>s>QJKlWp$S z{-7#*|8mi$s(tRqvEOkU#KZb^mj7+~)BOQuDoNhYp1ONCi*PAG}o`@zvUM z)#{@+f~ErC&=$lO6Xobi7J_}jXY?~0R4xNuBjRxlAnZUdrUQj_n5a1Vp|I!xdT;x3 zQ!jWfa_&8@WO3O$9GR}a)pZr}2PWo?YR7=sDNd2KdHcR z$uS`QO*tx5(JaV9cn)`I0{A>vrRyb%MXxI}jCqV6;`1e?0PSibii3yK%c1Q+$_A_> zrHBn-_?R~T0`n8tjt5a_;mY-T%02W1gCCfrM~52YCW+G+z`W#Ci6Y$eDQ#J89!4zu z={zRpbVLp#%^4%|gY&y-O&f+VC2FEB7uump)yapb>G`kX8h={WUaAO7)y(&aS8oO^ z3ey(yZQZgKeQ=UIn5v9S9JWGTlu!1EZD|<+0(p6E9ueT&jK9ZuR%X= zzT9{fD}EnuGq*QSH8pp-|Dk!WFX+1Y@yd5!Ss9v)U8!l|Ks79_gXyg=eBbuwaZ8CxM- zx3mv|#Fjc${#;Eafe-M4bO#nOxJee?=e~lHdL~s>Ma=fqhB()M6Ez1YFEDw@1-wIZ z6&Zw6UGl@w=rx5C3=bd*BF;4$65I zZd*dtncUl8Bl+uRSc56V*ao=oa7J}7lA*9_wN+c4w%OKA%ja1+JQz5`1d$_BucVhzRNeNH@b3Mz)Ro% z@SwfLlTs5_VgG_yatr)<>e@u_e4wugc!L*s?*VpJa>?ilel2EZTj5Z_rIuHbE#S_M zHx{s(oWEp+v_o9VjjN6v2t;gK)pKA_2wCTE?|EDJ!>!e5qt_OD~nCH3m4MUc;*`9ZM<|y*HbLt=-~Yf&CJTC ziyiax@j-F0`(92oQ!-@#bzFHP z&Mg7MWvA{=w*y*32saf3M9pUZ+&~&ZCYH8xTQ+2Epv~jlb$Pra2Tie(One3)Pq*ov zTEBbY%0*vJOQj6+!I^?J?TI;8lfd}P3We+VV|<9!wXJd=Q(BAEY=`VCfJw`?)_ z+{Nctc6awpJ0z!!gWo=cg{j)a+!hYOV>1=E1T{qDrUqNOWsOwHAFLlFFJnte{b5=g+uEmPW#7MuH)GWA01UTVkT+m#79g*l~{_or*CNi(JeH+Vz$and9)f z$W51BfHMCC&T0Ba<2TV{o%IB@4@A~K0*UQ4NTrVE(7QRoG?UUR-CUIvojW9(k7caEMt-jLr=4GCtfsh;fI>(@E7DVIH zUvAad-$1n3Ra;*L>&AjILHjp8Yqp_MkaGe)Rkm}+GrcY(-TWZHoeX^HZgS=`p|Pf? zofv8&Uyn@m$lyaUwD{#*cuVVbM~2eat5B-&00D+!(1zj~W$dI*bZg^z? z&+94n#p|{KM=_yiAJ|Ry7MPJYpMEzpZnR)Z1BJB(-pI_vRqi*)2i8)5ykjgng-(g1 z6$ii?X!3K+oqjEHS(goo(BCsR;L%=7=6h7AdWJj8l`#cyRg={ZGp6<)1ry<#`7v>R z4|-YcQ8b|Fnr&22@#ehD2Doc2did(Y1#hp!1_TD`DSe@mvzd!e^*>oa4|R_yzCuni zd(Fz1{lm96J*i=i)Nh#4@8&xJnrSnpz^v&v`MIB(Lwmkc7g{>KSGv4!KYp@XtbLD( z7UJf+ouH~Kx%d6E*&g_+xq=OeKhG+o*zKe+cgzc zEevR&1|7$&d5u$Q+!9<|+FBw=CNO~FM#{)~n>T~*)ul?hQTLXtyFvR)X7gcT2HU!d znCX^4u}uo94$X8uGkwc12ST#^7+_hmTW-OIkEyjHrq?-TqD}FaT}I{Q27?jDa%Wiw z7#5%W{f8=Y6fuMwX}wGZT4SUI=}=in=+5C+hRR7ZZaeNVK4ph_-K}N1!6D>E)d&U8 z&HUn|aaP{fA3O2ZPfEpuH^o-0Vi;_1AOAj*!M@FXuzy%pZ6aK;@urlL21vU900ca% z3`|X8R77-PJ^tCviz^QByFcZuYCF0ut9m^5fj`9FWB!2NZ-4K6y7R7T`16AbjzuYb z6DDi%*YYV;jP9~<%PL@^TlEVRdUgJ`{eeE<+0opB4nPsxnU@F&FRZpYSyRr?Cf0Hl51stk z$qC_X(krzLerOQQc5aQ4xxn!+R%G~N!vOp_mM4_SP( zi27pJLW@UagIlnHnCG~_EF;5iJO`mn8uZiLi1XmCffZ55xL?Ks;q@2NIV$uh;6HIv zxtd+m$mB^uN==^XZOwV`(lvCKk-ClcG5lPP z=<$tZF*Yu5>I?XbWxkjOxit(|M0)EDiOzd!!=ifozv&`@pm<3Aoi)KL1(nw>5i(w2YtEN887bo3~*5@ZTo0m1vi^ zE(Oghm0a%em;()l7XJ5n&}TRL2aNttcd`*hXz5s`J?ui4dE%=x9_gieT|&=pESA1L z=O+sgfnf8&Dj3-43ed0CR;*V5CB)!_Rcs&(Rv zC53!(%f=z{59Rc&y;OuB`+XfZ@lzh)3t#;sSy-B>7YF#8j79yL9J_&oM#O2B#oY9* zVI>oP#DX44wuSzPR!mle<`xNbE3HJQWmwXa=Ax;Yy^9pd*7r&(x1F}y97Wd&eiB$O z(V$&3>hc@P8gL6g%n-oQDYRkqALmuCwzC>2fq=FUWp zEfAHoPxtW+A6lamlo{q#@%@~mF*?|RVm%aHMPB*?Y!T4T6zzsT&Lx2 zI~bv9R&l-@eS13|RaplcqxV{=Y`$6#x*ptve7ce-7>%5VOz#kKU@~bbXZ>K&L#!V2 zb)3W6nmZp)<5E}su4TBm;uG+p-Eo_rF7wFhD&cO_FC3h!4-^Y3Gyi^kdTA%sVJrCZ zcKCdVkxY%yC{IC|^2F2!G8;eoSd?W{@GEG?A>?4nwNw8grKD8QL2P9%jYC{Ef3fpr ze^|met5~h@4gT*ym&0?@5QK%JMK?K=p7vz1J@&R6FZc5S8{YAidLc5LS#mScf5zll zJfe}s)%AYJ?b!{U>$e02H>u>2r;}|^?ZgnW3SX;rrj67j-DvHij9HMkeO186Hb@A2 zSIM!L?E@HXK6HBhW?kQ+cd2r8Ynfnyzf=5xc>?{-#Jf<`dGSO0LKI(!IZkMb(pWdh zN=%y4A@z$6@sFiKSIhaDsmvS3$Y%=N>n}9TV_g0+b~Mh=EaI5Gzom0LFjp|md+#P( zuBRRo4`I0}h}WKVa^%kPO@V%AMN0CoZ=}`Q2%NOS1Pi7G z{%;Xe1*3lnHz4jAlw&S!>bvBW%SUmtb-=0ed7RR{pAAvJdbfUi3U_QAwH<%rw#$b9 z$_VHuH}*AV_&6lbt^Lx$`s(+7h#8Gf>`{%ctNUKp>{^=!`1Q^ z#w^dN5{uZI)gUaoYG|S){KQlbEcyyc?JDOMxNj3d6CdwEV(aqL&W?L@dW?~*-UEPo z82s@(0-97}Qogd&6uI;3EaP+oUXM1WK<+4~ym?ht6Qj@2l(+OXBeSO~;Bt+uEHjwi z+OV&XIquw4ec5RsqwABE!VA5vMXt(KNtKF>Zz6i~sE4)D1Qu3-EK6{qiO?xtYC7EJ zG28kQArK!{qkN;LIy8%`^bjADY?M%UhaC1YjZmx~o`$*2)LqHdH1#-GipbOd#V-D- z&t^w2Xl7uiE`nV7^#KPyhcvly4cD9tc0ue@;VoC&@Q|=6cdL((zFV8AsI+m;YbH5n zVI`T*oWYHebVZ<#pUx@IZ?@vb+x?F!npO+R4wP1>!oo?|h}NN~%C-o`$dIXy$3ohw zHvgl<0?mCg{I3VyAu>Kj@owfr zo>N--{c31CIQv%WUoL!wjhs!a(8fIu5(d!upG`wEufzh*uSyJxXs+8`uYdbKwZJ9b zuY4Sp;9CJ*uigKV9+1F?5s`og(m-I|Ui`PY36_o-p0-%ZQoumruiEIcf!Y{6d13R| z<3w}s7O&b}V?G3r6FFjuqr#B)yK&bKoPN+U@t(BEJEQ`HfGHejcsZp2ufxJODs5Lv z>v$iGCZiyLXG;k}!SdQC)DFt~f)vu#{O-w6H|aT4)r$yNi+m+<>}I)CCUYOBBNrsO zaJ;Ng#0%Po=SqucV#8UP0KNst#b9tfN?|3Eaxs)g)*WS{v9(u3I(1~ z=T~aRAFtc5@7J0-By4Xlwq#G$f8bA^Lr~?9X7W!(HVRMG>~@^j?!V+bT|xnkS7Qy& zIVoiBC*pJ^PltNr(i$Ey`*#9