From f90213f0590fd2a721f71dad3064d82fba6d769c Mon Sep 17 00:00:00 2001 From: I4cDeath Date: Thu, 16 Apr 2026 16:15:03 +0800 Subject: [PATCH 1/2] feat(flatpak): add initial Flatpak configuration and social card asset - Introduced a new Flatpak manifest for the ProtonShift application, defining runtime, SDK, and necessary permissions. - Added build instructions for Python dependencies and the ProtonShift application itself. - Included a new social card image asset for enhanced sharing capabilities. This setup lays the groundwork for packaging ProtonShift as a Flatpak application. --- assets/social-card.png | Bin 0 -> 546867 bytes flatpak/io.github.protonshift.yml | 63 ++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 assets/social-card.png create mode 100644 flatpak/io.github.protonshift.yml diff --git a/assets/social-card.png b/assets/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..84baed9dd8e5c25591794c707de0b026a9ba8f69 GIT binary patch literal 546867 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%0D8A`1mY-{tX6!O-NYwZWYvzzV7u-*+ z>~9u{V*MM2srNoM9AhvzitcTz$XI$ybS4&~yjI1>Z^fupZ{d<4Yk_HyqOI=3H?(qD z#u~*`(;;?z#t_Cl)&Of~aY%JNP&+oX-s#p5(&B0KPqZwn6o20)NcC$gPd^TC$H*`Z5mdogjCVP4hrGyV z#7MlxWT}5`zgx{aM9EGWpduie&2s15#>Qrm`v>3tj?;JD^Ym-4OqG^?cPfnA zn>RoB(AEt%U?&|;$0D+wX6A4@J$v!t&wgG_W;_|AD_lNH4336}bCg-PcjWfle&av? zd&h6T@p5T#U=B*piDCtLQDsgzVItBR(M#f4u|v;YQUk^d&%N-?Kl#2vB0G-QD3W+nY~J| zzcV-b#)s~H>$~pmr=th&JGs?|;TXR2==p?qUw`D4C%^NEwj|bl+QG01~V-k1-*CQ|E{}^opIx3j;JvOt|2nTJo)R5j;t1VKvoB;y(98#7It< z5zzI_$2?%I}`Me+$qjWdXQaEkhw#jxA7+oBH>(9URz0ZDr<6zSB zY)s+>lO)S}gNc_R^Qi~ka^HtOuzAZ(V{Z|RLV~$du6*wChcCbK(w;VOIN4@6wYk;P z`iUR^=#_J?bT@nB>BM`RYST4oKAI#-TN18!^3{^}BBDtFKph6Tlr4m@Fs~(Te6m-I zO+*YwC>RO171L+cFclGA8&oV(=di~PS^z*Wbm4j;>F2w7qLArWGZn213T~y&$Uc_GpLoE&=2v02URO|Ms_}AEuuLqKaSP@*_ zOV&`p__DgvIu+5;E~^U<&U#q_mvUDBE5?Ot!Q*H=n;VoD4c6a?>m z(0Rh8+b{BYF`c=hM8rfJ6D%=BjVl2WB^bxB?uiZ4kd+@iroCRTw=n>K z(P(7na}iMt3?d{90-^v2K`m~3B0vSCfDB>=WQY>P6e$(x5T?DP=are6tlTi~{H6Ez zcIf`w_inqfs}O$j^yu|VuH2_b{`ebeG}6S+TIkQ_YWmE%mmhup$NR;2Lgg$e=TyvP21dl^AQpv1tOpTfk71_= z0vwEcrPS`xBP`;ayL$C1M20B81ed#<16MA9KV6wE= z>uqdobh}+`(y}Zqdu22ddG8aW%Di9(V~hw+CX?x8p0l4gYmIi@?7k1a`#qofxqILL zj;pizG@-Fl6ZVAKIR}iLUZMep(?TJoiV`5Swx`r~M-?M?_4$_{`@_#Z^WBG)K#GW^ z8*~PUm~L#$wep*TQ}^9->qBqv?Cx4+l+q;P++=w1+=ZV!=Pq9EPRoIp9>S^PN3I-P zedhV6uIyiN&Sr^rdD$@uuq)m2E_kX$MAI;Zg~104&sls>8=l7Da!u+W!eCWYE?<|X zTcj#p+ZI!>6v(lD1a{bP07XaS^&(xGzuv|Uxw`-Oj?>sNQRCHsGZ;Xz>Z!n4RXyH& zs-*N%Eyj+L*kc;2$Q213F>UNVsDZ)A!fxmzSf`p}O4h)~e)0OtB`~xkNKF42n0l1D z^Y(#$!!WJ;k;tBl0j5?ENP~>9ssvrc&oLuKeuP!mUPOupePRgf7h_X9?kx_Ah<}Cn z^>CEm7@z@egN`vAYY7y;(&#yU3nRmH?F7W!6OR%zR*W95F7^1`75wY=)wfO0R{d+> zvU=#+!3c}V=Ea4)EAv-VgPM@XXU#EN$7`kmKeQ^VML*%%aqG^BRxG)?z=zt4iyh%g3~NlNSP)d-ghK0! zS;nZa2u4B~qF?JHm`4BgzjY5a8RG^3m0=q2s(>N2=o~@mX`c6bJ!g45p5A==w!7YP zAETZN46Pe0EVJzBowwfd&|BvUb0w5!|K-;@&fDQAVHqA=1CU9X z&%t9q`|u|}{tJKo*YnN6P(%nvvw4o7Ivp#F2?+oq%x80rwAD+!^)4@Vlg^IwG@5?% z^I!anKlz-yGBkzNrQO}!9Q3g z=lDnoP)eAP$^bR$K0?+}g97!WLpMHj+gm<(=U@jPyyNIj2hN>`r+)I9(nr7X$KP}> zUP+3%_(R}1`vSy)F#ZvsVCmT*A%Aw~if!ZVzU5?8H6& z+Oxm+g+Eri={`)Z`H@Tg+)t4lphI!NF!jVC0H&G~5C&1o96f$q5X!Q=a^;eU1c$c{ zY|GvW<8?fy^-&K1gi{s~Auk$GJm+Om6a^|}(v+EtqA*JD9X+zOy^C5|?*vg40t-1d zq?|$~0BuMoVqG~e^U3Vm!2z1YcZ}_2w>@tlP!h4F~9ND)Bp1S_TSIXU)bsNcrrbC^w@Mf(OIXnu{8rsj~u=K zgCDx#t@jpbIt3@n8(}@mXK!43{n01kaMWj3wj6ZR<45>eyuGD?V+?$|+v~Nd zVQ4#v>jp79E#X{O(XuhFL@G5ld>d0E>+~$f2-b#adl-rI@%7rolzo#<8sF3;Sc`v* zMvP4SYh!}z_Hl;|D#X85uU9XxV7F`^8K%_`v@>r5Kv6O!mU#ST8WFQgk^6FXp_M z>@`TSF|^7S>$h~gnk-+pv3?mdw1^@SSv5?nuEHJ4)PyY-H`hZ!);S3za-c$eW~9s# zeguGUEW5(=J}OqMl&Ob^2~xLT5km{(vu&7Gz{?WU3buA^Q?!6<6dKE6g{eZSIB8im zOc7B~u|Se_rt^7!uzmNv_w~1Tua0LU=W|lFlXZ?Af9w0-TP8`NptG|zn@x@PUFKIG zee%U0JYt3uoKB13P%D_tX2bc^E2Pc-(Ob`a>aYFP({H`!nzsk!C*CQgNEs&Og-d2s z1PaCZ%;?0kOlMn3wqXp6XKy_A7@m`LOdCrY7-L9 z*?XiAJOZ{T=d;OpJf4jwd7fu!BF-~At#z8FTI&#hsmMfZP~BF#cD*mAjH@{lAqf>p z2?#egH@kzr_x|wku$at5L z0CU6U2R{7)y*s<-fiuT8z!&i3lh+QflowwaKKAAB>`Vp6BV|gKIr{?Gf|M+!=hBN4 z@giQp14ys~Q9#f$cqUd%Af$m145C8N2q{9Mz-Y`!5-p4DC{J7I9t^XedB=y2Z*1}W z%7bq`dFS1|*%kQicP~Bv^5~go&mB8`ta_krodhah^zR1;W2B8KlkZ|2{O^D0NG%fbk zEGVo91jt%jmL+qjK}*QO%xSl`b7Zf#F>oM)ptXk5rD^IFj*I!+I<0j_X9*DJB{Ciy z98B3w(dP#H$B+J{-}=py4?U2b+`Br-ug#~_@7Y9;^P;!W%X3Ra21vYj&Q%4+Y8 z_AHx8@!dcD{KKFBGq-<`Io>j9rc-BGr5)(^ZMU~|>zUi$`L^SC-&rO)_jZtUC@=hQ z`21r}@WG)BM_p!_P4_nXI~)C{fBNHBUw(0#PdiDXs=H^a$WBD0N$=zRVn;+DDeKUoCQ?e_!qZ$6r%Eqt``98OydudL zdb7?AieZbp!c`NZfyLV4VuII{iDSv?q~V6;cfBW`yA_ox%}|Y4{l(g+eS%m2i!F2I zdU(ZZw{E;L`nrfpxsEx9tA^=XYQw4yt(%I-ipMlYDF!Zfysd3nkJR9R#$?w(G%#sE z539?vX0n)Y?e-EGD-9qUM<+E|7v*V|_2FW$!-j5!18@zfjc*!;Y5NF1rqx=p75`bc ztnHyy>{bjTh!_#p&5>&zvP0`gqWa7Ni$cL|nA_+#DBoD#^`G^2JQ$`xdP#F!XwlV0 zvM@};rG+ci5+ITe6s1Yxs$mMP1<#8sNn@djh@mP%V~N7L)d;N(TiC!5)hF z&!116^TQ#P1vxjI3?0FtD{pw~y&wLSPv7w1TYIMl`z0JWH&v{&q{xfln)i-XW)Q)P zDDN|tuH`*Uwg6vw?5S^m;S0}v{|9a~)RucmvYB)?dfi^uVPp>i3V;+db78@AN{LC7 z^WIvU7qiJ^G8v8YJSSnLlmLe`f2EYrlDoW*_cJRMCt~JV(iuDvp%618i&84dIwnoB zEF+_XH_pwA`Ft+cqN3Vkx;VsFfEqyoDM3w`kV=74#8jyiP$Q&ZHa+bWsX6_gJMMe$ zZJq7W-S?a_1h2j}dij-!AE_UF{yT7KnC_2K4&kJ^_g2`llmgCi;VP4qMLdc_U}BHp zL6DIcNeKgh;)OXbiZDaeB&mi}p)rsklVX#(ZbuD@Ih{Fq%iC^$pd)Ul>)-v*O}!5M z_?d(6|9JHDD+j|O-_G!%6I&mB@b-b9cQ?#6oc;6v^gGXu&W@6Kp12v!Jmidy(Fr&P z@4$Nk5zz?VdonuhWQeN2vEhY@Xfhc&=gOjR&QWlQ3Bw}MaGf+>SrLm#WSyvaIVT}w z46u~*(v_A#g>x9|85Q+5H#YZnOqM#~L?t#{gprtFYdnhDCR{s9eSU$C#^MVaDI{X0z#+&p(r;{Z7Y+EX60)a9{s|X ze)wl!?mIRmZx1$@)Ld9PnRK(k-rnY!Gq=9)1G~51vOgW8A!AfZc=5%T=I72IJonPJ za4)w#1Z3Aq)vIS;eg1`K6#yUy12OiPR>keB8;3=tGEC!}-{Iag7Z&c4hMiIA zK3S1PB0?G)p%)^{Jk;2b4PcT$Fie-G46n%2T0~cZksU1_Ufi@)2lO|9j0JK-@?TFM z@v6!Y5ml9I6t>5NwxM2wPETbr%zqo zrJ>W?@JAE32A;NI+9q=NutKZrSeXrq$*SGen4Jdj)#u2`+Bi9kTh;?L{J8b^HOh_Q zFk&R#AXXdJH=%D^gvA5L(8xOL^Lo!(MrjZ|2CS{^8US#smRRVdjaA%v0|i)RS%{{; z(O`*bgmP_E)f>3RKn)aPsNz=|>naAaeyf3O-BJ^|aN$tc>jOx`7GI3Mh@|xOuNduz z8jRRRygdbR57p!Xz-l?IHX;zs2)2$MV0FpG4FA(iv~zAc9s7hPz`y!if9L(5{>5pQ z%sTY?#EnXe-4u-;PG+4XHCmOWC57NTigGh)LtQP_Sgu4-zl0<^%HMp`@ z)u&RqEp=j0zFDtz^Rkdb9!(~R)90V~$v=DK@rQoyBfs|d|L*A%yBB8#gH01XvknvT2#i3A z9J9+kDM*ao&x^@?cH`D&MyLMLKlpne`Pq;C_y5iRxj3AZ(@COrnxeNke>zzOS_ILAq-zm&c&FA^ex4q?-+wc0~pZy5| zC{%zU`HqEAz*h-NNGObp+OddL72dXx4D!5|UDZJWVz?YTmYP-_r1J)EG~6Yz zandkj+WN5pSYryVrz_h;ZZLK{;}RKcaaU{gb&YTBfUD}5!ovJt5k0FhpfSlBRIc|` z;hQ?^Fn+y`5m~VYBIbkE{Bf%;>EaI+_a85$_|FDqF?zzE^qB=l61|WVt26)LjATc^i zl*3yP8yw4}vZDMbx;2zJt`Zemib$R06w)wpS&nWw@AZttMP6g>=fxG5@f_8!FD&n6 z9XKNJ#6)Ds5GVo+RRb76pbEbO0QNzJD+Oo}y!Q@;v<9s`f)fsrAxasxP6!1-0CtWX zIeF^ltg}5Syi3x;n4;I&x$V}yJ8w5fcE-ex*&wEcRr|wBPd)$2Bah3$VaNG{D;JX_ zDSbK4XBH*h8Ql8Tdp`8bpStP3w@eJ~m$uY;?tMtB5&%Z<-lHO=(Ak23Gg28#-$OTd zFMj`#ul)XJF8t)#4bkAN?j)O=gMPoS2*6jHH}AdHnur9vbB-7gk)5+edFlKc&N*u> zizlLR>ZcS2?^nekF<+p9)#puQ`ho{4E=`hTb7#Ag^@^e>ofQ!RG{zV*-j&nobUGaa z0V9wgfz#0O@Z&Ur*g(=^e<9;TDgY&HYW6iltwe4$i_`;EN7P%inPQ3Tk zoyLlY2ne_Lj&=LJPN!1~A|fqePY584pr^P3}hHM$e5AYdfPs0=WM1J+IzafUA3*M*Fqcg?DK+i*5NU ztVB-K{WJ&~)1kqC)%PtjLd0GT!mjP4P3?H&Sa;IKU0NGl005Ry@}VwQ*q~ue7HG{y zo3=687sD@GHfCg{aosZ^wum4iO085UhyiHxSlpn!TIw$wM-T0{7AEq7TNo8Ca1sis z2LgZ!MG!Qp$J{BJDk+PV&6$Z*Sgu`<-bgn>arL@PonF+pU{U z-f{oE=E$DSlCig>O`lX&mKUFY@#(LBQ!ejklbJ5DjOlUE*lGRy6@ z(n-nPey_K^DVjjM_kf53q5zdrAY#i>#2clRQF)$Uy?XWF+LeSzL`b1RqZHQLh9$wT zD?*wxb)5zfSV<|R5~GxI?DMi1jYiB&pt3C68f=&(Go=%p23HfJs&48<1&9J@jPZg1 zfJy;lnq=OSG8yR15_ltL?zvfvJ$~w#Wk?CmzBU`ATaSPLan5r>o^qkmjT>$}dHIE( z0C)z^U;!M14+%zr13-LbmEuC7V%Sp=AOcXuJK~Mj&RNTpps=SRpB*{2bLZ*1Uw-!N zcr;B?UFNgPc7Isd9;H`@(-)tg+;)5a*gzfanTx3%dYG&13c8oadH3}Tr;ltWrg!J* zJ6=9~btWz~Ny()TkrLIln3dNK5tAe_#yICj4CNF|3W-Wlf!CUWbMLHWtK7!Xtq=a@|Kh=)`QSG{`}v2z^i?&tyPe*=$Y--j z+R6H|^U8O>fBxC$?|j$0&)omk?y;j~V!T4x=G=yUJo-dGNts}H_TteK zH=nuX&MR+R_`!F-gTm!(lB5YJD4lrkl0@6W5kkM$n@mPYYN}hN5uv)Dsj^8y04ZEa z420E%6XEYzxItuO)QhN=ijD8N-H*`ar|dI^ol}RH&8?U#gts@u4-Ea?GLeW(vDuZ9;jk?i&pn#zZ~JV$C$Iy0!4PKR3RtU3Y8eW9{p0uq6r=Xiyoh176%) zEk0nC><#vkh4&sJR*M%~3|>9Qu^a&a!9|V{LO5y$tOA=vmW4lYQGJObuV+#E8i8ez8H`s-b{FM8MjY%vF{+ zBcVW*BPZdLphu7_ojVKGCB`ILymQ1pNwTtZjk9_HCUNfM<}TNGC>UpzcKEX$IhI)c<%qgGlk&%bIe zZ1~j(8vI%BUz$r2gReByNg%ANpITc?CnIm2h&Z+)zMCa!W^|$u7gxUuAgY>aga8#W z3!+j=vuM)BGH9K#)|P1V^s()mj`GIr!~m^_;XcgsayIkNKKrZ_#(r|_#uGpD?hpUq z>)#ZJ%iIWyqp;X3-W0%4(mZD4;MXC9MR9u|$38GG5qZz!>1Z?=o!s&tdElYvo__wy zWLRX`IQLIqK6ls2TT|9Azkc@AiMw|*xM^qO!qD#*lN`{qjLPEq>G0ZHZa=kQ?z-zO zU;W89#E+FhL{vlyn6Wx@2d?g`3{%~ruYYv+&f|C9^60m|d-1}BW7|is9v<%R&yH*! z{pC;p)gOHCTl@Q0OJA_C11BU!F-69XPQ3SNnlf_8oaaSWqyR~9KnsH)R_Uc!g;WXQ zI?c5rX;&rKVtSUED43^pDau&2VPzMt+`dycpv7{IWFx?;Ne3-211@&;03f_nI*oA~ zAJ)Pa{~M!R!?2>JgFccKIv^qt@`4a+jo=0_4UHK$sGHR=#LeQTF&D8hP!j~Ax}maa znXTZ}auUUpUX2wwl`x9LfCUfKjce;-Eow2$xN68#kS`r)TFuVeJoeKrn6;?-3{vKIIHCs~-w^=U}^tr)ht!Sw=eV3mO|x@xQ4 zPYpA+UXOom(7Cb9V%#ONv+I>m1Kjuq7rPo-9Oc*15%Hp}Hv=_b3iSeP0zd`<1O}u~ zu{;Q0AwXb41}K;*H42d(E1|?>$Y^uh>u;w0%^PmJGZ%byf0zxnJi7oDS7=P;BpuSOw9auSNu97EOcRyQr+t-_hvSVT>y`Zd&wuH=fBxmOPdztC(=C;y zB_BC)B1yFOUMU?esjq@Vn1w^wf^<5aVm=>Er_xx6pj-S(U3w!=UiEqS|>ylZ0K--I}wo~@d5w{N~ZIi~69BfAIy9$tI(TIun%mtF_Lbffp+d*A!u{r8-E{FTd> z-T+_$4=7SON9!dcBEE8zN-#`=#}w*(7yzt4TU%sVUkQ27L}Z=2aOI+m?X7P+`mX!$ zd;HnwUf-W7jpr_3*xNdKBunQrKL5t>hLf8ob~cXf&o4}8`Nz*kjf0RS)nAIG;5 z0t1jBgAgKzI9gb2Nf!A)OW{^al3D~Q1}4ye-nrR$a>a6|*BuN7-9g{x)>{Vv3__p~ z042l*2%+EI+RTgM>hPe;!nu9@N00ws{=xtHy&wPhNB{D#sJ*Q#bE^#QUmjw&lO(;8 z#Sl)5V(wg$Bqd=fY(P@x(X2S}wtN1oJO0~8zxIvqeBsXz&R)1Wn`EG@bv@=mr#HQN z`A2{Dxs7LTJo(nQ+<4zTn5J`P%(|lS{-62K_`;=2Pd;TC6U%Rmhncqzz5D%_-gxbe z^RJz|bk15k*xGbO&faUKrjuDWOC_XAAp(c2P9T9mK|lpk#UUe5SUPllb=DBA@xQS| zjqhZR*Io6HB7qQPQg^r%o*;2!B0^l63u}RiCAKV_xN+w-Yz?j5knQmhF#z=|4TZS0 zIC&L?C}m1SNUaHqi-k{&T?5BheZ@c3;K915F*S|XYXE8;7mq6~b1?3q{e7%<94HX?Ezi=|EEx`#D}>Ds3a{o3IhAL`GIMHS<7y|Ee{ zHV~6m~Cq{gK& z{cZFm$`-F5i~=iTOzUZFA5tuV!4>ag1ARe+g#pNm%AiZRvr6#gzl2CttxAZP5|yg$ z-BltJtdcaQYGa~nxwbrcTxE%vEDdCl5eWf8x~mdm0AyqV2oo0K=nz1VI-SnEoU`|t zHiQa1AYj_*+;#6;O>gt^WahdX+)G|9<~QDP*8}f(aFk-%&rBzq9PAHJZ=rhXo8Ni% z+uzG3^K3S!ydZItVm6=8RiY+#e)|XB`%8c8uOGejOrEH#B$p2lsow{kS|BvW3YH?q zXs;ljmt-ih^Njt5;IW;ZAAkM3fAp_^Xa9v)I;B6QQkj+ges^nYgOxb&n5o>C29*Y6 z@4a&bqLl(rz&xLh5BCoa4-Z+qM(U&q0I>KZNf;Nq@W}gFZQ-MJ#u#cWt}mp2y$2Bm zJXUw#2ni^qj4{@h8npl;p^$|CtL$K)U`Ao^{UZtz3#!C0DknfXvyL`4wmhX)C7U-K z*}3(2VaA(VROT=m!@>T{xc-$Z*T(bN$A0c-?s?al`INu-)j!Ke``u;yXl0Ksir+@E zBGkTJ=4e+}afk>a3jjjMQ|FRPbllOTvy?55=A&;v{Ec7#g537i(tqRM{{9cY{Iy^F&EI(2Cq6P(lys7jaPG=k>H6KSNjiB^f{^IcDJX4; zovai*JDu#B-aol~<=O9kzuW1hq|RMC?56$u?|tz0TW|aR55GG)7;bKE zIw-vNSvSqgQfmzh?^b{|BZDOFX?vA zu(}4qhxlr^>mgYG)aIeKfM|>x8(4K$wId#_KovwmY9<53W+ za$1eXjn6Uv)nheiD$%AkeqC!FUWsGmV*ncL7x!Pk*bre5@ol|zi6^2KObw9@0OG=} z;Q%Bk3X}*SQP3N_P#@u(mJo41of%`YED#$Gg3kAA9^OfAI~yKS~ZqX;DHxx3-ws;_7VNKf1MfWcMHZ z=HI;YXFhm^-8j|P^63;H+1i?vWl{LRLK;A8ZIGn2hPe-V3w77S?Ba!g_eY=m(U<;0 zkLLpi#!5Gl?Y-T8zh81W^`$b2Xmrd(DrC`vFeyan-9GA%)yZV z_;-JAba*XOEY69rNL?IC0061lfdN9p@)iim+I~S46}}`=g)5MiR_K9Q3ZoMNxj5bb z&XYg;aH_S#yZTGXSLhoB^39;8dclF}j zLB`O_HuN+FKSczrXaS7CLcoXu-a6-8nxhzO|H>*aZFtqai_%sd^Brqk(>BS*3<>vTFs z>EOz>K`MIo-e=v8COymNX`;{EaAG={k4BSB>G`E=|MCC+|9JATM?dku{3|=BZ_rxL zjJD! z6sWu;v$-9Pdb|G5|JCo@{*HIv`oP;ZZ#Xp_#d^MQ z)mXyFc5e*VK&R0r=C^vTV=Y`0b}b5ZS8W4EON)-UYG}5>ZJ-*D)My-!w`A)U!nkUg zt%YPQ;Tj!c%k+#t|~%0HTP3YfhVtgxsV=RHu%e zx$(>y)f*g?^T7Ql?taTu`~mtbOQ)CjkLzT7>B9HF^|}2QU+hd~c7I>9 z&8M?8GsDTyWyz7dZ+ZLAf9&25zPo?psh8{wJKfTjBj-@1^J&QdX__zyFpGC6!lmsX z4$@91FVZXf4}a+^-}&m-hvzT(@l3PqZtZ1#-0p7>O73#e(CKu?WnNC_{cax%26hS& zkZf6wr<2KKlIOWN?_CKj%1~ldb?YFmEZD`JH(|Z3wLS$AWwrQ2LpU{;SctjDZI4zZ@L3jJq zaR>9AqkCSUC}Dq?JExy{`uVc7ANj?P4d?L8qfcCX@fDelHWCB5WpUwuLQ9!L_83H5CgM_R*DFnwc-&Fr+{i_^V`ooy1l*o$@hHx{rBAQqaQtYFdgH3 zULabp&R)85COf&i*&iI{oeaU3LWULOND~X29yA*8fI=ilLMRSEpeh7MC?ww7yl~oR zqx=1SumwY&wN}a%WjW8;d4*xa5e%owAEQDMB0)ryMfSZ^KP}i`apF;}n0gwkV_|^R zd^kmrrN(IOnO$Y{3jkcYa6ai|{eHjS8+1AyqbTHeBTr1NzMXWf^}B=ZgI6!zuy^$0*B?22_VrWu z-FNFdAH?m=8PGg4s?6;X&oQ1hmeWNIVl7jBqZ1S=e2fBTa`5QWPiq^jJ%X=$jz8e)ouzgEZ93FF$8W)^XE$zK+aYy7 zanEa^YEN0*XS+?KtEOOFZCTG{Y=E@z9jWOC_VPtMMm?{1y{wYq5yI%j-8?-TJF`N?JR|Ku(A&Ds7Ak7LQ z)Z8~zY+aQtx~}EjSZQk!ltoTSO@#PE8=jh~jWyg@qMzSP6t!iEv#a(het&B}*+e8axookp(0xyUE6b z8W9Lc7^`ZOB7h7=VMy}eD$j#3?7cxvCbO-L-P`ZJd$6^8X*?btjMeV;Wmlel>wTvm zxDWf?IXgj8ER@eqCh7M+_r+&^@WY<--O?3@S9MXa_)_e(;o(fv9dEzy*ZIHH*yW z^Rg_JQXmwJA^`-TYD*!6pezF#t+EW$^w`Zeoqzg;oc-3`R`19_b$rKw_i%MoOlNj_ z%}&PC&F$?QPj6p7xBuNQeJv|pmYUhCQc9I&IiJqD{azpOe z&ct(Kj6!tI5mmaXUd1E;0*h@(v+6>~%U=>A`n47jSXV+t5a*FFQRo#CiX~wWB4Ug# z^Wq>cilW%r+39w>An3hU%FObd5}kHBc{#V%rlgHgM0#^$V|SLnaph9!Y=Y?z|M-g! z|LGS#^^!CD~Bb(d#mBU`QTVA~O#D%ZC^8B;!`o*8mZaC#N_BIEX=i}t) z?wMon8=tx9h425coa9BGvzN(icIQ109KZ3#?>+Kem%CIEpwKeV1p%PCNWHF(EDY7T z0@fA>v=l`Axt7D%J40`)zgR*_tI(1xjsjx61B-s+mMgQr?rNB}?x;0&Bap0Nh{W(y z%jB(9Rb#|>EL^>oF9crI%^Dp5&OkB0wiR(49UG$qZ~92f3U6dWH*l25Pqef*T1m`t z&#?-tMroDPujy8g((X;xMPoLa#frZE&=C0TFB{X*ph<%WapUVLViD1_T0^V;5QkmH zWQB;gYQw96fBa3u5Q(WAZ?ob9?znL~lv_lYeZ0$w7c(xhVQK=^BSI9=8P2l`Th^n5 z&I606MWkaR5wGsQ%_}kW8YtIb#LFyRhxLa=N@>%$ui?k)VvO|*8zRP9E2RPqw$2+uY^#9YLq}909d%V5ETGA_7bY1)RO`V1lfnZ-15RY&kO)sCy2{+ zUL#oJRg)sjQ9UW)9B?^$2JtRSIij`4?b`Y?QBka86cyzJ*{Pyzwy+w-}w5slDyn33OAn= zMed8aD`pOON_^Y<-|@Cjef*a9yn~Nyy;>AwYgub9U6N$;(pn1u;8{{YUof)kYm-?& z@Vx2Z{1Z?A#h-lciEn(nQ`lZpcs!m= zCPh&&vo;D5NNXa}qyj-CXjKM6C6(zCZ^SXwmyLxhRYinAfEfr-1W3SF<~}2!C?rNE z3Wh5QfCz_F?-0W{ofp=NF{ab$Afh15=0%?8Wm$S*s7k>D016TU5fGvhQa}cPJOC2i zeeb;o^V!r{m#CZHa;v5C_8X6)2MciS!sW#5KKATm9`Lq1Zg)9+@2g+S3a9cy%1K{= zFD$W#D$mJ__{egoKZUy#5RgR}VYwGwWUON-^uX+_fF|wO3L)!{GlQbh zT&yj!EME}b@@Iwa-nV3hSba_)^U z|FeH_%RAq7%iAC9-*{4x<|!74eB+6`kN?u;A3r^O@l`vSZlvkO@f4Xp@S&f5>BVO+ zy>XTlC~drTMiBrMMQ*Z`7Y;2Cf+)aVSO9=bC7p9j z0kdc%fN(`!HCEL|Er-A;u_^o;s#B}gETy)NlPC?hZWcb+1)NP)7-UXJdkR_!5s4(| zZfHJ>EC>{lu!CKwi4_M~tx9TVO|0_5En*F&Agi7oSat5SqsZ$1YsDJpH$$X(F-kRQ z*bjC4xIs)Ji5J(ZqK8$Bs0O293BYw!VdKx(7-#_BplS?WJoPb0)rz~#vGt#Ivo%Ng zZ9-q~sg06Grz@<#YV^df$LKZSj(ccZs|%SajsC+En=&yBFAV;?bB3 z<3VFgAr9+|l9^Vfj}TU4e{1yPaMH$GYl&auTQ^<{B*y1HAx9P{l&K63JrM|1aeQgh zBy%1M%hRGfed`^2$4@%cLn61ceX+Fq$dOy#_SW6oZkcLK23b+$b7ej*$0fVL@x8zK_x|>=d++Ssdh@=5Yk5&>!zL+8XEJjzop-ZN z&fZy@AkK!ii?nHUcb1>(b;hq=_{0D3`;UJ0Ydo6v7*of+wA<@-l1@fO2jjpAGe|;2 zMC_a^Eea%>lu0gMyi}HDQ50oa2J$Mc!k#UV9-CV%5W;X9P*4!dB?b`awrEO#fVHa} z!YOd2`l^h6Sh`Px`jK!WHZQKHWwzEc^L$_1VY|R zr$3m9)@gR+#K~vRUci2~vDNGE_BvhZW}pEMr!tvZzBZhX@}%24cH;PtzWKx9+4DS} zs@c42kUW>-1s$MU)GHN`Mb%OP2!Wh{5Y?H7kg>i<3|dtQ4Cn-u2aA9T5yUH#%)Nc_ z%FAE*;a7g+mw)lCZ@nEJJA35-N(aEIm^nAM3Bq14xjIz`x%ly@0w$9w=p>+A z&jbn(RIXEnnt_qU79~56h$Pi*5zH)}6@W&fYMO%BDh%689 z>-}ZDJP`nq7n_($8bGy=3E5-{fe3(sv~n!oi}&7^Igg#q3o?59=<#4KDI^3WL_r|| zK_IOF$cStWHqtbmPN%aX?^yfB4<7lqKl#a9-~ZlE{Pn+f!=1NZv9_o6wRxUp*`zFW znk1cUe>lmqEFE;cm7%p-lQB>@zjgZ5C;#r>w4eIq=l{*`UU>e+*=U$*wb}3a>4eI8 zM_~Ba6W@L6saxOujypc^o-FMjvc-PSdD(mLzGG)jpZ(F}ue|cghNiuZ-GlMy)al!g z9zFWfbI;_nd7?FYZ!~3D$9o6Jf>M>*g+*egEUDL!V-58Ok?3xVIE?%(vA`D*sLDC5 zyiP=mY?`KXDmJR9(N!(sqgP_x9V_%$>C~=-_FFN&v1X}puLO1LLac=bYWr)~T!{&* z8Z-XTc11Ow#ze$z>TzT5Pp!~vG?&n}oQRDt>ptH^)3rfrQD7y>r|}}LzAmdqXHA3} z9a(4KHV9JV(xzUc@%4HLpO;7Z4LITjaJ{F^j_t8AvZ5Nhhx(QHP`-hD{5f8D?OBYQ zH5h#@*b?0U5wA2{z4|f+wJ|I0$!^e>qn&H)v1`z+O`p0!*l5NDiW>klz*`H?l9(#m z6ia1a;%X740AKYvny;|L!;7#w3gROFcCpc7t`eDpg%{E(5LA85Q~dghEI|F{STy({ zrV>PJz8VFWL|ePI>nW)B`alHWp}Mpc!Wc#A`kk&9n&pMb2BTSi>gL;aPTp9eK5*89 zlpUSkdGp=xeXs3gvrguVQgWM&W=Fw1@}K_bg-0IQ0Pxc}lrBL(olHop;dE3a_>o`# zm7o3fUzMGWvYU-j&8!1QB&ZRc7*wFT8E8NUU6ZDs$=YLCmd)}lFAsnAvtRh#-y6Si zzE4VuLJ4l}>~y=`G)-B=gCG$hdG8Z4)>^U7DBVjl@jN~p4u=Qh*;JsKdS&$DCMP9Q zIYeb)T}h}Kh^mTOTB_5CpR2gU1rH!gTPB3L3oQidcY~ovibMp%fwBl7dj>CF7#$0O z0CG65$Hkd?y_EzY1|rY^N|*o@fHG;Pv(X>rGpF$8GdHFk9&DtU1|S&jPZR2$zj&pb z<|l8yq0Ecte()pNA0{m9ok1vzIVdmSMOeUtcmWSfYi!|t!G+6Eq{@zp*sLNiDhVYU z07b$v0gHI$9T-(A-go)epZxYa-~RSH&YZB*n|}P`ONaTKNacB1%;ssD-q7n!(vi%D zvwVJHZ?CVQC}27-WCN}Bq5y}6(|uFA5J!^{3Ko7NF03KfFKm;O%lAD zxJYb5fNEm~hzJrY94#sfEmtA}0O*hoh9F_#ivXgpZBy{I>4lXW3o5QK zCqMUVf8~9@@X2{M=_Y2XKp2PfX*%fjHv0lFDaww~)_DdZqYr&qBJZ9Ym~Qf$|KxxB z!_R-|Tc7!3HJ#CX+D-I)Hrw0SC@)^v+t_^h3tzhQ)H84U)X(2=`#>hqdEv!#k3R16+>inU)7!Y`p|?NtG=KF1(n4D86|qw2Ru)IvXptE854Kuqx7F z6+&EBFoy$hp#^h)N5yR0Q z3|6PS!Fjl9$hP@1{!sVRj?8E*yapJsju#t5ZvbDz@3_ej?RVii4B8+Otj@t&tlMAK z-8Lu;i{%~XzEM<9G-mzy#n|+`9^!3y;*Er?!qe!m`dsOt=#Dk4`hoiA7D=&Xi8jtS zg56oOP2Ij`iFO2P1t(ULqA_LlytJfnrBgwO!>wpQB%l&gSSGD>+P^ZI+h4a4f z_|}hp;A6k`>Frx@_8Z+P(f({!GNf6*-=V@mVWF#GJS#iB#N~zZ9!je`A5Xg3!RXu* zKlyim@P{uw`dG(vR+hqWWN&9D(A zPq#O^0ANd)92S}G4==x{nQl0C;@KyE;t$7tLDb|3&^vGrkp;bomvH1N9Bz^XS%$AH zP`YkmED1Jit(%b%ya0)i_n>uRflb$3o*w?um;Utce(JZ5pHi3K*x+f&jO3ULs|oiA zZ|o$>_id)`*gM+OaBX<#LA)S?2Js@UN@o!WRwas%FrXq*9;(YEiGZqWn}7rnu_{Q* z48jVQi6Dzjh6e<_xcnUeIfQJGgnv9#1+(h8=2{XUFo;3$B6ZF_qp!^1#d0GA7EuI( zN+GgR);sUnixjiz(3O5V+vxWD-ELPK0d%Eh5YgnJ+D{r|Qj=txYBNo|_XmeVvX(Dj z`_jMuoo9dWqj!AbWB2~d2fCDTX|qmRGEd49l-@{_BA@SeJEefN4$$SLpE}oJtJCb$ zpZCsEC=VgIlT`|A;?t8Dies*;2a<{+Xy|u1DrBE>N3?fP$IMI4y`7f&v zKqO`tjl+ldkS#Wt78jx}?V*@U1)BW_fe^O|u~H4F>IQzbGIWeZ41e85waP5kc&(*_ z)GpqZ_12U#*D-e*&0@SD(hh4i>6#<;XkEvus{SSpu8ocI#)P)fjAyd}MoiE6L)}~G zq!FjvrswsBXshFxD;kzVyQ{U+(I$A@reOwzf0uPk;~`_T+dbA#JD4)YBsK!BhrpZn zUt=CaEJ32J4$)w{cwC5hs6q5L2gIDx0QGw74Wk`x&5mmc7_)DiwlSvhD~finwZ~yp5CK?Ylu~LQSPIu5nWDnj$M?pt{73g%5Szc};43bPaKHeD|y!7gS_-Fs( zx$ph3&)A(7=Kga)F1tF(qQxSW@6}7gHrJNpR-~0D^d6 z5JV&lcY`4d2%xZF9rJ`pB2c-+m7qdUSh)#N>!k2RTB*d0^O-~5I(9@Q*w19M4`^UK z1UJXw`QhZ+cq{E@1z&vb<%AKew|<+X#wuZM zMWp&%6&MPBsTk#jF^biM)_2Q=Z&*M?JPHAD5EQTw3m{$ugu*L~0Eh(0fW+vLEO01d zFq_;<3IWAv(J6& zbAR?*|HuE`=^Ks@OTRxWl0;jSayr{W(xr2@+(^?jOTo?d1a{K2eC@*T{_ba<`R?~l z?rzPm?I%RyofL(jOO%n(L1&tDdmHl~KK|^5OWXI}b??uAWTI%C&vR$@_O|bM_qz{| z-|)n@zR|Iekxq>|cI$0ANiV(rYC>X6$BRR7wAk%0Xa`}I8qyEm^oe8Wua_=T>w<-1 z^3v)A09-iujzp-|tx#74j%uC81I3EItxy_9OaR755VqB2`&7N5*F=_g3D$$gA5=?U z*W`++RNLrP2va-2EP7&Npf>of*SH2I81xO>qhT<#$ra79EI$Tiho8rtxK)baAtILSYfgD6wI>7KgaI>p=;t90`l*Z?tL9rSW}ZMZL*W zPjlR11Nhi*fpt5EC2K|tEN0d?<~L@(*o12I79+L9W!>DgS741xd(EsROAT906If*$ zSY_+Ltb82`*KHa@L{X&`7HUYK~#QJnYnx4y8rc^M)a(*#7qh~M7tn@N= zs!kMZ1TEEYiiqHnLmG%c#4yWsf+$to0R+O45Ca=yE?&CEI=knAhpbBH2y-vV(cR74 zZaMSd{oL=(Y|+h(o#il^KKOeod>d&#o=o!bu$)V#AWc5;SO3z_{raz} zqgw|ArGmr4f}mqb2tmL*2LQ%sL_p^@l->lDfh6<7?~lIyjW2xp_y1t}(kmHi^w8I8 zYx~GxbAth_c&#-qoO6VsxH}sn(up`f8V(N+5A*pL^k~t{5P2LhQpJsBBd5m9;6fIPwd<)V@+$)?N|-U}pkmq*z%=7=<-~Wg2 z|D{iU=+nQP^i%9~ht`3~5XCt+5K0S|SeH!f#ixG!wXc5TLl(=l*zABvr^MeZ z5{AN}il#M^rL`a>BDl_pB1R5ESnVe^5*jMI{x$w7_Bg}?#loDK@j6;5RzM9ar2$M# ztGK1Cx>4I;)V(!ybp2wijA~Caw4NC2Hr=FUT|hKPjkiM1T${pc2da^6FhdM^-Jn6P z29WJPv1QD}zpmv>Smkpa8M!HhF=a?hkyk-3*tyJ_~V=l*wrvd!h zbf|cR#{=Q&VF9jMifz~$%~sg-I_=*iQ?iD6?LumR+UT|hyWV-!166zF)p28vY;;)B z;W~TAs(>g$d}%K%{8tqba9PX{L&RDzVG#i9l=~&JK^xX_PRogaz)QEN5?y%joSROkNva1s8#*bD?4$^An8W_zWV~OFt_%lBFQ3eYFT9$v zD?nJW5fsZMu!rE`2uJx|gew%p2fp{g%@x6h@wp8y{t5W9)c!>g0R)GFN-Vn#ou#b3 z0ITHLH(q=6*(ZPI#DjYs#RXgI=B0Duypm%_6OUW_m#+Y$Bsdx!I$b za<#Qmi%fY&Bo(Tj0qf8Rkc2fLf)Jnv)(8q9ys8i@gHlvImxvl5R6mzE@1Co&4b_c1 z5{_9Af@ic^>p(0_Aw(5{U~zv`uwp^N1xN}26tN-$NJQ4LXO9G;(4pTS9bB6n?(QB* zl0>USu^13Vq=guMu z(0baT6tW1kgGj~HL$ncDs?O{C0UK^O0H_N9*Vr{CVnq;L$5^ifY4lA4u(hA#L1PYS zBho;&(SHnT1M%?X%29qBls4uKZd*&uwM>j}>Pc<caY=>w%+fUsO zOEdB^hCJ>$JaH9*n5K?9ojR-T7P>1zTSh^Fl+OQrXpi>mUB32S4`V11%GR()+x0ObRKP%`I#4 z1WGBRG+XP-Tr&@h+DpOc{Z(mGKIFa#H#Aaf|%1wcSXX+g!L6e*7g zxTvI#i1oS%Q!gY41S<9r@?yI}LV*z-h({2lkW)s0n!zw&$lIwVg26cqK3NLMO%A1Ld@c>Is zQn+&VY~R^(dYJSvx2!;%E0rMv^e$LtE0?W8^I?E+Qmp`hWKsQU5r>MAT^$^(p|U9= z7tWeQE5v-3r=~+$TIBMLAAILszj*g`0fI_Mp?Dt(qKhDkLJjQEvj$Lrgk*vlN?=eKL5-e>2}P3-2rc3u zp~_W~McDxa04K62pa4#QMHtY72qGi0RHyc#$QB5ewlX9bnZyeM0|HQpx)rQ^u>ipn zCJCZS4YRV&mCoD3p;D;Kg>z?*967eTy`u@ygBH<1&a)=P?6p?nVLr{%L~jo^ymjO0 z#1PFUQ*Zs}{^`H?%I|&VAOD~J$&L5iQJ~UFzwn)hzxX@9J9+7i8@n4P=3aRrD4e*C zAr?lhfn8S{&s^mBPOs;^&r64iR;Z+$qAhtc$@<;Pk3IHhFTe8MPyf=f`|q_VlqQ2y z$8YJTR;vrozAzn+*^5ehr*6LG@};wiKrQam3T|RqxoL9w$m)G4vEhY_J4oa94Yksc zb+H*Ci4#bQ7r;bl1?sGTSx6x9I@#I0cqpX2oQ0Dl!76&_}_2)80c zQUp>tMJiuleaC$ig}sDC{19xA6+ViUk?2pRxSHJh! zFOFY%b*s#wEW{PQ^yBFyCrS2>eE3s8_ugOqMRW4VYvKz-qdZT+2xC7#(? zm1y+7E3~cBKGW=_vw!rNKYsF?-#&l#T-O*iop+LC@944ABh z=o(H6WfT_-9HdwfwSpnAGsK95MMe$)jd+DLm3fwGMlQ?TP-m3q5C8P3kDPum6-ZFI z@mP11GYAN<3%jQ`FZ}qB=6)(9#y~kwjS@jXjZgxhLk&m-UWqf-CfYEv6UV?5lFPhk zpoB0XKwuQF0W@HOs0C95L!y*TlneLOviFGSz3U_f6y)=gNSmZnILqLG&@noXUPwSY zKh=Sl5oUnJ$O%h-fu>ve0RvZIbK!rv~5hEd>cn}tF1R*{FgcKzqsSliI z@jfwnw0|uhjRu3k*2Z?Cjbrb{gLnl*tQ9CBLI*5XA#8TC4NMNlqxo!nTItEkqR=V@+?AKfm3&5bQySNGTO+phEaxL>5=ox%$P*>%n!tLIQA}xEr-8eY>cv0#s-Yvzv zQoR^vxpiIu(UC+gBN{=j?dieA6Mr9U$`w9XM+A(X#y8S>pvCbGD#^lFuSZ#luZ{Y_ zXx}4?8((566VG4+<`upSudr~?)(F9NlqjJsK0Ub}9qJKdse}zn9hP?X;`KFq(~2wv zCdrCoPTp_y`YdiZos1{*yY7F8I$he@y)Y{~H=Vlw<3Br6C}MT0@o;$I$4@=;*)I(y zMQ1eSa%QEN7c=j@P4Lv+cm9=s@SmM{$6L>foh5K(RywAn+p!i3SM)M%Jxq#u-}Dp0 z1PtZHHYJ@(Gh*H7D83eRORoPD!RS5x=kT9_juu>ifMGGZ}2`VF`L19%Mbdgmf zsDu=fBGMS#qIG!$U_n;l6Q~?TcY1?kJEw2HY3t05W_vIPndim$;?=`*7pLbgU%7lR zbhba}3$wEYN{UQXEd{kuoYskiJKG^RXsb%_K*(B=F#3hpPXQu=QlMBF=M`a+Zf#+r zdVSsL>fFI>2D4$|W>k*zLPXor&!++50xpS}HbL5s2l%hCmtyRLQ0sz>6&EuVmFODp* z0BW6RHY`k_1U!mj6cuu%m5(9}FER>$tF3I4C_84y~vXb;-gY z4y4LzQs7y!2KFo{5~5822$T~*Bu7L-8qkZVDor05#7i)Xg8if%GJ)bCDp9<1lkwP= zWw+bi><>Dfj&~v=z(U{^YEr?YEjUa3e!oAP&8-!!mkHf%F%`?J zh16PK*SXQdQsuRTUaYMeepy7#T*flFHm#z~{_?Gc(y34F8j2}aRrNgr7#To|A(l$5 zvC3B5Itvuy5$j*HTAtuFI*Gr0b815r@Y)1YR@7o_9W}m*Y2N5Oo~(wIBI^wFM$7n{ z>PqbvsIfiMrbAo9*55Z9taE?LI(w`!bYp(w5#!$CC}AD{Rx?Ti`8Jn_FISRaTG+O2 zuLhnF6$XOVgRNa)jWD(Svb3_K8-%D|UzvDZqO;@xsql)IN1KH8_i^T+M4tcf#9`nP zS+p^6V!nwa&WgcT8?5zMb(_ZLxLISe>K7Z1-tc`LyBYW6SMLt4Um?a&iS$|_pc34p1!TWb7agq zXV1GEZ~Mpx`bYPuoGVf=9-n>qu^0aQYunSpUb)sy(;3Qz!+jd0rGbzB`d|L_|NQR` z6MC_j!p7j@{$Y1x6TOW0Cuy$>z4X$2W{gR9dd@mix-Q@m)aht;;mKz{^RIsU(o3(X zqOfJ&>-9DVgKoF0unN+!)+U;=M2kpSmH?7!jfmnsd%u6}+HiQ_oU2Q{h=|rkDW!}? zL}BzGfCwZW9gr6dptLCTq!BfvA~eDJ6apd;A`QZnV3K*%3?e`tBwPwl2u2&^#qB=9 z^k-m2)bHMO?>%?F^KH8~-#ATi=!T9gi0t}dPGVY3jhX>9NR-hy^VqHAOl>v zHqodqUbrmQ0h6U>97;e%5 z5bz$w2{_OsPQ)51U%&MF`GYH)ofANA>}@eGvi`tgmWq8M5^bZGnu%n!}--we(Bom!qw5m!?Dj@rnCb# zB2FB777=0RK&&E004IPXVqAz~6(tyag8%@;h^#@vbzZ_GP*pS_jT9f?+<>Dw|)sr23n34gcf+>!1I^ zZ~jfaw_S9T9NnGoeaGbRFn|7~(cwWa=?yduHnvBTyq{&Rbec@X;L)>`ma9k1^{;h| zNkam+MDaTQjDB64#2q?}WBQ{L-em|}L&w!mojJ621vOM&yN4Ke_wA?Hl9926x!KuF7cODb?0@(v)Yub+qY3@m*KE z7q>RZ7!Tc^#CVj(Vhhje5<*-Y47G1^LIi}WP;i?L4W4YQvBt8e)iSPY-)hK$_ACPc zAPb98iRdIR?BU^PYx~&Ex88Z^WZvt{`sv#~@zMUNqw``$u2eJk^iK zkhd2vU9}mxuGzfhhQIc=|Hkd_e#a|V%qc0h`umfq>GY?wqSwnhz3!ZyFU4dDikD)( zsm*ShZIpiU(yL$n!_PhT)vx1ZhQm=OO*Xf7y4@@_hMC1PB7%TPRQ0*qBw)A_eLNn| zrqkJM=Djt>1hOcl(lo7OfCNz}+=-2hAcmPxNC71TT0k*sB<(c`g`$@tq!0zrAW{j$ zK&VKR#=6jlkoSx%O2Bhf+FC>`(bW4Vo_XfUS6?+-{r=Itts74qIdgOG#9p$qF*tKN zIa$E5-Oh=Vv)3;iKKttI(xDocia87x92qK94MH z&;_@6KtYHO<625$(X`2F7}X$HGzo50@hD!Zs!=7nnb_C%FWhkR5hgc6H=ImP?rvPU zcI{@|g)P{*p?`I9es_ED%4OCj1z&2z$Ob5!{;&ch5eBecjL`}ZJriP@XaYd*G(d`= zoL6?9A@6N(-hATd$-T}kH*NL1+{u&zJK3Lr&y8ZEyix^#2jhV~%#gfFDPxDvzx2wL z{o=ya!^5ea-BiiDw`VMU(;tL4^zi)xARm>=6~S01ASj z4s;G_##Pi20w`jD49T$<&k$;3lSwX-38Frkn40 z@wumwiCIuUDdpJ40=B_d*AvLG+*{9z*Wc>5ziD(;3+-5OR6$|_Q0vE4sN&;nTD@#M zM$KAV`&?>~E~}n}SZ%ExD=3$Sc2h)%=-9(LWT{nGYXS2zIk=(CW02ZvxAAAJo*IqY znM`XZLKcQ*n-dzy#;Ofh13lX`Z%j?>XsgkbmS<-zg7F7jXCk(Hh~HYdZ{#Qpm^wbz8lE4ttbHS-Zz3#LWoSm?g-q%&4;?cFPB2wy0 zqGQ^|bZbK%Km9B%@>yoGyl~2N?|jRHbJj(YjuLarJ0IG;`^?4RXt&c%3x4MNk39da z?;LT?Pe#r$X(L@aaPt#yf8e+N$^W5q)A6g$=1DTNHlI$DPLDk%slGOzbo#w4O;`ZE z%ZPST(=YjmbD#Tv|A#OC``_zXuk+I9^BcFfdcB@#qtk?dMMMQ0*%6VjSX*kPI$7$R zJ3KfTjt|SS^p=%UL@6_qa3@WbQo>a*JNpop8I-AFC0+v)5@-aiBn2^{?79%L2GJly zf<&YMHKH=8g%lt%5i4X676t)ji~u;UZWgM}VL>{H5)o%hxpFwXI=c44YcKVla+|$7 z-~X;N58Yo-k{-YD_~2N6!+x@Nxso=|1 z%n;mwU;q_@5!8SNPzxxJ#G0~Rk_}R;^1&cMgo7cJCC;yn_Rn9wZRciP@yA}>w}*2sO7@^VY9L|G!PzV^yioScz#JsF zN{JMppfED9X98wx0G)sXv?30a1@TBuffpeF6o%lLM_{R{l^LVaK~V8wO^dL2I~pFi zv=Enddr6XLqlknMg+OM-+?NhTj93C8=f#$N(^c#SX`(^$d4XC?l8E6Ul5pl`< z_6KhLg}?Nv?TyVp_`NT_{L&R6!xG}HCCn?6`rt=@_PHw;9)IEql5!i2j7J@n^aU?G z`OFiRKX~e>8l;8RdAD=Z+aGx1>b3ddLEjKEoH};;()rhRwl?RpiBxx#u8~gI+I81b zuC2b?s=R(Hz9%W(%r|8FvVW|O@E7W`zH2^+?r^xVM$JhS-p0{Y(v=dA3?_(_OFMye zZMtdR$mHFYt1vOR(7{6XWEA|E~v5<9;#Iq2Sx2@*ZHmmP3X{$U~ zHSc7dHM#aJXt7P)tj$qtHR<(;*-*7@wyde$__9%EhnaO_q>J`{F{+dD| z;)VunF)lR#(BjVe-9|oO-MIdf7SboYvJ?la0;T3Q7w+9&Evkixi@S+eP>$DO+&(06 zUT;M;fNU)O7~jU+#dt~d?qZ1M+N&o{0fP65Ql;bZytwuBos52G-}BKA{l8jR9%JT60~c z56OG$y=V5RHX)8`0hDVQ2UwvbA_Iy4ZLtYSSEk0CN z;9w?t22JS01x5(q1gm=;0aApNF%eLpwJ2>BA3wIG3}joqP6q(s^3{n^ooAnVJn_^K z%BNFePm3EzK^TFd%EDW%AA*aNi0iEA_)lEtq^TrVmC_!6>pds{?@=l63~b4bWqx*i z`Q_1tq|{f7@#WcQl;@Q5^w9OTwK=N#ducwC?cPRi=UOEK1p&Db&x(RT28Eau86|>> zj7D$gWiifDb!^a2U3uHhcievB#73%$@xf0YfBNdh^H+w4Fxa)ggq&!V>P!2&r_*5p@Lc9YZ>>T~wI&i0M}*3x2{Bcei%t-ee85nYDpQjB0zh z26|FQUIQX7E-73!XO{pF`uY+@sOoGYB80?k5vWsZVM&xY2aQ%a0P1NDjiXr4wG*)R z8)&Vx#z{xrhN41O@v4r?H^h7&GgPsubV{@zz{qZ9W@_^V#ij%qc{?e!V)T&%JSU(I?Fi(`7~qc z!hJSXk&$p17a6q+vsDBHB-~939#zN|LUe>W$MTS;KY8P&F7=9O;T0avW&`P-J9q8Q zn~y;kj-EO)I)ClvlQ&&{^#v_P5IqQx0YX4hf`&;E3)@bDDUx!QyzeBPqnjH?ceidk zb9z1+ox5=5;M%q6Y|PGTlck$C+QKCY(}Yp1&Y_-n=Ygds6?>9R-w^q=if}O(rugL=z<=B+&>7lnEdK0U(CP&{I`cRo0O6KM!wy?@s4Lgu51T?|E_0 zeScx0)7h`?e{Y-!4|k7n4-X#-HU@zt5>QZ4n1aEsP$S-u?+;`~hcmetTr1xD;PtP4 z=l)l}`zHE=a0V+l)%s#$wHHVQl8;a$J}wa@4o~1LETAjxO*&~Ug~SSYoh!KXAs0IOirkLt z`*S`uT~(W~7MZY+3+T$JPJ>*sWMj3m;tF@f6-l>dJG)XP$YIlE&YX^Q@JhfIU@yOG zp=x7VTGX{TAtJ2R@yfV3k(s8qL@yn zr)L-6`|9`3o9OoT&s5(3=GS}Iu8q<3nkJl_{lS0v_u|3PCQ)b_B_78(E$oNi|E<6H z@BTZ7MnkWfHFFfz;bhkD_XhQN2J52hsV$7{fo%ZUs;Gv8 zt-a0d8@oFs4Jsmt8a!$6HP2$0`LpwjgY)y_Wq$M-^nwn;RW8=-& zZeHKnbcBz8`18r+qG=koWNfL%5`ioY5lLnoYhy!ygEuy}uJ3Pd>=xH<41~^uX(Gw- z_;mB;&Tqc=PT{H)-z71|7+I0b2Wgs3Bn(F0^al{E}9Br!}2r)nH4)CaHgvap7! zASDgd%!tr0s=_!4BF!uq+v^pDM%4-RYG*IrdUN~F{hNRK{s*t4A4QG{fed3FBo4#O zGxbyW6{Wm9%F)`|=-}qf7ol;Z!EgNQfB68HKxn_&lc#_1|N1+J=ck*lQVCVntERKV zpZxs!{nu{)sqY*io*^_X4eX^d|fkEUr{@LiO6ohZ>8J%99vJ&^{dxQP_rp_5JfqB z8DN^}GaVG=AiPQ=>ddI~Q?68W0;6-xv{$COs$AvdOYm!EF{Lc-3adi@RnIyJa=JuW zNl)1V&`zPFnRKSV&VG4s?X1@?W80oPNX}Kj# zp0~u>(pA+ELaTEVEn!{`epL-aq)8f9vGqFMIWzXEkfw z-`*?+J+2BcO_~No##lsvNJRi4W@C(aKbz0$dUkw#tQv_lB~Gx`-nny!nGX+-7X?cU zFU!NGdjM7<0V!B56I(LOVr?*mDeIyLMosBporGAHeUS0S`pPxEa^@VYsdl#Z?%W>T zy0NvlySKkn6qZz=o?{G{TWBi0u2Evju16xIUI>=CZ){~YHp;%eezUY%*v4?+P!!w< zh&6-;r3Ue2i{8kZVymdiYGZV9`{wa4zC8Z&Sve1`sf%cgiP1O8K@CMfB0CgJhSWwe z0>dzDon<<0rf+=p{xr_6-P}>YFpdw7tk|PRFN(;9G|uXJI_;G%gt;M70jCmD#7b5) z07Nj*uw)@d%F>EO&iqS8QvfV6rfi6p`Sca3G64}Uil1qU6keE?+lAStY9<&k1<_!j zKwZEZ^1zFeqxa4I`K*QqHqhI~?)5=EpX_Y*4<=0n8{^2DMm>o!8m*|Iph{9VgK~J| z+MR2gBi8un^Oxg`)8J=S!Tq8XZ74Q_ibsQT)WhD;jt13e!wyEaC-Vy^6k0+t2RbXmmIs6ceEp__L$-#6Ez59gh=ED6k2Y8Qi{kfB6T0Y?@hN`No~wUwrbD!LWirRZ|w~b_=cRnpcAdGV!PR zH~BuCU%|HmqTN(Gjo0N)`l)G}thXczBT^RYOH0S4dtO^DDVI3yjbGk#rV?oWQ%BI~ zGS-4JV@E5wlK(Q6THuO=N_yRz(v}+(lW<@3vjm_;g=TYXgLm^OlEn-Vq_}jy7cdG5ogg? zx^`S?TedPc$7IK9Zaau>$HC|xzS%<%!>E(`)M$C{PnbMZOk~&#e^z$cYzNE`0I(5)~<&zVemgm}zg>t>0 zoN?Qs+lR8J12A26R6-Ul*usOgHJRzVUE-#{WL8{l+F$d|TlUD8K?lgr0&8ifYn#Zz z9J5@OHkn=)E1c@uE1B(`y~a4RwRNQW_8WI;)F+}I=<$z!`td*g7dMOk^y#yzDi6+1 z8cR3d|M1`Y5B>wcIr4+@XfktyUKD^aiJlBMv)N{0tJrKPy)hWR{G%WIfBw(^@lSv6 zpJP^6Ui!q_+gn>(8x4sXO69)|v0-Omu$Zhch#=zQbT&ReJ)2A>iHwP7n5{9!IoDZP z1d3SHG}n}`luSxo3MM53%hr~{#!K`-X^V0&Y?|oVM&n|yys#?$a{ujnZ++#x-D~@> z(1O_z>zD$MT(LFij|x|$5N`$u0z^Q82zbB)HPAF#N0}+6q+^L=iDU_+LNP|LL=K*! zST&Z}7%LUZ{T_y8xivJSetB*C@aJF5PT;0>PeCYDkdC-a1z;&U5;mr=Y@wzR^#oh> z-gxT`I5j01LepS6uB~_Dm&YbhS(xeg!m-g9NtJj}k2T%EvqE7Qsu~w}@<|O{{0~8w zH}a$e2BrI510q0Zk?WL!WnEHbEDL-BjAfA@B12$O1~J1B8A7@xra(#-!H|f0)fwW+ z#dv$Oe|m_mJ)n>6z4GA2`9|N3Yf}do1roSqn~cgvgMsO}Vo=#pudG;450CuxoWk5v zJ#>J~9Le_n;MQw5uHV=$2bM7H_ZmYJ#Z-6}xM9a-ui~OI1=*hA9-{7<#u_G#~ zUTIaDxrDiKjwmprH?(Krp+SA`t)1Wb*M9qhU%iVBK@k)eAZsnh*bos&;p}8`LD3kp zjjD)}8X^cdSmQP~WHf9lXyqPVjBjm@e)oU)KlndAJ$U$sKiCwm)S#J*`1)D=;otv< zAO1J~q8n{YHQadrod+L%v|%I&lk6+ieGcWmi}D0Rw3Bo)Qt1nN#X>EXta%Fy9J0UCF7) zcBsz8J51b}X6NawpLWOB4jvbH3o7+3w8_b1f%>C=v_uqQM^vYOIO{w(6x&mtA3p3Tc)6-oQUUNxET!42y0gTMW^ z{_p>X|9w0;Dut|SRoH8ro4vB~F>qmp$Or&12qdD=D9o^ySTUVW&(6-KlZzN5Ewf4_ z#X8m2GPYQ(7a~d~1b{%vM7K~$nZOoggqe(q%yWxbGcWs_JN>~pU^4Yw4rDNx81ln% z=k3?t{gn^zymlk_#)f9M=SI}*kA~ZWtv*lz4zS753=3r;>7xxW0~$bp8kiO|gSi0C z09LC$%vA#^R5VHvv>&)1Z9&vbP6M=Nifl0)40;2*^~UDC>v6L>`{L>3(MvyV$|ks` zFfpnG1rr-q12wA5YzWSgMo8InySHx4?7Zxi3S5k%1mJvj@$|?ED(fa^7sitJ0!H#` zR5i=`PRz;*A~;1P0yF|bOsbKXNfbzms-#r;NhM{ah32~0o>D7@5*9x(E2V=%8wJJ6 zAj1m{l?+TeP$`p;D57VX!#_Vhyngqs<7X#ZU)e?vn>YLP*=%!E9Un7uuZ~0tB4a=* zo|PPNPsz@s4|CO-k&BY+VLy&4-PJG}4Ac-+1cq>s5JJByT;IevA@;6-r}NwQ@Ed>n8{hiQht>5F>^O2`xKhuC zD+t5~W~*ul_Vj%2BO5ptCXqCnKm+sW`n7WjvDZHuk1h0^>Dsm3zx3bxcm9uGe17)g zxa^N=cp{WO9DMZC@dxkU_{vv8S-Rff?zg}G*+2j1eddB(f4DI@JC#y$yJmZz(@KYq zQh4QN*b0JHfy;N%D>unpQn!Egs^A_~QbmMlTKHF)6|%-F_L>$RWcJjK6u?z-xwFr= zQ_EjTqhyAp)S`Ps*b!v9s+C>|>N?v6^)x*Okw@_R{&4vYW%!Q5BhmZaM2$ z-dA^kU#ImtqOMesa23(pid?N0v94p}uXpZ&uk7~HSup>0T>(Po^RYhp4ia;iuxj#L zr$oo3+`&Qzymn&gQ;vF7CDT=Rknyfw6@K0Usl(`Pvvd~JHH%=|ZBE);&ujnYY>{p^ zS}SP+L$VO14k~i>H-|sZj)di^X#2@k;hYKb-Z~3RmL=xW>utr(4jXkyoPnLO0alhl z&bX<208zVZxaBll#Wo$9wtqWEUTqH&tIo2yMInuq?l@X1OeVAYci)~hp{e?362J4E zZ`zHKm)Hk=@rQprd;Dy-@lJFa<1{v7_}~0X|Hjw<^lv|$G$$6ZU)4?6=vnWvF{~nC zGM!ey-J*Z-i_iYw|JVQQ5B|>Iq3OAu%?ej+Z*J{wZWvJ0H2r>mTF==yWsr!7GBdF< zQ(<{LzBoTSo6RO7LaC08E(!oLbBb7RsgtihB1-?WEEdX228Pry*pOi{cFJP5hbYT& z5R`p8+MF3PDeUgOJNLiw!E0~bWfKcu-|Uq)Mmu|jxyj^~hry(Y2A}~P&;WB_7Evn# zAO?}(1ERr{Fa|CZr%`J!0LsEyD3eyersZwIE@MO>R1uiOc-r`LA7>hQ0B8HZ^8N2j zKRla0JHB{)aQ5)oe?(OVni9riED@)AW$Yvc}G*+AyfesA_Em#*h&(AE-vd6))yYAnn&Mr ztGW{y%0vbLD;uzqAs80JVp$E7O(2ni6{ISVfar-{o*qN!^za;U8wJWOYkIOZtSYuv z`UV`}P1*tp)|y_y*3XR0o%)Rt@9k{v?U!2{)a%93kh#~G{**R&Ypb}vvyD-K(xNv6 zN7w*vfB=#%Q0bMGMnEZ~lfhzh zNgE3@ga8IvVkR{pA_Fy+tRWagW5_`*JXEUE0`UF>M$3UT;cV;H_P2lS+aG*$Z~xvF z1_t4<*4mPVRxFBnKx}vfSPfA*@O;XlaRdh;)kTTwh}e)`zj+NsaXgt6y*?x!&L-rF z*M8+|f8oFL*Z$N0<^Q&-=VjrXQXwIZCr|$9N3Y+#A4l#&np9);=+6fp#|Y|8L_KGOLHkH8Kp&r ze6hAJs2cXCV&=wGJKJMdG#kBp-}vC$zy2Lxk7<5#YdCoC#`V_XVy|v6c;6LqQ$GkT_LGQW@I^hCm-E0WqfO znQ0GWVC*p!JUg1ot|>P5ci+2R#&6dbv&Wx3eER8U7Y`oUNmI{JFrlJTPTW)Aba+tq9P8@F$7_eSdJB-nAe ziE_sdu2;p*mfIa-P{5gmSF8e5AvUN3ng+8mCgWy0liE)w=d3l+jI@D95g{=G2sKG9 z%b*=fU4{bM!nZw$LZHZ~XRG?mr&? z{_p?n(X%Oxi(VT`&Q!AqqhbY6qU1D@a-Ah@18j&Ga7)FMLB?7lvZRLK3@jovh&D`I z4G2chrY~US*S`Pt-~9gf_FwCxKL$-@KIYPuhT$9d34GB!eBP)ZzP|?&2um96i1(Y5f4wf z*QZ`N3H9A?eC^@sv71eM)yAN|d3thC6h&Kqv2!)w*#=cLzp&2tx7LuByN8JgUDbGf zvu&T&aFEUbtsqD}38|{mQkIDbqbt5Cd-6zz^xua=x`Tv{0J>V#W*<7Ew@+sxxxSGbP&-rB)iXmrXj_|}S1mX> za&lnSA^iE8x8I&f(({ zM^}Yv(V9xvQK!~t*IDp+gZ9OR#}6p~63biW+*`DD4{DpGEoR-)Z0({FY;LhjS2j6F zEm5tt9jDct-Lb~XEdaFY_OU+G&Xf}vXr1L>LEQDXmfWWRloq0+!)nXrb@}}-al6Ss zw`f_nj8b;0SzjIfvYN&MfcO65;^MWt_hGE7`ZeM0_uj5al&Ej*lRx=*{PbyW zJRVi{gjygA6$$l8)Z*J+%J2>NnL;Wer;U6xLLXnZWnl9-#ODT+d3OiD^(C-0ldWHOyjC+8Q=8Rx7kC>gVzGgUQM z-ey|hQpvew&L!ta(vipjCb^j=EeOUETQzLT@}h3~qrIXWo`Br;=G));$_L;1T0K8~ zZEN)2==$phH-HKVz!aDO=fKP0pPgSkn@rE6dRIwNit9WX_asR7D9mzyX`U2$(p`fUR5oIr@``v-2>$Xa>XToxQj3 zy?@8l&B+%p4nKZ=adj~w9?b-?F~`r&jvu|)M%e_Z>skR( zv7B5?jRHmy86+SmDKkt2TG7AMO%qSa(pW>l(s}ff)l-<%ip7+W5>}Yy2PS~j0LG-t za&;C=>WB<0JFroZs9_eCXtas(=o>7mqOTYjI0XSQVpgN^r~_(0I~}VJzL|w)iVzS3 z1!0Mf2~nT{@Fbd!L5nyqjtpWJGECMOYt>4qPo@Va(LJ@pLAkk8Zfs$=fvOKKu(^jY zgDplIqtVgv#giA!MSbhu#;+CcR)6&Ar=Pv(*WJui@!Q{e;t}_><{;S_(D_OHu0a}Cv{H<)snTBVU%-j*Oxh&2{G+BUYtC(hj3`C3FJO_ia0E65%w&*9jI?IJ! zE}l9!s8|&Z$aHRAy}G;{2n*QqY37*8LAnx#98tMf9xdZK@Jmf09huwe5-pZG^U5W1 z+dfsU>L7vE&JXzzc~_louk55F+4C1$-KOKIygqtf^(LoaUhy%1Yu&_&4F73#+nGkr z0XeI+->ithSG?Fk8CJP=y-nxWO8}Pk2g>RNuOp~^y%X5APNB7>wGvN5M0iE@+xGic z0o>u~mJvJd!1;n~+i0di=071*p=eco@8G`$sZ%DZ^W<#0&XJlO3>LTB%VT1PzuN;w zcY$5a`KMZFVCdMX&#^7Xn@!q%o)UW-{pFRwsE)ipBCSi9l3L1O;QX!?%o-5qp z_&@re|F4gK^otELLNeOkDj37EFHnlUDyl&0=X1;KV`L&G74Pf$d_Eb^#*^7>*6a6G zHTqyIRYhqnD?voS9n7TEq|4ozpwLAVWf%f8Gl5x{iJ6UoHO5$jf=yAF!G+qv_WrN@ z_HW+#@Lrgmy*{kIHX44#U<&{+2A%@XfKSiH$3BebJ`huX4`ibc_0*5gPG{rE{On>r z8S8v1F_40pXLGN{7FDm>81{E|db``@&W7#Vs8EA~S*2{?PSu~PnkZi!Ppe3Mrh(;6 zXErL+W9$H%fC9l_wryua8w0$Tvmw8j@Yco~d#}G9$MIr3J$`ZW^1-vi7bjbLH{GZo zDnwv5!}(z&jrrmi4@{#aBaqg0txRMM3sV4-RgkhMA~8W@^7s@5ffO+*psGl|yQC(a zyNHs9ZTb(SSk%`{m;Q?geM&Y~My{0_N?xmpAHfF3kY#cN%K~Sejl>Evq$-g`luwSw z`r6)u&!2tey?b!j-rFtcWV70wj?V{GxwTd7Y{uOoMq66#db?R~-Wd+|wu+r01`N}{ z1h9Yv&yEp1X0^YVhRIB3O$;FhrJ_h-T?U1CZswRzrcFJq=chiLdw&+Cj#0&vN&zy8 znpl{PbFL`MUcV~)&Q)fxRktmRg#vw9n0oCyQuzr4Ok7@pN`tqmG z?|kqUyn_fBpyurOiP33@6;J|@7{DHm0NLE!2!(AXv%Rh1td0PLX-a}YP4Z$*bY9Le z)9q+go$5?5?~vERZSy`mLbh!qt3H}74zVUN*Z-M+Xk~Xkwe@SyRux${jknaHOu5gM zmd=Qa?_X_lYDdh!%*|?7qNwxAy4X!m$0D0!EGJ(FKkLZP`@F(pn)B1;oR__{Ky;jZ zu}10qNga0bYvzbpZx30)euqn1HtlFmSB|?*@8!hSR)}5_tR1u+u|qsuwP4c2tF@ih zC!62Gx7B_-EZZ84bDL`i;q9OuU&D1ho>u+Mb9}al!WvU{ModrII@?)XLXx5)R`H*c zK$mvG9BJ!pkY7bz2}5TMv^#i?3T9SW1QRS@Sxhrm0AC7zG&%cXI-jEwE~V_psON{{XOEvf`uyR=%LDib z?-8RT6o86PjA&dbigSfGj)#NM&1+ltULW4LW(Sq)75yGNlSoi1Ldu9zy8&4eWjj;M^9hyhBYMz zj{uw=Ok`>wfAMUi=xZGfOcXI7Yb=Wed7~~SW=O&GY6%6DSfgrOxTGxn>X3|Pz@kDaz39-LkI*RQjlj`E2e5@#sYwEV(>=A#s)-| zKtv6ZCo?6EY$C`Hx7^JeJ2!4_Z)_IMvCgN>d42rytbhA87X_molzo^ITW(>Xr_G|ASy!;nurzcyZy(g!0X2;5QfqMpc;i&>8CRSl02ex2C%%GB4(HO%; z3B_E^%#FCe&42aZ{VTh-2G{~HhMlPi;HD@oW`Y`MrZ_r1`|??FVdBf;*+<8IPNf+F z1{y^hD>6PkW0-{zK~zG7SyZ{}^?K(~3d`ehos{MNaBwodxV^DC)8;#W_WOVMPyQ+D zCWIITgR-a_|M4IH@dw}k?bBvH+S}W@^ZJWle7rRrPEHSo8=I5yX^f%Gi$|+R_k8zD zTU{=mIuZeyvPH|RWXUxp-}5_4!%ByXmR&Q7a}Gc&5?hHzi?S+L81OpsG5vG>e!LyJ zZAPmhxn1G1rgkqRLbBW0OG{qcc`mp+h`llpidLW17rOdcYU91n<@J>^G{;h|v*zF> zchVezSQVE!gsNSADIX~3ko?6QlJ?!!yIG}D2QkTgZ0fM5e+;Tfi z+KeDBj>QRA5(Pw-jb#=Q10s-c@-el_L~O|#VG=eey1iMPHwcy^%kV2go-reGM-=o@$#6hsKpfXT85NK_S02?Qo>0AjEzD#%( zel|aOVR!cJ?fV$*Dizf0yZc`o&cgY#C*{z7_j_M`e((pA`MEIzFU+u{;=n|tOsX2i zi^QTT85Ej^z=f+=Ek!YeUNxYynbVosXzsng_pRUf;JvTCUW_c_6xx6l42o)$NCd|< zo}Gqg2eTI!+p^8$ox>jodw7$FW9LRNQFMY}5OI3wrLLknCBzsV+a`iUH%Ftw8HN~R zggJ_^s5Y@0j!r@o3wrZ=-@N_aJ1>6t)2Wx9t+e(%%g;Xgldpa68+I@}Z)ESSH-Gdm zM#l#SyJgki*g80PvAwfd&!(#Ctno1rQR9O##u!IThN6f-B?*eORYIY%h{-16RP-=y zpae|@0b1PqnWX?udVpri04IUCOnbQ~vek+M&>}bT@=7}G@BpWCuqYvY3#)1>We7kQ9!r-A(KBVEtNFEvYT;Se_S)e(k~ejpj$4bmadPRS zwIC&s&Njgv z{Z~Szi&aQ#ZS)mkbb06NzAv)0{+iM~0U`du) zPFsLmO_wr5X}&Vosgp0)oXYFV1FIx%pLN=`jV~t~q3t;Vi*vwbx5ykb2qc$v)jEWD z#kfLn9p>!Nv4v;7O}ce$cc^903K&%_%bqPuuh6oHWjWa2=iz`6>Vv}}__KfgcirChMbCOg5Mb_0V@fa?rnw)on>>8-U;Zcm=>R;m&J|{Jb5sX!jq%=F zYl$?*Xqbwkh)q2?A0Hnd13(lKh2gR+ohyk{eM6+Q+#;cuHzvy*hC-P=g8-1Q8d;pC zm{YV9F`1P5$HE%2j$IWBM@4BzgZXCf{x?4y?G9*s^7Y#{?f^qz3OoRQba?b+f@#^S zwnon$pM3mJ{s3pw$?3VDPPlF=5f?!s(bo_qjcEfVr0P=9I>XFOL~LTLg^2?nUJM@J z{OY^L_MCHwkU7*~s~A?d?%eHNn;xD&ef0Rr(`Qf4KLgmZb%b77T-)2d_r~ituI-G? z>}hOzWi{LwltVWh87?7;s={bMUg&Jh17nZQ!o~R%!4`#8LBG$tH#aZNpAIW7z_IpB zD0@8%_}O?+4H`dd>WL^ZJ2ucrJ}9vRSdo&R8C5kJi9`?$M3<3Ji@aP4C4)sV30W{; z(n^u;?hQ1>;In}tu;GGWEDR|dwMMK38M2n0Ra;QeL(!+I$7O+{jAo-8L@(6v$GPn|oU~Zf;(?G3swpvB4-JOf5Pk69=1{@9plrabLgu(ecMW ze*E~+Gk7YBUW^P6$CXns^(553Zt8J;c69Re%k!d&Z@z#1)?2sgqZ2=$*R%QH^|$HT zU8y}=xA~P1r_FTw^!Sap-hB7n^MCP22hhGTc99`fRaMe0fF+s|Ai(e$wa@t%dPC{Sc-$?{(l+#y1KPqn&^-@|EY8(W;;Y@gH=_efX%A} zN-lA7WiGeopozCq%G9ljLs(mO6fXPSCFXdZl+j;}H z{p2vTfVF?|3K^P<-Sx?~z|d6+%sRRA(L0((+kZRgI)>Y~^2Qxd*SlKR34gf?ktO;VRcogcjnfUYoC?++f~W+xa)`=(#zT z)^;e(EVx*j@iQu1l4D)XmE_}yE&^1f6U-zE zK>2dY2_aR#SGcMHvn_iY!~Vu_rpkob+1csKmqsFKjEJ>H^m^a_3xB~oSH}C@18Z#jCH~y2qF?sZ8(^hQkXf#T;Oi&vzw>ZEwO*1(^KRY{{&*!PiD-rbvgN=<1 z5lki*m)t?i^h4Cfz{QktGox5rUv7!;Y~M^Qu1jx5HpW<2bE(zf{qKEq>(-8`XYXFS z_6A{)w9+X5^5pPw9fmtMG!L_Mz25Y(GbKK4p0NvoZTD_ zLZh>bCeGu|*519>enSrGPk;EyqffrXj7(G1v&PrK+1_kAx27DF1{7nMhggdk=Sr_e z5h(@$q$wmjszgoc-XW?HB!Dh+?l1jHTgnljB*X;EuqIlAf{9rz!&o?q$}okog)JQl zBZi}~!4>LyTvpbVWO~kQjs`n}Ef>oMO#nYTIJoZjV?=+e*TlKj-k1_&GkH9dqsauv zb4+TDY&Isd`Qgdoix*E1j$V$Z7eNKA*7hP)5Tj~T7R1HDr=chThf{iTTzveXD%2JM zwh@|*wt8E8gT4LD{cGF%*LF6CqtaDh`R4u2?c45$Kl%8R&(AJSoUIBo@X$C3&Twf8 z$Ihduy-eo9CcZp5xc0^P*MH-^FqzK7lau**F+CsLc>{F-qyP51v-6*gPwCBjAN=$u zKQ6-PBs4IpMn!^(C_rQ^JBqL{8yf>sALeI0hhl(QURE37<{O*e{|kTl{&(JkIR~Ft z1CrUPbuNYm5e5cx!NJ+&!Q+b;hZ@D#==mY|+Uz-=J!pD<+w=_4NxxSj2niXr^J#r? zeoQExv9l|D6#YDO*-Q=8;~mk0gi0=J_SQ5G+?j;LHg(kw28){JGXl$6yVs+@?O4s$%` zKrWxI3*zOO=Q&e7V@DfJO8!w?W~gy3$BlwPrPlJ*LLqv0vY{sjA6MX za?Z|qHy^#T@Y=h8mXDDsk-B=2SRc0?I(H?>8Tv}SUoxEM1Z-Uk(rpX?=F8D#c|m|x z_Q-*uOoQ(XnmJDNWs+pPx@J&XXB6ofC{P{eHjS@6YE=jL|M^x+^$IQ0FsMmChwg`>QNG z9~B^GQcfDG5jN3U@5*14^4}S9V2S50T zW_1Ch5;+Ka&mmCo05Zc4Oo@&VxrP zIT^fR=gP9`5Bp^`s0P*?c~K`r!GKN6&l1;l{>j zdtjg8&Slir0GEr-=$d+172_D~Is+d$Z|lXD48)Pae8`;BYg`0Ahf;P}bG z^N$}MKRTG5jA!F{e`BcLH;qz^D%OB3moO@E9Mv;fs2Tto8KQ`)0+@&hihwW@{yC-S zN)AYEN(&+bVIoU#%+`n{O&+C2YdBLnW1U)46QVk@ebXCo&j@dn)!y#r{?2B9U<=2k zDUBbT9-R1E{Fx6^*gnjzahnA<9Om)m%h@CZ8Z=Y!C*zC5$@$aqZ0h6OPh+ejRcfpk zA2n)_NKrLLMWmn_l@x$81+gVlF!_LH)_AF-lJ@$8)93Z)PoGD5$cR<17!3x)eziTU z_ILMcveX-Cr~?(#x|vV?pz7I(#&E&p$S_62un}P{@;v@mfA5dK{k{9uF3oW^e)Mr^ zU~k?*G@!xmwflecWm4qbL0GQC_&EbfZlv( z=bOL&&YSPu9_;jCo?v7V>oA?z(GWfuAq2w7_~Ogw7Z0DC^ZC#?I3n1}-M~Tb@z0O^ z#bCSIKWPr5Ml&dZ2(gH6axwGu%pd|{h=WQ90Ybg9@MmZL{O|q!JHP&&yTAQwHOM1| z7>cqa6;+-2AcdQI{gv;1=WqY?^Pu8FWJ_q8mye&`C6*ACXnTL}QB_Dy#N6-q&yG*} zgM#R?uv0R2ND8S-yBre%f@KA=wS|v0X_Y?Zf{9kEz_dTLF#xo-Khv7YW1&AS_2pdZ zr41p*n7-51(UHl`&c3}K{F-m_t@6~u++I<3{+gu^ZjO*#N{UEZ`LBg7HyL(tn5!1+ z>f<^Li%odd$FC!%JCwp|5`cB2X?9tf3-=ttHQ>AFiiILbCZ~Je2{QGm1L2h@U00T9 z{j2P#vp(gH)?sr9I192_hi_e_xRMO*_p1s)cZSHRi*9hwVz`_w);d}AoJA<}8bZ@! zl5fl!!0Vj4K8u`ta^B5XX1-e1ms8H}Ei32Pqg9nO?>Xnc^##+8d+8do3P#=xOPg!T zOQlPtHeW3{*Z{&6;hao_L^MgqfV_oaWP7EmDppok2Pz^9kSbwe`D?2&wWwJ9msH-i zlN<@Wj5E{KO_N$H=_1_f@)k+6^Q)>hO*0s6gGssYWNzMl6V_R$*6ZV^k1?ysdsfUs z6D)t@PyN~yS`z}u8e7k5YnVw(!Uj7zyZGDxm%o7~sQ06?+S%Ni*3+t2iVrI4H4u?P zo2I$AxEPPmHAd&0Xdq^53g;X%hY&=>T8mI4RY+2_8mg)i0heM6$d=oJOiNodlBt_g zlsSP+BqjnIitIwackQkFfl;Y^_1fMhPyl1#^V$5P^YgHC<7`s@%YXd)lP?}t7qjc5 z!RhHKMByXHz#(!76a!0?5J`npArVVjroenwK?KlHu#T;tahO~@fA-w;%0L=pwAQkU z_+W{dt#2X>mu2rq3NFeUufKlx{#&oV|JK{z{OaUl`tdJ5{ruxk&W}!Jr*(5Qy&!#A z6hALM9`5YizIXT9-8*xr5P{hR)z z{_>;GKKYZ6#|IY-Vk(_fPF0(rK1i5bu9BNP5D6e+RbeuMsLD*LstiemF#*J7ie95I zNt;@5q9K@N2tSA!1XdmlH?&rGg&4<0Np8SZU#p(j_wV1ob90X{D|_+gt*wpS9vYVM z=9f{M^D~*z?64WVUSNdLjg7OTBj*Nz%cm!kCl4MUT|5(QyrBzYW~y~G3JWGR6rqtc zq&r$7VJNdM&G6IMkiw{v3WE$=wrp&9JfAUF#`bJ!pm8#*Cle)}#^y!8_X0{jz!*n} z%(fT|W+9qLjlfWFM3&SUGVID?SbP8c>Dj;dM<0Fv&wRb;`4G;Je)f~=p0RNgNAi#U zi$D3V{_Y=g*g9*h8w{Xx*2pkKY(Wy0QY;ifWwx<9f$PxN!p)#3 z&Gh~U9}KoPXQ$K373!mj_U!o!CxWQV1rK_*U-@%Yrm`$U2ziwgRrSFWWo2wh^W7l- z&=JSEq)2GPnka9#&0H2NUR=%ok+;FBEMBx)#GWM56;)M{h7!(!e) zt(mu4y9}+y`=)mdn~rF^+#xexPrbavr&dFvt0I_N)TN2!7R~kk+ZS8G-9nxVtX$z~ zU({8z=(^PF462!_6`2I@utENlF5)^a4aptVFh}^ZhpVHw)`k0mqt@b^JDihu-l9FV zwClrkDADIz?gq?rp?B4d-uJ*iH`(+D5>lD1slsPatm#1Gl-Yt|lA>@v*d{v|rGD~f~fG?ry zT=AqzIUOr?hOsLt*x{x2-Fy-9^3gS&J72mvqj!cQqNLh(91qgen;`vuA8b(+YKz|H z#$19ku84I0^1z806?W#}e1`4e?RVdvFdD;k)38%EAZucbCTc}|{KcaOfB1vGnlgrA zRVG`M523WSu4^bvVZCoIE-uc`Per7#mWT>hwdieWEsILftpeKORzbR09E-}MiA>9V zkQTnYmvd)Uw!~H}!?Lh3Y@%W9_4i-96GPKCxNk84Ja8!Z^!#kzA4YXQ`@xUL&yITy zjo3^Njw(YM1rjL)@}9g$2#{bzp;1*S-R3W>GfK>oN*t*Y3>nKrG?xJ}#Rf#G#Ap~W z0%MFwR3@oIGnp|t6!nvfpMLSvUx;&?J9~Fuzjy1_o&9fo=f#s}hfkh|=@gS0H+DV^ zFHQ~)9*_BlpKrZ>3UE zg)z#chCw1GU!FiJ!)5D>x^Me^S2=-eWZ>-0-R+yZyYIa925H#ZC|-O0_UKv(27G|G zvzZKCaqLlOH9ee--YC$+@b-p1=NF%!e);9|Q$Lx|g(rr(T0>oUsbI<~g6Co4y^j>Y z3bXLHi5jDXh$e+~Ff#}isuD>e#b^|)qEx6vs^LNkL9zfWUTg|T23V`lYyI`ezg)?|F~&;G$j-~Fv`6k=p!ci+NxfI`y%0RR9=L_t)B z!i~8fd~?B(2qqv}uN*CTi)W|J!-MgIXL2^%GJ~S*L#PSTGd=d(%~Kpbl7YF?GyAjC zi~inl(sL*+5FrN9K6~^cIh7KTL=h2V*Z`rahef$5`tU~|9enoi=Kfy8G=oZ7bjAc= z?EQu{*IvI}4*FqS2k)J&VvzCiX)~U>-XItjW;Yzx5GA-`QTfRv&+=^lPl3iDf|5#9 z2x#Sot=#}+RpGmAvnr$4MP9q}B+Zz~x|SQT(s zebP^@6v%IW^IJ!(io)E7wKI_xU9|KoWlpi*E5RE?m#S)KYU`eO`9E6{sii)=XTzAUhF=nOD^$|PTNN4oU-+b;^lh-!?`Bls+YYEA7 zP}b40-m=rUyF8Xhc3L@R5i@H$ja6eR(V`f2PIA@DQPPK$N3f&Bbhw0;=cg;VEyt!V zbLMw?$Q3)vR^63&&(~6iS6XGU#d+EwTJK<7WnN8Be#*>Y$i05)6{m>K=N3^WJHi5& zdg0=NKJ7eYI}0x#y-mnPDYXfaWG%1M!dv(|Ctzldp_^8t{hV(EZRf}qV0(%tT2vGi zQ2+wO7^|uxwvkLR97g8?#Hx}Hv!ml4$S8#v)bFPotcZwLohLv&Vi_&Hv^5_ zG{5-$KcZPfCK8Kf9`<^hqrNpehWo%4 z@DTWPa`r-{+TQ;1qvucm~(p_x!Z}!9P3t%D2Dv z@afY(`qA%SOthJoMtk1FxN_QD#Hf9;so0VMRHIOhBA6;n_4NLSH^2Lv-+%AJ+vP^| zbmYi`Re~y$hgxF_9$?NmY;atk{rD4eF&#EixB&pRKuN!Z{KZ79E6Y91w`R}y#V7Ur zVlZ;sO>LtZh4wf5DAL+8i0;vs&zNkJN&yQ+4MYVyb_!;)v-!YQU;g07cfa!u6Btaj zuPs~S+<8;S5T&fDovq&HXncGTqp!3uA;$6K;^k5K=0>BchRV^Xu~wro##n2;_v{KX zi=ES28`4L73Wwxe^7{HfSw*`DQ}7+N77Buj|TIE7Ur# z>oN&r$DuIa_VXT60h(42wDPxA5OW#Vj@Xe1w6vkFi@dzsTw*Fg36v5Ya5@7Z>GLWI zqLd<9lZtG(^=B z0f1J>k&FH-iJPksomY^lA{`{JchwR%H=K1eOq(O3gRIVY`D;0FIq03&*WbOmXI?>E zs|EhO!+uhW~V#u%M*S8`RmkI-^+Nl&X-=MhvQLdJIJi>sDs z`y~G!T0JkSYMcI}!`2-nYqoi<^HqBSPG4u#Ct6mY3M#4`1;#pM<3)QLTPUopdW_&_ z)5-C1IiDA*=hJC9==XNEc%$zNZoI-eQNZx5u1(YI7nPfZkN@aT%&gfcdK3e*Rcn;h zmE~kU>z5Un&(F_KPEML;ZjDK#wARk&^CXY}gb-4^r*jUW#_F<4^H6k`diou}GU`l- zY!)e{5en6a#pcUQLR=23{-Cg7etU1%0Rb2TkEUbo_0G>{AOG;j#l-g`u@{j*K!IhV zmJkplBvSAiQ{I-eZ$`!<_dFJxI4K)qNQ@yi%p65rQOxmM9#V%MVd}$ULsWcWGxjoYMji;VpO=^)@XNcH21Y2PUp?@r$4WG7@mMujEb zytQ}#_UkuxHb$k}+3DYZ=l1aa0B$KtJesF?__Kqfho^BG$j1oG6@J>7ql^2^4Q!&= zuiUniKFv5zLYPwY(UXsaxzHHao016DOC9RDkQb7uQAm_zVR(b8N~91?REdoU1IhV7 zl>nJd>$K-Em;fdwg+?;Qh7b%H7Lw3Vh|aRaSQ<7YktiB1K%y=hvLwgn7eiwe?qU{7 zl%Id;fAG;iYKS5iV$~_R+tcJ8hFZs#t!{o|11C6-S@5!uNN_% z3C&#z07?R45jazDFqj9-EFO&yfAVQ>7Rsnr1fhW`TvY)*om#4QjvtNB4t2A}Apz%4}sz?=^M z1c1{2Y0BU9O3Nay686SirccsU^`*1TE;jbHWYwJ@m3-Hw<&9;>u`2uZ@^&%TH1alW z%Ury+pIhJ4j!5nN6U$4;(D+s~tm`ECl=FXft~5JBC)Wg0s>&P{t+Z|5)l5IhElQmE zS>|ZWi6U6h&hraQWP-JWz|QAIX>5W776Qvu8)OQi_2)&(nvEabv_+h zO(kY??B{gq46JKT4>>K@UvB}*uN7o1*;Q&UtLeVlemYjbc8Em{-__w%7e_+LvX-`7 zc?oJdRmf##)|@0Q%$-4(gjpnspjGuqRs-bQ7n7>7juT`|pPwUJ40H~cx%)-#GeAp~ zF6Z6c?FQLGLhISHreWuHV$JR{mcDb$%*l+O{7S7!nL)usY%=TYGB319%0aV`uX*$$ zFAjW^PkC{3#GIF4prt!(_RWgDIcK?!VK^Z$YRvd5!(j*lwbllay7pC78DnZuEsAKZ zSSu0>Q9qg07vm8#Bv@-NH12F|4R?2+i$r5oqL*lcDXOxWPMApN&6hv_MWwJRg)_|T z5n}`qxw42*#5kQ!HF!&Gtu0CmQAwp2MHLI5%a%;Mw3xOmlrZqB3R{|%YT_}~WTaMr zQt${7n3N2dg;+^;cQ!|rm5cd^Q34HcAoa|UGsWqnXY&^?s}NiW&_GeuHxfK~uT5YP z5>X#iVoIqEib`md2rwRO6h%~Oq8dwv6dL_3 zpk|mx#K5p7@6Wj*)EWH&1MG&FG7t_ z+fCY@LxU>lBizDLp-A)OCd@OAyO07D{E8;7Uz=`OoK%%BP-d6 zMM_px1R!YgbR>{%b41gkYy%O*$A*}q21Hrp)0D_Wji@CHf`T<7FuQ011!rg;0t7CY zT9|4VcyAt+%2I*`c*9h&wLaLIO6OF9aXhDSW5(r{-g;yB;jg~=E8n|M)y!09Ugt2; zSqJ6ll?xY%B?PL4qQlF1^YMfE(4ABT7Skk?V$L{4LYy5ClqbLPN z<~l>ETQ|2*5=cde=KB2E5#*-Auq~!_LnfU*G{k0PcvzIy*9Q+C&dx6EX1@*|)-YSI z8bHRn(xUu z)}mhRKh{>}%cX#bc)4_4MJ9i9)k>E!I;~`+EJ%p4yvbZOqqL*ss<7(f1l^Y4rlsj5 zMYU^YS;z$$t*T=q(xjD-Sn7PO_iBtWnS?a17}{FE+7a`9TJ@%5L2QL%E*Uus z{OH`;cY4V2(}Ix;YpkjqIYp3(>|B3n$=x;bcSC{50^I1SApB1 z^m-?%8uAm&<*DFOZv&7^^-iDdN=|vs+Xguk>)HtnSEbBd$7DXQeD&sCwLb5yzSxe~ zLHI9uI*r#k3E38wpW)h{I?a$R(e_MCM5@ToD#|Miu&z6G_Q5N0b>%m@bbD&EH((8` z`O?L51(NBqYx|ZY3!jh@kSfSKqim=wVVx4O=*8Koif9y71rvyS!+}^OB7UC zV2I%3v&WB{$+(Q-oJ}C8UV0#^YK$QrI*Eu<$||~IzW@I`OZ|bb{8ho4uBX5P42OLp z=`$(-$zm!}6GGF>j?Zl4O+AG~#K=)el%q{cI8-CON@Ugqt_6Mm4|x z-t}Moov+?`XWI;Cwm>wX=Z=AVB&2Y#Kcya1hp|{}`YOkR@g+ zoN=}I$>iz7hkG}7)oG04RRTyvA>v8BG396^CPe~Th+4tyV#2B*tA^PcB?cKH66!48 zr3?8&u3c^S$+VM|Y=)AhCS|@9Sh<~yvzRBWN|0Q0QdM2O6mH*2T8XhM&ZErCNQ&l) z7Km2BEoEQZ2WKf4^RCic?e{rgdYPrQYXQxrn67GI>knl)3R+a;cFm5g$sxq5^lXRg zNV+Sr_rZ*}V0?QUPkezfyb1|G7>ET~)AF#?3UDE48{ylOa=1m@e4ia^Z+xrc_uoQ)p%$ zNAi+H@;L;sO#cqzMZJtmQ&p}-=BR9G(*oHsP_Hle&hltKaOT$CGALyuc8J}gah-AV zS8|R?r&Y=B^l9~Aja3GX@p4>&F40dCQ}u6ARWFe;yKgE40tKycP!3XOtPUzVByO?6 zui(;k=3e}?_|uwbR~jck+6{=9BM~`EDYt;i@yo+hu}TyQR?x=wHjGu`7;Btm4E3tAedCDcOV)GQvhUf=wg~7-(P=3>#IID-mz0 z0DvgW*xVZx8)g#VN~nV~GQT*nO~YQP1{)TllP`~s9~=y~2e;q2edEqvwN;%xp7b_~ zt!rCbJEp9l4x@5&bAR*r!C5%>x3+I=-WeQx_Tu@+k0&oLDmRR?V0GY}F-#F&5tJnQ zpti?Cq-tTE+5!Pld)}61KQ?oo&+gy7`R={Dqkef~ulMd(-y7WpSwH{}oFn`KU;O;V zqc5Jvh9=YI;OOM};lcTMYzs%$)QyKCMmTumXVLFG`TYF;yBi?v?2aa*>8P?7vnkNP z1kxzd1fw1%QVhzG5g|e%q(UhbYZML)jaYgns3I;R>yiVu>caN}+B)pVbcJkEIsyr- zOr#8gF1Ax41Q;R+Knh_*A+U*FydmMV=ps>MA_Lmr8_h1xjB3xZ_hU6$Y!rc~vAB5S zE4RP*+rN45gWDL)VaK34&Q6@Mm@&M+IK4QZPpgfMjhzCJJ{g=(@#JXoi$~$n*fpl) zz8DGykx88iHH;L{ZH)U*Kbs#t>lweLh5|v+01cUXrsLuMn`TUDte6siLue!3FAqEjq6Qhz+0C~pFwLK+7sA_}+h#jAv*;E~a zU|f;5@|DYXC0*270GUXktaot;1b&^A+DW);w-NfN}wi)*L^43KWp z7UhYwE2P%7njEWWBVkq%wJ!1Vx#+4|*{b6?O&71M+In(?>zZy#M6zljZY8_O3P0o* zusOL`P?wFB3F0m!9pvYIw%@eK$)Q5VnVqSnznAHvR5b)KVC*OjA`n7|Q-1MD(x^mY*W<$+4 zg?yB}pLYMslliY>zO!1|W^KBt&i6T$b7SXBcQ&O|5xM?5|~vuubss6>K@Zft&RBsGAt0A{sWit@_I6RSODWs4P2Wq@tJki^%Wk zB-y>%cNMg-n-YpauL*%c$)_;_<0c9l3GwXc#41IA5tilbM5C}oi9sbMb15XKMp8vG z#v!T#l5`jt7+Qj{fER&?DAfW008#M5;F=EP5GX^iEDxA^HV~tv#L4LE18F2Eys8lu zOHP^QA#PsVH-kzYf?zt6x|vPS&)Cmx(C8&b3M$E+w|+MM#nYcW7?m6Qo7Z2zv2lH4 zeq0~+d9c;rzrHcrf_1p_?q(Qcaxj~Ws@=`ad$;Z!eR+8Defv zfr3P}wnT`{%v+M4DGe#r&E{tB=4&_Kc;m+P{f+(o(fxZjN7n!Ylt6?(#*0tKhhLsv zJfEB$&o9oW&ySB!#^>W^TEo}c#M#uQ$5>GzBekDXz>5bj?l&6%dZPiX+}PWGetc|L zBP2*25h95vjfjDwQ2Og5f*=Zolx;v4*;o^e7Pc+cRLDvcDv5LwJlIK0Q4>w^g~hvpw3}LS@l-OeuW!?CjGoaWoxiS-2uqjq(!9s;ujV zrKe#)X8+`=fAr~$<1J^lyq_4;pk%h5=fnX1xA3Hc9r)1Odk`zg8H_i&d zIChpf(4#Lt|1~8;Y(NT|Mnps;qdwxF0^nD9zr`yi%nu`q1(hKUEWhci^hlBH>JFiogtZD@+*bO*^x z!Fnn8bHLWgkwcYr-ZcfbA9BcFHKUf$SH{K>QG4*{{B$L*I`cwC`dqKb5tW)3hKY&#!19j+tyRU%mPhf?Hd*A*jX=4HOh;;Xuldi08dX2>{OS9Q}auPk3| zeN7T7opWuUT_>AtthUdb09Xd&x75vT=`H>{NV}3j^C{pe{I_3nmZ2?QBwc`0Dda^q zP>7`ZLra!0ta=%OEh6BR^djr~Q3t~kHI0(~TbArqqLpG-W;L6YtazQ$`egHMjxHY% zEw*}Dv}e^zZ|(>J8)FLq3|Nq#&5bciP&TR%(ZOJp438wqM5IK9!5r0s&W?^@3`K=u zFsTYbje<258b*v!G^D`oC9unS#H++zLd7Zh41i_jrzJ{PY9lZEq9ul}^g_MlUxu=P zVO>ZymjM6)@FHLvL!3|QJ~1m0#i)8j)xau{NE%5aG_oXr#i$aK`!Q);RDKd=h1Ccl zB?yUJLPQDFbih$IN&pEdnYi$115qFVFscODs6?tnFeFTkA!Sjc1aDBr7>zY-ikd=i zdtZx^4Wgi_V`yTSPT}Vof(9A(2D51+b+o~$5WElbW;_YcK7Kgd*?j%IH{N*X&FOjb z@#hamTccaAZEszNG1$M>yS3SC4skj-8}_Q#Ub`Kq^3fmv?CIx^3)i!1=F@qEsrrLP z8{haoyTL}^%!5oP`#U@DzV-gK{mrV>yZ3Ls_x^6VwZs7dU*N}o{P>Gc9+5hV#gk_T z51u|ht*6n@B+SH;EiI{uK1PjRqf1Hg2`nsi93PD_2KqqHM#8mg`||To#F_>kh-7t+ z;NgQd0ga#zXar4!R}KmVNrVThs$cFnDQ`Og=_+54ih8BeRtj2j;W9p%70j)~qT~=w z1T2aU5Gzt$c2+2v2t`ywxQrC2}MovM?J*zA?r| zPu2~H_u^6U@3;q#X)sv*KMfDj_X7($R3nERWf011?;Gr$nnJ|x9dK*l&`tGw_PSW5Keg30Bk zGSW56svfptYF&NWHiXN(*Vfv$+cp~vFQ0`z0nLX{)pQTJuCmagwA`gMNwbj5`?K>( z?h;C?9(U_%Sw4~c`}EI_BDF3NC{x5cTG4t}vWytX?=bT=?N}WF*Up_+1y*|6Ge9f- zGuhNN$t~pLTBV!3t9+*IaGkCe!_f*|+P5fkHf;rNt_E}z%A7#?aO*75cDqiCUt$!` zJ6TaoUxkQVIm^GKHN$L97+pR3x{Av zSiXdkPilvX`HSt^?!4ZDx~^>H(6+Paz`qV#4)gl*z7n>aaQWvHth>CJU4pUvoEtJ* zmc<&Abb!=MX{Pp=y=IS3yF>bCr|g?9O`+{hs%zdnIfmQLlewV1+}GvrP}al-L~7VL zOGKpLsOj202*4HsqF7ZG097fNBB@}J%Z8LWVtz3pP}B&Md?=G~5+q6jWy<~i+eQ8= z3jWe3zt9IjOVyT?6e-hYwiT?syZ8_y$XZB-CZ;6#R5}>Hki-n)A2@*=G)_!?|2}49d!~2{T_A z0*OMPJgeuSDZ&YC1@vI6Vz{|sj0qYW0y7&2i9rwqq7Xq4#E2LvLN%%=35Zk#WRkWd zDfo#}POLUXE=3gsN@j0?8YKcTSV63;nlkCAD!{CZ`>(VT1)O$}2*3~nY9Y{Q5D8)+ z%=O&YRZq>pzxVdFZ+-u_U;FR|Mjqw7_Or5Yb#g{^09QCZJ$(A|Vp5MAf9v(TyLWG+ zUjiOpaB?wy_;UWq%W9@0Es03e^oU8Nuw`sy=!TF1=GA9EJ3W5ZH`t4Tl_CtoXi!y& z8fIJjBb1_Ozy;=Vc6`R_AcQES1|W*j2%;h9oL3bB5el}mi?LNA0SQ4#qZnfuCI%l0 z9hN0T)L?OHB;`eA`ODo{Rok;=R3Rl=%10tYim(j7baMoI> zdz34`1&%W0)#?mm0D zqpfP~(a~xK(Djzf3pBKlgyenGODLWD>r^~t-D;EdrVZQBK>oBz6 zcO?5dCNF2Vs%T6+G?Pdr6I=AExM&P{#!p!vFOt>v9# zV%w}Uqt1b$ZJ!LEc_e#h#Lj$?k+K7Phs9NwVcn}b^g2qHU$Ux7R!VN2C~eQ}1dY8c z9H80e*kObA^>)p7I$ZbiNzZ}`Oqa~F$XzO}^-xvYgCnuRz!(FC#Hdk3RG`X9x#PkV zj71(tA0m@cuV5G=sQ9|k&AZNRs!JivR-)^3&HCa zQ&rW>F4}okm05;TGYu9+gJ}(Tph=btVVMRFHUtkCRxzrw@Ig#&rZFX87YR^-L}(z0 zN(!e@kg5nNl0G8P#UY0lo*wDy*nj}og^@_WCPI}AD=CDR`YDJ4gh&M`N{0yKlt`6X znN&%G`X)9Xy!C;UQA;pD4x)Z?aqj1yg9b-hOV7GEs{vHTYOLoM6K38V^y}G}n@|#( z=J?B(XHS0c@vR%TZ@hl<-dEo|Jf2>-+3wEf&TcX2V{jcC*ZSkr{^7$T4|=bE@7~=z z2M-Sp9=xQw9*V7q_wMZ8y0g8#TaHHb#+zI3y?>{w5F4NbD<1x=e)!q5$?5FkEIfKP zesT2Z#lf?wpTUS4NC8+QB$L_H7}FnAh%%qgSj81(t)2}9iW+b>8DEo)Dl8$%Qr zY;K)DI~w$ds4qk!j0c;m zm?&bcqq!&QW9kmRJU@6G>iM+-n@kY(&KiM0l-VfL*6tQqVr&c-emc82n^I7Sst8gh zT7Z-ck+rrFQC^g|@$)*l%o>GPWwsJvECq?6imU-tnFN}2bs~}wv@DnzYkq5~#bRGt zF^K^SL*}K>?5IKQhjyo3-`-`J?`8E`X;peI37U7C%dFOdkVlE+kfbj1yxsXmtxMBs zvOZ|0UFGBE;s94klU!T9QdH%$Yh_Ir)J#*%hv;}aBFWd4G`f-m>o{5Gnf67inQDmD);VyU zZ)kDCSV@e(4voH|!~9oWM&}`;LC$sy{AN`d@=jQxv^cS~3#s!uL|Y=Q&Six~@*DQN z*`f_o^p~UOs%LA}(^W(LI?~&B^PtEajaLHDI=SN&tba+tS3fOc+r^yYe4Q=;$S|!L z(HEWYA-9hSv%OKLYqELF^0%UoZ;Ez;ImYkdd4ccvAtEj8Z6cI>XKCS>s~|Ff z03sv+goTkZ773IQMUAq-jKYQZ{d+fwg98YVfMzm3KRT`FlL5%8oBLTExin0oO+6(= zQ7|C$$*~fb)*0hel!9;*Pri6@^5EqsKm6pY-~8~+x869No}E39*KY1^?>Q#85^uh} zJKx?t{QS6%{`PQxviJIv&%SIXr}yvQ+P^vIZOCi)cHa5QwcZB86oz4dFMd}4^iMu( z&Y-@0{^<0RFCH9BXPyCPVp)oMk4E4%DiN_0kWOl^QH&)vrj~{z8a4#5n(@4Wy6JfX z0W7M`QXs?Oko`ndEZf<fA9=Fo5!A5R{<+>)N7 zl0=x5Nk9f7fU&MbP|+SY{bo9N{P|e?wZiO1Z^($m5S2p+u0S~~n+k*70@OePqBQeR zPa0ibujd6j(rq|`Pd~*Nz4r+lsv4sxAyN#)R*7igzq1fVhD1b(ym%tV3{B_lrE_-X zHO8`3`6(^2#g2AqK#|q_fRy>%x0c9-_+Vl(8ZYk;X*KvY7eK8%&3DLFWVU^#pHjlv zd>37+R>(VSrSPIo^U`6P( zEj#${K%RG)-vPF7sTkxVE)W}6gmwConROLKIoKU^M;M4oZdFg_f15md=a{L``XBmdu*Zy`6PCiv`#z z&nTze9LpU_+iyUs5N4*-fG+jX9LWjtc1gEWv(_e)j}o9M+hiob7>Y5(=#4QUG+Y!d zDww%O1Q~U%30|WZL5v|ObWwz@3$gZWl&u#nosB9%ygsdMWy7M%#%b`xYz)PyNr7WhA{GfT1#c-p`B^+gsU%84h0ty> zOAUkx3vE|rJUxxt_@Du(fH`1H86ugoi0}n!3Uf;=9tE2wD9C_?*^&sB{=tjo7C}*1 z2+&9hLQIkPLYlOn1+6Y^>cHZ@UXxu^l+hppM1qCwiJ+R|vV_5&g_M1&5C90l645L+ zvqE@xW8?OIq{$F4!1;OTnT^9|N0xlS;%DcDVTG+Fl16Yeq+S&e7#OxhLQyQ0hAb;v zAr@=S<7fZur_Vn6^4e>AH{ZB*63%Bww(7b4?f%6C8^D{_cMc}gi)RII>z${jwaD*zNI6a#bwl_YQBJ9ASx5t6%;b;(#=9abbGw0l#yuyft2tUl_(*Z=V3?*qC6N4FKlr%;nstTjhI3oqa zYOqkJaFGoMSGp*(h^g?jw-MfW``Wj@_x{@-+@Z>&Is`n}BLLB&5zJ%#;_Up{p`A(3 zn)8CU@7~&a=M4-hhyadfqR$RypFcOxCfjvcsb#j}f|7Xk(CBQzN(ch33=iS%{o?b3 z)3eP|ula~{f8Zf83RmP&@7&({^!RXaZ6DfLQ-a+2>7=fsr~{?=#@4Gk_WQ&6d~Tdm zRVEW9rbq(~kxCn(ku+8&#<1b6uNTQ9S;SbdQVcSW9tA^dXjGC^a7e;pfhZXz4gxYP zs>EcJVABC@QAkE5f=LBY1xkh&B4go4wA7f}EteL@K9hud+S1wZBG(%Lf+22&PTFL0 zbEYQwyAYN{Cb_DnjZT6DB2pkOWtOvsjZtN!JDOEJJV`fB~??b#iiQQ?q+#ctsw4rO0>c{H_a}von4}0 zc`#^uqs)fY>HxW5Rn^uCqnh$!Yf40*X-#9PeWhzFCLJZmr=vs{D9kt!%z~#So z)UwVra)w)ye9VP&YHC^4q0rVOJh0%l!=y(p`QsdRmi@w}{_xAUGVrX|EqLt3C6#ebrOS!2UC6baZz1@-=X<-wQ z5JTQxmzEmM0)JaYEq!Q>FS$_5zgx zv*?g4cZ#qplYB)wfb~(+)ACaXnpaV)1L8UoJ3}N3Sx4uvkHX z-LMslts!Hwt73Jq*I|-NDzu?n z?Fl>C=3~16Ryd?f^i|@v7+bVllSfz5wDW7{Ar%58V=;+@5Spf`s>(T6_Ish3H?bD+ z%rL|X~KRaU;4qxQXi zb@ci3^DkaLyLt1S`){4~Y1m`H2Ra_^nAhLB`Nq8+k`O8LRzmOMk{-$_55__>Ez*F?{C%1-g%PDg7m+GMh#3d~ zks(fZN${k>5}2YD+TPr(=Tl40S#A8px!CV9=%O6dci+1HonQU>8}HmQrKe)fm1?ZD z2}FPp&S&x9V0Ju~iS{EzqF2#Dxp)6{ymc3a(Wfu{*?98wfW~z(o)5fKFiZ#>y@sMR zG0Y4*kRrnMdnz=KYWHq6lissmJjT(;nZ6hYg-DD+nXPCXRMk6qeyiTf!=B}W-S|N z=V^D{+=~&}wyCcW#H}*a3hPe)9r;VycG{7@F-DDX;s21q-vKOtD;I+8H?P|2^JeQn zcI9U@F8{tliNu0IR~CQfFkm|{H?2sS6~B zB304k5~~EW4C!jSU)*3Y1rabQ>CUy?CN@=3TA(3>5M~$S`S@ZWAxg096an0*sxld2 z6|g47G?jqolo~CCY%OJ!Os5lPtmPtH1Vh#ko`3eJsQo+d-WBHtBYNlkx9+^&w+^mA zK{$Jk#}CH`UmQ&jL!Y+{+z)^7$&;hgizW!W$Oz(55Gh?uCbo}=pen-BUcRMkT2-5_ zB3YBAUI~PB)It#QUj1Y~Yi1SZfB+@>qq3?BXB^iA%Po7XaYin*(tiuZKbdApG`VCa zVzhOLSQQWuu__ZA5RtXku)+i}8XU+mm&TqQ9PI6G5eJoV*_ZzxWqsy7L!S)F_~#- zBS=Gv3pgN100bKi^j2Nf-L+Tl`R#W(ON9G8#5r-}p8I8iIF|P1z2}}2;o;%o?&0p? z4yqjNt^~r@UD!!~n!Xp@hfe2J!DbF&aR4CuoS zE_?u)7oJ62U)$_uEk3%AIu5A)In2ni;$n;(jQjLVX%XO#we}WDB8rwjO+3ZXRoyXC zvtgw}zxKBS7L(5#A(AQW1;A2%9@G18BP10=>0prvQBY(ijQ?()fsv-fB^xah6 z0i9r^6qf2{1ukyzGny3M?RjMi(%lfTtncH=}6;nGvcse2x zv36a{et`Dv>Ci+!P6c!dyl(38S!SY|VN6>}oW z%_C#M3~SL|;DaAto;*5lnuf{B*q*hkMd9=7v$2=zbm1G%#9npPtR(YxuWa2yRY1vVQeTno07M7u6$ab zvX^k2v`g*8QB6Tg$Z^(!vm%spASN|XrVwOc3^Zdcmn)n;J*=@Xu zX)lej%na2c%X8Kzm&f^C!iWG5A|QMA@Ptq_PL+&!(LR7PZkRf3iNC?NdK_O zjHjH?n}O2CBmAkwA&!^QI#T`7g#bzXDZpcT>uDTv6ey__8;IR-rIy-Mhe@Yka6k4N z?+!Ev29k8z>)~);T%b=YvLWBoe&Z-o#dk0-1Kl7+U3|T}V>pd!(_UC>Z^5}zgG%qD zvJaa|3sJxCxtipNHZ{~iJmGe;gRaxBX*+{?OvxsG)mW0WL!ZH*^|Y<+j?>Q4Io@8M zDJba}`X{f5j2x&|k=BvKJq%&{(%ornXFaY>@CMpj|JM55&Fse;=WkMUMR&X;fzRn< zsWmhmLb@!|q`?sngLVc(!`6JIfT?Pz`IJ7UKwL!u;LfU==yNevX*-w+L%nnT*p>8$ z&G}00$|-B6K9y;z(GK1nw3)6|^pYcp=P;PQarDGSM8tH(@k2wDs+g>6MKT!>ceCMK&r*7WN942PAg}wWJHIMj`6dqp>IKnyBS*@_Fv}lzh|p@l?x+d*#)ezy4eAyz<&LWEJxBrasBX7S$4U%P=@wte!k~%cfma z#@m?|8E51ftwM#ZVF;M@;iJcoACD{9(~KGq5Y&SKW|+XnRm4Noa0bKPIWrlZwX0(P z=JeHXEq_}7>`xv~s%s-U&^EUjubMW`$0SbI@zYdStL5taXfH=DU&Ir2IwB>NhuKN zNCvpr?l&FGmCp>n(gtRB8I_fHzv@Wr8}iHJ2(l)1|uAP8zJ!ni`JtH9~5W;&*)pH!n%tc`zh z)&zi(3TeN^26e`P{`Zjd@#=CTeRrL}LT9N{FYR*agrq3TEX&8!X+>4rwyih--GQvG z7Wvi9a)@8h-~bjy$g{4bUR6jvi#L@#d+_A0)1}3UtM=_^1llhOZv6hy{*x^8mW^lE zVm2DLZCfoaEE@qEWlFT|Fel+(Fg`K>bhhCQ9B$z|RbJ@@8hmFMOD+YJn8CvAiSu!h zm)7Q-=OCbI#JBGGg9jxM)O++v+(KG87^nekFgzJ3p(T*QAgErF0V7o^N}QY=tKoOQ z^43dtZ_IY>-IphCzIpd>AEkj3o>BQrDMud0t$eENz~vHI%#a3zReL-Na}& zn;zacep-$X#TgHA_XUsF_sA0ZK99E(m0)v*37zH$XTBMut>X z6z7X2e0KKiVkUb4@&n2Wo)l$aY%9T(yvZS9lw9ZEr!K8+C3+H`@W5%dh^@%isC+cV4=;hinP+7~G<%bDLx7;4IEo z%g0arqAJ92!y}!BfCYjfVq`&%`a&6xpFXdbXxiQJ9z4)gFb39iWzfafB*I#h8Jipp z#5-T0$+g+t+k53JSnmGl-~MU)Fu!hYN@X3$G1&~3j6l75u&A(lx41lSc{MpaMAiyC zbK#GdCr{42yXKXBs1wl#6a};f-l(*xF!fwibWOD#AKPU0Jww>2P_r>#MCfYZ86q+U zL|sZC>4Uzzq$x1LkW2l<1rtMRR9j~e-c%z1sQC4{0@WaKVu{oU9wp|0tN3#`Ft;u) zweC7(JasPBauN)zagz3x+CieY9DoFDSn^U!5HknSJ1{p=ADohEFTEZ)43p>p5RK=a z;{)4bC}L(H+#|xjBm^RzlsFOLl`z265T3f`2NM+U3~c1v*h{gUf~1=T6jH@0Vr-jG zuWXq%?MH(tPVdC7V>|1*WU4B%9!6|8C9lCqqUMy2ffC&`eKC?++C|^O3w10cA+hm} z_r5cUZRx%PT%-scnAWj5m+35OVpbeLbtO6SW`)nec(>8DjmZE*BnVBe^nt;e96+@_ z@U*qTi*d4eox@@Sbs`dCNyA&I1{qt>%`2>z!9+)Fr+$C*3t-^l@B3v=!sOQjkqvCb z5y@uiwT*d!LJ(Mjs)`Co44bt!)#+0JIv@2m_J()*zkktIdT2{{;d9}14v~tu9!mh` z^SJ`~v>1&>B;=eERb~_H4_^-C_AtV+r%;V4l(Y9uGk<{Irn^%u z*k@K93xP-D%=^W2>(E$Y2?@;moc%-w?BNq0^q)EM7hKfka}4Iv7d9ruU@OpklyO0} zWNY9RzVX_~{NyZCBI)-kU?77kGy^Qugc7Dhd-yT5n$m6s}`Pyf^VHy`Z3 z@#c-aecXQ8-nx4@I~;xTiw6fsdj|*mAAj`d+3|VST1N^JuqU!Y4M?Rs<3$808G;82 z5J4GaL57)x)w8VXO1!x^UBd6d13TcHMtPo-F=`Bq3$e3gIww33vNmi*umn%NsCtm^ z5gylAC`3v`-Ijw@jjAO@Q(3FImE1VeMP?Q|NBNyQqksHQ{_);5i=sjE99)9|2$->O zI9pvlecsHg((_0QZI!*TY&z996to~AQbR;d0H> zrnTrHM7;#v&W#3^vnU!wB(4?hv)@y4I%*()*Rqe+j5w*>cpwMi&r#cBFQrvn`LIzjXg$`R$kVX2$5)w zslqdWGc_|0l=uPsx@kO)`+-OaQ6N(9NYq}*j#!FS&Evep*CW!lXN@sb9JN1Am%bj! z34C=t>wu0^gvXJlbC)75HXdgoe6UD0wk=UQAeY$sU<*QtVs|AFX*=mpJzCcqnOj74&{j?Va5l6x?rW^{Sm&M0&iFl0MRfq#Jp{QZh>Qsz|H@MLArt{$zSTcj(J?Sj(-^+$7WSR`%RMr?bp#u!|Y zTWU=+5k&*KOua&yD0!M}$i#aCbSd&u9;A{+JA_KG*4oHJDdEE2`xwr(o@G^Z_A~X~ z3z(U8i?gUIi5je7j*y55DB_tAl0XtR2$Elg8H|MOsn~S?D^8GE@XgL{(M! zRwk24kr(^>`*pKAJw45>5g*cSYoxIlgArCT^&r6uo8STn2f;&Bo~U@^e6v`6@xh1p z-o5v1Ro~1fJHXy}YUk&>v(e6tql@#oTY_x1aB_J4&e`M7+ja?1X>zELcg7fXA={A& zo?nh77XwQ9h1&U5)=`5sk^`3nDHO`VoC#Jk#FmT=6~+ZhnH}%W)JR#DA;8o%es!@# z>)ES_lv&|dwas!715ilk#U{%*BT?s?JReo9gR(UR$Tm$|TDNpd!O2sGEN|Qyef^i;{l+)$y>fq#^Cjp4 zQX^Mz1_9;`E>^2YXS8(Gv}5F%8tx413}#U$B1Fs-EffM#OT?`gFGA3gX`HEgkXliY z0jYByWuE0lwQ}BOOXwn#Td%*3@m>Gk<)c4&y0^S$ec_dAX~#CtYNIR1U}MREylZTh zvvJC`X6<+{gH>jR$45W^Or2FWAXC>%laB*~s_T01VBa|>DoTAuOlBB%&T(F}-b=FG z?b)4)s(vbxdsaNm)9Jl;&apMY@}~gzDVe+cccPhD@9I08?cO_ZU*U!R;kz-F!k=Umqd zvjF0~+jNu0E<}Wf$nSWL=}(=nUlbMb0TuD$&C?NsIEMfX5;+(H7&wVW7-%L)#QGY^ zTXGXXjE)Eo$G#%k(~ZGEHAE5;8No~CHF`BM#Y{@Ev}syO9~%hz_&5EUJ~#b~gB&;xV1kw1pJiL_7d7Z6y8_^n>WP-G(hveA?pxut@iVv25TW zff^eM))hgP=vBADO;v5%Hm-;C;WU3+Tw~Z&l=Z5;P73*8QU+5t=y&k^fUpMZA(D8| zs0NELSW>s~8KH}JA^>6WV2ga&Y$%Qq@@BGW9;nUl6aSiv`ddn+*JZo-B?K;=RQ_eJ^lTI}L$z(&s;ZE|T00tzRJB?zw(yV+UlCGHfBkbsE(qTt$at;eE>=jRm68cH=%JQ?0cL=eLmlZmJ@ zJD`}9Y^fX<3V_j8zFAZ(YCwQtwn`4LOqqh%vQ^_+=c+2piqUj$v8YCqUDt|N74hXX zd-t8!?!S4jF=w}5K6w59ox>Tdps8^7sQTGYK5j0VeEH<@;%D!F`sCRO88(?&xus-K zsB0I^b3eaaJv-UCbL;Ttjol~5$A?EdufK8QV21ME!S&sPhoh6(s60A4IzBo7;OFmO zES6@J0W>ZO&D?x-W-R4J7HmKsOt4U+1cEXv!4Q!^>!vLn+#GfW7!=c@$ZQ5S!s?%O%j1<@Hxz!oht!&Hv#4`R@)d zZ|-8RZdK8$MeQAXO(gH+(_R84JkG6#d(TX*!;zJ z)9$b}#{+_h107)JMe~sogiz9v-xyR!!Xlgy@c;%*484QFB2m$^tHBANYv^QN&%dpSvB+XIeRi7 zC9AODTw$SBMHC9lg)KFQcv{vfW>QO0PRgcT-oJbE>%a7s@yM8B{_Z>X@4h_E0I47q ze*BYXpZ@&ewA?*=zWC9P{?lh)JSxVsY^S_fE^4=A)a}zV-QoXJ0&cTzj`zE!=WBDt3sR z^R+k!GP%tJnYMxc!Ah14m;|_7RpV*7IPtsJ4H%Q1(PWgDnXO1jh>3{}X*eiEow1w= z3W8yT`V+~Fh#|7*4(3Nn=gFiH*Iv#~OOm5$adPtDa5l2MFn00R|N2|M`Q2~cd+j=k zrml~{O+K}4WkhpoWp&ZaPnOGz^LDX9(>Rz+)!Hm4%OoTrdjJ;Y0WfHgRrw#|hT%?)#-Y=muQRmc$$t#aPG`?9(H7OH~>zx%ztXEU6eyeu5m zk}-;|UAi1Xk=KkA0NLJKsLK5* zek2AUBs!}mhS+%j%Kg7~Zgf{h$;Eip|DXuxX0g zM&>|INM~nTban#BUvV->V=#8YxG7PH2SXSD6SW=P65EJZe0H0ztrHwf7 zw2^o}Vp5VI`hIb4@S3>(2Nu@YPTP8B4nFU-LJ5G0ItHpDlA3KpO|}A@a#NSJ!o(=O8gAV{X^P(D`XKj#426lMaMbp`OG-R7D{k;=QY_ zEi%#1KlsJ#d%yhrtX@neIWPexMqN?dd;7It{L%NOyEC`4^QOK1+Ut)Wex3TA1M4k+3RUwkxw@QX)iv!>1e;Cp}m_|Y?Fn@y)n-?WQLGh;H_z-3`*hGC7jvhcn+ zKR>=$ot!MM@9n*I=hpYX|KTUQj)0?|5BxuX>VNCm{KqQn|Br}=!oJDE_P73^BK*qs%IoB!(X{`R-Ne)!7W zQ8qJDKlQ7sC`m|G7nfN+4t2GPku9%}ak$T}g{zz8%2lgoQ7`LS8X-~3S-a{kI`U^&fq5_LH;S zdVgo<=Edm>h6OI;%#(;Uj#@>zaGN;?fsvl7PT774EekiI>lT19owyef zP7Vrt@6xVgN9h@W5Z@K=4@8gl(xPY78`irx_9&iu&)bHlbQ_KFeroiI(j*l?>76KX zUexlo_#X5aWl-!rK0I)gQ{vjba_-VjQvo^{+5q!|R|Z#vXIteMyprNP9e4`o_JQ^hJn{_`;^@fGq_jHah@r68pQ1iqA?!o?bW7ot=uCMLGUJ5Bv}f2N z&}}-4t8`$ay>j>|5@@aA(cr~s+6--mGKNSF8>P#ybFI?Gq|oNIM&Rbcjub*fy6MEB zBwi}Ms7Y*is9O`dCL)CMu&LtSd4f9<-((!D$sSReMAp8o0r3oUQ^nd4*rRkkDIO%z z15fZ<8O=k3tS@!|ZuCb07!pkQOvDI*zbf8~_skoI7`8Wc8U>;D8Tmr8dI|eBPvXPz zeCI0iJVyTDXP>}O_O!ya5)2$pCy(aU{Wo6y@TWhWFJMeoIseMNSLJ(u;=xw5 zt*dcSx_YI-;I2?6s1m#=iKsHMXgCY3s#`8j<)nmF7o>|dk|_y6W;WVYd{%&z44cf_ z!kEmFfzfg{0W=3Z(6rE&su*WP#y3;*x`@TYIQdhfM+M!P!+fu_^xaebt~{%FX`4^sB#ww!~BY^=)oMN}rVHP+&Kp5a)D&*z+cFbFt&l}#L@O?xFY2Sa2QUg4h<*O_8OSc| zuwh|Seo=I-Z2If5DMq6-83^1jk-{5&d5Ip*)E3rBs7-A+m7W7dZ9o;NkR3dhisQjW zeH>JjnCVzF(X~<_WA6j(Z4WjCwsmBen66@j0~;a{C9!W;s6g9Ss-JAr*kCy571MCp z6p5*mJq~^VL8=#TBWoL=^nt<6G`3@Vl8Cxw8L8@UB}nO&qKp!)_eIZd((1;z2Be>M zy0Kbbuvyvmyk80Jz??Z~R+DY$0Lk00qzfRW(fDhWI_Zl8W)vtgs1aRir!}J1v`a*S z^}zc!DaAu*Hf*)inAi1KHdl27ChnwD{Ktj5ji{8tr8rMb(cO`p-U-va`xmUN7hb9w zi)Kb8^-CuDFMAP@=}M(<>_z|>lMyv9?oPT$=%9oT3WRE(_e51ih{d}~SG+hrJAQO} z_ltFrwM<4sk_KOEk-u&vTd$(^bKKsHt50fc-AyP7d zqcEVbf(~vaulyGTnWj?@gskD=*mtOa$pC{4vvmPr!^Dv-9P@{*!<6@bkxIIkm)I#E!CztyACn79!S|tSG2aa0s+>9t33~7Lyf4 zd44f(+xAa>_};ynH($PSC^inyh42QBe^k17a2iDG`HdQCFf=U93<8W0;b&-0aLIbhaR}M4hcPc+8

)WnbmvC+1_OL{=HXz^n)Khe_ZbEE_SAFcW1IQ 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

r4op$XHe*0_x_TPW? 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

qHfUVoWSb{ zwzm&1RJ^Q;3FYx|kx<1S5Sb4(LFX;N*UucJ({n{&Yk+&TkCf;%l(x%dCmtS?HvI;t zVZ{d`v>kbm`%zox1$dNES)&J){|(x^u~Yu^e?^`1^wj&P?QvUcz+$h~uJWnreVg@L zp`iQSNndme2mJW{AN*4IoaO|r#Bq|1EXZ$frI8uGR+uIMaiP1DKpq>AA%69i!%dY4 z_#xyel@UC|vUSz-QtQYA+85vuE^OOvXcvfwtsMqBpOt3=5|Juz;4#h!#LLh!8(jxE z7`b_7>9Vl@UuP$$y4oWEsJYP_)XU@wIv4)7=Qar)n?=Ywo}QfG|FCSzRA5B>8naJh z=I-!fO@+>Jk>GRav5^P?Q>jiC-`?*_e%OC6m?7k%Y!e^Y5N~SUh5(Bk+x{}gKeI21 zqW?=Q_Aoq$>CHdRw%Hy3RZ@Jz3XHAlK~*7~rH3Khl(-&;TA`Yk49B&N>Q<{Y8J)3S zw~0pS(hG`@-W-~nlS}>_o?CPwANvlKx3E!JeROU_sO7q{O4Nie% z{C;6`^RvTk|K}C_<9+STRDrWw1x%&-QOw)>mtM`KCr7VXw}*vghN)}MrV8-TuHrI( z6bjkX#2?(;Au~40I>G5G6{ps|5$$(-CywSc!(WwT)`p9G$_&0-Wq9H#&b=!?OQHNS zCpgE7C!5Mkg>#~`@ml(Rx!Vku%5hR#F6fs&f+obiajhK$1_{Qu#v}?hZwQ&JMn3hp z&b+SnBf4{9gnjs4rNGU#2$xMlGf}iIGVs;Zf}6dkjve#urjC>TZ;~ut%Jy)+wMOdP zqUWERa)Dgy{wzkb2PLBerTMgRPj5V6DJ z6hYUA3zL?F5mAGQcS%T@IW7wwYQuJ7@i9z((6J)pus2#TLVaPu`+cCZe>1Qyw|tUR zwO`D>@a|f%2bi=Ijq~KwI*A8w&*?y5Qq&QcBs^AX869L|>5Plg=3qyeL`QsM;d6g8 z0dyBJ+o-p;C>*kQ)ICg+fB!vZem*n{TiWoQV0$>;Jj(lR@^y+OV3H@h=gc7JmdYvc z>C))&=C#P&rikNStY;Hxar7(j1sxi(Gh$H}x4}O9X6nRA^C+ciUi2KS-PmlbSx5wh zj_n5lYHQ*?5CxGa>OP>Cib5d@mdTCkIIVck{Nls>GAGA)8Uusz3#gY4ch}p43a6Y^ zIO(vYrs+IzUFaGJ8^!I zMD#)^-vkbZ_o*!LQPLD)If$NPos(jHeL4RYRz572V({Kq%U3qpw-Di-@|zV&b!Q4P zMppA+GOel8N`>)^&wbf0n%h|ty7{7XDWGjeo!UDvhC8|vWMsWxipIVYRPfu8@v zBIk6tJwGBCM3$nGTRRmFohg5;PQZsln>=)&C>rcWlpZvXja07mVE~K}zmvfC)1vHG zT!^Qn9Q_!5D|h3bwb@lSojSt#ev8=M4bARtM(M{1xy7<0Ol6|MR>xorsXuM&zPA+n zqgnN-T~2ea7%%MK`|a*8{P8Et_W)=w_#CV@W@wgH`}DJ?# z7TL5HMW65uI?g%B;%u{*tNdsl_N6!fya=*N?Np0mNUEvq=A!y?wSCFvzc-iHdt2kA z?Efvj3f_$Mr+$oT`(UuBD0yd*mo^xKPKM(ByI49}`jNs0V@h2s`_QQZ`93lemI==B zrbd?0e$bLOM`Xwhu7MzDp{ex2V`q;uc8-I`9*9P`-8G<-SP_Txz09nu}jxtz0wgEi}+H8f-kN8f+HC*xRp}eHkcOyNOzkc?_Su^D)tQo&%Yu>9wO_@WtJd!E zjD~ey`C1NLa;Xi}utrmHj?@grSe59%+Pb4VKxAV^37c)LaT~YinYh#++;v!UY?5nI zNYChc_t%*RA0I=NoIBk4^7rKZsPq&+{Qqu+(22UB$0H-}e^FFdal%A8pYdV>o|V~2&jd=@KS%$su~8~ zklz00fV*p!C7KT6W-KMqf+jZ>&G2zR_lR9A>?Z{~E|WNgX}Nw@akRu9%5-VPQe79! z>#Tb_UL^9^>_-X{iFVM@ebB{mta9&J_u1bPqi-~w+xSXr@o)b`R=s}eXA^mBI=lbb z`?!4a-5>XZRET9mecvK~`s#kb1{Z>h6vx?o;=1u=YD+mfs@k5v4uvZUEyNny8j+5L zFKOil7e&ozNO)D{s2Ea6PDzG;&B$9FDL1rFMh8?uRGVZ#K>AMt!!*2xs)L|R&ljhI zJgKvdT6HUQ;{`fLVjnnrW&DNF)6c(FK|K-b{$E4u9OcYhF~i1)D80XyBBMhTDfA*0 z;u5rv(z3JS-&Rk+mPX6I2OKc>aUxc$)2*Y}{CC;5F6^G2E!WBL1^NEVoOv~9qSr#7 z9`zOTYJV3L`irof&rGXra?q;R?Z_&K;rqHk>#I!u1~9WJuy)B0eieqawOEbeC2-A7 zOqaBt&VqS`sciV2I;}RjLFft-CgU0mX<^Z;mOWCxTO#aqsj*(I;X@HWgG0o+9~WE~ z0KmtjxTcZ!?@N*ER=lOyQjP)#7}92nUez*=4izG$dOi#mgW51lf@E>trrY5p;l;eH z6JMlG$28$B+^{B3 zeDgh_o!#rVS-{g1DrT3IPu7Ox6|fLTYvdJ}9dqS}+0~NYokPq<^0I(%Jb%&BSidy`hRKqVrEb zpm$l&Nq1cq0zV#|{HZOb_r(|3)SZkM`)S#Pp9q)5(D{grk>=j5S3?pePJFO?+qY<# zPZ;M#@Tb)QGprv_q^CC2Bat4SoSFL>9?wsY+vdmJcpQggNqhgc9wxWqqzGL#{l3&5 zzW=VQq%^X_f&Z4|Xz*xhc-FOtRQWYfOa(CcBJYL&e*tsRY@21u*C_h|Cn|OrCabom zPn8877#|-8t|wFBd+|;$Gj?5loSmWK+FB*7Tgh-B@9l>6$$EM@T+#e06wW9nj{}~gav=k=ILc-s3FaC4hlQ-(TABa_c{-xY=`Y00U ze7PFOZ~3q4+LCkfX-ecD-qu|R&GY7Kk=sL~ph2A&3v@*XdhKSL7!Ii$v7x;Ye47;n zD3~;(dS=L5ik226VNB^J6=G)BE;Zk_z)se`+&=0w0p>s=Eo$C;1+8m1k$|MGkAXV? zlrhLisLX(HtVh0e0r#w}Qm^TU8YVnYc}YMxG$I^71NNFU8~XWiU@z!E=nO22&3Uw{ zmmaKG8Cl8m!4?Hx#X}%1!ztS&CvKljL`P?(^Jnt#zdpR4zdGK|c$Hs+MJRF86`TB@ z?!Q0&%M-e}q`5wxBG-%Cs7%r!Q&XFtK@)#BRuZkKhnIxYN1B58*hdI_rb4*Y_^Myk5FKTGa2h%4=o*y!mAAafu zU0?nBlHb)wR3yd-iV+*-LR=5+N45JF@!ls`W-9xqrU*M!y8p{1$>Xm)8|8vkz5q)R zD086EMC(z6n#{CdaY%@Av9LgJP)PA{uo6LpemM4gGUiLotnBzwRvFcNqL$cT)O_zs zRBvzr#2y4f842!Jlh>CXq|QDWQ~m};k3iTXz_#`AEG#o6K7`rdg8)5Zz}@4gPuO#O z)^S*%esjlQaMpiW1LnAZmWPwPHG151z(T*B1&p#a^qx)q?K>t;6P%vL3dQOdHMg6u zeL_Mt5KI_37ExzDdxC-gBzQM3KYHfSm|cY_nEEYzxk3uR) zO}^m-NQLO1X#*36j)p^|PlI9I(c~&=6VTD+6UpcG?vw6_W%#3Or$M?%&`#>O5;@YkL`VB%Mxwx`&a8P1$^`b|zm~;n-`NeVk zon{~?H=_l`jqU*8pH+cIpBB-tjqp{cM4N~f7Rr!@4DaHlkok=3fa{rYh-KC5g>61J8T$gorJa0v{w5VR;3FWU? znRHUjnaJ&1BzwFq_Wm3=M-PVkJnpkI1dV&RAr3YSkqmAy6}O zxakUTk@6MS*w@FLf2NFm;h^p8rjnxBqeccFlz(JpNj#o}mXXUbb3fl+--NsHw4^G! z#Uc4kw?T1>;o6{SQHjy-aI}H@#1yMvaIX=5y;&Bqpf5pG{#CB22qNkroCTeM(ZBm+ z&m%EZ$dojMBAZsCIG0e+YLf(~3mrFa)@M6xZCykew`~F9w~~nf?Y?;oSOVs{9bH#C zJUa8`P*UdP-Wp*ik9Rk>`TAdO z$1()g=f8xPP64;)R89dK(t$qwV|0_m*QK1E4?Ac6qmvX)_xsX4e;P!z z{dWWzspJe~_4Ht|ME);O5NI4`M4Us=Rc-zk4HcL=hHY_i&}rmb@pnXL1+4W{CH&4W zlo0UdnndgQ63hg!><~nUPP}HbB8QArb^AY3e8LrWn1Iv^o(R&Y6MN-Ki$2vfa}}(m zAMA~jp?qB62=s`K2MRhYfGtKSS5PsC_xb*7??d_-;7M|NKzO#j;poWHofrqbtYaXQ zK?u#2=<S?1_DL&v(f=15X z_5IGbmy8^PEyZZ@;T`(F)$xkQr%@q#M`Nu=yG9RFLC>{D&wg#2&vRA98TVr=qJ5zd zIRsspjPCDb)8CW-4&P_S#U_1S}T6ILX2jpA{wrYiD_6+Zc%C6oy zJ+xPR|9z``X}?})5lo^3Z6EVY$ft9yFaUCcx4$v`PdoGe74<$nR%%Nh#V1q{yeJKc zS7vr<40hS&X|bc^pO{C9jrOq5m6t3`2OwwcJ~0wRdZu$k{r3VNn53)FtBdGKuyS2~6~4>$eeScg%eiEHRb zH9aEQo`4Y6G_>fqyqF6XRpPY5(UnKx_&&FL%;h%j3v?m&tX^y3{lBAp^yh2;wr`8= z+MRKS7r+>zB>ILETsc5VB$)(P)X>UKlIU{XjS<(dfGr)hIF&QSbi8bFk_|>yy6)sK z122Vao6k&+x#vP|*5q5QCjjBT@B?w;G^1?6?ql<&iFqDCw+HU~rdDR2r|mrO{KCi>TR7LIr8G0-Ockz^~k^ z?hcsN9j}djapkJ7x4dHGPBV9M`5mHMuKD*Lo;xv)SUNs3t~~+_V!;3M^=e?VSh}!1%LNG7 zmv#W#4ZsBO_AWpCJ7XP=0W`O4^#XnY03v@r96Iam&KYaq1P>Hv0Z&;gklK{Z0@82e z*8cvkcQX^!shvqL(!mEhb29~2QHL1GFBRfF-p^6r%0@vXH z%(6OEy4kxN%@`mv9HRbuV+4q9F^L~pTtrSl=X#~lj^kiZ%R5oE5H<;F5KD zqGj0i{KM(9-&1$*O_kQ>xw-($VxRQH!ryaR3gy6^-oIsDJx|~Ep3AnP?d;?RYz^QQ z9wY2r9`PdrJFC+OT34Mohpb|1QV?Nw>p1Nt_!EsnBpIWOgHPc7N3nT1sYP<>eKR|d zv7Ti#NK_@3DH=F=wrHT4i=p7GakWi{?F9r(JS+g9L%e&Xcb4ZD7toN z;rR6Vw2p37v?##kok})?&B??tiOB7^mSgX(Rp9p9v-^Wo<5*S@NHdo-tglZ$4SE0cuv9ujUKF?^Rm4H&qs{@PVZpy z2DFofucHx)2g7-4VQ*qxTm7#YWa#YWl8li*C%y;VZ+-iI*7b0c_Z;!a%&Yue^9MEv z(aI#+hZILZX4R{_^!Zsxte}HCQ$4^f$yN8KXV$JeSHrh&(aga+ATw-Xq4ppLF8saX z+AoF{1vUK54!P_ki+AM}7R_(X8R8&NGvOd>{Vax>OZ&riJvKULYZM*1sM?q(%%(G{ z=iQZwTcf|{pB~rs@&b<<-&?{7OwCav6Fax)5s%&XvcW_Zsf(LjUK49UHy0vLzfbDw ztT$&PNvrwLe!_F+X4olky{WLW#PqB*M2M!!BM;N;y*SE!j;l zbZB|9UYPAWGf8%;G_b1&5cExw3qi&bZ0xzSBKd&-Y z$!T*>OZ_xP6AOla5KVyEp?;i3gQmMs@dSB1+u=R!KZ*RE7U@dc=;CR&WYFW@Qw3qe zLbaxb==GEijP-V?rtGO&ZH%*knukc1EX%=7JaAYF}2ToJr!A{GbT5{eWjIQ zynd>MPHolu?~>+Rfo|DnEbgWFIqRgc2AQ6+{;fR1H( z!vzu}JcgJkhlxi8RLMlhCZ%$HoO@bp1{G|3R+=xn(B8|zdwGpOF__lA zNE#569Pz~p&?NBu#biK~^pn-EZ0Gonukn-Mze3Xl)>0e~gEES%?3vL~f$yHi&8U{? z)>N;ky7t$aC$;U*UhUenM4l-u`tuf^EbdXGE@i2UhNreuA4CM} zUh5|q@-rRdw_&piTH^_^l6x|=UXcXEIlumJOuunT?3ony^oBK8vaXH3%7cgH z*1r!8Y?N)~rKhnp6OvvzHMN#Kf3vBwzIF8+aNGEBuVZ9SCD(iuIoJ@mfJG|6fpKCV z^6IM{(wvLTD^{HrB{)}ZgbAsfg!b}{V%7DudTG(jKWL~tAq@NTf)yg*58$q{%W>my zH2B!U;9)>RX}G{ROlpwj<)pOM>W3M%H(|j+iX8J7W|K0rJLyXVmXrmWN5th}%PcMB#Q#>}gqW>*?*-vYAy1z`B)3hV*?f-79gzv-Hf=asGFsG;)Z7e11!nwJlLxP8zKJ`peiTzS% zNfxq0!I55>%x+=#o@&B5QvCOWl_#4H+?vXuY4?B}dyK*a!Sg{#d@(6wa~>J!%spB> zzNv!dPqZ4JyXyuMb}U-rHz~Jg<~{BOaxZ0&pOJ~70@f%LCZ>$RT#6GN*T@X>8tof! z63U3$SJ%w}^MG{jTN;*CC|NaXGKzFLGt*MNA+NjhJ7lk=IXn6;Y3nxj;c3H?ler__Z#945<&K+uUjJ>L_8 zX1Q`}(h};+es>9^bFI=jR7Nyd$8AfAGbmFEJMc?50c@z0F8-=BiA5g$#vwG$y$=MC zX&!w#(@?S&8{*OX@qU$A9R@PwQ!JTqkUX4mO=Qa(weR`%VtR_+8|BXseR7Yeyp|r zzd_orRFljz1pQ#f_jjHjv?zAG-{1ZC7$9%iuCE&o9mr=gjdRcdK;thNWI4%+T&#?3 zsD?=;=3uZW>D{`PFYcx`-G(GSrK{7d@dg!`C;R`FJ*2)t0p^L@hLuCiQ*xb*4NMFmetwmEeuTg*loB!uQWobVp0uC9QPCb z1yhJUSm!oU3lI0+Zx2I#c%!|5FO4he5Hm_pw3Ne9gPdt;&IEpH(M4;DbnuD~pmoQJ z8@J10=;W(84UFbHVh#5-dBlB?QC3|Y^`n~ddHcL-b>v-kcs&2fV4_p=8jN={wzS;D zIy~cC_sN5mThdE&MwZ6c>$Rpl5|`UkrK8ib$qnnYe#35t^jH%WyI$b$GWR3FdR*s! z9R_9{zpn*r*9`JV4;DVQEn4c7`tWoJ9JoU^($a(9;2*@4bxLh&&>e{oQduwlzA1qi z_^EGgP!$K!cj_$!om!MFEqdtPqGcFxaCK#PmkSlKfzG~#OQOxpd(?11nkI&3=i&hj~_8cMV>LL%FP!w$^yOVdS_`8@f7LBw1oB7%k*)eqRC@FOjG7ZHdVX zHmSi<8z4}U3~vv(Z{_&iFiO2<&ttK$kJ3?D$y8ppoED{+j0DoD@y)i~oIsVS;{u?H z^tzq(1D|e8={moSqp7K>%1Uvw8{8YMs+P3BgyHaUV0N`zas)0na4_gwsv_MbX!w3!qL4gc>=Uxl@ny z(e&_f;lBb1!;^=^k?Z9TDdf@A4cxTm`K3b)4lQ5R!U~iW>?c~9nyZY^vt+5R#UwRn z-ms%2fa?22aY$c+U2w7&gSp42B?t^gOhaCxDKCqcNAZhQ#}!mMRLi4Pmp0JbqnCnM z5>*#GblI@6X4nauN;?ozGhb7J<4~~3&H}>2b7JHAOyd<*nRs}lrqPRA@a-pvG9x5} z|I{g3^ai8%*cIn&dDnB?XcHVzhDAWFSeE zWe8#ZCk36~A=+{8u`e{KM6KdwnMjXj8dk`=g&MGJ`0(V&a-H(vEkP7x9uOBV!DURR3)5>;Ob{i8wIVqhc+%`w3it?Mc0%FCrlK?oM4crR z&^SqnI5e3>1oE4GpSA)ODJB+LQhp*AOge4`lUN}<5r-CAf>v6%)f$=PZm=N3I)Moy zdQbmBK|%1VUf93vt*e>mUwPAJyi-ty?~=={Pg0*PE_a*q9v=YLkxtI!hEC?9K|H_ zZo^n4`LjX0t3|v1;;yBWlQPx|kGpxKni?>NBJBJ^(^MleEOZVDELmehGl9+&z%!1R zlCC6l$daP>6X3;n-ZQS8OBM%8suh}%8^>gx3zTleH@W-ypn}b2_+|%n|WO-K|K}i77{6z(o{eq8Q)VO<~>Tq z2ASadxd!ZZ*UICUEufANFDk+R}Sb_OR=DOZ(Aok=VSk?cFH^6ZgKGd z`&ADV&<}I}>61Av{;RelBe%BTe1nVfk2}Y@EQ0M4QRr;oIr%GFua_|$DRiR-`80m9 zVZz{*Ah{F_t(&J0YLW;NCT#!f@#)vpp8pgAus2AHCWZo?ekcW3pE+RiD%J^zK1(?U z9bhFlSkaewgrq*4iD3GCW|pW>?%L3R#|quQ-E4OuGZR;Kq!T<;_jo}UuJr1&MP{gE zqQh{Afz3|w3q2--%1ISkBr-G~wclTOsf}rz6CgiVxEc03Ny3?34elLzl?WOwyA9hE zfwie#-O_*XeZwaYjRWN1H@)PFYL)2jmc=jXS}3~x7VU-xy)IQ)J=bD&XY$$yb?&DlaCCa{$kEYndWhn1N7HAeJ+0=tgwUw5|-2j zTLu)JG`gRzJs?n+F{JVuTW6@P!6A`e?$-}~G_23lu5q*`*#V8ohTdnF+w7ce9;mXd zUiBhOQr7VvzfkXK9sTRkVzp{}F118lPrA=oUWW-V5Wlfca;U6Ic{o1;gkEJL0e_CY zl6l5Ti(4m=>{1$%g2nr&l2{E=%%=GtQ(H2Vb5O&lwOO+-I3 znGR*=kD&3$gz_}2qPwF zvg%EAv{qVBXd1dA&W~==2Ad>pI2u+1{OW;wEr?QT<)sC9#dGsWl7_nf2gp4EvtxVFJsM|l? zf;lF59RKPypX*@{L;SZEp`cLj+?x~qolvw?`_>Jwjo&9;WT7q(K!s5;!fhT z<5y4dx8Od3P_!KPZH~)%@FKoj96>w>OlG7QZia&Zg$sWKsdQ9A^<)nGjI>EO8szEY z!e~JG?j>S&8Q5y%|CyOvezc)|U7A3LgTsW6A1_HE)mteKq7JZ<&&~+=qq~PP=8O_1 zWf>GiYwnRRzEh7BE&w0J36#O0?*v_K!E`VXP6jjre_97aArb#&h#0XIHY%w&t=5+g zYBFUG(-jqs>%QT(fQQb&W9gvtyr(O9C9g;+iLpjHKrK=CaC7!>!S?X;fbHo4JMO@b z`k}HGC4~9p>E`tJf}QvqND&^BY)L$!RuYUh_^pFZJ{<-~+%=*BUHf(NIP+?uxuqU) zB&AM~Dm}Y;+HQv<@cB9rNg6v_iBfsC1`QQUf^PcWJlqY-hq>}m9(Gh$i6ib>&3<<< zf%|mChaM;6BlA4^ZP$n+>S}B63jR+7TB8CrJLsjA&`5o)phC+kG>>yxWXhlSVr667 z3b-}Ex2bGAy9a8CI%+X;6OAl!8f8QgNkH?vXNjtZpca&mCFS6UK$w+ANL?Gt@@Z2X0<18&+bbon68`(4)3vhRW#ZZu}mk)+auiZJ225m~x>0tL%(j+0XRz2JaQ-%c81ZDgT7K9M_3fqB#!N#TGf; z4C=T(YYqa>w4L|Q;#ATdfpx)da&5hMg@q*F>-rTb4yKliiO`)n_E z@49~1xz70>n7Tt`Yav^9Xt(T8r>>X>E-4+${^b>f>^CF|4}pu$hbH2+Q@rc@2g~MZ zaA>Zrbv2pZvqrqvX_0DTu`o|wKKi14y-6CpD!5Ej#!Zw3dTO)>ZLTtJyZuXjw>NtG z;wmi|^FFGoDvz-q!`jh{5SH)wTS4Cb>q-lfEd*~jt zL8CyR7c~W1>ulq%^1C_kP!VBK>Rb=VA&#Y(;7#+b#sn24?L$~17rxJLl4leGvLI7v z4!Md-A}{UNr1U_hynHS-qu35Xfsd-)gmNXUp{q=14{=|B6pe@spy6|=o zCDr51=g@H)7rEyMP~(di$zCr=F&K9Zc1o(ab2Ecsr_CQ9kwbuu;29=`4KX(Yt;|yD z0fBHyIC2jmcof-3*q?L~Qx-Y}78V=&x0}C{DD>4v5THMOnkJ{cKrT|U>1Wt#I2wk) zWq>ODDPbrT0j!GTkyR|eP67h_)-kCYrnCdY;)7X|9>==t_Vr>NsU8-k2j7m}=^E>S zsa%L5?|)Ljk?Pcc)02wKV6_Rt?T935o}!vC5%xTE-f>)op31Z-qtr80iXAHm>8>KJ zE5K$5Px@@26?zf{iEC=iuSS;B&5wkt{H@`oVS7%m=f+JZPHXc({1BuOQDNFDuzehD zN=e@(mx$LexP75hxuKS`R4I4-YHiR2yD%>wzQGI~(2KKGZFu zjCVzCcM~!rfopUd3o&2>v8b&KUH z3Ku@iacbx89=zOclBVA;E#d&bU2Um~`FVcx>pZJ8s^3k7$7aZ=?Wl0ir@55QWpB(U zaG82UY@-teOB{j?AkcVd4f^zNC_{9FHI(_qOcuZlnmKi@qrDOt=7{pfl-lw<$-!-A z(_Qg($<_5PzYqbk_)l}Un+*SyP#vq&KaYice$|Wclw<&wMxw!?X)STOz~$m(K>Dm> zy=3ksh*IG%1EV!x&%|<>-%pw3itc1uQ`)}Fok({iix{~!u<$#S_Ud;Up`5lGAF)rY z!MRGyzZR%X@zI@=X3b_7!HU}`|EaotLM(qc4phsh-NL>8%7d!W55+l11W{9E#((Ex zWByq?<+AS&?WKkHSkX+Hcl!Gw{{8rt-%;}+O~pg?tCYNEd`JmzO(nx0U8!L>{Bc$t z+t6`8$4~i+mGa>+!2{CNF~ftkBx4M>ZZoT3mwlpRs{5;;5dq8yslv5?YI2f>@~m1?rQQ(cgDF^?Lo^BTido_%X##} zV-fjhg;_FzzgYxF!TNy*AsrZ*qzHN?*EQISSz79p+1&h; zOjR;2?CP!;DS4t*Z3&(|| zv1!sD#-v~xQvn|a6k41xz z^LE_gD@+%e39QSAWW~lAq*VmX2pEgPDYK%>V(r8W)E|MNMEKTYq* zrh1x%7EfLXlmG$AeqBxZYzh0A;Hkyt-KENNf3w`K!gDog<9ADKpdaaORiUUwSZKF#bYuF0|LcnC!~upvn5bmJJ%8-->n!o!QlnW zsYSeTZxgVI%(IDqHnhRXpnDXD&A^OI$&DReD9;110y!{iT4w z#q^;b0ybF0Cp_7W0TjT$4k0IF$0N`n;nig$6TmaA^;ktGslaiBdhkNk7yoG(13alO z;5;T-G@%H)NVuJf6%*U&5cYZ81d%~g1G6mXxe9B1B`|?yL|7GY=?L>Yi6RGK**z{P zlgMZ)R6}Js1SpD7Dyh(r{ma%y2^mU!v17oL_l5D+;f^;a=h0XwPe-rtH;HH$?GHD1 zw=ptTyH&zY1!vWAcn7nQWo2avtE0Ck+H54@{QOGrG1u#{b9C}g`sRj+=m9YvmPGuW z%;=v8a+BCvyD8Av?@y1jn@kCE;ja2>-sZiVWu^W;r>kX_7X!d3=;pQ@bmd2}e|5IL zzRv0?s!+7$6PL#{Mu;d?)(Y489t1E+ocoGu=Sr$d1Ahv;S4G^zNQn(#E(HFFwWrolYmAX; zfU11M{LawTtx$s??>q=EV=?!x1(bNO+=zYcGQG z0F3Q92Y@_B8Vq)~D(kj88i%&>nwDzie1uOkG8XN^&Ta+wL(V7QPwaH8sgzRvpIP%I zHpPbUJuFCMF`q6ZqsDQl)rh-jDz1b$wjRc>(#4 zV7PffkN1nyEe(T5Axbbu-71=tywT&y2B%VC0*W)2N3Y-aCE=E%$ktQAV`3 zRcx}8!)&upY(M=7qg00C>|KLieWLp~|Hw5$dLWuikb77;xAo}1v(*p7d48q?mTGA9DvE%7v zWJuK1>#;9;Px$!C>!b;G2HLj(^=50L*j#2ajw?%o?HzxvrJ1++ecLHPzuMV_g}uQV zdId2V86Y!N_t?xtxP|fj>ZZ0KS8z=1ohfWwj2Pr9gX;rOHbHGh&3x}lxCdILkVo$+ z!dYvnE&!ThWFLPN+uv@aJdTM_ucmO~NABgGeW5 z1t54#g=if7M@A^vG{f)_fwe6M*;@@QG^)n`j6Diy;U09NAiJO1SNfMS)^p^?7+#Mk zjXs(+iGjZeBG20cyZ8Aq2*zQ>)beDUMKv^u=$+NLfHJ={lujRPy0W|F#ice$xRkE< zi|7-3Bv%3f85swP;*%&o$Dt##(01H}J5pK*z#`h5^e|besd6_T*$C9WXM!^kA#n6) zVrfE}uLLBhYPR`b{152!<+x+ju~-$w*V3%KW z#wlM)K3wl<-{pL`jpF=pJNX6m=`q{@RV0YIKDy*-I}QNc1(qLYszln~G`hDl<&_fE zte=);b?rT%73iR@{cHJ2J4rAt$5Sz+M*x)1?9!g8TWtok4)P0_>SG>!+`9QZ%9#f= zSWU+rg-_3wazBq%vZ7a3RuT-;BbuITsucgRsX*Iu5E*m4I6Um);;L(!BeGNDJkQD| z(!&Ju^uPJL2DGS^&rF*hM8ZND1IU~P)Z~)DWCu5;B|Yv!Sh1Pq+&8bq@UUv?is(fN zn^-P#LQLwKyH9QuznX?*z#xzpsNA{C10+Nn8Ln9aitvHUmYLar=SRr~dg4fy(&o~P zicBxU!92moiBdmK)<4^*^)qdmBtJ`0%vUGCW%Li~cxQb5y7-a;UD9PZ{{8G_qw3sqaa5$9 zcic#yZU3xPsGqu5+K*&-6pg~l*vb+%N?Z+JdutOGgUy6q=A8nR**qB4*} z8zUr+98PKNJY7s?jyBeEIKBg-?;-x~d0A%lTjQL9N<%Z>!uGyV+kPSLz}GE5m!{LT z3+t}+yRDHTqN&3ke4;DA&fov}pS8a!$KBDVj~jnUU1WIMFFj&DVlln4<}(+6fPDTZ z9>u%4$yoG6zJU{i)121gjMfM3r2E)+7J^0vWA2}I(EeACw?WBzt<7oCN->w8I+1)l!->>z%V7b+2|?r(u5YaB_I=o=9c3#4K%% z5}M_0-IhkqB*1by1@|u<_Jwz_>(B3Ob>=Yf7o6EDvSOxe>rme8P!d)Z zz{W~wlT0Co{tZEDoSouQW2FsL@Y4rs(W*Lnb@KrKT2zrRmaYB)++0{lxb^sK`SOtQ zVwLpGoiTMzM?$`;hl!ELZah%EesJ^mNzlcNv=Ku>% zNh`vzXc9K4)r7&D99@XX%2!k~2`zJ%Erf)Xh<$Zj>rw>{Rsz9R!(jY{NZyCE5hx9% zU*LPP@>Xn*9qcyBRJs$3j`OR@n5z{ z#xUYo@*)B%l~{0?=>jG|<3T>I|BIpb&yiI}WA%^D7n-2GiYvl+9LS-Yl_Lae3=-*s z9@2#!Fy1_wki&(jkgz6zSQF-k*Zs6*74DQKbK2S2@L=tMSGICPu@Ph-SeObf-Ep6_hf4|Z{-gb$@ov7+MMnsXEF7c@&0u0i zF~f-R@YqmFSaOz%J_@7~n*b&;mZtxN;3Kcd^64X)|0ZO-PhCG$kMd~~NIZlVC6>~x zJqg-rxZ9)-77sjKJgOGmb8;|OREz9lFd3+k+&ynzjIc4SFa$=bAPfeg zkEH|kxSuSEVupvj^`lh~J$CeZXuc87XR^aVso$&ut>Zj0GDQ;BS&*70CFdUq)?)G- zTbk>q4HYx~7^ykYE3nOY|8A?1GUJ%8aIFsg5~hLT{9_En z2$3FbJ`>r?lEX7Ymz++~CMH{O3RlY5dMRnpv?l~*?q_D%dBSQQGdQ%LA9@{&C-zO4PQ z-3Yh)WSx3nvT5#(lJN`Zk@q@XLV)M2l0me&f_pekn;S$?3H&OeSIsrNl=KdsVr0l2wHsx@ z#z~y3ZfX~*8(~zIl3G1~aIQIFW@#xCczLpRdJ4E<4qprPluthcjg@Si4lgQ8A0^Ju z&!74)J_uA9r@}!0Twh-UL;LJ;1A29m^lBxq(ohitmYwkidQ^Z98+Ps@k)S;Lw7lnI zJN)O>ulWm z{Vqhm6A{AN3qppbk{i|1%F0sbH`?1|a?5IrzpYDaKIU{VDj_bL@`p`4ov$pNfmKPL z_A_2SxjkMK4b+c$K0Um52*}Mnsdh3!r=G$8so%xlaejZZ_s;wg*jEAh{0Dtgv%fw% z%6gZufLFa@-H3v+J^3Px1xhHMSk3YSl3zET*bk*4fKb_C$ynrAev8L^Xiv~EMAI1H zfkrxBF+WlyfkccK$$PpZXt3cm;>lor6p0c?HQ*%ou$qMUfS?KDcp)|XugN?8uvCO0ME6!HfdUIL zNua^&2E(EZ<1*g~S{qLKc{Z`8W`rT=ag3Q0!~MacOIJm;ES;MCwx{10;DeW$?1J%k@9raHsajh3bQp#y)ItT%G%otC-$a&XftGcxbZz31xtHQal|m@(q~WzYr?xpHZ{ zyEqklc{#$M#qk>V=kLXF^TgrW;_y~uBm#uTE+4Ce5aSoT7s`~t>@sf5Pep=9`%Fw; zeI!~|UZqF(52(+05Qzr|s<<6o0JhH`dhu8!`XGC&X~b8GMNiGnBq^lGDI(9oUiFQ; zkI&8a+N_UDh(+t=@Ba7d_DctDSw()p3rVBZEJ*2^CF6* z9VmQXIsE+HM$M_#lv?qN%)(iqCBh{ZsEwedQAa)q6eUr>U`E94BzBq}G9$vQ5nnZu zFEupZh4KGD0EZPX8-T)C3&3StgH9#NtNehW$p{qa+CdXZLjlz76Y z8S|>#3?Oj`Pml6Ho)H%QD(Z>MCb{S3J}EpI(6*>GS8a{Ru65S=)PrfF`rL2_XW(K( zd8P)w%X8@h7;!9X{>eGxE0Sg~#^M-Wxos(dko%OPg5?9hL~WGu*=o;6R?xRY-}o|Y z6dw)l3@itd|FGjqiT@665r5^Wl47F zukb#%POuuEOxp{S2$#W$wS9}uy)}oQGc#Dewwf0pUQp1IwWPDQbmymH6l3@BnZ`wo zf7?_ixxcW}yoCp+K((D|BZ0~cO4Y!8FbzP`THMn;Od3rmlpn>-YSd;Tv9 zr+C-VzP&F_@C zCm?Skl*k@prJE!S?a9dZ`7wJ|{&@f@CVNzPOl9Nrs^Mn(;3i=CL~6PAX4;LxsO(v? zZT5qOf=T*InTr(5o3|hCe*D{?iSAyXoY?f$^prHGQ?PZ9T|vCj1>B#E;4eCGR*+;N z9i9>%j?1Y?8xM*fU0_TEVj|mg5NNP#2MGv-EbIu7+lo+7fWaVU7+nIq8w}Eiq<=55 zuY3tsnD|AZ28sG<7N{1Nb%Fzhp3}2otu=2swUZqQTm|Z~L9)2Sx|^+_*E0(EHh z_MK)=oApsB4c7@gL(&Q!JHR3cdW)Z7u-YeIu0n<9_&1&XlWckjQcwWI2LBP>O$cHk z$Fng#pxDJVlx!SHK=T2V|6I-lj0J|Vm;XtRaH0-7JX(Ywd!}=u9WXK zpWgk6Pi6FbiU~*jXTD%s%iMT-ly5{drEix?=Qem z^gmFR<%c2PQ4k~xMKEERz_#ti)#2{=3HUaef8a5XiS4<{xC<%B@E%A!Elwk(;bb9N z88XxFHBmzf*ZFI`Rq;>(S>Y={nFjR3YIt)xsGnF!w)lHAHqTcW@hhSE?K8_pMdqy$ zdL$UkqkZ67;H(P}^na1|q{e_|T{6x3bjG}zW;Euna87XC4wd{vdy z{`7&$!uQ0@GD1p-KzeH2HNE0akd0ryN>7Q7imYXbxsH?KVsI`>2IA5s8I*HQ+uns{ zNj^pdMaaTzo|-TT8gRxpCS9e-3qh45+<3C$JOv;`qK+LScsPn|+WBJ_`rP z5c%A~H)VUh@o!dHt12y@ZkU<00D!!l_`r$7*R~z*^dF=Grmx0lkACH*TO%UuTW;6g zZr7LZZbqvb=peOo<=Qu6<%SCXt%zAzNCBTOGD4&odt@E_b-IWR$!;r$*0R>yPf|tV zsU67~`Kx4yZcw23)wv=!k%SE&4!qaLJrJbF4!X(d{yBw@m+es zJ*2**Qk!$ZtZ#pJMdrWr+a>M0NvB!~Y#7wr#Cl!^sowPMX79sQxXfinFuv&3Kz1=JTWY>c=HCnIwb5eUNa5xfIIn7EKLhrmGj zT#p}`wyDjR^#6PBO75JMVatL%$m(N(hEVkVo%9BOL@oYaV0NVV#FKPYO)b4};qu{_ zet=W=%;-w_X@qBF8Jk=}xDrKm30u9t1G#32b)RG7$1Nw7aRLwrQU%J^-n|9K*%b!z zJvlDdN z`1z;R^NW%&D|j+z3c+`bw;yg@uBPW_+P{{>oBuL4BKZS9Bn{r13A)+{!aEZUXWSh- z{8bUxJoobP@4*?-Dz}%CHU?V^(f_nAKc)Q6-eSE+gCZzbtZ{sVAhzw8t8q@kBF#w5 zsxlEa6e816DsZaAn$O44B_;AhL-3uN?W>@vN$z`fsaD*c9Z3Io{Q<$=-din3^M0)D zLxsZTzH=`dL`AE1nu1QZG1f1jd6jBpNM0J7()>4ve}6o63tk28pB7yWX_MO;8(-hu zoC9L}{Fw?`OP%G5quA{$F^#$2f@hb>QL^lsDJ!zpKT0HIT(&OiU3rW)S<*GrzJ9j% zbw0inNMo4F)XrCrV92nq%|o3vC2bRZ?kN;ELjS4zD>F5NWKQZdC{o6x5N$d!Q?`rq zw&wCcovD&(M;u8Vg>@@j3RCB4{RhhaJ94Croc#DXN#FVHCo9n>!$jm0T_i_Cug1+j zY$d`C&}P;rIu}g>u+cs@n$3vWxh+kxwB`N?%z4}*fH!;Fh(X`)F zyhJpT&O=AfE>h%Z1+{4>*0$1&3J+GL&4EimKETs*N?KyjHG+pQHbt#)qfT4tD>s zM$RZp^$&4l7G91B`FyHP89^fpm*UgX(j>BQD!LTI{@!BrCx;`VGl)-JuTLzVFfWVc ziq?&MvnG*X$6!wX{)j1dlX^06bOUr0_bJPq)l~)V0djh8{e!5AI_aW(F6pE3_?tD$ z+y76;^YtocXVuHDqrJaJNBGXJ0(B`8FLrkqddKP%OpJi#FtfSKDL9~6dLCKukpG>{ zs}b)m<5YIR&uQGCFlz%%J(FMMY4T_aSu(>oCyh=9as{=I-<_h9z-$E82&D~rDn&F! zwN*K@G6-KhDk|G#Ph{#PKD(kye)!|UCH+isbQzG4|o2Zsiv2j*;?y!e5_ zm67EIsm!_h!QJ#hN={_+&GalqFHAY69T|aIpT$Eb55QFlj%it0U;jmC%R+y#qex6$ z)D(US*=VM-PBTFUts6sZA(E_p zo^pr;emt5C5GE^(A;o1lsz2|M1&Ppf8DvvB>&BG!SuU{7n`+ zFhnTSKNwB~OOL85guKr(Zry@DC*(!eK5U1)K;tsf`N5!2fVAx$1Oj(c5F0T+XH4&( z^MBk^hrFEo`*H#>jGo_2Y6lIHUduj9%`258zB()|`FFY$y!YeacIQLzdHn6?hhP4- z-#9gMGktl*hMJj~@ttYF%%bFD6K}YX-~ik`LP3E>c(!1@>`qv$ydE3z2&LUH){(2w zU|L_RB2V?Z7>Pp5(x#zgp@FGQEKMLONE1V`g2jb>~nWE zcXfYvWXGE)!(%rg6la+5^Vi1=p569rOp@od@QgFPa_&UcV2uGgmamGo*~p+`2`qLc zX>V>n^6rCSlVamh;yQdoLJxbcIA=Fv&L87ZL?n|cHxt`il;Mz=lxs~gr20oa+AGRd zK*c!ptEl^)M`^!ho@iKcd^^{7vO|mdvsUu@tQZm=yF{y8x|7cpgXCi`zI=PJz#5i& zMJz+|ZR7nq^-$Oa9NX13bHu<))?i|w^Ka~>xkV@ZwbZt60~b1#u5BT6^E+$pO_<4K zwz&`W=zW8Q3{e(!&dE3QPmRn6G^a)#tO^?Ri<4lXTAucNr>WYRwapZH&hjl<8ug7& z2AfGBjv{d0us@gUM|e51-!>dRG#0B3Z+Gdlma{!>e7NrF1!;KMeZ*{X1~b zGWDf+$>--Bd${y$_=Z9}M+*QPUS3{S_%4k*edZlpDbeTlZ?O=J(1yrHkI^ z-XO*jP`_$kRnos@>^%flCuWb|VFh%BJ`j%gF?(wBN{%M9sZ#&M*6eoy0*Xyk)YEw#oz0}E5v8wl&)^}M zUI7J(0u0aoRbd4W(_l!3U$Yc&v|pN;FR~D>e`E9g#-eh9pb4F2~F zs8_LkCLuoP9feH2sov|1S-$HUy?fI3`n)*!r4}cRa@uqJT{ILA8%Y7d%E8${Ojf@E z1)H1|qA{)!JfqVp;71sx`~F!w2gqPlSAJZQyNPsQ^fLv=11@G_R`j50gZT%+sif^* zinN8^L_D27c6m8DT`C`gfMVVVoNK=1jP5n6MAw$b4OMj;3I$2St!U*zf7%SCMd)hKC3E zQEGj>*a7RmzL)ivCEPLMxBL3HVhhDDOwi}yV!HAnEP2*oCNxQba1$ha;d=$Nd%PO- z(HK;}Nd_mx={)DL!dKI$c@{1W-2{BzP_nNC zy8SkA7}-~?@}2M|Hl5_^#rE1k?Yl0gbvKamAlcp11LvrddufcVNR14cLnvD zJqXJBZHXj2OT0GI082HI(O0fBor0eJ>(hX@-1~n>h%yq4wV^rpcw`&`oE@^QF zu}L3LW{_D*tt}lRvWB{8v4+@x4oqb&9|9-60;s7Y?occC_S38zqhX5XTshK5k2*5+ zrv9p$tX2{sSm19KUS|(NK0DBjgcbG(Pks^#)<9FML6|F)JtT6xLdWh~#maTDsKMKJ z?-YHW$DC5&K8JF87fI94JB;QceE_O%7Yf)-0O+@2ToXT#txR>hSxsv_DIE5pGs$Xr zIq%~eba8YFoc+!(&(?v(XMXSOba-!gc-X#q5%3x;FSOi@`z{6F1-k5AoL#?`oGv@v z@{-7HD%Sqc+7#5XunD&G(S5mIKUZ!Hkg(WN9X0>vsPr`mWb7TcLx>G7w{h{*^ z;b(`PPBmbeqHGc<;;IX9NDn<);Q|D+;(tqEsAsIM9+-vqk#S7rZ&-&Iw+ra&bHmf7 zl9{Z*7~IkJWw;9wM_B1@+|#S>hP!{kSIei(i+SAs5Cxrku44PoFBjS_XFl8&TCTTU zm;I#lJ}B8EhS|R(fXlZhqi6_{Z8IK_6MeBl@mtHQboUGJ?AwOQ3gMZM_3F#F$})(B zb%L|+-3Ux1f|7v;e(L0$-SoTii}Ug0!XOGOwL*vVpKm7r=)JG2h4Ygo;8Y1Qe5EG^ zOq&1FslI<)Wi2+*`zG7eClN9?NKRV*U zP8|%SoUJ!33&lI}C=%k;*{7VJwnsP8WCXNhyP0sCSanQeK4`2Zp8|Q$ zwV;GIi5Ue_!GfCP1T+Z7Kr|E_=#8P@y|%EOCPfg-`SjC`<=efxle@FvJ;R+q+zTEr zHoSVKvM*P|cZYY!4j*o&h$B39HIwolnSBFTo`reT2W`H-Vt5Hff-I4%0g=4)Y~d6@ zp^|&i=g(ZTP%#C^AI3ri<*fRlbv;yM)x3lJ1RH9@fx`$@y zB>E@K9KuY;KLbASA73nkJx;{QVo-iY;B_M!jE!E)_KfUeF1~PhT^erV0j45D&hQB4 zl=$^$;uYb^vYVa21pBYhGD*cA$bgFm+l3`HOhfV60zLKoPm0%&whwi*m*>hykHde= za!Fen_vFynX_0f14O{5`XZ?Jh#KNxQr9CA+udMUSHMoB(p@f}WIk(tg#lVN5taxQv z{RS6QZ}}<5`0iTj6I8<=GVI8s{9pVsTu#=hS@Q`gT*yL=m%qEv-%v*R0}@&pi>Ja0 zsH-yv4q+KSdo97(T29ASO+Ssl^fxoo;}a=%G(RVgokU~?Q3g{o#S>8(n5lQb;}39J%Qw2Sh9)1p@R7gE!7NjMbyR4DJ_}JiTTXbFfAyVM(XR{ z+FGH+e+Q(TIlMsdQm8Un)=c;Nn~S6EE%G(F3M81*=7q-Aq%Q{J-Syhf56SZBylipy z%g&Yl)!Dq;^3uLdY^ax?-^KQ696yH#ZLfPkknR+)IB{oPzM7ly&PhUfVqAV2Q)WbV zl<_t?(Jqq`wT?^Z8%8JTVsR?Q>C6PbA=yj>s)_nz8WtL4;)T`;us9Sn5`hQdl`{dO zfSp_xIzCy1uCa=VDT{H&>}ofl>G29nwXFUeRrubHECXhNJC&P}d1bb&%mlA!2knWjE}mzydD}kBB||XFgDF;R!z!w+y~iSDqY@R86elj-p= zrz_l%$hLF*ph*XVIy8#cCa;`MqCP7LKIY9o=`#hhKIX5}xP!C1Nxf&H1E;-@gfPp2 zHDXpKc3%{c}O-gO2 z(1ickra2G@vE3`ts3A;wpU;pD!p%aNgRghgR~yhBK^_b%VZ2I>(>?& zEW$>Fz=%LD`{o23R;2?35kiZO=q^*jUtE#EEv8aJIxGQ}sLR4>idoWwgw*c6AAK|G zd)G(Wc9U@sv=yy0$;%|?W7qF{_2l}};qLG9&C}z*EmNckky7c~ zL~#~aHYz?OuWFt`aUA|-v}x$YV#Tu&c5{XzaoqF?p3I1mgK0h&>5=riebFWphA^6s z<6mDJoT=n3EuCY0sJ-m}v>VD|s}UQEb6i+lTtsvN$sE(}w%36-zycL;(46P+@zm$j z;?sv60hSbYs}yfct7b}TJSwx}jNSuoVgx8b1xS2ZR*5pdLv|Au6hYx~N!@H6>L=+e z-4K4OXnJyGQY0Q33`D~O`Dz;{C(jLeO#7^Az<-{C9siNDmDIP9Uw<#2E?=JC)oS04 z1yhZRG|+39-%B_?lq@`K@eMwi4~=c{!X1Z(DM7fz}u!VU+4FNihg(b_cu~#t~PT114k0IQ&@j^l7S!2 z$e>qy0!svi^wsvL*wa*gX73Cnqyd4x#BX7pJhHxvAvp9)X5C*bF@Q8oF3t&vA-o`= zKqDzU*i?rBqJpA!1B+v0rb4%eYkGj~K|(#oayI6HlJ&qg1ifk%tz-hck9h67^{tFU zzJZsF*P?g5W!iz;2BvNg^zfKn`%@Lpr$+BO7_X1o#BVRCT~sIQ#Jo#M||a@MSB#L!;^Tp?duggWOED4>8QR=D_OH7 zrI#1B9+Uy;lc#6*Y9_q{#poeF{aenuHnWMljH#xXE>Nj1q|741 zAVh?9?X2Ui7}>);+n@bI052xKx2O_OxG#?E%x8d8+@hv5cHBka&^E&>D5z3e$Ni*u z!l|w@!|$(76v(R9ln1XQ@2uW+3h{KFn=COROZYr(mA^orS~2b$l9!xJ%GBb@OL6cl zzlrM!^(^qd#Q(g+KIdv0(P-)pL zs;7UYcaMj5EHLa8{Rkus7mW3TGzlb){AQa7rTJ_d!Na(57+c^u9Le6=RgO2@JG3#( zWJ{Pzu?yV1U&PR)tdsI;vz77>_nI>05*DuQBr3*U-M;c7B}$9bBEGt3hGQn$NmVws zV0hxys18YeDq(qDlS5Ov_B1h`;J8x04NlG8X%(`QMvC5lQp@!q+bxgaiGX71FD+5q zK~5%_`#=(_xVkxl*~^M6!F>PqQTUZO4VUOM{=yz=kB0PsW88g?dl&r^erVlKx$a5h z1x>blP!k{fO%bPL0azywSy2u}pa z{7d^@0zV(sp1)7Hn>>@ak2H{ykvW%6w(EyhS+oEb65_2oDRFf^ZOf!VW>pQgdxx(9 z>B(+!_x!3`lBDbX#%Qnm_xXdECjX;VlNs;cGcR{{cd>eE?aHRgrvR+iNW0ga{>_`C z)&A4Hit}8>CI6iYg?awk^V{9O*ZZ&J6>6u|W*rZg=$P;>e1(Yf?F@!k0y z_4lR-g$;R+AuTxi!)qbvG_(ksog{1fj?u$wif*p?&l3OB2#rB6Vec(l=P>f(W zb+*mJeC-cp@HhX-RIg`|=MT-QL)sxqY-F;bS2Ru%bvO+t1%i!aCM#0s-cu$KsTO;H zet$20GA^E@!|gxQ0rBI6?nsfKLBioTD$duU5^0hoPEryxpWHM@j>$=Eb(y!HWvyeao#1!i7clHyufB*HrB!r}4{r&vnVXKj?9`R2EM;u4Sl1#J`GWyn5YF16$ zMOgZ-C@&=DiCvTCQXY%H3Je!YG1RkGe%QM4=w}jlugPj&m4@O(C-`v|U;kG;;R|t< z+R6pQr}r_^$+H1lJ?{>82g6|GwC^bp_hokN392usNqLImt3$fx*NE1 zZ#jK~cq2;kzN}5SC%x;7dDYCK*e+1JG7p3ijm~x=ZR?+;iOi>vjG*CRC z3KCw;ywcA6?76&tqh_t?)D8;$tfDDFLU!3ehst63&~^EWGKf~)-JQKcB ziPkqaYs(jlGPmKutc>5oW~$24ot3e>3Q+nu{&q5al@7z_R?PW*a!iFtJBOlKM2KeP z!$N!g!LOVx*T~_jdLUs4hBGhrA3MiDo0jz_5wI%lebk1t0mY7Hr9)iPBnN39y zYB6`t8ZbIcA^SSXx81-RGG5ieExzd0u8YXFeXLvk>W-FIjNnj->G_B8X9~5_7{^R` zhh7jmJMNjc^!E>O$mO`9Vm^SYy@Ppk{fhIy^!s|RGatAqp3{Zl<^))n!Dyj}Q~3D( zl+U^N(G+N}FzD}Jg?(firDg85gw$CF*ZsjKBg;3rQ=)-hyk^gdq$#a@dLCL{90gy; zS>7ElU(hcsri7Hpe1p*`lojESCxOAv^9WY(tKTpsfe3vNevv09St62{mxu!}M4QJj zGrz60LiJFBtjwdPt3TH94V>7%%v`Ttj?5G7F@8Jp4Rr~Wy}P{}85s>(0fHGne)thF zhxcU<DhG#7my({C1s>qTIT{Trf9(gE%)5Xa)eWk&3C4ADq zKi)7(jFQp`5^I=6)o}Y$4F~tm0%vn^cI;oXc%>hiJEx|C^bwU4ui6L}Fh)fo&9Oqi znN%uX2cXrO_@5zjUXKACm0-%jjOl!t$Q{zZJ88 z?AVn^0jwK#+E!P|Wp>Xkzh{k%A+J$1#K~SM?fypi{k5ZXF&=sbYxNuE$TxT(Aje@h z!KhhBQ~5YUGUHHsn4ms7 zMN=xuP{CL@3wV{5j_{4Rz1+ug^%!GPcw&;_TpE(|kK%iS5O`KC^SN4_E75yC0b=#s zq(CY9{PH6j+uB+BW*_>_i#7b(g@vVPt2$>62J>pV`x^^~UJEZrcbfLE{=AZ?oY|?Z zt=*XqT=u3;)1Ir3$LZ*~GQ8a>(UaQTLY7(`qp3(Aq0ZnuM!8NT`z@9NCAo ziiO?l#%1dv*cDY(KkZ#MzLhnZTnb?O9IhJ(ZRf})s{Jy z3cd@z8{OV;Tl7Fw*sWJQo(?iw+z;NcydAvzH`w<4{Ho{InD0PZm^&c1_IJJzr43ZW zd+f|7qJ8@*vxjd$4vbaNiyY~nbmF(+wRi zElCVnFq!<#I4_B*IQxP6C`GWSbu29oIwmyf$Z-sIF|O>OO(_imo&nm>?=T5hBH;&FN3ZbNd4MoVI`gU>p{j%Be8 zR@+C-TV~CQow3GlVv?Rq3%2ynYp6)%i`X|&a}1~5k@9Yfx6;ZXWXu%*=z0a**QxMg z6_6~YxqO-xQGcg;&z;xq8`h+P=USn}dBkky+>io!r2RBud3R$@r22^ zb{fXHKs%|QcJ$5qc!qw)x;FL8&6}3<4QbmZXVgT@USNPR-oU_!f16|<*5ux6SeVSy z^&Zk)?W3x8u1H}*L)I&WUPPk5626*UU-@J*`t5JZ*Cuj6TpfuAIW|dFXs&Cf`@n!&>l{#Y|qk@bQssRVw5`1*9*NKFv(r1YE21o(^@^ju_7WG zU?=c69NPH%c;F@Y{?L8VU9<&glb!&x^Wpr>uV%{7h8hF4*8`v}VBa9)6eCW*l$u-* zk#WNM0Zx4L12Qm7i76AQ7Q73IW%p$x)wn9e)C{YL`aDb+mMDj45;=+)%2(d*$U;mI zDy1xe8I(C%UdelPwS@C{CF1{VSg@)?>triUA$Pb}pznDb#s*|hKabTupX@qpk&J&6 zN&T{;$`Oi7gG-6PCG(jknNF#wm{f^*2;+p2oFMDI@k6Va`@r<|L1Fc%STR_`b8|?A_8t>M!uLWV=LsU$B_bC! zr{V1+NeZxPoL%yoo-?AJyT+IME22Pzh(&@11ruVAYg@y4;E&ziO+Emoh!+0NC@-H# z1rnW8Dny{Fi_fLD8quwr)J#i!6Jla0F5Xb?Y&&9GjU-upS(6f|hR^7OcNWk@;cnPk zA+dIQSguUDSIQI>Wulsyt*grcZVM5xIs%T@Tc0&nKIwn zFKxoXe}-JsOn){6E-2AVQn#y#d>yymVX-KOrM;WbjJfU3=1<+v%GD9jx2D~ol=+8F zW*JnLg_j*}8mnel>v+mzp*K(jDlA?e=Vf*CEcP#RdBG~1>Bk9(3I+v@!`}10@Z5e3 z*Y&QRsu=6BY&HszA#9q<33-}W#Pbxgl{lG_!C%fnb{77PcPrBV>bB6awaZ{NjaMb; zRq3O3vX90@?NAx7X2mQc9vi}+iyM)@?ioVQmT%L&9GB*3FYm48fACi65>#7$YxBGE zPVX;WO3}8IVDJiIkNB|@V#O84cqpPw!3Lz#yeIt;!E@-k%Mu zR+A%B^w|&Uu3%L?5v4c4{!5Q2r}YE>Hgsn_CSPj9S1nE824vE+_U5N;^T=DymCSH3 zAgS4KW*EbZvsu2WZe8^`{~M+Z)zMM8eeiEIVkE!>F_r<%K+AE2sR>Y!H1AzqT^seQ ztK1{M{Nx~e)Yrhot#*yHL=R|OZFcy8+M{1BZZ37U=-E2>%ajy=EgS>2!%<7Ca^CiA z^8#pHMmedTna%njS_=0~2f1@gmG#P}%awyHZJpoJuD&S=lXdjnz z^CYaCL=D4AM359a9PNLI97GSk@l(SG)>-bvot~268dsFk3CX}H5UIi>l-5fT!)zU* z={`y+iUk%*Eo(+W`h-UjBekD<>EIdQ{nhd#QHIrE=E+<%vy4W8J%N1d(~Z;9$;*mL z=TnwSK^1XO2{K8mq;l&6i}of2xIdChfY)EKOMNL}>7NEDP4fejd<<2K&a}2ouXN zGwtKJ;s&8r7%8K#6^11UM;S*PJ?4OBdq&#M4nZ1pN}O-92hJ2sFoQt)MEIZ}++;|-gE2!)Gh$Yfm21LQdwCWKc5o`-(L1O z|C{Y$2(Q1Ojzb%A(b7DG#|y6j`f~Dw*me2k8zFieWLcJgP_QVn!Rzo|K8lzHU7bSa zUy!;?IiH1y^+)Z=YH1-ugD*fBo#7jiRG91^m*fB?sA>iHz!5v*8UaagltIh76{t&cvCP z@1)lQS`pPlzNq+X@?^ zHq;f~kWXy14RGN;@8D;j&oop*KMVYEe3#BkeY~RwiIL9NU)qPhjGwpm=jsF*q z^Ih%IJNO{mPon_V+7}5O6wRr~h&wxWCpyl1gM7o=26#`nUVywSov&l^3A%e{R#;rv z`;P>O--gdeaRjpWUFJ+-JN>r_9{k=P%fnrxL+*+q%|_yOeUoOo#PrE;_`OUUp%?ao zgjp_X!NI%tmYBp+l0!KjoBM7v_XYZ)67GP9GtFRjrH->)fI4>bS3(I1g<#ym`rDpoJ@GAXqm5HzUvp}Q<7 zlqypaGA%GPzIDVGFJ&r$j#?)9#$Q%&`$%R@0aF@Tq8DF^`hl^0&l`&og=V8BEU}QG zdcIz|#o2ruf|NE$hz(i*20C5XNicTRx%E-P?diP9=gHgW&6nqw*r|MvN;ttudlC9Y z{d~FL>;GgicYmfH75TBgtyT1W{3~8v#m9#%o_CSTECt@Ce3MKR$&dNyOa)6t<`O_Q zo%rxK!g``NLbS$LRGR;Sov2ZD{%bu|lo&F>lk*l$6n#j5g@>LqrZX3-*^PoN?%nx# zN<}>HZVK;5&t-yu8NZT(I-y$^@aKC%uy(ONdakP2EE4CkU)`ruhm3o$7!~w9yzb zMeLA@;!RO~|FEpP+K8p6!p`Q)nM}Y@&z(qU<8?>3JCPN~=kxv8dcl^Ln-?H{Z@V?n zYG6F#!^y{2ikYhc_j5^izjfBSysz8qYT)o;8*~YIIT}P72$Cd@c^%7eYT=+tdapi{ zyc-H6Beq#9Y%r=`HeO6LGS>pkK9{P6t}*X*D&!npBC_nzKCsHqOnKvP_d4If^I_Qz z@u&9;Mf~PBxE*d307k)|%u|l2yo><|(`X{>mzK@%Fk9D7*?^to?7s8256dU99I&;T zgK!N2(i3eh!^Q3CTVU+p-rkM~j@iPT&HK%M4`;}PY0LvEUM)ia#=~)+!Dg&)#|mh5 zhc?w#PQ3%-1`2`1vpE1^{ch~SOVCmK5G=l!*Tgal9J|w7jzKLgoB1z`t4U06M2wSdOIRdSFWJ% z)(=C|0X)8bEX54@@IRmRgs3hkx)Zoy&B%p(Rtdeqpz^k>`%lvPe^+>SD`{`03tV~s z+E<0*JfY1LZ#`V7js=@$>4k(H;(`==@h!E9i3Szh8q@QVZwVP`xuMC+&7G5f#NOn; za=9bjnqnv(6;Ir5Xhr^Z7X-I3%J*5yQJ}*kXCk*&>($uM=`N;C4tF|4T+A0XaI|0(v?(0f766g9HL}c)-*GXea>alSi}u*H8sJjzc;=NmK~|=4Qi1 z?l{-7NGuoy73G{4rXDrcCZFTf)Cu-OWo1RS9}|di1VDfm7}A+qio))@YqNj1A%fZi z<`lmI^H!{G$7~Kd&hoeS?KLCqj(Z3UrE}a9fJ(uN$bYTXA<)I0I7O1MVG@uE9Og2T zX3KTrmh5KA!%A=%X=%iEz%m#i2%jO8s8|SQnO`)ZunRm?(V$^=pGf=I<^@bjK3LAE zt2~30R+9U|?`zwRcdY~KUAJb#$1SZ?14~P-&wGH!>!GLC@6f?!wC2^jvn=-(vcG6h zzvtb+=WC*#Z!ZTO_?sl4hx|@Yn&e_x^~7pwT}fGp3E+FW$lZ|wfiv^(xR=Ws7vjz8 zF4*a%Bc4jgE(P}>jFbn7^qmR9Z;~yLVbk+v%nB4(lt8Ut%>#q@iWu5*?BWpnB;K2- zA+7)PyMAqCjN>AVSiZKNvi2`%jOCek`I3&EAbYhR&46)~hP3~|M?W<9oAC1QV&_S{ zCdNT_pQzd7a;(;MiMPyJA2}Z&v}MEgtJBLu-$>~)a*x%M#oVt?zf_FHF8KQ`@k?kM^-`1xQl@Nnwo z*y+p{I_J+^(N&_EUSk6W=fqkpdiC5_ig2Z(ujZeXSQo84V^o+r?bClIDV>C zrT~eH-fp)>?RDAv;mPaw7U8>XQGz-o>zU~?lN0hW$ah%($bZykyd3J#rC{&64Sa8u zvpPw7JY#i&d&G(JdVl$tng07u&gTkisqKCC`|)?Nvdx} zm-`Z5J^h>Y_rqBVgkFJ6`g(UC%Ce3)-;_}$lljjYSVMM%(wjZ7#9*X?i+So1YDx+^ zOige&&^s1Ef28_g;sRYKq#|E01=b^NROLPyCni-EB8(AotEH8vocH_M?$3*xKvB_( zBbung@7^kVw*$(}?cFM|QlrKD`L~M2aHWnJr^U6D-DZFf~0QvUnJLEK8(y8bTlJ zN*8fJ3jrajTtR{nD3DUh@R5=jVP>Kns2E`|XW0e9P$|h-+&HB-VxublLkUlpFBcan z1*9HUAwN=+IhsE5@BJ-!x!LVLd;9VXjAZoke%qdL=AzGR&rkCF0K6;{6O{Mh0a?OUBLt zYZDI7DfhYi`@^GytUW)AKYYb;_V$S{o}o^^x)`c1pRr36aD>z9DH#N^&>M8oG)^@= zYHE-8R8t8DRO|DaHfrLugVxnw;cy|+G}E@WHaW(;f`YXbpds(*Zv!ML6LmHud3XpW zTD$=4WzSXoN2<)n)bU)tGqc;F@i2Ffn(=q8zch5LyuQ_E^$HY5elhZcpenVCOO~nO zM0Al@j*-4ga4Gh3i<`bsV5CLiCWao0r>isNjj^lkWR^xUoQ0t%j#DCb&0I}~ae1&1pBV)a}ZyS~Rg8u>+cOV0NAyMkZA?4%M)AsyWT!_bRxhxN0~U^ek*b9{ux zK&EkSVwSVzixgtjcUD1Ym%peMx^nqlaRmQrOxT~6EvIo?`C55W;I^Tax1D}sV$lCh_&LaXdyF-dc&wl5&Tczb$Y@AScEoT4 zZ5?J8aHXIPegaw39~RC#*^KGrOq_eo{rhHVd~)kMo%K!`R%k=w5JffFDU?~e0(S|= zR?8g-{{5Utw>t-c$$n*su6gTx^F@P&T)hg8`4d>*xqs4*N^Y2}XqljjhQr;XX{dD4 zfQrOz-?Vak>)Z9K0p7BFe7ML9e@%d^lLojv0TiXuY#oT-u3CsZ!9p*EhnJVvefH|< z8~^g_E~f=%T;gCH;s1X1lUrFDPPxMN|4=*ga5=1@8}n*c3k*>3G&k_%o6Gm%p)fdY zp>&Dt?Baup@7=EwZqLu|K5U9LS5LMb+jgy;4gi2o$fK?<@GqoACRdhuWrq6=AO!MV z4M%CnQkK{A=90<~cOkQpN?e${=0ltO%={U%4!gIQvaXzE%w0`8j5W@pkg}J978rbI zm_4x;JbrlDf(DLx2DaAzSz(v7q_3lEg!$a!JfAhb%uY1{yhI}NhebA>@83Dj(J63K z5@11lvF>UNAF>n^4D_)ozmJ=^F{v=pS}EdPk94-?6h;)8PMp3EijAeA^uo)O&z2$! z36G_=N~%)faOMnKKAC)<^O_ioG8cR3Y2ug<3w4B2EIJwTIZ9Ti`}=3mPm}vYxtWK> z#hkF06r;6&=>H17xDsTw6M=NUs^rp0B#9~UIc#KKA3Pp?YF@z_0Gy10womNAbzFNv z;CiQyVunP?5~KE9&w*Ynmd5npCdbE+AA{qQK^%j~W?v}mGMigDLe(U-4+T*3G+zfX zDMcYe7$t!x4lTz}apujPR^u^XWkXu#^80k1C-Mv{xRVhPuF3J2H{eTe;;Aw7zP1W{ zh6X>;LbFK47wQ1EB&S5;8&;^z*VC-w{1pD+B|n|S)#)hxYLpP+UrI-wBqwd{FkG4 zwqQ1wKLRoctFT{K>(Q=FZTHW_^|en|IsZ_n4aqjAQIB7GU7dfVYGb1!S;ZpyVCxafD^vd&lba2 zwVaB|I&EaFwjR1uOMBJyZN7rk-BMG-A9L&+Fdkj7uEJJ|*gQ2&;ct;F?`@fN%G#DT zT4MLT_Vhr*iwvj$4tgmq8ivz)nIFLzYOjRic!IbL4w`#8m+9xU+5QM4ku0?b>ewWX z!v@+h1+Q3;l})IJiS*@N?JZdOxR|plJq(%Bc;>>djX91Zi(^8G!!oo=N3!AR z(@Bir<<7ex6ws8=^Il8V60ZWTigekS<0uZXU{i_yDx~pCQ^%25HH(#%FJtzEQU+PW zADh0am2hG-m5Kb>R~OsXm6>|(SpsZZ(;?*Sw~)z?hye_*M;6i9NBB}XCNc`?NZ_Qp zH#1)kwJXz#XHt`uk@fy1TW-r^-!gPAfD@tvB-zW{JUm*~POnu+CNm|QCYefA_Y+*P zhYwg19eA!(IU1T_rW2((CNYLkk&E&aJ5tS@r zsom_^1rQ~e@ITHgX{8TmstdgCT5$xpP4LIzwfp6@Yn49PW=9Gy1J}I+!pa4W5T;ezcR3p9;kQ7B&b?Yi z$Z$-rXhb7v6od3#V`xce8t9@rvuf{N8wFOk_8JF9apPRh3 z>n!L?J)r*`BI~uT;?OKT|6_9dT*>yh)ALffc4y#s-3|$Ug^;r5pk3J>#Yl=BF}u%w zLmh!0+nWU2;+8+6#HNUqjzoW5#QG+Qk;JWxQJ$`(f1wyYrbS&2$^6*{HzIowdy*e3 z&PG`JE{~_S*t~ol4*I<*W+uMgFCf zE1kF~9Vr{Yo=Ho=Me1fAZYoRK@UdGO{h?(51sG&5QPw_wJ;n z^6%$X@#})7Z-uA?bSR3`$u*q;&-lCe(Tgo}90!6)l9t#kH>ISA+CL)R8%8yAB%cjx zhQ0Z<&$=WTv%-F+>>%T0DZS--ou%{9pmW_+Ui+^oj+D>uNtwPa-jVKD70$;AXh7&! za*k|v`bU<)?TBDBZ|mFVNK6Ce>oZh#!)K;f=AF6p6-YHYR(C7B9A4cQiWFlFr4=1G zgk!;y) zqnq6R?97x~ni3IMNoW`(&fHUQ4ws-Yi)09V;f|hYTo;qrxVLMW3d({^Rzx-uRB9{C zRC&8s73vkhGu34}vhv2M8YB0#dRdf*@xuNb6EE)QNlP36GSE@HC)6^0tZ}` zK)c$y=D#YT1MD0RzTE8cb6^~ztEq91kE^FaQCvAXu>TEE>m9md0mdnZ<+oN@-i<5y z$}2vtWIg~fRlN>?=C6@q%hNb{?t<7ut*fdJ@3*fHW5(zoHv8Iw5j=8~MB*h0ah*;a z|NDf4@Rn2U!)ld!JqJJeg|-%Gt}7qT=LW}2e#{|=1|}$oMOHj$#21NyQBnjC^f|Pf zIV}0~hi?@111=?r9Ag-MF}nn!EJzok0f8m4WTdkq=(!Dk`((&_*lvrt*g8ZRzQ^BnD%dJzBe`9odp4pyvi3*-xlM1b@{HizBisZcM zMgqO!VUI>fRQaTyPyVkj0fse5I7k>pfk8#3klX0GLu^StN+o__VyyxNfs~Q$U+dvY zr7u7hHtb##qXh|p!_loaItmsAB{;hL&%UI&J%Ty) zWo9M{u9Ens9_X}aw+W9LtcGW4`I7`p#UA$jhFxMm_A@sYMNu71)GI4!p*nkTD5A0? z1*IN`2Z%UNAq@$(@u3Guw}w8mbvWInzae&tPD!xP(!|OD3%>yR9JHRBw~rU|;a^FG z+*nJ!T-<+FX#;&SFb9_I4?DgnrG!`(v zT5F41+kXyIl7-1*jQpaa0V3HDa>{=q=b1wIXzf^|-6{a>I;ZT)elG{ckd=;#V~uf& zvqlC?1dNN&Iy3-hk)jEm#&OV?hb`7-12RB@aKLH}7sP8hV4w zJ{v$&w|oqC=~=V$0b*3zH~{go71tx_>y+=S52c$;1%)269(7g@c7(?k16ia1ca`nyzCE0iAwfF;A$?G77SkL-Lf}Q zDI%x{Htx?63~-GV?s-A?XI0~5ao%0bsZF=WBNuoPL2MBG$jT}Pe@>)DzBl~vAyUX1 zt{pI1XwFY>IfDz0rsq_kM<@Pb!NTH-P%rZ>GqQg#gDBnU@}l#ulz6Ad+Z1ySz>>M< zHc(q7G|BMtt<`Nm4HxK{-T4uc(X{P-5uRxO{LwOeyILX}B`=!VeQx_ea;JzM|6L1T zG~BhQ9Ee=UP*E_+e&7&~x-uD6y&EIe}hWIrv?JC)=jbpLyVK5ei)UTomJ zOvh6myL zmiglQ4H6|lh@x`(QiQlkRUA9Ne5ckAcoN@+uzXFwk;Sz-jYtfr7CsWkZfFD~In z;8$|Y3Z@YDAN4|h=Ls)+U2K6i^O_v7sH$_`NEp-B40&eu*_N`LiRW5mQtQjYcUcAZ zQKyeTp#fxFa}(<&5XL=bCFu_Gq8mWVNKn_T>B@bqH1F4jvo|Gs}jSPjz`|#FLQ%w_fnmv7wsotDxTY z+8TpCyu5n=|B#C1+0T)aEx=Ar6>>P_GRs{tyKmom zHv{ky9sxvaM+e-E5d}#XKa8jR)K^BD`u704mxyIh*n+Oz{F5d%li}iiY1fjy@=(cN ze#7lX&^WQ7%IPtF8nCI&)O%(5mnyizBas+&x}QQ2tKxk)%Dj%=?$lT5@Q;8B)HrCDcAahoMSdp+O=486L zljG}q{%2&)A|FFnT80LNu8d_^EIkFG0?R9JGnm%O$Figsz>0gooems+tjTvty zl;4a6q{|&0{WZYS$qOKm9@DII%f`LJiwO zFRAZ zXfM{`^>5v`u%mWt%Y;^NKlstMnaU1R$HTDV^Jcl;TbSeN2{3&+|HYIuHeNZQk9!BW zwe%LWfY#VwAnycwNG0GRB|^hjAP?EPS)Z(9LEkqZ06Vg^bqH<~@8Ij<;o<5EtFj1h z9E*Xp9X^!nJpdtMCAaP?e7k;FhsQV0e38SpjY^Cd*^YZLaPFEpfiJ>8E-z!ih%sJr zH7wW_U$YN^lPN@ENRrr7wdiDhldL zbWu&!ZMP=XMJ(>u4RLk}SmjoVtWR)JWRdLt@-W{H=v`0m0r%qfwWrk*E>Ff(C29_b z%<+|tv7QItz(?kunU^0062452CNL^0a|F5XxHQC3B%>-69OvMa%EeQ^OM2n+=}`RBPzZ<>?|vxqelbA)B0D4jz_}& zy;l?xruRL4+qTQdVPUe(ku<#J!_nz|OA5XwHah!xN8sh+3#JKXAd;ZZOYs9vq~A)) z3QU6=)QizcBdYQK+QYNuca=`1Qmo6~@7eQT1^RMFSbCgP?W&SU;+ER?n9>M!VZVH0 z`R$UsayYaL6jv-ydpR5bl5KvPJB97&88s z&~v@a)_qnnzpsl0v;H{tXx{o^%_06_!1uI=C=7Oy2tlzoA@7Vuppha+#!D2l`^qxU z1g&~Q!IE2<6B=4$Lc@WN056x`ME*={uZM4O4BKn3(Q}GK2cWvhvXaQ?q@RD>4%jx^ zszfxng*8Sjf3TaT%8U24ve#>`KgF$gle$7;uguu@=~6bmT18SYjnrb`sbBXK$Xl2g z)z9hwwq$SA?WdPcTNDcBL%pt2VoVOY%~#EJwa}|soOnK&)W3LA1!5y*s5pc8kp?qu zHm23bC;6i^gu5}@^M(C=e0}YzS#v++DUZf7=+D#mo6Lu)nAMTKHCP00q9_UNRApqV zW!4B+Bj*WwpVJ-8U-y<*10{UEdg%_!c&3JnOc}xa>-_OBL*CIe2LF=rm;h-jh#?gh zcav+DME-1s_YJ;r{Dei$taEO^fT40|qp?p$&p$lDrQn4Cao3Di9`#^jhx|fy;f=RrOg-WC!)Tlw6Gk?@y`?GU&}4vl4k8b1Izg1qd!flC&Kb- z@)sMlllbz8L8uxRugB)>R~vV#9tE4Oe0Hl5-z${>Y3ip%GSfoRI~wk{ZA-@hrNGT^ z!M!@fc&b?6D=yZ&Tcd>C=U|DNkb7563jMzPg8BcPX7{&0Wr`UvMF!z;yy0^%041h5 z>fN!@?R5^XIUJ)WGF&W6)%-#NtAeBACJa$irE8_3^|(%IZ3BYIL-_|d3*3cttlV*V z0Wvgh-b7*41{{YjA1zHh-9Zyak z__%hgo!&+?)Z~i<=4UJj`?_cc=&d(<>)i6Zk~Tza-5g#vDF4NDokSyU*s(z z5@6sRBqM1a1C(0?rs(3;nuqlf5)eMFRE^erDA;5*4s^j6ABiWxt64IvDr3l(}3cS)NcwTl2yjaFjug`-soe5rYsz|Xxt+tU$AuWgS53A32 z(3c3n9Gg%mR47MKC+QR#S0|=mF2+Eco>|3J<;|Ktm?~HS)TIFLefb>qgN~D?wcC{_ z7-u9ytiIg!0NpfBLDEYr0E{AxeLxjV7tH#e2#RaAn5}BbvFy@%+i~M1c!F~jBIYd1 zz|QKBLW&;=QZ+N1!t49xGcUueNCX8C+4rlb9e(#o0kRx=r!W!h)rZVC>KLC@C+tvq z^*=6X>7}Rt-TvL=$rkw18gMvY@XUccGIv^s*L{y_mEZ(a|(Gh+E>V8q+ zv$4*p-&F{Q>Pjd_zD^CcLDSIGOOEkW^yG7!TK;71RuBv-2$3t{YdV{jnI#qj_RPU4H#0@ioysWeiOil!`8Z^Ppw=V1PO zA7u>|n+2F#BDx|W#SJX@gIZyT-8%e^| zv5QaJCoDrE`K9Cvc&(1uu|T;zd85Xi58JiCPU=v0#AKqpr=!F7lXn`-#j+-+dP22K zFQAm*<445nov}{K*c2L-ILA+0`f7dbv6$-fA|G{_4P6_l;v=v0J8w-%-ODBu1>Rnd zQ8CLBCansFTHH9zpx}biO|Lrtuzj`(XU>u?3$v-rdcA8}{+J$wMYztiNeaUy{CUGt zWPmukt&{$p_?;1PQJ=(BRx>;+Kctq6*fJ<42K|}3?rJaPY`WXTJDpbZ1*DST}-icVJQ(O#&-b!<2=}t-YQ)7g-FE&Dl&xbS>bF}gkonR2_$S}V-oZ1TuF-+?IhHb-Z^I}3dRvLJ6OnValH@BOvUG(E zhPX}!^7->ORs%0({*0_M)oz0rlsm#BlaB)a)(vXiYyu=`r|vX%GW$5}W0wS-+5G3} zyDa_obVK7H&Bf;MQ|R$KK!B?pLuqqcqg^@hTxzL;Y2{5ghN!yeF139{;SIHSD7rcZ z&WB+|YU*^}dUvB-d0Yc@0C0FLFW|qE);?%Gd??N|lbCFSe_d{ISg-@_wNrk=3-{?# zf8`Hi8ohA#q_LCyUh!@92=v7!dyyAd+%y0T15XbiR!wKwaP5{`Wl3_O0zERgZaI$( z8x4dG?1+uA1CEAp(c_o_;CK=Mf@pEp+Sg!NoM4ZwoQK4_;~EUeZB{5ri2^A!f$0 z_0GZSTZ{3{K-KZfZ#Ecd4%y_)FeQfACkk0`d&f`xG(W9TW^uCphmAjP39|GGS!>hM zEOy@V{{6!DoIA7vy(K>eAAx>y>f)q#A?@~|I%7e^FcUFlgNGxzKPOYo3doq3eK%_c zC-Xiit?xk)Z7M$L<^~+>25!9SxllNF>rykvKyQn#+cUUbjaYl?dbv7*KH=K4aaon( zQ1KB9{^(uLhZ3?CJKq>BH&qz1~PL4MajGMjH|Pj+7TcflO6|PAQ3JR5rZ`$eSS#ls|9dA(JWXFa{a8nHIw zMlz97I?Ezv`;)&t=NbxD1@ksP+?&5y;mB%U~ghn=6;alJ51UR_Av< z-LdsNFYH;Pg3%$(_h(*(Bbi50F}0KBW<_hu9Qa9=k3wL zGWO)ykvq{*v$@w*ABvUKMTVRV9+rtCfrTq#MggJn#DLMWrl}ctwg;18;fh_Uj}{#Q zu@Z|%Ad0EEiHW!cAAaN9f}T{_h2Qg^>eo(p-P=|ip+a8Y)=u;4E36KWJw95y`}-R% zx}OES&$(7Q?4s|-o%jwTo0OEMFdJo%f7`5X+q0H2WPX$MmtXfWli@buIHnn}O?hj* zg@It|1d1+h@{CR^-;!k%SQAi;rMHs2v`>X3p$SV;;*l$ktp@LA!VB2f0(#iSIJ3Ac zl~F2TiWQ!uUyI$~Dh6^?oOo&BG7`D^nSZyXIS;Yv3Fv7BhJJ3s`roWz3x~o)VY!lf zai?=13nJ1j*Crk0D?#@eB%j68Ioduy1-;QPO;zJw+}w9qpq zgH?)8xm-v3 zAu5c_B{^&AOzQ6@fkjT)fU_>>^-37z3qmdn9Yt@ZkW)v94x(v-Te|BJVUIhuBB6O} zf1DPF-JImWPEU$jzQ{m|N{5SBfp!WGM+xB|XwN`8q)Sfhy zkj{rPQbKZPOAMRRD+$&Wu$jl!b#pgmrgq}9d@FGT+e5q(`z(nHV65i?YW-#*Z06sZ$@8?;(?4n5uC_TnkWNC2TPbtjjK6Rn0$?f*X)iJ zGvsXpy8i&zO+|(8h)MjS=H_(r2&guu&`XIs=UnPeBwZ)}lU+3>c{urNoc?b}e_qfP z>y0VH&dEkKD3NG;UrQp>WF_H3q|62Q{p*DFFw1gzTTVM#$g-=~(UbTkL3rYna`E^u zO`OItG5r9O|G@~%~#R0(sLBot)tFC1x1Sr%b* zQhLf2V_C_MM=Q|B^&Df~j#tj%6j_5M(#^O0aws#zP}!Nz)w&49=&A0f*_VNr5$!yidncnKivi02M_1udDyv+0VXh>G%zVfdmAdouWJKDIu-r2e6cN3xn53M^m zzt58f>MahC@~Ix2Ou-`?rKc=kG?RosidBjyf7k%R6XnJV88sJ>Dw#H1OtW|m*2tpT z%1k}z;sQAOAKtw(H74Nm!L3VOTwy=AI-1i${oPJ8 zG`3kn4Iiks`iGkLpCttO^$L3Y?zTosJl3!V672xIqh59GyQv(@+r6LEySe-K+n>Ds z-K9dqCR5dOa+oPY_al%wtS%4!ZdayUb2>QUF-D~vd3-3t{=5kAko4&jdFhJiO42=? zs4}N^{g-Jq@}GGu$iTQ96fT%wN%jYuo~X>=^A)M`l&0gk;ud%xQ_uePr3ARSUW#Eo zh?dhW%d~2w-$6R~({qS5KK%Pakn(4Z+K|(SDCJU>+@fgE3}IGx3K#NItx!ma7UA#D zd^&J)I90uD$!GGlwfb*Z(6oeP7ibZ-5|T9i7e`4(?h!enulCXi*Z5M>AyT?TUJL9vc}425ET4QMcY#rovn_LKIt$jwJ!OmRbA!G} z4FB>st{4A24S91|r7blr+7H{QY6n3jD~|M`32t53V*s0KeCr+1=myu{-;bgp8q-Wl%6NN(F6kaGhn!iYc}YJK{u9fj+IgJQqv~ zUu$R1f815IDdYToJOyBTKdjy5z1)gK=nzf2H5ZDO9f;7o||%)y0uJe2wJ=$`ogPTO}Q8p=CY%82qn{Z@vj1vL>6=$*b|k|z|)e` zz{SqTplJd;d>=~~nubng_bI*_IrHLXKGxGWXif*TvhA5tX0dbXmknZaDI02 zt}o=B&u>JYc*mB$PB*sHcT{#c`1Td*6~7Wkr*I=BpgZY;WYE7dV^!|f^MWmayTT|^N5T~ z;ywWx9IRPN!xZO@BL6B6g$A4)2G(OtQ@60mz2uNwFJY2x5|*##GDJSjbEV{q_4Dw# zIGC?&XR2yG%KINjXBp6B|9A0$#0X)8FqGQJAxd|5NRCjD?vM`YMn>1@ZfOMprIBut zx&Z+tq??ff&-H)a@NO^Iwd)t>d(P)H=_~8Xl53{{fJw&>AQ)k3V`}Q?*=xCJxLmpX zyw}ui6e)v=vB?0GLBh}Vde_J`ciaZhW&F;!r#Abmf#B@kY;4Ag7z$`c9mmY>?Cf0p z-JL2?8h2jBJifX5-Ln%*&4ps0Y`6>3j4<3|&gn9F(Y)joHUz`@z|9p~Zcol&Ky95O zK_&~9K}Z5MGupE8>u_N1(_ymu>sKE%7XIvm4E=swq2(VS9lLrtgkM%V<&_?!Ocg^u z@|r`STZC-~H|{3iqzI)TuJx?eV}JW#3T*Hsbm|<7L+(L)rR#z9w5zkI@Oo?9;Ktx*7A5SaPjjr-*m<^N@8UIQ#mM`JVTF_>^1)Bl@@x@y z0-G@j1h%kG=%2n)BSXvk-pG+ncaeO=AaS=jw4s3zMycS2Qc3#xE$IW$6>w0eQi|YX ziUxQ)Ipeb6m-K|8Xs@P)!@&`FI0iZ5pwH*wl8fZP=2w@K)zeduXIEHSKu=h=Kd){* z5ZlUq8C#VN7}j3`Pl>)6F-xrF;FQ}kQFdy`q4!k*_C@t6wxnzRRyal#!8l_mW@}ax zHV}cLg^LmKm>p9x^@E&UZNL*UU`k_8LD9jU(Dzd$W-qwIA>9#3g0y7aWUv+w9E>Ov zH{cp=w-dZw?(E_0t=e#y!RD7Zdfz4{hq>a&#{PR#)U6S{9xhdHI4J%loh0#;lo7&3o7Tp{^TS#UKRfGMPr^`G`&==+_fM7)B> zz!=7e(EFsJ$SD1Rolq}Vx1Y1+*X8)^8AIUZzdHumuHMckQ)6di{I|tJ5h<)!-S}!W zfk~yABG`|}tyME3>-IQxC_f)9*|Z$B&G{!Llaav)r9ULC@g`%D;g)_J>3V6fTVK6! zezGN4EJ2Cxx{c2KcZf3 zk~@U-Ayh~YR0q!+-P^hh-V6i#H?y{hD*;=hwwh8bjRy0rK|)_Agx7)4u&j;fr?Zt< zc4q73;YY}qUS+mt@3d{5J+4b!f)B3SRx7x{aT6p+)fddN8xR^Au!J`A?jtjkh=z#P z`+Wea3zXiN{+(u-w4wXtVM5~kqHNJ?^>$tA?jrb}$s-6c_B%(SLCly_L!Zd@dPiq+x!3u(Py^5T9i7 zFnA(KPkul%^^^+?FjJS`eVL2U(wqJJcLb`lX>cxMn-XZ2u;L$wB|>S?x$ImbV6)0O zzo#|~m}G0JIvSCx7l3Ev?CcC!@(x|Pp|PaJ8Us%`HVZFDxEaKSbwJ-uPK3_)|7IYTx}wxnzJ?yUbBbc3wV)jpKq zAbHJIX$xoh$Jt?YAmvGQ9IMlOpzo(7n2TN~JLU1I(vzRzs%rCPg8<0NViwu?&#o~g z`EjajiW~VQ4ePMnaGx?lCw0K+&(5e=aUS=SYaY4P<%zZUUzJ3gY?o;ylT9XeesZE3 z&pReP@sx~d{6C-fS$+*zj&VNeaUw}htlatoU6X3&Sbm{al}X>+tl~aPNqK_vDS_MO zUH4TlUBW&IyqKU~9Jk){JU8)ucU5*god!?88yqT=daC?>(G7n}6KfOveSlTNd`_5W zT0LO#A<J1S z(IF5LKm7wrQdL5!ETde$Uapy z>NU?eR<7rZ$M4E#gad_P;p;pmY=PR~iFX`VBS zZwWljPJ12oyCU$5ImR`=K=;Ol(of8++Vfu8lt8LL)6{=`^Sb)Wd!nL%IOIq}T`tiw zx47T=Rj)0B$TRqHZxm^LUESYm%(zVj+K`i~{w1&iQmP(a+~Ow|K)2%Dd<~Rqz11z_ ztEoMxg}Gwu_R_2Mmb?Xh5a$8k?4nk1O(&^f5j{5$S-`wth=?ZODYxRKRK`gvrI_;H z2;s3fo_g!@*e7a2X}+DEx|;{SOyWb%*Xw3(_Fx%@q#W`TU_ z;_pDje>A3fxy~TpZ&x#1_up4<##h_1=-rncTqn}zUIx}=ACf+FJuE2&pAY`mRP{_1 zZzte9G%LQ5o_i7pm!d{4%|ri?E_{fp;Nhp36h^4DCg7-TFR;rg(vpQ)jy8@AFg$xu zJq5}b+)$BVTuuhA$Pco;o3WPwT&~`WdU9Cou$irir2IWk5|Ulltgssg8%`vTLkN-Z z&{9?{rc9imCs#rJYQ9~zS@ph!mcX%Xu!uomG7G5omMMez&2abm1PS*7A@mSS$4XeM zc?=6mh80Z)PlAm2QNuU%z8U>*MNEGp?+Wz7 zH1lP+%iSja>Yd;IMH+J`PXy&{T`i!gA!Eqey9=$@l585gwI2F3|1C=0GNc#W%sjWW zG&sBw#1GP)v`q-UVhcWDd)QqSJPOj{CUjA6Go2V^tCx}?VQ7Cancq)?1THb+{{_>^ zg7?L7h{mLGWJ9$+G83qXriwCEh8Ie!zSf(+te$QRTrH3c__E*yNTf3c>093(ulP$5 zOOV0HRd~)X&aD7JF7Nq^G>9^72M=DDl$eNovXM1Wt=-wpnwcuScMbnUl3m>Wvh#M){_kRI$^In9XXB+6WJ4 zlUYj{ZO|J|s=22&&KI|-sj24BswyC%PB>VsB#UCMDMwe07CSAWe`HNOAZnyoZj`Y> zNl4bTTPy0;x>xjD$sRP=QZ$EUI55 z?`g5-&cBs}CR~btVG^V>H*g?juy%5lwTXWqrFg<9Tty|kg}(oacZW9bU%GyyBhRlW zdn%7-s^$Rs(f1-Z0qYWL?@BmRE9=BN?1yK7;)iFfCj_2xL=s=x>$cvDisL@l$(^8B z6uip~*$KpRd&dw!{vgy}9w6=$xOV?CveUyOH)(i!P(AeYT$0H>aZq^1ZCPz+>DDQ{ zRcHldGY*&1u#;aUqAfrigC_0J!K}@Dnlv6%@ zCf=|0Kd}y|)nSjJBuk?elKg-Jk1bX%hK+8D%IreIgz24bJGo+b2cW-Q(Mo;Aobfz* z0&QQvexwFY+ix6IK9>3eb)GVSVQiRFuZ3$grEl=^oOo>CQdmU9O;EY^rt@gb)$g?M z*$w9Ad?A(^&=PB^?>bfTPD8!4Z46i=j$!D=Yv(Rfn2o~9GoA6>z45x5=Qc)pH2~#+ zMnQY7bi=06peB97k8(qVkcCMLM=?cSckT?}1%ky3CUZJr2qYa{LI^5Fnb93Q)dr=N z=Yl`-a81v{6_R(f#I9Vycbs}m8_3VT*~7T&&&%2V z2>0UoSo3;uMu2nI^y(<+Y(J0dOLgS1?iW_3A1k?F%zeSXo%i>@NnJW`duw*SW8%LA z>7ywDe$-3R6f$nbNgl>@;tWH)=m<6JWGz-mfhrd-;RgsPE3*`o!fd5CZqt|r zDLxu^Zn0mQ6YG_Pgn?MCHk7*|S!CF1CVw;;#gD%0bdG;5eevg_-u3yc6tj~+9GG|r zxcf8t?dc_R{T=OhFwkp+TDG|?+RO_*<|bkdG&;T=GQii9xApTjbNreMk6 zI~ASB6R(3iKhl#(kcurGwAs<}G4Vhm&|RbvVd8kY3d6>qdv$ z-&Nw1Sgvm5SgFMpmPPs#POGDudES|{dDX7Ff!7Z`^?{hz!Pl&P)hktioIB5K6X<^y z&Jc8P`EWcd)M@-?B5`Rufx&m|8hAv}JiI08Z!1%gSVLO{qcG&}PS zaT>fxYqRu;3QdyqCTHnL<4{tDp0sRHoQLc#3SvpQnuLL}~OI5I66@@cP%Ugfcsi zY`uH~17EPb*adLd)+TR+w2W}w#DbK!ofQo^`jh<9=12obs#Na@fmt^@h;G!mhOYOWC7n9!1hNY!Loh( z+cd9)d2vl^^{av3@~i{E$TUbl2+H8s`_AKZDZN^Hsl4`vj3czP^b#9XvgbQu0LBql zEQDK}^7F0G-+$w7vsZoN2p3QFoWh~qK% z(id0yU&s`Knk^td6CFycZAMtFLjkw>GRhRQxkO8&`Ef+-BZ!TD(X$t^m{XiU_KeZO zB3UU{qCDVNXvhu%fqI!N$$e7{Q_JDE=uAFtmD`AaV?e93a_wC_`$freRSAVnQ4@fl zdFn*{koR`E$DiS-V*1U0*8w6y<}oO#6=fH(g%jn-4=OC-!qG;Zk5bA(8LR}zX(|S@ zX)6q^>x*D<>GgRxsOX=O95|^TAkoqIFqqv{^PIjWf z>!jka2c`FX8Y$J^dGZ_=E5&rWDI{6F7U)I=dYqbBJKp_aG@I4{$8b~K#EJkA7*$nHZ);CEN0CpaHxk4FvZ!+lf|#8r zTXq;CyBJHsWI{RX+>$f7HD_q)Bsxvno3w>XcCg4QAU4|20|l|ia100wJCbx!jrQM^ zY)$5i`=)@yTUPF8q8P+=RMV`l|ILmz)X2sWC?2)tqkx8*=3C?ATn?pYwq&@3Q_X<_ z)mUb$&0|`Vq>-9fkv|OFAL(I!`D__~v=M+b2X+}17@3$(+QgPS0;NTpm{|)i3*+tE zd~{7!HWs$hvj7v_mmhk*)(ny1mML>0GNE9dzd^@51DXFJHilsCt}tP<4^Uy8W(^rL z%XTja=Q9c?(m66QZ^4`Hi4PD)5jiqk>!s{&52>*jAYF2K2n zfH8jEUiQH_Uhx(bRnmv@Olr7s!7VR1|2EjVf>$oz#|)P<1IKYPrvT@VvupR}Od{9~ zV9xY5Zo3@dkVn}^i6662W~NZ;t5J&jN=J1wOK;Dv3rU?#ynday0u8f!>+Gy%7bwG< zDZ>bIVROo_A}#b{9RKJbp-7_9sA<1xQu85;K=s zhC+0Z!1JD7M+>aYoXYMJ7^IydpO29t_arcm!~#d25gXPIt5!)uesrfI*HaW_LSUy1xg%9~ z#a-i+VPO;Q$P{J8zvwqR?J92>O5Jw{*kM_g$<{f0&uh`3muJO}-g}sv1to@wy#-AF z<~za0@`5Md$TxDATwMNQ_GguV+3wZHg(DnBSBR|iv5J19$!BYbq&&&mepPF<12u0NB#6%AW-gmK2@UIG6^kVj)bJ2^#^qc z1-?z+1nh=SI|5hPjzxLN1~PeT51Q41#&rstzs2m{ZOay)xd-^wb>_WX1qU+MBr9?$ znGek4m@t`#1;v6D<*v*XHBAcTsk35#-w#+t5-=7Gl=9_$FGDIgOCdz1!q#z~r|Qv- z3-P^z3)_5WJ{O_qyJ~(OOdOL3=g2(v-2vs={dMI`5MHCmgq|SG`c(l@QlbY%#y^g$0l_^UCCcIo4m-Ro-^UV(>8x(wxf;dCcI)$6f7vspj$A@_B zI_G&mkZ6=xo_|MODz3f5(e@!#?3LIL+KSrg`VOuu@1{)LN<-KSdHdt!S){ZFN40&> z{I1816>zyULQ!;kGScgG$41L_I5vHLv-3%V+Q4sV(5>LZK+xLwQA+?$#=5XtJ*|?x z=y(7zLEgl3HJ@LVoHP7SocmDX+WQPq5_EDp&4rktzBX?2rc^FD+E*)ycdGA|*&3M} zah0O0$Gal+rtg+W4`vYw?48AoPt&LNPej zCb_pbBJZ}(Mq|aFKRO1qVL%JMPzRngaOD-_1H&$E?*cm8zqSG?^87rnWv!VfMekbm zD>?hQjf{+xE9oVCe+hQX?5?fJ+6feJMWUC=B}617y4s}?7Qdqs86^BKEIN&NJp^)u zoJhmIOaxZ#k0nRcZ1FMl3_?IypY3z5{UTAod+gTWJ;8$aT%KM8&m|8M79t0piWHMRTEnW8|u0X_LXv*v=aR+PR5Huq*_g{{;T$(1q zcjK3mH+HL}RUG0niM%#vgQj=8F8`$NkK)T;k%WRl97XO7RK&sm-gaSXgYUX}oeMCJ zOpPbK4s$&wxE1pVBA~UfqiE(-XQOl9z?&P}m49Q@)O&+-$DK6IIUScW+_7LvaV!cl zvvb%sTxf#C`{UonS--rkZ@QlyO#*J81-D;Mk%EdC!3XKWoLif}@ucz8US$iz@loBf z9Mp2ZGp!X2CS$AA%B>q0{wq3)5`2^69*s=e(**_Nl#d0Bbw2n+sYna14Awp9nPsa| z@tK*$g)n=WphdapCH&;&d#>+-x|UYnI7S-~!r(Ytj|R~KsJ?AWD^145x>Vn^7wKXY z?_6fq=cO(wq^<`lq+B?KiQ0@?zWtJ;6jAl=oZ;}J76F-4eus&|8EbeuKE^BrZl{Z#- z@ov7rT7f4*>h@suZt>_JzQpOz z8FQ@{GTZ_zKhxrrZmp0Gz#*oA(Oq@3Jz;IJ7tXKudGh=NxiuLpw+4Df1qBp+qp`6< zCc*0f)suHJ4c*MZ9Q}I?v$;7uYzVvzCUP5p{wj`dp+1&f{ntp_&b+&Hh?y@4I{y=8 zP;L>YK3(%Sc69XY`knsfHE`~u?mUjXT=Ab2dGFo2a^UUF?PaXwLg5XR`|8y-Lc*j0 zNicb;y1E+UmuI~IFs_p9S;}Z%Jz?$AS`=xTD`!Xv4(?jz$~fyIva2NuWG~FVpn=Kf zSDs_0%JM~d@#ICfQhwVJUh3{bbh8`47UJ6~PYlwzEjWA&P9Z7U&rZ%M0m>$8Z(jQa za-^8Oj*DyOP4i4J5^+lQII$3(m39(#P7_^9CfXYz^^|Afsur=yFB?0f{&jpYuKBdH zzW`1sT#OXm?Tac&BBSSPu_NCjXo0C>X z(UZcbQwar>9N89WJj}c+7xBF~wd(jXw2mt)p>GG_8`ARlW}?_)od;v;?`cEnG}qn^ zre%Y)gcYgQBL?#?d~YtrT)8#AlMN7M8W29FXzx#5|DJcx5Sskd1)2c2S|@~30~aIy zWtWXBNj15|oo&4?IgBQoJ#FibcC>SpQK_aO(l>vwqy--7ugPZP$Bb&Z+hO`nLQx}r zU>TMlP-;K;o~uK7$IUX}2Fy?q_1!IKaHreeu7{`9dVl}q*Tv^;MZ(9`d!oyI{+jHO zkUW~7FM$EB&QtpliKlWJ(I~4$H!#^!vwA{BRn@Pl_0+9v;BH#0f7dt7T&h-?ZRofa z##5d>iDHlb;M%uf(YbW6+v+X(*SFK@Vs7y|;Im8itOFp?1OmBF$7e9zrxa;BoqTg` z#UE=fy(AcFR00*5EypZA19AWCahuSR%g-$~-wZKxSQZAaC$77RrKPuXr+rN(sf}HL zbG<=7G`69A#W}VChg=pxIYU$3SR)h;0pxsKZtjv1J{hX^>=OmKiQNuSw;m` z&{-bm8(TdW1|P$5!1M-wDYf{CvIUYsrDs96cnii zGLw}@oVSm>638L2@W-5%yze@DJswMnD-u7E!>R*@B!ZK0RAr;1!l-Gn0<9F020U-a zMvLdNfU#m*$IfD)=S#h}>dy#3>k-c-{>yn#H1o5SQd2F9OOh{y5`dIwmJAFghDZyEGpt=?S1BWiiM zHK($j0ryjzv9{P)HT{tP430@a!hPEk@}wYXFfvw+s7#yv=hH7XMKXw_EV-UitMo>6 z=(n2co~LQnAgy%0rT3~fAdu__NNFh~3~nBm9Fqi_Y}~%{ZcB@>Ho$XfN?M_5rWgLJ z>LN6+r}x+ie+=|_=KFd0Tba-{vNNVV=J_cpl?K~0{CpSU3$0baq+P7(F3DB}UrO?UzG@rSF?q+B3 zO|P`F7iTrs#MSEMDZEH{Oy^|Hi>yrE@e}v6@J+E2mn}qCWEnn8O=zf}eZ=GLH}P3I z3&6)N<54Mj!KyGZ=w$ou5$&rt@jh-}7A5~XF<`=u9t^1A0lP*_SmO7}Q z>&t$~&6Gs7`#S>$@{eu-5L%4V;N~le%7DxWm!Ex~CGXOu^w*)W-^xr?RE6QnZo1{rjBHUV9lBQp zY~6VzeU_f~txiunO2=m|18=-M_0(=zB3x7V+fT6Js%)PqC-W`lL5y?_6qkqy#>#c= zwXd9`x`bSj2Z^DNnH3DuZv)@XW1L%_l|4c#k%%FrcTty}A00u;N)McqC+t*CwSdfr ziqPj7_}|1Lb=kRs*O)T0v1q5wbIz!Kp53l(fdxNx?8_yOYfTl$s7F}?>eFhI`aEmC z*yQL+W^4WvJsL~?IqV;GP8u2-+06y@>EQz4@4~N;Wkd1J4C#A1dqBULP>!)dI(xsF zkxAOpvLsimyZ&2hJX^hTvSh6GM2tm{uiM@BRLNcE&N%m5&h|^B!;wVHXJ;Cmt>__= za6WI7*9Xo3;NQw*)u`Pl-P$8CdWztv#G{9pmR26`e8m$&D-U8!qES|tRbYh3ZdtFj zzpk)N%ojgjDd=kdQTUk1l&YK^vrtn1?A>- zkhTs^3T%l=&YA^qKXmZT7x1V6A+Dxjmzk&*S3DiSfS@dTL_r}bQY zj=_9Ag7Frc;gD`)Geutq1l|1p6VU9*lUdi*+Uo8NULgb#j7_mc4nYF*x12u#4LP~E zVRb^&6gCh*Au!0iTi`myd5?I~;<}Fc5j} zSr%h-Fi{YAloRZBwl9GND?z!6x0aC0ddMr1t9~wJ{14%z>wB73AF#=Ax4TPJ@a!+2 z+;;=cCPVlJ{mY>9o`U-c7t??vu}Fb0F8sY_(WuA(nkIIUZ7`@QhD!4Ft{YB_maZGo9px=AcN6y{71J>Dl zYv7Lgq4{}C7ywAY1qu6*1a+90niw%!e8LO(Bv)VB2i>b$G%;0yf!3x6H6?F;cfhBO z8-c+|(*XC`55e&uQ|fPYYQ#l#d)_UNVF9}bEp>HuXe0pM8QnbHT{|64Rhsx#9UF`B z8}ISoYH!&GmPnYe{W>lu4hY&8%gOMDwY?W;IKSPaw0Jo0qQ8a7Rf;h$}(VK2%1)NGIBif_ms zMU;SNlq=O%e@wL}yu1?oE1VYhG|gP`xj5#fM$a~i{m_g+cwlj0Nkbu+)0}S?ty%d? zEQu8(akohlDxiQ6*N*KXE&S8`oZ--X8*!f%_HpNGJwm)Y7#5iff8<8$9AfP=lECnwEUKUSc zDF)LnfGw1qFokeuXPHVAWb}1VuKH30>JF_?bEfu%3~Lgk4HqRfbHf|v2B2Q~29A+h zD!6`egDl0Zb<-qk?V6S=%`d=3O&U!!)2oq?#)Ws#cT3H-wzl*0^Bn?!DR5~#=$na` zF}1M%Ca2R^z!W&|==g$<-|2b855wnaUN%1rN$1$JD%GB+ZCcyMeO~DY%c5*n@qT0c zoN|rFUJEV7H|g7zc>?D}J%P8i^II7ijs4gb?`~Iav~(M<13F!vId+_NW>5Z&ot^!w zsLX;$xG|;Ez61>7T^+BzqW!;gn~|@cxvh5g;%{h29})vtCXOlyNQ-RUm1_>PrZdy=toi?cs7t$UFAldQn0l)Cu_UTU}z{W@#clo=9kUw`a|T)d-z{qXEN z3@&fUzE5Uj^w?(t(R!*q>bwL}10KeHKbN+L9<~j&ySn?PQww*)mxBIO4xWW@&nuS*A^~JF#5;NPxw(U*5fd zHFRJ)Lr`Mg-=%guCM@B4bQ*dbv2pdL03d1VQqUwEsk!gP$#7g|u+m+xGt*%Y7MDax z(Lb_SJMck!s%dVy7wRtmS3WJ9ji_yMdwFeL(-ec|VXYsbEG`p ze%A(bVk`otBOtOPrBdXwAQ%Y;o6-l2*352F5ZG7G???rV0F)2_RCqYf7D^IitDMJ29$ zt_(-Y(uU$4Lo<#lavE=Sow>7e$N4>scNbfVwK2v9=&y)qD+hM@QddcEZ7G`ebB%3V zv&x8(;byqNY|YBPx2ipL`peKFlY7-pRii>9-4altoBKF^HPQ({&Zv~{t>$$ zc;)T0nq){1Fdr$^>Vv{?-zo247tSd(ndSN7Q39D|{Lv;zF`tb~trAT{ghjdjDE?8v z{aM%58EMzmf}=|glpQD?`~J1TKKNKE_!Q8$5|4W?yFdK&ck;)bBEB_BeLUy?D&^hr zoFQ}3NAFVlpbH|G;GO5ilJ+;i41u4XHUu9`#tm1L)*J%E@nqmclm_eXB;M9=9NjFB zU;l3%+zn@tZ5j5!o(?@A3=JdU$&*gep%*g)B@mN=mF;T(XJAtWo5#_pwR~$uP04|} zhsGd@^&<4D^q`RLbLXIdd>lp_l2rF{=7ig5Ml5JZG&2E@X@Neby$a|vn&xjiXxE?Zfb_@W4F6WoHw9iH394bKD_F(t`H8NG>jo2^-8J@h@k?rB-gx6{9w9 zR7gG#p6eJ{vKC?Do3WANi4obMAA#p3M?qK1^*PI4tXUdn@yS)S5P zwZ)LCuyMey%fooVKa6QqqtcRY1LYd$sI9E?>h1RC`>x9sq5Iu`QBv}@d}}|Ns;flb zz99R(8GCjYf1UKr(rB%GzNB*x6Y$EIzGLB=ERk<=rV`aJ@OSQ5iaVn*ibvXzh ztMa6b5bas!XGpgCX&+tsiCUT`gU1^$l+2wc@MfC)L1)` z0=A6P)AKZb4fK-n%cAP+sbVAf!ke0pT2oWg4)ANeh&3ELR^MfeMm7Q8vJ4J{;@RS1 z&i~2@N6#SN+w=ROqZ}=B<%F8@(Qa0bPI_n+n_$TTwjTsT15lUcHx0}KncjcDs4C&^ zsl||8G86WS08U(_Zkj-#FqK}Ir9!6F)K99s5P*+f2h=#kG0ev@^g39^l^>?>^D+FVC1_zJYbPN5?!1M-6gsh&>t~WCm2dpY@0~ zkM_y`+;}Q$xarb&II=E8%f>V(ZD&eJ8UWQZQSPU_sKdlf5-n4b_eeS#mp>h zwsO&;qYczs^`PJ98$ILRfN3D5bcTJoN!-BH$cXt4U2dNY4$;kr6%z%0d($NztiWsx zuBfO8T*dzoVJ+o%|F3D@grP>JukI+ec(G~xW@CS|{~Cy)oJ=(Wi99$0`a-}`wi0H|K!RLkGN7~)6vR{5m510l%=I^f~GIUKtm0wU3V=Hb5hq`oGX5} z3qORu&H3_Bpf3+`PWs<>-r_%;njT92Q^qSG^Wnph3b=19$eG7nc3vMWUks3H5C9~i zAB~N?irxb`e?FxW%9hEz(#?(_mNnB){#nXT5Q;3)Efr9Kb?-CbV8jOPYa z3a(VLHPse&VmKgR2=}+CB2g$uy~V}Cb+6xj`$in7a=_iwnAB+Z${APOldJg`AgQ^e zU5-YoG6D_JgNgLO-_3XT`wLNF%8o!4t9P6DB(RqUwG5yAuXL%t>t0ko2x#!_ZA?8E z6;f|pUY_xy%L@ixzw7JgaE{Rte;54l%w4yyRaHPAr)ltd696U|-&@$+Ec1BjqI)F6sbcSHLWL^@#7q^>&Zuhi-;DU7h;(yhwRnJq2EK`(Dik zzky8M&jg2o-<@_&re=Ol;Sy2^3u8}D750*SEISStlO_c1Cs)#`JKW4|_jLOwj38E^ z41xHR%b}(^ViPUK_0u`O5448uxfB~NNG7uGxxK12UYvemNtV#~ulEFD>3w>hD6TTm zc~)!BSKjTiYn~rAC1z%GbH4K_&grY1Mq*;l_sh3D<bmD4T!}AB5<6XEICQF#mnukXboI3icM3N$&sE_PbJngMQtOJ?f zUzWt8GCBSV1XeWFRdGa@0vPE_R=~rFppj7};K5MKfx`vtH}X7upx(+)7sqmK1YeXg zt0HH;;&^cAb0s7sa6y&4jkGzs?4d$A{-GIg%NwL7|wSOnmY`1}_?w{b_|FmlS?>w=AN%4yf`b6({44xc0c)w@xt&}D@pfm_&X z+OSy3*|h67dg@>q=0|d17cPyhiLK9OiM>WYwj_F*`K^ zEuK;#U1c>@H4wYvJu@%R*1;zsPbEv6Tg9zXlqQSl2RL}Z z#S_CCR#y;kQXzR;R`9dG;lOAn0a&Af=UOwcYdWsFFP&$5b-} z?LAw%3`W7xyo##`xY(OYKE`2f2ti6%C|*zVSfSSOx5@Ui=Ut~+1-A-A8MVFaxEs9G zNlr`0`?HrpN2Ec=gTdl#>`%N8^i`2rl44>`mk0h*eu;A3Q1?PJQSbb4+pRD@2op-~ zL+Y5jE}=3}Q4$Ujf!DaI3PJ|*NReE6NY*dGz{JLvj11CmriKh@nY#$A|DwDfLf+u? z?1gpmrh4Ps7a48K2`KIlQ1hj*koGjLZK-#Xjq zl-f@+E1dfd~tyNXcLOGl6SqZC2-xcJbAByT?AhKDTZOa-lk1k^6L0x(jms)`WH!A(<8J2N$m#URB#-5>z`QLH z4`r{~YXDVdn8bsAMN4Ff9dapnr?a>+$j<2oyio~=E|-i!2TfO93Qd^Fnm66xl%nP| zxTh*DBI;S+^q)ffhgv5v{JfX0Q1tus*j>Jeav_HI*8YfbSh`1urMfdfy; z(pP;vK$bkiG4OS@X>^mf;c`Vv*#CS=iD3ucGFLap21t#Jr4Wl27oY$VBB%YGf5oeO~W(Xp(nmqxAk+sC635rd6F60deT zX=+R?b~@gYpfofY3JU=notBke+7oM0`Vc2~LZi)78*Z@@Iz>E1O7uFk9pmn}{ zp3N2zdy%_?>bDwHml;Xxu-Kn!DVqviIV^B8UAfiuU>gK zFWHt~8aqb){WFc4mSY=)z1XRedu*0{8K+I1FllzRy^zo@5OV5*78yE^%sZwaSt>)$C`Z$hpqpb;G zPp2P&#kl0;3?T5G_Q$FX>mJ>2cy@ei#fifn z77^l#J@6K*b`U#{YAyL@V^cP>xd}J~1Flaufj!(N?sK?7{X8&VfwijHWBu233$;w! zA~sDPiL3ABsNdGn2Z zL_iEB!W0-Y^WeqyTQn}9vosWSXv;Fb%o)!=@dY54dQS-6#u?xToL>>akUVHKbJCS| zh_In=aLrmcYN7O4-A{W>+w@<8TY=$6d$Sd+UAjjEikAFq;`v%O(=PFI1{xeO>&Y^& zk^&tLkGeA}i=zAs?P630DiY(jN@4|A4C9K6T$h-F+1kwsag>@*HO_vDFsl*z&`ZxS zU)wJ(c99URV7;2|jPrO;bfuA!uk@c_#~CG)deOlb79ZW6*4{URB~jO(GFS)BNx-*# zhw+cl^dfW(WU28x?m8e*$#+l3MT`q|hI|~I*J?fQZ+nG|(H3x9*WfG-C8vKD!uqXY zOP>NgD>ZGC*$C|ZWWE+&v3keM2mG@lKkD|%uiW3M7`}1!@0m*0{=2Sie^XzH1!#)t z1LNu|2Pd`9LXA1FGEP}^)?@b}hgpW1$8Hu>>k^{0AV0p+w`CQ~(PB2Nh<@!J#->4N zYL#EH^V(2TKLi3I({OMfFqyugF;xa%mi~-K-na}2B4H19l)u* z0_aZ-X@R#m$~vf=kj5D05yc(!|w{=K+pxL0t^F zPh`)-U&L4l=EOe(RUTvRsUJ_iq?)|8{Nc3byM9c0mGSUJM zR;=}H4)ztLHR~l%oiU2pyiRMJdNkrNXU?zMe$OWblyKci?VbLDD5(@$6PqXnS7A)= zb5^epUGDsSE*}w+wFvRSM$~}0Cfa(ZL&0j&4cfY~Cp?f6c*~ zv+eEOOWS%FHbDY3IfSR@93jw=g%)I|ReDyXl_|)b8 zvFVXRrA6c5_Gs(X%#sT{!X@zF**3PA%aRFV_UWUkC*(Eua;vi7Li7-?76*K|0iO1G zqC|_4uhJcMrmXzUhCr4bjSZn09vm7|&|_5&Md@j?;wSSA7)GJ?Fs&|z3`VYp)61R#;nvI`D<^Ua z^AE89qv)){qFkdWJcP6`gfd7D4I-&@cXz|kDc#*EAl=;^($XN(C5)7GgGhIu|J-oH z9nbL1-g~X}E(F7p-+(D-%vmrm!ca_UDir41hWiNF+E0s1Pvx{zQ}yG396E zh!v*$#8kkQTOJV`_-Qf0Ob@P5ocv7x^6|%aT-L8GK2442xQZ;%Qe|rpd#-z)6UhES zs}Z8SRA+*}g1@v^wd;VCr28fDg~~^Q*fXTF+YR(joZiJ{@!@og0&s(^BX&8~FOkx{ z1a$xO?u%WXu&qb>~Y&9F%@J^7KuJ0*a6Yannw z#LBIsQvLPI#nxZIZUE$Vx>OH!r!mxZ~0wOf2Mv{E_C?B^yy$-!g?we+pg z^`(eJhSxlke%X=7u`Kf3vap!FET=x2k3_Lwj^IejvU*>VhIepc+&Kz%!xEk?#`bW<2);LyD+^y*nX{p!7PV)Y;#8R7l z_##>S=TyE*%;yC01c+rQ#cU+i9~!FZqq;f1oMR1%CNqbte5|arFlA4|?52;Rew)5v zven5gdw6lSq8QKrN?(>iNej4m92VB9`t1S7<>)b+5&{N>k{ATM#&kyY5>Dh;29t_% z3t*I#P&v*D&q$-Q5#Ijj>dVe%JBA^gP1m%Q* zgIn3CMf?eKUMvo+-;l-i2L2 zCO>_?>9(%T9kXITpKcD#Pc|AH4$Rjc7N%%eUN8!37>XnJyL<2OSYzmW*(l_qxIZ={ z6(6M36u$EO5b(Tr@_d$;dE#Fe6F6uTqdRkOz?)}I?svHX)c!OsF5A6xRU8|~&WYwUL2GcjwR!|lUJ7=W51*uQUhK#D1tEL715czG63r$Jl>-D3M6(YmpFv{H%)MhC8 zWMD%IE3d4yA+}(SuC{(BvCx_mPoEH)&p!rGUXxW+_y@Eb@R>Hq+c|IoBb`oZ@`8P9+a$RDFsm}# z&5xswu>Tj4>0I<3D;C|M+u9A-WWG7LoW22gFBfeGp%_r#Zwys_Rvlo`Qdbp%J|fWR zDsBSB=S*7kmlO$&`K!CTyMqI3SqWbC)`p0`nli0ubfX`N-t>#nl1H05-8Gf)*~DpH zDQmLAKp=FAAJZB+*Q>ZvlqMK)GB-++8%DIWZxZ*l30$dNJt>R1z00K>v>X1x=KEB* zJY`u2OwCIj^*q@Gn9&JVokV|Z)2c0dp{6K0Nq;BB^w~4KD!xdn~Y~6K{mxg)fsk$Xuc;JvbMeLWulT0 zcq`u6eyq5|k81R9rKk!+A7C!1`|zI!tO7#RF+QICaev7e-h5Q>=a$r_BS8lVqBxL( zH`#2t-1>M3aZU;fO(ANZ&F*hsNPv?Al)oE(D#5S933)%b?K2rxvXs+vO#t?!jk)(2IDl;Z1? zE-8YMlRQmz#`k|*0S+ZgCHojVHAYa1YDWvg4?3mXe=T3nCV8}`EFWNedgG?sizf9; zN3OX%d&QGM-#%%Ywav93{NZO&>ngumT&#+|D68x7cLFw1b6vSEH#W&H>@0FNA7p|e z73Q@X#e$G*juu1U(OP>^p>y7?OStF1{?QoI7N5Kx*uTd%jhqv=>D9v`D=LF5=s2K$ zlQB|_S5^I-j3I-FK^qlguA`+v6L!6dGkFK*$4zdGt@k_{NeehQ>AJ!cvP`|Oi4YK54@6w`cHiU!N4KwLt#h(A#$Wum$3;{{F{jJ+Yk7bDi(|9+s!QgXO~Ax zs5%)1`z@twEAbo{CRpJ-Z`3hKR7j{Z(m%b8)@iFQAei=8!ddlu$qKN}>tPA2qDFQI z)R9G`*b@MvM1{TkV&P~|ZxobBQRUjPyUt3RWB|lw(P5JXV|`00Cy7o^2?~7WIGldy z-3);8ymI9R-FsFXTI?aJv=g{m5+Gr4D3w@JwX<@&s|uFNa8j9);LSjzlAmB*>Z)-M zad;Ljwx%RFFcb^ioC;fG&mVTip9ZHyUzrG0HM3~=UOhgY1Z+)tq)lD66Z&K)Ta?hO5(rk+=Nnx}Fx z51q*)vcAroj}%2*G4-^ywRd{&$diBVgP0q+#==}J)1{$>9G{tj&xaGtV&Cy~bGfQ=t(-4CqqyFasVVf)*iR0 z;I(R88UM>G!#81}G2f)n;d6Vs;Una)C7Z!8GG2OuYywLYn`cRF1e)DlpS-)?A_5wq z>=*a>w-Tv)clJJ>#{&ZrK#PEmBzZPR1S_3|sdr6DGW);}Je7n!bba2vZCqH1T0K~F zrq6)B1R|(;hwI78_V8q2lL0|4`ORjXl~pP;#|r=BW2lkRtT`%Hk!DsC!v^7LPztAD zL$o$kLUGMZQcSwfv$mu2ShTW{TnNNZD4M1y6$LpG;FEr!B723PN?vrMrf5l>i-!UD zl)Q4U+kZ-a^&PVMBdN|hW2_b|PlC_0X@}~4{-7YD@^_jWQOyipDs4T|N=iN)f66C) z+jBh>nbb)%>LyGH@n?lc(Xfput?ps1!ysFqOnhxR_0%uwTjMB$&EoHg>1Jn2#9-P3 zD=MZSAIG=$NNW#DM3|rrJM92W&56IWXa(6^aAJiBYvg(O&|06F$Fp;f!xoVVFJJ<9 z=6hwZ<#*hK?4Y*hv`Ny#;brP0na@L7cNs$99fdihgz=j=C2@a$Qjz9k8N^k;1I{O( zaFaYh-7W#T=-T>$768Apo+uHFeZI7QNP@NDxWEguQ8RR3X2DeB9je(f7X{KH*-p)l`1Hc z9M=5*_TX*tp`6fiABt%+rwuN^;qVCypb1$dK4Vyyk6TY;wqPrQ0ySyROEhVOE=3oU z{=S>#kTJ9uHw@f946Ny{sYrq2t}zM4@8sH;)5iMJKlVU*Tx8f9;~v-hLXNr@?OSyc z^lb9@{g3YNGjS{LYH>#Iokoq%4EVFgSP;nE5C(z=Y8fmf<>G z`xCt}SjsGKfn7&GFZVdpFE>rKf`7`RBb>-Iri{)~VU5U=oZr*Y-^;p7F2VB4hHyCe z2P>AWGHZzD527rY*^?}J8TipFDbDbmS2hbeXt5!tdrKzy*KcydGK08MUrsQ`-2Ng+ksE{*w9Jm#U#2KO)`Av{WfaoN7N4rV)0CZ-Vz9m4qBYfXbA=Ods^t`rW37s|dL3EbY_@Cm z??N6u7Qi-8##^2SCNm_MYY5CsY9AzK2m#%R2 zVNL&0SHqx_Rb|!eLQPhcG$M=-Jr)q<!KR6r(AVr!%mk7g`SV+S6@~=j2GVGP2;dZ7)FLz^=eqS^eP%YcYm9s zR3@ez*ZQXKdocgfrxoyY!gVq5Ntk}LmWw9(4Mu1CJrL5nZWOvRWzT`|vZs;?0U>!F z9WRF|!>;e&eMd^gLjrUbv?*a}1h21?^K#)QS|O5jm{dQWqK*EGnK9cb_??3k)M$|D@uymd)??U+kV^7$a|Ug#rtzSX|>Ubbd%|KsL z|A!Uw=ki(%)0l&$dBcFGznkpH02vy34)AO&HTuSnx_MxA?WH-h=4&^7?K>vWz?%mF z%4<8qPC#5#sCa6u{H?pD4+Bz_0EFOI#wlo`CJ~}#0wye|} zx;_0rdU$wOt8{eF!}VX=bf`X(SeN!s68$i#mlp5W7I1Ujp{v^pvT=>2L!PtR-zxsG zX+vs;xEs#RiC;uOI1rcY6ncG4ep$RENczPb~xO8vWPdpx; zU54tju1%ss${OE@f{O=PV$0e5BwIg`?67YB>=N|fH~9Erxjz#fI%3-ONr)kgx7%n- z1rpnR<=X!-5q*lLY~1w`F5>=*imB#HN1Qo-;4eXDe{2#hqcY$s-w*By@B$+l zwqN48HB$Ro&2(1XR)AKdaOjcL2vL&_psLA;GrX6RWk_k5V@J2KQz58WwT^LWb+ByI zsie$FlUTcjGZ>pv3S14UH$GFtB_&HnhV}ZG1Q6(>R*A-`f0zPU;&S6@7hJ z9U#Ee)$Wdksg4d=#f(Mqd&c&PmX{t@>Hvw*TD!{1&+RRMbzA?>eUjkyFAqF!UY3%7 zfBZ^ZmYP+8rx6XIGumAmL+u|^cwirf!=lfYKqx4N;+6E*WY-RMRavwkYPDIE6id5# z9zql0(L;(0?mU6#zglaLVR<^f8yr3gDCwrEtDolk1z!H#?3) z3`F#4uMlxgU1|n(3nY)Z`gqDZ@~-E_G6z3@_xoRx({BC&@Sk&Y?U#O2(;Vy=r^AAh z7Sxm4P7he6fHP(Y79jn);-ZKI6x=_-w-ksp zW}4eO)syGhkq{Fsk|2Ti$)ZW|(%?>V`K1=vyfz<*ol*`lG6-7Q=`SAR_}GVPNtJIQ zz>)kR&;RfA-YSpRZFs!SeEM1A~7ZnN&O>-?Z7t+d%I zNGF`LntrTx#qhCX?RkIdWyYYBdOq5y+UBsq+xMDv;rrUEKFr{IZ3-SWrPN_g^kl;g zm?#|qHIF-chs3KJum&p6e2-5n`Q0|Bi^kSOitBW_ z>I1(T*VhEx(ruGu{GO+MsO0p3e;lA~ot@8mcWDL#psf-b^x}e(QKr3pnwf(U;6NS~ zqNGYa=0$1>w5443ch-Vc&=)!RxYBn_0OnnET<#kk!F1+9&jwvX1A|nr(&knDwQ9|( zbu12#iQEjOxv|Qe74ERa|3`x3$XQzR#OQSAvrKwJjzcnP}NRidjBgps10;Ad_$ zFu|Vzooh=)vZ>bQTCji%B%OJ!`?tjofyZu3mVw3$F-+HnQo6W*gQ7B7++>%4(Q$#y zR6ZzuF#YFT+@*4ilR+9oj!+wA63ZmH1}^@(oIWXTvt5>AafRK;Hci0%@Q)v%#D!wv zhpZSdnyFc<#iX<;NYd}`U+BpiJIg-e%V&FiO(k(mw7tlc|6ut|$SQFU* zegrAGR{MHcnw7GyPbzr+AX6M7qNCpRyX2N=+EOUx#y|Yb<4zVQ{3zJo&OrnBYJVYO zTTWJv83Ik5al}sE<{u0=ZL)X6b6rjPeWV{J>r7vU(8(+}PjgR=YvfJEh8Xf%IG$MB zQT7c`7IM%Pg_fUm zOS8X)Dql3vkIg_XZqK#=(q$n%(5BkRWJd9;J!zoWYw=pkq?uW2?H0DQ~u&+Q>^fq|nz@SSCq zH&C*!)@d85Jb$%b?c^?~mq;+!(f9q%*FHo`7Up1YVq~GXWeC*j0gNmpa7Z-bB9Ywi zKil&I%-D4SWa6*UwKsDGjXbE1eXmZs_P`X9AQaHA%;LAQlAvAn(^6%LZb8_M-PDvpMAT4U?;B+K)q(Bmf|L))&|O2?;sok@h$)u&^jmpni`=s`VFmY6&WY{4w0 zqM`i0sz)B2teYQ`KxHb-P}_tY?)HmBM{RBK>hp(Vl*4XHggMDt#&4kdM0K^^gC#LXp^|d6zj`_40H%JP_L>Ps?8+X!2az;Wh zYpSu5l7Zh5=sbcHI{fi(Z1jsrkjalrU^8DFf>8YwcJ$1u_F$8&NCA&Z;C{nucphbW zKL6LJ*2TTj>h9uXnx)9gLbXll!pv>{fSD~5=1rO{A;zXHIXBMe;M#dTjjxAxdO zFgF;{lW~GAYu+{}6LhAiW`fyRYM2#x;>uGEZ)aZaUhaf4QR()&hj^uEP%VL`$I_15 zU5}SBp%+6r(;fS?S3nJU(BovB?Glck9Gey8rT@O(d@DV2gkxZ_Y+xew zC&sT0MhtG6tOeujIFap<)MmL=Oluz>oVy{_41Y(xdh}~=>>}s^Ps{AA1}wSbsgxPu ztvi>5QSW67Qv&@?4}iaxt8tM@8(_P$`+0e_8BBJRUQNzPRHRt7bhI-Xbb3O;fP03z zyz=jp$C}*!>BPL@l7q*?6QD;Q12)}%X01zC3LV)jb94ZVb`LPzPUQ&!=E8rQv+rxJ zLg0;rEV{U8;2KDc%$!lMft2 z3WxFXDq{!AlOQ?`_Nc@dtWk-0eoPS00KJiKli0J-yZpnnRVIFRZi= zS}sUIcwzjCb5?bY`d@jGDjNA2@ISd5H~raY>D)z=mNeq^qhDsWV|~R5&x#pFbx<4N z-taqXVTKdT1uVztbiKn3k8ee5J45hTKgyAO)DqmvU+!Zw1$Ym#LzkHh%EWuNf2g@X zyT|7IRN5Rr>8H&^#v(!C_4Vy%u%VAbjM!>dGE~}YVIb$pNk1Tou}fzT19%mMv4=k5 zgI{KdtrgwW7)0{z_zb~2^V_uZrd;Ym)xFz#p zBVDlGg44a0`)l`CRCGi_1wr^7myI24{!4u{+gk}XZH{o>7$K{gq~AOwFp2SO>;|2L zGE$B)b{m|ZE{wiudtMszdwY8lD)yYf>6kXuaneFZk~*^#N+Xp5G6jZ5F0Q3T+c~{P zgF1Y9E!`mqkO{QNu>=|fK8E;sIXwgGbE%D~5r7H{&d|t3hjzv(%p(fF+e6N>J(aa+ z93WBosF1Ykk~j+C&`#R%g3T`-T?0NI?+zXwp8D0R!3y~@MA+)XtoOqeWlCPQb!UY0vLHznG<2WHL=BisH^B^2?AB7;>}sS$61@Db*MW!IOGP|XotkrS zffH64=CV+OEJ^q(_yBbqT%CkgdlH#p0&-aJIte!-6O=&b(Im35%9n+$fD$= zg+|c(!1#$=-{-MB|GhGGufI&6vg`x8ZU*;@5B}AFK$74;m>ViOAiOB{tJ4jcT(y*o ztGkD_m-{^1DIxImk8gSAkZObq;nCheipW0Vs$@KgX4HeZ!_A{9-?MrDBg}xCG?w5C z-5>%IKN)4o?)#0n=f7(&s{?s2UK^%!#Eos)Zx+wZYGu1To={J^-v{>cMah%2wYHp~ znUprMh2v^Vj}usZl`Whp|D+}|IXP_jb8=I5NCU!xtu@=h2qv*f zNDvrBbPu20fx6k2w(iPGM(-P-s2H`(vY!?C#PqVP%5A=-tZE1N%5TCOX2t6Fu3tXp ztRQplaM-=L-`v~;eDbY}W*N?dx?J?oFfiCxg}?%mu7f7KbZgNF4F_PuKp#8bp5mOG z&C#!`h+jbM&&9HjO^i(L4gXZq!zz{-Mg@7eahLW&|DYSbn9=UGw`{06rEE$(Y#vud zg@En8NrT;`)d4$!f9Q$lNx(BtluDB7Qzj=!I#J``ep(>q(Uw8amEcMGxt@S8G7=gZ z^5e2T`J)nhwqzqWZ}W^6p0{GCeS?XN9jnuOuiOi97gt-y7&d|ExbA~w_JY_Q;uCFS zi`?D97z2m)n!%8p{dCrZNOFW_wB7X<{OsfHG4if7s`7NoG2CZGz38N0Qr}U*Qv4hi zI=Cu$CW`J!vGqL+D7$s0nM0NeDvPAwKlvR$O)8?AMS<5N;l~sa2d=$#*_>U^@sF;z zs9x{$T`)pUTO#~0hMx~9+}bG|f9xopJv5o}->utG2#FT*jUT$Mm(DAl&v{__KbQfw-we62Wj;Y~6OZ)Sno5fHu7jS?BL&{U|emDaEsvz?S3A zYKMGAewsV7l^~ua1P&1|#k$Vx+^#vaj##)8W@?T{_+i?e{#zMj=f> zrJd!jKWGd4G82|bUuBraP~)tY5KJXs^OYoDDaz_-Xlyd!U!={2u$5LYGqBXvHO=*^ zr<4wHyVvsqG5x=r4 z3$=CE`|t*3YSLLA^1Hr~grtKaxNNo1W4Z%O>Ouwf&{kMjc^0gNdhE)Nzd3H#PMz0bNFgdX}lj;=9icHWJ=rlvHF>BU9BjSMms zpGrhdFpH1n$&X2l3}g-V7#5+BPEWRmniLO15|Hr|VsQ1b0*9%yqvO-+0(PVG?#`7g zs~Ta1wRL~G&wlZ}E{6Di!$rgeL-8fvrm`_={BHFAR8`ff?09kB<xI8dV+E0-p0; zW_$klJ@B zuh&-ha`*BQsDp=7?72Mwag#VQfbM~Ml2LRNp#x(K8djmm=*EFESpa^Ux=F=3a^KUw z&-LQsmUd_&pgpfxFmSa=X=9_E&j59Hw*mZi(6=SqWB+h=Iz0=t8GYT$Q=d_W;A7UWgDZfqc z7m(=nh+j8EB#jiclh$2kAzi`zn(vwq6`9e#ht0q*3BLMw#FkMpXY&EyVA#|X6w55e#@{_ z_<3?-qmHLzIVh1Tk*uyvMjf;&_};fua%<@Q!z9VtP`(Fqx*+|k`%@fwX7R8BDkoVp zyi_}&GdJ#l&@<*-{^SnAEMUP`g1=Y3mWA!;Oc}*V`NI`~bY+u4mqOl5`2^?T*5mt! z{-7lI05?Mgi{RjPv2=wT!&^8{nu#%jQOw7yp{VOspOgbYBFme?FUedd<&fg1Sig)s z!^+9*a)8U+JBC7b6d@D`k0prI)yBYBU_0oO_g+pc*# zno%HVdO_-@_%QiP84z51E_*?rWGS#?XlFt;_I{In+I{$-%=ng?3Rflaw;t+UwdeWV z)Z-79DqHOA=8l3z+m70c)x@|GBpFIZ=iwkWM`TG!TAD+NdfptHH!Q&N+<)TR<#Ua& z(6z1@olac{$v_5Ea9}1wpsa|D$V6e0G2Q8z{Q4*!`jFGohw1{^SO+c=t1*fc4(hZP^9c}p*aIO4FmAUk9Mo!Aeer< z)eE?Llv?8?WO*-xVPbR=M1_nZ6`EMAic$QR%9Wae#kkG?Nz4D}?&SI5x*)Kf)rC7{{j@feNrZyKe8sS4v0q${yXgexc!6SF_0 zKD12hV!A1Jz-2LtCuZGJ&D~i6$>P!vOf508!NNlkSxhS)wn_Ng^ zF?`EA#-Xuq+p~1(muI74mO*WsIf(sq2zV9zylBDzrP(vN?L0WdrFNXd=7<$5k>325kl+0+a1&A@7xKFPm!Yn{3q%TMFD&!!#x1MaA{Raa z1c;7u%NL>U=gY;^opzj`bE6f50y$^c4#;F6;1H}z!4OQKhbQr6#YE0dk91|j(PJS% zFQVW5`_lmKN14|I49XmbwIul%SkyJ=fepTHv@pNK zy32t4e1|A5mu9lfr76PL0%F|^O_#gM7{O9;6A&LyHj2T0FHPH+^+_7b*=y#m;!Y4{osZvI2|7)u)ih}z62m&P% zGKwuvTDhhWKx<&epjH1W^O13R$jxz$@c!5R3k6G@J>q0u5LZW)I=OfM+ogcktl>o>y!n)p<7`J5c-RY*Sm+W#Ya1X z=fph2V}f@s0MPRNB=eb<>q>ks*KvgI>ad_Iy!HTPCHV~megyA`u-+3Nrz~i-F7Sde zU6xnatL8-JkZ*ylERv1|sC$!@O7^U|^%MJsjw1>dWK=KdcgXQugycsFW7zCIe9CQU zi(!k}jU>+6my4>npX9;WSl4on1#kPdd>lj$XES7EM91nEey$GuEvlq~;o4kTnc4Ey zM8leU+W18v>yrXiaj``FeiZO|;^rwqW4z}aV=olF=)43M5AUmXk%bzuIy57o8T11N+cAtcSAD;ZX^<#<{4!!qzX+!7!s4*Z^9*loao_VE| z$3Z*Vpbo?WA(!cU1Nom!ncmCpWuu}E0~e>ofxBNeaTF#0hK$|(TNdqr*iKcJ4YN2; z7O`nVCt7bq!va^%u(Qnv)^T;gcN3xP$Gvr!vAQ!Pg0^tTX1~zp*m(1GuF({^esOuyp$WWEkTs9+6R8ewvA3uxI9$hz=p99L4w~@Oh z@yN#Gc686>*vaz`uI-&2?e$fx+yX=ecPy#)V1Mr` zoMK6)t)sQV4I*nW-W_|D;ka^xxai*Tp@9T9TK?KD%@QCMGVNWtca4<1docdLRAA-q zZgJ&GA$PA2IP3i@Pk4p0UjtOoGrL$ah4g|F!n%oJGRy(Nye@%0Lq4s2jNda$+bVfV8 zi$s%(NU?JA83OtjUQv0tTV(f_$$Kj1Bxd5C5}f|x4RRhWO2g%1r&t`(^Kv_ef$*eQ zuz;IwKvYM00>gEF{{q`JtK!|VR8Vm|_;X&yc4$(#DaPQsV6{+ta~?Kl1rA{3!rc}? z)b%tJ|M!XYYYYSE)@TF44^3?b$M}?>rTu}8{7i3@GVTcx{coJvvsm$)JkD!Gm5>94 z3Mv!BhX=MyYn)OXnVf->s^64_pN3{-t%Fr}o3oHN4luSS^Y>&I&(*(hh?)f`fA367 zf14G79;x&~V;}c63~fb~8|_A}IGj3;C5QPy4inw<1fhYcs5t~VG18A|%(-U`UXDva zt4zG%pIyP4k{;zz7EL1gISM_tUa;5{*levfjMNw~|1x8Ijbn6zBGZ0%nS7V0*6o58 zYHoM>yQJ7!cI};MIzn!(s5n+=CJgc69=j< z=zaNjw)yNh$76Nz_*y5m>$`Wec5ckpJ~XDt>wY&&=x#)bnG9yIw$gpJn`O7;%n-vS z&uIE&bh$H7G-2GFyJ_9`19|taXe~G+kNg+xy;rcu3j#rX zlqiE@!j6+VC$F57F%DHz7VmUmW{y`QasIdSYo87LDMf|rUWw6qj<0UVIML$1k0_ii z(*D4N=>NQ8_|WrYNN9LJ!#pL$pb(f{KeI5JxrF2YNY``0H!&onQnWj_i{JW?WBfvx*mR5aBo#cPm+9gJ7Pm{!$t zqTjn{Yh3+?(FN+r5X1&WHb>0K$+5fP+tb%b_FEdad_xH!;0Xq}T_sX+?6ltO*t-yB zvs8)VP?@avwh5maLr}^TR4i88>rX(!I4gP%od+=}GI4fe8uCM##6xp?PU`fAW+OLmUc&N#+i+(wY;ayfMm*OLg*xE%}Jh~ z=!X_YSZN;czxst1?MtIKTcPTx8eU494v~z$C2=vUKcxIofG_RJc}+L1l#u6-Mz1zQ zh=2bDQqN7}XmWo`y^#_7GP@Zg@UelB@C;=*7Qw_9 z>$6`}6f1+qizCEQRTe`{UoOfDJ|7b zs5R_9a`&wWCEG~uz+y(Xr_{~WO&8L??vGmDH{4pPpoucu8&^z;p5~-*)-Pq^>si-g zz;pV$^wfV^4{ssvBmfP%s~83zZHQ@$cPfcCbGeUFRR{0zOM+g526_H)!5h(_O@f__ zCW-fPy=lIi$geAgI&XS^L6R(KBq-L^Spwh7G?L?vD2aCg%`Kt%%_T`?vv=VAqf%6l z`bSbRn;I~%Ff&aZJkEZWhKVBXA(*Z?J|24ORbNRy6DqU$-RO1EQ=KJF;j9B$+J|eM8gL zii-9Q4wlh(wMXZL?1PA=duef*EzJlG{N&*U#8>B+W=sE4M(?|Y1O#Ap^HJ|@YPe&9 z-wmla)vqigfV9(Gh_c`854GT~{wXk>{8Ni7nBQom!1{;iu;%q#kXs}ot_owS44B^$ znKquo5)dBq>J+*66qdMPhq&S@^(Ji|ihdh8bIta)cw7yG&1=;aqZB3RdamjQYr=cqr)6LFCU0G zhZ4;sJxD}xYvkw1jv0v7i@hzF1O# zxA=V%VXcT4b6nMCMg&0|5fUsDEiqmR!D@G-JFV@zZ?pouZ;DQW4>5vfbS$e!8&~;W z3$ieRPO4KH$owokX%&_Jbv{45Y|cM#yqwnAzv`*yBxplrLOSHFcv&AiqRv9h)Bb}8Eou;`(Rj6wOoY&5x>U?_} zs8vD$gr(CWC|)-XZz|#7&gZ9P^kA zr(*LXjyq}Ih`FUxomoptX^J183g2c+vy1<0uVs=GbxuZ=R6(fFiR*RJ)PT(=SW}Ei zKtkk=)%i;b)o|TP7GmXn*KVvai>ztAUnOeK{sxzoe+=uiH3>da7dR`RoMpwZp&#QK!_gt2I}kG7>_LWQ)Ixb%E>jy_5C`2C4aDe z!hY5u9lFf5=AW!*|9nf{y%`nx9!f2LZ~ssyD0+HiKYrI>LgCQJRv>)vy*z}Fj^%FJ zad28zFY=3_pu6->_~josb@V|5@@=d|Kz6B=lB_AO{MpG*iWWP$cjUi~{){FSlMLWZ z@21yggkwyL2o-ZfGdIP*B$T1!4mmMJMYRkQNTpbW4qAHMDf3GTOStQItm>n?r50OioK^vn((PJc#{EaH&HD->m? zK_U#oT&Hx56;*`=HZY|mZ*jXH8SxJ<7EUEsR7JA{9F_SW5CcP9=g0*uq_mj0gEI8< zZ=t*B9)Oncta7t*GInIp^xCrwQpja+(`U2Co^G0whvt!DLs77>yE`bKEy`kXC>BHKJ?>WMyPX@=Y zA~Vgv2qRxsCQpKFbZb#GG9F59tX00az~wP{)Z?!qCTsy)6CORc@HC~hkJu5b%dn$9 zWImwN8r6(MU-+bJJ;NmyA-|V`r^?KY)9}M*509raoSv6H)U}8wQdX8;S&sahF!kPF zP~ORqc!M)gH7a&>VC(ALGS~Bl4{$2jArx%IH?jPxDy!qcOs&82cstd76(aPwwR_iy zk?uTq>``S7oA~QQa?+AjYMni|kE9)<$Z^<7noZWHhej4(z^KfayGJh(Pbp0liVXEi z2#N1aMinDqUvE*g0U#n(*`FbzaFN};%lU=P)Gv07Z91CeLB_X%CVfF`Ra#zFl^qScT2*6xb0ojnrCN1V=FP>eq9uxU z{+tAhRl#7>gpSgYe)IbY~5huuI_O6Vk(Y?vfg(26G zUg{Pqc}SXK{<9Z%*;c3`mm_qG|I+PwZEIsKvBic!2R@Jkbgo_RH)C>SpMp_qT7 zk3`rm8D3;L9@S~L)KKkUZx77y4h{}u4Yrx#W-sm!0t4%W64P!g+_CZ)lRR6LnUaI) zYybntjARJ51TmG)|LsE|z(2_Y75&lS(0MjDG4a|MKAo5wSW^kC!Lp3JG+}cd|2P04+2_zU`T=XRt7XuTspID30BJQf~ms-ZppZpEC zM}5evr?==k_n^vsGpyI+ysW%dq%rPuo>dvMtk|ocE%`y9yO1+(Gud*Zxpq%(ZJPwT#R>uW4%eSmp*v~CQ8`K3T7 zzTf(&SYs*l*C!+LJ$dTV=rAjcIH&AubDz?L9t9SbgRRXSdA#2af;(||^Q8d$51FI` z5}|D5cp!;DqdZ7fJNJ2<^t>&ITP}GXbsS__1M`Tx6eZ0^1Inh!lb#Kow%B~SKJvT z;yZ2~CgKI=R1V}SD7Wx>FdGz_#g@UA@@nKmngMIPPP~3fifIf7jTuU>C>qJDG|`Z{ z-C1tPiJwYxlR)Wh`IEn8Ghl7C_#G3JsA{vqb@aK}^Xh!(Zm|vL`fOllh&Aj|*`*p4YJyTjIF9ja5k16!OFQJc1Y6m9@sGv{yUD7Y3Stj0ky^veZ~mj` zETf|8!YDlS&?zO|B@7@XDcy}Slr$nG-QArMQqoFFOM}4BAOb^4$I#vR-S0oO*1f!Q z&b#-1cKt?CZPCbA=eY5eG-zB#2{|YQEsSaO0xSwUQVuqKy|3_%!755yl*SBQ1M9Re zwiv?x#H7p?#)OW4)H~47%V4Kll7Hq{)OPwc@B`BFhqZx&10>RfvZ zeEYO=?QX2Y`cug)jny_$AyIy1+j}{&NNgHs6v>oopssSLrEBGQ=#`wKKbBWww@@bs zM!1Mrn8O&tHKvmxiG5W5hsXjb)p<+e(yq#4r_4@_IhU#m(nt-3ofXvFrMXQZ~Z@e z2EPgVsm~?YR^@qe6JN$-(r%uE@UG4stMhAH;#Pl`bIvuA*X85gDt36OPkQ;W0Xs88 zPV!@xP0=J&%fK#~pBq2f1gQm1nI$EA*lsBXxmeDyvQ>yrUH|3^`#X*c@!GG#mOm%> zL+(b3yR}O!I5SEqDcD19GfIE*8nQ|iM#SezP&`^ZYy?6WX^mM|lzdMEs*SD;M7gnF z@$2Y)ZoS(Lyh>cTy_@*mUKi60cVW+|#b)_^o_+kd9C){ry%J_K;Y`KH&sP@esw*AG zD{+VLKk`seL&zt^;M^vhL*0R`0*NnZ*nPG(geBVEa4 z@Xnl&Z;&II_qw<1ZX`QV;-W2nrK%@h*=78#@1fiK&#+|r4ZMESP<*0c%DtJQ>&}P% znx{D2`R|0U7MG6P0sq~L-{Fu#Ph|1Xpw(P#ypS!U@nIj4ifs{$wl4q6UHrh$m#6pz zP|h`I5RbG3L`LB`Y3Z1i*K4iAXqjOrg=f|rAu38=v6%2@1K zgCUigmTY>fqu7|rCzY1U22wzWu^c~EG9w@UvhaIdW<3z$I-Tim6=#fJ*Af;imH~S? z(L!V0JdvBbrltl76p8}s`L$}_HE-RLGdoj88~6Z!sZq}blzfR;RN8)3C`0&=9~~Wq zxB@=g4F~{%FH7VGCg7PW`hFY@py@d_`}^JQY;TuxjVxKCtRhKa0>dxk{8so1=Z|-4 z1x`0M@M1SO+;1B?{agC?cNl&x?y$j65Bvx`w4Ae?oZVD9%n*E7f;9NA^m-0L8)}E- zrwig5IXgN^P)#HW8I)sZemkd1#UaR8m=f|%1wn<*_d1fGdzLo?2J6qFYQtz-73-&$ zO{7i1v7v**U>b!j(*`y=j>Hrp`q4Bg9~(Xv4Qb2DrYxxOopL7=6l&}k-o<=Xt4#X! z!R4WmUE_P-N51bEQRZ|Gq;-5h(Bhalmj+kf_eaCwtWPHG8Ybp0vaX{k?bXv#1Nl^0 zPr3uIm#IsC8G3v;k@Tq35Egy2jvzez6IgFV#GPnF1clugDMYP<>1A^Wc9)!)SQMqH3nvqUUeJE5q#@VIF(+BAPw2u%rir&}ug*t?t_y~LRg{>D z)aMWb?M~m3^N_p?zE*02~}`DH@`{W>m-9334b(*~BXph1unM?X2E!R(t< ztE`lH>-vJ0_v72k_s&%BEA$pG+(bi;m+vR_X{A+tE|-A?NV?VRHHX{8A;2bDTFoE-ZdEzv&T z$YgOUe+1KWrE`+`N#S*$6@u5k;(MCf_V^TX35ZSUPX^VM-oaI0O9Fmt%nPj!s# zu;Eq-;N*~{m!YwIzb7f&;a9ZZNZtFi?RX%t@U7TVQB@4Wf~vS$cwV%fH+%a~Y{LC1 zm^<$AuK%1&@^uz&uc)9c)|?(03B=e@IQ+rB4| zJwQ;L!*LB^)Gp|&{-2k9P2(`deEr5hz7(^NZViHC zm>RL|qTta-74peNC(=A0bUj@1JPJL3%&<9F-)x;%ere5SLn8#tl*5(h?TW5P3Bmh+ z2DWa09=UiX-myANb@@F}fnc?sa4;%fPgc(kVDlYEN+HbzWt|$)Bf4LFr~HKqLndQm zR_?E-Dw&247H+D3vLh#kYC&L)@IuYkHN|N=!A1;n$@ps7h+#t^JmW89OmxGbK{KKp z=G;axoy9iyQdD#D`zOm5ugkp`Hjspkp`oF zPg%!!a}%on_eNMDY5OxY;O8`9M;}{k5qjT#*>@oiv_~u&sW!$POiUF@5o5(~#up$3 z(}?Im$qwOMQb`5boC)=H&!VGSCay%CEA2abXI%#C5Y)E=ovAvL;WzdVNmxZ6R)nL2 z64b;(u9E0fo`aMUCMY!MB<0$FPY#yk(+1#)Sxq}H=xQkps99#Vvu=LIycXh28uTj_ zZHL(YE=f%FnC%VL@a5~^>S%VhAdF<`1Sw4Es#59^noZHC6&|whM$4~frDPSFh-V?i zJVmduB=x=TvyxL~cz#`{o09hD6;&NF_9r558{sl0pQwU;d#o4XN)J6ELO4Fa-gdmI z@%}N7>RNl)>;M#`B9dSM#+V^$WwfZIjZ95Vb$$(S<7_F%MJ%LxZK^JjmWtKa=`>$9 zz>)Bd*Mt+G)zZSK##QO8YEyuN3(<1@=e1f#rV6`L_3>V7=}6~!%ft$B>^C;Xq!;UG z#tA3zh5{FJg^d4^jMgJ)N=8t-ifFSAH&q?4 z+a>~^&fA)7uZ+d>mmEAQrc&P~dhWM1uiW}AdX7`DTS3z&OgcGY%MaVi^Ah3Y8+)yS z3tDt%E-g&a_9qz6#_x2OePyj92t$O5te1lXR$uS*K&eN;a7ZLD6JL9xH(a$|!$4Ah z#5wI)N-n{JdRp}FVcyV9SSIvc4i_To*Ks5~j*%~K!YEyYpq?iHpc-U6&*Y3Alh^AB zQpUq1QlR2-w2!Cx5B*M$=}%ABJr~0iYt%l}IW|b-pFgj5D4@~Z2CRf?>T`|fcLI*? zb9^m0`n0vs>ufj>4Ejh0;$`bR9B)nalgq`znmv+?jKh!ul!5rD@b5Oe4+C+^+n9k&%&km(wEJ z$Di|u<@1#elsMgJ22(O^7)Vq-0=SAwgmP@IqkKse99t~}-V{lUHr-yU$Ssy37~{#& z-DnnEbSSXQ)i`Iekn?wJ^9R@Uw^S$>{$1Z~fTKS^kkQk^O1K|`i|UYVS=ZkVYxv(5 zB}!;xO#jU?0bjI;aT=XIe_cp8@caXs+@HEg+&7`%T=03IXG{4N9OB(F5rE>d5_7yS-eONZ~BHN!>QY7Rp zE!T)A6*ea8VH)Uilo35r$OY$_gqH93izPE?ClA>DXMGfj-2i#4EjsU5ex?2wESO0a(f)Qko8U}&TOAEl}_2Dl%y3_?uEbg|f|X19SRRM=^g1Mk9b*kyhPZs|#>fgNV ze(O79pby<|l%DAD>M<~%P(LbXf~zLS`Fu>)iDc4jhWFZ(_yw2@8*H_m_g+)-EUdyj z(MxCZ2Hg$bvVnjLEr>vPDwtk3@7n*^h|cTr?gddA(SUi{Pge~5G*`SN9WhX_ zMIt1BqOH1!3Mt}aZZ?ng#ex5d(0zIcR0f=*a@-NxEy5bj%b`@~)HZJ~zoVu&|9T7{ zuM6H6vgzizt3}3X36h(MVvyU~a-)H8I;yQ3)9PMgApY3{Q!RP9F_a((lX=mfnBd(A z@nI#e{1(u93KJt}c~8P`%7!9-%20lJjN@($Q)JzU9M^Ot1YNPh zpm1s&C-Vpt7pM7t{0)w@Ncz2xW6W9Ahlg99$1|RD1smf$Tkz;T!;O_xp#NhJ?bF(d z-?`*GeqbD&O{lPT)Mr}?b=+%bY20G4&X4Nfca-mMfFZt_o8Rh(P)Qn#3m>xI!Nb|P)(N;wKh2?QWQi~P!g}1P=Lk_Fok0~)Jw8~ACYxST7UFM3jtvD{ zxHdi6pa^k_YeJkas#Kny`=V!D^d~`-2!}H zB9a~Xk(Q$I$Bb&gh~sx1Ds5FGlAnpf5mscyoz zkE02mypGiNOAg1RC%4coGzrt$B{g>-O!kB7?j^#Nyg<;;q_oiYGF-xs5`?Pv~6oEFl#xo~byJV_R zC3pFRoSWhvqtqWAk>mHrK889W<4x=KezX9RQ8rt(Ss^|~biSOji29J!so8E~(N*7a z)NS;s((c=0-QB*JK;ly+3z9YVt@ytiWi@Z|8FH73A)}=qO$C`tdM1baP1=~ip?{kN zwUlEQ--70ju8VsWh=Zh;2AnOWQ^fVF-ffb{7#0yA&oCBTGmX?u?yTaQE*KcBh&O_0vS9~lbB+>%@WYXVl_>ZaN*8e)i7PdlHte~a8$Xk~wP?ons z_>V7y^~JHk-(J0;tvpo+{3pUb;^?C2cHPj=csY@)pd@T0={NLmUB=NAU?5?HH}u_% z>dO_kP>x9*bAwaOTgj6DYp zqT+YkpU|Un1KPFNgjK2VK+v*?U7SFXV9_-!MB!q!3RqB4oZ5^VfD*NF#JqayTDkTM z%VVJIvl9|`i;~Y%+x-f|P0*h>x!7>*h7{l9w~I4=0(f{~d|dlqLh3?z+OJif&%3g^ zuDzQx-IwVz#6X^F$o-MeYuA!@@cfR4RfW~cGnil-@~T@4u<>kLvY&m)kJs?q(5{1@ zo*aQY2cictd>${6?xD!Y!_-Pc*LwFwUQ=$DqM7ZioKl{VkGZ5_`3Kk3I6tgddySwz zZ1IqkFk{3D=$V7qRSnCsoL7)dj1=zNduYu#EE-j+w^bA8%(~w`Oxd_+=>)5#c;k<| zj(^z%d`lsM8*`WbEBV#x9`|GBf-8>AP7>aCyY-3e8AnqZl2vC1lSK-&kDI-%)m0RY za1Cyr)}}40<0HZ2&ikv1_p|DW=^waW(aZx}(NY*87$PzxA zZhX|2DEXG<>!^h`#blz(+($3{h(G`XXD{e57+wLkW@%ZM(*aQEuX(J&o5#6- zUdh7F8@}8neM*t@>c8C^IwAD7YmB%4!<{kgNey)J9cUJ+(6Nt)sXA6%F{FP<1S&|p zPmqG<-~^DcZ&=EXCsB$y4f*Rvw)vVQXmYZe{VbIJtu?OWj3ie5Uk+Lmz80qq$GA`_ ztm{f#-%fn^@PQbmM-TpbYP%fc^rW2aB<3(3M0}IE5lHoE+Kr!r~{_CN4`j4xNuP@ z|Bn4n_&#AArU$BB`=k_DzzYX7D4mQ%HrQer`9&SvAC@^riuCz)kMP7VWESK)`jOK^ z&z1Xu=bdxO=lTGsQ|3#;$)dkk(`NU**MY~+PtRESe#rL@f>-}=ki`)_bCY%>pzfmC zWu(GU^d!yk@#V+gh^{mKk@K=P>wn8fOCNuoJN|)@7YlKMgz@Q<)R~6%M7Lj|BRY^Y zL}if%#Z66fOoqGJ-j0co5fJE0nZ}{@RGQy1CYW?g78B8R@U%cAs4~>T=sKm5(1s0SUVhE)cw4H4B#`Nj2@%SJaudR=*ZFJf2QesSJ)iz6;{&Rq~~pmhAyt}tt7I?Bpz>4`^{@t z>|^=r(=FAOAUN(?04D>$>668Vd!mD2)y&Mm(wT>wTQFOV#WLMWF7MbwbRlxT0FmQs z5l*n*CQ2{+f5DQYME<2e&rGmKq1RL$m(pd+KIL%R@qH&(Op`;dYsE~t6P^(}ni`SH zn*bhiEXi>Z zVV;uW3o-*p2Y<3sNjibp<#qk^lAC2#oYziL(3=17M|u5TpiV%(XsAJMPJt!#r&DE| z8YrBXlqjC;_i#YUPPCtFG3;Z%gf#LGAW?vutH=?4Uz<&6(5KksC1LzLX#QLGGpn31 zzLvr#?+ty~6XJN^h7kpXMaq{KhM9%SAAg;8(u#>cagTbSzF)U>qozNeK~}3t|NZmk zL%u8oM!XtOGCJMa`)DI#{%NZ1PxCDa#X*N8Xo_U*4x^T2*R=V~9CPulgh)%#oSUX4*3w|00vVxC_sEr_E4?iMH)sT{ikMhW8r-?ee`C zPdEV$o?!@k_`hWFZ~X}b9M0XnACbLn+kmb*Z7sm?!<>Mx+N8ns&MMAzyg>M-fS`7; z!kMZ9s%G|or8@~XDKcK~PkrtojwA@y`@gqzB{&C34%Tt(Bdu&$(!q}quj7)m20&Lz zpTQvn@aUIIuPp4R4TkMsw+^c4ZQeIg44j^B4BS`a(ukuXr1KEX&CM05#O(EsRMzLW z)?F3*6fT0Fmhi+8XP}k)PBv?%V;=tS!C# zB)u({yH##5IHgDJcAiS>hj{F|#qJ6~8@0g+;njwuJRu3Y$w(cAoahOBMsn)94G+Al zIDS~?>FzIiRRJe=^I)!jv3?gx>vx^K;`b!9LS}sIDJtn^vbfbQ27RTv;^19GOEK!-q!HqM`fB9ir^?JKuN2uxp`RIawOqeB?z5An}a0+A2Y z4g;-V#RS&m86&rMM+uBT7SRMakdd~0S|kO9nJ(+Y=03Ijgda7F!ZJ;Nt{jIpJ9S*b z&ow0SCJ>Q#)SwOF6b#1H-{iyx!S7#21TV0cVo^iWty-uCk{PjqTO81#aCR`yFY*P% zoPlf`O(ngDbl=I!kzl!5Q4R`fvL&~$f_eZ2!~#graSy#YbMHgIqMw!j`qR z)&fCoy)3F`jy4#{pH47Xa4xNVr^DvPCs$I~At(Fy&WDOqSw^`6O)e$x9;Om;7gJPK zz|PUOqlKg7wJ!5b=6$^m+VoCOqC6|*X%d0BpYoju-zo2wB&FvY)-m_sJ_l;Ghva<` zv?=oxH-AO3er$QttHHC&)EGMNNR z9;ME{oo;@n4T9Mcyv#|k{&bfZ!T2<+u6Bm6xX$>^<;H9n|J@7@%P-O+lwlIZ5>w7R zS|tI+fXt_n(2^m9jthxY%4`j)>f%=Jzk&CNZ$oP=#71T{8gbQMYfx| z?JG6Mg0~h8l;xAi1?!-4s7m;VzL4;mla?+ihQFmhBtg)nQ4S=NemraW(~+4}%WO{M zUPeG66iyt@{#{0S-i`XOioGyad$*peD2$cN4;-v5%7_y`75yE&p1nWM5Jr%C&8|FW zko|@El^!(R)`IQzUN<{l?^K!7(Y5a(o=*uNjAvguQYq{k8_zmtRhJKwvzAbm)s6H* zrrnpW{YA15ukK9}0V_#vRVQtv87N};9^mkF`d!92db+v-bc2!khpmeJ@^Ut6Wy=`; ztc-rg<_}JS<%4>8W}xADp7Ku}%j2Z3fQ5-I19#W$1?ZH*IC>dB~3A4)D2JE6Ay0`dz{9p`i8c;#DGzq~m>p(%V*4uow?Ef+`i+ zpFD!ztK!$mc-&)mH-h6F=3~?0-b1mS+ss0a3lFK^af1kECKFUmv3x|~rXuPV!C=<> z%#HfFpssS3kxJW&L^#>>X^otxn&X z>gO}hr^CS8z^CJ%P6f1eK~3|utLg5%3$+y2{pRolgP{;Ji8xTg3!6lV=dBuX@8ei` z-QJJai^lcKt&><73|v5oEINFqF+4-|=)-vPVdzx<-WA zw?p{Mr9cUdM8Lx@J41t5MdxT&U2PZ3`ntP|`2n1hv$OSE)_e*7v(1^<3=JA%VGGHp zp~MxhGhKFfPuDj6QIk%efL0^_v(o`!v|Ds7zCnz?V{H}!7Vdk%zyrun{bduNRm;Yo za1&$WE$wM{e;*&pc0k2ga%ckBKo%<;C9nctM6RdA-45etxPh;a&!_kT=Jm6)Gk`

Jz{m_0d!|&dE=G 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 VcG^*C;*bCU002ovPDHLkV1ibDGX?+v literal 0 HcmV?d00001 diff --git a/flatpak/io.github.protonshift.yml b/flatpak/io.github.protonshift.yml new file mode 100644 index 0000000..36bf999 --- /dev/null +++ b/flatpak/io.github.protonshift.yml @@ -0,0 +1,63 @@ +app-id: io.github.protonshift +runtime: org.freedesktop.Platform +runtime-version: "24.08" +sdk: org.freedesktop.Sdk +base: org.electronjs.Electron2.BaseApp +base-version: "24.08" +command: protonshift +separate-locales: false + +finish-args: + - --share=ipc + - --share=network + - --socket=x11 + - --socket=wayland + - --socket=pulseaudio + - --device=dri + # Home read-only for game library discovery + - --filesystem=home:ro + # Steam paths (native + Flatpak) + - --filesystem=~/.steam:ro + - --filesystem=~/.local/share/Steam:ro + - --filesystem=~/.var/app/com.valvesoftware.Steam:ro + # Heroic paths (native + Flatpak) + - --filesystem=~/.config/heroic:ro + - --filesystem=~/.var/app/com.heroicgameslauncher.hgl:ro + # Lutris paths (native + Flatpak) + - --filesystem=~/.local/share/lutris:ro + - --filesystem=~/.var/app/net.lutris.Lutris:ro + # Writable config paths + - --filesystem=~/.config/MangoHud + - --filesystem=~/.config/environment.d + - --filesystem=~/.config/protonshift + # Talk to Flatpak for launching games via steam:// URIs + - --talk-name=org.freedesktop.Flatpak + +modules: + - name: python3-deps + buildsystem: simple + build-commands: + - pip3 install --no-build-isolation --prefix=/app vdf fastapi "uvicorn[standard]" + sources: + - type: file + url: https://files.pythonhosted.org/packages/source/v/vdf/vdf-3.4.tar.gz + sha256: FIXME + + - name: protonshift-python + buildsystem: simple + build-commands: + - pip3 install --no-build-isolation --prefix=/app . + sources: + - type: dir + path: .. + + - name: protonshift + buildsystem: simple + build-commands: + - cp -r electron-dist/* /app/ + - install -Dm644 assets/io.github.protonshift.svg /app/share/icons/hicolor/scalable/apps/io.github.protonshift.svg + - install -Dm644 assets/io.github.protonshift.desktop /app/share/applications/io.github.protonshift.desktop + - install -Dm644 assets/io.github.protonshift.metainfo.xml /app/share/metainfo/io.github.protonshift.metainfo.xml + sources: + - type: dir + path: .. From 222cc8e153afeacc09dd6b6c8e1d5b3a0d3789cf Mon Sep 17 00:00:00 2001 From: I4cTime Date: Sun, 19 Apr 2026 00:48:45 +0800 Subject: [PATCH 2/2] refactor(python): execute full backend review plan (P0+P1+P2+P3) (#15) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(python): execute full backend review plan (P0+P1+P2+P3) Implements every item from docs/python-review.md except a deferred follow-up on bundling python-build-standalone. 70 new pytest cases, ruff and pyright clean across src/ + tests/. P0 — release blockers - P0-1 AppImage native ext compatibility: rewrite _vendor_compat.py to mutate sys.path instead of shutil.rmtree-ing files (no-op on read-only squashfs). Drop uvicorn[standard] -> uvicorn (kills uvloop/httptools/watchfiles, 3 of 4 vendored .so). Trim _NATIVE_PACKAGES to actual deps (pydantic_core only). Fix electron/main.ts: PYTHONNOUSERSITE = "" was truthy and disabled the user site-packages fallback we wanted; now `delete env.PYTHONNOUSERSITE`. - P0-2 single version source: __version__ in __init__.py is the only place, api app + electron package.json read from it. Bump 0.8.11 -> 0.9.0. - P0-3 declare pydantic in pyproject.toml + python-runtime-requirements.txt. P1 — correctness / safety - P1-1 path traversal: new paths.py with sanitize_filename, safe_join, validate_user_path (rejects anything outside HOME / mounts / tmp). Applied at every API boundary that accepts a caller-supplied path (open-path, saves/restore, prefix delete, mangohud per-game, profiles, fixes, heroic configs). - P1-2 API auth + CORS: per-launch bearer token via PROTONSHIFT_API_TOKEN, enforced by FastAPI middleware (compare_digest). CORS narrowed to localhost:3000 + file:// renderer. /health exempt for readiness probe. Electron mints the token, attaches it to every api-fetch. - P1-3 atomic writes everywhere + Steam-running guard: vdf_config, env_vars, mangohud, profiles_storage, fixes, heroic_config all use fsutil.atomic_write_text now. update_launch_options + update_compat_tool return 409 when Steam is running so we don't get clobbered. - P1-4 fix get_power_profiles parsing bug (was overwriting parsed list with a hardcoded one). - P1-5 controllers: replace fake SDL GUID with canonical 16-byte little-endian bus/vendor/product/version layout from libsdl2. - P1-6 remove dead BUILTIN_PROTON constant; discovery already returns these dynamically. - P1-7 gamescope: build_gamescope_argv returns list[str] for Popen, build_gamescope_cmd returns shlex.join'd shell-safe string. P2 — maintainability - P2-1 pytest suite: 70 tests covering fsutil, paths, env_vars, vdf_config, tool_check, gamescope, controllers, vendor_compat, and end-to-end FastAPI smoke (auth, CORS, Steam guard, path traversal rejection). - P2-2 delete dead GTK app.py + __main__.py + theme.css; drop the protonshift console script. - P2-3 logging_setup.py: structured logging, replace silent except: pass with logged warnings on narrow exception types. - P2-4 split api.py (1183 LOC) into api/ package: _state, _models, _helpers, _app + routes/{health,games,system,saves,mangohud,heroic, profiles,utility}. Backwards-compat __getattr__ shim on the package init for the legacy _API_TOKEN / _config_path attribute names. - P2-5/7 fsutil.py: dir_size, human_size, atomic_write_text/bytes — replaces 3 duplicated _dir_size implementations. - P2-6 cache discover_games with a 5s TTL. - P2-9 promote heroic._resolve_heroic_root to public resolve_heroic_root. - P2-10 Electron picks the API port locally and passes --port; drops the fragile stdout regex parsing. P3 — style nits - Hoist subprocess to module-level imports, fix ruff B904 chains, ruff I001 import ordering, datetime.UTC for UP017, etc. Files: 57 changed, +3669 / -2638. Net code is much smaller than it looks (GTK app removed). Verification: ruff, pyright (strict), pytest all green. Deferred to a separate PR: bundling python-build-standalone in the AppImage to remove the residual system-pydantic dependency entirely. Made-with: Cursor * security: fix CodeQL alerts (2 critical command injection + 1 high token leak) Addressed all alerts CodeQL flagged on PR #15: Critical fixes: - protontricks.py: whitelist app_id (digits) and verb (alphanumeric+._-) before assembling the subprocess argv. Even though Popen with list args doesn't shell-execute, validating at the boundary keeps the surface clean and gives CodeQL a recognised sanitizer. - display.py:set_resolution: whitelist monitor name against actually-detected outputs from get_monitors(), and bound width/height/refresh to sane ranges. High fixes: - api/_app.py: remove the --print-token CLI flag. Standalone curl users should set PROTONSHIFT_API_TOKEN themselves; we never want credentials leaking into journald, IDE consoles, or Electron logs. - prefix.py / saves.py: defensively call validate_user_path() inside delete_prefix, get_prefix_info, find_save_paths, restore_backup, and backup_saves so each function refuses paths outside the user-writable roots even when called directly. This also satisfies CodeQL's data-flow analysis on the path-injection chain that previously fired 17 times. - saves.py: sanitize app_id everywhere it joins onto a path, not just in backup_saves. New tests (26 cases across 2 files): - tests/test_protontricks.py — app_id and verb whitelist coverage incl. shell metachars, traversal attempts, oversize values. - tests/test_display.py — set_resolution rejects shell metachars, unknown monitors, oversize dimensions, silly refresh rates. Verification: ruff clean, pyright 0 errors, pytest 96/96. Made-with: Cursor --- docs/python-review.md | 744 +++++++++++++++ electron/main.ts | 80 +- electron/package.json | 4 +- electron/python-runtime-requirements.txt | 11 +- pyproject.toml | 34 +- pyrightconfig.json | 5 +- src/game_setup_hub/__init__.py | 4 +- src/game_setup_hub/__main__.py | 6 - src/game_setup_hub/_vendor_compat.py | 156 ++- src/game_setup_hub/api.py | 1062 --------------------- src/game_setup_hub/api/__init__.py | 41 + src/game_setup_hub/api/__main__.py | 8 + src/game_setup_hub/api/_app.py | 95 ++ src/game_setup_hub/api/_helpers.py | 40 + src/game_setup_hub/api/_models.py | 256 +++++ src/game_setup_hub/api/_state.py | 56 ++ src/game_setup_hub/api/routes/__init__.py | 18 + src/game_setup_hub/api/routes/games.py | 129 +++ src/game_setup_hub/api/routes/health.py | 13 + src/game_setup_hub/api/routes/heroic.py | 115 +++ src/game_setup_hub/api/routes/mangohud.py | 79 ++ src/game_setup_hub/api/routes/profiles.py | 61 ++ src/game_setup_hub/api/routes/saves.py | 78 ++ src/game_setup_hub/api/routes/system.py | 158 +++ src/game_setup_hub/api/routes/utility.py | 252 +++++ src/game_setup_hub/app.py | 1053 -------------------- src/game_setup_hub/controllers.py | 98 +- src/game_setup_hub/display.py | 22 +- src/game_setup_hub/env_vars.py | 10 +- src/game_setup_hub/fixes.py | 13 +- src/game_setup_hub/fsutil.py | 104 ++ src/game_setup_hub/gamescope.py | 34 +- src/game_setup_hub/gpu.py | 18 +- src/game_setup_hub/heroic.py | 10 +- src/game_setup_hub/heroic_config.py | 19 +- src/game_setup_hub/logging_setup.py | 40 + src/game_setup_hub/lutris.py | 1 - src/game_setup_hub/mangohud.py | 15 +- src/game_setup_hub/paths.py | 109 +++ src/game_setup_hub/prefix.py | 52 +- src/game_setup_hub/profiles_storage.py | 16 +- src/game_setup_hub/protontricks.py | 56 +- src/game_setup_hub/saves.py | 137 ++- src/game_setup_hub/shader_cache.py | 16 +- src/game_setup_hub/steam.py | 71 +- src/game_setup_hub/theme.css | 257 ----- src/game_setup_hub/vdf_config.py | 89 +- tests/__init__.py | 0 tests/conftest.py | 67 ++ tests/test_api_smoke.py | 94 ++ tests/test_controllers.py | 76 ++ tests/test_display.py | 49 + tests/test_env_vars.py | 53 + tests/test_fsutil.py | 78 ++ tests/test_gamescope.py | 48 + tests/test_paths.py | 82 ++ tests/test_protontricks.py | 57 ++ tests/test_tool_check.py | 23 + tests/test_vdf_config.py | 79 ++ tests/test_vendor_compat.py | 106 ++ 60 files changed, 3896 insertions(+), 2661 deletions(-) create mode 100644 docs/python-review.md delete mode 100644 src/game_setup_hub/__main__.py delete mode 100644 src/game_setup_hub/api.py create mode 100644 src/game_setup_hub/api/__init__.py create mode 100644 src/game_setup_hub/api/__main__.py create mode 100644 src/game_setup_hub/api/_app.py create mode 100644 src/game_setup_hub/api/_helpers.py create mode 100644 src/game_setup_hub/api/_models.py create mode 100644 src/game_setup_hub/api/_state.py create mode 100644 src/game_setup_hub/api/routes/__init__.py create mode 100644 src/game_setup_hub/api/routes/games.py create mode 100644 src/game_setup_hub/api/routes/health.py create mode 100644 src/game_setup_hub/api/routes/heroic.py create mode 100644 src/game_setup_hub/api/routes/mangohud.py create mode 100644 src/game_setup_hub/api/routes/profiles.py create mode 100644 src/game_setup_hub/api/routes/saves.py create mode 100644 src/game_setup_hub/api/routes/system.py create mode 100644 src/game_setup_hub/api/routes/utility.py delete mode 100644 src/game_setup_hub/app.py create mode 100644 src/game_setup_hub/fsutil.py create mode 100644 src/game_setup_hub/logging_setup.py create mode 100644 src/game_setup_hub/paths.py delete mode 100644 src/game_setup_hub/theme.css create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_api_smoke.py create mode 100644 tests/test_controllers.py create mode 100644 tests/test_display.py create mode 100644 tests/test_env_vars.py create mode 100644 tests/test_fsutil.py create mode 100644 tests/test_gamescope.py create mode 100644 tests/test_paths.py create mode 100644 tests/test_protontricks.py create mode 100644 tests/test_tool_check.py create mode 100644 tests/test_vdf_config.py create mode 100644 tests/test_vendor_compat.py diff --git a/docs/python-review.md b/docs/python-review.md new file mode 100644 index 0000000..0775394 --- /dev/null +++ b/docs/python-review.md @@ -0,0 +1,744 @@ +# Python Backend Review — ProtonShift + +Scope: everything under `src/game_setup_hub/` (the FastAPI backend that Electron +spawns), plus the packaging glue in `electron/main.ts` and +`electron/scripts/vendor-python-deps.sh` that wires it up. + +- Total Python LoC (backend): **~4,647** across 22 modules +- Tests: **0** +- Linters/typers configured: `ruff`, `pyright` (standard mode, `app.py` excluded) +- Python floor: `>=3.12` (`pyproject.toml`) + +Findings are grouped by severity. Each has a concrete fix sketch. Ordering +inside each group roughly reflects impact. + +--- + +## P0 — Fix before next release + +### P0-1. Vendored native extensions fundamentally incompatible with AppImage — **PARTIALLY FIXED in v0.9.0** + +**Status (2026-04-16):** the read-only-FS bug and the `PYTHONNOUSERSITE` +inversion are both fixed. The maintenance burden of vendoring `pydantic_core` +remains until we adopt option B (`python-build-standalone`). + +What landed (see PR linked in the changelog): + +- `_vendor_compat.py` was rewritten to **mutate `sys.path` instead of the + filesystem**. When the vendored `pydantic_core/*.so` does not match the + runtime SOABI, the system + user site-packages are prepended to `sys.path` + so the system copy of pydantic_core is found first. The vendor dir stays + on `sys.path` for the rest of our pure-Python deps. Works on read-only + squashfs (AppImage) because no FS writes happen. +- `_NATIVE_PACKAGES` reduced from 5 entries to the only one that's actually + vendored (`pydantic_core`). `yaml`, `uvloop`, `httptools`, `watchfiles` + were never declared deps. +- `electron/main.ts` no longer sets `PYTHONNOUSERSITE = ""` (which CPython + reads as truthy and used to *disable* user site-packages, the opposite of + what we wanted). It now `delete`s the var so the system fallback is real. +- `python-runtime-requirements.txt` and `pyproject.toml` switched + `uvicorn[standard]` → bare `uvicorn`. That kills 3 of the 4 vendored + native extensions (uvloop, httptools, watchfiles). The localhost-only + GUI workload doesn't need the perf. +- New `tests/test_vendor_compat.py` covers: no-op when there's no vendor + dir, no-op when the `.so` is compatible, sys.path reordering when it + isn't, no `shutil.rmtree` is ever called, and a graceful warning when + no system fallback is available. + +**Net result.** Bundle size of the vendor dir drops to one native package +(`pydantic_core`). AppImage users on a system Python whose minor version +matches the build → unaffected. AppImage users on a *different* minor → +silently fall back to system pydantic_core if installed (Debian/Fedora/Arch +all ship one); otherwise get a loud, actionable warning telling them to +install it. No more silent `ModuleNotFoundError` from a no-op `rmtree`. + +**Still pending — option B.** Bundle our own Python via +`python-build-standalone` to remove the system-pydantic dependency entirely. +Tracked separately; not in this PR. + +--- + +#### Original problem description (kept for archival reference) + +The current v0.8.11 fix (`_vendor_compat.py`) tries to detect ABI-mismatched +`.so` files at import time and `shutil.rmtree` them so Python falls back to +system packages. + +Why it does not work: + +1. AppImages are **read-only squashfs**. `shutil.rmtree(pkg_dir, ignore_errors=True)` + silently fails on write-protected filesystems, leaving the incompatible + `pydantic_core/_pydantic_core.cpython-312-*.so` on `sys.path`. The user + still gets `ModuleNotFoundError` — the "fix" is a no-op. +2. Even on writable targets (`.deb`, `.rpm`), mutating the install dir at + runtime is hostile to packagers and fails the second time after an + SELinux/AppArmor denial. +3. The module fixes `sys.path` by deleting files, but `sys.path` itself is + unchanged. On the second process start, the vendor dir is still first. + +Also wrong nearby: + +- `electron/main.ts` sets `env.PYTHONNOUSERSITE = ""`. In CPython, the var + being **present at all** (non-empty or empty) is truthy: it *disables* user + site-packages. The intent was the opposite. Unset it with + `delete env.PYTHONNOUSERSITE` or do not touch it. +- `_NATIVE_PACKAGES` in `_vendor_compat.py` lists `yaml` (PyYAML), `uvloop`, + `httptools`, `watchfiles` — none of which are actually declared + dependencies. `pydantic_core` is the only real target today. +- The `.deb`/`.rpm` `python3-pydantic` dependency added for this issue only + helps Debian/Fedora-family native packages; CachyOS (Arch, where #13 was + reported) and AppImage users on any distro still break. + +**Recommended fix — pick one, in priority order** + +A. **Stop vendoring native wheels; replace with a pure-Python stack.** + - Drop `pydantic`. The API layer only uses `BaseModel` for request/response + shaping. Replace with `msgspec` (ships as a single pure-Python wheel + + optional C speedups) **or** hand-rolled `dataclasses` + `fastapi.Body` + with manual parsing — FastAPI does not require Pydantic for routing + when you type parameters as primitives/dicts. + - Drop `uvicorn[standard]` (pulls uvloop, httptools, watchfiles) in favor + of `uvicorn` (pure-Python asyncio + h11). The performance delta is + irrelevant on localhost with a GUI frontend. + - Result: vendor dir has **zero** `.so` files, AppImage works on any + Python ≥3.12. + +B. **Ship our own Python interpreter in the AppImage.** + Use `python-build-standalone` (Astral publishes portable 3.12 builds). + The AppImage becomes ~40 MB bigger but is entirely self-contained. + Build-script change only; no runtime tricks. + +C. **Build manylinux wheels per CPython minor version and pick at runtime.** + Vendor `pydantic_core-cp312-*.so`, `pydantic_core-cp313-*.so`, etc., and + resolve at import time (small sitecustomize shim). Maintenance cost grows + linearly with CPython versions. + +I recommend **A** as the short-term fix and revisit **B** when we add other +native deps. Delete `_vendor_compat.py` entirely once A lands. + +Also in `electron/main.ts`: + +```typescript +// Unset, don't set to empty string — empty is still "present" +delete env.PYTHONNOUSERSITE; +``` + +Files: `src/game_setup_hub/_vendor_compat.py`, `src/game_setup_hub/api.py:5`, +`electron/main.ts:73`, `electron/python-runtime-requirements.txt`, +`pyproject.toml:11-15`. + +--- + +### P0-2. Version drift across three places + +- `pyproject.toml` → `version = "0.8.11"` +- `src/game_setup_hub/__init__.py` → `__version__ = "0.8.8"` +- `src/game_setup_hub/api.py:329` → `FastAPI(title=..., version="0.8.8")` + +The API reports `0.8.8` in its OpenAPI schema and `/docs` while we ship +`0.8.11`. This broke once during the Bazzite fix when the version bumped but +`__init__.py` was missed. + +**Fix** + +Single source of truth. Either: + +- Read version from installed package metadata in `__init__.py` and `api.py`: + ```python + from importlib.metadata import version as _v + __version__ = _v("protonshift") + ``` +- Or delete `__version__` and `version=` and let the frontend read from the + OS/package channel. + +Also add a CI step that diffs `pyproject.toml` against `__init__.py` and fails +the build on drift. + +Files: `src/game_setup_hub/__init__.py`, `src/game_setup_hub/api.py:329`, +`pyproject.toml:7`. + +--- + +### P0-3. Missing explicit dependency on `pydantic` + +`pyproject.toml` depends on `fastapi>=0.115,<1` and assumes `pydantic` arrives +transitively. `api.py` imports `from pydantic import BaseModel` directly — if +FastAPI ever switches to an optional Pydantic, or a user installs a broken +FastAPI build, the module fails to import. + +Also `electron/python-runtime-requirements.txt` has the same omission. + +**Fix** + +Add `pydantic>=2.0` to both files. Even if we follow P0-1 option A and drop +Pydantic, fix this in the interim release so the dep graph matches imports. + +Files: `pyproject.toml:11-15`, `electron/python-runtime-requirements.txt`. + +--- + +## P1 — Correctness / safety + +### P1-1. Path traversal in several endpoints + +None of the endpoints that accept caller-supplied paths or filenames validate +them against a safe base. Examples: + +- `POST /open-path` (`api.py:899`) opens any path that exists. Low impact + because the Electron frontend is the only caller, but anyone who can reach + `127.0.0.1:` (including other local user processes) can ask the + Python backend to open arbitrary paths via `xdg-open`. +- `PUT /mangohud/per-game/{game_name}` (`mangohud.py:215`). `game_name` is + sanitized only by replacing `" "`, `"/"`, `"\"` — `..` slips through, so + `game_name="../../.bashrc"` writes an arbitrary file under + `~/.config/MangoHud/`. Limited blast radius (fixed dir) but still a bug. +- `POST /games/{app_id}/saves/restore` (`api.py:704`). `backup_path` and + `target_dir` are taken verbatim. `backup_path="/etc/shadow"` does not leak + (we only extract), but `target_dir="/home//.config/…"` can overwrite + files with a malicious zip (zip slip — `zipfile.extractall` does not + validate member paths in older Python; 3.12 does, but we should not rely + on it). +- `profiles_storage._safe_filename` (`profiles_storage.py:36`) strips most + bad chars but allows leading `.` (creates hidden files) and spaces. The + mangohud helper re-implements a weaker version. + +**Fix** + +1. Add a single `paths.py` with: + ```python + def safe_join(base: Path, untrusted: str) -> Path: ... + def sanitize_filename(name: str) -> str: ... + ``` + Both raise `ValueError` on escape. +2. Apply at every API boundary that takes user paths or names. +3. Gate `/open-path` and `/open-uri` behind an allowlist of prefixes + (Steam root, compatdata, profiles dir) or a shared secret between Electron + and Python (already recommended in P1-2). + +Files: `api.py:899-927`, `mangohud.py:215-218`, `saves.py:133`, +`profiles_storage.py:36`. + +--- + +### P1-2. Unauthenticated localhost API with `CORS *` + +`api.py:329-330`: + +```python +app = FastAPI(title="ProtonShift API", version="0.8.8") +app.add_middleware(CORSMiddleware, allow_origins=["*"], ...) +``` + +The backend binds `127.0.0.1` so the external attack surface is small, but: + +- Any **local** process (browser tabs included, via DNS rebinding to + `127.0.0.1`) can issue state-changing requests. +- `allow_origins=["*"]` defeats the browser's same-origin check, which is the + one thing that would block the rebind scenario. + +**Fix** + +1. Have Electron generate a random 32-byte hex token at startup, pass it to + Python via env var (`PROTONSHIFT_API_TOKEN`), and include it as a header + on every renderer request. +2. Add a FastAPI dependency that validates `X-Protonshift-Token` and rejects + other requests with 401. +3. Narrow `allow_origins` to the Electron static-renderer origin + (`http://127.0.0.1:`). + +Files: `api.py:329-330` plus a new `auth.py` dep. + +--- + +### P1-3. VDF writes are not atomic and not Steam-aware + +`vdf_config.set_launch_options` and `set_compat_tool` do: + +```python +with open(config_path, "w", encoding="utf-8", newline="\n") as f: + vdf.dump(data, f, pretty=True) +``` + +Two problems: + +1. **No atomic rename.** A crash (or OS kill) mid-write leaves + `localconfig.vdf` truncated. For Steam, that can wipe *all* launch options + and compat tools. +2. **Steam races us.** `is_steam_running()` exists (`steam.py:12`) but nothing + enforces it before writing. If the user edits launch options while Steam + is running, Steam will overwrite our file on shutdown. + +**Fix** + +1. Atomic write helper: + ```python + def atomic_write_text(path: Path, data: str) -> None: + tmp = path.with_suffix(path.suffix + ".tmp") + tmp.write_text(data, encoding="utf-8", newline="\n") + os.replace(tmp, path) + ``` + Use it everywhere we overwrite a user-owned config (`vdf_config`, + `env_vars`, `mangohud`, `profiles_storage`, `fixes`, `heroic_config`). +2. In `PUT /games/{app_id}/launch-options` and friends, return `409 Conflict` + with a structured error when `is_steam_running()` is true. Let the + frontend show the existing "Close Steam" dialog instead of the backend + silently writing a doomed file. + +Files: `vdf_config.py:62-122`, `env_vars.py:62-67`, `mangohud.py:197-212`, +`profiles_storage.py:40-48`, `fixes.py:82-98`, `heroic_config.py:85-90`. + +--- + +### P1-4. `get_power_profiles` returns a hardcoded list, ignoring parsed data + +`gpu.py:104-126`: + +```python +r = subprocess.run(["powerprofilesctl", "list"], ...) +if r.returncode == 0: + profiles = [] + for line in r.stdout.split("\n"): + if "*" in line: + m = re.search(r"[\*]\s*([\w-]+)", line) + if m: + profiles.append(m.group(1)) + if profiles: + return ["performance", "balanced", "power-saver"] # <-- wrong +``` + +The `profiles` list is built and then **thrown away**; the function returns +a constant. Also the regex matches the *current* profile (marked `*`), not +every available profile, so `profiles` has at most one entry anyway. + +**Fix** + +```python +r = subprocess.run(["powerprofilesctl", "list"], ...) +if r.returncode == 0: + profiles = [ + m.group(1) for line in r.stdout.splitlines() + if (m := re.match(r"\s*\*?\s*([\w-]+):", line)) + ] + if profiles: + return profiles +``` + +Then remove the hardcoded fallback or keep it only when parsing yields zero. + +Files: `gpu.py:104-126`. + +--- + +### P1-5. SDL controller GUID is fabricated + +`controllers.get_sdl_mapping` (`controllers.py:119-142`) builds a GUID as: + +```python +guid = f"{vendor_id:>04s}{product_id:>04s}".ljust(32, "0") +``` + +Real SDL2 GUIDs are 16 bytes LE: `bus(2) crc(2) vendor(2) 0000 product(2) 0000 version(2) 0000`. The stub we emit will not match in SDL and the +generated mapping will never apply. This is a latent bug dressed as a +feature. + +**Fix** + +Either: +- Read the canonical GUID from `/sys/class/input/jsN/device/id/{bustype,vendor,product,version}` and assemble the real 16-byte LE blob, or +- Remove the endpoint until we can do it correctly; the frontend can link + to upstream `sdl2-jstest` / `antimicrox`. + +Files: `controllers.py:119-142`, `api.py:622-629`. + +--- + +### P1-6. `BUILTIN_PROTON` constant is dead; duplicate list in function body + +`steam.py:188-201`: + +```python +BUILTIN_PROTON = ["proton_experimental", "proton_9_0", ...] # never used + +def get_available_proton_tools(...) -> list[str]: + tools: list[str] = ["", "proton_experimental", "proton_9_0", ...] + ... +``` + +The module-level `BUILTIN_PROTON` constant is imported by nothing; the +function hardcodes a slightly different list. When Proton 10 ships, we will +update one of the two. + +**Fix** + +Delete `BUILTIN_PROTON` (or use it in the function). Add a comment pointing +at the Steam-side source of truth. + +Files: `steam.py:188-201`. + +--- + +### P1-7. `gamescope.build_gamescope_cmd` returns a shell-ready string + +`gamescope.py:32-66` returns `" ".join(parts)` with `opts.extra_args` +concatenated unescaped. The string is surfaced in `/gamescope/build-cmd` +intended for copy-paste into Steam launch options, so it is not an +`exec`-style shell-injection issue, but: + +- The frontend might eventually execute the string (we've already seen this + pattern in `run_protontricks`). +- Users who paste `"; rm -rf ~"` in `extra_args` get surprising text back. + +**Fix** + +Return both `argv: list[str]` and `command: str` (quoted via `shlex.join`). +Frontend shows `command`; any executor uses `argv`. + +Files: `gamescope.py:32-66`, `api.py:806-823`. + +--- + +## P2 — Maintainability / quality + +### P2-1. No tests, anywhere + +4,647 LoC of Python without a single test file. The modules touching the +largest blast radius (`vdf_config`, `_vendor_compat`, `steam`, `heroic`, +`tool_check`, `env_vars`, path-sanitization helpers) are the ones that are +hardest to reason about by reading. + +**Fix — minimum viable test suite** + +Add `pytest` + a `tests/` tree with: + +1. **VDF round-trips**: read a fixture `localconfig.vdf` → mutate → write → + re-read, assert launch options preserved. Include the "Steam writes new + keys we don't know about" case (verify we don't strip them). +2. **Tool detection**: `tool_check.find_tool` with monkey-patched `shutil.which` + and temporary directories for the fallback branch. +3. **Path sanitization**: once P1-1 lands, test `safe_join` against a zip slip + corpus. +4. **Env file**: `env_vars.read_conf` / `write_conf` with quoted values, + escapes, comments. +5. **VS_FIXEDFILEINFO parse**: drop a minimal PE fixture and confirm DXVK + version detection. +6. **API smoke**: `fastapi.testclient.TestClient(app)` hitting every GET + endpoint against a fixture Steam root (pytest tmp_path). + +Start with (1), (2), (4), (6) — that's ~4 hours of work and covers the +regression paths we've already hit twice. + +--- + +### P2-2. `app.py` (GTK4) is 1053 lines of dead weight + +`src/game_setup_hub/app.py` is the old GTK4 UI, excluded from pyright, and +no longer referenced by the Electron frontend. `pyproject.toml:21` still +declares `protonshift = "game_setup_hub.app:main"` so `pip install` creates a +launcher for it, but the README/packaging flow only uses the Electron app. + +It imports `gi` unconditionally. Anyone who installs the wheel on a system +without GTK4 gets an `ImportError` they cannot debug. + +**Fix** + +1. Decide: do we still ship the GTK app? If no, delete `app.py`, `__main__.py`, + and remove the `protonshift` console script. +2. If yes, move it under `src/game_setup_hub/gtk/` and gate the import + (`try: import gi; except ImportError: ...`). + +Either way, stop silently compiling 1k LoC that pyright refuses to look at. + +Files: `src/game_setup_hub/app.py`, `src/game_setup_hub/__main__.py`, +`pyproject.toml:20-22`. + +--- + +### P2-3. Silent `except Exception: pass` everywhere + +Grep: 8 bare `except Exception` in `api.py` and `app.py`, plus ~40 +`except OSError: pass` / `except (..., json.JSONDecodeError): return None` +across the backend. Every one of these turns into an empty list / empty +string in the UI with no logs to tell us which path failed. + +Examples: + +- `api.py:418-419`: `get_game_launch_options` swallows any VDF parse error + and returns `""`. The user edits a file that was already corrupt and sees + no warning. +- `heroic.py:68`, `heroic.py:157`: swallow every `KeyError` under + `json.JSONDecodeError`. A schema change in Heroic == silent empty list. +- `profiles_storage.py:46`, `.64`, `.74`: write failures silently return + `False` → UI says "saved" and nothing is on disk. + +**Fix** + +1. Add a module-level logger per file: + ```python + import logging + log = logging.getLogger(__name__) + ``` +2. Configure once in `api.py` `cli()`: + ```python + logging.basicConfig( + level=os.environ.get("PROTONSHIFT_LOG", "INFO"), + format="%(levelname)s %(name)s: %(message)s", + ) + ``` +3. In every `except`, either log at `warning` (recoverable) or re-raise with + context. Electron already pipes stderr to the dev console, so these show + up for free. +4. For `Status`/boolean return values, return a `tuple[bool, str]` or a + typed error so API endpoints can surface messages instead of bare 500s. + +--- + +### P2-4. `api.py` and `app.py` are both 1k+ lines + +`api.py` has 35+ endpoints plus 30+ Pydantic models plus helpers, in one +file. Navigating requires search. + +**Fix** + +Split by concern under `src/game_setup_hub/api/`: + +``` +api/__init__.py # FastAPI app, middleware, CLI entry +api/models.py # Pydantic response/request types +api/deps.py # auth, _ensure_steam, _vdf_lock, etc. +api/routes/steam.py +api/routes/heroic.py +api/routes/lutris.py +api/routes/mangohud.py +api/routes/gamescope.py +api/routes/system.py # gpu, power, display, controllers +api/routes/profiles.py +api/routes/saves.py +api/routes/system_io.py # open-path, open-uri +``` + +Each routes file uses `APIRouter`. The top-level `api/__init__.py` wires +them up. This maps to a fresh Electron dev's mental model ("I'm looking for +the MangoHud endpoint" → obvious file). + +--- + +### P2-5. Duplicate `_dir_size` helper in three modules + +`saves.py:29-40`, `prefix.py:21-33`, `shader_cache.py:18-29` — same function, +subtle differences (one uses `stat()`, two use `lstat()`; symlink-following +differs). Same bug fix would have to land in three places. + +**Fix** + +Move to a new `src/game_setup_hub/fsutil.py` exposing `dir_size(path, +follow_symlinks=False) -> int` and a matching `human_size(bytes) -> str` +(which is also duplicated between `api.py:598-603` and the frontend). + +--- + +### P2-6. `discover_games()` called on every request + +`_ensure_steam()` caches only the Steam root, not the games list. Every call +to `/games`, `/games/.../saves`, `/games/.../prefix-info`, `/games/.../shader-cache`, +`/games/.../fixes`, and `/games/.../launch-options` re-parses every +`appmanifest_*.acf` on disk. + +A Steam library with 500 games means ~500 VDF parses per page load. + +**Fix** + +Cache the result with a TTL (`functools.lru_cache` + a tiny wrapper that +invalidates on write, or `cachetools.TTLCache(maxsize=1, ttl=30)`). Expose +`POST /games/rescan` for the manual refresh button. + +Files: `api.py:345-352, 397-408, 660-678, 861-896`. + +--- + +### P2-7. `_human_size` lives in `api.py`, with a type-ignore + +`api.py:598-603`: + +```python +def _human_size(size_bytes: int) -> str: + for unit in ("B", "KB", "MB", "GB", "TB"): + if abs(size_bytes) < 1024: + return f"{size_bytes:.1f} {unit}" + size_bytes /= 1024 # type: ignore[assignment] + return f"{size_bytes:.1f} PB" +``` + +The `type: ignore` exists because we mutate the `int` parameter into a +`float`. Type signature should be `float` (accepts int via widening) and the +loop variable should be local. Also: move to `fsutil.py` (P2-5). + +--- + +### P2-8. Mixed CPython features and "defensive" `from __future__ import annotations` + +Every module has `from __future__ import annotations`, required in 3.8-3.9 +but unnecessary under `requires-python = ">=3.12"`. Pyright sees them as +strings, which hides some errors. Combined with the mix of `dict[str, str]` +and `Dict[str, str]`... actually it's clean `dict[str, str]` everywhere. + +**Fix** + +Keep `from __future__ import annotations` only where it's needed for forward +refs or self-types; remove elsewhere. Optional, but it is a constant source +of pyright confusion. + +--- + +### P2-9. Cross-module private imports + +`heroic_config.py:10` imports `heroic._resolve_heroic_root`. The underscore +prefix is a contract: this is private to `heroic.py`. Either promote +`resolve_heroic_root` to public or move the helper into a shared +`heroic_paths.py`. + +Files: `heroic_config.py:10`, `heroic.py:30-34`. + +--- + +### P2-10. `print("PORT:…")` IPC is brittle + +`api.py:1046-1058` prints a port to stdout and relies on +`electron/main.ts:90-96` regex-matching `/PORT:(\d+)/`. If uvicorn's +`log_level="warning"` ever writes to stdout (it shouldn't but has in +past releases), the match consumes the wrong line. + +**Fix** + +- Send the port via a Unix domain socket opened by Electron before spawning + Python, passed as a file descriptor or path in env. Python writes `{port}` and closes. +- Or: Electron picks a free port and passes it via `--port`, skipping the + discovery dance. + +Second option is one line. + +Files: `api.py:1046-1058`, `electron/main.ts:81-116`. + +--- + +## P3 — Minor / style + +- `api.py:907, 910, 921, 924, 1013, 1016, 1019`: inline `import subprocess` + inside handlers. Move to module top. +- `api.py:595`: `return StatusResponse(success=ok)` after `raise HTTPException` + is unreachable — dead code. +- `profiles_storage.py:36`: `_safe_filename` accepts leading `.` → creates + hidden files. Prepend `profile_` or strip leading dots. +- `controllers.py:124-128`: two identical `guid = ... .ljust(32, "0")` + branches. +- `heroic.py:10-13`: `HEROIC_ROOTS` picks the first that exists. If a user + has both the native install and Flatpak, order determines winner silently. + Prefer whichever has a non-empty `GamesConfig/` or return both. +- `tool_check.py:65`: `@lru_cache(maxsize=32)` on `find_tool` means a user + installing MangoHud mid-session still sees "not installed" until restart. + Low frequency in practice; document it. +- `steam.py:89`: `break # Use first found` inside a loop that appends to + `paths` — the `break` skips the second libraryfolders.vdf even when the + first is empty. Move `break` inside the success branch. +- `fixes.py:61-68`: `_common` fixes are appended after app-specific fixes; + the UI has no way to distinguish. Consider a `scope: "common" | "app"` field. +- `api.py:329`: `FastAPI(title=..., version="0.8.8")` → see P0-2. +- `mangohud.py:215-218`: filename sanitization — see P1-1. +- `env_vars.py:60`: `.replace("\\", "\\\\").replace('"', '\\"')` followed by + a `"…"` wrap works but is fragile. Prefer `shlex.quote` for shell + compatibility with `environment.d` parsers. + +--- + +## Dependency hygiene + +Declared in `pyproject.toml`: + +```toml +dependencies = [ + "vdf>=1.2", + "fastapi>=0.115", + "uvicorn[standard]>=0.34", +] +``` + +Missing from declarations but imported or referenced: + +- `pydantic` (directly imported — see P0-3) +- `uvloop`, `httptools`, `watchfiles`, `yaml` (listed in `_vendor_compat._NATIVE_PACKAGES` but not depended on — dead list entries) + +No upper bound on `vdf`. The `vdf` package is sparsely maintained; pin to a +known-good range (`"vdf>=1.2,<4"`). + +--- + +## Packaging / runtime env + +### Vendoring script (`electron/scripts/vendor-python-deps.sh`) + +- Fine as long as we ship zero native deps (P0-1 option A). +- `python3 -m pip install -t "${TARGET}"` picks up whatever `python3` is on + the CI runner. The `actions/setup-python@v5` pin is correct, but document + that changing the CI runner Python version is a breaking change. +- The `.dist-info` pruning keeps `METADATA`, `top_level.txt`, `RECORD`. FastAPI + uses `importlib.metadata.version("fastapi")` at startup (for the `/docs` + render); test that we haven't broken that. + +### Electron `getPythonCommand` (`electron/main.ts:40-79`) + +- `EXTRA_PATH_DIRS` now covers Bazzite/SteamOS/NixOS — good. +- `env.PATH = \`${env.PATH}:${EXTRA_PATH_DIRS}\`` only runs when + `!env.PATH.includes("/var/usrlocal/bin")`. If PATH already has + `/var/usrlocal/bin` but nothing else from the list (unlikely but possible + on a weird base image), we skip the augmentation. Safer to always + deduplicate-and-merge. +- `PYTHONNOUSERSITE = ""` → see P0-1. + +--- + +## Suggested implementation order + +1. **P0-1** (drop native deps → switch to pure-Python stack) + **P0-2** + (single version source) + **P0-3** (declare pydantic) → cut **v0.8.12**. + This unblocks AppImage users on any Python. +2. **P1-2** (API token) + **P1-1** (path sanitization) → security hardening + patch, **v0.9.0**. +3. **P2-1** (tests for VDF, tool_check, env_vars, API smoke) and **P2-2** + (delete GTK app or isolate it) as cleanup before **v0.9.x**. +4. **P2-4** (split `api.py`) + **P2-3** (logging) once tests exist so the + refactor is safe. +5. **P1-3** (atomic VDF writes + Steam-running guard) — user-reported + corruption risk, schedule for **v0.9.x**. + +Everything in P3 and leftover P2 can be rolled into whichever PR touches +the file. + +--- + +## Appendix: file-by-file one-line assessment + +| File | LoC | State | +| --- | --- | --- | +| `__init__.py` | 3 | Version drift (P0-2) | +| `__main__.py` | 6 | Points at dead GTK app (P2-2) | +| `_vendor_compat.py` | 70 | Broken on read-only FS (P0-1) — delete once P0-1A lands | +| `api.py` | 1062 | Oversized, needs split (P2-4); version drift (P0-2) | +| `app.py` | 1053 | Dead GTK UI (P2-2) | +| `controllers.py` | 142 | GUID is fake (P1-5) | +| `display.py` | 174 | Clean | +| `env_vars.py` | 128 | Missing atomic write (P1-3) | +| `fixes.py` | 98 | Missing atomic write (P1-3) | +| `gamescope.py` | 66 | Returns unescaped string (P1-7) | +| `gpu.py` | 175 | `get_power_profiles` bug (P1-4) | +| `heroic.py` | 179 | Clean, cross-module private (P2-9) | +| `heroic_config.py` | 196 | Missing atomic write (P1-3), private import (P2-9) | +| `lutris.py` | 91 | Clean | +| `mangohud.py` | 229 | Filename sanitize gap (P1-1); missing atomic write (P1-3) | +| `prefix.py` | 132 | Duplicate `_dir_size` (P2-5); full-file read for DLL | +| `presets.py` | 56 | Clean | +| `profiles_storage.py` | 76 | Weak `_safe_filename` (P1-1); missing atomic write (P1-3) | +| `protontricks.py` | 84 | Clean | +| `saves.py` | 145 | Duplicate `_dir_size` (P2-5); no zip size cap | +| `shader_cache.py` | 66 | Duplicate `_dir_size` (P2-5) | +| `steam.py` | 201 | Dead constant (P1-6); `break` placement bug (P3) | +| `tool_check.py` | 93 | Clean — the healthy module to model others on | +| `vdf_config.py` | 122 | No atomic write; no Steam-running check (P1-3) | diff --git a/electron/main.ts b/electron/main.ts index 0027b5b..27330f4 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -2,6 +2,8 @@ import { app, BrowserWindow, ipcMain } from "electron"; import { ChildProcess, spawn } from "child_process"; import * as path from "path"; import * as http from "http"; +import * as net from "net"; +import * as crypto from "crypto"; let mainWindow: BrowserWindow | null = null; let pythonProcess: ChildProcess | null = null; @@ -9,10 +11,32 @@ let apiPort: number | null = null; let staticServer: http.Server | null = null; let staticRendererPort: number | null = null; +// Per-launch bearer token. Both the Python backend and Electron see it via +// PROTONSHIFT_API_TOKEN, and every renderer-originated fetch attaches it. +const apiToken = crypto.randomBytes(32).toString("base64url"); + const isDev = !app.isPackaged; import * as fs from "fs"; +function pickFreePort(): Promise { + return new Promise((resolve, reject) => { + const srv = net.createServer(); + srv.unref(); + srv.on("error", reject); + srv.listen(0, "127.0.0.1", () => { + const addr = srv.address(); + if (addr && typeof addr === "object") { + const port = addr.port; + srv.close(() => resolve(port)); + } else { + srv.close(); + reject(new Error("Failed to bind ephemeral port")); + } + }); + }); +} + function findPythonCmd(projectRoot: string): string { // Prefer the project venv if it exists (dev workflow) const candidates = [ @@ -37,7 +61,7 @@ const EXTRA_PATH_DIRS = [ "/run/current-system/sw/bin", // NixOS ].join(":"); -function getPythonCommand(): { cmd: string; args: string[]; env: NodeJS.ProcessEnv } { +function getPythonCommand(port: number): { cmd: string; args: string[]; env: NodeJS.ProcessEnv } { const env = { ...process.env }; // Immutable distros (Bazzite, SteamOS, Fedora Atomic) and AppImage // wrappers can strip PATH entries. Ensure common locations are present. @@ -45,13 +69,19 @@ function getPythonCommand(): { cmd: string; args: string[]; env: NodeJS.ProcessE env.PATH = `${env.PATH}:${EXTRA_PATH_DIRS}`; } + // Hand the backend the auth token. compare_digest on the Python side will + // reject any other Authorization header. + env.PROTONSHIFT_API_TOKEN = apiToken; + + const portArg = String(port); + if (isDev) { const projectRoot = path.resolve(__dirname, "..", ".."); const srcDir = path.join(projectRoot, "src"); env.PYTHONPATH = srcDir + (env.PYTHONPATH ? `:${env.PYTHONPATH}` : ""); return { cmd: findPythonCmd(projectRoot), - args: ["-m", "game_setup_hub.api", "--port", "0"], + args: ["-m", "game_setup_hub.api", "--port", portArg], env, }; } @@ -68,19 +98,26 @@ function getPythonCommand(): { cmd: string; args: string[]; env: NodeJS.ProcessE pyPathParts.push(env.PYTHONPATH); } env.PYTHONPATH = pyPathParts.join(":"); - // Ensure system site-packages are available as fallback for native - // extensions (.so) that may not match the vendored Python version. - env.PYTHONNOUSERSITE = ""; + // CPython treats PYTHONNOUSERSITE as truthy if the variable is *present*, + // even when empty. Setting it to "" disables user site-packages — the + // opposite of what we want. Unset it so user site-packages stay enabled + // and `_vendor_compat` can fall back to system pydantic_core if the + // vendored .so is ABI-incompatible with the runtime Python. + delete env.PYTHONNOUSERSITE; return { cmd: "python3", - args: ["-m", "game_setup_hub.api", "--port", "0"], + args: ["-m", "game_setup_hub.api", "--port", portArg], env, }; } -function startPython(): Promise { +async function startPython(): Promise { + // Pick the port on the Node side so we know it before spawning. Avoids the + // old stdout-regex dance, and we can pass it straight to `--port`. + const port = await pickFreePort(); + const { cmd, args, env } = getPythonCommand(port); + return new Promise((resolve, reject) => { - const { cmd, args, env } = getPythonCommand(); pythonProcess = spawn(cmd, args, { env, stdio: ["pipe", "pipe", "pipe"] }); const timeout = setTimeout(() => { @@ -88,12 +125,8 @@ function startPython(): Promise { }, 15000); pythonProcess.stdout?.on("data", (data: Buffer) => { - const output = data.toString(); - const match = output.match(/PORT:(\d+)/); - if (match) { - clearTimeout(timeout); - resolve(parseInt(match[1], 10)); - } + // Stdout is informational only now; readiness comes from /health. + console.log("[python]", data.toString().trim()); }); pythonProcess.stderr?.on("data", (data: Buffer) => { @@ -112,6 +145,18 @@ function startPython(): Promise { } pythonProcess = null; }); + + // Resolve as soon as /health responds. waitForHealth handles retries. + waitForHealth(port).then( + () => { + clearTimeout(timeout); + resolve(port); + }, + (err) => { + clearTimeout(timeout); + reject(err); + }, + ); }); } @@ -301,7 +346,11 @@ ipcMain.handle("api-fetch", async (_event, urlPath: string, init?: RequestInit) try { const response = await fetch(url, { ...init, - headers: { "Content-Type": "application/json", ...init?.headers }, + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiToken}`, + ...init?.headers, + }, }); const body = await response.text(); return { @@ -321,7 +370,6 @@ ipcMain.handle("api-fetch", async (_event, urlPath: string, init?: RequestInit) app.on("ready", async () => { try { apiPort = await startPython(); - await waitForHealth(apiPort); if (!isDev) { const outDir = path.join(__dirname, "..", "renderer", "out"); await startStaticRendererServer(outDir); diff --git a/electron/package.json b/electron/package.json index c2b68bf..6084a01 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,6 @@ { "name": "protonshift", - "version": "0.8.11", + "version": "0.9.0", "description": "Linux game configuration toolkit", "main": "dist/main.js", "scripts": { @@ -56,7 +56,7 @@ { "from": "../src", "to": "python/src", - "filter": ["**/*.py", "**/*.css"] + "filter": ["**/*.py", "**/data/*.json"] }, { "from": "../pyproject.toml", diff --git a/electron/python-runtime-requirements.txt b/electron/python-runtime-requirements.txt index 6e318a9..1a86c8c 100644 --- a/electron/python-runtime-requirements.txt +++ b/electron/python-runtime-requirements.txt @@ -1,4 +1,11 @@ # Bundled into the AppImage/deb for packaged runs (see scripts/vendor-python-deps.sh). +# +# Keep native (.so) deps to a minimum so the bundle survives running on a +# different Python minor version. Today the only unavoidable native dep is +# `pydantic_core` (transitive from FastAPI). `_vendor_compat.py` falls back +# to system site-packages when the vendored .so is ABI-incompatible. fastapi>=0.115,<1 -uvicorn[standard]>=0.34,<1 -vdf>=1.2 +pydantic>=2.0,<3 +# NOT [standard] — that pulls uvloop, httptools, watchfiles (3 more .so files). +uvicorn>=0.34,<1 +vdf>=1.2,<4 diff --git a/pyproject.toml b/pyproject.toml index 8460078..95e0862 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,25 +4,45 @@ build-backend = "setuptools.build_meta" [project] name = "protonshift" -version = "0.8.11" description = "Linux game configuration toolkit: GPU, launch options, Proton, env vars" readme = "README.md" requires-python = ">=3.12" +dynamic = ["version"] dependencies = [ - "vdf>=1.2", - "fastapi>=0.115", - "uvicorn[standard]>=0.34", + "vdf>=1.2,<4", + "fastapi>=0.115,<1", + "pydantic>=2.0,<3", + # Use bare uvicorn (not [standard]). The "standard" extras pull uvloop, + # httptools, and watchfiles — three more native extensions that break + # AppImage portability. Pure-asyncio + h11 is plenty for localhost. + "uvicorn>=0.34,<1", ] [project.optional-dependencies] -dev = ["ruff", "pyright"] +dev = ["ruff", "pyright", "pytest", "pytest-asyncio", "httpx"] [project.scripts] -protonshift = "game_setup_hub.app:main" protonshift-api = "game_setup_hub.api:cli" [tool.setuptools.packages.find] where = ["src"] +[tool.setuptools.dynamic] +version = { attr = "game_setup_hub.__version__" } + [tool.setuptools.package-data] -game_setup_hub = ["theme.css"] +game_setup_hub = ["data/*.json"] + +[tool.ruff] +line-length = 110 +target-version = "py312" + +[tool.ruff.lint] +select = ["E", "F", "W", "I", "B", "UP", "SIM"] +# SIM105: try/except/pass with narrow exception is clearer than contextlib.suppress. +# SIM102: nested-if collapse hurts readability when guards differ in intent. +ignore = ["E501", "SIM105", "SIM102"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +asyncio_mode = "auto" diff --git a/pyrightconfig.json b/pyrightconfig.json index b47f69f..3df4c54 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -1,6 +1,7 @@ { - "include": ["src"], - "exclude": ["src/game_setup_hub/app.py"], + "include": ["src", "tests"], + "venvPath": ".", + "venv": ".venv", "pythonVersion": "3.12", "typeCheckingMode": "standard" } diff --git a/src/game_setup_hub/__init__.py b/src/game_setup_hub/__init__.py index f6ceb2f..52c81e8 100644 --- a/src/game_setup_hub/__init__.py +++ b/src/game_setup_hub/__init__.py @@ -1,3 +1,3 @@ -"""ProtonShift — game configuration for Pop!_OS, Ubuntu, and related distros.""" +"""ProtonShift — Linux game configuration toolkit.""" -__version__ = "0.8.8" +__version__ = "0.9.0" diff --git a/src/game_setup_hub/__main__.py b/src/game_setup_hub/__main__.py deleted file mode 100644 index 693d75c..0000000 --- a/src/game_setup_hub/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Allow running as python -m game_setup_hub.""" - -from .app import main - -if __name__ == "__main__": - main() diff --git a/src/game_setup_hub/_vendor_compat.py b/src/game_setup_hub/_vendor_compat.py index 690676b..bdd8435 100644 --- a/src/game_setup_hub/_vendor_compat.py +++ b/src/game_setup_hub/_vendor_compat.py @@ -1,70 +1,140 @@ -"""Ensure vendored native extensions are compatible with the running Python. - -When the app is packaged (AppImage/deb/rpm), Python dependencies are vendored -into a directory added to PYTHONPATH. Native extensions (.so) are ABI-locked -to the Python version used at build time. If the user runs a different Python -minor version, those .so files won't load. - -This module detects the mismatch early and removes incompatible vendored -packages from sys.path so Python falls back to system site-packages. +"""Make vendored native extensions tolerate Python minor-version drift. + +When the app is packaged (AppImage / .deb / .rpm) Python dependencies are +vendored into a directory that gets prepended to ``sys.path``. Native +extensions (``.so``) are ABI-locked to the Python build that produced them +(``cp312-…``). If the user is running a different Python minor version, +those ``.so`` files cannot load and importing the package raises +``ImportError`` — even when a perfectly good system copy exists further +down ``sys.path``. + +The previous strategy was to ``shutil.rmtree`` the offending vendor dirs. +That is silently a no-op on read-only squashfs (i.e. inside an AppImage), +which is exactly the deployment we needed it to work in. + +This module instead resolves the conflict by mutating ``sys.path`` — +which lives in process memory and works regardless of filesystem +permissions: + +1. Detect whether any vendored native package has an ABI-incompatible + ``.so`` for the running interpreter. +2. If so, prepend the standard system + user site-packages directories + so the system copy of those packages wins import resolution. The + vendor dir stays for everything else (``vdf``, ``fastapi``, …). + +This file is imported as the very first line of :mod:`game_setup_hub.api._app`, +before any third-party package is touched, so the path tweak takes effect +before pydantic/FastAPI try to load ``pydantic_core``. """ from __future__ import annotations +import logging +import site import sys import sysconfig from pathlib import Path -_NATIVE_PACKAGES = [ +log = logging.getLogger("protonshift.vendor_compat") + +# Native extensions actually present in our vendor set. Anything not in this +# list is either pure-Python or not a declared dependency. +_NATIVE_PACKAGES: tuple[str, ...] = ( "pydantic_core", - "uvloop", - "httptools", - "watchfiles", - "yaml", # PyYAML -] +) _SOABI = sysconfig.get_config_var("SOABI") or "" def _has_compatible_so(pkg_dir: Path) -> bool: - """Check if a vendored package dir has .so files matching this Python.""" + """True if ``pkg_dir`` is pure Python or has a ``.so`` for our SOABI.""" so_files = list(pkg_dir.glob("*.so")) if not so_files: - return True # pure-Python package, always compatible + return True return any(_SOABI in f.name for f in so_files) -def fixup_vendor_path() -> None: - """Remove vendored native-extension dirs that are ABI-incompatible.""" - vendor_dirs = [ - p for p in sys.path - if "vendor" in p and Path(p).is_dir() - ] - if not vendor_dirs: - return +def _vendor_dirs() -> list[Path]: + """Return the vendor directories currently on ``sys.path``.""" + out: list[Path] = [] + for entry in sys.path: + if not entry: + continue + p = Path(entry) + if "vendor" in p.parts and p.is_dir(): + out.append(p) + return out - for vendor_dir in vendor_dirs: - vp = Path(vendor_dir) - for pkg_name in _NATIVE_PACKAGES: - pkg_dir = vp / pkg_name - if pkg_dir.is_dir() and not _has_compatible_so(pkg_dir): - _remove_vendored_package(vp, pkg_name) +def _has_incompatible_native_pkg(vendor_dirs: list[Path]) -> bool: + for vd in vendor_dirs: + for pkg in _NATIVE_PACKAGES: + pkg_dir = vd / pkg + if pkg_dir.is_dir() and not _has_compatible_so(pkg_dir): + log.warning( + "Vendored %s has no .so matching %r; will prefer system site-packages.", + pkg, _SOABI, + ) + return True + return False + + +def _system_site_dirs() -> list[str]: + """Best-effort list of system + user site-packages.""" + seen: set[str] = set() + out: list[str] = [] + candidates: list[str] = [] + try: + candidates.extend(site.getsitepackages()) + except (AttributeError, OSError): + pass + user = "" + try: + user = site.getusersitepackages() + except (AttributeError, OSError): + pass + if user: + candidates.append(user) + for c in candidates: + if c and c not in seen and Path(c).is_dir(): + seen.add(c) + out.append(c) + return out -def _remove_vendored_package(vendor_dir: Path, pkg_name: str) -> None: - """Remove a single incompatible package from the vendor dir at runtime.""" - import shutil - - pkg_dir = vendor_dir / pkg_name - if pkg_dir.exists(): - shutil.rmtree(pkg_dir, ignore_errors=True) - for dist_info in vendor_dir.glob(f"{pkg_name}-*.dist-info"): - shutil.rmtree(dist_info, ignore_errors=True) +def fixup_vendor_path() -> None: + """Reorder ``sys.path`` when vendored native extensions don't match. + + On match, this is a no-op. On mismatch, the system + user site-packages + directories are inserted at the front of ``sys.path`` so the system copy + of any conflicting native package is found before the broken vendored + one. The filesystem is never touched. + """ + vendor_dirs = _vendor_dirs() + if not vendor_dirs: + return + if not _has_incompatible_native_pkg(vendor_dirs): + return - # Clear any cached import state - if pkg_name in sys.modules: - del sys.modules[pkg_name] + inserted: list[str] = [] + for sp in _system_site_dirs(): + if sp not in sys.path: + sys.path.insert(0, sp) + inserted.append(sp) + + if inserted: + log.warning( + "Inserted system site-packages at the head of sys.path for ABI fallback: %s", + inserted, + ) + else: + log.warning( + "ABI mismatch detected for vendored native extensions but no system " + "site-packages were available. Imports of %s may fail. Install the " + "package system-wide (e.g. `python3-pydantic`) or run with the " + "interpreter the AppImage was built against.", + ", ".join(_NATIVE_PACKAGES), + ) fixup_vendor_path() diff --git a/src/game_setup_hub/api.py b/src/game_setup_hub/api.py deleted file mode 100644 index 16c802d..0000000 --- a/src/game_setup_hub/api.py +++ /dev/null @@ -1,1062 +0,0 @@ -"""FastAPI backend exposing ProtonShift logic over localhost HTTP.""" - -from __future__ import annotations - -import game_setup_hub._vendor_compat # noqa: F401 # must be first - -import argparse -import asyncio -import socket -from pathlib import Path -from typing import Any - -from fastapi import FastAPI, HTTPException -from fastapi.middleware.cors import CORSMiddleware -from pydantic import BaseModel - -from .env_vars import ENV_PRESETS, read_gaming_env, write_gaming_env -from .gpu import get_current_power_profile, get_gpu_info, get_power_profiles, set_power_profile -from .heroic import HeroicGame, discover_heroic_games -from .heroic_config import ( - get_heroic_game_config, - list_heroic_wine_versions, - set_heroic_launch_options, - set_heroic_toggles, - set_heroic_wine_version, -) -from .lutris import LutrisGame, discover_lutris_games -from .presets import LAUNCH_PRESETS -from .profiles_storage import ( - ApplicationProfile, - delete_profile, - list_profiles, - load_profile, - save_profile, -) -from .controllers import get_controllers, get_sdl_mapping -from .display import get_monitors, get_session_type, set_resolution -from .fixes import add_user_fix, get_fixes -from .gamescope import GamescopeOptions, build_gamescope_cmd, is_gamescope_available -from .mangohud import ( - MANGOHUD_PARAMS, - MANGOHUD_PRESETS, - get_per_game_config_path, - is_mangohud_available, - list_per_game_configs, - read_mangohud_config, - write_mangohud_config, -) -from .prefix import delete_prefix as _delete_prefix, get_prefix_info -from .saves import ( - backup_saves as _backup_saves, - find_save_paths, - list_backups, - restore_backup as _restore_backup, -) -from .shader_cache import ( - clear_shader_cache as _clear_shader_cache, - get_shader_cache_info, - get_total_shader_cache_size, -) -from .protontricks import COMMON_VERBS, is_protontricks_available, run_protontricks -from .steam import ( - SteamGame, - discover_games, - get_available_proton_tools, - get_localconfig_path, - is_steam_running, -) -from .vdf_config import get_compat_tool, get_launch_options, set_compat_tool, set_launch_options - -# --------------------------------------------------------------------------- -# Pydantic response models (JSON-safe mirrors of existing dataclasses) -# --------------------------------------------------------------------------- - - -class SteamGameResponse(BaseModel): - app_id: str - name: str - install_dir: str - last_played: int - library_path: str - compatdata_path: str | None - has_compatdata: bool - install_path: str | None - source: str = "steam" - - -class HeroicGameResponse(BaseModel): - app_id: str - name: str - store: str - install_path: str | None - prefix_path: str | None - source: str = "heroic" - - -class LutrisGameResponse(BaseModel): - app_id: str - name: str - install_path: str | None - prefix_path: str | None - source: str = "lutris" - - -class GPUInfoResponse(BaseModel): - name: str - driver: str - vram_mb: int | None - temperature: float | None - - -class SystemInfoResponse(BaseModel): - gpus: list[GPUInfoResponse] - power_profiles: list[str] - current_power_profile: str | None - - -class LaunchPresetResponse(BaseModel): - name: str - value: str - description: str - install_command: str - install_url: str - is_installed: bool - - -class ProfileResponse(BaseModel): - name: str - launch_options: str - compat_tool: str - env_vars: dict[str, str] - power_profile: str - - -class ProfileCreateRequest(BaseModel): - name: str - launch_options: str = "" - compat_tool: str = "" - env_vars: dict[str, str] = {} - power_profile: str = "" - - -class LaunchOptionsRequest(BaseModel): - options: str - - -class CompatToolRequest(BaseModel): - tool_name: str - - -class EnvVarsRequest(BaseModel): - vars: dict[str, str] - - -class PowerProfileRequest(BaseModel): - profile: str - - -class ProtontricksRequest(BaseModel): - verb: str | None = None - - -class PrefixInfoResponse(BaseModel): - path: str - exists: bool - size_bytes: int = 0 - size_human: str = "" - created: str = "" - dxvk_version: str = "" - vkd3d_version: str = "" - - -class ControllerResponse(BaseModel): - id: str - name: str - device_path: str - controller_type: str - vendor_id: str = "" - product_id: str = "" - - -class MonitorResponse(BaseModel): - name: str - connected: bool - resolution: str - refresh_rate: str - primary: bool - position: str - - -class SetResolutionRequest(BaseModel): - monitor: str - width: int - height: int - refresh: float = 0 - - -class SaveLocationResponse(BaseModel): - path: str - exists: bool - size_bytes: int = 0 - size_human: str = "" - label: str = "" - - -class BackupInfoResponse(BaseModel): - path: str - filename: str - size_bytes: int - size_human: str - created: str - - -class BackupRequest(BaseModel): - paths: list[str] - - -class RestoreRequest(BaseModel): - backup_path: str - target_dir: str - - -class MangoHudConfigRequest(BaseModel): - config: dict[str, str] - - -class GameFixResponse(BaseModel): - title: str - description: str - fix_type: str - key: str - value: str - source: str - - -class GameFixCreateRequest(BaseModel): - title: str - description: str = "" - fix_type: str = "env" - key: str = "" - value: str = "" - - -class GamescopeBuildRequest(BaseModel): - output_width: int = 0 - output_height: int = 0 - game_width: int = 0 - game_height: int = 0 - fps_limit: int = 0 - fsr: bool = False - fsr_sharpness: int = 5 - integer_scale: bool = False - hdr: bool = False - nested: bool = True - borderless: bool = True - fullscreen: bool = True - extra_args: str = "" - - -class ShaderCacheResponse(BaseModel): - app_id: str - path: str - exists: bool - size_bytes: int = 0 - size_human: str = "" - - -class OpenPathRequest(BaseModel): - path: str - - -class OpenUriRequest(BaseModel): - uri: str - - -class HeroicWineVersionResponse(BaseModel): - name: str - bin: str - wine_type: str - - -class HeroicGameConfigResponse(BaseModel): - app_id: str - exists: bool - wine_prefix: str = "" - wine_version: HeroicWineVersionResponse = HeroicWineVersionResponse(name="", bin="", wine_type="") - other_options: str = "" - enable_esync: bool = False - enable_fsync: bool = False - auto_install_dxvk: bool = True - auto_install_vkd3d: bool = False - show_fps: bool = False - show_mangohud: bool = False - use_game_mode: bool = False - nvidia_prime: bool = False - saves_path: str = "" - target_exe: str = "" - - -class HeroicLaunchOptionsRequest(BaseModel): - options: str - - -class HeroicWineVersionRequest(BaseModel): - name: str - bin: str - wine_type: str - - -class HeroicTogglesRequest(BaseModel): - enable_esync: bool | None = None - enable_fsync: bool | None = None - auto_install_dxvk: bool | None = None - auto_install_vkd3d: bool | None = None - show_mangohud: bool | None = None - use_game_mode: bool | None = None - nvidia_prime: bool | None = None - - -class StatusResponse(BaseModel): - success: bool - message: str = "" - - -# --------------------------------------------------------------------------- -# App setup -# --------------------------------------------------------------------------- - -app = FastAPI(title="ProtonShift API", version="0.8.8") -app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]) - -# Locks for serializing writes to shared resources -_vdf_lock = asyncio.Lock() -_env_lock = asyncio.Lock() -_profiles_lock = asyncio.Lock() -_mangohud_lock = asyncio.Lock() -_heroic_lock = asyncio.Lock() - -# Cached steam root + localconfig path (discovered once) -_steam_root: Path | None = None -_config_path: Path | None = None -_steam_discovered = False - - -def _ensure_steam() -> None: - global _steam_root, _config_path, _steam_discovered - if _steam_discovered: - return - _steam_root, _ = discover_games() - if _steam_root: - _config_path = get_localconfig_path(_steam_root) - _steam_discovered = True - - -def _steam_game_to_response(g: SteamGame) -> SteamGameResponse: - return SteamGameResponse( - app_id=g.app_id, - name=g.name, - install_dir=g.install_dir, - last_played=g.last_played, - library_path=str(g.library_path), - compatdata_path=str(g.compatdata_path) if g.compatdata_path else None, - has_compatdata=g.has_compatdata, - install_path=str(g.install_path) if g.install_path else None, - ) - - -def _heroic_game_to_response(g: HeroicGame) -> HeroicGameResponse: - return HeroicGameResponse( - app_id=g.app_id, - name=g.name, - store=g.store, - install_path=str(g.install_path) if g.install_path else None, - prefix_path=str(g.prefix_path) if g.prefix_path else None, - ) - - -def _lutris_game_to_response(g: LutrisGame) -> LutrisGameResponse: - return LutrisGameResponse( - app_id=g.app_id, - name=g.name, - install_path=str(g.install_path) if g.install_path else None, - prefix_path=str(g.prefix_path) if g.prefix_path else None, - ) - - -# --------------------------------------------------------------------------- -# Endpoints -# --------------------------------------------------------------------------- - - -@app.get("/health") -async def health() -> dict[str, str]: - return {"status": "ok"} - - -@app.get("/games") -async def list_games() -> dict[str, Any]: - _ensure_steam() - _, steam_games = discover_games() - heroic_games = discover_heroic_games() - lutris_games = discover_lutris_games() - return { - "steam": [_steam_game_to_response(g) for g in steam_games], - "heroic": [_heroic_game_to_response(g) for g in heroic_games], - "lutris": [_lutris_game_to_response(g) for g in lutris_games], - "steam_running": is_steam_running(), - } - - -@app.get("/games/{app_id}/launch-options") -async def get_game_launch_options(app_id: str) -> dict[str, str]: - _ensure_steam() - if not _config_path: - return {"options": ""} - try: - opts = get_launch_options(_config_path, app_id) - except Exception: - opts = "" - return {"options": opts} - - -@app.put("/games/{app_id}/launch-options") -async def update_launch_options(app_id: str, body: LaunchOptionsRequest) -> StatusResponse: - _ensure_steam() - if not _config_path: - raise HTTPException(status_code=404, detail="Steam localconfig.vdf not found") - async with _vdf_lock: - ok = set_launch_options(_config_path, app_id, body.options) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write localconfig.vdf") - return StatusResponse(success=True) - - -@app.get("/games/{app_id}/compat-tool") -async def get_game_compat_tool(app_id: str) -> dict[str, str]: - _ensure_steam() - if not _config_path: - return {"tool": ""} - try: - tool = get_compat_tool(_config_path, app_id) - except Exception: - tool = "" - return {"tool": tool} - - -@app.put("/games/{app_id}/compat-tool") -async def update_compat_tool(app_id: str, body: CompatToolRequest) -> StatusResponse: - _ensure_steam() - if not _config_path: - raise HTTPException(status_code=404, detail="Steam localconfig.vdf not found") - async with _vdf_lock: - ok = set_compat_tool(_config_path, app_id, body.tool_name) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write localconfig.vdf") - return StatusResponse(success=True) - - -@app.get("/games/{app_id}/proton-tools") -async def list_proton_tools(app_id: str) -> dict[str, Any]: - _ensure_steam() - tools = get_available_proton_tools(_steam_root) - current = "" - if _config_path: - try: - current = get_compat_tool(_config_path, app_id) - except Exception: - pass - return {"tools": tools, "current": current} - - -@app.post("/games/{app_id}/protontricks") -async def trigger_protontricks(app_id: str, body: ProtontricksRequest) -> StatusResponse: - if not is_protontricks_available(): - raise HTTPException(status_code=404, detail="Protontricks not installed") - ok, msg = run_protontricks(app_id, body.verb) - if not ok: - raise HTTPException(status_code=500, detail=msg) - return StatusResponse(success=True, message=msg) - - -@app.get("/protontricks/verbs") -async def list_protontricks_verbs() -> dict[str, Any]: - return { - "available": is_protontricks_available(), - "verbs": [{"id": v[0], "label": v[1]} for v in COMMON_VERBS], - } - - -@app.get("/presets") -async def list_presets() -> list[LaunchPresetResponse]: - return [ - LaunchPresetResponse( - name=p.name, - value=p.value, - description=p.description, - install_command=p.install_command, - install_url=p.install_url, - is_installed=p.is_installed(), - ) - for p in LAUNCH_PRESETS - ] - - -@app.get("/env-presets") -async def list_env_presets() -> dict[str, dict[str, str]]: - return ENV_PRESETS - - -@app.get("/env-vars") -async def get_env_vars() -> dict[str, str]: - try: - return read_gaming_env() - except Exception: - return {} - - -@app.put("/env-vars") -async def update_env_vars(body: EnvVarsRequest) -> StatusResponse: - async with _env_lock: - ok = write_gaming_env(body.vars) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write env config") - return StatusResponse(success=True) - - -@app.get("/system") -async def system_info() -> SystemInfoResponse: - try: - gpus = get_gpu_info() - except Exception: - gpus = [] - try: - profiles = get_power_profiles() - except Exception: - profiles = [] - try: - current = get_current_power_profile() - except Exception: - current = None - return SystemInfoResponse( - gpus=[GPUInfoResponse(name=g.name, driver=g.driver, vram_mb=g.vram_mb, temperature=g.temperature) for g in gpus], - power_profiles=profiles, - current_power_profile=current, - ) - - -@app.put("/system/power-profile") -async def update_power_profile(body: PowerProfileRequest) -> StatusResponse: - ok, msg = set_power_profile(body.profile) - return StatusResponse(success=ok, message=msg) - - -@app.get("/profiles") -async def list_all_profiles() -> list[str]: - return list_profiles() - - -@app.get("/profiles/{name}") -async def get_profile(name: str) -> ProfileResponse: - p = load_profile(name) - if not p: - raise HTTPException(status_code=404, detail="Profile not found") - return ProfileResponse( - name=p.name, - launch_options=p.launch_options, - compat_tool=p.compat_tool, - env_vars=p.env_vars, - power_profile=p.power_profile, - ) - - -@app.post("/profiles") -async def create_profile(body: ProfileCreateRequest) -> StatusResponse: - profile = ApplicationProfile( - name=body.name, - launch_options=body.launch_options, - compat_tool=body.compat_tool, - env_vars=body.env_vars, - power_profile=body.power_profile, - ) - async with _profiles_lock: - ok = save_profile(profile) - if not ok: - raise HTTPException(status_code=500, detail="Failed to save profile") - return StatusResponse(success=True) - - -@app.delete("/profiles/{name}") -async def remove_profile(name: str) -> StatusResponse: - async with _profiles_lock: - ok = delete_profile(name) - if not ok: - raise HTTPException(status_code=404, detail="Profile not found or could not be deleted") - return StatusResponse(success=ok) - - -def _human_size(size_bytes: int) -> str: - for unit in ("B", "KB", "MB", "GB", "TB"): - if abs(size_bytes) < 1024: - return f"{size_bytes:.1f} {unit}" - size_bytes /= 1024 # type: ignore[assignment] - return f"{size_bytes:.1f} PB" - - -@app.get("/controllers") -async def list_controllers() -> list[ControllerResponse]: - ctrls = get_controllers() - return [ - ControllerResponse( - id=c.id, - name=c.name, - device_path=c.device_path, - controller_type=c.controller_type, - vendor_id=c.vendor_id, - product_id=c.product_id, - ) - for c in ctrls - ] - - -@app.get("/controllers/{controller_id}/sdl-mapping") -async def controller_sdl_mapping(controller_id: str) -> dict[str, str]: - ctrls = get_controllers() - ctrl = next((c for c in ctrls if c.id == controller_id), None) - if not ctrl: - raise HTTPException(status_code=404, detail="Controller not found") - mapping = get_sdl_mapping(ctrl) - return {"mapping": mapping} - - -@app.get("/display/monitors") -async def list_monitors() -> dict[str, Any]: - session = get_session_type() - monitors = get_monitors() - return { - "session_type": session, - "monitors": [ - MonitorResponse( - name=m.name, - connected=m.connected, - resolution=m.resolution, - refresh_rate=m.refresh_rate, - primary=m.primary, - position=m.position, - ) - for m in monitors - ], - } - - -@app.put("/display/resolution") -async def update_resolution(body: SetResolutionRequest) -> StatusResponse: - ok = set_resolution(body.monitor, body.width, body.height, body.refresh) - if not ok: - raise HTTPException(status_code=500, detail="Failed to set resolution") - return StatusResponse(success=True, message=f"Set {body.monitor} to {body.width}x{body.height}") - - -@app.get("/games/{app_id}/saves") -async def game_saves(app_id: str, prefix_path: str | None = None) -> list[SaveLocationResponse]: - prefix = prefix_path - if not prefix: - _ensure_steam() - _, steam_games = discover_games() - game = next((g for g in steam_games if g.app_id == app_id), None) - prefix = str(game.compatdata_path) if game and game.compatdata_path else None - locations = find_save_paths(app_id, prefix) - return [ - SaveLocationResponse( - path=loc.path, - exists=loc.exists, - size_bytes=loc.size_bytes, - size_human=_human_size(loc.size_bytes), - label=loc.label, - ) - for loc in locations - ] - - -@app.post("/games/{app_id}/saves/backup") -async def backup_game_saves(app_id: str, body: BackupRequest) -> dict[str, Any]: - result = _backup_saves(app_id, body.paths) - if not result: - raise HTTPException(status_code=500, detail="Failed to create backup") - return {"path": result} - - -@app.get("/games/{app_id}/saves/backups") -async def list_game_backups(app_id: str) -> list[BackupInfoResponse]: - backups = list_backups(app_id) - return [ - BackupInfoResponse( - path=b.path, - filename=b.filename, - size_bytes=b.size_bytes, - size_human=_human_size(b.size_bytes), - created=b.created, - ) - for b in backups - ] - - -@app.post("/games/{app_id}/saves/restore") -async def restore_game_saves(app_id: str, body: RestoreRequest) -> StatusResponse: - ok = _restore_backup(body.backup_path, body.target_dir) - if not ok: - raise HTTPException(status_code=500, detail="Failed to restore backup") - return StatusResponse(success=True, message="Backup restored") - - -@app.get("/mangohud/available") -async def mangohud_available() -> dict[str, bool]: - return {"available": is_mangohud_available()} - - -@app.get("/mangohud/config") -async def get_mangohud_config() -> dict[str, Any]: - return { - "config": read_mangohud_config(), - "params": MANGOHUD_PARAMS, - } - - -@app.put("/mangohud/config") -async def update_mangohud_config(body: MangoHudConfigRequest) -> StatusResponse: - async with _mangohud_lock: - ok = write_mangohud_config(body.config) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write MangoHud config") - return StatusResponse(success=True) - - -@app.get("/mangohud/presets") -async def get_mangohud_presets() -> dict[str, dict[str, str]]: - return MANGOHUD_PRESETS - - -@app.get("/mangohud/per-game") -async def list_mangohud_per_game() -> list[dict[str, str]]: - """List all existing per-game MangoHud config files.""" - return list_per_game_configs() - - -@app.get("/mangohud/per-game/{game_name}") -async def get_mangohud_per_game_config(game_name: str) -> dict[str, Any]: - """Read a per-game MangoHud config.""" - conf_path = get_per_game_config_path(game_name) - return { - "path": str(conf_path), - "exists": conf_path.exists(), - "config": read_mangohud_config(conf_path) if conf_path.exists() else {}, - "params": MANGOHUD_PARAMS, - } - - -@app.put("/mangohud/per-game/{game_name}") -async def update_mangohud_per_game_config( - game_name: str, body: MangoHudConfigRequest -) -> StatusResponse: - """Write a per-game MangoHud config.""" - conf_path = get_per_game_config_path(game_name) - async with _mangohud_lock: - ok = write_mangohud_config(body.config, conf_path) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write per-game MangoHud config") - return StatusResponse(success=True) - - -@app.get("/games/{app_id}/fixes") -async def list_game_fixes(app_id: str) -> list[GameFixResponse]: - fixes = get_fixes(app_id) - return [ - GameFixResponse( - title=f.title, - description=f.description, - fix_type=f.fix_type, - key=f.key, - value=f.value, - source=f.source, - ) - for f in fixes - ] - - -@app.post("/games/{app_id}/fixes") -async def create_game_fix(app_id: str, body: GameFixCreateRequest) -> StatusResponse: - ok = add_user_fix( - app_id=app_id, - title=body.title, - description=body.description, - fix_type=body.fix_type, - key=body.key, - value=body.value, - ) - if not ok: - raise HTTPException(status_code=500, detail="Failed to save fix") - return StatusResponse(success=True) - - -@app.get("/gamescope/available") -async def gamescope_available() -> dict[str, bool]: - return {"available": is_gamescope_available()} - - -@app.post("/gamescope/build-cmd") -async def gamescope_build(body: GamescopeBuildRequest) -> dict[str, str]: - opts = GamescopeOptions( - output_width=body.output_width, - output_height=body.output_height, - game_width=body.game_width, - game_height=body.game_height, - fps_limit=body.fps_limit, - fsr=body.fsr, - fsr_sharpness=body.fsr_sharpness, - integer_scale=body.integer_scale, - hdr=body.hdr, - nested=body.nested, - borderless=body.borderless, - fullscreen=body.fullscreen, - extra_args=body.extra_args, - ) - return {"command": build_gamescope_cmd(opts)} - - -@app.get("/games/{app_id}/shader-cache") -async def game_shader_cache(app_id: str) -> ShaderCacheResponse: - _ensure_steam() - if not _steam_root: - return ShaderCacheResponse(app_id=app_id, path="", exists=False) - info = get_shader_cache_info(_steam_root, app_id) - return ShaderCacheResponse( - app_id=app_id, - path=info.path, - exists=info.exists, - size_bytes=info.size_bytes, - size_human=_human_size(info.size_bytes), - ) - - -@app.delete("/games/{app_id}/shader-cache") -async def clear_game_shader_cache(app_id: str) -> StatusResponse: - _ensure_steam() - if not _steam_root: - raise HTTPException(status_code=404, detail="Steam root not found") - ok = _clear_shader_cache(_steam_root, app_id) - if not ok: - raise HTTPException(status_code=500, detail="Failed to clear shader cache") - return StatusResponse(success=True, message="Shader cache cleared") - - -@app.get("/shader-cache/total") -async def total_shader_cache() -> dict[str, Any]: - _ensure_steam() - if not _steam_root: - return {"size_bytes": 0, "size_human": "0.0 B"} - total = get_total_shader_cache_size(_steam_root) - return {"size_bytes": total, "size_human": _human_size(total)} - - -@app.get("/games/{app_id}/prefix-info") -async def game_prefix_info(app_id: str, prefix_path: str | None = None) -> PrefixInfoResponse: - ppath = prefix_path - if not ppath: - _ensure_steam() - _, steam_games = discover_games() - game = next((g for g in steam_games if g.app_id == app_id), None) - ppath = str(game.compatdata_path) if game and game.compatdata_path else None - if not ppath: - return PrefixInfoResponse(path="", exists=False) - info = get_prefix_info(ppath) - return PrefixInfoResponse( - path=info.path, - exists=info.exists, - size_bytes=info.size_bytes, - size_human=_human_size(info.size_bytes), - created=info.created, - dxvk_version=info.dxvk_version, - vkd3d_version=info.vkd3d_version, - ) - - -@app.delete("/games/{app_id}/prefix") -async def delete_game_prefix(app_id: str, prefix_path: str | None = None) -> StatusResponse: - ppath = prefix_path - if not ppath: - _ensure_steam() - _, steam_games = discover_games() - game = next((g for g in steam_games if g.app_id == app_id), None) - if not game or not game.compatdata_path: - raise HTTPException(status_code=404, detail="No prefix found for this game") - ppath = str(game.compatdata_path) - ok = _delete_prefix(ppath) - if not ok: - raise HTTPException(status_code=500, detail="Failed to delete prefix") - return StatusResponse(success=True, message="Prefix deleted. The launcher will recreate it on next launch.") - - -@app.post("/open-path") -async def open_path(body: OpenPathRequest) -> StatusResponse: - """Open a file or folder in the system file manager.""" - import subprocess - target = Path(body.path).expanduser() - if not target.exists(): - raise HTTPException(status_code=404, detail=f"Path not found: {body.path}") - try: - subprocess.Popen(["xdg-open", str(target)], start_new_session=True) - except FileNotFoundError: - try: - subprocess.Popen(["gio", "open", str(target)], start_new_session=True) - except (FileNotFoundError, OSError) as e: - raise HTTPException(status_code=500, detail=str(e)) - return StatusResponse(success=True) - - -@app.post("/open-uri") -async def open_uri(body: OpenUriRequest) -> StatusResponse: - """Open a URI (e.g. steam://rungameid/...) with the system handler.""" - import subprocess - try: - subprocess.Popen(["xdg-open", body.uri], start_new_session=True) - except FileNotFoundError: - try: - subprocess.Popen(["gio", "open", body.uri], start_new_session=True) - except (FileNotFoundError, OSError) as e: - raise HTTPException(status_code=500, detail=str(e)) - return StatusResponse(success=True) - - -# --------------------------------------------------------------------------- -# Heroic endpoints -# --------------------------------------------------------------------------- - - -@app.get("/heroic/games/{app_id}/config") -async def heroic_game_config(app_id: str) -> HeroicGameConfigResponse: - cfg = get_heroic_game_config(app_id) - return HeroicGameConfigResponse( - app_id=cfg.app_id, - exists=cfg.exists, - wine_prefix=cfg.wine_prefix, - wine_version=HeroicWineVersionResponse( - name=cfg.wine_version.name, - bin=cfg.wine_version.bin, - wine_type=cfg.wine_version.wine_type, - ), - other_options=cfg.other_options, - enable_esync=cfg.enable_esync, - enable_fsync=cfg.enable_fsync, - auto_install_dxvk=cfg.auto_install_dxvk, - auto_install_vkd3d=cfg.auto_install_vkd3d, - show_fps=cfg.show_fps, - show_mangohud=cfg.show_mangohud, - use_game_mode=cfg.use_game_mode, - nvidia_prime=cfg.nvidia_prime, - saves_path=cfg.saves_path, - target_exe=cfg.target_exe, - ) - - -@app.put("/heroic/games/{app_id}/launch-options") -async def update_heroic_launch_options( - app_id: str, body: HeroicLaunchOptionsRequest -) -> StatusResponse: - async with _heroic_lock: - ok = set_heroic_launch_options(app_id, body.options) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write Heroic launch options") - return StatusResponse(success=True) - - -@app.put("/heroic/games/{app_id}/wine-version") -async def update_heroic_wine_version( - app_id: str, body: HeroicWineVersionRequest -) -> StatusResponse: - async with _heroic_lock: - ok = set_heroic_wine_version(app_id, body.name, body.bin, body.wine_type) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write Heroic wine version") - return StatusResponse(success=True) - - -@app.put("/heroic/games/{app_id}/toggles") -async def update_heroic_toggles(app_id: str, body: HeroicTogglesRequest) -> StatusResponse: - async with _heroic_lock: - ok = set_heroic_toggles( - app_id, - enable_esync=body.enable_esync, - enable_fsync=body.enable_fsync, - auto_install_dxvk=body.auto_install_dxvk, - auto_install_vkd3d=body.auto_install_vkd3d, - show_mangohud=body.show_mangohud, - use_game_mode=body.use_game_mode, - nvidia_prime=body.nvidia_prime, - ) - if not ok: - raise HTTPException(status_code=500, detail="Failed to write Heroic toggles") - return StatusResponse(success=True) - - -@app.get("/heroic/wine-versions") -async def heroic_wine_versions() -> list[HeroicWineVersionResponse]: - versions = list_heroic_wine_versions() - return [ - HeroicWineVersionResponse(name=v.name, bin=v.bin, wine_type=v.wine_type) - for v in versions - ] - - -@app.post("/heroic/games/{app_id}/launch") -async def launch_heroic_game(app_id: str) -> StatusResponse: - """Launch a game via heroic:// URI protocol.""" - import subprocess - uri = f"heroic://launch/{app_id}" - try: - subprocess.Popen(["xdg-open", uri], start_new_session=True) - except FileNotFoundError: - try: - subprocess.Popen(["gio", "open", uri], start_new_session=True) - except (FileNotFoundError, OSError) as e: - raise HTTPException(status_code=500, detail=str(e)) - return StatusResponse(success=True, message=f"Launching via {uri}") - - -@app.get("/steam/status") -async def steam_status() -> dict[str, Any]: - _ensure_steam() - return { - "running": is_steam_running(), - "root": str(_steam_root) if _steam_root else None, - "config_path": str(_config_path) if _config_path else None, - } - - -# --------------------------------------------------------------------------- -# CLI entry point — Electron spawns this process -# --------------------------------------------------------------------------- - - -def _find_free_port() -> int: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(("127.0.0.1", 0)) - return s.getsockname()[1] - - -def cli() -> None: - parser = argparse.ArgumentParser(description="ProtonShift API server") - parser.add_argument("--port", type=int, default=0, help="Port to listen on (0 = auto)") - args = parser.parse_args() - - port = args.port if args.port > 0 else _find_free_port() - - # Print port to stdout so Electron main process can read it - print(f"PORT:{port}", flush=True) - - import uvicorn - - uvicorn.run(app, host="127.0.0.1", port=port, log_level="warning") - - -if __name__ == "__main__": - cli() diff --git a/src/game_setup_hub/api/__init__.py b/src/game_setup_hub/api/__init__.py new file mode 100644 index 0000000..0a91a49 --- /dev/null +++ b/src/game_setup_hub/api/__init__.py @@ -0,0 +1,41 @@ +"""ProtonShift FastAPI backend. + +Public surface: ``app`` (the FastAPI instance) and ``cli`` (the entry point +the ``protonshift-api`` console script and Electron call into). + +For backwards compatibility with tests and code that monkeypatched the old +flat ``api.py`` module, a few shared globals are re-exposed via the package +namespace. New code should reach into :mod:`game_setup_hub.api._state` +directly instead. +""" + +from __future__ import annotations + +from typing import Any + +from ..steam import is_steam_running +from . import _state +from ._app import app, cli + +__all__ = ["app", "cli", "is_steam_running"] + + +def __getattr__(name: str) -> Any: + """Back-compat: forward legacy ``api._API_TOKEN`` etc. to ``_state``.""" + mapping = { + "_API_TOKEN": "API_TOKEN", + "_config_path": "config_path", + "_steam_root": "steam_root", + "_steam_discovered": "steam_discovered", + "_vdf_lock": "vdf_lock", + "_env_lock": "env_lock", + "_profiles_lock": "profiles_lock", + "_mangohud_lock": "mangohud_lock", + "_heroic_lock": "heroic_lock", + } + target = mapping.get(name) + if target is not None: + return getattr(_state, target) + raise AttributeError(f"module 'game_setup_hub.api' has no attribute {name!r}") + + diff --git a/src/game_setup_hub/api/__main__.py b/src/game_setup_hub/api/__main__.py new file mode 100644 index 0000000..e507325 --- /dev/null +++ b/src/game_setup_hub/api/__main__.py @@ -0,0 +1,8 @@ +"""Allow ``python -m game_setup_hub.api`` (used by Electron's spawn).""" + +from __future__ import annotations + +from ._app import cli + +if __name__ == "__main__": + cli() diff --git a/src/game_setup_hub/api/_app.py b/src/game_setup_hub/api/_app.py new file mode 100644 index 0000000..4af5820 --- /dev/null +++ b/src/game_setup_hub/api/_app.py @@ -0,0 +1,95 @@ +"""FastAPI app construction, middleware, and CLI entry point.""" + +from __future__ import annotations + +import argparse +import os +import secrets +import socket + +from fastapi import FastAPI, status +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse + +import game_setup_hub._vendor_compat # noqa: F401 # must be first + +from .. import __version__ +from . import _state +from .routes import all_routers + +app = FastAPI(title="ProtonShift API", version=__version__) + + +@app.middleware("http") +async def _auth_middleware(request, call_next): + if _state.API_TOKEN and request.url.path not in _state.AUTH_EXEMPT_PATHS: + expected = f"Bearer {_state.API_TOKEN}" + provided = request.headers.get("authorization", "") + if not secrets.compare_digest(provided, expected): + return JSONResponse( + status_code=status.HTTP_401_UNAUTHORIZED, + content={"detail": "Missing or invalid token"}, + headers={"WWW-Authenticate": "Bearer"}, + ) + return await call_next(request) + + +# Tight CORS: the browser side is the Electron renderer (file://) plus the +# Next dev server. Nothing else has any business calling us. +app.add_middleware( + CORSMiddleware, + allow_origins=[ + "http://localhost:3000", + "http://127.0.0.1:3000", + ], + allow_origin_regex=r"^file://.*$", + allow_methods=["GET", "POST", "PUT", "DELETE"], + allow_headers=["Authorization", "Content-Type"], + allow_credentials=False, +) + + +for router in all_routers: + app.include_router(router) + + +# --------------------------------------------------------------------------- +# CLI entry point — Electron spawns this process +# --------------------------------------------------------------------------- + + +def _find_free_port() -> int: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("127.0.0.1", 0)) + return s.getsockname()[1] + + +def cli() -> None: + parser = argparse.ArgumentParser(description="ProtonShift API server") + parser.add_argument("--port", type=int, default=0, help="Port to listen on (0 = auto)") + parser.add_argument( + "--host", + default="127.0.0.1", + help="Interface to bind. Defaults to loopback; do not change unless you understand the risk.", + ) + args = parser.parse_args() + + port = args.port if args.port > 0 else _find_free_port() + + # If the parent process didn't provision a token, mint one and keep it in + # the environment for child code to read. We deliberately do NOT print the + # token: writing credentials to stdout/stderr risks them ending up in + # journald, IDE consoles, or ELectron logs. Standalone curl users should + # set ``PROTONSHIFT_API_TOKEN`` themselves before launching. + if not _state.API_TOKEN: + _state.API_TOKEN = secrets.token_urlsafe(32) + os.environ["PROTONSHIFT_API_TOKEN"] = _state.API_TOKEN + + print(f"PORT:{port}", flush=True) + + from .. import logging_setup + logging_setup.configure() + + import uvicorn + + uvicorn.run(app, host=args.host, port=port, log_level="warning") diff --git a/src/game_setup_hub/api/_helpers.py b/src/game_setup_hub/api/_helpers.py new file mode 100644 index 0000000..4b0aa21 --- /dev/null +++ b/src/game_setup_hub/api/_helpers.py @@ -0,0 +1,40 @@ +"""Internal helpers shared across routers.""" + +from __future__ import annotations + +from ..heroic import HeroicGame +from ..lutris import LutrisGame +from ..steam import SteamGame +from ._models import HeroicGameResponse, LutrisGameResponse, SteamGameResponse + + +def steam_game_to_response(g: SteamGame) -> SteamGameResponse: + return SteamGameResponse( + app_id=g.app_id, + name=g.name, + install_dir=g.install_dir, + last_played=g.last_played, + library_path=str(g.library_path), + compatdata_path=str(g.compatdata_path) if g.compatdata_path else None, + has_compatdata=g.has_compatdata, + install_path=str(g.install_path) if g.install_path else None, + ) + + +def heroic_game_to_response(g: HeroicGame) -> HeroicGameResponse: + return HeroicGameResponse( + app_id=g.app_id, + name=g.name, + store=g.store, + install_path=str(g.install_path) if g.install_path else None, + prefix_path=str(g.prefix_path) if g.prefix_path else None, + ) + + +def lutris_game_to_response(g: LutrisGame) -> LutrisGameResponse: + return LutrisGameResponse( + app_id=g.app_id, + name=g.name, + install_path=str(g.install_path) if g.install_path else None, + prefix_path=str(g.prefix_path) if g.prefix_path else None, + ) diff --git a/src/game_setup_hub/api/_models.py b/src/game_setup_hub/api/_models.py new file mode 100644 index 0000000..2963efc --- /dev/null +++ b/src/game_setup_hub/api/_models.py @@ -0,0 +1,256 @@ +"""Pydantic request and response models for the API surface.""" + +from __future__ import annotations + +from pydantic import BaseModel + + +class SteamGameResponse(BaseModel): + app_id: str + name: str + install_dir: str + last_played: int + library_path: str + compatdata_path: str | None + has_compatdata: bool + install_path: str | None + source: str = "steam" + + +class HeroicGameResponse(BaseModel): + app_id: str + name: str + store: str + install_path: str | None + prefix_path: str | None + source: str = "heroic" + + +class LutrisGameResponse(BaseModel): + app_id: str + name: str + install_path: str | None + prefix_path: str | None + source: str = "lutris" + + +class GPUInfoResponse(BaseModel): + name: str + driver: str + vram_mb: int | None + temperature: float | None + + +class SystemInfoResponse(BaseModel): + gpus: list[GPUInfoResponse] + power_profiles: list[str] + current_power_profile: str | None + + +class LaunchPresetResponse(BaseModel): + name: str + value: str + description: str + install_command: str + install_url: str + is_installed: bool + + +class ProfileResponse(BaseModel): + name: str + launch_options: str + compat_tool: str + env_vars: dict[str, str] + power_profile: str + + +class ProfileCreateRequest(BaseModel): + name: str + launch_options: str = "" + compat_tool: str = "" + env_vars: dict[str, str] = {} + power_profile: str = "" + + +class LaunchOptionsRequest(BaseModel): + options: str + + +class CompatToolRequest(BaseModel): + tool_name: str + + +class EnvVarsRequest(BaseModel): + vars: dict[str, str] + + +class PowerProfileRequest(BaseModel): + profile: str + + +class ProtontricksRequest(BaseModel): + verb: str | None = None + + +class PrefixInfoResponse(BaseModel): + path: str + exists: bool + size_bytes: int = 0 + size_human: str = "" + created: str = "" + dxvk_version: str = "" + vkd3d_version: str = "" + + +class ControllerResponse(BaseModel): + id: str + name: str + device_path: str + controller_type: str + vendor_id: str = "" + product_id: str = "" + bus_type: str = "" + version: str = "" + + +class MonitorResponse(BaseModel): + name: str + connected: bool + resolution: str + refresh_rate: str + primary: bool + position: str + + +class SetResolutionRequest(BaseModel): + monitor: str + width: int + height: int + refresh: float = 0 + + +class SaveLocationResponse(BaseModel): + path: str + exists: bool + size_bytes: int = 0 + size_human: str = "" + label: str = "" + + +class BackupInfoResponse(BaseModel): + path: str + filename: str + size_bytes: int + size_human: str + created: str + + +class BackupRequest(BaseModel): + paths: list[str] + + +class RestoreRequest(BaseModel): + backup_path: str + target_dir: str + + +class MangoHudConfigRequest(BaseModel): + config: dict[str, str] + + +class GameFixResponse(BaseModel): + title: str + description: str + fix_type: str + key: str + value: str + source: str + + +class GameFixCreateRequest(BaseModel): + title: str + description: str = "" + fix_type: str = "env" + key: str = "" + value: str = "" + + +class GamescopeBuildRequest(BaseModel): + output_width: int = 0 + output_height: int = 0 + game_width: int = 0 + game_height: int = 0 + fps_limit: int = 0 + fsr: bool = False + fsr_sharpness: int = 5 + integer_scale: bool = False + hdr: bool = False + nested: bool = True + borderless: bool = True + fullscreen: bool = True + extra_args: str = "" + + +class ShaderCacheResponse(BaseModel): + app_id: str + path: str + exists: bool + size_bytes: int = 0 + size_human: str = "" + + +class OpenPathRequest(BaseModel): + path: str + + +class OpenUriRequest(BaseModel): + uri: str + + +class HeroicWineVersionResponse(BaseModel): + name: str + bin: str + wine_type: str + + +class HeroicGameConfigResponse(BaseModel): + app_id: str + exists: bool + wine_prefix: str = "" + wine_version: HeroicWineVersionResponse = HeroicWineVersionResponse(name="", bin="", wine_type="") + other_options: str = "" + enable_esync: bool = False + enable_fsync: bool = False + auto_install_dxvk: bool = True + auto_install_vkd3d: bool = False + show_fps: bool = False + show_mangohud: bool = False + use_game_mode: bool = False + nvidia_prime: bool = False + saves_path: str = "" + target_exe: str = "" + + +class HeroicLaunchOptionsRequest(BaseModel): + options: str + + +class HeroicWineVersionRequest(BaseModel): + name: str + bin: str + wine_type: str + + +class HeroicTogglesRequest(BaseModel): + enable_esync: bool | None = None + enable_fsync: bool | None = None + auto_install_dxvk: bool | None = None + auto_install_vkd3d: bool | None = None + show_mangohud: bool | None = None + use_game_mode: bool | None = None + nvidia_prime: bool | None = None + + +class StatusResponse(BaseModel): + success: bool + message: str = "" diff --git a/src/game_setup_hub/api/_state.py b/src/game_setup_hub/api/_state.py new file mode 100644 index 0000000..9ce8cf8 --- /dev/null +++ b/src/game_setup_hub/api/_state.py @@ -0,0 +1,56 @@ +"""Shared mutable state for the FastAPI app and routers. + +Every router imports this module and reads/writes attributes on it so the +locks and cached Steam discovery are shared across the package. Modules +should NOT do ``from ._state import API_TOKEN`` because that copies the +value at import time; use ``_state.API_TOKEN`` instead. +""" + +from __future__ import annotations + +import asyncio +import logging +import os +from pathlib import Path + +log = logging.getLogger("protonshift.api") + +# Auth token. The Electron main process generates this and passes it through +# ``PROTONSHIFT_API_TOKEN``. Standalone CLI users get a freshly-printed token +# at startup. Empty disables auth (back-compat for ``protonshift-api`` +# invocations without setting the env var — only safe on a single-user desktop). +API_TOKEN: str = os.environ.get("PROTONSHIFT_API_TOKEN", "") + +# Endpoints exempt from auth. ``/health`` lets Electron poll for readiness +# before the token has propagated; ``/docs`` etc. are FastAPI's own. +AUTH_EXEMPT_PATHS: frozenset[str] = frozenset({ + "/health", + "/docs", + "/openapi.json", + "/redoc", +}) + +# Locks for serializing writes to shared resources. +vdf_lock = asyncio.Lock() +env_lock = asyncio.Lock() +profiles_lock = asyncio.Lock() +mangohud_lock = asyncio.Lock() +heroic_lock = asyncio.Lock() + +# Cached Steam discovery (resolved once per process). +steam_root: Path | None = None +config_path: Path | None = None +steam_discovered = False + + +def ensure_steam() -> None: + """Discover the Steam root + ``localconfig.vdf`` path lazily, once.""" + global steam_root, config_path, steam_discovered + if steam_discovered: + return + from ..steam import discover_games, get_localconfig_path + + steam_root, _ = discover_games() + if steam_root: + config_path = get_localconfig_path(steam_root) + steam_discovered = True diff --git a/src/game_setup_hub/api/routes/__init__.py b/src/game_setup_hub/api/routes/__init__.py new file mode 100644 index 0000000..2995703 --- /dev/null +++ b/src/game_setup_hub/api/routes/__init__.py @@ -0,0 +1,18 @@ +"""Router collection. Add new routers here so ``_app`` picks them up.""" + +from __future__ import annotations + +from fastapi import APIRouter + +from . import games, health, heroic, mangohud, profiles, saves, system, utility + +all_routers: list[APIRouter] = [ + health.router, + games.router, + system.router, + saves.router, + mangohud.router, + heroic.router, + profiles.router, + utility.router, +] diff --git a/src/game_setup_hub/api/routes/games.py b/src/game_setup_hub/api/routes/games.py new file mode 100644 index 0000000..dfbdafd --- /dev/null +++ b/src/game_setup_hub/api/routes/games.py @@ -0,0 +1,129 @@ +"""Game discovery + Steam/Heroic/Lutris listing + per-game Steam config.""" + +from __future__ import annotations + +from typing import Any + +from fastapi import APIRouter, HTTPException + +from ...heroic import discover_heroic_games +from ...lutris import discover_lutris_games +from ...steam import discover_games, get_available_proton_tools, is_steam_running +from ...vdf_config import ( + get_compat_tool, + get_launch_options, + set_compat_tool, + set_launch_options, +) +from .. import _state +from .._helpers import ( + heroic_game_to_response, + lutris_game_to_response, + steam_game_to_response, +) +from .._models import ( + CompatToolRequest, + LaunchOptionsRequest, + StatusResponse, +) + +router = APIRouter() + + +@router.get("/games") +async def list_games() -> dict[str, Any]: + _state.ensure_steam() + _, steam_games = discover_games() + heroic_games = discover_heroic_games() + lutris_games = discover_lutris_games() + return { + "steam": [steam_game_to_response(g) for g in steam_games], + "heroic": [heroic_game_to_response(g) for g in heroic_games], + "lutris": [lutris_game_to_response(g) for g in lutris_games], + "steam_running": is_steam_running(), + } + + +@router.get("/games/{app_id}/launch-options") +async def get_game_launch_options(app_id: str) -> dict[str, str]: + _state.ensure_steam() + if not _state.config_path: + return {"options": ""} + try: + opts = get_launch_options(_state.config_path, app_id) + except (OSError, KeyError, ValueError) as exc: + _state.log.warning("get_launch_options(%s) failed: %s", app_id, exc) + opts = "" + return {"options": opts} + + +@router.put("/games/{app_id}/launch-options") +async def update_launch_options(app_id: str, body: LaunchOptionsRequest) -> StatusResponse: + _state.ensure_steam() + if not _state.config_path: + raise HTTPException(status_code=404, detail="Steam localconfig.vdf not found") + if is_steam_running(): + # Steam holds localconfig.vdf in memory and rewrites on shutdown, + # so any edit while it is running gets clobbered. + raise HTTPException( + status_code=409, + detail="Steam is running. Quit Steam fully before editing launch options.", + ) + async with _state.vdf_lock: + ok = set_launch_options(_state.config_path, app_id, body.options) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write localconfig.vdf") + return StatusResponse(success=True) + + +@router.get("/games/{app_id}/compat-tool") +async def get_game_compat_tool(app_id: str) -> dict[str, str]: + _state.ensure_steam() + if not _state.config_path: + return {"tool": ""} + try: + tool = get_compat_tool(_state.config_path, app_id) + except (OSError, KeyError, ValueError) as exc: + _state.log.warning("get_compat_tool(%s) failed: %s", app_id, exc) + tool = "" + return {"tool": tool} + + +@router.put("/games/{app_id}/compat-tool") +async def update_compat_tool(app_id: str, body: CompatToolRequest) -> StatusResponse: + _state.ensure_steam() + if not _state.config_path: + raise HTTPException(status_code=404, detail="Steam localconfig.vdf not found") + if is_steam_running(): + raise HTTPException( + status_code=409, + detail="Steam is running. Quit Steam fully before changing the compat tool.", + ) + async with _state.vdf_lock: + ok = set_compat_tool(_state.config_path, app_id, body.tool_name) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write localconfig.vdf") + return StatusResponse(success=True) + + +@router.get("/games/{app_id}/proton-tools") +async def list_proton_tools(app_id: str) -> dict[str, Any]: + _state.ensure_steam() + tools = get_available_proton_tools(_state.steam_root) + current = "" + if _state.config_path: + try: + current = get_compat_tool(_state.config_path, app_id) + except (OSError, KeyError, ValueError) as exc: + _state.log.warning("get_compat_tool(%s) failed in proton-tools: %s", app_id, exc) + return {"tools": tools, "current": current} + + +@router.get("/steam/status") +async def steam_status() -> dict[str, Any]: + _state.ensure_steam() + return { + "running": is_steam_running(), + "root": str(_state.steam_root) if _state.steam_root else None, + "config_path": str(_state.config_path) if _state.config_path else None, + } diff --git a/src/game_setup_hub/api/routes/health.py b/src/game_setup_hub/api/routes/health.py new file mode 100644 index 0000000..b3b1180 --- /dev/null +++ b/src/game_setup_hub/api/routes/health.py @@ -0,0 +1,13 @@ +"""Liveness/readiness probe.""" + +from __future__ import annotations + +from fastapi import APIRouter + +router = APIRouter() + + +@router.get("/health") +async def health() -> dict[str, str]: + """Readiness probe. Exempt from auth so Electron can poll on startup.""" + return {"status": "ok"} diff --git a/src/game_setup_hub/api/routes/heroic.py b/src/game_setup_hub/api/routes/heroic.py new file mode 100644 index 0000000..e1d831c --- /dev/null +++ b/src/game_setup_hub/api/routes/heroic.py @@ -0,0 +1,115 @@ +"""Heroic Games Launcher integration endpoints.""" + +from __future__ import annotations + +import subprocess + +from fastapi import APIRouter, HTTPException + +from ...heroic_config import ( + get_heroic_game_config, + list_heroic_wine_versions, + set_heroic_launch_options, + set_heroic_toggles, + set_heroic_wine_version, +) +from .. import _state +from .._models import ( + HeroicGameConfigResponse, + HeroicLaunchOptionsRequest, + HeroicTogglesRequest, + HeroicWineVersionRequest, + HeroicWineVersionResponse, + StatusResponse, +) + +router = APIRouter(prefix="/heroic") + + +@router.get("/games/{app_id}/config") +async def heroic_game_config(app_id: str) -> HeroicGameConfigResponse: + cfg = get_heroic_game_config(app_id) + return HeroicGameConfigResponse( + app_id=cfg.app_id, + exists=cfg.exists, + wine_prefix=cfg.wine_prefix, + wine_version=HeroicWineVersionResponse( + name=cfg.wine_version.name, + bin=cfg.wine_version.bin, + wine_type=cfg.wine_version.wine_type, + ), + other_options=cfg.other_options, + enable_esync=cfg.enable_esync, + enable_fsync=cfg.enable_fsync, + auto_install_dxvk=cfg.auto_install_dxvk, + auto_install_vkd3d=cfg.auto_install_vkd3d, + show_fps=cfg.show_fps, + show_mangohud=cfg.show_mangohud, + use_game_mode=cfg.use_game_mode, + nvidia_prime=cfg.nvidia_prime, + saves_path=cfg.saves_path, + target_exe=cfg.target_exe, + ) + + +@router.put("/games/{app_id}/launch-options") +async def update_heroic_launch_options( + app_id: str, body: HeroicLaunchOptionsRequest +) -> StatusResponse: + async with _state.heroic_lock: + ok = set_heroic_launch_options(app_id, body.options) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write Heroic launch options") + return StatusResponse(success=True) + + +@router.put("/games/{app_id}/wine-version") +async def update_heroic_wine_version( + app_id: str, body: HeroicWineVersionRequest +) -> StatusResponse: + async with _state.heroic_lock: + ok = set_heroic_wine_version(app_id, body.name, body.bin, body.wine_type) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write Heroic wine version") + return StatusResponse(success=True) + + +@router.put("/games/{app_id}/toggles") +async def update_heroic_toggles(app_id: str, body: HeroicTogglesRequest) -> StatusResponse: + async with _state.heroic_lock: + ok = set_heroic_toggles( + app_id, + enable_esync=body.enable_esync, + enable_fsync=body.enable_fsync, + auto_install_dxvk=body.auto_install_dxvk, + auto_install_vkd3d=body.auto_install_vkd3d, + show_mangohud=body.show_mangohud, + use_game_mode=body.use_game_mode, + nvidia_prime=body.nvidia_prime, + ) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write Heroic toggles") + return StatusResponse(success=True) + + +@router.get("/wine-versions") +async def heroic_wine_versions() -> list[HeroicWineVersionResponse]: + versions = list_heroic_wine_versions() + return [ + HeroicWineVersionResponse(name=v.name, bin=v.bin, wine_type=v.wine_type) + for v in versions + ] + + +@router.post("/games/{app_id}/launch") +async def launch_heroic_game(app_id: str) -> StatusResponse: + """Launch a game via heroic:// URI protocol.""" + uri = f"heroic://launch/{app_id}" + try: + subprocess.Popen(["xdg-open", uri], start_new_session=True) + except FileNotFoundError: + try: + subprocess.Popen(["gio", "open", uri], start_new_session=True) + except (FileNotFoundError, OSError) as e: + raise HTTPException(status_code=500, detail=str(e)) from e + return StatusResponse(success=True, message=f"Launching via {uri}") diff --git a/src/game_setup_hub/api/routes/mangohud.py b/src/game_setup_hub/api/routes/mangohud.py new file mode 100644 index 0000000..ee72d39 --- /dev/null +++ b/src/game_setup_hub/api/routes/mangohud.py @@ -0,0 +1,79 @@ +"""MangoHud configuration endpoints (global + per-game).""" + +from __future__ import annotations + +from typing import Any + +from fastapi import APIRouter, HTTPException + +from ...mangohud import ( + MANGOHUD_PARAMS, + MANGOHUD_PRESETS, + get_per_game_config_path, + is_mangohud_available, + list_per_game_configs, + read_mangohud_config, + write_mangohud_config, +) +from .. import _state +from .._models import MangoHudConfigRequest, StatusResponse + +router = APIRouter(prefix="/mangohud") + + +@router.get("/available") +async def mangohud_available() -> dict[str, bool]: + return {"available": is_mangohud_available()} + + +@router.get("/config") +async def get_mangohud_config() -> dict[str, Any]: + return { + "config": read_mangohud_config(), + "params": MANGOHUD_PARAMS, + } + + +@router.put("/config") +async def update_mangohud_config(body: MangoHudConfigRequest) -> StatusResponse: + async with _state.mangohud_lock: + ok = write_mangohud_config(body.config) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write MangoHud config") + return StatusResponse(success=True) + + +@router.get("/presets") +async def get_mangohud_presets() -> dict[str, dict[str, str]]: + return MANGOHUD_PRESETS + + +@router.get("/per-game") +async def list_mangohud_per_game() -> list[dict[str, str]]: + """List all existing per-game MangoHud config files.""" + return list_per_game_configs() + + +@router.get("/per-game/{game_name}") +async def get_mangohud_per_game_config(game_name: str) -> dict[str, Any]: + """Read a per-game MangoHud config.""" + conf_path = get_per_game_config_path(game_name) + return { + "path": str(conf_path), + "exists": conf_path.exists(), + "config": read_mangohud_config(conf_path) if conf_path.exists() else {}, + "params": MANGOHUD_PARAMS, + } + + +@router.put("/per-game/{game_name}") +async def update_mangohud_per_game_config( + game_name: str, body: MangoHudConfigRequest +) -> StatusResponse: + """Write a per-game MangoHud config.""" + conf_path = get_per_game_config_path(game_name) + async with _state.mangohud_lock: + ok = write_mangohud_config(body.config, conf_path) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write per-game MangoHud config") + return StatusResponse(success=True) diff --git a/src/game_setup_hub/api/routes/profiles.py b/src/game_setup_hub/api/routes/profiles.py new file mode 100644 index 0000000..7d54db4 --- /dev/null +++ b/src/game_setup_hub/api/routes/profiles.py @@ -0,0 +1,61 @@ +"""Application profile CRUD.""" + +from __future__ import annotations + +from fastapi import APIRouter, HTTPException + +from ...profiles_storage import ( + ApplicationProfile, + delete_profile, + list_profiles, + load_profile, + save_profile, +) +from .. import _state +from .._models import ProfileCreateRequest, ProfileResponse, StatusResponse + +router = APIRouter(prefix="/profiles") + + +@router.get("") +async def list_all_profiles() -> list[str]: + return list_profiles() + + +@router.get("/{name}") +async def get_profile(name: str) -> ProfileResponse: + p = load_profile(name) + if not p: + raise HTTPException(status_code=404, detail="Profile not found") + return ProfileResponse( + name=p.name, + launch_options=p.launch_options, + compat_tool=p.compat_tool, + env_vars=p.env_vars, + power_profile=p.power_profile, + ) + + +@router.post("") +async def create_profile(body: ProfileCreateRequest) -> StatusResponse: + profile = ApplicationProfile( + name=body.name, + launch_options=body.launch_options, + compat_tool=body.compat_tool, + env_vars=body.env_vars, + power_profile=body.power_profile, + ) + async with _state.profiles_lock: + ok = save_profile(profile) + if not ok: + raise HTTPException(status_code=500, detail="Failed to save profile") + return StatusResponse(success=True) + + +@router.delete("/{name}") +async def remove_profile(name: str) -> StatusResponse: + async with _state.profiles_lock: + ok = delete_profile(name) + if not ok: + raise HTTPException(status_code=404, detail="Profile not found or could not be deleted") + return StatusResponse(success=ok) diff --git a/src/game_setup_hub/api/routes/saves.py b/src/game_setup_hub/api/routes/saves.py new file mode 100644 index 0000000..a061a1b --- /dev/null +++ b/src/game_setup_hub/api/routes/saves.py @@ -0,0 +1,78 @@ +"""Game save discovery, backup, restore.""" + +from __future__ import annotations + +from typing import Any + +from fastapi import APIRouter, HTTPException + +from ...fsutil import human_size +from ...paths import PathValidationError, validate_user_path +from ...saves import backup_saves, find_save_paths, list_backups, restore_backup +from ...steam import discover_games +from .. import _state +from .._models import ( + BackupInfoResponse, + BackupRequest, + RestoreRequest, + SaveLocationResponse, + StatusResponse, +) + +router = APIRouter() + + +@router.get("/games/{app_id}/saves") +async def game_saves(app_id: str, prefix_path: str | None = None) -> list[SaveLocationResponse]: + prefix = prefix_path + if not prefix: + _state.ensure_steam() + _, steam_games = discover_games() + game = next((g for g in steam_games if g.app_id == app_id), None) + prefix = str(game.compatdata_path) if game and game.compatdata_path else None + locations = find_save_paths(app_id, prefix) + return [ + SaveLocationResponse( + path=loc.path, + exists=loc.exists, + size_bytes=loc.size_bytes, + size_human=human_size(loc.size_bytes), + label=loc.label, + ) + for loc in locations + ] + + +@router.post("/games/{app_id}/saves/backup") +async def backup_game_saves(app_id: str, body: BackupRequest) -> dict[str, Any]: + result = backup_saves(app_id, body.paths) + if not result: + raise HTTPException(status_code=500, detail="Failed to create backup") + return {"path": result} + + +@router.get("/games/{app_id}/saves/backups") +async def list_game_backups(app_id: str) -> list[BackupInfoResponse]: + backups = list_backups(app_id) + return [ + BackupInfoResponse( + path=b.path, + filename=b.filename, + size_bytes=b.size_bytes, + size_human=human_size(b.size_bytes), + created=b.created, + ) + for b in backups + ] + + +@router.post("/games/{app_id}/saves/restore") +async def restore_game_saves(app_id: str, body: RestoreRequest) -> StatusResponse: + try: + target = validate_user_path(body.target_dir, allow_missing=True) + except PathValidationError as exc: + raise HTTPException(status_code=400, detail=f"target_dir rejected: {exc}") from exc + ok = restore_backup(body.backup_path, str(target)) + if not ok: + raise HTTPException(status_code=500, detail="Failed to restore backup") + return StatusResponse(success=True, message="Backup restored") diff --git a/src/game_setup_hub/api/routes/system.py b/src/game_setup_hub/api/routes/system.py new file mode 100644 index 0000000..d0658a1 --- /dev/null +++ b/src/game_setup_hub/api/routes/system.py @@ -0,0 +1,158 @@ +"""System info: GPU, power profile, env vars, presets, controllers, displays.""" + +from __future__ import annotations + +from typing import Any + +from fastapi import APIRouter, HTTPException + +from ...controllers import get_controllers, get_sdl_mapping +from ...display import get_monitors, get_session_type, set_resolution +from ...env_vars import ENV_PRESETS, read_gaming_env, write_gaming_env +from ...gpu import ( + get_current_power_profile, + get_gpu_info, + get_power_profiles, + set_power_profile, +) +from ...presets import LAUNCH_PRESETS +from .. import _state +from .._models import ( + ControllerResponse, + EnvVarsRequest, + GPUInfoResponse, + LaunchPresetResponse, + MonitorResponse, + PowerProfileRequest, + SetResolutionRequest, + StatusResponse, + SystemInfoResponse, +) + +router = APIRouter() + + +@router.get("/system") +async def system_info() -> SystemInfoResponse: + try: + gpus = get_gpu_info() + except OSError as exc: + _state.log.warning("get_gpu_info failed: %s", exc) + gpus = [] + try: + profiles = get_power_profiles() + except OSError as exc: + _state.log.warning("get_power_profiles failed: %s", exc) + profiles = [] + try: + current = get_current_power_profile() + except OSError as exc: + _state.log.warning("get_current_power_profile failed: %s", exc) + current = None + return SystemInfoResponse( + gpus=[ + GPUInfoResponse(name=g.name, driver=g.driver, vram_mb=g.vram_mb, temperature=g.temperature) + for g in gpus + ], + power_profiles=profiles, + current_power_profile=current, + ) + + +@router.put("/system/power-profile") +async def update_power_profile(body: PowerProfileRequest) -> StatusResponse: + ok, msg = set_power_profile(body.profile) + return StatusResponse(success=ok, message=msg) + + +@router.get("/env-vars") +async def get_env_vars() -> dict[str, str]: + try: + return read_gaming_env() + except OSError as exc: + _state.log.warning("read_gaming_env failed: %s", exc) + return {} + + +@router.put("/env-vars") +async def update_env_vars(body: EnvVarsRequest) -> StatusResponse: + async with _state.env_lock: + ok = write_gaming_env(body.vars) + if not ok: + raise HTTPException(status_code=500, detail="Failed to write env config") + return StatusResponse(success=True) + + +@router.get("/env-presets") +async def list_env_presets() -> dict[str, dict[str, str]]: + return ENV_PRESETS + + +@router.get("/presets") +async def list_presets() -> list[LaunchPresetResponse]: + return [ + LaunchPresetResponse( + name=p.name, + value=p.value, + description=p.description, + install_command=p.install_command, + install_url=p.install_url, + is_installed=p.is_installed(), + ) + for p in LAUNCH_PRESETS + ] + + +@router.get("/controllers") +async def list_controllers() -> list[ControllerResponse]: + ctrls = get_controllers() + return [ + ControllerResponse( + id=c.id, + name=c.name, + device_path=c.device_path, + controller_type=c.controller_type, + vendor_id=c.vendor_id, + product_id=c.product_id, + bus_type=c.bus_type, + version=c.version, + ) + for c in ctrls + ] + + +@router.get("/controllers/{controller_id}/sdl-mapping") +async def controller_sdl_mapping(controller_id: str) -> dict[str, str]: + ctrls = get_controllers() + ctrl = next((c for c in ctrls if c.id == controller_id), None) + if not ctrl: + raise HTTPException(status_code=404, detail="Controller not found") + return {"mapping": get_sdl_mapping(ctrl)} + + +@router.get("/display/monitors") +async def list_monitors() -> dict[str, Any]: + session = get_session_type() + monitors = get_monitors() + return { + "session_type": session, + "monitors": [ + MonitorResponse( + name=m.name, + connected=m.connected, + resolution=m.resolution, + refresh_rate=m.refresh_rate, + primary=m.primary, + position=m.position, + ) + for m in monitors + ], + } + + +@router.put("/display/resolution") +async def update_resolution(body: SetResolutionRequest) -> StatusResponse: + ok = set_resolution(body.monitor, body.width, body.height, body.refresh) + if not ok: + raise HTTPException(status_code=500, detail="Failed to set resolution") + return StatusResponse(success=True, message=f"Set {body.monitor} to {body.width}x{body.height}") diff --git a/src/game_setup_hub/api/routes/utility.py b/src/game_setup_hub/api/routes/utility.py new file mode 100644 index 0000000..e3558e0 --- /dev/null +++ b/src/game_setup_hub/api/routes/utility.py @@ -0,0 +1,252 @@ +"""Misc one-shot utilities: protontricks, gamescope, fixes, shader cache, prefix, open-path/uri.""" + +from __future__ import annotations + +import subprocess +from typing import Any + +from fastapi import APIRouter, HTTPException + +from ...fixes import add_user_fix, get_fixes +from ...fsutil import human_size +from ...gamescope import ( + GamescopeOptions, + build_gamescope_argv, + build_gamescope_cmd, + is_gamescope_available, +) +from ...paths import PathValidationError, validate_user_path +from ...prefix import delete_prefix, get_prefix_info +from ...protontricks import COMMON_VERBS, is_protontricks_available, run_protontricks +from ...shader_cache import ( + clear_shader_cache, + get_shader_cache_info, + get_total_shader_cache_size, +) +from ...steam import discover_games +from .. import _state +from .._models import ( + GameFixCreateRequest, + GameFixResponse, + GamescopeBuildRequest, + OpenPathRequest, + OpenUriRequest, + PrefixInfoResponse, + ProtontricksRequest, + ShaderCacheResponse, + StatusResponse, +) + +router = APIRouter() + + +# --- protontricks ---------------------------------------------------------- + + +@router.post("/games/{app_id}/protontricks") +async def trigger_protontricks(app_id: str, body: ProtontricksRequest) -> StatusResponse: + if not is_protontricks_available(): + raise HTTPException(status_code=404, detail="Protontricks not installed") + ok, msg = run_protontricks(app_id, body.verb) + if not ok: + raise HTTPException(status_code=500, detail=msg) + return StatusResponse(success=True, message=msg) + + +@router.get("/protontricks/verbs") +async def list_protontricks_verbs() -> dict[str, Any]: + return { + "available": is_protontricks_available(), + "verbs": [{"id": v[0], "label": v[1]} for v in COMMON_VERBS], + } + + +# --- gamescope ------------------------------------------------------------- + + +@router.get("/gamescope/available") +async def gamescope_available() -> dict[str, bool]: + return {"available": is_gamescope_available()} + + +@router.post("/gamescope/build-cmd") +async def gamescope_build(body: GamescopeBuildRequest) -> dict[str, Any]: + opts = GamescopeOptions( + output_width=body.output_width, + output_height=body.output_height, + game_width=body.game_width, + game_height=body.game_height, + fps_limit=body.fps_limit, + fsr=body.fsr, + fsr_sharpness=body.fsr_sharpness, + integer_scale=body.integer_scale, + hdr=body.hdr, + nested=body.nested, + borderless=body.borderless, + fullscreen=body.fullscreen, + extra_args=body.extra_args, + ) + return { + "command": build_gamescope_cmd(opts), + "argv": build_gamescope_argv(opts), + } + + +# --- fixes ------------------------------------------------------------------ + + +@router.get("/games/{app_id}/fixes") +async def list_game_fixes(app_id: str) -> list[GameFixResponse]: + fixes = get_fixes(app_id) + return [ + GameFixResponse( + title=f.title, + description=f.description, + fix_type=f.fix_type, + key=f.key, + value=f.value, + source=f.source, + ) + for f in fixes + ] + + +@router.post("/games/{app_id}/fixes") +async def create_game_fix(app_id: str, body: GameFixCreateRequest) -> StatusResponse: + ok = add_user_fix( + app_id=app_id, + title=body.title, + description=body.description, + fix_type=body.fix_type, + key=body.key, + value=body.value, + ) + if not ok: + raise HTTPException(status_code=500, detail="Failed to save fix") + return StatusResponse(success=True) + + +# --- shader cache ----------------------------------------------------------- + + +@router.get("/games/{app_id}/shader-cache") +async def game_shader_cache(app_id: str) -> ShaderCacheResponse: + _state.ensure_steam() + if not _state.steam_root: + return ShaderCacheResponse(app_id=app_id, path="", exists=False) + info = get_shader_cache_info(_state.steam_root, app_id) + return ShaderCacheResponse( + app_id=app_id, + path=info.path, + exists=info.exists, + size_bytes=info.size_bytes, + size_human=human_size(info.size_bytes), + ) + + +@router.delete("/games/{app_id}/shader-cache") +async def clear_game_shader_cache(app_id: str) -> StatusResponse: + _state.ensure_steam() + if not _state.steam_root: + raise HTTPException(status_code=404, detail="Steam root not found") + ok = clear_shader_cache(_state.steam_root, app_id) + if not ok: + raise HTTPException(status_code=500, detail="Failed to clear shader cache") + return StatusResponse(success=True, message="Shader cache cleared") + + +@router.get("/shader-cache/total") +async def total_shader_cache() -> dict[str, Any]: + _state.ensure_steam() + if not _state.steam_root: + return {"size_bytes": 0, "size_human": "0.0 B"} + total = get_total_shader_cache_size(_state.steam_root) + return {"size_bytes": total, "size_human": human_size(total)} + + +# --- prefix ----------------------------------------------------------------- + + +@router.get("/games/{app_id}/prefix-info") +async def game_prefix_info(app_id: str, prefix_path: str | None = None) -> PrefixInfoResponse: + ppath = prefix_path + if not ppath: + _state.ensure_steam() + _, steam_games = discover_games() + game = next((g for g in steam_games if g.app_id == app_id), None) + ppath = str(game.compatdata_path) if game and game.compatdata_path else None + if not ppath: + return PrefixInfoResponse(path="", exists=False) + info = get_prefix_info(ppath) + return PrefixInfoResponse( + path=info.path, + exists=info.exists, + size_bytes=info.size_bytes, + size_human=human_size(info.size_bytes), + created=info.created, + dxvk_version=info.dxvk_version, + vkd3d_version=info.vkd3d_version, + ) + + +@router.delete("/games/{app_id}/prefix") +async def delete_game_prefix(app_id: str, prefix_path: str | None = None) -> StatusResponse: + ppath = prefix_path + if not ppath: + _state.ensure_steam() + _, steam_games = discover_games() + game = next((g for g in steam_games if g.app_id == app_id), None) + if not game or not game.compatdata_path: + raise HTTPException(status_code=404, detail="No prefix found for this game") + ppath = str(game.compatdata_path) + try: + # Reject any prefix path that doesn't live under a user-writable root. + # Without this check, an attacker who can reach 127.0.0.1 could send + # ``prefix_path=/etc`` and delete the system config tree. + validate_user_path(ppath) + except PathValidationError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + ok = delete_prefix(ppath) + if not ok: + raise HTTPException(status_code=500, detail="Failed to delete prefix") + return StatusResponse( + success=True, + message="Prefix deleted. The launcher will recreate it on next launch.", + ) + + +# --- open-path / open-uri --------------------------------------------------- + + +@router.post("/open-path") +async def open_path(body: OpenPathRequest) -> StatusResponse: + """Open a file or folder in the system file manager. + + Restricted to user-writable roots (``$HOME``, mounts, ``/tmp``) to keep + the localhost API from being a generic system-wide xdg-open proxy. + """ + try: + target = validate_user_path(body.path) + except PathValidationError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + try: + subprocess.Popen(["xdg-open", str(target)], start_new_session=True) + except FileNotFoundError: + try: + subprocess.Popen(["gio", "open", str(target)], start_new_session=True) + except (FileNotFoundError, OSError) as e: + raise HTTPException(status_code=500, detail=str(e)) from e + return StatusResponse(success=True) + + +@router.post("/open-uri") +async def open_uri(body: OpenUriRequest) -> StatusResponse: + """Open a URI (e.g. ``steam://rungameid/...``) with the system handler.""" + try: + subprocess.Popen(["xdg-open", body.uri], start_new_session=True) + except FileNotFoundError: + try: + subprocess.Popen(["gio", "open", body.uri], start_new_session=True) + except (FileNotFoundError, OSError) as e: + raise HTTPException(status_code=500, detail=str(e)) from e + return StatusResponse(success=True) diff --git a/src/game_setup_hub/app.py b/src/game_setup_hub/app.py deleted file mode 100644 index fb79e75..0000000 --- a/src/game_setup_hub/app.py +++ /dev/null @@ -1,1053 +0,0 @@ -"""ProtonShift — GTK4 application.""" - -from __future__ import annotations - -import subprocess -import sys -from pathlib import Path - -# GI must be imported before other modules that use it -import gi # noqa: I001 - -gi.require_version("Gdk", "4.0") -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") - -from gi.repository import Adw, Gdk, Gio, GLib, Gtk, Pango # noqa: E402 - -from .env_vars import ENV_PRESETS, read_gaming_env, write_gaming_env # noqa: E402 -from .gpu import get_current_power_profile, get_gpu_info, get_power_profiles, set_power_profile # noqa: E402 -from .presets import LAUNCH_PRESETS, LaunchPreset # noqa: E402 -from .heroic import HeroicGame, discover_heroic_games # noqa: E402 -from .lutris import LutrisGame, discover_lutris_games # noqa: E402 -from .protontricks import COMMON_VERBS, is_protontricks_available, run_protontricks # noqa: E402 -from .steam import ( # noqa: E402 - SteamGame, - discover_games, - get_available_proton_tools, - get_localconfig_path, - is_steam_running, -) -from .vdf_config import get_compat_tool, get_launch_options, set_compat_tool, set_launch_options # noqa: E402 -from .profiles_storage import ( # noqa: E402 - ApplicationProfile, - list_profiles, - load_profile, - save_profile as save_profile_to_storage, -) - - -class GameDetailView(Gtk.Box): - """Detail panel for a selected game.""" - - def __init__( - self, - game: SteamGame, - config_path: Path | None, - window: Adw.ApplicationWindow | None = None, - steam_root: Path | None = None, - **kwargs, - ): - super().__init__(orientation=Gtk.Orientation.VERTICAL, **kwargs) - self.game = game - self.config_path = config_path - self._window = window - self._steam_root = steam_root - - content = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10, margin_top=10, margin_bottom=10, margin_start=10, margin_end=10) - - # App ID + Copy - id_row = Adw.ActionRow(title="App ID", subtitle=game.app_id) - copy_btn = Gtk.Button(icon_name="edit-copy-symbolic") - copy_btn.add_css_class("flat") - copy_btn.set_tooltip_text("Copy App ID") - copy_btn.connect("clicked", self._on_copy_app_id) - id_row.add_suffix(copy_btn) - content.append(id_row) - - # Install path - if game.install_path and game.install_path.exists(): - install_row = Adw.ActionRow(title="Install path", subtitle=str(game.install_path)) - open_install_btn = Gtk.Button(label="Open") - open_install_btn.connect("clicked", self._on_open_install_path) - install_row.add_suffix(open_install_btn) - content.append(install_row) - - # Proton version - if config_path and steam_root: - tools = get_available_proton_tools(steam_root) - proton_row = Adw.ComboRow(title="Proton version", subtitle="Force compatibility tool") - proton_model = Gtk.StringList() - for t in tools: - label = "Default" if not t else t.replace("proton_", "Proton ").replace("_", ".") - proton_model.append(label) - proton_row.set_model(proton_model) - current = get_compat_tool(config_path, game.app_id) - if current in tools: - proton_row.set_selected(tools.index(current)) - else: - proton_row.set_selected(0) - proton_row.connect("notify::selected", self._on_proton_changed, config_path) - self._proton_combo = proton_row - content.append(proton_row) - - # Launch options - opts_frame = Gtk.Frame() - opts_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - opts_label = Gtk.Label(label="Launch Options", xalign=0, margin_bottom=10) - opts_label.add_css_class("title-4") - opts_box.append(opts_label) - - self.launch_entry = Gtk.Entry(placeholder_text="e.g. MANGOHUD=1 gamemoderun %command%", hexpand=True) - self.launch_entry.set_activates_default(True) - opts_box.append(self.launch_entry) - - hint = Gtk.Label( - label="Environment variables + %command%. Saved to Steam config.", - wrap=True, xalign=0, margin_top=10, - ) - hint.add_css_class("dim-label") - hint.set_wrap_mode(Pango.WrapMode.WORD_CHAR) - opts_box.append(hint) - - # Launch presets (Phase 4) — horizontal row - preset_row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8) - preset_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8) - for preset in LAUNCH_PRESETS: - btn = Gtk.Button(label=preset.name) - btn.add_css_class("pill") - btn.connect("clicked", self._on_launch_preset, preset) - preset_box.append(btn) - preset_box.set_hexpand(True) - preset_row.append(preset_box) - self._preset_info_btn = Gtk.Button(icon_name="help-about-symbolic") - self._preset_info_btn.add_css_class("flat") - self._preset_info_btn.set_tooltip_text("Preset help & install instructions") - self._preset_info_btn.connect("clicked", self._on_preset_help) - preset_row.append(self._preset_info_btn) - opts_box.append(preset_row) - - opts_frame.set_child(opts_box) - content.append(opts_frame) - - # Buttons - btn_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) - launch_btn = Gtk.Button(label="Launch in Steam") - launch_btn.connect("clicked", self._on_launch_in_steam) - btn_box.append(launch_btn) - self.save_btn = Gtk.Button(label="Save", css_classes=["suggested-action"]) - self.save_btn.connect("clicked", self._on_save) - btn_box.append(self.save_btn) - - if game.compatdata_path and game.compatdata_path.exists(): - open_btn = Gtk.Button(label="Open Prefix Folder") - open_btn.connect("clicked", self._on_open_prefix) - btn_box.append(open_btn) - - if is_protontricks_available(): - pt_btn = Gtk.Button(label="Run Protontricks") - pt_btn.connect("clicked", self._on_run_protontricks) - btn_box.append(pt_btn) - - # Quick install menu - pt_menu = Gtk.MenuButton(label="Quick Install") - popover = Gtk.Popover() - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10, margin_top=10, margin_bottom=10, margin_start=10, margin_end=10) - for verb, desc in COMMON_VERBS: - row = Gtk.Button(label=f"{verb} — {desc}") - row.connect("clicked", self._on_install_verb, verb, popover) - box.append(row) - popover.set_child(box) - pt_menu.set_popover(popover) - btn_box.append(pt_menu) - - profile_menu = Gtk.MenuButton(label="Profiles") - profile_popover = Gtk.Popover() - profile_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6, margin_top=10, margin_bottom=10, margin_start=10, margin_end=10) - save_prof_btn = Gtk.Button(label="Save current as profile") - save_prof_btn.connect("clicked", self._on_save_profile, profile_popover) - load_prof_btn = Gtk.Button(label="Load profile") - load_prof_btn.connect("clicked", self._on_load_profile, profile_popover) - profile_box.append(save_prof_btn) - profile_box.append(load_prof_btn) - profile_popover.set_child(profile_box) - profile_menu.set_popover(profile_popover) - btn_box.append(profile_menu) - - content.append(btn_box) - - scroll = Gtk.ScrolledWindow(vexpand=True, hscrollbar_policy=Gtk.PolicyType.NEVER) - scroll.set_child(content) - self.append(scroll) - self._load_options() - - def _load_options(self): - if self.config_path: - opts = get_launch_options(self.config_path, self.game.app_id) - self.launch_entry.set_text(opts) - - def _on_copy_app_id(self, _btn): - clipboard = Gdk.Display.get_default().get_clipboard() - clipboard.set(self.game.app_id) - self._toast("App ID copied") - - def _on_open_install_path(self, _btn): - if self.game.install_path and self.game.install_path.exists(): - path = str(self.game.install_path) - try: - subprocess.run(["xdg-open", path], check=False) - except FileNotFoundError: - subprocess.run(["gio", "open", path], check=False) - - def _on_launch_in_steam(self, _btn): - try: - subprocess.run(["steam", f"steam://rungameid/{self.game.app_id}"], check=False) - except FileNotFoundError: - self._toast("Steam not found") - - def _on_proton_changed(self, row: Adw.ComboRow, _pspec, config_path: Path): - idx = row.get_selected() - tools = get_available_proton_tools(self._steam_root) - if 0 <= idx < len(tools): - tool = tools[idx] - if set_compat_tool(config_path, self.game.app_id, tool): - self._toast("Proton version saved") - - def _on_save(self, _btn): - if not self.config_path: - self._toast("No Steam config found") - return - if is_steam_running(): - dialog = Adw.MessageDialog( - transient_for=self._window, - heading="Steam is running", - body="Editing localconfig.vdf while Steam is running may cause changes to be lost. Close Steam first for reliable saving, or save anyway.", - ) - dialog.add_response("cancel", "Cancel") - dialog.add_response("save", "Save anyway") - dialog.set_default_response("cancel") - dialog.set_close_response("cancel") - dialog.connect("response", self._on_save_dialog_response) - dialog.present() - return - self._do_save() - - def _on_save_dialog_response(self, dialog: Adw.MessageDialog, response: str): - dialog.destroy() - if response == "save": - self._do_save() - - def _do_save(self): - if not self.config_path: - return - opts = self.launch_entry.get_text().strip() - if set_launch_options(self.config_path, self.game.app_id, opts): - self._toast("Saved") - else: - self._toast("Failed to save") - - def _on_open_prefix(self, _btn): - if self.game.compatdata_path and self.game.compatdata_path.exists(): - path = str(self.game.compatdata_path) - try: - subprocess.run(["xdg-open", path], check=False) - except FileNotFoundError: - subprocess.run(["gio", "open", path], check=False) - - def _on_run_protontricks(self, _btn): - ok, err = run_protontricks(self.game.app_id) - if not ok: - self._toast(err) - - def _on_install_verb(self, _btn, verb: str, popover: Gtk.Popover): - popover.popdown() - ok, err = run_protontricks(self.game.app_id, verb) - if not ok: - self._toast(err) - else: - self._toast(f"Installing {verb}…") - - def _on_launch_preset(self, _btn, preset: LaunchPreset): - """Toggle preset in launch options: add if absent, remove if present.""" - current = self.launch_entry.get_text().strip() - tokens = [t for t in current.split() if t] - # Extract parts before %command% - before_cmd: list[str] = [] - for t in tokens: - if t == "%command%": - break - before_cmd.append(t) - - # Preset identifiers: match by VAR= prefix or exact token - preset_atoms = preset.value.split() - is_present = all( - any( - t.startswith(atom.split("=", 1)[0] + "=") if "=" in atom else t == atom - for t in before_cmd - ) - for atom in preset_atoms - ) - - if is_present: - # Remove all tokens matching the preset - keys_to_remove = { - atom.split("=", 1)[0] + "=" if "=" in atom else atom - for atom in preset_atoms - } - new_tokens = [] - for t in before_cmd: - remove = False - for k in keys_to_remove: - if "=" in k: - if t.startswith(k): - remove = True - break - elif t == k: - remove = True - break - if not remove: - new_tokens.append(t) - new_base = " ".join(new_tokens) - else: - # Adding preset — show install hint if tool not installed - if not preset.is_installed() and preset.install_command: - self._show_preset_install_hint(preset) - # Add preset (dedupe: don't add if any atom already there) - existing_keys = {t.split("=", 1)[0] + "=" for t in before_cmd if "=" in t} - existing_words = {t for t in before_cmd if "=" not in t} - to_add = [] - for atom in preset_atoms: - if "=" in atom: - key = atom.split("=", 1)[0] + "=" - if key not in existing_keys: - to_add.append(atom) - existing_keys.add(key) - else: - if atom not in existing_words: - to_add.append(atom) - existing_words.add(atom) - new_base = " ".join(before_cmd + to_add) if to_add else " ".join(before_cmd) - - result = f"{new_base} %command%".strip() if new_base else "%command%" - self.launch_entry.set_text(result) - - def _show_preset_install_hint(self, preset: LaunchPreset): - """Show install instructions for a preset that isn't installed.""" - msg = f"{preset.name} is not installed.\n\nInstall with:\n{preset.install_command}" - if preset.install_url: - msg += f"\n\nMore info: {preset.install_url}" - dialog = Adw.MessageDialog( - transient_for=self._window, - heading="Install required", - body=msg, - ) - dialog.add_response("copy", "Copy command") - dialog.add_response("close", "Close") - dialog.set_default_response("close") - dialog.set_close_response("close") - dialog.connect("response", lambda d, r: self._on_install_dialog_response(d, r, preset)) - dialog.present() - - def _on_install_dialog_response(self, dialog: Adw.MessageDialog, response: str, preset: LaunchPreset): - if response == "copy" and preset.install_command: - clipboard = Gdk.Display.get_default().get_clipboard() - clipboard.set(preset.install_command) - if self._window and hasattr(self._window, "add_toast"): - self._window.add_toast(Adw.Toast.new("Command copied to clipboard")) - dialog.destroy() - - def _get_current_compat_tool(self) -> str: - if hasattr(self, "_proton_combo") and self._steam_root: - tools = get_available_proton_tools(self._steam_root) - idx = self._proton_combo.get_selected() - if 0 <= idx < len(tools): - return tools[idx] - return "" - - def _on_save_profile(self, _btn, popover: Gtk.Popover): - popover.popdown() - dialog = Adw.MessageDialog( - transient_for=self._window, - heading="Save profile", - body="Enter a name for this profile:", - ) - entry = Gtk.Entry(placeholder_text="Profile name") - entry.set_hexpand(True) - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - box.append(entry) - dialog.set_extra_child(box) - dialog.add_response("cancel", "Cancel") - dialog.add_response("save", "Save") - dialog.set_default_response("save") - dialog.set_close_response("cancel") - - def on_response(d, response: str): - if response == "save": - name = entry.get_text().strip() - if not name: - self._toast("Enter a profile name") - d.destroy() - return - profile = ApplicationProfile( - name=name, - launch_options=self.launch_entry.get_text().strip(), - compat_tool=self._get_current_compat_tool(), - env_vars=read_gaming_env(), - power_profile=get_current_power_profile() or "", - ) - if save_profile_to_storage(profile): - self._toast("Profile saved") - else: - self._toast("Failed to save profile") - d.destroy() - - dialog.connect("response", on_response) - dialog.present() - - def _on_load_profile(self, _btn, popover: Gtk.Popover): - popover.popdown() - names = list_profiles() - if not names: - self._toast("No profiles saved") - return - dialog = Adw.MessageDialog( - transient_for=self._window, - heading="Load profile", - body="Select a profile to apply:", - ) - listbox = Gtk.ListBox(selection_mode=Gtk.SelectionMode.SINGLE) - for n in names: - row = Adw.ActionRow(title=n) - listbox.append(row) - if names: - listbox.select_row(listbox.get_row_at_index(0)) - scrolled = Gtk.ScrolledWindow(max_content_height=200) - scrolled.set_child(listbox) - dialog.set_extra_child(scrolled) - dialog.add_response("cancel", "Cancel") - dialog.add_response("load", "Load") - dialog.set_default_response("load") - dialog.set_close_response("cancel") - - def on_response(d, response: str): - if response == "load": - row = listbox.get_selected_row() - if row and isinstance(row.get_child(), Adw.ActionRow): - name = row.get_child().get_title() - profile = load_profile(name) - if profile: - self.launch_entry.set_text(profile.launch_options) - if profile.compat_tool and hasattr(self, "_proton_combo") and self.config_path and self._steam_root: - tools = get_available_proton_tools(self._steam_root) - if profile.compat_tool in tools: - self._proton_combo.set_selected(tools.index(profile.compat_tool)) - set_compat_tool(self.config_path, self.game.app_id, profile.compat_tool) - if profile.env_vars: - write_gaming_env(profile.env_vars) - if profile.power_profile: - set_power_profile(profile.power_profile) - self._toast("Profile applied. Save to persist launch options.") - else: - self._toast("Failed to load profile") - d.destroy() - - dialog.connect("response", on_response) - dialog.present() - - def _on_preset_help(self, _btn): - """Show preset help popover with descriptions and install instructions.""" - popover = Gtk.Popover() - popover.set_has_arrow(True) - popover.set_autohide(True) - popover.set_parent(getattr(self, "_preset_info_btn", self)) - popover.add_css_class("preset-help-popover") - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=16, margin_top=16, margin_bottom=16, margin_start=20, margin_end=20) - box.set_size_request(440, 380) - title = Gtk.Label(label="Launch preset help") - title.add_css_class("title-3") - title.set_xalign(0) - box.append(title) - for preset in LAUNCH_PRESETS: - frame = Gtk.Frame() - frame.add_css_class("preset-help-card") - inner = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6, margin_top=10, margin_bottom=10, margin_start=12, margin_end=12) - preset_title = Gtk.Label(label=preset.name) - preset_title.add_css_class("title-4") - preset_title.set_xalign(0) - inner.append(preset_title) - desc = Gtk.Label(label=preset.description or "No description.") - desc.set_wrap(True) - desc.set_wrap_mode(Pango.WrapMode.WORD_CHAR) - desc.add_css_class("dim-label") - desc.set_xalign(0) - inner.append(desc) - if preset.install_command: - installed = preset.is_installed() - hint = Gtk.Label( - label="✓ Installed" if installed else f"Install: {preset.install_command}", - ) - hint.add_css_class("caption") - hint.set_xalign(0) - if not installed: - hint.add_css_class("dim-label") - inner.append(hint) - frame.set_child(inner) - box.append(frame) - scrolled = Gtk.ScrolledWindow(vexpand=True, min_content_height=320, max_content_height=480, hscrollbar_policy=Gtk.PolicyType.NEVER) - scrolled.set_child(box) - popover.set_child(scrolled) - popover.popup() - - def _toast(self, msg: str): - toast = Adw.Toast.new(msg) - toast.set_timeout(2) - if self._window and hasattr(self._window, "add_toast"): - self._window.add_toast(toast) - - -class EnvVarsView(Gtk.Box): - """Phase 3: Environment variables editor.""" - - def __init__(self, window: Adw.ApplicationWindow | None = None, **kwargs): - super().__init__(orientation=Gtk.Orientation.VERTICAL, **kwargs) - self._window = window - - content = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10, margin_top=10, margin_bottom=10, margin_start=10, margin_end=10) - content.set_hexpand(True) - content.add_css_class("env-view-content") - - title = Gtk.Label(label="Global Environment Variables") - title.add_css_class("title-1") - title.set_halign(Gtk.Align.CENTER) - content.append(title) - - hint = Gtk.Label( - label="Stored in ~/.config/environment.d/70-protonshift.conf. Logout and login for changes.", - wrap=True, - ) - hint.add_css_class("env-hint") - hint.set_halign(Gtk.Align.CENTER) - hint.set_wrap_mode(Pango.WrapMode.WORD_CHAR) - hint.set_justify(Gtk.Justification.CENTER) - content.append(hint) - - # Presets: all 3 on same line, centered - preset_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) - preset_box.set_halign(Gtk.Align.CENTER) - for name, vars_dict in ENV_PRESETS.items(): - btn = Gtk.Button(label=name) - btn.add_css_class("pill") - btn.connect("clicked", self._on_preset, vars_dict) - preset_box.append(btn) - content.append(preset_box) - - # List of vars: full width - self.listbox = Gtk.ListBox(selection_mode=Gtk.SelectionMode.SINGLE) - current_label = Gtk.Label(label="Current variables:") - current_label.set_halign(Gtk.Align.CENTER) - content.append(current_label) - self._list_frame = Gtk.ScrolledWindow(vexpand=True, hexpand=True, max_content_height=200) - self._list_frame.set_child(self.listbox) - content.append(self._list_frame) - - # Add new + Delete selected - add_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) - add_box.set_halign(Gtk.Align.CENTER) - self.key_entry = Gtk.Entry(placeholder_text="KEY") - self.val_entry = Gtk.Entry(placeholder_text="value") - add_btn = Gtk.Button(label="Add") - add_btn.connect("clicked", self._on_add) - del_btn = Gtk.Button(label="Delete selected") - del_btn.connect("clicked", self._on_delete_selected) - add_box.append(self.key_entry) - add_box.append(self.val_entry) - add_box.append(add_btn) - add_box.append(del_btn) - content.append(add_box) - - scroll = Gtk.ScrolledWindow(vexpand=True, hscrollbar_policy=Gtk.PolicyType.NEVER) - scroll.set_child(content) - self.append(scroll) - self._refresh_list() - - def _refresh_list(self): - while child := self.listbox.get_first_child(): - self.listbox.remove(child) - for k, v in read_gaming_env().items(): - row = Adw.ActionRow(title=k, subtitle=v) - self.listbox.append(row) - - def _on_preset(self, _btn, vars_dict: dict): - current = read_gaming_env() - current.update(vars_dict) - if write_gaming_env(current): - self._refresh_list() - self._toast("Preset applied") - else: - self._toast("Failed to save") - - def _on_add(self, _btn): - k = self.key_entry.get_text().strip() - v = self.val_entry.get_text().strip() - if not k: - return - current = read_gaming_env() - current[k] = v - if write_gaming_env(current): - self.key_entry.set_text("") - self.val_entry.set_text("") - self._refresh_list() - self._toast("Added. Logout/login to apply.") - - def _on_delete_selected(self, _btn): - row = self.listbox.get_selected_row() - if not row or not isinstance(row.get_child(), Adw.ActionRow): - self._toast("Select a variable to delete") - return - key = row.get_child().get_title() - current = read_gaming_env() - if key in current: - del current[key] - if write_gaming_env(current): - self._refresh_list() - self._toast("Deleted. Logout/login to apply.") - else: - self._toast("Failed to save") - - def _toast(self, msg: str): - if self._window and hasattr(self._window, "add_toast"): - self._window.add_toast(Adw.Toast.new(msg)) - - -class SystemView(Gtk.Box): - """Phase 4: GPU info and power profile.""" - - def __init__(self, window: Adw.ApplicationWindow | None = None, **kwargs): - super().__init__(orientation=Gtk.Orientation.VERTICAL, **kwargs) - self._window = window - - content = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=24, margin_top=24, margin_bottom=24, margin_start=24, margin_end=24) - content.add_css_class("system-view-content") - - title = Gtk.Label(label="System") - title.add_css_class("title-1") - title.set_halign(Gtk.Align.CENTER) - content.append(title) - - # GPU card - gpu_frame = Gtk.Frame() - gpu_frame.add_css_class("system-card") - gpu_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8, margin_top=12, margin_bottom=12, margin_start=16, margin_end=16) - gpu_title = Gtk.Label(label="GPU", css_classes=["title-4"]) - gpu_title.set_halign(Gtk.Align.CENTER) - gpu_box.append(gpu_title) - gpus = get_gpu_info() - if gpus: - for gpu in gpus: - desc = f"{gpu.name}" - if gpu.driver: - desc += f" (driver {gpu.driver})" - if gpu.vram_mb: - desc += f" — {gpu.vram_mb} MiB" - lbl = Gtk.Label(label=desc, wrap=True, justify=Gtk.Justification.CENTER) - lbl.set_wrap_mode(Pango.WrapMode.WORD_CHAR) - lbl.set_halign(Gtk.Align.CENTER) - gpu_box.append(lbl) - else: - gpu_box.append(Gtk.Label(label="No GPU info available", css_classes=["dim-label"])) - gpu_frame.set_child(gpu_box) - content.append(gpu_frame) - - # Power profile card - profile_frame = Gtk.Frame() - profile_frame.add_css_class("system-card") - profile_inner = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=16, margin_top=16, margin_bottom=16, margin_start=20, margin_end=20) - profile_label = Gtk.Label(label="Power Profile", css_classes=["title-4"]) - profile_label.set_halign(Gtk.Align.CENTER) - profile_inner.append(profile_label) - current = get_current_power_profile() - profiles = get_power_profiles() - if not profiles: - profiles = ["performance", "balanced", "power-saver"] - profile_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=12) - profile_box.set_halign(Gtk.Align.CENTER) - for p in profiles: - btn = Gtk.Button(label=p.replace("-", " ").title()) - btn.add_css_class("pill") - if current and p.lower() in current.lower(): - btn.add_css_class("suggested-action") - btn.connect("clicked", self._on_power_profile, p) - profile_box.append(btn) - profile_inner.append(profile_box) - profile_frame.set_child(profile_inner) - content.append(profile_frame) - - # MangoHud config - mangohud_btn = Gtk.Button(label="Open MangoHud config folder") - mangohud_btn.connect("clicked", self._on_open_mangohud_config) - mangohud_btn.set_halign(Gtk.Align.CENTER) - content.append(mangohud_btn) - - center_box = Gtk.CenterBox(orientation=Gtk.Orientation.HORIZONTAL) - center_box.set_hexpand(True) - center_box.set_vexpand(True) - center_box.set_center_widget(content) - - scroll = Gtk.ScrolledWindow(vexpand=True, hscrollbar_policy=Gtk.PolicyType.NEVER) - scroll.set_child(center_box) - self.append(scroll) - - def _on_power_profile(self, _btn, profile: str): - ok, msg = set_power_profile(profile) - if self._window and hasattr(self._window, "add_toast"): - self._window.add_toast(Adw.Toast.new(msg if ok else f"Error: {msg}")) - - def _on_open_mangohud_config(self, _btn): - path = Path.home() / ".config" / "MangoHud" - path.mkdir(parents=True, exist_ok=True) - try: - subprocess.run(["xdg-open", str(path)], check=False) - except FileNotFoundError: - subprocess.run(["gio", "open", str(path)], check=False) - - -class HeroicDetailView(Gtk.Box): - """Detail panel for a Heroic game (Epic/GOG).""" - - def __init__(self, game: HeroicGame, window: Adw.ApplicationWindow | None = None, **kwargs): - super().__init__(orientation=Gtk.Orientation.VERTICAL, **kwargs) - self.game = game - self._window = window - - content = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10, margin_top=10, margin_bottom=10, margin_start=10, margin_end=10) - - content.append(Adw.ActionRow(title="Store", subtitle=game.store.upper())) - content.append(Adw.ActionRow(title="App ID", subtitle=game.app_id)) - - if game.prefix_path and game.prefix_path.exists(): - open_btn = Gtk.Button(label="Open Prefix Folder", css_classes=["suggested-action"]) - open_btn.connect("clicked", self._on_open_prefix) - content.append(open_btn) - - hint = Gtk.Label( - label="Launch and configure this game from Heroic Games Launcher.", - wrap=True, xalign=0, margin_top=10, - ) - hint.add_css_class("dim-label") - hint.set_wrap_mode(Pango.WrapMode.WORD_CHAR) - content.append(hint) - - scroll = Gtk.ScrolledWindow(vexpand=True, hscrollbar_policy=Gtk.PolicyType.NEVER) - scroll.set_child(content) - self.append(scroll) - - def _on_open_prefix(self, _btn): - if self.game.prefix_path and self.game.prefix_path.exists(): - path = str(self.game.prefix_path) - try: - subprocess.run(["xdg-open", path], check=False) - except FileNotFoundError: - subprocess.run(["gio", "open", path], check=False) - - -class LutrisDetailView(Gtk.Box): - """Detail panel for a Lutris game.""" - - def __init__(self, game: LutrisGame, window: Adw.ApplicationWindow | None = None, **kwargs): - super().__init__(orientation=Gtk.Orientation.VERTICAL, **kwargs) - self.game = game - self._window = window - - content = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10, margin_top=10, margin_bottom=10, margin_start=10, margin_end=10) - - content.append(Adw.ActionRow(title="Source", subtitle="Lutris")) - content.append(Adw.ActionRow(title="Slug", subtitle=game.app_id)) - - if game.install_path and game.install_path.exists(): - row = Adw.ActionRow(title="Install path", subtitle=str(game.install_path)) - open_btn = Gtk.Button(label="Open") - open_btn.connect("clicked", self._on_open_install_path) - row.add_suffix(open_btn) - content.append(row) - - if game.prefix_path and game.prefix_path.exists(): - open_btn = Gtk.Button(label="Open Prefix Folder", css_classes=["suggested-action"]) - open_btn.connect("clicked", self._on_open_prefix) - content.append(open_btn) - - hint = Gtk.Label( - label="Launch and configure this game from Lutris.", - wrap=True, xalign=0, margin_top=10, - ) - hint.add_css_class("dim-label") - hint.set_wrap_mode(Pango.WrapMode.WORD_CHAR) - content.append(hint) - - scroll = Gtk.ScrolledWindow(vexpand=True, hscrollbar_policy=Gtk.PolicyType.NEVER) - scroll.set_child(content) - self.append(scroll) - - def _on_open_install_path(self, _btn): - if self.game.install_path and self.game.install_path.exists(): - path = str(self.game.install_path) - try: - subprocess.run(["xdg-open", path], check=False) - except FileNotFoundError: - subprocess.run(["gio", "open", path], check=False) - - def _on_open_prefix(self, _btn): - if self.game.prefix_path and self.game.prefix_path.exists(): - path = str(self.game.prefix_path) - try: - subprocess.run(["xdg-open", path], check=False) - except FileNotFoundError: - subprocess.run(["gio", "open", path], check=False) - - -class GameRow(Gtk.ListBoxRow): - """Row for game list.""" - - def __init__(self, game: SteamGame | HeroicGame | LutrisGame, **kwargs): - super().__init__(**kwargs) - self.game = game - if isinstance(game, HeroicGame): - subtitle = f"{game.store.upper()} · {game.app_id}" - elif isinstance(game, LutrisGame): - subtitle = f"Lutris · {game.app_id}" - else: - subtitle = f"Steam · App ID: {game.app_id}" - row = Adw.ActionRow(title=game.name, subtitle=subtitle) - row.set_activatable(True) - self.set_child(row) - - -class GameSetupHubWindow(Adw.ApplicationWindow): - """Main application window.""" - - def __init__(self, app: Adw.Application, **kwargs): - super().__init__(application=app, **kwargs) - self.set_default_size(700, 500) - self.set_title("ProtonShift") - self.steam_root: Path | None = None - self.config_path: Path | None = None - self.games: list[SteamGame | HeroicGame | LutrisGame] = [] - self.toast_overlay = Adw.ToastOverlay() - - self._build_ui() - - def _build_ui(self): - self.toast_overlay.set_child(self._build_main()) - self.set_content(self.toast_overlay) - - def _build_main(self) -> Gtk.Widget: - self.top_stack = Gtk.Stack(vexpand=True) - - # Loading - loading = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER) - sp = Gtk.Spinner(spinning=True) - sp.set_size_request(48, 48) - loading.append(sp) - load_label = Gtk.Label(label="Scanning libraries…") - load_label.add_css_class("title-4") - loading.append(load_label) - self.top_stack.add_named(loading, "loading") - - self.view_stack = Adw.ViewStack(vexpand=True) - - # Games view - self.main_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) - self.main_box.set_hexpand(True) - self.main_box.set_vexpand(True) - self.main_box.set_margin_top(10) - self.main_box.set_margin_bottom(10) - self.main_box.set_margin_start(10) - self.main_box.set_margin_end(10) - - list_panel = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - list_panel.set_size_request(280, -1) - list_frame = Gtk.Frame() - list_frame.add_css_class("game-list-frame") - list_inner = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) - search = Gtk.SearchEntry(placeholder_text="Search games…") - search.add_css_class("game-list-search") - search.connect("search-changed", self._on_search_changed) - list_inner.append(search) - list_scroll = Gtk.ScrolledWindow(vexpand=True, hscrollbar_policy=Gtk.PolicyType.NEVER) - self.listbox = Gtk.ListBox(selection_mode=Gtk.SelectionMode.SINGLE, vexpand=True) - self.listbox.connect("row-activated", self._on_game_selected) - list_scroll.set_child(self.listbox) - list_inner.append(list_scroll) - list_frame.set_child(list_inner) - list_panel.append(list_frame) - - self.main_box.append(list_panel) - - self.detail_stack = Gtk.Stack() - placeholder = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER) - placeholder.set_hexpand(True) - placeholder.set_vexpand(True) - ph_label = Gtk.Label(label="Select a game") - ph_label.add_css_class("placeholder-title") - placeholder.append(ph_label) - self.detail_stack.add_named(placeholder, "placeholder") - self.main_box.append(self.detail_stack) - - self.view_stack.add_titled_with_icon( - self.main_box, "games", "Games", "applications-games-symbolic" - ) - - # Environment view (Phase 3) - env_view = EnvVarsView(window=self) - self.view_stack.add_titled_with_icon( - env_view, "env", "Environment", "applications-science-symbolic" - ) - - # System view (Phase 4) - sys_view = SystemView(window=self) - self.view_stack.add_titled_with_icon( - sys_view, "system", "System", "computer-symbolic" - ) - - # Toolbar with view switcher and menu - toolbar = Adw.ToolbarView() - header = Adw.HeaderBar() - switcher = Adw.ViewSwitcher(stack=self.view_stack, policy=Adw.ViewSwitcherPolicy.WIDE) - header.set_title_widget(switcher) - menu_btn = Gtk.MenuButton(icon_name="open-menu-symbolic") - menu_btn.set_tooltip_text("Menu") - menu = Gio.Menu.new() - menu.append("About", "app.about") - menu.append("Keyboard Shortcuts", "win.shortcuts") - popover = Gtk.PopoverMenu(menu_model=menu) - menu_btn.set_popover(popover) - header.pack_end(menu_btn) - toolbar.add_top_bar(header) - toolbar.set_content(self.view_stack) - - self.top_stack.add_named(toolbar, "main") - - GLib.idle_add(self._load_games) - return self.top_stack - - def _load_games(self): - steam_root, steam_games = discover_games() - self.steam_root = steam_root - if steam_root: - self.config_path = get_localconfig_path(steam_root) - heroic_games = discover_heroic_games() - lutris_games = discover_lutris_games() - # Steam by last_played; Heroic and Lutris by name - heroic_sorted = sorted(heroic_games, key=lambda g: g.name.lower()) - lutris_sorted = sorted(lutris_games, key=lambda g: g.name.lower()) - self.games = list(steam_games) + heroic_sorted + lutris_sorted - self._populate_list(self.games) - self.top_stack.set_visible_child_name("main") - - def _populate_list(self, games: list[SteamGame | HeroicGame | LutrisGame]): - # Clear - while child := self.listbox.get_first_child(): - self.listbox.remove(child) - for game in games: - self.listbox.append(GameRow(game)) - - def _on_search_changed(self, entry: Gtk.SearchEntry): - query = entry.get_text().strip().lower() - if not query: - self._populate_list(self.games) - else: - filtered = [g for g in self.games if query in g.name.lower() or query in g.app_id] - self._populate_list(filtered) - - def _on_game_selected(self, _listbox: Gtk.ListBox, row: Gtk.ListBoxRow): - if not isinstance(row, GameRow): - return - game = row.game - if isinstance(game, HeroicGame): - detail = HeroicDetailView(game, window=self) - key = f"heroic-{game.app_id}" - elif isinstance(game, LutrisGame): - detail = LutrisDetailView(game, window=self) - key = f"lutris-{game.app_id}" - else: - detail = GameDetailView( - game, self.config_path, window=self, steam_root=self.steam_root - ) - key = f"steam-{game.app_id}" - if old := self.detail_stack.get_child_by_name(key): - self.detail_stack.remove(old) - self.detail_stack.add_named(detail, key) - self.detail_stack.set_visible_child_name(key) - - def add_toast(self, toast: Adw.Toast): - self.toast_overlay.add_toast(toast) - - def add_shortcuts(self): - shortcut_action = Gio.SimpleAction.new("shortcuts", None) - shortcut_action.connect("activate", self._on_shortcuts) - self.add_action(shortcut_action) - self.get_application().set_accels_for_action("win.shortcuts", ["question"]) - self.get_application().set_accels_for_action("app.quit", ["q"]) - - def _on_shortcuts(self, _action, _param): - try: - sw = Adw.ShortcutsDialog(transient_for=self) - section = Adw.ShortcutsSection(title="General") - section.add(Adw.ShortcutsItem(title="Keyboard Shortcuts", accelerator="question")) - section.add(Adw.ShortcutsItem(title="Quit", accelerator="q")) - sw.add(section) - sw.present() - except (AttributeError, TypeError): - dialog = Adw.MessageDialog( - transient_for=self, - heading="Keyboard Shortcuts", - body="Ctrl+? — Keyboard Shortcuts\nCtrl+Q — Quit", - ) - dialog.add_response("ok", "OK") - dialog.connect("response", lambda d, _: d.destroy()) - dialog.present() - - -def _load_theme(): - """Load futuristic theme CSS.""" - css_path = Path(__file__).resolve().parent / "theme.css" - if not css_path.exists(): - return - try: - provider = Gtk.CssProvider() - provider.load_from_path(str(css_path)) - display = Gdk.Display.get_default() - if display: - Gtk.StyleContext.add_provider_for_display( - display, provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION - ) - except Exception: - pass - - -def main(): - app = Adw.Application(application_id="io.github.protonshift", flags=Gio.ApplicationFlags.FLAGS_NONE) - - def on_about(_action, _param): - win = app.get_active_window() - about = Adw.AboutWindow( - transient_for=win, - application_name="ProtonShift", - version="0.8.8", - developer_name="ProtonShift", - website="https://github.com/protonshift/protonshift", - application_icon="io.github.protonshift", - ) - about.present() - - def on_activate(a): - _load_theme() - Adw.StyleManager.get_default().set_color_scheme(Adw.ColorScheme.FORCE_DARK) - win = GameSetupHubWindow(a) - win.add_shortcuts() - win.present() - - about_action = Gio.SimpleAction.new("about", None) - about_action.connect("activate", on_about) - app.add_action(about_action) - app.connect("activate", on_activate) - return app.run(sys.argv) diff --git a/src/game_setup_hub/controllers.py b/src/game_setup_hub/controllers.py index 3910535..3de3a28 100644 --- a/src/game_setup_hub/controllers.py +++ b/src/game_setup_hub/controllers.py @@ -3,6 +3,7 @@ from __future__ import annotations import re +import struct from dataclasses import dataclass from pathlib import Path @@ -12,9 +13,11 @@ class ControllerInfo: id: str name: str device_path: str - controller_type: str # "xbox", "playstation", "nintendo", "generic" + controller_type: str # "xbox", "playstation", "nintendo", "8bitdo", "steam", "generic" vendor_id: str = "" product_id: str = "" + bus_type: str = "" + version: str = "" def _classify_controller(name: str) -> str: @@ -52,8 +55,10 @@ def get_controllers() -> list[ControllerInfo]: name = "" handlers = "" + bus = "" vendor = "" product = "" + version = "" is_joystick = False for line in block.splitlines(): @@ -64,12 +69,14 @@ def get_controllers() -> list[ControllerInfo]: if "js" in handlers: is_joystick = True elif line.startswith("I:"): - v_match = re.search(r"Vendor=([0-9a-fA-F]+)", line) - p_match = re.search(r"Product=([0-9a-fA-F]+)", line) - if v_match: - vendor = v_match.group(1) - if p_match: - product = p_match.group(1) + if (m := re.search(r"Bus=([0-9a-fA-F]+)", line)): + bus = m.group(1) + if (m := re.search(r"Vendor=([0-9a-fA-F]+)", line)): + vendor = m.group(1) + if (m := re.search(r"Product=([0-9a-fA-F]+)", line)): + product = m.group(1) + if (m := re.search(r"Version=([0-9a-fA-F]+)", line)): + version = m.group(1) if not is_joystick or not name: continue @@ -85,13 +92,26 @@ def get_controllers() -> list[ControllerInfo]: controller_type=_classify_controller(name), vendor_id=vendor, product_id=product, + bus_type=bus, + version=version, )) return controllers +def _read_sysfs_id(js_name: str, key: str) -> str: + """Read a hex id from /sys/class/input//device/id/.""" + p = Path(f"/sys/class/input/{js_name}/device/id/{key}") + if not p.exists(): + return "" + try: + return p.read_text(encoding="utf-8").strip() + except OSError: + return "" + + def _get_controllers_from_js() -> list[ControllerInfo]: - """Fallback: detect from /dev/input/js* devices.""" + """Fallback: detect from /dev/input/js* devices via sysfs.""" controllers: list[ControllerInfo] = [] input_dir = Path("/dev/input") if not input_dir.exists(): @@ -111,25 +131,62 @@ def _get_controllers_from_js() -> list[ControllerInfo]: name=name, device_path=str(js_path), controller_type=_classify_controller(name), + vendor_id=_read_sysfs_id(js_path.name, "vendor"), + product_id=_read_sysfs_id(js_path.name, "product"), + bus_type=_read_sysfs_id(js_path.name, "bustype"), + version=_read_sysfs_id(js_path.name, "version"), )) return controllers -def get_sdl_mapping(controller: ControllerInfo) -> str: +def _build_sdl_guid(bus: str, vendor: str, product: str, version: str) -> str: + """Build a 32-char SDL2 joystick GUID for a Linux device. + + Format (little-endian, 16 bytes): bus(2) | crc(2)=0 | vendor(2) | 0000 | + product(2) | 0000 | version(2) | 0000 + + Returns 32 lowercase hex chars. Empty/invalid inputs default to ``0``. """ - Generate an SDL_GAMECONTROLLERCONFIG entry for a controller. - This is a basic GUID-based stub; full calibration requires user input. + def _hex16(value: str) -> int: + try: + return int(value, 16) & 0xFFFF + except ValueError: + return 0 + + blob = struct.pack( + " str: + """Generate an SDL_GAMECONTROLLERCONFIG entry for a controller. + + Uses the canonical 16-byte little-endian SDL2 GUID layout so the entry + actually matches the device when SDL parses it. The button mapping body + is a generic Xbox-style starting point; users should re-calibrate via a + tool like ``sdl2-jstest`` for accuracy. """ - guid = f"{controller.vendor_id:>04s}{controller.product_id:>04s}".replace(" ", "0") - if len(guid) < 8: - guid = guid.ljust(32, "0") - else: - guid = guid.ljust(32, "0") - - # Standard Xbox-style mapping as a starting point - mapping = ( - f"{guid},{controller.name}," + guid = _build_sdl_guid( + controller.bus_type or "0003", # USB if unknown + controller.vendor_id, + controller.product_id, + controller.version, + ) + + name = controller.name.replace(",", " ") # SDL mapping fields are comma-delimited + + return ( + f"{guid},{name}," "a:b0,b:b1,x:b2,y:b3," "back:b6,start:b7,guide:b8," "leftshoulder:b4,rightshoulder:b5," @@ -139,4 +196,3 @@ def get_sdl_mapping(controller: ControllerInfo) -> str: "lefttrigger:a2,righttrigger:a5," "platform:Linux," ) - return mapping diff --git a/src/game_setup_hub/display.py b/src/game_setup_hub/display.py index 3901a5f..6121c23 100644 --- a/src/game_setup_hub/display.py +++ b/src/game_setup_hub/display.py @@ -159,14 +159,34 @@ def get_monitors() -> list[MonitorInfo]: return monitors +# Output names emitted by xrandr/wlr-randr are short identifiers like +# ``HDMI-1`` or ``DP-2``. Anything outside this shape is rejected before +# ever reaching the xrandr command line so an attacker who can call the +# /display/resolution endpoint cannot inject extra args. +_MONITOR_NAME_RE = re.compile(r"^[A-Za-z0-9._\-]{1,32}$") +_MAX_DIMENSION = 16384 # 16k — comfortably above any real display + + def set_resolution(monitor: str, width: int, height: int, refresh: float = 0) -> bool: """Set resolution for a monitor using xrandr. Returns True on success.""" + if not _MONITOR_NAME_RE.match(monitor): + return False + # Whitelist against actually-detected monitors. Even if the regex is wrong + # this stops xrandr being driven against a name that isn't on the system. + known_names = {m.name for m in get_monitors()} + if known_names and monitor not in known_names: + return False + if not (0 < width <= _MAX_DIMENSION and 0 < height <= _MAX_DIMENSION): + return False + if not (0 <= refresh <= 1000): + return False + xrandr = find_tool("xrandr") if not xrandr: return False cmd = [xrandr, "--output", monitor, "--mode", f"{width}x{height}"] if refresh > 0: - cmd.extend(["--rate", str(refresh)]) + cmd.extend(["--rate", f"{refresh:g}"]) try: result = subprocess.run(cmd, capture_output=True, timeout=5) return result.returncode == 0 diff --git a/src/game_setup_hub/env_vars.py b/src/game_setup_hub/env_vars.py index bafd922..9aaae31 100644 --- a/src/game_setup_hub/env_vars.py +++ b/src/game_setup_hub/env_vars.py @@ -5,6 +5,8 @@ import re from pathlib import Path +from .fsutil import atomic_write_text + ENV_D_DIR = Path.home() / ".config" / "environment.d" GAMING_CONF = "70-protonshift.conf" @@ -47,9 +49,8 @@ def read_conf(path: Path) -> dict[str, str]: def write_conf(path: Path, vars_dict: dict[str, str], header: str = "") -> bool: - """Write KEY=value pairs to a .conf file.""" - path.parent.mkdir(parents=True, exist_ok=True) - lines = [] + """Write KEY=value pairs to a .conf file atomically.""" + lines: list[str] = [] if header: for h in header.strip().split("\n"): lines.append(f"# {h}" if not h.startswith("#") else h) @@ -60,8 +61,7 @@ def write_conf(path: Path, vars_dict: dict[str, str], header: str = "") -> bool: escaped = str(v).replace("\\", "\\\\").replace('"', '\\"') lines.append(f'{k}="{escaped}"') try: - with open(path, "w", encoding="utf-8", newline="\n") as f: - f.write("\n".join(lines) + "\n") + atomic_write_text(path, "\n".join(lines) + "\n") except OSError: return False return True diff --git a/src/game_setup_hub/fixes.py b/src/game_setup_hub/fixes.py index 74d7e18..ab10ba9 100644 --- a/src/game_setup_hub/fixes.py +++ b/src/game_setup_hub/fixes.py @@ -7,10 +7,17 @@ from pathlib import Path from typing import Any +from .fsutil import atomic_write_text +from .paths import sanitize_filename + _DATA_DIR = Path(__file__).parent / "data" _USER_FIXES_DIR = Path.home() / ".config" / "protonshift" / "fixes" +def _user_fixes_path(app_id: str) -> Path: + return _USER_FIXES_DIR / f"{sanitize_filename(app_id, fallback='unknown')}.json" + + @dataclass class GameFix: title: str @@ -32,7 +39,7 @@ def _load_builtin_fixes() -> dict[str, list[dict[str, Any]]]: def _load_user_fixes(app_id: str) -> list[dict[str, Any]]: - path = _USER_FIXES_DIR / f"{app_id}.json" + path = _user_fixes_path(app_id) if not path.exists(): return [] try: @@ -80,7 +87,7 @@ def add_user_fix( ) -> bool: """Add a user-contributed fix for a game. Returns True on success.""" _USER_FIXES_DIR.mkdir(parents=True, exist_ok=True) - path = _USER_FIXES_DIR / f"{app_id}.json" + path = _user_fixes_path(app_id) existing = _load_user_fixes(app_id) existing.append({ @@ -92,7 +99,7 @@ def add_user_fix( }) try: - path.write_text(json.dumps(existing, indent=2), encoding="utf-8") + atomic_write_text(path, json.dumps(existing, indent=2)) return True except OSError: return False diff --git a/src/game_setup_hub/fsutil.py b/src/game_setup_hub/fsutil.py new file mode 100644 index 0000000..0db9f45 --- /dev/null +++ b/src/game_setup_hub/fsutil.py @@ -0,0 +1,104 @@ +"""Shared filesystem helpers — directory sizing, human-readable sizes, atomic writes.""" + +from __future__ import annotations + +import os +import tempfile +from pathlib import Path + + +def dir_size(path: Path, *, follow_symlinks: bool = False) -> int: + """Recursively compute directory size in bytes. + + Symlinks are skipped by default to avoid infinite loops and double-counting. + Errors on individual files are silently ignored — a partial size is more + useful than an exception in UI-facing code. + """ + total = 0 + try: + for entry in path.rglob("*"): + if not follow_symlinks and entry.is_symlink(): + continue + if entry.is_file(): + try: + total += entry.stat().st_size if follow_symlinks else entry.lstat().st_size + except OSError: + continue + except OSError: + return total + return total + + +def human_size(size_bytes: float) -> str: + """Format a byte count as a 1-decimal-place human-readable string.""" + size = float(size_bytes) + for unit in ("B", "KB", "MB", "GB", "TB"): + if abs(size) < 1024: + return f"{size:.1f} {unit}" + size /= 1024 + return f"{size:.1f} PB" + + +def atomic_write_text( + path: Path, + data: str, + *, + encoding: str = "utf-8", + newline: str = "\n", +) -> None: + """Atomically replace ``path`` with ``data`` via a tempfile in the same dir. + + Crash-safety: writes to ``..tmp`` in the same directory, fsyncs, + then ``os.replace``\\s onto the target. The same-directory requirement is + what makes ``rename`` atomic on POSIX. Parent directories are created. + """ + path.parent.mkdir(parents=True, exist_ok=True) + fd, tmp_name = tempfile.mkstemp( + prefix=f".{path.name}.", + suffix=".tmp", + dir=str(path.parent), + ) + tmp_path = Path(tmp_name) + try: + with os.fdopen(fd, "w", encoding=encoding, newline=newline) as f: + f.write(data) + f.flush() + try: + os.fsync(f.fileno()) + except OSError: + # Some filesystems (tmpfs, network mounts) don't support fsync; + # the write is still durable enough for our config files. + pass + os.replace(tmp_path, path) + except Exception: + try: + tmp_path.unlink(missing_ok=True) + except OSError: + pass + raise + + +def atomic_write_bytes(path: Path, data: bytes) -> None: + """Atomic binary equivalent of :func:`atomic_write_text`.""" + path.parent.mkdir(parents=True, exist_ok=True) + fd, tmp_name = tempfile.mkstemp( + prefix=f".{path.name}.", + suffix=".tmp", + dir=str(path.parent), + ) + tmp_path = Path(tmp_name) + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + f.flush() + try: + os.fsync(f.fileno()) + except OSError: + pass + os.replace(tmp_path, path) + except Exception: + try: + tmp_path.unlink(missing_ok=True) + except OSError: + pass + raise diff --git a/src/game_setup_hub/gamescope.py b/src/game_setup_hub/gamescope.py index bcf31b8..dbf32c1 100644 --- a/src/game_setup_hub/gamescope.py +++ b/src/game_setup_hub/gamescope.py @@ -2,6 +2,7 @@ from __future__ import annotations +import shlex from dataclasses import dataclass from game_setup_hub.tool_check import is_tool_available @@ -29,9 +30,14 @@ def is_gamescope_available() -> bool: return is_tool_available("gamescope") -def build_gamescope_cmd(opts: GamescopeOptions) -> str: - """Build a gamescope command string from options.""" - parts = ["gamescope"] +def build_gamescope_argv(opts: GamescopeOptions) -> list[str]: + """Build a gamescope argv list from options. + + `extra_args` is parsed via :func:`shlex.split` so quoted segments and + escapes are preserved correctly. The trailing ``--`` separator is always + appended so the caller can append the wrapped command directly. + """ + parts: list[str] = ["gamescope"] if opts.output_width > 0 and opts.output_height > 0: parts.extend(["-w", str(opts.output_width), "-h", str(opts.output_height)]) @@ -43,8 +49,7 @@ def build_gamescope_cmd(opts: GamescopeOptions) -> str: parts.extend(["-r", str(opts.fps_limit)]) if opts.fsr: - parts.append("--fsr-sharpness") - parts.append(str(max(0, min(20, opts.fsr_sharpness)))) + parts.extend(["--fsr-sharpness", str(max(0, min(20, opts.fsr_sharpness)))]) if opts.integer_scale: parts.append("--integer-scale") @@ -58,9 +63,22 @@ def build_gamescope_cmd(opts: GamescopeOptions) -> str: if opts.borderless: parts.append("-b") - if opts.extra_args: - parts.append(opts.extra_args.strip()) + if opts.extra_args.strip(): + try: + parts.extend(shlex.split(opts.extra_args)) + except ValueError: + # unbalanced quotes — fall back to whitespace split so the user + # at least sees something instead of silent loss + parts.extend(opts.extra_args.split()) parts.append("--") + return parts + + +def build_gamescope_cmd(opts: GamescopeOptions) -> str: + """Build a shell-safe gamescope command string from options. - return " ".join(parts) + Returned value is suitable for copy/paste into a launch options field. + Use :func:`build_gamescope_argv` when actually exec-ing the command. + """ + return shlex.join(build_gamescope_argv(opts)) diff --git a/src/game_setup_hub/gpu.py b/src/game_setup_hub/gpu.py index 283b908..a25c09c 100644 --- a/src/game_setup_hub/gpu.py +++ b/src/game_setup_hub/gpu.py @@ -108,18 +108,20 @@ def get_power_profiles() -> list[str]: if r is not None and r.returncode == 0 and r.stdout.strip(): return ["battery", "balanced", "performance"] - # power-profiles-daemon (Ubuntu) + # power-profiles-daemon (Ubuntu/Fedora). `powerprofilesctl list` prints + # one block per profile; the active one is prefixed with `*`. We want + # every profile name, not just the active one. Each block starts with + # `[* ]:` at column 0. try: r = subprocess.run(["powerprofilesctl", "list"], capture_output=True, text=True, timeout=3) if r.returncode == 0: - profiles = [] - for line in r.stdout.split("\n"): - if "*" in line: - m = re.search(r"[\*]\s*([\w-]+)", line) - if m: - profiles.append(m.group(1)) + profiles = [ + m.group(1) + for line in r.stdout.splitlines() + if (m := re.match(r"^\s*\*?\s*([\w-]+):\s*$", line)) + ] if profiles: - return ["performance", "balanced", "power-saver"] + return profiles except FileNotFoundError: pass diff --git a/src/game_setup_hub/heroic.py b/src/game_setup_hub/heroic.py index 483ec91..4ad70ce 100644 --- a/src/game_setup_hub/heroic.py +++ b/src/game_setup_hub/heroic.py @@ -6,7 +6,6 @@ from dataclasses import dataclass from pathlib import Path - HEROIC_ROOTS = [ Path.home() / ".config" / "heroic", Path.home() / ".var" / "app" / "com.heroicgameslauncher.hgl" / "config" / "heroic", @@ -27,13 +26,18 @@ def compatdata_path(self) -> Path | None: return self.prefix_path -def _resolve_heroic_root() -> Path | None: +def resolve_heroic_root() -> Path | None: + """Return the first existing Heroic config root (native or Flatpak).""" for root in HEROIC_ROOTS: if root.exists(): return root return None +# Backwards compatibility alias for older imports. +_resolve_heroic_root = resolve_heroic_root + + def _discover_epic_games(heroic_root: Path) -> list[HeroicGame]: """Discover Epic (Legendary) installed games.""" installed = heroic_root / "legendaryConfig" / "legendary" / "installed.json" @@ -171,7 +175,7 @@ def _discover_gog_games(heroic_root: Path) -> list[HeroicGame]: def discover_heroic_games() -> list[HeroicGame]: """Discover all Heroic installed games (Epic + GOG).""" - root = _resolve_heroic_root() + root = resolve_heroic_root() if not root: return [] games = _discover_epic_games(root) + _discover_gog_games(root) diff --git a/src/game_setup_hub/heroic_config.py b/src/game_setup_hub/heroic_config.py index cea17f9..4c77552 100644 --- a/src/game_setup_hub/heroic_config.py +++ b/src/game_setup_hub/heroic_config.py @@ -7,7 +7,9 @@ from pathlib import Path from typing import Any -from .heroic import _resolve_heroic_root +from .fsutil import atomic_write_text +from .heroic import resolve_heroic_root +from .paths import sanitize_filename @dataclass @@ -37,17 +39,21 @@ class HeroicGameConfig: def _get_games_config_dir() -> Path | None: - root = _resolve_heroic_root() + root = resolve_heroic_root() if not root: return None return root / "GamesConfig" +def _config_file_for(app_id: str, cfg_dir: Path) -> Path: + return cfg_dir / f"{sanitize_filename(app_id, fallback='unknown')}.json" + + def _read_config_file(app_id: str) -> dict[str, Any] | None: cfg_dir = _get_games_config_dir() if not cfg_dir or not cfg_dir.exists(): return None - cfg_file = cfg_dir / f"{app_id}.json" + cfg_file = _config_file_for(app_id, cfg_dir) if not cfg_file.exists(): return None try: @@ -67,7 +73,7 @@ def _write_config_file(app_id: str, config: dict[str, Any]) -> bool: if not cfg_dir: return False cfg_dir.mkdir(parents=True, exist_ok=True) - cfg_file = cfg_dir / f"{app_id}.json" + cfg_file = _config_file_for(app_id, cfg_dir) existing: dict[str, Any] = {} if cfg_file.exists(): @@ -83,8 +89,7 @@ def _write_config_file(app_id: str, config: dict[str, Any]) -> bool: existing[app_id] = config try: - with open(cfg_file, "w", encoding="utf-8") as f: - json.dump(existing, f, indent=2) + atomic_write_text(cfg_file, json.dumps(existing, indent=2)) return True except OSError: return False @@ -169,7 +174,7 @@ class HeroicWineVersionInfo: def list_heroic_wine_versions() -> list[HeroicWineVersionInfo]: - root = _resolve_heroic_root() + root = resolve_heroic_root() if not root: return [] diff --git a/src/game_setup_hub/logging_setup.py b/src/game_setup_hub/logging_setup.py new file mode 100644 index 0000000..3a53194 --- /dev/null +++ b/src/game_setup_hub/logging_setup.py @@ -0,0 +1,40 @@ +"""Logging configuration for the ProtonShift backend. + +Centralised so every entry point (api server, tests, ad-hoc scripts) gets +the same format. Honors ``PROTONSHIFT_LOG_LEVEL`` (default ``INFO``). +""" + +from __future__ import annotations + +import logging +import os +import sys + + +def configure(level: str | None = None) -> None: + """Configure root logging once. Idempotent.""" + chosen = (level or os.environ.get("PROTONSHIFT_LOG_LEVEL") or "INFO").upper() + numeric = getattr(logging, chosen, logging.INFO) + + root = logging.getLogger() + if getattr(configure, "_done", False): + root.setLevel(numeric) + return + + handler = logging.StreamHandler(stream=sys.stderr) + handler.setFormatter( + logging.Formatter("%(asctime)s %(levelname)-7s %(name)s: %(message)s") + ) + root.addHandler(handler) + root.setLevel(numeric) + + # Tame noisy 3rd-party loggers. + for noisy in ("uvicorn.access", "uvicorn.error"): + logging.getLogger(noisy).setLevel(logging.WARNING) + + configure._done = True # type: ignore[attr-defined] + + +def get_logger(name: str) -> logging.Logger: + """Module-level helper so callers don't need to import :mod:`logging`.""" + return logging.getLogger(name) diff --git a/src/game_setup_hub/lutris.py b/src/game_setup_hub/lutris.py index 66d901b..c1bd01f 100644 --- a/src/game_setup_hub/lutris.py +++ b/src/game_setup_hub/lutris.py @@ -7,7 +7,6 @@ from dataclasses import dataclass from pathlib import Path - LUTRIS_ROOTS = [ Path.home() / ".local" / "share" / "lutris", Path.home() / ".var" / "app" / "net.lutris.Lutris" / "data" / "lutris", diff --git a/src/game_setup_hub/mangohud.py b/src/game_setup_hub/mangohud.py index df411bd..5bb8673 100644 --- a/src/game_setup_hub/mangohud.py +++ b/src/game_setup_hub/mangohud.py @@ -4,6 +4,8 @@ from pathlib import Path +from game_setup_hub.fsutil import atomic_write_text +from game_setup_hub.paths import sanitize_filename from game_setup_hub.tool_check import is_tool_available MANGOHUD_CONFIG_DIR = Path.home() / ".config" / "MangoHud" @@ -195,10 +197,9 @@ def read_mangohud_config(path: Path | None = None) -> dict[str, str]: def write_mangohud_config(config: dict[str, str], path: Path | None = None) -> bool: - """Write a MangoHud config file from key-value pairs.""" + """Write a MangoHud config file from key-value pairs (atomic).""" if path is None: path = MANGOHUD_GLOBAL_CONF - path.parent.mkdir(parents=True, exist_ok=True) lines: list[str] = [] for key, value in config.items(): if value: @@ -206,15 +207,19 @@ def write_mangohud_config(config: dict[str, str], path: Path | None = None) -> b else: lines.append(key) try: - path.write_text("\n".join(lines) + "\n", encoding="utf-8") + atomic_write_text(path, "\n".join(lines) + "\n") return True except OSError: return False def get_per_game_config_path(game_name: str) -> Path: - """Get the per-game config path for MangoHud.""" - safe_name = game_name.replace(" ", "_").replace("/", "_").replace("\\", "_") + """Get the per-game config path for MangoHud. + + The supplied ``game_name`` is sanitised — ``..`` and slashes are stripped + so callers cannot escape :data:`MANGOHUD_CONFIG_DIR`. + """ + safe_name = sanitize_filename(game_name.replace(" ", "_"), fallback="game") return MANGOHUD_CONFIG_DIR / f"wine-{safe_name}.conf" diff --git a/src/game_setup_hub/paths.py b/src/game_setup_hub/paths.py new file mode 100644 index 0000000..aa7a0c1 --- /dev/null +++ b/src/game_setup_hub/paths.py @@ -0,0 +1,109 @@ +"""Path validation helpers — keep API inputs from escaping their sandbox. + +Centralised so :mod:`api` (and any future caller) sanitizes the same way and +``..``/absolute/symlink-escape attacks fail at one boundary instead of being +re-implemented per endpoint. +""" + +from __future__ import annotations + +import re +from pathlib import Path + + +class PathValidationError(ValueError): + """Raised when an untrusted path or filename is rejected.""" + + +_FILENAME_BLOCKED = re.compile(r"[^A-Za-z0-9._\- ]") +_LEADING_DOTS = re.compile(r"^\.+") + + +def sanitize_filename(name: str, *, fallback: str = "untitled") -> str: + """Reduce ``name`` to a safe single-segment filename. + + - Strips path separators and any non-alphanumeric/whitespace/.-_ chars. + - Collapses leading ``.`` so we never silently create dotfiles. + - Trims to 200 chars to stay under common filesystem limits. + - Returns ``fallback`` if the result is empty. + """ + if not name: + return fallback + cleaned = _FILENAME_BLOCKED.sub("_", name) + cleaned = _LEADING_DOTS.sub("", cleaned).strip().rstrip(".") + cleaned = cleaned[:200] + return cleaned or fallback + + +def safe_join(base: Path, *parts: str) -> Path: + """Join ``parts`` onto ``base`` and verify the result stays under ``base``. + + ``base`` must already exist (or at least its parent must); the joined + components may not yet exist. Symlinks are not followed by ``resolve`` + when targets are missing, which is fine — we only need the lexical + parent check to reject ``..`` escape and absolute overrides. + + Raises :class:`PathValidationError` on escape, absolute overrides, or + null-byte injection. + """ + base_resolved = base.resolve(strict=False) + for part in parts: + if "\x00" in part: + raise PathValidationError("Null byte in path component") + if Path(part).is_absolute(): + raise PathValidationError(f"Absolute path component not allowed: {part!r}") + + candidate = (base_resolved.joinpath(*parts)).resolve(strict=False) + try: + candidate.relative_to(base_resolved) + except ValueError as exc: + raise PathValidationError( + f"Path {candidate} escapes base {base_resolved}" + ) from exc + return candidate + + +def validate_within(base: Path, candidate: Path) -> Path: + """Verify ``candidate`` resolves under ``base``. Returns the resolved path.""" + base_resolved = base.resolve(strict=False) + candidate_resolved = candidate.resolve(strict=False) + try: + candidate_resolved.relative_to(base_resolved) + except ValueError as exc: + raise PathValidationError( + f"Path {candidate_resolved} is not under {base_resolved}" + ) from exc + return candidate_resolved + + +# Roots a localhost API caller may interact with. Anything outside these is +# rejected — keeps a malicious or buggy client from poking at /etc, /usr, etc. +_USER_PATH_ROOTS: tuple[Path, ...] = ( + Path.home(), + Path("/run/media"), + Path("/media"), + Path("/mnt"), + Path("/tmp"), # noqa: S108 — explicit allow, the API never *creates* in /tmp +) + + +def validate_user_path(path: str | Path, *, allow_missing: bool = False) -> Path: + """Return a resolved :class:`Path` if it lives under a user-writable root. + + Used at API boundaries. Rejects null bytes, ``..`` escape, and anything + outside :data:`_USER_PATH_ROOTS`. Set ``allow_missing=False`` (default) to + require the target to exist — typical for "open this folder" actions. + """ + raw = str(path) + if "\x00" in raw: + raise PathValidationError("Null byte in path") + p = Path(raw).expanduser().resolve(strict=False) + if not allow_missing and not p.exists(): + raise PathValidationError(f"Path does not exist: {p}") + for root in _USER_PATH_ROOTS: + try: + p.relative_to(root.resolve(strict=False)) + return p + except ValueError: + continue + raise PathValidationError(f"Path {p} is outside permitted roots") diff --git a/src/game_setup_hub/prefix.py b/src/game_setup_hub/prefix.py index 591dce6..fdcd935 100644 --- a/src/game_setup_hub/prefix.py +++ b/src/game_setup_hub/prefix.py @@ -5,8 +5,12 @@ import shutil import struct from dataclasses import dataclass +from datetime import UTC from pathlib import Path +from .fsutil import dir_size as _dir_size +from .paths import PathValidationError, validate_user_path + @dataclass class PrefixInfo: @@ -18,21 +22,6 @@ class PrefixInfo: vkd3d_version: str = "" -def _dir_size(path: Path) -> int: - """Recursively compute directory size in bytes.""" - total = 0 - try: - for entry in path.rglob("*"): - if not entry.is_symlink() and entry.is_file(): - try: - total += entry.lstat().st_size - except OSError: - pass - except OSError: - pass - return total - - def _read_pe_file_version(dll_path: Path) -> str: """ Read the VS_FIXEDFILEINFO version from a PE file's resource section. @@ -92,8 +81,18 @@ def _detect_vkd3d_version(prefix: Path) -> str: def get_prefix_info(path: str) -> PrefixInfo: - """Get information about a Wine/Proton prefix directory.""" - prefix = Path(path) + """Get information about a Wine/Proton prefix directory. + + The path is re-validated through :func:`validate_user_path` even though + callers (the API layer) are expected to validate first. This makes the + function safe to call directly from tests / scripts and gives CodeQL a + sanitizer it can recognise on the data-flow path into ``rglob`` / + ``read_bytes``. + """ + try: + prefix = validate_user_path(path, allow_missing=True) + except PathValidationError: + return PrefixInfo(path=path, exists=False) if not prefix.exists(): return PrefixInfo(path=path, exists=False) @@ -102,8 +101,8 @@ def get_prefix_info(path: str) -> PrefixInfo: created = "" try: stat = prefix.stat() - from datetime import datetime, timezone - created = datetime.fromtimestamp(stat.st_ctime, tz=timezone.utc).isoformat() + from datetime import datetime + created = datetime.fromtimestamp(stat.st_ctime, tz=UTC).isoformat() except OSError: pass @@ -121,9 +120,18 @@ def get_prefix_info(path: str) -> PrefixInfo: def delete_prefix(path: str) -> bool: - """Delete a Wine/Proton prefix directory. Returns True on success.""" - prefix = Path(path) - if not prefix.exists(): + """Delete a Wine/Proton prefix directory. Returns True on success. + + Defensive validation: the path must resolve under one of the user-writable + roots (home, /run/media, /media, /mnt, /tmp). This stops a bug or stolen + auth token from triggering ``rmtree("/etc")`` even though the API layer + is expected to validate first. + """ + try: + prefix = validate_user_path(path, allow_missing=False) + except PathValidationError: + return False + if not prefix.exists() or not prefix.is_dir(): return False try: shutil.rmtree(prefix) diff --git a/src/game_setup_hub/profiles_storage.py b/src/game_setup_hub/profiles_storage.py index f0b240d..a8c6435 100644 --- a/src/game_setup_hub/profiles_storage.py +++ b/src/game_setup_hub/profiles_storage.py @@ -6,6 +6,9 @@ from dataclasses import asdict, dataclass from pathlib import Path +from .fsutil import atomic_write_text +from .paths import sanitize_filename + PROFILES_DIR = Path.home() / ".config" / "protonshift" / "profiles" @@ -33,22 +36,21 @@ def list_profiles() -> list[str]: return sorted(names) -def _safe_filename(name: str) -> str: - return "".join(c if c.isalnum() or c in "._- " else "_" for c in name).strip() or "profile" +def _profile_path(name: str) -> Path: + return ensure_profiles_dir() / f"{sanitize_filename(name, fallback='profile')}.json" def save_profile(profile: ApplicationProfile) -> bool: - path = ensure_profiles_dir() / f"{_safe_filename(profile.name)}.json" + path = _profile_path(profile.name) try: - with open(path, "w", encoding="utf-8") as f: - json.dump(asdict(profile), f, indent=2) + atomic_write_text(path, json.dumps(asdict(profile), indent=2)) return True except OSError: return False def load_profile(name: str) -> ApplicationProfile | None: - path = PROFILES_DIR / f"{_safe_filename(name)}.json" + path = _profile_path(name) if not path.exists(): return None try: @@ -66,7 +68,7 @@ def load_profile(name: str) -> ApplicationProfile | None: def delete_profile(name: str) -> bool: - path = PROFILES_DIR / f"{_safe_filename(name)}.json" + path = _profile_path(name) if path.exists(): try: path.unlink() diff --git a/src/game_setup_hub/protontricks.py b/src/game_setup_hub/protontricks.py index ab9d6fc..cb499e4 100644 --- a/src/game_setup_hub/protontricks.py +++ b/src/game_setup_hub/protontricks.py @@ -2,11 +2,11 @@ from __future__ import annotations +import re import subprocess from game_setup_hub.tool_check import find_tool - PROTONTRICKS_FLATPAK = "com.github.Matoking.protontricks" # Common Winetricks verbs users might want @@ -18,6 +18,32 @@ ("arial", "Arial font"), ] +# Steam app IDs are decimal integers. Anything else is rejected so a malicious +# payload like "440; rm -rf ~" cannot reach the protontricks command line. +_APP_ID_RE = re.compile(r"^\d{1,12}$") +# Winetricks verbs are short alphanumeric tokens with optional `_-`. We do +# NOT trust the COMMON_VERBS list as the whitelist because users can pass +# arbitrary verbs from the UI; instead we constrain by *shape*. +_VERB_RE = re.compile(r"^[A-Za-z0-9._\-]{1,64}$") + + +class ProtontricksValidationError(ValueError): + """Raised when an app_id or verb fails validation before subprocess use.""" + + +def _validate_app_id(app_id: str) -> str: + if not isinstance(app_id, str) or not _APP_ID_RE.match(app_id): + raise ProtontricksValidationError(f"Invalid Steam app id: {app_id!r}") + return app_id + + +def _validate_verb(verb: str | None) -> str | None: + if verb is None: + return None + if not isinstance(verb, str) or not _VERB_RE.match(verb): + raise ProtontricksValidationError(f"Invalid winetricks verb: {verb!r}") + return verb + def is_protontricks_available() -> bool: """Check if Protontricks is available (native or Flatpak).""" @@ -39,14 +65,20 @@ def get_protontricks_cmd(app_id: str, verb: str | None = None) -> list[str] | No Get command to run Protontricks for a game. Returns [cmd, ...args] or None if not available. If verb is None, opens GUI (--gui). + + Raises :class:`ProtontricksValidationError` if ``app_id`` or ``verb`` would + inject anything other than a Steam app id / winetricks verb token. We + enforce the whitelist *before* assembling the argv to keep the subprocess + boundary clean even though :func:`subprocess.Popen` with a list arg does + not invoke a shell. """ + safe_app_id = _validate_app_id(app_id) + safe_verb = _validate_verb(verb) + pt = find_tool("protontricks") if pt: - cmd = [pt, app_id] - if verb: - cmd.append(verb) - else: - cmd.append("--gui") + cmd = [pt, safe_app_id] + cmd.append(safe_verb if safe_verb else "--gui") return cmd try: @@ -60,11 +92,8 @@ def get_protontricks_cmd(app_id: str, verb: str | None = None) -> list[str] | No except FileNotFoundError: return None - cmd = ["flatpak", "run", PROTONTRICKS_FLATPAK, app_id] - if verb: - cmd.append(verb) - else: - cmd.append("--gui") + cmd = ["flatpak", "run", PROTONTRICKS_FLATPAK, safe_app_id] + cmd.append(safe_verb if safe_verb else "--gui") return cmd @@ -74,7 +103,10 @@ def run_protontricks(app_id: str, verb: str | None = None) -> tuple[bool, str]: If verb is None, opens the GUI. Returns (success, error_message). """ - cmd = get_protontricks_cmd(app_id, verb) + try: + cmd = get_protontricks_cmd(app_id, verb) + except ProtontricksValidationError as exc: + return False, str(exc) if not cmd: return False, "Protontricks not found. Install from Flathub: com.github.Matoking.protontricks" try: diff --git a/src/game_setup_hub/saves.py b/src/game_setup_hub/saves.py index 541326b..e67204d 100644 --- a/src/game_setup_hub/saves.py +++ b/src/game_setup_hub/saves.py @@ -4,11 +4,25 @@ import zipfile from dataclasses import dataclass -from datetime import datetime, timezone +from datetime import UTC, datetime from pathlib import Path +from .fsutil import dir_size as _dir_size +from .paths import ( + PathValidationError, + sanitize_filename, + validate_user_path, + validate_within, +) + _BACKUP_ROOT = Path.home() / ".config" / "protonshift" / "backups" +# Reject backups larger than 4 GB raw or with > 50k files. A genuine save set +# never approaches this; it is a tripwire for accidental backups of full +# install dirs and a soft DoS guard on disk usage. +_MAX_BACKUP_BYTES = 4 * 1024 * 1024 * 1024 +_MAX_BACKUP_FILES = 50_000 + @dataclass class SaveLocation: @@ -26,26 +40,22 @@ class BackupInfo: created: str -def _dir_size(path: Path) -> int: - total = 0 - try: - for entry in path.rglob("*"): - if not entry.is_symlink() and entry.is_file(): - try: - total += entry.stat().st_size - except OSError: - pass - except OSError: - pass - return total - - def find_save_paths(app_id: str, prefix_path: str | None) -> list[SaveLocation]: - """Detect possible save locations for a game.""" + """Detect possible save locations for a game. + + ``prefix_path`` is validated through :func:`validate_user_path`; if it + falls outside a user-writable root we skip the prefix portion rather + than crawling arbitrary directories. + """ locations: list[SaveLocation] = [] + prefix: Path | None = None if prefix_path: - prefix = Path(prefix_path) + try: + prefix = validate_user_path(prefix_path, allow_missing=True) + except PathValidationError: + prefix = None + if prefix is not None: # Proton saves: various common save paths inside prefix save_candidates = [ (prefix / "pfx" / "drive_c" / "users" / "steamuser" / "Saved Games", "Proton Saved Games"), @@ -65,13 +75,15 @@ def find_save_paths(app_id: str, prefix_path: str | None) -> list[SaveLocation]: label=label, )) - # Native Linux save dirs + # Native Linux save dirs. ``app_id`` is sanitized to a single segment so a + # malicious value like ``../../etc`` cannot escape ``userdata/``. + safe_app_id = sanitize_filename(app_id, fallback="unknown") home = Path.home() native_candidates = [ (home / ".local" / "share" / "Steam" / "userdata", "Steam Cloud / Userdata"), ] for path, label in native_candidates: - app_subdir = path / app_id + app_subdir = path / safe_app_id if app_subdir.exists(): size = _dir_size(app_subdir) if size > 0: @@ -86,31 +98,66 @@ def find_save_paths(app_id: str, prefix_path: str | None) -> list[SaveLocation]: def backup_saves(app_id: str, paths: list[str]) -> str | None: - """Backup save directories to a timestamped zip. Returns backup path or None.""" - backup_dir = _BACKUP_ROOT / app_id + """Backup save directories to a timestamped zip. Returns backup path or None. + + Each input path's tree is added under ``/`` inside the archive, + so identical leaf names from different roots cannot overwrite each other. + Aborts (and removes the partial zip) if size or file-count tripwires fire. + """ + safe_app_id = sanitize_filename(app_id, fallback="unknown") + backup_dir = _BACKUP_ROOT / safe_app_id backup_dir.mkdir(parents=True, exist_ok=True) - timestamp = datetime.now(tz=timezone.utc).strftime("%Y%m%d_%H%M%S") + timestamp = datetime.now(tz=UTC).strftime("%Y%m%d_%H%M%S") zip_path = backup_dir / f"backup_{timestamp}.zip" + total_bytes = 0 + total_files = 0 + used_basenames: dict[str, int] = {} + try: with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf: for save_path_str in paths: - save_path = Path(save_path_str) + # Validate every input path lives under a user-writable root + # before touching the filesystem. This both stops the API + # being abused to enumerate /etc and gives CodeQL a clean + # sanitizer it can recognise on the data-flow path. + try: + save_path = validate_user_path(save_path_str, allow_missing=True) + except PathValidationError: + continue if not save_path.exists(): continue + base_name = sanitize_filename(save_path.name, fallback="root") + count = used_basenames.get(base_name, 0) + used_basenames[base_name] = count + 1 + arc_root = base_name if count == 0 else f"{base_name}_{count}" for fpath in save_path.rglob("*"): - if fpath.is_file(): - arcname = str(fpath.relative_to(save_path.parent)) - zf.write(fpath, arcname) + if not fpath.is_file() or fpath.is_symlink(): + continue + try: + size = fpath.lstat().st_size + except OSError: + continue + total_bytes += size + total_files += 1 + if total_bytes > _MAX_BACKUP_BYTES or total_files > _MAX_BACKUP_FILES: + raise OSError("Backup exceeded size or file-count limit") + rel = fpath.relative_to(save_path) + zf.write(fpath, f"{arc_root}/{rel.as_posix()}") return str(zip_path) except OSError: + try: + zip_path.unlink(missing_ok=True) + except OSError: + pass return None def list_backups(app_id: str) -> list[BackupInfo]: """List all backups for a game.""" - backup_dir = _BACKUP_ROOT / app_id + safe_app_id = sanitize_filename(app_id, fallback="unknown") + backup_dir = _BACKUP_ROOT / safe_app_id if not backup_dir.exists(): return [] @@ -118,7 +165,7 @@ def list_backups(app_id: str) -> list[BackupInfo]: for zf in sorted(backup_dir.glob("backup_*.zip"), reverse=True): try: stat = zf.stat() - created = datetime.fromtimestamp(stat.st_mtime, tz=timezone.utc).isoformat() + created = datetime.fromtimestamp(stat.st_mtime, tz=UTC).isoformat() backups.append(BackupInfo( path=str(zf), filename=zf.name, @@ -131,14 +178,42 @@ def list_backups(app_id: str) -> list[BackupInfo]: def restore_backup(backup_path: str, target_dir: str) -> bool: - """Restore a backup zip to the target directory. Returns True on success.""" - zip_path = Path(backup_path) - target = Path(target_dir) + """Restore a backup zip to the target directory. + + Hardened against zip-slip: each archive member is verified to land under + ``target_dir`` before extraction. Backups must originate from + :data:`_BACKUP_ROOT`; arbitrary zip paths are rejected. The target dir + must live under one of the user-writable roots. + """ + zip_path = Path(backup_path).resolve(strict=False) + + try: + validate_within(_BACKUP_ROOT, zip_path) + except PathValidationError: + return False + try: + target = validate_user_path(target_dir, allow_missing=True) + except PathValidationError: + return False + if not zip_path.exists(): return False + target.mkdir(parents=True, exist_ok=True) + try: with zipfile.ZipFile(zip_path, "r") as zf: + for member in zf.infolist(): + # zipfile member names use forward slashes; reject absolute + # paths and parent-traversal before extraction. + member_name = member.filename + if member_name.startswith("/") or "\x00" in member_name: + return False + resolved = (target / member_name).resolve(strict=False) + try: + validate_within(target, resolved) + except PathValidationError: + return False zf.extractall(target) return True except (zipfile.BadZipFile, OSError): diff --git a/src/game_setup_hub/shader_cache.py b/src/game_setup_hub/shader_cache.py index 3a018bb..320f647 100644 --- a/src/game_setup_hub/shader_cache.py +++ b/src/game_setup_hub/shader_cache.py @@ -6,6 +6,8 @@ from dataclasses import dataclass from pathlib import Path +from .fsutil import dir_size as _dir_size + @dataclass class ShaderCacheInfo: @@ -15,20 +17,6 @@ class ShaderCacheInfo: size_bytes: int = 0 -def _dir_size(path: Path) -> int: - total = 0 - try: - for entry in path.rglob("*"): - if not entry.is_symlink() and entry.is_file(): - try: - total += entry.lstat().st_size - except OSError: - pass - except OSError: - pass - return total - - def _shader_cache_dir(steam_root: Path, app_id: str) -> Path: return steam_root / "steamapps" / "shadercache" / app_id diff --git a/src/game_setup_hub/steam.py b/src/game_setup_hub/steam.py index 0756a97..7302685 100644 --- a/src/game_setup_hub/steam.py +++ b/src/game_setup_hub/steam.py @@ -3,6 +3,8 @@ from __future__ import annotations import subprocess +import threading +import time from dataclasses import dataclass from pathlib import Path @@ -67,7 +69,7 @@ def _resolve_steam_root() -> Path | None: def _find_libraryfolders(steam_root: Path) -> list[Path]: """Get all library paths from libraryfolders.vdf.""" - paths = [] + paths: list[Path] = [] for loc in [ steam_root / "steamapps" / "libraryfolders.vdf", steam_root / "config" / "libraryfolders.vdf", @@ -77,16 +79,17 @@ def _find_libraryfolders(steam_root: Path) -> list[Path]: try: with open(loc, encoding="utf-8", errors="replace") as f: data = vdf.load(f) - folders = data.get("libraryfolders", data) - if isinstance(folders, dict): - for _key, folder in folders.items(): - if isinstance(folder, dict) and "path" in folder: - p = Path(folder["path"]) - if p.exists(): - paths.append(p) except (SyntaxError, ValueError, OSError): - pass - break # Use first found + continue + folders = data.get("libraryfolders", data) + if isinstance(folders, dict): + for _key, folder in folders.items(): + if isinstance(folder, dict) and "path" in folder: + p = Path(folder["path"]) + if p.exists(): + paths.append(p) + if paths: + break # Stop at the first manifest that yielded usable paths if not paths and steam_root.exists(): paths.append(steam_root) return paths @@ -101,13 +104,39 @@ def _parse_acf(path: Path) -> dict | None: return None +# Library walks add up: every API request to /games, /games/{app_id}/*, +# /open-path etc. used to re-stat hundreds of acf files. A 5s TTL keeps the +# UI snappy without going stale long enough to confuse users who just +# installed something. +_DISCOVERY_TTL_SECONDS = 5.0 +_discovery_lock = threading.Lock() +_discovery_cache: tuple[float, Path | None, list[SteamGame]] | None = None + + +def invalidate_discovery_cache() -> None: + """Drop the cached game list (call after install/uninstall events).""" + global _discovery_cache + with _discovery_lock: + _discovery_cache = None + + def discover_games() -> tuple[Path | None, list[SteamGame]]: + """Discover Steam root and all installed games. Cached briefly per process. + + Returns ``(steam_root, games)``. Disk walks are skipped if a fresh enough + result is already cached. """ - Discover Steam root and all installed games. - Returns (steam_root, games). - """ + global _discovery_cache + now = time.monotonic() + with _discovery_lock: + cached = _discovery_cache + if cached and (now - cached[0]) < _DISCOVERY_TTL_SECONDS: + return cached[1], cached[2] + steam_root = _resolve_steam_root() if not steam_root: + with _discovery_lock: + _discovery_cache = (now, None, []) return None, [] libraries = _find_libraryfolders(steam_root) @@ -151,6 +180,8 @@ def discover_games() -> tuple[Path | None, list[SteamGame]]: ) games.sort(key=lambda g: (-g.last_played, g.name.lower())) + with _discovery_lock: + _discovery_cache = (now, steam_root, games) return steam_root, games @@ -185,13 +216,21 @@ def get_compattools_dir(steam_root: Path | None) -> Path | None: return None -# Built-in Steam Proton tool IDs (approximate — Steam may use different keys) -BUILTIN_PROTON = ["proton_experimental", "proton_9_0", "proton_8_0", "proton_7_0", "proton_6_3", ""] +# Built-in Steam Proton tool IDs. Source of truth is Steam itself; this list is +# best-effort for the dropdown and may lag a release. Newer Proton tools are +# discovered via `compatibilitytools.d` so users always see GE-Proton/etc. +_BUILTIN_PROTON: tuple[str, ...] = ( + "", + "proton_experimental", + "proton_9_0", + "proton_8_0", + "proton_7_0", +) def get_available_proton_tools(steam_root: Path | None) -> list[str]: """List Proton/GE tools: built-in first, then compatibilitytools.d.""" - tools: list[str] = ["", "proton_experimental", "proton_9_0", "proton_8_0", "proton_7_0"] + tools: list[str] = list(_BUILTIN_PROTON) compat_dir = get_compattools_dir(steam_root) if compat_dir and compat_dir.exists(): for item in sorted(compat_dir.iterdir()): diff --git a/src/game_setup_hub/theme.css b/src/game_setup_hub/theme.css deleted file mode 100644 index b81a061..0000000 --- a/src/game_setup_hub/theme.css +++ /dev/null @@ -1,257 +0,0 @@ -/* ProtonShift — Futuristic / Cyberpunk theme */ - -/* Neon accent palette */ -@define-color neon-cyan #00d4ff; -@define-color neon-blue #3b82f6; -@define-color neon-purple #a855f7; -@define-color neon-pink #ec4899; -@define-color glow-cyan rgba(0, 212, 255, 0.4); -@define-color glow-purple rgba(168, 85, 247, 0.3); -@define-color surface-deep #0f0f14; -@define-color surface-mid #16161e; -@define-color surface-elevated #1e1e28; - -/* Window: dark gradient background */ -window.background, -window.background .background { - background: linear-gradient(180deg, @surface-deep 0%, #0a0a0f 100%); -} - -/* Header bar: dark surface + neon top accent */ -headerbar { - background-color: @surface-elevated; - border-top: 2px solid @neon-cyan; - box-shadow: 0 0 20px @glow-cyan; -} - -/* Window controls (minimize, maximize, close): neon-styled */ -windowcontrols { - margin: 0 4px; -} -windowcontrols > button { - border-radius: 8px; - margin: 0 2px; - min-width: 32px; - min-height: 28px; - color: rgba(255, 255, 255, 0.7); - transition: all 150ms ease; -} -windowcontrols > button:hover { - background: rgba(0, 212, 255, 0.15); - color: @neon-cyan; - box-shadow: 0 0 8px @glow-cyan; -} -windowcontrols > button:active { - background: rgba(0, 212, 255, 0.25); -} - -/* View switcher: neon pills, 10px spacing */ -viewswitcher { - margin: 0 10px; -} -viewswitcher, -viewswitcher button { - border-radius: 9999px; -} -viewswitcher button { - margin: 0 6px; - padding: 10px 14px; - border: 1px solid rgba(0, 212, 255, 0.3); - transition: all 200ms ease; -} -viewswitcher button:hover { - background: rgba(0, 212, 255, 0.1); - border-color: @neon-cyan; - box-shadow: 0 0 12px @glow-cyan; -} -viewswitcher button:checked { - background: rgba(0, 212, 255, 0.2); - border-color: @neon-cyan; - color: @neon-cyan; - box-shadow: 0 0 16px @glow-cyan; -} - -/* Game list frame: search + list flow together */ -.game-list-frame { - background: @surface-elevated; - border: 1px solid rgba(0, 212, 255, 0.2); - border-radius: 12px; - padding: 10px; - box-shadow: 0 0 24px rgba(0, 212, 255, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.03); -} - -.game-list-search { - margin-bottom: 4px; -} - -/* List rows: single clean selector, no double box */ -list row, -listbox row { - border-radius: 8px; - margin: 2px 6px; - min-height: 40px; - padding: 10px; - transition: background 150ms ease; - border: none; - box-shadow: none; -} -list row:hover, -listbox row:hover { - background: rgba(0, 212, 255, 0.08); -} -list row:selected, -listbox row:selected { - background: rgba(0, 212, 255, 0.18); -} - -/* Pill buttons: neon outline, 10px padding */ -button.pill { - padding: 10px 14px; - border: 1px solid rgba(0, 212, 255, 0.4); - border-radius: 9999px; - background: transparent; - transition: all 200ms ease; -} -button.pill:hover { - background: rgba(0, 212, 255, 0.12); - border-color: @neon-cyan; - box-shadow: 0 0 14px @glow-cyan; -} -button.pill:active { - box-shadow: 0 0 8px @glow-cyan; -} - -/* Suggested-action pills: filled neon */ -button.pill.suggested-action { - background: rgba(0, 212, 255, 0.2); - border-color: @neon-cyan; - color: @neon-cyan; -} -button.pill.suggested-action:hover { - background: rgba(0, 212, 255, 0.3); - box-shadow: 0 0 18px @glow-cyan; -} - -/* Entry: neon focus ring, 10px padding */ -entry { - padding: 10px 12px; - border-radius: 8px; - border: 1px solid rgba(255, 255, 255, 0.1); - transition: all 200ms ease; -} -entry:focus-within { - border-color: @neon-cyan; - box-shadow: 0 0 0 2px @glow-cyan; -} - -/* Search entry */ -searchbar entry, -.search { - border-radius: 9999px; -} - -/* Frame: card-like with subtle glow, 10px padding */ -frame { - padding: 10px; - border: 1px solid rgba(0, 212, 255, 0.15); - border-radius: 12px; - background: @surface-elevated; - box-shadow: 0 0 16px rgba(0, 0, 0, 0.3), 0 1px 0 rgba(255, 255, 255, 0.02); -} - -/* Titles: subtle neon tint */ -.title-1 { - color: @neon-cyan; - font-weight: 700; - text-shadow: 0 0 20px @glow-cyan; -} -.title-4 { - color: rgba(255, 255, 255, 0.9); -} - -/* Dim labels: muted cyan */ -.dim-label { - color: rgba(0, 212, 255, 0.6); -} - -/* Environment hint: prominent storage path info */ -.env-hint { - font-size: 14px; - color: @neon-cyan; - opacity: 0.95; - text-shadow: 0 0 12px @glow-cyan; -} - -/* Placeholder: centered, large, prominent */ -.placeholder-title { - font-size: 28px; - font-weight: 600; - color: @neon-cyan; - text-shadow: 0 0 24px @glow-cyan; -} - -/* Action rows: 10px padding */ -actionrow { - border-radius: 8px; - margin: 5px 10px; - padding: 10px; -} - -/* FlowBox (preset pills): 10px between items */ -flowbox flowboxchild { - margin: 10px; -} - -/* System view: card styling */ -.system-card { - min-width: 340px; - background: @surface-elevated; - border: 1px solid rgba(0, 212, 255, 0.25); - border-radius: 16px; - box-shadow: 0 0 20px rgba(0, 212, 255, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.04); - transition: all 200ms ease; -} -.system-card:hover { - border-color: rgba(0, 212, 255, 0.4); - box-shadow: 0 0 28px rgba(0, 212, 255, 0.12); -} - -/* Preset help popover: polished wrapper */ -popover.preset-help-popover { - min-width: 420px; - min-height: 340px; - background: @surface-elevated; - border: 1px solid rgba(0, 212, 255, 0.3); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5), 0 0 24px rgba(0, 212, 255, 0.1); -} - -popover.preset-help-popover > contents { - border-radius: 16px; -} - -/* Preset help cards inside popover */ -.preset-help-card { - background: @surface-mid; - border: 1px solid rgba(0, 212, 255, 0.15); - border-radius: 12px; - box-shadow: none; -} - -.preset-help-card:hover { - border-color: rgba(0, 212, 255, 0.25); -} - -/* Loading spinner: cyan */ -spinner { - color: @neon-cyan; -} - -/* Scrollbar: subtle neon */ -scrollbar slider { - background: rgba(0, 212, 255, 0.3); - border-radius: 10px; -} -scrollbar slider:hover { - background: rgba(0, 212, 255, 0.5); -} diff --git a/src/game_setup_hub/vdf_config.py b/src/game_setup_hub/vdf_config.py index d748196..b5420ef 100644 --- a/src/game_setup_hub/vdf_config.py +++ b/src/game_setup_hub/vdf_config.py @@ -1,11 +1,14 @@ -"""Read/write Steam localconfig.vdf for LaunchOptions.""" +"""Read/write Steam localconfig.vdf for LaunchOptions and CompatToolMapping.""" from __future__ import annotations +import io from pathlib import Path import vdf +from .fsutil import atomic_write_text + def _get_apps_node(data: dict) -> dict | None: """Navigate to UserLocalConfigStore.Software.Valve.Steam.apps (lowercase).""" @@ -19,15 +22,39 @@ def _get_apps_node(data: dict) -> dict | None: return None -def get_launch_options(config_path: Path, app_id: str) -> str: - """Get LaunchOptions for a game. Returns empty string if not set.""" - if not config_path.exists(): - return "" +def _load_vdf(path: Path) -> dict: + if not path.exists(): + return {} try: - with open(config_path, encoding="utf-8", errors="replace") as f: + with open(path, encoding="utf-8", errors="replace") as f: data = vdf.load(f) + return data if isinstance(data, dict) else {} except (SyntaxError, ValueError, OSError): - return "" + return {} + + +def _dump_vdf_atomic(path: Path, data: dict) -> bool: + """Serialise ``data`` and atomically replace ``path``. + + Atomicity matters here because partial writes to ``localconfig.vdf`` can + nuke every launch option / compat tool mapping for the user. Steam itself + holds the file open while running, so a torn write is more than a theory. + """ + buf = io.StringIO() + try: + vdf.dump(data, buf, pretty=True) + except (TypeError, ValueError): + return False + try: + atomic_write_text(path, buf.getvalue()) + except OSError: + return False + return True + + +def get_launch_options(config_path: Path, app_id: str) -> str: + """Get LaunchOptions for a game. Returns empty string if not set.""" + data = _load_vdf(config_path) apps = _get_apps_node(data) if not apps: return "" @@ -39,13 +66,7 @@ def get_launch_options(config_path: Path, app_id: str) -> str: def get_compat_tool(config_path: Path, app_id: str) -> str: """Get CompatToolMapping for a game. Returns empty if not set.""" - if not config_path.exists(): - return "" - try: - with open(config_path, encoding="utf-8", errors="replace") as f: - data = vdf.load(f) - except (SyntaxError, ValueError, OSError): - return "" + data = _load_vdf(config_path) try: store = data["UserLocalConfigStore"] software = store["Software"] @@ -53,7 +74,10 @@ def get_compat_tool(config_path: Path, app_id: str) -> str: steam = valve["Steam"] mapping = steam.get("CompatToolMapping") or steam.get("compat_tool_mapping") if isinstance(mapping, dict): - return mapping.get(app_id, "") + entry = mapping.get(app_id, "") + if isinstance(entry, dict): + return entry.get("name", "") + return entry or "" except (KeyError, TypeError): pass return "" @@ -61,13 +85,7 @@ def get_compat_tool(config_path: Path, app_id: str) -> str: def set_compat_tool(config_path: Path, app_id: str, tool_name: str) -> bool: """Set CompatToolMapping for a game. Use empty string to clear.""" - data: dict = {} - if config_path.exists(): - try: - with open(config_path, encoding="utf-8", errors="replace") as f: - data = vdf.load(f) - except (SyntaxError, ValueError, OSError): - return False + data = _load_vdf(config_path) if config_path.exists() else {} store = data.setdefault("UserLocalConfigStore", {}) software = store.setdefault("Software", {}) @@ -83,26 +101,13 @@ def set_compat_tool(config_path: Path, app_id: str, tool_name: str) -> bool: elif app_id in mapping: del mapping[app_id] - config_path.parent.mkdir(parents=True, exist_ok=True) - try: - with open(config_path, "w", encoding="utf-8", newline="\n") as f: - vdf.dump(data, f, pretty=True) - except OSError: - return False - return True + return _dump_vdf_atomic(config_path, data) def set_launch_options(config_path: Path, app_id: str, options: str) -> bool: """Set LaunchOptions for a game. Creates nodes if needed.""" - data: dict = {} - if config_path.exists(): - try: - with open(config_path, encoding="utf-8", errors="replace") as f: - data = vdf.load(f) - except (SyntaxError, ValueError, OSError): - return False - - # Ensure full structure exists + data = _load_vdf(config_path) if config_path.exists() else {} + store = data.setdefault("UserLocalConfigStore", {}) software = store.setdefault("Software", {}) valve = software.setdefault("Valve", {}) @@ -113,10 +118,4 @@ def set_launch_options(config_path: Path, app_id: str, options: str) -> bool: apps[app_id] = {} apps[app_id]["LaunchOptions"] = options - config_path.parent.mkdir(parents=True, exist_ok=True) - try: - with open(config_path, "w", encoding="utf-8", newline="\n") as f: - vdf.dump(data, f, pretty=True) - except OSError: - return False - return True + return _dump_vdf_atomic(config_path, data) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..444c757 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,67 @@ +"""Shared fixtures. + +Tests must never write outside the workspace and must not call out to a real +Steam install. We pin ``HOME`` to a temp dir for every test so any code that +resolves ``Path.home()`` lands in an isolated sandbox. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import pytest + + +@pytest.fixture(autouse=True) +def isolated_home(tmp_path, monkeypatch) -> Path: + """Redirect HOME so module-level ``Path.home()`` constants stay safe. + + Several modules cache ``Path.home() / ...`` at import time. We reload them + after the patch so their constants point at the per-test sandbox. + """ + fake_home = tmp_path / "home" + fake_home.mkdir() + monkeypatch.setenv("HOME", str(fake_home)) + monkeypatch.setattr(Path, "home", classmethod(lambda cls: fake_home)) + + import importlib + for mod_name in ( + "game_setup_hub.env_vars", + "game_setup_hub.profiles_storage", + "game_setup_hub.fixes", + "game_setup_hub.saves", + "game_setup_hub.mangohud", + ): + try: + importlib.reload(__import__(mod_name, fromlist=["_"])) + except ModuleNotFoundError: + pass + return fake_home + + +@pytest.fixture +def api_token(monkeypatch) -> str: + """Set a known token and pin it on the api state module.""" + token = "test-token-abc123" + monkeypatch.setenv("PROTONSHIFT_API_TOKEN", token) + + from game_setup_hub.api import _state as api_state + + monkeypatch.setattr(api_state, "API_TOKEN", token, raising=False) + return token + + +@pytest.fixture +def auth_headers(api_token) -> dict[str, str]: + return {"Authorization": f"Bearer {api_token}"} + + +def _ensure_pythonpath() -> None: + """Make `src/` importable when pytest is run from the repo root.""" + src = Path(__file__).resolve().parents[1] / "src" + if str(src) not in sys.path: + sys.path.insert(0, str(src)) + + +_ensure_pythonpath() diff --git a/tests/test_api_smoke.py b/tests/test_api_smoke.py new file mode 100644 index 0000000..afed6ec --- /dev/null +++ b/tests/test_api_smoke.py @@ -0,0 +1,94 @@ +"""End-to-end FastAPI smoke + auth tests via TestClient. + +Network calls are the wrong layer to exercise here; we just want to confirm +the app boots, auth enforcement works, CORS is locked down, and the +public-ish endpoints don't raise. +""" + +from __future__ import annotations + +import pytest +from fastapi.testclient import TestClient + + +@pytest.fixture +def client(api_token): + from game_setup_hub.api import _state as api_state + from game_setup_hub.api import app + + api_state.API_TOKEN = api_token + return TestClient(app) + + +def test_health_works_without_auth(client) -> None: + resp = client.get("/health") + assert resp.status_code == 200 + assert resp.json() == {"status": "ok"} + + +def test_protected_endpoint_rejects_missing_token(client) -> None: + resp = client.get("/system") + assert resp.status_code == 401 + assert resp.headers.get("www-authenticate") == "Bearer" + + +def test_protected_endpoint_rejects_wrong_token(client) -> None: + resp = client.get("/system", headers={"Authorization": "Bearer nope"}) + assert resp.status_code == 401 + + +def test_protected_endpoint_accepts_correct_token(client, auth_headers) -> None: + resp = client.get("/system", headers=auth_headers) + assert resp.status_code == 200 + body = resp.json() + assert "gpus" in body + assert "power_profiles" in body + + +def test_steam_running_guard_on_launch_options(client, auth_headers, monkeypatch) -> None: + """If Steam is running, edits to localconfig.vdf must be rejected.""" + from game_setup_hub.api import _state as api_state + from game_setup_hub.api.routes import games as games_route + + monkeypatch.setattr(games_route, "is_steam_running", lambda: True) + monkeypatch.setattr(api_state, "config_path", "fake.vdf", raising=False) + monkeypatch.setattr(api_state, "steam_discovered", True, raising=False) + + resp = client.put( + "/games/440/launch-options", + headers={**auth_headers, "Content-Type": "application/json"}, + json={"options": "-novid"}, + ) + assert resp.status_code == 409 + assert "Steam is running" in resp.json()["detail"] + + +def test_open_path_rejects_outside_home(client, auth_headers) -> None: + resp = client.post( + "/open-path", + headers={**auth_headers, "Content-Type": "application/json"}, + json={"path": "/etc/passwd"}, + ) + assert resp.status_code == 400 + + +def test_delete_prefix_rejects_outside_home(client, auth_headers) -> None: + resp = client.delete( + "/games/12345/prefix", + headers=auth_headers, + params={"prefix_path": "/etc"}, + ) + assert resp.status_code == 400 + + +def test_gamescope_build_returns_argv(client, auth_headers) -> None: + resp = client.post( + "/gamescope/build-cmd", + headers={**auth_headers, "Content-Type": "application/json"}, + json={"output_width": 1920, "output_height": 1080}, + ) + assert resp.status_code == 200 + body = resp.json() + assert body["argv"][0] == "gamescope" + assert body["argv"][-1] == "--" + assert "1920" in body["command"] diff --git a/tests/test_controllers.py b/tests/test_controllers.py new file mode 100644 index 0000000..f33011e --- /dev/null +++ b/tests/test_controllers.py @@ -0,0 +1,76 @@ +"""SDL GUID + classification logic for controllers.""" + +from __future__ import annotations + +from game_setup_hub.controllers import ( + ControllerInfo, + _build_sdl_guid, + _classify_controller, + get_sdl_mapping, +) + + +def test_classify_xbox() -> None: + assert _classify_controller("Microsoft Xbox Series X Controller") == "xbox" + + +def test_classify_playstation() -> None: + assert _classify_controller("Sony Interactive Entertainment DualSense") == "playstation" + + +def test_classify_nintendo() -> None: + assert _classify_controller("Nintendo Switch Pro Controller") == "nintendo" + + +def test_classify_unknown_is_generic() -> None: + assert _classify_controller("Random USB Joystick") == "generic" + + +def test_build_sdl_guid_is_32_hex_chars() -> None: + guid = _build_sdl_guid("0003", "045e", "02ea", "0301") + assert len(guid) == 32 + assert all(c in "0123456789abcdef" for c in guid) + + +def test_build_sdl_guid_endianness() -> None: + """Verify the little-endian layout: bus, crc=0, vendor, 0, product, 0, version, 0.""" + guid = _build_sdl_guid("0003", "045e", "02ea", "0301") + # bus 0x0003 -> "0300"; crc 0x0000 -> "0000"; vendor 0x045e -> "5e04"; ... + assert guid.startswith("03000000") + assert guid[8:16] == "5e040000" + assert guid[16:24] == "ea020000" + assert guid[24:32] == "01030000" + + +def test_build_sdl_guid_handles_invalid_hex() -> None: + guid = _build_sdl_guid("zzzz", "", "", "") + assert guid == "0" * 32 + + +def test_get_sdl_mapping_includes_guid_and_platform() -> None: + ctrl = ControllerInfo( + id="045e:02ea", + name="Xbox Wireless Controller", + device_path="/dev/input/js0", + controller_type="xbox", + vendor_id="045e", + product_id="02ea", + bus_type="0003", + version="0301", + ) + mapping = get_sdl_mapping(ctrl) + parts = mapping.split(",") + assert len(parts[0]) == 32 # GUID + assert parts[1] == "Xbox Wireless Controller" + assert "platform:Linux" in mapping + + +def test_get_sdl_mapping_strips_commas_from_name() -> None: + ctrl = ControllerInfo( + id="x", name="Brand, Model, X", device_path="/dev/input/js0", + controller_type="xbox", vendor_id="0", product_id="0", bus_type="0003", + ) + mapping = get_sdl_mapping(ctrl) + # Name field (index 1) must not contain commas, so the mapping fields parse correctly + parts = mapping.split(",") + assert parts[1] == "Brand Model X" diff --git a/tests/test_display.py b/tests/test_display.py new file mode 100644 index 0000000..52a0fe8 --- /dev/null +++ b/tests/test_display.py @@ -0,0 +1,49 @@ +"""Whitelist tests for the display.set_resolution input validators.""" + +from __future__ import annotations + +from unittest.mock import patch + +from game_setup_hub.display import MonitorInfo, set_resolution + + +def _fake_monitor(name: str = "HDMI-1") -> MonitorInfo: + return MonitorInfo( + name=name, + connected=True, + resolution="1920x1080", + refresh_rate="60", + primary=True, + position="+0+0", + ) + + +def test_set_resolution_rejects_shell_metachars() -> None: + with patch("game_setup_hub.display.get_monitors", return_value=[_fake_monitor()]): + assert set_resolution("HDMI-1; rm -rf ~", 1920, 1080) is False + assert set_resolution("$(id)", 1920, 1080) is False + assert set_resolution("HDMI 1", 1920, 1080) is False + + +def test_set_resolution_rejects_unknown_monitor() -> None: + with patch("game_setup_hub.display.get_monitors", return_value=[_fake_monitor("HDMI-1")]): + assert set_resolution("DP-99", 1920, 1080) is False + + +def test_set_resolution_rejects_oversize_dimensions() -> None: + with patch("game_setup_hub.display.get_monitors", return_value=[_fake_monitor()]): + assert set_resolution("HDMI-1", 99999, 1080) is False + assert set_resolution("HDMI-1", 1920, 0) is False + assert set_resolution("HDMI-1", -1, 1080) is False + + +def test_set_resolution_rejects_silly_refresh() -> None: + with patch("game_setup_hub.display.get_monitors", return_value=[_fake_monitor()]): + assert set_resolution("HDMI-1", 1920, 1080, refresh=10000) is False + assert set_resolution("HDMI-1", 1920, 1080, refresh=-1) is False + + +def test_set_resolution_returns_false_when_xrandr_missing() -> None: + with patch("game_setup_hub.display.get_monitors", return_value=[_fake_monitor()]), \ + patch("game_setup_hub.display.find_tool", return_value=None): + assert set_resolution("HDMI-1", 1920, 1080) is False diff --git a/tests/test_env_vars.py b/tests/test_env_vars.py new file mode 100644 index 0000000..cc53dde --- /dev/null +++ b/tests/test_env_vars.py @@ -0,0 +1,53 @@ +"""Round-trip tests for the environment.d writer.""" + +from __future__ import annotations + +from pathlib import Path + +from game_setup_hub.env_vars import ( + GAMING_CONF, + read_gaming_env, + write_conf, + write_gaming_env, +) + + +def test_write_and_read_roundtrip(tmp_path: Path) -> None: + target = tmp_path / "70-test.conf" + payload = {"FOO": "bar", "WITH_SPACES": "hello world", "EMPTY": ""} + assert write_conf(target, payload, header="generated") is True + text = target.read_text(encoding="utf-8") + assert "FOO=\"bar\"" in text + assert "WITH_SPACES=\"hello world\"" in text + assert text.startswith("# generated") + + +def test_write_conf_quotes_special_chars(tmp_path: Path) -> None: + target = tmp_path / "special.conf" + write_conf(target, {"SHELL_INJ": 'val with "quotes" and \\backslash'}) + text = target.read_text(encoding="utf-8") + assert 'SHELL_INJ="val with \\"quotes\\" and \\\\backslash"' in text + + +def test_write_conf_skips_invalid_keys(tmp_path: Path) -> None: + target = tmp_path / "bad.conf" + write_conf(target, {"GOOD": "1", "BAD-KEY": "2", "1NUMERIC": "3"}) + text = target.read_text(encoding="utf-8") + assert "GOOD=\"1\"" in text + assert "BAD-KEY" not in text + assert "1NUMERIC" not in text + + +def test_gaming_env_roundtrip() -> None: + original = {"PROTON_LOG": "1", "DXVK_HUD": "fps"} + assert write_gaming_env(original) is True + assert read_gaming_env() == original + + target = Path.home() / ".config" / "environment.d" / GAMING_CONF + assert target.exists() + + +def test_gaming_env_overwrite_replaces_atomically() -> None: + write_gaming_env({"A": "1"}) + write_gaming_env({"B": "2"}) + assert read_gaming_env() == {"B": "2"} diff --git a/tests/test_fsutil.py b/tests/test_fsutil.py new file mode 100644 index 0000000..1bb766a --- /dev/null +++ b/tests/test_fsutil.py @@ -0,0 +1,78 @@ +"""Cover the parts of fsutil whose bugs would corrupt user config files.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from game_setup_hub.fsutil import ( + atomic_write_bytes, + atomic_write_text, + dir_size, + human_size, +) + + +def test_dir_size_sums_files_recursively(tmp_path: Path) -> None: + (tmp_path / "a.txt").write_bytes(b"hello") + sub = tmp_path / "sub" + sub.mkdir() + (sub / "b.txt").write_bytes(b"world!") + assert dir_size(tmp_path) == len(b"hello") + len(b"world!") + + +def test_dir_size_skips_symlinks_by_default(tmp_path: Path) -> None: + real = tmp_path / "real" + real.mkdir() + (real / "a").write_bytes(b"x" * 10) + link = tmp_path / "link" + link.symlink_to(real) + # 10 bytes for the file, plus the symlink itself contributes nothing + assert dir_size(tmp_path) == 10 + + +def test_dir_size_returns_zero_for_missing(tmp_path: Path) -> None: + assert dir_size(tmp_path / "nope") == 0 + + +@pytest.mark.parametrize( + "raw,expected_unit", + [ + (0, "B"), + (1023, "B"), + (1024, "KB"), + (1024 * 1024, "MB"), + (1024 ** 3, "GB"), + (1024 ** 4, "TB"), + ], +) +def test_human_size_unit_progression(raw: int, expected_unit: str) -> None: + assert human_size(raw).endswith(expected_unit) + + +def test_atomic_write_text_replaces_existing(tmp_path: Path) -> None: + target = tmp_path / "config.conf" + target.write_text("old contents", encoding="utf-8") + atomic_write_text(target, "new contents") + assert target.read_text(encoding="utf-8") == "new contents" + + +def test_atomic_write_text_creates_parents(tmp_path: Path) -> None: + target = tmp_path / "deep" / "nested" / "file.txt" + atomic_write_text(target, "ok") + assert target.read_text(encoding="utf-8") == "ok" + + +def test_atomic_write_text_leaves_no_temp_files(tmp_path: Path) -> None: + target = tmp_path / "file.txt" + atomic_write_text(target, "x") + leftovers = [p for p in tmp_path.iterdir() if p.name.startswith(".file.txt.")] + assert leftovers == [] + + +def test_atomic_write_bytes_roundtrips(tmp_path: Path) -> None: + target = tmp_path / "blob.bin" + payload = b"\x00\x01\x02binary" + atomic_write_bytes(target, payload) + assert target.read_bytes() == payload diff --git a/tests/test_gamescope.py b/tests/test_gamescope.py new file mode 100644 index 0000000..578a89c --- /dev/null +++ b/tests/test_gamescope.py @@ -0,0 +1,48 @@ +"""Gamescope cmd builder.""" + +from __future__ import annotations + +import shlex + +from game_setup_hub.gamescope import ( + GamescopeOptions, + build_gamescope_argv, + build_gamescope_cmd, +) + + +def test_argv_starts_with_gamescope_and_ends_with_separator() -> None: + argv = build_gamescope_argv(GamescopeOptions()) + assert argv[0] == "gamescope" + assert argv[-1] == "--" + + +def test_resolution_args_emitted() -> None: + opts = GamescopeOptions(output_width=1920, output_height=1080, game_width=1280, game_height=720) + argv = build_gamescope_argv(opts) + assert "-w" in argv and "1920" in argv + assert "-h" in argv and "1080" in argv + assert "-W" in argv and "1280" in argv + assert "-H" in argv and "720" in argv + + +def test_extra_args_are_shell_split() -> None: + opts = GamescopeOptions(extra_args='--prefer-vk-device "1234:5678"') + argv = build_gamescope_argv(opts) + assert "--prefer-vk-device" in argv + assert "1234:5678" in argv + + +def test_cmd_string_is_quoted() -> None: + opts = GamescopeOptions(extra_args="--mango 'hello world'") + cmd = build_gamescope_cmd(opts) + parts = shlex.split(cmd) + assert parts[0] == "gamescope" + assert "hello world" in parts + + +def test_fsr_sharpness_clamped() -> None: + opts = GamescopeOptions(fsr=True, fsr_sharpness=999) + argv = build_gamescope_argv(opts) + sharpness_idx = argv.index("--fsr-sharpness") + assert argv[sharpness_idx + 1] == "20" diff --git a/tests/test_paths.py b/tests/test_paths.py new file mode 100644 index 0000000..987aae5 --- /dev/null +++ b/tests/test_paths.py @@ -0,0 +1,82 @@ +"""Sanitization tests — these are the wall between the API and the filesystem.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from game_setup_hub.paths import ( + PathValidationError, + safe_join, + sanitize_filename, + validate_user_path, + validate_within, +) + + +@pytest.mark.parametrize( + "raw,expected", + [ + ("simple.json", "simple.json"), + ("My Game (2024)", "My Game _2024_"), + ("../escape", "_escape"), + ("../../etc/passwd", "_.._etc_passwd"), + ("...hidden", "hidden"), + ("", "untitled"), + ("a" * 500, "a" * 200), + ], +) +def test_sanitize_filename(raw: str, expected: str) -> None: + assert sanitize_filename(raw) == expected + + +def test_safe_join_blocks_traversal(tmp_path: Path) -> None: + with pytest.raises(PathValidationError): + safe_join(tmp_path, "..", "etc") + + +def test_safe_join_blocks_absolute(tmp_path: Path) -> None: + with pytest.raises(PathValidationError): + safe_join(tmp_path, "/etc/passwd") + + +def test_safe_join_blocks_null_byte(tmp_path: Path) -> None: + with pytest.raises(PathValidationError): + safe_join(tmp_path, "a\x00b") + + +def test_safe_join_allows_subdir(tmp_path: Path) -> None: + result = safe_join(tmp_path, "sub", "file.txt") + assert result == (tmp_path / "sub" / "file.txt").resolve() + + +def test_validate_within_rejects_outside(tmp_path: Path) -> None: + other = tmp_path.parent / "outside" + with pytest.raises(PathValidationError): + validate_within(tmp_path, other) + + +def test_validate_user_path_accepts_home(tmp_path: Path) -> None: + # `isolated_home` fixture pins HOME to tmp_path/home. + home = Path.home() + target = home / "stuff" + target.mkdir() + assert validate_user_path(target) == target.resolve() + + +def test_validate_user_path_rejects_etc() -> None: + with pytest.raises(PathValidationError): + validate_user_path("/etc/passwd") + + +def test_validate_user_path_requires_existence_by_default() -> None: + home = Path.home() + with pytest.raises(PathValidationError): + validate_user_path(home / "does-not-exist") + + +def test_validate_user_path_allow_missing() -> None: + home = Path.home() + candidate = home / "future" + assert validate_user_path(candidate, allow_missing=True) == candidate.resolve() diff --git a/tests/test_protontricks.py b/tests/test_protontricks.py new file mode 100644 index 0000000..e55f4ec --- /dev/null +++ b/tests/test_protontricks.py @@ -0,0 +1,57 @@ +"""Whitelist tests for the new subprocess input validators.""" + +from __future__ import annotations + +import pytest + +from game_setup_hub.protontricks import ( + ProtontricksValidationError, + _validate_app_id, + _validate_verb, +) + + +@pytest.mark.parametrize("good", ["1", "440", "1234567890"]) +def test_validate_app_id_accepts_digits(good: str) -> None: + assert _validate_app_id(good) == good + + +@pytest.mark.parametrize( + "bad", + [ + "", + "abc", + "440; rm -rf ~", + "440 1", + "../440", + "1234567890123", # 13 digits — over our cap + ], +) +def test_validate_app_id_rejects_garbage(bad: str) -> None: + with pytest.raises(ProtontricksValidationError): + _validate_app_id(bad) + + +def test_validate_verb_accepts_none() -> None: + assert _validate_verb(None) is None + + +@pytest.mark.parametrize("good", ["vcrun2022", "dotnet48", "d3dx9", "core-fonts", "a.b.c"]) +def test_validate_verb_accepts_alnum(good: str) -> None: + assert _validate_verb(good) == good + + +@pytest.mark.parametrize( + "bad", + [ + "", + "vcrun;rm", + "vcrun 2022", + "$(whoami)", + "../escape", + "x" * 65, + ], +) +def test_validate_verb_rejects_garbage(bad: str) -> None: + with pytest.raises(ProtontricksValidationError): + _validate_verb(bad) diff --git a/tests/test_tool_check.py b/tests/test_tool_check.py new file mode 100644 index 0000000..6fda7e2 --- /dev/null +++ b/tests/test_tool_check.py @@ -0,0 +1,23 @@ +"""Smoke tests for tool_check fallback paths. + +We can't assume any specific tool exists in CI, so the assertions are about +behaviour (boolean, no crash) rather than concrete results. +""" + +from __future__ import annotations + +from game_setup_hub.tool_check import find_tool, is_tool_available + + +def test_is_tool_available_returns_bool() -> None: + assert isinstance(is_tool_available("python3"), bool) + + +def test_find_tool_returns_path_or_none() -> None: + result = find_tool("python3") + assert result is None or isinstance(result, str) + + +def test_unknown_tool_is_unavailable() -> None: + assert is_tool_available("no-such-tool-zzzzz") is False + assert find_tool("no-such-tool-zzzzz") is None diff --git a/tests/test_vdf_config.py b/tests/test_vdf_config.py new file mode 100644 index 0000000..daa2176 --- /dev/null +++ b/tests/test_vdf_config.py @@ -0,0 +1,79 @@ +"""Round-trip + atomicity tests for vdf_config.""" + +from __future__ import annotations + +from pathlib import Path + +import vdf + +from game_setup_hub.vdf_config import ( + get_compat_tool, + get_launch_options, + set_compat_tool, + set_launch_options, +) + + +def _seed_localconfig(path: Path) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + data = { + "UserLocalConfigStore": { + "Software": { + "Valve": { + "Steam": { + "apps": { + "440": {"LaunchOptions": "-novid"}, + }, + "CompatToolMapping": { + "440": {"name": "proton_8_0", "config": "", "priority": "250"}, + }, + } + } + } + } + } + with open(path, "w", encoding="utf-8") as f: + vdf.dump(data, f, pretty=True) + + +def test_get_existing_launch_options(tmp_path: Path) -> None: + cfg = tmp_path / "localconfig.vdf" + _seed_localconfig(cfg) + assert get_launch_options(cfg, "440") == "-novid" + + +def test_get_existing_compat_tool(tmp_path: Path) -> None: + cfg = tmp_path / "localconfig.vdf" + _seed_localconfig(cfg) + assert get_compat_tool(cfg, "440") == "proton_8_0" + + +def test_set_launch_options_creates_nodes(tmp_path: Path) -> None: + cfg = tmp_path / "fresh.vdf" + assert set_launch_options(cfg, "12345", "MANGOHUD=1 %command%") is True + assert get_launch_options(cfg, "12345") == "MANGOHUD=1 %command%" + + +def test_set_launch_options_preserves_other_apps(tmp_path: Path) -> None: + cfg = tmp_path / "localconfig.vdf" + _seed_localconfig(cfg) + set_launch_options(cfg, "10", "-fullscreen") + assert get_launch_options(cfg, "10") == "-fullscreen" + # Existing app must still be intact + assert get_launch_options(cfg, "440") == "-novid" + assert get_compat_tool(cfg, "440") == "proton_8_0" + + +def test_set_compat_tool_clears_when_empty(tmp_path: Path) -> None: + cfg = tmp_path / "localconfig.vdf" + _seed_localconfig(cfg) + set_compat_tool(cfg, "440", "") + assert get_compat_tool(cfg, "440") == "" + + +def test_writes_are_atomic_no_temp_files(tmp_path: Path) -> None: + cfg = tmp_path / "localconfig.vdf" + _seed_localconfig(cfg) + set_launch_options(cfg, "440", "-newopt") + leftovers = [p.name for p in tmp_path.iterdir() if p.name.startswith(".localconfig.vdf.")] + assert leftovers == [] diff --git a/tests/test_vendor_compat.py b/tests/test_vendor_compat.py new file mode 100644 index 0000000..1a158a4 --- /dev/null +++ b/tests/test_vendor_compat.py @@ -0,0 +1,106 @@ +"""Regression tests for ``_vendor_compat.fixup_vendor_path``. + +Goal: prove the read-only-AppImage scenario actually works. The previous +implementation tried to ``shutil.rmtree`` the offending vendor dir, which +silently no-op'd on squashfs. The current implementation must: + +* Detect an ABI-mismatched vendored ``.so`` without writing to the FS. +* Prepend system site-packages to ``sys.path`` so the system copy wins + import resolution. +""" + +from __future__ import annotations + +import sys +from pathlib import Path +from unittest import mock + +import pytest + +from game_setup_hub import _vendor_compat + + +@pytest.fixture +def vendor_dir(tmp_path: Path) -> Path: + """Build a fake AppImage-style vendor dir with an ABI-incompatible .so.""" + vd = tmp_path / "vendor" + vd.mkdir() + pkg = vd / "pydantic_core" + pkg.mkdir() + (pkg / "__init__.py").write_text("") + # Tag the .so with an obviously wrong SOABI so the compat check fails. + (pkg / "_pydantic_core.cpython-999-totally-wrong.so").write_text("") + return vd + + +@pytest.fixture +def system_site(tmp_path: Path) -> Path: + sp = tmp_path / "system-site-packages" + sp.mkdir() + return sp + + +def test_no_vendor_dir_is_noop(monkeypatch) -> None: + monkeypatch.setattr(sys, "path", ["/some/random/dir"]) + _vendor_compat.fixup_vendor_path() + assert sys.path == ["/some/random/dir"] + + +def test_compatible_so_leaves_path_alone(tmp_path: Path, monkeypatch) -> None: + vd = tmp_path / "vendor" + vd.mkdir() + pkg = vd / "pydantic_core" + pkg.mkdir() + (pkg / "__init__.py").write_text("") + soabi = _vendor_compat._SOABI or "cpython-312-x86_64-linux-gnu" + monkeypatch.setattr(_vendor_compat, "_SOABI", soabi) + (pkg / f"_pydantic_core.{soabi}.so").write_text("") + + original = [str(vd), "/usr/lib/python3/dist-packages"] + monkeypatch.setattr(sys, "path", list(original)) + _vendor_compat.fixup_vendor_path() + assert sys.path == original, "compat .so must not trigger reordering" + + +def test_incompatible_so_prepends_system_site_packages( + vendor_dir: Path, system_site: Path, monkeypatch +) -> None: + monkeypatch.setattr(_vendor_compat, "_SOABI", "cpython-312-x86_64-linux-gnu") + monkeypatch.setattr(sys, "path", [str(vendor_dir), "/usr/lib/python3.12"]) + monkeypatch.setattr(_vendor_compat, "_system_site_dirs", lambda: [str(system_site)]) + + _vendor_compat.fixup_vendor_path() + + assert sys.path[0] == str(system_site), "system site-packages must win resolution" + assert str(vendor_dir) in sys.path, "vendor dir stays for non-conflicting deps" + + +def test_does_not_touch_filesystem(vendor_dir: Path, system_site: Path, monkeypatch) -> None: + """The whole point of the rewrite: never mutate the vendored dir.""" + monkeypatch.setattr(_vendor_compat, "_SOABI", "cpython-312-x86_64-linux-gnu") + monkeypatch.setattr(sys, "path", [str(vendor_dir)]) + monkeypatch.setattr(_vendor_compat, "_system_site_dirs", lambda: [str(system_site)]) + + pkg_dir = vendor_dir / "pydantic_core" + files_before = sorted(p.name for p in pkg_dir.iterdir()) + + with mock.patch("shutil.rmtree") as m_rmtree: + _vendor_compat.fixup_vendor_path() + + assert m_rmtree.call_count == 0, "must not rmtree on read-only FS" + files_after = sorted(p.name for p in pkg_dir.iterdir()) + assert files_before == files_after + + +def test_no_system_site_packages_is_warning_not_crash( + vendor_dir: Path, monkeypatch, caplog +) -> None: + """Worst case: AppImage on a system without pydantic — log loudly, don't crash.""" + monkeypatch.setattr(_vendor_compat, "_SOABI", "cpython-312-x86_64-linux-gnu") + monkeypatch.setattr(sys, "path", [str(vendor_dir)]) + monkeypatch.setattr(_vendor_compat, "_system_site_dirs", lambda: []) + + with caplog.at_level("WARNING", logger="protonshift.vendor_compat"): + _vendor_compat.fixup_vendor_path() + + assert any("ABI mismatch" in r.message for r in caplog.records)