From c9b522e8dbca164ad01946b25ba3d0f2f8f6b3b8 Mon Sep 17 00:00:00 2001 From: Manish Kumar Singh Date: Fri, 13 Dec 2024 05:38:08 +0000 Subject: [PATCH] SHA-256 hash support for unverified upstream sources Unverified upstream sources (those with `skip-check: true`) are inherently risky as they lack a verification method. Any changes to these sources could go undetected. To address this, we now calculate and store the SHA-256 hash of unverified sources. This hash is added to the `eext.yaml` file under the `sha256` field. During the `create-srpm` command, the hash in `eext.yaml` will be compared with the hash of the downloaded sources. --- impl/create_srpm_from_others.go | 23 ++++++++++++++++++ impl/create_srpm_from_others_test.go | 21 ++++++++++++++++ .../mrtparse-2.0.1.tar.gz | Bin 0 -> 35838 bytes .../mrtparse-2.0.1.tar.gz | Bin 0 -> 35838 bytes manifest/manifest.go | 1 + util/util.go | 16 ++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 impl/testData/upstream-hash-check-bad/mrtparse-2.0.1.tar.gz create mode 100644 impl/testData/upstream-hash-check-good/mrtparse-2.0.1.tar.gz diff --git a/impl/create_srpm_from_others.go b/impl/create_srpm_from_others.go index 1f3aefae..121fbd94 100644 --- a/impl/create_srpm_from_others.go +++ b/impl/create_srpm_from_others.go @@ -14,6 +14,20 @@ import ( "code.arista.io/eos/tools/eext/util" ) +func checkSHA256Hash(srcFilePath string, sha256InManifest string, + errPrefix util.ErrPrefix) error { + sha256Hash, err := util.GenerateSha256Hash(srcFilePath) + if err != nil { + return fmt.Errorf("%s SHA256 generation failed with '%s' for file: %s", + errPrefix, err, srcFilePath) + } + if sha256Hash != sha256InManifest { + return fmt.Errorf("%s bad SHA256: '%s' expected: '%s' for file: %s", + errPrefix, sha256Hash, sha256InManifest, srcFilePath) + } + return nil +} + func (bldr *srpmBuilder) getUpstreamSourceForOthers(upstreamSrcFromManifest manifest.UpstreamSrc, downloadDir string) (*upstreamSrcSpec, error) { @@ -50,6 +64,15 @@ func (bldr *srpmBuilder) getUpstreamSourceForOthers(upstreamSrcFromManifest mani } bldr.log("downloaded") + if upstreamSrcFromManifest.Sha256 != "" { + sha256InManifest := upstreamSrcFromManifest.Sha256 + srcFilePath := filepath.Join(downloadDir, upstreamSrc.sourceFile) + err := checkSHA256Hash(srcFilePath, sha256InManifest, bldr.errPrefix) + if err != nil { + return nil, err + } + } + upstreamSrc.skipSigCheck = upstreamSrcFromManifest.Signature.SkipCheck pubKey := upstreamSrcFromManifest.Signature.DetachedSignature.PubKey diff --git a/impl/create_srpm_from_others_test.go b/impl/create_srpm_from_others_test.go index 9ce01099..2b835136 100644 --- a/impl/create_srpm_from_others_test.go +++ b/impl/create_srpm_from_others_test.go @@ -44,3 +44,24 @@ func TestMatchTarballSignature(t *testing.T) { os.Remove(intermediateTarball) require.NoError(t, err) } + +func getSHA256hash(folderName string, sha256InManifest string) error { + sourceFile := "mrtparse-2.0.1.tar.gz" + cwd, _ := os.Getwd() + downloadDir := filepath.Join(cwd, folderName) + srcFilePath := filepath.Join(downloadDir, sourceFile) + checkSHA256HashErr := checkSHA256Hash(srcFilePath, sha256InManifest, "") + return checkSHA256HashErr +} + +func TestUpstreamSourcesBadSHA256Hash(t *testing.T) { + sha256InManifest := "ac4456cda847db6a757fjhagdfjaghdfk3ee3b59e0d7ca224266aafa326163aec" + err := getSHA256hash("testData/upstream-hash-check-bad", sha256InManifest) + require.Error(t, err) +} + +func TestUpstreamSourcesGoodSHA256Hash(t *testing.T) { + sha256InManifest := "ac4456cda847db6a757f0c27cb09ad9b3ee3b59e0d7ca224266aafa326163aec" + err := getSHA256hash("testData/upstream-hash-check-good", sha256InManifest) + require.NoError(t, err) +} diff --git a/impl/testData/upstream-hash-check-bad/mrtparse-2.0.1.tar.gz b/impl/testData/upstream-hash-check-bad/mrtparse-2.0.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cf1b7429028d8edc06774114257b506f9843fec8 GIT binary patch literal 35838 zcmV(%K;pk2iwFP!000001MFOTbK*#npMRTAQNiBEbk70iX?J(bUJPwxH@9t@06e{Y z8yiG{3aGY_bSlZ1+1u}ane~uLAZ)~V=JsNn=m$blR#rZLnN?CiA14dfpHg?SWYl5d zcQ5~`!{_w$RQ?a2?f>Cq`@2T#tkZ6vwOfrA{N8AHnw{?!zX2~hpIAgRgds!UkDj{j zx%1nT`+xH3G|9|gt(X`6spT{qr?k$_-Zq;v_LjY)XZ7aUv_74`J8jMy?Ro3$l%CB` zOaIqAfBU@LXB9>P4F#(=qX)bM5yNOz>N(YUNLLKGt1e>hFmWPT zsA{WR1A(fdQq{NrL0c+b75UXbab6ACf{Q5ROq5C)Eu)jER}rkeTkS^;a5VU zO~Ax^@>e~-zm-Z~{i(on4g(^a_a%8*7<-}$x084pdr@3<;bIY~b0T7aP}Hg*MI>jY zJ6p2Zy&p$EJv8-s#ovfUpa;#LJVUnb6fBAZEedltAt;mg`a2<7P!B8=9C`b`ReStC zGfv+F4*;FRT$txDZ-z2bH^YqHlmFSGMXDkT78-j^B&TR7ZO}?2YJ)F> zesYTZ;~!f$4Z5Sz=iA{$&Q0c2dQ<+i>9z1{Y!#{hm zloS8?!UNZR!7-kR|Mhxjr~dD>I*o7f|9ALICc$P#AqGt*C#5NR;YsNSu<{xF%NC0& z2Jn-TwB>(xQ~vfj;-U!w(|9;=f2#X^+<|I9?7hIDN?<;oO`* zG6WzCQ{^fN(5kK zIA9=2U@?%@h?{F486xKPIfO745S=yuS%ne>Lk$>`ktbl&TZdgeEK*w&H5>J^RDBHGnfy&$cSt^5a^!i^j9 z8W)oX>T;)Sk!&7l{kulisJ-0@m`L!z7`!uI3NsEiAzv&b3`Ss=Hq~|!C!J9=IETsD zc=Ku4C)!uFoq@jE*MrG*Z#3#&^)i9zzvz!?#2K_-#2Gq~obNscir6#DmqO(=N7Rd;$gLQVOC1|P#`jZ{5v#}ZjuxjXFD?&w$ z?x;QKUR@1)SKaaLuuS}U>D5k-vnKpCb|H{A>MOJw`vGPn0 z%=_*J5Xkw*2|7S(Y;w9Xm`V7^NV!VO5|;Shv!R_j z=p*H-ci51NjDafpB&mkpR6jO4KM;tPR0+iqkgho-wr*Q;85iG|C z+{nlWFxT2-f)`IFWW@j%IGIp(O~VK@*{zWep}+QQj*6;EnFy8PQ^ZqjW~$_G5p5Jz zgdr;8An?OT1~(_9^Qamy?6OuDz;+evunJdJ5!BhLY8;q3ckzVQ*~&rekSYz1rQs_x z17~nJ#wA3x}bOE(7MIkvK+DW>H#7vSnw2z3#u*d6iOI? z)yIdzP8PU6jf-%&#=*JlNzDT&AgJTi)=BwOcX-vCoZntw-`(`bUrZD#y+ZR2I1BGL zh7E)YM^qA6vLqzh#nGaPor?owr$ar?T*0`*@`7+yBpN7{Wy&qoLDIP$ z>+~6x#@!E}dXtMgWb4VPmR{wt(JCIVjfe-wh&Ua#sEsCRr%XN1kFk1BEVHbW?Cu$H zlyVved#s)L&C-bE1=mW@HNjLYvc;F)S%2`dPaHmei z5sCgVo&t!0p|*R~_~)hrQ89a?OOmh3XyxoOH(SL@ zG)5zb@53>EuWg586)DPtUT;YH1JZSz5bRS4+)l=6{kLS0fecFLFpKVGf6^a3oN6Gk zOG?1uL))Hb(Js>S^R%Wp&MiP?=v5uXmGVGgb5vBdh9f_Yf;ciA2lVyihC4fq;1z)we}lJn8(G=Byxkaq@tus zRcDxc(m`c)jsl%-BBr3w6OwiK1J4pxNWgZ%q3+hny4N6ur31gn7Jl**4xFnvt9C8} z*V+l-+hipc_DI*^_DYdX8OiBOX++t)fZ{w3SxbWl-#i(?KLij9)Nu;Qd}{tYxUmN) z+IY@|?%j)v>YzLRNX}_Mr`+XH7MWhqUt-s?W=htf?=7%0tM)In2PIs+J)-lXT@tNZ z1}E^w?r0);5^RA;4nU$C>#!l9_6420e77Tnu|?6b0!|rd4SNF>XVmxM4(LnoOpT6; z384MgZ`7UYD1^g&{DSxTA=sqEm%it4xsxhEk9-cC!!1^oti*L(ax(c35thtO(tHu) zqKk=VP_AJ*MamZJMj|jsxI;rNkY&-ieNiUw!qgzOTd0+;Xgpi;qNugCi&~L%p<=_B zEcTP7S?RE!yJVVuJ+eHR2-lCqWMb!+&vh6;8o+tI1vz?6Ll3SN znYQ00_%`*(kkVw{}Gj#t5hj zi5TjCz}!33kF>?K1(J?4-RKRx*#2}~1uz6z`A+PzXYKG5p~vx_VWO`RCulboO2EBG ziv7bb*3$c8_MC&!S)f$4XC@HA=O{55`=44SNs1r4)4y`;DUX-_iVAWKgK{rBX-gX9 z$GJSHg>djw6t8LylT&qE^6!5le?_=H{u}vlcXiqSiy_iExJ6XB%i8T<4RqUTOD6fk z)NLk6%%0JOF!f*d?u2*n-(Q~~nmGxgQ#>?e7V73MU5M=B+!M1nwg%ZNF)JG6wJM6s z`B!=u?kOR-rv!364<1f&?0e$+GYH&Nl^Rx6_Ch`7r)*NXq%5d#rj^}tLbK99jC|zO z)yl?G-3@D)L(OfcAF~~s+p?v2oKJ7rjoNT&*;~k>IK-B#KmCf!?keC3=FV#%P8I6# zNJ`jY^U|xyghwo#Oj3}i>aLX4!f7PWg&W&0tVkE_s^nP_HaPOVW7qjrg$@&^u^W-l zN0ZCM0Ndz{x-gCxRlZ(kR&7VIpLDx;i6?6enb^7k?!6{x5*|#eS*ruM3E+@N?#3G8 z&=u1yVVMmE=%)Mo89O}`@YVH_&z2Br9~gVlFfmj$!w)$ASfC8GOaGuT={&zW>iP?sDW z*>Sg9K4wFxE}Zd@E*4?=DV}T&4z!lUI87r=hh7-aRb|eupq~*+Zkkt2{o4MW?wPr* zhrruusLLkl9+Nl}gy#FI=Oodje1ZMCOw`2ygBvO4e5Uq5=r*u5eBm{O6oF}}rZTXX z3HMF+(Dl>j?dZ@x#iC!y^ziPg~xw^OR^|XycY3d!36F)fwEH)eq;0ABscyvUh>c<{qgM` z`SGi0wOWm4>)BNblld7W55c^MqD3f_M1|u=rV|J(as--ri5d zEaX9CLSV)zn^;X}^uAB+yVI)I-tC#zK5sK?!Q~->#OjdE!C;nK+`LGLXd*uQwFtYO z*%V%Ag1Dz1b$N3;?qBxLyW{@tjn0{W?)3)UPyL^J_Ph&k_td4!IdBKrexYe!s7;_{ zg=dA?A3nJpU1vrsns4WE0oKWy%!2q251y+)-469S1r|ZZTM;gZ&6W;M-TX56AnZ7?4I?A-Y${^ z`}`uHacq-BFJH+;F5#sh7gxAsEu_UwNxO{1^+h@S+4UZPoXF-j$5cwl2A*_j6z8+3qQ3z#FmOZQqj!aN3Q^md-%V6X$Q<2 zWstkib%!JBBp#KrbTz=8e>PWE&T)#Wp_x^~4O^pwtJiTPFJ`Ea-F~DoA6yf?@vzF z>vfIFVQPN3IMKaMaU$Q0GwuzqN2GgmLC$Y)F8YXEN96K$NbW{GT&x=mZ!hl7@#l)X z>Y_gy5BneP@E1v-Q6sX%Q#(0oCCyD)&j`Tj68(3@AZy9ZD=b_I8Sbq89~jGG!78$< zgjgZ-W<`_Itq&FBPy&EmoV2POnRV0#&=381u_W)%pCf#)lH<=L6x!ws_g`%>mOhc< zuRYwM0^!w*5N**IB5o+F?CD0+$-6_Yki(#hkiw1LLSCfhU@^cJ)FnMhdWVVF(+{vn zv^SGf3>Th^gqn;G7ib10y1=19pi$_%6`4fzfh(D=;B4?$6((_YEP1DqzEEu?kaX05 zHTf1PQ;Zv!iwJ0icD}%eXmGBMD-%HrlL+s z352*y9a6c$u>uM@%~%EZ{mJQr_T{)#(zYeD=4eeoklGe08`{Dgg zP{7x(NseV4LQ6|s03eK>M&basdf`$|YlSZcqYr>oHq@ zC-jo=mTb7?Qmjx_VQz8Ejv?e$lXz`aDqLhL@GSIWvl#~n%<5NUp1hkK?=-?P={a`&RR^d?Q32UO(-_l?J%8DQd zfM)_U=Tenu#UL8(Cxn57{m>lYyB(C8ZErF!I5WLdDSZlq`L1*dxQ#Ek2czujd^aAO zI5p3>e}!y|PfHK2S?f-c*I6TEfMXN?WPnDcrJ!8oG*%2i>_+WoK*3GHTF_1q%)c>8 zhw77sbE@!p#mbS1PU zk%*z>E7{1q;QT)3E0$A481q7pCaQKrSZu!jrKdOc8Y?1)FP$7_7=S zKDK>qU#*pQU3d#$C(||__$=hH1&Hx+wKXVN0y9&_uvIc+GLi$+_Bg2%3ijVI*pFN( zo%tYdm97!+TJEO;QL{#_5LV%^=gIU9vLd5cC0A{$xy6j-W_DDTy&6kE1Vae$EK!`q z1z+$55s2^t7J+1p`9bJ&oi#_S;rU)wYF@yM@v!>8?Y&!UBuSDWMzVW)X7grydS_;L z<{nzbR9|f-r<2Ki^U=+|&L&ya++mSiCaZgTtLn0X%pe(E$;_OH%&Ova^`h^ggLEtH zuAtQ|AgmUGAV_=A=|>U-K@y<(JV09LLw^eay3c`rBuK&u5Hve7^H;cgcs%k!7HcL0 zUCoSecXM-hb8|Cub90b-yfajsdY5)*aJh8qIq>F!VE43lf{Z-0nsZ+lsE})0Py*&y zAL%&6=>m36B7>elFS7l|eDDQurc13)zA(W;*4tz;U+`igEQe||Ea!x`&;hDQ19V^` z)BOb)og5T%`U9L`WG{z_NPr+ahO~(LyVzD~^w7GMr!GP$<#B|F9^E@-KHM0)E6@H9 z9Hoc0G3*h+2biGDq(Z`Gc+0R0=os-@?S8+5>LxvCg}vOP$F&f(laB2|f785D~+-|WKd^?loO$?QBuD>&C^9G9ii=YPgx(-_rf&HON&LCLpT~99{Mdl4w zTR@)*c`9_~ zOQgfF87I9V%1`v28YS&#{?Hv@Q#;NXT?C-VIP!r^pmD`G21nKeinz~I?Eub6FgTaI zS$sS$h@?6o@us_%8YOa(i7TUQrf@|gm}6|o<5Cq}9dL@`=y6)HeJ-#O6EGt_(Yr3) zwQ5sVP%T)8j%*n!kg6~2%Yd`#TnPA}%VisdAH_&{WJpkKgvy4%Z;A<`iMX?@%z)?| zW49txveC{ffniLIa0c2C(u91PewDzOd)U~ogxCNE?&P34C0prPkzlrxEh~SWqiJ&- zgT4-WNTDh}7Ke9bX08yKJg-#)6rQFOdOQ+gQ zAp*ox+?E>>TZ-#pC@K$@L_RiMw9kRUjDm$@d+4J@wJ_vg;ck}3n+Ok7l@>-m&>;fl z6(tlE9X7WJ$GTK(^J3Ys+im>qp}r$iqy&Yd&Uz@#OvuyT_hBI9HhJ7#quqA8?coI% zTNR4ojD_ldd^mNUMmm@qG4Q;JX)+OO75a@3Ilvq0^hY};YTv@xMS)f!j_oo5Kr?(v zLvcX^?qNG*l!;#>O09~NYmndr)1G0=h=P&!ih8F8Z1Tahp<#9}BUBODIwz(QfrnK~ z*1Q0L&~BBo3Ja+lZOKHGMmkc=GD1_)Gy!EmYDC##I{{Qz4WvN7VBPO_Fth;kY7w*u9~yQ$4Db;j}#?>K!g41T}xyM{kR^LpOqO8c0LJDx%T_HINR1BO^At7ZSq1 zWHW?lWX^NvL}KxT@rn-doHN^_`%1d*!S({`zzVqlLc*0waKM@T-^NyHbv zjbUG)-AqU{X!UYD;$_5M(btaBFwM+~mSfB*B~Vj6=SM@A?H=KR?!%bil1_#c7XBWd z*do}FV^Zj+bj*fAC>?024cTY;Y~tg_Rs+KlKznMXU~RcRQJrX5flomGgnqdclR%() zd`T5pqIsi=6|ey^if!s6!mVKWV8Gbi_XAXOh$|WmbQM+3jpj>ba2L_8Ws{(-)=u-5 z^R%7o|>jyh~TOjVZbO-o(p9C=x zEpZ87X-j6(UkAjVbqn)GO?L74Q-qOzAox`2IyW97+_m1+` zz3s!zj{wWYhdaAFN1qZBy0de%x80=f0}Te_pm7KTc7L~VXdT=?JlJn;)76&l7ItuF z0r2lbr7qcZAUiWuD^$q^M$YT?Jr~7u(%@5eY>Cicz;PveDYZ8G{_uk6Dx6)rKH=`Wx_|FyK>%7&`$+ z(6l8}3*X5apkJM2GUz&I9T%jp6K63mcDwV6DOXs266rlh1qHO}cidwl&=KU$&>kW7 zEqIj!^g!^*?znk=Q0}QLA83@}L)M|e3YbNJ46S{Ev590GK9=S#0fBRX-*<3tUD|zi zG3XH6N+^ zK}cv(??mYjTCw8;;UFE7=qj2aj=>Pdbi4i3C7YzD%zXo90P6(q+`z!o8L(Ec8Yj3W zU@vgai#0cbg<6^vpPZxUu1;5dvoLnMjZ2{?=e-`af)Y!ove`~-uIP5`5Pkxzj$nx1 zgR~KSY6fN8?~>4+bJ0cDlE5HFyS2k{w|d7NW`!bh%QCVZlziz{3x+6UHw+NUQnq_Q z!T6~63^gIDN{S96{V4$s+DANEx*cgZM9AE1TZ9;K*=J;=0UIUw5=kf6MF}{1U@4Nw zfZ2pmXL3&|f5r(<=R4_}Q_(kV=M>ZxS^^~Fw!w66dl!Tgap79@VlbWQtp{wkj9HG+ zo!ui2&eVvS58I88FPX3rH0Tn0Am~#e%s-Q;Q4$*kE|h?`_qK3dHMzl&^v1yfWZC)Q zIu0SR763=Rw4}4cyMaZXpz=)YCBbu)vOu1>QK;4gE>`zo)_8rq&yHzx`9PDW(aS7Y zAYignrhkmPlnzkltB^V!brX>Y0IWf63lpE3dBu%peZrhNOP0}|K6fS zv~{AU`XF8aC4h)8@L<}3v}{Xzvp84$OW^0v#YQMm>RFsD>k}y0@o|HS=4N(M&c*4; z1&_Jx(vuIUb~)4?o-M|FYxUR(Tvo^qDaV9d=RsZP$pN}EjNasHJD<$?g?d~2uGo)f zJ;(Q5g?T10a@gLe?d@=Jm7vtS7Q$q=B6ci;y94pZJd&k6DW-BH;PRRCvlY5fODRXZ| zXJ=9*jf5U0doZ6f1S6T$!X8ezX&`5alE5bvzq#N|x~=Ir3JRRaiC6 zp{slLF>6U6ulwP40a?9l=jGWm@uT_w-)rpc+}Um(72NLh>PWo*am8@|Td6+t|G$O@ zR=A;u{sK#Ue}qQ@w!WVUC;B4oWg|X&rt)a>Ke!WRigm=#|5CkHtAyr%v0jo z_-Ec`PbRa2PKazjA+sSpnaqpe)ST-F=jwS#n z$FVTWEyU@->z#QvaUFW%Sa%K&DZp0V`W=vw&TRPcyAJ3b@b|-=!!7u;-*>tn-aXiA z5y%IZhes{a6g)y0)pFu!fZJ`TShPXZrdO;pA)W5DJ;t&mT!Hnm>pb%jHF8GzF;x2a z5Ce7WZEijWtTTmz)nbhZZdE6jY!_T-a7yIf^T9=D**iVKOr(HlTTtZGWBo@;SR@;5 zc8~|f>29xk)*X^eKO)J?BrE9{H7C!;CFJEFV;-6v`!C3S49ZHO>kNp>dh%nMh4<~c zEX?=dBZg}wfJrv&^Z=4{ll(=`D=mXYGa%WbdsM(@Lr@^G#GYcNpq8M|)i#2f=OE_G zgxq~+nK+=shouY9(uN+5AiT`Fc1a@5CARgk zv@%P|0~3`PAFO9K-Td*W6ERN4Vb?mf@z#nwybzLN>6erGBC1mE5Pa^FMkQh8ojACmyl@GJAqM)(Q7VR;fC{~-yG zFUpt7>{p8VrScD3AD3zQO8WBj${rQ}Qhn6&4_n(uQu&p%Y5tTA-wF|FA`{*Wt$Z zUNpXkJ0D_Ceq4Rny1%!x*=QcAaN~P572JFGcaJp4FRaRhaO)BHRwsvR#J4sHTy`^r zi5}{cz*WZWVXLvVMPi&I+|?S@scFX87G4Xx9yqEk z={aDUT42nZRYNW5`AcjqN{{JvjlylxwPkmIv#}d$OM2dut`=xTsHzv%%Cu|I<|3^n zJ--{FEm~EhaKCi5kj~QT8HE>)&=#$#Q8=Ta7Gz}7wJ{+rA|*%@`l(nK@2Zg*n2C+u z!!!57EI=*^_eBH`yzC~un3}SURCi>-1Eqd6)|g%di>YycI5_SNyKPqW9k&CD92z*J z%0-Rog|nC%?|Sx$b2{umGtnA0Fw_*(Sg%f@#-86u9clHl=?(XcFV5ONTT5mQVwnD5u^%T(B zxcx(r13%h72*FB2+$t<0Sc201!yN#*wbR@bu+m5aDlEo^4-U8QXn3Vr^R@mu+P_Dn z)4O*Mx9@^L5s=#Guo#T}L%qM!tluguaX)jY@6)W(8s8%Hg?NFOza_&;vleT3?cQ%5 zZ3Cd)9Yt+Sx8iCv0Shb%oB5E$&6HuKU}a%gEC{Cp4Pd2UQYtJSB+`hb|w=n zA~zT&WRlG(5|)9;0M_crurRiu;Q>A|avRBw;tyLPk_A4ILc`PN;}H;7bNeWSSE;-@ z60FP)y>r<%Y?rLF6O(_NT=C2=XBJy7nVu)-Idkz0GoCCqShZ=)zhx2Y9FkbElOU8K zuZ)_Fd0a$ZaVB#gH&HSSxjU|hE^hQtHrce`7eNV}cw|Jj<3n?PU&Wh!4H^ZV+ijEB zu$HawgU|yl=mSK;h0~~`XpWX*!P0=Fax}!;BJQ8;khl_L_k_7n;>Bb?hK|KOm}B@+ z7WW(myDgprbvSq+!lr?-yvyKFlYZ9xd>S592%g_Bk}JU zqNj`N;!M-q)&X`1zg82^)AT&L`E-kvE0Ak1MgI4Kn+M;|WIl1|ISv*VfnTwzgk7Zv zSm>6#xDeuTaFy?4x;^z+Tqq15NP&v{y!&x2K6%y2&oBA-Z?hGpNmmp_fFaCPy(l$gJ=zLz0bU^0Z)1RRE+UMFsWKTLn!3m(KIn($cxp>2uk_KgYuZh%otj zA%!V-p1V9Q!P12;rh_oLM6NLGJ6zZyZra1H``jA17iccJ==0MiOZU>2KObHY*^I?u z2q5Ly^)4A55`Snn@Q6BM1cMssmGLyFJ@s~G!9jQtKZK+x(mdMQzkkGWU|Gxl* zQm&|oNC3$7atXNZi@nC(7cXQKODc-xYO%I{dQvQ|uLF`RYpZL3WwEqgJt?k}AM4B2 zRhnQ`SF2U4yjH4$4qdfYYc*200s(8EsLpz^Se{CqWo;;`^+LJ4S|}ANFG{PGI{a^~ z0R4pBwp=ceZ={M+d979lWxQO2+RH2TwF>QFsXXao$iH4H6)o}uuok~6C4vkoYVlf1 zwL-a8Q4p*qcS^NbUw5kTsbq)xWTjp$zu4IW<^N!J`)E5&m(;WxvCmhX;(BrY6rT0< zwHK=^wbd8plj7<6sj~)K4FaR}LWPP;=`N*$Iu?z*t&l*PLXFm!0;%7OG?Mgaq*J_1QJr>vEYAFfV zdVp)KY{0b=;94=^x|#-8O1_N8E3C={rKC@%ZbH##Ea z!xv@&N)mNoU8Q$}w^*p|<;KAdPn7N>q?Q>XM$-I7w@^r0+M}+f{xU^3S$Gu9;<6(w z-XI~Mf7ceicIYNStI@=_K6U+qm&k=1a_#amTU&=%s%!0S@7(?9!+r8rwI1Mp2yTZw ziUm`bGs3$qgxCiD?=B?YzeiFIV&J3~YuPpJ<4U#D6=_q-v(jiuC=i*+TXNf0AS;#D z%D|&mQ3n9qd&GFzVG>sVoUxj2JArbl-s@#=3od`LJh20GA7RCn~;z?i$GAuB+_(^SvR;i6ebdI{k zWNvDo9`fKSjg{LZYl=`Pf6w@2GM}*6HMf=;x0Y`$-NpYM++wT>BZ+W55qCCNeRR2! zHd4gAlV+Lqx#)+0BL#e@{H{nQ^L~j>*#Ja1i%*$Q@EwVcd`9*Xd_H3iA4?u}_y|&L z_pA?;jB5G2;#4(_n0X>$EU?DwMyXO!^RLe(UMKr}+dqFlFX^>VRd zjaotNsw=2pbpfVkXjdWwlr>T5Btnl_caa&pLD+ z;0FK7h{B?23e@-%C^@%_Yly~>C$T7?j*A|NGwhT28Jv%cCF%z7z9@vI#`~fwm>Tbk zs$gooFRFqo;eC;kp2p?sYVca;t5uo2tjP0j6}qa(mooNV z;_F$tSXf=92w*b-y|vYVJ*)s{38pl#;Wc0%e8FR{Y{4rR%jj1?2N2MJxk5N~37O9% zgwK_NTRw~6QDQv+YRLXpbhh+Yt7}|D!0MoGF;*~;70Ofj(5)fPV(2P_KuXmLACMy1ODxyQ z!3g2RSPMp|&ZQT80gkY?Dvch}Nm)w9b(X;{mvAI&g_Sk=ozW!yu!_Ja3t;cqyi!Gy zJwoF2fhtZjbMUy*G{~8FUXBRK)N7m@%Zc<##8%JgI~d@*bID|4HQ3P^4Y^GP~xspfR<@*(;`BTb%JCp|&)Fc1+Ec z)x@fcMUd*tRhV95H7(APA=*|h!ZKI`CO(JQz#tfwtDxCTD%XsQSX|d# zJ!0Ib`Y2!z&qzFUWD>!-6?g-Vf!_-KUOy*x*(}tK(G=j5Q06(vf#KLZ>BtK{z>W(3 zpbbqgV60q{&w9toKI~=}qcWa$hW>djNOn5Dqe4ZlR`5HH(?@uVdJB%cp;SQ1Tw2Uf z2bIr!V6CcqO009rPNYxDZ#Vb%3K6a&QcV_~#%mqzx9;rhZbv#&K43@(J8QRuv*@jL zk&F+BCH0jGZhguZW!)+lOKVHT(o(T*6_FpW7mLA}qDOfN?q%Q6LDm&e%(`MM?bF~V z8i1;yJP&4ou?)$R$!=$;Y> zR!Eb<*{81FTp3&8x^!t@bf!ZYpEmC8k{E|H0^1<)q@fn7t_UMd4+0)sVhJA1kG=)I zOZ`iNS2m!tmI^f?K4FCzS4>0_QP@XuYJd%OB&@!UL zQKhh~KqiUAy%?nKRhD#o)^9N%BZ*Jqoz~vEb$U9|f5DbLYw}uAd}2LS&Rh2nwi-v< zf#ViRiEYn*)@@NMYm1jIMrHv(L3!ehB{U&Xy1EjPLs}1(tkaHthVD(`6PY{wAfT8t zFYO?pgu(0};D}Gu`7ib8%w%=MpZ}{A%cZ(@{tI-=a(Qlz-jj+xD7wS!;425jyY zikIv%A1ieM3>|$+F|{VWXky}9CPunqVwC$Org6E%ZR*8pyIBR$+VqQi)3g4P(R0Xr#__fN(v3OIZ2`icsa4?O1H~wWK$kKWGYv`V7J>X zzUvu)%r0GI^9Xpbkp&RPJ>Mbk#LaT!j@`jF+b6V26272?_qJvOIU3!sH?k>@2_|B5 z&w!0u{VC#<~x{>`mkbL0`?5DQ3kwso4VT>}~ zh8XNSkcgp`bJ=Iv#Za>%&oUxc1GJCfYNo6Xa^c;z-k;$S`;nTW~Lu`qEwFBX&S z!^6ay2cqVI-=YI84OU^Gkq$4oiDb9zA9fR@AbZ0jcTi6#Z z>^~W_y2FdHW^bC4ph>96r#-?I#Gn0OuxT(Bs6ytCnG6jC^Wj;43(tp>oUNAM>A{$` zgk_uH5b%tE)Rdu@dMS(35dZR5U&1;IYkCU@5>rt5A!VuRD1O>LDc zu*n1=V)r8@oackqd5-|1Dku8X;M;}MCgj(JvqF#i>ifyQa?DB2M$~XBeD8!J) z2*r@X?8SyAGcq!i38*TJ9MD+!BT}593W@MAb+2((&%jdj&x|sS4Xw5!N(s6(^eCrd zk|ZdYT%6a!b)V5NbxzA$yl*6WM#nCV7y$*s@l``Jb`Q%LV~!TNI6-AXHL=-ZC^ztO z?KoREX5!*yVK_KJ!BVU}P!!fj?-W1evbQgmZ?~6kUs|_6TEBg7{dN<0X$TWBu{Jb2 zIj<~xyZz#}pS5mVIX<0W9Wg+nlLQKUn8lS${npTWQeqEmCqPNYCwtp}Vfv4t63Q)r zA{PJz^8o^RWwz#(87k-^8sLTFoxzGjXJKwJFVDSDDRmb^ebWZt+~p}dhjb9>k2d*_ zchAFabob!HsXwoCgS=n?`C#6gdqtoq@qoP2SMVXXXe=B4s(uL*ytzZv9V4d`BEnCm zL2z-sIS#QI0Z{@>O-Y8fk|5+$XfKk|wKQ4f>3NNjCw7I#tR5F_y*az1aHb?`%)ed?RA8pp9*%r?{wR+==!kek|~4*$kYa9 z(Go9gcP0C1Q6&i6Tp=fm9%Qx6mh2X+o`UBIknXmBgw|8jhA*ePr1U6o(v zVygpXom`c|Z#2oOF%j^h`&7ln#Uh}W zX{`)vZfgG?pgeIrt(KR|HF|66Ct%%X^)QlmWP3sMl#uv&G4Mk>;d_3Y=qyjvG zRVsO+SSFOMf?AbswPS1am91!TAf~XEMX*WcmVt~$`~-26U3rs=RmFoqPY*N0;;Rdl zZw=zDWEH>_Ul_MSEFxqnfb4$M0chC(>h}oL*1hK47C@!$E2cS1t-PT%M3RlPDpK%)Bpwjb6T-FV&NGqK zh>U#cH0$lbdK#%;3rO;U8~P{~-m!FTSq}*}ni#L68Y+tiW4953$jy`ACu>;}Pp7oN zY}*6HOBE;?zsS@}=R^x{1witpH(3~^aw$-Jd~blaoyBXNa`5eu%gSd7RfV0<9ikh^-wRXwp>Rv)?t!A7k*PZhh}_u}k! z5uy%XkM-(a(Zx9BFtAILi~})omny=Y)~~;Sl3ltbzZ$pZN9pS?VbQPN$W^~O;j&*H zbKS4rkcGc`#VfzLe?}(pqyc;aA%TZ+5C3C+Yji^e*XEXgPd$%J~(Uf6&g z1B{MBXvUQt#t5eHk=@8eeTgLRG@650;)LB4x!wixytdMwi-O~MDo!W8?!fI1gAL4M z0K%NpNL`C606Yk;k?_64Bcxtw<4mL6D&jdZjWu|8osb{P~|C{(YL`KYEDx+3BCz>7Q5g^iRZD9{Es^=g0?xs1N9! z-3AESAQ8~x{8>DDoL#qy&x`EnIew|rFJ<cySuy1KCbd?2Rrl& zKQfPBT6Yik?;p_bW%>KT;r?CvxeA}Z;9m55y}=f}Gb6W6rUwiKKY|45?06C}s$&TA z)_EX9@obowgFbqg5i!j{u%_(|!kFLoX*^#wa=G>uKD6lv9;KYWo5PcbLzDBc$i{(?gBtA+$78y$#_}82I4yyx-9l0AUT$% zQZD@kKuR$hIdP1Oe-eB1V4@*o!6Er!DwvBN2q2E_ot)>ge|HIBqhJH|K1HMa;<_cE zqNQ0o!HS<%fhUwnK*QaEKzi~N!{vrtCq<0NIcUXvUMzAwL0A)a$zkb?sO!1P6 zHd0p!>X}sT?nvdNHU~p#l?tQeMx7p!iS+k{y4a5 zNB1XPsuSIF=rkGaSk&m4)Kg(%-dxT|1dOW(^%F>Y6iV*!5aUG|M6HsKtbR-?21`L#ZFjr831nE*vfJMoRB7;(%!xm@7Qk@SWwZ5}qojHS6 za7;wyzU-7hP%qm*47N;C$SpE?1`SG4aGX_9mnK0$9WX`N7ziM+EipGJ?3TO%-^Dx^ z^!c+`pyq(w=UG~oQpGxvgTK(^q6EP~^U~6{5lonC0o8B&YGdMqIE1CyAW%$H4@5+9 z2ur=8d~v}+MhbXNH*Lbb!GD;$;@y~jNN96nQ&I_roL1$1H4GzWRNz>oC&^@GQc}V~ zpU7iYsPtq_Yh)3GjH%RDN!?Kk)xR!S+!N$MAuM7x$&@aYDVq)?dWOf*vyqk~G|;^D zBuvJ_y)T6HgC~y)Pn=6Xx44*3r1W42Vz>H2La$lzP^=8`mV=O%&fJ$xI=Uo4o3vt1 zsOnlAgda4H*tX~OymfYda#`qW=!!uM)BbRX`?O9QdRkTe-m$XBm&CYuSG~xw0D~Rf zodF`e?oatuhZtg>SZ9~+@~dN%z1M5fh@vzbwiU@S^YFaUGPEsbul2t(<&l8>D64%jh#qdLVpGV^LW;lC_Nh?FfLHDnAw685GGg zqI=#7i@DNdj1ml`a=NG%vsx!EF~QjwTv^yEGrdJdP-b|sVGYXjo*r#oAwLmU199>r zR3Wx6je;ntjc=+`PzL&>6^uiZ;sAC4MjQDl;woUNuK7vCH<}!-i=BxyHC4Kjfk`rZ z(2dE2rV^V(aO5)Mr*=mi4Uqay-amL>ks72@p&%aCk_mujh#AQmENXj)RCnQ?c)gZX zskO}aNeh~+tL}i9sBypCpZ=y@C^N`uxwiJ;ZO$w zP!{WeGNY(?2UOA+DF}fjkG3wG^G(>0eGIvqdKB1TM>erirc4MwU~n;1Qk%{Zj@0R&mqFXB(<5(ccQ0P z=)ArX=?Vh~c-&a2i+{=Plq75j`PwhZsXAq>PvlASvDF$|xScq{o6T1~@FOovpaV1N(s< z2$+BfHh1qgkG2n6yF2O*q12wv&_^fcj_VIZlcKsK{e+5&9$}u@QQ;%PVKGNOxHr(%3qMpal& zL%jOb4Fm^hUf}*`rjF6Kob{D8oMViEVt}aS%RheYC18q}35M(&*?o5!zGtW~fil@+(%M8asCn%xVNV zVQkP>0mwL-a^vvscFU-+b!-fyGqT!7iWz2S08Vi`#e(6WIkJ!c;<(XsB2Ns=BE7s? zPh9+$&-`9@^5`!~@n4F?S}h#^r80~EaxIS(dO!<1fTJ&mAc(r(R_8C_&6o$mFU3_t zZi$N{7`G7z+)9ts-AflO-O# zW|J%PLBleDUG;H+g50?1)Gd zlpK+p zZIM=atVQlWZ=<8=X#sJ`UD(fa=p`sdV=+&>27_T+)bHLboOF7=qq{d^Q`=sF1kNPh z{}RaXUWI5g%!C4Dyn_y_5%`j3Yp^BsVu0h6E8K-U2)4;3tlu^fWP4k$3vtnzzTmU$)V0oY#&rG z?e=Y<2zG6)3w?asIv^&YGLgH0Dv#ZcJGdliNM!(=lUqQ5(rB|gRlPyPG}>}bdh+5y zBN3S=4nK-R8)I_)rguka6N|7crQmy3sjNkRAd^oWCd2uco$gb+?53lJKSLdhWHxHYvcrw$o~2YG&uL!wgKRju1#1^t z#$}>nz07(z3}E6OC*30V_w6?A?@%#}Y`{>-8!#~*`(aH8a_g>m+56om-QKfqcC3cT z>khf(>UNvB8n9Z}tEnl2VILOE056J^^^OVEbS)d%_f+O_^!gC!T1tKDG>fkz#+@)l zIkR_F^mu87_l^!fjXIi<7D#iianSr|-{?g`ZzClKpF#u|%AAg9CL$bsCLtbt(g4w#dU_8H&=2DXO$_96p%B`G_9z&Ku!Z6}vLQJ-Emgl7Y*4;WsvlZc zDQlxEE4|Gq-TF#KsD(oWyi?qLVk#BOu%dnWTaB$P>Nyw3Iu&?oJ~MQ3T4+r8u`d2o zgJ-}{TLC0x1w-9B<8ckLZI1`xKot6z61huDf{US>x1g z_MMYM_c*6=5tbz^+~N~rLYOm_WlnIiWNdPK^(I2Z(A96~(2>aNJ9}H(KWvfZFBF6Z zBeri?2k>X7+jgE47HdEj^QFX=WSxN0?r!gGAMR{UGL#HN)ELsifl;~ZbREwPdcatQV6n3MbH`=C);!M0vSHV-rclx>=XQms)z970#35tMi zASr?P`6!`?@%CVJUFI7G1>71C1#)I6D8Ct_Y)QGP45VXNj=+%Q=EzauGn5RqJ~GxN zC_8O+qJXhGu=-|1{SQn~Fd@D-xLnFj8IrybB>+-F4 za^&eQu{Gkc{T$m^k+(tQQc7GmnOtdrBd42k zj_C2>)DvPfEV%&rzHS>QvF3;c1b2~hoVieH?ys9{1w=ByatR`b0XI(Wq;yz}5oj*4 z3i=5wS`!3g`Lr%u-WYD3f=S2Xt{0RBfO#(TJQAx2PeY}hZ6SV-&X!R;)l8Y9oLa!= zWEKV8Oy)Sr$hFa_7Y{5ULZXMyO}5Y-$HNP@auM}tEQCjCN21%NaMRBh>c*NlVHBMC zYzbUo7n7$0$1Hv>AQNXfUyTV6LO6!%NiPbiG{t&O3XD2Ka6K~D`CH^(*O3+Rup*Yi z@RDlz3gARH->`rwxKv{soWmAd@4aW07HOoSvOy>}(yXM{#*(b0D8EXaI|}U>@=X+$ zL#`T(LX=Du<4}{+_Si!~!91g^;ESYDv5&r?f(SucufZo(G?hAhwUUseql2b$o2fb$ z0YWotOVA*lGU@(1x$ZkFi_6Qac}s4*gp#pAg!zuP@+fz4q+NKFdLmXHm@8Mb@F*yc zyzWSb!`L|tM6isMu+-!Zr7%5SrP-X^0KN2>^LkQ!R%p(VGecV#@-bD;=Ea!vLc%M4 zZF7&gaPun7hA6aS<^YvZP-9C=G_QuOh5sVnzro(4$p|5-#=5wvFYcNlAjxnrvlj3q z<7{MJ91&VN zMdg;fOzN(j7G5M+&ve^10Vc7%6ytP}-dbulmXgr1BbNdJZIqQpXf9e_qbGY3Mt$uPn^iDHSqCJORccx?tJZm&cS>p4KXOH(wCF3vxspGh&rgwI3G_AeC zyg*0O`#JDvq0XhqKdN!Q*B^v6r_oF(^yW0kLJsgc1LzR5y2R@WX-k;EPXBIL`~ATI z`JJA#2jvr)yAfH=AS5_pEsA5mq|_ItHa0m&pf@_3dc-V^oSP$gfMrg)@hbwmx5TN|py5FsmzzzF0lFEXi# z+Q9=4Ed-Q)b(hP?Ydk&v8Idtk*`S#~ZXX8;QOsyN<484Qu?iop3g;H}B)jwB|4m|8 z+=3b=0(FHRfeI8EAT=3Wn`(&>!MvxA!LFFJU6+O^d_)H-M!Htsb?^4(1#4vQa*0D1Isz6Tki9qT4BWog8}v?k9cvq- zzSGD)tXG!IHXVKd9ZR>I=Yv$bRU96N=V#)`rEMv6^598G#Slk|RdsdqAP z23DhK(S2;|Bo$KZfG6mP)iHXav9+~?Hs_Q*5NyDW%UuY`=)5E#@RW=sc|Ij8;xyoMz`s<$jH{qK8^4QU(cK-VxzA%Cn6sm573)i6>gIXgNj8C|Sv5^9oGal*62Y zIn2iSri^nOz$nk01oTICY6(>s;nb)_JspRdVVRFMscIG`p7(vLJO#o|W^H(%Va=ho4HmquBHpntq%88Ix^c!JTh-TZqID{!7DP*^l7#c*w^tjCEd+PK(&E+9v zI)uUI*LUr0wGOv8KaO5Jl)_1~EA^BTTjInxo@mq}cXb8!?pMW>WkOpoBXuJ3w6s#w zq_z@viB^QMB*Of`5Tqw_@SI9D(lsT;eocffIk|1dc$sp%T>%|aM^UJQTi`;s?&-kU zUFYLKH{E)!gXdR*jsrjDMsvLyuC%*&QHFmqPHpC!&Gm}t9yt2Wk2M~~8~H**A}+ui zrw-$db9xox61j0|h`j#WOt{#PmfIeyEfH6Lhnhn#04KLnjzwuvSAB=*tPjhNeR58B zCdaEO>K0lw43wMEb40 ziTZ#_fFDIwoMKy4Enw^(d^7`KxC%pL{18~)AX#k|ZtrQ;8V=Rq4#TCe zl*Gm*y98=8^8#c<(UP~xL=fZSr?We`l2UzwTI$(YckS4HqvTrgZsf?FB`&0<91Kki zo|qRI%rTNwn-Zx&TD}T=q!l|Ydlb^ZIQXQq;g+Ka{yl4z21KaFRD+jnhfHH#qxLLH zr16H;`z~0;3nEqvS1~ zfFChYtU9$dBYN25x+dH=sz#TVCCmEab@a~7 z-Y$+12(+xFM|h8O#8nF67$*_cnMx%@E{SUBIAKhpU~vg6E`)=wM@en|o)-Ft1iOn$ zugBa$5JZ*><)CU&6c#?KhP6H$6<3*bdw`r?EIN#GLc!h2#|L|n(VSBimg>Hu{@EA> zU%c%nu52>8y5|M)XU3ZX-R{}Y_0M%L2CprjLwY;-WgXtxtXJ0R(wAzXQm7V4XcHFR zVO>f+0@&nULXczGO-6Wgd{2+x{s z0&lfS)kW(8pjut27atWYtLc&(y6`H=J3DfWO6=aK-}!%L4o>h(of%w2jR4c>?tzzXFe!7~9X?9eVO z#efpD?Fcbqt~5b>&EADO7~n09%1}r>#_qr&t@L}A-Tn-hc5?9~Nbk5t1o*PNy;BKV zLOY_cFBqsQQfXS+kUTNX#GKkxFfp%<1E4LAdKk4w8FdDgYt>rPQfI(z!>W`u_MmZh zJ=AHEq$9V$EcHmOP?u-2j^d06LrtzVmFrg|%BCn@_~_?-ID?J};bjow6jOP6F-|td z&jh(RXxHwh88gdx*09_Zo@eRHn`d66%%IB)5xDwtWl7Ri6v9Rz(X!S^VB#g2F+fEM zHly{Ysn$^sfC^rc$ews}l5_eYRV2)ij2mewxf0r5rTw~_sC?t%Gli0FTRFK+`7qkyPi1}kX>O{|g*Sj|d}pa#C>Bb~{B`*l9gzE%Q>g3ZW{kq0L^ zA9PrX@R~GgN~Je$lkZ+8v)Suk0#iO8Sh>wbt6VG>ts`gP4}s@6)(>`?`by0)v7-EG2J!Ov6oCKxcT=s_6g?(vtdjo6eqt(|%<70=L zpHYy+d+0l^jYeTq1W6?fL?QDj1JFAj*pSzT-2F?mP)oUh(@+L_J{a`ZmzSSCdj=C3 zu`Kkwv*ixWEM~|IT zq=*cceg@-2TLl){i+%roCWA{a^UUgQpqr0&G9)-R#mw(U=RGytiF<01jSHlG1R1P@ zw59^Cf7Dnq@GgT?=IF>Xk?(A_G?VJx^&1X?pw~OJ?sn+ zZBS489hh_39KdwDbjRiJ&StH$R$m;UrC3dJQ)#Xd+6tY2xP5T=K%n`EHU5;!@7|-WLDnFf>wfm`q`+nW)kXH3BnNjK?0<1w;kAA?a7l8c{1n*H7>o< zhiZB;!13h#Neggib#xHa| z+oA{_21k7QWNe)Z*V;%p*MP6yw{PpnMxl6 z=Pc@$+dfc{T1ViAKT<8ESlT*#K{+GTfYMO+ENvAcC^quOyw!&e-&iW8uWjcbe2ry7 zjbrqhSWwNC*nUXOl?cQQR_jHwVH{f3!hyVVQ6<{F0rxS2O5d}J&r8GyQkw$o90iOY zWQ+5bR&!EM%0=rPD_h8-rGS0r?v@&zd$C@VhJGYlKbGPLWA0I}9kW3p;SBizy z^F6iE7&s#@hi>j7J|`N(LUu4(@jDwNJ2!)|t_tTAxNzGFDJ5CG`17{5477(t8v~l4 zn}Q%lV2fZ;!#>t~l1T2nsznUwOD2N$`Fk4%PX)@y2e}KopX=Bc$8FnszD{W6d4URu zxy8kN(2&K&afV8)j=@kdxkxRvKH5k|Ep(B?X|`=j7@7w*Z*fB1D2+DAqKD|r6j>FK z>EN=QYZ*@DCkjtU4+oc^mv+lz1e=rwvSm7*f5j^|>2WS1NvxQ<#|P12h;S>!IcXH> zpLe?2jyx?-oZ;Vl&stritPfOWKB(FEKLl~oU6i-GrQz4d3;$%9f;Dw!offM4oM|Xlr+03cSIPtBFM1L&guUdK{y0Ply77Fc%m9{SI z=N5X)DJd;1%S<+f#+}yA-u96siWq>0{CFhbrSfVb^tuE-Bxlg?B z0<1MHh5te{NnYR@D~s0hvbCB>zcg@3GW{Y!1q0)Dok6QR==F0gn+8jPDvz@dpBIbS z@8`tuA_kydb){~8+iHl0x=$SIR%xwVDAiXB#X@m;?G`GJ%oq?FncLQ?w!{w6;RX0K zvXcV!F3x4oo#$Ct^yM2u7!=I^Th{O8mPjy?T-W+OK@Wka6%2CvXx;Xg*$F1>p*#bY zX4+$ZZ6&Qtx{_9AE2&yuSxMbA!*UZ>Oq^f81dC;%?a(Pa9Got#X2)yHZ1J2ep0mYs zgvFCwz{vkhmeL9oeL?>HzOc3_)56FpJ>fBc5HX?Or8`2VexD@EP^ zZ>3l-&iwzb;hFjW&HVp<8T|ibA3x&%4GbF$Xbe$amKh2iJ!N=b~EN39f;AGip>@_k(AWW)~2*9EmBHOaJ+Pan9ErYBkYHP+; z*GyF(7x9CZ35lM5s@K-DA0O;C+3QMiJ-bbjAP_**)|3UFu(lr35jf)5d+bU%i;R-a?;O0@|@JKEYmmm6LYiC;lADh1dL)L2C zYi(^ews@(y{MGgB!S?oHYis|Ly)^k@EIzz@kRG4i%3M@b~Vf z?awuWfAwJZep3{Q9j{_gpj9l9GO_t#fcKjRcb=978LnrK8XxX%x3=!zJK!HH^2gT4 zB6FSA7GzxEA6na-uq!w%VL9Tj75W-vsID>`D*VG5|3EX*IRJ3;ylHuoj z)KH9Y+f1Ann2XL0PWkwST~01$JAT6mhH65ECcsoV+HP%r)Y!YrQ>rZG)4fghg_2~8 zT&AAqL`N#edt^W5Y=eIL!S?n+V|VA{ZP5+EIH(N|F@vM6q((y%k>#lzlzpiiDujVg zuJhw^ifYLm2BBm7hb;m=s2)S=>>PYt)wp9tO3@i^RixFmQZ*?h#HMK)3*Qs;`rYmQ z7D108W+{)M)hofoR#9&?wzfz>>%6JtYOz-2Q#{->xol)foa}nbl}e*amP|b(m5nZ0 zR{BkCV`MwU3VKGy&Yc-lxg-htok}}jog-Li-g?(tCl^m<#9Qsfuk*%SIbmYK^*VF(F zL@WtMH8F{h!$MU&C8AtK$S_IXCNGP5>vPscbWzCj1}m@Sbs}$y6_)c(v9yZu7i+8Z zMa(GcPV=7C1jWjLe6_q%BC8+fNs^=69VeI_o4sxq8X9ol2DJLA6L8%9zSC_w-9bRE z_yvlcy52=VqTBueG+s0iwgbxC>^L@V%yPzf-zN%e=MvHW5vY-8_TS+&y5)470T#Am z@&=tDPJu*-$)ZPS#QUU9VfU;AizB-mMRbd}&O~&KegTQ-AL*_T(LIf${d>qnS$K%; zppT@R3dDR3;_`<$jo!}E8e5mv*0rlQVrO@?S_|Yz()pK(ROiSR&VkZMM)SXoi3 ziNw=&2B!o$+b74=h-oTZv|JK1es|~Ij?npmR1fYofp_2E+uPpNx;lhatyImJ5^A*) z^}8seb~S`ncC790iQV^y9U7K0)Ez*DN6-N5s_pI>z;XgMYJgv@m@8f>mbit47)(Um zMllfEEEJWs$zw!t6p(4{=o)oY+gB|%U+VWd?g_m^v4RUe zi5c3nHi!P8cj0(Ru#SPmmYk>k?vmRl|L+bQ?^(}#0wh6!QkmA;>Rq5Uo^}ykSE;ZF zka630sj04Gp^mH9*8*dkxHCs5*|4ZrUzJ1&c8g1l96@s=TinQe;UdMhctN|!9?;Lh z?)Fij-xDc@9sQ1}TM5>csO2|l2S{Q}bNhGhZ|`kN1`PPPxxaU3drL|S^NwP@#w8uO zfaqOg0opPVxt36+h$3TdBoSaRQ&RV`vsOiD=H5QYT?hMzyrm+oOwxpSp(j_QqOB%v zlb)wa@}OZLcImIIh~{D|<88J=7`@j_F^H1E2->5YpNR1Yw0PXt34~GEe1xCSAhLh| zXnP5y(8KMfNkJ;FmE>7Kw*oNIat!|I_6AsAnD+;;b)viEv}6|Q0!Z@G=ATb{)C-$z@A zqz{{koyepiln(ZK1FL!2JvsM!UH8YL)o9wV+X53BrdcvmN@+-yg71U}AO+%BC?)2y z$0py@-J_SBD~KOBxIQ&ijInQb+MsTNbmB;3F9Y2tdsTJ^)(y|T0Hx6j=-@#hGCT@K z{(jd!!7VPbCo9M(AO#tEAVb6~^tCEm=to{p(R|ngEbh7fg*`Yq7sFzr{S*U3i=`Zz zdv*sm@X?i4sL#6~s!80Y3%%DnBXnkc;&eJoWLq&LN5F91!#&^bSzIn$J48hoGs0Kq zWKB+HVaByN%N@_y8m(8bVjS_+pq#j?N-v4(GN+>e3AuLEj0G5HfbxrV2jiXdbhSf; z!9X(DL^7r5fvwkztK5>4W>kxWdZ{=MK$HdmsnOezt@~Z)Ipjh5<^%@SanlaPP%_OY zmSW}~rC=qgpkyKv1%u8a+}V;>H`!(vF$=1zbkk>ZyU|QP37)$b!wbffaIc;Un~o2H z3wnD<47P!x*wFdHMx&V3JRc6)cs+?`B)Q*jOG*le^A+ABgvo6=AhSbkRQ@FrD^? z1MDbF8hR&=A55Z;Y_A=Gy4(m&Zm(5j(IaLhw*08ECkrx;Jt^H{rBl)XpVy(qQ2c|Yz#h#yTv}I`eokE>_RZ&!w%~GtiO64DSJ?%p0DWHYQIF~~x$#6s2(PnDyruXZ z0mD0N+-s)LN`^p-u%w^Zl&VbjL0r&42h47tFG4AC%NtL2py&WD5%N!$;z z&F+9P@dShUYK=23GVwSxHaVmDO4uAwt8&&xtuN+|NdbvlWLBlFqGqfFkYPxypGKAx zslm!ZX_0ev7`VHhed3%BJIHefwl|1HCv12w(+)z{r6v`52^ChCda!y7q^NEuD%eQt zaJ_C6!D3t6zUTT8@9lUxj!Btn1a3f4VGUsOIq@A(7hcxNdXds-cEo;$y@wWk7P%49M}3iDy) zL;Ht!5*Cg+5s|39no4M(1>7;2s>*D^sG}p`=D`xp7Bdf4&|;1aKrEWudt0y+ZhoA! zA~5MTkPbn1ZU@5ehdoJxFc3{xfSjNHC=6=*cMn0u&1Y0R*2Pf2z0@KK^J5*_ND zpf(yUN_a0G>^3Qz%t+@@Ht@d8Qq)*fij{IkIi5latP)T8aPCrZWp+s9njY=^hi_lN zGUzW)wGJHRm6ck=`49SAJO5EDmg{r1sbUfF{F0ylh#3FF?Z(!^LyHp$-J`^ z^@LNR^Qzf0FHiz;tUZuoG*S2ky-8B}!jKCK@k%xT8kv^jO9aq&%)JOtI3+r-nhh{L zcD?q)7D#g;yr@f={Dpse$o=Z3(fkn5hv=<0HK4>t@*#7QR6)PEDw4uJts6RZ)~Dn4 zX{I^6xUjv;jNk@41MAG`Iv%kw9A8?Gk(oSh(Q91U#i+i84(!Xsk)`k8<*U*=Q4sPZ z91*H`7tF9nd_D7lI3B1r6!c@wx#MxGkjWGZR*NFA&d&lO4HUX`7oc$R<7JvhFD$Z? zdsl#9Bv%bAy-b;;m4lVFJ-p~!#~$d2=ZhI*Kh4-^(sQM3bcqd;Jo8`jlz+(mohJqQ zve;8<|=#UKL|GDjFlz;pUN-yQV4ON;q| z_(bXP*;x^KON+UMDR0`Ra!UB@hK6%d#^7I7ah1(0UxuYi#}!@UD0| zC1)&e0;W&Pzc6Cu^ko2cqBpAGOOpZkI+d{O`_j6<{PDpaOu7`S|4?%Al-72YboqKM zFj<#l0dYzrOKc|dJLF6vTU2LDYSMFMODa7Z8n(~-M^5-63IUbjX)QcrLCjWT2C^AYFQlF34dB&}EFz1zFYL zT;bSUB3hh`fgyn0-W$)Kb`-#~9l?{0XbZnlaj`;oG zVyRN8YWu(CVx?G}?f+iG!wnYP3)V;W@@|HIzO_8K=quEKYw)cg1M@AV-b5I!5xvVy z#bB9%Vqau3o!%J+(Z)ZYTW#lfc$T*Y=-!qm>?Ch_&P8tkZ_jKJdoXV~=%x+4513Zo zI<*IO2P0dbSzo+MfenCNcoc7ZzqS0-_Lkun-O+&`w`d}%OmAuC86MGTLpfHTRkQqe zgRcYk!htqgl_Gx5koJ0(+qQyG=%qR&2sh#&zK|faou|Nh7=)l$sii}~;?s;-=6}3Ee zyKUjYec$S_t^y)D=6=h70QIWmiD%pu(qpcWS}EJFl22d!!tv^>cvA3xobeOYk-+~e z=J!&wi?=|6F_K{=xj~kmGm%*;{j&(}g$YUx#Az?C%2m`z8DP z_sHJ`mcGE!7g+iNq%V94A0grO4;DUnzVJrlbwqC=v;DQX`FTKo{zgvFe!%c>EGl3=H`C>SNxxX;kRWB=l=-){ogQ5KcpBg1Q^aU4Cfh!^BRWlq{8q! z3v2>pM<3DU(Q5h%QZE$S9KEI;R%9_%kzar94PGdk;NBp(81qQe9`pQm3f8cff;B|u zkyyhXYv`Y(YUoR05An^Q>|t;8A&v)2*~8wAXAcu$`19*v4}0UWhtEbF(YaUYNhAM( z>NZgwN%CJYbpHbya#m*Y-!(iy-`}45Rl?MBK+kW@y>Vgtph^Nml(Q}1)S^uNXFp|S zFvB-!@;nnH=cJ@>;dkqw{?$MID<%0mko+}B`VEBoT>u%RGJJTBe-8g%BU5>SEJkl) ziL2pi9Q^#1uq3TbuM@WPi`AyDAdCG4Xw$(MbKxL*E*!+qg=XShXhzJ1{j2Tc{j2Qb zX2e|hMQM{f7hc&m&CQ-)iYG??n|R-cKS}#PEA^Go`M-K)cK_FPJgN78*uKwf`{ug0 zZ+tw?f5P(7EfJ1;sa_~9m#fyW>tR$Y-2NbCPf3Ud%Y`9pVdGgHrxp$EWNlc7M@`~% zva^Z%>|K@vA1p(THnsS{rptoeZs&4j$0lDbuT|ITE9JFXzEmtOF1|ZP!Sc8TD{4U+ z@Q=QKLA!^9$eL|`brlNL$U)f}i{bzEX*mES@BfGQe<~}b8UMeACpG`CkLdtVf9W0o z_1PM7BY5CxyI5XdpKbr&s3#5opVR>$f&bS^#ah_@yHcO=|7&=p{r{r0zp;>1PV);; z%Kl6({Z^=~>MsymR(t=B=11_1`4J?R3+>bF2OEgx&<3G-L-395*A2b`qoJ?*5d57{ z%9=M1$3sK)Irv{ELgT-{41bzv;u^uW^+#{c?LtpmIx2tlCH=ARM&{>#_2$q25Bxp< z!O!N!o-})zmtPj<=B}!#QRcQ0>};bnbwO_3g52%}Q&WF?qNe^PX87tKeFG;eni_M{ zBiS+owK)-}?|g;XSno^^Gwy8Bmt@n5U1|1j^G7rbmY3p+R~2!7mR_zmlf@{6_NhgDc_bPo_k&bF=4FeNyRv6FLAT z+5bTCGo1ga&Gf%(cqIRy4^*Fr*P@ENhCD7T69~T`WCsy`L1>ft@8=W-zaTkv>`rsR zk$h2hr^(%!=L>I&#K2$mro1LroL9Oje-r+_{(&G+-KB=R_+%AwpN}MWRwRO|52Q-x zBPzYgPaOZBmIFZY{(m{N|G!e2?f+cIlYal_B{=}hc5h4`0Aw$vw6eawT%T?K-~8?W z>)rZFx%JQIey1F2{++euaAueu@wq5Mlqm;(RdYXg;&$m8)+*P zO&!Hn7;dU&D-=-wyNRIw5oWlg9XQAO2RZ~*G1ejf!us0?o#ci@>GwYme$VHj-^wG9 z$im!r@E5e>?iwW`}w2YV_AJKV; zpTyD zC|rc;4*xKg@~Mts%p>t1%=3>@@TlKU!J{JcNIdHISwl^Mh;9gTNzM;GQeC*NfkKVO%Dj_B?H6mO8mnd0$SIEv>MrP76t0-hmR6Fjci%SnVREoHrJbn*JZE{(pn3{|fDZPCqZz zag?f#53r8E#qcH2=QHYX0@yd;-)k0DCBZ*V1%D6WS7X{B%}cd8Z~f%YrP_XwsEhk8irn_W0$K0Sgj+_0g5b5*4xrZ5h-XJvmhmq;?bFamw zzeWs-f5?qwQu?(S$^I~fk?apgAG3I{)JXQnH;w22@lEIXfBbTI{vVG%{=CSSH$b}K zxV${+hGTG*iVd&hsuUXz|9TV~UfYxv8xHm=6dMkE+KSD@a3d6(N#RB*HveSKa7bt5 z<(jR%|0LMNGXXMeJkd4zPev|B*Xq&B(KY-}_@ljQ#++_fgCBPsp^-u11=f2-AI_kUl< z^YL%~+kZLtb;3;LA6E-MDgV)qLGt4YAZn&m`4=Qi^1&id|nuwdS{Y=ZpmZO*4E$ zGe(Dx-SiDz`ijJVqS1KET+K8`1FQM9kZ^e=t@)<8nrXM@TOrx`N?P-6b2ZbRDZj2| zh@SW3&6M9T!=K7bLHOU{D%Ta^|6Mcusm=7i&J~(O{FjU>Ps(ckhPj$VY8tVczsdEq zt8LBSGFLOr*5KIxD_pNnY|VJI^_yn+5YWG!g$>&AIt`zT+_Wj;xC$>VX1wEgtrKhU}iqy{WPa3BY^t z0ABk#v8oGoLD#TGgY&Bz9A{)WZ@fu%4<^Rvjc<_Mjbu1?k_HcVzvis)=tTj13xo6y zSv6_MaMLSh#NJKnY1|V^?&t(CZ@h^+R>@$}wC0VN*0fXab8xtZHBOkYHGJp8_3cLD zI~iPO8tn*e48(NYy-^x63gFIFwB(z~J$N)pgHpi1l6HOjirbX}{*|=r*RQx;Dd0!! zWRAxf=3@wcdmNS!2XLyG$1Me8VIBu?s@zy#gchd6jZ?s#YCH5*a9Zt10e7mD6t@hI zMM)umbF+s(>Gi*-<#Fps(EqBS`-SztVs)nfUBmP7Z~mMA0lN@q4HN*3_43*R4dsKA z>t{cGjqcv*(->wU%TC;F2oN$sNjfCWBkX_tern$~O$`wMb679c4mrrEJt0wMc@9|- zQ3!dNguO$h=xbC5j4kSzi@r|PK4a1FuAx%&D^$}n7Y%J0ilXnrzc+|-$4ka~L`HRU z7XE#eXmqK2xd8vZMwGZwdkRbb3enqQJIYWJ(WI(cDm3x;kKo^53p6BhoPza|Y2)G7 z43^0e3rLkefq!2QYc(8+Te@j9vi1}?rD`wX->-&skLztaBJpNeQMi62z7dw{uNR4v zIYlDB>e0vQek~BAuev&%VBZXcUUSzjjM}wv1+>b)6-cVrTRC?0w*x8jDmxmtS$;@J zcm7M&)n9PJHSTAhZjF`v@TEHT<}d{N{Fj;wzo?{OtRxch-0Zp8PlWvcqoI9vW>4t? zzy$ffR13-frIk``7XRxyp6_M8XZ@~o?Adtb*{ORr^z4D#>sr43)M;C%Uhl$sI=F;P zmQ{vfSuU2BOC_sVUx)unrOfv-=RJSWwJ#jJXsw;;+rIy-=e4aLBTRn1UvD^oob2X3 zjIGBa;NeeWtiDy62E~_nh`gnfbGv)y_%wxIg|@`5Ld%fL*gT&kR*D$P&m3GY9EQ)F z&F`HK0Jz#IZuhu1?6xz8i`}BZiY&1pzn8(=;Gi}B(y4vnb}lWq|Fmjd3_AlBLePw- zeKK&L+5;zJInUj}k_y8B^=ZE=$1$7^P(Zbw49jpE-Wc_a(j}wUNa9T*4Pnel5^j=m zLX3kLBodnS@p^0}kLMl(?G-Z}x9iYZbMr5NjphGSx&b1d|Ch=uE1~-zR*LnR|Mzt~ zKm4=*@&7U(L1uB&=P_=2bRPJJdgbdZ4~nh&-45Rj9XELyG1C*8Kw_qoJSfnb0$Ych z@vYYr!IGHi0&F=ISm}0~`GrYJFUY0;ajMc!vGi5MYsX0F7zLe1Ko?m3r>U^|6U6Gv zM65=;#i@u}2Ej!5`OgW-i<^tYeMZvtMFQ>rDHYoPEu#G&F@;G-4rjppPu_ZqX-e~R zuhG9Mp8w*@Z(=p-32H!oPdjs+nd|S=0Z%MC_t!G>+Uvafy6{|nox>XzMAQD8R89Mj zv1xy(H0|3;(-wlJEwH97gl?BIwPJ-LwlMc*WdsQ2!Im@JCZ-n;)dQ*({!oPQTM&BK^fTMqa%C;+s<= zqQCggXq<;##4}E@h4G4gIZm;K@sL~~NdC>a(eFnM_pZQVir^5t?C9i@pB}l?=Av&? z3fE3=QzC_;Wz9F{zM7cltE4Aa=0?9BHrx(|)XG@glOj7_S=xyAlGT>zJb~Im^4wgt zC7}sqE&PkPE9oLgIqph2rnU&MW2r6UmtK%d-zc?3VD)OLEduRdJheqM?Uhzr{vz(; z!f3T+f(iQNL=zM{ertTSC0$vw+Cs{{T(xCP^eL;}nw|(T9vYOjb2O%^wg{-dm}<)v zbQ(^iPexz7|L&BCXfDbA@43fwlRpXjzvWUny#HIQ&HO*F;{j^=7tH^&Ktw;Fqy?Na zRFeMLPhZ2AFkk=KPgzM!LC2Iia@Xbj9Frj+}u%ycl*J>jyi{{Y+-pJ#o6e)3%1) zw&PiYbH{4*?GyOJQu5Zvz*ErK5opZHVTM~Q>DJ=AnakeLy09;;Zf{@>eFp%zzIEz$ z9Lsrr;`9f2HS|dj)Kb^RdzGKLgL6^|15wC)$^i6^2R7tIPgZD4?^MoZ+0Yogart~O z=&vs?KYRA9U=u70J@0I}Lv#7dyE~iPd(CZ}4VldSE~vu3Dsi6o(XkN`bg}E4b|KSr9HsKp9!19QJ16d`djc)$o`K%)SZ6(01-j4>tM7Oh zu8)J~18VI|$Gva|#BZ%vG=_uop69QVzE&y4dT&t1mk-V^Y`0T@A$_0Z`n2bt zyO+Z!uJvi-UgQ4eM?2PgZuhkJ0d{Qn-0k;!kh$<#pJw0d9S_f4uV?KX?ccZF`^>LY zDy4EohKe+u8F-fz3*y5}sCv-rb$slPo;RRhGK|D_$hU3J>v>Wk9Gc<4?f3xJbJT(v z_SW|-DQ=JGlcFDn8@^5&+XZ5KR$kX-~K=mHKfd>h%};B;vhr{)uiaBC>vn;ob~;&{56~wC z+dF$oQ}F@h{mYAv+kKMD779TPfHeEL7?sx-S$#Pt8IPPOg#EU`aV)f2_}*&eMfy|9 zi{vcqlbnlm5O6@unZ0*-gp=jM9$0OAU|Xb|mkn|UeaeaiAA(Fnud|Uw_TvNpIfKz0 z9wWIf3;O@mzOaWU=k78`O{&2r^J*ijPN}?M^5oSS5`xikaH4Ev^~spGjFT>Jg=d)D zays)jvMS3*PA}!^ckBUnpudr|yO&bJNyi4}a_YhWY&;NO@yTvEPn}M$f8lfoRufpx z(6`ptts1OR2VSo|Ji&fmZjz(v5y*%$ND7D|*fn~Gr_3+pQytDpnvUP-a ztPWux8f4>=!x1K+utKMgsC5T=3Fy5u&%U_8GP|7NL#cyHppGv7Dvw^IGJ266oWeM| z^c)09I|%jAQLhgR6K035_PS1}IU+;Q{yk^#tmi#}s-?`2f}c;EOFW_i#E1_3$7g++ zQtgu`fGRS&2ZGaOAB8fskP&QruHqu{uUjfHlT^;%mcI|8mevfCf!p4XU9bK9xC}fv zLu@8$!T)|%$?-_MeGwG>vD&+M5!vuF0qp4l^dX3y-IJ+o)_%%0gZduGq-_ROByGka#w?3q2YXZFmV e*)w})&+M5!vuF0qp4s!tKL0;;ttycKa0396MR3gk literal 0 HcmV?d00001 diff --git a/impl/testData/upstream-hash-check-good/mrtparse-2.0.1.tar.gz b/impl/testData/upstream-hash-check-good/mrtparse-2.0.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cf1b7429028d8edc06774114257b506f9843fec8 GIT binary patch literal 35838 zcmV(%K;pk2iwFP!000001MFOTbK*#npMRTAQNiBEbk70iX?J(bUJPwxH@9t@06e{Y z8yiG{3aGY_bSlZ1+1u}ane~uLAZ)~V=JsNn=m$blR#rZLnN?CiA14dfpHg?SWYl5d zcQ5~`!{_w$RQ?a2?f>Cq`@2T#tkZ6vwOfrA{N8AHnw{?!zX2~hpIAgRgds!UkDj{j zx%1nT`+xH3G|9|gt(X`6spT{qr?k$_-Zq;v_LjY)XZ7aUv_74`J8jMy?Ro3$l%CB` zOaIqAfBU@LXB9>P4F#(=qX)bM5yNOz>N(YUNLLKGt1e>hFmWPT zsA{WR1A(fdQq{NrL0c+b75UXbab6ACf{Q5ROq5C)Eu)jER}rkeTkS^;a5VU zO~Ax^@>e~-zm-Z~{i(on4g(^a_a%8*7<-}$x084pdr@3<;bIY~b0T7aP}Hg*MI>jY zJ6p2Zy&p$EJv8-s#ovfUpa;#LJVUnb6fBAZEedltAt;mg`a2<7P!B8=9C`b`ReStC zGfv+F4*;FRT$txDZ-z2bH^YqHlmFSGMXDkT78-j^B&TR7ZO}?2YJ)F> zesYTZ;~!f$4Z5Sz=iA{$&Q0c2dQ<+i>9z1{Y!#{hm zloS8?!UNZR!7-kR|Mhxjr~dD>I*o7f|9ALICc$P#AqGt*C#5NR;YsNSu<{xF%NC0& z2Jn-TwB>(xQ~vfj;-U!w(|9;=f2#X^+<|I9?7hIDN?<;oO`* zG6WzCQ{^fN(5kK zIA9=2U@?%@h?{F486xKPIfO745S=yuS%ne>Lk$>`ktbl&TZdgeEK*w&H5>J^RDBHGnfy&$cSt^5a^!i^j9 z8W)oX>T;)Sk!&7l{kulisJ-0@m`L!z7`!uI3NsEiAzv&b3`Ss=Hq~|!C!J9=IETsD zc=Ku4C)!uFoq@jE*MrG*Z#3#&^)i9zzvz!?#2K_-#2Gq~obNscir6#DmqO(=N7Rd;$gLQVOC1|P#`jZ{5v#}ZjuxjXFD?&w$ z?x;QKUR@1)SKaaLuuS}U>D5k-vnKpCb|H{A>MOJw`vGPn0 z%=_*J5Xkw*2|7S(Y;w9Xm`V7^NV!VO5|;Shv!R_j z=p*H-ci51NjDafpB&mkpR6jO4KM;tPR0+iqkgho-wr*Q;85iG|C z+{nlWFxT2-f)`IFWW@j%IGIp(O~VK@*{zWep}+QQj*6;EnFy8PQ^ZqjW~$_G5p5Jz zgdr;8An?OT1~(_9^Qamy?6OuDz;+evunJdJ5!BhLY8;q3ckzVQ*~&rekSYz1rQs_x z17~nJ#wA3x}bOE(7MIkvK+DW>H#7vSnw2z3#u*d6iOI? z)yIdzP8PU6jf-%&#=*JlNzDT&AgJTi)=BwOcX-vCoZntw-`(`bUrZD#y+ZR2I1BGL zh7E)YM^qA6vLqzh#nGaPor?owr$ar?T*0`*@`7+yBpN7{Wy&qoLDIP$ z>+~6x#@!E}dXtMgWb4VPmR{wt(JCIVjfe-wh&Ua#sEsCRr%XN1kFk1BEVHbW?Cu$H zlyVved#s)L&C-bE1=mW@HNjLYvc;F)S%2`dPaHmei z5sCgVo&t!0p|*R~_~)hrQ89a?OOmh3XyxoOH(SL@ zG)5zb@53>EuWg586)DPtUT;YH1JZSz5bRS4+)l=6{kLS0fecFLFpKVGf6^a3oN6Gk zOG?1uL))Hb(Js>S^R%Wp&MiP?=v5uXmGVGgb5vBdh9f_Yf;ciA2lVyihC4fq;1z)we}lJn8(G=Byxkaq@tus zRcDxc(m`c)jsl%-BBr3w6OwiK1J4pxNWgZ%q3+hny4N6ur31gn7Jl**4xFnvt9C8} z*V+l-+hipc_DI*^_DYdX8OiBOX++t)fZ{w3SxbWl-#i(?KLij9)Nu;Qd}{tYxUmN) z+IY@|?%j)v>YzLRNX}_Mr`+XH7MWhqUt-s?W=htf?=7%0tM)In2PIs+J)-lXT@tNZ z1}E^w?r0);5^RA;4nU$C>#!l9_6420e77Tnu|?6b0!|rd4SNF>XVmxM4(LnoOpT6; z384MgZ`7UYD1^g&{DSxTA=sqEm%it4xsxhEk9-cC!!1^oti*L(ax(c35thtO(tHu) zqKk=VP_AJ*MamZJMj|jsxI;rNkY&-ieNiUw!qgzOTd0+;Xgpi;qNugCi&~L%p<=_B zEcTP7S?RE!yJVVuJ+eHR2-lCqWMb!+&vh6;8o+tI1vz?6Ll3SN znYQ00_%`*(kkVw{}Gj#t5hj zi5TjCz}!33kF>?K1(J?4-RKRx*#2}~1uz6z`A+PzXYKG5p~vx_VWO`RCulboO2EBG ziv7bb*3$c8_MC&!S)f$4XC@HA=O{55`=44SNs1r4)4y`;DUX-_iVAWKgK{rBX-gX9 z$GJSHg>djw6t8LylT&qE^6!5le?_=H{u}vlcXiqSiy_iExJ6XB%i8T<4RqUTOD6fk z)NLk6%%0JOF!f*d?u2*n-(Q~~nmGxgQ#>?e7V73MU5M=B+!M1nwg%ZNF)JG6wJM6s z`B!=u?kOR-rv!364<1f&?0e$+GYH&Nl^Rx6_Ch`7r)*NXq%5d#rj^}tLbK99jC|zO z)yl?G-3@D)L(OfcAF~~s+p?v2oKJ7rjoNT&*;~k>IK-B#KmCf!?keC3=FV#%P8I6# zNJ`jY^U|xyghwo#Oj3}i>aLX4!f7PWg&W&0tVkE_s^nP_HaPOVW7qjrg$@&^u^W-l zN0ZCM0Ndz{x-gCxRlZ(kR&7VIpLDx;i6?6enb^7k?!6{x5*|#eS*ruM3E+@N?#3G8 z&=u1yVVMmE=%)Mo89O}`@YVH_&z2Br9~gVlFfmj$!w)$ASfC8GOaGuT={&zW>iP?sDW z*>Sg9K4wFxE}Zd@E*4?=DV}T&4z!lUI87r=hh7-aRb|eupq~*+Zkkt2{o4MW?wPr* zhrruusLLkl9+Nl}gy#FI=Oodje1ZMCOw`2ygBvO4e5Uq5=r*u5eBm{O6oF}}rZTXX z3HMF+(Dl>j?dZ@x#iC!y^ziPg~xw^OR^|XycY3d!36F)fwEH)eq;0ABscyvUh>c<{qgM` z`SGi0wOWm4>)BNblld7W55c^MqD3f_M1|u=rV|J(as--ri5d zEaX9CLSV)zn^;X}^uAB+yVI)I-tC#zK5sK?!Q~->#OjdE!C;nK+`LGLXd*uQwFtYO z*%V%Ag1Dz1b$N3;?qBxLyW{@tjn0{W?)3)UPyL^J_Ph&k_td4!IdBKrexYe!s7;_{ zg=dA?A3nJpU1vrsns4WE0oKWy%!2q251y+)-469S1r|ZZTM;gZ&6W;M-TX56AnZ7?4I?A-Y${^ z`}`uHacq-BFJH+;F5#sh7gxAsEu_UwNxO{1^+h@S+4UZPoXF-j$5cwl2A*_j6z8+3qQ3z#FmOZQqj!aN3Q^md-%V6X$Q<2 zWstkib%!JBBp#KrbTz=8e>PWE&T)#Wp_x^~4O^pwtJiTPFJ`Ea-F~DoA6yf?@vzF z>vfIFVQPN3IMKaMaU$Q0GwuzqN2GgmLC$Y)F8YXEN96K$NbW{GT&x=mZ!hl7@#l)X z>Y_gy5BneP@E1v-Q6sX%Q#(0oCCyD)&j`Tj68(3@AZy9ZD=b_I8Sbq89~jGG!78$< zgjgZ-W<`_Itq&FBPy&EmoV2POnRV0#&=381u_W)%pCf#)lH<=L6x!ws_g`%>mOhc< zuRYwM0^!w*5N**IB5o+F?CD0+$-6_Yki(#hkiw1LLSCfhU@^cJ)FnMhdWVVF(+{vn zv^SGf3>Th^gqn;G7ib10y1=19pi$_%6`4fzfh(D=;B4?$6((_YEP1DqzEEu?kaX05 zHTf1PQ;Zv!iwJ0icD}%eXmGBMD-%HrlL+s z352*y9a6c$u>uM@%~%EZ{mJQr_T{)#(zYeD=4eeoklGe08`{Dgg zP{7x(NseV4LQ6|s03eK>M&basdf`$|YlSZcqYr>oHq@ zC-jo=mTb7?Qmjx_VQz8Ejv?e$lXz`aDqLhL@GSIWvl#~n%<5NUp1hkK?=-?P={a`&RR^d?Q32UO(-_l?J%8DQd zfM)_U=Tenu#UL8(Cxn57{m>lYyB(C8ZErF!I5WLdDSZlq`L1*dxQ#Ek2czujd^aAO zI5p3>e}!y|PfHK2S?f-c*I6TEfMXN?WPnDcrJ!8oG*%2i>_+WoK*3GHTF_1q%)c>8 zhw77sbE@!p#mbS1PU zk%*z>E7{1q;QT)3E0$A481q7pCaQKrSZu!jrKdOc8Y?1)FP$7_7=S zKDK>qU#*pQU3d#$C(||__$=hH1&Hx+wKXVN0y9&_uvIc+GLi$+_Bg2%3ijVI*pFN( zo%tYdm97!+TJEO;QL{#_5LV%^=gIU9vLd5cC0A{$xy6j-W_DDTy&6kE1Vae$EK!`q z1z+$55s2^t7J+1p`9bJ&oi#_S;rU)wYF@yM@v!>8?Y&!UBuSDWMzVW)X7grydS_;L z<{nzbR9|f-r<2Ki^U=+|&L&ya++mSiCaZgTtLn0X%pe(E$;_OH%&Ova^`h^ggLEtH zuAtQ|AgmUGAV_=A=|>U-K@y<(JV09LLw^eay3c`rBuK&u5Hve7^H;cgcs%k!7HcL0 zUCoSecXM-hb8|Cub90b-yfajsdY5)*aJh8qIq>F!VE43lf{Z-0nsZ+lsE})0Py*&y zAL%&6=>m36B7>elFS7l|eDDQurc13)zA(W;*4tz;U+`igEQe||Ea!x`&;hDQ19V^` z)BOb)og5T%`U9L`WG{z_NPr+ahO~(LyVzD~^w7GMr!GP$<#B|F9^E@-KHM0)E6@H9 z9Hoc0G3*h+2biGDq(Z`Gc+0R0=os-@?S8+5>LxvCg}vOP$F&f(laB2|f785D~+-|WKd^?loO$?QBuD>&C^9G9ii=YPgx(-_rf&HON&LCLpT~99{Mdl4w zTR@)*c`9_~ zOQgfF87I9V%1`v28YS&#{?Hv@Q#;NXT?C-VIP!r^pmD`G21nKeinz~I?Eub6FgTaI zS$sS$h@?6o@us_%8YOa(i7TUQrf@|gm}6|o<5Cq}9dL@`=y6)HeJ-#O6EGt_(Yr3) zwQ5sVP%T)8j%*n!kg6~2%Yd`#TnPA}%VisdAH_&{WJpkKgvy4%Z;A<`iMX?@%z)?| zW49txveC{ffniLIa0c2C(u91PewDzOd)U~ogxCNE?&P34C0prPkzlrxEh~SWqiJ&- zgT4-WNTDh}7Ke9bX08yKJg-#)6rQFOdOQ+gQ zAp*ox+?E>>TZ-#pC@K$@L_RiMw9kRUjDm$@d+4J@wJ_vg;ck}3n+Ok7l@>-m&>;fl z6(tlE9X7WJ$GTK(^J3Ys+im>qp}r$iqy&Yd&Uz@#OvuyT_hBI9HhJ7#quqA8?coI% zTNR4ojD_ldd^mNUMmm@qG4Q;JX)+OO75a@3Ilvq0^hY};YTv@xMS)f!j_oo5Kr?(v zLvcX^?qNG*l!;#>O09~NYmndr)1G0=h=P&!ih8F8Z1Tahp<#9}BUBODIwz(QfrnK~ z*1Q0L&~BBo3Ja+lZOKHGMmkc=GD1_)Gy!EmYDC##I{{Qz4WvN7VBPO_Fth;kY7w*u9~yQ$4Db;j}#?>K!g41T}xyM{kR^LpOqO8c0LJDx%T_HINR1BO^At7ZSq1 zWHW?lWX^NvL}KxT@rn-doHN^_`%1d*!S({`zzVqlLc*0waKM@T-^NyHbv zjbUG)-AqU{X!UYD;$_5M(btaBFwM+~mSfB*B~Vj6=SM@A?H=KR?!%bil1_#c7XBWd z*do}FV^Zj+bj*fAC>?024cTY;Y~tg_Rs+KlKznMXU~RcRQJrX5flomGgnqdclR%() zd`T5pqIsi=6|ey^if!s6!mVKWV8Gbi_XAXOh$|WmbQM+3jpj>ba2L_8Ws{(-)=u-5 z^R%7o|>jyh~TOjVZbO-o(p9C=x zEpZ87X-j6(UkAjVbqn)GO?L74Q-qOzAox`2IyW97+_m1+` zz3s!zj{wWYhdaAFN1qZBy0de%x80=f0}Te_pm7KTc7L~VXdT=?JlJn;)76&l7ItuF z0r2lbr7qcZAUiWuD^$q^M$YT?Jr~7u(%@5eY>Cicz;PveDYZ8G{_uk6Dx6)rKH=`Wx_|FyK>%7&`$+ z(6l8}3*X5apkJM2GUz&I9T%jp6K63mcDwV6DOXs266rlh1qHO}cidwl&=KU$&>kW7 zEqIj!^g!^*?znk=Q0}QLA83@}L)M|e3YbNJ46S{Ev590GK9=S#0fBRX-*<3tUD|zi zG3XH6N+^ zK}cv(??mYjTCw8;;UFE7=qj2aj=>Pdbi4i3C7YzD%zXo90P6(q+`z!o8L(Ec8Yj3W zU@vgai#0cbg<6^vpPZxUu1;5dvoLnMjZ2{?=e-`af)Y!ove`~-uIP5`5Pkxzj$nx1 zgR~KSY6fN8?~>4+bJ0cDlE5HFyS2k{w|d7NW`!bh%QCVZlziz{3x+6UHw+NUQnq_Q z!T6~63^gIDN{S96{V4$s+DANEx*cgZM9AE1TZ9;K*=J;=0UIUw5=kf6MF}{1U@4Nw zfZ2pmXL3&|f5r(<=R4_}Q_(kV=M>ZxS^^~Fw!w66dl!Tgap79@VlbWQtp{wkj9HG+ zo!ui2&eVvS58I88FPX3rH0Tn0Am~#e%s-Q;Q4$*kE|h?`_qK3dHMzl&^v1yfWZC)Q zIu0SR763=Rw4}4cyMaZXpz=)YCBbu)vOu1>QK;4gE>`zo)_8rq&yHzx`9PDW(aS7Y zAYignrhkmPlnzkltB^V!brX>Y0IWf63lpE3dBu%peZrhNOP0}|K6fS zv~{AU`XF8aC4h)8@L<}3v}{Xzvp84$OW^0v#YQMm>RFsD>k}y0@o|HS=4N(M&c*4; z1&_Jx(vuIUb~)4?o-M|FYxUR(Tvo^qDaV9d=RsZP$pN}EjNasHJD<$?g?d~2uGo)f zJ;(Q5g?T10a@gLe?d@=Jm7vtS7Q$q=B6ci;y94pZJd&k6DW-BH;PRRCvlY5fODRXZ| zXJ=9*jf5U0doZ6f1S6T$!X8ezX&`5alE5bvzq#N|x~=Ir3JRRaiC6 zp{slLF>6U6ulwP40a?9l=jGWm@uT_w-)rpc+}Um(72NLh>PWo*am8@|Td6+t|G$O@ zR=A;u{sK#Ue}qQ@w!WVUC;B4oWg|X&rt)a>Ke!WRigm=#|5CkHtAyr%v0jo z_-Ec`PbRa2PKazjA+sSpnaqpe)ST-F=jwS#n z$FVTWEyU@->z#QvaUFW%Sa%K&DZp0V`W=vw&TRPcyAJ3b@b|-=!!7u;-*>tn-aXiA z5y%IZhes{a6g)y0)pFu!fZJ`TShPXZrdO;pA)W5DJ;t&mT!Hnm>pb%jHF8GzF;x2a z5Ce7WZEijWtTTmz)nbhZZdE6jY!_T-a7yIf^T9=D**iVKOr(HlTTtZGWBo@;SR@;5 zc8~|f>29xk)*X^eKO)J?BrE9{H7C!;CFJEFV;-6v`!C3S49ZHO>kNp>dh%nMh4<~c zEX?=dBZg}wfJrv&^Z=4{ll(=`D=mXYGa%WbdsM(@Lr@^G#GYcNpq8M|)i#2f=OE_G zgxq~+nK+=shouY9(uN+5AiT`Fc1a@5CARgk zv@%P|0~3`PAFO9K-Td*W6ERN4Vb?mf@z#nwybzLN>6erGBC1mE5Pa^FMkQh8ojACmyl@GJAqM)(Q7VR;fC{~-yG zFUpt7>{p8VrScD3AD3zQO8WBj${rQ}Qhn6&4_n(uQu&p%Y5tTA-wF|FA`{*Wt$Z zUNpXkJ0D_Ceq4Rny1%!x*=QcAaN~P572JFGcaJp4FRaRhaO)BHRwsvR#J4sHTy`^r zi5}{cz*WZWVXLvVMPi&I+|?S@scFX87G4Xx9yqEk z={aDUT42nZRYNW5`AcjqN{{JvjlylxwPkmIv#}d$OM2dut`=xTsHzv%%Cu|I<|3^n zJ--{FEm~EhaKCi5kj~QT8HE>)&=#$#Q8=Ta7Gz}7wJ{+rA|*%@`l(nK@2Zg*n2C+u z!!!57EI=*^_eBH`yzC~un3}SURCi>-1Eqd6)|g%di>YycI5_SNyKPqW9k&CD92z*J z%0-Rog|nC%?|Sx$b2{umGtnA0Fw_*(Sg%f@#-86u9clHl=?(XcFV5ONTT5mQVwnD5u^%T(B zxcx(r13%h72*FB2+$t<0Sc201!yN#*wbR@bu+m5aDlEo^4-U8QXn3Vr^R@mu+P_Dn z)4O*Mx9@^L5s=#Guo#T}L%qM!tluguaX)jY@6)W(8s8%Hg?NFOza_&;vleT3?cQ%5 zZ3Cd)9Yt+Sx8iCv0Shb%oB5E$&6HuKU}a%gEC{Cp4Pd2UQYtJSB+`hb|w=n zA~zT&WRlG(5|)9;0M_crurRiu;Q>A|avRBw;tyLPk_A4ILc`PN;}H;7bNeWSSE;-@ z60FP)y>r<%Y?rLF6O(_NT=C2=XBJy7nVu)-Idkz0GoCCqShZ=)zhx2Y9FkbElOU8K zuZ)_Fd0a$ZaVB#gH&HSSxjU|hE^hQtHrce`7eNV}cw|Jj<3n?PU&Wh!4H^ZV+ijEB zu$HawgU|yl=mSK;h0~~`XpWX*!P0=Fax}!;BJQ8;khl_L_k_7n;>Bb?hK|KOm}B@+ z7WW(myDgprbvSq+!lr?-yvyKFlYZ9xd>S592%g_Bk}JU zqNj`N;!M-q)&X`1zg82^)AT&L`E-kvE0Ak1MgI4Kn+M;|WIl1|ISv*VfnTwzgk7Zv zSm>6#xDeuTaFy?4x;^z+Tqq15NP&v{y!&x2K6%y2&oBA-Z?hGpNmmp_fFaCPy(l$gJ=zLz0bU^0Z)1RRE+UMFsWKTLn!3m(KIn($cxp>2uk_KgYuZh%otj zA%!V-p1V9Q!P12;rh_oLM6NLGJ6zZyZra1H``jA17iccJ==0MiOZU>2KObHY*^I?u z2q5Ly^)4A55`Snn@Q6BM1cMssmGLyFJ@s~G!9jQtKZK+x(mdMQzkkGWU|Gxl* zQm&|oNC3$7atXNZi@nC(7cXQKODc-xYO%I{dQvQ|uLF`RYpZL3WwEqgJt?k}AM4B2 zRhnQ`SF2U4yjH4$4qdfYYc*200s(8EsLpz^Se{CqWo;;`^+LJ4S|}ANFG{PGI{a^~ z0R4pBwp=ceZ={M+d979lWxQO2+RH2TwF>QFsXXao$iH4H6)o}uuok~6C4vkoYVlf1 zwL-a8Q4p*qcS^NbUw5kTsbq)xWTjp$zu4IW<^N!J`)E5&m(;WxvCmhX;(BrY6rT0< zwHK=^wbd8plj7<6sj~)K4FaR}LWPP;=`N*$Iu?z*t&l*PLXFm!0;%7OG?Mgaq*J_1QJr>vEYAFfV zdVp)KY{0b=;94=^x|#-8O1_N8E3C={rKC@%ZbH##Ea z!xv@&N)mNoU8Q$}w^*p|<;KAdPn7N>q?Q>XM$-I7w@^r0+M}+f{xU^3S$Gu9;<6(w z-XI~Mf7ceicIYNStI@=_K6U+qm&k=1a_#amTU&=%s%!0S@7(?9!+r8rwI1Mp2yTZw ziUm`bGs3$qgxCiD?=B?YzeiFIV&J3~YuPpJ<4U#D6=_q-v(jiuC=i*+TXNf0AS;#D z%D|&mQ3n9qd&GFzVG>sVoUxj2JArbl-s@#=3od`LJh20GA7RCn~;z?i$GAuB+_(^SvR;i6ebdI{k zWNvDo9`fKSjg{LZYl=`Pf6w@2GM}*6HMf=;x0Y`$-NpYM++wT>BZ+W55qCCNeRR2! zHd4gAlV+Lqx#)+0BL#e@{H{nQ^L~j>*#Ja1i%*$Q@EwVcd`9*Xd_H3iA4?u}_y|&L z_pA?;jB5G2;#4(_n0X>$EU?DwMyXO!^RLe(UMKr}+dqFlFX^>VRd zjaotNsw=2pbpfVkXjdWwlr>T5Btnl_caa&pLD+ z;0FK7h{B?23e@-%C^@%_Yly~>C$T7?j*A|NGwhT28Jv%cCF%z7z9@vI#`~fwm>Tbk zs$gooFRFqo;eC;kp2p?sYVca;t5uo2tjP0j6}qa(mooNV z;_F$tSXf=92w*b-y|vYVJ*)s{38pl#;Wc0%e8FR{Y{4rR%jj1?2N2MJxk5N~37O9% zgwK_NTRw~6QDQv+YRLXpbhh+Yt7}|D!0MoGF;*~;70Ofj(5)fPV(2P_KuXmLACMy1ODxyQ z!3g2RSPMp|&ZQT80gkY?Dvch}Nm)w9b(X;{mvAI&g_Sk=ozW!yu!_Ja3t;cqyi!Gy zJwoF2fhtZjbMUy*G{~8FUXBRK)N7m@%Zc<##8%JgI~d@*bID|4HQ3P^4Y^GP~xspfR<@*(;`BTb%JCp|&)Fc1+Ec z)x@fcMUd*tRhV95H7(APA=*|h!ZKI`CO(JQz#tfwtDxCTD%XsQSX|d# zJ!0Ib`Y2!z&qzFUWD>!-6?g-Vf!_-KUOy*x*(}tK(G=j5Q06(vf#KLZ>BtK{z>W(3 zpbbqgV60q{&w9toKI~=}qcWa$hW>djNOn5Dqe4ZlR`5HH(?@uVdJB%cp;SQ1Tw2Uf z2bIr!V6CcqO009rPNYxDZ#Vb%3K6a&QcV_~#%mqzx9;rhZbv#&K43@(J8QRuv*@jL zk&F+BCH0jGZhguZW!)+lOKVHT(o(T*6_FpW7mLA}qDOfN?q%Q6LDm&e%(`MM?bF~V z8i1;yJP&4ou?)$R$!=$;Y> zR!Eb<*{81FTp3&8x^!t@bf!ZYpEmC8k{E|H0^1<)q@fn7t_UMd4+0)sVhJA1kG=)I zOZ`iNS2m!tmI^f?K4FCzS4>0_QP@XuYJd%OB&@!UL zQKhh~KqiUAy%?nKRhD#o)^9N%BZ*Jqoz~vEb$U9|f5DbLYw}uAd}2LS&Rh2nwi-v< zf#ViRiEYn*)@@NMYm1jIMrHv(L3!ehB{U&Xy1EjPLs}1(tkaHthVD(`6PY{wAfT8t zFYO?pgu(0};D}Gu`7ib8%w%=MpZ}{A%cZ(@{tI-=a(Qlz-jj+xD7wS!;425jyY zikIv%A1ieM3>|$+F|{VWXky}9CPunqVwC$Org6E%ZR*8pyIBR$+VqQi)3g4P(R0Xr#__fN(v3OIZ2`icsa4?O1H~wWK$kKWGYv`V7J>X zzUvu)%r0GI^9Xpbkp&RPJ>Mbk#LaT!j@`jF+b6V26272?_qJvOIU3!sH?k>@2_|B5 z&w!0u{VC#<~x{>`mkbL0`?5DQ3kwso4VT>}~ zh8XNSkcgp`bJ=Iv#Za>%&oUxc1GJCfYNo6Xa^c;z-k;$S`;nTW~Lu`qEwFBX&S z!^6ay2cqVI-=YI84OU^Gkq$4oiDb9zA9fR@AbZ0jcTi6#Z z>^~W_y2FdHW^bC4ph>96r#-?I#Gn0OuxT(Bs6ytCnG6jC^Wj;43(tp>oUNAM>A{$` zgk_uH5b%tE)Rdu@dMS(35dZR5U&1;IYkCU@5>rt5A!VuRD1O>LDc zu*n1=V)r8@oackqd5-|1Dku8X;M;}MCgj(JvqF#i>ifyQa?DB2M$~XBeD8!J) z2*r@X?8SyAGcq!i38*TJ9MD+!BT}593W@MAb+2((&%jdj&x|sS4Xw5!N(s6(^eCrd zk|ZdYT%6a!b)V5NbxzA$yl*6WM#nCV7y$*s@l``Jb`Q%LV~!TNI6-AXHL=-ZC^ztO z?KoREX5!*yVK_KJ!BVU}P!!fj?-W1evbQgmZ?~6kUs|_6TEBg7{dN<0X$TWBu{Jb2 zIj<~xyZz#}pS5mVIX<0W9Wg+nlLQKUn8lS${npTWQeqEmCqPNYCwtp}Vfv4t63Q)r zA{PJz^8o^RWwz#(87k-^8sLTFoxzGjXJKwJFVDSDDRmb^ebWZt+~p}dhjb9>k2d*_ zchAFabob!HsXwoCgS=n?`C#6gdqtoq@qoP2SMVXXXe=B4s(uL*ytzZv9V4d`BEnCm zL2z-sIS#QI0Z{@>O-Y8fk|5+$XfKk|wKQ4f>3NNjCw7I#tR5F_y*az1aHb?`%)ed?RA8pp9*%r?{wR+==!kek|~4*$kYa9 z(Go9gcP0C1Q6&i6Tp=fm9%Qx6mh2X+o`UBIknXmBgw|8jhA*ePr1U6o(v zVygpXom`c|Z#2oOF%j^h`&7ln#Uh}W zX{`)vZfgG?pgeIrt(KR|HF|66Ct%%X^)QlmWP3sMl#uv&G4Mk>;d_3Y=qyjvG zRVsO+SSFOMf?AbswPS1am91!TAf~XEMX*WcmVt~$`~-26U3rs=RmFoqPY*N0;;Rdl zZw=zDWEH>_Ul_MSEFxqnfb4$M0chC(>h}oL*1hK47C@!$E2cS1t-PT%M3RlPDpK%)Bpwjb6T-FV&NGqK zh>U#cH0$lbdK#%;3rO;U8~P{~-m!FTSq}*}ni#L68Y+tiW4953$jy`ACu>;}Pp7oN zY}*6HOBE;?zsS@}=R^x{1witpH(3~^aw$-Jd~blaoyBXNa`5eu%gSd7RfV0<9ikh^-wRXwp>Rv)?t!A7k*PZhh}_u}k! z5uy%XkM-(a(Zx9BFtAILi~})omny=Y)~~;Sl3ltbzZ$pZN9pS?VbQPN$W^~O;j&*H zbKS4rkcGc`#VfzLe?}(pqyc;aA%TZ+5C3C+Yji^e*XEXgPd$%J~(Uf6&g z1B{MBXvUQt#t5eHk=@8eeTgLRG@650;)LB4x!wixytdMwi-O~MDo!W8?!fI1gAL4M z0K%NpNL`C606Yk;k?_64Bcxtw<4mL6D&jdZjWu|8osb{P~|C{(YL`KYEDx+3BCz>7Q5g^iRZD9{Es^=g0?xs1N9! z-3AESAQ8~x{8>DDoL#qy&x`EnIew|rFJ<cySuy1KCbd?2Rrl& zKQfPBT6Yik?;p_bW%>KT;r?CvxeA}Z;9m55y}=f}Gb6W6rUwiKKY|45?06C}s$&TA z)_EX9@obowgFbqg5i!j{u%_(|!kFLoX*^#wa=G>uKD6lv9;KYWo5PcbLzDBc$i{(?gBtA+$78y$#_}82I4yyx-9l0AUT$% zQZD@kKuR$hIdP1Oe-eB1V4@*o!6Er!DwvBN2q2E_ot)>ge|HIBqhJH|K1HMa;<_cE zqNQ0o!HS<%fhUwnK*QaEKzi~N!{vrtCq<0NIcUXvUMzAwL0A)a$zkb?sO!1P6 zHd0p!>X}sT?nvdNHU~p#l?tQeMx7p!iS+k{y4a5 zNB1XPsuSIF=rkGaSk&m4)Kg(%-dxT|1dOW(^%F>Y6iV*!5aUG|M6HsKtbR-?21`L#ZFjr831nE*vfJMoRB7;(%!xm@7Qk@SWwZ5}qojHS6 za7;wyzU-7hP%qm*47N;C$SpE?1`SG4aGX_9mnK0$9WX`N7ziM+EipGJ?3TO%-^Dx^ z^!c+`pyq(w=UG~oQpGxvgTK(^q6EP~^U~6{5lonC0o8B&YGdMqIE1CyAW%$H4@5+9 z2ur=8d~v}+MhbXNH*Lbb!GD;$;@y~jNN96nQ&I_roL1$1H4GzWRNz>oC&^@GQc}V~ zpU7iYsPtq_Yh)3GjH%RDN!?Kk)xR!S+!N$MAuM7x$&@aYDVq)?dWOf*vyqk~G|;^D zBuvJ_y)T6HgC~y)Pn=6Xx44*3r1W42Vz>H2La$lzP^=8`mV=O%&fJ$xI=Uo4o3vt1 zsOnlAgda4H*tX~OymfYda#`qW=!!uM)BbRX`?O9QdRkTe-m$XBm&CYuSG~xw0D~Rf zodF`e?oatuhZtg>SZ9~+@~dN%z1M5fh@vzbwiU@S^YFaUGPEsbul2t(<&l8>D64%jh#qdLVpGV^LW;lC_Nh?FfLHDnAw685GGg zqI=#7i@DNdj1ml`a=NG%vsx!EF~QjwTv^yEGrdJdP-b|sVGYXjo*r#oAwLmU199>r zR3Wx6je;ntjc=+`PzL&>6^uiZ;sAC4MjQDl;woUNuK7vCH<}!-i=BxyHC4Kjfk`rZ z(2dE2rV^V(aO5)Mr*=mi4Uqay-amL>ks72@p&%aCk_mujh#AQmENXj)RCnQ?c)gZX zskO}aNeh~+tL}i9sBypCpZ=y@C^N`uxwiJ;ZO$w zP!{WeGNY(?2UOA+DF}fjkG3wG^G(>0eGIvqdKB1TM>erirc4MwU~n;1Qk%{Zj@0R&mqFXB(<5(ccQ0P z=)ArX=?Vh~c-&a2i+{=Plq75j`PwhZsXAq>PvlASvDF$|xScq{o6T1~@FOovpaV1N(s< z2$+BfHh1qgkG2n6yF2O*q12wv&_^fcj_VIZlcKsK{e+5&9$}u@QQ;%PVKGNOxHr(%3qMpal& zL%jOb4Fm^hUf}*`rjF6Kob{D8oMViEVt}aS%RheYC18q}35M(&*?o5!zGtW~fil@+(%M8asCn%xVNV zVQkP>0mwL-a^vvscFU-+b!-fyGqT!7iWz2S08Vi`#e(6WIkJ!c;<(XsB2Ns=BE7s? zPh9+$&-`9@^5`!~@n4F?S}h#^r80~EaxIS(dO!<1fTJ&mAc(r(R_8C_&6o$mFU3_t zZi$N{7`G7z+)9ts-AflO-O# zW|J%PLBleDUG;H+g50?1)Gd zlpK+p zZIM=atVQlWZ=<8=X#sJ`UD(fa=p`sdV=+&>27_T+)bHLboOF7=qq{d^Q`=sF1kNPh z{}RaXUWI5g%!C4Dyn_y_5%`j3Yp^BsVu0h6E8K-U2)4;3tlu^fWP4k$3vtnzzTmU$)V0oY#&rG z?e=Y<2zG6)3w?asIv^&YGLgH0Dv#ZcJGdliNM!(=lUqQ5(rB|gRlPyPG}>}bdh+5y zBN3S=4nK-R8)I_)rguka6N|7crQmy3sjNkRAd^oWCd2uco$gb+?53lJKSLdhWHxHYvcrw$o~2YG&uL!wgKRju1#1^t z#$}>nz07(z3}E6OC*30V_w6?A?@%#}Y`{>-8!#~*`(aH8a_g>m+56om-QKfqcC3cT z>khf(>UNvB8n9Z}tEnl2VILOE056J^^^OVEbS)d%_f+O_^!gC!T1tKDG>fkz#+@)l zIkR_F^mu87_l^!fjXIi<7D#iianSr|-{?g`ZzClKpF#u|%AAg9CL$bsCLtbt(g4w#dU_8H&=2DXO$_96p%B`G_9z&Ku!Z6}vLQJ-Emgl7Y*4;WsvlZc zDQlxEE4|Gq-TF#KsD(oWyi?qLVk#BOu%dnWTaB$P>Nyw3Iu&?oJ~MQ3T4+r8u`d2o zgJ-}{TLC0x1w-9B<8ckLZI1`xKot6z61huDf{US>x1g z_MMYM_c*6=5tbz^+~N~rLYOm_WlnIiWNdPK^(I2Z(A96~(2>aNJ9}H(KWvfZFBF6Z zBeri?2k>X7+jgE47HdEj^QFX=WSxN0?r!gGAMR{UGL#HN)ELsifl;~ZbREwPdcatQV6n3MbH`=C);!M0vSHV-rclx>=XQms)z970#35tMi zASr?P`6!`?@%CVJUFI7G1>71C1#)I6D8Ct_Y)QGP45VXNj=+%Q=EzauGn5RqJ~GxN zC_8O+qJXhGu=-|1{SQn~Fd@D-xLnFj8IrybB>+-F4 za^&eQu{Gkc{T$m^k+(tQQc7GmnOtdrBd42k zj_C2>)DvPfEV%&rzHS>QvF3;c1b2~hoVieH?ys9{1w=ByatR`b0XI(Wq;yz}5oj*4 z3i=5wS`!3g`Lr%u-WYD3f=S2Xt{0RBfO#(TJQAx2PeY}hZ6SV-&X!R;)l8Y9oLa!= zWEKV8Oy)Sr$hFa_7Y{5ULZXMyO}5Y-$HNP@auM}tEQCjCN21%NaMRBh>c*NlVHBMC zYzbUo7n7$0$1Hv>AQNXfUyTV6LO6!%NiPbiG{t&O3XD2Ka6K~D`CH^(*O3+Rup*Yi z@RDlz3gARH->`rwxKv{soWmAd@4aW07HOoSvOy>}(yXM{#*(b0D8EXaI|}U>@=X+$ zL#`T(LX=Du<4}{+_Si!~!91g^;ESYDv5&r?f(SucufZo(G?hAhwUUseql2b$o2fb$ z0YWotOVA*lGU@(1x$ZkFi_6Qac}s4*gp#pAg!zuP@+fz4q+NKFdLmXHm@8Mb@F*yc zyzWSb!`L|tM6isMu+-!Zr7%5SrP-X^0KN2>^LkQ!R%p(VGecV#@-bD;=Ea!vLc%M4 zZF7&gaPun7hA6aS<^YvZP-9C=G_QuOh5sVnzro(4$p|5-#=5wvFYcNlAjxnrvlj3q z<7{MJ91&VN zMdg;fOzN(j7G5M+&ve^10Vc7%6ytP}-dbulmXgr1BbNdJZIqQpXf9e_qbGY3Mt$uPn^iDHSqCJORccx?tJZm&cS>p4KXOH(wCF3vxspGh&rgwI3G_AeC zyg*0O`#JDvq0XhqKdN!Q*B^v6r_oF(^yW0kLJsgc1LzR5y2R@WX-k;EPXBIL`~ATI z`JJA#2jvr)yAfH=AS5_pEsA5mq|_ItHa0m&pf@_3dc-V^oSP$gfMrg)@hbwmx5TN|py5FsmzzzF0lFEXi# z+Q9=4Ed-Q)b(hP?Ydk&v8Idtk*`S#~ZXX8;QOsyN<484Qu?iop3g;H}B)jwB|4m|8 z+=3b=0(FHRfeI8EAT=3Wn`(&>!MvxA!LFFJU6+O^d_)H-M!Htsb?^4(1#4vQa*0D1Isz6Tki9qT4BWog8}v?k9cvq- zzSGD)tXG!IHXVKd9ZR>I=Yv$bRU96N=V#)`rEMv6^598G#Slk|RdsdqAP z23DhK(S2;|Bo$KZfG6mP)iHXav9+~?Hs_Q*5NyDW%UuY`=)5E#@RW=sc|Ij8;xyoMz`s<$jH{qK8^4QU(cK-VxzA%Cn6sm573)i6>gIXgNj8C|Sv5^9oGal*62Y zIn2iSri^nOz$nk01oTICY6(>s;nb)_JspRdVVRFMscIG`p7(vLJO#o|W^H(%Va=ho4HmquBHpntq%88Ix^c!JTh-TZqID{!7DP*^l7#c*w^tjCEd+PK(&E+9v zI)uUI*LUr0wGOv8KaO5Jl)_1~EA^BTTjInxo@mq}cXb8!?pMW>WkOpoBXuJ3w6s#w zq_z@viB^QMB*Of`5Tqw_@SI9D(lsT;eocffIk|1dc$sp%T>%|aM^UJQTi`;s?&-kU zUFYLKH{E)!gXdR*jsrjDMsvLyuC%*&QHFmqPHpC!&Gm}t9yt2Wk2M~~8~H**A}+ui zrw-$db9xox61j0|h`j#WOt{#PmfIeyEfH6Lhnhn#04KLnjzwuvSAB=*tPjhNeR58B zCdaEO>K0lw43wMEb40 ziTZ#_fFDIwoMKy4Enw^(d^7`KxC%pL{18~)AX#k|ZtrQ;8V=Rq4#TCe zl*Gm*y98=8^8#c<(UP~xL=fZSr?We`l2UzwTI$(YckS4HqvTrgZsf?FB`&0<91Kki zo|qRI%rTNwn-Zx&TD}T=q!l|Ydlb^ZIQXQq;g+Ka{yl4z21KaFRD+jnhfHH#qxLLH zr16H;`z~0;3nEqvS1~ zfFChYtU9$dBYN25x+dH=sz#TVCCmEab@a~7 z-Y$+12(+xFM|h8O#8nF67$*_cnMx%@E{SUBIAKhpU~vg6E`)=wM@en|o)-Ft1iOn$ zugBa$5JZ*><)CU&6c#?KhP6H$6<3*bdw`r?EIN#GLc!h2#|L|n(VSBimg>Hu{@EA> zU%c%nu52>8y5|M)XU3ZX-R{}Y_0M%L2CprjLwY;-WgXtxtXJ0R(wAzXQm7V4XcHFR zVO>f+0@&nULXczGO-6Wgd{2+x{s z0&lfS)kW(8pjut27atWYtLc&(y6`H=J3DfWO6=aK-}!%L4o>h(of%w2jR4c>?tzzXFe!7~9X?9eVO z#efpD?Fcbqt~5b>&EADO7~n09%1}r>#_qr&t@L}A-Tn-hc5?9~Nbk5t1o*PNy;BKV zLOY_cFBqsQQfXS+kUTNX#GKkxFfp%<1E4LAdKk4w8FdDgYt>rPQfI(z!>W`u_MmZh zJ=AHEq$9V$EcHmOP?u-2j^d06LrtzVmFrg|%BCn@_~_?-ID?J};bjow6jOP6F-|td z&jh(RXxHwh88gdx*09_Zo@eRHn`d66%%IB)5xDwtWl7Ri6v9Rz(X!S^VB#g2F+fEM zHly{Ysn$^sfC^rc$ews}l5_eYRV2)ij2mewxf0r5rTw~_sC?t%Gli0FTRFK+`7qkyPi1}kX>O{|g*Sj|d}pa#C>Bb~{B`*l9gzE%Q>g3ZW{kq0L^ zA9PrX@R~GgN~Je$lkZ+8v)Suk0#iO8Sh>wbt6VG>ts`gP4}s@6)(>`?`by0)v7-EG2J!Ov6oCKxcT=s_6g?(vtdjo6eqt(|%<70=L zpHYy+d+0l^jYeTq1W6?fL?QDj1JFAj*pSzT-2F?mP)oUh(@+L_J{a`ZmzSSCdj=C3 zu`Kkwv*ixWEM~|IT zq=*cceg@-2TLl){i+%roCWA{a^UUgQpqr0&G9)-R#mw(U=RGytiF<01jSHlG1R1P@ zw59^Cf7Dnq@GgT?=IF>Xk?(A_G?VJx^&1X?pw~OJ?sn+ zZBS489hh_39KdwDbjRiJ&StH$R$m;UrC3dJQ)#Xd+6tY2xP5T=K%n`EHU5;!@7|-WLDnFf>wfm`q`+nW)kXH3BnNjK?0<1w;kAA?a7l8c{1n*H7>o< zhiZB;!13h#Neggib#xHa| z+oA{_21k7QWNe)Z*V;%p*MP6yw{PpnMxl6 z=Pc@$+dfc{T1ViAKT<8ESlT*#K{+GTfYMO+ENvAcC^quOyw!&e-&iW8uWjcbe2ry7 zjbrqhSWwNC*nUXOl?cQQR_jHwVH{f3!hyVVQ6<{F0rxS2O5d}J&r8GyQkw$o90iOY zWQ+5bR&!EM%0=rPD_h8-rGS0r?v@&zd$C@VhJGYlKbGPLWA0I}9kW3p;SBizy z^F6iE7&s#@hi>j7J|`N(LUu4(@jDwNJ2!)|t_tTAxNzGFDJ5CG`17{5477(t8v~l4 zn}Q%lV2fZ;!#>t~l1T2nsznUwOD2N$`Fk4%PX)@y2e}KopX=Bc$8FnszD{W6d4URu zxy8kN(2&K&afV8)j=@kdxkxRvKH5k|Ep(B?X|`=j7@7w*Z*fB1D2+DAqKD|r6j>FK z>EN=QYZ*@DCkjtU4+oc^mv+lz1e=rwvSm7*f5j^|>2WS1NvxQ<#|P12h;S>!IcXH> zpLe?2jyx?-oZ;Vl&stritPfOWKB(FEKLl~oU6i-GrQz4d3;$%9f;Dw!offM4oM|Xlr+03cSIPtBFM1L&guUdK{y0Ply77Fc%m9{SI z=N5X)DJd;1%S<+f#+}yA-u96siWq>0{CFhbrSfVb^tuE-Bxlg?B z0<1MHh5te{NnYR@D~s0hvbCB>zcg@3GW{Y!1q0)Dok6QR==F0gn+8jPDvz@dpBIbS z@8`tuA_kydb){~8+iHl0x=$SIR%xwVDAiXB#X@m;?G`GJ%oq?FncLQ?w!{w6;RX0K zvXcV!F3x4oo#$Ct^yM2u7!=I^Th{O8mPjy?T-W+OK@Wka6%2CvXx;Xg*$F1>p*#bY zX4+$ZZ6&Qtx{_9AE2&yuSxMbA!*UZ>Oq^f81dC;%?a(Pa9Got#X2)yHZ1J2ep0mYs zgvFCwz{vkhmeL9oeL?>HzOc3_)56FpJ>fBc5HX?Or8`2VexD@EP^ zZ>3l-&iwzb;hFjW&HVp<8T|ibA3x&%4GbF$Xbe$amKh2iJ!N=b~EN39f;AGip>@_k(AWW)~2*9EmBHOaJ+Pan9ErYBkYHP+; z*GyF(7x9CZ35lM5s@K-DA0O;C+3QMiJ-bbjAP_**)|3UFu(lr35jf)5d+bU%i;R-a?;O0@|@JKEYmmm6LYiC;lADh1dL)L2C zYi(^ews@(y{MGgB!S?oHYis|Ly)^k@EIzz@kRG4i%3M@b~Vf z?awuWfAwJZep3{Q9j{_gpj9l9GO_t#fcKjRcb=978LnrK8XxX%x3=!zJK!HH^2gT4 zB6FSA7GzxEA6na-uq!w%VL9Tj75W-vsID>`D*VG5|3EX*IRJ3;ylHuoj z)KH9Y+f1Ann2XL0PWkwST~01$JAT6mhH65ECcsoV+HP%r)Y!YrQ>rZG)4fghg_2~8 zT&AAqL`N#edt^W5Y=eIL!S?n+V|VA{ZP5+EIH(N|F@vM6q((y%k>#lzlzpiiDujVg zuJhw^ifYLm2BBm7hb;m=s2)S=>>PYt)wp9tO3@i^RixFmQZ*?h#HMK)3*Qs;`rYmQ z7D108W+{)M)hofoR#9&?wzfz>>%6JtYOz-2Q#{->xol)foa}nbl}e*amP|b(m5nZ0 zR{BkCV`MwU3VKGy&Yc-lxg-htok}}jog-Li-g?(tCl^m<#9Qsfuk*%SIbmYK^*VF(F zL@WtMH8F{h!$MU&C8AtK$S_IXCNGP5>vPscbWzCj1}m@Sbs}$y6_)c(v9yZu7i+8Z zMa(GcPV=7C1jWjLe6_q%BC8+fNs^=69VeI_o4sxq8X9ol2DJLA6L8%9zSC_w-9bRE z_yvlcy52=VqTBueG+s0iwgbxC>^L@V%yPzf-zN%e=MvHW5vY-8_TS+&y5)470T#Am z@&=tDPJu*-$)ZPS#QUU9VfU;AizB-mMRbd}&O~&KegTQ-AL*_T(LIf${d>qnS$K%; zppT@R3dDR3;_`<$jo!}E8e5mv*0rlQVrO@?S_|Yz()pK(ROiSR&VkZMM)SXoi3 ziNw=&2B!o$+b74=h-oTZv|JK1es|~Ij?npmR1fYofp_2E+uPpNx;lhatyImJ5^A*) z^}8seb~S`ncC790iQV^y9U7K0)Ez*DN6-N5s_pI>z;XgMYJgv@m@8f>mbit47)(Um zMllfEEEJWs$zw!t6p(4{=o)oY+gB|%U+VWd?g_m^v4RUe zi5c3nHi!P8cj0(Ru#SPmmYk>k?vmRl|L+bQ?^(}#0wh6!QkmA;>Rq5Uo^}ykSE;ZF zka630sj04Gp^mH9*8*dkxHCs5*|4ZrUzJ1&c8g1l96@s=TinQe;UdMhctN|!9?;Lh z?)Fij-xDc@9sQ1}TM5>csO2|l2S{Q}bNhGhZ|`kN1`PPPxxaU3drL|S^NwP@#w8uO zfaqOg0opPVxt36+h$3TdBoSaRQ&RV`vsOiD=H5QYT?hMzyrm+oOwxpSp(j_QqOB%v zlb)wa@}OZLcImIIh~{D|<88J=7`@j_F^H1E2->5YpNR1Yw0PXt34~GEe1xCSAhLh| zXnP5y(8KMfNkJ;FmE>7Kw*oNIat!|I_6AsAnD+;;b)viEv}6|Q0!Z@G=ATb{)C-$z@A zqz{{koyepiln(ZK1FL!2JvsM!UH8YL)o9wV+X53BrdcvmN@+-yg71U}AO+%BC?)2y z$0py@-J_SBD~KOBxIQ&ijInQb+MsTNbmB;3F9Y2tdsTJ^)(y|T0Hx6j=-@#hGCT@K z{(jd!!7VPbCo9M(AO#tEAVb6~^tCEm=to{p(R|ngEbh7fg*`Yq7sFzr{S*U3i=`Zz zdv*sm@X?i4sL#6~s!80Y3%%DnBXnkc;&eJoWLq&LN5F91!#&^bSzIn$J48hoGs0Kq zWKB+HVaByN%N@_y8m(8bVjS_+pq#j?N-v4(GN+>e3AuLEj0G5HfbxrV2jiXdbhSf; z!9X(DL^7r5fvwkztK5>4W>kxWdZ{=MK$HdmsnOezt@~Z)Ipjh5<^%@SanlaPP%_OY zmSW}~rC=qgpkyKv1%u8a+}V;>H`!(vF$=1zbkk>ZyU|QP37)$b!wbffaIc;Un~o2H z3wnD<47P!x*wFdHMx&V3JRc6)cs+?`B)Q*jOG*le^A+ABgvo6=AhSbkRQ@FrD^? z1MDbF8hR&=A55Z;Y_A=Gy4(m&Zm(5j(IaLhw*08ECkrx;Jt^H{rBl)XpVy(qQ2c|Yz#h#yTv}I`eokE>_RZ&!w%~GtiO64DSJ?%p0DWHYQIF~~x$#6s2(PnDyruXZ z0mD0N+-s)LN`^p-u%w^Zl&VbjL0r&42h47tFG4AC%NtL2py&WD5%N!$;z z&F+9P@dShUYK=23GVwSxHaVmDO4uAwt8&&xtuN+|NdbvlWLBlFqGqfFkYPxypGKAx zslm!ZX_0ev7`VHhed3%BJIHefwl|1HCv12w(+)z{r6v`52^ChCda!y7q^NEuD%eQt zaJ_C6!D3t6zUTT8@9lUxj!Btn1a3f4VGUsOIq@A(7hcxNdXds-cEo;$y@wWk7P%49M}3iDy) zL;Ht!5*Cg+5s|39no4M(1>7;2s>*D^sG}p`=D`xp7Bdf4&|;1aKrEWudt0y+ZhoA! zA~5MTkPbn1ZU@5ehdoJxFc3{xfSjNHC=6=*cMn0u&1Y0R*2Pf2z0@KK^J5*_ND zpf(yUN_a0G>^3Qz%t+@@Ht@d8Qq)*fij{IkIi5latP)T8aPCrZWp+s9njY=^hi_lN zGUzW)wGJHRm6ck=`49SAJO5EDmg{r1sbUfF{F0ylh#3FF?Z(!^LyHp$-J`^ z^@LNR^Qzf0FHiz;tUZuoG*S2ky-8B}!jKCK@k%xT8kv^jO9aq&%)JOtI3+r-nhh{L zcD?q)7D#g;yr@f={Dpse$o=Z3(fkn5hv=<0HK4>t@*#7QR6)PEDw4uJts6RZ)~Dn4 zX{I^6xUjv;jNk@41MAG`Iv%kw9A8?Gk(oSh(Q91U#i+i84(!Xsk)`k8<*U*=Q4sPZ z91*H`7tF9nd_D7lI3B1r6!c@wx#MxGkjWGZR*NFA&d&lO4HUX`7oc$R<7JvhFD$Z? zdsl#9Bv%bAy-b;;m4lVFJ-p~!#~$d2=ZhI*Kh4-^(sQM3bcqd;Jo8`jlz+(mohJqQ zve;8<|=#UKL|GDjFlz;pUN-yQV4ON;q| z_(bXP*;x^KON+UMDR0`Ra!UB@hK6%d#^7I7ah1(0UxuYi#}!@UD0| zC1)&e0;W&Pzc6Cu^ko2cqBpAGOOpZkI+d{O`_j6<{PDpaOu7`S|4?%Al-72YboqKM zFj<#l0dYzrOKc|dJLF6vTU2LDYSMFMODa7Z8n(~-M^5-63IUbjX)QcrLCjWT2C^AYFQlF34dB&}EFz1zFYL zT;bSUB3hh`fgyn0-W$)Kb`-#~9l?{0XbZnlaj`;oG zVyRN8YWu(CVx?G}?f+iG!wnYP3)V;W@@|HIzO_8K=quEKYw)cg1M@AV-b5I!5xvVy z#bB9%Vqau3o!%J+(Z)ZYTW#lfc$T*Y=-!qm>?Ch_&P8tkZ_jKJdoXV~=%x+4513Zo zI<*IO2P0dbSzo+MfenCNcoc7ZzqS0-_Lkun-O+&`w`d}%OmAuC86MGTLpfHTRkQqe zgRcYk!htqgl_Gx5koJ0(+qQyG=%qR&2sh#&zK|faou|Nh7=)l$sii}~;?s;-=6}3Ee zyKUjYec$S_t^y)D=6=h70QIWmiD%pu(qpcWS}EJFl22d!!tv^>cvA3xobeOYk-+~e z=J!&wi?=|6F_K{=xj~kmGm%*;{j&(}g$YUx#Az?C%2m`z8DP z_sHJ`mcGE!7g+iNq%V94A0grO4;DUnzVJrlbwqC=v;DQX`FTKo{zgvFe!%c>EGl3=H`C>SNxxX;kRWB=l=-){ogQ5KcpBg1Q^aU4Cfh!^BRWlq{8q! z3v2>pM<3DU(Q5h%QZE$S9KEI;R%9_%kzar94PGdk;NBp(81qQe9`pQm3f8cff;B|u zkyyhXYv`Y(YUoR05An^Q>|t;8A&v)2*~8wAXAcu$`19*v4}0UWhtEbF(YaUYNhAM( z>NZgwN%CJYbpHbya#m*Y-!(iy-`}45Rl?MBK+kW@y>Vgtph^Nml(Q}1)S^uNXFp|S zFvB-!@;nnH=cJ@>;dkqw{?$MID<%0mko+}B`VEBoT>u%RGJJTBe-8g%BU5>SEJkl) ziL2pi9Q^#1uq3TbuM@WPi`AyDAdCG4Xw$(MbKxL*E*!+qg=XShXhzJ1{j2Tc{j2Qb zX2e|hMQM{f7hc&m&CQ-)iYG??n|R-cKS}#PEA^Go`M-K)cK_FPJgN78*uKwf`{ug0 zZ+tw?f5P(7EfJ1;sa_~9m#fyW>tR$Y-2NbCPf3Ud%Y`9pVdGgHrxp$EWNlc7M@`~% zva^Z%>|K@vA1p(THnsS{rptoeZs&4j$0lDbuT|ITE9JFXzEmtOF1|ZP!Sc8TD{4U+ z@Q=QKLA!^9$eL|`brlNL$U)f}i{bzEX*mES@BfGQe<~}b8UMeACpG`CkLdtVf9W0o z_1PM7BY5CxyI5XdpKbr&s3#5opVR>$f&bS^#ah_@yHcO=|7&=p{r{r0zp;>1PV);; z%Kl6({Z^=~>MsymR(t=B=11_1`4J?R3+>bF2OEgx&<3G-L-395*A2b`qoJ?*5d57{ z%9=M1$3sK)Irv{ELgT-{41bzv;u^uW^+#{c?LtpmIx2tlCH=ARM&{>#_2$q25Bxp< z!O!N!o-})zmtPj<=B}!#QRcQ0>};bnbwO_3g52%}Q&WF?qNe^PX87tKeFG;eni_M{ zBiS+owK)-}?|g;XSno^^Gwy8Bmt@n5U1|1j^G7rbmY3p+R~2!7mR_zmlf@{6_NhgDc_bPo_k&bF=4FeNyRv6FLAT z+5bTCGo1ga&Gf%(cqIRy4^*Fr*P@ENhCD7T69~T`WCsy`L1>ft@8=W-zaTkv>`rsR zk$h2hr^(%!=L>I&#K2$mro1LroL9Oje-r+_{(&G+-KB=R_+%AwpN}MWRwRO|52Q-x zBPzYgPaOZBmIFZY{(m{N|G!e2?f+cIlYal_B{=}hc5h4`0Aw$vw6eawT%T?K-~8?W z>)rZFx%JQIey1F2{++euaAueu@wq5Mlqm;(RdYXg;&$m8)+*P zO&!Hn7;dU&D-=-wyNRIw5oWlg9XQAO2RZ~*G1ejf!us0?o#ci@>GwYme$VHj-^wG9 z$im!r@E5e>?iwW`}w2YV_AJKV; zpTyD zC|rc;4*xKg@~Mts%p>t1%=3>@@TlKU!J{JcNIdHISwl^Mh;9gTNzM;GQeC*NfkKVO%Dj_B?H6mO8mnd0$SIEv>MrP76t0-hmR6Fjci%SnVREoHrJbn*JZE{(pn3{|fDZPCqZz zag?f#53r8E#qcH2=QHYX0@yd;-)k0DCBZ*V1%D6WS7X{B%}cd8Z~f%YrP_XwsEhk8irn_W0$K0Sgj+_0g5b5*4xrZ5h-XJvmhmq;?bFamw zzeWs-f5?qwQu?(S$^I~fk?apgAG3I{)JXQnH;w22@lEIXfBbTI{vVG%{=CSSH$b}K zxV${+hGTG*iVd&hsuUXz|9TV~UfYxv8xHm=6dMkE+KSD@a3d6(N#RB*HveSKa7bt5 z<(jR%|0LMNGXXMeJkd4zPev|B*Xq&B(KY-}_@ljQ#++_fgCBPsp^-u11=f2-AI_kUl< z^YL%~+kZLtb;3;LA6E-MDgV)qLGt4YAZn&m`4=Qi^1&id|nuwdS{Y=ZpmZO*4E$ zGe(Dx-SiDz`ijJVqS1KET+K8`1FQM9kZ^e=t@)<8nrXM@TOrx`N?P-6b2ZbRDZj2| zh@SW3&6M9T!=K7bLHOU{D%Ta^|6Mcusm=7i&J~(O{FjU>Ps(ckhPj$VY8tVczsdEq zt8LBSGFLOr*5KIxD_pNnY|VJI^_yn+5YWG!g$>&AIt`zT+_Wj;xC$>VX1wEgtrKhU}iqy{WPa3BY^t z0ABk#v8oGoLD#TGgY&Bz9A{)WZ@fu%4<^Rvjc<_Mjbu1?k_HcVzvis)=tTj13xo6y zSv6_MaMLSh#NJKnY1|V^?&t(CZ@h^+R>@$}wC0VN*0fXab8xtZHBOkYHGJp8_3cLD zI~iPO8tn*e48(NYy-^x63gFIFwB(z~J$N)pgHpi1l6HOjirbX}{*|=r*RQx;Dd0!! zWRAxf=3@wcdmNS!2XLyG$1Me8VIBu?s@zy#gchd6jZ?s#YCH5*a9Zt10e7mD6t@hI zMM)umbF+s(>Gi*-<#Fps(EqBS`-SztVs)nfUBmP7Z~mMA0lN@q4HN*3_43*R4dsKA z>t{cGjqcv*(->wU%TC;F2oN$sNjfCWBkX_tern$~O$`wMb679c4mrrEJt0wMc@9|- zQ3!dNguO$h=xbC5j4kSzi@r|PK4a1FuAx%&D^$}n7Y%J0ilXnrzc+|-$4ka~L`HRU z7XE#eXmqK2xd8vZMwGZwdkRbb3enqQJIYWJ(WI(cDm3x;kKo^53p6BhoPza|Y2)G7 z43^0e3rLkefq!2QYc(8+Te@j9vi1}?rD`wX->-&skLztaBJpNeQMi62z7dw{uNR4v zIYlDB>e0vQek~BAuev&%VBZXcUUSzjjM}wv1+>b)6-cVrTRC?0w*x8jDmxmtS$;@J zcm7M&)n9PJHSTAhZjF`v@TEHT<}d{N{Fj;wzo?{OtRxch-0Zp8PlWvcqoI9vW>4t? zzy$ffR13-frIk``7XRxyp6_M8XZ@~o?Adtb*{ORr^z4D#>sr43)M;C%Uhl$sI=F;P zmQ{vfSuU2BOC_sVUx)unrOfv-=RJSWwJ#jJXsw;;+rIy-=e4aLBTRn1UvD^oob2X3 zjIGBa;NeeWtiDy62E~_nh`gnfbGv)y_%wxIg|@`5Ld%fL*gT&kR*D$P&m3GY9EQ)F z&F`HK0Jz#IZuhu1?6xz8i`}BZiY&1pzn8(=;Gi}B(y4vnb}lWq|Fmjd3_AlBLePw- zeKK&L+5;zJInUj}k_y8B^=ZE=$1$7^P(Zbw49jpE-Wc_a(j}wUNa9T*4Pnel5^j=m zLX3kLBodnS@p^0}kLMl(?G-Z}x9iYZbMr5NjphGSx&b1d|Ch=uE1~-zR*LnR|Mzt~ zKm4=*@&7U(L1uB&=P_=2bRPJJdgbdZ4~nh&-45Rj9XELyG1C*8Kw_qoJSfnb0$Ych z@vYYr!IGHi0&F=ISm}0~`GrYJFUY0;ajMc!vGi5MYsX0F7zLe1Ko?m3r>U^|6U6Gv zM65=;#i@u}2Ej!5`OgW-i<^tYeMZvtMFQ>rDHYoPEu#G&F@;G-4rjppPu_ZqX-e~R zuhG9Mp8w*@Z(=p-32H!oPdjs+nd|S=0Z%MC_t!G>+Uvafy6{|nox>XzMAQD8R89Mj zv1xy(H0|3;(-wlJEwH97gl?BIwPJ-LwlMc*WdsQ2!Im@JCZ-n;)dQ*({!oPQTM&BK^fTMqa%C;+s<= zqQCggXq<;##4}E@h4G4gIZm;K@sL~~NdC>a(eFnM_pZQVir^5t?C9i@pB}l?=Av&? z3fE3=QzC_;Wz9F{zM7cltE4Aa=0?9BHrx(|)XG@glOj7_S=xyAlGT>zJb~Im^4wgt zC7}sqE&PkPE9oLgIqph2rnU&MW2r6UmtK%d-zc?3VD)OLEduRdJheqM?Uhzr{vz(; z!f3T+f(iQNL=zM{ertTSC0$vw+Cs{{T(xCP^eL;}nw|(T9vYOjb2O%^wg{-dm}<)v zbQ(^iPexz7|L&BCXfDbA@43fwlRpXjzvWUny#HIQ&HO*F;{j^=7tH^&Ktw;Fqy?Na zRFeMLPhZ2AFkk=KPgzM!LC2Iia@Xbj9Frj+}u%ycl*J>jyi{{Y+-pJ#o6e)3%1) zw&PiYbH{4*?GyOJQu5Zvz*ErK5opZHVTM~Q>DJ=AnakeLy09;;Zf{@>eFp%zzIEz$ z9Lsrr;`9f2HS|dj)Kb^RdzGKLgL6^|15wC)$^i6^2R7tIPgZD4?^MoZ+0Yogart~O z=&vs?KYRA9U=u70J@0I}Lv#7dyE~iPd(CZ}4VldSE~vu3Dsi6o(XkN`bg}E4b|KSr9HsKp9!19QJ16d`djc)$o`K%)SZ6(01-j4>tM7Oh zu8)J~18VI|$Gva|#BZ%vG=_uop69QVzE&y4dT&t1mk-V^Y`0T@A$_0Z`n2bt zyO+Z!uJvi-UgQ4eM?2PgZuhkJ0d{Qn-0k;!kh$<#pJw0d9S_f4uV?KX?ccZF`^>LY zDy4EohKe+u8F-fz3*y5}sCv-rb$slPo;RRhGK|D_$hU3J>v>Wk9Gc<4?f3xJbJT(v z_SW|-DQ=JGlcFDn8@^5&+XZ5KR$kX-~K=mHKfd>h%};B;vhr{)uiaBC>vn;ob~;&{56~wC z+dF$oQ}F@h{mYAv+kKMD779TPfHeEL7?sx-S$#Pt8IPPOg#EU`aV)f2_}*&eMfy|9 zi{vcqlbnlm5O6@unZ0*-gp=jM9$0OAU|Xb|mkn|UeaeaiAA(Fnud|Uw_TvNpIfKz0 z9wWIf3;O@mzOaWU=k78`O{&2r^J*ijPN}?M^5oSS5`xikaH4Ev^~spGjFT>Jg=d)D zays)jvMS3*PA}!^ckBUnpudr|yO&bJNyi4}a_YhWY&;NO@yTvEPn}M$f8lfoRufpx z(6`ptts1OR2VSo|Ji&fmZjz(v5y*%$ND7D|*fn~Gr_3+pQytDpnvUP-a ztPWux8f4>=!x1K+utKMgsC5T=3Fy5u&%U_8GP|7NL#cyHppGv7Dvw^IGJ266oWeM| z^c)09I|%jAQLhgR6K035_PS1}IU+;Q{yk^#tmi#}s-?`2f}c;EOFW_i#E1_3$7g++ zQtgu`fGRS&2ZGaOAB8fskP&QruHqu{uUjfHlT^;%mcI|8mevfCf!p4XU9bK9xC}fv zLu@8$!T)|%$?-_MeGwG>vD&+M5!vuF0qp4l^dX3y-IJ+o)_%%0gZduGq-_ROByGka#w?3q2YXZFmV e*)w})&+M5!vuF0qp4s!tKL0;;ttycKa0396MR3gk literal 0 HcmV?d00001 diff --git a/manifest/manifest.go b/manifest/manifest.go index 5296447d..738064c2 100644 --- a/manifest/manifest.go +++ b/manifest/manifest.go @@ -131,6 +131,7 @@ type UpstreamSrc struct { FullURL string `yaml:"full-url"` GitBundle GitBundle `yaml:"git"` Signature Signature `yaml:"signature"` + Sha256 string `yaml:"sha256"` } // Package spec diff --git a/util/util.go b/util/util.go index c0318e2e..3db9d066 100644 --- a/util/util.go +++ b/util/util.go @@ -4,6 +4,7 @@ package util import ( + "crypto/sha256" "fmt" "io" "os" @@ -161,3 +162,18 @@ func GetRepoDir(repo string) string { } return repoDir } + +// Generate SHA256 hash of file +func GenerateSha256Hash(filePath string) (string, error) { + file, err := os.Open(filePath) + if err != nil { + return "", fmt.Errorf("GenerateSha256Hash: %s", err) + } + defer file.Close() + hashComputer := sha256.New() + if _, err := io.Copy(hashComputer, file); err != nil { + return "", fmt.Errorf("GenerateSha256Hash: %s", err) + } + sha256Hash := fmt.Sprintf("%x", hashComputer.Sum(nil)) + return sha256Hash, nil +}