From 30cc846c6f2ebb4a39df55b777457e92c570a76d Mon Sep 17 00:00:00 2001 From: Dominik Roth Date: Tue, 21 Sep 2021 16:00:43 +0200 Subject: [PATCH] Sucessful discrimination; updated README --- README.md | 1 + discriminator.py | 4 +--- wh_discriminator.n | Bin 0 -> 27899 bytes 3 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 wh_discriminator.n diff --git a/README.md b/README.md index 2ff6260..ee7a1b4 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,4 @@ I made it because I want to try to break it. (Precisely: Show it does not provide semantic security, because it is not IND-CPA-secure) This will work iff I succeed in building a PPT-discriminator for sha256 from randomness As my first approach this discriminator will be based on an LSTM-network. +Update: This worked out way better than expected; given long enought sequences (128 Bytes are more than enough) we can discriminate successfully in 100% of cases. diff --git a/discriminator.py b/discriminator.py index 4c088f0..8039044 100644 --- a/discriminator.py +++ b/discriminator.py @@ -59,9 +59,7 @@ def train(model, seq_len=16*64): correct = round(y_pred.item()) == y ltLoss = ltLoss*0.9 + 0.1*loss.item() lltLoss = lltLoss*0.9 + 0.1*ltLoss - print({ 'epoch': epoch, 'loss': loss.item(), 'ltLoss': ltLoss, 'correct?': correct}) - if ltLoss < 0.20 and lltLoss < 0.225: - print("[*] Hell Yeah! Poccing! Got sup") + print({ 'epoch': epoch, 'loss': loss.item(), 'ltLoss': ltLoss, 'correct?': correct }) if epoch % 8 == 0: torch.save(model.state_dict(), 'model_savepoints/'+tid+'_'+str(epoch)+'.n') diff --git a/wh_discriminator.n b/wh_discriminator.n new file mode 100644 index 0000000000000000000000000000000000000000..660888001ef2743a7330971d8a30ab47149e9069 GIT binary patch literal 27899 zcmb@t2T&DV)9(wC6cG>+MS>tIpppbZg+0BHoRc|`B`D$sL{U+a1SKhw6h#FLCGfYd-fmLT5)!?8 zOZ>-2Swcl3FeW%WB0kh4Brq<}c+va?j*}E6X8z-o)GIhRdclIw;JAqBg|YHpF(IKb zp&|AW!Ey3J2}56@q`~z5V)TO8xG3W#p%G!>asCnE{tHZny@KPS#dKr;#c>e}V&(l~ zLW34ZEC}(B3tbo+9pfKAR$eG&U@%=yd~&S#pMhbaLg_!J$U82G4vh2rb5LF=GhI^r zA5)?1bSd$7@S?>+IS+|mal+m{ZW3sVX z%~A{(Uo~7h{14Sks1z=yNyiD5|In1vh5g->f74X{&<4Z_Regm6rz`!xP6kB;#{SDi zwSTb23I~PDxv@Cm;J;C;h3amStA#`UU^L={n!ZA&9QhBBg;4)rz8Uk(^gtL8xbN-F<$ELaee)3HrkcjuVFX z3PY#&5npj$@V|z!aNa)&V})U2f^wWN{5L_;O*~Q}{&*GnhcZ7-xWHE!_4kMtQ+|&V z;lh71%!ScnhGd*@(cg^KLg8;KV*Z>T8z+qO6)s+!D2)Hx691^sxWL~NlW@u3<9eyV zbg_LB!h}TOvcE499~u)Yo|J^k-6UhDizm6iCn4dAL}6n1--mt&a9*%*WukD^p98<= zkLbm5!lXoD^4~`m#|9aDyUF$D-Jg$d7ZZLr@BenfRFu&B$AoEO>NsiWzfG6_m^**} z*r5?d72_>gVfiC|_gWh!SUMQj>{!jpOGTtMZ;hzkMMyJ40?4Xu3Qg8eAy{x93nve! z4MuX*XG9KV%$?0*EgE6qtRiTBmH@+Vo`$H=y;xY80vo*a314bk!1H&WqtZ4*Oj%}$ zWvTmFn4}arNAwcC>{?6>r7Pjd;1TTD3k@^~>*T=5lyx*WLZ+#tNI$GM)6<(nM@P-3 zaan$}Y`YuP7kkpA6N6~KVgjA}D~gWkc{3T`Jodik1k70K$;`hiu)UW4Y|CsNHcyeU z2XQLo*S47M*rt(Ej1{TB%%&sHW)Yfip>3|_w6ZXS&MHcghBQ)Xt~D)xu1Qn2j-k&j z{f_t3I7rl8=>E*#fg(^Ou69nb38AoJTo zuY6Zv>_}&N+F3x8s*EV@gA(~Q&7-+_t+dl!~7NmOi3CpJIAD`mk1mAfd@ zZaD2tKM3!xUVudFp{!-j5GJy@4R;@#uoAnouyEZ;?(qdLx>l!86S+q?z0r);JZr?M z3U%l;Wja=km`vlOt?1&C7uYaarQ(GHisWLMc6j#?_QX7@{wudv+4pr0!9<4VA9v=w_Jyb7}yuE$Rw zk6>eI0qP#C#d~8)F>#Co=4Mu*DNDnzOUJXU%@bMq_b?c&H=Wh^xxvxRKR83zmoV{l zC2W4+fgkRVqHX*;)C)P!$GL68Je_ttm(+!pDr#hZNS{^t?St~y=1`iRViPkd6zsE9 zFsI&-J$6unDqkNw9;nEFP27z$r;kI;$eVn^P-S|i9D-BL4xp07PK+KOflr47;tZ8Z znC%9?0$<9?BM`cl z8Q1Wd{~5fuyg)ESbpTu%=D}{IDYB&%FQ7DbA2b|)40Gi!2tH@qVB@|bEQ+qf6Kk>r z3c51Xt12Bb)3H6E-Vbysz8(p;ra4E3?*71GWr88e( z#XM!EIO--OynG6KHp{WQ!KdIr#3?Y5Tn*nm6tG{yPEbr4#QKjL!0&x>1QN1apd;oo z4A8m>U)yiO(A66tfACT851a$-_QPOQdI|bxmqFkA5BZn{lThP$AogjNM{gA^sAVcN^dj2vZ>Cb?zx_O*p|F7_>>y9ASb2vL>nvP?irh|p-0kk-*&pZqCDZ@yE zB%&8!kjo(I6Cg(wJA|}uW&_UBm!loGL)h3s7oqj=Z1|9P7u2#!;K4p4Ci75@y*^XO z_od-i z`YyGfa#$8^`zwru3+}|A&Wakto)}j+cdllj>o$& zpAnbA;fw;CT|S4sd7{T$;;#xmoWFuA_fNvb6%m*eyA40B9!Np;yYQBFId1W21YDZL zU$vCvw@!F1xTUYh`A?UD;&f@W&+W~!z83KHef#3LBQ3lr^{3#;at~CxIg;KSKE!|a ze~KZ=a@2f!INg&SO=~nQsnTjcI@G3Xmf)nHiM~ zW8NEOVAqdjuq@DlFV)g#`b$Tla&$dbKWgUK;7{<=awKg@D`%IQ{9w)e$Jnc@P}Jou zO$sUM>;szvukVb2`7^e%gjrvp@#a%}Rp1U1TWy*aFDMoC4!@5dq?huox&^S&(G3c8 zfAE<-mayaeVB#iQkln=xxM-Rb)L&D@swa-jr2Yv=tkI$+^QB?qrz3bu#UH9moVgx- zdDi5YghsTXDL=r6RxRAm_g!E`!{aXEsvAbIpgKvUCn1lEmX~70yiv^Rn=M8g+Q2N? zK@?1<`T3P2*`rZ~@Yd`qAo~u}wKU;+VGS5$5aZa&rz=@CSOW;d|2)(W;5{`1vmm1ZyueiSB?%*31#^ zgq?({VdCe_>2!D;){Qu99u0Gm1B<@tY|pk{+^#p-G&WI-ty90pzbIOXA9Jp7Fw+O} z<|g1>VHnQ8)I|N%JjlJg7c2C(qRwH!yQi$+ULEbv+cu= ztPy?L^ceQ~^=~rm4rP&ctFignDzJGi3lE(9DCd(cevr7s^Btb-(X_*S%<)LNy#6G9 zn(+a{6RzRe!~Ia({xIA!w;|&T=eP+=%E12GL!5Fqk$TT380kBeWDZ_K2+zYIFZ%Kw zQhKOp(1h|o`@;Q-*Pt=J1iqYjFDS9H!)f%SPfdgOBm{GdWhf_8HH zTETpKQU+D{HiBL46o`|v;N$h{$$9z^>QJ{r_mwiNEPMlVi}1w-`pT$vT>^$@NC5V8 zp!v&UF?xX?vpk>3eL8my6Ar84*Sds=OFNI@EVGB-tUd}g9UdQo9S!_az3H$En zk0xcI;J@)T7@E$)S<`Cq!Ancrc=!Tnccbso{uiTA`qVy%S=5Z#bxC9|2&MPR1z2=CL7dB<6f&-NnWPDQg)$IjKN4aFsFSC8KJJsYfoG!^qom&x zu7AN}IIQ@T+mogRomX2ppNGddg_a6jyD_3E>+&Eb@o^j8sTxU11?>X<_C*jas^UZK zWSH>HG&m(uixyMs(8%Q|9=@T*3M&*aJy)0cTsy(f)lh)9rPttL@4e_d$_)d$J^8|Q zl5A~66{nahfhXce!@+QKtl?WQYLPRpkXFM3gIA$=wSy}L9!HPeEudhi$V?hSsQlGN zSRA8^X^tjru*!GA3xlCBdG2ohyUGx3J$(qD^&Zc6`ML_auV&z*mt&!|8@Tj~wRmis zIm-Rq1SeIW;j_0HT*Yn!a`RarGW=q}YU;h=&3A-nWh+^%*#l4-z8T%;K8E_?Pq^w~ zp9Qvq+PJy_0TBI04c&(fhQpy9{9hN3gK&2|-S!ObOmP^O-|PyDhnq6}^~X^D%t*d9VIx+kET>_a&Tz`mmZfB*iwZ7w;G?n$ zY@B+E=(A)!1Qy=o*5#f>ky$0S>`|bE9&7v(Y6q5Qtl(Gq1ulHc05)^yc04>n7p9wD z;z!%dvlSEL@R@UO#_v4NStVq{wW?y=DnFFnkb4YIgpc_hCHuJihYoyy--meM%o%9B zB!`zy-G-A#KZ@qfbt1V5wKy_X5yyweiKbXALGvZKZL%qfKp`A1QD{Y~`Sa1XV0CN|aV z*+LI2lelG5_OP`}jImH_Bd@wY6KxY~(Pl{#(E4uZl6nZcMk-TNNAs7bF$CSWsNN1P%0+|lD)TcLoiO+z|LMu!+`HS!8 zQO&6gxQfFq1EFcA5C5s%2_m?+=r8vO&UD=1uInXnJx7Y*^OB>2R5=Z>y*-#L6yxB@ z>mq#beT1{?yMij0*Kkki1=kpHjFX5Jvd{`;n%d_IcX@<7oTC=baLz#ZK4bzu?fHnO zgID07CMjm7y9VneC3&^>Fbua<$8)V~_!}+1V6N5_Ftj|+Z7(apL-vEXGTnjPvR^8A zU~>w;p!5lLwXYNXdd$HT&3hsmE(2PXWiae>DDU$1$mi~czjt1p2|9pJtn_! znrkFR2?t>Bhn0MN+-;oabCe5N)dmmW#zJ0=9m=^W;cazszyGjaR64x{X7n8m@%K}3 zsjQ*k)QkE2xTz_y@oWZnt@tlYoA&^&PIf|e7>K&8>C+GcX1Lo9<6gPKSe4zVpHj?U z3$NhR&$ohS&Jea@PD9hKuhVdf2Vm1uKX`ejnmaHqnJbvQ4tHNJhulLc_-*AzPGQ+W zP}MAI8eV=I4s?jnRyl(2UjGi?%u$2)Ul!m4qyCVfGm9H9a|-`@Sj-3AmVhMFtsuSe zJCKP2q`qAP&Q%KpGoS3?*uj3-F|{whx}*-{{xam=SO4PMg)(Scyp`AbSdHVUlG8t$ z2exUCIrcJ#e|4~e%iJ^^m9KYkovVNGrOU2!Ge!xx(Nm{k*xI3jeKV6WGdYNRz5FRR z>`sel*5G=6d0{Pn6-@;Wv}4pDJf&>$Q`J0xEUVpO2uLs8$MmGlRw%4%<|MbXzeA{ zaI2*dZih7BumQ_)sMj@g*FpZy_?h74b812$Axy zaDG$`lTfj;P|6Pak2;FaI@CD5kLF-2Qv&Ai zXJXnoH8$J07!nNPsAs4Na}3@kGCe+rj<4AxQjn^EyIMCu`QTADJNpB~elW#X>Q*eJ zY8RKE6oeY|PPE2zJ;r}6V1EAhVUDOjRd&_E<>OZ1e7~Ka@wzWf_*TsI?$m)LKa9X^ z>3+dAvnsgbyafZRLP@IM4Xiws*;KwSU+^LD8GN_f1oK9#U~utznCLYFxuA)dH_#Dv z-wtB_9zL|PJPp4u>&AvbHhhLr8l}2!!>&pRCSke@lNzVdmM<=_R9b_)6B9 z%;%BLytOcG@@ux-Pm6wDATlrU0OLk4&UDERS}b`QP7cn8(?0h(@2!34WP1Rf4b0=_ zg}vq49{SKIhb90eOXFzw-4}N%|1L+)o!%tkbO)&emAv-^$Ki87IjM#`2 z8@+y`=-Mi8UPeBdFWT}8tX_Ll*mown-anJyGIl?Xs!pN~eGgW4$%_s;1fa5|KgK#r zKvULHo4fD!;?{`05aq4M7Ime7kNp;0H{Dk>!}A(;Nj`vO4}566gb8Twu7ulFx|oo* z2Ul%cPr*00!Bl5Emake0rcc#C(QzWG`m3|S6a2{e*Lrqkhb^oenu)W{>0-KH4j=z= zKbJ0_Ny!!Y*xS`fyna$+DZW=QC%FnzF1mA__LY!%d?O50-H1l6>bOTf4rjP!!<&R8 zE+=Ut7+dS`8w^*&nD}%)y`eAXVHm)F__Y`W7e=FtS16{;?9ce{VN@nafp^ufv31{g zXgM>SBExo|L2wfPaoJK>rt%BVOy160R9@xg#yZm8d-?qMlLN>?(*$agTF7#|IUE8P z8>`vd;hB;LQ_Oe6s-h#PIMp2cu3{h&vOutX`YFD3Y%eIc*#lR1necDB?sBa^ySdH| z8BTid5pYhHByAr<-o)h|{?-rHobS3Ip)A%9#O=S=50oVA{!Kp+?@z%0YJcKCHZ1<_ zz&Pnb$_qF|+aG9BLgzG)H#>=DUp7!;?ntub+TmVM5_{-nPg6^m(2nch@Wg^MAhZ2C z8HW_23NN4{-4L21ULbb=%*9==of)UEg0p2-VDYG7Fnim8;|6|pnAgbLY<_Vc__OV} zq$w1Ft~FBV!vK0TUY{-{j$@zawF?&ga)$oNnwXY#3z>GaNPTq*uBe&Ac6axt<3Z~D z3&~V04Bm@-x1YkEy_)RIhM}ysZ-Z#xl00g=_!TWBmr%y9yCPK&WlTxrSg@@XX2`WN zklD+RvT>yY&ZQ(1aS5Hy<>MuJo;F-wK^O9i{?>1#--jtk{N98XxBs2^iv^tjW$hi2Y`m1l(P)Fdy8vdEyw_Gh^5aWxD$f1WN( z&q9kUK4j53pY|6CI7Nvy*eY$xTtj;J?57HNJ{3SaQsp?aJAig0{rExp7h$f~O;mH% zfW;FI(#xxJsByU+^_i{9UeC7U40(XyBdVwp^ANiV<3ta(#iPNmIjko@n!@s@ih6OW zIQ1A|R@);y%rx0wz0{bogsT8`GDtLBjwY3?py}u3c=vf;_-VKes|t@p9nm@Vc(pZJ zsCdx&VMVlg<`ooHRAbAjW;#`zL>bz}f5$)EW%m64N&LtDUx>e#_AYK|c{VKK#&Cze zzUAZ}?XwxjeE3rJ9NxqJ98N!T5Ed*wEJ`f&f%hYw;kLak%lhfW?T)$3#e6%={T{zQ zCs&s+argP%{&)J1`Tqs`yE7g6-!^m(w5t*CZc6-a|Gf>0VjKUzH6bSA5Ze47O(AEs zdU&hc1RA+z6O0HSL6L{w!0onlTG>#}zPIkB8+nN|Qf~wGDr*zDLkOMJUqT&&&NemQ z66@4@IpqDMkhSzRrUeM(A?-$MMo$6hmAz?tw>JxVqfKADpFnEi91I)z6}Ki8aSbc_ zlSjQY=@#|i1--$z?PDW&J<((i4IU)1cOHv9t;OW8IS39!kD;Cek*uI_KFFKMviM^bWlZo?D2^Dk-8(&G0JKFJjm)xM(5{=wXaw>sp# z;V!Dy^(L>?KlmH#-$7QI4m0TtrhvY&Y+jxciyOM1JNwFjuFRj!7FwsngTCVZm|;`d zh_>$_alo3bJ|9AlL|dVzRTi%W^rao2I0}#41L`%K(Pha_N-|5Kx-aESPU!_&<(hHJ z9+%MV+878NFXmwkMK9kV&>gcC+cT#B9Y2@IsyqLK_*wjppMuf{QCnv=7>sk}_qMIZ zwdHMG=9yf$|NSu-OD+NJ@U;{?wwphb-G}CUnvYV;yKrukc+W|4FwGR)!;axcaDsUl zGsXS6*Ne0amvRJC&3Ow=i0@p@8SGat{-xP?(}HTWz@lT;NP z*$F>Crgun(C0GB1)s}|vq;~*?E=*^=?N-5ncXlxI%0-M?I*^a(o50AoR$yqn2Xd{= zao(y=f^p)tK;WtxZf)*WG@IegjEs-sWtYvgCh84LO1nwdQcm+93L+^{sE+oy8&qZc zVATF|Fn1=wKuLKPw%u#un9Z6I>24Q zgmTAPvcRfysIKykpP?5-`+v5AH`W8reV zHa?9`raLMJQNF4HhNK>~`SfTA(>W2!rrs$6@1XnW;Qt2>4iE$oWSv!AX7Zg4ct5K4zOIJGTE?G-i6!@4 z>zC2g{7ZP<*qZT&`;p0|9B$ao9TYZAlX^Td*nz||SVgPBOJW;8Wy&oWD)~vEboC6> z9p8b@GxD&+WdoQkbRl&<25L&~gSqidQD=)4-T4+yW2MgW=gvjbHLX$f?f5Yp$s7wz zJbo7n{gyR)ZA@mi_p2Ik7hPMzp5D*rH~pH%^Ed19#;oCJF}@MoVk-FN-7#D*^E&MD9F4yWj)LW$ z+05jKG`CzwfLq=dz~c9p(0+g>HP3q~8Zlji*R{Ze6O%pHaV+rpl&4{+AZX&fAx2D;^b;F>uWX9iy5RMrY9+~_>^)AmPm$4b~& zyb#|f^<`ZNov1_xV8XtFy2WczUD5=4Jl=pUu%C-I%0}#l(lM+azZJD5kKo|qK)93e z2)h;;f!9+>3O)1!_75oKw4M%TFMb)5m76Sz9w@S@b^~ds%x362$^@OFOZc`_0pTux z+G?yw$!&LVl>TV?6)_DJW4}QmOM<=CJ;3*qXQJ~;crE4-_SPK>foZ+bTT>5`^lGRs zYNlw&lsp#UosL(H(_l~1ZoawIfa!Mm(PBp>HgESJzMptaGy6>$DlhDf?Kh_~^T^fc zGWS4}>A@9bQN5WJq1BPg&x0RD$M!93WAm#=rGlTYX3H{lYDQn-%4p7mvl8eN=>y;#pteu?`o ze}S(XuZl)Ew}8s^Trke4r${^izWP%MZbtLQtu8pG{}Rsf-AfLmKeI{frl_P{niMPm}#zxF`$%@*v2v; z%YeM@QJ$Om1TJRZ!}DW@z;mx=UZ@~L`KBQ-wjcxJCxoHy)~o#Z20NUQRt_UQa!HT9 zfEg?2Q@Q619O$%&n!InLl;S&Bm%auUMePBF@D#3V^EsB97fd=f2VsEU80I3i6urmJ zr*S*q^EVrd&~T|TJqj60U43e3VF(-EjHr2ua~j& z{&??sR{}n-kCCrk-)2>_3R5Mtwk&;2XH? z_-oXZdBGb#(qxSvW60{;OgdO<#-&T-vfD*zFwHid_(pryZf=d{>!U%nuM|vvvJY0QdCo12Q)R0Y2f?Rx>Tu#&3VNNH!2B)+}7n&f16&Zesp`ez!Gm$JCOU6c}>I=3HM^XEcGr~y&)5cCfi#xiDDQH8ZB%%gLH zbl#b1gsE|d4yUl|dkRre={{$#=0#mAd5E_@#b2G11__UyK~r%Qn|#=aP5z=v57ZPO z?@|X|TCB;9ZcwIu!byz(OOeSQJ_DO&Qk&BIt>Mjoh=6NL!ucEHQCf2c@6nw{-4ce_ z|5yNqY+rz<->EUxW;NcdYc^}{@x!^YOQCzKG7VjS29K0&piw20(7^ZzSFxv!E7+IM zb&9pMGdr_r@}(*4a-Ie2ksHX|wFA+pb~>AKDL_>9MV4jV{|Y)+&Tv~BGe~09V}RH= zcF_JA?`ymk!+WCPdZAm>){R-5*2pNq$?Z9CrYICbu1VWG2p`Oj*?d4O*WsqmszL9C zqaf5<4r3py!SHfR);xIz?0S8RgZsXG%+ds|E7Hf!yOaGGtlh!ztXCB7-;I(Ee^RUUf@>MFF#Eh-wh#o!4R-9nZPz;nkS@ z_6l^X1tB>1;VxH%Qg)RxOFioi2iOSqOssvG-?C(m&S!v)>&B=^Sq%Fr1!+;r+=(a; zHsePIZ!d3#qnu*|t2&o8jrogX9dbt4FHeH(r>wKa0CPGku6tPn?bsuKfD4(q8mo`3 zCcix6zsd_g!MT$7%+#GzLm4ZjZWSQcw$-Mecb$p@u2DXg*4qqzXG>sBJC$A`d zhY`oWp?S?E*ttCg)^rbMGa}DJ(b^p-JG5Ig+v7I&NMFasWgBqmts;J;_FZ(~i*fDN zN!-{dRrd8u1CEy+2-kg0slBxeYhS&^>B*-&VnqX$)I4}i>*b?9C= zfSa>u9NhTU!rj+7#dWj;y!)0eci~sG^A<7#ZsEWw2vQm}J&gTS`m zNyuL*M>$RU*kYKBUyr|s^KuBmLx;kSWhFTBvRJp( z@apU$=9Fy38upH2Q?G2~Tou-EYxQ4)j>S6gsT#oIQWWUxO${6{uz=J5Tm~x&w3ybM zL*T?tfw@*Gjg?GfZK%d}J05_dlS!Cs{0VQ>*t0Q94DjU2TjILFJ#;y;8ja>2WAkfA ziRyG_vQpVKkg?pJ6*xuEVxc@+SU(2zjhv`E$yHoSn#CdqdD4S7R}f1#qb7K>EVX(# zBI^zxuU$daC3kp_JtN3;)GCq6v}x>ZtUQ>s?8l1-FJW9*9sG(+VDZjHXg}4Gxx9*j ziaU<5WJC+T&8VhPS&Olk%46gPN@3<~1>$FSK-xeZ*m7|=d%12iD?1j&CN5k@cAJ*4 z!#B0q@Z075`enK_F>x;Idubnbob+YNXEoXObB^q@g)G}SAfD1xD}hrTLO%v=$5x+R z?1I4{nj4(U_%XZL!5aY(n7o60a091%pa--otGPR`*F%mM&mEiJ(`5N`6ct2$5xsam ziEOU&{JU|DqHmjJY4g=Gn8+z`5}SXB7E9mazS+8v`_wwpTi$}9Tg<6LD32v0-0_q0 zGA{S8MK%Q)SKy%aC_c~4h`DT2#~c+0c3}T}a9=Y7#%Ae|&E=zD|LX)yo3sT*%XZ=O zLB4{H6N|Y+vFG@Lt;6v23?H)Ulgs+1YcPie6=*&Nq0_4mD-JS&0(mvOFguS8k#iy= zBkv~dZ>?~)(v%$<@eq=uCsRYvXsSQI1-%-cplVwQDl6QByB~T{&e1x&cQk;TQtZX- z;WfX*asu}88wsY>=PkK`JGWC*lJ@*!HOUakZZ7}K9? zhHLPqZ7}on+lyN!ros~`9oGHS0k$5zh_|Oa;MV1+Fjvn$%t+%0F1Y!#$@g;)&V6o2 zAx7!U%TtdYwhp5oN_kYY{w%KTOk}Qehti_@uW%F)Bu{^W^3VI|qjWF!C_fM;X%C<) z3y;E=(!(Ove2%u841w!$Q}LXv5mR5jm;Yp}&F5^>rll8a@MJ_j?{@Y&Mvd#on#5~n zx8bk;*552wH+B54_4EJGU&j5`5BT8C)PGkEu6w-^^mog!_8VMRM{-;AQBR7ee9e)K2 zrv-p>-UK)z(54%mhhX-RRjf3<73dbjCutI z)&y#TXWET$y^NpCNwH{Nq z-w0dJ>QiQ#t2j?zM{z3$(W(ve*>;BzrXJ_b<_-3ymy!AK_PZ>ujFG_!cM6&B$GxzI zQ)6xq3k3=*dZm-vM+wroti|l>`p~HE2F}@g z4?nFj8=eoY;|znBgVPEI&XRJ}ep;G++~>?Ic}atlyC;jC^up4MMu{4Q^qyM@WxPC3F-+`LvUdAC)PVh7Bm%$>) zWW(dW;6t-yZhzo%-l*&lx5vrYX8lGHh8QnqO&4vkuiYJV`q-P*UNYkfEi~ESb<(V} z*IHOHaRCi071vTVe1>Ho2GX3_>jf`n9*57mO*l|)6Sp+(4eXn%0=_Zvps{Ho#GAE% zv&#W+SU8XkYmsKVe`M48g9KyJN8#%dDI9z}pX>1SVUrY{nDE3Lc7C1(KYK|JDk!F) zf>t@JTT?_iqy5?BA}MGc@&Io8UWQ%ySE%4~G>aJ;OIL?qy71&O7M| zXHR`XkFu?}S(0OiM>x^YhpSk-)kz3{(T&jt2e9asA3i-SDX4tCfLgo4X^p8FJilT^ ziM`g7Dotr zp3_52H@wGx)>0*x9!oZ*HXIB#MWsJOfRUC-xnH!{e|hUnJ=W-Go+|l@(J#f zYz0>K0Y-co#YVaeWDV=)!}_z+VT`jfU5sjnU#afwQg9_@U-e+t6LN6$trz^s{n<9W z(gvD1A`=SL7C>a88k6~@%_5t^d4J1&FzrVk&$ejOrp|i4SmrDqovcp@uX6D*A4reo z>mYKPG1LxJVLB}%*~-!|6e&$(&ZZGGuumTL9{8HqP*207*%mDM({6r(OfuD;PGujT z$I?m5iD2%woo@~P2xbf3!lMBy^inb%6&Blw-(PCv$9ot+gNh8B7@O0nthwscwmFKpIjHY9jd|1hlA;QstI>k)WTnG z)?;m_UxTE$KK$&w`S5I>J!#F7=lYcEvvV=xyv3^mBJSj1lD{_U*PGJhr_$t7=RiGc zwW*h7H6&#R;NzEXaecsCYO^$C_KgN~_c5Iz^{fQ%B^au^8&^gW@{xF|a<@bhxn?k8n@;VRVyax)8FTg_*)^iPBI zOj)-5gAS9P77W8ORoHF*FdOcW#q!s9(+hJ+OwJwBv;i)l;rOX+KvREKKK=&Nt!QNR z1qGZO!LzWJ+*rk85*GTyW89A;%FLjC_9N)$C`acuNz#V?cc4D{8Cyz@bF&r% zGnJ4F{7>6m{6$kah#Hpze|6mEv}fE0W5xa0S37}9n%$QTj%)pV4 zBq(){D!o^mffeU2@=qRFLWuJTXp8Sh&Kd@6@{5}|Rwb8rR_PH$m-vIz$!5sipo*(b z89-*UGrV}1h6nv8u*V}$Gwn_r48GEUzHa&Oa3#l~$>geWiu=~G3_FL8WvgPODNvlZE_io~ zJGyl{J^J~JfBnKAE84A5HOP_uI+z6MCoS;!_aK-C04+QEg4W2hP*`6GyF=P>`O^<*IHb7ocE26*G)-1zc1R4I07DO_XYA=DV#@;Ds_r$W8`;6f>TX5W}kl{5HvX8 zhIDT#t5Oj>S0BclUGIaq@E+n{^qRBFHEct~!6Y0RxR9tbT0)omm;psKRE7b<_J=%{^ z=G0VJ;JuNHIhO&aw~uAESz64hcp4|He=jI~-HKDo0;tSc78jqBV!w3yQ2C{F_PD-Q zu=(nBQE*!xKSkbzqJ&q`b*MHy9G*|N6ko#W_@VG}!U9S(8pnE^7074UPTCb6jgB4* z;beCvY%r>UUq$cGu3tD`7&?Y(ls53AZkmw6iHD*=x+7q-f*D)AOpn~%?)pIHGH*8(rtHM|F)x_n4c_1n-PV z=Hp;6%O3_kF)i@3a;NzHn!|W@O#z&nrb|0M48Wx}cI-*;5Q;zJ%8cEAz=m0FT&9a7 zG5$GzEfs6aLljB9LWij&KIfJlYr-$ndN|K-Ga)D_8^*gl1?Mr{oLkph5WQIj4{iZF z<98e6oy=+KNn=(y(-zNvUSbpXmlAvQ6xb>65nyqrTA-tshoZ1SWaoGhr>X4c$A63_ z&u%-Y2nxgFhdKpSbA~cYQ)k*)I*^^!tVN}gO8DlS!lWNw=YySgqqlaW$TN8fo$!vw zfR52{zvmUE4%Ua1SUonkVV<=euSoA_sXx z(JQpj+Mk66jwQ@cRLS%YYz6gZC)Sp50%A1ES^8iTs+*Gz)jlG)B9fz{J3L9@ z=UG0d$AEHuQXt@sA8pq)1;<0N|u%5(cn0il@GI~texv^Iu`C>eqWt+m9j>}N2%@zFkt%+sNKE#$3RpZ^s zfh?q4o_SuKML$*)pi|l$_F5_Z@A{2LfsvvAgZd4t-|-tfwuH7Qt>eDbXQN@I2b2H2 zkj)%3SpRV(XVLWKCPvvD|xwFnwYeZK+SkUga8eZ$=i?7Dh-P7S{BfTBxy;frB^JS>Dk8m$LqyhZXBgGoeiJN1S15#(xF{owj-B#a_5p#*cfh77y=id}z!fIrc&>0iK&#(p=3)P%v-+_;;lu#vezy zkfH4DjGN?g_XBskeI$;sQKyX#%TO$r3{N!lIcc|ERJCz6GoQ!PVUHQOKB)(OD_aSi zK`h#53`WIWk0>Z(C~SFp9E-Y-!F;PnR4m>JYEydREXl!e;Z-{nJZzF#GtQ&?61rGqIDwOCO2iLw2Qc{UMKrh* zh(9u}akfL}vv;rV2w9^ED0keEJ#`O2H(fb4GwTG|RAfT_gTZWTnIzxqVhWhlTj4j= z_n>-S5#I-9L7ns{@eRY3yqa7x&ghqn1ADenS4a%LD$l~`{#9bvaK^69_)4#KRq^*@ zD(K?kMVPHP2O?Th`Ri8uFe~4j-nxabxaKD${3S;R?y5*QpXLnen>e^%HI5y-F=dvmc_w@4T!oS>slgYvGXzL7YE$hzan+xYo;z@XB9!Cv7 z74b;J7VNX$R6HtbE__yx$BWYyNxym`dZ@3(F<&0?nR_g`o@Y%!;cFup_qocq-=Bf* z`I1;Gw*_9l^MmXQuHZOzIP1To9)-Z{Xv4f(F5f$lll*!J)653pK(i8YvxPej?)Md< z7f28VM^MZaKQ=vLKZKWySeDr_jJ~f#bG@m&SF{kGY!clFJ52kBP#DE32V=7@mctANDUq;;#dmBt=LCx+=??G=?{auC}wA0B24LObPD>!n}OS4299Qy zF!7!OT2;IRnaGvs`E(&JICPx$7wZ>K^>_xJ8#iz>7xn`)#och(u!_$+cTeop?15`z zA92o_%KUI417mJ=R}AwaY4xS`C{9>}o8R_gaRayW)e9Pg%+oBCcdg{c3>kvyd+o8X zHiwV89nC5<4B6xv0qk7xafo`Ij(eXaK(2%wOfr?k`QyidvCd(#d6bTA?@C}oq%uqB z*a1Ns9zYLg75J9vg2itQ;PK4@aJn`L&y=qQD(i*YlarveslUKvImCCHWx*B?(8l6T zviNA`0D5qI3);mgz^xlvSh4CG4KP-qaMuHzgGN5&Uo^*&&B^fPM<6zJmczXd$W&Jh zW2Uio=-xUF^By=c>+jR>Lgh_V8ky8Ct~s=;}tdc4brdnKGPDzw;I+{xJ|&_MT7Ub}i?I-ri5I_YJ{g8d_L8MF;o3 zvBx5vJ)@4Ub_Z*(F%Ymzf>u??u*q4C;Ae0j-0FqAR+Bu9S>A_Yw?2k9rzUXM{OtG> zJ|?V9twOZrvpX&;Hi3QhyI^;Dprk8Wdo-I%*jF}bY`m(*%gJArJ(X{y1Xu2dT%XBlW*}cXc@Mf0@ zir>x#y`PHU7bcJG-=4scJr&&3vdbX--58^q^PnrBk3HM+l)u|j0?r*k*P_?kkvsB(uJz1M@+C|pDe@g-2yUP5_Eli_-u zZ%Ie36P`+vMy8nu>U}0sf#x!h<~UG(einWU*V7XSh69q8$rm{g5HmN z(6z}IYxW-IllA*E|E(!tnk|esUmDL`cRdF64O!IRatR(hnF!Svx-%!0dOAAQ0QNhn z;vAbe&^@P%FW1b#VqFDTpL>|ueCxr!y2-F-?*`&*Z81FUuEWejlc2rQk}Nkr;TMn0 z<+iB}#=Q0qu&8wmoZBaXt5!^>9JyK0>r;iu zgcf|L|IWQC^aE&crE<=Qy-C=Dij{Q~6PFH5Y8!MpL_y@UC}_#E;0wtY+xID8;<5^H z*VsU2>^G5xj<;abmgwQpYz2I`CyUietwzs)SQa_9J2k&-0(18kxLG?Dx9k`SZLLw{ zV4}~ezTD$F;j{l2we{fd|8N*rgyP`+abq;;dbSym=7or`p2H zC~BhUXE~|(a#;Da5w73dOXHIl;8R4X3 z@!)!)57*r<9u3u=Q|sJ9h*rKr8Ofof;ysRwS=kH@ky8++=R^5W6V}co@T}uR?A3c7 zl{F_|$dyu5!ZD<9B%4Y%=h3`yM+#0JfeTNHaD1Bu%RPM(4b9r{gNHptI`m^}ug9RI zt_$wCFq-wgI~#+G{=vO<(?C&W3F^NY#0nCx!%jP6>>O1Bn~tZkyiZYhwA&f9A5jal zs`5!L$qH}83;pP$K4r~aD_j@t(Wfhs{54Y)?cdixF|!Wy&F56$@=$`XPl3$EUvaJKC5s9szx3Iv35j!J7Wt)XLZc+@K$}imR*3dDv>y1JJ7Tkp*Hov4x7Ap;A>&5a;c>= z#`m@re4uYi%txiukE!#R+}jPJk+FW{G$?>G{#Xp-BQF7eDv2{RQe|iL?(vcr9Z0iC z1`kg5Bh|%%XDvJf?*HUyLs|+u^tPHmtEIwf%ZfN1l@%CZagY{eCZNX-9o)V#g%%7b z1aol|H*!lbcKX{u*t1M5((uBEq7KNBxx%z0?U=G&9^HJBM3w7J(67-M9Byc{p?1kI zPojfAUh$C{4-=^FO~3)uuTi^rGdQaIK|2J1=92>GTjCB!KfZ_KH>cxnl|;J0_duO4 z1_d2bLS|?`??0=K(ps`0EHxaCOweQ$Z-$H1bf7T068ewZPo>HAY#nyoyY(^A=t zRT0hNcN<(V>TDhN%-4~%bS|fWk!!KiF%-W@)UcsTQc%Y@m-ak)PUR-ESd@|vr@=Th`v&jZjibRYbWx&uI|ZsN<`$Jb#bsxt*lk|k{=n=ER(r}8V?*`O zwV(@9Mi-K^%|ZTIei?;s@?Z~^8ql+|2k>aCGhTtTAFV&Q$K%mrT%3kQkdcM31QMvWd`b?IF zbY0^LP4=S`Rd@)MdQd2Bsn8 z%@gxfnbt^2rrOe%`JOz%KK1nAkTDPm@!P8 zcM8`?=W2rYQnqOU_rq#7i7#Z5{Zb#4m@*t&s`bGx^#HfXEs68BwgBm)+N_{&sE~aK z!_%GpuyFet;ocyT@*S6uendR&%t0F2eD2$6Iy&@>fLH5I zVpwWA|Ea2(ZP`GPJbh}eX>m2*9OC8YvKs+wQN$n3#10fQd@2{@ltcyr?c8@oos)0OF?)6-%u|`p{0>in zo%I9R9sh7VIN$|Y=9g2`Q(NAlX%+Cx`mtim6!O#3hx@K=5EJjoxbS_vW9w*;aMuNQ znh4KAj3_-KoL7BtnbIeFqS==sxUJ{Pn}$8+9fA#Mepn9C+{Ol^hlq z!|=d~w0W>H<}gRn6&NBv{3qf0+!RucK1GW)5}D1}0IZem6qWP}rIBOqa~H>!mkhK} z#F2)T+|)Kh8p)5K5W(LpSGkG1S|7x&)TVOnC;GCV%cYopqZ0d|p2|&Ea%2n7o`Cty zW4W5JZxH+Z09YA3Cx=sCO45qXfh0u2<8CKl?K?}he9=KZvGWY=PK)AaZ;hq_hpvcQ zm(PNjH)XJ>z=svM&SkpW+u%^~0`}A;L8LNd5PyLaa%2nqDAW53bz7HCHU`V z7FkzlcJpiyZO~@hg_``4%a^z*nbFiuYZ+y&B9e7(2e0R2xe>?r)54U;{8gLoAn7xX zRyZtRDr&&)maS#|!oNe&p#DPWr;u`TnAl~)UcS!jEM=$ZQQo;|v=njz6>nsS(@|i{ z+NLu;e>#5px(t7A8-s@YF}CZN5tYQ~us10#XnCVAXxlqr^%kJ>;_2+;XdiOSn};K| ziclR&A#U>k+^C&TGEe%mqYDpFkBaV=9Qv!u9_hOD`wnMPNC5n^{;0|PW z()`D<_+e8Yc2n~LlpWj%g<3vn>Gu)7T=WEE7hk44|0Xq0N#)_&#e}CV3g0Bxd%~ZSU!CHjOeMfgKu}01OCD;wqbiX?u;?U?&b4Q zL17!I3%uX5?z3st_}T+8PvBL9>wQky1C`A_%J=oWuuKW@-Qy)-g=aZl7fbhL1P zt%7CO=PJxPn_mYFj~3D0$ys3cXdl!ak;NMe zM({zaY^d9AS@tHY5ua9{BAXm-mUjFBM`1IttNuAGf9-*K!@OCTlqJ0klw=uil{mAF z0$=vTSQhs95zO(O!SrUngN+V?7q#{v#!ptI#xueEXoqyBbt6e!lIew7fsaMgH@kw( zC0oS6Qs^=49wg^A!l?LxnA9?nU0LafLGlSuY6Q+-aQ0kUbT$! z2@=?yqq{?=_6k^h+Xpn_Ml&NFJAp6Sm({FNV)gud)_PGLE2NUB|J;L+DQcyyV_#CS z)gkuq#WT3qJr2UAya795O!u365VyMIFgFrUz>_s+A!0xoY<@qDnmkQeTumnbyk;4- ziO)iQ%W@WDw-deJs*A4Nh{jb$2pFPykG1qYuNvhWrDnAfQQsi%6= z)FrvF@S!yrUXR1^&ko>`L6f*Ii_dTeLb~`73pflZ&7c#xs?^`&6?i4>1jQyNyeKIT ztltB<`C4>5hlx$i)B_UkhC{COfDzV<3qj?_e&dS+rtPh-s3(k zFcI<~c7JcNJbHkvZ?km^oK7*1Ego0AmHJH0ah7yjrL5`6rOMAzl?<^fK8B))uZC*tS z>cud0c|HtNG+>g=r=hSmmQAb+gP_+Q?A@JX-0apgcssO+;+@ku=WuhXDVAkE`a5vP z6a#E}AqO!%LU^wq`eiqB)-fIYL$t(CxA*obve3Zsqa6$_v z_}AWzBMq|%rgJP7e-tu4POgZK=SM?ZRtj~KUJ0AMQXr=~nvE5&L#Zipm=!q?uMLZ) zGhJg@+o1QL{`ig9D$oX|ACHD3FI`CH$Vk|^Dx5p`*&CBy-2k_YEueNKgtb1^<%fB7 z8@(l2mfpE1lW6Tr8s;CuGQY`U&@&4@B{B}(7LH+!#owrNbtGgc8ne0y!LY|cojE;- zg`P_NNbN)%W<-r3>5Ku)!&ZuIZIWdAu0O<58x;|c45V%il1%G+J4i{FhzebPi0qG- z(!2Ez?Ac)hR1VIEj-hL~*v_Pqe=Oyh^{j(1I@lCCT1PP300zBuM=^&jwPaK|7}w{2 zqGN@HWOyW&a~hvVFCK^UMrpEaz`;8p^VW{WnongRW&0p$i#cnsAI`Yb+MJPRKF4Ji zlWJ%g^_gLSxmRc7XMq`+!r$cO4O+C3a|7x2EitE-vWB&)pF+=+6qIZJ49f+6wEaCXf6sk7 z^B!8k+2u>nQz65pB0H02Sl*}2cTU1e>xb}dj=-9U%BFegfKoccnaXl2mh2wNv@h*s zXO=9(qB|SGW7$PAdT7W}K6_K)Nl#XgCh+0sO%uH8)48XHnygV#Ozl1F;X_3~+)=iW zY%BEOVL=?*%iZP^XYavKwK_7}vy#~+jbj>)Q)t}K1eir7bY5jRyAv7;ry^^}EM)}@ z@d~CVQ3uf4_XpY99$+UkylBxw9**@=!c7;ofdc0<}n=xj6TU}9umgo9W}wl zwHs!6$-|71#*kR^nnql&g`UFo`SvU+Qk|f{dhd*<)_!mJa&I^Ez3`5fX76NgKX-{b zygz_-A6aJFYdyErdI!rco5wrf6A7998u}b#z?8N~mt<`dSd@*QDEHPNC`gqDojF-> zwo8NEGC|7nlgGwES0Q|z10K(=r5)X0!Pcs9eCt^b>X!|ejf^CFaiI@*co&1tqF(Iw zylAMf>*Ne%g)HGoq25;XlAj@rZ592~0ju;RXw9dyP_}C-r+zyao+aKV{oBUq^*?&+?bqsm<}~_!@{V7StUs6Ei7LNlIQm=tJDa=DA5sfxi9dNP=6`E{=W_k2 zjqUxH*5YsN?@TF$KiaL+`dj-S4gU^A`cv$z^SAgvTK=6z^ryH^_iwS~-@E-gM(9s* ztlr;ZtG~s+b8!AVUj6m|68}fTzcXO|)W#b8rTvd~f6ssYsjVCMm)834eg571^`};G z_+Q%Le`|mDJ^iV59`~1a#NXQAJwJbHW5@rc9r?HR_j=!-+PVpUX>I=2{@&OB)G7+o z@BH4I%xwSG{@zRfJUN_~{$K6CuMN(QGBU>hKJm3BP5!3~{C5}r?{(#`S$l+~UigY% hi=g{8XP88S&#%{iG1-LAq-B1+R}>z