From 2ebc8235aa0e489fe0766f0750623fbe87b180bc Mon Sep 17 00:00:00 2001 From: Eric Rice Date: Mon, 10 Jun 2024 01:56:20 +0000 Subject: [PATCH 1/2] Fix #1087 --- skrf/io/tests/test_touchstone.py | 18 +++++++++++++++++- skrf/io/touchstone.py | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/skrf/io/tests/test_touchstone.py b/skrf/io/tests/test_touchstone.py index cbcdd3617..4dc931da7 100644 --- a/skrf/io/tests/test_touchstone.py +++ b/skrf/io/tests/test_touchstone.py @@ -1,11 +1,13 @@ import os import unittest from pathlib import Path +from zipfile import ZipFile import numpy as np import pytest -from skrf.io.touchstone import Touchstone +from skrf import Network +from skrf.io.touchstone import Touchstone, read_zipped_touchstones class TouchstoneTestCase(unittest.TestCase): @@ -221,6 +223,20 @@ def test_ansys_terminal_data(self): ]) assert np.allclose(net.z0, z0) + def test_read_zipped_touchstones(self): + file = ZipFile(os.path.join(self.test_dir, "ntwk_zip.zip")) + ntwk1 = Network(os.path.join(self.test_dir, "ntwk1.s2p")) + ntwk2 = Network(os.path.join(self.test_dir, "ntwk2.s2p")) + ntwk3 = Network(os.path.join(self.test_dir, "ntwk3.s2p")) + + read1 = read_zipped_touchstones(file, "Folder1") + read2 = read_zipped_touchstones(file, "Folder2") + read3 = read_zipped_touchstones(file) + + assert read1 == {"ntwk1": ntwk1} + assert read2 == {"ntwk1": ntwk1, "ntwk2": ntwk2} + assert read3 == {"ntwk3": ntwk3} + suite = unittest.TestLoader().loadTestsFromTestCase(TouchstoneTestCase) unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/skrf/io/touchstone.py b/skrf/io/touchstone.py index 601fff63e..b62c5ab79 100644 --- a/skrf/io/touchstone.py +++ b/skrf/io/touchstone.py @@ -871,7 +871,7 @@ def read_zipped_touchstones(ziparchive: zipfile.ZipFile, dir: str = "") -> dict[ networks = dict() for fname in ziparchive.namelist(): # type: str directory = os.path.split(fname)[0] - if dir == directory and re.match(r"s\d+p", fname.lower()): + if dir == directory and re.search(r"s\d+p$", fname.lower()): network = Network.zipped_touchstone(fname, ziparchive) networks[network.name] = network return networks From 1241a63508d4e23fb194b02f4e9f34e214c18599 Mon Sep 17 00:00:00 2001 From: Eric Rice Date: Mon, 10 Jun 2024 01:57:53 +0000 Subject: [PATCH 2/2] Add ntwk_zip.zip file for test_read_zipped_touchstones --- skrf/io/tests/ntwk_zip.zip | Bin 0 -> 17589 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 skrf/io/tests/ntwk_zip.zip diff --git a/skrf/io/tests/ntwk_zip.zip b/skrf/io/tests/ntwk_zip.zip new file mode 100644 index 0000000000000000000000000000000000000000..97b51abc32915620cf110d5e2b80783838b3d20b GIT binary patch literal 17589 zcmeHvWmHsA*e=~&(%lFM5(3gG2m&%gwcoDAZU(t(XiA&0Q7^ zjU07U&DH6Rorj39i)kKTl&|T6#tqVwS9Rw#6^GZ@Q|EmY zZ>(3^=WuRM?=xjfo_ffHl`%7zyd;LkcXM)t|N1SzaDQ|&Z5e!beNY#2H5jsdf4U#y zB69o?LbRTozoZ|#dhzonW7aq2rRf`;aCTdK0kND`(xXb^h0OCAG=`+5<|PIQyqbwa+} z00SPAg6aT(z)F3T$Wm2SduhbW%KN@-V`i>*XvZr^BVUu9I1{oR4MAF~`rJ(m1CIjI z{vE~vv`?R*hOoD8A4KhI?A0QG#Sz}PwVKHc#6^&m+AWYT5%{~YkyVsPqjWpueXzq( zOLdkjr?-1>fbBpjS?=Wq=(-&k%uxXfZ36;1wh4d^&Zbd(RTQej_%ERc#zT_QnxR*X zNnbSgYGl>LgJ9q(X2I77`pI9;Sg@Hdt9#>!+>)i4!+f3!VCzh*1vrQ=Yt$Y`L-12@ zT_!JI!gg^@uM!P-i$2JumZh;^y~Z`EZR%sUU(DX(|X_v`i?;nBwC z#cEo=%yU+-IiqBS8tAyX_Fat^BPQS{1lpnW{h@(vh|>u80)IFF6G9o6DqF-wr5Gwv z-$qc1$g{B_4M!`7|7jON^4BCzjQRvl;G@%wDB4>o%rVQa&Oj!8_Esbsm8(V>13mq) zwzCjKNl>;nZ*$EdjTO1$cEnk#E*49*tiTUO>U?gzQTlisJptfWw>mQtx1~0#-N8OM zfNbxSn$*L2#3?-zUXbsAoS_I6)v9!)k#10Eg@EFK3fVsBP(t9-XNd~E5dG9Mb+fZ~ zVNY z1FkSJ0=`ntPIoJDB0<{0xWK8E%vBtU-?Gq#q#z=o zpQcnMGaPpGGpaVjcx{!_k}qIe(n`_|Btaa`MB|Ne918a{Zvwh5oYQ$xd|qHUKg-6#j*_+CvjIsVkV|^IIkEpb)DJf0Ul?uWkyQw zuj=v^EAeS}-5Pj&dLftP(2nL_O;~Rw9-*vm`Bfs< zPk~ep`J-x}1E|qGW;!~R*gE>Snhjrf2BG$mV2CZQBZ}pQorP zlvL!v3R)3!6J|lq-j?bq?40;sI!~qV=wL5r_^)2_)m5u{8~9@~sq4^TbUW#IVKzjt zw>d%^K71kJ<_&wF?S9b)lzYUz?Yg1m)MDkHi*5dS#HEoduBj+IW>&{ z*nQ?!u7u7@WSF2h9yu?X`Sx0|9R7A7Jws~(y{Sq1wiws&k*OWa&9OovWLrB)F}CKg zf9p#QYssI$1S#-5JI6 zFbdg*Mt^}PLMrcI-i7(qrL~)pC1&|%YZCU4(}c_Ih7$(avbhY% zVzFT3lcsA#SAK+m9GLYrOpj2J&!>J}TWhW<)HZ0{42*>T;*uV`11B|=zxhPrcr--Z z!O_k~Z7icSP3rHw84M_EPyK39Y<#p2kANn?(LQe|f0Km_-O##sG*hBmQ$_P{Sk!)K zwGxMR9!;kWFj47h#0=%JJK4$o{;e_ZUD#lcc|D0>HmVatHFebX*7z-KG=ywBBfE&k zK1KS4xOt~j4`gN3M=k=WU;sXWuMxdKNgjn~jqknBY7j7zWlQ||!!Nvr))Rc_G^Tp8 z6+vU~zDUkTD!1imwK^AldK)^bWZB;ERvgNayw;SmN5SOSo$AI9?FMe$3>5C%4mNuV z=&9y?ar^*_P+JB?%2jP49ihfdy3qa3ZQVe7@0VzaZ10V;_Nh_|l4DsU{c=xtepSH0 zDm&d(9&>+NDo}a^%!}YHF)+@xu{)_6683jjH_RzHE4DMSV!4M4ndBQ5B@UowBP3dr z6J?m#%hp7*Z{{tFoQAuGDbjX>02?-rAm4CqN^GcWwx$qnPMKLnR+&HBM$k=Z-nN7B zH#2w#P;GCeWq*smLS!Hs+DfVXswj4LMJ>bBJjnUX?yZ+s_-w7@D)Hg^1|(3=y1(At zGrf!MMNIST>pJI8uSX7aIJo@J!V!VZ7c1s3c+RFY3GV37Ar;i^9LIWevsS_fAzbJl z2V*}qqBKsp_8{m&Mpx^*7k%~4^Wkp^E8Q}U0oG6@naC7>yhRo*m5BllW&<+^yRV;` zC~Y~TstJMjUi|RJL$lAk>Z1}&NwWsl0$G#^H znW#nnjk3)ks!OP?-P2|NzPW_0wRc*ED#{=W5;*^{L#J~vN*btM15VV5YOXqUs=awb9u`a#;h`t> z+xcm6$@N}1!YdtT7FT;ue~oarfpj9B+ev&xu#L$C*#1fjhQ4!J(AY5(u3YoRvab&I zXGvz%1)nS*xEv^7-#9aH0rFTbuAw~TZS?&Z54}m`Rd9A|-qHDu4Hc&RsmsIVXw3Gx z5ffFtbOWg!OvYQgX*&9Tdb3yS)-qvEx%Zr7F@@YH;KY zCQgmtkIHDYKRevq2x`QM*>Uq8L`(yN`;%?4XF->uucD%DJIABo{Pt6~2HlM#U#SgI zc{JFpu{fwN;br7|F~}p>_wu2U^^2u)jKkClf!y=gfG(i|KuGQc)9C64Qn#tIkzd zjY=Ug3>ydS2!yGg{}^=-4T9{BG5IZ9+E$EfwbgBx)1t}>wm^t&XkEXQ;&Lqb2y>&v zjJlQ{X9jmjxNSz#(JO}QD(w9X5ZZaGky8q8uo5@NcHN=1W7@td1@3==H&y^nlvmkY zOQz|i(1VuYwQSi<^Hhy^<2t&)5`r-YL4|dp3*$Xx= zlt071LlK(`S<6l3@7sVevQzWg@p>?o z(j0&*nlLATi$&W3v~pMfwxhe?dx{&&ZbyCh_1MaoeZ8>*|gm0qN_a@+`ulavY7 zf?nICIWvgd5J~ZssYyrGKBScu%`xyRQ?AsY@UwNK(H7D}_%V=r*x9=xcv%v0MBsib`KQgH#vjIfdR zt2@6pcT^gdx4JjCVbiM~{<7zGVQu1npChPNPt^qSse6 z!)`#LnSKj^<~sp!$4guSJjdv%jm0eb-_a^YeNC?M+?lH|tGE`uA%PS|VQ027tln_0 z8UQ(OZ-4+PpF z@)?7 z=baa*BPWC3?%6s~=WomB_xHA0>i72#T>Ut1k7@Bsu*Tch*cxYQ)7GPTt0d439XPUM=8BT)RJ5N*Fq$wb%KW zIj={ORD4<##Ag`yBt>}l#_udM^Tg89KbQkEl%dUO7f6&A!X{QQZRs;$ppZ-H4-v@y5pX^FZnYz>X7eqF%RM_U z-cI!gnB-K=1~IZYJy)Xw$FbHf=FB7_of7PAZuI(TN`ui*klT+Vyk%c9n0|s#tN#n< z$lP@;ASH-XM#*C@lSpzqd!%`8A*!%wtf@)1&SprTmoy;kNk&Pg>71NDw0|7uY+SRh zSES{`Z_4*n=E!LX)|m5C`#m{bo?IDSOEq zPE(n%x#=jbRDeOeHyi0oj*ELNcXh>{H@NH_^u;sr2vXzSbNmFVXw%-8@c1q>xiIOe zD7xg@$px9JXO(({b=8pfk+-osGO<%`-5efr_Tu@+#xGiRbW8PFjyTa=Bn=Hc`vGST z=0+Tfuf}FGfCh>_%eik=JPE}25f|g2?-(wusex#Ra_wp|O4_+_53>IE1mI#XnyP@> zk0+lHF`nFb>oGB{Z;E;J$<&e&0qNQL28;p<$4=?|VJy%K2sTjucSBBu{SG-LMydx; z$EEdWb(XGevbC3C(3zh0<34844hN_lRoC#jZS1t(mspL8FgL96FUzco@<>?_D|6>C$68M*wpO{1j* zNra8~U?3_1L_mD1I!5AgMZao6w4yqX3s!K1?wk(QXCP(iv!A|}o+&2g6u+?`wgMkD z*M_?JRUDN&)~!inpO4dWJkNQmXJ7=sM60i*Frdv(31)^UqVFJ{mJ8JmM4-7Y?qy5h zn9a=NC~a=iaZ@T6Yg7Y+DjRFF(&LWp#RI@#lKPEmI|=XPu}#jC(G}AUF)M_a z#gB1HV;B9tL27>z0}}6*NI0-^fJr-o_Sm8Z_yTr*itN&jPXGNLZxxTFO!|mTKsNOW zoi|~q3Hyf+G_ndqt~#H_YVwT&VVYiQgm$JTqQw0hvpM0)4_2*3=BB%04v~E~muM-~ z3>uk~-~_nGo?7Dhm4-_mv;I84f>P~lk20qP+hW~DQ}s9{zR>OZ4`pMuUiu_@R+(D% zday{RhzfSoLE_cM*L(&=;RNcW>cnt_Xygb$hqtFSrQw+LJu#JWZ5dfxl?)^#rOz7ivNWO#n6c^WaFhsiArgAv#xkKRT&&By)~-{ zGAu>aJ4YqUqgyu@c1~x3Nz@@`pU!-af$n@!Vvx;B_WhadC4rkW7dY+v%(rIQ{PA%E z+SXhJZzpO!0Pxp4K{$t<@KxlCX3zOMYCg~R2N-`1NBep0oH;}yS@HP#dWBYeJgF6A z6Ssns<+WkW3LzwBe|Xu=UwY#!kL3l`T@!_p8smew5$Yj22a$+N7UvZaV8R}pmr4I| z|0CL(#}2NT94{8?9MG$Vc4+IywrbLI!3M&obgwwDC~`;;=SHx2TLGi8cF%4>`l`ev zUZxWNz@}@nMh16 zla;JA_Y(B_u+rbTn{pL^6(YC<1%2cLsoMx9!6}Aa4U`{AeRMZ>y03VICv5}@*OH4j zcGV~yy7&wXkAJB!d=nkTijPP8cQrdY-5U#6`5~;hi2RVh?8G z%d20Cr_!eP4It1M7^&9#4sksQuFWxt^0k@EvoOI2jcYuY6LnT9Zsg%_OEpTc6-eJP zyP2~4sQ(4+&|7@;>8dbkxc`e**M47=;d&+Q&h-PLHOBYW)(8;`teVJ(fr5 z%X+`ql1H2k!0iJgPp)FANjWuiPc~9w=8B}?%o7m*T6T`t?@4BO#-9gdI5$#=F|1W4 zCr1{1QeE~t8_?8sh&p_gsKe%~EaFfUf`M8}dV{cEY~fMiB1cqWhxQD(Cn#lc57D(4 zG^1ibEyF=+-xjdQRJB5cZ2ah928PY{@>eoc2VGT=x}sJ%EB%siurOTci%GT-f5EFv zc=73Tj)oq7GKVRk7bu2Q37U;wYfScWL;1JjD@DY4S{$o@qtJzjfMT%+esc&rWI&(u zK_{<_w^xBK?Rh25S|aUyv&rPIE9tO@`Vf1DNdW;x)!_Dp?h#LWZ$2u6>Awktj6YIL zxY310YwG*~Wj#P0*Dgwl^h(+bKSWA}p6*QQ`rGjcBL@J_jCZ3`_-I^h;-F&jQ1U36~CHL7I z+c|5rQI{KOgJZ9-+AkMl6m2udj@4@+N${;v=_$AopxJCZ;|U(oxa%{$Pl&h_roU~y zI^hoQe2vH6gDelQko&btF+DsnwT7Wt;=gp}$KTrX?z2kY*&Jfrj)Rn(IdPd!n@A)4 z6@2a0ZJZCB#2Yvu?1m@o73>pW7CGxvnYiDSYLr+v+-O2Dxy4z6c8m)6*NK@olN{L9 zzO`8gGXiv$k~VN@qLfw!iJH&GCCqohH**C)*s;Ej zy}fP;)q>(92+Z{tB@!`(Ul4tJPyOT7`Vd%XBl!N7FOrzQCiUgH)?ikp%T}z?(`DVk zj6jrqq%PstCd=Nu6SUn(qxrvsv63=E(k$$cJrX;RG1b=o+5#Tq#<(kRr74G>_7!p4 z79rlegt?LI24Q$VFZ^8F zrDW`^llR146(AE6F^DvycXA!Ls637K>fXCqP0(f4bf2?9@qwFM*WMqhEhjfPuxGwP zneuo2UYudiZZSibQ}WjGzSx}E#g^5s1z7S3!MSxOo;=%sCt|;8oLGocff{I@fpZ{B zt)lKb@8ch@nj-QF`?%`oU(sdR&RXmYfRvcPk=YVaj8BI;XIHtJejp;H+4t9WZg6z; zlp6rQ_!ZM+UEj4N4j;AH6svFXy64ntGS_(fOH`vg<=X2}m~49GE+9VXSvL<+-1l~H zd8Tsj1M*x61t3UB6SAYMgDJ~2AQRT8B2~_~g>LMdU;FrYsj^_yz2%$p=LX}(^9i{( zs1lO7#`w=Sygf2mp859kVN~Z-q9=8CMOxNqjtmC-$g~>8XL_TLPyZHK+y*&z1TC%> z2$4yP;c-yEI+Z0WLv4^=N3>GQE&`Uhgj9(;bcYWmprn6s)MtoeAak4)#+?e*+&snR zj{N@W%sfllQ1w0ZhF@6WtQcCnC1@6;q5Y;{9vw9*OedwbF1N6GM(U-(M%r0uWZ z@>a#_z#MYu9_@5jR)5wfqy2*xL}dIN2TM@NC$AOkttExSHEH2W*ue8`#@Z$1IEa1d z1?5z2H$Pfwy&z-HBclG3Z#fV7F&H`%)&s32s z>7)k@)M8gDsJ@ewK2FH_u@mb++u4w?ptsu!1IyUokZdFqS*Wf4IGQi>EUa;c-|@Rf zo>Raj)t{7Uk*{&#*Y&#rIcHi~JIyx5JQ4sV!oAR`uDLFo-h4Y>Csno&0OT9<&(%Yr zW=DE>>eZD)U*d(7B7dU1gB`GYeT$B}Ps-(YR^PwGWNMegQ8@3Os~c2XUpJ%~{cK7q zDy|^&>-Ug8kP?@s+i)(>?R)$&{$w}Mt^6hOebTglR?qp5w*GC3%=|j^)dHbL#1`}z z*jWh}OVhIqF?ytARk@144QPbJAPr%m$7lQThNv2{@O)g@WgwnA`VWM~*85p4f0{wi zQQsqhBM$Q48B=QG{m|9t`L0ZyqHj--s9a$3IOF=3yFKXCN(z6;wBxugoVLmshl{S1$`a8nSshHfXtpDQAiwR+AVxEJS zuViPNtYGqZw@(8y z3&;1F-~Gi8elc;*3>x#E+lf_CRsQ-1)c$E?t6;sxQin~KG4~a{zceSmtDly@}F6Wcz?I?Y*b|%S8 zU5BT!GT)wP*T`NYO>0ITWpLi4prGcFNrGd%p(x^q-~Shp$6rFk|7n)S;D0AX@KGCA z{%%-#`X5Ay>CiA|gL^aKs7%_*Nigdd&QFs7X+pwsODpH(U{-ug;whTE5?`#nJsYNK%d_(P z{mY4O58k(4fj5Ik2kPxn%Z$61M|*XaN%DbLo8K&d-kn|Ejr_a~ygizq{>dVLM=KwE zeRMhUGw81T=lEgra_jB-v(}(1{AAht#Bzbd}OOMBo)2W&r*MRsT*$i?An@?thg@J5S(7K)YSCTu3Iw00^U=m`;_(6WB>=* z8B;%@nMn8Qt0Z?l`&Yzm1y3v*WAXFR2}s*jWz=;BwdKw&XSofv76j*@m)M}mZ0E-V0hw@X`UJsV`jl^;3hQQ>FC3}Waz@p8)`MQ#o91MQerru}i15prwj0ZOUwPUm+uYtXZ&c%8$JMpdfIm46 zTu($t|A0}rNj^9yv+yHqu8iTex0U($fDJ*P$r=AgiPI1MyuccNe!dqk0-VK{XgNBn zgbtE#B)1Kie@o>a|Qn^K^ajzK^hg4%>+Gd#5Dt_O+rg{8BAg8&{T3uMO^J{XPkC z+7E0d?;1ObXC1Vrt7HJBH6r~?FPMvM3Zi{nmslj1s_2LLz%{%JCjGBfH_^tN^K{Ck zol*+*TFGm$Zqq+kD}8L2Rb>A5iDRp6>%fS3yDbbIV8xabdu;@oSE$+R>6s%$$!?!? z`Kc`k;2E^i6q>M2EGj4e9ZC;_GOyRqk4cDeR&^irCyuxYmBm?9AT3^NeGoePh7}$N zTaSp);$`PXF?GJrZ*zljHbPtWeoL|S8d2Xht`T!`^mJ(piG$@NZWeSWb5`BL?oEx)Ygop|$l zcbK=u3%XStaT7`1prsf@sL8KuzcM{Mz4!n)n?eF`Xn!i7)#@q(v74QyWm?4EI?CD* zgjqAhP)X5JTyR9qguzEmKE#_?`8~I|C=6dKY$`Rj)z-T)M$N>KFrK^b%($#5`33W& zB`av6m&2=|`@61SMd=f3S~vT+KPEx0DA>}n_IxoIG05P3o|V!`P?EbRCZ(AMpWcCo zG035;tPY=Whe+aOV&4ORlCVp;E-tY>RcW57$kDhFiyC!TRgP!uh5UmaZ#+9c8y@iw zu+o#h8Cs{%c8cr9!?sQ+n&;T4k)D-Rq{i%%qif%tt%iGspYTm)822@m zsaZSf8%!=#uul$Wcq6kZ`6Ka=S2)Ox29+csJuO^2v#@#!^4MRzvCFJ%hE;%5k5yS{ zWfIupB}an+Mw;2)2z6T|JlctnMjTja|3>4?FyDB53SJ>A$Sj6tVVY>C5)j^MWi2on z!n^UV!KMSa6Wl-Wq8_sal)Qtj6KQ0gD!qeQa68r5kdae_T$6I!N|9eEBtt)5GyPpHPp?47>17g_Ta28Ox1 z$#-mD*l^y7m}wC@b+FoxLq@b-5rI%PqcCw$rAHb?MZN(VnY9)A6t9!Ux}JY5Fq4L@oqI!FF0lCbH5NLCo*HVJ_zHL2vd$H;n~sVKt$rhq1PIDfwh&B|wf zE2)lWPuLcdMUdyCaRtU)X8;CrT$7w15QyjT=AqAHx4jXdAX+$p7@||Nzzb$q7+RGm zzuP+BG#}+6zA#afPH(LLBG7!Zhv)}NQHfd_+1A+clCH8{GFw|3Ag0i`Rr<+wnry|# zIXE4)FUg1aO%Gcmq-O~h@qbS>##bvzmi$hdn}62-u^2u|%O!gerx!S#sk}$lQg8Cvm4JE?!nvns1LensU zvA1G5Vy{^Wl^osG1LIV5**@z2^G`<>h=Wba`rX+UnR}w@Gev0 zwL0<`1I+VUYuWV;X0ss!=|&!|_O{<9Ab6&BFrByHUkqW)EU~ZrX4a2Zd^mr+#Z@ry zaWUbsFg-dV3#8*x!wj8xuHHSTkmHm-CaqNY*t;hDAs~JYFxifSZjrH2Ho0uV<6=Y% zw&Hf2-s))sCANmpgsIN(|4>^moDxDK)|yD7wjn*sx$vp?0d8`jd* zGSVcKDIcy5_fY2(F|Yn$(y?XYA>%H|--k2&MMT4tS{#*D{78ZWO!AdzPDg!oc}&x( zh~&(;hp=BTHfvNW^%L4RoKQqzk8?WY)Z2%fS#51LyeCD;8RbyX9 zx$W`UGij`;U7rr8o9Q?CI|jeO_~e+Gx8F*sSvjjW@}h|+`+;s)yp5JMZqFYVen~Jv z=WXq$(xMZM?58@pfb~qQZri`NpUq9#R`Az+VYzX5|Wri*`@(TG$Kc>8+_5XYTVP@gITua9p7A}-3|!kyc~c__dOr`F*F}gDzhB7;#P*8zHkFvQG$jTnZI-=&J!=Qy zySIixI!(4EJdD=l7*5ZNgOWue_Qko=})Vfz4b%^=bM5hd0Z~gZba@RSq)>s_~6CfvEN01grg0`OaG%Q zp*7Fg9s^MS>I=h}`h}KzML~fySX1%G^ai4FrnQ$Q;BB;i+;m(H$_u^LG>#dGWsKAo z&@ySMrq}rDZpEpa|BUzNz)35Bx)ySo?Sje$7|-jrna`E4+K9BI;G-nlz(?0D*4@3H zy))}2Lbul0n)wP!t~DpfHw4TKHqPVq>b_mtK74=3i$}Fgqnia|+|Ty~q3G$h?g3ut z+r}(!L@aKe!a8x)Jwr+B@XOYOB=uIJ))+l4HYDa#AuhKLhaNFe8FFvt-Sjspy=GjH#D z=e_=n2dPl*W})GIoPmf#5P?+lJTCY+5V@*(gr-Mgs#~Q$u6UEeR=x@8rs6NX&)hqT z4a0bJjmTN}L9dZtt$W5&s$gT+wCL=~-WLTYQ|mGQl!WZt=p(sus#c1-fz3mFapkFdVVM=y)LwAZDV(zyUaj@4(w`6 z9zi@m>{l!(P}hQ_I%1&@SRmi zw}~PmNRgK|fGpGy=;f0jveUd2X6wZ*C}jv5I6(7n)&d?P?=L;~K!hUhhl8=H7hk}tDz(;<%aAG@H_l=QWOG5|68r85}I6Q3zD#cV35F@QfF z3}dYL*JJIHZng4D0kUM)(7m87ymhI0)W4aalt|v%1bPVL$8K%U#YlLCRgZMt?=Y$A z^+G2~%xY|;v2pELJ3aWzs^_uW2$GVYKvit<7)K`~C$ZY41DN~1%V9T|_|#^4b&w@C ze3LM;z*VJ2<>+vPvGLs*zIY|ncn;TWWvbt^a~wq-*i>EQeWJJhu)Wueua`%xy4+B` zqI>)th}xYkoqx<3VuXXYLX4L@G}(x6dSw5C*Mls`s$0u6R}W*$2AT=wjS82bd}H)B zt`(IoB$(Y{o}>>eczpSuweM`42Y}CS5T98*X;qCIzjtDV4NLYOGR3B}Sl;@LAR|rC z7t=8EdZQ0~9k`sL{zwN+SA@P!gn62WsX5)gNE)ss)RYOq5qq?QdVuLCO?gd2WR`T7 zlDJAq%K1}hMT4b0x$$_@$uDtYaklePjd`DD4Yf3&T*zRU4su__%l1i+Nm9OUcK|qA zADx+DBVL=%wrvL-Ec~1m6k_dJNhA-2o-UYr+X*ml6c1#N zti3V{ypN4zy*x=GF$e3>KJ$w;ZoZyFM#f7>7-tZqXl{U<8bgIz(oYyevKiKSjB2~| zF!Dn4WFi}@Wc;}krWMmsgPH7lGDdC#VJz>~el(g6XN{7!SHo;e#3h3$z{$T+z4TrNPM^Yb?XEr%zKh)geBOU5P(14zk%SSKTtc zPwk^-N%yg!u0=jyn=&8{+rZ!%s;XY{BddAb)R_1bG;MQ+8U;TI*XDN%Rop=qT)7_r zLsVh*1-{Lkn!LmE5+g5hDE}%V9i1IF_eBb-HIh=`H2#(PC$CZ3TX~Bdsn(&|0L$_^FE<(nV>%d83s5?GJ^JhE4X|iD)y;>l{Z@z)tk8D&pBeHwU zv>@hyK-uoj$jt+MPPm0>j;`|#$r(R{dO(CH>;YF-3mt=D&9TKS@yjUh_Y%4rcqGyZ?tE<$vw|zY;e8qkDtsf1z)5 UwXkvip29+XPf@>6<-h;_8~iN!aR2}S literal 0 HcmV?d00001