From 0ed2a59b8f505ea1895f554e2b3f17f20e89b4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Wed, 5 May 2021 22:10:16 +0200 Subject: [PATCH] feat: use Docker copy to transfer binaries to containers (#1136) * feat: do not mount volumes for agent installer, copying it into the running container * chore: skip TAR files from pre-commit * fix: use different temp dirs per download * fix: add TAR header for non-TAR installers (RPM, DEB) (cherry picked from commit f39aba5835cc4752be93bdf4e52ed548879bf77f) # Conflicts: # cli/config/compose/services/fleet-server-centos/docker-compose.yml # cli/config/compose/services/fleet-server-debian/docker-compose.yml # internal/docker/docker.go --- .pre-commit-config.yaml | 12 +- .../centos-systemd/docker-compose.yml | 1 - .../services/centos/docker-compose.yml | 2 - .../debian-systemd/docker-compose.yml | 1 - .../services/debian/docker-compose.yml | 2 - .../fleet-server-centos/docker-compose.yml | 9 ++ .../fleet-server-debian/docker-compose.yml | 9 ++ e2e/_suites/fleet/fleet.go | 12 +- internal/_testresources/dockerCopy.txt | 1 + internal/_testresources/sample.tar.gz | Bin 0 -> 91700 bytes internal/docker/docker.go | 103 ++++++++++++++++++ internal/docker/docker_test.go | 83 ++++++++++++++ internal/installer/tar.go | 7 +- internal/utils/utils.go | 8 +- internal/utils/utils_test.go | 10 ++ 15 files changed, 241 insertions(+), 19 deletions(-) create mode 100644 cli/config/compose/services/fleet-server-centos/docker-compose.yml create mode 100644 cli/config/compose/services/fleet-server-debian/docker-compose.yml create mode 100644 internal/_testresources/dockerCopy.txt create mode 100644 internal/_testresources/sample.tar.gz create mode 100644 internal/docker/docker_test.go diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 623a0c91f7..7514981ed2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,15 +33,23 @@ repos: - id: check-unicode-non-breaking-spaces exclude: > (?x)^( - .*/?\.*.(gif|jpg|png) + .*/?\.*.(gif|jpg|png|tar.gz) )$ - id: remove-unicode-non-breaking-spaces exclude: > (?x)^( - .*/?\.*.(gif|jpg|png) + .*/?\.*.(gif|jpg|png|tar.gz) )$ - id: check-en-dashes + exclude: > + (?x)^( + .*/?\.*.(tar.gz) + )$ - id: remove-en-dashes + exclude: > + (?x)^( + .*/?\.*.(tar.gz) + )$ - id: check-jjbb - id: check-gherkin-lint args: [ diff --git a/cli/config/compose/services/centos-systemd/docker-compose.yml b/cli/config/compose/services/centos-systemd/docker-compose.yml index 6721740dcb..31ca6eb33d 100644 --- a/cli/config/compose/services/centos-systemd/docker-compose.yml +++ b/cli/config/compose/services/centos-systemd/docker-compose.yml @@ -7,5 +7,4 @@ services: platform: ${stackPlatform:-linux/amd64} privileged: true volumes: - - ${centos_systemdAgentBinarySrcPath:-.}:${centos_systemdAgentBinaryTargetPath:-/tmp} - /sys/fs/cgroup:/sys/fs/cgroup:ro diff --git a/cli/config/compose/services/centos/docker-compose.yml b/cli/config/compose/services/centos/docker-compose.yml index 88e76e0751..fa1c2f2162 100644 --- a/cli/config/compose/services/centos/docker-compose.yml +++ b/cli/config/compose/services/centos/docker-compose.yml @@ -4,5 +4,3 @@ services: image: centos:${centosTag:-7} container_name: ${centosContainerName} entrypoint: tail -f /dev/null - volumes: - - ${centosAgentBinarySrcPath:-.}:${centosAgentBinaryTargetPath:-/tmp} diff --git a/cli/config/compose/services/debian-systemd/docker-compose.yml b/cli/config/compose/services/debian-systemd/docker-compose.yml index ae47b83aac..1333569887 100644 --- a/cli/config/compose/services/debian-systemd/docker-compose.yml +++ b/cli/config/compose/services/debian-systemd/docker-compose.yml @@ -7,5 +7,4 @@ services: platform: ${stackPlatform:-linux/amd64} privileged: true volumes: - - ${debian_systemdAgentBinarySrcPath:-.}:${debian_systemdAgentBinaryTargetPath:-/tmp} - /sys/fs/cgroup:/sys/fs/cgroup:ro diff --git a/cli/config/compose/services/debian/docker-compose.yml b/cli/config/compose/services/debian/docker-compose.yml index 0aa23e816c..cb4491e840 100644 --- a/cli/config/compose/services/debian/docker-compose.yml +++ b/cli/config/compose/services/debian/docker-compose.yml @@ -4,5 +4,3 @@ services: image: debian:${debianTag:-9} container_name: ${debianContainerName} entrypoint: tail -f /dev/null - volumes: - - ${debianAgentBinarySrcPath:-.}:${debianAgentBinaryTargetPath:-/tmp} diff --git a/cli/config/compose/services/fleet-server-centos/docker-compose.yml b/cli/config/compose/services/fleet-server-centos/docker-compose.yml new file mode 100644 index 0000000000..942ad0be4b --- /dev/null +++ b/cli/config/compose/services/fleet-server-centos/docker-compose.yml @@ -0,0 +1,9 @@ +version: '2.4' +services: + fleet-server-centos: + image: centos/systemd:${fleet_server_centosTag:-latest} + container_name: ${fleet_server_centosContainerName} + entrypoint: "/usr/sbin/init" + privileged: true + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro diff --git a/cli/config/compose/services/fleet-server-debian/docker-compose.yml b/cli/config/compose/services/fleet-server-debian/docker-compose.yml new file mode 100644 index 0000000000..8b2f3c3d09 --- /dev/null +++ b/cli/config/compose/services/fleet-server-debian/docker-compose.yml @@ -0,0 +1,9 @@ +version: '2.4' +services: + fleet-server-debian: + image: alehaa/debian-systemd:${fleet_server_debianTag:-stretch} + container_name: ${fleet_server_debianContainerName} + entrypoint: "/sbin/init" + privileged: true + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro diff --git a/e2e/_suites/fleet/fleet.go b/e2e/_suites/fleet/fleet.go index f632d9a21f..aa04b1922a 100644 --- a/e2e/_suites/fleet/fleet.go +++ b/e2e/_suites/fleet/fleet.go @@ -1188,9 +1188,6 @@ func deployAgentToFleet(agentInstaller installer.ElasticAgentInstaller, containe common.ProfileEnv[envVarsPrefix+"Tag"] = serviceTag // we are setting the container name because Centos service could be reused by any other test suite common.ProfileEnv[envVarsPrefix+"ContainerName"] = containerName - // define paths where the binary will be mounted - common.ProfileEnv[envVarsPrefix+"AgentBinarySrcPath"] = agentInstaller.BinaryPath - common.ProfileEnv[envVarsPrefix+"AgentBinaryTargetPath"] = "/" + agentInstaller.Name serviceManager := compose.NewServiceManager() @@ -1203,6 +1200,15 @@ func deployAgentToFleet(agentInstaller installer.ElasticAgentInstaller, containe return nil, err } + isTar := (agentInstaller.InstallerType == "tar") + targetFile := "/" + + // copy downloaded agent to the root dir of the container + err = docker.CopyFileToContainer(context.Background(), containerName, agentInstaller.BinaryPath, targetFile, isTar) + if err != nil { + return nil, err + } + err = agentInstaller.PreInstallFn() if err != nil { return nil, err diff --git a/internal/_testresources/dockerCopy.txt b/internal/_testresources/dockerCopy.txt new file mode 100644 index 0000000000..d64066171a --- /dev/null +++ b/internal/_testresources/dockerCopy.txt @@ -0,0 +1 @@ +OK! diff --git a/internal/_testresources/sample.tar.gz b/internal/_testresources/sample.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..0abf0b55b9f98621f5472ff6f1b4f69f32da0e4f GIT binary patch literal 91700 zcmd433piBW`#)R>mGBf2!c#pZ36(-QOr=sOQzSW#lALl%j&mYKrSen`O{ z9#Sb{k{FCRFflR43}eoR{olUd-|u~||M9)v|NCCo|GBQ&Gkf;F*S+qw_Py4+51+LS z)7Pwk#l1McLSe2z1)(|ACJc<@?%Zm=YU`cWZp6>W-)OG`P&Ap)dKeiqTId#(^ zsJd7efv>mU{Xp>nt$fInSzjFzALJDg%Eni^&2*WBu_`O;JtN?~VdWyiT)ssMw=cXV z@7%Et(ZZp#?KX_K>(g=lqP`avjQp9|dFfeZGv>8v-r*s@(=x6ex5;;mGFI)YV`qG+ z`1NaVQual&J$yn7$*QNKjwJQ7+O)ht?`~T;3=cPt=dz!N537z*1 zh540n@?L5M=j$3zRIS`=;^Q5k76XHkHp#1GEQ;6BXh19jjLg1BDR?yAcy83fKA@uv zpchg-{ZNH(rNrBAK(|@EWNBh?+~y(C4!l=nc=9Q={X={K)(vnVu#X_b$G@S=<;sR9 zX9rVM)onT78@)5!fHZab6ROc`)u16XAhO$Jk9<9a-&7%npun^GmG)nG=xx)2cm{rx zy)k$yT=MI>j9Uqv5<@N^6Zc-R9a~X)Mh4MZgtu~mYgoXj2&!)RuwE5fA~t6V@Ap4* z-2oUSf&|FK_g5-NNg9=M^hN|&a1UvP#w+j~DL(!cxPKmi)*+#(k-LfL^7+C>Y2g|k zwFj8!x?I1qQjETNr}~CM{%IY&H(+#3M*MKUf&KLl=OJ;#6mY*6Y+9l1 zm5Q+>kgZo(2Uxal<<2uQ+#>Mt7v2qkRz;Q#qnSFKkH3K9?*LEhfd)IB4?(znBY z@T6{KrBv1a>`yV<1e8~wy!QzcpN+dDe;n2*o+YWdUEDKf12WV)rov)*#lC$-v}yD< z%ZvNIXk%d!T^T3K3FsJe9Uv?Tj9Q^`s34Q zFf(hf3zy0tPYOqs+bczB-M8=?k|>H{`hmDxcW&N*b&oc<3f$!lk2e^Y9950oaBM>$ zX$#IUCS23&Yu-1!Aw+_sF4l*Y!91`&jjb50s5&kJ-EO1b1Qkaadkx3n8dCja8xMYT zoLfKm17|$ZQ>Z^N@2?NRN_Vj7r=G+@FtUD&d1g~UM_tTxY%`Yd!nEPgbXdq7d7g_l zqR%7Sf54(1=VmvvTA=uTqNZ#tgNp75L^wnwc(@LiH4GC1Oh?Bk_WQkrHE3!}LJOGz zU`BS%FvtR2%aUZ~?xgq<)9XPLUTfpNxea}g#E)k@>!@Wzb z{Rh5zK|eoBMB)cubh92EV1l>ULc^HsnS`Zp3}gCfyWofy7{}|)y=6b2Exf^KzQ8cz z4cZW&o@GRwg73`hEwY9AVt?i=6t{C7E*M-B2@4`@^t!bdisd$O-i+%ns%+6{@&5Lo z_zAOufab;4VC8q_bSD`dC}MuSHN|t1xWGQ=h->V>fPW-|%Y2?hZ1YK=v@Z#EV-f|? z!RVimV5<^~M%#p*tIeKI!y5EozX{qnb((!s)*f^NH#|GTdaGY!kXVQtoF0(ewPl-& zze9df-T({qM8Qs`f`$6_#l(^pfOrd5CAb0iN&G&atmgQ9WBJEjHrocrx9)v1BiWeu zntFQfWR+5GNaQw_G0TWG8h7_gPNi=w3t4tyhP?EYsP*&oaK8HkA+LOLIyR4XygJ4Y za=bRc=b?iQ>dn(PJ9S=_G(zj=+W*uup1G2Ou6-wWzQFEPyFzF?6MQ6?S5Tfa7^b(x zihMol8Va0lD|*lf%eShNmks8b?+W#-y)l)G>F?*8h8{K_GSIY&tBO$leZXNDLez(Z z7ME;!t~8}?c-L5=L@#Rm%f@wQ-n11Xi`xoJ?w}75apYjEQwuJ9RP$q$!%)PU{c^vA z2|6iDv=g2-wn_c?ziBhDn!JzDLxNy)0X13Q>Y^-bW%rU%;9GuG6tIJwu5M*9yNzYa zGGUQ%X98cSYf|}RKL*JO9!CteUX*Dq(<)ztGqOLp$u$4w|mV#so(^MS_l%x`0?d8LgS#!hN|p_$C#wYdS&t^AG@#u{p~k$8>cWC z;qLPXWE=I4g(QO_KokMweGXMyF$RBwJX~9E^Y=FGGI>vuzxbJxQWpCO|De+LRG@ve z9R3JouiH=Y8V(C%&w32%cqgm4L6#N^_J5%`*!n)s-7JTzO5@Tw)ST5pY}1?w%J|qI zG9js3)eU_jasc_o(QtrrLH_#j>&@~OMY+Uf0#95$4YdUO{AY8!>0XA-I&on6f{ z#Y`E{>=Uf3u6=c57aFz>X!8}avuShsZ((cPsA25C^Ltu=Rv%H>OwJLC|J~iGfUi1W zDu!LNKOcl8)Hj5U|Fl@-pMEdaZltHVd=R{qzo9NUeOrFy>w&h;8xh9)4R<+=n7rJk zTZZ~A=*7O3|H>$V?Y#T9=gX^0Fj%sj>05A4HsXmczd4ZZLUh9ynVC8SvgN~8ABSP+ z@^STrQEKAFbE4n7yh|x){a3#>x49%2&yN2koh_k>y#f%~F!ZD`nq}%$w~aVP{xLYJ z|NYS8RQaLG!d}l;_~`H%msRs6yr)G9SLSgXy2)qBZQoY&KiCo1nqt!>$WCG_Mf>NF zacEq*bYes04d)GbUo+kFlGVM7q1~u^zNj$DRNR9_(cU!ORJ+fKF;LwP%coeQ5Csd-fkkAD9k^#(BVsxHIv z*@wSCs{M85mg$I4y?GR_y1d@s$LoE;*H^QJ!{o7=;)9{1r*6gEcV{8nXL1&95Kc>U z326nBqVM2P7-80iRTi3f;Y-TBxYc%HmC0nT!?1h(D*PGPM!^#WR(cc?GI*cSWwwB5 zJahz(C5^QO92aywnaMdAa8RlAXcGgb7ElTDor`$NKPZjE1$Ez23SvLb?(3{ud29&M zRvPoGie#!?#_zX~?Z>dY-XK*0@^)#QdlKK5+E85Hwu2@wJkQI!oj&g%Us4}J=Xvwv z+tr_e%mjgVfqAv>lsuby<%WY}r-Z#@hb`6O#?SKzv5o{!9lu+Ki?!%4mb3Tc4R^9a zg%JaoOwo~r5vB|8fmLi=IO{ULBrLl3^ULmxhiCDf-+K=G46c)Zm5Pq?4G8kkV3<9m z2k|nV2m6xE$?czS7=Db&_LB%szKN*A*Y>L(>-FLT4iv-g7GR7FRCh_GyH41P?8F$RG z4R|(I6Cr<#j}Rn;7wjkujV7Z$KOGyt9Y~f4DqA_Cv>GoTZV07{=WH%1El8`6dXn2- z!hNF)m9%-EV_Lew1_y*52YpN{MaS^5=UkDa4c+QtqJ_|yT)8Vu2PB~^-t3{DSb*ji=134# zH3#Or?S{$gifH+AyuR4CuP8(2Y)7f7VaJBqE&j~N7zRS(giokIG~tz%NweN{xvaj+ zE#k0lNgAtCg(r5f1O9yQ!PppW+!}S>Lv_ijPp(b8)SOQ}Gz?JG+4FJInG9L(IoO%z zZ||8BBFy)MX`W}4l9IIG0@lRDreQ)_U}Y&KJv7m6B>Jd_VWRq=yOW1vO`SbFUJyd} zMqiR;_#P_1WbZIrl(Jnb(7i1~w9zFe_+k6V@yJG;+K$~kT^@Esi8TUAoXXNYAwoPu zvsUjodB5(_bV~KUDr9|vcZ=pBiqGS~9J)mIXpnfE%hkCe{`UCG7yTy|h+h?43YE!? z{lyO%FibobNgpf53}9!SAk0v@b(N3KKx1s5Zc#oNx&ev+>=s}*16|)=ZOSON>g(H2( zO|Q!P6|dTl);#%Ur04rE;mV}#L(wHbYXq@h2Rf@SOW`1G_=;& zXZ7Mr?p(ut=2OrHinJZ!Ha1rMw0b9a&?kxSzCvh+-KVS8l!7ImC6-e+aLbiOxk`h) zukoK3HjNeD%mH8vwtb2FF;T7VSi~v+7nn>VmNn*H;P3khe*5h*Fr%3AefXPZ6U8a5A4lqg{hp-2q68 zet`Wv!uWA$es=^?vd_PLM-|$u&K~MoV#1q&J)}G4G1B?G*_p4mWFi&+_G?&?upGOI zVM?Im+L_h=V%&Rs*?#jVESC3vkMk|6jWR%Q_FOjJGS*o3)7>3Nz=q$Yz9v0=2d_&8 zAe*@{*iQ%#P?%r{T5NR$X!QHHE!h1EKXbSsBFSEs`7gE?K#~M+wAk?#ekl<&5o_e% zsbIUPyYOIrsWRDb!BGgH1m18VP({7MRN#+2g9qo>f$dAqza7bMYtOnHv;=MfovV&MS7Shc`~> zGYnrgQ7-_By|<>8#B{N@eT`^3x9#T658!na zrWebtVZIXFmHi;g!o<;{>cb~azZLMj%?i6TIvwnDOkUaLFjBu79jJXsjBdJsz4Xer zz#M}UI)g*aVXYtDZkZjF0-Dg(Y&(Ey$%PS?S^wlgj()>eSX`E4zp zE%ghDN6mCLmdR_D1x*9(PI_}y2WY=qsQ^gXd;a|RkD@;DWn%M=H89;W`F=N(P>=VX zl*M##StrIQhJ*I*2_aiAjb~(6W}+%?1ZCU&BpbIybWaYqB~E}gu@o0?pS5f$lt+g` ziNh}qmq1G;4wUF=>6qm3pgH{z!DlRo-Wp(k-j?577w{MJ#oaRM-fgB4_w|24KZj!A znSFy0Vco`&XjXikTer(xV^6YmSmi+H)g=-p14YVuO}(_l(52^dd^72u2cqt$e&>bU z%OIY-E&Po`9x*K4fkWaR$VsFWZ?xc21&rndjIiQ?g`4Nu4!?MflCTUU46VKm*DeX$ z{sZ*S_7$rSxa!~qTYsSDa9OdJ2*3Y+?Y&jpmScIV?eF;C=p4j=A1t_+>9jQYS4=rn zI(VaWHVhyAu3@Nq_WF?dP|?^>;^s}oo?D;qSg2n*Snk92heaAc@;(4JaJ8M1cuw0fSxLuSn_pDeUAoG9}S7n^vj^Upr`&U)A2FwRcy$7zk~ro^ki$->_#ahtxO&q|ZH%cPL~G@Omss?IK;)22 zXt*2|ys5Nli~EjlqEN3?aIOVq*nUA~^FyYeO44^ftduiCzYjOKB|%olP_|3?Rew^c z)D(dLrbe?_pEj&Gq}F=w;!bh|c94X=$sCNJ&Yy}-oA^ZXl_2Jbt~%XO`(U4uk)>a9 z;H@lO>f4{D3!d)A?NPKd1@#Aw1-qMJ7&gOZJ?;wRI2w)J%w}h;IrwQ+H|vb&3g>gR zrJD>cE-gA%8&|5a*?S*mZJvrY>R}*X7hK(4x^@=HfjpAX*jDi)B+SjDo6-EGTEF!y zos!Y$yxhgq6;)j%jJkLP5?@eXy`cy}Nn13Q-mR-OYYMTsTInuYdLOIm2}`<;Z8@GW z*$k7sH=Ha&*jJ9T;?FnjPFj376k{qhFC24A7?$ap?CW8eL0EMX=f?@0A82tcgY|fL zU)Z`s)J|JrTxy{*jQ^t`1?7}sK}dnnAAO(h#LLU<)mwGAG;K8tbrdjGBJS@sgxr!E zVG=lcXn8n#VGxt>3uun_3Cr!Z$dG2GV`Is6KWsB>#iRU0-j-S76$8XCaRd*th&sv| zBRacg;BghzNam9W{LMPlpu&VBiZ8HBqg1lOFH09f)9{O-jt&7ozc4y`nd&@g%C2># zZ@d>@+-ZIypAI!>z3v*(!XKZze7168x-;-vw`Ijxg1-ad4=ydBWl_UM-M-9yA0Y*B zEJBCvQ%7mq6)$*KZy{(g?laacw04RNZjReCGJ+OWTPV)*+qr*}RP_tgx^qic*|O^cEFJ$P znI@ z+Ea-T*9Ovz@9z8@Z#-eXE-abs_?ey;;&1GagwVA0w#1T$HVf_spoUE~1S%p5hUp#I zjzge5>3_46XKz53o}`dmmZVu;jIIxW?Z#j5muVB-h}nn^BrR#0IJ>INJm1V2oy&)@ zQ44Yu@CTbscwgMy#hDDl>KgWkwBox>Syo>%><~9?Veh3EX7?He)qN5fEvW!s$IV-V z{;Ya@n1#jaERkfqY1Bk!kM&*JX z1ou5RVzT5i+&pR^{W^pKEaat$<4)$ZNKQ~)cqVQI4k5N-fMSSeM7g;CZX!PNP40Zo zP~97pBU2J17?umak1Avg1&cocQ6CS&d%~0famFF#p=j&)NC4eDhKjCb&d6rWcw4-? z=ixIVE-8EXL_MC2Eg3)uoFR9{3G8lif=-`qOH|`IX3tg0XzJ?3c^ScuVBE7ENaksJ>J46;Nql@6oV{P*D z1a#(uucu8Q&$B$OeozlcfPh&S;vtC~hyQc-HOg_GD4w#Y%Va}n$MGCxo@L9NwxytS zY~12lqK}L?Y*hh_o=|;3l~+(vR}uK__qNj($KQhJI9C zlq0^~zu%6q5Q#K@&Wn9OuQ13&XN*N+i z`e+Iu#qUzejzu4-8S@36o3rpJMhWy^WJA$KQU~BSd9pF?1_|q! zC@-b2Z`Q+baZXk%oxV-rF(CuYUv95_O*ay>U$^TJwj!tb+eu${_%btnN`kniIiq8b zLKiOo5d97Mw+%?>J^4`KdKqE@Ntu^-7=6djI^l5&yx&h=PCFKuIC~ie0`Gsrkntc{ zK*NE!&AzRysnGVR{Uqy*T5Z1G0Sav`m22wM+i#5k6PgA$+l%X9ueC$j_xqz=|6Hyu zTRC3;2PSvOj9U%iWFFJ-Z=Z4~{4UB)r$O^S6t01E#n!Y!xJ^f=OD(P3nda&$Ue`%e z{*=eum?(S>$^C>4C$Lkb@h(uPQ7HC~i=GrcgGdta?{Bmc$wxZeE7gI!sWD`F+nodE9Aa0jmG(sI&8Jtx!ia|+ddo_dN;-@6iRE(`_caS z@YR{C_9cZkQM)TzjAg|8m*ZT=h?gDrI6O>o((9)fv77VijUvhCf?-|gzz32e;z+)I z0+C!{m&^=b_MdFLgzSeCbI8T2mUp6O8uiOHP2i*N0{vV5U3!U1Z~FJez_mbuU49#s z5@Qw2UhrP7h(oOfDfNdbMy%$%IzfC@i!m6^WFsc`)&pH}=(m>x#edkyd_|D-CkC8J0%;djG2%8wr}DcI@f!(N`d!Q=2p$&k0> zveQiAFY*j_#kCT>#CJzA{jmG;C977};V7clkGXe>eIe?Sx4$i?EJ=-3xFwTJg4JES zb5pk_t8l-fSK$^jp(S0vE_@{`Nd)BY*5+ zir@{h>v_(8q&U4EDyO1{hh?H-#!o#qP7bCL6DOWNFbef0H~ZL8o_%i3-TbY5)b0#7 zi*u( zDMtUkYU_wFf6G|s+5(KkeM*#5^(UKNTW{;rU!@U@-EP18$U;1p0q8+k5B+~sjWsKr zc{XkzNpm-sGZr70P##A7L{={peg3uv>6|)D3E5~=kj#@>oRt*I&B*Yo8>ZD2v4YkPg#og-2`#%M-q5NIG( zVR_2^9>htpQ$o(yQcAWQL3iJeI`E}iaZG3-b-P>0Q@UeFw~iS#{2+43J-bnUF*N7o z@sHwpWzm9Q3H3*ltbpUrUVR9~ii_`;M!@J-ifDzpDU0sUS|vx-4&I9i(oN;KS3f=w zx905G8HcOgEr!4F6Tk`7DVxGQ`^TfF8+j?M^ll)pCpe-g5Y9VVOuSS&JclY4bS8~K zZ&pz++bx{aeGM~?eOPEw+(D`{sPMIBuf1x%5Yj( zG%49Dks%FB-o-fd4)f1vzvaZ7v_TtBe{J2-9=DJrRJ(Ionc8&z8@5SwsSwOY&Pw)9 z4;>Bbxn@55NH;R#5gRG}A=Q7>9=J+k|L|cT0`@Co5^jk9b(m#yj+*df;UQgivcfTm z{@L+4@0u+gegLoCEh$Q9MYR$I_BE}OI@BE-s2Z6w3BS@y=wIVgDM$B(O9i$DOKOvF zQ@j>+up@4Lc~>8p-quN6lr$>83$({P3>^&W@ONN>0a!V8*JG0(S@Lf%(UXNoQvB&(_*2A2LI++)gw|LDu0H{+ zax>Ua*k`LnVAHEOjea1EDl($$iOes9VQ6UBdr;~V`faMY2*?ZM~x>r6OkosxY+6}?;e>^`0Co}yiwb>8I2h0ca%eb9?;p_^+)Da}O zQxxST1Zy2AkyjP(%i#DxxN87fn7c^!<|-N0tv1`r&n`)hWaabPavm@z1ZaCTE4Ed- zP@X}SNFZxBFh3}LASzY|jrZ>r-SOW9qXPT-94I*lc2oVWX59|Wy1j@;Y4Xld+~d*o z==0|qOSiN$zqbi!=LT+lRehX@o7JBE9j83E2U;cC0sP%M(yESa2_B-B= z%p{t1i0e;G$JiBIStv_%Ye_qO4Q`)uyqx~<_a8{1X^^V&9y^@%J)VT&B<1-l2$ zn_m5;{cpnhto+dk)&;pZ=Zjv za(+GFqYjY&l;W5_WxmR?(+NRqmHtWv!jpjTjq(->uFd^`W#QmltTNNn=49m5R%XW8 zKBp?f=jrT-{`JOf9bog$ai~srfbh+qDPA^XCtWHXh9EFEm6<5t)9$Rc4@*ubPt7Rq z1Q83XfVPW5cFC1Fqz7{+%Jxnu$T$EXmLp)4wU*tYbF(lL<%tL)$(uh7l6dsTY zT!iewyMXWhhixsEKJCR}KHs(V%jCgi)50)jlkMe$=1rdUahRC|dy_jqS7~*j3)KK* z2`Eh(ml`&k5<^P$!`fbxJ$aY#b^Q>f_bk8PAmQrD^a(uS4qy)&pMz=Dg62xE#KTsh z>U(@THGiDv>5)UmG&019vB6>8R`&#EQPZS^R)c)1aZ9&zxnL?_?=ECpAW855?ravr zJc6GHsXZx)2#rg6lzN`$kaH)Qk?DRGFN71`wG}$)78ike0&gKZ-~+nQuA*JANjH-Gfa2(uPv4M)1)ek_ygD;B!O`f+p3#16Ea<^L|dyI43X1^QN_b^UP(-Slx=x z8;n~5u(Qx_5#JG&68o{MLUtC2uDJvF&XXv)7#x>8-W=fizFYMK1DYUEWd(qI1u{%+zy)2b z82vG{G1DBxz7$vG)NeawmyvJrCj`5dlu|ULqyyqmkXxmK(mO!AUl1I9DNNQ7?p0ge z5*>P;#W>G%Z{pQBt6U;%M@vVp+w?9u)f7JWU$8Y_Ht9j-YL5(pM~wdbF;o_Fdv(G9 zn4S2(RMWrSldzqrS|iYe?CX95{MsmFLsbCTyH~6>UhQ_c^IA7R>gExmVXFz)x!2>G z@Vh@jzg54-EqfWnbpZ185&1QrKzQK!u7YDj+VVI1F56|aE^c7i4gFta=2~*eU{{@T zTQlT#@XxzthKaye1;Yi@3*CR~gE^?3=2F2JSY=Z*l9bv&OIy5KhUTx~+3s(Y=|d*# zR%v&kv1vd!$mqwB9)UO;lTFLedms<4EXebMH=7ee)_J;pDarUHbIE20Z$D#X4Gv)w zso*3iqog5@KE)jK!u>9~O=hhRLwNk5e+q2-zo1%IzDp(*w?p^%fiS3(Lbl}u-b=f&MvgsGtpAHL|3$*Rq3s<(8-G5Q` zBx5l1Cev{X+x5VQ%-b8l$EpO7&7^T&etgRJ;r2t%>8WM-zrF}l0u~&{;;%&*tC@Bt zfqYmTsy>*2+Vs3FML$Ld#1+vGMk|Y+J^lCO)S@770p}t93R&FWT$^J<>PY*qZ;tZK zRChG30CnAmLnVJe$E^=wKgozt1yNNC)d1IgtmVe)cdJcOf%#N`vQ3KnlGfhbL`Wo& z{mto*jygd@M zjD9#dziDZBUNu>8BCQO+?d?eWuQ)@)3-;#nVV3@Xz`<}I&}e62#1nO-)xVN{Ud>}} z8aKjOYy6J*y%nE3`iZ|I12y-8T}HAAzqVF!M=BuSA{9)1=&#AA9=IV2XU$x&3r-Te z2bFlW7AXhuHB|n%-LLB!@Wk;PsPy1KW!wei-hS+KQc8aKA7DTIU>q#;%J~vyT?T^D z)PXjiOlEJ&?+n!sL9b@hD26R@-=&jpUk+W73UU$7*)wz`k$Gt3hfbN? zV=FPu!VR9+O>#`j_B#TOYZDqYb`8*G_Xj-gR+W0q9Z(CMzw2femdQ!u&-6505|i&w zKw~=!y-lS8tz;29#x&2XCFS=$HLxpn=J1Z?kL)rx%YTIkpM~CqjP9#zBY8PCTs`tu z9Qf!wVf&%7Htb&6{#>@P3}jPv0?tVUe+)_x8SlNp{OsnN$at}T6?zix@oGS;$S&Sa zDp37U=&g6J?Nis8KWbHv4XaoW^);r?4E=Ftz}eW$`!FD~@JT8J0)?zt8w zwNC15G23*Qn%P$hKDbn?qzpQP@9Jy(C_1vcP2X9Q3HXE9|s}Tc87pt8owkz`! zA_~wOm|Cdc@PcEd-lgxyTAg40e8!v={e;A}B(xDIX(^t7t8WHeDjmZznW&yhLd?4I zu4S0$avIWQtyLuuJg*o{F&iF|l(l0p<1YCpwn0KueM`@eWiU0**qEFlZ#~g;tb*HE zcZFweY48=#yp)pG+ynd(lDf>)MVo%oDlcHr!(?uhM#Xe%LPe-cYrnA{c0Vt!{-bhL5HV2r%tiQY z;}!FXz(#{6Jnz#~^E39lM+8>Ll}Kw}xB0z$bc(HAZ=ol@$>b>|EZB*}QK}#T5@WW3 zsYdK5lxoR8=AhUxBWZK#m}e6SIsUQk;X?5OJn*1Jl$*kkI{ z5o+xMh!hw$8FtYvGaN`rf6pjr!L!=*HQ5KQ5C&x=3+l8n6{rFMm7nP^!uI?Uz7iBh z2?Fo2R0%#!#IPLGN)MA|;O4r?%BM?CV~9O3`l%n;T>mAS)GuQ~88gn9z(26g4GP;W zLKa>-0dw+P)Qo)a)}KOExXGqYH9=Yu;4<729Hl`U}x+&Lf&lhv0Txih2@WO|B-~D-7TO3V1b?hSXB% z!%3q73h1d95qa?tVJNM%gD`tTsP_b)ir+V)7Ms-7F+p1s`Iq&&Evk=KLRWR)rguE+ zT%fIv+-AKte?4ZE^Gc{9RH5{CY06-SMaK;71#NxgPHUBX)&7-?+uV-Yj@r)X4iT-1 zmOvBHR&iEEZf#uSz20nP&h6fgDcW7yy2u?PYkgN&tuj|~PYLa)_tS1v^HvXEVRbvN zqi<)n{G`3%X1Sv+G^oN(rH8TBABeRu!~;o(+GN+Wslf;NkaegJ-;m62jA(?Na8BVm z+8C3u9-Uw%E$)ncudqc)P1!MNd*=mOP~`gfjn4>2vMk+LJ7+)Q(qyp5a$UphnjI2~sNK4t? z@r1T3@_@CH?bsmK^ zt5&Tf-u9s#jA1ihz8>P@Y z*V2whZnW01Rm@+7S%*<_R)i{-CI==Bc3O1m(9T9~vewI2=vQPU2POxmFp{{P(Vg55 zZl@wmk#;O{L*r)eRc4Ag$-SK_om#Xr?=@Q2cq{s@uTml=g?5@n>NgsUuLxglm7Lf4 z0gur8XY@yc;y*+Vt$&6b8|ZrL{}~$Mt@zK7V|>j&M2?mJ5II!-8FI{}qW{mYOMVkD zwGRB|8_G5vS7?!utF1R~QGBe_on(~k-x)>wN{f$NWxXMPwX+g*WoZ()HYS4$duK3B zhjxo|Hd4u2BVVy!iIEiDnLzWPjnWR$5FBrgEe8>~GJa*_AKt6YlyZ`sIs<4oImaRu z8#m6aHecnQtesNcd64G$Ud3CvO4%w&uk#%3`g@K!EbX7sAMFbN4E@;h577_be~27% zLuvXy!4g_L{11_1=RZUa%YTR*X8#a5w*EupKy%EMNS$hto2|EOS^0RiV{%dFKH6#8 z<;X4Z`>hS~S2(XWN`BS}!d_|bXu-6LoLiB)@k-YEwi@{>`&S1h*LEJFc}E(=Z;H2! zSF<*>)wWf)HS}KLyTWX>c5-^>4w_4(PUDu=KfG5~t+we*?{K4iqJ>1NHg1|*MNDRP zs?ttIYBcKXk@mX(63}n_BYX$-f5yy?Q2l4v$_eZKA#!Z`C&&>4+*}5DQ{}hb_OO9Ru?MT>mk&H-kklM1lkl$ zic9wT&C%LDXuZFFbYYMM&cF>?H#3bVFPclE7dFB7}b4}}Ngl@dC@D@jhX3-g# zOi(IRu-9%~k1&Wo6t5V+Lx|w)<|xvJXeyoB$q>c%&4{(aLE1rDz28DB3RpSFeVNAc zQ?_2eMeXql$J<361Ab8`$^YWh$H1|!a779KO>k)wAFlbo_%H;k``K&rsT$UJqev8# zCdG7!?2@_gRsX)h74a%91cCoOQ?Cqp18dz@4lK;OAaHaDX%$71( z$AFRlZ$HodK7~Q^CR@+osheB15emYskxgZ0_OpzGZ6@^81T-SgXX$GEIbP8`99wU#% zl1#yU5~X-&M!TvwdlJD5lOcN0oR_u{rF}&Ll^J)$jN$I^AAm5bt-to0?L)+9RYYkh zzzb6N{Bkn0^J{QtW9p zNMBv0WmNb!eguy9xCP&NcZPp4bL2g^-GVw=Rg0gsX!m$yN8FVtDhe{*u^!wecVdJK z$mM?vV$Zjx-vQyY5d=hDX+F@hZFXpZiI~pN?Eao(b!AE@prB8-m^C38aX@X{TjrAa zvvDAlKe%|hgllyI2gB+P@6MH(1KCRov!)$1`~#Uw{wEc(=tadTds;xr48fI<(ion~o9iuz@|JdbU54{BXI?{Afg` zVak6!VrZK=e?{)GRfA&RykiCqk>V!sGIGr9>9E+$WtgR z9mb7lsZQv6BKyI2d>wP~Lw}X&-9nOg zWARjNWvFLE#pw8t;p$hFZ3kfzYpABOgz2i+ss#oAev1mh_=_iTG$x_1XTGvh z(SuycGPMgU3yEV+XPXH!qO+pw>101{9Sm>sn6c+O*QX&m;LzVwe|;tJpqofP>srV& z`p{wA4}+UtUS4@x&Gk^}fG4uC4r=yizdnQd)2cePHc4 z)h%s#+sOV*{GjUsU~B7nRoK#W9nS9?^cYKcoqoOdm9&7Or@b?A^t1EB#X|&v%wa4c zY>BU}HB~x`-2OUhC_7CLT|LRyHYovMbO=Bi5YjN+dW^KtfFlBvMfqN6rsF7nFQE>W z-HqNe@S(7uS$;oZdz0B`{Xtoseo3+L1WC&2U3H-IJpZT5x}Lq;HTy6zmKlKE>w98( zE(-ED$}`(FSnx`0zq95GBZRT2ExFd#D|LFntdG<4!CY>uN-d0tkD^=fKesFQI^HU@ z?3r059N1>aYnw+1`?eny4G7mDnf#(|HKyD(94Q{Sb8i_5Shqxc_kh%;#2$35eiT(H zSS&ihDf;x<+l*5a%65I!Gv;M0d(fksLUrjZ1M^V`bBmqCGsWx9eOO;myfnfhTtH-57Ud zDEzTHvEKvF)=X!9{fIQySk4Mr?EdCY0B4w|?<+XpR`itCl};KVO^YX7*ZLfQhr8Gc zUTJGC*uz>GPXs0&>|*lWcbbgmUL?O%-AEyPAOpSU$FqL!q>vF?AA7B!y(z$-8RYZM zZmZor725UqaQ80X1tzMx?c5EG&YR#y zw(!~n2#)2Z_SV>N4abuo)H&UPzmB!ZiljG%VK;smbmCmiB&^GXmIf)C-?4*35Eo|U zu@1-lLq4BKnG>ash-*v1mv#gbib8rE6wNrq)h<}~9cH1= zuTu1I!p)^Pwp(fgL*YuhIM9*M(2w^GcvwDnGhV1Sxl2L8s^#qHAn%qSFxeVvO3m zg*ut`+u*j!SsOR~N85*P;VVjZ@N7J(*cKeWJFVX!zQTDB9q3X}&QI1;m-7sx)yf!= z95|tHX7>n)#`}-GHEXd%2q4o@jk&;z5R?Zm0mV~yVw8{3XcjBrHV8mJF(g#EuYoSAiY)L(^lH3BGN)Cy%gFTs>mZacmGrJra@F^4r`s zr@4PrfR`y=(B|3P#19wB2Ky6Dzg*s7fxi5y?ndkVd(A}KS*M(;q0^b0GlbKmrs?BDj4ct@z@h*vG zUGSYp%B|fj)!_i$B6G_PTjnbr?w?_~0S{sX|4L4WXijm@$?G*TH}CjinOiXW*_wOx zp#@%aNrueYjBe+$Yz5Y<7~t;e*$7_cmWX-N`KZBIne628<1vkc^Itszb2kUd>FG;R z(;4^V-C9@kj|pRu(r~PG`}n2b^xlH{>8NQJLQvrGFu@airG~t%`8pOVK}5WmHn_lu z%NHqJ^X5mmIBC4oh>s(-6%Jvhe3XYu|{kliDg)IoJAy0D_EqCIh zfn6EB4-SxAvm>Y=`2PM4W%V$^DOa13YXqO7P-rmzD2sL~0v>x`tUtO`-`)Qk0!Ss^ zScqgI4)a#+8{R!#jM;ZG#Ur&QFeX0LE_RI%1DQNJC{nyYCCP|_p=dkQ<i%+7pvc4v0yGxvV(I|E&v1F_MMzqSrMOooXT zg7o-AcMMxE<6E$c`MvS?1C!-p+e$L6r1`h3%%G| z{rHk+CTTCb!0~J5 zjS-iV8^70ITChURW$Vk-`#6;`;`K8)ElS%moJ>(%r6`E06)biOntrdd*_bWj_A|`z zBb)dERug9&wKnmVfLb;-U`>e3$G(rr(ViW#Hx!=;P?Ab>XtS zmqsansDr~Bg)ZWkmX}3}%AXY@871vT68`O~;6xv+J0IzvHZ3j)@J2tfrUAGty zE^BiznWp%nG|#d`vq$KB58Tj786+t9mAFOpl7W zUko^0O|mI=D@UN!`1VbVbN-ra?~G`a1dPd}cZPFBlUk_yg+vR;xG}p;l`@WcwDcF_ z+xl2+94P@%Tom&7J`5Pt2bW(qZJY&b75lY*FlHzV1N7U4pC&VcOeH0LC|lupjAl%k z=lY5_%>Vce(`b8IVJm7halQeM|3(XztINQ!c)ekhSHZn;S{|awVIIbx82q)@B5>`= zawCNl17^s;oouMN_Ohb+4A41&l`~$C&>wr44fR3Z;Ncy7mC8M{?y>K6wYnI}ILGHGxA62IOqXTKXy9AU z;5+9p$dFB_cdf0-tj#tRT|E5-;)B~bgI%0k7HvfWMduc>?aionjm$A(GJN46JCYYL zz`hsF@HUC|4VDm#Wp=jZieiv&0e_qw@@j8yC@4IrFL_d`bK7y>`C3SbR9DOO{+D+R zH;i3>KL4-kyuwXVwN~Jj!Qap28&j3oek7g9uL2~iL$N^tXNYpw{u;fbb)md!Hpz=EZ?8F=DN7 zN2^@C8fstGIg7srY*y7XI*R#;om$zs6T#E^-&|Y+Hf1!r+pNBk8ucj!xLWr0j2HDs zQY9+{WXcCzoipm*gYr==L6t`tY7)2sp&bj-v9m3tn5hM9CT$qpXfu-uz?E+do~;{O zR(9Tpth_FdN^{kr8?zvPxl2r|K2!F5x{i4A0b7#uD}968`jMlPBB2|PxeGgAc$9&r zdt9;rr!u7|N&43_pDtEfmJZ3mu`%#66U0%nNFh$GO^?96j(*f zg!uC%>u&zR!Q5mK%kkK+lSwob-z&H@5R^^6Z^c!;U{7wr&^?;2KsmU$Ls{bx5(rn(Toj{JLQmnAL{+eEp z*7r+JF$W8MQWZL94te4R!QPYTB!+gjZiZiDHI8(KAWsiO67m|F@6ge)|B+H`GwmQq zd4e4?2X0l#M3z`c^cRf@IzJT`A=%&CuPL$qoh{MFik+4y;+Uu*4m@njH_l~-wHfap z(wVgA)>)@ivIkFjVYm_6xp{J$iK;^>Lx-f>9^vCqNtvBg^2Cg!Av z5=x8eX2F*YV+j$~Z!XWrB+7iTLNw%g7Js5otq=WEdq+YowX3p_usmotCHgt`W}Ckx z8XM08e`zuje#+s52$z)OM1w6bJ!1Y>cvGr`gfhZvu>?z~7T(-nDJs|ZC*@?iCdc}x z8WE($MRL%%(o7=Z^F@sQw0g?36T%;q@KXhNpaRDW*N&h2MHSIn(Hu(S>J_*52=L0k z7$8hKP;9V~w0e*mj-QAT{bH9W|4B%rpIqj@<7u$P|DG4STo#L4*_${gp1$#`7v5a(!+QEOil)z0zcP@--sV}QST1x zV;WtuEZ6;DXmi7iXw?67qY$&H3pEQGle)S&*<1f&+MD-eu}b(6gs&j)oIa4XApPV; ztxIB(J~L8%PCwX=47nqzr_~bkp~=mJVIE5T_z}6D^{!IG9spJ>h{1lp{(&_udugY~ zn$qv>r-v%TEOvUwPFOf;d2Y3Ah*XURXnb;zhL`Mq z`qZ<$K4<6M4^=k(S;>?8-+Ki~G=YMyNC+J${RL;^e=E70s@PIJt0I*lVdJVzn{HK_ z^@UBHKTa`WX*Lo<2hdm0U2VnRU+N-nKxph;Z@H)I zYrN1;gntgCOZb1^!qb?yC!PL%w4+79wHD9*Wq<5Ek+5NSZ_;a5RN|U{wj~gG>wB

D6KzfA-t`e7zh1~@{rb|MO=WeFnUN3v16Nosum~{I;ij{mNIqJoz z{su~hK4y5N)kDVx9zfuYt=>zLuMs`3ZKXwyPU{wdy2&n&{-a#k#*}{$^t%~t%DZYS zz3*;I!ym|>a(Txk`ZrbF3)$?eItRY3-Z<^g^ZvB^PTZiM-E|RO;lVD2=A= zjF#L%msb*tiBZ?Zii*F&kMWpT@evYMqC}~Lgh|4t$;UThy^4ACL`kuAMEkleKo(-JwMnBLa2iEOzC9&ta3yw_1IRo$M$`%hLVYhSXH-+l4hECJNg z7j4`G^E%550{qQrNQ>+?m5RW4mESN-#1YI}4;1*f%v)u8UP=UMK7LL$ zJ)<=%0Vox}+a2~qh7ZfXdw@4Es=s;Pk1Hm_MeyqolTHp^?H$oTs`?H$LxJq&FycIph; zt-<`Sr|Vgi^Ev|`sAKgHDI01*dW?FY;WQw%eDW;XEatA_()iwE_$VhJ!Ciyz4I zfk&=_>Tj}@Um7(9x17^O1F>gWruXf4;G&cNG+?@Zq&DqHs^nqnL#Gdp>_Xc#Zu1Rf%ZIe>C}d?H7D z#xy9vGq{9^I@=CEmlby|KD$SF3qr0%e_MCZWvmH45+*6#Ompn2vjUO?b(2 z61g)#Ym)9~{)D0kyM(%&K*EdOii|Iu+dg{rt}k);c>53{R}XzkUtG+tDD}JdBw!7GEp<d+b#chd07t34dGFDP9ZyH9 z?=%-}E2Q@YQ{g3vgAJo6p-o03yBicQp?taa>Z!X7@?g5tQ}txe76}+t(L-pTq;s zME5M|a!zC-W%^Ba^#vcnH7R$LsAB_m_Z~X{feCx9Obh)97b1-_M+-16i_rK62E8K^ zt^UEEb@fq5jvOfR@#LCX8op2(<$E9+V=gc5;T$^(9~15-ue=&Z$b2%6!~2p0KjDNb zSZG!!wY)f!ZjrNe+Y|+va-(n6A>6XJ73f=vBHrgP;f)mG4n@vEN%iQR+v;=vPHk);hJf;ge&Qk&fS&|Q9I}gl0cs0ETp~@dSaSMt#vjU7THuGaK?^_d8)rSm&W#@}FBLY9^(lA7P2&>id<39mI z=w5M@ZxVkjW>mh1v+F$cRmRfdze_eayS}{{_f44>{fq7KxG@)WM2W1a{5mr@S4wg9 zo6Jp`SQ(ad#nPOaQ?sztEFgc;QpmknffiKmM|# zt&(;JhJq&EI)V=DR3$TCFZ^bLRN5_F60}>h(P}|Rk(K!l&6Oi9<81+<+_ z6LWy#K8^-J;8WMkqF_f>q+W zBXxqY6vYz4twL1_hQ1`Y(k3cBUgR5FRTdP+BJ$Rak8i7VwQv=zXHA%j4ttfx)_r8) ztF3>9PzTw+9ZpfTNx6Ie{Uww>ct3`9~-`W;Ic}Jv_g5*n!Z*4*o{?Hk)JW`s`Sn%}7>!JQUe9s3Z^D;xE$5A=l^M2MlnUbP6ki0?PVc>?Yg%Y(sbj>k(!bwz zpCmO+vH|5P?k!|U+?U+GT>K#1-pD?-&4EljmKF+Z(%8N7!Cy=y=%#2?`liJNJtkQ)=bPliS`*{;3kC7%s`x7MkdtW9l;A=SD;< z?IW~?-N;5P{kR;09upx|L8Q5j@Lh-&>G{~+lsnm@xlu8R?m=@KO^I8Ez@%Ziz>gg@ znuUlV^y;|4>Wwo@@<>T0gH4DxA!2wI9k{8_sVYz07NUkFLRnRk;R70ug`%18$v?Q_ z+;qcg;dJKN%3(4JQzM-I=QU*cimB093;=Z;-jNcCUhc82bTDZOW$NpYSUEL|EUq*U znOB5oE3keSZx*Gy|PS!mSQ!dh!cj8_Y}p zGkVx}Fm|uv#uauzQ4S);5KOJs_dvZ;B7F|*#VPGJxvbIDDn0Z9bh=}z$au5WVZln4 zu%ceS>UEA3_)mnJ6gxTPg21_XJ@vJ-aQ_Que(SjbQ|8m9?eB(tOMl{o9@WQ-vj~nG z+Fh-(0>%}N&8tccMK1yK|)3KYvP9QuKwYt>b z3Wc3}spPTxPRhkU^6>=Kd)m(tP6G7hj`I6R;p?VdU>!DbH19kQSr{wwDqLdGP!hrM zd@=-I7J_H1OPPEXyj26+F9gPymFQ6;&!q#D)tze*so-gOvhwz66Hz(ki zz8C#Aa}@omlG)ArtaXuYEHg-VV|}G#m4@kGj&GQj!$)(IyuKS)lCe$R^!x+>!?;RM z>rp5VXiA@&{n6l^GqI+^ zzq{~5zszYI*9k(bzB%vmx5OtfN~##>BX8qq8+_G9+%lxzOUnZYIvN2aC`~lW3Uf=nQHJ&5J6n*B7CgUyLx3*tw`>&$pV7#Q*Uiu+uaHOk{&8 zrnFOct%wbox=VLp4bmN8jolcWr@JH(k^}U7C(H`Fj19(&aYuF}vP(G2QQ2Xa3xlze zG*XeC!WyQ#%bk&Y8~EuDpd?rRHVQD=;v|+9-(rn#1`iFA+kbfqQemxRyj25^>bfcZ zD_^8MLJJ;${bQR(A*H7MOD;}K7ehRU}dcARq2TZCAvMDxt!kCkPfaZXQNDYC8t^(| z{sFp^Am+1epwj&N%P)oFktshO2k8m@-_5m|+qoI7-q(aj&neCGihj>de8JRm+NLS) zDXehc%JBk;Kcs}dAQ`r|Y=1Hn1K7WNqKKS$*TmHw1h^b%XuW_WgyMC~egFl;Ry7bK zYF5Ktbjb!FR*eErf7Q|ntRk}dv)Aj|v-zdd4KYg?KAQUkH49&`;ks||VJ6b8>m(sj z@X>4yz%Giqz!N?zqE?9{7J(b{B;HSxFJth9OB{xHiq#KT;w=9UOo8~h5?DtrM=Ycs;@KzhgDQ&|B#;g%T(z_#W6Z(d}K|8hr(Xg4)Wd0X{o zT}U?n>a>_H*|h>XGvEuGyn71(c2BQ+gUQG0V8$S$KGI~o36m0xT8H0$VEN>Lzr_jQ z>%g+IQvn=DDqL`L7%KF5{3AK(anzHUq#}QD$Sa;MUZ%6-n{vN0CC#T-E+uo#_s=1W0_=!aV^2+c?_$z7gMDJHp7|kuY zj#4UY_tugaL8_prb|nrs422t_l_tILVGrn$`wDJ8{mQK|UB7QA@R=`9$5FOcKJCa@ z>4@ppm%4#&XKW{D2SZucv_YocEUC)rZ)T-o8A+CBpK-{2d2x?Cj!TK>>CTO(`OH7Z z{C)sqzC>w#D*RACCaN-iys~(QVe>MhZQI|FixUs~Sv#NLbxgMg@pWERR zvdn7keQ!&BmJFVn`0)`OyQ&DAFHVv>wSTXTKuSq=mbKlsHu^sK^ei$lQjA@bDdq}U zN@0sLd-HW9st#3g);CJJIDwo2~3%HkQ+Nv}KaFSIE0umqqR~2cmYHNA*{P z{lKnA1G)*HAJ?cm5MC-|#b_GbWJ`6}5;dele;iX2f@WWfU582#PkUrY8q=t2lEq4v zyV98kt$c5FwWzo^5*(%t)Nwhg`|565FG5w> zDQIuox;;2O=lEKs73%EV6kr#B9Q5ZH)R`Ul^|J1W)m!rScO@l)2JXXE5U@M3Hy|b4 zXT@3GW`AK`$^P9m@$B!7W%a-soB#^5F2UX9V?E&tRUAODtLvQ#etKv`zzXblnQ>OP_; zJW%A^Ufp2_a9N4`&Sv({1^V_vBjQ-Ui3i%y*%*N2_C-pDn!u|<{ z`+%Zf#~cYzlXXk0>%_8>qIY&CeGL45=VN9MC9lj^@3kGu(sy;&Mfh*7)H|FP6H|&` zyQv!{;4NkP-p|b^8q-VNG>7N}1@o#Z>)3~KNRm)c5{~mfYr)7w~AdR|JH}Ma+Y#x&L)AJeL90|?T zY4<^OqhUp!*%?Lxla#a-NNy*_?yT`725n|4%l~KY_R5=i9cGaSn&yLk;W=v{%P%nP zE9uk~p}FME8cA-SVTzgf*U>{yFtCZm;MVQGhCZczQnU z?A9?tmaD|OFyfaCi?!p#g`{QNH_{nC&?Tn34R)4i$Rria{n(oO2}Gd0s@RK0$J+c;yD<8NGo-oQG@fUtK|y4-a7z-_SZd53cx2~{FAd+& z7_iI~Efm~ZTHIHH-OMzH=g=13CTqB*4Pdl{J;rx8B55blD=rrjV@BWlw`o%clis73 zUCx?mvl12&kOFkf=51%t4T7Wnw)AHIa{7e;Sh;wacahc~k6(&-uF}FLtb1yR46gNu zMKXed#C61R2XY{9)FF{0ZQ;ALT{JhjoL!E6l1QUnP(fZPS^b90Ht$*8X#V~;uy)_P zDq1kssfuoaLWfcZWxHWBL;aOJ77v{bzJRi3HrboDygwiL_~zTqtuxK{P@T*PaJ`$O z1DjlYzth$utb;p2Q+&YyP>un}N`U-g)}JOf$7Ar&s(9B)^P;d_rx($E0>09oqlJ25zC;+(N6x!9y7#^Jmn!Ti9 zUuH-XW=n}K-g@viZ{i!Egn(IOob|~#Gmx$?TDsgo*)jKOZHtbRzhn`uU~P+~{kUs7 zOue&R4h`Mzj<%%z0NWmK82?ax=BD!Ar+?c4ihyhM5cR%s)DHMjv&X~F*JX_}E*LRzge(Yh z>6NZ!+YbpQEJam={|nO~ShvGQT@3J{+J#E}@Z?}PAE9ysO0c0<^MJpiore38pRLD% z(SY^1yt|3&_)_Ir42p2tMAyrwv))*cs0+3?|dg0=1nHpH5q0#wVY zE)V-;uN=u}@#T6Do1OvJ6?@vCq_R8AoVnrRkojJ+M1wuE?{c08OPM>6XbVzo>Wm;E zR1*yw+W@cdU#9K{u3jwSr#o{LyBBhmpjt^ySi(6d3Mh{n2Jeg#-N~q2wn6}tax*xF z?o{)&_wCAa(a~mcAWWHAxI~I`u2K2n*a5{>EPWTj#Dv^hK46HF>`0@c7ZwG8*&ry8 zr10y21ZSQPt2Yo_7?l9X6$+dU13{W%2}?I~?iDEnNJ>sbM%E(y8fjF!dw6|1Djx1sf?%S6=2BjRi_MtZ#9KY;VE1!kx| zv&BXzfxn|~jpOU}!_NH&i*A55Q~$eclvEtt6g!6s0ZVyKVwS^nO(T+0cQ=%yxAZ|1b01(-n}j(fHNtjUqSEW- zuO{|dG3SL7#z}*W-GuP<_H1tj#=#N+cs1EQuVzdo(FUg(a{EEk+x5F3((l_!C4-;y zCC3i>Zk8Rl#2ejYw>0Ao2`c7P@_JA>;LK_(m~^`1YVC!NboUw70B$9MQf0g7gEyKU ztdhWM;thNhzNQoCT-F9czb*nPLVD|>s_o+#O|zdb%}9;A3Wm2k&qGT;&<%Kpv-~{6 z;xlhlHSHRBiHY-IkwfHSxM zKY;T;mrVx4x_iKqiR7kT^v)lG!~dqym9yZ^r4ZSHQNH5>;!Tk%7WO7LXa1e4DwZrm z6=(s0#jT0fYr%EHDJhEl7ud7oNoO**I+Y_nZ?$Fn+O}p?TDTyakxTCO@QdnwdYqxU z=G+AU!=<2dh&pKC{u66%Fic&sMGZ%ExVQ(;mDx_;;yBT_WHkuPYIm*NZ*PLZ*>#J9CH*6;7pQk4B9%1Q^ZL{2wnlv%lfmxYQiz(E$ih(>!r)CdIvC?1POfi%$!J%-fI=H%%nO(%bxqu0joKHL6z&7s76 ziVDBTAJHdkkP_oYbS-FBJ02~vD5c(Wbbs#lkoujyUH}bRyDt6QlL{a1^FKI~&0%=h z3IyH|n%<_XshoYI(kp447(Eomhamk8Lv%FhbVv$1)T7;X7|AvU4wt<&GStM--y!K( zcgrtUN^x|B$&wI600kA{Vfw@MSkizFt+CZ69Mm1}^Z-$KJVPb*b4XKuel$JRfXSP&E~Alt%PY4v@!h}+#x6W|X%Sc_Hl-PTQm({4IZW^T0t@FD46P@4SwIppxcdFbmnUJ^Z{6>+HD&VnVKmyd+#57ABaY z2v5JbC0s|a-uU2*c7_L_S7=7KAh=>Au5D|XQa!)M~M zbu{Z#xj~@LbYVW}ptaYe9HqQ`ZT0=-DA5iyNOjVN%>^253sfmveChI(lBms8WT-yu z0kSP*l$0$o^aCm$gVj_H{cT-a-h2?L^w=TWV2C@He7&o+PBL)HM@mj*)HJxbdjWF^ zN1K*Evm8?1a-O8C@?87$qhFuLW?Bnb$v=w2A~R}yiyca8zF5?FMI;n>?}sbbkxWtJ z6SJibFP~KFpG~w;Oo>)~YvC(?**T5vZwk)X-FIMGfy1vvJE45XL6yf#ZFkgZ^${)2 zSe^G-vHHmGO_k(t){_b%Rk^2$wM9s>e~0{#?ZB`tX1`1P#nA1&fFKK|RM+uOvA;Y@ zq5S9#!;Q9$SG~okhRCg~p8S2}#1`m{hboUBHAP8#c9XNGlwciPi0i5!nrXY1a_C0a z^x+hOlR9Z5#DS2QJ*^ir>-hyZFsko(lnY8bl@qr7RAcKVA~#^|Val5oxebGC?w73y zVxn5M*vfHfo%Ng4HSNreHd7H3n3bPp)_34fZ5j~nPa`g!Q zgxJd3M66C=W`2`N>x6zouN8c#Q&&ARet&r#Ige+UrK*b=YIPRs9B-lSbi~E<`pZT| zpGsEzuf1nrsL%Bz2iKQK{QeYqK4SfN(tMX!0AXFc%2 zj0>>Uy}hm1c?)RoJsYi0xBjxwn|vBW0S(LMRcsIoUBddCZ724_RiCy*an}ur;WI^> z*6?+0U!_OaB?@YF3mye$6Rq^Ljtz_W#BAAh5`DzwHkAJAy{@*pEZ}$iMdq1Z2_DAr z?N5!?Vkda7>P$FgkITyEAtjYLe<%%j>hH)!l&8_#3qbs>)0@T-#Nv}=#k#mq-*NG% zQIfBvXEdTTQrpiBx?}C`%<@*M=9J2?QU%)ZTZjJPSD$V(1=%-39YZl* z-?sZQUl7oyk$y3LaozOK+iK@^P-eiwVA&cS?TN|dq+;9P*9DG!8I!92N>|P!m;ZkI z?R!UqxcQ+13}g&5Fze{zwKS;jnDP#6? zQ6usyT`8>a!2r!%3g6(;>-{00SJ*EG=s|L37`+=fr~0;?lZt}vzy67cck<^g+E=D7 z)h;#`O+HJM_gzHZMQP7&U{;eVSB$}RyT1KgN{vu&q+J*Zi<@*A8#1aFLi0w|BPt?T5DKbm0FB;ozuhNVTb z+Ep%rQY?X6djGT>fxpQi-&LEh6*3z{`lDutEeQQ{L2Xci^T?h7X9cq+=XiipMK z?4ed~|1b0;3xQ&*blY%ge{|~xE)b#l&1vlLK*|W_5-Kkg(BX@PJk!)qvDFaD`LG+W zFdb7!7<#A8k7PH>-OW{?fZ!>^Wi= z|KQ_)5~(Gc|4?v#tg}oM>jA^dx)QT8&%4y??;>Xu zH_PCwu_JvoH=;?&0ii=Uc6_&$ItHfh3=!UG6&|2(T;9|{)fTAL8T|-siSfDDzQTmNXJk)?({hGvcZ!Qz+d2C#)W5ad627oZ5peL8SnPrC+(%SI^^49a{O! z6fC95ucXaCU)Jy%1a}-@2Q_sj78~Z<#;kp}TLo~Ar}#3mwBt>)GthgihJMd~U z=2AnOvFQV$El+KaSqQJ3JIq_p@iv;0aduua-0927HyNHE{u*G8v1vMLG-JCfiN#v^ z7|D367Jh+4Rty>q>U%-5nZsA$+pZPA+^qH7mwU8&g1EE9JaE!1 zVQRn4LHf5)J@-MwA1X@=ZnX7Xfaz?+F^Y^W^xAIRk4=s6p{>)*%QuY<`koX8`!8X8 zLQjr0_W;TelzGp#;Pur#V>Z)5#sF(OW(w#sW#&*q@!N5VkPb3*=j*RuTpC&RZuV6S zemV|63^V;UTH4Pmv~vs(bAErPvvR*&Lqa`EtN>e@LD1lpaNYxw2{Ho<*9AMKKO3HY zSGhcIXCfnpeQuD6Hms@0-s-n)ndg{493-}y<1V|B~= z%Up$~QR$Woyr8M^(~}FTLY{{u)8p^^#Z`b>+QlHVSNq;I!2dPg7aLL$q-Ux4q{)%$;CB;LHD}U4=V;hZ0ez8joCT)MIU7EO8U?r)tl4{z1TCvM=AE<>tY(MZ_7m&R+pCYF>b2&W1xW_GF&Wfw91hf^r zOi)!7*$`6l73N-;YP}B5t>I_-U4?j$k6n@_r1-Lmyv(+7zRgDhgJBHjMlN>hm&e6smr z)p76iaOhE1#TDtfw#3R|#M|EnuQ;7J`n)b2>Mon6n}~jGoOsN)yP;kbp>VfphhD`& zLUlSv{C3WDVvbsGmMHn5G$q2aDKD9WIkJewfmEgg<{SZ@?5}(17H|+!uPqxo+r(HM z8nZz@#Copttq7)<{Y7W+hZmw9WMbYe^RSk|O&ce|$8%h2`&jzQwU31KTw8Z)ia@}f zb9Kg4+_-S%ts2?~I#aF!KqiZ*uODikR*qHE5{B_)BH{SEPb>h`+DG@{iQc@dV}xe6 zG~LCJ@`s~|-p@2ED?0C`{At=l*RFm~YYLoDn&T~Z#T zS|$Th4au{omjvQe)6b;$qz*bAz&FIi>n|kz(W(L8tJbCCuDt9~-#HP~{jr{Nw^mCG z&X%PP42nkgOoi_Yl{--qRe(BI7*c?+W`SZ1BngD)+epN;JU z+$kA$1N&4^tTua63x3&RxNN}1=q)mr*-nj%eQ!W5pq@B z{?4OT>Sto?SNHIv|6oy3257O!Mbq|8onBbimrTubw!u{wDpfNCDn1o(#`|(uNT}(4 zMO`lFdwLXc-;TNcl#Abd-DFK`3x9t1&Wec?WBJGDe9~nH~6ZAtreCBST}EtxGmEaz&I`(ti+Y{Xm8yz^)O*} ze#X7uy1&j^(JIP0GH->rz2D-vbEpxfz{44px1MQVJ!15-v4(aDJQ&{_OB7{AY+3b* zZy7k_C+dYbslN3>kLFK6l~Oat%9ELfpYa{Inh1z7HA96m^vd?t-tY&#epjng35)j{i7f}!g3Eekd*|lkYcRIW zQLwM~Wr4`B%=FcL_~(65 zP!4><{DYHlZA_Mz$|_=Tn7K$JnnKX~!(NeIF#awm51A?q1MCiG;x>eVe zqbyw$y}6id+%u30#&@}j%4xV(#0v8%)84#p-<-AjDn0rv(+8HS+%gUhElh zHmiPVenN9}VWGh(Z=WKm7+?Q>>#FkYi<@~Tk=oH25vsQ zZhFrwjy!5zG;WCLEyfo~S|(^IsZva(Jo_iHiPdVJ#A zL+;*`$?4BS6vJrtkrzU3O58&9Wc8)+j-xElA3m%&#di%~a(b!l1rY@Ry}DrUWzoGH!a!&6CLip^ZIn(!r6 znj|6Wb}+bvrBpqdtHXDRyOx|L`YUb*<(H6W(q38?u&+-$V4tUb5jubg~l7iv46?CF& zN!aD)=CQBIK*7bN58wTpGK%u4@YOK)DO=6c2wQE-$%l0z!($b5qW8%`l(550LY7gx z1pSa~j`2-{cAr(i0na2q*Gk!6TvBq(mug8b@C(aFAKo>1wEg$geey3UU&1awCrxy) z_C`*f%rz&9d>8rgv$qdpHf>hQ98j_V#5|N0!r(NKD-i&4qHiHu6OZq$J92fVJ0a%N>?j%MxZ zl)H$5g+C)L+nV;hN-5bspFO^8fY}tSpFXmG<2*ho_W*01&l7C3=5e>%hu7SyK=<1X z?M!<`Tkd;I8P}vRu%-pvPIF<%u;76y?}2BG<22zv+&GUU1thIIqg27L*93He z(zWhngU86UO@gSaVo&3-1ZfA%#|g2N+x}8ZNS) zB+*$gVJJyqHZvD+nm_{B>5sOGG6?l?N5cQPJ7opY=IuAI`BBcF(14Qd^203o>695< za|%g&ZoZVP?{Sgy7A1Kru2XzX8J8r+UM=8O{gOz_pkpup_+(cXI^~R=#|0CAxJiuu zL?N0%6|GTYZ^KUnZI^Qg94sqdlOoS|f?=u{-|imAsC0Bg8XdQQUi)=VTl&E!bKh}Z zV^L$?OWg81`S@Fs@WeNyW)(^AZI}NXamz7X4ST~}O#{AtxPQbXWa3cueoUd!Da_{W z|LM0fYf}wzKT2`}Nh7)C8H!P3CtdbR3b>nU%yMqDe0~Iz^hy2y?UPTD&cT*rxCPhH zAG1>y7))#OXY0=s23dF{+sD7 zw}95q;Gnm;q@k#^F0f*uC^%0{h$Vw?zNL@hW@)%xE~|?vWD!Zbz>hosfbIryS1F_gIS@vpZ&52H>98v8`0+miy8LlKm8x zW*->6_#L<4Z+eUKJNCFvbkvEX3YW)NGQ;o3tV8aijUfLYRbSy3<+trE-QC^YID|+u zbTv!1oS@$9|V-aEt` z6)CEWD3e=w@YvbeAUIN-J-3WsH0thkyug}tdt2~dT*&xX1fTSxFmiJuUM8{F=k~Vt zrjcUq+)~L$aMy>?gv=vVwHsmavk=EIN?|43y+ zuHAI&NJ&7r*$pp)KjFH>>}H$r*s0}r)JVR5re~HHyAS`9$qP$!RD~EM$^tcIO@CDQ2WmUc!}B7(i87VBO!V;#gU>9@QGh<#Zkv?uf?YS}UHnC<0E+lG zjSMKfG8IjK(JA^X>jd~4u{MZe|xyEf{_uJAlE;I-%Fz}Kyn{e@@$(+2^A zu#3yORU_Mwtr(iE>r1V+eLcj%_Y&8Qz0V`wBipEh{svdQM;uxnhUKqI9Y+5T%XY3B z?-;|8DyXPAP*H;o18v4#YOfn5)Lf8lvx6;;{(h@t|1yizR@0xzwyfSyPJFvvl2IMU~!v-(7y+Y`a9I0@;>#uYJ?VC9u&Z(_MO%5i<>{xM{pY0q@LSkd(OdUAXY` z4xbPIV$pxF2_v|RmsGNTCVvS1kNlZ0N1W0;{--?JsMs!wro(ud$|NLC8jjC{tDXzv ztfTbwznaoGjur}lw_xS{IN~=i6VaRxut7~wP`rA_HcNWAYuZV^WtZJ+1E^Gm=_CLLi<|O7l-!-bv=Km)V*NtfAfB!=dDe3FR zRg`+UpwuhAw^|^9$dqTA;YHCu(Fd9y=NW)qe|8wZh?n|5ynJQ&dWVYW;(sFwLPgZH z+x9|Z!fj!Q0cN%u96T=h&u?2sQGjs2F5IkzNkc}yA>!uWj`+XnKexPD{9kjru>8Y) zVW~#FrCj9p@%usZpD^>Kia2`WZaOYH?ZLcr}0!Pw?Z zU6@0wJ0TyXkobwurSCu@?7%>jayeMqTvAS}UdNQ9D~?fJpfG=aWh3UC1Q|_RX$VNiEkdm%G{9n_ zM2$xDwOG&-VFsLLH0QvE9;M!M)$S>o*kLg5rn?w@j*?9|Hrsin>9O3}7QwqwEs*e+b>1$ge)QS-yS)7@mDCUm5s`2_ z?HyN2mP35+rzQP}y)9YSPwupo+?u%(RzOi(bcntXSZW{}FJow$8PZN{BXh)7hCgp) z%Ga*=27)sm)!%q#Mgc9yQHJ8I=oOSst>G&Cz~wU4U5QtWefzSK>b-s5DS-H%D2i6@ zu$zoUj$_Si3n!pfY#b5F01Nmq{H%TNK?&}X&-l@En~d+)(j%ES)8CsFjoiOD6U)z0{?j-eG7`Gkai44QGX(E*T^-4xZcPemw3N?#!X<(DK}EjuihGjz&b zTcb^eX7im>D~(*<47A8NGyQ^f;XUQ5>)VSH79c{>RzQnr_sl4{eh~~xBwg$=$5Woy z;T0WMo(VB}L(a=;SFCIjf~JUgO>&)cqL36R*Frsnflx)t7ra~*xhBc-GZqx7s3W9P zpZI+Ms0%IB=%}r}`-z@vcEWWyms-l8K;4E!sTpBspz?BTG$o@yx`Pe*-W{{H2ci3a{uwsd^98+)d;yu2?p?Ds1M#HSB# zhc8B!w<^$d8lE z2a_mI2YNtzUBK%ZXRl&@I25S`T;KA>9qMxhs3l=)kV#5}6(yYhHF#th{yVVW+qX_$ z!xQSwN))KT&-hhI8M2aRl-n7^+u;E<*hnid<&X7uMG4lHm6(%*`85+ZH zll-vI(oe4!_TczoR3I_ye97q7nhcjx(WZnkNGY^E|BzqM_q44lsFvp0ffG-SWQ+Eh z7%TEWR_UTonkhKO6{wTJ7(WY!wa+yNv!xm6T_dK*9-DUl@;}zr#F9xEt&Vp@nlWYR zY0(ptaFTiJMr9B|d!dt-d%Kf>;d3LZQ#Gn9Csjtwl@Neg!e1G!{PhtZvhP8IbhCRC zEs@)q(D(v!K07^mOT(#+G1m+yl1~yvX4+D#vzlM~;9+ta`PJ1Sf;J8Cw?t`_TN&y+ zv-s70Bqu|)V>}SW{*+s*y>D2{$j}%lm{27Qu(o%`al9brO9A)k7@7HKz$wZg`{9z6 z+uM*5f4sPxYo(ue2ZvfQop$e1=_KSbD-r0F6P783+<>OhozfYX8{U0k^(sPJj)}yi zZ>TThUNNG2rSvWJt)}Q)+pXC(I*-O=hBNaeCvj(`QkFWgmu)o6Px|Q%5pPjMLJnE* zhS(&fZCW|@(H!1L2pxnR(QG`yQBjr+?x{JgUp`knXl{GUz`*pu0Z>03^Le<=Cae-p zR5yZKpkqSGWw%Ir&P7On7+?oQOCBcTp77PnJgcFvVBVzKb6>XB;fqlLNlo5{S$9SRa&su$JU5dIvx zmy`s(CT&S|6`FT|0dkyL>+i54WhGPX?a$a^$7Cy#Pir@UyLiTNG(nlcoeM*XUB`r+F&G{ylRA#_Kyx zHfJl=8ci*U8Ti=k@Y?A4)yvP-g>-Tknf+EbVwV&Oc-WC2-Kx-J>1$%|TLH>fk)Nvr zzri$UHkjSo^ExERxe6NdnTuXh(9sU71rSYe?JwKZH%86_(Uq}04s>`D^3*Hy%wE@r z!+H7W$1Cc59Y_oBVm0T`XK%Z#GW2-S_t96>^l3G;Il7RJYH3hN0PxjNauNmr5J{G< zY)qxHI9W&PLD-qBU1;G*?|v&YRhaSc62cFMZE6PdN&^)VU@=>=oiV)wM}%+SsIB6H zbWsy1b>aiZ?sM)GT-gS+Ur&-nc8!9RGD)g4-)eO{D`$9D`a%3JcO`w3+Sy07>|W5* zV_V9&EGlACDc}N;sf3CN(PKjW$0zuO*2Hd-gE7y7XuX0<{uamjKqe~j=E8y0`RWw4 zykGxr_#KFmMT&$$(elttrSZiO*^#=3_yGqRhr^e zqBGu7vQ5H6YVNehdYA|(e&$50W@YNGGp6!@sxtGZ(|Zg^ti>xf2im#*E?!b&Hoc`2 z-F-qv#UE%}f!kqFv~Nhih2$5|ogodaToPr&N1&4{7&7k3s9aJs+GBK8#YM-zw2Xl7EzcM%%t zj;dK~6U?SRbs-cjhwb$EAb_>Mh=a#v$l{XDM4oQJusv}M-sDTnK5c~sGG<9wfO=If z5#Yke?kSh9m05!GSIxgUp!&DmL%!_&^l=B@g7<<7paT@f$>qIxLOzOobQM-aOIo=V z`Z2~vy5i6cDu?q4v>YR(drQVxWqTbc%zy~UCHn9Lulk0r2weoHQWd*6I=N(yf&)V? z_DN^-?XVk$ujEd&FPhI$JeS( zaW-4Ts^;xMq-0yyzd?ZzlmVpygjTf6L0@F;*V$rRptx_#$>uQch~Toyixp+?tTXD+ zcK(bb4-X((slI=!gdg2B>`IyQ*{&*aPH>7WD3?16VwF%#zT zl8s1_n&EF;sM4+J%$^HgvKu`=;}(w>V%usa|C9y)_QQ?AJabE%PG_fP_6%?Chf5>y zVEj4m`}2(_u%ZL!<0#2`dJ_qF#++Wpr2gph^Dl*B6Sf_+X`v?k)q(C4^8Bvu6)Ogi zuqI;FLV_r>L`e$?{Ah`!&ki~BdFQPKLBnE7cE=>xSB?piVcce}&sZ{lbAhxP9 zGe!`d$N|*Y#D=t7N#nm7wsK80i*Ej8(X-CNEWn{KJbOzg&cJni;s9C%F4F1t*pNuZ z8#%~Wrli&XJd`Ei_$Y)tGBzeU0CXbfOd4=#MM02u3hsCVSyu-3C~Vhru^^pw zX(0e!XQ$#4Y23Q&Z^QA!gj+VajPD~MakA^@{*Ch2vZMNSMcmVqo;Q83BwqE^BUoIY zN39HFueoqm>IN?H3R(u*@On|>c`C1AlM1F(g zXm!o!ls}u3OAqh}H5r9uZC_`Cja|IR#rMx-gupG8s#=8rKwHI3L&A(`%J90fkd=9i z_q{?~`IR-2#I7#pEwEgo!Dj5xM{D z$y36x1>C7JGnXDBQ~9RXA+V5AmB|Rf;W?Rf-+W%`-eR&phN9Npy$CLuSqRF%#ptd%iHxDZf$K_o00t+euV) zmaWxxJgD9PT@7#mbQ!8{!m9Hf!05q@b>u|H$+tQ0lXfd)A)9KnP}2>3cPH>#_km`v zwW>~|!(yTZP^s?TC=*}|$B$HFW8TDy2zy&xN0S}aX0z9J&0c1U@u#p*d=f}A^}Lb? z-YlLcY~qs7%CpSe>n@{90r0L8f`N%z4ohT~J2`3;DZ&f+jmTPsg(n0cO3OmHu_~<^ z2FDW9HIctjmwYFHh%0sWS!8jU+g)RE5Y^Z#VZYC0@P(K%fbr&H+U%Edj%yO-nK<-a z-W1cSkhf(((l3G|HL8k1m4?!99Xfs)P@N%^{sw>?v0HwFvG>bA2<~1-=v1}m#j*t4 z_}Q37HQxdb=?Jkyb{0A-J*snQE!~p&-l)*_WY#Q*3$&(+mtVZ7WWiG5qDS6c8!oFV z@68)z;LVFJo0%56K6!pX+ipEZMn}Y5WZK=N_@?!fu0SNN0An3p|f5kl|QqSvBi}-bQbRnw1_BR$lTtm`ghDCR-B;az~y1Y&3ZZ4?>hIs>U1^D|068Zyb=FLl`+yDT62mG~zcdispGH<* z)COpBi*2$9%JAWgJ=-A-e=2frG&Y)M>yBwdF&D6+3|tlcG$%fI{2X(^fPv67>JYJd z$=~0eN~>>MLrO>1lke@br{?k|Z%{XJs+LFlc?-`n7$2|)w{i3bYOhLGK)LXcEs@Db z#x2xyN-sBEpQaJu&oR9Uua#hun_0CQ>Zc2B2kT;lkUOBBAwX{v+Ci7|UF}nJa!Kt} z7fqtjrI7xDO^%niZ;2gd8@-la-lR9PXs%Z#{oPoMuIPJe%`CX)6@RU6DRiBCPr&9@|1WmJfXTlRFJ+ECVReOR=_CjqkGgG3*s9s9Hs_$o$U82z?QrX*Z{yB3k)wun6dzd zFBlLo52%>!8_q$0@$IC=4qoF5v|_toi)3Nk5K{+_F*Ne`E4m9ka@K*r79% zsWJ&5KIunxXs3JIWNj=v^HWd43aL|%qEos?iAfxWx^)eo{>X_`bKRKqAsjhdI|`wJ zYh?#_hTj3T)q$O}%2v&s6s{IZ+>nm5Cp8hHs)v+?jx)~u2<&bZi75puH@~@-)G?8f zj>!6QJaP$EW&x!QfzVl%kG`BH@nibc5=86_Uq?>ZJq@+1Vv<8;MqhKJD?NSaqkiyO zm|g~KHNNd{fVWS|xTaPt^BPvTOG4^kn;{mD0lkg5irMRE}Ycih_z{hh=elc#bg{G=GB9V0ugc!)s*6bz_~S96jD z>*q4tiUQe!L`d>n3EbVOeG;XNd)U~d+47j9_!LVmQqlDFvoI4~sKtcwzQ$OJyXu7b zBP7i$vo6`O1o<$WFD+VB7IW-3RhxhbgI06>1>KeE6{mQq9eX~kQJryV1z0bY;xns7 z88bFKc(H%Se#HMJ4g(W#w-(sOkEDpw1mYDfayP z)VfS5{jRjZhFO8G!l^{MJLINv?mkni=1=p?Lr*9<5sgysd(BtM1C?@V2bhMxJj(Q9 zE(c7HTXjI2MK?1&vZPO&&1an+!I$hVTwm!o=hI+^4`Qo=-)+<(m#1xzq4fUw*rKSf~;^wnx^uEKfk!-Dozwbn?YSQCBFsBHKQx`lPZV06kH_`oM z%qhlgqO5(I8PrE44PkU$Oe|*@dA{0aj|&1xH)uc_j52JM*}TrZa>(*0D!0zgZ}S zH!E#tDF$>};5}oe$%uVydN*tABsnwVTx?PC%m7{}Ag{*pmwBb7Rz=n^`9je5j;uUS zqJ#O_3zcsc(eeihO9TG0mZOn;j!CguW1#Al;7<=OI2;C*T$X~_Yf&1__JuUYYk7f7 zu835sVNU*l6PKj#A}xQG-|9;#&U$Ey=h2|w@%C?pXl2K#{j!?%kc0JqfMN(%dub-L z+)sXNzLZH9sA|bm08b#i-kln^q$-6@wMZ`KRq@?X@`9QEykDG9 z{>>x{MyfbE(RM7@GdX4r{A7IYph33aEZy;!<&Y~B1L8DfENxnIhEtXan^v}kgsILc0T zq^eF11{5cfDePpWt=)tRngKr%us7()$dmy4i^PP`g=e{ql*@&bQLE#w&=Cp2VqO8k zdB((mc1eH*#SCgzIIi+O;#~KR3X02uK@Oqzk>oCVS3G1ek(I~5myDXEj9YG(hhVx` z+Q1Q>H0=)h@5GeyJOsV7D)K7Rrtq-u7&W>Le?4%>eE-}bwWX3fTzp9#zeeBTY|Rb< z9o(@Nb*ZDbvTt52s_juKbBM&BWumoz4ax1!^~jkVabi1R<-G*008?A7-E!`$DxaXf20(!{Cl2)2~TV(7x z0ldpmVUEY>5FjQxC4ef2&9Xa)IoW`z0AhmoebRhmconQ`OUk%XZEJ_XwwgtIA|JdpHOL)vGq1h@=80!Q#Z`pf<}x?KeAO{vM@AXkBNp$ggF_LVs+e7MTom{ zg1|V9RbNCIvXS`3*ZhKAtu?bVuwbSg@9l5C28~OuXAEO_osI7PL$ONgj+U>R@~Cr$ zvi2&yM`kUGfbL9MpT>S6lsyq@{`YBt?RACrlr>QSVd|1CU9Ej9Qyo?KdYF+t>)I*9FSlewE4-R&5*UWqG%%dyqxM>i^t&dbzwqWk|*EaJYkpzLtPQM z*&1AS#?tlYSEde^ionMh%W}S~m*m60EvI-sZ;RrxYck{fkAt0C z*WKShVb1UK3bQ`_!quLTRWz`AX$ymivhZlj1XJS`Tud?l$ag29n3P)3!}yDk5n$O% zf4RfMz2r4My$b>O#5BeIwGxYPCo5fA6@50zqilZ(-B?On>T0+rXm?U;_)un>PZzaA)JSL+g~Cn@!- zj{3anE2)_0Z?z{?Flv8^@97#1f(gv*2kb;n(QWJQ@ma;sY2u{%8~6nU7f1UyZ1Y}S zc`CVtv8mr!8t4JDG#jv%cT7NSc`i~EpP+;5p`M9ET-^F8?5os5WFS@zaSy3B_s)T) zn??cuek7cXIqQJcQh>SoKtnk{Q4)~|^^^DIEi>C5Psl9W8#dvWn{mQ`qbjalzX$+*!c<$f23(IZGB!@K_?X z*wbQwR*HIyG}hEH7{kPwVdlsF0iiRqS6li{`ZHXz%BnZiFQI&@vCaw3fa?01&LpTy z?4}s(BX=H@K=m@|X=qb00t~P1B<@zlB75zC;|^Gu58+Ot2;nec0vVa`ezc8hi9P=? z2lbxAHmxi=Zt9m!O3BMxs}q};@0A%`owU}oKFhLv!Cu6~sFr2XqDUy`jkEXV;^eur zsAk?=mvg3=dKG8p579YVc2`R-XpAL0WzCp~okyhEaVCM0#z=4#Yq3~c6%ZY(fF`b9 zvCuA4t@5xtM;~=g?=yK=xkIGM9$%8!7(_7OL@}{|SVhB|UC zTAqu@sruEhMKpLlTJ*#eTASwT9~R5VpY=uPULV+$xz=2w5bVx!9mzdJjt_TaZNXcq z*=7T#Tjq>gXi%u0Y!tK)l6|t&t)pHx|9pqBT)|9nnSDucU}0r+C{@DdRSAcP`J`lF zPV^bV{<^M=nN7}~DU$H(Iu|~zaTF5!t^{pBKZZK-PX4)3{$bCkg7J3L`_eFOZ$(Yj z^iHTvCmYO~Dg~I$6_iE0cYGQpwh6^*X~$Sdm474L7XOA0VjA&J=S8 zBSVkR9g1DLexwg+9&?rY|Q#p0Ey^5)y&^=i01g7IbCr_9HC#^<<_G@$MaybYUay5_SnV zi|s~e-EMvlz#tX)+M^|_!k|q(HJKkRBGPcnffXaLbW{I87#2pLwzWc#rvuoqI%L zG#Ip8NwWTu3zEV9bA0p1#5~C6i?Cq&)p$YR12=64j=O5-*WVtKE1uDYud3UNYmaqx zRt#7eBDM40y&vS#zk zr)c#T%f8xhG4qF;6w>u_DSpJB0L%U+@Jt&q#+280Jd_RUZtu4*CH5qNe_g@8yl-}K z6f@#0i*0jqu9Dgd(`#w#Ef3&sLEWNO`*Mjb;O&D$cgf@g8Qx8ckn;mK zWsaXK#h4xs9eHvRm!XiZav17|*aG>E!?g4Ro1T}4IJZod#w$&{Utn<3`<9mQJ&rnN z?xSzgA&)AXX^)s3zHjk{x!>|%xe*;3Zh?FoL2L(*=j#!hC5ZCr)-VgND! zID=81$D(aaG+#$?P;(~&X|}w=Z6)9aSJ}W8BAVVyn7AQk#sD`JM9dszGGGcdzdUq7 zlM+^FU+FW;-@edcj91vrJ)zjBu8vi6H~qNZp-GJgnRl2z^bgN0;c<|rVweMYQ<&Cy zqkk&1XJ_W^19R`zSczGgsAeHwPmKDT7lX!x)Mf74Y0KS0n4faeKK*b`JM|f`{L+Hq ze7m`Zv9>u6XY5;52%V4DpAMUQBF-;hW4B(Csvffs!JTj(rL>F;@m&_LCNHn5AJeVq z3_D2@F?DkR0K_EuPM)sOsz#?6YVWzo%;_@eR|rIS%>GQhX4A3YXhc-jv2+$NS?ef^ zk&56-6f4CK-#RO=|I48d-d=7t}|-?rxeDtEJZIm zkgJ;-AbK^->Qv_}5k`Z8*jON_h~6|&kB9sz_?V7JQGrE?8Ez$dYhMFV;PzSWF+oJ?bc_I_pz*f#Esl@sy6PEzW}5DDKl+g0|>>Sc3p zX@{iG<0}5%Yy4aoc5|HE`-R<{C-oe@FF$S>G*xBf3hMjoN)TjLajUpxY>9Qf6r|sfnYKoR-j?0BFBi~76o3aPklQ0RWQSE(e zC7VhaMEBSZ;dL+W!PRi}W43kHmu_-$b_ZLzjV8hrCreDX4}Qfu7z|=#>B|7koGH1wgx!z*Dzh*0z6kme18oK<`z!WCVFr)4q{3fCA_ne z40%H>I{=vFc<3*g*KZvt`B+1LQKqJw?i{U*f!9Pgr#L`gVbGfVO(UOYHcex2nx~Fa zfOC6jKFJK|?xezU)HlayykJ%edXpoSochc#vTx}Orq;g9uxpBN%{oajmnb$F->D6Q zP6{#^^cU@6R`7e%qZ67|hrvmi)?`$a2@KWr#Vq3ublc+|K{xT^)LieI&Ya8g!a02N zFc9Rg{6tgVQ-oR?ly&4_Vfo~in0U>qbKR^_v$SxXoBZTk z-DyRwbN%?{6kU!PM#By4mUb3upI+^vX_rUsekDf0n6%P`1!{EWp7LLD7L)l=ybXjc z&qu#-XANkTgVOMs)DMp5f6{oO_A0_f&Q2AOK*+>7D;{03 zYueUai*L++c7?F?|C<{duVtM&{20!l2Us$Y25~jjaRd$4|})@XTinOMI=32 zOTun**L!uwTwFrDJ-`1vNe-l;xsGGu^x}u3lHZHTjez)ncl@XoCn=)=Kbs|R#EXih z%**l$LHQ4P3G(9_xeL2nHQg*;{2<3uMaJ)KvdxSd8HgtfPI~SS2IL;>4all)2v~e5 z4&CFDEA(x-VR`Mc#Mn}?I~k1DtR|e#%9Kxhcv(tk*wf>DLYWMB#UT%vYrcG6#J492 ztBDRC^c+5Q@s$6}+vhge-cS?Iujp*bwazAv_tkPyOGdJlcz{)I+qOP~TB#BevKF}u z`C`N@UmH2Bao4mxUE_wk+Wxi%2@9Ay7%BH5WL5_aEOr{p9TBFlMm2l<#NH?k?h0V!r> z3_JE>OXyt)i<8j##j?!I6V=S@@_8pddb#&b^}w=TwG+ZEVOCFb3E4%(TKwBfN>@7v z2!r#_Wb1P_^9aXSy*lx&aj6U=-|YD5%h{`GBtk+zI}g7to@8~;oxEsjeTgozT?-zuIDh5&v?vF3CI^Y5WbHLFrc*yOd|4Zyw=5;O*-O}a*DU2VEL-N z{~vhQ@zl8*&v)nhD&4tQ271T5(#{45W$U`2T`Fy9h=--PmKE8pFdb=7SgRb9L0+b5 z{EraPaa5z|Bsv$W;ZCNQXPVYyt32bg5@hpg#?bfjiC&ED2h8IXGLLI?9Xf1qd*%f_ z5qxmPSHZq7w=PM^(*VHs?5p6XCZJ5L+}n8c3``0v{Fxd7SCVi7Ufe957m0q+6#3d} z8lI90A=p)gfYOJME3pvd(!=PeujQgbb5scW$5<5>!@8PW>9!~O%Wec~xM0sdG9W`l zJBx<%izSP$p#WSe?1_d0Cnq?&wPi8b`3!&A*qh5&+<$;LSUBPk?eOXfJN&lvzJ=1u z*zZewWEt2cn}nZyT#W3wyw%uGo`x%?J~f=rgVvni9PRiRJ7HX3c{)xvE=wq$dV+mP?c;#>u9+2&hX5}M4%7Z+C*o0Jqvc@I zT+n;5Gp);@?#2}C$>X7q>cdu$3JEOT=nB6ev)JrCMwSR_Xwp!UkpzA|B^hhd96de9>fFR|Rq6KSTU+Hp@z}o!S+Zg{gY@`u6E72iqhk)4 z#y@25Kf^LoZ!gUPoJYe?fJMwfrBiPmr7p(y^SjOs2%9Bs zXoD-p4EjR4GZG|CO)oG^KAZSxkIQ)?TY}+Rq_W(+>FeMPJAiFvrU*x(zd+QkAST}P zLdtPZBw}zWNa-iQD_gHgooA`iSceRIdz@6nCY@tDzy1^T6TG4c)ev~z@22XyuKF(` zJ_hPnZ6?5($+;N!j|#%-q%-((ny>m^*CGI1k_DZE6yZXPJYi(VTNiTyz>=n_CMjit zsN2Lq3Wsv$s_}33gL6h&u>khjg;2!Qwg=tKczi}+dc+k|L77f(<9cf0xpsOQEJ=J92S+-k> z5_#nw!nduP95j{8?b$(0RMf(-EDAo)1^$i7I7`=WH@8w8*W`Gfd@OB}Tq3|Vi2Dyt zx~vF4ONL+XX5~IOL^!&Ls{L_o+d5v5^1fr($$JJfKAEY*k1&cuz6P4}k9;yb5cmZiai=FN?y;B=MAf${`>C%U(lasecw zT(NpKZEw~8a3Hi5HXCXgAbLlaZ&f`ciN3ehFOxl6b9mEbr$LX$GC!9R#a8@-qEF}J zG2&%Pcst*=Sbus=c1!689~oY2CW>VWFgTn?FELHe!Yi-YrJbA4EXg5Td*9Z%;#Eu1 zUk=ElJZ7M#B?BH}-_Vk(YBl$U+bM!IGTuTzr}vffAhwG;S;vy{8+bSxwH-;#bji$- z@tiiI*eXHPdDNkASM5QbdX~OR9<<3;Y9gVwGiR*jY-qJZucAfxi*qJN@eNUe2y~Ot z()@_+`)*x~y0o>4ge39HodAZRzjBadh%_xkeW)Z z$>Bp_*c%*5%avpoK!12E`?@0lUOq9}$k>cKFBzhmWqlauI@f1H50cX~ryZ|JNmZE@ zaqqDQA{=hZq04TV%p4@nnf za%f+YOx}|kHx!(vz3>qAiZJcT=u+nN)%#L{nuQ zQ+Nd7V`)^So_K6Lr`c&I5!tKv2qg7Mi6yQ`@uw>LK&e){%tAI?!@Y}#M1mT!n8~YY z(h~e?HtQCjG%-nywi=X7kv%jnO!M2e{2uL>fC-(A1AA7SY@U7t+gXmyuipX_9+NXQ zpr}3HuJ|$VRV~Nl)LTGtdWDtRA^8=c^%h(%@thbp$A>vteSafiEfL%qAlp9EQW4t+ zWC;WuqOLS?cy!E=pKOBcN)SwC0Lm5iG^Lw78jl2$LM2RCesRG|Zm+O3Or}fo7q553 zQzWT(VYc!J2wpC7hMm=||8oOBh$eYdh&X&1OM(M2BblBE%_cT^tGak4ak?4%;-)&6 zPjc^gLDEimyBPkA;@T~g^DFfNk6ZFjuPLJbsFYaIeGoax^qFs_eRrRL_P$pt=bk6U zr72$6@n@OX_O{bnT-J*dV6>=s3sj?;27^~$*WE+oVTiU$fx);ToIsbbh+g8R!IJvh zO5W_SjOUQ*67?gJ<4y83D1|YroTaFoWtbp`F|}1t)3vag+3QAh7o4@II%P`G8dwty z2?iH@)4N69`XH00KUO?l zS%OnGso_3q-nrJRLaT9;?&rOkI{LC9+~;DgwWHLs)SLx7HKwyI?Y)B@NZ7WXZH{&a zYT`Mxr)TSLuk;@K^Xl+Y;e&R)@ke81I3Z&)kLwAjO>BtN#1QreG;+JD@fU;QQWwmoQV}m3v5*v5cX=-~-BF#i4NANz4>4hp%Ew@j zD(@O;%d{;6emccnX4+)P6=$^5Jow*W=(hn2~G%EmYe#ZloR8oNQUWt3~Ix# zMW^d;MeRs`r7JlO^JEaX#e3SSFa5$0n|ldqL&* zBJ#Drws2N$6TDNZ+tQ5_xu>PRQg9}Dfb-GUWU=9BJ>=3R0BE~^CwIB#wF$hYplQ@? z&9|94@aTHBD8O=%ve%?=ev*Ev`hu}^7=|l_w#q3d%Kz)w)fo$}E016`zs=IUbJcAX zUvv+yWoGq^aqK8Ig0ZC9>;DnYRg0D?@dk=~&BoFQCzia9-9Ru7ES6u{zgn_SOE9;5 zuYD0p)8h#1#V*%1TDVswn7It8?2W??mr0&%$P8~#u*-VU$QdDn?>{9^lW5&1j3W-4 z42FMET|!+iP7Kvgn-2poibPu`%E$0)hu4(RYW*bRAN}!a8{gKu&&@9ju62bYA0fZC zUM)mqEAY;YinRb%kt7VwPDvEiGQDwmp`mSK>c{1u^0`i<{oaOI#0bVG_U2`A2(Xmj zfa}7sWJL1f`1fs!F{*o!SB_K4S(1NJD*pPTVQE7li7gq~Qz`j2%vHb}pd?i6Hcu@FG}vC`bR@IO?$hrNf(kL-^ve&DY8a+TdnHiH}K;=FTdm-^i17DV_CC1mtp; zIG#tGS!3PM)zg@)h`Zk+os|0X0s&H*GewkrSdgd44vrQX|IDUS8_)*`_M4UX8P9v! z`{sE`A8j=XAF(z<5WPyO;E~F!G>BMNQk1^^fi_(R$RI>$4@i~pS;QFAiaNQ`{aDGa zIJzMG+}rGi@VWSK*?68nigQDH(Mg}L!kf4__C#2Wvgz$P9oe9xxN$LW4;UVmS@<>P zRvA)J-4l-VmDz9P^-TdeQtj^^6OjL?z%m#5Y3dOhVNsOYao#L)L85B4*R z;1t;_sPtY-%OHH#<}j0=`n4A>!YjFuaLPXuLrbMTHD_!ybxHyNxX=Wg{9vr&0&-=! zS)-cug*LSBhXV@oA+oMy-&-^F;~EYuFc|?MaRxb^zcuCO!-W%1jGUm5=0qdIk2|7d zRLy&PBK#~96haij+5rSbxA9LjLkP>cPFY2Ke6id8L4_?+R}D_=WgeaGu@!Mv`x7N$ zQi%2>Y@a|*AdU$GcuP07NV%NVUNp37XY2E~*8L!!^u({Ey)20c?@-x~Jg+az1p!aF zR9)p88BQg{S{hnTHr={Hh3Ghu?ZoQFTCbr*-QoO42|4xFJe+^V2v$j4%NDCm3f@B- zi#rRdD;h`*3tREoo)ZORB!2L1JDb^tU~YfZn#{fInZFg~u?*2D&FX#irK}czq{^ak z3Sb)owI)5}1G3d5#gv+jgMtfaV(J||F7?tFdwwjViG18UY;aUN`~X%i3(e9lhGtJ7 zZXR(xc{1cr*mw+{Q4HWrNPIx{tb_$|u~eo=#A>Q36MWCUwBr*&W)sqt{Ypt>r4m9N zOwAtAq;S#|)6bf^!EJal*??!Qq#mKU5)C~H}_*aaG%|&S?cuAgSPfYbq;niEN?32Nn z{IjH}ll+SUeU8199Z05I???7RUQ|mAkV|NbHi?`Q0dGL0kC!wIRs6hk zQ|AjL!u(zPk^7Ng_cOc6Bo>5Ykj)$Q6t_ejQ8{X>%HD)(1unh!M5b1YY;)C^1tV5> zAAkR8-wHPnE6T778=at}l~hVVq`SKWM5Ls95TrYY9vVSF8l*u|3F&441*DPgp&N#7IHT`- z-fw;9m$TOM4?Jt_eP6M!d*5u3AKDUX1vV>gEGjSKT-LwUy5u-^)!mfUzB5;Oj(ieF z{UU^n*MHDpnTf&h3-wd`9PZ_0omsB>Gzt38KS7$_e#UL=9}KoQRpUbO)iYArajxK= z@m5Y%=9L-m$8i7_>IMPx@=ISB>OGN`4(1eEn~4H4=ICiDb+2q=-fvH+9OVq3{xEKj z5bPrh{ZMVPGPbhXZEo~}u260K4c!DBUW57qhgXZu@=f8d z1K8vkSt+e@zogvY+FWw@i>N;Sa9<}vc#gsR`I@%Wzqpj9&`qTCHrl?;0FR$=L8ncn zFv2k$EqEyn`>hy}4(*=Oz=D%GxbOyyTHm-0P4If~k{F$|!4 z0v4jup_=v}R-OZp+d8H?{n{ut}n=KT47bL|USHyn9@D~}(4L8gLh zb%q#)SLUoQ=eR=s()gA2pMC=@Z>T`FW@5=pd-*Lhm6p){a0YWSt^U&<@T92<7w_$3 znq`GD_Tl35bZB;-VJeNXlWPBTfgPVLkRo1EZ8NH7XIXvadA0b;PV7SUh#2F%lkct8 z^@~_V?c-n4_Q=PQ10eOUv=Y55%xA?V?GtPmSA5yV<(~;ooVltFt=QwX1dnqcbKu3* zyq+JJ6gbzTofFd(i0nKa#d|vYUHX|tZi>E*e(Xu<42_xbpINPuIgw;NPI#}%C-!w_ zi|ZG{(Z8fe8GL;?j+8C}Bh25X@a`5|o(VP$)Z?xCehi#>U(}&+SZc+7W~!t*XAaD^ zmK-PlP{C`wuE-TR*=3>()`|&U`ZBoCLxjosXluc21}E`we|y+Af&Q-X+2iixi06#$ zpD7r-s;Y~#t7@K2FiKCWoIZ)9WHHsp;5R$8UJYv^3HWL7>ngk6n)~{g9?mLlh3R~6 zsczEPmGs5e?xzz$#xrFi`=z%pg{iMsMZ*~LOS?x5iN`u})$c2EA54ph`5s+=Q%~qt zNwDqHpNX{(A*I!nYl+k5r_M|>QBA-X``E50%1rsJpNO+SF2%HC%DIGlOsLuHw%Rhs z5pAYq78OMdD{#$G&*!dkir^gyXVl=1vxvlv`>Hjj+n4%Yn?$BXXi|K;*P0=_CtmYy zYTYKTGA1`q-oNnP3x8d)C~v!bc1gRh@WpAO0&r2I4VHE6R_3v-WIGo6(YJ*J{wEJvyz7cp zSsLAAxQ>0e{=E;0Y2*BbpYm0SmE%-fKjJmg@P@u$jbMTPRyh9ZIKzK%@kHCD4{CF& zoshv(!rh_vJEcc&V_~#|wZvN(FIn-OayD+H{tu@n`_>ow=?S>;==O-%zEb9~D^kaC zWw>DU>*oO_G1Z2T>hzUIqpaiEOI%8$U);QDoDur%P_-xYVn)$SsphFHWgC5rm0$cX zEBzxyk4~C4m8!f9tv|E6E?bGe%qdDs)@sITzLyQ^-rL1Zgw5dBPG#5y|H0Q6IHqD$ zNWRDrR{rS|Z`X7E?JCN52+GaHKt^8r^7nhrihO{=Zj@;P8)KNv?+>q+0Qm{zzXLJn zUMUD1o1`JrWb0n{u_O>)>3fGh^-AdX+IaQySrU(pD9^Bo;+jPMLUe4%v!9gjtyk7| z-^8m z?E90Q-${R8F-+kE2#CmWuvjC0^{y1ly(I(l<11ZbxW?m+9n=XNb0*cL2*zg+(yH+? za&ar2y?>L#P;kfBMa!V$%-T>dRZE!Y#>sLy*5YxY2;~nWcikOyYa;6$wUth%TnoE4 zhR>zuk*OC(P(J$ludBN3XFSL}G zKT^hun5}f=NXi@8;Wm*Ae*1CV^(A@zKx>?FLU;DXZ!Z!o5O(~+YUWA%5S*GD=lFJJFJi;kB51#ATd5Q0 zj=LqKX;XDAE?_jT<4BMFJ$Lt?3+C6n#sL%Wo9+~`{fF7~U@BKUjNSH1&a3g`KSGr! z_@p72ip0U#iwFHK7nfPe`n(!JnWiCg9-C%_Jd6t(2lpy5mKYHk3-K&h@peLQUq{T# z*rzdjmm9LYcb1$qh{`L7o@ag`VkDhn_$f_FkkG(lgT3fPfRyB-@<$U|TH2Gc`!=u3fl`*5jsFWHK4Tdbm{S2(#kz4izEN$!OXR@5z0YpeL^me`OY! zovZo=R+m4+AuW!#+_Dqo-y*>)kljl8Kx|a-073d+^BlZsTui>i5~UrOAiQ87K=3t6 zYhSY3D4!}2;jVdjwti&wa8dn^_7k@W-#<^-t87e0%)h`;l11^&2oX+Me{=1WX> zXcl~ORt8toer$`5+DneaR;wgNj2d#TO`YTmR1inXjTpFxLt=1KwnYD+7}+#aM_l< z3_`0Gq8sF8xhf5A1(`m)Z89f5;;-(;PF2pZ#y9*_Gp6eVjUAD+Qi)Z4iS zuuMB0a3P|lGK&$zsnG#u)Mb*B_5)^jZ!3R6egt>FZYJa3Hwqme>TB~C4?Bo8Yh{`cm zBJ(+`H+^-^-T=R9yeh)akh+-rIgf$-X?bR;x$phV9pare%Dn0%H8NjPzdjwz{jqxW z;=N3#mpU`8$t#X0Z(dKSFY)@r#!7_KxnC&RdA(UnN)_X>Es#uzcrp|H5f$NZ zteG7Tvlxt!AP;++l`Pp@`A(N%$1UtF*&JafZw|QmFP9K{oN7HUPY@HjWI*qTiHJfG%>}~mv3sm)Q>q6 z2$|E3+2l>oe5&|6PNOYG48sO2vBK`TzHR(|`_FsJs#WYK*z>K0$_}VIX!8tnR6!2KAputa@KKMvZ4(41AbXFvyMB5+2Ld z_;S2E9pL$)QXvuv49;Vt?~|bj_}t0=LQ@{0Oh378Im6pxiZckKF8My1XF66GA$tgS4+do+7 z@EAafI-ozXz3t+yacSrxp}~rEuf~BQ)9Z@rORUDax!>NsI6ANx8}?D z|6(b8bWa!ni^St8L2am3VcdwHaCUxaxTGu6(%lx6^X-X#aon%i1_lUxMKt<5h>tSr z1FhvBA-AE61}uIO9s@bdn1oGdeG|PUn;MVNE;Z@;&$}xOoR2@Hc5{{gU?zO@yTE+b zCP>1-Vn9PrTb9Bi3?V|y)y;g3x=DJNl#{)}AfFNy!Z}VumEa=>eVX>&Gll-=*M;a` z#UbG}Hrj0L^qvNvC?54kELOhtk5=4pC-MFK%Q!Nr`$Kw98W9UoYakZ;0)_v_Q!|+w ztkNq+o)?@Hzj4zaWv=&Goidqy5*wZR)|N~)9ABio_R%X{5#@p%)p_-gQNLMnF!M4R z#O7VGpKPX&K6|TL`tmIW#l#Ko*ALG6lQusbx7PNC+>&37S7){AVraZve%z0XM^^@U zs4V&`Y*<~&%OQOy{^iQ0B6FJ8 zIwj=r4c0-cEu*}nKeyfe_h5BJn|QY;uXeYIf>WFOMgVyArnLqI;X2W7-xSc+d_7O> z*A&}E+oo|(GKFk###W^bcxl)0Vm1c3&AMJj?bdz&P?OF^1Fl@S-UhVIyIC}@$@i7T zgnIR;F1r5FB_Kz%TI>n?4P+(sD3_5d@KVQz)mY~7RG_XAvRkg=(tk-X|HI0q=<)8k z9sdF;HGJTWKyUnfVO6zfYP?-S2q@lIS(Q}%wRe%1j-?v6!j@U|DQsCpqg`2la6AgZ zG78yu$J#ARVU0Ljv#8xPR!K+WwN0x$;`w2($*X3-vHs5Cw(5*CJK)XPJ3jyq+3Jka znU1Sw)R!n7@VFsABja}gjSn_$`rj9IFgqQ%vRcQVZ0)@16pqwtWN{tzJX62YQ-YLg ztd}3}S(mokmb3KltY@KLxK?eHG|rrst1wUT{gmgX^{5Z|oK1f;7Erent=or^$;=uy zfnN^$HZ@sw0vd9OQ&!u_A7(OkxZb&e{xp!6q&$#LKc^|3_hWs(v-%97ALNw$++Jy% zO-I)#%4w6<66``+9WzeJk-+swd{{ZR7QS(}M}}biZY-tSD%2iq9*u zaG`^_k=)_NzOo%#&kn7ByBY9IEAyF}n!@(ryJYO<;__no<2W;xr=czW_%w&~3&FxQ z7bj|%84r2}gZtt+7rqy@!s|>aAB)F`4Bc(0T_zcuC4J9yi0AmmO*w1b`mJB<^cVI+ z1OW`Mf2hCxFoHKU!eu5itAb5&WrdBAKy!Cltto3cbg4H;-qH3KxmMKSgqr`(nhlj-8M#n-e)&;tpyHk)- zUp-m<>uv7DdXbtx5|``rLuYZD?`ws86whyF<|-E`*J>o|-B^0S%gM7-@!t#dSkmuP zKD2(WMf*&%18DC+YJC!7wo6*TY~s1hKbHXHvT2KclhAY5_Pbb_)n(&fY0{qK0I2=B zbX*=kTNxh-aJ=m+KFj@D%!n^_UrfU3uHKlO`?k+CE8;;|D zKjGLHX!)78XA3*kqgOKA;sNS{+K6-4>1xVM7cr(uw+hC13Aw-HF~LK1F=&%JUau2E ztb%S#;Z6`y2-=PNxBW7nUU|Ir5-J!~U?$CsG8)t;?0AP-!x#%a z8MiuT+fmO{L@; z<3G9MK)dWRv4{t$kX`grNI8aY*igw%;PXv)r5eHnPHRa# zk%ed}EG#f4`0;b>pD>{jG(IqU#)W?=iN7T{Jcs{O%2tTjnG%B%pAx7REBZtTTj*Ji zfG4gKn^Q)4Fy3g8!06Q+aV}+SvKz?e7pCIl8D z62cLp5W+khLLZV{+{|6bisdr_oPA3Je7Jz8l_WcJT$!fl`|JHxIS8HIW>IFUH< zJK?=k);tkuXr*odHau>4)bRA)0qB745Ii>*C<+q|Y=$)l`tY5JpgA0%AAk=qsR7hz z#hILFq`;`aa9DVt0!$&W2i6nF2xEXJz%}4wa9(&d+!cNT$AL$|mEiqwR`@r#EqoXL z4uOYIMzAC75mX2xggC+v0Y=E4jueHQpxtd`0BnvX@L@~jfph*2?KXDx zw{}0|f)|N1dsg9eL4gz<2mtg0*IigsSXCPX*`8DMI^$_ImOo}0u5ESt$T0$GV0BZ> zkb{zf894Ija~e4!Syj(MnvJ)5ZJ&SQ&o$|n+vYH{k;>O}Or7$Gv*z0Ryls;6&Z(Va z1XGt_3+EI(i75aOcmZFKhn`~!Ung zotXCdGR+f!!@zU2e)O>Y05;^|Tq7U?duhk9r2q3~#GS>3UI9XU@M)bgvNT0~iZ@1Hq_d^&J&2is-T3rST}O;_tWBNVz_to@O-!# ze6`XCq`Q)Lo>-O@a?gygMm$C6HF)7esi8pVW9TF3Qz$x=1d0cxa%TT^@~^f-&II-r zfpqZZd7b$kaU-3>uG>JR?j8cudn|tm3<;nFx&&ClGtJq$_*!zLk`r;SgkVM3A}CrO zNH6gn+A;l|)D5`q>J0C;;+>I_&4=m?uHfA$2r&$EW3=rlSqbp)5{1u&H90J^E$FkJ1tQYt}9N(_aU# zvV>HV;Pc?EN2j1kz$DtF3sHSak@sq2osS{tLB{l4Z5OZ$@|#bbQnwNRjFP*4j};{A zKlR`7Dd+w8vi0X0%N7ig{pw7A5k@X86=1qZKK+y3Y{(;#CZzUhrEn$ckmrK80*gFZ z`&%gvJBX?!M?9SpYR=UHpK;pHRH8^a)bM$ z_4)c-pi%qu&l6{@{h%2u{V3+i^`Q}bd$^VLlQ%4LzPU7W*^^B0D889i?)L}5_*vFF!(JS1q(PKU|@d1 zr#N_FOzWpnN#4OzmW@S?Ukkii2|kX|H78M?lT@}p`H+rt z|K1_8=Az3ka>Gi;Im5^0(qo!%4Imk@0@{O5+s&flXGn z(eC+=yQdD4k`*pfNFh(E&K7E~cHl6@LT$!UY~vi3QZN^%8>ai>Gw4F#N_$q9{hEv6&vkN8JBf_G%wAneJhvlvbABV&;AWzC zFO__2$avR5$Ij!CFonnWW=}!NF06GTZm^`g!{%7{)+jbmQQMslWmU zZ15^qCzJ@<&wjF5kNQ!udhZ_gmcC}>MOHKVI>S->u!DiR$@_c220^18QviAX@}U`m zsO5&(`g%Zo?szV?|Af%UA-r^WA-v?lm8QH6-ptt;O&$2;jZUGa{LBt3KCi0Zpz|N> zFKZ_hHM@@P5^Y^Khk-OO8tXkptRk8Q?}YOQx=hK&54g89;jA?weNJiV8wdrx^?TRO z8p>O){VU|x#!bEe!$ zj9FP-QUba$ebgW3?cV-8uGq1w1c5{XNpvaN@Px8R*!wM|s$xH?SOFCW)e+Noa}w%j zy&{Td10s57eIjyYaTBs-Y3`*Csy^RptIoAs18W0O%ra0yk9WcwtDbX&z_fzE?z8)s zS*~3-s`AS@Cfo9zYWS{X`?urCinevLA-5+sa&@zOQCmAR--{ZjEc7;uB_3Vn zRn3X@kEf*H*#jR8I+tKC$9yTy$n>kHfu{SZ?rjdMGd7I-j+WDh@p85d zWL6JvqC>nilSjU}h$(<;+T5dVWELzr-kCMvbJXqB(0$8(hU2+PxCjjq2c}}3ynsxx z<&mUt-O<%ITYDx1GLNXz8dEqc59V=iyfeBuanDZhcSjq}&0R09%hIY@D85I)^rD>-m{Dl6Bs{{GIsRwkK_(iBQx=b^MYgEZ99& zl8L4L+o-3q7lir?!!En}vevh8O%(Fyu0?%Hh>eYd3AXs#N*DC8Yd%>!SyVmx_s<(*W3NgB;L+A+tcCe z5(;;UpOj<=s+b#{5A|>QOtFU>9jdIBo;LXo4dm5%p?1xC?XX>nrdz+Gvu{DSztDD9 zNnS2Rd#fATuyCvgK|?pd3G)X`LP;GnFP~Ipir*04bo8zDTCL6jUI=-*xSu9$0py_Era>TM}r04mqx%xo; z0_M*FI2ep?oc4n*W;3jwg7tV9eLl~!??6qHkquEu!wiO&16im<27_z0LX|nkB~w-` zFcz!|P=Yb?X9ln+O_F8Hrw&U!d`GNKXn-`}Y(O?B8<er$d=bl%24Vt1QR`_c02BrWa;l+gf+gSt;{cS5Bn04tPy%uUzz3oY zA;G{8lZaQo+mPUwDH8p17ZLeEvUFu8a+6fKSC)6a20o99Y$6B|Y6vcb69Nl@@ASfn zc%BBY{x5GB=mGY0`N{~CX_*au+Ej#k@;G51`?Cxb0ezk?6?N?!B5)CJTO|Lg{50>jUDsZE3j93T#PDx-L1v1J)|=7E2$^!R{eCf4=JIL+_zWd+WJR+FP)^d>*N z*2$A9YYHqV6+oXQ2o#hJz;R-AqUda-Y5+Iz8f-lnK^LPvF90|&pK4DX6sMrCAb{UK zujER%`eDExwD2B5J1veI5R15CLXw}xS}J8q0#BYG6u(}S*sYLAbDH{NKuMwhW!;A+ zohR#ijN{`W&Tl8jKV)8$v;_R4;JVl?z?L-j-3FcQT0^-Of_&AHXQg6oX!d346J}v1ftYr;34cEO#W+)>}=QrupgFfdVzyvMWW>6-e1Pe z(o<$Aoa2bXJ-jtQqZIY$*b5ZMsi6^r8H9Nh_5v@&T{Cv~9FW)+nSPHHWtrl?`vxzxkMBNJaPR*SF5cOw}bLj!2eh_47Hh6N)qA+38qYobxb`Wwo-|k#kxOM z*ST}8N{gKq+O)347-WVl5>Mk!Q%-}XpO6FW&=WxhU=)F-V@EOQ5dw^`wUKA{yp;H( zJlJMTT)5=;c9@?4bqe?W$az|Yjcn1CMxsjIN*pepaC5Az4{2fQP6qg&FuD;&axvnV z^P=gqy{=5*n-N44zWq%60!4<={c$c7v72ZRlyx#qG9BH&;)QH|qdfFj!r@H}QdHw; zo+=e%FR-ByoD|`MG2pX7D0v$6CG8|{mUWZCov<@C>E!Dy#fK(>KF6gD%W;2U9vvd@ z_@eXhtA8pI>VEx=(1ITUzLmmLi}G}r0tjIh59j(RBlnS006%)dzFcv-mS8{f>)=2v zLiG2j?&2ZDECeYd=Q8MTHE;&Xgz1{OD28QWvVmQ&u0VR1$#EUB8vI9+}8yO{D;Hu(1mMy0E;B& zWI(djh5t&)hGt5KazOddn{Tjhx$PJYq}RL17L-MD;PCV0pPoc$x3sf|&vtL@c!ans z4E0+naprrNYzVk8&i_-FUF$%R-v=hkTIB?1A~b`82cdUJN|=Gpdd_8 zxLv8Eo=xr`*@pVnWdr}?J_BJ##6o&14M|D8I_cq-|1HPGw|c4OMYTh{yYaHc@OzXu zQ%E4Ulb=z)Y%+^{^>x{-#b=J)Y>@ZBQ};>atv~1n)kui@6Ut*uWASivs;UVxtlhtI zc9&8=oc7Bl$L+iM_$)`nxdB2H;WK>)xW&2)fIY}O5M@1plbxHEWF>wd-mon|iX;vE zaBnlJE3QMwkic0uCQ}LlUu(xD{9f`^R+X3Wok7f=pu>uQYhmm-+gaN+mFYv=3CG6U z!;*EUd>8JpwKrGIuG}%GhYQVRv%za1l!J-cmUDzQER%!9)ZP3f2XlmI!x;Vy{spct zv>ov3IJ;%MB=E$}%zZ2Zx!SGy@X0f&i?z$_N(5C;t?bfv~fUIWcA|yw{ z9ojDnLkJU-W8h-ef#m^n;16(ocnn+xKGZnw$h9e@OCP8%CA=pOHgmD2(J#Rk>)EjQ z<_w2IKwOUxUIO_pW=X7P@KQ5wa=*miaQAm8ho&zCTEnT~ZaF+t-=hLLcMo_84^So~ z3+Ea0+-}|}egGPDhvc?w*EtmjmgcLlTbyb-p zYohUwM>n!<+p;g^ChmCCzud;fr1Sf_o>saNkG8m`kwY9d026p7MQGJ~Cpm%jK>Iv{ zwTcas{%xNl+I?Q*D@J3TAM>i3VksMg*`Gm(yr#rj?LEa zvhTahbB(FB@`7@?G~;lWChBD>0#8BRvn_2w5DKTj^;=cjyQFD#29NLU;rk*4n20+n zcqZHkYtsQi4FNiFI?=2&(m(-FLI+Y%O?C~|A!+_1%?i(L#STv7F?T;*c?tE9k%l-( zEK-OXOpTcZNQNK&&jJO`j8{%gNhxZ%tO_qTii>r3&Bg9;fKSW2f}W$Mjm5Gj*f z@nS;KIPf}51-Mqj7d|xm%cR{B=wjSvq_5IZuaj;4&yDJ;=<`;Au|CzTolMKILK<~a+pZRstnbz3>5O7>G-6Z1MkYBll@d-k zeWt-JPp0Ip`#oH1X^&eTk4UPXF9~$J5?wB!TKN1QLG1JgRFbG++eM=;3)UCTl9ESU zpfn$n7mYmfqU$)Ko491zOWZJ2%!9aO|2T5|Kb(|JRQw9`pKx$OaD~rSMx5>i4}E2GOJ&}PhVcuwH(G=s{KeF z)aiiR%nToISuC&Pd$aMQd9!SP_PJcc%ZjnjhvLUf!zLx$UVIy6!2%X1-Qxi)NB;6z z-!~tI*=-qpI>m^b4?}sdTd1B<|}fxIx@z-rjv_D5O2 zgcmI>XGWX!p@^0nGvA@NyO~k3Ekuk3au^OkcqNnPZTGqF}$^vhXhWe+^$a5gf%l5&!jiO9K#I z2y}!Tf&uXXL4wdi@FUzI%t#F6OC%{$0Ev&}KvE+mkU%6Y@-dPd`3T93e2NrC2EfVS zDR3S56kHHq5C7Lq@K`ts`#_RF6!ZZl!R>%{P&=?4j2cUvSh*T9+i*EN$LYmzff+t0 z=*2`SDim^Iyn#_mspgPXVpP7YBpsp9rO?IHCEEgj$2>*92JV6>02Ck!;N6L!%cyj9 z^hv?}!62_|&3(B9z_7vGzdg`4;TF&6|4$|nE+KF2YKxc44X`krVWAP)==pgbra<^tj4!Z=_#mW~Sihi-c>LI30s zMDS@U=uQ*j3Hj?@WX=c5YpvYjLR29yD|P${_;IEwrZK0 zQ{qqt37<88Z60?%p7R#J_QW8!9j}4Pc_FU7U{~eqI>*)_#sQENa6y-GbF3ttuk={e zT1G^`bAdqYb9>ru$1VSaTFr7l9EW3|eiJ9k%}^7AsL|0rn(tgKs&UV|I2`FK6hLuW zYfpGCfR%oUKcG&ynEz;54C8JUPIOhZ*qSmoM38j!#Hc*MXwKzQ6{NbZaha3eJH~qj z?%;)abPl=_bNofCTGqsMrQWXoD}xf9&r3RiQ?RL%P|j&aN5WVgB~yPelsACusC(d~ zHHq_fVeZPUiPoSMeA0X+YgAKsK|MQo1IN57R2{R%9GUf9$=s%lGw@5~v@NAsy;8h) z`gGEzj^CAbs7G^2>@NwH7^YdfZudPF9dK8ggiMh|94h@h(Yp62H?xzC}}%^$&JxtL^O9UW$8qzO;G;{&Pi-q(QX5?pK9BK-zIHpKf0>WS^6o zEALJDuJ~CwNO|>Yw08_2zV4xcyGW6o!oPk9={HjQT7_+{EKV^@`JBwd3w?%#h6#Xe zs-yYbcJ62OLUyfqHb@{_EHg+4lYVWGSI9F>wX7VPvV}BPMu#=ihG&LchIs$4{ef5S)#|bQmq4Beao4sAU=HM?-%oIca~HQHa3_Nc`md}YRwKlr?oah?uZhPNEG(o z?_u3!!ZHJmU~%wbP#kw&waEHNY++US5;s&EVD|W22qMOXvNGR-JkUMBFUcD8RQ$2C zc2|T+&RRve%3y1(-Hqo=IpWBpRMi-Trk{dk4q_ec_&d#*ew+s_ z^stl}s^!RRo9QcnPV#`BfachDzK3Dun_T&12ZBN`Tjx6q`j+jt&AkiFuN!EbQI9Q< zyK&Ui<;0(8VBSap3&PjlSw8>dzw>;00^AWK&doSOBv)UgrGqCD9SseGIR!G)L`JQV zS~THv5DH7`kF{s5bzn28`ZPwmWmzfH=|lPf-Gl-EJ;iDvq*F6{L9KBrU#f}PKbX5) zHeq2q0mF%>-Q9~-hzd?BL2pu!nDKRfpXoGl=I77{4V#s=Mu!nx61&QEp4Vp%`8_O31;gaqBC31nj3DZ+olnc*dHYxp*NJ_u~c zAku0{+$(JKW^=_**5@PX;h~5|QQ-NOvBF)p7Q>SzmdUskQlAHO|+pVd?2j($BY# zFP~m!>Nw@}pC)k6FPe)%S$q2JHO!-w=e|~!es@c2dMR9Z@^}LsZeCN2gY#-Ka;=mj z=>Gj>^VghbC(5f8_FjrNPAB>gw89dJ1iu*kZr?Rznn)eLTRET-QOLg)3pgm)+$QFz z4d}c0fZl0qf-k89&;jYtKIo8*!;;haV22#Nlh)6vWrvcDgKG>8)OP#E{MJMo8c|~0 z6m_C%O5J^pxfvYnonoISfV+}3xKpWTV>xAecDqu{FB&_2Rx)?mX?!@ymU29hy7VMf z6UBFFZ~nDExhkF{2R@-AUd(Td7Nb$!OK}U^;wbz@*YE8q9dYwVoG**+7JZg#^sCSE z0cx-`Ew1+bfQD@v^Gxq>R@)=bvU)xc|X}0Ji2FIsLPfY8wL!6hDmy#ZJms?16r_JzFPAnP4uJFeS5&p zssL30E5J%PYq-p32D1u2`OjB&EccI2)f|I#yl|it&h5csEjTSY&wXd28)tUzKyfpS zPhIpY?qOqDWfHI2BtQ~>2h*WQHZs# zHymtuAgNB5z>)w-x&f4ljPB3!*}dsuxe;~nUZOkr|7SYQ6w!!LOy0*+*dK5H@Rd_7 zlarG$O3XUoQCx9$bbP4hE#rro)!p3g;foObB!R-wwQf2Q|XSiefV zuKFR6?QMK-H*!4V#7p7uDl2MnUk!@2p&CBIY?Ct2{(h<82mQ)SiP|i9Vs3~j)(E>G zAU4Ebb2&GsAiVQ1ciyufXZ`I@tHjk*86V$brmq@5UyT(mCBh_0v_*u*^Le49z$v}bgqD*;Qi5+PaV%iL-%TYR@KX!{GZEvHX!w z&R#aE9zHD|tX{&xbMwDVyG4(c#4sAgJKl6f6;Gw@J^Xwj`g=@KTd&tE*sfM5H%>`n zh9wGRdplJVRC0#9M}8w~-z{>%{*WX4{alf8YUOk zR<3nvv!An9MT|DnPaU*^oosR|z#y!P=Q-3^AiPjlck(}V#y!yK-lMFJTaDudelHd@ z$z_@92X70^`HTsmpd~Mv;~%Njo_mfPF%3y~{GuO0OQVgCg?U|^Xfxjz3D>@RY=og6 z@|ZPId>y*%#l)HAx_g`!eyzxtV8Fub5+KpH=X+XvLbM_KhM(li4fTAEvcrVoYqKr% za(4iFL!w_y5&EG)cx9}(xO%1;0Baw6RzMUhPyr)zBP0>mR3sBH98!&6l zy9Iby?kTPXZQcEs-D&Z`hqfW*jq`KG8^|F3e0@(G}k|7u9Ckii$R1e^+#PNo|#WU(EtTNErm=j$O zmR7E)km9!}H&wR*u>Yjx#py#q4e+7s=0l=q9v-|R^rC66x%*(XPTG^?P8-^8Eb9fA zt53O$fj$5hU+M+PFl%Tf78$}QdRd-`$hyZHojzZ{&v%K8)N~k?(fOGCqo9#7i6WD} zpmN8{II-v$A=v(UNRI@er~As3?Y(!KYT&1U@$&MpxjZ^yStG+&cNW|g1&PF_{sgCN zc~t=scV{f|t}V924CN<5jGbpHg*KC*LL8J!E{KhHq@LpJ?0pckl%C^KHo) z6>)BF_TRFxd!xH&6xGRpsRP!9E(JpIK^S0J2sJh;fdrld(nlJvyRiKF>2{MhWq3~Y zM25F7(s+|UDALYP{>xDR^Y5q#DlBu^k__^KtJDf@X+pjx)**sf;W9sJ@|_tBJA{|? zpa+P$Pyzp$_nvIQRbK4&MXKjtiVW6(mB@91iS>3L&Aesw;AC-$%R2b9~RpJ;mo^8W+!k4{2p%FKrF<;)!`^6$`o!Ewdh8r zb4ogPedQZwbRf2T!#F;de3#_Lfq9gz_R3+=RATREo@a;a=Zu%#`*iU@|Jd!F-&i-q zi1EA&FZ)ftt-pbQ!Kd&vxZd79cqEA6GK|u7(k|_nf}(yYwnWH*Eb7s)X4*z`=Y*ck zBuSUDKsVA4?fW7WS3*Tw_EXg8hYdsQ@w_s`7@5M76|etrbJF^k7M(=B_>L1P;Stv& zlo{Aw8FBo%2sPxy-~e)l#%<+wXuXLDV|5ZUjWeSXJR zVwdi6E*l%ybZOs~V4Klcn}u{U4=qnO3}6OPAt_CG!+#UA6;e}&KTkLie?4UBxbKH! zO%EIJR<0!-^X&R&nrloLW?<;+lmBblvzXxfusR|MM4ee|Z|18%`+Y2eT<{@rk!(mx zq;K4wr5!;F;4TVlmjSV!x7Hf11Mw$;MsG=05<|hLG*Q&GRb0l@i>oQmoPd;Wl#5N* zxO)H&xkI^91OJNzkp0etKIpvId>GJ!a~2PROn@ffCBPDB3HXoCfgXVOIJap3{9W8z z&~2np0N9^1??l>7zB>Fmzu1tS6Xec(P-OV)=i%7XA)ln?OEG@K%%DhwL$z`M?!ev>!?9n~i15wmRZC||E3;v}6Ia`GU!t-)N0#x39V@HBo%v)tlmZ-tYv*0i4x0$x= z=NGNE!z+hIyrT~1oi}>OX2D8=0aR3x_S4;w7yt>t1TC)682(NF1kae<2A4{c6DNbL z#7jv{<67jXQu-~*rH(AhgGU^8Oz}Z@zXaMBvHT+X=nTxCbdJ#AzKZ;4e76-z`p`qd zdSAgB!-aBp*UCc2ULIqYL5DE#neQL1-l@LsQWaC7(tm3?kSKz?Oliz^8h;U*ll>pR z*NBbphFt9Cq^bA8u!od0pF)*zfG6ZEVOJ=`&-Z9JRrUe5IlECsMJj`lR71?c{fSc* z{wDF)Bh9Zze2D}L<%Iyn*mp%5jT>frD^0zgx%Der{xaSH&PE9)Ux#21yiv?lOHD&T z+0{`eMw`TrzpCnOkF$Cz5X=6d^(JT6Ca6meLe2!5=fqq7@*?>!cY*Ckmp;@JcuxL5 zW*l!aH}%MJl#Q?q(F_gk&ifxAk`^?ZN`3(|qzC^G0D(Y$zvZz1gZX7TD|$(>aYM(= z-Re@5#eCp0;PPS@`BJ;^I-(n__FC!+t1V`^DQ=?AbnnEK#d*9gMQ5U}D$aIO+*cP1 z@B9tImo@YpcP`KMmAVFbz7}y@S1f$r^~Jde1g%yJQQ-&(%=wqnWuPRiT~nyqdxrgUYi zJBn$2f^M=?>Q30*Ra}I!DWZuK!n#9MfL7jJTu~3vJ>-osSJw3CgSl@s#Lz#2(EF;rDPC0Sa*Ga$Q(V zW$9Lnxc^FiZrAO5adA&~q3Q|uJvpq0iluGSe&EA+K4Q7cR*x3^AF6i2jQ8u}_1xEj@A#&ec#m@RZE;`scg0()>rf)!$W-gvh*unyj>i)Wt_ zS+iab`o2IvV0~Z%V8fEbR3FYa-DN~~8Vyz(!M=Y9-Mxgmhkg@a(-OG@^#a;sg8saG z@F;k00c;5jD3N*KV`!0El?ctHGgYOWhr=-@n>b9^;-;VK=eF+(CpiG{Gzf1SU|V2d ziR`})!gDY%q{PS!NT0f};47AaIZVl!k)b8)yK`8E&6ZsohV%?C`9iIgaCi5nG;dOL zcQW{(5_69=$%}2^ex!ibCpUDDC@E6gBfPQ_X_q9YM*EgKl+b$vE~db(G8N4(z& z*csTRWFz;;lHqC;P>yg%BknOkMG2*`zx(E_jof2lKdxkBx1<~MdNR8^-nQu!PEIQ};T0P1=ihRTL(k zKEMyu0JT6J5C9G$Qj4};k1&GJHK33A- z9mlf?Xa-tfe-GayO?_y%YAxB^ouk(UC?B(dLr}(tmTciJ;M+&H&}AWRPRCet82lVw zV$!rFzdxd60NfAYn@U|=Uq)^zTg`#HBY~rUqf54O=ki(#_@okQi?XMBEcb&AQJ0&# zk1N^4eSC?DXEXN+$is;+p9D821E(O)n%u42rpI2h+!q+xUuAVgnpg6sf7A?4|Oxra!ZNZ z+M~R+?w*TLdgFvDcS{huMbfj^-y1mB{%1F!JyS!g#b~TjqBjE1|n! z$^AgIs}0rTCF1@GykAnXjr;VXL1-s~Py&P8F1?5KB*J(K?w&3g=>EEZ+zfO-Q!*GM z(qOn7?52GM;t!uKk+bD;*VGV%pkq~|9Xi%&r78z9Uk2C~g0}l$NcX@o3B&>EB;PytR$qNP2fGdjB_7%a<;H zU-jB`{G{>9h3V8p{M7P4)Xo*t$Bmw``}7_A*ZQ_SDD1E8-!x?4;Qj;R(LiHu|4F+} z=)dc#y`%{BY1-DgnWzJsdAl#QwGv|9eKS|i^z*F7i8wT5!9;mTUWwfs@l7a3JqJnb~f z<<82^$;G=qE>_C%Zuy(4I17EhR~CI(>8IhnRZ*|`z43A#`pA<}B-};}hg-Q$EmS#k zayBkkY7gZqr>7{=f^yebmA?;k^I_N93WUEE+GntRqk;20Hn`#pyE*A64~iBpM&6FdT%^=z#f#)%P9m!9}w#$$<5a3bsx2P^_a!I zmLM&2STu{1laIe%S8iqHy3Y%+roFbU*BWqKIi)+PP_z>iY%kUO@q6o^J$?A6r{B6` zd1BGzYq(BDLVB00lDz{@Upo1|9jo_#X#Lukd(XFv845|+cr-YbzG|B5z+GSSZ5nv& z+0PEn_g^#q;$8a1*1UVX->x^4S8&`9&zbK&Vg1>y2S2gl|GjtK$&X#WP32alr`)j1 zu$PD3(eTzZ*CQua241{Xxh76?6>=FBN+^A%%~yM@`N003tYNR7_4!Rdw(R`djg@6j z4OLfewe=mL3Aewn(N53a(qrjQhjAGycc0ykshWP&8)ux8;D1)1*N?v8vri9OJMig` ztwV;Lyxw|~F1q}vtisn1IPQ{L{FnV$7V&=`J>;D?J|CdQ%-y)o)$^jyS~q)Yz=>mC z-T#c+@7sDU@BjVhLQYae-`*;FTFZs^RW|N-XrIT19eGjk%*XaSWpwF9_s{*Q;XjAu zp77lcw}1NeTd#lRo|BE1as0E9$oZd?-*nrVFE=#4^3MJ{Hr_ag6Sb%6yUF8s+|m-g6&3f8MpTf6vyKB%bZ+!OQvUw-`XY04VQm)a3<*w0Bo_FL^o7{5Ei(mW)t>pV17KE>U zXP4(reHD=v517{T+)rQL@a%ZQ7l9A_pL{&vr0I|EamM}IykD}<18+U>>lq_H^>6U= z!uR%iK3YF?my359IEUJI|GeBm$39mx>%TkhG8GmZ?eyfc=lX};(tN{V$gy|KQ5$Xk z?54iMHX8rM&j&R42IQPn*|_iR&u#a`_y37DoN&NJQ~%ie)tPU9IqAsTM;?F0HM=1d zz1_VxoUr{_$Axc+UUAQXDr?4}pRKX+I_JOs;HwMgDA%!tC0jlnseJYS+j;AtIG?Ru zbZ~babOs9!gS)#9?(PJa1QHTlgAOjiNgxoM!QCAK1jyi$gaim71eY_(-upZERNY&3 zPu2PEKlk@A1x&5??Oxrh`&lyY^uniw*_6To07`1&PA>0zaZyOMu!+>!w^5mypoKTS zb=u}m^uRzT*cY?aR_#w-2u`Fj3{;OWEkG}@TvWp3P>@T)a+QT2P6}V13-rVQpjqih zT86X=$-L58m*Vc~Di$C~v$v>iIjBuAZ!!BgzED?0aP?&tepumuFrRf;rJ)}w{Qc{< z0})pMfGB@w9ynZAdWcW};4^=@Y?!J}a)4%rFTI@$a0CEG!iul%z1YuE{L8*L%ucd5 zXg~SBUPL{1uUn@$-&JC^UA>eqw0QjWrV4otK2;pi`oF`xC*KYHkMAdLvbzSGa zrVg;nzz<^w%ybhb&%7gmoUW~^_;y|MZUGofL|;#55Oh9Y&(kf~Q-V}_%A{9IppH<; zVPNK*`usZmjG&o-xQlSSUgBI3fotS_nW(dty7@I)V&GF6iy9Wk8lF6`lQ^n{qB^c`OD4x-n%-3<*>{_@4{7Q56&C}dQJ1ThmggrK1*Z!r$pKK)Uw$Wk3vX_PKX$u|SaA4RaJs*@PW<(KH2YN< z``8{LpgXA3Z^k^w>^)ds4#bWbcz8`ilsCw}nzf6ZXI%S`P4Y`RS{J- z<8GdA`mi@0_tBz9yoB#_1MLQvlDwwZ^V3ib#GmdvF4#sRJ=aV(!;joavDGY> z`3o0$RYbaEuCl4BR6Mj-e2p!wsM7N-#g&NZEHg-2xyZoCKU@{7vy zO|0Jt7kEs1na<5{E+@^y{0ll!8fVXY`25$0-FnliUf<)~yhK7_kJ8<_t9) zIkg0Oze3hpYNxM|6Ud>aXq-9#-(QGPE&8}%6jDFV|i)EFexqL zdG~7xgPFmx&#PI=(#J=Oe`){m94-h7V8@#Mk7 z?)7Sx-259o4W{_ptr#+vUJ#!rHo8|yA1p@T*1AaaE=#r&c-THQZIy-W_ zzy)pb>+v_#h%i0W2=bV2c47{~&jT>s$jzqd<6)3$I>MzTak+UjN5kGgTE@ z#|c)yqYMM~;(B%t4TEf*7gGeV8;Qawp=P&Tjhye!7>|>?uU~O|K2#TU+ zU>VXw?UY97l~_u?nxB^8gz-jH+^Ls)H@i&dy@*q>4@!3Wuhb90;LqD#V=1i^_fQzqN_<1LB%Y9*fVG5GqF+IbfQ3)2=@8mJ}Ju~2V zy5CF299x>J;)|TTa&|DB16v+Syzur(VbK%cTqS*SV$@V*L-k0fK!ipl%Dn??TKLv{ z`E@{2=layw!+>U$(sahRmoxYdx@-ju{N<5sRbNfZlu^pgk>o_3Uz!t!Z9v12;^M7h z&yEZ?Z~?*xwn*>(^JhrNB#?Z$b@8C5M^jX(Nc+vVt3o64g({sy*Qm`H-&uGPf6Z<+ z!Il3(H2y0faxW1hvYdrLs4>E=)hl0D$%+3w+|G{Kjg0)rkvrI@A~DJQdH%CZqJl~4 zYu>mZx*sCO{EJIw`#pyFjjL#{%E+EroUYQGEf`jC>kp#~KsdBYVO3lNBA%P=2s6#U z0Y)*JHPYFM`JM1na@6T6dV8yB{5;vT%Cqn)cR{-@#2`3lh^-qB#3rv%8|N2_NpE!5#6Ll(`X|UA5(0ilJR+Tw& zRN^!g0_j* zjh2pwRIQxwvdZh{`dQKF;P^y)Yz5*}feByFNwGnl7otv`yvfPQzwGL##>Ps`|E3G* z|BkZhIu&vI`u0;qUr~?b1-QW*+1Ys{7^n|` zgNmTk0vI?>>5!?oChB{4|-&`SVAYPtg)&@syPCx5N`dlo=j_T>Q}9a|kJmCLZc=nwL4(%&d(-zyF*KWlQeGUjcfGJExIc**{o zup`CY=p9WN@Egsc5^RMmK!jl5u_O!e2&1tzR_Ki++coLT>0v?ps=sCi-5zTy-=1_R zlhW$GpVQCZYirgkpO&*%$X;YuZrqd6HJ=)rM!gSE5yhwoot#?~1&VAn7;7iZ*o^wo zID&2EP`+t$*`pfg>=dZENd=>NysCYIrq^}KXFs~Cbc@io%$5C3M0h4#W6X})pzY=t ztJA?_#a2TLcYEe=MauqLy_S$6=KYm+?x>n3oho?Bm= z*)BV`c+YttDbaM7;jj)&kY|4WtLWHDCtb)-`s}0nQ_r4}*U^2CG&-VDH4ZYC@M^Bg z59-_6)-lR{es!N6=#ZKEd}>t74N+t94#>x%?F!x>!M@h(UTGQm(#WGKF}}d0USpr7 zeWM9Zo1DM}0O{`t>{crnmwObQ8FWUZM!xQm67Fp#%euf6 zbn}K5E5|0Tcl#d|j5D8~|8_n#MsaQZR#g8{G>dwJ#oJ3h!)qr`x3A^xjpzv#l()qC ziFrfNQvlyW@y(~vAga{6lsMk@BqT*rm{(7E|384Ka32SCX$l@}M%D=o+4OA7+i zi%nP_c)Gj}tx`ZH?qD}ExbfH;eX}Pvs4!TI%J0i(FR@(8so+p#zCs@&$q zr?-bm?NUA!&K^>?u8tk z0Jj%U86w>=v0;hfnO9={-o|lNd8}}dwLE>>z)9gtd9jsXdE6`I*B|pKCE31(l9H$V zXc*}~9^dJ3K6;KeSi@C8)OQ+)0&9WM_RpiJf2AVt#Qj9*jj_I{C6?vE$T4hxY;Ckr*{kDHgpgeAb9ZT#rW_(c#-o z6Op60L}1EIj7?7D7|VNM59E z?kSU${IKFy@Q(eI#y(Jda=MJY2fO>^IgOl=^ z@!#>Sq21M)wTKsQA|g`uo9Rjnb~}Mh<@-Aw8ajv6(E-yJE&5xZdIOg;lVt77p-|}M z5Ajyza;{?IBr-dx_PiAC?dFbd-rCx_Z)ztaW2YB}r>-2H{kZCbl?(3ooh#h92eqks zoo`-){Xk5^lLp$0_Qw^O|3){H98LUnOf8q{+i}UGRcufNm3s$HrNPA-`x8y>=KB}Z zhF5t-#7a&@nb+ge#`LK0kW75IuIJfIvC=)oc$S*Jo&B`}qP-dZ}lh;h&V&;8&^3C#G>wkNqcp|2SxwDz`*x6ZYq$yMuXdY zg|)o%9e2)<;%Jtio4hE2#M9#)F5&{1t?P^03+S76BIZHQk||wTtsLK8b@}ktDR3(@ ztff(wK^0&rFl@bhNl~P6%(%qI^ZfRv*|GVFp1DQY&F~7dO^5*L5JHZxGM6qih)-)@ zPtyb|z=#sC^&SA${ehX|^5rFX30}FPT8qrC#us}p@%>*VsmnP!xH@>%tv&_!I_jyE z7V4dnxjq1DCu_3Qu*lcNIXZlZ6EPB6FU`|WR`-?Gly4%B8pncaBKL^PikBehUHfjat^-5IcHYT5i{Uxv!C0&Y@3!hjkH4KbL18 zO@}5^rQc35RwdI)zfGJI`i@St*N~ShA%%m}aPjpnhR}>v%8vnMMMDfqHYyhS9Wn2K zB6LuKcaZO->TL9)SN79Xs0>(Vc3lDa{R)WXrj zDvi;EeZNH{8C)^KS5)LxiOcMYYk2XJi|vFL47OaAOzEST!=4t$7q3mr#)9IyN(ydp&DTdcUt%9t>6p&wX)5+3}CSRnZ`ZW<>Q zUGpXO8WhN2OdilttXh+(R4OR)2!)QY3B!jgVylf8R|I3FvaE9Bu3Ukd309$_g3Hkc z%;YpY_WoJ@Y`j|fSEOr6Ux}(C0;VU1K8O z;(1BT6T|&BHuw2+g7H(0y~q+jPQxAIA8W3n@Yp4e*Ej0zQEQW&L;wTWvS-m2!rQdx?3tNj@dMmc;HU z#cX|#0|^N*RC46sk-q>!e1tP3Yb>|SsVIh37i9W8Q}QJulAvw1TnW*P`rA;cp~$t!jf^c(G5!@?{%0+c5QD%FIaE@9d8i#4lb)|_ zI9ZxcYQw*SOH5g0aOu1Vx~B_x_RJ%HkyQpZOknlwo^swHG}A^8(t3AGi>RbV;c{uPBZWFt7ThM52u{F@8#|AxJA(e4UJlRn$;J zD$~#?cOMO%P*E^i$I3=eV)h%spxV4i+HMG>AN~|)6ih*M;f^TbJ;PJI;Eb_H0jCl#W1L0z)++>j72wZ$KY6(OH>8d| z`ow~Yu61z5S-9H_iBHu!*b6!)^ZZ;v;m2M*H79@r9~&=SKn*|SlNNssM6Zoc4`{I_ zJBX&7Rz!P}ZzsaVJn*3vL!o%U*F$q)Vq#*&p%DUW`e5rDm!XtvBb?wtDV7&i%ELY* zroEYC^Mz;zm^yQXP@du1Wf*UJE4Be~t;Xg2(r(RquWhWFx##iD#dExz)9yT3zj{Trn7TG1Sln*NC;aISZ!U~pqa7m;rjT=+X!FmWR7Tms&3Oj5qu+QY z_$#S8#iKv_I}T`rMICEHGd?@h>E@bR)Jyn(;;u$8)_P`^m|DQwr@Vin9N8cj*&|{k z>!PEgVEoTdd{9V;!4P>pI}pE|Z+J->)VBY>k{4O<8S?`mxAOr|=*gW;sbLZIQb+c3 z2-1yHE;i4`qDtIEf_fA8=}}M77n%!iuhD@q4sHltU%`qNm|}VnJm2=?0CPC-0e}|m zw_k6k=@WlLX!l_ynEuSsevqkeMJ_^G9$zPhA#}^YM?kt#yQcmD0HaijoPu7G&-v%1 z3AnvuGxfv?>CrS5rj&TQ7a@UbFSIz8@g(X2U{xLhK59rW_^e`1_`!85yuB}K7+-1L zprnl~*^-IWSc;Z&u!H-}T5}+lw-fW2e3?OQz)aOVS)hcH_(gUIb6?v>!+a7N*w_Nz7>JeWi^u~(BV1 zkYt)|s*$cwAR2X(z}ZN1ceL z74QQ~dR5Nhbe9x(%rR5fL-Q!}L0mG! z0#gXQg^cZYzh2a}h=|r3t&oDso&lgIRZ53k)&pSBZ{*C{n(v%HBbgqzOC zJArm9k_R*ThGtS5w8m=B-Xccj-`KZaY}3!}k&)mx=6~pG%;Eo)b;KH?Z$AS=FWhhW z+Kb0bLv^M+v{V_t2U!-<=Mt>XzY(#$DKm3BQOl(+mhTUTuQ5}afnuoqH0?hQ=nUPc z*bgW*ogEh7zM9936i}u)vo~XTMyB7z@QMcqy)gO#5XJps{=}10nQ4ev?o%y8@o;N8 zQ>rA3nnvW9O$j6}D=p119;VJO)KL3N;*0?^mDADU=T*scsU4hEMdPy?b?k)z4|mgV z?nBEY?01->sDT-&S(puWojkdq2yBr2I%%nbdIX3Uq<`+h`c49e1?DD&Z$+rXr|{7{ zq={BMq*figA!w1>j6YF=M zR5De#2T8i`9<=6;AERrfqYJ7f0$I8p<*tY_fE_BwuDY5Pi&8qJda3tg=|4Vv*GaJ_iF+Qxqdl)@tHhXAH4R~9k7XF-1hOMZk%NC9k4HI+whrAB zJ6vh1bljd2Xk>%)eddQRz+wIkdUoNaC3eC&-;Y^As^^0*hZsC#!&ehMDw}lMizw)Fm^#XjMcJ(qB4qhQ@qv-QaXqWtD%W%$oZ)`DioD?kObb_8d6HJgPRr( zQz^LPIZXe!Y(oD%ba=2wqzXQ9<1l- zCfh!ariPsMpv?Vr-g3Ddm>UaBUFOp@`ed~^fgS`xfS!*d>PtY~CLM|C`4y7y1HH|w{>CtM#SGo%v12ozy z%P^SviNhdG(W)6HlYk6XPUUM#qBQ)_*s*uPP6(rgKBvA?&D1JN7_W_&m(oay)V`ZvJS+~!KB58QejjZ| zYR}T2r@oq>>K12#vliuQs>oR6bSeO5IN(t~6<}r~PRlLwB}`3C3*f2w($>I0c#gh6 zFHdqo18S3E7URB-Q_GLfuNb3p7)wnHN9o|sJyAH+c%pWE;r^U&R{68CNvhu{UW7W6 z3#XdsSfIz0Wo1m2aGn}*M0|vY(mJK`wIef&RS{-#)hV};V}N!#YDc*?4c5E%_u;`^ zU@-fIn|5!1^R%x4BU_Z*u0#LYag<*qKF{4;6l)t0jkthLg1D1Afb|(z7+5jHT&5_a zRGMxkva1b_>4H>eu~J{euRZ`UrCMc3I>kg`eF}zFtge{hLJ~UPaGD*tv2{j;B!pI? zQVU+OU|&&&u(l*5Y(T{fP+88RxEsdtpE0kEv%pNb_t0K4x+aF2VZ{@Me^|R*QzT&~ z(M+C-i^8X19FT6JYWO(6YmqJqA(#G0i^1r z2&A4Y|9WL1JYdK_VcPIi93})e0H#KYU};2(#(A>-NIhX{>MW@^EC6guL?0mE5svUg zN|C?ela4TpKmTXIqbS>P6)Fm;|k(m!2z!dJOdBal6-XCXi=;jHjg7MSLX zECeg^g1=pRHloS_Q01}^0G4qcWK;PMfEVY8{XgRIzhZfH5Gn?I1;F-K48J>sBY5De zJUy#_^oFY=ot_iC4~I$96F$z36~@N`v4HO0K)tHU&B-Ph=Kv&2;3i!Jz;VHoaVpJW#I6@ z|J=)yrRf<(iUFSp6@KmkW5LFUudp;CFGAjh9Hb{)(*r%6wO4cv_S`Fs1)Cd=9I+Wo z7_wQ%MxKvPo{b0q$m~v>8j^ngLERAH**qs- zp6}Kic8b*V&)P--88|b{f%qpxJbMvH`cp%vp;Wha_&cF6VjLz#UL|Zj01$j6-6@BW zbp?8TGM!t(?$M~unw5&ehA_y0F``1rlDuzR0gY-PU6J|nDs|RB_6|eQMs$#)IwN`FsyR(<(B zqMJLW$`k$pds+_v%3=TBhvNYdYf>N4IsRsXc<6jp{qagGOO^!+;j4X58|kzB;q?^j zFk+1++UN}Wz$%Fd zEqBK19XuQb1jEl#(5^S3o_yhWq+o#d-Bv)YjU3gPzvvdGiJUK#tT~i{upfTxEQS#t zH2`G+L@EfTSG;+YH4b9>D^09svLI#AH(((hP;QJTj>t93!g&Elu)tshSs!q)8Q#FD zT{EKGNYU)jfgD1l^bw>e$Xx-4sb|gMU|R+iQ?pkBl?4(o&?D3YCdULU%F$_Av%)-) z_l{UdpqBN~;9!7owOPWHpH)>-PI?y0IW~rQG)AZfd}s_0wrWiyk5NM>1)virW3cG+ zz}4`xXj$Q5Dq-(B^O;|y#|oEgY8QWS6B$rz?sI}6xMA@;jR4E=v7YZfqv$A<mok)PsD1L^q&9#KKiXQ69OKNX?pjy(K0 zwlN3m!!7`V0dcl`PtgCclsXU0j3ounhxW(CCuF>>WYDCSXMB1d9JmT-yV5^Q<7D)C(_U*E0=s{cW2i zYvR*hyzz8h-UFa(I>Icjb@SBkZ;y@Y+%QdU_!!y-9_;4q0We*T-t?g|w_*>5K$3?? z)}$knBvRu6q{K3hy_XS>9buDI8Axqb|4Kg~iN`4wnSwKuAo>1J0uK03o##&q4g&Mb zK_RyCdOp6X|5f@VegM>G^uCI^&Ae3^9$@IOnd+%=bOd9M=?>{PHa2EvW>k!fjBKQT z?KTjq_^v=y)1_ox>M-$D3xYRdMU_1#&k{45x!p6s$ik`IX2>$ZXL7m!B6^e{trHa0 zP#&D;l{yGWf89ek!hhOMT_Poy)@17nnbVxtfgMM^p_a<(Ml`cmVW;dB&t zNn4f1GS)o!7w^7oy~Ss27O*`hk-`GjjN-w@loA9C2HO!(qiXQ;ASc{4uyIHea^{%R4|7K|2lb)=IDEHWdz@)7+ z(w*Iu=i@W#f_qkNkiZEKgQ^Ru(fMb7Ax{u+S})ly zv~SzAA|hXyc`XFD3IsnlG^shg%6xwl>Us^76zA}ub^Gy(7%SBT`^Ws@D#2d+0Y%v+Sky!qKBft2_dZ!bP-R zzWTn;6Cx0Pwd_nh?sGaRrrzT8w)zG{Wa&|dXrq%nM6!08w-!hNPV z|MP4+=i+mlN5?GC*-UcFw{^VNk=lDWU2GF=%Th}0%uhhJWnRi?Gp?6v@Po82!^ZPK zsjnwOjk72t^fF2^hmznib)KJ_tTTpEB0<@oZ#P~91)ZOo>iYK+ZK%lD#7<=mD@yZU z9(4(@ZUEO4PiO@nd(SqcFmy>h5B6LpLbHq!Oe<$7#3*Y!yoyNO_@O5{>U5&F9?rka zJzn^fJEV%9JOA0qI6Y(wspH|V>!7eKjcMMoRfeLH6h{HiZ`7XKKP|HmTBDM=xhHh7 zFSQD~y~p={Z#@7WrEb&!Pe6T)s@yl=G~$>IT5qnxBhZQ+M}f0NWXLgVw#!Jv>T@xd z6kUv(uGg1{GrxJRx9fK@DsMw=SDd<(u4f=wlTz9G9tBQCxEn;N^|^b2y@8@{&W2Xh zowCfHG)dv4kEU3c_263Ad)&TSC7WC=cxkXD_ya2h{{nfzOuwL%tB*wZZ>jVVb$E!( zPr=c*L`p4%I+smHWXq3$J9L6lQo+v(U%c&433p#T@eCiFJ=)JQb6E;rW(igo!&@fU z&hcIO5tV)#bYAot&5q6bbQ_+`;KTiMlDl#CO*?N>pL{I$mOR9pIa-b*e-t_3{PJwfLJ(wSv6WJaPwgX@Ly; z*+q3DT`Y`%e8SE4tDwYKCYn`8-@UKfB1(n248ZKYUTp3}*?J-yf0+~#g2qWP!kR6& z@yeVp_){m(a*Of{_C)C9sH$InwqjuR1f59i0VmfWTfg1deAt4X`AnWFthec*LINzj z*JsOyL>4OfFH;WbN6{RkW{G-$yPMl&c4#qH7T$Prm#}{ouH*bs9K= z@a!GxsVT(1#&4YD?f@r_6AH?X;{;(&%2bXz2hl%D@!si0@+Ld+AJ+T>w10oi0Lhzw z>dM4+AYcA)xwMjo{(0#3e^r)=FAFt9-rYk-PpXGsKD{*gS=SdVoBWdI{Y%I1Kcl%W zIc2CXYc^$X(JqCz3qmowmM4qiuY#^V_ujmH004EiHXeV!YPljB3*}4>4ZDAqvMtNE zD1A$`ZCEGyv)yK7cKY`1J|otz%`evOhIKu8rTcIG{UC* ze1vM48eI#(j2(K#_k@g4Ti%K>koNg?_H)f)*8ZPGKKP8K7D`r68D|$D*Ut1g9=y<=;Lz?Wl*$QC2=MY86XJEb-*aRi?JC!SX4q2sh=;hI5F zU+F_JP##0j?xvelQ}gZ*yzfsp?>HKA zp$81%@`6-%O3FR9c^1b66nX$-`_Iu6;^D2i9jVRkt`&`@H8{9}P!Wk8+NX;anKpYO zS>jUNTY_&)KdL|zJeaz>U(5DA=_bj8%_(W5tgTqKa`Co143r!L>v#rEdwaO-?k2fR z@EMuEiG(guR~EWkSyz64t1t%>NCN@^Y9Q?R z_X7ZhTW2SnLquT~D&|rZHB&J~8t%(JFjT3*s>QHt`GF$oKF+K97#~F^K9r(rbfin- z@)tn*>yxQd%q!K(_+LaWnM|YU<&;Ju?S9=ju0qXT*nUX_svZju0R1((3tV{F8oRi4 zDKgxMGBR43ek4koQ;CJ??#2-M8B;|qMbl{DHObnx0|UNLYwxk$oS|F~YJ9IKuVwFW zD2Lr|46~_Wu?Rf<6}QC@fI?^59LZ18XJO(_^Xg48CH`M1NVCMmzFR771?sy#Ol5H5=oNxu&rl;&39aN-S@+{>~RjU0)R+3F^{fL)UH_lLP6&l=ZyGQ?wq&vXk$9&bKjb6glBzo5#>O$3Eis z@*H{|O>IQN_DZ-2o*ar}9#-wr1)~@d!Wmoq25vdX>j_TheY(WnJvNGxD6aSg)MTxj z?9F-oJ@VgpD%-EJzED;L$9D*{aX7jfmpX6C8br}Nr9_{;uV4f=W#Mkg_D)*^brf}`ZQoKEe&FyKP6}(n!ltjF!Ax8&}%7)^;%Ix%d-38@`&M9 zkHALHMIhUSIB=Y|fpT&BMXIL|?fZ%5v74+!8?R!DdQlJVqvD@5VCjixQAD)w9Uyf+ zDu-UA?|xCR*Jzg>Wn0L8)13UM*7Auidf)-Dl0R@aWoyc&alsc=SaH>xTfYrGS9teD zBa>nBmLj%(5^gK&%e4q^p)>q&{77PTl_BZyAe(RS#9ewOZIm>D`+Yl9K&6tUz+el@uVj=l=h^G zyQ1m!jG!nmaRcg)xz0FiwjG0$JpFX;tjp7zoQ4adk3~Wx- z9RK%O&$C|^vrg#D*Hmbn#O5qUU9;9ySXQz|KX*qeh#;W9a0F)5LUPB93+cZaZntbjP9$%kc zDOX}Ic%m2xXVK9{S|F35z6XG+FJ4>;qt85PjoXgl8`;BK$3dnJ`;4+60|N&oxdh_c z?9Iw5fL{#*t-Fy%CYQY)r%AZqsGzVRGfzzKOI}N09NjM*t2U+AFS?cBKai^l#F0ff zKRoHgT^`vSoom1FdXVWit@dz`pv-0^IL|IVM?~OG3ByPM^C^At>PxejZPWbdwLT|0 zs5{>5t6yq))1W3n-O8GFe5-mL5D4sP&*Wib_h4ne}vwprRc*0Um&e-h$_FQ`kO zrhgNo+y3IDN!w7^pD+B8Ou%Xz+NOT7J=IUcoV-WXi>!)=Re`aVnmpde)(F=OZZFfk zjU^sxP%NwbT!urN)B2RL?Zl+tHTXKABN^4&-HYHl>FHu1|7&iBmTmGt94>!CI~_Ih z;^i!3JGMOtDV_=cqDRt&(5&L;bu2A4^^RWKMznXDc3e2liC3M%`N@%V{KlCy?pqCj0@Ow9Wpt7?4y`NJ z#@o&G@lrxhX8~wN97ps#WnE=w=AJB6B6Q6v@_c|MoXTu*4h8B?6+NMPZ3n`Nv!a5K z?5t}FhPFqk%jx=Zy^R6T3orCxN;MeA^64>;zK9PTqEb|PD?W6$*6h5$3~_-(R9Iqq zr&m(UwomXVE3q6_j5__^eTnfIW5ll0cBI0RyMCOYq^RuW0l>I;Pi zy;3c<%RF3BvG>x`PF?}IF$HYli<1IBj-ejL3VivB?r-U)N)0b?bi;AH@j1E$3rNo( z`B$7hScOtWsDAQs(ahL@R^IIe1GhIo!q=97L0^8&i0puXK0d5PVbd@8pM=Dsi}A+! zcyRssG)HeIskOd~e*=^qp;L=S=dc7(EDo$a$*n;@#pNu@cS0vB$$1Iq{ z@=#fVc8R{2xX;gU3Xq%O?H(=jYi^|IJ%*}%7okQcP`17s2CBWYb?OVXi~D+7OQt=< zRx#-_apljouis;`6`LHA8us>@dUBs6r@}2xKYNvL71~K+!S|aIVSd3LlX*X6+7igK zY^8|tliNm%lCQ7=>()?J9>~>hr!kIeJbHOSo4b9O%YjX9A7@))rdFk2zftzWnmERP zNG_V+|Lp~u=T8*9n=GqT%jFyVFZ!2!#{`A~H+G}G%mCt&2Y}Dxe2`SHLA0(( z3^l)I|5ULhnh%pds*1I}$)d3}WqNUf(|!V6@f-I%H(3y~N(F170ucr>7~t9o7B9FQ ztqoOb{NmGP>DF#aZEQ{AU{dMD#OJT3nITu_@yNx4B0iy-WVQY$uV0&NCAwW>nfRc{ zC}__)@lA?W@F1D^0?9xedfdC+Jn8rQKQb~`eU={EP0#S{BiPs zT6?p}zSO?7@!@|m9Bfn@ZzAwh4^XY7g@K5$U1$^!L22;m`E@sS0*(=ns>rScD?)pY zsh7_+5cQVTi%e^dKCk;5t%&aAMBStA1lk_}Ikp?0`CW(bd~?psE9t9q^ESV}DlpOi z_~<~$@0-O^edDfv^DE6M&oQT&e%gw>BUZx~rH0jUwMxy#VBfNK`CRCREtI$!1bf+Z zu*Zc>j)`G2(tw(fdHRUoEN>}p2|{=`f=z*+&2Mla{!0IJ_%YIj@<*@@ShA65wh!R} zQ}>d?TKzK3jkf^LZS{_gIDGWYf!X&l(5z7?PLTdP6M6p#{i8%_e7SKi3ztflS5BD) zq_LQ}u5Yd&#UxV{H{U38g)sy(v!h>`=T5?3fISFz3^8l6xUR#M1xSAYu_7vh1LMtq z{9-V~@S%0!V%|T(Sg%j$BAy^Jve>}}4a=z-miOO8Na!do>wyo7cPkb90Cu8_h7Ao- znsvvv@2&j>$fJytG8&A2;x#vsWc06TJa*Q@7CiQi_r=RWHE!o7ze<= z6;rxqtZA!~UU>rI(EGDYO+WjG3~VWl*xI!#16mRi64{-JftQ=RG9lAmOv+Yxy-M$2 z4+Kh(j__I79aqT{Mhx6gizlv*=f0DH+?k-GYmT2YMboh{V*V6VRaOqnR&z>96tP_V zY~128C^-WTXD7cKg3C!#7gt4@kW7{fZR7yFK5GhI;Ah5BTcVf7o8{u)@7MS~0Eo{c z4}D3uH0o&M#1ktPON2!X=&rBxWj~{(4`F0JeE>iJ5v$knitCx?{J;D|^R|Ds`^U8< zleFYUwm*StQ_MmXMujgpBN^vT-#cUTE7|<$R&uyaY3{;(0GxMua`y>5O^VAP_d2eB@|z9V#-AdVqzV6PCa@GIS{J>z&MAZP#%>#}QhOp4 zc-ro_KUw9sTM*qy1JNtrRWq;*Pd#hD`yW!a9Xtt5*Pwyb~AsXiK#1^XQ2e;O2Ap6 zYeFJJ1&s&d3ZYCAW(?V|yK zbZ0CX`->e;++Dp$9z#Rw(Wj6Xoy>inYn=l^0^4Dpi*m_ZJs=T-IQ}vn+dMDK`o)fM zPM>U}Sp%T3kXL|$zPSL?b`BeWRU`9rmtp0-^u#4(yzMHaJch{E#_+x*hM@$(S=|GI z@|EJQOK-A{q3cWZPihd<&(@fjDN0DUsK`dJt4PMX|zePjLEH{;%n;YMnKIl3X+ z+U1;P?LIMdBOIof)OxXYoM?2cSLA2|s(AJ^mC0tsYuII6mFaQ{ur6@*?upIFn_da| ztq+1P^JgCUHBtD-H50N1XzZXi@Zyt1XlB!m%-d@^S^Bpns^(k@=EoO*14+i>JDZZV zDA+g>xbXbK(eV((8F9y7#O4JNf+WJiPj&^1gm=1321QR8v9>>(#1Jt-!)Ug-_zk;! z$(e_|sQ8^uNYzV2R}>vu=rLYYbSWQI)$zlP3IT zJljESO%2P?U=1aRJgJkq{$&#mir;!{2CI%U&>E^(Wnb@e9h!?2ivV?tTa_ zzOVy@$fW(wq&*hcOT5FOSiUXhGn-PjhgQ>uKN5};cmPmPgZROhxRQNX z1^k2mJN)PTCx2J(0KWgGKK`8YBq}QW|8V}(U;O9%CqZEW2!J0VhhfAA0f!9VyviT?p)sw2Aq_y+)2V}!^6 literal 0 HcmV?d00001 diff --git a/internal/docker/docker.go b/internal/docker/docker.go index f626e4c91d..04c2535bf6 100644 --- a/internal/docker/docker.go +++ b/internal/docker/docker.go @@ -5,10 +5,17 @@ package docker import ( + "archive/tar" + "bufio" "bytes" "compress/gzip" "context" "fmt" +<<<<<<< HEAD +======= + "io" + "io/ioutil" +>>>>>>> f39aba58... feat: use Docker copy to transfer binaries to containers (#1136) "os" "path/filepath" "strings" @@ -27,6 +34,36 @@ var instance *client.Client // OPNetworkName name of the network used by the tool const OPNetworkName = "elastic-dev-network" +func buildTarForDeployment(file *os.File) (bytes.Buffer, error) { + fileInfo, _ := file.Stat() + + var buffer bytes.Buffer + tarWriter := tar.NewWriter(&buffer) + err := tarWriter.WriteHeader(&tar.Header{ + Name: fileInfo.Name(), + Mode: 0777, + Size: int64(fileInfo.Size()), + }) + if err != nil { + log.WithFields(log.Fields{ + "fileInfoName": fileInfo.Name(), + "size": fileInfo.Size(), + "error": err, + }).Error("Could not build TAR header") + return bytes.Buffer{}, fmt.Errorf("could not build TAR header: %v", err) + } + + b, err := ioutil.ReadFile(file.Name()) + if err != nil { + return bytes.Buffer{}, err + } + + tarWriter.Write(b) + defer tarWriter.Close() + + return buffer, nil +} + // CheckProcessStateOnTheHost checks if a process is in the desired state in a container // name of the container for the service: // we are using the Docker client instead of docker-compose @@ -57,6 +94,72 @@ func CheckProcessStateOnTheHost(containerName string, process string, state stri return nil } +// CopyFileToContainer copies a file to the running container +func CopyFileToContainer(ctx context.Context, containerName string, srcPath string, parentDir string, isTar bool) error { + dockerClient := getDockerClient() + + log.WithFields(log.Fields{ + "container": containerName, + "src": srcPath, + "parentDir": parentDir, + }).Trace("Copying file to container") + + targetDirectory := filepath.Dir(parentDir) + + _, err := dockerClient.ContainerStatPath(ctx, containerName, targetDirectory) + if err != nil { + log.WithFields(log.Fields{ + "container": containerName, + "error": err, + "src": srcPath, + "target": targetDirectory, + }).Error("Could not get parent directory in the container") + return err + } + + file, err := os.Open(srcPath) + if err != nil { + log.WithFields(log.Fields{ + "container": containerName, + "error": err, + "src": srcPath, + "parentDir": parentDir, + }).Error("Could not open file to deploy") + return err + } + defer file.Close() + + // TODO: detect the file has TAR headers + var buffer bytes.Buffer + if !isTar { + buffer, err = buildTarForDeployment(file) + if err != nil { + return err + } + } else { + writer := bufio.NewWriter(&buffer) + b, err := ioutil.ReadFile(file.Name()) + if err != nil { + return err + } + + writer.Write(b) + } + + err = dockerClient.CopyToContainer(ctx, containerName, parentDir, &buffer, types.CopyToContainerOptions{AllowOverwriteDirWithFile: true}) + if err != nil { + log.WithFields(log.Fields{ + "container": containerName, + "error": err, + "src": srcPath, + "parentDir": parentDir, + }).Error("Could not copy file to container") + return err + } + + return nil +} + // ExecCommandIntoContainer executes a command, as a user, into a container func ExecCommandIntoContainer(ctx context.Context, containerName string, user string, cmd []string) (string, error) { return ExecCommandIntoContainerWithEnv(ctx, containerName, user, cmd, []string{}) diff --git a/internal/docker/docker_test.go b/internal/docker/docker_test.go new file mode 100644 index 0000000000..2451a8309e --- /dev/null +++ b/internal/docker/docker_test.go @@ -0,0 +1,83 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package docker + +import ( + "context" + "path" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + tc "github.com/testcontainers/testcontainers-go" +) + +func Test_CopyFile(t *testing.T) { + ctx := context.Background() + + containerName := "server" + c, err := tc.GenericContainer(ctx, tc.GenericContainerRequest{ + ContainerRequest: tc.ContainerRequest{ + Image: "busybox", + Name: containerName, + Entrypoint: []string{"sleep", "300"}, + }, + Started: true, + }) + assert.Nil(t, err) + + defer func() { + err := c.Terminate(ctx) + assert.Nil(t, err) + }() + + t.Run("Copy file succeded", func(t *testing.T) { + src := path.Join("..", "_testresources", "dockerCopy.txt") + target := "/tmp" + + err = CopyFileToContainer(ctx, containerName, src, target, false) + assert.Nil(t, err) + + output, err := ExecCommandIntoContainer(ctx, containerName, "root", []string{"cat", "/tmp/dockerCopy.txt"}) + assert.Nil(t, err) + assert.True(t, strings.HasSuffix(output, "OK!"), "File contains the 'OK!' string") + }) + + t.Run("Copy file raises error with invalid source path", func(t *testing.T) { + src := path.Join("..", "this", "path", "does", "not", "exist", "dockerCopy.txt") + target := "/tmp" + + err = CopyFileToContainer(ctx, containerName, src, target, false) + assert.NotNil(t, err) + }) + + t.Run("Copy file raises error with invalid target parent dir", func(t *testing.T) { + src := path.Join("..", "_testresources", "dockerCopy.txt") + target := "/this-path-does-not-exist" + + err = CopyFileToContainer(ctx, containerName, src, target, false) + assert.NotNil(t, err, "Parent path '/this-path-does-not-exist' should exist in the container") + }) + + t.Run("Copy file raises error with invalid target subdir", func(t *testing.T) { + src := path.Join("..", "_testresources", "dockerCopy.txt") + target := "/tmp/subdir/" + + err = CopyFileToContainer(ctx, containerName, src, target, false) + assert.NotNil(t, err, "Parent path '/tmp/subdir' should not exist in the container") + }) + + t.Run("Copy tar file", func(t *testing.T) { + src := path.Join("..", "_testresources", "sample.tar.gz") + target := "/" + + err = CopyFileToContainer(ctx, containerName, src, target, true) + assert.Nil(t, err) + + output, err := ExecCommandIntoContainer(ctx, containerName, "root", []string{"ls", "/project/txtr/kermit.jpg"}) + assert.Nil(t, err) + assert.True(t, strings.Contains(output, "/project/txtr/kermit.jpg"), "File '/project/txtr/kermit.jpg' should be present") + }) +} diff --git a/internal/installer/tar.go b/internal/installer/tar.go index 26d0288165..66789fe9d5 100644 --- a/internal/installer/tar.go +++ b/internal/installer/tar.go @@ -78,11 +78,6 @@ func (i *TARPackage) Postinstall() error { // Preinstall executes operations before installing a TAR package func (i *TARPackage) Preinstall() error { - err := i.extractPackage([]string{"tar", "-xvf", "/" + i.binaryName}) - if err != nil { - return err - } - // simplify layout cmds := [][]string{ {"rm", "-fr", "/elastic-agent"}, @@ -90,7 +85,7 @@ func (i *TARPackage) Preinstall() error { } for _, cmd := range cmds { sm := compose.NewServiceManager() - err = sm.ExecCommandInService(i.profile, i.image, i.service, cmd, common.ProfileEnv, false) + err := sm.ExecCommandInService(i.profile, i.image, i.service, cmd, common.ProfileEnv, false) if err != nil { log.WithFields(log.Fields{ "command": cmd, diff --git a/internal/utils/utils.go b/internal/utils/utils.go index e794e05f1f..c7a81d1bb0 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -7,7 +7,6 @@ package utils import ( "fmt" "io" - "io/ioutil" "math/rand" "net/http" "os" @@ -21,7 +20,9 @@ import ( backoff "github.com/cenkalti/backoff/v4" "github.com/elastic/e2e-testing/internal/common" curl "github.com/elastic/e2e-testing/internal/curl" + internalio "github.com/elastic/e2e-testing/internal/io" "github.com/elastic/e2e-testing/internal/shell" + "github.com/google/uuid" log "github.com/sirupsen/logrus" ) @@ -420,7 +421,10 @@ func GetObjectURLFromBucket(bucket string, prefix string, object string, maxtime // It writes to the destination file as it downloads it, without // loading the entire file into memory. func DownloadFile(url string) (string, error) { - tempFile, err := ioutil.TempFile(os.TempDir(), path.Base(url)) + tempParentDir := path.Join(os.TempDir(), uuid.NewString()) + internalio.MkdirAll(tempParentDir) + + tempFile, err := os.Create(path.Join(tempParentDir, path.Base(url))) if err != nil { log.WithFields(log.Fields{ "error": err, diff --git a/internal/utils/utils_test.go b/internal/utils/utils_test.go index 1d3b25a802..5fe19c901c 100644 --- a/internal/utils/utils_test.go +++ b/internal/utils/utils_test.go @@ -4,6 +4,8 @@ import ( "io/ioutil" "os" "path" + "path/filepath" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -213,6 +215,14 @@ func TestCheckPRVersion(t *testing.T) { }) } +func TestDownloadFile(t *testing.T) { + f, err := DownloadFile("https://www.elastic.co/robots.txt") + assert.Nil(t, err) + defer os.Remove(filepath.Dir(f)) + + assert.True(t, strings.HasSuffix(f, "robots.txt")) +} + func TestGetBucketSearchNextPageParam_HasMorePages(t *testing.T) { expectedParam := "&pageToken=foo"