From e216fec19f5ce2aa94576c66b023ff507a945ac9 Mon Sep 17 00:00:00 2001 From: haradahinata Date: Mon, 18 May 2026 04:18:14 +0900 Subject: [PATCH] Harden Cloudinary credential config --- common/components/CloudinaryManager.php | 52 +++++++++--- common/config/main.php | 6 +- ...tudenthub-55-cloudinary-hardening-demo.gif | Bin 0 -> 57086 bytes docs/setup.md | 24 +++++- scripts/check-cloudinary-hardening.py | 74 ++++++++++++++++++ 5 files changed, 139 insertions(+), 17 deletions(-) create mode 100644 docs/demo/studenthub-55-cloudinary-hardening-demo.gif create mode 100644 scripts/check-cloudinary-hardening.py diff --git a/common/components/CloudinaryManager.php b/common/components/CloudinaryManager.php index 361f737a..59b7bec7 100644 --- a/common/components/CloudinaryManager.php +++ b/common/components/CloudinaryManager.php @@ -2,11 +2,10 @@ namespace common\components; -use Yii; -use Cloudinary\Cloudinary; use Cloudinary\Configuration\Configuration; use Cloudinary\Api\Upload\UploadApi; use Cloudinary\Api\Admin\AdminApi; +use yii\base\InvalidConfigException; /** * @@ -21,7 +20,7 @@ class CloudinaryManager extends \yii\base\Component { public $api_key; public $api_secret; - private $cloudinary; + private $configured = false; /** * @inheritdoc @@ -30,13 +29,16 @@ public function init() { parent::init(); - foreach (['cloud_name', 'api_key', 'api_secret'] as $attribute) { - if ($this->$attribute === null) { - throw new yii\base\InvalidConfigException(strtr('"{class}::{attribute}" cannot be empty.', [ - '{class}' => static::class, - '{attribute}' => '$' . $attribute - ])); - } + $this->cloud_name = $this->normalizeConfigValue($this->cloud_name); + $this->api_key = $this->normalizeConfigValue($this->api_key); + $this->api_secret = $this->normalizeConfigValue($this->api_secret); + + $this->configured = $this->cloud_name !== null + && $this->api_key !== null + && $this->api_secret !== null; + + if (!$this->configured) { + return; } /*define('CLOUDINARY_CLOUD_NAME', $this->cloud_name); @@ -55,6 +57,24 @@ public function init() ]); } + private function normalizeConfigValue($value) + { + if ($value === null) { + return null; + } + + $value = trim((string) $value); + + return $value === '' ? null : $value; + } + + private function assertConfigured() + { + if (!$this->configured) { + throw new InvalidConfigException('Cloudinary credentials are not configured.'); + } + } + /** * Upload image * @param string $filePath @@ -63,7 +83,9 @@ public function init() */ public function upload($filePath, $options) { - return (new uploadApi())->upload( + $this->assertConfigured(); + + return (new UploadApi())->upload( $filePath, $options ); @@ -76,6 +98,8 @@ public function upload($filePath, $options) */ public function delete($path, $type = "image") { + $this->assertConfigured(); + //remove extension from path to get public_id $ext = pathinfo($path, PATHINFO_EXTENSION); @@ -83,7 +107,7 @@ public function delete($path, $type = "image") $public_id = str_replace(".".$ext, "", $path); //$this->cloudinary->delete - $result = (new uploadApi())->destroy($public_id, [ + $result = (new UploadApi())->destroy($public_id, [ "invalidate" => true,//remove from CDN cache if any "resource_type" => $type ]); @@ -98,7 +122,9 @@ public function delete($path, $type = "image") */ public function getUrl($public_id, $type = "image") { - $result = (new adminApi())->asset($public_id); + $this->assertConfigured(); + + $result = (new AdminApi())->asset($public_id); if ($result['secure_url']) { return $result['secure_url']; diff --git a/common/config/main.php b/common/config/main.php index 793bdb35..a0b5727f 100644 --- a/common/config/main.php +++ b/common/config/main.php @@ -55,9 +55,9 @@ ], 'cloudinaryManager' => [ 'class' => 'common\components\CloudinaryManager', - 'cloud_name' => 'studenthub', - 'api_key' => '251218449868375', - 'api_secret' => 'FILAex7q93GUB-q1bEe1pAKOIvY' + 'cloud_name' => getenv('CLOUDINARY_CLOUD_NAME') ?: null, + 'api_key' => getenv('CLOUDINARY_API_KEY') ?: null, + 'api_secret' => getenv('CLOUDINARY_API_SECRET') ?: null /** * You can access the bucket with: * http://res.cloudinary.com/studenthub/ diff --git a/docs/demo/studenthub-55-cloudinary-hardening-demo.gif b/docs/demo/studenthub-55-cloudinary-hardening-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e16b392cedbc3181bb6572b810c6c484cf0f45e0 GIT binary patch literal 57086 zcmYh?cQhN&`!MiCjMx#Ow%D_+s@fwV_NcvTQ>!Sgwx}YBJrjG2Ra@<%t;Vcfdlf}d zR9jV56nTAr-}n8U_nhb6d+tB?+<)%9=REiMXzOapD>$E!l>uV_01}CGadC0-@89v+ z>A~^w?(f6xgM-bVKi7YJU)tN<`uc6|>-Lwe-Hol?^)Fx7Hnu;nZ%uD+uB>fNY<^i< zSzq|{d46$aZeeA5ZfR;}@#Ey&(Aw(zPmAsIGp)1JqaUXmrasnAj8%<~RF01fjZXFt zj|F}3eJy>~6GyDPQ(UHcniOZ&UV*3MVW z?bUTn6*UdzRrRG6wfNpMT+b=4`y_>UoZNMk`1UaI?XQG42Z>#s@f|7F4C@m1pJ_rDhl7vP*Fpg-L1o3HaPN zTwZK)c63rsbOJsyArl*$65Le(qIN30W;wj(lTXddu&PDh%9fDwnc$Mi`(>35rG<7S z1wq9hpAp8N5yk=wh9BkhKg@XVo7QDpoM&B>>zUqWT9BomovNLQQ%_4mq$Wnh;KL%5 zLa~X@(Q(1(#GtU~$H8dtly>*HMu(URXH135i+tOV0%csBd~(d4geaMW$lLLex8g82 zW6@$!VSEw6oG+eU3wg{E8~_dS_k0@7_|)&=lTg3M!9Iau5B!5XA3pQ)3v~B==I-;@ z&CA~+FvI*|lCe*Mi&ucLSEQ4>zkx@TzI&vdtBbQforI?bC{-Mh^3vInXRjt zjkB?p1Ij)~*V@y-%pPg;7-1ElYVNCI?xSM%K;P6x_pYV(T^ns9OHG5TFw@jGRWk8X zFuIR2u#h)!RnoITXx~-UG?dY@QPwa}MCvIZbYu~FHxcG{R5WFj)FoB!N-F3`$*bLz zRlP2wEFrBRBC91NjTDoT7r7}beEp7~#BF{lRrqx!K8ZX0;?i(YDPEDA++wnvBDZ;j zZ*U7;=N6RY6qe=?yvZdX!6_il!7t7xaD$ysj14Y&jZcz|SL7P62rFEig;(qvk1#8b zFblUZj9UbD)pH3la|$qX@IyHSpd9>6>{r1DVT1FLXpJ<@%`}k4n$kCW-0VJrobQ%cVSTM7=-C#p;Zwy30FJGszq(6b}w)gU2W9f$!xJEpe zZd2J%ny6W|-B45cNS2iAaK3Ky%dtH9$9u~|%@rSu5Lg;+y_U+!Qk^t$`{9e(9WX782Z)|&ZOPQCHm`fas~&7RZM_9Ja|pI-Za87|O&UBB`s==a{r$m>_1 z-$#IGc?{Yc)_Y@_B^*ZE8^3(O3FsFZbTn;^WZ!$efyc13Wp}#Ltj1xi zv-R72gX>74;hVPapV}XPTOE7z`sZgNmX_D(ZTqh;gJ}|u<8Mz7wH@VQ5Geo>tdK^t z4FnJw^g#d@I+9zTis7;b&&zAENS=t(#JKj6U}}fAgU3G$zI|o$iUs@tkjbO@$$jTn zo~}dHx}RXOR#9fE+H3L$B5a79-d@ z|4=-0MUd$V-g1y}j=KJi%`};llHG)AnLc2GOGFqRhmhp=bhN)k5S>as5)$3akS*@! zrlF=s3ZyN!R;H!|b^rimX2VunY1VDj(_{d;10D4gwzcl(hEO+cFclavKzAUY=i_%SRH{OsaZCprh<;|(DL zaFIG8JR*Wp#3DyYn~A~~8{(qKG|LdLm-RG#$cW_tW8LHeJvkzoBg(~{iuSvx z8~1xSN5v+(d2iDB1aqj#PxJxBIb8)&{7S$clCTUPjRMG15Xl`*Cyf*+g{+lAMeG_g zK=c9pP2fs-$bjxOU0j*`J$uLmHRJc2L}JpfEe(nyVgXe!ii{g5D%(`jOO7NdL%_>J z6FP!HK|vd7ZlH)=wiJXkRS-~6eWH;p^j467D~!0p%?|=&1X2jMsC&p!rnnhu$)iV9 zL8y(`IY5LIZW%D)`}bN9GvPIY`NrzW7XZo#m*XkEvx)$J7}gOCKCqKfXD%6R|3XFn zv$Zk)9uM_)E{GW1S%|$6A`}6F%dbbf+7BgOw(%$iQ4HGMeAcDJ(6RZONA3Lvg#qK+ zgTXJ!w3+kD0F@NqH^Ga4xl%Jo&0oEJXX9id+&lIAXqu0IM5f96`lk(yc*m4oggsYpE5F zQCYX1fr|^3jLy$`D{9c>MEn~)XCbZV2rf&0EcrV8S)rQ-fZzj9_BS3pzShIUIvMmc z$Cxt?93df%hu_^af-%K%Rskar{*T#uC=VnsgYckafEmTVr%1F;5}>oBliQv&4y_tOLL3|poEY-x29&1_FX@bDB zr(zI)OZDtox5!(k3!G}Ec)nmvh8Qh|>IVUdcj1WrERH8dEO4V9r@=%315UWGRA#=B zL}4WDhLAdgAUVJ|Q$4mNB5LqA{0})%B)p1%E^}|$5@+68W=7u zSS)TQre<#oiD2l{;FQbU8^So0;q?q&V{=QPsl}44#TLX{z7&eG*S@4xcM`h%nim}{2c`H3Wd;J6Z`V-)zvShLEuJAtDQ&B@K~PZA#s zGdi%a*3b7X8WD%VdlDErrTiUFd1VkAB(-we!AAawHFCD0VX^+q}G?IpqdZfD*2x>aPlSM1kp8xJUcY0*$ehSrtycy1AT4CIc{AmO_f~#n$}J{OGU3~M8@c)d zOi~a`sR-1ByWvob+UxZsT%^F%#8k)ZTevhG55Rf=mxW$~;H}ANc5;rM7GY}lN)SZ7Cc0WxJMMUZiMy9SsQlCU?HgeaYSQ_{-;U+Qu*)f_-LeLDDGz9qc1T1oB8Tcy(Egu__ z9gFw{&V6j7Me5emkb&%O>pca=6=vzhXU8d^sU8t@0XRUPJIw1S?$LyN?3(sd>uaUi zfO0T(g(xDIEkU+hHNF|4S4>I5O9@QqhM*I8n-iMY5~TyErf&h~V_=DEWNoJ0eEx~g z@QEXy+~cB&GuBCSK}ieQNlWcX%L_@XCrN8;$s6*?o7TzOLCHJW$$Ra|`wPiGPLdDU zQV!))j;vFTgHleiQ_k8`&KFWHPf`HvI5Gtsxebmo7zfV5(RASG7I6%5P!a?WRlvh+ z@T|djwj4Z12cByY&vS~0v#0Vaqzc-k3J0f(=A?>uq)INP-Z)K_Vo#G+NRzQilMPOj zC*`CmcBCmUrm3E$A=uN^71B{Q=~}_*Iyvcj9q9&(=|-pN#_SoU3K`}$8J58r);Srr z9T|3u84jlzPVAX33Yl&;neM@vo;jJ`9hp9hnSQ64{_I(g6tV(svYrNK1?6OgbYz7t zW`&(*MX+aM6tW|2vZI5uV{@|OJF*iOvy)G=aqKy%3OVUEIhnyZ**Q769Xa`nIfbV= z1oqq#h1@cm+?T<*l{vZ99l5oOx%H>H4eWVM3VAIyd2PXY?Kyd!9eHmT^SVy+i0t`2 z3i*9D`2)fEgE{%b9r>e+`QxYg6YK?33I#JZ1#`g#3poW#9RdA3RDAx&Qj|L zfI8xpg}Mg=Fl>Ql*l3Q&q7{GvX_QKe5*yfUb|{830&Y)ES1aAnm}=8O{s2LLGU zM12OwZ>>=Xt^wEq6f+R~43VIK0KUM{-*y5P95D9U()EYb4t3Ttb=15&tLf&z!{h10 z4}ef9(0~(u^#EXJjBmEBd7WD`JzUd8Q>#`DSQ@Td)x&QR0J=_i8%6vMk%EH=5Xq&3 zvDbeQukG`$9jvZ}R?%4^$RGzmGk<#K;8zQK^`DmNJ`dyJA@rHXWNo>$-}h*<5M)pU z=#rz6t)@|&*vKl;cwpPOYg@N}hR;{T&ve$$pD`|y6dQku<4-$ZU2xz}agB@wptTeO zRH5qm0llRYkj07O=LG)u0To9L&=^k7)Im@YFODG8?0MH|)&R8gTJ%4)sM5Bm>$hmq zwnE^o<|B9qNX<3&X4`K~cWSDbc4=w+siCLM5&$6V0O(EAC|lD6Q^JF58tA??FnP7; z)U+7j!S6s=FA-S2dY%lG379bPn5DjYI|)#P#T~-yqJZ^_#yA@ zNDW}@A7hXH+j*Lj+x{hN1O^srFr5@VjI{XXJ?Gorns@WhiodtKK;yI3WQ+0GdcN4f+)k*f@o9T7To58gwUsJL^;RjNT2BV9Cr zH?t4AB=>u00KH6cJtEaTP_bSSyu?l%;zEqI(b9?RQefxBp{Ak(5ic_A}0<-YVee_9p1;8i=HcwmUew{Ruib0>GG9 z3+<%NBLL_Kv~~o*s#Glve7MYKxH5Ez1~-(qJXFNhPBTHiutq;fOAD)Fo(|GL zhSKbYnBs1|EY5csd@$&Y3cA1w(Vj}u3Z z&c_FpM@IJX?QbTA?M4n0CqAAt&e?$$YR8tj@N<$)KOywe286WgtEYoz-Tse$%1TxOkiN^d< zIqr62$$q9_8X6+mdm_W<11fJ0e7n-*xZTIE`QzW{Cgkm>L<*)z2pSqEYN!`A%>gZ! z*l3@@P^R*f`@3nCi)lWUS&J95HW%gG1$4ac=GzP=ow)HbFWzvSGw#%m?}skfjdg2$ zpOU&hZEr)Tnp6*~0JDeuqdh}(!OOLVv?nE%v|TW^7c@PG~n$2a>y6+YeRo0SvQHu~}v>kYK|q zG-vw(DfyKj!&gU!FBl&D2>mwK+Y(vaB>Nh`*vs}GUy};UFh;wX$-7J)WczQ(az72i zscB&ZfFO~=PZ`g)`VD&eHLZG|*=ye_VV`Sd|0BFxc-g^}v8-||`!!NCtE|35Caam3gUb0-cXSTo9 zX|&Cv`?G9yC2n+ooZ-9kQ0bKTtMuWWy@_4Ekgw7|cB@ogttoHO5Z^JV;V*9tLWh2_ zlHv~Gj5|+i_Hah8QjIGAAjnkCs9>juFtNiBp4!0!fR*Gg=EcLB!ZQ2wJz3r_W}|z& zfIq+K_oa<~ca8VIQN`OjewX0=gIWEpb`#GtdN5>^y6R8uHVSY+;Mp$!?2NwyJ;Zyc zm26%zKKOk6@FSjW4Y1SD=O^)3{NthZ`yWEMgO`^phnI}nMMn=4f3oG!(EyHKAb{wP zc)OV@!Mg_zv++v z0LAN{5f}>k%juU+ddP6tjWPk9dJHi<3%0|*qu*VQe$Tcx2zS;L2`3Mbfj{$KQ>IWf z?}`*liXyvDQ7qc-{y+ImtG3W!X(0oQv=>w;8-?U8qrL`RrVb#W;`3l-{GRu}5ZR#% z^rICTXc4Rty=|YovA~CL+kc*4{=S-BD7xX?B>L-BA4?g9Gtgpa>Ibs;=9{pKYneaZ z_lQrrFY6t+k7v2lc1B4&yM-LNnKZZ0X?x^3B{gYc93ix%?3+` zn6flycTGZ^(3a==Fp;(DB0=TN@%QET)0g-3jk%*LDDPG{teo9>wAkYNh3CZDce9En zmAJ2bpbK)CADC5=f2W9CC&iLfd6X42pAxiG784>v4i}1Ro7)@jmq1 zD2LyKMeygPg86^F*>*P{(qv<7V$$XgrW+HWY>%bneW=`BA{j*|F5MS?S&hu|@rzHS zrKksd$oT|7d5&P@6O-Ruoc&9w4abEJiR&jrzbnpKKd!4+W(m5bg(Z!m%nT`5&88;g z#P%DA;bC--bgq9*OH(5)z#4|Qo|zN0F$@McEwj5qW6YGS_gPxJZa6(LVS!iwRQ=-p zXRJNkA;|)5BNBRJJiJzYTgc-16P7vaaFttAn88~=305KY=?UntL>8=YGH2`p*8e&~ zd$`W-A9VlA^0_7Vs0)!?P0rW^ctXe+pM$(Wp4?oBT%?SVLskZjSm1MuzmAqU@3OA@ z*vw|$3vnkLvmm`>qL-knVwKqzHWY4f?EMUyyI7v&AVU1}ch)UxmG7JhXxHo3i`a5? zZFdT|y95W7lWLYN#f)JP{E_ROc_Ta{zcz-_UG)2cHBu=To=SS2(Y{h(b7y+I%C%0> z6C;z{`X$_9z;@@+bEA2;gj>Rc_7rQHcln-1?sNHk_dH5#Ch8y~9BxI-qZhw3J2vm z0VFt12(wv}(N2j_)8zK%lTpHryHi7@7+D=DLa7{rCRr=EevN4SJNLlkzP9@{x(F=@ zoPHrBTA-pA5iwg`%3#QQ*L#qNhPDH=m)OOv&G&n2L}Jg;Z>b#5(WBaqFOGGmH5sH1 zBA`y_dy{7K=g_Ri`p`ATc{rn_d4!yG`-l;^g**OovXeC5@Ap&-L}%caO3i^}co>qG zt#@#(OVi@JKC>H=Latf;qE7#@>vP9*yY1Ug0w7PDO1VdmpLHG8y?W6;&HZz`4J9l) z8AqA3B33BhkC{P$R^fwpF4L02QTTYrO^8>|iKcYwK)f~G3hPL_mTcQ(lH(>7y=X+T z+}vdHvp!dz_t}xOqZ%pY!7*eq2MK`(Sgu#?5#&+>+G>|3iMWu>$6Pi82!Uanv04nU1FE~3Q|T3``{E{dn7wV(Gf?bb4&kT6?Tt-V^=0>OJQ?aUXsD(< zS-3A1rC{JPJjQ7Ua0E$3VC`VdHuykcujHK3`?93lx$}YU!fXe?8*s|J&*UER{R&2p zGN<#uqC6C5JB*&TO&9!(^ibYXxEnGzUHG@pL-kL`-LT{7A`-bLfHFKs+MAJ*pqSG|9ZKnKY zl$XJMMYG(wnU`|?UPezk%?giaD%2>vjiVIJOIT+swKcs>Gdj&*%Fb5Zjq)}xSG1_M zoUOL%_qJ^9w5WeNTVpqdqL2lSHzfb5@zDGx=dmI0Q_qrnGmhoul%iGTON<5aA1EQS zof;~?2hSn^sNYjtcMqGUQpQQxvv69xIj*KA8NMAdK4TxzzdqMw*!n=^5}$0Tg8+Kw z-*Y2*F_{#9FwD~YZgM-1h2oqaJAOtldwBq)9woAYenozS!Qb~yX#@KQffQ%BBz9{= zvr}W=H<^g2fXD&%NaeMk-_nDVi0Tk8w0uLns#LSe|@b#7|p@+Ge@ByhO=K`-)zg(}` zZqDP7q#={HHmBHN$+K>Z;3>{Qf)L;6DK{hFya*emuvBtbbG#Vn*3URI<>EWn_kiP- zl35{J>t#pYQshW_3b3*puKt)a$CHGhKKivJKUPD%aG(|C?95D|a}3{IOd^wYW})2a zF|a?zt`tFs$PmaHU6(Jn<*I7q2l5|AhM%nHb^L!lH81VT64;SZC4=d&1p z4K{SrF4wi@(e1mNnszXec>q7fg|4{fU1ziX)a&M8cAbGVa|s%8o47m zB)+BLd`meR0{R6siFZ>9!TIMwMBG0N1NA}#T$TusvT(72ghjlOjUbl9ykkoc^@Q(L z)-~lhJ+S+B#>>`@2vvLMi;uR&O$V9(k_=Q4zZX1Nqclzv+D0~sK=zT~0WXvASUMk{ zTgP7#YYep>KK~?^C`8cdBHb$Y^KQ(WtmFe;L-hJaV{ONN9-u(xgbmY_d&^t0-y?(5 zBmyof)=F{;-0Lu3IC5&N;OC8ciuVt#PdQToR&5`i-#s{)JXEL|Zl? zWGyBG?b*NaI*raq+5r-Hn^LG!9R13dIM*gAbo((f*z71Nr`_qIb=(OtvRU(U0KRow zMO#UeexIJk+)304%AAv2-~9lnt0VsG$u#GEafA$`hw?RM8SgYyp=W^-bl-`G8!c@802!ODJNg@@;&y6=9 zi}yYZ^ja~-d|57W{-up|HaMNY{$(is+WsCne{p~X#YMB48w1yX>IQBQNZt*B zbu$TeLuI;|QQa`}ZWgz0*1+y-k=<|A&_O}e!GI{K9kc*E z(jN{c@yUa*@*qAoFrN+@wt(i30NFL9J7xE(z!VXRT!T;K<5XaO8mr96md4OIr$azzc? zl>rA^YpMDScqsRK=4+|e4ovI}Jf!=8X8Z6+`2+d@eGL+MGZf9U)9)jrO>#bJ@yBVX zS5k&TVyvYipPR?s)j{8hh<;ufEeF>Q7X+K956CXZ_&ZVX>!2;9z_vO-TPg4@IF|P$ z(pnOQ0Y~w!MPJ*|4Kx5+o=`mlM7zLZ&{9|Xqrfyo!A=Idh=Yjb!Q|TE@Pj@a*HEhR zP`ZzQ1Qg}t^exRZ_$Zn*0nZ|tCs;k zhmi4l4x{~J;0wUVY$M_3L*Y)8wvynyz99?*D+`b057KT^?nj(Z$$5^1TcgUj!0I|c zcedCkqGWK-;ZOvI-#TXEL_Zrcih&#S3dZ)?jSkr9M#%J&(6OVa{e+Rx(J|%0aCy*2 zazl)DOz9EY^@Pe+9&4(DetZ)1ZeKr|8Owb#fUPvd#E!;Df~UDCSGmBMZoM}9M#G~+ zvO&?MT(Q{A=)7~Py;{mr!Le{iBrJjw;}nHBkFkiji`g_^^o{SIw}b`(rQz{Exxjgn6j&*W6N9@S+>EDDh8U;2 zBR(L1I&7-^py`6)g9yFzbE?PIQQTnc3wUgp6o{uXS^y5>|4z#!WCH5fW;aB`uE(-y z4zqqA`*2Rh7G=!YKiM{8GO#&Wc}~ScA8jj-AwAha`%d)#JL>l#p9Ct!!2GdLl?e=F zVpuTN7NLJt*FtqYwj$CuAB?6MC~Mkcw_bKbbveO6Zg2A_}75X z*37YNlz{887brviAX5w&%RezCwE!exgl3Mpz`(j_f4fPavZ={*D%%C1^unmy^_eb+ zbv(5bk7+4O)mTShzty0UKN>T3&E8n8a!t<{hc4NPY~bSO7|B8;dSr zq++-Mn1z-JUI^Lq6DsKgV8um@{~FNpkD02kd1~uIcq|p))!h>aimx@92*~a5oqa4!8=gI!5;UHfXB)V8?2sT{blY8;rcp`?+^kACwLH zzBTAvLBm8*K#OH@&5=*sU}GJ0tNqF(#PPYLqpI@fqm|x2+_A?OnkR;us%4IogO0Q- zpDzv3B>K4=yUBl&v4i<@wp+cu6rWoZqvb_0JYbN9{{Y3R262-TDNlAaHD+53kBCNy zVz?1x8cw4$$G}@s=@Bp9q0@e9eJI!~9?}v1FsqEJ-YW>(`Q< z>qoUX+MK!O)=8M1bzX)IzRb@s(G3BfBs#wh^+=cNH>NvapM8a5|0e1&Qx3o=HxaCx zNa4-e5*=0La*fqqb@xp(lT8JKO>MtT-ItqsZJYW7n+9{6hTEG)$D4O4w~Sf0OoX>g zWw*?u;RXY-;yS)1IJFUMg zcrU+~7XnhB_~NtO>x-h<>oW&NX{r_WIwkh$O2+D;JluGyLpC)ISzI%?!7tnf*tF(p zSalwpQ;~vKdwq|!iX>wrYjpxvHGa8iKa123?n6Bq-9bBfsKUsYGIvzz=$|J$@mgb_ zXAk<&4J7l}gvWjehItlu>LqRJr1)%OAiAkCy6H!A(LDOi>AJZ`wj<{H36y%pg2R}0 z`*JtEiv3A+_Hf;P!s|qDjMHvVP_)j`9LQle>>}p56qX~fdQD#Q1pN2W@ep0GRf5(V3{TE4R@ zF2wpt*>;n0!Cmer-#$^8^4&LeSD6yDH~k{~aLe86nGAO_}fgFuy@*F>7R1v%1eN6nm~>@r&|9eZi7_|C~a;IeDx3IxD>ecdR!3 z4@Wyt#*>34N|d03U;NC0KDU1{nH5Mb*744~^VkoH&r_e;9wxl7`ju(rZHV@L=kIF~ z=O>iJQ!&pgva50qye&#mb=_~0U}Oo#-0?qzF?#y3jIc6Rr$v3r*xD9$ScvA1&AD$( ziql;DacP@4YaPG8P2Lid`>eW%PnVF7_9Y|DA z%I%7T9U?DdzVye8eP0%4Am1*3`1Owc%$A>w$4dAK`QAI*Z`Z;5n)jwgS5{s;s(~FZ z)~%dv9^C!vavp8evJITQ|HDn~Podr#Moa6rrVdr12KbVSI_&cay^clg=h!Ysjaf&L zW5>tkx)Q=ppv>PBLC*j$b?@GcO`jWR;+gRUUEBIF@qyYHo^;| zww$VVlKc8J@55<%$R-S4TJSMg=;-t&%~_GiS&7_PsrFf!)mgd6*~@2V6)|U(S!Y!h zXVtIIYCfFR&Y#tNJ*)qF_KNCX!?k~nBLAA?{xxg=Yq9#*>hZ7b*}vD<-0!dU72SyS z;L-FF9`SDLePHC`d)a$aZTw-TL4aSMHdkzz>eoqQk0Hy$XUQI!KWQIJk>5H1@)dMvOh}sLP5}R&U&c!o6|>bZ@BMR`i3(wY{^;y@v5e*q;d%g5(bx zVx9oNP63xpEmVVLLBljvN2ptLzr;A%P z`RpDFjb=-GOx1e*79P)6e0I3M`&(opw}|UyWEy{=&U5w9Aib9ca=C@9QN@i?W zt3OwLD^5=P+mOajl%5}^kPgx7p#HXcp&eZQg;1iMcEk5fW^bn2s@bp3Y&6+lGbMgg zT-0sF*{r6%zf-9!2iC+KZ6trZsM!+Pk#X+PZo9lmPEj6_iDQ|xn7St|cdA_M+-LL* zce-?5UJS#G3sVF`kNxqv6;>o`_WJ?zXMcbH{7F)a0McZesoqSN<22pQfToHKdClIl zeCz9O<@%L}WCnCrZLSQW7s!^=Jj~#{pJuG)eqcPtg6=NEw13(8Q1dmkh}Tn>_}d)mWvOZmK|+}}-W@`uEPIDwBO1R- zH**Y)7nLBgwX9+IA*3zGIAkNqjSuO10WzTJEYC3Jd?<*DW}h_C?YqqvU=f*o^UtXV zLBTYqhvWWuoV)(t$VVs|704qamlS?oNVbdnv1oBYh`4E(Lv^QkO^?K2~j<_ zc$hv7t@sQr}o2!7du*e7v`*C_#{$_USgz+bH)E3iJJj(vw%{%`jk&}wK zJ&f+@E{xUvoso<;JOYI>Jbpw8O4J>iJg9p?$f1?!I^BD7^ZiA&IXUAGxagD=N({AP zkCM?fX453EF=kT&8%UNvy)3oAGa|cFRsU#6gEn~ILT6WxQ?2>|Dd;%$JXLMiWah^U z8lZCH+uBgBM-{iS-ZZ^e`FDPM0@=)}LqnkBN>xw-02kENz{nfys#0T;j7eu_DY;?E zT&exPz{tTSzo1;QXwqm_;iP4kU|Yrgidxg^Teo5+JVclZo{o_h7c>v6|GSV|L(^VD zZ{K|D6np1X=jc$aEgp5m2|;RT(WqWx>+T$yPrEjpnExJPxEZK*YyLjzH#Nkqa(3UB z=G`xh&+i;iB*g4)^>^Ajk)uwZhZV5D*)5T2ca>+2J%U$S*^}Ehm<^TY_gm*_|GvZC z3s*T_e9aMG;VTWg6nkk zUdK-nCNiz9k>QuFX+PDa)$Y!w2yNZtee?3DQk^OCdCDOV;OikH@TDQfyac}6BGSW@ z+7Nl6pv4tGft6xYmnH}DX7v4K^aF2zmBAoU)G?zcc?nnvf#F-&>Vlmh=%OQ%&v!iD zV|Rb@K3qWlgYxsMjfn_og4JOppmMtMtpq+jbP==?N13#M^34T z6Gm7yF6u^YiBkQbm^{C3vTbc4HArj_32nkfD+}^7R}E@PH{p{*1qB7fbc>Uc^pI6< z8NyXVhL4)k1p78CBFKheK~3o|m4(F3s)j9^nlkE1p+b_bVk0(FO_^F2q8nHiY z%IZ27lER9OIzyYY2b6`S)2c@AOE>3?hYHJ-ij8@hHs{X06_#zT8uNYBoVR)|EZ-|O z9+29czpX5yI9)aVq^Y^!N2rMM7qO4QQ_Y3PZ$(spSABeO*j#jZE`k7wPoSYK1WFZA zb>`}cDCw4Bh8LnJ0rAN=)0Ps}ccNOit0$8lwUqK)i0WvFPvKKr%7j(K^vtTKGMZY- zZ@dsQa221?NJ36kw}^;~OHYn|T<3A-=i^Bq&I^-teP zIQ*`je|OmWD(phS2_&)54Q*?PR*`gJu36}pZfi__A?YR{u{dPf)|C0K)~hKZzVHOi zEVaA8=FS)8-d@d9*4_h6ha^eFWwt0z*4{rQkPFE>)7GsSs{_^}%>*NvBfz@X9{ozO z8EtES2M4R#;VDE$EjjPxXkFX6#k?>@-Z^Cf_H;~L$r99{B~1)K50Q`!Rx9dVwuixE zBSmwadoW7^rQdUxm8?-K!TlHC-6ck-49`J4{nlhRp*_hf?tFX|2O2u{#)<2S>w@`% z>M{ptW;anF&-B<&15qF6{SeDH++ox=Pe=zTp5}af&7uu2O!jqEV);cm!iExbHSC9f z$nlx3T}OuCDISVCbC3sUUQ_3%xG!}gXi7XVbm2;4A3+U~FZ$^dmZ4VXtn5ghSMe;5 zT+F`VxH=6u|}_om7d2NKEUwa zz4R|BT8=Y$eAX%IMOmD&7QgPk*w?zfFQ$Xs`!?=EJ9D4`J0gCyhsm*1qg!u75938! zzVMy~MX~1NqAW#GoY}Y@pKFQxq{w!4nla0`B47c|L;LxXf^Z;~T6$OSgPhPh!;zY* zy@N*Dy``CCxng?5{Y8#9OY`H$dTif4b@W3z_Aj-iPyFLW2_-BhJ5s8)0Z~hx>Tg3b zzWZcF&@5MDsRvGCMC%bamvlB3Qz=T-^fkLf*7*;gXM3TSPIP9k%Giuzqx)IN+))x| zy!8$0xA%V0OKd)4weX}=NoR_(R}Q8warz*W?{A0MU#8AC)}Dz9*o!PXo3Ir5aHo20 zD;==GLXz)~8Iqt-J9^&UZ2$bzvkfX?f3kfS-dC{th{UJo&Wtp=G0=@w3IjnDZL}Yy z*jqHCtK|9@(n&N-syOK>BPndsjWup8fCt(qQTQuaL?=tbC9q7QU{`!7bex&Yef(zE zuj*F^x&Yp1gZf=7VyD3qF%CziA}@BqDeA(BOcV%WCl6^NlC=zfB=EC!U>`EzH#ss%ufsZXM)C%ph3MyY}Pq1rb9>}8MmzCq%+sz17h92R$2zCmPjQ;8qd=-3xh=< zp*x?UWwZ{f3Zx4x$(I`$SinmT7xMw?2Xv$`TZ zDVrU!$csOjm*u2B#wJId*c|myHs%s1^}aQ_m#FhGUgXSY&^B+60$LG;g@$U#iUJi9 zHP(bs66p*5zpf!Y$>RTTBU?bs2dsBOi+MsdSloJ{{)3X)a6LOLEYw;L2I5UG+BMIYG`zo#i|Sx;f8FPEg;(vVgA%AK8u3m+-(gB1AL zb8$F8E~1=CF6uX^HM~oNce?e6SZGAA8em0tMgz8-r%ou-+v|J!!cF`oIZT*b zJP@gb>IPr-@*JS${J~EGdRP}$Q+APxD4=d9If6zIx$kyYu|!?4l)<#jKyVA;aFuKz zH#-xIX4$m3q$qS;k=TY&I^2yoI^isA%Yk?AVme?)3SvF-jmRZXFhE(@y zQa)4%t7F;iU5sHNEbvsLloq&Ts!^&a5VN^ZPzUCh5Nhy6uiSYz^vLdW2Ix*835iP1 zm5$&S7Islrc6al3nKyL5@35T)BvYK|y(y1eE+FUG#;QpHWh2SeoIr4&?!QQa-=VMv zP+gG-I{NcTva&>HR1k^7GUIwO?D>QzG-UJ1m^ZUzq|l-f*zb)RuyY{1sn11LI8aaI z3ICUc0(+KFcZ0|Z*J?+vPMbg@k0;45p9_Dra`1RMd|$_H+x@9~2*$-WwN&A2Qi40Hg0Qyc)1?Y z6E-NCbYm!KoK=%@$CjZ|vCjz>2+VO|mDObr_r$2hd)wiwAIyMq?Lk*>es$A8&o0ua ztGaGgyneg7{)hOhEtTl~15>3K2O*bT(Wow#MC0evU)1EBRky+DGDAD<{rn6q+jk+1)|1*Jn04_i`*#ltAf8gxp z<=Of9-+yPvXJ<#JCx?Ik{`m7}@Au)?Uk4likI&A2-P+vV`>&wAg0mZ&JOArwSJ$_$ z9PP^IFUzYNpH|ivm)HJR(~fSeefYdGyRh8-Y4J+dPR}k*&MZt!&wren8=ssTpO_u{ zICF(-N5-dy$EL1W?cm7AfuZp$T-*0yw0B^*r+@fL*1lPoyJEPn=VqFwCu=^Az8oF8 zvbOJg21T;KILUCF3mAEY`t-M0F1;rJ4 zCG}VCHlOe^uc+)l^tP}fr=T<|zdS3yI6bfIO5djCl%!_mUjbZvMqYA8abjv-A};g4 z1~(=#H99FfIvy7lpK_&a?Mn-62zjRYnOBq+8=rOsbI~z4badhsrG0^k3q{9XQQDC3 z=%5$aXJK)H&!Yl^BOV8Z1q5NVGE$JKiC6Ac1sAWF68pcV_6pQqkBJb84CM_E;s|~6 zzo0hYY3LQG^}hnOfg%4jwLSqs-u}6>cknILtH)wKRYX_Zk1O6qz_|3hiz5xVkfTC!J^RvC3$ zQT>)Y;+DLclsr;OPW7g&$`z=UysdO)YQ?3M#BV8FnOadPxhqyHa^sGWq|BA96_Aj= zGPQjFF|{}TSJQF{O8yU}{lA))olpF~n)bhx_WvPTq5qH1{$DtIWnz_90Eh+x62qh@ zc4cDM)%D1Ki3Xx@DZL47?55;SxBkb(iW>mdVh8_gVxew=m=IfsbaFFc{aAqD(*JK_ zuRgA*(u57-%)SmJ%NB98>P~IW)L2_}kwd0M4C`%pwdnqziKS5R2NYeISVhytKo`wI z(|PyW>eoLf>g=C~(dW0;fBqj6oA|^DSQ=cqdVe&laVsq%oT2N#CiazLw6cw~_DF^X zc6`6}<=%fxEQ5;ertozI7zB=kQ>`0C3xxY@x&nb9c!Q^{=v!u9ZW?l~lL(4wO%-`4 zSPB9JmnWn=6(zAbMRY!id5wgN0{HJ%%&@(8No^7622iL;iuDQf0MK9?LQJ0D+taxT zt1R=w-XN;Ah7X#rx7zMKd@mN52L?kXh%7k(Ad#LSO3op8_RbL)nInit0C~+TAx`+6 z2qJ(MP|O>&f%jNNONq(zkjW{F5+W&}(GBaVs4K&=rH|YGg0q zV9 z{vqv7SgL{jje*A3TlSC`>7!Z3B%aM(b%L-^wNQk^x-lz&99QOCFySRqNb`>4Th@Ym zP2FARFt;6mwRx(pkPRFG5pdapdDLIk0pREp6BEb@3bk*H3jmvII>MPw0RRA%V3jcs zd2rT{P>3ktAh^H|IYIx+p@c#=MLHdX)Q%kigU2$DCauUsaUX;-gTN6zs>Z3h0`xKx z{vw~FmHaxsy6a5*u+IxaRsawDlb*4*YTU%_|HIyYMzaC`f!}u$5g|bk zd+$xm+7e=qT2)llY*kfhwN+J3V$UY1qAOLkckLOosJ7H7ipHqf7Nu>>1Te|8w2f zeeTECv-_Mp$O8|Y6XENd&+GH%eV{oEQ0haBiOJEx${k0)H&rRBmzV*Q9yiJk7E>RN zUpG%f#G08#AvA;YZeDg_&eRQVcX$eb=kZE{54|Nab(CU*zQNVh=OkI&eaqNb&vlm+ zKRz?)AR~1D$LM*6taboKABEHf0Po!Vx9sQ1MnYxS6!xE2Vl{0no#96Z}Me z*%vnDZ9Xdv(9tTe0~5u|*{YvS`uy+%zY;d3Z8I{*2Y0)^=q5vS-HhX+q@&@7PeA&w zu>9%;F)%zgDDnV-)~(>utP?j4mFrOiic4Lf|NVX?+k?`JO|_SLVd`+F3+@pn?&e}C zqchPi$w4)Uw_0G~{@l%Rr#qF?wm{;oS(myyLMq&V-157qFa=%!6dg?I-uO;jGW=}` za0BopM{uOqREpm(c9)HRHyEFD&1q*{)Rg6rV*d}uOaxPqo!tiUaQ0-8B!5{XWH=5h z7WEwU-OTB#W*Ps8bfpheLqFd(0ks?077opgJ>c-UlW!069?%|plWFJGoB7dpUgFE3 z{Y0I#%C^e|Q>Cs%CBQ;Xi&Rm&!A;t*tFM&mZ0mqD)VJN1SRw|U0*d^ylCZ!R+ zo9M_mCPaNFy=1@vg>Jr285w(VFe{zKchffHqFCWFa2!N|#ZW|-I9DDQKWiqzfeO{_FjqCnOz}FT2#lPb$bndL&0HHmD-20ir#ikCV#Hl& zZ=7fmz!pSHum9t@Dc-|_#WOIXRd-`;-(}0+J0Dbf1eN$S_0vT>+s^v8_83C_@NG?i z(-P{zstUNEO6BTfrP!Gb+YdCaKMhTGHm<6Kq!^GlfOVjYTL_a;Wn!h^Yd5s)mOD6z z{^RU)9V%7r9pgRdBEF&^W3JP8zHn#a{HTlNQ|%dI`knknMqp)V(zWsWxbx!D7om|i zcxD%P&Of>rkZ8l3F-P?0Njp<7mvsc={G9Au%#yoxWAnY&M1vKOE>?E4R$9sxR)k%yO9-zhjThuJ$pS0*6 zsYpV2RK4FTy2at#dg0n^9GZ#@F+N-+EO34%5wFpn9Ln<{}<{dj}_i2NOoP!!E$AR4}GL2cs`A!H`whB zBN$R6D=ZfZ$y!Xsz719Yt09|TF2_)rByaJaYZT!#qqVoHSREv&`6kh!I0zKZiQ|0y zH*~w_Tl?KM{Oz)OtM;VeyDj2&zj`S(!oBO?8@Y;23ZE*BPBp_somi5z$WyIPdY2p%SeVtNgH|5t#2@rmWBwnpbahOe9PUAk4`tX*ttlv|s!3;*R#0 zn*dH6ldY!&Y|<6SH(^ige=7Ww$v9LISoOC{anSX{#*c4MPMxxAb)mN>n}1yCM7$_E zyks>EEX{bZ_aM@rtJ*r5&44%87W?dcn%KQu&`7&oj*`5#+k%Wl0FhBBb1dxH{W;9f zNh|89SPK(?wsm43u=Pa#Uz_obEjS3YqP~B~loY+J70rm|#{z}^iu_}hp#3;6H}%{* zy1DT_FDXKsiWu>Y3djcxo_SdJ7pHsWe$6feObh_71{eeMfk?d@EB8frgl5735@L#3 zbpg+-nRLm*P@+)E9YV7Y9!6yt_chS<1+bDC#0n7iy&3jv02ZOl^WU#^);xguc=?#& zQ91bM)%XgNXqfDp69z+N~56ItA9gfO%l zr!#e)#(TxV4ewNp2jh)dMgwjY24~hGI2hKQ6Wmdt2xA>Lw!GYKgazSM4=)LysL{)p6poYbMF)ZwYrj|ZtEd}*I` z(*EBvv4=ziKZ$pT{r_)b|6eh&S@{%T0pP`9^UJr>FaO@lf}_ZAGDPDZ3{GU>l?TJo z;4v#QV<`!~L4K?I>OS);NF<3bFK?C#QFH*R;vka_BteBtXepV8nMDA_V#*JK<6zv) zEO06?*FB%FBwxuRyI>pi!#hiV<~9G}Yr&+~X7UBttFNW3$^1ciT{s|O2;dk>`i^)d zlSj6>3S{$!aPu>=p@C0z-`H$qU#0*yy|es03i&zhq(?JZB!#S$(jp(dJY03r zjnWe2ARCUZ-W@=J6jp9#7PuIk`zjm`VBv0Ne@0>8A=5SN8)Q-e&AW8b8>)Z9I$dbtI{KyMRG~wIZ+T zc&3Wy9(x>$fjbm*nanCqOR72=syel<;Yq0xcwe(R1fWuw)f|9Y05~$2MNXfbgs2z` zB29R(i88-cw|T4GTC2NROC$eB!+NIF+S$}HM3z9xDz_D?_N>YKN9->8Z?%p|myQd3 zj@elROJB2O1f*1BQc95}rR55>&pb$yih1e);L-?562`8zT_8TfdjDx@nKkJY%_x_W zPxCG-^Z+CDKsyd3rR@TBG&|dS#+Nqa7&OUx8<1c_TBHIlZL=>@0F7wIdkTz6C>A(^ z4e8zj7HGkgHG_wmU%*=OkJ(Q~z&5Q7zS{++IQG}?Tj8NCjPC&yeRB6Pd-D6H^!E*L zbPFP~1xZV3gL?y=P-LMI_Ewv=>||0yWbN4@ppy;hJ?zzo3#1F%1?LbMyEf!Mf*lOj z9V;mvg{5GGHE_JT-sU~P=V?nBthExB@fY^$@B-;rpZ;Zyh>dz?gT@@2_NQN)`xQIR zwlr|qlDTF{e70ntr|pQDCehqx(SJ=31eyf0)J7yT3_ijzh+<#!hSo*)`0JDX#MoAFZEX%DXCliInf(hD46p8+eGiZlgYA;x z+*A;9kpAXk<{o5*>3NxC1M4y6=)uzn@SYJhac`Jf2ebb1hD#GcACK9I<={^a?2{vmaBmj2YyE-c{lNz938{S^wj^VrUQ^Fr3(x*5 z&-$+!)G!3G6jA`}V(@SZV5NE>=EuP1Q&P+|5(N#kv?1lT4L<)jh;(OXcK}n#?9^(O zJAjNqI+TSEA&&?DV`XRG7kZFqaBLwIK!`UfbE7}hmUPqhoyhv|h|-5~PtupRVX`MF z)0%W>OOh1)nD}fcN9aG`_6hvcsKJK`p^VIyArsqP^MBp0sYA)ZrBP3NHEsKz2KA70 z+2GY+!{HLy5n!Noqc{b48d_Gw()>`6k-eIgd%8#~id0w%k)@rmLnA-&S;64dENt&V z;>TcaG-&$mONnzXX zejfvN-ZyZf80q#EW7zI?eQfw2ySU-!9}b^o)5?u5lF)YVt+&}J-XCe(%<$@Vm-ex) zR8o&E=?ew8X)qb^fc?rvk|Y)QPAS6|J^Aiv3fcPQ!Gn*upG}1dP;P$qw&aig$t2T@ z;}*ghB*SSQ_vy5gsRPfMs|sJchf6drj(ME0d$q&7l_!zSGcvj*VHZiau73_r`+CD} zRN>;(uyWom1z@l}>a)QH7h~k*XM9sJtMRW&ph4_tvRrbx zY%1ydGgcar6;6EJO9Aw5vpabM?aIdfp0KZ^&2OajTHBIn&*vGE^Yu=^)2I!dB=Z@a=7ZDLEBAxp@lB?QaTk?mKa z_4f}K7Z_epVfKTp_MdFMmL&O0_@d`rUy$7Fd#;=|E?l3|f#->%fWL4}c`a-X)+^7S zt{|_1G`8oQhd(tK&hyxlKA?e*6&D0c#^Y$)>~Tb3n8?V`HhT#CTeHJJjMtiR$1KfZ z{cLjn;Rxt#5R|*QNltKXR(~M^wq|X+>R7q}A88g&C+UkU%KdE0V|$goxhiio{13rs zO=Rbl-#BZ%fxO4|k_={}0-^yK6t-8R!kdO7Q%}4|3Pce01u3y|Emb9>H{{2F$cByL z4_fu7o228U!#8vR*tw7&Zxh}Xg-6;NhR3KXjo zrtOH|$Z+rcgIxb3l)Eo}pA_Cn`mVBv)ZNv3xT{-5y7B3c@V&o0R(qhcB=C)GVfQU) z)i!V1CjW!H!O$Ofh^$AUY$e2^eU(lJJ=Q${>sey?!0hOEG~3m)J*{x2bq7{6rJZ|^ z*8M1eS|a-#g+&uxCL~&L1O6Ae{%$Ok^rwPcV|-ly@L1)>uZQ~o>TVp@1wjyK_yU=& zBZO1{C>{h97_smDPG5gd6J&hBew2S{L!@%=)32tXOaCgrt;Dpl@QEED-B0X8Px#j1 zt^oKlg?$B8crr)YR;BUq?*r)P&6p4ne}wg!Pj0M`@>9cqOo_m}uv0M;soO++U5c=w z-dj+rknyd{e2DuwqgLv7L`1C%0&66PlU3fUIgEvoQHlM0xX3^Vs3vsd_ieB|eT*wh z<>Ke8LkD<_+}IlCem8*V{2U%(w8y+BstU0gBAND3ue^Jzdwnr{`fO@^h3C)tzNhE6 zygDA7m}nNbq9ziWA+U~J;?sm4EvjMoJGW3$J+0P`&o%*5+MO^VqkZt_(o{k@oAcDa zZIKv-J6|s1(98KWS;&N*g5UP~%k{2e-GpE6xsBf6*iVE+#8jbCaOmplWJpeIJc~A1-j>GxEtnRHb+J&}WU7b1&Ob^~UZht&M^4Q4yX+ zV69sIs5vl~31YLH|HXG{v!myCW|eUw(jV2u$arnr;1eGpO|M!(Kcsp&`z^ci$zC_n zv`>m_xTXy&R8czsd2L(%2jaYCIwCS;uFQ=1S7s^s2&-;Y8Jp`%U#XVJ&?n3h6Zllk zJck^o??JH4l~8f(B8Dm)zvC59fco-YbJ|6m_N{iQININ{ajZG5;j~e19=C7# z)d9OfF%dM|Ym_(M9RBdo=@8YCp!waU`slzaE{RhH*OeZ=zgX`KAs=tO1oUah#V{!p z<1-%^boW8o#y1f8Mu#9*H{Y~&IrmHYLw7DfS{}$<47nDt^7VXoB*- zTgU9h#v#SGvrejxt^d@A)o$-`c!{VkCZxdsIn?^5sP^mlrJd<06P4BuP4Mf;v0M;J zr1%61kqSK!k(*WT{&Q2h+HrrYlgT)0=bdb4)b1w>;|G7fTa1M%DDZYGJ(P;oymykd4t#5jiHkZ~zKuq&4BT}@_w zjoxEspLYm|&?SlKH2^HMK~3xwqH4G|jYx^;l~UOWw(Au_K9?|)Gyx}Bm*?`RN|>)# zm_T_QQUXua&P*9prx;v9zvwmJ?8EEVSkW#%yZJ^Bde$uEB9s*aUjoM4C>hS3WLx#kvpgWxDB zr-@3ofRHjH_X;FSzVM`D)Op||k1eDYd(ktTs%<|~tR@``ELOZ~h&%8P`2%Qj2`Uf@vYox-9+%|yXiD51C5M7Ojxh94~SjOxOw#A`2V5-W@g?E+il;#G{W0wIAI zM*8eisHeZ^Gb)}@lMK4BDBr{o&Tp8W zKS}Ty3~~+cnviy%3+hYH8-JsH&TA1B%YyO-U)JF+b$X+q_H!{^KZgRO#f0^nE)Pv6 zP&Z74GuEUvauv|z7*=5_KyY~9F>LbjMUk#+mpT^Wk#1y2GL;FtU+PkrUteeN^L_Af zBa++k&Qbl0BYEhk zQ$dP{5@NT9NE6+@iNOn~*?Wmkm>5=sMKAZ7P2S9S7?r~|2ml%ELJdw8a{%u*`+}0f zl8sz|iQ_x{y4p9MjTq!e+4K$bWpfdjUVB4OQ}VJMTWuc|Ri6bi2#0v%1k0nCAesyO zyEzb~42UFO;45_06wk#+NlBm(fQFX+1|uANzTMu85#m6Y!b*_a`@BhZ@f6M%j_lXM z@xa3Bo7D*yfB3290^k2gtWCNe>~GpT*)(~(&-%fJOI6-yKSY9V=OvT{7~ot8#yX*X}~;3ROSqExy)6RX`xe`v6bAf2gy-2;d|7NmZR*Nzg#$rpvr zjFEY?1UiI&g>6o2M0NZQAN&ly(<(Usn=_64cW&z;Qqas8i7c9=Uov+VC#J*EKUW;iJHJ5<%{Bu5xCckxj<=Z0F*89dInYHu6EJ_@H=k6 zPzuGUcr3hK%5N}i=zBns6_E&U)SuVtztbp)WmO0I*8gSWNQjKpZpB#&1xY^cJo92( zs^PAMy8iNq%6P`;lXqM=`<-4FUaGM_SY)ciBK>6) z>l2ZkqPvDa0;(d!v*Q%~&*;x6s}tWFOYO29{X!QVAC5dS8hM;#ge~m!TfO#f=jq=L zXV6_YI)cs8R-pBprinX<)ko_ln6`3kg4B_OPH72!dsyY_X)v)jXn#U2q8Gf zKPJ*q!o>T=NoVez&5{JME+&5*v<>Fs4KNN%Mrxw_N}Fa{Vf2x(tgiq_AW$zyU9s0h zxeY3WgtLLUix4IEya6Ji$*0Giv=k^MptK}mTV?xZa%2WZAiR;8nvo~alMXPgr=odN zjb#-~xC~5=ZCZwK{M?p6>0Om4ghW7A&E<$kX7{07IY1V$A_N6$LxJGMd^Wwk-*Vn| zp?k=J-Hymqr}8uGQBW5b*tuCIyJhTI7f!2ZsDiR|>$YBA7p097o+0^f+h^H#Lx24$6!WuD*Mb&)*8hyH1CY1x`*0G7V4#3i(048!y3c}*1 zrbVJyztgPgBWf2S2S?mVGzX(0#F{hz5_FK==?8t@u~0*JcY2`3MY!2PhIuR5d`^w= zI1;Lj##+6FFoj}i3$4lzr*MeSqT5uQ8T}NCjJ=5_o{<2-x1T+z23@cQA}KH=4xcPP zm}xusjR=Bzn|&4N&TAV?v4l-6Njuv&5Fa`qUkHzQt)VKoHsOK%AEBzOBscwA|g@E8{j^W5JF#P=gsv2 z7ZY9#p*g;N(-kaTIRb&87@i;)*vK}ORJ(8BkKY`av)A6GB!09aK#R%t5I5${DCk06 z%A&!?K4<$5vfbBSyE%W%8)VALKf8LjkLd`Od{lCJvHiVd<}0s3cb-Co%2GPvMq5($ zOS7=MBLGNZ%(dc#AY9DVoDVZ?A7;bfhX{3~$bDim`;=grOp;5=q>Kk0KIz?mf|Y{z$hSimFdhdoz}Ta_$gghoBziSv%LejkU>f z@HwZmgpI+}C}sKaw**pox1VsmQ@ml^XqmxPFo1IL!D0&%=+G%pCrhgOA)$iUPK(bRRbS( z7*jRNvzH!AhjK#rGNyJoQ5>0xSv)~CJc$TbC;l8~Jk(q_%K{J8z;J2RNJq)xIYW!m z$qC2^{IwmZqc?zwa=zXBi>5o5tUB*m-3i6H$99g{#wSd;^=y2F>q_F6d+mv|$oBJ3 zM$Sji!NPB66&Un79-hDZ;8RL9uk|`I@0cm!oLhVxG>}X{5OMnM61H@oi#vbsHcRr) z^X-UuxorS!4euz%nU?mL@RQ?0Gwjv5FAt}lgzfOYVdaSye`1SqyYgn@&SS-a5zb zmhD7L@rQ2PgtOH~)9V+C0G{p$&+dza*5=$yEB;np&nK3i?2)t2l4f7!&UUhTE{zJ6 z?Ig(N;0l`({mD2^q;35O?n=({5#fuEP#4GToF)P;HZTho;RQ-w3ABb?qTXa;M88=GG9Qt zE^uF7;JLFvhirV=3;cx(0u2j-{R?!_D!j5FvcDh-S)`jbahXL4?L|rRMJd-s>C1~U zcNS&i7v-`SLsO^iXYm3mdhxjzjg*8khtu9DH zD2>TJOPVt_FaseJ#zZ$p$Tr}4&YM({ zw1?jF^Z84-RR7c(f8&M}t9>Y%joW@D#m@EhjP4s3k2eedm>kSGEr0uW)=7 z{R56=x>f#TR{2~4`Fjr)@HH^g;<~Vi=5y0ZzUUEqwkDq2IXHQ5TvOPK><#|=^!b+; z9Bj&*QIo4LjX3X1e3bXpz@rtw$ z69gT{LS=RpBdA?hG});5#-g%gcy)>Mo8C|*MWDQ!khsHgu6{(V&8=cGQhBaS<&{J! z&L8kIdHok?Qr{I8Sg`(k2-g1tI#*g@)UzZcJ-TRp^{PF@`9S%(No9ScYOhkzOOV1# zmD0T+m3;zzXhNwyG-&Gn`p=B@pplR1fdpn9gH|Fmrol4s$NDB{BR#IF=SV^J<~lk4 z>aPstf_&vE$<05JDouAl&4t(6`3TAfOwyM9372uptqCj+`1I<)4!7XdAl15G8!4b* zX$0Xs^s7~-(&x(g$CW|sej0Yk8ztuJOWm+7HwaB(0D$3Rl3c@G(^Tl4ujt$_?bW+h zS@^9J!31eyRB)4*w*)sbCnShTsd2&8dqV2P-gb3pKnC7EJka>mbhQ;%+moZNtDmZ; zk+}8o?RnwU>0J#W$u0S)vgt8(2vvQv^7^yA#Gn1PMSM`I5_^K82CN5lzyl{c-vDq` zW4KaH^h4Q9HQNTZPVT62k!psb0XkevOz4`{Pz{~T4O@)aexeyK?(lTTU2+7%C#D_KkcM2KW?Ur={{o6 zB{>VEzunDzTMGi73EOQbl57z$&}&;`ignhBzoql^xXwXPE5;jVyrs){K4tppZVF#Z z{{2RlRTk?jxal69B$&}>fo{Dsx(4r3Kwa}T?=?l!TJG&O_W<3?2C<#$ldlG#OCr_$dTB;-&ZGR!i1Xz4J?WH=BfV>$9Ene*!jdJ9pkX zur=%~mVLOo+q#|ZcWrIus!BVn5;k@!(f@ z@{0thLii`gM<-vaPFe>#PmU9eqUx7A6Bn+S-dA+|`32L8i%$R0mq4jQvT#~=z%*RU zmj9kw)HU+hqAg2{&M48oktg;V;Sg_HD*zhCW^keiO$0U)p7EiE#jvC81WsCwFC|E# zKb7`NtvG*2ls#U8e_t+#(ARqb?!*o5L+4=q;An2RZbkvtOOUUQEUEmOAF^r0`PeNT zpO>n4??_3n=Iii7ir49_=?XCo1u2n4|HCc+p~qS`7Q=(Gc^Lwb{Qk#JQh-%S7MYg~ z{#qq5Fh!$g`pV8Md8VrP(0H<}b}x1CoMFvX)=35`q;2wHyZGWTZKW-uu%#Z zmukq5Twq}82RY)OAmqBmXw=rq+}DV0ET25fq}Y4hyWUTHvgcn!=xSIz61bnq7;@+K zX7*DWfA(4`=GDVE^(GBE)%crVOXFxvb=UCOcy2cg-E5&o?5XLScCKsbj&4pjCY;&K zP?BX)1Ee~0U-X|b7k=87syD zFoh^|3ii5)IT*5wtb4@m`$ujneBxwR?%BD%3+!__?sJNZ0wv|;Edtley#in%j>RYx zt9kDL%cbWu9Y03Y^0uG7Loagg28Dq)Shiw)ItT*pjeTuzB-Zj8$Pnh~d{!%zdi;nl z%g&Tt^DGLGNDF7XD^r?N^9NSbi;S@;#`>YeY>eirO?o>1B@3#ULt(Zk2FUR{ob39D zAN*4l63fD1FV*vrtb7)E6Dj#5>LzB$9$Y`}5)-KLQE%74r$Uj&P%mqqmu>5H$N%*w z-ICs}?Fos@VD%vyxgM*#9R8JG7)~MCYdN6y=8Y{2AMj1MfaHDc>wt&Kr-7l#6lmGhb_SqL7+y5G2Ax zHHPkXyq?3dgdH&%C8D!EW3S>kr!Ub=ZnqF(Lu1qKku4>1Y7d3XU3hT-jv#+%E%F@! z9wy3SvDisyig_p@Z*rwp4NpSa6BeI}=S+eyL-JP~&J4f0O74H1RCgWuN^ry?Y5>5Q z7Z4|gT(BE(OOsAsR`-%$v?NC4@Dy@9kaT>B&FV4O98 zbsr6r@>jCd=99p)YhOjHawCxlxTWWI!dmy@m?{CitQNRT#w zW-)O9#*Y9n-H8MyrI8p%hns?ad|hCV(1fo*hwH5HOUEpW)^0-?*-*VgVX$~yAk0*pR`ns) zRiyCcc%2OQb0-I|ArQ1dv6Onb-8brkO+EgXXt*=@QEdeaSx${p-9I;)aydLeZ$ehq zaPWhRFPPVy3NSqim2 zt!0<46exWjS6OlAwxZ{E>o2YU$Hab_VV4dj8{_FFc3N+$Tc)8VxXO<~jyoNo1Xef#W>QlOds%tUQNJ=eO0Rx#1)%jfK>>c`4{LHZt6>kW+^ zClwdtsDcClFQ!`>7M4;*Uq82^2KVXK%~hOxsPhCk^8A<2y_C71H^0=bkWJxA06d2! zzHsjGz}+7G`QI-Z+dGB(7+ky)?lw0zZa-Fiu=(Eg=SE}a>4_?iL5T|FYN9}lPz0`W zDx*eI7h5zcR#It!*}18krvnwQQNF->tEori6qRU7Q(EN6Z0eOUQcHF&U*vw<)Ta`y zmg=Xp#6Q;5uic@Reye;*c(>^t{W6{yqqHo})jVKsq@IykzAUZLJZK-Sp7mPkyS#Jr zkZXr}_S^FB%D0-|d!4H1^eC;UWi}6AHqyu&D__xi+x#IUTI1Q0(yH!Q^T#_K8ZUOs zR}FWYKSiHvkQtQMFkCGo@kW~YTor3(8ZD#g(V7L4%Ij9nEuXVHGz&E<*6nV!jJ-J3 zEH+i%aLjBOFEr9Bb*|Vr_qJuCGFq$LPkGaQtYxyHL#y&u#pcD`mM$h6J&Yx;G^(g-e%WR!pF*?&S zR`Kih+t#^X(P!G0l(+7Uwa)K%oaxxD*m|(r`t9`e42403E{xl#5M!NguFCB=jkX20 zhdRBIDmzKeZHqjeI{g}zJ88GtmPBYe1Ewm!NttcSGRC??&XvC(zis=j@=$l!Ph~fE ztZhZRQ}^So%H8L?ZL3B!-H{lTy;ofAYv#s!pEE1>-e|P1+dtGBf35PT#JPRLwUd6O zTluHrR{N$GO>e44Wxpn~{l{fv{h6`K{rb1(`)>PI zG)`sFfjjF>Bn;vX$0ZQWb!2FT3 zQ@mHn@eg-Llh5F~VAp*r*B!r||J0+8@Y)9PuXw|#++YrWTpZTE2AaAj&PO}w`YdsD3E=U|s>$T(1RFaN}&^Y4HyrJhM+UR@6%VK|%Ui`(25s(ZFzNUhfy{ZFv^8#wx2}V)Ml}W-9Zq2jb{FP>f z73d{kkugHgVt7428?Tv&dSeB!Jv(MJZ}WmK$jk(M(vp>6!^PA4SF0bX9j^kvqyb+z zEb%t4CZ~PCvq`uj_4@cECb??AvVJyI&BC9t1WOcm8xP>e{+XhR#k7eSNCsY8=#@Db zBvdC(I3Nhc;(4<$m~oTidqAPnp1&t}MP#fo+*C9RBS7qeOp5c5cc}u{#d}Q@%P|63 zghO%PV`bm9E)&7nMJBC9N%ee%-fsHy{Rh38Qu(}V-8*68<`Lq)xAPTyedU9{sgBb( z=z;k6fMRT>zYSxs(;u3h(Mt!f@iFW!0ZbTo!8hk69G#Umd|9n1LTDmf|gD&i7iOH|Cs33^JK4X)R7~p6KCv1OYFdl|U-p1Ze&x0R%yV zO#RvS-IL(Omm}>_`dzi4OHh-+P|QTkwpTv_gXY1C#uBi@U9i(0&8BYMH3kh_mpT%x zSAdbrGClc20|HKCjGy_KZx@{P?e#NX@poPEjemtz3UD?GaN&syJT1Vc`dqb^3HVs( zdKv2@vSRFc`SQ?`1>%jP#2Y8|H_j#jrWqJ{R1d!rNGk%9-KPVLkGQlmY2*a7-eLvLK{AqC-zPYi&hq` z>xdhiloyB@zVd*F@sT~4&lik?h~haJGiPKS7K_Xcu41xYr3$QI{{<2``=a-+VE$c+ zXA8X9Z>k*u)Ju)wEsxQQz;p1#DnApmxU*uM)omrx?S0B%7>gf^hZUN^6eGldw(Sc0-b zF}AKt!WUdlcmX9W9p=6^AEvMSGZoysB44nk8`~|2$miYrCXNa;|Is7JcS)`;-x<46 zV2!P2+x)5QlVu%S)bLWpq_p4^_$GM+YpYljLVmIlgb`9C1O`3t_bG}FG8LftKHX<{ zR>`1EDZt9b@DBUd&3R)iSB>i!YGf{ff=X4QyhQiDANH+Th?zXrGc(vD@RBc^M&i@# zd&R?7j0UH>Qsix}0u9j%< z;m;W3SiFum);N|yVi;J5?ES61wYz_At0TrR@XGU3lM&z8=42NBCIS!L=EZ`Hh^9)h z7}`}+zB&`VfhB`yKna6VcmH22$*PBWsz;H^=5@a|KUS^WRQYM&dyu_#7~;J;S&0p= zI;!3J<{SI6@Ylw^D9t{0PKI;-g@V7wER=~CHwrm0Kx>r6Q?liC36HahxhEt`(lcF#EBC?oQjEJevfz-Mp% z+v3l->%|>w>`x_1PGb;UJKPPvsJ$-!Ug>WY$_b^%tB}tgWdq5x>gV4RK-+F9)8n$148w_FF~??1o|v)Wkj!#5T9E z25L3&%8sbtY=1+!jem~nV_f~|&>Lfw zjS=;hUJbx<@4L!t{!sCAR~>UTDqjFG-pXdZb*;~YA52IgT>PK(20jHW0hA=@(wp-C zE4>eQ5B}0a$(wt-Yrl8?*Gi`T{4xJyb9#M^4!lQ}7e6d53{t=K&Cj+^f1v~HhKaFS z`aeVejUX2d|9{%YxqaRA-f>3n@&BV}{P#amG;*j$H zc|Am=U1F!c?tD-({h)X%s_4u8H{+27WB2k$=@sKEC9mlf<2x^g>6ZKdM%Vvs zB^PDpy~)Tec$EDr?r~}Ovw>vNv;R2lM^A4(eRnIbKP;ywG@C-N9tV?JuMwMr9?>67 z@#(p7sZR(=S-6CZt7&zYlWPN#svpEYx=%=p#HZ51Hl1qUycbJH-BwRX{t1=-2^D6K zANj?X`^A;}#+CUHiZ9{bT#U}A*O1*J^4#v`(jhlpansAly6K6UDRFedjY=XYCEz6S zk;2h;_@lyk@89ByyvY?2%5nF``8zpu$bIeB13KHj91=kfBD;oX`vu+puhtH`=zqiI zW~S4PM~>J36Gyhcn)tsgvULE#+8=+xH`v|#8eMT)`8~Asji&dJEqorBdq+8Y1)F)@ zGxfYnx7-#Uq4wu4**IUccDg{XBpbS1r+1L)Wn_%KC%uNOW9Lt=A!DqZjLgsKT6t(% zdTE$nP&e~1z}o3yZ0L$x4eO?6dLCuss)BabHnLDQc2qWUR5EnX(8sEtF;>*Klh?JD zJ7cM!Wg??xCasB;)i9Q#*IU)lQmXn=N}6IS2BJ!O5(*k3iaKI)YVSNu;R`M+^w9?}2wk^d7%7Lnr?mi}KKnM+8T zOYlF5WKR0y|2vUPm)@eOf|jA)I1sDKi2OjcIK~Pg&6+AV`l>GlsTwqExlPacI_mhw z%Kf)~tR(}WNW6I;&woiTRentRL*DUI3#gD z{}m9xH!kIwp?;|=<^GZIwQ2v=;s4f;J;Ih!c#Ra26}VSdJ1cCy%qs0`S$wViU;Vge zjK@7nNHcv=j1>mq!;xb~u@#TVmS_|O&t{*NICmm`fB(R5^2`Z{ z2QaX?3ORk6H;g)D+$pWNh3PtmekchTut*WB#oT0as3t}RnIY%GCoVpjyTicz+fkUc zvY^{E0}YB}WPzjXK|Hoy4tD`jyz>#)tnQ+LoR;EA=U81`9MZIn&c8O(@$L7Cf$!^Z zrJp&<8Fj+)G{3%KtG!+jNYTaOgOC#lG)7d}!7_|POZ_`q6u1q5%!K_Ng#Zvzucch$ zb60dcHj06!qRe7_rnf#{y<#D1w%`p3iOg>232hu)w85r9CXT&-MDB2`ypRphVo71HBsk>{%iJ;0<6dPl{^C zUUHjF^@a9HA>*Oo1AuzN02%B!65!-794t2yFV>8?RuypM9=((U~ zdYh_o4yiTK!_dl`@lM0;i)XLwmgMA!g=)K**+nn_1T%ACm?~Re0|6LxKpc5Y;}O2X$M}eP6)?{!qj! zwk^*1dzt0s_pBdoCm5G|nbP1myo^qf7$*P?&cY_ZF#bS*8`Vq5p>V28+QQ0n@ljrc zeBuwPBHji+!n5{VCqsa8d8a% z{slC$?~T~)@TEudH@Sru5b;{GQ1&Ml^#bl43Jj zK85;B2*W9;;7d*a;E9|FyxL{M!Aj(J1dHU6K?m@#E)wY@K%{s8K*L_D07h}LlC2$fs{dh`5kcoKD7)Xw19^8-jou^H>DnrFI4?rAGqf$LuOwdl4Z7@tc~v{ zFIloG+ztnrDA;kP9SnSx3(`rk2EEpeOkoI+<1<g9}DTJ%l83&iNua>?D z1d(qoRX?+X5u8u@&OL2iyew)rDaHVQESBQ7XaO0ak0hWGr3(Iec>*MCedhV1{Ge-I z2dz|EKz*h}bHVw}qfh!qH_9)wR)!uDCe6gCl3}TqMX_sbkG*j+?8W&|z0zyXl>(DVIgBf95Vmh?2_{9Y?4NLA?Gp&=%D-^q!w>t zkT1sQPzq)8{e~Z}0iDL?2cP6#n3*4Kd_3$AFAHkBD4uqYb7dp+%Yr!2pmd zo5aoM;Mc?8a=4bCxQ8#JETO{sE!BC=>8(nc2k9qBhf=}S2nl_j8%v<#p`;u>0Mw;Q zxy-$Rscg!V@oE?&mz-OCv3=(f(H(pzE>V;Fw*yRKfTdp?&E{T7>U*m!Bkq1-Xsv-( z#@>JK>C633T6YgVM)VIRyz{|7GT@bncgP0!T98=z$iO7rz&$lZ4$I>DY!sU&03vK` zDk&gwJD9@p#mOSuN@9%V0k-Jzz2Y_{ftyaGSsgc5XPHa4;!>goF+wNh$tXhbcj19) zh)FlVM$F>T!RIoj;c-FkMQiaNBUvtdgYy`j?&GNHw}1X#z84wtk_WQM5|+6da=%sV zzH6_!`vtW0XFNwLBG!XLh@-wzj3ZqR`?9m%WzxI=x0Fbs-)n`aXe~%`7Mu2geT*;g z$fjrVM6}3X3B_GSN#GVWx{>|WARYL~Ro^Z2tl+?SFW>xcwz0F)UE6mx^4XMVFch== z-mh4Uc+1s%&mYiPvYN#xVy6&c;}v(7)n+Qtu(Py2lc%g;BAb2$-fw)8zH0brDFxt0 z0r({&&x^1CxN`Kce5BrVYbr%GWJFSLWXLo?*i}3{01zUZR2OsgXB4N~6P3{0XOwXc z?D|>#@BT01?lY*#hHdzK8YH2lP^5~XD4?JLMT&p{=^X`Wf}kQrP_R*jP!oE9&_SAX zl+Zf{1*t-?QALVKvxMHw=DM$EpZ9rpW-vM<%@0}X zSLaEC+L+mar!}(RJ`EV_jkHAFLkx(ubO<3b>k!LjkD{Ew|FrKBRl(~4z>avWw$f z=X#i;5=uG!4k1L9b}>xLI$TFDH0llDnweY#{?vY`OEf9muoq?wI~R?9teYNT>l=O* zAP}7dG=1V?pKj>b#Gla^;hG+aA;M0Rf*@1?+nT4xQluCE-MiM0-O~yFO@zQPLeMS& z&rkeM=}nCEB@+KFy~l|0j9ns$KPu_p(%UyGJv}P3DJuKl(wjfJKq>l#b#$?BbZL5Y z`G1w((G>oe8l{-J|CHWM=`k%$F>PZp9lQU3mfru5^kdU?q|iamQhA-=te5Aii$FUr@U}VvG7iHYv#TOCu>Ey+!9E=l0m#>ljbvys-S{bXsG+r zT+YnDW;Vx^_1UCIYy>}aut2&(HN?P-D{P$Gra9&EY|723v^cl)CvK^(eW>URwj!sL z+&ykDH?EvLWTAfAZ9o1T{bSFX$$oys0Kd#QH>fZk5$Z?Q_sfj#Bv+54TKcl&6H~nV z&?$Y~Y0^Bil#Dy@Y{|sT4yVj2IL{~j^bgA!qxynxrL!jYasnB?SxwS8-Q!tSedxKU zbU)=RA@Aq%PEafgNnXyfE=w7L=VaS(kM{|EQRX>nMprcFNF#woF4J~+Qnb)^s|_=1UqiUD8-%tYM%h2DO?FseY@wxFsESug_@!-9hx z5gIBlwEbV`t02-clAqC2{!()S`f`F+ibEJH8N+TxqfrH?`wJ#eXbP9(uoOod>ShRsfaPPC+iprnGm)7@X zdY>+ka4&d1US1_wF@;U8UwL76x(LGjVPjU=Du}1iCI0;-kx}L6Z3|VTlZy?=Q|0A~ zEr<{%U6PkUqn0T}7a`d4xeW3-W-Gq;rA3wJ?6~LuoXCOs6Lrd1GNnPEuqabHaGI1n zJp=Th7CGz}d9hI(q``l%sGoRY%o|WG5KxxUQZ_$>yggIYr(EmRU+u754Oy$n zTn29{BMet+u=mng0x0qs6c74KrPGzD$rRmt=?_;^9uL&`uBONZG`J1q_hm4jrEYSc zeEd@N%t{JrzaaIX;lw1;fks)itx~b6b&#eoSExf~8!az_WXB(& z*I>EQY{&K^Jk@5EDkj|NaFAlK*EVvg{c}LOU;tU!rlEZRsE_BMn<1X#%9Wd6XJ@rf zPPRkjSYH7UOsV(SV2v;aycO_z?*Q4s-u8yQsWGaZr?PEupv+*f%jB?oL#X>&?CVQY zZxhGgy{zI@4acM^6>O|C8l27TJRVU!c}~v+Md>(JD-BooCFn zLeOn*?-gffR0*0_)!X%vgmdZ+2ygn~kTt{w6%?HgG9)D%Izlx3pIh|&)7k@i}6P%9(3h1&MUXfULltkc{N?i`q>vYwzsbB@S;_wOMZD+F?(Qs5Lh*ZYQUBE zRt_?#gOLLLg)+%Ss>xe{!`ZF!Zww@u~=^ z%4KDQ4i*eCFCC>Lnb~$ZrHT%Jzg+fql?uE?Av;mB6oomIE6Y*`$!&CyFbNz?tG~U> zCX8o0R{i2+MU{qMkB1uB={U8mY&7uKD89YQkpz}DB8SGY?bv3(JgXftA>hPu(jn4j z88YpWFa9#a%`-j2c-Z>a@Pp%{8p@+>`VGEnhzoe|lzz??j<<8}v~>T;c^bzZ4EV%M z%9;1TlL2Y+`d{wGeG&50CQp{b7}!!@~LFW-)vc)GqCm!hiC|RWWF#bCEJYBf}i-XhgADLVf%BK z@9gAxn_~w0fYUyRJm+jY1&xRcmSeP*}V=YvZCO8jQN4cpZ?x}wU2Yseg ze75=ZZNDWq(mLbw4A998WiSI~(7@4yIX+ZiE!z+-e)KOLgry>~qY>xmOO74O_f*JZ zGi0+?c40@>(?Mg~<;iCqT3BCJsYaoO>P|mnw?1w#(@^7dhA2GXBlYiV0DQch>km-87Ws6ur_@zCS*ws`lfd9rU`QEsww%F>Gs`(?d*NTIY1dl^|mKt+Z#y- zhtLcdEWLmXmXO{1myurQcFYgpatzQp3@6Mem0Y#^{Pph+wN$IzExTc${bfYQE0$RR zqAX}Kn6~``$N72nk67@kC-%<{g|prf!t;8H{1<63ylM7#K0Kb*`hdNianShyUHiJE z;q_PW+HPXPbIaEsu|L=P7{QaC0MHvM=MOJr^E8q8~XGODKpXY3CL%I=lA-r47jqbdP_axTDWX4dxF(KuX-Up=oCX?Q_5R- zAoZMa%^ZL;zdu6WEt(^etMHxocIxgY-bckfnTE=NTv9S!v7S2I1yg&&r^mz9p0Q4h zjfm?-tZu5`x%zOb9wox?@-3p>H*A}ivgK*Abb6U8hMMeBwmhjB%6je8Csp1v`me}p zwkE2-?+P?|!G$`ew(cF$J)kj&-c9G)o~XHGoB=mii9rdT9)b-cwIW@_UroQ zB5ma5>Yf*R1Cj{A0|E|=wxGSZlP)zIY1)MTdBTCY$_j2@9`&m$SBKq9G+1+110r-tm8$<- zeyLC0qGsc)Dl6l7+xcO&gRa>6)h`|!@5dr#)_V!=mo6yE`nA5)=xp+vg$O!QKEVpN zZRW%E9v8TF?`}q!n5{jARCTSdpQ$$c{rL0+)s->uMQbO*$zy7mp4G)DzAw@ZHq0u2 zXe|0UXH9C8N6|$)&&Gvg?RU~%a@lPa{A!r;uFKO9CO2t>f*+Lf{IXu_aQ<>5;7_;W zx4;F@m$~lmlnif%)Y~O|yUTC_NBXx3H8~OfZ1K&Q795;y|0Qz&sR-gOE;1*G*31&g z^<&xcWSDuhl4C5h^mcw^Dx%9vtfTfg-*-#7Sm6;+&n&(BlJ`V2rH_rOW(Vt-!ezC` zEt}m6*)zlP8HvR$E9Fkt7r;V*ke-#WzV|kE_U)$v7AhNmXS&`TX>IaY@7gPba^Z*? z9FDI%h3>sb@s4w@W-l{UbivWLPw1Xu^Y zP#Iq1r$ZO!Fuv}D^PIP2@O+hyE1J8N-0GC@E`QN!glip7Qb~k@hc(CRr#O#Uv+&x7 z`A8prEm2#}FpfvZxI{N=g|3o9v~QSp$HTh4dCdvOIll0?^wyktLyMR#pF37BMUfLc z8**D{?%NAJ>eBU5AQ2c4h(^oKhu!?02Lt_puXJ zcd4pZ(cVoD&0)wsJ%h6-+jxlBOR}#l+j_K1>zlcgi(|UR_qpO41%u66NA&4el?!stOMQ3V zF&>f|A*W;|{gNEMoQ^NNb4sqPOx!j4YD(MT9i(_)=lQcAqia8%5^{zQv!2?xrMg-q z{HLtqehqi-&<&T1eSZC1k&nFIZ5FGH{^+;h+RT*JzjbB4*^IDG%fE1ER#_pscU8|K zaJPdSIziuKsXCQEfr~&n2B0n;`}F&6Kk#%PjiQ%Hd+0DVL8h3c+mV z7RBVq-W$?arCUDbUzE#KxZrA3RI8P1yHN~?h&fR!*w;jTT%ju~jkuTD=VbY$;`~qP zS3@h7>CwfPzVSHQCHq^te7Ra``pne=nD*s{{F73o`;u*;{&kgYg}mEptGbt@%_xYq zmka~vg`4M6?8{#1wZmo>|G|C9sTeqm@?Y2YR_K%5|#N2(?0-*g}E?Vy!)ajxD`8yNq7{c*iP zQKhBgr7xdM=q+#CS8u7oC%?MKR|Pvu*ehPK%_*p9y7pPd|Ert1*N>D&ZTqU2CAOP~ z@(p$0KUY1?VAsN3lz*KS_rOJiyZ33*cHPylzx~!!dj2$gY0QoA3dkS0mSCb-U0LMe zRd&YaUS#?kHtl6a^V2hvA_}cNMMaN8?m52g*nKUlLkT?*P^Woav1A@1_ssCdJmzvk z*|avpJ1MTxaqZ34yF*W56XUjdF|a^{%&BVSitJC)^H(!%L_E?7ZQt1+)%6i9t5e>d zx$#}S`L+9x_0(&pot1-|^YV-2Gh~_3|666M%io&xldW&Mp71C6vPuD{ToM#g6QgP@(s zZwyvnDuYGcE0k|)2CD1(hPT5jQgLb)N$~ADsqP(ZH8scA3H;fXKL|s+RauuVl-dnT;kWE zV-NKF z__UXFKuK5Da$=-dt&Km?2ml%eX6K+WkubUN@d7RviLjWv*Z z7a!9BZj*S7gN4UDfrSh3#}J4b7Uh=&F(Klxh-WDHvBw(x;V~HDH)5)9a>m{;&K_z? zYOseafj@6R&A8zAVJzYrp{*KG0(Cf!sVILs^AHi6w9D9Z7Eaxm~Fg52Y z_VfN9WL3G(UI#1OY$@0RQ3k;mR6GP*=Twc1q)sGBoWEUrUA)G&Q2Yb{_<-~}rQmXt zBjM>9kslLpG|LtYNKe({goG2-9C;Bi4k9tc$Cq8$HQJXNt6-)>T!KXSh9dFWA#_%x zBiL;p8chQwkV1TLQ7+-I6OQlD-Z}|O;o&pdxq2KSj$x_Rpa4|Vtw7@K@2!p=oY8r@ z2uhFl67(D`Nv1B}bvK3}#eRQN$Lq1KFS#cI(_4X!QG`Htxf2;Yb#eE@Vdy-j{;HE~ z9hTY)Pk{8%eRUIvx|f!<6G&RdWT`E8X^K_M&VweH*U<=5I& zt;1?@S&CaUC=wfbEmNBeKrlBv`jS|&Gx$q+$&4%xgdXS)p74+!4(5R^3+W(S!4FVS z{C5^IKiCQY4Qz@$H-oPgMk7c-J3QeIe~56CfjN$7HiN%S)5*6E^F%=#!w0%BlWW9=Z-BLDzI9^s09q1+SJctkqKcJkUenAE>by^rje{D~iIhnQQUW3P!LGhgx81O~I!**^u+zebq0l@yIAs(;GM=b2p8E8@?f`0%-v519 zK7S1CAw^L739hp+Y>+UDNGBj2LHDW9`@SqV-y`KzT z)v2UjcqP94Ss{E5P!i$961$fM;RUJYpj|J7z-+Gs-4Amj*h;dm|ppY=(96vAuPvFBNBCJDS z#CD%#nqpo<+`llqTigg&^JKhv#0*W-g82G&7!n3eDTSi=!HJj=3D03#wz~8dG=x6l zjbcI2A{yyn1nvF09xK8ZgbgGyj`JqU+J87@Oq7iK;4Ss>d`@{Cn5BA(knvd11Q+Gw zi(3O+O(p{QX;&NsK53rRKlK?WWlt2>j#_Kghw{>91!d&fi#)iraV;`OUDaHzGVoT) z(Zn$N3sK%^Bsu$?I_O-+BeB$XqGVP1A z8qQ%UL3lUJRSF%s0ALUztjWDr#Iex_&pz!{D&8-68F)p;x6IVKpif`>g^EG-GcK79 z%?sCLKi6KeOwg|F4V7atJ`1*iW<;>Vv=bj7Oxq6pou7 z0ScPIik)=}Q3P{e5R#6!9FOYuoa)hz zYW*6M&xzFYl*>_j_1^gM|2M@f=E1(La@@>ujdSP+(LZ4gA4YRN2Z#TeFCl8mft%@ykX18mG|Pv_*60mSW9 zG+BFC!tYU`i(wr(DK{g0d$1(tbuQM%Hb}(oO<5S!t0{~y6a5ye=}zkZp>11|fAf_q z7(t0(1dK)6VnOTgqn_EaAeOEYEiG?F#Qr&X`@GI=g}d|7v$r16Z{4*dD*grCA&!m+ z-#(*o$H5bfLb2Y*5&~%XPjEm49qd!YdYQ!f=Lw1_BrlQf7&P25ddfV2nLu@j(QgF_ zo`{Ed!tHe9djbS`_4x}9^Pljn=K-urI&VK@%QR8D_VT@kcbYGGG;IVAv{VkdEaG3ezH&NoR)OzT-O4^B7ZxVd9MeX% zo8DqifN{L?S_ej+8y`b~c*ja8d2Su}H!yAFrS#l>zeE|)G6np`62Y?LvV?lCfh zAOf9f>Ymkm)r=>G$z1Prb)7)56F;fdJH{+-M*YAK2AOac(_tmpm|{G9+-s>*iX&j# zV15Shov1)tu*iPchj~};HFQ_-;{})qE&Jk%`>AflkIN#FUmxnMG;CBm@`v%GfFkrT zPe+$`Sok?*5@b9|PCEI#KDVAXw^HXKQQfXnk4J4bIqV&;hPQ%>h->{j?uNT$wA;L^ z=so>C6)`z3iNvMAALJ_{P%|{|RX-v{yXcHtQr$7s>js{4U*YeLq3JP6($&4!{SvG~ zVp<%?V}|IceWXp7c4pId*m8!dp6VxueGR^1{<nuIbofmKE z3)F)<9^Vs)o8?ac3MBfubvNI4%=r4z?@#yg{Xb{>H;I{L&3x-m1&Y?-#nrz%pU7N) zU%y-2wjI_QV3$xkE9Ay~KQ=_DIbW#NJA0c|7F;C^I_Cw1ws0=e5j%7wbPdI~hL&98 zQe5NKUE{G@<8@g(=Cj5}SmRGy6DU~|Y+MuSSrZ;zJHEIkva`mVlg03@i%PDGDXxp_ zu1i?0pLAJ2<+CnHSeHs$mo8a9-MD_HXI*A=U3PK(?9Tc*=mwT=Lr!voA+NY`UU%by z)rNx0#zmhEMZ$(s+JD-rl#WN72QoOt4(c} zO&y<2UBaeb+NOTVra|MTVb7+~=%(@FrpeBxDRj$>Z_8YA>#E|`HQg->t1U~Ht?NEp zR)j6-Q-zSpzuF}m%!xP5;yx1@qD`>lDnabyJ5P!;a0m5F1wLFy9@$hmzcI2Rk9o1 zxEs^68#}rix40X>vzq|jBk}DeO70~o?j`H)k*)SpT=r6Z_R1lfzC4SwB5vRQ( z-;9GId?U-7_p;ADQp81_SBm(O9_B5@(xl|ygah016Kq^LZ*m+LS6FwZwasxYz`wkBNX`wE=`~sKIEI>;|fw~?@W>JgCFJVMxD{~ zkDx}#E=Bh0MqO}?J7X4E!k2Iw%i=N{_$=z#Gv$4!8UF}MAftaV=REAlGvjD|_ef#q z(3`|^+BG181U4$&H%1-h_(WEmAc!vQOJK4?t{ZjLm$AklOs0m{H-a{-kNTlRZxEC%Tbqt~6V8TC z{Se;G)@kEf2{*d3hN%wef2YhmmpPN+ZRd#obP+z+8nsj#*4EY8Lr62#nu`CaJ- z_DTGeE9`d%Gv?i&Yo_=8&fv3W5#i~*VmqL zy2W~pStw+(-df(}G#or5L^u_AF?>;J5KeGZaj{*|cn_;}l2&*UPraJLdNwk>IuG~l zDes4dmrZQP1|QN@j;G)KfU7&B@T7IoYF+V6G8cECx|x(we=7WR;r;e=dh_|ZG4@jG z`72=y6*o`t-<*9AGTvDAOZE4L{{?Se0p3S-5;TESd#8RcPL*9uINCr-Gy)=*7H{xw znQY=df8htmb$6a_K0=JN1;>4NQsI|q=+_dG$CV5{lq=ip^^sHC<4f88kZz@+xOoq; zubOVVEXOs!eYYOeFo=IEVRo*X_dAJtJl!k^`lRbCL&Hvn#ai>U_mWY-)zhB}G#!e4 z%;N6nmx-IXvu%oL+JrVA<30Z{asl<~sOM|+UXHwVM1-KfR6*3~7Stm!%SDqy&G;)L zif)0ASknAYkvR=;TcLb+AR|#Ek8hRaW4`M5FS^{Vc=uyPBm8vucMB`WB+^SBE)~N7 zYp%z`yfG}}?NC-|jyBSSJBqR8Fd;)kLGJ-@R!zOU1o%UU9{} z*BaDK^=@3iQDpbewypJFs?tn+t}v7Z%5Yv$;wYA5H^@9C0Tp)75oh-Yn=G96sId*f znq7{}q9s5(SD5SI_e)3)&?g*DrEMVI-_mXzPx2T-4<09@5}_GJEU(>;XL~XCYu@nu|UD>_CH4Ak<-y;x+ ze(XDkoaWzsAjTd?LuIA^lzKd|>1s0wF1ivSd_U*qgCC!tTgrZYTBV@!5$#-9~TiwGP#)Ws9VTc^3x}j z3+Cwfb>n*2gm6Ws0gK?pK@vVFTX=W~NaMW$4NKB{5^gpjgfwbeREyK2`vNcI=&{bJN4U}hKvCb6G7Dl6 znrxy{9?@VoON|iMD*Y?^-}Z%1zIpx&A@>~2!TSNAF^{e$>ZpowC6{)cl&_952^8Zg zlU{y#(?Gu-fHc9_g?6OrLLKclXcs*7C;s0{zeI?_c99OACvuUlxD-x6JoHS-!8c3(Sav$@2ZT$u~AJ zJv#pN%h*34->1<@Cdl{U(?1~JKN{cvPVsepoopHVT>ELHe0Z>LfY#GL^kSg*UzV?{ zXW(C%ud}O<(*5pVim#*d-M{=^OZz_pUsEfUiSRYFbksL@)HSyKPkXPTs*cI;mA$Mf zsh}_gz89r0{}uTDo7`hcdl}uG%vyw*io~=x2Q^gx8+~}aEOjm^xKWUknODZ7_?QSE zvjItaUdAjtu0PL6&n`&K%42GL^ z{EPENC8QDJGnhVKMC^b0d|}b4VNr=;#Q0D`9JBTKm*oo#jS9dMn3acb5Wy!f{2!3d zFT~p?m`U+53yyyszH`J7robl>?DMa{#|$_A<@X*i`MpPe9*={V_TD`&A6GAbw+BA1 zo{yOkhl|G}XOAa$+`X6rpOf38e*`{PZzmT|$GaXk?|M7j@np6ec255YeAW&w|MGj+ zY;Q4pjei6_>zn4*x6G~nPlWHfgNcQm@ijYU#9?^V#=y)<-}E}O;LtVsUlgDA|DyOz zm=vFymJzeyP`$#``1F|_hcZr2=`!=Cqj*`58F4UKJ_R)$rp$NYlBT@!{}tyud-3xB zozHhl_J8yF#H8gg|L+lfYg*BpQijoBFoa)8BVq)niV`=-)GQ6k-c)%TT#r{f|TeiPXavWInF2jVr~b0jE5C6 z!;r&+2CY<26`QEdZlPkpAed3!hu&4oEx?$gxv=ms5Mb`>eElBrg&7_I)2iDeZL~lcR@2N=j+zU`kBR#6 zM)`A)x89#;a1568e7uaZ?$<=UQ)MrlAyRYZw|$vCg+7nQnx+3Wjjm~&)ojQ&AhFVd zH^}3HJU~Ros3B56617LWZU(`Q0Pbb$qS$wVScj}LHq12RvLGHx(9a-8SnOIV+!1fr z*7_U+*3T$O6Lt25Y02n?M_6S1g}G*3Zt0szdXehBQl{=SdlGn+vev6*w$5P111zNG zh+mf`i>KN^?kOI#j#UQ+_8%XCw8U4F^Q+4Ceacgui(r7vSF_LUQnt@ z${Vq6^$#9S4%(MI6F+SeR=W9JV!b6sOcVfD?x~7lw1QNgOlJa&M$ULI%7VPug0v$D zDQMXPRKKkHCed}Ov*p8eAb<@m7ElC7=jFV5-0L89$Ca3dcZWGf?hdWo(eg;=`H7P{ zqe2q5et5yGk4srE#Xym3r`$kEvFSXZ^RM;OO2JXjov$A_$=z4E(F|&6EsL+p}LWT?f}c=0)?v{V^Q*usF>QT}lWW zTe<9UzyH#fZF{q=j0xKT1yS|Naj4 z@+AWQGD{HHPG*UIfqIlUHeek|7J=;-MOgdh>)%SdxB-Jjfq`NGncYrgJUz}UcHU5o zA1(vn2t;WlZk^(KE1&~0zi5F($Tq!AF~Tc?#}fd;lBZQYPTDxwXgShpFtx2pxdf#w zM*Okv+1Y$|%j{lWXi^_}?i$Ik=eE#us^M3ocmnjeXScfm z2(1gxAw|4#ja+3O<|pkf^u>#{jBblv%K$g?hzv?GFzzbfv7y zIWScXfB}h(WD1CR`MiYdglG7se}MGzz2DRiM+4q!iUaP7ebl~nMstAlLk5&M_uVv4 zYBg7#uQo{+Ad_QpV{z@69$)SeH1v4b8!e%(vY9K8}6HR*~-!Jm=~>AeqP0ZBRL@3Xzs`m&-3V1$R?|8QQvap)~8UVrwCp55q&cy72Z zpfcoz#IKuRp~TMX?2ai0zdJ0%co7DpzB)y2w_UT!44lp@tqoNA_5?_13s(ZnsBi2` z@kL+>!|U?qUE;?=Sp4T6IKN)+H#$XO)x8kPIqHEa24L}6xT}jb3-#ma>$0bLG3*m9 zp%w@;!H{rvmig0Zu1_l}pUJ*K-&2aUNUiuNnjg;+KW`sGNx#Y55VDo|!`g}q zj(m{(ks)O$yS~5M)348#x*pC;eX`^j*cA_=2h0$s=@6fYUfZ&+;fahpil>f`UoXW- zMhR2x6ur9+?)w59yf+*zGRF_}WDI^jmts5}y@F$NNg{)c?!^AFGf)@3>g>8)mNu{| zM}itJ4cwy+y1B6<85mhq3=TF}jNF1Y!06B0#>C%s-rFa0|yXQT;UmA`(yY^92f%SJTadL9WWM^Z^)i5nPGR*MS&b6@h z`%fkhrUhy%o!#ER>|bK1hsJ%(_H(WT3LVZE+@iPXzG21wG`8h2Rtk&xKqrV}=3v83 z?;f1@&N_T2p>f5shp_Gq2oIc>Vwfs>3YH}+2oqlmO+GchaTbtXari@NxOvEDXyf_8 z;UW&%LL-=L76=_J>6x~CNE_NLzI3!~meBI4#AK`7?r6n&xaCXZ(AKMfqg6*_>sXJ; zc1_mNPgm2{iP53$hSsBBUJ0#JizYiQlSjXOhg+w2hITp*j{e}0Z8K2Q-8Vvi=|t1E zIlkfDcbERIkrLXzOPcQW+x=ZnA8z}hIJ`F$@OL8**}kM}y8j{T?`ElK`-;`@{+HIj zTa<+MpDv~c6O(_pn}*we`wSmUAN<{+B0J~=)5AF-#%`}^$9mfE;g3rU=0fR?%@Wh2 z6+6cM*l@>o09BohkVbf$?LW0qyvhyB91ma|GwVqI;i&7q({oyY>fm z;8PO~@x3Ls=@Kkf9W1Va*Koo^(}PxAcwj_))+}BN7^0FGbhH!vcoDS6hgO{dotwq~ zh6b-&p_9#ksgz@rcvf)~@HC3`6AHb{7s?|V0@e%SRYHqfhn`>Jl5gU^)Ema8#FL%} z`iX~f>IF57gk25^Kduy{;2Q#GVpe$}!lhw4Qs`w}gn*tvGY+_$2GGW$tzluf&LCqw zZUen=%XB=uHIK_K*9{V26(4yIcHDC*>=BH|S<2@u9mGR}UTq5Zks>%*3(VtzYkZu0 zj)*)Ot7Ce^ZH8XhUl(o{Yk~zo(Orq>0Y8E4E084>Na1ATk2&y(SWAmM=NkTj1kgmqXwm?40Q3O{eii`4&{w2*>2NPuK~)-62rBMG2^iowwV-%;qACOiX`uwk9B(-b+4XBEW&U!r6P1Q3A=x_Y-^Ze25%7lAvQQXz3*Y=`vO7EYgf_q4S46o>GFysYVgfNx!VH3%F z59y>7v)F{cL<9UF1uakkdMLChEkY5GloNn;DYk=&RK$`&cUN58p9vlont5X4)%0aUffT>wVs(yGo zJh({!J(vfy@8w|T7rT-KKkTdNmhUkc%{iGWDu!g0Br`Z;tL=0jwUD5oSw1t%+~Y)1v}3ZU89f;kPs zp=`nMXlPk;=5j{1=W=SVRQf~f40WqC#tc|?2Fbuj`#M7507x$uIgEwCQLM)W!{)8h zb$T-nM&WP@d^rscpJ79Zvcu`%UNht;8pJmv|DX}cjslBB7wVK2$gC7#PZxgE&ty1e zqRiRgj^IwFTZVzT+Z582lHe4USu+HV1gOEL=+WSFdC1Qwh(~$WpG9B^7Wsy`VOf+7 zj)5;j;cx(lflAB+!IDR|CB8JIJc9(#!*i_BIUb=nQJtmnY-LFXWzsDLvik*cEjiZZ zMc@32-CBx0qa!n@Fae0F)GxlZn{&&tfI$mh z5KKoUvcUmtPYpod7}yj|6c8ncJcb9Oy}>4#&v`{-mezovw zwUuDaRB6y?Qw?gi#ycbGgi0Yggpw zns{jG5(4f8`K}nG4IupWucrBuzZ0r+g;=Abpv+QLwZNq`W=lf#YKgV#u z=}-n8$~%LIw?p5JeV6Lk#p~UZWrn^U+x=7Mb*EkZHKE>(1LW43wA@mVDZ>$gz;VC< z2xkfiW!_`&N@d=|yoSq80r+7HA$ongE+PJH<^Dfo4W}ZEV=EQ^!Nkkls0bR4M@8-C?iekY~xi5KU-BjP!gIGkQ{^Z1wB_FsG{ zw97ceJbh$Z849PdE@L>c<*&AklEOLAb|gRv2|0yflS4%_rt0VUMw3XNBHY8%a>ld1 zjvr$l8dI#F&5$2xtiu3w<=3&Q<&=A=#ciux$PGiKEV?yt9Y$iq+RH&RFLdI^C zdyQ3u1_{MOAJDjTe ze%co`s(~Hl>HIp)IX%aT-ah&|n**3X{_UY!_(9KDJm)xzaM}?aa*PU1swjVGH#(G_ zZ|(WMYZ-6^M^6Is{^)|~GhI4MY(LzfDB#>#={Z+^1SfN<9@E24L@LcB;RMqc&J^44 zM)>09>|N&s;`@)sLx1PZRyVhe(gC|YW59L`l2e>ah=A~ z5%%%W_`ob+R5o|@!k^Ja2KL8ihH?r~Bo8$^hdoO@y9^5XySOX49QSw5o`3#|!}r@Q z?eH1EQQn&tnR$`>c*OK08{^k}2=oMnUj*Q~h6T)o3wm>*awy2yv>qbZ z0MUD=t?e%sb_M_xqp@lWFI=0hcikQNJ}}Ui@q2ap_n(f)7DtF626)jCekhDS`uh)} z$DseDoL#-A_v=giuW7g8?)EmQaq#FuU;w?R1XoXa;-?(|y`!>Y^y>;tW9^ksswxvgK&8iDXZN^iA77! zjVD$2!_VyoecMiTf^%R%Pq0Y02YcQZex7%YdiL#Eaqxa=?tb~}{mO6quNeE369+Yy z59)3nGz1?sW#JUjN;jL;jO08npKa0k;Yu_s_YEU#@!T6rxT>e> z*qV56#91yJzYB@Lo+N88&$BFlSNkmdOM9hK@~!t-O3(g61TB_m`QPQawAqqet`-|B z3VtSDlk6>1vTw_y>7Fz!(X05e+2mdJv5KSTsdm=&UlY-0<4@HNuAen)y!y65X7U3| z!g--3-WzVD91&imYWO(o2cb+9*B#uP3rQf83#~)myX$o|)GJiWY)0efjJnUSbB90@G&3n&fbY!7uV(T^6%kEkL;=o+x8Gs79zL2qr+V>YNIhasx;Izi`IX;2VVmDS z8Y?j#{%&4k(0#=kh3NS(+7u}uxn9XWaE+!Xm&qe_x!MpwjFC{96XV#IUiuIt|EuTY z;=~mTa~<|uVu~k2#XcHcFgC)&uQAN9qxPHzM$z5x~{3X$|Y@EpZx0lL0@WP zYGdT?=LJQxyzMt{3C9jQ#j&bCmv}P#o(qVDV5L@cBOxT*spl>~i0?2GDrntY_fS3D zu|V!IvFwMc3IYjNxhSIPel)aJeJJUPz}*bD>%Znnx@Y(Dn%I&~hMXXk5i(CvUo0)8 zySx%m&ShwyYF-G9JnQP7_p*3(`X_Zz0?7I>Lp5vt0`luV=c|1;0}1Ta}t< z{qq{ESbBeO?QH2>%=zi2+c!?SOnLW?cO2e-U)3O;Pdj40L65HceYn-<+&J}naO3{! zwDLIvzlD0s9_!ojYEb!aq0eLG7fbv^`W{biJoR5J4HIh;Pv&J64SP;^bOCdqp6aDT z0-3v}EVuwHH|1vjNIekar$uU%ht@J!C>X!yn}0b%>m{*x;SFy9m(*1paN;Kh&SU%g zC*d`t!1ukYFGU+fqqNzHLc)AWS|A4}lA;7oaP%Pta?+ZFaHSs8V_t-u*ipZcNLAG& z;;I5&QJ6RM5J2>drip9Su=$HfMI$|Mf@^`qoJP>*H9dT!HAzhDbfjLk=#mhhwBBryq%QlVvzbFS-L=Q_{thxdc~ z^L~F`_bc@1!Q|w@P_rA_Z-Zm@4}}PEtY0fs$x5|RA6c|)BSV+W;(nRK z?Dj9brgO(q2%W*0^-oCpigamO`A7BBGq1^^jf__b@Gd?s6N1(<`HUq>YZeg+2U#+3 z#ec63p>jq^t0GCt`>v3a6r_C+>t-o&qG z7ald!!JVI-NXtiAl1;FlmoE8G3eU>e`*#X`1gQ3?h*v33W zXBEmnxgha5o3rz#P>017duni)W8;&tb?}KGvH}|{q5L*O`-f(B1=a;~64~wLlWftU zcPz1bqE+k#%59R@Nx(4(_!0@y23^DgBt@zDAf!=(HI%8RW-v9tS5eTab3(Jgf(BHs zke+%A=l)UEvgKsJIyOx_@cpbI0&a30lRFCXJHcuh=on0({PHvovTPHPj!AqZ<{>57 zPzZPQPU%0zz?*Pk>Lrd6Hed&IR8yN+7fnLOWb_v6@{8vkYnY(j31X|M>6Pji(01z$ zkW@2D@&pi_eD`>32ti{h5t{+8L2i#wyI>pjN6b^l$q~~HM-iv?Ar}5wy`s>XP=HUTG62pdlg7(nBC^36b%apB_ z;s2xwiP}6^__6T5TAM|A0Jf7cHYX}@ajy1AuVvfi8C0LYkTJXKdi(@c0p_+@YU#D8 zrJLNJf3ZJPs{1@z*ZEEK(s>t0qYGYlTTzWaHj|l%Fnw>ODLD9t6XYoGI6Y;e;#g;u zdi>`$&Md0`oVkj6z?_aQx8L(#eC??y^Z1+(t*3uj+|kWmqpVsFLqGM&8g|kT{Z*8D zAKTe1_Uu}6(5)A8;NBELsV~xVk@oQ3oP~Pb252h(qINCehN{>zKJDKMZjJR8hW36C z;tW-{BIFwAImP8zF}b2mGwj4m@j0jXLhw!y7WG#pQ+#~vi_3VgXGI)4!sxaO!T#GEmRW*L$4#ERl!%5fkBXfD zrcIqLqbpUk#;k3a`R^Dt_seH@%56ALj!D-xus;Wn1kZ>Zt0Ql!Y6T~`zWSVRmv@@A zNWlGaseQKvL0?@^hyztwXnM`XiAc>(J3-ZOLbi~9G+Ir_qS|=jBN6Y^DgI!H^KSB& zVEvv{=Yr703n+fL55}}tz}pSRulb*Ujq9%eS&ek?_2YAQZ!rwLHA;rnbZD}cJHEJ* z(`Lrsk%!Z-CN$TjiRUGNe@(;qvbal+7gVG^{QQgUJVO$r;)N%VJ0eOQuKd>JuKeah zP<$fPpJaojQ%xK;|ACFl+PxV(P?ZXUv4lUB*?&%TnEw3oqd_}R1_Q}C?(z_nlFq+p zZ700#rpD256^yt!j8Bn9^Zy&u5RQ^VXurCF!~8wlMZ>*%)z(2V>6(n}kSMpN>?TSj zL}?@>mRt6Iykph-ntVQ*(rN$UgUnStS&UfI!tFNRbSmf56Q*<2x11;-GSUP}*`f)| z;Ls9SkEvmgReq0kd5=wFk1eYQodyr90-f0IPQikZFi`@Jo`@HbC?U4|)053RWS78l zrLwU3EVpuJn=~>~k0P1bvxgw<2Fp4!#B!JG_0;b5GVk?v?rqVdTStK55kyHVAwBor zljXeujlHK>y@3_`?nYJz=nksZCsj)C;W%Js!*_r;s{U2^VA@aano?Yo@NmqhK`B{GuB`%)VFQdxaz z6Ma_}`>t;Gr9(JGISxsiLpJA7oHF2Ee77w?js7m-< z@s7a#6$v8`rz_~q$7p&U070*^W`xp7n|B8}s8Ac7fdt~qSQu$;nwVi_BhuRRJ@ncS zLsQV$j>{K=(tz&X}P+i?OA$Y7&aqa*76Fq-xEvpL};R(2y~Q~!ShVP4#jm6a{yYJ2^1G049Yl0CywsIFyftH zMFjmQ2XthB0YM4TU^qcq+9>RaT5usmz67Ms@0sKcwETuj6iG+&fBVBoCR^WKM3r>lgS(Hx%eaYS7;D_ z5j0R3!}DgLp|DEIWZ={}7vBOOFf#T;#I+-KSdb|mxO`*xSUCkr7A1JtJQ>Wuj?<^# z82|C2z-W*{)hx#_t~)_l^c zWOJHjZ&p0Y51MRho6hw0ZOqBN*$d2s+TVjMGYz>ALG8o2RT7h6T;m__yY2YE3FOt&Rd%!`FJ}AL~4Ow=D6% zzq#eHp>m*N@Z@*ZDArt8kc=@8TCl1-58X`pbd!rOg`m02nx0BLHvPPGyXt;3 zLfhmH3gkXi#L?)ARj1x4Wkr=K&7RpK^pDZff>m`%d%s5EoCejizk+*OaOerH2L9nh z@xp_!r&{b%HMWBCy|Q*UUn&=jG659o!N;Cb)9Xol7^HL_An2rH_{5uzlmxC1Ap0-H zYSEcSbdmIVnnHAoJ>@#$wyAvxW)Dj$A;$FzYw$o@za0z3e`=aHOinoCn?~j=w z7FX}{nK0T|mir1)ZHcXDJiS+cs(Su5Ga;M#n@*h7dFbLnaXc5Tyr5#?qjgU&16K*b zS7sn9CUf91E90?wI=Q8j=g!UA1`iH@)v^AuWHwTKKqs7S28+J>_$~;Y`K6aB5kZDoa8oXeL?gO%xv7$Swl4UB-2)=mmGNO5E>(F?`jDuiW z@h%@V(w~e44Ym5!At>#=!Y}3ReeA=saA9bC7zIgz;AmNuZ~gx=FXb*@i6uUNM$%yH zb%+ItL@foM=)X1cPETX0%w#D&*6?}WbeQquh7?1egA3t5`bV4$$5R02o2B}Q$I&!{ zL9tK87gx|G!54~`UpR#~doAC^hhIqC=eM)c)O|CVE!_PqJbPd5cu?Llk@_)o}q0xs~HE2wVlW1v2EcmX=Y&)bdjPU8L|5gH3UZV$}LUa!xb zEqK92$j_Y)4wEzn{RK1p3$363 z?j$lba+xiR{3SaRg8RXyD1PRyK3%8Qf416y46(rix??2Q+@o?U95Q znjj2!gl@g`hc1VpOHN06_QUSS-p`RwP&%LCPjZnFO0@+Nd-1f0Pq#;kG^T+&l5rG% zG(`4`CZFWZ2c!K-9*ROuPB0$reQE9}JWQtaqt@fx!Jt%&(`~DDzF&hcg=r_9(prBJ zWANg1!vXa8IyJVbKjfgcw^>SAgP~=IK$mWDo)U?FS98MD%;fEAy1zxb;&NrqH_BGL zpX{ai9a6k)(`r?GhSaH3yu)6Lkw!ch_xWN9lAo zIlJa*LOm$rhue|9grmnn$C`Kvl_K(Z(Ai(mU7DjAL2In0M2!O8}L0;(Mp;q z?%>3+jST;d{loP0Tw$m`XfzF`ShuFr`px8DKdA_z`V@+K1bEQmlFo6}WZ7>Ka`EtM zgJnA1wFhkK&+_X;-g_rA)KrpQwfQ&L&T_uJx^cESuPysg+vD_`KOZ0Y8JEoXWVCF_ zPU_vUEJ$cmfNYVi2)rH&>1UJR8?If8p42UyaAxFQliD|LM?mflOchU*sC-WVK%#`V z5(G*4N?tnb?%9$PH(yKS$K=jUhX)5GH`f-;Z5>DBlPECyuA*6tv3A)3{Xok8<@m7g zhy--&`^+(*IBARV*D^1J_yhG&r1R0$6}#PQ0VfZtxOk~ zLg?0Oal4LiXs}(kc3`*8Z+eq@cb4vE*M2`k&(m>hWe~1Vp*a~6yYWJH_Z38x5Z<~d`sX6~mXM|~!v@f*(+p^0oQ&Ovn`=;KTa`)S27gsj* zCn~)jc|E!Cecx0~KvVqM%6Eh5`jEanqsSkIv;QC5i2P~%u07@F*R{_-_j5bRP=Ty* z)RxHtD@)-(^y-%BA}3GRyEbauY-#9@<)!u2?E}2gQrDZt7kA88CaV1!qStl~u1-G- zAFsXm%VK@5HR;>>+AmA~e`lWiqkmg{T^zW5AZGoy^(ODlBk#KCKQ=#BXPYj4S^s0Z z#b4;Vxj*JFdS`RxZ9~kLzjnX3zAlf~#R%;G{@(fd?aLQ|0}(7{g(8V46HsLMzGf8V z|G*9T0D=Zh=|ZyxT{UG(1JKB_(#+g@hoG6IU)`*kZPdD@nPWO&rFHG#EI}*RdZk(G zy4}u}76T(@t$o8qIaxc;ZC{J_&7(Hk+WDUD)_V(l1CsaNI(eaGui$o2%J$yEGg;O; zMPYZ6b?%(6Zqd1Wv2|OA88=|9TbwwXta~qcrA7Dtm7Q(f5|WsW-h=-IH}uM`+3e_* z-*C6luP6ve(SKNUp;iA;amtQ<<%2AneN`2AQub9>Rk!YY{G@efU(M428-pj$XHyJn zTUJ^P>N<9I4C=eYYz?3GDyJGg>)+RA*f4DK%dm0G-PY*&WI(FXin+IRYBxh!@ z9JVx;4jk)&>$k7(6@gQrFGYsOV_HPPWX2u^2Ug~ux4dkB!G85qXGPCHAk4V-iad?N z?T=-UO}o#q&{_hE4J~( zSgoFM25BhTwo!{&#F>5TrJvq>?sV!{6lB3zgU;0NK{);j>RkdmP=|U@*4ea4pE!6D7ekOfDLTd< z%?0$zP%Avxy4-?O#*nyF5+lI5HKNf(xm-@whoh<-(Mc^ibYajDyJv&X&Vqz!2AO}r zJiH-oXYmE4+9TXAC-h45uvRv_>MW)jpc~jPUKg?c@E`qB?BQV64F!0p3nG(&RVx?Y zuu`z;KI1~IEKTQ^OSom`Xu9^ zI}1^B05A>L90GV}&)w#gTI(cnjLAd6`KVs!_##HcyRSKLu#R)1n{;%FHgX~dw*QKf zbnF5+wUi~SE}?0LdiVzKjX>?+05ujH9oSV@O*=0LCi)>3U0!QI$XZ8*Xnmcm&wXA41y^tK z>LrS1J|~%d7RG?b{Lwt|oCB%v4)I024}e1MNfn(^SOghU`Hu-F5LAUxB3*9*tV-mQ zJI}RQQ-%_X|Ja;!nji&!G*eJW@>fB5JZ7BNt^;7Ein6b>>6@+2x5YKiVI%{dZobFh zpW6b>!Qsf;VMdyr^2S_5>0sX9r>$b!Ut*=a0>@|GR{Yz(ZX#XU^g94i{Q6onNZc!E h!orl1R8rTZDcwDW{BrI;!F\s*\[(.*?)\n\s*\],", + config, + flags=re.S, +) +if not cloudinary_block_match: + fail("cloudinaryManager config block was not found") + +cloudinary_block = cloudinary_block_match.group(1) + +literal_patterns = [ + (r"'cloud_name'\s*=>\s*['\"][^'\"]+['\"]", "cloud_name literal"), + (r"'api_key'\s*=>\s*['\"][^'\"]+['\"]", "api_key literal"), + (r"'api_secret'\s*=>\s*['\"][^'\"]+['\"]", "api_secret literal"), +] +for pattern, description in literal_patterns: + if re.search(pattern, cloudinary_block): + fail(f"Cloudinary {description} remains in config") + +required_manager_snippets = [ + "private $configured = false;", + "normalizeConfigValue", + "assertConfigured", + "Cloudinary credentials are not configured.", +] +for snippet in required_manager_snippets: + if snippet not in manager: + fail(f"CloudinaryManager is missing {snippet!r}") + +for method in ["upload", "delete", "getUrl"]: + method_match = re.search( + rf"public function {method}\([^)]*\)\s*\{{(.*?)\n\s*\}}", + manager, + flags=re.S, + ) + if not method_match: + fail(f"CloudinaryManager::{method} was not found") + if "$this->assertConfigured();" not in method_match.group(1): + fail(f"CloudinaryManager::{method} does not assert configuration") + +if "new uploadApi()" in manager or "new adminApi()" in manager: + fail("Cloudinary API classes should use their imported class names") + +print("Cloudinary hardening check passed.")