From 5d5f09b97810515b40626f802ac55fbd9b268c2b Mon Sep 17 00:00:00 2001 From: Andrew Hromis Date: Mon, 20 Dec 2021 11:18:21 -0500 Subject: [PATCH] Added Codefresh Runner Helm Chart --- assets/codefresh/cf-runtime-0.1.401.tgz | Bin 0 -> 9315 bytes assets/logos/codefresh.jpg | Bin 0 -> 89273 bytes .../codefresh/cf-runtime/0.1.401/.helmignore | 23 ++++ .../codefresh/cf-runtime/0.1.401/Chart.yaml | 12 ++ charts/codefresh/cf-runtime/0.1.401/README.md | 28 ++++ .../cf-runtime/0.1.401/templates/_helpers.tpl | 51 ++++++++ .../0.1.401/templates/app-proxy/_helpers.tpl | 31 +++++ .../app-proxy/deployment.app-proxy.yaml | 58 +++++++++ .../app-proxy/ingress.app-proxy.yaml | 27 ++++ .../app-proxy/role-binding.app-proxy.yaml | 17 +++ .../templates/app-proxy/role.app-proxy.yaml | 13 ++ .../app-proxy/service-account.app-proxy.yaml | 13 ++ .../app-proxy/service.app-proxy.yaml | 13 ++ .../0.1.401/templates/monitor/_helpers.tpl | 35 +++++ .../templates/monitor/deployment.monitor.yaml | 67 ++++++++++ .../templates/monitor/role.monitor.yaml | 40 ++++++ .../monitor/rolebinding.monitor.yaml | 15 +++ .../rollback-role-binding.monitor.yaml | 14 ++ .../rollback-serviceaccount.monitor.yaml | 11 ++ .../monitor/service-account.monitor.yaml | 11 ++ .../templates/monitor/service.monitor.yaml | 15 +++ .../0.1.401/templates/re/_helpers.tpl | 31 +++++ .../re/codefresh-certs-server-secret.re.yaml | 12 ++ .../templates/re/dind-daemon-conf.re.yaml | 20 +++ .../re/dind-headless-service.re.yaml | 18 +++ .../0.1.401/templates/re/role.engine.yaml | 12 ++ .../templates/re/rolebinding.engine.yaml | 12 ++ .../templates/re/service-account.re.yaml | 12 ++ .../0.1.401/templates/venona/_helpers.tpl | 35 +++++ .../templates/venona/deployment.venona.yaml | 97 ++++++++++++++ .../templates/venona/role-binding.venona.yaml | 12 ++ .../0.1.401/templates/venona/role.venona.yaml | 8 ++ .../templates/venona/secret.venona.yaml | 8 ++ .../venona/service-account.venona.yaml | 5 + .../templates/volume-provisioner/_helpers.tpl | 85 ++++++++++++ ...le-binding.dind-volume-provisioner.vp.yaml | 13 ++ ...uster-role.dind-volume-provisioner.vp.yaml | 30 +++++ .../cron-job.dind-volume-cleanup.vp.yaml | 25 ++++ .../daemonset.dind-lv-monitor.vp.yaml | 78 +++++++++++ ...deployment.dind-volume-provisioner.vp.yaml | 122 ++++++++++++++++++ .../secret.dind-volume-provisioner.vp.yaml | 17 +++ ...ce-account.dind-volume-provisioner.vp.yaml | 11 ++ ...orageclass.dind-volume-provisioner.vp.yaml | 63 +++++++++ .../codefresh/cf-runtime/0.1.401/values.yaml | 108 ++++++++++++++++ index.yaml | 17 +++ .../generated-changes/patch/Chart.yaml.patch | 21 +++ .../generated-changes/patch/README.md.patch | 42 ++++++ packages/codefresh/package.yaml | 4 + 48 files changed, 1412 insertions(+) create mode 100644 assets/codefresh/cf-runtime-0.1.401.tgz create mode 100644 assets/logos/codefresh.jpg create mode 100644 charts/codefresh/cf-runtime/0.1.401/.helmignore create mode 100644 charts/codefresh/cf-runtime/0.1.401/Chart.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/README.md create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/_helpers.tpl create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/_helpers.tpl create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/deployment.app-proxy.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/ingress.app-proxy.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role-binding.app-proxy.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role.app-proxy.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service-account.app-proxy.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service.app-proxy.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/_helpers.tpl create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/deployment.monitor.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/role.monitor.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/rolebinding.monitor.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-role-binding.monitor.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-serviceaccount.monitor.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/service-account.monitor.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/monitor/service.monitor.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/re/_helpers.tpl create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/re/codefresh-certs-server-secret.re.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/re/dind-daemon-conf.re.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/re/dind-headless-service.re.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/re/role.engine.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/re/rolebinding.engine.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/re/service-account.re.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/venona/_helpers.tpl create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/venona/deployment.venona.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/venona/role-binding.venona.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/venona/role.venona.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/venona/secret.venona.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/venona/service-account.venona.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/_helpers.tpl create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role-binding.dind-volume-provisioner.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role.dind-volume-provisioner.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cron-job.dind-volume-cleanup.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/daemonset.dind-lv-monitor.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/deployment.dind-volume-provisioner.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/secret.dind-volume-provisioner.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/service-account.dind-volume-provisioner.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/storageclass.dind-volume-provisioner.vp.yaml create mode 100644 charts/codefresh/cf-runtime/0.1.401/values.yaml create mode 100644 packages/codefresh/generated-changes/patch/Chart.yaml.patch create mode 100644 packages/codefresh/generated-changes/patch/README.md.patch create mode 100644 packages/codefresh/package.yaml diff --git a/assets/codefresh/cf-runtime-0.1.401.tgz b/assets/codefresh/cf-runtime-0.1.401.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0a4d1bbcefda48f9250e43f846c69b4872b9d675 GIT binary patch literal 9315 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 RPXGV_|Np4XAQu200RRbXxn=+W literal 0 HcmV?d00001 diff --git a/assets/logos/codefresh.jpg b/assets/logos/codefresh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01fe1596b26b66afa550d26ae914718b92894936 GIT binary patch literal 89273 zcmd?QbzECPn=l%rKm{liDPFvIafedei#wEtU?D(or-kAkAUG6vcP;Mj?ykk9$W7mO zzq`A4cR$(h&-0$$5W$w~o`kdOc}hzIbrj%*?;E^hQ$Rar__ zK@yPx03fSd0U`FN9{>P|wS%3i^rv^)I=b)Bw*W5zWB@_{D}c=yXm6{iCZ!JeFX3t$ zfM^K-m|*$a)_+;-KhJn+0|pyBk3rygKyzag1fGY$ zne7k*MBtNu)4%=`-~Ef5{S&|ci`%KIiX-Os8iBtv`#1R4e}e>H-n5Ex;9E2e1H`0n7mo0A@t0BcgQ>;@=dJ4njOu0N20kkEn-$e_dC5 zQ%;V5Bq6=}1OPl+etJ5m1pv^a0f2|dr>8&ZPfrgS007D&0MKgvuk~$y0swrMi1f&R zO`}Nz0I+`m05u)|n)Wpg0H_TB0N&2o8rvEFqaPGRjBIKO0G#Cl0GK)ez?)G3;Dz2l z*9?*OHy@BW0|2PIBVN@I0FaOf0MH@IW9vUHAl3-6=l-wYZzKO#4g9VA)C$1CK-x#v zMnS>>AmbpR;2=G90w@rh6&V>B}Xt?ZR=x4)N+7VKFtGOp&%N=LBRot0)DkpA;0_oWnfX<)Z(wp?BXje zb+IlI#jCgQ@l0lA?%@!6wA75?!Q#OVueN|?2ho{}YjPB3YEa6{WhonHs09_`;STJ7 zh#FcX77bkW^6XFA3KumvB3o2$HMx%?U!&*0q!;>-d?GyQn4rNT^)jum&7^gRYO1v* z(SLWZHNDXY)DUf7W6-!WGyTfQ)ul8ZHoXC?S)$IEye=!ubzHvDm+8Ju{J+Eg7 ziZ>LGyBI3yj2`i7M`2gW>!m{%z6R23oc~@hN9XdCuA)b^gNR2Q=hcV8Yt}$YJ!Ku> zcZO_u-$Pix$FZC-)*c=d5o(Djo|F?gV(KXC9_;+VANP!fu~O#1Y|jSW-mXJo_CNUq zR_!O6Rp3sabji}>h0vg((3>Z~bcm3-p$_y{^wcwG1~2)W^3Q>Lu^bsWqZwO{%xs;o z#zl@f{96zXgB(rP(Vj8xq?BS}1G|z;R^Yl6f5NKF=nYP!XJ^S_6wECgYl08`vtSR- z$xGud?xp{O3FDcbQ%pq!E^<4KyzM)ixe}T4@%woxRdpxdxWAV|#M5nHyXg;IZ+8}a>S&W`0~B3<8tXIbsbbhNO0;o;(`$M7R>q}62#vW;1Fk66`TADu~Nm+89}z21`blVuOY88a&EonIr(eCw0h#ZsA^gqCyKGdDKZY-=rI)<A70-WPRMR?U|%9VF`~qoa~G9`wqUJWKtqNra4Mq9KH^(t7I>~xzyM7 zAm{%xkKSxJ+KBD$nX|JzE=ql-MS}A}@&91K|NVCSd_H62YhY0f&sojP*pBPXP1f zCxEs$q3C+w$%}FQPnXo|5!^s-Y}K7?y|fI7kQDYzkNBmiB7rL z&{}tUEh4;k`y%?erbaX@r8#aoZ*ryHF{aISp(A6!JPGPh2OJs-2S>fI)^mNf#X-B8 z9xf!HJTF>y7xtU<-r%=o7`*soEY;V&8MyB1f*thY`I2MLB6KHNZ$zlN;h>~giSHo% z{d6s4)|YB*iVwRo4|)L+~9A zERNUb7A@kHwB8po%|$T+x%sZdfOh+@2U5qu!OB}axa;pVxCEYy^>)Y-O=#YUtA&4g z^?RmV<9k=7lynu+M(eJN6H1!hA?WQ{(nkr@|4xuRJ3i9Q$gXYl;<_zTn;NNhBh%+S zwA!jR!kM#{Dk%*Ppczi1e3hg^DGjmdkF1%scmeIqx<#SE8b@p5J`xIWTTMoGM-qKD zjZ$Z?A7=t7PARM88&3z#4Yv;39j4+l0M;FAD+ag#0JrbyVfyPXakw6`{I^ARf~r>n+Y7A|6Vdx=Z`Y{L>56OSllv@FCSLSC`*JfEJidehHAzy`BmwK z+n*zruMY(E+jtfW?uOaWgM|6ZA?^pp^;2&qmi}ICYE!JPlHiycJ0q9EN)+?05wDf^ zi3*yH6v8NEapJpz;d__Z0k{(< zh4BE9Haot@2PMe}1%*26L^p=lTRbK~8a0vnqPdm1l@VCeCA#_nKrF7DMG!k1Fn+zK zs=6ak^fFH94MNtFF#a zBHlrE@~o)ID@V{aEtZel&V?E^h+S#>6*mSH12|1>6xMrKTb!4_W*`;ro)*dF&v;I% zeC0c5{Nsr!FBRijOH>*6X}3r}a2^DT>WePUfOf=pq+1X6u|USDZn7qedx7OK$BUjMg?W@nrb2y& zMo^foo~RA%%99|ebBM`FXCd`-@h0XuW6#t{<57F*AXw2Z=gZ8=E!U6sDlbWe+m~v1 zgxBD&%9ZTT6zs#W4sOe$(r}KjPCMd>O*ynFa3(=b$$ZW`Wj8m->ees)#1J!uTw~vM z^^)V7nGZU2Yi@AA*_6@*mK;w}bs!BJmzfwTd&($tDJnxs>3*7UE4B7A;nordm;}OT zyQ1aHsT1m4W}=AsTb=*|pI!Y_`HgS}ltYx94c0|bI+6d>JmE=ln8}S_J_qyW6E^U7`V?=RJT4;^WuKRWVfPLU*hITB_+K$`9AAZEK=Ay z`p8EeFLD^BUd72{x@o?4z;%j#P8RT8Z}L53FUGgP|2hN{J!lE5oetxEWdoBLuohBp zUIEpu)n@qM%wTR1^Y%2{UcZK_x!b79m0am7UsF}0m7$z9WKMvNILO&mUd~K#xHr&T zxymzY>4?I1Mg^?$nTn)%`V-eSv7oZ|m+KV1u}q$!vxjK7(N4mZEHvI!M0h(O+( z{|}S9I}x4KVSY3Xi#1;C0xyhY9!&$R!y>2H9y09%v`6(!nEm@Lg^ zbY}@Ozy3R_hnj`(I{(B^i;i8{H46~BT2iQ~?5Ed1qVmDIp|F^&&`DDX3DYmZb6&B_ zLHLuW<<`>nf@GH6XY#fumyh4-gLaUEs&C{kA0{;Om)ObD*KL0l&99vlAMiqk7?`DY|pE8MG7BgVY zxbite)zfuP%s(sJ6ieBXX@~U=oW;z!GD5R~0GNOZ^FBRoX@W zHO9MdVsGF5rc`sE0*=8tB5>?Pq@Z^AVUH2vwZ--+kS)du>d7d5)#NC9McNK8Q}L4Y zgeO1^tLk!dC(uQ%!fQUN{u&?mqS{A6nxW%{dl98E0@xxA$MWaMh^b_YpiS=KIh|>4 zIpW*r#$UsIF@!ieAWZHC9%qUgR>A6vM`Q30Gwr5~Xe~$eeVOU;dpQkIGB50q$xV+= zWx+YkM~K1>327yP1T;1R&d43T&BIZYAPw!<%RXx zxtzcB{du45{5C%kZrD(p#cY;XC)g`o%9J)cAz%AVuTX%xL)2|lasDbobfkhwp^|f; zILB}^fow8+pt80)d99I3JuYs{BLPMP%Bm%2cHkyvV(tdzL<#-dQ)Z{k8gS z0$58X-+M`tYJjxf0tIZNI##s>n=?d4UTuGZr~RnFy5hP|_U;#c2p;ocmtkgV;Vq%> z38iiJOV$AKylt>9+_N(MIu&`OpKXvJ5)UUR-<+GSn*vtMTQ=@fd+Oz<@w`N*=z0P` zdGRJk3Ze_b#sZGx0B38>p(ebT&e^`nq~_0uLy-4KvgFyM1Vxr|=7|Nn6n|<>eAZAl z%kn9|Kr51YS5Opg*&xjkb&L@{39tGLh+l=qNSJu)iVy)GD;TK%SlNqqBHvvmft|F>=gBJn$bV_!?rXnzN7ZoAh?zOkvJ%^sNcZ4jp@;cL$y8X!kc^n5i zhU_LcuTy}t}R9GJB1>LO3 zxY|)${G<|1P^EdQe)uvt!9ri>cdBEY+F2}p;p`l-_9D>bfX2Scbr~|6&@y zk88I!y`fE$l|uxWm_r}B${)RmmhI@iKq9}?iXDNVnCQU=aa%_8PDX6CPDV{mq33P~ z)X^6g7g5WO4zs2V&wEchoQe2 zOf|Vq!$bp&K6_5RL_M(7`I~qZ>!Y*xV6nqLSyC>qP?0niyC;B)V5JiXd*<{+cEned zDu~~Yu~u|=GDflI0}5?cLXs8{>auv^2g5(!W|AP%Z4xkZ1Z|-}e|UaUv1pZ-uYvZm z_0b63@0rh@q)dtCZZlgQqt>~Kq^`V`O`*0E@m+^WkQzNmPLjAH*N>_R#q{@(no*b> z3FJAI-0L4%2x1+?Ad7>8^V(PS;0mJ-ZE{9k&qjaSZHCrnIEnLTnk+;6Cw-?k6}p_h z7DS93%F~nDR4iHe@9!jft(YHi89SJM!ufR$q*m9K`Kzw^K)H3XVUX~Fg_;>q=>mhJ zIT!B&NU=rhIG`ovoRjMk%02IRp~2!`k(@#zgwqJifxG%GA0$sOw4Rx-$a)8?=xkgS z#l_WLI@&D-Z;VZ6Wi1EMFED)Aq-mm&bc|czgmfnC;51j1!#-@4n%gUzQ&S5EkV;c$ zjPZ=kTI;cRHCb)Vv*v7>)J-ig5tW=Is|?=g-z0xr@i7=<#{J&N%oeV>Rr(C-PvOQn z)Ej{%K!f!X2j!rXy- zc{gdeq*AV^LyQ|=*c0H#z)o-GX2r*&uW*?W;J2vERyVAhy3&tUD{*K`qmIxck%7aj zu}_QWiej_|J}qKHZnj&`B=0{*ZjNN;$U_ylM;I9$OW zV(NRZ27`v|FU0hmKajxVagFRqIz6)$XtXgJ!PL1Cwxx|Ip;$O^Dns{j{6pKoA|@|j;<30??E zcLXvLyM(e)@2BXxi*1$i{1(}04c&cLl7}E>EbA8!+r!W{&nJL*<>|Gl&X?(9@t&(~ ztchQT_5N6gRRy{_#yuqAp^3gj3m!^+U<(!IBz?kV0e8JX`}ZR+%|gp|kC~k-jvqJL zmge_AY8c0k3Gtax=rjfHoRCJaJ)4d7F?*Xc*nVmd;Iky&`+ITTr;2c$VcOh{4Bb{(6-ZOAO$n3Hz_!EUs{tIWD zEU!4$C#Hs9S=fgYkID+S*^TOpOJyY^Ejt*%grqh!$vUk?z$rNX++@8so=l>FHpJm7 zD+BiYdkRgJ%!$$q1#bImeb`bK*W?_Ipg3ly48mTP(<^>r>EyuGqFWk;=k! z>!A{@Z3FzmS^LUO#W1|7zZwq16)gz!FmJi-(3~>%ykFVDV)t1tv9uzAMyT|cg6&=- z$;Sz3SaBWXXXt%WH#t;7PBqMx1@3v1^}RRHwV4 zyX5HfAl~vk2qF#Q$r)yR6y>t`O&-DE=Rvq_F`3rpagRkh-JD&5xV{PMkg)^#(YH$> zGlF3mC5(R*+iPYFkd}RFmb8TN_35KC@^WAdnF3H?+n7yv-lf16R_&d+*36WiYFGr? z)Jvi7CkvE65?ucfNy;6Rq{dXR1@S5y($bllwhydI4OwKx(H4KGI}cs^WxMs$Gjaug zk1X`8cF!5)mdDD=C|q9K(=ef2@n3a>lKT7T>FBZrkHw9pS85WV%Vc5B^72j!H3hAUC;FCUR&_e?a!!LWNGP#7;GoQ z?^JLCbIVWbDx~gOEl%PTTZQ$O^FXcAYo6M24uH}U>(|^ zPGk<0KB6|jn&;`1?EgwIzR#C{alh{k43aW68^a;&OGvnokdT~9cuafDZhMC;3qXP? z0|<~uT-ADnK_{79i*@+=b<2hi>UzD`GsP~CEiRA3*LqcHo-mn%Cjfs`wr~Ow{-A@S z>MF-`86i?#-HCgfC7U6S1q*?%yR{|_-78lorn}oA!XQ%KwgL@5-T;0gIBjJgnAhP73vs!IgTLU4*;Vf^gl9@p*H^{igdxV9jfYVnnN` zQloL2U3zf`<{ec+!F{SX0(Ta_TDn?DswVlg7TL2A9>QT8X?@V?oOd4|-}hdFJY znQ0?zvw_1zCff3YU)T-Xmky6c0|UFKe^#)b0A5XZ4~>MF<-ZQpt32Zeei2rCoK+6g zbPqmIj7?4FhM%NDo{?d>b58293O3&?_qcUmwN%`KyGtu}L+zSEp8yQHJ3P*4k}Ew? zojvdGBT5&8C`5$`cNt%jh*XP5{4o9%vRH08!n&}~ca9Za?9iGbbZ%~WP$qa6V(?33 zRfv$(ewr7OcC8zsk1(|8h|<|V0rrwdkC|=l6OC-Y+y@6c$4M=K>&x|+1$hgshwmA6 zZrKz^w2Nm=yoQUX@e=dt9v4> zn|E^EMy#wc%9nz?W$Y1`H4o`A_j*-jp?{hOB8D%mw@7QI122hT<#MdB3sR+r9um=Q zpNc^%Voro%lxxj9@{oBF7!-fg{3{wcH1BL`&&#yFe9TINQUHBI$6CqWaeYk7qren; zRNhhlHEBiF3%GQfE~rr;MYsapEgPhwi17X`?@k_T;>$MLWJY){G8ouj32|U~>~Xnj zki{PGcHS&oh=?^)io;x8ssN!{j~o_HlcoAnn7Xn=Yw(hyF``@aP03&*+a4>~p|#T; zFD0dc*)*nxRm($Fi2SygS%RQQ=a4-D?n~T*^e_eu?HSR(B$W50oopLNTRGaE69ne%lR^kg zS6K00LnIx!{7PX3iNTiUS>-B9?R}XJrh>8R*4eg>T=*&j+&<6T_mJ=`-3o1M*tqKQ zV}TBi3i6A@TlKDwDT#{I2g|+SuZc%x+i82Oo~*7)1Ct;k8*Yr!5Yn22ZS^6S#qpuZ z{^ugTWivPASf>^<9n^{GDujAODAU&ZE9Af%|5QGqIK#@pMzR@g&)m130R#hsO@3Sl ztW}xf#RB7fOpxyBSW0tUSs4{#bp&rrKgn_WSFgq-`vkzQ72IsEO=&BRu*wCqym5}( zl|9dLa=Z#nM= zERA#m>5`vyrO|;*&yt!6O2oTlVO;4rhG609#u9{SbgxsSk;WP(k~e79?nfX7ZvxzQ zFh4z3H;a)Za^}pGc6~rou6LYNO5qu|8en3uGn<|5j}q{>ji{$HnX6dV4^rLgbCq|K zNWiY!7-`v`-ar`USS(dTM<_oRPW`ovX&OJ0S<_X=9x4V6G?nDDO&;*1OyAYdDZu6p zT_b0B={cJHt7*b;Pn$kjF=|dr)hycZCyl-N4a<^Rr0vjqEzmgbJx7ZEUEm4uq9r4O z)!~N;@0iWJK=d)OH*RfRkgCjI{a7`6ikt79*#=#A&${GYkuTXdonywB+(qvbmuMSp zequ&}`?KPFtnDD5!$yO2qP&Jf!-d>^#&swkctrETtME7XF}POWtN$hi@(1CpmJtJvn=q zxJQIlGi1liF~=y@NEO_76Q&?;YU6h*|11iLLJr0yAvTaidrpekLH#k zOk{CtvUT2#(X7_)X$M@+ug{m8GsjNgTk{clKld2h$mWq6dW^1I%T*Q=mylp3W1Mp~ zg^@7%6lpauka(0xktsMHBG_BZ*>Zr@qq*a7OHx!3mpe`pQqord%al_%JYB$(stxWF zCEdkYk(~@xoB6%!)2inld$HQjIq#c*98Q zK`NMqXQuG6vtB=t*vx2b&2bwHX}oXi+9G-rc)yGb)Ra_zL7Y3V8cVKYQgk6@vUVHy zqmxG_$yX>m@(=R`QEIy*lx)MHl;Wrqel@8jplk4BuF%sbX&h{=)sxgbc63+KCHp+5 zRz*HLu}+8s38+s){{qJ$9u{Qv{&bv7A%HQ zBbnwu@oKtL*x}Jr)CdB&2sG9`qGi26fF|8orJCLQ^yX+W<8@Ykk zMcvL#!$9W34TZ^kT5VHFDB+SSI{G{qGgVJEz_|a5>qpa<-V-UhRO{_^VK}C;1!cYU zmDYkA+Ab_Nd#T1}g3SPJXkL$Oz~Ufdz<>-8?Zo)PmA#?=ps3hUn4jO_b45vcQH)9h zuO4}DaN67K{2uoG-Ixn?jnRFJ{hwTL%9-hzvcS=`ZVTFRqVNuL$n(RItf&M8tPR_z z?g($z57Q1q`Ds#Qne3+z95FL|f~Tyq{r#7$vwed7gA>BSU+Bu2FT8p!(Uu7e=iv?` z^Ho(UJiscrL>LY}KLKV4gN9Cf;-~9}xz!UNY6T;D96QKB^N(v@lM{(g0#_O2yKDG)~U^)j- zaC0zk--&ZqkG1&4+7Oln*kAlRs*`WJeib}&Egk*cb(oe(4=z7h@YzTNagXO$!vP%o zP|vvIy+rqAd!m7Z>4wF|w~?8969#l*1Ri`R4gRqr$dq$6J`vo0Or&s5yztNmwe%xW zvFlKaW3{LzneHZg;_!|^_wW$lf9_p{PxAx_d>P|Ce$80GB_a&Gd}~8$L8xQuPj(){ zX}0~UwYGnmo2S&`JTu3PsONdDYHlIRnn~1nm8bkrPyvQ76$j3qjQu@|*eSp8YItkL z0nKvc2iq?*M`X$aC_Rj*U1yaDVq$21x&r@$^R?nIfy2;R$ozCcZ=~0AE4xMq1n*N4 zI4EIwZ&5`n54EJpipiuxHHh}W-$-U~ zYzdp^5G48yUW9_xG+rNMP)ZD%Mus}MDpWMz2X(k7a@h>1Ez2eQrRZDPeBeG6NK0IR zN~-^*z>@bI)Ur`9g-`?pj$4TOQd8e>a6HIgJbbtP_|69j^^5P2T3k#+Z`Cy=Pj|B^ z@3`jp))j}jHqA|Tk?Hk9FFSl<3|C!IMOUjT`(2R8I)OyYg@qDSme)w}Ro2$<7i{5D zYuzV6NTTvVmw8VPCX57g+;rY*5bB5*L)ef2DgW+YF#%nw*VSFzJsNNXaXvTiJ~#OG z;bZHkHIF$Y!Wk!@+eDZ8H?ROTlFGNVw8~QA-G9t= z32Mgueol3t+v!C$p~>|2l4U{Ljz*bg7OZhbI~+VQfh^T;WR;(_O-{UED4=YEW9)|r zEuD8`aD1A36$(z=;o=^m-^9{@{ZmtPR~1+5GE~I0XtzG@b6mdJS5lXq##l0r`r}I0 zi}XgRoRKq2%0!7{AAc;tc`N~oe7cUHK7B|4Ap&EZpo=e;vRsq+<KG z;LW&a&p_UVD{s}jEQ9q|hC>rRuovjUFHIU-&CFk+A^DQ+N|rS+Eh%9kQh!|SQ_p7UG~FpCt7jvDy2BSibdlbR3WjpaXvnx za5R_6GJ=k&eNwTOe$>_x@Bu62%fhp9>&}Zf$ep|iTg(g&$=m&Y^f$^*wfuM1`Ye^! zlM{EYK>9^b=3{Uex5OaH4p;C?;s3}88ZjPUMH3e$xJKz~jH+r@j*f@ZgI0}U9ugTk@@jKC(O4<%XnzC*#E;P(>sL9PzpqbivPLyk zT#=X#UOfb6CP7M~;y6cYSFGn|$vMU)^`itT*0qnEEf|2=DT!TnM9ZJ|8eN-vht4l; z?V64?=-AkXUbL5GI1_irv=82A3|TS9!a5(@yQttH5HXM77YWC1XoqnDEqjw zikb?-LmLBV&I;4Xb_a%qJsWmU9DUBX;K9A&fyKG!rZ2gj*_dSLu0!5YW!5%Q&_`P~ zM+U@In`_hw@21-a->WOMd?i?ho&l*yF z+?aB9)4uF7S8&iDJ?pXCtHuvqa!ouCQXHbO3ym9_U&qYIX~XH=R@R>8kn0m$Kr(3= z{>u*pQ+h&fW`~~utKH5~n$s~&D`FyHU7;-tp8brvQu<-#@7(jK9n$%K^j0^yamdO> zgTf~gd&7S4EiK`t=pRvNDu295Q@=U+VpbLl(Hz>qe|U_m>q21KH)4Z8HVBx<$N~1lq7NQ183`<;whs$i^8cjW;U)(HMeJsdvaS&~4Ti)ksNYaGa35iU6V$ z@?is%au+$YwCdPPTvtbxTfIC8bqvkoOh{1J`YW4ix(+;YxqFY#24PcAfRn@03MK}g ztMjGZJ9^Lv{LenseU>#5p@am-N0g7|ZxP=WY@&U0_wk{D$@0^{lr4mmo1y9bYY0|E zHZ6<%J20~8W<16zvZaw=#tHYDRd+s#KH-m3y*y70L>?po5k~9bcgD?49$1-d#O>Oi zj(cu60iUvSv=utHU8Lwqzu~1{ES#wHGR69MLV6T`G&8Vg zA(rS5{Taf9kOjVZZ_1^$vk5A$AjXHZBt=hRCRDTWxlFBKnFXCxd6O6cB4c{(Wm1uW z9&GzW_@SKGt1_#^B7qZpjy4(}>u^J07H3~K`Z&T@H%ZrJ4K#SFg$kr=1*Z@i=m zg3qhhvQYIXda$H7J-qs|1vDZ#4WKb^UOVxW_a;P$5)U%smV_?(@dw#vF1CMyH#Blf zy3gwraMggcdSh`8bPF^m%P==cL#G+EW!%Y1KZvmib-TA=0V47*bjDLAGUcmA@M2~j z;En!j5T)KFA~MOGTL~6HI z>{vLhhYaoeST&FK7mUklve&VCAJP}4%*XSq$HF9{xRo`YsX3>+Kv7tYFAP_zCh}$! zLVX-iOJ863jVUc&7#nTt8JMJo6VW(0Xt~*07S*yWCXeZBkG)ye7U+=w;L||&dOujZ z0=bQ9&0`O-`w+oSNSUqQR(_XAi70aM>m0sb%i+sJhBL4gHPgL?L|_R|HOIbpVHBBZ z4oy`y#~*91>UVd|p$PXGu;D~k3BY&#MNGvC8wtN%PUEb#^Zp)@sl4?#l4hH@e25SbHwpJj$;HHnJeJYN%P`ldHXR1LmfHVR)- z?uS3XStsP>RQ(sa)1XQ+uQfEkIH$=Sk_*cZ2h>Lh3HqKd|8CwHlZJUJv3I%tZoRlb#R_xoYXF#cku&JX^xq>C5pY0q8YSu0_L3^ILlxCfv@mdOw78BRz3#dzckv4D>^NkF>YkzD~45SrWMN6+7?tFyxf<^Rb-PhC39W2|62x6&=|Enr@ospk$q^c1SK1 z)&hzPB~gV!=TYzL8j`LWP=VAq9A$#<%EzenDA7n{pkFhL>4*5p^gk#q`0|&@w z!dc$kgaenk3=*|3AEdOzq+@{R36<%63;1bBA7YFU z32MG>i8+2&6l(-q%(_<|LOV9%MEc~>0J-T)9lLeNV0h`_KHebS&a-!w_Ve-ciR+8u z>YGr`q}~x<$9vm+bviuVzhVy4S8q(OXn8!+&`pz@e6%{n>m!VGK1^#@>ta4Gez-tUeU#!r4})1qXd=-X?L_!eSsv;J|v zBCc3zqXN1X=9yrvYlZR?ZE$Eb=@7LGeeGkEYFwyZHY3$xyk#wwSG(M+KD6M?I+N^* z6;-Dow}$Ro0lArOch0b@onI^f&mwz6!?WhOwA?%5`k5Z`2c`Zch}KQ5^wBFiGhHTK zEY7J4_#Ul#F%4I+X4BSK8Dn#3wIwB@d&mejzYYuvHsN$wnVLU14C*c8!D5{7dtA|7 z2&S_xByqGbZVHZAa+0(UQIm=9-%{^&^`~c4aA%z7(Uj2p8I|CmeCS-ETyczE88`{> zni;iGh%*eh%8xxfDCDu+y|Hjg9PEksqsXK$;W!!Q{==$%;jU*uZij%!Wr>@#LYhnr z&ZNLmY}Vq~Br6A`m~~qa$}t6E4h0W|Nj5uV(7sy?qeaU*rxJ<&G`jw_Jipu+l9w?O zoB_t6(zTGe$b|C(#eFbl0@pE4u`IS?JyVj)3Pn%DBd!%Ws z?a2`zHXORkg5$61(7A_fDTm&@mcqiA=zjSxj$^aoB6cA*rzKB-{t;&9L9k$t=6Ba@z zZ6PG3HF3wa=MK4JsCPXcSnSP6lxo>9F2>HQSnROHP98@u>k-+-1VLzGF3YQ|dA#yk zcxOjK^p7Sz627vKuz8`+KO>Wm`?jnAkx$LhyQY!pJQ~8;*i`xaqj;)Yo}D$5YvM$< zK!PV2Sl0z=u>553V8TECnf?1fk+ss=NuLdXEZVOsJm5Z~hCVxft(HT1_i6^CHg~S^ z#}I42JxMb&Tz7mnqv6vi>9xePxY5hEw{)3SuipG}mT2bntAFCkAW70wKWJ2! zAYI-Jhxt-ifFSNsQ!#Stf%9i2Voqt$fCM!H9m^ygB4WlF1JyHvfc2F=Dzz8!*_8uy z6rbI4po=IRX-?^hX5j|&qfLtqQ_Q**Qo*R(xSR;D7%f3lDNHugN!BW@Txv+~C2 zq2vd7M=wr~j<=fq>2q?bnD=|`BRYn97?32Ftb$9d938^(2@f=N0w&(6`!>y0-&4kg ztK23t&%%AZP+ijp&UMu2KQfTF{+VM|%xz#Yn423)j)?`6^4ajO&Z_U^!Y$!Vcf@23 znv9n!&b(SOBh0l3Av&r(O6j`KX0#TwTO)dtGPls1z>u@VUBCq@$6>t6tdVVJG;@?V zQ#dI(k)S9T%hWqICpzL6n!XU=n@z+DuVFH~5?QLdIlN#FFUT%l;+|m$%B$C^drkHP z02jku<7aTc29331Z7QO$1;6C|7uqB#C%R5GF5AZM>3{qdM>cWjsQ8^A@Llw}U8SPs z#@p<+D;Sjuci^wmiA_`Rx$6Bdwg7vc>yuB~F6BKGpykNhllKkN*8QY>!oPTSy|i!h zQ2y!6iiCgbiBo%fB7y==Y$VEMdp|bKlc;&VsPpHSO*am154x_NN|GObGS&fU9%O@? z=b|8}b1rLMk3~$gr(Q5{^Y!_E36D0BOMLC4J!en<@9Rprn_hA+{PwHNKIhhnKulw?dQ+ke@!=TrQ zB4`jt;mUVwEXP-^^$%?Vf~%{e8*R@x46{i+xJ`XV!PRjlWDK@#lz-8fA7?lTGeh(L{p2l!01UW^U<}U4*P74;N3_D{C zwFg^j%CYA;utimrZ;S(HNyjl>#M)E#mnJZxPHPdH5V3W{k&U0)3FQsvBfKj`E9M=m z(?O5;G`(hDe2|EJ^MrpEqbs9MRt_nukYuE$>by&(4;A6ha1EDP=I4(9C$7z7f4vM~ z{Ht4yQC2)QZqDJE0zGKs(EYPaRvxF>Zr^$uX!ExMie8RZi3AY3^JIw7jx1YBw7|W@L-_?Wqj7@wAdjhyLcbcD6w6&{<0HV6?j1L zZMNj}!!Q<+ZhxMHRATjQ&YReSqKutaL%UY&MH&98>GKnFm4|(yXEJcVtlr7V_zGfG znomjiJ?X>22OMj?UYtV$O$Gc!Oe8ec*g${rL_6$VX=JRQyB`Hu)QpMheFr>qId1SJ~j=&pH;o#X-#NK+QM32?{ zIq-3+xSmrm^D*Zc`Qp_h_JyU8)t%t`8<9KkslL?R8tVx0#~N0%Qm)Jxa1FN@|Ipb1zRXLgV_q^h3saE;8P% zlM2h9ryufUrlxgZW2c;tnvib+{5Q54ygW}J>|c5$tqs^)x*FD)q&DlS6w z@IlP0EL_5g#ivaO-&R~hkxPSX3P)O4SOS;BoZeqEpo@#6dq$^U zg*K}2rPR#295RGEtXDzAYrwDQ(J(HpB5r7-nGIULI@Tvvalt|NE)DlJRbgXi(#d&K zi95n*qDB<$UBBoZUggsk94m}LVyc{oq5m`Q##*KdoW^dQUVNDrW5vZbpoe|54xO#c z;|ZdAKORdrY*DzgBe|cvV}vZ}sp#tGevASj`r;ALYmt*Xn$j$~BT+1IAPAFUau`PJ zcIteK!_}5#g_`@2-sYAThISrK&F7UA1A9jzrDny9Gy^BD|NmVViAT~*Zx*$x;67^} zFBc1E#vi)F=r(Un_Gca_2Ccyn15yt2e#9<4Wpy!h1#muSL}7ZQM3T;k#JXI8#aSNz z*a2qk&gBB!0!5^)ZCzu0jzvesZRf?BVuyHjOt?!@|9rLV{UDx4&puz>SiKJM@+OZ- zHNe8mU?~LCASiJB^+;v$|}F%Ti9##qbwa56EWNIJ32}mZkHj z6ztOcu@ftd?wL|rjS`lpB3MN)olY2%)2U1)JuLdK@o-GE=fMystExkL$mZj`#w4YX zzp}qWcU)fK2Ri!EH>B1%H0*LjB+x0P1+BdLeS3!ZwM1YKB^$MDb;YRVl20|_`>ze%Hhuk%H^_63e`V*RDYfT@f^%G%zy*Q z2ETXLPwEz8&*jXB?D(3BoW|y5-FGXtB)}A0HSDLB$o!<`FX?|FVJrRgYaF03)4(R! zuls(rrXM=!A2SCRgpTU^61Qt=Z__g)<{u6Vc%c?I>+)06QFRBN(-lmReE?<4;|rp! zgyI1jPe;jX@l0TGVyG=*=dRco+Ez?1wLJ0kMC{7pK_T# ze+#co-ax6z9Jfv8x`6fHG}5y;>g{~Mk1B+rX1CQHS_J zfv$YFO{>kZF0EI}O^3V*?Nb08CN1IGjQFW|u@RPx{sE=ed$Zw+*EZezFXI|Pu(T;% zKVuaU4}4qCVMkt8Ts=i@dGCafv^sE}P~L4-;ub{}Bt28rMxcptq%Ef`A?5~aJI#kD zlt;LA$>4r163O)g{#CF%0L6Mq4p)OMD|(KrJP4(}x7IrR;%6hC6zpZlXN=N1S#sAq z=0#8pTqr-HT2h|)+!T7#%{AFnx7a?*0eV-hO@};{G@6*^p#*{U)RZQO$<3;1a){j# zj8D~PSm>`fFmpw;6Bwlf6S(bIyG4gxYa_+@Mc5Z>FYD$g{bsH1eTNS?+jU%E3pDFh z!V_WU>9J@4s!m(g@u|w^bh{MPp!aZlC!Nk`;=q5*Gujvbbc}5c5T`522#7SwHyxlz z{9xyG(dfVAJaTKz>!>Sh)38}5l^NN*r#AEQk~DI|C17mWldE}tu&RAnl7}?Bl3RZk z%35LXnrrkG|K%j$$+g6iCtXRlbOzW=g9lh9RcDEW zNwy(3bgGU`S|Gvj2m7$7>1y0{`*Xi1G`&aJ`D!+GPWkl!Mbku0k30}rFdsv1np3*AmmkY!|MlS_a;Sd2-fsX`FEuX)%_TsN~6)daybbvfMUsOI5 z9wA~W1JgKSUE}d~U9Ut6^Ag^MgWUAKl zt4n2_6C8hTPJjP4PK~2JnJLP&`7_Bnl=|_aN?BD*?Ke=4j=*$>LXC;>{;SAIUD9V% z1rz4?0a09E@AbU2*>rAm+~i*ExeYFT51OMX-qA5GdSXt$WmP{or_f0xuA@Y$Idm^z zga77yvaMhhwq<4Rf$|9`ew{>_9u2rVEBHVHZoTNw^$9FtNih&K{O z#WiR19cat5It=-#x+$|(rw`2O`)l=goNme z@-)?H*|$_RUamr$>=IXYo;|LOWy@!@m5keSIe-*sV$bZMTrM8bUeL=-@1{p8dJrCq zx4BNqwt-jArl#zTpTt-DkNf;reZ-ulSfQ0EbLVt$-aP3h__JlI?jgUizfLf%#_-qb zWGu|P65VGs6I*k#^w5JY)Ijy8+g7)+ASJVD5 z$=|tHy(mpVK3K3ZS>V-nAEpW*J1Xx;M|(+GCA?)NX}?l$(4gd z586Q|(%4SDacge;6+Oa;y}GmCnQ1K)wf)u{MQcVC6N8EN*tb1pN!6k2R_{)=C{(y` zR6v2$wh$di3w?EOTp7J1aYJ-qmT7!`S{0Z35;j@ok3A0*3+iAMF+N0qno zrm&Vb_wu7dIwZQh%)12g>uxq%(${0-*t8e8eN+)u9k9sn zT=2@l0t2vTw~SZBO@@@N5sF(3aaSTGr7r|Ye`H6I50i0;k}5)^wTOb1><$VRGl7}{ zVk#8AW(Ir}jS!G=7C3itTzx>2Mgo8xvPU^awrFS6N7)I)pb(;))EB8oPjdC1R6SR} z&uAIrS;^;jFrm?6z;gBs^S|Z&shr0BzZB(IqpVUAw?nhx{-L3qUCv z;_uFazDKEz@Gdwha;3QkM1OeuwGk~~t}Shc%yhdx$CN=_t-aJ%_T{CPmTjq#wj~n; zpYSrp6J~gERO2xW;{LrbQ#GO-$(l-9pvNqUZt`j|DzLT7N($J-qK14?LuuN$AbM9l zm_LT5D{i8LA!Z%yF$1vvg;X1u;>FzW2*Kqow_tLTa?<4>?_7WF^^ri`?ZpfJGBlIw zHF+G9XI%-N^t;ltRQ|=FV%i@nitOl7k>+|=i;Ff6YP6fQgk|o1jZ6+?&)Mu-Iy`?N z=>gg$IvS0l+H>Q*lS#1f9HLtNtm+ik9oB4_GAoCzq(TKI!iwtbId7g5Z4WN?MSga) zYBRkBOTU!4=XF-m8K;?_(PHJ8A-um$7}lj4YTcZs`u4)Y7)%1Nj=oO+e5MPZwY+Iu zDg8pCf@ig6{!irjH-;j9!@UIgI3`?wA)iC&Ry7Z?%gnrJnk9j@`0*7M`804llX~GBk=?{X z%=9Ohne+ssi~M!cdGMu9ZfJcWNh>$m%)(~2*NVLxK=#?E1tzQhy3gG+Yya9tbx51U zs~CO1U-P1#g}$|epuKk=WI+uofxl={V@I9vdvPexfI49|emVY-laLNUL4O-?%=^-x z4fWuux5(~%U0I^MnUUgWXpK;@_aL-1)2D{{RWQYX^(_S(hrq-nT+A=AJ;Zo<>(h6< z@4wfgNe?Aq_A>#PD1C|`z8)ujt;xm!1VmQHUufk|GL>bCBar?!4hmoIP`*b&CmLZA zK&4!LukkkeBk@O+mEr^Z?52wT9XdE+@Swc>xth<2Zru4AMf(ILdzMf}3v+tJtu3B} z$wY?={=ic#jMq{^l;Q&D9|XUXh27)?4*r+bAcDYm`RA3x@xeDXjz~$~YomjS<;Sy@ z)b6RFEl|yrvZO0EPVB2Q*`O(qaNN7QkjZsP7cq7ff_3iD+gyy~7mJ0fD3^y(;X%Gy zsz}&_B)?7mO^qkH!B&DN$h-)h^GLLN*}ApM(%Xyb9=UF?#0tQEO?AtiaIOG~I#+&9 zJrO6NURUsD!tJnObtUcgtHzrg_L>&=%w|6}oV#x?lK$n!@G?rT@K*IWH8x+dZ?Nc^ z#ko3?QC$v*Jqj=oPQZ!u@mS^_Hi9t4R2Y1=Uc4LMg(h06FYatVCHwor{PCOwj# z>D_wubO80Ns(0LsHlZb$`Ow0*6|Y7hiciCJ=)gLi46qw+&2PXiUs2{u@f{XaRW%u8 z`~|%D-N>8@2~S!Fr>qPOS%Zi;0${`X2=}W~O^}**O1B@T;rI%~R#)Ol0Z@x&E@DPW zd%TH!m~U4m^c_v6gKdkrkjR~-^@27+_2&YY0ZaYnQn|xnJ&DwZyl7r%PV(x@d9eG- zkqjllC*x;zhBwM%#BW;Mj0-$!r}-Ue^yu&b45b>+0YQgS@XNVk6aHE?JA0?K{NiHA zlCn1Wyk}+cI1Ao`sbL-yB}`U~lufuUKHu;lgvN9+88Re>au#SjL&J@6Weu-$3q$%% zz6W#g=Ke0&6++2~C_yO&~JNoi=n? zh}SSC(m29NG-WedLgczT-V$Lizel(kPu-xvUU>4UmJrukLSt|7n)t|Z5!Rb&TUph~ zuoGpB-k#333fU-rdHbM*bxHMgx4C#7W@kF}y11C>9?c{1Wo+W40i&o6^~_S zH>5j$=FM+m5(@_kE+*MkM{oCv`1EGj3jNR<`3cjY~m`XbKAw zreVRh%PoCR@@G@v3%FCb2Ule;jxE92y}9*HMa(O)k@U~n9Oq@IC6uRvvGVhJJmsD% znFt4uJ&l9&(P?XMW;zAaa-3S+e?;;}Ugx5;xp2#6O8X82CY9OP)HfwLDeTb~TBZN%5LKr@uc(VtD>Xy{uap+}-}{=7|3o=q9OOh}xB zC_4(z+by2A0cjf+dYXCuhy*q-c?JR5o1cSyh%6s?b$~J^^3iZi)UyhsFHX9sZ(nPC z`>jOwze8Q@EOm0pzZNk1vpW1h_n>8i|4|?2>aP8r{D2FmG=-KI@E$OkOx(?J)j&^J zLQ0|iX)-u`(QJ>N2vsNo4RW7zyjJm^5T8Ht_&`Sq&NA!wosYi)c2nraa51yGHOV{D z-5c3|yDr_mB+At1#sf z?ni5S(MIB)2=gP+6a2J7yVjFl;!2bY+7C$(lQ0%D1Btk0g`BchW|E9&W~dV9xN4yo zEgTQ@^)MOX;BfqYR6xu_1}~`Q@Z||RwZmyF^#WSi&X%-tD}-VQr;psQ-mba)LC>`- zL1s}HI?b}&ylqtX#MMLcrjIOiY%_m_e_X=Pp@TeXz*Z`|`1?QUx4(#f#pMYBqN~Gn zC8)8Nz^zNcte??p$!e&=HHV~&eU8p-?WSa|&NWc~IMF9_^BC`9B{|KDQW$G9s+)ea zc9kX)67}Wj1CMGUHa*i{5P$Ov2|Y;oQo(MkL4kWtbBwr#*M`Sr>D!*brIu>7zwmKU zzw&-m2PA(g^XG7HVCO1wBoyUJPjT!8Jj7I4k%p}IyLWXtm^?1~zs`t}d_WGh-u3I; z6&t}#sM{>M*n*0Xke7w%afoBQI`xPq!Hz^uy=;4KF;+K3f&!1o#(~vIl1W zDV^ExPGxR3mPN(V59E8AKqHcjGhIbP)mWZ&HDM$$o(I-9SSO!J7Xj7Ji>Sv^W8x!J zsUiZhP`(oXcu|TyA}hejF)95_oTF+?QGmtSv73VhOPoWQBbZHUai$HCwzm3W|2ELJ zoCN-YmWsocHLdxSESzEd%1r3nI5`R)Q;~sxG94pjZVeWkeVpZceH6`Xl<}wg-Zsot z1w4S9g{3}eOYmewhP4}-M?$o=yBPr(Ri|c~JGb9cbsIij%i`@PuN;-_3QA8c+qF|w z0@Ef}HAt;Aid@;M9@y#-tBIhkUKxWY!Z|OVKK=A#*QYzPr>@3>x~#aRpN{Mweg1n zcJ$781T;%YT~t#%aLO?Usp|4v8(r$g$LjuuenxE|_rs2_>+ebYKj_E=73w7{BA%@V!Jt8*r5+UkpHGYgX= zKocd0$JBX%2wLSk-t!sExx^RN8guNT<9QMu4Nw;v3x@`*+Dr*iG$&bN?PbvvSzV0R zAAg{7&&{pKDhw+RYtDGl%vVSXeOr`Q6k4M)_6o>fEzY569MhH?%=)8S zH0BKD#l|BX%Qof4t8{~=S(y9X(90jVf z$p-Ydu#cS2^?22?3(CLrtR=tgB;ZRLD|A_FDM5WA5o8uNO_qQnA!_Uj7p$yTK`r%i zf~YA_m{R1yWPFzLjL36d-AG3TZFgPTDXMV}Ikd!WVY*W%M*k}a{%zTKkStJzKogc%0%eCLg|*KsnXg1D>Z}Op?E(nX{=)R5J1v=o#QgqKNs6 z3y}aP*3|NrrIc4EAbk}Um(qeU{n2vRa9q>8#@k4~x-u)}sHY%FS;}>Xvs|wXZ(Zrm zLt>=$$4h!6vxOH%X8WnUwzdaoVbdQi@`glpx6SDc^NpjPh*D(>Rcjb0N^SA>j#8Ct z^U>x0%bSQp3ih5yJrJBzZ7_LIcIKIA=6?`}h*k7@&b=6zs($dbYEX_Cx|7Hj2C)iD zILYIEB}3uyl_AVE^gwYJ#tpbGoW!H||0|Jv2ao>%(dRab^8FBwXB=M(n`F?=n0c1JJ>YVFAC*1pD~)n z7ouLut}N%1;Fpc+#F$pCl_^~R{k(|ITEZ~(%z53+exNW!%}S0izRu-_(=QG>>LU2C zC<}(Nvn=&=L`ODeif~=DW`60rjz32|%N1@$>G_2;pffKS@lUo#9HYw#UpX>bD zHz@`_od=Pq_zDTbvFjCwzdQ9UgA|nqzMN3C$ViWZOvNNTMmXAB1lY`|PbymuY=K7s z)wSXiL8E?Ro?>(IY1TffTxGeynbo%tBi}!*9YY*wu>T6EPJlD>hd1U{ zOg{1R6DL|}eSBzF6>KXe240{|I{~7wM>J>zE8c;P;}v6QOgVD1=q~kIzMbw}EEj;8 z59A>#1cdBV1nx+dTKC^Ck;v|7>pWWqh;lQx&7_8*C4rI}MsxW;EPZb~!!qu%GxkUn ziJz!2*1)99iQu|)OXTwf_%-G|Gq7k(_XUfFRENY=n;C$O4c}y;ERbh1^jOE1+$T%E z2pLgnB@v%HB@s*cYb^dnupI0sSam@|L6DZ4od>>%E<(4^(jS;gsa)fX(;m-g5uJ^Zi&eR zJ2h>$2Ho9{g72`1ykn(FMC3g@{_~wFCgx$#X0{ilgNM5u+6;hQiP2WPpmeyaf>2`U z(6DO43MkDn{+i6S&>RTyou-)JlTPBON@a9Ck!}`OL5?J^{u-sT+o7Hnv$RN zp~CAe#q@*W4zkCizWqI9Lkeo+s?R0we$1FtdZcxeS?st(NNU}2v?M5)^4$i>T&&DX zE71;vOx#43Hm6zp74Q|-GYxu-FAt+hQLIF+@f3W>*mKK)T;XOpU#k}k3b=hT9FW@i zH>yDLQvLIe_*QG|uyx<();REJ?k^NsFGc3GQyu69ITH?~%Y+N zHl)LVSHwwSe0D2pllD{z#|XReA}BLKm>TWziOyd)Y{5I;TJY%(xP4q?Md?Pio?(Sq z>ngd1<=Zyx3VhcQ!>n4=BYyWYM;Nk7xGHQtIfsAEyQ>`XFwk8sddy_E6))8FL+^j5 zR=9P-yl^kkzZ%KAwFIjK=D4jaUHHA$H+(H{bKm+43C(5c=-?MpbV7ZUgbHjk>Wgr3 zWchgx$>?>=4Snx(>d(KIJ8Y7yn;m0xFIfcgq$Mg59f#~@v7eZc3+4V?a%BcTJMupYsmBKEMJE%%dHTT^`ph@DKsYf7h<%0_j zTO(XFJpC6c9LKB;>gBiWabhMXu<8moQ0gvgRW>vhXy)Ayr>(BK9+3nJLJ2 z&O(3{m#=@h7E-4Vc*?j|wWc!R)1-FBT2FGNL^A7t{ViSwW6}HEzErf!?4gibt}7A6dN1mWAAfB=^Q@} z9yyTB=+iaLeZviAcWF~QocEqtOPb4NDvI%MN3C1PD=C=TVlWafz5zXElx?luWNNST zRV#sShLphZ>E#&Sa0HuvS^%?qW;}HCPfiUs71_Y;Mo<&Ub{W=F5N!ppJ(bZLi)415 z+Ff4W0!fZb%wrzPPq;V}xZPSelF*l<{fo2Dm`2k==u^P$UN&7Uuutr<3JXQ(%4&WY-n@C6GGy0n|2F0X5*mz>u`XR=4pRa3PgkG>3-d2?@5i(;gu z-fsS}16kD#4OJQVd?Y)*20WnY2qh%umv9eQME`j7%;JgFh5AVqk*qsZ=Ug~-fw3+s zx6phb%=8OYK}msA$|NL@62E|M& z3Mp(BnX;-%i%dy0Y5Zf$7t>t2?G3u}b;uAEL0;2&EH*{`4-h*St$6fcyN*z$hoLiD zJ8cASB$MFPvZMn(Wn*BQd@Rh$6l%Q?YiSL4sh`_u&sdR@w(u4)^_@wvnGmJ7pv6+2 zmUzCqOP;`9BCWfwqV?i2eV%8qMMCWoEjz9i#XU1;p2t>m+t(|?xzZ$)MMg|e;PI$Z?mo!Vz`oF5tSDC-ya8|P36M+B*>2V(h=$J&sYX0tIGo-^NzQjnI) z4Uj~|s@!EIU0#&sd%UrZ`gu3Hu>d3yPi}XNDqb3}1>+=iA>;#$A{tr01U*6vO_;%5( z3i3o*=?b9;r+~7A0{V=;UPWCq(1lF@ON-$*Os4)q>Pe;@iY0tZ>o;%S#OC>+ua>z! z;s&|CC%ZX+5HVc1R}H>5TOPkD96Z`1xDXyzbLjD}{+)Rdw9Q7 zCL){_+K{n#FSN3BpM~f6(09Le{U#9OqT|Pd-?X-_c+t~;2a8yG6)BfTFxjWG4zrik zdv_~pHN;ej)}J;j(K#Aat0~!}7nRo{uoSa7rQt`_RK=D9%=_>jcUjWoTZeSv_%WfC zD3^-DX=MHzr@706xYt{m0QD zBvz$>v(CJSCfQ{hDONR&vO`r|Y5MDS^nHfz3q27~vLOimkaP-sI07{D4)!v~DNjVN z=rY?xRHBNcFLU1GOj@}49%YVUfmAHj*Je)Id;757TKNEnzrxj&cQKrWtN%meM{J+w zJ=teskpcv!p9x!Zo<>+$|3Cy+Vvu4*Jm_r7>5Y5O-d&B2nf^*#9ZvaT2V~pDPC6P9 z9y{v2-5b-c-??&;I3E{iP+&w(O|Dftcf76{+usoSDy**Xs2zjQ2)59N$AWkL*;#C) z02+0lqh-XcEGH|0ZANUIN6go@>(yo8WldgX6POo<`}kdLRP4={ZB|z za5RD8?6ZV1dM01mL6;OU)`uUf&@>m;XGdmBBaY6;zk^v^F-qd!{t80*&V6`% z@RbnX7Y_H`%!`!grrugH%e~cp6eO*ud!*yeE?Qh?7YG%gTrLSgs6*X6l`)M z;i2h^*nGK$P|i*yxov;FlMmupdgY#R)jph|2T7O%uG)Q+^mA^}8BxdO=8biGE*rTm zPCIOxNw=)g9fRZABie6bwL$yS2{zEB=PL}{sdF8q(ocE=d+xuqYHU!HiMXjxA1GQa`uHUw3eCvTK;W_iW;WC9jW)=DP0O z&!i(f>ARPn_iwDX&SY}{!O$(qX?a^{i;5Kia9-Dv4yxtEv&vnLgTwrT05U6Nkx1W=NSO_E5Gv6WcV=4Yxr+swq8&z?J>Bjs% z^CFXJY+CB)ahzMtR@)7O6l$ICf4+df!lfkro>1DMM3^4p4i3#Jiuyyl^}eH49p^Vf z9s8lFZs#n*dx`@Q_o@K5^D;!LP`Kx4TqF7~X-5Q&+wT+>gWj?kH)#jh&VbQ9e7b^?n+Pa*klg|OQ~{;qP+HWv5D1EvS1Be7hKUN zo-P|(oJs*qWt6%s#Ur%l&)+pzPlnj>r?uv?vwC+KF+b{b-%#FBSlm_=Hw7yxp5>a3)e?dx0!#>sqVqV+##0?B1t!Zf5943| z(4FYRZTwuD5HtJn2N`Byy9^;rCmxLi9ArABq)TV9XTD`HM4ML}7&|%KJyI=BNjf>Z z0&9<60lcL+-w+3KafGN))-V${9*HO7%1ZeP6iyJSu=GU_6{#q)oyzLi)~>1szs{q! z;7E>MN7UU$e|(DBgV`C`#Y?XuiX*1{L%?C=>4^|QRy+_yXBbm%95Y1p)jFoX4_7eq z8Dhivt-qSobzYyAuFWDZGA$N=@3$pFIM9c4j2ml{(};YrIN_$XZJ=>|N-8gQv!l=> zX`C@#)MmCic6i$|P>o+tYL8%BhM$yk6b0#6G?*O3i<769(ae&VT^?QTs!17pBkZu) zYCU|o=mfARj$c-47ERwdaH`jS?v_3y)&ITNOB+^rT4Z?Q{ZHW#?$|NJswMxLwuJ3` zh$jxt#?#pTDUSurS5;bOB5r<`z26Egl>?VY$KF$`OWL<6qXy5@v3He}6=fW39ku zQ=}6qgmvF3WfLKgQen}J;HJ1uxvvo$Oz%bR9`F7a1;V*bT68)ZxWUDcG6`M>IPpX} z*MYMo)tXC1e7nMRq9jzJuVg>hJyTkvVbxNa%tWMEFFV7+$-jT0<)VM#^JVMTBmEEC zB__smwlVeGrUZBZlF|DQ49UP{CRLEf`JxDGVHi|agBkrv1Gn^}p78hx0y~3$V*uh> zh4LyU>&kIXdTj50D>AEhJ?Uk;qVMB`Gm%XDAwvPyZ+LF~s~&!_I~?akU^ zhV2${=PZ621ywH`p^|22Ke=mrwVI&UoI>CP+Ma9m^Y&zUuwSm#n3xY-RplTWht zkr%AL*EFXDA2O+xu=YS>oX@tLlDyJSV!}&eEBvhh-PbJj!&HN>K5GYAzC&?LH?9KM!zQ_ef~-=!s_|E zxYE3$5RVwMUy#6bgOM$!inG~tV^$evHwy44h>-1PH65X{R5IoqkG6+OQ>C|+=bk#e z$~&SXve8IYMOq8VBafO|#_~bA@TA&RL{4Pkzm`2y=abupmtEZWHdu0Ls_N}Oi&#u4 zltks`=YRh)YQnjSyAas8)Hw0ej<+g!vzU@a+wQk3{XGzEE|h!a5fM@4%}+H*RxgJ1 zmew}&XYHCD8CmRaHp`bdUG0pWO*aKWP0-{_1${NmvZpzmSZ_c|$uWh;Vg1c1$!qJ- z=XOxH{G|8pEA)A1vnnq|svzxDU}Sva^XCITGmHAx%`KsC`8Fg~m!DH{e39m5 z5DYgtbAGCNy@`tsbQw693#;+_thVSf%IT3j?+n z2fv3Fu0d~A=I3kYZN2I=2n;EwQ$YUsZ(R#m0cr0QvVFl^^`HKWMF?gRf?5=HCsloS zZI`?3_HfY0H{j#PQVvZe$v`Nn9o+kU|80b)2qR1yn-+(V!D{_VP*%5m!&+AFwZ8w} z-KZ9!5#y!@Z zEh4Cy*ngF^*fF_>03#(<+lS(h4>c#|_is$x&LeKgHtCxvK5G4C$n_}4!^5Zfn`(Z3 zhclkIW>N5)?Ut`m%pGF~3w}^cH35Di-p}F87)bXOvihhcXw1F^7zxA%b}BX~kZBrQ}SRw7E)E0d^hb&_lP=#)j`_WUr(C1149br!^cvv&J4n_Q(#qCt#tVQF+afJH z+uH!6$lH$)RjpjAd&{5!fQ=C$JGHnA*GZ2Nmp*>>++Urw^aY;Zwz0+q0z3FZ^koC~ z?Y#JUeDd!Md-w?$?!-mLLb2uVQ;yfu%n{=J%@d>f)Xuh;5nXdCTO1>cydV~62S5QO zdu?pOmd&G)zsjOv&??97KHWLp@s!@T!0e)+6vjZa=4KEuy6HFJI(z(tXcG^;q4;a& z)KAq7FA+PaDgs8u_0HtM#K+Mbut!&=pD2@-4pOtel>I} zF(Su@4L@p6r#hcN9iyue_KY7Eh7K;H95!-xUx&B9RDIB{C(H3v``#)sEMBX_WLF51 zGxBYoQ_-?XZo7^9q@!@*6nwah>~A~`8t|?xj zsd)ACDYAg!X>v?+gLaT&$K!m4LB+l0!F1bBMb>1`K&HR&q z`4e>D(E5dp8c1(3w?xWZeFZb(vL^1!x|!P2<@=qdP;(<>+$dPqX>69Jgzrl_I(zW| z_f~$;s1v~tQXT4l@y9aY9lO$jt`xPZlY7DChQlU|-oE#Be^Ak>;=q@zpVi`lIMgcZ3z&?gPt9y@RtNbpMxn74S%P#O7)(JVA>}^I;>S zVxSOy5%=xlrr4yp)%4(7rsR|}t7~s<#s1j>pYG932aXJkdUv-QqlBG!^k8MD_UeW@ z=YWOb`tyFlSwQxSl2WCk>3tw<$;-f;#Het~tBe~JoHYyUTd)0wFTCJk;S=R8S;{w8I6q#-Tc;vDDomUWrSWmVQ)d=GdnEZc=a=aMXFG# zBh=zAlZsTdfXReRi(vK4px~;`NLi0IJevayX)iPb*bQ?z_q>HDvucE^Z&a&_Z`YQ{ zN9vUrHP*v?=Ophbkjm6&F4NL^1m#D3e7FHO;oDdXcV11Eg@Nb1?d7~$qpSzqTlChb zF;OQb*n(JTT3QpeMZ*#%FI-J}Ir*PoDP2-p7oB=0_&X5yNIY~(pOG9o{18al!rA9F4l(`Jbz`^XsnT>AQ($s{(y6(e!iQ>BQ3l@76FPC>Hv%RRR*-Pvwozl zp-jGNUTFp|_cu z3*?wHX4SeJ2v-(TH$nCgwejkl{p|OxzA58kl1sjl5CECSv(Tj-#;sf0M~H4a{<{*r z2f)mH_juhx8NP9o_n#}yek&3#*EzF+&CGv;5#s5SKxqB0*Q4BDz(t4kB z&y22Gc+Om91B^Y?ETaQfmGn+I1hiWuKsu1grJmOlj~tIhbYZQuf$dhbYjKm12~$ki zcEOC&&FEa&w*T>Lc8W#kn%vp&pmOeL$7L|C{YT{{{q_PS`!l@>*;tDL3;Rc#OD)te zkuEuQmAN?vH~Q36mRD*vfq&rSKj?x(j1V$aFq?LQGmuzhJ+P;8nfh4m+ogd9iuLg4g?2Q9WyLWmU?b(HD&vUw$E_RCfY3`u``jRlIj6 zr<(CV+rt7m2zoYK?P=o%n`*?{grLvq* z%~*5$85D zeQ)Svn!SPpe1`G%HoPpA2*}rK$Yl*CSZFe2h(CgUN&s@aa=fT)BaKo{RwqzbR*FMA zw9H*22iz)k*Y?UFB{nwY^@41>mb)GZ6$UC2=o2bt;MEW*;l=V7wfC+Ss8x~5E_KoE~$3u&$E~2MqZ83{j#G|_lm7{A5PYZLctEweDE39+{ zP)E_zBp>r)24;;EL1FhGnC#}T?pzDNpjjQZi@sxJ;zM;5TGK;Pl$N#jHrxZfCYD3L!CCuD`-oiP(WgE2YU7xLq z<>2hVb-Q{0;pZm-FB=5q`mp45Q0jNgAoNP!X5i7APo5o|%SD6>I+9W4&&pU^Fc?#%pi{?fAYM%z-rZLg_Wjf9LmGLki-LZmZAtn ziPlE*d+UO@O1Ww|bs>E=Q;rIJ0+Dl7<^fTQ;5 zrf7-17M;h)C+M-8PR2^lP9l~^*}|E@_<2bVNqDU_u#iiUEo8*8{M9Saj$0v`PuJSJ z>81KOTNUu7z~p$ZybS5)hlv{V2CbVvpZ;G6^81>e*b}};F*oI8-1#x41pkMNI8m-7 zJdw(PvxyG#7ZT+~HSRP7u0(c7Yc4?t^C=Mcg~Un*3Mt`D@2=$VdncR{wBlM8{X2UO z@VauM^Ihs<3b(GszbWdK z;jVrt;Y~w|Nb=junYTG?r=L}1|uzt`7QHViwWeG(c)rD25~4{GL@YLx)DOA0&yrDYbS5+>oT*>2PM`4 zfH2O`fDP&B4{Y=R!Eo5?1ONN@{2V5WIA_G6Wk3=L73lS(HK3kW{8@tq`H<*t<`Uj@5+_jj&rq_J>)H75)Z{3Lrs>pb1@SKs5Ixn=9VajmG@A5KkCa4 z8p0gO$?{Gq_FI{jHae2*8Z(wR%@`n~DME5u6sr|#BkB&rg&8;|4G#@nzGV{6oRg54=I z9COhbBDke5iK1-=6a*$BA|^dP=Ss$a+GBTu38EB<;G)SiLvNZO*F!gjQTvnv?k-U) zZ5NWr=$?%yk6KLNhTHhg7N-1awNnTD4t}{t07c4={JfTlu1eMhkcZ=93SQglCm{>O zs;m~z#HJl}DH2N&k=g$>@bn~0z+zg$g@{1hI<(6gW^%*QsfB9( zK;o4=sc>aK9Wvc2S+inq&x0jl?xqKZI~fwndXBp;J?d{8s_5P}34XvmTbOj3fz(iP z_q#?KP$Op~_V{UAH2#0Wa7TX4A;)(ie%x@NW@lRZ>Ep>dV3Xqnkex;h;6yp2II;( z=kss)))Ru#f55j&Z&+=pKi@0*UOTrONDtzgubu_@Uj_ZD;8`nkxS*31y}qEvSg|on zZf*6iuOKZ68sn)vOnSzbC8L_K1=$A zCj+!Gb!zWOP6uf1YL;DBCQ&xj1v}brHc$;VOBDdfJ}4X|s*KBe(WQ(J4(PjXFH(r& z2z_3ZmpWv$Y%zdbX4N5DMh91D&Z12Y!wlI9V<#8_eu|J4Q*1T@bO7(>N_QBS#C24- z6&`W^D9YZMY7zh;5Z+ZoWV^FOweIX5FX!i@-E>d2n6giwa}19XwmH-ky-Cu{v|QHK zyR&+8W;gOPEd`Iq?p`nE=LzuVX7**~XOK|;cm>75VeeA2`2505|8iQ?g1FIl#{+XK zohg?;49R1K7_xJlQ%$ABaN~C+3$1HPZ)?M0Is~~%dsg*}bE{p* zI?!W}#|`N>81g3cD>t0;gOnxJ1MS=D8H*K@3Y(hCobLTF9i!3)nQ8<&IRk;S_*A_{ zmu6qngmd!(nTyM60Nm8_mL0wNW?ppezKIek%>i^GWhm^6S`#7Knw+0e(5t1bV&vP! zPK#ek_(NOqwRut(qgZ8>R5;(s`s%=l*nIHD_s5)5`&A_*J0-WMl!qD$KSS6RGyzLP&!RYb4NqFdnFOxiMN@J7c z9x7~yz*im1ZTND|ob`T6UUd+p9&kcMcV?mNB!);FPohKy?y12## z%pl^DB$Ld}tu#DCC!e5+%Kse9%0k>g|KPx;_h--QBmP4o!EMVuK#P|j4VG|T;jW3z0=@gm_22iSkcv@1O|0t#zzYh*dh7} z>D|oMi@zx}b37Vca=U+h5*KgShWAjY>r)7o;MGSkk0>_P^;B3+DgY@-S+Bvnp=`pW zENz=c*OKGfkqe1^$Zrnw>L2MPIVuwc{RJE9E2$Z0RCweb|Mik>uJv*R%bEiEj2~or zdMGUY9iCr~rnf%lQySW}SV>K_Qame6K=Dr>u=0E7@?8SdY>wpE11x>1M2o1=Lp7P5 zhsc{SP#Uqb>n*S41&aRW8&L$b7{%&11pP6rq?_2!nHyb|W|NF4bCq<`k*b_KiQIq` z1o0wLWIwHOXjc+F{jRy;&ah6UA0Iq;B#=}V|L{YmMEE}A8spP`CfdWkkgX5SDJ*$K z$};~J(>u<#1a^+JWo39(^9If35-g&)UMrSq17U7Aj8-04I*YW;Px49$@%Qg-@1Dp; z$%dQ6(TP_6mJNqyn{R>(m#jB4m2?*>D%fOVD_9MQl9VE1V#4(6=^5PR=+{!>K>Ewu z>mYfsB1H^i)nB1#O=tax>y!MKZ)tr$dH#>NZZhWII8^O*+(59|>pavAEXDM>MGBlS zb}IvZ_5q}hI8ijDIm^=ltQFU)l zYlAaqZ_#n*g+iHpJ}t}i*EojISl}7w{&G@f3mhX@Q9ojj7w)eqlKs82#jC4^k4Z0j{P!pA zY*y4m-FQZ>0N^>jJUo5A6x0@2^q5gT|477i$Q;33z z|L$Y03uQAV*&1N$GKXsztfw)q=gX897DufQz!^AV<-zlIalOzCrR4ek`ZQ+)g*_F8_+9WC07pU-#!7wcht9>r?}&LQWwN>^K@U#0hubC>b)sc!)2pPr?! z06RaZ5#xwfc(go{e3UXh#AO_Lx}gT%T}c&?ncR?Ay==%=a8sAq3%{*^5fv2Q{^I3M zVtKL`g36k>G`?7Xg*Sl_=7i7rjcoknp0esDDwa=MCK$;Ue@Rp%B^zEJwrf@BpI(s- z76(!I7#jPcsdrjczGe6*l!yV7o9B+xn6-TM%6D3Zk*bKQxFW9%Wa8QDrNZ=H%Bq>} z^==*jNc~vuSJ1QQpOz@K4KYQA>n!bK5;Si#3Cw*QVwV3^j{O*2UJFjIIG`OkxG%|y zJ&*aB;Uergas(-@^KIiDO(=2efs;8veMpzxdJxr9mS zw~dSWL~KVDH^~Gc%y-AuXBjKkL?I6BI!6udW-c1K-Q^*O*$f$ zNiJ4l3D%Z9l)3VWR-Joc*rBbke&ywhLHgYNe~0d@?wjK%iqB*c*3s zc;&~oSsenaP{l8as)|o1@fDt^NAi!2vutgaOF*6IG^f$hrS$AYed6Tl;vaol74Rj# zL>c>xCqb_RQ)#WgB+@PRS=;0~6<=zU)8y?uDX^x{aqPY)uA>~lC|^b%2r@IaGraUN zv)m3YtSH?MI@uB^!T!-@#7-H2C@nFbC%Z%=vu9lj{}not@Nv%Jdu&e_M5MU1WMQgI z(CtsO#GAZC-yiOj9{#DevcSB4Zgxp~CY=}s&t|5IGW@f44R8m8Tz$xTb6Tm=1eyJ^ zjSR<{mv)k-q_^(2;$pm24YIz7!q>V8hXRImP?e_!_U0{c089pOy5SaoO326pSGi;M z7AiiCDbL3ZI#=^H!nPLO%*(7FiSkhxAQ^t(Oq~RW_$S-D?8rp>IbOT9-7Z-&aly*? z=o^Bf(r|kR7Wh*gShjojIm?Y5TVx>Y7G#t1^AyfX(}Fs>ooeK7xT%TX*Djl)2S-#1 z{L*zaJMZ{@yQG5Wl}ecirYy;$ZO_RV7tnV;;6iJZUyxIE(n^b+9a4VoO8$MM?Bx(R z`>*iJ<*JYmw`^0sF#)+UzjOBM{$eGr>9g64pU-VDl9~#oy6bftu~*WI)m_&k`Kw$q z@w_NeRniPzI5-gVD~o7y>e^-hU@%GIPc#u&o1vWrrfbBrT!I<4lg1k@U8KB~y3qll zDXsWjhW;gU;3Fj6^?szEDCOM;(xP9HW#qvJ1fmeimDbCg)7N-@9>xYlo%?~sHy16Y zd!OGTn;apFz?>rPHt%ThbhZ<$GzV0-ZpE!ElsqT#Y;6d(OB}s-8t;T~{1C;vKLK5E zIEkNrL z2TQL!pEP7~Xm^W4BWGgM_b~0Dr8`&&3twkM@gYk@2K>tesw>EIZDH|q3?9(%soiLr#D>&pNZA6n&&4u&Q zH(%=+i5u0@S9k69Es+WB`ZdkxC?e!1Kk}3!IW-^J4EYOu37me@_SfyL~N3NmW5kDguMIBo0r5uJQC$HJp~5B8(;1;c?Ym_9u2h~6sn`N>`DOO2?=e4a5VQ#7{2}~4U z@-tGODp7@VCu#9~^-C$im{dTpD>FEl!rUCf0ArshBBty-Qh49blWz{0uvQs~dR5k% z04dv^1h)IYM?2j*$fKX(cd?MyY7Nf9M~7j2F6NxP<}gX!IULxhSa-G9?OMD8nA%_u z`~9{%!34vG)m)}?zN}{?(|Y9BA4~$bAbfhu_zbC%cRIS#&jVTEw&8IY@X3m11zVt%jQzgn4+RD?oaQ5&h>Pl0G&7FNuu%lX&$$Y|10a*B zoAHW)bE|~*z9@6w*}nAYwKo|CAzTuYBN>_}5wk#R^=W z`9!OCaUerKv;+`HK3@K~@7uQ2&(&-c=M!C9lkGfq;=(P(G!c7!8IU9O1rW%VC8I;B zq83)lEGN!s?C4{n%AOm5;N(}P%}V3^;3(WHAt=z8RSa$KngLVoW_RiNYb_{piJUl3KEDts7uP5sHQ^{3dIURBpf~&XE%qd1WlDVzxtscLl-Q!HS z{pB3fli1!q4chc0sKC2eS;G_&=|AM?2&V4V)I`A{{X`Uh@%tpqEkx{6A4mw?k0T$v zP&F2=g(3t0?bAWZhj51u6RJ+%dqzE%{K!#?lXI1>{Ntg{HEkeJjr(v}O22`?;OC`x zO8!-?AX|2*j`>9(OC&riK}Cs%byInuS5HcN!S-EBAZNg?V*ZA0S;$u#19bJ5U1ejR z<=fA~Kvu7r_i<&jXgpK3=LFPkOLuqtM=JwHl(8v6agQ<5qw`nmHcmdb0)fL9Rd(X4 zd|%AfFen4r`E45AI~W&du$?j?+zqs^o>0#DA3~KBQh#m)tm~5M)j{qmmjWrZ!Bcig zAhJkymKS9`lOcny=H?_^qt>pg-^qBd-GBOuI}+y}(PzaWY_&|Frv({6{|Jcgf~?wS z8&+!)#>#?tzY(Nc=f_+^LR{Ra%ijmUaLYNHb(6sws-+pE1`5kdc@dhOznk=7nTGLtwp; zA-4!4$+NR^>m^4wpm3{xS`%aEV2EyrMq=8(s`HJ*i_`IsE~#i=M3M>p&l9ZSToJ}39!rC%ASz`kmHh?OL? zHs0rsz06c^%DZrt*ifC|%0p!{FYydMUpw&~EnRNW3bxL*!McuBf(={N;$@_dn%V za-3=?Z!rP@i6fdszXYv4ZNJ3A4^YEu1_ODR<9|tVIHZjnuaTEb*U?ejJ`r z#xJLv`f59~G;v$ZB{z2dv$K&Xea5tV_Lm0TThV&9t3>+!dfR~^`RFt1Ob z%1@tib@imMw1+F@*CsNQrPmKFGGqvv#>T*1DuNG-JF@ut!JecVehvyBA-}?{_CM|DMoDyJ7YSJJP;?X ztm(NmUpm#a_?<&Ji~5u8SiL6c+ntL0W1YxG>QjGA=I)0BY7zy#<@pc93@^iReQ843 zZQ7Ti-cZq$kRx}D1J9(w?ql?06 zDTesvxFWi5DuoNdM@13rr=BEw0UGss_q8pGLG$)kCa(#!CgIw~3?b=cQN`QetT}m0 zRXN@W_#q3USg>VdJx_U9ZV(I}K5zyi^{qN0P zTYsW;X5t1j3R_YeVZD{BZ2A+8@H~44agkwZZ2=rPB~x*K%B`vwuVCD&){gC!)dry! zb9-+8B!2+EvLHFB^)_FQFJjxCp51mpPeWH*1}}{G!pUQ3ar0BVA~p%GFei!Kg{$vg z>93&4bKz=o>-wn-+j_8houFu7DR@E(;E@710G5>4?>QLJ*7NbCLx46_Ih8kWb>HgK zVTJIFY}szVp_%TEHZgcX8Tf(8DE0-`v*Dg_98tNo1w0FwvLnE{E`br7?+fi?6GjG; zmr#br#5H4ed^N=r=D4;%ru6h|(6bVhzyTPXEztXfpHC&^8QuFw3B6dVj&6P9Z)UhF z9OTg+1$+)Q`9Eqce;KGpe~qN!`hW+wP!{5O&;{3**{_>)NbIV`7z1Zr#FhaCG+7>a z1%e(C7k>TnCz=;isAJRGo*E;sC)U#EfJ_h{{n@2|?IsF02q|wuM ze7OwPovNgP-KXD$^YDp;H+p zg$R}p0&F zSDGaqfkuC#0SPli9}OH&4|;XDmN72rC`KB%Pl{;Vt1_mqF7#+H$}bkHlqcpX;$6jV z3f3T_jd3F|G>%9y%jT(Ie8;Zz$g!nfuar%Fkkm(Ogc>GTPgEm$)sJw7HBq~tE2q32 zR-Qj))EQ6}=gx4QNMcX~;TN!xx3aQicr1j0j$(QRz2C)cWube>Y*8(s0bTh`hPTVQdGlU#P#g?-74lHuIvZU(gaTKM1+Vuvjc z$45s`nS=jLqKal+X0hnHdVZybLJL+ZXtn^XgV(}*BRpxnQH6swh>Z~5Aw&Oo_2=UJ2L%{6Bm9x=jcPa zGeGLlJ!#7bq4@mM^_J3x#ieNtW3t871l?a>4r0F-=0a_)C!Qy-`N`w?iINVx?PZ$L zRCvs1sRo*GRSxpBe^BjDBC}pYaY6`~Fp#SY0Nqj==OY0EFo=A3%}9Vc244v7C(Itb z0L~TLLqejA14#RrM}hZ&+>=4Dy+~sm-L|bIb@S>D_fH~)MG-;ad;(aw^Q-^ zI2zY>_26yE5Gfxt$?0=zQ83xSbC`B&dBv7h)%O=HV;rjQl-r0_C6aB?8$5S$8`pi% zUg=l`KrleKqz|;;VJ#SI-&D-l|H|i0VzSc~)8YmnNP#1%bg;cMvUDb|&7mtwW*fn3 zSGx(|VWIl=lxqKg1ye1rbrnAujaBtPAjecP@`Bq-OT0C5*#+VKEufxigI}H5fWTzf zpX-FWxa+FooM;#F&wA*;0*`+ja2V9pfr^&A7**@4#e%sb7Mum~ZdtOI>di&(*Gi7e zOZk^XW`fz>AwTG5Z#bsRo*0rvmMpblfy_4_ots>yyUzx6>3h$42G;}x%CdNO+Z?3M z>CXy0XZyBPnU8xBi`|DIWkVhadtzC%bdnFi6PvQ3ldVY_!H+UBp@gjb}o?kA(wP zVri*x*%0F=QsV29Z!vcirU2QEP!%mN$t=7rrRX<_@@n!o;L9-70e3$QSA-DdZ`H!-h#!rg=?6GZRsxgE5U?K>zc@n%( zu3VeSrL0ElAidzl##kQLf9zkB#%53DQC`(4@)A7)4J6C==+J0(J9mg^^xU@E+c(Df zRRF8io*8EPH7W@YAuAoo3wZ8;;5UX3!uT46s~!s@21b4?1wQ%rmHZX~e#of8L8K(+)J39~=lW2ij) z6xL^2Fr%*EP{+>F8jU|I-V{-Quf3S=2;5a7qIO&aUL!&my%LRM=(%`)3gBI|3HqXk z#rX{!E>V^~M2V#;`T296NYq?m;ri{rSjhc5nB^ac`59CH1P2?Gb*27dhuL-Gao& zneRnPG`b@A(@7#)$4GQSEkPyn2caWG%-TPQ&cXfqdc7Sa33-!oGY1@!pq<&y#9%tulf(IsO0s)KMS&>%qhnMnz3UMUB6h%W`?PCvzn~)4%>qf6a3( z`O)|#1&UV}#Q+d5H6DWd5`fovY*+)iR`0#9bhom)i6)J7U?1sSUUO^*VeUGy%!Lme>u~sK- zymOF@pJl92X+Br&&7BRtJ)QJod9@!4opRXe@S-rwQ5-sc=WNg!g~44V&Ykp`_oN@@ z92+%53u6PZ@_S(qmZO<@hZY`1as7(#;0Xo|5Vl7Nn-w;RTR@~cymetRJo)Qb>!Cm< zfjLY)G0lZ)0Ip?GN4#^`J4|O;o$lM;a+y|}95)_0&1yop?-M2Xsog5#;r2N-5ixbN z^fih&w|}e*@G^;?2&dezP+Ncb6Bu3! z&?LbSZj)c?AyiROuMRxwPx4Zy3RDi0H8o4LZ&Bamf}g&&EGtZ%%4YU)sS{nElnHNr z9l0Vxy92OU-dy&^urJY{lq#{#hCrg#X!OQmTC&KoiDD6l;%W2et{a_!ZnnKiFO&iB znvLpxp9RTvsHqYK%8Ml?O8=zTB_1mb@dr{8%JOuv<50hvXlEr0pn!!n6*Ycrd#{c9 zT3-#{c%1!cK#xV2cFxF)jABzFnH8=`>OJ@Uu^|+s-!8>Djl!@aNBa$gRc&@MUb%>! z3y<7X{r%Ye;L8)L<^h%O(V8lT1#Ao@$11s8VDo_rmo zM>yPT{fTC7=Q%1|ySU}iVeR;#66af4kY&RF{m>v^WBFob}(?rN?s( zwL|e(*_0A(P|KKyuQ&$9anL^;W9eXx?O{CAREZ+fMNvc3cE*JB#Xh5dC;!Es&#c<2KS2_x3(6Ngm}iH4TC;0F{g%lMx+a zn@BYXc)cj*v#3!hYL&LD&|GYk5H1P#ac;$Ev{VC#?@|@2K{NrSD{@5*6zZ*a)w$y) z>?pvM+;IISdWw_E8O}^2zt*fD$S)CY;X9&5jhW>YC?2(qRT4<1Z@J4r>uxQ&)}t`s zt-L40(O7rk@tMpR8CHj{?rK~|{Boj%8Oe;lK zd>1)cSHFFLI`5H4Mck{||G|d+E0X+uAg45DD)CHlQnbLhboPRcQ>&e8S=VluNzBr` zC3KS_&CaEu4v!z*qL#`=9ebmsmz}|q-5MD)RFBohDFY2`c5P zq=a33^nWdKC7QF0M5dU14=Nu=O$5xtc-V&}X}=F~M=N@!F>!ks#3Qfx4>Ndoxpr)7 ztaWUkuh9z>bY_vFv`FYAG18=)CE9&a=8E+3OMsmipw0dHW4!MeG*_W>tDVlq$PZIU z35+KDoRCpXlvJq^fHDF?-+QUUq2E8iejmr!*c%v?9UG5)SOYh3FQnHu=O$fXH^iyq zg#q3iufgZxoezLkLVm0e{qAro97@pE;ihPWQ6@`i@&9h-|0@OfpM!R}wkJeyVUsJG zQzpIJLpv3F<_PYIhl2fK>&+XUdu79+|=Qv;YmPjgS`>hpFmx~56X}*!L^*Y(H4a}MuV8X}eHmDvwg?STs z-0RQGp*ucv9%ZYx0m+b!c=xWpuan2Ne_$~6rF;S4TZ0=jTj&KTAezygWlDvBUrv+` zs^`}&l4f%2?aCZePI6v5g8Uqg|K`Ab-ywSN^EZ!)>FopW!G*<<&^DEsp(jEfxrnm5 zG@RUkKzc%GQ+Fk_Um=RrgtPI&DA^*HTNZMv^atyUwW?y!6terJ8&+hIfN2G&a6T^1 zaMUY$(MHfJg_)q$iw8Tx>DwJ##-gXReSxWLTBT@xz+C`>z}7WgL8w+0PHeaSiB|5M zCfSO*5})cn&bMT;wH7QVzIe`v=26yXP?K8HLv^)QE_q4=wx5q=Lc?`ws z04lra43OqvPZy4Jbz1XY-L{c$RB!jF&dce3IcaXXzDg!rcG6BX<=4*@4i1!vytS{p zl)LE5+pcMjVvDly?;m(CqA+ekIxEwPk(VviRe5N{ynR-f4Qf^mp|2IZ3C>@kx@(bi z_h5NFwT`_*X2%$xUf3g9UfiH)q_FsDi&V&nj#F>?-QW9?|FTuGxaG5g^e4R0J|tjf z&#y+cAA0J#T;(k!SAlWJxHk)=%icLoir&ogteYv~3^Pmi%EICsD%+8P%}oy@8x)j| z-(gcR;Z#?Fx_4gU-4xUH+HJ3*L!~u@a$o-be?z_Nz(!golk#Qv z{irT0imON?<9f-0#w(b|-{9d@>Gbs&GxxK)7fEn&pkXhbk41qn8GUQC;F6~qmt;Y-bLkT1;ktQm>M zCy-EU5yVU3l6Fi7Eu1o~UFszuds1zpa&6{IaoWW(4#>-JT^xd=PtX$^i!w@snijo5 z=<9*7b)}A8oeJv%Yp*5F7OkQiebOIT#8JNhj@4L`e zCFpr*SPY2ce;{Sy6B#NwU{{KUc%{x8xzj7ixLY>E4+Pc%xDR6w0w@eG;|*7P@W#}0 z=)2QnTMZ5}q#UXsro|6_|#st7{D^zd1K$5U#!Cewg(H#?7S_=hBmwUw}yAa>c(6V)yN!y z7ASWcBLQzzK#M*d{ma>B%)2>y{O>!Gj_hrA5tvfb>UI)KkF{R(-)*FkVvM(iKESeg+G<2#FYH5pVJmH#hhxqsSIBGCm=J@kp2748L5QJTn@_g@(q z%J!o+4bloC5(Zf8`E&^u;1wJNO;pfa2%B++1CWc-lgTud6`YEQ@mQYWvmO;fKRc#S zTqo8OE(dxL_ro8Uw@S%3;awiCxhG4AdnRz+ogD@`-dzOLa6yv&v92pf;Ul)Cf!HCHbrk9$7hQajt+sVPv z;1sux7RtyN4eeb0P(fyiK13V5s~2c^T^b0|pSOazZQN}5y z*A|7F{#mB++7?ABzTyGHddWBRx4(;M6dy5DK!2Zj{GZt9V-(N5`n`Bfr5}*kVK=?9 zaC!bx>^4v)b&%oB!sL<@m;U=Sth)T!Ycq};Z&IzT^-^+h*^$1?FaT0n*HlpaM$-7} zQXcH*>av6-eRZ^dgzPZ<(ZO`lT~Xs5sPyBnWz4S*6hjQN3+NQ}J+&&*^Cnb^u}kvW z$|4yGYUD0`@slk|5h$9#as_MW-c-^)>mI-BD#+zLm+L5+1qdl;>i3Zz{e=}@VQ+1)Mv6AeJ;+>Mug3g z(jj#~3$kv(v*22P(VF62pZrP|i1_+>j8jP?`6&mhrd60FT(3Y)k+oF0HNiZEX0Yp< zFU)X-;-{GJ>f%sVmv2Ks2mMIqeE9T=zi4q0LV2;^Y``iF^bn(`w4cbDfle(B0yHLm zm=`I16b2)F!meEK(xCp_1~GBPmNzfNzsXLs?Df^7P)@M;Ahz-@v!I_g<9z1eIyD{i zcy?+cNH2bJz>Xt?EW)0=4J+0cReH?0Ob=wbeo53S0M8q#+rDXCxa_ud767V%KrbTK z_BbzE(uRt;-lf?&7=3E}FrO>kl^<&fnTQOv4*iCrOQG_YHK(>jJ{YA-jD2Z6G9Quk z`Jm8tqhbibcH}+Xs}Jzuf$(|C1Jw_H#aik2?yBy7MUKk4q5s@UR6h;lEc}JPj~en` zA~UU;1hfcDIEl+x1aZ$8?Vs13$5WgwRe`scyJGpdG#hDCA*kHuuL$ekd*U%DwCsBs zq_q|DSzTH659^AywtOg!uFi}e%-#5wob+_jo{!~CZry&QX1>S*-kcN6#E@J%Ii9o= zU3mP_h^qoxqAS{f_+V^ywM5bAnV_Jp`pzEdgb<>#Vkv>l;C6gz!QhLGKdTKGk4Uw( zk5_+kB`#EZNSdLfgy)ppCOu06+xqbmqoC%})u)+8-$V3%pIc+mr|Dly(?NBIbq~W1 zmvO+ueX6sem&vbnenXFkL_`%FN9CQcwA6PwY)o}BHwoY`ppQM%>19E2d(4ZAqnfHw zrDVSO>$d?0HebiTLy%?s>|OQe0Sn~DS1nl77oX1x&aSgLZ`BWkAFfJ7!iT!Y?;_!M9<2$!S`3vE+N>WS0@(UH64e zVTo0I|KiV&moIVhOtc-Gj+7)MZJkwWXJ<&C<~Ao5G)7#obHw2>FCHiv*6jH#RGUBT z7>>B`qjY3?=^(?6AL7J0*zH#m_lGXT8)Q44R6Aq0wAuqErdnQMb?QhclFyL;wR>q( zxK+b{nkptIyXpzSXklnvV9$3_dEcVj3-Bx`ip;N%e|q?|&vfj(e*NLu+0k14*N3S> zmyy1WH6OfhMzmjY6oq{s6gISz65CsD41vTsPfbMfP8kNfee#pY4?VfyfI9G2)5tQ( zk@xPY>8v01c}r~-SXrF0!O@Pqb#u(RGAg}JUWl}!K~F=)Msjgn*>&yBl|xG|q7X7S zzh*YRbD<9Zr5~FZ1C>_aECrarIU6T|c%1EuHx0{23PyNio%@6)zwbC%A;UD}CYaVl}WybQQ zbD2CpB=eRzfmlu|xA=r1Ggew@eAkWBAgiKU%%`SY5%-%+refV+0?!La7;KW`yUW)1 z9M~v(yh6WS0m1~=$Wxk@Lj;0vxW`dgz?nR19ahA=a+a)>`EY4_+UpdR;3JrL9|~&l zBp>}F(I{%*IREd9%h-W?xJES~+RWzHsGNGF1xcG@Moc(EKQpYnsHi;Rv%BoTSpg@M z#QOPm#8d|}g(jI3yO*7GlY?@EgOr;H+Ec~jN3IHX4Do0v9L*!mqG_!eT$+vAR5E(0 z7GR`XGsl|!;m&%0#h@VXIQ5y0YPlD=JIk@GqEnNXP|J>LXl{C}LsCKbLk4wWT0tJ3 z`RV(CemAV+10Uc|AsjfdhNjgJX`XPlb6@*vCo;~(B82us1H>RTKy(HBs_#m#|c&#=Q`7Gt4yjs~^ zfH|ixCb=UxO6)XQBcC{HlRCIdJZLo?86v{@ z6xo!OZ_Y5Q}y_Q0u3N&O(B z9+Qfu-=JLsDuw2s4NEtOSaK%KGCd#@bvvM1J)+eB`>s(X3^noDtH;qE{VFx^D4HsZ zzdPuk$y{4F_AaW-F7XAY^%f4Ov1&V&$l(vs#phb6*(M7NBygRs<^v-35<76Ukta3^ zVNG9I^FI31zrLA#$rBI`5e=v0QF~=v+pbj^yFSsqG9NI8qpz{eMTm;!g^`&t*PV5R9f@rH~I#^J_|HJeJY zN?@!Ve9{|k<&j{SoG6V+}L@u+HkG{XXoVM$r ziFnp92FJx1gfdGAb;no;>doEtIt~tpEW^p`stao6X+vQtX*RA=gEiNac>rkdHmAK+ zf|zRiA`-M_qP#r0t=%Z_ToLVt0nLllI~F;oAoM5NmCm=vBP5UGl!Zw#&>4`F-|&h? zym?~$RR6Og_y6zAFCQ;pOF=_{_5#_|!t|U@XfVQoh&9v{!zyZ zOH7#wD=7ScmEDQyt*g}d&n=91Zv7z3IxY&HX9J`p{cFVfIIF!p!vs!_`_y6?B0~b* z-cQY=Hf99e8HTE>2e|h`e&p^t4ro#O8>iv#)Ak1r;8S^RC9gIjqcvld2ENLq&kBA{ zpA>u6|BLYPu}miJ%Qf5xW=Vb!za3BAtc+Z(IoF);eBMXWxCc4$ zyE4=oc(qsEXXwX@u6JjLkhD_sB5gm8HV*bac=S`#%tC1Q#5EOLd;+T}@6Eto2hZo5 z3bl6CX}*p-N&!Pg|A-1pFwB;RxuX(%E{C_rpQS{a~AUEbTBJ{dJ zYFD&ryj6i0X{J zY@a!Ps~A~L5?ox=$F{i9?-hjxe9x6UgK#y|EBJsdE*PLt$QDetr8Kz6=gA9s=FC|`iv?|4$G~4*=G}6ne&R{!I^K=EU zBYxkHw&bC|NS;w=Sir`o+zQ?ng5d$x}oiD%c~AaL-S=*cVn1$6k@5#340b=2*ote&2++3fGa zyz*=}7aPU~uPLwhYlcResVCw1-62nzUHX#%Q&a#XC8QUu6%Swy!u8hR2leoS*eHJ^ zbnLn`<#-HT{=q@o&_pAzCMp0l+N3QbjdKLqjs#{LJC)#iCj4|gQ3WK}L!_psKv779 zJ;G66hG{RqB0`Gl)*x{E3>b+(HA{2saDW)T9?G`fS0B*^ie8qg9ox z9f1{JSUf3bS)W6D3;e>j$0eNiF!}YS6adfW45DJt7DT@X)-8E3EE>#D)lF{7QLt*tA%$D8S9>Y+cDH`VMZqQ==IWSA1FP0 zP(Gp&z?^_;etw^I2$Q;u1G)7)6{MtV{ZTCTpHHdW`s*niM+clA)UAEA?*Aq)HL?;C zht|Hyk?|Afpa%E5ulsA3JfTxz0lE*ky*>HcPs|8}xZ4V?`T>Ce>yUDZGG}}kaongc zj^JQcaFak^!Vh!W?c4%Y2Kfx(!Te9=AhQFFh^CL?sj`o5W$d$7~&Kmw$$24BDUymYn)akiam!=k*At8JN$UK4=WV$^Og zdAask-t@B+Mn8i->tC)Pm&0-5^4qw67vFVp^X|(XV{WrH!UZXS?{YS6RCurq+e;tQpG*etky@r)TO6p#5hyk4R1zP?cBqYQ$&V}*=ma9l5@z~MGAFU!ioW=Vku)f zD{x(7drrua`Ea1!a^q!e`>E(9!R39xeV!?UwR~|wq2z~eS6!V~2=no?_;J9C`Xb~d zl$~x)9YN7Y)Lv5I9I!J!&n7vpNpa5I^Sht-WWJW|M-WH09}J^bUzhNLxi$;>4zq#s zyXLf&mf$E()~?qzWtoPD2jI)Kmy&r1vkFC71wS$#9eqJfy-$rZ)zMYn;rY;I{7kW0 zZ%)&z(X7(I(J3W8BLq|N5z`MjNb({>PB(o_>E}$Nt8id_E4KE*g~$l{uFl-@e>PG6 z%P(5IJ0e5swY`$<#+H~I47~hy$ob$O941b2@!LWMh`w8CaX@8-e70Kh%)`||49jg# z%_V`^0G@z;(;E(}q*K9WuYE_?O_5~Nop?C+kr~fP{`MeLoV#@|E8B|G-hQpYxPpSS zFl(;3bb*-wtXoF|cc1Z6w<_MPZH%dE9v@kCE5B3PEPUf*$An0(>#qTO>x;#sF%`#Q zz5!h9gj3_IDIzDM^GHh7>O|yD^y6Iz07VK&2Jo_}yk4tARj@3&W7vLy6_`mOR!;pY zc$YWHlWm=D{9@@Wx5k9cy9u*_Sm4;DbBlRF*M?^fazV_13molY-d;s!0Gr#!X$3yJ z%VmFwE>HM>TSC2Ixo0dp9y0mrIa}s~pM}ooecB7CQQ4Z&0cs{~95&<}o+77^d`bzL zD6C6k(_L%Qd23^4wyg;9imJ&KNjax!*t-ijZo|W%mt?QMjYqswoc*%R7L0`m@3UwP z3UpWplT-1B7Enyv*ys)AYkk@5wXLUn#8 z0>5DWp2oo$!(N}Ccy2iprV2Mz!1pE3=J;wSs}0QQllP-kxzK)oiJnPm?2jk&;~z$w}GFZ-I;_0bjgqs z#L**<;;jTUtwtCp+S&#&(|G+xbR}rLM%Bmz8w7Er25p58*+xS4(ZoC(0?yiNL7IRInDQXk{z5M991QsBE$YO=L1&O> z|14H*LJQa0(A%=xksEi?bEV=;mNwJG$0~fq*re~t<{7*<@N}T2PWUb%Z1>aet7My_ zIoMJ`_r!S9RxLV?5X(9)xu!D48n_o|N^lR*K`(M4-$1SH?7`Mv>XegE3g5PFxaylfBWwM^u z%{Gzo8HhR=kp^IA7T{-kY>1rrWWOUIxNrc~(a4c`rC!k0#W|F;WX7s}K*cY8FD?VW z$91Fq{>??2!0qngZW{{H?i*MdKk5YaPr3@EK)oG`%iNv2eX0d=JMasHGdO2454O+s zVy(L^Ivg{0g*v;4uR{7fG#?UudE&u0<^JzDQ=8PZyliwgJDO}=>M?+~Lx87jS+86B z=H!U|RklTfc{tS->~?pv;`{4Yzh3>}Z(t#0AtH-fbLWh$T4QBt-7RDqFpho`&1Pr8 zrK}x!u43f9PxxlA62_7ivjEOsXg_E^1H05>ToxHhHm>f2zO2W*60L9yTdT;h-4=>n zOPt}M0qyqxR`f)32v4BBYj{canq^?LV3I}wznUb^4M#PLtCbhzUU9>1iv-I0ocg5B}#jx4P#{p;9n z_h*vNq#rYM=(k^`aIXoJT@}iuNLr%pOvD#9+E?R2u`5-pVmB$5>gI!*+c)AtfZKi( zU_SdEJ_E_&nBmOF>X^$a0z%5&_Wc>g?u%zqHEU;L>wGJi zH5H&&_lvlXdMoEDLWP*?7cc!aJ=%`hPIZQycd3_b%3Xfp)KqO@QIdNqnDWq2SXi@w z%vUDf$)SI6G`~JJ9GLTlq~pS4{gLO>j80^-6CndGne2g}?f3=edy*{*|zsQI?4?;2YH&Hs+yV#xyr`EL5&o%OpN;Gs&=* z$E|oDG?=s3TJg!?CJP*PV*07Z&j zjM<{Pg4$Z2Ps@wNKY?lvXwA6&w7OOXsQU3(=&&!QR$*q9Fd2q&%JpRP&!E!rsIUUE z;YsK=gz4@7mn`xB$X3xK+PF}?s!jG^nVG*-5%!m%0bDNi(9pBKR%X6eC!-Qpyd_a? zw@4oqagWLL?xMRq`3L8eo8|i5LRV;1C#uwjcR4f~C8vCtog+=~aPJY#0;@=~Vl>1Mu zl+TepyX9{uV%t`oY6cy>HnWUPAO#tq^4@=2E9)3p5#>rC73IlXCg!(_djH_OcQJQV z0f%ntxVjcEC~`F-3~n#(D*$_-iCpf!gF^k))4w-5x zN-X^G7#D?lti;cUnvnFE=Zmoue{)^>3{Y*Q!7IMG7eh^NCpM$ufXpzDpS%2Ms9HNO zkz(!Sv(cxUVzurUuuyKo!>&-H7{Gi=m|nuE!gS-S7iTFSr2vZQgfKD1TRYiCSs7it zV;JtbO0wK+U98PKBvJX@*|hUHlFRY$d5f0bd*VZge?Y$XtY@3k1lQj*_T+$nH`NDj}@f#j5T?pP<$jqD0 zbe=UDmY$utrgbU_1o>rJX_*aGN8nq%YHSztYSfop$4A#}82_p$R)|8BWuId5Ygl3G zqFn)|g81R%LisV2zaVEIo=5LJ=Cb%Y%ycvb)*NZ~H!?S0TjSuZ@Sz@oOTC{Zu^<@I zK240@(M_qM=RWqBjLZ&r7e4>}MujV?S-ef2Z+_&n8{2(Dl6srY$5{{acwqy**%%k* z*d~nQVZG^hhcuPaJ}t1Vy#<9oH-7Js6I*eDHk*VhFSazvFB=F?BzYMgR`fHL%EjZ*+p zv3N_2Ge`j&LfqRmvbCW`I}d^l8#SN!O0WF>FwIZcMfVC{<2 zxbv$D69>sXb-JO)EDdEwvr&p)a5XARWK z&HCA~NB6gIxuT?0Y@`$A?JX<7g{G=7$hN*9EZ=T?Y87X^mckEqGgB3Dat5d+<_PTO z`M2RQsc6Hnp9DwavCuj}Z$TXCM~d_yx503?eKxigFR-Zhe;*Tn_*Jhsfl$TQE!)u4CNq(`~f1Nchc!UJ;P^64>_>;AGn2;IE2~h(&E5f?-%JxfdVi*7^Mx z52+ZKYo@1#`9^I`KV(L!w=L?>!;w~MBU&1wLq+ch(qf+HgdAMKuC>SY3-MtI z{M*d+R`H92w1>fE5ZILb$? z6MTtpRadlKN~mhtgG-S~d-aen=JZH!Yz~~UCVW+$0BNY#7@UnA5F*L7Mh6V-gzXm% ztHheVbB_n=5%mp&LX1pFm~`{GxrmFE+_BkoXI9ipI1eu2Y>RpsdH#QW8W&ks=S7KJ z4F!EnUlMziG1xn`T3JrD)z2FBv?FXT)(|!!Ha-n?8*6nC;YGC)u_JS~_YhD%N``5x zN#;vu`V78Ux$BcnEE;`a`ZZE&xwNkBeiEwLyng6>yca>IwOvbbT)VcH+QGx7U$Ky1> z7VI;+HSCHvT3R!xHb>uG3Yaxeth1;a33qdp=%Jkyqw6Jmh@Jk zlarL|Plkva*B+YuLgc=eUHQ}YXq|0b>N1xw#v}+`67kVw%68O*>nuTcLf(i*Q9%fi zL|K?A&ek&VUWFPw<80l4AM*GzFpsvo^*ev--?A=comJ)U>=Abq=0Fi<5X4Cm1K=h1 zc6?eeox^4bo9Gibkq_4*PJTCM`a+qBHcplbrc-pV)N#c8!qkU|BPR3Ut)@CF8b~0e zrrjZ^J10@gN1-S{+l#0bAGrzZw+bVQv6X6(4-VCj#(T1vUxVpQm5iS7&HTh*?35DExjx8~5ldzDQYFUoYZf1u-*;S!18oBrSHKXGrr!3VjEuZ<# zUypvkc?8C};w^KE)sSM}1Eh1q(Nd+!V|Jk*BT~0k5r!q7;l+QgPpEdwz4UlJV`nDP zI(|H@68iBVF6b!Y6pN@zC16{{GN%9F+`iMk;m1ZO5lY{+-%MjG9!z9m?ESy;CQi7M zv8QPvi9onNr~Uq-ln{JBGe^lJ$RopgSRbuio?j|#?=WVf-^IE*rmxp!0>#K9{TJOr z`gCCAA#DY7Hpt`M%=eu-Q*y&SNMRQou=@&Dcuo?aJ=RNYMXTQ}nR-#{crlkt4rRrd zuC;&Zp^B6B*1=QR}FkJog~ciBN^`%c(mW z4<%p{9rk)G&TNS8X#=i<&dWtX>%fW9HUGK#gq|6x5hrMkQ@<0`BOD*%71x0HeDHN; z^Q91vc!r9VFws4JZ@EiB{kcrYjuTH=eg-l1<^2S`dek1$YlI6hI}0NQ@Rj( z;+py}xwE5N%q>Q!IPU|#C}8J8#o=+N=0KKTj>`#7b$zAkRQl5#MO^t5WNStilT0 zwfxYDY(Uzec4py^J~qpS6B_<)d=dHRW&^!_;h4AtZ_Y}tu<6r^mU>$7yr*tF4%Oq2 z0d|5?*zD{-%^NLZbpaxt)d;;;DDSz2Jp8P#rqDU}qS`s?iJhK7ui`UL|0rkb7b~9% zX~v}vJ>a`9J~~^@=+f$UIiE<-sB)GELjyAUKCU=5<3Z(8xCQH?h3|UJ-1yA%bHCUQ zDr*TQ8Hz8nWO_|;QaAN67+whC%%;!wY~fgc)L8C16pa~vh^~i~!`tRY_mh`Bi_1zX zF%EOdqbfH$;U%^wIT3S3YF@>$&k>cr%w+(G8^}kUBsaUpfXhD*K&#C=@JCz2ZbF<5|z9mJ2<($@_ zFVHIYr)$dHMv1?tJBKZ&s`5KOVqZmo$K6ue%aF8u-iJg7{LCPk; zN33oVxotkG3 zc~J>$Ivx=|x(_Cw4=5!M(uG&i9#WuZZN;)JyraRE*Lqguh*y{^p6dEy8 zmrRW`Fy!RyC^($EN27f=hC{oGjHQ zw?WZ_;PRR|hlj&UB_MfXT-zfn`8E{hb_w_IpR(2()#}25N?PONx8?xp$JH`0@ISb( zamF08A(B6^vo?G!z1_v-%&m2OIImi--EN!NWh%Vd=x(U5hu}fcrxO_(P!4<80A?`CC-}bakHOJaF=RfhMB9vK|_pf(5b|az;*4TfJ_)_KfRiOesu*?r}OEtl|TEgc-Vc z&Tjqd1yfH=>o5aOuBQPxE%LF171a&k#oT1t%v>*?UrV>X!*sp~8JT`(X12=F2)fp& zEx63EG)f5@zsTMc6F(36ajDdk9r;d1NJeo&M%DWgcfvCXc^~t3AS=IF|2GyU*D}%5 zB9s6c1P{B^<2A+(EEM-;*_F9V<#RH2^K4@J`WVrxlpe8-TEJKnvmxLjW$$c*h4ym< zU)+uzEW9@k#BUr1G#DN0ROKrBCba*^^LyXhO|f$N@WAaJkIt1=#!(`TR{s516&gT| zh-p>wrfq}nbie!8iZLtC%A9%=PGg0pKw39~ zf9=w5pmprs4Y^EmFTV=0I|xXJvxBG;Z38@&J~TBBTY)bdgs{rF%+=4+bv7eze{gVM zp1)8Z^WYxwyu8D;_|=`-nFIWp!Ax$dhr_B($Q0{bgCJ?8VpfO4&9>WXsy*m@bkqgq z^xx?(*W5V!WMea}KibUTAg{$^k0!}xiSDWMT0NLY1t@V-eBID|T!v6dqF1s|F!kHp z187xwwzCeL`=_p9w~d#Y4R^Pv8NNv%lMvUWvMkjdF>L6#bmFokjdG?m3WD-mODKdm zZ#tmczb1HQE$$YPbvb^RZ)J+B%6oqk_S_--4Yr3>cp?0f0FP)K#!r{yyoSDU9i`F|OH9 zYn@b+A`A%EBXNPNFEUM{6${+g=1vv8Z8^hLZrb}<_iW z;e(h3F5Og?zkq3_D^gJ>xVw9X-K-SL{Av?UXiA~W*!N8e6B{DZLVb?jQ3Pq(9pfq*EvGs@tn?nYl@L|O2BEx3$gyx zxO$ncLa_5N>oHe5XR-e<;g4ZLfU*E+#!Hfr(vwfrn{qY?5Uh0;T%Wx2(?lNGYyi?{ znD*=5-@e?zO>r7(dK$C%Dz%}Hdlhu|A}i7N z$j)fEBBI#Y%8%wP+7drp^H(&7q74@JXHp9r_##=TkxdPHH(y>B9-5QsjL7qf-{i*G zZkgZhimHDv5dZmY>;BrL-X0;bbTo+|B#>CVi~r{_D%jG%)|{ar3O17w(l( z8z9eB-wT#p#aC#sDJiA(6L+6ZZ0nhBkFcis_kU!>UYK5LZk1`? ziGx24l-9#<=hI@CgJRhTrW1Y1h}S&5g>acVE!Kj3vpA~Ca(YFUDl4!Co~qol_dseX z42|b_S`nakp5>|N>@$fG9#OHLtsX2;wRhW`wEl|lc77v1^fUjn$*drJA4g0%!p7<$ zyeZ({rE$NLtgOU!!m+xzmxk`TjqY?tFltN5f3ZbLtrLYq*nwlue&D?(0KI;&=*!OJ zR&45FmLu8SCsy4*wCW%w-YD7bKse{zE{UmWmF7J$u~aGRL$DeJ`?tA$8GIW| zy?$%1n?gStyM%JJH9qqg&qy9%4PJ0Wip%HH`=-u^FX;O^loy-Bmfe5j#6VsP5Nl8C%TH*xoCTqbCNZpyMo*_o>HK(b@ur z+4;Eh1KMF>;p@EP{6TTp1k2c5COgaDPvah2`yAyC`Lo)Kx&u1A2zpF%&u_%$s!Gg! zz6{mHT%#45Sw0n;X@~k1^ZN4T^PCH@m<4}Tp#gSouAJ%8;#e*t(yP< zC}U?XKoQN(!Hm85`K1T%j=M#3m!>F^1VlqR)w61IdGmzG8hJ3fwB&Go&x*GFldNqb?SQXpy5#n~#N>9wEN{<@CUe?da0w0hT zx~7b?B}y)IPSsW$RQ-jP%%}0U$QVrFN$r#9H-k6R7Q0+uJv|vtoK?}L{xKBSCCtEkx%v5w0X7DT2iIig zLzvqag}r>%Z%Dt+^~}6+~F5A*z6E-L2Y18LT`6=SW{o>y^oDOlMg%%4iYj; zwe{^-1Ks|}?)N5(3Q#Lq40`!pU=LA&==Kc>Hk5kAJU7@|5*4Z8xx&}Qu6dl^L`0kZ^c?|Qo{SoCVCbm}Q2w1R> za&sMQ8*#;L2|m)@A=wdnK>G7IXzVsavaFL6DNPq@)xi45cM@Vat%r26UU74exKk(EBu4AmFu{Pna)R>7EeRs zX=qWevi3*YWj*0X^AOu4;U!5a+r0*zJMET)c{1QuhUPvM!123F$U@dq-3drXj77gmcNPPFavU>**!j=M&b`RAx|uOnjO)LY zI&uwHgm8$9Xer`825sTy5XOpgVz>*coX+(CCvX!*K#3o3eNzE{4)R!DQzBYQ{nMz5 z$-A9ip&F&-mQmMdgfE%+0ToYdhSj$#yCb1S<>ej(K@bVGJ|;N=QUv9m_%O#0l@ z9zS+ZDWmFJPNPrgrh&*Qvtcwx#cAZ#XY9qz;lgT7hD1|TW7m(DtOgs@P2J%Qu9 z7q9=p`O~*te-DKQU1GsQEOz*^@C@N|8I2`zGTbM@urZLJEzW;%LL9L~O&bjFKR7xj zUZsdYvI18JQ;$lA6xHze9Q|HN2dHe@Q&l7)!%IvBVsTns&GR>RNAMzVhC?ivA!xx5AH0fF+x)n`Zv+#EW<8 z%`YO1bf-!|+2&~id(7#|ZMqdO?2)5XVd199`}l92b<9SC=-t$a*AV%&)CE?EKO6P}4(ymrCGxpYy%i?|`M< z4|974uSsYe0tSQPw+vUv$IVK5GmqU?S@$YmdZ+*bBu$?*)-53tadkyE>lCv~CWh}a z|G`;yPUAVZ(`?h4A&eVD%2?YJBb^9{3^bX0{z^Gdif4G06<69CUvbM0IVF16FQXWf z49L@N(v2Cu_cEyOFSjmt4Dgcl6#ufl)l_O3_%Psozw+vv3cK$;Ym!0=2mhR)XxE%y zohzVbg`qM*tnFrB&$F-)5G`Po06R+iHBxkL^M5E%DS@hkk$m3Ys2 zc+$CzGh_vBH(&b0wGWQAd5TvMGQ8mFMOHhvT^PL&OEylnQQ;BUX72e|)USR%Juw*prXnz7T9Ee96(dL6{UbxksRt(RoNwgH6-vn!leI9 z?d}@HYbs2>|Ke7O*&UYsKmrmPiHLc5B*iBCgaAp!3=v~Y(4CCWbV*{lO6FDnX4$Yv z6{{rbNts2UA)-pADndqI0((SOMQu``PzY8t9DWs3dfHT@6LB}76;{|fE_EWgj`D!7 zVz7*^tE8Pl?ws#-dl#hy70geNgU&gK_i|t}%iQ`2psHH0^g5QXxg#qHZqhcY{dOv=D^<)qt&@?Gt0Dh0v8x5>?(B`bPUvkT}M9bLHu8>ovkz|_=JIQg#eLSRjZg!E0B zuu^^A0Bl$7?fA3l)d~O}vk)=N+hGUk7yRm}brDrG00`&r>hOQii5IjTsv*mF$7c0~L>ZFZ^Q|cRbqR0&59=y&$ zdHDUED0v+{V{`sOVH~<%$xJDO%BgN#|16OMiS6L(ya1HcO@KMdr%g=O98EXMlF>p! z0Rd`+Jl0dTP2wQ1h(+GKi>dI^yFanSj)tPgXZp0O0mRgW6&usC#DSsO<=nO)W|{fF zD*}Iqy5k$B8`dUe<|)UH9N%5@)=&6}pRs`$^eBMdB6Xhyv>i*WC;ocbSf2!AS4Z;ejbHwkHM=KcQezEKpWTw-;-yqK z@@vWZE#8Agc9OftZl<|V`t12@XYPR3r&11Ql$%Ei-{z!jq#)P)-u(^&+YpwO%YrXD zG`~7NF-xsixS~2AEgVXKPFR|z^gS*7k(1IO#@hV=Yfp*AJVC5_-^OZtRl2V%z*IFf zPrA7G3y#X@ce8%o-SrqN8@RiUkF|G9%j)3lwW5MTTe}Feu9dgTYNG4y-nb%3P6=rc zX`q}is<-A^axwa=xUqN4L)KRpnWLKw{+XJs_7esE`}$*N<>ODr%TJ_%P`#B1@`3$L zMR|u(*o;eX_@knn+`>o#iChnL^1~bFqh4co!dgKzjf3Fson#4yg6)o;a6>RmO-dy*vOiW!kROR=!DK~q}n`e&j@k_}%(Jz@eqkHvX z-tL5{JrqAaB{kuqr4t~$b9%^XU2wT~MxwrdK>Bm^)`#NKQzdQwtosucy+44W+CZ`=fVuq4%33#kdFzXZLTnsK)!_YPj&W!UHg z%3zV_6A7Cnj_5B(I5<+XW^3R3H-8#?3k!RC)gCzF;0)8LtM<`PCXw+EoMOy2MNa`i z=6_~Ltb_b=-g;s;VLtj#=2%)Qe8zl>L0KQmRARXf3};I~$<=K7=ay$v-5+qI2GZ%N z@*SAdVF_;s^vZ|xW3xB@e*+>jn|S{&smImM+;~d7NW%K)9THw51+J&8y;Oo-?;EtNlZ75u<|8!hlsaH)f$moSUYu9+oz>t7)`Co zg}MqcyiQAR;5RSx^XuQM8gb?!rgW-$x$^f|NEZ5fazo2MhT_pojv+^V$T#cHPq zoHB(ohOl**qTyivNm&hb!Lv;(_T2+7-5-4&&Fzyei2RNidym?hm9YQ|OR2xGd&04d zSPs>1b9L0c;&o9KHv(C&sB64mK%@r?=~C4Mm-+*}3fJ1T%+i|AUkYH--+p@06R3)} z&9Q$*0nG65BU}imxAqRLp|E>ADGw?2k}!6cVna>wHARDkbUUdAMtA0-3RA@9TXDY} z*FP3HD)))eYNz4U#d~Uywm&tTc{{h%q-NEj#aCNXmpJ4gIw;e?pIy`xsA6W>)HIx^ z6_Lh~_cyP?l?zo$V~kaxKj@yN;*rGbeAlCiIiwSYlK!RH+f+1>m^KtPn{tNH^cN&X zhK?J|Oij-7Nc&0p7tm;xmZim;tgwybK2^B}kN{Oxvm1uD;}MsF%0|w8iTAl3HvZa- zB38!5Vu(ATcrJM5kGM763AwnK{z%SV8b6SZ`-+ZXryCImregQ;;~Ku1K0%3!PHO+f z2aC)ZCV#+$Zf6zYEifd?<@MJ~gpO*pgoN~3oNz___|n09T8Xj(Uo$<7`V}6LF0!srz18{Xnu3<<0K; z;K!BQPW4Z5XlB55Ek^X^1tdla8fB;`^O@<92 za*otJcrnFzJ@;hKIM#;YwS}gVw^K4@0##>}R+=C3m4HKOaxn~P)v^`&_U*Ha&d3O=rL|r4~^k zk!f=*ons5+(%=)OT%7GmJpQe_1^zbXUaFs`>FDZc6}ghnHaxW8&pu|8r3@db=>P=DhT8QVq!= zK;6=&HV{P59DOKBJ$^{*N`IQO*OSs(P78iVw{U+TjZFjT<#`K{X5Sr%hUOg^J89=M zJvN-yAL@)~$>q+XYp1C6!2g!281i>$M%|_9Zbm&UZ&|)9`XN%%P|a#w5kx)V)+LG#!rd-><@&X-=e)seY!y$6{-El23 zEKg%sUNa;cm|elKsgUJ`ccNfOX?U13kI_O8XnE_@AGtyUfr04n?4Fdwru$6b=y zYf)BC$p?komSknscMl?UfdLj39yg^dzVYlrq}M`RO+wVSCt4iPgLfd6uyEE8DysCU zNkm;%Kk)TNw%=pAfX@4f=!%}Rfab#GEEyrAc$TvF#NH7OG-4tjvkm5l<>oS=6-T9F z(B{9p?sltsux$Bk)FfoDuVuK$9Q)xhOUD_C zU8(k82y^-7D5kcx(p1u{goPQx)x7A=fDh8k(4k~A4xChgrS&b)Tq++|>SWxnPfs;_ zxly0>$wsDy?c&|&#UGvc4C@tvN}n7|8>lzbR2G%TtToes#yCGH+BbWvp;7hJT;7A1 zZkr3xI*Nn*m#?B#cu@P?rCXlxoav8|lrfVIbdJGRqNeUt*su&ohN5ur+Kk>xk_1o3 z1zonVYRI8V8sM5Y9q#2IX>-8q5BF{C?p<^*OdahJ3Jx}=IifTY^fFB`3gQ*e+@?s% zOdJ`%Z0Rv-y%^pDT>AlpkW^Ev=h2Mj&04!tRH3o8_t-=btmK3x%(}Mj#KJKrFhh0zn6a?6%qGb4ScPb_sb#r!qo!id8x&#(6usG)p z-bC#2il!9XQ_6=n962B?bwc}WdE>Lyhg(YsDTJp@qCF?VK-Q#X^M%oc89sMD ze|dj>Ie0%sxR@?KyFa$jT)6T)#=^CT`^T~wEVggaz}}SCav=NXFj9zy%ER8TZ}9Gg zT0OtyanBkOIYZauit(Q@iA$joCjZvF5zD|-C~(t|7lh>+*Lk{}zARA~zNVb`l@-|6 zFZ0^KQZHtIHMycR801!ehHNYRQ5k7qZUn8W`egP*-Nwm#1=|te+6`0t{rxE?H_%f2 z<(wM-9P}r<+_Ok};=X-(`aL*fg_z{|Bkh97)Und^Q3>ToXIc_ice}B!7LjQGAY%va z_V5F##@ZvU471gwrtywUWJGw`K!LY}U6QFSnSDk$&@%M#wg8j95JVU=(pNg`P`^Ji zQWNZ>4&uzSTKwH3)Y0oNw?9s}1vx|Pzs9!%N6|obn28(9T|F{iC~c4M^TB|2s1B`p z^*4Es4St`|PJ5@HPE6nuM0JI_oFMd6-6 z^TD@8hqo9Etp`&)qg3F%@GA%K;TbOpPcuJ%T8)ShzeIus^WtVL!)t@6PxTdxkTEz4 zle!1;nR{+TKYw$UylXlRQW9G!$O%VJ;yZqoCEMsOTIxUfoeB zx6Ee{&O^{^oCj`L3eBT%w$J(oD+~pTc=;KnBNqdl-t^-thG`@($^tZKLR6Sk!#EnW zF`7%xIgQtCw{~;{iU9;XIY`>Dbt^XV@}@y)t6)C)A|6~4Wf|XCy+Sl~oU%ulM6P4j zvulpMgAUitkX5U+gIa0?EHt+gXGHqv-6d-K$#_fJ9-^K#t&@1vFigdRE^zdSbb z_m3NjEy0RVW+-fJD*u#`ckJ)C_`K0~y&-lv_Q0PolPz#yjp_|3;V=0BQ}ps078bb} zhIfh7;F9n+b)0KZA>%sY&X=Sz>>oONxdhAA4lC4mHnJ90Kaq*$R*#RP&C(NisFx0N zEf_((w|?C`$Xw1tKgVC4TUWM}bK3Ig#LW3jdM+Im{A15_@8=51fmlhqE z?!4V1b+?L;VY_5xA2O~Gj@^VRp(S#h+AA>MniBO7gDwa>jV4afNdDjU${tT z%UB4b3-ct~@au1P%RwXgX?BbPDdu$1iQ zZXW}p879rxnWm7GAH}|K!^c#2z*ky6=1T&CT~A&Cz@w@H($6lg0(NZb>z}<>37m`W z9v|_n8IUX~j>;pW$h2}QS%Qgi#wb-!sR$7(n2@~fKF3>+@-3&&^Q-7hK`6r5g;o49xO!&XCNpp^pf39QZi`o5E1t)ey=3$#!B7YZR#J^Qi{RXii-lG ztdM%fk)R*{K`6)){9}N*;l6$d8igF<%KUZXDf#1kk7GY)8k57TmEi0ABlVr;GiKl1 zj`ZZO6(N`7+hIP-fu?tVZlcfqy?GvBu*)qrB6q+p0KMh#JpFEjGV^N`)d z-Ya5P%P|nkW3^Wq#)-5a4fVhd=&Ynv1p@0Y#7LT3_rD45Dy3ZqVY`IJ`%NNsEn1=eb%(YE;AJ)Wyf=8FcP^hKL1QMPxxnmq+qxbF$=T<59EL!f$~>Jf z@|S0i*`Hk|_hZ~&6BIw#TL;b6dHM}=9srcWJqC^r0>>A+)oiNqRY`!mTq{c2*tEDj zZTkb;MaOIm^RKREbI!x5S?SMxrcBCH*rf-PMEFwK&s|gS5bNMyLMgf)Oz)&On9O}$ z$&ebdsxZ7T5EIkP{D5CxJp^6-hqZ@PPDy+iWPZ5Er4GAdFQr|ew7rvO`iCWOUX|2Z zyjz)ZD_Ov^@@gg1yMq#Yhf}R=*5{;Y8HX(dI|ISqIdkxTmrnjJEp3LKi_NYwSyxjd zBPf@E)ZxUr+;%pW!3r0vfEq!;D~pUml#T68yWTw}pUTI$7tP}c!Fu|5y=7anuKP~Q zP=GeoKxjE6O^Bv_N|d}QW2LFpu?%JD@rV_w`&vTDiTe=&cl`S8&zq?TDxJg(W|oxV z!a`0iiK|c9UGpB)=ga@FIGge*v*CUlDYH}vKDq+y?ySf@vl&~m1AGNl8G51l6<%4QeW!G@5g3u4 zafSQsxFI$m4~#m{*<6`i28ml*c%x;Wu0&=NSwp2_?qJ%9zR>q6yf({=^6Q7H;J?@^ z>nY@>9$YH$4$P^d>qYz8y-5{jTqkooUl~;@u{m#H+)+{ywQ>cuogHwX5!=Doj4vWG zon^Q39)nBX34XUI(l^l1(bbz!+TXP=E!)e#upqCtAWC!gRJtXvAB4!dj$1$3NSenq z@nxQ2(T3>6BNuoRq5j`M`eQOKh^k9SRre>+6?C~@ZPj+vhqhq8cRpuOH*y z@D6muarAVF$e8wGR|yX90lw#d^tI7}^^3|-v+@s$BMCAiZi#Ul9E5!y==v~*7~!_b z&(~SJG;X*DPwpP?{e>t@5N%Pt{!kQC=un3U>Q{M$@GHV6+@+NnGr8SnXhwT*Uz?bYr?(TD`iFT14 ze7;q{Zgy|oHl#9~J7AhM{4Hj<|66p8;62V4(*z6C1#FJ=tnKuA#}B*hvTujr8bu!4 zE3O*-ytZZl&%0)sMSoM|nN4u!_6G2fx&ogD3;XX|l1JjqC@6#lOfoK0Tk1C1BWXx61sWH(sD z2fGJc&h)AzS|RG=g)l{%pvqHDMNa=06hwP_T#SVdrh`%xM8+}5hPnnjr&x>~V9M=l zPj^Gs|5E95qf)ShFqp}gkNUA1U#+@-_nEO`xpMW?qFcxgdaC6L9kPo@2YaW-Pa_-P z7=X<^Y=kGb53*knbYTHBWL>Qz>?2nmhxCKr1g)N#Zk-)A9WVMzRM*X(JMesO*7zOd zDxEW@qOm6HG0fQoS!jM7$4j|x6)mp!qZGg0i^s_yZ<}f#ZYGwwog$;ox72Qv4q2tQ z7xE*H?jBY%l5~$NKy{+-Pa7XVn>nF8vYMVfe@2L0&?a?;3(*VR;xK#swRfu{&B+AI z&*hi?dJZD4I}MM=F#%oD{=L9)urggFE5&wmJ48|_ z?_TwD(l$OBLop_X-#m2|?A;N5My- z27khF5aa*(Y@=Wc_4fy5?#?k83OV}-G@B?wcfcYsC0yN>16O6>x;}hSjY5Q3@svUr=`2}hT=AO#J z`t#L&?HlN>q;h4P#P1HS4ZE0z&z*mu2ZZW=m81McZ@nbShw@x9MB;x8xK2w7JIvkQ zE?fwaOzN-LSCXk`XlPFw_;qkiGd5dyDqgTybe7h?0OPF@=SfDXs)pb`D|3zlR(LTH%^n zu*rIu3n1=T zCJiykfE<*U>15i$ON?^Bw8lBd#>CRYE%~0?q*3XxQb8C7gX<`UZziX^yzM9->g0BH z&NEVkVOpseXEgroY=0jO|Brm>20N;&s-zW>RC|%i>Xb~Cpq4{?4^zgdykl^AnNa&L%uS2;JuMOM{JrgZpP-64+tOJv6kF7Yr}|}zTZhrTgCp5p zSDe{hoH%qgk=pW99KV*$h-OB5g!OBouHC*nTUjtE0xe1!u}~a0eGL3AR}%%TK!$b-!Cr%T3BIg^(34JYd>26Bv zCDRPK7>V!^4Q&z_RbPeQWihbRJ5 zUQ0K{!Ke06trh#gxHPfe+0CHH_aI3+JpqQ{Z|In|uERz;eG_gmJ8-e7Tf#med`**= z!CpPKf>jN`-b9>1w2Bk?;uu_R@qG_^0)0l+iQf(KhN4d+kr2!WNG7}d@Dl+;O><7O?j!jOy%F`_bIa;4F$EB4AnK> zc2|UZ>TOd0`G=(zS6q*=WpvaD{MxoTI<{v0nHa;DZ0eXnt?p@Uifk>9|5>${9|#{; zp!SK|kA8Z!@kB>2{n=YNLT`^7MKI=lh6djLa+pcD8 z=Qx%R9lp_*uDw_Wm7h`?3Q$MV-gVk&hk`Dr0SUL`oi^rjUFG{_l%|n$D0c>fE;bv@ zc-nnVRO&lbB=`{AN4rRt8{)>+0J6|&5cxnjV{dmles`kMYUwG@@xL{d;{&U)$0A0o z{9%5$jB(Lb)qS4vt~6JItO(L-Q+1t4*EYhzw+PF>k5MxVuK$PSgDF_cxoW<}bGNVg zfUimQs@d}sh`iNr0|7r%J1ps&mEq=3z|C4px^0qN6vnhPTm^i6>q{Y=hJ6*%b>7y}E_S3Vv2u(}Pi%c>$}Av%Z($2LGH6Xm39iQ>Okv3d#~%;DGc-XTGLNL zmqss|Bcts1G;;I9g*RN^d+3Ix9>12YYEC-W#^#fM^gR{d`ai6P`1jK$`x|495bBD) z0i~Z!`WW1b(Wck~`5sYE^g-U}Q)vMa@oCAAHs|0~eo5xOD*i#wHgqp6?KV2ojwr)# znxQ_&udc#QO;bt!C%N9>Gr-blMm7%HhVYR=N&jnQ0G2CQ3XXGkUD<`c3lDo;{Hq_H zIq2j_Um929or*xYm6Ys%%Fi>;#FHe?mye*OP2|`mte+3yowCBF$AV%#N&5W=8i+Mj z0)6)cim_+@EtB1g+;=Ql{O#>Z>0AGeTDMQ88y@7B?R=JS`awv@&p>eza?AVVK!q|X z-HNx#vv&=cxDp>_*aEgSl1(Yp5+qZDMWRPw<~3d&BepXv1+Od)V$RkAQeu_#d@N{u zz0cLv8?oGRXp3pCeM{pb4QM_`9m#gJeu2>ZUDi&K8jFej+IlYOO)qreGBv)QX2V6A zCws~eZ5l9LfH^SrgJnwtULl^_xJjqYOK&thJmFAd_!fESC-WEUPEM~`f`9m{0HcN8 zixe_NU|U?voanrn;-2L7nbVZIb}(&0Ga2Wpm!Zq( zA2%Rh?<34igXQm^y|2F9dyJ8}e#bmSYH_(i;4Vac5D~4C^fz@v80|Ty1_qEV5SI?d z0o6#=Z+%kujwl*Ie0^VrVgL{z&WMU$9CwCAojFvA?Ct|l%oS*h|7Jg)b}3-m-$no+ zYL!Kn^2(SjlccmHBH59*F>=uWvylB3dBva)tVW}O@)+-gmYEtu&eCb^7W`&6Mw(eDu&xQRtJ-4*S;Qc1O0=;q|rsQ-1+#3W0igmu`GDK=?o(*5<yT{=4)*Q8 zuX*_*uZ3!_ISPU>Qix~=?M>a+6PmKml&u~|=Um;6d9+PN-T@4-O;-#mTt8!<;IR;t z!7&8r@|7|&^{Y00#vihiwF(PJc9n}g9_N9SvEC`V%=2)jk`yFV^0pK!p8GapsU)Q z<8ce(M~%qc(96ymr{rlQ5IHr2_?8rL*DhkH%5)zKl(blBRz&^7^1YrraZ9?3>gzw6 zzKGZK-fLYt{$5Uwt^{X~)~CSU9UZzdG#OrBCf$eW3jsf&(OSzuPzO9`CA-3sCXReroEWBau1fNo2r!+=q zM}yp~&|vtY+&`@8Ab0Q0mm6SAFAhCFdBzf`Fc3F=(T>rG;<{XTdZpr(7gN5x%l zgXv3R?u*~hjT3hBja5vDGd3<-C#R~@dYQYEg9QZglv|SK%?SdgGTmN(@sCeVQ?^Y$ zco{EM0q=ot{hTfDuHe7ji8qqfeAW>u2-%NaRu?sg9?V2)NK@80e<4;M;pNZ~<@z$^ zuG~LIMEDWRN5IC=ZQq27v8HVo-nU|1VY`po4YoZ-#uha>)AAVPpoTm>VQS4FZUH@j zg0>#bG@YMAgNEg#v+ zRLtXusO55YtA$9jXy$^h%ABg0+>^v{p|DR?K~=fE7?-WBt}6^iqdF#wO$?WA`x)wD_Xu_C}QKl&RPX+Dy}Fg zl7%N6Z5uD`D*N8+{muau7Po6c3?>NWmuNiGN#f>%a*DkMh8HnCLzkW=G{Lid+^Uf8 z({P5I%A9ptXC?vF;?Yv#8_HelI^pC1jWV4%%prL;kPN7ms9Tg?F;@CRMSj_Lw2l)E z(ST6`(wo%|0sva{F@bL1TE1NJtWmlRM7%$bSJ$ItMxELO2fXocKOt1JRLQi4zn@b-^prIh%Uh z^j)|8;_mZ$#WRCc84ve6_vOiF0~PqSwLT&wF~8G^=ek9{2GzFDuQZC+Fr)h zhrfq|S|rxB<{gUpGx!gQ-v%&rhpu34HPeP+M=g#e1*@j=LYsK&m-*Z&kG-4rT63BW z$?C$}ik1iMS1UYBsg|4aLhECvmA(sK1_jK|2zSITo_=aO`~U5`86X>KF&34!Asg7( zIvT0Ijp{Gg>~f%w}_Mnr#;njV-_VWr_Y{b!o>=t{5l?GiZVAJ!44fAsRzNf3Q|j`1ME7&EZ=Z^@Ov zsewYcHp8#$uB0d8fAN5)s@jJ72o(dBaGCD$*)=H{q`fUUc-x*iz8e{out9ZWe2?At z#W%3TCP;IT;H0eTbSC=VaMIAUt0tS*BtTA6aGTmr6to!OK-oOw=beJ0c>Pt<|+L{-g{1K8=}=tk-jkLCy(?fI<_vAFUfd zQyteX5oFcu6ReSNA8@CvC$e!yJkZ@EW*?j6SGp-yXdU^U(5;z zp8Nz56SKmI@$z9}Rxml0k9i9E{DwweYH_}?ZmHgI)_*py@Df?wh$1dqul;iUgXnu} zf+VqMsBSXzI(!})$_$NUR^*`gDD^4k3MMK`1JWlR6jMFD)9UNu+8Nqj5x4o_+&-+O z6S~6-e)u%YiZmW>(WqCH*jKkewLI4V%IYk{ZL0lf{#g}@RqE$qrm`3a zXUl0o{3-pkH|Uek=~;^r<>1HbER9t9qW0*uAj}-hG2gg)Ehras2vAX(Ls>CVGd+px zRQX*p?*8Zy>rP+j76m@)b3chQ^ouuAukOD_r_CJrFm-_D1S~skRT5*i?p5qk9!3nv zMiD&l`AQY30o4+| z*O!Z~bNL*#)ZW$86?qL|$n;w2$;!AyUQNP~N{RK!j(ncvqF+NI;H~ZuIdAe`;9d=Gc zqM;*E>Ag<=_2)~^VYZxekNnVcgMcLC4}RtW^v+i50+SR~mW?&vBHDkIBrtpuidVC3 z2meI9qBS9Au64-#?tSs7tt(50E#PjDwYniK*S8c*b-5LBqJAyzZtmPsTzy^tNm4j{tNX}ra-2(VtB{_a)VfcioM z0bCt&@ynY&USc!+n)V4BMl(d5_Ut8Z)M^ok+MF|{&dQ3)FAHbenlSV?8!5XHiT%+E zcIOv5i39*FVvKwv={Er|<@bLXqQ9|TZgXv5&cO$Q7hgJMv2NYL{v}Rm?ZuBs@#Z~D ztlvMZ^}9)y5k{$+omi_guMO4=9gMBaI~_n-$o%PX#lkdkPAB!1DfJCU#>eI-*0rxs znIB#Nl;D+3`>i?+E6%+#PDjIX^R|1ZH0_)<^Hi8M#IdstLX=~y(e!OZZD_SWZL@4< zHoBlP+rd)i)@UpDd3L{j0rBrXTV5>T75n_>(%UM&q zQR&E2X&PHoYdz_;bQgU%sgBg|52}Zf=jRetQ^)#N@1yA+@?n`Fn9jY`k9LQuhvRz1 zNKE-<`~BP@_$d9v{HD7Ptr7^n=Kh%Ak(wc{o#A?8+m9wQKOSYuEdC^jg}x7T%m;FJ zXb1ne?$ZYSfqYSv#9^Rej0wi}IPKg6C7)vY|9&f_x!SA4izbz3b>iw#TXRKvsl)Xh zUZZ+Mi^UA}{mgLVUODL0pt+B8;gDCJ+c`z|O?@po92PXj_w3Heh5J#p7}ncuQMq_y z?4g6QK{m0bcjj6OTE$YhV>GCJ41c@ApD{V~F=xzq8Oxo~Q0%_#Q9$8qArC4RpE;bQZo0Jb((0*`pDY7Qz>ihO})A?J`q1 zZ$d6eS%ec1@zWw_lW`xm%`5gUoO;`eWtaRyGcbE%8iYTlaFTEGRB38Kg-WeW6@B++ z9;O&f$1Zp+Ky=l&#?FK)@OW7F2|g#!3;fC>?J{wAd5-A=`OF@Y!P;qLQmcNJd&nK% z;upjjyMPnZ?wqIqfsy(1&gef|Hiwz%&o$bJM?Rko{MEcq7_EIY@I)u4*b@mCNkz5yyc z%+0dC1cbcL-y6zbME5@I4{*b7dhgPD>OcqK**ozI)ri*Kz4hYuTzdD`eOD+()5TDn z&m_p{Q~W6P$8 ziFEk@<&NVA)%_1jS0D4sSmEgOfxHGQr~*;G z7TRG^F851=fOX?vG(mmLOw>nVZocQt{N=%R0nhep)|6Gi&qGY#?G6EpXWLThXGT~g zcXta~XDli{AYMWzebcX~UgOmftB@GbIcy7M&y{S&qT$LYgzT+{JA!UKyrXb z$LticN}j?lCutV389B9sn!?5;+Aq>923mb^cvT&HOv5ey?M<0lS{0bh)id8qU(-`T zpc{bCjE`!--wJgTOu!lFBkJA^;u`QMGP706)bl_%b5|A5IhTb)sRp-tZ@w07zPlM| zYcgJQ-1MSeFDosq*t7PG-RCI9;h$(M8fxgZjbCEXP%g2sESsMlHG{KIZ*G!qlj-H+=#?AuISFA|Z)N2sA5k`cnF z$~g;7D=k#ktF0jn5JyT`8HEW(t5lWXFgU?Dv_C~YYi@}P&&FjEv?y#1a>q%!O)oVM zSN+xw8C$=i4Wm0Yh?Bu*J9!}jKet0X-v2tWB>$&p8iTI?O>iz$j<;r=DQUVT0{?kR z`!#G+G~r`qr?ZGS?ESK7SCzs+ulbz8v^Q~K-?wxDrat{t6Ln_vFx>HqMqaz-2TUYF zhJ&KhMNE3AHRoA=} zr>0T_HAxw`$hQJ!UU5-~8|r;B>Sg&+lPICiPr=d<#PIBV z-x+Q?wu*apsB)rcBaW5y8CUu<@b2*s9X(9|y@i3!Qz6L_S2G=Mx4xG3a0Em}xOr4U z$d>u!sV~!_zQ+D8k0Z$EHb`n`4C8q+s@-e;hxLxfZ4Kx232&m2j&@ug9OiVgSIU?q zLme+}rRr9hy6VDE%h5*`J{~H}LyH!HtQ7%$b$Xjb#v*N^A-a~>$i?ctAVgMs1Z`lcuc&ZTq_ zMrN7hw};7FOfwzlY^-V^X&;}bq#8$#X0N*dGb%!Lu{5LSzX&8BF`waW2KY>Bt4Pz& zmpLAxwe5aZ6vt@`S1;`E?pKjc%f<2QsVJ!4>@he&A5rh^F-1W$eI@+T_%ptm&WbzR zgBaBX@}(3t=2O?@@KEp`+FRULqj6`&+#lA?m$(=7SV?o-k> z3{=)Yn~#MYxHTOP9!URTajc-;1_+CG3Jl+E5vzv zz~B_bwrb;`VLsn@7C0tcH1VNm-jwND&42J&825)f^;pA_(a0c zjhR=}n}J;hE zi75A8X?oO=YP+?g!dg9Ro90pGJ!wcBa6j+8b+Db1v!)6 zbq;=s<2VVpvxn0c4$H~$^B2H@vTqwOsJm%tvxVll27U5iTAA8- zWW#op>)tXhN-K`O(`&L8=#xUuETEE&N|63hrrqLpA|^egtz-bebON2@;{PJ}#3@C% zo#pxt6O-iA4>JTzlKHGD^iLN3eAHQDhidmc+)8{=y4KAODx4^ zR`XFz^G2xv2lFMx`pWM>t>+`&^ru~WH$=UrsiSy&j)!y*jZ|l~UV>mohf404#J!PN%wEWz%<>q&$FyDuIH+K^k{3)~dOmGkuMI@U zlUi!j;18W}&CRxXL~Z!ms2lI4RrkT0)TO-7u={lioi$4lu>^re#Cbv`gulKLB_^i+ zZhs;Me5LZTb|X-}=1o{Aj`WvT5WLtpBOIK@IJ_#s!`y`K?z;NdFxwl&OX82#4K~uw zNfrP>nPwY!2J=9)TEL;pYnl1i^RR+~n4z+)nV80o{JQQ(rxLvX)5Mz=i4PWNMFeLnw~T-%2TeZv%LJhP}PoW44@;kx%op zwD0t`=~j(XV#k1_cKYpXRar@CMa-ha?fee^`zho1Z@NK0|1kF1*E9W^bQYR_m7J&u z1u#Pa;>@RP>1=fX%$OJp>+kcY7kzjsqz~ng+~U!D!e=5>4Q>cnagu$aLy6vo;ET3X zk@7A_whkU!8OvdcbSeKqzxDp;LQu-A zy_+_h>Ou-?n>6wqkCCBIgbyFR9|AetM-~fmWe3!r3`aa30pIW{)%OWFAosbgdGK_J z&+USk7yAVOG6#6tL!{fF;OXEG?479WQB~aEHSd2&bJM3 z4jRl-dzP`zn$yVMXG~J%oq6*yeqtP*OQ+^tml*x=WgRqUU9*0eQq`FwO;ht zie$62mi6Oa_K}T&%na+On#ml@SeL%aAPPJ;c*AMJXMTDd7xpJ5F7{n5m`9bCjOmCH z>geCx6Jc0i3UUL|U;EOxop8H^liS@h+^Wp4VJR|YUw`ex+XnjwDhc5 z#3Ub#DET-?*6)`@!0Yyj&z*zCVRtbFk{$-HHrIRi-mj&Hr5Uc*$Nea#bs-eCm1 zTzUiU_Df2TaR|uJ<27O765iyWzLTt`o6XFEBP*PtHy2kKK#lp=#xJ{JZy9|+N=`dw z|HZv~Tzi#AUTn+T(A;!3ve|qxnCmC|?^oKLA z$CfIW%1m@-+K4|@96v=N$ED)i;QTjG41XN2o3Hn~3r~V4z`y6uHNqC=g4JJEx3qS7 zk|l;JYkiM><|ecqwphNwM0$Hyq6igcAK(B`mM8-i6%}o4Fgv)X(p>r-QE;k_QU}9# z=sPT6(swK{^T{};=7D+4Ic-?>=AcP~pCKq|!=?^WCOOnNV^imIK0j(?yK-bL9hq$o zu9>x_yfS^hQHxhct`{`#oY$I4PCbG;_TrT?cOicf1z%s*n3Li3zo$K|%9}td@aRDZ ztPYAwbZdBHXJ>nb4S4D>1$bm_|3G1V5??%+Ak`u<#v64v_7XCzw0zYN-x1;z(C;uk zEj`p$em~S{-?f%flrBoVc(?HY{YF2wlbvxqwhNdLoRrJD7jLtDvs--=EcjMuz zSWG&?K=c$i+ z;#S*MI=a%ZVwDLq1AjCR%)u^sxl7+{!k)KS}BJ+pLmkzfYUOG*V{#vv6h@|v-K2K}!;M`4rt~L%V z$h}ESj4C6sUZKvoUfz-}<_VxN-O8D1EO-^rVR_M<>9;wxZ^rQj^e4G-qJZ3Ls5slI z&+6A-j6z8Yi$1g=qp7~&Qy#q3%{Ow7H94Sb`MATMM`-_u0cHl?&emb5&yddoPyf7C zdo_`4lUNp_FR zJnNk^-lgWUXhJ@Jg>5;RWlM*^4l8!QQc0}ub#6^^-A6@j!jTIuqsW7l-dSD*b&%3i z=E)Io&CFz!wc)IlLHib;9W*^jd9g+OaN3x{+7UF!(P~k-rL;cE5HJ5py*Q|*3}nm$ zv+%0l`&oS#as~OJSuio7HEN+Yj?hT3`IG2f87oMp950^OM;F8VD7SpOCc-78Yb9mf zm8a~>$%QqrUJq_W4V#%5(KYUCjm1D}dEMJ9c%GKi`AEMG%X)W#v*ynAS>S8g)5GeI zGW=dtP7NENHDGsYIuqYyWu~cmWt+sk?D0$NZjfPIQ6AB^;tYm4nyL@i!X3UAL08io z=+Ty{>uj(K*TZFc8gD!lKmbfUqeC{1%90ZseIr+DSae+_+uu;SH0kcGsHXLABwB2o z^&@qPx-D`f$O$2rA|kZ)cy|Q#0nC-uV_a!b4q$zsZ1Q7J7GfFpCDlU1{Lip6 zCo_klQiLJ$lgtyKg=biS(B;aW3K}J-9w5qIvamoAd?ydYn1&|elcfi)Dl?iC%O8!s zTFG`Gz-JC#)K9M0eS}RHiGbyt7~c5{uj6@eEt>?CbI?2X{aSR6Fbo4!9nTnfyJtEL zN5fTC8yq~NFV2BumkiW_-jrHn_7jpv&q5vq&n*+qNNUBAISEy+F|`wB+=f4ww-Q?~ zQVcpPZE6!QA(5Y3Am;+U9D5XdvuBUF)!WX5KT(OgZQ_^|?$KIj%_|G#s_FNqjU@fb z#0XoqX<;x^*P9A^2Gjqcn8aQD3Hxg)c!Kw0mvP4_o9=LAsgeh}0GCuU!F4US4V^T+ z^+sH+yp4^$-^N!V)o}gz59=m180Gj6>;C1gU2s_v8gY+=L?LssuRGQjWhPIT?B-Kk zpT8LZQ5N@T-T%YlYN`HGN0b^&s)ejo4(3$1H|hf_MVPO&TZnH=%n+_x%RM-6Hpa8! z0ctMjf1OHytudTjJc4hyqz1A0HB9R@gjL;A@1_yH9rq<|TI&e9#ME5>=Yr@%O*rrX z950yEpm{7T03FYQ5;n}3j1p5LC|fun%ClNuELkl0@BgyqF!l4=jSb;f+q%-CQSeJMp<=5<-ZJjKJ$H#| z=ujc_`=VkxsimT#+F||~;|`jk-y_2vNtQFND*LM84N>SL+I88enISDKH=FhTtrK*t z42DwOZ>nc$(3CGbt>#}tAHJ6yd`dN9wZ(bUy^gjIItJgV6;E{r!)=!^;-fKx-#LU6 zCB<9~A-&-_Ab^&e?`!~6SH08`l{ z&1-3QSN?tU`_bRGZP%;+6RH?ZcOb1&>V4=)vS4N6c$lq2*&|6+_VHudmc0e#bZXR6 zJRVa8JZ7jAK*Z6zpoWR%8~f|+xZDL3AC|5F+h2#i*xRaGt}#8XeRL;h98A7Si2ti` zA4BRa>&uW7Za!x1CCK@0meu(n!!T&@A~zHXRMt>1dkKvmS~$C*9X=-toPU{=X`6RNiZbbn@%4TPWH@P>;>8u5QY!6E|tjbm4|mY=t>?IF94#FN@j zgnypYGeKJaVKwrA-UM?S=#p(xq%O5RXT)MPUs&V<+c%0DqXZ1G3wDR ze!ZJ4ih1ekMPAdME0~c9C(sGpsGPUcBrIWLMe8XhsNp-r@E{5)`xV9CDMGkPpEoOU zyLX%BWMm*0VPZu}H)Sk*nifGI2($q%`u-VTc=U1}=;glEr2v?5uL&iKdbJXFw}Fa1<`jL=EXt?^9LA(?Cn$r?K$hv*AVngy z?k{@$)z%YAF5F#KG~Mt;aDD17^WH=BT=cX)n;37I^OM8;$YKo{2ZY>9|B!Yj_jl8J zFKxLLN~dJfuRE*T=p9Q4YMllKxjkrd%unD_npF&t)%NG?j@Rk=#@Nug_fwDm|bY-?_XETSY22B@Qhf#go5v=Uv#&$ zzgWF)6Wp@kJ9&`R)7-G|nrK@h7ESaz{e!Xy^cpYNWe%=lT0v!PLzv4e7iwnkL?98> zbBE&V7tZjg2nlN|;c)KV;_&F?xTueqrQR)|!ny*kf`1Tg`S++1B3}}*wyo4=W4XfPsju$NVQ$LH zkOyoT;imLL#6}Oc>}Yuy)b0(pDmzKGgNuR3vjd&7=PX1~IX*_1+6fa=6wCHd_()Xo zo@{Dk>`#4%n)VE&-{~f}5fkuyObE8jf^eN?aNG#?wQ_B)0E@jaUIENJE<;O6uqdb9 zm9FVNLdMT97(M(C>l8>ImeOKDaG{AiBq1wkp9Q_SqO_xXNAtN?9Be)st+mH( zDGyqgs4=&O>mg$@xS1$^2Fb9^2U=E@#jSbE$NYdfiT)wN=U`Ooaf3);?l zdxo0nu3b_Zve|6izDD5T_rNi#Gc_&y9Jn2>X65vU&okO`Y1%o>olkbe-%OP_CUdLq+vtWzBXg)nx9OX}3?tSQu`bE$wOh zZgQs71$N^})r=1o-<}z_I4q|7sO;5W!1a!s4u1V}@}lY!;oLXM9w$C+Q?TkR$W}eH z-g|;(){PCBGtVDOI(GHtr9`KorN{eje^l|jaOb7fSh_1N(&yV*e@`2cgIB(o6kge6 z)v46AYMobSLc`2QotvC>N)vvhxo#}x$!9(CK<_+o{fWZG%ZJ@l{CwtoigfPZ;Th=O zDXX^9ICah56%%gO1;6t4S?j8}39`06jlCs(3||ABIHxTt=RKj2GTFmf;*nnFnu4ge$?G=MmIo~^ z+s}10;7%i7FcKk@ji=T5UuOh7c| z;H^4ZFkGIm@aO-2T-|t%+~e52ZF0IDNk-Whxqd6mjLg{6bm^YY>hzm^U6ld*dQbhB zqHFSL`O@cdsb6*+&fRvo?@V-d=1S#>o4(HeWFxb6LBoX$QpS7uiegXCh%@*!`-T0I zylLOM(_e3k^XA+f@n+Jc4n1?tm)gANHtot>os#0aaMt`4r8;KU44*CBWaaUcuXk;> z%#RBjzwCb|Bd@>gpyBVn-LK!?e5P=HI&h8OyKh@-%YRo^{AXA&O*~8ZSh)EyOZ!vT z_0>ZwmA*XnpSL<)ck7M+42Ryz_Rjq9`PMBv+aK@agGIh}S&eTKZe4vexsoMq$%o&2h20l@KT$0y-3XkeXJf5Q z`(*QS)pKj5_1hxN%EXiFmc6c9uris^>XEhZd!d~VQrh0JSv-)GGIBZbQM^g&b9c)# zuP6+O?SJNj@;xv*qX-Ky1q*n)fcs>=mN4IHRyM9Gu#_|K9`ve6P`# literal 0 HcmV?d00001 diff --git a/charts/codefresh/cf-runtime/0.1.401/.helmignore b/charts/codefresh/cf-runtime/0.1.401/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/codefresh/cf-runtime/0.1.401/Chart.yaml b/charts/codefresh/cf-runtime/0.1.401/Chart.yaml new file mode 100644 index 000000000..a22598d2a --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/Chart.yaml @@ -0,0 +1,12 @@ +annotations: + catalog.cattle.io/certified: partner + catalog.cattle.io/display-name: Codefresh + catalog.cattle.io/release-name: cf-runner +apiVersion: v2 +appVersion: 1.16.0 +description: Codefresh Runner +icon: https://partner-charts.rancher.io/assets/logos/codefresh.jpg +kubeVersion: 1.18 - 1.21 +name: cf-runtime +type: application +version: 0.1.401 diff --git a/charts/codefresh/cf-runtime/0.1.401/README.md b/charts/codefresh/cf-runtime/0.1.401/README.md new file mode 100644 index 000000000..909618662 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/README.md @@ -0,0 +1,28 @@ +# cf-runtime helm chart +To install the [Codefresh Runner](https://codefresh.io/docs/docs/administration/codefresh-runner/) using helm you need to follow these steps: + +1. Download the Codefresh CLI and authenticate it with your Codefresh account. Click [here](https://codefresh-io.github.io/cli/getting-started/) for more detailed instructions. +2. Install [yq](https://github.com/mikefarah/yq) +3. Run the following command on your local machine to create all of the necessary enitites in Codefresh: + + ``` + codefresh runner init --generate-helm-values-file + ``` + + * This will not install anything on your cluster, except for running cluster acceptance tests, which may be skipped using the `--skip-cluster-test` option). + * This command will also generate a `generated_values.yaml` file in your current directory, which you will need to provide to the `helm install` command later. +4. Download the default `values.yaml` file in the same path as the `generated_values.yaml` file. + ``` + curl -L https://raw.githubusercontent.com/codefresh-io/venona/release-1.0/charts/cf-runtime/values.yaml > values.yaml + ``` +5. Convert `generated_values.yaml` to yaml. + ``` + yq eval -P generated_values.yaml > generated_values_converted.yaml + ``` +6. [Merge](https://mikefarah.gitbook.io/yq/operators/reduce#merge-all-yaml-files-together) the two files together using `yq` + > **Note:** The order of the files being merged together is important. Please make sure the generated values file is in second place. + ``` + yq eval-all '. as $item ireduce ({}; . * $item)' values.yaml generated_values_converted.yaml > merged-values.yaml + ``` +7. Select a namespace to install to. If it's a new namespace it will need to be created before using the wizard (e.g. a `codefresh` namespace). Click next. +8. On the following screen: Select all text and replace with the newly created `merged-values.yaml` file and click on **Install**. diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/_helpers.tpl b/charts/codefresh/cf-runtime/0.1.401/templates/_helpers.tpl new file mode 100644 index 000000000..72f44e36a --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "cf-runtime.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "cf-runtime.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "cf-runtime.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-runtime.labels" -}} +helm.sh/chart: {{ include "cf-runtime.chart" . }} +{{ include "cf-runtime.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cf-runtime.selectorLabels" -}} +app.kubernetes.io/name: {{ include "cf-runtime.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/_helpers.tpl b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/_helpers.tpl new file mode 100644 index 000000000..9e72b87e0 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/_helpers.tpl @@ -0,0 +1,31 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "cf-app-proxy.name" -}} + {{- printf "%s-%s" (include "cf-runtime.name" .) "app-proxy" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "cf-app-proxy.fullname" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "app-proxy" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-app-proxy.labels" -}} +{{ include "cf-runtime.labels" . }} +codefresh.io/application: app-proxy +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cf-app-proxy.selectorLabels" -}} +{{ include "cf-runtime.selectorLabels" . }} +codefresh.io/application: app-proxy +{{- end }} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/deployment.app-proxy.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/deployment.app-proxy.yaml new file mode 100644 index 000000000..94e665325 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/deployment.app-proxy.yaml @@ -0,0 +1,58 @@ +{{ if .Values.appProxy.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "cf-app-proxy.fullname" . }} + labels: {{- include "cf-app-proxy.labels" . | nindent 4 }} +spec: + selector: + matchLabels: {{- include "cf-app-proxy.selectorLabels" . | nindent 6 }} + replicas: 1 + revisionHistoryLimit: 5 + strategy: + rollingUpdate: + maxSurge: 50% + maxUnavailable: 50% + type: RollingUpdate + template: + metadata: + labels: {{- include "cf-app-proxy.labels" . | nindent 8 }} + spec: + serviceAccountName: {{ include "cf-app-proxy.fullname" . }} + containers: + - name: app-proxy + image: {{ .Values.appProxy.image }} + imagePullPolicy: Always + {{/* resources:*/}} + {{/* {{ toYaml .Values.AppProxy.resources | indent 10 }}*/}} + env: + {{- if .Values.appProxy.env }} + {{- range $key, $value := .Values.appProxy.env }} + - name: {{ $key }} + value: "{{ $value}}" + {{- end}} + {{- end}} + - name: PORT + value: "3000" + - name: CODEFRESH_HOST + value: {{ .Values.global.codefreshHost }} + {{ if .Values.appProxy.ingress.pathPrefix }} + - name: API_PATH_PREFIX + value: {{ .Values.appProxy.ingress.pathPrefix }} + {{ end }} + {{- if .Values.newRelicLicense }} + - name: NEWRELIC_LICENSE_KEY + value: {{ .Values.newRelicLicense }} + {{- end }} + ports: + - containerPort: 3000 + protocol: TCP + readinessProbe: + httpGet: + path: /health + port: 3000 + periodSeconds: 5 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + {{end}} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/ingress.app-proxy.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/ingress.app-proxy.yaml new file mode 100644 index 000000000..1b47210d3 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/ingress.app-proxy.yaml @@ -0,0 +1,27 @@ +{{ if .Values.appProxy.enabled }} +apiVersion: networking.k8s.io/v1beta1 +kind: Ingress +metadata: + name: {{ include "cf-app-proxy.fullname" . }} + labels: {{- include "cf-app-proxy.labels" . | nindent 4 }} + annotations: + {{ if .Values.appProxy.ingress.class }}kubernetes.io/ingress.class: {{ .Values.appProxy.ingress.class }}{{ end }} + {{ range $key, $value := .Values.appProxy.ingress.annotations }} + {{ $key }}: {{ $value | quote }} + {{ end }} +spec: + rules: + - host: {{ .Values.appProxy.ingress.host }} + http: + paths: + - path: {{ if .Values.appProxy.ingress.pathPrefix }}{{ .Values.appProxy.ingress.pathPrefix }}{{ else }}'/'{{end}} + backend: + serviceName: {{ include "cf-app-proxy.fullname" . }} + servicePort: 80 + {{ if .Values.appProxy.ingress.tlsSecret }} + tls: + - hosts: + - {{ .Values.appProxy.ingress.host }} + secretName: {{ .Values.appProxy.ingress.tlsSecret }} + {{ end }} + {{ end }} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role-binding.app-proxy.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role-binding.app-proxy.yaml new file mode 100644 index 000000000..a0e53d154 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role-binding.app-proxy.yaml @@ -0,0 +1,17 @@ +{{ if .Values.appProxy.enabled }} + +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-app-proxy.fullname" . }} + labels: {{- include "cf-app-proxy.labels" . | nindent 4 }} +subjects: + - kind: ServiceAccount + name: {{ include "cf-app-proxy.fullname" . }} # this service account can get secrets cluster-wide (all namespaces) + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ include "cf-app-proxy.fullname" . }} + apiGroup: rbac.authorization.k8s.io + + {{ end }} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role.app-proxy.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role.app-proxy.yaml new file mode 100644 index 000000000..91edb18d9 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/role.app-proxy.yaml @@ -0,0 +1,13 @@ +{{ if .Values.appProxy.enabled }} + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-app-proxy.fullname" . }} + labels: {{- include "cf-app-proxy.labels" . | nindent 4 }} +rules: + - apiGroups: [ "" ] + resources: [ "secrets" ] + verbs: [ "get" ] + + {{end}} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service-account.app-proxy.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service-account.app-proxy.yaml new file mode 100644 index 000000000..576e00b6c --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service-account.app-proxy.yaml @@ -0,0 +1,13 @@ +{{ if .Values.appProxy.enabled }} + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "cf-app-proxy.fullname" . }} + labels: {{- include "cf-app-proxy.labels" . | nindent 4 }} + {{/* annotations:*/}} + {{/* {{ range $key, $value := .Values.AppProxy.ServiceAccount.Annotations }}*/}} + {{/* {{ $key }}: {{ $value | quote | unescape }}*/}} + {{/* {{ end }}*/}} + + {{ end }} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service.app-proxy.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service.app-proxy.yaml new file mode 100644 index 000000000..948c19410 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/app-proxy/service.app-proxy.yaml @@ -0,0 +1,13 @@ +{{ if .Values.appProxy.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "cf-app-proxy.fullname" . }} + labels: {{- include "cf-app-proxy.labels" . | nindent 4 }} +spec: + selector: {{ include "cf-app-proxy.selectorLabels" . | nindent 4 }} + ports: + - protocol: TCP + port: 80 + targetPort: 3000 + {{ end }} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/_helpers.tpl b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/_helpers.tpl new file mode 100644 index 000000000..41220d09a --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/_helpers.tpl @@ -0,0 +1,35 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "cf-monitor.name" -}} + {{- printf "%s-%s" (include "cf-runtime.name" .) "monitor" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "cf-monitor.fullname" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "monitor" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{- define "cf-monitor.rollbackFullname" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "monitor-rollback" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-monitor.labels" -}} +{{ include "cf-runtime.labels" . }} +codefresh.io/application: monitor +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cf-monitor.selectorLabels" -}} +{{ include "cf-runtime.selectorLabels" . }} +codefresh.io/application: monitor +{{- end }} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/deployment.monitor.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/deployment.monitor.yaml new file mode 100644 index 000000000..d46976db3 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/deployment.monitor.yaml @@ -0,0 +1,67 @@ +{{- if .Values.monitor.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "cf-monitor.fullname" . }} + labels: {{- include "cf-monitor.labels" . | nindent 4 }} +spec: + replicas: 1 + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 50% + maxSurge: 50% + selector: + matchLabels: {{- include "cf-monitor.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: {{- include "cf-monitor.labels" . | nindent 8 }} + spec: + serviceAccountName: {{ include "cf-monitor.fullname" . }} + containers: + - name: monitor + {{/* resources:*/}} + {{/* {{ toYaml .Values.Monitor.resources | indent 10 }}*/}} + image: {{ .Values.monitor.image }} + imagePullPolicy: Always + env: + {{- if .Values.monitor.env }} + {{- range $key, $value := .Values.monitor.env }} + - name: {{ $key }} + value: "{{ $value}}" + {{- end}} + {{- end}} + - name: SERVICE_NAME + value: {{ include "cf-monitor.fullname" . }} +{{/* {{- if .Values.monitor.useNamespaceWithRole TODO: WTF }}*/}} +{{/* - name: ROLE_BINDING*/}} +{{/* value: "true"*/}} +{{/* {{- end }}*/}} + - name: PORT + value: "9020" + - name: API_TOKEN + value: {{ .Values.monitor.token }} + - name: CLUSTER_ID + value: {{ .Values.monitor.clusterId }} + - name: API_URL + value: {{ .Values.global.codefreshHost }}/api/k8s-monitor/events + - name: ACCOUNT_ID + value: user + - name: HELM3 + value: "{{ .Values.monitor.helm3 }}" + - name: NAMESPACE + value: "{{ .Release.Namespace }}" + - name: NODE_OPTIONS + value: "--max_old_space_size=4096" + ports: + - containerPort: 9020 + protocol: TCP + readinessProbe: + httpGet: + path: /api/ping + port: 9020 + periodSeconds: 5 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/role.monitor.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/role.monitor.yaml new file mode 100644 index 000000000..8512536a5 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/role.monitor.yaml @@ -0,0 +1,40 @@ +{{- if and .Values.monitor.enabled }} +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-monitor.fullname" . }} + labels: {{- include "cf-monitor.labels" . | nindent 4 }} +rules: + - apiGroups: + - "" + resources: [ "*" ] + verbs: + - get + - list + - watch + - create + - delete + - apiGroups: + - "" + resources: [ "pods" ] + verbs: + - get + - list + - watch + - create + - deletecollection + - apiGroups: + - extensions + resources: [ "*" ] + verbs: + - get + - list + - watch + - apiGroups: + - apps + resources: [ "*" ] + verbs: + - get + - list + - watch + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rolebinding.monitor.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rolebinding.monitor.yaml new file mode 100644 index 000000000..695eeadac --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rolebinding.monitor.yaml @@ -0,0 +1,15 @@ +{{- if and .Values.monitor.enabled }} +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-monitor.fullname" . }} + labels: {{- include "cf-monitor.labels" . | nindent 4 }} +subjects: + - kind: ServiceAccount + name: {{ include "cf-monitor.fullname" . }} + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "cf-monitor.fullname" . }} + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-role-binding.monitor.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-role-binding.monitor.yaml new file mode 100644 index 000000000..53b8cd42a --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-role-binding.monitor.yaml @@ -0,0 +1,14 @@ +{{- if and .Values.monitor.enabled }} +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-monitor.rollbackFullname" . }} + labels: {{- include "cf-monitor.labels" . | nindent 4 }} +subjects: + - kind: ServiceAccount + name: {{ include "cf-monitor.rollbackFullname" .}} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-serviceaccount.monitor.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-serviceaccount.monitor.yaml new file mode 100644 index 000000000..88107b8c3 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/rollback-serviceaccount.monitor.yaml @@ -0,0 +1,11 @@ +{{- if and .Values.monitor.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "cf-monitor.rollbackFullname" . }} + labels: {{- include "cf-monitor.labels" . | nindent 4 }} + {{/* annotations:*/}} + {{/* {{ range $key, $value := .Values.Monitor.ServiceAccount.Annotations }}*/}} + {{/* {{ $key }}: {{ $value }}*/}} + {{/* {{ end }}*/}} + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/service-account.monitor.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/service-account.monitor.yaml new file mode 100644 index 000000000..a610bcfa9 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/service-account.monitor.yaml @@ -0,0 +1,11 @@ +{{- if and .Values.monitor.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "cf-monitor.fullname" . }} + labels: {{- include "cf-monitor.labels" . | nindent 4 }} + {{/* annotations:*/}} + {{/* {{ range $key, $value := .Values.monitor.serviceAccount.annotations }}*/}} + {{/* {{ $key }}: {{ $value }}*/}} + {{/* {{ end }}*/}} + {{- end }} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/monitor/service.monitor.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/service.monitor.yaml new file mode 100644 index 000000000..915e5828c --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/monitor/service.monitor.yaml @@ -0,0 +1,15 @@ +{{- if and .Values.monitor.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "cf-monitor.fullname" . }} + labels: {{- include "cf-monitor.labels" . | nindent 4 }} +spec: + type: ClusterIP + ports: + - name: "http" + port: 80 + protocol: TCP + targetPort: 9020 + selector: {{- include "cf-monitor.selectorLabels" . | nindent 4 }} + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/re/_helpers.tpl b/charts/codefresh/cf-runtime/0.1.401/templates/re/_helpers.tpl new file mode 100644 index 000000000..4e2903fe4 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/re/_helpers.tpl @@ -0,0 +1,31 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "cf-re.name" -}} + {{- printf "%s-%s" (include "cf-runtime.name" .) "re" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "cf-re.fullname" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "re" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-re.labels" -}} +{{ include "cf-runtime.labels" . }} +codefresh.io/application: runtime +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cf-re.selectorLabels" -}} +{{ include "cf-runtime.selectorLabels" . }} +codefresh.io/application: runtime +{{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/re/codefresh-certs-server-secret.re.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/re/codefresh-certs-server-secret.re.yaml new file mode 100644 index 000000000..9d0e36b47 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/re/codefresh-certs-server-secret.re.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +type: Opaque +kind: Secret +metadata: + {{/* has to be a constant */}} + name: codefresh-certs-server + labels: {{- include "cf-re.labels" . | nindent 4 }} +data: + server-cert.pem: {{ .Values.global.keys.serverCert | b64enc }} + server-key.pem: {{ .Values.global.keys.key | b64enc }} + ca.pem: {{ .Values.global.keys.ca | b64enc }} + diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/re/dind-daemon-conf.re.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/re/dind-daemon-conf.re.yaml new file mode 100644 index 000000000..1b7b8b17c --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/re/dind-daemon-conf.re.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + {{/* has to be a constant */}} + name: codefresh-dind-config +data: + daemon.json: | + { + "hosts": [ "unix:///var/run/docker.sock", + "tcp://0.0.0.0:1300"], + "storage-driver": "overlay2", + "tlsverify": true, + "tls": true, + "tlscacert": "/etc/ssl/cf-client/ca.pem", + "tlscert": "/etc/ssl/cf/server-cert.pem", + "tlskey": "/etc/ssl/cf/server-key.pem", + "insecure-registries" : ["192.168.99.100:5000"], + "metrics-addr" : "0.0.0.0:9323", + "experimental" : true + } diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/re/dind-headless-service.re.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/re/dind-headless-service.re.yaml new file mode 100644 index 000000000..8a26a04a5 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/re/dind-headless-service.re.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: dind + {{/* has to be a constant */}} + name: dind +spec: + ports: + - name: "dind-port" + port: 1300 + protocol: TCP + + # This is a headless service, Kubernetes won't assign a VIP for it. + # *.dind.default.svc.cluster.local + clusterIP: None + selector: + app: dind diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/re/role.engine.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/re/role.engine.yaml new file mode 100644 index 000000000..02baa586b --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/re/role.engine.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: codefresh-engine + labels: {{- include "cf-re.labels" . | nindent 4 }} +rules: + - apiGroups: + - "" + resources: + - secrets + verbs: + - get \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/re/rolebinding.engine.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/re/rolebinding.engine.yaml new file mode 100644 index 000000000..0f8728b25 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/re/rolebinding.engine.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: codefresh-engine + labels: {{- include "cf-re.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: codefresh-engine +subjects: + - kind: ServiceAccount + name: codefresh-engine diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/re/service-account.re.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/re/service-account.re.yaml new file mode 100644 index 000000000..ce47ec838 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/re/service-account.re.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + {{- /* has to be a constant */}} + name: codefresh-engine + labels: {{- include "cf-re.labels" . | nindent 4 }} +{{- if .Values.re.serviceAccount }} + annotations: + {{- range $key, $value := .Values.re.serviceAccount.annotations }} + {{ $key }}: {{ $value }} + {{- end}} +{{- end}} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/venona/_helpers.tpl b/charts/codefresh/cf-runtime/0.1.401/templates/venona/_helpers.tpl new file mode 100644 index 000000000..6dfc5420b --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/venona/_helpers.tpl @@ -0,0 +1,35 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "cf-venona.name" -}} + {{- printf "%s-%s" (include "cf-runtime.name" .) "venona" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "cf-venona.fullname" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "venona" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-venona.labels" -}} +{{ include "cf-runtime.labels" . }} +codefresh.io/application: venona +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cf-venona.selectorLabels" -}} +{{ include "cf-runtime.selectorLabels" . }} +codefresh.io/application: venona +{{- end }} + +{{- define "cf-venona.docker-image" -}} +{{- .Values.venona.image }} +{{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/venona/deployment.venona.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/venona/deployment.venona.yaml new file mode 100644 index 000000000..9eaa21358 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/venona/deployment.venona.yaml @@ -0,0 +1,97 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "cf-venona.fullname" . }} + labels: {{- include "cf-venona.labels" . | nindent 4 }} +spec: + selector: + matchLabels: {{- include "cf-venona.selectorLabels" . | nindent 6 }} + replicas: 1 + revisionHistoryLimit: 5 + strategy: + rollingUpdate: + maxSurge: 50% + maxUnavailable: 50% + type: RollingUpdate + template: + metadata: + labels: {{- include "cf-venona.labels" . | nindent 8 }} + spec: + serviceAccountName: {{ include "cf-venona.fullname" . }} + {{- if .Values.nodeSelector }} + nodeSelector: +{{ toYaml .Values.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: +{{ toYaml .Values.tolerations | indent 8 }} + {{- end }} + {{/* {{ if ne .Values.nodeSelector "" }}*/}} + {{/* nodeSelector:*/}} + {{/* {{ .Values.NodeSelector | nodeSelectorParamToYaml | indent 8 | unescape }}*/}} + {{/* {{ end }}*/}} + {{/* tolerations:*/}} + {{/* {{ toYaml .Values.Tolerations | indent 8 | unescape }}*/}} + containers: + - name: venona + env: + {{/* {{- if .Values.EnvVars }}*/}} + {{/* {{- range $key, $value := .Values.EnvVars }}*/}} + {{/* - name: {{ $key }}*/}} + {{/* value: "{{ $value}}"*/}} + {{/* {{- end}}*/}} + {{/* {{- end}}*/}} + {{/* {{- if .Values.AdditionalEnvVars }}*/}} + {{/* {{- range $key, $value := .Values.AdditionalEnvVars }}*/}} + {{/* - name: {{ $key }}*/}} + {{/* value: "{{ $value}}"*/}} + {{/* {{- end}}*/}} + {{/* {{- end}}*/}} + - name: SELF_DEPLOYMENT_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: CODEFRESH_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "cf-venona.fullname" . }} + key: codefresh.token + - name: CODEFRESH_IN_CLUSTER_RUNTIME + value: {{ .Values.global.runtimeName }} + - name: CODEFRESH_HOST + value: {{ .Values.global.codefreshHost }} + - name: AGENT_MODE + value: InCluster + - name: "AGENT_ID" {{/* agent name */}} + value: {{ .Values.global.agentName }} + {{- if ne .Values.dockerRegistry "" }} + - name: DOCKER_REGISTRY + value: {{ .Values.dockerRegistry }} + {{- end }} + {{- if .Values.newRelicLicense }} + - name: NEWRELIC_LICENSE_KEY + value: {{ .Values.newRelicLicense }} + {{- end }} + image: {{ include "cf-venona.docker-image" . }} + ports: + - containerPort: 8080 + protocol: TCP + readinessProbe: + httpGet: + path: /health + port: 8080 + periodSeconds: 5 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + {{/* volumeMounts:*/}} + {{/* - name: runnerconf*/}} + {{/* mountPath: "/etc/secrets"*/}} + {{/* readOnly: true*/}} + imagePullPolicy: Always + {{/* resources: {{ toYaml .Values.Runner.resources | nindent 10 /* todo capital change }}*/}} + securityContext: + runAsUser: 10001 + runAsGroup: 10001 + fsGroup: 10001 + restartPolicy: Always diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/venona/role-binding.venona.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/venona/role-binding.venona.yaml new file mode 100644 index 000000000..c8a3ca90f --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/venona/role-binding.venona.yaml @@ -0,0 +1,12 @@ +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-venona.fullname" . }} + labels: {{- include "cf-venona.labels" . | nindent 4 }} +subjects: + - kind: ServiceAccount + name: {{ include "cf-venona.fullname" . }} +roleRef: + kind: Role + name: {{ include "cf-venona.fullname" . }} + apiGroup: rbac.authorization.k8s.io diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/venona/role.venona.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/venona/role.venona.yaml new file mode 100644 index 000000000..d09da8d47 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/venona/role.venona.yaml @@ -0,0 +1,8 @@ +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-venona.fullname" . }} +rules: + - apiGroups: [ "" ] + resources: [ "pods", "persistentvolumeclaims" ] + verbs: [ "get", "create", "delete" ] diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/venona/secret.venona.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/venona/secret.venona.yaml new file mode 100644 index 000000000..4a7500c87 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/venona/secret.venona.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: {{ include "cf-venona.fullname" . }} + labels: {{- include "cf-venona.labels" . | nindent 4 }} +data: + codefresh.token: {{ .Values.global.agentToken | b64enc }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/venona/service-account.venona.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/venona/service-account.venona.yaml new file mode 100644 index 000000000..8675a9a26 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/venona/service-account.venona.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "cf-venona.fullname" . }} + labels: {{- include "cf-venona.labels" . | nindent 4 }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/_helpers.tpl b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/_helpers.tpl new file mode 100644 index 000000000..b5df41440 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/_helpers.tpl @@ -0,0 +1,85 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "cf-vp.name" -}} + {{- printf "%s-%s" (include "cf-runtime.name" .) "vp" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{- define "cf-vp.fullname" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "vp" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{- define "cf-vp.provisionerName" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "vp-provisioner" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{- define "cf-vp.monitorName" -}} + {{- printf "%s-%s" (include "cf-runtime.fullname" .) "vp-monitor" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{- define "cf-vp.volumeProvisionerName" -}} + codefresh.io/dind-volume-provisioner-{{ include "cf-runtime.fullname" . }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-vp.monitorLabels" -}} +{{ include "cf-runtime.labels" . }} +codefresh.io/application: volume-provisioner-monitor +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cf-vp.monitorSelectorLabels" -}} +{{ include "cf-runtime.selectorLabels" . }} +codefresh.io/application: volume-provisioner-monitor +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-vp.provisionerLabels" -}} +{{ include "cf-runtime.labels" . }} +codefresh.io/application: volume-provisioner +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cf-vp.provisionerSelectorLabels" -}} +{{ include "cf-runtime.selectorLabels" . }} +codefresh.io/application: volume-provisioner +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cf-vp.cleanupLabels" -}} +{{ include "cf-runtime.labels" . }} +codefresh.io/application: cleanup +{{- end }} + + +{{- define "cf-vp.docker-image-volume-utils" -}} +{{- if ne .Values.dockerRegistry ""}} +{{- .Values.dockerRegistry }}/codefresh/dind-volume-utils:1.26.0 +{{- else }}codefresh/dind-volume-utils:1.26.0 +{{- end}} +{{- end }} + +{{- define "cf-vp.docker-image-volume-provisioner" -}} +{{ if ne .Values .dockerRegistry ""}} +{{- .dockerRegistry }}/{{ .Storage.VolumeProvisioner.Image }} +{{- else }} +{{- .Storage.VolumeProvisioner.Image }} +{{- end}} +{{- end }} + +{{- define "cf-vp.docker-image-cleanup-cron" -}} +{{- if ne .Values.dockerRegistry ""}} +{{- .Values.dockerRegistry }}/codefresh/dind-volume-utils:1.26.0 +{{- else }}codefresh/dind-volume-utils:1.26.0 +{{- end}} +{{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role-binding.dind-volume-provisioner.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role-binding.dind-volume-provisioner.vp.yaml new file mode 100644 index 000000000..9f88b3b9b --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role-binding.dind-volume-provisioner.vp.yaml @@ -0,0 +1,13 @@ +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-vp.fullname" . }} + labels: {{- include "cf-vp.provisionerLabels" . | nindent 4 }} +subjects: + - kind: ServiceAccount + name: {{ include "cf-vp.fullname" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ include "cf-vp.fullname" . }} + apiGroup: rbac.authorization.k8s.io diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role.dind-volume-provisioner.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role.dind-volume-provisioner.vp.yaml new file mode 100644 index 000000000..4a1eb1ad2 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cluster-role.dind-volume-provisioner.vp.yaml @@ -0,0 +1,30 @@ +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "cf-vp.fullname" . }} + labels: {{- include "cf-vp.provisionerLabels" . | nindent 4 }} +rules: + - apiGroups: [ "" ] + resources: [ "persistentvolumes" ] + verbs: [ "get", "list", "watch", "create", "delete", "patch" ] + - apiGroups: [ "" ] + resources: [ "persistentvolumeclaims" ] + verbs: [ "get", "list", "watch", "update" ] + - apiGroups: [ "storage.k8s.io" ] + resources: [ "storageclasses" ] + verbs: [ "get", "list", "watch" ] + - apiGroups: [ "" ] + resources: [ "events" ] + verbs: [ "list", "watch", "create", "update", "patch" ] + - apiGroups: [ "" ] + resources: [ "secrets" ] + verbs: [ "get", "list" ] + - apiGroups: [ "" ] + resources: [ "nodes" ] + verbs: [ "get", "list", "watch" ] + - apiGroups: [ "" ] + resources: [ "pods" ] + verbs: [ "get", "list", "watch", "create", "delete", "patch" ] + - apiGroups: [ "" ] + resources: [ "endpoints" ] + verbs: [ "get", "list", "watch", "create", "update", "delete" ] diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cron-job.dind-volume-cleanup.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cron-job.dind-volume-cleanup.vp.yaml new file mode 100644 index 000000000..8d2cd67ca --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/cron-job.dind-volume-cleanup.vp.yaml @@ -0,0 +1,25 @@ +{{- if not (eq .Values.storage.backend "local") }} +apiVersion: batch/v1beta1 +kind: CronJob +metadata: + name: {{ include "cf-vp.fullname" . }} + labels: {{- include "cf-vp.cleanupLabels" . | nindent 4 }} +spec: + schedule: "0,10,20,30,40,50 * * * *" + concurrencyPolicy: Forbid + {{- if eq .Values.storage.backend "local" }} + suspend: true + {{- end }} + jobTemplate: + spec: + template: + spec: + serviceAccountName: {{ include "cf-vp.fullname" . }} + restartPolicy: Never + containers: + - name: dind-volume-cleanup + image: {{ include "cf-vp.docker-image-cleanup-cron" . }} + env: + - name: PROVISIONED_BY + value: {{ include "cf-vp.volumeProvisionerName" . }} + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/daemonset.dind-lv-monitor.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/daemonset.dind-lv-monitor.vp.yaml new file mode 100644 index 000000000..6a6beb7ec --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/daemonset.dind-lv-monitor.vp.yaml @@ -0,0 +1,78 @@ +{{- if eq .Values.storage.backend "local" -}} + {{- $localVolumeParentDir := .Values.storage.local.volumeParentDir }} +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "cf-vp.monitorName" . }} + labels: {{- include "cf-vp.monitorLabels" . | nindent 4 }} +spec: + selector: + matchLabels: {{- include "cf-vp.monitorSelectorLabels" . | nindent 6 }} + template: + metadata: + labels: {{- include "cf-vp.monitorLabels" . | nindent 8 }} + annotations: + prometheus_port: "9100" + prometheus_scrape: "true" + spec: + serviceAccountName: {{ include "cf-vp.fullname" . }} + # Debug: + # hostNetwork: true + # nodeSelector: + # kubernetes.io/role: "node" + {{- if .Values.nodeSelector }} + nodeSelector: +{{ toYaml .Values.nodeSelector | indent 8 }} + {{- end }} + tolerations: + - key: 'codefresh/dind' + operator: 'Exists' + effect: 'NoSchedule' + + {{- if .Values.tolerations }} +{{ toYaml .Values.tolerations | indent 8 }} + {{- end }} + +{{/* {{ toYaml .Values.tolerations | indent 8}}*/}} + containers: + - image: {{ include "cf-vp.docker-image-volume-utils" . }} + name: lv-cleaner +{{/* todo add resources*/}} +{{/* resources: {{ toYaml .Values.storage.localVolumeMonitor | nindent 10 }}*/}} + imagePullPolicy: Always + command: + - /bin/local-volumes-agent + env: + {{/* {{- if .Values.EnvVars }}*/}} + {{/* {{- range $key, $value := .Values.EnvVars }}*/}} + {{/* - name: {{ $key }}*/}} + {{/* value: "{{ $value}}"*/}} + {{/* {{- end}}*/}} + {{/* {{- end}}*/}} + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: VOLUME_PARENT_DIR + value: {{ $localVolumeParentDir }} + # Debug: + # - name: DRY_RUN + # value: "1" + # - name: DEBUG + # value: "1" + # - name: SLEEP_INTERVAL + # value: "3" + # - name: LOG_DF_EVERY + # value: "60" + # - name: KB_USAGE_THRESHOLD + # value: "20" + + volumeMounts: + - mountPath: {{ $localVolumeParentDir }} + readOnly: false + name: dind-volume-dir + volumes: + - name: dind-volume-dir + hostPath: + path: {{ $localVolumeParentDir }} + {{- end -}} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/deployment.dind-volume-provisioner.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/deployment.dind-volume-provisioner.vp.yaml new file mode 100644 index 000000000..ed78a44b6 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/deployment.dind-volume-provisioner.vp.yaml @@ -0,0 +1,122 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "cf-vp.provisionerName" . }} + labels: {{- include "cf-vp.provisionerLabels" . | nindent 4 }} +spec: + selector: + matchLabels: {{- include "cf-vp.provisionerSelectorLabels" . | nindent 6 }} + replicas: 1 + strategy: + type: Recreate + template: + metadata: + labels: {{- include "cf-vp.provisionerLabels" . | nindent 9 }} + spec: + {{/* {{ if .Values.VolumeProvisioner.NodeSelector }}*/}} + {{/* nodeSelector:*/}} + {{/*{{ .Storage.VolumeProvisioner.NodeSelector | nodeSelectorParamToYaml | indent 8 | unescape}}*/}} + {{/* {{ end }}*/}} + serviceAccountName: {{ include "cf-vp.fullname" . }} + {{- if .Values.nodeSelector }} + nodeSelector: +{{ toYaml .Values.nodeSelector | indent 8 }} + {{- end }} + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/master + operator: "Exists" + + {{- if .Values.tolerations }} +{{ toYaml .Values.tolerations | indent 8 }} + {{- end }} + {{/* {{ toYaml .Values.tolerations | indent 8 | unescape}}*/}} + + containers: + - name: dind-volume-provisioner + {{/* resources: {{ toYaml .Values.volumeProvisioner.resources | nindent 10 }}*/}} + image: {{ .Values.volumeProvisioner.image }} + imagePullPolicy: Always + command: + - /usr/local/bin/dind-volume-provisioner + - -v=4 + - --resync-period=50s + env: + {{/* {{- if $.EnvVars }}*/}} + {{/* {{- range $key, $value := $.EnvVars }}*/}} + {{/* - name: {{ $key }}*/}} + {{/* value: "{{ $value}}"*/}} + {{/* {{- end}}*/}} + {{/* {{- end}}*/}} + - name: PROVISIONER_NAME + value: {{ include "cf-vp.volumeProvisionerName" . }} + + {{- if ne .Values.dockerRegistry "" }} + - name: DOCKER_REGISTRY + value: {{ .Values.dockerRegistry }} + {{- end }} + {{- if .Values.volumeProvisioner.createDindVolDirResouces.limits }} + {{- if .Values.volumeProvisioner.createDindVolDirResouces.limits.cpu }} + - name: CREATE_DIND_LIMIT_CPU + value: {{ .Values.volumeProvisioner.createDindVolDirResouces.limits.cpu }} + {{- end }} + {{- if .Values.volumeProvisioner.createDindVolDirResouces.limits.memory }} + - name: CREATE_DIND_LIMIT_MEMORY + value: {{ .Values.volumeProvisioner.createDindVolDirResouces.limits.memory }} + {{- end }} + {{- end }} + {{- if .Values.volumeProvisioner.createDindVolDirResouces.requests }} + {{- if .Values.volumeProvisioner.createDindVolDirResouces.requests.cpu }} + - name: CREATE_DIND_REQUESTS_CPU + value: {{ .Values.volumeProvisioner.createDindVolDirResouces.requests.cpu }} + {{- end }} + {{- if .Values.volumeProvisioner.createDindVolDirResouces.requests.memory }} + - name: CREATE_DIND_REQUESTS_MEMORY + value: {{ .Values.volumeProvisioner.createDindVolDirResouces.requests.memory }} + {{- end }} + {{- end }} + {{- if .Values.storage.ebs.accessKeyId }} + - name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: dind-volume-provisioner + key: aws_access_key_id + {{- end }} + {{- if .Values.storage.ebs.secretAccessKey }} + - name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: dind-volume-provisioner + key: aws_secret_access_key + {{- end }} + {{- if .Values.storage.gce.serviceAccountJson }} + - name: GOOGLE_APPLICATION_CREDENTIALS + value: /etc/dind-volume-provisioner/credentials/google-service-account.json + {{- end }} + {{- if .Values.volumeProvisioner.mountAzureJson }} + - name: AZURE_CREDENTIAL_FILE + value: "/etc/kubernetes/azure.json" + {{- end }} + volumeMounts: + {{- if .Values.volumeProvisioner.mountAzureJson }} + - name: azure-json + readOnly: true + mountPath: "/etc/kubernetes/azure.json" + {{- end }} + {{- if .Values.storage.gce.serviceAccountJson }} + - name: credentials + readOnly: true + mountPath: "/etc/dind-volume-provisioner/credentials" + {{- end }} + volumes: + {{- if .Values.volumeProvisioner.mountAzureJson }} + - name: azure-json + hostPath: + path: /etc/kubernetes/azure.json + type: File + {{- end }} + {{- if .Values.storage.gce.serviceAccountJson }} + - name: credentials + secret: + secretName: dind-volume-provisioner + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/secret.dind-volume-provisioner.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/secret.dind-volume-provisioner.vp.yaml new file mode 100644 index 000000000..e8d922e55 --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/secret.dind-volume-provisioner.vp.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: dind-volume-provisioner + labels: + app: dind-volume-provisioner +data: + {{- if .Values.storage.gce.serviceAccountJson }} + google-service-account.json: {{ .Values.storage.gce.serviceAccountJson | b64enc }} + {{- end }} + {{- if .Values.storage.ebs.accessKeyId }} + aws_access_key_id: {{ .Values.storage.ebs.accessKeyId | b64enc }} + {{- end }} + {{- if .Values.storage.ebs.secretAccessKey }} + aws_secret_access_key: {{ .Values.storage.ebs.secretAccessKey | b64enc }} + {{- end }} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/service-account.dind-volume-provisioner.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/service-account.dind-volume-provisioner.vp.yaml new file mode 100644 index 000000000..034e38d4e --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/service-account.dind-volume-provisioner.vp.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "cf-vp.fullname" . }} + labels: {{- include "cf-vp.provisionerLabels" . | nindent 4 }} + annotations: +{{- if .Values.volumeProvisioner.serviceAccount }} + {{- range $key, $value := .Values.volumeProvisioner.serviceAccount.annotations }} + {{ $key }}: {{ $value }} + {{- end}} +{{- end}} diff --git a/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/storageclass.dind-volume-provisioner.vp.yaml b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/storageclass.dind-volume-provisioner.vp.yaml new file mode 100644 index 000000000..828e264dd --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/templates/volume-provisioner/storageclass.dind-volume-provisioner.vp.yaml @@ -0,0 +1,63 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + {{/* has to be exactly that */}} + name: dind-local-volumes-runner-{{.Values.global.namespace}} + labels: + app: dind-volume-provisioner + {{/* annotations:*/}} + {{/* {{ range $key, $value := .Values.Storage.Annotations }}*/}} + {{/* {{ $key }}: {{ $value }}*/}} + {{/* {{ end }}*/}} +provisioner: {{ include "cf-vp.volumeProvisionerName" . }} +parameters: + {{- if eq .Values.storage.backend "local" }} + + volumeBackend: local + volumeParentDir: {{ .Values.storage.local.volumeParentDir }} + + {{- else if eq .Values.storage.backend "gcedisk" }} + + volumeBackend: {{ .Values.storage.backend }} + # pd-ssd or pd-standard + type: {{ .Values.storage.gce.volumeType | default "pd-ssd" }} + # Valid zone in GCP + zone: {{ .Values.storage.gce.availabilityZone }} + # ext4 or xfs (default to ext4 because xfs is not installed on GKE by default ) + fsType: {{ .Values.storage.fsType | default "ext4" }} + + {{- else if or (eq .Values.storage.backend "ebs") (eq .Values.storage.backend "ebs-csi")}} + # ebs or ebs-csi + volumeBackend: {{ .Values.storage.backend }} + # gp2 or io1 + VolumeType: {{ .Values.storage.ebs.volumeType | default "gp2" }} + # Valid zone in aws (us-east-1c, ...) + AvailabilityZone: {{ .Values.storage.ebs.availabilityZone }} + # ext4 or xfs (default to ext4 ) + fsType: {{ .Values.storage.fsType | default "ext4" }} + + # "true" or "false" (default - "false") + encrypted: "{{ .Values.storage.ebs.encrypted | default "false" }}" + {{ if .Values.storage.ebs.kmsKeyId }} + kmsKeyId: {{ .Values.storage.ebs.kmsKeyId }} + {{- end }} + + {{- else if or (eq .Values.storage.backend "azuredisk") (eq .Values.storage.backend "azuredisk-csi")}} + volumeBackend: {{ .Values.storage.backend }} + kind: managed + skuName: {{ .Values.storage.azure.skuName | default "Premium_LRS" }} + fsType: {{ .Values.storage.fsType | default "ext4" }} + cachingMode: {{ .Values.storage.azure.cachingMode | default "None" }} + + {{- if .Values.storage.azure.location }} + location: {{ .Values.storage.azure.location }} + {{- end }} + {{/* azure location */}} + + {{- if .Values.storage.azure.resourceGroup }} + resourceGroup: {{ .Values.storage.azure.resourceGroup }} + {{- end }} + {{/* azure resource group*/}} + + {{- end }} + {{/* if azuredisk*/}} \ No newline at end of file diff --git a/charts/codefresh/cf-runtime/0.1.401/values.yaml b/charts/codefresh/cf-runtime/0.1.401/values.yaml new file mode 100644 index 000000000..87dc3134b --- /dev/null +++ b/charts/codefresh/cf-runtime/0.1.401/values.yaml @@ -0,0 +1,108 @@ +appProxy: + enabled: false + image: "quay.io/codefresh/cf-app-proxy:latest" + env: { } + ingress: + pathPrefix: "" + class: "" + host: "" + tlsSecret: "" + annotations: { } + +newRelicLicense: "" +dockerRegistry: "" + +monitor: + image: "quay.io/codefresh/agent:stable" + clusterId: "" + enabled: false + helm3: false + token: "" + env: { } + +re: { } + # Optionally add an AWS IAM role to your pipelines + # More info: https://codefresh.io/docs/docs/administration/codefresh-runner/#injecting-aws-arn-roles-into-the-cluster + # serviceAccount: + # annotations: # will be set on codefresh-engine service account + # foo: bar + # eks.amazonaws.com/role-arn: "arn:aws:iam:::role/" + +venona: + image: "quay.io/codefresh/venona:1.6.7" + +volumeProvisioner: + resources: + image: "quay.io/codefresh/dind-volume-provisioner:1.31.1" + mountAzureJson: "" + # serviceAccount: + # annotations: # will be set on VolumeProvisioner service account + # foo: bar + # eks.amazonaws.com/role-arn: "arn:aws:iam:::role/" + createDindVolDirResouces: + requests: + cpu: + memory: + limits: + cpu: + memory: +#todo add envvars + +storage: + backend: local # local/ebs/gce/azure + + local: + volumeParentDir: /var/lib/codefresh/dind-volumes + + gce: + volumeType: "" + availabilityZone: "" + serviceAccountJson: "" + + ebs: + volumeType: "" # gp2/gp3/io1 + availabilityZone: "" # us-east-1c + encrypted: "" # true/false + kmsKeyId: "" + accessKeyId: "" + secretAccessKey: "" + + azure: + resourceGroup: "" + location: "" + cachingMode: "" + skuName: "" + + fsType: "ext4" + + # resources: + # limits: + # cpu: 400m + # memory: 1200Mi + # requests: + # cpu: 200m + # memory: 500Mi + +###NodeSelector --kube-node-selector: controls runner(vp-venona), dind-volume-provisioner(vp-provisioner), vp-monitor pods +#nodeSelector: {"kubernetes.io/arch": "amd64", "failure-domain.beta.kubernetes.io/zone": "us-east-1c"} + +### Tolerations --tolerations: controls runner(vp-venona), dind-volume-provisioner(vp-provisioner), vp-monitor pods +# tolerations: +# - key: +# operator: Equal +# value: +# effect: NoSchedule + +global: + namespace: "" + codefreshHost: "" + agentToken: "" + agentId: "" + agentName: "" + accountId: "" + runtimeName: "" + keys: + key: "" + csr: "" + ca: "" + serverCert: "" diff --git a/index.yaml b/index.yaml index 2b892cb15..6995eedf1 100755 --- a/index.yaml +++ b/index.yaml @@ -315,6 +315,23 @@ entries: urls: - assets/softiron/ceph-csi-rbd-1.3.1.tgz version: 1.3.1 + cf-runtime: + - annotations: + catalog.cattle.io/certified: partner + catalog.cattle.io/display-name: Codefresh + catalog.cattle.io/release-name: cf-runner + apiVersion: v2 + appVersion: 1.16.0 + created: "2021-12-20T11:22:45.441119-05:00" + description: Codefresh Runner + digest: 84a4c997ca28ace33b1e140c07b1b210d1dba5e321353ab63b33a918aa947b11 + icon: https://partner-charts.rancher.io/assets/logos/codefresh.jpg + kubeVersion: 1.18 - 1.21 + name: cf-runtime + type: application + urls: + - assets/codefresh/cf-runtime-0.1.401.tgz + version: 0.1.401 citrix-adc-istio-ingress-gateway: - annotations: catalog.cattle.io/certified: partner diff --git a/packages/codefresh/generated-changes/patch/Chart.yaml.patch b/packages/codefresh/generated-changes/patch/Chart.yaml.patch new file mode 100644 index 000000000..0476e31d9 --- /dev/null +++ b/packages/codefresh/generated-changes/patch/Chart.yaml.patch @@ -0,0 +1,21 @@ +--- charts-original/Chart.yaml ++++ charts/Chart.yaml +@@ -1,6 +1,11 @@ + apiVersion: v2 ++kubeVersion: 1.18 - 1.21 + name: cf-runtime +-description: A Helm chart for Kubernetes ++description: Codefresh Runner ++annotations: ++ catalog.cattle.io/certified: partner # Enables the "partner" badge in the UI for easier identification ++ catalog.cattle.io/release-name: cf-runner # Your chart's name in kebab-case, this is used for deployment ++ catalog.cattle.io/display-name: Codefresh # The chart's name you want displayed in the UI + + # A chart can be either an 'application' or a 'library' chart. + # +@@ -22,3 +27,5 @@ + # follow Semantic Versioning. They should reflect the version the application is using. + # It is recommended to use it with quotes. + appVersion: "1.16.0" ++ ++icon: https://partner-charts.rancher.io/assets/logos/codefresh.jpg diff --git a/packages/codefresh/generated-changes/patch/README.md.patch b/packages/codefresh/generated-changes/patch/README.md.patch new file mode 100644 index 000000000..02a585a6b --- /dev/null +++ b/packages/codefresh/generated-changes/patch/README.md.patch @@ -0,0 +1,42 @@ +--- charts-original/README.md ++++ charts/README.md +@@ -2,7 +2,8 @@ + To install the [Codefresh Runner](https://codefresh.io/docs/docs/administration/codefresh-runner/) using helm you need to follow these steps: + + 1. Download the Codefresh CLI and authenticate it with your Codefresh account. Click [here](https://codefresh-io.github.io/cli/getting-started/) for more detailed instructions. +-2. Run the following command to create all of the necessary enitites in Codefresh: ++2. Install [yq](https://github.com/mikefarah/yq) ++3. Run the following command on your local machine to create all of the necessary enitites in Codefresh: + + ``` + codefresh runner init --generate-helm-values-file +@@ -10,14 +11,18 @@ + + * This will not install anything on your cluster, except for running cluster acceptance tests, which may be skipped using the `--skip-cluster-test` option). + * This command will also generate a `generated_values.yaml` file in your current directory, which you will need to provide to the `helm install` command later. +-3. Now run the following to complete the installation: +- +- ``` +- helm repo add cf-runtime https://h.cfcr.io/codefresh-inc/runtime +- +- helm install cf-runtime cf-runtime/cf-runtime -f ./generated_values.yaml --create-namespace --namespace codefresh +- ``` +-4. At this point you should have a working Codefresh Runner. You can verify the installation by running: +- ``` +- codefresh runner execute-test-pipeline --runtime-name +- ``` ++4. Download the default `values.yaml` file in the same path as the `generated_values.yaml` file. ++ ``` ++ curl -L https://raw.githubusercontent.com/codefresh-io/venona/release-1.0/charts/cf-runtime/values.yaml > values.yaml ++ ``` ++5. Convert `generated_values.yaml` to yaml. ++ ``` ++ yq eval -P generated_values.yaml > generated_values_converted.yaml ++ ``` ++6. [Merge](https://mikefarah.gitbook.io/yq/operators/reduce#merge-all-yaml-files-together) the two files together using `yq` ++ > **Note:** The order of the files being merged together is important. Please make sure the generated values file is in second place. ++ ``` ++ yq eval-all '. as $item ireduce ({}; . * $item)' values.yaml generated_values_converted.yaml > merged-values.yaml ++ ``` ++7. Select a namespace to install to. If it's a new namespace it will need to be created before using the wizard (e.g. a `codefresh` namespace). Click next. ++8. On the following screen: Select all text and replace with the newly created `merged-values.yaml` file and click on **Install**. diff --git a/packages/codefresh/package.yaml b/packages/codefresh/package.yaml new file mode 100644 index 000000000..7624227ab --- /dev/null +++ b/packages/codefresh/package.yaml @@ -0,0 +1,4 @@ +url: https://github.com/codefresh-io/venona.git +subdirectory: charts/cf-runtime +commit: 6f3e712ffc6ff56c3c283e02a07c188f4e41d2fe +packageVersion: 1