From 59d861cb9b838005c3e2d5f12452805087f1ff08 Mon Sep 17 00:00:00 2001 From: jitendrapurohit Date: Fri, 23 Dec 2016 18:27:31 +0530 Subject: [PATCH] CRM-19761: Add unit test and some fixes --- CRM/Contribute/Form/Task.php | 7 +++ CRM/Contribute/Form/Task/PDFLetter.php | 2 +- CRM/Contribute/Form/Task/PDFLetterCommon.php | 11 +++- CRM/Contribute/Form/Task/Status.php | 7 --- CRM/Utils/PDF/Document.php | 4 +- .../Form/Task/PDFLetterCommonTest.php | 53 ++++++++++++++++++ .../Form/Task/sample_documents/Template.docx | Bin 0 -> 4154 bytes .../Form/Task/sample_documents/Template.odt | Bin 0 -> 15210 bytes 8 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 tests/phpunit/CRM/Contribute/Form/Task/sample_documents/Template.docx create mode 100644 tests/phpunit/CRM/Contribute/Form/Task/sample_documents/Template.odt diff --git a/CRM/Contribute/Form/Task.php b/CRM/Contribute/Form/Task.php index df277b2854..0e14179667 100644 --- a/CRM/Contribute/Form/Task.php +++ b/CRM/Contribute/Form/Task.php @@ -184,6 +184,13 @@ class CRM_Contribute_Form_Task extends CRM_Core_Form { } } + /** + * Sets contribution Ids for unit test. + */ + public function setContributionIds($contributionIds) { + $this->_contributionIds = $contributionIds; + } + /** * Given the contribution id, compute the contact id * since its used for things like send email diff --git a/CRM/Contribute/Form/Task/PDFLetter.php b/CRM/Contribute/Form/Task/PDFLetter.php index 49c52dbc1e..810ae85176 100644 --- a/CRM/Contribute/Form/Task/PDFLetter.php +++ b/CRM/Contribute/Form/Task/PDFLetter.php @@ -140,7 +140,7 @@ class CRM_Contribute_Form_Task_PDFLetter extends CRM_Contribute_Form_Task { $this->addButtons(array( array( - 'type' => 'submit', + 'type' => 'upload', 'name' => ts('Make Thank-you Letters'), 'isDefault' => TRUE, ), diff --git a/CRM/Contribute/Form/Task/PDFLetterCommon.php b/CRM/Contribute/Form/Task/PDFLetterCommon.php index b93bd533a0..696d5f018e 100644 --- a/CRM/Contribute/Form/Task/PDFLetterCommon.php +++ b/CRM/Contribute/Form/Task/PDFLetterCommon.php @@ -10,9 +10,12 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF * Process the form after the input has been submitted and validated. * * @param CRM_Contribute_Form_Task $form + * @param array $formValues */ - public static function postProcess(&$form) { - $formValues = $form->controller->exportValues($form->getName()); + public static function postProcess(&$form, $formValues = NULL) { + if (empty($formValues)) { + $formValues = $form->controller->exportValues($form->getName()); + } list($formValues, $categories, $html_message, $messageToken, $returnProperties) = self::processMessageTemplate($formValues); $isPDF = FALSE; $emailParams = array(); @@ -108,6 +111,10 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF } } } + + if (!empty($formValues['is_unit_test'])) { + return $html; + } //createActivities requires both $form->_contactIds and $contacts - //@todo - figure out why $form->_contactIds = array_keys($contacts); diff --git a/CRM/Contribute/Form/Task/Status.php b/CRM/Contribute/Form/Task/Status.php index 26aefacf3c..462a5b9fee 100644 --- a/CRM/Contribute/Form/Task/Status.php +++ b/CRM/Contribute/Form/Task/Status.php @@ -82,13 +82,6 @@ AND {$this->_componentClause}"; $this->assign('single', $this->_single); } - /** - * Sets contribution Ids for unit test. - */ - public function setContributionIds($contributionIds) { - $this->_contributionIds = $contributionIds; - } - /** * Build the form object. */ diff --git a/CRM/Utils/PDF/Document.php b/CRM/Utils/PDF/Document.php index b2ecd6aede..49a29f0632 100644 --- a/CRM/Utils/PDF/Document.php +++ b/CRM/Utils/PDF/Document.php @@ -106,8 +106,8 @@ class CRM_Utils_PDF_Document { 'pdf' => 'PDF', ); - if (realpath($phpWord)) { - $phpWord = \PhpOffice\PhpWord\IOFactory::load($phpWord, $formats[$ext]); + if (realpath($fileName)) { + $phpWord = \PhpOffice\PhpWord\IOFactory::load($fileName, $formats[$ext]); } $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, $formats[$ext]); diff --git a/tests/phpunit/CRM/Contribute/Form/Task/PDFLetterCommonTest.php b/tests/phpunit/CRM/Contribute/Form/Task/PDFLetterCommonTest.php index 297057b91c..b882a4d8c5 100644 --- a/tests/phpunit/CRM/Contribute/Form/Task/PDFLetterCommonTest.php +++ b/tests/phpunit/CRM/Contribute/Form/Task/PDFLetterCommonTest.php @@ -39,6 +39,16 @@ class CRM_Contribute_Form_Task_PDFLetterCommonTest extends CiviUnitTestCase { */ protected $_individualId; + protected $_docTypes = NULL; + + protected $_contactIds = NULL; + + protected function setUp() { + parent::setUp(); + $this->_individualId = $this->individualCreate(array('first_name' => 'Anthony', 'last_name' => 'Collins')); + $this->_docTypes = CRM_Core_SelectValues::documentApplicationType(); + } + /** * Clean up after each test. */ @@ -82,4 +92,47 @@ class CRM_Contribute_Form_Task_PDFLetterCommonTest extends CiviUnitTestCase { } } + /** + * Test contribution token replacement in + * html returned by postProcess function. + */ + public function testPostProcess() { + $this->_individualId = $this->individualCreate(); + foreach (array('docx', 'odt') as $docType) { + $formValues = array( + 'is_unit_test' => TRUE, + 'group_by' => NULL, + 'document_file' => array( + 'name' => __DIR__ . "/sample_documents/Template.$docType", + 'type' => $this->_docTypes[$docType], + ), + ); + + $contributionParams = array( + 'contact_id' => $this->_individualId, + 'total_amount' => 100, + 'financial_type_id' => 'Donation', + ); + $contribution = $this->callAPISuccess('Contribution', 'create', $contributionParams); + $contributionId = $contribution['id']; + $form = new CRM_Contribute_Form_Task_PDFLetter(); + $form->setContributionIds(array($contributionId)); + $format = Civi::settings()->get('dateformatFull'); + $date = CRM_Utils_Date::getToday(); + $displayDate = CRM_Utils_Date::customFormat($date, $format); + + $html = CRM_Contribute_Form_Task_PDFLetterCommon::postProcess($form, $formValues); + $expectedValues = array( + 'Hello Anthony Collins', + '$ 100.00', + $displayDate, + 'Donation' + ); + + foreach ($expectedValues as $val) { + $this->assertTrue(strpos($html[$contributionId], $val) !== 0); + } + } + } + } diff --git a/tests/phpunit/CRM/Contribute/Form/Task/sample_documents/Template.docx b/tests/phpunit/CRM/Contribute/Form/Task/sample_documents/Template.docx new file mode 100644 index 0000000000000000000000000000000000000000..f030b0e648a47e662aed217d3550bdfceb2ade32 GIT binary patch literal 4154 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/CRM/Contribute/Form/Task/sample_documents/Template.odt b/tests/phpunit/CRM/Contribute/Form/Task/sample_documents/Template.odt new file mode 100644 index 0000000000000000000000000000000000000000..ffd70a76c7dba05b6ba53c67f002e5d7890dc05c GIT binary patch literal 15210 zcmeHuWmFtnw=Dq@9D=(9cZcBa?(Xi8rf~~FgL}}%-95MkcXxMpx0ihPo_pk;^WFP? zzA@e!qek!UsyVCns@ika-m8~_Gz26X7#K7dSeo`XNxdFscnUBuuwUEHpTKM_ZB2o0 z4yJ|<4mOs?hCoYuI|gSv6MB0?M@vU~dk0fH6MJJPTT?qAJ@dN~VAPjNHQK4UAuw!>4tHFy^X z&Ilp(Ch<)!*wAMsFf#!vFqX)oI72K_$%PNDSAL{0kGUWe2MXo*s)yv6xoqPMLD;B|BMRhd_@ZE{nY8aJOm&F$fC zU50!Zz$43|lx>K$@F4afNrnqj&T?jF2ea{A&-Buehj|%3hvyKLg4{QX>MF`R)PC0r zCF;1MVS)C1%8<;WS~0&(d}4WP(iYdvWD=gJgHS!5*CvHk*Uqju9A@JLo*Yt|ZJ`Jh zo^uH>&H4t=N&zLR-?{$F#c@8!!NIvAOV50NTy-z9&``+ndfYGF`+@kJjicAYZddR4bGS*X!nup% zV;NdQ;u@ctR=t2PJ$EM5EsZ}cn&qSsbW7v5gyliO&?5Bu0#fk9eW{H7gw^&V~c%lHpfS{Gf$Yy#09T`H$Y`^%A&H^5r%MukIG$&+ks3o^g{J z7iKZFG_@R~Qt2)30pXsoFkcp;)X zL-+|u*?^uy`DFSSI#MAgl*>#vx9!OB~m#J$@3?O#`Tlich z=i>^GS6?|y8Re{OVH16OK<^wc8O`JISt-Eek11i2G*5W9L z{hg@&9M9$nZ`d9__S1pabnNtLjn<2^pA8V0;}kXxFH>GNh5o#DzRAB%Q_dR~%LAa)-x@fdiMzLxB zgz>>|U4Sx6y9TfJWv);$lzV2{SYM1ZK>&9TJop&j`;s!P#@gJG!WTzXP3=Z5m=x)Gnvv%BfpkuK$&~wV_^;9bY9oigl;?GGy(sPCu8x|fcA07 z8>4YlE$DEC+v*zysbw$K5yB;N3ExhaykVQ=qim8|l4L21!r~-O>8U@u{dXEQa5dgA zpOw9a=l#Wc&%@g88-Wc7JJrXxmfg{Hr`BXPra~H7$&beh;O9i9gcvm<1h(9uW}inw zelS-e4r;!pj;XSXlV_o9d(OsHms6Y7<)&m_XV>au1i_k4kan-lY?kWzJbFI*TFt2G z^W?lN@Sxm7&b;POcY^vO-QkCduTXgC`c1=ztHfE$XSVo)nFszB_@?y%buH4GbmrU> z5;e(#?i6zpH5;*F#d_7KTAfjlqI070&sAxey7`*?N9!LBpN`Loo5*ePjXw5kiAJM4 z+0(!q@xp3IQ30X0(qHyYl~9|g0tpDQE44PvP{kG5bnSFnJxy8kljl4bu`jLFvZN{{ z&a(t?)#>$>?%SiixSfP)Fhhs)IxA9VH^r{giln}*^_35|dhIBw*I2vS5bt2lR;Lj7 zC>Zo@-zUxIUQ@{P1cZnKEAsXW3Y46}i7g|H*<{%uHUlH{?D8<}N6HC#fEC|cug3RT z`th4?PjF&QlguoNCq#M`NClm7~ijuX0X9!IvG4=58h-`;Eh7B&%S zwq@m+x0z?mi&svYZ#KkFTbvHxRr0iTernF4jFI|5vI3}7C^<|Az3MW@+-+@2Q|Nh; zxACB!NR};W(%WGmrFvSD&J{4(Oi4cPzFz6;JufJ$=Owtv!Y5pC)(cbaF!R3{KKyWG z2!y;o^*Ima-Urw-8!|3QGqeF7H}Tb~{lo~ErQtphVl=;#i@2Y!xT%5Ut< z#l-5IkUJ(eSq@8l*DL#mVSA(4B*R68tc$UA z6+N0eS_)fp^}TDF6Y3WDO4{LQhaGr~r?xB@b*OfF$i=3#s9Ksaf+019SC*EpoNi%L z*MJ;{@i7D#hbbxBt~Mr=W$!oU1c3V^%@c7rh>8x4(3*7WxLI1ddaaYJPxQXUD2UNy z>ItVdTZekzX!I!?nhooVX{n0#fU1g?c{9beVm?+uy_He+6YCaRlQfgljWUyH5u>Q> zQ#|6qFF)#E@5mAiNzVBaHdRE$;)$w)P3OzoUaE>vb>;a;`a?8nu(@QTit?1u9QW>! zMHMw>ctB=Yz}`p#Uh2Vu2jgMtemqF>*2^H6FIl(8KFuHc5kc|j@mc$7*+E$vf#cU} zw=d87izMw5_&}!7)(cr{D~RwF)$En6KI5XSWVfv3=qxl*QFV#qRlio`#v-r7#Z_jg z(r%F4?FKS`ECXlahEhRJmLIiNdxrvUf|^b zt#W|`Ik6fWf&_#r>dFxnYqCIrd+*1j-^4roP*Yy8TFAbMWy9`Z6k&maNLt=k(jwol zNu%g;DjTaHUrvtS5B7ZA)M0@?}7*``UQ}92n`7Y*Mh0wXF_RKl*sm z`02KH?CT9taA|kT8>J>sDvW3Ese!e+YkV_biHIIq6ofg756&dOASJ1IoI#r6BEdjonDjxz z(FPV+KVQ{i?LDtYCm*~RcPqzQ@(4v zud#eFpTlzM%%@M)?!z5T=hD$ow_5@c;$fpsT_jzqx80Y&RD5TDZ1a9N(SK_4@pv4_ z&6E4Sq*pGjA#E;_A4xVPm0ieM%zVuGaOcmK0#@4XW4JGbpan>K0$LGxKN@RwQUzUN(R`LLU6*~wh|?VF4fG&2OWsH?{-iK5r7yo zG9H!;3hor}MJhd+=ar*jFF*3>j>g-KqB}MK?M&HH@q}(oPUIG%XxiKlTXvRgmgz=m zOLGIA8CFx3`u0Beeu&j-P{QJS2%9KLZE_$>z&nU+fb`|Pd}(T)tc}(*<*>WaB1c9G z;VRlxgKD}P)?pj4e>$U3Z%WO~%WKqG=#KQ^ZZzLmm|r9o^>|u0D!b|kV1XheK<%?zdm-BnTYesVEz0@+w*51MWp7;ZxCs@NrcZuS7XVgi|M1+PerVvQ@uV?5mKM ziBNgU++)#K+{I8QSy!lxa`~>4wTCAkK3nVrVtUup)78(HzsSv5c{?(J!V)8dP<*v< zyabCb9pUdGmWD{t8{2ea1>YUml{tJJ?^(Eh`v5I;{q||{+qcIwVnLg0=8WiQp0d(r4MH8Bo91#nxGLRvYE zZ{vnQv&xAFS@uffF(~-PbNn%XjI=TK#z~b1-6Vf;(~L`Ap>~JqeYAw@AzI_k^@EOG z^$bL0D_CSnoEIVR{`jL$x2qp_V9;i?L$(&}$0-XAgAt0#5ihi3am?h&~a~xT2j+g+s9&m^jG!~gLJ8QL}bBneJFKpk;VKznU=5v^j9m?cS z>iI~lVNc)@O<*OIqB&M|34xVbYi zqGEA#BP5y^TL~>}0V~^jc0r?LM-oeen4>g*WfkC{`*>y4sxk#{WaeH}$O*3ZK|h*U zkik?!I%(nQn5v$lN3s?{GSp2|oN(DD=N`(y{-FI53QHNTD_|p{6 z;0|tP1x;*!){SJ5*7IoRii2CB=MOZL98BEeaK(TU}#D+iwY)8H5)aH zM}~Cr-F7d_pWYM=B+J5(25ufwF4!&v>PwUFPOv0%P@y%xY z@aeOk@!(i#bytPZ!tL<*+9G$3Y?9poFawdHU7B+8N-XKe$E{Md`-dsCOKgE2iZ~e8 zy<^_ib>JP0X*+dU8O+0m0Rp8oA1P&LIaPG#-I9{9NNwdbh_DwbF4+9aiVhqaT~6o4 zYt-h56kvj0rh$H#c+O`_xX`DUK}T;0^OZ#;DQ-`_u8?-6p+QO^QBwSO=SbM%M|0!G zZz#GPY_bc9nxwjoTF8TlKSb;n#VgS!d!8Y&7Wvr_WQtI~cGYGadHeMg4HT$Usp7%M zIm{`ObbL1z1b4tv;-F62b_(JshT{xqE1OR?jylS^vBcR}_K+ zbBFmYLI3r}CEBa91HWfz`t)`9HR2H;myBdB?-q}@(q5y@-NWs5OC(nd^+a!>{qU0% zB-x;ty}E%Ti}Xd=>&@z`IBQg#)LZsFPM?S8*2?n+-0Ewk=e6q5T%jQ(?+ddmiY&?l z11r)d*6b=o5aU63V;5!|tR@rt*@AjHsKxzcVj4SP+vo22wV_#UQW^To)Z=+4BccW+&Qv97g_i>IzhZ)r_L-`<`X1=a#```Qg!R1L_yWq4V(*Ex~a z(J?M;XP--cdmY+s)k1-6>{{72>uHA-uWI9A389DvLC;SeMVUaWmh9JGHmw@OKYnNw zuKm&csS8!BS_!FZw0vpr&X=(~elz*=^+0hZ6}edzaEgovS}Xq#x9PZN{_cm#t|0&N9JTsM+vl6JihGydGlgt5O*QXmVI`gOyqZ<0Gy|k20j>;4sdvgJq2WK=k3aa)bzZ6@WEMsC0{8_Oq^; zPHU8A6Tr*aWY#WSAU4&25~bq|Jon`(pZ_q8r^=pVUcgHxft=FW!UDQ>R6$%RX6r~S z0k!2k*yms%AEe>Ke2|jXD%Q{i(VtjE9d0(c5A0X+GjmPI+!8Z2q^mcsIPI$UR?PEb zNcHTjAn@w_MB?q!eg)PY*zU}C*@O0ssi!u!no$24Vnb}7?M$MKe zT*Mqn*B;`3yz-44^(J=za&F;Z>CGO8_qa0)64ughaP>ZznBRvpfA&M=I)|JF5&7*J zKed1p0+s3`TKYgArK7Dx--=vU_PD&b_&4&xH zBCns}uj`eu#On8*+Sh*unzaD7`hGkO!&UDC)Jw#tYwnY9&od>_ude|~C%%=P2k?i8 zr6YPSPN%1v)YWdj!22en_3EVBUT5dmqt{mS8-IiV*&jm6ld}{(feawt`rEJNoCEXM zp0*sd#w@YnJ>q^+H%Hqv_g8@%7f<6~U((y|X9{QAyf-J|22gGufIRPW zT{(bHbBc~`LQuQ=AsB=4UGlKJ&;9mZr=#ZPcE_9!lm{*)2#BzV>heB#WL(Z06@7{$ z0wz8@4OM_$T%RY*>+pNApS`>fbi%Jm%hZxj{%ng3H zKVTwz6&SNzd3r@^KT3!9I?%7gM^hX)xt$q*(J7=E9M~yU`OUHWY2irgx%}mzZ6&$& z$M-Lxp>Q#zUYn7vszbEprI#WNC(K?G$Gup-h>2=wX7|1wf>SZFH`j~O-T~QWk9oWh zv%xMD$AM=GRzKu|m5#BbEtPDIRx34VgGIvLKDz@M=Jj@=@MDi~4HcMJ#zFxE1V^@M z(L~u_{cCyNA%7JicTS=Z943jQW@G*A-9tigB*u#kGhfUK%zGo=)Tmtyk19rlc7!jX z8JdeQ*CxTfy~@>GK0HAY#i7kg(j-RmAU##>sM);X;s~1 z#%~lb;;kRaj3+I!pSpNU+zfC>;f4BTU?v~5fHyhge{nL;%9zPSG zV3MM8B4t7bU;ZPh3JneYuMF+4J--?J&xVbmo4pf|&e+h{!qnKrz=U$m*uVgK&BVaq zjnO+W1!*Yg)h*shl%Gfb+Wwgf?&n@(dpqE-RIaP7&9Ua9-6s2cuTypC18dXys%mT8 zN=#8dQ8-e8%0uwuSV8GHS$|^Hm%FX?9<>(Y=|J~l+=}ATGp&1S>mv|-^1U{@fjT#; z#ddK?Wt56K?{4dWwPbdx@JuKQ6=1D98Rdop7E>y|i$kwetyHzXyPM|({+-{PL}^!H zcYJ)tyZBtDJPq8~Px;edacz9jFRtZ{b-!t-4pp4VAt>!xsBZ&Kbdd+|lcsXuNSm#@ zKHt{Yr`+4ye{^($%fT?e$sy$bJod!1bZRAt)>_Bv%%ECGlLRr|Vx1si?tmc16r1%36!P+g+IRrVJH=xKmm;ukOr=cndp#w5%J0wz_(% zjc>_E4)ePJH=`R49x^$)QPU7~3ye8Q%h$K`4GQc`4X^F~%TguwaH?aM$7Q()K>Dg9 zQnaQ0p0S59*YTLO>H75*(l(v7r-x;EKD{M6qX#3urO~S!#f8vvs--l zf{l*F^HcoH?>}sIWJu&56)9gc-lJJ-=0u8ffYl|WS_`5?q;L!H@|)OT0=~nEa7ulO zTaOz!x8)r?1}N}bw~4PuCel|DQ`O*v9luj~-}uS&+%yITl3xD()S*08_FD$Iq)Nccc#`@0Y!je{b^?gn>w6!Uu zNyl_D0OQaGg8F?!!YbBYfrW7&q5}{rRYRmG5oyupu>*P_P4x)qSf6xIRMiEwjsPAQ z@vfPTdIfrL@5(SQdT{SYaPMDWNyGFQOjdC@&%~UcQjct0$oUp-=dz^?7&!**An>l8 zMy!2F^()x5se4QATNKXvi_x2JtjQVO!_2VWk<3gv;t&Fyy~C% zdSyD4w3njT^+#=Lg05m{lCy4!Wj|p}jEEj;#5Bu~!EyUs4ve&Y4m|~JZ(t}9eJ2T( zAS_eI9}Sl%w&f?>53N#OE5~}++RG{})m3CZ_U7AzFJp8CjyFuK)rm#I_n7N5*L}er zWxo+zgc%Yam)elH(3!?Hrz4cy z+3!NEcdcva${njdFRDS)iFQCv;t5`;fv{#tGPwr(Db#tpw-8{@@DBD747H^SF!pzA9AX zdaE*;v9o{HCbjAFFVXz&e(CW92?myc^Y29SmjFAO0)dux=8nHqvqekWae?c-H-8&( zmxoke0J}^~#E0BmGT%27L;EQenAv_M*AjrwK0a#9Ih>!ht;XC2etgqCJ*i*S`!U=r zN-U=*U>R{yr{v+H#`y-@=!dDNwi`~ZJiiLx%CnPSEDTa6vSA__(Qx5A<2__Ap>pZv zKKoTQW-{D9)>(vplraQUcE-02-lgX^`+>>{`kK)6=JoM~OqSVNX`{QRJD8^m-O~%# z*G|*Ry8JjIa>NIdS721W) z>DyqE_XI7O6C~}+bzsh_tDhpFzPxqiS$>|cMLIpK1xy4fry>y%hY4B_n83RWcVQ`l z#l~}IGgIbglcd1z;t()?A>KzNzgpRlM@;|$usguBY|W3~C3*xY3Dey=x=}3Lso0{` zkJM@KF%S+29i^q~PSXz#(n-Y^hlUnQaC9jlCVRRBgQO?7&B5y zwHL?ez4#`ENlcM1JL^c;6Jg{x6(X>!N_k7fp zTm@dehxC7!RhI=v#^=@BU4Ntm^bpl(BFxzM?!!6EU=o5&J>sLJ{wQLYH;fUv7+Ahn z+L#|DAjK;88gWPXPLHB3U`qy#peP!3)tre{lOq(}3=q2?nfoI;dU|UZHh_za(nEru z!bc+b{TX_1z&pI6b>*1kZ3bQ7=RjoK+X6o?1L~a#zbE;AtgLmV$#C|L=^z-n0ETsb z)QnNI>as?4o0EdAy8+NvV)7hzw$MXjwCX@CNOg;#J z-R_AVYkN2&Paq0;t*ZR3(A*uN{;4mZ zno&3-eX@W7y-R*aBANzWAP}fBPvow4RbUmGdr0J&F-I-;;ox%2WFR!q!&5|9q3(ii z!hO>RD6d6*lTi{%i=z;y5RwaZo~EIsL3!y!l$~b)$b%u&<(_0lHtW2mYW3s*vud{i zf7?S@{B3WTxsJh0pT+jh#Ikg9bV-IVaVXJ33vk^nvNhqbQw+;%Nt92PAy&aS8j@R> zu2Xl0^|`wf4j~=iswdP~1$6nP4}H>bK#1AcpG5nNw%a}96NSg;OM9@C>Z@q*Nz`Zv zFg8VjOTj(17mRV5wtE;KgCly9NS?x)Pa!b&%FEHZWnQEcP0a!k2e^ho15vvd zUYZ?JZUdY9RJCrD%+?N)7S)({p!C@*6X}eb@xEG0pT1-dv7`ak8b-;vnHQ5+)rmlk zN0;Cv*g=MT_oPa5Y+Wh%^N&!-mg&K^nK{_I=7$rpkh-16uRHhnDaIf5;&oa|<-R>v9HQVuqD^tbgD@uK zm)@8HGYdxD*kq)UPlDC(2ibTMMXY&WL&i?ZCAFPKBNEiLz*$&j-1esQ^WCL#$lS1CClAdUk=RG{1@p2>z|XRK*L`lAv{*vK9vzI;Px54Zx{o9XS@TP*mPVqN9{mmz;3G&zXxHikKOR$ z)EY$0q6zHhTy444SwxGRtvg?7U>E8~5fOyup)WKNnjyRMdO9I&H@?nQC@=p47(zSN zrY~IuNb{&uBY;X#uC$Cq!x%MU5^!y()bPJq!>mlY;;_=piuKi_=#(5Y`gbux3gc1g zc2SNxax~Bk?DaUc*pY`Q_Tlo$F*3puf3Gs`d_`cZdX$hVv>gi`&CLHq36IL*Qw}V} zw&v4ruVezkd?kBnTI*6@qdPoB#PhY{U1kzfl`*uUZy;COKhR8Ndu4jV2&3>G>b$Eu z>iPN#&?l$4ar{|1f0|H^PDWua5J|qpB9RdDEYGxq(mB&Lpp){FWGnj)%ant6jTLFa zUNI({QShx!B`1n`XQTRh^@`J{_2Tqi)`wcwHWvPwv9_A^JSqDrfgN+SaD{!cnriX9I0AmA1MYg zrK$IkFbx~_p`DCR`beQFsMmsU1Jj>nr}=-~Vj;^S@X|M6V4)EI?iT<0v#KM|&BpX! zasOCrFk+D%ZTXf4{;lrBg>{dyG0!}@E-U32DWQOL+)yCO+n6fe`v<*NQmF)U|2%rw zY)weUQLpnQC^9P$KM0PU6XgRHgUh%lS15UojH}e3C#Ki)1)O^bU+dG=P<0r&NyC}6NM2cW(2rLR<~u9-MjeIal{dvl-+%h-52+@YYfPcvL~ zrV3xTnecQTI%uJ=J->253xfk;nuSm8o)&w6L&{arP}D;)6`QW@ILl9Inms~3fAXp( z6%gHfIc$cCTLZ&kxmBdaND@!ZWGKQNd+x~<*J%sczEwbzPkuB zcZFimGv+}pMwzN?Pd#K_nP9o_PHEz2KJTM3|E3d6%IEA(WQh@UWEJ5=>{{DiAq~^8 zSA^J;5@=fBg7!cz&c@>)VP#Jg!7bxhYW!N9wg|(E#2^QrIkp_Mlw{}DU^Twz@Wqdp znU3QueHd;OQB*uxg9F#hFIBVeLs!`^-a1o2!Ovaa#-00O3ZLK-sm#0|kc0^n!W>X9 zlo&@YERZr#z^}~6Givwn49BXsi}WTmm15RmxfNKWYl;H+7DLDqGaPznO9{M%6r0IecK@0vYMc- z2R~q>wYLT{ltY{V3y@D}iN&e!G6xOcXfr0Aj{s?>eZZZ@lh=}>Bl@Z{uIiLju#gIs zmv7kE6`0|?QZA)0OPM>ClIsla=e_JKQ*T2Ef(O)YImEwUTNc_ zoQ;HAzKJ58oSniGZGsMv@O?Xk4o#$7DwWdKAq(LiJ{m2E>Q9oF)bu$`dp1K3fz36cfykLC~SBZ+$D>1B+|#JqWQKLLcN zA^Y9HIy^o^;he4-D7%rXho49AAP@$9m@xhqVt*vj8;fA_&DiGsx<2+q3U{_!OGA%i z=v8oC`*0Fy^d#h98(4?Kha{XMTnpvxe?X6Rp$`xxZ65iCJ#1}gXF`tfdFjxir(vQk zNQudXyACr~e8_6eX$PYv3!akkBXefNb67#SO%3mBcZStHQz!xFe1 zQMeGvxN`gD>~u!u->$8@EA8n7G{X4&l=|E;8hkG znB)Xv22!e9V!SAKz3ZXAT$d)_BL|^DhJFiNIB2F7heFd}XUDO(Q`C09 zG@=dTq}Bj166T@e4fF!pN#Yinp{X=dsOqz9Oo4aW}K z`7yrtKjjH99hnngc>5MWInZF0-p&@N@s{Bt8D*t4B34Z?r|2MkYO_p?Wi_HE<=7Cf zFSM$lLxt6tifll_qIRE#tBJlLcadvhu8xK<8UNhMFE^dK(Z!CMQ$Hbq?jyX-Xmu8) zYw{(Jd^2&!G{+|i_@0^wXc&TUAl8i^t%MCSr7MB^W+$TW_tU;zY-9 z)id70{lwVaX|nr#l_bs}mH9;epo!b-=FR8P`~>3 ze~&V=u{Q*o{?@aIE9&g(C%rq|$?;1UtCBU3nH>I{={HWI&GVES?AyC)xsxnTrnDBCH`0}QXqc@%T(m(ibNWRoM>_LwPH8gje04ertl`LR z@zuZ^M>HXL;tC=?tk6ph_6?1XmK`Er9GJWO1hwNCI~{AS7%!<-y@UjmEr z=ke@)aTa$t1aor1jmOs40t;j!&TqG0!VgCaRs)c}cbFldh`A^FF`x!}C{`+A3qt5>M z!T25bA4>cCckRF7`Lpi+Gt)02`Q76Gj_D6N{LehUH1&5I{u`d(b@_kG0>S$C{`n7` z{@=22{te6Ty8Rz4zYTz2J@`$0e<}CxX8$)V|Dfal`v;)sZ%F^B;{V*mUpoG~z5ET& qe^d28_w0n