From bd9f96f3a995f050eee0a586a1f1cc5d10f8ba8d Mon Sep 17 00:00:00 2001 From: Ed Nielsen Date: Wed, 18 Mar 2026 21:00:38 +0100 Subject: [PATCH] docs: add UI screenshots and logging section --- README.md | 70 +++++++++++++--------------- menu-logs.png | Bin 0 -> 21167 bytes menu-main.png | Bin 0 -> 22975 bytes update-manager-ui.sh | 107 +++++++++++++++++++++++++++++++------------ 4 files changed, 111 insertions(+), 66 deletions(-) create mode 100644 menu-logs.png create mode 100644 menu-main.png diff --git a/README.md b/README.md index 5758fe5..877150d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 🖥️ Update Manager - Version: 0.3.0 +# 🖥️ Update Manager Simple CLI tool to check and manage updates across multiple Ubuntu systems over SSH. @@ -26,10 +26,10 @@ Built for Lanx environments – lightweight, fast and no unnecessary dependencie ## Features * Check updates on multiple hosts -* Run checks remotely over SSH +* Run updates remotely over SSH +* Interactive CLI menu (dialog-based UI) +* Centralized logging * Simple config files -* Built-in logging (file + terminal) -* Dialog-based UI menu * No agents required * Works with existing SSH setup @@ -37,12 +37,20 @@ Built for Lanx environments – lightweight, fast and no unnecessary dependencie ## Update Manager UI +### Main menu +

- Update Manager CLI UI + Main menu +

+ +### Log menu + +

+ Log menu

- Lightweight • Terminal-based • Works over SSH + Lightweight • No dependencies • Works over SSH

--- @@ -54,7 +62,7 @@ git clone https://github.com/YOUR-USER/update-manager.git cd update-manager sudo apt update -sudo apt install -y dialog openssh-client +sudo apt install dialog openssh-client sudo mkdir -p /opt/update-manager sudo cp update-manager.sh update-manager-ui.sh dialogrc /opt/update-manager/ @@ -62,8 +70,8 @@ sudo cp update-manager.sh update-manager-ui.sh dialogrc /opt/update-manager/ sudo chmod +x /opt/update-manager/update-manager.sh sudo chmod +x /opt/update-manager/update-manager-ui.sh -sudo ln -sf /opt/update-manager/update-manager.sh /usr/local/bin/update-manager -sudo ln -sf /opt/update-manager/update-manager-ui.sh /usr/local/bin/update-manager-ui +sudo ln -s /opt/update-manager/update-manager.sh /usr/local/bin/update-manager +sudo ln -s /opt/update-manager/update-manager-ui.sh /usr/local/bin/update-manager-ui ``` --- @@ -134,6 +142,12 @@ server3 192.168.1.30 user ## Usage +### Check updates + +```bash +update-manager check +``` + ### Start UI ```bash @@ -142,42 +156,25 @@ update-manager-ui --- -### Check updates (CLI) - -```bash -update-manager check -``` - ---- - ## Logging -The tool logs both to terminal and file. - -### Primary location +Log file location: ```bash /opt/update-manager/log/update-manager.log ``` -### Fallback location +View log: ```bash -~/update-manager/log/update-manager.log +less /opt/update-manager/log/update-manager.log ``` -### Notes +Follow log: -* Log directory is created automatically -* Log file is created automatically -* Output is written to both terminal and file -* Log levels: - - * INFO - * WARN - * ERROR - -Logs can be viewed directly from the UI. +```bash +tail -f /opt/update-manager/log/update-manager.log +``` --- @@ -189,8 +186,8 @@ Logs can be viewed directly from the UI. ├── update-manager-ui.sh ├── update-manager.conf ├── hosts.conf -└── log/ - └── update-manager.log +├── log/ +│ └── update-manager.log ``` --- @@ -199,6 +196,7 @@ Logs can be viewed directly from the UI. * Uses SSH to connect to each host * Runs `apt` commands remotely +* Logs results locally * No agents or services needed * Designed for simple and efficient operations @@ -209,7 +207,6 @@ Logs can be viewed directly from the UI. * SSH access to all hosts * SSH keys recommended (no password prompts) * Ubuntu/Debian-based systems -* `dialog` (for UI) --- @@ -218,7 +215,6 @@ Logs can be viewed directly from the UI. * 🔔 Notifications (ntfy / push alerts) * 🌐 Web interface * 📧 Email reporting -* 📜 Advanced logging / audit trail * 📊 Basic monitoring (status, last check, pending updates) * 🧩 Plugin system (extensible modules) * 🔐 Security & compliance checks diff --git a/menu-logs.png b/menu-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..1bffefeaa089eb64d547b0657f92ee5fba28e46a GIT binary patch literal 21167 zcmZU)1yo%@fG|NZ2>`l8C?{B=_J`Lug_qx8-If>$|(l2RN401*~G zEVW8-0%~vT0GV1tz_e|u-X2}s2^ zh9D!ve|{Kzi1_iq08xgxIdZ52!A1!95w3dMcR>g-PB!(^5qUd6Y#V~D$fSxG7k3*Dq7-t1^24=6zqdJ2 zh46ba)+H&2|Jw*v3iR7nb-e>FLumfj5f!(&_gUh1Uj(GM=W217ny@|_tj;+0p8>uk zn5I3!2yD4X_w@}C?9g8_LSMKaO~3TP4Q28=fhgPj%x_HdAaU`>pOR1}OebK?i!N0d zV;wsZ0uz(yzibnP$RNjXc?7W&ercpxFRvZ+rO8R)KgugpB?$elj?mu_5D>JMpUvK15zQV=ev}(-8;`K&n+n;LWz!p`c8oTpQ6{vX!Zeo69qOY zd{=BZIl|)LhM>F-mo(|}!uf!NUDALX-x~-YD4{44@!m^BxrDcIIeE4Z<2);O;nThT z!I;683T&im$$vIjh2P*+A6~{(H{2RyvCnK(3)FJk1CDVI5rQeVe;JB5QyJA~Czb2_?U40?Z;?`&P@-5yoNaG`Ha{XE z%PydTxb8{6MF~Kh3P7~o4Dhh<2gF9Kc;{~$hTt06o(93eL$P}cUWpReKp2|9PXuwf zK-BbMwFsl<9?X(KoMPdmW&xdUa71$#2hJX4&<_$ZY>t%vF z5lUT$D29$(7>rNu8HI-#K}8Of!I_IdCPx}Ubqnt*fS@Ca3H1~sP$AKPAr7s`=Rd>* zpmadribBsI*${n;=n)k`mw|!&5w;~2MP`9s0gu^Fv>mh*4KFG|o{W(hB_352Wj6qn z;M_soAvZ&3kN7IdL;;!naWv$Qv>dr+(vyt+cfvVRg1EKN3CVPd$|RH#Zr&;7B=Zrz zKZuB-W)h%+?^^^8A#M_ng@r1pD%Pr#WlHnv^SpK>w@8Yi`=8|t7iLRr@Bk3} zkU8Njl8gCSGlrLXK9NTKCTvXjs$USha1Ggie8rxCRG==wa3|yp${b)atJm?YqS8XL zkE1p>uh(7TI0c?EpJJT~oO0lB;jpF&reUNJYVvCGYtm~9EhtvdYLJ#`xdM1iv-zh! z9z@Fb@9iq>uDB$)Ubs|x`*hJ6AzcKa4V7*u>=0fWK483P+u7Mc+Hu+GACnzx92d>w zm0zeQsMn(7!(+nuhrp4?yF{tTw<&syJ;;fRQ+_Uz-<86WcaJKG-)EVmo8(AJqEq}t z{e*FkIUYSZKs%t^#H(kjhgnVQ$l*wThO;u<B-(>-p>}zk;wte zxyNp3a%}$1+R8-B!qZI2g2lS$hu~0%1%@fRC4%Lsb^8Rzz*T5kR@#7^>7=QniGTl7 zPF#v&MqGdT`0o+!k-N~Gg!M$Bu6F2{ywZ5XM6_6?A4*xRSq?0x zG7R8Z5Lg6iuxr!}x(#C21lNYvlGZHOyxI@Eb-V$<5MT_@=}O_6h+k1Lp>h3HKB|8*c}v0egiS zpmbQwrlh0EtMU-#(t7EIp^9Oh^h&`@p*F5%#Ai5&>R#W zU>tm=M#q%H4948UOrXX{9!nNWPD_Rsm=T!w47(`XU}us{q>vqy&q?{1VU^U9sFdN9 z^hQNVwM(N;_lx;jUQ3o+Gsu(p{-gT_kje8G*nt|XscyBJVUQf5%U__L)>n(TtqZP2klSJSuL6{BX)W*iU8 zTbn1t(h<Hy$kx zCH5Z25N>uJ`cDMhd)&8N)tosz>g=nIzipM+T6sjQgiXm!F&t;DqU%023OewaQ9Ix` zEtsKHDORKD_qJd(M>n)P#nw01Gq?IX(^|KV*R1BwZjASA1dNJJlW%UP6@4|&Hjl)r zPKi{{`Q>E|eL!)*jz^HO&VpvhXAo+jzh390gnhS=UGv`iB2*V?M?4Z z@=YC54>A(E1lj{i9{M2UCNv(F872!R5B`nBj987Zf#jHI1z!qhpV*T*n_Q5pi!+3l zg58Wvje~>HjY&?Zg33;KMX-bBL(DS4uaDy}#(#Ww2X^iT`|{r*o=>hlvn=r5I(!snraDvY zaPU!mYDGTy(xPxaF+VZtKlD6hiP2ct7;$fZDv}g8hB|gWt~x?L{+M=>@l2-7UHi%T zEa)N_4sH*XM5rxb?@K53B&-BQw*vA<6*xoenw3}3h z^jzK$5lkp*Dg-k7azW`%4)WnpCQs~3jBmrh>y(dW4t%jvja=1tH@lmT+^*E zEnk{DT2Ku*JAcoX%>D)#KKVEb1o}Rr>=QonfOt5aYc}P2n!N?C?$&aG1X75Nh-=R~ z*8G3lt}ZWHZg{-s&USaMe?Qm1Z$59mFS|GJ&40?@E4cc(Z&bWdA}yEj?J4#78)>DW z)0y^(GvN$T+oQz6Xin(|o|Qo61*i zx@RnBOxKjv0N!2RK&D)#D4m`+r4Q3B#{0cezkmK-q#T|7Gg%3NSpy#!2+=bSCAy0U zL7APmz217&dlnMLN(%pQ217t0Bcq8;_%WfNe@v}?hvTvp9{(dpeK@Kz>DXnEY;=1F zPF;B2y(@z|j?47b@zvfn8vIW9e3+r+XNjK!f&;fyZPd6_7iV-Sh)KVb3zC48t8^I* z&Xs+&m#Uy|bHbMTI4o&i6)1Mm$5bd?L+X==%pzyRE5-mlfLGGZ4ZM%@jq}HOLamQD zA1~O+vyQ*kXEJ}i*ZZWSrKhRex~i~JaJEd$OLUZ-sANA?S<{DdpmdYJ9KF(h$hW<4 z;h*Iu)4!Cjwy2{E1*iI$g6v^+=b(!KTl8);W{*m(wd|s;`Ho>usJDRm zZepE3@@KCKPl{*8b+wfYyO%%B2(EA}JT;>LbD9mWB8C*#^%+_pFUZan0Dw)$Q`B(m!XFvq-)c=cT-s-N^poJUiHXyhr+JOybvlS8eBdk^IYR_CkLAjB!-t zlNN&g2a(d&T~?Gy3WlUyI@eFQ-9ec{Q!0vExMd(1(~p?5aolm|g0B!i`BT^$$>rHj zgj=vqwfQ=DFWlF6d#2O}vqnmX??d04g4+A4Oj;7lR3ht2FJolt%c>5c>mgjLysN{a z2jE7lh|L5#zWWsi1B$%eK6w73b0!xlPAnKHTB@)p{Z!he9Ijmq+taL2ex_-y zDpD#o=UsSI`6$aMNmyxEQ&h(JJxgJSy!lx7qt&p6T z-kHG_(;enr$Fbs7fUMFD#w8H-f-)G}JTMKSS@ai~n~M%Sp9bw076+;q1qq$+YJc?R z*ALh5vvl^Cv|VX;UNI#wH)u(eITSw1qAHro0Xt5f&a-^^?>7{?)3q{;z9l6Q)K3eI zyYxzM^FQk<>DK7ys%#tw*M}yc8jg$T)|Jk5%e=A;Z>Q}PB##$M#}f(aX=r(z$~|_+ z9Hem$Yb(!bfHWDiIrz?8X$q~B9jBI|J<4zYxHB9?AM_eLEY-OsxkMi{yx?S2(kp6b zW#})|NVcRI_AYJs>^@EA>c@J05vcK4@nZJOxT6#F{_R^g-MM*#aFn^Ba)`7uaw@So zvD2Cs_u%}B)~3ql;_1VSGNsZ8;W7`IUxzit3Af#ag%*T@0)c7=LB4~A9%cklp772m zLiW(~1Hw)eZ3%)E9kxM~cq+L%nD7#g-NiE#Ek5*v3zp!A-7UgwJ~uJ9MD{}6BSX0@L+3cXIgQlcoSKtmu zGY+Wlx|f0GVPQ}|GsjUV3aG{|Nma`E=1hg14`eI9me=#t0e%S+6Cp89}uO0Hkz8SVa36bjcx!+9=D|XPHDQ zNl$dIDmnk;07g!_RjLdMR$7sY#Oku|54z==?K0G|3(Aw94YfiwQ_85T4Qm)>`O6lI z-j@@{qL#m|hmC8DD9o;nQH))cX_nsN>5BCt0c9vWG2|wPhekMOTli(Q|b^-ldi{e8;ic z;{0{Te2zAiJ2@$U?paoz_{Js;8lLMYG8)zyduBw-WfN}K$qD>+q~JL@x189)dVt7+ z&pl^s(Dw3nta0sd64^3(7p`CBb#vk43G`aMKNL&_QoZQ_$zG1G*p8{4{tOTffwC^5 z)H|(YNeM-2161Fvn!?@#TpoXn%_n$Ovi`1lV|v(YWa(@VbQmB-f)9eMgAO2r#16t` zgGB8k3=76igdP(mZu>wIvS>o`S)3^G)aoWB-|UcL9?oB4h5{SiDGGVOazKEJbq)#m zkuOqB%Chjo?9Sn*8+f8;H>SQ1W^m=m<$A6hZ9ZMRZ-UJfx6C0ZrpYu(QIzR3SHFzH zt{1g$5RjRWnZGD~A`?3^SS_%Yy`#Tg9@M^1-N_oC6ZKBp1S z?b59Z@X-Uq1;x|;uJ0UhC%C_`CnS1)S$;ivhg7)qm<7}Jp#*LnwE*E3!9HOtN+I5d zxCl=lPdN)c^MNf>ggQX`ous(C^cU~1SWeKhTEl+BC?6JZ6wdM*1GYAn1!p*ef#gxm zvs|!7?e!rcg=^ueltDSL45J!F(6>JK)?g5}IwApYoTbw6$ex0ywneLTxh0g)qm{{t z6_9;+(_R{o_YQfyT_g=kV1I2_hF7kH>yBVH4(qA#e>MH$)xYn!@|^Xnsu4C%VxQEX z*@(Z+tb?J~^W|XG7-s@@#@_bPpo~GZ*gp znO=nt0R2&VYpW~;gE}gJiZeN+D|qK~aiP^r&7m~D{{%`E?j33x?1H@kaxQLQ(n@p? zRnv?F#$METlOe$J#ud5dONoNjL<^Hu6@$ahsT`3}wyZ(@ny?^hmzH1pOF9&8Ncv~b zej^I@Lb$=>!3%kXi~J5g00e}vZe~Nq9++4>0g?J)#~}3CDt{0kkWO7 zW$OZOuxrCID?HvI2E7~r@568!}dyNR=_j`c6N&?%wz^k(x-*z-|b=uO4 z>4}K~5jX$jR|mF>F44E0`-T0izShCPPJEk+o7(gkS*I;UOR+Z6Ux32M9>;^AY?&KtLx)K)`{2F~N^SKGgs8LQdsF|8E`j z??5qiaamdLue!OLrKOX*jWfXI^ezgF>bI?i4nRjyf#2NOk;T-)+02r~+tKAO2!x2{0w|c64xZ=l2$(_-6z^xc>JwD+Sp@J`4PT ztbco0*;&|F{}(qHRPgUxeid79O9x#ETSqW^z;g(5@URK~GyebA^M5n`7o^VrL4M-q z_;1Mn>iPddYPwsxi90)jrvwQ9-^%<4_`f^<11QM)_sjo_6aTXLpSNH>3nL1${_mOz zBVH#XG(bS`EXqoVX?R1P<-qxA3_iW(Rm&b~iXBO!50K8W6lxdK7via^fEdc?Jb!qe z;jkhy9B;CuSHedjQZR%R7KX%7&>@D9b>HL4G%R1`d8I3In|d`;TQ~aNWlqyBHy&gI zt@j0%1)rxTG8gA?IsHs1ATi1QDN!*&Tos+(SO|#_|CAsa(d|E^Q2%KThz9i&Kr?N~ zK~ahRE!awLDE}EKiVQ=S&EB_D{cjHy7;N)j6c7jlqJ1PkySvh0WP<({Wa`WQY&p}j z&G}cACHv7X(FD%SCSBZr<`7-M%6BR8$7_K67tbgdkphildKv%b!xB)g&Pa^-nK>DbbN<%g*x9iWJy~H942MEtuJ-4 zaXzcN74aWIDhs%w(Wq{QevGUznck1E@!Mg2us97&Ti>^t+1JiqvgiNU@`}^R!!xw# z9N$-iGC6x0X6!PQh*$r#SYtD5OVVXT81QI;p6pT!aoip=RRc^C*t?u`* zl)~HAsD~uWDluTvLmr4re6j47Iit0Xh3)0WimBVJ6cTW#{yYi{{lYQ;2 z!eOmWIYH)n%wm!5!hJ28)pbX;SgA|?P@TVED<`q)Dfl$+3!Qc~ml}&9kGbBF9^op; zOOFGXQ`C~KOdI4{CMFhabMz_S|!9=F|jz2?Jv@CCNf6^O4@#jz- zILxRB(O)V1;sb{VwxRWRtu=Ma>xc8s9CpN=sBtUI^E3nFSP6A%w?a1lV~ew2HFGUF zncfO}F-N6AldC^nM+0lsLr$d5KG-)u_y~E<+cteX|4eH~+z6>@=givBsRGQD?>$2D z)e>I0{Tj^B?1^iLyJZYafU`EZNj%txoCx8kU<^X1dvJ^O)dFxiK9J-t|LRboT89ATARGDibnD5JY1ok!Z#n zR%}2;#rCZKYQo@J^kSjYue3wpLL+ZeEzN$nZ(Pmje(%cBAm6g)-ATbJSFBQeMMTd} zM)w47O^?gA96Qjgi_G$S$1CI~-T?OWX#p%JZO^1gy{4!8Ixhy#I|tjav}HcS7EFT-`j9!7M;FADVu7|`h$pc9K-cS(9SAx)IF`0YDj+HK02`P z?M_l9I>ChCb&nERUuIiZ9HK?q{W`0Sxn2-7$`Lr~ z2$NKI01Bb*tq;+BOP)^CmNfbbrcf;iBAgSJKUh z++d#K$OZN57Ch*BGhof+Zue-^ke^6FQK?|SwDFcvlr<{+BN~I7s1vcbtAI_CLNFvk zMM^@Bhij|vyBe{mj2y*khM3zkFA|JH0qLP7j>&U-(Hdz$S+KApD@MS7GS(Ql*p^-P z2DqW-K7E2C?vO6ctrl3GDQQH>*vtyIYep4OFha%mHL#GbM6KsqF6&4YcaLYoDEIGd zeX8>-fNOs)G?MTS^UwWPMnfQH?KaW*^E-cq-kf&X9VQ^T=~{}9mEr}R@Bk$R8fD;g zEQ-?9-p6UbxE@{S_(s+mmH7puqIgwn!e!|ZAiOk>5Vkc>EZQ8al_a_Kkmuf=Eua6i zM{65vrx9i5`c~(wUyjOjuV$0@S6Zt@ih5hh)x~oi>!}pg;K&Ewm|ZB53ImJKv$TK< zx%n#30I0b5#=>cIffbL&?fVO%ufjFxt30W%XuN7YL&J<&8OyUJu_*e#pV*FM@qX7{ z7TW4F*7)_6cQ0BU>qz+R%CQbn(@_o6Uo_v7!RdK4ncZTt(g<(&$1A>ZXS>x9??7sm zJNi-0Z-Vdm^?d?73c3&e~CT)w;t<{95agpJDgj_KXA|m9oRD1s~_cAYJ$Y zZYKiq%6mFii$P}+$a$sP)DStfEv)iSt`U-PgF6l~Bjj(qF>MJYFlhESm zblc^aPypI=Wue&F>Ylo9_~$|Gn9`uT=07Gt;Y(dBrDGmNnNMzHBpxU6 z+^6bBciHq#Rr>pbUcX)lW2Dt{y*+9K^H=#ig$$U*3z9KyjeAz`US@(R4{@|SYx4{&2f7HVp{CNfE0-5uPK z&VfR3!=IW>-ko|Q8{A{@+I{_&8c}pOMBJ*x%X25rWD(Ppwa)aa8)(bkNifDG24|h= zZ=4C9QaSu0xqj~6waOmTU3dN{zaetEY~C^-^*yLuUePytN`brmNa|GAF&cFzX(yg< z1b6qex_1S40H4j`lNP|8?5-*%`1kw;W0R{K8~Z&jRP3wbz8vf^WqZec_f<7Hl?M%rjjc|1K?fKJF z*e(Y%z&ODW{|DPEl;`bCd*au0tN6g~7f4j5=jF=CLd%{;Eg?pWrDh{6B&9RF_4^b% zJG$nUG1}aN0o_ze@Omh^5)SDZC;{1cRfG5Hth>OyE1*qFon+vB+~L=#6J(P z*4mCSN@MKHw2Yi?cZ#%;$bUv83u}lc73=TT0X!B;&ZpLCm-iPWf&zu7gZxRy6pT)+ zs&`Yp8__tuK7i-%M7oyz{@F;-&YpB=O9gmzqmK>A$QN&dt8x0dlTroarFiPFzLlUB zdDq^+}_;*%A6`a-oJz0gFT5Q|ANRD7h$nEF2o>A5Y)lbMczHX&C;Y3hs#yIq|8{IjVq+xu91-!RUQ z7Cz9&{zI|MmJCz`$^wb5#(s8^>14(^!%S{%6%j7E<-dkE8yw`%FwUiQZa9XPkbkUX zGCinrOaTAN(~z4ns9{pa4P^8m3w=Zd3VRCq%$qyw-+{v5=0h7h-oNH^1ZKXAmCbPD zGFSwF3kW0MWoS6A{qJ4?GcGmAw9+mV=y|ar^uV0(_dA1N6qHP+viYd>Y)Uj+WHFQq zv_G056#9w(W8s@HK>he^+cJ#Br(s_qqRAcc&y;;OV8g!%;g|5g9zr?13a{cqjsx<) z%~`OuErnI$|1Y`fU;@5X2rT3O+blv*;fb5V5{ks8VbzdwSXOmZ;pyE!m{Cm< zf*Zmy7M$(XoPoBWyQIg_x^OBJCP<&`p{wFsHW*YQUi5uLsrPO9^i z!urbX_%YY_oNvwdqWf^YvvqdR_L(IEDe(Q3=T9^6dcRDs*>1^g-H9jQ>8P~uWSBHi z&~BlkcvHGVE0ugetn2af*ByHB*+vArJ5^h#WrsW0S67!iv8+28#sNPh@eIR|SlY-6 z7}mWu{dHQMh&Oyrn3v8xqpbNHme`mRwGBPeTGk6Ck(iAj+2zXm=s4c*R-M~UYC4;2 zRvfs$kO+Ou;rBqyQvbRJCP{LU)c-~`+vm9a$^W~(B*AB*fh^WA`dsi{C^LZ~s;CAN zFtX!ywi0e%+l|XFo16*aP4E41A7?^`b7?c2U0&3vly3V+@aH zunx}@h=UfijcuK;f9pFhTx2lmhJ+*G9s9_{D-h6if4dR`!@;P^bB5Dpcx_zOo9>K0@ zq6JjJJ112;CR2?We3aM27-Mbfp?bOA)vsFr3S~y)@U3?A;cqNfn z0CT|Oqn^fpCsv<+v9~w^Mwjcopv{BZs(0J&Gw5sU><)y zTWOBHisVl`@qfM>oRuc69@LNDD^<$jr=z2r@krE`RqOE{GOFcCr5B%;B_8NZGj$|@ zOiT*$J#UxJcs$4pG<$gf@$P>$zj3LbK-1O`LJ1e$rAm|nFNp2D?w+A024`j@)3ims z&P=ntHj`lo_Rj2>pLMI#Isjt_7~|q`G`AN;A&G2BqH>N=kDip))#-I1b@IEqIe*L- z!xBRggP)I-exX_)4;l_tBJ=}FlMr8ep3m*E&D zu%z4$Ga88?zL3w2jL)kM8TgpVg5^uH;6n`&{D_OAsVO;)!q@z2*a&CJOjP7p5|4RR zy(KWlaPVGNLZfcATR;@>Je~RMbKZV%9Ijwi$+Z1N!)QydZ&wg-sIsLoXKYzq`@Js% z|M7}Uw#)dDf?{+Rlh{JC&oCZcj$9-VD}aLkk)e=gc zHRZ?8WRCD2%w&F&5h17)%P+m}&m#T@-(^z(h8Fed$VEI3ODc`21uL|9eroPX;Ytc% zfrcXwb|dOv7@GhXCG6%y*bAl`UBEBGzQ^lYQGa#Y4kA2iw_-^R4?Gji+A9U2ICeF7R&Mit8H7phM-{ZnLm`9d=JhDCG< zTa8+=+*p2k!G_6fYRqUq4FPWYw!Z8RFae)^=hBZZTwQ#d6;p-->~1FqH}Yaeg$Gqp zknlKV8yPY&I$M@~11s5lGq7r5Ob-lCC%JHO_%26i%Bcp-bZ6G*(hOj5x^>>Kvyzu3 zh`RBqadnAP>(j)$sx3@_Tb9faJnOIKgR$}r#g+FcC%o?HV`=B1AKlHM zqhFNuzUnDqRcK&0Vz{|At88~*UThLEeMYEiSmJ!bUM}u;M48|UzA6$SAWCBRLG*a_HfSZe$(`LF}<(XLmhB3 z>AgDP#61{kedSde?|y-gV=U&3nf%H7RsVUNjcICQj?YRx zuvs~_q)X)82W~)}n2(o~u^p&qitdMYWMOQvbtSVf(q5V!7E#B5j ztmwDa%WEfG+(KoSanaOp7Dd`(M-j@i=M$TC4B<&S5VYR((7m$tv`4CeRzL(Vyeo27 z&h=R&a9e7aB%p_QJ_8%%Mjag$>mrbi3*h^OTG>(Ti1+UQw)Ub3MTO29oPSXZ`exDt zpuL=yHx`R4;@K`@FIq6rd3VNn)Luy^AIz;6PLXqQwNF?yI6QzjRz!Qt7*l8DOaH6 z&!+1St;X!iBE~StyyijB;{kX5Iig8P4o-##zr>3vOvZ7&XId&zPUbJIMBBs{>Z{z7 z#!~oJ^=_+tavT5gv#ek4=NwP`m&zh~SUWk9ka|7w>L=FW9Q4i>uG>YX@5q#a)rzUZ zlM-NigBNmFWI1{<2^X0{rF@75AncsnBK)VE@wRexZ=mg@gj%Ce8$pxK6*D+>p(3LU zICWj?Wj0t#;&)?LZzn9oC@m6C5iY_jtUs6!bAFyzdT>f%7;B;4rIdM)qS;O1b0z!@ zTN&8d`Zy0og!f_NRAr+H`b1koJAIy34d^!MqjOE-Q%Z$5DiD|s7wVK^x{^$?7s=Y; zvh70agVG>=%)QtCptUDQ@K;L>g8iD}udoTp5~BO7M0SdaRWD4n7GaYz9!Q!-aUHlf z1gCvfUK(L|T!Q?ETC_xV8C|U;)x1BF$@M|!gV2@~!7&tlhjciSxqIItf+pP4OKlMG zDIKJsNGiJgJN?Q$nqbisN2CgTpe$?k=x(MCW3UvEc+cZTC31jcFkcfO!hiYskKt;vLB1DJVoxHTf526Sion?75coMW z$M&y_K>!xIlS`HCt)r1+T%JSOl~u@G3x0V_g$PugD{Up}wfR`VNFRFSQd6e7UqzG< ztZiN7Jb{*6(w>eVpLOF`*rQ2r8+1VY2omx^;?1+k97q1cIWJsqu0Omr%A29V!Ev+n zl`a3_m2`w=t+3;4M&dH{%?c7|kZH(Dg6Av|8bjr)er=nwkn_Vr!FNagTsu`IOejK{ z#?!b?Ss}aY#X?HbKvRu0wi)klFqmY0wFL-$^7mD^m2k9ZFQfraF7QUZAZT#n0XgSc zQK3w?!FLMyljuQKQmXyEU(oNpT>otIm}zB{hJ4r6BHdbWSR}VAtvWg#ZwW-3Uea=G zBHlezATkzQ#t`lFomAf6n-$?}4up_W7KInVP{LNZS)7nfY`*M zQ~4_ug7znh{9sjLwV<_G|)ptr<| zKMmQoS3(+N)?qF{Sc&vXQ0erRJs<~Y`nh_u$g@lrlm&-5;WJZ>IwIn~JWJ!P-#wZc?zyL@Vj%UR0ZeeY0k=yR~D_%*qzGK+?)7L@GgG-mKWbYNIE zFhZ8z-Un_Pwywq2^WfUB=M>$+rte0}xj@q!XyCMy)Ua@8J?*Fu$H-|ic|TbNlHRJB zZv71+$AC9ntggjr(zJbeCz*b_f`s-Hg9>7ZunllO-Xzt+6{JZu9=5$XhXrh!Z&$TlB3uXwhC>Rc!~2 z#qgRA>FwGLS4nWNB!me%PER)}a3pfwuIN^VUTq$OQ-UvgzGtobO@^ivt&XxZM$e%5 zZ**+qqF7t~N2Psb6yv6nyZIv&>oGU)6=hasPn3+ouc~aBu-ID33VD#BAlP+=mkx>z z?N1sFy6)uW9<0qn8F;*ZkrpB`8+;?ay<8w{?JtUO*j40!d47c9sqq;or^wN%^R3jD z7ELn!S=HyB8p)+`r;0LA#l+|qLr|D45wn9CWie--53T>(8+88btz8b`%j>lRj}uVq zEb!#&C|nEDDp>f*sY8ESH~zIM8FlIP6#kvf`Fk0|_VG^I3^xPpSfV2g^a0c!IG)Lo z15s3D@njri*E_H^QQmEbcb3Dv^qG&D za>G`%{r-}Yp!tb9?`0P)_c_&FszhavfMAbG0~mZ4oq;F!Y0u}Adt7}~$^3u=eNxmX2cJY%eU;Msg+${vH+Qb51o)a05J1y979N)ur@L zfJhXIKq06<^GA*|;1?%5zuYHIb!@`a!!CiGLQ2r2Q%rrX5^Bv@R@Ssb^$`nxGx_*7q#?7IyRl;T|6-w@bJG>Y?kyPZ8l%d+{D?&5*s z)l+qa89js<-#kw}*X-i42gGEHfxv?!kmOc8m9wc&c?t+3-6XBBBg)CZDz`ntCZ;x+ z$FMbS#Hzw~DH3-kZBsp4e!44za?m&Slt^}QuweWgo$+}4?9`kDc{z+m0ysH&e;D-) z!|Vi{55q3?5-xR2#ilH9VZ`=H!EB#O@sqMZ#r#Q%+a0v8DKz^&7SN=q0Z6xwz`IBw z9Cd25-!80A#c?g3b!Fg~_^%YrRIhbyDpn0?|3dJAEExgJp({>w^62w<1c!CxwbM&sI60S)GDK$!JOBtx+`t8mA9WFYX(|isxSXMPIwJ> zG}(;(_AY%JuNhQ7uQeJj^nzWf<#y;jHls`rf z`N?--zFmsPxHuHE68F0dWy2lINtIthI!P)bmY-tL(-Bk=&f|I0Jr~@Y>Jso890=#R z{E19W0&|p*eiSO7k#wY=9B0yE-@6!-VR@bp=y~(|puvN;R{P@CH-Lf{R3d|+Vv*vv zJf_S&Vca?qdr|Uug5j(i><4BhOig4=8wCYR|Cx*4%$`E$${?amrCIU^wYC6wg9Anc z4H!t&1ud9cZ2HC@pjg$$HyWZ}$7u7;kF*t}%>-xD-%9LTLDMNa6~!-&24%_=5>L2eB+X=q6F(i3l zCM1(_NM|WYjNwY)mVov9IgO`jG%{NGsVEJ`J1kZPv(4zK+0!3s3V$oFv-2J$@P)N@ zIC8uDs!23P)c7$-eY*O5{b*3$OR7~xnj(KhrS?1Au=UTP?B>qrgQM4gpOT`>)!Z9- z!c*bFJOZhUCw)&i$Aq6#>D7RLw@+aujNs}VhBj1^>Hiq#X1^_O#Zwpd9jR1m{+j0o zu5&s;q8$>_^o++*-r+!u5`Rl27K~}OK6xX@V|xb=oIrKlF&GJ&2Oq&V9k|+TCd40_NtUrV07#Gl_Yt#P0S>iqZ@9S2{1e4eFZDtW$b7O-`OFh0%don z%oo%{z)5xLj^H%1;6GRLFY*Gxs7CliwwhjLjJEVLO{C-1DUSg;gv;{5J6HFO;Bjz~3cHtM{>CnJj?H6lYdJ0){ zoPwfhOV94ksq|)H1+^^HFdtsye)r}F5ysrkY6wdqB{i0~0*t@84|odjH79tf5@M~I zb|lzH26E>>l$$OerjL1T5b;$|yzcWo)(9oSp~U!pt?JSp4}PCPB(-35bkjQo8BM`q zXVbGGe)k#YM-hPkoj-CT`8+V8gYH}L_N5S*cr|beCMATA3#ooZ@Ur9VF!0_`kI7p2 zJ-?=GA^kzHQ2*?kr-~%Ra_7%Tbq#ptWmy@uwkWE!3aGzPt=Q-{oi8bQuG?w8a!vwX zL$Ije>jVX6<{cV0$ye)ieZ~TBG=KA+4PYa9+{$7_z=HEW+wQp@IEe7|vH!J9&$@D@ zdno?Jp!r@m*Or>)cIo(`6s zx*nsDhCekjOgDOOGz}>Jo8J0>wG~Jj3R&6&q)y-L^2d5wd%*9=en-7R(;B2ze&wlW zASDqaz7>m)ncr4tr|IVZl(Ff1Q$C~Ww07mdjc6!LtihhC)8zl5RRpyaiIqj~WtF1{M5mZoH)q^x(Td1B5)if8E#e1D*u6 zTZM^LY}3y2=YqO3;`gueNaYSt#y+8dXfeLyF~1Q%>myS=&?jhHkO7(#A1CW&dhOo~ zTA~IxHvfG`X|lhI#P@R+$-qj5OhRImweJ6G=gR+~-u`fjOGz?iDT%Df5^@<_OP87K z5tjxN5m`paz7F}0B}=xFi=ncNCQD>(Y!NP@iyD)NbgeP=HGI!!K6U?q`*T0OUvoZZ z=6sgtJkR@iK4YcmP}#c;`Fl;eOj+ZKDYEX6Wd`(hBGA`9*v?;|yu-eOe0t%pTtu-S zpzFIIAtwOn*>qhR$9GdQ1&r0LdjZ-$;JfTp!PDIDE6ESYB2)s}UzqIU0-KOcKA=BY zFndKQ27dB&!B~;$J|$SLPeTSFH6M2rE|bAnbYH$Z>br4y3Hxv%-KJ2_OG=7`#We zs(q(GxiR|)6>Kb=KS~_H>+%zeNB%upYfSq0<^w;C#)I3ESjVPmLmGf$rMKB>C2!Cup8RJ1E;}7lL0@BEyEmVAimZXlZfqxC1a>gnW}< z1eCCrgzU-VQ^RRsB1P+a;zjD3J1fWL>t5cNvZ-w4ut65TS zjJ+ak?R@zwHPyW0&A9??e}3WylJ%ZpXY&*KWUgDz-EBmFT`GsW>X7GVJ%(h_m4Xpy ze(wYk7__f)S>Uo02!5zOvWQEdUJK^fUZ-EmRB|u#8b|M3i?6eh#SK+)fXu;QeXue* z;Uodd7&L|N_e!sI?Bb!U^cmDqY7!obI)I*hmTv|=m!$7I+P8;%{)Ls3SfeDUiJxy1 zt5!?K8V~7N3p?AA+>W)?$nAPjx$=tjyY@g545M<%=JP>>t^tUY7tMA)hn`=>{ zQzEDP3tJxV&JKsJ4?pKu$#Q7E!?Lg$!l#7eQ}vk&=hXam6ogLR-jNiR)Qj>&DT2S% z5b;HxiuP{b6;{&N7(EcOM!Q+_wY0=3y<_UM(3&J ztDdePsQGp9OUnQ+_UdM)<&b*_g*!A2Sv_sv0+H;XKEkThH|j}&!V-?>Pq51TVS6Ky z)8mJphennfmS?|{D@prx&XG54v(t7@;lkoCkm0<7G<)IDNwy*o2oDuq5VG|vR}8aN zxh1lF5U26q7XSB#{;}3<(&O*PgfMqnd43qS3WrI?a@C>Yc*Z6&J50B{pSphcv)dIX(w9F}Rc`BQG-TPt z0J-VaRe>RW61}6w-^tdStaS*ms{)goe5UuC%AOA2YG*%B36~%SFbSyn8IsPHQt6@0 zl!hj9jE@k@#BYVTQokU?R*U%r8|MsfnyI%I>+ z4H^Aj31`mxxVJ*x)_NjWuV@X~4u7kwYG8b`{r~*IE>v zgA&pW52w~eB{auhNv$8B!rdqDml={ePj$JNeqk=@%wScgRDyUcsW;=Zg?oqguVNdP z8YCM>afGfJKpVxm8fP-L`W7}Tbd84e9NjlhSvFR;tnrD*!mX5!M`#K z;w-Cfb`LE^IH4qIH|u}T{(ffr2bELtjWlxtI`h*^Ht?Gay8tFASD^FN{)H- z&NZTauKMiAa#to$ZM|x&C%q!s|82B?J39S* z2Q#OhkR#i1{2{Xf{b#y?2$FeG3eTJBPhtEZQKC>_m~ls{q(=CW@P}%T(&a9FTE>N& zGuO>BS`Htkb-uPJwz}RL!$rbWh!aECFmqyU)+Dx-U#T{c^oDI?_NABfhPX%C(QR(B zb4xORjyFGXWwV$#UK%XTu06llOD{29exOiITffbEV{k1EPxG2LDGd6J?E{&N?Y-+! zSo=IAg4dT{XWg`Sm>t-iuc5$d5mOc;uR1~(n3!L-?JBv^+*_fpzb`_(xT{LaUfTPq zy<3|#Az-PFNq0Cy7sMhqB-HyV*Pi(gFyA09>~7Pk-r2__jN?^pN&K?|MUi1UThp&q z-KZrfW8*{~1+KsDFzuBQzmP48Pu^XDW1ds>AkON~SM%O2NdTCvawr+YLwO(r z>-_hFbcsanMtEagNd3 zAEn$jnowhSt4rcXziE;|Mn|k5=n4uy<@Lb7^k$O!31YW7r`-KIjE*U#(L^#}S7Bh) zbF!76L+sDnjW$o5qeR-5GqiHQ9=vOq+obd(+>*wOSVBf(XU=wwyNe4YeH|Or?buM} zi#-CR-T5wtpDyGwcS(i$zzayg%~>hM!zCLe;7EPquwruoqReQh62}LZT#$e>$v1*I zNk1Yc@DKNebLc=M9M1(iv_h{u{%HkxcU4QcjnFxsXsqE7;}@;|0B8-Ft%%%pK*6%w)8RM3bP> z{@cUv5!x0YP%k`dq1iB21P(Pp9vg4}2(y(FXh3bQ3-nCDr&Sax`7|eB$=o3afa&n8 zr&2oOya~yJvUNjV8D3u$Kwqb;(G|7uOtD-WdpE6?MY`B8Vxd(C6!2wU?`Yg49fH37PgoPC(g@p+f z9PCUjtWAJ`)Ps}V!IYJCmOfh(Cm3NjHpn(6XExwKzQAtafs-Lq6Xigb{ z5=TH%>k}e_7Y0BFbxv;3yOGDuLb_IZ_8=#Bu5kS{{LeRqH{8!-3pAgTt)}reUv{M(=7F-PJEf z*p&k+fi!k-0sf=3J!Chvv{ALP%zQ2mBOG^K|SUu?a@sAKA!l< z23`J8j9D;`wRIs(U!qb2-`JlGqIw{P(l~9eNm{&&?hLYl(J{wg;^8I?CcupHuM}t^ zZQ5devU?bR^{g`l~>ZzDQ9@cm%@=4B`oQcxk^Y10s?q2tfWIJ)%#CC;n zCD(4cLBGi~?~{a&`om8#4)v>3@{f!{4~bw(4+kx0*xj0wL!4;6AB4x$uhr;54!I=R z8+Fn>kGOrBleF7>tk?Y5+7-=$g=KDB9ZEI&f+y4T7I=0?X19tE3$`K;MZxuvA{_p` z_K6Q&Ai{rpaXDTo$zJ@`hHE^&*26{1Tk&Z`A;ZQe35aaoEs!3_Xz+*I>v>hN$hfbpkU*$} zjk3=h{qFT-xIU|a##cyUsED`4*_);`U<3Vk*}f%O@>IXOSFpQRNI*M6zhg2&$W&|JSSbYed?)LUa z_BWx4@P>86(N0x$EtN>NIZ$96=g5J`r`!oXmj2L1kkV6mcsoin< zZs_|+DutN*A+d6G-~C>1Qa(-Kd-`edtkwO|-Ej%gJ^6VcVoFj?*dFg1$2a0)4D(xf zQ>cm9GoFL}DtqPL#nI(`(X`n@9+H;gsQd0c<}8H5$as2GZoJB-aqt^5$Afte0a6+& z9x5W{xOjj(D0H?(OZ6Q*zq^LJ2@v~KYUTN9`Nlyja4qjgs8||^Ac`(a%ZIOdZzyod zC5Ru}BSCr?56~G8P|Mu_2R*k>WXP&p&bCefx~|2U9|R-_lN;}iAeK3hjy~jsADcZ; zRS!xNKVsJ5EFth2hy@|co0Seq3^jj>9&=|1{61fj|+iy7>Qc#2_0Vyp^I4nQRa==}L zWe0wT$Pke!nI*XuzJh6p>2&i-c7H&Kv<&^m^cgXbN$8JlqI7=ahWB(FoTb zG<2Y$$aQYPZ!GHo2a)HzJOxh$2!&wxBA?dt@*&=fcCm?R% z%wT%arJRfzohwa`P~AR#Mp{h8DCiD!9j4wNs1v|4WJO4hI4pi?1GI*<>Mj+esxVg3 zWJX4{8q3UQ?q_soC}%up%xG+A49UF7NXa-VoGRQZR4RN6vSk#?1SP89oj47Ca!+9& zhD!JC@5=42+Q)vsv@dt_=%Cbvx%5LAD&CIW!MW0TLV8oPw6p}aWV6&dAv{q&$)Cq4 zy;O=-sz$_wLKtD-2$s8X~Da%Us zg7k#tg=? z&!nS&Vw7%Xs;_G7Vkl=!Z`RezI}~7yWWZzsWio2kI>9_}6PTQlJRoH-X<(!8-S?6i zohX|c-Ip@HIKn>i5SSUe5yuzQ8P^&7&IS=79MGRa;=ju&jxmf&fl>@!%wR@;Xfl?gSUUWmvMNw!?7K^TfK9+tA~b&W{)a?VUFrX7lxsXc85WWeunrHV+XAcb(PFX z?x>JaPF;ml;VI0%`N|bZ5y>q6otTbTDbG5uC~q|HP(*yde86cSZ=h^2E8J*6Wl(s4 zX7H5^5m^e^A9)`+mJBIjEa7WHa>5s$8J>BUpv#g?CR))rV#z`2%tY)|)A*)1xm4Tu z4^k4+U2-MLUv#(9s*>!=4-IEDT;N4r`<-~RHKb>)>NdJGqB)z~ ztKW~GWV02p3bCHB6|su4QKc8NQ8a=!jA*K88m)S*Zmv=^4m&+Lk8m$=qqGII`LwaM z5lHM5=+C*&QSfPWns<_SUcQ{XwBOs|5W+>lIl#TZV!`6U#bU)^Lt%npX0oJns4~kj zb=d^4GjUL{VzKYD-?LS+WO67mt=TME$T2o^2$=F45E&rZ%$kPRu-5Zha~YCZquDMP z!d1vtB4~9tAvK2Awc1A3HrCQLd)rZ%HIG-VWzBAmcWwHNew`-T+D^{@Vf51|6s0mT zR4Mb9tJ#-B;zK43tkey91RXBzKy9s!8e2JAHrvRHkPEVlOWq{jI^GbMhzptZmEF;8 ztP}VC$i>Jr=RutF^D~{xPO&C(wL}bW8Ed*W`Jfxe&8G8eZ#54Kfzta6hk|}bD{f5#7o-256L_Bg2Cp6Bks&ck5zu+?ztFarfAnYLtsJgoeg zY=Xp?|s=s%*Dj~#Hjbs>y!yneO`UYqt%%}eDoOn*u}Ww2-Wy=@@eWTp*(vvtKGTZ zr9TA3K0H2Oi_gfXf?k)y$2Ew|SGQh;T)FKP;+MR=ywU!Y(2U6E2*=3oWVhtIBqSL3si!P!OT+`53eMkD`W@bUXG9GVtt2kI`h7ZrZ4D$kB>(8ur&6ahK#OfOv% z?FDVRZ#o{(j?^FXufODq+owyiO3SxPM$4ZyaCCWG7B8&LGNp8M_|&{VxCUBV9Dg11 zO+D%{w#=*&E+{OF%>8gh(vE89bR2!1n=!c^$5T_TX4OXP(wrSwPFjOyqhOnE25pLJ zY-@toW@%rXEt*|)(s}W);qmo+hC9G{=D6lyv8&pW>S}c3xp`R6^y5jy)5WX4Xj}JQ zv{+kNGTC(g%$n_N-zd1ydThLCek^&^_RM+7+0VV{KhQ1QEE1QBO@B#xO(!VlwLMom zwZoagZFv?s9L+2Sm%rp=@qVzMv9#A8`F`|VGkmq|*nOzPAf!jz5#`(ZLhTI7m++c? z;e1TFWPXox%@J)hX2dZBH{?liMxiVFA~)3)?cV-Cf6F)dI)~6fa8k5ayjmPx^lG+l zwmB&_RW)VeUGS-XEqV59VY)5b^HAqti%x{0!k6nR`Q7TAW6%ySl07nC+CaK|%Q1B& zb-Jpg%IVYo;vWBule3yCuj+w2l)KAW314kJ;@V!g^v>`a zEFNl}U`S2aBS8F(Sb|Z2NsH7+ForLN69fB+&V;l=;LP{pG?Ba9`Ca2$HoSyX>gHTW zzj*}zzO$(G!s7dJD6Ci`T_W92;Y^qtM2I7V2)wzeW@>wSCmIKyvu|h0 zI|`Pb11BZ!Y1d4h4(HH~Qo+05C`jeTRMXVVeq!?&X*zbfG{to3KK)#GkA?wv_m^uf8Tp01zKQRH=V8Q86HPA($28< z_IGRqQ?3negT2h&z^O7nWP#cI3%{oIA`w;Pwi)DYvtG$y#^Of5p!XA;qN$<#Qf#~L z7|&_njM1NL@OlnB+!Pvq+bUoyJTwzA^SE%Fa9ANo%8XY^^CYT17QF2(52fGNqb#A} zRdTwqcmFOa>0>b!f0r+5f;0>=7D)Y##x4_4z`aTHPI>mY*i6+j+>Gl4^pxzkdyd1` z_THS?o4nJ)nQ;v@Ii1cG)*0Sa=7pC=IQPs(otuy$*$pk~=I2Yo3mGS;Et`{ybLwuj zna)ce2l>0exz1inkDt?w3b3j| zS%C`_H}5jQO%hYbXHkAo zuXApB$K}tGG@>}=I#u~4ECm@dJ4B5q8mFBz2=jUzCF~7MeOMc8nO|$d^y7M2E!pXaG6fVVPQ_u9|^ruy_wz(HV7u9@HuA1lC zH?$AP4{ay1H$IYbcSu+6@Rub1s7AiYK#hXG2p#OzA-R+(qUfzj-(*D83%>1X&Tky8 zV`iuyEUSH|*m*}5LEfammuHs2mV}ozkaBN3eYwc+6Cb99Ntde$xRq96pz8>)l^n>K9hRxj5thY z8CH{@Q@&QA`N_<6{+&F}RNiK4<%@Ia{hlNBVfbOU_S15WL%eAMmd$NT1KkY zLX~J!vQGE%rpNBfWR_N>YZOnF^QtSIOX>q9uiK($&2;b10q8bVAUxIGFl`0j6e!=Sp6ZmLb*noO3XkZP!?BNQt+fvs?sV!Cb=L#DWszssFGMhR;g1(BgtK|l>fOB zHx{c|>M*eT;bQrbMOq9z*LZkJ+m*{DvH**_Tw>C0$o^gzU`wEW1u7V-JF; z>AXvxZlp08Ae$U_1<9*Wg~^(oEBSa+#e1fp<&u_ED6#O$(Qj02?avQM#dQT}roUN! zJ1nsTeVi!YTAzkCjXnfxRk+?=dbqf|u00;{Cb^S-sJj!s9p5mXklF4H;0#@7T!tyN zn@SSk2vqwhewa1{efrox_m0iSx|TC6R(;Su?bp+{xB6NS5WqnC0oQ!-Ap}PCLuUkr z@4*T3M~(Y3CWzMpjvuh3k1r&Q8+T@UmzZOCL_81SEiyxlif9`KJ76-vL&`7*%6t-0JJ9CRi2j>TGBk?_50GvSrd3+d2%FN9#-Jshg zwL2(ST3EU$xhR4(7na?$*gAUgS=4oJs@2%1BfDrURa2RXxS(UCJSM^l9oEdR#j00bbccRe7z*<#PcyFv+$H zrj3^OU$95huQj<=E4jBMp*?(F+`-vGCdHPbt25Ra&zW$V1=Xe0xil{8Eow9CF&wTO zDx9#Lk?i4ItR8wUoE~@&7WVlBFRn^&Cm&$)mY*{~TfmDTHsEui?xCz=e}~D$c;Mw@ zXko}_Af`PrrU{VwsD0uWb{7BQ{1wS^{rau$pl*~4#eEdQ4%hTx)~>~YadQII1O(zh#{>zMf#f+K+P9PSz^VdX^-*;nK_x)vf?b5D z6u6weV2l6$U6P1I7Uo0Bk`U10zavzbXF5}LB#!Al0atzf^E4m2%pP%&M}1#cKvj zHlB(kvyaPKTSe=W8}8k;EZR*WyoZSn8Pz)0+z}|`J?tzA7zA9$)_|gWI&vO~Tyi_N zQ;_8I*7J)Em3G{b#S$+H*Ee-qmzeIwJyeR6&@Vrpf8w}9z`q>gVANso(LOL}a3?5= z`Bt4}M40SE7dcWcJW4#AI|$AyE8p60>9Kxu91`>lm8g4eFPvySzSzB=U2xsJLQ;Yaa< z*esQuviFntg%7qewvEPtMro^G0?)o}AG9yezYnMN9J=3p@Sg9lma3gwoyT5g?>7Mk z!JB85SKtV!(&3q%blLjnPZS^$9pO2B{<8*l;veMtxbf&g5R0jEd~$p6#=_vd{1cbVi* z!>>xhl9GU{l97XniLIl#os;n<20oyxMGIwhCv{mFZX-JzdIMuSLlb&88~Z;bK)i0; zfTE3wlL4WdjkT>Kw;LbvKP|Wc|f-7J3eA_CntMu1_oDGS9(_#dOHU*1|}{pE(S(s24-eDKnprYcUva| zH#%EKlE0n&Pd_3ijz$g^_D&XdwuFEBH88YucH$!@{xi_Oe}Cs`;%4!mk!&6R^;&=z zWcX9Vz(mi;@bA6>q`ZHgaw}N4nOJLxSl9sA0~mv!nTv_{pZ5P(&3{JxFG}_QP_nZ9 zZT>=fRZ?mn35P89n}I_Dsj`wPmn!>?(=!dfjy&!u03ON^nzzP@oa_Vog<^; zb#fwYdLFx;SDz3V`Oo2xO0F-r-Bo`|DhTrD$U(}%yb1hUj=KS+459i&A_V%UDR2al zz?Z+xsO0?&f7}oNgZ%9UK*I9>g`_9_1{Bf{R044H)PU+{WurCNG`sSlvsM)#HNZ+s zMIB4#{6r~H_vX-dNWImqc_u~F13~S7x-qs;M3xwz2p&DV*`KQFf|#88Ku=4Cf4R6O zb^$s6*X3@=ZC9}pMBPb$``8U9Fuo3GSxnw;s1mQh#MKK_;1ncn-nt z^7+k>3yv6Z)k54e<ZAj$It__2b>^zMY$va)wNPB#VLf2H*7H(2P{tzS?$;k^*^;wMTu(tT*U#Xok{5z3!F zfSs`F1i!CgZ@0UOQAQR^F1L{5VdQL({Yn~aMS^f$>~~ER(_d;^)a>%8Ov$y0O)J^* zz=A(B53}3qLV0b@DjN)bSvZ=={%(3{QL=Jnhr2!tv?bpL*Ur(P@csm+1Ku3~H_n|e z8A|ZmMeAzq@cn8jKsPty*G@n(Rs6jcL+>%hq+n+XO^xe#sruWop!IY9m-OsgxT&Li zDCWA@9NSv~`|~3$gXzkkwB0N*u|eUMm-u$Cd!NS(NNb&isYhMf8$n*9*dD6GiLQ@KF4$rvd%*X`x)GDL&6t0FV| zJAJl_&wDRcowCTf7l<8f@dZ4h$YlOa3rqI-WLJq^L44x2p(%Xo zJbHyW%FM`%Z%ZTZUqOZ%EE}h@^#s?-`2sdvsEmUEkcN`^KJA&F@E73)m)s zo5#zNw`nDW8xxy_*l+eOs#OYPKkT%pSiPS6jLcV`J(bHEQNW(DEF&C>eUWJu7k`&s zdi1B;if7o?$LZJ*#GD~?nPQYpXi8mCFD?h_nZgd#t*9CGCpfZ_n?|B|Cb3Zq7;fNi zYH8Is-G{V5&(+?nNzc}tS5sJLSvVc!)dcB~xZ(71hd1^EC!>oa7C^4gQKtrt~lspstcfYvaLXiR4XZ$-G8xayyJYkAT z31PbqL{z6@JtGG#pH@BMV8A_sdnk>S9iDq{cIu5hL77ZFvJaGPs#@5Yc(Su;!sF~G zRj9E`hXL7n|FyLjk-vkmACCFhqym|qFb5rvbT~wk$|ErMeP)m^>>I%e>#I_wqx&F< zdaP>&mu%$8)ilEF+j{HRSVsBc=ZU4NNeL%X+J$9kSrFLeRsacvrMXhojnCs2U6M*_ z75gRbz~-cE103b*s)@hr`L{VxXv5NQlQuIYB{nt<*)>p9N*&3IU~0$5kb?+$(S~nI zSDW}6+huqeIO&#PhOvQiB?S!OYXVpo>Ut; zFHP_+XR_MVIiJbrtsCGs?A&y<2wt}XeJw_X2luIH9H+M?ljFP!L5-74@83C{TT_|hP&x`2ubg;a*uiZx`-0l zfuTe%0;y6YZqui6wON@?ws!t<$i|e)FY$U`xdwzt<(Q zEGt*6nb6cCN_k(S_g$H!6Pugu31P;h4Y0%sGNa^RlHVTH+5NTUNC1m378D--$H@AD zCZqukGNy^AdXxO)AB2SoriB?SB+8s%R)wt=lby_L1jO)l3RvWFJc{a;^nS})U5vWc zGtE;hXU0MfoYi;y(+y!QXrAvkjtG~C93AF~5NziO`(-{i-=ANk4>9-&&?-jI@n|jA z_>u@Uub=#Q&(^lr>Z7Vc1?}(1Wn8o8MmAxTc+-p3-VOm3Xel=63 z57YjcbX*-MvT4W=oDqFpL_#M|_Up$+K)nLo1Xny+t<6;o9`Uh!*s92^e6c%BX z`?!#pWkY0ltN5M!wl5sx`6*>qE##zOb%JZn9^k_Ge9i`^p}^FbS-BZNCRZCss~iZ@ zXgb&FACe;!@$UAdG}^LS+6>i*&nc9qLq#t*KU!5TH%&!{OGWhso1RY`txSg;oKG&- z%teomwV?rztA-ZwKDm&8XrA>Qf7blI0!AP&fBE>}^YYFwHl>8uo%J|C=W%#If8a6q zR`FA`Gu9sz!r*?av$Xl~5%J|T1w*qnb<0>7VPP>G;m}H^|33QqA6}IKc!iF)e%`yf zPrrVx&Hb`r(_d;cq0Ty72$kD&=@|)Uh!>4-94Z}dbeWqQ+dBtAtK2pIY0^L2-;=ns zR%;TCqqcQS=Xh($F|?Hu3s=7WLtvv+C(>RN`6X7SUzO~qJVLXTQu_Plb=Dh^RSt0# zy2_yRSp<2;-TFBdIBa(VgNU{@As`Lv;;9=+v{_+*>DAS9Qwm4n5g>28ER zmdg_HjD&~oX{*0(X&xvtdC0eOX_DLP>v4ElR$KhU7_H$VtIARZD07bxuqIX%ZXNRl z_N4~ZMeP{Zlo%+M!Y zECih8*|z;TSiU=uB(fJ$vR$qnt9EVia<<^8w^F_hVSCdtD)86NPnafh*Uzp|AQeb} zGN1ydjU_qo4mS?&-^rPsoX2%A@1K625FAE_zqyj$ZB3Q3&rJQY%C8;gJ51XiHLvg zOW}OHES#eVhM!islti#C3s(wXtRD@<2Rba_Nagc)o(Wc`ZkqQmr)jKmTj#iK{#7AY z$dJ{X--#P-IwABrF9+b{3$~xD>+P=zarnJEftW=pw^16Og@YXWe#+b_;s~gIXq#h= zbslycTtZf3u{1Y^l8QIXHO9PiU%Kt+@K zbb4u2_pYnI&-2%fFV$TOV%Xxdg~pdRR#EDdpB@o{QMoj;Lyv}0&G!Ao_pGk*%{_5! z??lgS5lkRlEc2Q66n{QYQg!jkN{4sBl`jy#O8!SF>Y|Hk4A* zNVf9tzc#z<`{W?TzJMf;d;V3~vq%yxm|{yZyN3yEW4@0!ENIbN#!Yem%=b5^e^7XC zcd7Kt-?pWqgjq3e(t+B2>@!JXyBg&Gh$;}&Kp;TTlK8Gt?6iz8&Zly1X2lw+x^R|MEG?-VO=Zo z$R(053`b`Y{k1M3fH`1WP6+?)Kp7BjO0xYtgZ(=tR>1A7f)V~-g-}2Y2&~Gsjm`dc zm`5bY6cvJf`)Az&L6M^QGkZ4lW#@gSXnnqR$k~GAHmQlfra`KhI{cy)=!|r+9+yX0 znY)qjOEGZAWot_NtMIEpVGXc`8pUa&Kx0tsTeWM{Y5DPAA1{Yb7RqOfWO0pT;a#>d4Ae%FzKE(ujIQE$;aQRXRjL_7i~U z`W?8eM}Hl4bnx=Np4A^MRTJ<(?E>4x*i;x>Z;ADG} zKw}p#_zd6$t$eo=;PUxh|}jpw87-oe4p`mj#B%XaNBet!%e&rGf`#K`OG zMLR+$0zpixHI-n+oi2lLeUObq5%B+x4SJtu`kre7E1gbhZOw zNc>j6QU!Iw6e5yIRgY8XwBGVTbftMNT6W>Jon}Q>Qv=wn7N6!u@2XaCpQc%qe^&bu zV)VYyD|Ox!Zuh}33{*C6YKpA;JZ(c%dK+5k`M%%J&@H&%9#~u=;Bw|%$F+D~b}p$o z)_8S+b`S!8L4tf+GR*<6qZ*aY`Mx{kcHX!&17Ki_v%_>2pQc7}rc3$*_2)W;d{&fP zCinBn)5q&&Bb9QRgV+205?d{5`CTsrLC_unmjh`GK3@bymRn!y;qzhk@WEsT+jl;P zJ;*H2i&hlcEDT*Y;BQUp?QqzvSNm{IM5h5tMKZH_BHH_ry#wJWU&x|QI|aR`r>B=H z6pm9HbZA|We4q>$B)hHIafYI>0s(^d(j~}hy^PrD`6y;;N^Ut{lB?r-JV$2DPY3K9 z@7D`y|0TK?oHRL|ww}-_z zRKUC&H7nDXeO}L-(?_Jd*P87R()o3f{9owNOB>!paBOFaQqEm?Hob0TEBTyH7lRv| z&sQ6t-fpKG8PHO7JxUjGR~ShJ2z;J$hn~vHt8UnoDpvKMy~5qTf`AhXj?V}N_7)Au z2{w=1$uie{7op`tqTvg3CL!YC(dypMNJ!GjZM0evi^b<-y+)}`v`~Y3nNrqhMv0%< zlKv?ZuUe&z<#;$1ZGNs)QS= z7t#%xV1;Sz-ev0{KAldB-s}O48vU+h4lASrtaKptcvM(Vu5c(T(@e1CMw|1h=VxPE z81#)ascOckaUYMRYrZ-y^B~2k_cnfET&X5fVITy8Wvp&kVT<7)^rR4ANtd$oQQ~-` z)2io$_u4dXfNwx2pR_xl9%Ps%bN7SQHVl9y4)X#OPAK5BzSM;Ux4B&#PGTo!^oedp zl3`O%sR=?c$O*hV(S^#a(QCITtj&-rEd#z+XjoH4=U6I;211hOa10*Jw?HpkRS z$ou;Ni5oPkAUlbis6UaG8_>5_k2G{#9+!$HTMFF0?9z@@agsbZl`>_2-V;J0GS#TC zQ0pSD+X)tL(Fk>P1Vgm&L6Tp=W57aQ$XstGdB8_r8Qt1oG1%E`WW31ZC!cXh@( z-)JdUpvqu6@YUW_7Fk7u_Tr@VS^~v{79H@FN@jW@#~alk@;umls@Y z&74sBTmS15D#n`Na~|HB{{4;5Gl{;)d5($t2fw)WcTiAczUl%Y%E2)Y4aV9;-@D!& zV)Ji3q+&=y7C+V7{DTyBg3Kt1l2`|W8RxtbV*EkJ(t!qRD#ZQn{~FdLE?|C5#RK8E zHaN=Y~yvVSZiq>!H>CMc{OMT%f>*((!LCZj1{o7PNi@uT<+bDW?% zS&zls4Yz~j+=bHA6V{>jEjx8~!xwSKvfW6i{O|g&REm$bJ)IU3Y7lE3e5K#74(7-BYQ_T>q~|Y2gca=yVoJQxs52Pva-C??TxIx9kQ7tGP@LO`BF;}Y z)azNVwpWla_EKwnlu$n29l%|zo%*Y$WVYJq30k=}L3@8R9_cG)Sml7uMhrvj8EnOH zy3SX7caZwekt($5MN8N3)ACS3{`9`*QD=H|=x|?SJzJT9#be0ERqFnD8Vyd#oF`fu zhO0Yilr3?LfGS5v^T^o^U z?z~O2_Qnh&tCfp@VMB>BD1idA{&AR_(L!b$BUW%<{8x(L{uMq{5;?GDNTFn^NhoPt ziaTnC@1CU6A8#@@2Wk;<`Hv?sN_`KXX7${abiTNObO|8O`TibTwQ;D{=*vh0B-W~+duhCHU zij65yuH8RktN~~Z7)=zZObZ_Y*DEhk8W`o2D-EW+9*Az7pFbq%r=>-X7{DS*_Qb0J z3wU#CqX+?TMw>QYe>mysn9_PMDU^@5h2SQs8Pbu{n@gC=zGB;&-BAPg677uwky>*V zZ@XHHJT8woJbGtbi_6?i(fU9s##5SH>xxCp@QsY zeh{s6s7(3>%U>0h3r^)hvc7Hh4n`>04U9(bm-MX4)i*x*Z3L1}Z_fD{`_D zWU&>~Dpdx3XOdvcwY`DW6g;yn(JK@)udZ#gx$S73p({0F;oHr>I!-ffRrYh=@lp4_ zxQp|y-YW`p5BA;!TNbMaek*$a@hD!kFOJarDeF-pr{d2`cz~)4d@%iH zQ|7YZ>H65BWRrFEs$~GDuj5x2g_4c6vRP$4%(4moTnAO?w zL|+m!3C>&}flYhJ_^d^tTh&s?O^~!62U% zcrpk-6M>59WI@!f@+)R&RdtcT@x5q#*KdX(=vHq*r&!EAD{)%RE#lpXdo&2N<;3?z zV@f7~BKD|5x#e!OU4Beqtx!?Q%?9k36cuEjhxH+ZI|%jnwp=RzY|Gix%VED8N#A{9 zsBb7;JG@lBEusz@FD3(c99DXMw!wzv-*3!=gTyIBr+#Gwc1!kff*v*YaT@ieVEXyV zT!t5tr^pfq@PZgBy_&uiE4-ghDu0CD&a?RT2JEFCFYXX&ckLWYpL*xHr>F|3+j>FG zSc!VM*Rdjp@c`GxAd>~nxgpi*3sGJJLeXi4YCz(}Yw%a<;;YClZKY4m`W{6OTmK$` z(ZkI>|rBA2=bZH_`4n2_>>4771zYmiiYnd{)+drs$ zhGq-kheQK%Qo~nfv)6T_C%|vRMkno($G`7V@y0si)%LVS3D{sYnl3Vl6o{`;iOf=l ze%XA>@p!u&&4+ra5C3@VZzNOa|74EPJJqGx^ys*Hmg19Tq`#>sm?xwE84zr~id;dv zN#Q?7jQED4t;trWjm#<6lVUq8Pq5+V-0d`bakjFIdap?r3zO|VCM=S(I|o3pdV}9> zMyd?^>~15Qs(Bf+T~Md4pZC^%k2TT(wo49aWE^79$%B&^PfmD2{Q>1{Sw!i&|8nfeFosr=1} zE?#;Ao3J*oH{W1sCJl9{t)8=I?i%U!6e1<)4Js0)PL1bIqfm@1N;TS-OZlaQX8=}$ zfV$IYxJPrGz671NxX>v-a%@xX>sT7t-+5RNY$aXe)w@dmXo9W!sF|zxT8uC>C?I=n zwP6*^sj%4T*P#4s0+v)?83a{0KSl<+frgF+Ln9f1y0|N|A-gfM?RS~@#n8_53(2SX z;19^RyI_=^`%QtcUwYTbxt#PkzkPMx%mimgGy6fO zbMtELai&yMN{qTsAOR(!+h?$(B`JQDuncMjyTI)zQF0=iyaQBa#= z-MecwCLw3xBwd<-Z$_X{Nl?HZm6RxF74zACPmB{4Zjj=RmQP#sjaC_Rk{X^gqa+v~ z(NG6eeFCxtOLv+`R8&RMV6%|TZ(X- zHRd8kPL% zRAg#7d6Me=S(aem*FS*KZ$O@Wk0N&h>PICQCbJJBc7q0PbCXloGRR7;>f`+HX`~Zf z8W0sg_#@DHk(LJre;7+H@oZh^fZ7v}ZMe5Iq^jlB!r(oTWBd7*mJNg?3n!$Zc z_D(djtji5b?-zlnZUgQgaS>(_t8mX0WwBIxfS3*n^HV_7;vvfKxO4XQtH6wt7(>x0mwA%#wWEr^T{Ev=s$i8lgea zxf~IXqObx!835j;zzoop3D<@vZpe(Svlj`mHG7d(3tT3q%62tK$7l{lRok#8aJHXo z(ab6?swINu3$?Vvt%X__j&0|ffWEHNY^vf%4Zn&Fy9wONFRY=^JvM;4Wf^_6)R z6?QX|RTfo&%tpV+r2%_|#z7yz%lJV1;$AevXD2d;UIf73D7gT-do+zn{3qnRRV#?f zsrB&aBwd{(yAA}9ULEqj@=bJ%_lmG z_*SERJ~N`An=k^TNoX+GS_U+WiXQtPjJo6>h?s7DqTZlT%Y8|r-%-yb@4FR?sXTR5 zBKM%QSfz())F(5HYp23dFp04zCP1t?e*$m__6Pl(A_tS`19~cRslGy$% zy;CIpchVflpc_pjYI;q#f7izKgoAR*dJv;*{>45em;eHRievAR`WLnp0o)OU{<_+6P;C3-@jznhH9=Ro z+NcjjiMi1lKNiBX*^_Z!17fk-KDD8QS-RS@Po4P^QyF6idjMtVZ-&jsZ2%1jhQyx` zuu#ADT)7xR8mo@=Hq1`%s>`WV_658}{h(gt6XbRF#-C%BiSzyF7cbuZ;CB}tOLn?O zPbWr0^)yO)89)h<=9`jWqGcEK%J|oIAxdE&fXGIjk#N>j63s1?ze||h*LZpHCwMlw z&r7o6d*x2S+AIx5q&v%|Colias1YF?etzV`uu!1uPpcw$=$eVPSE>F~-U`}>(J^-k z!EzV(ziwVJ5CCUY@&WUFsJGZ;+%tF{-Nn^(hto>`{+@5KYQX`|qfi|V#le>x^9f%| zqIYap^Fo{}CyyDgV2F(zh5*oBL!l(n;Q@Y-xhrQwWUc}sAM%?)L@407a`ggvl*a?K zH#we7+$FDPo2q1*wz4gxDqC9Ce*(}){?dqY z-tInbu{0PU>e#VK(YH{%gmadh#TXF3?Ts8J09aRVX>|jTP$MtDchbJp_@0)YL@B^5 zeyq!`$r#mo4AS%&f{?eL_8Fz4Q3OyN#z@U9q3l=81&%fT%IU!lJf z+VT6Z)T;Ubq4dHOKfg5#=^uzv^#fznrHE2p_L~%>vN?!0 z-u`2AmjG7`fK)M4260PvCHSQR4aQ}I{>`-{Q2=r+&#^$jf3qtJu+Lb3jl6_AKuaZk zLL&Z?b&2~!;?GQ>--IgIq2_e*s;m9K+Bws3sK3UIXNg3Xh!G+CzLV_hQ1&I0bx1;% zNE#9%RI+3bF&NqRJ$oo+-*=O>G}(o*KWCbr7ylQ}|J`#vZ+M=14a{SOP_ma+o+beNpx_V+C^ zbayIu+cUHUgNS3o&NM6XjJPK>_nMS66Xd{Uh>-F-;gf6Y3Vhj;zBJv3!NWdlN=3yepM%gp-Q--qxZtHiK}jRRAG^Lp0C2M0-_ZKaD#2WpQXD4f zZ1OY62l?j3M#+bvP*z3H`4PkY$w2hOOr2Wl-YE^yl1ucj$!>u(`+bAG4#c)2&DBk+ z>esP&dPh>^saNOollX!c543Bm#nS*3Ap_Q#yL338Jz@O)HTA}XW;?V6Vy-n zt65@!G^)bGG&%UOPAS%%03rrrS6{6;ItNK@~%JgFf{*m z=1$61pP1^R4wTS?r=_{6mcu?U`eN>FyK7rfw_1`}efhry{lwa#-+#$}_q>pwlwBxO z{imuAvcE{QQTbTV;Mgx0cBA0ENcP-;tSxWJr8EpNt|pYitP2y^=2Yx@j=WnMkP@f62UiP@c&TJ&m@^kXL-^1uLpH zv$$4RM7g85UOt{UgxWE`O6c>ul=Mn`>>R(8PVH>i_|!#4sciPZVXl_u^5H9o;_Dwc zM3}bGkXOQLaP>W=jy7OCdGer9-G$>#s8@lHZ39wvQHZTg0-y1kHk1#tR?nws-Bq0zwJb3mO!zt0kt-Y&z$`_<&a;N#)A=Uw+Sjv9;Z}p|~FB)hY^iA@dRCi?W$&2+z za*!%auJyE$hV}T8I3{|d#@hT6mz)wyreU{Fli#}m)#D$O7|uZ&I91OwR58D&)1%yYt>;0u;;n!}?Td z)tMQATr+wBlsnFPj(FBm#u4*U6+*zzeKjzPoq9?yBun*UFa9l%#Shw$AK4Ii;3{7K z#>y}1s`;b)780KWl3qcJusOCb32ZsE*i?YXNoMOWlmiGu6ysGi;~M66R2>>63s)$&c8j& zLWTC`+z=l8zAA{xVm6@QVE?MlY0v~hovtx&u3OFmW0R5jUe&fcR0?z5ed@i%b&f@P z8Lu?QYlfa*VR~(jczC(z3rt*eA>eFs&ACk(kI4yoq(c~Rc-b_oZ+QPPc%N)v!y`Uy zq=;*#V>2aHccx^oag)&Wcvm9r!LV^AfT1mGFiT+#Jb!DipyEcw8$@l`V?x~`sIw#$ zy;G8A)sW*+Oaivt3Pz5R+&Vwy@3qw(voE|Os<1Khi09x~?!qo=zt;QZ1(68Br^+XJ zOe>-S1rMhk%x=<=7fd%yMr_tB*?nnqy4~Cw!K#F4H8U`ABsbm;1MfEZi?hOkTQc`= z4Bo5IxFYera(>HjPmS1pS3Byyf`r9Q(GtdBjZoQX+4`_O9<@~Cd{UaWB1~=-&4R>6 zj|q=-F~8+$1?$;{DAVP<#*(c!P4Wm{s)Zj{HXX+_sTg$I5CAY(N_qBe@7vZ4O?A@| zjZCuf1pryw?dU6PY**R>W;oCMTSb0bUA*T?o6e~|C9^QCHWm`7T+DR6cTf6_)x;r3PUmul z8WnkRUWDia#e^v9=fDCN+)@g(T++?-V3HV=*crs$1c;a*u_GgQmsUcDKQF=2+RW4d zfUo=W)_w0^DPdO(*liZuQ;#%dI#RAHVLl!RTj6i1LS)-^R!|DUXH{dX^(cIJFPvVP zS77r6T#9RtfwdoO+W@ z%-h{k`ae52STDF;rZu`k6<>{@`(~j{r`vzFk2L>BKc!cQ|2!f2g7AGFytFnS6{huppjiW9- zecIabjsXvck#GRq!iK2zJARAj#Cdp|-DVtr04%_h7*Jf0W^?&VH_n4!qV0Pp74t{@ zL&DE|`ae~byX$Yj(~$94(+ViQb8&35>vOr1a?BNwt>{;S%q$6iNU=QKmTz5#PUkst zZWteWen#Viab9pv@Td6OVO%?wln9COmx_Q>=qir9eg2{n8JMZq2sO3=O> zLxX3(xVqYhJ-BR);2s63cU9dYN%ws`gzD5oyq4VpD>YifLWE^j(9S2^1RNLB?H$_< z`ChmlEG5F-PmlK&aNN~GloF*M=F#!N4i5OD7q-mZx&JkWYw|G9I47aa`f~GEkVA{E zRp`izanYXc^U|jJ#?LUs0vg(JWFY7&RW`~YwPJ+0Ke%jqve;UivVz?a;3;NG3JsUJ!s>E9!y#}U&HAe) zODvLBD1K)2D>rmI97ZGkZ!cy$x_<1Dm02@;(q+9yz{&XsGfVT>lFFyCM%t=TU{bz?z764 z9-l60X=}f(YuI`_ka_a39&V>mq9R>rJwI62zbr}a^0P%#MD|T$LDRC!BUDIvH-LBT zX3k&JbG7?y-{zV-)*gz^>-!-z_g%Lm-qce2vAFtVeLa(yu1bhng>Y6eC0Q{i= zZ8En4J^GdD#gB0g%;V*wOk?RuVN5O>z%j%gYckx^6KqKT!ZO&xtBO@jHwr))iJ;+Fvw|!j>@HE0Ze&!3MJ51<#zwwHE{5RcQ}tT8RA^0&FHJ z=gp(8#&01)^tAcIq8tKK!DJkNGIW;X^UZ~pCn8LdEF@_S=tv>w>Dq(d*4n0;ad-D9 zQWWXLoYBq>i#deHi{!l9dp{KE)Mn2xp`{f21%v`JQZ^@8RF3FUt1llq>G5|OxCN;IXYfe_@mE9b+fl-00Synnm`wL)T6X`=JO)A}UtWP&o zTn~089FP&<@x~40SAMVdU>t8AdVWe-WjC=GVj6FDEG4J^F8;TdexbsPNdwPbE>kI{ z*_pcwuT2=>4ORfV_bqjdG_K(05-wnO2S<&jw3RAsw&IT#XR1Z#34Rm8!fj=O4 zh)zJY>8Ks2O7N4D4!w~V@+L;?iYtcpg8+bGya>YRt4HOzb@zIbYq9gMJr=*vOe4Pe zO-@b~Th-sWe-j0bs64W$aT~F&ahb?$#29C7K}XL4Mhk~3QJx5!RR$X#nb)|bO0UX3 zUb+3Uw2M2{itzPxodJ9=j6` z3*Zg(8LUvd`)iC2?=qGWuVhv@^o?c<+Upu1h2y^fBypivZe4vO|JEkp@tj93E91kK zPkzBqTZ7J$OGY2hKBsaASfi$e<%h1CM@{6XhC|45C}P|AC*zOKM)z7>V$q394zSy}J zRaI?YV|hA;LoZ9+pDpha9+IvETpd|bQc|+atBs`}zB$8LK{w<1Z5O{pn>Vt*L}^Av z=36ImuMXuzRr^3OdY=r^De_9th&ux=43h{LCNpTVEm$9pn4PR2?BAAU+FgIRKwG7v zk*&xDEXBOhAL0hH8@ax2LXFdi`o_%|c#!7L7=L|qKxQ_q1myiQ#pSj+lX2T0gH;9e zqJ9nZg%Q;&U~jvk2ik(KCnZyN9cuE}=jxi=Bo^s2-XZE@kP%zwaG((|>Fa=9V`~pdsOvpYv3T^LuC%q|M6>xkrAmqgg@=5WX*vBy>-?X!E`F|&clpHv5fxVgk6$8tw{@IPo2{E~eR6pXKGyt!;K}di z)30ZiE)Y*?<3C!5^Azgr`qJ<}$_(7eMa{ogcK#nh@SinA`{MMqrJpo-6I0oUI^F&) zUE3Euya;N?p?Bm8-|--x)_Ks0EC}@RU%5pOino`=MDU0@s0!i!Bw9|3AG{QVZ6BeC%T(H46LGC_v_rrV%sm(kIHZ{Q6T gpez3OT|Hq93sB&Ip19BB{<`3XhMsz{s!h&1 1>&2 2>&3) + + clear + + case "$log_choice" in + 1) + log_file="$(get_log_file)" + if [[ -n "$log_file" ]]; then + less "$log_file" + else + echo "No log file found yet." + read -rp "Press Enter to continue..." + fi + ;; + 2) + log_file="$(get_log_file)" + if [[ -n "$log_file" ]]; then + echo "Press Ctrl+C to stop" + tail -n 20 -f "$log_file" + else + echo "No log file found yet." + fi + read -rp "Press Enter to continue..." + ;; + 3) + log_file="$(get_log_file)" + if [[ -n "$log_file" ]]; then + echo "Log file:" + echo "$log_file" + else + echo "No log file found yet." + fi + read -rp "Press Enter to continue..." + ;; + 4) + log_file="$(get_log_file)" + if [[ -n "$log_file" ]]; then + tail -n 20 "$log_file" + else + echo "No log file found yet." + fi + read -rp "Press Enter to continue..." + ;; + 0|"") + break + ;; + esac + done +} + while true; do choice=$(dialog --clear \ --backtitle "Update Manager" \ --title "Choose an action" \ - --menu "Select option:" 16 60 9 \ + --menu "Select option:" 20 60 10 \ 1 "Check all hosts" \ 2 "View hosts file" \ 3 "Edit hosts file" \ 4 "Add host" \ 5 "Remove host" \ - 6 "View full log" \ - 7 "Follow log live" \ - 8 "Show log location" \ + 6 "Log menu" \ 0 "Exit" \ 3>&1 1>&2 2>&3) @@ -40,12 +101,7 @@ while true; do read -rp "Press Enter to continue..." ;; 2) - if [[ -f "$HOSTS_FILE" ]]; then - less "$HOSTS_FILE" - else - echo "Hosts file not found: $HOSTS_FILE" - read -rp "Press Enter to continue..." - fi + less "$HOSTS_FILE" ;; 3) nano "$HOSTS_FILE" @@ -54,34 +110,27 @@ while true; do read -rp "Name: " name read -rp "IP: " ip read -rp "User: " user - echo "$name $ip $user" >> "$HOSTS_FILE" - echo "Host added." + if [[ -z "$name" || -z "$ip" || -z "$user" ]]; then + echo "All fields are required." + else + echo "$name $ip $user" >> "$HOSTS_FILE" + echo "Host added." + fi read -rp "Press Enter to continue..." ;; 5) - if [[ -f "$HOSTS_FILE" ]]; then - nl -w2 -s'. ' "$HOSTS_FILE" - read -rp "Line to remove: " line + nl -w2 -s'. ' "$HOSTS_FILE" + read -rp "Line to remove: " line + if [[ "$line" =~ ^[0-9]+$ ]]; then sed -i "${line}d" "$HOSTS_FILE" echo "Host removed." else - echo "Hosts file not found: $HOSTS_FILE" + echo "Invalid line number." fi read -rp "Press Enter to continue..." ;; 6) - less "$(get_log_file)" - ;; - 7) - echo "Following log: $(get_log_file)" - echo "Press Ctrl+C to stop." - tail -f "$(get_log_file)" - read -rp "Press Enter to continue..." - ;; - 8) - echo "Log file:" - echo "$(get_log_file)" - read -rp "Press Enter to continue..." + show_log_menu ;; 0|"") clear