From 9a8ed6ba35959f049ec85d8be6ec498fdbb67bb6 Mon Sep 17 00:00:00 2001 From: Lorenzo Miori Date: Mon, 16 Sep 2013 00:02:28 +0200 Subject: [PATCH] Simulator for Samsung YP-R0 Enable simulator for the target ypr0 to be built and used. Change-Id: I1b080f07ab90f5c4856881d08ad70e1053bbb0c0 Reviewed-on: http://gerrit.rockbox.org/618 Reviewed-by: Frank Gevaerts --- firmware/SOURCES | 4 +- firmware/export/config/samsungypr0.h | 21 +++-- firmware/target/hosted/sdl/sim-ui-defines.h | 7 ++ tools/configure | 8 ++ uisimulator/bitmaps/UI-samsungypr0.bmp | Bin 0 -> 526456 bytes uisimulator/buttonmap/SOURCES | 2 + uisimulator/buttonmap/samsung-ypr0.c | 81 ++++++++++++++++++++ 7 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 uisimulator/bitmaps/UI-samsungypr0.bmp create mode 100644 uisimulator/buttonmap/samsung-ypr0.c diff --git a/firmware/SOURCES b/firmware/SOURCES index 86bf746df9..884e1102e2 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -14,7 +14,7 @@ powermgmt.c target/hosted/cpuinfo-linux.c #endif -#ifndef SAMSUNG_YPR0 /* uses as3514 rtc */ +#if !defined(SAMSUNG_YPR0) || defined(SIMULATOR) /* uses as3514 rtc */ target/hosted/rtc.c #endif @@ -74,7 +74,7 @@ target/hosted/sdl/app/button-application.c #endif #endif -#ifdef SAMSUNG_YPR0 +#if defined(SAMSUNG_YPR0) && !defined(SIMULATOR) drivers/adc-as3514.c drivers/lcd-memframe.c #if (CONFIG_RTC == RTC_AS3514) diff --git a/firmware/export/config/samsungypr0.h b/firmware/export/config/samsungypr0.h index 970879772f..c1266f4732 100644 --- a/firmware/export/config/samsungypr0.h +++ b/firmware/export/config/samsungypr0.h @@ -5,16 +5,15 @@ /* We don't run on hardware directly */ /* YP-R0 need it too of course */ +#ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#endif /* For Rolo and boot loader */ #define MODEL_NUMBER 100 #define MODEL_NAME "Samsung YP-R0" -/*TODO: implement USB data transfer management -> see safe mode script and think a way to implemtent it in the code */ -#define USB_NONE - /* define this if you have a bitmap LCD display */ #define HAVE_LCD_BITMAP @@ -90,6 +89,12 @@ #define CONFIG_KEYPAD SAMSUNG_YPR0_PAD #define BUTTON_DRIVER_CLOSE +/** Non-simulator section **/ +#ifndef SIMULATOR + +/*TODO: implement USB data transfer management -> see safe mode script and think a way to implemtent it in the code */ +#define USB_NONE + /* The YPR0 has a as3534 codec */ #define HAVE_AS3514 #define HAVE_AS3543 @@ -109,6 +114,12 @@ /* We have a GPIO pin that detects this */ #define HAVE_HEADPHONE_DETECTION +/* Define current usage levels. */ +#define CURRENT_NORMAL 24 /* ~25h, on 600mAh that's about 24mA */ +#define CURRENT_BACKLIGHT 62 /* ~6,5h -> 92mA. Minus 24mA normal that gives us 68mA */ + +#endif /* SIMULATOR */ + /* FIXME * Lot of people reports bad battery life and funny charging times. * Check what's going on... @@ -120,10 +131,6 @@ #define BATTERY_CAPACITY_INC 0 /* capacity increment */ #define BATTERY_TYPES_COUNT 1 /* only one type */ -/* Define current usage levels. */ -#define CURRENT_NORMAL 24 /* ~25h, on 600mAh that's about 24mA */ -#define CURRENT_BACKLIGHT 62 /* ~6,5h -> 92mA. Minus 24mA normal that gives us 68mA */ - #define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE /* Linux controlls charging, we can monitor */ diff --git a/firmware/target/hosted/sdl/sim-ui-defines.h b/firmware/target/hosted/sdl/sim-ui-defines.h index de250735e2..b238520aac 100644 --- a/firmware/target/hosted/sdl/sim-ui-defines.h +++ b/firmware/target/hosted/sdl/sim-ui-defines.h @@ -473,6 +473,13 @@ #define UI_WIDTH LCD_WIDTH #define UI_HEIGHT LCD_HEIGHT +#elif defined(SAMSUNG_YPR0) +#define UI_TITLE "Samsung YP-R0" +#define UI_WIDTH 313 /* width of GUI window */ +#define UI_HEIGHT 560 /* height of GUI window */ +#define UI_LCD_POSX 36 +#define UI_LCD_POSY 37 + #elif defined(SIMULATOR) #error no UI defines #endif diff --git a/tools/configure b/tools/configure index 4e548eea91..8491ffdb35 100755 --- a/tools/configure +++ b/tools/configure @@ -3701,6 +3701,14 @@ if [ -z "$debug" ]; then GCCOPTS="$GCCOPTS $GCCOPTIMIZE" fi +# if building a simulator for an hosted port, APPLICATION +# define clashes with SIMULATOR define + +if [ "yes" = "$simulator" ]; then + echo Unsetting APPLICATION define for SIMULATOR build + unset application +fi + if [ "yes" = "$application" ]; then echo Building Rockbox as an Application extradefines="$extradefines -DAPPLICATION" diff --git a/uisimulator/bitmaps/UI-samsungypr0.bmp b/uisimulator/bitmaps/UI-samsungypr0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ad82b41a11257efbc133b8e4f2b94d9fed1bbaca GIT binary patch literal 526456 zcmeF42Vhji_VE3`=l8@e78FT|z7kvp@S&{C;z1cXG2yAlYno_a^5$E;o1Y-g0JsbIzPOGgH*<(ngIAQ(GGU zNAZ8={~dN%!aoi>?EelsO&vb0i0^kEcbN6Rb%2k*WfKXA1e_oNVbuw_B+n=k`1@~R zwGKzl;K3tDjvQ}oGiT16J7> zeDKL9pWL%&&xap=`2F|a|MABkbtvBkc4=YNn+*T$x8FYbb?us(no7|PYuS>5OYv>hs#WXOttqb@ zG~iVQh5=2Le&=lFvDxu>HG{Z*cfRGdsEiN@@}ZJKheI@Yb3$HT-hcrE#*Q63VZwx2 zvt}(`y!e(|ZlR8&rn~dbJ0E`Np_gBN`K`C!+P{DQ4?q0yzyJNOl6-1lhZ-oWUw{2I zrYR^=$AjY9HESp+*mWycuDtr{t0zyM+_z7kyxiQRq$Elh>Vu-@!J$VnwU=P_or7N8 zKB*ClU0img+2FemY?1=jCXxBajF@B;4o?(qH2SrA0t(M7RLo)8M zRuK`YDJh*hb)uazapFV_?CY+(j)FmbjT!aC6HkEgM<0DeQ`uP<2Ro}j{qz%d&i3uw zsVq^Cx=BOzNu!ZGIP=UiJ9OxfoRox(s&pfks=K)uA0KaW*IwFuSA=X=a+h_AZ^g}& z>2mB)XGBK2QkyoIfTT!L>(-PzQX5-p9TDM~c+;>jlUlRivSq}fk~*zIY8@VKE^fc6 zehk-V>(=@SU7zkJ$9B~(MJ=GkQStT75hDki;C!&FuW$0&sAY{YkEdJ9Fsv|c)e09w zm(HCB4H|U81s70+Z~@Zrfn=(CiWx1VFTVKVmtTGfLX3lg)dL3(eER99yLa!V9kS5^ z64?PH#_FVr6Ne5Rnw^zJIo6h{QIBMX$sxT{RxEr_2CPfCAv9MuJL+o+s8v+qPEqGZ zPVcm#*06YUkzk`Mf@%e>=p7+7Z%zs)g@%TaLPEltH6yhQbkdLE`V0-_@l>*&Rz0(R zc&m1xnxGa?%!h}!iHIlzo_dF5#1a{4*hXwhfJU0`9T(49?COkKZSJcoGs@1e#+WRl z)k7t(?P^-fX=!Qg+qXaKtg|k@_~I+CymHZ^MHpx_ogR4L0n9gyIC`OITLlVZzp~2P zQgzV_r+PIk-AI+jHfzQV%$1^|BHD$xuuS!7y=PN;6^o{; z)H;hd|39sp@X7_~p|o4JRO;GopKEokc~**At7tdR9wmoAYXh^nT2&ZRdhv4Mt_I_{ z*jO6IU`*%Jj4Q676M@o>`XT6L*REZ#uy5Z!Uj>AC$?Dz@KG?Zq2W?2)Za3X{BhR;d z#R_e*_U_p;J3AX3R6mEsBt%ee=}OB3OYdN;ysovb<>Jt)o69)VZ9g8y7^1pqXR|z8 zmREyDX*f*d`JX_a-|-+whlFTTTv_05^P3j9CK=n?6K1QCLb)*bnH}$7)<3s1Yzj67 zkMf4cgg#`nF;OB!o)HFvewr|G;*1$Hu&AK~RZNdPaUdUm{4vh08uc3=jMe@7_dom0 zGiZ5bvaVW%?QS8t;;LD*h72B@pP$b|E0YyVhGvNmO;&fkXe6t55V{LRt9@7wMH`2% zrl4*FHg67W9vtd=U6i4NtD(wx*01A&8EXj5>~^H-W{Yk}>tbUxGet^O@*YLaT>{lt z)!Qm!tUc8n$Ny#;#%N)dnCB@RTJ(@U2wC9aDO|2N-!laM$X#uY7UPgZgB z(96s(!E)rtk)v^OAmrs}_ZHQHgNqcE;GvDp83JhR|19+Jf0$DqIz`(aaXinrC~PgYUNK(Cb~SNAYk6;ajMtZK>Q z^<2NzKym{MMZ+OApF&Y{$fs^4q8oMQm3NAYN)#GvD}hQiGY9Q3w`f6uq*&rXth~Wo zJDpsSVeR7LIFx8rjCRBqt97g=tF(igHf`$S>L6HFMkAFC_fVU$Q7x~%0@Cd}<;}H? zs(pi6;`aJav|?>bp|4a^1HVp1&1?yzticS)Xcz6xwoE^zlS#()rAaQYla)fYHY{(= zipQt^R%49%#p#3RxpG#~tC-X-6>nYFTvP+7^r6i_wcDu1bE7-o6paV5Q5$$skk@y# z1S*iMYgk1xCZW~&tVp)Hof){`vL9QuqGg9BgIB_!@gWnj!^lUq#m8&I7*?TI6N_OB zs|*yWoK^H{lO|16XNJ{KBxR{v4xVV(0BpRr6nlMVFAfEu|JVIg_Q3$n)Sdeblj?N*XohxURqm3Fh zfb~5Co`HqFDIv{u&{k;Dd86MtuVNs<1}2AZ#6O!#YqrVC9D!xM1SdNr=E%~O-f9J zQgAP|HZDgP1D7T$IthJ^c`U5@C4(EZf~sE({Rzow>@Gj*BB89*vATEiNuDDJkJ{!m3~+5~z&?YRW2+3n!m+ z5`D0qtP&(e4-fJ20F4S3R%??h@>`KWMG1Jv>SdQ*=E*8!c7@f7@|7bZ0bfbLXRI<+ zg0SkVT#@UD1S(2ESasTfvijvOsaPWANL3OLR_i~j_P8#e>{nHo#9aM8hyUm`ZwJC($s~OKL#8{-O0riE#m6#jWj+#1qAx>5D*#yRavL#1AvvFGLUrKhXJN*3;v zospqZW+o}eq>PN5tSnNlPMMjm9dpFJqkh84T+O;{Cb#C1l9N+;S_^n$VAK?#Hnt7b zOvO(H1l5GHscNf=3d_`JRf@W@QeHn!_J-AyPxkDy`RlL0&OPUx2F|Lh7*$fpno|Ch z<*D>xL=*v-D8s18n8-+@nkd8sOA~!bkSC#C@TM3`gRu-EQPie+Q~#{er6`2Yor2ODkNOSN=3xDS*e(~ z7rmp8q^W+0X+v*g5on&R+KM_0i6J*CvNo1Mj#ZDe zjZW4(Mlo8$-#Pk-WLM`iy|&g+2I)BByD$Cwl^>{c2e2fR*SkUkKDDVf!Turr~K(1 ztCxGkLZDZBbnjkoSoH)_Wwv6HOl9<}){W6^B4f~vs?DZaiI{c?v2iJhNvOH3v^03j z$;=|GGCwDmRG>d|-G4GL!a7)xn^TahPN0nDW|5Ss$q%&^3aePB3RK6kS^|*elV(^e zVXcQ1%A(>>7PzJGT~f--R23O@7i|GcGh?B+NVb$SJS)x2 z9L2!Qj9Hl3G@IQ38>Drn2eVH08LK^e^l%cZ?gpgEDx)6BEgT`b-Kf+f4jWZ@w{6!p zniUt45)x8Vk~31%vNKen0lC85yu#f4!o2+A`~sD%of2!G&(eazl7a&LCtnq*lSwXC z^A*fFdD*0f&T1K)7N1&OyY#KWwY({=G`!Zs7P_W^Z5Y<=aMf(K%n;faWFHNFH8Hey zjJee^Ha0nqPFB`+1@D(q$Zm&r0F`h(XSFg7sd^Dq1G0r>uWCPPnFlor7Y?4!)FcHY znN0}*B&8cI%!=~zNHAGyaoC}tsAEyFNgaxcI}{eRFDO)q<|{-kO7j(^Drr!KRb?J) zQ`x0R%QtI{U0o@w#uV3O>=o0pZHpG~VN2ZdQg0?XX|lDvFPCJ?HWZ++_hf(3%de(CwR20m1NhYDv|?C!@RU=4MvXG9ab=^Dt^O+7$z^KU z@_Q+rtVu3k2(>o$l`3{NtMI9fSauYaty*c5RaJ`7Z82FBv>8UA7Nv4xY=t-+3 z>2j7prgo6zV4aeRNf@zt`6c#!{v>H#>ei?(ZiUr@`jRhJvw;#O0NwXBnIo9i8P zFG=@%xu~|B2+BRL)iNz*NOn(qVtFyz(tx4^9EPSAYoYID(}e^oXAgjMuvc~%v!I%vf5-m3-_ehs|(aA}Xkbie;y^H%wJ}&z zV!dPasw=N7H-6PWtn!B8En4ul`0;piB!wrI7N%-sTAzkh1E;X6`(uq!=Q8%JhFLXZ zA%s;58|jd&DqQjETS*gJfHyHezo?*qPv$dX{xZ0wZwWQSd`PGq4CCq(>jkS!sI+L| zLcg-AUkT?BO#&JTIgm*mW;Hc6tL{&i{uEYy7`G&>)`nG$E36h56ciU0lJuN|xUL`; z9b5f&tQV}F-n8lBMT`8!s?`xnFE+ZA#ytT8P)Z{cP<3)ss~uJsgazDo|Uu z#_pxJO2@vtKm}J}RY$j4AvIzHyKpTZW9UFuRR}5?m_{{20;_7i1|O>ysQ9&2>r{_H zQG--Oulj6ETw+4+=Ak!`TIke#X$yC1*?g%k-hdY zabg1>+y-{*RmEzd3K!2MhKFugv@06R!x#=aR`Fsp(*bs`8jK>W*1?##=%}%W9rkxk zQ*6wI!Yb}`6Sq`L-;!>xR%DexbZ$Yf2QhgbxCR%ij4dQg8c&i2Ram7!_H@^yQ#e?YIUPs|-q_jS8YBNqg1jtYQNne)x}e zy?V^iZ)r2w7{Kh58Nlp|4eV{)QcZ1Oi`5+3;dq9LZPGIwXk$2tSdDGlmU4+h%z!F- zwJ!83Is{ygKKd;?t|6zd#<3yszy}*=<3GKs!Uyn>(eKLecN2#gEUeO)X1uRj^;KB) z*BmaVHo4c1E7~<7c6i0P(Im#uCozU5ZmAkJuwoU}nwgd!(>7X}!IqyXSXgDm43S9~ z48m$1&9|gAhP_jfW?MwqT)REYe%m(F)PzR1-b>|Daz|g6xqq!m44Dr}&6&jXNY)HV zdj2G4JgeybHAjMHthrqjLDpV%vC2SBIz$*ur+Zw3f>ma$B4(ACW?|KfxzW`8z)bL$ zoXotz%v;d5ZQC}jTeo7)k=Cu-v}wa0i{iFu-n@Bes7khtgQTXXbvgX-kL?P!@dKGt{5#2&>iCs|-P5 zFg8;rXeX1;Snbohw>NX6G4pb0D6>eSROw$5R;$S>RT~qFFvS-@vPCcle`F-%t@`%u zd%*=4%%4Ah)v8r@-F4U9n>IcC@Wb1;Z)YXzC#}T(j-5N7e){QWo_XfkXP@1(XU~f- zzWCHruV!TY*N*EMXMF$MbMLTM>y?XV{H{X2SwbxF$^wP6Ojq2B@4}EWX?jistK`)aGgR4@r_K6F9 zI^U8*VO{P-)Xw;K$n>h#HD|5l%E#Fh6&8BK zYG^1=fXho!Dy$xK&Qa_%n)IkI@_;p|(WQe14Z8N)Ywx@7z9*h|;^|$xUU~WD4?q0y z+i$;RII$iERn_M&zx?v)r=Pz4_S?I5?SirO>(?(?vLr8Ww;k7$PWo`vsEJdjPMtk_ z_R5tjH*DDO=%bH9>_;Dc^!@kWS9N85{J;PG@8_R?{{H*#QxR~B$G2|XbobrYTz&PR z0Ru4V)P%_~F&Rlo#o5^&Go;z} zV|DRjohgUue<&PK?ggvdo_-{Tq`H)s8JVP zbkX$b(`U|{i4wm4`sXaKy`DY`g)bI=GR*&!Gowf@BF)Q zdP-{Bs3@j8ttqRgHfe%6qs3mPSG{Hx16a*)AvUm?ci*yvnd*{OXl_m};L%Flw{M>* z=pTRlF*@-4^UohSawJHg%C>CT0y(d~`s%0q_I>x=cR)xxQ&alTLl2>5H*MN<*PVB+ zUAy*{TW-1a)?1e^U%q(ZLUQqHRN?&jd|q++<(E#HOqx7#;?SYjHEQ&WQLt%gFVCMh z-#U%+ufA^awKv~%)2+9xy6x6mN$c0H+qnLYb!*l@>Bfy4uywa>+eTf$Gwj{F7n_;p zF|AqZ4$SExLxun_d}4v?*Ew+D0OV7TOqwu(?nFhbqiU`8wu|Ins&8`=f5A#v)^w$#NMg@&a%ZrnKd#0&;S;G}i>#~**7<Mrtg;i;W(-xkO3A62scB}KE9T-T$jMW)A{Q5TYTv$lmo9yJ^c*x` z;5j2l!rt83v!VL#yY71I(MM6^pMCy0=sxh^gS;2E^ytx}d1mu=UwrWe=JE7t(`b;V zV-;IdnM!-rnlMbU%Bmj$W0i>rSt*FVBNbF=lxo9fl@WjF78>xVpqFiw;(DcR$w3t3 zbI(2Z*=L`jj!;ea-+%wSdGjdrv_hGAiz$3q00M__q?+V0CO$5n6(L+pttKU5_~28} z2};r1R${JdmEe#mlwHXR&^hVEtp->2^;dvO%HU*sN>0g0Q7Jt+B|RxQg%u~;(Q`w$ zO%lqXLveBM?mf;s`<(gn=55$;$Bykg{`=E^_wC=0CmCq5?H4Xw$Q$YU=s*AY&r{pC z!#o`o*t%#}JFdq1)jJKx24-Gs+Ndo8WdmzgDVJ&}xv)x{N_I}$Hc{xndp2#NS*Xh{ z&Cv-HCZI@ZdE%JiAYZLpyOwq-on*zu#dw41P^I(6tjLP5m}W&P%R5>tJhERg=|CLo zlSLv_Dg%{$i`Ceep@vmof92&@e){Pr8nLu;c^%#n!$H6GJ8!>z!;&Q`JO-P~hHHam6?szkwFqhE zMSGP7j+UzT?N!YxoEs8fOHl78z zdUfwH_0lQZwr=HRsfI8aXv*G+Ys=cecn6?8-N{K zaSoSqGo&eEt7J7ku4j`|?$M!zO-{M@AgmsL+;cu;)j-P*`j)_^w4~(D?K@mLdD4#U z+j&hqQaI8syzoNf>n2)*{wmhU)VMZmR^z;2m1wh-D^>`rt`(@v!c%I6IIq^80@Tsx zpHJ|BmMQijt`~|afBx{}k2q?(cj=arluTPxFNj3(ttG35z$1>>cMw*6t5@x;y7pPP zohEK_a@UTX=FFarpX|pUf5h59@4WNyV{2)=uxAh6N5%lraBaw}CdYco>WwQ`3adU~ z72}_UPR={`Tn#F{oj6+PEY<4tiEZ143>uuCmP(*6OMy^ieZnfuSNnjt(2yG{ZLhX& zHN_y!4hC>7ZQx2+bvJ7aUwWc;OdR160 zTh`HQy-H6N?vp-!`q1@4p`?XIrwgu8dM5dE?V2?m+jmGxNCYIpJ^|H-tcJCmV>rYZ zj*1-X;akG7WFLRS=()OMRWpp&idErzb?Z(a53f(8#H?Af2vKC8jphK2b7BeYxHcR= zFzr>*s{valu8^VsY3cM=-MMk2juRwA0i{YL14Z+u8*gMNFEcs1#+s-5m{mN$_O>Y8 z(r}H99tyF1p5F9!Loz!+n;74_u36O%WLmJLMMbM`za1gaYNeY>n-~OFU3~GybPEfs zEEQS(7(++u)z;zj!4)sN9fdYMTAaaD6n{G zFDQOp)G6hXz$4;viRQ%#ylnY$A{OZU%*x2DJ64kui|m%L9Zvf`pvJ`v)u7gq4XpL5 z>F=SFmSy7!%t9>hyz|awmtDq40QL!%$YNk^Mux$)?(}M6d@m|2kLnCjaD@3EnN@>) zA+h=ypHzHg7H)HP_>(?Jl39C-W)9v{k{4smP25t$(yNV+f8JgMtFsTTb;fF5azbMN ze*Ip5{dGzq%`>`Zv^RygSr8>w!72xJ$SMU3Tv4Y75d}rl0+khnRb$mZtOBjVwV+_v zj-3bxR}-O-?6BQ)&pme4>NTs0%)uKTZcnYk!&M3kYZab+%E_A!A`|@;je@k4Qe?>U z4D8>(ALAH$^F zl*Q-w>`@&viAj24&pOqslrt-((Zz~;31}fxC!&$>bfYL~+iz>@tEkD{c=w@Mi1QKX`zO^?_J$m{&aBx#PggFT3o4 z`|p46-FH9z*TzKp;Z<`EAXgA)K zV#g=Mj>iDbN*z!adbKDokE(azfC0odz$an7%a$$E13oVqKc3!yhMW77)r0ie1dvs5 zC5&TO#^4J(o#GoQm9)WDmFnrqE~CCSBaQu7a0}Pstv(z zGy_;$nRU%iIIhevF3ia#6|o34@mw+O652**Bqi4ct4w`Nv=+L8Qb_nKE+rykDL3q( zNU^CH3MZ_>D!#Yk{CvjEAsmM0FbxH&6*XH_RHPlkUbA|S2K1sQ>%{vqHyO z8dmk6ZCX#Y(4(4I^$70l$N4h#Rk@^+EkZS$RxULK%c(b zpLp_(*I!?B%_6wX&&qhR`sl>A7`6BPw(c;1#{=}XK`*`iSK+% zMNHI;cO)n0zRmYhRv4{D}2RRV?L>axgDYE7{W&$E&9vR$ksMgOv`;1|IK4%qv&pGGs6HYjA%rRfW-a%N6ZhN^YHpd*j zn=>(#7#PH_dUWgd?|=WBhg`dQHO(1ewPvg`GVA=a&(Zkl&lg{KAv`2>{Md0NC1qyM zGf(f12x&fL!bJO-cnhG~hpggNB2$TZ;4bJ=W?BK-4?q0ytPvw{DJf7%&bNVm#VXff zsNK{lQ|MnMT9~zyA##JowmS#hwgtcGA#VO zk)!hRem6qDZ}aA;@Q4dXkNMA6Uw!|>513nDefiai+B_Fa%;C}D!-5EMZj$n^q zj36=S#o#Q%wI*|;;Rn8I=1kf+V2O%mLb+F8d4)fJ`|USM2s&I(;C2wb8WOVB6q}Pz z+SapscN8hUrSr}?XV{P-jGm`vxn0if@66||C129f{r z^Us$}ok|_dd`rSAkXJ|ynoVO&FNorPBVZUXwm$y2*R0|%C@ClyJYWD84O7oBaYoN> z-RK%+;Ngy^o?`hnyb080Rk0e^ZkQ=E>|Auwo0BfNZz4uq@^Sas}(5K+@>=S2UiU}A_Pt|FdhFn zm1%8Q#jY;O&&LV0aGJesp%Xueic4(GNDdUvkFwJ&!+M5dyL#o zpG^VY;Ec??^b9(6eB5V~n->!m#Sl#dM?Vd5h3q``=wscxbftU|_H^GI~nsFauQL%qs$N(@82%?eDXw}uHHkl?bV%Lu8< z$;uQ~t74UzTxgmyCpgwG0|xbUY8aVbv&scAbeU)l+jY-#&oRRzaVb;;lP69@$7)vF zR=uJ$(6R(3F@}Wrc5L5%K>z;aBfUyvM~`k_Qi6&`=LboQp|Dy|T2SLLadhibqZj5E z5RyjL!YZ?z(O9JeJ(2K?>}+B6Agp2r(-Do_m@}0rSJ|01b*c)K*S)MY)T^+{)G(;l z>lQ6yOh4X!CO4iuX%hWI+MR}8JqW7|!H;aM?oQwe9%JIV@k=otXx!-0{E0>lp4fe1 z)k{_>2bjA|evM`zB%KBlUAX6;dma=239D6rN|RO1y2iX}C_VHlep)?a2K`>OWR>io z|Asje>2yIo;@C@1NinPvQ3$R&F)&tL+mmk=Vz9m>CVu>y| zB5xSBN@(FHpMJXPrkk01lM!da>cLsXb9+XgKF>e*9PU=;b3umKCfT$MYtddcpehAh zZC35E`zIX#ydzmAJTCbWO8hUGT(mFQwFRQ%l>^XDri?Ea%6Mxaa zw{qEv(xPI5nS|AYvr3bdu{DJ9;jP8J1gl7oX(D{fDg*1Wav814r(Lz$^(ylun^NRd zR>NAd+(roNg0e;ft7|jy920smX%KV6m*B`QC?JduqXnds;^XOY_A{%rSDT)?*+`ik z2Cv%3ubTeVI_k4QuhNybXwf2A#RL50lTTs{FJ82$FfU*AJzzme+)^b$OD^9MtfnU= zJ@V+I^n&6LCL97>RRQyzUiAn_s%lJJv(s0bQbd4Zu`95#B9@2WoSOE zB1ZW2A*-0dXjD@q@cQb3=Jxg~0Gkuo(XQa2ZLdZ!D^06bm?4T(JFBep82qeiKQQf8 zyTtXrKUpPc308mk_1EcBrzOYJVUr`Q9?}M;i$E9Tlj0JDRRTY&!>SIK zqi3~_Sj7)alhvbORIJuH!Z~rV!-ds6dZI_c>haY50t1yo@bQ2oa$ zLuyEjgHy>pH(K5KfsJp8J{vZMO$)0=wN_uRvZlKqSgoqhM)$-Dt9fb+Q3GI=Ksh#H z)qq-~_9`AGVU-v-miD9*l&(-ZL`zFbN=r-g^71&s^4W25ade&56W@}KTMCq3efi~= znMj&G8_}x<*Q)iZtJ_A~!1UQLp9Y<)ID~!PXH%URL(!|2Mn$PM486+y2Cu#L8r}NB zsu!$o+O$bn6}_tF^7cb}m3ZJs9(i}xtlx_YA8FR~y4aYD0@%NroLI~n8MsgEUU8O$ zz?H(3C2mzyv-NCHk_N(R?i@s~rYDy~gw5p%k3PC=E<5H=Y0~6gf?HHLgjeHNy^9AH zz1pz!DpSa=TJ^E%3>S&fMrXJ203Jeb)DZMG&W zwLQ2pQrw=1+{|HWNOxkOe_3)5uQ9l40^Jo;xdCzZxFz<5)rQ3?Q{CQj%O|F^1&Y-s zr`%(nLGS2wmMYR4-g2(SmC3a$CYCkOBf{;vv6|}CoM!*6*=PC%k0%Td|2r}9YmbA+ z9Q_u!+CgPsSQXz=L2161^Fo+D8TJUWh>T*)T7}+O=Ppa^`baQt!4`;AqMUUT0Tp*PrBWsP&gDjhcFGttpn3KG5{py#N0Df%OBUSHoJ) zF{PZ@NrK7`T#;3KpAFOB==N&6^2;lRHD4;M3aj3*T9RK78(n4z(_S^KzWeUGHS1qx z#y%XOR`S(a$@Xp=plxpNVy(J=)jz(aimdX4#6nzg#qCh4`&S=-Tur26svGt*%ZDyW z|0?~f;s>rl+>+fAZgR>sdLBbo>8@GaQr)vkp{Jv@b;OjE#A3QtJr)|}TN4#rF&x6@ z{i`0V+L`Rz_rR!8?-96fDAhY{+f1`7RrZBdVYOy4hFHR;sQvSwKTMylCV*rG!CPJDr2 zM~Q`~G8O{g5;m|-t-@ED5=Ng5Qe!QanvJumV^$9`+J-PgruG9-ll-7piQP96V+Y3) z!{QieaMV%1*^jf&{OoB-ePv8smGeS`hdX224?W8iiJo{Ub$k$o;?R<&D#CgV+Uxj%DfPGk`6J4 zOL(|mw^sCOwe%{zHCbr`jTP6p@!vakyuNbf2f@Q?f*E0Bi``daHOrE}S#1%z)X3+w zCilXsn!{!7TB0CiUI><$sqVZG!m1bRn%gbm($eo%ta#s)#enElx^2t@(8XG5pG^Q+ z^$3T+1~&68-FfGo_87xcPTEGI$(owj$L?Md-;x? zc077+!dlGMb9t{>vqsN3N-TtFSs+i3ZX407mFrbn5e`~=%KyG46A#?A>rOkRdOzT- z>Zx1kU#&W+5jHyc#}BNDrKM^YSG#tfU*JcsQ&0*2=f^;fEgztJP%ng%>$RzpLDRX?p~LlDX0Ypv#lfMA7akYy74WsrYIg@ zo!Ul@ElW{j+gb@eO-fBF@xNYmLraHENz3L}b?LGXp~b{}R$P35o#xG#Hk|o^g;l?< zJ=Lyl+v~5t9#&Z-POs^>XyHOuufz)y5LT^GtcREv!rg7-@BURcrP}AD<}^)9N_ygn zC+Mv)>%?UbRXD9j+rrICae+<46EOK^UbZd+|s#2 zM`nK)y=o(~V*d?uou+jxEyW)B`s=TCECkZa7FNB8F%(v-!)iio?1TvufBXG6#I=3< z_K!dLg$ zH6<}|#PAWw>OcSa4+Ez6@87>`=gxus&qz;65mpb*YG!Kc1!KpuW*5zer=EI>nbCIc z*deSQGIl>IDvHn%OgXm0^gqICby$VTetrAC^wLYTRJU#0wr}6Qx8Hi}%t3?Gl7-cZ zcCYuD@x`oyi9G_YlsY_2EG{m3_2BK*$Tn?O-+sG>R9LNiF7Jx%)uOz7+NJGF zOCNjeQDlc+rPcc7mtTwaa;=ftaRts};<6_#aSiYR1h98*q&VK*>_nU9NxqWeQRz`YmR<^KO9#NMWj1#z1X{k1S z(Gvgr-~SL`=T4neUsoOYmN0)@%dxt5^kQ6s;bwltlaEuQeIAuPWidHq=G!P zSZQH?KB=gnfK*&qNGd5R(ntC%8 ztY#!7k3H{vY$}fpMMpV!iF@`KKm?lpwnUV=bwL~TJu@J(ATjLP};jkk7Y}jF1h~t zs?rThmgq!S%cYYhr6wl}tGNX9kn*W!RLXHBRpscEP2FQvKXizj#B%iIl2t8bnuGb7 zS$dF7PFi~39zB;YU3TrlMb}yB+Jy_RTeRr@`?mc4#~=7GuDxbqT0)}FSxt6NTZdrxc0yotPV2fd*XF3;`tiJ6wvTE0k9qEZls^RLp z_G(dH9wD`*C8du(s@zM=MZ(Uv-+nt~@?@G`G*b^^12<&7iddf5whf8Rnl(;d^BUF8?S81IxiFs-&U2B**_JpBJ(noaLLAPM>{7HM&1**?&;DW5|!kpZG zJ$tQKx@_^)*Q6#S0uK&hm2z@PuzKF8v%mf38%E?_FnV-WYMO6ZEy~T0jcGS~&KwLm zZb9pdIru;R_~UcVKAX}YtX5<-BPDhDvSq*i`s=;--b<%6{)HcY_#v0Zk!h^51Gkx( zwI6Fvd$nh`Zdc8kb>+;N_B3n843g^z-_DwK)szBN^XAjl0&IU}WEt@xIB&PsyCo6R9W%co4m zw?yTA*M^O_g3+|T)vJZMdHBPU;^UdM71c@$h$Z5wJNE9~d)_(cTCB3TLnZyI4U<(2 z;Khp;V}LyN*kcHaTqA3G_UM5M^*yUrdv)5BDKv?(w-3G%bA~l^&!$b%UiA&DXvJ=w zI;~&3_M;C!G&SW1AN)OUo=UT4|9Sm&zy0*zpIqsupYSwt8l~aYS6>}9Y#8=1p!%Fu zn#zfBapT8dOot7(qX;s{i=77^c%Xm3erR1`Ra?TDDXABX8H>04k3aqxKYqOSDlycC zp>Tj&7pziOs>Z6-I*n|7{wXJKI^u|ZW&(=C|M|ml$34fIT}g>Wy46YrD(zL@uu6vw zxc2PQ_2!i~e)7r31RlU4^R*l47Zv@*LHmYR>7fT6Jb%%woB> zJMOqctJbAUm(tz(?RVeJoH2u*bnUUA5ZL3E8k%0k`Xxk!KoKGzHgDd1+ikb8L-vgt zIg${FI$~A#uU>K4qS$tCnnF@>=g1>}9W?0PxpU@Bxa1P)U-b>EbgP0ZJu%q2^vX_~ zJo(w(yYJuftC4>5(6^^fp3HG8U3%G+sh3=EVfRj*`Bh!S7#dayPobmr!V53_!s>yb z)q2AXH(=ns`_4O~MxK?Pk_xB|oK;jSAqQB$#6OH4J(`{^Ob@~#3JVK0sJ_>$R(o~9 zym`zHV@inL;YfJ6=Rqb?+_rVAv{!w}D&Xl@2%Ng?_v${&oib(0 z(@#H*WYDW!yL8FP$fzq;t@dhR{zImCuyer$`?qg@?d6wVBCTKlPI`LTim!Y-b;`Dc zxH$0xyKwb++!AWmo*Cu*z&W|Z73!|ny4I_NePTWhIHUhdFTRMzV3o%!ue_3ge$d@= z-HWqhJZ4UyHLF48GdSac!^6XGyzxc~7@H%<#5HQP--tUWy_3Cv)t{{5WTpgM zdg-OQD}s@kQ>RXS<&{?u>%$K{G-%+U45rVf0O_GN4ImyEP-)4}o^>U`Avh6mxm|ww z<)~H!LM#!%?sTHoHLEO*cWRS+na-aHS#`hzpZ55N)Z`NTWd9N2^MYBg!YY*=0%UU} ztBsG}V_1!kxhPPqqFM<+jceC#!GZ-8O{Dq66Hi=r*=690y+>3N0TQTI?NzE%-xBM@ zH4nLg(rGV+h^WyK`&i|XwI0ocqr^x;lt;p3Wu8GRl?@QbeyM)q3ORTdGBYVyOwqzv ze7c>dPoMs?HT;dx6vq8}fLcd-6<09HP^x$AtdbGUZSxf~jkvH{S2i$l5#cSC8CJtv zEDs>73`iiS6XO#Yw4rfjpxi|lU8IM$64Eq({(R!;7-3UKtR^QGH#w!;Iuu4S_8l0e zfY#Ccz<^4h^T59S?!9LdQ?a5*X~t7$>CSL^wtDyKMMPJDyQ{{i*1Cu>tPZQFR=aRg zlKKX-4eV^a8W(e+k@d01yd79p6|NbXOq&L-x^yy#7jMzNq?P%O0E=v^!>Dgsw} zdeR73<TAxgn6#ouPAsapOa^T*y{e57k=emG^r2o=+L(cd zxp~Z?v2@82JV|(cX%0XsHI%No0JUe&o*GpDvzi#+3!8#Uiau2m`y3$`NcNRGT1Ctk zR+Vb?xo=62iL)Dfxw^?}#RL1Zy{bkPTVws0A{ei4yO@|cbLMEPkIB5-4`Vb=Nb71`C3UiK)+q4605hGBrx_6PVDjKvftZc&ET%bj{0&23gX=2?<_0X(_ zwVY!l0I0FiL(8UdakHuoLe!}_lNPKOtZF{_REXy0LFwTBXRNyMrsto39(9T}!IX~Z z(vc%a5^KqeQ(-;w$Rl`tX`>oY{iavrVusqQa`WzHhi^|hX`A_zbzgf8ETp` zstqD2QJX~;nKVR+$DTZK;tkhbw{gRU=bn9*S_U|IDPDmm$J5)dUq50kc}F@?nJ(k@ z+iypk5}IF_l~w3AeGRdGuz~GH1oEMcYVWg2Nh-EC9JBx(#ws&wIF8je5%W!9J^i%% zf`nCSXc8g8%v_k9l0y59AtsDRr!-?3Vh;})GUS|d&Y^>wD0WoPfB*YmN;$q$7=GuS zcV2km1s$=tXyKySvuC5AMxJ%n@L|I+n>(~`Us6(nkE*D!kV(2uZ2W?G{qV4r1!`_C zce3X4Qqy@^DKERLU7sW+OeifXYF}K^p}3@dQE~UK-G&YvG<47)=GvZf<&}%Cx#q?d zE3peU-E|kkO(_@zc)al9i)Rx6nsZTnMCIgVAr36Hb|MdW652G>COmMWcd z6n|rOW)}LeYuBzTSFFHz(T-x&>AH36P`t2r?z!hO4JQCFojQ66syPR(i|)cbgwy+oz0uKKfP-gTJaUE z*jHbrH~7UDU!;zppJ~_APcuIw;}F2|mtTK{Pac)Wz?Hpt@nUM3_U+r_FeBk{=5_7d zxkG8GQKUsss#AbiwFf!i2d;`$>QK8(PCIpT(6(1$^%`s5Ovkf|+oN2oHRX)pWL3@O zZAH4_7GlsGe8H=ImpS%NJn^oGi2j_#=P9SG`ll^8mT&p9O`DGPYeYv!vsfG2l7|^KY}lAF zWAJ!Un=s)ZK3>(X{_8K`gl&{9xK5ikO?NvHg^tP*2rgx>gsJweMVMMTdJto^!xmz0=Da0H$h{J?r=@ZiBj6chBr z_-sNHQMqW;&p-d1hAtK<8$5e#>(>3zxUuJGFC!59PEyi=-MfGH_&I;-E2Fn@8lmtB zJbLJ%hiH6WbImoACQa(!ub=jBb?MXzElPv4AStc&$3NZ{MY3$8McFGs##9!(uWr0J0<}rx-G`vrBSW z&A^>FSRT}X+rZUquM!Jk7g0u92VvDutP%)eEMXj;nW+Q7)emFhYR@X#mCYUnq3LyZ zv0Bq)T3xJ0MQ9UFf9hbPrX{#ZmvfPW>!7?z^z+N(Q@<9tM+~!-B=Y?{l_Z(tEO85Zk@}jrdQj^d}<}kXQiw% zWl3DSVdljRqM&OZHmHv`J$19a%fxVNe744#1yPkO{pkT}kn2@qKbkeY-N*sS#KsIo zbaqxfoWRs{fGVu|jMdiR^BW)kygTh-Oq?s7u!lCPPWJwr(@)#tP`z3sR@2H4#iWc9 zE|)^#%T&YD65~doG)%!|hw(`U*ZRsTs@2{W1y`I*32{BawQbZ`MhMyk(xUlN0=b1% z1*)%N_rsc(4T7`F`XKuafz=kaahQlg4V%tT5lEUbMqgkGYXf0bH}7ezVgO_J!mUmONYGv-%n(q8)x3gSl8^Oj#Wfx6eKr9fYtHyp z@A_(uTCu2Fl{u2)sls|vju)_iHhWYsw2?7k)KLKjxmBGAIBck}MMhS6BCR?`n` zZ?9t4#m5e>*j~lM#8<}lYY6RC%wR*Q-Vs*Yw26pl7ah%b4uz;mqF23I&&CT@J^a8h z8FKpSc5TOL-x8*8NV7EtRB&wweqh~R6;^YIzoAI6@={z(OxrfXYS|nv0kMIr>R&Y$ zuYHFeFQZi1so%b(`ot;&C#+#M4j*Sj3?8Y$wpU@5lys=LB~)uzi)9QY7gk}|aqU%M zwUBwebm~x8WK#RWA`UVi0!hzW!e?>5T5L|umf&7{iuG&=FszFh!y5UPG^@&=$%;RT zeQ+<)b3@RQN!Y;juV$sT*RzlbtHP?ZR|De*wzCSZRr!ILpiEfBy`&9e(W~NH%GUEO zsg8Aj`IdxLmjtXSe-(t*r2F;E4=grteY1f@uL`TV%t*krK#Zkie53e*^;*e6*j^P@ zg;inI8NMZ9Rag~Ph1GJy&4YQYxwKcs26jN7jp$X;tD;v$uZmvHR}-Tb6p)Gw3rVc| ztdsha<9w?oQqR+ljQs2zX3SCjWSLp40F;}N!DmWbe9O?#*5TpNk&%S`vB)|z_22-) z4TLkOw4{WY(A5G!bd@J3$Hm1(F~e4PIP(~aA6WdruIZQR*&HtQFCJJ}6;_4S3`fih zA*>3k!m6+;W8x%kDL`vvGzdTN&K*0PxSowq#@Tc%EHX(2@fQ%juTp7#ft3j2&o9Z- zu3(%8I@Ka}pE>sR#w^{|RxV!OI%1|8eHH<)cmU4PBmC%{{FJ(u^!Sq zu-;McVrIIqqMfy`TYXvsj7)$bJ4!MQB*t*t)~)r4RketyPS)U<;=DX7snvcpcxDWZ zqR~CDMvbkphSwCUu{8zOz#8MrP5tnjI~9_#F(UyRPq@e9b-$( z2hc7i#v^(BirXZ_#ko>^JkO~U%K_L^N>Y+ZsmaMK?#kNGI+?Xz*~v^z)$@#Nob zbR!3ZfQlGhDKis3?G+9Cssgf|Z|Wm`+zu*rRwb-b&ABItaQ3_q*IZL>{ObDk>%C?b zhqdxnS7TlXR&KG}*^Ek2PHmm?vhZ%Z5;QvLOcx@4-FkHv$n(pX%=f^VHFLG(j6!eYa`d9 zqD(5wQNXbS!#>P_48(+mg;88o(FtuH5)vBHEQCVUv?--a;X>hal|}0x7&-c=qyBZo zzm7OU{eSr3hySyRjjyV?{l6-D0h{m{-t)aY7Ezhz1E;ZvUzAIN!J#X1j>Y228c3Z)w*RL_L`ZJ7ENNatPZO0 zcx;XMc+2`pP&It;$gcC?79Dh8yazrCC$||BL zgoD6i&+1C|-9^XaU(Z7KFGVRO!=rrI%Zlv#UjkMMsQkkt2R-sv|5<5?;GjpPVE@w; z0DV_oL6~a2tb#b@6zctEAxZ&YE};}$MnqVcsTC;scB_FJp-rn+VP3^TOr0{NwyY9< zK@i3X#~t^NfBeJ#!v8${pH+#;)Vt+`TVC)UndAQ=B6n=a67VQ~{8_$uy8f~k;HpZy z9SRsZ=BT5>n>S}V!J5V``Ha<*8aL*B8glN+yNd)4DFGP4@gS@oQc!Y&NFcxx5LN@6 z0djkhKs6;GtX5M{a+*jWz!DHv1DpYJdyzmjB_OO;Q&4i6NFcxx5LN@60djkhKs6;G ztX5M{a+*jWz!DHv1DpYJdyzmjB_OO;Q&4i6NFcxx5LN@60djkhKs6;GtX5M{a+*jW zz!Gp6t30l3B7yoOf$CQPytQNEfq7O&DAcEXl6MgaP^7DgE3$G7s|-zL4ig5MGo28h zvWW!hfdm+&T1{M?#45w{Crp^ow{PFxvWW!hg#?BVA3k{SU~OC+QoA~dRVLjTF=E7H zhy5){Bv5Z80IN_6hr+6WEfNT72?(n}ojvtNC&-J`UIN0ZuqqO8h6IFFXXI1uYh}5D z(95>!szW0bx~G6$v;)0>Y{@@+nBFc6p2dNY}WDiUyp z1cX&*Y~Jfkgt&kbto2 zjC=}UbuPCK5(x;a!m3EX84?gyosmyLQnkxt1W*D_VzpIRSmP5;IO2#S8XanrwUPr^ zq~z9hBmsZ08WM8edFPd_Jw+^pcYa`4J^r}k4ozyKM#5?x6&JZ|043lDRzpKVh7TL| z%P+rx>tXyatOhW@<<`!XfInCb4IMOa;J4p?E38V}SR~-R1pLG5;6a1F`|dko)%$#M zt~QV-_mu>MRpCb@;0y@}tIo(LU)9ZW9p_3QFszOnH_nTAVDSSxx17n7*IojFVfD;2 z&lFZ`pLueH1|@;Ou-dI#H(|9wl{0zS+DjlXtajz*O!m6+;5^#nDgjHwclhbvAJb&#aAgl_jA^~SeKv;D~KGnWf zmMb`20>Y}WDiUyp1cX&*`?YuqqO8 zh6IFFXXKO9b%H#9?Ij?r3acUkXGlO;bw)nbzE+kiI9&q5s<0{&aE1f|!)lKnJ!HNm zr&sgx{C<{z-&pTCTi?-iU95LSg%k$^KKAgnqgpMtZdm#6Zl1cX&# zRV3gH2?(ps$R~f+-*T_ulz^}*tcnDjApv348Tk~PHN8BQKP4cn3acUkXGlO;bw)n< zv;LNQ1*ZgrRbf>m;0y@}tIo)$;H>H8sr)GcVO3Za2{=On!m2a!$)EMN+$%UGAgl_j zA^~SeKv;D~J_Tn@FHhx92?(pgsz|^Y5)f9Mkx%}tzvW)RDFIWqByXZCz!?${R-KVg!CBMGQ~6T@!m6+; z5^#nDgjHwclRxWkxmR#XKv)%4MFP%{Kwwx+Oh}Nmr-HNcmZu6@2?U1KkY>$<)u1gC z@?gO!0spYtsbj~t-+sGn?WvPaJW*H;&H^D%6|@rY538(W{_L~Qma%$bWq96ts)W-R)tlOfHNc@tU4o~M5~AdgjHcxB;X7Q2&>M>C($Y* z0bx~G6$v;)0>Y{@@=3IcNI+N>Rz(8Nkbto2jC>NUA`%c*g;kM&GbG?2RxP6_yj)r9!?`|rR1z<~pY!7KmB{J_Ck8sw>hSpt4zb<375!m8+1k%0FS z5LUgHT`Y}WDiUyp1cX&*Mpe`=bqa(?}jfUqj8iUgb?0b$h{`BeY3guGEr zB_ON{t0DnsNI+P1Mn2WF4wm!lp9F+eVO1pH3<(IU&d8_wrzPZ#YAON$u-YyrX49rk zu5mWfzgp8wlJi9ZNWed=hP7;Y%PqGEtD?h20^UnNSoL0ZQrU|H{3!upRag}XI70%$ zsx$J*pY^xgD>x+}tO~0l0cS`+San7|1!qk!PvuVu2&=-XNWd8q5LTU$PyVdGY{@@+mlLdU+~;NY}WDiUyp1OmY72OoSO>%;|T%`HzA%n}FytIt0B ztgsr)WkQ}UI3?g8RzsRKTfTg`YtGS~J9Y@G!C4yQse)Mo{$aJrDW}YvH_yfDuAMuD z)nG0Y@@&B=0l%?2fBt-7)fqmF;4G=~RKlw8BNA|i1cX&*k$|u&tcnDjApv34 z8TlkyMI<1s3acUkXGlO;bw)mkRuKsZtHP>Cz!?${R-KVgqE$o!!m6+;5^#nDgjHwc zlV}x@fUqj8iUgb?0b$h{`6OCJBp|E`t0DnsNI+P1Mm~vF5eW#Z!m3EX84?gyosmzX zRYU^9s<0{&aE1hgRcGXrXcduwuqv#I1e_rOVbvM=Bw9rzAgl_jA^~SeKv;D~K8aQl z2?(pgsz|^Y5)f9Mkx!ykL;}L9uqqO8h6IFFXXKM;6_G#ySbcieE?Lh;N}fodrV@i~hGyqAEm>b>l0 zS})4^B7xdSKv)%4MFP%{fUxR}e5y@-EWfQE5)f8}Rgr)*Bp|FhBcJMrW{|h2jRb^M zVO1pH3<(IU&d8_Q)W`DM`XK>fRag}XI70%$sx$JberN`Hi`qy)SQS=90?v?tuZquojm!kzy1>p}v4V|CoPao>FNjj$@L ziUhorfPYwJt>jUoM(y3ZS6KBjpX#EXmTNjo0)Aul?6c4Q=%bH>Rbf>m;H3nFRWAkS ztSVWawjM}8SQS=90?v>?09aih<7^IdM&YOjx~M+ALI7C3;_}NScE3KAA$b@7NFV^L zUNCm7uY{@@~J-Q2YDCoBp|E`t0DnsNI+P1Mm~906U(pa zlLUlSVO1pH3<(IU&d8_wq#xv6ypw>iDy)hGoFRb#uzJA-7sz}|-qoz~tA;EAf3o`V z#~-WpY=#XTDy%l-GAHluodo>Js%xFN?%lf!tKQ|7{Hh^Kz;CP$89exf7hX_$wQJX| z!fHb z`|iT3z#|fHh6IFFXXI1RR`&8>ev^Q(Dy)hGoFM^W)fxHZx5`^?6tof$R)tlOfHNc@ ztU4o~g0`}k2lJZ*gjHcxB;X7Q2&>M>C%;wRa-*P?fUqj8iUgb?0b$h{`4qI3y*!xT zBp|E`t0DnsNI+P1Mn3ti@|GI~tptQsVO1pH3<(IU&d8^rt?cE&{3ZcmRag}XI70%$ zsx$J*ZY{@@+oL5dwDRwNkCW?Rz(8Nkbto2jC}H2CFQN59X-&pP1x%1t3-KF$uVnTwjT5k%Fyolc<;5Sw~b?C5e z?OI_~Tv;LkFD2klR@bjvC#-szPkyVsY{@@+oL5dwDRwNkCW? zRz(8Nkbto2jC}H2Y}W zDiUyp1cX&*45`fhstgX?ZHqJWk*kfCUgtUo>h>nbmi-}2$k55TX&dkWj&B-Y&C@3u{DJ?C{ z%gf_Pa&mH9TwGLSWJGv)^U%;Hr<}qZE`FL9;>aV9jEsyNKYsj(5hI4nCK9L@5;*U? z^9BtXbo}wh|Lb4>Iuxpn9K$Ma!Yjqb#-d%rWfKY13kkGt-J16R!b5_}2~J{_$35z( zqpI^(a*jyA5fZ>!WUJ<*I*iq7zLlIN5~zO?5LWA7p2{25PYDRC^)p}Pt?Hiygw??3 zDS7b!{@?#Q{P4s1WIyl^)Tj||Nw(@d45!t_lXL5T{_~&z_kaI)n6#(|qd))gkAEn4#F0mua;%S=C$ygoMVx6r z!aiqm5&J>&Tk|})+)q65L~{h+n9>~<{02%n>B0Ji!Z*oXU`tar$e0U%$qmwnP;B4=bn2Wdg!6E&pw-L zcI(#d!3Q7YxBve4zd3U3vBzpkn>1-MZrnJ&dd|JwdFP#@Mva17J16?#VQI~pHC%*y zu|5C%^IZR&bI##O%*j0G#*G`f7!SZ}HgDdXuXq6P-n@D9&Ye5;E1Y@enLLAroCogM zu_I5rW5*7p!S?jiPqV<;^5x6?}s0L__4LI!=IGwo;`a~YC(uI=ggV&%{SkC@WBT^{qz%Pah&a{tFGeU zM<0Fk^UptDaKQyo0RwC|-gx8JUw{4CXP>?N^2^{vFV`J+-0|g?U-I*>zWRz15Bx0e z2haQV?fdb^A16$hfEML~JkRa7-~R5q?{X%O!IjzGfB*e=-g)QlyYHr3nWkArof-jRsl|BI>I=D^omop(S#|aL>#tX=o_x|tUbA}aF~`(1 zu^#euD6d_*bO9%Tp|F1X>8G#1{yKkZR)OlKn{H~+q6K(xCVG`4knsKY-%pt`1?9>0 zmo8ljlbrv>7hjxl#u=QZRo2RtD><19Qrs~e+q7weo&;TJ`TXf z?7Q#2yX2BfG^?XWkLDQwkLTIHe?Q;qhvD--|M?H!a+J+R74r=9(HipK@lP8~W!U>c`-WQ|y$tR!W znr!#oci+T`6Sr>N$`LlM!0VvZ4=LVyc|t8&rQ)7Hf4*Y%BJBv>&uB_%07o`6Qe8e4^h9dq>2^-{P8c`493|NQg6 z{q|c5H?XZ+w+@|yDM)cgK>-yeVnRX!r?H`S0F~pMKX>k23hU{opT2hOT7C#oXhN{( zGz}8U2edS+iHV6w9*qQ7+=zo98XX;t(yquVwF5|VBYwVM!2;Cmk|j&{lZ_j(PtHOh zH|pB8E7#<{Z@u*vx{(@z@Xv=Iei(}y@OaMj^mGaqbqAI$rZ`x#-F4Sp&6+ji=NDdh zA>eTZXv7RgZKB&XtB_2k@aUtDqKz?+G03SPrcIlMrsevNKmK@OVPS)fhp9cQw1$M$ zgHT!dR}@(k8g(4j=^uamficVx+G(%8`YK$(Dk=riILOw$dv^*nq@hSb@uZVZiiwGV z0nkDLqIO_|)3_6#T#C~)tDJ_-jK+f>ScN*i%E`&;(W8f9)!4x6*RMx!^TS_%{gqmS zOYs%Y1CS`s>#n=buu5~6#wRu{WO5xGOH>os$=C%vC$}SfoQKh@a$Ge!ckiY?f`434 z)G}}gjXXK{v5(mdlaxhRz4X#cc{Sif_x9=2hbt2_OY@b=>;C)i=hniicd`5ERbjPq z8V`Pya*RQkot>SQmWEzB?X=T!b8{(+paN8|%D(mt!3-#3$8r$;MyVx&lp~aN>}Skf z8mOi*$;sDTbB$(|_FlVo?PkoF0nfn3W!az+0Q&du4?O&d3LQCeB&8on$V(ho=uD~x zoJ{T8x5rlmklMaov}loGwNs}~XgSPRHi*&@t)NH?7BdxMsSY%&v_d%!*lf4latlpm zVB;0|70Q#Bf=PD9jvZ@f6}&fX+C*)o8|@6(pvk>q!v-8(SP;UhuzGN~eE%(`ESdzm zAPQ|sTakt$st<&48ex%QG17jcb&5K=`R1G93OIp*u}+;kcLpIeFb&QtuDAjufS*S+ ztYRBO4$Pnr`IT-=Vy~i#aSJg<1$g+AuNdcn?qY)h-S2{v7AFMi4v!8OfofWts6O;L zr*R7~M$6%+#exN)mMvTIkgHa$!m_0u%TK_bhv8&w;9GCK6|mWGYn^=Z$uO@q=xU$i(#8OR4O5y~43tSJVI1X}I5Q0_i zd&3Pkpe-?9Ar`f-pBz?s032HAQWQQ)8>IOyM>=%qfJK1e4U=>W8CLOWa}G)vJ{gTk zwF2$8SsM)FmlEHSuuAFj-v%BOeLw|23{(v&tx9ZKG#-izJ*n~InIPffi!X*iNJC-b zE`m=^rX|Urz{Uys(b=Id2LiEOv7#yH6ngLmm8nyw;@zSBiGJg1C^Qrx3KO3&55w&M z9)BzZ@&J6IA=v;GR4~+yXt+gDQ4t_vz5+bF;jiW(?PLh#7N}6Hdd}B+6%|c20h4&A zIESmDGpA3Vj_VPfubCV+Y#7xR?@O&jWr2&EheVyiDlSX-)b1;caB36tBn@o``P3$E zN!qJk78nXQg_VXGO;B_x8`de-CXqULM8TNNT$+>V$-tG0qm>3NaMFYWNX%v$d#G7X z&?mEV`Q?{GAU+;gg-^ghe?kC5K6Ci0H zVz_dGz2eBv&&MW*b~e;04R3yq=7&jCA0{rB;(7QLeKy#-C`GOedprOem*on0&OjHf z%W(`{!zwx!JNepcuZ3+Y1q~;cqBcP$<}r+L8qSWe8koGMaN|q@3^Xe05!FY}1a8}c zf&x4@*ou%$-mvj}oJ`@yG{x`AnRrU+Q(+(D855M|D<|mJU=^qN2;81O?3W=P{MC}CKIA9`ZgqN1W`!9uJyJ~@*oU$$%+S73v; z(9lp0&YU@uhk;>;g+rc4vpReBY`T0oA8iTPd}4&t^yRVXf6`1+j~G_51vn1*K#o6| zo6|S& znNCsk4{8vj6sIT(87C8GUU}t}xS(`&1h2uFbka}-pl{(#cYc5_^HiarxF*NZd*H;4 z(2BHaQOj7r{E&bOVB;%JK#fx}P;0ORelQFtIt-9Av$C=lFJ6rK$_7`MrX0kqrD_00 ztX!;C9!9f@>x;KTRYEmQR`#I||B&`kYbNnO>x=UuxT*17Lq5hlBH}TqM2G-k`~U6T zOHv$15XSLS5LjLahl~}xEPKI5OF2T`$V=8-Md2gJr|}i!>kvUe7_fgcpGeBnGlS@9 z37;QWja8^&orB z`f*Udjw-{mXyk!9_LpZngY^L6Nh0{u`$LAfV4)raXr!b-$BrTkcPt#HB~ zqbGw#_S3WzL<>TMz|x)J5Q>sXAXW$`dNI|IKR!OjC$mWrU{b=Tg&4wV<0WVgz_LT$*(rWg-HgP{mi)3`+3xKic7}iloyxYpE8bGz_Sn2VUOUeBdZVA z3FO$~hw&tD7Nrt{DH&42gSfk)3I~Rxqa%D`)gu!B7HP(@F15F@LO^938AHA+VhtC$ zj&6elpEjdPOiD<$7?Te<`h**dDjgvg8o9On>dno~C=OG#@a9faGz=zN7gn(ZR5T*i z5I05gQE?7H1*9ZnB8tpWL+(MKa9_A`s>79?no~j9$ zHnBx+^9C8H2y*gll9xG|Z#g1?jxf_BAOTuTA}ej2W8_>VL9Fkxiii?P&pUvblR~cy zT>a^t9NOIPokF0TbZKK_!?y}H<@5;7y{$m4ueii|bIUc3l^glFm96`qLq=n+GPk4+ z3D_ha_>WJYtowcY;)PxjyT9wVhTpuI{Lt{*w>IN2AXG96;`R|-#>o*>+|Oc zs{+u)e4m`0kU9R6usAC7yR9vwp#8l)llZWPt_c;#pMRQcvf1C+*?ax^dG51WFDV&I z`xsh)^RmdU+RFCJyLZ37e=my0NC#^_9vtBFw+|moUI>7($@%>J{POa0!fMjh)fF#` zgOs$lyUVAN3{LneUb1+q*kE{yW&;=ffshmS+SDIs=)Diwjg< z1NzSmtH8x!Ze4!7#`%_it;Ms<#%UQ}AspKVGs-;${0rgg!)H^yI7?OMZf2GC9iJUr zU~UU^#jMU45fDqlnHdC=4#w?qJTr`Eu^>ad*)XEcq%mwus926wd)0eP0T!jn{D)Ov zMRvj6K0HW%Nj2(HYpF`ET$9tATURUF{t3?@hz(*8iH0 zKbQHgoH_IO@mRftb1Uv7f2VaLnKkXE0gZ#ER_zo zT&N)Ht)}G4lDLHxF`*(xM16@KvxIIT-O9Ys8r<1^b$WVgGRa_d8LM^8h_;e(Y?6ni zzo!Y+mAuy`FZ(t{lZ)W7h%b7^a*$nGmivTmi)&LQ6;R?7I!0S%l-~Jbd)Rio@3$4< zGa1Sd%zZ;n`bsEjzg|Qs zWI?6yrXEzMP4OOYHDwy=zB^^W_s6>EN{OI`J)#>ic2r+0)n;x*aSH0PrfsENXs3`B zI}=5)Wh10TmVzbt1f^@RCjS<0#b7scGhXdpyVIHaSe2l_R=z5$47P3c#I}u^Ot&aj zYzw1dx5c>F$E@<2fGB7Vrkj*V{T+mBbTId!a01VkM#H@#EtwL(63A9cyE6QL zo_R=C`_;2;yX31`+YG0l7PM#0?lXAXmBKSYxLqcE6&?!%ZZ1uC^1yX110KTlF_W(E z5sqzF$;5J@8LzI=0-9GNYifE{((D>P7BBubTc?}EMbpT@Gid@muBJTKURCR*Gxb8v+cz;&!yqy_}vCBx(#mjhzhu;jERLfcuo<{ zc}ILCk@xnjk~5M-y!cTB3+IFk>dr*pm&g7jnOCVKj77T@Y1%2A^xKOX-|8GB+684+Y4cSg_2FAPTMtYzT2Taq+;zJc^0e=+bdl`nK>g`leUhnvw5cWsVcP^VofEJ@}VIrezKKcS}! zW|EV1#AHCfAOR+3YUaWAPcLEC@;OBLbch0#-3Szu{qD-?Ckt(zG48N)6=U?5{XlBR cvT ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2013 by Lorenzo Miori + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + + +#include +#include "button.h" +#include "buttonmap.h" + +int key_to_button(int keyboard_button) +{ + int new_btn = BUTTON_NONE; + switch (keyboard_button) + { + case SDLK_KP4: + case SDLK_LEFT: + new_btn = BUTTON_LEFT; + break; + case SDLK_KP6: + case SDLK_RIGHT: + new_btn = BUTTON_RIGHT; + break; + case SDLK_KP8: + case SDLK_UP: + new_btn = BUTTON_UP; + break; + case SDLK_KP2: + case SDLK_DOWN: + new_btn = BUTTON_DOWN; + break; + case SDLK_PAGEUP: + case SDLK_KP9: + new_btn = BUTTON_MENU; + break; + case SDLK_KP7: + new_btn = BUTTON_BACK; + break; + case SDLK_KP5: + case SDLK_SPACE: + case SDLK_KP_ENTER: + case SDLK_RETURN: + new_btn = BUTTON_SELECT; + break; + case SDLK_KP3: + new_btn = BUTTON_POWER; + break; + case SDLK_KP1: + new_btn = BUTTON_USER; + break; + } + return new_btn; +} + +struct button_map bm[] = { + { SDLK_KP7, 66, 423, 25, "Back" }, + { SDLK_KP8, 152, 406, 25, "Up" }, + { SDLK_KP9, 249, 429, 25, "Menu" }, + { SDLK_KP4, 105, 451, 25, "Left" }, + { SDLK_KP5, 155, 450, 25, "Select" }, + { SDLK_KP6, 208, 449, 25, "Right" }, + { SDLK_KP1, 65, 484, 25, "User" }, + { SDLK_KP2, 154, 501, 25, "Down" }, + { SDLK_KP3, 248, 484, 25, "Power" }, + { 0, 0, 0, 0, "None" } +};