From bcb636dda4715f0e31e676535b37ad702d843418 Mon Sep 17 00:00:00 2001 From: Damien Churchill Date: Wed, 20 Apr 2011 18:32:55 +0100 Subject: [PATCH] improve the core tests to use a built in webserver --- deluge/tests/common.py | 5 ++ deluge/tests/test_core.py | 61 ++++++++++++++++-- deluge/tests/test_httpdownloader.py | 6 +- .../ubuntu-9.04-desktop-i386.iso.torrent | Bin 0 -> 28184 bytes 4 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 deluge/tests/ubuntu-9.04-desktop-i386.iso.torrent diff --git a/deluge/tests/common.py b/deluge/tests/common.py index 4c9f1769e..84722c560 100644 --- a/deluge/tests/common.py +++ b/deluge/tests/common.py @@ -1,3 +1,5 @@ +import os + import tempfile import deluge.configmanager @@ -10,6 +12,9 @@ def set_tmp_config_dir(): deluge.configmanager.set_config_dir(config_directory) return config_directory +def rpath(*args): + return os.path.join(os.path.dirname(__file__), *args) + import gettext import locale import pkg_resources diff --git a/deluge/tests/test_core.py b/deluge/tests/test_core.py index f56a95772..57991681c 100644 --- a/deluge/tests/test_core.py +++ b/deluge/tests/test_core.py @@ -1,5 +1,10 @@ from twisted.trial import unittest +from twisted.internet import reactor from twisted.python.failure import Failure +from twisted.web.http import FORBIDDEN +from twisted.web.resource import Resource +from twisted.web.server import Site +from twisted.web.static import File try: from hashlib import sha1 as sha @@ -8,19 +13,62 @@ except ImportError: import os import common +rpath = common.rpath from deluge.core.rpcserver import RPCServer from deluge.core.core import Core +from deluge.ui.web.common import compress import deluge.component as component import deluge.error +class TestCookieResource(Resource): + + def render(self, request): + if request.getCookie("password") != "deluge": + request.setResponseCode(FORBIDDEN) + return + + request.setHeader("Content-Type", "application/x-bittorrent") + return open(rpath("ubuntu-9.04-desktop-i386.iso.torrent")).read() + +class TestPartialDownload(Resource): + + def render(self, request): + data = open(rpath("ubuntu-9.04-desktop-i386.iso.torrent")).read() + request.setHeader("Content-Type", len(data)) + request.setHeader("Content-Type", "application/x-bittorrent") + if request.requestHeaders.hasHeader("accept-encoding"): + return compress(data, request) + return data + +class TestRedirectResource(Resource): + + def render(self, request): + request.redirect("/ubuntu-9.04-desktop-i386.iso.torrent") + return "" + +class TopLevelResource(Resource): + + addSlash = True + + def __init__(self): + Resource.__init__(self) + self.putChild("cookie", TestCookieResource()) + self.putChild("partial", TestPartialDownload()) + self.putChild("redirect", TestRedirectResource()) + self.putChild("ubuntu-9.04-desktop-i386.iso.torrent", File(common.rpath("ubuntu-9.04-desktop-i386.iso.torrent"))) + class CoreTestCase(unittest.TestCase): def setUp(self): common.set_tmp_config_dir() self.rpcserver = RPCServer(listen=False) self.core = Core() - d = component.start() - return d + return component.start().addCallback(self.startWebserver) + + def startWebserver(self, result): + self.website = Site(TopLevelResource()) + self.webserver = reactor.listenTCP(51242, self.website) + return result def tearDown(self): @@ -28,6 +76,7 @@ class CoreTestCase(unittest.TestCase): component._ComponentRegistry.components = {} del self.rpcserver del self.core + return self.webserver.stopListening() return component.shutdown().addCallback(on_shutdown) @@ -44,7 +93,7 @@ class CoreTestCase(unittest.TestCase): self.assertEquals(torrent_id, info_hash) def test_add_torrent_url(self): - url = "http://deluge-torrent.org/ubuntu-9.04-desktop-i386.iso.torrent" + url = "http://localhost:51242/ubuntu-9.04-desktop-i386.iso.torrent" options = {} info_hash = "60d5d82328b4547511fdeac9bf4d0112daa0ce00" @@ -53,7 +102,7 @@ class CoreTestCase(unittest.TestCase): return d def test_add_torrent_url_with_cookie(self): - url = "http://deluge-torrent.org/test_torrent.php?test=cookie" + url = "http://localhost:51242/cookie" options = {} headers = { "Cookie" : "password=deluge" } info_hash = "60d5d82328b4547511fdeac9bf4d0112daa0ce00" @@ -67,7 +116,7 @@ class CoreTestCase(unittest.TestCase): return d def test_add_torrent_url_with_redirect(self): - url = "http://deluge-torrent.org/test_torrent.php?test=redirect" + url = "http://localhost:51242/redirect" options = {} info_hash = "60d5d82328b4547511fdeac9bf4d0112daa0ce00" @@ -77,7 +126,7 @@ class CoreTestCase(unittest.TestCase): return d def test_add_torrent_url_with_partial_download(self): - url = "http://deluge-torrent.org/test_torrent.php?test=partial" + url = "http://localhost:51242/partial" options = {} info_hash = "60d5d82328b4547511fdeac9bf4d0112daa0ce00" diff --git a/deluge/tests/test_httpdownloader.py b/deluge/tests/test_httpdownloader.py index edcbeccdb..7715cc6bf 100644 --- a/deluge/tests/test_httpdownloader.py +++ b/deluge/tests/test_httpdownloader.py @@ -13,8 +13,8 @@ from deluge.ui.web.common import compress from email.utils import formatdate -def rpath(*paths): - return os.path.join(os.path.dirname(__file__), *paths) +import common +rpath = common.rpath class TestRedirectResource(Resource): @@ -26,7 +26,7 @@ class TestRenameResource(Resource): def render(self, request): filename = request.args.get("filename", ["renamed_file"])[0] request.setHeader("Content-Type", "text/plain") - request.setHeader("Content-Disposition", "attachment; filename=" + + request.setHeader("Content-Disposition", "attachment; filename=" filename) return "This file should be called " + filename diff --git a/deluge/tests/ubuntu-9.04-desktop-i386.iso.torrent b/deluge/tests/ubuntu-9.04-desktop-i386.iso.torrent new file mode 100644 index 0000000000000000000000000000000000000000..b55c9aec1b427fe6477a1cccc53e332edf057c8c GIT binary patch literal 28184 zcmYeXuu9C!%P-AKPBpf)$|xx*u+rBr$uBBO%`4F>O)AYRDb-8P&$TkMG_%x)sWi7r z&d<$F%_}jov(y??Pd{zkO?c&>Mz?1E)(TkSvSH3=VdXpWD>ejr zgq;0j<>PCkYkc(Sw49o~N_wdV*Ar8!HoUL1YUi7S*+9cuUK$OyJl|0)QFwiCJ4-$zUJSbs0&XwPv zvn+!pQ}bo|KQz9q`x$S)x|3x_(8HC#Jua@8(O7D?plNlm^_vyj>O7ZtuFali@IXL$ z!HbA#cGv!WDdi|tdb=mRmLae>!pv~_DVbAlpL}MpIN$O5DHpRw_QjB6w0xz0spr_%`lBDF*XJl#p54qF=EiIEI`CG*RbIx8S6HtpRW;Y% z+q3(b*RlMg1vWA#mLI$@`-?*S%wJLgk4^5}JCem$*|gYOX>!xXU+$6b*Up@MS1WEw zpML243Xa_|8M-}>7JKg4mzNo_-Mo!|OWbdcA0iD3rS1A#=1;oApP! zvcl7JH$5-aXQ?o+Ts+Oca;Kz?>+U;#Ix0Vy-2@h_^|YJWb?2RHhx@F>meo3^MPFUs z{<{0bF8fz^)xL4;TrJhEir7qk5uUzyb% zx|px|ZrOU-E8JH^_xY`MnrPa#KL4wUz>NBBe&5~-aX&q75m2$kbyd% zsLQQO$EVuFJ}(nI`ez3F_ueZ%_Wyov;dA$Jh5t@hzw2{710S{IbFBTY^o4cy!6^Rh zyPkh^WD}y!FZp{e%lE~OuS(DM6!87aSp3rcAk%{z7L#MN&nhko=jL@Q-dwy>)2+30 z|D{{%0jHiuv$h=i%eHmPHM!|iBi8aaFzJ3TGi_4X`+n}>qdE(0c9mNfm#pky(!G|u z`RbNSU&J$OvNk63o|aDY$a%8z%Br(Vf5u6#DA9?}bE{~zDe=x+yr=v^s?Fr}1$WDy zXEA$-%=dE-ulduwStdbp`+E7NaO)z8nNv6n=l4iguDrKbH|1dJ9EqLP#q+j!v?U!9 zj9J$&ad|hZq~OYrLADA}%lG`B=FlKo;P6rW@RQjyI)D5ZSsfoAu((3CakA2>X$AM( z7HNLE#68tGyP4y_D{qr8nHwMUPtgtZc)q(}o{U)Wt0QaeC(2xY(lgEFh;GTIu5E5N zQtMNv@y?6X+z{Y;LBV*^6ULIc3mF3Evd_L0*U56)Wh?*6%`Q6id&>|0Kixm`du6=S zxkc<^yTd59Z$s^yKr8YLuB>BcYcxQE@su;Rn6*lnp4v8;_}T08?W{(-5Iq{G(hf! z%hza=H$gFPb>rWB%h~R5)V};&UReIW66u3SD~e|9w+osks&K!ccG~61XVpDQD~`2! zlyO)a{nb%&tzgODD!*0onAA4I-?@SZofdS*GaX%jSh(i0noIJK`QKuMNoj(@>kt%N|m$nTp|F1ITDFyph) z*SJ)6_ojsUk&o|V6j$zY4b@umV!eIAtM@Y^7I3bd5`8`G;^_}8%WSmGinhgPNgqC# zeaDYcbKez-um^PyZ*IEk$(b+eVE00A!KI$d`{U|FKcCMt7m;^LE}!&z&eIQ%w4Z1d z$4I?e#waFSbZO^Rk>)cTPLrw&I@Kp1nV6}nJ^L%)D$j=5Y@vr$C(L0?-+X8?$J_Ns z`H$cAS8$G+Ta?8ge<cR%OP6+T3aer{0H(`&UPOzr0@UwTMRcUBS4^*LYqmO-~o#-uOE6x5TaBehs$r z!rO^4%eX4me(&lppS9?AgiLbr6N}hA>ti+@`R3n$B;=5|YHHP||GU>ed2;)RHdl$n zkJE?EwAvCm76{b@d#zw^E2R2Q(2dM*_A6^+x58|(r+w&c%0+;x@yD8EcN${C;e)=wm>VS zNjYujpV$@QcK@$d+2}9cC@XvJ`m#8+hs;gw7VgzSe|;t^KAL^~5!>?%o5HWZ5;8l% zJM~YIaiR61Saaq4EnRC@TBar1`Pgf;<#x_q({uEl>AWRY6BUL3&Qbm_%?ch4+^mIEr7lK0GlaMcXp2a1P_lMX%39^|3gd z6l&Hib%f&aKb=V1a|y#79aY{joJkm$_Z1t*^FUSH1Q@@TArc zy2|-kwqL|goXpwzN?gMGqrJAPTxXRz)4E5(>W}7(Tk^9`{HgOfYmu{H@4SF;x1ff|=0CBs>qY-vzGwUTQwdYA z`5I~c>3@q>oNHOKQ)W$r;;EE#@>(__j!-^44oTx$cLl{-gv|wwvOlMszuX3{kQre zx7R}Gy311MWR~N0E6?e8)%VGqn&`Ighxai#4wuf=Nk2Dp?)FRnB)(nJ@3ha|(_6#* zy7T6}ov4xfeQl3DdqY?nr*i#qgI9Hv7F~IGS3hS{jsMy#HKxk6j+&$V2L-Bki@337 z8aNo_HWYAKmUP-?9WCGAWmP|g{rUPco@sp#qC2L!D(Bk%Jli1nB;}hMQB=xzugr{t z5&fs{IR|eM53*Ke_g)_v5p&4Az%f|WdjIcDj~_ez3zNF`;bmvk^u<}%Q-yS|U-{h| z9-VbEFXO^CUWR)U_q;h~(Cnj_YpEA-(cRry^1XLj%YC`pGX1QyMq|?+^K7~N1Ya5U z6n35KGrb<4nrYYjc;-&+DVx)u>`mNO%yZGIPV2F>KxAe}63cdz<+JYYRej{uuzJF^ z#^;N*n9Jw4AC&V;i+#4KczOT|J9Z{H(u-Um=aGx~G9u?CK6O<<3lm4)K&t}2e4|@aWA7Dw%oVY(a?0ZJS zgcF%of@kjTuKVef&nnV;Ldo@zUMl-`$#*@+W;g5q65gG&wTw%7)4zG=RC)hzWKT`Z zPB@yay!_UWg}owN#-m&~encV7JeKb`9i3L2cYmHa9=@9#nn#hG&oT9vkn1im%>^W@Ak zM%690(spNpl3prLWw`G2Zn}le9vxYaV{uYpSY;FJQUJZUfUgesPA z4~*Yz{~d3Ao6W5^?ZIDxqwT$F>WMcWnx>?w#%%Rz-?Z%chPCHTPqaN(5^}*AQDLxS{Ojoq){r1Z=cDaCb?j_E=2?`(#kX^%2l?0UaG zd%zYlbz4FI`HSW(40rUey`B*$^K@#+qEKFriwm739zS?{d&-LL&dGwCj%;2ae*N#6 zC$H)Syt=7B*XYs{iFZGC)vjvw%CGg0 zc=TIqX8iep|C6#(zJ zwKObR_31`-D87E{yilQT-9T^~c`c zbCKl}(pGQsKIy$jbJd|#wVF#w{x>S7&wBKB*`&Z3Cw;9f8&#&UgiU-Q_^{@)U(l?3 z*(;`eth&ebY@_oHj;`z9UgK)Hy|H#m-%Y0_#Rhjj70NX&*m9nyoWG-pH=e_yT*c3kZFT&CJ=+`G zI@Ono%`-65s}_87_1*eq`sukV9iQ)fk)y7<{DWGAH(Qu)2B-QyuQN>*g=%~XMf=q+ zM@Z~=Dr<$gP}(y>tuW7wRq95EZo=cW&6Epi!)jm5zr~LQdnYop7}jC^Sj(0 zzc&8g@Nwl?N1FrxPc6Na@^0O4$5nMo0z$XSPQO+(@>7_s6TR`s^<5F(@A|p+eOa}G z#k=3&Oi9)2xLZy~r+B2^TFTk6`w`=(lB<2&?`B;Q+b*{##p>@xkHF?%XPeCD^c>hH zaD0}1?#hP-m-sHnZ2VetdF{369eTx=B&J0!m>w#1RBu-8qe&hf4*UO}FF&7t{X)sS zZ3fY;CUeTq96k4Lt)HJ@(b2tMFO;_M&C`9>%AxahX1?{*<$i?*Z{wHDke}!(c&Fpe zx7xDDKUjDR(q?U2k8Qb-dXWR|Jk;_UiL?5 z7VE_=-I0cx_g0q5DSkV!=`x>o$<(fIM?d8kO??wKFKYJ!mL|JI21Tnij57rd0y^0b zD%b^Fudn@K+^|l+P9@gb+JC=FOId*?a?5qPZ!S)J&yrWyXRjyu?aI>od6HKH?`?GI zQxdQJWySy7QEK;cEteGsI8R;raX`fBZS8X-IX&~q-FC0?7kRw>V;tvEQY^OUgR1yWL>F!FXR;Uh%{2qrZf*7?OhT6~39)$n()hKzd2k zbV>Q+i|*>pd39BcmE+jSCksPwXjS$;cwa3Oey2OH**8D=x_$cn1yYZjQki>q_22Zbf?@6syJTjtm`AP7-_AK}lAs$1Ef8!MhV1U$^?Q>lFLp6y%tzPFJ~r=1s8`~7oZ-8}LC zMzP;6?*FgwB-O3^us^i)(9zvX{U&x;{n^FO$h2^7#C?aYxwYPYl|6f{V^j9bW=Y;3 zkusy=!1guo95US2Ja{R7Vw&__?gpMup8Kx{{#D))R$}DJJYFxEe%r*fQzxp_uh}e0`V`^v$JNNk^?(sm z^N%SuF1x-z(9La|Bl}XgxANuW;QNNNexH42Aak--L2K@tv{<9x%L5rJdS>)pPddeZ z?x$m6g}}-5``CV6tFr|FtpR!tA-9|yq)3Qr9KaRS@yJ3Ss#h+5HWWQHx&tDnV9nYNY`bFjV z4!z&stsnTU;}5h@oV#f4xsAU{&-m0-HW!-Nnpb&Aso%Ncr77pDduzj=brSb3Co$h= zPx`iIRf^TJ%IzF`jF#2!*&BZ{W6zPF`ECD;`$KqFCWgrO&HSsI^yIaYY0ZKMZCn2t zsmv75@wory?53w3$3oUvYUh4!QxUrKWX8sbubb*~`y7g{Gu+CZsg}EPdohpot_1&# z+*>CPd|D%(_oci!#6L=gr(RC&`o5KSc5!aEuQ~JGr>N*k8?%~Orkj& zW49DOQF-^Ifj`tC@A|gr$k=zYCQjYF?#SJPyLPI6S@4AO-K38;f`2DY&O2+)KBKYA zW&?M~&b9j{CmPmGNvmBoqh>?Y)Ay_Arre%fTd~?`zW4{;jlw*9Gb5&VdCP}zh>Cvx z+N2nhz1^!I@U7;j%r9>02J?39>@~`*t2)Tz8+x=Q5iLw)6m=3l#nO!gT5Gyi*) z$70U=n};(0-m&9%taRUR%RfneLi3S1iA^W3>vO#Lk|DQe*9!+z!NvQ2{h!mslY3#R z=F>^jCT8F6*lnIADY(PtURZEsK;QP?$8Gmn`hL28Wm(}a?;X2#Yqqp}){ByQ)X_MV zZ(oG%3lXD<(O3SQnR3bVNdo)Ti5hdYE^j;G!=ANW%;eF|-GAo4)=7BDc593GbIXTE zDq5M2a5JoW9(tdV+4lLGBWZIR4@{~^zWTmlSN5ah*1y=U`v^=3w7XLAWrvZ<<=>m? z4Xig`ul(fhrQ#EKT|M~L<0t#RS=>B#_UH@mY_~%a(LWy*9_B4{R6JetFHc2XQRlkn z8rCYc^QW8Lb`?rLbKS;rWR;EmYU>%Z&Iq0^DEhJPMAApAW$TTK-;g^)2sT{c6BX{A(RnIf`dnhk(7BD;XOOX913tQ8b?6;{BE8@EJUdK($ z&YUkbXTsH=AJP@}Z@HAQ)b#$iXZb1)T{Vq3aoYIMY@c0`dAq-~KAGcclegmB z%C0~DQyX=Y(?(1WlCRwHNSU)?@^WBnVr}QioEjQSE>nQBv`ZhyB;oRIC zURxW~?{aK2+?e^;URL)`^PDrG8v_{@E;jpTbXNHFubexPzHimtWfo2s5n|lBOO3bw z)5ZKFzSC{&^(@s(^>bH=xNTaq!bU`5^NHK#TfI-H9DF-?f?4L4=9{PfaBPKTfI@l#8VD{{Ph)7!pVtY7%jvb#6#-w*NOoqFz;a^_rBy(g)k?t6Kf zes*ThjF``I%j2kwXzmvEn2eZ90x_$d-d3jKCUp1AtoU{{ya*9#pkZZY%s z{qj@!bpp% zFF#Wsn7X>;!`7QEi>sc#_Yt0-{p0@mB6n%2bGco&IJ_feS@h;-2m(BU` z{T|!y3o%&mfhv$i{A?@8BP_>xXh52E2a^1 zzn4$s+p|sBH8$Qm^o-(uW&@aPJ?;O6~oUX8IAyZ_0KbM2U z<#ng)cI$ti^VRvlU+(6&3=%zEB?oWqKFs5pU+c@ZSw13Ms;Tfpj$&hQiP=HZf14z$ ze-)M6Bp=^-=)=}f{jkd`%B^)Y%UFulzEybdoUwLs#P10=4pkTB@9t;~bv_oVli-~C zGr}Up=b%%-s*v|H1>c+4_s9OdbHXOd!Za!C>a;7n9-jA&xIU40#bmzCtY)(OB~7pX zort?Ae{cJ;;{m7F%vjuW@f%;TWR=pnCsK{>CC&#GzeqJ7-OK+d8cU!M08@w0lu^tk0#e3(hEFY^nb7ur8`zUV(~KYOJkl>f z&x&m7tPzh^I%Xvvl)7T$go=%iKJ1wP?n&E6?ddre)h`s=GEaPQ`JcOvsM4wZr?V!i z-3wKpw)X3W_+yMgjpsKn|8S*1*PH!`)BT+<+J$ZV_gs7<9LeZ(TP$I!`a zUagyT)TL+Ho$8xqJCAG;lhm^_Iw83&tU_Jf%X9BpEkUg;+x2N5=50RNw&uj<6=FSH zCtl1mQd_$FtJfyCO)q5|qmuS|yjv^lG=JVFp&LS4k=H}NUYHWOI`P=Oz(tA~OFg%< zv%ibHp($@Wr!TSNU*o@*3m!M#ezbMb*A3+kGNnIz^44bDWlnf`{+5|^+e@n*TjIX{ z_RN@gS#_rG7NglZWyWVuyy#bB$niJ6`ge`+x;@d0W6s@S-w<~{p=8&AQby_Cn+aWU z>2g~SzGaMjXlS~w)mC!p694s2a`JObF1E0p75sT_#bWJ~EX%%XemQRx_M%V4MC;eJ z)Jyu$8-rZEf9+{i@hkY0B^BN!uvJDXHZ1kHv2)_lJrC+;1kYOf%;ABI`u!`->ozm0 zJ&fM+On>Hh9cm6rQ&Yk5MHB-KP zXK`vjI$`a${q?hA^tdCQJ=o<^9_l>*_WYh%^^-qb`t*z^f0?a_mj{Cg*Gb*2=VYhy z@<;CX(>P?b@=C#Oi@u5nHw5>J9#P*SC>nh5%iHHUudcLSzR)A}k9CWozRsfq4hIu? zn(Ul@yBMgS5Xrfu@a@10^X8sRzmRfOmYl3(J9^cuo^5P#3%jMlQ~1X7h?%alzuFbC zDet?^?0)m%->t`o#V2}967jlqKQijif-KQ@6W+f4bME9!ZtsvSVTy^If;JNc`o1a` z#fDdVKM9K8I4?(SV@{aQ!9|^)*d-RLJv4PbQ{o#{nYKK}R)6bqDG&8^F5V2!s!eqc z?K{){bnidwoYQZa-(Au>R_W@%`1kIMh0DDbS%+-gdz9zPC!gT&2J2;GAK1K7-1^$b zbk)(Iu3*Ii{%1Z`x23F%oD4m-eQ!1V`QTUbV{4`lUXLC+s)*LHI_%qbKzpO7b-iGb z|J+}a8){}a{@O9I@^FvnX_wpf>o2?Q3tXh|#PCU_|HX&JzNxX#ayqM(l~(X<7PIB- zO|_{$;wzvQ_<@C8)2^xGe8QX$6LXjRaJwtD@pshhjdP1G*HnnU zpS*{e?PBf;SLKjdVKoJ+y&9LiUA{-T-P#l65d1`YZ`(uWoSWy|@3!zoe`wrxNa&)O z;#uP7BbIce{~oq=Q|zSlzWveyQ-KE&e$zkf3kXC z=xbKDyLVdRa=b zQdj+XfBT~T+S~={em9j59#0NPTB7&o;vzqr3BG;{>ZXa9xb?)Cuanl6JR$wgCuzCq zIwqr-y?fT^-x7U)NL9k*Tz%+#`KT~u%Tt>aXa8R?)9rOX*W&%Fj>pO;SlT?ynYe#F zqt#I!W8a+Kvi)5Xf6Y$JajbT^c)Rj*nXwd~6?ff*&vk3>Otj0%$qPC*AK1F6_`U24HcrQgmT(ftwfNBZhA1wxlSUVQeCluSbET1oHD4V|+d zTwy;j|CPf*)k)%#e;;HE#|28V*U3t*e{B|&x+C85MpmVnMZaQif*G&Ke0zl>TwxdX zuKB>V?U1&ra`?aPzk5IIwi4K;k@jWNANf7u&E0bK%dQ!I^k!6h{>bjk_jQv}w9ZsJ zDE+@|d#^K?v2~Wl0_DitUkn;dm3q5(vZ{U+Q?NMCTfXTvo5qyWPYd>JdzKXN^_hv% zdY2!cO(<1?E*Nb^qh;ouu$kxIyB>spW|Vh5IKyet+npf2x+YK=$cBH=Z7`5)q3&Qh21Q zdu3pQj?$J#ntU5eMa(37*OV=fcxWLaY_s$9<6_y%?{CEF|9hHoV}AJgAii0j5}ZTB zn!c@nrCU^e$#rj(+q`7y>8jhMO}bWBd(I0nQQkW%{p0WJ*(C+tk0w8hTEh2x=P!#8 z_TRB#4Dm-)Cmyt(@ceR})B5uI?GINyZh4`1YgMOGVr=<#AFt*q2M*u2F=&5L?yut> zC_8-y>++TEdzf3Mt=ND2^Tng;qTQ>`&ho!q{_E;3HhB-mI@Px<&sR<8Jk`EPGWC}n z>#K>09VdJLUp?*7=(cV`7OVZeb&hq)=acqTbf{ZsZS6nL;C*3w+3M??C;aU#*>X_B zucRv={<;dsI!l&S%eQDawthR=>iXRIj;~Gqy25>NCb14S7R6tV$v0l`sdjPJ36zpH zleiTb`(N_rK8y9~OW(xIp7PX7DzLlIpY7bU8QnSe*Pi-2+oX3{;)fsA5@$CqJI1R0 zS4H5N&xJDy^Y7#>JSn?8!@HbOqoTVt{owO+T_uGl*#C9p9^5ob~ioX z+@O-%@+4@|+@tX|PgH95X1`l#uKUq=O2%U{@&-nyMLR;0Z?CxGva|Gs z(DT*;p3}++-Ex;3PEF?R%av~3PM{(aFik6jDztmFS>I{(V8;@AmV%uubl+^vsv(!WR{KUe;)= zVf@!(-MwVxp7JRhHRq-I%w+z@)Vsuex?)4fDpjf3Un&^4On7(j^y$pHUuPetym_cl zGNFa-&A!*lw>L_#?ED$2JL$~lZ#Ncd@3}JNuF;QV-uH{r3^?m;V!U2^cUxSSzBsca zb15Ttfi<&W=XTW(yoqZY94~#Iak$mGYkm}`MF&e)^p@9Ug~l482YACvpK!mnx&MBl zLyiBd7zUd(>6Hhs2gDw~&huzZe2vECTJ49=x2BZV-u+f{;icZkpc1(&9zBg>_qWZs z=~WrD=hWff3J;uYyQUjx?Qr{0?A7$9l#Bo6Ujfb4M$a@}TfN-Bd7WZ?sJv9@jJ@xx zJ5Ig$^;1>cGJJjhWQRT1Jmgwp%?^IznxPu-o!@=#63xJL>DZM*4uYSi9ZjF?;=H$! zvEl98Ppyy!={6{_Gu=OX4xM%?DkZ#2gf=jn`eMtEivIUX)_9@6)3L zvw0h@mmjYVTgIPYQJKQ1ej)Yj9Igic+m4pS$7Te!-ObN&G)lWId1jMMQ-gAxT66a; z6$v4=<+(c()@DjAg^7nd~k5|2$BCsoXQFvXlQ2XIUwJ)|PJ)hwIGjQkC{7Fwt z)b1zEJ=?Qq`2oEN%j@3ED$<`Tf7Ie$?R}Bc;_FYpJHscr^VS9*(~ofy24n z^6`{yNqdBr2TNN%W^i2;YJSR>VcP5Txs}>ew(V$rXI_TpZvBI-JJL}yp^gKqxN6>yISm9r$ zTJKHe>fuuf`pfyw)7<{A$ks2<4OZ8m6MbwdEf;@ahUv@>##FS zn8vf>nVH17l`~?@ILe)m*@REDf3+}`Bc3$o%kU*fFy==PvJ2y(zG($?Wi74yN``QLGus%%1!`>;)aarwPyN z%Z{|a^6Zjf+p=RGe?3HcWaIYNB%Zyj!@EyFT`l6_&Ue1Ik4Ew3@ZMtE!8KF1YV-cM zPpj=X#C4|Sv7f6rp_*wQdgpm!`}fGxrkp{1^JcvIXf{PcTgG30L;f1y04Ftz{Pjss zOB`+ZIrlR(Ec{ig*CPk^fjsd_t*l1XRnkO@Skv8l(}M!?rqi39S6$Gt&Zwy zE^67oH1cm~PVxP32WpE_TmJL~ZoH|_{&N41Hy>;k2T6OL{S|+*e`WnWi@!4j$pH6!pQ<)mA zxp(Odv2}}9cJE)9ygaS;$DQSR3sQe{_&Yz?AXey;)NLx!Dd4#55L>9!1ku|^(?4(O zcwA~Oxldbn;_2f%Q=9aDxE1ieU95TRw8gHkGlN-YZGH1$)si%Oy{Ao4;pPW!ZsC*) z?c#XsYrKC|zhX+K|GBW!(ZP0+Z@;Ofn?(m`2S1Tkuz4gAs&V1plJ#m^XI~0y*tO4y zDLCYh`j%q_Yu6iwPfmIrtk?8>y6?stk-qyDJ}kG*M7E_yYaXQ}=;@!?qvNo2W?@gwbUB+K+kJ);8gnftUiXdrxP(np?b!Ai zl~VW49r(Q9#cqRN*OzZR=3cz=k;1NPaW&SQ6PM33EJ=70^x;VAze@||z87cbBKfj!??)vHHOJ+{5Q4>xxi`eabWkXQ#LbqC(fDMiJ?K^gEqZR-8YW%8BvA1Gw#ymSzWnW8u+;F>I=dJFKc$0%xyl1I@Zdp%b<+Oy7p6>742~@7j@ltd?(RD=+w8qsc3O1Z zl%safEoAfmxShW|wdU8Xc zrF`zKXVbPUsC0bG{kAUY!-JU(LHwJSaew9{@vA2#&C&}F$1m|Qn*5Z_nDh9Xof`A}o4;K=EYPr?-_G|>`g_TfvyzJf zD;guVOjTdE;{5Xa0XZcN*EWl-CZEhZhUE$b}Q4|gX+i9cCA-Z`V)8X;I>9( zl`oId1bSA!(pkS@;=e^(?pt^qsrti`)A9N$b~? zh+MpT@}PY9os$iXVNtm^>x%9&u2NuH5Wa3@+ku6Xr;6)wRZjV{+1hFCC3Oe06{d5a zpZU?TA~$v_SLTL=)BO8O`aTF5|FK~fWB46nH?3MvFeT{g)Y^qIyR^?d_+Peb>YK77 zToUdNM0U*-ib<1lCu)|$ zoe;y(G)1AouHm54ou=~fo#1geXk-0)_G;C=_O}f#T-u$@J@d&NzRe4QUQMpL{V^ogbl=qrQ|_uh_d6l+ zz*P5{@25Gci>o%u1^rYM*xchgC*Vo=)`fq(FH4KA58WcRDPKnF;wo@Cxz^5ngzE*0gngA1>>=Rzy@T^KRa1 zb5-o()Rzg9YEG;TFOV0pSzP$UKlzCD*SOsd#hSm4^~NzUoxk_*sP;UWqu!hB!zPq5 zeJHid6x>(kWVCo@Xotr2$$QeiUe%m=z}e|(&5qfx7wFFY$@Khi$G!g^c~eeJ2xeHi zbS}&F?`y(3Wn{zjF7=gMnOIr7Bd$qTmi60R;}xNEAKl(CeX{EAoZ8#B<~&Q*nD4ZV zVM3^vFYnZQZF~9k^V7eC_bIt1JQQkG)IHV1&C&Pg%L&vP!U@5FuFT z#CiE7W4OdxvxwtH0lwv-IScI*Z}e1X-fSsh|97mVTO!MVO>TwoTt(3s^F%7U-Uz$XMPYo4 z4w@Y?{IX~D=cC8leKg{77p*RulpOHP>ire%{Vq-K-fkb89@pOsj;}qY_xpZ` z@dN*OaX-5sfeYk&bH08(t#hfMBvIsfVd@5!MRW4=TCe5jW%Rr{cslKOs@&4cXO~Eu z9GDR9ogf2mvx)#^+Xx3w8X~nL$8Al-CDK!&I2)v?X?np(-%LHbJu=X8?#V0 z*5SZ!=0{7{M17xIvBf>a#2~BDQ6%Bvo_0fra?|}61AP_>s2eZZE++kwkz+z|T+qH3 z?ml^<3zM_$KF`{ovzc|z3iZq&t?3bKo9cP~#ZHnEz1yV}`YmE{8MA2}68`v%F8ic2dr+Np+&fHRgGI63u+4fp9y^8 zxjr!J<1J05%vbss1lP^m#`CNBy>uI&jxSe$!1B!|ceY809%_CoEE4jw#p=b{UV*4{ z^LFriPFr=|#?Q8|aL-nzSPmCERTrJN7IppcJOAJ8xcN}#(c7tvx2Hbj?biDIEmuo1 z-1yI9OJi9trJYaNzZJf%k*zowte5fK%vB<+KkUOb_gJ<`mA11cw5z@<7M2nN3&mq z&HW(HIRDx9-D}S-TR&++=98msTRDTC+7?)z(#+WU=x_Pl@3)N=WFl`?*3DiNa&Q;7 zb=QQ*RgChUj2BX7-fFnZ^DN`)<$FqT2G8fHG+s&WIdTBx%6Jj<(98~;t+yM(7F zhr4yjA9LZ*rM8o2o?K9v_jpokdI;;JCFd4yyV<>a-q)^(8!WlnmPvWr1(kct^7!sE z9A54_C1*W%?PbQiM#2IY%SHIi6Z?m4E{&$DJpi{@HJ?A~um{U4sJx=ZKs=pH1z4`X(569Pkc+bh| zmEZef?hB>PNBovgcP@`up=BhgG>W>xmBpO%NFxXP|%bzdo)v(G-&qq{IxdXAj7oY`va&{v6d~)eGXnISzcx{`+}r>{S8V zLp_={9&>-LkqGx@+J9}K@QkJBY`jjskTU!>jce}m8Lfu-b2eHp*#G6RuwXIMg4==H zTAnuvT$ilLIASnezGvn1iN;$~CeNxAE6(_Q`KDich^OFWX60>@ueKT@>to*eXs_ULdFF zjOE7nANlL*H<#w8N93GU5m|eO@vzFDGrs%3HwmThuRf}~&*lO{_{vtgPW0(Vv;uhOH}GkyzjypqZH6SRgCbRK$H}V@XR<;hCoso+kQ78nDQi zkNEPk%4tdG7!I-HA*Vjj&6x&x2jQNle)IL0#*@=5&#VRl)NbHM5E@)qTo8wAYWX z{l=ltz6Zx=+_~T~PfgrKuxafY=a4l=MDNtZeK@wXE#OO;L&4#A-a~iZtebagi3N}7 zyBtrMXSI4yzcydJHA~=kfluGxM=-u?C}VEQV%ngy0DMb@S#Jzsw22|Cjs_cSX1=r-%jOB}Z*h$_o4#`t&t z+WOmgYm0qw)4T~0)n%7>I2fPUZ)mY#{Sf$Pj@iYOAB}2t&%K=dviQqv^K-klu40~k z>C`u&j$-$ZPiIw%#;LKLR<+xv`HH1A?*Xf<$9%__;sR6NQpvwdWY2H^xR&Eo-pm{K zL%%dK8P&3Mgl@1{IZttQ%axe>b=8Z0+A9>6TAMaiRr~2WBr)t(@Cvisrh9Tta+%2g zdGAEj*S5;ujL7+U-FxBN49DW{n{y7hCf};?diOWxx0<7pYjN}2CI7yqOyBievPfmh zao0%IYog(^e`i{_?^=9HO6&Iek`8H^bBx>EZZ2YGdOUO6!YSgnZ!P*O6ZbWhy?n{# z+q?;^T4$y|oVT2*{s1FCU*!V!7}eVU;t82s-E}5&&tfs0+t;?Fg_F(l53BUriW*zF z?bD*FS3WW_tbb*CI6lJr!hy3!{^@H~>+YKs-Fhy1i#t!@s?54Og_@=FcW+;N zKX6=q()r_;-KTcdWv-Mj2#M@`8+4+8puU2@ar!XOWqSCCR$xG_q z^yifFZr&KpxJO}L*Y&RASH=4coXxAO9_7q?|NnsD#INNOJBpt!T>a@!OiV-E`r?2@u)2Xw@NaxXdg9FmO z1^=RW6ixb77j!;xyL_N*TWj2d`Lb0fN;jX4U9@T8#s5jHnxC}1NDNS+0 zN~y|P*Oqa;)`>Z@Xx5a&3s*AC7v8fg?2-J#iH7T2geF~?!`$auTCe}{c+Ygzbor>v z){uYla~r0waCTap#=AK9kij)ZNr7PATZXGU*GICw+)|woF6DZ;Yk_Lb4!N$Q+fIvr zOPbr@UT52|>2Rq@G_Mvn$15gLlc0QFqZ={{KXvqW@HD!0&OiH??cH1d!hH9cC!Xcs zNXwGE;QiC`>K%=1KbD{9oxpVY_3`f~WwxCVIcoQbzwvh4^yi1)d2dYIJ7@2#-U`pT zsjm#ruQ1=Cn>lHP?u#_*Z{dZH-dR0)^T=v-qWtpiwhfVU`1O4rdTg4=mpCn2e4o~j zS8^sPYqEt{dS~k{{=Me=;)a^1Ri+2NY0T!k``NScP*&adta^QgM!VXm%__&6>J`6U zkdex~X0~pnb?%W(K{xd$XY>B+Uv89e$oZDb{miNMIW`joJQVMxo|j(s?Dpe3ulx%( z7=GWgMLKeiWX?+NoOMi>LMK`7e#-a!EB`#1Bfl-Qk~ZqO$F;WwUFEVb(%_%7)MJJO zSFpj!#ubsj!)5x;x-WIj-X&v`_^b5OU5hJjqCQcsQj*VRCnOb>FPpVK?pIIKr{z0( z9T=sVrj|#%JJe}#JbCYTk84w2K2B0i?9XIA;CZ=C$uHzrr&ti%*|v2h*JkiNH%a$( zkJjgWIQ@WtNwvYDbhb-(W>hd~#x8%Rdh+%6%l>m}Bn@7LwzPC^zgaE$TWFcn)1bW_ zM`ETQ^?T}h+1Rb?)#7+th1Hzr=AVyduPd&*Bo(i6gV*p)$oVIIlIcHh$Lsi&xl~Hj ziw4`c%Df1l+UmuA()PebOYu z#aDL)$Lx51 zEyDQU=lPcZUwW_RKin5}B6oLKu&2VT$r{r$r1!4<8MW?o=>F~*rWyzNPaRS5mQ1?d zS+savmv-4DT4%^dkscko`OJd(WpLnqHXzGXM^3p}APgk4w9(|Rk zRO0zIcAbU9+uCr4i!VF`awZs^QK=Q_(_OFTn)ux`SY7DezUeFGWkvL*#4)}S^z3{Q z`;Kur$5W|Qo%2#Z`2_sg<7*HoA#gYFz?(I<-?n)FT>B;T(UZy?6p5@19r>!aapRc@m^NGFd`e}2yDz(p%|Z=PdZdtzt)<)yY79tB@peXahm@!x5FcqeIjiF^ffR`=J)6}Ptc?-HChM_}Wd zW1l%a{(073HQ$>Mlc?d>C}3Yf6Tc0&5{rJHjll;)2%JCTexdMwO!rUIc#6oH=R6R0+wQhq^c)PCuP)`1G*bqRh|RZWgh2hKNt( zXnycyf$Y?yuZ24}A}#KPNp2OHDD40K;z1*OiG?3;GM@8ZvTVh=Wo8fWt~~mAQg+nO zrxEwEtfp?xdUgKxzdJYTC;25m-K-b5B5;Rf`qvy4tAD?Cf7-8gTd;mUKz9Wqu=){ z{a;*gWaX@%&h<#2ySBQ=P36i0)4%6JciGJ>_?e^NQ<51fEws>+W4pz_lFiXVF~M8z zA9Y#q;qV>BS?SZbr%s)eDaN#s_mD;D`!{<7=W~u1lcsC!|E^H^_~XA|=E>gn%TnL7JJnar<9N;g?&=fOAG?jG-@dnBfY+E+ zaGTET;@^o&R$VMNuU?(@;Ivz#$qTIsp1vkmq-Uo5xxoF3ZPxVf?K0`#jNay$nku!F zF+Y2`@qEmr-jZO3NckMwr@f3bmaVwDv-0Yy2S;z+Y}+7RS=i`0SMmn8%;l&9>-yxL z-01a9O}07c8rFT@CNuoehnw9i9HxFw3Akpa&T)3ud{&n$&$cI>cx~YoA*Y*i;!|+Q zqejLxUv4e>^CCpRE~bener{1%v;0U?q4WXOrk%glg$*2p=WV*Y z?^9n=?8}3O*Ccd)_pshFz0h*u*~$i~P>;P_Jey}+OX^(l?jkeq=e;~qM|O36*SWr5 z=3=GqF<+adERl0gBytIcSS!Bz=oTgZq&Zq@{UqZm;nSOnubx&od`eyVPv=GPmh%bc zc+~yB+;}p9Z9@NFY2JpT>m4L&%7o77yKDM#M&vb?T$=L#NS*La(~7LX+J6ggGAgC& z-P7LpMN(33@|nX2{9V-Etx{Wm)ideeLZiF+OTWv8Id_{Xd9lq1B*GI?c; zTn}U}&*8H^qQ>erLB@J>9~0+`DfYFMp*IZHP5xBT!NdGCHnb*X-Q$wLQ$khqCvnJ# zJ`3YF%TLx;Ixvs@Kj#dVtsA6t0z-vh0Ad6*C+;`nqhtT<;ztjd2jqi!PO#e(w}1LwE6r&0OV%CUdkU@HU+)V& ze3pMlq5N+f@m)e?>DwG0Cm+w;HHT5p>*3i#uhX0|EtQ!wANezc-hD4HFZ16+#rBT- zyC<*uUEy%=!t7P?vutY06s85RADdYJm($Ng;&9m38`D;M&T5=^JK?X?sl3RoJ|A}S z+5U>aO!Tau1;1l``%_*Bi`YC}&~?u;Fo48GZ(7hmpPC-~y`^EVgH&M-+_ zWB5rx?Z6g2bJhFeS5{6H_m1j zops^*=1Z%rs!VlUnGRQ94tCdU3BB%Z*c&#B&p&m|>!AA6kH6*Ld&>KP<>OyhOAoCR z&%WsCo6rBJwl6b##qRqLf;bY}A6DJ;JEQY|gA1>5nzxSHP5A;{r#-en!Ic2oy^Jk-$jd>%H2ZBllB*F(~EQIZoNMB|Dt^Ym!)RM zS!`6aiR{?CWjAGCL;l=Kg zXTMVQGo0_N68BT*e;P};;hv!7y*HycuF1sfE(q_J@YODSvinci`kme_`z9oBHq~7_ zeRrv+xa{7iZ{?HEUf*{9p{dWj#|-Z_D@mCPsBM4ey*NHCZGmC^)>Sgx6-mA?7TsFv zEUJ0>{I}Tly%jRAT9>;_@u}5*v0PKeb7D}-Rn3~$={Eg;dP^tFOx8Bd-KCW9OK^+G zit-aRWzUvZJ9WM9$>C99J@>_zzwv)p;hNm2$;+(n1nGP^(zrJ%ytrtWozUbAm0K-+ zZ$rNP3O(*N=a=bH7NHCF21UxV%}h;slJc8&eY;v%+IN5BEUAxwbbq~ne1URKPI{~NyH+iFAIJqA8Ud3|;$o#UCw?Qm%Cn%#4ojE}Xwj*!k@ zKABB6HtWwjzLhB(3wAbF{xsCzs@LUJyw}V4@WIVCe(N0~uX?I&nsIrLTgV&sJ{L~O z9mm;L*OqMlCDQ+r=f6YVQ(?*SjF_ou4U#oe-411LxWy~+O!0OY+h)H*o`DT|TMV1d zJ1lm{Z{SyZq<8*z*z*pD_45jkoLU%UQgh_I{&A)=tap@iR%o8S_S~l6*|U3Ghc`{H z*5qC7%JjizBbR~49JaR2Tdq!Au!yH@-r?YfcP8GNpuXb_N7t)s-xhg&xxpp=-N#!a zEkkTuDBslfn?6~WV~ieNDs_GEg0HZM*ZrqT!UnE>JD;1flfL?iwO`cU{gS^-$YYkk zzAY@}^Ui1czAIH=az0~w$?A8#@4tl~Qtqt#bhA0>>;21XElPjs-o1H9TU1%<)K!-EuP*-G4j@QP|t{--@LyB{PUv)$Ls@qB6y z%P+H=X)mrddfmSKem~E;{YFK)a(r7Pu5tb^EU09ORhC zRe9R~SnW>J&W#u6Kipmr{poK|l<~39^}*`}yzWk7o-+OF?yJ&GGf%y(I4`xfE~#UM z*@@Jbee0h`|SPI~@LCl)_lb*XKwknkCiSm{gFdaqp% z+*laZX#3^I9G5-bOJ_>&kY95ljrF?ahRTiFE{hxD1i$@z@}^Z#Gdp3=qe&|TiWg)> zOtX7(;Zm?!gM-JC@9&e;KkMl!-d$BMtMa=W%(-+l+w^ifCkDTjY*Ly(PJ#SM#_f*e>Gj`ImuRC&C%37@|;*oni z@97Oa4YjYb^S^daTF7CqcKhtLYvP{zn_M2wJ$Sxh#b?b|t4$VF%`=!TxOIY(zN!jXE8^6uq zHR3-y+y6bsq7$XpCj9SOel()X>&w9>m!`}QWZ4$;W!Z0)waZrKPc|}cT|T2QQ2lL` zsHWGikgdlSmex4@*x=%B87)wsv4dr*$%f$iZGUd4Zrd&yaEnFjwkk(*|oVtv}@(Y<7&NS#)ylk2M~ zD~^Y8Im@Za|Ga*O{b|Crs%a&Q7!Ar_*k-*>f4(Yc6@45J9TjPpEIF_Q~2CpPtILA=cLTr2M@!#7l~i^r>NDs%JEB1*%MA-4|(q( zt7wsl{ECi#lVq=pN!Xw)mW9V~k2Mlf(Zf+k5VKZMnUSPw~RG&=*w~otMYX zHqQymSjkfHC+Xzu1*T_LFVoBY%^C1Hv*E=8v54RNBF9g@Iv{D5b60(_>fr)`sndOX zmOY)mVFA~!6J91BI~0$(uxK59TF6#md;Qr$Z(uF{=3x6jajah zA9*cLvz2YmeP3fAQ++B|pFcJI z%zJI~o}Wj~72aN7<2i5NpYQoI*#l-c`Ak~fmFr%pnX~D>%!jkaH;+WI_NXe)p4L)j z7T=sL^Eh94i`vA1pWg&!)sGsem8DDhy|4>vVVLa9*fQO+rAUB7U`vtfJo_D=A|5}v z-K60be&~VW|Gnq>FU)pbW3DAE`Y2?YX!G2MkGnM#+}AYbs%`HqD5|@0;@s}N$A8~i z(cf}+CGXs6qBfa-#MB$TeLu`MXDZ1&%+ zM_A6ZmIgG1sl7Bf`t3Z=mcOe_oq0RI@o0SMJ%80-Z)VHSlnbYmGP$?;^{jK8YPT@{ zWQ^Elaf2p~c+dN$FFXCeQ=~OkL#`Z928Cc;S{AI}~kCCa<<< zxV(?kBxcR_mA5i9c5YQIcVa5xN;zTZXT0db)6U8gy^584{;OSI`}DEN`t4csN~()L zwOxAQdtF~!`Dgr_2akPfcm7p-=6Y<~i;aarSFYIniTvt#r2d-e3|R|5rytB>m(X*m>}07xp&v1>;DSaZJp986`XN6f5m^k$biM$ z-~Mmg{66l?GL=cEoyzprYgaGLaXj_)_~T7SR_I+l&+%Z+)Bq`onF&#E82$5^R@gqO zKONzHjlKSf_H>cj`|jW0JPH);fAFWnw*P6vqHUf0M~-rQ3IF&^UZLpRwwxmtm0nv` zJi6%cPo**~FyKOaJ}KNLH}0y>|5XZ z+1wLei%kCE$IrsV^JMNDA0I8((jrCCTNXdNw%a*{&z*E`(hJXEF`*~Xi`@T4ov3Yl zroZODZPe{mb5DH}vPvomTb?X3^&ThRouao`VkCQ4 zA7z+hJK1!}H_qa}ANKv=Pul(S;CY?;zj5~NeIniNf|a+oeOMeiYx0%&i1$C^uU9QQ zy?*7MbK5&_n|}VYpjxyr(5uSL-FyH4cIh{o z`#|R&Q~53D-!6Nj70$d#jawM&sGl}bCVBO8@hz!MR|{XO{~B9+gQrPghIdzMT38(0@EFxgu6dHL*{ zcC1^?TzT5#OCQu5t9#va{q^)|{4K_>ELKl7KA(;b{Nl}XO|Es;J;mzta*CGG|0X!6 zbpCpDPG;`6-$AvkNB6GS;mYmjuKOufxclqo!(4{BN26;pO@G$vEV-G_b48h$l1$2KhA zu|Re09`8l!mR}>h3f}(R|D;#o+U?6B!pUz9Ue4C)Go19WyHx14?#dI7s*3vM?*H>l z3^{zws7kO)?}+rx=#n=VzLkAtvMav$?C~951D(=<6VobZdADU3tX)o3b%Pk{$QLT+G@F_|L03CwQQ^Q)=r@#8)dIJ z`lpm;wmJ*!$&Zo|{?;M=Gj#70vo90<-dvMpc+<`NX@ZE+BF=&zZxnvhCD$}NxO*MKt-${6^C(AUmSo%j# zY^-zn!xOSEm`tU%#GWvbl`hJe%GcE7?9TYr)-{how>VFH^OO9F)3@(@Xc1cCw08n; zZQ#NcVwyK4Kbvn5~ zX|k&7gI3v&^(%hv;P6*mCa`VwoP-UY6MkEq`g-_6TPxRh_Swzc=Wh6UaonG~JM`&? z3e5wP^o{&W-^@8v7oaH;siAaNQM@C5Rqe_0iw`fZ^hwP*tvIv!&dIkX+xnI!-c(_> zU80(Ke}4On7LW83QY)v0&hy&Gx;LHMaKe#bFWI+Rl{0U0_y4JzBb6+e(B}4BMECIb zGD9Kv#Rqlwok~btUHkGx^mBzL9AR@!D@~WMd_LIQ<{E$EaF}0>e&t?0ot?r*MUDiA zZ+)e*)#^rjEQp=N>n~$s)|N5b`{--cM|1u6SIo+uXtXPEq zia)8&Xv+>Ld0)l-WagpdlZl7EPe>`SV*9hF`GQ(k)mxhz!CrDLH-%$2+lJ~-@ITbJ zNjWs6q_k$~lB_ICy{4_JmTfbZ>0{aM$o?upkp0T=dPHOf=$^49Wr#!SynO;38utEJE!2DLeAxB*dl=sLXasOCWnaXkZdhrM zRcfeevf@(3fBO}wv8TTqGcSujqU>sWh$;Sd&yO3L>aSSeE8gmFHmh&*nP_uO<;sb6 zvAbF37Mi~j4J>kR9r|cpn0VnaTbx85*CV;4%Tqr~{*<|CUM?sf%gX7JwQNmD0SvZ!J6>xo&N>zdVV}8pYia%>h4!k z>fsIRS4;>#!uf1!nJ!D~=j9GZc3qn`vFu3(hvg-?REx+NQyZHK?o4vO={#{~N)7Xm z%aPR!zRq%&YfUaM&nb;Pyl&T`&;>Vo&X$`q`@q@+hif(LKsq%@T?cTXsuI1r!dtOZa&tb;SyIkDoYFF@d_w|Q!)_+M`rBM`c zVEg)y(zDkESYBv8u<(T5C3A;8>eDoOChu|C#&e@qk7L%}r|EW?^5z;vvs7*zQ#mGh zNABUCI2LV<n+bSk|f|3>k?$*-bw{imGhT$0_@F>QJ8dBbeM4EsEVd_mqDpL6UuB>V8o-(PH!AaN{F>7Yr-3jYg&)Tx&ol5Ed>pkCoELpWOpLxyu=A~|FkKa8H>bcvi zE)x2%i|hQ#uf~U)b>3Wm^~7$I3FnFxXYL5C{CARJ`MyPyW_~{LdXGiDhFJ86lvQmF ztD+}-H*h@FbFJpywmS~_yUyK;pKYvHUSEz~@#IcnRnVt(i7SN{rk>lmrV{o0^# z`A@v8tN2;=Jxj!I`FSX=_5ZxCJ8|c&!^#5neWkDRn5({vD}2jH{r5d!jXbU z+?^19Ywrn#8OAeB*54D_U;6p;)i;*RuU8)HG?y(ElDFHV8u|2#O2eUO=U(|cJIjnY zCRDgxYtTCCzw%+g^}Op=)6}-VPJa7i(H>c6>v|)-t?$i`iknZ^{6tm8a%JK~k;UvH zWlg+XjUOZ5CL3{iw64DYZp|a3DplhP_q3g7KK!Z4|M1v8$&Ns;^F3T~In!%bTnLNR zev`a7>zS^wvyOO<-x1BXSL*I+mzS)sN zImw`tHRPR;=A{jW_dhbqw@5ID%`t0?QcvF1@iw{O%M*==*hkw0pIgtmZdTvY7pi$D z@^@vmZ_vWL!jLda&x=*7Ep%B_tM-;w9Y6lU$!)@>14cqmnokMJ=3IK?wk3r>u8P-t zKO_563&SG^0<6-Flw+e0W<2VCzqn49^`h#AFAVATHm>goSoHbXzU#bt@%}4<`)2In zTId!v<0zAR+fRP0)8%FUso#Qr)f_nfv2R)B*_9!$&Gr{1_*v=r?UFjwb1!<~ZR`C0 z`y!IBjx77R<)nK0mf3gCExtT!dQn{QdWYy~r%WDnXt~at)AlG=+*;$v3M;eeiEQej zkFxEKW^@TArDaIJ47r^kcf|FS|HZ<%tP4_0_I;n2*p+f~s`_n{2ZBZE0)BN?W;6C| zSaJUbpW&LD8>d?erT9qsPW*lO$|G?F!JAtSmCrL&dsMh%vUbP3Q+4|})&+E{)GPgX zx#RGftN_WBsxy*--=D5O`J&?gJl)E+$yzKARV>s#hN@nhv@xFF??Cr<=KoGB7fr0n zw3c78^cZ)eV~63@=7ksgzjCe;Dk_LB{G$+|^|#LO;y7 zy(B!7oqDXukO2du61~Qzol(+MbfX>bE%F z`fVz#-s)`ra3=qpOv!cP%NN`@TQytm&Jvq*owsz1-04r;OKwnhmciY0^av?C@pQUxqwFUnQgzH}jN*(lNTI=ZO zx%ocVqR#n;+5A7%$<#$3X5Z)W)KbQO^FiGSbw(D=k<&#bj?C5&)2`}fIT=3tvepi} z^cR;TA4F?ycz62Axox!v?4L~g$iDIHlyBU2q0f3hI4#UPdGUJIUK@j_sh@;PZ)RPu z`)<4UbkDqHXAG-uvT|)Mkd6|(|GsOz*3O_wH+PrpOK@1T(Mnjm_CWOe`#MqE&K+t= zo0YdvrQt%qVYb_c$O-o@TQ1xfQ(-=5gU{0g5)H4S?*58%p=NXTGF{&#w6=U>^%u#6L(60)=Cm9*%EmT(Im7bTypM&Ld6XkAt-o!l6FhV7 z|4XfBSSwff$*y?WwCz(_1$WxVM%`PIk0!2Z>n+NDr69~KzGPN}s(ZsGnSC>N70PqY zYI#->&X_&jX4S$}&OfqOukVw)TdwbQeyTN>n!<^l>Yv|jn$55`F2zYhO7*wO|6K+Q zho3yVrl)X7adMjV!~IP+DmHSRSMBV)QN8^7;hUk)Hp@@7GmKTP)|l+YS7N&>jeSUscJUU*onYpvLvHXntzS&>lAERfAIhBFrk8f*bN$ObOWq$fy}4q>#C4XJrzT3R&gQ+G z;W&=$B zXK0`JWl}TqHxYq9#~Yt%wXAebn=_n+v`Jcc`Dqz3s4eQ-RLWcX@1ge$G?aee+fJ zWOj8aD}#-j`+tY2m90|#x%F#<-fFjKQHy@DQ*XA{%!o}Wo31loj>&&*67VZh_T>71I6@{j?Y!#L zmmz1aI;u748Z33+6|kgnu~%w(@;~;8&%azb#1zH9O2JCX_-i}2;-bP+Leg9pf4Ha> z96DfeK553fdqOTJ8WnE)g)G%HT&Hx`I$z4ct$FvQx*KmkN#D0z5b^N)eif}#&%49h zCI+@;13CF`g?wQjz2#+&cn`Ge1Tu!&VwPc4!Yy(xCUD{1zL#s5?uh;M3`SlMxN zrybWi8K=)vi-Z4E>@}NR^LO({HSM`#SqtSKurIe~)U$V7`}mC1&xDMonKheYh2E#W zTe0C*TwZP2&8<$~{yge!iqYaRN?P^z&&BRorrGbkLTC15K78P@);8ee%m0_v`MDW7 z?^_=`m-A#+rSRtUakdXx)-5?)w(raZfww+xpOd&ImK+pbZM>F8eOIaB{6Dk26RzHy zbe;Q{)B6YS=IFBX*RlIum>ur%Y=PYl{+D5A8C(me%kwohio8&ME<90%^R3~J`>S@Y zR#=>{usNb?x4PSpxDWjsH~ZfD#pWB`CV#VwMdn+`70J9g^VZIB`IlR)$T7DMn8hwR5pC74BqFr;>p~`;ssmZ)FiyoUa2H~ zyws<4*K42J$y@h5-MLXbFGJC>RX0MZzVqyPW_ literal 0 HcmV?d00001