From a7e6eb73414d9403fbfe23739c5e2dd3f2c154c3 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Sat, 31 Jan 2026 00:25:38 +0000 Subject: [PATCH] Missing theme file. Added favicon. --- frontend/public/paskia.webp | Bin 0 -> 44164 bytes frontend/src/utils/theme.js | 101 ++++++++++++++++++++++++++++++++++++ paskia/fastapi/mainapp.py | 10 ++-- 3 files changed, 107 insertions(+), 4 deletions(-) create mode 100755 frontend/public/paskia.webp create mode 100644 frontend/src/utils/theme.js diff --git a/frontend/public/paskia.webp b/frontend/public/paskia.webp new file mode 100755 index 0000000000000000000000000000000000000000..f420989cbaf12d91eb83246ff185ccf66970f110 GIT binary patch literal 44164 zcmWIYbaSg&!@v;k>J$(bU=hK^z`$U{z`*byj69v411gjm7#J9oD{_)^iw?Szu}Hw&DXGQD z3=E7M3=9k#k_(DT7#J9LFfcF*m6sHhFfcHkVPIeoNzO=2VPIf-z`($uQxp*y#lXPK z0}@YyuoXb;bO_r7#4ZX6a%Ny)_F!O8;7LbfCn2$uGm3H<7?eX87#LI_ZUDPlrZ~vm zNjEhoCsjAhNVm8sJ*lK9SuZm=87vDSWEqMXf*9NxoEUT&QWau`w>bQ!`Jj2Lto ziW!O+(ixH%N*Ib5k{R?EG8vK?ko7`LppYy{ttbH*;hbMkS(KTcQKDdEU}&nN;F^<@ zst{a~pO>njQJ$JqoLQ1;rI1llQedU8pO=}Jnv$Acl$u(cl$w)Yu9uvjt8cB4nwyxJ zW2FG{a4|@u12%P2(hH;3=G@b85ksPCYKhKLF^U)QH%^s3@i++ z3~UVS44e#H4BQMn415gy3<3;-48jZ|45AET3=#~I3{niz3^ELI4Dt*L42lfO3@Qw& z3~CG-44MpD4B8C340;Uu3FNQ3|0)*47Ln*4E78T3{DKr3@!|= z4DJjb44w>L3_c9L41Ns$41o+m48aT`4519+3=s^G3{ea*46zJx4Dk$!3`q>h3@Hq0 z4CxFR44Dks3^@$B40#Os4229u48;s33}p=E3>6HO4Al%Z47Ch(3=Is83{4Ep46O`p z4DAdZ44n+!3_T3J41Ej}7$!1IVwlV@m0=pgbcPuWvlwPG%wd?zFrQ%o!$O8d3`-c6 zGAv_Q&ai@E6~k(VH4JMR)-!Bi*vPPnVGF}nhHVVn8Fn)4V%W{FhhZPXeue`K2N@1A z9AP-haE#$N!%2oy45t~+Fq~sJ&v1d^BEw~dD-2f|t~1i89E@Cy+>E@8e2n~zf{a3pB8;Mp;*1iEQjF4!vW)VK3XDpO%8aUvYK$6;nvB|v zx{P{^28@P`#*8M6W{eh$mWOs-5GOkPYrO#V!POub>OleG+OxaAiOa)9uOr=caOqEPEOm$3+OwCMfOdU+!OubAKm?kkz zWtz@3i)jwie5Qp=OPH21tz=rww2o;5(`KfvOgor%Gwo$Mz;uY|DANh1Q%q->&NE$N zy2^B&=@!#nru$5fn4T~_XL`l-hUq=iC#J7V-sU6jY-QQOvWI0q%VCydET>q`v0P-i%5sC{4$A|U$1KlTUa`Dm`NZ;-uJ{Wte07@v)*RC&-$44IqPfI_pD!7f3W^xV_;)p<6z@q6JQfzlVFo!Q)E+R z(`3_SGh{Pmvt+Ylb7FI2^J4R33uX&vi)M>wOJ>Vp%V8^ED`Bf-t7U6sYh~+V>tmb5 zHl1xY+kCbqY%AE-ux(`9%C?hjAKM|eV{E6{&a+)%yTNvc?IGJ!wpVQL*gmm+XZy|0 zz|O+X$g|Ifj~!O6kPA;clhA;Y1_p~j)jq0eE$VaZ{~;mqN|;mZ-k5zZ0Ak;sw8 zkLM6NWh9Ihg+a;{pg zX08sdKCUTTGr8t-E#+FpwSj9J*B-8eT*tZ2a$V-S!F7-83D+yG_gr7OeseQ&vvc!s z3vo+u%Wt=r*LO+7jTzx*Kjv+cX0P{PvM@$y?}ce z_Zsd^+&j4UaUbD6#eISM8uuOUN8B&D-*bQE{>{V4!_LFYBg`Yoqrjuaqr+pwW5Hv` zVPmw^8D3K(QERkZ7YLRA<9+4>`b3~SktQFZNvQOlg$a#_LA`e7f zh*u#e&45#FE8w#7f2L#M;FA#b$^t z6k8>>S!}o15wWvk*Tn9Ny%75-_Dh^uoJU+lTvl97TwmNm+)><1JXkzNJXJhTyj;9N zyiiysg_DSk=(w)hkAx8mO=7$i6)ge0UTR3!8y%q1KoJSBo8VkA-} z@+8V78YQ|UCQHnbSSGPvVu!>biPI8SB<@K(m-ry@OOjcVM^a2uUQ$!iNYYx;Rnku~ zLNZY@Te3v5PO@EcqU0>eC6a3;w@V(7JSBNq@~-4F$q$mhq?o06rNpEZq_m`rrEI0# zqynU(q>`m_rOKrmrMjf1NX?U4F11l=x71Oob5b{?9!b5C`YQEbnp0X>T2@+J+CbV$ z+C|z=Izl>0I!C%xx?Z|ddb0Ff>E+TJrFTmol|CR zwleNAfilrDsWJsJRWdCyeKIp-7RjuU*(P&P=CsUJnfo#?WxmM#ljV>Vl9iEFmo=2N zmUWd4kd2Z}k#nlbs>ENOrC4cG-inXJoI*K9qee`&EuXj!RBdPF_w+&P2{m z&QmT}E>12(u2`;Cu0w9J++4X8a+~D#${m-xBzH&dx!fnYKl1GILh>^5>hebNHuCQB zLGm&3>GDPLHS+E9ljP^hFPGmWzgPZ*{3ZFj@-O5+%l}j0P!Lv-Q_xf}QLtC=QV3Cq zSIAN*RcKJ?R+y%+P+^V2c7;OF;Fo^F6X$nrH@K~lsS}zmF1PSlueZ#m3@>Wl#`Y7m8+E7lqV|BRbHXI zMR~vSY2|CmkCfjj|5RaB5m1p)(NHl~u~+d{2~$Z@$y2FRX;qo1GDl^F$`+OVDyLPh zt2|bDr}9gcO;t!$PE}LYRMk<{S2a>KRkc91MzuqAis}N@HL5#QkEmWyy`%bE^|R`K zHEuO=HDxt@HET6@wP3Y)wQRL=wHCDrYID?9sBKX@pms*>hT0Rg4{CqaIn_ng71eds zE!ExBgVf{Hv((Gfo7MZ(XR9w)-=cm%{fzoe^{46|)&FX6X^3ekYv^lOYj|jcXe4Ol zYE){pX-v|Xr?FaNyT%cX3mSJdUTS>PWYXl2EyGXlUyGMJb_EPOl+WWQ7Xy4R+ru|umQHM`QT1P|2 zRL4ojUnfQRR)S!aUIJe}1#J9LifT++F(^H%4VF1xOXuA;8Ku8ppzZkTS0ZlP|S zZny4C-DSF)br0&E)4i?xQumu4i=LpKoSu%JrJlQ9h+d*zzFv)9m)>-}rFxt64(OfL zyRG*^@0&iezM#IGzK*_?zPo;?ev*EHew}`|{!IPl`djo5>0i*ltN&X6rvaORh=G!U zzJaZQw?U*qxm073RbhBko^#wy#Y+N#THmeoqD9abl-u3J5~`ew~$Eo!Z5ZDQ?W9c-O!U1Z&4J<)oh^#4q6UY4qgsX4%rUX z4&4rO9M(AOaX9O6*WsW7`r&Uh7olZO5aeC|Y*O|{*-dW$-!8y=5(YeUE*?Efd66dYX z$DFS_KX?A&!s#OAqU~bs;^PwQlIK$IGQnk`%O;mYE|*=NxO{bGa}{^haJ6*xa*cM) zajkXjbDi(H!S$f)CD+HUU))&T#N9O9EZw}^qTO=bYTf$X7PxJ6JLGoR?TOnrcXoFP zcTIO|cOUmy_dNFo_lfR{+_$(Nb-(8R!u_WQmxqjpu7|xxfJdT7u}6!?G>_#TJ3UT$ z-0^tp@!wOxQ_0iV)73M~GsCmWv)gm7=Q_^=o|ilydw%s|^OEq=^0M~w^@{f@^lI{& z;OYI@1H(gJ~BRfJ`O%X zJ}EwBJ{>-@eAf8v^SR*j$mfeMo3Es=wy&+Pzi*;%v2UyIbl;V}dwkFNKJfkI$KogM zr|DU{B!uz>R@N z02+XVXuCk2-VcLdK4 zUKe~Y_)75e;9nuUAqpYJA#Nd&Avq!SA(KLuhU^GA9da+^Qz&bwM5uPCU1(rvYG_4h zcj&y(jiE-?q)TK( zWOihIf8WkCp6V(tkC2B>~o~R2^PojQAb4SZZ8%MiG zM@Q#JH%Cv8ULCzZ`f~L1=-)B?G0HLKG2Sr=F(ok_F>_)z#2ksa5%VUNF;+BIGuAdX zFg7)|Dz-0nQS7$Z)3NtsKgV&z$;27Nxx_`r<;FF|O^aI`PpnxFhjw;={ymN!&>aNv27jNpVTVNgYXZlQtzCPr9A-A(=Hp|Z<CWi(_=%UGRpFymUrn@pxm@l4%J=gf%Ayv&x&nVIV| zk7nM^{E)?#C6i^8<&hPeRh-qCH9u=>)~T!qS>LjGvX!zevi-7Cva7NuWG~C!lYJ@s zMfSfOksPfYhn%pSoSded89D26j^y0R`H;(&E0b%S>zNy$TbkRQyD)c0?z!A2xxexR z^VIWf^MdoT@*47{<*m&-oOd(tLq1!+OulixXMRF{S$I~PY47Z!IE&oACqe75*W@vjoW5{(l3lCYB8l9rO$C7Vi4 zmOLo=UdmUhR%%-sQkq@bR64VCL+SC-d!^sXc*|7EtjmJRvdS9EW|XZjJ6?9L>}xqs zxk|Zpc~E&)d1LvE@(tz3%kPzctKh9rt+1&GsmQKqs+d)=vEpRKgNh%O{FUmJc9mh3 zd6lh|b1S!0o~e9X`MXNEN~_ALDypimsQ4ItKF;PtIMkUs+U#o ztG-tKu7B=G3;-&Z*r}d$#sz?cX}l zI^89kaYN&Y#)pkRn}nLQnw*=Wn@XB`nwB>0Yr59- zzL~vQq1m!IusN%_xp{W;mgcj~Pn-X>h_@KDc(f$8RJBZQS<`Z)#(; z)}q$#)+McbTd%dgZ{uiFY_n<$Zp&$FZJXD&z3oEV%XX%A>2{NL-}dzOhW455o7zve zKWYElA>Luo;n|VYQQa}MV_nDbjt3pTI)yuRI^8E zY*$%Vf7i;cLtS^ezIO9>YjitxM|YQY_jRx6KGc1?`)dzhk4BGEPjpXdPk+yfoS})Cx}lloZvknbwd4wSrfKQI5*+NM5c){6U`lF}rbN#Tol!nx(u}n;PRw{bP9W*<4cE{``v-i)w zHT&xv!8tl}+~*|Eshcx%&ek~>=DeQEK38e3?cB(@C37dtT|M{M+(&c&&Xb&HGB03W z_Pq9ai{|Z{cWd6)`GWIx=6lRfo?kzI_WW)0FU^0qfOCQB0>=e03n~^&S+HTj=>^Xh zGB1>0XtgkGVbQ|Ag{u}GTljF{-$jy(Ocw<%%3ajCXz8MZi|#J^xma|u;bPy#nTuN& zFI>EL@y*3wmk2J=UE;YUbxGrrc}sRJxwhofQof~HOWl_yFRfoXd+Cm)SC)QQ#>_E-MmO)UKGdV%v(# zE8efKfnF$4(=VAJKT4q?r7ezaL4`~cX#~WDY?^P zXV}h?os)KM*m-W}+g;qdGD-n{$b?hkwT z_UP{M-jlVbW6!cZNB2D5%d}Tvul?TGy)}Dh@7=lg#@=uHME4o*3))w>uYcdVeP{Q* z-p{pPbHDrkwEeC7m+U{Z|KS0K1M&y#4#XU&J}~RR&I30Nd_O39(Bxq7!J>l`4{kVk z{@}YqyoYoSc^}F;)Ol#dq2q_19cDeOa@hHB(&5I#3l1MReE;yjBeF+qjzk}+J~Hdb z&LcODd_O9F)a+>J(bA(+j&44B>FB3pg2xPw1suyi)_-i>v9rhC9_Kl(bKLuQ_VKRc ztB#*M{_+IJ35^r(C(=)}omh6_=!vH%Sx>5*bUB%FviaoVlZQ_}I>mHK>6GKC#8Zu@ z7M?nA>cMG-(+Z~@PRF0FKRy5S{?qqQ|34#t#{Nv)nYuIc&g?sL@65lma%b(%#+|J@ zJMZkiv-i&aJ12k6{#^XI`g8No?LT+_-2d|m=N--`oNqY4;QYb!4=*rYP`u!DA?ZTX zg+&(*UwC|x`J&22my4+vTQ4rXcqhpCo*Qd#oV)S9))5)Z1;hSKK~%`_&!pJGyuL?&RN@cxTg{ zD|f!$6}xM3H}Y=v-8pyn-MxR0@t)E>mwT!A+V8Enck14o`@Hw{?+4s3xtRm!_SXIADKUjd{p&l&ZB*g9z14x ztn%3HamM4W$7>#+d;H;v&=ZpQuvrj)f6MAOy zEbLk3v)Rw~KD+;%>AA{tx96G9yPvOpe&PA27a}jrUqrsBelhRGfftWovcA-K>Gd-A zW&g`fFR#4({z~$d&8xUqjjxuxI`-=2Ywp*2uLEBfzn=Db=j%JK|GiOsX| z{&Ujj*3TianvFgXUA0K~;{-)Fp@3gq;0H7??pz z0Ty3pU%RPN|S*g0HDT31=+Ja^!E^{n#{pv9$GX-qRH?f3})jy>{DUm#n*l zqTD0r8jeIewdZrvzwPgfJM`qw`X`y+`BGMIyX$sokNiJ|C|lZqP*8jA8`G4T)S@nh4vj` zj`!9_3cPAFyS_~A(YuTF@psN;t!Fj2Il8;1qD}m{Qnr75g%$7jNf(3X9-V6S^J^ma z|5uUi%PU_@UGx2<(p^2D=Z~+em)B2WcyP#F^y=;R?X{;A_e_nndBbh7W?f;3+uCoI z{Zm~li+9ym2~OV9ec*T1{E5zw|9#=v?Rj%g_s%bJ9kC|YX71Y4s=0mli>28M&o^7~ z8|;bkp6YsL$KJ56$^8r0E?mrK=+amHe4e6)`afNqqRgJrtNPC|J zZ{#=@1yx6DE}G%Vq$Jqb^1zknvA`r}1;%#acZy%H9*(aR+n;A9@?1$&vCCSJ#X+sf z;mwZYoJ!0LBIiHazS^gM?Tm3~8)x()-RrAl-};s8d!eGeKMNx>V1b0=yxil(mk z+N8X1X2fi*G!ExQH{#Ck_?>_KHai1DoUGFC7u=0KEk2Gm3@+PhGZy>#9Lq53em2?o z%vJ8Xg@1N1ec`fPpf zjFVPh`F?#`mXVjgV6o9Tw{0r&NkP{h94+OZm1oYfz+hhtU&(n!hJgLvnbwbcy9++g z%MU3pZp$_1Yvr?MV6eLU@KeEur>;|{&WXthKXB_r*4eYmef}5zobl}FS(EH)!O8%; zN$VKu7>e5O9(}kYSJ`vYC;r{%-p#!E*X;;P!OG+RlKnmP$^^SFDMmCszcX|G21eE! zFU_~z-NY+hdQ6bPFwgT2^9BQpA7OQG{;%C9bMj}+{`1A>em-nfa-Mm6udlOo8XQEV zwaFbzn`1V$TkpR7ocor~E9bqJZ`<^KZ|&>*`EAx&l^asv|37mR?%* zAaiTfv@G4{T76GAqil68P3QKl6SFzkxq08xNsGfWC8MuxTeDhG|2|gadXU<%C?#!7V%)hu-E)iP2 zBwX0oc=NiKpY}eNyS3q3O!hg$s{EClx7A!Hsl5E}>T>mfvW=3^>Rk&eXUxnmnU%Wl z?Y#8wN51bh{M`HU$eA;H?ivT*4hW8%Id!7s1i`$#Wm-y7AO73_-}Xyx{rT_H)p7%> zuUf6QJ^b+9{@mN!avyKYz5VUY+{&www-vv>O3R%6XjPEzsYXYh2nT5~_| z-Nt|a!;h?Yx%2&~Ppg1KS<3BIYrn)ix4omvz~AbBNKw^DNnm>Mw|T-00&^Gs_xfA$ zXHDh(aDT1^Az$$l#t)Axt0bD^TWaO$JD z>Pe5!o=UWSSytbDI==hUTIc$tx_=S}y8fB|ynp+{uB&n9?6?1~I2E*C^|yQZ=08{O zy{X@E<8fYm#=Zly7Om*foTugUHRHg}7MY3fCiHi4Sv>34I$pE6E~dUDc>8>&9c%P| z{9={K{+9Ib;^%&~pDX7tVTqqn;cxfjul%O^uk)8m|MS>){p+^9hBv~QBi3h{OgNgb zLaXVpfK!9RhaD?}7F+iiNN6rIRy`2Wpd4??{&Qh(_|MN#alh{BR_oRue}4a-*WbQY z_xsQP+~4=+&d&dLH?^x|tiEwRCL?+Km1GZ5gB1)FAqfk;IHH-=Cd8rU+R~B)B2~i-Op`o2LF~7Y>PeqKguTdudH#n zbMCh*ug`zsUV3xRLo4@w%<*&{^A8%g2W=m!E+*g_B?TqWZ>bINf zIzM@`*mzCAE60a|*Q`4vVnNZ-#>E z9`=83OSU&IUr>I)n2BMEO%Z3)!iP>@jTX=n^XIn+I zq#mg^kyTNgELhp&fy=mFk;#|(FR$1;+o4@O%i^Ptbs{~Ei1lIC! ze`CG$-LXc#pzqEB=@%Rvi7ZQ}2TsglijZ#^ zQ_;10?~&HobNja?sjp*jaCh=feNqkpJ!Wa0*L}-lM3% z_)VA3#~SVmbSzg~F5ISE_|)cvY0A{@muKW=i>0M1E@RcTvgdoW=UPC*{9l?u+7*hG zA2<}=s|6J7oIjs+>7B6Z_!9^3{VV=|`@Qx5-+y@nhSCe}hXgb}1f4$U=i>O~qPr&V(xjH?kOwQiS$winDviG-?k`d)pu+NFLm1yJ z(b_MIrY-M%)%>iBq`D+_`omz5nF&x)(3@e^IVx$dU`stDP!0 z$v1xHAzzuQJyn*HE8QNk&AjKb^j!-3m92hpFI~jvEXw3#c4wIW^Ni-svbfVr^S!*h&fYe=7kgFy)ARb^ zy49!M-Jhu4+quSh`S(w2Ume~0pnpNfsT%X7W(BsOwVNWIo{8bLJJWq+(bu96j|^^a z%hO`p$FtdSS9nWU2g`W@9y=DrGb}Drv$jy>?u5(dmA@R)`^LHO@47Ydld7Jr6SZg%{n&CcGGLNa;)FNM=@0dep7?(C zM>Qe>F^O~u{8}ojq0J?^uWOEmP}Fl4y-bBp5APIl6OM&h zyMk6X++y@nnvhrdKYsGQ>%kt$TmIJB^G!E9bx^kc)^)w}$Kn)M|Ga6w%RayU&++}Q zE!65tufOr!s(fqmF42v-xva{kUDtE}pZE%jI4&+o&wjdQP1 zzSE2w3zw}c^S#=zV-n+zi7MS*3@p)H4)X#sC-6KE-Klg-+Jj|E`1M(b*eAx+pA_M} zJKy_NZHHHhOI>GZ=!zp#r)QS=Zp^-OU|;%`+wyCl_0F9B_vnA;sGC=s-%D7&{>0}k zw0P6At{++(7&#fUFUW@LzgdxPb3lz}Qtju!qNtsc8+ufDT|a2~m^qh73r%93vF5^} zrcDNtB2o%Qtqm8J?AXJh`z|1N*(_6)7hBH>?hsK>FT1;%3x%mHrI{B1+jwJ>< z89}j)+E=bxU0ST+RleN6Oe(?V>x`N0e)Yqg{@lI!-j^@;9lmEUJ!!CTsLG28=R54_(-yK@O z;>OZe?GEPjN4E7%`j^j#-mCn|c0hISu@`Sw$3MUPFLX1X_r(>_KZUYg1s|_m(6N*6 z3X@ZVUf6fDO$L*1?L1X;mQ7Kt-BU|!iEv#`>B%Rmh0|*N_rH^83Mrpv_P%QS{Y~3G zbuHg*Uw_l?<~{u*o3qx+PyBIzf>VJbmx$+%lRrErvQPSwEcxQD{-V$sYmHqOieD;M z(rkGg`-AnYo1VLKUCNK5PyZSFR_*gwisqkY&>+onVzSc;7S;=*50V=ur}r&ykGb1h zbCcQixK!M=O?#(LH3~g&aNET;gR-(GTo<=~om1*=I&sy4Ll-<+*K~65b6#D>=NG~J z;o;_Lt>=;TC&L9Ril0@B8}E*j-~V>!^NfA|kDH=1|G8gi3)vua>`c|=+1r<$mVEFo zyiES=iSNyv7Lt}XA_~d)72c&BB5vnAm)_}cc4*w9sJkX;*3=fy zsI0fecMi<^BGrDSJ!Rh4C-KD@sjoACZ=UvN`E+-)b3t?e7(J|Kex;kiR@eSVjfOF1OqwIZuuDqZ3H@|^(?;Ez<(Dk*IeEwhWomqP) zX!q;6QQt2(=5H2>IIVrrN95(1t*iW%gIq2?lPmtBy|C@dQ6a|9?~h%ad~Lz@L?f;J zECrb<&a>nHo~!?`;E(V9>H-_)+v*>0*iAWpc$agX7t8XAi)MwZ-QRbu^5L0zeMkLd zozqLw^?}ZF?4$ocG@6Eb^c&@^-Y%qW6pzdhp9--4 z7PS8IlEv}I>N_^&-VD>5skrNUkjcZ{bDu8THmUqWknJr0rz;E^GlYV!&-Q7J^}59$ z@@Ci0>SLM>x09>4{JgUMvv=1?_OH)>T|V9=b$!cfwalf@FHQ`5(8R*%Xu9gxxgTa6 z#vQ%q7ipbJE4bR~<|=ygvY^=M{V%sYo}ho+mErjn@z2a(clEh%eQ9C7^zg=?Q?r*W zy3=+blqpa?z+v44#%lrnwnB=st{NFuD&1OMtA9_~c)9KVTlN3<51;=T^1G%>oZG?n zzZu_B-rY5y#hflZ?n`tqQ*xcra;4kV-OXvw-IjvHOPM~MOkHBCOnGa$ey)1cB58Ww zXldN{A|IvY4?m``=g&BCJ!qw0V#_;C7xt%9io_igJq{R73Rse`I&-%m=Wd7Bz3hV4 z`d2TTpE~(2_g_fehiz;RY7+O~)10|N=f%!xExVjHDzDu4zdrutRT1?B4o@LPqb!BmPnfDjRJXKkAUBlH1g?KupkFXzf+1()w!c6I@0;mK<{2kX z@z#TWf~&fN17~*@P5AI{``=0Sv%jriwJ}cM3e7vyo}YA7jAh0}?dVl$G=EbhL7Fv{f+&r5~nf5WJI3t`x+4%`k|2Lto0Jf zP=y1}W=gH@IUvXq7&&)(fu{pYu+E{KoZEcgf1UhktxspC;ur*Su3kNYi(K7j)ETZ26>^0^;k6wH{c z>oJFY$J>oBczVw}UwVG`!VLdY%gT37dcqobDS<;i#8TWz>D__uE;r_~zY%voaC314 z|G1OC>DtMw({0`u%m4aZmz?(X`nL~7>6d3-yik^3{?j#$$#Wvp&yBjt54P?Q=en95 zzL$BsYR|c;t2kP}bkzQKHNLN#wrTY&&8I(D86)PrTf4KfS1(}Fw6olIlh{%jGL>Zt z&qy6`T$X)rYMRidW4q@E-dG>Jawh-QXtTQqKfLqsyc7veTpC}o^Rl8-SWHZRWq&Yjm@*T324_pxe-t;ox* zxS856FiW5{ZN-j^l?{J%9u+0rxc&O~)AlD?>~jxBhkX9`er;z+-8l}8n`#N7oX6d5 z1=_D4T*-NaN%6>z#&s?e`v2UKe^qb2X5WLPng4ev&)WCE)%t+8oZWL-qc33>HLi(w zb}$^#Uomgiy@?gV2YA1BmAM9gky+T+B(U=G-`?3jU2g8+HD2lVt%&>EoZQ=-*`}In z!#JX|R`q^jNc&uHbdl39i_>WuC$)CSvEQF8zsvdZgfsQK{H$_ocI`ZJMDqGg$MDO` z1^FFV?tS?9|AN6f?OO_lS9X6CUZOEy$ouud-0Y7M*^JX}ufJKMHvMe=6^0nI#`x{7 zdoRp7aD(%$fUuF)#*G12nV1AkPlj!5E*9=Dnt$oanR+$7n^${(%$>b1L!)Zu&Xq5$ z|7bNHSbDNbEqby`(OjvyJR)oyv_Z5F@5q=Cr*%D`gPXgi#9)}&VL(xYlc@~ z>m36rHZdpm7yr407=z_~uU=eglevZY)yrqL^&j6moVwq&k9TQ*?oLs`iA#K1^&T-Co_7aWh_h`zzMaz5C|!Ig!m1m!3_nKIvlZebA@zl(Rr$ z(5nZ9E-O?!UWy+VUUlkIo6VOv+1wSC{oCEPm)2R$OuZg?UEx&PW7#*`Jvj~sUNFAR z#H2DgXL*|AJS`qAhi<2qm;9br7Mgfmo*BFEy()9TxgB=tMk%kZW-6aEh%ru=Jes2#5rBh!|Q!pt*@Its?2 z(^VcaY2Kc)WQw7awcYNQC%PFzUmF}QX}&N;cYmU>D7)`+OO>w;N%UL^-yJN%pDWdNGQ?!{r+w`A812eZb&I%eJ-l}Q zy^=x}n~E@Rr1r(T`k68(dZMp>wm*@4aZ9d$=*W%A}V&$)2 zDvP$C?IU$7aD}h#J!U_RKgU$g`+96_)|sH{)5g?0amCEL@-8m_*bW?h?w`$I`dN#2 z3g5?Fa~C??)>WFQv1-}%i#-adH%bv+t}F*4+tB3S8%gzXtvul+f7Dp zN4=F#Bg2&fG49l`&yZ@-TVdS~|Wp@@Q3(ud_voi6c3f!^DC!FChDx zsz~b|mV#f>+?wf*KfkR1&QKHLc%P5COI=s(&v`y~mbKh7SmrdYI_bf|zrAOVW#szl zHdD@IyID>v`)(t^czCkvt&j@t8^JHUPV4)y7AiXzi3PJw+~j#utB}{}@#d;~Xa6qP zT&R&7@bd44&M!8W6S|9<^ulCrXma!%zRk=~xOcaFd4`4m%17<%@A^U*!8 zuSiwonTWZvOP}0wLAX?5!XuGon>!8FZm*Wwz9Lf4RkJt5Pbu_!&>;u@%PY5VxV%YW z5O6tA!pPNn^>TI2^^@)?cAu}u{5|+$_y057ub(_}x0#WxU)FVzx=7K7V&Qu>Me}`s z%vvPlzCxUfF~n^DOV9gPI)XMIie7QMl5JUy^Obf@2HUADN15hl#xG?Mb4*!Zw0F_& zpFZ0vO2m&_C%%*7U=lp7^N5Ehq50>b7OSQiM?Bw(=yfu$%3y8O`6zSXX*$bhD{TS4 zonJpE>4-`zpAvFZ(0z4s@^PmQ1+^*DM0Rw1ofW_EnX&Ntsx7~z*i}nHH>XduH5C3d z(}4B*(va!PlAMB`=ow_p{uAWdmXYeD)v$caCYO@1UAtGB)ELa2xJ>-B_opjW(caPz z5;mD^oExn*Kj3JwM?&r;JD{pOOZ=JFCJr`re;^gVm40fC^ z-<`!S)1#VtSXoi~Oije6%oQ?bhLw`&)xprg~Bw8r;t8d`Uk z^eug6Sby&RkJ*u-?r*%6t{4ejQGI--+*PGu<dvKRk4+<%;3^ICU@-jA71shJsULJqo8yA(Ja^S3)SKJmVm_1^Dn@{uL`53}Fj zbxQQRY2%UA{ymim6Sp+PWeDzhQJVkqu5+JNRHufg(bafni|_m7WrEN3eR};zXvvl* zk?~qSRz|T8ILn>1I0cq2n$5N7(U+x)rECsAneM0ld&KqS=Y0G7Z`jMOGOvj~6C%jJ zwlVs_C6>7kEQ}NFCmr6P@v3PK&#z5xCd6c!zI z;OM&JZ=24bvGweqqrUl8KdW|XOU!=7F3`Bvc;ftq#y@Tn+oOt3C#iN^Tm8W{r@`0k z%#qamOjhIQq$x!Yz9`?E7pdn|>F_mO{(ia(o0X$r_P&Swf4f#>&i?6LSHI-l#{217 zQMPM^=e^pOEYW#*wvlcSld@m!{&$?;j;Bbbv)pr8C$Dund)pDSR|jsU*7dbdpQydt zMRT^7bf zm>i$_-S`=o;3P$v%5V-*mV9nUN0GEh>$1vpzr&BG814G0vYKJ(s;8#8`+GD)OFbqQ z$$dEUe|hZO4dz}MVa^Ug{SC$+nC{H{rp8?N;-Yl*^FH2-TZF_rYzoh%?|*p7{NIPi zQ#Pyi`7Q37%~p3;+*16I&ca_yT3aS4xo|C+AR;3CP9*r1{=-N7-y>_eZthe4{LR6y zb7Pmv=_=jTf!E&rdScM&qE}bGi*duBp5KO_8$OkPT&`xb$<{M?W{cF#Ta3LM7{5nZ z$Un++IO=xOQnHzMg2$E56+fp0F4}yxIY`akEF!%tC7a7eXww#dm)}QDE?&FAB=?Te z>gjWe?{D8+_c4F<^=c)@o}CsJa5}I{@Tu6|nRBKnMK`(!PyY8mUNHXL zji5Qau0qLAKGuIZv*WLIstl0_F8=D?HeyQ`jg(a}GX>P(b<778AEQx-FsadTVKlrtOU-fD{n zM%CnJBxGo5|xj9W)F8%zE=chw{UeXsXQ%c&U$sxF)Y0f|6 zim5wK%bf8^+BjwI+}lFUO2#3Tr;q$vD7AH#X+hAYlFd^UF0LwjWO%V|g+@&p+g>f7 zwTl*g*?z13>xa_c^Z$2$wOG9){m-_o`l1}?#8R)_aId{C8n6F>M?$z`QGZyRqW}eE|X!3}8lS=KGtoOglXO-_>%b>0Q zpS|v+f8P5yzuF(K-nCM);F_kB;fX27vWioa?(BVWVb`5Mk_>5aSG;YvC%W6`t?1vx zG}*X-;qK|Tbu8V#yl>7tazL?_A^7X5XV>TNT6guc>scx836=s(7sX$l{q1`K%&U!k+6|B=uFM;S+U%UFZ2)0rmBeJIAa!0XALFV+9I=kHqB+YmW9@4<===m-YXx_CL5aS&rA=|6#vKZ9`G?0`C3n zd-oo(_u3ip|5iz!{hPLxF)gzntyx!ji{YNQo@iu@!PRSdFVC!*^=jL_vOl#9_7C*L zzbxI89U;GV(WVQDr!@swm{#}rHK+<@zW4Ot5?l5DgYoM4^55QT=a?ETnDEz|#g(b= zd*gNoZT1_r3O6|(1?q9$p0WFI{@KpzsQI1hY`OE4<@cZXerguq{&#cUYb<;f8`*Ws zYhKry$W&Xa+=nN3cY1vdGtiLNbSb`Odg02a%K7)E*oW2@{%P(0+xqm^@AK^otwV0K zrWBklTxzk}f=!I^;-!yAGM4w)%$D9TOE*Hn>}5z^I@jdQ1&Vyqi_Dk&urBMjnc`*~ zlyhp5^#4pP6YrpJX4Ou9OJ*9eSn4fW>a^jsj<%1DwfO3p0g{o+J3Ic_Wa_he2X0E6 z9IEdiK68dpZ`0S$t^VDU>(_QM82>6+GucbmEpwHOUSs05{JPCWwma^;HhMU{Xidek z2@gbGd9S^?+UBwT-x!X(ZM;6tOe+@&mawf!nC=)5u=jp`)1;mThPa9#eUILAQI(>c ztxS$h3>y^9Kd>$9esRjiP!NT zogpm1G)Xt(t8q@~$7LtFmTOfhEbrA-J$j9Ksv>{rym#-}e>@C|kBa|ic59W^{}XDf zQ_k}Sn#(9mUBkQP0ox9z4f&moZyxRPPY_FF{&_~JG_Ka`>^yJAs;Yp=YL4?*#8bX& zw>}Ef<67kKX{FH4Mz(iBv$D^8S!}5+6tR*2$l~@y4$Xwd<05)ff<**V^#6qA{z@@X zD0Oc6B%$|sX_l_)^+lfb99&{%dO#hwrW9+nAY^Do0sx<&%b@L(8oK&WSWXu znfB*Rm6EY-`oH&VFS2;^QEbJ9wZhVA&$UFKaFrx0R^~)zUHGTJD=hRQf9i^Iea^s* z;yd$C#JLHoCVHL>QuHa;ntMAYbM}Idtk10{*3C@%933>(WxEF-m+X&nwV4iQFWb+X z;JNi=XWLn>Q$>@f_WTWO5MFia#_nfgE?YbqS zt3}B^Bu-lWc=D57EBzEie1sHy9gcZkUD&uJaGDEi+`hdT>-SeY&%7Z$`|*6;#!Ztg zrA}#IcpS7L!BuIJkLafTQ`5~Pk`}Aq%-PVFz{9@sh|-)Dkqf2>D>?}-E?R45JX3R7 z*%`NKo*c!!4sof+&N$pX+q|8rrdp;pI8b!j^UzEmW1)jNty@bLom%L>a`N%FP0QZ* z-@mhsnS1d`6{}0$RvSIpy|>T(uy?N0lknV^m#^=W|G)d(`urpB-sc)K&g|Z$RK?^_ z`KZ@@!Q#G*#MG0qE*m+m_j0tYDnIpg&!*WoKfh|q7q@fHQ7L(TN?}I(f}5B2?rDy8 zE!W@X5PdD}wwg}X=Z2H!BFiGgRUc11-DHsC&cQdy*QJFwoYlL>z}TN5E$BPPaka3= z8cBx|xPy%=R3p4Ud6@aV1Flb zf5-bjc5mhA&N(u3>0VO`L2URid6*@D8HWxukWvu8=gGR|;`;95LAzbVLrF_*37a`v0N zhZmB|j?J6uv#U2k$U%)QPffke@?RLwoEur!D`7Cds_=!_%?0* zxGv_6S47_?xj9D;B&oW+r>ruJT0p@|ot{A0O*9Ha&G) zxvyiY$kkJiPA)tib~Q>fz%bV)Pkkfr*t7`Y&pBePFaWL;NkEU+71&g{hL+)_Ehl8rCu76 z5e4@j^OojkZ2K{ZVNH+sd3V|JoU4&_YaeeeSzNW>{eWF^xKhOTjzbP!;@c1LW!EPFWn!jqCB9;DQ z%NH0)iTN&-|GD_Jv-Nt(Ia2O99{aZFZs-Z}PLUHkdbaf6_4|3Z52aUmKU(_C_3s&% zuU&tORfQ@N7yQ~|S6!hPox6U9B5S9)?*coP7fbpoZ^~_afA=qEsr523Ukk@TqC{C#^Ud9?Us9TYd)v;E}o^z@bwXA{U7tXH!Y{<^lsj&$oF*T^rI^T=kDZb zsQmEou;SrXcB|V8pAWE#NV;f?w|KY-zu@jTdwPN3n*$vyv|ef)InT$q?~=dvBBuH3 z_n6&}$o>!$bSh1goKrm2#wo|o>WJH&_3S+FX2-XR9A#0lJ3U2d)yaEPwq51D(($=@ z-46GDMt-4Zx6dB-WC{DaA@q!zP1%FIYCl7j;2Ew5%|tB4H+JMm3h>124p@4=+TvcA zY}=#vdTJ-QXJ7Rx2*`O^AHujc`M_=Q?yrU3GOyTY{(t;e>|^8AC z!V{J;@oVI`v_4_ErJeS$AYJF~#e~xTXPiN zt@bu_@R3MxDZRyG;1y=O<(}FSo#}Ud9~htZn!0V?C7A~`#Tx2tS9ka=IS~B8CFg|ulimQvuQRu`Gw^oKQ`-8n?)`k( z3(N-?!X9-RG&5*1X{npeHdvM*I45i3HjO)f%&^?|fF)-`!aXIv8t*=Iw2aF}B=h$9 zFPFD&nif5OwNk`x8R1K%5>MAfcurw=^!ppma;QLd?&%5Ni%oPkCRhE8f4#KibEe-l zeoL;Eb^DDs%00UN@BWj7TBb|0qxNoo@n+5X-3(XWS<1{T*=rns(dTUE56}Ll^b^9D z%!QZ^b-s+TTfT43?}bbb0*9XLyVSv-D`RaW{X-;);gGU+duwm@>PBbRWxsr$*ZE1u zozF^lUvZdYkw^R@ZpAChZ<&;Fg};0n&3EC8;46h$&-Xq28G38BYxa#>5g-3Cb4h)R zSs`}z#sy)CAGYF2Hy{1=?B1z5CCkouo6}cmeY>jfJ*9gE*nW6yY1=T{KAZjB#S7_L z%=WegpVegVmfhXr`SR4^R~uKfzr7|}Y4M*~Z}VS{LTANR3yalNXRcW$FO%5i$d=}J zx7cD*!qUavlO{SupE`X%Qqq6Ih9#m2WmDuo>|}ZHXfT!udHom|k_rnw3toQ=nITfS;bUmv-j0AH zieHZ1=6~IOcdE38tm3EGoR~A$SWm3m8JltCyilFuo;AOW`@1{j3ib;wGOb|vvdQ#U ztNz>%Plc+aj=RS@z2W%4Ej7)8g~i~}-kcp8;+wRY*nhFfe~d6Psr$Mq|5q(Oa)UxP;V`!|{CEo6!lcEI|`QPeG zX~*uVjTC2Aa&Ilj|FYQVomTN-vCw+qXXzaBJ=xJyrXNU4`f$v>Oe3ifv>NbF$VbJ&LAyLbWn4C61nhH(b+7Ml(>Ha-pgyC=SC|N8sd zv+l3WR1-@Lc0ZVV_i28W#!)*p1uMbJu`FN1|9+0YqIXt3a;M#&D=*mVMETq9$Vu;b zCHbX%i}XpyJ$w@FB^rl6x&5@?F>#UV-f~_EsW0;Dv-j&?2&$jxnW!;Sgn^%R%Eo|L zo3Cxr%u4JrDuykJpJb=yJ*<$wa-!C;N5EZYmaJaXg&j*+te1+ZM;QFr(Z}~~={&uK zF*&eyo`U@p4+`NBg*_RdEeaz)N4O!`mqBH9k>F=~Ft9!Nd=ox?B zdor)yRIFCAS7Um?Yg+gB{=^f%&#CA?6TT?O%Cjr}$%2W;S%o)V{A(@~Vfp8Pk>Y|B z4j$b(FTQVG-=1IU;2`_6rsX4t;f0V#?;3@-=u|CePU~P~_1nNvrp&g-;lUw^KU#}x zSp9eoUi`fJScmelbmuiUkKMU0xIVD)QCxKS`ga?bbZFc!YsO`WA*?1 z^pE9jv!6za&9v~2P5S&WT(16kL2Qg6f8<~9x*)!DJJxTTQX{lVas7hUH;MM*zE)z^ zm)}|cd~s{;@sP5EiyOlh2%6c)CaLUTFXlRR#CMMqN8^*ZzYcU9)lbpCcCCm#{h_Bp z;i?k{nPsjuUV?0Y2_0JGyVSN1J>h}#Y$0B}w$O&OM&oSk6r|N~Z zcjvO&nS5z*XXtypp1D0C+U>(DmPnm1N4=`|iB_$OYn*=Orq#Xcy6=`(Yx%`*{nwut zBYsum%j;)Px4g{l=H%GrpE2EIrM{f6jHcP^?)KluU1IMYSpM^Bg5#|@Q8u4aEoGT3 zm@EbQEEajSFsv^B^JMpaCYh9yWc|d~Zx@`OIK!=>C*X+tgo8UuR_{8VsiE}X+)M87 z98GKAN9Zx{H&lw@J9YU`qr@}0LPi#MefI(m2K5gQvg99rZD`*ty)kirVVO{3<-?8A z%XS2nbX02zoxN7VdsVq@o!ED$$uC{wV#MpL?tUwrIjwVN`LkWmKUrRB5jgl#$;IXR z{$TOz4qprQSFp7c89~d7>a8n1f4)Z&K^?o{W^grfX%7*>V2# zadbHAsd9eB1&Jz8Ze?cQbmuoTGtp)K%*z(b4~0MY?|1I}J=y2A zEeWR$_>L+xWpq3>l9(HOPxfecs*BEa1FM586A%19+`L+8n)o~AhdUULTFE+1xz53J zp(sVCxtsg@0o#Z}t$O!nJk^&tyWVIAL&xG|*X?JH>{jOGnsfNVcgfsGyCx`0fYnO+O=iaRH{ur^5v%KxDe7AT# zvzh$iZF@G`{+pP8#b4;h6BQ8-wNrCBm)%HL>)Sr_uAu{GxpPRgmC=giiLu8{)dj5b z?(^PLy+7krz?qKEg@Vqp&MndgT8%d@NeQhzJxy?CfD@z6?&c(&=o@aCJRMidSX31_ zQgwPuH-0ONo~3)wUX*9jBj=y>Y8FQGIz-A`GK?lUirti|Kkxef>gmpm!s`jiCrTY1 zPrX!F+qq8dp4sI0FtXH?SNR{w!AG>Ns!0nUV_Bo5y+pC`;oPF4PqU3hSrzZ3H?e+Q@Tlu_jAhw2 zzp38$Q-XqzU3T$xRXeleds3O%D~DOSh7Xk!B>3e@Bx3|4dpISp&DWcuH2K=(fCP@s zyZ(PQ&Wf~5pU*RMhHCb1)9kJV3X{@WB8&?3Zni9`dHW|rEzaa+@#E7aTwK{p-st~U z-@ngjkxbWG`6(p=+2%dFud~WJF3yf$)VI`g#qKkuN5yyZ|A?GkR)6u2_e%{PwtYJM zWlz`Kmi+js{P^|e%EBCT;&Z{ZQZrs|USEO*oj`J$dlanQ>t6#AG zh}@H*-?J*}Wx3FaH*X%=3ja2f?48}G^s{mwBQ9TX;JCJ`YMB%J?q`ne zZVQV(HbyQhv(}7zHN(fR)Pes@@)mIxUa=VQDNgK3Q4hYnUK^OZ|CVIEf6Pba*gfLA zzW!UwYi#oEhQo^F=&uJw?R_@*d)8_fET4W-J#tb?qEt)4!O7t*0&Yt8cuI@BnPy*L zk(%Lg<-~%zXVIBr9cnXTR9g(h)%R`+eER%pGv|sVIVOWuGZkeHS@?P#5@1bRZ6vZV z%Pq%LMD+Elj?9f#9UqSSbG9$YoqNDh?Pka4_F12<{`BJRRFEk2GydF{@$UiI7MtEvw7RxP`J#k=Y0uO}KD=RbAbRFlj1dj9sM4Qug*)P0Y> zo_Wo&eP79~ttO%klJ^d*eZ=-AB;)hT4Z??KUuQb0QsV!}HONv_#>S5$(#ikf!8uVc zQoaT{n5TP}f6o*5d%w#I%RM*b_j6Sz>_ha8ldwsmT0$IA6h%H%kt+O#l8q zYUfh+so%rviX={G^KF&8b9INKyEVfmrz7FlH~Dc~s9Vu`c%RVkS6j5dPm|;|4zrb6 z(f)7Wy+)H1A!o<-BE4qSyxZ|E~i36}Dby zbU#qX?%SRp$}A_p;b_m-1>Ut_ufA@OHHq3EUM*PQ!;5n{-?(t zhMFe|+Vywah1EaT{};nxx52lb(MY!K-ySd4*1DP#Yo2b}|E4Oh%^=Ll^zXy-asQfF zc6jwDwwEf-jd{5+he;^!nOC;b#B~B0O^2Q8XL`)PSEta`%dMJdcWUAeb@K$7?{n*> z{hi(`{OVY*ORxG;`5E1hH*yDACHX6?S)k6v`1iBPL*{pU0#8@T+OR&7ba~TR-<0gm zA;$r*3LgaU8?8qGi~v&xq@k0hglNT5|T7`J`25kXf2PZZ>pf2 zor9JVlciwN#97IX8au)l`DP~=TbF!JygubXXnswTLsgXV)t4K16-pgL3~dTaa?~{! zRTsD~2rAcG6nN{52!pw9!_pZnmmdAnf78Wt_Y~KSHJ?jdo!r!!7B4x@qr`LST+;pa zi3eO?@a%B@waoSNtN+K%uk{#B?3&3qtDcG1@ODnd_w2MY-KjnIE*;zJxUo+Dc$lT< zHM2hz7vJTxD;%A4ui<)~ugH6@3x)f?Ka{f;OI&^UrOYkK=l9;2>#ks|>!{V{^i*gM zUjH_JX8?cb&1eA$_r3LJbnl*?z<;XYcit{jCcgfx4>o3)H(yf>cI%5@i! z-r&Tpbht>M!$ZVIv%i34h4Y(J=Nj)GWZlBiz5a<8kA#A?^9;oYOr8ad5+^<1McQyn zy_&9c|K4NO*Ckg^3og93`=(ABw|${xjKGvG{-b*%*GqPv^_=x(-GVoX8-;b8w#5Fl z=$iA%D|AiZ5_2!p`zsb3CfxY@cgv$kPRz4kEHMl`x7|+XgYQdCw>7J@wys<&@xk$V z&U?)X5sThUSn~AzT&~ielj8QiIr*4r-TIR9ll!)ofBPE9J@Lq|qB~RHZm2Nd;3-?V z($srPp<}cx=gx!7<)^LMgNj~;tIK~mf7tln;t9tK8V~fHoIL#`fBnBw_2rSN{C8YT zrW(FkGvREbqo{A?i*vKDP2YPk{D8>zr+&(_7ibhs@xRKvr=cq^&gN12j>QfvhaYeF zao)bP#%Gu5@1Nh#`q%a6ADL00lHK&eakaSFlsMtL%lb<@oB~rTrnKrV`4OEI8u_+- z=?%#)TYaIM?|;rU=he0{-uT`(F)d+k_*|cT1=Er|ZD!m&dTm|GtFsKQCQAhqc%2W< zzjZ;Tt!}fndAj!HoNouhthWZasJ~?|pY+Q~u0bVm!pgXU64~-C6&;R??JI6~hN~(} z;S&1Ybm`ZvB-RM4y%{WX-d!_qZ?t4x@kMT?YU(9c{+x9NsUm_bK68oZApvC*THly>rsltJd@%=0g9+e06OO|!s{n4=J zL~B9E(yg`L?0jBJ7adsqZu-nKF-xZxJPnb*)%B&#?yHMd(Ylj5n$24M{9gleX8Y@l zJi3^ueIw`J{X;tCoLzpuZcUrDrF`DXGLIP?cMGaRg!l2r5p9TFF$|O zf1~+#+K%b^snZ06`LpXaB)%pj9WgM`5}UcHQ|a*8i*3&ukMh0#erjz_#**oLDiajq z6`c<(J*4O?=`FUituMR%Q>5?`rxiUc?OzXj3R=%)5-9Ju-qN)vO3l3f^ZM(Wyy7!d zXPy1cw!vuL_v@|OzWW`q)j7)=@A*|Z!6$FM7w@uLUb`Z`?2Ej@ol>?TN&E4ab0U+? zthTWeg2enNm`a~MGRM+SL3dkE=o~xLaTS%IJnN2^wDtL{J{5u>IvCj9ie7I zmMTft!>%3A`6FPEuY2j#1fj+aDckIy2rrsj_Qwg=uxV#de6(L_R1~~9kpdorNb7vO;v93ydQbs%8Sz3 z7ve3VC;8;+MDLv^a7ri5v*63Z@`r!)OGDoMXYJDFdHiW<<)^Ppb~>%^%8)rY_XvY! zL9oxBdDA2qcSvE^Of`MRUNIj=Nrx=^WnT; zt9-X*M#uF3ll`)nMy9ZM37KsD`)Y>i+Q_#I4|m^^xo^$!EhMeCBlq^fMZv4KpHSa_ zb9I=7xVz@#yJ;U^N~+|(+Zy=huz$`|57(m~+kN&}>KvFFk#{X{o7Ci_7k4A%w_iTw zaOT^gMfZOzudzL5oT#y{>*LQ028VCf|MQm<_bF`bIjTQ>l9h>QUa#zyG{Nu}hu?kO zsy!jeDI{s8_sPi83u`ow?`27dQ&U@XRWdVNzaS^iPU7TD$7Qp)cXv*kU@bB8`dvA7 zpB#gI!tK9Ax6d`0xGD0_?K>e3oeUFo4*K5s#>RAX*9je=v|qv;Tyu`fZd%b$xVLy> z49og+N7h(-^KyILuGT+1GwAQ#uacYhtxo;1TIfr9(Z=1j+U1oCYdy?U7Ee$1zp~)= ziIneYHeTZWE{clBj9!08J^TCf+HVRh|5xl>&z^tnT1(*e-7P1&USu;LZVZbp)$9JZ zOjGEm|8BpS%L=~t?7udPii$4pSmKhtYnMQ2nrP@P?bIy=jOV2HdhJiTSZY=2wOGLO zf*ossQChlN$Nn$xKIeTt-)C=LxXAz7EPn}sT)yI;H#c%M zpJv|SzbWb&Zy_iTM??=^;%IqmW(3l*Jt z$wOx9N)g#zj-qm0T=^#_C$4;?-2U%@IaB& zS?vC-_YN&SZ^0ZA# z^~oJELjL=`-aPgVxl`g=nYs46m}-gpufSPWB0fzCE6Q92lsCA@{5=qg*Db^s5K6l6a_bLKWNOm-qiaXyN9*x0I)R`==)39??+uLrdI$ z$8@Gg-MP9dU1g8^(iwVkuYRt*)z|5j;{C{M;pb;P&Nm{WCPYqPxGSpp_@Wz|_0m&+ z53dtH$$hnFQfP$B6n8GO($(hM&Zg#YhB(f-SM!5SUiMUp{#9<{lD^KPyG>vAGx zhQiHTrw=CGu3ENb61#9$gl_Qe0BzSpI@aB}9~rBd_x)VuCK|lNNcG4qkHvOY(}cS? zJr1O8x$#DfP< z1C+L3JeeGr5@F%EqU*AdqQolM!@3MxA23;e2|pvZk8SJqZ5s1`es7HKENa_hz-qTp z${}l(=gt)iO(X=SE`Gbf{L1eflPA7cd|znUircJ;R?%efw3uiWHi2uk_}LG+b6y$6 z@W~ioYmHu_#$UbDT*w$kP z_m9psNpZDw*xJ48IGcIO#s&*d;iD?vV!wa#>Vz77(@@-YYW}6%RX>;LMNG51b*<>R zrpL97f0ZH{Cu~S5eKGl{rJY&&Pp-d;a~al5c>JmUruItbn^|2vzxFn)ayTA7P3w4q z7?;~#)6@I>W51n|W6_uxn`*z8MU9L5@Un)fcE*8569wjSKHtLV8>lv0sYmb4(JNu1 zr#Y27wza8h^$K({m8uWIE){Sm z^157qYqny=i8PVpDw5B-FX!k7T}*xv=Ekx})#>?@V?Dn^HKJ1!kBdBsW8?dHQoCDD zYZlkq8C9Eq9e96u+Czb)w`raeLjKN<{QCBZpntBou3o_Y38nOEhU|K5o?wzbfyZta`zD1q3DozMDA|gJJaePav|q3 zepQrl?sR$KW$~%+%>yPy$!60#M;zO4YKinLJsCWq|54G&h#EC}o=2v_eX-#c2LH?+(wklL~`MP4<5NXq&i`vTZ)?v>NpI=B zFk^1cCQpYDo&HMJ`*Zj0^h|#8*Q#iz@!WU*FYj)yUod^@Dz2_ICrh~3h{W%IcXqZ- z9QUf;i4#{JdZKY4utOv2^JA~+o2S=rdV9NWV*Tx1-JIqxU(`)$czI!^%hoU2thMW{ zA4RZrPs!Q(e#N)2c@k+!v(>Dh8H+vGFTGW!|ij2~KN0B`D4LpyTx6=U4w8@Rf7Q{h$+mqV3rR6%lTRcCO`< zypE-CbWd%4q|K$Ns2X*R5Woa zU(ccmuXP{&XPj~H{J-nF6#pElQP<9SHTAmwC(R1~TBALs>m}HptYKLsniTiE``U^m z^$^bpC%a_P&^?J`ut5$6J_-FCnxm?|GEiav|w(gJD?(pH)4-pI9%PRj$MJ0Oq zJ-KTcVt3bQ2CZOjUaM@pQ1fv2?CF9hMGoERUXnWRr1_Q$Ne&BRFI=4#aQl6Dpm&FY zr{hYgq}AqICg?~m+y1}H`16rPvU_io@uzue2w&=m?Xh~V_j*&C%Gq&t8S(@mMTD|U)cDqNc8s{MUZbiIqe?)Iq4KAvE%W%6oAiF5D?K(At|*^FE=z=^Sg-JPwkUL5F}JW- z?vr-yOK4Z~QRQnZkKOA!zh{pSYmrp}yTAS##Z{lCy(w!l<_q(Vsk!mWde4;~wFj7# zpB6;lHNAdrW%AUcKMF0{eA_>~*`OPFsnvJS^X!M^jx#n)y5Dv7`rQwOrXMF*{tnyc z^x2S)!P_eM{`X$?1!tsh&f33s@0YFLZq1spWvOfIO?STEGp_aryD-f>p(VVf+Q4gS z=vB|Y9ZYsb|Jh$Xu9ZkUVW#|dmGIJ?%Ns@dt@@w8zvXDM?}W2gs%yAf%EG-r|L@aX zEC1)fWw9q}Dl-jICM|0JlBN7XaOsJOA`w4beeN@z>U^0X^Xfl;L)4)MzUqwGF|~Uo zxA~pbOXF=4naXUsExNCpv1Gx^bTP%3KXlndt|U2C=gR&wJ&>PQ_x{s%p3Q%MExTI$ zkN@@7$JQJ^9ig9Z#O@Kf%e%~anw$A=cK?O{GSZ*CJ{uj=Y4rbX!r@)~zfQdVbXi8J zRcF@f>O;R*oZ9q6iSPeo^U6)X?O#Y;-F{;yEl@4fFoI(}LC zTjmmj@P(KKy90?xv^b z!F>zuZaV9vx2g#@H#I$1%>A)XUi#vb6IsS(eVTDX_Zn8$O)|a_ z^wLz+TS=3%Fnnr5lU>2t*CLGxDehUu+h5mBeK*r|`wQ_Pqr&FLk6NS-9{t6vcqKQ< zf=AQBfxCez!tdIz(wmomZJxjRrP=NdM~zu01TB*D#InH^Kk3WBJul}*WmgTBgnk@IC8)9rT*1J?NNo-Kayu0JViOF}k3jY)= zY))EJJxeBkUDKYD4GpP2bF*K>SnuUtk;S1EVH0B;q$9N0h3n?Gl}l!uI;@z`d-TSV zujhRqG3_aC;W+MEBJF6>d^2k1#a;h`Z@+%%|Nme9`uu;!b?>*QeA++VH9w?NFoRhx z=cJB*?z4yd`BC;>3%l#iJ&vth#$aQ7?#JHCr@viqp8Lcv!-b>&aqb^ChP(dx-su}S z7&XLhDHjH{ak7P3)SaIFeP-f<*D0ZGp$xlue_nH6x$N4!t;{7j&%F&3W6}82l&yZpm6r(=}%<*FTw6Zf_ek zx%aic-}GIGa5z}B7l3BR1v%2`jvkPYmy>*GL_^f>n2Tz^(=V%?^#!v+o{T~5FP`OJ1a`3$K8)#&F;#iU${Cqgn8foOB1T= zR{zV`_2sk9=2l%zRv)27mm=8&8G9`E{MpzY@?qn>4KhwuGp?1sIlHb-{2PN9Y`l zRT7-}=;YLMyMo`|nc%Qw!lR9<%xN44;XivEM&C z-!(ly@nqs&_2ASW3A66zO)_E)jk%k={q?he);(WdY_#9YyUVC5t5WFa<``e{<+d`wOmh)0|mfb#RS7vo; zQSin2U#HEOed88O@7dxbid=8I?lmwMCQVzOD8D&Jwz}nb^RtTh_kS5DT{`z$^XdDT z^u{wDnJVk<&b*s3sZxdO;^Zw!0b7<|^ZjJ3yWSUO$& z+B0Drmn&invFT+cl9{{oB(3HiPrrI@@%!^?9U(04WoL{g3LB`hD0J8}gsEiDu*&GY zrS;-=NaE`<7K5U@3#nc*ZNK|6kFKj>3e8G=>6H*;?7du{n3Rx88p*EOcoSt z2VFWSnq-i&bwk}Az8ek-FE^OC*E>}&o~^rmwYJZG+o%l9Zw)iPsJ1Yd6h0IY;fYvR zzI$z9$f{kdHrIYWE2;Zrm5&1eo3m zE(h5z#=vP)G>(0cWLSIpTDtd!;F9?BGkw?#J7zje{$1nv(1mM7!Dmm-MHi-8>|7$_ z^!(7nQumdLC4tU%iG7(WE{m_O^^r(DAh2m`B=cp42xq3wZr>*}nbJhtN^;LnTg@C6 zKG*PY&-5wt{cLy7+jKeMd(f*gX{kb`_sImCPo%%>YQ~dyWQgDd@w;bA;@1#hR^7Uj7;NFi@#N0zin7i z5|Qoqz-qCZ70aS$MTgy5=hFj9a}HVETUfGhxi`zw>A@Q!8RY~w zuTCfnPRso9@&7@Q=W7D{-e|F2Usv<3-i6_qkcB7XUGHf-oG)$RC{nq)-sNNEy+^+P zPba7-ES$FDYwYCt3G27L^G-YNx;E|W`CqU1Th6$Vt@KAdMNm@2wRHihC%v@;DT)R8I`>wI|F8-9DSy8g|iR@`aS8|F{GWcO?J5*3P9A$nkmt^WXAU?QvVq_cbMd zIkme#-TCOPQ-Q7z7dEM!Ke+6^bH#(plCK2oZiOE?VS4q*VoOD4kqz&p_Z~6`ku-7@ z-T31Dls&?w9C_aa*TzZA#B2>u(FHUM@YUdjIi(tuc#K6+*<4Y7YII z`gPgS|K+*m7Jaw(NJ#NnC8N%+Rq_sJ7Fn{DkmzWG&y8r&{^zQ*wSqW!3Ya+W+bJ-!2B7 z4^zr3ow(PpIe2Krcg;-Eea&eT%V#V&xOy#L zc#Lb6lLc#xd%@$}G$x%BO{q@PU(Yf*Ed9uO#w#z5?37b&pL^aoZScLVz3r%j<)Y>5 zt9~^EU1*w=@zhW?BloE6jVDU{#_Uj1`!EujE*={l3Rk@rf zGHXsjP|AXXY`r&3bf-8TjBTFzu(3HP_WG6Q zk}g+_0zGvmnAk3#+G5@&{^0Ru&8aJc13&Q?a6ezc%O1iwS55tp=MuXB7TH&mUp~Xy;jX-&aVSlyLc0` z*m%9Z79C!=$0(8Od&>U5=fC|*pC*=m(~7w0k>tNB!C0;eQwGVm9Wk+A`(;i}QcFZ^xea zTN_V_r&#PU$8`d7JJiClNG-A)w zA8%U{=42EXbsEGmyL`^vJ})HM!r_6-Y=?gKrxi;3zU#+ZR_o1(E0Wk<_i)~nU(z*y z{>h1Ge=mgtqnyHY1Av88)WI5O!(ZkY$e`WNetrkMS#F11P&^Qm5{{Gjnd z(r*FHBwwe%@5vun;=WuF6*yn;V)bRuX(_ti-|BX(`k49U*ao)^7mYtGZA{)Ks&QbN z7`s^LbUWTm7I&^V^=Wzb2TY`#BCqT&K4_z)!Pw7zPx_goQQXa6=Z@@-^Si>g_sr6M z(}lN%|0>Ae)(Yld7#yytFU%Q~;lounso?hpwyE45ll%=IYzPc6S)crK^1p-ezr_|` z6`Ys$OmyLv6E7P)`J9DoEmsPQ?tLv#kz1w4{x{%ks!bcKN8F~P#ithBlSpyMaA93P zL!jkcbm;M)-C5ceGY}c_hDTBfN#Yz zH|aQ2MF)Y4cjkz?sJ`7X-DcP4&37Gj&z!Nj9wEgv-(!wh-rc05)kmxs@Rp=rIyrla zkFFEjX*Pv|U$$1~vVR^ka8}s9;_jyG4#7k5&YBMxS0|HDIxd#&MzCT?_sP z=Dt7CbNdI6=Ko*o|8C8U|CzDXDcMSM#dFRNGYa^>-fD5lcodfF|9pax=afpWgrD<2 zWPa%lPKEHgh^s#EEp-pV?`v#HEL2>JC(iELq7la9RtznF` zyK=1Xgp8s{XP@3necRIQYF@IpHtsj)*tC^ruF8S~N$Fxd-+$@&upD_LTe$K2B7^gP z(i!%-tS|f?`~Tnz8!P!M-R&k_j4~{x4;t-w3YXrf`miNVF!)VqL1wb}%TqJE4rb>1 z-%xJ&RbA(@En1;EGx1fbmw#9IMAwa%AF{E$=@(fRrC}s%AT(uFZQvZCiFuFQD}@tM ze{kitO%1>Eovq+h?q6=@8ydWC&9bs)wB1|$V5?sDl?2Z1cT8K8jpsPJ6ytf&AyV}Ip^A>s*|Fvyx89FHVW+LK2+M~ zdA|7iyUK0uRdUL`LG@=RT&+E9_ES=l(R{P6%et%D_C2|FOJ{3yF?L!c{_0U!T70_k zg*oH1YL`=z-+Ck&;vU4T&zo+_shPR(pz^fyTxvg*g^T7N+Hw7hhwcFlskJGq<*%Pw zV)@8S^NgR`{YPKF@UAQ`fB5bp$7`pKpL@#rtA4TbdnKJ|m}uH?Z->*=aM@o1pyx>%v$BhKTeu1ab>Cy@%Sb#mm$zWcnlmTPR9z}|Ilp^i`d_uz+oqc;PhNLj z>Z9HZ#gAFDp&?Oqo~Zew8|Di{ z+NV0bovHhE{RyUmlRR~Dp2_mnU-gbn=n9$6)@kPMp>}MGvL&Ze#HIf?cPX%mL@skJ z6Mc{sHLJ+2G;ZPE|J*fqZomHcMW=YJVydRq&zRu*FUqdO0T!U0dIjpAfK+H?ljSr~9TuLN1fPVcp9~3OHyzZ32CAN(v`sLy3Fuv_8SDMayzHC{Xw^}^YX~~50 z6@g5mx)a!yE}uNGkWX!{mALSkB+gfxp3YIer(?cPH7)4o@A(WL%);)>;9@&CDP`Bk zjjQ%goZ&J5MTT+cu?Z?Yvy*)IHspwj=Dugr`C}UY!{Vt7XmzU1sTb$;w@M&$aHf>*VLmN2j|5;HIkgNK`pF?=z}|7n?6$M3yGh##nVHli-$Mo&)a{S z=S-6w!|eSI3$k6N*9Nq|$r9q;^{{`}&w|P6iwsk| z_k`|zVRgZ~hcV$~MTOnAtZ)hax- zW%}}rB~_dAjhB1vcoXga_ga2_{sW_Pe(w^h)?coS+4S`S=d(#4I`3*|tX6OOQHOjO#%{@}~H1C!U!{TFrp<-*l9ulK)T)L=Amx^C^k6Ex#xi{6S!hxa;e zxmb9A-i?q`TW@UW_kDeGd9L?5&)abiMf-oT>ireWTF`ktbCK4C9Ukkqwls=Vu3Yd& zL8FZ_YZs>$J}8x$5O?Xs zcNX6e(FdyML;RM@XNV-No1oX@9nj*>;@r}|czySS!^d{4mwn!RuV1QwzF(=SOmmT<=Hha>6SgaaZeCn+ zJbp2^l7UxR`P2^=_lE0uo;{nxY1UOm}^VfRnPhSTrA8^33|@Vu*Mg1Gm?yE-oxhR6CSH$O9rdn|C^ zH$(oaXWKvC`7vpG^_debMj8pbSp%(1r=30bsw7%(UE410{?$rXuKm8(psFG>i!;$_ zLch~Z2Z^(W;$9K&oGLUfR48BDdLf^axj=K*i}mhp>lVFNxH<8Lnzfk8LcylPe;0TO zwMBO@GV`jn*fyVhbdFPJ-@E?GAH2)wZ{IU{W|7@Jy*QoccTZZo-I+Ok*({fLd-Npd zPcT!cb^3Eibb@e4tAq0WWpC!>G{0(iadIBZ1%+AXrUpA5NS&#DD82#wcP+~m)*Yli6$hNa?rSH{}^Sh7y-!c^_! zhn7z9Ib_(RdGE8v*S8{jqZ(&bu`kcanG_$x)64zv@rj~OpE{SWI~g3u?<@WMt+;RI z#HDYOf>V?v^*)HUaV$A#s1@8^<83B%GPGOD@$KTatBRlJeXo3dxc^k2!I_?-+ltHu zmi&<~Jg)~#@v>QVJwH%)hVY{H6Vos4+J5<2=!8?-HoU(5FhV3_W9rc@6`{$MXC+0G zw=ZlHlG(|@Ib+}SsfNtLsihaa-c_xgS81!i)o7aj^JDok>%AiaodR~9WR0zR{P_9q zQ~u(yx1R@xD?jvlx8ii`df8(pCt2dR8=aTD+E&o&qmiI-f0w-f9s{leudP!5B_A`@ z{Mu9gOg;1Bb_?Cd8S<@fZWM4{Z{hS<)F6E2h?Fa%dk=3wvtodBeAqFG#C6sBJF2SI z9o_hYZKj~FV*GP=apyq3>Y8x1Rc5Qt^A_r^lAN-@_yhOtrOTQE3QArro%zEga6|ao z9mii5%;C$n$T%xmKP$grM^MBj|7p>OSr`{42%OOjnpSekDLnJy6qzepRWIMQ{grJ0 z@+DpU)29zk@s)>McYRsex7^>_NwYM$#PsOrxtG=)o!a%btK7})a~UosOu_1V6gZNrV(rM3LG zGlE@sG)wxE5AS5}7f5&7SEAWFTSP$JZ6Ety^#{vBog*KWHgxOnsGD1Ku0rzR(+t%; zN6HT=dazvBU-_3q(dJgjnnj;8uI|zCzWB4`k7NIG+bL5fKEGn?REm{2XO_k!KTRArG z7EPT|e{hM8{=s?-$>zx)wXRD}Busm6;P_z2G5ljILtHRsV^s znZlumOJ;|MpGhZc>SE}Ux)szxNlnkn_-*RTFX!t#w@S=AJ3@9~EH2B=zkj=HYri_3zbP4HBcv$JWnnnAA^2p`_h1H( zwbR2p<8r)IqFy{|VO-)MUixxgMj(IguY#&r(vpyz%6N zTQA;C`gY;R0iFYKo*va(er4Dk?YyEH(&4nG+wBPRR|5ly&i-{4b1Ovx71XRVQx1G) z*lu35ZqK|^FWBT(75pgVTzy*WQjec%*hcjL#aoQ(Y=x2KHk0#RMGcw)rtrS}mc%T2 zZ>`-F^{LTnuE?8Wj6g)Nj2Wbyt*}av>q^TTz}`0l=t4O&5kDzin#YH|6c5f@yd%`e0Iu|ujaou3sqR?cytwomFdbT zaYQ);^Pb%ECP2h`sug3S=^N>3H%i`o>`Ktc+&4j|#2TxiR?pt(&?tIKPH{P1!T?okM@u?8ABcnF?~lGqs=d6@Hwy z$!(!bd!UkJ_r#X`jjbF9oix1}eyUCX?qz4FX(SMMqK#E#f{9^(^UJHBTfN$vb_MVW z<#Imu3kW)NDb;(GhWG5=5+Bdy2QwzIl_)u~yv@G9?cGfAXS>{7V@)r?7Uixo0$-h`-@%dg@o-5X(A zl_s;!%~D3sVE6UkMV23KIpiM^ICP-xTiyignT{$QA^UeMSv{}oPR>zRsYd_SGw-h@ zzPl}>q`O2>=l#yrEOS~y0=|BEp_i%Eb;w&&;K17GhIQ-Kt($iJLfpzFe6B4WXQ#3X zi%sHE&#c)eTav0o;pBya9yyEP|uNP7l z?SENbfAy>zkND0E@e6N7&dRM6fl9^yUSzu?TVde7op_A1tL_+3H_~&PLJHL0S z{dyaR=jXy1*Bh7z&p0MvoDy%GHR<$brx|=NYxg*7u8`dFd83#8!L4WI)=#~&?cVM7 zZ*}_dn@&5Y>+rXhh;3-PegFI8i>mSZr+5z2DEBamrBAROZy_)T^pSA2_+#IS-3p{ku>8K;nXBr_vtH zy2a~L7FagtbXVnruC(TLo4r_M@5rrC*EjvOV8IoYgqR&_66t>u$M}YaJsH zskB~d=eXe~&!&HVNHa z#%3wHecfS}!;Tg)FWcA7(G=Pp7PbGLl*9b6p1+RYH!B@I*S6@_MqzekbJ-@Q8?UA= zUzv98{*ra&AzeJ4It-$|5i7f@TzzloHCNtyw&nM=*S98|C^hDN@#CR9kKrwC?xSZf zTP~XRIPlA_wJP#TtHQlBq{|~_`!Tr-EZ}QhW22;>FT?YgpS5O<^A@w|Dvn(%uC%sW zf9jfF_vm;-d~eO`$mgeWK0YWvpZ=dTwvaeH^J{Carfx{D5(VcFXA&K!6@XIEZoxG`K8b*ZG<@Tsr0V5rxx;G z=bun(-!I1%QrGmuD&1gd3mx%AyRo-P5+wO3?SQM37V_m=g{+Fz~x9hxgPHk9u#;UcG(>zBgIx;uD*FL6lXI=L$ z|IMpeGB`LQ8z!D8@zjjHBbFQ*K%W@I8y+A`^-s@M<`*`;s zR_Fh7tuX5TqP^#qwZ8s(XtgeXtoa?M|JUq4t32KR9tSy^Jd=Ve;hG+n=jv+ zeldoykkVhv|Lk>~=)u6VDEQUUWJON4O^g>s_E*iwn7qm-?fSYpv)k8iJ~RKCGU08x z!HTF%%PtXLAyzeCTVcyS<%!mZYF8R`lqx0(c;p;cT(g?dZL1mQibr$04rts6TUYb% zlf?l|-Ov5=wygMm;$cLZ_|jD|UsHtdsLq^Id{cc*(EkJSb6>Ad`2GB??SEf6tL(15 zj$KQ84g^~6XNa4$qQfO|#l+q`uP yy_uE6PQdEnmhTlrP~FqFIw2+I6HXKq3QpA zmu`~IcHie5y6|tr&XtEeWLL+se}A)DdjGkn-CtW|JM3NrlwKG8)jOrCcdl{Js!2VQ zw3Kwe3Os(O;mY#G_u~4m0mo9Nw8U7S&1Bs1vj4WyoY^iq@gCb3%wn)y#Njzvt?1X$ z4-+dGN{@89%xAi9u&708may278Mmx9%{*zlNLM*w_x#5p*EW8*EpJyVmaz0ncI7?m z_PM%w|3mJz@4vrTUgwVLykpDSIRYCW@z}*pu1d`0U8oS+>v}wvzu3#?>d~DH(+^EO zGTXI#J=fa%KevR}t-NA+Rm9J40n4G1mb4|@eP1TEPno)6iB!bwvpXerTX{Y9dc(f# zS;VYsov(Wu=QsQ~Ui~lWPfOB_4cz8jJ3}}_SFW0}V2gr!;7RU(?#jsx$|Tj{J)!Z-l1~DIHVbUaU09hZ(=~uJ!fy?mxpyW`>X$rfo%Z5l&3RRO z%VmBSOXq)0D7UK#zmj4u+kP<4eB-9JC#Ba^Z%<~M^HA@C!MP)CCH)z5v{tIjQCgdH ze`dmC*M+ka1i!EQ?BUqCt!GB6zC>!m_XSU{u+I^8IIEjI$))o)=VM_NmS=&XvuE3Q z8T{5r*mO9xKl7KNx4YbBo`;@UWtol-oDB-LANt^GE}FT7Ve38NXzLTX+h4x5a6J1x z@jA;!@yVH%h59v%k2|%@EnM}s&tg(UOF@8=X$SAwQ&Ks*@={P@I2$%{pDH_!E-e73RU&OyKt1F;kPl(u-3FVVhclj^z z(KMPcH=nbeDRy>}p|Oja#y200C>K?Q6RYZ-QlC~ebbN2wrp{EbTVl_#g4ebyaxMoy z4GBDW+C}+I((=SxojZnWV`g6up5m$E3HjlZw;m#%t6(@LAJ-+LEK|A*3 zc@>70JM@iAW~CKxiP5+maZoYqGdRML*Aluaop{z3-3QaWG+G(!r!z3IZ!wSlgY_e%pEP zRnTfVIA^bwiC~e7SeSpL?Zhi*c-lQ;UfvT3G38~DF1ReY%UATWWkc|hm#;QUXk4DN zGRt|1{I8cz?6W)akJ&jlDDWwARWQw!>bu#oJ3wVs!^TD5v|re&T(H=vs^#&yOnpD= z1|tQNxyjMjPBCy~uLaN#bkDcb%`vIc(Jgq-%Yy~;(?X4wnYWdd)vyp>al3enEBiGDWEg$w`ZS?gz<~9?$=H)!qH&wwobo>ndGp*^YJO z`xZ5ateD`pTR|;=^Zsgq3F=RbSvIfMpQV_x_{fB#vNCTvnw?n{m}0pyLp6L>Ox^Z! zoqWTtqEv=^{GF;f6VxggFz*~@@-ZeK(b+h@! zrGN`_msWeP;Qxw?m)Hreq1f^MoqVQ#L+z9fldP9KU96YqIE( z=wj@cI%ncBy}3;%4`0vyv7+vwsν%kx^7I;D=?7ih0Bmf8_^$w=i_s)_~EM2`b} z3*#oO`0_wY)4R*hSY?Y-rEL3_uJ6A!=KPjp(+Fg0-_ic2%xB~04KK>N{d5X!Gw)qv z+tAQsUh&W*KkT5&tDGgTHjB6z38x+MXnN5)E2#aIM$?qv8A+dyepspO!tOW0zWcFp z#QQ|s)Zf~l?KA$(|HS<9d&_*seC2Z!j;3?G{5nBtxx2!~d4;Zv9twE~o%r6gRxSPF zx~BHR(3!46@+yxK-GA}CXX<$?===PRIR7-i`ETx~+ns&y6KWHU^DMSOCM*A;aTlicKaW$}&!IqDOS7daR1FRtZX zzgfqW;kfdfS-nPzYq>Wbo4!yvbUjN~3Wq$ikw?>Nz0Zy3&t|L65jY~cMSbBr>q-`; z6-sj_{cSHenWe7xu=-edi4sF+g2fGc&d$ZV9$bCO7L?8tGWF)cyez3%XHHGw;GHn- z$pJ2H^%ccj3HSEbrVE>VXSi~I@BQb=XWRZ?D*l_6bEBitk*iRPNg>5iL`86sho+yb z^e1UXKec?ty^UJwZhO2-%ew#ee>0Z&VYvCu|4O}Ydpr*_q&CbJD`i=J_xv{bpU><+ ze=RS%_;Bi{s-RmBXSY-x`unG7&nb;K0iM+gjYWa#mxB_Nvy&{hoMTJrzQwxax9x_7 zL5CVrI*cbMURmEJ<*NG7)u=_n{cwx9yxmVW$FuxwOtvn*JIpFE9 zbzXBPS~KuI<-e#QxFz{}i{zbDRg3xZNTT$nf_7>mzm{^0%bnyWtH_@1u|zuxLrN}cn#_XwM!-@dgGQt?fz6dDeT z%+`Lvsru)r{9iMBrLuKu3=Nh4B)M(jG!QSt{$lf8Q$R759_s7zAe{S%_R|%d?U92%@ z2B$jf&f}hoHoTgq!Pj@|&^ztoLQA&9#Oj}Ixtc}$+ortO6VI0M`r*-e3sP6lUdHiB z;MlQ>z$F>#CwD%$*t)DnTkfY_N7JDnY;&6o-}P?I){UQaug-Dn-m?W=B7L)0O|vds z`8K`GUBc1FKm3f6LG{_X{d_8OPKYe_o_gZQY>jJy5eH)Xx?~L#TkkHr`=Q#z-nB&E z;QicRqS7&2W;)H5cP@S`*=qJ`=PVhevu*C1`ro<#5?vwU`k>WE|AI!o$-!q_X6(JQ zli3V3rfGF`Wp!z+;H_8@ULCmN)iw($D}6P;Ma5=5PQhs`jh~#Swl8+_>EXT~bLJ(b2Dd#$xPEg)fgi8Q+li}&Y`J_j#bE>#jy z)0xR}{H7bjEX@@kRvAd`P+a-m{^Q@Q$cUD^0a`NvFG-daU8Yu8CItC)arG>QwtHenm+6h~|ny zvwQ)TP$N&4yE=S|+FnO*PmD+jxjcWy+yBR7fBj$ePU517kdu%1$0%3r!Zm+pr97*; z`CG<8Rs6zUSMj+)x7Xd6u(ZQdwL2@Ar^Ux)>h6wB|FW%r|6hJ`ykzsi&fb8JZ&rz2RnzEU`Kisb_I9q2!*{F2 z)%{bAXC2eizVcXTq1NQJ^8(F|)=Ts8t~2|&%X5Cn@8Zj~u_@^1bZo-BCN`;d|m{;E@(0G)2E(o_#ibsYt@cqTBP9_m#(IPRluLzM@y(t9R-$>mbDs zy%}xw{X88k+*(|VtTh!)4jx#mA77a3qUzIDwWOEP+4j`>OPf26T?{euzaC!6`(WC& zG~K(u*XXJ3+Ml^ga^I~9|L5G?7~$f0e5a`NZ<9$c8@HHwcvcEO6FR}Ds4;a?hq}kX z$96|JnM3#&2^!3}AhGs_&i#vbSh%A5!YgYoul_Y{UVVR9^5W{n3|oJ8dorFgv#5_L zs!-}FJ?R;~(`UxgF3!D0w%)tibb7T9@fdKjT=bf<&?!CKSma8{YKzG&pU!nm*4%ye zg}!Oq{~OC+9k3R4co~;f+xJyJc=kUx{r_Jt?|Eik8vSQ#$qo6UguRM4IA6TkH+zG% z{X~BOA+HvJfK5Vk;zS}R8hPaRC`k){41DzG=d09T2kn36%h&tCy{(uYWqZ zZ!yE^U%quW)8%LGvHPbf`Q!1jM+cL>PJCY?uGYcKU~y6)X~De~50B(SN2V7U&#clo z_or3u4`+k(s{K#rvMhKVm;0CXmFxNo`!cU-edT|-ZD;s*{?z9m%RNpk-<4Q>No@0+ z^3@Dc4895N5jiinM(Q7Rue*2m$7kpH{Q2`gfBYwK!1V94_=>xFyDof~JMG=uX;!~- zw|M`5tR5Enzcc>x`Oo1s?q<)z&2LL@zaigYxsbm_kF%=#`@^76|9gx(I2^t@pDe43 JU;D~N4gjpEPX+)0 literal 0 HcmV?d00001 diff --git a/frontend/src/utils/theme.js b/frontend/src/utils/theme.js new file mode 100644 index 0000000..a4dee13 --- /dev/null +++ b/frontend/src/utils/theme.js @@ -0,0 +1,101 @@ +// Theme override utilities - shared across apps +// User preference or URL hash can force light/dark mode + +export const themeColors = { + light: { + 'color-canvas': '#ffffff', + 'color-surface': '#eff6ff', + 'color-surface-subtle': '#dbeafe', + 'color-border': '#2563eb', + 'color-border-strong': '#1e40af', + 'color-heading': '#1e3a8a', + 'color-text': '#1e293b', + 'color-text-muted': '#475569', + 'color-link': '#1d4ed8', + 'color-link-hover': '#1e40af', + 'color-accent': '#2563eb', + 'color-accent-strong': '#1e40af', + 'color-accent-contrast': '#ffffff', + 'color-success-text': '#166534', + 'color-success-bg': '#dcfce7', + 'color-error-text': '#b91c1c', + 'color-error-bg': '#fee2e2', + 'color-info-text': '#1e40af', + 'color-info-bg': '#dbeafe', + 'color-danger': '#dc2626', + 'shadow-soft': '0 10px 30px rgba(30, 64, 175, 0.15)', + }, + dark: { + 'color-canvas': '#0f172a', + 'color-surface': '#141b2f', + 'color-surface-subtle': '#1b243b', + 'color-border': '#25304a', + 'color-border-strong': '#3d4d6b', + 'color-heading': '#fff', + 'color-text': '#e2e8f0', + 'color-text-muted': '#94a3b8', + 'color-link': '#60a5fa', + 'color-link-hover': '#93c5fd', + 'color-accent': '#60a5fa', + 'color-accent-strong': '#3b82f6', + 'color-accent-contrast': '#0b1120', + 'color-success-text': '#34d399', + 'color-success-bg': '#1a4d2e', + 'color-error-text': '#fca5a5', + 'color-error-bg': '#4a1f1f', + 'color-info-text': '#bae6fd', + 'color-info-bg': '#1e3a5f', + 'color-danger': '#f87171', + 'shadow-soft': '0 0 0 #000000', + } +} + +const STYLE_ID = 'theme-override' +const TRANSITION_ID = 'theme-transition' +const STORAGE_KEY = 'paskia-theme' + +/** Apply theme override CSS - selector targets .surface for restricted app, :root for main apps */ +export function applyTheme(theme, selector = ':root', animate = false) { + // Add temporary transition for smooth theme change + if (animate) { + let transitionStyle = document.getElementById(TRANSITION_ID) + if (!transitionStyle) { + transitionStyle = document.createElement('style') + transitionStyle.id = TRANSITION_ID + transitionStyle.textContent = '*, *::before, *::after { transition: background-color 0.3s, color 0.3s, border-color 0.3s, box-shadow 0.3s !important; }' + document.head.appendChild(transitionStyle) + } + setTimeout(() => document.getElementById(TRANSITION_ID)?.remove(), 350) + } + document.getElementById(STYLE_ID)?.remove() + if (theme && themeColors[theme]) { + const css = `${selector} { ${Object.entries(themeColors[theme]).map(([k, v]) => `--${k}: ${v}`).join('; ')}; }` + const style = document.createElement('style') + style.id = STYLE_ID + style.textContent = css + document.head.appendChild(style) + } +} + +/** Get theme from localStorage cache */ +export function getCachedTheme() { + return localStorage.getItem(STORAGE_KEY) || '' +} + +/** Cache theme in localStorage */ +export function setCachedTheme(theme) { + if (theme) localStorage.setItem(STORAGE_KEY, theme) + else localStorage.removeItem(STORAGE_KEY) +} + +/** Initialize theme from user preference (with localStorage cache for fast load) */ +export function initThemeFromCache() { + applyTheme(getCachedTheme()) +} + +/** Update theme from session context (call after login/session load) */ +export function updateThemeFromSession(ctx, animate = false) { + const theme = ctx?.user?.theme || '' + setCachedTheme(theme) + applyTheme(theme, ':root', animate) +} diff --git a/paskia/fastapi/mainapp.py b/paskia/fastapi/mainapp.py index 6abb6c5..1837959 100644 --- a/paskia/fastapi/mainapp.py +++ b/paskia/fastapi/mainapp.py @@ -26,6 +26,7 @@ _access_logger = logging.getLogger("paskia.access") frontend = Frontend( Path(__file__).parent.parent / "frontend-build", cached=["/auth/assets/"], + favicon="/paskia.webp", ) @@ -135,6 +136,11 @@ async def examples_page(): return FileResponse(index_file, media_type="text/html") +# Frontend static files - must be before /{token} catch-all routes +# (actual routes registered during lifespan after frontend.load()) +frontend.route(app, "/") + + # Note: this catch-all handler must be the last route defined @app.get("/{token}") @app.get("/auth/{token}") @@ -147,7 +153,3 @@ async def token_link(token: str): raise HTTPException(status_code=404) return Response(*await vitedev.read("/int/reset/index.html")) - - -# Final catch-all route for frontend files (keep at end of file) -frontend.route(app, "/")