From 981c650229f1d2ac863a54cf1b78148d5fe4b66a Mon Sep 17 00:00:00 2001 From: qo-op Date: Wed, 20 May 2020 23:42:40 +0200 Subject: [PATCH] upgrade natools.py --- .install/loveland.sh | 5 + .../astroport_virtual_private_swarm.png | Bin 0 -> 92443 bytes g1sms/functions.sh | 4 +- g1sms/natools.py | 112 ------------------ g1sms/sms_NEW.sh | 2 +- g1sms/tag_OP.sh | 4 +- g1sms/tools/G1_TUX_natools.py | 85 ------------- g1sms/tools/natools.py | 96 +++++++++++++-- zen/README.md | 2 +- zen/ssb_INIT.sh | 14 ++- zen/ssb_SURVEY_swarmkey.sh | 2 +- zen/tools/make_G1SSB_secret.sh | 9 +- zen/tools/natools.py | 96 +++++++++++++-- 13 files changed, 189 insertions(+), 242 deletions(-) create mode 100644 doc/images/astroport_virtual_private_swarm.png delete mode 100755 g1sms/natools.py delete mode 100755 g1sms/tools/G1_TUX_natools.py mode change 100755 => 100644 g1sms/tools/natools.py mode change 100755 => 100644 zen/tools/natools.py diff --git a/.install/loveland.sh b/.install/loveland.sh index e547ee9..23e7157 100755 --- a/.install/loveland.sh +++ b/.install/loveland.sh @@ -107,6 +107,7 @@ nodename=$(curl -s https://git.p2p.legal/axiom-team/astroport/raw/master/zen/too echo $nodename if [[ ! $isLAN ]]; then + ### TODO install Feddless.social oasis --allow-host $nodename 2>&1>/dev/null & echo "BE CAREFULL your SSB identity could be publicly controled..." else @@ -130,6 +131,10 @@ echo "$nodename" | figlet -f slant | lolcat NODENAME=$nodename YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1); + +## Write nodename to IPFS +echo "$nodename" > /home/$YOU/.zen/ipfs/.$IPFSNODEID/G1SSB/_nodename + PHPVERSION=$(ps auxf | grep php-fpm | grep -v -E 'color=auto|grep' | head -n 1 | grep -oP '(?<=\().*(?=\))' | awk -F '/' '{print $4}') ### ASTROPORT STATION PORTAL sudo sed "s/_PHPVERSION_/$PHPVERSION/g" /home/$YOU/.zen/astroport/www/loveland.conf > /tmp/loveland.conf diff --git a/doc/images/astroport_virtual_private_swarm.png b/doc/images/astroport_virtual_private_swarm.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5ac819d6f60d7e9d9d1cf262665f93f1673b97 GIT binary patch literal 92443 zcmXtf3pCUJ|Nq=a7gNeaZpo$OmfUh{xlJKTav5?LbHB@7CFT;M7|N}}_#n5nndC$V+6yF6t003|bYHDZ=0I7eH0EgdK7v;z%w-Baj*x#%Rd0_aV^9x*u%p= z#5*9A&e5d@07w9!hPNI>BA2myP3{vxGWk(0n294I8PlNNV>6HQg|ZS)%#BmhYgM(=u#&}hs*topgX|73u&&q^fRUaNo2gc{>CN0FUPLLzQzD7F{`S;O;0Q*7eQ zS))=pUI?BCH6)60a`H`vJvhYmmyP!AuI67&bcTY=# ztbnR!gdk(`&iDmkZVAYL0Gue!%~n*H+ci~8Vh$3N zImk^`!FBc>E2Jf*ekPJ*3^`L0(>QpJ-f%|VZkZAP--r?kAc(~1Yf*C5<{u| zd0q|mwA2((PYmE)B7fJP5WdTsV|kw{>`-;O>Qc`K+46-7k_JUM5)4z6rl&?bPXW50 z>hUDh)YMd0x6LBk9;oh)@?o69Qf9K}9Zsx&n60N2;O;K&kFI?yNPfNOx&0h?QYF%o z9hd+DNdRE?pFxln@9C*>CxZkp_+11@xh)pocO2C8&%jQto)NI4W&;yb-xH@&5_;!O z4Mu0J`QW~f@Pag{by+FwAh%Sbl7LnRTqIEP`yF)L#)kg)q&1Ab>CtZYlG|

{U39>P0F+eYVwXw)BqR#PeJ$U+9Y{ZQc+@>RI>mCQJ_54aw2r1tWro8$pd-jHY zCj%>fxaWMJ6rdZ&7|=hy<9k6QNg9#jg5*Delg^0WX)1l~F&S3es-7vOm=ckxB8X&5 z$jf0D;F4_1;bW@}aRgG4+eeGLyTla|a&y{WR`~d5!5VJ!VCU9<`hS*|7a~QUS20Rb zIVp~Td}3cl&_gpR;=E3J*XBfR<~t@%f*aK}A@h4;Stf~WLFcJ&<$mal&O{&d#AJ0* zDc;j9iYb1o+8wdX_&9oGRM_4Y{U|OrT8yE)gKdaz&|nUA9nPdPTaOQ&kHZ{nDg9r( zVa3JQ4cF8;B?3&dvtRM{G@k>ksa@ny#{DoTBRHwKqrNER4t80UJ-s7w#97}h%Y9M+ zkou8^P9IMHqi2$00DAs zbI;PRsU1BUFZ9PXsj|Xs0014!C`kZi^R8mM>aIzYS#IzoO3LzO08ZWG1zH>1J#-He zG@@Ypu@N&Klbuv3lG^{&9%1aNYL@fH$SU>Cybj^Z>SrxGxQ58J>?9t(E0$bd&^5&4 z@#f=&V`hx60#NVfuU1^D^h?=G(+s?~FRHl(d@cz2dt|0)#1l4gI32%lIj*GNCwFF0 z7?hH5QvWTi6ClYc$@x@UYQMehZOQCNG@UPF(wm(2E*|5@-vl zJMvQJYI^Svl4;vPPQGPyxIMO6d`skfT%aHP7LzZi~)V`KmSx72#hr#%(M|DQ&)~y!K>|C(}rd`ElcO)y#&Va@rBRuSgjKhMDDm*8&kj#Q{UTn`q((YO0 z$RZ&E=u`zx06bk|ALHQSgor+ja)e&CDLmKzvD+%&@@0$Ysu*9)y!Cy;0sRQ2l^gn-{*(LZ=6^0u% z&6Sk!*EkeY9++LJEc+;zwiJ4Sda2S~RV=6y$&W*me-RgNydr96mj6n=)3mV_%A`4q zp!j94yWMRf`(;@92zvRPmpxmV8v1XtPo(Cf=Wzfsgj+*Q z#%dNBLoXO!pzb4;K1hqRQ*}lfr~LZ)~6zfcH?DRv?CWUzFQF65crpCtjjeNfYmbCJ4czC7d zGm(>i8+_(y;;NmbAy6+RAt817+=rMqF9&&)+J5Q(nwcRn`QtY=_T;+idJRN3(gW6n zL8pS#N4Z-&fitnITn2!Xfv^na!OJgl62Bw?7PZ1>n-j*8Z^rM%AK3&^7rPEtX3S{k z&YFEHlQS-VrBe0#wfXdpy&H+1Pphhh1Tb4p;Ji`I*SjYb#Cd4Q2%Z-&TIs*X?0M)8 z<;^OPuhQo2d402Mi;J#JPN;|GFbB9GH7$KscVGFf1;dzPY7|RwggKRz6r*fy&A#5u z60`Vl-&9J*P(q?l4ocA}u$G!rid#=#2!31jY1WaUE2VILGx_ik`Y;sEJm}4`EYYoL zy&S0|)!fwzvUWn2NV4;|r-}-T{0uY|1OgB$so;LA!U{<0w&&sEShA3k6BwQ?iIGon zotRlG)dssICXL~=K1kgdydHP8li9xAvx?0DzbH8F=LCL_`GCD&K86*KTkASn_L_7p z>|3t|Uk*Yf7oO zpM)~Y-FvEcA){@U93!G5U@o*NBr6+Bg34Edd~%krohPinkz`F=H+Fx1$i%X)PO*7a z*sc3lU7aQc8)0+bf!4ubGwoLafUK+pTm7f6q`9U#5lI{WC|USY{h8G(hC07VmCxrumlID0Ix)<94$#Xt~n&sX=YMVaOX*|)r?ssu5>FRtsTSTMDii0u7& zgw7W`djAKR{veb_MD_Oe+S05#MQ7|V3~SDF{%s}`T=NDRu`n$+$=!E-k?{e?N7ILl znP@7OK}1jcw;nWpwxQIzA=&1_n_~Bu6nGYE&D|?O5vxk^G^yfH)yv@qn{}*%?sS;#;a0lS#CYA&f;LD}5^R zf>!r74mLJ&)J6XD)P8$uqZ4i?LBDwRWC9{ANRU?&0>m?Ci)W=Q+{&9nP6NOaCMg=> zbZ#qW~Uis1~~#|lG2^6qF9;J zkV83$(Ld;6bTZ<6{V>H}*t&@;qd*qus7-eFx?3uWWTRmm)yyrz7 zt*|PH9NQj#e7Un}4_h!!>7AHOJ^|=fKIzKOZI!buE+#6vEYxI|CzDwI2~)k)O8vmY z!_)bsRhCNIwl}&m988b>NRk^eC_>YPT`$Pq?T1w3iyktr61d8SB2!-F86cawzuRH_ z3tRm6JL$}l)Hkz<@6*aW1ZRrrVWc09@G1Bw%z5E-%A-I8TQWo5D!LtEOky#~`YYhO1I_-9A)Mf+w=Xv)mXC>U zUmaGJy9{#~+&6z)Bbc!X50HO%O5wJo4YCT~ZYp6LtW(M-+0ktHI3#STrp4z1Od~m0 zrfn7i_HBusd401QGqPYqXd!~>I+Uk!rW)o{BxNuKtQs=7J9{!ob`BEA{x{k1e8``+ zHMl;feTGT`zz0p->3<>KAEZN?q1O~b-{Udt>|*o%sDf zCa`t_Uh=jfcPghrY4t!Q2q@sy6g3gH5KT!w=3=Yf1l*0 z{4~OBE+s$_t6}3mC;e1QM;Mu_UPe8scneFs_&{Al$SLg9;4@cs1 zzlrz?(U+=2^-Jyf{WM;w3o2Ds^{F@{p6^C!Jm*s$V$5>%+rvJu0f%sSaH&ucW9{qSr*a@^9te9`6NltqWeynp@~GxJbc%;CEl$ zqS2b_DrGeXHp4*t7Ty9^UV3n#Bo=?n@p-k^`G7!hK7cqoy=w68l`|LGlY3oFXTn&2 zsGM2C6TQ2Nv9XI5m%CRXNPX(C5{|xo*@R++q~@g0#sVM9*)`&$=*1DSGdx0I)#u-Q z2*j{6MxZ1O&paWD!h|`dvjfqd3N{hXJReguzQ3{j?a4*xxu6~h(46`?9P4RlSC~0K z(S+VhtFC2#<)V|KoOeWSJFOYH=Fz@_KFyA`qaPmao(`n9?h;`Wz9^IQz4c-eVeh0c zrUQ*`>yV46ys@*fv9Y|D{sd!AiOdmVp%CD$#2o3@W>Iv=J83Amtf2**_0n5a%u*&- z&7AGs%D(0u*<2|4O^v2@e2_J(Kf0^x>f}L#)tmta_ib2sfd2esoP?Qi`C)Q0A@@EN z8-ah4oB+-FHCu#UrJV<)sfh?Zv;Gl7@0dVSkpil|D?L3d6slih@qsoTjhXh>D3XS* z&UA?ntUqb~U8ey7;@*Hq;gTTj&Y{$#~% zl^&C3E{cj_!|0t5;=?f836J&=TwhRaMmxG~u~0jMvgg{Pb-ZTV#UdNAGqPrxCT=3g zO63xZTY+>A{(Jtdx5tu~!q)VLoBDftCMWG?7N=$3KfK8SVj zO@&XP5Y>yC`DJ}wfchoIL{HPL5UpZ=M-j2g&!5$}zWAhFq2{7(4n)rVDT6$njEQ(q zk#F8y7yc@3ho2uX+bcAhc{=N^O=)Lj1Lo0w-3O4wZo#Xo+-v}Fj2V$L#llez05d3GyBJTulLM_5}W(7v0b9 zU4h^-GqY|3hgrBfoQAceRLJp3EbfR4sAfA2_*H_tb}967 z#CT@N`y6-M70!1cDKJR`b;Hw}jq5h~4;rDbT=Ce1*TCiWdy4O{uAv}AuF}6S`RPSX zY6oL^vpT;kHF1V_6;=-gyZwlo`ng^G>5-`Z?(BN;3;vhyrfkUC=Zwtcy!dN|F5_z02bKv!Qls=P2$ioBWG$2U{r(Fw0DvIMcng_a@x#T@ ze^pCNJk!7+aZua$Gp``nD@fGDj7>nuRp&~h8jAJ=>$KGAb@Jt)<{iN~P3u=uDHajk zQQB7$9+R4_&4eIyKN15z0T1_>h)~VkSdzv!?yWzzn^3}Aa!~g|r8e*0{!ZREZIJw= zC(Yy)X5+vCg?mnEIoqzXb>Fjkmb&T-_xXzy`4L^;V&Q>|wMtLu3EQ^_2;zFd<0x%F6)yMP5nIPxTao||^C2{`G8xugOc7xfSn&1R4wmv%lTCcVF- zu4X)Xp*YuCr!78S_3c({eX}RR$jm56q0*13cr{HLy5HHQs2~M2#4}kqt7Qqboyz9j z(aK^~)jo!z{XRJv#yqW=SphSOBwT(5BiSAd7AU7>?wk}z$o_M6=;y>qHMxHW_msCu zm*q>DrvnL>U3OoFDBfxE-N$}e@VzE>8~2MgfE~SiCs|^Q&3;;ou429EFc1(=UmwF_ zieP(llj%^aH%<(=LjlIcPfGd>e8RWVy~G2tu4zqKe+0Bz4KEtOy#OW2K4(j~DqQK4 z*XKAG+`37&l+9g=L;#FMr0-I|spuAX^^~1Rhmd2Rl>(;*j_*0EAO8k5Y>@|of*!G*5`~8ypx4kI(jCnjb&vGP#TE1 zXbqS`CVhsEfZx1+Q*URmcAFd}Z&UbpKADktr$>_!_ls*E{X5=!in*=0F5Wdx|F33p z;>fY1XZVF-UInidx47PQS5))n-c!}L9d&!yqUcjq5Ar-Gqnd|Jv~r&W({>zK_&GG5 zzBNC;m-_+nUL!m}n_$yCX>-288Qw}VpLyU@IP&+pWS?t;T$*ckcjkbbNspG0oOk(< z_p8fxg~|pZzg@M9&Ang~QEr#rdR|1^3Zpm#IKW6nF9rF6{+ADnZ*a2>?U7rmCVWbS zj7p@3(uI`5F)*ijBP)rrhN?Q+6S+IGQ-11(6?wtLBSd5w#X^+-q(N{@Qr-tSjvE+ck}?``ELMoAFv8Ng6Hi6>{U zrNEY;5WhvnjC`a;V`)=0!NZLQt4#WyXO;gLh-) zA$Y9;E}o>vMS1md|0UU87&>?r!;IUmE}coELEJg*r+7)d#) z6W&Zr3z-gsO$2BZX};uL|M!n2KRJKf?6}7&r4#`1rmzXq#Kg#ov+QuGgN2-$X;XFd z?b&HAzFzyY!nbkHxyUZ@`<(*?7deIR5LjA`ky#jQ0NetnBHa+I<+U&=Atz!{4R^R~ zBlv0d_F72@K0AuqK1*45S1-1A8^z!q1-^F!@dIbSq`HH+XZN`0(%%`cH z9nt4|H3cAQ=1r4+PD-n>ImRaLh#*6M6lpa)I_FUQm~p&)WEuZE@p!R3t0exQfpGZf zO8tmu6EtT&kkx@Ma0uK+A_j7$hX@Zmd{o5f;^IDDC8bD~phjrHzgcoueQUnMe;PON zf?&cRA06?SFjoCAJO3t!f}@%z{bNu(85e}+JR?tq$exZ%w{8FhH#_zFe9;`<&@pcs zi!7_q*3#0|)hZql!aZ{HTVn%N;P`@eWy{c%{{-) zntwGlm)Xq}(N#u<pr7+If*{gT^yF3+$#MFPIV6$-0>Uv_EL^s;o;%#s!&5Ek<=$!+ijgI1=GVW) z$IcXZOsbjJ$FSsare-F8R_1Ab{w9TqseA9_(xOpXUM40cxkFpa%b$PyzgQ8k$b*u;0u4A70<9~+=rmU3|h6lYNuHmZGZdd0xT6*7Bx z0BguJpPsbZ)Ss~~pB@B>a)~2D#C4;Hp(BynH_T^Boq}+~LPDEM-zxTkqwH+Xf!w3? z)b#!!IV8N0>``=7GeFWjw{<423+@024{8@+Z&C=suY|t_xnd{#f^-!5hT2vgX2Q)0 z+Z|7Ai<(Rq%3XEDW}*To=3lmjt<~=^?C2$WQNin@;>OIF`;uI2Q3Dd71eL!Vb7kOj zu$lUT;W}DdTAN@lOR%?=x9MvOQUvYQ)evhahq@nb(m5o|0P>eP6f|lUf_(}fn(?NJ zsYH^lJr*)b*XhE<1F&xmRqj^3t59gYRXt9it}IlhH9h#WM|N$3g!t#|@L_~*RKRCc(f+?D z?KKfrf_LO=f+K>WANsdi&~lyQE6U`|33Ar>Np$so-6sAN>H7EYQev-E&Ko@mXkavz z9xp5`j4uR_w@i~=^@=U3gCnAX@Xw_AdR>(=rMMSS7t_K+XBhaOEWU?b-B;B59m7yM z+8&KN+BD%8hxuz@(rY^DuzK@}RycuZGsD_G#>1w=b=kS4;NK+9u&g#82dYA_Ol2O# z8i@PVAqRS=@m%GBwU)02ZG7j6PxC{wg(y9iAy{rzNQJC*((;ErW*EWr9e33*yE)DR z;&##W(2^a-{>+%%eZr)n0|#*Mjf!WgirlBQt0(Y!ljRy*gSP6c<@zs8 z4|`NZUo$#=L{K-_rFshv_R{EUMFGHi+l#j)3=D=7016zbIoRIb2yuO}i(<&q;$mmy zRXoT$EUcN!@f$Uu>yTK^WVB*fTUF&xSG@x3%z?A08!FOepqko23=AvZO7#9C&pGom zLp@scLOTeJ<~1~j-RYt0NA6a9V&>+qx0&X;>%6V7d$>~F0@ql0$SdF0c0NuSchU)2 zdc0xV^8)P#uQ2E@GGuCbxyl!#X`Z8Y&RP}U z8aqtTTs8x2;iKW4J<`L^KohUiBqQBWO;Z zxKUKB^PpBq`)_@mVtx9w2%blvTXpLsOB$_uk=Y81P$8Lih0<}W@~F`{|^2kcpqwnIk~fRQQVvK^b`1TW#3@j z3mJJth=9BdXAmo^(C?RX?pf+3S}e?Fyu~kkd|@+Jw(BS?D*SQb`C=;PLGEAIJ}rK| zH!Zq4I*~L~Yq{w*thDcCnxKhZ?F@I+`|Ka4da!RMQFVEIQ_*lugFY@V1jL($_ARV~ zqg3W~F1c{_>;>DYCd{v{w8^#QDWv^P-@6&HYTqXt&lC@x*y&-J_G6K*87i<+|5`PhX806_oBJ|LqDI*yQdni|*qegBQtN$Qpp=D4q}Tg4^Z82rod{ zj{vGybKFB3Q+3CCI@c$!V~b_?bx5x^qjWY%sl5 zf49dId$g^8Kp6_3_tR>)VWFF9w0?Wr!v!+_(}na*Q^_@))nZhE=8 zX*0y3wP!EdL2(p6oPLM!nbSM^aK1dNqX8;tWHn#BX{ck}{j23ubMruiKUW$0_o;N< z^QQ6(#TYc2kL&^c3No)x<~ML}ZV!9fVXue{$qB)|X%25C-7xRf9BtHrT0aMJDsrw| zRIZQ{UJ*Z-_d2e6wEVheWMPv~x1veK-!ybjz4Ee2=gy{r1wqsN%{=KzL|iZ$R@V)_ zTmcXy-=RIVp*13eIjBiZf=_{o34j;EFCjoXy|i3+tet-BMyTy7vKc;M=N9c&8={v2 zN;*Lf5w(=j-=Ae#e~reXhKq?)S~LjwvnL`%@-n-W0EYqlh939YI6g=PYW>PfJL7I( z0j*}ZrEHi`1y6lPM?Z1M34;n|G!cV_v%S#o(e9{CL!(<@A1c1$+$8(Ln{M?5W8tLm2Z$WC8~CVq3d7;% z7a?u241b#m(ujfi#?`j(^_S;;Yy1{7({fEf#Spdat;Q!A>C2X?g3}U$?1I8E z)6v+pvPiumOWb{zUm~a+LyNyG#DBaSo^!4yH<$I0yw;;-YnEYL-do-~6q<%W5o=gc zC;zYJ7i2Ab=?5rM1g^Yci3xgIC~ffBslG|t=(*%c2->$tIM`S+P%^D7kc_gWbT6|XqI=+?8I1~_nqpZ(RV27N+Bd8|IZWr?8XLP7l~;cWnVhP$(4Tx5sbxKR$A?|j z5C;larEGuiYVRq?q>u8sf>H+`QKspxTXH9vDl$HeEJiaTd5V5)l*DG3XDtKWxa{EA zk;b|P*$oE3grGcWA5Q>5r)zuFq2JwJV`Xn|Z)f=jsueR_2@v(LlX_q!$iw8JlquWC zP%E>O(mQFxBQkTUSAzvif^rfbq(nwWes)5U(9qlm5;Kn1>hp(9<>|4aM%H|82o+=K z5GaF~(AL^I(L8eR?{(AjS{SkuAL7Ot)HkN9;Cc$CK5f3 z@G0Mkr?2$_vxA-^&KdOxM-WdHM#HbM#0`LJzL1fXTxIQzsugPgVxZ16s;&Icq(eLr<1p{+AQFj#B+lL%`J0Rz&%5oaH5zEHye{u^f z4eKI&EH{7v&&g9AZEWhfZBtFnga=fp2O4|dw6e-f<;NL^wtMdawxhFv9U;i|rO^Gg zvGU_x=VKa*;=nJigDCqrhGx}-&vJ`n0I_p|W%(uM{0PO4PhGeJJEK;0w!N@Ke93rMp5p4a&<2y#C>IIZGT?gWhrD;NtGN>4Id50>wLI{;z%j zu<=W4vzrbR&Fb93B9=IoSS{&xydr)?!p1PF2utHjOZtb5c%-P9w9k*9=J{SM_dJ?D z9Z>{t*Y4`*X!}(+Vg1z*XJ%B>^tgQKG#<}ZA=XWpNxq17DUWIPkj4`-PdkQ`}eCDAWn+WzW% zKQG{9301k($(c(sS96_AbL!f!zLf!+*nY=%a7BE}d{Xz|TZaD*2fCe&E!x0j5gZP% z4YM)Xn2z5rpZwDkj9qHENfgE?VuYwaccw6pj3`n(e6fTrI1ROpcW|q1A^w_8YOPyk znlTh!dg(`Y9IthzmM!?VMh97!7Go?p*!H@$?hqarS&_D5>kseUNJfO59;_m~O%s$b z`;_LYR&v*W8XX%LsHuocT?81Ux~p9|&zy|x&_pwBN35nY-poAnMHXCC2BWD7C#!bqa?H%nVdnozDT25$ec;7+--lt-B{7wqs{RC|I7dM@Bp`%-oLMai#dl)oQE4b9SB?ldmgRGFJAX zDnHC)_O~WIu@+^!J1eA!RdO+X#RNLVz&)yIUP5Fx&F{FD#KiB-Um~g*mH1;?Xv}JQ zHH*S?_wc@>X^ZPnCOX9>HhR1T%;eerTd}9=&SocySAW!DkLkCLTm9ZM`rAJa2fSq( z6&Sh2s*7C0eJZ;IhkGdD-L^)%X=&%)EKlpieQ?s|A2QAeAAdib zzIl38V`oBw-F=Zwq#QOH5Wlv&lV*mSY;SF)Tu#S|)^$l_U=X`~jc#n~98Y=Kwm z+R&W-xp2~I01Gr-bG!R#kO`3NyON~IchbtVYEDP|GW0i%oQ$9t8aCWoLuPy+XhK7q zPmyE1zJ$R_KFn%y&^g>{pZsH4G73g`gi1-B$WK-L?X@t1yKo=W71czn3X-buBdOmT z{81~%M}0cIV*~R=3G_Uhy`B2HaMY79RPo!dFj)504a^nmE2FGlouN`i)1ZYFO0zhy z`Q{cStF>l4RDE=F3>#BkjxDdQR%{{Fj69sM35nYKJf+)(ely~EbkuNn?&Dy3|8Efz ztWMP6zw-cc6!l_KU|bwgElheoa9oQTJJAXYK%GjIi^NCeNaMVB-ood)rUs+rr6t+v zw@Km10?F^+J=11eU-~-jU8CrvByd7=c_%pr=eSc0l|ozrb*#8ZLXgN&_~tG%H{yYGjnpMMtS8M;H?b1*Tol-Zuh5fo+UvDNO;<*myQBvm$&jlPN$;j%$9UYq>fmEEi!7d>zvk>M=lj>kj5JWo=nqMr!g9K--<)7WKO#_baecNIU{3JHLCfieQ&_VKYmGPW=kNyUaWTVL?SZl!~F+egO7+e z=`7odW!S-NRQft;p>|r-C{Zn%ag-SEq}sT_Ilht*;eiH_qbe`J%s5DJ*h*|=1lPZ~ zvB!H;N44lHoR<2AlgRL-YI{w~S=6e~f_;%9>WhB{k)T9V<0qJDzM;-io7I+;-0A4%j*h!I(l1jqPP2Wj4kiXq^Wrbbr_3g8nwq%>0rfJ^ zdZ8MKQKR5oYh$bBF-QSaB1pGXvH@)Qz(pbx+E-Bh~Pmj%GG1;Vk@7U^_e%sr}X> zz28+w_-4Th2+4BYeryL3G+ zu8TEA*V%*O&8H+RRy-j*EW_}M^+|vLMcSNjl1(%BwqenA#fpguN2E>iT?nh1biu|Wf|4=h}PLAQjGrJRm z@B}GK!nbGtO})0Ui5cBpp%6ZZ^OWgiY^n`WGzH6B;2Ae?Z|Xj=rC!%tHtqu(1}WqT zS_jKRBn-h>1G!6E^UL3&G(h~%ABj?#OeTSKU_SKwk%(JegcXmw^=X?xd<_2AQ$6u4 zSsR;DBvQf+uZ3$5!F$6I0@j{U)ARL&^wQSJ*M>XV~LWS0kFKPes5RQ4fFE3Hz(K< z289FFhko>$@c)qhB=3!Kqdb%4l#p^$_^tL?G6Cec=AZihG*jD3f=}#Owj9TEU4c<{KP>0VFlyyk$_Y%5csim zXJ{#1H<5m@J8DLNA&c1rLddIy(GCwWuzZ>Fenpwc`5!~=>j@qApc{k^Nc2RJ|#-A5U-cJLm{#MIbJJhV1n0Ta2{4pb*UZQ)# zoQAxCp1_7rfy_=S$^c(!*V5W51kt>C^TcfjQjs-YQd_8>_2Z-w z?)ptzWa`}s_-B0MQ}wscK*WVQx;7zfxP{{JsaXa-(B#u6>}3X(2e&5f9*<7P=t6Tm zyyB=&Cf=(`H8pRRrh-ACGgj8&A#gN(iNZ6UD5?VX9$r6LH(q zJfqeAsgecUO-ncS9jYoljE#4QPSRUdC;+!Bf7q%?d8;z)OA^sG4ZO!02*h*hBuui&*QF z96xPrM;nkB3^~cknQ+^HZH>gnffl2&B%MBeH?~Xx?^ICAJ%c~f5kQ$YSP+>BMCBpxey|c`#J&KXmei!-K1#q9*xSN3WhCd9w?bP< z!T97&3RVk0Sz-MKl=9uR;TOE6{H9EbvKWZef+G1x1qL#AR<`$_G+m{b_T@sZZf}+z z-j!|umHmeE_O$9pZY=ilOW}eI%hfML~^(L>;qt*JO{eK4#W%bgLto&g+CvVhD z%t1E>#JVFWZye`v-XutH+@slE5fyUF?o5Ie?(I9qqVh>{`)qB*`3@rxQl()wf=*`L zdNQX3f-qLehvU>zdL41%@tHq05S2UEEAv9QK@GTQs_};(nCo5%vmN|^ydS=UGdCA6 zpmFmq2+0)Mk#A%x_0U11GawMRRv&kkjWZw?P>qU6)!AJvrK-yz{vPkwA8&6gHHEjf;t+*jB2qmQ5&)lxEFU}gtqd>s z=b05ED*^61_c%|-B?bK6#N^JnI{bb}(ivkY@X6wqvLVD!Kxr5Y@>4BFc%P?VmSw2?_J58JvVL~!HMKw>oAbWD>3F!ywM%)APZGK5pYx~WTuuhnB{{cl z8@0bM{T+RZLa9aPk)$y3J97B<0g8*o?JF8>mCJ}o3k#V$#0jD5~ zYiofrhBJ&X8@L9^1E!eho`U&+-|C9 zY_F!c&=+tzsQN1(dxa0$QL&~vCz+Fz_^XaKC%sza1bqhZV!@e_O9If#!k1XlOrJte z%%lrThg;W62yu@2=X_P46?r7F`ogro&=*qE_>E}^O{z|hImty)u5#!jK16-!I{p_c zFzs99X}c5smDN;TTa6Ze z{+=E~|Ms09n8<$%7(`i&G+*;?y)<9*rcPn_{BZJ$XA_B@D;*SYQxV{T*y*`$ECAsY z;IRPqfUn~aLC(iGT0F8jLf2JRj7uWfW`Lg+OvQA$@m?f%K$ZK&(CA4zGOs+s(?ntzLn-c8d|-E8dK-M|=eWCUV!=&7-?e>F^0R^#;f zftutxdUfpE>*0*Q>#RVHhM6sC+P(doT>Me1etYE6m9&(m^MLL*;O?k zmoQ+{Ghuh4S`^8jC=wD!zOmA+1(}WMs;RyO^}TlIOct+Hq+gRCgBc4$gOtmUP$JVY zUZ_i{xS(%x@S+QsPWHHQa!S4cZTxY*bkEtj>l65?ZNwR~oLv!0-rr zbJx}xdPQPl<1pLT=Qa{ue~)kPO-}xubJd9$em`NR(k%$`VrSF5xkEjba!;_o7!x6p zl1m^oDrDTCKsnsnD{0>}F6=SwIh%R$TrD*u!>@)RL0fDHky!CM$g=3G^?SzL4Fgg1hU>p`NgL zdxF2$K#sZA%ioHD!)!t9xIr!b)nIUWkgrH(cnaw2FNqhLP-Igq;exL)#Y(V0$Wbu2 zcl?U^eaNS#@I}lkl1K<1D7@cUTXPuag$f~h+KI^y(WpwH6Bwr!Sbeh$8yF|eIj=Jy zy#V2Fq?0;nhzEl_7CsjSl2p=E*xXU$#0&6jekE{#O{ntBn1OOOflEQj%KX?oMq%{$!UwG1os_T{pwV3rILq z=1!{_|K|J)!!$&~-y8e{gg$Nn~Os1ad} zo}mj<7PWbWqv$F&QTH8>T?{o0V#FYo=9@iF9NC%j}fnlCIcE$0t*D692uX&^G2_v8yGBzeVM1+ zhUMMaeC<3zzHe6CWJ?MosHHT09?Vs^k8^^-UYZ7e{e0cn*XvZ00f-OJMTY`emRjA5 z&Q@Fk1N=A|m1qdQ^hKD0kPz&+49r+$N}IQ(8dC+c=ANn!Rpmxn8wNd?K;;Fe5VsEv z9<1~N^QLHPP%v*`u}Kp_dq89H~xR3Om8uVw7l~`Tf4%|M$ne-MjDCbv>`= z<9Ve`SBqQ$iRdF>>0lUKi~%D2&(G^+qZt9T&Q95Mqy!L$Mc)1wkHct(?e#icbe67BgA2Tk3$!y4dIR`pz`=v zo9y2R@UOuX(i26#n`rEt1{cz>R7UCQ6!9ZNWkr7%yae~P2J7X4ds>}dk(NGETF$6` zMLe}%tEB6SJDzpc7addYPF}xNMW~HNbU`(c=1#hh4uM@|xuDCsd0%d$9$3E}ckY_> zslUEOkiNbUlbYsp-CIs7AEIw}XN14t=m)@@EW_ejA%M}wtOf|?#%RsdYu(}e!5Fh6w%6#N>^joIIn4+EOt*m!`R^uGxkb-wv_ zXBGo+(gX17Vtk^qN#XBDQi3o_dF>uCVR6la+Nuj?rg0Fl#-!kkLQ{()>XZsdXaMQx z_VWl{hyoYljb-BUg@?0zOMy=r->9g+o2r{6D8-%@KH(pJe*^xfJ)%llSfJ|z9{dQ)LH7 zJeCt4>See$w9Eud)EiisEkz{FD|$UQQp`5f%}kUDfnH#Kpf9#P7Wa=mZWml^k>Pmg z5d7bbeNuDvbiq;Ab;pXyDtUi0m{=ouZ}Ev=92C>KkKukjKA>2ZuuixCt-2eo2EW?- zJ*=sfK7YCvx}Gs;YyLaMHQ=?(n(+zuoi#3EDV1ka&4IZ^*UhqSJt7)-C_a@J?6`pm2f<@^$f*% zBP4JL3@b_gzdfCt?vFw`wpkaF_hHg0D((AOf@jMcq%3y}Mg6FekY%f~d|_7->8P?z zS!L3*(Nco+188|kPn9|A(*gyR(*-1hG9Fu3%(aGGMaAZQ0SFa#n7OOROe>(7wz7lm zT4sc?VySuviGa)s;|v+gN4w4sZ)`dEf4VNlRXDoR-`~HY2mS>B5~$cpDt_!%kh=5V z5>f423!f^f-VfKpK43+?^;t@&M>kg)&#U8P^keZU5Vwk}ZB0GWfY=YW{7Ru0$;}2c zjbw-#2>fh$w`4)CS3M9-?EAov`-Y^;sXFr!4yl>{5rGo~&LosBNYmwLj9i zR{?sX`y7|SO#9w4d08i&6ZC@?kUoMOMqtQe&w{A|p4|VIyRGKBAPWhQ+h5jJR@Q&x zjrTUXVj$gn&t~paY~PCe>?X&jCW&E1se`LY5)ugrhHmE{E~_B``|Zdc{IzD3VM8?8 zk{83vl?s&HE~U+7d~wxdmgDYLW8q^TBZRQka5I?O%jdm%a#nW*Nw=f|O&w7i=}^#$ z%4@Fc!urdxTNk?VasqF5RX-p?APhoaIMZ(i<)}@PCg^zl`X=8`&czpyxV*dQVE5cp zv2hzP1Hf|UEnhVWZ}m>_h5b1rCq-Z-)H*)>cvmmSgW=aUy3*HPdf&EP9q&Ml_H~~r zpP-gjl4TE11Wz~apZy&+D;uMn9UM|GOR)%{CA!jYueb8mYbD3(TtdJKt`FwHM`RQ7 zKGH%l24Icr?~5jTUa@cGIXCb9{td7?-oF8iHnS-B_+ayi%vH=t!swVGCSJ@mE4Q7cH*cbJmagF;l1i&GFMRZ8T_2--& zo*gfL&yPHq?l_@#9F>*2l>5)OBE;hIL=6D&D@E4O__tk)3 zWsr-ie!j8M&qe$Z(Na-%5jZw=Kuie-nw`*u_u^oCN4#&MBhU)^`$x1-uifPyP8$Ts zV{O!qW{yts_mD;l*Fr6B3(9l@@Pn2u$qf2n{K&EfGqMIf@XTS#t5>hEZ!|99d~Y$S z+u;(#kBwlS(thZ-^tSP*^_KRiIy1B@uKGLinbP_rmka@Yr|>y>f0Hyv@~*L~x^u`U zEa(LK_!nbukTG}s%0u+~r~Q3%M``0BZ+!g3B(5clTb69%UdL#9lHU>a?7;Sl?}>WK zT?t+Np08F`&~(rhgAofPXq z%iPgMSFs>t@z$;jc^A(K(*mYigaV+<^q#0!<>+;&Zfk9A{^Vt8q7Qn0o2byos|#X7 zkptc5n6Y6S?iQ74gKHj?a)5S?jWv?X(g&hc$a0q{lpbjaPWP{1KGsOi?*y<^%4Grk zWfyqmDB|1HdBN5W?=a;Z&53#j5GJF@CG81ymuPi6f)xy-D5HY-ArgheXPLfi41{_H zH3ZlWXQuS!Q z=P;}tu>{Rbf3}{5)+3CsOoqC{)%jUCAuQ?$ zoh~H_M~gmKtf&|?UXO>*`*Am9J@$|L6H6UMtlQum3E^ z{C#~wfG0W$kmvx1{&Ih#>ffmV`e9XpG2V{W)<{zF#Eqdj&@Rc3{KJDony1~8U&$r{ zmAsCYgkx3@9_hsE=#plELBgfUiTAb{X z?Sw~A-6kJ0zq&#FnVFh8A!T!=LYO0%#;gEQhjP)ffW8<(ly;Pi^PFwZsz^hZ_IIt; z(!%$;@~2%;%oVon%4!NqT#%RT;*b&KK#imxC%Poo!F326{ye#irjqL?mkD$L*78Fk zZRbIx^T4c2M>s=YjF9vI#SRM2{x`Kdw5q;2kS1{P!P~-}Y%k)7Uod^VQT1?dl~iGE zntirfa#hrcwROVS0i+`V6UBZTy`v6~1BeT>3r3ddjWJt{EHSa!QLSB>f&!}wsl#or ziq^Vt_IdL^a2?s7^u--7VaK1GQF9;1T# z5lwc`mrySO3_;Y0Ae!t=pYUvM-W{_*{aW1z1p4lC@2Ii=O^7ad@^^RXFHT#kkB4n3rxqARp=Z2 zq2$&d^(ueP87Z=kDBV~12cjJ9mBqG_Rg1g!zn9Tpf+jYIn-G|FrEc6Wr9HxzQ~Uc9 zMOVh_@>awjeh5mk5Cgc7HCMWMQ`$RiUwsOI_{?S5{S3;7WbnVHx8;`@)8|c!-j7mPftN{b_SneID0qgfoJ!UKJYc2h{)d zSJI^{45td>i>~{s5t)d;C!R|GELrC!a^OVyS(!pXe9_{c(uV}X=~fg9wLK`tY3N`F1sGug_b}voNclyy@$eNd}=|EbF8sK`iODMKzH#94hzMc zp=7z1vN9LMYpv0H+Q`eot5l-pAg@Lgu9o4PSo(uB(f%hg3{gg0NM{8&Z*l*^e3UlI zqESudTJpgu4Z!5v==l^$z0~iT6$!8?X(7RAZ$qmaZ%a#kTBfaBVbWfoTt-(8PY0cb zJC2uzZIna*9L>5c*2$o+=Z}37fji<@zzCgM$@tVKem~(7`}EZVBI0ZDzS{A8s^DqY z2`wz+s$^a5baR1w%cL8A9799%VcLdA+*+o09oKN$crOw|Zc*j^9JR>J-pkWvyQe#D z&X%q~q6u^{tA1S3vu%ITwis{e3huH<);4<5=7=lQ1I|r}LSt7PLik{LndsIuN`xjF zU4emS>PSCaGAuA~nAytOlH;QZ?7UX2XdIZh2)Kxigqe^xT5iFw;#QV~;HJd86@-1s z#HaBu*uJsF@D`+u+`9=$$h*r2TqcuK)EjXu7{I?W^=p(p_ogArLh^CkjM(`;W48QA z$KMgw;t^L<&ZcMfyE_gzpZk0K&3X;Dyn0oUMz;s6dqwGG9M~UhZQK5(?=4-nC8+@N zj^cYQ!eB%c1dcJ5ARR6yDg5NxvWd!~72`i2joE=k>`3 zcm6(-Gi}zfsCzn93_GtGRJ^1G2MGy*t*8ULW_-TXgM-;MrP0Ii34!voat?L9DCxTj zBg`l;o^xRNQ==D&`0Lqp18LGm54%Yh4BO~0&dDa^oCro9+IBXH8nUtRl*CRIvB1CB z+YuNk)R~3}p4M7bBxR-^#+@FEi6i{Y4nIvzrPu<;?Bx~N!SlH`XnhSUmf7>H&v9G0 z`L@g6`rwsUvv&+#u096gT(|}2nqC+M(fUL03#j$8KMG9r(0_k0cy^pKy$592;F9+} z3N(iQ__}`$Xjx+L?pl!5#_q)Y9k^~DkIbqvo3#|={~^6vn{{$j961v^>n0av7yKVC z^~sx_Z|sr|%w=y!N|jXJ8guGw>s2eNW=pYIUT`x@*RW1YKv>>557Up&t1JbCl5c?) zHeZW+!>ZGNA4;>v@ayypJW(~#33R*!rOzL=Cot7Q6czj|uX*QHn4qr;3Sy$(5iij% zA_jzl?&l--K%>Fv*S;hP3?Y>2^l99tqxa83veafKPv=DPgO0Iq_V5?I8nk&y0TK2t zMSv^5uX^;cUWYHH-kT(j<5={YC~0t&3q< zh*FNQl$i9N`N7LYn2S7^pN)BiE-4<)UW)G>%9NMLwN(ud@bMWL)Ue_LfyIbZ(o?j` zw~JBULQGG|EDRH4rcF&hv)Ux8NM8RnvL&t7tnMl4NU*UnCvgaajZo?H-h|J3`YbLP z4V5=4{J;zxoXCmsJ+QfGK|{|6;&;F%rlt_Tn0`Bsr3g3lXIpq!YIrzn|Djj5C>Byt zcjbatqJw@ITniiRJ01j_;Z;GIo=aB=z8HfE{~qa4)1`6_;ni2|uA$e)gbJ%)db44r zN!ls1ZIQIpIr@6){v0Je4LBS)>wL#=QsQ%|)Y4J(vuo5DLy7l908++`LfzZ0aZrRu zEU!38i{Pr^dRpA)vG{tDIocxIF;$ieb@$p}!^%<=<8N&Z@TTf#!fpMpA4%!5ID6u?zSjEZ(#tA=?m`*{Orm=aVPLM}bKxQ%-?iMna6G3HC(F4{xM09UKrj-8rF-8JHj-Z( zoTzGOX^UO#b(obMdfFCzl$6sEvgz=K6DCT}Eh)8X^eEO#NizB#e2a-WO7h;egO7Ja zQGGtnen1&?4$#LFKL>;_wf4?4FbE7PqTfSMV0S<3i7vXV9x%39m=`iIdG)<_@_pAq zZ#?B}BQ>WzY`5sA`>;*NlxKs~*)JeZ5Wj$oODh|5ldB~nslu?QweJB|Y6>A7C@BKN z?Xa%?^&b#yZqRwGL}U0+TG~$2%}m*^EW3XF^O{v7ucI*=sYTQvAAS-10y5D2-BO&) zayhS}bS5MQ!HE^drXWkGfC~!2b&+dSZm4(V{kY;Fz*@GllbS>m&tnXx&B6K`elpeq zl_|oW%s^9fuG39%340N?fGol*Qg{o~N9I*>amJh|X|xiCcm^a5&g-uEXFJ9BGGJQW zr>d&js^lMm?3gqYJi9#u*Kz|#Ku;>p>$mQ!I&{KsZLORrG57V|?>Jca-t)@#c;Qjz zkfMX~>r@A0{XexQ9>oEnaeDl{!714}*(#BH=L>hN1S7+?57JGF0IX#JIRNBXn2;2@ z(h;i81`0{Fb(Pdd!#TEDw#dR{c1M#Nn4@+BYOq4UvU;^t$7MC)uC+(*q-q1tWI)BEy2h^4I7^C7HQZjhUq-nGHth zgmDHO3lXlD(%{a4D$DPY90cb+d$Z(mnc$S(dbHIf^ic1r@|&p6qu7gGDa~$EHZGU( z)iI;E_{GdV=E1S_h|drqk+p9MHzk5lLV8%SPb-RyB%vhfffUgpnWZdt)wsMBKgIX@ zP>SZ9=dD{(!=#Vo@fmc_G$Xd=CxCcBqGK2Bm&-~+HkQA) zF|z}IFAT{d>O+AHI+Ox0gy!absb~~QavQA)r9sXW;*ByOlETTK^-_wo5f5opr^sytOl?yqfJ6P#1qjX? z==%WkY-#(a)=~8R`2H{%4Nxp6hxT-{ESS5i^~-kNH{;5x%2wH~A6-}Yl(YUE+x@|) z+ClHC6L{lXKullwFc(VRexG_JeblxLk5E)rRz{kaPq@1NZ7JEE_}7VPamCLE$XT<8 zw!gO-{L%&yz9JG7Ws)q~xIWi*_8Wl$OW)e3%Xb_s{ov}0N}tEp>>ia`d6H$@f~h>Y zpM#|q;DfgZKGvuG(}e_B;c0hM(?yBRo!}V!)UsiNJb}{AW<3D>Ele?U=#O`b zgFXb9a4XzR6OB!o*XMt|lxZ!eTgPEdj~}2JvHgCf_^Gu(96|!9u)@3}yj7n*coualM#dH;40e{kA?NaOoO$(fmPrz~z`0Q$1Ygd00BQ=iHoyZ~OfeT% zBy5$Z8%X48%HuvTN)+nC6EPfplLhcC{?-Z0&_af&P%Vg$Wtsg4{8fP&b1}*_a~!E5ZKvRA8R1MG5nNjd%F6rV>v*HsY~xQB5?#h zRGSAU7CG2(_sM(CBHMpy{#Xm7?&{old(DNjcY3#|j8A_ftQ|VlPGhDq-Wyqpc@?B6 zPnZ-05oTY-jIue= zEe&(>0QB2(;-Pg@5r|7P;=cLkACA{#vI*$Z)MEt-NJCUB?K3DM+#fNz6sD@CtT?K} z-V=rJ9uM%ZIO?)=#Q_;Zt}R{8mlzO=S;NKghpY2;GVgi*_tzb!#LM2}b%fdjI^=pw zrN?S%b^>_Vr7NLp-B{8s&E*-!V zv*vGc_PeE3q}jyUlv+~lTB{AO7mh};Slmp+c^lsW3q|E~`x0Z=L*8I`RwEk!neFHy zC!L-z{Qb0zx2b9l8^{C0CU4(L%x7j_S5s446dn*K%MJ%~>)~+5x{V(9i%kA)6?YB} zt84Y=lD;k#KreOMEBt3)wB3NrYb;&BnPGh$5W9gSm1^@R!KeM=IY4>` zrQ>KfpcZB%n<*s>E3NsPA$Q*-yVxSlbUNHCF?RXjSH9rsL7xn^!9B)K6`Q{(qSb#{ zjehuNuu0bNU%6zl*|8wH**RO;ZEKOS9{5iq$PY8xxy+!5Y^-F!y`a%!aJtj8FJx?waOj- z+kdi@0u2p^TS`$3&|D<04W@YU^;CmvDSFW68s>{rhG@wMfPLS&3w{p4p_Zo`)|x|F z`T?#xix%#AxU3=Zid;PGKFXory6a82%ir8SQSo7W#jWXUoStgtKSEm*9f_~wK#wdR zjhk;cIZ;HyRGC1(5k*)#nzGnu`o=gILdPL?CRB`*V)_)lPpG zs~yrKKTbEev`7w*=yALPYSjrjV>GUk#fPL+VhV;Koho+Opi9Z~MqeSqK-G- zjfy{H3Z0vHo7#il)=R!|1OE_o7rhqlS{}K(x*O5KtS`N^J*gbGP)U6|iidE&c}NTq zY#n?Q&v$>e z;)7(fih^zAFBORn8td?OeY$yrq#!nN=NRnmHM<+$QBj)mpvxtra2$H=UolJz^RN>a z=n2jgozOKw*uEPJ`tZ_zl${p?c=ibUryE2Lji8oE=X?o~snu`$dN%r(ncc@Wk!u6Q zXB4+LF(a1j1aG2_XbH}AqF$#YkcSJ!3zgR!F-_s(o07f6yxrgtR)xecocF8{ERc>! zdm5kFcld8FG^(UD|<5D8|9!iU7;nYoj;eN_YUqNF%f9^k=mcBLCtzHI<2e^^P#KRzH< zh|}Whg8YLwkK^B=z}4wn$f@&zQm@-jHkr4R<~lw-KHD1VCwH7FDScs~xTIb2v{Jz7 zt`7oQdDWbqE6cf!Y;O-hVYofu0251PDXep!E^-0Hc$)_oiBQjz<>jJi6CH{C;B0{2 zjLi!I5R$H1$zrH$VJfw$RnX%8tkQ$oXSd^OTG{U~l=y7q(iB0l3+Vv$QNo`4#aAwe z4$+AMh#%$Pyheq8^7|jSu2qDd0M=I9-%Tm#>noqqd;8rK%Ld-zdr2XH{>%;Y8m}+n zW7Pj&AfVL6bFm;h)VX{phIzS{EEO=_7EtLc=XGW2y>BPK7`w&`^kAIaa$=G6bBzNSqp>l$wEQ|R`yHi3o_%WxHWO?9wd3NXZkRG#Q8{)-Bt zoQs)zn&W#Mnx8rlLe-qtCP7Ww^u=m-yd0r3k8QF}kKch|T_txefD-O&#l3!5YU5eq zi%~KAtqlMy{Y533;8;6~GAu|Y>$f)St+I+j#p>3Dgp&Aci{pdQ~P}O&g>Qkg zp;(SWC}yKeiAr29jQJnK1^BG~P3?Wg0+BNf_76Th8lw(wZ)-?gc`a(#I*O|`!Z3r! z419eeYy!g5mNwlKY$cn0&KAb*&D3dgw?K}p_2BPsIvHPAVVw=eNuWMAsY?^FI1TNC zwf9`%FUH&3BSKw0cXR>gqO6N4tu5zjIhz>SL;AZLq9gS3wH1#x|I3dC4^jOB3=dFH z478Jv&l^T>zj~Cspqy#QyXbGi?gRZ7j-6lX(nu3CwWbZKz@X>8Xs}s#qz`$_Hs8q_ zY6are8|XEFv65O^iYQ$CP4MmFaG~<(iDcda{V)E27xlw=EsKjFuE(jJj1Ql<(*wLe zI6fc~^I~wVeoF@Gg?+`}~7R!61 z+V0_%tI~0?>|cmmr6NTGJ9Z>r{RclH?rU4VFBBJu+8CY zl{@r`b$aQ~3A(jcWo&*x2Q_nV!;S^0F7tn@gBF#E>4E1j;!VV6j21xZ9KEA3^?;>&56F*07mY^$#FUP1CuW?PWj#9*P;p|uy>jX zN596Sp${zawGv6>)XT&5aw7K~ADTI!Mr0+#QYXWBu6a-UKgvwlT?aVXFqtN#Qls&E zo7EylP;wE6{ciit>@e`LCuoUkOLpT+F~6{{Cfyp$rD2r=z|;NMdN2Z-F@B+O_OUZX zSb#B)lssRu|K-BWo{GqC>h7$3(;f(f`I{wJzzS!I3ZM40X-i>?>&c&{sU=d#mxr?t zclQ7@@0+%L57zqB82!}WfvP7D{ZCd_Brg7PpGvGKTXiRWLMkizkO2N;)PT{MDHW?c z$j+8#YPz-;>UzfK?YZaL??27fPwGZ0!Z7C?RV>q+$oESrBBo;4Wq%E;z#LyPs;>qnVH^*P?Q z$G40ue%Qa!^h_wiKfBhLnegyvXXo>k>4pUE5oZI5@Qrx}o#oY|W_K&p7o?Cb%dekF zc^ezc&h6&XbMmCUo)3V5;CSm@M|03=UeMJa%-~L=J->(mu@}(qcY^fKp9s8V0)e7# z6N9q*01NOn@2^lQy&cdFR&@M8pl_CB*`a{Uq_kjn+3m?NIY2egC;PR`1mT~#W|WTb zJRw`WDPa7(-2-Hh^+Z6oE=xTH9ygs%pmIska&mH_hlYZ?^2%>XNqOFqir;OfDKd6? zyb}Q&Q!J>D6`5wNq8C#|T}l;)1EE~=Q8C~4oB9sz2oK_J?xj-<7N8=Z!VkCp)DC}s zn(0XHcM~vhD14YEY6MlJM#Z>fpq>=q4|cyXf;^??&+OJt{uxz(fxakKJp7|AcsePb zQ)MP?7m;yb^y3oa=+V)tqG7bGL7g#>$8e1SWNOXG1S9f9!SBg>wbXp1XG6HL-}_fq zLfR~6W-Of;1+WAYv_v70UYWJ}s=4xA&n3s%W4p7S{SK4HHby%W&&rHUI~i|{y!0F* zOOUtrYj&M=HLvhFT7Z(PHTMflZ7x-j*j>FO%?5XGw8GRO#-W#Bqf_u}ef{&*cxAJ9 zjHE)mlx=%AHf-m+?sS-y{H~Ce4Y#~Vss&QW{QN_ewvQ{Ir9}Y( z7ntms{*YJPRL{n$BF=-5DoXL)-=JJN9NWremtauL&O)y?8Gv_PFYP%)wa0%{<*2@h z70BT?!L~G;7-h)h~Sc_W(LTf&qkM@qv9lhzr#$?uA5@ z`CY?Wy5fzE(bi?kbAQ)pe6ATqEImLzL~M16k2RaANVG+WUCV|*&};k*0p%C8M+ z9rZc$xj#G_4amSA7Kh9m6~v>9OYQRgMU$d)ZfS$pr1#ePJZZfaxJiR#`NkW``gus1 z@pDYurEg}U80=Krq2F|kC)+C^87SkBGNxHn8cQB(pN^B-yeA(G-+iK~lde$q2vIiVWR=dz#lZs}`7_Ttaw0VF*DB!t-8C}wFH)eZUbFlow?aa6>07 z_ScT(qQ6m87u^c}8}+~W_StkmofZW3mk*;Hq&aY;(_UP`*7JrlgL3$^whQEdQYOL+ zzuae3Td+sYO^4F60_V<_Q)2-4FZ|hRsmmaf0(xa=D8cxm`WGl8#F7#%eKA`7t_9C| z*yrsH=^axeMXEXfg6t+d{9v{PxLvZtzJ=U1Yzh;j6)|2`X;E)z;WYXy4Q?^OBu2M+ zx)%A|>#*g1VCGQ#{m7ejazx;$(32aSXt6y$cJf}(HrioF-Haquon8*2DKLM~WU?=t zSsSyar3$fGbXr|YK&a+=^Yc~2TWf$>kjx|rnE!MLm~mdLwq&Ha+%>6M@?K%u;Y>xX z9AKV#jcBHZR^Z2{o?QZ!QwJzv1j`r@DE7DX@4+!Z{B^2m9A22MJg`hqT ze;U64Y$@ZC7+u{PS8NRQ@}kX#gMN8DDmQc0f`9&uzE&tR-fN@}?_q=RIKxCx#Ts?Z zZCuvxNPpN+=j?xfnAkbhvW_?{m|6QovA}FO6gO)q+ZTYQg(mZV?;52CH%+c7OXewq)!2mCr}sPH{+J zi56nb_qK}X@5DlI3H7KO2(XghbEDIqSG4x+Ti13PI}U+gRKXRDViNfqWm4MOZq0n3 z1GF!os+e&<=6-vNb(KftiPg0WtK2Ujc8~t1g+Ch5V40jsVU3X{LMsp`sQpI8=+X3x z4XGLm|8Nf2{99mKF2ka#qrQKFKPi9Isk~IFP&9YvPGgT^MO~lr0F=@SoXdLry6JXz z>af9t5Kt5c-La0hiwRTk!F_u3`LhaBB4DVjMz0oC1|IS-BFFYup7Gy7F-yC`t}=#O-Vc3QCCPjfTVLR&7?@1Mqu(fcP5rsv~VK+pqK5CpRj z{Mp&sO%5Akk!G(yRarY85H9t0Pnl24h=XZLaTS3ok-Gq8e(Mrn^UVwKo^uh3u`DT~ zS;4R)#qr@Z?(yJtBQ(Oy5-owyVd9K^qq(uM^Sg~*4FrzZU7-vQUP+k%yW=3y>U^3) z`ea$wo+9_D24Xt2Vni0BN^S924)v_=gmU4YGa5`6SqwnQ)>ZhBp}P}BYjh+KQfhqh zfcU+vp7-S}0Eg>1hwXK3Qa2&Uv?n$lED|rO2Ir-Lv}l93#`);yLgn=}Y)HyWjW342 z`ul}=qBA>VcaQ8_%SXYg+|RHZ38EuLC;d&H_-8GoXFbZp(A$a6)v=NwG&=v%HNRS$ zK=;9LkK1L;xi7p1K<;(MrKNI@-lfrvxDCS4yqPz7jG)}cLFwigRzCxi27hhvH6|<9 zzDVUbVb=tsKSOP2%$j~@t)Ye>TeU;}5#seI)^j{2#GXz}Yo%r^OSiuTi-Nh+3uALM z5&93Z+RR8X`~buZW9ZyhkZV}8yos-ENNvN9AQ?eIL0S(`vfXgpbLh*6Sj3eAQGs48 zWWmv;=2pB$f3s)8Sf4mEt(AU|&pvy4d^soLbdnNW&9~a@{;Z_Hm(5&hVF40tJ<;H< z31*3w1_z}TfVvyp3-M-F%OA#yE(>Sr=Tdk<%75q@AP{HF8`K5+ulZo}3EADJZQg7T z{+Rqxh=o&Dx^h|0NyUM*tY@Yg0!=e%0Zolc3JQn6UI{`mx3a@$Y;26s%IhX`w@Jom zXYP`QfD1$o?n8pYw_TODrJvfZR3r72tENqTAZUqI1a{-#zi*Z|+#y6G{@d$xhIhsx z_^*F_B?`D-)RJ5VRmK&;41ZtcmU^;pM12x|)HJNdD z@F8Gcw95K69LFdy>ffUv4#l8Bp!^>b3e<8&fKH8$>eHLL10)1K6LoPFDdgwKf5{Yq z*Kn18*BD99Is3CUW@H5ZHm0k4+nl&|R76ukfxEvjbTX>3o~!ViXh2KofBD$Glg=DP zCPFFZ+y?vmFi_;a?HRC|g_wRjjS~e+dEo5I46~bVYOZ#y4n15jW;eQ09c7rf7uP!TucVGm}x0^9t)XJHO@QU%SI?dy-nu1@#y7Y`8}>D)8DrFshnZ z^bpP;h&`zACt5NRIJ=RVVt{ig_i)FCGtU%n! z8G{{zbW7f=Fqmqn1wBX-)=x!_2*`B?y9n2pQ%4vw3pN{Wxqi0-WAQ`_wRtA4znuq! zt2sZ>H?En&0>Y<>-u%6Yu7~K7(2^H_>r$rFqmyZx;2u$y;BWqI{!ucKl2w$ldhTu% z6aO1y6OCYq5IWT@n(gU|LuJCv?QT6a(OXZ1zvufe{o91`H>6dlB|LqD^)PqGA zI~6;GxBTT}jk>SQlnl|Ft~Z>Piaea&jele>R}E=!FDuxA@E8MYu5>yXDt3iF3tbRk zT6t26N2h#&=4V{c&;*cX1QA;FhTy{w$fM4M9rcBbwQ+OmTVG&+?%p%*|L?3$Pg zNO#X?^B9ORnt>UK$-g`ck3nqma-n(YQ+KNB1&-_=u7zYb&bY~!0kh25d3lYyPIZ4Y zAO*^3k&nB74hN;`f$eQaw{v`R{0Pl4F}BPFajzrN$^d4)!yDdqIpL}VI!<2koJ4w z&)a`>EIO{C>Kz%E*6jC zZV!YrYgkRVn=q3MYu&7tfE)ASJV-cJdQwd}?4T+#y=Y}`vbVV7$lvA;NTj(-aG?#dD6V_bFBh=R zcPa#e+_nM!!|Xa10sE||3vs{;V})Sk-mtT*Kpr}CqkN;bQ4q1n+hKYH%~*b8JhRB- zgTDp@9<6&mETvE|Y$vxOP;*YM%>VXIv!wn69s)WzxPvu3rM1IC-*noALn& zh|kZCkjuLDXS>KHE=*qT6KoXSZ{`Z>G>5Mr35bmTV?Xyru@4%Tay?E2=bcS4b|oq> zdGQm!TZR&7G#c|{!OGF@>iD*?mo$BgYzsteGnhC$xvg_K{=8Qu{2msv-!u+HsUiqW zHi7}f@0$}5%c2RjlC{JD_jr)3WxR$E_NbCNa_T7n}pa}+(l=DHum^1-{^%eE@C z!t{s(27wEWYI<{uuedMy7dB^e#0jzXfM5mBW1vRE_iBJV$mQQX`#nN$dOqZYSDVH- zUk4L(r9p;%75EyLRr}>W^mHuO1rmc(*SCLQiNnJcDdDCs$u3Zz_1Zj1E$hn$x(ecL zrL+cg|L%~1cVJ_OTISaxW!8tVaq1meIWVKnN8hMJ+@UJ=josg<+VOLsz+f2mgDQKi zUvv83|1|pILz75(@Horh{Z+KNO5Kb!E83M9KBNqW?J4Il_faUi#ZII7#Hn6~=@_;kAq2<#W6 zE6xbV3o18LEgTY3#>u3W9z=n#c#E_qqXxq- zcaNZ9T=#yFax-x%O{P zE-t`hYh83yWIT)qtY3q=J+GW#6uw%#VsV*DJBmmtB28Ahc%>j+S%~gr0NavSYw>`- zlunG1cAF}tDngkzMPrDghl#utU3;1Lph;hWM(wdXmjYtBUP3N>i%PDF72^L#Z9Ow@ zq;X^~@@Q7^xFO@HFLnEyrTpm7-k9klZl$=nkb@1Wv(?CxUrB1YW>U6~m#7I6rDM-9jX48cB5fPX{xUrAmmSb*0?&Sn0raP3dZBhn=M0<2O`UsAUav|4+*oe%4r`7&5wzeyMH36*Tm z^pcBP);tumLb8h!e!0k~DXIK#*MLIPr%%punJ#GpG@6qU_k}KHGz*L;N;J_ao)>uK z()BVPpn#E7o~RzVjz(`TZLWM|iAmB2_641W>)%Z)B0}vX|1)!4;s+)(wUbZ`bBCl;9nzRaEc>9OtEe%Qy$L*ked3RED%Jn`eGItMQAFp znYzIRx&K`EDpR^ql5Y~H;IHOVv&+M8@y4uZ^lu^U&x)=bolNw0!I!@d*n${a=`qxt zt+rRvKI4Gx+aFCuOqtv`U&mH-+p&(_YgHG{+Btg+P>12ba)BI!B=$=M)>T<@&-;Q> z#MxD%17%xeKSUl(@X9X{>C^wgT9UH zB^Y**sY3TI^yOq*s6Dp=NG@}2clYhs(dp^*5EypC`nd#|FsXuCG z^qjfbSsv~0{wn{G;4Vi3p!tQ3S-NM({wXu=(AL_vDU;exZ3f=UY5FNWi{DUy z)J}Zb9xMKMeon!acUy9IpDn4L(UOXMoeu{ZY{KP|Mx}G}ka++0nVH$wm6}l9cwYEm z^Yu#oDh{vlcSt_s?whZ`Nj732Y>(o_=!4Xqld#d1_Mrh-nc3 z{3JbTFLMR;ZlYZ!3Tbo^K0fmpj&qPJt^|Jq5FY+Y%H}Z+gT!>FGI#ZFZu-dqUn8<* z#vODHBC{rm8jWfAS^nXbwv|W?^M7*z!Ysl$)s*3!R~iR?Fp3nUl!Ivr@EduHKEnCEkZ#VwlI;M?z4kWO{kMri35S)fm;7m&ke zskD>jH?P#_(;dB0hN(>)#X1BU%>^@|FAS@?nLYlLlH%`?%~G|!R` zRd2H%xGoZU@IbUXd2sXpc>z-Ldvs}S??_KIxYvex#Oci6{Z?;272jWXe^q(8o3lJ> z+QwS#Y|Tmj-Mfz~LRi%6Tv~+BQ9^{_wwwal3-*YZR5Yv%p!LXYASs_z$L?QjAUF*Eg29jvJN@akqM~?e{tVUo|X6*(_FB=!Gm%nCb1^5I{{BK@>75agY zt}qY}5~NNjBKPu(JbX9=?3|IN4N7%9G|uMF(XT1@oVEe;oNpgqgtJCRAuho1#+Sm` zK|#kGzkry%tb{Xb*I@+^CB-IBTYU>C3tt|y~k9gyUw&wA>NLksmnpt3BMK)yh=w1hnw!Z zPY>okGS+;ha{r4xq+4U&caEX~VFJ3=VX`H=rdrY8Lhf;BETpiGI@Rw6WceBSTZ>-mh_8yfB{Q1M0nu7645J=e|%h|+tX z`OZW=oVTgH7`HLkW9kEqQ-`q_W*LjVcqaU|_a5JdOMqX*@uZGGzH*2&+QQN*PNlkh zSaW#{N`2ZE4As`R^rD%JFuICM2h?cWX7lkY9d2*}j^pDaom5o3SH3d2Vi?pelh}a> zviwx@3^mCSyKo=@Za?5$^QF*mp5t1aUKmy=094lgnBmWnJTC(3fU^|^wT>b`3f|47 z1I`&4{evn?30ij@40{s{ni}^@zs4X*PhPmA0cjv`20^?z&sSz**o5TSHOVsSkf2`z zD2P!C-oR;MdVPI;_WhcoJzu*pyHJ6zV5hr^!Qgl3gp9wju^p5EKk4J-wq>$~FzKcT z{kmK!-BNZJoQ(@VJ}jasR^Ij|?tVeA&B(CImtxS4!dU&`ZB3xXJ18FmAsMgc9?`~q zBXX#~Clga6iTDwLE`qaz-wLeI3i3i+(3%`j56r@o{`=-PUgmBGXf={AG&jE&IH%!g znDX!mm}>(e!W4?xi}-$uvA<8o&Qu08Nx9=(|BLrb)UCGFrNj`cHYEXh6okrWE0ga@ z#sT6p&+lq#30(Z=dwux4NFX(vn=p(5I8%ybP8BDB)eu{GA*Vht3lY!Sg4+HqE$pYz zRnS87^^1PjF=b_SwA1$De`^iCm?Q)=FO&Afky=(u>L52w{`|?7lZ9BCaK_K)pU;8C zc|z+m?4$Z0l0YDtd@!cJb?T4X73V;$i6;Hwrk1ORM3!(0AdGj+9J{?eiKv0u`5*-g z6A;t4^@kfPF=J+kACrXRzcNEc7Xt%XcT)wFz~KUFyPJEyZoiHvk5}ieeZT7_^dd%T zGrQTU+Hp_;$>LT>yORn+wZhGE3&bBhU{tH_{u1W@bMUTz``PEvyTbs@BhE(+@m~mL zeB8>K^6S~vmovh;7$fjZ=VU(ZATTgc-&mdc9%IODi;g~R&wO)Aov+J(a65J@TR?jw zOa+U=IMz;7#M{Dvd0}QhNs$Re{{VnepC{^YR1O+BWHiVH1H3 ziPth8zI|8XX9>XQ=BRT}Nhl1q%{|kO0H0!s?j1#J=?|uyH--u()>46mN(h9g00vEfY#TcbUa_;GjHCV>hge{=MKC1=#? zss}};kW>f1j6P^Ot3WGfvww#%w$QwG$sXK}D@)J;ST-EF0(=ZekawF!R9Y=?pjOOD zVLZUoa&YH5Z1~bTZ1S#oK^w7@5$973vr671E~JiRj1lkES-_NQ#}ZY$JcI;tBX5mp zjrZ8`R{UexMdD?+X&i)JIa`GP@Ir3jhce%9|Ga7#{a}* z-4mXnfxDaY^9^Ndt=rE01Rh0{4K%K24mck1O8pbu6*P?*O9Xrl;5d(bQ~F+f_*4Mw!TCxVM&g-M5T@4K9{A;^(-wSwmhqV2tz#C= z39E>`3iqrL3qfJf^_=$rLfJ#-E1(cN7n{(IKnvM7#7gAo^Dz+=1aI0fu!?>dbWH<& zi=xY?B-d-4m`*C%FtG(mLB~5Vh^rug!keAQKl}IS3nlZ5!5*U~YhqP}f zv+cr|!iO0^QYg^j3^7#bZLqtq#R4pbCx~Rb9OZBFq%`_AhcoA%i;}A1(_FsJ`j1_o zN%NcKNq}ptNlxzGlUqNYXO&l-`7oU6XgvgNOA9)15gD6bn9Hi z5h%zHRw2vkk2Vs_Y#5ll6|F0(tFiK7Cjd}j%HV`M{%?H}wYj>gLN=artsu9+*hrkN z)axtgsQ3nOioXXk#;x_Rmn|i$xCgvfN`KCDr5X=MZp$59IXHmp zBDcn4W8j7W`4=q^|E*>$Y@?h)0E(lE*p{Y=)c|C9>t2krTa=I?0{#*qf??NxQY|Y; z9Xx7*?-tPe^p>2GG4Ua(y)s^SAhS@3Jq}7 z28J8Yl6}?!n5gnph@bYdaF0@fKfqXEWtAdn`Lv5^f_C(U4md30uQ;F{r2l~{%d{?p z@N3aCX1w3}L#ui;glfdtW>z*9Hyjji1av+JhP=E&=)PwAheC;Qz8qY9s%H{l-?G*2 zK~eyA)9K1gWM*^V12Csh@jk8!ywMJ;F|kJ_n>>eD=sJlrrJ?6FK>eysT_6S~4hEK} z`ZjYaS_lM*f2H20212xFuM`w0g;7^Kj~OEux0ep+P(u$w zfqKXE9=&Q=DHZv#U4BwkaXL2@ep$OUijH7cN>xWS^b^J$0LG|0pEFr|E4Gp6>a3w; z;><*q8aO#*wqHs{5K*Tn^+xFiy zU9_iVF5t7pQH;C0ja*^gl7h=Hes6QfUMr|nJRG41eVsnMIXxGGKXIW!EV zuL?th380ul;Mityc?zIRCU-M~rXpv?20><1keG)vBk!X0>bENEJ7W+2{{0q9i;%x_ zXMXVI#(I^P9C>wZe{FxWuF{o-57ow@?Bsr8Q*bc3v_`b&7E%M-;j>C=No8f-uqi{x zy=(HE^Y!L$g*Cu28yo$v>R-P&oLyMYphceaKjB26$iGAC%>(tzQ7~v8pMXFfUnVe1 zzF=>~*EJ&{v##I`63i9$k=IrKaZQ648&3)TS~<48n#U)66>Y?$10Z)kF2@D`vS&Zv z9!89fdN{qO!pTV4RiKVwIRrh}1?7KByKK$PW!90*?tmR{vd<6hwWJbNf=&*t!#5Y= zDPK>BWG$f3=H)RIoRFX%wmoNBd=C2P@Ax}E?GdJ_>43eZo@xpFzq*?1dgt#y_tuuYvJ%WkIP-xh5Z#$<^dRrbWeqRSUEe%H>6kp3uRYoW4p@J_ zwUpl|-P-ZItveu|^6C^g2EWXuVQif8>u~#-Jz7Cterh}rq-8k0SBR-Pug&W$RetvK z=xmRAfl|c#Y4Ee3xH04KQ16gGw5G`2z{szyE#H7`JAx7P=@rARqP@ySAHGtTv8Gke zX6&D&8Ffa&tb8(;>FG^t+bOw^0D%hBS0kb)?vee7$Edmye2=$RndHzvjtY;W{LG>2s@ zv6)vv4>jud8fc0!U~MyCnD%_!``hr=>)N4zlu3$j8v_gGv7zi9Dz`W1Ku_EdQ#_lE-)0eR|w^42)W+uzTif^Oo)m|H;USvo=ejDqKNAelNNqc7E- z>x=y08zBAWvH#qGd#!vSdah*xvDE>K0c7CEOG``p`ytH}ip2;j@lA<`%E2@%2qgIU z^@ZK=wF6O6(HwFngi(n7lYv+c^Wnc)hm)x(;CEnuR>tSS5(&2Q_B7_T!ka(iaOvTaWt;tfQw34Lm+qoEO?w_KpKMu2>;k@c`y$~9PdPj2w9L;s z_FW^7#3m1W!V5?+rNq3XaRYisNim%ukrfDte16fxfS|e{6gv}jTJ9-wkwxjj^z?km z*u10pi+Dl%l|cj5n~BpisjB$M6THMywMwXwc-B#fTcvF_f{kIJ)fDakAHy$uNs zb;Fss3{_qr$g^EVZREtVF|~!$GrE=qns@m8K;}^lAgHZd#i=yyjoEK|)2#>Jd4uF? zbt`(p>PLST4%*fD$9H=^zW>DS!49W9wYj+&`21#8NsX}yZ@vpobznhDfxMf4=k>d) z3~ToeT%uoct!=DY-VbQ~9I`!N=bU*w*Bc?i>=PQSbtPBC#n^=VY80#ic-Ub~Bn3g1 zVn_0}aqCxk&@T$`$;ZRXa9WK|C#h8#r2e`@M<@QdbidJDuqXOvPaV+A_o%D~F>2_( z$0FGIw8KTYP}*(;Gk{JxQw9_*qrq{8KMtdO^MxN#IN2(#CdS7-NPj0LJewaa=S{rc zo6~Qd_*s?Jwx;~)gmiSkZ_j0Gbwi>cB7AT0e6?vjz4KZ9qC6|qm%r0IOy;LZC_VrD zNcpH=2;;kR1B^d%tR^LHqsBi+v>q;>ET4Rd*dKLBpNL$yd98o0H&6!Ped`7UgoJ!* zRt497X$jq40sd-$^b>K~>x!&Dg?G@TMmk3xAJ~JF~16^}ux2ZG^}} zvln}Iwf_Q7{sNM%JE8T$p`w_adFx?Gm!e^V~j8SUa7DV<0X96m|fbb7<{ag z*VodQrcIWE4Zk>1=YY1Ye>apcGAid%r^@&2Uspw|s{ty@@RG-O#G|p?(g|AXa>-+*Ooh) zUkd3fbK|{vfi;GHu$!E|7h+s#qKO~U553%_p{v>FhX?nj{I^MCQQbG3kTHm$lUqvs zNyIu+DS}N@#u< zV08SnKfRa*q!8bmSMQ|HZmppGwl~+RxRMz-U^D2;wV)2fFRHKDoJ4P<5vnh&`SQLk zG=#F-*hql7=>La^tFO)V%Dqhr=$L|i`GWt9Zv_UT-HX*<_pkRzUlSI69H2RL`?Xpx z9bU-4+aXWVPKrQS+*xjrCP2}zd{h3RrK>N0&wc?flg`uQ&n>vEf1{yl^NW=i8Ui^F zeiuG?i3gZ7TzDJq*t1sXY;k}p6+j&N(n8Z+^+rVE;>2>wgP$d7gKcw2Bsjd;(T zt9j;-y9x^kSaIv*r_y#kN*iU7XUJ{^2l>0nZr)){Ulw0{!J{A~1#18fzh)q!pdF+H2c+n9bu)^9<-D`pb@Qh5)dqwxLIO*4pqryFZU_lV)$`|P*MI>xD zoF^`yDpvd=E%Ey5-^Ih(^}{ez%sA(MRe6&Z#Sc$C@OcjGjXwo;2fvHA4Gj!Dm&g<<(fVi zcOAl9la4!QBzdNmI3Ym=>5FE-*mpTO{ZyfqjSc+UuXH6AEkA3IC#?pwT(MR;IAB>0TZKWNj9@}A!IqDx*%CWE z$HFV|`HbIR#=qpOrMU$kZT)n*Wwm`&9ZByTHo$W`&M^c9h7R8LM@RW{7>)O+H#M4! zF-(CTh8O6U_WTBTnm3D$$~<^)UTcGb7JO46McEKNWpmPWngz&fbjg%){H2MHfRGQ!Jcxc*)Ij3QE+uwL4@v6Xg z5acfAyYA+~#tbcdGklFc=W1+HTu*f3$MS28m<{h9RaGEFLcNrO4mY||DUp&y5&sFM zZ2Xs?#XENe1Hf@EA;+Ynqrr@vmYkuvxz%m|oQs11tpj6py?CK#Od&qQMlr7_>i*PQ z4?O;hMAMUs%6gttX%3^u{eqkT#$Hf6G&Cvps1q0*E`P2=uoq=bFO zUBxOHNQrn_OSFatcnIp(0fL?_&FJhmlzCH;#CSQ>FJ$Q!v((xFk^Tk7MxS`#XZec} z4e=%lG1*o$@b6n~9Zi0V{)0?Zce@pE8ftIEcIH)Y@ZpK{j+K78!{VFC{;o!ypoBk} z#pO6BTqv^;V&t^b#TJD3&#yo3ZwlDxp1L@4=3JY^cksK?7F>DD^&9@r?hQ{nTiw++ z=(SOAyII|S_19JLBRVZ?I()K~>x^=opk|uQw0HyZI#@0Vz^vhqH|tG1kJ2^oa(!tD zdNTW@UzVg8TcK&wyd;LyCP_I@ zsJWz)>)opXsksFCSmi>Sos6SAWPYozqLWZaRMTZIN?gUHMW~#oHqBq#_Rs ztc*ss)b-?O2ojrIKTg+~@qua+p?o-b^@E#NBoQ2b42*HY$G0K9ZrKD9I*vQ!$pNMoo6>x zW%nn$*$WeZg1@Nh@kU_8p}p8pmUXKOSx~Ypkec;%H&y^GSV3AI0fI+gLg_n$Uyq&) zHQxF0C5_Skd$?EYQx47Q%;PQENrZI4m6WTj_ako5(XomG2Ux1QCspTI>vQgu4t~7F!`Rn&wDI$&#*bURM~%z}56Wm6i+)`Hd~weflT0pI zHBJJJzi~y)AQCeIO--@#ctrqMH+{OM$?J(DH-?chUMc|P*>g@U>Jm1;G}JaT0Qst~ zndE}qubLUZKft6O7TLUndwuDfvZU^yIC@G%^;Q7YgSn!f0MSFACcLGfNXpQ z0w)k?apvPb1yCOEcW0$Cu6`5RGf|qG3QO*35UBghPlq_EN%v;|N2kCqj5I#B#$s_5 zIk-jUzc17=DLC9W)aelyN!Q#y;Au-XEDxj8O$%6=P?_EmD*t@{KMTN@EEXHPM1HWP zas9>1_$#s)e^ePf-L~&XSr$nUH|fc+`7d4)>mrNC`<4U8B0$MZ&NPg@3T}8DYlL+dUwfT1?8OxK{=<=|;$%*(-&U6DNe&hpKe`yNH7JZVOe>K{ z$n`Lkw(ydD_v1VjS8~CKt#S$16suQc_M|gNZ6->jkaoa3w!Or!5f~YK{OvDIHDbfA ze!|c4qNpzBJLFqS%K;F4uO{!gSA|RjB3)Lsz6B{=)jY!lK5wwx&hf(6b&m)z-zeTYfCF{1JH-EGSmljEu>98@ygv9nH)V44_UFE zbQoVe>s>^OT`ygpszTMNza$d05T8vK*B^5iKF9|}vCgA3z=19LD5G|G2{-TZTb@UD z#j`2~Mc$FJ6XYB>56lW($sp~#QA&ycxcT2S_3Nh~I#68^s~v;raqR9S6~TMXF-E}- z{X6L4x?7T477&e=J3-Cz$uK6($n~woZ{H#+9fq5fuF#4ev0Vy5-%5cs5E$7Tq%0}B z9zvPvbp;PffoTLF@&5k2cEnw_oZNC0dy4QG0>IqYf`MH+faGj~6m2+j#~A|gOfl8O zFp9wJ`m$u*`9*b5)PO5AZX@W+glDEy+vnZ=S!=SpO4z@evZd{3%IsI!+hO3UYOl$> zyx-62V_Rbt!C8B+gOv1jfMrE_I5NQCDoScb#r}_4jd^u%Z!a(kncMi=KOA|G6p$el z1uq<@GqiEYJ6GJUDk}pn{UX(40RQTuW83>%LmJc`xZK4_P-3mz%VBG`cX9fxHaBzya~7y7NdFXJK%|>=T&|JH1NnH%1LTO zEeMHMb-Ck&Hp$~)j8rT*1zNHT4G$i5_Fwtc5A+E;;^hJZ<5Tk;1{diUd!6X!!`w+N z^Lt4bRlnjArlH;Kmy;Qtz=CtKl3Dk;<9r}&Vl#UyQws|V>owx{6VjIN@^yg<7u^+k zQ;9?(DF=XKf=}7&@pV18zsc#%*8!n&ItnU0sDc?Du^e0>*bdEI2x-rYW))$w)l=?Gy80|nyk|S4 zQjGt1Nd#Z1qhsarSW}hTpYQsE*|FF!6+FB5vHC#ib(;fZ|LZ}^zuwcs2O%_au$PVx zd9OzC;P~`%)ZGMa^}~gqgQ+SzgZ)kLgDNby<`hnew$H&c;IfV0ac=}0@(_1j&dms4#b%?v&F`c@9g(uEbx%HHdG4w3q z7>O^UB~dj57`W2k4jOS5RfnXtO|?N!@j;UZx>5_qCnqQr3avzKaMWFf7x*Jr4E;B* zn%qY>hcaP>?~Lv4l;l*oL|5f#2m!_X+`E{1`IOQO-Om$cC61u^at}#n4R{BjV*yEZ zv!$vWtOX7(et|EqipX)eE@J{xt-l2AZFISCf8E~$qVv?qeoM-_@N_hVbefQ6LA77e ziY|J;U?J)NeUUIoH?8JXSP{5Fq~4m9QrlQ@j(l`+U@2r_sj#?EwV>CY@KUPAHL2uh zj16C>?l~P@zVCu1-x&ePPFAn#evNBRSp7U{Q~g5u>SE--)bznX%Y&(oEP*hp!wKRk zwcI*<-%<9B%HBdT{fpgaS@0UIS4Vdx_kMd&x})NzP1^<0!I{`B%E7}85sw5ZfFKbKzOQhq$vBxHn@SWqoUT+|RW8vRPBAE*L9iL-@~Z>^8m)4V<5bmyU~7}_Gi7B@ zh|0Z>^ffV?O4a}-xm3Dm49;$M9zcSOs!k1$Ur43b1s^e z>$aq5UCp{%H#)wxxj#P^vH}BU$tCdzqrzl~i*875TWC;zeTm0X)$)Pu$oPc1n@Gk_ zKiNkeeZ!UZG~Fi}>^6J=MhF4!Fai^mkqR+z)&XE%Udm~$XOedc1n%vKXL-Q;jjnlX@srZ$p2lIMh{2W^ zzP2IP;xQhLKmHS8Dx&|s?d|P7|NPd;{LyRW?|1>3;KH%B{(2|f^suAtVR+A%wk!)< zv>+1!3RcTaDMIA_rUHT_bWW3U=z(Xwxw*%JUzl(B>IDV+l~_&{XHj}fOG};j6>q5R z-=`3!nGLY*fXrEfysnW7uYF9T6f)sTm&>EqvHs-WJ6l_Sc3W{(Sj3pBB3l>*`v*FM zt|P6DX9s@Uv{v(?o)*{}F2!z5Jzkfmmlv5& zj0?JHtE=Vk@RrZEiTPt>ikxiQupiu>2n{)SspRX`iI?{b$S6DG$irS%fT`kY6#ih! zM?1*B#VpLf>EHfpXKA&BN_cV7(%PZXj&i5jbyik>zzmRQgKU(7{4F>->Xo2;c|mxA zIso~sQMRTdk26&Jf0dUjT349{CXwk$t4B9Gf>wg7k2g$*MvKdy!0-A5e#L*DYWSoAutmQGMMrkOw(H5@!a~kV zx7z&mW5c{;@|>w-RkSgp0`=e+#{7{Rm4FD?U$BKRhf{=N#ENa9DnUWGNp~0u)7SJd zY1IT-I|E*GF4DMH+&~S^Sd>9d|CTj1B8m(uO1^92nwyio7^@dk72N(wQZ8_ux znc(N1O!4q2EpBOAx7%=U;wfqM?bcW);R0(96;+##%BEd8*#s_o)%Gh zq2`BgF^lASQk@z&)aUU9N8>DQU6v?d4&vBAprrR)rrMaNh>W6o8%V%05|}|2=bpdI z`YkuKew1C~@sK}o+|ei&jsqB_eN=h2Lj=@7G_^qaia~uZ{_wffmZM>V|LG`fwi!sO z-ExqLpBBJx0eqEA!vV3t=lfG#Ur!EG@wk&;*?3TjI$g76Wr82bg(L9%qVQ2XvTO)+AH8&ec}PbVTg} z`9XkX{ip^@f)A6R%}R!-0ffoe@`7=#RdsYD0KVu|Iapbn_-s5zSE6*;uB3J>tk6v( z>6GJxe$L488$+i4mP328lJuhTSjF`QN48K5|+?8-Zmpp~;kI9V}1pv^iVLg(48>a&@M*jIab za;}a6KQG!oKiupzIG*BMW3E+EHPwD&s|LAS=!G^mx@~M}dOL1?xf*W;j39>C6xARl zd^+lY#h8f;m0Jr^Pt@fmsEF#Od$Z7pla*dxJyrg#-fg;-N|e;}_byMcnT-MUz**rX z2prqyIw+f*$@aChkO35RnrL?G&PW#upbP$fW}nvqHmAakNF$4w0L$S&+t2FNA&OH7 z0yjkaQe2dpGfLc~e7Qc*7;kB9#W~RijW_&q-toR5m|#i%JNm`N4dnwtSu9CQUZQhy zq>5xLI#qvlAAUl8s*=!D76bp2FWG(Q^mTvJ>!iopT|)AfYJyVleft^ldz#C^m(Upq z_5m)D?>-TMzQe{tVY1DnxP0qBK;_0$Hm5YgdwVS`=i;;GNGi}5g~;@Rtc-E>IwY>kjE+LxI3x* zAT+Tifa4Zh+9?%N?qL%xmvf-ULl@fE&CUpFfS)A1tuu;ENZsj>j|R7tt+3QSt-j?3 z(gvxsK5dx@@tN(ceSx@AEO0W#VlEqUu;cOdr!wL3l$#j2%23zV?MP+`)eg2_Ox1?hC;TQi&N2;(-3{J*ER; z<`H%3;>9eBWm`aS3@k+3%#vUuuc`se^fbn&T3}xvf19KnvV-~;=IdLW`MmG82cXd5 zW9lKdto)oofOG4SHSN@(y^JXHbA2e|YW)Ku9uhb7}ey)fQ- zUcE%%(EvKj94u1o z#>N;&)h!OS#9CQx&5HNkBIfxQ$=gW4Wxx{)y61Go+c~PubrF5c4zNrHc9xQcOD@CP z@d8FMtlIvs&g<=0Woa-{_p6eyK}v7Hf~~M(v{!TR@HUsoLpLe*Chb_L1GmiH(jee? z>bz+ELEp+Ykvh1z7%jl;%h?ouk&~Cb&XZS;y>0BEvo-S^!w+~ThS|!7#by7mGrsxL z=hg1(30DhlvG9pvzPmt~T)3I}19tHBxFgs)Y%gH%s zLF(Rz>l@p1+nuEawJ;_yL09?#qx5gmZnNCQtii>GcMZeHq)G4jUJ;_=%R)C6EH_=b zydgHt1}*h0`$vSCIM3jbGQk!E_&aW1lK9W^ez`aZ7n9^|5D zYTCS&IruZ-s=Z15!Wl-D!3K_rxFs7b03fw*Jz3GTJ5vF*@lif)BfIqs@e#`n zdw0&5o_uv8P6Q7DJYa3qW8=mN&x1NU9w@TjeaTni!0J-66agHHN*VZLV*nU15@RA40db9~{odtr8HV+pr7?x9?>H9;Vqp|oydb(LqH*cqcmbH_eN5Co zZ#Hz{8yJC9I1^?7@e7PpO~y_~1Rt#Bxj#Yb4sY89tA++_>YV&d71pVygf;#;XBTtV7owtj=Y#_?Xud;IBDZ_hTOsXAy%c;V|wb4RKk0jR| z_2`VcCX^~J%`vQ?|djce`qT!FF|_xXfk?j$n#VkoDS#@;huMgA=Pp__MXwAFqV zmeI=Xyzn|=wM0)+d6kDq{iOh#)~B+LufEsT5x^V#63l#e!H)*mkL-L@FC||p1lu|# zYxW`b*Y60Fu*CC3mBD$M1NTCTSvERVk6r7Z!ZhyP8UGUgWY`$mX?X6DMy@Z)$Zdk? z|0BMSGiF2hN#JdfAS!@$5)`?6{RIf!?j8I!E%qKjo00(w>8XMRD{OOxGzR)VeFX0O z@M0zyqm)3zq^m)2YnaN{~?jXnGu&C~gqUfbLg_(Kr1t>7sK$TxE>A(i6 z(Q=~EMfNYqqw1piYliA=*kbM&@Z(ecQI&NBbY*_ogDi7J!YR5Rp;R50kl<~~U!^mr zBJ0hqt*n1P8yw7t^`P7vJ;~|nt^TU`DDVu4lUGsS{ao-5rwCqhNqTT&?5kD%(u~$U zXBj)<_R%|x9|*uQh+Sdo_uE>zBXGE|8+o``THp!1n>+!$`F}inT*b8T-sB9`7IKLl zU7wKNcBb)AlbPL>Q{ZU(?dV^o+Cqx%HXWOCnRxe7=4XKP4uTwgtZG zG0+dE0PPLeWj0^_J#_?9F6r!cYe{7=M4mmfkr4fW!{Txls(YmK_k^Exavhfx^B$k7 z;+u#Q>}ZnH$jrpH^1seft$ewQrvAoxz{c8H_5gSs(W2%Qe`70*V=GxF7W%|3wrwUi z-Z0x+Tj7ivtXKvFuZ;GM7LX@f`TH>b;Hqp&M(# zf9Qt@Z!lOaDpuQVmTxy0a{7mBlz0>mBTKZuce6SByLw0wMf~!q_~XuzgPr0=kz9h$ zO7P_N@3R+Q+lW`H+_@tJw5JJ%f9N67Z$4C!J>|@p3}u)0@gwt^hE}@(`t0P0N(ufv z=?Op+cuY;XsGRw#USsq0`anZ&+UlzL8E~;bki+PSjXe@ID43*3f(bxFPxp;ib2dcm z?vNaGMm}X=D_AtHs4S`$D~xY#9pyfa#Tb%yTNx1GnZ2+z5PD{WO_?{@)9b%i@@uGk zFP(#vGjKDZ$;FJ@5ZQvisBurMrHZ_mkC7^**`t=q)^bW1LDDNe{Gy8vvepu&UXx!g z^->pE1akQV&J*RGGJXQ*i>hTo?UN0IV`298`amar<1(wb8HY%(*A7@*8IVIeURn8V zYRheG+=$2V#@Pmh`2{_H?z02Tj<0a`2+l^`Pu~JYvRmI`WfFmZ*2x;}*wfd44z#W# zM38s<1w`C;;l(7e^51@55g{QZzcixwV@&4mQ$K4 zkmcBDCLW$@uh($fV%e_6pIBn9tuU;eWfukE1;-%9xgsuM2@4Y@)h2A9D2QG5KFWtk z$4QTc?P62s5HP^<;ixBWI9R@BdlV~FMabAhq@O$p<{Q<+P6-^Cp!EMQf_R&(`o;-fNzC3bZ z(o1iCQb^Qgs*KfGMD@?w6c}AcLHsZ7MOvNAXuYRW-TUkCfJYjY*{`DL4lBi%m~1|qRe5b< zkAnMwtu3=)hWy*)N9c!EJeI>qF?p)X+XTGjB*h+;drSY3VdBTTXuAUG^51>_B!z3& z+%vyBbH)7>rVnDC$SEuC$41h59fXlX=PCFQ{3ik%Ig|Ss&DYb4Ys!a;PjM~IBB*% zov;>Qd~BVMWvD(^H2fb9?W=sKmG-Az2e~a)XwIF3@Hw>5sye=;%|0-(R?QlRL*rcw!-HB*a{QCKU=;*@e%xdTDIfk~N zP@jp4BtvNV`x{AiRH0jMXi|EQkhT)o<1Lal!^+xU&EaP}_M92>%&OIf4fOC7T zoN!$^5o<2ZdNaVWl&<*oN#EjKn0T&Gp=w?)Un%fGAVq>CG&C{nBpZb+L^m?yh>3{H zttz2H?+;@I!cq+xb8l;V^N&zio2;wjjyzYQch4{Fx{)Yh&eUPYXkUyleeY*1%adXd zh%^dghrd+3R$j-{+NTj`yAYbM?%gu#7j6ItdMp6XvyZc8l|v z=2f4lt3lU6AnHTPF4(?U_^vZVGgoBnZCTleuG9x92PKUFf%qAkEB0Q-ck{rAod+(z zHBbJ{&VtW7O*E~Rmn`N4K+y%l=ui)Hpm;JdInHj8TBkeZBLx<`J47Nt3C^;4_pZ^E zy#S*=gmnB@tOO;}%zYfoX{FL$@02?va+8R3u5?MTp(5ur`1X?4w)|QOt zHY%yp&`abdk6dAv_;`KGY9Ph#S}CI_uTbcN66=KCzZPFe&2^md+ndV*p4rYpQ6Fwm z-K!QKGJ!S{^~>kiy_{Apl#Brec~IXE!bT-JX=z%$B+ zfd6dGj@&Ny2>$9$&joXd`tWF>`zMY^h(@8gjsRKl_?Z757zQHPA;E&gXm$4NsUN9O zdpiI|aQR=Z54+)=24rEOfH&C|&1#PhHA{H#^C&iU)P3iOa?qMxvz(N4B`S$)y5fnY zb-a35*nXO{$?ffn1>yO60|+#G@q^1#-0eY4s;PrA6wjOz)-6 z2`Z%bBh0IMAVfOv*Y3QBWs0`Tn~QheUpXW&pE)*pcx1A&%GPlupHV@L4+Mg;C(AP0 zdx%4|7M!azswq7A)IHRBy^8*ti~jk${+d$Jxw}7HORqKPrlZD%IApZMGRNGTL7=l9 zN)I{^4WuT^8}CtH1EvA8t4*?$(Z>j&vrMkb-OG=DH{2rO%PsuUsP1w*etASmQ+>pu z{CyM%dQIQ_s)k@x_Q6m2j_51w1l#BT4!@m8VWrL+zv#4i0be5RR5p@qoMB1|^2m$^ z7v3~=r5qn(z4$56ip(PPFKj(?;12X9iJ*=`Tz69jzKQ>H1avolmKI60bDJ0%8cGuZ z0w}2rHNZrS>@o3YpPxB21KZI7*R}d`IQ4}q@S-ViyG+ls(9kl^w8ttlztqKMS6B6U zlq0r&1`4Q#FF|s{b`{DF$ji&CdyY9-9kBP@Eo4KG&2mW@63~pl)zFqBSJvR{e1Ir)zu+d{mwFDo^s{!%aY#mV{ zPvMIobZnH39ZLELRN2_71~F)dvYqDgBbgWHJ+8Zgy77V(JEU)gh-x&dk3E9F^zA2E z*nw-MUOu7=-y+WCco>^#>1n_r} z7)Pa)BX=27AF)wcBD0wD6>gF+qDulf4ces%c=xTe<6pGQ5L z>pTU8AZmq=Cz>E!ETCD2-BYiBi44w&_U0c?8bmb6ZLg7DoH^=TuEuQ>wpWSKb+7}-uQ@xu>d*GIuL9sjn;+bK0of6)DuX1+jnxj zs}dZ#v$Ma#E?j2TnCD9}$yG|hz6D&VX}2MW(XZ)uv(W+!{0Ttuia9aaUPBqb zRlCco&G8VV+3N<8C?BvW#|$9v0AYdd?8(K#%TQZj&}&`I71iHAdFY_ZrfEnz_G^D( zDVfE{m<(&X2kz(Wz|z7FcYY6Z=0`3BPj0SWOe!z8g(5_vX zW@N?!>Gtbr==bkEEmOHWUK3sc-*Zn<^mrzn-g;?GHMe2co(x#9}!ohx1?=5M{FF9b_s-ghk&dsZ+lfqjFF!xfmeKmtG?u9BE>GB8k+KV-2 zwlt~_OYV&`rp$x?$0Oc z1N}tz#WvhZl=jTK(Njj--*El~?1U9N!J+x_FpLJ97y~ENKA1c~xp}plM85gW0pDEB z{ISIfkg;qd7keX)?@zS}=RBo6l_T3Zd0b#t=O*Odssx^0B(k9PI~{0rlS^i@*RBXC z2+S`>OYsAIuOys{OtjH`R08cFd*Dimk4k|LajZ&rz|ZOJYVIQ=Ui){xBtW_}q4C;2)Cqa!#a2EX!Y+Ya-Wj|=@KimYADkSsyRs~G_o>a&MEMO6A4-DpD zW%&Q0=}g0+eBVDjmNFzp`7+t3h$&@B3|S{j6hhXr?`v7czQtI|SYk+s&=5lQea{Hl zvc+JsFJpu{uj}(U&nrgEia831UI_S*(kUQnG>NWC_fFj7 zy`ug|Z&KSd4K)jfv7_ORi@i&K{|>Lt1-8tUO_;%>B~;h^NG)M2C)znzL!Jk2Wbx2v zYM-C|+Y{Ce`xj&BE>o@)bfGB}Na$L zG@lj?$cn9mR50gJqdy^wi?87@D2X?m7H7Sn@=640X?~PC`=i~zRl;DP&=^*z{ zbUfDu#zUp!()pjt`INdfSvYeWdKW()1P@V;id|vq;2U>-4j-ThSC9*cxjW3++1VHK)5WJz=0K2u=x4Z? zbszZKj{l_&|C6;7;F%=?^Hbc0T001gw_AZEcmqO(aMzaRgI_kyRrik{l!(2N{6RD2 z`_zS5FYB`%2AOn!?4`SF=#& zqkfT(@*XiqvLTs62sM$KT_TuLQ&A35HO2pcZ_6~Xg?PRUoa}OhT)3HpHW$Gi+{|-Ui z)Q$%7-*q=L6 zbKh&3y29}35?t!hc^|2Vv&U+0p=yZT5DWw-nyKR#FSPn1EB@xFv%%y`Vk?_@99`&1 zuW-I#Ll}icj`RCF-sr}nm`XHA8BG%*3T|qp$PanBEd3P3Xd-dzJyU(| zTJ3$4xpRGPX(YdgG!9VtopB-^pm&w;_50o@@@uc&d(3DQzPjK z9JV@!Z^P{-YYgpi%<@CrLZR$ur~l6S4?QIIkn~oj?<3bD5x*b&=8taOdCui;!TuC4 zVjZjZ<{h^3Zb_oj@&Dpqw`_s_7fs^LDW5E0qb_+V31toC51!%~X>KX@+U85{_Ve!jtaCaK*H z4KDqCtT&LRhT{PiAkei%3MG!WAV*S~Ij@M@)lEu^l{N9Cu~&w>q=5JWr;qc6p! zU67LJfu8Uq8IJgUC;t*uP*CjXJ6-s9(xx%uB$q8^XwGo~_r%4(&pg8(_{}*?EuDvY zq5{?>4wt6x4P9zIof69l`RkSB71Fl$T{%+x?Wj1f(3G9jM|{2~L>-(G3i%NcARp1v z{GbWJqm8$o;V?8zYk`;(Wz^Bv(Y zgaQ+PX+pkEaASUV1S=)`?oM&$ZTUmxh@_t0&F(lyF$?yGiD1Tj0O2kGe!Y5Q&^Q1% zZW+)DSjDT-(_mf#Q~mdp@2ecsBX&}QzjBL=;vOI$CF8AmoLujG3n7}iGQzOGKH3|n z#lwZHp=R!lwLrDCXan&!Lf~&_xEG&QCrxEL94u~|lvGxvfPT0wLCn`nw_7|r3n7xz zWa>f;#J0D=5oUe2hH|CZ^DR%8Ed$Zp+J#wva!IuzllSCg5g+7FLHgOa{BExx>Ix~h z7)tp-2gzHX>)`*l%g?C>jKt9T7=S>O5~Fl-YLocVaxh!CuCMs(Mk;&Eb+tE@pFUioJLG>5ei_OY;0BF$Q180gZJjb}K0a>l z>X7|n@O;a1vlX$F^eagcSN}wCu$w`Cx0P+TxlJQ5`@O@u6XIUX)+WsUr4>+V06k+qqTuE-pxUP{{{YJu8 z+}28Xlj4&MWspB~xZ}^lNViAZdxjUa=itKvtukHbxI)a{-2n;$es2RHoU;XNdGR0dXlrnO7_zN}ljmEv2cI9)P2wOm} zt4A4ah1NB+hMuk5zb>k6z~A0Yl2J21(t8y0l2Etm=m_{!i7(9WAsHfrCApSO3*rN) zhuRe{*mNSqgAeCp7V~f56OIBc@Gub-bV4gsapaLy2h7ko~owLNXw3DI>Kfbm_9 zvCcAKXe@J`c4#9Km1Z>be8la7tij?~q+Pz=crA(4?Q5y37aZu7%&Tq9uKa|b3l)O8 zQw)51O2ib2FWTZGtsvbhkZ0N-1vT~9n-0tl7nU~nb^o1ev}n|3ZXtT73mQU?D_>?x zy`@cb#VHKYfzWzB>7dhDGlqXXO=)513GbLE3Sc%4q!x~GRWaPW&ONG+ao}Qr<+G4c zANO)BN8aS%k+lhz!KUxx`u<+;)uQFSdFwVJAXvqgus3;yCzV5vd8>yg+b8TA?xVM?M1)wB-9P$5 z^mOSyW9~zcv2XJP(4VWa^c!bAHfq;tUg>+~24A{Bub>VPYf{>da{27H6+!LV>k_ZQFcy(hJI1gz(o`8cy&B2 zY%ITU$e*1^RQS5V1=3)`V*tuQNfc2HN_eTJF9L7XR_2V`jE+GoGK z6boUj*L4jzIJm9L#h)B2&i~89^1gkIW$9S!Lb?wj;-p85{270=f9>)CTUu*XRPHT2Gj{NKHf zzuV`7`wMQ;VIfq3jK*6Oj1AAnok}J&3i8bBFuKsFXtb4mtmW z<>o@lan(-9B=_>p;o~^vwSYQfetYfGWp&`L`RNzs@JV913a+x=(Iu z7DG!|V+1x&KZ)G7t-&UH`i6$iaT+$=?yKC3kzM5})_J%PU;(*!PZxFMRdM`tGho_tC5jQT_!nyq%x< zqPy6M1-J+V0z@)z=s?g#9%XRiO#?@FQx5l00nDOcE=Cj1hGe58-KVAHxJcGmg)Z)n zu$h(8hToj}L<$E@AIa$O1^i#a-A)!c#dOmQ;N#aMWFt@2$*VTy&W8 z(Ka5hN!4<_Lj^L)jl~jZjl#m%icC_bB)F+youI=sj~UnBe$TqTjOZsny{5GW`^&7d zbZ_T;`%sG4!a{z|Lzr!u|vg@p`JCBBD@@6eTIFWynGtnPt zQvUoC%{L#gdg3+koTZb3B0F1Ks{g3oyEBK>DjtN?wI)r_omuwvjz$I;%6 z!Qk-&{cEErHB)C;m&jqVNzm94hCg1N(-CczA=H;q;LJ602@ZEuCrN2v%csBEC*p|F z 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%0D#{p9v^NaXzW7)?y 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�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 "$MAILFILE" diff --git a/g1sms/natools.py b/g1sms/natools.py deleted file mode 100755 index 9b6470f..0000000 --- a/g1sms/natools.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python3 - -""" - CopyLeft 2020 Pascal Engélibert - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -""" - -import os, sys, duniterpy.key, libnacl.sign - -def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str: - if arg in args and len(args) > args.index(arg)+n: - return args[args.index(arg)+n] - else: - return default - -def read_data(data_path, b=True): - if data_path == "-": - if b: - return sys.stdin.read().encode() - else: - return sys.stdin.read() - else: - return open(os.path.expanduser(data_path), "rb" if b else "r").read() - -def write_data(data, result_path): - if result_path == "-": - sys.stdout.write(data.decode()) - else: - open(os.path.expanduser(result_path), "wb").write(data) - -def encrypt(data, pubkey): - return duniterpy.key.PublicKey(pubkey).encrypt_seal(data) - -def decrypt(data, privkey): - return privkey.decrypt_seal(data) - -def sign(data, privkey): - return privkey.sign(data) - -def verify(data, pubkey): - try: - sys.stderr.write("Signature OK!\n") - return libnacl.sign.Verifier(duniterpy.key.PublicKey(pubkey).hex_pk()).verify(data) - except ValueError: - sys.stderr.write("Bad signature!\n") - exit(1) - -def get_privkey(privkey_path, pubsec): - if pubsec: - return duniterpy.key.SigningKey.from_pubsec_file(privkey_path) - else: - return duniterpy.key.SigningKey.from_seedhex(read_data(privkey_path, False)) - -def show_help(): - print("""Usage: -python3 natools.py [options] - -Commands: - encrypt Encrypt data - decrypt Decrypt data - sign Sign data - verify Verify data - -Options: - -i Input file path (default: -) - -k Privkey file path (default: authfile.key) - --pubsec Use pub/sec format for -p - -p Pubkey (base58) - -o Output file path (default: -) - -Note: "-" means stdin or stdout. -""") - -if __name__ == "__main__": - - if "--help" in sys.argv: - show_help() - exit() - - data_path = getargv("-i", "-") - privkey_path = getargv("-k", "authfile.key") - pubsec = "--pubsec" in sys.argv - pubkey = getargv("-p") - result_path = getargv("-o", "-") - - try: - if sys.argv[1] == "encrypt": - write_data(encrypt(read_data(data_path), pubkey), result_path) - elif sys.argv[1] == "decrypt": - write_data(decrypt(read_data(data_path), get_privkey(privkey_path, pubsec)), result_path) - elif sys.argv[1] == "sign": - write_data(sign(read_data(data_path), get_privkey(privkey_path, pubsec)), result_path) - elif sys.argv[1] == "verify": - write_data(verify(read_data(data_path), pubkey), result_path) - else: - show_help() - except Exception as e: - sys.stderr.write("Error: {}\n".format(e)) - show_help() - exit(1) diff --git a/g1sms/sms_NEW.sh b/g1sms/sms_NEW.sh index b82ea02..c6ed6f7 100755 --- a/g1sms/sms_NEW.sh +++ b/g1sms/sms_NEW.sh @@ -37,7 +37,7 @@ UNIT=${countvalues[2]} # ONLY USED BY sms_NEW.sh !!! To send back PIN echo "${IPFSPrivKey}" | gpg -d -q --output "$PINFILE" --yes --pinentry-mode loopback --passphrase-fd 0 "$GPGPINFILE" PIN=$(cat "$PINFILE" | xargs) -[[ "$PIN" == "" ]] && [[ -f "${PINFILE}.crypt" ]] && /home/$YOU/.zen/astroport/zen/tools/natools.py decrypt --pubsec -k "$NODE_PUBSECFILE" -i "${PINFILE}.crypt" -o "$PINFILE" && PIN=$(cat "$PINFILE"); +[[ "$PIN" == "" ]] && [[ -f "${PINFILE}.crypt" ]] && /home/$YOU/.zen/astroport/zen/tools/natools.py decrypt -f pubsec -k "$NODE_PUBSECFILE" -i "${PINFILE}.crypt" -o "$PINFILE" && PIN=$(cat "$PINFILE"); [[ "$PIN" != "" ]] && echo "" > "$PINFILE" || PIN="PIN EMPTY !!! Contacter $ADMINPHONE SVP" mess="[G1sms+] diff --git a/g1sms/tag_OP.sh b/g1sms/tag_OP.sh index b2d9a55..d67bce8 100755 --- a/g1sms/tag_OP.sh +++ b/g1sms/tag_OP.sh @@ -71,7 +71,7 @@ if [[ $FINALSOURCE -lt 0 ]]; then echo "__SUB:tag_OP.sh: KO. La valeur de ce G1T ############################################# ############## EXTRACT $JSOURCERR PUBLISH KEY if [[ -f $KEYFILE && ! -f "~/.ipfs/keystore/$JSOURCERR" ]]; then - /home/$YOU/.zen/astroport/zen/tools/natools.py decrypt --pubsec -k "$KEYFILE" -i "$JSOURCEPUBLISHKEY" -o "~/.ipfs/keystore/$JSOURCERR" + /home/$YOU/.zen/astroport/zen/tools/natools.py decrypt -f pubsec -k "$KEYFILE" -i "$JSOURCEPUBLISHKEY" -o "~/.ipfs/keystore/$JSOURCERR" else if [[ ! -f $KEYFILE ]]; then echo "__SUB:tag_OP.sh: KO. La clef de dévérouillage pour $JSOURCERR est inexistante. Contact: https://g1sms.fr" @@ -92,7 +92,7 @@ FINALDEST=$(echo "${JDESTVALUE} + ${VALUE}" | bc -l) # EXTRACT $JSOURCERR PUBLISH KEY to "~/.ipfs/keystore/JSOURCE" # EXTRACT PUBLISH KEY if [[ -f $KEYFILE && ! -f "~/.ipfs/keystore/$JDESTRR" ]]; then - /home/$YOU/.zen/astroport/zen/tools/natools.py decrypt --pubsec -k "$KEYFILE" -i "$JDESTPUBLISHKEY" -o "~/.ipfs/keystore/$JDESTRR" + /home/$YOU/.zen/astroport/zen/tools/natools.py decrypt -f pubsec -k "$KEYFILE" -i "$JDESTPUBLISHKEY" -o "~/.ipfs/keystore/$JDESTRR" else if [[ ! -f $KEYFILE ]]; then echo "__SUB:tag_OP.sh: KO. La clef de dévérouillage pour $JDESTRR est inexistante. Contact: https://g1sms.fr" diff --git a/g1sms/tools/G1_TUX_natools.py b/g1sms/tools/G1_TUX_natools.py deleted file mode 100755 index 5149743..0000000 --- a/g1sms/tools/G1_TUX_natools.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python3 - -import os, sys, duniterpy.key, libnacl.sign - -def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str: - if arg in args and len(args) > args.index(arg)+n: - return args[args.index(arg)+n] - else: - return default - -def read_data(data_path, b=True): - if data_path == "-": - if b: - return sys.stdin.read().encode() - else: - return sys.stdin.read() - else: - if b: - return open(os.path.expanduser(data_path), "rb").read() - else: - return open(os.path.expanduser(data_path), "r").read() - -def write_data(data, result_path): - (sys.stdout if result_path == "-" else open(os.path.expanduser(result_path), "wb")).write(data) - -def encrypt(data, pubkey): - return duniterpy.key.PublicKey(pubkey).encrypt_seal(data) - -def decrypt(data, privkey): - return duniterpy.key.SigningKey.from_seedhex(privkey).decrypt_seal(data) - -def sign(data, privkey): - return duniterpy.key.SigningKey.from_seedhex(privkey).sign(data) - -def verify(data, pubkey): - try: - return libnacl.sign.Verifier(duniterpy.key.PublicKey(pubkey).hex_pk()).verify(data) - except ValueError: - exit(1) - -def show_help(): - print("""Usage: -python3 natools.py [options] - -Commands: - encrypt Encrypt data - decrypt Decrypt data - sign Sign data - verify Verify data - -Options: - -i Input file path (default: -) - -k Privkey file path (default: authfile.key) - -p Pubkey (base58) - -o Output file path (default: -) - -Note: "-" means stdin or stdout. -""") - -if __name__ == "__main__": - - if "--help" in sys.argv: - show_help() - exit() - - data_path = getargv("-i", "-") - privkey_path = getargv("-k", "authfile.key") - pubkey = getargv("-p") - result_path = getargv("-o", "-") - - try: - if sys.argv[1] == "encrypt": - write_data(encrypt(read_data(data_path), pubkey), result_path) - elif sys.argv[1] == "decrypt": - write_data(decrypt(read_data(data_path), read_data(privkey_path, False)), result_path) - elif sys.argv[1] == "sign": - write_data(sign(read_data(data_path), read_data(privkey_path, False)), result_path) - elif sys.argv[1] == "verify": - write_data(verify(read_data(data_path), pubkey), result_path) - else: - show_help() - except Exception as e: - sys.stderr.write("Error: ", e, "\n") - show_help() - exit(1) diff --git a/g1sms/tools/natools.py b/g1sms/tools/natools.py old mode 100755 new mode 100644 index 9b6470f..9de1187 --- a/g1sms/tools/natools.py +++ b/g1sms/tools/natools.py @@ -17,7 +17,9 @@ along with this program. If not, see . """ -import os, sys, duniterpy.key, libnacl.sign +__version__ = "1.0" + +import os, sys, duniterpy.key, libnacl.sign, base58, base64, getpass def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str: if arg in args and len(args) > args.index(arg)+n: @@ -36,7 +38,7 @@ def read_data(data_path, b=True): def write_data(data, result_path): if result_path == "-": - sys.stdout.write(data.decode()) + os.fdopen(sys.stdout.fileno(), 'wb').write(data) else: open(os.path.expanduser(result_path), "wb").write(data) @@ -57,11 +59,54 @@ def verify(data, pubkey): sys.stderr.write("Bad signature!\n") exit(1) -def get_privkey(privkey_path, pubsec): - if pubsec: +def get_privkey(privkey_path, privkey_format): + if privkey_format == "pubsec": + if privkey_path == "*": + privkey_path = "privkey.pubsec" return duniterpy.key.SigningKey.from_pubsec_file(privkey_path) - else: + + elif privkey_format == "cred": + if privkey_path == "*": + privkey_path = "-" + if privkey_path == "-": + return duniterpy.key.SigningKey.from_credentials(getpass.getpass("Password: "), getpass.getpass("Salt: ")) + else: + return duniterpy.key.SigningKey.from_credentials_file(privkey_path) + + elif privkey_format == "seedh": + if privkey_path == "*": + privkey_path = "authfile.seedhex" return duniterpy.key.SigningKey.from_seedhex(read_data(privkey_path, False)) + + elif privkey_format == "wif": + if privkey_path == "*": + privkey_path = "authfile.wif" + return duniterpy.key.SigningKey.from_wif_or_ewif_file(privkey_path) + + elif privkey_format == "wifh": + if privkey_path == "*": + privkey_path = "authfile.wif" + return duniterpy.key.SigningKey.from_wif_or_ewif_hex(privkey_path) + + elif privkey_format == "ssb": + if privkey_path == "*": + privkey_path = "secret" + return duniterpy.key.SigningKey.from_ssb_file(privkey_path) + + elif privkey_format == "key": + if privkey_path == "*": + privkey_path = "authfile.key" + return duniterpy.key.SigningKey.from_private_key(privkey_path) + +fmt = { + "raw": lambda data: data, + "16": lambda data: data.hex().encode(), + "32": lambda data: base64.b32encode(data), + "58": lambda data: base58.b58encode(data), + "64": lambda data: base64.b64encode(data), + "64u": lambda data: base64.urlsafe_b64encode(data), + "85": lambda data: base64.b85encode(data), +} def show_help(): print("""Usage: @@ -74,11 +119,18 @@ Commands: verify Verify data Options: + -f Private key format (default: cred) + key cred pubsec seedh ssb wif wifh -i Input file path (default: -) - -k Privkey file path (default: authfile.key) - --pubsec Use pub/sec format for -p + -k Privkey file path (* for auto) (default: *) -p Pubkey (base58) -o Output file path (default: -) + --noinc Do not include msg after signature + -O Output format: raw 16 32 58 64 64u 85 (default: raw) + + --help Show help + --version Show version + --debug Debug mode (display full errors) Note: "-" means stdin or stdout. """) @@ -89,24 +141,42 @@ if __name__ == "__main__": show_help() exit() + if "--version" in sys.argv: + print(__version__) + exit() + + privkey_format = getargv("-f", "auto") data_path = getargv("-i", "-") - privkey_path = getargv("-k", "authfile.key") - pubsec = "--pubsec" in sys.argv + privkey_path = getargv("-k", "*") pubkey = getargv("-p") result_path = getargv("-o", "-") + output_format = getargv("-O", "raw") try: if sys.argv[1] == "encrypt": - write_data(encrypt(read_data(data_path), pubkey), result_path) + write_data(fmt[output_format](encrypt(read_data(data_path), pubkey)), result_path) + elif sys.argv[1] == "decrypt": - write_data(decrypt(read_data(data_path), get_privkey(privkey_path, pubsec)), result_path) + write_data(fmt[output_format](decrypt(read_data(data_path), get_privkey(privkey_path, privkey_format))), result_path) + elif sys.argv[1] == "sign": - write_data(sign(read_data(data_path), get_privkey(privkey_path, pubsec)), result_path) + data = read_data(data_path) + signed = sign(data, get_privkey(privkey_path, privkey_format)) + + if "--noinc" in sys.argv: + signed = signed[:len(signed)-len(data)] + + write_data(fmt[output_format](signed), result_path) + elif sys.argv[1] == "verify": - write_data(verify(read_data(data_path), pubkey), result_path) + write_data(fmt[output_format](verify(read_data(data_path), pubkey)), result_path) + else: show_help() + except Exception as e: + if "--debug" in sys.argv: + 0/0 # DEBUG MODE sys.stderr.write("Error: {}\n".format(e)) show_help() exit(1) diff --git a/zen/README.md b/zen/README.md index 611a5c7..ebf90ae 100644 --- a/zen/README.md +++ b/zen/README.md @@ -125,5 +125,5 @@ IPFS SWARM : ``` g1pub=$(cat ~/.ssb/secret.dunikey | grep 'pub:' | cut -d ' ' -f 2) ~/.zen/astroport/zen/tools/natools.py encrypt -p $g1pub -i file -o file.crypt -~/.zen/astroport/zen/tools/natools.py decrypt --pubsec -k ~/.ssb/secret.dunikey -i file.crypt -o file +~/.zen/astroport/zen/tools/natools.py decrypt -f pubsec -k ~/.ssb/secret.dunikey -i file.crypt -o file ``` diff --git a/zen/ssb_INIT.sh b/zen/ssb_INIT.sh index bb9fe14..003fec6 100755 --- a/zen/ssb_INIT.sh +++ b/zen/ssb_INIT.sh @@ -128,12 +128,16 @@ $imagefile $id : $type : $size bits " -nodename=$(cat /etc/hostname) -extension=$(echo $nodename | cut -d '.' -f 2) -if [[ $extension == $nodename ]]; then - nodename=$nodename.home +# NOT WORKING, sudo inside !!! +#nodename=$(~/.zen/astroport/zen/tools/nodename) +nodename=$(cat /home/$YOU/.zen/ipfs/.$IPFSNODEID/G1SSB/_nodename) +if [[ $nodename == "" ]]; then + nodename=$(cat /etc/hostname) + extension=$(echo$ nodename | cut -d '.' -f 2) + if [[ $extension == $nodename ]]; then + nodename=$nodename.home + fi fi - ######################################################################## # DUNITER G1 Wallet balance export LC_ALL=C.UTF-8 #attipix diff --git a/zen/ssb_SURVEY_swarmkey.sh b/zen/ssb_SURVEY_swarmkey.sh index 7587ff4..2979e90 100755 --- a/zen/ssb_SURVEY_swarmkey.sh +++ b/zen/ssb_SURVEY_swarmkey.sh @@ -99,7 +99,7 @@ to ~/.ipfs/ipfs_swarm.key echo "http://localhost:8989/blobs/get/$mylink" continue curl -s "http://localhost:8989/blobs/get/$mylink" > $mytmp/ipfs_swarm.key.crypt - $MY_PATH/tools/natools.py decrypt --pubsec -k ~/.ssb/secret.dunikey -i $mytmp/ipfs_swarm.key.crypt -o ~/.ipfs/ipfs_swarm.key && \ + $MY_PATH/tools/natools.py decrypt -f pubsec -k ~/.ssb/secret.dunikey -i $mytmp/ipfs_swarm.key.crypt -o ~/.ipfs/ipfs_swarm.key && \ echo "IPFS SWARM KEY ~/.ipfs/ipfs_swarm.key received from SSB $author ... OK !" diff --git a/zen/tools/make_G1SSB_secret.sh b/zen/tools/make_G1SSB_secret.sh index 1a7e529..5905077 100755 --- a/zen/tools/make_G1SSB_secret.sh +++ b/zen/tools/make_G1SSB_secret.sh @@ -91,14 +91,9 @@ echo ' \____/_/ |_/____/___//____/ ' | lolcat + nodename=$(curl -s https://git.p2p.legal/axiom-team/astroport/raw/master/zen/tools/nodename | bash) -extension=$(echo $nodename | cut -d '.' -f 2) -if [[ $extension == $nodename ]]; then - PUB="false" - nodename=$nodename.local -else - PUB="true" -fi + if [[ ! $(which oasis) ]]; then echo "INSTALL.... http://$nodename" echo "ENTER Station accessible Network name !!! Suggestion : $nodename" diff --git a/zen/tools/natools.py b/zen/tools/natools.py old mode 100755 new mode 100644 index 9b6470f..9de1187 --- a/zen/tools/natools.py +++ b/zen/tools/natools.py @@ -17,7 +17,9 @@ along with this program. If not, see . """ -import os, sys, duniterpy.key, libnacl.sign +__version__ = "1.0" + +import os, sys, duniterpy.key, libnacl.sign, base58, base64, getpass def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str: if arg in args and len(args) > args.index(arg)+n: @@ -36,7 +38,7 @@ def read_data(data_path, b=True): def write_data(data, result_path): if result_path == "-": - sys.stdout.write(data.decode()) + os.fdopen(sys.stdout.fileno(), 'wb').write(data) else: open(os.path.expanduser(result_path), "wb").write(data) @@ -57,11 +59,54 @@ def verify(data, pubkey): sys.stderr.write("Bad signature!\n") exit(1) -def get_privkey(privkey_path, pubsec): - if pubsec: +def get_privkey(privkey_path, privkey_format): + if privkey_format == "pubsec": + if privkey_path == "*": + privkey_path = "privkey.pubsec" return duniterpy.key.SigningKey.from_pubsec_file(privkey_path) - else: + + elif privkey_format == "cred": + if privkey_path == "*": + privkey_path = "-" + if privkey_path == "-": + return duniterpy.key.SigningKey.from_credentials(getpass.getpass("Password: "), getpass.getpass("Salt: ")) + else: + return duniterpy.key.SigningKey.from_credentials_file(privkey_path) + + elif privkey_format == "seedh": + if privkey_path == "*": + privkey_path = "authfile.seedhex" return duniterpy.key.SigningKey.from_seedhex(read_data(privkey_path, False)) + + elif privkey_format == "wif": + if privkey_path == "*": + privkey_path = "authfile.wif" + return duniterpy.key.SigningKey.from_wif_or_ewif_file(privkey_path) + + elif privkey_format == "wifh": + if privkey_path == "*": + privkey_path = "authfile.wif" + return duniterpy.key.SigningKey.from_wif_or_ewif_hex(privkey_path) + + elif privkey_format == "ssb": + if privkey_path == "*": + privkey_path = "secret" + return duniterpy.key.SigningKey.from_ssb_file(privkey_path) + + elif privkey_format == "key": + if privkey_path == "*": + privkey_path = "authfile.key" + return duniterpy.key.SigningKey.from_private_key(privkey_path) + +fmt = { + "raw": lambda data: data, + "16": lambda data: data.hex().encode(), + "32": lambda data: base64.b32encode(data), + "58": lambda data: base58.b58encode(data), + "64": lambda data: base64.b64encode(data), + "64u": lambda data: base64.urlsafe_b64encode(data), + "85": lambda data: base64.b85encode(data), +} def show_help(): print("""Usage: @@ -74,11 +119,18 @@ Commands: verify Verify data Options: + -f Private key format (default: cred) + key cred pubsec seedh ssb wif wifh -i Input file path (default: -) - -k Privkey file path (default: authfile.key) - --pubsec Use pub/sec format for -p + -k Privkey file path (* for auto) (default: *) -p Pubkey (base58) -o Output file path (default: -) + --noinc Do not include msg after signature + -O Output format: raw 16 32 58 64 64u 85 (default: raw) + + --help Show help + --version Show version + --debug Debug mode (display full errors) Note: "-" means stdin or stdout. """) @@ -89,24 +141,42 @@ if __name__ == "__main__": show_help() exit() + if "--version" in sys.argv: + print(__version__) + exit() + + privkey_format = getargv("-f", "auto") data_path = getargv("-i", "-") - privkey_path = getargv("-k", "authfile.key") - pubsec = "--pubsec" in sys.argv + privkey_path = getargv("-k", "*") pubkey = getargv("-p") result_path = getargv("-o", "-") + output_format = getargv("-O", "raw") try: if sys.argv[1] == "encrypt": - write_data(encrypt(read_data(data_path), pubkey), result_path) + write_data(fmt[output_format](encrypt(read_data(data_path), pubkey)), result_path) + elif sys.argv[1] == "decrypt": - write_data(decrypt(read_data(data_path), get_privkey(privkey_path, pubsec)), result_path) + write_data(fmt[output_format](decrypt(read_data(data_path), get_privkey(privkey_path, privkey_format))), result_path) + elif sys.argv[1] == "sign": - write_data(sign(read_data(data_path), get_privkey(privkey_path, pubsec)), result_path) + data = read_data(data_path) + signed = sign(data, get_privkey(privkey_path, privkey_format)) + + if "--noinc" in sys.argv: + signed = signed[:len(signed)-len(data)] + + write_data(fmt[output_format](signed), result_path) + elif sys.argv[1] == "verify": - write_data(verify(read_data(data_path), pubkey), result_path) + write_data(fmt[output_format](verify(read_data(data_path), pubkey)), result_path) + else: show_help() + except Exception as e: + if "--debug" in sys.argv: + 0/0 # DEBUG MODE sys.stderr.write("Error: {}\n".format(e)) show_help() exit(1)