From 48392bab943bd99579914e9747b908d13adefe96 Mon Sep 17 00:00:00 2001 From: "Hairo R. Carela" Date: Mon, 14 Jul 2025 23:04:37 -0400 Subject: [PATCH] New port: Anbernic RG Nano A bit of context, this device is a clone of the FunKey-S with a different form factor, hardware is mostly identical, the relevant difference is it has audio out (via usb-c, adapter to 3.5mm is included), this is the reason why the FunKey-SDK is needed for bulding. This port is based on the old SDL 1.2 code because the device doesn't have SDL2 support. Alongside what was supported in the SDL 1.2 builds this port supports battery level, charging status and backlight control. Change-Id: I7fcb85be62748644b667c0efebabf59d6e9c5ade --- apps/SOURCES | 2 + apps/keymaps/keymap-rgnano.c | 260 ++++++++++++++++++ apps/plugins/SOURCES | 14 +- apps/plugins/SUBDIRS | 5 +- apps/plugins/battery_bench.c | 6 + apps/plugins/bitmaps/native/SOURCES | 2 + .../bitmaps/native/jewels.240x240x16.bmp | Bin 0 -> 54234 bytes apps/plugins/blackjack.c | 16 ++ apps/plugins/brickmania.c | 9 + apps/plugins/calculator.c | 11 + apps/plugins/calendar.c | 11 + apps/plugins/chessbox/chessbox_pgn.h | 15 + apps/plugins/chessclock.c | 10 + apps/plugins/chip8.c | 12 + apps/plugins/chopper.c | 6 + apps/plugins/clix.c | 8 + apps/plugins/cube.c | 10 + apps/plugins/doom/i_video.c | 12 + apps/plugins/doom/rockdoom.c | 4 + apps/plugins/flipit.c | 14 + apps/plugins/fractals/fractal.h | 12 + apps/plugins/goban/goban.h | 12 + apps/plugins/imageviewer/imageviewer_button.h | 14 +- apps/plugins/jewels.c | 10 + apps/plugins/lib/keymaps.h | 8 + apps/plugins/lib/pluginlib_actions.c | 15 + apps/plugins/midi/midiplay.c | 8 + apps/plugins/minesweeper.c | 10 + apps/plugins/mp3_encoder.c | 6 + apps/plugins/mpegplayer/mpeg_settings.c | 10 + apps/plugins/mpegplayer/mpegplayer.c | 9 + apps/plugins/oscilloscope.c | 12 + apps/plugins/pacbox/pacbox.h | 11 + apps/plugins/pegbox.c | 17 ++ apps/plugins/pong.c | 8 + apps/plugins/reversi/reversi-gui.h | 9 + apps/plugins/rockboy/rockboy.c | 8 + apps/plugins/sliding_puzzle.c | 9 + apps/plugins/snake.c | 8 + apps/plugins/snake2.c | 9 + apps/plugins/sokoban.c | 14 + apps/plugins/solitaire.c | 17 ++ apps/plugins/spacerocks.c | 9 + apps/plugins/star.c | 16 ++ apps/plugins/stopwatch.c | 8 + apps/plugins/text_viewer/tv_button.h | 12 + apps/plugins/vu_meter.c | 11 + apps/plugins/xobox.c | 9 + apps/plugins/zxbox/keymaps.h | 8 + apps/plugins/zxbox/zxbox_keyb.c | 9 + backdrops/cabbiev2.240x240x16.bmp | Bin 0 -> 230538 bytes docs/CREDITS | 1 + firmware/SOURCES | 13 + firmware/drivers/button.c | 2 +- firmware/drivers/button_queue.c | 4 +- firmware/export/audiohw.h | 4 +- firmware/export/config.h | 3 + firmware/export/config/rgnano.h | 97 +++++++ firmware/export/rbpaths.h | 6 + firmware/target/hosted/anbernic/adc-target.h | 0 .../target/hosted/anbernic/backlight-target.h | 39 +++ .../target/hosted/anbernic/button-rgnano.c | 73 +++++ .../target/hosted/anbernic/button-target.h | 47 ++++ .../target/hosted/anbernic/power-rgnano.c | 41 +++ .../target/hosted/anbernic/power-rgnano.h | 27 ++ .../target/hosted/anbernic/powermgmt-rgnano.c | 28 ++ .../target/hosted/anbernic/system-target.h | 7 + firmware/target/hosted/backlight-unix.c | 8 + firmware/target/hosted/filesystem-app.h | 4 + firmware/target/hosted/sdl/button-sdl.c | 14 +- firmware/target/hosted/sdl/lcd-bitmap.c | 4 +- firmware/target/hosted/sdl/lcd-sdl.c | 16 ++ firmware/target/hosted/sdl/lcd-sdl.h | 4 + firmware/target/hosted/sdl/pcm-sdl.c | 21 ++ firmware/target/hosted/sdl/system-sdl.c | 47 +++- firmware/target/hosted/sdl/thread-sdl.c | 5 + packaging/rgnano/config.cfg | 7 + packaging/rgnano/icon.png | Bin 0 -> 1234 bytes packaging/rgnano/mapping.key | 5 + packaging/rgnano/rgnano.make | 40 +++ packaging/rgnano/rockbox.funkey-s.desktop | 9 + packaging/rgnano/run.sh | 38 +++ tools/configure | 96 ++++++- tools/root.make | 3 + wps/WPSLIST | 5 + wps/cabbiev2.240x240x16.wps | 83 ++++++ wps/cabbiev2/battery-240x240x16.bmp | Bin 0 -> 30414 bytes wps/cabbiev2/lock-240x240x16.bmp | Bin 0 -> 4286 bytes wps/cabbiev2/pb-240x240x16.bmp | Bin 0 -> 13338 bytes wps/cabbiev2/playmode-240x240x16.bmp | Bin 0 -> 8334 bytes wps/cabbiev2/repeat-240x240x16.bmp | Bin 0 -> 5206 bytes wps/cabbiev2/shuffle-240x240x16.bmp | Bin 0 -> 1848 bytes wps/cabbiev2/volume-240x240x16.bmp | Bin 0 -> 23974 bytes wps/cabbiev2/wpsbackdrop-240x240x16.bmp | Bin 0 -> 230538 bytes 94 files changed, 1517 insertions(+), 29 deletions(-) create mode 100644 apps/keymaps/keymap-rgnano.c create mode 100644 apps/plugins/bitmaps/native/jewels.240x240x16.bmp create mode 100644 backdrops/cabbiev2.240x240x16.bmp create mode 100644 firmware/export/config/rgnano.h create mode 100644 firmware/target/hosted/anbernic/adc-target.h create mode 100644 firmware/target/hosted/anbernic/backlight-target.h create mode 100644 firmware/target/hosted/anbernic/button-rgnano.c create mode 100644 firmware/target/hosted/anbernic/button-target.h create mode 100644 firmware/target/hosted/anbernic/power-rgnano.c create mode 100644 firmware/target/hosted/anbernic/power-rgnano.h create mode 100644 firmware/target/hosted/anbernic/powermgmt-rgnano.c create mode 100644 firmware/target/hosted/anbernic/system-target.h create mode 100644 packaging/rgnano/config.cfg create mode 100644 packaging/rgnano/icon.png create mode 100644 packaging/rgnano/mapping.key create mode 100644 packaging/rgnano/rgnano.make create mode 100644 packaging/rgnano/rockbox.funkey-s.desktop create mode 100755 packaging/rgnano/run.sh create mode 100644 wps/cabbiev2.240x240x16.wps create mode 100644 wps/cabbiev2/battery-240x240x16.bmp create mode 100644 wps/cabbiev2/lock-240x240x16.bmp create mode 100644 wps/cabbiev2/pb-240x240x16.bmp create mode 100644 wps/cabbiev2/playmode-240x240x16.bmp create mode 100644 wps/cabbiev2/repeat-240x240x16.bmp create mode 100644 wps/cabbiev2/shuffle-240x240x16.bmp create mode 100644 wps/cabbiev2/volume-240x240x16.bmp create mode 100644 wps/cabbiev2/wpsbackdrop-240x240x16.bmp diff --git a/apps/SOURCES b/apps/SOURCES index bfad649847..6fc8a276c8 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -303,4 +303,6 @@ keymaps/keymap-shanlingq1.c keymaps/keymap-echor1.c #elif CONFIG_KEYPAD == SURFANS_F28_PAD keymaps/keymap-surfansf28.c +#elif CONFIG_KEYPAD == RG_NANO_PAD +keymaps/keymap-rgnano.c #endif diff --git a/apps/keymaps/keymap-rgnano.c b/apps/keymaps/keymap-rgnano.c new file mode 100644 index 0000000000..9fff239d56 --- /dev/null +++ b/apps/keymaps/keymap-rgnano.c @@ -0,0 +1,260 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Hairo R. Carela + * + * 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. + * + ****************************************************************************/ + +/* Button Code Definitions for Android targets */ + +#include +#include +#include + +#include "config.h" +#include "action.h" +#include "button.h" +#include "settings.h" + +/* + * The format of the list is as follows + * { Action Code, Button code, Prereq button code } + * if there's no need to check the previous button's value, use BUTTON_NONE + * Insert LAST_ITEM_IN_LIST at the end of each mapping + */ + +static const struct button_mapping button_context_standard[] = { + { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_B, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_A, BUTTON_NONE }, + { ACTION_STD_MENU, BUTTON_Y|BUTTON_REL, BUTTON_Y }, + { ACTION_STD_CONTEXT, BUTTON_START|BUTTON_REL, BUTTON_START }, + { ACTION_STD_QUICKSCREEN, BUTTON_R|BUTTON_REL, BUTTON_R }, + + LAST_ITEM_IN_LIST +}; /* button_context_standard */ + +static const struct button_mapping button_context_wps[] = { + { ACTION_WPS_PLAY, BUTTON_A|BUTTON_REL, BUTTON_A }, + { ACTION_WPS_STOP, BUTTON_A|BUTTON_REPEAT, BUTTON_A }, + { ACTION_WPS_STOP, BUTTON_L|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT }, + { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, + { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_MENU, BUTTON_B|BUTTON_REL, BUTTON_B }, + { ACTION_WPS_CONTEXT, BUTTON_START|BUTTON_REL, BUTTON_START }, + { ACTION_WPS_HOTKEY, BUTTON_L|BUTTON_REL, BUTTON_L }, + { ACTION_WPS_QUICKSCREEN, BUTTON_R|BUTTON_REL, BUTTON_R }, + { ACTION_WPS_BROWSE, BUTTON_Y|BUTTON_REL, BUTTON_Y }, + { ACTION_WPS_ABSETA_PREVDIR, BUTTON_A|BUTTON_LEFT, BUTTON_NONE }, + { ACTION_WPS_ABSETB_NEXTDIR, BUTTON_A|BUTTON_RIGHT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_wps */ + +static const struct button_mapping button_context_list[] = { + { ACTION_LIST_VOLUP, BUTTON_FN|BUTTON_A, BUTTON_NONE }, + { ACTION_LIST_VOLUP, BUTTON_FN|BUTTON_A|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_LIST_VOLDOWN, BUTTON_FN|BUTTON_Y, BUTTON_NONE }, + { ACTION_LIST_VOLDOWN, BUTTON_FN|BUTTON_Y|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_list */ + +static const struct button_mapping button_context_tree[] = { + { ACTION_TREE_WPS, BUTTON_X|BUTTON_REL, BUTTON_X }, + { ACTION_TREE_HOTKEY, BUTTON_L|BUTTON_REL, BUTTON_L }, + { ACTION_TREE_STOP, BUTTON_L|BUTTON_REPEAT, BUTTON_NONE}, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) +}; /* button_context_tree */ + +static const struct button_mapping button_context_listtree_scroll_with_combo[] = { + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), +}; + +static const struct button_mapping button_context_listtree_scroll_without_combo[] = { + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), +}; + +static const struct button_mapping button_context_settings[] = { + { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_settings */ + +static const struct button_mapping button_context_settings_right_is_inc[] = { + { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_settingsgraphical */ + +static const struct button_mapping button_context_yesno[] = { + { ACTION_YESNO_ACCEPT, BUTTON_A, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_settings_yesno */ + +static const struct button_mapping button_context_colorchooser[] = { + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS), +}; /* button_context_colorchooser */ + +static const struct button_mapping button_context_eq[] = { + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS), +}; /* button_context_eq */ + +/** Bookmark Screen **/ +static const struct button_mapping button_context_bmark[] = { + { ACTION_BMS_DELETE, BUTTON_Y, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), +}; /* button_context_bmark */ + +static const struct button_mapping button_context_time[] = { + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS), +}; /* button_context_time */ + +static const struct button_mapping button_context_quickscreen[] = { + { ACTION_QS_TOP, BUTTON_UP, BUTTON_NONE }, + { ACTION_QS_TOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_quickscreen */ + +static const struct button_mapping button_context_pitchscreen[] = { + { ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE }, + { ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_TOGGLE_MODE, BUTTON_A, BUTTON_NONE }, + { ACTION_PS_RESET, BUTTON_Y, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_B, BUTTON_NONE }, + { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_pitchcreen */ + +static const struct button_mapping button_context_keyboard[] = { + { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_UP, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_L, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_L|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_R, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_R|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SELECT, BUTTON_A, BUTTON_NONE }, + { ACTION_KBD_BACKSPACE, BUTTON_Y|BUTTON_REL, BUTTON_Y }, + { ACTION_KBD_PAGE_FLIP, BUTTON_X, BUTTON_NONE }, + { ACTION_KBD_DONE, BUTTON_START|BUTTON_REL, BUTTON_START }, + { ACTION_KBD_ABORT, BUTTON_B|BUTTON_REL, BUTTON_B }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_keyboard */ + +static const struct button_mapping button_context_radio[] = { + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) +}; /* button_context_radio */ + +const struct button_mapping* get_context_mapping(int context) +{ + switch (context) + { + case CONTEXT_STD: + return button_context_standard; + case CONTEXT_WPS: + return button_context_wps; + + case CONTEXT_LIST: + return button_context_list; + case CONTEXT_MAINMENU: + case CONTEXT_TREE: + if (global_settings.hold_lr_for_scroll_in_list) + return button_context_listtree_scroll_without_combo; + else + return button_context_listtree_scroll_with_combo; + case CONTEXT_CUSTOM|CONTEXT_TREE: + return button_context_tree; + + case CONTEXT_SETTINGS: + return button_context_settings; + case CONTEXT_CUSTOM|CONTEXT_SETTINGS: + case CONTEXT_SETTINGS_RECTRIGGER: + return button_context_settings_right_is_inc; + + case CONTEXT_SETTINGS_COLOURCHOOSER: + return button_context_colorchooser; + case CONTEXT_SETTINGS_EQ: + return button_context_eq; + + case CONTEXT_SETTINGS_TIME: + return button_context_time; + + case CONTEXT_YESNOSCREEN: + return button_context_yesno; + case CONTEXT_FM: + return button_context_radio; + case CONTEXT_BOOKMARKSCREEN: + return button_context_bmark; + case CONTEXT_QUICKSCREEN: + return button_context_quickscreen; + case CONTEXT_PITCHSCREEN: + return button_context_pitchscreen; + case CONTEXT_KEYBOARD: + return button_context_keyboard; + } + return button_context_standard; +} diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index 8e263b3ac9..ead79a2e3b 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -26,7 +26,6 @@ playing_time.c properties.c random_folder_advance_config.c rb_info.c -rockblox.c search.c settings_dumper.c snow.c @@ -89,7 +88,7 @@ crypt_firmware.c /* Overlays loaders */ -#if defined(HAVE_LCD_COLOR) && (LCD_STRIDEFORMAT == HORIZONTAL_STRIDE) +#if defined(HAVE_LCD_COLOR) && (LCD_STRIDEFORMAT == HORIZONTAL_STRIDE) && !defined(RG_NANO) /* Build issues */ #if (PLUGIN_BUFFER_SIZE > 0x14000) && (CONFIG_PLATFORM & (PLATFORM_NATIVE |PLATFORM_HOSTED)) && (defined(CPU_ARM) || defined(CPU_MIPS)) duke3d.c quake.c @@ -140,9 +139,15 @@ robotfindskitten.c xobox.c spacerocks.c +#if (LCD_WIDTH != 240) && (LCD_HEIGHT != 240) +/* No 240x240 support */ +rockblox.c +bubbles.c +wormlet.c +#endif + blackjack.c bounce.c -bubbles.c calculator.c chip8.c chopper.c @@ -162,7 +167,6 @@ sokoban.c star.c starfield.c vu_meter.c -wormlet.c #ifdef HAVE_HOTKEY announce_status.c @@ -199,7 +203,7 @@ rocklife.c matrix.c speedread.c -#if (LCD_WIDTH > 138) +#if (LCD_WIDTH > 138) && ((LCD_WIDTH != 240) && (LCD_HEIGHT != 240)) invadrox.c superdom.c #endif diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS index b1f19d2eac..549858fd0f 100644 --- a/apps/plugins/SUBDIRS +++ b/apps/plugins/SUBDIRS @@ -13,7 +13,7 @@ clock xworld /* for duke3d, wolf3d and quake */ -#if (PLUGIN_BUFFER_SIZE > 0x14000) && (CONFIG_PLATFORM & (PLATFORM_NATIVE|PLATFORM_HOSTED)) && (defined(CPU_ARM) || defined(CPU_MIPS)) +#if (PLUGIN_BUFFER_SIZE > 0x14000) && (CONFIG_PLATFORM & (PLATFORM_NATIVE|PLATFORM_HOSTED)) && (defined(CPU_ARM) || defined(CPU_MIPS)) && !defined(RG_NANO) sdl #endif @@ -41,7 +41,10 @@ fft chessbox fractals imageviewer +#if (LCD_WIDTH != 240) && (LCD_HEIGHT != 240) +/* No 240x240 support */ sudoku +#endif reversi goban frotz diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index 925653842f..c9462f79ee 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -259,6 +259,12 @@ struct battery_tables_t { #define BATTERY_ON_TXT "Play" #define BATTERY_OFF_TXT "Back" +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define BATTERY_ON BUTTON_A +#define BATTERY_OFF BUTTON_X +#define BATTERY_ON_TXT "A" +#define BATTERY_OFF_TXT "X" + #else #error "No keymap defined!" #endif diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES index cfc9ebcf6a..caa7396018 100644 --- a/apps/plugins/bitmaps/native/SOURCES +++ b/apps/plugins/bitmaps/native/SOURCES @@ -500,6 +500,8 @@ jewels.160x128x16.bmp jewels.220x176x16.bmp #elif (LCD_WIDTH == 176) && (LCD_HEIGHT == 220) jewels.220x176x16.bmp +#elif (LCD_WIDTH == 240) && (LCD_HEIGHT >= 240) +jewels.240x240x16.bmp #elif (LCD_WIDTH == 240) && (LCD_HEIGHT >= 320) jewels.320x240x16.bmp #elif (LCD_WIDTH == 320) && (LCD_HEIGHT == 240) diff --git a/apps/plugins/bitmaps/native/jewels.240x240x16.bmp b/apps/plugins/bitmaps/native/jewels.240x240x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..706e574f5dc5e6ff2e6d941d445029ae04f1c20a GIT binary patch literal 54234 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 JfvS7p{{znMUJw8P literal 0 HcmV?d00001 diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c index 761cc6a882..8480adf3cb 100644 --- a/apps/plugins/blackjack.c +++ b/apps/plugins/blackjack.c @@ -612,6 +612,22 @@ enum { #define BJACK_QUIT BUTTON_POWER #define BJACK_QUIT_NAME "QUIT" +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define BJACK_SELECT_NAME "A" +#define BJACK_STAY_NAME "Y" +#define BJACK_QUIT_NAME "START" +#define BJACK_DOUBLE_NAME "R" +#define BJACK_SELECT BUTTON_A +#define BJACK_QUIT BUTTON_START +#define BJACK_MAX BUTTON_X +#define BJACK_MIN BUTTON_B +#define BJACK_STAY BUTTON_Y +#define BJACK_DOUBLEDOWN BUTTON_R +#define BJACK_UP BUTTON_UP +#define BJACK_DOWN BUTTON_DOWN +#define BJACK_RIGHT BUTTON_RIGHT +#define BJACK_LEFT BUTTON_LEFT + #else #error No keymap defined! #endif diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c index d3a262ed22..ff7c717f42 100644 --- a/apps/plugins/brickmania.c +++ b/apps/plugins/brickmania.c @@ -373,6 +373,15 @@ CONFIG_KEYPAD == SANSA_M200_PAD #define UP BUTTON_UP #define DOWN BUTTON_DOWN +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define CONTINUE_TEXT "A To Continue" +#define QUIT BUTTON_START +#define LEFT BUTTON_LEFT +#define RIGHT BUTTON_RIGHT +#define SELECT BUTTON_A +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN + #else #error No keymap defined! #endif diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c index f754cf6339..c38de5ffdf 100644 --- a/apps/plugins/calculator.c +++ b/apps/plugins/calculator.c @@ -546,6 +546,17 @@ F3: equal to "=" #define CALCULATOR_CALC BUTTON_MENU #define CALCULATOR_CLEAR BUTTON_BACK +#elif CONFIG_KEYPAD == RG_NANO_PAD + +#define CALCULATOR_LEFT BUTTON_LEFT +#define CALCULATOR_RIGHT BUTTON_RIGHT +#define CALCULATOR_UP BUTTON_UP +#define CALCULATOR_DOWN BUTTON_DOWN +#define CALCULATOR_QUIT BUTTON_START +#define CALCULATOR_INPUT BUTTON_A +#define CALCULATOR_CALC BUTTON_X +#define CALCULATOR_CLEAR BUTTON_B + #else #error No keymap defined! #endif diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c index 1a72d3d990..858e3dfac8 100644 --- a/apps/plugins/calendar.c +++ b/apps/plugins/calendar.c @@ -432,6 +432,17 @@ #define CALENDAR_NEXT_MONTH BUTTON_MENU #define CALENDAR_PREV_MONTH BUTTON_BACK +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define CALENDAR_QUIT BUTTON_START +#define CALENDAR_SELECT BUTTON_A +#define CALENDAR_NEXT_WEEK BUTTON_DOWN +#define CALENDAR_PREV_WEEK BUTTON_UP +#define CALENDAR_NEXT_DAY BUTTON_RIGHT +#define CALENDAR_PREV_DAY BUTTON_LEFT +#define CALENDAR_NEXT_MONTH BUTTON_R +#define CALENDAR_PREV_MONTH BUTTON_L +#define CALENDAR_EVENT_MENU_NAME "A" + #else #error "No keypad setting." #endif diff --git a/apps/plugins/chessbox/chessbox_pgn.h b/apps/plugins/chessbox/chessbox_pgn.h index e25394b4fb..f8baf47faf 100644 --- a/apps/plugins/chessbox/chessbox_pgn.h +++ b/apps/plugins/chessbox/chessbox_pgn.h @@ -598,6 +598,21 @@ #define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT) #define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT) +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define CB_SELECT BUTTON_A +#define CB_UP BUTTON_UP +#define CB_DOWN BUTTON_DOWN +#define CB_LEFT BUTTON_LEFT +#define CB_RIGHT BUTTON_RIGHT +#define CB_PLAY BUTTON_X +#define CB_LEVEL BUTTON_Y +#define CB_MENU BUTTON_B +#define CB_RESTART BUTTON_R +#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT) +#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT) +#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT) +#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT) +#define CB_RC_QUIT BUTTON_START #else #error No keymap defined! diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c index cf6796b572..746d061e66 100644 --- a/apps/plugins/chessclock.c +++ b/apps/plugins/chessclock.c @@ -408,6 +408,16 @@ #define CHC_SETTINGS_OK BUTTON_PLAY #define CHC_SETTINGS_CANCEL BUTTON_BACK +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define CHC_QUIT BUTTON_START +#define CHC_STARTSTOP BUTTON_A +#define CHC_RESET BUTTON_X +#define CHC_MENU BUTTON_B +#define CHC_SETTINGS_INC BUTTON_UP +#define CHC_SETTINGS_DEC BUTTON_DOWN +#define CHC_SETTINGS_OK BUTTON_A +#define CHC_SETTINGS_CANCEL BUTTON_B + #else #error No keymap defined! #endif diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c index 47d76aab55..d07781c2f0 100644 --- a/apps/plugins/chip8.c +++ b/apps/plugins/chip8.c @@ -1299,6 +1299,18 @@ CONFIG_KEYPAD == MROBE500_PAD #define CHIP8_KEY6 BUTTON_RIGHT #define CHIP8_KEY8 BUTTON_LEFT +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define CHIP8_OFF BUTTON_START +#define CHIP8_KEY1 BUTTON_Y +#define CHIP8_KEY2 BUTTON_A +#define CHIP8_KEY3 BUTTON_X +#define CHIP8_KEY4 BUTTON_LEFT +#define CHIP8_KEY5 BUTTON_UP +#define CHIP8_KEY6 BUTTON_RIGHT +#define CHIP8_KEY7 BUTTON_B +#define CHIP8_KEY8 BUTTON_DOWN +#define CHIP8_KEY9 BUTTON_R +#define CHIP8_KEY0 BUTTON_L #elif CONFIG_KEYPAD == SHANLING_Q1_PAD /* use touchscreen */ diff --git a/apps/plugins/chopper.c b/apps/plugins/chopper.c index d36d955552..a3071adfb2 100644 --- a/apps/plugins/chopper.c +++ b/apps/plugins/chopper.c @@ -207,6 +207,12 @@ CONFIG_KEYPAD == MROBE500_PAD #define ACTION BUTTON_PLAY #define ACTIONTEXT "PLAY" +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define QUIT BUTTON_START +#define ACTION BUTTON_A +#define ACTION2 BUTTON_B +#define ACTIONTEXT "A" + #elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/clix.c b/apps/plugins/clix.c index 325a39685e..08c77b4a01 100644 --- a/apps/plugins/clix.c +++ b/apps/plugins/clix.c @@ -325,6 +325,14 @@ #define CLIX_BUTTON_RIGHT BUTTON_RIGHT #define CLIX_BUTTON_CLICK BUTTON_PLAY +#elif (CONFIG_KEYPAD == RG_NANO_PAD) +#define CLIX_BUTTON_QUIT BUTTON_START +#define CLIX_BUTTON_LEFT BUTTON_LEFT +#define CLIX_BUTTON_RIGHT BUTTON_RIGHT +#define CLIX_BUTTON_CLICK BUTTON_A +#define CLIX_BUTTON_UP BUTTON_UP +#define CLIX_BUTTON_DOWN BUTTON_DOWN + #else #error "no keymap" #endif diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index f67d8e8198..6469ce8eee 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c @@ -415,6 +415,16 @@ #define CUBE_PAUSE BUTTON_PLAY #define CUBE_HIGHSPEED (BUTTON_PLAY|BUTTON_REPEAT) +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define CUBE_QUIT BUTTON_START +#define CUBE_NEXT BUTTON_RIGHT +#define CUBE_PREV BUTTON_LEFT +#define CUBE_INC BUTTON_UP +#define CUBE_DEC BUTTON_DOWN +#define CUBE_MODE BUTTON_X +#define CUBE_PAUSE BUTTON_A +#define CUBE_HIGHSPEED BUTTON_Y + #else #error No keymap defined! #endif diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c index 71220580d5..acbe83066b 100644 --- a/apps/plugins/doom/i_video.c +++ b/apps/plugins/doom/i_video.c @@ -633,6 +633,18 @@ void I_ShutdownGraphics(void) #define DOOMBUTTON_ESC BUTTON_POWER #define DOOMBUTTON_MAP BUTTON_PREV +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define DOOMBUTTON_UP BUTTON_UP +#define DOOMBUTTON_DOWN BUTTON_DOWN +#define DOOMBUTTON_LEFT BUTTON_LEFT +#define DOOMBUTTON_RIGHT BUTTON_RIGHT +#define DOOMBUTTON_SHOOT BUTTON_R +#define DOOMBUTTON_OPEN BUTTON_B +#define DOOMBUTTON_ESC BUTTON_START +#define DOOMBUTTON_ENTER BUTTON_A +#define DOOMBUTTON_WEAPON BUTTON_X +#define DOOMBUTTON_MAP BUTTON_Y + #else #error Keymap not defined! #endif diff --git a/apps/plugins/doom/rockdoom.c b/apps/plugins/doom/rockdoom.c index ec004f6614..c881f2b391 100644 --- a/apps/plugins/doom/rockdoom.c +++ b/apps/plugins/doom/rockdoom.c @@ -202,7 +202,11 @@ const unsigned char versions_builtin[7][20] = "TNT" }; +#ifdef RG_NANO /* Path is a bit longer */ +const unsigned char wads_builtin[7][34] = +#else const unsigned char wads_builtin[7][30] = +#endif { GAMEBASE"doom1.wad", GAMEBASE"doom.wad", diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c index 89e80f842f..b65e7a59ca 100644 --- a/apps/plugins/flipit.c +++ b/apps/plugins/flipit.c @@ -509,6 +509,20 @@ #define FLIPIT_STEP_BY_STEP (BUTTON_PLAY|BUTTON_REPEAT) #define FLIPIT_TOGGLE BUTTON_PLAY +#elif CONFIG_KEYPAD == RG_NANO_PAD + +#define FLIPIT_LEFT BUTTON_LEFT +#define FLIPIT_RIGHT BUTTON_RIGHT +#define FLIPIT_UP BUTTON_UP +#define FLIPIT_DOWN BUTTON_DOWN +#define FLIPIT_NEXT BUTTON_R +#define FLIPIT_PREV BUTTON_L +#define FLIPIT_QUIT BUTTON_START +#define FLIPIT_SHUFFLE BUTTON_B +#define FLIPIT_SOLVE BUTTON_X +#define FLIPIT_STEP_BY_STEP BUTTON_Y +#define FLIPIT_TOGGLE BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/fractals/fractal.h b/apps/plugins/fractals/fractal.h index d5c928c92b..2ed4938b0a 100644 --- a/apps/plugins/fractals/fractal.h +++ b/apps/plugins/fractals/fractal.h @@ -519,6 +519,18 @@ #define FRACTAL_PRECISION_DEC (BUTTON_BACK | BUTTON_DOWN) #define FRACTAL_RESET BUTTON_PLAY +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define FRACTAL_QUIT BUTTON_START +#define FRACTAL_UP BUTTON_UP +#define FRACTAL_DOWN BUTTON_DOWN +#define FRACTAL_LEFT BUTTON_LEFT +#define FRACTAL_RIGHT BUTTON_RIGHT +#define FRACTAL_ZOOM_IN BUTTON_X +#define FRACTAL_ZOOM_OUT BUTTON_B +#define FRACTAL_PRECISION_INC BUTTON_R +#define FRACTAL_PRECISION_DEC BUTTON_L +#define FRACTAL_RESET BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/goban/goban.h b/apps/plugins/goban/goban.h index 67a07b4972..d084a598f6 100644 --- a/apps/plugins/goban/goban.h +++ b/apps/plugins/goban/goban.h @@ -512,6 +512,18 @@ #define GBN_BUTTON_MENU BUTTON_MENU #define GBN_BUTTON_PLAY BUTTON_PLAY +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define GBN_BUTTON_UP BUTTON_UP +#define GBN_BUTTON_DOWN BUTTON_DOWN +#define GBN_BUTTON_LEFT BUTTON_LEFT +#define GBN_BUTTON_RIGHT BUTTON_RIGHT +#define GBN_BUTTON_RETREAT BUTTON_L +#define GBN_BUTTON_ADVANCE BUTTON_R +#define GBN_BUTTON_MENU BUTTON_B +#define GBN_BUTTON_PLAY BUTTON_A +#define GBN_BUTTON_CONTEXT BUTTON_X +#define GBN_BUTTON_NEXT_VAR BUTTON_Y + #else #error Unsupported keypad #endif diff --git a/apps/plugins/imageviewer/imageviewer_button.h b/apps/plugins/imageviewer/imageviewer_button.h index ce359f3b25..95c9e79a69 100644 --- a/apps/plugins/imageviewer/imageviewer_button.h +++ b/apps/plugins/imageviewer/imageviewer_button.h @@ -557,11 +557,21 @@ #define IMGVIEW_MENU (BUTTON_PLAY|BUTTON_REPEAT) #define IMGVIEW_SLIDE_SHOW BUTTON_PLAY - - #elif CONFIG_KEYPAD == SHANLING_Q1_PAD /* use touchscreen */ +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define IMGVIEW_ZOOM_IN BUTTON_X +#define IMGVIEW_ZOOM_OUT BUTTON_Y +#define IMGVIEW_UP BUTTON_UP +#define IMGVIEW_DOWN BUTTON_DOWN +#define IMGVIEW_LEFT BUTTON_LEFT +#define IMGVIEW_RIGHT BUTTON_RIGHT +#define IMGVIEW_NEXT BUTTON_R +#define IMGVIEW_PREVIOUS BUTTON_L +#define IMGVIEW_MENU BUTTON_B +#define IMGVIEW_QUIT BUTTON_START + #else #error No keymap defined! #endif diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c index ab8e9ad588..66da8bc96a 100644 --- a/apps/plugins/jewels.c +++ b/apps/plugins/jewels.c @@ -390,6 +390,16 @@ CONFIG_KEYPAD == MROBE500_PAD #define HK_SELECT "PLAY" #define HK_CANCEL "BACK" +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define JEWELS_UP BUTTON_UP +#define JEWELS_DOWN BUTTON_DOWN +#define JEWELS_LEFT BUTTON_LEFT +#define JEWELS_RIGHT BUTTON_RIGHT +#define JEWELS_SELECT BUTTON_A +#define JEWELS_CANCEL BUTTON_START +#define HK_SELECT "A" +#define HK_CANCEL "START" + #else #error No keymap defined! #endif diff --git a/apps/plugins/lib/keymaps.h b/apps/plugins/lib/keymaps.h index 86ced8c26c..c3f9399cc6 100644 --- a/apps/plugins/lib/keymaps.h +++ b/apps/plugins/lib/keymaps.h @@ -272,6 +272,14 @@ #define BTN_FIRE BUTTON_PLAY #define BTN_PAUSE BUTTON_MENU +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define BTN_UP BUTTON_UP +#define BTN_DOWN BUTTON_DOWN +#define BTN_LEFT BUTTON_LEFT +#define BTN_RIGHT BUTTON_RIGHT +#define BTN_FIRE BUTTON_A +#define BTN_PAUSE BUTTON_START + #else #error Unsupported keypad #endif diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c index 1a94f0d5fe..ccbeec3acd 100644 --- a/apps/plugins/lib/pluginlib_actions.c +++ b/apps/plugins/lib/pluginlib_actions.c @@ -277,6 +277,15 @@ const struct button_mapping pla_main_ctx[] = { PLA_DOWN_REPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, +#elif (CONFIG_KEYPAD == RG_NANO_PAD) + { PLA_UP, BUTTON_UP, BUTTON_NONE }, + { PLA_DOWN, BUTTON_DOWN, BUTTON_NONE }, + { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { PLA_UP_REPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { PLA_DOWN_REPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, #else # ifndef HAVE_TOUCHSCREEN # error pluginlib_actions: No directions defined @@ -516,6 +525,12 @@ const struct button_mapping pla_main_ctx[] = {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE}, {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY}, {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == RG_NANO_PAD) + {PLA_EXIT, BUTTON_START, BUTTON_NONE}, + {PLA_CANCEL, BUTTON_B, BUTTON_NONE}, + {PLA_SELECT, BUTTON_A, BUTTON_NONE}, + {PLA_SELECT_REL, BUTTON_A|BUTTON_REL, BUTTON_A}, + {PLA_SELECT_REPEAT, BUTTON_A|BUTTON_REPEAT, BUTTON_NONE}, #else # ifndef HAVE_TOUCHSCREEN # error pluginlib_actions: No actions defined diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index bf79b5038b..67a789977a 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -336,6 +336,14 @@ #define MIDI_VOL_DOWN BUTTON_DOWN #define MIDI_PLAYPAUSE BUTTON_PLAY +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define MIDI_QUIT BUTTON_START +#define MIDI_FFWD BUTTON_RIGHT +#define MIDI_REWIND BUTTON_LEFT +#define MIDI_VOL_UP BUTTON_UP +#define MIDI_VOL_DOWN BUTTON_DOWN +#define MIDI_PLAYPAUSE BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c index 78e37161ea..6ba31598ed 100644 --- a/apps/plugins/minesweeper.c +++ b/apps/plugins/minesweeper.c @@ -455,6 +455,16 @@ CONFIG_KEYPAD == MROBE500_PAD #elif CONFIG_KEYPAD == SHANLING_Q1_PAD /* use touchscreen */ +#elif CONFIG_KEYPAD == RG_NANO_PAD +# define MINESWP_LEFT BUTTON_LEFT +# define MINESWP_RIGHT BUTTON_RIGHT +# define MINESWP_UP BUTTON_UP +# define MINESWP_DOWN BUTTON_DOWN +# define MINESWP_QUIT BUTTON_START +# define MINESWP_TOGGLE BUTTON_X +# define MINESWP_DISCOVER BUTTON_A +# define MINESWP_INFO BUTTON_Y + #else #error No keymap defined! #endif diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c index a9f5fa2c0b..21a0f8c5ff 100644 --- a/apps/plugins/mp3_encoder.c +++ b/apps/plugins/mp3_encoder.c @@ -2592,6 +2592,12 @@ CONFIG_KEYPAD == MROBE500_PAD #define MP3ENC_DONE BUTTON_BACK #define MP3ENC_SELECT BUTTON_PLAY +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define MP3ENC_PREV BUTTON_UP +#define MP3ENC_NEXT BUTTON_DOWN +#define MP3ENC_DONE BUTTON_START +#define MP3ENC_SELECT BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c index e0a71c8f33..e9b14a946a 100644 --- a/apps/plugins/mpegplayer/mpeg_settings.c +++ b/apps/plugins/mpegplayer/mpeg_settings.c @@ -365,6 +365,16 @@ struct mpeg_settings settings; #elif CONFIG_KEYPAD == SHANLING_Q1_PAD #define MPEG_START_TIME_EXIT BUTTON_POWER +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define MPEG_START_TIME_SELECT BUTTON_A +#define MPEG_START_TIME_LEFT BUTTON_LEFT +#define MPEG_START_TIME_RIGHT BUTTON_RIGHT +#define MPEG_START_TIME_LEFT2 BUTTON_L +#define MPEG_START_TIME_RIGHT2 BUTTON_R +#define MPEG_START_TIME_UP BUTTON_UP +#define MPEG_START_TIME_DOWN BUTTON_DOWN +#define MPEG_START_TIME_EXIT BUTTON_START + #else #error No keymap defined! #endif diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c index 677e19e17c..96645d48ea 100644 --- a/apps/plugins/mpegplayer/mpegplayer.c +++ b/apps/plugins/mpegplayer/mpegplayer.c @@ -498,6 +498,15 @@ CONFIG_KEYPAD == SANSA_M200_PAD #elif CONFIG_KEYPAD == SHANLING_Q1_PAD /* use touchscreen */ +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define MPEG_MENU BUTTON_START +#define MPEG_STOP BUTTON_X +#define MPEG_PAUSE BUTTON_A +#define MPEG_VOLDOWN BUTTON_DOWN +#define MPEG_VOLUP BUTTON_UP +#define MPEG_RW BUTTON_LEFT +#define MPEG_FF BUTTON_RIGHT + #else #error No keymap defined! #endif diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c index 822466656b..576d92f64e 100644 --- a/apps/plugins/oscilloscope.c +++ b/apps/plugins/oscilloscope.c @@ -564,6 +564,18 @@ #elif CONFIG_KEYPAD == SHANLING_Q1_PAD /* use touchscreen */ +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define OSCILLOSCOPE_QUIT BUTTON_START +#define OSCILLOSCOPE_DRAWMODE BUTTON_X +#define OSCILLOSCOPE_ADVMODE BUTTON_Y +#define OSCILLOSCOPE_ORIENTATION BUTTON_R +#define OSCILLOSCOPE_GRAPHMODE BUTTON_B +#define OSCILLOSCOPE_PAUSE BUTTON_A +#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT +#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT +#define OSCILLOSCOPE_VOL_UP BUTTON_UP +#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN + #else #error No keymap defined! #endif diff --git a/apps/plugins/pacbox/pacbox.h b/apps/plugins/pacbox/pacbox.h index f01dcc9cea..4e6e2704dc 100644 --- a/apps/plugins/pacbox/pacbox.h +++ b/apps/plugins/pacbox/pacbox.h @@ -418,6 +418,17 @@ #define PACMAN_COIN BUTTON_PLAY #define PACMAN_MENU BUTTON_MENU +#elif CONFIG_KEYPAD == RG_NANO_PAD + +#define PACMAN_UP BUTTON_UP +#define PACMAN_DOWN BUTTON_DOWN +#define PACMAN_LEFT BUTTON_LEFT +#define PACMAN_RIGHT BUTTON_RIGHT +#define PACMAN_1UP BUTTON_L +#define PACMAN_2UP BUTTON_R +#define PACMAN_COIN BUTTON_A +#define PACMAN_MENU BUTTON_START + #else #error Keymap not defined! diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c index f5d0abbf15..72e9ba06bf 100644 --- a/apps/plugins/pegbox.c +++ b/apps/plugins/pegbox.c @@ -731,6 +731,23 @@ CONFIG_KEYPAD == MROBE500_PAD #elif CONFIG_KEYPAD == SHANLING_Q1_PAD /* use touchscreen */ +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define PEGBOX_SELECT BUTTON_A +#define PEGBOX_QUIT BUTTON_START +#define PEGBOX_RESTART BUTTON_B +#define PEGBOX_LVL_UP BUTTON_R +#define PEGBOX_LVL_DOWN BUTTON_L +#define PEGBOX_UP BUTTON_UP +#define PEGBOX_DOWN BUTTON_DOWN +#define PEGBOX_RIGHT BUTTON_RIGHT +#define PEGBOX_LEFT BUTTON_LEFT + +#define SELECT_TEXT "A" +#define QUIT_TEXT "START" +#define RESTART_TEXT "B" +#define LVL_UP_TEXT "R" +#define LVL_DOWN_TEXT "L" + #else #error "Unsupported keymap!" #endif diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index 7b935aa140..b00e837b62 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -336,6 +336,14 @@ CONFIG_KEYPAD == MROBE500_PAD #define PONG_RIGHT_UP BUTTON_BACK #define PONG_RIGHT_DOWN BUTTON_RIGHT +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define PONG_QUIT BUTTON_START +#define PONG_PAUSE BUTTON_A +#define PONG_LEFT_UP BUTTON_UP +#define PONG_LEFT_DOWN BUTTON_DOWN +#define PONG_RIGHT_UP BUTTON_X +#define PONG_RIGHT_DOWN BUTTON_Y + #else #error No keymap defined! #endif diff --git a/apps/plugins/reversi/reversi-gui.h b/apps/plugins/reversi/reversi-gui.h index 25da80a145..4269f7b004 100644 --- a/apps/plugins/reversi/reversi-gui.h +++ b/apps/plugins/reversi/reversi-gui.h @@ -373,6 +373,15 @@ #define REVERSI_BUTTON_MAKE_MOVE BUTTON_PLAY #define REVERSI_BUTTON_MENU BUTTON_MENU +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define REVERSI_BUTTON_QUIT BUTTON_START +#define REVERSI_BUTTON_UP BUTTON_UP +#define REVERSI_BUTTON_DOWN BUTTON_DOWN +#define REVERSI_BUTTON_LEFT BUTTON_LEFT +#define REVERSI_BUTTON_RIGHT BUTTON_RIGHT +#define REVERSI_BUTTON_MAKE_MOVE BUTTON_A +#define REVERSI_BUTTON_MENU BUTTON_B + #else #error No keymap defined! #endif diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index 8f28cfbf2f..3d30524a89 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -484,6 +484,14 @@ static void setoptions (void) options.SELECT = (BUTTON_PLAY|BUTTON_MENU); options.MENU = BUTTON_MENU; +#elif CONFIG_KEYPAD == RG_NANO_PAD + options.UP = BUTTON_UP; + options.DOWN = BUTTON_DOWN; + options.A = BUTTON_A; + options.B = BUTTON_B; + options.START = BUTTON_START; + options.SELECT = BUTTON_FN; + options.MENU = BUTTON_X; #else #error No Keymap Defined! diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c index bf532f7b51..01fe84f1b4 100644 --- a/apps/plugins/sliding_puzzle.c +++ b/apps/plugins/sliding_puzzle.c @@ -369,6 +369,15 @@ CONFIG_KEYPAD == MROBE500_PAD #define PUZZLE_SHUFFLE BUTTON_MENU #define PUZZLE_PICTURE BUTTON_PLAY +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define PUZZLE_QUIT BUTTON_START +#define PUZZLE_LEFT BUTTON_LEFT +#define PUZZLE_RIGHT BUTTON_RIGHT +#define PUZZLE_UP BUTTON_UP +#define PUZZLE_DOWN BUTTON_DOWN +#define PUZZLE_SHUFFLE BUTTON_B +#define PUZZLE_PICTURE BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c index a4f79d924f..03b8d75d99 100644 --- a/apps/plugins/snake.c +++ b/apps/plugins/snake.c @@ -324,6 +324,14 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; #define SNAKE_DOWN BUTTON_DOWN #define SNAKE_PLAYPAUSE BUTTON_PLAY +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define SNAKE_QUIT BUTTON_START +#define SNAKE_LEFT BUTTON_LEFT +#define SNAKE_RIGHT BUTTON_RIGHT +#define SNAKE_UP BUTTON_UP +#define SNAKE_DOWN BUTTON_DOWN +#define SNAKE_PLAYPAUSE BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c index b6c3fc07e6..3f0434c2cf 100644 --- a/apps/plugins/snake2.c +++ b/apps/plugins/snake2.c @@ -470,6 +470,15 @@ CONFIG_KEYPAD == MROBE500_PAD #define SNAKE2_PLAYPAUSE BUTTON_PLAY #define SNAKE2_PLAYPAUSE_TEXT "PLAY" +#elif (CONFIG_KEYPAD == RG_NANO_PAD) +#define SNAKE2_LEFT BUTTON_LEFT +#define SNAKE2_RIGHT BUTTON_RIGHT +#define SNAKE2_UP BUTTON_UP +#define SNAKE2_DOWN BUTTON_DOWN +#define SNAKE2_QUIT BUTTON_START +#define SNAKE2_PLAYPAUSE BUTTON_A +#define SNAKE2_PLAYPAUSE_TEXT "A" + #else #error No keymap defined! #endif diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index b6b370f39c..f52ade7b71 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c @@ -714,6 +714,20 @@ #define BUTTON_SAVE (BUTTON_MENU|BUTTON_BACK) #define BUTTON_SAVE_NAME "BACK" +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define SOKOBAN_LEFT BUTTON_LEFT +#define SOKOBAN_RIGHT BUTTON_RIGHT +#define SOKOBAN_UP BUTTON_UP +#define SOKOBAN_DOWN BUTTON_DOWN +#define SOKOBAN_MENU BUTTON_START +#define SOKOBAN_UNDO BUTTON_B +#define SOKOBAN_REDO BUTTON_Y +#define SOKOBAN_LEVEL_REPEAT BUTTON_R +#define SOKOBAN_QUIT_REPLAY BUTTON_X +#define SOKOBAN_PAUSE BUTTON_L +#define BUTTON_SAVE BUTTON_A +#define BUTTON_SAVE_NAME "A" + #else #error No keymap defined! #endif diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c index 314610da8d..388a01abd2 100644 --- a/apps/plugins/solitaire.c +++ b/apps/plugins/solitaire.c @@ -744,6 +744,23 @@ CONFIG_KEYPAD == MROBE500_PAD #elif CONFIG_KEYPAD == SHANLING_Q1_PAD # define SOL_QUIT BUTTON_POWER +#elif CONFIG_KEYPAD == RG_NANO_PAD +# define SOL_QUIT BUTTON_START +# define SOL_UP BUTTON_UP +# define SOL_DOWN BUTTON_DOWN +# define SOL_LEFT BUTTON_LEFT +# define SOL_RIGHT BUTTON_RIGHT +# define SOL_MOVE BUTTON_A +# define SOL_DRAW BUTTON_X +# define SOL_REM2CUR BUTTON_L +# define SOL_CUR2STACK BUTTON_B +# define SOL_REM2STACK BUTTON_R +# define HK_MOVE "A" +# define HK_DRAW "X" +# define HK_REM2CUR "L" +# define HK_CUR2STACK "B" +# define HK_REM2STACK "R" + #elif CONFIG_KEYPAD == MA_PAD # define SOL_QUIT (BUTTON_LEFT|BUTTON_REPEAT) # define SOL_UP BUTTON_UP diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c index 3cbfd13dd9..b5b382b4dc 100644 --- a/apps/plugins/spacerocks.c +++ b/apps/plugins/spacerocks.c @@ -384,6 +384,15 @@ #define AST_RIGHT BUTTON_RIGHT #define AST_FIRE BUTTON_DOWN +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define AST_PAUSE BUTTON_X +#define AST_QUIT BUTTON_START +#define AST_THRUST BUTTON_UP +#define AST_HYPERSPACE BUTTON_DOWN +#define AST_LEFT BUTTON_LEFT +#define AST_RIGHT BUTTON_RIGHT +#define AST_FIRE BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/star.c b/apps/plugins/star.c index bee24fca53..fe4b763bc0 100644 --- a/apps/plugins/star.c +++ b/apps/plugins/star.c @@ -688,6 +688,22 @@ #define STAR_LEVEL_DOWN_NAME "MENU+DOWN" #define STAR_LEVEL_REPEAT_NAME "MENU" +#elif CONFIG_KEYPAD == RG_NANO_PAD + +#define STAR_QUIT BUTTON_START +#define STAR_LEFT BUTTON_LEFT +#define STAR_RIGHT BUTTON_RIGHT +#define STAR_UP BUTTON_UP +#define STAR_DOWN BUTTON_DOWN +#define STAR_TOGGLE_CONTROL BUTTON_A +#define STAR_LEVEL_UP BUTTON_R +#define STAR_LEVEL_DOWN BUTTON_L +#define STAR_LEVEL_REPEAT BUTTON_B +#define STAR_TOGGLE_CONTROL_NAME "A" +#define STAR_QUIT_NAME "START" +#define STAR_LEVEL_UP_NAME "R" +#define STAR_LEVEL_DOWN_NAME "L" +#define STAR_LEVEL_REPEAT_NAME "B" #else #error No keymap defined! diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c index c760569c6c..26d4aeb6ea 100644 --- a/apps/plugins/stopwatch.c +++ b/apps/plugins/stopwatch.c @@ -306,6 +306,14 @@ #define STOPWATCH_SCROLL_UP BUTTON_UP #define STOPWATCH_SCROLL_DOWN BUTTON_DOWN +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define STOPWATCH_QUIT BUTTON_START +#define STOPWATCH_START_STOP BUTTON_A +#define STOPWATCH_RESET_TIMER BUTTON_X +#define STOPWATCH_LAP_TIMER BUTTON_Y +#define STOPWATCH_SCROLL_UP BUTTON_UP +#define STOPWATCH_SCROLL_DOWN BUTTON_DOWN + #else #error No keymap defined! #endif diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h index f21faa0a41..f77b8b2fcc 100644 --- a/apps/plugins/text_viewer/tv_button.h +++ b/apps/plugins/text_viewer/tv_button.h @@ -587,6 +587,18 @@ #define TV_LINE_DOWN BUTTON_DOWN #define TV_BOOKMARK (BUTTON_MENU|BUTTON_PLAY) +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define TV_QUIT BUTTON_START +#define TV_SCROLL_UP BUTTON_UP +#define TV_SCROLL_DOWN BUTTON_DOWN +#define TV_SCREEN_LEFT BUTTON_LEFT +#define TV_SCREEN_RIGHT BUTTON_RIGHT +#define TV_MENU BUTTON_B +#define TV_AUTOSCROLL BUTTON_X +#define TV_LINE_UP BUTTON_R +#define TV_LINE_DOWN BUTTON_L +#define TV_BOOKMARK BUTTON_A + #else #error No keymap defined! #endif diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c index 3c8b9a4dd5..3f759db513 100644 --- a/apps/plugins/vu_meter.c +++ b/apps/plugins/vu_meter.c @@ -468,6 +468,17 @@ #define LABEL_MENU "MENU" #define LABEL_VOLUME "UP/DOWN" +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define VUMETER_QUIT BUTTON_START +#define VUMETER_HELP BUTTON_A +#define VUMETER_MENU BUTTON_B +#define VUMETER_UP BUTTON_UP +#define VUMETER_DOWN BUTTON_DOWN +#define LABEL_HELP "A" +#define LABEL_QUIT "START" +#define LABEL_MENU "B" +#define LABEL_VOLUME "UP/DOWN" + #else #error No keymap defined! #endif diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c index 5e4bc2bfaf..632d32385a 100644 --- a/apps/plugins/xobox.c +++ b/apps/plugins/xobox.c @@ -363,6 +363,15 @@ CONFIG_KEYPAD == MROBE500_PAD #elif CONFIG_KEYPAD == SHANLING_Q1_PAD /* use touchscreen */ +#elif CONFIG_KEYPAD == RG_NANO_PAD + +#define QUIT BUTTON_START +#define LEFT BUTTON_LEFT +#define RIGHT BUTTON_RIGHT +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN +#define PAUSE BUTTON_A + #else #error "No keymap defined!" #endif diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h index 1279e53931..9f82e29beb 100644 --- a/apps/plugins/zxbox/keymaps.h +++ b/apps/plugins/zxbox/keymaps.h @@ -301,6 +301,14 @@ #define ZX_UP BUTTON_UP #define ZX_DOWN BUTTON_DOWN +#elif CONFIG_KEYPAD == RG_NANO_PAD +#define ZX_UP BUTTON_UP +#define ZX_DOWN BUTTON_DOWN +#define ZX_LEFT BUTTON_LEFT +#define ZX_RIGHT BUTTON_RIGHT +#define ZX_SELECT BUTTON_A +#define ZX_MENU BUTTON_START + #else #error Keymap not defined! diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c index bafd45981a..6ec04ec04b 100644 --- a/apps/plugins/zxbox/zxbox_keyb.c +++ b/apps/plugins/zxbox/zxbox_keyb.c @@ -291,6 +291,15 @@ #define KBD_UP BUTTON_UP #define KBD_DOWN BUTTON_DOWN +#elif CONFIG_KEYPAD == RG_NANO_PAD + +#define KBD_SELECT BUTTON_A +#define KBD_ABORT BUTTON_B +#define KBD_LEFT BUTTON_LEFT +#define KBD_RIGHT BUTTON_RIGHT +#define KBD_UP BUTTON_UP +#define KBD_DOWN BUTTON_DOWN + #endif #ifdef HAVE_TOUCHSCREEN diff --git a/backdrops/cabbiev2.240x240x16.bmp b/backdrops/cabbiev2.240x240x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..56892b95592e275e74562140093ced6d8b557613 GIT binary patch literal 230538 zcmeFad7G_CRV5C^Sj-;7kqOukM|6Z}lO^8l^WquDNl2R^I1)sSP%01`fEv zl{~N2JMkz7{lq?8>wIN*Z-^P6HFW(4o~{vEoP)Z!w$1C*&$^+(Jk*aE&n*w5!fG3KXs*Arc+4fYzTp=)H_ z=Cl6vh5agR=}r0wjKrkA#)U>>#wHwSK;5Z#^`-skRc7i{4)mti>IF2^fV~DWs9$mH zN$R(M>ghX6Tw|Gc@t89_Lpyo9PH05z(9}NIaE{QZ^W=Gtef0DGK(lo-kC^UT=R0P` zp$_<=gK^@Ejr`P)T==Amx(DvkCLC&sf6S^?^>n{n^E{vCM;(=)JmS)}bnrggzbzj?||9@|q7aoNMf2{V1_vuD4cQD>o^VZHcNhirVlH-6wE-QQ0#<~id`Z1RVo%P@!Jy0F;>D+3KULnu9+*^zE%O}pPlam?t zxdv`xHSd1JIvza=|FA_9d>QLJf?0EGz0A)Z9r1gAs6YJi1Dord`_jEMC&qPj4(z+8 z)(Xs7_q=E3Zu|{zVdnhEL9F6JY{&21!ON_^tQgsKmuAmqyn3-TtQr;$&S=kpZ}_{n z7i{iJYFd2Y%y3@UDLXh*gJKtczFsU{@^OE_Sv=;8KXYqbyjy*U!+F-c_>T7sF~;w@ zf(LC&``Nnh3gVBw4(70vXPxU=eFy$u-+$XUqv-hUeC+3K?Dx&~>Sp8I=iByvlWW+- z{rpqrqqejC$UXD@#_o+Yx26MU+Yfw4`*DB0-W&9l8g39%dTxz#oy~2x-FCv58gB`! z^eMh@(3kWKbJpxvad7Xr=N~vbcKL6sm}tR#TgT*_i~)NM#*jEb3LA#3sJtbY@;# zFMHCQ3vc6cPuOE?RxjN*^G-i&F5H~Y(iNNQPY=8A) zuE_(tYXY`}rL7miubCr(PKH{mLe&BjQ6KsP!H8gJdx+mmOy!>8I zd#!~b{S$9#5T<&NUJTsmVU592uewL{2}kt;$K0t8+C7#I;la*35tFwRpF=&eUHLrPXjn|y+yZ^q^o8J89(;MFK zhSsj<&{_&(>2Q6UEt*&D>A|Kay3Xd+pP6^l>rKmL4VSQ1O;_`;n29^$$$fqOm$XgQDBIgVP#zIwm)aqRir|5|#k!M}tD z&cPc!dkxjU3o(ive2u@`Ui#9Pp5F47x771_$LZN;o;|(e9lulK9jDj5?sX^lUjOpJ*g=lA#4P<6e)WB6V$Y`4|V>Zl=knqP2w!3$uQ zk2N|cap}=MR~~aPFU+Z7#xJbJLv6qS->k!U@OKRSQx|-PoDHLDqW=Om;-XnKOn&rZ z?)Nn{k=J#c#g6(~A8e~n#7AC@XzW^I3y1NSPT^0Dor@gDcP~1BuVXv!OL@5u(8K#N z^H+_{LyQad=sC>NocQZ|9*&vQ^#`~3&-yTY#Na-hsOyES4fSFDLe5yf;PldZKJmQb zd+e)U{c6sydey5=uXx2PPWRk%5AQ3U;YS{RXhMwZ z&}=^HH72nYr!$uB8Lx9gjJ2@_VTF_N#if1$8#sy=ZfdZN+G^cB!Wur=q&@3_JL18K z9G#PU2Y-#OJw3H8_|k1Y;6N{82d4Ijkzcu^53Io&oKHO+FD+f8?bHT6sP(`LF5M^8 z0A7vg5*GSmy~IhZda?2pN8R9Ze}#pd!4EF(t=YWcpEUqqxwoC(`ObHqKK8LcIDPb^ zAFc5*&scx-^x+SGZzwrFMs(f#1mc66rI$7-l%5wqjkAI$a8Mj z%KXw#tn?5V9>mjHT;inPK5>p5aySQlF6^_Fuwe|VCww3SmN*wD=50)OD z88K6*&kK3c7mbJmPkIZ#^)NQt7!wZQ09$+Zm^i30SdQ(O)f3c@nsheC0RQ0bnw_sb zV$BPC*AQ&`rUqaV7ctPMSlEck+4;-^?&<+K97~)F@v~pbRV|&{Ik21Gb!6XlMMM1P zlli*`ji-L-yiuF9>s(e%?6d2pKJ?oA_rL%Br_X)<^J9GO^tsO+_VkzCagV<3(bFql z`AYuW{DK$0fb%PBf6trVbh_*AyLm28Kl4oejQzT;-t-A|EUimt*M~a(qXRuU_U&5C zt8^Ufw}h!Wx>oRSXLl=g9(3G7EvxUoBbB>syN0XmI*%J^xa_|c^QQV~T*nfx*4N?g z&&*|AH@ssvrOo|2#`f2yy}y?@udCxM{=oC04}IwL`Fbuh{^*ZBefq>FKY9AYKm4Q9 zr$7Cf)2BZ5hqeC0(`P>O*^WW%qmRCgKSRI$?e8exXZZd4_kQoaC+y$-?%!n&e$Tb@ ztB=>}_0QqVtFH~o*U$C-`5yKR-sAe&eZ(f`IM4q!=>Kl0JlOg3KQZv%0XKn%yynz@ zJ8XRIQw`zHe`g>zwzaPMT0?4=9{lbQzL^ugrNcP`L-9)=a28)UfGeJ0GG^33oHKso zjyUF@#T5@?wm9pct=7(&^fZT&HDcPAK>?8#(v=o z{FxiRS2-TB$i>gq!Fb^dU)0avs>^+B?dmP=^`;el267PpPlH50#V)EW)i^G+c?yc?f!!|fWR6C9}n8s?os9_r9&4USQ-pj~z93>?cG z+0}WS)8J?stYWzDHe{bC$yLA{=-hxI9EV)3pP&g##?BR+Y82h2;Fq)RJx zy#S|2cv?F-9G6~?dZI!3IIE>Abu3JsrR<8;c|!~GuZEt9 znP<(+LyYl^(|5tODBsv+gP&gqE^w2xalwgr<8!u-a1B3rnhSo%eC!YY;Pizr*7NJ} z@|VACX=aUzef){X>lyz-$07c+pZnbDnfmWs{C@hy^*iUTmD*Fg=i*~s=2dKBW(~jY z`ag!X_wiOV{Kt5=o?Sfi8*BOXwci-~Oy73j{+s1*cWc-7U)G~*G~9eIZ*-^RM@{&h z@)y7Or5^ZxjDH)tX2-VuMHgZ!AO7IH$T-UepYkxTzLu@(}--NIP+0eax`%sN-URQIgkn9ZYHo-O-;T*U;p zd&oLd17f@$Gy4dgW$SZAp8KWqcP_OePO;=mPl$<{z>yJMu)C&>TiVsbibYK2QfIh` z1)sGCXK<`uIM?;eGwOajZ=I!em0dA|AGN`5E!0MhFREww5&kU9=l9EBK7F~ym&Ob` zo=g0D@EhuNSE%u2_1fqMAAHN{gCG15^^G=J_`&)u)| zF}+>&vCpjEzH6}(BOT%yXTTl@8?p952l_@m#_&4l%e&Rw>aTo>Us${SP+MWZzwU7I zVUO0#($)Pk|B6%YaldOtOz>*%8g1i#`KhhqRl|(2PH3nco$)2Va?^v%tN~ojFTBm~ z`i}LI?;4-#i)Qt=`B)2dN-O!O!`d(59yBhj(Syq4bB6p&@!fOeT;}T9JAcJ(cX4QZ z&1+xF@5TS)fBX-Af5pEm;rl3FH;LCs;=gf^e9(#i?tS&EUVVB;{kzd8Kl!P8hQFfc zxaQZ^Yo*om)x+#Fzj$bntzNrzW^;e={e1e4`{~R2W?~ZSIhryrT`xXuwj=g&f4~I} z^GDpZco*`w`rCg^&t5cqgEuv8{KOmajX(Q-^k<*BVh0a@2D^xZUW}ZIIoC3IuUHSR z^WNCy9V_Y&8jTBX z=g5{g)dg*d#mu|!oapYJp(ez)24H!Q9QvXGyyEJ9*q`Ssv+973U;xuvQWLnzl|HU` z=@cKeu?N8b=Fn+e#I-)^^d1@*V|;K@H}Lit^1|jE_1-bSaGvN?qwCbyXKl(24z%M;%r)+eG{ZjXL)_qDub?CO2Ti*M)z2K3NS`fHUr_A_*U*&FMy?jv^cg2#Ky+E8oiU3y!O z>!cp{^3C-=z~8U$nfUM4=jxfoz%!aP?D%)z&)4fJzgYin1Rq{wiQhXX<~cmmmG_zY z{T6;-{jz#Zv^Y_R&W(H2(>)%2vzFECoWpf7{{_DE^i1DxmV2GgZx(m;^Z!QN;~hBe z|1YZP%6oM4HC?(Rc%Ltx&F7x`Y7acG_&)s5Ll2$aRNs^F9wfXL60fVmjDK6g8t+L$ z{s%tr0YC4-c+TQryhLa463kq`gzsNcUe=jkOdoz$px?Pzx6MB8i@)uS zZ@yq4w|p;oacONluVEiGAV#?6A6)VwZ`I72fIqMkCtG-sv+|DXt^s_&x6Wl>xv-{QVo@l+Ec$Z!N;@bUL36#wvoeonc9rQeD>zW zd>=1ff9(=IA4t&0GfQkQpRt)0CC@sO_*-<0- z(lhtFa-<_ZVXPeciB~buOs$yZ%Y9!u+%xtAJr3u}*ZuMychUNUrJUAJPUv+UXY4)b zFCXma0rs`domzU8ADxP^ZL1G;tv(RX9K@XX&J&mFObw|ib7F{H7{UUVG~k@0iECgx zPJ8tw>)6YRo>hg3G+K z=c;Mv7Dr)Gk9vh1)f*j|lUwuXL+3_o*O=OnuN>&Qv)*_AwXgkg5ByB5`>^g=bklBa z$W`3Zi9MdziHF}uhmYF2A1l9ctSfhfdFch}NN(cBjI&Vup&#hqjN@81p3B%PZs~%K z%a}K?12eg`MtzrRoVu=CFP#S*_G7R2jAxz`YgK&54V|sQHpT4y>zILcOSU85VIN(Y zuf^VU?mfRUukY{Pw=3gssm{?W@{IjOoZa6wCpUNcVy^VR>7F;8{`imoxW~so{&C*f zVCC!F<@$Dh#NhQ>`0rt0e$BZ28sz6FxI5lUPcM0?`&pmsAz$Xb&-gq6jE?Wx5v5p`7hO zu;m{<=fd8(BOY4Yj#&Dfk2UHf2I?KS&9&<2IvYnm_KFzLP#A-M<8}-+nLC&rNBh(n ztxH?uvwgg?_A_El%V|qwa;`x)xwG{+<_|h<)X&URlrD*SGPe zdhO(lS!-YpEcPb*m-4;(cn#&(f%kP`e)OXsBNnu3pf{CMxzR7pIB%Ta-aFlU_>i;m z`WbMI+9yUB!4I$UE5;nOLx-`!&oz4&ENN0Ng9|-~9X&1#+F0B0lWXOrhKa|s1QvP( zE$$U!(<`1qILHfq;CDRc+Dn75!ZC4xuTin66MCc38f3E;;|qInHik7wC;ZZ^-dMkR z<{4q#wNjJocMqa%@-QBHqLX=xGks$Zf|;Ih4rg-IKXL)L`#!Wx8!)L)ePfNTL$v^3 zx#?GGPJg7$`NRhA95@&2vnKWwxa1!iyvKWc`MiDo8#RC9^xRj!dV1%(-gUbB?t4zJ ztoH=I^rg2m7x^5)hxXEd*L^(k_!Fm3f9BJtuNwn6c>UHZU->HE5Af?w%(L0>pl1x~ zP0nU_Ep0Py@1aXQ>GO|f;6XQHFV4c^ot`nwn>=F;oH>RL)nLBZ!<+q_FZu=-ViS{j z=8t~yK5o9LqcE?_zv!F!b3ODSFXLKnedAJkO!m7i;vh zh1}uqoPl|MheqxeH)?InVcTL|SK>IYK0!ycWR2HVee`1=) z`lHi_>NS$@uir7h``zz8J^Splr+2;U-SzwB-_ySn*T4TJC-Yao_O*I#$6LnpxHR-L zx}C}Grq@Y0XUy8a6mhmOXJ9N}VuH8!cwaNVZUIBs z%eQncKEyDtc%wzOib-A3Q2RZ0VJjyXn31nJxZNZAtfA}Ou~I{NvDH4bZuU`&@`AbQ zja{1J$1J_^bB?y=OT1&_XMYAq;@f|~h8?|azj0|ltUKmBK4)=uPB}04WA%S&T=gGp z(RQgHjq7`Wn6^dt1=}Ge_a7SYTIQ#pewzPw`;B^rzwyl)n9s&Hm+cr+d;GUAUUP~6 z4xVSXYF~F#e$@~yxvTKO#<878*>L~;OaM1A{cPLcKKD?2#rM5NEc>$h6+E0LFqsEF z-vRhrJN?+h4=mv+CuboH-4Ed`+=?L&xRe_lV2Uezz(ZW&b&l5QmvmS&>jFOZ!WXtU zsi$z56E5tHPrvh0^U`Cj)6ZPtNn?1VTRl6hQ3uY@xyWNJoZ(CD(B%Oe@~ktxNS)n- z#1JDnn4t@t8aYeaQ_qNzp2}-pt(ot;BMqu8x)6_b&yy4D={GN9eQxp(-Hw?(;oY@X zXO=@D@>_2+o5&b!rni~_g_Uk?*Z;MGB zWB0hkpU;X5&YW|$d(Mb&O{f9(4Am5@m2ZFL>D*J-z-0Z(UwH#><8&PGlIQ0IxwP5W zergOa@^OZ9A1rC2hHzrOuwK~1Z~m_H0uTEYyy#C{??wTbz~y83MQ)B${HL0!PrSm%>^HLuv0H3nX93A~rp2=49mvjJYqrTso5 zZur?iIq;o8M}2Tcj;gLt`QmrCN=eb`IgR0 z7|^9!7OwOxP07owUUv=b&7uFc?U=KseH|>$(BnFkf86i6$Jm_bCGL&qsIfTP@1Edi zOyEe@CEnFL#NzD5zwDjgeDK*n>WuF0f#Vl<<@EU;v~1Y+F?QE+sVA`EXWzHI?QQir zbZ@W!zWwCs6ZM&}_&$u!ufu!zvHo0r?gl=y4)X^-@In6UeSf_U3-4nfZhD28>mzsc z!>)mv**E53t-(6&3s(BWdkG)!Kl*K+va#36^I7Oj!ihY@jeYV)zY~Kw&$Dcm8~oyx zCeOf`HsrFd6-VvFgwHytUv;DxU6X4}f1@QD(i6_+mxjV)jnWhw`-8rCs9)6!YFYY& z8@=fl^H3vt#TmJ)mph(nntt|k)2TiP&uieCgEbgGF}fS#-0EPx(!r0F z%bcvY{HdQY=2tJkJN)cp?P+tp&Fi@20~c}3K`i{5b)L|t9Gz!kY;!JSfl;|{d+f2( z2kSk9_&NDc|MXiPe>&E%VL!*Ree+NLgs+Fj@3`>!&(zfVi-SDUrM~&xsaqOUgJS!h z*`NI}hIgW3+V6U19M@)l98pk?%-*K*O?kiV(nO)x&v)A1E7<1I*y*2Ey z3#aYTdXdj}pzqAkw#6&%43pTwKu!rP&ydc;x#S-> zwFlQFzCOnT$F%dF&iby2oq1S`bLxU_kM!v{)4%KQoRK^0!RJQecgcVHt#6&a<$>oH z>p%IEKjps-n>pILG630qi~@skq{&fqNErDt+TPip~3 z*91QCk~?}?1MI+YJ+!S{;@JjG#LT{C;-+R|46F_F+`j2UY;cVuu03z%z`lI4kNv=c zZyWZ-mY(SBR&4j=sLlP_IMEC83=OQqeYFN*u9&Xja0bFgf7O?5AKXy~alLQMoY&A5 zoUJzF^_?b8ops}l8cOHOU-5FjS69#8w@=^tc8z*&@gAdhyyG4G3>>_70sjs>d2m&<2hj&VaHU0cDTW$dN4{1p z-O5w1R6}|aEcjZ#@zp2W-Lo0LdRZ~-P3dHua+L2LQQN8mI7?@^k&k+igF1n`_Nzwu z>2qA`LOigk2f4x#rfLrk?~!$1JRj6j`N!S}U%JE--O}6Ip$!|-po2$GvmxgUUW^{#r4Wp?}GvR?%Vy2WA6{^LocE$^AUI1!+p)nx^`Wi-!8@d43n;OV6PvdA52E|5-k2+3P*KC(hY)5O3zq^?5Bv%ts!1 zEo+EwFJ=0mb@Vyw=_&4N<_b2t=#Lc$JTbn2&Z`mf8vDcxPvBPmJb|NANgiI z<`BMXAP4HG_)S}Iz$Glqz(y=}Fc*Fg`o@0K2fKLE7tGPz^M+}jP4|v3EmM!`AU3gf zj5E$F`GT2z&Af}wVIOO)J}+IY1u=~CIiP3mTl|^R5AM+uU^3U(Uay*f4ZLuSxzBs? z5ue&7`Gj|-giKkrNlV|`}@DkH=bc0tTdZK}K6U+6vj`(vYxi@EONWY26dZ1l6 z(ge=b3ZH9r%Z37-W&@!nmpvy@Lg)cIM0ayKQn7U9lsstJ;?q1&GqK0v%AU;P1pI(HUBzV4|V<~?gpQqrRA)KTjJRD z;q_Md9Opm#?w|L-`wsAZ6h8KB;K#Q2sxT`Sub~!BeLW~VynjD`D|nAzwZx9!j{yVo zE9>jPoE1}A__afEwAEgD`nrNVd<{{qeXyYp#vXj&3#R#zPafEV4@_V%MqF7-+a3!W zbr};Jsfj*ghiCb~AuiTHPHRq%vE>)9YDS!5#WB`X57*^OJ*gL3nUDHiD{RnCZrD{9 zYx8>5FYU8-lvR?2nJMn;% zUT}^25sx{z!9c8RskQs$`qOjRyEoRIKDGwLq$YDVFZem|cer0!f8+D@_3uI-ufL0e zzoYQQ`rOFp_<3{>*6*X(OU9x$*W;R`^A+_O0C%2#w?1?Bi}l&=`1_*#J1m96eAE>E ztXVkZFK+4ZY`uz4FX3}<8%sXam;Q52eD#w#(CJ+E3_VFL#~D~0>Ra-42H^4euomHV zUB;r8)+DafLcH=FbB_Mzh4#jBo!m=bIb!6XUu^4ShD|M?CnVM|;#~ zJ9D+)`z62bp=+?7^jddP*b9GQQ!9Hfor(z;FsqK}-1@a+B!+#fxbzQp-f`NHW9)6t z*_Y28tSR-!<{s%e4hMAad0S2HhxDiq>>=)QdIc@!AU0~QfxjCFy?77*efQsAuaA77 zzVE)}^kBVj2>)ID)`uVFXItH0-;3eHYbP~h?NNVY0kIF(XXgOp-rC=L-@W{ICwwjz zIGU3hq$T}>F6n@l>&KOG{(FabFY}cc*ZC$d(l2Kb%3^B<7 zNiOE^*3ZtEk%!k}rVh-TzVwH4Y2kB$Ikm}#z5XU?V$@&sW%WjRicP*}_Q8HU>&PoE z#`ay8{gw1%U4E>??Hu+Kc%7fM@Vf8JlRk1GA9=uy53_5Q9emQU^tpzLZSLrzO$FDpxjEb$ z@Rpx_B&YVODfx-mHnO!GG*w=R`kZyw02$>fHIHd+{CXh=yf%eqq8!JL??$oWjs^wsMxH3p%Gh^s>*wT8Ix^;ROp? z@HbEJ`LFMK*E>(Y_uk(-z3=_+KfUjL@8ftc=J&pjpCQY?r&4>o?)fkNvYu%VeBb@d zXFtOj##hXoKk&g1*5}T?mfYzRXK0*y@O8v`r0><*w;fuCe%l#~^@vM-6Q|c_apFNf z`tYji$I74U$-UdD%ec{zS(+1%UJsmE57&yDIUPUp&iXKX)Xsf4!MCp)ll@+LV8?w( z{gdao=6>?dHEKCv1#{~QW5loCD-U{s&%4RKAO^Z*Z>*tp*@VY^GG*?J!menhHI#_{5_PTwW?bhoSp`@%|1eFjr2v4syU(qo+L86*9|5`N;z zftcJ0aFW+Gkk2(>-FJQI3kK${(Q&F@__`0!r@C~G3x_?h7R5q~{PG!}wqOF!7|{m| z4%dKtg8ksl9yazC=ioeYau1(!*}JTZCpA;2V^>ds746VxjKbGid+LdeG2&By!~spS zuQ|i?F8Z}!JgQGM_nKJH0K0IZS$8Y*Z&;Wx9ZbRKh5_S;e8C>uV*&nFY9M!{M}!Cz7>9cjvX_e zZ~Scik&k?Ye>VlcvjWEr>&Mq#+~3!{y58qdeO+DC8jo>E+^siiMYAwO48G4AZX2seUzcIlTEafe}Rqw)w zhUBm}z%yp*4jyOl&>wBV-+2{lA2H=m?dr{}!8*d7-ne&X+K7pBjb7!a=G2fgNDc7w zoSoNq$QpIVz*4`}A8<%(<7ChNDR$*9EzvhQqmec7ywDr;%Dl!V9_lY`;uUVkvRCl0 z-cl#A+?TFPdvcTwe;?%|AO7&^+x0r=AN=44r|;L8GhT=BOnqh@{?6c=>OFx^KJ{e1 zKI6NLLu^KJ{2K)J@O2D|J{04@t#6_-^CiAfrX!=JBPXT%p)Gp{tvarbA87hZ}6R8nr5%@Y*cZ61NTfMT zP7{Bua}Ilbzz!FBI@Zh``{wmod$02uw$dS6ax+&<>q*SW3*N||=X=Ie@vOV^fF-W8 zSl80MM6UDB&MNlG0Y2Vi@WXoc@N+QMZ-2+z>vhZ@JN@vlen|TdfB08p9ox;#ci(-t z?_7F>xkmR18l(eybC)?E>^Xnd1s{7MJoO28N;f=8V%5=9e#X;#RML0sYd3HEU;2 zfh#T2C7kY!W8_;HeK(CsO~By*pZX(v_>nIR*4la!5AM+~_XTya$Ae2}3EhPkKYQg^ zuGbln7qLU5YOEOA!3{iVNpGbyx`Ay>#MPiKuEm>t=9!P@f>`V`M(yk+`T`u->5Eo# z(Ehr5{l-^MfA9w%=jSzt>%H~wNk9CnzdHR@4a`|%KgYCZop{V|slV@iuFti*#?}{| z|5@|w#et*m&cXg4)pmw^rUAVeXXN!+-WGE?XW_`-_j}6)*X8_6oR@6J{PUR0_)Fh; zy*K9zZsr@{ob`H-Ki6IUk#o_1*2^8U>nNOS^9N7o+ywR!6Q8YdPyM|V{(aDq|DN}} zXM0Zn>PJ61T{-YfU*X65i*HWf>-cZQihW&u4sDIsmd%>*@5uOU+Sl0@JK|uAPdUoP zIwSFnrCnI^k25gO(T@Jm1`QnHL@w4I-9yzQKH)Pj^(3b?8mIQ)V!e!++Mpp=i+}Hp z?C1w$sau-WtMF(Rk7I$2+N?qAKZsR+Ld(^oGd*ME#25QRe`0c!)3)-76SgFS~Ag1%B zjc3yN=Bk+2*T3(wCe(!-=&5nnU3Z`G_dxL;1pFTA$tR!WfB*jIumAd#f&adJPkn9{ zUiJ3zOL5;GH&4?il;)+O~D&agRA`)X!M>?6)mn@5>~XP2e{eI$Uo-Eu z_o;jIcK0VwIP3XvU;3UUZsI#h-R{wM4h)M;>|f^rIjB z_35ww`o}de|MdyB$@4(H$3cF?XgvDpqk6`m-5SN`UgUi0>j+*eLSMZfN;7O;Q^)I1 zujlMI+ZY>raB603V+w!ePh8+-pIPz3hE4XBFMParYsExY*}~g-i5oHSQ77txUoqg& zUa{e%t@+H)*kE3mTgMR#`|xJ%o~4&Jn4yQ-21m5!OnQ%)5!XGlt>eJC+4jE8z7T`4 zt8d|*bL-sdshsFJ&NHt1y=j}itml~o%V*g-MojZoey}yC*33AU<8ZALuW^zW&DhKK z`}JCmAOHBrJ@6Shzz#oo3iB)V-oqdN_-{JyQ=j_OK|?r}F8mCD=Kxrov2Gje-m{kM z3x{#oq<+`OTA|6hat_hgb)?75Yb~3es*`nVX06P# zhVB=7yZVcq)knp0-&&&&xay^H3S;sUbNJD>wgm&a9m8C#%V!Prffu$hre4;?80AK* z>Q!HI2iad}0GD~F$r@BQbc(O}okLy7tDkFyr8#!tx*pal|Hta@fc{NAml=4yhR(FG z!d3B~{`6-~fAcr>{Ca$>-qXLZr3-nnrB}oN&Tq&6gFWzl{O#GEoo$}=|LlAJ2$$aUZF_2RvgguIn>s-;lGduPbkOeeG+0ea-kfgVFwqlfQh3 zLk!1w_8p%bU}a5y>}$Nfc!_Teal*IbBA2${GEW-Gzu^SC=B+009V;KS%bq%fm)h-z zR$@ih%&9dn-HTak*Vr76HD2dcK6qKDdAc{VHu3-?`m#nZZ8KM&8|>DnTHSMF8C5@!{|c{orX0h=a{}@w1+A zC};5qm$kF+z!P7eUE##0JntC~E@O0@_-QA%bm4vbKdS$x{hPn7XZUY_!hz3r|DE4? zXT5*_!FqkxGpFy==V<+H`7scO`Qf*|wfS{t(OYXoPry4zY@X4N__anpYQXT?G3@7v zPu`q!X1ZU%-Z8e=YkaMt_@XhheCX@K-n1i!zU5~<)NWh)aMXaj^6gye(X{cbCmz@C z+hL8onHw#;edua!3vcFUof-YenlsN%n!De|Jf2~CsQg*G^`sWwDPSt5aoZohLtgh% z&q4B{m;0_)x$UFfc;l>n`uO;|^l0riGb1623Ro>$KibpPPpnui1+Ij?#k9 z)6}hi$*758ya3)rC*UWP{U>|EH2XrNV(~n;1EP2+gt8C2CJo$-l zpY*5S;@E3)e&de%S*L1Snxkj&M}KgelRa77Q{$EE?t!(Y4q`2B>=pY|I*@Z*U%|b4 z87$?ucI250nD409W#Re!$xr_7^pn4QLX0M+Kw|*QjZrGb+{N%9Sjc@w1zEIbB4s>3p^*Udj12~#TvCUC-t#^$0 zGow#fzwypD@^fK-`qO%5uNa@H_Zcp}8=n{S;pcPYaGhGc7nXHb9R3zD;yFd2t~_W$zWc%)_>rre+zZAemh*_i9z7vP%{WtH3AgbE=IW<;tdBJ@Ul{6x`k}Lz zHrlBhdvI#*`vE-bNbHP>*0bD!sdKPCV38wy))(%sy?DuuJokbzs6kk&(YWC2z8rEo zUb(7gVj3@+!&`WWRo&1N?Xu}?5L5Y%qYZjFoDUpgn$tL|KKU00dV*Ns3WImnb%;Zn zv2JX0MuYI|H$QC3NiDz$*W`s?G2QRrr`FQ;<@#*spZ@*d-*Eh4{f)vq>;1&+3+ke7 z@Tor5Y8_a!rqq_1yzrsFSHxWF8#&;(isuq`YaSSv;%>=yT^)-@z0yAG%ug&)?DA;Vb=^> z?Q7hLbHtvnAicNJ@jN?*6bCSy##_67zlerZ)YflVx^yDrv5 zjg`ZCR&4lS2ad3kk9hEe3;pmKnq%i0xrj%MM>t(;usaWa`*bEFzw9f{dZ7_xhkAbJ!25td zTYncApVxtB`yc+{XYI%Pl+s(?5BGs*(mhvy;zy6v$Jjli@2K}|tR7F_#aLjYpTy8C zEoG=K}XZ)1DLjg@wB_HMS1oL>IKIb?eJLn7W$Z9Kp}**yzgLR0zb_`u3guIl0$q&{d0fAj^{^I1G|a;H*DW^l#_zST>7uFlVX_A?DW zqdz-+v|f|-rZ?Tw8u0!3XXRs@XS{zfJ>b`e!tC0kHQMX*J-Sw|?>gNDAJ#SS`5*M# z*Rglrr5NI9&Di?+9Wlhn%=sNei2J2#7LtpY@*DQVE zOw3)-1WsTz9{M%x)a0I(9iNW`t=-e+c8+s*-SGwIFn5pA=fs<5(*V7QTQRCZn6X1A zH1zp^!`fB9YT0#K7xAsdINeWTiktYXKU%E8`BN7)Lj!9`U6nVv=sWbFb6iXBl}lZ= zrIyU%0w?q#9&>PFv*vIkrZp*^Ipu%f``%yAbc{fPfyeTHl> zqAB;N?dUUc&>O7L2Wg3Ro+aYwSG?k?2ImW7>>b+}*&CntB)qV37@M)PU-2*e#y#*) z9GyLMqu0O&j`~l2*oLmYrxi#1^5sl4uUzbfX&Yl54^2F81DJ|Xe*r7FjiMC*K zUwOnczhj!uxjL6{ASd<1CJfc+7}~5Gu_Hcug2}mST76)jQ+wqrFWl+H>ft<(^cS{X zgJbaM&J4Y?R`7WQS7$7JeOA#obHT}aSN+mp?e+yfv5avqd9RF_^GOds`N>b7@Lc}m zKmMEppJzu5;;LRekKe4n_p2Die(6hJRu9t$$BS$91~t`t7VoOhy;P4b%$x7-di~~w z7~NCHG1l?B9|5fU)7N*v5?iIH%s&xnKFwM!gk7ye(GuqwmS^HFsgo^*pcL zzV6zxOH1zuKD8b9;M#2GwFv9n4!q`JA6(nn{kp6PpY{BYKmYmZ=N>=(`@h${-}Ky7 z?=k!lV-owxPkxGVcy07n)0T&4vHTg<%35vXGgCRN0W*j4V8ipo{5)5{=fHEehWfC$ zwtj_+{XqQj=)L^G zh7X*V0cS?Kd;uGkSG1@pqr@xt8bF@zz;g$A3NU^_s53{jc`jbA$f< zSL?ZTzW+|W{!M7vF|NO7cppB#r~Xqtn;Cdc@%hjA`)3&V-W*@%o4Vuo)LGPL_&|?_ z*R;cyea#iuvE@$q8v0*PNQ81vdCvOJY+i_8!tF-DmxnJ*ar~1e&dtvue1=MPBtF^>mM; z0Xhc{b=5w)Qgiy4Sk|}k8wdS|R?mo!ZuKR8_s3@f9%5sUT<%>b@qnou_%}VN1#ze) z`P>6n*y1oo_@WOOup!qttlc`INA)B&SkNPV(FUBYZs5~~*>#am`?uBi-+%h&f9~+Cb*_tV{DbFw$7Cuf-A=Dk z1LmxEOmH3fj(hPfeb`@)nfA+k(SCJ)@^-%DdG7vc&m7u<>*sKsYuCNSAs;yz6W>_P zb@%CsC!VNh^B1=~@Hc?LzjTIo=&xt|p86Zac-G%ku^7~BJAC(KT|cjPTx^KvI=PM? zeqq9nd=0FVM~=x&%-~eKHQ{e1FFoL0KGgvKst0T6jcuzd`k=!()I&^g2RnY$2OIXw zrkcblyJHH!du9F9gEhFDSGcl8tMF3yRx@iVj^Ja4%_B8xuR4GoKW1`u{Hg_KliC!A zd~4k>R-CX7d*|q^i`%)g{`4_Ac}~cSF6JzL>e>3P*w*V@=KJi(0UY{-)%ACbdXpYy zPJe}GUE#nCTxbOj*2ZH$YTdd@^P_Kj8~^R-pMUW$r|ZTq4*mz~Z+er*e85b<$YXxq zCF&SjdJh|F*Q`4%y}?!uhqzG_^T8bq&yC6bp%-P7KV0em#7W<#&FjI3Ggw^VL7eQ} zbLbd7(R#*9!@>#|Vtl5qEj?q8z(4hj7~L`9DAt(npYHSIskQ5&j)AMQai78gf9iK_ zJcqeXY|ZIK^anF%2hNO+VZQpr8jP1`Y1SSb-ucqjKG&grVZmpdm4iO`JXn|d63(e> z%Q<2b!#LqcKQg($K@=SZJF~9juZ!R3I>94=z()~#uacp;9=Y+$vINyAF^OkG=$u%%rXW6J{ zXpqL_V}_0zz|S~nSo%k7$CNhk9P8Nhy4G-Qx#CWp&2@-fHK`Z9Zyw-;NA<0q4SUxJ z-5MKbVJI*2!g}+DFHG2)r?n_&ovHcTk9~&wj-IrC&^qyxZ8~T-VW-j-@OFl4a&DwMh>hU4pd0Xw{+>YFgtDHVB zugOa;@k__jljoaw?CIX`#jl=Zuf7k=)DzvD2bTBJBP?lwW@9G@Gw_D))TjK^3H-`6 zxB99(i@O_qtsPgf;ZyC2cP+lJx%*<&O`b&?jF>B!Y{&f9KrMK2+=LEaCQ5);?8D#(Fd&j-d`rdore7YC@ z%#NjvYv)|)H`j(8+i^bdHzw@ESN7g>y>Oy+_6*v&_blxT4|~*kmUFZrZses5F0IXP27WS+m<%?C-#W1pUcE?uXG=Bn}68P>jOq`q%+*e@7@q& z@+4=@TF-o9r*`1E{vB5}b>55z@3uF`uxf2Ij6>T1zl9v*y+B^zJ?H zc~AX({EL28^UP}gH`@R4=RfDOemnzdEgj+D84g|8+ZI0QON{j6XL7`8MvqoKz=j?9 zT`O#?J$Z_04EWF|;AW;q?9l`Gga=GvgI_k*LpyB2%Guc#?DQ3Jj2(FPQMdinlr?qw zOp;%`I#+32TC6wPF{39QsudcS-t;IntU7^>d~qa>y&-=zXeMU&13HwSS)AggUeq;k z+D5y0)pzx*dD#Quw^nKtU-}YWVYudKI*Uh-(38XgAL|;_qdon|rOmor!_*=y=t*AI z;@G)>7cRtWkC^lfHsV{0&cuH9V_~Rn;k@;sx1PT7jc=a*^y7*xsU7nkUxFL{q)t(>WZ!Tin#l>_=%m|X~X(pFWmd4ZR44- zS|9n&_Q}tD(5LtdScpI79QTb?`B(am^j$e899)G6{&+)$< z?AYUPuUynVdWe5x;;83B&#U*bbFSVX$9+>>dmMeEkBs5oy>9Y`5w5D&+N$!e+PeZ(YN7=*Fo|?56zUzb@4(I`&bz&WS)+bk!$R0V= zW=*s^#vH0a{?shY`}p(lzt(@>{_0o1s^?S#pJDgm`n%uv-G5)b&*%duyk{T&48-Ac zXV+O-Lu*G}s!4VKcKzEv{Pqs~XWRjP|K+p!@26k<;$KdGR)5F);fEg{U(fD4y{-O@ z_^V(2Du2KAt6%+lJ;(pP`LEJ-|9$uKYXH6u+>ft2m}?;Z{`&Xh`^JDDw)pR>T<(E^ zT;>~(`|`)0nb^iHTlj$!jM$pnaj=71v5D8r9C8>tagDp|&@C?MPwmhu4#cV#(2yFI ze`s($^0^1l!93;CM?J;_Km4$PlNeg3r{p(I)`^ogX+(ZBX03SCD4vc-EciUs2las1 z)|34E(Qm|}hw%{ucIPo>_z}l=@SDrIw9}^ioP+F$7a!_b8i1$13DH z3^33?Xr8+7tIu@*9ey6=ztr!kSI>bNJ+pVfxY?mPsny(TeZVNLb6n&bBl$I}jy2D` z_@?cK>&e|UtLK+<&oxQsw7Z^(9qk9(&T#=__Tbvw^l)M5e#U-T)8y~|UBz>io#!)n zDz34n&-oX9j9c2F>n!eC{*{Zo&PC3pyi2yJbz1{_;m@Ak^!h5k3--q!f1K|xYU~R! z?JJ!R)$hAL{pnAirj6^1c@OMy4`5&8f%{MRn}&D|*Zr{7o*1=%z&^x1P(BR!xWy(!_OM*pYh09 zBlQ}KwZJC3;32P;kNV0+-e?{A%DyxqP6IWj=hS#9-~A#laKhz&a&Mfj({Vaq zY3(?2z?R-Yi*OUq-jg?ds2Q~~N4dxs#{TCny5A+ldVoKCT%(7^qF(LEhd9`r zgIR0WV2$ku2Qkb~&dQ-4*I-Q5WZt0-v8Y}Bi5B$%I=4Pp58^eT7Xw_tQ9RbEx&6da zEOD9VIP)l0wmk;=tTB9N`3oz#)KhWX=S)W)dpGvrM=b0*&tT5J#CCZOclQAJm-^8* z)fMhF+n%^+^H~K`wMEOqVlTH`*WfT5e^1$bZXQR-No^{q9;l#_Tm>%Knz@k9^2sUUDC(SdE+)_QWeJ{C+%k%-mB4 za1@vP<_tfz1Yhy0L6}&R3o~PFFYVG`zODs+kAdC#qLsLdgZ|)S4jyzeHaze_lkBR` zH8Njus<-foRsPKEoAzB7Y|I_;?qk=OybH7X?|zU6Yhmdu)_&HxVUvHagLSqYzB$l4 z3~RS9HSMv^Ggi(qGw<4whv&5SBV6D>UC|F6xmP@^;~5t=bEr3(E64WMYE0oS%$%Jt zR7?7+a}&OFNE>@|#HUX5%No)<#DSaqn$;8AYzLR(G7rD=k9pV!TWjP-L;0YoV(9Za z@tnKY3upP4j+{aIPuvYpu~ScQU|ZUTrpk{l*4}vL^?t=z;}%!3*tZQa$X5?qZ)*VO zxmM|0IK4-IH*Da~dcb21h;3fQA$MVkH+aaKzN|58?Re`|KVvg~^ikvV9o9K#Vukk* z6P~UY{>09@RcFpObM$lH7_;Bus~P?pISZXr_{6#4vA3x?IKa@F&m-{^lU&SM&%2er z@hq(7t60RSrf6C<1d}ybU)OI9+;fe5)DWD)20nX|_3FWn@0ie_Mv=^Hh#_^E?60;}_8 z|B$oymbv7SJ^RM#`0__r*?8tdkMeLH?iXgnRZPdyCf&LN!bH6q(#`sjXMAF0Pki~> zUN)X1^f|6Es2}m^<;W$LYXQdC2S@ir`f_Kei?QLgZrj2|eZY;TXi1#=LqBcOqIl~a zb@yF`4e^bmnvkdAnr5zJQ$za2S{#?2O&{;9dzXHPN4e73am6E@?(^VPzT;;N%t@c% zxBl6m#8XSo8F6D&%+#*)RG-*W^ncXSbwHyvbWgh{vkquOEM~7~Txy-RSquFG!||%u z+N>kmb6(O_xykXo^*WjoV;y;>rMY<0vj-nKJv6jpjlU_JbAGVa^m|t9L+yX4-W#RZ zntNUOwVt>S7SF`YdgUVryo!T;^UZwdof;4NiEV#tu>SD&OwH21^DQkiw(&MS(Tp68 z^a=CIxq#W)je-5><3r&&){A}H)a#BN8n&}+Ek2v%XFhP}EK<{&rFHSAX4ntd2hQ|E zT8%?q)iZmQdN5}V4J*c6v5me-`@jds#j#=*uAYIpU%ZJIH~Z`UUDa#xCU4h|9*U>@ zXZqb&*vA<$-g)dz`N7Tm%Qg105tFgY7M+Yi?+*EVcENWMQ##3qb4f1msrKrX_@T8m zBF6f{!EQg z?d3!7fbU@q^ZRWZlpeA>+Ga8=eYEgy)_JtWg`~n=vOV$ z18(JtSMk77z19v*upN38e&&`xd(IWRFoeVYvIpK1GuZAU@{U-uuk-~wI+1(eK%9r} zQ}k8bz?Vkj*seMq9~*nHI8sZni31I9tvn3Ynfa}4!+Ve0=Q!CaX87m3-Y zj$7yN9)3mc-Utsk3ro4&Q)6Ne__LPLUt%@q&{6T!Zy)aK#%X_a5(gZ74vHIj zekNe!nzq;xV>^1`SjBlyo3O;69B4@lIHg;)ptr*Y43C@#&yn>6&*u?7o=y4Cr>?_V zM@+QpER6wf<~i4EX>jeqga+e*r(?ihcJ|h>;F^3}-$xAl;(Xx&t9Uot+%HY7CFf{O zTYb=L&D6-fYUUYvFYW4~;=w6i)-h|$nsrDIV+*TwGuK+(Yr<(w%}PC;>)gk<{DiC&z?Txr3U+RpK_i#)2_wZxJNEWdg9*Ou6m?1IKfXp zSdZ(UG2v66QJ-skxHvG102X6r5+dM6#SFHOQ>EaQYvu4oIt zF@mErsQA)EjhI=R^hzgcS(>xvSu)nON8^F3?*X{&>zc_cyXteD)H!O8F7yLDL$7+4 zel49mZ^nifv-5#(UwBh1>nBfoAWWTM<#o;Sr#|&kxacQ)ide6O54*Xm7vYi?oWa2N zTD7JZh>;%R5I;59NBj{79uCD#eqq3G-DmS7?9;=Kc!vLx#17lYdt|KBQ_Q>lklUES zzHUC`KCFH4k25u#;U6)sK+)xaxa)eoPmux%z;?ts;|TbR&z@u?~3j0 z!^m5jg`0cQn$cUvheLIxK57BBW2gr;S|j74$F)eGaIuyq;{%KN=wZbmXU?wwOeZy% z*Lu|J^hi8QS2TtLe2(>;8oSTXWj)cZT5JZ~Uq+{Z=2)1H^iEpLyQFA%}WIZrD5C{N!0$x^IqMJ&*?BfOFK-+F_Ia z^e?rGS9$TV9-m8k!#HwVD{BxYwV=+y!5%!iIMtI|*+1$&X1zo5|f)~3u7(?{kY4sX z`e!}H2WCbzvEJmT4(p(vjl=qZT`^q)>T15_OTD|k@-u&FiKhP(^E&Ta)w9m&|Ag+V zIsd!ry4C*vHvZ}}{*U$M*T3^S@7vy{eP;Zv7LNLQKwItKhV`Sd*WNjg!d63m;9y_# z=0~niW3@xF*%uQpYp8{e9%X2#)wv6!rne&j)EIpVWl_={T@+PCJ)PahO7%=D)@h^?Nf$JSzg=CWUjG0wm5ruH}bE$zjIu|itWaj!Mdq>{u9nD{5Lc28Xr61?~`)W z`96j-ek^roeyr>m^7WecK|b)(j@%mfn@zL@3pQd1=P}v`ru|C`G$}`O@`WE8;-QP$ z3ST;)TlwsVV~~?NnU`E@K~CY2(|D)>F_;^Bt*HU=9+L~Ta?cq!OB3}nCs^W04Z#bB zdL@0)sQQwhy2K+K>0-P!O#IlXrTnZhwN7nV`<%gvIPTFC)Pyl=q-NU8&)!M9daHcm zIA8Ul7R60W`pl91_^G{osv&cF;F^p%IfA)t(6o=m0X$$C-&*MJUZB>I@0!&o5LBDZ}G)8&)`3>E=^l~7xb(;e?#1dK3wL1{PcKf;duO5-{bz;AwTpz z{#eB$t_IeRVb8htw81A#_!Osj<;xGd{40O?6EFUWFFxxj9`=k_;1^%8rN=SUxo}Z0 zb72n-Y{0TM)=B?}O|MX!<69qXzzc?E;IEiySHC8g&fz>Zx#EK#dQung%n5D9-Dk-< z{NhL~XY(ot+SOm_ zb3A)tU-t=o;>4`;KH{S<)<)f^-}uQ*J+Y^r?19~}OAomn8}8hZ6^|Z68+2GN_rQ^s z>6>Vr5ht)pjYx+?Yz7kwDovtIK7JDNIg`X|;}FD%(|KbHLx z#tDx3%_u*kL0kY~t8!SM1_Q zuJf2LeD&HG)~K3PkNS_;QEzInZuNiFzsD*!XUh7anRw#WnV|=Xg--d@cj#A-l&_w~ zr(UPVU`ubb%vn7~oG`mj=8O*BMfX`T;FV6@DX*DltoS{P<8scdo1C3Hcxc=AJnN1v zY}T=~@V-rdt(Bv`9&2bk&sf2=b$Zm;6INM=D8g@F7cUr zXq4`XWew5hT*M`|Yl}~F*WJ2vA1~;gSb5GmFWlG7N1aojb=?x)^%`;3TW>f0=QsrgB)pF|$85pQ1lz%PzyVmxf{ThGiPzkS5*Sm8jo;(?L%UZ*%!i#Vby z7?_tfaRx&*Elq<1wOUW=>KQ%`#2dToP_4=>KkPF$d-p?iNe?mE!-W}6XygEv*Xhsf z^BIO~kcQ}XZO{%qi6O3fpq?OZ)fk@cGwT|d#8N)b6K96|(t6zs_RKX?!_pyM=kUz6 zCI;}q3BA^?wfEF&zqKJ=^`$P=LtVyNy@~d41PgVD16aZvd*iHorrOx2$&X$bNA&;~ zHqDCn8g|#oI~IP&^IVXJnwhWOsNRVOdt%ny`JKCbD}Lqf@yFN|*SXYHJu>&T`CWr> z^GvW7>kCfsdyn%#kGsa~hs|0T(_HrV{!mld7f1On#4Vl3U3ki?Jur~B02WsI75EjkayNp#Q+NV}>tUYvy?@zTh3_9mjndy5LWap1DIG z&-w~Z>tQdWEn3z-xEJqaa5D$UfA4Ml)KC1?7xl+| zpnk87+y3;ZXVo(MJNaW@`mDL~S;K~-eyLCJ3wxiX3%Kb)^SSTp+tQ_c=ds`8%+SB^ zAb*|*YNvnoi9O^w0dH}%2KP&~4gajO@`wZ8UaMYc&6vH*y7f>)dSE8b|jFwIA%+*BlP&oq1RzF0uAS+aAB-#05=DW5?pI z5O@0OOb72;L-PTLdS)(S5|?$&2hF`Ff8`(jm$bshxWy-J*vp4=?Ao?P)|rpz2h6K{TMaqioVCxkb6qc=BgRTk z{Fzr@Rl`|LQxCYhf9cuE1Lk%wFU3Cn^y%rRk&{{ZPt*Ri&e?v&jJS%C-po&(o@U+2 ziyd=D;S+Dn?$xXvIM4+hi02*{$mKqGwnhJlUwEaN{HQH?TE{Nkun9jJ$!~pIZHe;? z91ivbJ@UT!z$^U5WK4P{J&I9Ho2JSQ2V%4ybN47X;9uBWqj%7d8EfjcoqOf1T7{E5 z)g|7x88i1NcJ>-I4sFE6o*II!n5Wpgqdvz*vuEi`Ec#^(_B;5{soKPsI>%X*fA={C zS~$d^vz=HALw9O$xgYEU`4ekQ`eg$y;&>-qKlPwTurt=YSu;+(i$D2u=2=xNZ8&GI zJBDXJ?b4BZ#&~M5?o0X9vh+7L?5M#xIv?AtMg2t`))0Hm@$r5R-oys4dzF}AVQ(D7 zsFqpl@&`+E#RB7i!@7?4aC%-itL|g{+QYxcBzNO2T-Y;$)ich9+_{&B`m8H`Xbxk_ zUKoudE@F25;c!p72gB}KCVn*P*+4FyqtVyKnVMHjurddaeM@f5XZIsDbB0Fg%w5d9 z*Elt-wPI(Tt3P^XgAF^h*M4Yf?beHZ+pO!EXBHndJ@d@z8EVh`H21P${fy7t_R6Pk z!$Hi7dpa@h4KP+tt=pfRIcpt$U_D(LITs%6`1|JK5N_AhxX3}B1B-jr&YBQAaLHl4 z%!9A>TLbsduNn}S{_Hh|UwpyAy!x>7vo83f8~P@{xrK%L(}QS}u8qSrhf{dUBM$1A znj9Yt*5sJ*M$?Lc&VlI~5*Pd#6JL5hW6t{M9vsgk^+%WP1NyBqk@oC8kNT8{-pR-P z=$ABBUEznXV~0I=tb9DXK9|uG<2DvB(O28M{@x>39K56Cz+QIUzqL*;QgdsEru2h& z;#6GlmzLmiHkWiDPeZzE-8ERprFe25@v}E3`wK0Tqhgqw81Q+ZrqpFk>Yrkx553lT zU^ad@=tI1G!Aow}Y7FLgtm_T8?aB>aw60kCiy!mikw)qd9{Le3>a7^&85^2nM-JDA zT7ngv!+z&SZg9li{LVY>SKpMU+MvtYp{aGHUh6lPG$7vm&E@?upJ$O+U{x+{UJo4U z3GWe4oQavekCx0jci^D5aAOu{_hHsM;)H|PgO+H0c4A()e)jZ?W1mg#Gq62-dKPmH z**%vXHsvUeXWY5w8vM+!J@Ggn^#BvL;10j@q9s~;Hg7aW%W;1hKfHr);<46qUpSy) z@@T!{v(L=>8sFT;c($=t{>2(`F3EAvu&1V}H@1o)f9HTVXF2t+ULZbWYVIB$&PnxE z{@|CbbPXNdFUNI^_27(SV@)%6_@W=NeJ{|95ieirLw|rR{BY2Q9Orc(flFI@k{PjB zX8_mZ0ylgU^ZNb>vvn8Gv*4n>tTC%*&e7sn#Va=YVQV|}2y@w1yfB5Yvnn5Y28`6) z{J_ajox)U))a&v$r(%gU^s?UI8*kSJZ1Y^if?jDp!$uy@95qCv=G2E8*em)E8Vfgf zWMPL3IPQ&exu+KOfY|6;_e{Aw)97+vm8)23vKGflhqby7;ZOWtqj}l8@K!$YhIZ^r z-|R#1Fvs3K9(q|<=NkK%(|hookLIF|)I9ZKJ@hul(j44irI)L&@CsM)=a_k}7oK9& z2jnK-_oDX9fhOxu?%UrE&bOc5ZoQe|m#_ScseRY<_N_;-FQ0304snn-_Tny#VGGw0 zM|<;ieCf>^v)9Mm)W~_nA%2gY_3XNm+wl`;)@2Qo6FIH3dVHPE#s}u5G4S8c^8%hQ zXD-)Ajg2=o)Eb)L8`#9`_=E3gpLs`|#6n~H=Gt|R8jii1bsc-MVujPO7d5%o>BG84 z=cT8dt*vyU*OQxj=fa+R>LLD!=UzPOwR{~*{<1kPSi;3K>G<^0^V_Ru!oZAt&9p-k zaHp-;sz)_AkC?%cUwBiu`Vmg{&AhGEdufOsV0g`1qBZ)g2Qko%-jDdpbs$%=Votmwj-Bk!5GvWy}&YWVxe{R+SjiV;|4;ZZ_cFfT^W^fumwRfKy zL-lst)=$-f+|>ug=PZLqKQs&-#4P^Q#xtiMc*30dt${d;yS2L)#OuC9&){)>_@zI5 z!qu6gKei8@$lK~DJoXnecrOj~6LxY}K5x`4{)$hkDWR+?G%IQC@Y%aNgpR zC+vNuzUIR>0}XzepJxYrX$ccvob5j~@pD;w&b}kf!Q8-x+rFYBpWE-$G^VuqwlQmS z@h;-QapHqvKk4bx13bcyJ#i(k@z4W?Uga%s0daa@J{ZJM3#_@Rk9>5*nR)hIHqYW( zwVI=OE1o&z4%_ENUq0krzGepTnt8F$HA|eoPha0xKZi&7oH%jcuk-iSD|8i`Grd$^ zoR|0w_nmgvMkj0Z?5T0!g|FuS{-Hm(g=tP>d7gaNJd0DSYRx13)Q^|D89?(n7F;jo z_npjLJmcGO@4Kg+8=vWYJOCGL*1>nLbqA@P*up{A^HSdPYd`Ayfg|_Yxbe`~gLi5A zp5iC?+#BNB4`+MaoNJ%CY>x0BtNlu|_!q~4OMl0jS>E`%;CMI1O<(?fet-Q=<=1?` z!3XZjHNe6n&)nN9afl-iJiKUStg*`HH%KgSjn%!g{-P}(;It>!s26zx5AHMC+q?GU zuomYEU+8W5*Ss~$L(6)+n|N@a;|+ZIpc#Ld)9EXBJTnJoW(Xh2#dmuH*P(;nrK`B+ zpqM>0w>8LNoV`hZeCxf0cf64ob8a7t({at!v*?(8^K6~?LO<*|`pH)f-(2!ugSUsw zNN)$2`ZE7oId80tBe!_MVI94p(Le80ywMY%d8=OYN1x|Del#=OiEHRd^V>D-BR$Zo zJ!7Bm2igCCu^&|Y2jABom>>LL_Nf6z`yW(3`< zPkiNXJzVQ@Ht+7G_79wgr_^c{7Cd(zpT(;dI??6&0(NnC%?qA#m%L-(z;7-1eYwBg z$KHn{Gr#1lGxHeytsnb8z1(mbw>i#z{FL72%xqJCJy-nHemoz1;pz3_mHa!l_v0;` zT9@~{W$@s4i8DXFlit@`z;77uKySeutcRxZdS5=9tKVF_x`tfj96aAM^S(#cU`EoG zKg}$6PLG&t)uo5@n_T-V9^_D)-1yK8CJs&Y6^wXLZywAeTzfX$&rCQ2)EFNRJ#X?| zw9rrYCBM|SC-z$Ttn_LR*h5S6L@oBft{AvWS9Ms`OMBv39>gPTJnWceV2{wSPIE&i z{nHzG<59ZTIkMLM#Tzi{SAMzYoWSKCe9oP9P2y_~(wM%&&3ghLX2d$pO?%CRGYzL_ zr+1+`&Hx<1cqZ}!F7ynX^3ri{sJYClb(?3^0{@PAu6vw+@D4qIV}I|gGxqyT95@&6 zHP3VBq4CZm#|!$~%egPE<{i&h{oPk`ShGJl&t4{X&L*{7%R|n<@BP$|KgQm<_rCGB zJg9qePrLShfA(bdgRqsDIoIeJ|+#3zs6pZA;(aCLr% zzf0)p6OZ^YJ7@rdy!O%5U9lcMjOA*)Jfb!n!70|9@DZQfk2m&5{&*T6^1iv#59*_( zJ-v4?6u0`;ysV#@dF}edIS25?gFUgY*=Hu1AMYZ%d#yU%4Lp_a^nkcI zHKXEY?DYN^a~`$syD{JhoRp`fhseRq>uh z$Hj9O7suPz-ElpSy~MwBd%rz9{_c*w^XjpG<)8QTjQ`|)=bd-OZN1jH=)d#smG5%i z_}*VIZ*WJN>zmfy;97gn2m6hkefMi`IcGiZdFl|q$2`s#v%ANd@8bE?Tzv$Wm7Y&e zceRgqSDc$;?_a#5=UVSxIMDCAm^pi|{wv>Syd}St>F9UmIDByys2yGE@qE!C7C3NeR+&rc zsp~vv4Gm+b*QzhB=m-a`6@&lQlU94@EW}F;?^N}=zs=*mtT$Tffj%%Ve9#Zhp5tM9 zkS=EcEI)g#J$lr9hO=k0xTj7&)O+;ZFFcSFacR&;c1ued}_r&?`yYI=THR!qa z@9{i2p1UTskE`k`4(xkVAKw3GS9@*$m;U4X%)8Gg*wnmseS^8amV+MVJ|28J|15s+ z|GWIWCC_;KFM2oE-_Kk2%(?#)HSe+Jz51PER+(3=e8&|>-WX`$oEqTYE8O|{?KnQ1 zh=W(Fc%lPN<+O?u9)g2E=CHyC&#F89m@Ds?yr?ODd^yucyn1DRxce=m=V(F~pLxW$ z^WviKu2IkET|M~Rd3YOLYPt9D$4j&aGd+ca>w{Ks@&F(FqPu33JEC@aW#8#D{m6IT zK~{My3^c%N4bH#zI;-E@N$#-w!+hJ=eTmhAumjHyGL@_J2`~aU3d=GYkl`S zcZOb;M)vV_=`*vHXZ6Z@;OnC{{f5(V=)z<3Yo9sFkL%4tJo|F(cYDq7yE%L}hyQ{% z@WUVe@YQ?u{qTqR{nnYj9mgJ+_ZEg&#gu!m>Wy(N_vsZ9| z-?}^B-pvyXSJ#Le{-C7~G4|wDdugZ_`-(2L?XmocODp|^7x?)19%uE4RlJQ!E?!$_ zaf2`X@muG_z=^%ishgPQrMTv$xn>^n4{wNL)ohR_Csuy&A)I;w4!P4`YSL?J#b<5K zCLX1$x{D9bCHJfzcU|V0wd%`Lv{A=1`m#^nJ>!bW*VLfLc;=q-s62SdAx>h9CC5X~ zoX~DPagZzbh8c#(TDb?!J3Q*U-wtZP>s4MA%bgyvJKPJgJKm1D*Ju2V+x)Mo!QDRN zd!xAL{6^UA3;Wl4^IWfW@%&HMzkxQmul(zLJ8SyXJfG*E_4MzG-`(e%c)F{Tr+=jv z{ZIb$z1?Z&|KRS;4gOg_Khk^ukv#o~clM)KKdLi6a{j2!esdkm`G?90KXpH1O>)ps z4t(N}E_itczP=ygD{Qai2an>xXB8Gcg^^ES(@*x`tQa*)6S}~3kIIGj$OVg)9I2Bh zaKN8x)Cc=#FT$!fYgn_j8n?W5zxGY9lkZyKs-E+qw~G(>iXM9xzURZ5^5t2ukMMw( zHR*TFjWdxSVmKRco6Gs|3A4OFk2AAI_W`Ym4Yy~UUR*ox$sRjz9_l1lywE|caP-zb z>Wp6NObmG7!+2p`OAPP}OCFr7jx{rj^e(>SRnK`*7h21g^)n;Xl9zGm=nZIA(71k? zBfa0`>EH3j-r_U|@x%9{)~Rv9;I1BOE|`b>);#y|$`#z3A9r)db&2u*JN9NZ;End7 z**xfTb7h|u`Nyw0liU3y_SzL1(s|&k+KyehkMo_+yV%)7b3gM4jjglyN6pp$>$R`* ze65#5@9g97Xq@<-`AFRB)4sM&Y8?CVk6-=x$F;8&z5Lj^i2e9S$WwxmM;tiw<(`Mf81`bU z`$p~5*FL>>-_S%&dJ$eY&%(2bhrV-Y*jwLCd#qY}=(=FRhdt*fZDQlq_YqH7GjICM z?A?#J)I;N2L-#P4XuId`L!MQ?F`C=do6j>l;`XK3aPaPs^L#R2;xLco_FDVtSze=s zdG&t#2p4$#&8!p4JIGmUd$fnvUi|Vo+R?~*SCibaF3uxvZN}V7IJI81!IN+Iy!PM< z$AcF2#Q6-v_>IOb*VaYNx+m=~{x_a`=UF?xdEb1`Pu}7K&)jY9KmF;RPo3!n@q3S` z56A9hVxu{HKPf(Z$o=HiPkv%d){6fGAJ4%l_T!%fU-8O!ExCXZ9`T47dhZu9vd%S7YEX=d` z<+tLgXYZ+XAHZjhoNfB8ynEto!V50%v$8kDA3TEtGs!9p__`K7lP@^p4A7ACDe6A9AjG=v`ys zM|^2tHP5s4z~`FevF^J`T<>J{#$IP0)01LTS6cLDtoQGi4!)^-pXc}AckEc-Cyu#_ zzyA}Q^aeX&3HiX8L4tIQB9X25e+%xvw6(HuF$ z18bb|$9)z~^C%4S>g&`Jrg5&}y;(g_;ir9=f6eEr!!tb7 zH}LwzH8T#b`(1qwr+WrR@>y>^WbRqrt83;Ck#{f5c@Iv{e`cEb#*4U-*G%C}{*GSa z^WZnm-p7yP?J0TG?)uudCcWAVG1~X+IwpV7Vm)}$zwbwNm{;McA5Y<}9Q(Y?lsc=X zYN^$6=h{#BE-O7%%=5=A;yHe#Km0i7LtXahQP>p&A2G;DN57|u9~|yuYA_FAC83n(nVdo^z0Jj zJeDrJ(Z}@Bo))KOCx7A2syRSYT#RFn-gb}ZgR>ZY)?8+QI&lcc9>dd~;P>iTG1W`! z=)Y^n7v3uGJp7AO_Z$!7IrE8k;P~e4JDl{5n7MafXDofdOLX>r#d=n#nYzsle>tm% zV0|ayK=0lMKb+S5=?AZVT3>J^tj81Y04vFK-2u6rS;^cb@Sc;aDv$dk^q-}&aXH{^z=YMLK@>a&jKcJX-O zxaS7{>%Y`$cBgmD=*rPEec&FC*BYEtmvu1eJ#qS|-hXQC#2b&fcs7Y~UTbEFV?FE9 zk9#7A=0glMaZb;>pTrj5s+Zni9?lQgn|m=vUchC(J%{kr8qW_}tb69gyr}1gcP1>) zxzma$qxy30GEWh%fx3p*MxN@cCVGjh5HrEfhYO_7ptsx%c6gHgu>NPU!Mo zIA8NpZLQw(eHDJ{g3%m=+k0bCAHJ;AMcy8lMs#_Hz%i$}aF6@24`RDkel!PZvnOCz zZ&Pc|hgpEfeZ-&rLT}g0Kd{nHpNuEQ+VRXcj2QYT%$`BK_Y927yGXyyL2mb*9GkYhtwo-Te)?(NXZ^CjJ71b(`VZf+KH+T5_+u}38h5d?H*huIF%#f+ zJ@y|CHriO(uyukMRI71vR7)j74>AN_3XMH9UoyvfV=hlhXlGroeo;b_j$mM5LJ zzu6BTHHu@r4NvRCTg?Xb#9>bBtT^(h1-5W&pLsJ*En(R+c~a*%Vvb{#59G=>x#2_D z@gW@JT?>50amGsjs*A_*G@R5yAG;UxNFO=O(5v}@m!FCw#`@VupX(J%e*0w(Gqgta ztQkg6=MNEI8qq%1_;|pre#sxdj&sgyW3b#-!pJL zPi)?rbm)ikkSETu>#W5&jAy@?~QnCxtGRLPc`H>R`(qa@S2;yS8*|hbLWD?T>(?| z^rX1@7iZ^^2bMh20cZ0f?mX+*qu#@wMQWgnYN@Eb4A+dKOSf5qTSI)f+1T+9(;J=FTlwf31Gu;J%h0FFJYhIfKlSU)1bLP;W2UTT5P4PrNx>KRydjJ@Ul6`zA)Z^h*qKJ8uuvm7d__ro%8ymg!tuwSVU-YW|_=MN}xwdfXTQ%|CTJ}TV@D)7c;e+SdPp^o@H)>U{ zJap@G9d*IIKj)=w?9O|y_ql83r@5MEVeVo#+|BWpxx>@jYF+Wy^Me=9AMwUsX0U4- z<9Qrs-Pe8J&p0pfgKy1zd+`34)5>@J!iD&mlXk}z2YPsj^EW6@%$dJ&JYV{`aB?;m zUwdB7b?BS(s&~iz+8DUD$GyMI`%dqOrFQ-Psh@cG_IdBGGyd7DpH=vDfYeXXb`W z9PSf7p_Lx!yUyW5uimpq_ue(EH75Ja#n25wWTP ze$7R5R(yMif3CPQ>uE&~(%-mv>UXm+2mXk|kGU`d?4z~fz=T8hs2ao+$9xt~_LxCq zhP!L55$^Wl_&!g6ONY3neN)Fba~G$_%PfIw@77thy2FXbch=D|FW=AwU;KktE@!OV zFAvELcQEVj@TQi}W9BP<#c;my!?#&}_@?7I8gq}=djRJH@A5x)Xs#o7#=@f&xt;f( zdfMxM;U-Rvies(se6xd}yLQap;^XuVOlq}i7H8~dpJaA>{p8gr75}8XfAX_WiU(ii z9n;=1#F<;T#8T6B#@uOsG8$V?J;6`qL-3DF8?^6{($FvteZT% zU@pwNSI+6slHbfXSo$H({YIl!d9??ghhy^}zU&1(NCP$I_NqH{FVG7XKKAFHIBU$p zK6M7xyyS46n60h7`UGCM-T(9{{kdDuv^cv*XhFAiz?r=8z=of9iSzQB*$E?0@Sym4 zkE2t%*E@y>`{3HXii0_MqX+N@3m)#FHF~$cF)#KEeQ`{0^3FIg-6!}fS0DMYLZ7cg3O)IptjqKnnJ=!E-@tNSv)YTQe_o168~ zVQzXjavOu*aNZo3+Gt{p*WlsrnEB?8KdjckJep(YGp8M^nx5Z|zp!s^)|M`?dtc{` zQExM+E55Op`Ohq>*1e^+XM*_h3a)%zf4n*2qnWiiwhnpow&FkM(S0_*?W6tDpEwR} z_Ob7+FuS)0Uu(vz|MX05*U$%lUwB92#rpW^EwCTv>r6a+0grRO)T@U5?RSSdo?Xj& z)gbi93jn~xitoqEA_m;kE-M=T)XI}AfJyWCa2HfF*M}6&+^Gkp69b9~={?Kv1 zdSk|;7st6Sul!9}yLqVX8qQO_vEPLi-d-x68K{?vS8czArJwo8lQF2zJUAnr$${E< zW-sZxR?jK-2Ts+j9QaU24)3Wqy!1&O=vLgH_U^?s@(G=aU$E2%?o;r5>Q9`VtNf?U z1YR~&+jeBr?u*!=&Z$Y)`19h5XW~up9zGrA(%d0R|M~|LC z`*)A<2X6M~82qsZovFP&gO5DnTpYwLZtKav`+$}|-kCjM9+`>WUGcVGdo)I#lqUy! zaJ_qJ-{emYy{!*^d4{LLVDA_`qPFp;Z}P{xajLiPit!vy_AI^bkG_qwZ_FN=nFnWL zT<+>$TJ8B?;<);GiSwo0l?Ugy#ouxKkHqjc%HRL8uYXJbL|^x{|Cu@6YtQ{4f5lwS z|EatD>@)k~`q`^bYyGVJefH^RT0g7Ru}`s2yjFSC`dQ_0)@q(`VXcpNuI6#gr{E$6 zt9a7Cytp2_X_9>AeIa5{%a9Mg|$p%sr=$uo8GG+OFK z=hmoNct8*Q76&l=h=HClsc8@Bb?I;(>SOxd_0d8N{Mv){c)#QeZmslcE#jkNE^3?e z@F@=V3Xb*dKHCrU(Jy<%9MGeC=)JX#5hpN;^Ied~-k|9-XKDY^gumdV$9iZLuJ@@& z%(>iA>RW&LQjg%OFZYA~@{w=OrzYa#4g0GG&xjvA8W;R!rTweiM;|Iy#Y7w;vU%JnRkUic2b%EPJ8+V7nAk3H;~-4o);Wu5%v+u9z5JG8c!c*n~4mH!v7KKsRIuYOT^d_9Yb z^&WAa3mXj1zeufC;$9k8XX}Yyd10gJn(n{2OEbQSjc0mEo#wZ()ap4Gj+~lf`rCZM0|%d1uUiLu z&4Rw*hh97%=Jhqw>HUtS|8Q4MeN3Hv;;cK@tm+J}9mDKV>pE-Xp84LKZ_EW7 zuE~pkd}Geb7whfGd({fpd+OR>>U)*Ol{cE>CB1FEb5_9Wo~3on$8Rh;!S<}-hx1%3 zda8Ilj3@A;M|)>~nhUY3ChsR4{a(Nwzr{sv&Ln&H;QI}4_;^>u#~=J;ua&a^_tjtP z7S0@+i)VZA!e_k5bLKQXsZM9_7e{`V*WPo62Y&9g?+EeC$vvbe_G%6IVUO!Re(_6t z{pBw?XKE#8&R^E~m)^_EFLefv*wkX(dvX7gvBa$xzGxjh;RSZ;=%H}(GV$)g*zFbj zoay7L(>3lXzOu&O!81Lmw>kIx9_q@kwd1F;(OSJ~&X2rDKQG+baZl!F?eYaoyktG+ zof%`z{=Ac0pRKoRrf&DZne0ALd+`_zdR)1E9{+o0(Z}6p@BG%xy)<`W_a1ZVvuEb| z9Y1IE=tEfhD8BZ*xY=vYT=OnZ|EWb^zbr532fv8fxA(um>N{tivj(sF6&HL1=XmGj zmz;|OoT`rpYnxj-=4&704|4`4YvU1z4r`E~FFvPt&6+%{Q4f0G(&oG{Pki*h;_TOY z?mc+kS^K{BQD^%buj6_A$$RdDv+cfY`81KR3QIP?VGSv6=8pFCmpK6I z9^$X`G}m|(f96CEV2tDab0+YLn&jfsTEKLE$5xM-8##7gsm1!ad3H?u&%1}@3j2BX zuV1JBxkhIBx)of*x3mvGZ=&=01JCDAXYeL`%ge*Ol#}nb;5vGGJ%46*JD+%Z#_9Nr zwc&WSKI0Dlb@|}lXq`EZ=ZR$&ckAF^Gt>5a&-*#^lOu1}Jb9wxN<%_OQ-#mUS@IS+L&wZ@m#!pFVD0SzxMiAyS267HM4Krp^f}`cX~_G@0xX= zcd^GFIOqeWCal#r1{v9b4xwzWCzR7oUGoc(2&E??(>uA-_3@PaW3c zN}hYgz?=H`qPF$4FDz>Pk*D^+)0g);OOyNZKm6cGKk+(wc}HHHSmR?>dxa0?!807J z@mYD~l2`xYpLp`(F_!$PlUDqZ*ZQ+BEOb4G#sasnz~`I(q$3~Ms}Apg^|fLK@-B{< z2{6X_UJo2Sg;%)!zT$@~csy5XW8d8HgnTer?T5W8HW=4r4)B6~?v7lmFKX$Y*j)6Gr_HK4)n%jyuCgAJxZN zGpE!KCi=Rc$t!+6vv2yduJx#8ePM=Axj7H#ieXOni#+b((c^ehzRrcy-C;kT+NV8* z6B@~}mh)GvIeTv6AHUKkj{f2kvsR8e-rvQ@mD<&>>dHU*LH+SY)|^m-S&_qW?Dsid zGLNMrPpNl5!E=ok)-|i-s3lC_`Qp#4`Y!29{yJv7>Z6w);tASYU;EtAaLpZLhMFIE z&Kka_@-wySF}U+?PCwIE?)uB(m)9@8)cR$uUsh~?!YpiRxURTszxZNeUt$k#^S9nD z$J7z`rOxnjS9ipzZLQ$#hq&lxHAa0dkJdc&T+`U_*NS=Ve!I`5v-LTT%x7UxcjD6X zITK=_ziZ*c-{HkNs#!f&JX%@NuW;g)&r5GhH`uPf_&I&7UVv-t<9+RWCr4w&5#2|> zXI}S$p3eEDF845en#tfF>)>bb>f<6he4nVPulD5RDqeB} zpY6l{jg09>o*> zS&e1Hbwey#DIdmssoj)&4E>{HuypzCNwO{OVVAPHoln z9&vJL#XdR4t@9;u;Dzp0-)CqZIyaiArJlX>Jh9~1Bl{F5`=Ni`RlI41zCL(o%o;N* zYamY^c@rMB>Z|LGVVv_^eUm$y@B?n~M>{L}2`BCY^V# zIq7*g(kEvJ9)8ICTRqY*c&Ue8g*j?ER=L8G-Yk%_uH;T{?zQ>o zU3m2eetX$HMz>bYv~ci5-l~tM%!GJ&OD;Z_mTNK-^{iR62Yb<-TAQ5W*4*G1-^}rh zZ)`BGvHvSx`r*BY&uAjV*yl>*6XFuD2>*r2NYv)mW zp4}h$Y`)&_SbQI`s(H}Z`rrh2?&`WKPaot(-k8<_ z-+f)rJHD}|4y!r&yV$wwKIg*c?lg&2z2s@axG9_pb|AAMn9l*X99ESk-U7_*gOM zb*((3etYb_ao`okJs$Bh*0>AivF}wEEPBo!{qBADAFr#Y&Z(wncAYKxu63T>t(H9? z=i1?}*z(BumE+L2Zeeh@bJtI13(N(#Yv`x*z%Gv+ht~My-4M6*lV3AzT>5*!T<&Sr zjz?(N7xUP!GdY1#|IplT2lMP%U-|8ay=8BnQ~$zISn*1?-#PimTfArvdLN0YhtwBe z^~C#x5B8@s@#_pN_|@Ide(p#5EOFhO9_2|RitdF@UxBHyh z)D!3V=>52d;>;}PF5DaRFz3?J-C|X&?<{j*e0lSkvq1g2FU=6*7-_2!DPMT*|EljD{I|V=id6>UYN}T*X|$t zeJ-BmXZxQ01yBCF*xPtoSn7XOv%rU$6t`pW`c?abW-zX=JK+q2!MXP2LdHX^KPlqh1cbtg$w=)WgiKa^x1j ze4RdY2k;D^#&Zsc2}=xkmWF(W%RW($eha5s=UqGAg;)R9q?R?v6VKqYH_wu@qDRG( z*9_wUIdKSoo;4$Ao8wqlUA(mRd*UYJ@I%?_Ic#v>*{6k zuAXL&#ur!mOs>z&-FaHvxo>)kmz^J9&AVrWI(sqmFb_Q25d z$r~@3#j(CL$MlprxTmka`pv7aej_ix0S4c1Du#INJC=Q6e^a^Num-ilk;6RkMBKr% z@vft0@p%;w&cNDNY25mVHZ_KCu&%rKioaP^J05&)e$T}-=-%NO-1VV$bO(<)?q0el z_AA_3clO#Ip+TLQ3vy@e;=7xfHQTE>qam)DqrA@fPOCi>*B#I9UH%8xwQCmP;2KW* z9DUzU`d{}HOxEz>tWWb({?c3P2_t{TCr7XQPQjrw`QbJ1aos`mdJP{|*D%LkEHV&ul&ZwK-CXWlx*Lq~N7-Z}A2J$ptDb0vRjy>j00u;c0_cN?GR zDSQ6!bd6@oTxLo=;m^4vrXDy??(L0U%+>YCS=Zb+%dhI>C3~$$uk@|EU@dsotPigE zDgBAdbNh(CF~AAC*YPp^R~}yI2dm~xuk?hx>vCrA6+@i4cmYm&dH?b!+;t|~W9p1re>=i-g^J_KUr7)-%RUksQeF`Zu`a`s&;)^zVA_iK}@Q0pN3%{s$4~bL9 zHLMM!_VeaVx0gm0ZSx6zEY zdUt>Jr#Wq2?Bz{!6mP%1o`?8PpQFz{?VodE&*?k0UHmX?&<5kX7`1= z+UIKzIX_^QZZOB{eAn?eG5t3-IKQ2aW2XEb-v>ESS6}!sYki2-9yw#aCO2Z53u>^> z2c08_cLgl;sewKC;R&mFloyU%#4D%Y0QO4f19ThjX|m%$qCr=;gx07`((!cyv}hV)lf2*1mbFe(qB7^v9auf#Y7@a#yN# z-Nhg9;hJ~oe&7MU8Kbvi4fY(*@CU5c==LnAnV!TgjP}HNHm&Cx%_jV-Hd^SH9^p$p zW(Jzgj%$A#2Os9|Pc!kExzcI=!EJo@T(6$Yf7~hW>XGZ@d7f{s!^t9*j#yzh3`x^N;-oe(Y`sil8tF#LHMB~BBp)qr~?f-&(z+5$t^Y8q7)cU*P`rYr! ze|^}KD|^I$Yy9tiSNYmIM=bNfgx4J5!n$#L4{dUyc65Z#`Q#)1;0(v$)JOTX7HYDO zm+m#X_WQf)GhR}YzA>BBMPp_!zwHlLa;YYJ%{SQbJUlb6Xu%KmTT^Gn+pl{_kF4Vi zf`g~=-S3T#!cac6Gea72wGuKOf=i7s4V_x=bFY4b~YqooK>1p4Y zv@_S$PiAT^&damzJ^fZ+_MrPqziYkp6(5{YdaE`4rWf*(+jo&U#T)Mk`YVrpeVI+a zS;pj*F`S7-?}P7qi)Z5SHiBOqmjj(c*HTe$xA<)_Tt{@6JE@(KIM~lMekFq-gM@?*kAJCfgki-G0e?}FYx70cVMqQS8Ig_EBh)QW8zhP7>}OWmpr1k>Cg9KOy3u|)h}zo-?8wezwn74 zc-~dvxhFSjCf_}K-txEf?&80{=6~%TVlf3~--dw7Tc`n=En{!93N|NB>(Nv+)DjQ#SDea?mX9rFGVM;&@+&Bh|u zzl&hJRz2s%dgE9tZt@zl`N0S6o;B)mhIiCM@1c*$wI5=tmfqtD^}`)q_U1lV&l+Lr z#~k6_n9Kz0U{4+O>U_@&eE^3QGtt_8(x!Ei6%z(4 z>d~KL;X{mlx(+*sukY3#F&BCzW^sZ8{kv8e^?i8nx~b(Gj^J#;0u?Yjr;d$G+#~iCj5f*YGDkbJW~c{Ln((&UydD_nqGz`$OuoF0GAw zxEtcOkMv`IH++3>OC!7wT2JcVj03*nZPsXD{R8e38vUsTzp=*IgU;gFzd>OgC*N>t zt~i^obu=GxR%~$c!gIK8W-RZ(N;m%FIrB_@`q@5Q+cU~M3PWvpRE&DWxtHi-PV|p> zVd0f4xW%vDl#+oc*z4z%!MAc<~*@rvOeOb<{1X@ z^l{c}HjZ`wIS(J_Y_EGxn!oUSKb}^O_40Df&$;sSv2eJ@juqeX+5Uma9KGMT?6any ztb7;6+kENOchtDVmj`;!8{nMfS9gqe5zl@<;n=JBW)7*z{M6s%eI~c`y8q3)_Gb^n z$N2K7ex!?ebw0gq&cpZkkWak1_>5jw_jS}i>vg>FcTD}OR$*?qW?smjHJV5K>@|Dq zu6|peT7P`?$3GS(-+@c*AM0J#2MpE==8u;%^TaNE&RJ3O$8ec@=PLilL(ABOxz*iX z3Jc7E>w54-KYhlN{e&wu?RVjW;W~WMyq;5sc+LH&g|_oqZ~g6lhX3qk#hXjqS6{7J zUg9TfIOiOH%YXQ5jHE@`hOI)9dy85VwbCd>ub==g9X}F*Lwxzc)*2(<#*w(Qsfc($8-mzTt(d`z1H^rKk6#ep(lG@Jheps!ns(>^5HU?I$|p#kKa&*=A4Q;j?b~ zw6{m@lW#mB?wK#%)bp(tx88#^lcQ(!8*QvNvtgcZE;_+2Px0OLD@XmRUAbuP*vm7| zye``0EUm?z-$&k-v`#e#bdvXHJ`~XU+xo}`mG~3y15I*;2HDOT%Pew zFXnbit$l`u@cAPqqF@e8BxFd#%X{J3N0f z?iv>_I7cJc!}Eiu=tg5WSXcNz(Vz42X`O=`G31Spmj_JY$eI3G=UVcbgL}lSo%62i zSmr7$w59Ld&_+uK7yC7I4`yA5wV56^$U)LDV^iIXG~nMcmDSr9{1gQJQa7xsC&_N z48KKvm3I%Q({B_#A`V}L!)grY2b}ZsI~q)W=c*OzIL&ej_%*1%tamJ`yJes*QQBQv4gQ->eny2m&d7oQ*F}Tg zp|QW_2ya$-Y^-s^?Kfhs#JT2vkV75Lm>aQK;iLA<$CGlo!`7}k#+uK(jzcs0T|>X& z3%@nNaeAUF4?l>Cb8~*v*TfJn){4GR3`S@Ob zGJ}^^`g^F!Tps5>{XBZ5PJF}{)@y8^Yu}tJ-fw@$imTs=d5?3nShIRq9JjOhGkW=R zznMRS=MuZE0}ge>{^=F#4xZth`oT{OJpPJHJhOJLeGOJQa7HWZ;tco0`sWAFht>t( z{gu|t=+ue#XFSLck7{?#?9V>_yykpzr-w(b6L(phsSHr!dEF?-(MI=5HM zEm{Z9igUK+0tWAoYk69=XDr&l!fTxuzp%n!-*erVstG6jiUVBe4WH|CMlHB7$9TNt zrdRnQt}v`IC%uFV9;hQuXezI`yvRrUfd_EW1M2MEF?u(K{ed5P;6@z&mkxQI&%J4; zz)DAW`Jg}aL_P76gZ%POJhXxX7JGQ+UR>xwA9SLneeOeX<(iM&!_oIhKIp2~%x1iX zyVjloeEF+bdgYwpH(Kxq?^vP3z5L57bfwK+?IHI&9#pHd>&b_``8^}?!JBaGXL(}Z z_Cdb%1RwFpp2XX8F@Nq&bCUnPmu}TY1KQxW4&Pw z_hJssx6%>>g6$>TKfuLYufYn1dMUyckbv7vHBP*?DcK%H$;tiwvVmD zSuNk>!`U%wq$jQ7+i#-Zbo9K+ulhSM4<2;?#Tn3R^+4|XHMm>M>ZNfj)-{~F zJ#WpzqG$Gs`GC>$Lqz%)`+L9%HiH#={aaJJwV!^r3?fGbqgEH>7iTh3nXXRc&+7n>~^np1`AT^hZ~DoiR7g1~u#f z_25I^xo~AR#KMO#GY@b;7aY>>dm+}b3r2Ud_$sftj|XT)k1NjhqnW$Lo>dP&;E*TA zuwPvCNen#OH}d9DFV0aZXXHJ7gd3|lxmwqAOut-NhdF^K zHN&GAv>iKe!mHox3m0s-Im2+v3-mP4#4+!w1*hf*+*!lk9(;huHJEYFz2eKyp5M$@ z8oBq}V^-k!fs_PRT6OQJLN7Q=1F+Km9i{6m9qODbZ>)tif*5y3a!x?kW?i)OPkKL1a zbqCV@#yy_;%hNY&|2pjdvixgj^HRV6Kc3suxAb&g-{^P$H2?Spzxg-J_s#G3ZTuDX z-{9?yXZX!{V?WkbZ_0I_7hm60E#~;mUyQ>(eB2|K*#lEw@`;nPcznjX??(LLxU8)| z@pxhX@dFL(NMF8ZM)4M0e8VrekzYCR(l2}`=N{l`_u~CgpBT9}7qoKL9{S-^ZfTOo z9*K)z)D#Z<`K-x#(j$D^`_k-w7?YOnG}yDQ?-M%Egbw#Qv+wX5lUV?(-s}~Ae5V`3 zz7NmxqIY6nl_$>nduHTfJlOHbIdKlF9$3$Y^Kd^iJNX_B)YjL1qkcHJubgH(9ynLj zTU?nU>D*$Ky9vgf?)GckKqPntQj*jM}$D^J584C3z7{-B*ch%X+U&7a2|IBzeR6LqX{-G}RO1=o1H+wZyYUB!=Qf6TyrJ@BmlCx;ni zcC}{z8b4G2mNkoCJuU6-39*@pdYdz~&9mozdOz{JFWhm}X@6?yH*PQK9U9B;(Q`0+ z4c2wXog^3h^_=)x^~U6>f2+t>?J>KG9djVZ{9kO}2hY;leUjV1hh3X}Yrn3Cm-3ff zII~8JE3o;N=PUMlJ~{Lro?#IG>*D_Ao4>yL=C7rT&vEA0Iq`F?y71g$S3bB}M_c(h zFAvQJjJ{hOcnkYiv^KX_;# z*ZfUwu)N30FYn;~YtD@eC$QP$UjEv5gZ=62dUoAWzqk-zxp3hQk9)kHuQhcR{`AVe zp4Ltu(e0U&KfM5#z5KSf?PKptQ=D7l2?wxUyYb>^t>#1=T;|KYb)OYCAKzE)v4V$O z(L!B5b9bK=@AptTs*T?A>v~|rPY!E>Up!jn2RuHb2V&eSd60u=Mr z*&3eL_QHPULo@JfQUhM@T}w{z>f`JSlb-wiFc#mdH~Z{4qBna8M^?^*cV(W^jNV=| zqptHE#&^#hare`?gVVjbUU!7vq^~pf@B!?6x(}b7XI)|F4_ImgV?Jt&KN$4DeC6i; zP`hhJKX=_Vo^Q_5(mRO%^rQKL3*6Bg9eS~6=%~lweCPCKKh!p^_R@3zII}18=NMP< z#ji9G+dXH$xv`h7c$JgS)I&!&@Nu7BS?ip8AP?~Hxnn%v)B_t_*U4+^GVXpG8!peH z`KM3b2Wt5N=X>cGdPgi6ujERubedcBsL3pJ58}}O3pnhpSKxt?`(5ra8ga z;QgP>#dFsGNv#*T-+WfjXY=pixZdIY`RRRq`}Q85a=kdO zdtc9I^S=TA_OpH6JTUuj>+Sa);CGPULe{>AZyWb5?wNNjPvik^-~Xka8mz-zsGdCG zk9JmgBQAG0TJ4dV>S4#)Pq^>a@^a`0gShvYjb^Br;_|`x?iV$|y9f9W7x39<#T>Gi zm(?RZU{2#9UZlO|Q<(4wBQMim=>W61dbS;tj(Fh1UXHx{96ZdUkEv;&&f!d6-@oe3 z&py**R_UbAd27-TmwQZoX?4HtSsIy1drUrSIQIIG^Ib7M_m*DU)1HIh2XfM$JIFb+ z>6!G5>>YaXV(rnC57bg0@5y-1V%Hg?xN-1WdaTEa{()m`pApA-uU)9bmprg9ZSx0@UU(T@WQe&^|SN)L}ILsq>?0GMU>EmqRoqpvXIn4|! zbmdDk!daa3vij5vjJ1yDU_NWeLpa4xeejx_Ts}h&KICikKS?Q@YRPt;ep!I zSLUvHNqh6;&U;?w%KOO-*f;s5r?_UTdBTHy(1T|HE%|ev{Mt(s9IE3Q4b(I4y1fqv zu--pl8P7~Gm+*||i4D*8ihTGr-;1Yc9Ng1O^V?(kOTW#1o458wqdBRm*)ay(;%VH9 zCzh2x;oZc)>yhWXL7XwqEc{thcU`afoU=lczo+G&J`ykegHt&8Jmc#e?yS~GZ|sTn z=4#yBSM&3?x45?#*U1OC#5d>RJH0O5;>dqqH1ig;2J032hhNkqhWr&XXX-<1`|thW z=%Ih7Cue+dj(;o7e9iOitG{vow|Pe^$GUYU795VLHXIYb=5u~|Ef0$u*zg~9-NO^l z7mo1Uas7>4SDxqRljDke?EmQJ#uxj#jlYJwYZlJ2!(-!o_v0M)j#@Dr#vS9Vl1Gj9{4J1Q+?$8G?mfC$(J%ePllAzHT6gQYSK!U5 z-Vg^4@mg1o8qlGZ>wTxHSuxhSC)b3xIh%Xcfe-P{ojx*y+(F(V=fGZ0&%$Arh|7=O z#@>(K?yWi7|ME$XORLT^$K8W;$YmaQp$>Xwzrctq9P)eNG+sSH12ygq+@4vq)UUb0 z4@~27p87KnZ^CF^K2tNkwGO8|=v=&O-lr$mqo3R}`@s2eHslMoIn`HYDIUen_hT*c zI?wsLZ|d7C_P{}dI$pV7y>X7nVV=Nm->SdfQLveD&d034XKnGCt75IeeVuVPE6zJY zt?zg1U*Cn!;>bQT8$UA(#dPlbVej%AEpTZczo-EwpEWr%_rQCN7u3yO?+)kU;mnsF zaXPDK&tu(3-z8@f-l{R?(HC@19Nz)v>fYqVp5VcLr*74EZuu<6 z=IF_L&vNT!FJALoJ9jtlN?vkjsnIOZPxOsT-^E8P_0xAS?is$jXT{i4?#}lxZ^CuO zDQ=vhziPpk&$G*YC*HO6IG%Pq*sSuPnNQ66OYg`fe!ET&nSo|0|C+<>$(#G8@631g zyJj7~@zeL^nNA!%oE(`0IWph$u(8==%^tYgM}Ne$` zoR|-Aet*zI{Lq`+q0^YmIJi~cnCXokcYN>ZZ_jY`z}(;G_q==g+q1ZI|9)UkFP;1Q z-(L0pf}ePFvYuR-KUUTh=j&pfU)aB|edjNpT4Tk>=hA&cu9tKkwVwC?rrsYpm*>^f z>wNvQ`JUC^&t5wIMjp=EcoD~aE|`DU`g*_rypP8|?zv76cbLB)zlXoq%<*vse4p3@ zvv7!aPH*G%Q#Hh3RsEaJ6g+sR&;tk0>pz5X=D-Ud_GL`>+x`Y8FYs$m;3qEqs26#4 z9sF3Qdq@qvW;Wu~oGR9RM}KLVv$eZFVb30*FAeBxuO2iT`4d+>D5m+WJ^JV`bDNmv zE^glW?voy*ACCCc>ORST`Uo!fIo$Seytn12y*h^bI%1=vJFUDu2bWcz$0OpwrXQ|- zZ>0%6ysyoPyw9y^Pp!4{*z+81t@(}3dmcaZw)z}iXlrJ>Zhm9PIZxl#>i2_lzS4_t z`=f5{=?&|~CXN_Ah@0BX;f^pX$1z{lgKuUaO<^)u)u~>+mEZq0`=|-*z`eO z_(Ki7oqX|?x$54ft(fb;X%5W_J`s~HHK9Wd)pQ^1PxaKpEa(?L;omuMIiC9f2X&(b zF8YA3>gCHk)DNe0qS^hMGw(KY6b{~}5BZaa@FYfW!Nv>D-nT#W#CUkMCjXd2-dNA1 z&){N4w@+4gO|?UDN9xi#Y#+SHfF(UTU>&A0kk^El=Sk9^zGl;2%< zH*575ZLR1Zb*_z``RAUbH}lZka8AAMc07Q8`Wg-5@D?&Nu8(KVi+-$uJ$=;*?!%*E zx%2Vq_@Q+ZTX(}+>t1-p;G#h%+&&A0c|Ec}!{k(RzFU{ql|Mc~G-52ldCCxXCu?ne*wt`>Yw#H@W3MHQ~+5xIIiPcc7VF=P9n@h0fvs zJSPWUa^r3>zoP~@csy$dhuo95n7aTUd*1UsA12D1Cx*bd^RtAfp_%>{OA_vF*lw2eUYc| zsBs;*qR;njOy;8%KEQSLvwA2#^{76?o0#r7qg1g{x+UY>>S3caW{ zXL)iAy|zzitEZmF?$Mrzw+8irF$a6B{k}uwws!8O-;y!^wd(j&dPvhMa_0p$($(!pL8!p`u{Q8cdiG4U6ZykFg zCwm08_<~2zjJvny(oDoNTAG*p=iH>t_r){3s8qwYX^-kIy6#a^f{PWiS+^Rln&KKhwkIJ~Ma&$wc_EAZuIxWNJ6Yj2;_;k$vh=9&3(28n@#{(xCN5p#Xd$sTft?1>&!OCR(DPx^9KId5Ow zM+d$iYU6uzB^FKhx9a1YcT3K}N>k^Ji!Z*JsyTdfR`3uW&wXj8e)rIGT6`z(a31fY z=McU4sWUVmbRA>d_jz!rPTE&aczFCYn-iOUt{zVBQ$yav>-I5yfH!xM-i8x3n)flg zc<#FyKECrkr|sd2-#KvZI{I3(sa*TCerBp3a!<>P`OkjDi5TM-&3Q|HXY`f1>VEI; Q?2NgV`l^+O;lZ5#FLp5RxBvhE literal 0 HcmV?d00001 diff --git a/docs/CREDITS b/docs/CREDITS index 83581a68dd..61e3b07393 100644 --- a/docs/CREDITS +++ b/docs/CREDITS @@ -741,6 +741,7 @@ Mihai Alexandru Vasiliu Wilton Millfjord Pavlo Rudy Yannic Schmidt +Hairo R. Carela The libmad team The wavpack team diff --git a/firmware/SOURCES b/firmware/SOURCES index 3573331db9..b4008b832e 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -74,7 +74,9 @@ target/hosted/sdl/lcd-bitmap.c target/hosted/sdl/lcd-remote-bitmap.c #endif target/hosted/sdl/lcd-sdl.c +#if SDL_MAJOR_VERSION > 1 target/hosted/sdl/window-sdl.c +#endif target/hosted/sdl/system-sdl.c #ifdef HAVE_SDL_THREADS target/hosted/sdl/filesystem-sdl.c @@ -86,7 +88,9 @@ target/hosted/sdl/key_to_touch-sdl.c #endif #ifdef APPLICATION target/hosted/sdl/app/load_code-sdl-app.c +#ifndef RG_NANO target/hosted/sdl/app/button-application.c +#endif #ifdef WIN32 target/hosted/filesystem-win32.c #else /* !WIN32 */ @@ -222,6 +226,15 @@ target/hosted/samsungypr/ypr1/wmcodec-ypr1.c target/hosted/maemo/maemo-thread.c #endif +#ifdef RG_NANO +target/hosted/sysfs.c +target/hosted/power-linux.c +target/hosted/backlight-unix.c +target/hosted/anbernic/power-rgnano.c +target/hosted/anbernic/button-rgnano.c +target/hosted/anbernic/powermgmt-rgnano.c +#endif /* RG_NANO */ + /* Common */ #ifndef BOOTLOADER chunk_alloc.c diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index beb2709624..d6cf5ef62a 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -33,7 +33,7 @@ #include "serial.h" #include "power.h" #include "powermgmt.h" -#ifdef HAVE_SDL +#if defined(HAVE_SDL) && (SDL_MAJOR_VERSION > 1) #include "button-sdl.h" #else #include "button-target.h" diff --git a/firmware/drivers/button_queue.c b/firmware/drivers/button_queue.c index 9767a1a08b..fc87732cef 100644 --- a/firmware/drivers/button_queue.c +++ b/firmware/drivers/button_queue.c @@ -24,8 +24,10 @@ #include "button.h" #ifdef HAVE_SDL #include "SDL.h" +#if SDL_MAJOR_VERSION > 1 #include "window-sdl.h" #endif +#endif static struct event_queue button_queue SHAREDBSS_ATTR; static intptr_t button_data; /* data value from last message dequeued */ @@ -118,7 +120,7 @@ static inline void button_queue_wait(struct queue_event *evp, int timeout) } #else queue_wait_w_tmo(&button_queue, evp, timeout); -#ifdef HAVE_SDL +#if defined(HAVE_SDL) && (SDL_MAJOR_VERSION > 1) sdl_window_adjust(); /* Window may have been resized */ #endif #endif diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index cbe6c3ee5a..7fc6d39468 100644 --- a/firmware/export/audiohw.h +++ b/firmware/export/audiohw.h @@ -223,8 +223,8 @@ struct sound_settings_info #include "es9018.h" #elif defined(HAVE_ES9218) #include "es9218.h" -#elif (CONFIG_PLATFORM & (PLATFORM_ANDROID | PLATFORM_MAEMO \ - | PLATFORM_PANDORA | PLATFORM_SDL)) +#elif ((CONFIG_PLATFORM & (PLATFORM_ANDROID | PLATFORM_MAEMO \ + | PLATFORM_PANDORA | PLATFORM_SDL )) | defined(RG_NANO)) #include "hosted_codec.h" #elif defined(DX50) #include "codec-dx50.h" diff --git a/firmware/export/config.h b/firmware/export/config.h index 182aced416..54107d5a31 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -166,6 +166,7 @@ #define SHANLING_Q1_PAD 74 #define ECHO_R1_PAD 75 #define SURFANS_F28_PAD 76 +#define RG_NANO_PAD 77 /* CONFIG_REMOTE_KEYPAD */ #define H100_REMOTE 1 @@ -619,6 +620,8 @@ Lyre prototype 1 */ #include "config/echor1.h" #elif defined(SURFANS_F28) #include "config/surfansf28.h" +#elif defined(RG_NANO) +#include "config/rgnano.h" #else //#error "unknown hwardware platform!" #endif diff --git a/firmware/export/config/rgnano.h b/firmware/export/config/rgnano.h new file mode 100644 index 0000000000..0d743107c4 --- /dev/null +++ b/firmware/export/config/rgnano.h @@ -0,0 +1,97 @@ +/* + * This config file is for the Anbernic RG Nano + */ + +/* We don't run on hardware directly */ +#define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt" +#define HAVE_FPU + +/* For Rolo and boot loader */ +#define MODEL_NUMBER 100 + +#define MODEL_NAME "RG Nano" + +#define USB_NONE + +/* define this if you have a colour LCD */ +#define HAVE_LCD_COLOR + +/* define this if you want album art for this target */ +#define HAVE_ALBUMART + +/* define this to enable bitmap scaling */ +#define HAVE_BMP_SCALING + +/* define this to enable JPEG decoding */ +#define HAVE_JPEG + +/* define this if you have access to the quickscreen */ +#define HAVE_QUICKSCREEN + +/* define this if you would like tagcache to build on this target */ +#define HAVE_TAGCACHE + +/* LCD dimensions */ +#define LCD_WIDTH 240 +#define LCD_HEIGHT 240 +#define LCD_DEPTH 24 +#define LCD_PIXELFORMAT RGB888 + +/* define this to indicate your device's keypad */ +#define HAVE_BUTTON_DATA +#define HAS_BUTTON_HOLD +#define HAVE_VOLUME_IN_LIST + +/* define this if you have a real-time clock */ +#define CONFIG_RTC APPLICATION + +/* The number of bytes reserved for loadable codecs */ +#define CODEC_SIZE 0x400000 + +/* The number of bytes reserved for loadable plugins */ +#define PLUGIN_BUFFER_SIZE 0x800000 + +#define AB_REPEAT_ENABLE + +/* Battery stuff */ +#define CONFIG_BATTERY_MEASURE PERCENTAGE_MEASURE +#define CONFIG_CHARGING CHARGING_MONITOR +#define HAVE_POWEROFF_WHILE_CHARGING +#define BATTERY_DEV_NAME "axp20x-battery" +#define POWER_DEV_NAME "axp20x-usb" + +/* Define this for LCD backlight available */ +#define BACKLIGHT_RG_NANO +#define HAVE_BACKLIGHT +#define HAVE_BACKLIGHT_BRIGHTNESS +#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING + +/* Main LCD backlight brightness range and defaults */ +#define MIN_BRIGHTNESS_SETTING 0 +#define MAX_BRIGHTNESS_SETTING 11 +#define DEFAULT_BRIGHTNESS_SETTING 4 + +#define CONFIG_KEYPAD RG_NANO_PAD + +/* Use SDL audio/pcm in a SDL app build */ +#define HAVE_SDL +#define HAVE_SDL_AUDIO + +#define HAVE_SW_TONE_CONTROLS + +/* Define this to the CPU frequency */ +/* +#define CPU_FREQ 48000000 +*/ + +#define CONFIG_LCD LCD_COWOND2 + +/* Define this if a programmable hotkey is mapped */ +#define HAVE_HOTKEY + +#define BOOTDIR "/.rockbox" + +/* No special storage */ +#define CONFIG_STORAGE STORAGE_HOSTFS +#define HAVE_STORAGE_FLUSH diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h index 73c62486f1..728f33ede8 100644 --- a/firmware/export/rbpaths.h +++ b/firmware/export/rbpaths.h @@ -57,6 +57,12 @@ #define REC_BASE_DIR HOME_DIR "Recordings" #define PLAYLIST_CATALOG_DEFAULT_DIR HOME_DIR "Playlists" +#elif RG_NANO +#define HOME_DIR ROCKBOX_DIR +#define PLUGIN_DIR ROCKBOX_DIR "/rocks" +#define CODECS_DIR ROCKBOX_DIR "/codecs" +#define REC_BASE_DIR ROCKBOX_DIR "/Recordings" +#define PLAYLIST_CATALOG_DEFAULT_DIR ROCKBOX_DIR "/Playlists" #else /* APPLICATION */ #define HOME_DIR "" /* replaced at runtime */ diff --git a/firmware/target/hosted/anbernic/adc-target.h b/firmware/target/hosted/anbernic/adc-target.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/firmware/target/hosted/anbernic/backlight-target.h b/firmware/target/hosted/anbernic/backlight-target.h new file mode 100644 index 0000000000..aa8fafab04 --- /dev/null +++ b/firmware/target/hosted/anbernic/backlight-target.h @@ -0,0 +1,39 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2014 by Ilia Sergachev: Initial Rockbox port to iBasso DX50 + * Copyright (C) 2014 by Mario Basister: iBasso DX90 port + * Copyright (C) 2014 by Simon Rothen: Initial Rockbox repository submission, additional features + * Copyright (C) 2014 by Udo Schläpfer: Code clean up, additional features + * + * 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. + * + ****************************************************************************/ + + +#ifndef _BACKLIGHT_TARGET_H_ +#define _BACKLIGHT_TARGET_H_ + + +#include + + +/* See backlight.c */ +bool backlight_hw_init(void); +void backlight_hw_on(void); +void backlight_hw_off(void); +void backlight_hw_brightness(int brightness); + + +#endif diff --git a/firmware/target/hosted/anbernic/button-rgnano.c b/firmware/target/hosted/anbernic/button-rgnano.c new file mode 100644 index 0000000000..a76a3f830a --- /dev/null +++ b/firmware/target/hosted/anbernic/button-rgnano.c @@ -0,0 +1,73 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Hairo R. Carela + * + * 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. + * + ***************************************************9*************************/ + + +#include +#include +#include "button.h" +#include "button-target.h" + +int key_to_button(int keyboard_key) +{ + int new_btn = BUTTON_NONE; + switch (keyboard_key) + { + case SDLK_s: + new_btn = BUTTON_START; + break; + case SDLK_k: + new_btn = BUTTON_FN; + break; + case SDLK_a: + new_btn = BUTTON_A; + break; + case SDLK_b: + new_btn = BUTTON_B; + break; + case SDLK_x: + new_btn = BUTTON_X; + break; + case SDLK_y: + new_btn = BUTTON_Y; + break; + case SDLK_m: + new_btn = BUTTON_L; + break; + case SDLK_n: + new_btn = BUTTON_R; + break; + case SDLK_u: + new_btn = BUTTON_UP; + break; + case SDLK_d: + new_btn = BUTTON_DOWN; + break; + case SDLK_l: + new_btn = BUTTON_LEFT; + break; + case SDLK_r: + new_btn = BUTTON_RIGHT; + break; + default: + break; + } + return new_btn; +} diff --git a/firmware/target/hosted/anbernic/button-target.h b/firmware/target/hosted/anbernic/button-target.h new file mode 100644 index 0000000000..fc56ac11af --- /dev/null +++ b/firmware/target/hosted/anbernic/button-target.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Hairo R. Carela + * + * 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. + * + ****************************************************************************/ + +#ifndef _BUTTON_TARGET_H_ +#define _BUTTON_TARGET_H_ + +/* Main unit's buttons */ +#define BUTTON_START 0x00000001 +#define BUTTON_FN 0x00000002 +#define BUTTON_A 0x00000004 +#define BUTTON_B 0x00000008 +#define BUTTON_X 0x00000010 +#define BUTTON_Y 0x00000020 +#define BUTTON_L 0x00000040 +#define BUTTON_R 0x00000080 +#define BUTTON_UP 0x00000100 +#define BUTTON_DOWN 0x00000200 +#define BUTTON_LEFT 0x00000400 +#define BUTTON_RIGHT 0x00000800 + +#define BUTTON_MAIN 0x1FFF + +/* Software power-off */ +#define POWEROFF_BUTTON BUTTON_POWER +#define POWEROFF_COUNT 10 + +int key_to_button(int keyboard_key); + +#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/hosted/anbernic/power-rgnano.c b/firmware/target/hosted/anbernic/power-rgnano.c new file mode 100644 index 0000000000..bd7832ef93 --- /dev/null +++ b/firmware/target/hosted/anbernic/power-rgnano.c @@ -0,0 +1,41 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 Hairo R. Carela + * + * 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 +#include +#include +#include + +#include "system.h" +#include "power-rgnano.h" +#include "power.h" +#include "panic.h" +#include "sysfs.h" + +const char * const sysfs_bat_level = + "/sys/class/power_supply/axp20x-battery/capacity"; + +unsigned int rgnano_power_get_battery_capacity(void) +{ + int battery_level; + sysfs_get_int(sysfs_bat_level, &battery_level); + + return battery_level; +} diff --git a/firmware/target/hosted/anbernic/power-rgnano.h b/firmware/target/hosted/anbernic/power-rgnano.h new file mode 100644 index 0000000000..21fc7da9dd --- /dev/null +++ b/firmware/target/hosted/anbernic/power-rgnano.h @@ -0,0 +1,27 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 Hairo R. Carela + * + * 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. + * + ****************************************************************************/ +#ifndef _POWER_RGNANO_H_ +#define _POWER_RGNANO_H_ + +#include +#include "config.h" + +unsigned int rgnano_power_get_battery_capacity(void); +#endif /* _POWER_RGNANO_H_ */ diff --git a/firmware/target/hosted/anbernic/powermgmt-rgnano.c b/firmware/target/hosted/anbernic/powermgmt-rgnano.c new file mode 100644 index 0000000000..a6a8b34a52 --- /dev/null +++ b/firmware/target/hosted/anbernic/powermgmt-rgnano.c @@ -0,0 +1,28 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Hairo R. Carela + * + * 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 "powermgmt.h" +#include "power.h" +#include "power-rgnano.h" + +int _battery_level(void) +{ + return rgnano_power_get_battery_capacity(); +} diff --git a/firmware/target/hosted/anbernic/system-target.h b/firmware/target/hosted/anbernic/system-target.h new file mode 100644 index 0000000000..fa7854c0c8 --- /dev/null +++ b/firmware/target/hosted/anbernic/system-target.h @@ -0,0 +1,7 @@ +#ifndef __SYSTEM_TARGET_H__ +#define __SYSTEM_TARGET_H__ + +#include "../sdl/system-sdl.h" + +#define NEED_GENERIC_BYTESWAPS +#endif /* __SYSTEM_TARGET_H__ */ diff --git a/firmware/target/hosted/backlight-unix.c b/firmware/target/hosted/backlight-unix.c index 3a0b301e2c..fb9fc18c06 100644 --- a/firmware/target/hosted/backlight-unix.c +++ b/firmware/target/hosted/backlight-unix.c @@ -31,11 +31,19 @@ #include "panic.h" #include "lcd.h" +#ifdef BACKLIGHT_RG_NANO +static const char * const sysfs_bl_brightness = + "/sys/class/backlight/backlight/brightness"; + +static const char * const sysfs_bl_power = + "/sys/class/backlight/backlight/bl_power"; +#else static const char * const sysfs_bl_brightness = "/sys/class/backlight/pwm-backlight.0/brightness"; static const char * const sysfs_bl_power = "/sys/class/backlight/pwm-backlight.0/bl_power"; +#endif bool backlight_hw_init(void) { diff --git a/firmware/target/hosted/filesystem-app.h b/firmware/target/hosted/filesystem-app.h index b35b63e95f..2d907b98fa 100644 --- a/firmware/target/hosted/filesystem-app.h +++ b/firmware/target/hosted/filesystem-app.h @@ -49,7 +49,11 @@ const char * handle_special_dirs(const char *dir, unsigned flags, #endif /* _FILESYSTEM_APP_H_ */ #ifdef HAVE_SDL +#ifdef RG_NANO +#include "../sdl/filesystem-sdl.h" +#else #include "filesystem-sdl.h" +#endif /* RG_NANO */ #endif /* HAVE_SDL */ #ifdef WIN32 #include "filesystem-win32.h" diff --git a/firmware/target/hosted/sdl/button-sdl.c b/firmware/target/hosted/sdl/button-sdl.c index e1a5947d54..74019f9970 100644 --- a/firmware/target/hosted/sdl/button-sdl.c +++ b/firmware/target/hosted/sdl/button-sdl.c @@ -32,7 +32,9 @@ #include "backlight.h" #include "system.h" #include "button-sdl.h" +#if SDL_MAJOR_VERSION > 1 #include "window-sdl.h" +#endif #include "sim_tasks.h" #include "buttonmap.h" #include "debug.h" @@ -241,10 +243,15 @@ static void mouse_event(SDL_MouseButtonEvent *event, bool button_up) static bool event_handler(SDL_Event *event) { +#if SDL_MAJOR_VERSION > 1 SDL_Keycode ev_key; +#else + SDLKey ev_key; +#endif switch(event->type) { +#if SDL_MAJOR_VERSION > 1 case SDL_WINDOWEVENT: if (event->window.event == SDL_WINDOWEVENT_FOCUS_GAINED) sdl_app_has_input_focus = 1; @@ -263,6 +270,7 @@ static bool event_handler(SDL_Event *event) last_tick = current_tick; #endif } +#endif /* SDL_MAJOR_VERSION */ #ifdef SIMULATOR if (event->window.event == SDL_WINDOWEVENT_FOCUS_LOST || event->window.event == SDL_WINDOWEVENT_LEAVE @@ -578,8 +586,12 @@ static void button_event(int key, bool pressed) return; #endif #endif -#if (CONFIG_PLATFORM & PLATFORM_PANDORA) +#if (CONFIG_PLATFORM & PLATFORM_PANDORA) || defined(RG_NANO) +#ifdef RG_NANO + case SDLK_q: +#else case SDLK_LCTRL: +#endif /* Will post SDL_USEREVENT in shutdown_hw() if successful. */ sys_poweroff(); break; diff --git a/firmware/target/hosted/sdl/lcd-bitmap.c b/firmware/target/hosted/sdl/lcd-bitmap.c index 22d48fd2b1..c50d5fdb00 100644 --- a/firmware/target/hosted/sdl/lcd-bitmap.c +++ b/firmware/target/hosted/sdl/lcd-bitmap.c @@ -142,7 +142,7 @@ void lcd_update_rect(int x_start, int y_start, int width, int height) background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0); } -#ifdef HAVE_BACKLIGHT +#if defined(HAVE_BACKLIGHT) && (SDL_MAJOR_VERSION > 1) void sim_backlight(int value) { #if LCD_DEPTH <= 8 @@ -185,7 +185,9 @@ void lcd_init_device(void) #if LCD_DEPTH >= 16 lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, SIM_LCD_WIDTH, SIM_LCD_HEIGHT, LCD_DEPTH, 0, 0, 0, 0); +#if SDL_MAJOR_VERSION > 1 SDL_SetSurfaceBlendMode(lcd_surface, SDL_BLENDMODE_BLEND); +#endif #elif LCD_DEPTH <= 8 lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, SIM_LCD_WIDTH, SIM_LCD_HEIGHT, 8, 0, 0, 0, 0); diff --git a/firmware/target/hosted/sdl/lcd-sdl.c b/firmware/target/hosted/sdl/lcd-sdl.c index 0731403f87..641fc3f1c3 100644 --- a/firmware/target/hosted/sdl/lcd-sdl.c +++ b/firmware/target/hosted/sdl/lcd-sdl.c @@ -23,7 +23,9 @@ #include "lcd-sdl.h" #include "sim-ui-defines.h" #include "system.h" /* for MIN() and MAX() */ +#if SDL_MAJOR_VERSION > 1 #include "window-sdl.h" +#endif void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width, int height, int max_x, int max_y, @@ -101,6 +103,8 @@ void sdl_gui_update(SDL_Surface *surface, int x_start, int y_start, int width, SDL_Rect src = {x_start, y_start, width, height}; SDL_Rect dest= {ui_x + x_start, ui_y + y_start, width, height}; + +#if SDL_MAJOR_VERSION > 1 uint8_t alpha; SDL_LockMutex(window_mutex); @@ -115,6 +119,14 @@ void sdl_gui_update(SDL_Surface *surface, int x_start, int y_start, int width, if (!sdl_window_adjust()) /* already calls sdl_window_render itself */ sdl_window_render(); SDL_UnlockMutex(window_mutex); +#else + if (surface->flags & SDL_SRCALPHA) /* alpha needs a black background */ + SDL_FillRect(gui_surface, &dest, 0); + + SDL_BlitSurface(surface, &src, gui_surface, &dest); + + SDL_Flip(gui_surface); +#endif } /* set a range of bitmap indices to a gradient from startcolour to endcolour */ @@ -130,7 +142,11 @@ void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end, palette[i].b = start->b + (end->b - start->b) * i / (steps - 1); } +#if SDL_MAJOR_VERSION > 1 SDL_SetPaletteColors(surface->format->palette, palette, first , steps); +#else + SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, first, steps); +#endif } int lcd_get_dpi(void) diff --git a/firmware/target/hosted/sdl/lcd-sdl.h b/firmware/target/hosted/sdl/lcd-sdl.h index fd1a0b9513..a4c57d1b3a 100644 --- a/firmware/target/hosted/sdl/lcd-sdl.h +++ b/firmware/target/hosted/sdl/lcd-sdl.h @@ -25,6 +25,10 @@ #include "lcd.h" #include "SDL.h" +#if SDL_MAJOR_VERSION == 1 +extern SDL_Surface *gui_surface; +#endif + void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width, int height, int max_x, int max_y, unsigned long (*getpixel)(int, int)); diff --git a/firmware/target/hosted/sdl/pcm-sdl.c b/firmware/target/hosted/sdl/pcm-sdl.c index 1bd50ebbd5..2b96c6a252 100644 --- a/firmware/target/hosted/sdl/pcm-sdl.c +++ b/firmware/target/hosted/sdl/pcm-sdl.c @@ -61,7 +61,9 @@ static const void *pcm_data; static size_t pcm_data_size; static size_t pcm_sample_bytes; static size_t pcm_channel_bytes; +#if SDL_MAJOR_VERSION > 1 static SDL_AudioDeviceID pcm_devid = 0; +#endif static struct pcm_udata { @@ -104,18 +106,26 @@ static void pcm_dma_apply_settings_nolock(void) wanted_spec.samples = MIX_FRAME_SAMPLES * 2; /* Should be 2048, ie ~5ms @44KHz */ wanted_spec.callback = sdl_audio_callback; wanted_spec.userdata = &udata; + +#if SDL_MAJOR_VERSION > 1 if (pcm_devid) SDL_CloseAudioDevice(pcm_devid); /* pulseaudio seems to be happier with smaller buffers */ if (!strcmp("pulseaudio", SDL_GetCurrentAudioDriver())) wanted_spec.samples = MIX_FRAME_SAMPLES; +#endif /* Open the audio device and start playing sound! */ +#if SDL_MAJOR_VERSION > 1 if((pcm_devid = SDL_OpenAudioDevice(audiodev, 0, &wanted_spec, &obtained, SDL_AUDIO_ALLOW_SAMPLES_CHANGE)) == 0) { +#else + if(SDL_OpenAudio(&wanted_spec, &obtained) < 0) { +#endif panicf("Unable to open audio: %s", SDL_GetError()); return; } + switch (obtained.format) { case AUDIO_U8: @@ -128,12 +138,14 @@ static void pcm_dma_apply_settings_nolock(void) case AUDIO_S16MSB: pcm_channel_bytes = 2; break; +#if SDL_MAJOR_VERSION > 1 /* Not supported by SDL 1.2 */ case AUDIO_S32MSB: case AUDIO_S32LSB: case AUDIO_F32MSB: case AUDIO_F32LSB: pcm_channel_bytes = 4; break; +#endif default: panicf("Unknown sample format obtained: %u", (unsigned)obtained.format); @@ -161,12 +173,21 @@ void pcm_play_dma_start(const void *addr, size_t size) pcm_data = addr; pcm_data_size = size; +#if SDL_MAJOR_VERSION > 1 SDL_PauseAudioDevice(pcm_devid, 0); +#else + SDL_PauseAudio(0); +#endif } void pcm_play_dma_stop(void) { +#if SDL_MAJOR_VERSION > 1 SDL_PauseAudioDevice(pcm_devid, 1); +#else + SDL_PauseAudio(1); +#endif + #ifdef DEBUG if (udata.debug != NULL) { fclose(udata.debug); diff --git a/firmware/target/hosted/sdl/system-sdl.c b/firmware/target/hosted/sdl/system-sdl.c index b0a5ef8b4c..56e797ac5b 100644 --- a/firmware/target/hosted/sdl/system-sdl.c +++ b/firmware/target/hosted/sdl/system-sdl.c @@ -33,7 +33,9 @@ #include "thread-sdl.h" #include "system-sdl.h" #include "sim-ui-defines.h" +#if SDL_MAJOR_VERSION > 1 #include "window-sdl.h" +#endif #include "button-sdl.h" #include "lcd-bitmap.h" #ifdef HAVE_REMOTE_LCD @@ -50,6 +52,10 @@ #define SIMULATOR_DEFAULT_ROOT "simdisk" +#if SDL_MAJOR_VERSION == 1 +SDL_Surface *gui_surface; +#endif + bool background = true; /* use backgrounds by default */ #ifdef HAVE_REMOTE_LCD bool showremote = true; /* include remote by default */ @@ -92,7 +98,7 @@ static int sdl_event_thread(void * param) SDL_sem *wait_for_maemo_startup; #endif -#if (CONFIG_PLATFORM & (PLATFORM_MAEMO|PLATFORM_PANDORA)) +#if (CONFIG_PLATFORM & (PLATFORM_MAEMO|PLATFORM_PANDORA)) || defined(RG_NANO) /* SDL touch screen fix: Work around a SDL assumption that returns relative mouse coordinates when you get to the screen edges using the touchscreen and a disabled mouse cursor. @@ -112,6 +118,27 @@ static int sdl_event_thread(void * param) SDL_DestroySemaphore(wait_for_maemo_startup); #endif +#if SDL_MAJOR_VERSION == 1 + SDL_InitSubSystem(SDL_INIT_VIDEO); + + SDL_Surface *picture_surface = NULL; + int depth; + Uint32 flags; + + depth = LCD_DEPTH; + if (depth < 8) + depth = 16; + + flags = SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN; + + if ((gui_surface = SDL_SetVideoMode(LCD_WIDTH, LCD_HEIGHT, depth, flags)) == NULL) { + panicf("%s", SDL_GetError()); + } + + if (background && picture_surface != NULL) + SDL_BlitSurface(picture_surface, NULL, gui_surface, NULL); +#endif + /* let system_init proceed */ SDL_SemPost((SDL_sem *)param); @@ -189,8 +216,11 @@ void sim_do_exit() #endif sim_kernel_shutdown(); + +#if SDL_MAJOR_VERSION > 1 SDL_UnlockMutex(window_mutex); SDL_DestroyMutex(window_mutex); +#endif SDL_Quit(); exit(EXIT_SUCCESS); @@ -228,12 +258,21 @@ void system_init(void) #ifndef __WIN32 /* Fails on Windows */ SDL_InitSubSystem(SDL_INIT_VIDEO); + +#if SDL_MAJOR_VERSION > 1 sdl_window_setup(); #endif +#endif #ifndef __APPLE__ /* MacOS requires events to be handled on main thread */ s = SDL_CreateSemaphore(0); /* 0-count so it blocks */ - evt_thread = SDL_CreateThread(sdl_event_thread, NULL, s); + + #if SDL_MAJOR_VERSION > 1 + evt_thread = SDL_CreateThread(sdl_event_thread, NULL, s); + #else + evt_thread = SDL_CreateThread(sdl_event_thread, s); + #endif /* SDL_MAJOR_VERSION */ + SDL_SemWait(s); /* cleanup */ SDL_DestroySemaphore(s); @@ -311,6 +350,7 @@ void sys_handle_argv(int argc, char *argv[]) printf("Disabling remote image.\n"); } #endif +#if SDL_MAJOR_VERSION > 1 else if (!strcmp("--zoom", argv[x])) { x++; @@ -320,6 +360,7 @@ void sys_handle_argv(int argc, char *argv[]) display_zoom = 2; printf("Window zoom is %f\n", display_zoom); } +#endif else if (!strcmp("--alarm", argv[x])) { sim_alarm_wakeup = true; @@ -374,7 +415,9 @@ void sys_handle_argv(int argc, char *argv[]) } } } +#if SDL_MAJOR_VERSION > 1 if (display_zoom != 1) { background = false; } +#endif } diff --git a/firmware/target/hosted/sdl/thread-sdl.c b/firmware/target/hosted/sdl/thread-sdl.c index abd6339cee..0858d11a87 100644 --- a/firmware/target/hosted/sdl/thread-sdl.c +++ b/firmware/target/hosted/sdl/thread-sdl.c @@ -340,7 +340,12 @@ unsigned int create_thread(void (*function)(void), return 0; } +#if SDL_MAJOR_VERSION > 1 SDL_Thread *t = SDL_CreateThread(runthread, NULL, thread); +#else + SDL_Thread *t = SDL_CreateThread(runthread, thread); +#endif + if (t == NULL) { DEBUGF("Failed to create SDL thread\n"); diff --git a/packaging/rgnano/config.cfg b/packaging/rgnano/config.cfg new file mode 100644 index 0000000000..36ccc7389b --- /dev/null +++ b/packaging/rgnano/config.cfg @@ -0,0 +1,7 @@ +# .cfg file created by rockbox c145f41658-250621 - http://www.rockbox.org + +idle poweroff: 0 +font: /FunKey/rockbox/fonts/16-WenQangYi-Unibit.fnt +database scan paths: /Music +qs top: brightness +qs bottom: brightness diff --git a/packaging/rgnano/icon.png b/packaging/rgnano/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f24807e438b6e4fca14561318d5eac3671b3e37f GIT binary patch literal 1234 zcmV;@1TFiCP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igiA z5icrHM3oo-000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000CnNkl7yzjl-3;AnAK;uUt(Mo2<9bz_kGXv zyw7>g_j}HB1Rww}a4RquFbCe<4AX!G_<`#{zy!Q2v&pI5Om#{UJ}EJ{iKcAq-`e@P zvX-jjKXFz7DQ)jjpPtFG(eu944sRa;mjMMnD9Qmt&Q2XJHuK|M8(1fSxoIh64;5$_ zw(o;?8o=KN>t6w1IW%7!J8sGV(o)F*=1Ra650#VA+tKBKTyN$)PV4ADmE*e8+$hDsZ;HS}N@3 zaSPIu4fbw@ifW77<0Kt^O-DE6-Y2-{PU%nu!#UufWX6E-4I}(qR%~+j9fIPD5YN_F z?Elo}{&gXq*=1qd5#mjU1745BWx}slHChYmPuVoLY2srcKg;0EK@T<0x!8Ba=G~*V za}Fpi96@VAa=hT{a|)#eukN>~t#b3(n;wpRYjf(XV$)+TlH$Y3MT$2q8D^$S8k-eO zZJIq>q9|YC;@*V@J2tzitPau}fYbyLUM8n9R9ZSl;nMK_yLC^He4lIR{l=0gGExnm z+!5q_i=wp16*1N@4oJr+Epih(U+}{Po64R2baV@}me@*=?=v~}okfAqqd=) z+%s-}Du$}Py{szm;-2WpR!onCPVn#p9^w{A4xjwj83|`Q0i`7sWw-EFeE?g{vI?A{ zFvrUue=8cBLXlNq>#1`flDSOCT@uAN=YnKsdM8zZR$5Nl6He8>YW# launch rockbox -> restore previous values +CUR_VOL=$(volume get) +CUR_BL=$(cat $BLPATH) +volume set 100 + +./rockbox + +volume set $CUR_VOL +echo $CUR_BL > $BLPATH diff --git a/tools/configure b/tools/configure index 95e7b88d64..dadd423e03 100755 --- a/tools/configure +++ b/tools/configure @@ -964,6 +964,53 @@ mipsellinuxcc () { prefixtools "mipsel-rockbox-linux-gnu-" } +rgnanocc () { + if [ -z "$FUNKEY_SDK_PATH" ]; then + echo "ERROR: You need the FunKey-SDK installed and have the FUNKEY_SDK_PATH" + echo "environment variable point to the root directory of the FunKey-SDK." + echo "More info at https://wiki.funkey-project.com/wiki/Setting_up_the_SDK" + exit + fi + + $FUNKEY_SDK_PATH/relocate-sdk.sh + + arch="arm" + arch_version="7" + arch_profile="classic" + + CC=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-gcc + CPP=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-cpp + LD=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-ld + AR=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-gcc-ar + AS=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-as + OC=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-objcopy + WINDRES=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-windres + DLLTOOL=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-dlltool + DLLWRAP=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-dllwrap + RANLIB=$FUNKEY_SDK_PATH/bin/arm-funkey-linux-musleabihf-gcc-ranlib + + GCCOPTS=`echo $CCOPTS | sed -e s/\ -ffreestanding// -e s/\ -nostdlib// -e s/\ -Wundef//` + + if [ "yes" = "$use_debug" ]; then + GCCOPTS=`echo $GCCOPTS | sed -e s/\ -Os/\ -Og/` + fi + + GCCOPTS="$GCCOPTS -fno-builtin -g -Wno-unused-result" + GCCOPTS="$GCCOPTS -I$FUNKEY_SDK_PATH/arm-funkey-linux-musleabihf/sysroot/usr/include/SDL" + GCCOPTS="$GCCOPTS -D_GNU_SOURCE=1 -D_REENTRANT -masm-syntax-unified" + + SHARED_LDFLAGS="-shared" + SHARED_CFLAGS="-fPIC -fvisibility=hidden" + + LDOPTS="-lm -ldl $LDOPTS -L$FUNKEY_SDK_PATH/arm-funkey-linux-musleabihf/sysroot/usr/lib -lSDL -lpthread" + GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-z,defs" + + thread_support="HAVE_SDL_THREADS" + sdl="$FUNKEY_SDK_PATH/arm-funkey-linux-musleabihf/sysroot/usr/bin/sdl-config" + rbdir="/FunKey/rockbox" +} + + do_bootloader() { appsdir='$(ROOTDIR)/bootloader' apps="bootloader" @@ -1720,19 +1767,19 @@ cat < +# +# Progress Bar +%V(10,162,220,15,-) +%pb(0,0,220,15,pb-240x240x16.bmp) +# +# Hold +%V(10,207,30,23,-) +%?mh<%xd(Aa)|%xd(Ab)> +# +# Battery +%V(47,207,44,23,-) +%?bp<%?bc<%xd(Ba)|%xd(Bb)>|%?bl<|%xd(Bc)|%xd(Bd)|%xd(Be)|%xd(Bf)|%xd(Bg)|%xd(Bh)|%xd(Bi)|%xd(Bj)>> +# +# Volume +%V(96,207,34,23,-) +%?pv<%xd(Ca)|%xd(Cb)|%xd(Cc)|%xd(Cd)|%xd(Ce)|%xd(Cf)|%xd(Cg)|%xd(Ch)|%xd(Ci)|%xd(Cj)> +# +# Shuffle +%V(137,211,37,16,-) +%?ps<%xd(D)> +# +# Repeat +%V(181,207,18,23,-) +%?mm<|%xd(Ea)|%xd(Eb)|%xd(Ec)|%xd(Ed)> +# +# Playmode +%V(206,207,24,23,-) +%?mp<%xd(Fa)|%xd(Fb)|%xd(Fc)|%xd(Fd)|%xd(Fe)> +# +# Time Elapsed/Remaining +%V(10,180,220,20,3) +%al%pc%ac%?Sr<%pe %Sx(of) %pp|%pp %Sx(of) %pe>%ar%pr +# +# Album Art +%ax%Vl(a,10,42,100,100,-) +%Cl(0,0,100,100,c,c) +%Cd +# +# Track Info - Album Art +%ax%Vl(a,113,40,-,130,3) +%s%al%?id<%id|%?d(1)<%d(1)|%(root%)>> +%s%al%?it<%it|%fn> +%s%al%?ia<%ia|%?iA<%iA|%?d(2)<%d(2)|%(root%)>>> +%s%al%?iy<%iy> + +%s%al%Sx(Next Track:) +%s%al%?It<%It|%Fn> +%s%al%?Ia<%Ia|%?IA<%IA>> +# +# Track Info - No Album Art +%ax%Vl(b,0,30,-,130,3) +%s%ac%?id<%id|%?d(1)<%d(1)|%(root%)>> +%s%ac%?it<%it|%fn> +%s%ac%?ia<%ia|%?iA<%iA|%?d(2)<%d(2)|%(root%)>>> +%s%ac%?iy<%iy> + +%ac%Sx(Next Track:) +%s%ac%?It<%It|%Fn> +%s%ac%?Ia<%Ia|%?IA<%IA>> diff --git a/wps/cabbiev2/battery-240x240x16.bmp b/wps/cabbiev2/battery-240x240x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..afd7a248c24eba60c31e2d9ec4d1d7c67f940965 GIT binary patch literal 30414 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 QJt^3D9sUVe^4j?S1x^`eX8-^I literal 0 HcmV?d00001 diff --git a/wps/cabbiev2/repeat-240x240x16.bmp b/wps/cabbiev2/repeat-240x240x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0fafa8b7959c053f28e773ea0211688fd046c155 GIT binary patch literal 5206 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 literal 0 HcmV?d00001 diff --git a/wps/cabbiev2/shuffle-240x240x16.bmp b/wps/cabbiev2/shuffle-240x240x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..40edff23975a624dc8e77915f8abeaa6b6eba1c2 GIT binary patch literal 1848 zcmZ`&4NOy46h8Oe``&ADP88jUQ#W<~B^&D8@Q2Mf7r|^pB5!Kt~4#qii7jXMe6VeXg|QB+0aqycTZh zl~U4vI(p)>Jj8Q~pmD)azy+Cz!$ghogy$LtGn@lXJBnXTa$6wV20xU+!EnU!nHESp2g#<8r4+*< zGs(Ror4%tmVUuQ%EIY}rr=MJ}OuOIL2EtG?!b=>{6}F&ps;W3q;p znM_w~CB+?Z{1P0lgzu~1Xf=;BYI%&6Bh`@KEbYye$4nwwHpsTaDJvM;@m*Qm7fe>U zlpIpSIDw{`pyCFUx}f+vl(@)ww{+M{XT}MT%v7C}Rsw}iIA()%E1a-HUMnfQMhdP% z))mOG@?uUC7@hRZ7`pQ$7~0^N6;9cC%X4li>3|$LMs&okC@JgdzCtj&A*TgSJK#(+ zC**bT6iut=U*qDX9=tC(JOYVPG_?q-??Z_P zjNP=LOJC5X7`j;L4Jf~ZUxOy@0rPEI>{0VOSy4Cqe3!1=Cd-NvIhy1&Ld9*J!L3n{ zr3kK!fiMi@{7!w5TUT+1)ZC{BO655pZK3;%!Qz7|FI?!6D|+6kxgT%!#a{A8R`x)7 z50u>-cA@73i+53-@6{SFl;4%#dS6i#Y{?RKK(%*tt#5(F8(-&JY~_aBg>@l|tMe_g z`sQ1_BdWb%{Y5%m&tjJ+$_%PAgcd+~ME?01NQ=er074KeNlBnpzL?d;oXe7vrs^TN3 znuz_;)VBUFUH!W}Pj-8rBzE>sYwd^2kMNJ7M!c-5_+%Wu-Y^f-f`#iR}?o+@m{A z;86&ub$iOvf|o{;>?=`if2{5Lb8zGD_-kNmzEOt`{}*b#s>AvG(CL+F@3Lh{blqOM zF$F)eGGiVGX*RH_x)4unI(hD5u=(}Qzlc3Zj#=cGcrJ<<4K?5sbiDMmiWyI}95Gsk o9%&-xhx}aRTtp=3mFNYe>?T+q&}~Q5QR4)Hqci|#h-f>&-;}oxWB>pF literal 0 HcmV?d00001 diff --git a/wps/cabbiev2/volume-240x240x16.bmp b/wps/cabbiev2/volume-240x240x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5120ce88bf7c4682deaf064c0c7ebbea95314031 GIT binary patch literal 23974 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 literal 0 HcmV?d00001 diff --git a/wps/cabbiev2/wpsbackdrop-240x240x16.bmp b/wps/cabbiev2/wpsbackdrop-240x240x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2eff65809a645dd755743b443eb5ab74df5926d3 GIT binary patch literal 230538 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�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%0Df_e!P5m4vU+F}iwZ^=< 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