├── .gitignore ├── src ├── ScreenManager.h ├── Component.h ├── App.h ├── ScreenManager.cpp ├── AppManager.h ├── ComponentApp.cpp ├── ComponentApp.h ├── components │ ├── LAppComponent.cpp │ ├── LAppComponent.h │ ├── ReaderComponent.h │ ├── MenuComponent.h │ ├── ReaderComponent.cpp │ └── MenuComponent.cpp ├── Utils.h ├── Action.cpp ├── Action.h ├── AppManager.cpp ├── assets │ └── hydra.h ├── apps │ ├── Calculator │ │ ├── Calculator.cpp │ │ └── icon.h │ ├── Launcher │ │ └── Launcher.cpp │ ├── LEDApp │ │ ├── LEDApp.cpp │ │ └── icon.h │ ├── DinoRunner │ │ ├── DinoRunner.cpp │ │ └── icon.h │ ├── AudioRecorder │ │ ├── AudioRec.cpp │ │ └── icon.h │ └── Settings │ │ ├── Settings.cpp │ │ └── icon.h ├── main.cpp └── Utils.cpp ├── test └── README ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── pio.yml ├── platformio.ini ├── CONTRIBUTING.md ├── LICENSE ├── lib └── README ├── include └── README ├── CODE_OF_CONDUCT.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .idea -------------------------------------------------------------------------------- /src/ScreenManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 13.01.2024. 3 | // 4 | 5 | #ifndef SCREENMANAGER_H 6 | #define SCREENMANAGER_H 7 | 8 | #pragma once 9 | 10 | #include "M5Cardputer.h" 11 | #include "M5GFX.h" 12 | 13 | class StatusBar { 14 | public: 15 | static void draw(bool force = false); 16 | }; 17 | 18 | class ScreenManager { 19 | public: 20 | static M5Canvas getCanvas(); 21 | }; 22 | 23 | extern M5Canvas canvas; // NOLINT(*-interfaces-global-init) 24 | 25 | #endif //SCREENMANAGER_H 26 | -------------------------------------------------------------------------------- /src/Component.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #ifndef CARDPUTERTOOLBOX_COMPONENT_H 6 | #define CARDPUTERTOOLBOX_COMPONENT_H 7 | 8 | class Component { 9 | public: 10 | virtual ~Component() = default; 11 | 12 | virtual void initComponent() = 0; 13 | virtual void renderComponent() = 0; 14 | virtual void updateComponent() = 0; 15 | virtual void closeComponent() = 0; 16 | virtual void forceRerender() { 17 | renderComponent(); 18 | } 19 | }; 20 | 21 | 22 | #endif //CARDPUTERTOOLBOX_COMPONENT_H 23 | -------------------------------------------------------------------------------- /test/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for PlatformIO Test Runner and project tests. 3 | 4 | Unit Testing is a software testing method by which individual units of 5 | source code, sets of one or more MCU program modules together with associated 6 | control data, usage procedures, and operating procedures, are tested to 7 | determine whether they are fit for use. Unit testing finds problems early 8 | in the development cycle. 9 | 10 | More information about PlatformIO Unit Testing: 11 | - https://docs.platformio.org/en/latest/advanced/unit-testing/index.html 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Do '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Additional context** 24 | Add any other context about the problem here. 25 | -------------------------------------------------------------------------------- /src/App.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "cstdint" 3 | 4 | class App { 5 | public: 6 | // destructor 7 | virtual ~App() = default; 8 | 9 | // app name 10 | virtual const char* getName() { 11 | return nullptr; 12 | }; 13 | 14 | // app lifecycle 15 | virtual void onAppOpen() = 0; 16 | virtual void onAppClose() = 0; 17 | virtual void onAppTick() = 0; 18 | virtual void draw() = 0; 19 | virtual const uint8_t* getIcon() { 20 | return nullptr; 21 | }; 22 | virtual int getIconSize() { 23 | return 0; 24 | }; 25 | }; 26 | 27 | -------------------------------------------------------------------------------- /src/ScreenManager.cpp: -------------------------------------------------------------------------------- 1 | #include "ScreenManager.h" 2 | #include "AppManager.h" 3 | 4 | M5Canvas canvas = M5Canvas(&M5Cardputer.Lcd); 5 | 6 | void StatusBar::draw(bool force) { 7 | canvas.fillScreen(BLACK); 8 | canvas.setTextSize(1); 9 | canvas.setTextColor(WHITE); 10 | canvas.createSprite(240, 130); 11 | canvas.drawRoundRect(5, 5, 230, 125, 7, WHITE); 12 | canvas.drawFastHLine(5, 20, 230, WHITE); 13 | canvas.drawString("HydraOS 2.0.0", 10, 9); 14 | canvas.drawRightString(AppManager::getInstance().getCurrentAppName(), 230, 9); 15 | } 16 | 17 | M5Canvas ScreenManager::getCanvas() { 18 | return canvas; 19 | } -------------------------------------------------------------------------------- /src/AppManager.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include "App.h" 7 | 8 | class AppManager { 9 | private: 10 | std::map apps{}; 11 | AppManager(); 12 | public: 13 | App *currentApp = nullptr; 14 | 15 | static AppManager& getInstance(); 16 | void addApp(const std::string& name, App* app); 17 | void openApp(const std::string& name); 18 | void closeCurrentApp(); 19 | void tickCurrentApp() const; 20 | void draw() const; 21 | String getCurrentAppName() const; 22 | std::map listApps(); 23 | App* getApp(const std::string& name); 24 | 25 | }; -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context about the feature request here. 21 | -------------------------------------------------------------------------------- /src/ComponentApp.cpp: -------------------------------------------------------------------------------- 1 | #include "ComponentApp.h" 2 | 3 | const char *ComponentApp::getName() { 4 | return nullptr; 5 | } 6 | 7 | void ComponentApp::onAppOpen() { 8 | currentComponent = &initApp(); 9 | currentComponent->initComponent(); 10 | } 11 | 12 | void ComponentApp::onAppClose() { 13 | currentComponent->closeComponent(); 14 | } 15 | 16 | void ComponentApp::onAppTick() { 17 | currentComponent->updateComponent(); 18 | } 19 | 20 | void ComponentApp::draw() { 21 | currentComponent->renderComponent(); 22 | } 23 | 24 | void ComponentApp::setComponent(Component *component) { 25 | currentComponent->closeComponent(); 26 | currentComponent = component; 27 | currentComponent->initComponent(); 28 | } 29 | -------------------------------------------------------------------------------- /src/ComponentApp.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #ifndef CARDPUTERTOOLBOX_COMPONENTAPP_H 6 | #define CARDPUTERTOOLBOX_COMPONENTAPP_H 7 | 8 | #include "App.h" 9 | #include 10 | #include 11 | #include 12 | 13 | class ComponentApp : public App { 14 | protected: 15 | Component *currentComponent = nullptr; 16 | 17 | public: 18 | const char *getName() override; 19 | 20 | void onAppOpen() override; 21 | 22 | void onAppClose() override; 23 | 24 | void onAppTick() override; 25 | 26 | void draw() override; 27 | 28 | void setComponent(Component *component); 29 | 30 | virtual Component& initApp() = 0; 31 | }; 32 | 33 | 34 | #endif //CARDPUTERTOOLBOX_COMPONENTAPP_H 35 | -------------------------------------------------------------------------------- /src/components/LAppComponent.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 29.02.2024. 3 | // 4 | 5 | #include 6 | #include "LAppComponent.h" 7 | 8 | LAppComponent::LAppComponent(ComponentApp ¤tapp, 9 | const std::function &openfunc, 10 | const std::function &closefunc, 11 | const std::function &tickfunc, 12 | const std::function &drawfunc 13 | ) : app(currentapp), openfunc(openfunc), closefunc(closefunc), tickfunc(tickfunc), drawfunc(drawfunc) { 14 | 15 | } 16 | 17 | 18 | void LAppComponent::initComponent() { 19 | openfunc(); 20 | } 21 | 22 | void LAppComponent::renderComponent() { 23 | drawfunc(); 24 | } 25 | 26 | void LAppComponent::updateComponent() { 27 | tickfunc(); 28 | } 29 | 30 | void LAppComponent::closeComponent() { 31 | closefunc(); 32 | } 33 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [env:esp32-s3-devkitc-1] 12 | platform = espressif32 13 | board = esp32-s3-devkitc-1 14 | framework = arduino 15 | lib_deps = 16 | https://github.com/m5stack/M5Unified 17 | https://github.com/m5stack/M5Cardputer 18 | https://github.com/codeplea/tinyexpr 19 | adafruit/Adafruit NeoPixel@^1.12.2 20 | https://github.com/schreibfaul1/ESP32-audioI2S 21 | monitor_filters = esp32_exception_decoder 22 | build_flags = 23 | -D ARDUINO_USB_MODE=1 24 | -D ARDUINO_USB_CDC_ON_BOOT=1 -------------------------------------------------------------------------------- /src/components/LAppComponent.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 29.02.2024. 3 | // 4 | 5 | #ifndef LAPPCOMPONENT_H 6 | #define LAPPCOMPONENT_H 7 | #include 8 | #include 9 | 10 | 11 | class LAppComponent : public Component { 12 | ComponentApp &app; 13 | std::function openfunc; 14 | std::function closefunc; 15 | std::function tickfunc; 16 | std::function drawfunc; 17 | public: 18 | explicit LAppComponent(ComponentApp ¤tapp, 19 | const std::function &openfunc, 20 | const std::function &closefunc, 21 | const std::function &tickfunc, 22 | const std::function &drawfunc 23 | ); 24 | 25 | void initComponent() override; 26 | void renderComponent() override; 27 | void updateComponent() override; 28 | void closeComponent() override; 29 | }; 30 | 31 | 32 | 33 | #endif //LAPPCOMPONENT_H 34 | -------------------------------------------------------------------------------- /.github/workflows/pio.yml: -------------------------------------------------------------------------------- 1 | name: PlatformIO CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v3 11 | - uses: actions/cache@v3 12 | with: 13 | path: | 14 | ~/.cache/pip 15 | ~/.platformio/.cache 16 | key: ${{ runner.os }}-pio 17 | - uses: actions/setup-python@v4 18 | with: 19 | python-version: '3.11' 20 | - name: Install PlatformIO Core 21 | run: pip install --upgrade platformio 22 | 23 | - name: Build PlatformIO Project 24 | run: pio run 25 | - uses: actions/upload-artifact@v4 26 | with: 27 | # Name of the artifact to upload. 28 | # Optional. Default is 'artifact' 29 | name: firmware 30 | 31 | # A file, directory or wildcard pattern that describes what to upload 32 | # Required. 33 | path: ".pio/build/esp32-s3-devkitc-1/firmware.bin" 34 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute to HydraOS 2 | 3 | #### **Did you find a bug?** 4 | 5 | * **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/WauHundeland/HydraOS/issues). 6 | 7 | * If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/WauHundeland/HydraOS/issues/new). Be sure to include a **title and clear description**, and as much relevant information as possible. 8 | 9 | #### **Did you fix a bug?** 10 | 11 | * Open a new GitHub pull request with the patch. 12 | 13 | * Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. 14 | 15 | #### **Did you fix whitespace, format code, or make a purely cosmetic patch?** 16 | 17 | * Changes that are cosmetic in nature and do not add anything substantial to the stability, functionality, or testability of HydraOS will generally not be accepted. 18 | 19 | #### **Do you have questions about the source code?** 20 | 21 | * Feel free to ask me on Discord: @wauhundeland 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 WauHundeland 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /src/components/ReaderComponent.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #ifndef CARDPUTERTOOLBOX_READERCOMPONENT_H 6 | #define CARDPUTERTOOLBOX_READERCOMPONENT_H 7 | 8 | #include "Component.h" 9 | #include "ComponentApp.h" 10 | #include "Action.h" 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include "SD.h" 16 | #include "../AppManager.h" 17 | 18 | // typedefs 19 | typedef enum { 20 | READER_TYPE_LIST, 21 | READER_TYPE_LIST_WITH_DESCRIPTION, 22 | READER_TYPE_LIST_WITH_ICON, 23 | READER_TYPE_LIST_WITH_DESCRIPTION_AND_ICON, 24 | } ReaderType; 25 | 26 | class ReaderComponent : public Component { 27 | private: 28 | int scrollOffset = 0; // Add this line 29 | std::vector lines; // Add this line 30 | 31 | ComponentApp &app; 32 | ReaderType readerType; 33 | Action closeAction; 34 | boolean needRedraw = true; 35 | 36 | public: 37 | ReaderComponent(ComponentApp ¤tapp, ReaderType readerType, const std::vector &lines, 38 | Action action); 39 | 40 | void initComponent() override; 41 | void renderComponent() override; 42 | void updateComponent() override; 43 | void closeComponent() override; 44 | }; 45 | 46 | 47 | 48 | #endif //CARDPUTERTOOLBOX_READERCOMPONENT_H 49 | -------------------------------------------------------------------------------- /src/Utils.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 13.01.2024. 3 | // 4 | 5 | #ifndef UTILS_H 6 | #define UTILS_H 7 | #include 8 | #include 9 | 10 | 11 | class Utils { 12 | public: 13 | // wait for input and return the input 14 | // x: x position of the input 15 | // hdl_t: height of the input 16 | // passwordMode: if true, the input will be hidden 17 | static void waitForInput(String &input, int x = 27, int hdl_t = 10, bool passwordMode = false); 18 | 19 | // wait for a key to be pressed 20 | static void waitForKey(); 21 | 22 | // popup a message 23 | // text: the message to be displayed 24 | // waitMode: 0: wait for a key to be pressed, 1: wait for 5 seconds 25 | // textSize: the size of the text 26 | static void popup(const String& text, int waitMode = 0, float textSize = 1); 27 | 28 | // don't use this function, use the popup function instead 29 | static void sdPopup(const String &text, const String &path, int waitMode = 0); 30 | 31 | // initialize the canvas 32 | static void initCanvas(); 33 | 34 | // split a string by a delimiter 35 | static std::vector splitString(const String &s, char delimiter); 36 | 37 | static void centerInput(String &input, const int x, const int hdl_t, const bool passwordMode); 38 | }; 39 | 40 | 41 | 42 | #endif //UTILS_H 43 | -------------------------------------------------------------------------------- /src/components/MenuComponent.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #ifndef CARDPUTERTOOLBOX_MENUCOMPONENT_H 6 | #define CARDPUTERTOOLBOX_MENUCOMPONENT_H 7 | 8 | #include "Component.h" 9 | #include "Action.h" 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "SD.h" 15 | #include "../AppManager.h" 16 | 17 | // typedefs 18 | typedef enum { 19 | MENU_TYPE_LIST, 20 | MENU_TYPE_LIST_WITH_DESCRIPTION, 21 | MENU_TYPE_LIST_WITH_ICON, 22 | MENU_TYPE_LIST_WITH_DESCRIPTION_AND_ICON, 23 | } MenuType; 24 | 25 | class MenuComponent : public Component { 26 | private: 27 | std::vector functions{}; 28 | std::vector::iterator currentFunctionIterator; 29 | 30 | int selectIndex; 31 | MenuType menuType; 32 | std::string iconNamespace; 33 | 34 | ComponentApp &app; 35 | bool drawFinished = false; 36 | public: 37 | boolean needRedraw; 38 | MenuComponent(ComponentApp ¤tapp, MenuType menuType, const std::vector &functions, std::string iconNamespace = ""); 39 | 40 | void initComponent() override; 41 | void renderComponent() override; 42 | void updateComponent() override; 43 | void closeComponent() override; 44 | void forceRerender() override; 45 | }; 46 | 47 | 48 | 49 | #endif //CARDPUTERTOOLBOX_MENUCOMPONENT_H 50 | -------------------------------------------------------------------------------- /include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /src/Action.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #include "Action.h" 6 | 7 | #include 8 | 9 | // constructors 10 | Action::Action(std::string id, std::string name, std::string description, std::string icon, std::function function) 11 | : id(std::move(id)), name(std::move(name)), description(std::move(description)), icon(std::move(icon)), function(std::move(function)) { 12 | type = ACTION_TYPE_FUNCTION; 13 | } 14 | 15 | // getters 16 | ActionType Action::getType() const { 17 | return type; 18 | } 19 | 20 | std::string Action::getId() const { 21 | return id; 22 | } 23 | 24 | std::string Action::getName() const { 25 | return name; 26 | } 27 | 28 | std::string Action::getDescription() const { 29 | return description; 30 | } 31 | 32 | std::string Action::getIcon() const { 33 | return icon; 34 | } 35 | 36 | std::basic_string Action::getApp() const { 37 | return app; 38 | } 39 | 40 | std::function Action::getFunction() const { 41 | return function; 42 | } 43 | 44 | Component *Action::getComponent() { 45 | return component; 46 | } 47 | 48 | // executer 49 | 50 | void Action::execute(ComponentApp &componentApp) const { 51 | switch (type) { 52 | case ACTION_TYPE_APP: 53 | AppManager::getInstance().openApp(app); 54 | break; 55 | case ACTION_TYPE_FUNCTION: 56 | function(); 57 | break; 58 | case ACTION_TYPE_COMPONENT: 59 | componentApp.setComponent(component); 60 | break; 61 | default: 62 | break; 63 | } 64 | } 65 | 66 | -------------------------------------------------------------------------------- /src/Action.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #ifndef CARDPUTERTOOLBOX_ACTION_H 6 | #define CARDPUTERTOOLBOX_ACTION_H 7 | 8 | #include 9 | #include 10 | #include "App.h" 11 | #include 12 | #include "ComponentApp.h" 13 | #include "AppManager.h" 14 | 15 | // action types 16 | typedef enum { 17 | ACTION_TYPE_NONE, 18 | ACTION_TYPE_APP, 19 | ACTION_TYPE_FUNCTION, 20 | ACTION_TYPE_COMPONENT, 21 | } ActionType; 22 | 23 | class Action { 24 | private: 25 | ActionType type = ACTION_TYPE_NONE; 26 | std::string id; 27 | std::string name; 28 | std::string description; 29 | std::string icon; 30 | 31 | // specific targets 32 | std::string app; 33 | std::function function; 34 | Component *component = nullptr; 35 | 36 | public: 37 | //Action(std::string id, std::string name, std::string description, std::string icon, Component *component); 38 | Action(std::string id, std::string name, std::string description, std::string icon, std::function function); 39 | //Action(std::string id, std::string name, std::string description, std::string icon, std::string app); 40 | 41 | // getters 42 | ActionType getType() const; 43 | std::string getId() const; 44 | std::string getName() const; 45 | std::string getDescription() const; 46 | std::string getIcon() const; 47 | std::basic_string getApp() const; 48 | std::function getFunction() const; 49 | Component *getComponent(); 50 | 51 | // executer 52 | void execute(ComponentApp &componentApp) const; 53 | }; 54 | 55 | 56 | #endif //CARDPUTERTOOLBOX_ACTION_H 57 | -------------------------------------------------------------------------------- /src/AppManager.cpp: -------------------------------------------------------------------------------- 1 | #include "AppManager.h" 2 | #include 3 | #include 4 | #include "assets/hydra.h" 5 | #include "ScreenManager.h" 6 | #include "Utils.h" 7 | 8 | AppManager::AppManager() = default; 9 | 10 | AppManager& AppManager::getInstance() { 11 | static AppManager instance; 12 | return instance; 13 | } 14 | 15 | void AppManager::addApp(const std::string& name, App* app) { 16 | apps[name] = app; 17 | } 18 | 19 | void AppManager::openApp(const std::string& name) { 20 | if (currentApp != nullptr) { 21 | currentApp->onAppClose(); 22 | } 23 | 24 | // try to find the app by name 25 | if (apps.find(name) == apps.end()) { 26 | Utils::popup("Error: App not found", 5000); 27 | return; 28 | } 29 | 30 | currentApp = apps[name]; 31 | Utils::initCanvas(); 32 | currentApp->onAppOpen(); 33 | } 34 | 35 | void AppManager::closeCurrentApp() { 36 | if (currentApp != nullptr) { 37 | currentApp->onAppClose(); 38 | currentApp = nullptr; 39 | } 40 | } 41 | 42 | void AppManager::tickCurrentApp() const { 43 | if (currentApp != nullptr) { 44 | currentApp->onAppTick(); 45 | } 46 | } 47 | 48 | void AppManager::draw() const { 49 | if (currentApp != nullptr) { 50 | currentApp->draw(); 51 | } 52 | } 53 | 54 | std::map AppManager::listApps() { 55 | return apps; 56 | } 57 | 58 | String AppManager::getCurrentAppName() const { 59 | if (currentApp != nullptr) { 60 | return currentApp->getName(); 61 | } else { 62 | return "Loading..."; 63 | } 64 | } 65 | 66 | App *AppManager::getApp(const std::string &name) { 67 | return apps[name]; 68 | } 69 | -------------------------------------------------------------------------------- /src/components/ReaderComponent.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #include "ReaderComponent.h" 6 | 7 | #include 8 | #include 9 | 10 | #include "ScreenManager.h" 11 | 12 | 13 | 14 | void ReaderComponent::initComponent() { 15 | canvas.setTextSize(1.7); 16 | } 17 | 18 | void ReaderComponent::renderComponent() { 19 | canvas.pushSprite(0, 20); 20 | } 21 | 22 | void ReaderComponent::updateComponent() { 23 | if (needRedraw) { 24 | canvas.setTextSize(1.7); 25 | canvas.fillScreen(TFT_BLACK); 26 | canvas.setCursor(0, 0); 27 | canvas.setTextSize(1); 28 | for (int i = scrollOffset; i < lines.size() && i < scrollOffset + 14; i++) { 29 | canvas.println(lines[i]); 30 | } 31 | needRedraw = false; 32 | } 33 | 34 | M5Cardputer.update(); 35 | if (M5Cardputer.Keyboard.isPressed()) { 36 | if (M5Cardputer.Keyboard.isKeyPressed('`')) { 37 | closeAction.execute(app); 38 | } 39 | if (M5Cardputer.Keyboard.isKeyPressed(';')) { 40 | scrollOffset--; // Scroll up when arrow up is pressed 41 | if (scrollOffset < 0) { 42 | scrollOffset = 0; // Don't scroll past the first line 43 | } 44 | needRedraw = true; 45 | } 46 | if (M5Cardputer.Keyboard.isKeyPressed('.')) { 47 | scrollOffset++; // Scroll down when arrow down is pressed 48 | if (scrollOffset >= lines.size()) { 49 | scrollOffset = lines.size() - 1; // Don't scroll past the last line 50 | } 51 | needRedraw = true; 52 | } 53 | } 54 | 55 | } 56 | 57 | void ReaderComponent::closeComponent() { 58 | } 59 | 60 | ReaderComponent::ReaderComponent(ComponentApp ¤tapp, const ReaderType readerType, const std::vector &lines, 61 | Action action) 62 | : app(currentapp), readerType(readerType), lines(lines), closeAction(std::move(action)) { 63 | // reset all fields 64 | scrollOffset = 0; 65 | }; 66 | -------------------------------------------------------------------------------- /src/assets/hydra.h: -------------------------------------------------------------------------------- 1 | #ifndef HYDRAOS_HYDRA_H 2 | #define HYDRAOS_HYDRA_H 3 | 4 | const uint8_t hydra[]={ 5 | 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x04,0x03,0x00,0x00,0x00,0x81,0x54,0x67,0xc7 6 | ,0x00,0x00,0x00,0x30,0x50,0x4c,0x54,0x45,0x28,0x00,0x00,0x00,0xa0,0x48,0x08,0x78,0x30,0x18,0xd0,0x68,0x18,0x40,0x18,0xe8,0x58,0x80,0x88,0x28,0x40,0xf0,0xe0,0x38 7 | ,0xa0,0x78,0x80,0xb0,0xc8,0x38,0xfb,0xfb,0xfb,0xb0,0x98,0x28,0x78,0x50,0x28,0xe8,0xa8,0xb8,0x58,0xb8,0x40,0x47,0x70,0x4c,0xb6,0x8b,0xd5,0xdc,0x00,0x00,0x00,0x10 8 | ,0x74,0x52,0x4e,0x53,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xe0,0x23,0x5d,0x19,0x00,0x00,0x01,0x23,0x49,0x44,0x41,0x54 9 | ,0x28,0xcf,0x75,0xd1,0x3b,0x4e,0xc4,0x30,0x10,0x06,0xe0,0x89,0x49,0x16,0x2d,0x42,0x72,0x66,0x9d,0x06,0xd1,0xc4,0x0e,0x07,0x88,0xe4,0x1c,0x80,0x2c,0x29,0x29,0xb6 10 | ,0xf1,0xd6,0x34,0xe4,0x00,0x08,0x29,0x2d,0x65,0x5a,0xfa,0x2d,0x52,0x70,0x87,0x2d,0x90,0x10,0xa7,0xa0,0xdb,0x3b,0xf8,0x06,0x30,0x8e,0xbd,0x0f,0x82,0x98,0xc6,0xca 11 | ,0xa7,0x3f,0x33,0x7e,0xc0,0xf7,0xa4,0xe0,0x2f,0xc0,0x14,0xce,0xf8,0xaf,0x34,0x41,0x19,0xbe,0x6d,0xe9,0x81,0xe9,0x10,0x89,0x02,0xd8,0xc2,0x47,0xc2,0x4a,0x20,0x29 12 | ,0x02,0x54,0x82,0x87,0x46,0x4c,0x94,0xb0,0x15,0x3a,0xbb,0x3b,0x80,0xd4,0xf5,0xf6,0x15,0xaf,0x9e,0x81,0x7b,0xb0,0x4c,0x54,0xd7,0x5d,0xd7,0x7d,0xd4,0x65,0x98,0x6d 13 | ,0xa5,0xa8,0xdf,0x9b,0x06,0xb3,0x82,0x7b,0x60,0x88,0x55,0xa3,0x75,0x8d,0x4b,0x0f,0xf6,0x09,0x5d,0xe9,0x0a,0xb3,0xf4,0x00,0x00,0x31,0xb5,0xc6,0xdb,0x11,0xce,0x25 14 | ,0x62,0x4a,0xfb,0x28,0x28,0xc2,0xf7,0x80,0xf9,0xe5,0x26,0x16,0xb5,0x07,0x96,0x11,0x2c,0xe6,0x73,0x88,0x2a,0x4c,0x47,0xa8,0x5d,0xcf,0xfb,0x0d,0xd0,0xf4,0x32,0x00 15 | ,0x75,0xb8,0x81,0xa5,0xc2,0x4a,0x73,0x37,0x85,0x7a,0x1a,0xe3,0x8e,0xa7,0xa4,0xf0,0x90,0x63,0xd2,0xb6,0x0f,0x2b,0x13,0x2f,0xd1,0x41,0xb4,0x60,0x32,0x5d,0xf7,0x9f 16 | ,0xb3,0xe4,0xe2,0x4d,0xee,0x81,0x22,0xfd,0xcb,0x30,0x0c,0xee,0xce,0xe9,0x0f,0x50,0x48,0x91,0x7e,0xc6,0xc7,0xb3,0x58,0xc5,0xe9,0x4a,0x52,0xd3,0xee,0xbe,0xfc,0x7d 17 | ,0x58,0xd7,0x57,0x61,0xb2,0xde,0x3d,0xae,0x8e,0x2f,0xc7,0x54,0x6e,0x5a,0x73,0x02,0x16,0x54,0x62,0x56,0xfc,0xf4,0x6d,0x69,0x5f,0xfc,0x9f,0xc7,0x9e,0xd4,0x0f,0xb0 18 | ,0x65,0x1f,0x7e,0x62,0x93,0x11,0x87,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82}; 19 | 20 | #endif //HYDRAOS_HYDRA_H 21 | -------------------------------------------------------------------------------- /src/apps/Calculator/Calculator.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 13.01.2024. 3 | // 4 | #include "App.h" 5 | #include "AppManager.h" 6 | #include "M5Cardputer.h" 7 | #include "ScreenManager.h" 8 | #include 9 | #include "Utils.h" 10 | #include "tinyexpr.h" 11 | #include "icon.h" 12 | 13 | #pragma once 14 | 15 | class Calculator : public App { 16 | private: 17 | std::vector history; 18 | double x; 19 | double y; 20 | double z; 21 | public: 22 | const char *getName() override { return "Calculator"; } 23 | 24 | void onAppOpen() override { 25 | canvas.fillScreen(BLACK); 26 | StatusBar::draw(true); 27 | } 28 | 29 | void onAppClose() override { 30 | } 31 | 32 | void onAppTick() override { 33 | Utils::initCanvas(); 34 | StatusBar::draw(true); 35 | String input = ""; 36 | canvas.setTextSize(1); 37 | canvas.setTextColor(WHITE); 38 | canvas.drawFastHLine(5, 115, 230, WHITE); 39 | // draw last 4 lines of history 40 | for (int i = 0; i < 8 && i < history.size(); i++) { 41 | canvas.setCursor(7, 30 + (7 - i) * 8); 42 | canvas.print(history[history.size() - i - 1]); 43 | } 44 | canvas.setCursor(7, 107); 45 | canvas.print("X = " + String(x) + " Y = " + String(y) + " Z = " + String(z)); 46 | canvas.setCursor(7, 117); 47 | canvas.pushSprite(0, 0); 48 | Utils::waitForInput(input); 49 | if (input == "exit") { 50 | AppManager::getInstance().closeCurrentApp(); 51 | AppManager::getInstance().openApp("AppLauncher"); 52 | StatusBar::draw(true); 53 | } else { 54 | // if input contains ONE "=" then assign the var on the left with the value on the right 55 | if (input.indexOf("=") != -1) { 56 | String var = input.substring(0, input.indexOf("=")); 57 | String value = input.substring(input.indexOf("=") + 1); 58 | double result = te_interp(value.c_str(), 0); 59 | if (var == "x") { 60 | x = result; 61 | } else if (var == "y") { 62 | y = result; 63 | } else if (var == "z") { 64 | z = result; 65 | } else { 66 | history.emplace_back("Please use x or y or z, got " + var); 67 | return; 68 | } 69 | history.emplace_back(var + " = " + String(result)); 70 | return; 71 | } 72 | 73 | te_variable varsArray[] = { 74 | {"x", &x}, 75 | {"y", &y}, 76 | {"z", &z}, 77 | }; 78 | int err; 79 | te_expr *expr = te_compile(input.c_str(), varsArray, 3, &err); 80 | if (expr) { 81 | double result = te_eval(expr); 82 | history.emplace_back(input + " = " + String(result)); 83 | te_free(expr); 84 | } else { 85 | char buffer[100]; 86 | sprintf(buffer, "\t%*s^ Error", err - 1, ""); 87 | history.emplace_back(input); 88 | history.emplace_back(buffer); 89 | } 90 | } 91 | } 92 | 93 | void draw() override { 94 | } 95 | 96 | const uint8_t *getIcon() override { 97 | return calc_icon; 98 | } 99 | 100 | int getIconSize() override { 101 | return sizeof(calc_icon); 102 | } 103 | }; -------------------------------------------------------------------------------- /src/apps/Launcher/Launcher.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 05.06.2024. 3 | // 4 | 5 | #ifndef HYDRAOS_LAUNCHER_CPP 6 | #define HYDRAOS_LAUNCHER_CPP 7 | 8 | #include 9 | #include 10 | #include "App.h" 11 | #include "AppManager.h" 12 | #include "ScreenManager.h" 13 | #include "Utils.h" 14 | #include "SD.h" 15 | #include "assets/hydra.h" 16 | 17 | class Launcher : public App { 18 | private: 19 | int selectIndex; 20 | bool needRedraw; 21 | std::vector apps; 22 | public: 23 | const char *getName() override { 24 | return App::getName(); 25 | } 26 | 27 | void onAppOpen() override { 28 | // query all apps from the AppManager 29 | auto fetchedApps = AppManager::getInstance().listApps(); 30 | for (auto &app: fetchedApps) { 31 | if (app.first == "AppLauncher") { 32 | continue; 33 | } 34 | apps.emplace_back(app.first.c_str()); 35 | } 36 | selectIndex = 0; 37 | needRedraw = true; 38 | } 39 | 40 | void onAppClose() override { 41 | apps.clear(); 42 | } 43 | 44 | void onAppTick() override { 45 | if (needRedraw) { 46 | Utils::initCanvas(); 47 | StatusBar::draw(true); 48 | if (apps.empty()) { 49 | canvas.setTextSize(2); 50 | canvas.setTextColor(WHITE); 51 | canvas.drawCenterString("No apps found", 120, 66); 52 | canvas.pushSprite(0, 0); 53 | needRedraw = false; 54 | return; 55 | } 56 | canvas.setTextSize(2); 57 | canvas.setTextColor(WHITE); 58 | canvas.drawCenterString(apps[selectIndex], 120, 110); 59 | if (apps.size() > 1) { 60 | canvas.setCursor(10, 67); 61 | canvas.print("<"); 62 | canvas.drawRightString(">", 230, 67); 63 | } 64 | String iconPath = "/icons/" + apps[selectIndex] + ".png"; 65 | int x = ((240 - 75) / 2); 66 | int y2 = ((135 - 75) / 2); 67 | 68 | if (AppManager::getInstance().getApp(apps[selectIndex].c_str())->getIconSize() != 0) { 69 | canvas.drawPng(AppManager::getInstance().getApp(apps[selectIndex].c_str())->getIcon(), 70 | AppManager::getInstance().getApp(apps[selectIndex].c_str())->getIconSize(), 71 | x, y2, 75, 75); 72 | } else { 73 | canvas.drawPng(hydra, 435, x + 5, y2 + 5, 75, 75, 0, 0, 2, 2); 74 | } 75 | 76 | needRedraw = false; 77 | } 78 | if (M5Cardputer.Keyboard.isChange() && !apps.empty()) { 79 | Keyboard_Class::KeysState status = M5Cardputer.Keyboard.keysState(); 80 | if (M5Cardputer.Keyboard.isKeyPressed('/')) { 81 | selectIndex++; 82 | if (selectIndex >= apps.size()) { 83 | selectIndex = 0; 84 | } 85 | needRedraw = true; 86 | } 87 | if (M5Cardputer.Keyboard.isKeyPressed(',')) { 88 | selectIndex--; 89 | if (selectIndex < 0) { 90 | selectIndex = apps.size() - 1; 91 | } 92 | needRedraw = true; 93 | } 94 | if (status.enter) { 95 | AppManager::getInstance().openApp(apps[selectIndex].c_str()); 96 | } 97 | } 98 | } 99 | 100 | void draw() override { 101 | canvas.pushSprite(0, 0); 102 | } 103 | }; 104 | 105 | 106 | #endif //HYDRAOS_LAUNCHER_CPP 107 | -------------------------------------------------------------------------------- /src/apps/LEDApp/LEDApp.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 05.06.2024. 3 | // 4 | #include "App.h" 5 | #include "AppManager.h" 6 | #include "M5Cardputer.h" 7 | #include "ScreenManager.h" 8 | #include 9 | #include "Utils.h" 10 | #include 11 | #include "icon.h" 12 | #include "Preferences.h" 13 | 14 | #pragma once 15 | 16 | class LEDApp : public App { 17 | private: 18 | int r = 255; 19 | int g = 255; 20 | int b = 255; 21 | int selectedColor; 22 | bool needsRedraw = true; 23 | Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, 21, NEO_GRB + NEO_KHZ800); 24 | Preferences preferences; 25 | public: 26 | const char *getName() override { return "LEDApp"; } 27 | 28 | void onAppOpen() override { 29 | preferences.begin("hydra_ledapp", false); 30 | canvas.fillScreen(BLACK); 31 | StatusBar::draw(true); 32 | needsRedraw = true; 33 | r = 0; 34 | g = 0; 35 | b = 0; 36 | if (preferences.isKey("r")) { 37 | r = preferences.getInt("r"); 38 | g = preferences.getInt("g"); 39 | b = preferences.getInt("b"); 40 | } 41 | } 42 | 43 | void onAppClose() override { 44 | pixels.setPixelColor(0, Adafruit_NeoPixel::Color(0, 0, 0)); 45 | pixels.show(); 46 | } 47 | 48 | void onAppTick() override { 49 | if (needsRedraw) { 50 | Utils::initCanvas(); 51 | StatusBar::draw(true); 52 | // draw the color picker 53 | canvas.setTextSize(1.5); 54 | canvas.drawCenterString(String(r), 60, 67); 55 | canvas.drawCenterString(String(g), 120, 67); 56 | canvas.drawCenterString(String(b), 180, 67); 57 | // draw change indicator 58 | canvas.drawCenterString("/\\", 60 + (selectedColor * 60), 40); 59 | canvas.drawCenterString("\\/", 60 + (selectedColor * 60), 90); 60 | canvas.pushSprite(0, 0); 61 | needsRedraw = false; 62 | pixels.setBrightness(255); 63 | pixels.setPixelColor(0, Adafruit_NeoPixel::Color(r, g, b)); 64 | pixels.show(); 65 | preferences.putInt("r", r); 66 | preferences.putInt("g", g); 67 | preferences.putInt("b", b); 68 | } 69 | Keyboard_Class::KeysState status = M5Cardputer.Keyboard.keysState(); 70 | if (M5Cardputer.Keyboard.isChange()) { 71 | if (M5Cardputer.Keyboard.isKeyPressed(',')) { 72 | selectedColor--; 73 | if (selectedColor < 0) { 74 | selectedColor = 2; 75 | } 76 | needsRedraw = true; 77 | } 78 | if (M5Cardputer.Keyboard.isKeyPressed('/')) { 79 | selectedColor++; 80 | if (selectedColor >= 3) { 81 | selectedColor = 0; 82 | } 83 | needsRedraw = true; 84 | } 85 | if (M5Cardputer.Keyboard.isKeyPressed(';')) { 86 | if (selectedColor == 0) { 87 | r+= 5; 88 | if (r > 255) { 89 | r = 0; 90 | } 91 | } else if (selectedColor == 1) { 92 | g+= 5; 93 | if (g > 255) { 94 | g = 0; 95 | } 96 | } else if (selectedColor == 2) { 97 | b+= 5; 98 | if (b > 255) { 99 | b = 0; 100 | } 101 | } 102 | } 103 | if (M5Cardputer.Keyboard.isKeyPressed('.')) { 104 | if (selectedColor == 0) { 105 | r-= 5; 106 | if (r < 0) { 107 | r = 255; 108 | } 109 | } else if (selectedColor == 1) { 110 | g-= 5; 111 | if (g < 0) { 112 | g = 255; 113 | } 114 | } else if (selectedColor == 2) { 115 | b-= 5; 116 | if (b < 0) { 117 | b = 255; 118 | } 119 | } 120 | } 121 | } 122 | if (M5Cardputer.Keyboard.isPressed()) { 123 | needsRedraw = true; 124 | delay(35); 125 | } 126 | } 127 | 128 | void draw() override { 129 | 130 | } 131 | 132 | const uint8_t *getIcon() override { 133 | return ledapp_icon; 134 | } 135 | 136 | int getIconSize() override { 137 | return sizeof(ledapp_icon); 138 | } 139 | }; -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "assets/hydra.h" 3 | #include "M5Cardputer.h" 4 | #include "SPI.h" 5 | #include "AppManager.h" 6 | #include "ScreenManager.h" 7 | #include "SD.h" 8 | #include "apps/Calculator/Calculator.cpp" 9 | #include "apps/Launcher/Launcher.cpp" 10 | #include "apps/Settings/Settings.cpp" 11 | #include "apps/LEDApp/LEDApp.cpp" 12 | #include "apps/DinoRunner/DinoRunner.cpp" 13 | #include "apps/AudioRecorder/AudioRec.cpp" 14 | #include "Preferences.h" 15 | 16 | void base(const String &text = "") { 17 | canvas.fillScreen(BLACK); 18 | canvas.setTextSize(1); 19 | canvas.drawRoundRect(5, 5, 230, 125, 7, WHITE); 20 | canvas.drawFastHLine(5, 20, 230, WHITE); 21 | canvas.drawString("HydraOS 2.0.0", 10, 9); 22 | canvas.drawRightString(text, 230, 9); 23 | } 24 | // the remaining area is 230x105 pixels 25 | 26 | void hydraOSLogoAnimation(int percent) { 27 | base(); 28 | // Draw the rabbitOS logo partially as by the given percent 29 | int width = 64; 30 | // get top left coordinates for img (screen is M5Cardputer.Display.width() x M5Cardputer.Display.height() pixels) 31 | int x = ((240 - width) / 2); 32 | int y = ((135 - width) / 2) + 5; 33 | canvas.drawPng(hydra, 435, x, y, width, width, 0, 0, 2, 2); 34 | // draw gradient line as bottom border based on percent 35 | int lineWidth = 230 * percent / 100; 36 | for (int i = 0; i < 5; i++) { 37 | canvas.drawGradientHLine(5, 130 - 1 - i, lineWidth + 3, GREEN, CYAN); 38 | } 39 | canvas.drawCenterString("Press any key to skip", 120, 110); 40 | canvas.pushSprite(0, 0); 41 | } 42 | 43 | SPIClass SPI2; 44 | 45 | void setup() { 46 | Serial.begin(115200); 47 | Serial.println("Starting HydraOS"); 48 | Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, 21, NEO_GRB + NEO_KHZ800); 49 | pixels.setPixelColor(0, Adafruit_NeoPixel::Color(0, 0, 0)); 50 | pixels.show(); 51 | Preferences preferences; 52 | auto cfg = m5::M5Unified::config(); 53 | M5Cardputer.begin(cfg, true); 54 | SPI2.begin( 55 | m5::M5Unified::getPin(m5::pin_name_t::sd_spi_sclk), 56 | m5::M5Unified::getPin(m5::pin_name_t::sd_spi_miso), 57 | m5::M5Unified::getPin(m5::pin_name_t::sd_spi_mosi), 58 | m5::M5Unified::getPin(m5::pin_name_t::sd_spi_ss) 59 | ); 60 | M5Cardputer.update(); 61 | M5Cardputer.Display.setColorDepth(8); 62 | M5Cardputer.Display.setRotation(1); 63 | canvas.createSprite(240, 135); 64 | if (!SD.begin(m5::M5Unified::getPin(m5::pin_name_t::sd_spi_ss), SPI2)) { 65 | Serial.println("SD Card Mount Failed"); 66 | Utils::popup("SD Card Mount Failed\n" 67 | "You don't need an SD anyway", 0); 68 | } 69 | preferences.begin("hydra_base", false); 70 | if (preferences.isKey("ssid")) { 71 | WiFiClass::mode(WIFI_STA); 72 | WiFi.begin(preferences.getString("ssid").c_str(), preferences.getString("pass").c_str()); 73 | } 74 | pin: 75 | // ask for pin code 76 | if (preferences.isKey("pin")) { 77 | Utils::initCanvas(); 78 | base("Security"); 79 | canvas.setTextSize(1.5); 80 | canvas.drawString("Enter pin code", 7, 30); 81 | canvas.drawFastHLine(5, 50, 230, WHITE); 82 | canvas.drawFastHLine(5, 74, 230, WHITE); 83 | canvas.setCursor(7, 53); 84 | canvas.setTextSize(2); 85 | canvas.pushSprite(0, 0); 86 | String pin = ""; 87 | Utils::centerInput(pin, 4, 18, true); 88 | if (pin != preferences.getString("pin")) { 89 | Utils::popup("Wrong pin code", 0); 90 | goto pin; 91 | } 92 | } 93 | //for (int i = 0; i < 100; i++) { 94 | // hydraOSLogoAnimation(i); 95 | // delay(15); 96 | // M5Cardputer.update(); 97 | // if (M5Cardputer.Keyboard.isPressed()) { 98 | // break; 99 | // } 100 | //} 101 | Utils::initCanvas(); 102 | AppManager::getInstance().addApp("AppLauncher", new Launcher()); 103 | AppManager::getInstance().addApp("Calculator", new Calculator()); 104 | AppManager::getInstance().addApp("Settings", new Settings()); 105 | AppManager::getInstance().addApp("LEDApp", new LEDApp()); 106 | AppManager::getInstance().addApp("DinoRunner", new DinoRunner()); 107 | AppManager::getInstance().addApp("AudioRecorder", new AudioRecorder()); 108 | // add more apps here 109 | AppManager::getInstance().openApp("AppLauncher"); 110 | } 111 | 112 | void loop() { 113 | M5Cardputer.update(); 114 | 115 | if (M5.BtnA.wasPressed() && AppManager::getInstance().getCurrentAppName() != "AppLauncher") { 116 | AppManager::getInstance().closeCurrentApp(); 117 | AppManager::getInstance().openApp("AppLauncher"); 118 | } 119 | 120 | AppManager::getInstance().tickCurrentApp(); 121 | AppManager::getInstance().draw(); // Add this line 122 | 123 | delay(15); 124 | } -------------------------------------------------------------------------------- /src/apps/DinoRunner/DinoRunner.cpp: -------------------------------------------------------------------------------- 1 | #include "App.h" 2 | #include "M5Cardputer.h" 3 | #include "SD.h" 4 | #include "ScreenManager.h" 5 | #include "Utils.h" 6 | #include "AppManager.h" 7 | #include "icon.h" 8 | 9 | #pragma once 10 | 11 | class DinoObstacle { 12 | public: 13 | int x; 14 | int y; 15 | int width; 16 | int height; 17 | int speed; 18 | bool isPassed; 19 | bool isCollided; 20 | DinoObstacle(int x, int y, int width, int height, int speed) { 21 | this->x = x; 22 | this->y = y; 23 | this->width = width; 24 | this->height = height; 25 | this->speed = speed; 26 | isPassed = false; 27 | isCollided = false; 28 | } 29 | }; 30 | 31 | class DinoRunner : public App { 32 | private: 33 | int score; 34 | bool isGameOver; 35 | float downForce; 36 | float jumpForce; 37 | float gravity; 38 | float dinoX; 39 | float dinoY; 40 | float dinoWidth; 41 | float dinoHeight; 42 | std::vector obstacles; 43 | int obstacleSpawnTimer; 44 | 45 | public: 46 | const char *getName() override { 47 | return "DinoRunner"; 48 | } 49 | 50 | void onAppClose() override { 51 | // Clean up the game here 52 | obstacles.clear(); 53 | isGameOver = false; 54 | } 55 | 56 | void onAppOpen() override { 57 | // Initialize the game here 58 | obstacles.clear(); 59 | score = 0; 60 | isGameOver = false; 61 | // Initialize the dinosaur character and obstacles here 62 | downForce = 0; 63 | jumpForce = 0; 64 | gravity = 0.5; 65 | dinoX = 20; 66 | dinoY = 100; 67 | dinoWidth = 10; 68 | dinoHeight = 10; 69 | obstacles.emplace_back(240, 100, 10, 10, 2); 70 | obstacleSpawnTimer = 70; 71 | } 72 | 73 | void onAppTick() override { 74 | // Update the game state here 75 | if (!isGameOver) { 76 | // Update the dinosaur character and obstacles here 77 | // Check for collisions between the dinosaur and obstacles 78 | // If a collision is detected, set isGameOver to true 79 | // draw the dino now 80 | Utils::initCanvas(); 81 | StatusBar::draw(true); 82 | canvas.fillRect(dinoX, dinoY, dinoWidth, dinoHeight, RED); 83 | canvas.drawFastHLine(5, 110, 230, WHITE); 84 | // draw the obstacles 85 | for (DinoObstacle &obstacle : obstacles) { 86 | // delete the obstacle if it is out of the screen 87 | if (obstacle.x < -obstacle.width) { 88 | obstacles.erase(obstacles.begin()); 89 | } 90 | canvas.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height, GREEN); 91 | obstacle.x -= obstacle.speed; 92 | if (obstacle.x < dinoX + dinoWidth && obstacle.x + obstacle.width > dinoX && obstacle.y < dinoY + dinoHeight && obstacle.y + obstacle.height > dinoY) { 93 | isGameOver = true; 94 | } 95 | if (obstacle.x < (dinoX-5) && !obstacle.isPassed) { 96 | score++; 97 | obstacle.isPassed = true; 98 | // add a new obstacle with random properties 99 | } 100 | } 101 | // make the dino jump if a key is pressed 102 | if (M5Cardputer.Keyboard.isPressed() && jumpForce == 0 && dinoY == 100) { 103 | jumpForce = 7; 104 | } 105 | // apply gravity to the dino if it is not on the ground and not jumping 106 | if (dinoY < 100 && jumpForce == 0) { 107 | downForce += gravity; 108 | dinoY += downForce; 109 | } else { 110 | downForce = 0; 111 | if (dinoY > 100) { 112 | dinoY = 100; 113 | } 114 | } 115 | // apply jump force 116 | if (jumpForce > 0) { 117 | dinoY -= jumpForce; 118 | jumpForce -= 0.5; // decrease jump force over time 119 | } 120 | // decrease the spawn timer 121 | obstacleSpawnTimer--; 122 | 123 | // if the spawn timer reaches 0, spawn a new obstacle 124 | if (obstacleSpawnTimer <= 0) { 125 | int randomHeight = random(10, 20); 126 | int randomWidth = random(5, 20); 127 | int randomSpeed = random(2, 3); 128 | obstacles.emplace_back(240, 100 - randomHeight + 10, randomWidth, randomHeight, randomSpeed); 129 | // reset the spawn timer to a random value 130 | obstacleSpawnTimer = random(30, 65); 131 | } 132 | 133 | canvas.fillRect(0, 0, 5, 135, BLACK); 134 | canvas.fillRect(235, 0, 5, 135, BLACK); 135 | canvas.drawRoundRect(5, 5, 230, 125, 7, WHITE); 136 | } 137 | } 138 | 139 | void draw() override { 140 | // Draw the game on the screen here 141 | // Draw the dinosaur character and obstacles 142 | // If isGameOver is true, display a game over message 143 | if (isGameOver) { 144 | Utils::popup("Game Over! Score: " + String(score), 0, 1.5); 145 | AppManager::getInstance().closeCurrentApp(); 146 | AppManager::getInstance().openApp("DinoRunner"); 147 | } else { 148 | canvas.pushSprite(0, 0); 149 | } 150 | } 151 | 152 | const uint8_t *getIcon() override { 153 | return dino_icon; 154 | } 155 | 156 | int getIconSize() override { 157 | return sizeof(dino_icon); 158 | } 159 | }; -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | wau@endlesssource.org. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HydraOS 2 | ## Introduction 3 | HydraOS is a simple operating system for the M5Cardputer. It consists of an App system, basic utilities, and a simple 4 | component system. The App system allows for the creation of applications that can be run on the M5Cardputer. The basic 5 | utilities provide a way to interact with the system and the component system allows for the creation of components that 6 | can be used in applications. 7 | ## Bundled Apps 8 | Some basic apps are bundled with the full version of HydraOS. These apps include: 9 | - Calculator: A simple calculator app based on tinyexpr 10 | - LED App: A simple app that allows you to control the onboard LED 11 | - Dino Run: A simple game where you control a dinosaur to avoid obstacles 12 | - Settings: A simple settings app that allows you to change the system settings 13 | ## Concepts 14 | ### Apps 15 | Apps are the main way to interact with the system. They can be created using the App Class and can be registered in the 16 | AppManager. Check the Calculator app for an example of how to create a basic app. 17 | ### Components 18 | Components are reusable pieces of app functionality. They can be created using the Component Class can be used in 19 | ComponentApp instances. Check the Settings app for an example of how to use predefined components, and the LAppComponent 20 | for an example of how to create a custom component. 21 | ### Utilities 22 | Utilities are basic functions that can be reused across the system. They are stored in the Utils class and can be called 23 | statically. 24 | ## Installation 25 | To install HydraOS, clone the repository and run the following command: 26 | ```bash 27 | pio run -t upload 28 | ``` 29 | This will compile the code and upload it to the M5Cardputer. 30 | ## Roadmap 31 | The following features are planned for future versions of HydraOS: 32 | 1. [ ] Standalone usable components 33 | 2. [ ] More bundled apps 34 | 3. [ ] Launching of third-party apps 35 | 4. [ ] App store 36 | ## Contributing 37 | If you would like to contribute to HydraOS, please feel free to fork the repository and submit a pull request. 38 | You can also submit issues if you find any bugs or have any feature requests. 39 | We are always looking for ways to improve the system and would love to hear your ideas. If you have developed an app 40 | for HydraOS, please let us know and we will consider bundling it with the system. 41 | 42 | ## License 43 | HydraOS is licensed under the MIT License. Please see the LICENSE file for more information. 44 | 45 | ## Detailed Overview 46 | Please note that this is just an overview of the system. For a more detailed guide, please refer to the code itself. 47 | ### Screen 48 | The Screen is 240x135 pixels. HydraOS StatusBar uses the top 25 pixels, the bottom, left, and right 10 pixels. You are 49 | advised to use the coordinates (10, 25) to (230, 125) for your app's ui elements. 50 | ### Basic Classes 51 | #### AppManager 52 | import using `#include "AppManager.h"` 53 | 54 | The AppManager is a class that manages the apps in the system. It can be used to register and run apps. The AppManager 55 | is a singleton and can be accessed using the `AppManager::getInstance()` method. The AppManager has the following methods: 56 | - `void addApp(const std::string& name, App* app)`: Adds an app to the system 57 | - `void openApp(const std::string& name)`: Opens an app 58 | - `void closeCurrentApp()`: Closes the current app 59 | - `void tickCurrentApp()`: Ticks the current app 60 | - `void draw()`: Draws the current app 61 | - `String getCurrentAppName()`: Gets the name of the current app 62 | - `std::map listApps()`: Lists all the apps in the system 63 | - `App* getApp(const std::string& name)`: Gets an app by name 64 | - `App* currentApp`: The current app, not to be changed manually 65 | #### ScreenManager 66 | import using `#include "ScreenManager.h"` 67 | 68 | The ScreenManager contains two simple methods to prepare the screen for drawing: 69 | - `void StatusBar::draw()`: Draws the status bar 70 | - `M5Canvas canvas`: The canvas to draw on 71 | #### Utils 72 | import using `#include "Utils.h"` 73 | 74 | The Utils class contains some basic utility functions that can be used across the system. The Utils class can be used 75 | entirely statically. 76 | - `void Utils::waitForInput(String &input, int x = 27, int hdl_t = 10, bool passwordMode = false)`: Waits for input 77 | - `void Utils::waitForKey()`: Waits for a key press 78 | - `void Utils::popup(const String& text, int waitMode = 0, float textSize = 1)`: Shows a popup 79 | - `void Utils::initCanvas()`: Resets most canvas properties, please draw status bar after using this 80 | ### App 81 | A basic app can be created by extending the App class and implementing the following methods: 82 | - `void onAppOpen()`: Called when the app is opened 83 | - `void onAppClose()`: Called when the app is closed 84 | - `void onAppTick()`: Called every tick, prepare the canvas here 85 | - `void draw()`: Called every frame to draw the app, stamp the canvas here if needed 86 | 87 | Check the `Calculator` app for an example of how to create a custom app. 88 | 89 | ### Component 90 | A basic component can be created by extending the Component class and implementing the following methods: 91 | - `void initComponent()`: Called when the component is opened 92 | - `void renderComponent()`: Called every tick, draw the component here 93 | - `void updateComponent()`: Called every tick, prepare canvas and update the component here 94 | - `void closeComponent()`: Called when the component is closed 95 | - `void forceRerender()`: Forces the component to rerender 96 | 97 | Check the `LAppComponent` for an example of how to create a custom component. 98 | 99 | ### ComponentApp 100 | A basic app that uses components can be created by extending the ComponentApp class and implementing the following methods: 101 | - `Component &initApp()`: Called when the app is opened, return the component to use 102 | 103 | Check the `Settings` app for an example of how to create a custom app that uses components. 104 | 105 | ### Registering Apps 106 | In the `main.cpp` file, near the bottom of the setup, you can register apps using the `AppManager::getInstance()->addApp` method. For example: 107 | ```cpp 108 | AppManager::getInstance()->addApp("calculator", new Calculator()); 109 | ``` 110 | 111 | That's it! You should now have a basic understanding of how HydraOS works. 112 | If you have any questions, feel free to ask me on Discord: wauhundeland. Happy coding! 113 | 114 | -------------------------------------------------------------------------------- /src/components/MenuComponent.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Wau Hundeland on 26.01.24. 3 | // 4 | 5 | #include "MenuComponent.h" 6 | 7 | #include 8 | #include "ScreenManager.h" 9 | #include "Utils.h" 10 | #include "assets/hydra.h" 11 | 12 | 13 | void MenuComponent::initComponent() { 14 | Utils::initCanvas(); 15 | StatusBar::draw(); 16 | canvas.setTextSize(2); 17 | 18 | needRedraw = true; 19 | drawFinished = false; 20 | selectIndex = 0; 21 | } 22 | 23 | void MenuComponent::renderComponent() { 24 | if (!drawFinished) { 25 | return; 26 | } 27 | canvas.pushSprite(0, 0); 28 | } 29 | 30 | void MenuComponent::updateComponent() { 31 | if (needRedraw) { 32 | StatusBar::draw(); 33 | canvas.setTextSize(2); 34 | canvas.setTextColor(WHITE); 35 | 36 | // Get the app at the selectIndex 37 | auto it = functions.begin(); 38 | std::advance(it, selectIndex); 39 | auto const &function = *it; 40 | 41 | int x = 10; 42 | int y = 28; 43 | int offset = 0; 44 | 45 | // if mode is one of the icon modes, draw the icon 46 | if (menuType == MENU_TYPE_LIST_WITH_ICON || menuType == MENU_TYPE_LIST_WITH_DESCRIPTION_AND_ICON) { 47 | // Draw the app icon and name 48 | std::string iconPath = "/icons/" + iconNamespace + "/" + function.getIcon() + ".png"; 49 | int y2 = ((135 - 50) / 2); 50 | 51 | if (SD.exists(iconPath.c_str())) { 52 | File file = SD.open(iconPath.c_str(), FILE_READ); 53 | canvas.drawPng(&file, x, y2, 50, 50); 54 | file.close(); 55 | } else { 56 | // If the icon does not exist, use a default icon 57 | canvas.drawPng(hydra, 435, x, y2, 50, 50, 14, 14, 2, 2); 58 | } 59 | // Draw a square around the icon 60 | canvas.drawRect(x, y2, 50, 50, WHITE); 61 | offset = 60; 62 | } 63 | 64 | // Draw the list of apps 65 | canvas.setCursor(x + offset, y); 66 | 67 | int i = 0; 68 | canvas.setTextSize(2); 69 | int appsSize = functions.size(); 70 | for (auto const &function: functions) { 71 | if (menuType == MENU_TYPE_LIST_WITH_DESCRIPTION || menuType == MENU_TYPE_LIST_WITH_DESCRIPTION_AND_ICON) { 72 | // display the last, the current and the next app 73 | // if the selected app is the first or last, adjust the display to still show 5 apps 74 | if ((selectIndex < 1 && i < 3) || 75 | (selectIndex >= 1 && selectIndex < appsSize - 1 && i >= selectIndex - 1 && i <= selectIndex + 1) || 76 | (selectIndex >= appsSize - 1 && i >= appsSize - 3)) { 77 | // current app: green 78 | if (i == selectIndex) { 79 | canvas.setTextColor(GREEN); 80 | } else { 81 | canvas.setTextColor(WHITE); 82 | } 83 | canvas.println(function.getName().c_str()); 84 | canvas.setCursor(x + offset, canvas.getCursorY()); 85 | } 86 | } else { 87 | // display the 2 last, the current and the next 2 apps 88 | if ((selectIndex < 3 && i < 6) || 89 | (selectIndex >= 3 && selectIndex < appsSize - 2 && i >= selectIndex - 3 && i <= selectIndex + 2) || 90 | (selectIndex >= appsSize - 2 && i >= appsSize - 6)) { 91 | // current app: green 92 | if (i == selectIndex) { 93 | canvas.setTextColor(GREEN); 94 | } else { 95 | canvas.setTextColor(WHITE); 96 | } 97 | canvas.println(function.getName().c_str()); 98 | canvas.setCursor(x + offset, canvas.getCursorY()); 99 | } 100 | } 101 | i++; 102 | } 103 | 104 | if (menuType == MENU_TYPE_LIST_WITH_DESCRIPTION || menuType == MENU_TYPE_LIST_WITH_DESCRIPTION_AND_ICON) { 105 | // Draw the description of the app 106 | canvas.setTextColor(LIGHTGREY); 107 | canvas.setTextSize(1.5); 108 | canvas.setCursor(x + offset, canvas.getCursorY() + 10); 109 | // split the description into lines of 17 characters 110 | std::string description = function.getDescription(); 111 | int descriptionLength = description.length(); 112 | int descriptionIndex = 0; 113 | while (descriptionIndex < descriptionLength) { 114 | if (menuType == MENU_TYPE_LIST_WITH_DESCRIPTION_AND_ICON) { 115 | canvas.println(description.substr(descriptionIndex, 17).c_str()); 116 | descriptionIndex += 17; 117 | } else { 118 | canvas.println(description.substr(descriptionIndex, 25).c_str()); 119 | descriptionIndex += 25; 120 | } 121 | canvas.setCursor(x + offset, canvas.getCursorY()); 122 | } 123 | } 124 | 125 | needRedraw = false; 126 | drawFinished = true; 127 | } 128 | M5Cardputer.update(); 129 | if (M5Cardputer.Keyboard.isChange()) { 130 | if (M5Cardputer.Keyboard.isPressed()) { 131 | Keyboard_Class::KeysState status = M5Cardputer.Keyboard.keysState(); 132 | if (status.enter) { 133 | // Get the action at the selectIndex 134 | auto it = functions.begin(); 135 | std::advance(it, selectIndex); 136 | Action function = *it; 137 | function.execute(app); 138 | } 139 | for (auto i: status.hid_keys) { 140 | switch (i) { 141 | case 0x33: //";" LeftArrow 142 | selectIndex--; 143 | if (selectIndex < 0) { 144 | selectIndex = functions.size() - 1; 145 | } 146 | needRedraw = true; 147 | break; 148 | case 0x37: //"." RightArrow 149 | selectIndex++; 150 | if (selectIndex >= functions.size()) { 151 | selectIndex = 0; 152 | } 153 | needRedraw = true; 154 | break; 155 | } 156 | } 157 | } 158 | } 159 | delay(10); 160 | } 161 | 162 | void MenuComponent::closeComponent() { 163 | } 164 | 165 | void MenuComponent::forceRerender() { 166 | needRedraw = true; 167 | } 168 | 169 | MenuComponent::MenuComponent(ComponentApp ¤tapp, const MenuType menuType, const std::vector &functions, 170 | std::string iconNamespace) 171 | : app(currentapp), menuType(menuType), functions(functions), iconNamespace(std::move(iconNamespace)) { 172 | // reset all fields 173 | selectIndex = 0; 174 | needRedraw = true; 175 | }; 176 | -------------------------------------------------------------------------------- /src/Utils.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 13.01.2024. 3 | // 4 | 5 | #include "Utils.h" 6 | 7 | #include 8 | #include 9 | #include "ScreenManager.h" 10 | #include "SD.h" 11 | #include "assets/hydra.h" 12 | #include "Action.h" 13 | 14 | void Utils::waitForInput(String &input, const int x, const int hdl_t, const bool passwordMode) { 15 | // if key is pressed, wait for release 16 | if (M5Cardputer.Keyboard.isPressed()) { 17 | while (M5Cardputer.Keyboard.isPressed()) { 18 | M5Cardputer.update(); 19 | delay(50); 20 | }; 21 | } 22 | 23 | static int cursorY = 0; 24 | unsigned long lastKeyPressMillis = 0; 25 | const unsigned long debounceDelay = 130; // Adjust debounce delay as needed 26 | String currentInput = input; 27 | 28 | while (true) { 29 | M5Cardputer.update(); 30 | if (M5Cardputer.Keyboard.isChange()) { 31 | Keyboard_Class::KeysState status = M5Cardputer.Keyboard.keysState(); 32 | 33 | if (status.del && currentInput.length() > 0) { 34 | // Handle backspace key 35 | currentInput.remove(currentInput.length() - 1); 36 | canvas.fillRect(7, cursorY, 230, hdl_t, BLACK); 37 | canvas.setCursor(8, cursorY); 38 | if (passwordMode) { 39 | for (int i = 0; i < currentInput.length(); i++) { 40 | canvas.print("*"); 41 | } 42 | } else { 43 | canvas.print(currentInput); 44 | } 45 | canvas.drawRoundRect(5, 5, 230, 125, 7, WHITE); 46 | canvas.pushSprite(0, 0); 47 | cursorY = canvas.getCursorY(); 48 | lastKeyPressMillis = millis(); 49 | } 50 | 51 | for (auto i: status.word) { 52 | if (millis() - lastKeyPressMillis >= debounceDelay) { 53 | if (currentInput.length() >= x) { 54 | continue; 55 | } 56 | currentInput += i; 57 | if (passwordMode) { 58 | canvas.print("*"); 59 | } else { 60 | canvas.print(i); 61 | } 62 | canvas.pushSprite(0, 0); 63 | cursorY = canvas.getCursorY(); 64 | lastKeyPressMillis = millis(); 65 | } 66 | } 67 | 68 | if (status.enter) { 69 | canvas.println(); // Move to the next line 70 | input = currentInput; 71 | break; 72 | } 73 | } 74 | if (M5.BtnA.isPressed()) { 75 | input = "exit"; 76 | break; 77 | } 78 | } 79 | } 80 | 81 | void Utils::centerInput(String &input, const int x, const int hdl_t, const bool passwordMode) { 82 | // if key is pressed, wait for release 83 | if (M5Cardputer.Keyboard.isPressed()) { 84 | while (M5Cardputer.Keyboard.isPressed()) { 85 | M5Cardputer.update(); 86 | delay(50); 87 | }; 88 | } 89 | 90 | static int cursorY = 0; 91 | unsigned long lastKeyPressMillis = 0; 92 | const unsigned long debounceDelay = 130; // Adjust debounce delay as needed 93 | String currentInput = input; 94 | 95 | while (true) { 96 | M5Cardputer.update(); 97 | if (M5Cardputer.Keyboard.isChange()) { 98 | Keyboard_Class::KeysState status = M5Cardputer.Keyboard.keysState(); 99 | 100 | if (status.del && currentInput.length() > 0) { 101 | // Handle backspace key 102 | cursorY = canvas.getCursorY(); 103 | currentInput.remove(currentInput.length() - 1); 104 | canvas.fillRect(7, cursorY, 230, hdl_t, BLACK); 105 | canvas.setCursor(8, cursorY); 106 | if (passwordMode) { 107 | String buffer = ""; 108 | for (int i = 0; i < currentInput.length(); i++) { 109 | buffer += "*"; 110 | } 111 | canvas.drawCenterString(buffer, 120, cursorY); 112 | } else { 113 | canvas.drawCenterString(currentInput, 120, cursorY); 114 | } 115 | canvas.drawRoundRect(5, 5, 230, 125, 7, WHITE); 116 | canvas.pushSprite(0, 0); 117 | cursorY = canvas.getCursorY(); 118 | lastKeyPressMillis = millis(); 119 | } 120 | 121 | for (auto i: status.word) { 122 | if (millis() - lastKeyPressMillis >= debounceDelay) { 123 | if (currentInput.length() >= x) { 124 | continue; 125 | } 126 | cursorY = canvas.getCursorY(); 127 | currentInput += i; 128 | canvas.fillRect(7, cursorY, 230, hdl_t, BLACK); 129 | if (passwordMode) { 130 | String buffer = ""; 131 | for (int i = 0; i < currentInput.length(); i++) { 132 | buffer += "*"; 133 | } 134 | canvas.drawCenterString(buffer, 120, cursorY); 135 | } else { 136 | canvas.drawCenterString(currentInput, 120, cursorY); 137 | } 138 | canvas.drawRoundRect(5, 5, 230, 125, 7, WHITE); 139 | canvas.pushSprite(0, 0); 140 | lastKeyPressMillis = millis(); 141 | cursorY = canvas.getCursorY(); 142 | } 143 | } 144 | 145 | if (status.enter) { 146 | canvas.println(); // Move to the next line 147 | input = currentInput; 148 | break; 149 | } 150 | } 151 | if (M5.BtnA.isPressed()) { 152 | input = "exit"; 153 | break; 154 | } 155 | } 156 | } 157 | 158 | void Utils::waitForKey() { 159 | M5Cardputer.update(); 160 | // if key is pressed, wait for release 161 | if (M5Cardputer.Keyboard.isPressed()) { 162 | while (M5Cardputer.Keyboard.isPressed()) { 163 | M5Cardputer.update(); 164 | delay(50); 165 | }; 166 | } 167 | while (!M5Cardputer.Keyboard.isPressed() && !M5.BtnA.isPressed()) { 168 | M5Cardputer.update(); 169 | delay(50); 170 | }; 171 | } 172 | 173 | void Utils::initCanvas() { 174 | canvas.setTextSize(1); 175 | canvas.setTextColor(WHITE); 176 | canvas.setTextWrap(true); 177 | canvas.fillScreen(BLACK); 178 | canvas.setCursor(0, 0); 179 | // reset font 180 | canvas.setFont(&Font0); 181 | } 182 | 183 | void Utils::popup(const String &text, int waitMode, float textSize) { 184 | canvas.setTextSize(textSize); 185 | canvas.fillRoundRect(15, 15, 205, 105, 10, BLACK); 186 | canvas.drawRoundRect(20, 20, 200, 100, 10, WHITE); 187 | // each newline in text is a new line using canvas.drawCenterString(text, 120, 60 + (i * 8)); 188 | int i = 0; 189 | for (const String &line: splitString(text, '\n')) { 190 | canvas.drawCenterString(line, 120, 30 + (i * 8 * textSize)); 191 | i++; 192 | } 193 | if (waitMode == 0) { 194 | canvas.setTextSize(1); 195 | canvas.drawCenterString("Press any key to continue", 120, 110); 196 | } 197 | canvas.pushSprite(0, 0); 198 | if (waitMode == 0) { 199 | waitForKey(); 200 | } else { 201 | delay(waitMode); 202 | } 203 | canvas.setTextSize(1); 204 | } 205 | 206 | void Utils::sdPopup(const String &text, const String &path, int waitMode) { 207 | canvas.fillRoundRect(15, 15, 205, 105, 10, BLACK); 208 | canvas.drawRoundRect(20, 20, 200, 100, 10, WHITE); 209 | // show image 210 | int x = ((240 - 50) / 2); 211 | canvas.drawRoundRect(x, 30, 50, 50, 5, WHITE); 212 | if (SD.exists(path.c_str())) { 213 | File file = SD.open(path.c_str(), FILE_READ); 214 | canvas.drawPng(&file, x, 30, 50, 50, 0, 0); 215 | } else { 216 | canvas.drawPng(hydra, 435, x, 30, 50, 50, 14, 14, 2, 2); 217 | } 218 | canvas.drawCenterString(text, 120, 90); 219 | canvas.pushSprite(0, 0); 220 | if (waitMode == 0) { 221 | waitForKey(); 222 | } else { 223 | delay(waitMode); 224 | } 225 | } 226 | 227 | std::vector Utils::splitString(const String &s, char delimiter) { 228 | std::vector result; 229 | int start = 0; 230 | int end = s.indexOf(delimiter); 231 | while (end != -1) { 232 | result.push_back(s.substring(start, end)); 233 | start = end + 1; 234 | end = s.indexOf(delimiter, start); 235 | } 236 | result.push_back(s.substring(start)); 237 | return result; 238 | } -------------------------------------------------------------------------------- /src/apps/AudioRecorder/AudioRec.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 08.06.2024. 3 | // 4 | #include "ComponentApp.h" 5 | #include "components/MenuComponent.h" 6 | #include "M5Cardputer.h" 7 | #include 8 | #include 9 | #include "ScreenManager.h" 10 | #include "Utils.h" 11 | #include "Audio.h" 12 | #include "icon.h" 13 | 14 | class AudioRecorder : public ComponentApp { 15 | private: 16 | Audio audio; 17 | public: 18 | Component &initApp() override { 19 | M5Cardputer.Speaker.stop(); 20 | M5Cardputer.Speaker.end(); 21 | audio.setPinout(41, 43, 42); 22 | std::vector actions; 23 | actions.emplace_back("record", "New recording", "", "", [this]() { 24 | M5Cardputer.Mic.begin(); 25 | Utils::initCanvas(); 26 | StatusBar::draw(true); 27 | canvas.setTextSize(1.5); 28 | canvas.drawString("Recording name", 7, 30); 29 | canvas.drawFastHLine(5, 45, 230, WHITE); 30 | canvas.drawFastHLine(5, 60, 230, WHITE); 31 | canvas.setCursor(8, 47); 32 | canvas.drawString("Press G0 to cancel", 7, 65); 33 | canvas.pushSprite(0, 0); 34 | String name = ""; 35 | Utils::waitForInput(name); 36 | if (name == "" || name == "exit") { 37 | this->currentComponent->forceRerender(); 38 | return; 39 | } 40 | // show recording screen 41 | Utils::initCanvas(); 42 | StatusBar::draw(true); 43 | canvas.setTextSize(1.5); 44 | canvas.drawCenterString("Please wait...", 120, 40); 45 | canvas.pushSprite(0, 0); 46 | 47 | // prepare recording 48 | static constexpr const size_t record_length = 1920; 49 | static constexpr const size_t record_samplerate = 16000; 50 | int16_t rec_data[record_length]; 51 | File recordFile; 52 | 53 | // Open file for recording 54 | if (!SD.exists("/hydra/rec/")) { 55 | SD.mkdir("/hydra/rec/"); 56 | } 57 | if (SD.exists("/hydra/rec/" + name + ".wav")) { 58 | Utils::popup("File already exists", 0, 1.5); 59 | this->currentComponent->forceRerender(); 60 | return; 61 | } 62 | 63 | recordFile = SD.open("/hydra/rec/" + name + ".wav", FILE_WRITE, true); 64 | if (!recordFile) { 65 | Utils::popup("Core Error\nFailed to open file", 0, 1.5); 66 | this->currentComponent->forceRerender(); 67 | return; 68 | } 69 | 70 | // Write WAV header with placeholder data size 71 | saveWavHeader(recordFile, record_samplerate, 0xFFFFFFFF); // maximum 32-bit unsigned integer 72 | 73 | // begin recording 74 | // if key is pressed, wait for key release 75 | if (M5Cardputer.Keyboard.isPressed()) { 76 | while (M5Cardputer.Keyboard.isPressed()) { 77 | M5Cardputer.update(); 78 | delay(50); 79 | }; 80 | } 81 | // record until key is pressed 82 | while (true) { 83 | M5Cardputer.update(); 84 | // show recording screen 85 | Utils::initCanvas(); 86 | StatusBar::draw(true); 87 | canvas.setTextSize(1.5); 88 | canvas.drawCenterString("Recording...", 120, 40); 89 | canvas.drawCenterString("Press any key to stop", 120, 60); 90 | canvas.pushSprite(0, 0); 91 | if (M5Cardputer.Mic.record(rec_data, record_length, record_samplerate)) { 92 | // Write audio data to file 93 | recordFile.write((uint8_t *)rec_data, record_length * sizeof(int16_t)); 94 | } else { 95 | Utils::popup("Core Error\nFailed to record", 0, 1.5); 96 | this->currentComponent->forceRerender(); 97 | return; 98 | } 99 | if (M5.BtnA.wasPressed() || M5Cardputer.Keyboard.isPressed()) { 100 | break; 101 | } 102 | } 103 | 104 | // end recording 105 | recordFile.close(); 106 | Utils::initCanvas(); 107 | StatusBar::draw(true); 108 | canvas.setTextSize(1.5); 109 | canvas.drawCenterString("Recording stopped", 120, 40); 110 | canvas.setTextSize(1); 111 | canvas.drawCenterString("Press any key to continue", 120, 60); 112 | canvas.pushSprite(0, 0); 113 | Utils::waitForKey(); 114 | this->currentComponent->forceRerender(); 115 | }); 116 | 117 | actions.emplace_back("list", "List recordings", "", "", [this]() { 118 | Utils::initCanvas(); 119 | StatusBar::draw(true); 120 | canvas.setTextSize(1.5); 121 | canvas.drawString("Please wait...", 7, 30); 122 | canvas.pushSprite(0, 0); 123 | File dir = SD.open("/hydra/rec"); 124 | if (!dir) { 125 | Utils::popup("Core Error\nFailed to open directory", 0, 1.5); 126 | this->currentComponent->forceRerender(); 127 | return; 128 | } 129 | std::vector recordings; 130 | while (true) { 131 | File entry = dir.openNextFile(); 132 | if (!entry) { 133 | break; 134 | } 135 | if (!entry.isDirectory()) { 136 | // copy name to avoid dangling pointer 137 | String name = entry.name(); 138 | recordings.emplace_back(name.c_str(), name.c_str(), "", "", [this, name]() { 139 | // if key is pressed, wait for key release 140 | if (M5Cardputer.Keyboard.isPressed()) { 141 | while (M5Cardputer.Keyboard.isPressed()) { 142 | M5Cardputer.update(); 143 | delay(50); 144 | }; 145 | } 146 | Utils::initCanvas(); 147 | StatusBar::draw(true); 148 | canvas.setTextSize(1.5); 149 | canvas.drawCenterString("Playing...", 120, 40); 150 | audio.setVolume(21); 151 | audio.connecttoFS(SD, ("/hydra/rec/" + name).c_str()); 152 | while (audio.isRunning()) { 153 | audio.loop(); 154 | M5Cardputer.update(); 155 | if (M5.BtnA.wasPressed() || M5Cardputer.Keyboard.isPressed()) { 156 | audio.stopSong(); 157 | break; 158 | } 159 | Utils::initCanvas(); 160 | StatusBar::draw(true); 161 | canvas.setTextSize(1.5); 162 | canvas.drawCenterString("Playing...", 120, 40); 163 | canvas.drawCenterString(name, 120, 60); 164 | canvas.drawCenterString(String(audio.getAudioCurrentTime()) + "s/" + String(audio.getAudioFileDuration()) + "s", 120, 80); 165 | canvas.pushSprite(0, 0); 166 | } 167 | this->currentComponent->forceRerender(); 168 | }); 169 | } 170 | entry.close(); 171 | } 172 | dir.close(); 173 | 174 | recordings.emplace_back("back", "<- Back", "", "", [this]() { 175 | AppManager::getInstance().closeCurrentApp(); 176 | AppManager::getInstance().openApp("AudioRecorder"); 177 | }); 178 | 179 | this->setComponent(new MenuComponent(*this, MENU_TYPE_LIST, recordings)); 180 | }); 181 | 182 | return *new MenuComponent(*this, MENU_TYPE_LIST, actions); 183 | } 184 | 185 | const uint8_t *getIcon() override { 186 | return rec_icon; 187 | } 188 | 189 | int getIconSize() override { 190 | return sizeof(rec_icon); 191 | } 192 | 193 | // Generate WAV header 194 | static void saveWavHeader(File file, uint32_t sampleRate, uint32_t dataSize) { 195 | char wav_header[44]; 196 | uint32_t byteRate = sampleRate * 1 * sizeof(int16_t); 197 | uint16_t blockAlign = 1 * sizeof(int16_t); 198 | uint16_t bitsPerSample = 16; 199 | 200 | memcpy(wav_header, "RIFF", 4); 201 | uint32_t chunkSize = 36 + dataSize; 202 | memcpy(wav_header + 4, &chunkSize, 4); 203 | memcpy(wav_header + 8, "WAVE", 4); 204 | memcpy(wav_header + 12, "fmt ", 4); 205 | uint32_t subChunk1Size = 16; 206 | memcpy(wav_header + 16, &subChunk1Size, 4); 207 | uint16_t audioFormat = 1; // PCM 208 | memcpy(wav_header + 20, &audioFormat, 2); 209 | uint16_t numChannels = 1; 210 | memcpy(wav_header + 22, &numChannels, 2); 211 | memcpy(wav_header + 24, &sampleRate, 4); 212 | memcpy(wav_header + 28, &byteRate, 4); 213 | memcpy(wav_header + 32, &blockAlign, 2); 214 | memcpy(wav_header + 34, &bitsPerSample, 2); 215 | memcpy(wav_header + 36, "data", 4); 216 | memcpy(wav_header + 40, &dataSize, 4); 217 | 218 | file.write((uint8_t *)wav_header, 44); 219 | } 220 | }; -------------------------------------------------------------------------------- /src/apps/Settings/Settings.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 05.06.2024. 3 | // 4 | 5 | #ifndef HYDRAOS_SETTINGS_CPP 6 | #define HYDRAOS_SETTINGS_CPP 7 | 8 | #include 9 | #include 10 | #include "ComponentApp.h" 11 | #include "Action.h" 12 | #include "components/MenuComponent.h" 13 | #include "Utils.h" 14 | #include 15 | #include "ScreenManager.h" 16 | #include "Preferences.h" 17 | #include "icon.h" 18 | 19 | class Settings : public ComponentApp { 20 | private: 21 | Preferences preferences; 22 | public: 23 | const char *getName() override { 24 | return "Settings"; 25 | } 26 | 27 | Component &initApp() override { 28 | preferences.begin("hydra_base", false); 29 | std::vector actions; 30 | 31 | actions.emplace_back("wifiinfo", "WiFi Information", "", "", [this]() { 32 | String preparedString; 33 | if (WiFiClass::status() != WL_CONNECTED) { 34 | preparedString = "WiFi Information\nSSID: Not connected"; 35 | } else { 36 | preparedString = 37 | "WiFi Information\nSSID: " + WiFi.SSID() + "\nIP: " + WiFi.localIP().toString() + "\nRSSI: " + 38 | WiFi.RSSI() + " dBm"; 39 | } 40 | Utils::popup(preparedString, 0, 1.5); 41 | this->currentComponent->forceRerender(); 42 | }); 43 | 44 | actions.emplace_back("wifi", "Connect to WiFi", "", "", [this]() { 45 | if (WiFi.status() == WL_CONNECTED) { 46 | Utils::popup("Already connected\nSSID:" 47 | + WiFi.SSID() + "\nIP: " + WiFi.localIP().toString(), 0, 1.5); 48 | this->currentComponent->forceRerender(); 49 | return; 50 | } 51 | Utils::initCanvas(); 52 | StatusBar::draw(true); 53 | canvas.setTextSize(1.5); 54 | canvas.drawString("SSID", 7, 30); 55 | canvas.drawFastHLine(5, 45, 230, WHITE); 56 | canvas.drawFastHLine(5, 60, 230, WHITE); 57 | canvas.setCursor(8, 47); 58 | canvas.drawString("Press G0 to exit", 7, 65); 59 | canvas.pushSprite(0, 0); 60 | String ssid = ""; 61 | Utils::waitForInput(ssid); 62 | if (ssid == "exit" || ssid == "") { 63 | this->currentComponent->forceRerender(); 64 | return; 65 | } 66 | Utils::initCanvas(); 67 | StatusBar::draw(true); 68 | canvas.setTextSize(1.5); 69 | canvas.drawString("SSID: " + ssid, 7, 30); 70 | canvas.drawString("Password", 7, 50); 71 | canvas.drawFastHLine(5, 65, 230, WHITE); 72 | canvas.drawFastHLine(5, 80, 230, WHITE); 73 | canvas.setCursor(8, 67); 74 | canvas.drawString("Press G0 to exit", 7, 85); 75 | canvas.pushSprite(0, 0); 76 | String pass = ""; 77 | Utils::waitForInput(pass); 78 | if (pass == "exit" || pass == "") { 79 | this->currentComponent->forceRerender(); 80 | return; 81 | } 82 | Utils::popup("Connecting to WiFi...", 1, 1.5); 83 | WiFi.mode(WIFI_STA); 84 | WiFi.begin(ssid.c_str(), pass.c_str()); 85 | int i = 0; 86 | while (WiFi.status() != WL_CONNECTED && i < 10) { 87 | delay(1000); 88 | i++; 89 | } 90 | if (WiFi.status() == WL_CONNECTED) { 91 | Utils::popup("Connected to WiFi\nIP: " + WiFi.localIP().toString(), 0, 1.5); 92 | // save to esp32 psram 93 | preferences.putString("ssid", ssid); 94 | preferences.putString("pass", pass); 95 | } else { 96 | Utils::popup("Failed to connect\n to WiFi", 0, 1.5); 97 | } 98 | this->currentComponent->forceRerender(); 99 | }); 100 | 101 | actions.emplace_back("scan", "Scan WiFi", "", "", [this]() { 102 | Utils::initCanvas(); 103 | StatusBar::draw(true); 104 | canvas.drawString("Scanning WiFi... Please wait", 7, 30); 105 | canvas.pushSprite(0, 0); 106 | int n = WiFi.scanNetworks(); 107 | Utils::initCanvas(); 108 | StatusBar::draw(true); 109 | canvas.drawString("Found " + String(n) + " networks", 7, 30); 110 | canvas.setCursor(8, 42); 111 | for (int i = 0; i < n; i++) { 112 | canvas.print(i + 1); 113 | canvas.print(": "); 114 | canvas.print(WiFi.SSID(i)); 115 | canvas.print(" ("); 116 | canvas.print(WiFi.RSSI(i)); 117 | canvas.println(" dBm)"); 118 | canvas.setCursor(8, canvas.getCursorY()); 119 | if (i == 8) { 120 | break; 121 | } 122 | } 123 | canvas.println("Press any key to continue"); 124 | canvas.pushSprite(0, 0); 125 | Utils::waitForKey(); 126 | this->currentComponent->forceRerender(); 127 | }); 128 | 129 | actions.emplace_back("about", "About HydraOS", "", "", [this]() { 130 | canvas.setTextColor(WHITE); 131 | Utils::popup("HydraOS 2.0.0\n" 132 | "Created by WauHundeland\n\n" 133 | "This is a simple operating system\n for the M5Cardputer.", 0); 134 | this->currentComponent->forceRerender(); 135 | }); 136 | 137 | actions.emplace_back("pin", "Set pin code", "", "", [this]() { 138 | if (preferences.isKey("pin")) { 139 | Utils::popup("Pin code already set", 0); 140 | this->currentComponent->forceRerender(); 141 | return; 142 | } 143 | Utils::initCanvas(); 144 | StatusBar::draw(true); 145 | canvas.setTextSize(1.5); 146 | canvas.drawString("Enter 4 digit pin code", 7, 30); 147 | canvas.drawFastHLine(5, 45, 230, WHITE); 148 | canvas.drawFastHLine(5, 65, 230, WHITE); 149 | canvas.setCursor(8, 47); 150 | canvas.drawString("Press G0 to exit", 7, 70); 151 | canvas.drawString("You have to enter the pin on boot", 7, 84); 152 | canvas.pushSprite(0, 0); 153 | String pin = ""; 154 | canvas.setTextSize(2); 155 | Utils::centerInput(pin, 4, 16, true); 156 | if (pin == "exit" || pin == "") { 157 | this->currentComponent->forceRerender(); 158 | return; 159 | } 160 | // check if pin is numeric 161 | for (int i = 0; i < pin.length(); i++) { 162 | if (!isDigit(pin[i])) { 163 | Utils::popup("Pin code must be numeric", 0, 1.5); 164 | this->currentComponent->forceRerender(); 165 | return; 166 | } 167 | } 168 | // confirm pin 169 | Utils::initCanvas(); 170 | StatusBar::draw(true); 171 | canvas.setTextSize(1.5); 172 | canvas.drawString("Confirm pin code", 7, 30); 173 | canvas.drawFastHLine(5, 45, 230, WHITE); 174 | canvas.drawFastHLine(5, 65, 230, WHITE); 175 | canvas.setCursor(8, 47); 176 | canvas.drawString("Press G0 to abort", 7, 70); 177 | canvas.pushSprite(0, 0); 178 | String confirmPin = ""; 179 | canvas.setTextSize(2); 180 | Utils::centerInput(confirmPin, 4, 16, true); 181 | if (confirmPin == "exit" || confirmPin == "") { 182 | this->currentComponent->forceRerender(); 183 | return; 184 | } 185 | if (pin != confirmPin) { 186 | Utils::popup("Pin codes do not match", 0, 1.5); 187 | this->currentComponent->forceRerender(); 188 | return; 189 | } 190 | preferences.putString("pin", pin); 191 | Utils::popup("Pin code set\n" + pin, 0, 1.5); 192 | this->currentComponent->forceRerender(); 193 | }); 194 | 195 | actions.emplace_back("removepin", "Remove pin code", "", "", [this]() { 196 | if (!preferences.isKey("pin")) { 197 | Utils::popup("No pin code set", 0); 198 | this->currentComponent->forceRerender(); 199 | return; 200 | } 201 | Utils::initCanvas(); 202 | StatusBar::draw(true); 203 | canvas.setTextSize(1.5); 204 | canvas.drawString("Enter 4 digit pin code", 7, 30); 205 | canvas.drawFastHLine(5, 45, 230, WHITE); 206 | canvas.drawFastHLine(5, 65, 230, WHITE); 207 | canvas.setCursor(8, 47); 208 | canvas.drawString("Press G0 to exit", 7, 60); 209 | canvas.pushSprite(0, 0); 210 | String pin = ""; 211 | canvas.setTextSize(2); 212 | Utils::centerInput(pin, 4, 16, true); 213 | if (pin == "exit" || pin == "") { 214 | this->currentComponent->forceRerender(); 215 | return; 216 | } 217 | if (pin != preferences.getString("pin")) { 218 | Utils::popup("Wrong pin code", 0, 1.5); 219 | this->currentComponent->forceRerender(); 220 | return; 221 | } 222 | preferences.remove("pin"); 223 | Utils::popup("Pin code removed", 0, 1.5); 224 | this->currentComponent->forceRerender(); 225 | }); 226 | 227 | return *new MenuComponent(*this, MenuType::MENU_TYPE_LIST, actions, ""); 228 | } 229 | 230 | const uint8_t *getIcon() override { 231 | return settings_icon; 232 | } 233 | 234 | int getIconSize() override { 235 | return sizeof(settings_icon); 236 | } 237 | }; 238 | 239 | #endif //HYDRAOS_SETTINGS_CPP -------------------------------------------------------------------------------- /src/apps/DinoRunner/icon.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 07.06.2024. 3 | // 4 | 5 | #ifndef HYDRAOS_DINORUNNER_ICON_H 6 | #define HYDRAOS_DINORUNNER_ICON_H 7 | 8 | const uint8_t dino_icon[]={ 9 | 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x08,0x06,0x00,0x00,0x00,0x38,0x4e,0x7a,0xea 10 | ,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,0x08,0xb7,0x49,0x44,0x41,0x54,0x78,0x5e,0xed,0x5c,0x69,0x6c,0x4d,0x5b,0x14,0xfe,0x8e 11 | ,0x79,0x9e,0x42,0x09,0x51,0xe3,0xe3,0xf9,0x61,0xfc,0x81,0x67,0x8a,0xc4,0xa3,0x3f,0x4c,0x09,0xad,0x6a,0xf0,0x28,0x62,0xae,0x20,0x66,0xe1,0x87,0x99,0x88,0xa9,0x66 12 | ,0x0d,0x52,0x91,0x92,0xf2,0xc4,0xec,0x49,0xff,0xa8,0xd2,0x10,0x62,0x8c,0x36,0x1a,0x53,0x4d,0x55,0x43,0xa2,0xa8,0xa1,0xf4,0x3e,0xdf,0x76,0xf7,0xed,0xbd,0x6d,0x6f 13 | ,0xef,0x39,0xe7,0xee,0x72,0x87,0xb3,0x92,0xfe,0xe8,0xbd,0x7b,0xef,0xb3,0xf7,0x77,0xd6,0x5e,0x7b,0xad,0x6f,0xad,0xbb,0x35,0xb8,0x11,0x9b,0xcd,0x16,0x02,0xa0,0x17 14 | ,0x80,0x30,0x00,0x3d,0x00,0x84,0x02,0xa8,0xe2,0xae,0xbd,0x1f,0x7f,0x9e,0x0b,0x20,0x13,0x40,0x0a,0x80,0xff,0x00,0x24,0x6b,0x9a,0x96,0x5d,0xdc,0x7a,0xb4,0xc2,0x1f 15 | ,0xda,0x6c,0xb6,0xf2,0x00,0xa2,0x00,0xc4,0x02,0xa8,0xe1,0xc7,0x20,0x98,0x9d,0x7a,0x0e,0x80,0x18,0x00,0x09,0x9a,0xa6,0xe5,0x39,0x0f,0xe2,0x02,0x96,0xcd,0x66,0x6b 16 | ,0x00,0xe0,0x90,0x5d,0x93,0xca,0x98,0x7d,0x5a,0x00,0xf4,0xcb,0xb7,0x6b,0x5a,0xa4,0xa6,0x69,0x59,0x72,0x3d,0x0e,0xb0,0xec,0x40,0xfd,0xfb,0x43,0x15,0xff,0x0a,0x80 17 | ,0xc5,0xaa,0x5a,0x42,0x2a,0x80,0x21,0x12,0x30,0x01,0x96,0x7d,0xeb,0x25,0xd9,0x6d,0x94,0xaa,0x07,0x05,0xca,0x38,0xc9,0x3f,0xb4,0xec,0x6f,0x6e,0x49,0x09,0xd6,0x3f 18 | ,0x00,0xf6,0x02,0x08,0xe6,0xad,0xe7,0xee,0xe5,0x72,0x4b,0x46,0x6b,0x9a,0x16,0xaf,0xd9,0x4f,0xbd,0x8c,0x20,0x35,0xe6,0x7a,0xb5,0x9f,0x46,0xff,0x0f,0x82,0x15,0x0e 19 | ,0x20,0x51,0x6f,0xaf,0x20,0x6e,0x17,0x41,0xb0,0x76,0x03,0x18,0x1f,0xc4,0x20,0xe8,0x5d,0x7a,0x1c,0xc1,0x4a,0x03,0xf0,0xa7,0xde,0x1e,0x41,0xdc,0x2e,0x9d,0x60,0x7d 20 | ,0x0c,0x50,0xcf,0x5c,0xf5,0x7b,0xcd,0x25,0x58,0x36,0xd5,0xa3,0xaa,0x18,0x8f,0xd3,0x3a,0x73,0xe6,0x0c,0x6e,0xde,0xbc,0xa9,0x62,0x38,0x31,0x46,0xa3,0x46,0x8d,0x10 21 | ,0x15,0x15,0x85,0xf2,0xe5,0x19,0xa4,0x18,0x17,0x9f,0x05,0xeb,0xeb,0xd7,0xaf,0x98,0x36,0x6d,0x1a,0x3e,0x7c,0xf8,0x60,0x7c,0x55,0x6e,0x7a,0x94,0x2b,0x57,0x0e,0xeb 22 | ,0xd7,0xaf,0x47,0xdd,0xba,0x75,0x4d,0x8d,0xe9,0x93,0x60,0xdd,0xbd,0x7b,0x17,0xef,0xdf,0xbf,0xc7,0xce,0x9d,0x3b,0xd1,0xa9,0x53,0x27,0x4c,0x98,0x30,0x01,0xb7,0x6f 23 | ,0xdf,0x16,0x0b,0x2c,0x5b,0xb6,0x2c,0x5a,0xb5,0x6a,0x85,0x2a,0x55,0x8c,0xc5,0xf4,0xc7,0x8f,0x1f,0x47,0x62,0x62,0x22,0xc6,0x8e,0x1d,0x8b,0x3a,0x75,0xea,0xa0,0x6d 24 | ,0xdb,0xb6,0x28,0x53,0xc6,0x98,0x5b,0xe9,0x73,0x60,0xdd,0xbf,0x7f,0x1f,0x8b,0x17,0x2f,0x76,0xbc,0xf9,0xde,0xbd,0x7b,0xa3,0x43,0x87,0x0e,0xd8,0xb8,0x71,0xa3,0xe3 25 | ,0xb3,0x7e,0xfd,0xfa,0x61,0xcc,0x98,0x31,0x86,0xb4,0x23,0x29,0x29,0x09,0x7b,0xf6,0xec,0x71,0xf4,0xe1,0x76,0x1c,0x38,0x70,0xa0,0xa1,0x31,0x7c,0x0e,0xac,0xb4,0xb4 26 | ,0x34,0x2c,0x5b,0xb6,0x0c,0x13,0x27,0x4e,0x44,0x8b,0x16,0x2d,0xc4,0x96,0xb9,0x72,0xe5,0x0a,0x76,0xed,0xda,0x85,0x99,0x33,0x67,0x62,0xf3,0xe6,0xcd,0xe8,0xd2,0xa5 27 | ,0x0b,0xa6,0x4c,0x99,0x62,0x68,0xa1,0xdf,0xbe,0x7d,0x43,0x56,0x56,0x16,0xbe,0x7f,0xff,0x8e,0x05,0x0b,0x16,0x60,0xf0,0xe0,0xc1,0x88,0x8c,0x8c,0x34,0x34,0x86,0xcf 28 | ,0x82,0x45,0xed,0x6a,0xd3,0xa6,0x8d,0x58,0x4c,0x72,0x72,0x32,0x76,0xec,0xd8,0x81,0xd0,0xd0,0x50,0x3c,0x79,0xf2,0x04,0xdd,0xbb,0x77,0x37,0x0c,0x96,0x44,0xe5,0xf3 29 | ,0xe7,0xcf,0x62,0x2b,0x06,0x2c,0x58,0x0f,0x1e,0x3c,0xc0,0xa1,0x43,0x64,0x8e,0x7e,0x4a,0x58,0x58,0x98,0xb0,0x65,0x66,0x24,0xe0,0xc1,0x32,0x03,0x8a,0xbb,0x3e,0x16 30 | ,0x58,0x06,0xd0,0xb4,0xc0,0xb2,0xc0,0x2a,0x30,0xf0,0x06,0xb0,0xf0,0xd8,0xd4,0xd2,0x2c,0x8f,0x10,0x15,0x34,0x08,0x6a,0xb0,0x72,0x73,0x73,0x71,0xe0,0xc0,0x01,0xd0 31 | ,0x8f,0xd2,0x23,0xf4,0xb3,0x2e,0x5d,0xba,0x14,0xb8,0xae,0x43,0x49,0x20,0x3c,0x7a,0xf4,0x08,0x8b,0x16,0x2d,0x42,0xb5,0x6a,0xd5,0x50,0xa1,0x42,0x05,0x3d,0x78,0x89 32 | ,0x30,0x27,0x3c,0x3c,0x1c,0x3d,0x7b,0xf6,0xd4,0xd5,0x5e,0x36,0xf2,0x0b,0xa7,0x54,0x0f,0x58,0xb3,0x66,0xcd,0x12,0x61,0x51,0x71,0x42,0x70,0x34,0xad,0x48,0x8a,0xd4 33 | ,0x10,0x50,0x6c,0xec,0xf7,0x60,0x65,0x66,0x66,0x8a,0xf0,0x85,0x60,0xb8,0x03,0xa4,0x7f,0xff,0xfe,0x18,0x3e,0x7c,0xb8,0x61,0x70,0x0a,0x77,0xf0,0x7b,0xb0,0xbe,0x7c 34 | ,0xf9,0x82,0x94,0x94,0x94,0x62,0x6d,0x16,0xbf,0x3b,0x72,0xe4,0x88,0xd8,0x6e,0xe3,0xc7,0x7b,0xcf,0x9c,0x1b,0x06,0xeb,0xe1,0xc3,0x87,0x2e,0xd1,0xfb,0xe8,0xd1,0xa3 35 | ,0xd1,0xb2,0x65,0x4b,0xaf,0xdf,0x5a,0x6a,0x6a,0x2a,0x4e,0x9f,0x3e,0x0d,0x2e,0xf0,0xe9,0xd3,0xa7,0x82,0x79,0x90,0xb1,0x61,0x71,0x83,0x5f,0xbe,0x7c,0x19,0x27,0x4f 36 | ,0x9e,0x2c,0xf1,0xb9,0xf9,0xf9,0xf9,0x78,0xfc,0xf8,0x31,0xc8,0x5c,0xfc,0x16,0xb0,0xc8,0x09,0x1d,0x3d,0x7a,0x14,0x35,0x6b,0xd6,0xc4,0xbb,0x77,0xef,0x04,0xf3,0x68 37 | ,0x94,0xea,0x28,0x6e,0x85,0x5b,0xb6,0x6c,0x01,0x01,0xab,0x55,0xab,0x16,0x2a,0x57,0xae,0x8c,0x25,0x4b,0x96,0xa0,0x46,0x0d,0xf7,0xa5,0x16,0xcb,0x97,0x2f,0x47,0x7a 38 | ,0x7a,0xba,0x68,0xef,0x49,0xb8,0x05,0x7b,0xf4,0x60,0x6d,0x8b,0x77,0x62,0x58,0xb3,0x18,0xd0,0x1e,0x3b,0x76,0x0c,0x6b,0xd6,0xac,0x11,0xa7,0x10,0x4f,0x95,0x41,0x83 39 | ,0x06,0x99,0x9a,0x05,0xdf,0xfc,0xb5,0x6b,0xd7,0x90,0x97,0x97,0x87,0x73,0xe7,0xce,0xe1,0xd9,0xb3,0x67,0x20,0x68,0x15,0x2b,0x56,0xf4,0x38,0x1e,0x69,0x9c,0x97,0x2f 40 | ,0x5f,0x8a,0xf6,0xbf,0x4a,0x7e,0x2b,0x58,0x2f,0x5e,0xbc,0xc0,0x9c,0x39,0x73,0x40,0xd0,0x28,0xf5,0xea,0xd5,0xc3,0xba,0x75,0xeb,0x74,0x71,0xe4,0x41,0x07,0x16,0x35 41 | ,0x69,0xde,0xbc,0x79,0x18,0x37,0x6e,0x9c,0xe0,0xa8,0x78,0xc4,0x93,0x27,0xd7,0x23,0x7e,0x09,0x16,0xb9,0xf0,0xea,0xd5,0xab,0xa3,0x76,0xed,0xda,0x98,0x3d,0x7b,0x76 42 | ,0x89,0x8e,0x21,0xa9,0x61,0x02,0x24,0x85,0x5e,0x37,0xb7,0xd2,0xa4,0x49,0x93,0xd0,0xab,0x17,0xeb,0xe6,0xf4,0x0b,0xc1,0xba,0x77,0xef,0x1e,0x1a,0x34,0x60,0x95,0x54 43 | ,0x81,0x34,0x6e,0xdc,0x18,0x31,0x31,0x31,0x4a,0xfc,0x2a,0xaf,0x5d,0x07,0x69,0xb3,0xc8,0x5c,0x1e,0x3c,0x78,0x10,0x9f,0x3e,0x7d,0x02,0x4f,0xc8,0x9c,0x9c,0x1c,0xc4 44 | ,0xc6,0xc6,0xa2,0x6a,0xd5,0xaa,0x6e,0x57,0xcc,0x6c,0x0d,0xb7,0x5c,0xeb,0xd6,0xad,0x5d,0xda,0xd0,0xee,0x31,0x4d,0x65,0x44,0xae,0x5e,0xbd,0x2a,0xc2,0x16,0xe7,0x4c 45 | ,0x1e,0x0d,0x3e,0x7d,0x2d,0xda,0x31,0xa3,0xc9,0x08,0x3d,0xcf,0x36,0x6d,0xb3,0x48,0xfe,0x57,0xaa,0x54,0x49,0x3c,0x23,0x2e,0x2e,0x0e,0x17,0x2e,0x5c,0x10,0xc6,0x9e 46 | ,0x60,0x51,0x4b,0xe4,0x76,0x62,0xe0,0x7a,0xfe,0xfc,0x79,0xd1,0xee,0xf0,0xe1,0xc3,0x02,0x28,0x6a,0xa0,0xb7,0xf2,0xf6,0xed,0x5b,0x71,0x38,0x48,0x7b,0x47,0x5f,0x8a 47 | ,0x9a,0x4b,0xb7,0xc3,0xa7,0xc1,0x92,0xee,0x84,0x04,0x60,0xfa,0xf4,0xe9,0xe8,0xda,0xb5,0xab,0xf8,0xf7,0xc6,0x8d,0x1b,0x58,0xbb,0x76,0xad,0x03,0x1b,0xfa,0x3c,0x4c 48 | ,0x6d,0x79,0x2b,0xab,0x57,0xaf,0xc6,0xad,0x5b,0xb7,0x1c,0xc3,0xcc,0x9d,0x3b,0x57,0xf8,0x69,0x3e,0x0f,0x16,0x6d,0x4f,0x76,0x76,0xb6,0xb0,0x47,0x1b,0x36,0x6c,0xc0 49 | ,0x88,0x11,0x23,0xd0,0xb1,0x63,0x47,0xb1,0x10,0x66,0x6b,0xa8,0x85,0xcc,0xcc,0x70,0xab,0xd5,0xaf,0x5f,0x5f,0xc9,0x16,0xa1,0xcd,0x7a,0xfe,0xfc,0xb9,0x38,0x1c,0xf8 50 | ,0x4c,0x26,0x21,0xa8,0xc1,0xaf,0x5f,0xbf,0xf6,0x6d,0xcd,0x92,0xaf,0x97,0x99,0x97,0xf9,0xf3,0xe7,0xbb,0xd8,0x11,0x7e,0x47,0x3b,0xb2,0x6a,0xd5,0x2a,0x91,0x9d,0x51 51 | ,0x25,0xf2,0x34,0xa4,0x46,0x31,0x36,0x94,0xb6,0x8b,0x09,0x54,0xa6,0xcb,0x7c,0xd6,0x66,0x49,0x00,0x38,0x61,0x86,0x21,0xf4,0xec,0x9d,0x85,0x27,0x66,0xb7,0x6e,0xdd 52 | ,0x44,0x36,0x59,0x95,0x48,0xb0,0x36,0x6d,0xda,0x24,0x0c,0x3d,0x79,0x2d,0x0a,0x43,0x24,0x95,0x2f,0xc5,0x79,0xbe,0x4a,0x0c,0xbc,0x2a,0x00,0x8c,0x8c,0xe3,0x57,0x7e 53 | ,0x96,0xf3,0x69,0x68,0x64,0x91,0xaa,0xda,0xfa,0x15,0x58,0xf4,0xb3,0xe8,0x3a,0xd0,0x45,0x28,0x0d,0xfb,0xe0,0x0e,0x54,0x1e,0x26,0x74,0x17,0x78,0x1a,0xf2,0x50,0xf1 54 | ,0xe9,0xd8,0x90,0xfc,0x10,0xff,0xa4,0xf0,0x34,0xea,0xd3,0xa7,0x8f,0x2a,0x85,0xf1,0x38,0xce,0xe4,0xc9,0x93,0x1d,0x36,0x31,0x24,0x24,0xc4,0xa5,0x60,0xc4,0x63,0x67 55 | ,0x2f,0x1b,0x18,0xb6,0x59,0xe4,0x9b,0xae,0x5f,0xbf,0x2e,0x26,0xbc,0x7f,0xff,0x7e,0x0c,0x1b,0x36,0xcc,0x34,0xeb,0x60,0x66,0xee,0xac,0x9e,0x69,0xd6,0xac,0x19,0xfa 56 | ,0xf6,0xed,0x2b,0xdc,0x10,0x16,0x8f,0xfc,0x2a,0x31,0x0c,0x96,0x9c,0x18,0xfd,0x19,0xf2,0xde,0xac,0xa2,0x23,0xff,0xd4,0xbc,0x79,0x73,0xd0,0x19,0xd5,0x1b,0x08,0x9b 57 | ,0x5d,0x20,0xc1,0xea,0xdc,0xb9,0xb3,0xe9,0xc2,0x10,0xb3,0xcf,0x15,0x2e,0x90,0xd9,0x32,0x49,0x56,0xe6,0xb1,0xd8,0x8c,0x76,0xe3,0xd5,0xab,0x57,0xe0,0xff,0x9e,0x62 58 | ,0x43,0x6f,0x26,0x2a,0xfb,0xfa,0x25,0x58,0xce,0x0b,0x97,0xb1,0xe1,0xd0,0xa1,0x43,0x05,0xbb,0x49,0xba,0xc5,0x6c,0xdd,0x66,0x71,0x80,0xb2,0x54,0xf2,0xe2,0xc5,0x8b 59 | ,0xe2,0x2b,0xe6,0x08,0x19,0x4a,0x19,0xad,0xcf,0x52,0xf1,0xa2,0x4c,0x6b,0x96,0xf3,0xc3,0xc9,0x3e,0x9c,0x3a,0x75,0x4a,0x78,0xd1,0x3c,0xa9,0x9c,0x63,0x43,0x15,0x93 60 | ,0x24,0x50,0x5b,0xb7,0x6e,0x15,0xa7,0x2e,0xa3,0x81,0x01,0x03,0x06,0x18,0x2e,0x44,0x53,0x31,0x0f,0x25,0x60,0x49,0x90,0x98,0xf0,0x64,0xa2,0x61,0xea,0xd4,0xa9,0x42 61 | ,0xbb,0x54,0x09,0x8b,0xd9,0x58,0xf9,0xb7,0x72,0xe5,0x4a,0x11,0x5f,0xaa,0xca,0x03,0x1a,0x9d,0x9f,0x12,0xb0,0xe4,0x43,0xc9,0x6b,0x91,0x97,0x27,0x19,0xc8,0xec,0x30 62 | ,0x0d,0xf1,0xa8,0x51,0xa3,0x8c,0xce,0x49,0xb4,0x67,0x9a,0x9d,0xf1,0x24,0xc9,0x41,0x9e,0xc0,0x0c,0x67,0xc8,0x5e,0x34,0x6c,0xd8,0xd0,0xd4,0x78,0x2a,0x3a,0x29,0x05 63 | ,0x8b,0x5b,0x30,0x3e,0x3e,0x5e,0x10,0x82,0x8c,0x11,0x59,0x55,0xbc,0x70,0xe1,0x42,0x53,0xf3,0x24,0x40,0x24,0x0b,0x79,0xd2,0x32,0xde,0x63,0x7c,0xc9,0x1a,0x50,0xc9 64 | ,0xa1,0x99,0x1a,0xd4,0xcb,0x4e,0x4a,0xc1,0x92,0x73,0x21,0x68,0x5c,0x28,0xdd,0x08,0x16,0xcb,0xd2,0xd8,0x33,0x03,0x54,0x78,0xa1,0xd4,0x1e,0xfe,0x30,0x40,0x06,0xde 65 | ,0xf4,0x9f,0x18,0x70,0x53,0x24,0x58,0xed,0xdb,0xb7,0x17,0x63,0xf9,0x82,0x94,0x0a,0x58,0xb4,0x61,0xcc,0xfb,0xb1,0x4c,0x5b,0xf8,0x27,0x9a,0x26,0xec,0x4d,0x93,0x26 66 | ,0x4d,0x5c,0xd6,0x4c,0x3e,0x8a,0x14,0x8b,0x64,0x3b,0xb9,0x7d,0xe9,0x7e,0x70,0x0b,0x07,0x0d,0x58,0x44,0x84,0x00,0x90,0x97,0xbf,0x73,0xe7,0x0e,0xb6,0x6f,0xdf,0x8e 67 | ,0x15,0x2b,0x56,0xa0,0x69,0xd3,0xa6,0x02,0x2c,0x7e,0x47,0x46,0x93,0xa5,0xd6,0xe4,0x9e,0x46,0x8e,0x1c,0x29,0x48,0x42,0xb6,0x25,0x1f,0xc6,0xad,0xc7,0xb4,0x18,0x35 68 | ,0x2a,0xe0,0x35,0xcb,0x59,0x7d,0x18,0x1a,0x31,0x17,0xe8,0x0c,0x56,0x42,0x42,0x02,0x4e,0x9c,0x38,0xe1,0x68,0xc6,0xd3,0x93,0x14,0x31,0x79,0x7c,0x29,0x64,0x15,0x18 69 | ,0x2c,0x07,0x3d,0x58,0xdb,0xb6,0x6d,0x13,0xa9,0xfa,0x19,0x33,0x66,0x08,0x6c,0xda,0xb5,0x6b,0x27,0x0e,0x85,0x8c,0x8c,0x0c,0xb0,0x2a,0x86,0x9c,0x3e,0xb7,0x27,0x7d 70 | ,0xab,0xa0,0x05,0x8b,0xd5,0x2e,0xa4,0x9e,0xf9,0x47,0x57,0x60,0xdf,0xbe,0x7d,0x45,0xec,0xb6,0xfc,0x85,0x45,0xd0,0x83,0xc5,0xed,0x48,0xc3,0xcd,0xc4,0x28,0x6d,0x12 71 | ,0x3d,0xfd,0xc2,0x62,0x81,0x65,0xb7,0x59,0x04,0x8b,0xb4,0x4a,0x74,0x74,0xb4,0x70,0x5c,0x59,0x89,0xe3,0x09,0x2c,0xfa,0x6a,0xac,0xd4,0xa1,0x9f,0xc5,0xac,0xb7,0x8a 72 | ,0x0a,0x3e,0xb3,0x6e,0x48,0xa9,0xb8,0x0e,0xee,0x0c,0x3c,0x93,0xa0,0x64,0x29,0x28,0x4c,0xc6,0xee,0xde,0xcd,0x9f,0x67,0xbb,0x8a,0xd4,0x2c,0x66,0x6c,0xc8,0x82,0xf2 73 | ,0xa7,0x74,0x14,0xfa,0x6c,0xf4,0xe0,0x0b,0xa7,0xeb,0xcd,0x2e,0xdc,0x4c,0xbf,0x5f,0x0a,0x16,0x9d,0x53,0xba,0x0b,0x67,0xcf,0x9e,0x15,0xc6,0xbc,0x24,0x9b,0xc5,0x18 74 | ,0x93,0xda,0xc7,0x70,0x87,0x00,0xb2,0x0f,0xcb,0x9c,0x8c,0xa6,0xf9,0xcd,0x80,0xe2,0xae,0x4f,0xa9,0x83,0x55,0x38,0x23,0x2d,0x27,0xc2,0x1a,0xac,0xbd,0x7b,0x79,0xef 75 | ,0x86,0xab,0xb0,0x5e,0x61,0xe9,0xd2,0xa5,0x45,0x3e,0x67,0xf0,0x1c,0xf0,0x60,0xbd,0x79,0xf3,0x46,0x80,0xc2,0x82,0x35,0x67,0x61,0x69,0x65,0x44,0x44,0x44,0x11,0x50 76 | ,0x58,0x1b,0x41,0x86,0xe1,0xe3,0x47,0xfe,0xce,0xbd,0x40,0x58,0xe1,0x47,0xbe,0x5f,0x6f,0xf9,0xb6,0x4a,0x8d,0x92,0x63,0x59,0xbf,0xbe,0xd7,0x8f,0xaa,0xf8,0xf5,0xbd 77 | ,0x75,0xaf,0x83,0x3e,0xc0,0xc4,0xbd,0x0e,0xd6,0x8d,0x21,0xfa,0xc0,0x12,0x37,0x86,0x58,0x77,0xd1,0xe8,0x03,0x4b,0xdc,0x45,0xc3,0xbb,0xfd,0xac,0x5b,0x8e,0x4a,0x06 78 | ,0xec,0xe7,0x2d,0x47,0x6c,0x63,0xb3,0xd9,0xac,0xfb,0xb3,0xdc,0x83,0x55,0x70,0x7f,0x96,0x1d,0x2c,0xde,0x37,0x62,0xdd,0xcc,0x56,0x3c,0x60,0xae,0x37,0xb3,0xd9,0x01 79 | ,0x63,0xd9,0xaf,0x75,0xe7,0x9f,0x2b,0x60,0x45,0xef,0xfc,0x93,0xdf,0x5b,0xb7,0x49,0x3a,0x90,0x2a,0xf9,0x36,0x49,0x27,0xc0,0xac,0x7b,0x4a,0xf5,0xdc,0x53,0xea,0xac 80 | ,0x81,0xd6,0x0d,0xb8,0x45,0x0d,0xd8,0xff,0xe4,0xa1,0x7e,0x47,0x5d,0xa5,0xc5,0xbe,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82}; 81 | 82 | #endif //HYDRAOS_DINORUNNER_ICON_H 83 | -------------------------------------------------------------------------------- /src/apps/LEDApp/icon.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 05.06.2024. 3 | // 4 | 5 | #ifndef HYDRAOS_LEDAPP_ICON_H 6 | #define HYDRAOS_LEDAPP_ICON_H 7 | 8 | const uint8_t ledapp_icon[]={ 9 | 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x08,0x06,0x00,0x00,0x00,0x38,0x4e,0x7a,0xea 10 | ,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,0x0a,0x52,0x49,0x44,0x41,0x54,0x78,0x5e,0xed,0x5c,0x7b,0x5c,0x8f,0x67,0x1b,0xff,0xfe 11 | ,0x4a,0x3a,0x50,0x68,0x19,0xbd,0x2f,0xdb,0xe2,0x9d,0x43,0x7c,0x4c,0xe4,0xb0,0x86,0xe9,0x30,0x59,0x36,0x87,0x84,0x39,0xcb,0x21,0x39,0x97,0xbd,0x89,0xb7,0xc2,0x24 12 | ,0xc2,0x9b,0x62,0x9d,0x28,0xc2,0x1c,0x42,0x25,0xb3,0x49,0xd2,0xe1,0x8d,0xa9,0x39,0x9b,0x6d,0x39,0x9f,0xbd,0x68,0x8b,0x59,0x07,0x95,0xea,0x37,0xd7,0xa3,0xdf,0x53 13 | ,0x4f,0xf5,0xd3,0xef,0x70,0xff,0x9e,0x8c,0xae,0xbf,0xfa,0xf4,0xdc,0xf7,0x75,0x7f,0xef,0xef,0xef,0xba,0xef,0xfb,0x7a,0xae,0xfb,0x7a,0x2e,0x09,0xe4,0x88,0x54,0x2a 14 | ,0x7d,0x1b,0x40,0x3f,0x00,0xf6,0x00,0xfa,0x00,0x78,0x07,0x80,0x81,0xbc,0xf6,0x7f,0xe3,0xff,0x17,0x00,0xb8,0x0d,0xe0,0x18,0x80,0x44,0x00,0xe9,0x12,0x89,0x24,0xbb 15 | ,0xa6,0xf9,0x48,0xaa,0xfe,0x53,0x2a,0x95,0xea,0x00,0x18,0x0d,0xe0,0x6b,0x00,0x46,0x7f,0x63,0x12,0x54,0x85,0xfe,0x27,0x80,0x39,0x00,0x76,0x49,0x24,0x92,0x67,0x95 16 | ,0x95,0x08,0xc8,0x92,0x4a,0xa5,0x2d,0x01,0xec,0x2e,0xb7,0x24,0x2d,0x55,0x47,0x7b,0x0d,0xfa,0x95,0x95,0x5b,0xda,0x28,0x89,0x44,0xf2,0x40,0x36,0x1f,0x9e,0xac,0x72 17 | ,0xa2,0xe2,0x9e,0x9b,0xe2,0x87,0xaf,0xc1,0x64,0x59,0x4d,0x21,0x03,0x80,0xa3,0x8c,0x30,0x8e,0xac,0xf2,0xa5,0x77,0xa4,0x7c,0x8f,0x62,0x35,0xd0,0xeb,0xa2,0x27,0xfd 18 | ,0xb9,0x95,0xd9,0xd1,0x92,0x94,0x91,0x35,0x01,0x40,0x14,0x80,0x37,0x79,0xe9,0xc9,0xfb,0x71,0x69,0x49,0x3a,0x4b,0x24,0x92,0x6d,0x92,0xf2,0x53,0xef,0xca,0x1b,0xba 19 | ,0x99,0x2b,0x6a,0xfd,0xb4,0xe9,0xbf,0x4f,0x64,0x39,0x01,0xd8,0xab,0x68,0xaf,0x37,0xb8,0xdd,0x08,0x22,0x2b,0x02,0xc0,0xd4,0x37,0x98,0x04,0x45,0xa7,0x1e,0x49,0x64 20 | ,0x65,0x01,0xe8,0xa0,0x68,0x0f,0xd6,0xed,0x9e,0x3d,0x2b,0xc1,0xd9,0xf3,0x97,0x70,0xf9,0xea,0x6d,0xdc,0xba,0xf3,0x00,0xb9,0x79,0x05,0x28,0x2e,0x7e,0x86,0x86,0x0d 21 | ,0x75,0x60,0xd8,0xd8,0x00,0xef,0xbd,0x6b,0x8a,0xb6,0x66,0xad,0xd0,0xbb,0x47,0x67,0xd6,0x43,0x2b,0xab,0xef,0x22,0x91,0x95,0x2f,0xa6,0x67,0x5e,0x56,0x26,0x45,0xd6 22 | ,0xa5,0x1b,0xf8,0x21,0xf3,0x27,0x1c,0x49,0x3d,0x81,0xcc,0x93,0x3f,0xd3,0x69,0x5c,0x2b,0x70,0x1d,0x9d,0x06,0xb0,0xe8,0xd2,0x1e,0x36,0xfd,0x2d,0xd1,0xcf,0xaa,0x2b 23 | ,0x3a,0x75,0x6c,0x0b,0x2d,0xad,0x6a,0x3e,0x75,0xad,0x7a,0xd4,0x68,0x50,0x40,0x64,0xd5,0x8e,0x54,0x8d,0x11,0x64,0x5d,0x4b,0xcb,0xca,0x70,0xf5,0xda,0x1d,0x2c,0xf1 24 | ,0x8b,0xc0,0x0f,0x99,0xe7,0xd5,0xd2,0x28,0x91,0x48,0xd0,0xbf,0x6f,0x37,0x78,0x2f,0x98,0x8c,0xb6,0x6d,0x5a,0x41,0x5b,0x4b,0x9c,0x43,0x5c,0x14,0xb2,0x0a,0x8b,0x8a 25 | ,0xe1,0xec,0xea,0x8b,0x93,0x67,0x7e,0x45,0x51,0x51,0xb1,0x5a,0x44,0x55,0xee,0xac,0xa7,0xa7,0x8b,0x5e,0x96,0xe6,0x88,0x0c,0xf6,0x86,0x9e,0x5e,0x43,0x66,0x7a,0xe5 26 | ,0x29,0xd2,0x38,0x59,0x87,0x92,0x32,0xb0,0x70,0x69,0x08,0x72,0x72,0x9e,0xc8,0x9d,0x4c,0xeb,0x56,0x2d,0x60,0xde,0xde,0x0c,0xa6,0xa6,0x26,0x30,0x32,0x6c,0xc4,0xed 27 | ,0x57,0xa5,0x25,0xa5,0x78,0xfc,0x24,0x17,0x77,0xef,0x65,0x73,0x16,0x79,0xf3,0xf6,0x7d,0xb9,0xfd,0x9b,0x36,0x31,0xc4,0xea,0xe5,0x73,0xf0,0xe9,0x27,0x9a,0x7d,0xf9 28 | ,0xd0,0x18,0x59,0xb4,0x37,0x85,0x45,0xc6,0xc2,0x7f,0xed,0xd6,0x6a,0x93,0xa4,0x65,0x44,0x9b,0x76,0xff,0xbe,0x16,0x98,0x3c,0x7e,0x30,0x88,0xac,0xda,0xe4,0x41,0xf6 29 | ,0x23,0x6c,0xd9,0xfe,0x1d,0x0e,0x1d,0xc9,0xc0,0xf5,0x1b,0xf7,0x6a,0xdc,0xe7,0x3c,0xdd,0x27,0x60,0xe6,0x34,0x27,0x8d,0xed,0x65,0x1a,0x21,0x8b,0xb6,0xc1,0xaf,0x56 30 | ,0x44,0x22,0x6a,0xfb,0x01,0x94,0x55,0xd9,0x12,0x8d,0x9b,0x19,0x21,0x32,0xc4,0x1b,0x16,0x1f,0xb4,0x43,0x03,0x6d,0xed,0xda,0x38,0xaa,0xf6,0xbc,0xa4,0xa4,0x94,0x3b 31 | ,0x14,0xa6,0xce,0xf6,0x43,0x7e,0xfe,0x53,0xc1,0x73,0xfa,0x11,0x46,0x0c,0xb3,0xc5,0x7f,0xfd,0xe6,0x82,0xfe,0x66,0x2d,0x1a,0x21,0x2b,0x60,0xfd,0x0e,0xac,0x0f,0xdf 32 | ,0x83,0xb2,0x32,0x7a,0x53,0xa8,0x10,0xb7,0x99,0x5f,0xc0,0x65,0xf2,0x30,0xce,0x25,0x50,0x57,0xf2,0x0b,0x0a,0x11,0x1e,0x19,0x8b,0xa0,0xd0,0x68,0x81,0x2a,0x2d,0x2d 33 | ,0x2d,0xcc,0x76,0x71,0x82,0x87,0xdb,0x78,0x75,0x87,0xa8,0xbe,0x22,0x58,0x9f,0x86,0xfb,0x0e,0xa4,0x61,0xae,0x47,0x80,0x60,0x20,0xdd,0x86,0x3a,0x08,0x5e,0xeb,0x81 34 | ,0x81,0x76,0xec,0xf7,0x94,0x43,0x47,0x32,0xe1,0xee,0xb9,0x16,0x79,0x55,0xac,0x6c,0xdd,0xea,0xf9,0x70,0x1c,0x6c,0xcd,0x94,0x30,0xa6,0x96,0x95,0x97,0x57,0x00,0x2b 35 | ,0xbb,0xa9,0x78,0xfc,0x47,0x2e,0x0f,0xb2,0x91,0x81,0x3e,0x12,0xf6,0xad,0x83,0xd9,0xbb,0xa6,0x4c,0x81,0x57,0x56,0x76,0xe3,0xd6,0x7d,0x0c,0x72,0x72,0x43,0x6e,0x2e 36 | ,0x05,0x3d,0x5f,0x48,0xb3,0xa6,0x86,0x48,0x4b,0x08,0x07,0x2d,0x7b,0x56,0xc2,0x8c,0x2c,0xda,0xd0,0x27,0xcf,0xf4,0x45,0x72,0xda,0x49,0x01,0xb6,0x4d,0xa1,0xde,0x18 37 | ,0x60,0xd3,0x8b,0x15,0x5e,0xb9,0x7a,0x92,0x52,0x4f,0x60,0xda,0x6c,0x3f,0x94,0x96,0x56,0x2c,0x7d,0x9b,0x8f,0x2d,0x11,0x15,0xb6,0x98,0xd9,0x86,0xcf,0x8c,0xac,0x87 38 | ,0xd9,0x39,0xe8,0x3b,0x60,0x3a,0x9e,0x16,0x16,0xf1,0x13,0x9a,0x3f,0x67,0x0c,0xdc,0x67,0x51,0x84,0x5a,0x1c,0x09,0x0c,0xde,0x85,0xb5,0xc1,0x3b,0xf9,0xc1,0x0c,0x0c 39 | ,0xf4,0x90,0xfa,0x7d,0x18,0xfe,0x61,0x6a,0xc2,0x04,0x00,0x33,0xb2,0x66,0xcd,0x5f,0x8d,0x6f,0x0f,0x1e,0xe5,0x41,0x19,0x1a,0x1a,0x20,0x33,0x65,0x33,0xe7,0x37,0x89 40 | ,0x25,0x7f,0xe6,0xe6,0xa3,0xb7,0xcd,0x14,0xe4,0xe6,0xd2,0x1b,0xdc,0x0b,0x19,0x3e,0xc4,0x06,0x41,0xab,0xdc,0x99,0x40,0x60,0x42,0x56,0xce,0xa3,0x27,0xe8,0xd6,0x67 41 | ,0x82,0xe0,0xf4,0x8b,0x0c,0xf6,0x82,0xbd,0x5d,0x6f,0x26,0x20,0x95,0x51,0x92,0x92,0x7e,0x1a,0x13,0x5d,0x96,0xf2,0x5d,0xe8,0x74,0x3c,0x95,0xbe,0x15,0xcd,0x4d,0x9a 42 | ,0x2a,0xa3,0xa6,0xc6,0xb6,0x4c,0xc8,0x3a,0xfe,0xe3,0x4f,0x18,0x35,0xd1,0x8b,0x1f,0xc0,0xe4,0xad,0xa6,0x38,0x9a,0xb8,0x01,0x8d,0x19,0xb8,0x08,0xca,0xce,0x90,0xac 43 | ,0xaa,0xcf,0x00,0x17,0x3c,0x7a,0x4c,0xf1,0xba,0x17,0xb2,0x7b,0x8b,0x1f,0xac,0x7a,0x77,0x51,0x56,0x55,0xb5,0xf6,0x4c,0xc8,0xda,0x1e,0x9d,0x80,0x45,0x4b,0x43,0x79 44 | ,0xe5,0x16,0x5d,0xda,0x21,0x3e,0x7a,0x0d,0xe8,0x57,0x15,0x5b,0xc8,0x09,0x1e,0xf6,0x85,0x07,0xce,0x9c,0xbf,0xc4,0x0f,0xbd,0x62,0xc9,0x0c,0x8c,0x1f,0xed,0xa0,0x36 45 | ,0x14,0x26,0x64,0x79,0x2d,0x0b,0xc3,0xb6,0x9d,0x07,0x79,0x30,0xd3,0x26,0x0d,0xc5,0xe2,0x85,0x53,0xd4,0x06,0xa7,0xaa,0x82,0x65,0xfe,0x9b,0x10,0xb1,0x25,0x9e,0xef 46 | ,0x3e,0x61,0x8c,0x03,0xfc,0x16,0xcf,0x50,0x55,0x1d,0xdf,0x8f,0x09,0x59,0xd3,0xe7,0xad,0xc4,0xc1,0xc4,0xe3,0xbc,0xd2,0x80,0x95,0x6e,0x18,0x39,0xcc,0x56,0x6d,0x70 47 | ,0xaa,0x2a,0xd8,0xb3,0x2f,0x19,0x5f,0x2e,0x0a,0xe2,0xbb,0x3b,0xd8,0x5b,0x61,0xc3,0xba,0x45,0xaa,0xaa,0x63,0x4b,0xd6,0x04,0x97,0xa5,0x48,0x4d,0x3f,0xcd,0x2b,0xdd 48 | ,0x1c,0xea,0x83,0x4f,0x6c,0x7a,0xaa,0x0d,0x4e,0x55,0x05,0x49,0x29,0x27,0x38,0x9f,0x4f,0x26,0xd6,0xfd,0xba,0x63,0xdb,0xc6,0x8a,0x4d,0x5f,0x55,0xbd,0x4c,0x2c,0xcb 49 | ,0x79,0x86,0x2f,0x17,0xf5,0x94,0x49,0x78,0x90,0x27,0x06,0x0d,0xa4,0xf4,0x88,0xba,0x91,0xef,0x12,0x8e,0x61,0x86,0xfb,0x2a,0x7e,0x70,0x3b,0xeb,0x9e,0x88,0x0a,0xf3 50 | ,0x51,0x1b,0x0c,0x13,0xb2,0xdc,0x17,0x06,0x22,0x26,0x3e,0x85,0x07,0xb3,0xdc,0xc7,0x15,0x13,0xc7,0x0e,0x52,0x1b,0x9c,0xaa,0x0a,0x76,0xec,0x39,0x84,0x85,0x8b,0x43 51 | ,0xf8,0xee,0x43,0x06,0xf5,0x43,0x70,0x80,0x87,0xaa,0xea,0xd8,0x2e,0x43,0xff,0x80,0xad,0x08,0x89,0x88,0xe1,0x95,0x8e,0x1d,0x69,0x0f,0xff,0x65,0xb3,0xd5,0x06,0xa7 52 | ,0xaa,0x02,0x0f,0xef,0xf5,0x88,0x8e,0x49,0xe2,0xbb,0xbb,0x4e,0x71,0x84,0x97,0x87,0xb3,0xaa,0xea,0xd8,0x92,0x15,0x1d,0x9b,0x04,0x0f,0xaf,0xf5,0xbc,0xd2,0xce,0xe6 53 | ,0x6d,0xf0,0x7d,0x4c,0x60,0x9d,0xb9,0x0e,0x9f,0x39,0xb9,0xe3,0xc2,0x2f,0xd7,0x78,0x3c,0x81,0xfe,0xee,0x70,0x1a,0x6a,0xf3,0x6a,0x90,0x55,0xd5,0x29,0x25,0x6f,0x39 54 | ,0x3d,0x71,0x23,0x1a,0x37,0xd2,0x57,0x1b,0xa0,0xb2,0x0a,0x28,0xce,0xf5,0xf1,0xc0,0xe9,0x78,0x98,0xfd,0x88,0xef,0x1a,0xb7,0x73,0x15,0x7a,0x74,0x33,0x57,0x56,0x55 55 | ,0xb5,0xf6,0x4c,0xf6,0x2c,0x7a,0xdd,0xe9,0x6a,0x35,0x8e,0x57,0x4e,0xce,0x68,0xec,0x0e,0x7f,0x58,0x5a,0x74,0x54,0x1b,0xa0,0xb2,0x0a,0x4e,0x9d,0xbd,0x08,0xa7,0x71 56 | ,0x9e,0x82,0xe8,0xc3,0xf9,0x8c,0x1d,0x4c,0x42,0x35,0x4c,0xc8,0xa2,0x09,0x4d,0x72,0x5d,0x26,0x08,0xcf,0xf4,0xef,0xdb,0x1d,0x5b,0x37,0x50,0x78,0x44,0x3c,0x2f,0xbe 57 | ,0xb4,0xb4,0x14,0xe3,0xa6,0x2e,0xc1,0xb1,0x8c,0x8a,0xab,0xb6,0x9e,0x96,0x9d,0x10,0xbb,0xdd,0x5f,0x59,0xce,0x6b,0x6c,0xcf,0x8c,0xac,0xac,0xcb,0x37,0x61,0x3f,0x64 58 | ,0xae,0xe0,0x22,0x61,0xdf,0xce,0xd5,0xb0,0xec,0x26,0x9e,0x75,0x9d,0x3a,0x9b,0x85,0x61,0xa3,0x17,0x54,0x6c,0xc8,0xcf,0xef,0x17,0xd3,0x0e,0x86,0xa1,0x8d,0xd9,0x3f 59 | ,0x5f,0x2d,0xb2,0xe8,0xca,0xdd,0xf6,0xf3,0x59,0xb8,0x79,0xab,0xe2,0xca,0x8a,0x2e,0x42,0xbf,0x89,0xf8,0x8a,0x09,0x50,0x45,0x94,0x8c,0x99,0xec,0x83,0xa3,0xc7,0xcf 60 | ,0xf1,0x4d,0xe9,0xea,0x3f,0xf9,0x40,0x08,0x77,0xb5,0xc6,0x42,0x98,0x59,0x16,0x81,0x89,0xdd,0x9f,0x02,0x37,0xcf,0x40,0x01,0x2e,0x1f,0xcf,0x29,0x70,0x71,0x1e,0xca 61 | ,0x02,0xeb,0x4b,0x75,0x6c,0x8c,0x8a,0x87,0xef,0xaa,0x4d,0x82,0x36,0x01,0x2b,0xe6,0x61,0xa4,0xa3,0x1d,0xb3,0xb1,0x99,0x92,0x45,0xa8,0x46,0x8c,0x5f,0xc4,0x5d,0x55 62 | ,0xc9,0x84,0x82,0x7f,0x07,0xf6,0x04,0x30,0x5b,0x0a,0x35,0xcd,0x9c,0xee,0x11,0x3f,0x1d,0xee,0x86,0x82,0x82,0x42,0xfe,0x31,0x25,0x92,0xec,0xfd,0x66,0x25,0x33,0xa2 63 | ,0x48,0x11,0x73,0xb2,0xce,0x5d,0xb8,0x8c,0xcf,0x47,0x7c,0x29,0x00,0xa9,0xaf,0xaf,0x8b,0xc3,0xf1,0x5f,0x73,0x19,0x31,0xac,0xe5,0xea,0xf5,0xbb,0x70,0x18,0xee,0x86 64 | ,0xa7,0x4f,0x2b,0xc2,0xd9,0x34,0xc6,0xe1,0xf8,0xf5,0xe8,0xd8,0xc1,0x8c,0xe9,0x70,0xcc,0xc9,0x22,0x74,0xd1,0x31,0x87,0xe1,0xb9,0x38,0x44,0x10,0x39,0xa5,0x5b,0xe7 65 | ,0x88,0x60,0x2f,0x74,0x62,0x38,0x81,0x73,0x17,0xae,0xc0,0x75,0xde,0x4a,0xdc,0xfb,0xff,0x6f,0x3c,0x29,0xda,0xda,0x5a,0x5c,0x38,0x66,0xec,0xa8,0x81,0x4c,0x89,0xd2 66 | ,0x88,0x65,0x91,0xd2,0x92,0xd2,0x52,0xce,0xa3,0x8f,0xdd,0x9f,0x2a,0x38,0x1d,0x4d,0x5b,0x9a,0x60,0x73,0xa8,0x37,0x3a,0x9b,0xb7,0x55,0x7b,0x22,0xbf,0x5e,0xbc,0xc1 67 | ,0xb9,0x2b,0xf7,0x1f,0xfc,0x2e,0x38,0xfd,0x86,0x0f,0xb6,0xc6,0x9a,0x15,0x73,0x55,0xba,0xed,0xae,0x0d,0x94,0x46,0x2c,0x4b,0x36,0xa8,0xcb,0x9c,0x15,0x48,0x48,0xa2 68 | ,0xec,0xe8,0x0a,0xd1,0xd7,0xd3,0xc5,0xc1,0xb8,0x40,0xfc,0xab,0x4d,0xeb,0xda,0xb0,0xc9,0x7d,0x4e,0x89,0x22,0x0e,0xc3,0xdd,0x05,0x37,0x49,0xd4,0x78,0xb0,0x43,0x5f 69 | ,0x84,0xac,0xad,0x70,0x1d,0x54,0x1e,0x40,0x4e,0x47,0x8d,0x92,0x45,0x1b,0xae,0xcf,0xf2,0x70,0xec,0x89,0x4b,0x16,0x0c,0x6f,0x64,0xd4,0x08,0x14,0xf3,0xea,0x65,0xd9 70 | ,0x49,0xe9,0xf9,0x9c,0x3a,0x93,0xc5,0x39,0x9e,0xf9,0x05,0xc2,0x3c,0x87,0x91,0x8e,0xb6,0xf0,0xf5,0x76,0x05,0x5d,0x7f,0x69,0x4a,0x34,0x4a,0x16,0x81,0xa6,0xe4,0x8d 71 | ,0xa5,0x2b,0x23,0xb1,0x77,0x5f,0x32,0xc8,0xc3,0x96,0xc9,0xfb,0x6d,0x5b,0x23,0x21,0x2e,0x08,0xba,0xba,0x8a,0xe7,0x55,0x51,0x6e,0x97,0x83,0x93,0x3b,0x2e,0x5f,0xa1 72 | ,0x4f,0x6d,0x5e,0x08,0x65,0xff,0x91,0x7b,0x40,0x61,0x21,0x65,0x74,0xa9,0x42,0xa8,0xc6,0xc9,0x22,0x50,0x94,0x48,0xe3,0xb5,0x2c,0x14,0x3b,0x76,0x27,0x0a,0x36,0x7d 73 | ,0x5f,0xef,0xe9,0x98,0x34,0xee,0x33,0x85,0x71,0xef,0x8e,0x3b,0x82,0x7f,0xff,0x67,0x5d,0x25,0xa2,0xb4,0x38,0xa2,0x56,0xfb,0xce,0x81,0x06,0x92,0x66,0xaa,0xe1,0x12 74 | ,0x85,0x2c,0x1a,0x95,0xae,0xd5,0x29,0xce,0x44,0x16,0x26,0x13,0x65,0x23,0x98,0x14,0x2a,0xa6,0x90,0xb1,0x4c,0x28,0xbd,0x68,0xcd,0xf2,0xb9,0xa0,0x13,0x50,0x0c,0x11 75 | ,0x8d,0x2c,0x9a,0x4c,0xdc,0xb7,0x69,0x98,0xb7,0xa0,0x22,0xc3,0xc6,0xe2,0x83,0xf6,0xd8,0x1f,0xbd,0x46,0xa1,0x5c,0x2a,0xca,0xf9,0xa2,0xf7,0xbe,0xd3,0xe7,0x2e,0xf2 76 | ,0xbc,0x68,0x22,0x53,0xe6,0x65,0xa4,0x8b,0x4a,0x16,0x45,0x03,0x46,0x3b,0x7b,0xf3,0x78,0x74,0x75,0x75,0xb8,0xcc,0x3f,0x63,0xe3,0xda,0x33,0x5d,0x0a,0x0b,0x8b,0x11 77 | ,0x1a,0x11,0x23,0x70,0x3e,0x77,0x45,0xf9,0xa2,0xcf,0x87,0x5d,0xc5,0x30,0x2a,0x6e,0x0c,0x51,0xc9,0xa2,0x1c,0xf7,0xae,0x56,0x63,0x51,0x5c,0x5c,0xc2,0x64,0x82,0x97 78 | ,0xce,0xee,0x85,0x81,0xbe,0xe6,0x4e,0xbf,0xaa,0x20,0x45,0x25,0x8b,0x06,0x4f,0xf9,0xdf,0x49,0x4c,0x99,0xe5,0x07,0x4a,0x77,0x54,0x55,0x1a,0x34,0xd0,0x46,0x78,0xd0 79 | ,0x42,0xd1,0x73,0x29,0x44,0x27,0x8b,0xf2,0xb8,0x76,0xee,0x4d,0x04,0xa5,0x52,0xfe,0x9e,0xf3,0x87,0xd2,0x7c,0xbd,0x65,0xdc,0x84,0x4b,0x63,0xa2,0xeb,0x78,0x91,0x3f 80 | ,0x1a,0x10,0x77,0x19,0x56,0x66,0x86,0x9c,0xca,0x94,0xb4,0x53,0xc8,0x3c,0x79,0x01,0x45,0x45,0x82,0xaf,0x6b,0x6b,0x24,0x90,0xf6,0xb7,0xee,0x16,0x1d,0x31,0xc8,0xfe 81 | ,0x23,0x8d,0xfb,0x53,0xf2,0x7e,0x41,0xd1,0x2d,0x4b,0x69,0x53,0x7a,0x85,0x3a,0xd4,0x39,0x59,0x64,0x55,0x52,0xd4,0xfe,0x45,0x8c,0x04,0x12,0x2e,0xe2,0x29,0x86,0xf3 82 | ,0xf9,0xca,0x59,0x16,0x25,0xcb,0x1e,0x78,0x7e,0xcd,0x4e,0xe9,0x95,0x8a,0x4a,0x8b,0xe6,0xc6,0x70,0x18,0xf8,0x11,0x9a,0x36,0x69,0xac,0x68,0x17,0xa6,0xed,0xea,0xcc 83 | ,0xb2,0x0e,0x27,0xff,0x88,0x5f,0xb2,0xae,0x2b,0x3d,0x19,0x0a,0xef,0xd4,0x55,0xd2,0x49,0x9d,0x91,0x45,0xdf,0xf4,0x64,0x5d,0xba,0xa9,0x34,0x59,0xe6,0x1d,0xcd,0x60 84 | ,0x6f,0x2b,0x7e,0xfa,0xa5,0xe8,0x4e,0x69,0x65,0x66,0xb2,0x7f,0x7b,0x0c,0x4a,0xc7,0x7e,0xf2,0x24,0x4f,0x61,0xc2,0x9a,0x18,0x35,0x86,0xad,0x75,0x0f,0xb4,0x7c,0xdb 85 | ,0x58,0xe1,0x3e,0x2c,0x1b,0xd6,0x99,0x65,0xb1,0x9c,0x84,0x58,0xba,0xea,0xc9,0x52,0x82,0xe9,0x3a,0x27,0x8b,0x02,0x82,0x57,0xae,0xdd,0x41,0x5e,0x9e,0x30,0xf2,0x59 86 | ,0x79,0x0e,0x14,0xfd,0xec,0xd0,0xee,0x3d,0xd1,0x3d,0xf6,0x3a,0x7f,0x37,0xac,0x0c,0x80,0xc2,0x2e,0x71,0xfb,0x53,0x71,0xfb,0xee,0xc3,0x5a,0x7f,0xdf,0x77,0x5a,0xb5 87 | ,0x80,0xe3,0x10,0x6b,0x85,0xc2,0x39,0xb5,0x2a,0x53,0xb1,0x41,0x9d,0x5a,0x56,0xc1,0xd3,0x42,0x44,0x6e,0xd9,0x2f,0xc8,0x78,0x91,0x37,0x0f,0x0a,0xf0,0x4d,0x9d,0x34 88 | ,0x44,0xd4,0x28,0x43,0x4d,0x96,0x25,0xea,0xd7,0xf7,0x95,0x01,0xd0,0xf7,0x88,0x14,0x10,0xbc,0xa3,0x80,0x65,0xd1,0xbd,0xa3,0xe3,0xe0,0xfe,0xa2,0x66,0xe5,0x54,0x21 89 | ,0x8b,0xfb,0xfa,0xbe,0x4e,0xeb,0x3a,0x10,0xa0,0x8c,0x13,0x3f,0x23,0xe7,0x91,0xfc,0x08,0x44,0x73,0x93,0x66,0x2a,0xdd,0x04,0xa9,0xb8,0xda,0xe4,0x75,0xe3,0xea,0x3a 90 | ,0xd4,0x57,0x0c,0x51,0x8c,0x55,0xae,0x62,0x48,0x7d,0x2d,0x1a,0xc5,0xc8,0xe2,0x6a,0xd1,0x50,0x6d,0xbf,0xfa,0x2a,0x47,0x2f,0x27,0xec,0x45,0x95,0x23,0x6a,0x23,0x95 91 | ,0x4a,0xeb,0xeb,0x67,0xc9,0x27,0xab,0xa2,0x7e,0x56,0x39,0x59,0x94,0x1a,0x57,0x5f,0x99,0xad,0x66,0xc2,0x84,0x95,0xd9,0xca,0x09,0xa3,0xe2,0x88,0xf5,0x35,0xff,0x84 92 | ,0x84,0x55,0xaf,0xf9,0x27,0x7b,0x5e,0x5f,0x4d,0x92,0x67,0xea,0xe5,0xd5,0x24,0x2b,0x11,0x56,0x5f,0xa7,0x54,0x91,0x3a,0xa5,0x55,0xde,0xdb,0xea,0x2b,0xe0,0x56,0xd9 93 | ,0xc3,0xfe,0x02,0xfb,0x2e,0x47,0x38,0xba,0x49,0xd1,0x47,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82}; 94 | 95 | 96 | #endif //HYDRAOS_LEDAPP_ICON_H 97 | -------------------------------------------------------------------------------- /src/apps/Calculator/icon.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 05.06.2024. 3 | // 4 | 5 | #ifndef HYDRAOS_CALC_ICON_H 6 | #define HYDRAOS_CALC_ICON_H 7 | 8 | const uint8_t calc_icon[]={ 9 | 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x08,0x06,0x00,0x00,0x00,0x38,0x4e,0x7a,0xea 10 | ,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,0x0a,0xf8,0x49,0x44,0x41,0x54,0x78,0x5e,0xed,0x9c,0x75,0x8c,0x14,0xcb,0x16,0xc6,0xcf 11 | ,0xe0,0xee,0x96,0xe0,0x1a,0x2c,0x04,0x0f,0x1e,0x34,0x40,0xb0,0x20,0x8f,0x87,0x4b,0x20,0xc1,0x09,0xee,0xee,0xee,0x7e,0x09,0x6e,0x0f,0x08,0x10,0x9c,0x40,0x90,0x8b 12 | ,0xdb,0x1f,0x40,0xe0,0x41,0xb0,0x20,0x21,0xb8,0xbb,0xcd,0xbb,0xbf,0x62,0x7b,0x5e,0xcf,0x6c,0xcf,0x74,0xf5,0xee,0xce,0x0a,0xcc,0x97,0x4c,0x66,0x77,0xba,0xbb,0xba 13 | ,0xea,0xab,0x53,0xa7,0xce,0x39,0x75,0xaa,0x5c,0xe2,0x07,0x6e,0xb7,0x3b,0x93,0x88,0x54,0x11,0x91,0xda,0x22,0x52,0x49,0x44,0x72,0x88,0x48,0x32,0x7f,0xf7,0xc7,0xe1 14 | ,0xdf,0x3f,0x8a,0xc8,0x7d,0x11,0x39,0x21,0x22,0x07,0x44,0xe4,0x6f,0x97,0xcb,0xf5,0xd4,0xaa,0x3d,0x2e,0xdf,0x1f,0xdd,0x6e,0x77,0x42,0x11,0x69,0x29,0x22,0xf3,0x45 15 | ,0x24,0x55,0x1c,0x26,0x21,0xa2,0x55,0x7f,0x2b,0x22,0xbd,0x44,0x64,0xa3,0xcb,0xe5,0xfa,0x66,0x2e,0xc4,0x8b,0x2c,0xb7,0xdb,0x9d,0x45,0x44,0xfe,0x13,0x26,0x49,0xf1 16 | ,0x22,0xfa,0xb6,0xdf,0xe0,0xb9,0x9f,0x61,0x92,0xf6,0x6f,0x97,0xcb,0xf5,0xd8,0x68,0x8f,0x87,0xac,0x30,0xa2,0xb6,0xfd,0x23,0x8a,0xe5,0x7f,0x83,0xc6,0x46,0x55,0x13 17 | ,0x4e,0x8b,0x48,0x13,0x83,0x30,0x45,0x56,0xd8,0xd0,0x3b,0x14,0xa6,0xa3,0xa2,0xea,0x45,0xbf,0x4b,0x39,0x7f,0xff,0x23,0x65,0x35,0x19,0x92,0x06,0x59,0xed,0x44,0x64 18 | ,0xa5,0x88,0xfc,0xc9,0x43,0xcf,0x5f,0xe7,0x32,0x24,0x3b,0xba,0x5c,0xae,0x35,0xae,0xb0,0x59,0xef,0xe6,0x1f,0xaa,0xcc,0x75,0xa5,0x1f,0xa5,0x9f,0x1f,0xb2,0x9a,0x89 19 | ,0xc8,0x16,0xdd,0xa7,0xfe,0xe0,0xfb,0xfe,0x05,0x59,0x7f,0x89,0x48,0xe7,0x3f,0x98,0x04,0xdd,0xa6,0x2f,0x87,0xac,0xff,0x8a,0x48,0x41,0xdd,0x27,0x9c,0xdc,0xf7,0xf4 20 | ,0xe9,0x53,0x79,0xf0,0xe0,0x81,0x3c,0x7e,0xfc,0x58,0x5e,0xbc,0x78,0x21,0x1f,0x3e,0x7c,0x90,0x8f,0x1f,0x3f,0xaa,0xcf,0xfb,0xf7,0xef,0x99,0x58,0xd4,0xdf,0xe0,0xe7 21 | ,0xcf,0x9f,0xf2,0xe9,0xd3,0xa7,0x70,0xc5,0x27,0x4d,0x9a,0x54,0xe2,0xc5,0xfb,0xa5,0x4a,0x93,0x24,0x49,0x22,0x89,0x12,0x25,0x12,0x7e,0x4b,0x96,0x2c,0x99,0xfa,0x3f 22 | ,0x7d,0xfa,0xf4,0x92,0x32,0x65,0x4a,0xc9,0x90,0x21,0x83,0xe4,0xce,0x9d,0x5b,0x32,0x65,0xc2,0x96,0x0e,0x0a,0xae,0x43,0xd6,0x87,0xa8,0xb0,0xcc,0x21,0xe3,0xc4,0x89 23 | ,0x13,0x72,0xea,0xd4,0x29,0x39,0x77,0xee,0x9c,0x5c,0xba,0x74,0x49,0x5e,0xbd,0x7a,0x15,0x94,0x5a,0x07,0x2a,0x34,0x63,0xc6,0x8c,0x52,0xaa,0x54,0x29,0x29,0x5a,0xb4 24 | ,0xa8,0x54,0xae,0x5c,0x59,0xaa,0x55,0xab,0xa6,0xc8,0x8c,0x02,0x7c,0x84,0x2c,0x77,0x64,0x0a,0x7a,0xf9,0xf2,0xa5,0x4c,0x99,0x32,0x45,0xa6,0x4f,0x9f,0x1e,0x99,0x62 25 | ,0x82,0xf6,0x2c,0x92,0xd8,0xad,0x5b,0x37,0x19,0x39,0x72,0xa4,0x92,0xc2,0xc8,0x20,0xc2,0x64,0x31,0x6c,0xa8,0xc0,0xd2,0xa5,0x4b,0xd5,0x10,0x8b,0xed,0x48,0x9b,0x36 26 | ,0xad,0xf4,0xe9,0xd3,0x47,0x46,0x8c,0x18,0xe1,0x19,0xd6,0x4e,0xeb,0x1c,0x21,0xb2,0xde,0xbe,0x7d,0x2b,0x5d,0xbb,0x76,0x95,0x4d,0x9b,0x36,0x29,0xbd,0xe3,0x0f,0x39 27 | ,0x72,0xe4,0x10,0x3e,0x54,0x34,0x75,0xea,0xd4,0x92,0x3c,0x79,0x72,0xa5,0x6b,0x12,0x27,0x4e,0xac,0x3e,0xf1,0xe3,0xc7,0x57,0xdf,0xba,0xf8,0xfc,0xf9,0xb3,0xd2,0x6d 28 | ,0x5f,0xbe,0x7c,0x11,0xfe,0xe6,0xfb,0xdd,0xbb,0x77,0x4a,0x17,0x3e,0x79,0xf2,0x44,0x7d,0x6e,0xdf,0xbe,0xed,0xb7,0x38,0x97,0xcb,0x25,0xad,0x5b,0xb7,0x96,0xf9,0xf3 29 | ,0xe7,0x4b,0x9a,0x34,0x69,0x74,0x5f,0xeb,0xb9,0xcf,0x31,0x59,0x54,0xb6,0x4d,0x9b,0x36,0xb2,0x71,0xe3,0x46,0xaf,0x97,0x51,0x11,0x14,0x6c,0xc5,0x8a,0x15,0xa5,0x65 30 | ,0xcb,0x96,0x52,0xbe,0x7c,0xf9,0x08,0x55,0xc8,0x71,0x0b,0x7c,0x1e,0x78,0xfd,0xfa,0xb5,0x1c,0x3e,0x7c,0x58,0x36,0x6c,0xd8,0x20,0x17,0x2f,0x5e,0x94,0x7b,0xf7,0xee 31 | ,0x85,0xeb,0xd0,0xb6,0x6d,0xdb,0xca,0xaa,0x55,0xab,0x1c,0x4b,0x98,0x63,0xb2,0xc6,0x8d,0x1b,0x27,0x63,0xc6,0x8c,0xf1,0xaa,0x00,0x12,0xb3,0x6c,0xd9,0x32,0x69,0xd6 32 | ,0xac,0x99,0x9a,0xad,0x62,0x03,0x90,0x78,0x24,0x8f,0x4e,0xed,0xd5,0xab,0x97,0x92,0x3e,0x03,0x74,0x2c,0x6d,0x18,0x35,0x6a,0x94,0xa3,0xaa,0x3a,0x22,0x0b,0x65,0x9e 33 | ,0x3f,0x7f,0x7e,0xe1,0xdb,0x40,0xb9,0x72,0xe5,0x64,0xf5,0xea,0xd5,0x52,0xa0,0x40,0x01,0x47,0x2f,0x8e,0xce,0x9b,0x6f,0xdc,0xb8,0x21,0x1d,0x3a,0x74,0x90,0x33,0x67 34 | ,0xce,0x78,0x5e,0x8b,0x6a,0xb8,0x79,0xf3,0xa6,0x23,0xa5,0xef,0x88,0xac,0x01,0x03,0x06,0xc8,0xcc,0x99,0x33,0x3d,0x2f,0x4c,0x95,0x2a,0x95,0x9c,0x3f,0x7f,0x3e,0x56 35 | ,0x13,0x65,0x54,0xf6,0xda,0xb5,0x6b,0x4a,0x35,0xa0,0x6f,0x0d,0x0c,0x1b,0x36,0x4c,0x26,0x4e,0x9c,0xa8,0xdd,0x6f,0xda,0x64,0xa1,0x48,0x21,0xc7,0x2c,0xca,0xeb,0xd7 36 | ,0xaf,0x57,0xfa,0x29,0xae,0x00,0x3d,0x86,0xbe,0x35,0x26,0x25,0x54,0xc6,0xf3,0xe7,0xcf,0xb5,0xed,0x30,0x6d,0xb2,0x76,0xef,0xde,0x2d,0x0d,0x1a,0x34,0xf0,0xf0,0x92 37 | ,0x2b,0x57,0x2e,0x41,0xbc,0x63,0x8b,0x8e,0xd2,0xe9,0x30,0x74,0x58,0x91,0x22,0x45,0xbc,0x66,0x4c,0xda,0x55,0xaf,0x5e,0x3d,0x9d,0xc7,0x45,0x9b,0xac,0xa1,0x43,0x87 38 | ,0x2a,0xe3,0xd3,0x00,0xca,0x7c,0xcb,0x96,0xb8,0xe5,0x7f,0x23,0x51,0x2d,0x5a,0xb4,0x90,0xcd,0x9b,0x37,0x7b,0xda,0x31,0x68,0xd0,0x20,0x99,0x3a,0x75,0x6a,0xd4,0x92 39 | ,0x55,0xa7,0x4e,0x1d,0x39,0x70,0x80,0x78,0xfe,0x2f,0xec,0xdd,0xbb,0x57,0xea,0xd6,0xad,0xab,0xf5,0x12,0x66,0xa2,0x5d,0xbb,0x76,0xc9,0xd7,0xaf,0x5f,0xd5,0x33,0xb8 40 | ,0x24,0x31,0x85,0x1d,0x3b,0x76,0x48,0xe3,0xc6,0x8d,0x3d,0xaf,0xaf,0x59,0xb3,0xa6,0x1c,0x3c,0x78,0x50,0xab,0x3a,0xda,0x92,0x85,0x83,0xfa,0xec,0xd9,0x33,0x4f,0xa1 41 | ,0x10,0x80,0x81,0x69,0x07,0x7a,0x73,0xce,0x9c,0x39,0x1e,0xc5,0x9a,0x22,0x45,0x0a,0xe9,0xd1,0xa3,0x87,0x72,0x82,0x63,0x02,0x6f,0xde,0xbc,0xf1,0xb2,0xff,0x98,0x15 42 | ,0xcd,0xb3,0x7b,0xa0,0x3a,0x69,0x91,0x85,0x65,0x9c,0x25,0x0b,0x6b,0x19,0xbf,0x80,0xbe,0xba,0x7b,0xf7,0xae,0x56,0x5b,0xd1,0x13,0xe6,0xe1,0x8b,0xc5,0xde,0xb3,0x67 43 | ,0x4f,0x81,0xb4,0x98,0x42,0xbe,0x7c,0xf9,0xbc,0xf4,0x16,0xed,0xd3,0x89,0x56,0x68,0x91,0x75,0xf6,0xec,0x59,0xc1,0x9e,0x32,0x50,0xa9,0x52,0x25,0x39,0x7e,0xfc,0xb8 44 | ,0x56,0x5b,0x71,0x4b,0xcc,0x3a,0x21,0x36,0x90,0x85,0x97,0x41,0x74,0xc4,0xc0,0x85,0x0b,0x17,0x54,0xa4,0xc2,0x0e,0x5a,0x64,0xed,0xd9,0xb3,0x47,0xea,0xd7,0xaf,0xef 45 | ,0x29,0x8b,0x59,0x71,0xe7,0xce,0x9d,0x76,0x65,0xab,0xeb,0xb1,0x91,0xac,0x26,0x4d,0x9a,0xc8,0xf6,0xed,0xdb,0x3d,0xf5,0xd7,0x9d,0x11,0xb5,0xc8,0xc2,0x3e,0xc1,0x01 46 | ,0x35,0x80,0x6f,0xb5,0x66,0xcd,0x1a,0x4b,0xb2,0x88,0x61,0xd1,0x6b,0x46,0x2c,0x0b,0x5f,0xd2,0x3c,0x64,0x09,0xe4,0x65,0xcf,0x9e,0x5d,0x12,0x24,0x48,0xa0,0x9e,0x47 47 | ,0x77,0x11,0x77,0xca,0x9c,0x39,0xb3,0x5f,0xf2,0x09,0x22,0x9e,0x3c,0x79,0xd2,0xcb,0x65,0x09,0xd4,0x53,0xd8,0x83,0x94,0x89,0x3e,0xb2,0x02,0xf5,0x5f,0xb7,0x6e,0x9d 48 | ,0xe7,0x12,0x6d,0xe1,0x37,0x3b,0x68,0x91,0xb5,0x70,0xe1,0x42,0xa5,0x67,0x0c,0x10,0x1f,0x5a,0xb4,0x68,0x91,0x65,0xd9,0x84,0x6c,0x88,0x8c,0x3a,0x01,0x91,0xcf,0xee 49 | ,0xdd,0xbb,0x5b,0xea,0x31,0x22,0xaa,0xbc,0xcb,0x2a,0x8a,0x1a,0xe8,0x1d,0xe8,0xd8,0x2e,0x5d,0xba,0x58,0xde,0xc2,0xbb,0x16,0x2f,0x5e,0xec,0xb9,0xb6,0x60,0xc1,0x02 50 | ,0x35,0xe9,0xd8,0x41,0x8b,0xac,0xc9,0x93,0x27,0x0b,0xae,0x81,0x01,0xe2,0x42,0xb3,0x67,0xcf,0x0e,0x57,0xf6,0x8f,0x1f,0x3f,0x94,0xfb,0x10,0x91,0x78,0x22,0x92,0x8b 51 | ,0xe2,0xf5,0xc5,0xad,0x5b,0xb7,0x04,0x4f,0xc1,0x29,0x70,0x96,0x87,0x0f,0x1f,0xae,0xc2,0x40,0xbe,0xe8,0xd7,0xaf,0x9f,0x57,0xfd,0x67,0xcc,0x98,0x21,0xfd,0xfb,0xf7 52 | ,0xb7,0x7d,0x85,0x16,0x59,0xe3,0xc7,0x8f,0xf7,0xf2,0xd0,0x87,0x0c,0x19,0x22,0x10,0x68,0x05,0x62,0x5c,0x58,0xf6,0x4e,0x40,0x6c,0x89,0x9e,0x35,0x86,0xa6,0xf9,0xd9 53 | ,0xef,0xdf,0xbf,0x2b,0x29,0xd0,0x9d,0xde,0x8d,0x67,0x0b,0x15,0x2a,0x24,0xcd,0x9b,0x37,0xb7,0xac,0x86,0xaf,0x81,0x4d,0x24,0x85,0x40,0xa6,0x1d,0xb4,0xc8,0x1a,0x3c 54 | ,0x78,0xb0,0x4c,0x9b,0x36,0xcd,0x53,0xd6,0xe8,0xd1,0xa3,0x55,0x88,0xc3,0x0a,0x28,0x74,0x74,0x14,0xdf,0xe0,0xdb,0xb7,0x6f,0xb2,0x6f,0xdf,0x3e,0xcf,0xad,0x10,0x52 55 | ,0xbd,0x7a,0x75,0x8f,0x9d,0x85,0xbb,0x44,0x1c,0x2c,0x90,0xcd,0xc6,0xa2,0x06,0x12,0x86,0xe4,0xea,0x80,0x19,0x37,0x6f,0xde,0xbc,0x7e,0x03,0x8b,0xd4,0x7d,0xec,0xd8 56 | ,0xb1,0x9e,0xa2,0x74,0xad,0x78,0x2d,0xb2,0x7c,0xa3,0x0d,0xbc,0x48,0x37,0x16,0x14,0x1b,0x67,0x43,0x24,0x89,0x0e,0x37,0x30,0x70,0xe0,0x40,0x2f,0x61,0xf0,0xd7,0x21 57 | ,0x5a,0x64,0xa1,0xdc,0x51,0xf2,0x06,0xb0,0x9b,0xe8,0x0d,0x1d,0xc4,0x46,0xb2,0x18,0x25,0x8c,0x16,0x03,0xa8,0x00,0x94,0xbc,0x1d,0x82,0x4e,0x96,0x95,0x05,0x4f,0xe4 58 | ,0x92,0xe8,0x6a,0x4c,0x21,0xa8,0x64,0xf9,0x4e,0xb5,0x4e,0x24,0x0b,0x42,0xd6,0xae,0x5d,0x2b,0x77,0xee,0xdc,0x51,0xdc,0x60,0x4f,0x75,0xee,0xdc,0xd9,0x52,0x99,0x47 59 | ,0x17,0x79,0xbe,0x64,0x05,0x32,0x85,0xcc,0x75,0xd2,0x92,0xac,0x8e,0x1d,0x3b,0xaa,0x00,0x7f,0x44,0x86,0x21,0xcf,0x60,0x4a,0x9c,0x3e,0x7d,0x5a,0xad,0xc4,0xd4,0xae 60 | ,0x4d,0xd6,0x65,0xcc,0xc2,0x97,0x2c,0x42,0xce,0x2b,0x57,0x92,0x44,0x14,0x18,0xd1,0x42,0x96,0x5d,0x25,0xa2,0xfb,0x7a,0x88,0x2c,0x07,0x8c,0x87,0xc8,0x0a,0x91,0xe5 61 | ,0x80,0x01,0x07,0xb7,0x06,0x55,0xb2,0x22,0x3b,0x1b,0x3a,0x68,0x47,0xb4,0xdc,0x1a,0x54,0xd3,0x21,0x22,0x46,0x29,0x3e,0x1d,0xee,0x89,0xbf,0x5c,0x06,0xe2,0xf1,0x40 62 | ,0x77,0x75,0x88,0x30,0x36,0xe1,0x1e,0x1d,0x10,0xf6,0x49,0x98,0x90,0x74,0x7e,0x6b,0xc4,0x2a,0xb2,0x88,0x73,0x13,0x56,0x81,0x90,0x5a,0xb5,0x6a,0x49,0x85,0x0a,0x15 63 | ,0xbc,0x6a,0x8d,0xcd,0x45,0x8c,0x8c,0xd8,0x56,0xa7,0x4e,0x9d,0x02,0xc6,0xb2,0x78,0xf0,0xd8,0xb1,0x63,0x72,0xf4,0xe8,0x51,0x1d,0x9e,0x3c,0xf7,0x34,0x6c,0xd8,0x50 64 | ,0x4a,0x94,0x28,0x61,0xf9,0x4c,0x50,0xc9,0xc2,0xb5,0x31,0xe7,0x5f,0xd9,0xf9,0x86,0x10,0xc1,0xd2,0x38,0x20,0x44,0xc2,0x4a,0x30,0xce,0x33,0x61,0x93,0xcb,0x97,0x2f 65 | ,0xab,0x28,0xab,0xe1,0x14,0xe3,0x58,0x53,0xbe,0x3f,0x49,0x78,0xf8,0xf0,0xa1,0xac,0x58,0xb1,0xc2,0x71,0xd8,0x87,0x18,0x19,0x3e,0xad,0x91,0x35,0x68,0x66,0xcd,0x37 66 | ,0x8a,0x42,0x78,0x86,0x30,0x8d,0x1d,0xb4,0xec,0x2c,0x27,0x51,0x07,0x5e,0x48,0xfc,0x89,0x28,0x81,0x19,0x35,0x6a,0xd4,0x50,0x2e,0x8e,0x6f,0x38,0x1a,0x32,0x29,0xdf 67 | ,0x1f,0x59,0x8f,0x1e,0x3d,0x92,0xe5,0xcb,0x97,0x3b,0x26,0x8b,0xa1,0x68,0xf6,0xff,0xcc,0x75,0x09,0x6a,0xd4,0xc1,0x49,0x3c,0x8b,0x4a,0xb1,0x24,0x4e,0x03,0xf1,0x0b 68 | ,0x03,0x01,0xa2,0x5a,0xb5,0x6a,0x25,0x79,0xf2,0xe4,0x09,0x78,0x1f,0xeb,0x95,0x57,0xae,0x5c,0xd1,0x26,0x0c,0x69,0x22,0xac,0x5c,0xb6,0x6c,0x59,0xcb,0x72,0x83,0x1a 69 | ,0xcf,0x22,0x19,0x04,0x91,0x36,0xd0,0xb7,0x6f,0x5f,0x99,0x35,0x6b,0x56,0xc0,0x06,0x22,0x11,0xf8,0x84,0x46,0x5c,0xcb,0xea,0x66,0x16,0x3b,0x8b,0x15,0x2b,0x66,0x27 70 | ,0xfd,0x8a,0x24,0x88,0xd7,0x8d,0xc0,0x42,0x16,0x13,0x07,0xc3,0xde,0x0a,0xd4,0x9f,0xb5,0x4c,0x03,0x93,0x26,0x4d,0x12,0x08,0xb4,0x83,0xd6,0x30,0x24,0x52,0x89,0xf9 71 | ,0x60,0x40,0xd7,0xf1,0x24,0x0b,0x8f,0xa5,0x72,0x63,0xe6,0x33,0x57,0x26,0x90,0x02,0xb6,0xab,0x74,0x64,0xaf,0xfb,0x9a,0x42,0x4c,0x46,0xb4,0xc9,0x0e,0x5a,0x64,0xb1 72 | ,0xfa,0xd1,0xbe,0x7d,0x7b,0x4f,0x59,0x64,0xa2,0x20,0x35,0x76,0x20,0x63,0x99,0xe5,0x72,0x2b,0xa0,0xc3,0x58,0xbf,0xf3,0xd7,0xfb,0x76,0x65,0x47,0xe6,0xba,0xef,0xea 73 | ,0x0e,0xf9,0x65,0xed,0xda,0xb1,0x23,0x27,0x30,0xb4,0xc8,0x8a,0xc8,0xba,0x21,0xf9,0x50,0x5b,0xb7,0x6e,0x0d,0x38,0x74,0x58,0xac,0x85,0xb4,0xe8,0x06,0x52,0x4d,0xee 74 | ,0x85,0x81,0x28,0x5d,0x37,0x24,0x37,0xb3,0x74,0xe9,0xd2,0x9e,0xc2,0xed,0x56,0xa4,0x19,0x7e,0x98,0x0f,0xbe,0x46,0x24,0x7a,0xc4,0x3c,0x24,0x51,0xf0,0x98,0x14,0xbe 75 | ,0x76,0x98,0x99,0x3c,0xca,0x80,0x74,0x66,0x57,0xe2,0xf9,0x3a,0xe0,0x3d,0x65,0xca,0x94,0x11,0x92,0x3e,0xac,0x80,0xf2,0x27,0x67,0xdf,0x00,0x79,0xfb,0xdc,0x6f,0x07 76 | ,0x2d,0xc9,0x62,0x91,0xd3,0xbc,0x08,0xca,0x22,0xe9,0xfd,0xfb,0xec,0x94,0xb5,0x06,0xb1,0x21,0xf3,0x75,0x86,0x5a,0xa3,0x46,0x8d,0xd4,0xba,0x20,0x0d,0xf7,0x55,0xfa 77 | ,0xac,0x16,0xf9,0xb3,0xf4,0x29,0x47,0x27,0xd6,0xe4,0x5b,0x13,0xec,0x37,0x96,0xef,0xac,0x86,0x79,0xce,0x9c,0x39,0xbd,0xea,0x47,0xc2,0x0b,0x3b,0x34,0xec,0xa0,0x45 78 | ,0x16,0x85,0x98,0xb3,0x68,0xa8,0x08,0xe6,0x01,0xe9,0xda,0x56,0x80,0x90,0xab,0x57,0xaf,0xaa,0x4b,0xcc,0x4c,0x4d,0x9b,0x36,0x95,0xc2,0x85,0x0b,0xab,0xff,0x99,0x25 79 | ,0xd1,0x81,0x86,0x59,0x81,0x7d,0x05,0x59,0x56,0xc6,0x23,0xf7,0xd3,0x51,0x2c,0xdc,0xea,0xba,0x3a,0x46,0x7d,0x58,0x95,0x66,0xd6,0xf3,0x05,0xd9,0xcc,0xe6,0x95,0xea 80 | ,0x28,0xcf,0xa2,0xe1,0x85,0xb8,0x2d,0x87,0x0e,0xb1,0x7f,0xf3,0x17,0xf6,0xef,0xdf,0xef,0x37,0xea,0xc9,0xd2,0x15,0xf9,0x5b,0xf8,0x73,0x55,0xaa,0x54,0x51,0x4b,0x5d 81 | ,0x66,0x40,0x34,0xcf,0x03,0x72,0x28,0xec,0x72,0xd2,0x59,0x87,0x24,0x87,0xca,0x6a,0x56,0xb5,0xea,0x2c,0x88,0x22,0x9f,0x2c,0x5b,0xb6,0x6c,0xe1,0x2e,0x63,0x14,0x23 82 | ,0xe5,0x06,0xaa,0x56,0xad,0x2a,0x47,0x8e,0x1c,0xb1,0x13,0x2a,0x75,0x5d,0x5b,0xb2,0x7c,0xad,0x78,0x8c,0xc9,0x88,0xac,0x14,0x6b,0xd5,0x2a,0x48,0x37,0x45,0x5b,0xe6 83 | ,0x1f,0xb3,0x07,0xb3,0x88,0x01,0xa4,0xe5,0xfa,0xf5,0xeb,0xda,0x51,0x83,0x20,0xb5,0xdf,0x51,0xb1,0x48,0x66,0xc1,0x82,0x05,0xbd,0x12,0x55,0x9c,0x64,0x30,0x6a,0x4b 84 | ,0x96,0xef,0x58,0x47,0x71,0xa2,0x9b,0x48,0xdf,0x89,0x2b,0xd8,0xb6,0x6d,0x9b,0xda,0xd8,0x60,0xf6,0x04,0xc8,0xf6,0xb1,0x53,0x03,0x46,0xfb,0xb4,0xc9,0xe2,0x01,0x12 85 | ,0x2d,0x70,0x0d,0xcc,0x4a,0x34,0xae,0xe4,0xc1,0x63,0xce,0x94,0x2c,0x59,0x32,0x7a,0xf2,0xe0,0x21,0x88,0xe4,0x0c,0x76,0x52,0x98,0x77,0x81,0x91,0x11,0xc8,0xec,0xc6 86 | ,0xce,0x8b,0xd8,0x0a,0xab,0x1d,0x16,0xe9,0xd2,0xa5,0x53,0x61,0x24,0xbe,0x75,0xe1,0x48,0xb2,0x0c,0xe9,0x22,0x83,0xc6,0x2c,0xca,0xcc,0x3e,0xf8,0x8f,0xb1,0x69,0xef 87 | ,0x0e,0x75,0x45,0x47,0x31,0x09,0x59,0xed,0xdd,0x21,0xd7,0xc1,0x9c,0xef,0xa0,0x43,0x98,0x63,0xb2,0xb0,0x77,0xf0,0x13,0xcd,0x99,0x73,0x6a,0x5a,0x75,0xb9,0x54,0x62 88 | ,0x2e,0x61,0x11,0xae,0xc7,0xd4,0xae,0x30,0xcc,0x16,0x76,0x85,0x91,0xfa,0x44,0xb6,0xa0,0xd5,0xae,0x30,0x76,0x85,0xe0,0xdb,0x5a,0xe5,0x6e,0x05,0x22,0xcd,0x31,0x59 89 | ,0x14,0xc6,0x30,0x24,0x64,0x83,0x03,0xea,0x2f,0x6c,0x82,0xe1,0x8a,0xa5,0x9f,0x35,0x6b,0x56,0xcf,0x7e,0x43,0xd2,0x8a,0x8c,0xbd,0xcd,0x58,0xec,0x18,0xa2,0x4e,0x52 90 | ,0xbc,0xcd,0xfb,0x0d,0x8d,0x3d,0x87,0xe6,0xfd,0x86,0x64,0x1c,0x1a,0x69,0x02,0x56,0x8d,0xa6,0x43,0xd9,0x34,0xb0,0x64,0xc9,0x12,0xaf,0xad,0x35,0x3a,0x52,0xe5,0xc8 91 | ,0xce,0xf2,0x2d,0x10,0x09,0x9b,0x30,0x61,0x82,0xcc,0x9b,0x37,0x2f,0x4e,0xec,0x64,0x45,0x37,0xb1,0xa1,0x94,0x74,0x23,0xa7,0x12,0x15,0xa1,0xd9,0xd0,0xaa,0x07,0x98 92 | ,0x7a,0x89,0xc9,0xcf,0x9d,0x3b,0x57,0xb7,0x83,0xa2,0xfd,0xbe,0xde,0xbd,0x7b,0xab,0x7c,0xb2,0xa8,0xd8,0x23,0x1d,0x25,0xbb,0xef,0xb1,0xc3,0xc8,0x8d,0x67,0x25,0x86 93 | ,0x45,0x09,0x7c,0x43,0xfc,0xc0,0xe8,0x86,0xb1,0xfb,0xbe,0x78,0xf1,0xe2,0x2a,0x92,0x40,0x54,0x43,0xd7,0x8e,0xb2,0xa9,0xab,0xda,0x7d,0x1f,0xd4,0x73,0x1d,0x48,0x99 94 | ,0xc4,0x17,0xf4,0x3d,0xd7,0x81,0xec,0x63,0x66,0x2b,0x23,0x02,0xa1,0x73,0xae,0x03,0xfa,0x0e,0xbd,0x43,0xf4,0xc2,0xd0,0x7d,0xc6,0xfe,0x6b,0xb2,0x93,0x89,0x26,0xe8 95 | ,0x44,0x0f,0x22,0xd8,0x81,0xea,0x5c,0x87,0xd0,0x89,0x21,0x7a,0xec,0xa9,0x13,0x43,0x42,0x67,0xd1,0xe8,0x91,0xa5,0xce,0xa2,0xe1,0x3c,0x92,0xd0,0x29,0x47,0x81,0x09 96 | ,0xfb,0x75,0xca,0x11,0xf7,0xb8,0xdd,0xee,0xd0,0xf9,0x59,0xfe,0xc9,0xfa,0xff,0xf9,0x59,0x61,0x64,0x91,0x45,0x11,0x3a,0x99,0xcd,0x9a,0x30,0xef,0x93,0xd9,0xc2,0x08 97 | ,0x63,0x43,0x61,0xe8,0xcc,0x3f,0x6f,0xc2,0xc2,0x9f,0xf9,0x67,0x5c,0x0f,0x9d,0x26,0xe9,0x61,0x2a,0xf0,0x69,0x92,0x26,0xc2,0x42,0xe7,0x94,0xea,0x9c,0x53,0x6a,0x96 98 | ,0xc0,0xd0,0x09,0xb8,0xe1,0x15,0xd8,0xff,0x00,0x27,0xf6,0x50,0x56,0x33,0x8c,0x43,0xf4,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82}; 99 | 100 | #endif //HYDRAOS_CALC_ICON_H 101 | -------------------------------------------------------------------------------- /src/apps/Settings/icon.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 05.06.2024. 3 | // 4 | 5 | #ifndef HYDRAOS_SETTINGS_ICON_H 6 | #define HYDRAOS_SETTINGS_ICON_H 7 | 8 | const uint8_t settings_icon[]={ 9 | 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x08,0x06,0x00,0x00,0x00,0x38,0x4e,0x7a,0xea 10 | ,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,0x0c,0x96,0x49,0x44,0x41,0x54,0x78,0x5e,0xed,0x5c,0x79,0x50,0x95,0xe5,0x1a,0xff,0x1d 11 | ,0xd9,0xf7,0x45,0x50,0xc1,0x05,0x37,0xbc,0xa6,0xa2,0x96,0xb8,0x2f,0xa0,0xe4,0x96,0x8a,0x82,0x92,0x52,0x2e,0x95,0x76,0xcb,0xeb,0x34,0xd3,0x4c,0xd3,0x9d,0xa6,0x7b 12 | ,0x67,0xb2,0x99,0x7b,0x9b,0xe6,0x36,0xcd,0x38,0xd3,0x98,0x95,0x5a,0xb9,0x94,0x1a,0x06,0x86,0x18,0x2e,0xa0,0x88,0x0b,0x8a,0x64,0xa6,0x82,0x96,0x1b,0x60,0xa2,0xb9 13 | ,0xb3,0xaf,0x87,0x73,0xfb,0x7d,0x70,0x3e,0xce,0x07,0xe7,0xc0,0xfb,0x7d,0x9c,0x0e,0xa2,0x3c,0x7f,0x31,0x9c,0x77,0xfd,0x7d,0xcf,0xfb,0xbc,0xbf,0xf7,0x79,0x9e,0xf7 14 | ,0xd5,0xc1,0x82,0x18,0x0c,0x86,0x2e,0x00,0x26,0x01,0x98,0x0e,0x60,0x02,0x80,0x5e,0x00,0x5c,0x2d,0x95,0x6f,0xc7,0xff,0x2f,0x03,0x90,0x0f,0xe0,0x28,0x80,0x7d,0x00 15 | ,0xd2,0x75,0x3a,0xdd,0x6d,0x73,0xf3,0xd1,0x35,0xfe,0xa7,0xc1,0x60,0x70,0x00,0x10,0x0b,0xe0,0x13,0x00,0x9e,0xed,0x18,0x04,0xad,0x43,0x2f,0x02,0xf0,0x06,0x80,0x6d 16 | ,0x3a,0x9d,0xae,0xda,0xb4,0x11,0x05,0x58,0x06,0x83,0xa1,0x1b,0x80,0x1d,0xf5,0x9a,0xd4,0x49,0x6b,0x6f,0x8f,0x41,0xbd,0xda,0x7a,0x4d,0x5b,0xa8,0xd3,0xe9,0x6e,0x19 17 | ,0xe7,0x23,0x83,0x55,0x0f,0x54,0xfc,0x9f,0xaa,0x38,0xf6,0x31,0x98,0xac,0xb5,0xa6,0x90,0x01,0x20,0xda,0x08,0x98,0x04,0x56,0xfd,0xd2,0x4b,0xa9,0xb7,0x51,0xd6,0xea 18 | ,0xe8,0x71,0x69,0x27,0xfd,0x4f,0x2d,0x7b,0x96,0x4b,0xd2,0x08,0xd6,0x52,0x00,0x5f,0x01,0x78,0x92,0x97,0x9e,0xa5,0x8f,0xcb,0x25,0xf9,0xb2,0x4e,0xa7,0xdb,0xac,0xab 19 | ,0xdf,0xf5,0x2e,0x3d,0xa1,0xc6,0x5c,0x54,0xfb,0x69,0xf4,0x83,0x09,0xd6,0x02,0x00,0x71,0xa2,0xb5,0x9e,0xe0,0x72,0x31,0x04,0x6b,0x3d,0x80,0x15,0x4f,0x30,0x08,0xa2 20 | ,0x53,0xdf,0x40,0xb0,0x2e,0x00,0x18,0x28,0x5a,0xc3,0xda,0xe5,0x4a,0x4a,0xca,0x70,0xf3,0xd6,0x3d,0x3c,0x2c,0x2c,0x46,0x45,0x65,0x15,0xaa,0xab,0xf5,0xd0,0xeb,0x6b 21 | ,0x60,0x67,0x67,0x0f,0x3b,0x3b,0x1d,0x5c,0x9c,0x9d,0xe0,0xe3,0xe3,0x89,0x9e,0x3d,0xba,0xc2,0xd9,0xc9,0xd1,0xda,0xdd,0xab,0x69,0xef,0x22,0xc1,0x2a,0x6d,0x0b,0x66 22 | ,0xfe,0xb0,0xb0,0x04,0xa7,0x4e,0xe7,0x20,0x3b,0xe7,0x2a,0x77,0x63,0xa1,0x41,0x0f,0x1a,0xd8,0x17,0xa3,0x43,0x07,0xc1,0xdb,0xdb,0x43,0xa8,0xbc,0x95,0x0b,0x95,0x11 23 | ,0x2c,0xb1,0x91,0x5a,0xb1,0xe7,0xc2,0xc2,0x12,0x7c,0x1b,0xb7,0x1f,0x15,0x15,0x95,0xaa,0x5b,0x75,0x71,0x71,0x42,0x4c,0x54,0x04,0x3a,0xfb,0x7a,0xa9,0xae,0xdb,0xda 24 | ,0x0a,0x36,0x07,0x8b,0x4b,0x6d,0xcb,0xb6,0x64,0x70,0xf9,0x69,0x15,0x77,0x77,0x57,0x2c,0x59,0x34,0x03,0xce,0xce,0x4e,0x5a,0x9b,0xd0,0x54,0xcf,0xe6,0x60,0x1d,0x3b 25 | ,0x71,0x16,0x99,0x59,0xd9,0x8a,0xc1,0x76,0x0f,0xf4,0x47,0x40,0x57,0x3f,0x38,0x39,0x39,0xa0,0x53,0xa7,0x06,0xaa,0x57,0xa3,0xd7,0xa3,0xaa,0xaa,0x06,0x37,0x6f,0xdd 26 | ,0x41,0xc1,0xcd,0xbb,0x8a,0x3a,0x23,0x47,0x0c,0xc2,0x84,0xb1,0xc3,0x34,0x4d,0x5a,0x6b,0x25,0x9b,0x82,0x55,0x55,0x5d,0x8d,0x75,0xeb,0xe3,0x51,0x5b,0x4b,0x9e,0x57 27 | ,0x27,0x21,0x83,0xfb,0x61,0xf2,0xa4,0x11,0xb0,0xb3,0xb3,0xb3,0x38,0x07,0xbd,0x5e,0x8f,0x94,0x83,0x99,0xc8,0xf9,0x35,0x57,0x2e,0x43,0x50,0x57,0xae,0x88,0x86,0xa3 28 | ,0x23,0xcf,0xfd,0xb6,0x11,0x9b,0x82,0xf5,0xc7,0xed,0xfb,0xf8,0xf6,0x3b,0x7a,0x41,0xea,0xc4,0xd3,0xd3,0x0d,0x2f,0x2d,0x9e,0x0d,0x3b,0x13,0x6d,0xb2,0x34,0x6d,0x7d 29 | ,0x6d,0x2d,0x36,0x6d,0xdd,0x83,0xc2,0xa2,0x12,0xb9,0xc8,0x0b,0xcf,0x4f,0x47,0xd7,0x2e,0xbe,0xb6,0x41,0x0a,0x80,0x4d,0xc1,0xca,0xcd,0x2b,0x40,0xc2,0xee,0xc3,0xf2 30 | ,0xe4,0xba,0x75,0xed,0x8c,0x45,0x0b,0xa6,0x42,0xa7,0x6b,0xe2,0x29,0x6a,0x02,0x00,0xf7,0xa1,0xed,0x3b,0x0f,0xe0,0xd6,0x1f,0xf7,0xe4,0xdf,0xa2,0x23,0xc3,0x11,0xd4 31 | ,0x2b,0xa0,0xfd,0x81,0x55,0x5c,0x52,0x86,0x07,0x0f,0x8b,0x51,0x59,0x59,0x25,0x69,0x8a,0xa7,0x97,0x3b,0x7c,0xbc,0x3d,0x14,0x5a,0x73,0xf6,0xfc,0x65,0xa4,0xa6,0x9d 32 | ,0x92,0x27,0xd7,0x27,0x28,0x10,0xf3,0xe6,0x84,0x09,0x4f,0x36,0x3e,0xf1,0x10,0xf2,0xf2,0x65,0x8f,0x09,0xa6,0x84,0x85,0x62,0x58,0x48,0xb0,0x5c,0x9f,0xda,0xf7,0xe0 33 | ,0x7e,0x11,0x8a,0x4a,0x4a,0xa1,0xd7,0xd7,0x4a,0xbc,0x8c,0x34,0xc3,0xc3,0xdd,0x3a,0x3e,0xcb,0x56,0x6b,0x56,0x4d,0x8d,0x1e,0x87,0xd2,0x7f,0xc2,0xf9,0x9c,0x2b,0x4d 34 | ,0x26,0xcd,0xed,0x7d,0x5a,0xc4,0x18,0x74,0xf6,0xf5,0x44,0x49,0x69,0x19,0xe2,0xe2,0x0f,0xa2,0xb4,0xac,0x5c,0x2e,0x17,0xfa,0xcc,0x53,0x98,0x38,0x6e,0xb8,0x30,0x58 35 | ,0xc7,0x4f,0x9c,0xc5,0x49,0x93,0xcd,0xc1,0xc9,0xc9,0x11,0xb1,0x31,0xd3,0xe0,0xee,0xe6,0x22,0x91,0xda,0xfd,0xa9,0x27,0x71,0xfb,0xce,0x83,0x26,0xed,0x0d,0x0d,0x09 36 | ,0x46,0xd8,0xf8,0xe1,0xb0,0xb7,0xb7,0x17,0xee,0xcb,0x5c,0xc1,0x56,0x81,0x55,0x51,0x59,0x89,0xed,0x71,0x07,0x24,0x8d,0xb2,0x24,0x5c,0x62,0xe4,0x46,0x15,0x15,0x55 37 | ,0x0a,0xc3,0x6e,0x67,0xd7,0x09,0xaf,0x2c,0x99,0x03,0xd2,0x00,0x51,0x29,0x2b,0xab,0xc0,0x86,0x4d,0x3f,0x48,0x5a,0x63,0x14,0x1a,0x7a,0xee,0xa2,0x6c,0xbf,0x39,0xca 38 | ,0xe8,0xed,0xe5,0x8e,0x85,0xf3,0xa7,0xc2,0xd5,0xd5,0x59,0xb4,0xbb,0x26,0xe5,0x34,0x83,0xc5,0xc1,0x7d,0xb3,0x63,0x2f,0x8a,0x8a,0x79,0x00,0x50,0x2f,0x63,0x47,0x87 39 | ,0x60,0xcc,0xc8,0x21,0xaa,0x2b,0x9a,0xa3,0x1e,0xa2,0x8d,0xf0,0xd8,0xb4,0x70,0xfe,0xb3,0xd2,0x11,0x4a,0x8b,0x68,0x06,0x2b,0xe3,0xe4,0x39,0x9c,0x38,0x75,0x5e,0xd1 40 | ,0x27,0x97,0x83,0xab,0xab,0x0b,0x6a,0xf4,0x35,0x28,0x2a,0x2a,0x05,0x97,0x68,0x63,0xa1,0x26,0x84,0x0c,0xee,0x8b,0xb0,0x09,0xa4,0x0b,0xea,0xdd,0x67,0xd4,0x9e,0xc3 41 | ,0x47,0x7f,0xc6,0xd9,0xf3,0x97,0x14,0x1a,0x66,0xec,0xc7,0xde,0xde,0x0e,0x3e,0xde,0x0c,0x1d,0x18,0x50,0x5e,0x5e,0x89,0x92,0xd2,0x86,0x65,0xcf,0x32,0xad,0xe1,0x67 42 | ,0x9a,0xc0,0xfa,0xbd,0xe0,0x36,0x76,0x26,0x1c,0x54,0xa8,0xfd,0xc0,0x01,0x41,0x78,0x76,0xf2,0x28,0x38,0x38,0xd8,0xa3,0xb6,0xd6,0x20,0xd9,0xa6,0xd3,0x67,0x7e,0xc5 43 | ,0xe9,0x33,0x17,0x4d,0x0c,0x7a,0x00,0x26,0x4e,0x78,0x1a,0xbe,0xde,0x9e,0x42,0x3b,0xa0,0xa5,0xaf,0x4f,0xc0,0x4a,0x4a,0xca,0x91,0x92,0x96,0x89,0xdc,0xbc,0x9b,0x52 44 | ,0xb1,0xba,0x8f,0xd0,0x0f,0x63,0x47,0x85,0xc0,0xd9,0xd9,0x51,0x6a,0xbf,0xaa,0xaa,0x1a,0xfb,0x52,0x4f,0xe2,0xf2,0x95,0xeb,0x72,0x53,0xfc,0xff,0x82,0xa8,0x29,0xe8 45 | ,0x11,0xc8,0xe0,0x95,0x3a,0xd1,0x04,0x56,0x5c,0x7c,0x2a,0x08,0x98,0x51,0xfc,0xfd,0xbc,0x11,0x1b,0x33,0xdd,0xac,0xa6,0x90,0x50,0x72,0xc9,0x92,0x3c,0x12,0x48,0x6b 46 | ,0x4b,0x75,0x75,0x8d,0xe4,0xad,0x70,0x73,0x75,0x56,0xb0,0x7f,0x63,0x3f,0x04,0x96,0xe6,0xe2,0xce,0xdd,0x87,0x72,0xd7,0xf4,0x60,0x2c,0x98,0x37,0x45,0xf5,0x50,0x54 47 | ,0x83,0xf5,0xeb,0xa5,0x7c,0xfc,0xb8,0xef,0x98,0xe2,0x4b,0x45,0x3e,0x37,0x11,0x7d,0xfb,0x74,0x57,0xdd,0xb9,0xad,0x2a,0x5c,0xbd,0x76,0x03,0x89,0x3f,0x1e,0x51,0xac 48 | ,0x84,0x99,0xd3,0xc7,0x61,0x60,0x70,0x90,0xaa,0x21,0xa8,0x02,0xab,0xba,0xa6,0x46,0x62,0xd1,0xe4,0x54,0x46,0x19,0x38,0xa0,0x37,0x66,0x4e,0x7b,0xf4,0x03,0x42,0xa4 49 | ,0x15,0xd9,0x17,0xae,0xca,0xe3,0x26,0xf7,0x5a,0xb6,0x78,0x16,0x1c,0x54,0xd0,0x09,0x55,0x60,0x5d,0xcd,0x2d,0x40,0xe2,0x9e,0x74,0xc5,0x17,0x5a,0x12,0x3b,0x13,0x7e 50 | ,0x9d,0xbd,0x55,0x7d,0xa1,0xb6,0x28,0x7c,0xef,0x7e,0x21,0x36,0x7f,0xfb,0xa3,0x62,0x45,0xcc,0x9b,0x13,0x8e,0xde,0xbd,0x18,0x2a,0x15,0x13,0x55,0x60,0x6d,0x8b,0xdb 51 | ,0xaf,0x38,0x6e,0x90,0xec,0x45,0x84,0x85,0x8a,0xf5,0xd4,0x42,0x29,0xda,0x9e,0x6b,0x79,0x05,0x28,0xb8,0x79,0x47,0xb2,0x71,0x34,0xd2,0x81,0x01,0xfe,0x20,0xcb,0xb7 52 | ,0x86,0xad,0xa3,0xed,0x4a,0x3f,0x76,0x46,0xb1,0xe1,0xf0,0x23,0xf3,0x63,0x8b,0x8a,0x30,0x58,0x65,0xe5,0x95,0xf8,0x7c,0x23,0x63,0xb0,0x75,0xc2,0x09,0xbc,0xbe,0x3c 53 | ,0x1a,0xdc,0xaa,0x5b,0x23,0xe4,0x69,0xb4,0x27,0x6b,0xd6,0x6e,0x03,0x0f,0xda,0x8d,0x85,0x07,0xe5,0x37,0x57,0xc5,0x82,0x76,0xd1,0xd3,0xc3,0xad,0x35,0x5d,0x49,0x47 54 | ,0xb1,0x0d,0x9b,0x12,0xa5,0x5d,0xd2,0x28,0x9c,0x03,0x49,0xb3,0x88,0x08,0x83,0x45,0xde,0xb4,0x71,0x73,0xa2,0xdc,0x26,0x77,0x9f,0xe5,0xcb,0x22,0x9b,0x75,0xad,0xb4 55 | ,0x34,0x00,0x72,0xb5,0x55,0x6f,0x7d,0x84,0xbb,0xf7,0x1e,0x36,0xcb,0xbe,0xb9,0xdd,0x53,0x0b,0xd6,0x7e,0xfc,0x36,0x48,0x66,0xb5,0x0a,0x77,0xe6,0x8d,0x9b,0x12,0x51 56 | ,0x5a,0x56,0x21,0x37,0xb1,0x62,0xd9,0x5c,0x78,0x78,0x88,0x9d,0x22,0x84,0xc1,0xa2,0x2f,0x6a,0xed,0xe7,0x3b,0xe5,0x4e,0xe8,0x7f,0x5a,0xbc,0x68,0x06,0x7c,0x7d,0xb4 57 | ,0xe5,0x8e,0x6c,0xff,0xfe,0x00,0xfe,0xfd,0xfe,0x3a,0x54,0x9a,0x7c,0xe5,0x96,0x40,0x70,0x72,0x74,0xc0,0x7f,0xde,0x5b,0x89,0x45,0xf3,0xa7,0xb6,0x54,0xd4,0xec,0xef 58 | ,0x3c,0x3f,0xd2,0x6e,0x99,0x1e,0x97,0x56,0xbd,0x16,0x03,0x47,0x41,0x4a,0x23,0x0c,0x16,0x7b,0xff,0x2e,0x21,0x15,0x37,0x6e,0x34,0xf0,0x2b,0xbf,0xce,0x5e,0x88,0x8a 59 | ,0x9c,0x2c,0x1d,0x64,0xd5,0x08,0x35,0x6a,0xc9,0xab,0xef,0x35,0x01,0x8a,0xc0,0x77,0x0f,0xec,0x02,0x17,0x67,0x47,0x94,0x57,0x54,0xe1,0x46,0xc1,0x6d,0xdc,0x7f,0xc0 60 | ,0xf8,0x66,0x83,0x10,0xb0,0x2d,0xeb,0xdf,0x57,0xad,0x61,0x64,0xf2,0x09,0x89,0x87,0x70,0xf7,0x5e,0xa1,0xdc,0x18,0x5d,0x44,0x3c,0x88,0x8b,0x8a,0x2a,0xb0,0xe8,0x4b 61 | ,0xa2,0x4f,0xc9,0xf4,0xc0,0xca,0x93,0xfc,0xfc,0x79,0x93,0x11,0xd8,0xcd,0x4f,0xa8,0x4f,0xda,0xa8,0xf0,0x99,0x2b,0x71,0xe7,0xae,0xd2,0x3b,0xf0,0xfa,0xf2,0x28,0xfc 62 | ,0xf3,0xcd,0xa5,0x12,0xb1,0xe5,0xb2,0x63,0x1f,0xd4,0x80,0xff,0xad,0xd9,0x8c,0xcf,0x36,0x26,0x28,0xda,0xf6,0xf7,0xf3,0x41,0x5a,0xf2,0x3a,0x61,0x1b,0xc6,0x71,0xd3 63 | ,0xbd,0x53,0x59,0xd9,0x60,0xab,0xd8,0x07,0x7d,0x69,0x04,0x4c,0x54,0x54,0x81,0x45,0x77,0xf0,0x0f,0x49,0xe9,0xc8,0xcd,0xaf,0x3b,0x62,0x18,0x85,0xec,0x7c,0x5a,0xc4 64 | ,0x68,0x04,0xf7,0xeb,0xd9,0x62,0xbf,0x5b,0x77,0xec,0xc5,0xbb,0xab,0x3f,0x55,0x00,0xbe,0x6e,0xcd,0x3b,0x98,0x3d,0x63,0xbc,0xc5,0xba,0x49,0x7b,0x8f,0x61,0xe5,0x9b 65 | ,0x1f,0xca,0xbf,0x73,0xa2,0x1f,0xac,0xfe,0x07,0x16,0x2f,0x9c,0xd1,0x62,0x7f,0x57,0xae,0xfe,0x8e,0xbd,0x29,0x27,0x14,0x46,0x9d,0x95,0x7a,0xf6,0xec,0x8a,0xe8,0x39 66 | ,0xe1,0x66,0x59,0xbf,0xa5,0x46,0x55,0x81,0xc5,0x46,0x08,0x58,0x52,0xf2,0x51,0x5c,0xb9,0x76,0xa3,0x09,0x60,0xcb,0x5e,0x9c,0xd5,0xec,0x92,0x24,0x3d,0x18,0x1b,0xb1 67 | ,0x5c,0xb1,0xeb,0x51,0xa3,0xfe,0xf5,0xf6,0x2b,0x2d,0x4e,0xfa,0xbf,0x1f,0x7d,0xa9,0xd0,0x30,0xee,0x92,0x19,0xa9,0x1b,0x9b,0xa5,0x15,0x3c,0x9f,0x7e,0xb5,0x25,0x09 68 | ,0xec,0xd7,0x54,0xfa,0x04,0x05,0x60,0xf6,0xcc,0x89,0xaa,0x77,0x72,0xd5,0x60,0x19,0x3b,0xcd,0xc8,0x3c,0x87,0x93,0xa7,0xb2,0x15,0x1a,0x12,0x11,0x3e,0x12,0x43,0x87 69 | ,0xf4,0xb7,0x38,0xf1,0xdf,0x2e,0xe7,0x23,0x62,0xf6,0x2a,0xf9,0x77,0xda,0xa8,0xac,0xf4,0x4d,0x42,0x3c,0x8a,0x13,0x0e,0x9d,0xb4,0x4c,0x61,0xc3,0x52,0x93,0xd6,0x62 70 | ,0x40,0x7f,0x66,0x6f,0x9a,0x97,0xc6,0x9e,0x59,0x6a,0x24,0x1d,0x8e,0x5a,0xa3,0x42,0x9a,0xc1,0xa2,0x4d,0xc9,0xcc,0xca,0xc1,0xf1,0x93,0x67,0xe5,0x91,0xf6,0xeb,0xd3 71 | ,0x1d,0x91,0xb3,0x98,0x86,0x6a,0x5e,0xd2,0x8e,0xfc,0x84,0x25,0xaf,0xae,0x96,0x7f,0x0c,0x19,0xdc,0x1f,0x49,0x71,0x1f,0x0b,0x2d,0x05,0x6a,0xf4,0xec,0x98,0xb7,0x70 72 | ,0x2e,0xfb,0xb2,0x5c,0x7f,0xcb,0xfa,0xd5,0x08,0x9f,0x38,0xc2,0x62,0x7f,0xbb,0x92,0x0e,0xe3,0x5a,0x6e,0x81,0xfc,0x3b,0x69,0xc7,0xe8,0xd0,0xc1,0x9a,0x3d,0x1e,0x9a 73 | ,0xc1,0xe2,0x08,0xca,0x2b,0x2a,0xf1,0xd9,0x86,0x06,0xa2,0xda,0xc5,0xdf,0x07,0x2f,0x36,0x63,0x47,0xf6,0x1e,0xc8,0xc0,0xab,0x6f,0x7c,0x20,0x0f,0x7e,0xd4,0x88,0x41 74 | ,0xd8,0xb9,0xf5,0x43,0xa1,0xc1,0xf3,0xe3,0x2c,0x58,0xfc,0x0e,0x32,0x7f,0xca,0x91,0xeb,0xaf,0xff,0xe4,0x5d,0xcc,0x98,0x6a,0xf9,0x5c,0x4a,0x6f,0x83,0xa9,0x9b,0xf9 75 | ,0xef,0xaf,0x44,0x49,0xde,0x09,0xad,0xa2,0x19,0x2c,0x0e,0x3e,0xeb,0xe7,0x0b,0x38,0x7a,0xfc,0x97,0x47,0x56,0xb3,0x78,0x8e,0x35,0xb5,0xad,0xf4,0xf7,0x8f,0x78,0x7a 76 | ,0xa0,0xd0,0xc7,0x31,0x07,0xa8,0x66,0xb0,0x4e,0x64,0x9e,0x97,0x3c,0xa5,0xa6,0x34,0x62,0xea,0x94,0x51,0x18,0x32,0xa8,0xdf,0x23,0x63,0xb3,0x72,0x2e,0x5e,0xc3,0xbe 77 | ,0x94,0x13,0xf2,0x78,0x68,0xb3,0xc6,0x8d,0x1e,0x8a,0x51,0xa1,0x83,0x34,0x29,0x97,0x6a,0xb0,0xe8,0x2a,0x4e,0xdc,0x73,0x04,0x79,0xd7,0x95,0xf4,0x81,0x67,0xc4,0x97 78 | ,0x19,0x80,0x68,0x86,0xa0,0xda,0x7c,0x37,0x2c,0xad,0xdf,0x0d,0x6b,0x94,0xbb,0x61,0xdf,0xde,0x81,0x98,0x35,0x63,0xc2,0x5f,0xbb,0x1b,0xd2,0xc8,0xc6,0xef,0x4e,0xc3 79 | ,0xf5,0xeb,0x7f,0x34,0xa1,0x0d,0xcf,0x4d,0x1b,0x87,0x3e,0xbd,0x03,0x5b,0xfc,0x62,0xb6,0xe6,0x59,0x74,0xfc,0x25,0x1f,0xc8,0x68,0xc2,0xb3,0x7a,0x07,0x05,0x60,0xee 80 | ,0xac,0x49,0x42,0x9b,0x8b,0x71,0x52,0xaa,0x34,0xcb,0x12,0x83,0x8f,0x89,0x9a,0x22,0xcc,0x84,0xdb,0x8a,0xc1,0xc7,0x25,0x1c,0x44,0x4d,0x23,0x0d,0x23,0xa9,0xf5,0xf7 81 | ,0xf7,0x69,0xf1,0x03,0x6b,0x02,0x6b,0xc7,0xf7,0x29,0x92,0xbf,0xc9,0x28,0xd2,0xd9,0x70,0x4e,0xb8,0xaa,0xd8,0x1f,0xeb,0x3e,0xf6,0x67,0x43,0xfa,0x80,0xd6,0x7e,0x61 82 | ,0xea,0x75,0xe8,0x84,0xa5,0x2f,0x3c,0x07,0x6f,0x2f,0x6d,0x59,0x78,0x6d,0xe7,0x75,0x48,0x06,0x5d,0x35,0x46,0x59,0xf5,0xda,0x02,0x38,0x3a,0x88,0x65,0xe2,0x08,0x2f 83 | ,0xc3,0xe2,0xe2,0x32,0x29,0x1a,0x6c,0x14,0x46,0x76,0x57,0xb4,0x43,0x7f,0x16,0x9d,0x7f,0x8c,0x6c,0x1b,0x65,0xf9,0xd2,0x48,0x29,0x9b,0x47,0x44,0x84,0xc1,0x62,0xc0 84 | ,0xf2,0xb3,0x76,0xee,0x29,0xe5,0x4e,0xfe,0xf9,0x97,0x09,0x0a,0x63,0xff,0xda,0xf2,0x68,0xb8,0x5a,0xdb,0x53,0x4a,0x3e,0xc5,0xdc,0x2a,0x53,0x46,0xdc,0x9e,0x7c,0xf0 85 | ,0xd4,0x9c,0x94,0x43,0x99,0x38,0x97,0xdd,0x90,0xc0,0xc2,0xc3,0x38,0xfd,0x59,0x22,0x29,0x4f,0xac,0x2f,0xac,0x59,0x2c,0x9c,0x9b,0x7f,0x0b,0xbb,0x76,0xa7,0x29,0x88 86 | ,0x28,0xed,0x56,0x5b,0x24,0xc3,0x8a,0x2c,0x1b,0xd3,0x32,0xe6,0xa2,0x3b,0xf3,0xe7,0x4e,0x41,0xcf,0x1e,0xe2,0x91,0x69,0x55,0x60,0x51,0x8d,0xbf,0xfe,0x66,0x0f,0x8a 87 | ,0x4d,0x92,0x41,0xda,0x4b,0xdc,0x30,0x79,0x7f,0x06,0x2e,0xfe,0xd6,0x90,0x66,0xe9,0xe1,0xe1,0x86,0x97,0x5e,0x9c,0xa5,0x8a,0x98,0xaa,0x02,0x8b,0x5f,0xea,0xd2,0x95 88 | ,0xeb,0x92,0x3f,0x4b,0xe6,0x1e,0x3a,0x1d,0xe6,0xce,0x9e,0x24,0x85,0xac,0x1e,0x55,0x69,0x93,0x88,0xb4,0x11,0x8c,0xb8,0x84,0x54,0xfc,0x6e,0xe2,0x8b,0x6f,0x3e,0xd7 89 | ,0xa1,0x56,0xca,0x77,0xff,0xab,0x73,0x1d,0x68,0xa4,0xcd,0x25,0xf1,0xd2,0x35,0xbd,0x2d,0x6e,0x9f,0x22,0xd7,0xa1,0x47,0x8f,0xae,0x88,0xb1,0x45,0xae,0x03,0x01,0x33 90 | ,0x97,0x45,0x13,0xdc,0xbf,0x27,0xa6,0x47,0x8c,0x91,0x1c,0x79,0xdc,0x0c,0x18,0x28,0xa5,0x83,0xf0,0x97,0x73,0xbc,0x70,0x56,0x27,0xfd,0xfa,0xf6,0xc0,0xa4,0xf1,0xc3 91 | ,0xe1,0xe5,0xe9,0x2e,0x6c,0x54,0xcd,0x69,0xab,0xa5,0x2c,0x9a,0xc1,0x4f,0xf5,0xc1,0xf8,0x31,0xc3,0xe4,0x2c,0x1a,0x9e,0x45,0x0f,0xa5,0x67,0x21,0xfb,0xc2,0x35,0xc5 92 | ,0x4a,0xb0,0x69,0x16,0x0d,0x7b,0x36,0x97,0x54,0x66,0xcc,0xcf,0x22,0xe9,0x63,0x56,0xb1,0xe5,0xfc,0xac,0xba,0x74,0x6e,0xd1,0x5d,0xc8,0x14,0x30,0x6a,0x0a,0x77,0xb5 93 | ,0x8b,0xbf,0xe5,0x29,0x32,0x09,0x8d,0x65,0x1a,0xf2,0xb3,0x80,0xf2,0xf2,0x8a,0xb6,0xcf,0xcf,0xe2,0xc0,0xa8,0x39,0x64,0xe1,0x0f,0x1a,0x85,0xaa,0x44,0xed,0x16,0xb3 94 | ,0xfe,0xb4,0x04,0x4c,0xe9,0x16,0xe2,0x71,0x49,0x8b,0x30,0x55,0x32,0xf6,0xf9,0xe9,0x9a,0x2f,0x4c,0xa9,0x36,0xf0,0xa6,0x83,0x64,0x4e,0xe9,0xb6,0xef,0xf6,0x83,0x97 95 | ,0x96,0x2c,0x49,0x73,0x39,0xa5,0x8c,0x68,0xbb,0xb9,0x8a,0xc7,0x1c,0x4b,0x4b,0xcb,0xa5,0xa8,0x78,0xe3,0x9c,0x52,0xe6,0x45,0xd0,0x2e,0x32,0x89,0xce,0x92,0xd4,0x01 96 | ,0x35,0x0d,0xce,0x4e,0x62,0xa1,0x7a,0x73,0xed,0xb4,0x0a,0x2c,0x36,0xc8,0x58,0x5c,0xfa,0xb1,0x9f,0xcd,0x66,0x2b,0xd3,0xcd,0x1c,0x36,0xe1,0x19,0x29,0xb1,0xbf,0xb0 97 | ,0xa8,0x14,0x3b,0x77,0xa5,0x4a,0xa9,0x8b,0x46,0x19,0xc9,0xe0,0x81,0x8a,0x6c,0xe5,0x23,0xc7,0xcf,0x20,0xeb,0x34,0x6f,0xfc,0xd5,0x09,0x81,0x8e,0x89,0x8e,0x68,0x31 98 | ,0x5b,0x79,0xf8,0xd0,0x01,0x52,0x90,0xa2,0xb5,0x09,0x26,0xad,0x06,0x8b,0x83,0xe6,0xbd,0x32,0xa6,0x6e,0xcb,0x79,0xf0,0x76,0x9d,0xe0,0xe9,0xee,0x06,0x5f,0x5f,0x4f 99 | ,0x85,0xbf,0x88,0xc6,0xfe,0xe0,0xe1,0x2c,0x79,0xb2,0x41,0xbd,0xba,0x21,0x3a,0x72,0xb2,0xf0,0x8a,0xda,0xb5,0xfb,0xb0,0x94,0x69,0x63,0x94,0x96,0xf2,0xe0,0x99,0xfa 100 | ,0xed,0xe5,0xe9,0x26,0x6d,0x28,0xd6,0x10,0xab,0x80,0x25,0x3a,0x90,0xbc,0xfc,0x9b,0x88,0x4f,0x4c,0x93,0x8b,0xb7,0xf6,0x86,0x45,0x54,0x24,0xf3,0xab,0xda,0xe1,0x0d 101 | ,0x0b,0x11,0xc0,0x9a,0xdc,0xdd,0x21,0x8b,0xe6,0xdd,0x1d,0x81,0xac,0x65,0xde,0x9e,0xf8,0x7a,0x6b,0x92,0x94,0x05,0x6d,0x14,0x9e,0xeb,0xd4,0x84,0xdf,0x45,0xc6,0xd8 102 | ,0x5c,0x19,0x9b,0x6a,0x16,0x79,0xcf,0xa7,0xeb,0xbf,0x57,0x6c,0xf9,0xc3,0x86,0x04,0x23,0x6c,0xe2,0xd3,0xcd,0xdf,0x0a,0xab,0xad,0xad,0xbb,0x15,0x76,0xb1,0x81,0x2f 103 | ,0x71,0x52,0x6f,0xbc,0xfe,0xbc,0xaa,0xe3,0x4a,0xbb,0x02,0x8b,0x83,0x3d,0x7a,0xfc,0x0c,0x4e,0x99,0x18,0x69,0xfe,0x8f,0x49,0x25,0x01,0x01,0xfe,0x70,0x6e,0x74,0xdf 104 | ,0x90,0x3e,0x7f,0xa6,0x24,0x15,0x14,0xdc,0x41,0xc1,0xad,0x46,0xf7,0x0d,0x55,0x6e,0x0e,0xad,0x05,0x8a,0xf5,0x6d,0xaa,0x59,0xec,0x90,0xfc,0x6c,0xeb,0xf6,0x64,0x45 105 | ,0x12,0xaf,0xda,0x89,0x48,0x37,0x59,0x63,0x67,0x6a,0xe6,0x4b,0x6a,0xfb,0x33,0x96,0xb7,0x39,0x58,0xec,0xf8,0xc1,0xc3,0x22,0x30,0x80,0x40,0xde,0xa4,0x56,0x98,0xd2 106 | ,0x48,0x5b,0x65,0xad,0x1d,0x4e,0x4d,0xff,0x04,0xab,0x4d,0x6e,0xdf,0x13,0x30,0x72,0x26,0xa6,0x5b,0x8b,0x5e,0x69,0x7f,0xea,0x6f,0xbd,0xa5,0xfb,0x3e,0x6d,0x79,0xfb 107 | ,0xbe,0x4d,0xdf,0x75,0xa0,0x3f,0x9c,0x1e,0x0c,0xa6,0x30,0x32,0x77,0x42,0xaf,0x67,0x12,0x5b,0xc3,0xbb,0x0e,0xae,0x2e,0xce,0x52,0x2a,0x66,0x40,0x80,0x1f,0xf8,0x77 108 | ,0x1b,0x8a,0xf4,0xae,0x43,0xc7,0x8b,0x21,0x62,0x5f,0x40,0x7a,0x31,0xa4,0xe3,0x2d,0x1a,0x31,0xb0,0xa4,0xb7,0x68,0xe8,0x84,0xee,0x78,0xe5,0xa8,0x79,0xc0,0xea,0x5e 109 | ,0x39,0x62,0x19,0x83,0xc1,0xd0,0xf1,0x7e,0x96,0x65,0xb0,0x1a,0xde,0xcf,0xaa,0x07,0x8b,0x21,0xd9,0x8e,0x97,0xd9,0xcc,0x03,0xa6,0x7c,0x99,0xad,0x1e,0x30,0xde,0xf8 110 | ,0xe9,0x78,0xf3,0x4f,0x09,0x58,0xd3,0x37,0xff,0x8c,0xbf,0x77,0xbc,0x26,0x29,0x23,0xd5,0xfc,0x6b,0x92,0x26,0x80,0x75,0xbc,0x53,0x2a,0xf2,0x4e,0xa9,0xa9,0x06,0x76 111 | ,0xbc,0x80,0xdb,0xd4,0x80,0xfd,0x1f,0xde,0x5f,0xb8,0x56,0x1c,0x31,0xd2,0xbe,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82}; 112 | 113 | 114 | #endif //HYDRAOS_SETTINGS_ICON_H_H 115 | -------------------------------------------------------------------------------- /src/apps/AudioRecorder/icon.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by WauHu on 08.06.2024. 3 | // 4 | 5 | #ifndef HYDRAOS_REC_ICON_H 6 | #define HYDRAOS_REC_ICON_H 7 | 8 | const uint8_t rec_icon[]={ 9 | 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x08,0x06,0x00,0x00,0x00,0x38,0x4e,0x7a,0xea 10 | ,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,0x0c,0xbe,0x49,0x44,0x41,0x54,0x78,0x5e,0xed,0x5c,0x79,0x5c,0x54,0xd5,0x17,0xff,0x0e 11 | ,0x8b,0xa2,0xc8,0xa2,0x88,0x82,0x0b,0x6e,0x99,0x29,0x2e,0x99,0x89,0xa2,0x42,0x98,0x24,0x0a,0x8a,0x8a,0x52,0x20,0xe6,0x96,0xb9,0x9b,0xa6,0xfe,0xca,0xfa,0x65,0x7d 12 | ,0x4a,0x7f,0x65,0x8b,0xa6,0x99,0xa1,0x49,0x2a,0xc4,0xa2,0xa2,0x58,0x28,0x08,0x88,0x4a,0x22,0x82,0x50,0xee,0x98,0xbb,0x62,0xae,0x20,0xb2,0xef,0xcb,0xfc,0x3a,0x0f 13 | ,0xde,0x9b,0x79,0xc0,0x1b,0x67,0xde,0xcc,0x20,0xe8,0x9c,0x7f,0xf8,0x30,0x73,0xef,0x7d,0xe7,0x7c,0xdf,0xb9,0xe7,0x9e,0x6d,0xae,0x04,0x02,0x24,0x95,0x4a,0xdb,0x00 14 | ,0x70,0x04,0xe0,0x02,0x60,0x18,0x00,0x1b,0x00,0xcd,0x85,0xc6,0x37,0xe2,0xcf,0x0b,0x01,0xdc,0x06,0x70,0x1c,0x40,0x34,0x80,0x63,0x12,0x89,0x24,0xbd,0x2e,0x79,0x24 15 | ,0x35,0x3f,0x94,0x4a,0xa5,0x86,0x00,0xbc,0x01,0x6c,0x04,0x60,0xda,0x88,0x41,0x10,0xcb,0x7a,0x2e,0x80,0x45,0x00,0x42,0x24,0x12,0x49,0x99,0xfc,0x22,0x3c,0xb0,0xa4 16 | ,0x52,0xa9,0x15,0x80,0x5d,0xd5,0x9a,0xa4,0x27,0xf6,0x69,0xcf,0xc0,0xbc,0xca,0x6a,0x4d,0x7b,0x4b,0x22,0x91,0x3c,0x60,0xe5,0xe1,0xc0,0xaa,0x06,0x2a,0xec,0x5f,0x55 17 | ,0xb4,0x7f,0x06,0x84,0xd5,0x94,0x08,0x89,0x00,0x3c,0x58,0xc0,0x18,0xb0,0xaa,0xb7,0x5e,0x6c,0xb5,0x8d,0xd2,0xd4,0x83,0x9e,0x95,0x75,0x8e,0xfd,0xab,0x65,0xce,0xb4 18 | ,0x25,0x59,0xb0,0xa6,0x02,0xd8,0x0e,0xe0,0x79,0xde,0x7a,0x42,0x2f,0x97,0xb6,0xe4,0x0c,0x89,0x44,0x12,0x20,0xa9,0x3e,0xf5,0xae,0x3e,0xa7,0xc6,0x5c,0x59,0xed,0x27 19 | ,0xa3,0xdf,0x9d,0xc0,0x9a,0x04,0x20,0x54,0xd9,0x59,0xcf,0xf1,0x38,0x4f,0x02,0x6b,0x2b,0x80,0x59,0xcf,0x31,0x08,0xca,0x8a,0xee,0x47,0x60,0xfd,0x0d,0xe0,0x25,0x65 20 | ,0x67,0x3c,0xc7,0xe3,0x2e,0x11,0x58,0x05,0xcf,0xa8,0x67,0xae,0xe9,0xf7,0x5a,0x48,0x60,0x49,0x35,0xbd,0xaa,0x98,0xf5,0x88,0x8d,0x92,0xd2,0x32,0x94,0x97,0x95,0xa3 21 | ,0xb2,0x52,0x0a,0x3d,0x3d,0x09,0x0c,0x0c,0x0d,0xd0,0xb4,0x89,0x21,0x24,0x92,0x5a,0x81,0x86,0x98,0x47,0xa8,0x3d,0xe7,0xa9,0x83,0x95,0x93,0x5b,0x80,0x80,0x90,0x08 22 | ,0x44,0x1f,0x4a,0x42,0xe6,0xe3,0x1c,0x06,0xb0,0xca,0xca,0x4a,0xe8,0xe9,0xe9,0x31,0x40,0x59,0xb4,0x32,0x83,0x8b,0xf3,0x60,0x4c,0x9d,0xec,0x06,0x33,0x53,0x63,0xb5 23 | ,0x05,0x56,0x67,0x81,0xa7,0x06,0x56,0xec,0xd1,0x64,0x04,0x84,0x44,0xe2,0x58,0xc2,0x19,0x54,0x54,0x54,0x3c,0x51,0x06,0x7d,0x7d,0x7d,0x38,0x0e,0x7d,0x19,0x53,0xbd 24 | ,0x5d,0xe1,0x3c,0xdc,0xee,0x89,0xe3,0xb5,0x31,0xa0,0xde,0xc1,0xba,0xff,0xe0,0x11,0x56,0xae,0xde,0x82,0xe8,0xd8,0x24,0xd1,0xf2,0xb8,0x8c,0x18,0x8c,0x55,0x2b,0xe7 25 | ,0xc0,0xda,0xaa,0xb5,0xe8,0x35,0xc4,0x4c,0xac,0x57,0xb0,0xce,0x9c,0xbb,0x82,0x89,0x53,0x56,0xa0,0xb4,0x94,0x17,0xcc,0x8b,0xe1,0x1b,0x4d,0x9a,0x18,0x62,0x6f,0xe0 26 | ,0x1a,0xbc,0xdc,0xf7,0x45,0x51,0xf3,0xc5,0x4c,0xaa,0x37,0xb0,0x62,0xe3,0x52,0xb0,0xec,0xa3,0xf5,0x78,0x9c,0x45,0xce,0x30,0x9f,0x6c,0x3a,0x5a,0xc1,0x63,0xac,0x13 27 | ,0xfa,0xf7,0xeb,0x81,0x56,0x2d,0x4d,0x61,0xd8,0xc4,0x10,0x65,0xa5,0x65,0xcc,0xd8,0xd3,0x67,0x2f,0x23,0x6c,0x7f,0x1c,0x6e,0xff,0xc3,0x05,0xff,0xdc,0x64,0x1a,0xbb 28 | ,0xee,0xab,0x25,0x18,0xe1,0x34,0x50,0x8c,0xec,0x2a,0xcf,0xa9,0x17,0xb0,0x6e,0xdc,0xba,0x8b,0x09,0xde,0x1f,0xd4,0x02,0xaa,0x6b,0x97,0xf6,0x58,0x38,0xdb,0x13,0xe3 29 | ,0xc7,0xbc,0x06,0x43,0x43,0x03,0x41,0xe6,0xcb,0xca,0xca,0xf1,0xdb,0x81,0x3f,0xf0,0xe3,0xcf,0xa1,0xb8,0x71,0xf3,0x2e,0x6f,0x1c,0x01,0xb6,0x2f,0xe4,0x1b,0x74,0xed 30 | ,0xdc,0x5e,0x65,0xe1,0x55,0x9d,0xa0,0x75,0xb0,0xf2,0xf2,0x0a,0x61,0x37,0x7c,0x3a,0xf2,0xf3,0x8b,0x78,0xbc,0x8d,0x7a,0xc3,0x1e,0x5b,0x37,0x7e,0xac,0x2a,0xbf,0x78 31 | ,0x77,0xd1,0x97,0x88,0x3a,0x44,0x99,0x13,0x19,0xb5,0x68,0xd1,0x0c,0xc9,0x47,0x77,0xc0,0xc4,0x44,0xbb,0x89,0x5c,0xad,0x83,0xb5,0x7e,0x53,0x08,0xd6,0x6e,0x0c,0xe6 32 | ,0x09,0x37,0xf3,0xed,0xb1,0xf8,0x68,0xd9,0x34,0x18,0x19,0x35,0x55,0x19,0xac,0xe2,0xe2,0x12,0x7c,0xb5,0xd6,0x1f,0xdb,0x7e,0xdd,0xcf,0x9b,0xbb,0x6c,0x91,0x0f,0x96 33 | ,0x2c,0xf0,0x52,0x79,0x3d,0x55,0x26,0x68,0x15,0xac,0x3b,0x77,0xd3,0xf1,0xba,0xdb,0x7c,0x14,0x15,0x97,0x70,0x3c,0xd9,0x0d,0xb0,0x45,0xd0,0x2f,0x9f,0x8b,0x02,0x8a 34 | ,0x5d,0x84,0x00,0xf3,0x79,0xe7,0x33,0x24,0xff,0x95,0xca,0xad,0xdb,0xac,0x59,0x53,0x1c,0x39,0xf0,0x13,0x3a,0xb4,0xa7,0xd2,0x81,0x76,0x48,0xab,0x60,0x91,0x06,0xfc 35 | ,0xb4,0x75,0x0f,0xc7,0x39,0x39,0x95,0xf1,0x31,0x5b,0xd1,0xd2,0xdc,0x44,0x6d,0x69,0xb2,0xb2,0xf3,0xe0,0x30,0x72,0x36,0x72,0x72,0xf3,0xb9,0xb5,0xe6,0xcf,0x9a,0x84 36 | ,0x8f,0x96,0x4f,0x53,0x7b,0x6d,0xa1,0x05,0xb4,0x0a,0xd6,0x68,0x8f,0xc5,0xb8,0x70,0xf1,0x06,0xf7,0xec,0x19,0x53,0xc6,0xe0,0x8b,0x4f,0xe6,0x68,0x4c,0x98,0x4f,0x57 37 | ,0x6f,0xc1,0xf6,0xc0,0x03,0xdc,0x7a,0xb6,0x3d,0xbb,0x22,0x6a,0xdf,0x06,0x8d,0xad,0x5f,0x73,0x21,0xad,0x81,0x55,0x50,0x50,0x84,0xbe,0xf6,0x3e,0x3c,0x9f,0x2a,0x72 38 | ,0xef,0x7a,0xf4,0xb1,0xed,0xa6,0x31,0x61,0xce,0xa7,0x5e,0x87,0xeb,0xc4,0x25,0xdc,0x7a,0xe4,0x7b,0x9d,0x4b,0x0c,0x82,0xb1,0x71,0x33,0x8d,0x3d,0x43,0x7e,0x21,0xad 39 | ,0x81,0x15,0x73,0xf8,0x24,0xde,0x59,0xb0,0x9a,0x7b,0x56,0x1b,0xcb,0x56,0x38,0x16,0xbd,0x85,0xfb,0xdf,0xa8,0x69,0x13,0xe8,0xeb,0x3f,0x39,0x8b,0x4d,0x71,0x62,0x71 40 | ,0x71,0x29,0x84,0xa2,0x7d,0x47,0x97,0x39,0x48,0xcf,0x78,0xcc,0xad,0xfb,0xcb,0xa6,0x4f,0x30,0x72,0xc4,0xa0,0xc6,0x05,0xd6,0x97,0x6b,0xfd,0xe1,0x2b,0x67,0xaf,0x7a 41 | ,0xbc,0xd8,0x09,0xae,0x23,0x87,0x70,0x42,0x98,0x9a,0x1a,0xc3,0xc7,0xd3,0x05,0xcd,0x9a,0x19,0x09,0x0a,0x46,0x99,0x88,0xc0,0x5d,0x51,0xc8,0x78,0x94,0x25,0x38,0x26 42 | ,0x32,0xe6,0x04,0x2e,0x5f,0x49,0xe3,0xbe,0x9f,0xf7,0xee,0x24,0x7c,0xbc,0x4c,0x3b,0x76,0x4b,0x6b,0x9a,0xb5,0x60,0xe9,0x37,0x08,0x8f,0x8c,0xe7,0x84,0x18,0x38,0xa0 43 | ,0x17,0x86,0xd9,0xf7,0xe3,0x09,0xdd,0xb5,0x73,0x3b,0x8c,0x1f,0xe3,0x24,0x08,0x44,0xcc,0x91,0x24,0x9e,0xcd,0xab,0x6b,0xe0,0xf1,0xc4,0xb3,0x48,0xf9,0xeb,0x22,0xf7 44 | ,0x95,0xbb,0xab,0x03,0x36,0xad,0xfb,0xa0,0x71,0x69,0xd6,0x8c,0xb9,0xab,0x10,0x1b,0x97,0xcc,0x31,0x6d,0x3f,0xa8,0x0f,0x06,0x0f,0xec,0xcd,0x13,0xc2,0xa6,0x83,0x15 45 | ,0x26,0x8d,0x7f,0x5d,0x50,0xb0,0xfd,0x51,0xf1,0xb8,0x7a,0xed,0x1f,0x85,0x82,0x27,0xa5,0x5c,0x40,0xe2,0xc9,0xf3,0xdc,0x18,0x67,0x27,0x3b,0x6c,0xdf,0xbc,0xb2,0x71 46 | ,0x81,0x35,0x77,0xf1,0x1a,0x44,0x44,0x27,0x70,0x4c,0x93,0x56,0x11,0x60,0x2c,0x19,0x1a,0x1a,0x62,0x9c,0xab,0x23,0xda,0x59,0x0b,0x67,0x0e,0x0a,0x8b,0x8a,0x11,0x1c 47 | ,0x1a,0x8d,0xc2,0xc2,0x62,0x41,0xe1,0x09,0x28,0xd2,0x2e,0x96,0xdc,0x5c,0x86,0x62,0xf3,0x86,0x15,0x8d,0x1b,0xac,0xf7,0xe6,0xbe,0x89,0xb9,0xb3,0x26,0xca,0x4e,0x2e 48 | ,0xca,0x82,0x36,0x6d,0xf2,0x44,0xa1,0x28,0x43,0x41,0x09,0x41,0x21,0xda,0xec,0xb7,0x17,0x3f,0x6c,0xde,0xdd,0xb0,0xc1,0x22,0xe3,0x7b,0xf1,0xd2,0x4d,0x5c,0xbb,0x71 49 | ,0x07,0xe6,0x66,0x26,0x70,0x18,0xd2,0x8f,0xc9,0x6e,0xb2,0x54,0x53,0xb3,0x96,0xbf,0x37,0x05,0x8b,0xe7,0xbf,0xf5,0x44,0x70,0x54,0x1d,0xb0,0xe1,0xa7,0x5d,0xf8,0xee 50 | ,0x87,0x40,0x41,0xb0,0xe8,0x34,0x4d,0x48,0x3c,0x87,0xcc,0xac,0x1c,0x74,0xef,0xd6,0x11,0xbd,0x5e,0xea,0x22,0x3a,0x4d,0x2d,0xda,0xc0,0x3f,0xca,0xcc,0x46,0xe0,0xce 51 | ,0x28,0x2a,0xfd,0x33,0x8c,0xf6,0xef,0xf7,0x22,0x9c,0x1c,0x06,0x34,0x38,0xb0,0xfe,0x38,0x7e,0x0a,0xa7,0xce,0x5c,0x66,0xf8,0xa2,0x5c,0xfe,0x14,0xaf,0x51,0x68,0x6d 52 | ,0x61,0xae,0xea,0x3b,0xa9,0x9a,0x2f,0xb6,0x60,0x71,0xf3,0xd6,0x3d,0x26,0x6d,0xc2,0x92,0x99,0x99,0x31,0x66,0xbe,0xed,0xde,0xe0,0xc0,0xda,0xf6,0x6b,0x38,0x72,0x72 53 | ,0xa8,0x80,0x55,0x45,0x94,0x0e,0xea,0xd2,0xb9,0xdd,0x53,0x06,0xcb,0xd4,0x18,0x33,0xa7,0x0a,0x83,0x35,0x64,0x70,0x5f,0xde,0x69,0x68,0xd2,0xa2,0x39,0x53,0x88,0xe8 54 | ,0xd8,0xbe,0xad,0x20,0xe3,0xb9,0x79,0x05,0x08,0x0b,0x3f,0x8a,0xec,0xec,0x3c,0x41,0xa7,0x94,0x4e,0xc3,0x13,0x49,0xe7,0x04,0xb7,0xe1,0xb6,0x80,0x70,0x50,0x51,0xa4 55 | ,0x41,0x83,0x35,0x63,0xde,0x17,0x88,0x3d,0x9a,0xc2,0x31,0x59,0x97,0xeb,0x40,0x40,0x79,0x4e,0x18,0x21,0x08,0x56,0x78,0xe4,0x31,0xc6,0x26,0x2a,0xa2,0x5a,0xae,0xc3 56 | ,0xf0,0x81,0xd8,0xee,0xfb,0x29,0x37,0xc5,0xcf,0xff,0x77,0x50,0x4e,0xed,0xe9,0x82,0x95,0x76,0x0f,0xbf,0xed,0x97,0x6d,0x43,0xca,0x4d,0xcd,0x9b,0xe5,0xc1,0x31,0xb5 57 | ,0x70,0xd9,0xb7,0xf8,0x3d,0x82,0xba,0x75,0xaa,0x68,0xe0,0x2b,0xbd,0x30,0x6c,0x08,0xdf,0x29,0xed,0xd2,0xc9,0x1a,0x13,0xc6,0x0e,0x17,0xc4,0x22,0xfa,0x70,0x12,0x52 58 | ,0xff,0x96,0x05,0xe2,0x75,0x0d,0x3c,0x7e,0xe2,0x2c,0x52,0x4e,0xc9,0x9c,0xd2,0x71,0x6e,0x8e,0xf8,0x71,0xed,0x7f,0xb8,0xa1,0xbe,0x7e,0x61,0xa0,0x94,0x0e,0x4b,0x1e 59 | ,0xe3,0x86,0xa3,0x53,0x47,0xea,0xd9,0x53,0x9d,0x44,0xdb,0xac,0x7b,0xf7,0x33,0xb0,0x6b,0x2f,0xb5,0x74,0x55,0x11,0xc5,0x7a,0x73,0xde,0x99,0xc0,0x9d,0x88,0x5f,0x7f 60 | ,0x1f,0x80,0x1f,0xb7,0xc8,0xfa,0x4d,0x7a,0x74,0xb7,0x81,0xab,0xcb,0x50,0x6e,0x3c,0x55,0x66,0xdc,0x47,0x3b,0x28,0x0c,0x7a,0x4b,0xcb,0xca,0xb0,0x3f,0x32,0x1e,0x69 61 | ,0x75,0xe4,0xdf,0xd9,0x85,0x22,0xa3,0x13,0x70,0xf9,0x2a,0xb5,0x84,0x56,0xd1,0xc2,0x39,0x9e,0xf8,0xf0,0x7d,0xea,0xa0,0x02,0x53,0x7f,0xdc,0xf2,0xcb,0x3e,0x14,0x97 62 | ,0x94,0x72,0xdf,0xbf,0x35,0xd1,0x19,0xed,0xac,0x2d,0x55,0x47,0x4a,0x1d,0x03,0xff,0x30,0xfd,0x31,0x42,0x42,0x63,0xb8,0xd3,0x90,0x22,0xfe,0x59,0xd3,0xc7,0x31,0x85 63 | ,0x51,0x22,0xaa,0x0b,0xce,0x98,0xb7,0x8a,0x07,0xce,0xf1,0x98,0x9f,0x21,0xd1,0xab,0xaa,0x2e,0x1b,0x1a,0x08,0xe7,0xdc,0x6b,0x4a,0x52,0x5e,0x5e,0x01,0x69,0x1d,0x56 64 | ,0x4b,0x5a,0x29,0xc5,0xb0,0x91,0xb3,0x41,0xe5,0x35,0x96,0xb6,0xfb,0xae,0xe4,0xea,0x8a,0x25,0x25,0xa5,0xf0,0xf3,0x0f,0xe7,0x32,0x1f,0x74,0x1a,0x7a,0x7b,0x8e,0x44 65 | ,0xdb,0x36,0xad,0xea,0x17,0xac,0xec,0x9c,0x3c,0xf8,0x07,0x45,0x32,0x6f,0x8f,0xc8,0xc0,0x40,0x1f,0xd3,0xa7,0x8c,0x01,0x19,0x6e,0x22,0xca,0x14,0xd8,0xda,0x79,0xf1 66 | ,0x52,0x34,0x11,0x7b,0xbe,0x47,0xdf,0xde,0x2f,0x88,0x62,0xb4,0xae,0x49,0xe7,0x2e,0x5c,0x83,0xdb,0xa4,0xf7,0xb9,0xaf,0xe8,0x85,0xa5,0x26,0xef,0x84,0x91,0x51,0x95 67 | ,0xb3,0x9b,0x97,0x5f,0x88,0x1d,0x81,0x07,0x40,0x60,0x13,0x91,0x1f,0x38,0x75,0xb2,0xab,0xe8,0xe4,0xa3,0xe8,0x6d,0x58,0x54,0x54,0x02,0xbf,0x1d,0xbf,0xa3,0xbc,0xba 68 | ,0x9a,0x4c,0x6f,0x6d,0xf2,0x9b,0x2e,0x68,0x63,0xd9,0x92,0x63,0x7e,0xb4,0xc7,0x12,0x5c,0xb8,0x78,0x9d,0xfb,0x7f,0x9a,0x8f,0x1b,0x56,0xaf,0x9c,0xab,0x31,0xb0,0x3e 69 | ,0x59,0xb5,0x19,0xfe,0x41,0x11,0xdc,0x7a,0xbd,0x7b,0x75,0xc3,0xc1,0xb0,0xf5,0xdc,0xff,0xe9,0x19,0x59,0x08,0xde,0x1d,0xcd,0x69,0xbf,0x81,0xbe,0x3e,0xa3,0xfd,0x94 70 | ,0x82,0x16,0x43,0xa2,0xc1,0x22,0x67,0xd4,0x3f,0x38,0x12,0x59,0x72,0x75,0x40,0xbb,0x57,0x6d,0x31,0x74,0x70,0x5f,0x8e,0x8f,0x35,0xeb,0x02,0xb0,0xe9,0x67,0x99,0xdd 71 | ,0x22,0x4f,0xff,0x50,0xf8,0x46,0x58,0xb5,0xb5,0x10,0xc3,0x2b,0x6f,0xce,0x83,0x87,0x99,0x78,0xc3,0x7d,0x21,0xb2,0x73,0x64,0x69,0xe5,0x05,0xb3,0x3d,0xb1,0x62,0x69 72 | ,0x95,0xbd,0x22,0x3a,0x99,0x92,0x8a,0x13,0x27,0x65,0x6e,0x85,0xb9,0x59,0x0b,0x46,0xfb,0xc5,0x36,0x9a,0x88,0x06,0x8b,0x98,0xa1,0x53,0x88,0x4e,0x23,0x96,0xe8,0x8d 73 | ,0xcd,0x9a,0x36,0x8e,0xd9,0x92,0x44,0xf7,0x1e,0x3c,0xc2,0xeb,0xae,0xf3,0x51,0x50,0x28,0x2b,0x83,0xf5,0xb1,0x7d,0x01,0x61,0x41,0x5f,0x73,0x5b,0x45,0x0c,0x6a,0xb4 74 | ,0xc5,0x3d,0x7c,0x3e,0xc4,0xf9,0xd4,0x6b,0xdc,0x74,0xe3,0xe6,0x46,0x38,0x12,0xe9,0x8b,0x76,0xd5,0x25,0x7d,0xda,0x7a,0xe4,0x63,0x15,0xc8,0x05,0xe1,0xf4,0x22,0xe9 75 | ,0x85,0x8a,0x25,0xb5,0xc0,0x22,0x86,0xa8,0x20,0x51,0x51,0x51,0x65,0xb7,0x88,0x28,0x9f,0xd4,0xad,0x6b,0x07,0xee,0x7f,0x5f,0xbf,0xbd,0xf8,0xf2,0xbb,0x1d,0x3c,0xfe 76 | ,0xc8,0xc8,0xae,0xf9,0x7c,0x01,0x2f,0x96,0x54,0x56,0x00,0xb2,0x91,0x2b,0x3e,0xdb,0xc4,0x1c,0x2e,0xf2,0xf4,0xf1,0xf2,0xe9,0x98,0x27,0x17,0xa8,0x5f,0xbd,0xfe,0x0f 77 | ,0x0e,0x1c,0xa4,0x1f,0x4d,0x54,0x11,0xbd,0x40,0xfa,0x9e,0x7d,0x91,0xca,0x3e,0x4f,0x7e,0x9c,0x5a,0x60,0xd1,0x42,0x3b,0xf7,0x1c,0xe2,0x9d,0x46,0x9d,0x6c,0xac,0xe1 78 | ,0xe1,0x2e,0x4b,0xe8,0xe5,0xe4,0xe4,0xc3,0xc9,0x75,0x1e,0x28,0x96,0x94,0x27,0xf2,0xde,0x37,0x7c,0xb3,0x14,0xc6,0xcd,0x95,0xcf,0x97,0x93,0x86,0x2e,0xfe,0x60,0x5d 79 | ,0xad,0xa6,0x12,0x8a,0xf5,0xe2,0x22,0x7d,0x61,0x66,0xd6,0x82,0x7b,0x44,0x58,0x78,0x1c,0xd2,0x6e,0xdf,0xe7,0xfe,0x27,0x77,0x81,0xdc,0x06,0x75,0x48,0x6d,0xb0,0x2e 80 | ,0x5d,0x49,0xc3,0xc1,0x98,0x13,0x1c,0x0f,0x64,0x0f,0x5c,0x9c,0x07,0xa1,0x67,0x8f,0x2e,0xdc,0x67,0x54,0x3f,0xa4,0x53,0xab,0x66,0x9f,0x83,0x4d,0x87,0xb6,0x58,0xba 81 | ,0x68,0x32,0x5c,0x9c,0xed,0xd1,0x42,0x41,0x91,0x21,0xbf,0xa0,0x08,0xd1,0xb1,0x89,0x58,0xb7,0x31,0x18,0xb7,0xef,0x3c,0xe4,0xc9,0x4b,0xe5,0x7b,0x3a,0x65,0xe5,0xeb 82 | ,0x85,0x97,0xae,0xdc,0xc2,0xc1,0x18,0x7e,0xd5,0x9a,0x2a,0xe0,0x3d,0x7b,0x74,0x56,0x07,0x2b,0xf1,0x81,0x34,0xfb,0x54,0xda,0x16,0xc1,0xa1,0x31,0xc8,0xc8,0x90,0xe5 83 | ,0xc9,0xa9,0xba,0xf2,0xb6,0xd7,0x68,0xde,0xa9,0x13,0x17,0x7f,0x0a,0x73,0x97,0xac,0x01,0x55,0x7d,0x6a,0x12,0x69,0x97,0xd7,0xa4,0x37,0xe0,0xee,0xe6,0x00,0x4b,0x8b 84 | ,0x96,0xd0,0xd3,0xd7,0x43,0x65,0x45,0x25,0x32,0x32,0xb3,0x10,0x1e,0x11,0xcf,0x68,0xaf,0xbc,0xdd,0x63,0xe7,0xd3,0x73,0x36,0xaf,0x5f,0x01,0x27,0x87,0x57,0xb8,0x25 85 | ,0xa9,0xa0,0x1b,0x10,0x1c,0xc9,0x4b,0x18,0x5a,0x58,0x98,0x31,0x7d,0x5d,0xea,0x92,0xda,0x9a,0x45,0x0c,0xdc,0xac,0x11,0xfa,0xd0,0x67,0xd6,0x56,0x16,0x78,0xd3,0xc3 86 | ,0x99,0x67,0x97,0xa8,0x23,0xc6,0x7b,0xe6,0xca,0x3a,0x01,0x63,0x05,0xa1,0x06,0x11,0xf2,0x87,0xe8,0x25,0x50,0x43,0x88,0x10,0x11,0x50,0x21,0xdb,0x56,0x31,0x9d,0x37 87 | ,0xf2,0x2f,0x2e,0x64,0xcf,0x21,0xa4,0xa7,0xcb,0xaa,0x3d,0xf4,0xdd,0x04,0x77,0x27,0x74,0xb6,0xb1,0x56,0x17,0x2b,0xf5,0x35,0x8b,0x38,0xa0,0x1e,0xd0,0xa8,0xd8,0x44 88 | ,0x5e,0x95,0x85,0x3e,0xa7,0x1a,0x61,0xcd,0x2e,0x3d,0xf2,0xfc,0xff,0xf7,0xed,0x76,0xa6,0x98,0xa1,0x4c,0xc7,0x5f,0x4d,0x09,0xa9,0x03,0x90,0x34,0xf0,0xbf,0xcb,0x67 89 | ,0xd4,0xf2,0xc4,0x0f,0xc7,0xa5,0x80,0x1c,0x55,0x79,0xa2,0xaa,0xd2,0x28,0x67,0x7b,0xa6,0x47,0x55,0x5d,0xd2,0x88,0x66,0x11,0x13,0x74,0x32,0x06,0xee,0x3c,0x08,0x2a 90 | ,0xab,0xcb,0x13,0xb9,0x0a,0x23,0x9c,0x5e,0xad,0xe5,0xdb,0x24,0x24,0x9d,0x03,0x35,0x8d,0x9c,0xbf,0x78,0x5d,0xa1,0xa6,0xc9,0x6f,0xb9,0x3e,0xbd,0xba,0x61,0xc9,0x02 91 | ,0x6f,0x9e,0x2f,0x47,0xdf,0x93,0xcf,0x17,0x77,0xfc,0x14,0xce,0x9c,0xbd,0xc2,0x7b,0x36,0xb5,0x09,0x4c,0xf1,0x1a,0xad,0xd6,0x09,0x28,0xbf,0xa0,0xc6,0xc0,0xa2,0x45 92 | ,0xe9,0xe4,0x0b,0xda,0x1d,0x85,0x92,0x12,0x7e,0xce,0xbc,0x93,0x8d,0x15,0xdc,0x5d,0x1d,0x6b,0x31,0x4d,0x42,0x92,0xdb,0xf1,0x5b,0xc4,0x1f,0x08,0xda,0x19,0x85,0x3f 93 | ,0x4f,0x53,0x4b,0x3e,0x9f,0x5e,0xed,0xdf,0x13,0x3e,0x5e,0xa3,0x30,0xde,0xed,0x35,0xa6,0x28,0x5b,0xd3,0xa1,0xa4,0x97,0x14,0xba,0xef,0x08,0x1e,0x3c,0x94,0xc5,0x87 94 | ,0xb4,0x02,0x8d,0x25,0xa0,0xe8,0x00,0xd0,0x14,0x69,0x14,0x2c,0x62,0xea,0x56,0xda,0x7d,0x26,0x35,0xc3,0xc6,0x8c,0x2c,0xa3,0x96,0xad,0x5b,0xc2,0xc9,0xa1,0x3f,0x3a 95 | ,0x28,0x48,0xf6,0x51,0xe8,0x54,0x90,0x5f,0x84,0xb2,0xf2,0x72,0x26,0xd0,0x26,0xbb,0xa4,0xc8,0x2f,0xba,0x77,0xff,0x11,0x13,0xb0,0x53,0x97,0xb3,0x3c,0x91,0xcd,0x1b 96 | ,0x3f,0xf6,0x35,0xd1,0xa9,0x18,0x21,0x70,0x35,0x0e,0x16,0x3d,0x28,0xed,0xf6,0x03,0x1c,0x88,0x8a,0x47,0x69,0x29,0xdf,0x40,0x13,0x00,0xbd,0x6d,0xbb,0x31,0xb6,0x8c 97 | ,0x5a,0xb6,0xc5,0x12,0x81,0x73,0xf6,0xfc,0x55,0x26,0xd7,0xc5,0x06,0xc9,0xec,0x5a,0x14,0x4c,0x8f,0x1e,0x69,0xaf,0x95,0x4e,0x40,0xad,0x80,0x45,0x8c,0x67,0x65,0xe7 98 | ,0x22,0x34,0xec,0x30,0x2f,0xdc,0x90,0x07,0x87,0xbc,0xfc,0x21,0x83,0xfa,0xc0,0xd4,0xc4,0x98,0x69,0x91,0x54,0x14,0xaf,0xd1,0x76,0xa5,0x93,0x91,0xec,0x61,0xf2,0x9f 99 | ,0xa9,0x82,0xd9,0x53,0xca,0x36,0x90,0x0b,0xd2,0xd2,0x5c,0x73,0x5b,0x4f,0x6b,0x36,0xab,0xa6,0xa6,0x50,0x8a,0x24,0xf6,0x48,0x32,0x6e,0xc9,0x79,0xd2,0x35,0xb7,0x0b 100 | ,0x09,0x48,0x71,0x9d,0xb9,0xb9,0x09,0xda,0x5a,0xb6,0x62,0x7a,0x1f,0x0c,0x0c,0xf4,0x98,0x5a,0x21,0xd9,0xbe,0xcc,0xcc,0x1c,0xa6,0xd7,0x81,0xb2,0x1c,0xe4,0x43,0x09 101 | ,0xfd,0x20,0xa4,0x7d,0xfb,0x36,0x4c,0x2f,0x85,0x22,0xe7,0x56,0xac,0x26,0xb3,0xf3,0xb4,0xa6,0x59,0xec,0x03,0x48,0x23,0xe8,0x38,0xff,0xeb,0xf4,0xa5,0x3a,0x1d,0x4b 102 | ,0x75,0x05,0xa0,0xe0,0xdd,0xde,0xae,0x0f,0x53,0x0f,0x54,0xd4,0xc4,0xab,0xee,0x73,0x68,0xbe,0xd6,0xc1,0x62,0x99,0xa4,0x12,0x3c,0xa5,0x4b,0xae,0xdf,0xbc,0xab,0xb0 103 | ,0x1c,0xaf,0xac,0x50,0x04,0xd2,0x0b,0x5d,0x3b,0x60,0xd8,0x90,0x97,0x99,0x94,0x76,0x7d,0x50,0xbd,0x81,0xc5,0x0a,0x53,0x5a,0x56,0x8e,0x3b,0x77,0x1f,0x22,0x21,0xf1 104 | ,0x2c,0x1e,0x65,0xf2,0x4f,0x31,0x65,0x04,0x26,0x57,0x60,0xb0,0x5d,0x6f,0xc6,0x80,0x6b,0x5b,0x93,0x6a,0xf2,0x53,0xef,0x60,0xb1,0x0c,0x90,0xed,0xa1,0x00,0x99,0x82 105 | ,0xeb,0xdc,0xdc,0x02,0xe6,0x40,0xa0,0xc2,0xad,0x7c,0xb0,0x4d,0xc0,0x50,0x16,0x83,0xfe,0x52,0x46,0x81,0xfe,0x92,0x4d,0x12,0x9b,0xbc,0x53,0xe6,0x65,0x28,0x1a,0xf3 106 | ,0xd4,0xc0,0xaa,0x8b,0xa9,0x63,0x09,0xa7,0x19,0xdb,0xc6,0xd2,0x80,0xfe,0x2f,0xc1,0x71,0x68,0x7f,0x75,0x65,0xd4,0xd8,0x7c,0x1d,0x58,0x2a,0x40,0xa9,0x03,0x4b,0x07 107 | ,0x96,0x0a,0x08,0xa8,0x30,0x54,0xa7,0x59,0x8d,0x15,0x2c,0x4a,0xdb,0x50,0x38,0xd3,0x90,0x0d,0x7c,0x83,0xf9,0xf5,0xfd,0xc3,0x8c,0xc7,0xd8,0xbd,0x37,0x96,0x09,0x8e 108 | ,0x29,0xc5,0xe2,0xed,0xe9,0x02,0xcb,0xd6,0xe2,0x1a,0xcf,0x54,0x50,0x18,0x65,0x87,0x32,0xbf,0xbe,0x6f,0x50,0xf7,0x3a,0x5c,0xbe,0x9a,0xc6,0xfc,0x10,0x93,0x7e,0xb0 109 | ,0xd9,0xa3,0x7b,0x27,0x65,0x05,0xa9,0x8f,0x71,0xcc,0xbd,0x0e,0xba,0x1b,0x43,0x94,0x83,0x9a,0xb9,0x31,0x44,0x77,0x17,0x8d,0x72,0x60,0x31,0x77,0xd1,0xd0,0x0f,0xf4 110 | ,0x74,0xb7,0x1c,0x29,0x06,0xac,0xea,0x96,0x23,0x1a,0x23,0x95,0x4a,0x75,0xf7,0x67,0x09,0x83,0x25,0xbb,0x3f,0xab,0x1a,0x2c,0xea,0x40,0xd3,0xdd,0xcc,0x56,0x37,0x60 111 | ,0xfc,0x9b,0xd9,0xaa,0x01,0xa3,0x46,0x4b,0xdd,0x9d,0x7f,0x7c,0xc0,0x6a,0xdf,0xf9,0x27,0x97,0x36,0xd1,0xdd,0x26,0x59,0x05,0x86,0xe2,0xdb,0x24,0xe5,0x00,0xd3,0xdd 112 | ,0x53,0xaa,0xcc,0x3d,0xa5,0xf2,0x1a,0xa8,0xbb,0x01,0xb7,0xb6,0x01,0xfb,0x3f,0x25,0x81,0xd3,0x47,0x50,0x35,0x6d,0xc8,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae 113 | ,0x42,0x60,0x82}; 114 | 115 | 116 | #endif //HYDRAOS_REC_ICON_H 117 | --------------------------------------------------------------------------------