From 5180d66a45d4467d54463cf3d2aec666c14f61d4 Mon Sep 17 00:00:00 2001 From: Victoria Ahmadi <victorah@stud.ntnu.no> Date: Sun, 7 Mar 2021 15:42:46 +0000 Subject: [PATCH] Task 2 coverage test --- backend/secfit/.coverage | Bin 0 -> 204800 bytes backend/secfit/requirements.txt | 3 +- backend/secfit/secfit/django_heroku.py | 6 +- backend/secfit/secfit/settings.py | 6 + backend/secfit/users/tests.py | 163 ++++++++++++++- backend/secfit/workouts/permissions.py | 8 +- backend/secfit/workouts/tests.py | 263 ++++++++++++++++++++++++- 7 files changed, 437 insertions(+), 12 deletions(-) create mode 100644 backend/secfit/.coverage diff --git a/backend/secfit/.coverage b/backend/secfit/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..be523e4bd8ea6d310eeb53ecd9866d8966e65080 GIT binary patch literal 204800 zcmeEv33wDm+W%YKJu^M`<UTmk2}2UDWO5L~A?bt!!Yzjaf+Uk<azHL-5-vG<Lc}Pn zMsyWi6lB+9)m7FLPX<I6l?B%Q)?-zSsH>~H0-oIYztxpvaP|9V2A}79o_(eXQ@^gR z`qf)+y>)hX^_*GLYMNY9WrMrU*(7Cw4F~~Qk^sPf|1<G__n|`|bf2J0{P52~1EfuD zH(Rd;llBg<E;i4%jxgP4PB;GDv|N9i@d4cueJx%H9U%>bG!W82NCP1as2cFjGU;OC z;z-NdCTCf#tI6#wce&ZGdBW_X{JBNa-28%RMH2IqQVkLwBSuL1lDlDr)aY_cl{K|4 zsiwZ7rrg<7Q(q-DRlB-FH+x(aw8uj~?DJ^AG&Md&B{dZotI1V`6pikhI;VS;wA8g~ zxEi1<wI<ifCgy=8u9~WP8bV6#iatbgyDD97SADt5!=y;9sTg7yvSGbJ7ZVXdZg8o2 za=Od$&v;30(4#jilPi&^yun>Tr7v?k>&vTMp5c<SCx_(?DCf#1mRom2U3yc4R9jQ8 zX0zT?(^S(?FS%B_%A1>96+fB5;Z$ke2P)4$H^@~=GgQiAcBSQ~o!-bl5wk0JSL8|* zuD+pLt-TRx(imBlxxTrs3{}3Qxvr5G4#r>!H#PiR%%6+f)X<gLK9|i;lx1&zFDcG$ zmD3Vsv6|~^mNmP23V*oN8*{jtjrxY+63ql!z+j^`W^@Drv`W`X&$3z^c$GMtn;O*f z5-j|Z4E!;*hKahEgamTKGSyJ1dP>S_nmj!~e~Hobc>j#)(Ca^MH?)>qY9zE4)z(T4 zm1>otu_abGXwCk0CcRr3PB*P+QbSijl=T19+NiK7gH%@AP<E-UsTSjLVFkgqpgUM) zbA36jDju4L@`mLux3kKX)^(LN3;)-Kgr<|B*Txhj{G93Zm_SKJ4>Wk=w7Qsn{YZ;m zHKVT5>T-0Km{4~~{zNm{eW}jn^fbG>8<PL6k?fAq+e&uVk*+J4oe?^1On$$g%T8Cg zl8i1OdUb*>CMt?}S&g9W68*2aBoox9w+j5IBj~&Mjn1ZO=|5$s-Y9sAMjJCW>gNQf zB9vs%U+sq3oGS7SI#v61*yz*${3Rk&pI(utx>k)??ySYuq|sU9#wv?#FzW#%8nD8N zft_Uy%}uKP(o@wuY2VW;FC*wZ@76tr8lncr>Wv9`#&n-ZDb-F7ZG1c_QdvVot;<=@ zx&#b3*@H>dcqBFH|LlzNdO19+C`Z-u6jhY&K83dKbFr><S1SZ{b<X;Vu5OC<zKj){ zd|D@II;`!$h*ApHMGw}@A8~e*c3q_nRX2ZHBdUV3);TL!EvIGS$GD=}^&fPs6Do8z zxteO~ToMhU3ZvT73a3XZcf0T+cA-O3`2Vf+X(5$l&|f-B7U@97n?Q6i!-f%Wb5|W? z%}a>~`|>(xx7b~$+$Fa0ql>*}G85Zb9OU?$2i2XQI_N1&fwpO^1k0Efx<hphaSTJu zC?&C;1N;jeAq|8y5Yj+M10fBBG!W82NCP1agftM+Ku7~24TLoC-=_hda70Jv|AO^C zupYA>u|9zybc8ez(m+T9Aq|8y5Yj+M10fBBG!W82NCP1agftM+!2gW~Oaec^+WnY@ zBcA7@vgl(9nU2hi5ss`8j!{xZ_L$6^F(XHrIlf;+*G>MBX(J`V4;a<`Y{tSAeD;Dq z+|;-#Ww?~m<nlD7TuUGF7p!lB^-b%y*3YdU{@-LUlxj!=Aq|8y5Yj+M10fBBG!W82 zNCP1agftM+Ku7~24FskE6F-1-uN4R)A4TX=0dM5{k*;+C&d3kYcP|QPklbW_jwX>| zJ!k#ideZuZ^%Hy=;2m5MIAnd*>a#v)JZ*f!xYRhzaMEzE!DSez|3JT4U!>>6=fp;F zxb9=!R^4<Rr+r4-s7=(oqq$i#R`{22uTUZ+@^A9%_%!YqcM~_BoFsRX*~AD3U?sqm zQ3815(wjZ*^xB4UXKi|IO<8*5s;26O`mD6vbbNi$HKNg3z7*FhJn0onob^==_`;dn zmCn{M>Rk0rcwXD!#?_3X9OSYF!G&*OlrQz9H@j;+lxAe$G|f#lwVrg3vl16m-1wp< z(oD`qnwUVPsjp;uaHW@&)YR8Bm6RaWtSqET35<$Kgm0?Wdus8`*M|CZ6_?;kEVW2E zEfXmR1V*Xqy-Qbq#K<-!1KENp#cnoNT_Z~AqUxXRK&~OdOXk5hUEMWJtI|C#4}EQj za?VIc&ct7Uv)tpZq<m?=5MP<oL)YPEkNAc1>}NF7ha+b~@OiFlsBqPmumVC6#|`6Q zePC=AW$CIFVr+RR3Zn@)x?grC4?%{2s}nX9T_#4~DeKbq^weNA<3zIbGHi}q^%Wij zYT?aFLAn5IC#y=A()ne!I2kFU0#lbCr61Fz!N?R53=?Y;%c+dC3Qe~Mt29RB^sK5c z?=`2QK}Z*1Tg{p@>=E4f{vf`HiBe5YLYm943b(7O23zb^lq&J^sOqq}p}iEPk}i+R zulyz_1WD!BKX%#aq=85kpeZnwqn2DNOR8P9xS;}OuV4TY=>xN=uClB5G`h-Z!4>yM zjsPvZqQ--zUS6Hv4OD3+_Cuzyz@+IW@b6^v<B>-f7>`=#Jh=0NlZ_nWkRm9frmz3I zU9}C)3e?TaSfm*gm?TWUe!a4P*79PIkPn8irg3==N>mgbY{t4@t5*jdW1@Jtu8(3k zJykWhfd(55p$O9>QG~vBXWfx;B!C-mG?g?}<FKcqgl%x3jul5o@USXCQD_T>l8g^W zNl1Wk{i^iDFpM9d!Ls75a5dt4(&}gq<(ObY9%CQn=o&gR9^8|pfo>;)BonQ{3xlua zW82xR*5^VC@|Xh?My);gqIwPX%?)m~;WQ&lz|A?1nX7P<2WM@G$JInPd7)GVCZr0m zk-`jB`q!HRW8fUl#zs%Nf45=?JWH&UZ~)ef`v}lRft6LE9;t%Sv1?_yt5MzD0u>{R z$P(aCOwAP4P7Sr00$q@5@v8*WwaC%e>ijeFK0mqwP2eJ_=I75L1kS-qs%t`xs+qte zM^JUrPmpn3AVY1Ov8T1Jz~2$Ah4?$9wIBYbY^cHC#0_cqo6th9_HQY`-}n|2{>FG0 z;%}69F#d)$;*V_<XM7DT#>7}W$uw;<%`w&)&sZNfeQYT-AG21Pr&z<x_gMBD6LmAR zNt$<sT{@ost9B2+o=@jK<Ti16<P^MOzR$8uw+&Y5c~ibnDkO=|i_5IV`iaIf##-Z( zh6Hhh{+M=|`5N6P#H9Zfxd)pbfT@BvuCI;h&)7lt{D0I$!D|hMt80qTHUG~Ef`-|_ zCG-E0Qv`2Jz|#EW{6BlP;7tjTib>=@Ah=}ypEX_Z4hWEv%`n(--j5i~J~P--?9zOb z-~2ygj^G_~8It|f{NFKC@FxBeoL%$(^k0gvYiOSKOXb<G6&W!@z->o@=#jh1<VW-W z;aBkM17!1?{}0O-yqdtH`(<ZnP}S)t=l?^3*36|7_O8N94Wf3ks&pxxUuIJ#3*M*z z)#XR&$CO+wcq4*h`qBJ<aL`Ko$@#xM=tlOE`TwBHv<kn0TGC}w`OW_mFO$lz{G?#1 z{&W7H5QHhPUgSsf|A7+(uRcJVVnj7P^Zx-sSa{E@y&I_W|NfH%Z&-lRbQAaw_WKnG zUR{7ZYMtwy|HlVy)R)Zv<E|9Eg94P~Kf8NBBZ`#;FCP?P*Ze;w=!{)5|BoKaU)NVL zx~K5!T_GG|L<Q3RbVvUA`G4dXepTN@!GZA{OdE%)L($T#TpxQ>+}E+u>GrtNasMz} zvGm}soVaRCXQqS>#3Sbk-t@k5^^AM#@#a!lIvPv0|NSq&l7=75IpCOu_S08xlqEHg z@IR8JyVaw+Kzf>-^|<L{<0|;TjAGzn4Wiq>bgoIaPqP#WUL%)&m4~VkH*IyNH&rxc zXJ%)PpgnN+dOY6mDX*+)N?+07UW%LJdD3yQvaY7*77%Adru0CJs3)g5h@hLmVcLy! zGG2{4*VU>`&rHi$h{WE1aIdmyt|2;4@RGh+SI<pNI{E0nqflrWOaDRFA36a20;oH9 z|8%u~(^iJ@rTKz4qgT#8-Dt%DTwP6-TU~JSq&J{KyP&_tU9fBh{WO|wJd%Paa7@LI zZ>V)Q^5g{8?O}{$`X6IO^)-)fyj5FL>Bj9Csl}l6xNC4JYBkyzt)q2FN891VzS4DB z%kmo63M^B)VXwNV<)1b9H<AuOV>Sn98?+qg-8i&BdY>8Py9Sv6h6mA!{>(5jwEv%~ z(a=vw10fBBG!W82NCP1agftM+Ku7~24TLlh(m+T9|E(I}2@hua{y(vv2mA{iAq|8y z5Yj+M10fBBG!W82NCP1agftM+Ku7~24TLoCU#J0|H|y#9|61z@G<Obs|NlGd3F|+t zA6q}L7Fn|_-&@|WEVHCo;>;(^Z<~*p?=s(L_LxVRhndcp?lawOy4_T5T3|{xzH2;e ze9`!j@m}Lr<ITnu#s*`dajbE;;ez2k!(R=L8g?0OHnbSr2D|=<-lu<9f0ur(zFEIO zKS7_ZA1Xd2{y}UJXNpN;tnR$-8{I#39l8y=a@|bbI9;|bPG{79seMcPindytqxo9% zJI#%nMVc8JSu;`-FI4hF`9$sq?p^M2@(=P3d7d<q1tbYRy`;FtRtrSGvU=T-<5}px zRR9hbJ-`OU)*Y-A@C}Gqt>RNamN~qnm>j4WNFrop6-KVDI(vHCc&)E<(#A=6Rg`hp z1Yf(Iiv<%w4*L3p-$4>vby1ZVZFuE@`@=D@o<pAO(h$8j+_n0VZ+`=Jus3B0gphm; zQ0$N+jlikjjl?|}d!lp!Dyn)-y+UN*`c+^GxfK>EMg}6-lne9b^VJigA$2MI-DWDs zi}B^hw-PvLD)mk-!(=yvmvMXY9?jc@R5JcoK##xlXcZ0}y?*fTxp3-Htk8Ew3IQra zXf<rH=PP)s9`>W1zu0juIHvVvuoH7O&3XK-gmB<ReIk|^@a?if)uVt-BecV8&6S4! zr5J2X>G$~V6f_ox+u9=9Z8BH9MWBUFQcLja?2_-_;AIC$TR@BEQ0NdPnoU8;0Ifq- zmO<+Q2d`U<A#IC~TU$n7i#lv|UwiS~jt|!#YR7;cQ|G~N2cPZiyzu^6jnt8sC`s}P zGA8<HGT|ID5C8rFb`lBBe%C^6;CyH2x@X>dEb6W7H%b;`?Bvo^kkH?zXiD%s9pdeH zqIuM}#&MP%zGDv=9(`zC3>H%=-1mbPe8Wl>l06d-eHG`BouBRcN71gC{gvbQy@atr z=^Tu|v1ji#9zS)HcutbRH=g>##*?r!ZQx@zz{KgFW17q<h04Am1VkZhPtK?FCA4GN zrmWOR#J2JZKHDlO^}9h_#4S!Pu%#;!aK(@aq+y$_kSK$93s3trq+NMsdD_7Aks6wW zL@h{B#H7YBVGokD3rJj4EMS_?S1B*8DbIqA=(;JldovcH?pn$g9m^Y}>`PfgVDc7w zyWMM_9NzN8b20C51PdvPC?#3ERzlt^DAmuG?Rx1DK*9DFJ2gvAi#ZG5BPUHZ8MyEX z=Q%|w#&}YrG8hyazjrv<I)B&NkBnzF7l&_&HDnZqhYy3|Eusj7->um7BBtSp7NyBs zfm<XAr2esY76a<IMJ`)}^jpwQz}6m{x&<Z!94I4k3$fs{7k(YP-YX`7qZmtU<xBGR zC)%pQ^w;2}$ZJ|YAjGr)Vf=z?CPGW;Lf$l=p3T3Qdw$2hPV2CFcs76Do9@Hf{@+_* zL%+2%51csNB8m8y#TCaYHk1up6Iwb_+|?L3`)Uq8Uz2$>2|l^o?we{8S|b$SZPTuz zZAR=>7k?<J+=){1S&CkcK*hHgqNsS-lCUH|kn~#)?6kF2Lc3kh8?;&ZWd>^O0J~*U z8NFfK0%7YmQd%&VvI%o9ZkV~Va|G`L2bkbq9ROMf4Xj{2BC-qu5D{eb5GC4L(iG4S z`mcocosKyuY}uU3TKye=#>QeQv`bPxh^DkBeGeGgYy?`#Nv?ATNq-0HD74z!g@v<e zsyVY;_P&;RTUJ*ihxz`gLzIPB5gSJog*H(Hd~Hyc<VA7N59Op6P#}85dhtiG&O&jd zSscu#h6138xDq{5uPlq<xyjJ35AzikZjBu{6FtYz-1X0lZHlj=!XRRnL_yptw}eUf zZlq|Mf!E__Xis-emuzC(bUe$Ro?|TDLNGPjF3aIkvi(+Dfp!{RvP?6CO-0u}_3Ohl z)%{?z{|_HN1-+7|sG7>VE?ht{^9D{vzwwi4W=~#l&uA4VCLvS+=0dR@Qo|M&tEwr! zc=*g+ahXPt4vFzL`=gn<)Tx|+#$l6kC+5fGD$yNU*|ZV$S%}d^@XBSH0}6q2F%Oc) zYlSeOMNCR+!%L+$Wg6h?h+C$EM0ArdaoeOVf;bUD_{8Ln1YHsJD$3;J3lZcLeqot> za#)cSW47Dd!tGf8sB>`w4L)K2Z`ThiKs3L=kaD}NK(yIxB55aJ5;0|H{8G++x+WGB z;@GB;Inu34Mm`3v$bWS2*J}HKoYc5&D2`0Asu$H2soi5TifxFDQRd2v6W-XVUcsMf z1^Zvck8IP>HY_BnIkb9g0rD`YC6Durry8pqfAQ@jo$k@G=fjn|v4~>nOOJ3`4b90E z)0D9n_r>hK*!g=9=g;zCTg7?h^O|O@f>$_tIf9e|T0TN-wH)9}M?buz6$H^H$+CI| zj?)_P3QRowiYcuL=5dJnkNf;o=a-$gfGu(?o(>)R<g_6uY0I>ALunL8{227j8N-!E z4$SX-x$~CwXY<5?+N<_$yWs&&I~uQ9Msxjg(ap_0PM=}L%(kEF+>3ol=S-Rf-Z}~| zN~4a4XGWxs+hr;w5jp6Qnlm)-xbI+s{n!o+v{x{XM9=;sxwulnrWYQZlT9^~oXwqo z>BPBT;IHAsXX^NAS(G$3>*Cp%+uCMmOBc!Ee|h=sH<Y^`m{mQI8~>uVB#eLXt6l5l z+<RNa`zLW&7UbG?K~nm+3ev?m<>p(-(Y^SBtXk`RmQ0j*VCJKq!)0&W6xELya0H}} z&UmQ#{CP3lfjHUm`bVD}T$Vf9ZBmGh7}DwW^d$$|Vzq<P5ErL?@oszmMpIm7MOxLt z1<6OkGE6T6Z;EyJ9Hk~$q#c2QEF(B+IJyPHkDd99JmTZAaAgiH*YD7c7=|Gh4SRG{ z7Ci)fOt(GdAeP;Pqq?hNPi#8%%(<ygr~EeITX@O5lYE|H9*V*H57mx$%@0p%b?AoR zscp#XYloyFn44N(xzP^!2WQ^$F(-jw69tYaXjFnM$sjAD4Y2BHQ!uC{g^Nl?cX%?V z%t+~{Oxn1%b(3j}J=`V^M(^;!Z!IG_J0hEXNrr9^1%p<Tup|Wbq}R{qT?@WvHhnt$ zqpz)r=p`ktIg9VBCpkBJw0i8<^pR3h=Qm_(0xh)YgyU<q(zK293_{V~s_jz753Aoh z(yfAnbJC55^&jqk(P-qjr*%H*!Q10^@;k8R9!&mABw)wx4F@h(87yTCMBa*l-1VL1 zm1vv^6H^l8o!(m=uO6w%mOq!d(^K0|h>d9Y_ZDAyGA|E0=4>zzz$pC(gk!xrDN6Ft z{&;$I|N46>WK-;Llt51Y@+GyZg@bPfm1r%up|fL#S5TJe`e9gGKaSJJBe2A;o*hT? zVvoDn`BGHQI4r{!tSt^T8+543sg@;@jcQvVf@t#z$<bJyH^)uG;XVRvMq4mDAPXRI zS_}Y+BNn;KV%;Y?UjvhpcUvI_bP%bG^Hp<gBBUh4fkR`j*w&UjAT2BcD`>G`h`|`q zF?V75@|bAE%cJih@$d8bSx-B{8$XZv<eL?DEPOod>Vx`63Z?c7H-1v3%zhY0C^k;W zJ@rk5L);xE+GHOe8HI6&MvdnIR?j$CuQOk;bbJ|OjYMB5@}5KyHlWUcWJRDyb;QLS zp%mKal%(sBsOzOaJcxFU>aR$6TDm)y*J78Ww}f-iVd$oXrDbgZ?M}Sr=r~;<D&R=9 zq5o{#x~wGFjGM#DAZ(u^%UINgyn&c6Ohpp3;ULc7OjZmTZ=F(#qfmIb*g{LdW;r(V z;>BO@*Za1mJ^B7N%m65p&M*HV(*+g<K3F3Zz%Af=W95km>D2L8N{%;p&L10u_JXA~ zPJ_vl1J6vGZ>CHRGp8+R6~oW?%>r)OnpbGoZ~0{Ajm6=hk&6opEn$fTwy?xPaa{-L zoDlw6woMXk4?Z+^NTcPUEhqKd*LgNMi3=0$7Mpz9I>dw$&oy!D_P$zLyRlRzYn?`- zkoV^EzPs->G)z@Kd54=Li#8m6jWuG>mBw{08?n#cI9xK_+V39|u6~-EV!T)Z-*TmY zh|>8q#*-z!QLqrJgN!YgO*o`+*ap6^UvD#D<RrsAj(BnB^UgMlP8g_1pYi(rqdz+| z`m@cOw|fqc9xW5^uvPp#-|2$wJPt3gB@&;0q|LWEaf(A~op^iFHOr9K5xcW=FPyxy zUaP|p7F~3%7G1aY;@afxrCNYb!vXfSH7$Me=)1bcZS$zUeFXl9WlfcegAQN929#~6 zJek*OD1(Lz6VSB_>rO^iw_%83tseXxyn${7FmMCy<YQYB@HfIc5`V+1Y3UH_H~0&7 z>o?YaSU<#_|Ndfq-TJci1?yARN39Q7cUreuw^%n>TdixY%dHL8YOB+FjdhN78m<wH zw~n$ptV66x)_&GVtJ$ixbXrbZPFcRNd~A8&@;A$2%bzSh%d?ipEe~6MXSv&QhvgPa zo5gEcZSh!YEiTJq%RI}KmdTa^eD5XOGQyH<NwCCP!Yl?0Z$5AS&is}6GjoUeUGtmf zH_QjjFPfh=KW2W=d@rs<+-BZvzTUjfyu#dQt}&OH7n<jqr<*65^US&C4D(R)Aaj3n zl-Xj&FC5}(#n+}UO`n)PFui3uVmfHrXL`=`gy|7n!??$Er>Wg^qe(HXFx8t}rbVVX zrYWX;Q?4o9lx!MciZmHb9PVRq()gM2nDKAML&lel&l&${e9*YVc!%*<##ZBXMz^uX zSZbVSoM9|7jx%N%hZ+-&u|}&=i|ZfX8oo3fH@s^&YWS1kCBsvOM-0C;+-11c&}LX~ zSZ=5@R2UW-W*a6OWWy*!nqjb^zahe4FcAG|{R#a)aG%Bh(Z8YJuYXp*TmOLm9{sOz z-^C63)%s=nYJG|RYW;M5p?<7BQ$Iv6>0|U3y+%AQej|P%ek8sl9uZ#^UlgAd9~O6s z+r)P9263I(EY^zU;x*zdu~^I#bHov%UF;`@i+T}sKj^;FeX4t3_gCHPx_!Dmy2o_) z>+aUwuG^$*(XG-o>Z){$byw-8=_csL=rVMvx&&Rc&a4x(=d@pI|EcZJzO6lsYcwxt zpU^&}y;r+cdy96XcCEHayHs1IU7)>EJ4riUJ5oDbJ4hR^4bzI6PR;k4e``L`yr+3n z^P0w|c}DZ7=044K&25^SG+xb0O@pRVbFF5sW~!z@Gg{-&q-X|eqBJHAFPs%l37-oe z3U3L277hr{3y%xG7j_DF3O5Va3u^?AutabQ^M#qhMBxe{TNoxJ32}l=(D4`f@A!Z5 zAM=0b|H2>S_wrBkf8c+||Aybf-^eTc3cj9q@r(F5{1iT)&*js3HY%ev1E&d`o+CGr zn;5u}+{i#1X=C69asvY!$wmgQC)YF3N?IA%KsGSYLRuK`5-$S^Q5aZH)-$k<tYcs; zS<Ap0vW9`{$aM^?CaW1(MOHDelB{H41zEwsa<ZI(X41?+6KP_=Lp%()iJO6CWElgE zq>+IJ(!fAHsb`>$)G<&?Y8hBcmNKw}EMcIA)G$y@su`#vRSZ;;N(NlS#XtqAV4$3o zGf+m#7;q9N1Er*tff7=}z+$qPfosXN3@jpx7+6RaGH?yKhJgiS0R!{Nd<N!`c??`l zu4dpWauow}$y^5JkU0#@CbJosMP@N@CApG;nPesdGsp}ErjzLmOe516m`bKHFojHE zU^1D^Krtz1U=o?cz(g{Ufg)1GKp`n)U;>%IKmjRWAfMzjAQPE^Jd(%2cru=WE65cL zj3eV17)!=7Fouj_U^E%cKrYE;U=$g}Kn}@aU?dsIKsL!{Ad6%%kV!Hb$RHUEIEaIR zbdt_M8cAbd1R24=a59{MVPqHsL&;DEhL9l)q>@wyQb-B|$t0P9!DKK4c4B8>5E;Zk z5=mkpkt8x85s85WlEA<~GLV4*WB>#GNq+|Vk$w!slXwQ=NE`#PB$j~~62m|=iDn>* zL@^LaA{mGv5e$Tra0bFi7y~v!rw7=iSc#PZ3$ZX@CT0dq#KeG+7#T1S0|R=ZXFwz( z13IE(Kufd?Xo!XZfd~xX^L`9)gku0#o*BRyn+l*4IvKbK7a6z!7Z^AX=NUK$=NLE( zXBjvHXBapQry2MGeqi8x_@069;5!Dsg>M=72EJk7YxtUhQ*erblQ?If`hgR0f`PB# zD+c}z|7PG{@Gl0wgfAKR0={72pYTrxK8Md4_zXT{;2-c020n#P8TbS~Vc=u<n1SPP zoPm$vBL+I4gMkm>Lk5n)F$O+>4;XkK-e=%Fc#na<!`~Tr7v5#y9e9U<x8ZFD-h#In z_#6C<f&YR3Vc@UuR|ejMHyQW~{Dpy|aFl@~aD;)waF~HV!=D*A1cw-S1KwcZb$FeD z*Wfh<4#GhO{sezw;8l2)fmh%a1`fah2404j8Q2f|8Q2H=81R9QfxWPoftTPV23~|0 z8F&F+VBmRpo`L7!IR>7EXBpT7dl+~Io?+l=c$$Hy;3)>4geMtz0-j*tad@18Kf)gw z*bTcGcnlt6;8A##fj__>7<dF8Vc=nSn1P4jAqIXAzh~e<c#wey-~k5ihx-}05AI{& zcknv~eha^4U>EFS;9j_wft|3EfgP}efqUQ{2JVKt8Q2cn8TbwShJm}_E(W&2HU_rB zRtD~bI~lkG?qJ~8@M{Kchuayr4Q^v#3v6NFR=Aacc4%kd7Py6ho8e{#eg(f`U^8rH zU=wU&;3l|<fg9mQ2HK#Ffg9ik1~$S*2Cj$e8EA!81~$M323nwn0WWwNP(Yy*AF_VE z>a1I*I&0Ue&YCr<bKP~SvwF4atXicyD_5${iWRD}e7Wj0H>*xllj?Xps^fO6&a!2y z)7Ypw4GpSOU#~iKb*fWat2#@Us?L%ns#8;=I@Q&xQ&pupm6fXFa;Z*5h3b@-t4>*& z>NuUMQ(CGzB_*n}c(LkSd#&m$TBJG)7pl%R*Qm~d1*$WDzUs`Ir#e?(tvXj-r8;xx zs?MA_sxy1G>dcy@I#*t)Ix}ag&WstVGaWbILnTj}raDuns?L-tsxx`A>J%5N&ZJ4I zGjXEo6cwpXVWH|wn4mfZ1*(&uuR5}<I(d1jGk(14Tycf!j2ovqW5=q_m@%p|dbH}~ zsuNx^YLt4GlcPE#N2*SCw(4YMsZM65>SSc7j>Dlk>FKJImZmx*MySs4;i@xinCc82 zsyai4s7`9C>ZGKoPI9v93?8gHcDw2f8l*Z&Nve~Ws5+9QItdA?GjO2l3>cs~{rjs< zzkaF{AFn!bajFv=t2!|;suLZpI#E%o6B(&G5fQ2r9<DlJVX9-ZsgBjEIu?uSn9ZtV zGO3Qys5%CN>ge^VBZ{h{)2WVDt2!Eu>Ij1B&{dm3YPBOcOr!7r_pU9`lh6^;Ku7~2 z4TLlh(m+T9Aq|8y5Yj+M10fBBG!W82NCW?E8Zgid^*meh-<G>jenJ`uX&|J5kOo2; z2x%asfsh758VG41q=AqILK+BZfNCIg|3730Aq|8y5Yj+M10fBBG!W82NCP1agftM+ zKu7~24gB|OfZqSlffZnV(YnqmTfVZ~YMEf+%r6kDc`d$652iOvn@kf;TI1`+wZ<&N z7r2vOivAhBEFKkW#4z2futK*6UL{xQuFw(ftJ<5iV>KUX?$9jIL<@h#cd{1=68`~z z4`0e#xIc2`ToU<+(2Z;Gdz=IM{AEv1b5#|7w9!>j(({ea-mf;|M-jOl#rP@U%b}wm z;iN=&2lU0!@`k!P7k>HlN8ga-?!wPAMqG|K>c=FhJon_|2Yma?)T15s1GMV*EV)fG zev&kB2KL!W6oJeNlAvZKe)O5<Ve@ps+b;+SdOtww_mxmizew<ozAQF}!;x7+zq?$L z>B!7*WI3`+GBdL?sHh{@2XO=a;H=-bQjt8Pq^7>63BM^y8Pl%d*9I;v{S+?Meb{(@ zeGsuL>T2p~^u_pPYfa$s{nSltWBFBmW}u(w^`!S0@2|)3D*}w$T@P;$JlQ5}AylO; z4Jg-4=HBK+rKk;p;zwT{zGEDJU4WVIt#fnO_iX!Uhb#+zM(AIFOBM*;tUv|nt$P1U zWuf0x?t2^lA42}PrZ@sG^2!ExomyU{fm>R46^jTwS!Z|sDhZ@|G6nb-P59+@6Fnwh z6Og_9M0eV2db8R0$@^$}KSkARJpP%jt`xk}`)r5*J1?3}&Lu7Q$P&ls%+a*H&1w+5 zCBIxUBTITD>FQidme+V{%4%wBnpV;Da+eF<x?e86>=L)Du3@?B|Cem`FPqJ*|6h6| zf7#Oex&Ak2q2L|$%W3nHo_N&djuE?CjF`)<wmt1f*)+i$cRAVhuVB%EG-MuEd1Xyg zdUtobn0>dtua%xf_PCmwYU-<K13acs@ES>aVDZ_9(@Uyd?uMn!NHR7UA^bEjI-76M z_f>{EXT7t^g{cP8g!hd1dxkh$0~y}+MDJGnok1nu)9P0RH(B}7KxJD%<NKaG^!6BY z0~+7=68v;OQ5n$q{-@afmmy0=K;!$LA-|+m$qdQ>x|<T*1G4Yq`yO$6+7D+y!_=Pm zeszXK8b}O`hU-D|n5L2ZiL{Yo?nTbaP2@Df3E@$pP8iC6#NWYR35TrvafKis_xIax zS!Wq%K8<_vxy|XOFK`#VN>i%w1LJMRX+{Bexob8!^q=c@>dW-;;+x_vVv)${Ue>MC zjn$sjJ_XnFChZFCXw7$QZAC5aiGtV6r8j%r>9q~z&f4_anzHo9RZZ0m^;v1T>7JS< z*N8@E`BJR0p7intx2M|Wte{hkx|)iLTGtAvo7QCRDmDu0BTco_UEyj%x(eEeH94DH zb<XnYntDn_9@Y$ljJ`^wHe{^v>RZ}QPgRZERhjNr5aEGXLeD(EryZ&Y#0-0)ceg|3 ztO@9w@Z~OdQ%z-!zwqSn7=9J$WBGMw-m|K{9950u@9P4Msu~H#jlvm7LZFe$o84|) zv?*z-cB2)QxK_H#aV@}&bdeJTudc6!?r(;knyPvyTR^&+waI-{Ww#BYi@j;1yP?cQ z1tGr=%90sNmAj$2v6t!rHtY#ppo$t#le?y@xv8c>T}*g_H8z0}mDN;@?3LxEfb6VG zIh3N(?OI0l@=P!UezlDJP8}rmF%MmajwP+O33S`!qP|)i8{A;)Qh!M`H%$nto_BZo zoFSktzo(*Ky1c>t3JqN!U`}Y4<zMG@SMcitr0^>UE}+;Y70xDSnbYGc!4?bcU>puN z^}$rs3Rk7Gxt1*x^$W<B{5l<4rqmeY1F8`I1l6wcrRusxT(BAOQzeO2O{$MJ-BqcU zWAE8juU`u&8(s06n<{gA>-A%7MiiI`&Gj`@3TG|$!me`G0+aiL5yrEm#?vdzA14W3 zYoCpyD?gsHa?g(%PG68b$aqOxzEAC%1Jg|%isPxHMz%W`DQNT`<>t{Kd48Om#{;t1 zF74JjaiW;fTSR{drcbJM)>kz(yO-8@s@1s%)y~0SdRvvK+F8@X@=7qep)A#|GPi3* z56`Os4P$$BQ(sl(cDa`J(7YT>ZKC3ouX5Ma*4C8wFzpX!7(toJnro|^?iy!(57mJn ztawRdd41DLT29Xf(L`aT?(X*Y1Y>lpaC(jIPr;B>m1SmSWcHFgA58niNV+rgbU>rb zE-P_0mp85G6=N^EEf`p%qH=Ug@nn!vEOqxv@j{SNEOmEF@l=pfEb$xQKBwMj2~ZWD za@M>)5>ysE<-JOHD468yo7sJf2ZPCfdE@Bp(Y*q^7(~s)rGQ3f6Rnx|(dYk1!Aig# z|2JDFS$WG|OQU7D`3v*!%nQs>roWgrnq=c?;}gcE#$kq&hI<Vz!$91ZezU$v&xy~8 zjpA_K$GWY$={ipPjJ8pmsCh?ovu3RDFX3LHL`dY{<k#_O+%fJZZag_j?k2N|5e{H- zFlCeg-nc%_8GA<4ZdW>6xuf^padcg)PTY!ekjokbSGhV8>s|&e8W}hZPLFEw{=c&l z?>@S5ApvzdIU8wW0+j~m3F@@g<v+-tm4#F(fl)Dun%vHM5AAmw>eE$>Hx|@8($g}L zazJ2|bOw~(r7J&T%<Gg4WDBMgyV+cIjVPsyj)rGDkZVZrlHr<mvm0;A;L{i$I=H2r zGt!YW@fYAM_qgexe@5Cb#7Ac{G|wY`p*;Id2&NB5&V=CetoHdOtbkC&al?369~fIj zS-NV47+W5S!e|1H?w6g(Ly#fh>eOqn-E&72W_oI{n!%MpS9%#PLAvTIJP6dno0Woe z0oG1dl`f_8%WQEnQbq-)E<Z{?rb&a5DIypq)+Uxy8EF-oZVy&zjL1nB`g+Z&Xb{o` z*jBS94OfBPJssENB&4|vt8lxj==v7DhdVj(@~G;txuGl5luEihD!=lZoDd|HU;o%; zr;`RERe+|zRE}D5t;9QYwRq16vsW+xiS&WlR9D&6dm3?)j~vDQkt0A0$E8Rdu9R1& zcLP<LiT#i%EHG)h3H&?R{CMQi1;(S+x!z^pqBx`o%BbmcXl_?+gR=s4Gcy)x1_dSw z)30Bz?4Px~7$oF_A*^X!o`Vt<MF*R)%I5lVI{Hut9b=++xUP?4bl)H7UgV!1i6Zp1 zJL``8^NakWBY0R9peS9pD#nMSBz;};?3To@N>2>K_yHO$E8YrMquW)kj^?mXCfJb2 z*vC9{4V@W}tDfENLXwHr;Dx~zP;5JKN{T#%7UVGpCX8BpmOE=}uy4k7QDm8HMwWn^ za~v~Q)i#tlYfJo|MJO;KRe+7ukC*8S@Oz4Za;OXB{@scp@GP-X!U0%wt*eAK3T#GE zh~KadO2@91<*r6r3#pD}{KjpdLoqc|R68|vW>cUGQZ0U!06#&{_v-vJ^FBYi0!`o| zspjX;Aq39BN~(7meFA>oG`KqHC&)N1;Gwo(>}<kAL%`3!(E0yp_!U^6wXU*`wtQ=O z+Tyl2%pc<y_GXz)_^rG)Q-SfK@de{5V~*jJ;Zgiz-9Y`@`ZoO-@mult;$m@t?p@uD zx+}EbY9G;7YWr!9Xx3}S2;T^Q6lw(r|26*{ep_uKui*}G3YSg3AiKyS5(|I9B>(d$ zXbiR_=%b)c^~O$719Ak|7vsHubs9?V*EP9T(sr$&K5$WbXu1Yog>}dgVB6Tk;i|7< z4<k&hMV0`&jUE<1`zT(DJOPfpx_O$MRk+H54@uO}d-hY7AX9*|{!5trq$;REt^k{B z^|{~l6*U!AF15(>s*xk8VNO?J=T!wuP~B8V??~oW^01<hoghBgvO2wKb!AO0T>;2- z1st=czOn&h=2Y<D2_(&0=W06N8CTx-Rz{Wel3rv?S>K0pYHYu<p5R0^2Q_eMs;P6W zZcv}ikxP*zz!e2%Flw8P3MeW;h5%a##!%MKTwhUH<Eo{j^$Cju&kdvTQ^|~LktDzc zDqLPs*JwQHswkJ-mY=c+`2wt(y?m~fIL_=@Je#}_xdI%N^>R7sZLO-VwY|b?kSf5I zu$QX4;3h6WmH=DAUY6eJ+NAl&6X1lnm&dR4rp!a40JY7gjxM~rR$H^0KE&45S<JW^ zxdOC=|KReIt>7x;3$S6WZfa^wM+<1g5hHD!^5!B(Pz@_(LW0S2kRU)4VnZvsY{w=U z%_tD1njJWmnx8s+;-d!Nh-+eR#UWMUETjt18dX)(Hrta<yE0^%b|ta|vy#qOnj7f= z--XSI+7C>hiEMqH=K7C|{n@IW_4qs_U8*UXfph`3aei6su5pFaFH2Khrd>P@Sppn+ z_zB}@)cI49DZsTFW>4krRgF!w+ng{3DT3;RXl`(TxEx9HCkHMEtE~8_Ae+?X7Y9z! zRX>+C<J~5dLY{;a0d|EdMR`NR(i&R93nn5%FpY#?nG_ZwM}W17K6#pc$+%*CA+q#! zaix1vgR*qlSiywAbD~P&my-zv$Pu7vV85U)zB$#^E>!8Hd?X35b5TvBtMc~bXp(%n zM05=bC7POtME&|WQuJ?HdL;7GkvtyB0<<~$_+ol_Z4KVDr8aj3G6ZOIDubUC<Hq%U z3|q0}$IlN=7>g1Z`#M$bdRK-iruTJ~@neuA(05+^)~Uvi4kEsv3W{<uet<1JYYOo` zN}YP^oOY{p{$CBBg7pXMzpS5F|6+a3dW-c2tIJws&9Z!NdBd{Il46N7pD@2|K7wlk zH<~@>QRZQ$Gx*g1-KN`3)usieWaGQW!^Rhl4;k+@ZZ+O)Tw!c578=JIhZ`;!-ZT6a z*9>;yt^q9ux52JIqW9?^*59RHt8dmX&`;23>xYU@iGL7V#F=7}7^^$4`$qRqU59Ri zu3R@$H%^zWi_;mkUuxgNZ_8I}b2MLTey6!nvq&>TBWp%#;)P0nD4)pvz`e^oPX0mO zA<vUWvVbIEhWwAQ)dJD4tX_BIcouqZ6@UZ$;;{`#&xa36Ar>H3tN0X<WezVXCI^5P zk_Z`Dg^_Ek&Ys>jUhC_ev~dz%6=eXEuiehYf{7p{M)p5QVyiBy5~B^TJaB(FCf0Mv zlU*93_lCPxKl1Hwzz+7N3<1BwoR0yD9de`*IFW@FdZKgzDyn)-y+UN*`c+^GxfK>E zMg}6-lne9b^VJigA$2MI-DWDsi}B^hw-PvLD)mk-!(=yvmvMXY9?jc@R5JcoK##xl zXcZ0}y?*fTxp3-HteEh(5THVYR>Ky1zJjOfVL#gWiyh~JV_HuJJ27X|oX6iv2nSx& zCt`^K-!3auJqp+~LOaaXTxsZEiowQ|evfOX&{!O9Yl~>N$z1UkffhPREy1g^OTK@D zmmMH&0WF$Cp+l5tHU%XEv<_KW2CWAiylyduv@JevZ5e$n>af*)?ZtCDK3spO9Rqqy zod>@ie73Xm!uw}6Qb%5*B*`ntnCPR)gmcI|{QC#kNhCP?T?@5=^PQdRo_X)FsJF7; zC|QiLlS@-ULVug0DFNtDyd6(8kNVa)&a%UI>><OW53P&AVoHVke$aw%Sjj@NXX2r+ z;vBN`vt9ov+BLJka{RuRFg7TigYh@^?A^xWr*0C@Niz7xQ-9ca5_YBye9Q)zIQ?@> zlR2eO**AoK>^p2v&ZqMwv}4((tkg)vw(<%-+bSvbyFpyUElw`5r7IF}#gGW3VVkXx zD1&zkPx~~aU3q1B+Q9UY8k&SeEl5$sq{c8|50bPCNL*AbV4BZYDKD)l&w`HVx+%AN zGZvxlTFMq3%NwNZOIbr;@)mo$-D{s5-txqAG4F5$3n_~zC0V>yLf$MW)z6phdg%~A z!S)tAHA_y5ISbz-CrvgPxbO+*IYlYPcv7P>7!(`7cR1NPf7jZNjAu3%hi{2BWE6&n z4};<@q6mcFt=RP<rs0SdrO8`?TO<jj{;_u!1M0X%E?b23ThLCx)*hR>1ttR=C?jzT zvEZ{8ejU5sD<*-X7)xyBOY-(7+N#3z*WjhdYg#@a#Iyim{DNyHLQCmF-ZY<{&A*s? ze#gE}>#%uvHh<om?!(&t-&<fqzqK<DoH*SgiTIbr6~`(zlnq-GS~^nP)fhPYY7RbM zlX)}=KDpcOn`#qUBNX3l)2^azM(kA=e<-QkiBj@eie8RD#kUutsCd|tup~f`^ji+> zw6#@2yIs#4v|0IO25Rg8yJb=ty<yt|Ve2+hS}>Qg33D%Qn7Ola1n&a}nBZO=09pqP ztYAGNvJ3(c5oGibCE8lj6wnX)uY~rUjyWi7*__H+{T+YC#$qb8OHw|FrnD!04;b2P z1X{^Su5$-Te+TO*wA$N+g|lg@IkQ{#zLt4gR#zj3`TnUxl!aIk8%Gp{Hc<q8ZBUlv zMRCv%<)jx-AbP}l@kg=FLUE*79L%SN0-%Yw5<OC{EQ{f}$<VG3^A#3ujU6}>J;%@7 z_0NoLim#%=AYzt8LEI|0gh_aBL^RF7>+v(Rr#q)hHZg8Go@GzZF&1wjm>O-D<!~w4 zeygoOI}I;crWwMfqHCY}^<kRoez4j9hYz2EUddBbP32t|E})os11F>3_{lW0Coi~X zw2Bjx5Gnw3q1X<oVGD~@)f8VmeCDpWOe08##CV(i(M(<HR8BzSut~WS^J8+A=nk!H z+KBor#ONY;<uc6yg}}L(2T9|#LYUAZCMC7urBa(R4RCO<WjaViHwhEBP1+)e6A^?@ zOzud~6;ZFEOg_F4K~CWpmdPiF6<IN6yS**kj^&R!7bno*6ZZdh{jdT=^9u|qx7!Lt zo6RPYb^<05Q-;Pb<=m%hVnHE}Z3>wq-Ku2dW8jMXNB4fMwhzcjjoXIe$P}x3QC*SR zJtm{rhR7IYuDm$mjh*Th{Fzp;|J5ku$7nVzB&s>IdTasmFsLPu^Ngn&s~msv?IWG; z(Xr>lmAkQsV$*1_(`sl=rkJLTy|^!C_r=cNgE)Vd58EovE1%aiYZbi0(aRB}6wvY! zVyoo<Upo5XC9NQcHc6J%GjN>Nh*x0Z;a5y)O)!r`)PLOPr#ipvyajBLWASw8*e9nA zK}lPtts6?CIO4~kZ_XI5G;&~m=gXb9tUsG44%A+?Z`%zIaN5y$%`%$nmy2$0?(t+b z5uyED=U(hfI%m=>@YYdyQ5tnTJToG7+%8igiO4~Z)SRJt$9)GA?8oRfN_z$KNc8MK zl8Y-9Y<l6rIoVV*$=Tfbmrk7f1^ya7e5Q_{mPJWpvo4;Exvg!6wsesk{+E~EenYwI zfmziPx$!S*OTzdEzuL7<&b_x)ynhmhWkIfO7bK;Bs~}yBQ*OSM9NmjI$kbZzvt**g z12Z4>94>p~rl@|zfFmG%bjCx?=g*7b4#dfh*FXB?;IiD&Zj(Z6#E?#}r!P6!7ONeU zhPXKGi+9`eH=5!yE7GbCE=WESmSK7scvGyy=O{J7BJBtaWEsIp!_h4me(cO=<Pjf_ zg)4JtxqgRk#4rr8XxO8pvgjfF8*4zyK`groM|D@lp4fEinR8R0PWf%ZxA2mAC;2?Z zJQRcXAF3VinjfCj>d+0rQ`?Z&*A7WVFgLZna-$vc56-;hV@?9WhM(9b3L2FlOESoc zXalS|+7t|GN#UZB(H)-5DKk>~DU&v?ZQW$rVh^{8gV8&D@LS7>&W^}tUy`94M8Tld zBrFMmJ?ZuHdDnvPnN6P#|LALLB6>-QYtG{R>Lll8k5-TUnm$rW>imXGO`wGqop5}u zR+_ePo<S(uTeV%v_+j;X^hGxHI5;QWXjuQ@{uhl#j(b|?lODW1ekZ>JYwp41zeECd z?A~zTVwJ&C#z5q)7|31USzd|8nJ_UWLEh=T)$!_)nr!)VnL9nT{e;+vhJSDIl_&G^ zpkvMk^8k#}e?U0atCON65ABbqSNE^Kr$RQx4#(u><S$=Rt6DhtW>9g~avM53W_Sf< znXVs(we{mTZ9D=?{OZ|pG%xnJi=8h;<&48JY{90%q2_@ORXNqNM6ywBD?|`&J|Q_8 ztMlf#X*k?RfX!$NW(Q;eBu<L~Kykz(cUi3aMCWT@Qu1yq#DESWm2tjmu1$oLWH@kW z>=oPEk_V)PMPLOj77Q^MBRb|TOkW-ojd*$VJtY2pK0oVeM|k7sF`s<1;*N!nhh2S8 z|45<Ke&NPXs+8Fe;|RsZ3Av}fiExO!!$h0x<0GRm?ofR98({T}gY`P|1xv@5G1f@* zl_Kv+6k!AE3`kZ4dQ?YT%n?eVjZR6r4vD&6`on{0*QoxAgr}vuV|guhIeJSt7afLf zT3A}v2GH)rYmSc71)>6uR2%xwwyn!bg3S`)We~Pck!37uL*78l7p5W!+HeqOa3(8; zjJHlH#Zf3cTx_8wV6z;XdGX?}_v?Mz(w=;O8)g8MN#~dUkm&-80w1gq3g8y-y|MB{ zgmmioD<#JpJm-%MLVLl|8mGbJ$$@94%{NmfhndqBw2I+p{AK~SY|SgQ>$iL|^Ty(E z(8$Gwg_f|y0$W&Op}4MtbWR9=E!!rEwg(@YJEYO_(3X>W?(008oWzBRc8g6uZ5?7l ziRYTQb$eeet=(8EleJDGQOJAqdEec48yco6pS;7(kwqJhzQ!6c=t|={myOtGZyYX} zZteGv30FVOO)*}qfN#0dKSb$#8so_l-zZp!)j`IV%O)JsIBWx7*sr%4FmjUN9!I>m z^Lb~RMJEi@qtAH#{?VTu8vWVk&D%YPM~{|?ci1X^p6_(Qb{>Zp*b<3PKhoygoH)fH zwNAV}>6&H8>xkW1x))B~S+CV$2#YQ{SBtJ&dvR^@_EIgtr{Mtm+M1R=dGuXf<F<KJ z-#!9=#ImMJ#X*NJVFSuGRG!RhHIzZag$d}|g>@$*tJ|9P-+|q<q~+-)p3`&aMsh>< zT}O08(CfpuTPo=Me>%Ji)&^^pb*go&HNmnK-vF3uiM1HaXUwO}pO~LC-)p|ZywSYQ zTxq`ATx`xYJMgW5I@4lPwDC=2tkGh4*WfceX}Hg@*>H^k^vCso#kc=&)Ys|D#UY|e z*QxtR_pI(Wx-#7iorrq?yo^r@?9g7NEz*wBCTU|eCp3qI*Z5bt&$yM`RPr~nkK9L! zNe)RS5pWVk3+{;Yjube3Dm)dwf1MyB2bwo_L6SEcy=8dvE91Iv&K&z@;3Ee*jCi$O z*eI0$3vE^6Y~CykBEb`nHuB2&_DSELaG1TB=oJr-=kQo6IN<bV;Q2uKW97ENcWga# zt4Di{*P-F`-b~od?Y%e_Yex9W!;rS0=MRYT_eSMIGO{h~^NUX1jtiWk`}^h$oBh-q zn-p&2uRq>l^fg#kg5g5vb;ml-mpu0NQfh7hEB~z=cD?n{+5A#XoHrel%Y?^Tsv;Mh zpV)7{Is~MFKo0Y!;k6`q^!T5j-SNTwA5MW%!Q&l4g{go)9P3;nNT)|_d+Z`sG~KD< z5B~7%fYBF!^C!E<oQ-qS(wM))x)))=={Iva_^<Y^`0846`k2wDh1$>J9DJoO&i76E z*;7Ty?MATO4;m^L2a5c_b^Dsmq$>s>GoLj<*>cC@_rBARJJdTIC7BD4aJ%D9KDc+^ z2d0kftlOq_0Q_38?MWlNa`9X4ki0&#edgb|TJJC_;??l5+CCuh`Daav87i=tlqmTm zKQPK5D|g~Je30FT1t)<Iih0Ej3I@e&tG{&A?fXDqs_`n%?^>B|YTSoC3byr7G^+yO zD!@MMN-aFH54_%m-l3S@hHQA~tIn~7cGx-<I<`G?;Tzq~0SbIe;^E3)fjn*;5T8|s z$cN5-xB3T-;=96BH{;r!+^Zw9A?t-0(zN4i^7-Z$9@d~Za>*^jJFZ!O?9U&39X5Xv zCzC5XBjEhC6VJze-ux-qx_8}LY?SyHU%M06bU@J^UA%PY*pI6g?im<&^3ihz;C%k$ zyv_>_W!|aMkM{n32N@yDusRa<Jqyr*-60(>t5!hs`Q#{6%FbWs1Fvw{5$#`~8nY}3 zEg3_ecyVyTy{+E$-XS!5YvA`U-E#1oGt=xHskeOd@xR|B7dqD~;y2igyqlTbPgR<{ zt_A0H%T_!EzRKLf74?=m>G`HN;LBqJhSn0FW%1*08Itgwpr{lzG>TGcfK`%o5PMq5 zr|J0awY*P%&x6wP%3}$g@yfaDy^y*c@F7hB3Y4zWp;m&2jQ`m<pOy)pDV^)iJb*3E z6+2(N@ah(e?`o(+-8f9XzbC_Yg!^`sY(2^eyQ3xL83Ls`*z@sqIIC4Qg3<BXsFF00 zPDSp#caF}1YyfL?xa{Ub?cz`iY%;1Km8syt<3F6<@yQdPb-s5!926mTaf7^Z0>pCX zI>+8sYQxGUHxi`?85BVR<@#tuL^^MUk6uJ^&*Z^lJJAQg04Oz`fM8+c)USa0(ats+ zG?04qr3lXZeCZkTZ4~uXpukD0Y7MxSBP$a1!MLgp;5$x~B%1lpOJVnh-RWm};}a)O z=yC2LrbapxZ^i+fZVPRYUr3cC#StyU`Y<KgE+%pkdifvBBxu0y!$+mVLxh!_<W0c} zD8mEwQ~u{d5y!vdJ94q^nY?+<5A##6wEZ<%IA~1vCS#CkaR0^Ezl_@C1-RqOt88Jk zBM(#XNA8F?D&YW2;C0@?7|;UuaZz47qM`7+v^f}paK+Gyu1yfVgV5gwzb)8k_9h{W zhh49K-LMHO$0Tnet=zb*aCSrqv7s@`pwE{fT!KZA2H4&z0y*`<%4iAlVu&n?Qtk$D zh}`w1D1-=y@Gu=ZbpFH;V(?1H90@zQd7K>SO~8{>*ug<+BFaFI@z9p-9f;o5aL-qr zMr|REjTH2kWN4AG-{r^+XSvc9FHd8off<mwVvcJs+-&p?z-ZBM_x{XEj+@}^Pem4B z`}ap=$(H|S>;^@W3B)HtD=8&3DO?l%UCz<*d^TLTMrtH7kU`+{ZIS?2{nX2#gn9cR zXA=Bo=vZ*1#g@Oy9p-Yp@#t3zcfAz15lAZ(7AgcY2_h$Y6^TaVWc<105NtT6?dOfd zh&izB`0Y^=Hi{n=NEqvWr4+uuVgecLjm4`|VC(Ti(6|p{bGLk~*aoH*3-Za~YepS1 z@j}|r0t4628>6z^nKZ${!{f7!_axkGTY1Z8M;1HwT&Fj9qw#7a+|hFKW)km>!jo+H zbxTp<dGo&O-=~Is@cKtcMP;S7CC3|y8fskvw{sWoT%UZW?E53&0$e*TK`qo>zuxEV zylMN#8=v#8BBJp8&fOQuk-~HP*E@0egomvDvL6Xno#wiWgL=u(*nQdN$bD=mVDkbO zThUC^dW65?Gdn@)*!ay$cu5`mdP{|ymZh3B``(rXhgKrHFbszKwnTaA{f*Z}?pylX zey~&Mn0o$09KH$)_<oowXiaS$9Y=8R1WM@|=nt_wt{Vo6I<?8@13mKCNoD&U;XBPH zW9!`~a3VW!=S{6wuT%|ygMzII^Kh1ffpI|Y3VZwqeW}R3a}+MdbXf>ZY;cEO_MI#> zXp(_k2|l9pMxa_PaNFWIZ#be%*m6zsWRVw=w%E2~T@yu-BSNG%46miat;@$9c>){7 zBa5ULI#vyIcx~ui3hm>0j>q}%BFXk!Syr6+icz{T{cwwCaarQ-J>V-l{A})LrWhlH ze`fMpF-k1lau=txKx99!1y6I}=GE@Qqhp|PSz21hb`ROU$wNNd?wRK`Q@bAyzdE++ zSXSzA#keo|L+_JvJFdsRnv4y0*6Rts9gyC!WY4p{0dhurOzvmf!?t^LlX7<t185}R z_1yE#_DwOM#Q5TDVBZ>BzB$Y{8ky6*CQNrRY##F(rx@wlJSd~H22D78=+NHhPk3;{ zI0@A9)f_ssE#@RwSsCp$VvOOi=^ukR1q2eqmF~1@4IgnPuR+bxP1>Z^vtOC@UOk?M z!;P6INwgR1IL2u!h<mVH*|cWXvSQeo?a&IDUL9VjfE&0EC(MvrS8aSI0~Xk1Q2uz5 zXq2z6iz;1tVlNR;1O;rlU@}UwP1Jd{7|8+~3%ogA4JxK(30z-xW|7oY{vg;fLZdbJ z;lG!zJ(HL4RHMTE^A&Gu0ySbvg+{2LD*+C>aZtGmao2I%MoFM1Dq&Nb2&pO|y@cHZ zVq9#cCnwRoEqFTyz$Z|POr)MTBCyimSM>_Wn+05#_inpq>|*d<E7%o-s0imjRdC)$ zg9ylz?-gi?BFn`$W@ZW<*${rKPc_(5S-~)|<)Ag;qAwnY1cw;LBnOg&V^*J{*!pAR zUgX6mcJ*GIitg%s{leqhKJ6Gl!z(C0uE@X!5r4W4Yz74zc6fM*9OeUi2vP=6ic6?M zsmaTsK4YOJ90Uc#XfII<%gfchT8gXAxYmzRPHR%U$zGt^o&w78&haOWN)@JeGJVk7 z^YB3nA}BjCYux$gq5f-wf+=hVMeaZ)ab#zNyoSR++si2ej^7f&rw9lC+^JX9pNRLW z@sLhV!CxOIaT5t-oLW@;I|Huf;(fc1QgBg7NyGx#3iwQNBL|5rTQZ83OQR|~P&={Q z@Wui-v<L%o1={s=F16lZS%>bxb;+vskjAtY&*RrF=4eACS=P|2Yup7VGw@!B))svo zo~K>+{nQKT`MIwMf};3-c&?S_wX4zJvYNB3qTyG4e??sKAs94hkbWheN3O({Ne)|q z(7xiUte1~PoPIYy&-Y$s+H&+-yu3bZ!*4z{FOo}+y}`#c^1Gu^cw9d#f}3cjsrc%V z5o>J5@UhKw;ln3roAAWabeGkGuH=Euo8!s~zz%}RjUMstFTVPq^M_87u?){DmT?`f zyNJTc*oO;}ltk|{6aus%@kDx7h=+jn$J^Fs69zS6l;Xx?{J9%C^XSqlmN=C_BJ>Ud zLiCc78!*s}hUBXDt&*J-;NloIiGtVxCL3phDO*S>>I-DWE7apUL5o<A3dN)2!tl;p zR-TE>usa+eh0Bz@`;ZlaH-Nx_Z3fyMUcok%U6UnD7T50WH%iLMC}oEUPw-H!m4lnQ z!x6Bn{&=a~$SDHM26CH-_ladLz7ECBseA6T+dA*Puor9R#<dYx+M*y~A=l!yfwiiD zyIUf{<CoH~OIHu^;;I8GI~FSeXELesXqVtM%M#9OsiE2GUvvCiUX=U~DApzuR1dv> zY{Q?5r`McI<8V<tsU6zhjlqS4Ya7vM#RHp)KQRjVG&|hVXE%9n-ZMlbw)6coTmi<! zTw&W{>qw8~6ul@zskh@yfmo_=4$PK<D?Y?f9u3?a$7$>gS?=+I7BDU`kiX%G%nkhO z!UDm<P1mm0W*Qm|N&3I(H|g`l6XFhWwy4oPs2ig_V12;4&}y-~Y^lcQ_uUpFN#nMf zedbzoq-HF+-t;F;hj6#%R?}*e!}u9FZ`@{_A^Zz>1l&VK>^&9>-YfdLKTproDD`wN zvUGLlL-qMP`qH@iP`c_>g3rU&RH_^D7PI{$`?eoMU+HV{T~T~if-AaO@Q(Q9Wbb-( ziJLSN_p!SyT6H5p+!{gM_nn)FH@#B&z{j?q4Ng_fP1X456?-9?s%AR(6$rTBOiX~! zaH+3e{pZdH*;fhPVSUJgx+UcQzZh#9==)2k7J&DIWK~}csc&jp)rgOP`aOpOr`bN} z!K?9-H{r<iKsN31&pGZT64a({e($UqgDt@Sd=1YWggB}#_^B3e$kH9=gVQYCq`jh{ z9N&<jTXfLUUv@ck)ZQ!b@lSX6D~nv?Wt%9gwU@FsT#k@EdG6U5w4UvFdzmWqD-*6R zklnI+?XyzdWu^BWBF-7eHdp__<1bN3v*2BNIc9?U$W~#w()T3OarfXXeD$&lpH+0P zDsfg+l&~i|ODb!fRk)2oLruB*I64<wCwLeBf~jWqrrNa!y!wq2lz`f9{AG7*m*(-3 zO^o9%rz4;?m(I2bptTG>ylgUjq8%SmRLS1G?4I$Ghm7Il%jUbJw!%A8vB$eCBk0*@ z<^Qqw9`I2WUl{1j?A_hFyLU?hgiwS{2)!iq9yTE)A@tr!LI@BDNk~F(yLS<30%8LT zU@w0Q_JTq{L`4)Uc0^IJARsEBl)N)@wgvRP+#BBSz2AFYCG+j>z2}}eGk5NkGv6WK z>U$s}Iz|CnY4S&niva7qD1y^S@2$TDsq(V?L|^M6G8ysAlfyMJJa5Zq<N}MdsARNB zO$^UviCtY#_vskD?{40=<&wg+;cQLJ&PDOgWi}5w!WE0l6aljI6(W}wtXhB8)K($# z^3gS^q+F%Q>hNPtgozd`yqlDKgCS7#8A}Mm7dvmiIbls95S;Rs@%RYISDkM8zxQcT zZe+%Ps7Z|zx(2&P<Y<jwF;({X;=n9GF;2c8FZnvxsG+PPJkkW;)z}1_U|zI!r)pe{ zibHe@<nx*|QKD#YmnVOI8;zBG+W6>;#a{OCpgH38A7MOJm#_bKCgptp|9od#$9Il9 z93vbK`yTsZdn@G&WxX<3k!>&8=Gxj>e}onOY-<C{dltVXMZO?EBo8xRGCymcYK}JT z1@6Bl#*d9_j2)z7(grEb@Q2}1L!O}yJIGYlgZ@q*q+_UsRKTrBe^^`6ye$wm+62d& zk&k{ltWMQnQz(oPfB~Kt{s36c(!5Oul&ZQF7kC*L@Og-Vup*{;ci>ghW(R}lW%=Sj zoW`A|SBaZhCaB!gd~Oh?amSX}qJ(=5d4M9wVn0}o)4T&ELJSQ01q*ftEZ^zdF@@@s z0f!7UnV?ZRtmtX33lSO>%ntB)4e)W6DvevFt}?e!57bJ7MM2H>4ok}qu!Uy8I-+Jf zg~d$GhxZT+aX_I#u&}6kvuRjT*_^_}vbj@W7h-9FcyuyhDN^$W&#Lm~LuZT^;V@XO z)J&>ZRn%2GhX=wMXAPc3o?V!k0QL(A^$9ADf>l!DOVl<k5mqs<XCFwvU<z|84EiAY zk%;z~>EldS8n?-Y<#IK7k?_`M0IWFHp#E}E5if}>ShcJ{<0EWW3R9E9dP88DQ!~j~ zIF~_Mu`;0lfa#t2qBg_ggx0Oo|0FR$1~LSePp^rFq1Jm4tiWCq4T0ij2IM&1$LX?k z6Cs4F+%Q<8t-;e4E)00)pmCYapWqR&h)aB}bw3^f-Z&oU2S|!b3-Fya3|4@ziKY?t zx-TpvYu@jRTPXSHF?WjCxZejBpmmZYlmqWOSS$-xs%!9kiHANr*p1JG73><cB9RSU ziq8n5H14)XhLcdwwXYABq_ys;Mj7HS68w04uzNu3uHy(PVC25A60KPgEbOUsadHr( zq`?BV=2v+@3Opi$fda&&_+W)npJnm&0Wt<H2N4<xBZ6b7a8G(>LD9_I4m@Yev}Y_N zPB2;UiH78*AVuQ}5Sk~uSaiad!1WsYT_G((!-K%O+MvbP!a_Lp40#)}2*hb*=e%0C zi1sIKAqdpi4aZ6i0jwbY8BSjfSfJfxX!7#n5+G2YUH}o-vdfA~`3h&>`5;Uq141Z| zLMjO9HxGnp+?gH{0-@hZb44d6b1sO{*c}RqsWR=GQ4W$cQZk^4pz94Gxwz2<U4CYn zc9l?2@CBL8sp7##o>Gvckwzgbi9ag+=70o^Rt`%DWyuQT|E^>=aqe_3b#`|A;&{-J z?Py^C)V|3+*e)yk6;(;LU9>%AE3&n+er>&-66;XfpX|2EmKQ8DEe+&@@+vvSe8&8s zImaAhI%HaH>TUeP_?U6Ju>nhvKA>MntLQCKn#2ryAQnIm_6K{K6_K0aw*P+6FRI&y zcqAU(Uei=v*$k-b5c7>2kxkPvF&d6K$onX>#gK|k)G-ScAt*>*&vhD;t|1&^U}Y>= z@r6%B`64bRO-I(Mh$(EJ#7B#)uZ}t2DuM);IG2>7V^R1jl9m+7XV6&Wf<8o4e$axv z(+{H6>XE?3<iWH$uQ}vh$ctHzlrRq&IhZQ>jCy30&MhhuGyCLY9Z!HTM}WDId<gb5 zR`+oW)wW1Nmt-BKDpZJg7xsoaR!6fI$l6(zoN`u8t9?QHZoJx){V;!9uO=!*WN&7g z2#~C)oeDleAqR%}I@ZoYLds?X16l!(VL{%ifrTR3;m9jGX1GHNVV^OZ7amvY06dg- zoz{lPDLfu5h*<_rr&G6-P}gH#4QgXmTC2G=$ySI0c6Ln+9SC|DH1r!f985xm7LXOO zLcgyj7KhPhVA7>nR~r&w?G5zziy&v!4hI`*$wD#$!97AFqUF~_Txj^P7}k~==&hPp z4sDhUm3&QVEG(jdS_ExNlwN@matd|yT_U<cfiOGdXB|ylq?lY-NawA}nVR*=A~HsP z(osVLe0?E4%~9~aH*2)=6`X&WkRz==mO{kUG?>G6y!orr2WIHCNrYk3b;!U`aCphS zKu1ncMzB+uqobWh36W#*g^(AmeL|EHnlK~R>*$@L4DlBy%*YBIJ<A9w{MqsA&P-^I zig<Or9Z-!bRLj{qx=$!3qM}XK@lp@PiwOeJ%V?;hu?z}`Tv%zKDGD;g<t$Ewb&Ft? zZLPy7aCud>%2dAo--RqA&KI0T&gPD995*>S+rP5kV$V>{D^Dx4l$N$1Z4cQd*=k$g zu`aWAv-}Ku`^Q+E@;-Ti+|K-?d8>JXSpjywC8i|fapN}Q2%|-MUGhu4f&2df!&pOI zc9?BqLztPqL<?v`atLk~ItKeV$8?;w0X*+DaL0yV;H5~DX8Fd0K#dFKL4mlvAnd}C z<>Q3YH4+x?DGl<C1z{Q|Y^!Qk#rJT4Zw$!OI9FO#Uc|%E&&TPfHBKi5rA5f`_&Dvf z#)&O47z_<*Q+y*qgvMnD^o$BcC`k5k;%SX<+Q?yXvTwL{0m7AFK9a6x`8dh6=DGuM z>%e7?#}yF{eEf9_ZE==wXbpu$6j7#+Q%!4}SQS}|2rULn#GqGSAE%ktJYNix2i(@d zsgyoG&N8i$W?U3juqjOOafWG)RYph%PsU{UIJdOMSz=+95KV5N===LP#k5A&^Ux5h z>bSU{4>mw*eJ(??!h`;FUna=WxMVEM3xjL$N6#)ODVxh9lK1y<(rLY!t2!1<_oZuB zDwsJj>l2u(N%QpsK^m7*Fn4^_x~!lmj}I3H`qDs*MoRafKCnAvS}st{hg*D)uP=zx z*cM_#HZ_0BT)tx|!<PyoG*(I!0XrDLKPN9Se`<kP+3}@-B#n=%sNN;H5Qv8FdJ+0~ zYN}6QFI|5hXQkFykE-TuD(nC(;LT8`kCResY|*Ze1*@}SRmI2IsWrX_u_je{JE!}4 zfgFv`Tc|2UgkZ?<akA<f)queC$N*mtkfgE0P}NEiZ;`$}&R?yuKB2S-DFc1oK#ImE zu4<zjTIqv|kml<O;xx7cfmd5WVW?-F?&|_#G!|Z1OrT#X9+%D_NMqrJ1w|Mt8EC6C zcW8p`H*ZOjfz(R708X$Ey*xf`+y^MIG{2?A;*C&4lumn)ps{p>1W*CGM1f5~eSJwF zMq|wrV&JhVF64bHP-Y-dYU!(a&_4^sZh;6#GsOB|7O-&X?(T)e1srtKeQiOQ#`*_C zyMQZlcmOjB7`d*6t0K2qK12`~E{kBialY0dx2v{cTUfy>Tp*|Bm*tffKy(gKFoS%p zK(@wl(!a?DUHkf4f;^4YB`hz{c&7PUfE0~&H!LOSn3)a?O*JT4?11wZaXRog=@Ar~ zNDe-feEdI?oFdK&=d;c`oEx1hoRgfX&L)oCj(Z%-!55&b{e*pveUja&3{tu(wP7~k zb=w2BMC%OeSnFVGYipe4lH~`>0!xu4*D})LH2-EkZvMc$-~5W%XYOb^X&P-BU`jD{ zHnoP>fM<;-j603XjOE6e#&JfgbWZwFdP}-pS|cr$#!G#r?owl^j^TI1F~cW@?S>l+ zbJzv;5L*GffCVg@jbZ~>3hTmJ(@XRuJqk>LZ_^6;Jbese3T~$B=?c1tPNIWoD(yyF zQ72^T>f<_<Q%LoojeFe54jUU=#)?y@r}pus^%O?cSe0{0CDBHI&);D5o?80&F3F4J z5K%T&@I}$<ZUc4+YE~P<i4NM3$tvf3a?u9NZC5$fQ+-;0)13KmG_S962B%K6-jM@F zNpg5S9yi<%*hPFEQfgK?fs=#AGPBAlnjExl2eZoQm>e_)zT;d>4q6Akt1VD%_)ZWB z(OU2wClYedXt+D44RX<_18%d*se&BT1z&OoAQyF(8f_|P|B0avwq#QWgQD8uQ!KT2 zp}+tkwN^Pr&uFTgE$fis^$t7!^&X&F@eo(V*t?fgMp#7)0z_1s!F7&I-z=+~p2tOP z9~8?fC*%Qc-mP8DDktM{Pz$KXsdyYz{=uwr?i~j;0}_Nf)Wj6k2;aq0;~np`K2Ct^ zMS_pfRQh4>QnzXV?4gDOo+uLKBCEhZ&bwNUCOOY$)g?(S`=&UCsf-iSxG6ikyH}@e zO&iklhjK1#ed3KxU3Wh)dHdSa51jn!M*38GNA>uQUcbkjZ9epcOXoUzE3bD+MOV}U zPorPvJblB6l#OL7<ua#Iy6d}}c1nj2jUnFUlQW@kt6tH@`>Jb7ZZrP1;4>jW@kWVh zElDH9a$+ZWr82>@Zd&cu3`n~&y|L$)w<F63JSMM5=n~^z;qrR>0TYfpCT@j0CdKWN zYN<eFV`)Z7R!$DFkn>OW@YXurGRC(YzHLJ)I}lI&$3|cv1Kwb7h1J{1w+w!mK`s~V zx--EG3^Y5*_Af5Ku#o_vP08XE_L`9#JN-x3{v-!9WL$9%p$W3Zw-hdmCYMZ?sNJ^& zaD8$S_@9oqNto8yw-`PrlM4rc`6ku<a^1`rB4v^;JNVVW544q;eT(1>2l?An*S8Q* zJM!1c6hgddtISP)aeX)`e#4nAX5RvF&UsebHy=<7a_;FN2}|nz5p{>-?FNicw{ISN z?ICC9bteg4;)Ux8d-J!G4ERPW2tT}5-&{DQHu-bc@yU&?zH;&5kF8&QMiYHy@L@9f zeb@5a#JNCQQl(fF;PWAdSTB6*aRZf*+|XAFS9Bw1gb^xkqL3wiK-B_Uc@^Ir_&JvR z)&uBNJnLM(68PvQr@sx-999hU74zy4Lr$HnOzdb#c;xc3Z<f)D8%U;yx`CqWzAYX? z+~nYmT`HHJ-v0{&>>+Xz1OkD(2uc}9K^<V_C8U?j;VXhWG$bcK_kCL-Iqn4-u-Wj1 zgZv8SEfnZPj~>2RfXWF-d-2c!emy@Vk^*wznd8vwg}=Zy26u21pz{ajH24M%+Rir< zE}lq!R?j{8b**^9JQAD&gi5h);JE_mb;D`l!)^8zi2MG;;(ap!rI8=c{<505C_m9F zPK3YhJsibTkKH#NPO49i|6l}Z4Ah<`F8=|nln*GHe7~q(p4m55eES{H+2sLpkz=I} zUv1wM&gayOd^>O1;Ml!+7x%5)Q!6RwsMjrjP`NFW6Xp}o{SxqZ67p@YVaBNymK6UU zatrkgYx(`Y%%*UHM3kYMzzEdkZSjzYTwg!m3nyQyY(DH>xDYP??gUW#WaUSZgO;K2 zOe)*&zyE%eOx!IE#C3!Yb-IlnI29Py++NO8mFmmoWz5JoPgiz4zk(!xQ|m!@QY}L6 zbHiyW{E0Pga@_~QbDBZ5aj$N_Kc0*|=yCg56xWE;W*r>h%i%(5lcOgqIrTs11Dey! z3j*NqrZAvK@(^fWd3*ul4c84QJTAivUgz)}_ri+j>E_D@tCf(idt5$~VRBa-tRVg* zpbCdAH7)}`k%ABlmqP#%$-Bj8amgMQm44Lhn=DL!q?rY{z<7atwQF1BXx~J@3FONd zp#O2Z2~=JcihhDP^@|v_zHdCJzoG;AeA%|w4!%*@)w1vCrEMoFcjrSf^MmURDsnAB z4?<PK;$>BkKEXF`{xtzAGaf}}Bgv^;e)-}qi9G*j*CMb45RJkCSAoLtbU-@~f8f98 zKI44c6uyTHacXpN9=uyjAWL<ta1KAjJvs35KjM(Q9(Mo=1HfH9C_R=2zZdBy5DL<+ zJY2!kglutNudgzZ7*?%{IMo8G08vuMRNpwPAfK^!%BVzBJVp}ja?=XqMz5j1LKG?5 z4NtxylaPAw&x1E~NwEq^;2#Yh;s(;nv0&`l<WshzWq}pu>G_9GR-V{kF~c-FZvzgq zS-w&HMkC3`m(P8=c%|FD!bAF|C3y+ZOJQRor)|oVX(p5XsUC$32STZm6x7*uL9P5c z>FCa#JE5DgXX&8_$a~&3S=-5v<CcB!OWB1%8T7Q%Y-wciE@wLyLlM@7Id$GdfAsD5 z;?V;$@QND;)8x#ON<M6ruo4Oe%<q9;AW}v9_LEd8b_Lus-V8J0T;&g%xnWA1H|X!P zB~OAe-H*9TfK`e_wSjBA1bEJ%R|FH){N(qT9cGz%<8i1NA+PpXwA=@C#gJjYMBcqz z`B7!%Sa`j~0YO$m6iI3yf8?9r?{DDgLmKx2F8yAm8_nwfJnnGufL`zcz7Q1%AlyE1 z0D}L$g!F}!>i`ElIUe{UsAnmO|A`nC;9l*`DajH}^9M@ukiCj`>CVMQ<?`Wrg-^cG zKT!XGi7aW#3a`uK%}Gd~0zDv-SwW5*1er>#caPT;Tjm?Yi)|`-=ko5#b5e)sCLXBG zn_X|toM3tNk>usnbyLz`@BKA{ZJ)oo^%lo>(@gG738=b1UZj$%f)m1$3V4XI(gRL- zOLFIU<Pu<hHF%*pftLs)>sLkXBOWQrORt0ZZRoX<gHKedKqv-8VcuLI@G>MRCPm5d z?s3E1H7}XB|Gs@Ue@Bqx=P!K`(_tkqnOnVHmgTavgh^>;8BPw2Zq-DUp!*?{x(Q%X z59BQdEXait3aUUG=Y~mVF77QBTUSbvZ8SPYJzDvOa$CYvZ$jmV!&?jHlc5(w-n^F^ z32f?xi<vLkmjUKc7m+tEFZ11A3j!(eaxo3ek-SFP4JYy=2bxlu)QKJ%U5n%}?>aZh zSw{wLKHX<^3jCVX9;}k%QQ<{u5~qtl`$-O@Tt_%V{KY>IiG;s^n>@7&bPpUABIQ+u z3*c=i@lu{KJU~beAT9;I#sh@#bG>wcFP)cfZL)vamLxUGHE=ULlE5R);4eRtKrgrw zPF|P0j^Df@C<1;g5vPRz7@}Zan$y9)K5sdcsW`j~d};g+MP%RQ#Rp?#+M>k!T5d(~ zBJXPy{%@E=h}qnYIJ}0VB?SJz;k9o{x{-#C5@N2%^}=QtP{NRu14NFoNdYcLE+Lj@ z$WQ@4n#gMv!cM$%BJvAWCezoK-`YW5+g0hmIVGONrpDT!8Sp~kc_8=1%}<6~dqe_% zpdTu}^oG7b;B5*M)0};FZ}P?Xc$uiHD&Xbeg%*E3adqsw;w{%V6G?PZ61xtjoq5gO zb7aewmTqWa;8rG+iIJh1%-uiQ)7a;M-;+tjvdf7eI*ky)*$Z{58-aczlx+i;DCYE~ zyOV$C>~#d%0!jAzL2o#ca(&4>OCGZ8?;#6(#1-W|&8Rz`$cZiz&-U6R?<x>_)JPS0 zOGCQK16TP#)t2NqXzZx~zHRa@ufin`FAQ?NSqCtOKNz9I+Ysi2dC&6I15F3W){16F z37N-;`U)ka!s7PE!c;E|8ObXL+Q2n#;&L0@gpyjZv27Ay@|IaL$<CrB^^7aor!F?I zjoa&SFQbGWg>xX4AQF}ZW@h=@`{n(A%rV2fDsMqwvet#UQQq}_aq=6ytKflu{P4g# z6{b1)`7hj?l+qjKDw$;wdH#pW^%?ab91Tc>!%N+yMT>Z{<}~CIE^@(F9uG&*#Csui z!z0+2x-+e;6KPL@yRD(&W5WhRe}kFrWh(3jD0e10PB<QMOm@_@zh_@>Pg5=`&nkrw z?e81g-L}y-m-P@t^~<taEPH{EwVV8_e7`(Fu5EtDyw2RuOia(1rkGsDSB;B}UFk{b zH|Ys!66-|op(Cgrwi{?U46j_}B25TgCcXrbiC6t9CgnP|>z2rg9om)vOI;+T#=lN! zlb3b4-k`L=+7F*tWH~yRTY^$x?pN@O!D13F0MQ9LC@HRz7IdpSsUw3piM(KTVQ|KX z^^_)&!McndULr{h?g=2j^?@xM8dvI3C)_f&G)=o}b>RB!f}(=*>})7BLyGoI1y$y@ z$<umF%cs{PC#A^_kfPNKTIdm41rdu_>Do7tTs_ZDp7LnlToV){9L=ABr+ipVD@w#7 z2>DfqS6lF5z~_m)rlXutM5H1w>2O-aO2?<tk%d9hQ|CCBA-HgfeZyqca3B=Y_2>vE zFqq8;P0%3>CiipsQffyXe1Vv;NRhBo5cJ5WgLSwnUoA1h_^~=1sRIJ9-tf3Uck96& z2No3<ale6FJ<l7KWQ6wtc^#fNgTCU-U%=P+XMi4BcRvIy6B!b?n{F|Db7L9!<`wZ3 z$Ih_Lq?WGi03&Js0*JI+SR&jl8|fBw#rDl|9lq0OA6QwNTbK`I9l296b5_tPN@LT8 zqN=*nkT>--vZC%Fr!9F_cWFWAs8o<F@Ve7PcjYT6nb!pb)YaW278I40<mYiEuG6hV zz)@~w4Ft^Q?ca1AuLmsG2ucXDT6dWQDK$i69HZN$-1#|I>~Jm7-N5A+<pHa<c$8hb ztrEeVKvW%W(`ehN`6Z?KdE#{iWfY}jb4XB5u!9X^$g4Hb2Rss>p_?mety70%c|e~4 zZAx%gco}pFwC=?WOX6L>QmA=$UF{Ozp&sO?AmEs%^G(9VVC@5K=ICy4K};?hcrJ91 zLDUExTW8QTd8G@%w*W*8(9wGgh{z4>C;CPA)5QG<xEl-Tk)_+XoKX_{Rv@Mx=wi`T z)VXB~i}DJ%NoXs+{@<S5M_~1TiqqnF#WBZ`0K5NJ+1o1bDNB?D+b6blwthBdecqaH zjkUaE@me~_Kg$oxljS<*1Ljimb*5KM#U{7$J>z_%TY6iXD>X8FXjp7$#XeyxS$BE@ z*5)(GS-6GXV<@ar6JJwp-X>scu}J`3!UYvu;xx|oC!9=%sGOuoBbmoPi3}084uTbN z&2B6IBr(9WIt-T8H4`5Fle~zYa~3Sn>u^%KVz)&=!7Nzg*DVb8(DPAHS&&zDFt`a2 zz575y!XmOd6ub>|*BNd`;QvOd|4<1J29E{ZI#v-Gu;3_gd(h>b6=o|hh8}W&xSaQ) zz>y3d>P(e^T#fFq+*c_qmp?UpWHVBwAgZmlN3W`=2o*z{+(xJ{OR0w=EUaOKSkXp< zvctiLg7{iqBV_}QUn9Z);@Vjtv@>or_-7Db`)j0YM8zKj&K{cEp{gZTWiDwTIE!fZ zldLK)RIi|n27qUYW+&vT;vzCT3A|H?ua7n>1{=vLk7UHwmI(R7!N)~&jrvFV5kg0S zyNu??J}6YMg#WX$nc#1u`LVAeH`LUngI|tj@4_mg0!>^7`1I&-fW|itZpRBq>H`iz zn%$3a;x4dBq#rm4X?E@ZhfU=Jz>`RG6%Niq2FD+v`R^=nMAH2l4Ol2ogs$K%zpogC zX>9pJ<t8|%gIw5I;J&0;ud8!eR?26B2ZQUA=2z!c!Xlob{@_8SdG|;tqntfHyz$H9 zn+38oZquncE=U7UEY04*kyQ)LlnMS>nu{+&OoV~5z`;v%@l`QUgs@TI2&TWq`gcbB zVc<}vyN`=?A1g_OuH(Tqjrh9jdnKUE;5Hnw!%TdY&6hQx9*+fIH{$Dj&4fqjJqVoV zG{3h)1tx4<<-OhCHwENr++S5yUg&j@<;w+Gn)k9sw&G!~hD=`$2&+*W73}b3f$Lli z^$G{B84b>KntNnHgN3%D2gt}Hx1<jN-#p!8&5&TYQ;31OKX~}*F58gA+>!#Q(pK_0 z=|r{>@W4+pd~3MNFxVhDUWHkJ=D-4Qr+tjwrM#nTRK_UvZC~2%aPD(vkZn%cxrXg$ zH`>MmE5Kpv?XVM|9>fd0%`(AKPySrqC=Zf}`5E&}a~sn!(;cSa;0N%&af314C`)g% zn<0{OeflN6n@)t7o1gz*ObYZc%&+bg$ISWVFq|yNo;jaCs%*KlFMXz(PikpCY|tnx zFH4*OY~1{6`UOnAnyY)~(B)O0KzcyS)P6`t9;kq{>hyzT!*b0!gl6>V`@IcIwO<bV ztb_&L>19}~`D)%h<>vdcr(vP?i%Ys0%Bp)6FYRDE!2B9=$}g-^PE3XQ+gjDVZ-6%n z-#fuQwt=xC*{R$0BPc22jqv{icNE>``bS3+4HXs^dS=56PnoDfyuu#WP=i7jmlw~< z=Tw38gqGF7(B)<23k$2plB8#}_ymLmiS<(0^~Y8DRYRK*5>Qe&7xsAb%YV?NfSA}R z5NqM|do8OoAq@&43JY*vgeS4+kGgCckdr+dhK;y(MZc?&ps<e+J*KCQ2!*(1f6}D} zE~W6DuZaP|PI_94M_9<f5rQI(qbcIiKMIR5&`B)|ELRKTR{Bj#TO1aF5d$N8UGx_{ z4+4@ma7BLB^&mtv-}GAzeV3B5g?Ys#(>o*z>Rviei|)Zo!3U%?SG>AaEuELpt>OCo zA~7q^^FLpg3Z<pEiI>jRb9uPyvQW?E*`+{{#b>SQA}vp9(0<v0-Pd%1F7p9HO77ID zuvjUIz^|$Lgj9%ln98+CD41H5n;39(&E{*T+zN*^SV0JY5G}%lA_t#oc%9<aphNK1 zpK9pIiHkYu0oVBxt#^%l;y%{W{$NKAyo^dA01uEH;Qg=DzJ4AQ5vfT-Emf#Wmoh|Q zMLyC}0jkIdG8q4^r7^7{A=n)akhPGC8cPb$(2%`4sBEitwnMZpWH-1M)TvR&oqH?r z+D>+9Xsp8nP2S^T%beE}V7sgKP)l51IK8;EpnS$`eskfEZ%piNm|NYva1o)#lKC_Y zw)mA16_qXJ>;GNIgT(oyb2{w$KkB&Gk>_Y(|K9$PeY`zNIjF2wG8KdE7285vTkGf6 z4b~LPPnNqa{pG*F2VjCMn_o3AFgG)OV)C0h7>^ilG<K5CNY6|2rEZ454Z94B4DH#E z>`pd`HK1?OWwZ-92{+Sx^ixw|#-qBlJU~t+JXv7DUqlj46diSL>V9fUP2?2MEiakN z3%#G}sga!WK<wEJm9rpKmmub<d_|PxP?d8aRo6)(Bnc^|MOf~9J|fC4D=91}hyEsH zvX9ESkgChe77{rtf8qS%(y83sJ=I<Yvb36$Fd+fKE_0U3sgJ5V?HIZ|kR>epY-msO zW`Qc{DrY~cE~m<s!lsuN&kc+x(p64;q*qWxiKVEV`>494bzzMb<mHEgjCNPM8puMe z2F@$wGk-nRE;<S)IOoz!?Q9^+HQ$-X^x_XtFSV17%R|p`ceSIAe1i?))_qhhL`EUI zN0i)Xl@l3hU%U^IuYgc+zU`REJ6y%W`4zVW3|2X{QCu~x8hB&F>Uc;npNLAFmY-W5 z@R}Q@a+ag!`UM6xjgUE5<y1#CRWc7Y90bBq4pTYZ(KS#qLgqk~GaqRr7Q4!l@Ss4O z2z6$N$_bA&`in)13)(RxF;(R>M;2`*gR72V_q|NDB?!^DmQqEng6T!MVrgrr+5$vX z_x<s2Rc~HyVFC21ur_C@ob0H&?f1Wl49u+#R-1van%26Ahj@_M6a;GLnF>8?!6FSP zI803ddDoy8N9fpJZ2~g&F5>ZJ?r@m<QEEKMO4L^2g6mtt?W82Ptc<_ev#XTy05uNe zYNQpcB9|L57^yx}b%QjGHM)wlkdxU^pnB3=ql2P&8gc;)iR=&TQ2NWGYD{kr&`D`^ zI|vRn1EbY6;Goj#b`TU1QOi<+z^eL95!}0MMm~?XQWm5<<z2mGpuVa;zhI;gFg5oP z@c>s=_3cqbz>Iv1B%KP3TKX~)VU2Vk<Kq3hQNZ&D>jUsNv3zQIrw*Muv=wjH!1E6@ z&3V%b${`T)^y#p42$6i@(U=7Tgpf~b7I1m-=1;$%2(5amb$Dm3nzCSQh|3!R=P3_R zh;iF$y*xsJZfY$9nO|KA+-xC3^irdFU$2@s$4evb+*6Ixko7A|!2_gd8nPa`JVJpK zU{kApM;&GW%d@AI=FZONvVsoI{eXt8`UBW2WJKsPSha&3jjzFAqlR-!=nEh0$6H}6 zo<utk!!(1Fy(m2(4FRsbdh~5cqF%#J*<=3O{G@q`Io9;P>3UOVVEDhoI6%7O+~FMQ zxahdwG1UII{XzR^y9C?-Q<QqP_iQ)VlC9^gk6Nc#Yts&v*DZ4_&E&)KTFpcL|JPoi zW6=`2T=))2gieE)xhW_VLu}Sv#}pQq7IuUV79^{!Q?alp*kc8+cT}v_5D2DJ-TA0+ z-z`Eh;ZgxTL6qmx5q7F-MmeqN?1Duo&N*80wXKnQ5f0>`_dBK6Qf$cCn_M0#`C48p zZ3F#HQV9!+TKCt6D`G^OGPcHbkT)!1`ksxFe66olMuRn*k};A`E6c}~b>|=UNl=5% zC#HC6KJ3B|u-KNA7B5%`{TFhd&Kh1tS}0~bxmU|FZ^Q#wMO<J>i`;W9aw=XNJg0X- z+Ym>!jU>V~FJQNb3OEVY1hht449m-30GmT`I}s>1QTqZ852_Prp7UYHIPcApJ9R90 zgvCJp$PWyH$sIK+M|gF^HppC<C=zOI()p-jr4Yh$1EN;y*wY)%VXzT;1QgO5jw~!C zclvbjT?wqgOsG-b_=|Nu%&PNdh-}vR@<KClQDt+daL#6Q#3Ng3tXhx&n%pu1I6HK- zkYUyM8f%rUvE=p|wLI7*34524+iKKUaB&gOHn~~HF6(d&3A^c!tI=~L?4KQcqmUbF z)JlX3^I<JMJy*5SVV-vKc#Q;wX~D@uH4;<^zNd3bL`!pHjRf(HwhM4&^?n_UGU4(M z@*$KZ&Ig&r^ZC<#Q;nYPu*5*<QL^zGX&8QYZ@5Mp0*3>4rzPua)M$ir%$K`4Zw;5Z zPG?sw(7%{lgu9M#9lErjOoTxoYp;=}kuAs?o!!5HrUm(hQ#sAnl|c;1W7kHm2#NsI zFri21)(MiYtL`Q~&^-zSTga{&9D)3=W;H8li(nuJ@+e>bFQHMy`HFM9bEz}l8SB{V zc+oN5G04%^(b>_;(b!?Je_?;ieye@5eV}q$IRd-@FDP4-^@^(WRk|omZ1>o1v@Nsc z+lJXvZ4GRS^*8G$))%clYh%k%OHWIz#U@{tPs`uPugTBL_sKWQ{pA)w41dV{x_PJh zL0}79Y%Ve9na7w1nN!VO%+1U;Gc}zv{R(>rJ~Qn!-DiBq_@MDF<0fOCak#OG(P;$E zcxjJxk94b)A@!E(N)mV){A~Ez@Rp&0!Ne}IQ|wcAfNf?=SphvlpQaDfyC8$rJ$z=r z6DTEBg#wr2_FZ#0S7D2HdcW1U=PT~78+0?CJiGo<yP@t!mQ-FkRe7qiva)&hh|851 zzW%etsYSQI$IAJ=55WILjs9F4#Y&tN9#fWuBrVI@1T!s-n_gH7gq#&=`xr=d6SJ41 zS}rdG>SQ2k<h-n2!Qr?ew}r*ex%;E(`Ya}!{hYbqL2qo;($7izhtqW{%VKh)-rd_> zr7Wh6zab}gKYdr(yWRVmHg=rqVbk~SrH~mLW@ha!3+Yv{%w5MY))UP-;BCq6l^nPO zq>-SMdle|a8BW7TG;l_eRh0ov!{7f4N+K0!D*M2XK-38r3ej+_E6UG92E@}fPhZZf zOWcsrk(O9Lj~$RiS3|xDSups-38{i)ka^2<EQx*~iMC9ps}BF!?cU09NwKxuB%XK{ z{PykZYwJ#L<0eU!tzE8d#}{rreq-0<ZHJB<Y<?beAco#hKfk>xwzi)K9%w;V{{4OH z6cU$0$hLkhe*4Sn=TQi1)9bTVZ=q&Ck3ry|D@@UT9)Tc%`oRP(`hzYqF!lRd`FYR* zbvRYw>!W|#<dhgffg+e3O<Lh%ty5Q}ZA^=Y53V@LMm(gOLfXVL<|AY+t#J1RLTNc} ztSi<dsr_2iHcf>ravDx?>~Y`3`CxP0{aw6fy5S!q&EZ$52=BoMFExm-;13)Mr_h!> z9}%}neCASkMd1}Dc*wQ<6td8a`WC$*uOH*(GPfRIDEoP|0bqC^Z?daA#6W$z{N;nS zAU~2><&gy(blG5+%7X>C>C*j6lII(NlXPrM6P3pdNT*A>ylwHU0L{gJG0jvEJ2196 zFAGrFtnx?#4!XF}0Cf@PVXaLUf#~--dZ;XU+wadwf(d!D+QTSGai#GbD@{2=xbnpM zqrJaP7u>X<iHCEPPF{IeSq0eWo0BIU7L`XGh^7l$d7am(JkCH5x&Q=w*KeVzQl>i< z;A2fIq|GtwrFfM`A4sF~;de4Lr;T*_So22PzRe_4GC31!3EAGn)Gk)#u?UhV@V1hQ z4&*U6iHj!fJF0HVY$}gI5JTtk>uHqAgAl~ia{h_a6n}GCYNPU41Y>F0fi|udYxZnh zVLWP7;m4$jBr|$B^SJh|0yf$sP+~xcZY*=CJP<)cT6$aAyJd5>8XLAzdFX+$bk5%| zEa^QnsTq`av-mi#2iS749I5H}UB9!2q{Y4#_qx`YRUVqaK}(X&YOz4YEJ5YL1TtyS zz4i(hN!?=t`zl-CIM!Y^kcx$I@T?J%OEP@J)!9%C{&+f@9lda_33JKODM?Uwvx`W@ zFYWr9;w5=-QhoV`4`{<4cjr_%`+W#B;765LPT5>JfA#X^Brh_p86kbSd-R&?j?VPS z<W$^?zt;uoVlT*t8Wrv4H-dkAV!7^kRFI0w%H@4LXfbXC;%>8|WO~E7hhkfTc|BgK z$OEUk$*RRu(`r$YR)^JYFr2tOkC8Zc>r{hxySL#-Q*xl}SFkT8pYIpj+|lp`gK?sP zu?~w(R&O1Zhf8Qh3%6dV-1h6A%m1p}Q1{c<FB=-DJa|GEI_vKtm6tA8UhZ?b^0%d5 zpIe$etMZczCbP<;BRJ?xsHGz80WAPDLwq*_5RYx(pwj_~s0MTzi&c44gCv@Nq$vS~ z;o)+-LGL|HsMoIYAP4p7)J4<w9Qo?~=PfD^br4PSN)5oSKLxOhPRW9xFu4F7G<TCl z%@HT$3_i5bs&a<^+B7@);vp)loU`9WCucbwDktr4NGENDHej#kw6m_tnfu$(iHrC* z;#j~RjU+>~%IW(P=!7i(t(OqbQKFdD@$jXCj*m90;{+PVYO9=jz6BlI<JfSwIMoBB z=TaY)lh7}tWA3<^NFn@2yM0U6E!_qs>!~m&dUBQw7R=1Va-OrMA2q{;`*$^G?wl`2 zkj<BpqX;!LQaN*dFFJbJ<>FnW^3RJldT~t?IFUD0aCkFRL1?egQAhf8thiv4na?GA zxgq&saf^gk8k)pbPKInr6f7+A$vLLez}gl`$^nLbyUNMx>(h~EHqbAoRXAKKXQ_A7 z5sv*^$;!5dPcPQ9s+^R*HXXk8^5vKYD(9u|LWg}jomP;eZ*LoCDrrx4bcGl#=ktdu zDyO86r9-Ef*ejEp*;LL;A47-iRmcp*sty)%2DgeMZmT*-d>GVY+Y;thIpw;C4pfaP zu7r6zKWn<<+)F3kk;&MN?)aReTaR8(eR1jl{(kV#0k_>wymHd%%jcedX+q+%KJhbh z*6w`i+zrPjr<D|t9p@f|P%c~PW6XWa#Jy>0F6nI}l%e<JM2|2EFHhpGaHhJ(;^%++ z>%kUZv>NUbGnx3DWAeEnIrpqx^TG-*7}jkDn)BT0=bM9VfjtPmkv8^HIq&-dnsxS} zMEdH2oo1O-kRN%W)h6ESz9&8V>=@ASKojY5@5<hPy*a0Q#}p&2W9sd3!{bO~maX>Z z?RqcT|A|AZDtq5Dq;3nh*Xwb)AR>wkZ)j+TtkUWCfSFseTCaz99|W$M=w`0k{V2Rg zfQCOxa<^y!nlQ-?Q6U(SYr`cQJuTeu8-*J1X(u%k6r4dbcU3Mic4|ao-R_%KxKcBr z8F7&csP8Lz9csRwd9&xvPl4bFXC?VzFKq~HazM&WGd6w6WVx4-ae8?#k%$-mNOD~@ z9e!>{)5#r>kBGw^t8z~EB-)R>d(p@w$>W9_dEg#0Rn#>2DVC;@`b`+|Ccr)l-stuv z@50ZuR=^(*aWS?kAkM?vIti{y6<4K_X;GVv=~3Wf%HJR<WZF$gSnoB)sGQ}z4fT*8 z;9BW5LOt%IU=)V}{-6AgeaMlMyS{?APqMf+nLHf`WkBe1wKp$;CA2rm^1kr+&g~nQ zAFI6d8FVzy9pc?haa@MKmnwHx_NlzI?CZ+PFDonmf=`tIpR9xv;UD}A$7RuDg<k9B zbFKMj2;On3a#>~axm~AvetBVc<=Icp?cV(x{J#8+-QssZW|ztd&fT;ZVTXV`9}brl zTr>Ie*OT<{OTECgl2@@F<Rq_j?)Z4%Unfw1JiJ5zFd)nq?-2MR78(pw1sEZR@aLa+ z8(YAklDDPZ$w_D(Ip?{Hb|W1csGQ`y3++lI?|j~FL>v;0Q912-8}KJi_7bQhR84_5 zne3-FwKMz>Lpu}p>6Zql+6g{2qMeBQ?Yd{qEZ^UKoZ69_Gl_O2hsU`{!%X7yO1u^F zkX6KCWf1&Ac9C2te&SgHg#a;~h}Q#L@@ZZOlmO?EzH+M9czWTn8y9YUXKb%toVFf% za&*BolM_4(`Q18@GqV`9eS~%bPeER}+m9a2_ElEait(gzyKpnX!SfH|DYsSd;6Ks! z;0MSoQ)to;&C@QOU%g^#bpPo7n=%vP`fo~TzbT>rrt1^>M@PMtQ5xTDb=uUlM>lmb zd7a?u$8VmvXf>4F54$OC4UT#|x>viCP4dPKJ??F{Eawr=(XSWRCEjj8$p(iP%E9GY z-}9i+<EjN-c)b7EcJiXFbqKM7a!G8f41RRHK-xTLmB9y&!`27jrQQl)3~kl!n;TES zTdyU2a?qAmD>#wyYSH2d1O}O)Hs_Y^M4K<Wu=}xH*{kiNHkGZ~o}ELsw<ldaY0`(U zKDlT8=2y=(n)Sk0vlm3oud6)$_)S}Gvdc5*j%Qx>+&?7;f*n!G1By<Td}PJS)L~F} zNWAfA9`AZK6E|(fMyO5seG+KXGs`cXY92i{H9dPhnBdgn^Oc6vhjukFOD8s9Wqv*{ z#XRo>YZRzXwodhSZ6?Ic%i8UN8UX(rNDj$KG8xR^&c!p8z{aXgxcqjs$+B&OxH5!V zj~`l>;x@R!d`UUfTbr^368qwAw^vrC<<uq212R+LL}ft~NrA4iA?HE2>>A;cR?((u z9%Xx)Yu^r7V277XJlw=X<9985H^Xvq$a%=@mP>;w$Qq~|hT5)G7O5V%S20Tm8h3A5 zeZpL0o?UvYVxL6PT+F*CMRjw{2z6f`;5C{E$zIxWghI}juQqyJUbsKhWSOknu<g<~ zkB33ngV;X~eVy^uTF;6-7jIAK-{Izjw+8a@e`m6SIG=aUfU*C_5c994{jhz7y|Z#m zxkX8}{chW8n`Dc&er&x3eE-i`9=A-f)RteD=gUpaADVA5k2N<mePz1YG{|_~_&?($ zV<Tz5v_xue_|x#TVY(rXy$8|zn$Qm+I$tUbYTkrfU3H{D7ry!q7XQ3qt(!WJ`=`t; zD}{j7dAWs&g#}X*F+AthkpMy>#CE%0>fGx4B8M)`5AJpA14D-DyUB;HkC@>a2m=hw z&Z<GDj*{ZCa#%%yy|ekbrFne1a1abYG<!B)B`!RnH5|q-x>>M7>ILSta!X5d`Euzf z80F}8N4!#Kge?cdm`S&TOh|5oz`ii_s($>?D?E2Xn{+Z&&VW>1zs4)1L`0kg%Xwfp zq`{*J{i&*o=&sJ<?(>>FvS6c>ScA-jaTU*rri&xoLLy9?0RuC>`=y$q{=wBQsMIJJ z*zww=U(!Eo*h`(R!F4U<b{AA@0E{iUZ)`Qy3SIxt%4EU#RI@)dc=Y5aMi9mYm%xU@ zh*rl#T~!!YIJXF9*LjAaYW9U;vHoWz=*F1=1L~Sp3qjfh`t(wB^%P(5^6qMm=EsEZ zv*!zF-PLT(*9Py~OP#Di?U2i2@bV!rub_FeLa_bkX~^+8n3*9kF>!4q26Y?&6B?Sm z#;;<83r5Kq2s0tNU!a2VF0pJzacOxTxbH&Q4S?ws&B_H0h~gqzxlEXnseaQRSS1ch z6OQ+xZBH36jZ^*Yg8w8cSfUv)ol`SO!IB)Rjsi&<H;x3eSGBf@)hV!lGE4w*UvkaO zrdaU<0X@_a2C}%i*UuHs${{DfOqg5J@Phk?w^B${GR#bA$Vli(4ha|zlUF)gX=Gjt z@gj>27J*M-oq;d~rvGUPGB<~G90GG_ni~i48p6;sfiN@?F=Gb8M4WB~#S;_Qp@L)- zLtrXTvx4A)5ZdW8b!s8R$C(DsMMZhSsbQcxK)ZsG62(q}G9cKS&6yg8z#LtT6a=3e zv7ay`aVT(FX?`fLQZVcy3rdcFc{)9u%^@oWmApb~M$M!OOJ2E;(gU-9)!$13iUqcd zi>Mj6`FRjb6IOo^6&4ZLaSr?7rWe7c5bg*gb`TDLxy9<gQ?8O%S}=V^IS}`hB2QBW zOifn5`Mz3Oen>AXjK&+9+jIW^JZFsK4aYo3Q~M$N65#*;Tv?^`w*6$=V#~1pZrx^0 zx16?YwT!Zu<rw(|b9?i0^8tCrRfGBezWC1q|5@Na3;bt+|19wTMGNS3jt=j#0>@Yw zXBKmY6;?;5V|iHG^wQiCKIzM%br36YKijaVP|QXarPCueEDL(!Fc>R`ux^-9hfWvu zu*8s}kXdp;ryFEgTonpfa<Rsx8ZqD}e`jhB4j9?_4$je$2lbW1RbB4TxPWHq^ZLC? zVwFxj%^WNF+H3cCy-Mnp{dn45pF8nYf+OflXyP@J8NoI}+g_uB3ekhm*7|DrRXGoA z)S*qUQLZEEIZe>ldWCfiv5(M}H8kK=Lv%V2g5x%=L7fx>%PLG4w1vJ#ER^4>qkcNz zT4-4HLF`|{$NL{g(=-D@_{P=Ll#!2M(zOs6`TVuJ79|sY_}b{(YgDzMgHK-bYmwQ= z$F7;aH+@LE2wCI-zW(2p+)SK%oqlJU<5$NPN4ovI{XY8;<!@!DGGB?e9kk7}#aZ9B zuC``csb!a?+)`KmK;8g;{M5YLJkQ+3bi}mTG}=@LVgTM~%rsi0H>EXFf5~LnYw#I7 z;KunPo6VBw&)|taiMq)baJ&Drqo2PWOm0+{>@ROdF6>z^Pn<m^uT0Ri!G_!^Vv~5P zpYuvpmtrX>hfhZqwGRpD;cvsIlB?%e5R{Q$mRB|#`YD-yP8(I-Ro~#%c_Qqp*i$__ zH*W^=YWMMTzNqSw@dZVJBB7l0^|u5GHjP=~lFIVSLsEM9Tj;PyU|VgbpEE*fwg;+E zwQw{1oDZtH%!xsJ%q=S5+kkQlBl@O2{Y|USgBKJOTG&taCx9N+-3%SPJmL{d_BYWW z00Pl~V@t=x>~I|U6n{Jjs4kCSP(Vp>abbAhpvTWioQ&118$lVopPC4pA?NZ9WyyZG zj(mWpLkVng<^p>98&|&^f-0a_iMTzdW~y#EgfB15=T09WpqKx;>U#kNuMb4+fXh?; zoQtWtjZN_S?7ZT_LKr0RSePKh<L69Fx{9GRzr2+D)uj4450h3sL`m|Ufk0pcLX!QQ zi%F|7g%HRY2<YSIOia~nt%BAN0?Nt?vq3^%e_fDJ-PWp#gorwo>gOCxx~vf{+M)hB zAf&o0oIzEBOPtxj!Gx5g+4)8D3QEO3$#g#_WU4NS=v5-aG~s>xwLp+AL(k7G;AP#< z9}N<!`?d|LB8m#KScH{V6j&6<(N$m(t)a({bWPQJ-v+g*qDZQr(=}-=^8k4|xX~3X zfZU9St#{QABNo&nECebsY~IbAkv#)imm(m8irf>Q0ektX|L(d<colOgAW3V3QDyEU z&2Iw{c8yJc*y8*}0tQQl?S0ytjEJoCfxUp$ugRfsNf8o8z?MPHE0n><H01gh+<(hs z3Gg;~IBYA_y##-yRL;jT1%!@(-HF#s)fqhK7=MF~fX$89OllsiC@<g*#BkUpdCd&K z+YN5j6xeWC{Z32RX*M#*LN7n7{u?_aA`~WLIBb}_2KnOtUWuWw3BzE&rDhh;tLvZ; z8muhCVdLhtQZ!Uo2Egvm>aRy%;Yt*$*1_T&3Oh)v|BC!KX;r*7hQSWhYh}rx)A2~y zuc|qi^S_i%M8nfdU8JKThQgKfQWxsDJTwC7sV=B~zd7_61f!ks_5a4Emx=QwXCd(a zf9_c8NU@)@KVhG4kA=v8KGVx)mt0qAWBbN-i*2y=vh`_ezBR@?$6R4~%d*7MT|O)C zkc<D%hV%dZ_MZj*v%r5A_|F3WS>Re)K*v(Ym75_#`xiv0W9XJLPmbhE(YVy{?^1b; zgZw<0!_6<xol?lV=&ZMnl?ri#h#fqzuWe!OY(DB@y>t+kUL|h9?85A@crLbw4r-)- zH3P2Pi`?5il8@>!@BFgqJZ1^`09Xs{)t#6M^)q4DN|nB)0|JGa^+@4#bQo5$e@#SS z$c6ekR+)lj$ESb6LAfk{MtOM&H_ZDr6&BH-CGTCEN?JYxNx`11fo=uhNei66Wr;y5 z(<fl{ODkDu&}t!Jfwj3Yu*e>#s~!L~WKgjP!;RL#sVQ_T$pydOT=bP8d-R&?AGUeX zd>w1_S3b$$Kg_GxAssBnSBeU?xPcvGbgJIsjL0lZq6;shu8>!)WTaOr7^oSI;R$H0 zr)ET`6;UxvI`}37n!yrFaFk76(BW7V788j4&WrMS9rU(gK@k}v&*_yk12zr<2|5rv z2AcM_^)@;oNuha7p2ZizR$A$?MHWNi0#zZU#)5J&haPyY8|bN1A&nvo-v?@xQ;)E! z^#6ll{7(~2<B0Qu^AG2*&L5m#J3n>4?>yjq4HyBRb3WmG2zUXvI5#=hI#&Qc;5=tB z@C4*K$2&(j2Ri#Xlbv0iNzRtQ8`!{E+i7>29F>mqj^7+VJB~TN1U7+pVMjrQ<0Z$_ zj{iZlfV&;HIW{;}Ied;qjxtA~Bi}LEF~%{}(ch8k=;`R>XzOSOe1ox$D2LTyuwS(Q zX+LQ{Za-@O%>IG>ZTmj^tM=#ZPud^0-($bSezSd@{d)T{`+R$ey}&-jKEXcHKFFSK z?_=*~Z*Om9Z(?s~uVZ)E&32;vrJPZIQNB~YQVuJJlsA<<%FD_#%45m{%2wreWh2Bm z^n#~Dk&>@WR7NOSN{Z4=NmQCC*D19Xo5E~=*-qPz+m6^i249HRY%klMvOR3uX1fh| z4_DY0+e&Q(wjA3S+hAKiTQ6HjTPs_fE!O6=nXH$re^`I9erx^A`kwU->n`ha*2k>( zS?{pkWL;%lZk=bHZJlbJU>$DlZ}nKaTH9HhS{qtxS*_q@ao%#u@`L3o%SV>CEqg65 zS$0?+g1r~FTGm<omPHU#VTL8!GTJi8k_HTm9V{&^ZcAN@!(x;#%D>A$1J~lG@*#P@ z{Hpw{{6G0#d5gSJzCm6l&y@@1JbAo4OwN@1$X(>Na)R7Ij+QMlF`qM^G=FdY5;z?W znD>}pgs2Y>n(qdFhqY$aybu@~r<*66N0|qj`<i>e-j5dM#^xBa-7J|dn9i7fG985o zknfsaH@#wd#`LJ^9`Fa*U|MNfYAQF)GEFg!GYvImn37GMO>Im~O!ZAsCfQhNJZt>b z_?__!;|IpKj1|Tgj87OJ0G`L2jcbfP;{s!`aT>5mj5H1~rW(5&lZ?%cjf{1SiqRnb zE&V3_D19v*mfn%}Njs&drAMUg((TfE>3U$ED3fMNxzbo^h?EZOke#H~QoK}8a!F>x zW#FVZVK`>^-0;5PO~Y=(^M=O__Z#jsY%;7icn$LnMTUICM8gO}mLbK^&5&ql7CBlm z`50Y8*8t^_h0)b?HG)-i6@nY+4G31!l?bk<*CSX#S0M0HSfJpSt5ikcqdo*)>P4`e zE=RD8E<>=CE=90}E<v!EE=I73E<&)7E<~_^E<iA!&POnh&O<Pl&P7m8%Mp~(G6bcx z6u}%i2SEufK~PMK5fsrP1heUE1ckH^!7Mrp!Av?6K>;m5FoVuOFr7|EFpW+_kWcdw zOr=v1<k36?Q|J@~xil9+4$VQ3O|ub9rjrp&qLUCzq!STLpc4>`r{fWfqvH^arDG9{ zp<@t?rlS#zqN5Ouq$3fGpd%0rr^68pqr(skr9%-6p+gW1rh^d-qJt0&qyrHQpaT$O z(JTc0X@3NnG!sDv%|MV&(-HKe{Sc(lGz5KVUj(T%6+sG3LExbt1bt{91j#fRL2ud{ zK`+`1K~LHfK@ZvkL3i36K{whBL08%pK^NKuL1)?-K_}V?K}XsVK?m9aL3`RBK@v?u zkVq2|w4?11w54qkw4rSfw5F{Qw4$vLw4^N&w4f~zG^foGG^5QBG^I@uB+vu|O=uGY z@iZPm9F0TZrfvj{X=4P9Xd?vI(d!U2qzw@?pbZezr}YukqxBHP(pUs_X<Y;{GzLK( zS_eUGS{p$vS_?rmjYbefqY${L3xSh55jdy=ft}hBC{#gUqc#LqYDHk776dYt5tykN zfr*+B7^x9~L?r|UYCym!LqI7-01Q+DkV;aC;4-<4;1aon;3Bz*-~zdT;BWFbg1^XL z2+ou92+omn2+oqT2>v90BKU*+f#7%YJAyOh41(XtZwOA4(+EzHQwUCylL&q#zalt6 zP9XS&{DR<T@-u>;$WI7<BtIfJPL3n^f&75rd-6Sk@5pxuj*(*sz9rux_=bFg;3zqY z;A`?Vf+OSzg0IL|2)-m=BKU%Qf#7rUIfBo~X9zwepCb5#e1hOGIgH?A@-c#s$VUi1 zBp)L9fP8@9eeynn_sDw)4v|9$-X-rMc!#`$;2=4O;BE3Yf&=6Lg15+92;L-bB6x$m zfnYz`kKlFkI)Z&<AA;A&YY6s|y$JS@JqUmU6v1w?8^JEJ3&E@8RRph)R}kzZI}yB0 zUPkZ|c?rRb<V6H8kQWd<Po78c9C;4Gv*cL>&yZ&jJWZZP@DzCp!49$m!IR`k1W%AB z5IjyENAMVV48i}%{}4P%9!2m7c?7}3<Y5F4k%tgGNFGG+0C@nx{p5ZG_mTS$+)M67 za1Xf$!FIA8!8WoD!B(;r!QJF;1b30U5Zp=bL~sYW1Hl%u1;J*r8Nu!3b_BPP+YsDJ zZbfhlxdp+^<Yok$$R-3gk(&@~BpVTIAR7>@C+iX1NNz;1j;uqlmaIjvhO9xbnyf~! zimXC#1GxdgO0p8c_2ha4E6552e&R=<5*2}u_z-xB*CbI3UA|l-%a(~`=~9s_St63f zi$$_%kw_LU6v=`GBAGv5B=hEpWbRy%l$VR7tV|@Or6QR#M<gXBA}KBwNl}qVX3rK$ zVWCK7%@WDXnIb7D5Xp=gBAGs2B-5seBtKsyQ>Tg~FHa;>ridgrS0p((BFWAc$>hl* znKVfx6DNvf!UU0wA1{(|<3uuctVqU;5y|M$A{jMGBqK+PWW)%O3?D9%VZ%f+bf`#% z3=zrT!6F$nNF)OXie$h5kz{3wq<?>rWM+yaBSR$V=_2XZPb6t+BI(;#B&n$)Nl6ij z$0L$HeMFL+ERx>6MbfL6NP6}ZNsk^P>E2x=-MWdSYgdtU=^~QOokh~AlSn#t6iJ5; zB5B`VBuPmkNlX+;yLKXJ+g2oP+K8leYmu~SC6bmcMbe^$NSZenNwa1mY1&jI2?-); z(nKWj@gj+f6N%d`lE#fi(x{P0uDebo4I7H2K?9N0uP>5%^+XaIE0Vf(MG_Muk~(!n zQoFWDYSj`+bhJpKqD10yiNxs?iNhfhyImxTA`+WTBvz|PEEbW-vPjHkk(f*(F&af8 zNg^>AM8cRPSu7T-@-!`Ge-h;pWjl<8*DKd6OO!HYrjo0SRfZ_(N^hl;(prgE>M1V8 zY`bjx({{pk%=WqMecPM1-L~g#kK69I-D%roTW#~&=G%%O4!}g)2wRpd#n#Q1XlrJ> z&Q{xIvoY&m*3;JG)+4|pc+mQq^=0c*)`x*p;5O@x))m&p)>3PMHOD%}I@sFJ+RNI} z+R7SdjkP+hCd(zuAC_M%-&#Jiyk~g>b{{-vdCYR3<qpeDmQ|MJmU))hmZ_Ermf@EE z7LTQ?rJbdzrJ<#k#cHAQdHIz5gZ!2Jk^Hv2SAGfn6dsbd%D2kvWWT&fo+HnYv*pq9 zAURF$DR+=t%5J%??2wJ-i{{_WKbyZXe+n@Q_M2ZdKWqM<`CjuD^G5Rx=4Ix&=0b>8 zFy1`OoN4X@@e10S6U+_F(PoR8K-7YhrteK(nm#lgFzqqDXnNB0py_VYEvB_5)wIx5 zVw!H6Y#L=6XzFX~VQOz`VQOrOF+rIcFBs1le*#wVPmJ#xUpKyDe8%{w@gC!5;|AkO z<5FX}ah7q4ah!3eF~gW_>}+fUQ4s1Iql~gtDV>#mmA;d{kUo&!k}9MZq$ePP<6Y9t zu>Zm*Es%<(Y0@NVq%=TEmAXqwQgf-1R7X-I14K;t&F~|{OgL<K$FR?^6Sx{5F>E*7 zZdh-)-mt__W|(QnHH<Y3F{B%M8#)<U8{!T13@(G2U1one&pA&zzjuD={19e|_Bda3 zKIweWdAIWxm?2V~3!Np->CVZ{Q7}8y*V)6_-r2(0*ck&eLz3fy<Ba1c$5F>8Fe~)B z;}yp<jz=B$I5xwK&`QTrN4aB`V~S%O%m!sRk|FX$8%GmIeV7T7?UnYk_FwJaK@^G) zAPz-^{RQw&dBA=b%mA&i`|Jzs#rA3TNih2}z@BRFZcnl|w>N^BAH{Bf9W1{oKPq1< zhhfysI<O8w8d>quVf|P?1ZgY{L0{GvK`Ki{kit?Bc$f!4AJzv!GD}9#oApM}i}ga# zll4T<gY`hropndhjderNm32kXg>^yDnRQ0ciFHEIk#$7Cb>~wDtUYUwAc-X*fWUYN z+Oc*B+OoC?+OReVTC>&&TCr9LTC$c1TCf%fnzQBznz3dGnzE({5?BI)Caej9covT! zj>RExGdF_9tTBQ{z_TiJzK&gopdo9BpaE-upgyaQpdPD-AeO}<sLSdih+#1Z>aaQp zYO~r1YOz`fqFFS8C>Djl1>E=I?oQ@J;9w2}c4kMQFa?2)*$`Nn6@i6W5XitTE##P) z8G(tJ5EvOeg1k^9hzTKpff*1m#t=}>kj>8_z$?rFt)!I*F4M~hF40Q}F4Bt#F3<}I z{-%E;_>2C9;5<E#;2b@N;4D3h;7|G|f<NdV2!5x(BRE6PAoz{`hTt?kjo=hLh2SJT ziQrfID}odB1cG1aF9?37KO^{w{)FI1`Xhql^f-ba=nn|Kr{5#^j(&&W7(IsITly`6 zZ|FA&j?$wDzNTLzI6{vg_=<jo;7j@?f-mS72tKEuBlwJdhTv2BDS}VvCkPJH!w5d6 zA0zmPeuUsd`XPc3=m!Yir|%<pkG_ZC5Iuz8UHUG9cj!9^4$^}N-llIOI6w~|c#FP; z;7$4_f;Z?J2=>$c2wtbJBiKjxA$X0xhF~w<i(n7kgP?*|AlOZJBiKcEA$XO(ir^Lc z3WA+<CxVyh%LrbgFClo5zKGxj`T~OI>GKGlqt79DmOhK%8Tt%@r|HuOo}y17*g<z7 zc#=Me;0gK!g2(CO2p*%4A^0EtAA(2eqX-_Mk05xMK8)ZY`VfK#>4OL!pbsFppWct) zK6)R5d+EIh?xFV}*iN@2*haS@*h;q|xSQUM;4XR>f;;J*2=1VFAlO2;AlOVdBe<R3 zj^H+W8-iQutq5+Rw;;Hg-i%-q-GtyKdJ}?;bR&WdbOVC*bUlI_>5T~1(RB#c(zOWw zn_-3)^1m5oFv5Q`%wU9noMDDlnFL0wF~iKZF>DIhRv@w$Z{fQcHU;c1hD`yxlVMZ9 z?qJvyuq_Om0*D}nO#!=|VN<|vW7rh1TNyS5>=uSi0lS%DQ@}PcYzo*-44VSBkzrH7 zHZW`o*m{Od0lSf5Q^3|SYzo*~hD`xm!`7hAtJ!J<tJo?8H?SKJtYj+@T+gmYu!5~X z;AegWDpL{om=A%Mc@ZpU%MmPN%MdJOOA#z#OAst(ixDhhix4bi3lS_}3lPj_^AXHr z^AOBsa}kuYas*|p3_&R?MKFiWK~Ta<5EQdw1VyX}!E81gK_M$dFpJGXFq6$hP{0Zh z%wRJROlQ*(Ok>j!<g<JPQ`uAmc`OgX6gCAxF3Uxb!*UR0vup&D*<=Kh*dzoK*+c{r z*aQUQ*?0uw*f<1Z*;oW)*cb$(*=Pi#*eC=e*+>K<*a!r}*>D8I*f0b`*-!*S*boGR z*<b{N*dPQ0*+2vX*Z>4sEDJ$@)*nG8%S4dDG7zM*biV(827Q*mNbXr!=U?h9bLKk- zJ9|1VJ9fj^Y&5LMyI=%%81@59u-CF%l#9wq<t^no<z8hiteNL2J(V~m+Exkk0Gn-o zh!il$mJH+m#x^Icd>@8Y?-ya5zs0%+#`sgLiB^l{m}QS;o2Aq;)Y8w=#u6vr1#8nQ zVP$%TJW7_$zd>ZcFU=pA?|}7VpNSg(gz@lWFb-}e{Q{%hH>F#ofl?o-t>L`kJ6Nxs zXlQOQK)k;X*giId^<>TIW%?8Sn(l=R{eSqd`FY5*7<!J?dM!z*@8_}2I?=PEO}9(_ z%p`egYAo@)C{<pZaGTlBqnkPCpDfzXBbz1AKUi8Cgd!1#p_!kDHXBHPSC6ci<*nuN z{$z~a_o5dze7$nxcMw`{;T~J!c_YLTit_WIX7Till*D7r^kERWB+Ad@n#I%Kr1zpB zl$$5o==PTSOL$0%DfF~-`sDXe%{)Z%dWk2g8pQ!Ygy4`NXoZN3LSQ!^96U%0Klld^ zfmmb`fi0qe0|LvzcQ!wdlNLiyNu;vUQs2*GrFEhwrPE(E+uoc|Z{S*T_6>8Cf40#1 zSLx`Tf!P2#&d=kErP32p4sG@6?efCEnh*BE4R)M@KsaAio+`d{sc{ECk2N-x{vvI^ zjWACI4^u=Gl2QRmdA;?#1h%4qD*Q5H@JQ4fN4?9Pejb9X5&c<mLmZCSXun$KFW}~x zN`I0{p8P$30mSU^Y`PzED!~ezIOGb57(#M7yp<Vy(~30ssxO!tj@VTxtKwvi(I60B zi66`hpoM@CuSHG5lL>JLzS==ZA&v6S5Sji_+Hvz=(fMSuOxzv(JOJ8MdR!_oEtn=k zytxV6P6mn#WfBMBn}mTF+%O3gk%?=l)6Zk2HKIT80;s6vUg5I(dCauh^m}ROCU-yo zRGvGTe#Z+!_tCt)pGQ}lLXSzOUwy{%qs7hb>c%Pn2^<hf2`ZL=Zuq;S&v}=B3S8r+ z-@>;$nsOt#?0z1Ntv>yRpSb<W7Tx?g@VNvAnx9tgE?cy<De)#jHXI}qM0wyG$Rj_z z{0|6#Lgi%&NSfx)<~hrPvFVa?<1$q)krAUf6$^r21BZuy4+orJBB%LjaBSj#y!;P8 zJP^jk3sNaWoeCas4cv&i;_CZ(c(_h5^mU_LsJ%Rhiv(h6jGqULYXie!;yqJ&9OB(o zR{p;H@4Ibn{XB5oco-gETvSWQT-$Hsjva1qP(DxHLK_e0MlF6GPA(co(H?cFe>~6H z0vJgvz2~Q|+g1i~YoG@5OW>#=QUxS%Z6?%gUJHnaxfC!;@PNu4I3%wqCKlUVe6dlI z61-#zNs5K20OEjbf($Ua5SRpcCSIGL$F7T^pD{3Jnrils1$9;^^wVzqG$;`&OAui2 z|K4MFl|tk<{(t)LN}c^YX5UQu$+G#!@2Zs<58>0q;q`dk0&r{cg5m$*H(n%=4X@eH zBlS7xVP^J^66j--?B^l%T=b*84Qu;(G`$uu^KlEDEyeX`EMcC7X8DKnY7h+*Aten= z?gR_jl-8l6$(KgFAU`LTxS<A0&^Wu?9*+m^Co@TP!976;OL6o1DGHyf!CZbGk<Sft zDJ?es;U;9+1#0#4FnqOPRwa{o9DW{zuOZB=e9qVo(BAClarhkcU8}{<gYZSucOVj~ zkNO9KQYwLYmh;Pd4sHs!fP=pv#32koxDx!XUP#=5e?lv$IpRwSUwegq6_PL(JX5^V z<_NRF6_5$I-s9y~BxErB^Y9DdN#a@d4*-Q+^zEa|WBfdpUK^O>>A;dYcFci){5Yt{ z{{G^ex0s=^KNDaweUpoFaWPeoi?o%WN3I)5-+&*IB7eN(yvOMBq=|xr@4aBzgN^+> zj$Ja{&rfu7#jZFmH}>;*cFFX0{sUygeZ>i6c@sYmYnM*<@n7I)kc*ZJpLzPYvx%Qa zyGy69@o%MnzSl*X<WGgOa_C+-$;0J{EdJZ+fBk;^P~#Xs4~W->?tx2kb`iICj~fu^ zs`x$dLoBU;4@XbbQ~VeUj|W^nZR)7_c`UqGx{H5QrrG_y;bVRJs`$8>Dt;c6E|$K6 zKP!G7kS><)#EYZ-JS1HLeVKpk=;{brCM?d+1I?w<m*9g3{soTHHXf>tBy4O?Ns`^q z1JKo{FNz;GGP|Egp{q|{5T7&Qwmj}!EPY;l9;x_ww7FRNocNe!_w#Ub^#i@njjV~k zBYaM$&%n<^>tsX7Q?QqdnZP^Bn?e*u{P3Ef(S9B_E`dG`XH~3o=QM*<iuUu!aS8M( z_z=p$5PuSXNE^}}|3`b@0vJVo?fswsPWGM65+Vc<SRgzEBq4x+M6%%#0tAC1il}Th z$tEo1#U_D-=Po-@Y^^9-!53Kj(DvHLZSSYpTQQ=yY9HEqUv0I3+G^X+0!qt65We4; z-JQ%XfzHhC*YDo%GD>!KcIM3apa1zk&pE$?t8OY(=Vw;t-HJbWv}zb#nT|+o$TRlk zlu7=H#lJnh13$5||2m&OFnUxCb4Mv_oJaUBE*x9#u1AGB0l!6M`VKDjY&8!AiWX&3 z{5HN;e@>|chgn&)s6P`&MJYGjLg88bvIPIwxxXL}E}r=;3m=E$A5RbK2NW!tC;kJj zE-|xkSY&VX1Dq9I`xdSp16GV!J=&TFfGX;lzKLtq-@N~gIt)W-1@7orT=odh@U|b9 zwte`s!Ddh#BR~B#ZYYW}vza67AON8#5AZi|%^f~7h#fo6y(#U_?TC)TO#_6lLj$&1 z?7(iKKIv<a8j?Ye#21(FRdHT)1WDN{Jhk7lHxD|_z%d=+2O;3GVF{-+Hxk3Rg#TjQ z29rA!YFuGFf)2%M1E>;pWnY<CncEnZQ?=b9JbCUQQXPwoT{n{EuFPCeCTEHK9$q6K zZpMZDB6#G|5k|IUDh^dFj`#<)Pr2*x^b?$6Ce95r!He7I7CJ=F=;$!Kx>DG?l85C> zgNJc1PU@KVsvdkYG0d0;1YOagxbZ4s&&plk+QY*AqeF0EwD82EkbXFq%7(uF8lW4| z1mp2Xh3RjwB_5P+uGK^J;|^~x@IECm%v!zpDu$Qx*`C)+0c1q^W*<Ap3x15tsv~^$ zU(a`aQYxU-=v^uQApRg19yJc-@OTP<V?@a}AFb&(C~^5okJm)!J$MzSP}NY55+D^( z?#V}*M-2UR*|OiCeDQ?S&Z?b7a-z!ZbT?!riw2)wl$gFI4t^bQiny&^*u7<D75DDQ zDuOni-w_itiIbDe6{*Xl63+@AHz0~gF?T(TYhJo8<^gYrRQTcNb|~+`dc^?*AyT_9 zkLdq;k!S(<4{6#%d=SukD7oK*2Vck2Xf<JC*DHpZ*OL!i9?Da?a}R#H4*zg){tM5` zABgs7Km3#@Jn$)NhXmaC(ka}3u0_b&#&5pyVS$A!glf#Rhy^~E3c-4|oVLj9qdt|x zgFeL0JJ=*)JLCVtzm)Z_S&wAhnw1M%^4+i*yG*~ZZn1OQe#dNw$?~-2j~2gWi20Ct zmw9RS?KwZpX?NX_GtQjtve*{c=eXXtWo5fvyPa$851SV9368M!MU%-n!10>!8)3V1 zpLIODH`~GvDlhNjL?~i6X$=lcPLbwo3pTYj23D_cSF&~>283@y;l7nNMZn(y60m__ zOL!M3E>D{x<tRZ~h+r+S2IUYrzD^JRX>!>MW9YtZg~8^wRvB<v<}{Q6iVcD0K#0Q9 zWQvUyI$(`cctq-yI^<7@5y~<>$nyIV;xtp6){qvYcHB_d=-)t?XLZ+`w(5FL2^6Ao z)#{1Ox}aDTh$)A*^0cHAOM)YdS+I7p>-&;UOY?=9EK~Sd=fB>xS^KlV?n6?)!rDMc z&U+>Nyu`Fo_tT`z5To$!OjDQshg&JES2$QEMoju2uJgAdTMJ1|IIK_n@sa~b4FsC~ zjlM*To$!mfV#KDK6<-37(MRBQ!cPsAM-|>B+%v<pUYAa{ZwNNmx8UUg{ZCR%7@n-x z6TX_Fc?uAtaB2>MtF;TTt=(520zeuizbXV)o?M$b^AX)<kcL`{E+frBQH7uBD@k0Z z+S)@Mwe1~{4{5@`>XWHL!{6S~26V`}7?s}|(x(I*9r5vRhA1Rbh!KTDdcu-Zv?DP@ zB}B{HY!5OsFPvrCs=byIy;Vz7tDk_$gkPqiC15ZCJjz$;tD_{1Z3=c`+yythAq{Ti zfi_qx(+Sw$W8*bS#gKv~jef#UygDEm6xhAmmX<Zam~OtU2gW=_FZzy_<^vXrkt;Nc zpfH7GYarAVY-@`ns&c2Z9?9D;iEd~_36<=3!f%XpF{>axxqEmgt;vVnB1reldSa(j z1eR!<6#VR$hhx4*Px66_kW+QTd^KkNj(8=cQD8YsTWks`WuU--&TozvxIO!uEH>z; zp?S@LhL-lAGNtd<lT#!`h!-vp)?>Z2^3r;IO`^X~Z4z>?i~QgT%nIMCKqH!otbix5 z!o8Xorco=HJj5qq{0n-(08)xv7k~mPYmIx-pcDtwh_9@+r_n7p0k@~l-%dFi`Q2%7 zl-%PUPh+@IQ2&JHbf_d!Eeo|||DVae&T?MN*_u=0`U~RpgRU{~w*G2%UG`|_`_3nv zw>htHyzRKpQ4aLKe?rXq2-~~1hip|gv-LH2($7Nd_yJ4AGS7V0{Gxf2c{<{{U&vYy zPjx|jMU=#H(PnzZbhl|9EcGw)jl38Z`lp3e!g%%pUaRex84c=yIP7X@!s5EEuo0P- zD9h43m_M~69JeMt4m@D2se$zZI@d*!3|wm}0EG-SK0I6!t=9qanBbwcu_Ko7u@rVz z?dZ75%jIDzmO!99S_cYRA*U4zvJl$}fo9y=8bdxRhjlg$LTc>l8Y5*=4J>nD;nj~h zodEP~YpIn7;nHZe4nCAA5PF8h>a#TJGeSW%yPgq6%I~gAPE*v~dweP!8@=YhEUaA$ z3jdT~Lbb-YE_#P{?N*4y7ymP(w`*^p%EO6SP)T%!_O_ustxUmYMsL&p@?c%FA3J63 z3S#ed(dF999eWxi;-kW~(OXTdO=Gpm57R6Q-9aggwA$OV{A7G|_r+g*U38gFzEusU z6!u{4uUAB#m|&m)WiTUa2XIy>BrT3-MJdy^)?E&TM(^6ABzmI(#Zku4a@eG`_hicZ zFWfYm5v|hRdTF;USRX8mYr-s;zO@S>@vy2cXGRxmSAV4ti9NrW(MkhPC)V+^VI0?v zwXeK9dAF<#W_1Iqlr*U-i7wEt35hH$y*X6MVYSz;35n+$ff0|5o;AU?RdQ#9W-%Ma zeeD8C5Ly+e2?f?GId<m3=&yakk|09d#0VvrnFH4V?E{0FPWvi<FhQjP?gRRh_7FEU z9gPisEIOJKq~^lMKzptMHA4-dKwwRR%zQW@XwRRZCR5uL3L=3{ZGzG~_$KI=bXyJ4 zRA)t+2Ui9|bW&1QmB9x>ds9f1EP(ySUhVP1aYB1ehy;zAV8c{J0n6ZQp`VS~))`Y~ zsA!ZJpn;;S2`MyY!>dDoYig(|o;;~oAyNik5dDP#Bdc2#8Z)CawD*z;k*;p7ZEmMz zA|=u3`a7r9!M1vIn0R~^d{A_Z5b=CyRH1PKUO27j*NB)H<0MMq=%RhXkdS~}n+k;~ z#wfI}k5edzH;w*ITIMB)c}K7Yqn2!Kod<^-{jC)V=2BX{7d|@r<=TdtRVh}He#N3x zcXEC?FT8j3GtkjqKV4yf@c&1eidoJ-<}5>Ob}MlA9>Ti+JI<Mo*BrOn|77p553#)s z%(;oy53CQFimj!VKU*HREHIxif6Y7>G3#rx9O6FHCb2;rY<g4Ma{lsNmnHDuR|0zW z0Tl#lEI5NTg|u2OTo(+imkm9S>+#S?p+tKa*yL*OY7MmYQmoNqqD!F|M~7`wY_L`X zX+{%UD=K0#Z1=kca-d#7OSR@<@8~f)rIa*DcJfS6-U%P(6C<Tsci1mUvNy}Pie)~w zU5o@XOuwk8sMr?@G_|Y?z*sD+gpYK>M=8fJb>LUmijn!5f9WK77caIg%Ex6)aQ<e0 zLx47K)!EY6=}fhgdP=JVsR(ywN_%>}9+qW_q@0RC<}xddMw6uD39kw<Q-bu@H3geV zkark@1dnxwNi3=w3Ol98wwKZnV?8XO*|AF&b6XP@>oMu|MXtSNO+YsB3(M2!5@pUP ze?ScUpM7j7#e!-aY4x|Y!D*(>mz<=0M7qW8?GZicvKY(!K&E(ggXV+N=m}*ps^}IK zO)B>J$pY!?fQ8dn9}K}igStPMEINISNWCe$r}5#9V&pc1Jz*a&o#g9ig^mS$m`Qhb z`BJ<NJS}3xm${b}#Y-rsK<=w>quaztL&n}$G(#=XMt|P|9TO5Gfy}*gy84||m3`FV z$n|2RC3CNw7Jp@LZV;cpuFe+-g<3+s#1w``(W{!o$nBYX@3k1R*LDO$%9t%r<9sxj z)7wTgi;+7s_qM5O!OE4{*aD-Xueqa9P9ZZSqYa~Iiu!d*J+`#U9;SR$MjJ-aWcAAe zP5vOIT~)XGVHxdeFxiTAHNDNfuhuy9b}=$7a}}60*(ykPaBK?JA@9O^zifu$m1O@f zX1}EP|MfXDTql9acBd;Z`<L0<vu8O^Iltw+$!T>QaBOfC0mZ)CKGpVn+fG}B^}KbT zwb?ojD0z=sDuDt2ZF94EY}RkHy0az&kM1F{!t}Z6yQVtR0R9SJE&N5;C0vb{{5_6k z66Me?)M%6IYrI#DE~;tC8i^8X-)@jDO_&N*gyo4l+9Bq;p{~RX9>Yuv^+4zZR!EeA zdq(EordFahiL!IA$sF;?KBXwsf%@fy=Dzwye}k`fRZFl|b`-otqKw{?GW1qe%`A~9 z$+y=0+$nBHeS07-k|^c(V12yS)u?M2&L_2~PjW!1kSN>t73ok*7~B>~l<zw&#zN$1 zg<uSsvD|bSYY6#U$^CzUMCrc=rc=ho7JrPb#S&t|BE!<5B|Au9;wcxiQlgCDL(-v# z@hjLwiKtN2Dv5G~k4%Rgwe-3Ga>K<GWSK+>!FBgpNNc82UnR9ttec_be}zQp!L=%0 zO3UaS<7hQHN1`<0j>2V_nUTXoAXM01*FL3qO7S(6Cnphh1uw(e`e1t@dGoh)zzHjv zN{M7AONd?~lq`yvSR_%7@WHyDS9QFqe&Yr}C9%kGjrEu!9l1dk!fflWs||HD)x_AN zRN-11XP*QE&E)ehyJpUn%%G+<F?$NNxTzg7E0?lBMyub~1!Q`|w#p<Cge=Cy6;Jmy zUqVn~q`xs5F_CwK<OJe#C7zCS5@B2A5&}YvOQ$z%Yrcf=N~0y~U4Wp%mP9Gtx542o zCL?)UO69V*I7-RBwRWf}IuIi%?+Rd1Bs;?{j#9eswCK@ZoL`QsM3HZd>dE!pCx4+p zE3RWYmGHm5IjSeucb_y@b)b7ir%x_d0rdaWrOuCTFka6wQLbv2b9c^*c7alkv9_R! zNu3kz1RaMlI?4v-d|*l$*56pU;u#v30gp=iVAiMLF}lRlE2>=87XivD&E8ej`Og6y zmSL&ITqk91XfrOgBnPH)0BmXRh!pqSw)U<@Sb$Uo^8%GiyG>Xj6mO661gAXOYJ?Ys zL|b88#TNpYi$w-$RLu){N%A{h2wbl;iK%^$n?TH@m$OiyA<&7rAgX?5v{Ad|UMZTq zmn<vJ8oXcYK&U((kF`+OcS&@$cIT25LSTgK|3yL_1CDzrXNc>7YYVRw>Rd(Hhq52Q z4!{xT*PM%;CToe~2M(XZVt>)zW}gWEf5}#CJqYODd*Kc6MZU{2)BLgUIWoUBn+vl( z1d6~C@pJJ7;Li^;{ikV%X&yiM_gMP>SAB=RD7~cc!uV{5Kc>gflH8}Nun~IuRhq8y z2lebFU6iO|&)%uW@{mlf5amQrC&gmRoIRk&q?k-fRb08T`Dz;dwQCyT0aU11Hu(K| zVzZF`R*pO?OtijGuwhj@rdOd@Y=$sbk4wOX)B-_FvYX|I);W5Dl`f!!1y^f_Os6b8 zIzXq0MTdFy1Oi^b56o~4&4D`fx{315OG{F!QBEk;)2I~Al7?Jix*nTtFO6nYd!Uf! z0J5#x*Vft?B-KTe5@zXvAxI@Dn|ESCHo|p!Tscw+#T3;C7HiiKS2NS$N-gynI$~uN zrWAjBVX6*@h~CE=Wr&DrdIH#$ht<p%XQaE6=epE;ZqU;<F5O4TecpY3F)~N1)!@?f zRDGUG0DMPA1RyIu31Fjf0mM>T7d8dz5HCwUOhoT4J?;q?6@Y4G#JiS?kuhnDG^x|z zof+Y>1}zhiIC8l+=`pikwA^H)#wZfZ2&Rx~5LGKshdykSq?wE|O$h241Condn6y#C zSsIjLOV-5n%4EC>;;P&`wNfovg%idVFi!V^eGTDk`pphoj4+hO_Hu-CX-hG_@E1<r zB1Wz;*4*Ny?Q6$HIFmMm@#U!SS=ypY+O`rt*E4}gQRSEdrtZ`U=k?4?`y{E_Lgp4d zE@XXDOWxt;*0kAE^(Vq#^-SVY*o*Hdb8&?jnQBn!FoA2u7A_h>Lt6@H0u4xuj4!$h zlSr$|%onB+x3BCw34hTu!B3H#YJ?O{ll^~_Fq7qQ*RNf#xqj&S8uGENb<K9=BiGvV z+5eEe)_K^u*ZH9H9_Lo)GUsd{`W<#mbPThfvj2<yA!M;{vzH@dU$K3(eW2Ze%=Le@ z{mFI+dFv0@o=2v>Cv9J_ZLzf>U;RoT{?E2ew~e<AMsB`8TYqBRkKFWotq)nZTQ^#p ztbWUvELE1-mT8u;Koa=C{7Yoed*1wv`5to_vH<)MS>pdC>z}j2Sq)j<tZNZ-a9;d1 z^1pvqY(}Q{dEzv2oajMDyWg5#Ha&-2c2AfjWOQ#thJexh6n~%pobTh!yqepD4}@O} zPY4eP5y3B1py0+2yF}pmdA#jFF7pnM2q1p~4;^?kGJxIREld*#Z*lL8ArhhFU&q&O zm^OzXB?(OuyYT?k1hOZPDYK<k{C*{GJt4YSW#>qnL}2#0yrsU=G(#dN`w(wF_|~vR z^`0WYtA>FR*~8gjKw5^oah`PG2f%fDy!b0xBtp7(@g_b}B7FOD-gw~P7}3pYflf+@ zn1tQy%wod{;!|X~H%n^>^>j2})4U$J+}!Lg{LZS+J_&00U&f6LgD{>`jyY7sSdr*v z9AWwtiisk-7w4iwA`JWid^Km`H*@AoGXA}j2R}VjMR&7p^wjC6&E_FUgvbH)>|xe$ znDH{VSmyOIV5D<U<hV*)5OrL^pInJB?F;y-Z9kzmoAEE-nkx~geF1OSHaQ}WW}|mA zkAHT5i9qW|^ZMC@>QCjy|K9Nu0oUKc1D}p&rh6AaA}C=Pl7WQG9uFIH!{gJ}=2pGG z;Qa-gc8ZgwI^12)>sFj&=eL^K;iaH6VtMQH1$c1(sf9H!kJ{h5;QfCtV5iI#xqEjN zuwz~GdA3A2_E+-Sp=Zw=+<4Stl?bEW&1<%ByF}RZdE9?Oe3B242$+5Xul~YjV4Knr z1{5)bZ<BoZA(#7pxaW4eM9A=Yd?jZ`2U#UTf_L*f->euU5%zmAzvDzh96}WGfUtmi z?XgOP^X}%ihg?&o6*yhZSM1+Aa^!=zmGSMnrEtM;fM<s*c80wkF}GR(+$;0QRR?rc z!DF>rMUzD$cy<@R4J<FmSsq`0;z2K}mB7gd@LR950aDc>$&lmxmf2TH1UWvPFI#tJ zkXM3mybw865I(HK`7DWW$T#tux0FVi``D8N<B9|Kg*|j4*MjmFCl#o9cKC~4=7FuY zsF)9y2)+DTzVygr&R4?&DFK6ApKjd7y*BA4{F=*e;%;H2L>T1d{Kg}@?qaZ{hVh@7 z<yYhW>aY-I*8H0Ky9Ap=u;jUXNwL*ERw7jLCA?~jWrR@uy>Z06+08t-H|+HSZWgHb zUayzlWC8vVN#%xd1rp(vSMbFXA1v73k69}qdXKvz%y3xqO;6&(;|&V~q)Oa2fmd$X zCOFx0`js@%Bu<wIUc8krI`PkS)&0z7X09!A0)QXby7|>bPy$)CO<|!L`?NiK>3aMy zTO@)bckzX&8p0pX;|m^Mz?^wf1-^{s6)SAGGas^L?8nSxlL&S^m(Tx++q*z2r?&3q z<)0OtKK__Mu+2EUu~we=Le&DuS^T3bu}YM+BmM{VhBC~P=E-QueBPC(U;2q$m$(~d zUghvw!^$};l2`;~Qo+zV-Qh{z@T99GLMfll=dSkWS69mq?6&T<j`pM6XbMh=;K}p( zoQDNdIY-$Ehup<yFU*z*Ui?a4b{~8laBq%8sNzGpch6sc`{MNZSB6UmNCYfCftT)| zeui67J3udX3!*4oEfK`{O?=kD$-IXNqvV&)w#pKd&%;nUFLevd<CF-0JfB}b>)Df! z=ZvvR1V8TPCEFZ!iJ-^x_{^I6uy>|Jz~k%qb?<LkF2Y_eLUsZXVD28Iro<;5Uiw2) zMN&veWNtyvTDQyX5+h5b84zZ4D4%g~Z`DVyoY_WT=rYtZSfEoPb#BM`Zq~VveLlqE z86djD&T0!|2Yy@j@<(qHO&r3};l7@?2H@^@#Sy2jL4hiSW52xW7X$aPyiOn^PdJ=) zI437Bc5}+#L_O2x@Zoc34xPK=4%S(1**vJ_b?#*oy}1}_G4|NQt=n(jlH<LG_5Ayc zt%L4HF^fKiLhSrt|G>_>`Csrj>g_<5O(I0~Tt2<xxZscoO??2LHht>(vpIH&u+;PT zwbP$CIn*W*l6o$mircIb!Kl0Wl#1gvi4fFt`Q(b@X17E*=^kD@z2n?lrKKNkJ$Ke7 z5lVV4pS1hKjUK58=U!fP>YJxa_wGIV)8i$jrEl#$fA+P<&YwPg`n|1Nw)B$-?Hq7$ zr>2yi+<)@m#+IYPK#Abakvz3?^|`lB<M!R>U)VeB+(&zdWlMy7ekH$V`t_wpUpzU~ zE)m{&9-r`yvnR4G5`mh#_;~J+2+Di_ANP&3XWm2+3B-H=zdF}@{NPNBG*-TAEVoJo zS?=az-ri)D2&vr7N58$vCJ`QaE+6%cPlolE2#tI+FWB?p`OiLFfBdDBGiU9YW|Ih( zJeQCB#_3Y4G(vuG#M?HjMA+hPKK$)XIg$sbL%HXN>_91Wt7ouPBJ^)JA4cyYd~Y`& zN~eVE?dC)1wFKv#%dY}a3;ZRiAcK*0gCMta`IX=JB*zK=LsIuaH+*#d(D5NQcns1{ z`EQ@Xh(NH{E<O;wAfa8mILZ!xIpj3pSDbMA-sRH3P5y?gvDfg?&$JdTk2j|$b2fix zEY#PDK9}&Xb9vsw{e)cjv(bp%f2H}!_cs3eJ6{~)|F_u_C4#=bgXfNW?Vac9CcA4G zYxP;T9TuTe9{gkDo?)LI>MlI|)4g4za^0+_2+n87O2GRa=|=y!{iU-1c<iO&?|&q` zKbNt)C5!tvTdWUt{kvHnT=QJadu)KG06u2aZ@Ui$+|+7@&z-x(D^m~4-J5kAKF5x5 z!gY+~kb{8$?J6=+a-o54TftpN_Bz8Jxe+stTYC?bR|vzaL^(L~;=kD8@x;5+aQs5@ zhZkSNs!M{0zEF=8M&bZEmya-r(8wwOp*MvKVsF5?C*FzU?rLOmnGDx5nz>{*fBMnE zCpNBs_lbtbAIfJIJpDHJQWr3Ek)5$wch&C3TiByT!aP&hc{LozsAqKE^unk~2L|5j zDcaUkP%lOz`IBlyCp&jFm_bIPK|Q5{)eX-uYL<>ie|~Q2EBF4m{s+Ps$&O1maQl{n zFP=MGYW?<e8;|^|?99m{r(N6Etv|ZwXwPdo=Pe(U9&uUV(M2j`gECp=Gi$C*vfwP2 zTRvS`J_}AzG+{9FeJ$LH3C$o@J_3C9xF@l!^BZ6Larot;uz>$fR+Jo55&VWWKti^* z6jk?lBH2<F)mT2y;ztghy62OcElcQ546Db+<0DrLLoN1U#<l6_kt0W%-+8WSFa&|w z>S+gx7-n8C?vf9hh{leJ3NKDPu`lw_IFZg{7dY#A3D57xe}_lqg95&Y`0dz;A4$79 zg=ui3;<jck{%ULgH!A@2LG|i23!?YkLV0i>IAO%Z?_d9lV^bL$jwu+9o}c{;JQmsD zJVkObEo5R2+@Gk?^HBfdkuQgHLt>>Q&^SDR3rBYKZz#%NX&y8{Jb3U+``%^Y@7lv3 z_X8~cX!o2~$K-ljOSe9gg@VaUn~~R>6_|X*H(0j|r`8>v7<u@n=juj}fj<*fAw&0k z)m<+xf9Bu%=TF3VhQ@(xL_hMd0x$E1vwHaQ3Gi3qw&lY4r{2kL{KMSct*@?n?2W)r zkvd@5VUt+G%X)H#oqBQ9o~G^BytgQK`e67XVFo9h<DZ`%`G;u(KP~=bm~Yf4Tb=B8 zKOKoIWt;J9f$;g;qaZlcXOGwC?hp4M%1LncDP)}>fqL;1x5L2)-LY_HXV}ei;Fbe< z2%p`w6Tjg=3WP3PsT59gcKA;R|NO`u#SQfn8y<VB<kb0L<)`{Zg^%~IdBh<WSR)&v zoiyl%gj45EcAnc}9%S<~@djStl~7tQRUaJ~#lM1=FR%H`zrOVNxoMMq;hvu@-}L;F z;mqr&8+aaAtGmK0e0)H-gJD{1WgmR$fa96*?BpSz;O_bS%y`ku&VE+9eC{tlEE&_u zr@uTJGp<H1u$MMV?895Jayv&ViC4*OJxnj(l7&eFCUQ7k8NqK*7GzjMpMYgM_j+3$ zZjX3B``vg<Y+8A^6t@VhWCYv)Dl#m1aCaFyJO(xCb+c+=4Bjv1vw^1Jud>6AaM5n0 z|FH|rY&2_Te5Uya<{Gm->wjhWa=ryDfb)n1Sc=Sl-^#uvTX6oPv&Na{c-hhF7|EJV zqwH_;``GKIjiz_712D<<zU@BSEbGVCM})!F3jW@0Vq|jijtm%=j|+dPDFl-Hs=lDj zQ(W^CU}*_Y(<G-Cew&`1xQkIv4vkoz4oPxDgCi{Y=Cr}b7h$cmp>(r2jr}}XGMdYu z6fXIHGf1>nYs7FG@<{|&!C_t<jgn4WuA(2w=9=5F#c0zCF{UU6JgZfEc3I2Bh*m`A zLWM>wR8wIqVex_f#u5gs(BtE9F{&!hW`vZegFN_zG@_6cu2u9^0^#E=PGM{&6j^b} z5dQxRzfVJRT3g!M0ejU3x066)9kMh8+XJ1lcSpCLed!d<Nu}x!h5VF5Ls+ZF1ok(G zs#Ha2)nkIV7+p2NmgQn(l0n^5`ki>EtZwC$n?@)}moU0%?9u~%7BXeO)#JpGQg(&a zMD+fDZ9I-NYMHDWiNP}AT_I$rF}kP;)|2y5%$dol$8w)i8)}lhgReu6J@FD06IE>2 zV=le~J#}-j>2dl<rHL*F6PQ&kp?1WwkxC0I^cVp9B&TNXwse>a#8Ccw-TH*8G&)9Q z$fNPu7ym{jUXn&5R){8QSeHRIReXs8t0iboqn#*YL6TdAusMw?R!Axhc}p5qtWawU z_(QdFmZ7#Znw&ze5$P8?Vwq+_X{d}skGuk4KnCPxEG0%Hjdq+ulzb~{NDaf8V{{db zezYJFwq}k|Wg@Xjj~7Uail-D_t>_ywQvTRfN>NT&s|?TVdwGo!?XCXp8Dv$d|GP8D zYOey^MfU%z*+VR6d(I%({-<QWmVJ}+ch0rI{C~zV-Ttb*&UV!HMO&fuEo;c?vHaMw z-g2e+b+bR~PgxtX`iswt^G&BsPr=Tf&7XyB(kVPAGztam9gsA9%!MgPd*owWg_0aD z+BZPE%V9Fo9#Yd6nZ`*)1amYG#wP8NT8c_z5n1cUWFh9;1UmC!s?r|x(HBE9Jy2Q- zBNvN|*BHK{=BTfLVR=FWs#P$Q=?-ir80&aBl_hRtOKnr22^1H>!lpfDOU-9Yatg&d z>H}B82FD_0nJP76cM*Y2HPr5}krSX*!m6h`P+S&3ulpZDp1ZpIa)jR;SO&Gnn8iyU z^9$>2YD{!eH^ZdJBG(uwwVEjq#H1z>Rwq}@43O0ttQ=>KAP&fR5R<~SjX*GOYQ+{8 zIlec+%Eux;t&!Pn9Ss;N+YuX}1d6M68nBZw)u-GNzr(jK*cPk_!quLZtGB_D$Rg7+ z_CEE_NgeExEV4Lbv;i7Jz#hd##gmFA10Scjc*-PMWCW?3Igw5N8zO6mRh31WGFGf9 z3D}ZL*Hj%WxS5pZwMo*P>MNR2JOk3Kf^nGoE{)Iv1eO4A={7ZDN6H4;3fPtjf+anQ z7peS87^|tL(MY@lP4`l~-U`Dui%d?3+(j6zf_YqrTrbj`)y-=K%<4MidJ&2jVfRkh z=vkyxZ)cgZSDV}yshPhGW`F8;I@&^o80Gwpg^j><)oa2~(N|4z{ct2;k@?1GCz%IS z^iz~N1os3M31<8qmqa1G6J8L8E9GJZQweS@d@ER_!C0XvZX%@@&;ozg1Sbyay$vbC zh3}m7w;=vj!&8JsZp+mBE)COm8(dKgYx#wROR`I}!l8vlFex_Dg8HDX0XJ|B{AP?p zcU`C-m&Wf4!8ONl6T7g0+Tbl$!wD#Z>M`k(@Rm*RFUp|q|4kIX5S*AYC{b-FevNRK zVv##Drl)@chOq-KSuE0$vDazEwxsp{WVVatd^KmO>#XYu*Zk~Hvv*}zIL|nrcXm1_ zIsUiftByMzcKa)^^iQ$9XS>@r$$HTGW$SFK+43XHI?F`!yXHM+pLt-`e`MXCRgq;9 ze<0S0xuzb|TGL?uGrpOR7Y+(LgzMSw@fxkiB8lKgw60E40vxCjC56H*lZ-=>s6yc` zpj#yoB#Bleuw*V(bX7xHrPL0JTA|94DHbL&x%MVDU5F3`?U)%CA(vQ)Rw2Z}XlWJR zkSrMq6|w(F)`UvLMrbdsvON$7K_*Pax|Uj?ks-xmj2z*XXcb;6IqK(=l8`P%B!+=a z78Q3fWd3BTm5Avu&ZJW2L^x#?!aTHBN@|%Eaw-+9Lb!-_iWkutIiYm|g1b^8uoJEI zauJHO%@WIZxELWNhS8@IZA4Yz*-{YnY#O`X6!sGJFc0x4+V==kh~R4?8TlN9uxQ^i zN};19BcFws7wsv7;##4$^UXtejN#&_vYD4ibw&XH5>lNh)e^{###OSiRE&r9Rw3R- zyC$c!jihx)f}eQ^+tDtTUW)Yua6+zNWa&o7HwO_v+G{yZM`i+@Nxi?LQ8vcTM|hC# z{bZCY&W)-G%#h^tqZ;KL$9RlOc?n{XwByzF%0$kHqIfwZIf9iVrb+kCeJ=&tm~4_W zJuN{1lwsZ!<86{h*-`{j86FiBlFG(*+#BpxgjvxBj-gf2g;Z5ly98ld>5HIOxX|7T z1b=CV6^++;F9pH~?Fhy8amx@nrX5rgV?f&~Aa2rTSZ^wYxv=7CHy5dC^zwvKEkSIW zaY3nkSb7~k=O9{5doy3Z3hoxoEkU5ECNVY-QEl2g9TgQyde+?FOH7aEAR^8XH?iSK zfhAo6Dq3MlRouv6A98jYnyZyaNSV4-qrR)C#M?_50`Ro!jp}(-%UFoeJ?)d@l#WYY zs3%%6%2SB|KkajzzKA8&`ErB>vdC18@=2KnB$+~!e*>pCA#9LEuFe2yl`NMc0?}}< zD5sN2j+h6YI9R;{p^PkYy+&43g-Vm#WUBIue6U~z>&b|8GeRN_Sk}}N{3KDwb#t+V zs1D8OsC{xB8|snIfXvS;Bue9&78ZOGn=vU6A{vO>bDm>YS%Cjno0DfbXL;6A=X%4n z!8IxS!|cbhE8+S7ZRefNY{v_ZCdB;z%D&THVdu6NY-?@ftcR_S#$wpDF6uAecUc0L zC2&~+mnCpn0{@dFpa-i*nGPskRf*|4pKZv0U7?ehtdiY2=AFe$4SD)rNKy9A;<G?) zh>=jMSe#r(tDFF&j=o`HvIICu*~Y2Sj0aS1)Po(SmVIjM9@|q6eso8NKvpqIl%f;- zuqTZwLyQdSZVfG;*j_!5o);D@*o2Tona~sI$vH9Sg`BT2UR$b_M5R%Fl6GlqsI43$ z{KSGg<n20$`C6kY9VgQcr{K0&k_b>MM*7G>X)u+T#Z$dag6H<tY0ygS!C*5c7DfS@ zMewa3o(Y<@ZJ~P5E6fzVxROoGRGC%kb`3zQ2c}VGAi`5}d0I}6K%~R4G)T#wl}MNs zh&AyEX>yj>S_Nmr(<Fub7yfu1T#bIGe;S39{cTBsN2Mt(e_K~`ZLhQn(k!A%B|L^X zlfAu_aW*cov53$aV@P7j<WwAv!R%?Fagr)Zqsjh1!O_BUp38YQXJ<}RjxT3X&h<IP zIm2`ETt|Tj__S-6>n>NTtI{>iRp4@F-<uuCo|-)>`%33gXOHta=hMy|&W%o=bE$KZ zbEGrh$sB)m{K4_A<Liz`9e0E9<>RshE=%CD1TIV9vIH(m;IafROW?8u{^v^Iif)2t z9LM+0Iy4YcNFd6E-Q9%K=;3?L*@m+G9-z~8TDxO-jZYjoKc$=S8dveh$9=fhH{ke2 zHi8vMZ1*$|fWSnrm$C1$^V5Xz<L6xf3JbffY~ZFU>psEOP0)_H{4w4$)ZR_tj(Pmi zJs*`=tlfm}=;n_Ud#~swWXExQ_qoZ13&7E_>lf@RcyHqZYd4`hy7{hy7DqS1JPzOw z*E`)N>#%NudYr|-Jj;Ey>j8FZrMIAFQ7)d`w5wo0fR7K2vUSJs9UnS!$TX;%@Ewc! zgBzxq8n*$Cb_|;?R0}K&B=3IR1oJq8?_BqtZS3B<f{}yXsJNn=kQ~SH2Ns%F6n7o% z`rXfOwXys^jBs`nTw^}Jzy9{`_1Nu}Zh~cW@g00Zw+m;>`F+pb{f}UR6)XTCBw)@w zjI(@}4+J+l?qFxD&5XU7HMX1J5SQ>TeKzQO*PGtG!^w`Ezg4~kqD&lK=G;B`u(g{o z5Z(OV1J>+rf;haAfAPw@a8EwJrkn5$SMV>?yfmn6`?&#bssj&xvI6>%Jy{q-GZug+ zBZ_P`^AvOw%3%e+hmZTp(D3WuZ+hnzz865WaXeTv5FRUb76_ZWtpwrM$+y41zlwmU z=?H^r&-V)!yvhRiehc3TO<C{|-tlaFL;0$Y4P;hADs;O6Cx>gy&2bt3J4?%#(0BO| z!?Dk}%E`s`68Ui0%e;hv>A9ktfEUN{yZH|%S06inehg#?6}7s%353zZ@0x8xDSH4L z9?tE~!leS<{nRV3a`~lR#)o$kwBc+nZQH!@t{cNIu%5ggAWZJ2<*IxL%-z46KnzFo z=yx7r0{3uF*yNrYc6Ae+;Z=Ow=*e{ScV%}AxNs$p9C+g^H7LoDZh|Acj)&iTnS~c` z;^9h<JKuRPyJxL~73JS=9VHP6;X=N3WnJA{&jRrdfOqnN5)cv}4w1Rvvy6}keQ++{ zvcL276M)EzwLrSp%gVx3UN75Xmk5L~k8gG#yGL+I1U`5b-_$I;yW@TUw_7E`9dz@J zzX8}Qp$-n<8`klD{e*rJAr6k<T^s&-X8)h1u;38@4%;c;(OF;5*zpnYYNxla|NbJD zU+%63@TP~cNgUN?ng9mFY`d^zAe_|+kapd=-{)tAJ-7_Ez@f=&fx9_reFvW}wUeee zdHck5PgAAi*%SToJRK+%X$kkxm!t#KaLAI`Mlg<eJ+1%8imx%O{#WEUTt9NHc1_Ga zp1m)7L$)`YJKu0_b53)7<k;(2=5PQFV4J<ncE<J(wguKdTK8D1ET36kvP3Oj3pc-F z-fW(hbv)~vS=CtsK=AT$Spt_Oa9IL>9|=@qUPbPAT0NLA#2-ikN0^W47<pD3CztRT zFUKs7T$zniio03Q#~jdzv$yPKEqf~_SSrJ`P`mGBvj1ShFg6F%N%AGtSS%&nzE{d* z1DJz(s1YiyflyOWF<X^%=j(_uP*_QbV`le29We&V<MC?oVscFBmNg2ZLk{Fm=6^=_ z6(-iDk3xd^>D_rIwqD<}an5hT)ZC~as493Zxkf87r`PTVo2*+ZqKV>FU^$@O(>$46 zN>153v4YSZgq}=F#o0x3%KES*VUal+eN{EnSJ`S7W2vLvuk_Myh_$|K(9_(8mFSw} z8lQz_5``LRYyb)sC03~viz`aSt(SnDlUEKSoQvg{c9-;I!6cIUqBok4Rhsr5Hib-5 z<ly{nt8q%Le&m-$oRA#AG7n2K?Y{phJW+-}GTowVi?M_=syp%Ad`ZbVE3p1E+%TI1 z4K3|R{243aT&x-m*Ius@T-$9jF~ovuf)!Z3zFmnLo!QN`Cvv9;lN?Q^bqgleq2sj} zK#=JgRWh@i>3grgv7rTFGpm}Y@lKbvQpc~oxQLzftzI8{bc>NkiRT&8W*Vxrzg5+J zRbe5mJsK}rl~o;Z!n_V{DzOsJz+gjBdE}c_iPd}t$R+&ss<0i9f%2-d_1%cg1Qr>i zQT!K`V3PjY&Hu#4n102~Yt4mOp8)-TUCx1=NKT3CjB6kA0FKT6_v{^r18_Ni?u<HT zIo@+T;aKSyV*gM34tu5DVtX0c{YtDSt<PE8vx>#z;<Kh-iS^>pzt5x}Z&{+%Bk!Wp zkOy>X7RYG8SXJ8e64lQ)fZS}Y<oZrn4GOR7rVxnbCs(yR;s0gYZj|AVM#~_#Ov35< z?~r311-(yqLE+Vj%<)ONEHabY9$u6Vt=y=><C22V_)<O2swyfefrtDigWRCeA}&52 zc*t+m<AJN<COPnsFVT_1UPUGD&Bd$q<g8UauWFC{1|2LYJ%iFw2~%d8y0q4<@;FY= z$qAFMH*MDaY-6BPMtKxU%EX9C_v32<U6}UE$<BrAXN!?6-4x<!mt#znV~e{-KZ$rt z>lNc{J>Kt%91|@z6l_@4?rZXgFk2_V&eh{-ej&90;nX+F=^f_iX>}J+YUyZi?U3n| zrAG%CIx*aQuO7(l3;6Lj1{<0I^x0d!d3uxxn-xIVLts2GUJBRygL27`fHWd#)qo@l z_(GNS$XsNFF+`v}*c5<>iO8dd%hA@>=pzcd^)!a0a)bggpJU-MJzZ-G2?caS*kxEA zp}^V>Ah}X$9yVMWkm!){$iJdTWs^z+Sc_)h3dNR`!cN0dQFYV814h&=HfG5weuO7= z^z(_*s08|io}ni3d}~WfV+`b(aCwEN?hqq0^lEymzjh79hZK^cHu>9YSNT>U8%?vn zDJd_KaGw#i=_MZQBo24z={S{ACOA~r*O!dc7sb^OlsmDqN5|lp;3Srvho0VRME{c( zW5T^g^p=onLO>yHi^m2D@9D`2ktj!kiVvwOVoL~Lpm|*|ByU3rU)B?DbOA|p{=s&i z+~qx_XA-9(6mQ(5-6ZQT8j*E!A924CZSk$cpcwCDzG_7KeYGu(jj@i37M;T5hPY4( R^b0z4RvDZVi&Wv-{{y@3Ji`D0 literal 0 HcmV?d00001 diff --git a/backend/secfit/requirements.txt b/backend/secfit/requirements.txt index 2f243ad9..d3da2572 100644 --- a/backend/secfit/requirements.txt +++ b/backend/secfit/requirements.txt @@ -31,4 +31,5 @@ toml==0.10.1 urllib3==1.25.10 whitenoise==5.2.0 wrapt==1.12.1 -datetime \ No newline at end of file +datetime +coverage==5.5 \ No newline at end of file diff --git a/backend/secfit/secfit/django_heroku.py b/backend/secfit/secfit/django_heroku.py index 7f60ede9..76218707 100644 --- a/backend/secfit/secfit/django_heroku.py +++ b/backend/secfit/secfit/django_heroku.py @@ -34,7 +34,8 @@ def settings(config, *, db_colors=False, databases=True, test_runner=False, stat # logger.info('Adding $DATABASE_URL to default DATABASE Django setting.') # Configure Django for DATABASE_URL environment variable. - config['DATABASES']['default'] = dj_database_url.config(conn_max_age=conn_max_age, ssl_require=True) + config['DATABASES']['default'] = dj_database_url.config( + conn_max_age=conn_max_age, ssl_require=True) # logger.info('Adding $DATABASE_URL to TEST default DATABASE Django setting.') @@ -65,7 +66,8 @@ def settings(config, *, db_colors=False, databases=True, test_runner=False, stat config['MIDDLEWARE_CLASSES'] = tuple( ['whitenoise.middleware.WhiteNoiseMiddleware'] + list(config['MIDDLEWARE_CLASSES'])) except KeyError: - config['MIDDLEWARE'] = tuple(['whitenoise.middleware.WhiteNoiseMiddleware'] + list(config['MIDDLEWARE'])) + config['MIDDLEWARE'] = tuple( + ['whitenoise.middleware.WhiteNoiseMiddleware'] + list(config['MIDDLEWARE'])) # Enable GZip. config['STATICFILES_STORAGE'] = 'whitenoise.storage.CompressedManifestStaticFilesStorage' diff --git a/backend/secfit/secfit/settings.py b/backend/secfit/secfit/settings.py index 8e71e610..4f3cb589 100644 --- a/backend/secfit/secfit/settings.py +++ b/backend/secfit/secfit/settings.py @@ -64,6 +64,7 @@ INSTALLED_APPS = [ "comments.apps.CommentsConfig", "suggested_workouts.apps.SuggestedWorkoutsConfig", "corsheaders", + "django_heroku" ] @@ -147,6 +148,11 @@ REST_FRAMEWORK = { 'rest_framework.authentication.SessionAuthentication', ), } +AUTH_PASSWORD_VALIDATORS = [{ + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + 'OPTIONS': { + 'min_length': 8, + }}] AUTH_USER_MODEL = "users.User" diff --git a/backend/secfit/users/tests.py b/backend/secfit/users/tests.py index 7ce503c2..3696cebc 100644 --- a/backend/secfit/users/tests.py +++ b/backend/secfit/users/tests.py @@ -1,3 +1,162 @@ -from django.test import TestCase +from django.contrib.auth import get_user_model, password_validation +# from django.test import TestCase +from users.serializers import UserSerializer +from rest_framework.test import APIRequestFactory, APITestCase +from rest_framework.request import Request +from random import choice +from string import ascii_uppercase +from users.models import User +from django import forms +from rest_framework import serializers +from rest_framework.exceptions import ValidationError -# Create your tests here. + +class UserSerializerTestCase(APITestCase): + # Set up test instance of a user and serialized data of that user + def setUp(self): + self.user_attributes = { + "id": 1, + "email": "fake@email.com", + "username": "fake_user", + "phone_number": "92345678", + "country": "Norway", + "city": "Trondheim", + "street_address": "Lade Alle", + } + factory = APIRequestFactory() + request = factory.get('/') + self.test_user = get_user_model()(**self.user_attributes) + self.test_user.set_password("password") + self.serialized_user = UserSerializer( + self.test_user, context={'request': Request(request)}) + + self.serializer_data = { + "id": self.user_attributes["id"], + "email": self.user_attributes["email"], + "username": self.user_attributes["username"], + "password": 'password', + "password1": 'password', + "athletes": [], + "phone_number": self.user_attributes["phone_number"], + "country": self.user_attributes["country"], + "city": self.user_attributes["city"], + "street_address": self.user_attributes["street_address"], + "coach": "", + "workouts": [], + "coach_files": [], + "athlete_files": [], + } + self.new_serializer_data = { + "email": 'email@fake.com', + "username": 'faker', + "athletes": [], + "password": 'fuck_django', + "password1": 'fuck_django', + "phone_number": '12345678', + "country": 'Norge', + "city": 'Oslo', + "street_address": 'Mora di', + "workouts": [], + "coach_files": [], + "athlete_files": [], } + + # Test that the serializer return the expecte fields for a given user instance + + def test_contains_expected_fields(self): + serialized_data = self.serialized_user.data + self.assertEqual(set(serialized_data.keys()), set([ + "url", + "id", + "email", + "username", + "athletes", + "phone_number", + "country", + "city", + "street_address", + "coach", + "workouts", + "coach_files", + "athlete_files", + ])) + # Testing if serialized data matched the retrieved instance in the database + + def test_corresponding_id_field(self): + serialized_data = self.serialized_user.data + self.assertEqual(serialized_data[ + "id" + ], self.user_attributes['id']) + + def test_corresponding_email_field(self): + serialized_data = self.serialized_user.data + self.assertEqual(serialized_data[ + "email" + ], self.user_attributes['email']) + + def test_corresponding_username_field(self): + serialized_data = self.serialized_user.data + self.assertEqual(serialized_data[ + "username" + ], self.user_attributes['username']) + + def test_corresponding_phone_number_field(self): + serialized_data = self.serialized_user.data + self.assertEqual(serialized_data[ + "phone_number" + ], self.user_attributes['phone_number']) + + def test_corresponding_country_field(self): + serialized_data = self.serialized_user.data + self.assertEqual(serialized_data[ + "country" + ], self.user_attributes['country']) + + def test_corresponding_city_field(self): + serialized_data = self.serialized_user.data + self.assertEqual(serialized_data[ + "country" + ], self.user_attributes['country']) + + def test_corresponding_street_address_field(self): + serialized_data = self.serialized_user.data + self.assertEqual(serialized_data[ + "street_address" + ], self.user_attributes['street_address']) + + def test_create_user(self): + # Sjekker at jeg får serialisert til OrderedDict, kompleks datatype som kan bruker for å lage instans + new_serializer = UserSerializer(data=self.new_serializer_data) + self.assertTrue(new_serializer.is_valid()) + # Lage bruker + new_serializer.save() + # Sjekker at brukeren faktisk ble laget med brukernavner, 'faker' + self.assertEquals(get_user_model().objects.get( + username=self.new_serializer_data['username']).username, self.new_serializer_data['username']) + # Sjekk at resten av feltene til instansen faktisk er lik de du definerte i serializer sin data + self.assertEquals(get_user_model().objects.get( + username=self.new_serializer_data['username']).email, self.new_serializer_data['email']) + self.assertEquals(get_user_model().objects.get( + username=self.new_serializer_data['username']).street_address, self.new_serializer_data['street_address']) + self.assertEquals(get_user_model().objects.get( + username=self.new_serializer_data['username']).phone_number, self.new_serializer_data['phone_number']) + self.assertEquals(get_user_model().objects.get( + username=self.new_serializer_data['username']).country, self.new_serializer_data['country']) + self.assertEquals(get_user_model().objects.get( + username=self.new_serializer_data['username']).city, self.new_serializer_data['city']) + user_password = get_user_model().objects.get(username='faker').password + # Sjekker om plaintekst passordet matcher med den krypterte i databasen + self.assertTrue(self.new_serializer_data['password'], user_password) + + def test_validate_password(self): + with self.assertRaises(serializers.ValidationError): + UserSerializer(self.new_serializer_data).validate_password( + 'short') + + def test_valid_pasword(self): + self.new_serializer_data['password'] = '12345678910' + self.new_serializer_data['password1'] = '12345678910' + self.data = {'password': '12345678910', 'password1': '12345678910'} + user_ser = UserSerializer(instance=None, data=self.data) + # Returns the password as the value + self.assertEquals(user_ser.validate_password( + '12345678910'), self.data['password']) diff --git a/backend/secfit/workouts/permissions.py b/backend/secfit/workouts/permissions.py index 4039b9ce..8ff7fcb5 100644 --- a/backend/secfit/workouts/permissions.py +++ b/backend/secfit/workouts/permissions.py @@ -33,9 +33,10 @@ class IsCoachAndVisibleToCoach(permissions.BasePermission): """Checks whether the requesting user is the existing object's owner's coach and whether the object (workout) has a visibility of Public or Coach. """ + # Fixed bug where the function did not check for the visibility level def has_object_permission(self, request, view, obj): - return obj.owner.coach == request.user + return obj.owner.coach == request.user and (obj.visibility == 'PU' or obj.visibility == 'CO') class IsCoachOfWorkoutAndVisibleToCoach(permissions.BasePermission): @@ -44,7 +45,10 @@ class IsCoachOfWorkoutAndVisibleToCoach(permissions.BasePermission): """ def has_object_permission(self, request, view, obj): - return obj.workout.owner.coach == request.user + # Fixed bug where the function did not check for the visibility level + return obj.workout.owner.coach == request.user and ( + obj.workout.visibility == "PU" or obj.workout.visibility == "CO" + ) class IsPublic(permissions.BasePermission): diff --git a/backend/secfit/workouts/tests.py b/backend/secfit/workouts/tests.py index 7fbbf784..7b274711 100644 --- a/backend/secfit/workouts/tests.py +++ b/backend/secfit/workouts/tests.py @@ -1,6 +1,259 @@ -""" -Tests for the workouts application. -""" -from django.test import TestCase +from django.contrib.auth import get_user_model +from django.test import RequestFactory, TestCase +from workouts.permissions import IsOwner, IsOwnerOfWorkout, IsCoachAndVisibleToCoach, IsCoachOfWorkoutAndVisibleToCoach, IsPublic, IsWorkoutPublic, IsReadOnly +from django.utils import timezone +from workouts.models import Workout, ExerciseInstance, Exercise +from rest_framework.test import APIRequestFactory, APITestCase -# Create your tests here. + +class WorkoutPermissionsTestCases(TestCase): + def setUp(self): + self.owner = get_user_model()(id=1, username='bitch', email='email@email.com', phone_number='92134654', + country='Norway', city='Paradise city', street_address='Hemmelig' + ) + self.owner.save() + self.user = get_user_model()(id=2, username='balle', email='email@fake.com', phone_number='92134654', + country='Norway', city='Hmm', street_address='Hemmelig' + ) + self.user.save() + self.factory = APIRequestFactory() + self.workout = Workout.objects.create(id=1, name='Ballesnerkel', date=timezone.now(), notes='Hva vil du?', + owner=self.owner, visibility='PU' + ) + self.workout.save() + # Creating an object that has a workout instance. This object is an ExerciseInstance whichi needs an Exercise + self.exercise = Exercise.objects.create( + name="dummy_exercise", description='Dummy description', unit='rep') + self.exercise.save() + self.exercise_instance = ExerciseInstance.objects.create( + workout=self.workout, suggested_workout=None, exercise=self.exercise, sets=2, number=2) + self.exercise_instance.save() + self.request = self.factory.delete('/') + + """ + Testing IsOwner + """ + + def test_ownership_workout(self): + self.request = self.factory.delete('/') + self.request.user = self.owner + permission = IsOwner.has_object_permission( + self, request=self.request, view=None, obj=self.workout) + self.assertTrue(permission) + self.request.user = self.user + self.assertFalse(IsOwner.has_object_permission( + self, request=self.request, view=None, obj=self.workout)) + + """ + Testing IsOwnerOfWorkout + """ + + def test_is_owner_of_workout(self): + """ + First testing has_permission + """ + # Make fake request + self.request = self.factory.delete('/') + # Fake post request + fake_request_data = { + "workout": "http://127.0.0.1:8000/api/workouts/1/"} + # Fake method for request + self.request.method = 'POST' + # Fake data + self.request.data = fake_request_data + # Setting initialized user who is the owner for the workout which is going to be retrieved + self.request.user = self.owner + permission_class = IsOwnerOfWorkout + # Check has permission is working + self.assertTrue(permission_class.has_permission( + self, request=self.request, view=None)) + # Check for a user who is not owner of workout + self.request.user = self.user + self.assertFalse(permission_class.has_permission( + self, request=self.request, view=None)) + # Now check for the case where there exist no workout for the id + fake_request_data_no_workout = {} + self.request.data = fake_request_data_no_workout + self.assertFalse(permission_class.has_permission( + self, request=self.request, view=None)) + + # Should always return True for has_permission when the method is not a POST + self.request.method = 'GET' + self.assertTrue(permission_class.has_permission( + self, request=self.request, view=None)) + # Check for the case where request.user is owner + self.request.user = self.owner + self.assertTrue(permission_class.has_permission( + self, request=self.request, view=None)) + """ + Test has_object_permission + """ + self.assertTrue(permission_class.has_object_permission( + self, self.request, view=None, obj=self.exercise_instance)) + # Test for where the requested user is not the workout for the exercise instance + self.request.user = self.user + self.assertFalse(permission_class.has_object_permission( + self, self.request, view=None, obj=self.exercise_instance)) + + """ + Testing IsCoachAndVisibleToCoach + """ + + def test_is_coach_and_visible_to_coach(self): + # Make a coach to the owner of workout defined in setUp + self.coach_of_owner = get_user_model()(id=3, username='coach_of_owner', email='email@owner.com', phone_number='98154654', + country='England', city='London', street_address='...' + ) + self.coach_of_owner.save() + self.owner.coach = self.coach_of_owner + self.owner.save() + print(self.owner.coach) + self.request.user = self.coach_of_owner + permission_class = IsCoachAndVisibleToCoach + self.assertTrue(IsCoachAndVisibleToCoach.has_object_permission( + self, request=self.request, view=None, obj=self.workout)) + # Changing the visibility to coach to see if it still works + self.workout.visibility = 'CO' + self.workout.save() + self.assertTrue(IsCoachAndVisibleToCoach.has_object_permission( + self, request=self.request, view=None, obj=self.workout)) + # Changing request.user to someoner who is not the owner's coach + self.request.user = self.user + self.assertFalse(IsCoachAndVisibleToCoach.has_object_permission( + self, request=self.request, view=None, obj=self.workout)) + # Check if you get the same result when visibility is set to public and requested user is still not coach of owner + self.workout.visibility = 'PU' + self.workout.save() + self.assertFalse(self.assertFalse(IsCoachAndVisibleToCoach.has_object_permission( + self, request=self.request, view=None, obj=self.workout))) + # Now, check if the function returns false when visibility is set to private + # for both cases where requested user is coach or not coach of owner + self.workout.visibility = 'PR' + self.workout.save() + self.assertFalse(IsCoachAndVisibleToCoach.has_object_permission( + self, request=self.request, + view=None, obj=self.workout)) + # Changing requested user back to coach. Should still return false + self.request.user = self.coach_of_owner + self.assertFalse(IsCoachAndVisibleToCoach.has_object_permission(self, request=self.request, + view=None, obj=self.workout)) + + # This test fails. Had to fix the fault in the permission class + + """ + This one test if the function, IsCoachOfWorkoutAndVisibleToCoach + """ + + def test_coach_of_workout_and_visible_to_coach(self): + """ + Testing for the exercise_instance instead of the workout directly + """ + permission_class = IsCoachOfWorkoutAndVisibleToCoach + # Make a coach to the owner of workout defined in setUp + self.coach_of_owner = get_user_model()(id=4, username='coach_of_owner2', email='email@owner.com', phone_number='98154654', + country='England', city='London', street_address='...' + ) + self.coach_of_owner.save() + self.owner.coach = self.coach_of_owner + self.owner.save() + # Check if false when requesting user is not the owner's coach + self.request.user = self.user + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.exercise_instance)) + + self.request.user = self.coach_of_owner + self.assertTrue(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.exercise_instance)) + # Changing the visibility to coach to see if it still works + self.workout.visibility = 'CO' + self.workout.save() + self.assertTrue(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.exercise_instance)) + # Changing request.user to someoner who is not the owner's coach + self.request.user = self.user + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.exercise_instance)) + # Check if you get the same result when visibility is set to public and requested user is still not coach of owner + self.workout.visibility = 'PU' + self.workout.save() + self.assertFalse(self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.exercise_instance))) + # Now, check if the function returns false when visibility is set to private + # for both cases where requested user is coach or not coach of owner + self.workout.visibility = 'PR' + self.workout.save() + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, + view=None, obj=self.exercise_instance)) + # Changing requested user back to coach. Should still return false + self.request.user = self.coach_of_owner + self.assertFalse(permission_class.has_object_permission(self, request=self.request, + view=None, obj=self.exercise_instance)) + + # This test fails. Had to fix the fault in the permission class + """ + Testing IsPublic + """ + + def test_is_public(self): + permission_class = IsPublic + self.workout.visibility = 'PU' + self.assertTrue(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.workout)) + """ + Other visibility levels should return false + """ + self.workout.visibility = 'CO' + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.workout)) + self.workout.visibility = 'PR' + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=self.workout)) + """ + Testing IsWorkoutPublic using exercise_instance as the object which has a relation to a workout + """ + + def test_is_workout_public(self): + permission_class = IsWorkoutPublic + self.workout.visibility = 'PU' + self.assertTrue(permission_class.has_object_permission( + self, request=None, view=None, obj=self.exercise_instance)) + self.workout.visibility = 'CO' + self.assertFalse(permission_class.has_object_permission( + self, request=None, view=None, obj=self.exercise_instance)) + self.workout.visibility = 'PR' + self.assertFalse(permission_class.has_object_permission( + self, request=None, view=None, obj=self.exercise_instance)) + + """ + Testing IsReadOnly + """ + + def test_is_read_only(self): + permission_class = IsReadOnly + """ + Testing if false when unsafe methods are provided + """ + self.request.method = 'POST' + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=None)) + self.request.method = 'PUT' + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=None)) + self.request.method = 'DELETE' + self.assertFalse(permission_class.has_object_permission( + self, request=self.request, view=None, obj=None)) + """ + Testing if safe methods return true + """ + self.request.method = 'HEAD' + self.assertTrue(permission_class.has_object_permission( + self, request=self.request, view=None, obj=None)) + + self.request.method = 'GET' + self.assertTrue(permission_class.has_object_permission( + self, request=self.request, view=None, obj=None)) + + self.request.method = 'OPTIONS' + self.assertTrue(permission_class.has_object_permission( + self, request=self.request, view=None, obj=None)) -- GitLab