From 53e91365123f44e07db73cff883f96a8d8bcccec Mon Sep 17 00:00:00 2001 From: Kelly Shutt <10223024+CompPhy@users.noreply.github.com> Date: Mon, 29 Jan 2024 07:14:38 -0500 Subject: [PATCH] Adds netboot.xyz (#2021) * First cut to add netboot.xyz in community charts. * Fix some linting issues, and things we don't need. * Suggested version changes. * Fix OEF * Adjust port numbers. * Adjust user to match container image. * Update storage config. * Set targetPort to match container image. * Default hostNetwork to false. * Update library/ix-dev/community/netbootxyz/ci/basic-values.yaml Suggested fix. Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update library/ix-dev/community/netbootxyz/templates/_persistence.tpl Fix naming that was copied from elsewhere. Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update helm dependencies. * Configure NGINX to port 8080 and now we can default hostNetwork to true. Also, run as root so the container can start properly. * Streamline some things, as per suggestions. * Remove permissions handling because the image handles this already. * Fix tftpOpts list type. * Update to common 1.2.9 * Fix EOF * Remove permissions handling because the image handles this already. * Fix TFTPD Options * Fix upgrade strategy. * Update library/ix-dev/community/netbootxyz/ci/basic-values.yaml * Update library/ix-dev/community/netbootxyz/ci/basic-values.yaml * Fix capabilities. * Update capabilities and add some emptyDirs Empty dirs added to reduce the time needed of chowning some dirs on startup --------- Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Co-authored-by: Stavros kois --- .../ix-dev/community/netbootxyz/Chart.lock | 6 + .../ix-dev/community/netbootxyz/Chart.yaml | 30 ++ library/ix-dev/community/netbootxyz/README.md | 3 + .../ix-dev/community/netbootxyz/app-readme.md | 3 + .../netbootxyz/charts/common-1.2.9.tgz | Bin 0 -> 63534 bytes .../community/netbootxyz/ci/basic-values.yaml | 10 + library/ix-dev/community/netbootxyz/item.yaml | 10 + .../ix-dev/community/netbootxyz/metadata.yaml | 22 ++ .../community/netbootxyz/questions.yaml | 321 ++++++++++++++++++ .../community/netbootxyz/templates/NOTES.txt | 1 + .../netbootxyz/templates/_netboot.tpl | 63 ++++ .../netbootxyz/templates/_persistence.tpl | 47 +++ .../netbootxyz/templates/_portal.tpl | 12 + .../netbootxyz/templates/_service.tpl | 34 ++ .../netbootxyz/templates/common.yaml | 11 + .../community/netbootxyz/upgrade_info.json | 1 + .../community/netbootxyz/upgrade_strategy | 31 ++ .../ix-dev/community/netbootxyz/values.yaml | 31 ++ 18 files changed, 636 insertions(+) create mode 100644 library/ix-dev/community/netbootxyz/Chart.lock create mode 100644 library/ix-dev/community/netbootxyz/Chart.yaml create mode 100644 library/ix-dev/community/netbootxyz/README.md create mode 100644 library/ix-dev/community/netbootxyz/app-readme.md create mode 100644 library/ix-dev/community/netbootxyz/charts/common-1.2.9.tgz create mode 100644 library/ix-dev/community/netbootxyz/ci/basic-values.yaml create mode 100644 library/ix-dev/community/netbootxyz/item.yaml create mode 100644 library/ix-dev/community/netbootxyz/metadata.yaml create mode 100644 library/ix-dev/community/netbootxyz/questions.yaml create mode 100644 library/ix-dev/community/netbootxyz/templates/NOTES.txt create mode 100644 library/ix-dev/community/netbootxyz/templates/_netboot.tpl create mode 100644 library/ix-dev/community/netbootxyz/templates/_persistence.tpl create mode 100644 library/ix-dev/community/netbootxyz/templates/_portal.tpl create mode 100644 library/ix-dev/community/netbootxyz/templates/_service.tpl create mode 100644 library/ix-dev/community/netbootxyz/templates/common.yaml create mode 100644 library/ix-dev/community/netbootxyz/upgrade_info.json create mode 100644 library/ix-dev/community/netbootxyz/upgrade_strategy create mode 100644 library/ix-dev/community/netbootxyz/values.yaml diff --git a/library/ix-dev/community/netbootxyz/Chart.lock b/library/ix-dev/community/netbootxyz/Chart.lock new file mode 100644 index 0000000000..17f0402d36 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.2.9 +digest: sha256:af1a9a1f87e3e48453c9f25f909f5ebcd7fa6e25162b7b425448ba752bcdbc5c +generated: "2024-01-23T17:10:13.3434522-05:00" diff --git a/library/ix-dev/community/netbootxyz/Chart.yaml b/library/ix-dev/community/netbootxyz/Chart.yaml new file mode 100644 index 0000000000..aec38bd43f --- /dev/null +++ b/library/ix-dev/community/netbootxyz/Chart.yaml @@ -0,0 +1,30 @@ +name: netbootxyz +description: netboot.xyz lets you PXE boot various operating system installers or utilities from a single tool over the network. +annotations: + title: netbootxyz +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 2.0.76 +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.2.9 +home: https://github.com/truenas/charts/tree/master/community/netbootxyz +icon: https://media.sys.truenas.net/apps/netbootxyz/icons/icon.svg +sources: + - https://github.com/truenas/charts/tree/master/community/netbootxyz + - https://github.com/netbootxyz/docker-netbootxyz + - https://netboot.xyz +keywords: + - tftp + - network + - pxe + - netboot + - netbootxyz + - netboot.xyz diff --git a/library/ix-dev/community/netbootxyz/README.md b/library/ix-dev/community/netbootxyz/README.md new file mode 100644 index 0000000000..8811ed20a1 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/README.md @@ -0,0 +1,3 @@ +# netboot.xyz + +[netboot.xyz](https://netboot.xyz) lets you PXE boot various operating system installers or utilities from a single tool over the network. diff --git a/library/ix-dev/community/netbootxyz/app-readme.md b/library/ix-dev/community/netbootxyz/app-readme.md new file mode 100644 index 0000000000..8811ed20a1 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/app-readme.md @@ -0,0 +1,3 @@ +# netboot.xyz + +[netboot.xyz](https://netboot.xyz) lets you PXE boot various operating system installers or utilities from a single tool over the network. diff --git a/library/ix-dev/community/netbootxyz/charts/common-1.2.9.tgz b/library/ix-dev/community/netbootxyz/charts/common-1.2.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c4d2a1d1c2ac97e444dd9b567e9a6197495d5dd4 GIT binary patch literal 63534 zcmV)mK%T!JiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POvFbK5w!Fb>b(smgc2!*T9d{n)a+&-k`8uiJ5_eJ6{{cDmnt zbMvHN5|TKk2!?>|9t`ySv6!;K_BNJ{{Ms5{eB$AFaf8K!UPWMI&$^!{0#^N*A85-~z^1o|)`NWQy@|Amgg_VbvJEDRAL zFL8tfQ~+#(O9Z1o@|dF6X~-)PigP$XrwJtF2n0b1emp{WOjXq+o}d&F^%H zDE@}P+7X}F4y5C3MxgeqVA`pM>7ZAOtIFjYkKh1tICGR?5>uStt7SmppjZ*(B)Pyz z9Nr&+^ZqMLFLFdsN?FS{kPOeg&9E zqK}k!8e%DL$i;T?=KR?a*gyEI`1$7L$<;rOK+x+6Bmt0*(-ZOvr2* zwfVc}IUZ;FO9Z3WX>!jR_%%+D5Nq_NV3Odwi#(ph2^yd?62b%uF{+?djL69Ek@1?K zFvO$mBFFtWLB$RdBG2VGWqU%>TJbG}8N7*;n8v820x*h>z}t7~XO!b|Gcq!G^5O-b z102cMeP@{R&FK)P1EePEHAmaan2aC|hZ5p(mL+I}QVJ7Zg_K>BdlJ$_zNnnn91%Ru zLkWKpkK%&thS~TC?DcxRk@!7ABfh@=DoA{eK8z7DOK;m{_j@mS;a9((KRZ8pe|mCp zRqz9tBsG9#IC`B4*2pTL6y7B0N^q2eqG~Rq_1L%@==`fCZFdpL>DF@-?asY6jMY5 zYWbghNJ9i8w(CBNq5K*Afszo95TF=b=VSEh-)-y#@DpEOd~RP?#if zIsl(Ofv(VcPfC%d%k>}djSgc1V3vUprr-vFJ|3qLfV5J{VJPaVE`AvgI6=+T z6rcCSpkvkuxET*XoECj-fGk0fAi#(QfGLOx86&;3QvHII&2|jaZi-53%fy|3;S_-} zK@mU`l;7VCQI1&aNgT3;|M=1M{~Uog*QeI3vL&Bj7#Ukfy%aK~QC^CC7HQ}2Jf$@; z(A=BldnLF28IU2&k)UaR25Q490t@~Ou3tZUeFV<Z6=3HNf`7<45tw zvyT+zDNN2⁢`Tk)+wEhb_9Vg=gL}Oob$@^lQ zBv&ZR5ha>DUcU9z3;Fm*FcTGupI$=4+9+g4-d+_ok{r&UM)IAfQhozNDZAXj(AR1R z6XZ;uY~B0KGgMwsn-#6P_O`0`=NE6Z3ePXzls)i`#>AVP!bH^n+GdN@v!F-X|0o(| z3ERnAFw5Te$7#srp{@5)+w0P7cEezU{cnGJXWz2_9UdI+tn7cwcs_mF`UzYjI?hu9 zpi=Icst4|3I^?#PQfua9yB~jK0(8ctc|zDSdHe`+F*D22<~SSVFhby;_=bt(H!!>% zXMhe7h#-YGOzQk;>&utNk9g0gFiC`1s#f3;`vT%LOvVucLHw~h+3t!}+J#xxl@JDC zJ&HpL0;b#qAShl3f^@$!UT=muibwzg0S;sT0SLC_*Z1OW0D?lb41g5zyTz*x_`(S% z>kzC9Eej@{Bfz=>xX;I^;cu(N+PV}?3gbz^VR+qjrkBP!imb*&5rut*bG-{TB$Uz^ zCgky>a$E*z`~}6_Y>9YnQE&sq^e=?JD4_fc0U57f0Bhk#SG^6GFN?QAkrdoR``w0O1gYw;+Q#N~u;zTa|z<%6|Nj zwKf8AAEXFHDC+91l!N8%b-?d1i6fyLlOq7R0=^+WK7OPY?k1BpDY#M;YmP@opPQ0AUZTDQi#jZ3t!sNpZ;&6^m}B5;4(0>C+=9)` zF+urpjxhzBn?p?Kae_mbu)o0OW(Enl!+CVP_VVQN{N&j$?=N4!zJ7mka&`5`>&s_> zHDc#9sCKDAN!XtAY+W? zKmMbp1fh_Q$$x?f1Ck(=fgSdDiUNC$#s6-DwokHt=pi%F@YE)YY#UVzZyI+l1h_Zn z&jLoEK=54t)d8PD8mCOU0S8j*;?m+TLL~Svd;>~Wye7~qzOhe7$I?W!sfxsXFofhE z=-%N$K}_BVfz@DDao;Z4Eefh~l4RJuAM;r@3)S|2MRArfuC-YbjY=3~VZE#<-G^}k zf)inVA%H?lGL z43Dw|QPg$dMQLP?T6eY9liY*T^NuW@APRH^B_DHpyjV;vCRB}s{Vn&6z>_IfuuWt) zBYF_~{l73jKGl6G1bo2|C8I7GZVfTM4UTk$%2QzT4#k5Z4URyt9r(USh)vaI#!rrd zBfwws6K^I6yF!k2{PYS|g3qI)7Xka393TZp#>8N^? zIJP5BNmYLfmbrW^&1PpdE8A3uXzKAXHIJ+otbI~~*>A6}uD=Aj%%*)bq&8kE#A%8` zx+$GWj`umAvysQ@-0YP5#T5Ef1*g*VZFQ5%|AP{(JMuX!A+*{>g8f zPhM_5x$1PuhorWP&z~hee}!>^A}#j2b=Gb2sKu~rn=k1s`Ws-*(+#;DL-r5Zprv2? zP;2$HewxmIH4Z%U8F0h>ufy%VUGw~Rr+2V-xH|t`#$$>+seRr{hmeAP{1Fl3WNj|- zrc$WeKlrN@>iA!}P^Y9B_Rf%IIJ~82rzX0{H=W0ixR3Xn^Jn6G5vBuV42I&zkDjw4 z&ufdckXDS5>7oY*n@KDD4^3K;K$@is^eb7VYrfIySN1qkM|30WTuvNmS{)8YI1(N4 zzqI0JL54(DjQy*>e=grYSMLot#0g#!6RmrBKG?CWt|_KqeKaQYH%R0lL=zp;w#dz$ z>scPBv=4#{ZK?_l18jn~tm?bM5{gqUrM`Va-UVR&pEyoIumJ+qL&s~a)PP&Rjnn9y zuvweHB#r_xu|CkML1H!Dfsot&7*O0lG4OU>*Rio8rh~w!x&Tm~pFf)pfamAW7SQdR zX}f*XrdxH|VDG|u37?hcTU#_{3HrsApSEK9cF!ZH?{Du2Io)p!)$E`>?Txg5>aU91 zESe>;g+a9P=13_VZi3U_UjOmRJei35ioodBz)kS$>pxzdU7BUp49uX6FmX1D86yB& zqm*tbmyj5dt)KqWkc8ttcnkgy*o;817R7l0-u)+2Qd3t}e#^eUQ-=|-^fTE2lUZrt$^*_QD9f+E;2`8ZJkN` zU^4{4lQDQQ2;^uwo(dxznH8X3`muTHgg!{ht9&@VeBoy_;Jgp``nma`2ya7|M(BH=)fuZTo$dGs}h?GKAf|e>VhjdP2FzSn5lmJ z@jYfWjsw2Nb);GLcu(_jT6FL$_lB!!o>7XRYC+f=L?D`bNXLC3-g0Lo*6SdipwvRK zi)83vu4vqYJ2gCg^}!r9BT$Ty$sfc;p^L<-ei|`p^kd;tU{l9sNy4>v2|?z%Rziqp zVJnX>@h^8D<9%CbubW>#w0`KeegY?1mfTCB)9!}PZLn7K7Jy?Qnyuak{0bgZ-*K^G zDb_aIk+zxm%>zkjOhU%p@HQ_i>WM0D-@i(WuNaO2gr~Gd|N0c=3I|8FONEEXJ@kGO zIOp?Nk8=m>rrKccze;oi37SNBQNhJ?HKuh{pmFC_<6Fl#bkSYC<;0tnHR$_#8tp&w z2KhV}02=)N4|jI=Z2Qml-rmaovy8_&@>0|N4PO9IAlgS`<$Lp3OuetT1E4-H@DhNI zMDHyCRbZYIwW58gvY$`#?t_|G_*YVyin6K z`;~$#qwTKqvV>3vWBRKJ&OZH`cN4N4NpH|=NN%}(vunRA`{S0+Hdh<8>1cbk;XAtA zz?w8yuP%76E;%gWlEXK65g{AAkBM-a*?a@mK3%-Nx_*9ncJ=jobk;#2MEj~x3Zw`&O(Jl zxp_aK#SH=bhQc&=6k6U=nDL&%v^N#Lg}Vx#+X^i&FlciI3d3RR3k$_vh2rd_;mU&V zwt{A@YB8^-%~45E|F$<4JO~ia4=C2Gt}e_XNjcif16^QfW}VtQ?iJ{AP_Gr*=k{JS z^z0YI<6WEC_sz}dhN0tFhw1Xg7qGd>V}bm3?(haw4Tis|On22D@kWWo8}J0GTAG%oaErGvHI;Q}ddK*AUE>W~ z*5e<;H{Q21Ea!NgEx0Ve&nhB|!kexxl4CrsKAp36x)vu9pp@pZH0Bo2FJv!Yl)V&N zIvYHL6qYu38EU&L-m~w&NXwsFLVQtcPu9@4BY&ZfE!5-Uu_}_uw6Da`B8c#m+twJp zz7rX97Pdq&0@uVTze->&|3s#Lh&Fs~aiwjsVO+-6Zg7d@T}sgEJCz{M)vZDx8>649 z)U#%}U}TWqV&%!#fk2+l8F!Qtq(z3rDt5Gj#?db{n&iaajBg4{_J?GP^;gs`xpYMX zwp&|a5*N+X>30jlk39dG7DJZ8RjG&RgSG7a3&4_UsE+)}P>!7R-9G@~lL3+g(B*iW z;uxu@$-y?3S_N-4(j!>&V?>7MVS}p{wO2RxYQ`B)0I|QfTd*6^=|#nRA22J&ktIJ( z{vSLd|6I`@8}I)dZ1)cA_>X(NRsNTyJeHcrr~4ar{^0Q0TA+MsYJdD?;qx)KPe*|m zuR{m_I*&3anm07Twk{U3YUy9mf~iQ1wbC3tWh*ttOAgB{&IDCQ;;O|ZhWe{A*%nDJ zwtKzpN+a_F9GsVlQ>L~nm!N8&%sV042j9&Q`FVAi{#6dsw{GHetL?e0BzZ{;HX#Vs zF3+BwUuiK3H#4yINxpo2dHw#?o0q?wT^?;7>>mD2hJ*VI206;W<_B=``qlHP&H{d@ z(JtYz{VR{P-r6hrYcTZ+#UK#c4c(34r`wf~e*6z@dq-RlPf(1kz~!mVb5H+HUOz4K6Ldan7#(HbZBS_+R|9 z6@z1l302PWfqQ;LO4e_ERXUv40db9>e1dXMHJ-xE*BKtcIQ4uO6O^ZZ5L8?%&!-WJ z;_=A$0gqGqI-_M2k;l4M1qg1@eE@RUN%U{41-{y@dBBPtlY_ge6!UiOf(anPJQ?%3y zHIj}Udm!n`Z=b=3F{XAPcR}a;_4p@$HAx1&_2f5y#ez(Fs}^7Vl?y`Ztz3NdR@OIr zSx1pseqYYsoFxtR_UEtb^{MuE&RLz^DSvrfE|n*f=W$R~yJ}@rEqRp|vU$a;k`3!! z6F6@&=I>lF=ma+m$U{EG$DL$}I0&C)f#2^QN6CY*R;Dm_3X0%1VxVu8E1SS~_c;20 zm_S0d-j{h(=R5oVQ?vfRvv*+W|Jw(9hr28Ne;JQZmDOYep4xqOEt)T$Zn1U>6*|Y5 zp3;v2SOWpR`6mjg@bz3Pe<=ICEP4d4hY0XE$)UW1CXMbPPul+YQCXGSZv|asl~T<@ zUoK--CV@97A)=J{+h0z<=EMtYFZ?yQM{ zXiVr!ln)SC*K5cU<+%l05goAZUqDHG(^XJ(VUoPywS#i_pLt$s#)-^$o!nieO`|zV zBb0kqrs^R`RG;FH4&!}!JnG1C%SBX5BVCOr?g5X`DRHGQq8fzh#b(6XN!i45Q3s8V zwO=+8-HU`xm{d~Pk$Oq91guM;M8}`-;nhZMyQ-EZPc}$?S(ES#y(|AlWB#Qnv}Sr+f- zWyNp7d&R-$n26hjf@bl`a+Fi>Vl|RQabo?#e3 zkPeEzhqiYr@3VV{(UwH11zSU^+RktLS#Cqu7T+uSNKu}`pcm}5mGfgTRmJVm{yEK7U>3>miL1KOt zuu1s2oV#YWaK^hKUnBsXocuQ1dEE(lM1#2)>T8}!rG*xyRsPSVJY3a#B_qtoZ*j9?sA& ztjS&s%g-iXpR-^5-oU`6ALIyLpOXT+;5P$_Bc*av321O@k1KA|JlJUOU4EIWl zt5I-V!v0dav6 z13?IrgiS?Ik|Q94w|Pu~d-lTB24V!S5~YklIOT|BmPwpZPNu8cu)-bj?lRh)Flt^{ zMmHHgivURE_z6P;qszSPExIp|&=Kz|*5?o<8OpmOc#Fa(xOfyk z0~~MncCDr)$>vWHcgTn|q~ndpAu_{iRjwL6?$_1%Vobz42IveS65zB?76x$ICl3U$ z!u1>)X4gBn+tpvzE%e72+>+6C(; zHw2}08Z|I{C_S)L?v|4Sv7M9N+mXjqcx9qjUDpLn?LOq2l#z={kV#SHH$1 z24QDR$0T3lklK^92_7xrbC>^ z{}Q=ZZvRS5j}FER)G3I}MSY1A6o5edW1O>>h?Oz4rxZX{IQE)0MMETmp=?cw=9efz zkf81>_1Pl;ti;?OM$G+wq)tIKnk6Q_8+qYHSs53->3@mSC{71*?-##TBw$4XRwSU7 z1mFaz^q4S3<^i>S8p&rt_a|H~v>|dwZq-E#ndSzeFzJg=m0c;e34^P%hwlEl?}eMi11Ai%dhT z96u6v3-~ia6a`wUatfOda3fu2SH5Q8A030>bp}6-k=2#V8)Tn=2O-L7+>b*@?PPg+ zv&SGXopWenX2H~s+}%ESBI%29l3eLXXw^@I!&{UK=k0%z;#Py%Y5lpr*?v{omd7k& z1V(&L-}3%uF6rkQo66O-MJ)sk1*g zp0x6%;C6Gchtg21ev9t?)w4XFK#FeBeMRkAsFtYNwMmi}g8FVPPb=lWMQ9$UgJ&j2 zXU>iSX2_4SICrGgv*f2*{^u&&GV;G1?C&p$OhP4$J8Y#CM;aZ9B$U^Ml=@iZygE-~3MMd*;Z1^w zLA%$6ko<-Ty}&v3=Z7C+Le(v0Z-ER)0wngiyb)UT{v1(ofg>Ob-9R=mIF)LV2m=Gw zi=dtNyLut73}iAO(T4cb-r@ooo7VVw(Jtc2 z_ao1(0zTFuB>zD7ve{rLw{Xyrwbctx6d`@b9|ML1yN}ks{>2_I77TASCX$-E%LG7j zhmyq3zHIoffqp?#@uV<)Xmi9BK}5 z)KcN?OtDCuaQpRGe1N!ug?LmOS%2?)wR|+_|MJLoJ~Kdb{4YEH^WlDP75{4~kD>p| z*bPBgSAhfDYXIUt4^`O3+j&Lix{oZ8UmB{$-Br<9MGer{t znB)jX_W&jdz5^5kJVALLM+n5+LXn{yWHM@t!QR;%gR^wPBTzjXX9+(-okIkWVJR5DhH;AWuD+V4kp(~??ym)4P5c3ZTXY|Q zwOe%GksgvW9vX<>4apv3ScY6-~KiFT<|7ASl{vV>_JSE@-zC(oagN5JX!I1qejwT=> z@gNnOksr^c_a$Wnad8|pJHyZq>Ie$Qc}(w51s(6|D{*=~@?rVI1&*3IL;JxkoJojt zAl^Es=>mDfcrXk=4+IIm3qVgP+{T$zD$c9a(Yhy=h5BUsO^P#C=ag8TLidZ~`j`ND zyw&Y?-2*_?w|NFuo=}O#D0fX_w7)z?E}L>2qcAT{f^lxPDO){BBfgsXai<)O-lSo( zu4vbLwxt^3#eJqS-=*Aa|XDbwclnt_~p?OoX>z_?)@_R z;X|$br@6~KVEpghz5P8~{yRKa#s6N)W7z*Uxp$J9b?&CL5P@z%o>y|G*2!t69exVo zuhCH7Je~#0ZnBhcG~*@YpEf1%y4-1IUE^fhBlu`6rgW+sjR}2*P`m;h9{P)!4fY+?#PxHnXs zAaIAkZHn*2x-102evU`LoDpTCW;`dR0Da7oIE-m>FPgk6{OUjmQ;?%R%DImu-;z{SC63Sc1 zxpp7tU^Gr>oF%GujKnpE4G^MaogJSof16QLBZI!r?C}{QV-I?o_no`t`9Y zzBOwWs1waAH#3LEslhn_wH7Ebmm6CHe4*jguV%Gg5DGUn3d0=oQDMyh6VY{?0wyBy zeUasejY-_u)E%I8SPP-*`*i4-@~M{pVsb@smZ7;sKmIhxf4#l!LtFmq?XK*9OL>}3 zGm2GEE#KH@5)^0rLUG_qBNh=9=dRuO<0+HEq(#i}gDzokJ+xV0w*8@vU$&_Eo%(Do z@~PhcMo9U&Xh75X?~Zf->+qnr+W$*=n)bhySU{%%BB6mz0k(cpJM=uIoc;cWk`b37 zZV*5*51ALIbc6lxU=QFN^b-u}!Ctqtmq=F3PxaXRP(eTbg>uY9lyMSqsr-hY&rVQI zQKYI;%uQf$0OJ%uB7_!x8H~_8&Om}-#H2>n7SXzVH6GodoRkf+md=23Qvo;kVj!$3 zRR<<_@SdoX5H3IkDBwCJ3@OUHOlZGj(xVdMfodPnAtoXplywIJro~u_yVm?l%j>?x zc}HEfj#C=&{~zoHAdqMbI)(Q?H;}ClA-Tv=KmG`UUI5nRyfHE7ikl!iS_L^2!pGqj z1)o8J?@%skm>Q%is~I3&JGEBQN1p$^Y4O*19QvQcH(S~@dTs|4=7X6zK$HLP;r4-@ z|F5@mu%iFVc#1oTr&{O)Zit%8@~5q!u3SK~8~he>f~$&_fVDcd^$uiuOJ1ctu(b7| zoSr}9M@aKbx&Qt-4p~K(p>2iVc;-r*o;(@<;N6spFFi9zVy? zQ}Fi5hj&aU;236tjXMUn*H+3%Bv%jc*;@SrGh2{Wr+xwld<6;dAV(8?%QUwDeazw< zMM1}zU}4_n0PyOwA&kxI6HKms=#g5>a|*P1uZOc}bxGf2K}w1JlXYcq^ftY77* zR~v=dCB!a2$C&U)wOk=&Ao6yQve_9pwo4Mr?sRHB zbp7!DY_{=KI>bTnb_BC`8{D~QfT?u0E!5Q(Kv+XwX@JXp{Pds6(_8O(tn39ufNIkJ z_If*Z{HNW6!xjBs#v`b^vikJLX((=<^>GdcC`CD>OcUWt0hCl$a~h`BJxgxO2W?a< zuC<9pmhz)PgY0#ALp&n8GCT20WaBgh2fOk<+10qu4O^Rmmw7zD_nJeDS$~fgz0#M@;DT@4Ix3gMfsd^Te`A2 z|7G(pUGA^U#=}`M1tUx-n~I_q>Du7daa|?y<%kIZ9N}VvGhip;7BPTCc*Eb^mlhat zHFnxrOI#_s8xq*sP!F+QVZ!&A*sGYQL3rKuf1wl&!Qeb{pay0M=)E2 z^{<8f@4(Lg-rG4`-Tz<8qx3&9-;1;UsTSw5{XMRY(Np&ExMg@AvxYxIhhC|<=Q0Y6=xm-x#FD6GM6?Z*BT z5nX(PS>P?N+T(4}TYx^&9G{72iKOUGRi8qSlj{WJJ5#uNeT9)=8d zTC|h!AirJr5{DcN%m>0X)aZx5uIXxqdmt+h!nvL%`p>?@biO+vjq?AFPTI^8k#%7ac-R(<-OOB&nVP6%@9Hko#IO=&dB{P0-XZk`>kd z7M~{ikJ8CQ-~T)89oX?74i5KL{@+V^4EleTP8LP>Q9AiyNIoCS1IqmyU~OWjgh6&7 z#l^(gY))>Zf*1yT)GF9!N0Rw6DDN-)HUXc(ExIS24%qHU@5bUPT=5lr z2K_iEv?E}#137sOmSyzO!eEKg$y4cn0dmx5L}Lgi2=K5EeeS>E_&5F&$0-OlKp?x; z-xvTAoYRve8^Vs8U&R**`R`(W~bJqJj)=)MV} z@~xhkwky)mmb=wKxAf#vT7W>NpQbp3O6F2y)x?T>T_ip64_;rG$L%UMVO($0-)BtG zNJQT&bMh*89<`R$l~lJI>voMVl9A}5Dg+#_d2C!A(Y&bK3ThRZ$2Lug zvLNt9l=O^XilM2Q5$!L2YS^gMm7t1gDn`G!`H}=+-Exrd8VlCrG`XO-%RVfEb zKhWtdxt0V_vYS#;DB4qRjvOw3Afwc)4(sKmG6q80x@2o zsu0Dfp;n|8=;^|Fx9IvH!5y zUZ4?(HTNSKg2Z?pz!+4iPwNVsp{;4sm;}sYMB=YEEfWpT9LzbV+TKO;9qWS*M$?_? zD)pK*^c0{}CW5xLYmYwND#|B6>2L<%2YsQCC-;8izzwFunFb?gF-Lt7Dw3@P3t;WI zU(G5j=U3g?40=`TnY37rOij7=cUuwjdaX>R$?X|g0(^R^RjJ+xQlZSY(nn1-wxLSR zxa!qcZRB=nUZY5vzb6PP6n3UMv4vp~1i!*6yY%b2rKh4kD^1t(*{D$>V3-e2EvPPdi2CE59!MEjuu^kpExAWWEHzP5wWJ z`%e7VRs6>#J&yeUVu8Lta`F5~^1m3*!yN{r)OQrjC&iZHm7MNKdQ+LY`0kdXosU3? zBiXa^m=(lC9?V(^o4&#UwU`abP82FEdAmGn<|T~alhx<9o}#`p+_IQ^?qV{Jl2;T{ zW^#%Jp6X7)P@3p}KmLfKv-zBWn*4uuUH{L+ot6D(DUU(_e`S-sNG~9@dVUxVP!4F} zEMV&=a5BMh1kyMG8IDtmawm?X5dl%BiUnXc_48#f)rvc5V?2>QCUF$QQo;_wO_hM5e5ev}oqwwu--I06Fp&$Mwj2?|xx zfum!dl847ttWzZmN?_;l3}F(E6CR9m`Z%{%Hsv*r8wOLN34Z*`_5ax7VS&f%|IxD% zTHEyce~f0{yga%3M`cUmYjtDJ*bA(Pn&x0G-iWxi-mdt^S$g6XHx1%gn6*7leN}yT zI$#}rU{g+O3W1(YR(bbzW2# ztt62K=p@S+DDs_LrMCeHuK$M-hJdXugD|wK&F5S;!2h1LjrUh)*Ol!E6Jx8bS+b-- zHl9hx$hkoD3pXp%e2h9B5U_tO6{+3WBz=2!dH(y^B_neuzns4~zdk>^5`$H=td8`% zVZ5g4`uFpz^Iu+^y?=K0`}wKrHekX=;O8))$jp_G(=<*801_dEu|3AucPtW>t@i-V z!GOn#$~znUU5@yI1Sp+20u0}yIM+5^Nrb!kI6Wb62+H|}t1iM9IxEuw>jNYURczE& zcw%+s$`j4Z(8imqv&;7jXlDK<7@bgUJfE?R=a;YFT)baEJN_oBRvX6j*DJQRas(sp z2mbmJL>P(qX>t+rM0tQ5lwv$#5`)aL2PxL-+;pE?$e96{WF8(_v*0@S|f8@Uot~dwQ619b$`_6>S~cmw6jZ zEEVZR$_CATiXk2QGG4gV{3380BZJZ-pAhpTUWFlVV>>Fq?dB-MB&JwTyE?r~O$n3M z;M3WmqHwSva3~y14ad53bfN<`gDK5|M{Zitx@`t3S4t61%IJMcOlIRGxxh&r-d7q? zi=`Wsg#!?r_g`Upkt2dqS|4|7En{_Jq#N$c+QA7=E63C~G(mY_tHGub&If$a$9(87 zTYTDVk<+F^v(1%&_yBD%Zx*;-XvUM(qd!gZUlR9GcpoO{;qt%jZtv~c^56FMD*oeA z9z*^sCVNprU(w(XBk*Y>dI(`}i1Dq?8L}K*QKke387B0K!kn7?U`?blFKeKWC=5U_ zq%@QN5VM9O5tg%VFbipXU=VGHf24R;W_)#gDNDA*%FE%*crUvE>nZq|wbOzJ>6}M) z&Hrt8^;(Go53*=nz*!89fUARP#%Dw+~OU1aNL;mBF zz0l}?yu}|z_>-e~IPYJA@<|+`S8#+jieIJJ<$6c(0+z8N!;!G>Azv&9b=0Qn#sr`g z-XtjMcDuGqZ{GrA3pB9}TmM98(gn4wFcEs-eA|$0H+mp*>s#Fvu(Y4rsY(!97nc(0@vf5`?xV+ULksi^IL$^4G>ch za>q7OzzN`(;t`}VQ={*>Hyf3;V+z<>0l42UJ(hAb!V|=3!l(LSthrde4qZ^cWWi-xVVIyLHsy+#aSAckfRM%Z_&9ntZ=*NgV!Q(p~ zm6M~1fFaB>l=9=e^(%zH?f3@eDPr1Z`RAXvd;165y-pXLBm}dOAu(QJV^N_F@?$eT zZ5)fQUS9*)@1u|k0JZ7e0FV^rBt}KLOJj6A+a`A*8=@p5LX9Y<2HXu%YAhP2B8_v# z*>JyKC>LK_#jAZ9^?$)+f1f7}ScCq*v)8lY|LklZ?5*-YFXhqmKck$0Um%IYMWz8$ zsUoorU;3`5F^ypo|4Uu)F+KN(kSJZv*2vZOGpU2PDh}`9 zIRPA;lUJtkREM>wxZJ>gZ7R&~)+J zupKxmkWUZL9mtixQCTUFRe}y!UvsA4iP*`z{T0RuYqHeuk{rS49>4;CvID=su1%~* zNOKR0UaR0iWy3N~wd#?{T#T6{7)BK#2c5B)E6k7Pslxpg%kC0=7{@u!DxDxmD2Lra z&W4znduO3&bEYo@5n`$Y+2^KWpzTEOUUgEUQ02a^#bKQo__e9<*L#}zKfaka33NUG z-|p@1Zrk?%z1?H|1bDtFOKE2)_xr0zZ}j(xP9=pnd+{aIg)sSQbb4q0>+kN z`8QjybevgkAiRZZ%NN8jktn;#AkV@;9<_J;4v~hDjW3A?`t0+65H%aJkecD@bv$fZ zq6T-0u+rTr=)76)+PFhV>L$H|jcCngll3MA)9S6pup$3;1TYPy?htj8k!VLp%PgZ5 zKuqQ5p?6sRXbxn!7VC1XX>9%E4M5KuuM{3*O?Ip*T608ER(FJMuz)*QoMS=wny zn!`A7et#jYuPVp-TH}^~Y4G;6eLtH=kX#(Bt?5^Y?6>?;>j+dX=r3P5r?Fjvd;|1) z&n($}M&PLQoROSh8t))}Vp9ytW7VB@3^dHHaCrMwM zTQTf99w9vTx?)y7+N#_?^qfwN3}qq)D}s3q4Jk0 zxKcG)75P=FIH{`U2p5n2F@s2kLQq7bdp$w^;n6Elcrsm2i*l+P(T+@Du@&PKF zC_no;td#cFc!sA^){cb*@EJlhC@xWnCOT?t{RBgLuotjV(!kAR)n3$o z3VtqyZ79!}oU23(&;o|3WN_=uRjyfAp>mX{5+N#{gu+|bp0Ezso(lnXdkP)f0H-35 zFfSUkki1PH%d-T

8o0PYGVrUZz$x`!la&55uZsf97?}g>Ka_Kl1X%KCp@#-+;qg zzP4fIJ9(Pye`PG4hr0i@y|aI?@7(`7+*#TGmhl(@*rl56Maf>p>iJ>hE^R~)VF)am zXT=yNdxlVUiZkbKeF;dd++>w1WQ6j)UnVNQ*S6;8!Bd6kns`oxOB|Pg6!Kw?K8z8e zgj)~7Y3!Q(jj)JX2%qR;5s{1)&(!oKR@EYXD>!q1oy* z<<@%U^NTk?0kUvPH}k;02cjniw?GGqf*h%Md!k7B(c86DHoj-Fqk#~9s&J3gah=_V~QsT9~W!Kli|=y8rvUL(S7UL@?Px(L$I ztk7ORdTo?`r(@Fk)jg^>m~`ucIy9Jr8*3n9kF zHG}2pU#d1=OU<7zLYsD2%bm5$R=3`*e`Azsb}T|r^rynkIO*egV|EA6myLA6U1e78y#b5+!I0O)6kW!Q{%-3-i;dUzSU(}OD zi!q69Ju`QoRCq}mT8U2!U%VKwOC6xO{9~`T-yanRpWXzxCe#{%`l~_U7N-edhmv+uQux zyPrDi>@EBA^XTuLwZKzf2)nEat={_Evy1EJFaPl_{`+UdU;W?C-`6bv3zX+Le@O;4 z&}k5^UnDS2!Ffv2fNy&==z{Ie23Y?!!H~)qz3x7H^)gOkrcj8N`@P<%g+jd+A0-qUBp}0@z(Qr>t($4kGLosv%)6KaSCqk*^ZKB zdOLfp(Amcfr%WuDuXp#*LC5wpDHfFNup+P{N73<$b|Iu_fQ2Kitfdq=Q9~@QKM;4U zgbBd_MiB^vS`+}`>)8i)2;9Mx3K3a2IdZ3dN1!SlPc)@iK{1OdT%+ve)_X#p2Hs{X zxUIwnEgTpOj9NhHqo^6mniI=o-Z5Fj^7PP(VbpsK*{h(KYdc`Eg6vdZLN+>FzaQNi zP*in}Vp~s$1i_kVT|c31ZQWjuyqtlXPda@v8) zkFp@q*ji3M%&~wou7w{Cn3s%-Bq6~d!8b4o0M58Sk|{8MLkVv9Y`=tXjn>f#v=9p!L~4PSw8s3iQ2}X#5bAULWBD90(Uy&6a7gOwFa8 zd9kt4+B+Nz;7hgV+zmr5fOtJYc^*g7C9o*<7vhD$34&^MV`+{Wy#DiYtw6UPS>;V+ z!lMw}Aux&uL&}PdGXWS6XCQSo*rzDx(G!sGwy&uJm)s-Z=>WYfC;)-ZYvuJKm*F}3 z^TbqDwK4m(W+Objyzen_l&-caqP-AGKf<@HZA%g4M1pZOT`Lp=D7+jew$?hk?Li47 z3b$P5SPTLk=S+#h1^Q;zpf*nFvM{S?U8Q`{nz%UwGTU)3d)4~+N})zKQ(lf!8jq0l zX$}m@DR`5HI28@oNA7PB$BK?;2;$#v{Ozy$NH`imZp^kYr4Z^ppKq2v+n?Dt;7PS; ztrvh(xd94T-?cuSsvL|i8qU7Z^;V`@=3cS}BgRLVwCRwtm}x{FN@k9u1z#XZ9HKxp zxDeuH$k-YsV?**=3(MRg42IUWcaDMzOS>IOtvj1popnLj9&J5J(P8~KyDpcQ+5|6; zzZa6l(KWX>=H8orXXxz|*y7$c?}X5WVmd@Qcw2zK0ZK66@$4@YgSWkD_qxvJzr92z zP4-`k@==`58u>{)P4S<$_wD#kz5U)Q|Nl}RGyhvT*^4p=XifewCIDkh51{m~>GPoc z2|zGHguns1fOHsuAShp`Bvkf^xufLj?HV+Um+WdCI1XH81}wc16Q*_ZZhJE$HM`Xk zZy8-@;=|E#MF(zSGrJbkXaf-ZDsLiQ;}>{9UZ-byj`P6bgzjbg>YQ5Bh$%WDHAXzG zG+t)Z%FHBM6^L#(fpQJ0(N@o#pU3HKetS%A^;AAh{C|Rz@d&-d<8<~k5KZx)4iBCD zUk8W#EB?QX$Ke0kWG^%egx2m4BLo;@dI%w4f)lar{5Ku!`{x;o7ABQ(y!emIY|-`reEHJBY=^*3`b;3yV1fr71iy! zMX>J?yhVVZlpr2^dlFWJ`R5liT!8I%J&tJ_Q7~^&l<&*AF|aC!ekSjR__8s$u&SFR z4ZzxWg0wlTP1;f*#CPMy$j;(hQx*iD0i$abE{H{PTAPYBHd}p9$lH-^{~N(9uzUAZ z^{Ek0h^apqaCP-48gChqbd`n>j!+Upf+TUS#;&q|T5wj3(VMTqwrd;co?*P&`LsLo zDF!#~7(CIBoAa^M-xyoB(NVcnB>?h6_Av-czD>;a#d{Lh?5valx)FAwrttq)@nzlSri4R0gAo1Fi zbdu&7UF~62B{?hVTV$;0fYGyN+nM4tJc>5z#~(qk75KnxI8?LPObH#oJV>ER4gwj; zxr2EGNCL?ayxn>?7yN5kiGBMT&?}sx00h5bLa%XQP76TrOB}^H;*s}Y;tAda_3h;a7}&{UM!Yvw6XD3q0&B!H{q%oMf){m`{<|^m1;2E;8iWdJqN*bnjsgC zBn~K^QGK!UAQhF;G8s~_uB{^FZWiTKKUT3qNiy*uEbI=c5{2Y1Ck;{sb+_7b)}%g; z@^w?|pBkdxH`xDp1hUN{Rq&>adb#x;eMDhfdtk%)AHVEj+W&SBdaL~ZOL+|YADdJl zrg%}NzlJcWmA1b!Na~vS9vesh41MRI2q3WJl>Hi?l7DoT~dOI%t z-(J!GWjqG`XOsFs^uI1%`47efjIij-VFFcLz|8eJBMV@S2>Q=P)o>}R?%%RYV1vJqA-R=EDi~jHJ z93HIb|1utf{>w>yAQn)acH;+Q0L4JR1w~-NEP#z|kt{$Jf^^6V1zRT8NH|0y1%XTf z^PqgA-g`1LY`!JfRXKgC{N{aT+sri7wsk5Llhe*x%ck#VhQz1SOrPsRYNR;QC#eY! z?3dgcN0rSFG12pgbH;5o>$d7;@&IIoxi8bKavWHBlU)FAraJe7MQQdMf)UDzg06hy zUip?eSd069wt=oVR8WC?JpQDOJ5$60ET&ZgV+IE_u>^o_Ce^H??BUH7_}0T0iu;BI z{+(EWQ<@xC&o}hUD*qMwTnh=XQUBlR+4A2(Z{`2Fl*hdPp(b@@1ejL_)Q0*aS^{Xe zP$}>s4FSbWtgHc^$4mdwM~dwOs-cKTZY4fKC+cgH^e+de#4-Tzz4 zBYl6we1l@bwJ;^~F#%^O`C=khp62i^*+9T$dq_CRNlHvO6<3{uxEL3Y%`h0}3;>)K z)V+be*NE=GFsZv|f~$Q?HOEr#o%zB!qXjT^Ilymytuz3@BcbXJSJ9BC1}7BKIBW=8;)PnY zIL{g^VV~|kr0m!WR^u|{X(22xZ(dtq;{4)NBNwS>@S@x$9#aOydWtIWZ(cI5xv?Un!EQXV1J zbK*II*}}wrYXx=71=J+;3!6}2JLJz|?qP%?D%1w9FUZ0+crDd{x=~GU#i_IfJ=XG_ z#DwPeqC4|C>|+&B@?=bhjJw?&?4dNo5fay3C}V(Ztan44AV5SDW;r7!Cmf3-xYDcp z=m}95Cp1>b@Yo#_#t248nmfrjEE5UdqHHjFX_ zidmWBhgn8okrfbsnO`{;k3g_qba7NP)B!h;po2XvB~Bqle0lunOS!e>ei6oQzBMdN zLjri*5#1eJjd!w3`Vu8l}HNGmDQAONRemB~l1S`(z)Oaut z+5%tP)CW?2z4U*CC}iW>dJmK2q})3*27qdy|GoVkC;$K9?&|!1DUVPgH1fz#QDBY$ zj3RL?&WOKQ@MJ!wpq5qFTvY*ByHgE3D?ygWiiNm7StfMf5-7*7HP1_|7YjG zj{muPu)EU#m+};8!aQet^u`=uQkfLOQ# zRURAY<_1<+dKgJxqBtFhu$7ukAj8pgtgCT+4{?4FvyRTw2z^8qQAAZL3sz=BRuJin ztt?z2OwgG<23nBrhflNj}B&mhw}ouG;$&p zHbAUL33EKR>chd=zETe}(o{>F3~%rRmBG-o@MkSY*%0t-PN-X?(BLgF>{-jWSU&c8 zjXyezl^8A}CII4mY1%dfKwd|X5@K=v$MSdB`UyNoRKxqtJs?>UQ>utf{Hvg46wX0PK3TPM+abS&C=!7W{zfewfZ!wFmXad^vnOdz2=;SA4j#9ovU zpglc_DSp8!=~MdH4YgVfGA1C_n#O(c9uZ{#WUOUFUzGf`&KpCu$cn~O%kXwO)=KlZ zvFHoQvqr^-YLr#P)^{CM*uI&~xv6mXau=Vw_MT3aibhPw9TJJv%K>kQvtk$toa?r7 ziWRp5AxsjnI5qZe9F?(csG*U4xcw{P3^9$nVH)4N z#p~5xpX+JZ|CwQ>c%bv&-9wxI_YU`0{=Z9kTAcqb*3g$(cCYDAf$SEfe{hn>Q>DQ_D;i-x&HMks&wqQny#wd`cYhWCaVbyz`R~HF{_JPJTIH2RU~x~w z{uff&Je$8w{@>k0d;jn39Ip2NG9D@ar#!Ni@W2GPZ;Su)?fVv@{hAWyMSqJl6Ra7A zfiGWLy6-yu=tpl7Jx9ktY9Yo~-FCu?=)b2sz#|ByFN(hGa}WOc#O%yH;uB{ZCYYvo z>;_nyIL8!vl!9AUpz3C8dE9lY16)ky+Aa93KxI+*To}o#hAaRr-A>gR9bT>0S)|rduPwp|5x{am-Be# ze;yDGr$r*QMF|4tYO2fckm0EG>M0$1Z$SH564%lpgIAZlqP(^%9ZbzKBIcRZ z-X|?g+Jf9#jVP@R-mQhhh1WH7#Y2|yG|>O~E`G|ViT)q-?E9a+-r?%}cPWodI4b6Q zVb?zkirN0&rzgzkbQeKGb&0k06;QK=|MI6^W;(rb#`~V2F~sL5fBZO!jrIEbno`fM zy|QWL^AlCt+|pD~`)+I69amj9wTGq8Tf^9NMSq$BYW3zFr5A*6SwZsB{|rZ4@8OtY zo{CUj1~~~s_UjtoqA8g{BmFHp5b>i++79^?FW9!D}?dWNIFkd_0qGR9{poPA_dwpH)# zUbg)3CtcO_zl>=<-|0^y{Xf`t&VLUMSNFe`^BDBM3<5tlu@B3v-QO`~*GBOWWSobH zd42OwPQ`OP;(?{s+hkPWHPscOSrVlh!s!}C`A7vPof;Oc@@$ZNvGR9o#8k^s!-vcZ zSP|+9GiE-)k=^9Ox}vjFaR7CvhlKd>7@i;)5(s>AeFFrT5@7TQhK+P|0~k zX+onob;|R%6*Y>prdC*10uJW`=ufhp?~N z_luY;Y`r=QY@Ajvv6cVjkMp$9|F1H5H86Uy43niJY~?Z(*c$bM^`AW>_v6J4~wG zL>Hy-CP9u*VOfp`XB~|ReTGnWinDvC4L3?kDt%22;v(B~AhfZ)ydisIH)SLs?L?s&0i-@&>PI+t7u;UC=6Y zOjRS-BEO_=elap+$rAt}UPt9Y2iv)pT)!bm!OcBTQlk-8q#BG6CgGUTzUbGh=Q$o{ z{(}Rjn6tcQwwC(0by343&h^^4>aHZX)l(z?MKj;`wVww0Z-0N+KL6R@-&>vkEafrI zf1bU%0@9QT(@3TTm|rA}D&qHjFH&G+$LCwr`A;TreRK?h(_~C2%72Y>Vx^209%vQG zf2KX>_XaxC&f%k!$OT{?c1uXL+b%U%XKI_5i^^|-W^5OOe#{4)h;>oVOn|7m5%daMQb8e&3Ui6C1bCO`_`GRW7MAfPX`KVmxkO;j+u zm95lE*lcrX-Oa9(6e2jz!8%XM>7)Ud{dB-O`cQ%w(0q)7PRFVxJv@p!aZcxYLQ+;t@kODs+Qfzp6lE;w|)YD zu(c&<DEq25ekBg!nDGC;Vbbjy{az+{!#A(~QdM0vo!H^rI|U9pMrQZ`pX>b)B3ZP50_-3whD9 z%3iOXIF_474yvo6rg$f@Qv6m3Q_YLPXhwKJ?mR8JSRGKXo}d(TJ79MTT!InKdE)LA zyxo1Lqg3nesgn#w^yEdRc%#)mdhE&4DoSmto0VPj+DhB$@nEUIX)THlW<=3}fg;t{ z4ERx1mx~;=07V`7s|ExHMBx>}K{2xT0UL+Bv+jgR9ojek`^YmI-yK?KT+?jR?@_C+ z*8hayAe|Rq#OdwK>R_Y)_x6Ep|KHzP+5eaF82X<(G8+dLBEp71>nVB*t;W8Y|zZy($YH!lcE&2M#{_=7$5{9hV&AC~`b?;Y&e{C~H%ivPKk$L0U(>|i1M zzxrh0`{Mt_I39xkYiBJ>SMapK*{YBNt5%)UPn(vf$F+mHzGA()rkeTDIa@vbXJP>( z{_`<_Ci=g#yY0~bgH`;ur92+`U*_DJllTh<#_yc+i$OdT*;ihyLD16Eps3_hJ?WKd zN$z!2F79hJ+g?G@ylOqsout#MYPCMxkJb4POlH5?r<(p3x23O8m?Qdd@!xh1cHH=H ztN0Jgc?|l0&ZZo&IR|3W!HY5ny*%iU{1 zY`Z{>lSIWEUAJyD)Lk2`y3k5nuFr}?o& zi*;E;rPz&q$%LVsGxd{}Mz?foOX3g(e%P&yz@=7HpH;YBTk~VW>nLH*Uy7+Shd8$o zCcIW;BwuwkB*Rf9`Wmj1ENW~Ow%w+v@hb1H*~1qzw23$R!&eo1YWRN|)6<3A0d3&_ zhdn3$>-P5c>ilmhPhnwN=p|6!+WEe@zIQ+m!us`|gkv#B8wl8!fO8m~p!=VI2ii`O z*5$|9AcqkW<*l2dYxF)de4GU&WgkUtL*1M2f~kcEiyE&f>4DX5yl*O5sN+*!bum@F z7s_<;bInQ8QZT)fK4r@)OF&G)4GQrHF>yfjw80r71UDEb4tG=T&#DvQ(e7bv8c<9Y zvN@KOa@?t;S(ZI~u7>e3&TAm*vB#m>nFF?Ds=TU$bA4{D1nBA@lr``)Xkg5sxMm^R zQsMRawD~}4y8c^AS!SDJ3pBckR}M@JXF4Z**`*0dwFkK$BlBFXHnf4c6#@&Po(sy4 zS68Cvxe{#Z&Ow+vF{*4X+9 zTuZS6Aih@!5T!+7!IL9^CMe~EQqrL|z{=QI4CV<+5hWgvB@#3cMs0|-6$N=z z8lu&=e$U>|C~HjXc6yU@axNq$vng9nsvK}3aJl!I9xl4T0!IBtNQbkI+7T|lwNXzq zfibl`xE_8KpK9_CRO|n2x0`h3f$o1Cdh-7t?5^^EF6A-o{}(s{YR-Y2^!bee%^?=Q zA3K0EmIp8as7OSX8Q(|d-AAyr70%V+J2^yi4!UPPMh(tt} z5t_syB4B-g18ny;zz+LwuLIU!r^!9I8=|x*5)%Lki3h0^m4vKEG&!mx+7#WsVe>4e(bVgYLe{IB`pgv~j~ZX1q{6&n8cNKurc@iP z(CFoGm3n86w&j6FJzQ-EzsEsW~A|LueH2y5*#4aBmN6_YNDf zJgsForu zadbSU$GW9*PeRI*c$(>j%QYejn2td~ifA{^CVSmDdtWj300jIBMxdQXPXZhNc80GO zdjaR=5p0}t=cT{^xlj0F7BNQFDZb+7TYr(jmgAe)udLa`YTroJoh^<+eOKa^$z*+z zpcU8iEA#F^{Gx|j?vyWCU+|okqKRBz%2+mzk$N{#)g*{O@mVF%W*B5(-kDofW+pG3NE&c3P}#drHu+kbMz zxv|*nb6o&v^8Y;CJGA}(4|euf_Mc@uhW+PKOu32yIk)AW+1^x$Ox$Ir^~Vkr!)h1Mu~?XdGnPj%gqUmJQi9ME`P+aJ`? zh-zE6<1@U+1i+AvVUpaJgK(kzWQ8mk!7KnxcW^B9W;n84qq!VYa}MSJfId{+3zDrH z16146e<0_Xg>s{{Tl=ZA@ZB3k4YOA}gDua|-1eODtMW`9OtI%q*C3vtbVIHI#yi|I zy$3|r^b5V_rPpTIbZ$}%XJusj5ua-LpNLSECt--kDV;|HXpsMRcU}2^e|7(RIgcU# z%jl#)&iR5g0CypM*E)c2I1ix(5U8$YEBW5+M|?l!6LoZ~l72n*-VQfm_ImV~B}_S+ z&GxH>2Z=h*y44vY*xMf-a+5tv26Dmy>*~4Wg=$nCW8x zqiEZFXXz9Ry`o+-qFHaMPt#;eG);r3TH*3rxWT@-HBmXxmJTxmYBsvv%Jc~-7-7On zUztQj&|lrD5ps0BeL~)K!7pQxzXIH$yew69>q>{K!6+*6xsqRfPqq9&LL8L+w6_({5jnheh?dBx!}j3u#2*YWnU{}dNoA1IBA9^IupN`s?2}(k*I%_e z!`5poj+fQYf1IEk%9(%2_|N;j1IPboca{HPIgd&I%PC&~sV^J*z6rZNj)x%QS_ex? z0ipM3Y5Lli_GG&RD#K9?L_X5J08k2RM@3^LAs6S6*5!&doUvM1+}mZ;dA(b_`V6G; zg**IPX;+IDR9;F^nf+>4Pn?F8HO23Cby2_1R(e@kzGzpQ;zaRBe$-T8&fuCJB!kJulpJ|Dy`4r?^d=V zD@iaA2mld*Kp^513C0-dxEiv{_loAi~`9pqhy{H9Y z<|Zv}MO0p0DVtQM85{+*L~e<+Apk0;(r@eg6<>O(-v3QlG#<^J`|sac?EjA4_@BE+ z2M25W-%5(L|NBV}`TTo7HFqBMzAx{?683!d>1;w$PI*S+fK-QEFe;TD5=#)el@S}w zx}M;GB}krR~IsVyhj77B(WxD{>Ix$arV zja9h0&V=m_ZZ{y9U=7gCio;u9pIe^7`f1@F#hyk{nLIu}z27P$rM5Ypow`3Qx+svX z97yR>pk6x7^j@Hsa&ijJrY2~0U_HII&x!925l-i-6q)<`uOnn4xBTBjjoR*O- z3>-Jn?p&?8iyp#w6}~kYHHO8tcQ$e7dRWvi**5K6%C14z| zxK9V*G(8{E2B1~o4F->wG@Tdi0?sP1mXW3A#aTmHHpYcC0(8|Tmyd3?lgV~62|B0~ z_j&Pye%k&Oev2RCU%xnN)kgrbv<~_rHc#Q8v(Sxr<^E5pzrBz7(wccE*mVEzV1Li` z|2^1Q$A4T&vG#vwFw}2wqIQCd+6dON=g+z$RQOG~DKz`Dgx#TbjWzU9`DghGoC@k< z?hU=cU5f9&hMeMg2fjvf_f_k9V6?7->-%x@c``gFaQ2peZK%w@*?Aet`CjFx?=a1&}4suGvOEWSmj$h!{iOCyuL@}SW0s?*A60eD(tyF*( z;mFyOaK?M1P&b_5Y&d_*0!mfW`q_4VP6v0qZ;gA~sQ6AmDk=eXo>~>-@~?cv)vW)^ z{oXvsKn?o;-qCI;|M&6EI{)`dilzU{p++0pY_+-QeL$t{;4y9jbZ3^~6R1Z(C$#Ex z9G%$|BUWWwO|V{-bp`8nTV=uBn`j`j?M(F7a$h28TDK{2I_BGuC;cB)9Vxv{b7A8beRJCj3F6352QR6s>~fuL&PJ@hv?_thnD?&S{cTRrf>#w|1OnD zfI7yr4(fbMBVxP~KRc*%$%0#wbx`MQh|`y9#&*7mSa7R;d1GK(6T@+XvL}s4uPTZ{HCXzz;lzN5W2wD$we>rzqqBEmFA=W#{`Bt4)OSYdWIJDcO4G8zvo7-9Qli zw&c^sb$Mu|S^v{|?9%kVy`$3o|DC=4wf?t~V(EYRW@o|rUyU2oW7PkO?yOBei!=Qg zrj#$#_|v9`YxB?A{Ikl^EdRCV?egNk9~_tMKS%5Mk1Hvb{MSRhX!&2`y!{yEf6<+P zb@?yI%gG#mX$AnP1!&r~&;rcHJ&J(&x>gr(eY!LXe6}v-pF=J+6>*|%*Sso@V+ZWB zaa^0amxiCV(DRt3BZwIies92P*;y4*+@#^g4d%oLw(C)zEL8m|b&D?kr55Vc#wHk3 z*|Hh*{EnajLu{hfe$jEE@!Sy%B5M0TOc+|xRZ zYW`Rf-A7@sQK+Q@mbvJ_Fs2;`t$E77h7L+S47#f0(}#sQ&7IWtlrdB`-K7Q>xCQFx z#he0#PDZIQd)H2DpK95zwf42v{-{c`{+~>O<;H*8+dnAzf9>t>uJ!*_6iffV_~~rX zs=xmx)nnB9p(o2w_>)PXb=bvw-`k9Hv-X4+Q~(+e<|R17wZlw5Pq5$@G+fw65?O zm;2m!W%}^DbRs>?wdF~0Sw6%bVm>UwF4!X=LF}YNSnKoO&*PSQ`>H!Za?c z!A1L?*!ITTGOT)au=fIeM`DuVOx_V6$MlymK>>_zjIDSEIVOSzIE+ZTzsJWTtNp48 zVc`sk`qeA=cpd?tU#-j}SAvPDq&;-wZ4O1Z`2~vTrIu#-FYkjd(f|A4@My2(|GmG? z|Gbjo5-S6XUg zeXsN(6|erE-r%735yGpP37lq)1=^(l@9gZm=l@5?Yy00yN^Snf*OX_1eIhX-=GzYl z2u_m0hqfbl|IO){u^;HYKo>aWgd>GE!fF|8foOwxgIsVf@u3trd9Xel-z%I(sKo}u zOPyud8tpc``6d>eJF-Y)xxmbkwdos8N!LEhq>b)kbyg=WrAK8#Mo35;MGoJs%{ghv zeb1Mk9y&GblV|s>l|9eGROgs6hSKzxN2)XUcgCUdM zJK#G-ZgC@vq{DK6Qx!b8Ow!g9e5yF7i=|Q};imEHaGUj*MSvX}>LJchL@+ov5NEbJ zDJi??R1SrxIp#DTpr1W!YU75nh~Rj0t2FuHRAci)y=_JDSNB`F)evjr#L1i~KFqfu zdNTn0Cc%N)U}&EFo`}wp?pysDc`$jv3hBD6wAAST={QQ{dwIC`0u^-CI%)o-+-&6_XmXX+#wJ>kI7{#0u%c<4T-)FLeFoji z%?R7I-`X^RXVr9(pR9&9(AE;@Qzn;O1DZ_mt4sp#LRoOvOKWM-U4Fb8b&dYV$H3R; zR{i7YDohTt?9ojTl|7-DK-2ba)mxwyRkVIUU;^Hrx`@Y}Lx%R>NoPC3$NQ>Ex-0LebOGOX_g zR+YKpPUA3drYhZ;_8uEz{sZ_pi25B>yR(Tlo|{DWr1I*$K;H_bn}UE#2^{c5DZ$}A z!g;f$(}|*+2K_5NI~1RO7f1JCdXJ{Qqco zt^cp2$ncBG?|VUm(7z|tK{+0SZOiDwK7xOp5HzeXxrI&we#a}f5%3mC_OePkW zHH`S4Y~fZc&xp_NebbZ;@X+AyzVa{x6w)e#gL%(VJWwLW&2`SzTKYrQVZ7|3?> z#O-2uDT{G>Z+ccvs+?CvdyV(NEwN>gQRa)?v>c-Idu8pq@hwCL`1cI%Fy9h|G|j$J zF>pIo$USal-%~31KWu?}9}|`?-~MxOP_q9V@9eDk|4NGD|I*~KjV{E1&&&M*SQq9_ z>nw^TVXzSEPtM-~rPlo2>cBGG@UkGeNLj`L7Mal^vLNZ8&M?dLf81t7PTFvmW=6hn z)2jzY(LI+kKB(MvBnm5^n_uZZts<1}3Cg3bs2V~#=#P+wyd}j^{#$G(^wkr0?*bSD zDhBHC%*9(~gTC-oH{Q4(#VjPgPx9v;r#HAWga8N6POE%pMAY;+vB{qO1#Q4Z3;0p^ z3s!kcl|QF(rv9!()#!gKgp2wPG&1nobx%pbJ$KM_`; zy^gez**6og*KyX>rb|6G`YCq?Lpm73feVgdKj7{TtiIGO*y5~KS5os&e_XR#zs!@{ z#guyee=!E2di{TQXTRkCcYJ)b&i}TOV(I^jGXO~qdR_}q>pcKM?k+&HR{6ZWX{U_% za{Tn%>&H@(UBZbnOIzGPwm+!9H0$Hk_V=?~L9W8UYtMPkC&85y9Pca|^NghD7agAv zt|F8txSjhtZ)^s#_`}-OM77J?sDN-B+Xh~ib(9_uPO|jK$akQj0VDAx$CO*Jw zH$Od9H$B3_;WVRKXaS#Yc{$D7cvdKi^|Wq2>nmo0vsAps`BHcFy35sj z6^_6@Hx$gSjY_Jdux@A3$Mm_iYrd2E8Ze*puwD;=abB+ka)cZ^zh8$K;UvE!5vq~n(B8G-pz#A6-aH#J{6d9Z%{RvrrrjuoELi3$C;U6 zOZ{@;91!|ovA@I^kD0xfN(RHZSsy@5NV;?$_@yx=ARLY7VosmisPc$Pt^H5^FI4X{ z7We6(_c4%r_K!4aZxL)b|KB;@bI$+w_7C>g`F~bYob&%cn`9Ovxr4&OvvNNG+X4vw z08{Q|4D1(U1pK2eEMGx-Q7!*<;<=i(Kn^(V`X`?jH9KZnhD0zT|{}PS@JVE%25wNr;9kfxNz*jMadhM^wBW7LyS1IoIX>h?J z8r(NfsWuG9&_bCPvo!8kS7T~C}>Fz1rg9F`G4y+*vweMuW+oLJ-N)^p3j6Bh)#cyw0+GEL}R9?`YS}|GK}k-v6zpIQ(A^?_yZKhW04Ae1ZHb)IQysV(B)s z?&Hx#En7G0@(c&JCR@Lx@gO3X;&BIcE>hAb>B}*W^b=(WEFP8957=D4z(zGT1KYQ| zJ0-u@trnP6Fnqfe$>|I1>yLk3zY_&Zh)l=%p&Z1ts5`v_O7U%RyQ)aTDF}jVd~$p( zdwW~VZ8pF`dHsaZ8S&o3qi9r*9a>&sxzJlT+M*3C}cY3Ce3@Vaxz zC$KeBn9jB(TWOhA{wL#`i1OiEmc1u9ygv=YlyF`jC$ee(w|ngPf9|d0Kd!1c^1o_$ z7j%$Y0sT?x2i2Wf{6_G(YD_dzan@_zfGH)0k%Mwt)@&e}8w+iT|*7aIn9&|F5Jt{Qpu8FVf??7{2dJnn%g*OMO_y zuFz@JVb)kbZZh_%imthjk~mY&_c3YQ_T{Y^;AYtQIbE7k4L6(4F{;@8IW5WUU)~F+ zujCiwok1I?e@!DK*<^WV0^fB51=jWRQNxtc5n*HS(dw$dFG;}S(0hl|NTOI=-c=Bs z>JEH;b65TJ-FU5WN-6=9w|D(5o11A}rEomg8(8&bQ%}u)#Bg>bHik6LI_?bu11?MD z6-EtuXA^A)S8E-NA*r+Yqjo?mbUueWkLd;yMKwfzc~BMfg1KE-lH$n!JQmA>#lN06k5~E^Jy^W( z*HmB2{+_$L6ifc=thh_M z$n7L2o-@=$4YUUkal%NKUY91_fAv~teQpzn!kYr!u+vX_8QW-k%CHo=W4`DV&S1@a zQQO6G{yW?GaFoMV=tdsn)oqRZQm=3qw5yFTq3O83%Kh+)U;bw-#RJm&h=YJ|{)UBf zC4z3W|L?i}|2sQJYyZEM6q)(%C&(}ZgNDdnWKRiG7b(yWy%m28~&o0mB zO#sv6|9`NvQ_BB)xX%B$k^&O`?YEcc?DBlhO}?BoT{&l_Pxm{Uv=@9ROzDKA@-xUs zpsLH~5FT1=MRXPUH^S05E?*CEO4M8Nr(mZ7f*=e$Ffs+#StcA3EbgQr;MD4>;KXJ^ zEqH9OWif&&!5Kjqjbr-Dn4lq!!-#CD?)RWu&r%|`ZDboK$@YXr;}N8XFLJiSqwnEM zXtWSWf8x*n#5;~JBoNkm1k^O27zraJ^wTU$>CHIHZ<^_`QXwvUEx0i+)cEiIt(-K>EBA08f+`2RZo|7wb~|GxQVar|G-nJ1bA7>HfTy$$TNzlOm_m6j6|DWBRqr)}-UqvzOf0uHw5sWr6_`tjZ z!I?x4&K%f|rp-%ch$=R{kN-ji&c#?VJN z?nInq$jJ*vKb;9mok{AI`j$6jzAzItG6~<2!y3E1Wr527D^j@bhDjI1OebAD+Xe~&pR4LkbM%-7^FGnD8QU-%4S51_F1D1 zSvN;xRGt6Q_}~O>=&YBb*PYGMa8NEDX#=z#aZPeD=pAcL$xCVG5SJ6(_)Luzso)xh zd>Z?sk>aEsaL9W1bJ3FzD&w7+@E&`kZD=j1q^_>b*2QvQ5@=4%1WRQwr$RL@WmUuc z&PnK5YOgW9s)K|){Jluo4Zex)(U_C|Sj=v8c8+*JVw_UO9Y=vi($%->+O$h2wSp= z=;-;jjoz{h@o|!{RA?Bc^`wnclpv0DiVBVMU^!qN)PbS!rc$RF8OdDd`g8B;?SNz! zdEvW;GuxtX#lh{LCi;?iu0wT7z}j?IBLQmE2@uUy>>oVs6fwd{2SCg)a7HU%BbYQgHlN^V)!8zW%#8q8(r)#7VoBB& zI#0tw$#D{OX>6g!J+sT-xV@zW`U`lCZ2&e%HC zHYeNKYeAQ3^uNnD-z-J{J34gZ|LyMXAFcJjRTNwQTf#xmzoh;**SXObrvF{O`KD6; z(*Qp~z`pZsCHf!gj5$eTu-$eN%=sNl!&PgAMUR)G6`Bg6s}aii>+|Q&k$Oo(=o~_+qnb{M$1?QO|9GSds&5W`ZUxnY(_>Xo8_4@*DX6XVzgaJSs?y~D zbG*Cf`2QRqAFb_wD=G3!fux-BjKl$1*qzU$fay~K>koPzWv;anh>&~oYoMXtwaxci z)qy2wWY04v-+yte*+HG+P_ttn2X^GYz(-$Fq38@5&n|E_go;0bca2bgz{913IspU_ z1ToVI$%F=uQLMx_-Sb9?Xl+gdb1s=2RD3yQuus*Pi$&wj6gPE4hSLGbE=fd!jHOQc z1|@W>YS$-lsO+o-LwEaUG4;zm_M~yB!eQ|@CB6Lrj-|H|!(s1Zkh1un?B+5d!R!*C zY5%`h+W+tDt?&P>rbzCdviLvQ%>sh{=$X?sCeCX8ePCN23`sbS^v+!Uf}`@3#i-BH z5ze*{CjOY<*btp3Sv1aqbt8c|3bpvNVI@U`#(j_*-QFlP=TF^vEfQSnz6tAW+Oz`$dF zpsf;De;1$qcQq5O;7_%}-#?ER@A1XQJP{n+*)!_Lzvn&=rMMKdUlodJNTP(KUCJ*r zmLw$XxSlBaj!HLU1}CuZ{0S2O9SHv0Z_?dm!;({a1PVl5yU^9&H;wjxN570&rd%QN zRjOfIB+#qY|FLI5Ixf4V8U~UbxoSHAs%l+2@ch*bpu4hHHLKBqSY6eCy06?uD%PM2 z(qGSj7t=`L31crI=!qa+{FB{W72FwhaLpy$1WQ5J)|NEI;5p?)4MFeOPu1I%45NI&n&N)yT{ zi|f=T7KNbO(EwkP%+Qv^Ul@$bDU)uLN?}TIMh5p1PC?Udm1cY5jtI=mu267!;-?0`K zaBM{K$G&az;?yUj^&Ow`R7^m)CZuc2SH5ZI2yg*5;Vf; zt+Y&04yGx&y|=AMN6Pj$N+M#o35A4%Q;5&77Tp)7HBjZW>5C89I114XLFqUK1;Zk}+5D7ROr}7}s zFzclx!s1iy=>!IcD>@=58{#a-XN2#;`v98JG>7{49GnwiECdXaj%Y08AI<)M>Jm{N zCz5dr-_tlF1Cn-SjMPk71h)#aB1bWqkhFjnqHrv6lv%K(^)QQ6Pfz<9NxxO&bb_v~ zUi)64NK7P2i-`6Km?>EwVOTKG-y!D3c#}^g7z4pJ2+f8hMQ3vA5X4f5Zc4( z5LB!IG4<7J0g6Nag8LvMXfVbpjx$0y+92IQSF{Pyb5p)4Z<9G-NSL1?W;|#< zYVD52Uu89@`G_Gp^D9YN0p*4SY(z@kRZtKejYvpwMxuK~FPi0~>Y^*F0URYmyd9AV zi9jEwT)GCSE}@%y<>|-e5X)$$fXda?YkP3|1ZQLL@-x}Q8y1oiJ@)Fib}}Ly4cQ&K zV4=xZ5cm$JIJgCx}sZsww z+&?;Y<3Ankto^@MQl$SE3m2*XCoG)a)qf$eJ)~MN=JMKiO5#xIP8TekQcyxC7USy$ zW;!bletz@2#($25-SS5>?Wur`3iV4sxwK$jv0DD3XA+Wg-V5-od&gFn+VeiZx#`0d6|Ds8L(Q; zDJiXjaVj&83lV(MZdjeK7L&?r&pyGjHi9e!_M_HavOZf`x7ti^8TE1gsjcATle0Xj*E_?;QosKz?mgtL z;6F`&C8%Nlx3^b{|FeIzbG+XFt)f`|-;28Y<9g5jH0}MLSr33*o0|CCF{CK~`CTB- z`HpEcD_1Wa(U?XvxB3jO#-&7dQ{V2c_ky)eoaOh9Q%?l|(@H8HQ|tZ`IK6iYH`|VK zjqhwWT+}SLmVFTadv&vDx{O%WJD(Ta5%#9z%1r8BwL6xbO*sYW%vj2N~K857_(EwwL12ldZDj{@@FpX<$vK< zIIRlMB>#7JT={>nzrXhXSV?jHe;2L-_@>R0wE)}yHurBVi*nnQP&H%vIJ+<7ww+y;ql%sML+oq{x_tTvm?v6)3kxAJ<0 z^MEM&F>%T5`NEJC#V>kc%-tpdg|G$!w`+qK6@UQp%?On1Kz2~=j?r!+4m!;i)`P16%x>a2% z5xIAg>8jKu(#m^x6SS)gD5zVgXrZJXIM~(6w!C}fmr|#S?vyWexEp$N1{t-@eSLL5 z^T1M^Waw^4;xZ8m|42=N4<)op$>=L^^|;YB;c9%cU|id1XltEg38lUK*AJ&x0-EIi z!GRn9a>Bb?rwQtr82##4D@m7&Bo0dBziCmKJd3*loUw%oR&!z>1 z|FV!M;p`Q6=2)7+O^Q0b7w9w&EwZcmWsu!NcwNb%LGK0J@31pUMJd7IJ;FKU(!8-7 zF(#-5-W16Oao@$!J z?%~1yI{)uV3aryNn8t|2S$dx^8fOrSOI~`rNehlxEu~?~ba51QoPDWZHIUV5OtTK^ zPVog!lIY&}ftF0)jxe?jcUaDXQLe}C7#|9!NxyVn0#QegeRW;hi3N`$y{6y$A} zyj+pC)PI9-3F2dU;a5oilz>_(B>mq`-@Ha7OhUD#l>DthNep`S)AK?K(7vm^W zE%E7^D&2}`)g`zPfYjxYDO0Rb;Gh-gSD!MH#yCRfaYoWU4yK$A zM17xs-m2A$pQh{&M2KzySZmGGLDx$4G^0P;s8_VG)&b@%mGWPxXA9Z@H0u9*?)}fh zqy4?L{9i?}3}?8ooSElss5xG~snR>z07(ZLj)E=r^_e_x8?jiu3w4Z=)@p&Xfmm~b zSxRaBE5_UVXecam@_{D(|M+0vjsLWNw9fywk|Is}#ZaTm1mB4XFuUpBtMOX){u)l= z{n#=Q*micKo@r|50gi~-t@2T?`Dv9s9XzOs_#UHxCAklw*{W+Ub`I^qnEsNGq8nBzIAb7o91eG*p8&MrG=}F>M+ckqn18!&5*q>?k{RHrn6ke;6;V#5pJ z2uf2URFk5gveAEX7T1obL5KlSNKFw{p+u7BA4SvLNm|zl<(Hx5Rg(ATlE|Q5Z~&CC z`kC)2t`ar!U)x3I-UT%J|Lv9Xf9>qA{r^@{uEJQ6Y_LAo$;klqpK5vc5-zgR*l5!y3c(qbIt0kUM3N) ziYt;{-EKf)lHzDa9nU1EM@?!knU=4RT@*}P^Z-JTxKlA1DTlsZT!ede;mO@sm=< zct(ZVG9!S{^9M5H6NRpdhfp!<9x>j8fw1YZDmpfp2RKwVjZES9;o2v#W zo$mQ8!gS=hQN5DW;gmnKf5|VheD6c;4toVuqHz3)^_iO4yHiR<(qHN z+2y&@pC;mRxt_axbaQrjJ|EY0TYb*yucZh;@T`^8nFN=juIH-y^C9L#bycf0dtn00 zrmc1%=brs&h*NjAAYZ_vkc}{n-HK&g$_vSSTZZUu+jEEB)g#6+{bj5sbB1pv_sST; z^6rw#F9?hV`nYAIjX=7vaR$2A77B(q9!TM#76;?Gqdw(uxh`RxLuN$Z^nzZBk-%X@ z()~R?9$7v24Po6Hv#2<+*BrpDns9!gNy=oRbCBG8bkhwu?cV;GcPaBMs%mRRN+)xI z;D-3LmQdHn7wmCY{0cOKASI#8MfIYCYPs$x7O^}0 zEH+y}!*R^AJT-}x!LN8T1KiNGag8}i%l*|)Q76Hi-?238IPt9H)5hk!tGbktu$HG3 zlcyNXZYU=qe3#!#u|ITD!=nXSe+opri?5ibkPhvqDa4S(Bbm%4aiI4RCzW#4)S+tS z=-Y2E=a8dupReU;X-=#~)?6Yh?(=y?*6bkW5m~F`1ztYrYy+k-o3}yJmxI2&ZK68l zk@NEro6xK6zv&HLkO8>y{+}=Y$NK*7N{YOp|IO*y;!gZ!425Y8!162GS5C(yE2K4; zinK*Xe8Rge)0Dt;t`0=#w>pcDOmj2*_Sl&L_=;QxL|e_C0#h4^N`_fa#8`jqJG<@W zU1jjb`g_QJ3-ej9#iDF|_W&m5=Rfv7?<>3ZUuj6tExAV_BU0M~i{}=?oR3FDMc4Eg zUm^bF5c40%y+apiFBgD2K7(n6KdJGR9rCk&PA&5MUUIevdU{_i|M|Rbe|c$=|GS4r zuKeF$pZ~6=D2@V_tHm7w^BH~pc(aQiFZuTIN|!!9lP_PD6H%>H=AX%f?=i?h{$Snq zY+t=bDZ6$rTf3KiVWm#~L*%suC;(0J|7d^5mH&t9`~Rycir2}&j0-aXBMyF6n>MUm zAa+qlRw%_(G@J9stb9-#)pc1)spS7UHtF)u|920MOa6a{d+YuGN{V&2jzfS1r7D6( zu9RU=aRU}-n8s*GqLH1$Qwajf(U^~M6x~B6@*z$V5+mFfYO~-rG#+U2(ofk4;W+2` zQvIhPG^7IH1}sfU5LuGrw7~CjtSA=`O-oX=khyah!5GF z{+Wj>k-$~&4Qq*Z;0_6l-<{a|jiV6V;W(3ii|g@T+F?p6=R0Ej57=YPBJlR#NZFeCp5xYFeLC4=Fc5YLo*Drv5Cr$1kON5 z*+z;udb;9RAq;bDgzv?q!6+qs9A!dDQB$+)d?+ZN_x1$+BmPH>{xp&QUlL6Pe8VRC zVq@1FoT@O;4@{^k{=c`sbI{%C?)JK3b<;u2QnIi%8uolFRdPlCU)6h!05=p+UrM={|kZeR=uu zGGi$bK+dEJ{?pkd3TeupKIsl<)|3CqPCR|mz4w)2i=}k%^vR3=SA6#qPAMC6bpG;{z#>VR5Kd2@bZJO% zPkofKe?EQEo$!E#r1ub3eNo)?4@|Usk4KBx_^Z<7|FL`E=6~JaKV18NuB70E{zOtv zS$u*fdrzN;o%@N}^*?8;AzLl5O02Q_CUB6EQiX(J}GaRvj5OUAZsj4It z!5e}I&4v&@0DXm%B%%SZfUl5{py(?F_bd60;4=WCs3>1>NF|R^z@kWnJY)S_uj5j{ zs|FR*3S|_7iR_|KInrQACt`6w6AbT$AZf8Ap>FoI*-4JzrhiD#SVnXkXEdT2C0wB1 zAIE__9O$#u$d?+i0@??C!bu zKlYA}*YbZQrI2@LbwXV{g9?J*y?F80)Aw)B-+p(3uD(CNL}%ZhzQ01}m+0-gEA-~o z>Dw!G^$vaW3Z1{bygGgT`qfMH^8Ed)v#ZyCd+|a5(CiYUpT8&3$VTBq&U(dGw9ALR zkOjP#v4jS^rzFouDb0G%M4inpI?ul1C>f`Tkd#!)<3Y;CiQu%#ULUam4bTnA?g)|0 z>-Nw5|373SC0KYD3FIzm90)BVVqhImVpH)+aDv05VuJ#vC9N0TVGi3Su$ZJI90vrA zFpV=3V*xZ^JhKqcqFyL2%7OwiIK4+W7*aA3hzuBx1SV2!ynO$+E(o1x=seC+7LGv= z$jK^Yq|#cr?z@(iXh@=jq#WH1X)x5v(pVYLl-`13a;H%PhAxMxG%%Z5%R(a@;{i## zYexUrip&3tg8+R20MC5^pwa%bFTUkFG_gRAsyD&j`ZMoev?eVGs={;q8{OSbFHda$4DDeB@4DL2=(P%+DO!xF4848ug&mDnuYYh;G5Emj44}#Wb8zg&|2jU{ zUElv%Ns;US$~+*Gu^u_XLP5KU#sm&nK&8Tv+D9@8c?_qN7qPpP-e%#`CwDX((%5t# zQ3_JGhNGzI=G*{=BeY3=ex^>`F3nrFG6JW3QgT$axJls++ATh%eWYFYR6F3scscI( z=_mUr&uqlJiZYQACC%3gR<{7PshhO@E1vU7aCM)^@S*A>C-Fn44STKPs}@!k2Q=K2 zy=>6sdzKT8MpXq8F3u2Lyr!qGfqtjH$bZZ6tElzcZzK*4 zN*WG|Ieu?hNG@2Kbu3(9Qm85pfa0fgPle-{9Cz57XqZ}8kcK67AOz-C%Vn%nJ=)Hs zbJl+s4w!Q9NQH36=-ouQHR)x$iGD{}N=L>x@2U2*KyRG$4Wi$a{EuDmtI}Tne}oa4 zMGI)M|LnN;fA)5c_SW{Fl@uxe-%F1h=_^B!JlutZDPahCd~tNaq!}bd*iiwdkm`C> zn^M(~?i0(c1>Q$*ySD$Xq-gyw8>jh!e#(-R!j0tI;sA=@OH9D{l4;vdt>$OWnGn9@BHJ=9dts$29+RHK<-@I3xXWGz(R^`gUb>od;QU-?0|a z8=M8h-emWNWY~-D=Uy#eUTMYum2qU&1Ar#}e^5UEJJ>x~^Z!*8OaD{GT1fB|A{?ZQ z^EL}z8;oI%YOf8LJ2hu}%0AdtDq(wzoME}|N_XYc+}jLELwVA@9p8{NCK=&f%6hrm zp4k7EzVYd%emK(4A>6*Xw+|b&LBxfi+3Th1#GDi^5o6nrX2YqfJ_GT8Okbe(I!LSP$}pq5WX4nRe5SuD;((kWnE*{y>)w)k;}=+qka6Nt z`g3i{__wzFUyk~+&VLW~O8Nhf_ty9SS5qW^di5#M7yiww``R79k}aA1#CKl1q3_B& z89|N8u}+MjD=7X92bP*4h)VA!Bu!~Z;FxC|2k2;Do%qNDR@B+oWj+<2;k zT&cnuab|pSAdmEP5hr!dmY(j-%tKqQW@iyQyri_44T2dd){6CPfA3xRYa7pJDGmC+lw>63 zy^kcG(3Hhs8l7${(4hbC?;Pzr_W#}W{r?pe%m2d|Vl=@i#WxYDv+w4!qicNmllstP zQY4<}$FR>gSdzoac`ziSJiI0Of!r5PV7bSa39b_iNpP#`MU?9Ro0~S@Gry6>fp1eb zx-?S9Eeji&UrVxW_2UO}pX0Y}_-dLsDt*m#UC+^0er!3g_oRQKgRJS8-6>iOQl2Z%wG9|q@m`g)h z;hY7kCA{zRYFwN6fz?XkSGm)ydo>S91W!=MxM5Lzi2nGa zVz-px-XjF*6$&i{Az z58d^@w_g9NDbD(r4)Sxae+>Zq%(-J&G@SLdtG=O$3N7T*mUPtzPGMA^nOy)d53|sY z`W*pIVK1HPr8#`tcI*c@g?GQ)b66i5)vV{abG^w`BvwPlGkr@-|80QLkASyWe)?rl z@_glwKZ^YlfQaR}gXi>nt?B)%mwNtRoG#Yu4fE=I*?%}e8s@*K=^WqWT}=r@F5^9(r8pyl`<{l` zuE+ApN1l*C-+oXK0q@+OVK+Y?)9U8?Vp0%P87 zgto+K>%icdLP5*9wd8Dn1{_kpr*yi89ubv|bh&(gG}ns!L_eJsZ|hD(^EuQN;6AEDx}}(fyFMF_{9YjYE|Hp>dAw#@c(tZ&cMfgj zQFvTf(5D~Bz4qN?msv{V!Dg)oS)mUa^o5K#`Z!a$l(nSkL!sq!MGSC8n}cK}!+XWB z03IY_8#NlGU;Be%q3+W)Nfx7Pe0+{tH) z0nw!Y9q+pQfA?T-f6f0_Q6xt~2%-0CtdTL&1q-U?Kt**^{o7z^ah(e?Uu*cUMSY&X z93*2)hm=;096V@z&;&opwZl5N+N~)_#!}VPNgI%N7H}q@R*s#)M}&b{+I!cV}dyd${w4R$XeFVf^dYzZ4X6n0}!&>3_S2<@>*f z>-E2qqApPgNe@0$7=ff`eRNCiZ7V4l<&g(|91Bix!|auD6?(@*04J1^LBoO2;MZqD>@qV}ElpW$S5@i1lc_ z={8Avt$&yw3zgWaw-2_eEgq-gZ+~I?`VI`|5sA< zohF$LDoK7~(Rf7OuyL%SJ+|@uP}8Jv`#7}$oyTVyN@oeXQU`5&PwMtbNFDc?#eyqd zYS|%n=3D4Fo{Ydz+O2Is%8&B0bWGq2rLl&^-A8C}GAf)!JQwWptCh_)wIXP`%*RFK z=aIni0%t?{Mu5v7S#BlpijQxM7wT8>rTyCDn*y~`fG3qhP z5GPs30$_zbEuvog!$QyLj7mT0xwGkH`=6;HJn=OW;tX?j!^mys`GiF;1(1`!$W+T# zZJ>+sz(hEoF!`eba!&J7FVyNum4)+rMe}b{HlqJi!s!%9{oxNlTNkgT^)=n^NCxqY zCkpwtC+)fmIEuVWe?bC8q2<4|QOkt7)7;f4(<7H3iZW6t%tW7Ds9P*-Nu-ibrlprh z|Cow?pIbd!dTFWu3+5?S{ZEoVQ5H|J4`|Z=cS`X;_x6w1@jq8mBy&*1O7fk)7;l-s z8>~J&Apz~vKn5Ek!MDc`;);j%dPB#O_G=Q8Xh17)W_Gin9*ta3SG3A(?bg zMTcZ8Y{gh+RQu6v_6>t#5;?Qu3DqUtrG zTzz>rBq_mM*18rtS5f~OY;{y&K|bM85)s~oNEoF)Xk#1s1#N)Cect7rO*sIYXd}wd zhJO4zib%YP_8nLn9@vcx!ju}+`AI5T^bD|rt`D0%PxV$9wZLjuV3mb8A7!Y%j}sR8 zu$!*ABCLKH2Z-T6#N0z3d!@`g1ZL~amu+*F0NIocRpBdMaECT}LXv#%@B-p;f?^34 z=30A^KNqci)Ipj2N`yOOif`P_Lj?&n9=07E*~cdnmEr$ z0f0q}mA=BG`(z)1iSdJ`PMZd?emuO;J!7-tVbJ@H(g?J%I_Tyrh+lyUM|@Qp>-U0b(zMArY(m>62|IkMoI4p>~nd5l-(< z(Dn0g$5A9!&b55=E*p}Rn=iJXUzP$yUJJnX+v)dxI(UN<8$|xt=vk1G%*9v-^paHq91&zVxH>RN>ehYrDI;l&BXk~T zB<(}~>}&dI`}zAK&g8b_$Jb&4e2u=QT#t-0biOBsOSIt$NM`a{(pS5zW=q7lJkF9 z!RRFm#v>AE>J$iM!FLh6!4Vh?U&;ewF5W=ATPEG(5g)Q~6oL^eCNk*w4TM{c2P8xZ zN%L6pPoMmbejxX*5pCM?J3!V-s^m`JG(3QRctEwu*;nz#TgOmc|Gqfx4 zKiQtQpd84F_s^o(54}~UYFFT&yC=iQ>KxtE(*HW7L3S z2YnnxH#oS}%%Pj4?1ret+0=t;4!3`<+xB3XWr^y6UenMVL{LC?LlOfMlABRTM-Fk{ z^F!~5Oi0w&0~K=oLPz>pU=PrB7Pvjo@!j*tLRJ0H6`RLE)od{eQ}*CG&j)|)=|Sx% znAkV>AR#HIJR@;qFQ)B*_CdO~W>L{xeJ{+4ZPo!D5jOTQGOGs;FKU=YmxQ1j60tka zI?(N@Go{Lv&}t0K9&~?(pC2B754tp_8O6~{65;zx60kVrQ*%>q4}5?dyD>`-5|UCD z>L!XYn7aoy;C4eWQxDWITU}U44;;YDn?-$0qj5^EhAH7g7KIDzK?!i1KFrbsJ`MuH z`Qm#}0^G6(PoHdWZ;Su@Ea61Fy1u@?$D`=!6RS_^qTqzYgzFo0p4E7Qc6XE$qdC!w z$M)&yLC-cy4Dn&BnPT;&2NFM-dE zmYTNqa+nsW!z!His&P8nsil>@FbacA6tEOdaHRk`$UzOk%3u@C^c9zENJcf7 zZ3&qYU`_xjWrUj5-eg#pZ1a+BT>9NGEX`?GGTNTS!ep3*Y79yz{%Ug;Tl2X3dutl! zyEdPqQD_;z8!E={NU*+NS**?$sLJm~CM3NF_eeSA1Bjy1MCBqdqlz}rjB~!rnFi9tqAmq(s$M4{>g2oGWI>gQj!E?0Aqk zzy0a_<@xEyv(t-9?^g(2N0d)HH%zD-aIsVCAYf1fx&Ph8kAib2m~#?tHshSIP{mgjCrSpzSd?}frN8=VWB)h$ZpWAK{Bx7^10`i8NH;Mi-vtirh-=-fCD8PDFzNRPg+ zX2ZE2=-fD`1ax~9Ski;@ENieH=-fCLfiS&a&4zP5&_&>^qHg+eo{4YN1DzXZG4)O( zin*7W&WLk8(7AEWSVYpwQ_UH1t_M0d&gnQ7JL9tmbLmIv;5^$Jbb)S2`-}`jImBsp z#^Q{8QYp%DbcgRb%J3}&FA7LV;(%;c;*7@`19yGfKkbU$l6YobR}XYkjZw1B5i3c|zlvg|#PfuVE+1102) zr;Z`z?(KzvmelJ)H4{`{oxZozRF3$SWb)bokl_fnTCgbDb3* z2!5Od0UIS3DeF_~7-B~Lyj=XcS?*ppBmY}6eo0Qp2ZEoOPRaiMVT`Yp?g@vXh2IP| zgQemZrYw07_$92-_j!@}mCv-?gkQJs6>BDbpHIFS_?^MUkFpK&v#wu(A0H=4MBs)? zde^2k0X7L zsE9{v_5wTG?L5D|wmOnu+KS7zJ4dcrpFo^T!?Ujctp zmP%!k#Kny?Xn~_KqzTA|1ofHVN#a+);t7d?9a%`-vGkUt=L!@d8JjA*?@zGkeZP z5CBWwXwMjnIM8OyiDYKujE!(c14$bsGwJf~(e4B(y#VLEF4FK_eMCz1CsWJBpPi?dvNbrF%a7{mPk?-ZyNK$xIAdxw>^=8 z7Je3k5iuNo*wB9!SF<;vMlSb0Y~+8sb(DYchYj_I``+*}{;*;E@U+#ZgAq=kE%~R> zNRX0Dv?2b_9|M)e>XBgz_=gSmiHoK>Sje$ezw>J84GunRh<}SOl`F}I4gHt>%7})b zsu)k~syY}#9t%NzPUhluSC44sE<&kQ9Z`LbxFh+`Yl0R?n%F3zcN0ze&os2u3Q;0SYw z*w0Ox6f3k4%iBVA`p|$%!yUdHmG4;;@&XH~TvBJW8c@+$BNXsji+uTVHtdE)T^XyD zBbK6cCgo+uXVj-xQ0BwAlPziB{r3VE>uomPLCmYeV}xwtDNBc%;-=lly0BQjYS{L&q3_z_JkZ3@c)^HgEE|$^yKN84 zpnfmRN~3X*5wi|8uvJ3u&W4|2sN3-f{H5gX4pB{Ku7) zXN6%NSTyJ35s}yF#1dBqu_5LNqa-DL`bqHlYi*e5=Ee#oS`rpsCM39?+E1;uTiP_b z(>kBEQX_L=td2Iih4IFtxlMJ%SfxR#a~7pQ8kDHP!cy9%a-?Xbu_=@qu>dpC zC5cFov9$5HFjq`|N7wM>bxsS}vb6RA6*30az*e+KWX#WbXmLq0xAT}I6L2FIJPT=T z%nKI_YkT3x;%-QUgcqHck_I$PNM0%~&OAQQ7#qUwrI34g08{*&mk>RfWVZ->5SBPkz1ouHiK5XQF7KY=L-4Om^L;hb_Xtj_2hmGQn zpphr`D1-P(S2ANTx3rLD2vqDmzcRv^RwI|n{9QYaPcDrAgCBwh}SK7jY+GyDS z@9pjGmiGU9hwJ_SD#|l-nhy9PxBj(Sc*!gvx%ZXffxb-5p>44>jA|dQW#|#p=^J9D zYRZ9YXwUX`vbSfJjQsh7B_nY<*x;L8bl#W#H}dM^mfmvc$cVp zU+z9cbnis`Yk|=NZvjVWJAd|`^WBQ) zdmhkow0ywzA9D*&KmV7;)J5@_2L6A1yuat}{|=AW`9D`uo}pLqP*3@ni~`)_N)$9(f*HDv2i>d=s`)-dqqZs4CdY&$r~>pGw5R zwaV(NJmsQ$>0u<@fX|2Pt;-!6akc4Mi)#t^e7KTN368^ekmL&@(={BB z+qhl}l>$2TSL28rK%xyChWY)iaTEcO!G%Du;!VfZ65cwv$~!qV^Jl*KYJtxu?~HUc zft4rgLguS%V(Q7-fU9pl%|BliuG3D|23$*%wb`L#vGdg#0teSVB~e(%>*kxUIrypP zY7MUP56A=V;yTY90H`t#`wXQDSDetFNXkoEQ5n}-x;nU4L2Zre(P7kRu%5cSQ@==DNC;=eUk&5XfdjbnPy>Yq&s{F};{n#8M6kQztm0 zA(S z-C-H-Fkmt43b3MLK|~a!1Q2E8jMI=v?|;f=p4a7@7sPb808Wx$32?vIciKX(_E~z5&@%*=TlIpJ^GqiG{YtZc=VHNE zWhgR!sa>sH3$7XzmB3NL*N=k|p5`+3bV4>SE7i5FYLpsAaKK@&Fe{#ii{W7j3C)~6 z*yW<-1dT|BL!9BRAIX9RpPT-2 z*bmbPv^uXsr`^`ppVfI7R+xRn;5Adxi5pevw(Ya`Knt@Od`u+OZlwKobUK&Fdg#+5 zIm;uCYY(sWR1h^SZEf4-HzD8<@|)i8Q1rR-JOPLpuEpp#U}4d-aLtE z^<{6ML=Q`cusPqHZcB5WZ)uFp!u8Y}ifxN&Rc=U{_Cu9hjv3B^EA@YMZ)OoXW|RN# z(cWQ6|KD5d|0^j{|9=fW44+f~ZyTU-3N^p1!cQ5Zv5lsl%V|NvqAyz8ZdA5i@7Air zRkInTrnHZ2Sa~j5R!XdPcR!v>!nOt?(FV9Y2zXH!(@uXwK zJuz*?KWSTWr?nMXHuo?r$tw`_(A_Uu(2E|H1ih4`xz*GaqAEvHg(=nje6Qm3mUdPb z+Evg9J?;3cu4H-?a%N?wo^McE zD*Ir@G`;#e`lH+xqYt5)a94j{SRc$(QtkU-MPhA8dnLML^Z~-RseZ@`<*sa;su;Ez zQ+0%j1Al$Ie08A$`&Fx7$Op9>AldJv2h=-)|*1;zq)_RP=IIAdy8xC-`wZj z*LFfMuUX;CiLYZyW4`+PiEs68DEi4Q2m~*Vow)(o7ST8kNor6CLW!sh64S1)1vDxa z)~Xx6Jo@ED`|$#B{!ZY0#iXITuj>mu z^cqcAh&EnPX;(MavwCghBb6@8v*D$U+z{{chTAF3clAl9g&m5W;o3rZx?;GoPL1=0NzB^ z5%Zlc%yebn*o5V6>O-^5iY_Fqm`V~mog5SyT@d7%whMB%lV)2cUM8Ij)aIK=L&mdN zCz9QT{4b*m0{RxZ{WI5FHEADu_Y$37%+RxnQ82FY%-MzOUU?J*^o0#V)hJ|H@;$*J zNqJk2)Rf4=90db9jfL7Flc}Ku)09u$xfKMrDB?JNx!cXWkIs%!$&k`MQYI-Cys3Pf z#1|0*nb9wtCbS%^Xhci{_l@92C+N>Rf8KH5h(&&aA{O9C{8{=CZdmlhf2A*riRnS! zOs4T@H^Tn?Umn_dA#K#}|8@_K4v*da-~P_QdjGeI@(f+TSU;%EpIiK!L0RlAVe#Ix zF>F)n&XCJ!eZ~!Dc}F+Z33J2db5Ugln^?)K+L9GjC@->@`WA93_%*cJQgaesMl9c= zL3b9mOV)EqvGj;eNKAMGy&gW91a0!ZK;K$IsDW*eDJ3|hjdXe(WGecy5IUJ;f{@?i zhQx@EgiN|GifG7VM^HuaLuL#7HlS(`Geq?^v();PN=$;8E85Yh+Z z=p~8p{Ur%l9CFX1Yb2BJo$WK&$5C{HgIl$O<6S`IijD{yXAWjQq@-V@lVZoML}SF& zpVO9lG9@IXEWET}FN{o%Q{ps~vhh-mi}s?kYRo~PHe|{qk`|p7NTyk-dZ%|dNT2G5D?BE7@0~~dB{|%V~}Yh z-xmwTP;YBSW1b-#-C?*pk9Id5GA;YaM5Vd%q(P^@yO6KQT@U6(U(E(uJgCiE1uP{BUJI; zEV1rK<_c=@y6zOq#;}``U&e%Id?pP2*Isgv8cXL`M7^y3oZhC^k^|Ti+QYA}Xyx2lF zB*0@%03;h{h-O>pc6>w9m}CU(oHB>?we0>i!d#=TV0O`8hcp<%VMRo6C^ntoKzbu2 zC=D`!unLWLFSZr|;7-#5CQE@rWI|#%0SdW9-h`-TJ5m(CCj;^cy}?;9R9pU^&n|vM^6^MK z{;&a?(UV>;6%TiJcDn%^_0rzUgYVh+ytga!?oac@@+}UbMLT}|Lu5h zckTbVlJX2)svecL8m^SwyYfK9}h5IhDVsKje73o#R40GMDMr zDM{gQpt><}!blsX(q*bD{!goj6y=~mW=<>%>-oJneZ=VIVIn-l$d9h(Ax68%90eL) zGXQK5^D2vQXssp&1j+dP#E@th)F=}}R#^Zw{KW8vXOWvkJ4X1_#ArzdKLX`VWktn# z(n`8m;V5Ev7b%_4hz!Up9^eQA=boDw?PyWie#wqfS#u_Gc!`l{=&rBe{4+zAb~G{2 zs9GjQm8C5cBT~^ah%p7r&{!1IDDwQ3n3#A1y3}^jP!j$QWF$*Om20rt;ubwA7H4Z}=drvTtYsBJeT6@-y@hwjU@r#n4$ z4Bw_Q=JROEce^L(@aWH;cd+^Mz4UH|d`(pC6ufCC3r*Vl+U5oou@+ue#!XP4f#YE> zV?Fht`%lhdyRtc}OU>XgJV8Hya370#?{)t=ef?S;EqJ2HLMAGG23ArRi}|yKQZgc= z8<_x0uVfkr(KsaN`t0=LKYk za`54||7Ro}(HJJy0zAN)^8f6Y;{PA*@2&0sD=E*=RWa5N$MoOU18lxne+%{Mn$adM zkuVlqnG$V1WJ44{ph02ht!h;WVvMCG=hCkc>&h5{;Y>Q#7>_|aey4LlxAbD|-k zdfk?mtyCHKe8CEp(Mv~~8}sV~^+GZ+rOtN52L9?WVkbywNox;-`HLz4=|~WG97X>h zdtcuhH*Ut+zYFv`5b**X8#9W>j-6s~w>Ynp-MZK$Mx5-TXBa!O#PP7!h^nZu<9726 z?kn7vyH9f9t0;<+D2+V!?uuKaW4(|Mf27EV&+7$?^WRtar^ft0^qvv_X*xX^_Wx~^ z9dJfR9nfJ1eB3((Xi|%=Jy&M!6|urj`RyR7x3_D*D_h^y3(3Y}+OM zQK(m1Nv11>p`ZCJ=b;h5*7BvWN=4G?N)X#n=%w%mk<2v8cBIe}VOP~xM`bGt*94{_ z>1Qt#s``4PF!2ew$7$FXg{r>ZD1<8?MQZ)noI+k-!$fqYF!R$Jm|egK2H8mzHRXn{ zj2%@-5YO|v==uKX#VFzi@4|+?3xznf=n@-uJtJqX$h^Zs^w?+x+PAE-)z1x}?1}1Y z`#qW$yTYnKH!)77)&mg`_yq3STNQ8kfcCyJtC!LzBsk>xdYO_%rtgv|cRX9^DnpPov<_EE_R!F0VU|IUc$5yO!?7_H3i4WiMZ3mBUdi{q`F8SwCc8!d$ZxULie0Ba z{+AGodjVF?0LGUkQKPq68o7x($~E25kyt(aqPEIH_T9XT#^Y;lwfMr;W#dtLqxh(R zz<7?W;@We?k4@{tq$t3dR^B<-f`CIm|HnA%FX*#Y8s+~}GynhL^wl8$-%8m5OnGKG z^E*3XE8F=E%;QT(`qnPho0z2Y=GpYudhaN9zkpEaNEAmR{O;(n=lzFIZ!f&8&VpU_ zpMQT#7Nw_CTDhOU1N|iJ`FI_B0mO* zkTq157B%;F<}8O#cJo&W6J@a}*IJxlgC?MB(f9uZrUa1;#sPf!@$Jc*cW<|m|9^UH z%l|Mv9QOZhlpS!Mk9udxzsvGkr5xBav;U)}VW=q`wGdA1h>N141H<#E*%)ey2*a39 zv_6NSUTIRD>0g$bD7t2xQ$@Z-rP5XI&2KQ`#SftiCgp&AOnK z;>5qP8M@V1-7vTML`$RaF+poUi>$9Z&a7>rB`Ms(%xXkS8qjyDx?V-L;VLiDQWS0j zuBKJqP!hJP`mxcXtNguEJ%)1GM+ERbNFAIMmGdyy?9&A(12{I(?Gr8B)_HCl+^Nr) zQLZUWaLDk`XBQUe^ix`)@!Q!SK!PXi*G`ELUGS{I-FX#`ttV%L-LqWkrA(E6epLp!J7V zi8brUZ_TY7UsY@&p7!B-D>JK4v`Va5M-F0c=lE*A!~)CpsBpEmEGlm^x@8gF!1?8O zd}+ldPt%j_k#K-+pi48bvQSn4mOdkySWnZ-$q^uuiy~RN4zhI$y>{kF)dc3|NmW$J zM-;Uz&Z=#=Fr77P0vGFuJHbETHMsYAReZbi0a^MK?TYc!Tz_aYA1Fh6j|d#Ix`fl{ zn!s|mtz1ZkSq=lVKtV+t4$4dIdv0TnrD+HnOtFk7bu+AQ!KWoAkR5aQlv%BC4Cc4+ zfy~vRXm3xWac_@7rx_K~hsOZL3!JX_c0pkfHb`U)2!!+iz-F36>lVe#_)}lZM3h@4 zBDxx>pWZ6u!ED*YdxO%ek^H4@NpaJa5EHUD%!04omZnoSXZO`x4NB6wXR0_Z+^Q$8@mIS*`v*s z_XGKw&{c?8=9|*Xen7VamiI<`d*k7;;M@nuz3YFg^#A&LxM>>=_J4wm$3nX4;2-Bm(1M-nxXa>b2( zM`28p4)sgo$Ki*Z-WEqVnP|M=P{Jz&BR>q~n!i{_5u?{9BFx0D(J6Mffl{$^yu)Et zJhC|WTVx$Md1%~^O zP$GD>BG`=pZo|=MReHDiy0GayrBw-cCwC&*q2$r!I93cfoG+YNQPFcD+W<-OeNtj3(UkwA;&uznR;`dUj_&;?>?V*hZ{%`vF(2W0d zbi6;rf7nXd0dLqyw_^VKi_X-7mFq7YQ`0sgB{$|4(q#uJ*5%eNgLachM_RkQE-rwZ z^N)J2LV6}C%(4ftTJywIfC&C;F5jMe;M0;j`hyTH7BFR75)vj0h@S3CwF;p!7wkgj zT9Em-5cpbffPgtXjzNTOp^Dc>)=3gUw%0{0QX(nImzBTk7!V8)cU)L!C_?{{{2E)g zp5yKt!aJ9JHx%C^y&}g!2rOP^_+=i7Q6J(N_%6c1t^AhVx4)|OUz2%myv8)G|F5RU z=J|hmcs#8C+bBDljLc~Vc+|*zPTRqw#^q}?%cBd8WmjmoI@4NyL@SiZbC8mz1DB0r z1w*uMk?ym+zuJdZGvRF{?1kp8mn&H(QszedMl1`dAs<0h-C zTK_fe)y8c!t^bFwOZmU2hlBsuR?3cIBZd>e@BIYu+}3hRA!Tb_*7AIof_8lI8k>|C-Uwskl?&URlDdmgc)sFp30F|FHL)y9`}-szA{!f^;;EDC96t}**dGv9wzfq zy($e7>VeTCV?GryW^~T&pwsBYmH8-^)B;V%Y}JTbVi)Rur8g12_9KgX>0R)VH)N)Z zl3qtkZp|5nU`dy;94mTR5GfO{0~~{OECRNG(K{4|5xi%^GJr{JTRdzqaJQLV}vv&AAhCot(-B%c%05t=7P3lO+CkG$PsDxMRYE| zN}F0lxZs@v&*b#iEGjEcmxW^RDP6<&Cl@l<(6``BSW>Tvpg+T@e*-}f`GjyI3l#s0 zyCGgba7mGx)f*in&L8I(k=z9?CkUO-0p$pe?9ZtPyEv_m&6r;^AI?9J8TbhO@aGg| z@Ix$R`Fss1sKqt$6JW8HDok2IwMn9Myl~6kU|K-ZgA= zivM&xJsRvkw^Hc&?j(b+q#?`cE)tBFz zL{J;nK{RL;4QgZ$GD542P$PQ~7FvacT7L(rp;c;FoDqK{@nJ1OFuf~9$*?2TknpIg z)I^xm5qkgq1-P&g^XR1sp(XunOJqM0LX4QvyEVxGWoJb!u=&gRZs-0t7ng94AClr` z#=jZq=H~pB*^BUkt0GS##N&0~B;U#Cw|07QwpsTbN(+Q8uY`wPzjMe9A>ojx1GOcb z+9AYwoQ^BCy*MHyxT`0?Xfw&p)2dwbqa}D`l}qj$*h%-ocf1)`JxusdZ}kx3m5*XC z!hs)&r|3dE125@QOQsG3QmZ0nsp-oYFUTECwftF({uy}j%A3A0pT!XlZUEU#c|81k}fG&c+LFiW_1RDf?l>)y(*jFd)8w7oIg1$k> zS105f1biAg{EtFpr5=xr4W#MlXoRpxc;`Qj0fkqNbP)My)wQK+5}KkpAwuWcscify z(D7p+=@2Mnn3*I#dTA2uadXJi$R|X^y6Ov^JREKnY0n=WQ*{1^6Py3#&)}&p@L)ce=+J@u) zm@!`+DRd`u2>4pX>vE`F*j>2`03+0^s9}in`a3O^{GXmeWWzQZ?Ej|+uPyOE_6PoN z8)Zk!eLUFzH}Z7KP!)csrKy*(QMa0=Q; zV%=;2jElVrR5`u$`*Ous$@`pSSwgB;5G=6Pd;(}irqI&@w^>2) z-*FTYPAn7upw6?yO0g#x3k$`jAwxaIbGGl(XWz0K3BW0Mg9!hv0Plg~Bt@`iLVq2HGFrp*TeG&2A&b zR#impmscTYSM%7eT4+BfswlRq2Ku7d6!o_xyMp2I*IB{p^!x;g43GU%tm>U}O@Soctt(CxdzUcI z(ub=iTcb+(0o_5eRGCBRG`B8w6icmB-x#ZUd&gMS+&jh^&AnoL2h;2Fdb~Nttlm!e zI#I0f(G9|PzIOVMGJtKxZ3u`+qwLYpOo zX8pN_Dob-6*&aCcW3cq^V6Nh)Z6Zj#CNf!OPb-4*WMhyh=#Y2mY|;eQCrJYRlmHYn zk@W=3rAnVZIM=1;{)%O)4wjIKD(S=LywVw%fAjr1ir%v+KT2T)eIk6ff~B8wBidd1 z#(Nx3EN@M|`S{(*Y5n^X`N(dgz@5_0q^auLsg|`TlA8RIcBs=Y8}fH9Yo=gnSF$9U zfft%(1i>pPG%sJjzNnVcZ%|w5ThobVTc0K&S1eaS+B^X-UgUo(mce|cff8ESR%pC; zBh9PZR79V<_p?CcJ(SClF6>7!R}Ih~`HNhc;L?P|f>q)tXmUgUqB98qOpjX=hxucC zrW$?X&O{u0bf3f?2PMHFX$e1F>Uslu^`LdE4%O$Tw$SDOB=9463eyZNP~d01J6(bVCzxlljQ8mf@(TdDFc>6;dj z_~v48ldRFF+{Y_OA=}}19jG$$MfNI&t#UbQrpidx*uSXNLRvFbDAeawSMu0% z_C}uF_3=Y7Kwq?mNlq1I%TFZ5lGkTrEb`5P1In-we&*n*Z|LK+w=*!$BH{&UHV1wj z^1p83!`yRX#7#Jwm~x$~rmr<{)$);MuG%DoaR_Q?Ob$si77>gy`0v*;|En&da0aG= zOZdy5|B2VkG@2U>8Q;Dy2VzZ>CoPU5e9y3mQIf!{C(;E~WgDIyo`8@|1x_T&WB?R- z)=F^rQki(D7B_H7R1{Y^B+`n&4v^^K70TEVc+73iHUC~|$3oWEd2;beqm!4kWjccu zkI0`YUfuyX<^GNh)zx@LiZ8`pricTLtmj402WBcC*U4N(HJB!&B@rcPmOM4za>2AB-;Vs;cUsLSPBVc+)xaB z{t^tq0!2_R_NoowXVuU?xAV^*y_C*>Z@*+Pjs55>&S1LmgC0(S4d=h(*RM+Xzg`^< z`Tw_4U>yy`jLai=xw$4;jKSbR+PsNF;k#S9T`gBugh2! zwP{+>j}H0cpeZm3-4CFgQAkok=uPdO zPp*+g#L{Q>Mii-?nY8N{w)nmEIbJ`rpo2Ma*8a7y9<1xv5|gZMR+bL3dcQQyU0uH_ z@}R0_$6zF#cu)*}_U#0DMuWf286 zHS1KG`sHORu!E&vk1}4YU#!_t7%Y=9AaoW6?J^lP_KR0~c7BTE1-eY| z_Afzx%A4C(zr2vee3eu2amPzHPo0`RBfUz?$N}9vn@L^Z((iqv8C&l_JmoKb(K= ze&E+m`;QU|w(FVQs{8HnV6JV0Kb(JViJ0VBEV|%6&ejFe8qbslY2vujNSZvB{LEzE zMR$g3MCwTME~SUC#o4S2YM+)+EsK;w!Wybaz>PldvM5$BaM%`2teu1TR1lpv5m+Sc zCRx{Z#DK0asx_p^QT-%F@fJP^&357=Mx)StXrZl0HS45U2iks_h2e~ifIw<8DV`&; ztMt$24*|&gK219!1uR_~)12f!p$Zd%bV+e~0@A1OK;;vI8#K#Q*PR?B~SrIWc*iEc@IT zJF&Mm1t)K9#%C4Yie^j`K8*zLQVYF()j&dn#h2-AFIu4FGWmu?2j!ri9}@rHYo^mWU6Ty2WOFt_e>Dlrvd?`w8vcW} zFM`!r&Jggc8{5NPXk!z|SG@+S!2BTx(Gh!g#!a&{teWhs_$cs}=*s%6y=>?pS*yvN zMVz``uIJaB0b~+M5TRIer^w)!Otv+!gFTia|HoW)UJ7Tuv-6%vTd3L$sS&K<|YJspzzCHMm| zKY(LX)gw~T6O?@KuTb=Gjw2K_&b>}ODOeX2S{q%k0OS{$AKZ??IWzfqv-Tr#LCjor zW!I%A$QqHw(i8W@Pc=PpY|YZXQ%}50iCA6mFZZNNH9dI%qqFn7S7UH?es|o)+@r21 z1QLR9e6nCiou=uv>Fg4%0be#ZI*kyFv$OLtc#mU8a{;HGaLu6?i2A(@tsq`!7cjta zNI08~;>y|8)Dux1JCMjeSh}}A`P=cU{rz&k>Utuz7iZ@#Q@7H*!?f*aiXT;YRCKi+ zDZLj*l)TIQkBZN*(x}3;sA!7nQh4-}u4~$41K6mv3STTh9KdP?;RW-y4O(L;ATME z;0h0*g6}ArWcPbt~=4qr)^|H67SQ_F<)Heaq(jdI!2To^F|xI0sw33vIL&6@Z~Jhc%HuT zY|gN@^WS?MLQ3qG{Qr-q`-dg}|NW!k{I`v=1LSBA$G`FcY&iZ6$G_qDHyr;QdompV zTzazM@vp^q(#PrU5szpt-${=rFqfWuO6lMR4U6%n--+r_#+w6)SdPVJGX_86z>g|F zm%5&?(|~uWjsaI*EEpVnPt5P6-P%R#W(R>{{6qL9!32gf8bgf33MZ;(ceJIXvV%>V zlP%X|=8Poh@x1uVd^`Iu_gcU#%fMwNZcmpB^3^ znDPH!y_y~m=l^Y#9U#J{Zg%`{XBTKIwdvoVLGJfb*+k6H&5Y5tJcnHHrBYzp+JoKN z>e5zflAqgCb#%_2)Jv&ha~)o8Z6sqH@?e z>_yh%%4czMl+pil+yhJE#BzroozF55V?61mecr6J6Tl`#;cJ7;)x|QYfw~f6R^jaR z!xraVJH&Dkoaj)kHm3=(xj7i6saDkeu*NxXqxYEkVu$=&9n&LGrlJmCL%NoQhDWxN zKr;F>ta&x}rPi~|F(J%U9ct+or8&MV{3yEigIghyATllFxoqO=*STemDGEl*EK9~r zs7l5l3z9Kdhsmx7Mkf)$95FHXa>swZ6#8*U>$!%6zt1kPih!T8$M0a8iM&cdLO1FZ zf*8UOhV{znMzzT1d{)zV+Vv(+TG}DD#3XBnn8V6nN1YkQkTyOBWQo^NNI$;4J^v1) z5QckuW3Y}{2!Xx5lkYA*{P_9P+aLeAw+CVvKtej@`nA*4VI5N(+IA5uMAZ;n86sj` zd$%STg%HPJ9fvSg92|WRhQPnZca8dbSHvmkLmsG?1DQ6;AGv zTyeO)L}o&$+~{Aap3)sGzXhL`m_WAV@qyGeq4Xf@M-kZD6W!X|V=>FLb1!{x3{bql z>550Vqw6RXO3*PN5S9YvvxJR!q2@M+c=;y?*e9af_wtZ zR@~_`<@x<**{Vmci9S<${z&<@YKW|-&kQ))agV`s>w4cQgl?gh?eqJhVK=s4dwADs2Kiks zH|MFj*BNH{go+h>!nZJH029cNlk2EFDHxwT9i@NbH6OtY1NbG0P=K=NfmMKb9c-e~ zQ$oU|GvP?atJ?+FK4B8DYzgM_s&`q4XGagi;Y9)iua;<66HW0Fx7768=W>3g;bclN zjyc6zFqx*lRz^ZD8eP&WyvF?cV7vGy#g zx8eWiYz-(&tyQ3EtvBPqExQg@Uu;$SwD;o>sDQ~Ef!T}Ao+vd6(!2(ZZB;$!WW!eg z!Q9&0)zpi6SQIA^_}N?azq?spEeOr#bOoX|x2%(;)`CUVP<6m>J+bRSs5^_7iP|;@ zN{XO=3~fkORn>yfXeL-7st@}&QJg*pyQreW0#^@0n`~)M3W6yQX@^8T2#v;k1)^G} zEw3vzCR%w7+U_8gJ%x{B^adsoeptac8-vpn$N#|BWAG1rZK?qq)&zd=a|GdOb_Xfs z*uZAn2?VFL;YmM-a~y&nTP$EkRZbwdtPR@-f%g2QOOD4X@21WuxR{~@E+d5bPPVk-}@+9rww`Z96tvpXRm{^PrEcHJ|X`cnrLgP$_a!FrYn(% z@rTq8;5keY4rL&ZyjyJyKr5y|eN${oOb_;Va}Zo;>jeag_DO_%QWMUmwK{9VqR#~2 zHxSoQRa+1|lvEM*$Yz?Q_SiIHM};{`SnLT(CuxsJdl2L|*qHJ4(PzTn6(u~^H|z?= z1|WEs^rwIH4?Kf}}syqs_Q~`oR-#ddq zpq~ay+xqe>X2OLek4*#Dcy?Vu@GkkUD~+gUFcUZkZe8yV0#2#~7~9uCSwQ$uNnUML z-9YflN0w(X6F3N<<$9_o6Y{=d7w%c!Y_`aDh!-z*wHk!H*@3oRKp-$!r#u8GODJduVH2KF$HHih zQc-i5cA@PtK=2lXB_=mP=Bl!v2zGk%R-S)|KVqD{ zLuBP=!Lk|&1B3!CN(WP{tcq#q20}Smeb1uS7KdpIEh9}^C6M&$zk52#sXA(C@!3~5wR!bdGPh{Auh#R$v zB%@d51OkdtcG>{MlYvkmt`iWYp!3{oZ?5zo%9)B8#`qZu{3v>0Zc!ELjk!3rXhtNO zzaRJ(%uOb5&RyWR7a#EB2O$?>&Bmb$lBRsyZX$f`M;`iey7bdbex&go3X%WOtb9y6 zgciUDKb(JNzIVcTkNFj9p+RU<7l9u^@D7Dx1n>Qn(LkCS_QUXfsqK00I>uZ9DZ1Q= zP`doF6CU$ZqkSubBEnLzSaS3|?%Jrxy@nBvZwSaRtAB5guLpa3U>?KFL&@DM4<)~> z<0M6QD1tXI{3XF@_6xJQe#us#+Wl~U5nR#aJx=O@up%B zW(6|`?Y5Cz1prM~T_9rurXKsxytwb}>ldYl(|9>1Q;*yQG7sJ)#48`gp7_X%&#oT4 zFeXA*>XG$gfxhHV2%V8xKbs+Oh%-_|hE3QRcyaK;_5uuJq6S=(I~FF0l$wKv;B_ZJq93JNr%w#6S3>TLt0lhAtHO@L3eM0&$14qYyD_zxP5;H>~5f2s9GGe>;s_jG;AhvW`;2e)^VBcAG`v`M@NT8gM+tIvHE}K+ifpxH06IiJTU#g zj}BfR4F2ESC_B>Ask{64uerB(ZL(KcNx@0LOs8zuQ3b!bcGd|ADW`-x1{lAAUqD zq~b!?CHb_Z#spwKE$WeVnroVBhcj6R0VHIxj!KnvqWQ3z=9;Ej(wzBehT@wy&<`UN zLrp>4g=Vwu0?pM;wWB$}l-;Gv<~uXRWW#(e(L8^Tul z%PIt%lFRlavEr#^6^}|UN#3OxUyPnvw8&zDV<^WU`y_b@^=xUUo&mN~^SkyvaRv?q zF_qiT49N7f_SIe!Ch6-)p?^LYk|AHuf^EMjJ|F8C69UJHWIpjU1T`7_vR0(77L78!@ zz9UlXW1GHtEC0*q*uV2pMEB4ZY-Md)Bcs-m)TMaetyitbjZ$&3PH&(#Zq6)oQ}=kq z!sgcO8@t)2SE_G)GuF8R+2hJ=?sBhJ;1)+@4gx>sCMMSq%(=~|^v_0wXSFo7@LOZz z^^FEFPBMv5;8SK(UbsU9;kd{}A4)EokIoFpRYSa_kCft4i*r}C0Mx*%O9d9PM;6xX ztEXctZ=>vh?z%sBo?qke z+cWf?c=s-Bdk3DpqkP_-^Dc + Required for TFTP. + schema: + type: boolean + default: true + - variable: tftpPort + label: TFTP Port + description: The TFTP port for netboot.xyz. + schema: + show_if: [["hostNetwork", "=", false]] + type: int + default: 31009 + min: 9000 + max: 65535 + required: true + - variable: webHttpPort + label: Portal HTTP Port + description: The HTTP port for the netboot.xyz Portal. + schema: + show_if: [["hostNetwork", "=", false]] + type: int + default: 31010 + min: 9000 + max: 65535 + required: true + - variable: webAssetsPort + label: Assets Port + description: The Assets port for the netboot.xyz, configures the NGINX_PORT variable on the container. + schema: + type: int + default: 31011 + min: 9000 + max: 65535 + required: true + + - variable: netbootStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: netboot.xyz Config Storage + description: The path to store netboot.xyz configuration. + 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 + immutable: 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: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "config" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: assets + label: netboot.xyz Assets Storage + description: The path to store netboot.xyz assets. + 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 + immutable: 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: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "assets" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for netboot.xyz. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for netboot.xyz. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/library/ix-dev/community/netbootxyz/templates/NOTES.txt b/library/ix-dev/community/netbootxyz/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/netbootxyz/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/netbootxyz/templates/_netboot.tpl b/library/ix-dev/community/netbootxyz/templates/_netboot.tpl new file mode 100644 index 0000000000..d1ef92f474 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/templates/_netboot.tpl @@ -0,0 +1,63 @@ +{{- define "netboot.workload" -}} +workload: + netboot: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.netbootNetwork.hostNetwork }} + containers: + netboot: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsNonRoot: false + runAsUser: 0 + runAsGroup: 0 + readOnlyRootFilesystem: false + capabilities: + add: + - CHOWN + - DAC_OVERRIDE + - FOWNER + - SETGID + - SETUID + - NET_BIND_SERVICE + - KILL + env: + NGINX_PORT: {{ .Values.netbootNetwork.webAssetsPort }} + TFTPD_OPTS: {{ join " " .Values.netbootConfig.tftpdOpts }} + {{ with .Values.netbootConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: exec + command: + - /bin/sh + - -c + - | + pgrep in.tftpd + readiness: + enabled: true + type: exec + command: + - /bin/sh + - -c + - | + pgrep in.tftpd + startup: + enabled: true + type: exec + command: + - /bin/sh + - -c + - | + pgrep in.tftpd +{{- end -}} diff --git a/library/ix-dev/community/netbootxyz/templates/_persistence.tpl b/library/ix-dev/community/netbootxyz/templates/_persistence.tpl new file mode 100644 index 0000000000..91708c2dc8 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/templates/_persistence.tpl @@ -0,0 +1,47 @@ +{{- define "netboot.persistence" -}} +persistence: + config: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.netbootStorage.config) | nindent 4 }} + targetSelector: + netboot: + netboot: + mountPath: /config + assets: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.netbootStorage.assets) | nindent 4 }} + targetSelector: + netboot: + netboot: + mountPath: /assets + tmp: + enabled: true + type: emptyDir + targetSelector: + netboot: + netboot: + mountPath: /tmp + varlognginx: + enabled: true + type: emptyDir + targetSelector: + netboot: + netboot: + mountPath: /var/log/nginx + vartmpnginx: + enabled: true + type: emptyDir + targetSelector: + netboot: + netboot: + mountPath: /var/tmp/nginx + {{- range $idx, $storage := .Values.netbootStorage.additionalStorages }} + {{ printf "netboot-%v" (int $idx) }}: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" $storage) | nindent 4 }} + targetSelector: + netboot: + netboot: + mountPath: {{ $storage.mountPath }} + {{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/netbootxyz/templates/_portal.tpl b/library/ix-dev/community/netbootxyz/templates/_portal.tpl new file mode 100644 index 0000000000..a6a056a93b --- /dev/null +++ b/library/ix-dev/community/netbootxyz/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "netboot.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.netbootNetwork.webHttpPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/netbootxyz/templates/_service.tpl b/library/ix-dev/community/netbootxyz/templates/_service.tpl new file mode 100644 index 0000000000..ac61fd1e2c --- /dev/null +++ b/library/ix-dev/community/netbootxyz/templates/_service.tpl @@ -0,0 +1,34 @@ +{{- define "netboot.service" -}} +service: + netboot: + enabled: true + primary: true + type: NodePort + targetSelector: netboot + ports: + tftp: + enabled: true + primary: true + port: {{ .Values.netbootNetwork.tftpPort }} + nodePort: {{ .Values.netbootNetwork.tftpPort }} + targetPort: 69 + protocol: udp + targetSelector: netboot + assets: + enabled: true + port: {{ .Values.netbootNetwork.webAssetsPort }} + nodePort: {{ .Values.netbootNetwork.webAssetsPort }} + targetSelector: netboot + netboot-portal: + enabled: true + type: NodePort + targetSelector: netboot + ports: + portal-http: + enabled: true + primary: true + port: {{ .Values.netbootNetwork.webHttpPort }} + nodePort: {{ .Values.netbootNetwork.webHttpPort }} + targetPort: 3000 + targetSelector: netboot +{{- end -}} diff --git a/library/ix-dev/community/netbootxyz/templates/common.yaml b/library/ix-dev/community/netbootxyz/templates/common.yaml new file mode 100644 index 0000000000..18606a4fe8 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "netboot.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "netboot.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "netboot.persistence" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "netboot.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/netbootxyz/upgrade_info.json b/library/ix-dev/community/netbootxyz/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/netbootxyz/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/netbootxyz/upgrade_strategy b/library/ix-dev/community/netbootxyz/upgrade_strategy new file mode 100644 index 0000000000..e7c7ee22f8 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/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'\d+\.\d+\.\d+-nbxyz2') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t.strip('-nbxyz2'): 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/netbootxyz/values.yaml b/library/ix-dev/community/netbootxyz/values.yaml new file mode 100644 index 0000000000..041fa44854 --- /dev/null +++ b/library/ix-dev/community/netbootxyz/values.yaml @@ -0,0 +1,31 @@ +image: + repository: netbootxyz/netbootxyz + pullPolicy: IfNotPresent + tag: 0.7.0-nbxyz2 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +netbootConfig: + tftpdOpts: [] + additionalEnvs: [] + +netbootNetwork: + # TFTP only works with hostNetwork: true + hostNetwork: true + tftpPort: 69 + webHttpPort: 3000 + webAssetsPort: 8080 + +netbootStorage: + config: + type: ixVolume + ixVolumeConfig: + datasetName: config + assets: + type: ixVolume + ixVolumeConfig: + datasetName: assets + additionalStorages: []