From ca1df5cb20652b3d8a8ee7425eed80e250016169 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Thu, 11 Mar 2021 18:14:52 +0100 Subject: [PATCH] gint/keyboard: detailed test of the new keydev mechanic --- .gitignore | 3 + CMakeLists.txt | 6 +- assets-fx/fonts/mini.png | Bin 16089 -> 16096 bytes assets-fx/img/kbd_events.png | Bin 0 -> 244 bytes assets-fx/img/kbd_pressed.png | Bin 0 -> 350 bytes assets-fx/img/kbd_released.png | Bin 0 -> 362 bytes assets-fx/img/keypress.png | Bin 146 -> 0 bytes assets-fx/img/keyrelease.png | Bin 166 -> 0 bytes assets-fx/img/opt_gint_keyboard.png | Bin 0 -> 3518 bytes include/gintctl/assets.h | 81 +++++++++++++ src/gint/keyboard.c | 180 +++++++++++++++++++++------- src/gintctl.c | 9 +- 12 files changed, 229 insertions(+), 50 deletions(-) create mode 100644 assets-fx/img/kbd_events.png create mode 100644 assets-fx/img/kbd_pressed.png create mode 100644 assets-fx/img/kbd_released.png delete mode 100644 assets-fx/img/keypress.png delete mode 100644 assets-fx/img/keyrelease.png create mode 100644 assets-fx/img/opt_gint_keyboard.png create mode 100644 include/gintctl/assets.h diff --git a/.gitignore b/.gitignore index 723a319..1ded0c2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ build-cg/ # Targets gintctl.g1a gintctl.g3a + +# Development files +*.sublime-* diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c0e852..31e9483 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,13 +54,15 @@ set(ASSETS_fx assets-fx/img/bopti_1col.png assets-fx/img/bopti_2col.png assets-fx/img/bopti_3col.png - assets-fx/img/keypress.png - assets-fx/img/keyrelease.png + assets-fx/img/kbd_events.png + assets-fx/img/kbd_pressed.png + assets-fx/img/kbd_released.png assets-fx/img/libimg_swords.png assets-fx/img/opt_dump.png assets-fx/img/opt_gint_bopti.png assets-fx/img/opt_gint_cpumem.png assets-fx/img/opt_gint_gray.png + assets-fx/img/opt_gint_keyboard.png assets-fx/img/opt_gint_ram.png assets-fx/img/opt_gint_rtc.png assets-fx/img/opt_gint_spuram.png diff --git a/assets-fx/fonts/mini.png b/assets-fx/fonts/mini.png index a29757cee7af9b17de5ace95f9d08cab03a42f88..bc097a887a015bb9c635aa1b6feaeecdab8f2288 100644 GIT binary patch delta 13131 zcmV-RGqlXvec*kNBmoMMB_My297zsj|Lqig1lyP6*eWtNnB&h=M6yo_50^*!DsvR+mG<| zYjA)3hY`R2Ir5dn@9Fc`mcPE9zP|qLLiM-bxzKn1A(X$oApQ3K@sDP2+~#j@9RGAj zYp3D=_@n>+|9hvucRx=zb7dLo=b=7t;l5plZ(OWWvX@nUHvTXCx!KRb&+ez+A^YRE zU;Nx*gcy>4A&29_3@_Yp_&S{!jFpF+y|8Ivmk8-L##0~ZUt zn=PTd@WH_Vc$N?hhNA*ui4U z+0_!eUeA*a~cpvj%b zl;dItLMicZlQE}M*_)0X@qgaDrUm=nSmNjFxC;AIQcaD$8ELXvIT!4w<&F)_l1eV6 z)Y3{XqfA#*&9&58Tb0kvmRfG5)z(^Xqs^Xr?xok>dhesp5l6x$%c!G`KE{}n_ng_y zGI{mnJLX(*rIlA%b+y&kSaV}OJMXgVZoBWX=ZPnse9Eb(oqoodH!ECB$=!U*t+(BN z$DI#bd+Fs@UVZKLH{Seh*S>c3Z$JOVu7$5%i?&nxzLRePJS*jWbFB40?OXhnopai{ z|G~~hchg_??K``6goN96?Bj)6Q=jlYzGueHf0Nb%CIM}e{Q`0Uo|A9`vk888{x4tn zZ-4)jECd;Ue{SLxw}C1ce`=*Z_S2QM!KwqpU<(qjsD88Ycmr716sGpYPu>PJQVVlD zs6b&4SL$!?HP<`|%X6U@Y(Ffvm}|_$`vr`;l?gp)_S)KbElvjQ;kAp`7G8U97=xE$ z5T~Z%{3d$iJQ3620r8+Q7j}W`ZM=A$dx?7(emeMn?KW2&qj34Ud+6ZyWf4l}LjK{v zt3+P*0IAo8thT1Lu+6kP(a(>y#{hu_vG<*u!MJQj?%N3Ew)c!gydBTnmv;x9Jm`JL zsO>h8Pf#0%!qh&wJTMkW$hY~em5w~}=1CxPTnL|>{dT(#KXSv0&w3-hDt9dBT>iQ* zk9nbg3yXd2FoLneh4H>sL{>+0|J{oGeL>v6Uy%oLZlH6*=h`kt>t1*LVQE0bS~<-Q zIz@K&01YC7L;!-pp1ZVoTfO&8qa&M$mV#%5?Wuc>`~t=r<tue}92 znIKWz+0G~VGhmbidqNqIbxUsHP9N^YOs~U#z7i{a3yZue3zll&&D&nA$@S5R& z9+#V7WlggXXWI*rXw}O)M8g4AV*^k8gxFGf)^&MPR&yLo@?my9_08?OS&7$^P;tj= zfn{PN>}iQ7t-giLr@=R6>}f^7-z((spD6Chji3rzq~|t%zOJp)>47&tbwdOQtXG9uGgAkdW&T=K&Z2S2@VHj#i6z2xwP{!zm)5=A+z-yR zrrcgZK+ynGxMCqmC`KR!_yWLKajQF)zYcnoz^VaA9JEiU3R7?){04X={>KhAM-=0-#0MlT<}5#o4d`JWM7RQ|^F+kZ1I|QooRi{Z`z-iOFVJm|4dyf$H43 z`*HC<^u^TT71$(~Z+*B-)Vpm$t^f@qQrx36UW!V4j@spt}2-PXc^%v*rjL0Ri8W1PU+#AG0+I z5&;1_lSm6v0UxuQ3mE|$#oZ;0aUI?37MZhkC5|+sb3n^dm@9LS=mtNN&kS(^&yzt7 zoB`^S-VI6tZj&hvAPgsK#2DTG#2Q(7_fwNq4uyX|M%O=qtNRsnosc(BuJDa->XcDg zod_4d?SM_vWXqxLAY+72cAO{xVc4N^k;y$o#ctT+SbQgfnqaQGbF0aD`e zOv=^()&yfzF6J^Ug_sMdjsjKm5zZ3LVL4$g5R}N*ieSEVJM<*%olJlvM?)a*d)Ovm!)g z6UnfH{Xrn!XivWKz;$l<;8_8U*F{eqc7Qmz;>((H$Xt;^IRHu_lRy zu9H<~pVng6@i$aY=|L+B%hB4n4|fXCgNgks>xI_wcDp(R;jz$G4GsxAtyNdG^0qk2!`=GN4mf+RVk>e#492A9027ufP%wdJc zOHkezl-OYz(^Se4*B!bN5L^*{>EhwCsRfRpuq)oQcseYdiz(M3y@MNX4@dySY%r1o z$<=jaM!-H`ibFd*Wyl-e6&mdNia4Zmaiz;vRfLk3<*^b^c>_}Og{G%!_&j0riSDu3 zT?&q9NJL=C0~#N|-l6Gwpwjj)N!%p7h(D8n5ySyElSL9Oe}A|q&H!;ZX^){Vv?d0i6U?^q*n3mHk;@u71yVuwF6nr)(26rCvZ;7A9( zY5e>q1jj(stYUQ|QsX*!U`_OWAJ-ad2!hXqVPLStmjEnG5uXuJ3_KIN23>>4 z>iGR+B>PBge*}!-E~MeG)$K}=id~|K{mQnw%CPZr9$>+7U?i?4J-fVG`ki1L6y*Z; z@(@a}#yLz$ZIu~utBO!M+>#+?eC0|wTq5m*U8Snz&`CfT4+ZRbLM4#=5mbl!Q7&If zp1}J+sR3QDtp7?KAb%06;kZuMkz-Ld0w^B{qoG4;E2z~(qhV&2DauNV6wC}>hFN1{ zxn8JIXjX&OT~^AFpqlXkoyN1pgU$cflbaKOf61qQgiSjDM586+wT>Tk^#MAk6FiaCJV5 z<9>N{9uG@^z`2xx%t*h-l?C?w$c}aj8Hxp4XmBkdsz?0;k5$Dc%3F=wl|#0mQs%RQ zfwu8ORO*HK>eM?8cW*#_D0NKC!Z*(u0YBK7kkW*N4)K0uxBsd%`9T`r{Vb3FZ_@bg zcj<%3!cE&DhA4ksbcd`P^{+@DF%W`P;EA@hC7}rgPfQbE{lh%9FA3-O2jNgI=ZPUZ-LUV!htMpDFF^t2AzFDcvV&bLcF7> zNQ8cJp$aZQ$q{C7U6r=rh7HAY{Bl_bDcOqJ2FN+kY3+Y>$VLRAl1{jZVFBU*!OMmw z5Gj|sxQG(*CV~M<#SVl*us|O( zFzB>qa1X$&!oHL{+@q*KsfldNLa@IDFi_zb2x>(d1p=S))!|BiNg`ks7F&gUNKwLh z<~s(DbHIP+G-Q`oCk8Q+vh*Kd4#Wxnek z3=M*aOYq<1x`H<2Q7*T}6i>&>G%aDR;p<0ZFQleVwoyoqm7tL=UsWEyLF{VXxZfp<+@3M`aHP znp?#c5->`gA!RWZDB2`YC~7ADmz{dmez9OG;M`gVV4>@9>WmIvU>Wrm2MdQMVk|qe zn#C>wn9IsxkVOTQ_}x@>E>^~_cbp2>8zAUVJvr<>qo!O@xnM`RehLqahlc)1vP==t zN*I4`hDKaSM-$i|QBmxK_V`{_8ORw6>1#2LCI4>bVMmP;t}p->9zxu0yr3zl@#Ny zu-^;s=iv%Lnui^-DAR6(9=sYH(1iLDA zv*XpD3Q5ZOogJcL7GXp6O9-b+bW#Rd*??q6ZcZ_ipk3IQZ)a}3OAgG>kz4qxT{}Um zR_2eYBi!%h5#O(lu=VI{tSZ#y&a8i-3M7)^G$EtMlM$KOVd$;OU3#lkQETct$FvW^ zsOJZ*wmgO%wd;gEHi&a6RtFkZ%410Q;i^*0Ta|sa5SoLiyi$caWw)nL5*WXDO^EkN z0w+8X^ZF!#RTS*e{ixgU3D2*54tR>CbJ#T4HVB%B6a?t0XyyZqFzFB(ZK!{;8AFQQ zTtC4yd=a-)Dx0v>Sx@-BoPVXIlCm=)1gNz!I`KO0?gud7fzyY&IB^}vU0Ssadh-UW zTRWp>KVpn*IRAnp1H$;OpHc7>p$J1MriyN93r#ot0cEo>*T%8c(5QrFJ zN@EieM9Ypha^kL3ddc;o&cvQ-vlfh{N=`)-({rk_SP$#sn7U5H_r&;|YB(o12;>dc78mPKsHyV>ow$g~wFb6)JJ;v#wo+%G zV|{MP=*z~}-cr#m=C6Nq{rYvT{{b0D1<}-US4k-I#bUa`!NfPzkr)A5OdQMZ$Wxu5 zTYWP!Oi67OYO2I0A0_^ZsyO7U1k0ytd|-0xNEIfk68Y%yEZ0;og!tQ^1RZo#JD21x z)1X%gqFxkfh-K;xitq-NCO~uu*SM1^*0M8hkRQ*b?w_foqve0|)%{}?bYff*Cp;PP zD|}1me^isw`GYOR`y0ws#~|z()&+q%s#N_@TfQ3z>rYj$HSeK?)GPN#9DI1k#*Pvp zTi@Ok45O-T(A5+9&K|L6uY9yG3!xIR1WvGtxHbS%h=K_L<&j5i#@5|WOD}#>d7)FK zkHu$YFS1*(IlO-g%v0_H_l*@VVt1wMlubq?gT;#JQwU5T0I-*|-%{2=fVX8yj7xL-07Y((pk?}uAu&4fR7<0ZuwsM?|W8N^nqn zvg)ZCreuHJPzeTN;O2wobpzi3ie+IeF*~w>x?&~rDxX?S=P2!4{Q|hQE^n(c_+kxq zON5;e<&=H1dTktvn5(D*x?0HuwkOCwQD^%^$SRl>XNOTN%Qu0(#cKGG5b*9A1A7iI z2=dYKO&0d8b`|cWPA;g|d4;G4x6VrA-%ON%J-~k_S*coFhuZ{IE(&qk4i(oDpLpy@OM?XLaWyvc5G0Pp-NWbbEv(WM{$t{gVtkj>Tvs8 zDer$TvlF*;-1%!!`MW{+bL#rKD_BP;>K)uc_6KFmVjhsaqoivuUY()}u+nN5;1=1` z2`-4x)w|SNXV=ix!hJB7e*}905*T`^bzzCvqLE#KvhUI2Gt5WbOOo~JP7`aGosN8T z_#wOh9Da!YV!P#Y__4w5N@)2UeyHg0v*v%N?!R(Z_p9V}aB0L3BroZ3s#zP`J1PMa z$emAxrVe4+=0zfXi3N#jms7h>J?mulw8Qgk_zZ?#KgaTFwCkq3 zk*Qq?VM04RCR~V?&jNqmdg?${+(LiHfzMBM#mU-lgaqhBRW&g1tNA$uujmn-=VvMT zPB=pN>Cn0^wUx*>i<+*I@~|p@QU%Def|PMV$fC3&cequRq~j-R6HgHlTZU7$8Sy5e z5{l}&n#ECW7uD3T@bWpdWC4OqjTj=KhRp{%5>P%=^=ic_sUjw?N?CN3Vnu&u?Eu;d zUQ7wDtXeYfbtR69X=OIBpv1Zts<{CoMr6tuS*r;J#HJKd>RKH#du zIaYtG(h<7JQo!`OO6AzstY%mB%=9>NHT|)7NFS#6#mH)SA>$vdQ|oKzNl& zE4N$K!5!D19<>Z&8Er*xDQKQ zMgOEaVbzeIqq^MPhgIBH&kfHdU#lSu)%XbLtkLp$mO-v?)J=mT*|>)29w<{Z7ogXm zOm~5Hz>Gg5ZycsF)FhXV$Ivn&G;5Lwf#TCGsI2x95BcgAJYen_%F#Zh zt?oy@EMfqExP8ibh_YZQ7^b$k-qni=mGdgw*nK+qzbUal(2LcGe(l>u2JI$HYt)Jb3sranf62vnb zY%-K=JyLl5C~7E#fC+eejw43#wyt?Vpp4ToC3+w1SHc#5L~|*h4)WB`a_*R zS=Kt7ib#KwRk|D{J2y9ycSC3bY97B+YCRV(wE)Kf6u#-Mr*;Nas}SA&3vfs_8TO}+ zU=>tKX$6&#Z1u$jd{0qzcRP^7-qCe`fV1Dx%>4w;)TU`e5#X*W`uQ4)pq>fUo_~fS z*ubW);Vy(nVVKhISDn>M$2?sgHRs!3j#$bk$%gV_sEVk5B}&)EllOkLn7S&OIZv2D>f+;f8|jn8kuALKPKmch&Je zfY|>Pu5I@Zxb|zPhVMELnFQmlU@|Rn> ziiv->OK@ssJN(_dskc&Pf$(RvPts(PiU!2Du1@zB;iN5-$bKLRvAV9FR+X+hDdNO) zsGRrXg0)0sPDn2#ab@QT(^Y*@S>jDY16)v_T|nY$EJ82iXjaW< zDgwTa;XWdHQy+2P$_-=bD6k5?*RNB?&q;rY(*d2;ccX)pYwYsb@yP-17{UC@Qt=N; zw?aS0!mx<>33A%xP@jZwLS>`Vy;?hzuN|f_0(5)(8U-;_-S$8!8wG(DK?tw)Ie)jw2s(|^VU^8-Fq0A^L3W}-LHeRj zM-?2}|F_550e?Uaa&c>BLu3Q>6o%wV@$7su9AxbW-5akcc6T z{i^sH9vAgu+~ME1=o78Kp4k21k$?Qe?fby#e!lnpx5kEgp}jhsf%M2Qi;_SO;RJr_ zYfkmPOL@F^js^-nbzI;97Qp(gUsW|(<6>U@s!!{h8X;kyqZ&sLP}`{-W9omrt+Pp} z9yW1Si(xOH>`$8tWYz)970@oUQ-cwzGdK0}pY7UjY%c*p&rF4@Kj$oVu* zKsC@9lpErS$_An#K<5TqRJwm_C*C_|y;#{v-lJ(;89W1I{~mdFe`N1JBkvHBtEMU? z$$~0MRqXRr;t!rlW?_z(Z@ua*z!9E}79{Gc+Jp$Ayqz^lBh zdn<0Ayi_}VHIt>PYB5yJ>Bu_w$|?>e)M|vK`l{E{sIsG0eVc!(0SL6Dp7hupj7j4m z!mUMN8UBcMcc@p)MR^C&=&CbK5v-t`kdjGwlBVO0c9c+>?5pF|aF08(wN9fYkeu8V z_JK8r+myK6-|~m}m)dV}L#VwvveKG5XF7QQ?3&ou@R3jTjauRQ-|`kOd#m2=>Sej# ziUx7BplDmB8fBkjq>V*K17cW^0-s1;NM4G3-OgMbnJY0#@gIg}7C9rwus} zSGxH(jeFFtq|;BG5_xtR1FzAFf}?5xQd_Fe&NhdTa zp+NP+a1?x@I%TO|IOaJgaVrx&U+Q!5XaQ9@2HYZp-tc~<7L>6?sn?}JlF&sYLPTy4 z4gHBn6VRZ?uUOMm(FvKKPLrClkQl{@mq>a03w_#FUnJ$ir7Rt76PgO)5nDS)Iu)*! zvZjAZNBWXxN=7jJFnwit6_i56q1@)7j8hnl&lBtU4k5L&+7ECQ}x)YiUppU zmqnk|lcf$CqOBSV<7FT3R!$c62bESDNNInN;p(zeIT7r%$n^d7;bHjFGRaLJm z{7D~ae{?qXfYX{a&4;Iz9Xqd}t3%jt!=C<&Sx@^s3{vTMoKaP|EW3Dz!h*EAW^uNI zCapDLfU30?yN=uf_m5icYUlC2X{estMeM0qVvb*==_T$b4^D7UbA?WbA)u?PIf42Na|E)ZZWE^a|6&p=Wt@{xog0g`Xcmm+Q{b_jQAbgOEVB( zZny~hJJ5aE`isu-3VuqqC|DeP`N|XXzEBw!DR3WIW9bO$IyIOdjZPGIyjGjp`qp4Q zwKj^~v1~(a(^>HcgIBk``Ys!Uz{Y=1bPZm#3LH)3^zAv7GuHL#GxEw}Ty>;#kgz^u?B@!V1)#RZuY073z{6Nj=oSK4yLQt zP36ildVp9H)~ZH?B3g8GsNx+$0b$5ebDCCbwZ&-ki>+6kA13uQd%?2Cckh2;=fer$ zR7EpOgcgA+%ok77^ftDKZ(;RBT~+zbBjV9TlPNV{%VtW?ss=~3Mxdmvs}V7h+$vwy zCQ~CDakqD?dU}a|I$6(__ZHhl+(H7@XL_T*Mr@R#K+;B7hif0$V*wxlKn>d^u9|}# zOJzJtEPtm@&`$WAN}UfZj2C~Y_k_RUM-euHzz-iS>S4Dy}8;v9g;R1hla z%?xL&_Er=Thtx52y#9oblZHvLM<=g(ftILziF5dx@ldCUW z0sE5(FvNc!XdCw>ZhlSM;B!B61otmJ;jfPHn;W=)^aBkH*(ygum#Sz)JWjQADg#(V z3^=D|!nk<43eJYw3t;5{0pSDU?=eWBXByWEN&hLU<&@U?r>xfe%pvwPPi2E1$ zvTisZ?rZKF5p;fCjeS&EqR>)J#4fcQrle|;!gh4;5S0V2 z6VzzSVnYkZSNA&>54AuKVb%)i3MY~+bMB|9j3`NqCs9nSI+$HdLAg?RxQb4cr2M7X6EppD`^O8YFBqc~A0 zG`W|g2Ci+N=|Ko}rw7$ecg>!RLoE1P*;$ob9!1+sAReE>GqzlRHF;2LjlRh}4fRz6 zEH0{FO3>RrL#Bf&+gaL-+EGStsl_Gg?1fFKs)x{QV5k6hL5zGnUsGDo`Oh4EOYzeR3Ta=P=U*i8o<20e&al;fr8;31n5g$t zVX{vhVzFGAU4!0#!Zypci7HwhbsC)G)VZ!6EFrgWUiAQw<13v$mDf-o*3;~1U|Kv1 zbr*+Z_w+gnR(cz4mRygZ{8DSo^_pd`G@SY+TN|KBu;63iV5zEE#cQl?Q8`g2C`CvF zfZ?bCgMDhYqR2KNwxb}n`@ueH;o%ml441&;p=mk~Fpc>c zK7-Ba1Q29$nrwT&8dfxU}l%WDM+7XRVkEHt5v|?5(RCUfqh#uQ784k`$HIEv{aAl`yz{@QeXx z00oCqyQiz-xv{5Tlb@G0cB_a@8;%nvD@7Io3Yz`IYf~wX8?!GKO{CEHv-&o)h=68^ zSk2deNSa-UTllF-@Igt)JC*(%YCE3#I1KP;=v)#j!}}%v=|c&5f?ijp zoz2AVpMtJw$4P4ZG9<3kEpq3|W@QD04>2{){ zOtd}@fmIN)f73qxd+NviviyOxRejhF@TL<4YlnwxKoQvzog70xuRaij@7D)2l&%kd zH5keSX=I(cO|EK6yb>QODpczpaAa-MD$`M;<uj3-nG}#7*f0hmUgRH%uefk zW>)g-s<{3X)Z#F&*`zoP9?}S)>Qr{ib%!;Ct4AhS8C~WnRZ^i3!rD3@xoDg!@8GIP zGJW()Q^rW{Am}0X2MzaThluw?v|xpQQ+q)SKdCMpSOch|=E22JT%RhtH^HOQc6JSx z?5=7P0`6aQM{g7?9o4WwfvT!2Ev07lvZwl}nBdhv4RMt9;-^tJ_Mi*SI*AqPl&?Hj zH8B;~Ydl%^CF(OXKNoNC@d^1LWFR2k+<#wd~R8IJ)eRBsCZKL09@W(bGDKHTnR;?f%ZYq z3A`13xPS&MK-|p>-H+Yy-+7_?u^axH7urbjl|94<_XYcLl;C@lqdP zHiqAMdyQo$wvT0*UwzPn28`o>JXXV=)zJSnXrXtQ!FUB~Ik)nsPzlu#92N2@anQ4d zSVWcK+Qb{1%=`koHU*-~YWW~(`aA;yGRkK1{Ga#?Tpi^h z5mmy+K1t3pJlr@#xeN7Y@tn;IK*ah@GqP|;q}u|tb$kWQaGlpUadyJuqsnhkQYB!kB6 zeQ8#pinmkMVu1omAZ6vsd$r<8tEZG8Qyy>YLpVO!%}@KN9S^Lmtd;eT`l^GR^JyT} zVeO}Z6hKqA7Bm#|1)=hC`mi4jIJmmN);j>(z9-F-yhw7--A8LbyB z4At~0%{aT51?=H7)pf_9<0j3nC`W9m>oc*w29D5GvJr!qf z$Gg;bgJiQtq({KekzM>uQ?bvW(Ft6V+}39vMEf`jf^$`W51l5g2lWTop+b3CAQ#nR zud!EXdCM`gKw$m+3_Jis2+}U-5F3(&8j$}*jk*1_Tw8R9$nkc~Rva+*!AgfG#Po zg14%bHtQUJ6yc*Rl=uvHqHzE^_QSe0b`)L6isKRNX0^fFOZ^Tv~OcilIrA%F6u2DB~+)BSW*F#`f845X?AO-fwwEG?w2&2<{wTQ z60MJK!*^8orH>h?5P!f8GUY;yge7^2IsgSN=fC=#GWS3DptIjE^q>yz{{fk=C?Zi1 zX{G=t000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jv115h6B!VfGu7T01CzL`g(J zRCwC$T+wobAPhvuU%aopkF*bVEQKU&613iQdFnA3U=zZ!VwZj23(LH+4qGhCV*F(B z0V={rOoMu_aC80?+1|zRPkO-~Ap^3-F>@jUT9{U9@J}V|1uqFe@_fX#NcPZt6^?LooeL0z1 zWI$QSLmyhUCN+R5Tuhf@K58uBk0&dySoqq0Sa-b|xmirW`@V~LT^vouf@Tx1bR8o4 zxanz=#+U1Q_iJR0oelY>Z9%I9-K=>Isnke<=6HLYksPY^gv`?wcc7bH>q8up=3vmr zb4jqVy-m zhp^<0SkNjnvvQraGGxd=D%{bq_pR;&9IN5Fp%hSHK^LF7$d|o;GYY$^RnW;pNt*~L zdFVtQYI8b`qu76EZUx}9!PQuZ(CIu>qlfpDD`YJV5E)RMUB(Dnm|YL);S|b=Lu}hz z1A-M8wo}+*Plo!A!1wP{FimYrqM&J{8<1LR0Y3Na7*2xTmQAuI4<&6PpyZ(wGRs9d z%lk@d`Wr12P~$RxCYaarEk)i3+SJC6zYP`pMa~696qpNqs|_di_^nTE^tgDK^qip~ z4evV00`nA_f-i04OqJ(`SBSY;9ttY5 z%y{vhJ76$_0|iH*+JmTbky8r#3`}ODNYr$vx{o6m` z>-XUP_>B?2z8(2W;?MN?Ys+6>PhVgEcA@&)pIqoW-w5R|FG#<=fBa|T8@Kt}8^=H0 z(N1ajKmOBy|L?ui-@Biuo4K+K_481lw{YJs!w)W2DcQ>^zZ(A){=eC;!LRP8-y!?s zw_p6)VT2fxe<6qC!VE9maQJhF%{}ILW8=>lcTD!Ro?0AnC!a#f`W2HZ0ULim8Uq&# zyySdn+b_6@HM0oYVa+_7D7(3vq6(P zk15B+4un$T;U;5Fsj@d6JK}%6c})xUv$4d_*Krm0r=*%1do$8xvvMxjPs<$}nkAK7 zN~xulUPhU&rkZQ1wYDmsn=Q56N~^84-bR}}_1sIZz4hKlpCgWhOO{bb8-0v1C+|74 zn`QFq$xqC=;z}#8vg&H9ud(LFe0JVt*WGsCW6u*$I{B1SPdojLGjA)nn3B8smRoPT z{f;{yw)WD?ue|!&>u>fe6-!mfp{U5mC;`ni*C0z50}eRHh!zwKN6nVoam zy8pq>MR(I*_U${nc7%l6cI@MYT2r6!K7MA#&cBn@0ww`tll%g50iTm^1G5SKbp9`2 z_;3IGlPd%nfB)aaD{cc-F#gm^ee9hQSsjUQzvKf6$bB23-1eT4h_~aJ`||FflLx); z7`5F7@(F6gP?*{$mj}iI3Hdg^wbGGC-aH9pjtk+Fv)^v_;YV&*@mX)ASLKf7oXcPL z(gipc6{?!Q}+zb}aU^%Z#_=LR|_e6HVo$Y**KLbWduqTuOS-0dC?)2ea%=9|!e=D)lx3I{ovS6tO-n{L_I-U)rtQY#e zSSAasFw5e=qF7g3+^yx`bvU+{Nb|Cvmo+6avh#%p7s1X`K^|MZiM?o};3)3^>i{X? z!%%et(f-uy_z$?o6?!AiqjMU(K6l75WS ze{s19R@O8Nakjk>iB`R=Lo^&Z^v#-3IL{JlaB|BB+C+z6_mMS5=I=j+-!ogR4eQ#V9_FwPry zAu5uq+0=KEeO4gij0f!2Zkm~HEd|KT6 zE1Ed5=($FLj1qV|Thb2>4@q3LAe0(h=0rs^sL9p)CwNcpcd}At;W`Ub!)scDe@%?_ zoPuB;A8j{1`WAaTX+EA7X{F805kGhs``}Bb5m{M8Ongj4ORBH31-EiX0Y(N>Io=np z`M{0va(+>!O{Y%7Sc4OiW5n93OHl9HSACqyt<%Z9g5=(^XYSXYbF0FgJxgVTs zO}V{-fT97WaK%EBP>etz$bfMqe=M7bA}fMNf=Ou)UuR%*;lg7;U&L=`g?TN!cCs>! z$PEpc@dbdf;#PMoe;xEFfmH*LIB1_x6{g@q_zmz#{Er=Kjwr@ui4RCx%x7ZvzXQC1 znfpmJ8_>f%h;Ri^=ZT1+2b_uGI48x+_FGVl6Z4D^bxAU<2!Ryv5|hm^ShJ2>0@b;5 z_v7M!=!>bvE3io}-}-QwsCV0hTn89m*ofyVH;87+M2QF6CXTOz9YCUHTdN&Vo$#C_ z>h|F|JaKI(WG|0+xHEwSKwNxyp@K4x8+dEJ!IPB;PXhdKv*rjL0Rcag1PU+#FS9iY z5&;1xlSm6v0bjG53mE|$)s?zGz?<%Mi_F=&5=WZRIiO`J%$2!Ebc27B&kS(^kCQ^M;X!mvZ-B9nWFiruisvG_>@HNjlz_2ThM1fzan1Ej>` znUt*otO>@bT+C%y3NaT@9R;fBBb+6g!*ar0ASjWq6~TP#cIZjiJDC7U$brbBB~7O5 zJb{0G+=Dn*8(th*!h??ez+(ls-t*I!p;Q3yS^hlq{26)dO*(N67sKh%sw}cjeMO_W z4JE83q(v4*3sB9qU^4?j+aY2&ExeTX!l{3NfbCcnZh(NyO?qw2LXPM%#KngYVoeeY zT_>x~KCQ*B<8P>*(t}nMmZPuuY5apf~ zMhj@bT;6;-%SKW`uu8dXH(@&0F(Jpj!ajiw>Djgy5CM1MEt ze4snprg#E^l0F@?`*;sBJK8qSUB!8d0QN1VebCtiOYrLG$ng>i4vIo013>Nt=CH!! zB`9wUO6;(VX)5K2>keHB2(Adfbn$T6)B;CP*cESDJRO$K#gyxi-ocHx2P6PuHWq$dyaB2CLeo<gD9Q!w zi|B!*QLiBgdj_1W-N@Mni|xD^RP6M#Ic3QhC@a2W}N#Z1ZDZ7$0D5V-S zc5$zORxrKbQ6PXnF%GJwtTOn3+Gf{~e+9*ZPCEE0LSa;LQQ{Ylc!AW5-%f6Jqkh=5 zr`#bwA5{AUegMO_I;L|K-jjdH;QoJ&~{cz75^8FAH)CKi>*dsH^2x`)RlS0)DVDA*Bfk9pe4SZvRzj@(*cz_oF=iucYza z@6rd6g`2iR3{ii&=nh#o>R*vQVju*oz!Pnyfj6>JCpT5OTa|5WN8BU^!BJKLmy}6K zDicv%40k+L201Y=Tow;iIUK7vm55o0baYcy-U6jzg#%gIQUV;P3_AOQ@T#l=gm_0$ zkqG_dLKR$qk|WIEx+-nK4I7H*_~o(=QnD4b4Ulu7)7pROkc|jJC7o~+!ve$sf|m_V zAW|q@W!gh5s^O8>a7TEeJe@@l_t9MySkyifNA~e!IcP)%Cdd3ALDJQ zxg%#Y$8YFryNV7&pf$X;QtpCz0+Li8`#NDaI{km(i5_N$TZXS^!d|t{L&c;7j>;Yo zG`ET?Bw&;}L&{<-P_#*)P}EHPCp-13{bIpXz`3;!z(UvI)EOPTz%uGB4i*ki#8`G_ zHH%#WFqf6XAd3np@w=(&T&#>;?>H5%H$c##dUDu%Moqb*a>0&r{S+P;4-Ng3WSJtO zl`wzY42`&ujzD0gh`q<{ALXqGDjD+Zl#Nl+P}M>p>8f!@F|xc_lcRcJR0*U}$->-g z$Y+bg7u7HBajkv>{nugsX>A?f4gOR5)N>UAq2i|H$t#pGTUGJi1h%1MC4?O6m=FpV zcgeDK_jhCe?`+*I2y1-`koN#bP*FP!uxx)1i~v@IMY2O+UW0#LkFiIk0x;I9Y(?uVN#w(rpJQ1#mDbD=EfZ zVZRsN&%+ghHc^t0E^bW>Q9?l3n=5nsi<)ykmUG`%b8v6Mq6B-4Jk8M&3A!Imb%=k` ztK^u=%fs^vH{7C+?--2LA$Uq-_G26mmHX%Be(EXyLN(B zt;~O_j&Q%1M|{6J!q%g+v8qs)JF|a=Dv(Hu(}av3Pex>BhoQGBcj>KGMXjmp9Me7s zqn;nM+VU87)UFfu*dWfOSRH6sDUTuHhpS30Z&miyLTC=6@=6uzl--^}NnrfqH6h+7 z37qgm%W(+BI zbNvL<@I~BGscgbhXFcKja{iT;O3KcJ5TMq^=)~)|yC1-S2TmXA;>2|vcWKo!=*=6f zZtaYk{fIHL;d}>2288ilKcnC&LJ@{iOcnn|$lfSL0`>cIvCOwpnNOw6FVxAn?-t7Z zgC$^H+y^_ugR`%M1n44KDkFbeU~Cx<`f|gqw(_g5j0_0$t|p(El_0ncGXg=;_o@l= z&^GxcnpY}Fisw(g~XMF?F4Y?}_m_)o@O35Xc*>EiTrfP*dj%I&l$|YYlAqcCOFeZKcjW z$NJoo(U*;{y``dC%wK=!`t|Ev{{u3R3Zkjyu98sZi^X(>gNbjbBQXNBm^hZ*k*7LA zxB6yen3CEm)KrO0K1%!*RdL8y36@XQ_`u}Wkt$47CGyeZS*}@+Ai(xX&_PGFb4l(p z4SJOz>P3-;Sf<{f2yakn0z`*!jXSAgEj!}|`SD!p{+UWTT0VbY-9J`AC&ndl!jlod z!nbt(M>Q#(KiE>dzoATZ48opaT@aX~O4Sdw<)?wL{#5l^^B!7Ay>frV!H0Kj>?jek z_2W&!Fsj-HT|JTS>=AqR%18UM5GoN%-~^k9YXcyKD3}mX9(mMeY~B5^^x_AV7dln? zSbSFYBD)2f!>fP5JmoHM-&pY?c2~Mi*ng}?*?0DDRMEoB`<4t5*IDQ$qU ztMt(duzB-prCz=^$t^JTsVCG*i*@4!byg#RCqdP&Dt*<#k83(I1suR{ovciv00NG1 zAfl}lK!XbFP!LE9^Hcf}Qi=6b_W`)fig7nL)##wN^+UFKdP z8?aJo=I`5x`za&AMzkLJez;{fc@1MwVWV~i-Qc9BJ03WdRZ(^&sLHabBEK0O`?8aN zGZXg{cA`pj-qc$uf}-}QUr~FY|E-X@A05+g6ZmQeWZQ_=P(Oqf;G}bPM5M~61P8Sz ztDdT1O4ff3m0%zSZa!#UH}DOhSQf?-vm+a*D^?<}@~PEyj?%u>FMw<7^0q32FV#Q{X%|r><1AKpym8!*cxJ^*yq7awuP;o8si3hLu zFYfe1Z*o85PTqex)DQg0{n?>Z)LV3tpgOmqBV?o*m@Blk3yzm$S&I;al}Ns0a56-| zUj>!TR;H--A-oI6tV7i`*J?`!e^-Sow0iAf#|8x%s$?ZThuXV&6c>3gXg&6(4!6IR z^8SA`J8?_Loj(_qzZ;Z4r>?KNf^~$V-oYJYe^ACO<^kC|O1k#q)hVg~E3I|`Zjnu$ z;DQKUy-U4yb`4!E+y`U%CfEy*z|c#r3roZnjqDPXeUBEOVLs|!lB`d6npnf^bmXJM z583_a@I&+$+by5Nj}2~DLd)myLq&g|H9voK|CPJCpCzw@OCx?Dc}a&;&Dz-BQ3;qp z?tCgVbqLcoFB0iXEJ#$loZ5ZrStql}Y+>A1s0Vv!a01mGDMvzx;D^=Q!X2y78{Q$1{gi+G zsH~%*-c*h*1;^Hgq1)+4MMCNe#ldyBW4%zI zB#{`C?U!P}HoXqYk&=GZ=dP9LuZGuAA;g zrgkNS3GMKha3NYg3;cQOsRLPY3mtz4K0nnJCu_eE5}*@R)xf~7=I0Q+qDOR|pQYqG z;RxZUL+iTKRwCalYPw3w!>asA6(GwBQpN=#i_(hR;Z{|Wj-RYeJViuo8BWz^#G8al zD5~pf7Du^VR8zyk%jeLN1qd=VVu*wqHXrOrK>1MBs}-lDikQ4AWzkiN6`6mv1866B zF(tUNYRSCUIgb^U5u|Jp#5o_keOZU=s;X{-Qo!s*5bM?tjDy5n>H{gD{f3Gw|K_(< zi9{T)ES}-0z2u9FyPqNB|H#GfvVK(w1s1y~OQLELwG7vNfjgE$=e9%Z8a|1V!G;gC zyH&Dx6@u`Kh&k^zV01y}U;cl}P;ycSz)&$)R0|(Jwu9Q1K{Cw{iApH?VI5GX5Y|uLL|iL3qY8iIlTo4sm_9>Q zuV4ZmGZ$K|Ml}OT*pH|q0%8|2Uk7TRwl1Qm(?E$&UzgPq4~>^lYf?waChO}0;Z-KB z+-_BqhnPLUHmt)?ef6z&DM$cj;0Q<(4N!oYs11wQECfzY9aTu+rN@S{I$Yn}cM zYx}M-I~Cw7T-7e;EIH@DRG z=FhYeb(K7VS9pI|)X8unAVf9i1s!kdj=ii(;#KiTc_S8vfcXg7T_=$5W%fBJNBfkv zx*z$nhync1?NiP}lm$z{Ftx??u3l8AoLAY#?$f~^k93FH@zj?Gtc3sK9-oQ^qxvrK zVoOA$CEA!O5{0j;w~#wK3X$+`OiewY{p=P@#b?cyAfDM^ zlc8kmk;3DjqJ}~Un1HwEIARoU17XzT9G#9S(feS(61MmwnoId~kf(l@b3dKVA?V-j2^{DC)(c4531$cux-2uSK zvew~LM3R53(&Z@Gxw($!NT1vn0%@J)9;wKJ$%h3M{IfJ3s$us?MK ztDsU!E2xBIt1m9#dy1;N+kqVRj;{Lyoc)ew?gwzDHccCf0C!c<&(}}{^-QSt{4*56 z1~zpKcOg6q!<2r%>a1Qm=IQFWIoX0FZj;nt#Fc+@s(LqhVT;%n>%ji;f_>pfC&Fq~ zH{Y5KPEe|*s|HgU^Q!84gd&)w-f$&(R9Cok?iryq*mVgAHxy*YEEY@=s;F?gtB&^p z#QsaTw%xzr+RvdHzUvItEX$|NGa;_nWEAyMve6puG6ZIrnc9GfyWL8^kP>UlUvB9t zCfbiPbRl4q^h!fAD ziUQ1}sG?b2#B8tlA78f!))J99A-#~qm7OO{SM^0@i8l=ma6x@`0g0=z2)&G>Sv8-j z2>3dN`-tRCeZ+k$H;kpDz$*A&zfKuHCnbMQ2Xt27jSf<-vCC)2CkMD=1oJOT#W$30 zg?@~MVG;8a5DoY zRnU-B+@Ll_j?bYE7q(_EXlmvPRC-75W zbE@}U%HzFrG*IZN;{p$`0M>8)s;bEv7xU^@eOlMl2nqWf)i{EH+D_#dQ|EteolQdZ zc-5k04WF@=0(Bl(v#{uW_%sWP-7j1l5%bh63@~#?QOCVX0jUwnYA95V=s_LZIFK^` zY14?m12pg%>(oHOt)m+_mh(vkPO7epUt9LT3!5kK8L9-cC>L(QJMIs4$u>?v&Zlt# zs)5F!+z?MxHV_Q~Iycy&(p`T$@!m1(#mY|d9!=xQ;29wM_sF~ZBYXc5d54f(HB~7| z7F1EHVxOlHfACB)3v;~u=v8k4j__=>AW>h{CPWbB?W|EE=Wl87ubDQ=+9|CDTuS)6 zguNveK-De^ETTEbPjeha+twgEA$^gZQg_{g_%Eu{34eG6mf}=+q{@Fi%^5>m9nCY+ zZv#!Vx@L5#;^_has8Ss!CJnSgYWVAwIoeYHFLjGGxN7lJlR&gkyRwFFcSG}G_l^wO}+f;uIK%gb{q{rr9Od1an zZY>JS@JFn>L%m`y$~%ZgSDk5!UTlIEVFU$Q_ zG>D6rW9g~9bW(q#oT<)BvPuDncJ)}{zxpDV60&#JnLaA}={Tl}9TYJhwZatc9opqo zNRO858HCbIKOSwU1SWrmT;__nUSnD}Thsg~2tHPhVIM*+nr4g^usY`}#I343ZODPR z(#^kV+@p3Soqp<+$g|5Bc#T#R99095+ERrNi-m;HIJ$p<>8ljR@9wWM=qj4i37x8l zE%`sx$$p6rI_9`4q+PRuU2r-L8;l2ooDwc$6|cEiUE)>g=Y=%31b|B zW6^=FNCzvlH$RRWLH!7DzAJiyLLH*Wx_ZFS23}ZN>0`^7$kbWd8(BT_L>@J*ZXy8R zJ049NkW7CTdSbIA+-KaxgUiTZl1=?eGn}#20rxc0mH5Vc;rdT@1@rFG{To=x8f>L$ zAcS@uP*@q9Y*_gf@#I~`A8U(LL88`QGrz9#ZSSHgEkGcz8Yj?J8G|!_ae-JL_m>44 zudC{Vh|SVlzlORvUVO@P9Gy6c537RHvR&eqaC(3B)L4NeH1nzNb$pToy&w6LPH0p@ zf$E3hDELBk%2K^>%yUlSRwjDB)aT;S0;+NhxJ3rN;r&W2C}WFKuS}ti_^u_f;S6 zLsS1;ieIMGXHd0p<&GeBUdOvu!~U8nBsH-v+<<^7Sr6R11UcNE)#+oW>akT73p_P1 zi$1F-OC2;sTQwBM%Rb(%oGj`ODy=k-(jb4s)n%u2Tvu(i1RYg2sY1i%hV8_vs$N(4 zlRnb^=xpo(r!{Mu4^JyQc3weOhp^v)o6E}>`>H@)Tz$gVpLt{2B3q^;l$Q+*MKwiMd;VGk4*7oFo3{FH1_usHbgl_%zXp)xE|;6Ad((h<~kYA`<*@oJtv*Hg1uWozwT{Z}Tjh}z$8oX!~IGV`m+jA;stn1TfPY7zqvfUA z_Ne67z}F^X)yBK3zB{T1NL!*qGx1?pY=o*}4GOKm3JDC|>`zG-G&xiqeW5}eOjoU& z%9UgE0I?>lRgDNmwCLzi#XE!o!jPrrG_BTZi_z#8Tdz7lOzLU&f@O{G-ot;+hZDf5 zie{DwEdo`TFP^69ZEO!e!s>~-s`8sh#G{KQQ)<4J&6J*14UTG!KuKFyBVr`ERlcfC zrbag6Ztqt0^b-AavYsvPEw+oeg#@h6^hSS;*eFGTq>Zo+*FLbv0zd$O8n#PZH3vJE z%6ODm{!X8uo$xu8Iv-dVFH(Q+34gt!)}X4A8GQ0Hd5}YcT$Z2KCL`y zgt8tLy{dsGPBraRRWC~&5w$RKuaj~4KdLJ0XtCM|!ULlL?zIsRAEi6QIRKHVAXL8j>Ro2QWgEyr*dUlli*W{y&C=67K35Sw|&2>%k7iRF5UryldLaX z0q2tmFvNd<&^GQ%-29xj!RP+T5!^3&!e1TXH#czq>IWJavQ>_RE>+Qpc${kKR0gn! z7;sL_gmLk76`T#V7r@E^0>THx-(!$M&or(TlKxv(%PFn(Z&|JRnMZC<*6-fn5%(|h zW!-Q-+}GTzYW@|)RUUs~H=>3%oVloTBk26P8v9hTM4_dch+S$qOi9%wh3)9xAu0!4 zC#cbu#fBD+ukLp&9%_Le!mJh26;32u=G;$H8BvlJPokJubuhb_f^wzsa21^>PbqV; z34)jsZyl7jEc%X0DS@82nopes4H7n*JganMK2Nl! zXb_SHF#}uRIP_1+>YzSxbQUjj*s$i0PjxU$GXQYCWs%&b87NT`h>&6$r;psz7|g6g zn%qlL1J}0C^dN+~(}QZKyJkReY3mXKRGuX+H;@s&=W%4?_(>uL5hFfAU1 zx{E`ydwLxOE4__2ORh&yeyKI)dd;#|8czL^tqss5Sn#oMuvFEo;x$&csGKMhlp-Vo z@?HIP`os>_T1>ubz;M)n!9F!xQRE|QRL(>dAYS&jkFC*vIrRr$W>Yn3RV$1}QVwwk zod)9ZHilMIX-a@~okow)(o&Htyg_BDNI4=&(O^L2;?!waEl!0^qI$I}4HQ%^yF71$ zfvCxc$bo0+vnIGKUewK-RIK#LSVW!J3a{L>M%1nDWwuSIsKLv;vYw*pLPHHfJQu_q zf+SKGGzn3EbIT);yS;|}V8||hx;wzQt68sB+ffkP{a_!p@Nf%NhD+e_&@`O~n8vge zLHk|%x}O!l-_^eAjpYrc9ARuzV{-Mm6dKUAR0k}!(N&R^z~JR=0`cJIU~SPmNAR?Q#-casozcf3 zcx5YXn3O)g=LqMtE#VWMoQ*-&*r2oR=&8Ysb?Ac2!k;w8j`(xlUEk8@PeCOVBjiBl zQ3WJa&Z*N(T^pz9p4vMifi@{j2bNitgM_-Rt;y<=lM6+CkWf}#SL5bY)YqoESEmZQ zi8DBVe9)r|)y--keCc**p=7Hj{x?g&b^AmE9knD)dQ;2oLaMmFEWOE^5I~d8*v8(f zr16=+sn5&Mc?9UL_>$GIgbr!N=KYv^1L0yZPVMy?K43K;2P7FR6j5U+6@I!Z#4(Kh zH7R>pBfN_Kv_XJgveIq-AL^%JS-dzA`d_wxFBVPk(73qzHZ&3fV2NwZBT1U|2#olt z$@xJ^+dGvm)>$^Q_KGDHVX@c z*Fa+~P@ObEn2{?$@}AC&03l@;lrXS_0?#*yYFR7E^Cr!iM-29?abl|I!hUrss_Fh1 z;|j?a?}XQGb|om4^*rVLIIq=P1kLVRP?oRk=#$4x9u zQu=qDEz^`1GpcPjfdyk%(47GJi#W z!j+DOA4LtHm{&7M)Ze2q4_YiW193|=7q9GMWU0LosVh|%*TAQs9JyEW991y%iEyf!#!0kJmQ0wRm157VnrJD1X|H_b5n%aevtK~C zrCC!+L?RHOmC;g_^HLKHPWtU*f3imQD3SB+V}FijRA@AYedK+PYf>2vaZ|PD z>Lgm9L8uV>sd0rGBcbzkf?Q2_zZz(XA{speb42jT6N^3wZlXU`H=_iJSJjU()$Dh(Z8ZM;Id@42hT~v;+*@dE&E}E^8RUEF~3bf z!JM&6ovi3k%Eor><3_ds^BD?LR+`aH9OA)HD`o-Ov8uFJFk;W%(iC{}1W=DqFL)g9rcs z010rDJUbf*2MQH1aj_UClV3Y1e?mz_K~#9!?OZ`}!ypXAo_sN{%p=`{GcE;5tR(C> z)8*7KSink%WsSRR+g4cSm37!+Sr+3biw{r{K4KaK)Bui{MgTR^D>H9!$&0`dO>0>b zovU|w76M8@2`CEzC7=Y9g@6)J0!l#to=iJcX|EAQ(!O#pwn3v()3k0Vf6*ReSZCR4 zFkP0nO3-Kp`_CGJy=4!ICNdnB>z1J7FF=0+pfzyERF6rDQ>qc!TlVmYm9A0s7PKL0 z>jOl;?r4JA)bv^#JfiQnKWUOj*dl`g(eJx9T9$++*%*wx0zo3Q4u>Wl8?*bg@p$YP zxcID?aKM@jAn&2PUawNhfAjhLhx>9ex5$99kcZy1Jet%1rf@M`iutIqfIptBJY(T& z`(fSnYUE}y0dLzT=5=v284H?CywY`u=;NlRO&VXW>)o%BHFh@So3;h55_GfXIiyk} z37X^WaYk~e))O*MSKNVacC8O_NScE|AJ;VxspXR+OHy+Y6Kflo&ZS($U`-owmK75 zJ+uuORL#cji_AP8(c}g$SL_Lp6GM zO*uo>(g2YG#o1+ypoQ7>kRDEOE~eV|Qk{P^2Y zv0vm|P(*>bz_;3PVvpbY)JBhshe^*F8q)BtgDfylp(*&%M$S}uZg_^6o8_UPVt)`! zg#Y6?>nkYT*XW`7i^U&t35h*<=)KG1;{E5InI!xrL%(f|1!hFeEzVm7pAwkyz0SUf z*?e?SQ^p7n3kCg|7nn18sMvc(la4+zAim+oaudo)9(qOj0e8@F&8=wZEC2ui07*qo IM6N<$f>|IkZ2$lO diff --git a/assets-fx/img/kbd_events.png b/assets-fx/img/kbd_events.png new file mode 100644 index 0000000000000000000000000000000000000000..17435ffe40465b5928510121982a41bcd9d60548 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^hCs~D!2~4r?i&3DQk(@Ik;OosG6*wPEVVBKsVMRE zb!C6b%)-aVy6lCeEKo?Y#5JPCIX^cyHLrxhxhOTUBsE2$JhLQ2!QIn0AiR-J9H=PI z)5S5w;`G^IN4^6F98zij{~KA)(BWHcYI}CF5I0Nkggt#+4lA& zac$DgUlLDdwmeLBTeMbZ|J6-8e@-3mPEl#9^}GFK$#$;@iO+ti*+m~uZTwz7_2;LJ jZz}Ak%NRXw|No9L(j#9zAh_!h&}IftS3j3^P6 z(G5=*$B>A_Z>Q(-H!JY8L~r{4e|rA>ED6nZvKR7rgoQt^*i+%oFUg?svO+-6@H01y zz#%SGxu0{dZ#rGd@|feWp>gKj65jC7zg)Gm-)AywlrO$2wP8cz;ob~Q=7~2?X}+mS zYkgMAKFj9N^o(_)qFZYjX2kB)iBDYlOs&%BdZkC@+q3JpcrTXy=oRM1eTw6@eZ;+K z*BAf%pE++^>9->fWUo(JGri#YwaDV9>VLLxKWEz>wZr=DrT+Z`jKc>!e{LB+sW?u8zOKop(Gf1t=z2+x-)M?iH6E?oZOE%W- zcP-X+%#U|vfAzxl@)v{OwkbQZ7Ju?e(pR36y5dC2pXctUv`?*n@j~b8?u|y#0n0X= zHy7Ko?pghs%3CjTvUj^*<#@*{oN=OJOGtiK=c9`UK4)&fQt`Hk#r=x%oXhXCR`ZA- zoi3%UxFVS`FK>sp$y85}Sb4q9e E06E~2Gynhq literal 0 HcmV?d00001 diff --git a/assets-fx/img/keypress.png b/assets-fx/img/keypress.png deleted file mode 100644 index 2555c4dee00183a16528c5f5b01e0b262f8c1aef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61SFYwH*Nw_oCO|{#S9F3${@^GvDCf{D9B#o z>Fdh=gh^D4T{O*bl{ipHvcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%`52T34 i)5S4_<9c$!0zDuvfPqm-_(ds@#o+1c=d#Wzp$P!}@E{5R diff --git a/assets-fx/img/keyrelease.png b/assets-fx/img/keyrelease.png deleted file mode 100644 index 2b19fb90f0228931f14badaa81458c6bf91ed334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61SFYwH*Nw_oCO|{#S9F3${@^GvDCf{D9B#o z>Fdh=gh^D4owqdB$Pp+cS>hT|;+&tGo0?a`;9QiNSdyBeP@Y+mq2TW68xY>eCk|Ak z;OXKR!f`$M&;S4S%tj8+{{R0!pVL?5RC-EEi_wKI%nY|~@%mDW$<+Mb6Mw< G&;$U@`7OQx diff --git a/assets-fx/img/opt_gint_keyboard.png b/assets-fx/img/opt_gint_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..f0cdfaa23781b334fc6bd51b7a4d75b4a301bc65 GIT binary patch literal 3518 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 literal 0 HcmV?d00001 diff --git a/include/gintctl/assets.h b/include/gintctl/assets.h new file mode 100644 index 0000000..eb6a640 --- /dev/null +++ b/include/gintctl/assets.h @@ -0,0 +1,81 @@ +//--- +// gintctl:assets - List of imported assets +//--- + +#ifndef _GINTCTL_ASSETS +#define _GINTCTL_ASSETS + +#include + +#ifdef FX9860G + +extern font_t + font_hexa, + font_mini, + font_title, + font_uf5x7; + +extern bopti_image_t + img_bopti_1col, + img_bopti_2col, + img_bopti_3col, + img_kbd_events, + img_kbd_pressed, + img_kbd_released, + img_opt_dump, + img_opt_gint_bopti, + img_opt_gint_cpumem, + img_opt_gint_gray, + img_opt_gint_keyboard, + img_opt_gint_ram, + img_opt_gint_rtc, + img_opt_gint_spuram, + img_opt_gint_timer_callbacks, + img_opt_gint_timers, + img_opt_gint_tlb, + img_opt_libs_jui, + img_opt_main, + img_opt_mem, + img_opt_perf_libprof, + img_opt_perf_render, + img_opt_switch_ctx, + img_opt_switch_ctx_sh3, + img_opt_switch, + img_profile_gray_alpha, + img_profile_gray, + img_profile_mono_alpha, + img_profile_mono, + img_rtc_arrows, + img_rtc_segments, + img_tlb_cells; + +extern img_t + img_libimg_swords; + +#endif /* FX9860G */ + +#ifdef FXCG50 + +extern bopti_image_t + img_applejack_31x27, + img_applejack_36x25, + img_kbd_pressed, + img_kbd_released, + img_potion_17x22, + img_potion_18x22, + img_potion_21x22, + img_rtc_arrows, + img_rtc_segments, + img_swift, + img_swords; + +extern img_t + img_libimg_even_odd, + img_libimg_odd_even, + img_libimg_sq_even, + img_libimg_sq_odd, + img_libimg_train; + +#endif /* FXCG50 */ + +#endif /* _GINTCTL_ASSETS */ diff --git a/src/gint/keyboard.c b/src/gint/keyboard.c index f29dbff..002912e 100644 --- a/src/gint/keyboard.c +++ b/src/gint/keyboard.c @@ -1,15 +1,26 @@ #include #include +#include #include +#include #include +#include -void position(int row, int col, int *x, int *y, GUNUSED int *w, GUNUSED int *h) +static void position(int row, int col, int *x, int *y, int *w, int *h) { #ifdef FX9860G - *y = 10 + 6 * row; - if(row <= 4) *x = 5 + 6 * col; - if(row >= 5) *x = 6 + 7 * col; + *x = 1 + (5 + (row>=5)) * col; + *y = 1 + 4 * row + (row >= 1) + (row >= 3); + *w = 4; + *h = 3 + (row == 0 || row >= 5); + if(row >= 5) *y += 1 + (row - 5); + if((row == 1 || row == 2) && col >= 4) + { + *x += 3 * (row == 2) - 2 * (col == 5); + *y += 1 + (row == 1) - 3 * (col == 5); + *w = 3; + } #endif #ifdef FXCG50 @@ -26,15 +37,12 @@ void position(int row, int col, int *x, int *y, GUNUSED int *w, GUNUSED int *h) #endif } -void render_keyboard(void) +static void render_keyboard(keydev_t *d, int x0, int y0) { - GUNUSED int x, y, w, h; - - #ifdef FXCG50 + int x, y, w, h; extern bopti_image_t img_kbd_pressed; extern bopti_image_t img_kbd_released; - dimage(15, 21, &img_kbd_released); - #endif + dimage(x0, y0, &img_kbd_released); for(int row = 0; row < 9; row++) { @@ -45,26 +53,24 @@ void render_keyboard(void) { int code = (major << 4) | (col + 1); if(code == 0x45) code = 0x07; - - #ifdef FXCG50 - if(!keydown(code)) continue; + if(!keydev_keydown(d, code)) continue; position(row, col, &x, &y, &w, &h); - dsubimage(15+x, 21+y, &img_kbd_pressed, x,y,w,h, 0); - #endif - - #ifdef FX9860G - extern bopti_image_t img_keypress; - extern bopti_image_t img_keyrelease; - position(row, col, &x, &y, &w, &h); - if(keydown(code)) dimage(x, y, &img_keypress); - else dimage(x, y, &img_keyrelease); - #endif + dsubimage(x0+x, y0+y, &img_kbd_pressed, x,y,w,h, 0); } } } -static void render(key_event_t *last_events, int counter) +static void render_option(int x, int y, char const *name, bool enabled) +{ + int w, h; + dsize(name, NULL, &w, &h); + + if(enabled) drect(x, y, x+w+1, y+h+1, C_BLACK); + dtext(x+1, y+1, (enabled ? C_WHITE : C_BLACK), name); +} + +static char const *key_name(int key) { char const *key_names[] = { "F1", "F2", "F3", "F4", "F5", "F6", @@ -72,12 +78,22 @@ static void render(key_event_t *last_events, int counter) "ALPHA", "x^2", "^", "EXIT", "Down", "Right", "X,O,T", "log", "ln", "sin", "cos", "tan", "frac", "F<>D", "(", ")", ",", "->", - "7", "8", "9", "DEL", "AC/ON", "0x46", + "7", "8", "9", "DEL", "AC.ON", "0x46", "4", "5", "6", "*", "/", "0x47", "1", "2", "3", "+", "-", "0x48", "0", ".", "x10^", "(-)", "EXE", "0x49", }; + if(key == 0) return "N/A"; + if(key == KEY_ACON) key = 0x45; + int row = 9 - (key >> 4); + int col = (key & 15) - 1; + return key_names[6*row + col]; +} + +static void render(keydev_t *d, key_event_t *last_events, int counter) +{ + key_event_t ev; dclear(C_WHITE); @@ -89,8 +105,11 @@ static void render(key_event_t *last_events, int counter) #ifdef FX9860G row_print(1, 1, "Keyboard state"); - int y0=52, dy=8, maxev=6; - int x1=55, x2=67; + dimage(0, 56, &img_opt_gint_keyboard); + int y0=47, dy=7, maxev=6; + int x1=87, x2=117; + + font_t const *old_font = dfont(&font_mini); #endif for(int i=0, y=y0; i < maxev; i++, y-=dy) @@ -98,54 +117,123 @@ static void render(key_event_t *last_events, int counter) ev = last_events[(counter+15 - i) % 16]; if(ev.type == KEYEV_NONE) continue; - int key = (ev.key == KEY_ACON ? 0x45 : ev.key); - int row = 9 - (key >> 4); - int col = (key & 15) - 1; - char const *name = key_names[6*row + col]; + int t = ev.type; + dsubimage(x1, y, &img_kbd_events, + (t == KEYEV_DOWN ? 1 : (t == KEYEV_UP ? 7 : 13)), + 0, 5, 7, DIMAGE_NONE); + dtext(x1 + 7, y + 1, C_BLACK, key_name(ev.key)); - if(ev.type == KEYEV_UP) - dprint(x2, y, C_BLACK, "Up %s", name); - if(ev.type == KEYEV_DOWN) - dprint(x1, y, C_BLACK, "Down %s", name); + if(ev.shift) + dsubimage(x2, y, &img_kbd_events, 19, 0, 5, 7, DIMAGE_NONE); + if(ev.alpha) + dsubimage(x2+5, y, &img_kbd_events, 25, 0, 5, 7, DIMAGE_NONE); } - render_keyboard(); + render_keyboard(d, _(2,15), _(10,21)); + + #ifdef FX9860G + int tr = d->tr.enabled; + + dtext(35, 10, C_BLACK, "Shift:"); + render_option(35, 16, "Del", (tr & KEYDEV_TR_DELAYED_SHIFT) != 0); + render_option(47, 16, "Ins", (tr & KEYDEV_TR_INSTANT_SHIFT) != 0); + dtext(35, 24, C_BLACK, "Alpha:"); + render_option(35, 30, "Del", (tr & KEYDEV_TR_DELAYED_ALPHA) != 0); + render_option(47, 30, "Ins", (tr & KEYDEV_TR_INSTANT_ALPHA) != 0); + render_option(35, 38, "-Mods", (tr & KEYDEV_TR_DELETE_MODIFIERS) != 0); + render_option(35, 46, "-Rels", (tr & KEYDEV_TR_DELETE_RELEASES) != 0); + render_option(64, 9, "Reps", (tr & KEYDEV_TR_REPEATS) != 0); + + if(d->delayed_shift) + dsubimage(54, 10, &img_kbd_events, 43, 1, 5, 5, DIMAGE_NONE); + else if(d->pressed_shift) + dsubimage(54, 10, &img_kbd_events, 37, 1, 5, 5, DIMAGE_NONE); + else + dsubimage(54, 10, &img_kbd_events, 31, 1, 5, 5, DIMAGE_NONE); + + if(d->delayed_alpha) + dsubimage(55, 24, &img_kbd_events, 43, 1, 5, 5, DIMAGE_NONE); + else if(d->pressed_alpha) + dsubimage(55, 24, &img_kbd_events, 37, 1, 5, 5, DIMAGE_NONE); + else + dsubimage(55, 24, &img_kbd_events, 31, 1, 5, 5, DIMAGE_NONE); + + dtext(65, 17, C_BLACK, key_name(d->rep_key)); + dprint(65, 29, C_BLACK, "L:%d", d->events_lost); + + dfont(old_font); + #endif } -int handle_event(key_event_t *last_events, int counter) +static int handle_event(keydev_t *d, key_event_t *last_events, int counter) { key_event_t ev = last_events[(counter + 15) % 16]; if(ev.type != KEYEV_DOWN) return 0; if(ev.key == KEY_EXIT) return 1; - if(ev.key == KEY_MENU) render(last_events, counter), dupdate(), gint_osmenu(); + if(ev.key == KEY_MENU) + { + render(d, last_events, counter); + dupdate(); + gint_osmenu(); + return 0; + } + keydev_transform_t tr = keydev_transform(d); + + if(ev.key == KEY_F1) tr.enabled ^= KEYDEV_TR_DELAYED_SHIFT; + if(ev.key == KEY_F2) tr.enabled ^= KEYDEV_TR_INSTANT_SHIFT; + if(ev.key == KEY_F3) tr.enabled ^= KEYDEV_TR_DELAYED_ALPHA; + if(ev.key == KEY_F4) tr.enabled ^= KEYDEV_TR_INSTANT_ALPHA; + if(ev.key == KEY_F5) tr.enabled ^= KEYDEV_TR_REPEATS; + if(ev.key == KEY_F6) tr.enabled ^= KEYDEV_TR_DELETE_MODIFIERS; + + keydev_set_transform(d, tr); return 0; } -/* gintct_gint_keybaord: Real-time keyboard visualization */ +static int repeater(GUNUSED int key, GUNUSED int duration, GUNUSED int count) +{ + if(count == 4) return -1; + + /* Wait 250 ms until the next repeat */ + return 250000; +} + +/* gintct_gint_keyboard: Real-time keyboard visualization */ void gintctl_gint_keyboard(void) { + keydev_t *d = keydev_std(); + keydev_transform_t tr = keydev_transform(d); + + keydev_transform_t base = { .enabled = 0, .repeater = repeater }; + keydev_set_transform(d, base); + /* All initialized with type=KEYEV_NONE */ key_event_t last_events[16] = { 0 }; key_event_t ev; int counter = 0; - while(1) + bool loop = true; + while(loop) { - render(last_events, counter); + render(d, last_events, counter); dupdate(); /* Redraw at each event if needed */ - last_events[counter] = waitevent(NULL); - counter = (counter+1) % 16; - if(handle_event(last_events, counter)) return; + while((ev = keydev_read(d)).type == KEYEV_NONE) sleep(); - while((ev = pollevent()).type != KEYEV_NONE) + last_events[counter] = ev; + counter = (counter+1) % 16; + if(handle_event(d, last_events, counter)) break; + + while((ev = keydev_read(d)).type != KEYEV_NONE && loop) { last_events[counter] = ev; counter = (counter+1) % 16; - if(handle_event(last_events, counter)) return; + if(handle_event(d, last_events, counter)) loop = false; } } + + keydev_set_transform(d, tr); } diff --git a/src/gintctl.c b/src/gintctl.c index 622589b..71bc1ed 100644 --- a/src/gintctl.c +++ b/src/gintctl.c @@ -3,11 +3,13 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -132,7 +134,6 @@ static void draw(struct menu *menu) else gintctl_main(); #ifdef FX9860G - extern bopti_image_t img_opt_main; dimage(0, 56, &img_opt_main); #endif @@ -166,10 +167,14 @@ int main(GUNUSED int isappli, GUNUSED int optnum) #ifdef FX9860G /* Use the Unicode font uf5x7 on fx-9860G */ - extern font_t font_uf5x7; dfont(&font_uf5x7); #endif + keydev_transform_t tr = keydev_transform(keydev_std()); + tr.enabled |= KEYDEV_TR_DELAYED_SHIFT | KEYDEV_TR_INSTANT_SHIFT; + tr.enabled |= KEYDEV_TR_DELAYED_ALPHA | KEYDEV_TR_INSTANT_ALPHA; + keydev_set_transform(keydev_std(), tr); + key_event_t ev; int key = 0; struct menu *menu = NULL;