From 677b2481ce2a38c77e70b98c0f5248f24e33622e Mon Sep 17 00:00:00 2001 From: Walz Date: Mon, 7 Apr 2025 16:41:38 +0200 Subject: [PATCH] Initial commit - Functional module --- README.md | 4 + gdprcookieconsent.php | 259 ++++++++++++++++++++++++++++++++ index.php | 7 + logo.png | Bin 0 -> 32703 bytes translations/index.php | 7 + views/css/gdpr_cookie.css | 227 ++++++++++++++++++++++++++++ views/css/index.php | 7 + views/index.php | 7 + views/js/gdpr_cookie.js | 198 ++++++++++++++++++++++++ views/js/index.php | 7 + views/templates/hook/footer.tpl | 60 ++++++++ views/templates/hook/index.php | 7 + views/templates/index.php | 7 + 13 files changed, 797 insertions(+) create mode 100644 README.md create mode 100644 gdprcookieconsent.php create mode 100644 index.php create mode 100644 logo.png create mode 100644 translations/index.php create mode 100644 views/css/gdpr_cookie.css create mode 100644 views/css/index.php create mode 100644 views/index.php create mode 100644 views/js/gdpr_cookie.js create mode 100644 views/js/index.php create mode 100644 views/templates/hook/footer.tpl create mode 100644 views/templates/hook/index.php create mode 100644 views/templates/index.php diff --git a/README.md b/README.md new file mode 100644 index 0000000..c614107 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# How to install + +1. Select all files in root folder and pack them into a .zip +2. Install the .zip on you PrestaShop instance \ No newline at end of file diff --git a/gdprcookieconsent.php b/gdprcookieconsent.php new file mode 100644 index 0000000..1f6d4b5 --- /dev/null +++ b/gdprcookieconsent.php @@ -0,0 +1,259 @@ +name = 'gdprcookieconsent'; + $this->tab = 'front_office_features'; + $this->version = '1.0.0'; + $this->author = 'Walzen665'; + $this->need_instance = 0; + $this->ps_versions_compliancy = [ + 'min' => '1.7.0.0', + 'max' => _PS_VERSION_ + ]; + $this->bootstrap = true; + + parent::__construct(); + + $this->displayName = $this->l('GDPR Cookie Consent'); + $this->description = $this->l('Adds a GDPR compliant cookie consent modal to your shop'); + $this->confirmUninstall = $this->l('Are you sure you want to uninstall?'); + } + + /** + * Install the module + */ + public function install() + { + return parent::install() && + $this->registerHook('displayHeader') && + $this->registerHook('displayFooter') && + Configuration::updateValue('GDPR_COOKIE_ENABLED', 1) && + Configuration::updateValue('GDPR_COOKIE_MESSAGE', 'This website uses cookies to ensure you get the best experience on our website.') && + Configuration::updateValue('GDPR_COOKIE_ACCEPT', 'Accept All Cookies') && + Configuration::updateValue('GDPR_COOKIE_DECLINE', 'Decline') && + Configuration::updateValue('GDPR_COOKIE_SETTINGS', 'Cookie Settings') && + Configuration::updateValue('GDPR_COOKIE_MORE_INFO', 'More Information') && + Configuration::updateValue('GDPR_COOKIE_MORE_INFO_URL', 'content/2-privacy-policy'); + } + + /** + * Uninstall the module + */ + public function uninstall() + { + return parent::uninstall() && + Configuration::deleteByName('GDPR_COOKIE_ENABLED') && + Configuration::deleteByName('GDPR_COOKIE_MESSAGE') && + Configuration::deleteByName('GDPR_COOKIE_ACCEPT') && + Configuration::deleteByName('GDPR_COOKIE_DECLINE') && + Configuration::deleteByName('GDPR_COOKIE_SETTINGS') && + Configuration::deleteByName('GDPR_COOKIE_MORE_INFO') && + Configuration::deleteByName('GDPR_COOKIE_MORE_INFO_URL'); + } + + /** + * Load the configuration form + */ + public function getContent() + { + $output = ''; + + // If form submitted + if (Tools::isSubmit('submitGdprCookieModule')) { + // Get configuration values from form + $enabled = (int)Tools::getValue('GDPR_COOKIE_ENABLED'); + $message = Tools::getValue('GDPR_COOKIE_MESSAGE'); + $accept = Tools::getValue('GDPR_COOKIE_ACCEPT'); + $decline = Tools::getValue('GDPR_COOKIE_DECLINE'); + $settings = Tools::getValue('GDPR_COOKIE_SETTINGS'); + $moreInfo = Tools::getValue('GDPR_COOKIE_MORE_INFO'); + $moreInfoUrl = Tools::getValue('GDPR_COOKIE_MORE_INFO_URL'); + + // Update configuration values + Configuration::updateValue('GDPR_COOKIE_ENABLED', $enabled); + Configuration::updateValue('GDPR_COOKIE_MESSAGE', $message); + Configuration::updateValue('GDPR_COOKIE_ACCEPT', $accept); + Configuration::updateValue('GDPR_COOKIE_DECLINE', $decline); + Configuration::updateValue('GDPR_COOKIE_SETTINGS', $settings); + Configuration::updateValue('GDPR_COOKIE_MORE_INFO', $moreInfo); + Configuration::updateValue('GDPR_COOKIE_MORE_INFO_URL', $moreInfoUrl); + + // Display confirmation + $output .= $this->displayConfirmation($this->l('Settings updated')); + } + + // Display the configuration form + return $output . $this->displayForm(); + } + + /** + * Create the configuration form + */ + protected function displayForm() + { + // Init Fields form array + $form = [ + 'form' => [ + 'legend' => [ + 'title' => $this->l('Settings'), + 'icon' => 'icon-cogs', + ], + 'input' => [ + [ + 'type' => 'switch', + 'label' => $this->l('Enable Cookie Consent'), + 'name' => 'GDPR_COOKIE_ENABLED', + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'active_on', + 'value' => 1, + 'label' => $this->l('Enabled') + ], + [ + 'id' => 'active_off', + 'value' => 0, + 'label' => $this->l('Disabled') + ] + ], + ], + [ + 'type' => 'textarea', + 'label' => $this->l('Cookie Consent Message'), + 'name' => 'GDPR_COOKIE_MESSAGE', + 'required' => true, + ], + [ + 'type' => 'text', + 'label' => $this->l('Accept Button Text'), + 'name' => 'GDPR_COOKIE_ACCEPT', + 'required' => true, + ], + [ + 'type' => 'text', + 'label' => $this->l('Decline Button Text'), + 'name' => 'GDPR_COOKIE_DECLINE', + 'required' => true, + ], + [ + 'type' => 'text', + 'label' => $this->l('Settings Button Text'), + 'name' => 'GDPR_COOKIE_SETTINGS', + 'required' => true, + ], + [ + 'type' => 'text', + 'label' => $this->l('More Info Button Text'), + 'name' => 'GDPR_COOKIE_MORE_INFO', + 'required' => true, + ], + [ + 'type' => 'text', + 'label' => $this->l('More Info URL'), + 'desc' => $this->l('URL to your Privacy Policy page'), + 'name' => 'GDPR_COOKIE_MORE_INFO_URL', + 'required' => true, + ], + ], + 'submit' => [ + 'title' => $this->l('Save'), + 'class' => 'btn btn-default pull-right', + ], + ], + ]; + + $helper = new HelperForm(); + + // Module, token and currentIndex + $helper->module = $this; + $helper->name_controller = $this->name; + $helper->token = Tools::getAdminTokenLite('AdminModules'); + $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name; + + // Language + $helper->default_form_language = $this->context->language->id; + $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0); + + // Title and toolbar + $helper->title = $this->displayName; + $helper->show_toolbar = true; + $helper->toolbar_scroll = true; + $helper->submit_action = 'submitGdprCookieModule'; + + // Load current values + $helper->fields_value['GDPR_COOKIE_ENABLED'] = Configuration::get('GDPR_COOKIE_ENABLED'); + $helper->fields_value['GDPR_COOKIE_MESSAGE'] = Configuration::get('GDPR_COOKIE_MESSAGE'); + $helper->fields_value['GDPR_COOKIE_ACCEPT'] = Configuration::get('GDPR_COOKIE_ACCEPT'); + $helper->fields_value['GDPR_COOKIE_DECLINE'] = Configuration::get('GDPR_COOKIE_DECLINE'); + $helper->fields_value['GDPR_COOKIE_SETTINGS'] = Configuration::get('GDPR_COOKIE_SETTINGS'); + $helper->fields_value['GDPR_COOKIE_MORE_INFO'] = Configuration::get('GDPR_COOKIE_MORE_INFO'); + $helper->fields_value['GDPR_COOKIE_MORE_INFO_URL'] = Configuration::get('GDPR_COOKIE_MORE_INFO_URL'); + + return $helper->generateForm([$form]); + } + + /** + * Add CSS and JS to the header + */ + public function hookDisplayHeader() + { + if (!Configuration::get('GDPR_COOKIE_ENABLED')) { + return; + } + + // Add CSS + $this->context->controller->addCSS($this->_path . 'views/css/gdpr_cookie.css'); + + // Add JS + $this->context->controller->addJS($this->_path . 'views/js/gdpr_cookie.js'); + + // Add JS variables for modal + Media::addJsDef([ + 'gdprCookieMessage' => Configuration::get('GDPR_COOKIE_MESSAGE'), + 'gdprCookieAccept' => Configuration::get('GDPR_COOKIE_ACCEPT'), + 'gdprCookieDecline' => Configuration::get('GDPR_COOKIE_DECLINE'), + 'gdprCookieSettings' => Configuration::get('GDPR_COOKIE_SETTINGS'), + 'gdprCookieMoreInfo' => Configuration::get('GDPR_COOKIE_MORE_INFO'), + 'gdprCookieMoreInfoUrl' => $this->context->link->getCMSLink( + Configuration::get('GDPR_COOKIE_MORE_INFO_URL') + ), + ]); + } + + /** + * Add the cookie modal to the footer + */ + public function hookDisplayFooter() + { + if (!Configuration::get('GDPR_COOKIE_ENABLED')) { + return; + } + + $this->smarty->assign([ + 'gdprCookieMessage' => Configuration::get('GDPR_COOKIE_MESSAGE'), + 'gdprCookieAccept' => Configuration::get('GDPR_COOKIE_ACCEPT'), + 'gdprCookieDecline' => Configuration::get('GDPR_COOKIE_DECLINE'), + 'gdprCookieSettings' => Configuration::get('GDPR_COOKIE_SETTINGS'), + 'gdprCookieMoreInfo' => Configuration::get('GDPR_COOKIE_MORE_INFO'), + 'gdprCookieMoreInfoUrl' => $this->context->link->getCMSLink( + Configuration::get('GDPR_COOKIE_MORE_INFO_URL') + ), + ]); + + return $this->display(__FILE__, 'views/templates/hook/footer.tpl'); + } +} \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..c73768f --- /dev/null +++ b/index.php @@ -0,0 +1,7 @@ +T5a7gS%^R2p%k0@Zb8?KaoO|}Zd#}CrI^ilxG8m|&r~m+9$jM5o0RTMsFFb&Z2)>=W zPuzlUFPtRg)RDoLH}c0Y@H2|Ntd0`^pb!3Mu1ahB3{{$TgX+0De!9B^}U zW4E&X>||zQZ_aM#XpwR#L<#^@fSjbbx_j#Wf}6X#`J%|N7uTBvUZ&i53FP2KuOlj| zKv`AwFJa9GWet}LJ_H6XTKf?Q{|G9n-wPtk9;JyD2Jnpae`HAbdGpX-B`PKFIK=I= zIRMMpo7-zP-0(<$ExQSGN=L-T`TykgJE;re!vGKinZo{?02iD#5Dbre)#ffKDVh8M zC6iQ)$=?j90``$A2-|cJ_D)f<;l&vI=i#CtBWfxc;IGmh(c9nwqg4q;WPV3@f5bLo zKpB3UKA)V1hNgTTWf=olg12YVkDQjp0CIpP)XeBM-LSB*L}&aqC!pm+1Gb%|B_IpO zf!C&uH6bA>xsIj@xMPdej)l0#*TS`4A_Dz@^SKHeI8{p~lfM;!3b(ITM;P;485n`T zCh~^@FT84>C(Fo0vKRLM2q>(Ceuk92K`?F$A&5_CQbEJPiF>UZjn)WbPGXnLEk*!n z{X>AS9={2}K}IzsMCqX#@ec!IZw@}W`F z(40EF2k2HLuvMD-5&ZWYOxiPEeM4cOp;7zu4HyDua-69h4Q^wV;VOuTh7MoR&}55N z!Ed84hmD2wIP8%6|6K0O2n*Y`9sooF`<4=)c!4NHY?c`)gPKxL}b6?3tWWim?AKLl5Nqc8pGoQ%5(Fe2T@9$e- zWecI@BbqvRtNO==aN=zy+Gcxz zq~v2^c0Q?I%zkM9fo4OZr_)>VLj6kA4bg$nKWZ~SMcm+juoZFJH4p>5D;*RvI=|2< z1ANN|{Cjbkpe)bZG3#MrFLabTX3q1Y-&(4-;E!sJZ&27FCd86Ho7Qd|-ZB79>rTF4 zG;=%%D`!d6a1-iFlMUeD;C_Y0pA|X@Cb8#<^LPpmEHp}(@pRNa`NIxLS30CTiWDSt zff&d(OF@DXmT+L1@;%B(p{F<<4$d2~Sm_|DXhbOjbNOVN@ZVAlfr<vCnZXFO+CL3MnMvz92y&aZdFWCA!DK zL8!ZybwTo{NW#t6z!r3; zs>Z=_Y_NP?L}(XxZ^T;f=T~+OddLd|1Zp9E$sMkbqn0%sZaZ`Zk(=4pCxpFlR4&KH zaW2?6aSJ*3s1|hEiN!||&M@eB}LUc2hY7H-D(R<|_f60Uwb?VU}`Nz)i z|JRtEzzM(MNM5z6Y*#!WC{wLT!V%z*DrVmYFBrP*yo&{p2EmD+PSyUlrVd^QuyZwz z+OeJ=dHSO+T@9NM6^%;p6CEN1G?pr03Q*C|po*ab;CFCgaQ}_o@;6hk1-=g(v0e!#yQ#q>FRN_db@XtC(FMT`DoRUkR~Nd}$8Fg!+rP)y zXNPuoO#qg7Bq8jaoMD{5R5Z54G(7}(2?*OZ*DV?f3VDILR2Tl^o2{9L_PdItBxVE5 zxM9?>z0uuGy^)R4Zj);5ME1}!>VKAP!P~Mt+&>?Wk9J|UCB=n*v&S4~ULXaaC*bf& z$xshocazy1*z##6YZzPU2$0)Wif0<>3#HpE;S6@tf}@zpYp$1jOa=r!UnsS&jfE`J z?cDxKbN?j&|PrI>h~X(FARLNQ>*7sY<;PV()`dV>*=>DpVVE0y3*2Tag}Rq zVm_lsMu#BOxs4-g@9mOKwBlPFrXp%-Bu#8`0ucz`*Hnx2Ar+g$%3x5N5ZfqFHrWw& z%c{+m*iqZ&`t>WSu9yPL50K^AJ`vOZ((HRsQ_YEFCZF?J^d2rVd^F68-}%$ff^U$E4p6NWM5?$ zIOC`N;Y9WT*-6aDEtZMdFY?Lat#Kq@B&t?ooQ|fsIE0$Sv5pj6kU43kmyYv{gFYh0 zI51g-@eq^24u?Jsnnx?N78C)?g=Nx@-(G@)bFE!8Sx())Xf>eUMr*dW$InUaR?Bj1 zn@8PshkU&loiP>*)@1R3`JSA_&$+}{y-0|1*tt?C0E$jemp8v-)66mtZ!#LdKS);x z+pRo(F8+{jlNePSJxCotw-XqM{fd)yl=3$-VEKa8otj20M|Co$Wyz_3W|hIhDK#}Z z*s&|=PhLzT+&|UH0x?+$p}^`Q;RgR6i{Ll5CC(`4WKvwUPy&{bDU3|Xt~!g-$@n<| zeRljAYr2^K+(;&0C{@d6t-O9JwKqPp$g7RVTRq9-)$)3YI{I3nO}e2`4tc_gPWv^5 zv79gO6nxWjT~mgM+J>x*O~88qG8YWoSPbCfifUR8TrHz9i~`=LC)oU12_9Trc4g^b zPur=Oww7wiS%EW^s&8^2N)?EfKv`P1csUsVhW#OZ7hY_4nc7m&x_ZnU`*(bv)d%OM zC-J=gOoci)?+^NcbBK!e7W4ZvDoi(j1p)tli~%-gtC7@u-_IDXnsQztesMKrn6LL2 zXER-1h^C8#7@?j1$3P7rtb!PNy<~zQJv&d4_Sm??LP16+HuDiS(PuhQeu72nE`K3u^AHdctJQ2ZJGqe zfb0>~(1po2VN-k9#nVqKv6LzOA$jH-*Sp>*)-MbZ6ZQ7m;67uRUflLmpsOD^o2Xim zv@o&Po2nF+RAyI{~Z^6}y@TT1stK)~rEVhwDp z)wDkIgI5`3meMdpJlC@=z`J?tmVG{>I-#lYpWrk?8jY;1B(64WIAXBbndF@!RUqY* zfI^r?=wi!EH#bNN}sKTjXLs8yE9HYr{Z zaRSPuiwnQL=2wG%QiiPv9I@;WwTE=UXwArA+lAPX(v-10Y#fvinp=N)e>xqg;ZILy z)s3A&4-IzJHRzR26jHT*J7R#LAE&qT|2eY%ze)%H!-I0+mNgrYK^!NF4awBrq1lbJ z`@hLS|6`M;O?*XQU!+l#lq6E;Cughx0oc1*RVypT*G#Gn=;g~~|EFyDKem$pW8VG$ z(M-CE3bb5t( zFdw?s{cZJcr5S&EQpi0F#!@Tyc@96vwh6}#<|eB4i|53&MiRe=2Y{)O64ueZp*8gF=Ao9wtdAOnXxUQnPuC!tDM!ZSq?~ND#9Tqjnu_MB z3lM`F*8C7e5J|K)FJQEqOu({SSgO%L2Z-rdF&(zLpnkWVMQt`LcNUObw;%=>sb+0> zOAH(EMF;N?`-#{BOY^07;@Lkx9WMNMXh-^S*+VOzEFtOpH4cM^RV0Jg~RkSci-a5W(TzeAjJ!8QJng;q=KTYH)9w#Xu=2?X43c z3n5!akHcCbdq~(lG6c9O?YQ^$K0SPUeVP-aqFeGy#aCy^n==JOi@_j%Y<1##OP0}c zhq*cMYvYg89Y)Qk9W`)PYGwxM9ks9?oUZE?8UQhSS2v5-nRHun2yqvlTYOYD=+yV+42!B;l>f81G&07NLZ$G zx#7eUl@LPTtF*BVci2geOr`CHJeW&qMB4$eBB$HGC@`6i9u|sM3%s zDjS6=m7ITKnL!xo`a61rS%8$`VZ*O_m6dvXnwjJ?R%)EkqNtH4&JwEuL%lE#P8%R5 zVmm!m>V6ta%J>8Bw$Q~$P|skmY6)UA;&v)U49?3GW7#_%I+;+E zJ-q^qjswWtax}s`-Ias=k)ij^s7&2i08;Rzlw?3iGF;p+qlh1cvgmncw%#q*DjV^5 zDT(d&uYfLi%G+dS=-lYmY`ICzTe>S8lS<=-M~JMfJgzoL98VKEGVmHgV_l~q`V`fD zR8JOib7M&PmUYJ8VIjrDJ4Ufu?qo={5$6*v!-Z|Y@brE%OvXcpmb>DgI*F{9>yM6I+&qgM*HsxE&k^dQSK)PA08`0nD-JHqc*Uk!oUAn8v z-K~t1i-L^R?~O-<+9Ws#@Q8rgK>ES_Nt+FH^?EeNkn96lZu>Fjd;9J--fbAq;^#F( zrBwPCPz=jx9hR%U-L0Q8l;Q=43!~ZZ$;81mP%X>(=Y|PT`bCZU+_@jDlusj==wE%( zzJTu9}3> zm%HHzXPX}0tZBT+33t_hcas@bb{rOP$V@J;f2b`8*QLc8SAA)Rzkm4s3PD{`GQc0s zzsa;6x@2mZJk%rTK9aL$8N^dpDdSY)YlUmrl2@)Qdi{EAFYtIQcTwW@c6pHRr1$L+ z@=j#fJsA;PyiEOq?fo9*Q`?@OSMOT!y_Y$|$_O9ne^MG43vUBl+$E7H9H>_vL9@SrH)mt2{3xjlfG}Ny`JoHtU^S@If zhN8z6EI>7jp@}OmBeq4Kort1&Pif$nzz11B$#p+4%GB+bu5ac%{i2sd-8(8xHtG__d)20Ez*eG6qb7<7;C>o^ z-D-TlEY8TxdM^6}na?%8LBr#$cSF;eKDiYH4Ssd>GD0OmTstGu?;0-0^QxnF|BHza zZd?N=5R3gBk_U67J=b{za||Q5UY&Q8+{sWWAWhjCU!8~N?ErcxiMo%Hk!N!*nb zmHf>(O8It|4+~s9+X}gSFS*+Rj%WSBhlRE1OSZe4yJYDmK#E~MomqRm(p%YcT)F1e zyt5LQ=I~)yaphqMoXAHP+TrH3iF}k2HW2{lPp5Yc5~s_xdMnO?A(x+dcTX-C-W~71 z7d9EW8AkPE;vrq$(7VmH>+kBgV`pOSc=y4sdj{^I(&El_!OnAOhAE z1d)U*Eqb<-D7``r!o5 z^wmMoQR^+LYs#S68cv)e4?y=4M{{|#*EE1(Z&^HQX9)|$KOMIdRzb&Cy*|NdzC_3+ zu1FNAHMo0NX%~I&-wPR|$oVk&6n}(?1R;tStP#+h%Mf59q3-WuMdpl+sjxqAvm=UC zwmAw#!1?cP=qq7LUmb?P{;X06uCyaIxgDvT_bK8|S!5PEH5^Z*x?Ee$bC!Sm93CMt z?E5g%_ynBqFHx4x)x1-|Hlo9YwE2Nv<;TRr_V2>yZh1TFUB_)yG{;(Gs7%r6uA$M2 zE5wc+_7zKOKR`|9L63%ZwAs$6+HxH6{jX1%a$O-$|LEx^8e>R{2?#be3X4i!0CaTp z?c}(tzvFw~fiyb@5G(q-xVUqDPujS1ce3MF@f&7ma!iy&L`M3?k&S|DdfT{@Z$ORa zezu~(05!EGK2d1Ju|1fRf*-G*NTa3IHPth#b6m3fyiXeRV@CUYd!7gqiqSpO zn}9<~nBR63NE!$SR-C|1LaWFS3<0DFzVG}aHWN;fc@#WGRsRON@SmFsM5D~z8It7&{m{s*@%u+ z3){bShl7diQgvX6_C7!I%dz<6#CrSamDf*wN`?+N>$H~X1Z`1xscZW^C!Ky7X=<(s zx)SBvW|aguJH?k_Kix2--7B7K3Rpo0ua?6*@$>T`wap_G#=gNp1a5==6ezD9hT{bv zT-c=(hrFgFK~M-&mGyIW$!X;IH@5Z4ShkTTPXTA>z;!Kc+OQMN&lBW$!qj8n{C&Gs z^&&y{M48`P;#mw70CyL^^~Ou1iT(xU0v|f166IHS(NxEq>ryDk=S{``a1G#$X|19U z_^vh!%(>-Vqb5Jjwk`h#BcbiYklI?_@szlm&`^+%;(c<%SZs(ZgBBGtVP0gyg^MEchIBXIiWh_FKRSn*5GbTJ`-m?N0lPPIiiXu5FzNnLk@6 zvCD7;jfT;a@nsnlD9I<|j<{n2KsrRs`s`5jiD?~748u`Jy`io0fAu7u!%(GFSLqLj z&!W`|Ho4An@e^|gb!%M?Ad)eB-r^8D03O!f?8VvS#m8^G;Ri__VZke3oHG*B$W83D zh^%zqa$ueHkZ>tLz1*M10?{1e2M(e%<^Vg;tM)Mfh!{{@GygoAd=9GYYLqs%cAU{I z-I+O#S{UWs{y4r>X?n!;h2NVHX&ApfFR;@MF`78wwVy7~-2Q|qaq5B&fV~@8w#TD# z!IWrkdnPa?sgG%Yg9m9v} zNdf@?5ZMGlye^I1p=DK2l^qxHA6I{gtCb@O)Jc8^4625j)#velcU$r6KI@Ow(+z1F zvrg3DyQjvs=A!zWDjvMc@?YVBFMUIM%h})~R0q8U!|@+Wwz| zc+Ebf33%YXg??#|dxxZIR?`7ig@1FqWWl0X`1azRw`sP2kq_B4Sdz|?0*L;=ietUK zLCoRIAG6RBUoKpl%Htg}lL@C*QIDx9GmpB51A2-j+aIalzqSM+<>-|!S}wE*bLrIt zjyi8Z^=f~Setany3~6*T+v_r_G`X-|PZ#$3XGDpQA3P-NX}o)W$Kl(D{{rD=D^d$= zsiFhxkAC1W3xUuHxbv^ZdjnCHxA; z${8D8{Pm5j!U`3~)}N(%YtdMu641qF1kF9N|4I+#zbkb|i={R-TJt8lgQi_N@TT2x z)Ct1Zo$KTD)WY!)Hu&}Q!EVEd_i^*hWduOMwS0pmku^b(YH6` z8RfGvPj|k5#>|m(ruRLRP6eEc2Vak3otEs&X} z9?ZS2Y0_EN{t2Mvm542{N;+8|;h{I=x zlBN7{YoznFv;5TF*!VLtgtL6OkpO%ySx|T~c1G@D@1<4gW3g7( zK8%Or3hT%puJnWVZb|5dm(r^8pXqFA`)kz*dM;ctEJ|_3lG~WEPXGYcoh{k9g~$de z`8h>ZYL1jy3=qvGejEp!PXS4)KH8u6j(hu>uUC^HjK#GqYVV4>M%|sAEx_6`zvnvn z&)rAre7`!FncjUqIM|D+HAO!m)%>MAi0t|GjxQaqF#82)pDv0_|z>=yDX^# zLz)ff&n+t7B5<)8txqi_BCBlFbv|Nb;smNbiJG$<51kuzS3#i1u)b~zuV&gK?;5zq z`J;Jo7A|o8%fTfyiB*+ldA*&XNAPQNFG9j@n2*Y)q1Pc8I!^G_ev8j2q~ zHQryQGyk2L-ZYzR8JACX)ZvwRX~;+ai~YZ~01pmm`7M85ND=h4`c7N=_xk9rcE9S* z_HuH`sOGym8+K^P6a%l^#sOSsf#}G{`#P&cWUk=f>Mc7-AanNTpUsy5LsR8QLCb|v zZx`(r$7Rh8zxNbhzF^8L>6N{1>9w`HP+9>&#T`dFus#B*5-@RR0-eBeXvdq^MeJNes?TTvLE#yUp<~IFi>kPdny=O5iqpWW4BU#cWVij4Vuq4okhbto+k66 zTFh=K_7nAc@=;GrW-&lSz&?aO=4MYuYu5ePr>j2E>_OAw`=z?AsEn<(g!C0^pM7l| zF6dY#H7@q`Fl63sZ0j-FMclx1ezf@P&PRawZpW3M6K>V* z^=;)SMaBo=bfd2>p^g;-d*rniTRBzvwT1`ar3G{UWy_pNp4%ivVOmud`FuF(!_qt6 z+4TY4Eya*1Sox4LK!nZbD3cLNHsezTpg}FnPKMSPOHU7w)W3KOxuywXG`D9uGhuWA z09f-T^0OJMiyfB1^Vd+ ztbpEBquSu)!MyQgv*Q4qRk5(wzdj~Lx_F&9PoX|rumG)^_*f2DM$ZcIw)jH%L(7c1d*PXupju1yc%1`NFb^U3rZ ze~#Uny5ANI`B;1YxrHh*QPh1A!Ue}|B?KasX-c{73dn?_+=g$G(FqduDxaLGF*oto zRFpWCGG2Gr$1`gmeEVFB!Mhzxj`uCf9SuwmqYU(jY2$0gD4Z*!!l zv>4UPJ9_1TR3}KFCtc$7^$boUCbXHo)kXoQ zj~5PCv95tdaHxGnCx7>AW*m96v@{4OO~w$ihBm&I4n+qtBMl`^(=_&AHjZ<{`7X4RdskV%&d0DhihFEs z$2AS6|I1kK0~+((W|o+Y?l9KAap8KnAY=JP%P2t~qUv*u;h&++VMlS;>`}FTDW{sH zeRtJ6g4nx6((pK1e6}*G}!~XHCW}3byDuFzX>5<`Osv_ z6R~r3%bMK>R-D(wvM@d?tFI;}Bo$UiF8Eqbe6HNDN0GI{XRkJTGn?pw2_4j@srOM= zM8Dij4QXc-4s$14dPV?bAf8=*wdu{Jpn3NjGLP(W{ZzNXc7eOs3pxNlQl@`fZwh0gyd zBSC)CJMVTsdHc@Yr=2&$V73J`ztGKwpww=EA6xs_!mHr(Nv6>#<*qza`wx{ei@z?! z-3w)CpKm%Ya1jyAIO7&iBJQ0S3tZTQtPfk(YjZU{!xx97q^PW5W?3%qSn9DBtxRsR zdwMQTmo{%6S(Y+tUv{RTK|Oq6Sl72h(vSnJXx)bY8mKKNmsA0}ktoQ%F*J@!QA zNa`;X0w?xQlhu&5_+guUCw_kD+JVJ-FSV+xHIY{~h}WT=_!rLCa2s0AJRkh$=Wk1r zTT$@DPs8HAZZby?GQBTKTl`SCiDOAnd|!X-=K4*#TIV(^3*`Fw-ScIQrFL-%tR-4C z$L!=`4JHuOvoi!uNoTkic+JX51;6hw-kHn59oyhSbqW_zDW)pEHyG)uzO4?%UDQL!5DqSm-9>7410JBZ6Zqge@~U_GF6af zgW^ebYmmyRn9rqzzRk|5o_fm+M3{VM<`#ev9YIikQNjgjn?Hg{mRUp z`^I9>Vk_C?suzCtLErl5w}j5w;`E!VQm6B1K@7xvh1O5Acz#{hro6kO+}v`GcNfK) z?JwK*7<;&%XB#{<2e+tNJbsHVd0!ANB}eIW1{k65je<(^es{@?HY{%c@UY5}72Skj z4IHmczOoYa72YMVC+Zy)`y}&j$8B;EPo=z@`WtRM<$xzw_=Y zlI1HhI#5Kvb>TN1<=!jv#6C}dBs;&33^6261e!G;TX-@2?;74nT&-j4Jb?IJ?V6_z zg#<3sEO55i>v6AGqeO1XbRZ#QrBAYf)@mAs6jji0}=OQZR1 zV3UUT_M3uHG0N>E*^t2pU$J={sfkKESxjK8a>6^=a+3qA_%dz)-LZEOef zSW?jX97s_i`h)o5PC26+n(}SA*}TzY!r>)wgSn(*E_qRF-ifGl768$ErC<%+Qm3}I z&TD<7{EqYOoblu;C6qMKUN4lfiPkLX7W6mEI6B)&ADtQl$N5B0!@c5Q{7AUF)6aA@ zY~`Ad5terRMkfD2s8O+Utn;N$@YR0q02>)^=9Fz{JL9887(5=tAJt~I!q9OZge4#8 zB;~EW_zSd8>qvnQZ#``F=6`(0x%M<-iYOg}@5}l#=4Y4ufo*MfsSbPTp)xADk~>RY zN=BM5aeSkrueso)^E+$FTlXp2Ed{V4GSlqyw&7}rw#g1vvE@$gomREgf?%(W7msox zOmnECmM~f|3@fSjphCo1ob+4?rM-i8%#b@H@x-fG;|4?$SSbOit9}Z03wNP3i9VT}ddWdqLLUgFMUe zYLii=PC#e$<>AcA1!u3{&9NIsL#oePH+fq!G81XtFTv}Vnj~j)oQ6N9zoAdbwbT!7 zxOOs_1+3*s(4|))1Lki`kF>FW!x)-tRY?38T1+3Oa)|GCV6tn*^bcq6T z)**^XeR=by3KOsfi{Pni$4&dl(sV3<{*6){9YqXw?kLp^)ggh4XX-g^#MQdoyv32# z7Be|xN&Mr1)=);c+PBT`%ir9RvojS3FcN9@7w8`pfKj^>4F3r7w~jAdT*gHG^0n}N%Lht;N?7SuH?o9=EP^iGVp-0y%w!4?fttPx%Ff^L z9S_00?%;r479B|Kl7O5mKEyX>FYp z)aioi0vQLVu*FvF<1t;@CU+b=cTNP@fIjbVicJ=m@;v%8CoyXRef%c!Jt5ySU zAQp_o%rq7lV!E_9Xcf+LR5}(Ybqj4vQ|o98xZBS4C(t)Hh1Cj2e^l#8NKQ_dV)d=v zLm4=B^6aXaiXB#)OULZ^@v~r?e;c`Mbzb-f*r;J!pFVH{ml+~4SKkjWWtYTBGYz~s zY>$XTw7xQ!US6xiX5??nkOk}@;q0rtVo6}1LCWLj`E>mI7dGt;WoCj?F9+gaBIRQN zL|R)bH7jx)yX$O?ZV-2`Gmrhgn!a5N$!-P-H$Wes@JrjW>u>FI5#lNfXZapNp0==dW-f=MdjP^A*v>o^U&WUGT|IRz! z4v+;};8el`^><`qq<=(*p(a5g%h`K^Z^SFa4Q*j5MnOnK8=0B%x7lKPX=ty@h7!DQ zhV48~;oh{!IL-Pr)mN&x_Qb8Gv29gelr)9dgKbcB%QTuon&BJw4T_H&-;wuTca?O4 zN%MFzmeko&@>?d~}sOBtgPiJ%{SGvg1718|c_YenY}h^`T+k_gnIe z!&3)2tFZ3qa;H~qM$Kvqg20Tu{Nq%|z+c8{w|Aq_ zVz&Hp2Y$~1SVR@}{Q=1eq)FZzJ#`S6fZ5;wm1j4Nw%&@-itf z8GD9ErDPBEgh7o#`#
  • W4Je(tjyrXj!u_K1!0{5EaRM=?O`Bi1?h!SmH{x*JN0YXsp6QfO;$Dr zdV^_N9)DfV4>BTa57He4cKZP}NJE*@%Y&A-S0SMzoUh42f*Wjvpp;JB1(At?N{2sd zUZ!(M{lVwZb4!HUb#*h{WMcF|Om=u zIsxUe7FWqTQpB2z#nozYn-3h-KEEm+*_AS2mkU4RZSm5CMz_SnWI3{r}8J0c0> zEPo8^Bjr5nO3xn!$`_|79SBeCq{`?)p%Hifc{goF8SWyqAA_8=dc`>FI)RXkMv#@b ze34gdlyvv=j;+UMZLaL-y1ZtPFkLTM1KFE;euPY1M|iP9BqGy19@K77GU92@ZV=op z_U-JV^2hJH9Sw1B#n z$K%)cr*`1Fsb2xXJ^Zb$B44W&z-9}^agUWJ%>oQcPtjDCFlN4d6W%;h8NM|{q0*OO zw;dtEM#f?w-AvB!M6tz^n^8PMEAXOpZJn}=KrQAVP|LLZV#st>EQgPDgGX!94<7_m zu@{JKXj>IAdyDA93lseo@7k^@22Y@JK8frQz<3O#pCPodaa50waCxw~@}wfd5L*Fe zA1w?(@e9jlYno0M8PNECc89``;3d(k8Y=-nqxriDpn~$b=A2fixrX%aTY$~+=7ji& zmCs)J7R{e!M`bIgrGa8jL0FJaV<~`rJk+I4)Q%FciER*(CU;>^WsUV^HoNLt?I_ihwqM2fx5$NB zhg7;PEsT8X2Ut(V1Ss;#GGM@F;t8TyxSa)_o9xDVe!MMgFC zLB-_}-`c2Zn$II*g96EgZWBiq(P9cOzKMvpudlQOo$qzOcGS+VEN7)Yj z@@Xm23wn$Cs35pDvvWj<;nSlR?6N?#-MC@Z7VDM2GTb>L)gimp>s4_vW~x`fbqA~j zyfxu>b1SuvrIjE}?F)0npZ{~Vg3D1F_meopLHL)M#PDWCaL>~BylSvblWCTq-PB@C zwrMAv?=0|S_P=>hKX)Wz=S95_t0+TnRu}9E=B+)oEJbl|340+N z*Pz>Ee6_IK4PW2pklMqR8rl%W;Tk$@B`=6VBaT7`3`ZF`aqtcsvFeUQe$+JJrAZ9n zC6&p6k0QZ{b-p(M)SNIuO$+=86n5%HLcjzg0Y_+XX14xZpZVuf2#(;=V=YKmXM-Ex zDnzaP4LlP@`!>%EOt;!z%jnPc`h1xoZj*K{m8FG8WYPuFgLS{P&_4dv6XN63F0Bn$C!>qf()mEPL=zJOK zOR6cv06_g#w#6r0#G3cwpnxqykfRrGom^ex6CPR9z6;kPpzq;8s@e?NO|nAgw)p6m z?v7LXx);rWG)RTQCwM~r=P}3!S=zHwX;K*(yTb#y*1xM~4OoXx9{Nvi`WqI2;v<kts9^VVq{5neT^IdL+h^FmE zT$UsesMi32vfq_}8r|Uwk>Yorz%q?kd?cJ0Jq_y^(MJL;`K2qx^_X9OrDSaz>1A&J z=_eNzB|W;b=g0XS3{f4K0V?6rW95a3F2^WwqSmj?KChJ*6jPg>JRT)#=OF)F3V1`r&fnUM=i2eH)lRKUkDHeHysnZrQYTK1rOHJ_ea?oXjGEvAKxy@ni&FB{ z!Oc9x6w{pfcN_&^YU=R`@xSiZcP4VzV}M;X)ABoZ`1%j~-UBScnUAdqg=H>sB1mF( z9BsJ&(kSV$K&;dA6TXM32wxi|&X0IXhtt(j2O-s8NxPQ;p>%-d1EE7pgD-E^0uI+%y@4&Sg^E^w_6ujtf#GX~PiPg&&Q)Ss^WOf@4svB5>ZNEr-^j*$^JOwYZvh+qa!*ZIE7 zfwQF?L456fR$Suy$yOwW@egLR8mX(cR(cdrVY4QUzBec3=oMcg;Q#XCz6KNMh9ifI zMObF^X9F-j@~gkD;rmDAzOiAhFCBC1!@J1_6|~esGgQSfg2`lHtizKR>g zH=75q|2@L{t`&%mz!N_%J!!ySgV(CVMi=^K2dL9E>u~qlU}cyCR1M^R#6x9dB2$!? z(zJpaeT9Pf{Mi0ZP%5p}Yt(yRfA9&0b4M2AWmhDUeQGOz1>Tm`q|$A1-x+~s>Q;c5 zWb&IVEry0qf6?~Jhc>!aOB_?#uFf=0)=@kGH#mOuWno~h zs2ZBUfK;yhG7LN6StrCk2Ja3Kx#Ggm#IAdlK?l#Cw2qr?s9C>6s>k%-j)>3cJRZ1C z2enMjzZn5aIBf(fxsTo8@5b}rA@$n0rS%YjzWekO)`$RxTeTgoFm?-Ue_@~uZ;~2h zTdJ*I3j_N?h5*s<3xG(>7${ z!t;nEmNP3Y?OaR<;Wt$Int)&q2JlYZJ^%g<=?d|f9u?YnvyM@op}0zoIB_Vt8TMR zxLmqFO1LwYZ`BMert#BMR}GSSTUF_NCATlE5hiHyVB3Z^W;v4W!1J|M;U6fZ`)JTw z930O~X6xsLLNpxzS`TR%5!g^8exk zqyHOhmtIE!CI@B%)X}7BqzYWzAv7?s66ju>4gaXKJNNrV-`u=xnChEAiJv`yezr=_xEW zuzDW=9u)6TShD>K!w78_JZ$4-y1q&a!e%&=7Eu=bt`(7DXynhF68bJq06(txJx&q~ zpPCZ|Io$e1kibNa86qZ*Lqc{$%toat-`uAZB;qy(yv{S2AG*8)h}M%_NIdOCkpUx`m)@74D3 z+&ExZJp6hcq+v)ozWi7RDxS_g@U^C>1X;E1HF9}fL-E{Nq4;2jh)J_^6ov~soig>l zE8rBla2q>7q`3Q1BSZ1nj-x8O$BP|q(?BEJAG0Ec{gH<{+gwJndOvJ#j3#k^F|24m zDE$ZXwJ6XEKjS|5OEN}rk#oHvE`GiNJRLlHlr+!K8!BL6D|EVJEd@&U)0kPi4UX7C zCJ$8_5}$5B9n6gTdg_SCMf;~}QeL>`BVW?!`K$F#Q85x4Gi=dq#9XBoN@}Y?DYtS6 z2N4k_Mgudrf4g&yd>ynjbkHY{X@`KxSkmT3XClpmw|UMaPfp8(Yv~m2VG`Qs{FANILhtK+D5sx2hd~u!#ixLgX zWuCI$(L4@kx;;~|BlIA^Gv5wdl!0Y=}eB46uhB7IPl7d9u&liV~VxS0!C}vSlay)u&(>ZHI-9nNZl)i`-#w9%U!yUMqGq_%99~&bYz0 zxXlrK-Kqx+40ybje~~Ree#tg$3K|Cjw$Ezr;?j)rok_IR!MFt;Eg>M8w{}||L@+gc zkfF=X+#AHAnZaet6-7mld+9~(JA#p&AN~vOx0QxZ_T&b@il5+Y1LgNU4GWt-<=VpyTvK#Qy-JTc^cns zcU9`;*8t7ytJfg&b@(+rfez|YzYsADjd$~DJPBi-^5r+M^=|OY(CRL!nl!!q1*y72 zi4KAnsh##mc*F#UIB#vptP-=T8Oqyk<%NQld89K`fOK1B+ZRj(wV6S~?<%j6R zDEKV{u{k{QLAIr0(*|djQMa&*fC znmVr2H=#p>Yd!V2vk&JAX#ac`Ok=SxyZ`KTLu)e!Hvc9!DjbhzaanaoJ!*lSG0mg5 zL8@uv=I3gnE=ok7%9E}RjB-XZ2Yd94QSlnmBH{I&lYJ{TGD0q3asmsIa6d4Yqn94v zwZI)i))?M@pY%N}H*Fz^x6^xlR%rCxF#ES`7lg-tcih@zI<^{@9(_Ev{J(0u%D*U^ zufKG+beFVrgLIcjceiwRcS}ekBGM%--5@C;wXk$|=ki?MzrW#m!G3r%*UX$b@jWqT z;E5V9*AT0O_w(T@Gf&@B`->{uw}i$J1ec*90GG%w!kt63p#(GS>@P?_Hr{l*)peTm zyUCBAw>`vfTsXf%Rswi*w4V%wrOiIBjMdQp0xqZ&-D?yI=vn-(ZtDVEv$vIjF48V0y50zkTCy0}G6vuVyo1v;AD=7uk03XXa#feb&n6(f5}vgX{Iko1UH95*utnJ#QeoPW&yex33!{ zATigcM*n)#HIdPiJtu((BsmZ1m{>}4Xj$X$sGs)j+qW&A36d!TEf3xvNqteXTAzpC ztAB_poAwz!skK@`tNo=_+JCV}M#U;%=zQpg2V#H+o=Er;}OyS0ACJDud+E z%H3Gkv;t*D(g8EH7dJd59i8YK36tSc#-ImfL<3q^`s|=3&`iSxDANoozUv9K{hS(_ zwzTwlS!Zs}eC-EqtHTF_-i%as0hTRU;bQIZg3+0~hEh3_R5CMh)wV|bTbp>6KPBaR zust)YKM8b-6q2dKm@mjm`$O|YNnPz%^abn%R=w$E47B@+@RIjy;IKaf-nU>dc3w)@ zdc>Q#Z3SaeJdCesArqid&~ub*ac_G2S?c`oG4IpHn_yo02fzqj8{E#&B>rr!%8-%W8W^Dtuch;ga&3a^uY23GY| zw;VQhYrlt>1J|^~xE_*(E!hx7bUsGX3;T+Ni2eMl_)66PuOw!(`HivR`b*+G*WIqk z1e9B*?ysVl168?-PUw7$j-C&uL3d7U1B~Fg)}*#dyd}{jdImb7Y0pwb`7%(+@W}uY&F794fX=eGhEi zMBV1!ZpY9Kjk%@3*KIiyD;9z14y~(JsYWbyTR# zZYSSDkeOxRQ`dxxqNh=?^=(lOGOoSc4xi+LE@VpRxcya)3isOXDlBXDb_*>39xwSj zzVF8e<-lr!bn}|k)niV7*LrUEiC%nguw@IOzwr3EBhvi!W4JI@tC&ot){%?omnWb1 zZDJ~1$r?DTVSPl_ecB3M%x-5yx2y3y?U=A;OP*oiRAAl4a!v(71p z09gs*=7JKbFxJ@acG^#tU=z4cZIdsuZ7_O z!$5C=okSQR{#!Yt41TwE$ER57x*L>jydo5Fgbyp^=E>@T=i#9@ty(O<_YdkO z3WWY*4<{P1hL;}x9r)N#rNzLoBzCooHS$+$&mz+^+!SmN@xL!FF~0HHD^B(uEYq|* zUroA7;G!A&+XN(Bj(yq4B-<3D)v#t_Q(Lxc49dDZe69F+T5CA6Wyd^LwBY7%MF$@nwy>#-6rvAf(8yWa zom3(=E@uyj-+N(p@Zf%p3WDRHBD&ODe2Wj3j8Ku@*B2K_)p>{mtR*ha0L@qZ{^nrm z;h~^&*NwHXdpqWeHbO>R!Mn*QNsW&%R75H=OqQyiVmKP|=ESvAU-87bK?Evq)69mB z1v||5Z+gBMOnz{uLc6f9%}j||f-Y7z`R(!tgM2#GSavxnwFisgfYuwGTR*045yb^^ ze&Sk`p7Y~$Pkn_0m}QWZH%R1+97adus{ZlbQQ=cvqW?DoZsV1_ z0>!Z{cyXL9nz#~F`zMyHL&;M)`-Y(_ZpN3V?wFm=@^n6DX=)d{Szmkx_3DmbA7y#O zzlt0DjM)g__zs83@csNSl$|aW`QBDHy?&NMNxz9?Fq7>q;ga?nJgv~8QSwI-XBYHsvrZz2YgwZLJ(3ir zK=aX7&ju+BxUtgr<{LCIzCpHA;K{yQ_aF1<;VxH0+&CRA2&mK}vnYiL+kxQn`OR6- z$mHtMrZW_@zS=>(S1;6rs-?$t{F#%B8B`@L-R|WRG)}bU+O_D0xFn+nK~h!D1-Rx} z$FFZ?X>zgrc|!Hw;OB*>o(aGE93TjQ7_J7qwn9tA2IBGwmf`#QiDr7M5Mgdf)Y0 z^Wcg^WMys$sKxA-wP4Dkjc1k@1pjxNemPc}y?<*|q}V?Ncym0jqC-|EN41k6kke?W zqe`&Dw}Y9jp-`1+&4t&xANr?7P#4FMBNyU^nKGe2{I&o>=R9g&@4V{M1L5y z7%O4=>KLM3rg3*lB7oQL@Q;497YzxKh+E*rx=V;ypihBO5@d zqOysTkU^z#xrX}i)_)b16sMbfxwkE?E|Pd1bl<$aO*Bo(sJr%~I@Lz>%4?6$V!89> z@3UL&L6a)(<6!)mstzeaD{B2l!h*@LK844xUbF4}&4evmGXaO3bgSBCrDqC0uG9p} zxc83CpPDD;FtV-&(EOU-Irj8UWQ!pk?a#sfo)rw?OTK?fy2k&KRyz%^_?DnB?!|s*fjbNyA^-Hp zT-tk}c6o{=$+%PsdO(y;4~ekZvne{~DQtSf182JPw(}m=%V~K)I4L(AR@erEKbE0A z+NkwQ_!NJ>qr(U{&sx1{Y2yq`RN-DW6TkHsgYwgd225rh8_I zsn_1wl5QrdCcaFMEbyqRJ@LEez)agU{aY9lVN%iO4T8pyTNMsB-foNj2|Zs`YVDgs z6pUiMcc3~n^hkr1Nkm_^9&f}DR1k}fp=LxuHEl{p!KAQu1IYW6k2l9LJ{My4g+|HD zdOVv=-GwF%dS?*(+%SSz*9;n4Se1pEzg-5ZUnhlXGoN)6!GIxZNZ3Y+4)%u^sUo9pDPmYAD?8|*3HAbe$9qm{lbG_NV$NB+ipfP`C>YL5Y!#MiN zg>xr7bPzu`Du?HenXM;SP0wP($qOecsGXd26Fv9}Ddc;ec|u+{oki3zsNydG42DX5mENPugW5s{OfQ zq&46=+uM3ou>5eIr>nBLtLv#Mf$StC)_)1OEpAluXY)#>l+%5}wU|(PKx9?SpGct; zGi;0Q1W(YXy=Y4ldKAnWD*aBTR&7X%&f28+up(n*xt-#-2sFMrQXByU0}2p03$`UE z9;N&HW47ho0KH|l`CcGBB}^x1E%_(2*V)zmvfnM{j~W5krl>g3NAF0xJLuW&RDtx{ z!JbGB(=A(KG;KZP(>YjmXG|QrX4PWZ+oI~}^41nR0#tkuJcuf7w9ezi#KpzK68G#W zf3JS)+30QkA}(?_1IfgVWLuz|+Ef_V_T za1!BT9Vfp*NTLvp3{Y?lG_=F|#=yxIguwT=or^X$bg!S7*Nk98b42gB7xH>~S?-7} zZ!Keq5we~Q5){^+9ZtG@uuPmq9gcZoh)24;;dZdx;A6=z%$=n>77bDscU9>KiXh%; zzTU_Id7m8!ziQ-89@7ETdH51KC6>&@ZNn8?GJn9~xPwF1{tir&HN%X*rXLjJtwAYu z|FX|}{L5u((GDB$OTLd@N-LY(jWj@RG~AVsjCm)Vo5^}%Z(xKHN$~F;nm$=4qJl0d zDFZL)f88AP(`Cw5_NVVeyWS>o#G6{b;>R~Wf0Qss+eo`{l@B(3|DgYKQ*qXx0Sz>m zeQYzKpL7`ezOWNk2~ts{Ug2Wl&+4UO6d{Hf5CbU;q|7yWAhF5(B&Vmk>h*E4O&CoZ zUUTOh;xvH^kV%XV7bVD`g#s$^iA0Zao<#Y1hw2^JLb%%Z-k$l^NYR=^!*)jz|NW|I zhY{}gq21Y*i>K5|0NRN0Fw-|+28&M^zt)^}n&R`nHa76r`K_}Kj2nl3r@dhORhans zTEsF>ZD5IhrT(z(&NXPsY5!=te`s=*xEPufo3-g@!OvF?Q;hf10HwQK;=if^X%+3c?)N2(^so2W<%D|<;C3l{aU=~98+%Y>Nqnw zA$|sQ6HdI;T8z5;+~Ap1pJSgbq;zZ1E~RhUCB5a5xvoB^%yT6YF@2*HQkmo8rR7sn zbY||AJWcr^VD4dia^l#M;2NtLI^?o8JGI9hDohiV4f3Pf#oQ65n)SlD?#0moWVck> zzF`8hQ$ClLG}O!Xt0(e3l}kj+18uUdxHi(Qgc+)echU(#fBOngLO55T(LH59lsB_~ zf=QVc?|Rv%D~_5m_a8I2TALqyR>R_@V{$~`X@hL86vgQ>&y#v_$q}Us%3kZtvYuW7 z0v^}el{d?I^gBAAId;3jaN#sI@8J-+U$n(}CMOw4J+numM_;bZQvCN?Zv2)u=NKxl+#w5#6*A7H#%zoXTI z8&xq%h(VW{&f{633#F=71Zu_e8=YcFu1*>4cjmaLzgu5G@5i;@4jrYQ>I(maF?QHX z8cJ?`fD4J241;c{WHPatZOTzPi`O``tdPQe1t43f`( zcJ7tDCKXE86RB2B25iw#$3*GTDwU0tAPbn$awBvYaA*vGgon0)S%Z?b1 z36y?i<%OjZVVAugL1WI=wGkGyHs>vTmQRAo_^|k(?~}*JC-qKe?;AhOM%jVGbxtjg z`$T;{JYL(q;PKz{;=859Us#!lwJu(oBwYD@NBYI*vW_n`@>b#Rv8pz;Y(O{O!YoBM zGgx!!T;P54&z?)PkakW&7wZGeHCIb7Fa@Z!!>x?I$zs+%A0Hrbr$BqF=~iesvh&{r zJMh@u6~}h2qrA`W*_YVd=VqKP{GC`TLcX&NX^^$&RaAVKKWA#XMgka@CA*n7MU*h@ z{MlPLMZL#KtdshJ38ct%No;NIcj@$Fy{8It*qC@`*O7zhPBOgb&+7RVHY7{XTTSg# zl3+ws;$n^I6jM!4yx8f`kVXr|6R#QzcER_eO0ub_i(v0p4&iK~t(De`IM)p)zT!_+ zx!R@ufLpho4@u6Fao8WOcU^}Pv#IXg`HiP*i7@uoFrgiFZoaC2M-`OxZ`tB$rb~Rf z%d!T=$edqX^=C>&XM3VmmCV>)T$t2nH9)t6lcp!w%B9uYKD!?i>i?1qq3z}@i{&QU z1_!5~?!Mt19}*H}tnO=-@xOTb<1nNe$sbvawpTxB*M`o`NuFcR>!oI-x#!iTHtY55 z{y|_NxH?j{TvD)52gCy>&MG7B!qH4A8uc{_BYW65mm!72JZtyVs(s zZ5*_JUoAaB2Ko_I`T9IJ4zYVWK_krDUDYEw<-9@x4KHLvuZ@IlupW^-1pYeglNL%1 z6ykd3f)F&2K=&tpT<=0_+_ANO;&1}BXz9snB;z2OJ92t1Lhnh7NJ#|H#>4`IQaGtl zJpS(|tVxjlBz9KYuE3gc5b~XSTdm8jYn8z;drb#z+SI zc0S2x2}P!H({Y`4f+)bvdHM8A47Horo7KwZfV)Q2cuy|y=wi~4799U{r>%+rs@J42 zHeU4GW?Yt)LBW0P*?GFRGZERla6)f>5si%|zk~hyEeAE^*UZ7q{nY>l`hzv8)Aw8m zLH945-nEJFt9@|p?)=@lE9z&i`m>jkX$McW*UeI#*y+3A+Ft%JNZ*bK1vg+pu;X_D z^f$p7JzcFvDY2P*8D5Yn=aw0$N-7M1-t*1mc24gtCe7>%=GR{?*Qo0vd{4iPqOysi zf3}jfujz*za`72h3M-REyoD3Kh%3@^Nb%o#zjwh`(A81H4rn%H4a}q@-4<_3W4{|M zi_%Lhdd2Fm7nGWA$<8{%a0*o!ip7I{qJ*61N7XTEzd5~x5I45_fpbgXKRf*_lt|EC z%5L3U!rAC8?2&UTawg!*|Ix=0=th2jJ{ig@gptC*0Dv*mK}C3e^j`kLAlOb6kzWuN zOYh0YV#`doQ4I*rVj>qWs84ltXsY_-*l!h`Q6pTmwewz-#=VM!cT&@Yt;+$iJgH|7{A!%{5(>ZCQ^0mL`zN) z%-d+K3u07aNohTL^HI%6&ea~13b&VS01M++qx7sqK2?K-`^ZGeJd%s!Ea%($V{jhF zb;})56w&Oa{& zGVIAWx!bxc(QkRGJ9~#TYc$P9p=0-3i=JgXeO=8s@q^O`M64WmfU6LirbZRV-PY-@ zD&&V!J$!BTS!wfhRscF*__}1Q>mf#}Ah!t^Qtj*PCuWkHjlX)e+KOPUfk{XYi!58L zVO*$~N_ZOO-C#Oa<-1Dhp}}Eq#z2xt_LV5Rs%a7sP3wM*k?X#>$g;=2>6}P2m@!Ir z80t9?RVh>U*DZO4HD!XG$^FNl!#b!Xjo;L2j8!x)eD}j0B_Fzm_2iptl7Kb@SCjez z*A0R+1R!mA+zZ^J4>WfUt?1)A4%%ZdTnWg#@J(Lf)~ z@xE?dWH(+p^so|U0yIP1pd^YhVld}~Ch{j_N_l0IfJp8Tf|9=TbA+n zCyd7fFc#3()BdNj<9fkART(5NsWTKWM)@I|cWee5>$c0>>@}f9dBcZ1`rijG9OCo5 zZV@*LKGm!c9^D9BJ}`rmRm$!>)9LXSA8sYBS)eN_`_a4ozc^#HSPt&-CoSmtn(JKm z*1!t#fDneKt}L!UnFI~?Wpww;_U`7J1y=vk3^8~BPvQAwDOL{K$o(vua|yP$J3PZA z^xq0#Pf#eHH=8{$*yr}9eGg^%OT}>K>*H%S+e@UJEr>^xdf?pUap3@}Pk%C4-nRJS zYxFwMa&*{qr(HX{)iZ8#)Z}MU`p10gdXV=BmB@CH4b}(}7^+aE4~SejL#-Qy^AVw@ z#z8I>GbpAvv48`{e^ZrHOr`D}kC5p5xKT+(oNgl+l6(rtz(rgp4G2U@^zV&;U7A!I z&I?1*+damtp8yd4OV*wA-kpE5xT#*Ae>$}@-|xC-<6dbW+)ye}GaRPN9O)pAym!G= zk1}o7red&X+?|ZnGJ7Pds;3{iszE4Wq}NgyzhzP_^VpVq(=}NP2xsx@a|_kyy3T5= zAxP-Y^d}mVcJb3!N>l*Gn7^rBZXQfk`jR-q{#Cbpu(6X^ps?5RcRldG{}Z<>Yc^y; zi4OL$W$XQfgX&Mzv5SdY_xKyYSU}D=uQ|;2Yj%iubT4!NK8%Y4lUmyLrRR zfTVgoB9_(%V6OSPFpzUL=!kgUQklKr(0vli62MyRBlau|^PF0JI#P6KIPwwvO+SP+qS;_(4T!aW2o-6hxe-7%o>*4X5OE&E> zU%lt^bK$=hec?V6_@P*f^bS1M+n6CYy)}!W8^j1xqSbe6;iGHoBXFB1lxWvrEy2n+ zW#VaU#?}K=_BXK&3no@F?|O^R=ZEjPnhmZELw$D#R|GC5Ogd`Rl~^-O*Ta}xP%K{y zjEXfkZo3-thFLnEshap#9lIJaQixW+;?PdN6C%+trbyNpUOa}WLF=Sg3@&{WeVS3E zks|6BCGah>Ws@@SWvs%p)kHH+fEl^9W0KO&8`Orz@78S#R>VDMHmJvIZVoR-UFV_48~g$%Z&cZvmNp z+sjS`GQcDs`dt`2wBT-C{0;0Pw{7p?H}E5!mak+thbtC2$&Hg)Q^Rib!FaK!ga;;C&T+o@=I)HAAu;`>mh#@I;(eFGqU82KYY-oZE5LbW@Bvehn?>$iT zG7x%0vbPlR+U41)9UXYaKDa+o`1;~uY@{8V@62xMW$Ajv8TiLO-Q`HA##s>XRs#En z61Z@pd?({^;^_$DIbD}|^13`pU!pO%^(pMDDI&G>d!3*l4hNsc@^|Pp4a^ycay2EJ zFZ09G8~tLOjyq;~t*K7wx!t;~L#+yFF4vd%@xK6n#Cf)P{e|Rf!AUDzan4`=zw7Gh zCHRYi4|0I3^L62{E_k<=QF(HgoDdWy#3y&B$Icmh!x%ZLH}Y%z#gx7+m*Epw+5O3c zEeD3`?eOpvR%NqO|1Hq7$7aYwWW>UqF{Ye|06%Hu!`1O@0T2djHOLn5Gp9MO=u^IbcYE*grrSaRquj8(Z%J4$MrnLtbO61$V>XzKP)8?#-K3r=fSf$Jt4XN>h%64G_R+CVjwY&tNxGuDTL5)P1e)2mmXHecW znrgEffM?|WL|w#ciBOn)TLZ+fzNERk3RfcQS3GIUr|L#PuONMo>h9`!nPUgPs$%KPub+ar3`tS_TUGlW z`#Wx-D~||Lho+Ch0RXpKQ-3oOJ{AaqZRc|y>cFz0q2--lWSU>e!y(7Pw|SeJFV4#<>Y? z&f`EBz`>7!ch;RlOnJwg`=xe^9DWpYT0^g&JYLV~d5#IF_j!5d?G2&aQ99^*KOBjy zXjuUZv4kBfO~hsYrhuFWx%>GXE_3{q!m6ZXNVRgZYb6NN!NR!@G64gmYtG%PA0Qxa zx%)Puo(XlB$b{GA@2a(Ob|t7-iY%#Gnn}msP=TmEZ9^T|lFUwPp+Q)lIbUTRMu}df z_Wk`>?X-6f2v|1{3=X*aU|8bnAUMnOT%yqqKp5 zzp)q2sTHB=&q|nNMM6H zL|(dUnUYZFeOFs@%JWK8@f}zPzB@^~MB=$3u)|z{*AXK%Bpy%i8z2*GI^N#n&_jm~ z&OpSV$6L}W=#36zWrV1Tsx6Qqrq7sXEa!oGRB|FjN0=^0H=Os4u}i(>pWwwCT8A)` zv?QOdi@bNWA^XOF6D-#P4+&54S2`kgj%xL3eX;KAQ?TJ21{&(!PK&gobn_7Xfy zxUWW!n>}$YCLRciK{!9Z?CYQm8fa_3;{dc+!x_|iqA!PUaH?`){knSPU;bqE`E{_{ z3Tfoii9qr~1+T!>6(5jOHph7k6w^z|Y)__b(J=)?uFey$E5Amzyzc?xbrH8QU58?+ zT9d$qO92>6^ZWaUjrhoT7eQVO%HRw7j(~CZ+D=}3Qv68#Tt3>{Wlx|%%=$lA_F}y-#dheYo2irKOnllsdKW2-~YE8=FQr!=O*1t zBThVh+8C$(vk#eCYaClNrp10dyQCBCa~hg27p0h3$LoPjOm|_}4$!DiYHxB#b+l^a zglv7KioBL+N$2#!esZ?VnU03xdMl$pjfWgeoLYNJ$O`Swe|E(?b4=R3y~g?gBVH9E zPbays)_Jk=>!!6JKm4H^8f9Ir+^tdy&}U~Ks0PS%21nedYX)$5zv~E8DP{;0M2$V| zZ^v*t_C6}wsJHk&*3SM_Lg!XYF37QO+I!7meCxfcSDz?&*&mSc$Wr#>a1zenBmZPZ zdvIwG0jPHBt7k!3#P`Q#?|yg-77F@c4^ARM1VwVU%Y=T6Bnu}{3D0le(BC)KcLxbBw6euiSsmdaxA%OIB_<{Schous56;@{KdMAtL`OH6ZACQsyRGRq7*t#a%gIlG*misp3$!BLLq$IB+F zJh6JX+ia~zglIpn2|LV_42qz?{Ymjp@MBh;=sg$&H%q@C zH!Ot0*uzVYh|P6Xo&tvgqT&@K=4|(-wLYWBi%pEww-PkEy?430mfoWf1(ck)2)8Y^ zq2YwhSpz-F!5rZd|5lNrcfs34ymwXk`@npyhUp^r3C_)s>Eyx=joFKtrE$juOO!lol$?h%KyV}=ZZnq} zUQFwEcND$$VqcK1IX~a(c0n^aI7m$mrKvG#3!B@v+*dxn2S2*Gcu0@&IZjs?2{+o$ z5~v&fqN#EENc0LpozI*e9ga z6;~%&&J%4dQwm_QSQMtDz+n>|TLS#a5#afbg=Ro(#50p=fEWgKGuMV}q z^71`55iG61TRtB@e@@9C4J^v|@TR#L83RiW0Ns*({eQmexi@}VA)q!hn@br^h@r=g zxFL#(AP+u|OCt^@{l|s-Ezzz?MJ}#AF=Frgnqwiw>rO*>-FzGsOo;3SnB{#gCk0LR z7`I(5Zw?iMxV>>n4O(TqtkN?s{;f&s78BDJQjWLmeR!Q5Y+S8LL(hc5q@W%60$=w2q0=i)8Y?bU9Wa+!Os`nx}HMh zaj2*tjI|N1wD8jv>3=IJ6=_$h>wml~to3&Bc=lK8Ol#miCMVz6JVdo2Bs}!7jm){G zi0W(fpRQ>(D+0k^w6?~=#X_Wqba(aZ|!uDLSqKZeLT;cr+LvNzYzvTV4G8i zt$0U=BfT;lr?*xLbmu`PVKso@R-Mh`R2l328LNI^o3wQQ&}y!P_K#3NzL4v&Y3kwG zfYg0z7DNyRjc>OX<&+x^`cO}{?=^ESk_ z%!tFQ&{xJrx_ zsPxS$j}(LDo(?k4JO!(d*@5j41_0h;OS0--?HPwuH;|_35(Yz}@5L}VVh3|niw6r1 z#Hi1#QPX^q5_9^QI`GqUf5iQ_d()4k28~4LxM|g)AQv~NA9&3_N`Y1TT1XT#pb@>i zw1zvD!P_-j=MF~MJR7LXL8cz)YrE$a-=YZ58khkXOzemsycV3KAhLGtN0xtw)bLH3 zHLd?H8wYy~-CI7j{y&;&Q`I>V-nSh0&}AA|_5)ES-k@TtP71kh-G0m3V74=ga4PSH zBrh-!vXP9*u$}Q2$P4`UeY?g*;TIb^%I-co}GzgY{) zi~sGrDngf8rm}a7y2afRSFQ4|=~=>{d~Ew~I^%p`6!gZV^>TsQn))QXf1SckuR5qO z>c7p?pvn<85<{8k64qQDD&`k&ZY9BqZ9Q~rv;QpU<0pK8Ys?5VPIplX*QD5X)4P8G zfDxE20SN2qW0Ikz#!Rq@|C`NU$;HBeHO(ivc;OJ6+Xew}QYTq|%uT{TU*x1%Tg(V% z4gW`n5$;CfJ|ZX2SqIOU2TS@{yN77IbmrrnW@G?vamF)cj&3Zx%E*)FWexH${Er%_ zNykY&eECZVb4RYnV`4Z@t3p2mD*{Qv;5<8nS5WiQWfB^$+z&>nXeckKO9u zc1ClpQ0THili?O$Ce@}HwK^>D0l$B1ksYvhu@ct2Km?(~A2TY@h1QyL0_Q)$nU}VG z97p!ycJj~lpras_ost3&*dCFcjkD=$S=+eZ(*kypYoVEorH5>o;QuI}Cr>9E4`Z>u zR);d%`p`047j(Th(w(7wR?pu&Z2t89q3m6yWsZh!3luqKe}v~p+kYfP2E14r#BOxL z*C^$!%sm1#U|BA&(&VIwz zV3FQjl8%d5AIl#c^NDgT7D&ReovLxn zeSC{#0c|I&P-O&uGpFz{AG{zb{7kDhYXTcmJih8znd6*b{YnBT2)i;(}11SAnrl5f*oNh%lY)Qx+fflcMON+mHw zk6f_&-dtYHYIK?Mf6RM`nokl{G58}pCI$I_EqJBDVb3Wjav+}OJA`XISL<9KZ1OOcHqzHGVi&aO2MAjBT z$A+TQX5*SZQGDFz88WuhMGX2FBxoqZk$Jm{*=fDrNImt--T%?E2>?j8gya*x0qTCZ zitaPS)|Nrv-4JM^y3FgOyy&<{rO^Y4%~lb6-VoBFRx@s(L$Ku>UjLc27_Fl}cf`h9 zX;T!|>9G&Eu>;6Qd>}TYq)1IC+C@(?kpOJoQ*s|(d+J4AWj#+bir;5fey=8&>mDbN z|F&vB)qRaSV1C+-dUduct>E=C)!rigUPYhQ9_+DOiUJ$r+~Bp(VNG(p+L1NPM~JYO ze1%a@F0OR~ae>Y`H2wX95RYxX1REBPvsz7>jO+(aSVHfNq`)yW@v12R1~NYzc$wm= z(WDjob`$>j_G&9{>Gqa$Lfy&_m-*xAIYz_oM)!sx=*_l)9Q!B9m>p6u|{PIVSAx-7P`nalyY4i z^sl&2B??z@0Tf-Ipa9m$MP5hQ%X**xR5Y$=xg;F0YAJn~@ihZG*d%;6*Ju^^F zcfl3+?xMh`0{$E~B)Ac4+YmIe?S}3b1P}QR7+X4EHr&b}J=8?~3Bf3Rz1YuHn)f_* zwEGidWP(2TJ+;1cjTQFkJ2r5BFJe$br@fduC%Eb3rPL1szmN-(1>b-&vYAFie{P9E zSTHj|i;ri)jIcdSKa11woOX95oM^$BSdz$`-!r^{N@H}>6MQxw}cK(P=YdH7q832)(t@*amfIYAvM2n9TpW}$@odC zsws+A02zKoL{SO8SQR;sQvsutv!hy5xdh_i&$B3`=zWj>^C1IdCuyg$UE zFViDhpQLxwvZ8nU$@M3Ak>m6LM=}P*4hV(7347Cs@qh7VwX(x;b25sGcdnCIb4dHe z-2^LMJ6ps7rMuk1ggy3CR7P}xx&|}CV8egqUfAdV_uyAGxsb;$Ss1`(QM#q^Eg=cfx~!oMCfLL} zr?{@6LGDR4|2_ghe`(l6WC=4fxC4cvV{`?;Z9KDOqwTdeM1ODRMWJ@iSfy6(NLcYw z?V|N(&TR?^hKeuK*fc%p5suMshH$>-S1a;YatKS;`Q_NZ^3ghPmvz!OY{>-0YHbVK z;+JO}h0C|^JF^AVxC#}0bqyp|f}hhWYVoMc zg^S;S{6s5$&VKOQWB#3nt5sEMA{%?^tp#4(st-^ z-#@p4HR|yU;M5snzrQ$Gm@gi?H}dGc9Jl2!9Wi!E~VV|;z?tEBLz&6 zPjL8|hS8n-Lw0u9@9{UbEMo|rZ$kt?fgc*~Udt)gd<0>8tf{#wcJ{a7W2I@f>5-|o zQw>*Fac~Kuf~2C%=k70Vmb*HF=9$NRUU>H(ye%ua%M;m-4Z+k}i<0&hXywYPY*EC2 z;20O`0$~@lSc+!LzG_q!l{1F_s9Kz6kTyn|#!&M;d#wxhHWmP_>tzxHd{usdhCc9l z-eJ02E?Fq~;UL%fd}o*v<;xptu+>*{;TyVviJn9trYACRfYdt49|fJsJY4m<=Jy|H8y z$k7;V_Jk4-{+41H8XCGje@KupLBhTy8U^{mwf0+`7aNb5Agp5{uE3%Il3A|FoSu=f z+149=B=W<^1GrQau{m8JI!$~_&Q6Whj{KF-o?=x5%tZzvYF zvTgn)TBN;Cn8mdtL_YF{9F(<*U9D-{H(n8*sB73=Z~0RLlC6cN^W5cp9f3k@I8>oI zzX?F{?Dd1fGx_f+M z3q8QTM=}iuGoiJODBwwA<%9Sh0zkSuRN=L&gD&*IDhch zAZ`#ADaN`I2!nW65}7*c2jVmduT2qhFAA@k%Pfo!iU)={@ihpuXm^doAqMSIuZ{)* z(DYa^)7hC3*zVVeAy$a3N$}!ope+~?te#2G0^Ke(d5;i?1qRH!9jRBXdlHg!XWai` zRyqdQqn;q}aQU-cghPAL59IyuoNqm|$b#5ge_&ey>L0YjLzn{Y? z6Etq+1nGc02so$*vKq^l6r0F5yxrWnVa9~IsQC7N*TAFe zq`Z44d7uxU#=qMWyG>QV^PcqsdYnj6T?0M~jt~?CBKvUVKl|_s{S|bA8cUt=)!MrJ vR_vinuuRTk957lD*Z?8^KYtvqUqLxTXIg1mJLABsupk8)Rp}Z@)3E;opV1%& literal 0 HcmV?d00001 diff --git a/translations/index.php b/translations/index.php new file mode 100644 index 0000000..c73768f --- /dev/null +++ b/translations/index.php @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/views/templates/hook/index.php b/views/templates/hook/index.php new file mode 100644 index 0000000..c73768f --- /dev/null +++ b/views/templates/hook/index.php @@ -0,0 +1,7 @@ +