From 6c31adf781278326a929fca9db4b9518fcc77337 Mon Sep 17 00:00:00 2001 From: Robert Nishihara Date: Sun, 1 Oct 2017 14:40:58 -0700 Subject: [PATCH] Add blog post for 0.2 release. (#1029) * Draft of 0.2 release blog post. * Add figure. * Change date in filename. * Shrink PNG. * Add link to plasma store documentation. * Small updates to blog post. --- .../2017-09-30-ray-0.2-release.markdown | 147 ++++++++++++++++++ .../timeline_visualization.png | Bin 0 -> 35255 bytes 2 files changed, 147 insertions(+) create mode 100644 site/_posts/2017-09-30-ray-0.2-release.markdown create mode 100644 site/assets/ray_0.2_release/timeline_visualization.png diff --git a/site/_posts/2017-09-30-ray-0.2-release.markdown b/site/_posts/2017-09-30-ray-0.2-release.markdown new file mode 100644 index 000000000..4e558b504 --- /dev/null +++ b/site/_posts/2017-09-30-ray-0.2-release.markdown @@ -0,0 +1,147 @@ +--- +layout: post +title: "Ray: 0.2 Release" +excerpt: "This post announces the release of Ray 0.2." +date: 2017-09-30 14:00:00 +--- + +We are pleased to announce the Ray 0.2 release. This release includes the +following: +- substantial [performance improvements to the Plasma object store][1] +- an initial [Jupyter notebook based web UI][2] +- the start of a [scalable reinforcement learning library][3] +- [fault tolerance for actors][4] + +## Plasma + +Since the last release, the Plasma object store has moved out of the Ray +codebase and is **now being developed as part of [Apache Arrow][5]** (see the +[relevant documentation][10]), so that it can be used as a standalone component +by other projects to leverage high-performance shared memory. In addition, our +Arrow-based serialization libraries have been moved into pyarrow (see the +[relevant documentation][9]). + +In 0.2, we've increased the write throughput of the object store to around +15GB/s for large objects (when writing from a single client). Achieving this +performance requires enabling huge pages (to minimize the number of TLB cache +misses). Instructions for doing so are [here][1]. + +The speed at which objects can be written into the object store is a key +performance metric. For example, it is the bottleneck for [A3C][6] and many +other algorithms. + +You can benchmark write throughput as follows. + +```python +import numpy as np +import ray + +ray.init() + +x = np.ones(10 ** 9, dtype=np.uint8) + +# Measure the time required to write 1GB to the Plasma store. +%time x_id = ray.put(x) +``` + +## Web UI + +We've built an initial Jupyter-notebook-based web UI for understanding and +debugging application performance. See the [instructions for using the UI][2]. +The UI includes a task timeline visualization based on Chrome tracing to see +where tasks were scheduled, how long they took, and what the dependencies +between the tasks were. An example visualization is shown below. + +
+ +
+
A visualization of the task timeline. Boxes indicate tasks and arrows +indicate data dependencies between tasks.
+
+ +This type of visualization can immediately expose problems with performance, +scheduling, and load balancing. + +The above visualization can be generated on a single machine by the following +script. + +```python +import ray +import time + +ray.init() + +@ray.remote +def f(x): + time.sleep(0.001) + return 1 + +@ray.remote +def g(*ys): + return 1 + +time.sleep(1) + +x = 1 +for _ in range(3): + ys = [f.remote(x) for _ in range(8)] + x = g.remote(*ys) +``` + +## RLlib + +We've begun implementing a [scalable reinforcement learning library][3] based on +Ray. So far it includes implementations of the following algorithms. + +- Proximal policy optimization (PPO) +- Deep Q-learning (DQN) +- Asynchronous advantage actor critic (A3C) +- Evolution Strategies (ES) + +The DQN, A3C, and ES implementations are based on the [OpenAI baselines][7]. +Example code for training is available and can be used as follows. + +``` +# On a single machine. +python ray/python/ray/rllib/train.py --alg=PPO \ + --env=CartPole-v0 + +# On a cluster. +python ray/python/ray/rllib/train.py --alg=PPO \ + --env=CartPole-v0 \ + --redis-address=:6379 +``` + +This uses [proximal policy optimization][11] to train a policy to control an +agent in the CartPole environment. + +Running this (on the Humanoid-v1 environment to train a walking humanoid robot) +on AWS with a cluster of fifteen m4.16xlarge instances and one p2.16xlarge +instance, we achieve a reward of over 6000 in around 35 minutes. The rollouts +are parallelized over 512 physical cores and the policy optimization is +parallelized over 6 GPUs. Relevant hyperparameters for this experiment are +[here][8]. + +This RL library is under development, and we are looking for contributions +including implementations of more algorithms. + +## Actor fault tolerance + +We've enabled fault tolerance for actors as follows. If a machine fails, the +actors that were running on that machine are recreated on other machines, and +the tasks that previously executed on those actors are replayed to recreate the +state of the actor. We are working on improving the speed of recovery by +enabling actor state to be restored from checkpoints. See [an overview of fault +tolerance in Ray][4]. + +[1]: http://ray.readthedocs.io/en/latest/plasma-object-store.html +[2]: http://ray.readthedocs.io/en/latest/webui.html +[3]: http://ray.readthedocs.io/en/latest/rllib.html +[4]: http://ray.readthedocs.io/en/latest/fault-tolerance.html +[5]: https://github.com/apache/arrow +[6]: http://ray.readthedocs.io/en/latest/example-a3c.html +[7]: https://github.com/openai/baselines +[8]: https://github.com/ray-project/ray/blob/b020e6bf1fb00d0745371d8674146d4a5b75d9f0/python/ray/rllib/test/tuned_examples.sh#L11 +[9]: https://arrow.apache.org/docs/python/ipc.html#arbitrary-object-serialization +[10]: https://arrow.apache.org/docs/python/plasma.html +[11]: https://arxiv.org/abs/1707.06347 diff --git a/site/assets/ray_0.2_release/timeline_visualization.png b/site/assets/ray_0.2_release/timeline_visualization.png new file mode 100644 index 0000000000000000000000000000000000000000..23e3e6e1c21dfbf58b550203d8ef9c6e7b2704bd GIT binary patch literal 35255 zcmV)kZB>G1IJ^z`)f_4Y6@Fx=zw z`uhCq@AnlH6ri=-`1kjHmc?p-sZvu@ivVfY)hM>~u z>FKe-;LX_V#L(z?k-zNi@AC5U{QUipsMYN6_JDwZqqf_tz29SZoo0KZ!^FkA%jQa1 zb&sglldIQWa+d1r?D+Zo-Q@G7rKj`s`R?)fbd0#JzTg)b9#mz8ARr)UX=*GiElW#G zh=_^3zQ4}T(DCu{$H&Q)m6i+*4n{^swY9dHnVK#)Nzik1adC1wIyxsODAav@f`fz0 z%*+}eDXguo$y{99lajEou`@F>o1C4&!NbN>R9|0US!<1XczNEOn_601%VT3dOl0J+ zug+^~k&%+0wAwX5Rnv-!;HIUYpP;$9yQrzEWo2gHxViP*-1y|=?BwLyhlcCBx#!T( z^3l;DCp4m>r0Lq*@5aXD#KrsW?kF%o4-*)&DG|M zSy_ESKrvA^1rle<+XC%KuP%%G{vztHse`~Uy{QqNyu004)2Nkl{Jq0XBaLZC6aUiGWEM;&+(gJI;>1L@VJo9vm1*Ziu z(jy&+7U|g>w^S)O<%!A3A2^L>9cTyuZgJZ6OHU_3@2)kP4z@1hM7|YPC_zn{q!z(0 zE!4;&$?HU~EIIw~;($Iu<-^60;!x}~VMAVR42~?U21DU(vJ*P<&j!JXUQu&3&~hMaKNz6Zm^Hl6%;g?)UdnFfoQ|7hd(P8E%D74@I;9Xw zK?6j{&{r5?SwBURME zc*m}-$ z&PktXyRHl43+T6$bl`jCvv4eVx>hJ6ICkeSlul}A>H-Kusd8e;l!`nuc|?$$);t;Z zzN4fO5hM$O4szHa?n)idb-`hUOpofW5j@;zfK!xbnmR(0NTS-~%FD7TB6=#Rem~Fp z$^9Hp<9<4x&)?nu^71we!zYv8e{}C(PwPe{r+v*i9k2frfc<5k3Rc?&f+(@o4e7>$ z*T$5knBt2l^z2gsUvx6)mS9_wivxDaB9IWF=+aBDA6Ti##j*t5vq)K~IZu zbT@eAoa4RCIlye!b$ou#?k=jVopUg5ycDh2xTryUVk@38+={vQljFZ2Oo2yHc%BB~ zsrZ6+NOVGWG)PFU%kz@KeETf*8Q=upVM_ z+ea$axmY9oyTHRgU;wN|0_EL<&{v>+_7?!+LlDxc!X(8T#s^-wtAZZ2aVV@^Owgh+ znV7Lw5vrEsWPtztD?Z=F0qU^g2R=JK~z6^_2iwMlNxE9KANlvn^y!D$BIZnW)Tre;iX{d2)YtmC~==3-^)FpHMQ6X45uW=l>=>wBakX zPa;9DSzF0^Stp(@qPKKWR>30nN9+^@;%=7vLNn@B0qPy1KhozH_VMRFPqM&LxJ|~n?B0x!Nav@cC?z3=?StY`E+H>anuLa$Q-8i8+>(XO>aZY6Il<}3& zWhjzPH3r3x79ANi2=~iD$T8FP{niS|=kJqaTRH#{E z6jXf;Pvxdlino-yQ=}G}GA+@(sa3Hd;TUE%^wOMGLb1NnFd176LkRSO<4WB0Mr88v zkS2uFQ<$&E8(L3>0cvl2n|kTYMRYTgsDPd}3p!Xa)MH4g z3jpI)8l)!IRAWsvW8E&ygwGc-=RD8w-)zX9 z*phva>^WCka6NQVA0gNHT>4-6e5{hej&WWJ;poT((l(M9;NRcp(T4M0tuO~h;d!Rg ztBO}`L(#?)M|J8|Nu**R0iAddpau&*|BpOtX-#B_!Z_(}Nn+&?s=#TQA-HLTUb_-- zFtiKI{1Z^l`6WY7+cHCvs!VmFudc{6aWy&khLaqTBnSHob*f^y=sfi3c^l&twq9 zg!4Y){EToeEzZZ?Al&C|%nT9e6)H8(*>CXPzW?yOy}BpSJaJrxlgvQ5`8Yai;CE#n z&Y>m-_=OGG2##x4ifqF`rmJEFr%zFljqavz058>z>OiY3_7eaZt#?WQ+^E}a3@}M$ zm7_VsLh5if@4&d66{!UFMmPsJpzaZ~j3lE!FwFS=3(^~)PQ&1e_= z`8Jq8-1F*D%q2M8_3{Vns>T`pqK5hrF<)^zYHr-$$>&H_=* zI1gS1|B3VdQ`?2WgK}FHt@6}Z&BqZI!+*g!aNtM)Jf1$EWeEpdd{=g=Xd1*kT(--5V)m(4l`Tyow`7` zv$cM2&2`v?tVPo9$?t0up=S0tF3(qtMtPcE)ulzSX`herQjr=MZ8StKgAOo(^s)N#(0%*fjH+xf~Jz>j)WkFLf8zg z=|wtGoufVEBh^-O<0Mr(ZJjoB+)VJNSuRYii`e#-3$N0R^ZPbO7>7HJJEkiz5gm74 zZXAAFVGgV<7xx~ja27E$1j*}d4=voj{k^*q!;K<-j=;g7*K}TeIsXgA{p{pw&_`uB zM26yP*GuYkzYhN}X27)NXfHL7B0=*e>1drf0M-WD21eazt2AC7*+B2K!O8QmN zAx#vsNhNgsUVXYUH50%3u(>@CGjYKVJ^nwsP_ySDAig~vg3%t{t0o$nuI;tDmriX& zo%RUm%@Nji%~jhqO-%99wFp4K>sfH9LF`A%EpHJsq0WD6MgO+@Gp8q1T;u<8sEGB>IQgW?~ zUA}>j&-X>l_V*m97dq+Xo{JL523~(dFj_8OCzU`D1sAE($MG%6G?M^WBaCCvA)azG zhI58MkO#sarA#1ahg8^leBpC@#lu}<-jP^pHVb@VeUOE_+;n&X+&9VGGt9TJ#s=0R zTibJydZCkE?s+Bsqa-pi5j|AbLsiw3Ni;{M=an;zc(o64LbSS5j8Ifki^dOph?dl+ z%`jF>2t9jZ2h6V-m^<01D_Cqjt&@V-5(mXx>@}rkb!rw_32{_MpV+(l#`FGF=4i(R zEJ`cQ6v-aoFFM&Zy>WF_!YCP4u)6xrBP;)7~xXs zy>`pAGJA389kZw@Nm$cz25HkemLynV;LQ;{UO^=Rh%bnig@i3!LDhY7$kg;u~$7FN9Uq>ih|0r=ZnA8n|kvXi&1| zorI<-I{h=mw9#d!fUnwK<9mK5n+|dqh(QZ6AmZv#a)+0$@kjvZlCJ$K-U5Iq{3 zLuAYoPdHRtaUm?oT4@XCh@Kf+(3Vwhf`;FKtF6=56mr)sOmHGJ`sF;oyU7jFqSw0*pq=j1t2 ze+QnE=j6GkK>_u7Z4FeA=Yj(;#SwZ=o-Y|2;vm%LJZH?&aTxMkTxsxE%(yu^&&l)e zj_6!90VE%n-q-xF+0FN?=cPKrHOqdLj|u zd*{4r&&l(oFZ&!k*X3w~k>fP51HHHN=Y&L_<1UZ~MCyx_i^y+uS=6c8bMpMNBQ6$a z0M9kZN!z&nha%MHfy?d54;hl2aMk8}Ln6=bUEYjsKt#SAbG42xJOhJ<-}&uc4Ye1hzAIrimmC-+M(E$=yb4!w;ngvX(V zK~4Fa)i0HO4h&ur5;tDnU#RG6`F}Fr1-8(2#nL13oc_a+=W59F161HSc|LlS5*&nt zD3J@|XsUDIEhQ_E!UxE`1FtnLh_;sE$>#*YC}3q@P6&(wdDi8Gz$j2K9oY5l0M^c? zr*Wiau6Z z@E%v)d#-1C`RG%Mwic;+Z|JUWTSHxSEv`$5z7sxOGxc2l7w^x{544#(tOfH1UJWZ4`YKI2YCd_#O5;`2iFI|qS%e_PI(Y;EU;Jd>>f9wMfB2-Wh2ZMVRC!A5DPvS^d`a!yKoo`{J?6yQNQ zrS6t4*7~?u@o7Its~>z0@wBT0b2ge2MHfc{b7(>!19rvS2)B05sZ~li?w#Y=4SIZc z6WY59oa4S2EqHb^E|CZD9y0ogjC4g>EQwzvkVA^NagHDFrNIHhkBeqpW%yCk4Dj+B zJa`RtbB-TQW2dd$n!1TNMuKC&p&i6eaL)3YIKMA~PCs-VAB$;*CBA8FX1gJki?@m@ z6_uuf!e*I=+#Ia$s^aaI)G*}JU+WL<+-7qD{qB}H=TZ#iHVr^IXy=DRtdfIFCD+iW zffD`vi#?sCq$8z@uPB!~h)ioQ=VT^YsRQ^HDc$NL$VYJ_k8heYBO~StksQbF{nHGx=`K|)1$#v&)7ykSE0Lqf^#OFsRr|ccQ5Mf zkn*nCxF!dEj&p|DTDjz)xD-PY{r=L$EfNIjbrw51c}l!bK~6p%hE-JcueByw8EYj+4gN+q5x8vwsm zKj%lovK}4!>f55YDCft1bbGS#LGzQQ@P5$Torj`qPL4y`yx)$v!3WM4xqy9s^4_Cn z{?_cTLbZ~4?(`oVU-l(51>xbet*dnr{Bj?uK%o%nyc`D-? zeVvSi4q=@xF0h{4mOQxs%l>=>_& zu&%g6@So}DXyJ-HhKL*UY)6i`qH&;;W~S?g#x9S3^o` ze;MKr!rnjpcy+&g=;!{#1vS<9UNZeJvmFM#x&65qRKt2+RZZOsZ~j{C(pEixelCh~ zbygISoxI=PuM2WCNt9F8nP^HH(8kH)WkR|w)$`y9Zc?&EpD^wJ6?5PX#^p^b>i}J( z4P63d32_e(Gdg?kI*cQd!8z9NRCn*qB}q&!l}^svDHz&7nmmLe;+?y@J@%@-t1IP{ zg?R7{1J-e!3>o7bq(gt+>yh=@WJa^1zvYkEgL53du?5~#a{}IQ$c#5R&D(PBZ%==d zzKt3A<<;xm-IF^jS3l;{o70JZaTkp{@pIQaE;4_4b^dYH^RGYtIy&&9qZd#8ydGcI zJE5QV>w}_voQ=-v<7(G65ALJrt)6uGzPuR}RasTp>1-UJeVUcLJ%3(H(3rE$srpV- z1Mij-xdEI-!d!4yAF0%-hwb3qfKK~4>Q5t%qzzn+1u$N=owy6kN;s0lxTlNbNTQ^T zK9zEfipr2WA=il`c5$qjb6g*-o`Vcr^PDQ+438USBLQwn!SFD$$#g5ZH%jT21mU(G z-Gyh0J67&}Y}Gkz-_LhA7}VID)36eRLyR@}{;!{_`JXQ6Y91VM?nvMB$?DRNXK#mo zGHYIL3h(dES5FV~J9pQ($J_luaZ~Re@9}2+p&kxrKL@L3UJtA4xbEGod4K*=H*XKW z?@KvVzr4wb>kn7YL%wkD1*wWSH`uje&=qa+G`kPs259JpITakB62Q|i^gA1YL+hO<~pxfmp6l|>K(a*F;V<|R?0_f&u6rFKL|e9f-G@O zW*v;u4Ze#6b7ZX4?E&7fkhN-ZIX*V~T0bwbKIbV;7?-IQnj+Isthq7|)YFA~5aTV# zgZY?sB;Y;bBr_4V<;ldxJ^EaYCu{^Zd?d!19vZ;g-gkerMxqiG;}61Ng=<{n*>;zu zAgxa5Rv&t~uHdD#_*sE-NN7hpXA7Zs3*sz!4Z`6+!MPo^Uti7D1iT;~>?Gt)SY(}XL1fIE7(a1QjNHT&l|SLGY- z>)Owm^K#Z4R;ROzy~o*f?#}ksSLZ)}JPfbv{<5AA-mflZ*VEq36Q8#Sy#0CLd{{pY zFILaRuDi{yU32W#qsDzF&cnRCFRNpBefR$UKBz9-JYZh_UKWkJ?EkJev6cNfw{Zy+ z4S1QUWQqRIeO!^onVY@hLa6^@KZgWqSjN43)vg2GoC_=IMTf9m$6vp8tlr0x;gxZ6 zt&|halGw7wZJ(>j5O086gtWr$JemMIIf+9jSF~{khXKWalYwnjFRo}9+LGY6zUgv@ zIG00qnL6TYr>KM!?T~cnqoiy6Eay084@vY|_qixnjX&H!a;~0x|I0b|%a6X%O5G0^ zp;}k3AwJxf& z@aC-;1zU(62TPpqhQNq}Y{DHHSQy~EJ;EElQzh2#*58wU{*_PGNPrs-cAE6{DcltO z9H5Vqrj7->@Q%)ovvoxsJMmCzX5W4oXNG30uxOuRfYSewm& z(x_Kb+TRaV<@YyPh@;J>u)lz*D;P$5|~Ymk}l$ z8aX8h%XRP$@Z0~aU4p&fK$Daw`*ZBtw?I5vv}4#tJtQgtH-T(yYr@jK?YvzhzR3cv zVPcJ8fHOMyqy>TYQtH?bCCkTL$RP61>?Y*Z6C~ ziXBpCIXGTrxXlyj4?d(KU7u4l(GI1atu3@l6&A zIDSLLMa;MbA=<1&8S%OuymPRJL@^Z_xnwpNu`(M1wiRL{#yh{s!Y{fu=hDHWgLcjQ zME#sbr~2KWt669{elrUb-*zdi^MGQ`{fp@~<=msC8|P|dB&s;jLpewbc8Q84N^{rD zPpb%TtlK*gSHQ7&C)sjcUH3sdsxV`YmhzsS(H(6r!4EKn6kZpcj;d?AN zhr@oHZL0)pG2$*3#pnwE_*VZ~v0@QV^=?%;r=l~p1tn?DMrYS(=^N0c< zCYaAh0UtX8$jSl<1F3-kbJzzIkl=3<6Df*-06V>bqZA#01B#WVH1;K_`Fs=r*f+zU zG_o~}ON{Rxx-G)mhHHB^lj(=KfdMv=<%9EuM2U%$OkxmVm;j6l2)b2?QrFgM6-`Kt zHD-aY3}9kTj^ z^PD?j>&;zpzHklaq9~FN^w@}ztFjZmHN3WnWAyCb|M1B*Yb zJJoK0Gwp8y)i)I--Y3q#a{fsP_{#a(A!EIl^YOAQ>;6BH5eJ%M!NxPrCGpAzYgPf` z2ITClgJK8o&5D&ql$1_v(QBa~Zsb?q*26`owlUFAVb6g6yk zNGz2le3&~fm(qMDhexvfPPm+@c_eSLe!&{CL9QrQmP<8%*Axcpp}Xfi`v1mx^sida zqxXw*t}$N^=O$1}K^i4psnufbA-4Wh)~de+NU&xT$~iZNmNcn@OFG-(yy_vg4uCS{ zh`P=qFbOeWeHU346Tq?-C>KDkn@cvW$gfKFn-zQHBYao`IwR>kC<*pVoBU;tJ)hrS zjdZ;fEPG>iDoO*%InEb@{rl%Hg7=tn_an}^1BSntdLB&%ZZdZFocn5VuCd<#lTk9D zDc((pUs>WtGBP2;p+^D+@Tj&87ToEiLXdMiO_O36*qmczbKdEba`k*ZA0oR@dZcKO z3=tO;2#J|Z;GDY-bGck&0VH2HSILy}OoEVOYGgpSW`!vsApnK&@}LNqwB>5uu9Ng+Dhd;PI5jS=uh$DR`?!sZfrbYoI7Cni>c?~+35{yLoO@FhfshD}=jH>nK(}U^28}<#MB?+rRxS(0XI|2P8ouyBb&RL7 z`OweFd30yyVrF(_Wo~G4@8XwZkqK8;_d4n35;ttr&74Xs@u`t<07`*Rix>ASj2j>eB+`UKYo=Mr%b(yOS~1r! z^EhYn4rqx&Dt18GW<4aO@|GzQhqdPC*bv2P>dfzF;8Mr%1?wcG)SnL6$nbnAm>b)wLd>X?vV3UqNJgWosvO(8E7Hr zvY#|4xD>XuCL2%{LRC)ZuBc=rcFL_Ig>{?n;Y-eaz|27I2>@UYl0GI zHCSMiS%ajalt9uekP7jcs?`*Gf*T5Cm*1aqA=qFNWgEiW3fjE(f+{Lnh6@)2JlFN%mn zg7e*nbHV^|^PPMQ*U%c680Ddf{XUEeu%=|#(pr>@V+N&qu0}y4O=zmZ8X((lo9|A` zRuC<0y15HfdY9V-a1)dPRUFI(Y)E0mL-R8?9ar^ge}8}Z_0s;UlRM#D z|Ly%hpAKYr@?vIchjTu|?A_jQcz=26m7|z1|LbO7KjP=cyv@&8#xNex*x#3zPaNjl z71!f>BCf}JId>s}-Upiun%KtCa|$%`mvhq1H40BKYFh7?LF*>-8XVDp7EQK9m)1gwD#UHhD}tS9Zs2%I1ri#V z#FknEy6&>fh})15#q{UqJcvK`SPP=paX!IwZjjMFJ3Bi$e!0B-w(U6Q`upFs@1721 zc;aF*u-D~$0K;Qv=lh6+V|u&)?^_tV~ zw@5tA)-t!^oE&vHSF0V)-Itte&>&nw20>OmS$RPRt(Ws%*x+q9*Tz3BBK@hPy&Ug6 zS}6h5RrZ2Y{0OqVmaA1h5u-CIX@RC$2XZ0~CPA?kvCS9&*=z}*SQ9@Z=X>~Le;VGq zNa8^ba(>#w`C{-Eob&zpNV|P@{^Dn+NgsdzoB91WPX{s_SV^wz6el{I4`BEQwE6b6 zW1zQR-)7zZBYtkt6~?(`ESL-oXza~5?U(z`a$b-7Vzqj#){k?$cuJuKs0j$kjhuTp z-4(&=tV1088IcEIS~rN>l5e%9^7F53Bw@G0=a{T>6XcCU^ zCgDSd#59zi5T+w*O<}Lu#jM1-7og>h^D3@G*E_Q{K-b4NM<{rzDK z&)Www9G(kKOin~6qk+H>_WUX5cpKxD-Nq(vDFL|du|J)E;8KWi^@74~oU0-;9uNt3{s+QhtIFxEoMXh**YP3(6u_*NkZG&mT1KD&!l2b^RYWpXQq4 z*T9wjo*Y|q1ODIZh}u40dg~nJBkh0u5ySTBpoVYGx&FL8_F~@|cgo9`-(1J}w53mC zjGwn3FFU+H=i2T2_j8aAJOFXB2GWK{qEJ>p&N)b06Q~P2L2k)VRS;BYYAGn=4FH7# z&=#pvNNYzxhsgov9{@E;59h0(^R}D2K%u5(_^w@9m%M~YhvG&7AQ>_NaCjCO6l69B z)0$x@1?htnG>NzgQlTKxG7)81*S2w>X8_Lu)j6)~*dRoP93iSy#8^$?^}k=YN3SS6 zXwJ=?bMj91_s<;Mz@lyB+#$mj0qx~uXWT8HU&nd)QySx(x0lYHAR+g^ye zi9yLAWoqe9oZ|>+hItYy$ru|2d+z!7SpN2M$*CP|`{$Fp_`cflk~8*xjyd-|7Uk^= zN7wC!F+Oh8>#;tZ6Y}KY13zK%4f~K4zeqkV;qkCwMX`sE?LIHwYU# zI=Aj%xE^{$`13@8m@_JInnxGic+N|Zo6f;1Rj56^fs#1h&xa>|x7*G=54|F0`2?hd zO2wr*$6o<*NeNa(!PmL_b?`eR=-ke8Ue1{MJ^dczVx3QNP!pK|E0r>J-hMx~^L!xt zA&TN{vXd{+4B1+U8mdu+M$A3MvFt_^C;$5F160aPaxhQG$tu3i>;K-|pS_>kc|Hhw zW4&5zLTJWo(3V6Ev#CHM@8;5n&!8i#r9S$gq80&%@OVMLmi^pzzGv?YeA39$0FJAD zne48dy}h;VmWI$XMh3?uQ0@Y0VuBtyOiYN_iUvUiMO{!uqyWT)dIy0p4H0Wod)wx2 z)A(=RdvC`124-vrSH|sTzsBiv{D%3=@Y@Lt`o5x{|7rNOA#$#Hq3>_f zk=&D;``r@n=>I+Ae7Je0%cmb?oM-a7aqis5u^5`Uqt3Yn^y~^3x~OZ1UC`{*wZoB+ z1OfSw1)+Wbc-NIW_l`;}pR~UJE;t9!qs<%V{E5JMBR-&+^IpW++um}1k$+>*BV?R6 zYdXF@5ACha_T5qC{F~sx!m?S^vop*V*13z42D)#Nk(BE+mgZkwHv3SJftcBh*q+gB zrJ^13LFX<88~~w^$xC8)(7CsZ=l5SY@m4j>T|TfqyeF^bx5&Apo7{ib@;w^QYxN7A zIp-YmZ{D8unDgXY9ePbZo)4d7_2axeNn%Bf^FC^Ov6%%uI|dtstYC(lmiEj%mzp4q zAmOB*c1pfd(GK~bbB7QQPz1>2C9yjLI(NBve&Piono&!0lM|AQX`!0i(!#lajnguoH{xR&o>NW@oNFz>+B)JC6Zal+Ub_zGIaYJ8DaZ5S zY*jDLA56{;Za&zXRPjJ!l~T+-zK)g!J-c%ry|OHgiaHhx;T)9fB&4RrLWGVmecnX2 zZ`?a*)TyRum-0d94oAWPu&Z4r4`O%Fxy!`!p}lqDiBwHv_R#uW^C7ZLKsC3>`Biez zBd@iqSAW%fv@UdTZ1+bEoV(JR#`CzA;e7b`z6Q=U7T}*_6%+SfavuG!q5JT;wDubG z5Jau159ibyb$|2w`)cd${b(Ljad&imhU(d8(KG6D*`)LE$X*e1E?2IvAfag~M?zf`*4t9I%M*a*d284GV#34 zBs$qu(%c)wDrt^jx}h5VICtf|yf4jTfjhg#=d2E|gZ1Wk#dCft%=^1r*c*ut(ITtH7unk{pjVi_nMsZQb{k)Lz7=W+Pt@=#<_4K18iR& zqo@boj4hr*jm9+7BYKe@YX{bg=&h6oJV9x7nr5${F zDwoE_vGklTpty&R3yXuhT+Mx2ttaF8#z5@+e122OIX;bdE`TSNe%|M4*@>`@_jp@e z$0Mp;1cjYaRJ=N2J%Nl-?c= z_;^-JuPMj#W=${7XErDIH;bz8tCdk%bgU3PyX63FiGqnDk+T0tI0xnW#DeKTA8GCr zcl*{nZU)hUn^~j^W@fs)P83c`MLXonbnb`fp_^GTjgG?s=3O*vu^7?9M7vBL#O|PT z2k|^OVpP(Ws8o`fMIoq0PtLck)>9Ub4_w;gYW=8x7X?HwRWWCatB^hXvXNUzeBhU<1|am=EmCy zhU`#H(GK~bbH^jQS@6Zf0R&2m1y2gb+hy_~b_bn1i06TGl{C>8JB!LtjXs=%9oR*! zpp}) zk&P!w&~219YhtV82S1ZIQc&mecVsa)xiE(#n)r5{!6z!1DNIG{c znp?2hY)Ezjs+_}taCW;)UJ|>5&K<<_z_}ugaDE8y8<1*r<{T{Gehn6Ijq$O9qd_*M zC?3y8-=~!0xtAie#-`U?{yBBbIF|DsaW0;Y=Py&KOhsD+gTdnTilVCS3vk$#>ju+27) zP~>Z3a;AGPt!ozMFW(94bVfBryOhsJI(N)@1cz;5OU}88>^oRc%H&0{`vXbm4&r&> zTqSKukjj?PG*qJ_=aL27wavG3b9PnEkJzp_hgW~qOfCEV{QN_zrhI)a4X3C4(OQe; z)iB$(x{mnPX_`FdKT_Gk*oD^D=Ys>v*XP|A;BRpxr!6=#aUZGn=yIJxvMVXQ&})9M z@N4b0zvG2cf;Ww1{q{NE7w@CAVWzAY(F&Ea$HWD*WjW`u@MAJnHkqdXg&vUcozA{z za4UGQgw`kEZV8==b}65cbnc?nd1!hZ4%iWo4w>6!@@7fw4mx*9JP(|!r43=DG--wV zpqid>uCxQYSTbrFTrQ4Hd;C7@6i2+^b|J?j+JRXs-g6Dk8_`-J|Lpw3>r{ns?r%G> z%iv(inH;_}Yxh`Latdy$?Zljiv!^{CeoEv#QPRly@z99cI-FmoJZ7&bKwc!ShUO?g z5;xMLOH?a~{3m49&?8eEsn)@Yy=J$PGF@%8`=Qs=*V_l`mw&73ncL^wIgdg_o_;8> zvW4dEF%#qlgzIENKeQp|oROMAG&w=ij20W(A^X;y&%;{`(YYH{6zz}?I(PGKI7IZ# z2*z`qKK}?i9?_h;T_z7=chI>@;(6d)EzR-*EtA%|8LDC2`&;B}i+#fOhB^0KX#wXt zo>e|sPS>0dH{!`?^CY(Mb0RfNIrqpo|H+WI@|=YRCCh`M#P| zfRAqN29*Lji!`Xk+cUy>CE5!dnu+?SIrnMkHDT-jY!3}&GH_|?ZF5f7u3{+soxqCa z07YgaWchs2geGU_P3oKvjiQ4cn+Z2VCKOyorZN-6jq*Ag9a2-YLq6!-k4@oVaf2*} z!vQfgS2W^B>yXKV*d284AfA^vS4$%W8u3H!$f{w4$;T=R!aHp@$2n(}1$RY~BBy)K z8}U-1K5()8OQDdW@2feivUsAQIGp21rvp`Ip!$YWXOXHI z?_R&doDW2MA=Id68-^>Q+g@{g{`2i8;>`UdtJn2vo0DSfDLBV~noQwEQP0k}U*Kh(x|7x-F{uaDIQY_=?8no|?aXsoyMDqhIRM zolAYNzcbAJ{Z6qpIOx9gwEsy%KIq(M`uoN^^TwA3-3pmJh}}Ww4&r$T^|bLVd}&4g}95u9vmoO;0I2 zEUJj?z#|+e`EipaevOp`U^RTRVn7l^vDfyhsz7tKC&unKo065;KXX3ke1c-#7xw!& zm!dWl!-I&pwIqSl^*TF43n1n2EN(l4u+mBahi=f_+S2d(L#=mB|zyj%?C)(R5@YgUCk2{xNYOz zb~a}Ef&>9>B9bh;(V`)Ngv1C47(oRqQU_Z{L|}RytWLtsfWC!B& z;hE*&*1UV`#y;mbu6tYio7b=!XxnYnj%47jA7gi11D(M4;B$xLhH-kI7bOM4I&uJ! zQI;fGlwe;Z3ME+MOLyaQS5H1Sl7uc*Ana#8SNLjsKELxRI{x61&+Dau_}mzu*_lbM z&x~I6c_(_o#F5Rm*H-0xJZ`gX7#N1)5vZ<25t(f&jbUWQwi-o;yUBG`UW!xDWF~JW zALyf2)WaYeQ0T-KJDN~K-L|L`eM=nJY;W3zv36qHYePU#T*G>7b#IqpD2ZY~KKB(m zw@;-5J?C>{726zEHD{x2u9WhyFUkml5xy52xA3_u-Nny=^g>Vh9Li#SA18HluS?ur zcA1yqrQE*~pZ9Z$&5l!ayx)e<$kztp^V|&4aff}l4)lVF7aDOv)0m}&SD<(Vs;f~* zT&qOIE>PRJ)mBHTaf(yWw5+zw=%bF*wgkf+;3LqgP_;pxA`f*K#y)9F(1vzg0}Hkp zN}?E$&nM?PySI>@>NTI&NH&K?>_sA@B$w)Z74}70fv>@{v;1v*-lYKQlf$yLH=oy} z{Ie6W2F<-Lad+ACe4YAy?H}lMb^ud6`wSrzl|lI2U>bKL89VsAjitbmnsBR+y=x$a zTSyZz*S zs3n2h?94W)7K=J&R63N+$(RAyo_M^c2SqSBkeX+X^#}+Zt|19xvx$6>7;U#vVm7SwY+$O94 zFc8*kY0rp8c&Xr=z$C%6UIkL!Nk?{9J($vJk;?#|3^u+@ekPf)m~0IVs;(B~>P z$%YVFS0v7OYK@rDE(FqhB$$|hP9+r{#OfhC86=)C12lOVc7}CJr+4a7g`PWzb!tfK2`>r=pLYenSfv}Q6G-~Dq0s0f01Y}TnRo< z?9H37y=9VUJ^Y2^Wy`vI`Z{t9q5ltaJL|oP{z@OA-vnf;*ie_fKPbJ8)m75Se8X&U z!+o00xk{gWK5hUE$tlb}R6fA*7Yk;3?IEQe*Fo9>c=^lDX%9UaGbx(=K~QJ^!P44l zl7mjU`k_Q?yA1Cl#UfBLO}~$3>K;>lyg!T+@A83*^lO!2EPj-Q0DjI8(=JS#rI}>B z;7?YD`9O)zLiP2D-@h7oPrx18uD6Vl$70|v3DLML+9-pak>ObmI{O`($cF;w9 z06jg|g!ve?UH*c=YT2DQ57Un*&)PJjY;X1=rp1;|Z=w}XxPbLa&=Tt9& z4T)!V(dPunWe<|~{#N_$Ha0eX^!0=%n}AUbVryA`O^ZAn?3k|-vm@ozq$-1zgo;Sh zMKGCMBorZoUeUP)<_y&!PZ;wi91B@NQI#!(C_pUA2>>bIZgOmj@rnNOfYkB~WtO-; zWTE*^)20l@@j?JojfiBLy7{Ae%qTsRh*TdhF-(-H;civ3jH{OzsJ}qcC??CTW%G^W zvgOA9#heVlElA5`Qm$>l9=VRXW|GQHP_oVd@+*@nMBT{BuolZ&t52TesZiaxM*6p* z3kqDO_V|autQ7Rxd5oJnjY~5|fXd{MN|)seA*t2il95kzfAo%znZh!SRt3`{Xb-## z{yZBC{@bI5M1fX7BqL9Er#bd{Eiywj9*`*Zf1JMclDD}c0yn4OC%D8ouaF5JyJ@l`6cKZtTm3Nl^+ifONnw(m3C^v(%AgGXx+Eeh>1~C%s{9 zvuzP)U+A8}(Tu8Z>uiyilAx`k&4{no?Dsjev7(q5js^A_0;k~Y*fp!4qEUzV*$NhV*emm9ZIfSD}@3tddVahfiPlSubn#YcD0D&>n_WD`Rka0HRMD{h%I1uJ)Jku%usis3kZKC?VLuN0bG>>caBoAWDfJ)xU2*DMI*zLRzzFRizzBM2d z>O45>?<}`CHO!kE=JnHYIN@Lu2Yg0& z^!}N@I5laS^?X8yu7$e0^Faj5Yw}JN<2LJPhNJZ6a3(U6LwLT(ix*`&d*~SOAP&+X zA_7qwxAkiWaT^65p4awc1_=eoL0ed-{)9>XKAczy66ul@>$<`BQuq_w`-Xh}Ey#C+ z#fm9WX2^w>w6s6mX;&=+MNn6{eO$9z@e(=p5}4~Qc2^0C0unq9#8X}nOd&2i>6iWyL2=pmDI3}v#_*0xL?Er#CU)5 zel->qo1E&MP0S0PD&A_jnC-LG~yyN@jVv@{z`-Yks

Q1EDlmfVZcs|fr(sbFfdmy~#)UMwL7r6^`ou@b1qbZR0WnCAx~8&i^Roo+3XI)&%>p>hsKlFun+m@=ehOZu$2ZwDpjybOXp?w=%$Ju?%_Z$Fd>&t9{_r(PLu z4jY2R%D`l{`9|+Ib@*MiG<_l%P$j~>PH*Gj{DpRNc+lKm+~Kclo6?|i(oUrgs+xR5 z-GY7xA2Oiw6Z7~!^*M?Uk=MKbZ-j%(?<@*g!Znhgp=RSBrmNc>bWFbgnyjEG zL;Bg?S{X;3`)AB=65=*5Cpx+C!K?Gb6U{CZH#3zxXd4ju_4nM)0d*k~Xe=p{fPH=E zY2|xeKOoRuOF1B`hab6q7u-U9^}rT!o&(<+7+t49NH}oxvVNy6FI5c_4vNguyn4tCRFRcxNcu3|~?B#Y|y1 zZPn=>PU$>1)~E;-7zc@`&~CWIq-MR2dOiaQbT5(x9P+8)+^;y*lWN`{26$=pOcnGO zY3bD8Pqn6HAEm3B+QmSHRcjVg@^2^@4=Mgxe>}jfbKZXm%!0lV$xy`4dDGnZ*lfvX z+ld@f7xIJnYvWK&g!+~i{A1|o2aC=Z>2mVfj1%1-o*VnRMuM&PaLb|p-UTboBN8#} zUHz~-w7~k$9FtCDwbo;_a4_tN4K6g|YxaATB1f2InPPvVE)$#+cR6-NMHj2x#ONYA zpbB?X$@|M2BZPjATNeFD7Dg!-qxsd{G=hfh0zUlf`;ylIchZg)6=S-3pmMVgP57-t zyh_$%~KeXsQCQ!H$F4`09B; zRjhGBQ0?z?yfF*Jcrww?*@VK*4Wxl21>PS>Ht3Fg)iXn%rY#zZYC!0x^337O^`yKyPd_Zw1ImsFm^7VKC#80>$M@II#Ff zZTbKL<|BdHL$q$dIb`a%}{v|n&!Ojxu&UuY8z3KtU%XF*~({nMOzB-I+M%%x}A zGH|Gs*6uKss9G(k6Kps1TC-|F9z3*ggByz(LrDd$DfCWz9i-t~x(4}*dO~a<8z;bX z)fG9C;4P8~!6q-qvbAtwrXtomSV^g7R1$J3+I-yi9W}lr9QI|Mii;i@jC6bagd}6x zedc~*2E|XcDoX9IdqGfZ`kxz)^YV2uaZMT(%cA@{H~Yiu*^$#<6OfKZHiEdIkGGTU_i0ef zZEgrc#caEm4u^QbGC$?+k5Jhx-ZfruP`l5!vA7h4;kd|Uia zeRyT4g&tqviZ!Ov)wt5#!zfBa-wN2Au7yBd(bCh>(}7vnKJ*1F`6CO4hO6J$jip%# zW!t@X=4fOTQLBN%pE9^qiUms6@?ge70{@FdFw8FpwORZXfwE-tR%I1X=@(sEsf8`Qf48)*O6B1;Nsk zq~JFEG>&0A23ul$+PH>Ps9G@%xWQdu0%EjFCUams1O1@x0X$dXi<)UG8DWds8mpgf ze@D{)%ync&1xvi0V^nO4=)D3#ve&+wMYe2~=?P!%?j$8U6qg*~9mLm`tZ8OS&L&V| zdhTPw%+vkSS<0p1K}H=* zSXlzu-uisa9CK{W#y9*A5OJS1wV%NLicJ<-E^^cir{BoP7XGs7{IoPj)xVPwpH-0#7T}&#LGLlU38q4b9~t0xvkx4VokPrcsfeIdI5JJu50Sp<|K};l$CDH{1^1wQu%5R<#TbX-k6~{tm|n z=wGsl@vtfprnj`jrCDPCYIq|Ff_g%8rk7X=Nhhr8U~6N#4-GvVm)LO9*D{Y20SQ@z zP(rWdM1s3ar_8%T1U+UP@Z@?I=b+I6l5A}GT6*{_}k>{qZ5 zCIa~cp_01$w7YVhGf}1VB3QV0Jal~g*JKdCh*EQUdG|_U1MAz!dK?`)A)MDm!Hfwi zPOl*CXN=1!_HQuMeql}INW4SR5qOkW1+tX~*JKENoH9J_k#pZ^)M9_`;4R{%nc0Rv zl;W@Jf$Jc3klpje@dwA-fyG1I^)FOUx7RvuVg*OJjAgO_?BTsk>MOqZ_mVnY=DFp1 z*T;7Y>=|$sZpde9yF~$hYMq@Nt3onKiE4A?G|yb$l^?q$#{KcD{1k{m9o5W{kQlqj zBzG)bpHrT|$-%qOiQ0uf;82Ea>q(J+iwrlIx^w;iVFvc|jG%w~OH&_l>e@WgN$>-* zFC*?3QQdA1az~6F7^$(KJfbI%Ks~30=w5YPdwzNZ<#eCePOytb@*~@`6W%+Y?2L)1 z?vcftR}rMtQWK(2h=HxBCkU7zHs@n+ep6z7%&VsuV?{vy8V&puE2k6H;u~wy$urbe z)bAPoX147|6#uFH-$#Fe6x4+qh?&yEh~&S>PgE)<635Aa`lh(X&XbLm0S49&XPb&P zzEg+ahPwoF zF#h^SaF39Z7mjyeVC$?K5v;&J_N>v`tfo%gJ@>HR7%H{D04l$kAi_3(M(dEy0R>7F z%%QvZ`-nx1wU!n^%Ofr4yMrcERRlCe2mjMHNAx!cMD^$qAVO(U5IUUtA6TS@%hj%J z=_q4E1LW17)XsRcYrhehHKosvB>#&>)TNIzD=MGlmwupsFu1C6PRh+FMsVoVW0YN3 zDJe)NL}Y3QWcIPcK_Gb*o;buYp8Y-tOxEoKp{@BzD=UKY)hwtYsbDQZ@q6>tS1~N* z`eSGvwqE#gYs((*kc*t6zj1Ai_^H4-``%5aPtT2CNj^)hUuGCG&|I#`q4;?6tM-9z zbEI~>lItVgQAtVCWfTc|r=i4UAX-Sst~&PrpTkdL51ooq z6iQp&FdTOhFj}s z(b~>`9ETtjQPk`4@^FD=n*jc+Dv=pznBjl^*ml=9JLm6I;Dco1>-Jmw=HXLfH&4HG zn_3TkEq7rP&^Xm*7|$|$(KyfH(f(*haKH<`DAL?D{TSD2=AGr5QlSToGS~PC2Hf5g zc8)w5qDDd(A1+djq!sb59kcbV%?T+FTd^Re=ENE!rl+JY?mtyH3W zH=bH!KEvLx5xfF{Q}0&&arVVF*nbY=5$b{tdd@nSlq^=_lT`W?tK1vui|IMdWAUE> zgj_KHmx$+Cf)fLpdsf7JbQ?tPq!B~e=$|f_!|ab;bRn^YMCM}nA?AM_Gg%^%+{Li| zAMByZSH@S(0Na)r7^d(^>9i*o_LzuBest3FPDTaPhUO`igq0}>c(j|DtV4tdzprKr zLAk5A-oN7F6@9Htyju{VLqgyUs4*(2=!7xtRzQ~Sjb5@bo@ZK?g! z4rp4VszCQLpZ-qNnqbbZ|K}{QKTcLK)^CSy()cX11Me?TU!8@bNaffubxi(ke-wiq z*p88Z@`?i0d{qXen_~37_ue`Z=1u%{l*H>X4Rz z``j-rfq-3WfH(njIhWTt$cMZ33L@}}U2#b24blMV)M08D$s$WOp4uP)jJMY|$s(XD zSEmy|fKE+mV#rFQ zlEbkgEYxvjF5%y%GE;dz0xFp)2xY@-OhdZ`{%s&Vam|HwoPyV1gppYO!dY2JBHL! z{9=nt*NF$-vkpE&>eJ>*AK>ZrTGmg=n(oh{8h*1&OcwZB$l8$fC}pMPTm*>sYKmY= zAY}LTRKx)Woz%BUm7{T|YKW%mQ()N0=Mts#fI{|XvOL^lVlA!Riu2WT4+W4BAGAMp z%Icay~fXKH{5J! z=36umeKKk2KDdig=oP)VSB-zZZHXgH_^z|RCal0znORylG18G!~AaJp30mYGs&-}l{wSt z>y^_$!#~{W@W|!GX0)hkAF93h#GDKqh>@tlTeT|^v&vd?!e72=(k!LbK+6yB^vdvf0w*OKs%wtzE`6bT^U-G=G=Nj~x zj1;HnY77g4G~GW}x&G>U#x*!J@#0gu66ciDGW&GcTukh3tAQ^)Y4P4c>6!w3M9fGZ zFLf+T;m1cw&?xXPj3_`H58%H&yrvXL+C|MuF8zp+j%kExR=xKY>H6#KN>Er^5wVhy zSA@q3zau5>11LcQDE3`0Lh#CmKISV^OESMpO(@pccYUCcE zJ9opdE?Bp#<%}V8La=Hlr2`mr0l92RxL?hNzm<0Wmn<*Bv-bxvC02DCTGcX%(K2c+ z^~aIdWFRj&CDq;V&v`eb?#t5W{Bm>j0f>p$O^fL2znNn(i1$rN#i@>rdZ@;oHw9hg z_FTtMmIu}rSNgEKaW{SfWKM+~N1~m`n%G?QW)Lb`v7(55JTvil3ublXCz7@O9k#T> zgL8XQPS=|CBilk|MR5YbPle-r=zImz8FJ;L9yUVjZK!?mIly>8-=kUV?q&?qP)_LB zQeA9)J^d&`!=Eb~=yw19In+maY@WF`H=Y#~Mp2L7eg=rw0SQS`nKO4Y;T9}k9@Uj0 z%a~%*a{-Ay5A66f*dWW;a-!F~wrUNYIXYOONeK_=E1bOn!&n#_VD+s1YKXmkmzu+C=2lpO(8FWLuG*a2hQad zB7IpF<9HpUyEBo$K|iN9^koQj7ki{2m+ktPQAJTVJPL60akCRR$36HMr|j7>z4d*N zDfmrw8K+{>kMHA7C<@f0;m+oj-r|8+VhIH0_xsya4~85ci7oOzL`<*NpbU{_Txl*gqqa*k|2( z93piOMS6?>ZL|Y&I|ygt-)Dv$o%cg(!VN_lkr@Iua*6K}P;fTj#@#O_c8Frab^*7+ zB&>el8pQ4Di;6XxeqX?S9lbM$0uBE}ooXid$7Y>X zBIG<08F=AsT!9jmki_y9=P?>15T?4GJwbSW`r3gH^&!d0$D_mhupKXgToEiPnK2=Z z0_Wx*I%N@>t}+#K)#8yo-1P-Hr4rFcTmrj#hYBND?u)hf89nIhQTSSIa~n(ZShhqt znE*%f@vmbFc3J@ZE;J%v(`1+!qUi0NG%|BWNg8%9;t9h-lj5~j$t8z;()!6m*G<$1 z5_tG)(!rNAW3Hw|q4Ag9<}U@E*^~N-+cHA3Sx7k7GfO5B%oe)DU5#A(aXbJ>dEMb$ zBi`U(SLCi%*P;gasSnyudDbi!Ty8+xb!~dj06do_um;5Ss*|#mILZ zcXu#8(#WU2QB^0Q^|xJ27`;G!w90CSW;UTpcEt~dgE_e(QIju3fm^AWWmKqET~EE_ z%`SUKp)RhXIcP-Mc4t-%`sxk#7yvsht&%uC(7T5yuf+Ft1wMN^e*S|7Tf=_OVQ3EK zm=AFMb>1vS8HsC~7rNYw`JGD;swJ-xgifz+x_+20WSTS0~=OQfWX21G9X^If0 zOE}~M$%__L9>zXwt0=g97S3cKo4}Ij`I_IxV4GG$o@Xt-dDrCLT;Z`Mff@Seat=5KZ{MpJhwce<`V`lNZKiaFL4qJCW09TPb>Ha7F5-Y{CNHR zXoRFUcJ^zORZOl zYw&*_fVZDxB;aGbk?ulKVes_agQ)&KS9mShQVI=z3ZC1VBO-s%;-JtwI+X?M0i z>|Q5PkKq4*jAkPisb=pGuL}_~ksXHrw8Zaywa+P~3<7)>HjJqHja=Uk79PR>7|nzd zlSPenjHG#ht(JBZ6#mV4)u_y34&=@8)Q9TnajRqp@Vy*_JW6p!(8fe&=;7rJ{;ObK9UBqQ5a5drs{aF@@X zqWtyKn>{sKqQ-VezmBhb5DhPLQOR5%^#6HQNqC=7C zgXwh4f583xxa%YQd$rp)FiOnJR-+_x6268{@@qgf;u%6tyFnC@VK~gkPaubU*TP2l#tZ-d(j!HEO~viS5THdQ6WU^n?fZbqj;6ld#0OTgG|S{Xd0bQDyLTD=*%iQbPEL{ zTZiQ&2pX?l(vEZrG7Mj1OBXf~d7~guNoKq!WYnn0>rsD9%(p-a>|=T1ujK&HWVRNE zRefZ!R|kx1kr>3(bI6QKnPYTj=fEe5_jfKlS7-1C@Y9y9Teb~QMM8j5^4RGGnY=*W z;_Hs15Hsir1yv*|Zw9lo#bbQ)!SJ7JUh+VnruOLFMN3TX1kGoJOaFbE;~5%jHPDV@ zO;S&uHhq~=d;Lz9nAeQQ@bsZpV%ww_ueDh)`A|Tm!=KS7-j-+%zY|{*$X1Q1GdS}g zegU5F!T<1@r~Q|Z5Zd`yzXy>x#$__)#2PSI1zW-Ogi8RMPA~91NR3U=a5ja7w%+AL zjEaQuOg%CB;=oXLz)M#{$=xs1m9Q?&GQ?LLC9$gNsPf}Bx4u>R$1QBH%2yR7XGif! zfMT?N8lpaRUTej7X|%(}z}T5~tYwK2ofX>B3QCmg*x&=R6pdAJc`-^6>kI!ZewT*) z?Hs23(X`Ho)kz^?&oScH7oV@k8qz5j#eWu()AUwnAe}4^@3XIp#N!ZNHU~Ms1`Q08 z^^=RJvLuNvSFT$v1d|)rA z54^L6nzS->zfi&SbN4?AJb19l$ekeX`j|$9k|kgtFpZc0n#>MS)?P#V_m5NlYAouH zxU`ZQq#P+wh~GziI5zIhN92+EHX8j2F-&dRs9e8DH`{qw2-rh%tfW+@n z93^fb=-fz|_bl^>543scYi4r^OZ^>pC-gvdaHz^gr%B*^_<+Q9Avw zX}f>scu|M8{2J2z&EoA{8ViQ}mnbWly?2wYGeddl2J=1O|<@1-k9Uyc1H93eas4^=j^ zku;59hhms-Hg6N7zO-~-CZGUR8wPj8$GR!|P zOyElk;P5e$a4F$v>N=fzWxVovMgT!pX?JiDf&(*IP*sR)6%^y*2S2EfLfv-mKoMaX!W>#Xz|Pj>v&g0s0a~zbx~$YK8(tXBp6S!HXLefnYY=M zVtb zNtbhi@`0fe%EpXIYlPfG%yAF@dO*v;Js`HQw@kfEK8LA34p`jqiR6zdQZLE&T;xK9 z_RQa!jz#jH<$|`kTw~q%EPB<^i5 zxcn-bD-GOOSK*h099r;sEvo{@Cf8Qyg|Aj@k8k+RFh00!dXCyB0#4Vu63W(_L+za;8>l>sZQ$H8z+m6tjb803 zoz?nS3nbfC&5DGKygL$ErI) zm2=8G@i(Jdvl@xSahop(*cYCbHy^Tl*Z=UgK8In4J49WANB6ZFQS~9-XHjb(<}yhBZXN>C0h8 zS*ls|@e0Zqr=F$S`1SFSkux+MejuoKPegs;3k0d;o2rnPveJX0$}&M36Mm*=%=?>2 zPoHp~YlM!UJ^$P+WCZOcK=R*P+NT3v09#p0{mI{~P3bc5zZomi^eM`RbC}|fVozaG z5&p?3sFtf5s$WqIUJdCBZy*)U$&S+eV{mdtU zZ#KHR1ge?o48QLbSUv9@BSlxxqTGtQ((>IKM<3Ga4NibV8Xaa zWP!X-!7tn}q1^cQOGL-si+4d8$MTSK`n$$5SLHW-H@{1hhWH^5F5$T^kRqg?=2{@T z=6%*rC4hku*&gP@Cnag#0$q(Hud_&%?f#!eRIE_TEuX~d2O&;Elq5M)yv|-u{^M#q1;qW46Jp=6v;X{W z)&%m@MtIJ_9SnDO+A1%D<=Y7`|u@!IK)%;h9rxeBMJ3Hl&gZ>b7w#}hS9rE=i zOoj%@hBd&QLN(xkPM~|*FE9h9^=Le8Mo{r^C<11vh8Ljr#MA*YeWi^7B={{*V zzH%VJrw*gl5NmAANi(kMwi6^#N^6t@3YK8uqgJIrF|0^dPk!pOQI=k;>Rx&*oZI+! znT+E!-Yx}myMgPWsfW4TeJ>x}T36b}MwZo$Rz}Lc(HQ>|$qK#Of4B|1?orRnU)U+W zkvY05gXtjTfVulsy#ADMvk~Tgdaub4jx~AQ&~uzwrIPY7R7{8z)RnvZcRjlH%=z!g zSdBEM0iNTIrT$*w7_%`jETg-yhFIADhm8K|4;rjAR2)n!p$+>M>h=nWUMhLM@@fSx zd4mGF^R^K-sk2g6&!8+;tYn81I45v5s=^1+5UUm{FEZ(=a_NG6GLph$Z-;Yt8^|dEZ`@I(qV|L#dwaGgARCf`0-bwyB)l*L}5^oJUdT9i1q8C9MumCU~8dwsy+Ujt|2szt=2pi=Xcmn>HG*!?V_^d?F5H> zqZz!%MQ8oge%#S}oXjyIl|TcksxCk!@vVO^u1ld%tlt-qyc+OvL4y9!j25JR>)Q43 z8zoRjamB<-l%xIPAu#P&=^LoeML2$P`n6`k_oldNvZGR*-?hxJ3J?_K=t|H@FCQ<~ zgi!GLfTFO3AYRslT927fR))W9)xEzAjWd03_yYl}ELPPIDcl@-j4pkgkJZyZT)aJT zLu$vQM_l1g@)NxpdS7_utr-wCWApUjPnGUr`m`RydTPdNF*K&c6Sclu&ISAcTO_w0 ztZqxyb-U$iBIrsja(TGbwjJNxQ~8WFJn4N@g>~~4tQECE0)A)UIcp*kx2H%LS}=kX zM5y#Zr}Jie20W^lC&}(=D0`3HfxvFmNba`8A9nmYZ9Q(0YK26=4ff6)$_CjWkF)iY z_3udCEx%S!U1QuUna6a#FyfUlo+V<)8mKZ;3st1hI)siYe{F9yL1pF{bLux2crHQ- zU)v(Qq78QO7V!Sz)yYD8p3UToU)~KlQ9?|DWm?JpXj#MXQTa7-cff~!k5v!*+xMye z2{mXI;f(ct`M!}u2n3fb_=NOUB$V4NoO^oG+0VdG6FN zed`0X7r6kz!129at)WxG`!}DDSR1vgS?6$$V*S0$ORu{n$jgAK=0NSt!N_H?Cp^vQ?dU45TjtLQGG4M!fb^II4Lk~ z?aMqpXZm+jFkhwM>@B;!q)*FZ(`*X0> zHL4<2LABrp2~6XAZT2a~EvC`cX4CtcnOvP)ahLU|90e_Q3u%mvto3GOSv|EN<}w3~ zG$*36$RKXY+~3Dz-}Vo5Q|doo^06pSJguZ%j1pE%U4!FLZvA;CWt?Jr`IY^d`o?tOLyWKILQMXWKj^ zhR~M?7kWFhD;lP^<{<6-NYMTmRxN4EGT-wY)alTfZlg$InZ>oiZ%8hVW>zO@S@O%p z`-C|rU~$TRiqcv+?|)gUEA4KMo&7Jk;Y;b<(PhX%yJw>9kyS$npkqVP=~eAHbv*0L z=~fHkM#U6lAd)7&E*|71?~&zfTNWa_Jptn`rmt{}WTSLk2z{#o3>9PasSyt`c|fL8 ztS@F2y#sM*6%Sw)Y;$C#wW@{Ou_Z^T^s8%zHxaq6Kb)u2DMZAg{L1P%2#VaGLJ1h^ z^GgU9&+7LO(UJ?Mf`!j54IyZZ zI@<^`)oaDO{)4{GPZQQXHV6g3erCeH{ zXL`8;gM!Z?Km3|!yY3yayJOZ6KeB3)lXVXc7M719eqg3wQp5YktMp!W(4oUPKu$cx zLbjc>tInbP`z?7rPl3`D9#(XOk8i#(d(plr2S*JS0|l(Cd?|FDc>W z`m3(UksXgEple`Iq*{*{^2yVIIrJc6^~};i$KzjcPL5DoHwpT6soP`4Au{uk0r~79 zELk~qcIW8wvf}Epey7}ex_0oUPnE6d`<;-&DMb7)4@XQ=4YV-?kLwKG}hv8SQ5_&17FF z4EW#%2x#Ugd7LXT=++cH3wpiF*^p{aBlz&N)B$5AUXNxy=v=5?%OU0`!I3$fyzanG zqx-SN{&a|%#a!ETI(tQd+=9QHQukTBYoT*>E;7=l6I+fU=}2c>@J#%UsKTh2_Akjz zshT|ugz$sgI^!JcUVFOm!*uRWO`wiX&VUa$w;b5-spIJEXr%e7FS^cZrn0|kK)V_4 zn#eqd?WlJZCE0j`adb4cCkg1#A5Rx3PzQ=V&BYN$tU|J&t&7gBxx}rF*JohKCv-tC ze(8k@u6Qw?(F3yZxUjSVfq}*Pqdsg+4p#3IeiX!z6GoxxgT8Zu)j2Qsb7&))Z|>P^fMnm`cuf)#~vQ=5%g zmCXkr^!FMpz*$G<>fy&=8|KjJoG5M!KqX%uHTySVCK~6OX~bu+liCJK@^Vx?r+AA3 zPrW7NV~xd6qEgS*T+Ed(G@j_jSc|f;t1U^m?XZS)am!|IneRz*D0tZ<0UDiQ@^%KO zKlgX;vTbbP;oWSmF)*k%)gNwo+1>7!0(UK`WfT~iWZu~U-p7Ew{dS?UmFxTdO?;+c z>39ja*IU6%Zm%1Mq&f26(37H#1$0pe;f_d)Y_g0TSqJrQWN6gC?`a2k^4WC43sK~X zP@TiW4v~gPQpJ;o%#FyEC4&C|+KP%+BpZEdLb`l(_Z8}tEO4Ed2z=H}y6PjZ(4BG} zyu81g&7*=JZ75}^Z1P+5Y!ZNTd_e--5706DgQC5^ii z{kUJ*samP~FSeN95?6uG`Z$SU&tmgAT5Yw2pjAe0tCU6=Hymhbl1C>z`7TW*sT97{ zCyFDUmNa@+Ce>KmSb!r@+~Of=A<78Y#jlx$mJLVZA<3|gvx)$@-}fs^rDG+fEkddp zdNHsj7Vs9CFraYVc<;=p%Ou8*6>uF+DNZOpta?|vz2DaPen2&e4xtC3^b%}E)_o}} zM95spXn|_Y3(rcJ)*q0AYk=Of(ex%-u`0hifleg)3 z4KTcMe=&xF_0a?qWUQ*662yF2)E^G!pNOwto>e-H0!w$6GNBf?ujLIxiw^XlD?SAm zyK@t5WrtE%lgYUw!5)1uN087-3>1sNhY8m+C?$cpw#~|>t-odkOLo_JXlF10Lq%IC zGnE8>U*w~}y~AsQesG^4)bS(rzYqaWR67HjL!6pw<=`}8+I7-s^33eM-}}>3_7nw) z=hWF0Y)d|}C%Po6PSr9PVjLw4Q;Q@P>AV~y5mTJzNQ@>8tTaBN<6RubEV14)Rwsks zMmg+_P~}q_oNzT=(Tf`r0Y1gGN^z2FU#CZD79*s7S%jkUzU%`;ff-%fb(B&WZ#DM% znvk|Mq46GbFnLH2`1ZT%dED^U!Pv>IjYCiwUpOYj1)Kacl3D^|GaY|0~7U^OCFN)>ARXG=;{-trwrosb0)H_ z9y{9~G=rai-d7$=;LY>~XndbijGlK3JZyd*>H^uQni!s0tDfIjU_=7s_J@6-j+>b) zUWDsKm8WY0Hg|XlscF<#(Yd=iaw77>%lhew6YVjs>z(`Y{{*IWDU34?b!!2!iwrfE z@XRw0TK5pl`Z59ZOwyH8;+isd0+0&JC~)}DjDkwl=KG@0Q|K9);=`AUvX`w*1sinv zS^dctGL*-ZXf7gTlMBHIvaTz$+dn|ua{7&Q{))YptOvv3W)2iW2=tp^(-kXNTqa-) z6krGr=rPVj!yfi=y2xbs{rh*grQ~UEi+&@gA{v#0S`sbN}M(%#dG;}`5J@Zy(`QCaJL|4&l0COXydo8UEknoh>!g8<^-l^ zH&Y_(*bJgm@O%u4Td;-1sf1u^+$Ce*7v|=gN-ri{y;jjsG;Mp>@lCOx9?V4|Su`dHkcfi(wx&BvyJ@;#A)aL+cOW>O@qy0D%n$~~`Nas^j7jl@cV zhCZ!prpuxUL&Fbe*@Bc<_2$WwJ~8GCoS!eU3}L|r89SdabZi37e#-NW+QJp+y+ErQ z)P|CPHt$K!(*y}C3h0-lU>5Tu5%8a*hyj$4XnK!DiXzD$`E*k9ZKWwBK<^YayDT@} z7rWXuz?q$5vEfVtS+|nDN6!?g5sVbDcgTKycvwA2$X}$}YU0QuG?@_w=^W3yWwjFi z(B}t-jS)-Iyhfbv_npe})^~RK2WpUdi-CUV4l_utT|MxP7=z$Mf=OFgXL!9>ww=HO z_)Du;*czV|eo86N^8TMsm#o&BFf6GNmd2-X0wVv%m`*>)id5v4_HI5a$e9PlB-Ue8 zD_7-@H2!vt*Dp?8FQQH2jfHI>d-8+|+_kJ-_q?_)XL2hicDnJtoQT^f*9is%`@jCP zyX5T<)Y(Gs9ld{rF+LK%S*CxaS^dI2^okae{(9xpAm#$rQ*v)xuYAfW8d}+)o)B8e zl)jx=*k>wE<;lB-QRv3huLZ;{*6hY={-OVMQ=`SWcRsxDp#Gg=g_op;$aZZVxe3Yo zm}0u|puTk1EBL&JTVxv-SXFYR<@SM;%l>N)`pEcl%aHEiEd*+}X{_4SM)?2>mE>i0fj>gAxl4-j!`;@ej=K8C)p z!fe6Rvb@TqPgPNZ{Py@4BQ(L~B_dpZw>TMt!$dv|t16`yaWOh1rh45_;Vk+lBBAf? z0Z4a|;FOHyK;BX?96w8aeMsQs#3mb&LgYSOJuq(KNyBJ+a$0Wk%LNmEh*BOV$m1%u zr&>!b6ta8@D`+)xq>_NhJoe+k>1L#8{hY>>0Egf=Bv|23?$$*v9K2tOsEc4m9Nl|C zrDquKC>1W`WnUy!#ENnDiG6!Yen{h={1-)9(@Q$A11bR}RinKA@E!V{$$6SD3zj_a6*e6z=+O$qv)EENB3BM{`u& z>HAx)a-yKXNYA3kcOmr;7u``VHWUsmoUyr-O<~sA$&S0UCa=xYw@um8oa_7Vi}x!` zn?{9nHIoK)@zcDM=-pkS2epjbI;#gu63SYhUVA9x)>c#8oWl$8oFL0pjh`( z(thTSlPkW52YT&856=^-+5lsB*G3}-;6@(t6hhf`&{YmnWLy70JAA>3Rz4gSFX)aO zvc7=T)pZge3ucSw%qRl9W-S>5Ue8qt0a@m`3tQoatc}};-9E5aO>u{b3;qWprQ2-A zt1QshBQ(HL>w1sg^0vCK*|+i{?a^09W98jDtTn<;O}7)RTdW*EW+QcOpi7Vc(xl9p zHQ480J5u_qkGMgjk;95WQ`ZI3_Vb9wagW7exlJbMG@$Vk-8w<=ZQ*!QdlE9SsLez; z1{4rpXW&M54GCp2;Gq;sm@&x2f6ZLkMA$sGpT!l~{=Wbe2pv)ZL|(z7!&P=!{5U;3E$h2W3P3=vk7ruo<(C0SuTQD z5aJ*P%$)P2Zm&XlI9LZ5Y~$Q@@)jU&|9l?0x?_(>DC1pmZpGE14dmRy@et=;yo6_0 ztd5->+?VskN%Q5et`nU&fAhw2&XM$d6DRcgGgHnR^Pqe`jGWh-KPXu&mswR^J}N<6 z^`Q%{Y}vnn*pe|_wKoMaO@UnuyxHp_*d~-7Vd(HzQ^DUuB3F%xHqFJa4O(tnr2SkGT&`0NC#TSi%7|@OB_)pOc z4!Ufeob1#=!0<2$j8UNQMkXgl5~vdl&5Vck6Ikc&C=(MS5#t_pxzp8oxS#Q|+JncZ zgDK0$^H1-SPkR?FJ2|iXe<}5~8qb7uxfq%K;=u7HxuvVHgquw3qRZCF$xa=(VUA&HRIKCj zG63viEBF{p4FSYSv92fg)sXvoRjaiNT=wJ=0b=zshygR_ysmENwR;+%Ix1xOXi8AG zk@HL3TOy8~ggl;{U1Qo%^oZgPV?oR@z2wOjrE zbn?FX{rB(A|7<(w3+?COd^PdeGAHpw<6P4&XT^YSOvmYY-ly6ab=f*O*{K7srkN|+ zs94AF6e?_{&Vw4HSRdAthnM;Bc~e!#S0T-5XWJWm3&$qT`5>v=v0zvRXpY{TZ(mS1 zDs4;Mjyne1TV@lHk;LS_#)Xjrxm(U1OBPhV-p_BQEFaI(#;2C85wBD#xnH`}a?6*C zukO_E%N;rY+s22#+Rk~AIOoU29+kwj&Us10RyU>#L;P?%g*CG-TMz0^cIv<(-NH|! zV*R;GxM9y#EpMM}!yswi_2k3zd@5em&dc$VK=nEcB^WYs&X2aK+j9V?-|>v|B%8En zJ|`|FW+Z9RoC`S_>UKW=(UKjeHT59laZE<;9M2f8rDgMczSVfyt$zP%LYln{nd|q* zJJ08>mff5maS#XmX(WN8SPOG>gp$U20k-*Bb1^{1^fd33%4CLh*?LfSvQr0kCY?{@ z2F3a_s4?~mFyvcc+yyr?QBthy$-}3xdSiSRj$v2eYs#efvBH*#bDq@gLYh_eJhCGD z^#~S-^In{9m)m0EiyXR?96Ph2%j>KC>+v;dXO_K4xV?>Zjpd<@oKs9a$aoxB#vk6v zdCP9jw~BOKt@B_*Yy1y0{Y6e(U+-Vd9**Nz9J@@xu*W5R&3OaLNOhH+R-f@O9(IE@ zs59-k#<^P*k-!Fsfi`10?{tg+>az8y?qsJ9I9qFPYcVR;l~sP|K9mwOm}nhh0x8xh zc?Dv~ZH{xl3wiA-9c~;}>Z>Nsc~ZCg<`k+BaI3>}%JVkPqm5PkbTypnrv-Jpv_qEf z9f@jLNp^%fx3Qn|`;JFen`mw5uJ=CVe5=s9i*p)?`gxar{}umr*3hPJIUn`IX8JAS zH3%Rwsk&3hGXZ)AG|rJTWvc`T>MdiscoYMqie&5LWY;?|f^(c5gJM00nT~28y0M@y zFRXy*X;Z9Ia$Gi#$yuW4rs(FGifn~*;18NO=Skh}0#JZO965(w98FbdwXs0?b75ph17i;`#JA^TV?*^5)R;y>DVm${KWt{fIe$ZA*igilv zDYIVumUr>ywzh@{0NJRSbDq@g1Aw7%K2z0xCC&%oz>41gGz(K9CW3v((2FQ`z^YGU{sB`{g z1WZ-ul5~#bfOIZx26fKPP0>UNO)_`Q0qI=(jPIOZXSypsXnN=DoHlUh?EC?JtY3uc S!Znrv0000