From 11e7b72ac36362c2965719701facf03b5fcf13a3 Mon Sep 17 00:00:00 2001 From: 0xvikasrushi <0xvikas@gmail.com> Date: Sun, 13 Oct 2024 06:05:18 +0000 Subject: [PATCH] feat: sxg verification --- Cargo.lock | 1 + elf/riscv32im-succinct-zkvm-elf | Bin 220036 -> 244100 bytes lib/src/constants.rs | 630 ++++++++++++++++++++++++++++++++ lib/src/lib.rs | 58 +++ lib/src/sxg.rs | 151 ++++++++ program/Cargo.toml | 1 + program/src/main.rs | 42 ++- script/src/bin/main.rs | 5 +- 8 files changed, 880 insertions(+), 8 deletions(-) create mode 100644 lib/src/constants.rs create mode 100644 lib/src/sxg.rs diff --git a/Cargo.lock b/Cargo.lock index efea02a..4e78457 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1743,6 +1743,7 @@ version = "0.1.0" dependencies = [ "alloy-sol-types", "fibonacci-lib", + "hex", "sp1-zkvm", ] diff --git a/elf/riscv32im-succinct-zkvm-elf b/elf/riscv32im-succinct-zkvm-elf index 8129d906d0a98cd60e1efe2c0ff004dc7d9701dc..46eafa69584d92712054ef9d069ee278f373436e 100755 GIT binary patch delta 92630 zcmc${3t&@Kwl{uGl9N6tPz`TTL(`T5O`3NapqSF8fP#VreBnq)(>9PcrAc`>a+4ZT z)X@<=;?WtLf#IQ!-tWp3taoPaom45#!+WpZ0cY;qJ0o61z4Q6MgI;kQMfm^L-Y0ER zV8-wJ|G)3zoSt*`UVH7e*IIk+wbtGzvtwZFj{h3BYf5odnNe^Gg7Eslqh;$C9{F2Q zpi4rDP$~!_Zbt@D_U24>`L+lGUAmn5&uTToXSbE%dh`{ycAHmo_=|#qgkK02>vgHh zv>;1*A=vVkAgA?0s!9^Hvm~*9=gWda|B}ySJSUjShJ;|Bew_BFg+i)wNHFL>`$F#i zbi6^oPLP#JLh$ofQ1;~cs32$!z}1!%1X=UhpX84}9v}Ra)qNfne4;^L_$6zn-75s; z^r{;ZhDl9A{~5wqD#(441XJZnVHiWYK!^%SK|V7X^}zVYg0u2x=f?NHKUp*x3q(`d zA1`U+IXM%sLnZ^*BjZx`io*Lzp++q)H%RCQ7cWnWW_exV)XDv#&?dY(W^#(%|DE3( zK9nMy)@y>( z^a3Ax!>1}4|G@9BzD4+mloT$HUPuNXAJU}!e(=^R1iv$cx-{zif_A?o1oc`5i~gA8 zN0%37E0nIq;*5krCkX?(s|0yRImG>_V48CnA{TU~>V3Ey1(RhTxF%{0(jXLXAMW*{ z0%d+bnf$4tXQB`+l#1mCprjS`8X_?`Z8x5K#h{+b2I)S*6Dkw5zTJ;_CYAwb`gvK$ z#ct3i6M~^QDJYmZ5J?*W8;T^sB)CLEXezJQnkr{%O;wL-(78@qA!<@Us;%r5Q$7J*Y9wd6S6Ka^f<7&xjKw4Rtn9gaJMkE`?Piv&l!8h&cYo*WF zG?CKFlov^3edZUmb9yz@5denCK7H-ckE3Vr{)EpZ@G{BNdx!jQoplMOud8R1`g0w8 zwGV^1V6xDV7YnB9!>XPRRpw8r71{Dxd`f*<#dN;#cmE*hJwLfG42Xz`YUS0YcxoE0jDxWD*y)5-Y&B148 zI+A}a@A%}R;ejII^mlaUS$kG4{7gC3D_$qRT{NeFn}X?bY4Jopet$KeuT66edLwio zGtQuILI>a>gPmyO^~WnwFQUFAzy7F&*VBBrQhhORcczBkvvXdZs~dP-$O&sKCh{w_ z;e5ntvx>NyBlbzWvCD4I?;VA>A;jxWI!KuLcvHcV!3??8!MH#`BF8!jyR(g$HK~NP zfZAzI$H_90)%t^}@~To(d2gwy?9oz_apqMfi*3BAx_-QA&dTwos=#&_#k`q&Y6!CBxttcEFAi@1^u| zhJhKB%yZhggW^CD>|5b{uXYaR`kZ>E6o6Yf0_S@s1-RgS^XHqYSBfdKi1`3pF=t;E z=jsvIw2etQZz9C`_$ED#==b@xc;lo;(Hyta6{I4lr>S14@s{TDhMS65iMf&SV>B z#=!d38cM(&$)_`kFW_FP*)PyNqc!0^+KdjkV2U0-DREq5Rs6n!V6o(sfyZ-(IGi}R z+mJ2+rCET?E3oe{qrGDAI|uElih42lt0SbT3Q^S< z-w#oyXC0-p#0h_kvO*3wnB~|2%1Y#6O%oQvP?iL*mfQmyNF?9lA}P*_M9>>xh`ClK zKTTkTa?4m$2vC-M;Di9nG7RuZP>|e)J9dcjZ+3`=J0E~slo1W-BCrk)3tO0cd-p#w zTQsbGKrlV>oM2d8B<}y_bAsucVS>X-kP$~$R~6O06(QMee-rL zfWd)W;LNx7Kk|Uiu$lqu46Ag2eLx3fdeb+TN<;+aY^fG=GF4t*s+}#Cre+V0$0{%$ zGh;jyb3A6kIBj+BxKwrhI4JYDlzDKhK@_i=Y!Jw4f#;R*VNKsx;;A5+Ok4q3mB4O} z9o-hni$*9k>Blw*DlaW|Nwx8rr~5C{fq*Jp)+R<-YVG zx*K+;zb{KKf-7pfL{j+HS8VuPUc+SaiLco1+5C2boZBw(XDEFpzhUwbOgYHiSgUlg zMO5PNRzZD-hEqM1mDg*bh|EJmhvbaFNja<;#g)W9l`RK(XRw!yotgW!74@onbr@6X zl7`uK2lCtb(&$X>bP%gAb!yX&>NMMSKjuHlBHL-Q*JL5LDS!@FUa8UdhC5_ytM9K; z6@w*LkomXO!R;O9Bwvre&N(IM6$fLL?;}_>uuc#;>wITDlb|g6zUO5)iWFlQ`r!XE zt$p=J^15*qle5mETBj=P%krLa*J_e6`N!jC=z{l2h03XQaAPqX(V#=zv_xO5J=7!w zHF~}FxjrE{u1F^r!*hO4FQ`0vp4=|xQn1OL{2xIbTv)71GUl5>kClqMw;K%UVwBwg z${vK*;43hd0S1wg$#{}^)L^_KCzJ+2N4q$cB^GiSJpq>|q&{rKRZP0U`L9 zP6Jm0a*)U+(GpQImPJ|eqdqMJlRAxzFw3-eH#+Pi7+9MTf=qk;kYgVsC}mWhXcezk zjQ5JV5?BUW&0&yF3i63tS~bFZ@`C2&*Kskt2IUdS=Br{jKDn8NCX3`#<0|HopMFT% zZTi0SxanExaSBN|(}oVKq1y`-FUV`nYRS=4`T=}OIXCcB{@ zFy-j;AC;w~hKF6r|Jnb+)sp0R=hQ{HxA(5eABiA#@PKwEJVEXR%w)@4#n2;i-?@vy zNm#}}l|k}9EgPqp7vtIVKZd@^yl^N(2~)rg9&gTHu7TL1SV0L^c9h8aj?e zMD;d(-yo&AR{p^hLk$hN(!V=ZDeZQ=cO3enFEvQgZtYU3z<@Bwp|7Y9#*b+@5g7I- zQ)U+sLB)73pSq|la}QIS9^H94{)yJGrbTe7Y?? zXxVUu?@_r)*u6)7W9rQDT<3qR^6J84(<%&9Jx6+6rqNX$eVmAsYp30#Nxmo_nYNrb zjZS`Q(7z}c(j*$pq8Jlt5joq_WcPH_WEv#mFShzY2bHrIFTxcYD|b!z&f=o_8Hq~n z8~P~|*-rnz(o{9*4`==Jg#5;IR~8Q(66mQ<#pBb+GiKNl>zKuSAFB7C2ro)a)o>)| zz>%ziBUx#?%2Zx|6(;Fbusv`r;Ye1)k(>iZvI>r5<>B$<64EN2`u>oRIv|PKLw-?v z(67-xpVnxfON-j?4~eOv-MUoM4xM)K0bOeG5uLm{jdTT46q5_Ygskio9q+#{^oIt( zsKbblR{^*Yz%2ld=K<%zRub$4!0G^74p`@vVao~jgf`W5Osie|t~Ry!6Rk=F0$EUz zhZrV3<$oN&I{#qn~byx=u1GW*cE&5bqas0}_l>|Hiz&Zez z1F`eUu;m1MLIS}O2$n#wbVVY{2=;Nn?vN6o7{Eua3~Xc+1Go{0TL2rsGAwcmAQ-SZ zz?K8nd1csYrV|M$&@m{`yHKD{uB4D0owxD_?2NR33dWtb$~4gtTPujkw5p#3HU@2C@uoUMWDFoibRwV?Bjsl z0oVh8J#uAOBO@5FjeuWz{n8MYrFZnFe}8bo=~F+NmXKqGXcO@wc$1IS!iY-0>X4+#Aa?GYSfzU?!Vj1_`gw@dQF=;-{n zMaS4Z-~!72YP%ThdKz9}a=ZL+iI6Qn-MamvjC4V8-P89XL>P1WThD!lEaDht9m~2t zhGgGoh_*|>g)u}3LI7|!0r#K`VOhCY5`3^|ierqi9TDS(wb{+5|#!tmj2o*NaS+M~i}`5?EJXq^w}6-FrZ3kwe-ongsaAeKU}*Cb+>u zWL!#Ahx=ZwxwiyFmjtK$H98SX)V5)Wvm^*Ef+&q)(p}IMbjq})hOyTOrt*DbPv0+{rOrtKl~d&S__jpPzWoRJ8^suXJ%VAtQnG`PGGcveQq_Y+ zDRXZT6syRQej1JtB|{MQamVRH!^0&SlVx8~aN1o+C9pxRMsh0|p+=5}{~Co5hk#M^ z&CtjXju9ZUkAhGhdAAc9?Sp2+-(|!kJ3(9tQZ}uSbxF!UQP4KQ3u>ys6m$vlsrgg2 za}F2Ezg{p~TaEh*xLa^f;%+=#EU&`74EHMB%W*$He|DnsaB<3iQq(rVV`@4hlHJiR zJ|{Zf8xrIv^zi=062s)3Vt?ze1af&zRfEOBJ|xO_ujaFjGieRP%?3xFCm4_oi<-${ zW!~hNHz1`qpbChIp%#2R!pcNYBP}6)A?F<7%xQz30JFN1{Fz}a&Bje*wf>o7QhwVQ zQ&sO+)0|CX4HG3stm8ip3i8;MMTRk_M217>e;c}sET1^mA@x9oT%!Dq>6o3H#>x-Z z35KzCLa@6-s~!6CVrpn?LeL(+Mi@qR=Aht+3_*E)q5*a&sP7Q9uYY;bFrx$+oodmM zJ|LvvcLt9ap@YGa;FHgTSm-3zTi@tTfd|unumptE2S0ydl417)#L=;a)n~vh>Ad07 z#Gl6Wr+dWxNm$4vM)HlhAm&4)jSdcXMwDNnL+_vM@azj$U)tfQ{t~RiWfERB}zEJp8I*6XV?j6Em&>LX}ke=jXDoM?)9~(XU-S<(K7*#2Z;gxTHcxgjlk=pR% zOY4#aYP(N~$b7v>UdOmr&?CzFH?)Sn=`^Foe(4Zqed1R_@WY`gTJsK=@V}d;tsVq* zjY6s#+M9kp*LXdHX%D5V7fc!n&J(6R_9V2kd$AQ&a)B+Fut_q_9BwMEiJpDrOCnU( z*JJOcUMm;WONPSw0^$Tq@KQ{PgxgB(T(HPB9aa{|?>mT97#dzeSzyfNJfyxU)G4en zTXD0iwA$gMOIBz`h%hm`LUVi&11HcB6vlj((3Xp189*OQJyOW;CowWC<;d22s;%6? z%A#k-pQE{L(EESKY(tXV2H$5gY=a>^mXCS`D?4v^2!!XA319GZOVhjRZr3L&u6Gdw z)A|647{VlEP8qv5peTea`A4v_o$pN1MSUWTczNE0Jj2o^Oa$dF#^GW)dRLtNF8^}|MbU631SjU zD$!Oit^NgBC9i^rrpQPpp5F~!p(eH%Ly_hScR ziswuUBRu*oQ#GDXp1RW@?S2zZ*c4NlI8B{-(1sKxl;GU#C_5S+CyajvK=Mw$9je}%Lf9Ig5qN) z3JxJAvLF5v%aCK&dSZp(&>upcQZEdkOz!J*IntN|m6-I|oL@8L{8C$~?PLRcrpV_a z_H?1gy_oQi3UXCPUBNFeUIg5B**ar_k=Z!OuS4e=5;I*|Af+QCl*5)wZ(5xoC$3of zJ(!?Jc%*0CqF9Y{>VHBHuckT{zp=99?@>lf%PI5y2gbAFY~>PvYYbD1guPhiB{9pN{u46~L+y_{pemUTutfI`z>C#Q=(N87(5IF+Ms;eD&j z%Al{tR@~Tzo&5pIkAsfZ4T-QO>NGcw>fe_=XI9V=nM5 z2uv7?{aAVCRa)c8G@(AH-1iFlX$8$WgA-nnjVq@nSU*CB=;QT+t=V~mvUMn9%`4lo0F{CbCUa@YX2B~hoxaYf=i<70X|A9CNl2K~BR-p|XUhryov ztAs(nVw50Lx?#aokg(G!LMZExkMUH3mxX=z(UBcPK{7`!Lh+@@hfYA_Mvn3@zP);Z z6FKyzT8F&@92!)2;=bgSeh`%$)v)0UUUz0Y7TQsDsXwXhLNwwmAspwce^l$RY$Zq4 zX+IsPxQRwMl*GZJQAis;$rS;uH6}VW#Z@)LS=`jZS)A3XOu2mOS{FZgb)_kgye>;1 zX`U=$T7Bmw4aa*B1IRg5#X0r?ue;oo)4o3}DMpvnPIOH$6zJRNq!c@z$peWg^0U`f zG;`wb$Up9u%ns^KIz5FGr1RO}3Y%_cVlQlhueAbG2)l}Of|O6ga~K3aLHfFJD%YkkmgckyT3*mnryjh$X@3i4XwRYol-x~YK6R$Gy>(0ehLUQUF zGK_=OS(O}$^HCp89;bk`{Ti8jd*iV`ef&8h5IVI}9-MSe$36M8TbA zlP0I*S6|L=>u1(_wABUyW|jDMb*bpcL6SPcD~JA3H3K)UM*N6;Oe_M06r|M0@h7hQczVp39YWK;l!84849Cf}i9a z9NnafG#CF9yzX4rNL?bUZ?8T+tgLLhPh3cy!%Tc#T{1;=rW_|lC029W2or%lT)AM9 z$^|K!uLkSXa{m@S7_3l)x3Fn5d%v}C5}YX{U<;Btw##=Qx08IXNcVC?xm+RJ$6OGV z$jmOes=^D7Q%>ca++Go$%$_rq2LHK>bk13Iyl#^}sMw~~T{EigW_fGnQw8gobGcBS zGV3lC-#^Ru&RU*e_+8 z;P1(O^1sb?CBQ?2UV4OhX(&kJED8G6gI5yrT6|06PE(~giRi`IqowR#Al(eOQov0b zflJ;7JlLJU+Evhn^GL`l?s+fYb!2X6gWWJ3d=3iL+_%j7p=5l>A%@4mB3@q*%E(+G zrt!<%Ch@%7<@Sir%g?%-Co0%sF@O}<;Xw`0w`6w9rJja~kD>+b#l9> zW3rVA%WXg_wA8CY{ag7%k4Jo5F0Wm>n29jc0u197&dOB||87-needV1s_#9Vu|Yf~ zj^(|f4HKF04f#mztyABY=}?p;V)^pvSai>nPe{w<-n+$L$veDr#gp=j-ibGIWqy$8 zX3CNwWlnB`BB32}D6G65zBZJCQI*-O_NYPq_>pp7k6b#hqJX!L$qVMKRuy!S{N%i5 z8%3_uG4g9vI?M5{WAPpz>%ZasI@Igb`Z9UO{O^uELgP>;+=Kl;oxepCACY}^w#l57 zh0v{uY;Ljl#nO zNS_p`HLuAh7RJP%$V;w NW__fB@4JE$HOPi{*2>kT>YU7XSN&{BajnlZpPNiOv% z;xqEIzFS58WAzhNzDV+n`q}(|Q~FkBn)}jg=x*5QzfG221e$u)NlRXkf4uZfwcTm? z@f&7ML|j`xl8R*=W!{$GxFJ~dqtrocZ0{)2%gNH2{de8iAj$`pr4z;VB{Xy32x;i! zp46eVsC~vSrk;_oK|DClWO=j1RQ(QiNk1wKYW z6t9nz`~D6{G{g-9ZN=-MeatNQejuM(?va~UzXIz|CU1{CW6i_-S&-!y*E|eA3*{Mk z%$<$$&RcKR2o`zooelEcYkczccN9-IvRY_gFAQWa8S87+?*KN-$=e?0^**RYFDUAr zlvCe?p6cc0cP=a7IL6CAzFmb+A{#IoU*=Z%>{_3kxoz>xGGH;Py_^RmEI=;i%q+R& z&WAbHEvpt3>!#@ZXykzhILEzZY>FN)5t{edQ9k`LUqd@>_e_!Gd4 z04q^;5d(y|a^csOs{z=8F><2cE_AE|A1ysdAVeE-^pt0n-- z2&gi3U`OTlyUiSXVePv%j=e_ z1O683rpZ$8wdi{S?>l*1HU?A%X8v7163B|>UjWBM%uFB`+YjWm>(!A9zm#8Gzx-BS z{ttkG<}$oS^=R)s=!>|9wGwMOgY*3YWo0PCX9B&`)Up2@ZDC(jev}f;zRmKgV8<** zfAW3UC^DBga!Pf{_wcTx$)LWUksoSlkmt7CFq!x95}y$D<-9)g3hE!`b;1j%g92si zk}u2F&|j;P{I2|N=$5O69)MH=q*!I&GxCzwTQr$^c~9$Onq)|}w%wxfIpiH}%T@U# z(E#$KnO(2vWA`OgBr1)WZ^-A-ELkb9Xt!%JJ@StBhv%}93S>j4pf!^1po*1c{A%kd zN|HvL*&;6pFQ3fnk~H0kJnU>SZfuhGhL=xgb-ohRU5mPM;8Hyyp;j*3aLXj$ZK#4U z>fw;oSMqL>I=O4ZV^?SJ$xc0Fg5DWM-yQOVjkny8T#TX#1kJ?H3ByuQUxjkaNr;1$ z30Y#RRDzK0Cvl<|PT&gp#f@=TV`Bo@{28g^$vq-f?>;K>}D2B zlb@&*JhRBB+49rrn;y}tg!?AN^FY_rKR4*erZ(z&s#RS%7VG&L#NGbnSlBsYXj&G!qnHME(qfJUR)=R0S zD<$m>0V#FECdqN;pkSH|7^zo+(qfNfmsUkwXDY52_ZQ*ZQPHEq{=!~ie=$z0O92tE zIdH!DoPc)(o}f(l2KZv^|29YH)2Rq+wT<;fC@bO!KsA|c#y-J~vhi47u~pGKW~4mn z)cW5M;AmWxS}LO5nTzCv1 z*f0rR`;w-A=qcB&$jxpjB$y3W` zEHEJPMQ-0|jr6HO>Y@)DN}2yDU1`Z4yo$SxLIr&h93+=2?SC>qC_>1{%b%ij9r8Ks zj-W_k?}dHeqTG-H4nE807+Id?Xl_izHd1~`AJL=|@~OzgI~cy6CnlR%uJS2^{;b+Z zdN(iAK6%+sdbvOR8@?&iaG2j;{b9~NiySn1`#)T?TvM=%W~lH&zt4Y_$Txg5Tl;To z!p1SH$vn{CvUsYPc!Pnhk$cXKH-MMHCk_@mLO5`CW~oS@gaVGyVW0}5?K5$4K#Mc=QO1jiRe4Wt;3NUGh zKbpYAV=B9gCZsT1mN5BA)9#ma&?qF!jw0WbrVw2+l_^cF;`oK*bh?2MP9$Zp*~-4X z017xU3Pa(8o#H4??~y(?mEl_o)*P`gzPmscRsPAii4#o5A-4BL?N0B~eTIW1=jC7D zvR)&6NS{t51X2%n{)m4%!QUxH{}TIa_)57K-{9a=U)q4Lphy6pMSoK&3@+J=Wy{At z>j>WSl3qS}P?V2O6bw(Sg82d`DjSi~UXA$vO{n2MELoTr*guE+3@-GlpIQ6f*5mw% z5S$?|YBp_{h~_HF(;Hs;Ox6K?4%*XGBv60d=PY7lWM)3W)?^OZng9B;WZy3p$`e5T zC%ff~x6If0{uvCIT@10wQc^hmpS$H~^EA#6-v{}K5i?zhA3EZPj`2f2c}!#j03U+) zJfSx{;e=JK$l-@8habMn@FO{t!;c2gnv3%Eh9?+LvS=^mhw!iYWDCFPf4S>vLjgJN zY5)2DwL1<@nM@% ztZ<2e1lh1Y{UL|`Ew%~VCg8gqYN<~j##AWg&;B36xEAr}lSojWqI6i9TK5v=fbc%k zL&+!o#Q7uyyc>D_!~wErc)yNCF!~`VZj#=wrTP`JKJ)|1r=j2)-r(rp;&}#tmii6) z4C(~+{p1l2D@^D0=MEe6l$#T#scnC#B;Ddf8WmDve{Y!R5**SYJli1dLBX>IY}6me zC&+{J(Z9yS*qWY%M01uc8H{v1M>d4cOR<;gGiaM|cG6!V>=%LKE8xaAW0ynje-$HB z*(iaH#J1#E&bHMHIop!>oRZjo@JDL>82&yHY_<}-Dw3X~oD<2S%Mj=K-x>Lk@>7pk z&(ucW^JAs7R$N-ZJfPQ}SJu^v?@aF_=IKMG%0UDbgLJr4!x`H23uUbr&>$SY!SI^$ zf>&H_7$S{Le~Yn}^jaD!R7&QFcWAUHX=AP+Mhl?!e&zmoqD7P1KJfB9_< zI){EafIGfR`e(Z1o759@mJ6|fmgl#Ghm`V#qU|~w#~A5*OnJu)71AkXxujRidM+CJ zof2OtzEi+w(a)5%*Namp6WX+Nin|Ag*d1x{x0Q#k7iXGSrR!bVJISV|CO0rvoMrT+ zL+>bWTrXauVmYlk8SD-$|E}nK;>$FQV6;8;$cA}=JrhgaX@b!qg@ zGV(d?v}btT8611_iGhMwFW@YP_CJ&leB!2p%mqp%y`!wF7b|$ptG`o>w}^Gh&+5f@ zd9~nIsso}?Np3{?<+qE(b!zbfDy|#oZ4gUEt{~EXDNiwC&7zc`b=qD%RuT?YNJKbfkJeQwal|75Zp`y8uaF_;8-Q;1Ld>DV!%KoN<%Zz;B&TW(1eOC5wD>Nv_!>`&j;9AgNi*%#PIYNNp6`| zS;~MoA4|X}tSlK)j7vrH&Fsauei#6m8x9}@v*L$!sRdwDbq%^`+|aluj2ZB{zsu$B$-`^9J!GmwfsUO6iSa zfMmpvwq>9WK9v|>9b6hss^Zvr9PvDFD#vfBR5qSBl?|z0vh0>3bTzqsofKwGivdQu|zJ)0N!c+#O>zj!6 zW9Ttu%1xq~VLO!G!?aFwQowh?)95>3Lpr?&2{*7B#{~`y?NK5(iS@I%)E+Qd4nY1; zVI#!K%KWe6ESxIh^f~3kP2#qE;2obcU{Yn$lVM=#3nhNDxM>!b?q|coBhQpe_m8ns zA;VNsN*5?4D==%JiufXWk5aoroIRe65Cce`y9jRXQMy)$Q;A{F@Qcc>6=IkhZ|Qrc zssk5PJX)n>rT845nsm(NZgHw|a;4}j=qF2&dTXHc7SSdaaH8ht+kz5hd$YJot+O+O zpiEpPdNtaQl@+VRc^d5}>b*vJ@qTfNa%z<*u`h=G=|_UoB;+lRTrfzD_;DFM9bmog;tZE{>qmLnvBFRp;(YUR{wm>aM`mWHtJ(s*7yfO&?j zMXFN&sG*O1RqRVV0Urrsfsgd}igk^6pXSw!a%7Eor`V^I-YVXp(Y_{k?U$UgKOXksB+c@Z z^O^fmpr6d)K2hO>#cW<8P@yz7tP|pYtW!lkQQ3Rp;#yemI1Yrf>;-j(5#A02NE9G_ z%h~q-n2gSg_)Q{cg!3YYk*2DIO)X{B2$Ryaag6N}7AnzHvyayI-@0g{neppZQo zfWjkoevD#b?K4e}DQnjP?cSFjGkx#)V^nE6fagQUA5$J$E3W32Lt4u^pUXP;2UzD! zNSQc-H}i)d9MUlad@ zGcEabW!c^6nX$MpOxEaH<@nt=G{s8v8>!?e74{D~41V=P<%M-Hc3kIADzC2-Z&$(Y zBD=I%^Xi?-fdCdR#unedDDMW~*fQZXoKT$WvA*$|H8ns)Y{?Rtd`>ylB39hYMSO^;z~t1bW@iCSG-d&q zl4Rz}PDH#|brJROa^BN^>Q#PV0$ch`54vRfIRQ30DIK8+YUoRMk(p8_}CUhfwFQzJlXF__hC;kvl^cdA-k ztCaVMOD8j;hF+4TyED;?){W^5@Er6Ud~X zot$2MM5*dUaKc{vN0cc^@rT#aZ%Q3IPsg%pddq#7iUshYOPN##l(Wezv>sU2D^3zM z!W&AxO?3(ewdF9ubRbmALe2-6cBGH~O*R}IRljp! zT}r%9)FfXUcz1_5TXQ|S#4>%@0Gq>)WoHMQ`GkJ-5FfvOMq~lzMQugn7x^&BkCkOR zMY~4pr{(Btnv9~H+A02{Mr$XpFHPAie0Wheu;2l)Uc+)(`rUQPj&F!(7*C|5{YuwE z;zX_rpY|&cJp>h?-X!SOh;0)UK2bX62w5ip@@z!8`)2w zP)o$Lh6}DLHq0uA@%GrBypABJR;6YfSn|Iio<32^|X`` zo!EOou-N#ewnF#ii1=XBK*3q~P-XKzZ>|@mfu4lJdr*Sbtt*JAk(sr*zd)*ivHY#_;$z}n%m7Oj$hl?&wc>}0Q5LURe2``ck_m_fVg3I^ zxdRU?^JBMwxUl0-Jb!?4hH>b}38<|8qjdI;hI& zfUy}JR3kw_aTq80C(4w^#e)T;YxfrnD#sp&Ia4DvrDV4_^|}$7F=8FM!H6+>-rWC+ z(zsik=}=pcC=E0SN`7P;qA%9ah=yg^hC{zlp4_d@Ilc5x12diwUE-a2XpVh8g2sQA zNXC%9V2(Y9`w^jI-IW7vwmT*n(3vNhq1OgpP+&LbvO%Z+S^Yt&=>zoMm;R-kF3f(! zK8KA=pZ=xt>nFwACj&rEhcu)bvc9!|-3wZ$DodUcXY}W)=r8FMJms^c$r2$vc$~zl$snn;A_Dm7nhA%RV+l z7An?#z{c9_Y*HTDCoa8?*s1p;&gn9<^zT_VcM3U6{R@;&_KD{hMdYlU{hl~!T4pv9 z1f`dnpmQvWGY;UKcyzPFXegQ7jrFmtrs>DM3i z1wT1n+^-*k%@**R+(SaJ^}VYNpSgwpLZRO9$Kw}+nnF$geM5qL-^UlVuWAH2_36d^ zkF;K(cezh1oNnE6p?~LO(NU=ue-- zX8v0~dCT#O3BzYDQ1(ac%oP>~Z#!EeKj{(-M99ZOqX=6hFv6O(qT@Rt4uqMEZQ#&i zaA6TAYTd6cz)&J~Wxpb#qm?W;L0^cnqTnqVO~3RqCg9M;)U#NyG&HEm3H%1i&_%;e zjd1$CH5cTbTG|BGJM%$^smEL?wT($6n zH)jf~Q2H9K3S7DG^?0X$*;cym&dhsXR;1iFAbRGp!V$0;#YSN%1W*66P47jAOFK6Q zBH@@XE53l?rc*U4~dn^y@$k`?ODkC(Ym207LRu1V|W(j^e+onRjgb%B;GOZ z*C@}HCC4eP&xqY)uRbwTxD~K#a2b{7j)}fRED{ceYQphQx1}3fN%sQc2Gsr+V%&+i zd%YfOt*y3UQA53>w!!9gd%P~czrNA#buDW2H#%z_Hk-$4Z*1~3HZHO@*cUBwI&1A7 zcdggi;P5&cJ$CORdz060_cpqmu6mct(PVA%0G-X_wfnvG3Ae4*<##!}jfXZZm!sb4Z(3B_;C9#g-SyrkuhnLE z`n`)9n!GlT+ih=Xs&DkyyW9=d23wQEV|COzoS>n}-Q@RJ>#bJjqI##*Tia;$coU17 z76Gr_o#xiAEj6*NZ8c1FEFG~n3wsL3w?S$`>wjMSnBD(SdI#O{Z_;IPC2DxB zX3t9vfwoY+wPABOaHGv)Gj0xacZOr_jV*zA=(cN`1MzC3-DYeKbs6neyVGc^ornK9 z?Z(B+S2Y55+s*aCV5lo@&Z=-zu+`ih*tV)R=nh(2?JZ7w$QBIMwwRlj-qh3*ZVScY zw|P4fVRNiKV0XFAR!5!J-d?j}nPb)RmRlOythWSO=H6_t?{sZg)v`F=bo++Y%kBs_ zH81lt)mv|`Yl?-sH;1}!2u7kkEv=D2cWCjvSUeE#i8a`**2ST%UE%If>~e&==GnaS zT#WF=TNCDBAlM#iSh950;;rU*xFghk+l*$L$L{tz?H;?`VuSwJoYiZZt<`J%c8BxE zt!CD9i+TOFm8`9KQ&*eK?r@n`u2{S*810OQI^*W}wyw}^Q{thm@tXE{M`XSc^6!p? z;&naoR&(vLt-M=vdmYZn|&a=5m4$HTiySk%Ww{hf+%a=Ac-wY{mS+;Ur$r`7IiY4NPL*)hplowZ(jz~!|&thJaq z4y(iIT5kFJ?nE@8$GoR_IZwaug&G2=eIZEZ-BX5-Bbt8QQ6Hxfq|7B8TiF@kATR~G6lTezS- z6lhtvARdlKLJJ#ct{9gE*2fmq@R9``p?F|e3}s9XWi^R~3nJmpjmGX!q^_*1JA|$~ zL&12NvAsLgT342xGp&$J%+eN(wnajLu5io}jCPdO{4cd7{)dC38z$)^ z`bxdl1YL&ycqq1U z-j=rZxX)>|&i7cYIgp9E=4elMFl1~FbjFM;x})>L@j#@SL0hW{-dYVcoNr^#HhN~Q zTf(ufNMKuCY)hbv7{Qp^8R!Vrm2D1(wsb|iF&b6J>dLl+TjK3?Euqa=Ys~DW+8FK( z$HRd{#2gC-BB45)#X5`!O57Fdj&G|gi?+>U(#yd$BH7Esw}fKB?r>K;9PPYpD`Plj z3>aZhgBvj?6X8zdEo?-@y+&g!-qR9}T8y`bjIpjzFpP!yo)Bm?-V^GMnm2Yvw?slM zu;U;x+8Q(7abvZyG1L^UHU>IdjElnYU^LumG2YzMZR`lgVxWP#i${%JJ+XFUygg)G zAMNRE33P`;F=MpVxIUrMfga+aV0&j2hJKrI{Wc?*6^cZ=;0qXoJ@Gj1X4Y{m8tI|2 z#f+`dZicb7C*IQ?B5bixke-MXVrpQ0Bm_J`*rRSX4is;LQgp;D!>mi>@jBcAvy;QM ztor9KKU|Y*qHSgdZ|Ul68^)K1j!8NPoeh?G6l6k`a(gHY1dM&4#{gno0jx?PwrFMrI$~TCst7aHjfnxmanvuBUcQp15I~q?kshp$Ok7wX zTf&=-;g-6xO-!n0n6P*P!iI|x!{SF%{}LENrIxC2kx*;g7z?+A)(5(2(Y5CyfCq)u z7sUZ}0kxDZJp0{;j~Yj;_JW!KxYusyT_sekU~Vu3qZwTvj)ct7&It8d1A;kN7Ah3z z4z{CaJxn5OYhJOL7nZRh#u#L_XyJmch0UyFK}{D#wz7<5 zcF@KxTeeuXI4sfbwi?(gYYm{wjI^jNif*kdvl^{No7du{KORuRor^4T)zyH_=1f(| z=nBN!%Z#nz2%L=0XeTjeyMr+9K@e0631X$ht-G#_D5~L=cxb}~>hYJeW<m0gig9BhlWw&t@Ls-RjC-a0#%$PAPjvD^jBSdPfYYGz_! zi&re#5lY0{v9y&L;YMo|d=BiaM>Ow(avNJg+c-95x#t~;0h zB^;`7unccZz_liDK1#JB9&Ll4$45v&1Y^z?@`;X^A-HjUbSnlLSkLBHU76X&3?+?| z=^$^x2M!Ul^$m-5U0Dv!1n(&i30Kgspp*<`-d1v8FQ>gWuh(0{YN5ZOZt_Oz$`IOR z2exe~$sg(ut?t4|phfJSr|S-v(cyyeBPW&oY;r2h>jS}!ZQbO_%}asE3KUthKzKkSiqD(XN^iA|;JxjR1{H(18aOeDfQ|QYk8wE~RomS`v(@5EAhxsO z!Bgw4rWK~v3`f*$!?V-jjhOA#_68>vSKDhX9vi&iYP;8Btp#25!1``*Ry(Y$11Bi7 zRXc2;-i2EbNC-WU0X;e)JcOP)c1G-GdqZu)QtLn`wH7-F@K)PB7B8Bx2Ui1boEtH!f|)I-APMYA;6NCYhqv<+e5O#RG_{*gVq+Dr09Y)WG&6UQ*r0Hb(;DjR4xSjN$`sA`CTtU(grYCGv zSyd!bNmr=jWjT~%91aJh!R7?f|f*0f*x@- zJDk}Wr=q`ydWPs3zeo{5QG=?essvPR1(d zpfxnz_@o*=26YHQn#X@eJj?QiqRycN@KU#&lb9`+a&j~H2Hvt>!82QypLCB=-@}}y zw(6_{wZvX^+F|mt32P@cWKSM8R+}w>!B%_lpUuXfsJ5BEkO8ELXRmF>qupU48^Ft& z`5T%MfG3O9?h2Zrc@9i&Gb+pui^J_?Pk3X)w5s*lngm({5LZxb$YuenW>2VTu!9Dh z#SOIC8J%d%Wbzz3pf+7qb^G= z;O&s7i%A;`oYPV5bh4Y>1q@94T#!Gkgq29MAk9a8+ld(1AB)3Q3*sCeTIN6!qfVVw zF590WJ^|{Tu#)J(f`qHt3ml-s;Jxfz4r>dckNU66lJ-#Z55hIs1;VWB5^R z6bo!d`WHdB>REGdJKh~a!JT)hzCDGj2&fQ4WxHfKTqK@U02CuD6$1X&Km`3#+_=z> z@g!(KJRGE`>?=6EJeOEzb0QhUl1A`p@jUFbx{S3(o70GRC@0>+tffE;!|Unp23ZZr zvms>3#$PHuF&z{J4~w-Iro-DsmY z&gf;PQU%FIW{FEevr9O*a6wNb8?r><$G0LW&RzIn(4GizN5XlrGSL+3HX}lU#vq?c z8FC;}9r><63+*$S6BN$Rv(6t*1E`q?Rr(xBPvp;Izbxjjh8X$x8bYrIYBUDAhSLW% zDC6Hj3h|oSm2aO#5(>H807Y_`i~6zjA^#@qaSQPRXWXq@HeV z55%#f@bAf|ke$CZ+P#so`ZssZLwy1OQQFMP*LtS0ssN!1q3+H=#E2Yz09neM#2(Y+ zTSMz<;|ALiq{8#C*G$UpPpl`AFtlzP+c~)GMu&x| zdp?!f%>lmE$8xqo+I6FZN2~@}RC6GXt*1C`Uazld4F%#gNb$v2Ac2L67jE4Ky$dCR z43tA!I$DP95E4gh)MX3nySj|^3=>P-v1C$vxTPfoGt81bSyjw7G4rj0;T3_>6E2ux zT$lhX@kaSIhaDA(CHC6dHEw6S!)~m#TRh9`R-46Xw8JUF9=8Xvh!FrrJ9fMs2#g#N zI1g?!{aJ>C4)6%!u&l9p?VBC;cDIwBjKE}F;;cnV#BRL@z2LsYiY|;O1K1LjI9+aZ zxCR9YWK9SHE$mLz8oll%z~gndd)+8r19+R8P+jUKkgOZ|E)h1g?%9Z}Obi=-oRutn zt#0=~51@af2yMvkW8-NHHfN2Yt>IWaoPe5u!N?^76?W%hIg)PZ-qwX2R(GJQJsgCJ zg*&ig2XA1WaZyh=LdypndD_h)-GY81S>Mffwy@y^O@Jjs85%KwOE#>qRkQ)}k7GLy z8&+&@tUF3JF?U0RELsnC3b*CZrEar9(>rmfB1m)uyQ8#k%(ilv#?uBOqKODv^5L@l z+ZN_9WcTSPDK=vNvmMm1>4E<+dE=y_@!*bIm_346R7ZvlS!P>gE7pI~<|I zNCrNqiph%B4adU8BsSw3q(tFeIr4g8P~0&nQ~Re~0bWc5^NcVzG{IJEAbh=YQ%^KL zzok3S#-HZV#H;4d_e7%|mzK8REJ(XrY*QiGPH(o%!b%fB+a2l(MVg}6g;whjLZ~hH z>X~2XQ0pk|*$5qm3S=8PtZE(Y*EeJ5b{L^st%zcu0Xor4d(Kpuh|ixlOdgidRe`pc z+9+p;T$yv~?!0TbqhL?$=FTOwYOC#-hr1n8;PNB47L}v2uWhi2frz;+L1I!3)>m+T z8OT@5`2N|fuFGX~A*kfW?id2ayg%UKXo^ z@=$gbjamu9f}=EmsdYyX!Qr3?A~^hQa3I`tB0rKqVB}y4)LMjkHV@J<_*+~QLk|Ri z+zO&er=`|QsZ)1tZ3MXrx7*AAB4>#t9Fh?TXzfmFj!hYUM>fcg;LVKy)#C*Q`mY&T zQhGyb&x_0rJtbH=uDA%%EE>`XfC%xb-G=zmVnq}RWpsNYtW!jL=(>R=L6H9iEJemh zO*s&jQvt$8%Dd5k`0$8gMBlYu&oa=6b5ktNcH4`KkY@Cvb;6095n^!!-e9bgvaU`9 zyO&{aj4>MZ_%DVfh}d53HiPXHgX8!SV>`;hc07aacm~@kA7Do?&2AVdHUO-Y{H2sB z^55VVGJA;Zvn;lGH-l6g(&K31Z~)TjsWlTfa3TtK%4tH>oWd*91aP+pC~WwPwbWrV zyKwi~iiRL{4Pa)-r|lM38)OyP)>?3xPY4r6H9^k5;5)JkTB+@~_AUL*?zrDzF&^ zkq(Qt*@ct}O(FuZQj!n(Y$k6TvJw!X7aXoeRwzaj1#i`OBXZayRTUQ@mq^ot8c=H> zL23jV#<^upU|tOKh0h5ym}hpzNHJ7aHe-7NIs&R8xw@LWYr z2%D)9pMI=4&|t17uuU?e?R@BFXf@Y%GAnpijSOjiGYki@ge8RW7g&%L!jz$@i$UfO zK8B3E$|f)=hhfcV1U;(tCeWDL6CQ{GmQ7_$?m%*fk;fMoG!l%lF#*}Em-=W}oB7hq z7FgBhGn3Ea^0I}A;Z4o#iok0BPprb`;dL&%_+jl!SS?<4Df@3(h7;;K{Qv(lOw0Gk zDtrZBYJCDbndC^sxYx8O`^ufB%OqY{e&VL6k+witL+%6r*>nK+=y;fd0E9wh_>wK; zm?qkd!^w_pK*f(|ST@|#9*A1DZo8+ZY#~2~W892Q8jF>}JmV|Rv2(c0qs-=KvRRWX zqMXQV1IXP5gw`64y=>v)aC}M6`ou`uBR2xgV!$!KV6?l%($-cJyrrpW$?e-h9wa8< zc2TjhA?uxwVByIVKH{tkR70mokYHfv^72pFBt{>zS=ids$%EBk)$Fh1xPdWVhXVjH zOBW7CbjJOW5P913<2WvaV=K$x|5^AxdsSJOPLA@#W=q-Z`P4R2mkX%Qs#p$a0wGh` z?CV(%pbyQLuoz)p+>-l>{#fG7f}^<{pe{1E44dYxmuOwQI)t9`Nkr68H9s_e_SeI$ zRWn05^p21b#Q8^@dWx6Lp4}aa_jGqMbe(mVht410^`Sfp=jFf7jpo(PM=kB(=g{BD z=ucEf>p~ztlu!Kj?ZaXS4~wBC8tftFTiQZdIm8xiYalt?gp;3DWw0wW8svSlf(YZZ z07OBoAaSrWk8v*6NL|bV|Fb)m#nsS`pmIK#6#;++`APp~bVd@UgK5ByQ&}6!s)Mtu zx8T4!3wP76)QoFH2;GjTPB6j4om`dR8WG9k-@I7f>wLV9 zVrPi4bNlw~!(6&_1f7A+W!2%?^GE3SBma~;Mue4!S{P9A$g!@xiGu?aJ#@sXnD+Dd zKVmHou6G2&ElWGPaP$@@$`F@_T9J!x$$`5JX$h6Pvq0M{gs-t}ok3&OY&v50^_-SQ zW4P5=HQXLY!n?OMhayNTL9*C0Xn|&N0-(yHS{g^ucJIA)#=w?97<$sth5UcKYF5_V z{Dp&nY8N%|XRz;5qrO@~u?}`1uwz4P*6ci@v01~;+NqFWi~7XbWN8T{S_3_i_+=Z> zR^@Vx46TL-o_$cw5X}Unrn)J>4^_>gy^o ztMZvmVntxv9lyDA8B!wij4Y@rFN%`?u5M5D3LtV`h-N%IiUt0THz zCCoT4fu|7T!DuSC&n_O-9~WAd`tF|2%TS%C8K5Yu7MH=!bT`2@*tk8XukEwv=e%7q z4cOVuuc$G3M@Px-LR2-uXxBEgdWtmhmk)ko72^|dcm>Oz9*xH0ye0=pc6yF9VjqAk z6iUY!g+hF6L*Hbb!e?h>EJH2I?_Lut=nyutFC8^NT!UHM$v(yUuOfVM31Ipds2tY` ze9(pe({qO4v#~}YTkk>HbX?hY_o#Ol-lyi&JJomGRDv1=p*ja)H7c&fl|?vr)cb6_ z&&a8-qIcz;=fu0mv+L9{}#a zy++{#?vLaC?n0w{l{iyL9uXU5qqu+`bjpO6#Z&ZTRNg%*RvDZ9D_8q(YVh9_jWdr!1EdL15r73SUix3mzD`1mXryvle801&+6He;e2Dah=0ea&?(7 z1y?z)J*anIU6v3U@v;Kf-MG4OZO3&#uHCry;yQ>6pYI6HCVYvB`*~bDaIL_51lJT? z_v6}&vip}9h4Q6F;n%nq;{IdYU%=gYBih`6cU(qXPvZUm?d)9Ote*4#|NWjbrOTwN z?w2z)(#<$CbI!~eVoQT43ZZhTxmK&2Bq6>b2}Ou+2qA$V}JLJ@XXcAH(h z_-&m3>-GJ7-sk(Cv(fDT^LU&&^L*bv_s{oozUOmd!!a|44T(8(@y}ThR^vSf?}PBl z!T-D9xE%j)#QR7%425hHUX$_v8oZX_|HO$g$K`iF2l@Ye%Iy%lt(_T+FGL)tDf*fz z$G&zUFJn6V88`p*;V9cA^CeC^4m!bUb&zp=1?K$jC=(|Y-RGhROcJVHdCWOx#*Aq* z0%<5;b)0|KGj98CyU-pZ&#gK?HIknx%a`j;H#ZdhfseYKj~G^S(TNq4agK%YQ7?8r zhS~^xv2-fGw=#9wB%=-U_`ck~_ffZBBxi{KF5cS=$|~E6WBq22xdrX>F>H^|`r_*N zqx_Q|!xl36$N0BD=Jt*(JH>w$+!`ZJKW44lzs*Eck4a)JDd#s|dthb_ zF%xRX*l12`7Z&__E?V6; zeP%6nddBna5G-J@LG@8UcA~tz8miY@cuU5^YOk0?;G&S#s91D zz8$X>czusoSI9=_c+~MDPKup* zHqP}R`yRR$cz3&Ee<{4@bnWS^8 zySz_)_TjPV&|_n8XBOVsng|}~7oLt5JR{HfGv0IX{x;s{;C(4x<#-)7ahkvR8ElR^ zcfH&0GyG2x3+`!0Er;MF2sWcmxi(P8vFO0j=*)@ecqN|+W@12QxbR}X&5LfowgY?g z436PC_=p$XW7$!TPrIMeJWU_$9YX zuc45$0rw(HDb}jr=Q)EWnPTl~iSoaMNcY5g`fFcu3%woi;8E{ic;{glUsK~JVzm|c z%0@L<^zHJ@XfmG%;$z;K)xlw$SBF*T!vyplVPB2r<-i$%@0~MA3on~u8iB3P*N@XN zBc|k)W{NpzYMwI%UlhfsWtpW@T5S5c##w?*p0f6?m)+YVnWN($koy+AzQOC?cs1#X zrp4=Eym)jhzkhn@W4ruquesgY4?i#L5ob2eDlW)# zR?qSe+~AIFJ^&k}@!R`9=J)i^-+Tz~6pZuj=7xnU4x z9F%b~cDrU7Q-}2QpL)Z+>ePi7n?8{~T33x3j@QdqAP2m5dwCAF`U(cXx+=&kux3_b zIYcJ-T1@bXU5uZw@w5kai~IESuls|W7hQ#a9>)oEWXV;TK^# z^hO1RZw2$@mPzJlVtJmk@m@6GBj~bAVgq7_$8fwo*Ei(gY6V3vV*KEV17gY`COuL0X(g^~@# zYaa00E^oVkY1HL!MdqmGV27QaP;AdNRRH@v-go;pFNcB|jfLRU_uafkvmxk|$)H2q zW#B$A7>O6(!E4vP?_Ln?F&O*oaCtu*FO(`sqafq|c=v~W`*Kc*(`#U~zn_{EG&$hYUo8`k~Jzn#A`fWaT z55Z<2hkxw$cl-FYAG2!kGwDn_K5U;=AZ;RVM zry!l4>p%Ln+rgi{#cf0!X^f_C!2AncK{imya&c}kKx7?S4FC=W4rkkyA2`wtNjZry4`K`Gn%L2Y7I7G&MQ9|UxZ{bRSHagyouC^~m&oWPJ>k@T;H z)GhHJ!&~#xbb5d(O57A>4?R=<37@;2{Z`wMQ7WC@9k}~(V52hhsO#Ug&F$P2y9GO` z!*vTb%@OR-xE$Jvhx@m0LuQBjFK$C`9l@qMB(wJBgZ5B-rEC+8>@#Xx_)RoPx#zuj%x2$r}M{AG*Vz421auXRWHe`B1Z`~yElzQ6N}_%_Ht9d9{< zGWjn4)NM+%9krS`7@cC8Y2E>jGib2Cm9B&RUp_^=!G8D85aH-_dZB;kHn)pE{xdYq zkaW7EE~b^KA>l8F45wQt6n+Ym!|r7xc;hof9pZn@sO9N&%!G-3j)DMfGr_*|1p!|K4Nxi z1mVUr!{%*74<=Rv>T^^f}4?cO2=*=oqzRi)Frf;t~av&{?% z(WbzxXH%X&&aO$PM~5S(X$-Q}kf}B3_(70uq#a_gUPGCEkhxh`$3ySbrqe@zML!q% zKG07NmcG8rfir;nGG3$o+Oewg$4ZcwJO};D7n>zR;fEW1VvSbGEtd zo5jG+YPZfun$lNRUC(9pH)6 zc`P~cbGJiZ9-9{eSK8r}U8flI?PkF+1=)DlpNa!i zPqG;`A&Ts|!ThRar?rVuTJC^zC?_Nm*U z32^poF66IlbKADyA+j2xbr4yn*f;KGj|YYbj;w3gy-i~Li{v`b;_txs%{ikBi!Z^$ z6}N!j@TM^*4mtf#vkXLXov~nUyfqy}{k@h0HTXgBybtm`2lWC*ocAGEg3}zHBawdw z-wEc~4Y>~vb~C|Ze=2yTvcC+>t;M83Z&;QL-vV=YFwDrHKy5MDx;FD-Mvp8yLeK{W z`rdJt)zQ z6o5@~om;`&VJv0!yq7{2J$8``?s)S$k4-$?vgl`l`!q*<)SUVcEQ|gVu(uJLkx7m4 zJAlDW>bGscahAoQ27C*~fOOFf;K^!CJPV!!<{kB5%z$qIqbCDyfdk!H%D(gf$8#1# zfPw@D6)?C<1y~5?ZTJPyvj*Q<1|qpm9eD16=rZI${V7chi+(hC4Z6&vh*JrE8TKZ* z&bduI%rIn#7J_@kxs?v8gs*^iD2F$}tug3=`!%rt7uabTGw~4N7x1^L0)5d`F{Lj8 z|DyC~dk}DwJd<3f7JMu+;F&WEbR#&}TrV(io!h}%RDjpP8&!e#fVugeNv`t~xEJE_ z1fKEon_-qIy;lIik!l)^0n3hkbg2SQh8|rR1h^i27Ffp2vtZrCFM)R;1M1l&vF3)Q zK)u0x!UA~C00_2V5Du~#oB{6mVaQj2M=O35yi{>;LBbsHF~P@vlINTqH(UVT zivmlFjsfq^RKSZk^B|b4X2Ij&jrd%szb(*K@Wf{3>V_FK!hv?B;y8Gz;xoYu6we3G zR{R9Gqp*j7+aVY&0x-6)bcQM}0;d$84eq0O0eBq>EM4*xxQWt#2A0voPUF5Z$`F242MUu=zD{CtPmam=CMM!2+VmeoC0&*Ktlcq zcoYO&I82H-aP6&?#b0HEw9n5t@_$)A|v2Z1r(_DBWn6t*@j{;1EfYVA0 zW`a47g)atk-U`nJa~%+#59TxzUI^x_621w{X)U}I%vluFpDl0~1e|7Kuma4Zo$$k8 z94<4w8qA}m=$`@eXeqoN%%h|5tKbh6Zv=A|u>FxD&bttBnwS)EHiKm=OZIu%vgol# zZ7^$un}cOzOWK!M7X3glk2S(agE8%G{%{xy0q4CKoCM~)7aj%XycZtJ0E)+hIqyYZ z3+Aj4o($%+7M=nAXH(C7{>u{I83;my`@oz=;_wid^H%tAFsGsL(_l_h;pf3a6~6-J zG#C9Jz!N1usG5&Yw5Y2qB`6tFJ987iKG zcxSc7_?wP9OD08~3T40yF9&y38O|p+50~22-~r%1L2)9^R`4jLZ-f&CwqTXjA7`jB)_KmqAt+Y{d%=6rhsGes z8HUpBMGNpui_>%#c(T3ONWKTWN%=nr-Uxe+RqEdd56q8&m|SNIczA|A*ZB;B(HQ{_ zk6=7W;Zy|X5vL`pOExLu90X08g}92Pba#fWuUmzUn4pKN~{NjWlu| zR0bS0e*o`QE%G)v|KOO7;X3bu2PpmsoKUYuA$#cOx-@Gx5PfkAAR(mGN8l9is|sZI0UWI*!fB6Y5$92+IPX}uI_>uPk%G1E`6}& zAb&a>o#ikz%i$!&v_Ch?e!9}LKo=;c{Y_c+zR{cd(_vYb!?RfqFDX6kUsucwzR0rw zv(nT4Z;EN(yaQWE@<$i6h9FFJ=?;qNkO&;aqOnt^^vvKW#k4;&%YMAl)4ql*`O{$@ z1OqXRg5xt*s&6ctEL~?ecrNBWE`WlStvxRMN2_Vq6}%97S^16yud$yjabcPc&g~sD z;SgaK*keGG@S{XFfbbRIWlFyQEYFWI;FFfcejS(@3cm=}gKz^lOm*ouJ7(%{rrlp) z&_|W(w4?Y~%MI0^;{JWPfwvY?4Q@b{?E zAj=Pfcc~`*5L^y>X>wj?k5b$pyjj_w4jxnzLo_DWIn#q+juMOq?l-Q?5_I zc-AkY{~XL`0Znq9ufRVl{ua#V1x>>Be;oufGlGco19-XOpTQ13-8Bg}7%)HcQ2^nl zU=~QYC76#13LgaCt!7adFdrYpsiHalA8Q5TFdWQh3vtC2G}(ogMSm%n&mD?>rDf4S z2Iez~IFSncKd~(O&%u0Nkp;l{PsC}4M;Is&gH~WZ%!nHwL4YGHi+(Ve4?5!BQlOt~ zS@bi&d;n4wsyi)<{ys1tj>N4ZF9`6i6^OxRFrS>1X_&Sw`bKzkmQPh8K;R#@Ecy~K zpSTqN3d^FO0Or$}xm=>G`jW1P~&-&+>_|AG04CvKbs z@el4{SoHnDeEhRL@(&D7w*oOZ3(RLjr3a-KN-x2RB=oSDlo^g=&u0t0amHNqn1Vg6c`V;dKrVy zjKJv8QC+B`)pBCgC(3j3;68Mb8UoKAkIi{CH2mqCWz>z=MH|(pm~s zfXQG!)++&g%M##DFdzAC1OW@U(X!~@1@m!WiT{&j(Wk*4*Jcqk>Sfku;pSky_O}Ly z31`W^Svdzl$om6lE;TFXc*`f=W|rRE9CJCp=yr2#7zjNt??1d9^N(vk`-p-mcbK)G zS1;s`z+C%zcqR8#hJmbPN$^qNs0}b4oDUX<>%e?6Iu1Px@PTC@60UB+eB60FD7gK8uwiPc zKN!49#q&l&zz2k5P}53-oVl)v zUt!tmJ!b+0dvQWwQp7nA%m>&_a-EC8TRNDhnK;Vt2X6#Ri);e(0e7+g1pIgC8$m$( zoI@}umA(Zyg$JF@w8rs21wkJOBw!VoPtHrg$zVQ3FMI)*Ptgls2L2uy@?4Y|J_P2| z_o9Ci{2BCeEcq17r}2ZtYL;`oxyx$UpOC}ivr`^Gq4{4 z)-8A%cm?bSLC-F|)3W&A2QIf`AUOWN3jv>j-)J4$_cbgIUBP4FAS>Z<;JIKqxXb`g zw*gs!JHe}t3qSk)%Cf}!7QDiYA#?n1-w!8=5J;a51}{;AY%;j((3tT@jb?!Pg#eRW zXErz=-z6|9;#>jdmm5rSo$J8-a)a;^@V^nCpFajo_!0#C7K9jV1n*J>`X_j^Dp2?S zxKVk0XnzR!FVM?UdkUD}tdMwTg5QQ-x_CbIEHLs%iZ}});8z0%1>`zkSf-Xm{4;ni z^xtD)V4n`cnoBmxb&dt6R11s*^Q#=99|Pt$GlVO_BQPjEDbXSb_!SN@xD`Ac2C@*n z0v-sKS+X0QW@DDd|7IQ~mO4+4IdL>v}? z`8^Zi8^QAw-wwV30drx%3||NH`zK=mE|_0n5#B}$W|4!g*JQzq9ltaL8&Y0vnCxK5x zzyl#*i7x{4+ccuT5_~oE&8+@0Fu$rJ`gLG_^G5hp@Qtd#-+{e5AvgdQ%%Ec&^Ag- z1||F*m`6L|e}Z|mH3`T6pCI7TO$^dt9?gUs6`P}-aC7iAO5YmHg-G-rz+6X!yMcMi zCEN?lg(yh8|KAsaH$(tF49tZ`9FpMeijM$uDHZ)-@LqL;;W#iC9?_o&=E5X=Dwqow z6UKkU83O^QokrPAg1N9E@%R^U zu7QB_)TD@W1DNwz_!cndt?(USu6)AxfVr{>KM3Z+Cj2Ov3!Cs$V6G$f_#1Jag@E&3 z3|<2BBvbfxFi%2--vaZTPWV0W-xYrh<~gD0KLzuYP54VN&p9*4|Gz@Ovr;jr0}ogH zBe<>A@-v+@I868iSD1xE z_*^hgvA(wfwt~6x^}*7}3~qhE6mYx^c)&`t(&02e$l!P|7dDA^9az5Z$pX9s#=_UB4)ur3xYL)?}=a?FQ^N`6f-o$WYWgiq6ys$FNFb;lsddNxe z_=`e59Q>o#DZFsF7Xp5@()gW(&%+^jcz6b5P`3hcmz&gwrkG4dxh0S?=|iX@OvxVcNb1mhTO78n0G0=B)S- zydD)Y$#u4Zm(RQI55dgO=yCm8qjoP6pbOAcCX)>uU-9s_$j{t8`6&M8G zEzIlRV<1?6ZOn#nonhd1i$XpbJn@c@&j2r0d^UK4`hcPetP3~^9HzST$*3R;#4+Zv ziH5B<0b&ra52q;y*5Equk_V_|a-GHC#8a_=$hU$AtPgn^c)Q|z!9OZq37+$EV2}BS z0FObSOS}dgrn>ZVidmqKz#U(SSrgaU243??$UDGW{t@z5;MxBQ`CIVh|06Sh6rc`* z-9J;nfg=c47=L;6}R;o%)0c z*wOOqU>4xz95bz|Z2$&g0q25;HV-qrDl5Zll|4WGzQM4`p8+1pa#)?^@U-G!41ja6 z{|84g4@R-W4YNS(vV+0gAH*cr=?89w%?7#z+K4j>oal_}|6nOZh|3@-x4RMWXtxr~ z%|#@@qu^tqm!sjw;L%{L#K;asIKpIL>~TT^mK_kNk6RXf5*+ssz_kI!Q2-W$YH&jF zB(Q#lb1Ikx7W?zTETHgguxziu0^Dm^^ee$0YaoKhAkc$k4LD4ghKhqO0IyLkv<>{S z;+^2}D*m@%?(<-h>wJF%#$QM5i*NuWEMa$iGQf=-#NZI{3Z*{<%nctzeNkRl~!{9tPNFVcaFqaui~cQ-msTj zFvVc*Mj`eC!FNC}r)(3z+}%R-=XnssVZg<i^~bx4RI7`@tuw3^sweO@`>Vf_p$O zEtqo@PQ#V{K=32bONGk7*cv0_?+t-q7Yt+;Oa(W={tq2t!UEj}<~|&f;eFtNuy1Yk z?}E9_hUm9|6UsmOJKWS#`WE21@V8y!IVlLZ$%h0u8q7^RgolHl3mu#b89?bT2UkEJ zg#!z`3cOh9p8=l%y>!t|F!uy83CI6$AsDSn+XX64 zmHipu^=i~tfVugINv`vIFgGL#5|95gA>a-pCb`a~VD3C3JRi(mNrZ0za|aXQrC{z@ zB76^+yO{_-4Cc-!!cT#@s|l0GMq3ZTE@kirc(>wBU~Ye663*ekdll~jb2}8#{|(G7 zQiOj5b2}B`$Y7k{7)JgmKrRH_TSW}ogSi)ra16{nT7>(76N(dH?#m+jqrkIOmrerf zE|~`Ax?_)j5$6I3IE_q-IG2DquZ1rMbD9cY4Squ1C0hjMtPuUpU`|`%+rS)z!gqrw z^L&8y=ke=)2snyOia3vexpE0V0p`LaycW!9B>V!HE1~dfU@knue*|+S75)>L>w?K2 z1^5sGPBSss2Ii<2-U*g%ZaB?yk2Wm&HelKQhWaBdi+%{0>x}U6U~Gxw$wJ`FG=hx5 z#bDX)h5_%lECC(?%QiREe`Hzo+reDOguei1w%UPxiy>qj|HYs!1YEg%;Mj;4syt4|vKPe&y0_ zgVOWxyd%s1Yo+HY*lw`xe>5coP0H(Mcpx}Txbjg<`*@apiPAHJfr@EAI?Mi?@-Tno zQ1&ACQHX#Gt_mpvnLClNQrb^F% z2ZMEs^jCWN7b>RxsCxGJ{Bx`_pu>2@bhxsfLt}gtU%!Bh6w`inmi;qI&-m*V=Xel& zp5^eBGN8k^ikZQI$JMWKJ8+orwH(E?KRnBRkkVuP*QJkD0y<0pFF+r~5tWx#k6SjG z;Jf1BbxOb2vgqBRcq|9{U}1v)Fw3GJ3H~1X0TIl9W^k1ih{3hsb=VtBPD-B!=PLdj z+*NVY<8k-}%Xxk=c!1KM4IZxeYH(~6XIZfRxy~X8wkv~m;01vJi-eoc;N8%>0Y#j@ zfVuP8CF%TI#$r~-Wo z=H_iC;h7Qe5ZE`e_N|AZ$(6n{xIOd-Sp6|zZU86#CxPS8d(vbVL2x7ljjh89a11P6 z@Fy^LjFSLcz-L0=+}cNnqXm>c7u*8+rdD4H=FW5CKL|XuJC6U7;kgiSTRJhA2|ft{ zq=0vWb(7u?mW}4vf`77X{Bc49=9m%Q2IiO%-U%MiO&$Ngfq;WZ488+%&G_jkAp}AU&BDJ<-5UQs!RVvF&C;1C*ceTV@B=)4YF)}aAy^~QH`k+z&ifO zlY;p#S=6OZhk+z!a7mWK6-v*Q^BTppe>ls2wbIl68O5~!*voSGR2k6WOT~0ZlgCJl z8K`txdAtz%YJ15WC z5!N&n3kSqIU3;JFAGgMjPC!{A(WAw6B3$TvR)>j3mYmqO1pv7&x_VT^y* zDS?9s$V}WH&?MIx2)*W`!9OAcxkoew+zK^r1qT+0iF*s0Wa4RF3VX}`+QE@d9ycV^ z#+vVfv1ZzB%(CZ3huUBB3ixY&7#yo#SkK{Zi8_Gh4_SaL{cgqEpx3+;JQ^8D>*St_ z1C`=Z@a$OFJ(Z`T6Mlq&?yv7B)Gv_cMF^nzW^f7trTJe3Z_KO_jhqc&4nUJ4&YR#> z>Y8Gc2Z3y@%KrP0WpQvvg`1yJKfto+i@?Fwrw~wowq?;*fjMA>CxMrPxt7u1TVe%b za66bISa>;@Biy7M=K(MWpy*eDIRJ&91hbEY*MT`Dg_Mz~< zz|+CG5U|9t(+rEgHyGQ(I>lChvSrbq0p=JGJ{yePW1T|-doSWFumUl-9?UTzyaX(} z%(4J4Sr+~4V2%Odx4^RdEbaeoS@e6s9E3sQNqFS+`UjFG;4tB$1FR1u?UbI!3EIle zx@@C3^qQ&XPP`_$P7-?IU=cbTg1IP>Oq*&j_s!J@9N!Vuwj17M?d@XosplAN* zg2fOlR}Qy=?@_!Ayh-uB;I=j#p9xwC4imm~4Ax!Nd9BIN9P06P4KVY=m(WpveD1pp z0%i~_B;awcm_ABD&r9#cVD>2vXaPU`s;N=T`hN>%fd^P#g91pBF``>&6ZGVu{?Y}q zxiI-d7-(j&RjP@%La+IAux^pBz+u9bG~<;@7et+Y&jtRTgO7QF8Vz{Ol&Fv8nP3(` z^mQsAYt&*i79K22Ik4xUw*>rW*bm2Wk&_d$NqBJG>V;>6bMm}!?Y<9!{JfCg1rJwD z$HbH{U^f2*`)vKFEc?ldx$R#oPc5yD#yFWxrnzv$Et?W!#|p4)PECDv?(s|bikIp;LD`C^g&=9u#3{mDA!F~3cY5AlI^!SY6gzQ_}2m&U@vaI zAz>sTX&#J#nyKe@-6k1(&BwuBGwtRm`x8AFXaNnlA-G8^;49^=bICg!ct1RR9#SvD;aaXtofgY%YFA34jg=$nAK`MKzeEsMSk%#G381pYYw zS6hJ?{2t6*)1?5nSQh;qVD6|cCnRrJ7X8~`?zS!$9Y0tW{m)?T!XDhd;qkxE*+w7+ z1z>K`-V6e^z!=M-9|z|4?JcbSTFate4CdDE;{Uv5(Z2%bw(s=EMOehyZ3SZR4>0$H zml}3E$FS&ofw^D2w9rYGML!D6z2r?3<0R9v=&u5EpZNoke^A5KRv-q?fVl~Mdk9#- zot8!a4VW9$O99)AGc5X!U~XP7cgTiV7X9&HZff6@>kl)SX$4|%F_=5vOMv?=i~bQX zcf%L`N0vpu9n78bJ3zqr2aGo?`W9gBqMz$ogOnAB!BJptu`e~8WLfmnz}$Xcn)r6h zqF)Ziw)~mLGv2Z+`uD)xvEP#n_F91$L@JzMJAau*hgueWF_>HZbGc>>&#^4}YA}BW zKw9Vq%c8#pjGqYbG6pXjfzc!28({u^fQ<4w%M#!RFn?P>GU!=pSoD3s{M`Y$O?#?k z(T@Qy?}g*PWH2uf^vo3CS}>PZakvr8rB!$-SRbtJ28XFG{Qy`WtiE{N9E{>H;?Zx& z8(29#9Bjs0!LtzX;1Zm6!=T3>oZ#Rw(CS-kG;4VT%yY(*z)$0o@Zbyxycj$_FFc2Q z56thAh`#L~%~CJtm`lMP*Y@B}H3DpfV6F<#^-Z(Z2Tch5Ibg2!5@0#_S(U*TV6Oe5 z&wtCT{lR@^_}7BD_Dj5#Z(;uNXogF?ph+H8O(@56{#=AfuJcFeHBKvRQwO{GQ~fF^%(gD9435d z=~dMqB-DJI?*G${g%&tGIajpZihGPE?m^BppmhYJ+$Kf{U;*nss@bO@5 zLKboMKp;P-LN0pWG-0WAxI(pnj0ygHib<|>7xbDb=dZemKAZ1@z15rJ9}QN|s_&qA zB^)$A240F92BRL+mg&#Re+%@QKcm00Z&HmexDdZl#N)qQEK*<+ZmnAbVZQTsV1A9S zfqk}qbCx}S>qh$r%=)8OoEs1z+hCb;xCMIF*d#ox2xg6h?*Z#U`yk_GQeFB{upYE8 zU>#t7-ZH#%&=q1GV4sw`hO5DBa=BKUi7~-G-fit41ha`nzXi+|NLc+-ssJ)(bcOx| zJ=oNrEx@!v)p#=uG*dt7qWVp!`4iY{rv2tDd(EH0e)C26X&#eI0e(~tyI`Q1cCm}= z+sjY?umXRDz3zfN;4tCw3$X5jH?eMP@KEE$uwoa~aP3C{mRSB4%o@$Lycr7#o3M}N zy($A~VqKt)HCX$z3cOu$H|RYrKwM|ToUn$yV6agQvc6#aR1(dQ@NG$O6Z{&INf9Rr zPN=2%2yjQG9}IpS=L=$gTn*-*Zn6_$5T?5HsbJk?AH8B~G!jN^vDF`#3|%l+!e7A5 zP*%FZn@xr}fgbk(!K@HlkPF=(He>v;2C`H(`_R-dSXf{%Miq!nd;wS&_!6b(XNH$& z75HkUmoCyRe4hscEkMDXJ*o>6#m)zHJ63kKW z33Y+KhFbWDHj#r)y0Cg422rqj(*fgf)DJQ!eO-BdQ#%$R^>=rqv7c zoj+jqYkVQ>MUVbBgN8pwCJu98K+cCiGSvDtRxkE^Z*qC)|19*HsqcD4s8`JK=Q=OJ zK^wdd-i|Jj8w`8E-+@O5))D$UE3*P>?lQ5yJ`ddP%JB1qi^2SLwm$m!Pk~9U^B-#< z>`ubX={|OyK${Ez^QYZ{L2Fx(EcUCdUYPGJfbcWW2OP{l1XvHjXk^e87QCGP20T+S z9apOWZGMkFM2nadaXNxWDeeyD57mi2AG|?vKk(aNlRq+yLoigW-6dfC#LGZ1yF>yG z0kcblPoO^vEPOJU6%rl|W`%^ufiY`r{`d%`7J@Lr8Zet& zE}eb=%WnblU~>4!^)r~MD#U5*gV}`%lvrlfYESj)C)NN3L}I-#4d;b}CYwKlz1DvT z)(g>}!C|UPe+Skr`cJU5Kh`;XfAie>0eXPLgy%iMIzWG=r~k=W{%0sXkB(<&`B$AA z<{uQ`nydhevjX^80q#Tf=P_-j^xJy`+%ofTlO(g!U# zIjaT1VL}Un>$RY#3>bjMIah^!J`{S*CxLYzk5c}u;aITFV7$^x{5~qacPR|C;0o{x z%+p{NV4SW3Zv+Rk0L(O91^5Vh&D1YZ`t8u;2Q4#8dE+UDX@_}$O$Z@ih9*UvHemel zWo9KDXj$|}gIOTqpM3cVc-2Q}H`k1kkm4PcLin^53E{lXf*3GR4J z*o5zc`J=HW;frZt{>ZHGm*8cJcZ2!Ev!eeO7(YyF^GAliK)@f76$8GnSQzpF)9V)~ zTb~QPwx@o(@^1~jX6lFDpiZNWAk45m9ERQyau@LOo9qdM9kgVV+~7@frM1`k;WyW} zAMPo^1UO_H?6{@AgXSr)*UXG^Zw>9whh8)Fla>A==shi)UI- z3ig^Auj_50{dLnZ{^0Lq=kCz{XXrHt^KY{{~x(p6x+kahdi#Ftwzn)|>(a{+ib>f+kEvM#$HuJ5mT4D2=2p17UlLV@dygM;Q8a10rm6miZ4f1-xxd0;lK=r05xq4-iTJ45tWg4tO?;=>l#Kyb7O zz&C))72g6rM)4is;}qWm9;*03@Ck|^1rJmF6qqf@g!adNXAqpI3|<1Cr1*8Po?vf* z!&H}k53DEHyW32GBQWBbLhJ3OLP3{-M}b*DFitih@F8Fc#b7I#1rojt6OdgX*Tpw| zZkkv!*bHV13b)^3T10pZm@OvpJ_NIZ_{Aer!j3ylp9d${nDHO08ghnz4<6W}C+fo# zasCgCAA2{*Y|qDWOmSndZn0c&nCjAPz(I>4f262Whm$2{&g@(p}U^cPvSnxsM10i6BS6LSQb>Mf@(tIPh7wlbYzuvOgzd8%! zpM55RjW8$&%Z2klEsOpq@CfL8L%;&$UuanL{lFJM-`MI;vn={E!E;o86&?gDAZTwL z7FrgEo4_1I!b`!M!NElp3hhsa9c}!D*QumnDCA7Z4l^%VW%>XbwLlx zU!d2VGaL6V4h=_j0XU_YnJsxT9MoCtIiul_ZP0a1=x`474gwyGH#YeK%M8R(e?6E5 zFe&0J0kZ(Yw}Xc&UJhQKVLWW{00h+qp~EV0?|8^hf@djS2fnp1)V~PUO}qgdCj71u zShw(?FH8%@F)Abcu;qFPnBhoxaqZs(W`;2sklTD|GCb7sC@^a@+S=a&W{vPERbc-y zm=$`}+HXq}Bvr9z(5V#yH3*BbJrv41L6@sxaXaNsq*ys|&5}-MleJ0!*JR97}+7GlW`XOL; zf$#}nJ!nq`OZ(#=>_-BD9<_hLRUrFlC3=Tff#U)PI+^=dd>^TrcnCoIrEsWRle{uB6j_(BcLgDzxYbPN0hy=JKKjo%l- zCi=w&pd-gb&Yb!+Yz__+PNTuPhTC?U42Giw?6OYEo&_w)iZ^hMjK3f%e)ljd;Lxl9 zHCX}9ReFx0^RoOeRC-zYbcL6AFwlbAz~yK{IZ1pCJXkg9ca}{nM4W$Gd*PqJdQ7Cj zVX8|vy0m_adCeh^Bqf~vV%Q~ppx1mTcr*&s5l)<@XMjh6UCWnSHZif4g|!!61Xcy~ zoSPvCQ(gKtue_stN?qIo&kc^cqtqsT{w#r$H2OU4yHbn@WYE>+r`vGoi?}N4FU4;#(8^~ za*z!3RR;WylxD_`zY-QGo5#UETb~N-gN!(Kap|N2R70+7@cY0nFvFj^G;h-CLHaCK zMiwa7EBp8j8D`Ttev z>3`5%<8Q@{oz4)13Hug*3fTdtb4DcFQ7hoeeOm*pZz}o+Puq68b46e81d*pIa^Bo(ifpvgfrDuRrur9zr zrKkVkEdOJbp8n_2U+T|kI7=BYz$IA$<|;h{Ji-8(GBFNI!*wX?2 zstg$5?^yx9S9%8MaYg+CFGb%%L;I; zGGGCQWd#_i^bBxGmj7I(r~g%1{?{r!{e$tRSH7oVp!qqlZlRY{0A{cOtZUfmR^u;A z`5%=%GyJ}OJkR+_88F~4SplOw8?}i63c$KR#Y#{A6j&GNNTsL$#CrZX{!dW`3@{@r zz=cZB0Qc4l(AarU>FK{J%l`?br~h{C&*T42WxxPmX9f6H=^3E?RrOn-3ph;JW)Q4f z;9#Yv|48MJ{%`D@rVLnsu~`AeDLn&Rs{+vf2BoL}k}Ut*l%D<@LVu3G#?Bv=0Rz07 z72pGAmO3wmRXZcT3dipOh{x*LU;5KEz0C!~txKHUB z;9V2ImbtO>fzs1|OP2qqN>BeL3)ljZKMK$Sf-vFY60BRGgVHm=(Ln(5XzU!P^en*e zEdP_0p8j*_pUEEuxLg@9!2GNL*C{;%Ji`EzKm4CpdiuYd<^MW(Ps^Ayud##A5M1X? zus1qC7W^7F1@A*J;NVzr*NXfFIA8I1;JvW#gG{Oa0h~~J_ZobN1wAibsc!=w4$ifl z58l)>7Hq;oebF^&e{MB3+8RuQ0Y5at1A0M#hrzsS6}Q~-TJsRqa?9s|`HYnC2Vg!8 zQtlf6&exf{X5v2w%%{9oSpRL;q5b(3mk17Dh+8BVnF|q?@Fp;y25DjgZUOW8mH{?E zi$&&Pjond`;i=%CMw_eQ)_BV41#mfP47Z>{S6^@L6P8=v>_Nb174xm2$qi_7JRVYQ z`FCJ``n|~(;36F%vodYcYyhm@&hfmUJU>4=z<(mfR14P#Qo})hP@FG z;}YK1Nu0}lGf^0{Dsa49Xc z49o{`&Vrs@`V|>tY+}%&`20U_2{N#cnYVHpIlaMrU?yQ5rh@srYrf?NzN9D z2h5w-ldb+9T+Gfv7tFL{;u4$@?J0{n3EKtFf_XDKu;;^;{|5o@W=nuKmZA%Oi8*iE zfZguEG#Y^)+puHcugh>}GaU=Ql*JmIbSIj8QOp^IkHyIA?}Gnu+_<#<9q-0-a>MeR z?=3&R9FLovVK!vN{a@EPUu5~-Hc^iUu@J#vwaws)hjDlN zA2DaSZSuFk{L!3EmRmf6G2!H82JJL3ehvh)>9sLuw9Vj5Fngn0lbJ&$9>n4TU?jYEs|7!()hIe)e# z?*0O%3BD|`&}MMRi>P4*js;f#1en_fZnXN6mvFbfDztwJ%$@#bT7B8e(1R0}p91f$ z_OQ0w5)OU^#{z7$H`f{r2lKlOG0R#np9deZ$teSy%MYs zR)w$Q;N;<1MJeGV2>2+~dK>V5FdvoLWec$Q571+$o;kJ)w!CW|(w=AaH@=4!LlftK z*#*NtFt=_OSpAld>mR(5TQL9l!~+IpFbF3?z)!srHiKE8)IVHy*joQ+ISb6kQAgVr zykMJo-Zf?8z5E&GJ)Vn`LEGnZ^PC%oT9Dte9XNl{N4NWTVkv*jzxU$EtZo&FvWkjC zX|k%UsJ5uMr1H?J2^SQ^opEDNDvX!-v9{4J2OU>4wPwbos#7OkFm-1B@KO24=MTw0 z#sB=YXnVi1Z8X1oVrtFonT4ej3**Jbm8I2*%Cf@ZqRPVJW1Rfi1#$nCDFrHf)glb<}SX-DZt1YW8PLw8Ul9hpz$)g;PWqQQ}X(EYi`>860ij3C&SelPs=?*Hlzgme#}*)h3UW zUvXJvOnzBuaaD0`WofD=RZ&(`QxW7}Rxezs|K6*SPX2<+A_w|A+eLe{KWDQz<$ug7_`j6&ClYXlkA}#%QdPG|{W=|Ft1-0Zod8Puj*s94@8pIENOx! zP30p=QH#0FJ87aNO*Bk4lcy;{Bw?&OCro)$L8;657tMuA7TL@S{V`WYPV=AtBGT0F z@c_onqqj$f`ZK&pp971FXow%wR3UwPB;F#Bl_aPsF~vmwgYSr(;E#MIl6!jX zq{?YiE2^p{jhjAW+JqSuQwsLETotl7D9!AGAQH-0T~Ox4XVlhCtejYU(WIK%sS}H5 zPpJ6)lv$PMSC_2qIWN+il z#9E`dG4uF0=+DB0zv{$_H-EJ>AA z6;-6lQl*8J6(uz#iL$a(RYg@pOub?>SJS=z(&LZf%WW#$K$7ys0e%yE;Ie7b=ImJQeB^%z`#h9na zVt>6I_FZw%*~yf*uR`s+OhIoa8{XTPqbO5}?(P5XY)>y3n56V*cyD8l(xJhbd$brO@59u4p9M9>u_4exDCIp(mBsqOvB+Knkk zkB0X)rW_nff4jGJXPZ+Due9O4jVZ@08s6KOa&!oL`@cKetAEJCl%q$(dmB@Z4h`&W zbapbBc%>$vl;fZNN~Ded-o24tZc%WxWb1huDRlsiDV*K zRv9m@NY$n)tBP<+Co_2erkRG=pQ(q_;f9C(A51f2{I^Tch!rzefBq#0Mcd@yL?UUL zr`zJlK?52X22qO3jN4y3McWi3N^m}tnFqgJ3b@-cyk^T_gMHH^+Q#F#4M#gKa^iB4 z6Calu&ijoW4x0U&ay;M~Dn2gL+ur`2?6ppOT!Z_)Al2Z3=M|(FHYil4bQ}qRq~RTu zVuJ-fndNN%HA8sMI5oU0ae8Aj%Ct++f5EBCezQyk%NtIFc@v=sSIYi>E{PQQEpCjo zACT#j{YEJ=cS8J<@ZAlJYN;0yVh*c~Q`S zT!Kt+<<~+h`^}ZgtGBKOcM2LdHsm%# zYFxvIz1+S?jmr%C-oMpbrfqnz@f+P7S?_V+VC5+)v@L^wOfB(GgIYTX7@RO3eKdR; zJ`jWRSg&C%6PzRm@f+S-!O4E$^BcY8WgP{>Yp?w_VsKp-#Aj~>|F8>!e;T}+;Ibj( zWR??lK<4CU|AqJ;O!qaVMPJ9bFp{T67rm~_eRgo;IsVR$>mBp)4#U&;2cxh!>ZB=a&mM}N> zMObcgu@c-TY!y@ixzDB)=hJ>2?ihNBn#q$VO`kcbYFyO?GiKEk#;0FUIT>_r%|(T& zk-`7NYA)jE3q$w`M`1Gfh~xa4s={%V7tO3WpPzJ8*Hl+k#fuWDvRV`@72J5wob*)J zCgW8#)uoA4qO!K8Bw1V*FRCg`;6tODRJ_DX7W4L`UHg99mZq8YV*jR@RpPfyJ$&$i zu$h(mw``4R(1JK%pb7sMx6C-LpF_Ls20>}cvOWOoZ13NqTajnbjkw6;|0(~S`|)W2 z2hE^B5)@0uKyaTPmtPzR!DvLO`H59oVRdP3S#4zn4ktAwm9^%x$hG%861hATDJomr zeOKfbH-f9U9$!WJHZdo3MJfOBuOg!lG&c*(^?b6#FMK7^c5VBwBlC0D`u~WG$%)J^ z@Tb>B%GUP&Au_*_e^cjZv7gsBdXPUk6)o_OxGd7jpYe0#3%}clXfyw^bR_8?+&9{K z?b*LX4s@f*)HpvDiFWo6%Zv8DQrT- zs<@=ODuJ8i#bu?(6il8xYYOgqBooCYMffP8EKyVxPvAp5|7bUQp8w=w(V?Ajm%FI8 z5DktGA&Qc5d{QW%EBcpzf}7_z=R_0!(}zV{`kzOlJ^j`rq8+-&G2bqjFmCds^ZC(h zDp68fQJSi#DXWen>l)wd7wyoiteiH(VUnzwI&;QFFf1!cl%$GlD~f9pRaLc#>cB8R zG%Tr|GAg%6BtnO`!VDyl3_rHYb;_^2~ky!Hu1aQ*9gMvpT!IY(o)=^NR%WBOH1Q^|7f(!+Mdzq1b6L6IniY9Q_d+vz3QLp8qGT!=M;nwC zr-}>9u#~g;|G(GB&cD7$`pKrz;RE+uw8XC$&0pLyTHu!XFSU$z@Xu}??cwie9Ub9! zY7(8-b{{qI?`Rc$$Uo-!NU`7J2Hd&A=kFzc^Y)l!UbpByZTC@m|MKp5_TbQ7(N_NG z?$HjvZnC3$wC6sxkH_%wcK=wku-!hwr~E;!qZ9qjy`mlc;bgE1E^SG%#q%uLlhp6s^_V|69-BYEZQK zA^UE!`MJ>t{hckM=bE(hXnk+3zl$Mkg6~~L6hMgal?mNP<|3iqfeTQHK|DYbxGusvJqj>&R&7&#*ZwE#n z@Ne!A?c|Sag(JwGmeEyaJni=kGW9D3N3Q-o`IrFXJ75sp+9o>BG-dtc_dX8aw*Si# zIM9@&N{ey9n--bZsaus4hL(G}kRHXvkG{r@k7 z%p@BjSC2|_bNH%7vXYHoX#Okp@9TvA8hAi-ssCQDXy3KRwvV3Z`iHiNuHpEYLSYxK zH!c0bF3}xkknFch3V*#*{h&oYF66B{*p1#nUOWm`pw2hyBDo_FV9)?3Led^!J}_B@i9FnJc*45K>2ld z^L>NqhhW3^*8W)d9l$52e@sPuZ)`NL=}0`=2XN;3mybo&*N=_1icAyivbq@Yx7i{+xW*e_VH6p;Ks&pC6llW4!+|LZre*D(7& z&vWk2xz3re>|bq`)wN#TG45=#m*p_V4&Cu|%8Z+izrY#YI$T&HV;qm;+u*j>C+;!% zjM441$rjLL>Bk}}6^ z`P_e>u{5?*P=u$?_ou$j484l`Q}EPQTk+@%C{2cIop^d;T=N9SjJVI^T8*^sW`6JO z%v?a}3{@bV9O=|3osOP5bEJ*HvxXTpI>L4_PmPNuSBvy*a-`{u(h;1+9P1q08@RF9 z#Y>)p(qflZ(iw^(L&FwWiMF2A50J-d+_^3ms%>as9#@E!oN7P>Aw+Po(QqwbC6%8t zO2o+*^=s7y1<=W4C)YPzbEJjgw}3ge=w2;rT@Va&23xBQ2j*7bLOjQKtm zKxV8Bv+UCoxslY0d)7V9Ys=nXwWqeRT(Uhq{0N0bMQVCQcx|QownuUs$o9&r#nWB( zIP^4+E8_IHSun;EJaJ*e&=U~}b9wYQ zE8&6Pl*H@ZJx(N)^z{JAxlO*W#Hn|$L*k6Eey;Yy9%igr#*F74CWo3e2tn@Nt{D70+Dnx@D$fIG^wGH-t;>*h;sF(Y|?Vm7*d&3==W~Y zs3K)Zk-rjCg?seyVquy!;YIZHEDt|y=tbP)g6?Y35tevRhm;btNHD@dN2xPzG0!~+ zf36zCaG~z44ksqr!>ElvZ>;W+mQ2Q=lQGEN$jXjs9O}?ri;OeQcIXU^XNMN!cZa_Bnw7d8#>SLx9zikIAtOn+}T{f@)$BL6Q^ zLc5G`Eb}aKUNtH&I6RX|S@yDRFaekFg3@1N9Psx{VLPo59x`A$o*I~s$PwF2?*5py zkC+Rla&Mwcb9k#&AZ}wwYMO^MQV`3NdOLc8iKxUa+6c z$>VyR$=VIAFyea-RN;8^2+A{Hg~R;Dl%84cLNWGr5@RWa6>doU$yh4g+md-2u1W2L znZ_JU5FF$3G#g8$X%B8TmSVU|_KR`TfjVyV_iQW1*Xo|IVv+eXjUG3ef_GR_P{#Gg zW<9?wn9hdF%SzTCbBa8N!=Iu9U`-={(5dd|Pf^3&+Deg5cg-<5AIWF3nXysIkFYs4 zM2dI|jt6BX&m5PT9Pt?vf{8*VGu$vjkvZ1I9srH!jsh69XuGcNo}@IE?b?nEx>y|* zSj~v^?C^F5V{KW}t!a{>3ZW$Aa-wjIUc=io&8H|x_rbq5&8I~4p&RYdi!LW@&8K8J zxsCKVpPUY0PA0+_@%t8GwJJcOyksu-ZBmU zwI2F4)7MeAFTSD4y506U%>p=m}T(y0HL(%9bPc6~|4DJG*Lk&!fG zD?~IfGDjV~utf9%FD)G$tP3X%G{Obn`FrkVbp@YjMtISU{#5!s zvDOGD{lcGu->2XBBXq{oSS$RZwmdOzW-NE1re0_Mo@fOq33S!JH_&?;u6iWgWzBR0 z-Bs-x%c*8Ji7~;@3qH?n@O6S>K~vRw!fs{ttx;=RqgAD1&3=zc*~M?kWSYx{K_9c!44GhbKi^98I`|Dt0JGFkU+H(z*VI>%-yl-2 z$$+ar^0+$KJ)g8Z|ILHG0#nppR-&NSGEw`{ChUF-M3XmM&6_?F(9cTzpRN98uBdM- z0SBe9;SHL5HP6}p1BPCM#9=|=9$}SE!(W@*+(zYoLfDvV=2s#EF$e!5IHu>{o*8ZR zi33kd6_1yB&*b(^qn;OPnFrDe5mUS zuplDoYUQ);r}-SV_y5i(7G%OYlKv?(@u_%vn({f~e<(8^_X4W4wo*3@7O;^L9kdtt zYt2&)n^)=Es6G6hQg-olR2Ed`wtst*t%_ymF>8o% zowK@EYbM8zD@&lpY3O9%WCb0pQqWH|w}K+ez2L0O%)uk{^u&z#hv3OE9lrCp4x@NN z_O9m*dnC${>hTyh@6 zBH%7)m@M31Y!gPBS3vm;=yN3V)EBO*Nx zV?|+>TmJsqh!l=>%lsTM+TT7lD1HY%tR7y~#_!_o5gx^X@B&U5Z{QVw%+sB%wC6)^ zlZAFtJW?P2Xl5wliF^jPc1Tl4$lFBS1D`qy>f2Wr)OXHytq#;SY-7fW+mm|j7U>*? zuqiJcOj%y_@T-BlN)FW;UB?ZiAvJwN>EzHp?77Y}#J{UREKf&nv z6#}hCpjnzsbf88gI#G8z(yHJuAJaRIu#oVSJ;=xb>ZTly)G9}HYQDqK+kB*gyUfUH zDhbY=vrw^~*hE$riyW=&O*wVSO#`HwO2$iu5GjXea2(4Hr*c0-u6tr`5!(q7`LLX} z5+rol!<3+tG5QZ!$g-0iU%u*jj7q0ol-$X71F@;W`N=kV?@Nxfe15XCeo0t{9-d(B zc6E}A(GW8OVg=CE2n?!d$B?dAqya`HN-}bnabQqsyx)tRi%(0L-^pD@X0Fd_RkMvL zxji}+`<+i?an0R^*au;5=`~Pftj;z0%|?2juS-N^a0;}r=@fEABM1#MO7rfr!n?ip z{k*^7&Kqeg2f&eSUAT&)@&P9+3BdyoW!1QxAX7 z*LxUCk{MNa$?BMR&tq=pX%)i^l!+%EOI}!#CpHb0<Vt{;U}Zi>Z|oS)$DU!3sYi&>R2TUp&3rM%{WzDNu*Tpx@=tcA*A-zAXx9Y^)B0L~FybWytHqgGTpJ!kf zCwc{EZMZBy+qE%3+gns+*?O7WWs*Gw>>bq@#%_SCl~p~#Ks!glriAK(rxX0HO&w_W z&rwj7;28aSLiK3W?U+vz9Am#qs2+PhA^Y?;=1+o-PDWIPDq3xo4r}9&*_6D+{dBV5 zeP8kxS8?)|nAej%x-Z#irWa}@5}sDnjE+#$PRDX-Ow^0ODAd+J-?xjKV)sU5utMVj9QkvpUI!LIpJigkbL z)4E@~FV@qFV_c-}r4_1DbuWRlxu;|A@#u?Y`ZG4Q$=y5a9gjXS_>I3m;NrX?9z89W z+Gy^@+qQZ1ZR62_C+1FUbGt{s*o)e0?jrqpkKVAt-xI%2SNHJfd!O^CcY5@- zpZNQrefQ^y{tTXIw2H?TW;q4~-T@m%@t%vVt{PXaIE-){t9|ShCiUu3jnw`lR8*lK zL~5bnS=EY~WGm{xRnv6z{kf(YS@-izGh|>hww>RLW|>lEYxA;co^-_?q~=Xqltz$7 z1X<_L%s)51K@8nqN)S6uorQn%9`yWiSA_>yE{zzL{!{bMy>z81(KX7VL#O?$3dTph zTU7$8!Rn&fDY&6(^HFV(x$;Fv7Q|dGP~8WL4V{_)QAD`Wi9r{oKq+h<;fj)YYC2ZR zn-U(XIr(JVo9HnUPR2RktWM>L)!Pt84Z36G@N2x9sNOc5om{2A;n==RxLFyfMuywI zA@@ZwG-cAz#2z%Rj`Q=0hIf1}cN$a1k54*>9@}H+^=KdUnzZA{KaI%vVM%|7q%CrU zO{w}AOR~=BIALzGuJAG1G|i)6Q}bMBWF@y zUThRiN*Yalm)?L0W`5gfYmaQi#1#JWDRj8!W5tayL~D(o@3$N8skO9M3Fm*hC#5gc@e9{9l zG9HU+>1NH>mlzp$4og}nGg%K432z+i$M3kTYG%zSWOyFr7)||8?}X1op?}4B99t0n9*Ddo38yD{Gm4s%IAD!q5!()#cnbS-7Q?+ZRmvg6MRIKxv;&3oF zpXSz>jGk!3pcn7a&oyEsjK{zgkAW=S-;>AtQ#ssenY1ZBm#SIUN66r@l8y*lpCw-U zi6J78inkodWjJHl{2~+S8lphG=exJir!AP!cBo=(3FV_OhVJAq2CpCV-w-l zvAJ7hJlwiBcMFY!TWWK+07n1%K6W>ZSF8|@nRZ9C-do`|sJUBcEZl}PcMFVx+b^2C zvC(iF+1xF13*2Du_Kbu^!Yw$VxntmFI8JTu#!zMG3aEsf^|sOp4Hs@0!9`CjsxvUm zaC-5wiqSiEhv!&(R;!meYV|#+*7_yZQsV|=S$p`YU*d7iltpgY!cb#ntgB?zaEIq& zdv;ROucEFm!{Z|qkyRx(Qb6zwH%v8{Xbt1%pX+gj?8_5N_EldbGC(7`NEEx?$jHCN zEq@O*mgf6{!rs_9BcAN7{t<*X)8mRq-x!a#Pol3b_SCex=7A{)duwuMMRFF183m>& zHvPL1&P;@3OKT{@c)S%%sx>>g;R(#gL_8vGK`X<3;Amy0ex@~v4#2Gl0ikqMrdfK4 z*4m{4kfq3c%CE&%f%!OEnbwQ>zfx(>T9E zJ22}iJj*c8p**Q2u1H5@2j#`@U26?#4U_#TVJ4yq^>krlPzD=#vASmgD_P-kI(k7I zcHt<@8JM-3Rj2E$cKMsEw&sn1-+K{J9>WHZyN%=h80^aUQ{m1zJ`-GAogzPekjvKC+9}WJ!@nFojps{WQ`ut;pp2^~T;n08^&S%vM?s_xeA(PzfKvM0JEipIPYa`fd@9c=O)h#}utIeUy-=!EVw zF3q&`1G9e`Ug#}jmZfA2RA`~FapIn_$ujn-Q1wDJUUn;yRmSjp$6C4QWvsvV ziN4Z1I_;`<(8GvT)y8VE-7LROxtYqA8inPS-$(~zYk5Bz4x1^G*JbV~E37#9i7662R6KE_K=?{<)Ku_pOCUhYsg?dN*3sBlvliJ<((Veh2z>qK7~q8sKi;t7h^12 zI8F;~F^(^MMhpDTD6br+v9(5|a;#N9e}jki@PJuXzRODgS5_ca8bjY1d5gwrffdH8 zMFX_ZXGUbv6MdPeorj>=5xzUacdGOq+F|+bXyxEf#*)QjlZAeu(vn%V8~CH~<>Ikj zgpAFDtUJO=MOYnVSdnLq;rEa0z}|)km4T_1E5D~TG|e=2-TzFx(61muov1Ql`;5XR z<33f$GPqwR2`@=CX=qgGZYVv*JLYvb&aO5@b9PRZHgwezrK zhgb|)&;4WQTxG71IR;DF{=V{AJ&=wiIMQ6$ejb70M`!A^QL;ybQBHpSGTa-iaINS5 z;k5mh{6{*mgx7+ZOOyO!VX|nEHAtGrO%|i5o zyA2#NnuYvOe@aif>8ORFpKiobnU!2<5N_D!zUJW^&1?ZyQSxo}e_!2U1tqr?W*K8f z_LeKS@Wh`Sn@quKOuXb%=NDXaC{DwLaXnG=-#4gL9HpyHJi1uGIGFsm#Gj!|$EU=g? z;QjwW;atO>ItJLA#hXZ(*n<0;zlAKc!Y)`Mm!FFt5Q&W$u~=|S4Z@^lDCQPkoPQ97 z5Qs;*o6bK_xIrUa_8=)*wfj9;6CGM@I_H2j^%nOg)a3c5wK3@!lRB{6HA89~htjkQ0VVI|948jYeQtGCBFwuiZ6TLE|Y4=RhoyfF~uI9x#i zUqy~J2O{?OtjBAeO-KNqJ#ktuOy-3Hap{{780T1QX}Q~k$+@xk(!_ABhaZMJW=>x6 zr(to%D6;BpVNPci{3#r>n|fLsag&ib1jeHzaJ(snJB6M8By|lz)VWAp?eXO=c-+T) zsE>k`wM(Dh)-f62i7lwgCCAu;YI=I&3YORA?KvMHO^>VKiQ3GI`Xu2^FL=rvGMZzL z8xpc;dQzo%fdFcTzU>(^V+_w~@=s?Nh5rV_ zTrh?g2S0^Y&4@MGu20bmU`E975`}!a8eYOIDo*|m@5Br#R{l=f;c=b7j46_0$+nX5 zf_=FZz3UiGTnC7~Qa*7T^#tG^RNM&nL)t9>cPDwF;o7#5-u}a(oAhvT2Yz>zzY8{b zToK5a#YtPFF6$!Y1L2oW60pve-<{^hu{?=#h2xdGJV^sF1Ky6`S=jciXSpND{ospK zp;%>Wxdoyqx1ujm#qt_*njizyH)DE@rCGq^7?A`kPGeg*!ubCYcJSu|55JC_S;bhe zT^3uYwJf%zMY7mJ@iOw$FI)0fk|&~=Gm+DfRV90^k_g5AOyUOqzvR5u{N`4kFU-cZ z_Z2hqHhzoyGn9|p{hS%Pjepf;F%_QcUub1$4b;-=wcJ7EHsTI*X(6MJ~vYku7(c`eSt<3 zbhAi|;wPyL@G|?orU`c;xwAVg_egX1&}7p)fhT!n?e2=!u71cIIe{PRB@(Ltwhm7W zd-e3hrr>_OaY8Ir4jF5p#2h}6XZ4_rv?_25>uuHWu_qpL`}it{h&opP&|EW-f8~Zz zpc&PfODFM8$rNn3;3KjWoH7zm9P#+j+%<{&{6e_sNb}7>DhtOsk)H6jkIi$FcsDDQ zPh=<^jtIMp8FAQ5oy>iAicl_M<4v5D65VU^Fbbvm8yQN{$22aWr?ScRpOLZ##BLi? zgg?h=DNFmKxp6WtcK`7jMrp@!GiD0E&wcnBZL}UXLsNK~ldt8FzX`z2vtXR|fV@6=11`p|X@v-hj!o!Q^ z(!03Pda*UTyG^98>)kx-I;0OK{BM8Htylf&!+)d~7ydr@o#Djr>H z=c>QY0ff9&hN>5QYIdB?i#?P?z2R5za9NIAXi=-C^KK-7PYCv0u4@p#KQ{MG=X1J5 zsNNzI4LyRy1+3izQI`|UKoReEn@|Yc-lRY;n1mZEbZq;;nu8^>lb>%pYv?$)*%c=e zsmu>Hh&8VN$!!(tFttBkN3reX=`qrf3jS=KEwTovaKpdNjAGs?p=BveDCWmx)i?av z%$&iCqwmxru!n$^nm`7Qg5Wjzfvb+5%dXNH$?BfNuliFOm=)Jw&G%>UCqzhLgfy*$ z-!7rxujZZ-{(3J;G@T;RL$+X90$$x?bWh_}Fel7arTpnG!cZC(`}?oCxSEu7*d5@U6LKCcm$jtlqDiYENtqiRwMG zFp))sE$R&y&5T)Swy;GEi9vJ9EZ#doj*X?^SLHj! zz&_gl!rARgk60k#%)vTLkx(awD?G+5oXa289P7=abNQWok(oJjMdL~G!rYh z(_BA~cM4L$x^yQ3{n5ZQ)7r+V6a&AWR3XaOT_EJtOtJm`qjef-n1PkimIU+;d#PQo ztq`MtdxS3aE?9bzfM}Hwd_mxZ8S2>mLRVwN2DrKVTH`eI-6c4P(it1Ra&o8Z*zyiw z$B;IC$zTHS_`Nxe{*+XV*Ex-pAaurVD`D78SU`!w1}}CWGsTEJ*m{9C-CQ*vIYcbz zXzn5fOmW&$E=xLp8dsfKAR_d*_PWs(Uo)^4vT|Qy)GV{Ut3s}*gxm!>=}^wB+z+Uu zgoKe08W7wryyZYb==G>bL?BZ>Llf!TYMcWfbNS<7ASf!2Ya-e@MW_M`)rd%3G7cOmbc-P94%s~c3m4BCrLTx{IX zf)71B4O`n?i|G8hW5X0@VfhV2*9*$?m}OBykkMWyeodyjXkJO2QW=k)y%KIO!; z<{>_?3(CV2+c4e0l8NT1;x&vc@_Wq*5AmLpB6DbVKyo_WVUy1)S><$<9C9YAA(5)b zgOiV<70MJok5gc6s8v%{dc?T_(f$9+Jp2&vZ56}%bxV2LZ8FlelnAs?ht>CBR)uK+ zbpru0p>`NKNk|CXXs4XqWkk-U=*gHV@&78$w|-^vch z76H}+qTz=&nP-E1pnHpGG?Pq>JQ?PY`}quwjWsvk&--Y@MwzEV)*L_&mzYDU(27J< z5$wB0kUeCPdNUdQ^|n@YkG&P$D-78yy1cpcxmH&*?@``Xwobj=EPNE!B5XcsuDSG4 z*%~kxtDun}#k~9|Uns>53(d-EREf~VcY|B2`Cz=~7Jctw^VBkaV-J~>)<54|!b@z; zrQt!*Ttu=$dFFyJ%7OxRH9TbQ3iF41QORLngQ~@-2`{ZX4PM?*W$3%Ha;t2#N^zW7 zSi{TQBy@$t=Dr%9<{_vFFEex&Bef#CNUN{eV>!RRNwsMCtso9mZj>0kx8ZpF_k ztvB;lM3u~qKd<$qEbI#_P}pZE7bBiA<5yyE4Sa1*S&6CML2^9!j(K(^|ECrhZ+`h0 zx>V&DdYr%O7UdZ@YYtzLx`vI~4%w{;bN%%KJP)n%^c>zrETWZnB~ zcsorC95BCJhfNgt!?3&A9JwCL5&_}OW}eC4?jHFyCKGt)DjTg)g9hlv>^V`iqu0&E z_5a0pUHN+6foqWu%w^AFxh=vxz1ckUEcZ#cxY@k$EFWT?c!}%gv(NE(`IXo)(N<|e z=SZ!Ri#mr`LO(^-i<#UDYDw8b{)D;uZk}px+`?n(5})Uj5ch|5vp4YG+E94Ju=|n+ zy@%+1YE%XSN9Yvu{BwW3lq+>!bfgWx(p-lfHV?nZ2WZ1a%i$&SSsrhuzQk|R*o$WA zOZ+2kSRT#hGR&fl=xp~QE`4HUU1THA*ThbhYhtAtvxT4bQ~LFbn`q`x(%$W?-o6t1 zeYbGO4(#`d${)1ZOx((!AVp05Hqs&t4fC?KvU{_nz21h>iM_AQW@Ib6U4n2K_HVq{ zCUBw03&cu=hD~PTHl#)1*Jmwb-cn4pPp&#l)C9m}HhJ=d@#y+%=C z*K>z?ZVyj0t9J1`(W><{Y~n?jCEaNr+Qqxwyp~iOmeV=}UCMuGEt)Ib^e`1Ng8h$N zkHTF9+wclajXb)w6(zI1)69I8k8K_p)-Dv-B2g|=WQ`$$bXx>iK8px4u;8VMy-fG3 z=7CrFHuu-?xWfG_bHQsof9N(5iklYPhCUqI0Mdttl1DSOXf{w1PQ;9oK&i+O3wE35 zUgN%OTOh(Ct*@0wL@zvg;W0&dYfeZnxvkWf)mlD+R`a%4C!oEV-0)jro4_*UVTqfXyJ&o?nsw9;+k;15stBraD@7Z zoVmjF=CWV&JCdOQYd=S3W4LBs6i@d|w|U{$ytfpFe=CKq_oZ;eQ8TBO|0vCNU}rOL z5AWC9p0EMYEOiB5vZp@gYkRo=|IqZ2=GgyTDV!>TtE<_|M{8E==|w|aSMx$0hS8JA zvtvuxEPRu{PPSky-w`%r-okW@48skW@)kB1PSA0Qz%q0FTi8dCttP{)d|Qq$SUF^v zU%rjdgrDU(X5KsemL61`u7bYUV(cfj7{xa=kr-K|1%1qo@9>LO`G#rEMT;2&y`h*d z$Rmg2uqeer*JbFYhTFP{i^b-lef-bV{%J&2o^2lU%>(aZ#vp5SnR)JAKCqXvK^O%L z1;wrm1#PgYITy^J@=7u1{f77It9-z;{HX`7HLZvdfW6!^9oR{svJq`C#+(U35#eELESsm5+#r*l@O2@qRTkdHmG@F7ef~wheKff)z$te@D4qLRa za{k=rs?*?3mr4mT_so7iwap5+E4MFW&CC0FMevb2ADax_Nw~eZd8>k9!^h`)7gWq& zT(;1A@4Wfg?G+8Z{_SVZ^`_5m1RpREe&L` zyv#edY~jM7a|V_T7?7DWFn31T;M~&E?7YDx zd4sb{a|h&R6=%&X%N>|AsJM8>%*?@=xjDr%igPmIvovdP$$+eq%*?#(0W(UnXXXva zDlRP@kT+;%@l1p>V*p}6paV0r1`RIF8(dtLJF_fvM&^LBycu~j%8GMJ24>}C&B)5j zn>lk(ZeH1-(!3cn&GRu@zWJZa-0#SH%V+ku!Uu{Uldtgm9H-#&hbuhGG39Na*?5J| zbu7b=`ByRbU|s5-yUIKB;Fs^nDjI<5$;Dmn^Rf#mUN#)}QrsuNQ~Y@1J_HV=dRbRI zQ}H|i8N=@bkZr~9BK%%~XCgQT^3}LA@VgTCH2l7Rn=WN06Ux1}2!{;IG2rtGRtjgk zd09b4#rz7mjxV@h?-pv+Rs@F?lHzjUNck`K8EyWxYqir>Jd$g^=v-^Ck9QBp-o{#m!JrMVB+>>z6 z!o3jpD#(}Oxg7V?xL?G*6Zc-+^|+7VK85>x+%XY+yN~+VSZ8y5&G=HbPq>vg zpor#s*=(IFv1eZV z4K(J+{@+_!Jd4F2lqFSwq)tdQ@{G^!}r=_+^_`t_dWvu-NK67ZC)+sm`4lo&ZV4#o99^_*gxJTl?3O`VL}g5QVnT!LpI++y;4Yz2Ow!W{zV3`RqP+aBBp zaBslQYnb@CjC0~OI}JRNv`13{N~WY_rzS%x-&Xo7{~Zkd!np}>15 zlry12p|#YRP&_L=bIJAI36Q%WpNc0H9Re3&ln+I51$^v%JWt`?g?k!!3GP(f*Ug@9 zUWn0dG|$CrT|H~yn_{Dp_Zo6f;cdo4)CgE+ZwKyVGNg|~O{kKGp`$VmvAFB_I0C z=i6u#Z(0V2Tj8(=DUHXI0=o1I)ImP#<91Y@&3yuxF4elrOU(WWS|5-1BOmJocYEOX zCTIno2@p`AN>KEX&)lD&4Rq|nk1Gk&cd6SR)zU5Q$ko*5sb;Nbox zqEyLRHQvX(NnO*Q;E>Q(OKNhs1c&R| zYTX#mqtPwRF`w+Hb#PRE<}-J6)O?QB`0yqm$Oj z;W+LyZ|H>NW#GrGPTHS>m+nJldN}#jW&K+kPvz|Ho&Kra-s;OrT2_nt$o6 zrHnc7Cm*A;p--S+>xrl0b>Plmx>SAbUV*97<36_jX&>`G-D#W`!_myj z>%I7`baq*~2P_@vnytEOow{6v19ek_>o6+dImA+Qe1UPRtA@Wm^o5VLg5WwlDMwDL zf13!V&Y2Wn>Z*0~D8*$Ebg%>;ch!8Y_rQV51b-obWtg9I#q{V^KW0pwx@ifX6A;qq zO@%WEH@NPGZrZncmyf=ZBghFnQy`i4j?6CD9O~D4w@Uq+jOhBm`OJlW&8JU+L#L() zl08eo>F`;Io1Wmh&-~gVM-Lx12B=fM9yd}Yt{k}0Z#>O=duhH-<>}WN$-L?6iaP^$ z&eX=n;bzxl}Yz&z<=4r|1>fV}8SZKD*0q!Q8)7Y3N@vwz5!R9%j4ylz=GqDeXyoZvS5_<@x z5p!>2W4iDedlr}o93n9uLwklq{_oys=6B9-Y@8s=IR|FBb-wuuT=@d?BRpE& z*VvdLUL5rw_dN~)V!Z8E=5ZNMgL_Z;%iHCD>V`Hk!(nb<4Hn&@@ zs2HlfFZ*e+I+VWQX7@f?ch`EfoHv)4ZTcgKC1(Hri0uJ$96cU17vtf4P{kHI+>Pl0 z(5i}3VEczq_Ofu60Rs=2m&xlxX7}q5-b3b1*CB+Zjg70!cQdpuX6QN;$it0|9jz2v zD686x0Qtjan;aC~3HkdB1@o}!%0w`aG&XvLzu2Q_3;TdFqpl0U$RkwbJxEEq#^#^{ zIt!E*=$Zg@2F>3?i3iQU%ST)mC}j4Lk5TlfGVjSk4#MV>L}Bx_EbThJ-26+HmhF73 zv2mBl`ynHl17NU^o7WFOBYJ`gud^8%fV@3H_Ju~1Y;GitC(Ks{ptU_|9vPrr=X{D< z)T@29WVB4D>CM*kR&a_@=5wx})-m=tI=JJj8ylyYSuji2C1Crf&1bT;{;?V8tq-kH z&9FT+=`nCR0jI*?2-)q*I{ZXc_J@~zIt$Aw>0{aHPW7an| z?veS~n4>vei5Sk;tT$iD(fYUo_#Ju9{G9w1;rH<8&C5Aj&)8M?eRM-(<0(<0vAfC3 z3#yQBISkwdoMNSCWEEeb4UZRH7xi1`AU_59$p0cwME@WEBKifd`X#8p9R46z-cu7AKvCC>Z>6?x*7ceHy_E+I>hY;pTdFv6_R5QgU4)ZGWT=9 z2|$^c*u(@x7R5~9*(QuD1m;WzS7MWjVpkFwbryUIzq2M$OJ+!05V!ZS(F3#@9zd3KnL61XY z6SxTSOgu^dTZ{3)#o0gcFYT`?`5hIv6O z9+ZH;fMdZl9UzXyC~?B3p95}h)1MBeEn6@2DZ(8V195S-3tSkBZ%NTCgu(^k;3X+8 z&i(_Yz1<8D1uz9RruKSCeixYbcxfAe40~Q%>`eDK59|038t-bd2#j&hJ)4{JpP7^MQ5PvR6?Bgr>GhnaH|2}Xc zSY_ah&Vpj2UwQZ^6rO|v&BrLfju@%vC4iFqz&jyVHZcaQUJj6tiQwaq<01Tq@Z)`3 zguf)Yt;Bb`V1Glbw+rOu4JdpABT_~F75MMqF;;-_81V+ZiTw_XbHQ(bAGLS}7~9Su znSf`&v*BNr(7WI%U{wO&1mSSp=HQ8;e#|QZpddPdi)`EjTx#PqFxiB>G}aePHlsKT zOhv9Z7fe;6ICvu*sGTc^VPLWe#kYXT1{B{0CZke35llv>_)aiYq2gjNRhi;hV6qvD zgKRDwsE(AvLNL{#;s?Og&J_p2)K4hJTS(DQD1IDF{eK}DhU1pOwFpqlH+7rQ!}H^6@MZ~1Sk`r(Vs97;VJG6rtlQ|z%oN({Bf~# zI7F}Wjn~m zg1#yi00f;NX;aJXdS*THt9 zssl%_^NsJ?m?HeVh5iYfoSNww82efbII%+2j;Kj*UtG z_7?h+ZF17TtF>kS6e)Rlu!VE{Pqco<<*pa@3Wm^{pGp+DCqC;bW= zlm1gJ^w-+tq#u0V=0G0aY~kTIHaU4XU}Mt%s)hd7HaY2kXJgWjOK4U?L6!iA=ykra zy^YC3R&x(*kWEez++btUpGw>X@8t2IY4^Jp%Q!guEircU(A_|a@&7Cwy269JIQt$P zZ*BL9jtE^~4tD5OPdEZU4%_s{kO2Df(%3jK`Byvz+||Z+gViAe{52_!t*{)FhbO@l zp<-Ia*^TNsaP&IgxY5Q`0`Gy(+7j5%!v7y^`mq1=ji1;YD1ZwsJY2TPNngB@vQj|$ zX?R6NZ}Atvjf#A(#Zm=pOK^OBv;3w$*a_0SzlnoQ|| zQI(7W(@_QL&?v%ZELIVk;KPugu;hQWSjkU;hhQtYGxa|dU>lV0Y&cMW#Dl?8z?5;~ z67VuGMpeO2f}aFqi6{6iaHUQE6qwFH41t^yn1R8bSYDiEflt)q-4^vf6u}BOEc-1S zEdCpq4to@VDS$qB$3-kJ&aMMrwM94;Jf?e8f3w9(eZxCMK=B(JljiuOG;dv zU4p{~o5D5lVH-O;Leb}C0X!(esTKoqaaIHl_;9EPMnUp7Ef!+%Z@|Nm0eNZceQikSQ%|8_<&7+F8F@PRV!N$4xX?n zY=XlOC}>O;`5|zIEx><+S&A3`(8a}j6FT}NFV12+BZoF_2mUMST(znj!9_Ot2x@2LCk3QGn;cbihl=uYf;;TxFH-I0tMR*Q;!Y02Arjuw& zKj`d+W@K|{1HRXmfWhE^O+E}f-6o$0rlV{sz$IYzUbIBFfa%zqlD`T*0RJ>`LWu?0 zaX9ROgQ@~YcbujHt0M0YR_El%OCC585$G}iRsyy+t2yADG_Q;g`t!ll`gmCpT&P)o zY_U`ba&`<3`=B5%&b|Pz&WQ3?;6pb48azBRD*q0gj)PKYt&}4c=z(TgkGHE9mxHP6 zm6ygUz|@h6i^l&YaG;(~DLewEo=@>IaBtfN!eij}FiIs~4W`jd@j5UKUWzw>X>e1# z8BBu}T|p|8op7MhOlGgY(^#PR2$)(G zt{`rW9ft#T6!OAeFPPf7;!|K6?G*nVO#Ou7b71Nx6#oFGenIh7Fm+^#HLvXGWc)}# z3>=o)=4fre)Gx?OW9`AzaVYK#rjA9i7fh`}aZfO{BE@7r)b%PJ0H$Ut@=qm@2ZvQQ zg`2?Cx64ao!@)EbC>{l-jz@7Jm|BtINnmPbil>38RVkhUrj9A79A?9TIv&OIz|`?5 zt^`xZqxeBEwR6QGFf~iXHDEfHiJ6>e6|Y;YxrqHh+w$IN{%BR;vA?-z#@y4{2}nH_kz)`cDr!EKjPBZF8rheq^hg^ z%wi?~GnfvRs^K&yMY58&0n?#V)%Op!SjmTipAJI7>I&ICtTBe1H7`on=(Ddd3Zc&sYo=@u(_8JLdFs?l$? z#Y(;oOvh?5)e}`zZ?Tg9&JX*eGq);*-$Q{|DO>{6d0bV*{#40I-WyEkbX65iuvp2b zg6Rye@*lQX$sbRJ{nG(orSJw6h?T-VFdhEIR8ZvLYm1fqpI|x|tTNCkO|p`E!E|U? z$wynPQ) z;XtRC)x5pHVx=$!OedRF3Egk8l0O2bQ_o8Nvc*ci8%!snm63j7u_X_(zrlfyORE4{ z_mZpvXb+~N)H)n!cpYl7l8*q>F>4jUeHJVE5-_bL6$inz7?l^+|21%+)u>W<0!)ih z#cRN{_*DEnc!-TRgK4~1@|VH1wo|+tOiMe(bzqt=h>OPm-@t*2UtTWO0FGYRWO`CA zwcdv#?e`CR3VnSKYq<@6984=6nn98LZEz8o_IioG1%Q20xzB7ir+l;a}Exu&tJV45)<$PR3_fJj z*LveCSjd$P^#gw+6ZLWD(D0KWvcztsz(i?i3k^f`dMG*$=xwT<5e z)7J?~z8@Tq@DzUl?rP(Y!H7?kKXf#93=UL>%EK36s$<1pfvLz8e+@olo3eceraD&g ze}Sn475@jEW1B-Zg1*xro&;OKR}aqi=? z#5f$O75xevA4Cd;k-_0S94J7=Ijdwd$&8WB>|-z$;czQ}wok|^ig!x+E-U5M9;9GD|Uzkt|d)snA?fO=*cbpg6ba6HweB8!U z!1fZj%jTc<4PRO>_1}kYO3=Swg#A%~Z(0sBY#u1W<=~Cuy^zwy*(z|%1g{|Cr@@62 zqr48htR%|MgHy|+yb+9VteCtw+twHMM<2f^hgYDm)yBKQM{WED_=Ju3fhSuZYEZNL z8axu5fB=cxWiatUj0(Ram_C3}+&u_~Q>gQFxR8gDVEWiaDclOimoiN}0ldM+Q^EA< zi@Z210#C6S$4mc5J~H$%9Q{2l)3;aKi^B=m?lT_fY|S0e%y5)s?#X zVg6tXFbhnd1}XjP!S6!e8V(d*8JIpHvgAQF4-OllpnAGz!S)=y1g1}cEDvlO_yrVk zEF37n!{AD=>Z-4Rmx0L;N#3(RV^S&M8~+7NA2`WNW2eANZTxpIeZ!>W=fH0&rt$v=IFJn}g{xrtd`Yo(9a3!L7;vSH z+kithZV#q9R{lGKZ?Wwkc)?WSbiw{nL~x)wl$XXbz*NVI2Y{IYD;Mik!!rVpSL z4+p2C1Qm}0=h?UrOsxbL_5T{11P5wH^1{9xnCeLJ3^3KP;@M!TW5x5pRL6=d!BnM+ z9|V)lC=P+Cie>yrKn)!1J=ZF5^uoK|HL}jJD=&I3bFJ)na@t5vLeEAW(?~A)KVY%} zG#1g5ykI;sizEXjFBmx^`h+A@~i-V1*V?SYw@s`WSy!2B4Dah#qpbD zSDR_+|8BGF`Ba9k+ah~D(x<-v5imMBtpAh;I8aZA!AU5z-70&w3l;~#;*&s&{{^OI zsRF!rn{0+EK{K|?W~Z3#kgaMm{L|o;5B}sJ#{UVH!|&l>PeA*f%~Sl0%_eAYdKIj` zS){J!*WhnZB4i`f@q7tBu1W}uKbOj`f|D$HCitx&9MsxxDmj4VrLpN?^%WomxYA-J ze-ca)C^o>90LAOU6rti5z;+|w3?}=tuJesM;h-+c;Q{cQ3%r&SXCHtM+4v*yhJ{i2 zQSgODQT`k}a#@s5fEU>KOeW%AgD*?ug;%jqu&3~QaP&IgSb{2{1W^%_5#9ANHYTkv zQ>aca+4Ly`?X%D-p7L5j;4~e${e~#_$U^?(w?!S&ps>%zeZj|VoCTita#TMTY)|lw z;OKR}ahQ!MLDRvPZ2n7wa9H!(Xn=FTZ+;QwdEhC3iE<@)%*iM}2tITs$|3Ms8`pr} z{5mRM1)lItl!MQ}q0;8C9vt&+RN+PNQCk&l1>1A{3OIV5Z`^HT%JCs^sx7=vz^A@z z3O~p`g~P6MO%Ch}@PY56{1w<9;n(2kb-wXmumKA2eNEa#*()-bLLJv54;f#lkDTg^N^atDIH0!;|#=-``r?O=~f%hMry=*zi zNH}{9OkYkbt_5E}72sWx=ve*??)X7;#^cUL2EfR$kY|DEOKjzT5V#NI36{JFJOmsA z4pPVR7#t`9d1>q^u=<3UBmBl2J2?MJf^|e^Zv%r)C#kpXQMRZi_MsV~(Gqka&0`QuFEKM)>Z+G0ml!D@)b2p$w!BLPuqj_XlS|uEM_qJliHO0Xu$= z^}i~jC*VMzma7Dq;HMCP%F%DZD{S&Z;P)X~{Gv^tVQN)mlgEJz zsE8f#K}9$a4hw7wL%}ydu8Qy;aL6XF1P`$#_$4rXl&=!-GWeJ9ud47U*lyIHgM%41 z4=3QT(Ps632QRhB{{^P6{8a=$g6X4u#je44iDlyiFn#E+5qZ0sA1_P5pM&<6^; zY@7|=W8)!U`bz;Szyk0A8{Y;#WaB%)^cMw`ehK(X8_yk#_IJwWa6c62&kiULRp7HW z`QzXVHeL(9YU7u{^ydwf|Chn^XAczDg4^5p-5?z3ZyhLw-+`yu>hycCy-F^DspFBC z#;$?UjGEYay=>P?9tWmosyGqctuD&J4sf7mp%l7;sog400h19bP6vN!dpX@7Tws&u zfT`nB`qzW0V^SOdQ!BDK$VR|{xMuu7D_d)^lwJRI;RC7ND99JE*ka0pBtjp8F<^_M3oz#lDEa>otPKPo};{uV2F z4)_~{$Kk+f{XgAuPzq&W>d6$}3s!&8f&yG;v6629Q^%!vGg$p~3)274VkQ40nEDO6 zVE-EX6C5VML2bb}he%c);=t<9U{HVqEmrayz+|+F^TGDv_-1hQI^Wo7mmGdEb|C+l z$B(rs(D*#3MF8_{a+*>tvN7pD-9q2A$w~hO8Z_y!x3{$!!A;zym{Wm6yzB{n7xLGZ}ym6hYI zmIy#4$;BSG>5CGAm6N^~DrDr(*yI%6YvjKvek5RzO@RV<+s5SK&*VYH2mO;aIq83E zW73Zw+FZXaIC`CL>;P_xpF9k1;bCYC4+Skc1P@sbGDOaffGcf% z`Ilh&lSfK^8hi=?s!3_$FuZ;Tt4Zt);G?z#%>>h*NK*digL{40wA&tJ&%uHImXcD~ z0=|p@)Vkm!F#Vk+CI1ZE9s#Hl(}v?zE?5m-{lHGJD)K2{`nycZe=&F{<_MVnz>|`H0M4*QcmYg*{7K1w1P_2*B{039d5QK1<1amlKMN(s z|0$M(3_xRdgUM(Vmx9S?6yF0T8&SLfOg5x=F_>&d@ltRAJQWUP13N4xIqY9!ufl<> zR$dyb1*^Y2MIQcQv67zxtG`G^@`MqRl{^VdMya?9*gh8cz+{xT5I+Lw1qU)3d1a6XvKhq%V6p+lqrqe|if;##%~<`P#wNpotWqi51*SSyTmq&# zRXhhwMx=N?*xofS0!Od&jStzFI;xG}HL#iXGXL0GwH%};&OQR~v>DYO!S)FL1dd+k z8~8}81Hho>^ zWKT-}B7P*n#n#$9Pyidi_K!;6{*?@XLz`<(mbe>>Q3Oc4Sj1aw{wc!u!1UM5&>CT3 zf16G5If@Xx0S+nvyZqMwue37(lcG5Lc+d1AAfQ~zXNKg|5 zMMNcv5d~a!cXl|kz_J`7pbZ9;i19?*1Py5LibTPHpb{|#BSwP=DhQZ>CTbKPB_Hw` zgW>!CyQ-$&X%=_#eDyr+@T>Qzs<)0lrl*i2cPM(Pr$n&H_VE>Ijp!sf*tF`p~VV4!9C&7wCH^B zmxYC+g>?~_gHk2@?w9)Fxt=S*X8S|-@qEoj|7Nh+pb+OjVQY=fFbdCsz5NN1K?fgb zHu8O7j$*_A1kVRwto2X2NU@QB2h2fj_%tvFy_Xz}`ZJNiQE3#CU=B*d-vhIc4gUbl zX=?aijQkOlCF_>e(@Nlr%B9awyG#mK>FbARGMPPZf zyaVhfT!?_xvBewzwspTy;K75+X8TLV;2FpzQ_k%&Rl;w(Aea0Ha1IqRv*uGU_qLP= zBeFODS-^KMQ3}Q(Ke_p(;d3A-*N6P2SIU=axzXn*H_$Y^9CETec96aHd%ZlY*no!E zoU!1bCFE?8N@1%Vc(wS>s1taOkaq*m7kn}pn|2oLPoe$my>$8L(=(7E`z#9f)BeM0 zusk1Fxl$GAEj0M_9f0o1R^Y5=$ zEh^Uz=7Cw`zM9XXqE2Rv$Ov5txn!!Etwb5&t09+6`7MqJaV->X5j+koBQgo>CtP0B z;Rhz9w)Mhqm3@CGu|Y4Q0jy9T&By*uRlvw+!QRB*I|sZ68Q;gsR0abcjyHfe!NE|( z)SPgTRSH@E)^fw4AL7m?BG%rs$8$vBR$F|&0vr(xHOK1wBi|t%NxlIFk||FF^oI&w z2z@p{C7fh}H=;r(AcO11Gn$n=Y;E`<+K-)M3y;@-3oUkMK`xncZnCRV$omlNSbu_n$nX@(uP8Q< zyaoD_X)sFYzYV!$%DL08N~!`r)m z1^){?T<~FVPH>CixF2Ac_y5}IJg|l&6UlC$Xv}vej}KhF1OM4t27(=S}-?c zK32=$)2!D&{MZZ`+^xBtR_OF2#l}H5Fn4k`4hCvA@*!aE@@(vjNJtpY~k&ijr<-kH_bK;_`PN$e;LdTwT=9r9v80v@$eWjxZAb~@prCN zY#f{h#xC525D(XEe%9)c0;}f%wvZ+1NznPG5)xg?2OMN@tv3p(jrj4I zC}1X-Yrl~{3+CE?j4t31m}|drc=k)`V1^afi%3dD&>YUWIlM}^{=F0mGJ}F0LLtak zKtCwoH_~@F8glF`ulysfwcsxWj|X!HdX@0}+hk;n^E0gJ;0D37!E*)A1IsaT6WCAq zA`>jf$fdtk7495T5%~mNMt_}Q6bj?||F;MkBd`J)97KcvsA}BRQwUp&z^tIT(AW%S z1x=T9cv-c$o7O*LlWHMWY;R26B`RpTpb#-$|2_$YLI#+r>u3|ABY8FSrTkei_wZLK zY`p+pF8Gh&6@p&_f2kScAHVTH#$a*UyaUWV|Bb`HfcY)}!+!&h68teZC-`&lG{FbK zvdg{(>xA-g7Fsr{xX->?g&Pp&LIn4Amp-K;)EB{E7wuf53NWMow+Q(#=&LR&v&vpk z5gH8d)V~7Eh$wm3x);m{wCC}c7mM#8gAss#Ft*G4lWL(cs0Fiyrq3S&d#_FK^l^^} z%n)Co`NmgO1W(eu32fe`!1CIl!Cqqf&7k0G5>yIVy`dnP`Fx3kkq5ai^n>!-tBUm{ zN1;z<`A8uvjf^>Hp*QNi^$^#7!a+6UlE;D<3;jF5eD8xdi}WBSs}!=@j#hHR{KR`6 zbottVFMcoz9bq7u`KyJT%$H866!JbKcZI!VD$J?&^}hxAoVUdBzXBO-kxF6fbg&$? z5wM^3A5MYgLUS3`0Ty^4lsM>K2D3{BqHg4`zzlgt%a45x0dvsj`*g-x$Y6+#!Xz*w zkkIn}q5@{j$QF%&Tr$k8<)X!-A(u?Klc+H*Mm3Qn*T6tB<*NhwlE*?{GWB-|{fUrE zhS=TUggZFqeI6W$Q=ufoel6HfxMBs%u#dsoz*gN3C5HLmU>34i^E|BoY{Xp66P{L4 z>Z5tVXfp|rVZtga^Z*K!3^i+gtsk|AA(u?~@;YC>0`e7NTs;NG`%kEb6t>ol#w6G$ zGMFO7#1L{d8x3Xy%<8xd%ods>=zF3H`szxa3GoT#bb;0C4Ue4 zlBqv#oUi`_$o(#Jj1hM)Eyz6dNMFn+ai_$HLtXTJfnLWUPSt0K@>%V$5YTKu`@ z%Y=Uu!9s<25;7SIg$(d?aDzFddOeTTOSIr!$R)oIZu_<#0~poqs^HHYQDJ`xm~xfE z*5z7GM*PdHk;w2va*S0C_7fg90?UX@#W?~i&>u>S$i+A(U<1s&o-FLy;zeM-7icK; z(Lg3Ll7oL(IJ5$D$V_}IkxEVQm?PyIg?9XU8`Huc!ynskTI^+LUOq-EX#O?$01Uh%99-Dd zxEKL@A=eEctAr=ywA}E`;J(}aF|r2C*ER7+(1j2&!x&_1l!9S?vI2(Bfn4$+aDNog z6AEl$19*gB+TC97+b@9}FO^d5XB8emMn;U%N5I1b{|5Z1;NOB*3VsGWQ!L#Z!1BqL zm%!{2m9T9y_>H&4Nys*2FhoXSCzvfVycf(C8U6??XU%6|KkYw!5G-fSyp?K9bq=Aq zm^D3dG@R*}d5X0^u~yZ%6})h5zXr@P!L^(Q?_+J}tXQFW-s>u2X06`{W`vA=%PlHG z=GZU=Sa@cgz(xpc~jvh#*)tptmCw=wM*L!4M&53x)+8{7A@YKQ&-~t&n?PIt1*U1ww%i z9t=2mRLH#$1{|ywa@w=Ce-nNF2IP{rgGCoR*1N(13wR$aL-Y?JHwCnsTta$ zxD9wArl~gzFiex+6<}``fSHCB^zkJ`6%_moHA?YLI!}>nSsmnfYh7V2zfH4Jz^@v> zEYR>0FkWs~SP5U!Y~-(kSs^d+ONcj+Awptp2m1*RAA@B?l3P`a2SdqQ7lghSp*$*# z24pDL(^NL7R?Ari#(&5fkBs%Gk-7PJ7kCHw3@C6de;&LEEJL_LMCc!oOQz#PLjD=# zJ$Dq_M<#m_;QYf5xMNiXXvjL3gISXJ_ksQunvHxkm<1ZH1!K!>@JdKPILSa4lD#0&;We7Kc z{j~q^X0VLlLJU&cZ-NpJW`6>+KyM6zf4t2rkKiuB0i0}3> zqgu9b(756j4*^%a#-Gff!9HPd2o5DvK2&sBcziKa zK5%Yvfs$K6U$Qs<7S1a+kbE2rB(s1+LccTQk|{6yNwGi4-Jvhpn}1^h29nERAo*1A z0gP(16b}RcO)x7k^rqqpNS+0K$=>`ougm7jHWvz#>2TP>VuzA%guZ0z&k_2!KrZ=C zuz5KujxCP0UT4sdGy6sGU&XxL1U_r6sX*A;3}%Z}!aIS$jELc#V7XB30s9HB;sE;# zm1A2CZ>s{zpv9HyDKIP0Lh}JITj*UW;WYfF?W#oy$a(nPCkikpC@Vz-T2H`fxL{U> zuYdItum70}8Q|k#Aer(nje*ved;;_(_W*xqr~kW7cG$>5$^j`JU8x-+lBqv8p#SAJ@KV?Z<*RS^%H#M`1?misAA*5o7Ra~ds-*NKKMsA#tH5Pw zp-R{>4?IYWq2GZS0e$=pTYo^t$->|jFhgb>ybfka4Zj6GRq!rwAHjRUrwRTLe1_mp z!F|c<_>0#rAfr+!{0n@h;KN`!s$2Y6*TwtTf4B|UAJsO#F;Nxp`W%D$5ilzlf<6cN z$6%I+{#P0OFv?k=;WseK8A5Y$`S%?vLdIe5cT@xnj|a0whF5^uV&m^KFuTY*DaEYm zpcT=GgXB4myY)ZZ=icR?2e*V{ zt{XoCZvmHU#)masg8=MX{Xg2bfzvD|ioh;Jd#52jFA=>M_@UY(9pJAE^wF{|TP4$2a&AEJOSsu%GY{!<6C> zciE*P7zwFUv^p>g90nsU?T>(2UU`V^N5(&p!2mQ2>m}J&^6JkcVH{_E0fq%6ZcUahdhJ1w1P)_heRIqGu4(zA>hbMsLplT3uQ-OPR zAG3s?K`!|&aM^n}{ZUe*qpG(BCce%Nubp zT2i?Gk2oT=|D|7nAfE~YDenuOh5}ka(KKMVu)hLw$@F(=Gk?A6x-G5gGJ%+*HLz-WmK|$lGc8IbeqwMqv;#*k^_>1djlBLk1nr&}`(_f!PIy z=Yu$@ z0mC!EEN?!XaGm+kK?V!ljv2^|i~gco;GMC6_lW`-k=E028va2qbcX5@Rz^l34!LB? zhb=b^3RxL#&wLI-=WJxi77haY38&Fu*}|uAmdpZ%q6WPBy-et{f(-$GGlZOH$#aVR zIo1tAfew}i96TiCbntkw18bF#n=vC>yqWqU0^7h9h@e`?aQy!o8NEbEdrw!aqJUq- zgK1zm4wezig8j7r@Ht=^u|Yy^D)^eI5U>AhpisyFj|FE?pgF6(1DpVdPztBvbDCA5 zVe9u=-|)*|S;0Sp{j~q^Hn6E6#=mX7BNSM}g8>JJgq&Rvp5Z&7eJij@w2y;j1u{ZT z`?Gv|9{+4>fKZ@=i2(7EX%$f zYZ_gRfs|!GF7#RS+W~*Ogq;5N6#H|mzY7IAXg{;KLMMRzwEu8-u&mI@LQeZ30sBjY zoD~>eWRF{hR|*9>m>+QPQz55=TZ@j3*>jy%C4(bCArU*G5%n%M}KU>IY|8T(maUrMu zO5dJS#RX!@vK`78c|A2!Z2stZoo_3&|+SY|aPWu@F``JQH`?<m1kki4l%7Jc_ZEX;8+J79d|4hhff55XZTr$|!zk~uERLm(3;b~w$;T|Vg zE<|x5r~TCd`&uDq1;)|dDV&Sg)@O5@R$$n57=O~iT?p?xJ-F2!*nr+vmjhIDY2 zP@scx0S6O>oDLcT_SXnG?H>%-KO*F`cUA-(tP%=zush&juaMKh2Lby}gq-##BEm8P zd{eBS_B)5m16^>6P@sch0SA{0IV*5gz`jbzX@7IT{x%`U_}_ncalpaPg#sOH3^;g2 z$XS8S0sC!2PW%4^?CrUJ`!W9aA8v&VIR@GZ1v#H;>^F!E8G$dr{o9mVt?+nAM_eX- z1@76s+z)>u&<{E^Qy}|KHR~*l_MlkPL4g|Bp8^HVu(2R-C!F(KKl$K|2R^QN#(_>^hxQs71MQV?4!DfMnI(WPz zp$%R{2A{4p5%>zsM}+Fbs=!{j?Bi|UdaZxM9cphoGiXn_6ZfP3S#ITYf$xC%l8yVc z{=mENpR;-uy5K>u!zXY|pZxz(ECchU8L#OAd%Jj=V|uwY{5WMl9?X|;94J%#q>J^BuMJtL4Z1GDt^Qr*)-v7V zYA|1vvPJW+z+Y9bis{NtNf zM(6?tE<=H6LAf?~6wKFr7#{vW@w{FOmh-yHgL+L;H#*#+<%hxC7Ah793f!QRrS4bFKIEyM#eqjUx4 zfcgB&axH&s6$Ta7fmUEHOvkQ91kUYc?bc)9Y%updYwO8dSS{D!S6g6=LFhZ!@DLgN z-PuRFMXR62QjDL6+@cHk-C9HdYd^n#VhGP)hk1XYdKl8{0xVHgDl;VXTxHU0|mj>M1QVsAq%u5Y}ofpR*GULIp&gy>6mYh0EOK+rp=YqiHYS9lI;sHndG_HEm z&ld&g*M;a=+Ra9_W6!FFYcgNK%$@S04;_KBM%$iMcB|to}OH?%0n5x8!hm%bgqf zDtsbdrB-4KFjz}hRg| zwM8_88oB+x4zG6@9jvjjm|kS@AGIvvKP5y?2QE>tDZT1=Lr~>Vr?iO^XS4?lK%Gi& za9pkau=$1|Gbj-GSn1sw;}YT3DdjFX&hG9syN+TB*B0u)!dRC)TPkDCG~E#^cI+FP z9Bgsvy&O{qP*%H%3F{o?=n*fyfOr#bkLFb!j#(G&-znip7W1u2AEn&N{K>07$mt^S!BdMZRSIVJ0>9?iyBV4>N(xVx7cYC{M^Fuw(NO^7c z27QUMoPDB2bM4B$vw9Rp)V45Rc@m2OZI(qctcR!9g@viHXU--kEMZ zZn@pd?4P>__l7&UtIONIoyobuw9DSgGkYd_hDBL`m7fpuysQ{EWLls>9cDX)mqPk2&Z-({Lw zHJqj|8&Y29WlHbul9H+hB&X(TWn4_#yQ@wp;XFI%L!6cAj6PN`umS zJLB~ouJ3}YmvhuBSIknB5sj4I-mv;Z!+CIsg%Ed6G^0=W}oyz8; zHPwlHt`2vqbD2~w8A<1B(zp?cihK2LUKKOG(B8rV*0h-;ity@&0MQup2!GLP)SDxP zw=5#&mPMqhu=F4}pW_kPZ_a&0Q-)R+j5{i-2I}=K7Q?-f%c7U*S7qjJ-p2AG|Wz|z2|cK#un~`srK>i#aG+o z+`7B%bKK|O3b%J39BIGjem&K0z4pyf_HiM%ZmQkeeQ=cB%YFK4`&@U=X!|O6RJHv* zcf?rxlym-{*TL>js_nS@<<)kDTUTXITzjC}J}KnBRfTFT8e@O^n2B{0Ya6azyR6o} zA>^Jt#y;C!@KZGB+jaJRA$8}n*+n~6SzkY6B5qsbtGZ+a-+Cny$!sj1O5&ohv}Hfh zw1@Nm3m5TZ(?00JeZ7S}%-uEH9{PjQ>XZHkU;8K63p+K@RP`0if&UG6bl)3?Fg`cl z9^y0`yU5W?DlvBPZ}8wgwKbe_ANvY*8u0J%V0Z8o`%L~hseN@M9ZO~-@w!+BACX%3 zgems>&&pzgS{Balk+Ce&G9Xp zu2~`xM`6)aCKgF%5V1P1UUB~Lii+v6NJaHj^-*6xxwf)$Mjif4 zZK$iQ$~R7)ST%lHU1MeCW#IFG7l0~;4zCzqac;#0o&z|^78G$mD4MN_W^*-hEIoBm zd=ov0MMmSbjn_6zn_N{he(d;3)3UYGs@w^U_U-Qd*V(JX>7?5*!S3SjnQ3=-`%T5y zMD6CT%jHdg1V8_>L|m6a2# z8!9U=s&1gh1!(Dc?graF(e1G{T+uT#t?}Bb{N(x^+M0^yZw#Jok{T9(PTCnjpIvfEcr!;j-wtqbXOnYU*nTe@&wb5k5 zWW+p{7&NJNG7bg9NNm|<<7d^e3**zO$D%QHsYI?i6H6qkt8+EcbX;{DzVTf0PPn`K zm$$-J#bY)AtGXJ*;DiXf~a!&PTGf_;NRwaU=D1)*X8=+(FHSM>s#d zS+TMneTZ)9${smx?XWraMIrZx*V_|Ij9K>o8?($&9GqKn)T4U!I3nyZchQgSTV1=s z?x`9(Yc?9YW@|X^p1}ZYt-@Ts?;acj{xsL_a(OBe$)qBgNHmd*BodKC9JjVh>-Xr< zqrg?8v)g;5-A66D%?`rYQCovvyaDz9^e1*p_sr{1>yNIt_po8<;}e-wJX)7e5!vWZH%?P~1{-OUp*DRxY;yBuYJoa**zY+CsJ33j)&?dI8^mbtU? zSj4A}vm4ibvB18q&)S!tuy3^2zVej)WSRTqTKmfIj{DtX*V*5S?O20{`W^~dGx-Rz zPJBj=>3ICZvtiy3mHC|Zu($C__xA2puxrU@aQl21a-DT{uhw%FSo7U^>+m?k`gL}D zo5I)E*{8I4?8A`N%Y7h=FDlwTW4CYj8h8($Q9Tx(A9YWA#_rK##jLP(rBWFMm98yj OV~>x&K&}%j!SsLNJXKl% diff --git a/lib/src/constants.rs b/lib/src/constants.rs new file mode 100644 index 0000000..f968dd3 --- /dev/null +++ b/lib/src/constants.rs @@ -0,0 +1,630 @@ +pub const DATA_TO_VERIFY: &[u8] = &[60, 33, 68]; + +pub const PAYLOAD: &[u8] = &[ + 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 32, + 108, 97, 110, 103, 61, 34, 101, 110, 34, 62, 60, 104, 101, 97, 100, 62, 60, 116, 105, 116, 108, + 101, 62, 67, 114, 101, 109, 97, 32, 76, 97, 98, 115, 60, 47, 116, 105, 116, 108, 101, 62, 60, + 109, 101, 116, 97, 32, 99, 104, 97, 114, 115, 101, 116, 61, 34, 117, 116, 102, 45, 56, 34, 47, + 62, 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 34, 112, 114, 101, 99, 111, 110, 110, 101, + 99, 116, 34, 32, 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 102, 111, + 110, 116, 115, 46, 103, 111, 111, 103, 108, 101, 97, 112, 105, 115, 46, 99, 111, 109, 34, 47, + 62, 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 34, 112, 114, 101, 99, 111, 110, 110, 101, + 99, 116, 34, 32, 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 102, 111, + 110, 116, 115, 46, 103, 115, 116, 97, 116, 105, 99, 46, 99, 111, 109, 34, 47, 62, 60, 108, 105, + 110, 107, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, + 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 102, 111, 110, 116, 115, 46, + 103, 111, 111, 103, 108, 101, 97, 112, 105, 115, 46, 99, 111, 109, 47, 99, 115, 115, 50, 63, + 102, 97, 109, 105, 108, 121, 61, 73, 66, 77, 32, 80, 108, 101, 120, 32, 77, 111, 110, 111, 38, + 97, 109, 112, 59, 102, 97, 109, 105, 108, 121, 61, 83, 99, 104, 105, 98, 115, 116, 101, 100, + 32, 71, 114, 111, 116, 101, 115, 107, 58, 119, 103, 104, 116, 64, 52, 48, 48, 59, 55, 48, 48, + 38, 97, 109, 112, 59, 102, 97, 109, 105, 108, 121, 61, 83, 111, 117, 114, 99, 101, 32, 83, 97, + 110, 115, 32, 80, 114, 111, 58, 105, 116, 97, 108, 44, 119, 103, 104, 116, 64, 48, 44, 52, 48, + 48, 59, 48, 44, 54, 48, 48, 59, 49, 44, 52, 48, 48, 59, 49, 44, 54, 48, 48, 38, 97, 109, 112, + 59, 100, 105, 115, 112, 108, 97, 121, 61, 115, 119, 97, 112, 34, 47, 62, 60, 109, 101, 116, 97, + 32, 110, 97, 109, 101, 61, 34, 118, 105, 101, 119, 112, 111, 114, 116, 34, 32, 99, 111, 110, + 116, 101, 110, 116, 61, 34, 119, 105, 100, 116, 104, 61, 100, 101, 118, 105, 99, 101, 45, 119, + 105, 100, 116, 104, 44, 32, 105, 110, 105, 116, 105, 97, 108, 45, 115, 99, 97, 108, 101, 61, + 49, 46, 48, 34, 47, 62, 60, 109, 101, 116, 97, 32, 112, 114, 111, 112, 101, 114, 116, 121, 61, + 34, 111, 103, 58, 116, 105, 116, 108, 101, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, + 67, 114, 101, 109, 97, 32, 76, 97, 98, 115, 34, 47, 62, 60, 109, 101, 116, 97, 32, 112, 114, + 111, 112, 101, 114, 116, 121, 61, 34, 111, 103, 58, 100, 101, 115, 99, 114, 105, 112, 116, 105, + 111, 110, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 67, 114, 101, 109, 97, 32, 76, 97, + 98, 115, 32, 105, 115, 32, 97, 32, 98, 108, 111, 99, 107, 99, 104, 97, 105, 110, 32, 82, 38, + 97, 109, 112, 59, 97, 109, 112, 59, 68, 32, 115, 116, 117, 100, 105, 111, 46, 32, 87, 101, 32, + 115, 112, 101, 99, 105, 97, 108, 105, 122, 101, 32, 105, 110, 32, 122, 101, 114, 111, 45, 107, + 110, 111, 119, 108, 101, 100, 103, 101, 32, 112, 114, 111, 111, 102, 115, 32, 90, 75, 44, 32, + 68, 101, 70, 105, 44, 32, 97, 110, 100, 32, 66, 105, 116, 99, 111, 105, 110, 46, 32, 79, 117, + 114, 32, 109, 105, 115, 115, 105, 111, 110, 32, 105, 115, 32, 116, 111, 32, 112, 117, 115, 104, + 32, 116, 104, 101, 32, 98, 111, 117, 110, 100, 97, 114, 105, 101, 115, 32, 111, 102, 32, 98, + 108, 111, 99, 107, 99, 104, 97, 105, 110, 32, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, + 32, 98, 121, 32, 100, 101, 118, 101, 108, 111, 112, 105, 110, 103, 32, 99, 117, 116, 116, 105, + 110, 103, 45, 101, 100, 103, 101, 32, 115, 111, 108, 117, 116, 105, 111, 110, 115, 32, 102, + 111, 114, 32, 116, 104, 101, 32, 102, 117, 116, 117, 114, 101, 32, 111, 102, 32, 115, 101, 99, + 117, 114, 101, 32, 97, 110, 100, 32, 115, 99, 97, 108, 97, 98, 108, 101, 32, 100, 101, 99, 101, + 110, 116, 114, 97, 108, 105, 122, 101, 100, 32, 115, 121, 115, 116, 101, 109, 115, 46, 34, 47, + 62, 60, 109, 101, 116, 97, 32, 112, 114, 111, 112, 101, 114, 116, 121, 61, 34, 111, 103, 58, + 105, 109, 97, 103, 101, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 104, 116, 116, 112, + 115, 58, 47, 47, 98, 108, 111, 103, 46, 99, 114, 101, 109, 97, 46, 115, 104, 47, 115, 116, 97, + 116, 105, 99, 47, 111, 103, 45, 105, 109, 97, 103, 101, 46, 112, 110, 103, 34, 47, 62, 60, 109, + 101, 116, 97, 32, 112, 114, 111, 112, 101, 114, 116, 121, 61, 34, 111, 103, 58, 119, 105, 100, + 116, 104, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 49, 50, 48, 48, 34, 47, 62, 60, + 109, 101, 116, 97, 32, 112, 114, 111, 112, 101, 114, 116, 121, 61, 34, 111, 103, 58, 104, 101, + 105, 103, 104, 116, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 54, 55, 53, 34, 47, 62, + 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 34, 105, 99, 111, 110, 34, 32, 104, 114, 101, + 102, 61, 34, 46, 47, 115, 116, 97, 116, 105, 99, 47, 105, 99, 111, 110, 46, 112, 110, 103, 34, + 47, 62, 60, 109, 101, 116, 97, 32, 110, 97, 109, 101, 61, 34, 100, 101, 115, 99, 114, 105, 112, + 116, 105, 111, 110, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 67, 114, 101, 109, 97, + 32, 76, 97, 98, 115, 32, 105, 115, 32, 97, 32, 98, 108, 111, 99, 107, 99, 104, 97, 105, 110, + 32, 82, 38, 97, 109, 112, 59, 97, 109, 112, 59, 68, 32, 115, 116, 117, 100, 105, 111, 46, 32, + 87, 101, 32, 115, 112, 101, 99, 105, 97, 108, 105, 122, 101, 32, 105, 110, 32, 122, 101, 114, + 111, 45, 107, 110, 111, 119, 108, 101, 100, 103, 101, 32, 112, 114, 111, 111, 102, 115, 32, 90, + 75, 44, 32, 68, 101, 70, 105, 44, 32, 97, 110, 100, 32, 66, 105, 116, 99, 111, 105, 110, 46, + 32, 79, 117, 114, 32, 109, 105, 115, 115, 105, 111, 110, 32, 105, 115, 32, 116, 111, 32, 112, + 117, 115, 104, 32, 116, 104, 101, 32, 98, 111, 117, 110, 100, 97, 114, 105, 101, 115, 32, 111, + 102, 32, 98, 108, 111, 99, 107, 99, 104, 97, 105, 110, 32, 116, 101, 99, 104, 110, 111, 108, + 111, 103, 121, 32, 98, 121, 32, 100, 101, 118, 101, 108, 111, 112, 105, 110, 103, 32, 99, 117, + 116, 116, 105, 110, 103, 45, 101, 100, 103, 101, 32, 115, 111, 108, 117, 116, 105, 111, 110, + 115, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 117, 116, 117, 114, 101, 32, 111, 102, 32, + 115, 101, 99, 117, 114, 101, 32, 97, 110, 100, 32, 115, 99, 97, 108, 97, 98, 108, 101, 32, 100, + 101, 99, 101, 110, 116, 114, 97, 108, 105, 122, 101, 100, 32, 115, 121, 115, 116, 101, 109, + 115, 46, 34, 47, 62, 60, 109, 101, 116, 97, 32, 110, 97, 109, 101, 61, 34, 103, 101, 110, 101, + 114, 97, 116, 111, 114, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 81, 117, 97, 114, + 116, 122, 34, 47, 62, 60, 108, 105, 110, 107, 32, 104, 114, 101, 102, 61, 34, 46, 47, 105, 110, + 100, 101, 120, 46, 99, 115, 115, 34, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, + 104, 101, 101, 116, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 99, 115, 115, + 34, 32, 115, 112, 97, 45, 112, 114, 101, 115, 101, 114, 118, 101, 47, 62, 60, 108, 105, 110, + 107, 32, 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 99, 100, 110, 106, + 115, 46, 99, 108, 111, 117, 100, 102, 108, 97, 114, 101, 46, 99, 111, 109, 47, 97, 106, 97, + 120, 47, 108, 105, 98, 115, 47, 75, 97, 84, 101, 88, 47, 48, 46, 49, 54, 46, 57, 47, 107, 97, + 116, 101, 120, 46, 109, 105, 110, 46, 99, 115, 115, 34, 32, 114, 101, 108, 61, 34, 115, 116, + 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, + 47, 99, 115, 115, 34, 32, 115, 112, 97, 45, 112, 114, 101, 115, 101, 114, 118, 101, 47, 62, 60, + 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 46, 47, 112, 114, 101, 115, 99, 114, + 105, 112, 116, 46, 106, 115, 34, 32, 116, 121, 112, 101, 61, 34, 97, 112, 112, 108, 105, 99, + 97, 116, 105, 111, 110, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 32, 115, 112, + 97, 45, 112, 114, 101, 115, 101, 114, 118, 101, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, + 60, 115, 99, 114, 105, 112, 116, 32, 116, 121, 112, 101, 61, 34, 97, 112, 112, 108, 105, 99, + 97, 116, 105, 111, 110, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 32, 115, 112, + 97, 45, 112, 114, 101, 115, 101, 114, 118, 101, 62, 99, 111, 110, 115, 116, 32, 102, 101, 116, + 99, 104, 68, 97, 116, 97, 32, 61, 32, 102, 101, 116, 99, 104, 40, 34, 46, 47, 115, 116, 97, + 116, 105, 99, 47, 99, 111, 110, 116, 101, 110, 116, 73, 110, 100, 101, 120, 46, 106, 115, 111, + 110, 34, 41, 46, 116, 104, 101, 110, 40, 100, 97, 116, 97, 32, 61, 62, 32, 100, 97, 116, 97, + 46, 106, 115, 111, 110, 40, 41, 41, 60, 47, 115, 99, 114, 105, 112, 116, 62, 60, 47, 104, 101, + 97, 100, 62, 60, 98, 111, 100, 121, 32, 100, 97, 116, 97, 45, 115, 108, 117, 103, 61, 34, 105, + 110, 100, 101, 120, 34, 62, 60, 100, 105, 118, 32, 105, 100, 61, 34, 113, 117, 97, 114, 116, + 122, 45, 114, 111, 111, 116, 34, 32, 99, 108, 97, 115, 115, 61, 34, 112, 97, 103, 101, 34, 62, + 60, 100, 105, 118, 32, 105, 100, 61, 34, 113, 117, 97, 114, 116, 122, 45, 98, 111, 100, 121, + 34, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 108, 101, 102, 116, 32, 115, 105, + 100, 101, 98, 97, 114, 34, 62, 60, 104, 50, 32, 99, 108, 97, 115, 115, 61, 34, 112, 97, 103, + 101, 45, 116, 105, 116, 108, 101, 34, 62, 60, 97, 32, 104, 114, 101, 102, 61, 34, 46, 34, 62, + 240, 159, 141, 181, 32, 67, 114, 101, 109, 97, 32, 76, 97, 98, 115, 60, 47, 97, 62, 60, 47, + 104, 50, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 115, 112, 97, 99, 101, 114, + 32, 109, 111, 98, 105, 108, 101, 45, 111, 110, 108, 121, 34, 62, 60, 47, 100, 105, 118, 62, 60, + 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 115, 101, 97, 114, 99, 104, 34, 62, 60, 98, + 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, 115, 61, 34, 115, 101, 97, 114, 99, 104, 45, 98, + 117, 116, 116, 111, 110, 34, 32, 105, 100, 61, 34, 115, 101, 97, 114, 99, 104, 45, 98, 117, + 116, 116, 111, 110, 34, 62, 60, 112, 62, 83, 101, 97, 114, 99, 104, 60, 47, 112, 62, 60, 115, + 118, 103, 32, 114, 111, 108, 101, 61, 34, 105, 109, 103, 34, 32, 120, 109, 108, 110, 115, 61, + 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, + 48, 48, 47, 115, 118, 103, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, + 49, 57, 46, 57, 32, 49, 57, 46, 55, 34, 62, 60, 116, 105, 116, 108, 101, 62, 83, 101, 97, 114, + 99, 104, 60, 47, 116, 105, 116, 108, 101, 62, 60, 103, 32, 99, 108, 97, 115, 115, 61, 34, 115, + 101, 97, 114, 99, 104, 45, 112, 97, 116, 104, 34, 32, 102, 105, 108, 108, 61, 34, 110, 111, + 110, 101, 34, 62, 60, 112, 97, 116, 104, 32, 115, 116, 114, 111, 107, 101, 45, 108, 105, 110, + 101, 99, 97, 112, 61, 34, 115, 113, 117, 97, 114, 101, 34, 32, 100, 61, 34, 77, 49, 56, 46, 53, + 32, 49, 56, 46, 51, 108, 45, 53, 46, 52, 45, 53, 46, 52, 34, 62, 60, 47, 112, 97, 116, 104, 62, + 60, 99, 105, 114, 99, 108, 101, 32, 99, 120, 61, 34, 56, 34, 32, 99, 121, 61, 34, 56, 34, 32, + 114, 61, 34, 55, 34, 62, 60, 47, 99, 105, 114, 99, 108, 101, 62, 60, 47, 103, 62, 60, 47, 115, + 118, 103, 62, 60, 47, 98, 117, 116, 116, 111, 110, 62, 60, 100, 105, 118, 32, 105, 100, 61, 34, + 115, 101, 97, 114, 99, 104, 45, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 62, 60, 100, + 105, 118, 32, 105, 100, 61, 34, 115, 101, 97, 114, 99, 104, 45, 115, 112, 97, 99, 101, 34, 62, + 60, 105, 110, 112, 117, 116, 32, 97, 117, 116, 111, 99, 111, 109, 112, 108, 101, 116, 101, 61, + 34, 111, 102, 102, 34, 32, 105, 100, 61, 34, 115, 101, 97, 114, 99, 104, 45, 98, 97, 114, 34, + 32, 110, 97, 109, 101, 61, 34, 115, 101, 97, 114, 99, 104, 34, 32, 116, 121, 112, 101, 61, 34, + 116, 101, 120, 116, 34, 32, 97, 114, 105, 97, 45, 108, 97, 98, 101, 108, 61, 34, 83, 101, 97, + 114, 99, 104, 32, 102, 111, 114, 32, 115, 111, 109, 101, 116, 104, 105, 110, 103, 34, 32, 112, + 108, 97, 99, 101, 104, 111, 108, 100, 101, 114, 61, 34, 83, 101, 97, 114, 99, 104, 32, 102, + 111, 114, 32, 115, 111, 109, 101, 116, 104, 105, 110, 103, 34, 47, 62, 60, 100, 105, 118, 32, + 105, 100, 61, 34, 115, 101, 97, 114, 99, 104, 45, 108, 97, 121, 111, 117, 116, 34, 32, 100, 97, + 116, 97, 45, 112, 114, 101, 118, 105, 101, 119, 61, 34, 116, 114, 117, 101, 34, 62, 60, 47, + 100, 105, 118, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, + 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 100, 97, 114, 107, 109, 111, 100, + 101, 34, 62, 60, 105, 110, 112, 117, 116, 32, 99, 108, 97, 115, 115, 61, 34, 116, 111, 103, + 103, 108, 101, 34, 32, 105, 100, 61, 34, 100, 97, 114, 107, 109, 111, 100, 101, 45, 116, 111, + 103, 103, 108, 101, 34, 32, 116, 121, 112, 101, 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, + 34, 32, 116, 97, 98, 105, 110, 100, 101, 120, 61, 34, 45, 49, 34, 47, 62, 60, 108, 97, 98, 101, + 108, 32, 105, 100, 61, 34, 116, 111, 103, 103, 108, 101, 45, 108, 97, 98, 101, 108, 45, 108, + 105, 103, 104, 116, 34, 32, 102, 111, 114, 61, 34, 100, 97, 114, 107, 109, 111, 100, 101, 45, + 116, 111, 103, 103, 108, 101, 34, 32, 116, 97, 98, 105, 110, 100, 101, 120, 61, 34, 45, 49, 34, + 62, 60, 115, 118, 103, 32, 120, 109, 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, + 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, + 120, 109, 108, 110, 115, 58, 120, 108, 105, 110, 107, 61, 34, 104, 116, 116, 112, 58, 47, 47, + 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 120, 108, 105, 110, 107, + 34, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 49, 34, 32, 105, 100, 61, 34, 100, + 97, 121, 73, 99, 111, 110, 34, 32, 120, 61, 34, 48, 112, 120, 34, 32, 121, 61, 34, 48, 112, + 120, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 51, 53, 32, 51, 53, 34, + 32, 115, 116, 121, 108, 101, 61, 34, 101, 110, 97, 98, 108, 101, 45, 98, 97, 99, 107, 103, 114, + 111, 117, 110, 100, 58, 110, 101, 119, 32, 48, 32, 48, 32, 51, 53, 32, 51, 53, 34, 32, 120, + 109, 108, 58, 115, 112, 97, 99, 101, 61, 34, 112, 114, 101, 115, 101, 114, 118, 101, 34, 62, + 60, 116, 105, 116, 108, 101, 62, 68, 97, 114, 107, 32, 109, 111, 100, 101, 60, 47, 116, 105, + 116, 108, 101, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 54, 44, 49, 55, 46, 53, 67, 54, + 44, 49, 54, 46, 54, 55, 50, 44, 53, 46, 51, 50, 56, 44, 49, 54, 44, 52, 46, 53, 44, 49, 54, + 104, 45, 51, 67, 48, 46, 54, 55, 50, 44, 49, 54, 44, 48, 44, 49, 54, 46, 54, 55, 50, 44, 48, + 44, 49, 55, 46, 53, 32, 32, 32, 32, 83, 48, 46, 54, 55, 50, 44, 49, 57, 44, 49, 46, 53, 44, 49, + 57, 104, 51, 67, 53, 46, 51, 50, 56, 44, 49, 57, 44, 54, 44, 49, 56, 46, 51, 50, 56, 44, 54, + 44, 49, 55, 46, 53, 122, 32, 77, 55, 46, 53, 44, 50, 54, 99, 45, 48, 46, 52, 49, 52, 44, 48, + 45, 48, 46, 55, 56, 57, 44, 48, 46, 49, 54, 56, 45, 49, 46, 48, 54, 49, 44, 48, 46, 52, 51, 57, + 108, 45, 50, 44, 50, 67, 52, 46, 49, 54, 56, 44, 50, 56, 46, 55, 49, 49, 44, 52, 44, 50, 57, + 46, 48, 56, 54, 44, 52, 44, 50, 57, 46, 53, 32, 32, 32, 32, 67, 52, 44, 51, 48, 46, 51, 50, 56, + 44, 52, 46, 54, 55, 49, 44, 51, 49, 44, 53, 46, 53, 44, 51, 49, 99, 48, 46, 52, 49, 52, 44, 48, + 44, 48, 46, 55, 56, 57, 45, 48, 46, 49, 54, 56, 44, 49, 46, 48, 54, 45, 48, 46, 52, 52, 108, + 50, 45, 50, 67, 56, 46, 56, 51, 50, 44, 50, 56, 46, 50, 56, 57, 44, 57, 44, 50, 55, 46, 57, 49, + 52, 44, 57, 44, 50, 55, 46, 53, 67, 57, 44, 50, 54, 46, 54, 55, 50, 44, 56, 46, 51, 50, 57, 44, + 50, 54, 44, 55, 46, 53, 44, 50, 54, 122, 32, 77, 49, 55, 46, 53, 44, 54, 32, 32, 32, 32, 67, + 49, 56, 46, 51, 50, 57, 44, 54, 44, 49, 57, 44, 53, 46, 51, 50, 56, 44, 49, 57, 44, 52, 46, 53, + 118, 45, 51, 67, 49, 57, 44, 48, 46, 54, 55, 50, 44, 49, 56, 46, 51, 50, 57, 44, 48, 44, 49, + 55, 46, 53, 44, 48, 83, 49, 54, 44, 48, 46, 54, 55, 50, 44, 49, 54, 44, 49, 46, 53, 118, 51, + 67, 49, 54, 44, 53, 46, 51, 50, 56, 44, 49, 54, 46, 54, 55, 49, 44, 54, 44, 49, 55, 46, 53, 44, + 54, 122, 32, 77, 50, 55, 46, 53, 44, 57, 32, 32, 32, 32, 99, 48, 46, 52, 49, 52, 44, 48, 44, + 48, 46, 55, 56, 57, 45, 48, 46, 49, 54, 56, 44, 49, 46, 48, 54, 45, 48, 46, 52, 51, 57, 108, + 50, 45, 50, 67, 51, 48, 46, 56, 51, 50, 44, 54, 46, 50, 56, 57, 44, 51, 49, 44, 53, 46, 57, 49, + 52, 44, 51, 49, 44, 53, 46, 53, 67, 51, 49, 44, 52, 46, 54, 55, 50, 44, 51, 48, 46, 51, 50, 57, + 44, 52, 44, 50, 57, 46, 53, 44, 52, 99, 45, 48, 46, 52, 49, 52, 44, 48, 45, 48, 46, 55, 56, 57, + 44, 48, 46, 49, 54, 56, 45, 49, 46, 48, 54, 49, 44, 48, 46, 52, 52, 32, 32, 32, 32, 108, 45, + 50, 44, 50, 67, 50, 54, 46, 49, 54, 56, 44, 54, 46, 55, 49, 49, 44, 50, 54, 44, 55, 46, 48, 56, + 54, 44, 50, 54, 44, 55, 46, 53, 67, 50, 54, 44, 56, 46, 51, 50, 56, 44, 50, 54, 46, 54, 55, 49, + 44, 57, 44, 50, 55, 46, 53, 44, 57, 122, 32, 77, 54, 46, 52, 51, 57, 44, 56, 46, 53, 54, 49, + 67, 54, 46, 55, 49, 49, 44, 56, 46, 56, 51, 50, 44, 55, 46, 48, 56, 54, 44, 57, 44, 55, 46, 53, + 44, 57, 67, 56, 46, 51, 50, 56, 44, 57, 44, 57, 44, 56, 46, 51, 50, 56, 44, 57, 44, 55, 46, 53, + 32, 32, 32, 32, 99, 48, 45, 48, 46, 52, 49, 52, 45, 48, 46, 49, 54, 56, 45, 48, 46, 55, 56, 57, + 45, 48, 46, 52, 51, 57, 45, 49, 46, 48, 54, 49, 108, 45, 50, 45, 50, 67, 54, 46, 50, 56, 57, + 44, 52, 46, 49, 54, 56, 44, 53, 46, 57, 49, 52, 44, 52, 44, 53, 46, 53, 44, 52, 67, 52, 46, 54, + 55, 50, 44, 52, 44, 52, 44, 52, 46, 54, 55, 50, 44, 52, 44, 53, 46, 53, 99, 48, 44, 48, 46, 52, + 49, 52, 44, 48, 46, 49, 54, 56, 44, 48, 46, 55, 56, 57, 44, 48, 46, 52, 51, 57, 44, 49, 46, 48, + 54, 32, 32, 32, 32, 76, 54, 46, 52, 51, 57, 44, 56, 46, 53, 54, 49, 122, 32, 77, 51, 51, 46, + 53, 44, 49, 54, 104, 45, 51, 99, 45, 48, 46, 56, 50, 56, 44, 48, 45, 49, 46, 53, 44, 48, 46, + 54, 55, 50, 45, 49, 46, 53, 44, 49, 46, 53, 115, 48, 46, 54, 55, 50, 44, 49, 46, 53, 44, 49, + 46, 53, 44, 49, 46, 53, 104, 51, 99, 48, 46, 56, 50, 56, 44, 48, 44, 49, 46, 53, 45, 48, 46, + 54, 55, 50, 44, 49, 46, 53, 45, 49, 46, 53, 83, 51, 52, 46, 51, 50, 56, 44, 49, 54, 44, 51, 51, + 46, 53, 44, 49, 54, 122, 32, 32, 32, 32, 32, 77, 50, 56, 46, 53, 54, 49, 44, 50, 54, 46, 52, + 51, 57, 67, 50, 56, 46, 50, 56, 57, 44, 50, 54, 46, 49, 54, 56, 44, 50, 55, 46, 57, 49, 52, 44, + 50, 54, 44, 50, 55, 46, 53, 44, 50, 54, 99, 45, 48, 46, 56, 50, 56, 44, 48, 45, 49, 46, 53, 44, + 48, 46, 54, 55, 50, 45, 49, 46, 53, 44, 49, 46, 53, 99, 48, 44, 48, 46, 52, 49, 52, 44, 48, 46, + 49, 54, 56, 44, 48, 46, 55, 56, 57, 44, 48, 46, 52, 51, 57, 44, 49, 46, 48, 54, 108, 50, 44, + 50, 32, 32, 32, 32, 67, 50, 56, 46, 55, 49, 49, 44, 51, 48, 46, 56, 51, 50, 44, 50, 57, 46, 48, + 56, 54, 44, 51, 49, 44, 50, 57, 46, 53, 44, 51, 49, 99, 48, 46, 56, 50, 56, 44, 48, 44, 49, 46, + 53, 45, 48, 46, 54, 55, 50, 44, 49, 46, 53, 45, 49, 46, 53, 99, 48, 45, 48, 46, 52, 49, 52, 45, + 48, 46, 49, 54, 56, 45, 48, 46, 55, 56, 57, 45, 48, 46, 52, 51, 57, 45, 49, 46, 48, 54, 49, 76, + 50, 56, 46, 53, 54, 49, 44, 50, 54, 46, 52, 51, 57, 122, 32, 77, 49, 55, 46, 53, 44, 50, 57, + 32, 32, 32, 32, 99, 45, 48, 46, 56, 50, 57, 44, 48, 45, 49, 46, 53, 44, 48, 46, 54, 55, 50, 45, + 49, 46, 53, 44, 49, 46, 53, 118, 51, 99, 48, 44, 48, 46, 56, 50, 56, 44, 48, 46, 54, 55, 49, + 44, 49, 46, 53, 44, 49, 46, 53, 44, 49, 46, 53, 115, 49, 46, 53, 45, 48, 46, 54, 55, 50, 44, + 49, 46, 53, 45, 49, 46, 53, 118, 45, 51, 67, 49, 57, 44, 50, 57, 46, 54, 55, 50, 44, 49, 56, + 46, 51, 50, 57, 44, 50, 57, 44, 49, 55, 46, 53, 44, 50, 57, 122, 32, 77, 49, 55, 46, 53, 44, + 55, 32, 32, 32, 32, 67, 49, 49, 46, 55, 49, 44, 55, 44, 55, 44, 49, 49, 46, 55, 49, 44, 55, 44, + 49, 55, 46, 53, 83, 49, 49, 46, 55, 49, 44, 50, 56, 44, 49, 55, 46, 53, 44, 50, 56, 83, 50, 56, + 44, 50, 51, 46, 50, 57, 44, 50, 56, 44, 49, 55, 46, 53, 83, 50, 51, 46, 50, 57, 44, 55, 44, 49, + 55, 46, 53, 44, 55, 122, 32, 77, 49, 55, 46, 53, 44, 50, 53, 99, 45, 52, 46, 49, 51, 54, 44, + 48, 45, 55, 46, 53, 45, 51, 46, 51, 54, 52, 45, 55, 46, 53, 45, 55, 46, 53, 32, 32, 32, 32, 99, + 48, 45, 52, 46, 49, 51, 54, 44, 51, 46, 51, 54, 52, 45, 55, 46, 53, 44, 55, 46, 53, 45, 55, 46, + 53, 99, 52, 46, 49, 51, 54, 44, 48, 44, 55, 46, 53, 44, 51, 46, 51, 54, 52, 44, 55, 46, 53, 44, + 55, 46, 53, 67, 50, 53, 44, 50, 49, 46, 54, 51, 54, 44, 50, 49, 46, 54, 51, 54, 44, 50, 53, 44, + 49, 55, 46, 53, 44, 50, 53, 122, 34, 62, 60, 47, 112, 97, 116, 104, 62, 60, 47, 115, 118, 103, + 62, 60, 47, 108, 97, 98, 101, 108, 62, 60, 108, 97, 98, 101, 108, 32, 105, 100, 61, 34, 116, + 111, 103, 103, 108, 101, 45, 108, 97, 98, 101, 108, 45, 100, 97, 114, 107, 34, 32, 102, 111, + 114, 61, 34, 100, 97, 114, 107, 109, 111, 100, 101, 45, 116, 111, 103, 103, 108, 101, 34, 32, + 116, 97, 98, 105, 110, 100, 101, 120, 61, 34, 45, 49, 34, 62, 60, 115, 118, 103, 32, 120, 109, + 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, + 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, 120, 109, 108, 110, 115, 58, 120, 108, + 105, 110, 107, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, + 114, 103, 47, 49, 57, 57, 57, 47, 120, 108, 105, 110, 107, 34, 32, 118, 101, 114, 115, 105, + 111, 110, 61, 34, 49, 46, 49, 34, 32, 105, 100, 61, 34, 110, 105, 103, 104, 116, 73, 99, 111, + 110, 34, 32, 120, 61, 34, 48, 112, 120, 34, 32, 121, 61, 34, 48, 112, 120, 34, 32, 118, 105, + 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 49, 48, 48, 32, 49, 48, 48, 34, 32, 115, 116, + 121, 108, 101, 61, 34, 101, 110, 97, 98, 108, 101, 45, 98, 97, 99, 107, 103, 114, 111, 117, + 110, 100, 58, 110, 101, 119, 32, 48, 32, 48, 32, 49, 48, 48, 32, 49, 48, 48, 34, 32, 120, 109, + 108, 58, 115, 112, 97, 99, 101, 61, 34, 112, 114, 101, 115, 101, 114, 118, 101, 34, 62, 60, + 116, 105, 116, 108, 101, 62, 76, 105, 103, 104, 116, 32, 109, 111, 100, 101, 60, 47, 116, 105, + 116, 108, 101, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 57, 54, 46, 55, 54, 44, 54, 54, + 46, 52, 53, 56, 99, 45, 48, 46, 56, 53, 51, 45, 48, 46, 56, 53, 50, 45, 50, 46, 49, 53, 45, 49, + 46, 48, 54, 52, 45, 51, 46, 50, 51, 45, 48, 46, 53, 51, 52, 99, 45, 54, 46, 48, 54, 51, 44, 50, + 46, 57, 57, 49, 45, 49, 50, 46, 56, 53, 56, 44, 52, 46, 53, 55, 49, 45, 49, 57, 46, 54, 53, 53, + 44, 52, 46, 53, 55, 49, 32, 32, 67, 54, 50, 46, 48, 50, 50, 44, 55, 48, 46, 52, 57, 53, 44, 53, + 48, 46, 56, 56, 44, 54, 53, 46, 56, 56, 44, 52, 50, 46, 53, 44, 53, 55, 46, 53, 67, 50, 57, 46, + 48, 52, 51, 44, 52, 52, 46, 48, 52, 51, 44, 50, 53, 46, 54, 53, 56, 44, 50, 51, 46, 53, 51, 54, + 44, 51, 52, 46, 48, 55, 54, 44, 54, 46, 52, 55, 99, 48, 46, 53, 51, 50, 45, 49, 46, 48, 56, 44, + 48, 46, 51, 49, 56, 45, 50, 46, 51, 55, 57, 45, 48, 46, 53, 51, 52, 45, 51, 46, 50, 51, 32, 32, + 99, 45, 48, 46, 56, 53, 49, 45, 48, 46, 56, 53, 50, 45, 50, 46, 49, 53, 45, 49, 46, 48, 54, 52, + 45, 51, 46, 50, 51, 45, 48, 46, 53, 51, 52, 99, 45, 52, 46, 57, 49, 56, 44, 50, 46, 52, 50, 55, + 45, 57, 46, 51, 55, 53, 44, 53, 46, 54, 49, 57, 45, 49, 51, 46, 50, 52, 54, 44, 57, 46, 52, 57, + 49, 99, 45, 57, 46, 52, 52, 55, 44, 57, 46, 52, 52, 55, 45, 49, 52, 46, 54, 53, 44, 50, 50, 46, + 48, 48, 56, 45, 49, 52, 46, 54, 53, 44, 51, 53, 46, 51, 54, 57, 32, 32, 99, 48, 44, 49, 51, 46, + 51, 54, 44, 53, 46, 50, 48, 51, 44, 50, 53, 46, 57, 50, 49, 44, 49, 52, 46, 54, 53, 44, 51, 53, + 46, 51, 54, 56, 115, 50, 50, 46, 48, 48, 56, 44, 49, 52, 46, 54, 53, 44, 51, 53, 46, 51, 54, + 56, 44, 49, 52, 46, 54, 53, 99, 49, 51, 46, 51, 54, 49, 44, 48, 44, 50, 53, 46, 57, 50, 49, 45, + 53, 46, 50, 48, 51, 44, 51, 53, 46, 51, 54, 57, 45, 49, 52, 46, 54, 53, 32, 32, 99, 51, 46, 56, + 55, 50, 45, 51, 46, 56, 55, 49, 44, 55, 46, 48, 54, 52, 45, 56, 46, 51, 50, 56, 44, 57, 46, 52, + 57, 49, 45, 49, 51, 46, 50, 52, 54, 67, 57, 55, 46, 56, 50, 54, 44, 54, 56, 46, 54, 48, 56, 44, + 57, 55, 46, 54, 49, 49, 44, 54, 55, 46, 51, 48, 57, 44, 57, 54, 46, 55, 54, 44, 54, 54, 46, 52, + 53, 56, 122, 34, 62, 60, 47, 112, 97, 116, 104, 62, 60, 47, 115, 118, 103, 62, 60, 47, 108, 97, + 98, 101, 108, 62, 60, 47, 100, 105, 118, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, + 34, 101, 120, 112, 108, 111, 114, 101, 114, 32, 100, 101, 115, 107, 116, 111, 112, 45, 111, + 110, 108, 121, 34, 62, 60, 98, 117, 116, 116, 111, 110, 32, 116, 121, 112, 101, 61, 34, 98, + 117, 116, 116, 111, 110, 34, 32, 105, 100, 61, 34, 101, 120, 112, 108, 111, 114, 101, 114, 34, + 32, 100, 97, 116, 97, 45, 98, 101, 104, 97, 118, 105, 111, 114, 61, 34, 99, 111, 108, 108, 97, + 112, 115, 101, 34, 32, 100, 97, 116, 97, 45, 99, 111, 108, 108, 97, 112, 115, 101, 100, 61, 34, + 99, 111, 108, 108, 97, 112, 115, 101, 100, 34, 32, 100, 97, 116, 97, 45, 115, 97, 118, 101, + 115, 116, 97, 116, 101, 61, 34, 116, 114, 117, 101, 34, 32, 100, 97, 116, 97, 45, 116, 114, + 101, 101, 61, 34, 91, 93, 34, 32, 97, 114, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, + 61, 34, 101, 120, 112, 108, 111, 114, 101, 114, 45, 99, 111, 110, 116, 101, 110, 116, 34, 32, + 97, 114, 105, 97, 45, 101, 120, 112, 97, 110, 100, 101, 100, 61, 34, 102, 97, 108, 115, 101, + 34, 62, 60, 104, 50, 62, 69, 120, 112, 108, 111, 114, 101, 114, 60, 47, 104, 50, 62, 60, 115, + 118, 103, 32, 120, 109, 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, + 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, 119, 105, 100, + 116, 104, 61, 34, 49, 52, 34, 32, 104, 101, 105, 103, 104, 116, 61, 34, 49, 52, 34, 32, 118, + 105, 101, 119, 66, 111, 120, 61, 34, 53, 32, 56, 32, 49, 52, 32, 56, 34, 32, 102, 105, 108, + 108, 61, 34, 110, 111, 110, 101, 34, 32, 115, 116, 114, 111, 107, 101, 61, 34, 99, 117, 114, + 114, 101, 110, 116, 67, 111, 108, 111, 114, 34, 32, 115, 116, 114, 111, 107, 101, 45, 119, 105, + 100, 116, 104, 61, 34, 50, 34, 32, 115, 116, 114, 111, 107, 101, 45, 108, 105, 110, 101, 99, + 97, 112, 61, 34, 114, 111, 117, 110, 100, 34, 32, 115, 116, 114, 111, 107, 101, 45, 108, 105, + 110, 101, 106, 111, 105, 110, 61, 34, 114, 111, 117, 110, 100, 34, 32, 99, 108, 97, 115, 115, + 61, 34, 102, 111, 108, 100, 34, 62, 60, 112, 111, 108, 121, 108, 105, 110, 101, 32, 112, 111, + 105, 110, 116, 115, 61, 34, 54, 32, 57, 32, 49, 50, 32, 49, 53, 32, 49, 56, 32, 57, 34, 62, 60, + 47, 112, 111, 108, 121, 108, 105, 110, 101, 62, 60, 47, 115, 118, 103, 62, 60, 47, 98, 117, + 116, 116, 111, 110, 62, 60, 100, 105, 118, 32, 105, 100, 61, 34, 101, 120, 112, 108, 111, 114, + 101, 114, 45, 99, 111, 110, 116, 101, 110, 116, 34, 62, 60, 117, 108, 32, 99, 108, 97, 115, + 115, 61, 34, 111, 118, 101, 114, 102, 108, 111, 119, 34, 32, 105, 100, 61, 34, 101, 120, 112, + 108, 111, 114, 101, 114, 45, 117, 108, 34, 62, 60, 108, 105, 62, 60, 100, 105, 118, 32, 99, + 108, 97, 115, 115, 61, 34, 102, 111, 108, 100, 101, 114, 45, 111, 117, 116, 101, 114, 32, 111, + 112, 101, 110, 34, 62, 60, 117, 108, 32, 115, 116, 121, 108, 101, 61, 34, 112, 97, 100, 100, + 105, 110, 103, 45, 108, 101, 102, 116, 58, 48, 59, 34, 32, 99, 108, 97, 115, 115, 61, 34, 99, + 111, 110, 116, 101, 110, 116, 34, 32, 100, 97, 116, 97, 45, 102, 111, 108, 100, 101, 114, 117, + 108, 62, 60, 108, 105, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 102, 111, 108, + 100, 101, 114, 45, 111, 117, 116, 101, 114, 32, 34, 62, 60, 117, 108, 32, 115, 116, 121, 108, + 101, 61, 34, 112, 97, 100, 100, 105, 110, 103, 45, 108, 101, 102, 116, 58, 48, 59, 34, 32, 99, + 108, 97, 115, 115, 61, 34, 99, 111, 110, 116, 101, 110, 116, 34, 32, 100, 97, 116, 97, 45, 102, + 111, 108, 100, 101, 114, 117, 108, 62, 60, 47, 117, 108, 62, 60, 47, 100, 105, 118, 62, 60, 47, + 108, 105, 62, 60, 108, 105, 62, 60, 97, 32, 104, 114, 101, 102, 61, 34, 46, 47, 80, 117, 114, + 114, 83, 101, 116, 116, 108, 101, 34, 32, 100, 97, 116, 97, 45, 102, 111, 114, 61, 34, 80, 117, + 114, 114, 83, 101, 116, 116, 108, 101, 34, 62, 80, 117, 114, 114, 83, 101, 116, 116, 108, 101, + 60, 47, 97, 62, 60, 47, 108, 105, 62, 60, 108, 105, 62, 60, 97, 32, 104, 114, 101, 102, 61, 34, + 46, 47, 83, 88, 71, 34, 32, 100, 97, 116, 97, 45, 102, 111, 114, 61, 34, 83, 88, 71, 34, 62, + 83, 88, 71, 32, 86, 101, 114, 105, 102, 105, 99, 97, 116, 105, 111, 110, 60, 47, 97, 62, 60, + 47, 108, 105, 62, 60, 47, 117, 108, 62, 60, 47, 100, 105, 118, 62, 60, 47, 108, 105, 62, 60, + 108, 105, 32, 105, 100, 61, 34, 101, 120, 112, 108, 111, 114, 101, 114, 45, 101, 110, 100, 34, + 62, 60, 47, 108, 105, 62, 60, 47, 117, 108, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, + 118, 62, 60, 47, 100, 105, 118, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 99, + 101, 110, 116, 101, 114, 34, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 112, 97, + 103, 101, 45, 104, 101, 97, 100, 101, 114, 34, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, + 115, 61, 34, 112, 111, 112, 111, 118, 101, 114, 45, 104, 105, 110, 116, 34, 62, 60, 104, 49, + 32, 99, 108, 97, 115, 115, 61, 34, 97, 114, 116, 105, 99, 108, 101, 45, 116, 105, 116, 108, + 101, 34, 62, 67, 114, 101, 109, 97, 32, 76, 97, 98, 115, 60, 47, 104, 49, 62, 60, 112, 32, 115, + 104, 111, 119, 45, 99, 111, 109, 109, 97, 61, 34, 116, 114, 117, 101, 34, 32, 99, 108, 97, 115, + 115, 61, 34, 99, 111, 110, 116, 101, 110, 116, 45, 109, 101, 116, 97, 34, 62, 60, 115, 112, 97, + 110, 62, 83, 101, 112, 32, 48, 50, 44, 32, 50, 48, 50, 52, 60, 47, 115, 112, 97, 110, 62, 60, + 115, 112, 97, 110, 62, 49, 32, 109, 105, 110, 32, 114, 101, 97, 100, 60, 47, 115, 112, 97, 110, + 62, 60, 47, 112, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, 62, 60, 97, 114, 116, + 105, 99, 108, 101, 32, 99, 108, 97, 115, 115, 61, 34, 112, 111, 112, 111, 118, 101, 114, 45, + 104, 105, 110, 116, 34, 62, 60, 112, 62, 67, 114, 101, 109, 97, 32, 76, 97, 98, 115, 32, 105, + 115, 32, 97, 32, 98, 108, 111, 99, 107, 99, 104, 97, 105, 110, 32, 82, 38, 97, 109, 112, 59, + 68, 32, 115, 116, 117, 100, 105, 111, 46, 32, 87, 101, 32, 115, 112, 101, 99, 105, 97, 108, + 105, 122, 101, 32, 105, 110, 32, 122, 101, 114, 111, 45, 107, 110, 111, 119, 108, 101, 100, + 103, 101, 32, 112, 114, 111, 111, 102, 115, 32, 90, 75, 44, 32, 68, 101, 70, 105, 44, 32, 97, + 110, 100, 32, 66, 105, 116, 99, 111, 105, 110, 46, 32, 79, 117, 114, 32, 109, 105, 115, 115, + 105, 111, 110, 32, 105, 115, 32, 116, 111, 32, 112, 117, 115, 104, 32, 116, 104, 101, 32, 98, + 111, 117, 110, 100, 97, 114, 105, 101, 115, 32, 111, 102, 32, 98, 108, 111, 99, 107, 99, 104, + 97, 105, 110, 32, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 32, 98, 121, 32, 100, 101, + 118, 101, 108, 111, 112, 105, 110, 103, 32, 99, 117, 116, 116, 105, 110, 103, 45, 101, 100, + 103, 101, 32, 115, 111, 108, 117, 116, 105, 111, 110, 115, 32, 102, 111, 114, 32, 116, 104, + 101, 32, 102, 117, 116, 117, 114, 101, 32, 111, 102, 32, 115, 101, 99, 117, 114, 101, 32, 97, + 110, 100, 32, 115, 99, 97, 108, 97, 98, 108, 101, 32, 100, 101, 99, 101, 110, 116, 114, 97, + 108, 105, 122, 101, 100, 32, 115, 121, 115, 116, 101, 109, 115, 46, 60, 47, 112, 62, 10, 60, + 112, 62, 87, 104, 97, 116, 32, 87, 101, 226, 128, 153, 114, 101, 32, 87, 111, 114, 107, 105, + 110, 103, 32, 79, 110, 58, 60, 47, 112, 62, 10, 60, 111, 108, 62, 10, 60, 108, 105, 62, 60, 97, + 32, 104, 114, 101, 102, 61, 34, 46, 47, 83, 88, 71, 34, 32, 99, 108, 97, 115, 115, 61, 34, 105, + 110, 116, 101, 114, 110, 97, 108, 32, 97, 108, 105, 97, 115, 34, 32, 100, 97, 116, 97, 45, 115, + 108, 117, 103, 61, 34, 83, 88, 71, 34, 62, 87, 101, 98, 32, 80, 114, 111, 111, 102, 115, 60, + 47, 97, 62, 58, 32, 69, 120, 112, 108, 111, 114, 105, 110, 103, 32, 116, 104, 101, 32, 105, + 110, 116, 101, 114, 115, 101, 99, 116, 105, 111, 110, 32, 111, 102, 32, 115, 101, 99, 117, 114, + 101, 32, 119, 101, 98, 32, 99, 111, 110, 116, 101, 110, 116, 32, 100, 101, 108, 105, 118, 101, + 114, 121, 32, 97, 110, 100, 32, 122, 101, 114, 111, 45, 107, 110, 111, 119, 108, 101, 100, 103, + 101, 32, 112, 114, 111, 111, 102, 115, 46, 60, 47, 108, 105, 62, 10, 60, 108, 105, 62, 60, 97, + 32, 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 103, 105, 116, 104, 117, + 98, 46, 99, 111, 109, 47, 99, 114, 101, 109, 97, 45, 108, 97, 98, 115, 47, 97, 112, 112, 45, + 97, 116, 116, 101, 115, 116, 47, 98, 108, 111, 98, 47, 102, 101, 97, 116, 47, 99, 101, 114, + 116, 80, 97, 116, 104, 86, 101, 114, 105, 102, 121, 47, 115, 112, 101, 99, 115, 47, 97, 112, + 112, 97, 116, 116, 101, 115, 116, 46, 109, 100, 34, 32, 99, 108, 97, 115, 115, 61, 34, 101, + 120, 116, 101, 114, 110, 97, 108, 34, 62, 65, 112, 112, 32, 65, 116, 116, 101, 115, 116, 60, + 115, 118, 103, 32, 97, 114, 105, 97, 45, 104, 105, 100, 100, 101, 110, 61, 34, 116, 114, 117, + 101, 34, 32, 99, 108, 97, 115, 115, 61, 34, 101, 120, 116, 101, 114, 110, 97, 108, 45, 105, 99, + 111, 110, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 53, 49, 50, 32, 53, + 49, 50, 34, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 51, 50, 48, 32, 48, 72, 50, 56, 56, + 86, 54, 52, 104, 51, 50, 32, 56, 50, 46, 55, 76, 50, 48, 49, 46, 52, 32, 50, 54, 53, 46, 52, + 32, 49, 55, 56, 46, 55, 32, 50, 56, 56, 32, 50, 50, 52, 32, 51, 51, 51, 46, 51, 108, 50, 50, + 46, 54, 45, 50, 50, 46, 54, 76, 52, 52, 56, 32, 49, 48, 57, 46, 51, 86, 49, 57, 50, 118, 51, + 50, 104, 54, 52, 86, 49, 57, 50, 32, 51, 50, 32, 48, 72, 52, 56, 48, 32, 51, 50, 48, 122, 77, + 51, 50, 32, 51, 50, 72, 48, 86, 54, 52, 32, 52, 56, 48, 118, 51, 50, 72, 51, 50, 32, 52, 53, + 54, 104, 51, 50, 86, 52, 56, 48, 32, 51, 53, 50, 32, 51, 50, 48, 72, 52, 50, 52, 118, 51, 50, + 32, 57, 54, 72, 54, 52, 86, 57, 54, 104, 57, 54, 32, 51, 50, 86, 51, 50, 72, 49, 54, 48, 32, + 51, 50, 122, 34, 62, 60, 47, 112, 97, 116, 104, 62, 60, 47, 115, 118, 103, 62, 60, 47, 97, 62, + 58, 32, 68, 101, 118, 101, 108, 111, 112, 32, 97, 32, 122, 107, 45, 98, 97, 115, 101, 100, 32, + 97, 116, 116, 101, 115, 116, 97, 116, 105, 111, 110, 32, 115, 121, 115, 116, 101, 109, 32, 116, + 104, 97, 116, 32, 105, 110, 116, 101, 103, 114, 97, 116, 101, 115, 32, 119, 105, 116, 104, 32, + 101, 120, 105, 115, 116, 105, 110, 103, 32, 65, 112, 112, 108, 101, 32, 68, 101, 118, 105, 99, + 101, 115, 46, 60, 47, 108, 105, 62, 10, 60, 108, 105, 62, 67, 114, 121, 112, 116, 111, 103, + 114, 97, 112, 104, 105, 99, 32, 80, 114, 105, 109, 105, 116, 105, 118, 101, 115, 58, 32, 66, + 117, 105, 108, 100, 105, 110, 103, 32, 102, 111, 117, 110, 100, 97, 116, 105, 111, 110, 97, + 108, 32, 108, 105, 98, 114, 97, 114, 105, 101, 115, 32, 116, 111, 32, 114, 101, 109, 111, 118, + 101, 32, 108, 105, 109, 105, 116, 97, 116, 105, 111, 110, 115, 32, 102, 111, 114, 32, 116, 104, + 101, 32, 102, 117, 116, 117, 114, 101, 32, 112, 114, 111, 106, 101, 99, 116, 115, 32, 97, 110, + 100, 32, 116, 104, 101, 32, 98, 114, 111, 97, 100, 101, 114, 32, 98, 108, 111, 99, 107, 99, + 104, 97, 105, 110, 32, 99, 111, 109, 109, 117, 110, 105, 116, 121, 46, 60, 47, 108, 105, 62, + 10, 60, 108, 105, 62, 66, 105, 116, 99, 111, 105, 110, 58, 32, 69, 110, 104, 97, 110, 99, 105, + 110, 103, 32, 99, 114, 111, 115, 115, 45, 99, 104, 97, 105, 110, 32, 105, 110, 116, 101, 114, + 111, 112, 101, 114, 97, 98, 105, 108, 105, 116, 121, 32, 119, 105, 116, 104, 32, 108, 105, 103, + 104, 116, 119, 101, 105, 103, 104, 116, 32, 66, 105, 116, 99, 111, 105, 110, 32, 118, 101, 114, + 105, 102, 105, 99, 97, 116, 105, 111, 110, 46, 60, 47, 108, 105, 62, 10, 60, 47, 111, 108, 62, + 10, 60, 112, 62, 83, 116, 97, 121, 32, 116, 117, 110, 101, 100, 32, 102, 111, 114, 32, 117, + 112, 100, 97, 116, 101, 115, 32, 111, 110, 32, 111, 117, 114, 32, 114, 101, 115, 101, 97, 114, + 99, 104, 44, 32, 100, 101, 118, 101, 108, 111, 112, 109, 101, 110, 116, 115, 44, 32, 97, 110, + 100, 32, 111, 112, 101, 110, 45, 115, 111, 117, 114, 99, 101, 32, 99, 111, 110, 116, 114, 105, + 98, 117, 116, 105, 111, 110, 115, 33, 60, 47, 112, 62, 60, 47, 97, 114, 116, 105, 99, 108, 101, + 62, 60, 104, 114, 47, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 112, 97, 103, + 101, 45, 102, 111, 111, 116, 101, 114, 34, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, + 118, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 114, 105, 103, 104, 116, 32, + 115, 105, 100, 101, 98, 97, 114, 34, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, + 103, 114, 97, 112, 104, 34, 62, 60, 104, 51, 62, 71, 114, 97, 112, 104, 32, 86, 105, 101, 119, + 60, 47, 104, 51, 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 103, 114, 97, 112, + 104, 45, 111, 117, 116, 101, 114, 34, 62, 60, 100, 105, 118, 32, 105, 100, 61, 34, 103, 114, + 97, 112, 104, 45, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 32, 100, 97, 116, 97, 45, 99, + 102, 103, 61, 34, 123, 38, 113, 117, 111, 116, 59, 100, 114, 97, 103, 38, 113, 117, 111, 116, + 59, 58, 116, 114, 117, 101, 44, 38, 113, 117, 111, 116, 59, 122, 111, 111, 109, 38, 113, 117, + 111, 116, 59, 58, 116, 114, 117, 101, 44, 38, 113, 117, 111, 116, 59, 100, 101, 112, 116, 104, + 38, 113, 117, 111, 116, 59, 58, 49, 44, 38, 113, 117, 111, 116, 59, 115, 99, 97, 108, 101, 38, + 113, 117, 111, 116, 59, 58, 49, 46, 49, 44, 38, 113, 117, 111, 116, 59, 114, 101, 112, 101, + 108, 70, 111, 114, 99, 101, 38, 113, 117, 111, 116, 59, 58, 48, 46, 53, 44, 38, 113, 117, 111, + 116, 59, 99, 101, 110, 116, 101, 114, 70, 111, 114, 99, 101, 38, 113, 117, 111, 116, 59, 58, + 48, 46, 51, 44, 38, 113, 117, 111, 116, 59, 108, 105, 110, 107, 68, 105, 115, 116, 97, 110, 99, + 101, 38, 113, 117, 111, 116, 59, 58, 51, 48, 44, 38, 113, 117, 111, 116, 59, 102, 111, 110, + 116, 83, 105, 122, 101, 38, 113, 117, 111, 116, 59, 58, 48, 46, 54, 44, 38, 113, 117, 111, 116, + 59, 111, 112, 97, 99, 105, 116, 121, 83, 99, 97, 108, 101, 38, 113, 117, 111, 116, 59, 58, 49, + 44, 38, 113, 117, 111, 116, 59, 115, 104, 111, 119, 84, 97, 103, 115, 38, 113, 117, 111, 116, + 59, 58, 116, 114, 117, 101, 44, 38, 113, 117, 111, 116, 59, 114, 101, 109, 111, 118, 101, 84, + 97, 103, 115, 38, 113, 117, 111, 116, 59, 58, 91, 93, 44, 38, 113, 117, 111, 116, 59, 102, 111, + 99, 117, 115, 79, 110, 72, 111, 118, 101, 114, 38, 113, 117, 111, 116, 59, 58, 102, 97, 108, + 115, 101, 125, 34, 62, 60, 47, 100, 105, 118, 62, 60, 115, 118, 103, 32, 118, 101, 114, 115, + 105, 111, 110, 61, 34, 49, 46, 49, 34, 32, 105, 100, 61, 34, 103, 108, 111, 98, 97, 108, 45, + 103, 114, 97, 112, 104, 45, 105, 99, 111, 110, 34, 32, 120, 109, 108, 110, 115, 61, 34, 104, + 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, + 47, 115, 118, 103, 34, 32, 120, 109, 108, 110, 115, 58, 120, 108, 105, 110, 107, 61, 34, 104, + 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, + 47, 120, 108, 105, 110, 107, 34, 32, 120, 61, 34, 48, 112, 120, 34, 32, 121, 61, 34, 48, 112, + 120, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 53, 53, 32, 53, 53, 34, + 32, 102, 105, 108, 108, 61, 34, 99, 117, 114, 114, 101, 110, 116, 67, 111, 108, 111, 114, 34, + 32, 120, 109, 108, 58, 115, 112, 97, 99, 101, 61, 34, 112, 114, 101, 115, 101, 114, 118, 101, + 34, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 52, 57, 44, 48, 99, 45, 51, 46, 51, 48, 57, + 44, 48, 45, 54, 44, 50, 46, 54, 57, 49, 45, 54, 44, 54, 99, 48, 44, 49, 46, 48, 51, 53, 44, 48, + 46, 50, 54, 51, 44, 50, 46, 48, 48, 57, 44, 48, 46, 55, 50, 54, 44, 50, 46, 56, 54, 108, 45, + 57, 46, 56, 50, 57, 44, 57, 46, 56, 50, 57, 67, 51, 50, 46, 53, 52, 50, 44, 49, 55, 46, 54, 51, + 52, 44, 51, 48, 46, 56, 52, 54, 44, 49, 55, 44, 50, 57, 44, 49, 55, 10, 9, 115, 45, 51, 46, 53, + 52, 50, 44, 48, 46, 54, 51, 52, 45, 52, 46, 56, 57, 56, 44, 49, 46, 54, 56, 56, 108, 45, 55, + 46, 54, 54, 57, 45, 55, 46, 54, 54, 57, 67, 49, 54, 46, 55, 56, 53, 44, 49, 48, 46, 52, 50, 52, + 44, 49, 55, 44, 57, 46, 55, 52, 44, 49, 55, 44, 57, 99, 48, 45, 50, 46, 50, 48, 54, 45, 49, 46, + 55, 57, 52, 45, 52, 45, 52, 45, 52, 83, 57, 44, 54, 46, 55, 57, 52, 44, 57, 44, 57, 115, 49, + 46, 55, 57, 52, 44, 52, 44, 52, 44, 52, 10, 9, 99, 48, 46, 55, 52, 44, 48, 44, 49, 46, 52, 50, + 52, 45, 48, 46, 50, 49, 53, 44, 50, 46, 48, 49, 57, 45, 48, 46, 53, 54, 55, 108, 55, 46, 54, + 54, 57, 44, 55, 46, 54, 54, 57, 67, 50, 49, 46, 54, 51, 52, 44, 50, 49, 46, 52, 53, 56, 44, 50, + 49, 44, 50, 51, 46, 49, 53, 52, 44, 50, 49, 44, 50, 53, 115, 48, 46, 54, 51, 52, 44, 51, 46, + 53, 52, 50, 44, 49, 46, 54, 56, 56, 44, 52, 46, 56, 57, 55, 76, 49, 48, 46, 48, 50, 52, 44, 52, + 50, 46, 53, 54, 50, 10, 9, 67, 56, 46, 57, 53, 56, 44, 52, 49, 46, 53, 57, 53, 44, 55, 46, 53, + 52, 57, 44, 52, 49, 44, 54, 44, 52, 49, 99, 45, 51, 46, 51, 48, 57, 44, 48, 45, 54, 44, 50, 46, + 54, 57, 49, 45, 54, 44, 54, 115, 50, 46, 54, 57, 49, 44, 54, 44, 54, 44, 54, 115, 54, 45, 50, + 46, 54, 57, 49, 44, 54, 45, 54, 99, 48, 45, 49, 46, 48, 51, 53, 45, 48, 46, 50, 54, 51, 45, 50, + 46, 48, 48, 57, 45, 48, 46, 55, 50, 54, 45, 50, 46, 56, 54, 108, 49, 50, 46, 56, 50, 57, 45, + 49, 50, 46, 56, 50, 57, 10, 9, 99, 49, 46, 49, 48, 54, 44, 48, 46, 56, 54, 44, 50, 46, 52, 52, + 44, 49, 46, 52, 51, 54, 44, 51, 46, 56, 57, 56, 44, 49, 46, 54, 49, 57, 118, 49, 48, 46, 49, + 54, 99, 45, 50, 46, 56, 51, 51, 44, 48, 46, 52, 55, 56, 45, 53, 44, 50, 46, 57, 52, 50, 45, 53, + 44, 53, 46, 57, 49, 99, 48, 44, 51, 46, 51, 48, 57, 44, 50, 46, 54, 57, 49, 44, 54, 44, 54, 44, + 54, 115, 54, 45, 50, 46, 54, 57, 49, 44, 54, 45, 54, 99, 48, 45, 50, 46, 57, 54, 55, 45, 50, + 46, 49, 54, 55, 45, 53, 46, 52, 51, 49, 45, 53, 45, 53, 46, 57, 49, 10, 9, 118, 45, 49, 48, 46, + 49, 54, 99, 49, 46, 52, 53, 56, 45, 48, 46, 49, 56, 51, 44, 50, 46, 55, 57, 50, 45, 48, 46, 55, + 53, 57, 44, 51, 46, 56, 57, 56, 45, 49, 46, 54, 49, 57, 108, 55, 46, 54, 54, 57, 44, 55, 46, + 54, 54, 57, 67, 52, 49, 46, 50, 49, 53, 44, 51, 57, 46, 53, 55, 54, 44, 52, 49, 44, 52, 48, 46, + 50, 54, 44, 52, 49, 44, 52, 49, 99, 48, 44, 50, 46, 50, 48, 54, 44, 49, 46, 55, 57, 52, 44, 52, + 44, 52, 44, 52, 115, 52, 45, 49, 46, 55, 57, 52, 44, 52, 45, 52, 10, 9, 115, 45, 49, 46, 55, + 57, 52, 45, 52, 45, 52, 45, 52, 99, 45, 48, 46, 55, 52, 44, 48, 45, 49, 46, 52, 50, 52, 44, 48, + 46, 50, 49, 53, 45, 50, 46, 48, 49, 57, 44, 48, 46, 53, 54, 55, 108, 45, 55, 46, 54, 54, 57, + 45, 55, 46, 54, 54, 57, 67, 51, 54, 46, 51, 54, 54, 44, 50, 56, 46, 53, 52, 50, 44, 51, 55, 44, + 50, 54, 46, 56, 52, 54, 44, 51, 55, 44, 50, 53, 115, 45, 48, 46, 54, 51, 52, 45, 51, 46, 53, + 52, 50, 45, 49, 46, 54, 56, 56, 45, 52, 46, 56, 57, 55, 108, 57, 46, 54, 54, 53, 45, 57, 46, + 54, 54, 53, 10, 9, 67, 52, 54, 46, 48, 52, 50, 44, 49, 49, 46, 52, 48, 53, 44, 52, 55, 46, 52, + 53, 49, 44, 49, 50, 44, 52, 57, 44, 49, 50, 99, 51, 46, 51, 48, 57, 44, 48, 44, 54, 45, 50, 46, + 54, 57, 49, 44, 54, 45, 54, 83, 53, 50, 46, 51, 48, 57, 44, 48, 44, 52, 57, 44, 48, 122, 32, + 77, 49, 49, 44, 57, 99, 48, 45, 49, 46, 49, 48, 51, 44, 48, 46, 56, 57, 55, 45, 50, 44, 50, 45, + 50, 115, 50, 44, 48, 46, 56, 57, 55, 44, 50, 44, 50, 115, 45, 48, 46, 56, 57, 55, 44, 50, 45, + 50, 44, 50, 10, 9, 83, 49, 49, 44, 49, 48, 46, 49, 48, 51, 44, 49, 49, 44, 57, 122, 32, 77, 54, + 44, 53, 49, 99, 45, 50, 46, 50, 48, 54, 44, 48, 45, 52, 45, 49, 46, 55, 57, 52, 45, 52, 45, 52, + 115, 49, 46, 55, 57, 52, 45, 52, 44, 52, 45, 52, 115, 52, 44, 49, 46, 55, 57, 52, 44, 52, 44, + 52, 83, 56, 46, 50, 48, 54, 44, 53, 49, 44, 54, 44, 53, 49, 122, 32, 77, 51, 51, 44, 52, 57, + 99, 48, 44, 50, 46, 50, 48, 54, 45, 49, 46, 55, 57, 52, 44, 52, 45, 52, 44, 52, 115, 45, 52, + 45, 49, 46, 55, 57, 52, 45, 52, 45, 52, 10, 9, 115, 49, 46, 55, 57, 52, 45, 52, 44, 52, 45, 52, + 83, 51, 51, 44, 52, 54, 46, 55, 57, 52, 44, 51, 51, 44, 52, 57, 122, 32, 77, 50, 57, 44, 51, + 49, 99, 45, 51, 46, 51, 48, 57, 44, 48, 45, 54, 45, 50, 46, 54, 57, 49, 45, 54, 45, 54, 115, + 50, 46, 54, 57, 49, 45, 54, 44, 54, 45, 54, 115, 54, 44, 50, 46, 54, 57, 49, 44, 54, 44, 54, + 83, 51, 50, 46, 51, 48, 57, 44, 51, 49, 44, 50, 57, 44, 51, 49, 122, 32, 77, 52, 55, 44, 52, + 49, 99, 48, 44, 49, 46, 49, 48, 51, 45, 48, 46, 56, 57, 55, 44, 50, 45, 50, 44, 50, 10, 9, 115, + 45, 50, 45, 48, 46, 56, 57, 55, 45, 50, 45, 50, 115, 48, 46, 56, 57, 55, 45, 50, 44, 50, 45, + 50, 83, 52, 55, 44, 51, 57, 46, 56, 57, 55, 44, 52, 55, 44, 52, 49, 122, 32, 77, 52, 57, 44, + 49, 48, 99, 45, 50, 46, 50, 48, 54, 44, 48, 45, 52, 45, 49, 46, 55, 57, 52, 45, 52, 45, 52, + 115, 49, 46, 55, 57, 52, 45, 52, 44, 52, 45, 52, 115, 52, 44, 49, 46, 55, 57, 52, 44, 52, 44, + 52, 83, 53, 49, 46, 50, 48, 54, 44, 49, 48, 44, 52, 57, 44, 49, 48, 122, 34, 62, 60, 47, 112, + 97, 116, 104, 62, 60, 47, 115, 118, 103, 62, 60, 47, 100, 105, 118, 62, 60, 100, 105, 118, 32, + 105, 100, 61, 34, 103, 108, 111, 98, 97, 108, 45, 103, 114, 97, 112, 104, 45, 111, 117, 116, + 101, 114, 34, 62, 60, 100, 105, 118, 32, 105, 100, 61, 34, 103, 108, 111, 98, 97, 108, 45, 103, + 114, 97, 112, 104, 45, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 32, 100, 97, 116, 97, 45, + 99, 102, 103, 61, 34, 123, 38, 113, 117, 111, 116, 59, 100, 114, 97, 103, 38, 113, 117, 111, + 116, 59, 58, 116, 114, 117, 101, 44, 38, 113, 117, 111, 116, 59, 122, 111, 111, 109, 38, 113, + 117, 111, 116, 59, 58, 116, 114, 117, 101, 44, 38, 113, 117, 111, 116, 59, 100, 101, 112, 116, + 104, 38, 113, 117, 111, 116, 59, 58, 45, 49, 44, 38, 113, 117, 111, 116, 59, 115, 99, 97, 108, + 101, 38, 113, 117, 111, 116, 59, 58, 48, 46, 57, 44, 38, 113, 117, 111, 116, 59, 114, 101, 112, + 101, 108, 70, 111, 114, 99, 101, 38, 113, 117, 111, 116, 59, 58, 48, 46, 53, 44, 38, 113, 117, + 111, 116, 59, 99, 101, 110, 116, 101, 114, 70, 111, 114, 99, 101, 38, 113, 117, 111, 116, 59, + 58, 48, 46, 51, 44, 38, 113, 117, 111, 116, 59, 108, 105, 110, 107, 68, 105, 115, 116, 97, 110, + 99, 101, 38, 113, 117, 111, 116, 59, 58, 51, 48, 44, 38, 113, 117, 111, 116, 59, 102, 111, 110, + 116, 83, 105, 122, 101, 38, 113, 117, 111, 116, 59, 58, 48, 46, 54, 44, 38, 113, 117, 111, 116, + 59, 111, 112, 97, 99, 105, 116, 121, 83, 99, 97, 108, 101, 38, 113, 117, 111, 116, 59, 58, 49, + 44, 38, 113, 117, 111, 116, 59, 115, 104, 111, 119, 84, 97, 103, 115, 38, 113, 117, 111, 116, + 59, 58, 116, 114, 117, 101, 44, 38, 113, 117, 111, 116, 59, 114, 101, 109, 111, 118, 101, 84, + 97, 103, 115, 38, 113, 117, 111, 116, 59, 58, 91, 93, 44, 38, 113, 117, 111, 116, 59, 102, 111, + 99, 117, 115, 79, 110, 72, 111, 118, 101, 114, 38, 113, 117, 111, 116, 59, 58, 116, 114, 117, + 101, 125, 34, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, + 62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 98, 97, 99, 107, 108, 105, 110, 107, + 115, 34, 62, 60, 104, 51, 62, 66, 97, 99, 107, 108, 105, 110, 107, 115, 60, 47, 104, 51, 62, + 60, 117, 108, 32, 99, 108, 97, 115, 115, 61, 34, 111, 118, 101, 114, 102, 108, 111, 119, 34, + 62, 60, 108, 105, 62, 78, 111, 32, 98, 97, 99, 107, 108, 105, 110, 107, 115, 32, 102, 111, 117, + 110, 100, 60, 47, 108, 105, 62, 60, 47, 117, 108, 62, 60, 47, 100, 105, 118, 62, 60, 47, 100, + 105, 118, 62, 60, 47, 100, 105, 118, 62, 60, 102, 111, 111, 116, 101, 114, 32, 99, 108, 97, + 115, 115, 62, 60, 112, 62, 67, 114, 101, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 60, 97, + 32, 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 113, 117, 97, 114, 116, + 122, 46, 106, 122, 104, 97, 111, 46, 120, 121, 122, 47, 34, 62, 81, 117, 97, 114, 116, 122, 32, + 118, 52, 46, 51, 46, 48, 60, 47, 97, 62, 32, 194, 169, 32, 50, 48, 50, 52, 60, 47, 112, 62, 60, + 117, 108, 62, 60, 108, 105, 62, 60, 97, 32, 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, + 115, 58, 47, 47, 103, 105, 116, 104, 117, 98, 46, 99, 111, 109, 47, 106, 97, 99, 107, 121, 122, + 104, 97, 48, 47, 113, 117, 97, 114, 116, 122, 34, 62, 71, 105, 116, 72, 117, 98, 60, 47, 97, + 62, 60, 47, 108, 105, 62, 60, 108, 105, 62, 60, 97, 32, 104, 114, 101, 102, 61, 34, 104, 116, + 116, 112, 115, 58, 47, 47, 100, 105, 115, 99, 111, 114, 100, 46, 103, 103, 47, 99, 82, 70, 70, + 72, 89, 121, 101, 55, 116, 34, 62, 68, 105, 115, 99, 111, 114, 100, 32, 67, 111, 109, 109, 117, + 110, 105, 116, 121, 60, 47, 97, 62, 60, 47, 108, 105, 62, 60, 47, 117, 108, 62, 60, 47, 102, + 111, 111, 116, 101, 114, 62, 60, 47, 100, 105, 118, 62, 60, 47, 98, 111, 100, 121, 62, 60, 115, + 99, 114, 105, 112, 116, 32, 116, 121, 112, 101, 61, 34, 97, 112, 112, 108, 105, 99, 97, 116, + 105, 111, 110, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 102, 117, 110, 99, + 116, 105, 111, 110, 32, 99, 40, 41, 123, 108, 101, 116, 32, 116, 61, 116, 104, 105, 115, 46, + 112, 97, 114, 101, 110, 116, 69, 108, 101, 109, 101, 110, 116, 59, 116, 46, 99, 108, 97, 115, + 115, 76, 105, 115, 116, 46, 116, 111, 103, 103, 108, 101, 40, 34, 105, 115, 45, 99, 111, 108, + 108, 97, 112, 115, 101, 100, 34, 41, 59, 108, 101, 116, 32, 108, 61, 116, 46, 99, 108, 97, 115, + 115, 76, 105, 115, 116, 46, 99, 111, 110, 116, 97, 105, 110, 115, 40, 34, 105, 115, 45, 99, + 111, 108, 108, 97, 112, 115, 101, 100, 34, 41, 63, 116, 104, 105, 115, 46, 115, 99, 114, 111, + 108, 108, 72, 101, 105, 103, 104, 116, 58, 116, 46, 115, 99, 114, 111, 108, 108, 72, 101, 105, + 103, 104, 116, 59, 116, 46, 115, 116, 121, 108, 101, 46, 109, 97, 120, 72, 101, 105, 103, 104, + 116, 61, 108, 43, 34, 112, 120, 34, 59, 108, 101, 116, 32, 111, 61, 116, 44, 101, 61, 116, 46, + 112, 97, 114, 101, 110, 116, 69, 108, 101, 109, 101, 110, 116, 59, 102, 111, 114, 40, 59, 101, + 59, 41, 123, 105, 102, 40, 33, 101, 46, 99, 108, 97, 115, 115, 76, 105, 115, 116, 46, 99, 111, + 110, 116, 97, 105, 110, 115, 40, 34, 99, 97, 108, 108, 111, 117, 116, 34, 41, 41, 114, 101, + 116, 117, 114, 110, 59, 108, 101, 116, 32, 110, 61, 101, 46, 99, 108, 97, 115, 115, 76, 105, + 115, 116, 46, 99, 111, 110, 116, 97, 105, 110, 115, 40, 34, 105, 115, 45, 99, 111, 108, 108, + 97, 112, 115, 101, 100, 34, 41, 63, 101, 46, 115, 99, 114, 111, 108, 108, 72, 101, 105, 103, + 104, 116, 58, 101, 46, 115, 99, 114, 111, 108, 108, 72, 101, 105, 103, 104, 116, 43, 111, 46, + 115, 99, 114, 111, 108, 108, 72, 101, 105, 103, 104, 116, 59, 101, 46, 115, 116, 121, 108, 101, + 46, 109, 97, 120, 72, 101, 105, 103, 104, 116, 61, 110, 43, 34, 112, 120, 34, 44, 111, 61, 101, + 44, 101, 61, 101, 46, 112, 97, 114, 101, 110, 116, 69, 108, 101, 109, 101, 110, 116, 125, 125, + 102, 117, 110, 99, 116, 105, 111, 110, 32, 105, 40, 41, 123, 108, 101, 116, 32, 116, 61, 100, + 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, + 121, 67, 108, 97, 115, 115, 78, 97, 109, 101, 40, 34, 99, 97, 108, 108, 111, 117, 116, 32, 105, + 115, 45, 99, 111, 108, 108, 97, 112, 115, 105, 98, 108, 101, 34, 41, 59, 102, 111, 114, 40, + 108, 101, 116, 32, 115, 32, 111, 102, 32, 116, 41, 123, 108, 101, 116, 32, 108, 61, 115, 46, + 102, 105, 114, 115, 116, 69, 108, 101, 109, 101, 110, 116, 67, 104, 105, 108, 100, 59, 105, + 102, 40, 108, 41, 123, 108, 46, 97, 100, 100, 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, + 110, 101, 114, 40, 34, 99, 108, 105, 99, 107, 34, 44, 99, 41, 44, 119, 105, 110, 100, 111, 119, + 46, 97, 100, 100, 67, 108, 101, 97, 110, 117, 112, 40, 40, 41, 61, 62, 108, 46, 114, 101, 109, + 111, 118, 101, 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, 110, 101, 114, 40, 34, 99, 108, + 105, 99, 107, 34, 44, 99, 41, 41, 59, 108, 101, 116, 32, 101, 61, 115, 46, 99, 108, 97, 115, + 115, 76, 105, 115, 116, 46, 99, 111, 110, 116, 97, 105, 110, 115, 40, 34, 105, 115, 45, 99, + 111, 108, 108, 97, 112, 115, 101, 100, 34, 41, 63, 108, 46, 115, 99, 114, 111, 108, 108, 72, + 101, 105, 103, 104, 116, 58, 115, 46, 115, 99, 114, 111, 108, 108, 72, 101, 105, 103, 104, 116, + 59, 115, 46, 115, 116, 121, 108, 101, 46, 109, 97, 120, 72, 101, 105, 103, 104, 116, 61, 101, + 43, 34, 112, 120, 34, 125, 125, 125, 100, 111, 99, 117, 109, 101, 110, 116, 46, 97, 100, 100, + 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, 110, 101, 114, 40, 34, 110, 97, 118, 34, 44, + 105, 41, 59, 119, 105, 110, 100, 111, 119, 46, 97, 100, 100, 69, 118, 101, 110, 116, 76, 105, + 115, 116, 101, 110, 101, 114, 40, 34, 114, 101, 115, 105, 122, 101, 34, 44, 105, 41, 59, 10, + 60, 47, 115, 99, 114, 105, 112, 116, 62, 60, 115, 99, 114, 105, 112, 116, 32, 116, 121, 112, + 101, 61, 34, 109, 111, 100, 117, 108, 101, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 108, 101, 116, 32, 109, 101, 114, 109, 97, 105, 100, 73, 109, 112, 111, 114, 116, 32, 61, 32, + 117, 110, 100, 101, 102, 105, 110, 101, 100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 100, + 111, 99, 117, 109, 101, 110, 116, 46, 97, 100, 100, 69, 118, 101, 110, 116, 76, 105, 115, 116, + 101, 110, 101, 114, 40, 39, 110, 97, 118, 39, 44, 32, 97, 115, 121, 110, 99, 32, 40, 41, 32, + 61, 62, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 100, + 111, 99, 117, 109, 101, 110, 116, 46, 113, 117, 101, 114, 121, 83, 101, 108, 101, 99, 116, 111, + 114, 40, 34, 99, 111, 100, 101, 46, 109, 101, 114, 109, 97, 105, 100, 34, 41, 41, 32, 123, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 109, 101, 114, 109, 97, 105, 100, 73, + 109, 112, 111, 114, 116, 32, 124, 124, 61, 32, 97, 119, 97, 105, 116, 32, 105, 109, 112, 111, + 114, 116, 40, 39, 104, 116, 116, 112, 115, 58, 47, 47, 99, 100, 110, 106, 115, 46, 99, 108, + 111, 117, 100, 102, 108, 97, 114, 101, 46, 99, 111, 109, 47, 97, 106, 97, 120, 47, 108, 105, + 98, 115, 47, 109, 101, 114, 109, 97, 105, 100, 47, 49, 48, 46, 55, 46, 48, 47, 109, 101, 114, + 109, 97, 105, 100, 46, 101, 115, 109, 46, 109, 105, 110, 46, 109, 106, 115, 39, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, 115, 116, 32, 109, 101, 114, 109, + 97, 105, 100, 32, 61, 32, 109, 101, 114, 109, 97, 105, 100, 73, 109, 112, 111, 114, 116, 46, + 100, 101, 102, 97, 117, 108, 116, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 99, 111, 110, 115, 116, 32, 100, 97, 114, 107, 77, 111, 100, 101, 32, 61, 32, 100, 111, 99, + 117, 109, 101, 110, 116, 46, 100, 111, 99, 117, 109, 101, 110, 116, 69, 108, 101, 109, 101, + 110, 116, 46, 103, 101, 116, 65, 116, 116, 114, 105, 98, 117, 116, 101, 40, 39, 115, 97, 118, + 101, 100, 45, 116, 104, 101, 109, 101, 39, 41, 32, 61, 61, 61, 32, 39, 100, 97, 114, 107, 39, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 109, 101, 114, 109, 97, 105, 100, + 46, 105, 110, 105, 116, 105, 97, 108, 105, 122, 101, 40, 123, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 116, 97, 114, 116, 79, 110, 76, 111, 97, 100, 58, 32, + 102, 97, 108, 115, 101, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 115, 101, 99, 117, 114, 105, 116, 121, 76, 101, 118, 101, 108, 58, 32, 39, 108, 111, 111, 115, + 101, 39, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 104, 101, + 109, 101, 58, 32, 100, 97, 114, 107, 77, 111, 100, 101, 32, 63, 32, 39, 100, 97, 114, 107, 39, + 32, 58, 32, 39, 100, 101, 102, 97, 117, 108, 116, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 125, 41, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 97, 119, 97, 105, 116, 32, 109, 101, 114, 109, 97, 105, 100, 46, 114, 117, 110, 40, 123, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 113, 117, 101, 114, 121, 83, + 101, 108, 101, 99, 116, 111, 114, 58, 32, 39, 46, 109, 101, 114, 109, 97, 105, 100, 39, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 60, 47, 115, 99, 114, 105, 112, 116, 62, 60, 115, 99, 114, 105, + 112, 116, 32, 115, 114, 99, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 99, 100, 110, 106, + 115, 46, 99, 108, 111, 117, 100, 102, 108, 97, 114, 101, 46, 99, 111, 109, 47, 97, 106, 97, + 120, 47, 108, 105, 98, 115, 47, 75, 97, 84, 101, 88, 47, 48, 46, 49, 54, 46, 57, 47, 99, 111, + 110, 116, 114, 105, 98, 47, 99, 111, 112, 121, 45, 116, 101, 120, 46, 109, 105, 110, 46, 106, + 115, 34, 32, 116, 121, 112, 101, 61, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, + 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, + 62, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 46, 47, 112, 111, 115, 116, 115, + 99, 114, 105, 112, 116, 46, 106, 115, 34, 32, 116, 121, 112, 101, 61, 34, 109, 111, 100, 117, + 108, 101, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 60, 47, 104, 116, 109, 108, 62, +]; + +pub const FINAL_PAYLOAD: &[u8] = &[ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, 84, 84, 80, 32, 69, 120, + 99, 104, 97, 110, 103, 101, 32, 49, 32, 98, 51, 0, 32, 113, 27, 241, 58, 31, 4, 102, 90, 232, + 109, 133, 107, 218, 217, 250, 141, 171, 225, 77, 236, 114, 61, 4, 214, 49, 199, 181, 56, 175, + 94, 52, 58, 0, 0, 0, 0, 0, 0, 0, 52, 104, 116, 116, 112, 115, 58, 47, 47, 98, 108, 111, 103, + 46, 99, 114, 101, 109, 97, 46, 115, 104, 47, 99, 100, 110, 45, 102, 112, 119, 47, 115, 120, + 103, 47, 118, 97, 108, 105, 100, 46, 109, 115, 103, 46, 118, 97, 108, 105, 100, 105, 116, 121, + 0, 0, 0, 0, 102, 238, 255, 242, 0, 0, 0, 0, 102, 239, 16, 90, 0, 0, 0, 0, 0, 0, 0, 22, 104, + 116, 116, 112, 115, 58, 47, 47, 98, 108, 111, 103, 46, 99, 114, 101, 109, 97, 46, 115, 104, 47, + 0, 0, 0, 0, 0, 0, 2, 156, 182, 67, 97, 103, 101, 65, 48, 67, 118, 105, 97, 75, 49, 46, 49, 32, + 118, 97, 114, 110, 105, 115, 104, 68, 100, 97, 116, 101, 88, 29, 83, 97, 116, 44, 32, 50, 49, + 32, 83, 101, 112, 32, 50, 48, 50, 52, 32, 49, 56, 58, 49, 56, 58, 52, 50, 32, 71, 77, 84, 68, + 118, 97, 114, 121, 79, 65, 99, 99, 101, 112, 116, 45, 69, 110, 99, 111, 100, 105, 110, 103, 70, + 99, 102, 45, 114, 97, 121, 84, 56, 99, 54, 99, 48, 102, 50, 100, 52, 50, 101, 49, 99, 101, 56, + 100, 45, 83, 73, 78, 70, 100, 105, 103, 101, 115, 116, 88, 57, 109, 105, 45, 115, 104, 97, 50, + 53, 54, 45, 48, 51, 61, 57, 50, 104, 47, 80, 76, 51, 84, 77, 100, 82, 67, 103, 48, 82, 97, 100, + 43, 79, 50, 65, 110, 53, 106, 84, 100, 71, 116, 70, 89, 106, 85, 76, 90, 105, 70, 83, 76, 55, + 70, 65, 48, 89, 61, 70, 115, 101, 114, 118, 101, 114, 74, 99, 108, 111, 117, 100, 102, 108, 97, + 114, 101, 71, 58, 115, 116, 97, 116, 117, 115, 67, 50, 48, 48, 71, 101, 120, 112, 105, 114, + 101, 115, 88, 29, 83, 97, 116, 44, 32, 50, 49, 32, 83, 101, 112, 32, 50, 48, 50, 52, 32, 49, + 53, 58, 49, 57, 58, 53, 50, 32, 71, 77, 84, 71, 120, 45, 99, 97, 99, 104, 101, 67, 72, 73, 84, + 71, 120, 45, 116, 105, 109, 101, 114, 88, 28, 83, 49, 55, 50, 54, 57, 52, 50, 55, 50, 50, 46, + 49, 51, 55, 48, 49, 52, 44, 86, 83, 48, 44, 86, 69, 50, 51, 52, 75, 120, 45, 115, 101, 114, + 118, 101, 100, 45, 98, 121, 81, 99, 97, 99, 104, 101, 45, 113, 112, 103, 49, 50, 51, 53, 45, + 81, 80, 71, 76, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 88, 24, 116, 101, + 120, 116, 47, 104, 116, 109, 108, 59, 32, 99, 104, 97, 114, 115, 101, 116, 61, 117, 116, 102, + 45, 56, 76, 120, 45, 99, 97, 99, 104, 101, 45, 104, 105, 116, 115, 65, 48, 77, 99, 97, 99, 104, + 101, 45, 99, 111, 110, 116, 114, 111, 108, 75, 109, 97, 120, 45, 97, 103, 101, 61, 54, 48, 48, + 77, 108, 97, 115, 116, 45, 109, 111, 100, 105, 102, 105, 101, 100, 88, 29, 84, 117, 101, 44, + 32, 48, 51, 32, 83, 101, 112, 32, 50, 48, 50, 52, 32, 48, 57, 58, 50, 48, 58, 49, 54, 32, 71, + 77, 84, 77, 120, 45, 112, 114, 111, 120, 121, 45, 99, 97, 99, 104, 101, 68, 77, 73, 83, 83, 79, + 99, 102, 45, 99, 97, 99, 104, 101, 45, 115, 116, 97, 116, 117, 115, 71, 68, 89, 78, 65, 77, 73, + 67, 80, 99, 111, 110, 116, 101, 110, 116, 45, 101, 110, 99, 111, 100, 105, 110, 103, 76, 109, + 105, 45, 115, 104, 97, 50, 53, 54, 45, 48, 51, 83, 120, 45, 102, 97, 115, 116, 108, 121, 45, + 114, 101, 113, 117, 101, 115, 116, 45, 105, 100, 88, 40, 55, 102, 50, 53, 100, 100, 55, 98, 49, + 50, 54, 54, 50, 102, 52, 56, 57, 50, 97, 53, 57, 50, 51, 48, 56, 50, 57, 57, 51, 48, 51, 52, + 53, 98, 48, 99, 52, 55, 99, 49, 83, 120, 45, 103, 105, 116, 104, 117, 98, 45, 114, 101, 113, + 117, 101, 115, 116, 45, 105, 100, 88, 32, 55, 56, 67, 50, 58, 51, 65, 57, 49, 53, 54, 58, 69, + 50, 70, 53, 54, 58, 70, 48, 54, 70, 49, 58, 54, 54, 69, 69, 69, 49, 67, 48, 88, 27, 97, 99, 99, + 101, 115, 115, 45, 99, 111, 110, 116, 114, 111, 108, 45, 97, 108, 108, 111, 119, 45, 111, 114, + 105, 103, 105, 110, 65, 42, +]; diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 9b880ed..2d25146 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -1,3 +1,6 @@ +pub mod constants; +pub mod sxg; + use alloy_sol_types::sol; use p256::ecdsa::{signature::Verifier, Signature, VerifyingKey}; use sha2::{Digest, Sha256}; @@ -43,8 +46,31 @@ pub fn verify_ecdsa_p256_signature( Ok(verifying_key.verify(message, &signature).is_ok()) } +pub fn verify_ecdsa_p256_r_s( + message: &[u8], + r: &[u8; 32], + s: &[u8; 32], + px: &[u8; 32], + py: &[u8; 32], +) -> Result> { + let mut signature_bytes = [0u8; 64]; + signature_bytes[..32].copy_from_slice(r); + signature_bytes[32..].copy_from_slice(s); + let signature = Signature::from_slice(&signature_bytes)?; + + let mut public_key_bytes = [4u8; 65]; + public_key_bytes[1..33].copy_from_slice(px); + public_key_bytes[33..].copy_from_slice(py); + + let verifying_key = VerifyingKey::from_sec1_bytes(&public_key_bytes)?; + + Ok(verifying_key.verify(message, &signature).is_ok()) +} + #[cfg(test)] mod tests { + use constants::FINAL_PAYLOAD; + use super::*; #[test] @@ -57,4 +83,36 @@ mod tests { let result = verify_ecdsa_p256_signature(message, signature_hex, public_key_hex); assert!(result.unwrap()); } + + #[test] + fn test_verify_ecdsa_p256_r_s() { + let px1 = "45E3943B0705F9EF69B53A4EFB8C668E6A9F90124E9BCF917662CFADEA56C0C1"; + let py1 = "F3703834F92F6FE70A004BA4098D079BFB5F927E042991EFD5A1572E8F9D39D6"; + + let r1 = "9970818CBCA38C196795EEAD295BDED48311702DF7DDB0C2BB448276894C393D"; + let s1 = "729B2F9229D545A553F0F7CBC1792E9A6185E539DBF667FE5BC38D673D90C014"; + + let r: [u8; 32] = hex::decode(r1).unwrap().try_into().unwrap(); + let s: [u8; 32] = hex::decode(s1).unwrap().try_into().unwrap(); + let px: [u8; 32] = hex::decode(px1).unwrap().try_into().unwrap(); + let py: [u8; 32] = hex::decode(py1).unwrap().try_into().unwrap(); + + let result0 = verify_ecdsa_p256_r_s(FINAL_PAYLOAD, &r, &s, &px, &py).unwrap(); + assert!(result0); + + let r_hex = "6a7570a91dd49c4ff738efd81ceaadbf89daad02611d184e276906eeb3671225"; + let s_hex = "4ff40cda556ed67ef04b3933e2e92830b6cfae684da605f07f779fad78945e22"; + let px_hex = "57be97dd389c893d7271a1fe7546aaf09074aba40779d19c21c00832bc3f821a"; + let py_hex = "dd286faf7beb2f0722050169d89ae7fe0b02e8b8bea4c5141b188ff678e6d8bf"; + let message1 = + b"ECDSA proves knowledge of a secret number in the context of a single message"; + + let r: [u8; 32] = hex::decode(r_hex).unwrap().try_into().unwrap(); + let s: [u8; 32] = hex::decode(s_hex).unwrap().try_into().unwrap(); + let px: [u8; 32] = hex::decode(px_hex).unwrap().try_into().unwrap(); + let py: [u8; 32] = hex::decode(py_hex).unwrap().try_into().unwrap(); + + let result1 = verify_ecdsa_p256_r_s(message1, &r, &s, &px, &py).unwrap(); + assert!(result1); + } } diff --git a/lib/src/sxg.rs b/lib/src/sxg.rs new file mode 100644 index 0000000..5ea0f44 --- /dev/null +++ b/lib/src/sxg.rs @@ -0,0 +1,151 @@ +use crate::{sha256_hash, verify_ecdsa_p256_r_s}; + +pub struct SXGInput { + pub final_payload: Vec, + pub data_to_verify: Vec, + pub data_to_verify_start_index: usize, + pub integrity_start_index: usize, + pub payload: Vec, + pub r: [u8; 32], + pub s: [u8; 32], + pub px: [u8; 32], + pub py: [u8; 32], +} + +fn calculate_integrity(input: &[u8], record_size: usize) -> [u8; 32] { + if input.is_empty() { + return sha256_hash(&[]); + } + + let actual_record_size = record_size.min(input.len()); + let mut records: Vec<&[u8]> = Vec::new(); + let mut i = 0; + + while i < input.len() { + let chunk_size = (i + actual_record_size).min(input.len()) - i; + records.push(&input[i..i + chunk_size]); + i += actual_record_size; + } + + let mut proofs: Vec<[u8; 32]> = Vec::new(); + for record in records.into_iter().rev() { + let mut to_hash = Vec::from(record); + if !proofs.is_empty() { + to_hash.extend_from_slice(&proofs[0]); + to_hash.push(1); + } else { + to_hash.push(0); + } + let hash_result = sha256_hash(&to_hash); + proofs.insert(0, hash_result); + } + + proofs[0] +} + +fn base64_encode_mice(input: &[u8]) -> String { + let base64_chars: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + let mut result = String::from("mi-sha256-03="); + let mut i = 0; + + while i < input.len() { + let n = if i + 3 <= input.len() { + ((input[i] as u32) << 16) | ((input[i + 1] as u32) << 8) | (input[i + 2] as u32) + } else if i + 2 == input.len() { + ((input[i] as u32) << 16) | ((input[i + 1] as u32) << 8) + } else { + (input[i] as u32) << 16 + }; + + result.push(base64_chars[((n >> 18) & 63) as usize] as char); + result.push(base64_chars[((n >> 12) & 63) as usize] as char); + + if i + 1 < input.len() { + result.push(base64_chars[((n >> 6) & 63) as usize] as char); + } else { + result.push('='); + } + + if i + 2 < input.len() { + result.push(base64_chars[(n & 63) as usize] as char); + } else { + result.push('='); + } + + i += 3; + } + + result +} + +pub fn sxg_verify(input: SXGInput) -> Result> { + let SXGInput { + final_payload, + data_to_verify, + data_to_verify_start_index, + integrity_start_index, + payload, + r, + s, + px, + py, + } = input; + + if payload[data_to_verify_start_index..data_to_verify_start_index + data_to_verify.len()] + != data_to_verify + { + return Ok(false); + } + + let mice = base64_encode_mice(&calculate_integrity(&payload, 16384)); + let mice_bytes = mice.as_bytes(); + + if final_payload[integrity_start_index..integrity_start_index + mice_bytes.len()] + != mice_bytes[..] + { + return Ok(false); + } + + Ok(verify_ecdsa_p256_r_s(&final_payload, &r, &s, &px, &py).is_ok()) +} + +#[cfg(test)] +mod tests { + use crate::constants::{DATA_TO_VERIFY, FINAL_PAYLOAD, PAYLOAD}; + + #[test] + fn test_sxg() { + let final_payload = FINAL_PAYLOAD; + let data_to_verify = DATA_TO_VERIFY; + let payload = PAYLOAD; + + let data_to_verify_start_index = 0; + let integrity_start_index = 694 / 2; + + let px = "45E3943B0705F9EF69B53A4EFB8C668E6A9F90124E9BCF917662CFADEA56C0C1"; + let py = "F3703834F92F6FE70A004BA4098D079BFB5F927E042991EFD5A1572E8F9D39D6"; + + let r = "9970818CBCA38C196795EEAD295BDED48311702DF7DDB0C2BB448276894C393D"; + let s = "729B2F9229D545A553F0F7CBC1792E9A6185E539DBF667FE5BC38D673D90C014"; + + let r = hex::decode(r).unwrap(); + let s = hex::decode(s).unwrap(); + + let px = hex::decode(px).unwrap(); + let py = hex::decode(py).unwrap(); + + let input = super::SXGInput { + final_payload: final_payload.to_vec(), + data_to_verify: data_to_verify.to_vec(), + data_to_verify_start_index, + integrity_start_index, + payload: payload.to_vec(), + r: r.try_into().unwrap(), + s: s.try_into().unwrap(), + px: px.try_into().unwrap(), + py: py.try_into().unwrap(), + }; + + assert!(super::sxg_verify(input).unwrap()); + } +} diff --git a/program/Cargo.toml b/program/Cargo.toml index bcdccd9..94ed674 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" alloy-sol-types = { workspace = true } sp1-zkvm = "2.0.0" fibonacci-lib = { path = "../lib" } +hex = "0.4.3" diff --git a/program/src/main.rs b/program/src/main.rs index a4b3d99..98235ab 100644 --- a/program/src/main.rs +++ b/program/src/main.rs @@ -9,8 +9,11 @@ sp1_zkvm::entrypoint!(main); use alloy_sol_types::SolType; -use fibonacci_lib::{fibonacci, sha256_hash, verify_ecdsa_p256_signature, PublicValuesStruct}; +use fibonacci_lib::constants::{DATA_TO_VERIFY, FINAL_PAYLOAD, PAYLOAD}; +use fibonacci_lib::sxg::{sxg_verify, SXGInput}; +use fibonacci_lib::{fibonacci, sha256_hash, verify_ecdsa_p256_signature, PublicValuesStruct}; +use hex; pub fn main() { // Read an input to the program. // @@ -19,15 +22,40 @@ pub fn main() { let n = sp1_zkvm::io::read::(); - let sha256_hash = sha256_hash(&[1, 11]); + let (a, b) = fibonacci(n); - let message = b"ECDSA proves knowledge of a secret number in the context of a single message"; - let public_key_hex = "0457be97dd389c893d7271a1fe7546aaf09074aba40779d19c21c00832bc3f821add286faf7beb2f0722050169d89ae7fe0b02e8b8bea4c5141b188ff678e6d8bf"; - let signature_hex = "6a7570a91dd49c4ff738efd81ceaadbf89daad02611d184e276906eeb36712254ff40cda556ed67ef04b3933e2e92830b6cfae684da605f07f779fad78945e22"; + let final_payload = FINAL_PAYLOAD; + let data_to_verify = DATA_TO_VERIFY; + let payload = PAYLOAD; - let result = verify_ecdsa_p256_signature(message, signature_hex, public_key_hex); + let data_to_verify_start_index = 0; + let integrity_start_index = 694 / 2; - let (a, b) = fibonacci(n); + let px = "45E3943B0705F9EF69B53A4EFB8C668E6A9F90124E9BCF917662CFADEA56C0C1"; + let py = "F3703834F92F6FE70A004BA4098D079BFB5F927E042991EFD5A1572E8F9D39D6"; + + let r = "9970818CBCA38C196795EEAD295BDED48311702DF7DDB0C2BB448276894C393D"; + let s = "729B2F9229D545A553F0F7CBC1792E9A6185E539DBF667FE5BC38D673D90C014"; + + let r = hex::decode(r).unwrap(); + let s = hex::decode(s).unwrap(); + + let px = hex::decode(px).unwrap(); + let py = hex::decode(py).unwrap(); + + let input = SXGInput { + final_payload: final_payload.to_vec(), + data_to_verify: data_to_verify.to_vec(), + data_to_verify_start_index, + integrity_start_index, + payload: payload.to_vec(), + r: r.try_into().unwrap(), + s: s.try_into().unwrap(), + px: px.try_into().unwrap(), + py: py.try_into().unwrap(), + }; + + let result = sxg_verify(input).unwrap(); // Encode the public values of the program. let bytes = PublicValuesStruct::abi_encode(&PublicValuesStruct { n, a, b }); diff --git a/script/src/bin/main.rs b/script/src/bin/main.rs index 33089b1..b7fd998 100644 --- a/script/src/bin/main.rs +++ b/script/src/bin/main.rs @@ -33,7 +33,6 @@ struct Args { } fn main() { - // Setup the logger. sp1_sdk::utils::setup_logger(); // Parse the command line arguments. @@ -84,6 +83,10 @@ fn main() { println!("Successfully generated proof!"); + proof + .save("proof-with-io.json") + .expect("saving proof failed"); + // Verify the proof. client.verify(&proof, &vk).expect("failed to verify proof"); println!("Successfully verified proof!");