2a{L$A-g+Me?sJOVHDxbzRhu-o1p7WDX5*u7@1bcLf)M^K?> z>0gc-?SJpM^tkm?dWZ4f`Dp0#xpN}zM89qv&^)0#^c-^Y{|H;=4iBfAPZ*#sy^kN- zFP`|JwR@8R`o{TyzM}g@FAIZj{O@7TpdIpk)rdzzzia-ysP8ZtlJFDqfWBqmb#D&yyWSJ_Y*=jaB+|Zk%)l7p zY&ty*M7l>z9^UtCSULO`rnjX!o450FXSLg5Uwv2DwkSh;(Zt()7Bc6r<`YN58tHxg zu1 7tzXUU&MajUOSojehqT{bmL{^2DW z!~Jn=n-%DiwpG!7D70TVCdz!3UPPN5G)8~*1tteh91m;8{I(zmDwU-&;Da8QyfTdW z#s|WN>3wBeI$(Ju-Ab;Mvp;LWfc4LM5n3EQuq!MZ^q|ITZ!x)BQPyW@g#JGCtM3%; z$BFhQqukFBBvQE)lE@$N{z>t`+Hp^Y{@1?2^np~D%#@SmHOlOB#kpa|!`Fu0P4lc= za&lR7Ruq)tyV4zSb?W3v=~#2s<}Zt5c pYUF<9hWcd8-atqxqfQzFz8GFt>%8mYzLRTO1yh% zcy8qk oyf#QE`sx2Yv{f^|tqx=mLnyflV_9nBBN09so|k#=F=SXZ-wHn~#Wf zHw3g)?C ~f_M`0;$n>jlXd=8CZ;yREn)e2EN5c}2WB;MzBa<%1tmf3Uj|puK4F zh$JzoZ?pn%=G$lg`sUD6^Rh*Ke3r(QuA%*%?+rVaO-cLuVq_p`8=EXgV=eK({Lx{^ zO@EuTZExe1bra_i>e=fve-dW>>PFd&)*FB+ZgdfOx3O?{gxsLK%VzMnZ}W1~kLl~{ zmigB1MSJP_r%czQxl=;>C3MWK3&v=S^3K}iK$edMf47VOK)TMy!=Ckv1b3vn%bE79 zM|)u`(nmZX`AJ_r`kwPOpQ1Th;i4}3L;HV!pN*?he2Mn4KWQJ#rF^V%8E-J=^!8oz z+3MZd`mb%wOG&>}b_pN1Pd(a;_LM`7sN?3@L*lr;R(npa-HiO&{|>uWKVzU !rQ_%x*_8O=9ckYXx6;4=V=vuk^f2Cr|N+Z&AQ1w z&5qlez8)Ddl6JphMg~X4?Sx C$r)ag z{5r60jp^}+_iQs*;O^&C=7>B0p`gdmzFVNbKL;NJzVJr#H_G~$xSXk0kB<7RAj=rv z9Sy6;JZ84^n#ayr+@-Xap0A9vN51}B<=?^FEH;;F30|SS&3p1|q3;#1k^jhtH3sb$ zP8>OCG|iS_*Lokn;id^)#fSeGdVlUu!>W;w#&`9Mci_7bl23K@XI@XqfxcIs7gi2? z*zg5>PJganj0w0;96c0P$giTG`DE4JCcJHM9(C9I&F>~l6UR*+FHIA=*nGjFp8t`5 zRP>v^ C=^lO`y+8Y>n)iKa7;*dG zYfe&QkL-Kmf#+7v3L^zCex}(v)N)PR=p$ZSKIA9i#IZvOZ@rkPUuc^`i`vrjVM+h{ z)mF}FU7Jw5ANBS3hh3Ua%j3B~8+&5UDRbS#uA!&qV;A+hm!Boc^Wg#4*mUp{p5Nu} z(Esy)A)WN4Ve*eY9pHhObCB=&TJsg>*#ON4E|fpu^E;X%f9S3FFXqQL%v+85#s!fF z=m-4pwqETl9_TIq(`ADnw6+uB1zPfVh~n>#_P0QjNc+Wozpt^be6v)iTKGTv4)bWE z?)s;&bM@?4>x|s@whuP)scB+2n~z`A`#bqZMfv0(;?uWr=0MX;p)-EqC*%`GA3ycM z&l+D~XWTM7+V8Av!IVw>v_m&{H_aCh{9l_7thYaia^SUL#n7LpeSz_q7mzKq16_OF z=|dOy`+>>I=r>m%{TUaIx?8lDuVu +B(Rhu+#)lnCCa4{MUH;uK z57U2owf)|q`#j^=D_>OrFI_IqMc
X0ADP_kap^1VKF{KD zZomh0n`}0gibA)Wv58*@7UwS#dU|Z*ou=>UKBJF{tI2G%5%l#x9=}OlhO!%2|a(s(4SfVRj-~O=SiUb z1!1@RJHf2C^K!M?zj=j?CDF&mfA^#6pD(gw=&kPxUA3NPsBE*-e|Aln@w3l|X+OC# zox8=)+h`-&MH&_A;Phlni0{}_S|fy?;k>8*-Np*1Gznz$i;@$bM>*L19{3^c-Ly>O zi;q|zQWp=1Kac~=A#c+<1?K_J|4g5$A9#RH=uzn2sZVY--Y)YDnNPdly>7l$D=SCK z)pMV4I^YX$Qa|y}>Z7-tu6g3|cB6BhR38Slhnv-AM!TrD|nVmT|qgzta6emMZH z!~-M0_CAw|)yix4XR26i2f@}{4Z6NYADJBep*^~i$$V8J#T)XKqfCnQe`6T)tq+=> z?608z_t2WJ1>Np3`tmj7{29Nv&gi*V^v8ySwCC9hjkj6n6Xh~vw$9dH15@<*%l?kn z@X`2t|DUZH@N&zYy&kj=(!MS5z$a|{Sg#zwwulUQUh7!TbfPwX0Lz}W^UU^Df1T(L zMf-1lKx4f5MiG}Ok@S&936R{@twoFYNY>^fTlDYrM*~f60+0{q76%wJw-rfeyxZ z6aQ0m5}yu}4uDR{y@fq^77uIx@= 9*xSRW6d3+SLPLXMruxnr-7 z>$v#68&BujbW3`U*?`5 ja-yEA$PWil?I{gaQ^A-&F&zgB%2G64OdSvD+Bkw0te|NR?3 zd)-)zj$bQq*41VNKkHeMZS-{!XP$feoDKirNyV}DZuW1!8oFyPv)+2p?#HU#GbVG| z8$DX0zuxBk=cS`D7eqe2wf?J*?6KHndtCB|(N|YCI{NOO`pvzrYCFhz##5xU9tq7E z7qSM7gX=Y8eq(*Yw1=(?$Fvq4yF9TXIMeU@_m)|Wf3n{&_m5qHwT1QKj`hi_Mm}P? z4Y+8} pAT`-$>ocHHz&|wp+<`+C5{ysaoIf2ex_a zvqR)NJnf+??EbW$TotCv|88;L|1_VIqB2#~PR%FI{KfS)PMG%4RbiTJ2P5zLKSmeU z9ZY%fb9$!x9D2rjQ+&gLxt?TognyIo7-tv{w4(jskBqIt^Qs4q(|Om+!|nnMCdW(Y zOTS*}puhiM(%%=_A&k%x?SVUDJozgh415QXg~;gUV@I@h>oLirmuqd_-LXB}eV!eb z9VJ=!o3!~zj}TUkdem%&@Qoc8>3s3aOpideb>p`m8e5`EFt1T3`3>#HzZn9+1Jizd zMXO{eb4`2KFOK=vh`&tHt-b{2vH$UJb<3@&>wPfsdCAbe)sU2a$o%m5d;iV){nDp} zJ4So>K)0AH-Z*ox&B4>QH*m=3zud7=eyZ3WPIoMBe2|pS+|qRE8L2N6`d-EMljwrH zqhr$jp9)8`E|Pk9+bq 0ZbS)=C?ns>nj!TaCdofERd)t7<9I&uJid{2w%_@}WI-y6N27WaZ`ZIlOm! z SOSEkG5%OYx%T`?svpoLtn4YSH(iZXi8hwBK!h zj^G*ES19cF_%{4V!j?JnksHj0WpvKcx>BE@cZS~lcX577d3f7u1fnDTWkZwx#8?j- zgxTsV!Q%G~ZfO6n8sp_ A9NYaq=}IK$Njq1Su=e`z-yad)aYW_OVdnhyw$Ss^ zR~5_qA{=M>0?`9q0Q)8LaPSdxD6L6+Wk _4o#nWA;s_eqG=2>=*;+I=HA*%x;uf|x zrFB#W_|_2fs;07KiyilE_4l$# {F!5l6KA*)P>!Q|;j88SEbe&!sO-=4y4)3d z;oIUcdz;Un^_+Qy*^k{~bK mw(6WNc@UP_g`YPFB*5|%jCE0V&gPFNq?WhZ&wjl z`kODNp}(>H?b1BtqTb)Nb+$b(dzH=iF>lKHLVUVL%U6K8d~m}&KYmKf*|$8adok zeA!Z4
LETw3fGq?6Z_Wc(Z4a=RpdE%5q?vD&)hWg+oU#a8^D$vlyyq; z0NC&G*NicO@U!YHKa}%qeu=qT<^cCfmLF9=e^UKfr3Bo~vLzqdy+vz`W{0(7A6I|z zWm}^~>|kU^ck=~&k79m3ARpj$DSq3u&H@-NU~LP0YjKRheYtj++=B;LFN1Hh^HV)d z@W9s9@_BquY(rJb=`NW%;kzF({DN1<1Lw9# 8Wt+;NCWq1;Fk&<@)&H{pQ== z8^7uncz}Mu{Gb>Q2ywMi1e_rcY1h@uz$fLynu}kW)IZU`R9LNLQKxznb8p0P#kZFB z*!AO`!(hc+S}fU*t%3Pl5-`|d@YDlQrXC zGXE6Q7sJ80R_l_vl7h`I6>S zu8>yVOX-)8k1^2_`Ec~R=FdzX6R&m7Z@(JQ)xE8!->6JD(d*?PBw6{-^j!E(SNyl5 zzzhB&GJ$o!*jwV*th3EGZ=BIToD%POK9T$UtJ65czZ^+j$R8hj;${%@xEc?j=T7+k zg{DISf!8SuTb6G4bWH#0RWVPebyoiC9=^=9duSh1gfIEg(38VUoew^@QMS?RLr=wT zN7iGD-ZW!?`D7T*tCY<1NK;@151B9QGS ~u_HM2 z@+#)j>IVs&`kwVE#71P@T16fZy?QEUCh;s|-D2Hi{UZ>u`pQ>7HwvE~1G$`?mp;Mz zd&zwNx<#BNZ?@)SdFw-Xjd*JGX+0EM4L>-10KIINjg`tUn&%!`y=%Bv^ol-;FhzV3 zOB}zmF|s3|chVowcOGrC_$~?k;X?t&dJEQyF+QQKm&j|iUHSpmP~vw+0{(0wC+;x+ zgdN0qsa)IF_#Qof@5Y=x-(V@uGn@bEUhm(wTC(<&CU?+%7j*wtII_PuwxZLdQd!XH z(C)3W1 7%xwqvfNQUX)1e@5PmZ>IbyxzzL0Ka$>c zm-W+?@@e&bp*fZ-NSp^WC%=5iLu$84%)G3;<{B9wUpQn1aW(U}vO1;XJ;m3B_Sr*u z;0tMEJjHDxISj@)t*%V@53}&$8-b5Q^z%E%;`C?N#=^?}etJ%_#aE9wGswPa4_$6? zLD3uNvsoj6z1$966T=t3y1`$0yXiI91fE+l-NxN9-$I@3H@Hvm5B^BRGs0h#Jh3+| z>h&GtC7uFjqmtD*Dbr!V4~jMKaqo*n4rJOeW0v7szqnuHIzWMkJ#mGNAKy8%cjWnp z@x5#x%>R 4c6}Q?PTpv^YO!mOWqMAY3cEsNC|W!?3T}H>^}I0 zx0;V7^|B*_lM-2}Xa1hs5GMZMlVRPY?zX>(jT_u*S>_Zj-9wjKIfl~Jwk4XcxY zqb~Go*gWy!#h;Jym&4#PI9n!jH^g4X#@|olbZA(DhfLi{=%0NCpKyq8um!VU7_n>I z&&K&JTRw;czUQA^XJZ4tA1oh9_9Kc 58!ZII1j864_G`s;Lp?v-j3^~wicC5 zzlbj(&$I6%bH{0&3$`=IdrE)1Q z1!;?l<51_nd_r)`8;thTSRR!%L56Xbea^V-4f5TNM{dHUjJv zZMJSF!Go2Xluf^fA1t=2v<~or>cLomaVp7hsPo$KPsTM+dTw)kR_{2MWBXh9yBU1* zeWQ}o(&3@cAE)sp_EzG$veqNwJHzW =B5%=k>!Nd}eYEr)c_Skk`|e&l zH|4=B{8^mXSW4^2@hQd*O&<++#ClSr#-|8N> (V%uAyejZ;~=t=BtFqO(U-b-;9Z2}gbL3?o&@p>I} zZHewB&xJ$w3M6in#UD)I$?8 em zwo>$B5^F9^&gy=|pJFfEbAj!#6Wd&Y{^Z>jN$5yr5%LBbKCqadz2v%;8ed9zk$VSs zZnnOG_SJ5*cfNuLZhLolc4;C0DD5Pl4ruI(oeEhtS>qUNL!`FDrE*UA3uqz_bhnsT zCL4uU<`7w{&GR*5e`{kO!=IipXT*G(eXBo)b^umtE0`$+n1Pk{0xZns?OZuCDK{zI z;E7NW|A9Ro8OOCd?VSe%=jgl7FW5s2YX)-q2Y&?ClCf_M>(q!L4sOfwO8U`hTo`sB z8Y#gmGIjkF#oqhUUm31wFU*&sW6yo!PW4aP6IFFVXWaD6( ndz6 zPkQIvClzx+@-umq0>E$TL!60TpN@MrmdIzPPdl8^HCbnNbpNgt#==G9Rs2!#gGKh@ zd*m{p@Lt !^hL_Bru*Vy;**C9FnXh8;x?qR3L9%FsJa9Nc$?aUka zYqKsn3%6AyR>s!t!z )U! uOEElU#D^t|5g&~rHMU_JcW &+IWDM zoCXbKg_u?ROAL@fnx}#Ph{tP*GWnO34X*HID~hAnLFk{Zix6GM+;f4=GnYdZ {i?Qs07230whd5S_TjmUjnPxf_Iuo)$HUi?+?c20G;iK3V zv$Q##>&TliPxf60C&XN2|G%OH@973}@%?4XPGvuEcC-Wesrdo+cZ&Eg GPqz?NgP=NobFZ2aoB#NhfI1+7Rm>@lPw47~8N9AaaaYr7=ZZlzYFW zdqxFhB!^z6zsEQJ=`X*%6j!2U56!D#i^?bbe@0aD|Iv4>ox*pHGSV?cK9f3r8?1Vt zbxjjB{|H~sdHmKA8yZ<+r)C{ak$m#@*1^ue$lM^l%H`5Ajdh4c_|!)_**vGyuiU$} z+%u||^!H_GPumx4^s)FjQm!YXsbmKHXz{Z%^1|c*zjfe4%6Nf~o!>l<)|@GqwT(8{ zFW6YS4*%v8c4} H^YbIP(CpyHB~Vf zJAC_3WGr#8%dNi$ 5_#?X ;Gjxe<2rBnRn2oXFeR` zcRN3K)H5^~a&uv9pT`CAZp=OE|3&|0T7Pb-mGn26&pxz?zf6hTPTDT_iIt4MlG7gE z@#OS}2S}`a9(=v*MXF1AJV!ko9v}v3I%nt^)^bjYKXLT1VzVatzv8R1P9vYN{mqr_ zFW;Y)hpiIK?Q OqwjJ-UVFZlr)VGL3H`}Q?b~%<%dv@-H{%TY4D%^BxRQK~)4YT-XDd%-C3aof z19CAx{&(0|r-R+9Y#sA`)EWE@{qaZ4j<2(|XMT-&qMnLHjejVqCHm7WX`}HR-#1;) zY47!g2mCrY0}p$Sv*)gr6?1B_OnkzL*J(1q^Yycr!Efb{zO#O6pF&KGgqN(q7XDCo z_PJu-0pIPCaTAqR!iV10xaDDRSUSiV9ozgUl66-3>NC%ct($#Po^$`Uq>lM_{da7a zNk1$7$j0|tr_^Fw09QJQA!YN@o?#1TD^KriRvf8*S81KKXq@LO`|Y%V$K+#*e-ZNA z+N}MpUXb%WeF!#DVz~R>zWFa1PYsjaSrL|wK!4$b`CWVzqTDL31@~5tctmzptryo` zRK&0+(YC9lNdKs#A@ft)j^n>V-NDt GU zG~p>5Ulwv}`HJ-=_|MRG)+pvmaf)&;`YwIGWuC8qi?aON;CI0Rdxq`PIys|%j;^*3 z$uF-rU6(bD_} `@sTEO7ww<@cGy#fl+r%I54ypKJKtOA16tt!)1qY!IQIOlT?iKRlg)D~ z`}JTm!M}}p?k$?1$=1<+B!3)dRGYCC{k@OzYH5S$WWYkqBEzAm5YO3CYQJXRYxdc| zPt5CF?wqzs%2)g`=5>7@Ob}EpkU4XFW3fN8=7+>LSsvh;m~E`5vGO|z{S6k?Ir?-Y zv7iJi@OpYd@_Vk<4r1qEZxQBPN#*Eb^iQ6pb2-Z2^t~GDOglo3G6u1{a v*%?`p3DnT?gFiGDW{Jczw^E25$*YDe_vzWz#n#C_d^62 zZ$rRVZ!#WE^1wHXHF?H|wZJ1DKn|dT__)3tEQT*tnmK6vPKZ7A?27Wf5q!^@rCMU( zHHyY9=A(MfkbTnm+;MF51b4b&J~mn>&`*AMI~Gs$SJHF(u3kn~ uq><>VvGYDb@QO&v7oN z*mooCSIf0I;mYdCSqJl^*whWrCD_YD*z#|O%W1Y>F+TAfteO76EV$^`S=;A6kJ*yF z4C=m6d_vp?WWWxst;{Er6}rj#)zRO$pguUt;qNr=K~HRJwx&<8JB}P?_!_(D$`QY` zcF8`}TQd5gzsEVYi#V4vq{w%py3PgdY4^awyc}@{EI$y{28lXuoH _)?R{N#;D0aaJ#?R9GrpPW#KUh+Ct6w7XlewI ~s}fFHlnDtB%z6Aai=9`32ho(VKjQ}0)UnP7og@FAh#&buZH_o0Pv7)6 zkq3aG8lD>T41VkV*>j?9t2K2FpUt5 F;aqPgNga zLSNn~Iyi1rM7t$)n }1LM;Ga%>>)v{1Y+P( zwx>wP0z5p~r&y)<0P`)eR< )DD%^~oLcdw_kf>vPrTXG#^*S3z}o4| zn3w&idnhJvt9U^E$n2|oP&QxVflNK{`(jOPH_1=pRxz*2JyJRPb03~0KIuZOuS1W- zX8_&Hcp=9JCG>^{(40fxbXC92+PE3oJ9wL7yr#BHi0;YYjk-T~@uQynz^BcQ!5ZtP z@tO~lPQxb#Gn`Q8_`V3v1V-YCEa`uLIFYfjXZg~>Ys+)25B>F4+t0iu`*2Y`oEAFM z7fe;`iFB^Qa1?ROoC*8#phKY#qIbG2$&i|>ps;Iv)U0*bw8Pa}Z$ j3e|8<5B2K zyUrZ0$FPPIJM`##&ez@o-?csU(5sAomN)c^uu-((03Oga@DoGB_*F4riO=mZOdMA> zzMnfR=eN`H7%# Z%xnxd^Hs-d{cINbjUu!t9`(Z!d@9R#% zX@XZ|L&WP#Ev_m$HU23^1^sb2{QUxTfJ}RONDn7I@1~i9Z2o|_pp$-hiS^6)98FNU zv~hTA-Ndf82JyITOw3DV6Zukx{v@zPx^oY|9{PD~7sRE(-WC0=68QL5`Neg(>{k)- zQjf03H`w+WN7CjD9{nw@Zx-UVy>`5NDO=}_vbZANmTIB9y#p=`ADu;uPnhqt qkpttu`?1uXO8!x2isQn$vK>U*|4YJf#fl(yrQ1`hp(6W?>qy4}>f*gZ zdoDaFzH)x#E^E0KY98O#&r4sx$9DC|U#Z<|?n)UtZs5_)vxgP@c520ozen2;Z;jOY z8}_(LVO1fNaVAp{ECK|XM+}6T_bg2KIx7d@0r;GCrzFQCWif| ?xXiqxf9KW#{ z@*ieh12L{DCw-mASG-lgC+&&yDraI(pf5hJ_(!sCn(+bcpRpWk{P{k%dy3Q;Pvb?O zzfbGww5{bV+T%0KzAOcKlF 8%ALXmD2r{2Bpy7dbTuc3V$KTa?_-*fwzWczG)+~$pj&W_!2}Tm} zyx1=beI>0+t#$YJRCi)$S}Zu~o;_3s@l=>I#&5W*#)w_u1I@>v%i&v%&R}zh2}}l9 z<`1{iBXd8!RNG~&!QMh^Mm-j=cQVh9+(EvLmA}Hq>HSRR@r~0THG+2E>i#}cf1|y4 z-Sg($QB#&az{omN{Q4|ri`S`^GraGIe2zxm^^fMi9`lcQHoB<{eCX&WSUZX>vb%Ic z=)+iXxO~Nk1;1AQh|fuOvi5>DjC?RTEgBhK)lTupz?Q+>6#I>A)t*`K7O}^PM{9Ck z{)yNj7#m`nGMl6TF^X_bfTF)g<`2fMCmGQynNPdF{XK 0GifIe|^JRH2PQKK6)7iIUCypb8z@5E!Tcb%(Ww*yL_y(?a>D9u-W6k#9Bl4 zYn$_%TWvmizSdx}w<_}yQy#or-+n;zN$)Tn7C#5G18HwTzMmqy4!)3wr1$yQ5Rw;Q z5pSBVH`I8h^>R-!m|1Hro<)x6Pg-wXbx`V;f@QQ4yv*N>{q~29j;+CokA3j}$4}6C zfO9@!|6^Wh`=W6+1|KUul31a(t{wkH@srtoBqQvs_6dz`yh2-r-=u#sS5Lbq9vb>4 zV@(^=<;sK}5uO6=t=+@x9JTPfzoYlDKcUy`X_{ZiH($vY!EY#&whLXeFC#jA)pezg zhy2-bDf%$q!JIF2&Qm|~o9K|>hu_F_?103;Vy>PTV$*+mjbfl&Xz(DL*w>eRj`5jf zk6q$5!)MId5W`)Busq4v^G=FLX#_l*XDP;7c6?t4{o%hJ(kW)i&$h6?g!D<3m@m`I z?(E@JxtR_5p?Dy9_etFE?@#iQ_qe K$zM-!`2Vfire=ue} zDI1XaWajhKH=Zw)$kW2}WUZ9NSVM-uzgd{`{G9vEd;>NU?2qUlq_oV0_w442?oR<* z)Q5!aD%$Zf@y2raXh~**FI#siKO~m}Mw_I#LaB{MSe7p2PWhWed)8S2S4*%L@docB z(= Bd|NJ$R95DGIe1bXzxhRfLHd&--|V2*tU_2%zfcw7vJUc%=ebxnfU|c z)-F~2A u=acCw?3A&1KuJKb^0g z2hgRK5B`bmIZ$)ENq7W(&~-xAo2{SR%lrk}r9!Gmq`lg` %ZVyAe1 zN0ap_#WXIii9ORT)>AS5U|%VC4t=F*{8RELpI~vBwk;T|{pNmcb7cdsd$acXIzMbu zKUr?AL2(If|I6v0)>B0S7wg9H;jC+Xn3Wa6J?l=_PGH?>8^u&lWT;~ac|(5>?QPs3 zdKy1w;VO4co7XYmx;NQ8r0)?6PQ+D7Th%o`EhYDLjjpnE;E!yMf&LSppGx&bpJAOj za$ulf#D~)3Y9NPW0cjytQhWc2JS`b2-w4*hPf}cO^CzW0Nbpn>PQkO@?=L?M=AKUC zV@C}Qr;Vvq%CpMY`}@K4_qFt0NnK1v$cF*ndF+BVuBZZ@ 8mnvhfT3 zK6XuPS$Q77=1fdq sY0+OWmK^)d51AePz_u9oFY;FQtM q)j5YK8XyN)EAH!U>Z!5e-srEdlJPzIc0K()z938G zpIPv4uMfH2KX21KRDaEBvgV2eE2s3=7@|r3YRJ0dvSYEw5OKcn4MpB~KSO<%5B{;~ zs~%sUdmS|y{;8{QzejfCXCA%D=Go0wkhHH#?a%rGy<>7f^2631OCPQ;A%A1LXC8U* z4eqa3-A@z#zz=%D_dXG}Y5u|6tI3gi@U60){>)u6rf01M398|%#vW4m&7x0Ed+18@ zza63d-TPj7p7~yQ{AnL=v#($OYyVRI3x&87mSG3{LmlH0v2a{+9Qem+4?Wg})od>i zAN1Bd@M8HRHLHEZM9!rt-Yxv4pTxF=?%Yxz6yfP?zJ0Va{1PJks)y)qZLJ>q3p{V1 zD>e5-41hfw7R5Z3ahCq d%qMD9q$hC zk`C|P9+qi-mwl?3CrfRI$b>R-!DT@&*%{eyhjCG*x;veCj;@Da2Ycj|mHA#?a_%iT z! !(4%&*Uug0#?hh}SEV)~b{%Ic}I^hq(`g3e9)IXmh{Z*Fo zH<|yXw}fu!`Q`LX=x(z971}HL{LnP1yYW^&&({8SUgZ1jiW!9NzHxfeZgnq9f9z)@ zuhW6;YeL_vUvK?Fs_SXIxpdHvV*jss?D)QaVLv ytzMZx9K{X2`QO^iJ2?=_!-EOC3jo%P%M z_yJ#dgM5c>u{aCJ3KDd3dfAQB{gc#_e9`ssS-=+sKS&by<~)9f`MR-}%L47?1YhHq ziZ42Gm#`0cUxZ%*dpi@0DXv9x>{)g%>OY2i)c`&q9{F^|j$&^+#*DG8CVfL91E3>z zX7*vmmzQ-*_>M2^eXnr$hSGk- -^jk0Q?&0b>*0`7 z% ztU7$Z@X5A41*IoCA9$ONx *&Ts=f%Bd(j z+Z5<_$~>jN(W6kWW{vsLnenM1K9h|b<>zO#Ph^2zi_Xp;{N@_@fW4LZ2===v*bx&s z?`7%S9*I)0<*yp~i1{+IUnAo=WL{~C>l7Hj(B|RqbyIqpUhD6g^lvBFz05Op#?Sk} z_9lx-OJB)4{vMY^-=i$uyK0>RYdKgCx=QhySm)0^IoV{gQ#T4+mVMfG*RERt4|Wi2 zK8#J-yPLfR&G$z(erUe5-+kuej2^&xRP0cB+jIMHZQJ3a)||7ljylth_sKtMy~b;c zwD$`8ozHmqi_!;gwQ=*a@-IJbd$L9f(?rPQOs66lC+=h2!78msnRMT$%%>gu5c(l; zkQggWkuJP$Qjb)}_3zJgJ=(i`uQz9n(Dbj6u#MB6kgM(+!BgJJe#iBhPI-77M&@-` x*Up>|y6>~grrMl8{vRaXGrNiEP_7=G&Ze^%IE#U^7&wc8vluvwf!{j}{C{pZ;oATJ literal 0 HcmV?d00001 diff --git a/YTDX202303TCP/tools.cs b/YTDX202303TCP/tools.cs new file mode 100644 index 0000000..6ca83e8 --- /dev/null +++ b/YTDX202303TCP/tools.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace YTDX202303TCP +{ + class tools + { + //获取当前设备的所有端口号 + public static string[] GetSerialPort() + { + string[] ports = null; + ports = System.IO.Ports.SerialPort.GetPortNames(); + return ports; + } + + + + /// 16进制原码字符串转字节数组 + /// + /// "AABBCC"或"AA BB CC"格式的字符串 + /// + public static byte[] ConvertHexStringToBytes(string hexString) + { + hexString = hexString.Replace(" ", ""); + if (hexString.Length % 2 != 0) + { + throw new ArgumentException("参数长度不正确"); + } + + byte[] returnBytes = new byte[hexString.Length / 2]; + for (int i = 0; i < returnBytes.Length; i++) + { + returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); + } + + return returnBytes; + } + + /// + /// //16转2方法 + /// + /// + ///+ public static string HexString2BinString(string hexString) + { + try + { + string result = string.Empty; + foreach (char c in hexString) + { + int v = Convert.ToInt32(c.ToString(), 16); + int v2 = int.Parse(Convert.ToString(v, 2)); + // 去掉格式串中的空格,即可去掉每个4位二进制数之间的空格, + result += string.Format("{0:d4} ", v2); + } + return result; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + throw; + } + + } + + + /// + /// 字节数组转16进制字符串 + /// + /// + ///+ public static string byteToHexStr(byte[] bytes) + { + string returnStr = ""; + if (bytes != null) + { + for (int i = 0; i < bytes.Length; i++) + { + returnStr += bytes[i].ToString("X2"); + } + } + return returnStr; + } + + + public static string HexStringToString(string hs, Encoding encode) + { + StringBuilder strTemp = new StringBuilder(); + byte[] b = new byte[hs.Length / 2]; + for (int i = 0; i < hs.Length / 2; i++) + { + strTemp.Clear(); + strTemp.Append(hs.Substring(i * 2, 2)); + b[i] = Convert.ToByte(strTemp.ToString(), 16); + } + return encode.GetString(b); + } + + + /// + /// txt文档自动保存 + /// + /// + public static void AddLgoToTXT(string _file_name, string path, string logstring) + { + path = path + _file_name; + if (!System.IO.File.Exists(path)) + { + FileStream stream = System.IO.File.Create(path); + stream.Close(); + stream.Dispose(); + } + //using (StreamWriter writer = new StreamWriter(path, true)) + //{ + // writer.WriteLine(logstring); + //} + //[1]创建文件流 文件路径 和枚举类型的文件操作类型 + FileStream fs = new FileStream(path, FileMode.Append); + //[2]创建写入器 + StreamWriter sw = new StreamWriter(fs); + //[3]以流的方式写入数据 + //sw.Write(logstring.Trim()); + sw.Write(logstring); + //[4]关闭写入器 + sw.Close(); + //[5]关闭文件流 + fs.Close(); + } + + //十六进制转字符串 + public string ConvertHexToString(string HexValue, string separator = null) + { + HexValue = string.IsNullOrEmpty(separator) ? HexValue : HexValue.Replace(string.Empty, separator); + StringBuilder sbStrValue = new StringBuilder(); + while (HexValue.Length > 0) + { + sbStrValue.Append(Convert.ToChar(Convert.ToUInt32(HexValue.Substring(0, 2), 16)).ToString()); + HexValue = HexValue.Substring(2); + } + return sbStrValue.ToString(); + } + ///+ /// 将传入的byte数组 从指定位置倒置 + /// + /// + ///+ public static float bytetofloat(List b, int start) + { + return BitConverter.ToSingle(new byte[] { b[start + 3], b[start + 2], b[start + 1], b[start] }, 0); + } + + public static int bytetoint(List b, int start, int len) + { + string a = ""; + for (int i = 0; i < len; i++) + { + a += b[start + i].ToString("X2"); + } + return Convert.ToInt32(a, 16); + } + + public static int ByteToInt16(List b, int start, int len) + { + string a = ""; + for (int i = 0; i < len; i++) + { + a += b[start + i].ToString("X2"); + } + return Convert.ToInt16(a, 16); + } + + /// + /// 将一条十六进制字符串转换为ASCII + /// + /// 一条十六进制字符串 + ///返回一条ASCII码 + public static string HexStringToASCII(string hexstring) + { + byte[] bt = HexStringToBinary(hexstring); + string lin = ""; + for (int i = 0; i < bt.Length; i++) + { + lin = lin + bt[i] + " "; + } + + + string[] ss = lin.Trim().Split(new char[] { ' ' }); + char[] c = new char[ss.Length]; + int a; + for (int i = 0; i < c.Length; i++) + { + a = Convert.ToInt32(ss[i]); + c[i] = Convert.ToChar(a); + } + + string b = new string(c); + return b; + } + + /**/ + ///+ /// 16进制字符串转换为二进制数组 + /// + /// 用空格切割字符串 + ///返回一个二进制字符串 + public static byte[] HexStringToBinary(string hexstring) + { + + string[] tmpary = hexstring.Trim().Split(' '); + byte[] buff = new byte[tmpary.Length]; + for (int i = 0; i < buff.Length; i++) + { + buff[i] = Convert.ToByte(tmpary[i], 16); + } + return buff; + } + } +} +