From af905090ccef89643b252695a44a284157c987a4 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Fri, 28 Jul 2023 16:46:46 +0200 Subject: [PATCH] VBV-468: Remove DB drop on production environments --- README.md | 50 ++++++++++++++++++--------- caprover_deploy.sh | 2 ++ compose/django/docker_entrypoint.sh | 2 -- compose/django/docker_start.sh | 14 +++++--- env_secrets/caprover_dev.env | Bin 1710 -> 0 bytes env_secrets/caprover_myvbv-prod.env | Bin 0 -> 2042 bytes env_secrets/caprover_myvbv-stage.env | Bin 0 -> 1434 bytes env_secrets/caprover_prod.env | Bin 1437 -> 0 bytes env_secrets/caprover_stage.env | Bin 1464 -> 0 bytes env_secrets/prod-azure.json | Bin 4216 -> 4127 bytes git-crypt-encrypted-files.txt | 5 ++- 11 files changed, 48 insertions(+), 25 deletions(-) delete mode 100644 env_secrets/caprover_dev.env create mode 100644 env_secrets/caprover_myvbv-prod.env create mode 100644 env_secrets/caprover_myvbv-stage.env delete mode 100644 env_secrets/caprover_prod.env delete mode 100644 env_secrets/caprover_stage.env diff --git a/README.md b/README.md index 820739b1..d508630a 100644 --- a/README.md +++ b/README.md @@ -156,29 +156,47 @@ See https://github.com/i18next/i18next/issues/1691#issuecomment-968063348 for an explanation why this plural form is needed in French and Italian. But not in German and English. -## Deployment to CapRover +## Deployment and Environments -### CapRover Dev (vbv-lernwelt.control.iterativ.ch) +### Prod Environment on Azure -``` -# run deploy script -./caprover_deploy.sh vbv-lernwelt +Bitbucket Pipelines name: prod-azure +https://my.vbv-afa.ch/ -# of vbv-lernwelt is default value -./caprover_deploy.sh -``` +Deployment step on Bitbucket Pipelines will build the Docker container for Azure. +It seems that right now, you have to make a manual step on Azure to use this new +Docker container and update it on Azure. +Please ask Lorenz for more information. -### CapRover Stage (myvbv-stage.iterativ.ch) +### CapRover vbv-develop -``` -./caprover_deploy.sh myvbv-stage -``` +Bitbucket Pipelines name: develop +https://vbv-develop.control.iterativ.ch/ -### CapRover Prod (myvbv.iterativ.ch) +Deployment happens automatically on every push to develop branch. + +### CapRover vbv-master + +Bitbucket Pipelines name: master +https://vbv-master.control.iterativ.ch/ +Deployment happens automatically on every push to master branch. + +### CapRover myvbv-stage + +Bitbucket Pipelines name: stage +https://myvbv-stage.control.iterativ.ch/ +https://myvbv-stage.iterativ.ch/ + +Deployment happens manually via Bitbucket Pipelines + +### CapRover myvbv (old prod) + +Bitbucket Pipelines name: myvbv +https://myvbv.control.iterativ.ch/ +https://myvbv.iterativ.ch/ + +Deployment happens manually via Bitbucket Pipelines -``` -./caprover_deploy.sh myvbv -``` ### CapRover feature branch deployment diff --git a/caprover_deploy.sh b/caprover_deploy.sh index e6bda1e6..efb90f50 100755 --- a/caprover_deploy.sh +++ b/caprover_deploy.sh @@ -40,6 +40,8 @@ echo "Deploy to $APP_NAME" # create client for django npm run build + +# "collectstatic" should run with "local" env even in other environments IT_APP_ENVIRONMENT=local python server/manage.py collectstatic --no-input if [[ "$APP_NAME" == "prod-azure" ]]; then diff --git a/compose/django/docker_entrypoint.sh b/compose/django/docker_entrypoint.sh index 524f6902..a8237301 100644 --- a/compose/django/docker_entrypoint.sh +++ b/compose/django/docker_entrypoint.sh @@ -4,8 +4,6 @@ set -o errexit set -o pipefail set -o nounset - - # N.B. If only .env files supported variable expansion... # export CELERY_BROKER_URL="${REDIS_URL}" diff --git a/compose/django/docker_start.sh b/compose/django/docker_start.sh index b7a592d8..ce278dcf 100644 --- a/compose/django/docker_start.sh +++ b/compose/django/docker_start.sh @@ -2,11 +2,17 @@ set -o errexit set -o pipefail -set -o nounset -# python /app/manage.py collectstatic --no-input --no-post-process +echo $IT_APP_ENVIRONMENT -# TODO remove after stabilisation -python /app/manage.py reset_schema +if [[ $IT_APP_ENVIRONMENT == dev* ]] || [[ $IT_FORCE_RESET_SCHEMA == "true" ]]; then + echo "IT_APP_ENVIRONMENT=$IT_APP_ENVIRONMENT; IT_FORCE_RESET_SCHEMA=$IT_FORCE_RESET_SCHEMA" + echo "Resetting the database schema." + python /app/manage.py reset_schema +else + echo "IT_APP_ENVIRONMENT=$IT_APP_ENVIRONMENT" + echo "Migrating the database schema. (no reset)" + python /app/manage.py migrate +fi /usr/local/bin/gunicorn config.asgi --bind 0.0.0.0:7555 --chdir=/app -k uvicorn.workers.UvicornWorker diff --git a/env_secrets/caprover_dev.env b/env_secrets/caprover_dev.env deleted file mode 100644 index c0dd90f9a4f58678817c13f16832eaee32a5a469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1710 zcmV;f22uF{M@dveQdv+`0Aq%eT#$Ln0_jkm^D{wy_S@1Bu@c@p6eRe+9Y00R7j_hw zbuWWq`w6$*Ed!}UD5>vR60b?H#bh&F*)-^(9LL{+pdUx8@A8+IbTE9+AtQIRuKJ0q!$wGGe^CvczK`oO#*(-DxjBF~( z;+#$bYzZgYWn4T+xzw%hwV21I*z&O>vqH`}pLfG@G7Yl2%O7A(lS#QbV($5*rl4c$ z1n7qa;&H1M>H$|!py(-9(~QL!dS}ofF%tRYepMz{F}Uv1Zwzp1r%eq%${!VSY*yph+JQfC0mXzQ8i z-*Z>Q_#PwZ?tu!s;4gur#>8cmFp3>>^2o+2kiJ2Zqs$nKag@yJwm*4rE`tZ)Q_x=* zKm<96*0 zxo5G-BBn1LHHU}o&BrzAZ!EgS&Se)C{(y6ebC5mNEGhJ`g-9`DBcm$>2^R1pyvoln-ZFa&EzLdBl`;eG+ z;4p}bajB9e#dU5<->O|1NMeh7Qif~o(GSinLzI7PArReP(GQv^&B#QD0`4TP73t-c zr@yO=}qWisls$)jv>{br?js&*94k%?)LSL3qu`pzU|lR0F}XHPu05{ew4sc z^uUV9sDvpQiA~3%94nFJp#h%{3ZY$HB*G1U)tD|gLQdyWx1Ck{O`X!P@$%~t=dVUY z4-oW{JZ(&yDSABsDJ=vi_$Q+p0V+0Z;)jwV)yMo6=1w`$;+R1^A)&O;RN z>8zA-D3%6k-MtIJBF>p;)vxOg`5@E5ZFyqHmivlcu>2AM=~=tW=OLY&I9(!g*15p% zUR5f-Z@(N339{(%llrafc}a}zR@wD=b+T>4hHU@KoI%7~pBy`_7F1#~#hD6PvF)1~ zT{lB+u`X3fN8jV3PKNMUH4mNHK>I$uMhc-2R`1c29NK2Kye?5xVg~y1lCy-2%w5ZB z{K%N&ypJ@o`Eq>0x}FHyCi@m=1IKO~5MQnL)P_T^Y-CsEycsYnns{9_m2D~DHgQF_ zblv3^1=)HY9Ng;J0GdY%-{ZVL=vYgu7ODdE0QNh$Wu+XX#k;Egcj%zGs^?BNPC}g^ zHA$1&MY2Gihd{@ks759qLOaj%QYBb~kV1Y<6vQGzdKwR*+NnfVD2atE)-N2VATa?I zmOqI>0*DN54vb>2p03$~ZR|V^Mb&}zy_>H6oi#qes+@#Z5f&0QNRZ|xR6{#q2`RFD z2IYGaF*_SM(`^ATOoW-4EMOe>fDiyEPt=f6*_5!>gOpn*dq?WMTpY#Htty>E`S^%9 z?6%sz4n=%ko3uyw&nzZI-Me?D)_YuaF05tSsrENvC6yX~Rzx(g%))w9>8N1M_l77t zncE*KO2>{t!8$Bcj^$NNF2WlL>Qh-A)p(vl*OT@HjK)5syw-K6!BMbE#yB?A{|UtJf-AfxgPxp=@GI^hAR2_pv_6mv@B3pF4A2&P z*#qupii=dikgY+xUQRZc7D;8&-QK^Aop(;txjFwIN5sZ}ntqZS#s>P9Z$pf(z_X^= zJ4ed;CjDtKm2SYMpJzgKtk3!B%QN(LO37IGLH{@t_i^Zal70ca0pD`YM@2rDWxvN8 E4Y|xr=>Px# diff --git a/env_secrets/caprover_myvbv-prod.env b/env_secrets/caprover_myvbv-prod.env new file mode 100644 index 0000000000000000000000000000000000000000..6c858195826252c790375d0ba78e030bc71176d1 GIT binary patch literal 2042 zcmV5M@dveQdv+`0O!J?WKEF{trjZr`jQO>B873T!I$*Lb1|w1=2hoM2LQy%dW^`l`1t)ed{M6#S^ib)f@wa6k#C5 zwurfhB>!)Cin$ky$p$kU)dk=Hbe{$Js>-DXt-oZqYn0H?EzuxjvjuKW4KYj(xGK{e z_?7#4N}KDRgR8 zfK~3xzkPwIdKH)Q@r6bpQ*EZu!ARYMdI(Ah{8fA;=|%Pf;qOlyeehl5lr8#nt;AMW zSn|(yPE-MxI;n*z4e4|={k|1VMLna|9Dy7BZ% z#HRlXXIt~zecgkNbXcWmHFmy(4^Mewb(Jc7(8`_ug|B596E(OkE{+e=Kt2QO=qx-K zI!O#&A}(_vZlLs!pyt)hFp!`S4~dY@%dl_ZrXYX0FQkxz1X?qBa}5_2-QOKD?scff z#i8c+PEF8sPG^IyT&1AF9g0jAaL)q|&0Ob_K(gnP*FoNiy~Bz1^@)t?H=ADwk^1KZ z#25s4M^-_Hb7MlMsCbewE$r*RBJCryRJ}&qT9{U;Xyx@9($Qe z?&5w+$|6JWE_oo2K}x6y?0y3iX)v^aEW5iAfQBM|`|=dvm`h~5BhAD}FToPv9Tm~O zmAFf3LqKHs?1mz*Ppd-hna}s_3=RR8)Fb8Xc0(zHK4P?Nh0Ng2Y<2NHn_T#FeGRR; zmue9tEfJZFs_dpJpc8GtU8W?hkboD%3(ck%Mib&lGXeCz{v=o5zr;`;MD0+Rhe??m zC+bTN#MNkf9Q5^qnKCzU1FDm*!g+o#$OGm7pc0+DO-ANodY?c->8O5%hJZZwdb1Y{ z1i~+}{wMbQXWxKE&3la>R^F)W=p2oLTRtFV&;?1W)uNJOiQqqijO^HJYuj^kYLhYF zK*Hi;rAJd_Jn*ZT$Fc{FFu<@`4A=qvfAtH3lYL`ob5G~{l>N9```9J*A`OD z%VAW_i^7cE@)yu7RCcNYJ1L70~F}Kc_?ZN*eJ#M%5cdQNk_{yC(c8Qq|nbr*HArxS8MK^ceab{D-EPYTmPn7%}S8FM#%Ko~D zH)8)PgECzuOO5uCUY)k zy30fXp^ix~cG@WvuA{#T7_(355bZU;5r9xKvo*^FnEd>#6>yW9(`^MS5fsfaApo2t zKEE2uPA+dQ+v%e_CXPTxF61k?-mj_2FSSc+Wyy}O{#`i+j?5oJF}r#5Q3E{#e>!~7 zb5J~Ot47tl|1Cvnw-s-7dMQWvQm&cGXg^XCfseH?N*QMj5=r45U=4S`RC#aL`^Tkv z%Zc})Xu_Kpf<-Rb*pjWAS%X=}41TQ;@FF%&9w%~I)?la2QJVj5L_RiZwstQ7g+$Bk z0yLbwJ%?^WY&7!mnxC^S+U=Rt5{sYfmQvv0tpsp+e2i>rSTi7Xlz155=dF0)lER>7 z;Oz`lJc{ak60GD1>;Vu1DNn{O;m1UAJ`g{oXk_)h=lKS5Vlzr+%nqOa!qkElc zSC8&Y2bP%rA!D@?<9F$xiEV@b3>Csu`ey-V;jk;n5HZTD&_C+{O3kfNBVZN?t0h%W YKWl)=3QDP)tzt^^f+vK41A{YSRLQjZX8-^I literal 0 HcmV?d00001 diff --git a/env_secrets/caprover_myvbv-stage.env b/env_secrets/caprover_myvbv-stage.env new file mode 100644 index 0000000000000000000000000000000000000000..c70851f3595c1414e7f48c80be8c96a48a41742b GIT binary patch literal 1434 zcmV;L1!ejGM@dveQdv+`08`C}?PIa#@6U79!gK+5TTTV2^%^N}-P-Syz>)a-nsnvn zdj7~KwOsY52CEkF``G0%j;<;pG3D*E#f=^|oTNG2s;U6A*pa}gC^wEeS3uhp`wD8)Ag)0o%%vw>#v-m97Xcba8J)NdS5^y}TJ~6IKMc}tdjJOQh#H9Zcn4Fe; zf|D?+8Q`^~MsCz(0c*|BF`+2Z;x=ruKFL(wgpAJv?wP`H5F)%=Y8@{Goq(_Xp3)xn zNNqY~NdcO-8QvrIG_1;B&Eig*gQCj7_@aTSsH^jfCY{%bcPD&`y#hMd*muhEVP16H z)sz;K5p~|(_!Y;7qHn=^*^jVJhE{roq7zgb?lO)pFHn`1KAo=SQD&6R7;sH43hS~z zztF(51b>tGoa<{<0iN~VE|U`qxEHQj9u@>ozl9RfxiCLZ3|f`@>A&a zkBYcWAz_AM49CIp$)f+l2?wMHSPCr91N{_y9fQA*&{(*@9u=_o0ZIP042sxYW3!Sr zc#ds~9_n30Lo47PU`U9PtXENkf>8%}WnMMxX7eYcAg}stzzw`+$Iag;{zagQcQKJy zYd$$rmH!pwF{LW>T%3v3^BwK-K9j^(Z8--k?r0iDQHWM2l?a9Xiw@E1`*a-)5Q|E7 zaU_Awg}i zvNYxGb%$N4{1knY@reBT^_thg_3X!kTwxXcOhmr$yQ0o?M&pf!+F|AdV_RgRB9x&-Erha7;yT!9FgdwRmVx0G~QZ3&#HO}lu zfjaf89&b~o5%*I>@E*l$dk@>DccL+OQo=#A20z}lHFnv~+_bz-a@7k~`Z>Ej!+Dr+ zX~%}{MYNOWDk;fw$Ytefaj^;N+{2QlX-(4Kf|5j@FMuJi&h6k0Y=Xpa$tk~8x>)s#5jiQSw{0d4Nvv=kKdf+|B^e-I*%>$I;DsMoZZY~qx z=2pVr&!??>@#nhi9B2!j#9dkISI7agF||2XM% z{zMnn`5JuZH6THNQ9xNrZWFIc4EJiB{&>n83*TM7k%G=deYxRWx*u+Zeg}h3NJ$hu z1fz1qla2&JvZC(H=NJ9<)Jq&+;W*^Wjo0OwL7Q!wevBX4(Y&5^p_PW|BuPpN`q+QS zvTy%&s^~0YKC};6-DBkR@d$`E!KnUYN^dmCm=59e-x30C5EY#VRZRl+hq*0z2bzaF z4o@OrRNQE<@7S)FcIaMBWEGwV&6RbocZheFmdS-ttK$(WV)Y2b6@XqPQ?#uguAx^2%hnYInkDarwjhO*nUb6GJys_ArtRGy`RsaA1 literal 0 HcmV?d00001 diff --git a/env_secrets/caprover_prod.env b/env_secrets/caprover_prod.env deleted file mode 100644 index cbf2d43fc6fed2f83134467d3848c504dd2998b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1437 zcmV;O1!DRDM@dveQdv+`0P0fFIlJn6lqHKu6^)|SVQr;G(rM1!%X3Zc&GpY&PfrW1 zLFSOQ^r<9k5HW<_5yaC3GYSCl=K><~X#TXW!@yKZB z)llHb054LeU#%h_R@pZG>l((Yn=78;@Pn2C+WNAsg2t>4y*?*rY;!g}x@fTIzxzK@ zBUKe<4`3d2eoBvYF4&Ruzb3u`z1ad^E8IdMZrm)6M_vEGi|DpquYniY`ETw%lg8#d z>-5<61c6<$^TNN30lO?Xp@Z+HdT9k`3;?7%yq;!-zPv;C8T2 z`TXMv#1{`bOmi*U#c*_jFPAM!hDa6#tWE8lnm@ayY&h`yn)zbXS2(#3{>O`^K}sp@ zTv6$QGXeP)*BmjwV@9rOrfasP@~G3quTT9z0SIA1_G7tOY6jm`-z`2u=))u+vN4d1 z9$O)3B$WTV!f*_5z%9rjWPa^?tSS0(tDm=foa5d62C4QV`duF}pRl#n;AA8d{yWYr z@&cW&6j3|(-q!jtINFs~FbZ!LQ6`)4c(zIu<;FTtuHoBrR=pR1g}Ka;u1WbR!Ub>P zgA!RL;~4p@h(2c+BOab@dxf-!NIj$)16cN(v(aQZvQi?ly4IWbbEcA-uVA>*zdS58 zK??2r9j^&V>{3P3#U{O>l}Rm{uT`R2^Hsix1xRp9t`bzsw>V1T$B!`mL`X~dt(G?{ zVnTG+#z9}u$QMF>LwE{8<8iBdTYC47)B;Z66(*vZwjWqFcj70LVMJpkU~q9*LoP53 zA1k(1S~=!^=dhfPrfzRjL$S^(x{`}CumY*y z^2O%ur8aYNjDMYKq_J`Rz|)^QPV}b{F$r({0}`Tg-WZYM^uTJ%EX6zpI9sYqBEL#Z>7hW_sgcW1@12t> zBY=>vFm!@`MqFw1KfAEVSJ|JwxbrY&Xs~^kmC#ey?@|?BVf-y}`usd;gDo!A8vi!t zu?PjL2#59`=7KjF2@%G$^9b`F<5l`f+4G}X+fSqs<|PoznMp6H6;mcKu=ewaB}_^c z*GGXGDzlFAx2ri%p=($Qiyr?vr`gvx8PnbETr9!tYu30Ru%8ji2b%e9#Ii;Xr9epE z9%Tg$@-5&^8PSAfI+(lw;as;?he(KTtX!M+U`U6hl`eSSPd9(cLD`KT8g=06I z6`5#7Y};E#)@G<2nNUdg9#2i=Zm_$6z=VGMBBRXoVE&M>RSV%eqw7CkIWVOcZq`Br zue{ch{5}v=ul@88WwsgE!>b3ghWF^0>qJ^$jMhh;7~3RsnHT$a4k9;yZ0p&JNx03o zUz4ipJ}+F(=HN)00vBrYuJWq1%b>=Vj?smP{`c9f9`5vS)IguETd9fUwa(tJT-vFs zFu57n+{$xX1>#}GylKJ%*1GURkCZ(d4?K8VSVZ<>u_q5leI3uhsEFRtWEY4bP544L zU;3q(0>qa|U=chikF5(&^<1A!ysK(LbM4Syl>AJ@+>aF@s((pOG5vY;8t#Ur#>rCt zguNqOtJJsvamA}7QOVFrBU_h;<{}mA>cy%l-_l`SMg4Iu*jQOTo-j+xF zXP-nY%9=VmfoUB_TL>;^&)hzz~byBH60k rk6Qa6pTGK?EJNx~op}Z~n=!`!yr6e9%MO;Pg1!{%IgN6sqDvT(Jx$Vz diff --git a/env_secrets/caprover_stage.env b/env_secrets/caprover_stage.env deleted file mode 100644 index 0fee939debd17e36d4c530a3edbde4e3053767c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 zcmV;p1xNY-M@dveQdv+`0CP_hOy0XNCfpXDIRq6>hY-CvB_Xg#`BSk?nH`i&R@@v$ zLy$eP47R?lE5JAz9lsn8FB1|?VNA*SZ*276sAJnr2M|avn2k7TV9rA~Q!dF@-wkwg zRR!H*_x4d>}Q^prNo6Y9cyelzVmH zZe$_8?Dznhd7DbcG*9W6ggru5otWk0u&RD%2Tqm0a|MhUySGmv>)wthTmYK^1G)TH zneK>Es{3gy^M22Vf)b07oEHA^%JDg}f9gsQ1}m5KOjU^;s|#ezP~3kQY3F{SO>L~Z>Nvi z*;q7b#mp?UihUEr)Q>du+C`B)t#>||ZiL3*mcA0fpDfMhV)$XZoOCG2PYVz(n+?~q zyZ-=cuDz|rsS)p2@rmpYh)NVrZ!26XRaWb#NpaaVzJ3;rQ2~|!;5D|q3L}E3<=7)# zVKi*S)gD_fzuB>gkdv``5QAL-qgCn~xpm2f*eJXjpT^67`xnIT&YjK&fc#Nf1^9_t zS;dfrbFWPjvN2#F=45)c1VB^Ccx^lnt zuZfv!WG)5I^#^(h=~mZc6|^>F?)|LB`Smpmm(W>&ocT#lp7 zI-*Rwo|C4NYWoBTi#Iq9O%34@cnRV6|9hWfjT2C^W-UGkqtjlw9S(Jen6fq%`40p- zavlzIW_3A!H`>7q+lO9ip>Rwp=2MD7tOEpc1r2INo S>`q4b-J+2+X!%Kf@}bW!626lF diff --git a/env_secrets/prod-azure.json b/env_secrets/prod-azure.json index 660fb8f8102e50a1ab87f2ccd1b0a1786d2ca0b1..914ac99af1de58c6b10024a4723dbac2281c41f8 100644 GIT binary patch literal 4127 zcmV+)5a90sM@dveQdv+`0BhZFzZn3HL3EQ|s1OlW6mQnPC`j?M%8xb7&A_l8R)#m6 z+e9neO(14SaER08f_wCf@I<=nL&fwKy17=*ThSP&>w0t9cU=5A8cNAE6{O)E& zDbits&|{Pu{zSxi9_}q;VS@((nV9U*1?+^BIh)`VI6Bl%@d*y#wraw^=vdt&Nojcfs_}>aVlRB_x`>lc<8)Fi(At4E=M9D-f+$ zjw7i*T7>{|F1R>3<5YkHi26zFz5ZIUX6Nhkgl;S6$NHD>)-b(EEP%lexr`RJ-`q7=`E`=XTl9^yd%OB7>ruTYy-Nwz+!BmnPt)H zhprUjsGcWKj@m>4-`)h?yvUBay%5!uFQzA0&Fy<`N~W|ZM?A;#5QP~(2buwsBpc(& z-Tq0_S?XP8&`*4@({SN(q+HFxJHMu}g10=I$5gX4;g6~&s^*~gg>C1VVeq#3^)bmH zZsKJ*`$loxXqMdKLm=xsn-2-4y?MoGtC8{lyEm2Ns z#7$?g`p3aqG%xUUHoRxw04l^Z2j)#l4Tep&$hO9hL~y^p<&d-+ zuCI*xrJ3QB8g2`q|3?ln^1pD|a4mVr@6$Ut%&4OIk$ms%G87_M608Pw1<|=4L%RH> z#HC&+O3s~65g%bF+ZA5hvWeAfARxf8ezx+J`)#|_w?J;FrOG4kuzdOn><^P{MzMKj zv9$!{I097;i^2;$DklEEMU#r7jE#sa{<9wp)$;K%k4~@U63lo@l(SCj%_nNfbLUKp zN%8LNB;#Jik+seHORQ{X$dK`ghfzbdfb4v#?9?^8@M5Dm-Y`#NHuGOvE@n)RYCA@= zeeKHn$rAK!djKv{u39DwUj$O$fz&s#-UUy2AZcsAgRRzj5N0_~)y>o5DBE?q&!`4- zOwJHvfyd3v1_GE*C%X) z<>(n@XrQkw_P)z+dT6YNZzATniD5jnQVuGBvs^F zu~;AeWUuBA_BLvOq`u(Wl+n}E9eXy&PpW~kygq*Q9nRP);jg~m=0nWZIoi7us9KT${Pukj)zLuji?*6FdQepW z*#s{H1Y2T8`R3hu^(ETCxIY%bGZKCjK702J>HU-q1P3@0 z3xafzd0L>Z5mAo>e(9jNaec5y6gL#93VVQF@9&9b9)`F3*`OIJrm(5;Q8lMd74qG{ zF5TIjmhN?{kVAy(KTM+tLYkWgdQQ!H0F{7F>6IY&eTra1FzG8A9*TsA)X* z0veWMvt0^my8E7I)#&jYkDt$ve=67Rs@~ldFu9 zwerU*r?ab7SIjqFfX36qR7Np#_t7E)o|Z{Ym1OirIs_7!*# zznd$S%6Vnjfq+@+Dh+7LEga^(qJE+Ps#43!j3JRKVflMW|E_7%ky8~H{7#^_j*!28 zDEbgIyMBge=>-9iMk!T?2b4^F6QN%`?zU>S_L(`cAheZiYj01DoX64tV%C24ACp~w zGV@#BzNE+bDX;F$=`oPcpvtnLY3ad}y}fI0x{^FGn_ph$n=q+2f{$%qdh2X9WlUr| z#$qQfYv><IU zwwFzB8O^5nj_yR`WCPz{O8a?AlQmc$i4hQ}FrzCZOU!7?%F7o9=5`5~FQ-3w0-JM( z-e9BFC1@u!(LI9Kr|Xcj6}I{ctsROoZ{=b((MsWvqg*GtlBj6@(gU^cTYbZc@;>n# zoeTx68XP1VJUR{WkgQ;vG)m8xcCGc0t+BQ);!{wfzm8?J-uQh<(4W|J5Pb@63=!NN z5kVG#K;@h==*ajIiD}dE#Yel(9`25KB?;Vq^NuIP{tQxMoBbN9y{&B{EHwCH>Q%C< zuyrR_Y`(|QS{U{V5B$EqdkjgbMfUcI4X!nzs_YFqo2zuXNo!cR%xAihx_P{9Ps&@x z(LM>>+&Vo(Ub8EscKLq5$_zzLW9>&D6n{$%wFt5e<(hY-2@9hXf;il-u|nFwZlFJ0 z$uKnTFqK4|aH#hrO@jlddP|KIx$-ocbo3m4gV8#^-z7nEC2{@W)$r#ND|DCKB*a<9 z@TIkou=H{a^L`dcJ*GY0SF)2Xr2*H zKsBe>amXJJG)9DBNizJT3oZJ@YSzD%_jQVmsym=o*{;Hl$wosom=tBzhiRiHKrUzB zE%;xciFJ_;H;bn-t@$;xqe(+`RHE+ZyWSEys1$+EgRuxb@=;vunP(0rw6bY2kLLp! z66t%E$gUYaxde7ky`dM~_yTEV1p*+vz@z9y*az@`JDH>~F7&A8uv4YhI^%Ic(s9AB z*>b2aBuJ#iAm&?E3j3S<2YS-jad)x|`Qt+7vKqV_B&=t)s+Rm(*xt!{D?a{Wv(BE5 zh`H1#+Fm}J`c*(RxjDj#fVtB+IxOPDqJrt3&J9%+N?t|;g&#flmN`vKpbwcw|JZ%X zkAh0z^2LsFxi5ucd!40L-Y@}~ZufP}<80j^&E03i&wz%Nt{0{bl^519r&TJZwJS?* z_T`>|DgJeUK%mOx4m+K_MRbFeP06@4FmV52y1waQyw_kMCl=dcK7ihuUWN66rIj^^3VY%WP)rj*_h&n}%_O zFQ9M=mZ<7j({zE@&jY|}E?c1i7gdH18wH%JEqMQdkX?3Fq2MJ|Us4pich_IQ2>6Xk z#Mt!ay2KHs6nIx}3Y4|)?i-8m%x1zY{5JkG#UCdLa1Wzn?aQw-*wHl{OLx(dO|@st zx*f=?eCqpU%$~=6!oZG%=-ktHl7w3x!;u%B8PwQ>>g7^swT*5|FSz(h7SIm2vu`V87udtWlYlXR2XrTIFtJN zvLGAYBj-~nIE3G>-uN^fZg%hZ;3pJ+`?DedE%M45f=+l$h+w?LG_nXJ>9N#exb=tV zV7{}9oghhLR#e=1^4q&aeUT94mh1d;LlkEDAL}P3iv#*6J(9nU?9?%uyTd$&C37sP|ZX2FxNzbdOj_ee@q%#{6i7eru9_lRaF&FXghlHqV$) zl?lls`6OBcqf-{B``k$b{iE%@qd{kD48!ap<$CPR{KrqT43egkc%wU&>yBjkE!}Htla@QkM z$_;7duks|SpAqp--Sqp=$yyU3DL!uJ$;ACYHc8{L^O31q-vQ4B+P$sD(+lfpuQ}#? zvP)Y}fBf@diUDMuN9^s}&BLXQq)EDT7db>oRtIN+ZzBm$ld$K`LZ-=jepieW6?~mj z*ZWxLJ7PNjawHLK`p`z|0>f){P#uK=xKFU;RttwtZ;UX$<7Bh^p}n#{dRjhCVbrR} z(QA->C5K^f5eG}PJHv;dW}aZtzZVBfeefJAES79h@P-x^zHbU}KKHv7^O4l-XA)$( zvNwls&4irn+`uYLxh2oo`I2urJt_XX+$W&q+S+AP#>u<_6kKzT^W)#*{)M_67{@L?c&U=?JL*S4m()U!qFq#Ydro65XpVsv35a;rb>SI#C~4HC z8Kgml>Q+rc8%D;2Y7XJ^=`H%@L~ewEmYFb3LdL9TIh-}=dt(G|r4|-b2U0Zl*0r5H z#xWH-J|mR)bO>Y83|oW9992aj z3C_d~d$#y?%QKb#s>ohGO;=jQ{6&ie2rwT8g0FNfUs*>CpJ5KgtzdxiaEArV0yZ{@ zLo{??z#3sRquL{T!X%S4?xZ&)2bB4;+QHEF=kakPr@lS8!;fJyA6KoOV};*_Nfiv6 z!*FBfSWY}I_yoNRnf|Wq$y~u%33p%t#w_|J$h(R34sMhzEP8oN%S1VV2 z9&bkNRXI+27COms5dclKLsN1(ur&IKt~AGLvG?)nn5gaE)#p{U1Kg{wNr}SMVs!uL9?-?#>ysmDuH!4$4*rZ=GW+31^Ey$c z5=3q6ORLR94@W?zA-cH}ufEG6uc@JELJYR$>FEHfbaY!vPiRa{fMh%%rOO~6}1@`bWK9P1)Ji9mPsvoUlFZJntk`!+j07!7m2%V4w}q@yoYQSJ>t&t zUSr(J;W%j5bcHWgjG%Z|$r)GZZaa#U?KXh9jv_ z1*vaF$Yh!5+z9kyAp!}&4-Tc|Z-%%-n%@Q?&tyllxMyQFjvw`YgZSNAzn#mwXGA7% zkDfV*qhzt1v9L|u;fxa^gBcfj-O7G3sd(`aHPAvYF8?AuwLV4XJVz@9{fbHkmLOr5 zk_$vQ!($Py6jEvh&m{q*01)z=;o$ew*z>4(U(>cbJ|l^Od2p)!u-Pn@q7?Z7c{gWK z244=nhWfl?_he0S&N%Y6+SXqdf8GGf?XW=w%4%>Ai47t2`(-FK9joimC8%2NF8U)l zUKd>NVJJww6wBPbtV9@Aib063&1{HN2i!o4$5-@8l{xJ$o*Ff}Zd=w1K~i-Ks0*Ky zQ{ucAiF1?OF9DOb)fJ1FgIBBPzbV`a5KHm~J)zJhrj4P<4iqxpRg>BEr^C z1FftnjZEv?@GM$6$;Z|*zh*>FD3EDH21+Y+0VE}+nsWo@Assbz^CiGs%A@w+wV7hb zzk)KgH&BX1F}ULkXX#FlhoFxs+Szc_W@tc7vhTY}^G8n96y1T8ZiN1D@7uCy>4|21xxu(=?_(bH*e`myMp^vpZfvc|_B^ymb;NFj7h|Q{qNxZC-U#Vo zg?2FjK%lFgkO`z(WI;fFV)_xI`3xXa09@+w`XK-k)0}@UI^KA(gmZxHJP+TL~1PXz~Gc(4Xm(UV&$RO%56U1YLcTPMo= z`#MLhpduq575VrCH}9OvJ2FA36>_rXndWh4NL9nVxx^B7ZojY}rpS)Ug*)3g9xp}| z!Ou~$wpWJK;tu5?qIM3sW&A3fz**yiXL7x%?TXIb#7V z_}`&2q?X1QL#2F`cy|mjy6KFPN()hMBtD5+@fO~?pO7t8uCf33X>o+r9}M4+X*K~M zDRXS2@w`S?CkI*QM8QPFmi@40!?*6192oOu3LSlrWyYWi?7KaE+b_ErYBn**J5!2? zASU6iLfG2t(@T&-B{IPhuNKXD7LjT#NzTnAjMxoWR6G()c1;#SH?O{NKGgB~UkWaZ zOuzc37OCKD;aJs0S287g(L{dXO$5T4xFp33(^-DVvInB{CXuL};3tKmFzw)=-e6W} zI>^qcC9uDzt|88a`-PdrtZ{D+LfQ~P`S^67??TG*!8xOUlT*T$=8EN(GCa=c`Rq(8 zw=7F*f*?1>+sqQtEtUk7Dm zuRS92dA~MmS|W^y`&+SjNHT09@A=8BKBnf!d^OKTgLxJTI?WBjoc_D?8RX~=k(l^`)0;&e#%O@91zt$rz$uxkBTTMO5ag-CNVSD*s(|`E$F^}gcix!J%Ca0JxvYGWm|tmD)5>c`^kktM-IJ=s2W`qk3sE z8Ia-06MNV}+%)eO$*$KSQFaL?mW!vqH5{skW_h@Htj1v-mO}{Dm`V>EbMMAO-cwXk z>9fVUEG?!fnTFFC;rc-0YoTcx@|BjvWcv&)|B8LPXY?1kwJ;$77wNHe3q zMG?fuR54^Vs3q*sH+1EacXoAHtzt!x>cAC@UWp{bq?=XpH}o2*CA{#A&u5H{dQjoG zt*-|90|&Ww{eX#Peo8T2@hfxD0{`}b>Q{e$hrxsvba;Bmm-1X|Y#8M8{J z9$5$-*850G$(4bIi$Z|aji2lQ^jTUm{E4TRd2j?xBRs&Y@pv)AKTq)h7S<QLZqSAj<^LTU-&XVc|D60dG6Zl z6-JwpCD5iVRcp}5rg3cu4}cl|YIp_Y8}ropJ)Z$mw<1b9$W=!C{k$7@JM z6s%3x$rdla!bXVRR-_|LaHCu|^PAR6X6I;+lP8$~Gel$5O}HE{aQM0@HEm$(Pl^_Kf=^Pn}{1`A<16ocyPRJ0Mfw0VugdVc9l!803ZW(lHUZaro%8 zozs$~*c^kXl2GS1ot`af2t%8NbL6>~paUDLT#hSur`DwTfsl7FzQPuhq^NXwEAhjY z=Z~B$i}$UL;M*2GmR6tLms96Ub0(d@xP1}SWMB#X(TnDP2bAL%aH~pAp#RPV)T4i3 zmlF~5Ib7WEe)=BbRq^1BP)a;Fh$QERwr7N0@f;Y8zkX{8HXe0u@;*282dPQ49*n4O z&u>0LQY0&x1f2_odq#~T_Gwkg48Ag=EOMAb9~mJBp}mo&Rm6$nu!4HUhXeq0fBp6k z3UPn|)YQZc*m1)>T5k39njrf6jO7kkFops8V?Ak$F#!^V_keij3DjdgaSUW2vkrkm zn?X)q2)zH0&e%h0^d;XS`heZbr591x@og!d65(JG$dEK>9?KN2UYZ~$LXkZlZ9FQ} zkKMaV2-?Y3fP*=@5>z)A3YUjkOTp_ce#nPR?8D1a1Wn>tXr_+nmO-lI_{6Gf(o%uT zlU}-XSDG=6q5l6EfA~_BeSi}!5gf1V8~jtKgLTUP@p2R$2;!2(x)4Y11Ce?Ye(qQ8 zjlJrf^3u=k-LIVjqB`ysQ6@lJ9-iXT)o+M)pAdmI_&a2^Ua}$$3Y47Yka)N7q2c8* zZ{{|#3op)K183M4c%*;%=|N$%x==A!kuI|&M=J{TWgCW@9B8eCe%|DdSjSNhOA{j% zwy}1LDs1mv%IgSL6L#=zYYBg*_C$+-CTLQ+qDw1itMVmB{y;4IXFZbiyH?Yyl4U9B zeZ6}Vs+M2LZP@0iX9aPXaVJhJlJzuh&VbK);QX%8@ti9P;GQO_+GXL8%*}6L_)FlF zfAUjg{@u&1Lie?_y`gA_ZFzK9u{rT8Ruoa>P~juzIPhR>o5w}v$yd$#|I%X5Z+x-s zJ%2ls*B*hKD|%?si_1?bft*vxPL3zGx31QXfk`5VU3(6}3Fu!sU0EULDnDddWHyxQ}hpd1hYwLl+0vFuA*X>HD04#TB>Nout+JfJ`l-uAU5`de2n*#3x01Hc9L zWaoTq1MKbq?Ua%=>wocHh%`WE!=S6oNHiY+d~q1Fg=~}dC;dxlMFqOdon#bTqwt7i zdmn5CSj8tORvzjjJrGq=;sbXLZ|zKbuFZ!aGz2a$l~VcJMeX$hOC7o>eOh()gT~zm zEg_5>+xKV7)in1QbCOVSIt}`GEl0KYkU{L3-+t_}&M`LA55^Hf7B#LkY@xwB0&GsN zLqgCIy#(Md+-N!gRIYud3n`EbKUIqF&?^-z{BMK9jpm>ghy%{qig3akI3y3_uv?Bc zq+O{s`8i>_RSs