From f2aacf15e80709a26338302fa4e4a55bd7db3f34 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Thu, 8 Jun 2023 01:42:00 +0300 Subject: [PATCH] NAS-122281 / 23.10 / Add mineOS to community apps (#1235) --- library/ix-dev/community/mineos/Chart.lock | 6 + library/ix-dev/community/mineos/Chart.yaml | 24 ++ library/ix-dev/community/mineos/README.md | 3 + library/ix-dev/community/mineos/app-readme.md | 3 + .../community/mineos/charts/common-1.0.8.tgz | Bin 0 -> 55441 bytes .../community/mineos/ci/basic-values.yaml | 12 + .../community/mineos/ci/https-values.yaml | 100 ++++++++ .../community/mineos/disable_upgrade_strategy | 31 +++ library/ix-dev/community/mineos/item.yaml | 7 + library/ix-dev/community/mineos/metadata.yaml | 18 ++ .../ix-dev/community/mineos/questions.yaml | 231 ++++++++++++++++++ .../community/mineos/templates/NOTES.txt | 1 + .../community/mineos/templates/_mineos.tpl | 134 ++++++++++ .../community/mineos/templates/_portal.tpl | 12 + .../mineos/templates/_validation.tpl | 17 ++ .../community/mineos/templates/common.yaml | 10 + .../ix-dev/community/mineos/upgrade_info.json | 1 + library/ix-dev/community/mineos/values.yaml | 28 +++ 18 files changed, 638 insertions(+) create mode 100644 library/ix-dev/community/mineos/Chart.lock create mode 100644 library/ix-dev/community/mineos/Chart.yaml create mode 100644 library/ix-dev/community/mineos/README.md create mode 100644 library/ix-dev/community/mineos/app-readme.md create mode 100644 library/ix-dev/community/mineos/charts/common-1.0.8.tgz create mode 100644 library/ix-dev/community/mineos/ci/basic-values.yaml create mode 100644 library/ix-dev/community/mineos/ci/https-values.yaml create mode 100755 library/ix-dev/community/mineos/disable_upgrade_strategy create mode 100644 library/ix-dev/community/mineos/item.yaml create mode 100644 library/ix-dev/community/mineos/metadata.yaml create mode 100644 library/ix-dev/community/mineos/questions.yaml create mode 100644 library/ix-dev/community/mineos/templates/NOTES.txt create mode 100644 library/ix-dev/community/mineos/templates/_mineos.tpl create mode 100644 library/ix-dev/community/mineos/templates/_portal.tpl create mode 100644 library/ix-dev/community/mineos/templates/_validation.tpl create mode 100644 library/ix-dev/community/mineos/templates/common.yaml create mode 100644 library/ix-dev/community/mineos/upgrade_info.json create mode 100644 library/ix-dev/community/mineos/values.yaml diff --git a/library/ix-dev/community/mineos/Chart.lock b/library/ix-dev/community/mineos/Chart.lock new file mode 100644 index 0000000000..0134b1624b --- /dev/null +++ b/library/ix-dev/community/mineos/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.8 +digest: sha256:254efaa1285f634b7a80b7baadeadbd20a680f7fee49d1d9d3c4618aa0d657ad +generated: "2023-06-02T19:17:47.930613813+03:00" diff --git a/library/ix-dev/community/mineos/Chart.yaml b/library/ix-dev/community/mineos/Chart.yaml new file mode 100644 index 0000000000..06689908b1 --- /dev/null +++ b/library/ix-dev/community/mineos/Chart.yaml @@ -0,0 +1,24 @@ +name: mineos +description: MineOS is a server front-end to ease managing Minecraft administrative tasks. +annotations: + title: MineOS +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 'latest' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.8 +home: https://github.com/hexparrot/mineos-node +icon: https://camo.githubusercontent.com/bfcc53b6de495c0f2d9d5699afea18b7319529933c5cd38f1e0cf55377df725f/68747470733a2f2f7669676e65747465322e77696b69612e6e6f636f6f6b69652e6e65742f6c6f74722d6d696e6563726166742d6d6f642d6578696c65732f696d616765732f662f66322f4d696e6563726166745f7365727665725f73657475702e706e672f7265766973696f6e2f6c61746573743f63623d3230313630393131313732353537 +sources: + - https://hub.docker.com/r/hexparrot/mineos/ + - https://github.com/hexparrot/mineos-node +keywords: + - minecraft diff --git a/library/ix-dev/community/mineos/README.md b/library/ix-dev/community/mineos/README.md new file mode 100644 index 0000000000..b1eb4a2a9a --- /dev/null +++ b/library/ix-dev/community/mineos/README.md @@ -0,0 +1,3 @@ +# MineOS + +[MineOS](https://github.com/hexparrot/mineos-node) is a server front-end to ease managing Minecraft administrative tasks. diff --git a/library/ix-dev/community/mineos/app-readme.md b/library/ix-dev/community/mineos/app-readme.md new file mode 100644 index 0000000000..b1eb4a2a9a --- /dev/null +++ b/library/ix-dev/community/mineos/app-readme.md @@ -0,0 +1,3 @@ +# MineOS + +[MineOS](https://github.com/hexparrot/mineos-node) is a server front-end to ease managing Minecraft administrative tasks. diff --git a/library/ix-dev/community/mineos/charts/common-1.0.8.tgz b/library/ix-dev/community/mineos/charts/common-1.0.8.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2403a23d05ad17d49bc28f3e0e46047d0fbdf471 GIT binary patch literal 55441 zcmYhCQ*EOj?0c-iL?7lueV_T#dsW?n-}n*w&#+&tKHs8akJQyH|556=I&^97oB(QMV)GdBrl3Kg3+IpM4)tV z^NqxbhL6pt$!l|$d#z2OOoI_5s!^njnR1s!(cOePW&MJcaM;TLJbU^0`V|WP?bN&5 z2D~DE`~a*AaIXpN2=Q(R?EvKfUN?K*K&CDCB%B4;F^*J`W(aoTJ~f^&Xar@HnnZLFhz*!j>ioLi zU}0(1!9b#r|qJHTWbSH{W_ta--QIV>w)R~07yPQV|p@^9lwXi$MMPXZI`8W zoRK5AkvP(!Te#sj*jN8H(4ZNHp&S-P!(^De)VTa0;`gubkqF`gkdZq~g!+O)(A=Rk zwj6eHt<#ix#nu!qkTDg`VN%{%7)sJ;B@o1x)#6hf{&Cug`~o%@dzKRn%5!qO^2cY` znLeZb;|uC~r9L@tzi?s2k*EY`RtTDzd7+rrJDlWbVW=P+C6y4@H+Ya-;~0}qh~e93 zuyBg#d-UI%nMP`9CTQ(9l|efG+-Wz^D5I$e1_`WbiP8k=M)xu}#r&&1m-kG#A*kPG zB+a9}ztcsj&-70TG>x0IqNi1QBLp#<5EA!MSUy?PQV7&iw)2BXjPdaaCVCfS2nteh zBHO6<-u5tyPH-nwM7cQYj0JtKL;D0Vn2|c5x4XZ5rD?~{n8n($v){Faw*)S)mj@qS zIHmR}1|Of}C@=zwYx0uDzSI#G-ZoE^6#Mq)ci-yUn3R|T1wci5XLGMl=V85H48LPo zRj2eoJp0aKvE%kA(3qe-caLJ5P~{_}Au>#qbg!ic{I+=W!@8M!F;o*|T^5 zlEx3;#DGpID^lsuBqiM8&}(9prJ_5}-Mox`p5Vm4O}%}vO`R-^!cN2&cWU+ze#>dz zFFVZ^@C$u8d-?{F!rlC4sT`o9oWE#Jf=~ggH+3iFzJbrxKRE`8msT_)^%ZNpxVMPl z1}G2l#yjmX<{YY|RC}d(0OOi+W0$KE@*d>mH$eshIL zwR4uE5;atGg*(i0&@B)Ot(%)uoFx1+Y2o4Q1+BQ)+}U3knVOq&2MZ$zfJ*yhA{aGp z`oPD&>f0u~@Kg!;!a))BILc3Q9w=uGo!!NC;?{Hza|2n#2xA7-flC zFv!@ij(@o@;+c{OD1FC^#*i_OjcGe0FpsEU{KC&Fithz$MSghtSp+(;H$E_$1 zxm6m3{tb1xQ&*PccVpf2!tQm`Lz~5!)rk|PeUCrqS|Es-;e*}90ANIF13-gU&Z4Iw zkX1$ul}d5MDtRL|K~cz$4JO4~;8M~5?dI-pz7BYPmm2l6`^AA_FB9frENQp9tne?;G6N-iE68g*w!Raj=EUv-kf-a7G(Rg$V`$oGW^Dnr3*I zWP5TjgRaFmON-n-zoiCM8j^Txehz!if2od^2%sud41r&J>pYOeP$$W z;mimiO_>F(HGU1!by@kMT^wVgr5NwowAN{uAx$lHskoW&=L-N>)h=f9g>?Q*x3RUp zwMyjJrwIXCwKlg6Z0@7rAcbLWYuJr?36L^D!;=(QO>mDS1x-L`YkA59%9$5wViPQ@ z*0&E^@e)~Pe-Awo^6BrI4bm%EYpk?4il;Bjv!&*J-M_zR4Lk9urg)6Gph5xyzdowV zo#IkbHiC!;`zh$ADwy&AP7t)9PYCtU@G*}Ihv6zgce{xCq0VquvP}3P1M$U6tih4{ z_-=tgc`y(;s54-<-@TxOMI|&KAaGI;5I1WlFCZtm+rovyJC32Bc;&Q;5y6_#(+IiJ z=u}d$PWD+Svs5|}XmEzR6f~1k+>p%CL4r&&U^}qQI|UG$SI**&Dd@l3)77N=6=6c4 z(Ql1$#sb~9?#Jsl|d1@Ni|blF`1J0m;oz5tksl|XE(MG{KXKmG3J_z+qCoO`)O1#9?81^Xqq z8$U}15hP(gbMzZDJRt`!WF}UqqDaEEn5E!#kSPMg&q#vJFoFvGiD6RD=^wrnvx=eu zFkf@Uc;STS)Cz>6RzYFlNCiRek81R~&@5qAicKQ+@E~w+1*JWuw;_ZC7NrI|;qVnMcnmH{T;V!ZzW|pSBkM5dWtjw#G zv>>2yRR<;9o~ma&oNDQf@H57#s|5ijqFh;J%nku1(Gu--Ka%(od4b(Hz=j<%N;Tq5 zl)nsBtgg$QtcFY?zK&)EaS@goqIF?vpOH!MTtk`li-+8-yPt3zYPT>rI?@%+varSC zm&l=Fpe8_`xVPgD{22F|8Y7z`i3$THggj*t2!#sj6Q>OK{GB7`9?a4A`f-tQ?DSge6(gf+ zg(bGnJAY|KDfD?8%1{6H@9(^O@Y2o$;-JnDM?@{Or;q3-^FXmW9BRx!c)msmq9D{M zfJ7UT8FeKO+8YBwGVOn{nf8nxdJy)3oOOL*lJC%i}r3DY-Kt%B z_F*I61Kuf!VWHTmkASiCW5sDycu5)}uLl(;@i7nQ;>pG9mpuHiNOHW~AY-mu{{-bY znhlxu8v|#sSGjAs$r2L3@}{mA!y?)Vx>n(~O%M79{7p!!9oDJy>8`aOMzcp)>%}k4 zi%@qJ)803@J>`U}gZ7M)b}Z`)_e}Y%Tbh0^lNYg*e3@tO@*=n)X_YFfEhONCGpPmF zaD>av-6ey_^X9oBd3mQXDtpNZ^EudF##WJ?w5%Q015euqvk*WNH~J8aV4&}9FCX#< zA967=a^Skpt?Nm@M0pM%u0NA$A_l@Gj;s!eB`y8OQ4=xjHyG5ywR^8#ybl9%2#bkd zSS_J9SII$K%fP{JH*i8RaKGV**e?U?w6q|4h@m6x5Xyb8G2eqWD(750c{ny4$jcuc znxKZJ>t&#dC7vT+0`7@k zFGz{6ch~Zfg{Bt39p(>AE@z#xNun=%_QtgWmma#GHu&WC?{AjGqu<0M%(H&PvPLVA z2*7)rTi_<&nn3F{fQaxpapf7P!EgGY9*X$N@zbYGL(rpRc#76@IS$2FQV7x*9pdPG zm!?FCBph^&0T5-Nj>Qj}Ne;1w+|$dFu72(N$?4=tcfwzD%nFOTq{=lgnu z!*Vkb=RA{n8;2Z@JT%OHk-pzO)%4`>N~WVhAb@}TOfC%(b!~xu46QV+FQON`^|Og` zM9Uyt4144b-jI*x<175*0r;=%j%XqhO1A}P6O##Jon=r*glMo;{p>%|%-(mAdel|S z7WKZiHN66@xHaEgDwjvBeKd7LlkbFYRjm^FWpI@#AvD@GFFe%QiO4~`PMT zm+||9>lzpd9qIS{-Mea30IWYk?ev#S0g`ITt$z)7>5T8p#>VWL0x>60d!J=sQF7x} z(+TZ6iK_(}EVxz}PSdxv4A?Xj9?Yy~c;Q7?P-l0p>PZl#x?N|nyNzyMF9?CiZHFiK z5T>n9F3H8ek@hEs52WEQX@Bb3&@gGqzBTJ(-0PQ`x@bc^RawExSw}OLQs}D4wX<(m z{>>hFRbBg~h6Z__{(JG9JS9<@YC1Z9*c9n@A}ik4z3dlxaedCVz-Ilxk=WmlRstD? zCA^s>SM$w8C;T6+kCMp&-EX<#P*`p*DIbGeEpydoPsb1GSv|f4f9nsI9a-(_9}dhr z7#2(cd;Z3C^X38z$(NhZT1I-Ry#?j6z*x9~Kf@Y*R9`oz&buqXgqIJyFDFdo)dyMV zF^h_z1xtCq~C-Qe)N+NwZC z4v%BH^R|-wokZJr%w^Sj*$vye39SyS4qL>fyWB49w_aJG-pcx}k?twLZ?yH>>rZdn z3Q+UjnbJwd3IOPG>wUHgG&<{YIm_d;A3O!EEt{=$^Ojzk7GlY5 z*IopqjG9FZeP)`mV0%zfFi8j$VV*wM?Km>0pGx?Sg8K$35=%@?>ebT*DBnGvE(tKX zbExCD0PgS(d$ZM-huH$q)%7MllraW?lXM&yN)!MgUr#l)h4avpsY!AP1jG0~t(@h+ z4c(0yBbg`$k#c%LDIt+RWHqq+Ep}9HnU2^)JZ@;vEz#Us>B`b%$j!5_1a>1 zeR14lcs=4u&6460VH{%-)G^`F2HH39VLNzFXP)TEFeWebN8E6!&LjE~ZS%{m(kERh z{hQiN{f7j&{TvYKJ+kxpEAe}$Ul*u1Jg6an8|?s#SD3|Vqy?R()}{&1Fxfm0KDj`) zLO?&F7Q(ap1sc5cqS=v4wx5!hY|h;&_cMjrJ8vKn9YfpaW=_hiX)h09fOXK$Sn_?@ zSP-oL=?KmOwm2#_ft{0V^P)W<7prEfgRL1Y`4-P&AnxTxf4y;uQzLHV#xOIQp1;Y6xAP@K$qwjc@2Fvp-9yfUReresvagFwl zcy{U~B{aq?U3O{if;PRh4qYooUqm-17@Iq}UMwpsp*L&3#ztpV%K7wJwjQf#JN-e` z=!}|vJST#T)5-PHVcg|;&}StTUGBN@9Axyhz{_a({2mu2c)i7hP_VoX*`&K7gfYYY&;EbFGYCz%jAqg~4CL?M zXbg-0+NltpnKqHQ(_L5Q5FPcTR5Y7*y#FY5!xRn-bz0my9<$caKiU^P(f&rA443<5 zls)H5tjrp~Dl@+h6TbS=0lXo)-h2~EKt@{m0Ll_I^fs|TDW%fRa=eX?I~M5V=ou3-Rz_VBi$j34l}J;U^l1tgK_?sjR=AbnmQBED^N23-{q zA!xN>-^!svCLSO*1HzNzdaZ!xbHy?-YjaKAw$>Xf>OvIVjDu}e6&GXRQD(o>ExC)p zQ7~w&`;l@CxXEFK!oC%VWP-eq?_WTu4~()+SRf#CtU~u{M-zRV4KGm^h$@AnVO3FN zP3S6@D_c)|8RMWZmyTNgT1XwYeywoE+kOj)ZyA3;Q4K;S2IId1zvp|ZflsU71@t~~ z_ESt_h!eCzey@ptxF1`1Sl?Jx%KeH@wd(xL4q)*uINEM%FXeiHR1%Om26L`QZwsK@8<2w zF-@8uCEA2y$T4cZxz&%;+m5R|i0X*=qo%`^=|SS{A83bP$1<*ud{PU(Vmtf-zQIz)v1JW!ij0C~T8Cl2*)32YS=1MwfA#xe zJ6PJ!f@-rSepG96UncnLq@~q=*;umkRGPDg)Gj^xT87~co(I*Mz{ly#^C)96xM=2H z`Rs5%1Qc6F4`U0%zSzIPm7})Y7yK1#ih@|9_%~GIyWhRL+W%V}dCa0M45%x9j=Zik8ih9Ww9`+bZJU$syN$q)2`RMhyLBzvca6BT(tla!D4pqX zfci&dkC&9o6b?&ukA&RJ7%8+-y{Q{UEl9AG1&JlziDxKw zpb6<8p~l54jO&!TFU8(R2xsrvwyc7gl^@vb6eZ^#Hcx4&M2yAk+iTzvp;{U!O2Te4 z&Q}_tf$pb}k~K%*&2TI3@v1UGicy3rwDZ%?>nOGfmuLk=!t^=nVr~_U`A^EwcahTHJS`G^zi5jZ+<3b6ld0*FM8!F zffyd5uAuKy1OiYuME?G>t=NjXt^0po`QkYZvDe~`>_G)lH+QLLJwingBK;?#s@rk1 zQ|zdIL!GL{uwg(F`YDG?&+47DoRDGQPeS`3c7sK4T!tkRrb?yl(2pJ~7`FNOmsuMy zDAJ#t7G>3*8#h|IzMen`dF2)XN2XrkA`1V0^`?cLV1j0U3O#$iTzvtpy{>=_DN^>g z8w|i{Re!8ZkTNz3Zd;p!`Tn+sUG*Zi>Wgq{Ji-Kh=qS!klgBl$`AU0eDwRCi$ef8- zJ!i8lD2`ITJYH%#5~4{nWtg3KllQ^lvPJ)YVWWkp*pBT9)khv1z)eYZWFVg$Jeu6U5_+}uT96D464KDKtbi5CRk|s3mjKZG|WY~ry z6V>)@qoAP@T-RDl-wvIPVSj`?{>y_0gXj;sKPXGP2<{6*J_RZFMyBEjc4|Ke0IXke zuMrJK8gaTP=SYM6eZ%+Xq2PN4`KE1& zm=E~c_<;QM>!H0jpxLiH&=IOQx}!T)O-YDLh{8Nzmit~Xw#>7=N2;du9c2ksS&HEo1hoaD70 z1cEqZ-EwEuvSxQotrLje5%UFT1MFP`{UR^^VNa!;Qh7K&6SHPR6|*psUeTqzQdRD8 zTHIM}8)2AbUDrQ`VyhU%l(R>I+7o2dSV1%poGr0(0Us2V3T9QIE%DK!v0P;^YMWU! z>bq;J`GprJhQva^6PK6~W`l^Q`tYwCkCm{VUH()s}S5y1C-a(8{b0rdJ8w`t7& z;gbCe(b2R$)z0%D)YJ9SKeam(WvxltR{F0D9XqH8a6~>z}9^!pft8 zO*hOsr|(itpSx{WLZgwR7oY#qIl?y+v|qGdP}r-%C76U!Mi=U99n!f?_fa8^|MJ83 ztfifHJMvh<#raNu!g#UY>ytHCQoVK9)G@S5)qnD`(1N#}#WshiTa&xz!i1Lv#(&ji^d7zq4}gwImLIAj+vxFY)$v z4yq+Wj{HN1x4h9#ZTqgi9r=oJ+${u6Tp_fK!V-eU8AknB{DtHCA_CEBnif<$P5TN~H}9}>7POu4 zNUy$LI8na`kF&>6P8cjZTB@UPT0Wo~m2zfw1`Eo{ZXD|lQ4Vv9?+tz}v+s@dowEl4 zu}PA|c;STb>6$XX$W7RvfPS)zUT%sWAZtQaSDoi=c7%;YC1R}g{87D{7%j(gl`^6Z zLjO1F-N)3ZpIi%Qsqn8ZsyW(0U8LM@Qp_CQvvK4Ck;BX-zJMW0<6H6&Ea-&}v0CLkmCz;*=(nv6{e zFIT#Ca46`2(*uI&i1nNR8#gBBM30o|@=#$iTM^f1hMAC0G;3JiwXXw~XHM%K^P)hj#?yce05THtv%|;DJn#3R zEs+$^>Q^^AISBZ3Hx8J%QHDK2#nOd4r06OU`?$!#Q3L7iDqmT`40?=9Ykh`0XqQ>Q zT(b2aDZSET7Vbn)S#w=(z43<%kLl#VKgpXSJBiP%4GB(P?`N1rzt;K4pc8F+`Rx(# z0q8ncNm}ug^naI$*Z;h!ceS(ADM~1eKX9HSMzrZr?e0&wZ&fbL7T?@9l)dZNVDn^DY;!uZ>JoJ3taij^+FtX|)tdIaNA3#>On zU=88tNE*3QqFktpom%(|OGb5w24Z-b-|e8BU}bvv^bFu(qB<)evWJ%O2#C#X!~m+D z3LNdfOD6x<_tYN$qrC~AKvSC@V%Kwjru*L0$u9z^;vp}Lu}ITV0b8?Shax8`F+`(z z)rp5&Ru`I=W`1jM?o25+%c19bXI@%K5l8MAq!|$l5t7jGf7dGwMD#O4p66ZGJsc}L z=QamG@K0C?C2Th^n?2xY=SRZVi8o;SU#Q0U1X^*fO+J9BxSe#aflkaYc)*_uK$NS6 zkSFcolt55pSa?zhk)!0#;K1j~=ZHz)nf@j``TlvsBjW$Z+gArt5(i7KcF1)Qw=A_CBPwo^OUMPCb(*ST z5ft=ebt!P;N#3=Q+9@CS{D^2~T`nX5xcj_+TZEt27;dp$>qP%$lMw;%3%vU*$NpEU z_`GjEuq|8niAVLdMFx?90XSvQ%C7qKqtxwH?r`HJ=t64$EAsFAgmtWPdM8l|B0wnB z^l0|&Qp`8V=-VB*{&S-?2`v1BHL&-aa?=0xVx%eIpYTnX@!A?ZhY)G&B3<3y?|%mm zl(8cEa6-ZE>;+L~ce(=ozD-=14Ph`-<51ooAahjz$zLxQ0bfw!5Ye~VuGe=6I3z-J z7I(SP;H&{qCB{kgDEfu0Rz%}d(G>W;gV`f2|Et-$NdX__N}=@SHa|0l&ouGSlV z-b8ZM8_AVnUHWR}?lzJKUHdCs$j}1q{-Upr=k(UH=EA6r7YuXXQ+sD$3V9<$N)J2d zEy64r1J`#q-41#Qh-|2mx@H`)L%&(IQgG_zOEJ`UaD zFV+IBz-N?#EZasXr5H`K#?7*Psi3`^-xJ73Cx?ri6bT>Lx97I!$xQVqvE(Y$`7;(y z8?;GP=<0}Z7aBKWRb|%!Bk0y)Pe+N6QO-ZXVL5R8V_nT4Yrd%kA1o zbRn9#1KxU{KSoDeKifKYjV1xr-Ux5?IG4vT0g!)gME4ebo9s>gO$%Fk97=FI3MmkU zlTvaGm9tdLn$|GdktX3z(c!>R;%F3(h1ym6QDG;OSGdq@nv75FV*wNDO$HaQqwBx5 zUDngzen4Y$3qT36GBbKo2Pma5J^=K#fExEA>ytlzRS`c(g368N1^W;*kMxxkCdAZgVo(PJi!N{^0x6{D86BQVJ+ zRg&j-VEGCaPnw6$SwVf;He39Cp|PMOtL{xZQEtV9h;kp&9vpX^h4|@{w-bDxs$P;# zI%H%hW=btGY8^sz-Pk z%`yzl+NJi-hI&3pJflGqHq+8#@Z3W3v<(+*gmFkoIAh}1PMf;Coz#jgM2y=N*UjBg zZ8!-8(;Kf$8=GNa8`R`auK3qEN)({`49nLQIY=;|%tBP=ZZe*<&D-2C)MuaV*z{}( z>a5;&Nwkcsu!Oh@nS>q}1pTPXZ_&fxwQ^qTaFHwk%=@1csxF5nDw8OaU5vmz4ab%w zIe( zLD#SldM_-6r6kK{sBOz4eqtjFjFSZf7eV%=1R;JLqaj@AIs{(4(l!!YtY85rGHYbZ z>!%07)*d&f?cI((mJ7Vw1f2CeJiM{C6U)ZmH_mx#Zbh@^Y0DkPpD>B8Fh6Ezc+Q;) za^W)uBa>aqbEmPt>3+u5E3c#{V@QSPMSfLoO!0IO4APhAUWdq0ZLkpuifqN_ZQTaN zee;JN^>?gy~uX#N3M%m6LaPY^jN2VS~l z<%c!x79HXQ%0_$TSY6BU2*udz?4!Uu%sc{ASq(rq`9_^ezqUL(I)6~B%wMZQhW?HN zVdc2QqG4f*lu=+n)zzl0(Zz<#qRTA)UERKEd!C=TMyf#U(naM!o|YKR6sQiem(3@w@i-ZU%tQR7+;;{9_psBagt%UCEd^ zH8pa_@a-3A;6Bw#xaJ_p$2vY-9(WxZb^{foW?Bt@A z6Vg|?r0psO06in$#|5wiS*^cM?!S}Wf`hXIM8_;Ai8&O7j*q%K4|5`qzYi~RSG6o# zW>`Z6OAF%6Z`r)T?wYcTLsX8Z~IGgT4BBi|7TP zqa~vL^v$!tGZ}D?5ndQY{o)(bn1i53@vPxtE+0RxdRa4U=fd?tIT2A2rX2X( zqUG`wRt`&dY|bF>rKF7D#H1{p5*0mZ@0DkM>Y7&MFMbdey_3o;?o-#BGM%}s`cF!) z+|B>ZCwp`(jg!xJa9SpPuJ$ZHd%KU06GN{8CMxA&kAg0phy=DGfydpRv=KXz*q>PX z8{rr?)lDR-NT+a4H=-3u>zKg9gGBF!R;Fk`f+ob{%H=$0TcX1;R4r@`k^;3q*k`^_ z#htT+YPJTwyiJ0OpHf@G&s4YNa<(RB8@xK^>!$__b*o1I=U5E>;trjIKlp{5Az-R} z{96lZx4r(usMGJ`1A6AG{?Oz59}tLmeU?OgcBN=Dz4pge%~{E@zz2h$Yq`U+qhM^3 zC)NE2z*W`Xx{3)t5mxF7D`&Tv^I)7x zSnyIWTN`s<5gys-YqjG>v+loSK0O*uvH_PVjXI=@`GfqU<0y}9;eZ(Dvwb$iMF(cd zBtCovG{ZK2UbXG>cQ=dGRwH*S77X^{Wz&Wj7zYknH@@zN^*6o3ByHB4>`pm=J0}%y zD??;d$YF)FU$OX`+KJbodvPlsIYL<_s{kKB&kdF=jKy^DdOm3)yCzYPu<(vXEZ7R< zQ)Gc7*4yx^??Cz)@)%Wy?eMWDm__p`%&#=>E zuk0u!+7rJbRfj}sr|RoX;1b`&s%OzX2<3~>4Rc00E}jxlwP9kz`rCg(r>j4E1A!uE z+&6ZILz!xpWz}~+3y$cJ;_I&oZT!|w@G5)&=RXJkb4;MW%Bnq!QAt`fI4(3dk{m<9 z6yn{Uda|2HT8!?Ba1rUW`T;xeP`9L2pFh5o6PvM2mklnTyNZ#ZefXJy@Ie_#HaQiI zIf9)46h>8=b|T{_m^+c3cM!>NDTOljJIaFZ1WDk@?+4y_h?Krn8ZW>P>~(!ZrarTX z^u2lWWcsObCpFY)?8wKd?eXwj0D`HYr>5rieEH4EPw5ekAe!{R6r{Y!!vs2r#C$>G z7SQ$%eAjx}zW#?edvAfg7dM}`-zHYE-4=jAT;Q)J+&|0V-V-F&%dI;C0=@pv_p2|j z#6~E9C!;)oeYPMf&7|}*E3xLUvZ6K*BC*_{6Icncp2qp#@Sc2|#uq19!gNNDospNz zas*~npRt*dU*CTY$sEagDOv4)Ny9uS`JHr6?lkR8?$lS+S|K!Qz`e}4+@QVW@9)TM zePCi+u+ZBV$DuoWOlBl8Ebj6dhyR1`G6P4}Z@xefLJ#@bL{q$VB#IFBMr6W7V=U2_ z2#Q6wU3v?-G;FnVub}`UlU#I=Uoa4&!LUKj0|Y_%5RS&8;rjIasO?QXjF{;&B-sO1 zNm+wkwJuk#wE|xc5$FeN`5DIUM-lu*meST^hKnDbiw-K~#tw?)11!nXo%E(QXyW zo#FLevL7Pu7Bahv2clWDqNAvO;aqurRzhtOxUM}6&CE}Dwt_~RxejI%CfOs{Tqh!r zCIZA!Fp?Y9?~J0m!<(dfsydne_Wazpf4AGz><#}HFr3P5vQ97x`@ehr_J)Al+d_t; zK<#m}ta({W7t%<=iceZO)PdUZM*{+Q?f~8M{UD#=iZL=Y1T$C2Ly)Aj&L6lbZ^Seg zi1=)b&ppZ-)nE_R15R#fZ*q-H5-jd~ z7BB^>qLEaPQoWk2R{J@Ge5rzy;^Ld144Tl+M7b%JCu_;FpIuep7}ZD9G8~Fc5q1}K z#Ezn2_N2$LGiOcr4cQ71gHiJiHMkfJTErDZr#*D0CA07n9soR4NS;?e{&F8>R1 z*yLiB#{sg_{Zdj_G0Hq4O-J&(SNBj`GY3*;CoHzqj*mwT-tAbwGlSay;ZyHsJ0;Nv ze$Z-CTsuN=X$EE;rs>^v7L!8bD{e+*r9}&!qpFl;^IR&o7I|{t=y&qHpH?bm!pUX?ZpkoUW zEdTFp=PwA7xi$qKrLpZEdjWsjs%~Ac?u|CocLT%YtPMJSy?{lcuZ7xMLU0G0^j!Sk z2C`Z#kniEMhf51VC+vnam7=KWa!8YfxrZgRHf{XG(|FkjVRa!TF-01(uns&~i`eLK zZbsD`qgpYP9Xt=y6h+=~CDd-lQG)%O6co`xy7=+EBDr)Mc>>IU&bqeVKJt0%zCVI4 z194y_H!wXquJ!>8yTW9UbJ>(Z6s{xKSv^i3iW=+423FSwq%r z3{%b6$i1wcb5qX`IFU3cw;BD#2%tKLS~Ws}lcqnPLyP8S=w|(H+WI$(<~!VQw{*aH z^b%_MXf~>EOjp+-Em>zKQ?EZx)K* z3n;CL!g{Y3Sg2g+z3>8I0NIzl7#3!^Q}}N({0esko?gffz?;GC?v^hv%*3C-T7t{t zEF|`z-SCFK)7g}1@EqQ!^an7Q5t`Y3l)V2mY?L%6bzi!Ns2!CUj|#q4FBh#)N59~7 zp9XgnDnY%!r7sa*>-LTE!xsA6*!4<8Zzg;a)Bbw$ABe)YP5+pMjA4?=H?L2&1qJ-& z)pB=`(N7CItRktCEJ-7)^y5hay~vE#HgJ!2Gf=fb79I zPB%rW`8PYtzrQCu=Y0YH^dQcsTlx)6v0xC-y+|Q&zI0kqm?;~y?R#QTpD~{? zEO=&UWkruXma4nl>#mX0o-_!4-7EOK3}BNAHxXfcC=H{Az|CB}i{c7!vTpmfH5Z#F zjY(rseLL93Or5+hzh@7aJtwBQ>o2&+&gw$k_o1?NB|VI5aOl6ecvhT~^dYy7jTsFb z!+Fuq71!g+>?=n_0?kKICZ`D^7@laao5N*t~GD}KH!fy-{lH-TDl53uOK}H5XzY`=PbaPBNL~DEG zkL*TUNfS))*5W%k0(=KUx72YEYC3$!;=STXJ9I^1Mrn{t5-70isA^dYbgke0PGt^^ z@dpuQXLq!&DmJd35D0T%0ZRUdBl-+and7bYvg*@H>-<8tSm*Uy5I*kyE{^`;-1Qb) zVWW>qDpAnfHE_~33ZEg!ugJ}@v*$Q{!t0w&Rd0N3T2*-25uj||I61Dz4!r5Su&pq} z4vlT?PRop2er+dgIZve}W$-e(O_Vs2ZA!EkRg9J`DURM9*iSO(_MaJfP{|_@WhFmx zg?+*hi9@n;_Z!g8;wBfHIu>hW%QV#6vNS*oTxy}{vo@r>!|d7n3WVq2{b^PT{^;aL zN8|P?OBYR`gW+1W2kSuG!vNB+#65s} z!18Q-3FR8{F6%1g`Okq{mIuXegQ|yP0+mB?sPWKHZ=O9;Xtw2@cRgQoZ#k%BRv7}IW_PJ_+FRJQS37SlFC1k426D+`T@9I$4S z__?(Sb|f!W3w^xlJ6F(a`uYy_L5%Fss&<6BlU&5=M?6Q3(b@vdnG3wSCce~t?*01p z&HKG5OEmaB3WXU(YM5|VPugf(dQ~4+-9h{PI*128P4r_Dj|M)v=K<_qDKRpIYJe4? zh|*xjGdPX5KuDH3(Wg*srQu~ORTe*vaPz7l{opQJe0f2xXPO~7Jp-Nl)Hr~OW0H*t zNNjm_{|emi83ewpy!|uca6StV&%1Ad9k+jX=cx)Km3x5-g|^tttb;S{kjywCz$QVC zTfiWw-f`m-srt3PVuCKT&7EY41`5Eb10$^yc`(_5$0nJ9BV9&el}}{w-xHa%*t!m& zh@XI7fc-8|aP5Y;?hQys6bhUa>CR*<?v56tr0o?u!b(s3qT@NE3K6+h}T#h|2;q!9__201NTS_qjS zLaHuoAUajv5@)b>ltTJE#GziD?G}2N0EA1fih|iM0Tcg?c>3pebieh+&31swp&guH zQ%vBt+n+rQpzQkD7~Vz^K_Sm}cEXdRlfZfEm_~?^S@f7jPz045G29r>XFU+aPoS|A zaO?o+_x1h$y(>#}#zQfJj{#m6&ZA?F?o5@!^zM4Rj-*$HNT44gHc+I+MYA+Teep>&?{0v2fTrkE#qhPz_ht2TYMZr!bUGI)t&hWz*W58e4FYVcXw z67Cvg?*j>K5Pjo`bn979Y}M9_;i|xuI|Q_hdaio9sN2s^`9s*~^26dSeAXg_&{_zM zxsfv450mA{rNm{kop@qGf1=PFR9S>ZQx}E(Jeud8K-=O(#Jq-pr!KelkQ5^9X514m zOcwvVRzCfGkrVA8f^1!H_)VqNh7)O1ck(o~58tP)?v)^czqsmKs7?iZ;lH@TFt&vY z)E?q0WQ3c3aWw5d=t>(MAEpEEaFFKzZ>w_S1H}?XmE!qx{RV_<4Cn`)0NlO)-uc%3 zHX0^B@|`grWj07zbDA!2tzwz0;J0zg3L5|{IS$lu zLz=tjxXagTttb9qREsL-E1pJO`DjT&)4@@!}F(i(7Gbch9-J-@SK? zjQq&IoMi8{*IaWx8!M|HYgk=0ifQGCCzq_(_Y|tgE8cAsy&u*i>m%W+(F9O%G9-hJ z1=DwMa5)1B&YkiSy1FHgpK-BLEjI?t2IW*+a4?yPBuhgTvu?pw7Rx`5rJEX-IwpK^Jd) zfcn@WS*QG)9#XwJ1|6gzS+0&NgLWpP()f~shtET>Ox)anhb(gb$q}#CCfLdjkC?us zHmq~BZP%sI%oeIbMw-Wrka$VCn>Ki<%H<_Xmym=eNwWys+ckDhlX;2{e$K^y^p0-TMd8_4D1^fGhj9=LZI6~`E z3YjKiSe9MYW6k5+Tz8Gu__2T5KYaBFtB2D__4#7EIbi;y@+PK? zkY2M*9|2>|wz^JsgJl+!jbtEQrwwjiORumRp!pleAQ7M16`M#2#Pf~m>C0&#|V~% zWi6(J21_-ZI;7MFM_z$vtZDvVvvod&`NHrGtz>>8e|WiKa*v|Z*fzC)eOfKc_m5v4 zENkp5ye06Vak1)Ku)-R5cWLU00G#1`(M<$-RRqcNV_Jdj#v%Lv(3o?Laq z`?!oBq1X_DdH857spvIeLOBZ*K41zHXXcgckI+Ex!#BH}!3h$he<*YMxpSG_OwgBm{g+qxBeuT=obUY~n!!8x z%Hp_U5{t$|iV5h2&E#O;1P|*oOOl}`QIw~xT#hdeNrG_jB&fapmnNOvaZza`?ABmZqn7){5qI>J zWu344r<<^xz3F%pYEa}agAdPub*pPlyvW}7@+Z#N?RPUn2HsHghA zs^JSw?v{Ncgn$Q{zZwu(0cyZtu;}|b)@p?8Nxb}3GHae@x1Jvwg|TP%z53d@KoCH@ z0CLc0IX`;!0ft2Yk#}Ldde`0^(ypv!=3oG}5rMBiLAlrzNT=fD%9Jj17YwPPw{$Dd z@BVG@9k4eA9s(gN@3tVIeMm0C5lBcAzB>RbnLgkAcyrKMybs+IMLRJ=w25Jb=w6v& zoZW$aYS-Tf@$ye%TU52*mFOv9m0r#4)|wN~_|teMjf{R~na^^fGFHzfpOwr0ndMi= zNRbnFpnR5Fv*}el1h3?8Muj57wjFJ@q4Aa7XN8g*Z)OJ&q^@>+@bQsBtsS>tYQej4 z{7I56_``()Fdwewk6A7Y1}a~bP>_OEUO}#t@xcEi1Jm*M^5Uz`nvA>DoZf(y>G_L& z8KhV=Q&a4Aln7$Uh^ORu6I0xXt&YS_p?rrfL=TOnC|FCjQ7w5ZZz>0p@?En%wrRzJM5+7jCoH28E2S!`uxDupSib&2ib%F^wXeL+t?EV2d? zeJKZ3*Ob zVEI@Es}Qr3SpFc&@JiqB7wLw3aECop<&_E}@zZGdg{qSo= zQsckGg2pCV?2-f2yE*UO1~(9)2IC;+%a}Eh{^lPfR(NR7WwM}8l+>}Dbj-r{26Ld4 zQ+nT#O*_x+cqZ2z2$@j@!17z;k~Tpf-ar?RQ=LFV`@;JMQ2v;2QBL4-%Qd6ogO)Rwl>TU?-!3;T$4c7oTMGs<#IWWZf~w@!!5L8uT~dhBcNEtyLw z=JWuXAxtHfnl`k`F3T@0d2JkS9tm&1@rRM#0u^T#-*|ox1to!l5Ic#SVJaO?b{SQP zwd0~PIn6q<)>X1JTN0-%!)r*B{+(X4xI)_3?@-v4+CsF|8T+3$xa z(DsFJFk?&OVRdxDGf^t;yWKg}17#t-3<=_H_-Y=}_4)4UIY$;@H%a_2L$O00>n(E2 zpPW*6J%;08)uOD9TFm@l3-JHsN`A0gY9^kln)F+ndrQ{hSY;9W+uD9}tHrz>e|3K+ zj0>-5#MQ$F*zbdzaVY{%0BGHUam{fD&<#g0!xqRetW`QS+=@0tTpN5I4VrIb6&VoBpu)T&(> z{6VdMS`8}Xy_LT+z@N9Pyg$}r!PmH*-~I71#$qYjsbz+@<^l6{f%U1tNV5-OEL52C7v4`9euJyYminNE7l@@ek~wT3}0EC;m;``w2<*&BIE*ki=&;DHiXh?{WWG;>QOkn?!}vo zdqK+^y%DXB-Eue(h4(lCJ6X7w7*a(@SFi&8a>j%>NW1gogLCNubgIf%)eWhJBTOeI ze18qoedte#Ps&)*@EK?uB>S!lyIrUvF(lYaIxd$<6Utdpn)R!QxjLHGq2dbpTF!dq z_uaO5{*L+X1`Ph1uhbe-3h}7g>p@f*&IF!#vrrYm*7CiH==^g&CR>Tv$~%o{vI_k@ zjww)o1Af53Sa{lacdb3=3+=`*gV_6BbqQ|0t(PhaZJ~6}k59JE6&A>89Yq2}_Vji( zglyFeB`P$?nUR5yKDiE%$+?PI!ah}GO|J~bZQ zjMslF#!v!}Qyrc5ADVT=shvc4S4nhr=ozh2R}rMc96}c)uUfv4{xnz_IZ45+#qe zD&O_$*9K5}_V8l|M0R?y^a3mcwlWFrK;>*0-6=3Hhp;gLF}wY|^aB2Z*kA~+c9K?# z!IbJS|LG0Rf%mI1%lDI$`Ep0(!FfU4cAOMseV z^4$>K@+Y7#*UW2E^k0{UHEM`%Jc0~f#Dl`5v{H7>uD5T2j-#J}#LchU?>9+-G01i* zzX=+)#3+j2LPh6a!7V~8$^SOYUTZ|uUTYv*f{+WvcjZIORto)JChW(!JdFNf)MwUp1u5HQc(#xJSZ> zt=ouBY0^}vF)bs{^-5oUGSDwh$2^WD9bwf(!XO~3*I7f6SJ0Med3J}5ET* zt8IGM-ANTNIQOAwy#WDFgx(?wM2SQ}(d@(bG=E&9R@`I5I zutizUT`ZDrGV)HY?xSpmjg+q|YilY}kw_9k=b{E$r95=)Mkad;L-!_mg5(5_5ywv9 z+K&bZlXr!GJg6$A)O7)O^=78f?Z7ao63OzL&)0>sZu1SPmCA`0_54qmfu8*1b&zleLHkc?Q0$~*?X}B_l*+=|DIL>n< zNk?6RUm%(w%*#bJ(EQw`XkD(h;7_M>!gTvK$jmGhwr0IKZBL zGa)vs1-pjD^4o%(k**TvHVkCZw8kh-)`c$p!l-sD??8hL%HdvW4`T5z2&#~>;!tnM z`*A${4ak)ikNcDu+ExCs;1l&m^JfIN=Q=B#plCTuqU$OfBIXa=*vJGV0^n>N*aP=H zw8JH`L_Sa43M5bJ)4EcNnR=zPYAJ3%5~Hc{6bv+_;NAZa2#%NZeYiyM$HGM%W@3H; zFsj9fyZ;~8W0sH$vW}qiAXY1kTAT&ZO(q z#1Eb-|Bl@fi>8~Er@+#m_Tabhv`{27X%>DDYtg(2Dl?P`CtO6?<4xUz-+@@XIk6(j zRI$_VfGlG8J^OJ)YkAV(^51siaQu<|Dp&e{dnM_$v1O-oy}h<7PVN{ejph@(-0()` z_mmtStC+*X`cG{n8{?5nP4BgTeU+74A+ws>o>MetVJ5-pNX=}_B0Wq=jd@l+KvKY# zEH+kmLAec9Uj59`Ux#@@k`pR_1^tWkn%NRYEdN8Lw;T@+5514z@gN^y=`OR5m zQ9n9#UIeX)8Wjoo_zchn?J>jga~6KuP;$eD9)`sarJ%SnbRw__uyyoEF8LouPvbTi z@435C%2tH7JYHA{5j^d#66>9^%ZI@Xdx6Xz7!?lj3;uso(Owd>qzMZLut`m-+c zg_9yKatC&9Z09Tioc@_@p!fP&s9LIGt7I=P*bb9)lmDmH88PCqVZpR4kka1-v8kz^*G z>e~=q1(Um(Q&W>~-p@hWxDyLo{Vk5)oJ24U6}`MWbVz6DGZY){pWj&bel-DBk*@0@ z&8%L~1tY*si|fIAL0UFid6#Dh@ALUBhILSf;n~Cn;ht^IM0GjR&mIfmL$zTvi-~0E z2}VN=&VxwaYF{OE$~(S1AbR1%1qRZ6DgBn?oOxVZ6E|Svm-z%gsb?2m-;F5_3K#fc z^?;o_c^XHf%T6bpKO}L0q-g0eCe6{VCG1O`vt9wfd({*(-L*>pUEcC3s(KKrg z32k_I1P$vzg*3#{o^qI#O%Kg~Y0K1G37Tvz{UXMeF~k+tko^WqRu`82A20BleDj+# z&nbWq@B-N|1-XI(0DroKRv?B7;oIK~53H#l(i_!;n_gB+$w5v%T?8%0RNcp6tt-r^ zUD=ei+NY1AoFPv&!y+Nr2nJ5&lmBk(CT@-M5sM8Mf6s?$+&V{U z$~bliDKnI^J=1l_Qs!GBnvZ^kFDUS6UYXBxjctJUF1L~+oI0Pn0(8Xd29L#7>VL*-i``(mzOMRR>{-|cR+DyV;Eoi(}G+7?! z2_+>M?EcMY`-1Xu30a*p+#ZV9Wli5oMZro)!V~M~Gt^&u@_^rM2(-Z@omwnY{^$pV zfvx4s<9Gd8hZAvy&l;6PtzQmo(OJuODtJ<$akg9Ac>A?doyL-EjY2#VeL&jT?iPCB z8v|y?N#$tM-)H_OWxf@A!0NCSIP$|3C2(Oy_uefd#|u$PZyQ*TVZ#U{VVz*nbr z5cjN|e{Re*=j$+5f_|a2MCC~7s#LQ%pQ&8N&a=D}xG0uzRSrsay86lGpo_h1(aUB+ z=$KpFNv?oMUYo`y@U8M>EE@sO#A)XfcL{yV8Xvxzd{5@?@5`_eJ~+#HGD0ebnRbMy z7xqVcYE7dclGL=)igS}AyZI$aI;_Qz)9rUGf}955AQHyIEo&&1pd8V@9*jKpI6hW~ z1Y|`-@Xs08f9T`|sPsd9x~M1h=pG`CltA#9BS?dHESuwJ!RNbmSi;_}bt?LUfmzv;y6ICefNHZ>DN)GSgZKB1j+ zLvG%)9C^T=0k-lmt!XaPtP7Nhvj%Y^Nlb z6BALKm}18C4sRi7U%R`**qgTgqh+d;>UTC9%xi8NsN@jOHhMIH;(l|07B8*D^(ZNIe;G~%0y%(dK#uPPQJv^C#5p68O5_kEY^&FWoMfGa! znp$??j&RXJaLgAm6Fm&RjoANTGIx@V-Aj86(85+5L^%k2QEGSv`PSOLuM`nM0mC7X z>4@bp0FI(E)4tE(KFCRXL3zz!y~#oFVjA_x)k^(d{*2wFJM6CN3FXCN@pwch;=V&F zK!zahC#8d6Ep1VWv0@8yPJm_Xk|sb3Sf} zKSi|n$7cF}UXTW`>kx23aauL`E{YI7ZxB(u!>7`+H$8BB3@4uPcqOCOlobotGw2*6 zMkO>;2nX^fbQp=er1j7`d*nus6a12oU>=6V%gyHxrVPiJx7#Q>aXTveXdlrg z5`p8%!vuYZGhweD7vmf<7va@vpKpx%jhk6AG=uiKM8xWtihs%xmbnqZw1>x!z?2X& z^98p~R~pcOEr?ybkd~@OGBa?kT&|%H_GGSjm?31AVe#2J(lIm%+D+BD91RWTw~G|* z{LVufya{yu&wzK+vu2}?Yl2K9=N3)K<_`0LmPBfzapR5Ukb;5&VBwU1x$0bKny2C( zOWp|SX8G>$f}K=+%4{tWAdKt0i%^9zZWCZD{ZVG8mv|DCYey;`R(Jgm$v5bi<1RP) zpS}BzPl1Dn`?yyo3|dt`6XWq+(xHFZ>2)nLq1!*+tvR0QvNJk-x#w5Daqz0!(W zSgT*vXyd<86g0rQ`6iK?_eq^HGYJA;`iE;W1KgKQRh zfPU|Pya(~ljji1~PB3;g#{FjjZ-#t~zO*`Zdd~R-Nnk-1_*(YcITHHXB*skvPuy?z zgFM9M=c7^%e&V{6TQCr++8sH=BX)Gh#Uq{n%K-{V0IuM#^nm%NAsch)z#+ih#D_o3KIEdiXJNpq+p-bGLHI21f!%-d zD~CTgge)lBr1s@^1KO!(i%-0NM#}^0gX#8qO$%d;!PX7oHk_~;BXJSxCY|cvvmM#9EV5#9@U`&X$pxf!u;orb0c*r%*x&( zeM^Vr1{W5IfsGy|9-E>u(%wEH=Ur2WMlFe>3#zCWtOlz0`mfmInP%UbVlB3YeNHb3d}B-VDoLnu<;e?MJqNm1U z>+gR#Esyig5s-fb!o<_X`quO7d(xW%`=YGT*&*^{!Qywt+{=oE~~%6UplXm_MH{ z{d|S;QiSxbj+Rf#e#peLT%f-~3|1WLDtJGHnd9v4N%;<<=zsn~pMUCNQ^Vyb!y?$0 z=EUx_J%hWwXYpbysDZz|c(6|g26U?ZZvjC8w|BvbqWV7uP~A4Dq0qGY*31v*(kSIk zM=qW9X#;4)2!4E?7$Wr%g*&R?FmMWIEUqCj|IR7<{|L_-XLm`|g9)r9y{c(va}kHX zGRf*GPK4uj3l@PE%b+AV-u*xD#__t)&Mhch)Rd zAd{x=(N{d-#wU>JX6`jQl_9rgfsUqGUfhGYblTj)a%1do8AzM7os;PTDk+SIc($SAr8Tle3iR_kH z-Nam|SHm7vl^m=7`8?)vB$H0Z@xk)m4n63j(kX_-R55jKF4~v+8JW(ux2#x0=?eMC z(T$=Lbt|6Z(a* zfV>CZCY%w`vuNWn^OMc~(d<8kYpNL)PzQ`msHHB2k7p$PZBcDCbGDnCwTX6yG=O!A zFVmJ8$(vY0LhfUYBQS|4q6>K-+#ADre1tO`^Wzga-w66k;?N__8_+I&>CT;B>8wZu zWgeaXuEsAPY;zZA_WGV;e06QkD$G@`pZXM&UpfvWJH}VW*lt)NVhS!|Q@CH3QrApT zYs$MGh}z39!1^Jz%7jX>_w5BnR28wRReHuBQPEJbu*7%kkG{+o8EQEfyCMulyDwvG zb7-)ZOQD9hjYZ8CxYlY<7-bng4*A&Q)mJv*L(iw zN9zHWvOi@E7Hvd-Hp_fbdYN@K%nnoOauL|X@0fu#AIhhhRDK-HqJQAU3%K^xXqZ$h zC0bHl+%)WevKiK|`2)Jy$j(#x2mfT03v2zODU{HSbN%&(UKH<$L^Y+{u80~V*n^6w z=T$EdcQhKI-farnC`ZsF&-|q`V$+ts#iFa!Ix@#^2es!Azq?3fMbqG3jmB?&x@LE> zCgm~RXjh;XlisOP*OzbU^BVNMh7+G9EkWoby~Q&AovJI!^ZGLE?-v=nK1O37Mb-e* ziDc5UuPMla4CB7ZS{TlTk@r>P8~{N)y3z_X@g5KwkONShy|1x%bRcca?Taz;K?bDv z$Esl3wP;RrHYFHZ9JNM07bVH`wQ4sI>4!q_yN^X)k^$L)V|7NOklJmn`+40$>iX6Z z>1Uff-p8d7(xhW0ZEsyc?aq2n>5;bM)%(Y{5y;){6z6ImA zJxt4YlNy7Ej5lh&JbDVTLcT-WB{!JqmS(S+q&i8Oa27n`rWZ_5ccC;~{{B~dts&Tym0s*`KMy&D>4pa)E&0Mrci`D$lFW(jy0Z zJG3XsxSDHF1MtcQ@09ZjZ1u$EfpG0t8^tgW$>uqNc#a`ysa$YFExzCKgh**4hi=|? z>0!NM-;2ktNaO8}0KG|%wIKtE#SEES1^P>TvDI&DI_J0*T&m@-?Jx>eE6(a{G5(kf z<_fOvXK{N}rlD=n;Xd8OBx?N8b#}8zI{#+FVB$~3ui8bPi4o&FK-rA0&H-Hxm3`Sr z$1(ijMO7*U=;|`ODPg`HU;li7GqXRawe;&_2$K^!N%I{#_~Fa2l6avLW7bWplB7Ii zjQ&Si#~8gMomjos3x~TtWJTtaB69}iq`M1p7^N>A0`ui_n!Cgdp;CTY(JEE|OiRVY zh2F3I=pER%A37;Wma!>%#75gV;}*SrnZ`YjfbGRv)6QTL{IuUhO?OF$o&q^jT3egi z526~4rD}(>dzrE1%CeQ6z3=iR*lhGY^ztLe6@soeeEFO=o-axhy=hR0>(@3*X}+~- zw1{vp;*`{w8Nmj#w(JC1eOxPdSwpQI9`?0^nDCQg1N>Tn{xFskNA2Ihyvf;lzc{#c z@LG50%F^2FZ^rk3{$aX%1w3%Y-`{&KH!o{<0spowU{RA50y03R?2+a83GKiF1GR|^ z9gQAyz~(JvotWYJbMGsyph09#9yUt~b#w92{lSedoi5bo^pS9(Pfr@oryZHpS=7=4 zf`CaXlQ0^!U6hB$^GYGv*N+?ylBS2%%#9kNR=623$0aq0$Cix+P`Ds!t`ZgI#5L3o-RbA27zOxq@DA`iGQwL!2*z+tLo+@BJ;;0AI>`Xi3Y~c{afu z2W6$kQVYvS-{Xi}KwnbH8zkjS*l9#E^6TJ9gjLLP9X`YIUi1!`S!~M>`#hW;^8qo*-0P+xGdeSk7vXbmR$IO<$v2I>#5psibH~6g z5Gw}i@npFGp?^mOh#1azL(m?8K3ge%$k6l^J+SgM+7qB)#2e@G4Jnv<_`QVQtqbkp zAH-gt0R71ICx~~e4fz`Y@mB)~{YX1?rM=qELAP{L_Nc`-G5232;$DE=sWpH>j^qVs z#I*%TX4_Gb&3PWGrlC-7={Dd~hl8TNq2!%~pY+2y~7 zMto45vI7Ek&)=z)wj?hXjj7RZt|}K?Ou_S)&5Ag=62CL$E+?bv9`b3or^~5%D-BRy zTy~!efNVI<ZW)O9}8V zAv@|k{sYyoba^HUSIQyo>Lz-vj3UHLh7#$)*jMCYyOXj#+gn#5Kh~!X?WpW7Oy)1E z*SP!dA9CtvHD!tw>>H#SgJ#@H{GF$PHTQhL=eWVPRxkT-pkZ`>$bOM`(CE^@^Af=r zImMh^;`#Zx^yDdjcMgUckI~5fHQJBY20v42g$4x|^z`7wpH%bmTmAXAiXb z*$>wFzYi*2IHS4kK@`RGt!fX}e-=z`J;P^{IQab+p!^2J$|$ISBdUKp(g2SskzL); z0uOfxeR>HlWQj5{ZuyI}#}_VPDcS>FGuWpGI%Ij$=MKTRQ~NNW+Nrzx>`!&B&z@Ss ziDPM})-Sp(@X6VHYLQM{FO*4C_4RnXVN6P7_i1WWxWL4-Q1w--OL|Ffvqq!vD)b8f z;DuNoIYz`@&4F>Ah2q`rro` z^xv3P%|b$47qS0_1sY&?$!k^BtyLyBeyTHTaMj&kC=j8(h!?uc9G4nt)y%>#%EU!n~f+@c&W{VQEUVEZ()2SjOVC~CnY{jgdK0M zT%qVu)=Y_Ybn7|GBZsxe~`5v)>8f>O!@|o0!aCH zr#p5w_5ET2)XrPrM@chQ@D}8NlI}`u_|7^c+JmU!d}GI_A)?U;50Cf^jQwun zGdThGj`=#aWs2h4lxkYI2+MVctkJ`7?2l0;ivp|gwD1=i*ga5a+T^ICh#zVOv(0G{ z!T{Ckqx_GSRph2SL=$k|-9_7FnMjh$;pqhiy`m*AF+5ac)|XMY|G7K|@haU=il?ex zm;X8{vT5H>@Vy~Y<|f_fkmihai~aL7-TwU`Fj|~(BhpTz_nWh%<{MppDJaoVcG~@e zO{P&o94QuuOwAp!-7F%Ak}0N<}Z zaI7y3eT8-GE`SJ8^wof)%YUyd_!WMzE|GJ)hBAH&7(!fgC@Eu0?{HYIH_$ffeyOtc z2A(U)3J0q`2mK>3Dws5^Fx*x3ggD6NAbgYORa&vHZL63*#B%-PAkohDd_punAYg$8 z2{kse??r@CQCDBp|5K10qdqJN1au@q+P7XYG_aEpc%eJJfYJ}9>pg|e5W$6Q#G z886r9#dk+3*5s3v_4?D7_o7~T7G@$x{H-8hKYN%|I@<9lgu3Rsyvx4QCW znI2c#!?aC|e#};Y0X7v)pI0QKs>UH+RdIx5%f4-Ea^O+wt_ET?mi$d-{w4Wm(O{-n zYTVC)I40wp1j1vsKiC7}8qz-x!XJ@*i?Cp)^KT252)|HQfU&>{XF!$vy~e3F03SrP zSjHG~s zLn1Bt5g;ETYLhq;H%_(Hq^mVL#AA${CR2=Aki^`Fk=>#gm`5<6Mfl1$qW+wcTY}Zn z_Vvsknz|_xj+t6m!dOLu9_l)vH$o`vPo~o?Jp8AjMZVr8+|tc3eSXBmR5Pz)w}^z` znieEkjbZUJ#+515)C)cWP@uf} zFv^^6r?&=c4zq@zj1*>js!Hhb2vojIP+=-=m2q*MIdb}W8Zd{AZ!b6E|6kB2)ST}2LsA4PR z2Wqbf>WTBu@3l~*oGRGSy)j;s`KP|Ir>A;#wdqOymQ_k5Kdm$k@7*>3B2r`= zFWtjt$ai`b=tSpu+z-v9bjz>iuj%~$I>ikRpn2)kqcZsNFf|I(|R1K;*v5YmB^sN@2rhE@ZY13%??TZ}vNyf?0$xaM! z{5kw=?pO}*YrqxaDmV4DXs>3HytWC9C*z{A3X|A2c>vEeZaJvl8A(~ncC{7A<+^xgOst>a`@wZehWw+$gflz7r@dP? z_bc%+DM=vE$xp}QAH&teW3)L^F2WHFw@6d=!W-|J)1j^p-b>gwC5;@z8`RP68|6Hy z2{hn@%aGju-{VBx$L7H%qV!7%~J?$_;;nfov z)+<<3S#pGGTm-VLdy+JRY==!nWy#Tz82i(ZjW&=G-j8`Zu9o}DoC9B8Li$d-r=9)Q znNu^Bo-mgv)OKc+^>&*f#KCiVw0ptKnEp~!_Nac7oh9BeBG@vwvo_p9%wCA}q>>ly z*LX zEtAMKr!IR$QArl20gtOEYIJ0S+BnHeg;3EaNtxT2XE2K0B0jFZ`_Ied`RbusVIyN%q zX=vWUzsF5^Imy(H_`<)v!cazw(y}LyQQVSd_}vvwny7RvXQ5c?PRg7UHvQs^`uwck zn{%zsa%UL&bG+_Nj`3^~c(QumShrurggtJ+WTHaL|A3lOyB9DW#VbiGI80|k(>l;` zIKJDplSSdBl;dRAyRv@ts#MuiStu{Op^CL5hpqi@kdqeyE?KHn^@@r%xyM(#!~9Zc zJSnEE%696`R-09UkCOE@u_n`TEvg0cJ{DL$79gb0HK|13mQy!OuaiY|iyvx+TqT zWt+Az!(@uVFoRAj=&)sugwUI}4Vs7iZ$H`ha|VNm&c;z6_QR8ytOiBPP6MhwyQqSH z3EhN8UFGk5J!553jfD^8z$l9e`tp9;j+GuloBuYufbHcO%wj9bz zDOfE&f&Xe_LG#fj5Y`=4J+~ACsmFcLvL5lG>_i)9^f)xTCKEcgsEe-P`4g-L(U8DN zsKm)Lr$Q0JTaOJ1N0s&kDEw+qJxKN?UuqF}@bYb`0}Pb5UI5-;DoZPB@h}A{=hnS} zYM!SM{!4u5Y?KfeSR{ zrXy9)F^^bSn%M2`Xoiau=u)B|n@~38Mic`+Y+td?q4NaQC8$VNMDu${;MlJjlh>wH z-%^FC4N(V?X;!O*R^WfixL$yS{ilCL+!B9aTMnSZAqct=kUE0$?YX7%Tcmp+%ut&4y2K@F?Ac=?I9g-w6lk6w%M1vEM>-3N5L%r z5tAZ9{ro|Q2mKj3mOAxbVnbj4EpLXoRbHca*N8l@+XSo77$qh3FC;IyT7OMS=#5rv->iiSL*q%j!+Z&H$$2hLsd0+tX0HqP1ZdhwNWocAt% z{aIZ`%U4xkE@rx9(_Fucoq)$G5tdBjjN$$5zwAr^>BJvv@9+6{V~uEdhbBAzR5M3| zq68iH44##Gc%}I9zgDTgS5K?6V-`GBlGTCaHbWTt5{IgY@S2Sh|vzinLZ zT6qHC^xj|cPsx_{u|WqgB{))>PhEcr&C%;C;eGc49fbbq{Gi6WJ8mO z4$Lg32|^3EGaVa56s<`c2$=`8;-dx6?_@W^Z3Ja^mkK4Q8K^I_(@i2*y}61hyYu+y zzGc|x4AN}+k$!u?jxj?^4c|BmDR9tQl8Y~ z7eIo^8*p^#_TNLNMumM}r**$^%>LI1TywZvgh((O=Pm&@V}2k6hJW z61QA9r#LAQn_#6_SXW=NSD2IXD3!y%cswu7FCv?#KlHxDY`Ne0caV-*tir8)V{;{Y zlzeSN*m#12(@^EU)gz^Liy;@6$J~pFu&rN(Pn`J{UP9r#G?46{o2~@}ciHh-pWTnC zmgykV?$C@iG`kS7U0vdroRD;J{1OF@iY&nFaSs4O=_`laB;OTiL6f#>i}kMF3*tp? zkk1$O_=k377CGt11l5?HJYFLL_Zuy8-uk!9Kn+vm=s-)oUs3Fp6;Q};63Zu0%V zu?0iF{~T(nCIB#-68E<8HM#`UtK+G_40XoxF9|x)%v&91`&Ox9JBFJf7{3|oM~Q~kd}?SGhccK`SSOUE4l0eq5(#o z{+W^sG_rs@Pmsa;WpQ_NdMmAa?q;o|g8roCs{fMM+swTznJvWM+m?|x3K(pHt*|c= zssl99)VNl%zTGl@2)xEw;Y8{%Zi8(2+Z0?_dYS!{gIJrvYIu7rRiA5mLY(F-f2$+w zJMHRXQivS<#390x#fgg|+cyuD{)%FG;eMmSBHV)Vh3o{Ec*EN|CpK6HS0`jJG|eaY zh~hL954zamrw@$$PY)ABMt-%CXoGQVfPvbniW{=hb9wmR5nzcP*fAW1abJEc)6;@` z_8_>$YvorXU*4hK&hdrY2C2|xv0b?qA1-|u_szum+A zQ!yylo&oLs?09|wLQ`<~Asa^{TMcM$W^!A&2FN|Rr($*yR)aN4E?L|?T^`|I|&I`DSTFEa;kp%-pz$D@8O5P)Y&4kO+w4DMCdF z5FyvM)8pn=D`wtKve8c~qjXXn48c%~H-5XA9(nKfMXXVbyIG~||3*b*`X(J+2@Yut zH%Y^U8u^AE7Bth93y-IKFCl{WiY`K2mEJXUGJUT`A-FP}eLk@~wpu%%V*A$dBd6o0 zwpNS5^`fAVXc^(L;-?Gvef^%ExM-M;or4KN(15)GIz)Fx|4@?L zvl|fnV`tADcqRZ+^Odu6$rdQjzhz(NAZ`oqasCm66pwi(LN@hM^5Er$_6|owSc-j9 z(fl^+{|wwUb#rhI(3Wk!?y)SB&@z3t)o=}xf_sp;OMNZoZz+aGnuZjwUaGo3h%x*M zMG!Dj+-J~u2MdornZ?Je@?Qgn$jX--jHQ|VG;TisER$d4k>5Horzr;%2F-rhE0`X_ z(8m@&Qf#hSg}|cHT*BCJQuBAN;|rwdSp5|I-oT`|^y?K?IT;Zl7wQ%2p8;}UVilyI zUdXlXL$t&8$2~u*{{sd=`Mw|sNE9KS<({h-l+Yp$dX*SYkSiWuiGVvXIL3IS!4%&i z+S`(e357}%g`&^b=IAI$QgVkw1agWdc?9wdM>xZXGN>nc9Ehs|l_*Q8NA6HW5|j?W z)f7GakRr`;0m%A=tWU<>#sRBA{7_fGkZ{gg^017_FK{O{Jt>+n(jUN>)wIx)JtSzProX370jcYeS|fqxfp{fkV-c)Ba`su(tyBpL!n zrNy6O(IBOI&j^^1C?faZ63t+o;XqYn&1_GzETN@aWW`C!5r?!TokM8K5 zkxHGHIj`4k!X@_6r2jc6*?$~9+vI;Lg{VEkq5n79ET(2S0L?e zd&;V5)B`{Wnx-;dHZIJmY)f5X;xhohfq&*CLx8JUdBp?+NXu{^uqw1|68605s`;jt|TEzYaG0e=UXY|10x~jFSOG z0c1Sdb(AB1+rqgj$V2`KBB7#Ga}I_HoWdk6?A_yRieuAwL^4T(N`fMnn(YG2FVXJw z4Vt`iyEI&Hc@6nZ$!OIgCxvb3K!1rRKw0(4Ubt!FWj>kUFV;<-*@fwqawkGgo3CY4 zgQBG!*`Z}(@r2$5R}Tq?Sbf6n&VExiHlW{3SN#Olg2$wNyZMm$SVG{PIW}NlIY* z#=!2R@siq@JK#5vrFdq{?4jsRo!L!`yWwy*&i3!;Xm3^8pZ}lvw9Uf>H0gha$EU9U z?zc%xC=Xk?p_3Z6akYUTKe46EXw)OPvrIOm9$jq2Cq1%|m&bWl3LslB6Uf z0f}T|@|Rit>cxewtq*9C+@Y#bbr3Q1^OI;$ruREwn|mdQ<7g1e=R4{^0zf^I9V)tB z9NZScR;-EN7W5BB5&u}Fn*K-ldY>Qj`=1SNYX$Uwc<}6~l>ccH|9L&d)cpq-X7Qflxasb_G#?xN;aTGnk=C9(Bhfm0zv{lk-C4yMj709TeLgWLQXr7_A79bmGr4fvQCT>8Yrn0i|g zh7RH0^@Dxas1zag_kzw|O5hj5Y6%54WYD;a58jcx8#q*W?sE7kH0{=$)#pi=t^kDqr>LF0vvN(Tjv=}v|75x{> zU{&|O$7TEfXNRYo``@(`PODyhNtD08mE>Mnlel;;Y`2xae4*(Kaggm4bz_ww zLA{q0n%`V1^1v#+yF+P;L&UFv@;CseNAgBU+_8fGUVjI4zSoT_E_CA#H@SkPEuznq z&H)|jNeyz6N6`cLXAUDg!R$mx5{~sj@2^MMiDKf>9KT zi@FHUu(WjN#);e44}2b9zP)61aeM=4f`Xkv?|cFzQ5TJ9&rM-RC_?uXPPVyp+=Lu> z32ptdC~n;6SsF&P2Gx*W1F}lx`$Z#2@zHFUs=Z?@N=BxXPXeT3Vaio5YH_})X>m&S(*nsrsks2e-vz^% zq9lR=0{#Ee2mR0eR;$e%(o2+~bjCn(qil-ZOi~aUT8tE!Qh&p+d`5Gg9aXMYwYO?& zcHCtKie;mF+I(=k4cEET5%;cA!BT{{Q(@9VVGPA79}GhP0TqpEcPoQz;t42LJHQlB zRBbis8P%MmvE6QUHmO4>N}IL7QjtWh*su22o^8ER-h7*-f&Ui=97^f_XB6Mzl*C*~ z+D#N_;QxF~BQb3eX13N3rYN|T^&(7F%*`E(TAH5-Rl!dwnHlNeR|Sj6 zxFsmP{P7p`prG3`EH+IDB?o7iu4|Zuk(+MmJ(`SUlofwd1psz~tlXl9st?%N;%dg! znXoEc@p^Njrd&}dgetC`eODrt%fI^myMFyszYX(ZI8^6-8GT*|jBOy*Z_ZX!On~p} zN=Tdbz12x!V>ztn$QtK??c^jy6xH~p7@)x@diCgM#jp^roB|Zz`JGl8*PjB+w3)4& zgRgxOZOYdu?fE}EgE#Xz0X5lwogO`N?LUqVH~imPin0kvxyv!1W0_SZPm5stdL6W( zy}XeZyp8qJ+Y}{);*6vZebCR~O&|1=Jc=$zgagfYap*>%Z+Ko5-+|wMuaL15LNg^` z?-}39=kh~IOGie94Bmj>fA5QaFEluo>qi0Q+HK_8@Bf6Pb2sB5>%Csd+Pl2kG24mLu&^hman+*-m?9p-jPBDcg&Dee*jLT98K-#inIODVHRF@;uS66@3e~*L*eP4f_C+uLml%E07h~e%FE#jgBPv?{+8KZH}aj_^@basonZ%znF;`u(3G zO7b*7bpLaJ=8XQ(tp7P3miGVQ!6yI9T8hoWWND7}Cr}2PVN;GLnA@Xb3g8{Y5x>^M zF~DD56mP3i8@v^$g$F(@kNBPe`YsV1opJkSYj_pUZI26V>*zdgQ+z;w zK@ZBBlU!ygj&F9Vtj!8G(ZDLtgQM;^h51=KOg;(>K9MNkc5Cw^s-$hNmpc-v2!- z*?%2x_`mfOPMZJ#;Jut`U`(_kM%A>asBEx*+axW#yLbj{)%a^xo$8l2Np7)_T*ILo zXG|Y&pNcH@R=%UW0La<>irDONcvz^nW34kQesFeKrP3>tE^d4Ar$)j z6#X+tG?OvxIOqq%nFZ&`@D27lwk>D=>-WDnHx^L+^3ufr9UPV7{~mAjzw0T&&w`!% z+{6k3e(sYAxJ3`bt4Q)}jOl~i79EoqrVrK8fqlG2J-0I9ejVHHox9{rcFJ!GM#bPp zW|&eO->}E5eLfJ!08X9w>T?qW^iQ`R6_acLc7R}ty?u$Ct!GKXHm3DvPdPDM9Mtf|w{E%y;F#9;On>mkPs5bh`7f>CTE%DSH4?A?+XC@)`zf)%ilg@X+ z6L>e{w$pCqq8)vum!&!4A4rBZ)DDrnx4T(kEK>Hu)83Yi6(v7tTFu8g_VbKEcLB4h zc){Azk4&2q{)Xn)#dGR;#bjz{l3aLrO9MPJMi&^$Zcg9 zU_3ghnwDyvRP}yySFB;*vMg3*w7b{ zsg8E-4+*`XnJNCFR?Ci^%YUwZ;GM6J5N41{=OL$;CwC-z$=VqGH<3x%s?2d>JTSr4 zi$p)t4Qq6l#vnIKD%F>NmgxQ|B{Td#L^J&YCU1b*>YywwymWs?84pZ+Cn0Wkr>?+; zQRLg*OF0@OM1J>-S|T%O?UdmlK_3GW9fG{iffRitTeN8v_z@4fBFV!#v`5<4=Bd7= z(vtsYRF=_*Uj!|~B<>&wH1PjN&rV(Y@5AGRjsM453MVgeR*@F`*>sEi-CXNK6BOVH z4j6|ugEfhvv9Rp0|m-kbY zB1lE8G2_RI`eUx7!x9Sg1y=zq@us_%sR08KshYeZUasWkPa9~S$O?fMC$u|Mk+bEC?WQ%e_HKT{ zdit!wF?rbycYze2xN?LaZ3+lmWh)>pw-v@ZCJjBD9-Hr&xF6|4R8%93IU0M)GgE-E49-aIQpzc z0`tUBTqr>`q$=|tgRm6=Den88Seg>mmKK6rw&lr}^X*8Za{sR)?Yl0G_y4EQ-2Cqw z`|mZCEg*w`%RKBn!T4JdEc7y%q8aM-_MAk%Bc4XV9K8(Ql$xnF{v8^-aFWzNS zlv4Bg-jmBxB*AfS54`{J?8O|7vCmW!vf=qbQVm^@kj~M{1qoFPT35xZyfANU@!>0sXibQIMj{g;hmz;xz&oAz;`yIxV8qsru?mhSC^D;5^PyI^j8!$N0LwqAvkLAyt8EVUVGe?uuB7*)%2h z0LFmJERUQh{(*|5{~-zJ$_{~g`hRqKTFU=$G#qa3|JPD9{pb4{yd*(BL$NUF#r>}W9-uMQEAVH}LB;NZC`~^L@+LW&4 zHvj<7hsgeXuWkp~(?6qV2CkHYq^v4|=D%Jd8l;$mJx9O2-@s^Z(E@ZMBk!L@u^)P? zbn3VFTVbNg=Tv2D?uz|!h=Xh_unYd<|Nd|B_&@&7{{q|ZViA%LkT`nS5jDoY{yvtU zp6PU=Kqh(+*~610dSJ^2Mv=}d?!~_|05dK0x(9G(^xbY0o&n5otaC1R832wM{Bi*Q z=YIk9H!wz|DueO=GaL@b;@2A-<5@oAnVtdf_Dm=nTlH)VU;?A)8V0wDCJd64TqC(J zn+7nZ+y!LZb^y~XOXL95cIMr2H+pbCMKPy7LI~w)szvsBby*srI}|kyK*puMP*Gl% zH~=ut0(Sr^{I`xOQ#A}#v2g}u#TIkWaR6hTC4B4|KFhW0giEoVe}G3@Zk~#Bo1k3GU^?Gui?f~%rSrjrI>`Ohhhd69)R6&y9tyejq}72jZ-T)c6;XS5Gd$`zXRy`JEQv%g zPMvdv%#hCL)^`H-%-x8=XpaEnhkHFXR%_$1)-@M90*vWoXtvqH5y%4Lv8bx~qaFYb z6Eo6gvAT6*F}usTej=+@Q`LH^UQtyGyR@{wCO~3ITFbm6I42d*99BYeI;_D@vEU26 zh|GOxNPr{;2??nYJGIw4VWz!+R3K!o9c zh+@yr^OjecmcC0B062JK4tUFg7 ze>mUmF$ideqe!&EQwQ^qQ(W97${Qh@qFD`GyX+(gAVnM|sVSOIDP*XCY#orT0s76* z{w%2cG5VfE4P@wUYP3Ehf3*dR#VcI>y)}llfaPNi3clbsgDLn8FxvJn63hDlEE9C0 zJCr_f8#b}n10L<70mnrMJ?ReK46>F;x`6z?ZTk(q`#=`%@zpIqUXTYtl2?E{*TPr_ z$iid(+W=WP{#SkU2p5I|xngNNW-M1MjmHS`+h5LKo}YbwadvU({Rn_@glX4>VYa%> z{qGdl!F68zsQ>xm1Ebgpq!fiajUXo^l;Luk#yQ_wR*jc+>x@I13(Ez_()CT60KCTW zEww=&UlS4`7<=`LRUp?lx+us~LbJCb{GRWl`9Q93bWxB~#JP7F?#~1AJln6n(M3Tn zq7!;Qnh)gqMwbAxjE3k3c`k}k-{_(svt@S{VMx71bWV`#8(kFSj6^7{ylb2j0jDs{UXVCLUu5=Z7~R7M3Nm=hBgq6PL~($2 zsz8Q$M!2oDZ7_C4Zc#ipk*jZXQ7nrjvV0PMPGNv9ER{OHzpU1=RxXU%MmvDq`>+3b zZx39(d--kz&SyzVcua3C2~)7Q_uSUSnp(W8zmLF&s~7&5TtJ1aIvx(4pjChR8Fz?o z1x)@#RNiAJeXqbWds;qTM z9e7q$9oiAR!NrI3msQ}+bI|biJR)J5$1#p?0Hh!#B-?2T-iJ45mw)ktHy5{2+1^}} z%Q&Jl`j*7+3CUdW=HV<_mk!{4pygFK=j5&eyq{B&Cyx_68C!@=?oT*E^nqq*_Gl)T zd-YzV_zp+t2EAg3nTikk7{E&uWUeXT;{cDMARx2kA|(@ST^`IymRAbiAk*e+bJD%l zf|qD4J`V8A95(jnk79DI6gw~sE%4@$`d0~Fn3Ci%fR~U)lj3DER6d<>19*dp_bfBP z`)Y@p0p1JlM^RQEe$AcBz@vGRM2P!}L>@eT<+V4U4>ZWCof}pUUOUB$N9W>#D8(tdj$H!A=hkh zy@h6;M?8vP@t85K#is?MXgu?BXGS|!{86F%0H9z}%%}G0rnEI8#ol|NY>{{tiYS9# zs>(17rFMoDMnp$i!LtX>UcXkea6!Uq{4*+4jroLxJ;44IO;215c{cnAyyNJ8gDFq; zCvEYZokun3a@F(SmLBMQ25%6pRc-uM;aAm7Z&9b9XyyCVsC}@uzDQW^Z0u^g^s0S* z?lx2I#LN<2?|x9<$@`)iPbV3?DMm7XCs#!?o=%K(}RO8p@$Jhgb+6y!XFdNxI1LKvxGzXB59p_o&d z0+xG{-lFt;VTi7{#S^CS4;g^*LpEhS@=$6Fs90((8JPC@(^T%yNSH^6?$2NhZ&12FMbT_eXl(bl z3heLUSip!$yd&q|@S?N)O-H@n9{9-69}yUS+E#xRj>$W$f zd2QI}e%dyElslT>n;A@aN8-<-hag26>wx{Qp6Vq3!eO6&+IF8f5K1M#22}o5wbE-C zeA;IJ>hGkf#;0xdm-WU73LtA3Ppq0MCV&nJAnTW&tFK~`A^K^X|Hq$+$$ZOxkEBbm zP$5zPgOpIp&qTJ$!_q8Uhl&WhF#eDK`@hFvhM+R~&{qHeQ|?iqViSe3{{Q)3)%A7V zU2(P+OB~>sW(bCWOaKH^n1%rfQ7Aqwt|utU0OmIm<0`}Q@jx&xamZ@&>&|PDVi*P} z1lJD+NNS~We~59pxiOF!xus-{Fa+AVPI7SRs5;Vc||2G%;GW%$X|2cei>iYjb zd$!5{x0bS1#3ku)@l|=r<#obW3}efCuJ(6a?e4Rjhi$L4I2?LQG~&ZiWhk$5RUA($ z=~K>eqpmvxH4zj*%0qio10%)eEY77p#xHzofTY2vOGEN!5{0w?LNHR;nW}n7R782% zcCFsH?4-*DI#ySNaHN2w;3cNwZwo;!ATeVbRL@R@&%efr!KugwkI!gA^Zn{EE4 zR33e&jUE6bo1%2D-LOin{H7HjvpmW$h;WSbBd+cc{V*BlYoA`5vS@MmKUbPsN*@jU z-|0~)|KIVmlTG};wUn(wuiWdMQJT+?@YiC*Kq`EukOByj6ix6KM()Q-Fdt}PU7j!r z2`>{Aj5``pwYHh+!bx^AmFj94)ryH!=dsku4+_nNhjHt4A6CUb$_oO?J{EYW0m9D znLBhyf!S~q5Ht&MY^(_v2urZ=193k^i~(Rn7n2J_qa@{Olomi_*@Lw(mjVQ9v;d)* zM{J@pgPIXkvz5N+o|O#cPHzvqCGno;qdh0WXDw4|fTp<8HzY+O!6xJ3$GXy3nbuB7 z9*2Sg3&kiqs$m>{+LnJP#T-m;=%;P=uXut%y_x;Geb&U$sINYF=1!ov3vmE9;^7?x&Q@K5ffC)bk1cg2Gqv-KTB!m+=L! zZTx2=>R73pEVQUMV$2c?2^!DfQN={*aPwkK9l^o2~r!_W_S94-7dRANg z*yptuTMcmOL%iwGGEdINN1Tj22QLW{_Y90*7|UHcW*_f@v8I#!0oVDD1&QPjoXe0ggKaFJ zPIE@iCyd-%jDc{7$Y7eGaKOIcRKrU%-fLse6UWsYOkV2XzLaj z3?_rQ~n5B!f0%gu^8@ieUdSpCuIr~g9dx~x7L=>N0RqeEBzJ3ZLk|E{HM zfmiX}*Af4kX?3NQp<`sYbm_2Ln2ok(h|3odg@_g3b--w?ouXlp=TXF>_->o-aCyp` z7oZuZjIMmVMGyX*5)PGhZcia3h70Rf}HJC30xe`|v( z+)--Q&SGoTYF;ng`LJrXRbHq|S*xOp&I`33RNq=!e631QyDrpvP)iH7*_dOwYt@+m z8`KF#QCLUg7F(;j`OfRK8dUKI&;IO!y2t|Ht%|(cbCe2DVS;}_DJ}6qWl(Fe>VR6+ zYFkiy&l$ssQxeZmoawotX1bU$itonSpNa-BW-l1q5#~I6d?qYsde6Z%%I*=0g~hX6 zZiXWhWs=Okv=-S{<|X{T)034JU?xR_364VwVEi!XJqKfRLyg6~uX7$SP_ro*ySr`7 zeaJGRc9D#SNqKtAJDHt7yA5-PB01?8aR}mzC~6} zeyz)}C_#~z{&>P2-R_|Xx)+d`^Z!tyu)rV)QpCX|c}8)Fgt&>U`TX|m&8veE|MQo#*B@SaD;#ko>wJMIKOlo}DSG3{EVO5DSssB?=RyhAv4VKjGP8Gg~Vs8iFgtl)ME_$7wD zf6VX_E^sF<0E*<60n^9D2+U9hLzuyV7ruh5j=z9+(t`XS!XAgn%3Lm(QKu&lB{vA z9SzMgVC<@LTIO7r6i&V8tR)e^#v^%PD!bg(VKKPW!vr}^M^KzmSjZ_5V3JIXT&!|LZ7Q;3qcMkHQM9bp&Eh(Lsql zW!Wx6RrnVbVnrOdSE z4O~m*5X>l_SAPe;mq%g@A(X4_>hH@Mf|=;3{Sd6sqzy@#*ocfF@c3{) zo@+*A9meMHzdm2Sy4taaV5X*8_7Hg6d`>Ecz$?^`fK?fQ50|gre?EV?3qG8`+;L~Y z%#+-Kmv`5XKb^B)QWZlm>y}2c3lI#Z0L5AQz_?~;_~O-ARWSBfjcx_}Z&$Wg`N#kG zphvA#gj}~~1?NV-5pj0;>hB}pe%+Qx6H*5c;2S&Zf#>}Lc^snDK+H~WPo+EPx}z5F zlkKE6_j`Hz`TeW2m!IFgef_u3@87*+{U3~_Q7upZHuk4$7z2`mv6%?MQ1`Ny*&f@q z_E_7Y=^ehn$QVa%jzMLnFu>*s69mx1F$4H#2ItT3-+j2?5dX{|z9K@mJyF#e6lzN* zBm~>9uu!BM+gH9eGGYqz^027ljC1fH zrT8Wm%2TVgRm!y*w(m!|q3imWh^2}B) z7inCM?3P5fm;Ue(3#Xg1^5U2O&8T3D_t7B#pBx{R^#9LJHugVjDO=#Rn(MDF{{xGo zHr;|*(Fy_mZ1GU@bCo9ZpcVrEl0wwaRXF^5gID5TTWJ`gvJ*Pq|J1eGD7u!7cq^fM56yE~vdV7@bg zx!m;)kxcigF3ooQBS=WGjs$QjizP5dz>w2*1VZ{rvt1J`6Uzl;3$3Clq1n8v$R2_I z%NPM`eHYyRi7LrWD2Lv?1m_oX49q_VhAYp4BN*?O=YX}ov?-{VgDgw_j9`dT+LjhI zrLZvPz-S%EjMWgS!$1OYN;{8jr9mx<$dBKT_^HQa%aHPza0N?|Nt4l^l4FS{4hArT zUf9j6W6s|Jn`-9;qc$V(r{SN5&I`7QM<5~rjM$&qTt6D&&nsIY+`U1lY8zNr9JK8nhrGp@A{b@Ue|5ab zIFL6Pu5%oJc_?4H&TrH}Yf(Js;s_kL&;t8p@Yb-YqPL1m612ak}&>u_Q@NNRSqcwKjk zWdS%y(LZxUGddT5erFinqyo~p7m;r(Ve|ty2$Ebh);|13EqJ^^55sT0_X1e~;0(=3 z`p^Nu2KZ!qB~6K2!5_4wXfVPvoY9&!SnFEp2U50aI8|B~g#2aABJ=^MCfGB@H2~Iu zXUwn`B65F`;yWCn z8}y0>FoK+BFN}+JsHp6}q(-T%ITtp3xJXpvuCd_a>q3-vC^5jO+9O7lRqYWYYSAii z(SckjC<4mDZFgAR+2w(!QafCDMXo#0|rnbX{1w{oetU4>l#Q=t(g$pZn$~?H} zjtLHfS8-jcwGciUaS^6PP=#gSVh&Vr5Snqpt1W^IA1){g0y0Z3QZm6-z=Y-Ok#^W{ zfbeU(ok|Ptl4e{OX8NU6Dcx}~4-!zxm#_7& z#16j&IG+GmPzW9`(|{0(*nMLdh9U$XBOhZx;%eBQK7IS{>giJs;|!%YDC|9VVC2F3 zQ!*0>=t$>2!Z6%tV0;=6z>j$m6_Xf<4)t9`8=s_oGgCMrP~2OOAkfQjVwnDiOe!f3jeaeQ)i}?vJqWx+-3R{D_+z?q_6QJ{bIilGv(iu3EPb z7=|P8@ssnEt!ke!*xBpX{7S(N49oLMsXMI_?^mpoU67&~nq7-zR%(0VIEeBPf$@v8 zi_c@JsvPuwA}K&(9q)>FZ(m(~K70A*{H;#$bdA8ccslsQ+;sT${~1bWIOZ#H2^L^Y z`F{?N4_y1NqvMVJ*ILRJxGLuQaj5>=T7WGU>u;G>U32QhISj^DE90T9l}stdlF?|R zIN(4rm?28x4U$>z7s&!-Kp`6y4tsuc56|z_cB;OHxWsJ%` z=Z$qV0{bDlGmn+Mh}?K<^O+d|#x-qB4pv{x^B>RH1msb4$%FncEBsSq{-2ZMLpT1@ z!QtWN{9i}e0_SYj0h@Lp=Dl->CQW+%*}9h;sJCl$B=sG^#H0YzADZM1tbM8MW7Q}fzD0oT5}F{9Fovy1iuqm_SPJNg6H-K;7Q507Ns0BTYCK2T-)vun1cMn8EZ0WtS*I zL3S2JO_|{<<3?HO;YFSoGu1zP7)8S3T^g~^0U${|cZrQhos%k8X5rxhdVHW3-|AHL zV+TwAEcLa6-X7Zn;Z5M1n563B15*${igvu6$`2r5L$A!{rSB9H5{e|f{F+52?o#P@ z2H*vZ!4%#hFw3J1ClTU}VMOaYN3$e*Xc)0H$6&%91EWDAb{2qE=)xHrj|gxjzIgIe z9z}2A4DCHRw?7ie_P0|MAxK4Nggu@bU;K&7wRfuJXQ%e4*8{*^lvSd%I9-((Ys3TA z53(fkWQP^!qDl{I9D$2A1^97Q$kpm>7=eH0@L_<7exr!;2+STnvmg46qK5np`=Q@( zGQ=OVKmNPakq-i*908nNBQezjB01b%TeMb>!W{nW;j=#a%uKt*$eh}_ut4m4M(WgL zFRYq!VL8JR8CzidOQb9V(>bVGDnQ3)T6LogvElfJ^D zfAwII{$(4T#$V6jaM%=IBbU3uZ^Yv28px52z;FCK*aCk=Q9u|6N5JKav)3XI{nZr4 zx8Q*Yzh4~F3`P;-l>RF_ie50LXTTU7@cZx22R$Is$#cj9IkuvQmn6t%C>Fd1e`YVXq6*2*_J% zLa`SY(glQ!dxlYDn9m4hEKCugTq)GFz}w&=B?-LonSXV}MYTcHqPQ?1TmU8YxS;v< zoU3A8xKI!-zABn=GIT9C6=;tnezAs?-|GKd^|JBT~rV(>8`VQVgI zow#5yg#b=6>HWmeVy+dWmdYw{QL;dNT(~H#ZuQD&fske4qRfiScaDrJ7@V;m7i@$! zi?N`q<`QvX9Q1SG!i$Ka$%;53UKV2>lq?MwC01lk{$lLqaH`_Rh(Q0>%UBgl#6^h} zne$8?`#GGNJz}vKiy)(;4M>?Xn>HZqL=%tS2zo`_BYZhlBGOy60W8A~#sipzG*(A3 zWCP>cL}8aIu7YN19%Oln2AvE^s^KdPNveQURWz`@=l;1OY(3-@P4Y-MD?gAN+(Xfl zI6xqvQ^-(VF?oi2M(;Uz$9T7UOwlfHO1c8(6qN_|=bD8JhYDy^L{JB^kvl)rO_!d3TvF7HVJ~beF`jlbHFz{q`cL9zkB%KM8 z%|w)#uG5qgSG+v0!qRA@0iZBym(P-9rM1>{3E61~tAY;sNXj3JJCK-Q`< zjFDLsWE1?6W)4PRUwq6TD|%?U{`#$R`1M-_%yQlGJ`m?bVKGSsh2YGx062{BSe%pUeMFeC8m?}nq0i5@4vyAMUOHDRvQrcGY6spTc0IHzo%b9-c0 z@w70Ky*MhyP<*=BWO(qpC{n-nZP*{LRNeoY)OgW88tlK04xg3%zYjO|Uu!8_g-*ZY z?QiQV-NpR0%l&q`n(cbux~yx|1{sW8{{scwl38Q3{pE(wqd?E1I)Gx>q*XHTS#y#1 zC4q7Ht^l`#1gNr2Tb>1?L9h+OP@RC2Jc>BDkjfYXJICdG5UstRiUZ6_>33l zGH-C3XVkk!g`qy?nu;0B*s0$iK7018ztaw*I72h*`nka$!glm`Tp@%z0fRv_E2E@H zv@JIEyv4z7K@k>RqpT_E^U@y1)_@wBj28v8GAVKkK<#)ozhHFlNLge8#-`-QmeNP_ z`qi@G`?Resv33U4vWb^voWW%8jzsmGV?qAevw|)eZ#bGoBMvn%S#4v#jO32s&-v^q z&Tvn7LfoQ<1H)>cF^TNogHo+SPpxmktp1xRRs5e8lb6s(1OIn$`s|r&|985H|G%EH z1zz%*?!f#lFFsFuR&IF#c^b|Vr8aWUk$H|0yRBB;a=b1Q?8fL;wAJf92V=3D$2z)W zlA(L6~a#E-m)2h^h_{k8Ud+y#^XENt2H3`h81id*CK>Tw*uA-Zcm zcm>4#fx^1f*X(CxUq|UPXLAI8j7V@RckEJ5!7BQ1s9YEBqlx|>ou0Vz|G~+I{;#EM z6{^EFC%{T$v$Z)6RvMYD$w-Y68_%iGjXbkfUgH_glq{rg5I~EAVunJTcX843!XR5A zlcMwOH$2(bF6j4n9*Y>GfNLhEw*H%sZUn@L_#=k&5jgyLlg7*`RrKGuK3lktM*4s3 z=Knf9INrqnT1(l|48}$R_--YD$3V*&OpLj0rsaA;f=;aQOPun1%!haBixk0ZbEDX% zRMCIKuwvmp8tMOGDgXb$>4yJbOW6WyrZ@Dz2>3;jyqjB){@ZQ+q3J*V(oFgFQUo$& zki;E(vj>x8L-m(ls^~vmVhG?y`;Sum|C7_BXB+yzj~tAjNSMBSboR> zZOlGEd$SKW_~l%azDk>qmH@Vfa%1pen3;E-v4;^q7(O5$@?ui(L){4ZO^BzEAc}EH^}x@TkI~L z2!i)Ef2bn`@Zcl+x52S~(ZmoO)&=7c`2enrLA3lt5v?b;9$@7N*$i;~k|+SaL>aXf zL{%5_0USg*%~1MR9HLbLEV}^rtdH#%;@5i;p+Zrt0VjwIARpx?#vrk4S3qQf45$Gr8i_6xV*n{!FLV(zb88 z0PA+gLMB#_w;M?tfCnFWo`z4|Q-A2cUd2W}7Zc>pr3T;>QIe+tS~iAtyUWI~Zg}Y! zHb7n`hVM{%U8ci}W0D_~~%YwGAc8wlEzYtCj^W>nZLW z01tR@0~6pSBnTR_MuqCA0AHkwSs23uM?t(CfMXtzVl@COg1J%m@oBG%?zAxIQAhN%$$wpKMbxo$CK?9W4xr&q&<3Q-dlVK~V zAp#4lQXP8bLS?)yVz5+)T-oXEfwv^y^L(`T?#8W`A`f)#e>q;R%6Y76?l= zMPUpTIgWW!raktD{;HhnsG@m=0Nw;l@ZJskRb*#sTqe%8D*%%(_N3TS+zTvg3KA01 zF34sCYbj`*Jrskf!Qmh0;=$Da(*Q>31xhnK!2!&czoB#WjDBBF+=+ zGy`R7WtXjqtui`j1j;VcZlO(M3bM0Ez5_ z20mL=so}HTzIj9qH3<$gRoF#HW?Dr^Gr3~*42L6dAfm_pjpW>iS%j^0wl-AQE~3Ou zNEDHKKJ*wT3Cb3RR{-N0l5B}oTzs0%Naao}&;24;r|fH9(-RG7h2aTn1#AI@FEYa! z7j&6m_yaXfwq!0d8AaC{32#3m`~2BH>y|A`#Y2ip*3&IOQeo9n-&Updi(L7RX^ZZo z0o!I|(QgFZ8jt44{ZR(3M5zVyZwDZ*iYHhzm7;8wrxa|fG08ZtD%$cCrF_%fqbS-1 z2}%nfc6{q#j+tHu8hX7g@FU5lVlkzNGCm8(0P0YbJXxQl(MDi}tP-Dp94Y9JTT1fZ zt1lT!V;G&s8A>N`88Ltwv$9YVLe63e`?x+p7#Zk0op>LQM7z$*Iu#H zfZ5mFdHp(N8(zJOfd!co8%le(%}m+1Yeq4}hoU-YvQ6h9E!1kl3KGhWSbo9TX|5_r zQd3%>l4#p`ScR}_+Mk4>xWCc7eUW0f0pS%M>OACf`kyYt@@4p0=4}0Sii4>En|F8} zYzJ$GH6=8wTaqP7)*O~`lUFya3NJ|A?Jn3Ri5L=&!OtJgK|+!|;xg7 zVTwSCWV|c7Q#UM}z*#LuT&=+z!}6$sn!0UO8irMuvv5VT#fK#_4~D@s*#(p>!C+^p z!xC+tU%cR}fM4}1tT>;}xD@rK8I==vRf3jhmO+5`SZCHbk=NBG} zn&r$^F|^Ku={l_UB+p6)Z!0*rB=o81ZcW1)gotK1R_k!Jvt{ntLX%W>Z zc=4CLC+~$iSEzY$9HK8{u#La$S!&*4lTx?T>!=67p3NzY)crMEJxcW=bZYuy+g$4- z@bQ!N*rCHkg{^YN7Jo9ALO--;YlxPwk}1jmKVN)UwhvgN|Nnt||9f zp&B7Ikkuw}od;)EQ>3XUPu0ddsz*R8@XC2r8^Q#68JR0L1!^sP7GyU`UONm2an_X9 zK&GbjN>1S|dXN{}3B+cOV;mQTT~!Q}W+7PbWll!$H*);yl9M5Go9-A%B8u#Vr4`nV zaj_R?nP=HIvkzXX)YS-|3i$D>pw1E zoV|VpKAi6xiV$)A{3Jya`B8j_LktH2neDTtK>wiM{c>y1x!&5`GkwKk@qbH<`DB(x z{%`2U|2sN5*xdiDrEG!A_VJ(QGxlr6@O6v*-NCZ29b+fX*QNk9oz3{X3S8NZYruoPP_xjscL9i67!5a7Z0`HX&EMy|s#YV6af`#k>yBGvkLSX9T z8=_p5T%gA968O)Y-)FtZX+~zMH=m-v5&~}7*M22Bj)cCwz*{WGhx)CF@!?h5*#rvu z)?gJ_RH{=U@k*m!5pSu^yF#dp1hz%d1R9XhsmFN>ebyc{nc>?OnZ$&U&F(vYx#Yy`(3rT(* zVLE+FviAsv4`*SRB1#c0hhjLt7=eRlhl7LD!QpUlcy!eEd;1t00pl1m-(%BJpOIJT z@T1pP@%CUiI2F}`Z|9^10k^k0Fwt$-LjrivXU>osoBmQl~zm52}5&s^6_}5{NEJM0moru34$DJk7rZ6`j4HQE%|N)MF!-otginK5@-+T| zxO=1<)naXPNx=?=h`uC*qEJO|h)G!CK=lX&TLv7Lby~}{;xbdSieL$H?Bfzey_;dA zIH2!KT2(L9E*XKN;kPZtZpysHC;w}*vZOxh<^O}D;}iG(_xSi|xRL+YQMP~#xVnh= z-_0)2SG295zxic{fmpmOpk|oQjInK5L4b+Hi^;upM|EebOJ9-JXZ{X+DLdxQp0t!w z&F;4NwzH9_uhb$;8IuZJEttJ&DWy)(sYnD>eB05c)mOBgtG|P4+t>Lv#p0y~VO438 zif=m`!1_w<3ac{J{aWa%MOb6Rl=UL4Y+3wOuvUYxn)o8}+l~g#}DAO^DuMwkTq2r9L^^+X_j2JG>OS;bU ztT3tT)Z^*s4`uknOkfmU!{AoxAgD?Sd7--a{r9nFg=q-3r&*Tla-A#P1zC{nf;>!i z24MRvqC_A}uDrtEUywlj^Gf5PoM6BJm$dz zo<2SM@$%j44_B{V|Ly5h5TgK5I#+^UKTO?enC8sZi!dvahUCUDl{D>5PBVr<5`#Pr zQK~sNRuP2&UX#1VOZt`ws|ri8O?LpMZd?i(Py^-}*^}`__?dNby^|B?B?)^-0gJUJS= z@xM=o!%h5$wG@5-1LU+n!t75bd3|hop!|0nDkEhr<`&Ng<@8p6Wl;ui@R7obJB7|7 zZYj)!mH52H4M81vB@O=KsjI5=@UUX$YQa;-bv1bPlUsmyi84PtkOH@t*5JA7{N?A^ zs>fXec&_q%McKA$V5|ktjWs{7Le`EXUr5j8B(^%3tkkx)29KnTmXn^H>xnU#kgyzc zt%|mFjiB3V=wCmMu94t)dGT}W#@;cCuJ!#IxqjJWJLcc0yyMtC{#Yo;MLzC4BRm0- z{pl6CMKQ-FMI23vSSo43+1d2}XYbl}+t#u6f1Rfw+KcTJj{Z1qvNsG&fue`qU9@S@ zwAjD|K}Acn!>KH3L^+LTrf)E>FfTVxG7t|EsRKpQijx9nd*SH7_3;x$EiSIL=+V8^ z=)=krfNs+W2RM&5^nT2$pk1<%!HO3IzPA+GL6*66l#@0M&H1$?8l0aWpRMjRvzBFEN)rk`Jd?ILpuQK z=YP}F$>i6%|KHg@|KD!P<1$O<-N*kKdjpE1^$IMd4dxuU+t9)8gH~loe?Q7VnKF4R zDhKh|<3+PlTGb$FuVo9IeE4Jz>K}f)iUwIG=EaBuHuo-@@9vhTh=&jBD5Uz`tm85EH^FJ6^)NpRfF_h5Gz5-n=yKc(kR)iP@Ip!i!6!XCi5|P zo6PI$f%@@)O$ZG+xS#KWuybtTt!=`A(YSE0@509<1n(>cuUb_m9GHv?yXT;2_;Z)d z9UD~{aiB4dRG2I+<&qI1O~MasOUHImdCWxp_~C;Q{cavI4t^oP1ltfCTqh(yM|p9! zyCO$}at9Z(NV(}!4U7X5Y(sFs^hHkeI~;#&>3B{YbP&)Yufc=hzy#Y69At>(Fw3Go9 z^n>bM=)=}ml?ewq%2s>}#@{m-ppPiSNhs2HRIRdc{_N-gdQr4POiqpuD-KMs4Z%Ud z_45crqDf$5y^6JEk^2FFJ>Yt(vgE+SX&0tDcF}Ceqn(IO4}6@`%o7DpVo!)Q2jczf z-RJer`@x$M3ESEmxpLvofp=N_EGFgFf5M#f4Y z9R;}q;A@m< zg3JBUm_NuI^n%kDI}SYB-B5OeGKcZNLO)=h4_e?&4vxUN1aI^n-h!!#@31=u(r;j9 zL%9wxQ)g^n(ilk9Gpn)OC&=c$e(gm4xX5^aI9$S<9U{NYXBQ z#qQUcS~&R72~S&<69-;%mhvF_0pkEz&Y>JRV0JM*2fLX!wsFuzw><}W5~0k%p6I44 zcg-Lrp;S}4ygF>*;Ijd?fjRJ!wD{SK{~q*RFaa*L{ucs#fy)P@SASo_XbfK6Vv?K0 zL0WV0t;1QP#=(F8^Y8y>jouXr-_XYQD#wo`jyB*s^^vUT`3vwVLH?E`biHi%P67qy zMuRm8Xt8MBIePaqN0kGH%lAg-$*WrwtaDV%iY|g{6s{vAvMyIg4!7W-`fY7Z8`y%N za?rr#d&X56S(evvj#ubK1PM9s`1%fPS*}Z@--btz4y78nW!V7R5F8K`tTUGWlWr{7 z&cQaCqD)0iT7g0{dp5y#2OM|{LiZl8b1>Yy;GdrT)}tl~4%)C-mTfqAaSh`o;%1zI z!jkSTN1tJ}X1lmQgZ?k%wLbP>P^f%iBJBlI0+6awj!3&ZfdA=rX+_JLl<+JRG(B8#AB$Hk(auqn#7hG5q^SPM6E+Auc>??x zQTR1YvivLc)bOhSMdhjT0J%bLlzc}d7eR?1X$q)Ok^!G( zgTf0bD}2FfobVWJ6drKIvbxLcuYINHZSc<@Mdb)yGhZ z;bIrjlYeqqJ#mxD2xgl$MchmVO`K8%2pxgT%3Jno6qdh5>J;ujdo>EOB>r167su%_ z@wW{!wgheQk@I3h9$E1Jv7&pJ;m7spo}@!3>aOg^t9Z{H)e5X$B_8 z$5J)inWAdW5x{A2kthCF`(IRorR&)}s|{P+^r9qyQSBtjlMF6V?Oa39#7q#4Xw^uY z!{FOGCCa(-`#w|r5UR84MkoMCtI0BgBQWvkzuK{5?^rq}mLSzTV>0o`O(3?TI|`E( z#IeWU+yk|dUKkU;l@aGw|r-QOo5hjEQ)k4 z=Xh(qseqavVt5Wg@#=Wm+$MlO!oBU24w#{iT{X0bc@Q~Tv^^iEj&a)EF*KqaS#CU`p*w~~lojL@W-y9Sgvn|M$hr|j zBgzVLo=5yOc)p<1*cg**mR!OCvOhUF?)>g)L|H+GL5^=w>q|Uz$IyssLN?k~wlsOt zePzoi_}a#@W!v>z%MM`iVjIf}9ke(i)Dt!1STQB3a*c7NpqZ5HvrrerrHzmA4A74; zJ=y-*n}HJsr1J|i1AK4V_5r=JNy%f;44iUA@{l?Md>E~rBjR%DMH7cQI&vkpwcAvu zYi2?v{&QBvdsfNY?4E69+0#DUCxHKZq<{kd{IRzr?5?!V{}sdj_A+|r|I=U3PHXf3 zv*V}J{rrCyE&HE9TT;Q7ESY3@b*g#Zy=6}&#i@isomhHR%^rPqMkQvl5M5WtxEqRbKSnLDY7)5e7D zXQ?jX-?b_)eNF&XF4G7Hu+TpF-#3`xBv#ewDOac2bC>}!IIvsfMkgu{A0zhp|T^xHzB-C{4R{d|lwV(ep(Ep~*{J&36_Uk`8DUX5c+K;); zCuw;03Z0AY=AyPa=wxnIT64`yG0xhXWt|MNb{4GC4r_0Lb+WxW+SlxjtxjfEOYSCZ z+!@(boh+($3RY=IwKt(U8Bd3JvPRa@pW03;%xFKOU6H1f8%hTgMC`4G`?4?lvM-M1 Re*pjh|NkFqKU@GF2LS(IB literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/mineos/ci/basic-values.yaml b/library/ix-dev/community/mineos/ci/basic-values.yaml new file mode 100644 index 0000000000..d002e31d08 --- /dev/null +++ b/library/ix-dev/community/mineos/ci/basic-values.yaml @@ -0,0 +1,12 @@ +mineosConfig: + username: myuser + password: mypass + +mineosStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +mineosNetwork: + mineosPortRangeStart: 30021 + mineosPortRangeEnd: 30025 diff --git a/library/ix-dev/community/mineos/ci/https-values.yaml b/library/ix-dev/community/mineos/ci/https-values.yaml new file mode 100644 index 0000000000..24888dc7ac --- /dev/null +++ b/library/ix-dev/community/mineos/ci/https-values.yaml @@ -0,0 +1,100 @@ +mineosConfig: + username: myuserhttps + password: mypasshttps + +mineosStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +mineosNetwork: + useHTTPS: true + mineosPortRangeStart: 30021 + mineosPortRangeEnd: 30021 + certificateID: 1 + +ixCertificates: + "1": + certificate: | + -----BEGIN CERTIFICATE----- + MIIEdjCCA16gAwIBAgIDYFMYMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMzU0WhcNMjMxMjAzMjMyMzU0WjBuMQswCQYDVQQDDAJhZDEL + MAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxDTALBgNVBAcMBGFzZGYxDTALBgNV + BAoMBGFkc2YxDTALBgNVBAsMBGFzZGYxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7+1xOHRQyOnQTHFcrdasX + Zl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/AbkH7oVFWC1 + P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI4vQCdYgW + 2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2dNgsxKU0H + PGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB+Zie331t + AzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7A/FuDVg3 + AgMBAAGjggEdMIIBGTAnBgNVHREEIDAehwTAqAADhwTAqAAFhwTAqAC2hwTAqACB + hwTAqACSMB0GA1UdDgQWBBQ4G2ff4tgZl4vmo4xCfqmJhdqShzAMBgNVHRMBAf8E + AjAAMIGYBgNVHSMEgZAwgY2AFLlYf9L99nxJDcpCM/LT3V5hQ/a3oXCkbjBsMQww + CgYDVQQDDANhc2QxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQH + DAJhZjENMAsGA1UECgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkB + FgdhQGEuY29tggNgUxcwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwEwDgYDVR0PAQH/ + BAQDAgWgMA0GCSqGSIb3DQEBCwUAA4IBAQA6FpOInEHB5iVk3FP67GybJ29vHZTD + KQHbQgmg8s4L7qIsA1HQ+DMCbdylpA11x+t/eL/n48BvGw2FNXpN6uykhLHJjbKR + h8yITa2KeD3LjLYhScwIigXmTVYSP3km6s8jRL6UKT9zttnIHyXVpBDya6Q4WTMx + fmfC6O7t1PjQ5ZyVtzizIUP8ah9n4TKdXU4A3QIM6WsJXpHb+vqp1WDWJ7mKFtgj + x5TKv3wcPnktx0zMPfLb5BTSE9rc9djcBG0eIAsPT4FgiatCUChe7VhuMnqskxEz + MymJLoq8+mzucRwFkOkR2EIt1x+Irl2mJVMeBow63rVZfUQBD8h++LqB + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIEhDCCA2ygAwIBAgIDYFMXMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMDQ1WhcNMzEwODI4MjMyMDQ1WjBsMQwwCgYDVQQDDANhc2Qx + CzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQHDAJhZjENMAsGA1UE + CgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkBFgdhQGEuY29tMIIB + IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq//c0hEEr83CS1pMgsHX50jt + 2MqIbcf63UUNJTiYpUUvUQSFJFc7m/dr+RTZvu97eDCnD5K2qkHHvTPaPZwY+Djf + iy7N641Sz6u/y3Yo3xxs1Aermsfedh48vusJpjbkT2XS44VjbkrpKcWDNVpp3Evd + M7oJotXeUsZ+imiyVCfr4YhoY5gbGh/r+KN9Wf9YKoUyfLLZGwdZkhtX2zIbidsL + Thqi9YTaUHttGinjiBBum234u/CfvKXsfG3yP2gvBGnlvZnM9ktv+lVffYNqlf7H + VmB1bKKk84HtzuW5X76SGAgOG8eHX4x5ZLI1WQUuoQOVRl1I0UCjBtbz8XhwvQID + AQABo4IBLTCCASkwLQYDVR0RBCYwJIcEwKgABYcEwKgAA4cEwKgAkocEwKgAtYcE + wKgAgYcEwKgAtjAdBgNVHQ4EFgQUuVh/0v32fEkNykIz8tPdXmFD9rcwDwYDVR0T + AQH/BAUwAwEB/zCBmAYDVR0jBIGQMIGNgBS5WH/S/fZ8SQ3KQjPy091eYUP2t6Fw + pG4wbDEMMAoGA1UEAwwDYXNkMQswCQYDVQQGEwJVUzENMAsGA1UECAwEYXNkZjEL + MAkGA1UEBwwCYWYxDTALBgNVBAoMBGFzZGYxDDAKBgNVBAsMA2FzZDEWMBQGCSqG + SIb3DQEJARYHYUBhLmNvbYIDYFMXMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF + BQcDAjAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKEocOmVuWlr + zegtKYMe8NhHIkFY9oVn5ym6RHNOJpPH4QF8XYC3Z5+iC5yGh4P/jVe/4I4SF6Ql + PtofU0jNq5vzapt/y+m008eXqPQFmoUOvu+JavoRVcRx2LIP5AgBA1mF56CSREsX + TkuJAA9IUQ8EjnmAoAeKINuPaKxGDuU8BGCMqr/qd564MKNf9XYL+Fb2rlkA0O2d + 2No34DQLgqSmST/LAvPM7Cbp6knYgnKmGr1nETCXasg1cueHLnWWTvps2HiPp2D/ + +Fq0uqcZLu4Mdo0CPs4e5sHRyldEnRSKh0DVLprq9zr/GMipmPLJUsT5Jed3sj0w + M7Y3vwxshpo= + -----END CERTIFICATE----- + privatekey: | + -----BEGIN PRIVATE KEY----- + MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC7+1xOHRQyOnQT + HFcrdasXZl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/Abk + H7oVFWC1P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI + 4vQCdYgW2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2d + NgsxKU0HPGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB + +Zie331tAzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7 + A/FuDVg3AgMBAAECggEAapt30rj9DitGTtxAt13pJMEhyYxvvD3WkvmJwguF/Bbu + eW0Ba1c668fMeRCA54FWi1sMqusPS4HUqqUvk+tmyAOsAF4qgD/A4MMSC7uJSVI5 + N/JWhJWyhCY94/FPakiO1nbPbVw41bcqtzU2qvparpME2CtxSCbDiqm7aaag3Kqe + EF0fGSUdZ+TYl9JM05+eIyiX+UY19Fg0OjTHMn8nGpxcNTfDBdQ68TKvdo/dtIKL + PLKzJUNNdM8odC4CvQtfGMqaslwZwXkiOl5VJcW21ncj/Y0ngEMKeD/i65ZoqGdR + 0FKCQYEAGtM2FvJcZQ92Wsw7yj2bK2MSegVUyLK32QKBgQDe8syVCepPzRsfjfxA + 6TZlWcGuTZLhwIx97Ktw3VcQ1f4rLoEYlv0xC2VWBORpzIsJo4I/OLmgp8a+Ga8z + FkVRnq90dV3t4NP9uJlHgcODHnOardC2UUka4olBSCG6zmK4Jxi34lOxhGRkshOo + L4IBeOIB5g+ZrEEXkzfYJHESRQKBgQDX2YhFhGIrT8BAnC5BbXbhm8h6Bhjz8DYL + d+qhVJjef7L/aJxViU0hX9Ba2O8CLK3FZeREFE3hJPiJ4TZSlN4evxs5p+bbNDcA + 0mhRI/o3X4ac6IxdRebyYnCOB/Cu94/MzppcZcotlCekKNike7eorCcX4Qavm7Pu + MUuQ+ifmSwKBgEnchoqZzlbBzMqXb4rRuIO7SL9GU/MWp3TQg7vQmJerTZlgvsQ2 + wYsOC3SECmhCq4117iCj2luvOdihCboTFsQDnn0mpQe6BIF6Ns3J38wAuqv0CcFd + DKsrge1uyD3rQilgSoAhKzkUc24o0PpXQurZ8YZPgbuXpbj5vPaOnCdBAoGACYc7 + wb3XS4wos3FxhUfcwJbM4b4VKeeHqzfu7pI6cU/3ydiHVitKcVe2bdw3qMPqI9Wc + nvi6e17Tbdq4OCsEJx1OiVwFD9YdO3cOTc6lw/3+hjypvZBRYo+/4jUthbu96E+S + dtOzehGZMmDvN0uSzupSi3ZOgkAAUFpyuIKickMCgYAId0PCRjonO2thn/R0rZ7P + //L852uyzYhXKw5/fjFGhQ6LbaLgIRFaCZ0L2809u0HFnNvJjHv4AKP6j+vFQYYY + qQ+66XnfsA9G/bu4MDS9AX83iahD9IdLXQAy8I19prAbpVumKegPbMnNYNB/TYEc + 3G15AKCXo7jjOUtHY01DCQ== + -----END PRIVATE KEY----- diff --git a/library/ix-dev/community/mineos/disable_upgrade_strategy b/library/ix-dev/community/mineos/disable_upgrade_strategy new file mode 100755 index 0000000000..fe8f0f89bb --- /dev/null +++ b/library/ix-dev/community/mineos/disable_upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'latest') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/mineos/item.yaml b/library/ix-dev/community/mineos/item.yaml new file mode 100644 index 0000000000..9ae274a041 --- /dev/null +++ b/library/ix-dev/community/mineos/item.yaml @@ -0,0 +1,7 @@ +icon_url: https://camo.githubusercontent.com/bfcc53b6de495c0f2d9d5699afea18b7319529933c5cd38f1e0cf55377df725f/68747470733a2f2f7669676e65747465322e77696b69612e6e6f636f6f6b69652e6e65742f6c6f74722d6d696e6563726166742d6d6f642d6578696c65732f696d616765732f662f66322f4d696e6563726166745f7365727665725f73657475702e706e672f7265766973696f6e2f6c61746573743f63623d3230313630393131313732353537 +screenshots: + - https://i.ytimg.com/vi/06XGie8SBnE/maxresdefault.jpg +categories: + - games +tags: + - minecraft diff --git a/library/ix-dev/community/mineos/metadata.yaml b/library/ix-dev/community/mineos/metadata.yaml new file mode 100644 index 0000000000..67a4ac10f6 --- /dev/null +++ b/library/ix-dev/community/mineos/metadata.yaml @@ -0,0 +1,18 @@ +runAsContext: + - userName: root + groupName: root + gid: 0 + uid: 0 + description: MineOS runs as root user +capabilities: + - name: CHOWN + description: MineOS requires this ability to change ownership of files. + - name: DAC_OVERRIDE + description: MineOS requires this ability to bypass file permissions. + - name: FOWNER + description: MineOS requires this ability to bypass file permissions for it's sub-processes. + - name: SETGID + description: MineOS requires this ability to switch group for sub-processes. + - name: SETUID + description: MineOS requires this ability to switch user for sub-processes. +hostMounts: [] diff --git a/library/ix-dev/community/mineos/questions.yaml b/library/ix-dev/community/mineos/questions.yaml new file mode 100644 index 0000000000..e8a705aa1c --- /dev/null +++ b/library/ix-dev/community/mineos/questions.yaml @@ -0,0 +1,231 @@ +groups: + - name: MineOS Configuration + description: Configure MineOS + - name: User and Group Configuration + description: Configure User and Group for MineOS + - name: Network Configuration + description: Configure Network for MineOS + - name: Storage Configuration + description: Configure Storage for MineOS + - name: Resources Configuration + description: Configure Resources for MineOS + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: mineosConfig + label: "" + group: MineOS Configuration + schema: + type: dict + attrs: + - variable: username + label: Username + description: The username for MineOS WebUI. + schema: + type: string + empty: false + required: true + valid_chars: '^[a-zA-Z0-9]+$' + valid_chars_error: | + Username can only contain alphanumeric characters [0-9, a-z, A-Z]. + - variable: password + label: Password + description: The password for MineOS WebUI. + schema: + type: string + empty: false + required: true + private: true + - variable: terminationGracePeriodSeconds + label: Stop Grace Period + description: | + The time in seconds given to MineOS to stop before it is killed. + Killing a MineOS server without a grace period can cause data corruption. + schema: + type: int + empty: false + min: 30 + required: true + default: 600 + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for MineOS. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: mineosID + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that MineOS files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that MineOS files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + + - variable: mineosNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: WebUI Port + description: The port for MineOS WebUI + schema: + type: int + default: 30000 + min: 9000 + max: 65535 + required: true + - variable: mineosPortRangeStart + label: Port Range Start + description: | + The start of the port range for MineOS servers.
+ It will open both TCP and UDP ports. + schema: + type: int + default: 30001 + min: 9000 + max: 65535 + required: true + - variable: mineosPortRangeEnd + label: Port Range End + description: | + The end of the port range for MineOS servers.
+ It will open both TCP and UDP ports.
+ Keep in mind that the port range can be at max 10 ports. + schema: + type: int + default: 30002 + min: 9000 + max: 65535 + required: true + - variable: useHTTPS + label: Use HTTPS + description: | + Enable HTTPS for MineOS WebUI.
+ If enabled, and you don't specify a certificate,
+ a self-signed certificate will be generated. + schema: + type: boolean + default: false + - variable: certificateID + label: Certificate + description: The certificate to use for MineOS WebUI + schema: + show_if: [["useHTTPS", "=", true]] + type: int + "null": true + $ref: + - "definitions/certificate" + + - variable: mineosStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: data + label: MineOS Data Storage + description: The path to store MineOS Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: data + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + + - variable: resources + label: Resources Configuration + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for MineOS. + schema: + type: string + default: 4000m + required: true + - variable: memory + label: Memory + description: Memory limit for MineOS. + schema: + type: string + default: 8Gi + required: true diff --git a/library/ix-dev/community/mineos/templates/NOTES.txt b/library/ix-dev/community/mineos/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/mineos/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/mineos/templates/_mineos.tpl b/library/ix-dev/community/mineos/templates/_mineos.tpl new file mode 100644 index 0000000000..531e97ce4f --- /dev/null +++ b/library/ix-dev/community/mineos/templates/_mineos.tpl @@ -0,0 +1,134 @@ +{{- define "mineos.workload" -}} +workload: + mineos: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: false + # Upstream recommends a large termination grace period + terminationGracePeriodSeconds: {{ .Values.mineosConfig.terminationGracePeriodSeconds }} + securityContext: + fsGroup: {{ .Values.mineosID.group }} + containers: + mineos: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + capabilities: + add: + - CHOWN + - DAC_OVERRIDE + - FOWNER + - SETGID + - SETUID + env: + SERVER_PORT: {{ .Values.mineosNetwork.webPort }} + USER_UID: {{ .Values.mineosID.user }} + GROUP_GID: {{ .Values.mineosID.group }} + USER_NAME: {{ .Values.mineosConfig.username }} + USER_PASSWORD: {{ .Values.mineosConfig.password }} + # Creates a group with the same name as the user + GROUP_NAME: {{ .Values.mineosConfig.username }} + USE_HTTPS: {{ .Values.mineosNetwork.useHTTPS }} + fixedEnv: + PUID: {{ .Values.mineosID.user }} + {{ with .Values.mineosConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: tcp + port: {{ .Values.mineosNetwork.webPort }} + readiness: + enabled: true + type: tcp + port: {{ .Values.mineosNetwork.webPort }} + startup: + enabled: true + type: tcp + port: {{ .Values.mineosNetwork.webPort }} + +{{/* Service */}} +service: + mineos: + enabled: true + primary: true + type: NodePort + targetSelector: mineos + ports: + webui: + enabled: true + primary: true + port: {{ .Values.mineosNetwork.webPort }} + nodePort: {{ .Values.mineosNetwork.webPort }} + targetSelector: mineos + game: + enabled: true + type: NodePort + targetSelector: mineos + ports: + {{- $start := (.Values.mineosNetwork.mineosPortRangeStart | int) -}} + {{- $end := (.Values.mineosNetwork.mineosPortRangeEnd | int) -}} + {{- $ports := (untilStep $start ($end | add1 | int) 1) -}} + {{- range $idx := $ports }} + port-{{ $idx }}-tcp: + enabled: true + primary: {{ eq $idx $start }} + port: {{ $idx }} + nodePort: {{ $idx }} + targetSelector: mineos + port-{{ $idx }}-udp: + enabled: true + primary: false + port: {{ $idx }} + nodePort: {{ $idx }} + protocol: udp + targetSelector: mineos + {{- end }} + +{{/* Persistence */}} +persistence: + data: + enabled: true + type: {{ .Values.mineosStorage.data.type }} + datasetName: {{ .Values.mineosStorage.data.datasetName | default "" }} + hostPath: {{ .Values.mineosStorage.data.hostPath | default "" }} + targetSelector: + mineos: + mineos: + mountPath: /var/games/minecraft + + {{- if and .Values.mineosNetwork.useHTTPS .Values.mineosNetwork.certificateID }} + cert: + enabled: true + type: secret + objectName: mineos-cert + defaultMode: "0600" + items: + - key: tls.key + path: mineos.key + - key: tls.crt + path: mineos.crt + targetSelector: + mineos: + mineos: + mountPath: /etc/ssl/certs + readOnly: true + +scaleCertificate: + mineos-cert: + enabled: true + id: {{ .Values.mineosNetwork.certificateID }} + {{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/mineos/templates/_portal.tpl b/library/ix-dev/community/mineos/templates/_portal.tpl new file mode 100644 index 0000000000..6c5c76e67f --- /dev/null +++ b/library/ix-dev/community/mineos/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "mineos.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.mineosNetwork.webPort | quote }} + protocol: {{ ternary "https" "http" .Values.mineosNetwork.useHTTPS }} + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/mineos/templates/_validation.tpl b/library/ix-dev/community/mineos/templates/_validation.tpl new file mode 100644 index 0000000000..76f26a4183 --- /dev/null +++ b/library/ix-dev/community/mineos/templates/_validation.tpl @@ -0,0 +1,17 @@ +{{- define "mineos.validation" -}} + {{- $start := (.Values.mineosNetwork.mineosPortRangeStart | int) -}} + {{- $end := (.Values.mineosNetwork.mineosPortRangeEnd | int) -}} + + {{- if gt $start $end -}} + {{- fail "MineOS - Port range start cannot be greater than port range end." -}} + {{- end -}} + + {{- if gt (sub $end $start) 10 -}} + {{- fail "MineOS - Port range is too large. Max 10 ports are allowed." -}} + {{- end -}} + + {{- if not (mustRegexMatch "^[a-zA-Z0-9]+$" .Values.mineosConfig.username) -}} + {{- fail "MineOS - Username can only contain alphanumeric characters [0-9, a-z, A-Z]." -}} + {{- end -}} + +{{- end -}} diff --git a/library/ix-dev/community/mineos/templates/common.yaml b/library/ix-dev/community/mineos/templates/common.yaml new file mode 100644 index 0000000000..1539a83117 --- /dev/null +++ b/library/ix-dev/community/mineos/templates/common.yaml @@ -0,0 +1,10 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- include "mineos.validation" $ -}} +{{- $_ := mustMergeOverwrite .Values (include "mineos.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "mineos.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/mineos/upgrade_info.json b/library/ix-dev/community/mineos/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/mineos/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/mineos/values.yaml b/library/ix-dev/community/mineos/values.yaml new file mode 100644 index 0000000000..3c265ea968 --- /dev/null +++ b/library/ix-dev/community/mineos/values.yaml @@ -0,0 +1,28 @@ +image: + repository: hexparrot/mineos + pullPolicy: IfNotPresent + tag: latest + +resources: + limits: + cpu: 4000m + memory: 8Gi + +mineosConfig: + username: '' + password: '' + terminationGracePeriodSeconds: 240 + additionalEnvs: [] +mineosID: + user: 568 + group: 568 +mineosNetwork: + webPort: 30000 + mineosPortRangeStart: 30021 + mineosPortRangeEnd: 30022 + useHTTPS: false + certificateID: 0 +mineosStorage: + data: + type: ixVolume + datasetName: data