From 9f9b5c2cf447f1c484e3791654b4ebefde1bde98 Mon Sep 17 00:00:00 2001 From: Matthew Colvin Date: Tue, 1 Aug 2023 15:14:05 -0500 Subject: [PATCH 1/8] Implement MQTT publish in HardwareRevX Change-Id: I7b6955a662716f83dd8daf34128a353efa26bf80 --- Platformio/src/HardwareRevX.cpp | 78 ++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/Platformio/src/HardwareRevX.cpp b/Platformio/src/HardwareRevX.cpp index fc6538c..5aef561 100644 --- a/Platformio/src/HardwareRevX.cpp +++ b/Platformio/src/HardwareRevX.cpp @@ -78,19 +78,25 @@ void HardwareRevX::init() { setupIMU(); setupIR(); - debugPrint(std::string("Finished Hardware Setup in %d",millis())); + debugPrint(std::string("Finished Hardware Setup in %d", millis())); } -void HardwareRevX::debugPrint(std::string aDebugMessage){ +void HardwareRevX::debugPrint(std::string aDebugMessage) { Serial.print(aDebugMessage.c_str()); } -void HardwareRevX::sendIR(){ - -} - -void HardwareRevX::MQTTPublish(const char *topic, const char *payload){ +void HardwareRevX::sendIR() {} +void HardwareRevX::MQTTPublish(const char *topic, const char *payload) { +#ifdef ENABLE_WIFI + if (client.connected()) { + client.publish(topic, payload); + } else { + debugPrint("MQTT Client Not Connected When Attempting Publish."); + } +#else + debugPrint("Attempting To Publish MQTT with wifi Disabled!"); +#endif } void HardwareRevX::initLVGL() { @@ -116,8 +122,9 @@ void HardwareRevX::initLVGL() { lv_indev_drv_register(&indev_drv); } -void HardwareRevX::handleDisplayFlush(lv_disp_drv_t *disp, const lv_area_t *area, - lv_color_t *color_p) { +void HardwareRevX::handleDisplayFlush(lv_disp_drv_t *disp, + const lv_area_t *area, + lv_color_t *color_p) { uint32_t w = (area->x2 - area->x1 + 1); uint32_t h = (area->y2 - area->y1 + 1); @@ -130,7 +137,7 @@ void HardwareRevX::handleDisplayFlush(lv_disp_drv_t *disp, const lv_area_t *area } void HardwareRevX::handleTouchPadRead(lv_indev_drv_t *indev_driver, - lv_indev_data_t *data) { + lv_indev_data_t *data) { // int16_t touchX, touchY; touchPoint = touch.getPoint(); int16_t touchX = touchPoint.x; @@ -372,7 +379,7 @@ void HardwareRevX::slowDisplayWakeup() { delay(100); // Wait for the LCD driver to power on } -void HardwareRevX::handleWifiEvent(WiFiEvent_t event){ +void HardwareRevX::handleWifiEvent(WiFiEvent_t event) { #ifdef ENABLE_WIFI // Serial.printf("[WiFi-event] event: %d\n", event); if (event == ARDUINO_EVENT_WIFI_STA_GOT_IP) { @@ -390,15 +397,15 @@ void HardwareRevX::handleWifiEvent(WiFiEvent_t event){ // } #endif } - -void HardwareRevX::setupIR(){ - // Setup IR + +void HardwareRevX::setupIR() { + // Setup IR IrSender.begin(); digitalWrite(IR_VCC, HIGH); // Turn on IR receiver IrReceiver.enableIRIn(); // Start the receiver } -void HardwareRevX::setupWifi(){ +void HardwareRevX::setupWifi() { #ifdef ENABLE_WIFI // Setup WiFi WiFi.setHostname("OMOTE"); // define hostname @@ -408,32 +415,31 @@ void HardwareRevX::setupWifi(){ #endif } -void HardwareRevX::startTasks(){ - if(xTaskCreate(&HardwareRevX::updateBatteryTask, - "Battery Percent Update",1024,nullptr,5,&batteryUpdateTskHndl) != pdPASS){ +void HardwareRevX::startTasks() { + if (xTaskCreate(&HardwareRevX::updateBatteryTask, "Battery Percent Update", + 1024, nullptr, 5, &batteryUpdateTskHndl) != pdPASS) { debugPrint("ERROR Could not Create Battery Update Task!"); } } -void HardwareRevX::updateBatteryTask([[maybe_unused]] void* aData){ - while(true){ +void HardwareRevX::updateBatteryTask([[maybe_unused]] void *aData) { + while (true) { mInstance->battery_voltage = analogRead(ADC_BAT) * 2 * 3300 / 4095 + 350; // 350mV ADC offset mInstance->battery_percentage = constrain(map(mInstance->battery_voltage, 3700, 4200, 0, 100), 0, 100); mInstance->battery_ischarging = !digitalRead(CRG_STAT); // Check if battery is charging, fully charged or disconnected - vTaskDelay(1000/ portTICK_PERIOD_MS); + vTaskDelay(1000 / portTICK_PERIOD_MS); // Update battery at 1Hz } } -void HardwareRevX::loopHandler(){ - // Update Backlight brightness +void HardwareRevX::loopHandler() { + // Update Backlight brightness static int fadeInTimer = millis(); // fadeInTimer = time after setup if (millis() < - fadeInTimer + - backlight_brightness) { // Fade in the backlight brightness + fadeInTimer + backlight_brightness) { // Fade in the backlight brightness ledcWrite(5, millis() - fadeInTimer); } else { // Dim Backlight before entering standby if (standbyTimer < 2000) @@ -459,14 +465,15 @@ void HardwareRevX::loopHandler(){ // TODO Convert to free RTOS task // TODO Create batter change notification for UI - - // if (battery_ischarging || (!battery_ischarging && battery_voltage > 4350)) { + + // if (battery_ischarging || (!battery_ischarging && battery_voltage > + // 4350)) { // lv_label_set_text(objBattPercentage, ""); // lv_label_set_text(objBattIcon, LV_SYMBOL_USB); // } else { // // Update status bar battery indicator - // // lv_label_set_text_fmt(objBattPercentage, "%d%%", battery_percentage); - // if (battery_percentage > 95) + // // lv_label_set_text_fmt(objBattPercentage, "%d%%", + // battery_percentage); if (battery_percentage > 95) // lv_label_set_text(objBattIcon, LV_SYMBOL_BATTERY_FULL); // else if (battery_percentage > 75) // lv_label_set_text(objBattIcon, LV_SYMBOL_BATTERY_3); @@ -481,7 +488,8 @@ void HardwareRevX::loopHandler(){ // Keypad Handling customKeypad.getKey(); // Populate key list - for (int i = 0; i < LIST_MAX; i++) { // Handle multiple keys (Not really necessary in this case) + for (int i = 0; i < LIST_MAX; + i++) { // Handle multiple keys (Not really necessary in this case) if (customKeypad.key[i].kstate == PRESSED || customKeypad.key[i].kstate == HOLD) { standbyTimer = @@ -489,10 +497,10 @@ void HardwareRevX::loopHandler(){ int keyCode = customKeypad.key[i].kcode; Serial.println(customKeypad.key[i].kchar); // Send IR codes depending on the current device (tabview page) - if (currentDevice == 1){ - IrSender.sendRC5(IrSender.encodeRC5X(0x00, keyMapTechnisat[keyCode / ROWS][keyCode % ROWS])); - } - else if (currentDevice == 2){ + if (currentDevice == 1) { + IrSender.sendRC5(IrSender.encodeRC5X( + 0x00, keyMapTechnisat[keyCode / ROWS][keyCode % ROWS])); + } else if (currentDevice == 2) { IrSender.sendSony((keyCode / ROWS) * (keyCode % ROWS), 15); } } @@ -503,5 +511,5 @@ void HardwareRevX::loopHandler(){ // if (IrReceiver.decode(&results)) { // IrReceiver.resume(); // Enable receiving of the next value //} //tft.drawString(String(results.command) + " ", 80, 90, 1); - // + // } \ No newline at end of file From 89bf2f2b2e1b53b4c0372f90a276241273cc8af9 Mon Sep 17 00:00:00 2001 From: Matthew Colvin Date: Tue, 1 Aug 2023 15:45:51 -0500 Subject: [PATCH 2/8] add batteryStatus info and allow access to it through the interface. Change-Id: Ieb748b1478d532f52ffff9edc783de3cbcf9f303 --- .../LVGL.Simulator/HardwareSimulator.hpp | 37 +++++++++---------- .../OmoteUI/HardwareAbstractionInterface.h | 11 ++++++ Platformio/src/HardwareRevX.cpp | 16 ++++++-- Platformio/src/HardwareRevX.hpp | 9 ++--- 4 files changed, 45 insertions(+), 28 deletions(-) diff --git a/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp b/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp index 65e254b..131c7f0 100644 --- a/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp +++ b/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp @@ -1,30 +1,29 @@ #pragma once #include "HardwareAbstractionInterface.h" -#include #include +#include -class HardwareSimulator : - public HardwareAbstractionInterface -{ - public: +class HardwareSimulator : public HardwareAbstractionInterface { +public: + HardwareSimulator() = default; - HardwareSimulator() = default; + virtual void debugPrint(std::string message) override { + std::cout << message; + } - virtual void debugPrint(std::string message) override { - std::cout << message; - } + virtual void sendIR() override {} - virtual void sendIR() override { - - } + virtual void MQTTPublish(const char *topic, const char *payload) override{ - virtual void MQTTPublish(const char* topic, const char* payload) override { + }; - }; - - virtual void init() override { - lv_init(); - } + virtual void init() override { lv_init(); } + virtual batteryStatus getBatteryPercentage() { + batteryStatus fakeStatus; + fakeStatus.isCharging = false; + fakeStatus.percentage = 100; + fakeStatus.voltage = 4200; + return fakeStatus; + } }; - diff --git a/Platformio/include/OmoteUI/HardwareAbstractionInterface.h b/Platformio/include/OmoteUI/HardwareAbstractionInterface.h index 01220ac..420b8f4 100644 --- a/Platformio/include/OmoteUI/HardwareAbstractionInterface.h +++ b/Platformio/include/OmoteUI/HardwareAbstractionInterface.h @@ -7,10 +7,21 @@ class HardwareAbstractionInterface { public: + struct batteryStatus{ + /// @brief Percent of battery remaining (0-100] + int percentage; + /// @brief Voltage of battery in millivolts + int voltage; + /// @brief True - Battery is Charging + /// False - Battery discharging + bool isCharging; + }; + HardwareAbstractionInterface() = default; virtual void init() = 0; virtual void sendIR() = 0; virtual void MQTTPublish(const char *topic, const char *payload) = 0; + virtual batteryStatus getBatteryPercentage() = 0; virtual void debugPrint(std::string message) = 0; }; diff --git a/Platformio/src/HardwareRevX.cpp b/Platformio/src/HardwareRevX.cpp index 5aef561..7184667 100644 --- a/Platformio/src/HardwareRevX.cpp +++ b/Platformio/src/HardwareRevX.cpp @@ -99,6 +99,10 @@ void HardwareRevX::MQTTPublish(const char *topic, const char *payload) { #endif } +HardwareAbstractionInterface::batteryStatus HardwareRevX::getBatteryPercentage(){ + return battery; +} + void HardwareRevX::initLVGL() { lv_init(); @@ -424,11 +428,11 @@ void HardwareRevX::startTasks() { void HardwareRevX::updateBatteryTask([[maybe_unused]] void *aData) { while (true) { - mInstance->battery_voltage = + mInstance->battery.voltage = analogRead(ADC_BAT) * 2 * 3300 / 4095 + 350; // 350mV ADC offset - mInstance->battery_percentage = - constrain(map(mInstance->battery_voltage, 3700, 4200, 0, 100), 0, 100); - mInstance->battery_ischarging = !digitalRead(CRG_STAT); + mInstance->battery.percentage = + constrain(map(mInstance->battery.voltage, 3700, 4200, 0, 100), 0, 100); + mInstance->battery.isCharging = !digitalRead(CRG_STAT); // Check if battery is charging, fully charged or disconnected vTaskDelay(1000 / portTICK_PERIOD_MS); // Update battery at 1Hz @@ -436,6 +440,9 @@ void HardwareRevX::updateBatteryTask([[maybe_unused]] void *aData) { } void HardwareRevX::loopHandler() { + + // TODO Move the backlight handling into task that spawns when the backlight + // setting changes and then gets deleted when the setting is achieved. // Update Backlight brightness static int fadeInTimer = millis(); // fadeInTimer = time after setup if (millis() < @@ -448,6 +455,7 @@ void HardwareRevX::loopHandler() { ledcWrite(5, backlight_brightness); // Backlight on } + // TODO move to debug task // Blink debug LED at 1 Hz digitalWrite(USER_LED, millis() % 1000 > 500); diff --git a/Platformio/src/HardwareRevX.hpp b/Platformio/src/HardwareRevX.hpp index ba8f3a3..4a35c92 100644 --- a/Platformio/src/HardwareRevX.hpp +++ b/Platformio/src/HardwareRevX.hpp @@ -34,12 +34,13 @@ public: } HardwareRevX() : HardwareAbstractionInterface(){}; - // HardwareAbstractionInterface + // HardwareAbstractionInterface virtual void init() override; virtual void sendIR() override; virtual void MQTTPublish(const char *topic, const char *payload) override; + virtual batteryStatus getBatteryPercentage() override; virtual void debugPrint(std::string aDebugMessage) override; - + void loopHandler(); protected: @@ -114,9 +115,7 @@ private: IRsend IrSender = IRsend(IR_LED, true); IRrecv IrReceiver = IRrecv(IR_RX); - int battery_voltage = 0; - int battery_percentage = 100; - bool battery_ischarging = false; + HardwareAbstractionInterface::batteryStatus battery; // LVGL Screen Buffers lv_disp_draw_buf_t mdraw_buf; From 37b3a0642c4392e4b6c9dd194865602a81b8f9e2 Mon Sep 17 00:00:00 2001 From: Matthew Colvin Date: Tue, 1 Aug 2023 15:48:31 -0500 Subject: [PATCH 3/8] rename hardwareAbstractionInterface Change-Id: I39a9bcd7fc4d92b271a40a869faae7870d6d88a1 --- .../LVGL.Simulator/HardwareSimulator.hpp | 2 +- .../OmoteUI/HardwareAbstractionInterface.h | 6 ++-- Platformio/include/OmoteUI/OmoteUI.hpp | 15 +++++----- Platformio/src/HardwareRevX.cpp | 2 +- Platformio/src/HardwareRevX.hpp | 28 +++++++++---------- 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp b/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp index 131c7f0..f650b3c 100644 --- a/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp +++ b/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp @@ -3,7 +3,7 @@ #include #include -class HardwareSimulator : public HardwareAbstractionInterface { +class HardwareSimulator : public HardwareInterface { public: HardwareSimulator() = default; diff --git a/Platformio/include/OmoteUI/HardwareAbstractionInterface.h b/Platformio/include/OmoteUI/HardwareAbstractionInterface.h index 420b8f4..71a455f 100644 --- a/Platformio/include/OmoteUI/HardwareAbstractionInterface.h +++ b/Platformio/include/OmoteUI/HardwareAbstractionInterface.h @@ -5,9 +5,9 @@ #include #include -class HardwareAbstractionInterface { +class HardwareInterface { public: - struct batteryStatus{ + struct batteryStatus { /// @brief Percent of battery remaining (0-100] int percentage; /// @brief Voltage of battery in millivolts @@ -17,7 +17,7 @@ public: bool isCharging; }; - HardwareAbstractionInterface() = default; + HardwareInterface() = default; virtual void init() = 0; virtual void sendIR() = 0; diff --git a/Platformio/include/OmoteUI/OmoteUI.hpp b/Platformio/include/OmoteUI/OmoteUI.hpp index ff966ed..3c3aa56 100644 --- a/Platformio/include/OmoteUI/OmoteUI.hpp +++ b/Platformio/include/OmoteUI/OmoteUI.hpp @@ -4,23 +4,24 @@ #define LV_CONF_INCLUDE_SIMPLE #include "HardwareAbstractionInterface.h" -#include "lvgl.h" #include "Images.hpp" +#include "lvgl.h" #include #include #include #include + /// @brief Singleton to allow UI code to live separately from the Initialization /// of resources. class OmoteUI { public: - OmoteUI(std::shared_ptr aHardware) - : mHardware(aHardware) {}; + OmoteUI(std::shared_ptr aHardware) + : mHardware(aHardware){}; static std::weak_ptr getRefrence() { return getInstance(); }; - static std::shared_ptr getInstance( - std::shared_ptr aHardware = nullptr) { + static std::shared_ptr + getInstance(std::shared_ptr aHardware = nullptr) { if (mInstance) { return mInstance; } else if (aHardware) { @@ -54,7 +55,7 @@ public: private: static std::shared_ptr mInstance; - std::shared_ptr mHardware; + std::shared_ptr mHardware; lv_obj_t *panel = nullptr; Images imgs = Images(); @@ -62,7 +63,7 @@ private: int backlight_brightness = 255; lv_color_t color_primary = lv_color_hex(0x303030); // gray bool wakeupByIMUEnabled = true; - + inline static const uint_fast8_t virtualKeyMapTechnisat[10] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0}; }; diff --git a/Platformio/src/HardwareRevX.cpp b/Platformio/src/HardwareRevX.cpp index 7184667..161163a 100644 --- a/Platformio/src/HardwareRevX.cpp +++ b/Platformio/src/HardwareRevX.cpp @@ -99,7 +99,7 @@ void HardwareRevX::MQTTPublish(const char *topic, const char *payload) { #endif } -HardwareAbstractionInterface::batteryStatus HardwareRevX::getBatteryPercentage(){ +HardwareInterface::batteryStatus HardwareRevX::getBatteryPercentage() { return battery; } diff --git a/Platformio/src/HardwareRevX.hpp b/Platformio/src/HardwareRevX.hpp index 4a35c92..43335fb 100644 --- a/Platformio/src/HardwareRevX.hpp +++ b/Platformio/src/HardwareRevX.hpp @@ -10,16 +10,17 @@ #include #include #include -#include -#include -#include // Hardware-specific library #include // modified for inverted logic +#include +#include +#include // Hardware-specific library #include #include + #include "omoteconfig.h" -class HardwareRevX : public HardwareAbstractionInterface { +class HardwareRevX : public HardwareInterface { public: enum class WakeReason { RESET, IMU, KEYPAD }; @@ -29,12 +30,10 @@ public: } return mInstance; } - static std::weak_ptr getRefrence(){ - return getInstance(); - } + static std::weak_ptr getRefrence() { return getInstance(); } - HardwareRevX() : HardwareAbstractionInterface(){}; - // HardwareAbstractionInterface + HardwareRevX() : HardwareInterface(){}; + // HardwareInterface virtual void init() override; virtual void sendIR() override; virtual void MQTTPublish(const char *topic, const char *payload) override; @@ -62,7 +61,7 @@ protected: // UI/UX Handlers void handleDisplayFlush(lv_disp_drv_t *disp, const lv_area_t *area, - lv_color_t *color_p); + lv_color_t *color_p); void handleTouchPadRead(lv_indev_drv_t *indev_driver, lv_indev_data_t *data); void handleWifiEvent(WiFiEvent_t event); @@ -70,13 +69,12 @@ protected: // Tasks void startTasks(); - static void updateBatteryTask([[maybe_unused]] void* aData); + static void updateBatteryTask([[maybe_unused]] void *aData); TaskHandle_t batteryUpdateTskHndl = nullptr; private: - // Static Wrappers Needed to Satisfy C APIs - static void wiFiEventImpl(WiFiEvent_t event){ + static void wiFiEventImpl(WiFiEvent_t event) { mInstance->handleWifiEvent(event); } static void displayFlushImpl(lv_disp_drv_t *disp, const lv_area_t *area, @@ -115,7 +113,7 @@ private: IRsend IrSender = IRsend(IR_LED, true); IRrecv IrReceiver = IRrecv(IR_RX); - HardwareAbstractionInterface::batteryStatus battery; + HardwareInterface::batteryStatus battery; // LVGL Screen Buffers lv_disp_draw_buf_t mdraw_buf; @@ -148,7 +146,7 @@ private: {0x34, 0x0C, 0x22, 0x50, 0x55}, {'?', 0x35, 0x2F, 0x32, 0x36}}; byte virtualKeyMapTechnisat[10] = {0x1, 0x2, 0x3, 0x4, 0x5, - 0x6, 0x7, 0x8, 0x9, 0x0}; + 0x6, 0x7, 0x8, 0x9, 0x0}; static std::shared_ptr mInstance; }; \ No newline at end of file From cf9430ca7c5bebf04f638c483a2b57f78eb16635 Mon Sep 17 00:00:00 2001 From: Matthew Colvin Date: Tue, 1 Aug 2023 15:52:27 -0500 Subject: [PATCH 4/8] rename HardwareAbstractionInterface files Change-Id: Ifb6a96c38da61cb80aabc6c929e392a2fc91cf29 --- LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp | 2 +- LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj | 3 +-- .../LVGL.Simulator/LVGL.Simulator.vcxproj.filters | 9 +++------ ...ardwareAbstractionInterface.h => HardwareInterface.h} | 0 Platformio/include/OmoteUI/OmoteUI.hpp | 2 +- Platformio/src/HardwareAbstractionInterface.cpp | 1 - Platformio/src/HardwareRevX.hpp | 2 +- 7 files changed, 7 insertions(+), 12 deletions(-) rename Platformio/include/OmoteUI/{HardwareAbstractionInterface.h => HardwareInterface.h} (100%) delete mode 100644 Platformio/src/HardwareAbstractionInterface.cpp diff --git a/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp b/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp index f650b3c..a7d564c 100644 --- a/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp +++ b/LVGL Simulator/LVGL.Simulator/HardwareSimulator.hpp @@ -1,5 +1,5 @@ #pragma once -#include "HardwareAbstractionInterface.h" +#include "HardwareInterface.h" #include #include diff --git a/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj b/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj index 3aa4976..7ee2cb4 100644 --- a/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj +++ b/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj @@ -44,7 +44,7 @@ - + @@ -62,7 +62,6 @@ - diff --git a/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj.filters b/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj.filters index 9aaeef2..eaa703f 100644 --- a/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj.filters +++ b/LVGL Simulator/LVGL.Simulator/LVGL.Simulator.vcxproj.filters @@ -6,9 +6,6 @@ - - OmoteUI - OmoteUI @@ -16,6 +13,9 @@ OmoteUI + + OmoteUI + @@ -27,9 +27,6 @@ - - OmoteUI - OmoteUI diff --git a/Platformio/include/OmoteUI/HardwareAbstractionInterface.h b/Platformio/include/OmoteUI/HardwareInterface.h similarity index 100% rename from Platformio/include/OmoteUI/HardwareAbstractionInterface.h rename to Platformio/include/OmoteUI/HardwareInterface.h diff --git a/Platformio/include/OmoteUI/OmoteUI.hpp b/Platformio/include/OmoteUI/OmoteUI.hpp index 3c3aa56..7692015 100644 --- a/Platformio/include/OmoteUI/OmoteUI.hpp +++ b/Platformio/include/OmoteUI/OmoteUI.hpp @@ -3,7 +3,7 @@ #pragma once #define LV_CONF_INCLUDE_SIMPLE -#include "HardwareAbstractionInterface.h" +#include "HardwareInterface.h" #include "Images.hpp" #include "lvgl.h" #include diff --git a/Platformio/src/HardwareAbstractionInterface.cpp b/Platformio/src/HardwareAbstractionInterface.cpp deleted file mode 100644 index ebd27a2..0000000 --- a/Platformio/src/HardwareAbstractionInterface.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "HardwareAbstractionInterface.h" diff --git a/Platformio/src/HardwareRevX.hpp b/Platformio/src/HardwareRevX.hpp index 43335fb..f618880 100644 --- a/Platformio/src/HardwareRevX.hpp +++ b/Platformio/src/HardwareRevX.hpp @@ -1,7 +1,7 @@ #pragma once #include "SparkFunLIS3DH.h" -#include "HardwareAbstractionInterface.h" +#include "HardwareInterface.h" #include "WiFi.h" #include "Wire.h" #include "lvgl.h" From 17f751a08a158f0be0ebbf39970bb03139ea9785 Mon Sep 17 00:00:00 2001 From: Matthew Colvin <35540398+Mc067415@users.noreply.github.com> Date: Sat, 5 Aug 2023 13:02:58 -0500 Subject: [PATCH 5/8] Re work directory structure to support new architecture Still need to get the Sim building --- .../Interface}/HardwareInterface.h | 0 .../Targets/ESP32}/HardwareRevX.cpp | 0 .../Targets/ESP32}/HardwareRevX.hpp | 2 +- Platformio/HAL/Targets/ESP32/omoteconfig.h | 55 ++++++ .../Targets/Simulator/HardwareSimulator.cpp | 1 + .../Targets/Simulator/HardwareSimulator.hpp | 29 +++ .../HAL/Targets/Simulator/omoteconfig.h | 6 + Platformio/{include => }/OmoteUI/Images.hpp | 0 Platformio/{src => OmoteUI}/OmoteUI.cpp | 0 Platformio/{include => }/OmoteUI/OmoteUI.hpp | 0 Platformio/platformio.ini | 81 +++++++- Platformio/src/LVGL.Simulator.cpp | 183 ++++++++++++++++++ Platformio/src/main.cpp | 2 +- 13 files changed, 353 insertions(+), 6 deletions(-) rename Platformio/{include/OmoteUI => HAL/Interface}/HardwareInterface.h (100%) rename Platformio/{src => HAL/Targets/ESP32}/HardwareRevX.cpp (100%) rename Platformio/{src => HAL/Targets/ESP32}/HardwareRevX.hpp (99%) create mode 100644 Platformio/HAL/Targets/ESP32/omoteconfig.h create mode 100644 Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp create mode 100644 Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp create mode 100644 Platformio/HAL/Targets/Simulator/omoteconfig.h rename Platformio/{include => }/OmoteUI/Images.hpp (100%) rename Platformio/{src => OmoteUI}/OmoteUI.cpp (100%) rename Platformio/{include => }/OmoteUI/OmoteUI.hpp (100%) create mode 100644 Platformio/src/LVGL.Simulator.cpp diff --git a/Platformio/include/OmoteUI/HardwareInterface.h b/Platformio/HAL/Interface/HardwareInterface.h similarity index 100% rename from Platformio/include/OmoteUI/HardwareInterface.h rename to Platformio/HAL/Interface/HardwareInterface.h diff --git a/Platformio/src/HardwareRevX.cpp b/Platformio/HAL/Targets/ESP32/HardwareRevX.cpp similarity index 100% rename from Platformio/src/HardwareRevX.cpp rename to Platformio/HAL/Targets/ESP32/HardwareRevX.cpp diff --git a/Platformio/src/HardwareRevX.hpp b/Platformio/HAL/Targets/ESP32/HardwareRevX.hpp similarity index 99% rename from Platformio/src/HardwareRevX.hpp rename to Platformio/HAL/Targets/ESP32/HardwareRevX.hpp index f618880..0ff2c68 100644 --- a/Platformio/src/HardwareRevX.hpp +++ b/Platformio/HAL/Targets/ESP32/HardwareRevX.hpp @@ -2,7 +2,7 @@ #include "SparkFunLIS3DH.h" #include "HardwareInterface.h" -#include "WiFi.h" +#include #include "Wire.h" #include "lvgl.h" #include diff --git a/Platformio/HAL/Targets/ESP32/omoteconfig.h b/Platformio/HAL/Targets/ESP32/omoteconfig.h new file mode 100644 index 0000000..48f227e --- /dev/null +++ b/Platformio/HAL/Targets/ESP32/omoteconfig.h @@ -0,0 +1,55 @@ +#pragma once + +#define IS_SIMULATOR false + +// Comment out to disable connected features +#define ENABLE_WIFI +#define WIFI_SSID "YOUR_WIFI_SSID" +#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD" +#define MQTT_SERVER "YOUR_MQTT_SERVER_IP" + +// time until device enters sleep mode in milliseconds +#define SLEEP_TIMEOUT 20000 + +// motion above threshold keeps device awake +#define MOTION_THRESHOLD 50 + +// IO34+IO35+IO37+IO38+IO39(+IO13) +#define BUTTON_PIN_BITMASK 0b1110110000000000000000000010000000000000 + +#define SCREEN_WIDTH 240 +#define SCREEN_HEIGHT 360 + +// Pin assignment +// ----------------------------------------------------------------------------------------------------------------------- + +#define LCD_DC 9 // defined in TFT_eSPI User_Setup.h +#define LCD_CS 5 +#define LCD_MOSI 23 +#define LCD_SCK 18 +#define LCD_BL 4 +#define LCD_EN 10 + +#define USER_LED 2 + +#define SW_1 32 // 1...5: Output +#define SW_2 26 +#define SW_3 27 +#define SW_4 14 +#define SW_5 12 +#define SW_A 37 // A...E: Input +#define SW_B 38 +#define SW_C 39 +#define SW_D 34 +#define SW_E 35 + +#define IR_RX 15 // IR receiver input +#define ADC_BAT 36 // Battery voltage sense input (1/2 divider) +#define IR_VCC 25 // IR receiver power +#define IR_LED 33 // IR LED output + +#define SCL 22 +#define SDA 19 +#define ACC_INT 20 + +#define CRG_STAT 21 // battery charger feedback \ No newline at end of file diff --git a/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp b/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp new file mode 100644 index 0000000..1ef3390 --- /dev/null +++ b/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp @@ -0,0 +1 @@ +#include "HardwareSimulator.hpp" diff --git a/Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp b/Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp new file mode 100644 index 0000000..a7d564c --- /dev/null +++ b/Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "HardwareInterface.h" +#include +#include + +class HardwareSimulator : public HardwareInterface { +public: + HardwareSimulator() = default; + + virtual void debugPrint(std::string message) override { + std::cout << message; + } + + virtual void sendIR() override {} + + virtual void MQTTPublish(const char *topic, const char *payload) override{ + + }; + + virtual void init() override { lv_init(); } + + virtual batteryStatus getBatteryPercentage() { + batteryStatus fakeStatus; + fakeStatus.isCharging = false; + fakeStatus.percentage = 100; + fakeStatus.voltage = 4200; + return fakeStatus; + } +}; diff --git a/Platformio/HAL/Targets/Simulator/omoteconfig.h b/Platformio/HAL/Targets/Simulator/omoteconfig.h new file mode 100644 index 0000000..4f8b2f6 --- /dev/null +++ b/Platformio/HAL/Targets/Simulator/omoteconfig.h @@ -0,0 +1,6 @@ +#pragma once + +#define IS_SIMULATOR true + +#define SCREEN_WIDTH 240 +#define SCREEN_HEIGHT 360 diff --git a/Platformio/include/OmoteUI/Images.hpp b/Platformio/OmoteUI/Images.hpp similarity index 100% rename from Platformio/include/OmoteUI/Images.hpp rename to Platformio/OmoteUI/Images.hpp diff --git a/Platformio/src/OmoteUI.cpp b/Platformio/OmoteUI/OmoteUI.cpp similarity index 100% rename from Platformio/src/OmoteUI.cpp rename to Platformio/OmoteUI/OmoteUI.cpp diff --git a/Platformio/include/OmoteUI/OmoteUI.hpp b/Platformio/OmoteUI/OmoteUI.hpp similarity index 100% rename from Platformio/include/OmoteUI/OmoteUI.hpp rename to Platformio/OmoteUI/OmoteUI.hpp diff --git a/Platformio/platformio.ini b/Platformio/platformio.ini index e4d3f9d..aa2a195 100644 --- a/Platformio/platformio.ini +++ b/Platformio/platformio.ini @@ -8,6 +8,27 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html +[platformio] +default_envs = esp32 + + +; ; Shared options +; [env] +; build_flags = +; ; Don't use lv_conf.h. Tweak params via platfom.ini. +; -D LV_CONF_SKIP +; -D LV_CONF_INCLUDE_SIMPLE +; ; Enable LVGL demo, remove when working on your own project +; -D LV_USE_DEMO_WIDGETS=1 +; ; Add more defines below to overide lvgl:/src/lv_conf_simple.h +; lib_deps = +; ; Use direct URL, because package registry is unstable +; ;lvgl@~7.11.0 +; lvgl=https://github.com/lvgl/lvgl/archive/refs/tags/v8.2.0.zip +; lib_archive = false + + + [env:esp32] platform = espressif32 board = esp32dev @@ -23,13 +44,21 @@ lib_deps = lvgl/lvgl@^8.3.4 bodmer/TFT_eSPI@^2.5.23 knolleary/PubSubClient@^2.8 + Wire + WiFi + SPI + Keypad + Preferences build_flags = -std=c++17 -std=gnu++17 -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG -I include - -I include/OmoteUI - ; Include the folder containing lv_conf.h + -I OmoteUI + -I HAL + -I HAL/Interface + -I HAL/Targets/ESP32 + ; The following lines replace the TFT_eSPI User_setup.h-file -D USER_SETUP_LOADED=1 -D ILI9341_DRIVER=1 @@ -40,7 +69,7 @@ build_flags = -D TFT_CS=5 -D TFT_DC=9 -D TFT_RST=-1 - -D SPI_FREQUENCY=80000000 + -D SPI_FREQUENCY=40000000 ; 40MHz default, some displays might support 80MHz -D SPI_TOUCH_FREQUENCY=2500000 ; TFT_eSPI fonts are disabled by default ;-D LOAD_GLCD=1 @@ -52,4 +81,48 @@ build_flags = ;-D LOAD_GFXFF=1 ;-D SMOOTH_FONT=1 build_unflags = - -std=gnu++11 \ No newline at end of file + -std=gnu++11 +build_src_filter = + + + +<../HAL/Targets/ESP32/*> + +<../OmoteUI/*> + + +[env:emulator_64bits] +platform = native@^1.1.3 +build_flags = + ${env.build_flags} + ; -D LV_LOG_LEVEL=LV_LOG_LEVEL_INFO + -D LV_LOG_PRINTF=1 + ;-lSDL2 + ; SDL drivers options + -D LV_LVGL_H_INCLUDE_SIMPLE + -D LV_DRV_NO_CONF +; -D USE_SDL +; -D SDL_HOR_RES=480 +; -D SDL_VER_RES=320 +; -D SDL_ZOOM=1 + + ; LVGL memory options, setup for the demo to run properly + -D LV_MEM_CUSTOM=1 + -D LV_MEM_SIZE="(128U * 1024U)" + +lib_deps = + ${env.lib_deps} + ; Use direct URL, because package registry is unstable + ;lv_drivers@~7.9.0 + lv_drivers=https://github.com/lvgl/lv_drivers/archive/refs/tags/v8.2.0.zip +build_src_filter = + +<*> + ; Force compile LVGL demo, remove when working on your own project + + +[env:emulator_32bits] +extends = env:emulator_64bits +build_flags = + ${env:emulator_64bits.build_flags} + -m32 +build_src_filter = + +<*> + +<../hal/sdl2> + +<../.pio/libdeps/emulator_32bits/lvgl/demos> diff --git a/Platformio/src/LVGL.Simulator.cpp b/Platformio/src/LVGL.Simulator.cpp new file mode 100644 index 0000000..0164be0 --- /dev/null +++ b/Platformio/src/LVGL.Simulator.cpp @@ -0,0 +1,183 @@ +/* + * PROJECT: LVGL PC Simulator using Visual Studio + * FILE: LVGL.Simulator.cpp + * PURPOSE: Implementation for LVGL ported to Windows Desktop + * + * LICENSE: The MIT License + * + * DEVELOPER: Mouri_Naruto (Mouri_Naruto AT Outlook.com) + */ + +#include +#include +#include "resource.h" + +#include "omoteconfig.h" +#include "HardwareSimulator.hpp" +#include "OmoteUI.hpp" + +#if _MSC_VER >= 1200 +// Disable compilation warnings. +#pragma warning(push) +// nonstandard extension used : bit field types other than int +#pragma warning(disable : 4214) +// 'conversion' conversion from 'type1' to 'type2', possible loss of data +#pragma warning(disable : 4244) +#endif + +#include "lvgl/lvgl.h" +#include "lv_drivers/win32drv/win32drv.h" + +#if _MSC_VER >= 1200 +// Restore compilation warnings. +#pragma warning(pop) +#endif + +#include + +bool single_display_mode_initialization() +{ + if (!lv_win32_init( + GetModuleHandleW(NULL), + SW_SHOW, + 240, + 320, + LoadIconW(GetModuleHandleW(NULL), MAKEINTRESOURCE(IDI_LVGL)))) + { + return false; + } + lv_win32_add_all_input_devices_to_group(NULL); + + return true; +} + +#include + +HANDLE g_window_mutex = NULL; +bool g_initialization_status = false; + +#define LVGL_SIMULATOR_MAXIMUM_DISPLAYS 16 +HWND g_display_window_handles[LVGL_SIMULATOR_MAXIMUM_DISPLAYS]; + +unsigned int __stdcall lv_win32_window_thread_entrypoint( + void *raw_parameter) +{ + size_t display_id = *(size_t *)(raw_parameter); + + HINSTANCE instance_handle = GetModuleHandleW(NULL); + int show_window_mode = SW_SHOW; + HICON icon_handle = LoadIconW(instance_handle, MAKEINTRESOURCE(IDI_LVGL)); + lv_coord_t hor_res = 240; + lv_coord_t ver_res = 320; + + wchar_t window_title[256]; + memset(window_title, 0, sizeof(window_title)); + _snwprintf( + window_title, + 256, + L"LVGL Simulator for Windows Desktop (Display %d)", + display_id); + + g_display_window_handles[display_id] = lv_win32_create_display_window( + window_title, + hor_res, + ver_res, + instance_handle, + icon_handle, + show_window_mode); + if (!g_display_window_handles[display_id]) + { + return 0; + } + + g_initialization_status = true; + + SetEvent(g_window_mutex); + + MSG message; + while (GetMessageW(&message, NULL, 0, 0)) + { + TranslateMessage(&message); + DispatchMessageW(&message); + } + + lv_win32_quit_signal = true; + + return 0; +} + +bool multiple_display_mode_initialization() +{ + if (!lv_win32_init_window_class()) + { + return false; + } + + for (size_t i = 0; i < LVGL_SIMULATOR_MAXIMUM_DISPLAYS; ++i) + { + g_initialization_status = false; + + g_window_mutex = CreateEventExW(NULL, NULL, 0, EVENT_ALL_ACCESS); + + _beginthreadex( + NULL, + 0, + lv_win32_window_thread_entrypoint, + &i, + 0, + NULL); + + WaitForSingleObjectEx(g_window_mutex, INFINITE, FALSE); + + CloseHandle(g_window_mutex); + + if (!g_initialization_status) + { + return false; + } + } + + lv_win32_window_context_t *context = (lv_win32_window_context_t *)(lv_win32_get_window_context(g_display_window_handles[0])); + if (context) + { + lv_win32_pointer_device_object = context->mouse_device_object; + lv_win32_keypad_device_object = context->keyboard_device_object; + lv_win32_encoder_device_object = context->mousewheel_device_object; + } + + lv_win32_add_all_input_devices_to_group(NULL); + + return true; +} + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +int main() +{ + auto hal = std::make_shared(); + hal->init(); + + auto ui = OmoteUI::getInstance(hal); + + if (!single_display_mode_initialization()) + { + return -1; + } + + ui->layout_UI(); + + while (!lv_win32_quit_signal) + { + lv_task_handler(); + // std::string strng = std::to_string(scroll_value); + // const char* pchar = strng.c_str(); + // OutputDebugStringW(); + // lv_label_set_text_fmt(scrollPos, "%d %d", lv_obj_get_scroll_x(lv_tabview_get_content(tabview)), lv_obj_get_scroll_x(panel)); + + Sleep(1); + } + + return 0; +} diff --git a/Platformio/src/main.cpp b/Platformio/src/main.cpp index 8b4ce67..baf4d6c 100644 --- a/Platformio/src/main.cpp +++ b/Platformio/src/main.cpp @@ -3,7 +3,7 @@ #include #include "HardwareRevX.hpp" -#include "OmoteUI/OmoteUI.hpp" +#include "OmoteUI.hpp" #include "omoteconfig.h" std::shared_ptr hal = nullptr; From 6196d6c66d6eadd9d214d470d9576a62b95be8c2 Mon Sep 17 00:00:00 2001 From: Matthew Colvin <35540398+Mc067415@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:07:55 -0500 Subject: [PATCH 6/8] lvgl simulator working. --- Platformio/OmoteUI/OmoteUI.cpp | 24 ++-- Platformio/OmoteUI/OmoteUI.hpp | 1 - Platformio/platformio.ini | 70 +++++++----- Platformio/src/LVGL.Simulator.cpp | 183 ------------------------------ Platformio/src/simMain.cpp | 95 ++++++++++++++++ 5 files changed, 147 insertions(+), 226 deletions(-) delete mode 100644 Platformio/src/LVGL.Simulator.cpp create mode 100644 Platformio/src/simMain.cpp diff --git a/Platformio/OmoteUI/OmoteUI.cpp b/Platformio/OmoteUI/OmoteUI.cpp index af15df8..2aae975 100644 --- a/Platformio/OmoteUI/OmoteUI.cpp +++ b/Platformio/OmoteUI/OmoteUI.cpp @@ -34,7 +34,7 @@ void OmoteUI::bl_slider_event_cb(lv_event_t *e) { void OmoteUI::appleKey_event_cb(lv_event_t *e) { // Send IR command based on the event user data mHardware->sendIR(); - mHardware->debugPrint(std::to_string(50 + (int)e->user_data)); + //mHardware->debugPrint(std::to_string(50 + (int)e->user_data)); } // Wakeup by IMU Switch Event handler @@ -51,10 +51,10 @@ void OmoteUI::smartHomeToggle_event_cb(lv_event_t *e) { else strcpy(payload, "false"); // Publish an MQTT message based on the event user data - if ((int)e->user_data == 1) - mHardware->MQTTPublish("bulb1_set", payload); - if ((int)e->user_data == 2) - mHardware->MQTTPublish("bulb2_set", payload); + // if ((int)e->user_data == 1) + // mHardware->MQTTPublish("bulb1_set", payload); + // if ((int)e->user_data == 2) + // mHardware->MQTTPublish("bulb2_set", payload); } // Smart Home Toggle Event handler @@ -69,10 +69,10 @@ void OmoteUI::smartHomeSlider_event_cb(lv_event_t *e) { snprintf(payload, sizeof(payload), "%8.2f", sliderValue); // Publish an MQTT message based on the event user data - if ((int)e->user_data == 1) - mHardware->MQTTPublish("bulb1_setbrightness", payload); - if ((int)e->user_data == 2) - mHardware->MQTTPublish("bulb2_setbrightness", payload); + // if ((int)e->user_data == 1) + // mHardware->MQTTPublish("bulb1_setbrightness", payload); + // if ((int)e->user_data == 2) + // mHardware->MQTTPublish("bulb2_setbrightness", payload); } void OmoteUI::virtualKeypad_event_cb(lv_event_t *e) { @@ -82,9 +82,9 @@ void OmoteUI::virtualKeypad_event_cb(lv_event_t *e) { return; char buffer[100]; - sprintf(buffer, "check it out: %d\n", - virtualKeyMapTechnisat[(int)target->user_data]); - mHardware->debugPrint(buffer); + // sprintf(buffer, "check it out: %d\n", + // virtualKeyMapTechnisat[(int)target->user_data]); + // mHardware->debugPrint(buffer); } void OmoteUI::loopHandler(){ diff --git a/Platformio/OmoteUI/OmoteUI.hpp b/Platformio/OmoteUI/OmoteUI.hpp index 7692015..6d207e7 100644 --- a/Platformio/OmoteUI/OmoteUI.hpp +++ b/Platformio/OmoteUI/OmoteUI.hpp @@ -1,7 +1,6 @@ // OMOTE UI // 2023 Matthew Colvin #pragma once -#define LV_CONF_INCLUDE_SIMPLE #include "HardwareInterface.h" #include "Images.hpp" diff --git a/Platformio/platformio.ini b/Platformio/platformio.ini index aa2a195..f8f220c 100644 --- a/Platformio/platformio.ini +++ b/Platformio/platformio.ini @@ -9,24 +9,25 @@ ; https://docs.platformio.org/page/projectconf.html [platformio] -default_envs = esp32 +default_envs = x64_sim -; ; Shared options -; [env] -; build_flags = -; ; Don't use lv_conf.h. Tweak params via platfom.ini. -; -D LV_CONF_SKIP -; -D LV_CONF_INCLUDE_SIMPLE -; ; Enable LVGL demo, remove when working on your own project -; -D LV_USE_DEMO_WIDGETS=1 -; ; Add more defines below to overide lvgl:/src/lv_conf_simple.h -; lib_deps = -; ; Use direct URL, because package registry is unstable -; ;lvgl@~7.11.0 -; lvgl=https://github.com/lvgl/lvgl/archive/refs/tags/v8.2.0.zip -; lib_archive = false - +; Shared options +[env] +build_flags = + -std=c++17 + -std=gnu++17 + ; Don't use lv_conf.h. Tweak params via platfom.ini. + -D LV_CONF_SKIP + -D LV_CONF_INCLUDE_SIMPLE + ; Enable LVGL demo, remove when working on your own project + ; -D LV_USE_DEMO_WIDGETS=1 + ; Add more defines below to overide lvgl:/src/lv_conf_simple.h +lib_deps = + ; Use direct URL, because package registry is unstable + ;lvgl@~7.11.0 + lvgl=https://github.com/lvgl/lvgl/archive/refs/tags/v8.2.0.zip +lib_archive = false [env:esp32] @@ -50,8 +51,6 @@ lib_deps = Keypad Preferences build_flags = - -std=c++17 - -std=gnu++17 -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG -I include -I OmoteUI @@ -88,20 +87,29 @@ build_src_filter = +<../OmoteUI/*> -[env:emulator_64bits] +[env:x64_sim] platform = native@^1.1.3 build_flags = ${env.build_flags} - ; -D LV_LOG_LEVEL=LV_LOG_LEVEL_INFO - -D LV_LOG_PRINTF=1 - ;-lSDL2 + + ;-D LV_LOG_LEVEL=LV_LOG_LEVEL_INFO + ;-D LV_LOG_PRINTF=1 + -lSDL2 ; SDL drivers options -D LV_LVGL_H_INCLUDE_SIMPLE -D LV_DRV_NO_CONF -; -D USE_SDL -; -D SDL_HOR_RES=480 -; -D SDL_VER_RES=320 -; -D SDL_ZOOM=1 + -D USE_SDL + -D SDL_HOR_RES=480 + -D SDL_VER_RES=320 + -D SDL_ZOOM=1 + -D SDL_INCLUDE_PATH="\"SDL2/SDL.h\"" + + + -I include + -I OmoteUI + -I HAL + -I HAL/Interface + -I HAL/Targets/Simulator ; LVGL memory options, setup for the demo to run properly -D LV_MEM_CUSTOM=1 @@ -113,14 +121,16 @@ lib_deps = ;lv_drivers@~7.9.0 lv_drivers=https://github.com/lvgl/lv_drivers/archive/refs/tags/v8.2.0.zip build_src_filter = - +<*> + + + +<../HAL/Targets/Simulator/*> + +<../OmoteUI/*> ; Force compile LVGL demo, remove when working on your own project -[env:emulator_32bits] -extends = env:emulator_64bits +[env:x86_sim] +extends = env:x64_sim build_flags = - ${env:emulator_64bits.build_flags} + ${env:x64_sim.build_flags} -m32 build_src_filter = +<*> diff --git a/Platformio/src/LVGL.Simulator.cpp b/Platformio/src/LVGL.Simulator.cpp deleted file mode 100644 index 0164be0..0000000 --- a/Platformio/src/LVGL.Simulator.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * PROJECT: LVGL PC Simulator using Visual Studio - * FILE: LVGL.Simulator.cpp - * PURPOSE: Implementation for LVGL ported to Windows Desktop - * - * LICENSE: The MIT License - * - * DEVELOPER: Mouri_Naruto (Mouri_Naruto AT Outlook.com) - */ - -#include -#include -#include "resource.h" - -#include "omoteconfig.h" -#include "HardwareSimulator.hpp" -#include "OmoteUI.hpp" - -#if _MSC_VER >= 1200 -// Disable compilation warnings. -#pragma warning(push) -// nonstandard extension used : bit field types other than int -#pragma warning(disable : 4214) -// 'conversion' conversion from 'type1' to 'type2', possible loss of data -#pragma warning(disable : 4244) -#endif - -#include "lvgl/lvgl.h" -#include "lv_drivers/win32drv/win32drv.h" - -#if _MSC_VER >= 1200 -// Restore compilation warnings. -#pragma warning(pop) -#endif - -#include - -bool single_display_mode_initialization() -{ - if (!lv_win32_init( - GetModuleHandleW(NULL), - SW_SHOW, - 240, - 320, - LoadIconW(GetModuleHandleW(NULL), MAKEINTRESOURCE(IDI_LVGL)))) - { - return false; - } - lv_win32_add_all_input_devices_to_group(NULL); - - return true; -} - -#include - -HANDLE g_window_mutex = NULL; -bool g_initialization_status = false; - -#define LVGL_SIMULATOR_MAXIMUM_DISPLAYS 16 -HWND g_display_window_handles[LVGL_SIMULATOR_MAXIMUM_DISPLAYS]; - -unsigned int __stdcall lv_win32_window_thread_entrypoint( - void *raw_parameter) -{ - size_t display_id = *(size_t *)(raw_parameter); - - HINSTANCE instance_handle = GetModuleHandleW(NULL); - int show_window_mode = SW_SHOW; - HICON icon_handle = LoadIconW(instance_handle, MAKEINTRESOURCE(IDI_LVGL)); - lv_coord_t hor_res = 240; - lv_coord_t ver_res = 320; - - wchar_t window_title[256]; - memset(window_title, 0, sizeof(window_title)); - _snwprintf( - window_title, - 256, - L"LVGL Simulator for Windows Desktop (Display %d)", - display_id); - - g_display_window_handles[display_id] = lv_win32_create_display_window( - window_title, - hor_res, - ver_res, - instance_handle, - icon_handle, - show_window_mode); - if (!g_display_window_handles[display_id]) - { - return 0; - } - - g_initialization_status = true; - - SetEvent(g_window_mutex); - - MSG message; - while (GetMessageW(&message, NULL, 0, 0)) - { - TranslateMessage(&message); - DispatchMessageW(&message); - } - - lv_win32_quit_signal = true; - - return 0; -} - -bool multiple_display_mode_initialization() -{ - if (!lv_win32_init_window_class()) - { - return false; - } - - for (size_t i = 0; i < LVGL_SIMULATOR_MAXIMUM_DISPLAYS; ++i) - { - g_initialization_status = false; - - g_window_mutex = CreateEventExW(NULL, NULL, 0, EVENT_ALL_ACCESS); - - _beginthreadex( - NULL, - 0, - lv_win32_window_thread_entrypoint, - &i, - 0, - NULL); - - WaitForSingleObjectEx(g_window_mutex, INFINITE, FALSE); - - CloseHandle(g_window_mutex); - - if (!g_initialization_status) - { - return false; - } - } - - lv_win32_window_context_t *context = (lv_win32_window_context_t *)(lv_win32_get_window_context(g_display_window_handles[0])); - if (context) - { - lv_win32_pointer_device_object = context->mouse_device_object; - lv_win32_keypad_device_object = context->keyboard_device_object; - lv_win32_encoder_device_object = context->mousewheel_device_object; - } - - lv_win32_add_all_input_devices_to_group(NULL); - - return true; -} - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -int main() -{ - auto hal = std::make_shared(); - hal->init(); - - auto ui = OmoteUI::getInstance(hal); - - if (!single_display_mode_initialization()) - { - return -1; - } - - ui->layout_UI(); - - while (!lv_win32_quit_signal) - { - lv_task_handler(); - // std::string strng = std::to_string(scroll_value); - // const char* pchar = strng.c_str(); - // OutputDebugStringW(); - // lv_label_set_text_fmt(scrollPos, "%d %d", lv_obj_get_scroll_x(lv_tabview_get_content(tabview)), lv_obj_get_scroll_x(panel)); - - Sleep(1); - } - - return 0; -} diff --git a/Platformio/src/simMain.cpp b/Platformio/src/simMain.cpp new file mode 100644 index 0000000..6055435 --- /dev/null +++ b/Platformio/src/simMain.cpp @@ -0,0 +1,95 @@ +#include +#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ +#include "SDL2/SDL.h" +#include "display/monitor.h" +#include "indev/mouse.h" +#include "indev/mousewheel.h" +#include "indev/keyboard.h" +#include "sdl/sdl.h" +#include "HardwareSimulator.hpp" +#include "omoteconfig.h" +#include "OmoteUI.hpp" +#include + + +/** + * A task to measure the elapsed time for LittlevGL + * @param data unused + * @return never return + */ +static int tick_thread(void * data) +{ + (void)data; + + while(1) { + SDL_Delay(5); /*Sleep for 5 millisecond*/ + lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/ + } + + return 0; +} + + +void hal_setup(void) +{ + // Workaround for sdl2 `-m32` crash + // https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7 + #ifndef WIN32 + setenv("DBUS_FATAL_WARNINGS", "0", 1); + #endif + + /* Add a display + * Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/ + + static lv_disp_draw_buf_t disp_buf; + static lv_color_t buf[SDL_HOR_RES * 10]; /*Declare a buffer for 10 lines*/ + lv_disp_draw_buf_init(&disp_buf, buf, NULL, SDL_HOR_RES * 10); /*Initialize the display buffer*/ + + static lv_disp_drv_t disp_drv; + lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + disp_drv.flush_cb = sdl_display_flush; /*Used when `LV_VDB_SIZE != 0` in lv_conf.h (buffered drawing)*/ + disp_drv.draw_buf = &disp_buf; + disp_drv.hor_res = SDL_HOR_RES; + disp_drv.ver_res = SDL_VER_RES; + //disp_drv.disp_fill = monitor_fill; /*Used when `LV_VDB_SIZE == 0` in lv_conf.h (unbuffered drawing)*/ + //disp_drv.disp_map = monitor_map; /*Used when `LV_VDB_SIZE == 0` in lv_conf.h (unbuffered drawing)*/ + lv_disp_drv_register(&disp_drv); + + /* Add the mouse as input device + * Use the 'mouse' driver which reads the PC's mouse*/ + static lv_indev_drv_t indev_drv; + lv_indev_drv_init(&indev_drv); /*Basic initialization*/ + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = sdl_mouse_read; /*This function will be called periodically (by the library) to get the mouse position and state*/ + lv_indev_drv_register(&indev_drv); + + sdl_init(); + + /* Tick init. + * You have to call 'lv_tick_inc()' in periodically to inform LittelvGL about how much time were elapsed + * Create an SDL thread to do this*/ + SDL_CreateThread(tick_thread, "tick", NULL); +} + +void hal_loop(void) +{ + while(1) { + + } +} + +int main(){ + auto hwSim = std::make_shared(); + hwSim->init(); + + hal_setup(); + + auto ui = OmoteUI::getInstance(hwSim); + ui->layout_UI(); + + while (true){ + ui->loopHandler(); + SDL_Delay(5); + lv_task_handler(); + } +} \ No newline at end of file From 5f985aabb03071249b56ba34bb24460623c3b20c Mon Sep 17 00:00:00 2001 From: Matthew Colvin <35540398+Mc067415@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:14:50 -0500 Subject: [PATCH 7/8] put init code into HardwareSimulator Class --- .../Targets/Simulator/HardwareSimulator.cpp | 70 ++++++++++++++++ .../Targets/Simulator/HardwareSimulator.hpp | 2 +- Platformio/src/simMain.cpp | 80 +------------------ 3 files changed, 72 insertions(+), 80 deletions(-) diff --git a/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp b/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp index 1ef3390..828c150 100644 --- a/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp +++ b/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp @@ -1 +1,71 @@ #include "HardwareSimulator.hpp" +#include +#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ +#include "SDL2/SDL.h" +#include "display/monitor.h" +#include "indev/mouse.h" +#include "indev/mousewheel.h" +#include "indev/keyboard.h" +#include "sdl/sdl.h" + +/** + * A task to measure the elapsed time for LittlevGL + * @param data unused + * @return never return + */ +static int tick_thread(void * data) +{ + (void)data; + + while(1) { + SDL_Delay(5); /*Sleep for 5 millisecond*/ + lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/ + } + + return 0; +} + + + + +void HardwareSimulator::init() { + lv_init(); + // Workaround for sdl2 `-m32` crash + // https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7 + #ifndef WIN32 + setenv("DBUS_FATAL_WARNINGS", "0", 1); + #endif + + /* Add a display + * Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/ + + static lv_disp_draw_buf_t disp_buf; + static lv_color_t buf[SDL_HOR_RES * 10]; /*Declare a buffer for 10 lines*/ + lv_disp_draw_buf_init(&disp_buf, buf, NULL, SDL_HOR_RES * 10); /*Initialize the display buffer*/ + + static lv_disp_drv_t disp_drv; + lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + disp_drv.flush_cb = sdl_display_flush; /*Used when `LV_VDB_SIZE != 0` in lv_conf.h (buffered drawing)*/ + disp_drv.draw_buf = &disp_buf; + disp_drv.hor_res = SDL_HOR_RES; + disp_drv.ver_res = SDL_VER_RES; + //disp_drv.disp_fill = monitor_fill; /*Used when `LV_VDB_SIZE == 0` in lv_conf.h (unbuffered drawing)*/ + //disp_drv.disp_map = monitor_map; /*Used when `LV_VDB_SIZE == 0` in lv_conf.h (unbuffered drawing)*/ + lv_disp_drv_register(&disp_drv); + + /* Add the mouse as input device + * Use the 'mouse' driver which reads the PC's mouse*/ + static lv_indev_drv_t indev_drv; + lv_indev_drv_init(&indev_drv); /*Basic initialization*/ + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = sdl_mouse_read; /*This function will be called periodically (by the library) to get the mouse position and state*/ + lv_indev_drv_register(&indev_drv); + + sdl_init(); + + /* Tick init. + * You have to call 'lv_tick_inc()' in periodically to inform LittelvGL about how much time were elapsed + * Create an SDL thread to do this*/ + SDL_CreateThread(tick_thread, "tick", NULL); + +} \ No newline at end of file diff --git a/Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp b/Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp index a7d564c..d7cd0db 100644 --- a/Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp +++ b/Platformio/HAL/Targets/Simulator/HardwareSimulator.hpp @@ -17,7 +17,7 @@ public: }; - virtual void init() override { lv_init(); } + virtual void init() override; virtual batteryStatus getBatteryPercentage() { batteryStatus fakeStatus; diff --git a/Platformio/src/simMain.cpp b/Platformio/src/simMain.cpp index 6055435..ca082c4 100644 --- a/Platformio/src/simMain.cpp +++ b/Platformio/src/simMain.cpp @@ -1,95 +1,17 @@ -#include -#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ -#include "SDL2/SDL.h" -#include "display/monitor.h" -#include "indev/mouse.h" -#include "indev/mousewheel.h" -#include "indev/keyboard.h" -#include "sdl/sdl.h" -#include "HardwareSimulator.hpp" +#include "HardwareSimulator.hpp" #include "omoteconfig.h" #include "OmoteUI.hpp" #include - -/** - * A task to measure the elapsed time for LittlevGL - * @param data unused - * @return never return - */ -static int tick_thread(void * data) -{ - (void)data; - - while(1) { - SDL_Delay(5); /*Sleep for 5 millisecond*/ - lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/ - } - - return 0; -} - - -void hal_setup(void) -{ - // Workaround for sdl2 `-m32` crash - // https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7 - #ifndef WIN32 - setenv("DBUS_FATAL_WARNINGS", "0", 1); - #endif - - /* Add a display - * Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/ - - static lv_disp_draw_buf_t disp_buf; - static lv_color_t buf[SDL_HOR_RES * 10]; /*Declare a buffer for 10 lines*/ - lv_disp_draw_buf_init(&disp_buf, buf, NULL, SDL_HOR_RES * 10); /*Initialize the display buffer*/ - - static lv_disp_drv_t disp_drv; - lv_disp_drv_init(&disp_drv); /*Basic initialization*/ - disp_drv.flush_cb = sdl_display_flush; /*Used when `LV_VDB_SIZE != 0` in lv_conf.h (buffered drawing)*/ - disp_drv.draw_buf = &disp_buf; - disp_drv.hor_res = SDL_HOR_RES; - disp_drv.ver_res = SDL_VER_RES; - //disp_drv.disp_fill = monitor_fill; /*Used when `LV_VDB_SIZE == 0` in lv_conf.h (unbuffered drawing)*/ - //disp_drv.disp_map = monitor_map; /*Used when `LV_VDB_SIZE == 0` in lv_conf.h (unbuffered drawing)*/ - lv_disp_drv_register(&disp_drv); - - /* Add the mouse as input device - * Use the 'mouse' driver which reads the PC's mouse*/ - static lv_indev_drv_t indev_drv; - lv_indev_drv_init(&indev_drv); /*Basic initialization*/ - indev_drv.type = LV_INDEV_TYPE_POINTER; - indev_drv.read_cb = sdl_mouse_read; /*This function will be called periodically (by the library) to get the mouse position and state*/ - lv_indev_drv_register(&indev_drv); - - sdl_init(); - - /* Tick init. - * You have to call 'lv_tick_inc()' in periodically to inform LittelvGL about how much time were elapsed - * Create an SDL thread to do this*/ - SDL_CreateThread(tick_thread, "tick", NULL); -} - -void hal_loop(void) -{ - while(1) { - - } -} - int main(){ auto hwSim = std::make_shared(); hwSim->init(); - hal_setup(); - auto ui = OmoteUI::getInstance(hwSim); ui->layout_UI(); while (true){ ui->loopHandler(); - SDL_Delay(5); lv_task_handler(); } } \ No newline at end of file From 4b41c39185897a27a6ab5a78dc32bfbe84945403 Mon Sep 17 00:00:00 2001 From: Matthew Colvin <35540398+Mc067415@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:25:06 -0500 Subject: [PATCH 8/8] ensure all targets build remove unused assets.c add new github actions that reflect new simulator --- .github/workflows/build-platformio.yml | 2 +- .github/workflows/build-simulator-windows.yml | 29 + .github/workflows/build-simulator.yml | 45 +- .../Targets/Simulator/HardwareSimulator.cpp | 1 - Platformio/platformio.ini | 28 +- Platformio/src/assets.c | 931 ------------------ 6 files changed, 59 insertions(+), 977 deletions(-) create mode 100644 .github/workflows/build-simulator-windows.yml delete mode 100644 Platformio/src/assets.c diff --git a/.github/workflows/build-platformio.yml b/.github/workflows/build-platformio.yml index bc7aec7..3e38797 100644 --- a/.github/workflows/build-platformio.yml +++ b/.github/workflows/build-platformio.yml @@ -22,4 +22,4 @@ jobs: - name: Build PlatformIO Project working-directory: ./Platformio - run: pio run + run: pio run --environment esp32 diff --git a/.github/workflows/build-simulator-windows.yml b/.github/workflows/build-simulator-windows.yml new file mode 100644 index 0000000..2fca0b7 --- /dev/null +++ b/.github/workflows/build-simulator-windows.yml @@ -0,0 +1,29 @@ +name: Windows Simulator Build + +on: [push] + +jobs: + build-windows: + runs-on: windows-latest + + steps: + - uses: msys2/setup-msys2@v2 + with: + update: true + install: >- + mingw-w64-x86_64-gcc + mingw-w64-x86_64-SDL2 + mingw-w64-x86_64-python + python3-pip + - uses: actions/checkout@v3 + + - name: Install Platform IOCore + run: pip install --upgrade platformio + + - name: Put MSYS2_MinGW64 on PATH + # there is not yet an environment variable for this path from msys2/setup-msys2 + run: echo "${{ runner.temp }}/msys64/mingw64/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Build PlatformIO Project 64 bit sim + working-directory: ./Platformio + run: pio run --environment x64_sim \ No newline at end of file diff --git a/.github/workflows/build-simulator.yml b/.github/workflows/build-simulator.yml index 58eb345..c252c54 100644 --- a/.github/workflows/build-simulator.yml +++ b/.github/workflows/build-simulator.yml @@ -1,37 +1,28 @@ -name: Simulator Build +name: Ubuntu Simulator Build on: [push] jobs: - build-x64: - - runs-on: windows-latest + build-ubuntu: + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.1 + - uses: actions/cache@v3 with: - msbuild-architecture: x64 - - # You can test your matrix by printing the current dotnet version - - name: Build - working-directory: ./LVGL Simulator - run: MSBuild.exe ./LVGL.Simulator.sln -target:Build /p:Platform="x64" - - build-x86: - - runs-on: windows-latest - - steps: - - uses: actions/checkout@v3 - - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.1 + path: | + ~/.cache/pip + ~/.platformio/.cache + key: ${{ runner.os }}-pio + - uses: actions/setup-python@v4 with: - msbuild-architecture: x86 + python-version: "3.9" + - name: Install PlatformIO Core + run: pip install --upgrade platformio - - name: Build - working-directory: ./LVGL Simulator - run: MSBuild.exe ./LVGL.Simulator.sln -target:Build /p:Platform="x86" \ No newline at end of file + - name: Install SDL2 + run : sudo apt-get update && sudo apt-get install -y libsdl2-dev + + - name: Build PlatformIO Project 64 bit sim + working-directory: ./Platformio + run: pio run --environment x64_sim \ No newline at end of file diff --git a/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp b/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp index 828c150..27f64a2 100644 --- a/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp +++ b/Platformio/HAL/Targets/Simulator/HardwareSimulator.cpp @@ -1,6 +1,5 @@ #include "HardwareSimulator.hpp" #include -#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ #include "SDL2/SDL.h" #include "display/monitor.h" #include "indev/mouse.h" diff --git a/Platformio/platformio.ini b/Platformio/platformio.ini index f8f220c..99ad813 100644 --- a/Platformio/platformio.ini +++ b/Platformio/platformio.ini @@ -38,7 +38,7 @@ monitor_speed = 115200 board_build.f_flash = 80000000L board_build.f_cpu = 240000000L upload_speed = 1000000 -lib_deps = +lib_deps = sparkfun/SparkFun LIS3DH Arduino Library@^1.0.3 crankyoldgit/IRremoteESP8266@^2.8.4 adafruit/Adafruit FT6206 Library@^1.0.6 @@ -50,8 +50,10 @@ lib_deps = SPI Keypad Preferences -build_flags = - -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG +build_flags = + ${env.build_flags} + + -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG -I include -I OmoteUI -I HAL @@ -100,21 +102,23 @@ build_flags = -D LV_DRV_NO_CONF -D USE_SDL -D SDL_HOR_RES=480 - -D SDL_VER_RES=320 + -D SDL_VER_RES=320 -D SDL_ZOOM=1 -D SDL_INCLUDE_PATH="\"SDL2/SDL.h\"" - -I include -I OmoteUI -I HAL -I HAL/Interface -I HAL/Targets/Simulator - + ; LVGL memory options, setup for the demo to run properly -D LV_MEM_CUSTOM=1 -D LV_MEM_SIZE="(128U * 1024U)" - + +debug_build_flags = + -g + lib_deps = ${env.lib_deps} ; Use direct URL, because package registry is unstable @@ -125,14 +129,4 @@ build_src_filter = +<../HAL/Targets/Simulator/*> +<../OmoteUI/*> ; Force compile LVGL demo, remove when working on your own project - -[env:x86_sim] -extends = env:x64_sim -build_flags = - ${env:x64_sim.build_flags} - -m32 -build_src_filter = - +<*> - +<../hal/sdl2> - +<../.pio/libdeps/emulator_32bits/lvgl/demos> diff --git a/Platformio/src/assets.c b/Platformio/src/assets.c deleted file mode 100644 index de493a7..0000000 --- a/Platformio/src/assets.c +++ /dev/null @@ -1,931 +0,0 @@ -#include - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_GRADIENTLEFT -#define LV_ATTRIBUTE_IMG_GRADIENTLEFT -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST - LV_ATTRIBUTE_IMG_GRADIENTLEFT uint8_t gradientLeft_map[] = { - 0xfa, 0xf2, 0xea, 0xe2, 0xda, 0xd1, 0xc7, 0xbe, 0xb7, 0xae, - 0xa6, 0x9e, 0x95, 0x8d, 0x84, 0x7d, 0x74, 0x6c, 0x62, 0x5a, - 0x51, 0x48, 0x41, 0x38, 0x2f, 0x28, 0x1f, 0x17, 0x0f, 0x07, -}; - -const lv_img_dsc_t gradientLeft = { - .header.cf = LV_IMG_CF_ALPHA_8BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 30, - .header.h = 1, - .data_size = 30, - .data = gradientLeft_map, -}; - -#ifndef LV_ATTRIBUTE_IMG_GRADIENTRIGHT -#define LV_ATTRIBUTE_IMG_GRADIENTRIGHT -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST - LV_ATTRIBUTE_IMG_GRADIENTRIGHT uint8_t gradientRight_map[] = { - 0x07, 0x0f, 0x17, 0x1f, 0x28, 0x2f, 0x38, 0x41, 0x48, 0x51, - 0x5a, 0x62, 0x6c, 0x74, 0x7d, 0x84, 0x8d, 0x95, 0x9e, 0xa6, - 0xae, 0xb7, 0xbe, 0xc7, 0xd1, 0xda, 0xe2, 0xea, 0xf2, 0xfa, -}; - -const lv_img_dsc_t gradientRight = { - .header.cf = LV_IMG_CF_ALPHA_8BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 30, - .header.h = 1, - .data_size = 30, - .data = gradientRight_map, -}; - -#ifndef LV_ATTRIBUTE_IMG_APPLETVICON -#define LV_ATTRIBUTE_IMG_APPLETVICON -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t - appleTvIcon_map[] = { - /*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x55, 0xad, - 0xdb, 0xde, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xce, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x21, 0x34, 0xa5, 0x55, 0xad, - 0x55, 0xad, 0x55, 0xad, 0x55, 0xad, 0x55, 0xad, 0x55, 0xad, 0xcf, 0x7b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0xb5, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x8c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x69, 0x4a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x7b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, - 0x65, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb6, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, - 0x8a, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, - 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0x9a, 0xd6, 0xd7, 0xbd, 0x8e, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x73, - 0xd7, 0xbd, 0xbb, 0xde, 0x3c, 0xe7, 0xfc, 0xe6, 0x39, 0xce, 0x72, 0x94, - 0xa7, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa3, 0x18, 0x8e, 0x73, 0xd7, 0xbd, 0x1c, 0xe7, 0x9e, 0xf7, 0xbe, 0xf7, - 0x5d, 0xef, 0x9a, 0xd6, 0x34, 0xa5, 0x28, 0x42, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x6b, 0xfb, 0xde, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0x7a, 0xd6, 0x71, 0x8c, 0xa6, 0x31, 0x2d, 0x6b, - 0xb6, 0xb5, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xd7, 0xbd, - 0xa3, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x9c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3c, 0xe7, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, 0xc6, 0x00, 0x00, 0x00, 0x00, - 0x69, 0x4a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0x14, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x9c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xef, 0x24, 0x21, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x45, 0x29, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x83, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x63, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0xeb, 0x5a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x9c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x84, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x14, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xde, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0x86, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x31, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xe7, 0x39, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x73, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xef, 0x86, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x8e, 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x6b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xd6, 0x3c, 0xe7, 0x3c, 0xe7, - 0x3d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, - 0x3c, 0xe7, 0x3c, 0xe7, 0x96, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x83, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x8c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0xc6, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xec, 0x62, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x71, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xbd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x73, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc5, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x31, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x63, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4d, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xbd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x9c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0xe4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x34, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x5a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x76, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xa5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x28, 0x42, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x39, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x6b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x29, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x92, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xd6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x96, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x72, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xeb, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd3, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8a, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0x28, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x45, 0x29, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x75, 0xad, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xd6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x6b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x4a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x7b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x59, 0xce, 0x86, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xa3, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa6, 0x31, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0xef, 0x7b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x14, 0xa5, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xde, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x63, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x49, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0x00, 0x00, 0x29, 0x4a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xeb, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x8c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xde, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x39, - 0xf3, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7d, 0xef, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x31, 0x29, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x9c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x9c, 0xbb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x14, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x51, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x39, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, 0xd3, 0x9c, 0x51, 0x8c, 0x34, 0xa5, - 0x9a, 0xd6, 0xdf, 0xff, 0xf7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa6, 0x31, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x62, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x79, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xe7, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x7b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x9e, 0xf7, 0xe7, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xbd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x41, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xd7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0xc6, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xd6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x51, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9e, 0xf7, 0x39, 0xce, 0x72, 0x94, 0xcb, 0x5a, 0xa3, 0x18, 0x4d, 0x6b, - 0x34, 0xa5, 0xfb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbe, 0xf7, 0x72, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xaf, 0x7b, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7d, 0xef, 0xd7, 0xbd, 0xeb, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6e, 0x73, 0xf8, 0xc5, 0xba, 0xd6, 0xd7, 0xbd, - 0xf0, 0x83, 0xa3, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x4a, 0xf3, 0x9c, 0xf8, 0xc5, - 0x59, 0xce, 0x55, 0xad, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x73, - 0x76, 0xb5, 0x39, 0xce, 0x7a, 0xd6, 0x39, 0xce, 0xd7, 0xbd, 0xd3, 0x9c, - 0xec, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x4a, 0x0c, 0x63, - 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, - 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -const lv_img_dsc_t appleTvIcon = { - .header.cf = LV_IMG_CF_TRUE_COLOR, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 91, - .header.h = 42, - .data_size = 3822 * LV_COLOR_SIZE / 8, - .data = appleTvIcon_map, -}; - -#ifndef LV_ATTRIBUTE_IMG_APPLEDISPLAYICON -#define LV_ATTRIBUTE_IMG_APPLEDISPLAYICON -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t - appleDisplayIcon_map[] = { - 0x23, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x3d, 0xaa, 0xfd, 0xad, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0xa1, - 0xf7, 0xd8, 0xd0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa1, 0xff, 0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9a, 0xff, 0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9a, 0xff, 0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff, 0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff, 0xd2, 0xcb, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff, 0xd2, 0xcb, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff, 0xd2, 0xcb, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff, 0xd2, 0xcb, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff, 0xd2, - 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff, - 0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, - 0xff, 0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9a, 0xff, 0xc6, 0xea, 0x2a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, - 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, - 0x1f, 0xcc, 0xf6, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x98, 0x00, 0x44, 0x7b, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x7d, 0x56, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x13, 0xb7, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc0, - 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x19, 0xd3, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, - 0xdb, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -const lv_img_dsc_t appleDisplayIcon = { - .header.cf = LV_IMG_CF_ALPHA_8BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 25, - .header.h = 20, - .data_size = 500, - .data = appleDisplayIcon_map, -}; - -#ifndef LV_ATTRIBUTE_IMG_APPLEBACKICON -#define LV_ATTRIBUTE_IMG_APPLEBACKICON -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST - LV_ATTRIBUTE_IMG_APPLEBACKICON uint8_t appleBackIcon_map[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x0f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3d, 0xbe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3b, 0xe7, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3b, 0xfa, 0xff, 0xf5, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0xfc, 0xff, 0xea, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4d, 0xee, 0xff, 0xe6, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x50, 0xed, 0xff, 0xe9, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x55, 0xfc, 0xff, 0xe7, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x59, 0xff, 0xff, 0xe0, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5e, 0xf6, 0xff, 0xdb, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x64, 0xf4, 0xff, 0xd9, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4d, 0xff, 0xff, 0xce, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6b, 0xff, 0xff, 0x9e, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9c, 0xff, 0xff, 0xa8, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x8f, 0xff, 0xff, 0xb5, 0x17, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x91, 0xff, 0xff, 0xba, 0x12, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xff, 0xff, - 0xbb, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, - 0xfc, 0xff, 0xbf, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7c, 0xfb, 0xff, 0xc5, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x78, 0xff, 0xff, 0xca, 0x1e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xff, 0xff, 0xd0, 0x11, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6e, 0xfb, 0xff, 0xcc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xea, 0xca, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x28, - 0x18, -}; - -const lv_img_dsc_t appleBackIcon = { - .header.cf = LV_IMG_CF_ALPHA_8BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 13, - .header.h = 25, - .data_size = 325, - .data = appleBackIcon_map, -}; - -#ifndef LV_ATTRIBUTE_IMG_HIGH_BRIGHTNESS -#define LV_ATTRIBUTE_IMG_HIGH_BRIGHTNESS -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST - LV_ATTRIBUTE_IMG_HIGH_BRIGHTNESS uint8_t high_brightness_map[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xd4, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5c, 0x8e, 0x04, 0x00, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, - 0x00, 0x04, 0x8e, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0xa8, 0x01, - 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x01, 0xa8, 0xff, 0x8c, 0x00, 0x00, - 0x00, 0x00, 0x04, 0xa9, 0xf5, 0x0d, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, - 0x0d, 0xf5, 0xa9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, - 0x42, 0xd4, 0xff, 0xff, 0xd4, 0x41, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xbd, 0xcc, 0xbd, 0x0d, 0x11, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x12, 0x0d, 0xbd, 0xcc, 0xbd, 0xbd, 0xcc, 0xbd, 0x0d, 0x11, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0d, 0xbd, 0xcc, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x40, 0xd3, 0xff, 0xfe, 0xd2, 0x3f, - 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xa9, 0xf5, 0x0d, - 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0d, 0xf5, 0xa9, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x8c, 0xff, 0xa8, 0x01, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, - 0x01, 0xa8, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x8e, 0x04, 0x00, - 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x04, 0x8e, 0x5c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -const lv_img_dsc_t high_brightness = { - .header.cf = LV_IMG_CF_ALPHA_8BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 18, - .header.h = 18, - .data_size = 324, - .data = high_brightness_map, -}; - -#ifndef LV_ATTRIBUTE_IMG_LOW_BRIGHTNESS -#define LV_ATTRIBUTE_IMG_LOW_BRIGHTNESS -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST - LV_ATTRIBUTE_IMG_LOW_BRIGHTNESS uint8_t low_brightness_map[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x43, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, - 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x72, - 0x01, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x01, 0x72, 0x28, 0x00, 0x00, - 0x00, 0x00, 0x71, 0xf5, 0x0f, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x0d, - 0xf5, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x42, 0xd4, 0xff, - 0xff, 0xd4, 0x41, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x42, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x00, 0x00, 0x00, 0x00, 0x43, 0xbd, 0x0d, 0x11, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x12, 0x0d, 0xbc, 0x44, 0x43, 0xbd, 0x0d, 0x11, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x11, 0x0d, 0xbc, 0x44, - 0x00, 0x00, 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0b, - 0x00, 0x40, 0xd3, 0xfe, 0xff, 0xd2, 0x3f, 0x00, 0x0a, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x71, 0xf5, 0x0f, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0d, - 0xf5, 0x73, 0x00, 0x00, 0x00, 0x00, 0x27, 0x72, 0x01, 0x00, 0x00, 0x0c, - 0x0c, 0x00, 0x00, 0x01, 0x72, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xbd, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; - -const lv_img_dsc_t low_brightness = { - .header.cf = LV_IMG_CF_ALPHA_8BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 16, - .header.h = 16, - .data_size = 256, - .data = low_brightness_map, -}; - -#ifndef LV_ATTRIBUTE_IMG_LIGHTBULB -#define LV_ATTRIBUTE_IMG_LIGHTBULB -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LIGHTBULB - uint8_t lightbulb_map[] = { - 0x00, 0x00, 0x00, 0x00, 0x04, 0x1c, 0x1c, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x16, 0x95, 0xee, 0xff, 0xff, 0xee, 0x94, 0x15, 0x00, 0x00, - 0x00, 0x27, 0xe3, 0xff, 0xcc, 0x8d, 0x8d, 0xcd, 0xff, 0xe1, 0x26, 0x00, - 0x07, 0xd9, 0xfa, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xfa, 0xd7, 0x06, - 0x65, 0xff, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xff, 0x63, - 0xb1, 0xf8, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf8, 0xaf, - 0xcc, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xcd, - 0xb1, 0xf5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xf1, 0xbd, - 0x73, 0xff, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xff, 0x74, - 0x0b, 0xd5, 0xfb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0xfb, 0xd9, 0x0b, - 0x00, 0x24, 0xef, 0xdc, 0x01, 0x00, 0x00, 0x01, 0xdd, 0xee, 0x24, 0x00, - 0x00, 0x00, 0x83, 0xff, 0x30, 0x00, 0x00, 0x30, 0xff, 0x81, 0x00, 0x00, - 0x00, 0x00, 0x12, 0x6c, 0x06, 0x00, 0x00, 0x06, 0x6c, 0x12, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x25, 0xc7, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0x25, 0x00, 0x00, - 0x00, 0x00, 0x25, 0xc7, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0x25, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1c, 0x76, 0x77, 0x77, 0x76, 0x1c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x69, 0xff, 0xff, 0xff, 0xff, 0x69, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x21, 0x22, 0x22, 0x21, 0x01, 0x00, 0x00, 0x00, -}; - -const lv_img_dsc_t lightbulb = { - .header.cf = LV_IMG_CF_ALPHA_8BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 12, - .header.h = 20, - .data_size = 240, - .data = lightbulb_map, -}; \ No newline at end of file