diff --git a/.gitignore b/.gitignore
index 127d4495..cc2655e9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,6 @@
assets
tools/*.raw
tools/*.png
+features.json
+tile_generator.py
+tile_viewer.py
diff --git a/README.md b/README.md
index 1139f5f1..e0d78637 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ ESP32 Based GPS Navigator (LVGL - LovyanGFX).
## Screenshots
-|
|
|
|
|
+|
|
|
|
|
|:-:|:-:|:-:|:-:|
See more...
@@ -148,43 +148,29 @@ On SD Card map tiles (256x256 PNG Format) should be stored, in these folders str
|__________________ [ π tile X folder (number) ]
|_______________________ πΊοΈ tile Y file.png
-## SD Vectorized Map File structure
+## SD Vectorized Map File structure
-Using [OSM_Extract](https://github.com/aresta/OSM_Extract) you can generate binary map files to later create vector maps. Once generated, these files should be saved in the `mymap` folder on the SD card.
+Vectorized maps for IceNav can be generated using the Tile-Generator utility, which is available on GitHub at [jgauchia/Tile-Generator](https://github.com/jgauchia/Tile-Generator). This script allows you to convert map data into the required vector tile format compatible with IceNav. Please refer to the Tile-Generator repository for detailed instructions and usage examples on generating and preparing your own vector map files.
-The PBF files can be downloaded from the [geofabrik](https://download.geofabrik.de/) website.
+ [ π VECTMAP ]
+ |________ [ π zoom folder (number) ]
+ |__________________ [ π tile X folder (number) ]
+ |_______________________ πΊοΈ tile Y file.bin
-The PBF files should be saved in the `pbf` directory. Once saved, you should select the region or boundaries for which the GeoJSON files will be generated.
+## Mass Copy Script for Map Tiles
-To obtain the boundaries use `osmconvert file.pbf --out-statistics`:
-```
-lon min: -5.5203154
-lon max: 11.7825360
-lat min: 35.2703341
-lat max: 44.4078541
-```
-
-or use [Bboxfinder](http://bboxfinder.com/) website drawing a box on desired area.
-
-
-For generate GeoJSON files run inside `scripts` directory:
+For efficient transfer of millions of map tiles to SD cards or external storage devices, IceNav includes a high-performance mass copy script. This script is optimized for copying large numbers of small files (such as map tiles) and can reduce transfer time from hours to minutes.
-```bash
-min_lon=123
-min_lat=123
-max_lon=123
-max_lat=123
-
-./pbf_to_geojson.sh $min_lon $min_lat $max_lon $max_lat /pbf/clipped.pbf /maps/test
-```
+**Key features:**
+- β
**Optimized for millions of small files** - Much faster than traditional copy methods
+- β
**Real-time progress monitoring** - See exactly what's being copied
+- β
**Resumable transfers** - Continue interrupted copies
+- β
**Built-in integrity verification** - Sample file verification
+- β
**Performance metrics** - Speed and time statistics
-For generate binary map files run inside `scripts` directory.
-```bash
-./extract_features.py $min_lon $min_lat $max_lon $max_lat /maps/test
-```
-Once the process is completed, the maps will be inside the `maps/mymap` directory. Copy all folders to the SD card except the `test_imgs` directory into `VECTMAP` folder of the SD Card.
+For detailed instructions on how to use the mass copy script, please refer to the [Mass Copy Tools Documentation](tools/mass_copy/README.md).
-Please follow the instructions provided by [OSM_Extract](https://github.com/aresta/OSM_Extract) for any further questions.
+Download link: [tools/mass_copy/rsync_copy.sh](tools/mass_copy/rsync_copy.sh)
## Firmware install
@@ -244,7 +230,7 @@ Please follow the instructions provided by [OSM_Extract](https://github.com/ares
## CLI
-IceNav has a basic CLI accessible via Serial and optionally via Telnet if enabled. When you access the CLI and type `help`, you should see the following commands:
+IceNav has a basic CLI accessible via Serial and optionally via Telnet if enabled (port 11000). When you access the CLI and type `help`, you should see the following commands:
```bash
clear: clear shell
@@ -268,12 +254,13 @@ Some extra details:
KEYNAME DEFINED VALUE
======= ======= =====
defZoom custom 17 Default zoom
- fullScrMap custom true Fullscreen map
vectMap custom false Vectorized map
mapSpeed custom true Show speed meter in map
mapScale custom true Show scale meter in map
mapComp custom true Show compass in map
mapCompRot custom true Rotate map with the compass
+ simNav custom false Indicates whether navigation simulation mode is enabled or disabled
+ fillPoly custom true Fill polygons in vectorized map
gpsTX custom 43 GPS Tx gpio
gpsRX custom 44 GPS Rx gpio
defLAT custom 52.5200 Default latitude
@@ -338,8 +325,8 @@ To access the Web File Server, simply use any browser and go to the following ad
- [ ] Multiple IMU's and Compass module implementation
- [X] Power saving
- [X] Vector maps
-- [ ] Google Maps navigation style (turn by turn)
-- [x] Optimize code
+- [X] Google Maps navigation style (turn by turn)
+- [X] Optimize code
- [X] Fix bugs!
- [X] Web file server
@@ -360,8 +347,6 @@ To access the Web File Server, simply use any browser and go to the following ad
* Improved auto mainScreen selection from env variable preset thanks to [@hpsaturn](https://github.com/hpsaturn)
* Improved getLat getLon from environment variables thanks to [@hpsaturn](https://github.com/hpsaturn)
* 3DPrint case for an ESP32S3 Makerfabs Parallel board thanks to [@hpsaturn](https://github.com/hpsaturn)
-* Vectorial Maps routines [ESP32_GPS](https://github.com/aresta/ESP32_GPS) thanks to [@aresta](https://github.com/aresta)
-* OSM to binary vectorial maps [OSM_Extract](https://github.com/aresta/OSM_Extract) thanks to [@aresta](https://github.com/aresta)
* Preferences Library [Easy Preferences](https://github.com/hpsaturn/easy-preferences) thanks to [@hpsaturn](https://github.com/hpsaturn)
* Wifi CLI manager [esp32-wifi-cli](https://github.com/hpsaturn/esp32-wifi-cli) thanks to [@hpsaturn](https://github.com/hpsaturn)
* Web file server based in [@smford](https://github.com/smford) [esp32-asyncwebserver-fileupload-example](https://github.com/smford/esp32-asyncwebserver-fileupload-example)
diff --git a/data/TODO.png b/data/TODO.png
deleted file mode 100644
index 2da8ccc3..00000000
Binary files a/data/TODO.png and /dev/null differ
diff --git a/data/mapspeed.bin b/data/mapspeed.bin
new file mode 100755
index 00000000..844eca46
Binary files /dev/null and b/data/mapspeed.bin differ
diff --git a/data/navarrow.bin b/data/navarrow.bin
new file mode 100755
index 00000000..677d2b09
Binary files /dev/null and b/data/navarrow.bin differ
diff --git a/data/zoom.bin b/data/zoom.bin
new file mode 100755
index 00000000..b1e67c12
Binary files /dev/null and b/data/zoom.bin differ
diff --git a/data/zoomin.bin b/data/zoomin.bin
new file mode 100644
index 00000000..46c460bc
Binary files /dev/null and b/data/zoomin.bin differ
diff --git a/data/zoomout.bin b/data/zoomout.bin
new file mode 100644
index 00000000..58edd518
Binary files /dev/null and b/data/zoomout.bin differ
diff --git a/images/dev/mapnav.jpg b/images/dev/mapnav.jpg
new file mode 100644
index 00000000..1b638852
Binary files /dev/null and b/images/dev/mapnav.jpg differ
diff --git a/images/dev/mapsettings.jpg b/images/dev/mapsettings.jpg
index 54df554a..5d739f37 100644
Binary files a/images/dev/mapsettings.jpg and b/images/dev/mapsettings.jpg differ
diff --git a/images/dev/rendermap.jpg b/images/dev/rendermap.jpg
index 8ffe6743..c848b191 100644
Binary files a/images/dev/rendermap.jpg and b/images/dev/rendermap.jpg differ
diff --git a/images/dev/vectormap.jpg b/images/dev/vectormap.jpg
index 7d4d2ca6..ea60b312 100644
Binary files a/images/dev/vectormap.jpg and b/images/dev/vectormap.jpg differ
diff --git a/include/hal.hpp b/include/hal.hpp
index df4bfc4a..829277db 100644
--- a/include/hal.hpp
+++ b/include/hal.hpp
@@ -2,8 +2,8 @@
* @file hal.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief Boards Pin definitions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -122,7 +122,7 @@
extern const uint8_t TCH_I2C_PORT = 0;
extern const uint8_t TCH_I2C_SDA = GPIO_NUM_38;
extern const uint8_t TCH_I2C_SCL = GPIO_NUM_39;
- extern const uint8_t TCH_I2C_INT = GPIO_NUM_40;
+ extern const uint8_t TCH_I2C_INT = -1;
extern const uint8_t SD_CS = GPIO_NUM_4;
extern const uint8_t SD_MISO = GPIO_NUM_19;
diff --git a/lib/battery/battery.cpp b/lib/battery/battery.cpp
index 7ab7cbd2..58c2e8c0 100644
--- a/lib/battery/battery.cpp
+++ b/lib/battery/battery.cpp
@@ -2,82 +2,88 @@
* @file battery.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief Battery monitor definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
-
#include "battery.hpp"
/**
- * @brief Battery Class constructor
- *
+ * @brief Constructs a Battery monitoring object for voltage measurement and percentage calculation.
*/
Battery::Battery() {}
/**
- * @brief Configure ADC Channel for battery reading
+ * @brief Initializes the ADC channel(s) required for battery voltage measurement.
*
+ * @details Configures the hardware ADC based on the ESP32 chip (ADC1 or ADC2).
*/
void Battery::initADC()
{
#ifdef ADC1
- adc1_config_width(ADC_WIDTH_BIT_12);
- adc1_config_channel_atten(BATT_PIN, ADC_ATTEN_DB_12);
+ adc1_config_width(ADC_WIDTH_BIT_12);
+ adc1_config_channel_atten(BATT_PIN, ADC_ATTEN_DB_12);
#endif
#ifdef ADC2
- adc2_config_channel_atten(BATT_PIN, ADC_ATTEN_DB_12);
+ adc2_config_channel_atten(BATT_PIN, ADC_ATTEN_DB_12);
#endif
}
/**
- * @brief Set battery voltage levels
+ * @brief Sets the maximum and minimum voltage levels for battery charge calculation.
*
- * @param maxVoltage -> Full Charge voltage
- * @param minVoltage -> Min Charge voltage
+ * @param maxVoltage Voltage considered as fully charged.
+ * @param minVoltage Voltage considered as minimum safe level.
*/
void Battery::setBatteryLevels(float maxVoltage, float minVoltage)
{
- batteryMax = maxVoltage;
- batteryMin = minVoltage;
+ batteryMax = maxVoltage;
+ batteryMin = minVoltage;
}
/**
- * @brief Read battery charge and return %.
+ * @brief Reads and computes the current battery charge as a percentage.
+ *
+ * @details Takes 100 ADC samples, averages them, compensates for the voltage divider, and calculates the charge percentage.
+ * Returns a value between 0 and 100 (values above 160 are treated as 0).
*
- * @return float -> % Charge
+ * @return float Percentage of battery charge (0β100% typically).
*/
float Battery::readBattery()
{
- long sum = 0; // Sum of samples taken
- float voltage = 0.0; // Calculated voltage
- float output = 0.0; // Output value
+ int32_t sum = 0; /**< Accumulator for ADC samples. */
+ constexpr int samples = 100; /**< Number of ADC samples. */
+ constexpr float invSamples = 1.0f / samples; /**< Precomputed inverse for averaging. */
+
+ /**< Collect ADC samples */
+ for (int i = 0; i < samples; ++i)
+ {
+ #ifdef ADC1
+ sum += static_cast(adc1_get_raw(BATT_PIN));
+ #endif
+
+ #ifdef ADC2
+ int readRaw;
+ if (adc2_get_raw(BATT_PIN, ADC_WIDTH_BIT_12, &readRaw) == ESP_OK)
+ sum += static_cast(readRaw);
+ #endif
+
+ ets_delay_us(100); /**< Slightly reduced delay for better responsiveness. */
+ }
- for (int i = 0; i < 100; i++)
- {
- #ifdef ADC1
- sum += static_cast(adc1_get_raw(BATT_PIN));
- #endif
+ /**< Convert ADC value to voltage */
+ float voltage = (sum * invSamples) * (V_REF / 4096.0f); /**< Averaged and scaled ADC voltage. */
- #ifdef ADC2
- int readRaw;
- esp_err_t r = adc2_get_raw(BATT_PIN, ADC_WIDTH_BIT_12, &readRaw);
- if (r == ESP_OK)
- sum += static_cast(readRaw);
- #endif
+ /**< Compensate for voltage divider (R1 = R2 = 100kΞ©) */
+ voltage *= 2.0f;
- delayMicroseconds(150);
- }
+ /**< Round to 2 decimal places */
+ voltage = roundf(voltage * 100.0f) * 0.01f;
- voltage = sum / 100.0;
- // Custom board has a divider circuit
- constexpr float R1 = 100000.0; // Resistance of R1 (100K)
- constexpr float R2 = 100000.0; // Resistance of R2 (100K)
- voltage = (voltage * V_REF) / 4096.0;
- voltage = voltage / (R2 / (R1 + R2));
- voltage = roundf(voltage * 100) / 100;
+ /**< Calculate battery percentage */
+ float output = ((voltage - batteryMin) / (batteryMax - batteryMin)) * 100.0f;
- output = ((voltage - batteryMin) / (batteryMax - batteryMin)) * 100;
- return (output <= 160) ? output : 0.0f;
+ /**< Clamp out-of-range values */
+ return (output <= 160.0f) ? output : 0.0f;
}
diff --git a/lib/battery/battery.hpp b/lib/battery/battery.hpp
index 670bde78..d86cc6b9 100644
--- a/lib/battery/battery.hpp
+++ b/lib/battery/battery.hpp
@@ -2,8 +2,8 @@
* @file battery.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief Battery monitor definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -12,17 +12,24 @@
#include
#include
+
+/**
+ * @class Battery
+ * @brief Provides battery voltage monitoring and charge estimation.
+ *
+ * @details Handles ADC initialization, voltage range configuration, and computes battery charge percentage.
+ */
class Battery
{
private:
- float batteryMax;
- float batteryMin;
- static constexpr float V_REF = 3.9; // ADC reference voltage
+ float batteryMax; /**< Maximum (full charge) voltage. */
+ float batteryMin; /**< Minimum (empty) voltage. */
+ static constexpr float V_REF = 3.9; /**< ADC reference voltage. */
public:
- Battery();
+ Battery();
- void initADC();
- void setBatteryLevels(float maxVoltage, float minVoltage);
- float readBattery();
+ void initADC();
+ void setBatteryLevels(float maxVoltage, float minVoltage);
+ float readBattery();
};
\ No newline at end of file
diff --git a/lib/bme/bme.cpp b/lib/bme/bme.cpp
index 3848704a..6140f3eb 100644
--- a/lib/bme/bme.cpp
+++ b/lib/bme/bme.cpp
@@ -2,8 +2,8 @@
* @file bme.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief BME280 Sensor functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "bme.hpp"
@@ -12,16 +12,13 @@
Adafruit_BME280 bme = Adafruit_BME280();
-/**
- * @brief Temperature reading values
- *
- */
-uint8_t tempValue = 0;
-uint8_t tempOld = 0;
+uint8_t tempValue = 0; /**< Stores the current temperature value from the BME280 sensor. */
+uint8_t tempOld = 0; /**< Stores the previous temperature value for comparison. */
/**
- * @brief Init BME sensor
+ * @brief Initializes the BME280 sensor and sets up I2C communication.
*
+ * @details Optionally allows advanced configuration for oversampling and filtering.
*/
void initBME()
{
diff --git a/lib/bme/bme.hpp b/lib/bme/bme.hpp
index 06f9debb..72926cd1 100644
--- a/lib/bme/bme.hpp
+++ b/lib/bme/bme.hpp
@@ -2,8 +2,8 @@
* @file bme.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief BME280 Sensor functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -15,15 +15,10 @@
#include
#include
-/**
- * @brief BME280 Address
- *
- */
-#define BME_ADDRESS 0x76
-
-extern Adafruit_BME280 bme;
-extern uint8_t tempValue;
-extern uint8_t tempOld;
+#define BME_ADDRESS 0x76 /**< I2C address for the BME280 sensor (default: 0x76). */
+extern Adafruit_BME280 bme; /**< Global instance of the BME280 sensor driver. */
+extern uint8_t tempValue; /**< Stores the latest temperature reading from the BME280 sensor. */
+extern uint8_t tempOld; /**< Stores the previous temperature value to detect changes. */
void initBME();
diff --git a/lib/cli/cli.cpp b/lib/cli/cli.cpp
index 791bd681..cd538d8d 100644
--- a/lib/cli/cli.cpp
+++ b/lib/cli/cli.cpp
@@ -3,7 +3,7 @@
* @author @Hpsaturn
* @brief Network CLI and custom internal commands
* @version Using https://github.com/hpsaturn/esp32-wifi-cli.git
- * @date 2025-05
+ * @date 2025-06
*/
#ifndef DISABLE_CLI
@@ -27,234 +27,261 @@ static const char* TAG PROGMEM = "CLI";
extern Power power;
/**
- * @brief Reboot ESP
+ * @brief Reboots the ESP device.
+ *
+ * @details CLI command: reboot
*/
void wcli_reboot(char *args, Stream *response)
{
- ESP.restart();
+ ESP.restart();
}
/**
- * @brief ESP Deep Sleep/shutdown
+ * @brief Puts ESP device into deep sleep (shutdown).
+ *
+ * CLI command: poweroff
*/
void wcli_poweroff(char *args, Stream *response)
{
- power.deviceShutdown();
+ power.deviceShutdown();
}
/**
- * @brief Display device info
+ * @brief Displays device information such as memory, SPIFFS, PSRAM, flash, and GPS parameters.
+ *
+ * @details CLI command: info
*/
void wcli_info(char *args, Stream *response)
{
- setlocale(LC_NUMERIC, "");
- size_t totalSPIFFS, usedSPIFFS, freeSPIFFS = 0;
- esp_spiffs_info(NULL, &totalSPIFFS, &usedSPIFFS);
- freeSPIFFS = totalSPIFFS - usedSPIFFS;
+ setlocale(LC_NUMERIC, "");
+ size_t totalSPIFFS, usedSPIFFS, freeSPIFFS = 0;
+ esp_spiffs_info(NULL, &totalSPIFFS, &usedSPIFFS);
+ freeSPIFFS = totalSPIFFS - usedSPIFFS;
- response->println();
- wcli.status(response);
- response->printf("Total Memory\t: %3.0iKb\r\n",ESP.getHeapSize()/1000);
- response->printf("SPIFFS total\t: %u bytes\r\n", totalSPIFFS);
- response->printf("SPIFFS used\t: %u bytes\r\n", usedSPIFFS);
- response->printf("SPIFFS free\t: %u bytes\r\n", freeSPIFFS);
- if (psramFound())
- {
- response->printf("PSRAM total\t: %u bytes\r\n", ESP.getPsramSize());
- response->printf("PSRAM used\t: %u bytes\r\n", ESP.getPsramSize()-ESP.getFreePsram());
- response->printf("PSRAM free\t: %u bytes\r\n", ESP.getFreePsram());
- }
- response->printf("Flash size\t: %u bytes\r\n", ESP.getFlashChipSize());
- response->printf("Program size\t: %u bytes\r\n", ESP.getSketchSize());
- if (enableWeb)
- response->println("Web file server\t: \033[1;32menabled\033[0;37m");
- else
- response->println("Web file server\t: \033[1;31mdisabled\033[0;37m");
- response->printf("\r\n");
- response->printf("GPS Baud rate\t: %i baud\r\n",gpsBaudDetected);
- response->printf("GPS Tx GPIO:\t: %i\r\n",GPS_TX);
- response->printf("GPS Rx GPIO:\t: %i\r\n",GPS_RX);
+ response->println();
+ wcli.status(response);
+ response->printf("Total Memory\t: %3.0iKb\r\n",ESP.getHeapSize()/1000);
+ response->printf("SPIFFS total\t: %u bytes\r\n", totalSPIFFS);
+ response->printf("SPIFFS used\t: %u bytes\r\n", usedSPIFFS);
+ response->printf("SPIFFS free\t: %u bytes\r\n", freeSPIFFS);
+ if (psramFound())
+ {
+ response->printf("PSRAM total\t: %u bytes\r\n", ESP.getPsramSize());
+ response->printf("PSRAM used\t: %u bytes\r\n", ESP.getPsramSize()-ESP.getFreePsram());
+ response->printf("PSRAM free\t: %u bytes\r\n", ESP.getFreePsram());
+ }
+ response->printf("Flash size\t: %u bytes\r\n", ESP.getFlashChipSize());
+ response->printf("Program size\t: %u bytes\r\n", ESP.getSketchSize());
+ if (enableWeb)
+ response->println("Web file server\t: \033[1;32menabled\033[0;37m");
+ else
+ response->println("Web file server\t: \033[1;31mdisabled\033[0;37m");
+ response->printf("\r\n");
+ response->printf("GPS Baud rate\t: %i baud\r\n",gpsBaudDetected);
+ response->printf("GPS Tx GPIO:\t: %i\r\n",GPS_TX);
+ response->printf("GPS Rx GPIO:\t: %i\r\n",GPS_RX);
}
/**
- * @brief Clear user settings
+ * @brief Clears all user settings and resets device to factory defaults.
+ *
+ * @details CLI command: wipe
*/
void wcli_swipe(char *args, Stream *response)
{
- Pair operands = wcli.parseCommand(args);
- String deviceId = operands.first();
- response->println("Clearing device to defaults..");
- wcli.clearSettings();
- cfg.clear();
- response->println("done");
+ Pair operands = wcli.parseCommand(args);
+ String deviceId = operands.first();
+ response->println("Clearing device to defaults..");
+ wcli.clearSettings();
+ cfg.clear();
+ response->println("done");
}
/**
- * @brief Clear CLI console
+ * @brief Clears the CLI console.
+ *
+ * @details CLI command: clear
*/
void wcli_clear(char *args, Stream *response)
{
- wcli.shell->clear();
+ wcli.shell->clear();
}
/**
- * @brief Take a screenshot
+ * @brief Captures a screenshot to SD card or sends it to a PC over WiFi.
+ *
+ * @details CLI command: scshot
*/
void wcli_scshot(char *args, Stream *response)
{
- Pair operands = wcli.parseCommand(args);
- String ip = operands.first();
- uint16_t port = operands.second().toInt();
-
- if (ip.isEmpty())
- {
- response->println("Saving to SD..");
+ Pair operands = wcli.parseCommand(args);
+ String ip = operands.first();
+ uint16_t port = operands.second().toInt();
+
+ if (ip.isEmpty())
+ {
+ response->println("Saving to SD..");
- waitScreenRefresh = true;
- captureScreenshot(SCREENSHOT_TEMP_FILE, response);
- waitScreenRefresh = false;
-
- response->println("Note: is possible to send it to a PC using: scshot ip port");
- }
- else
- {
- if (!WiFi.isConnected())
- {
- response->println("Please connect your WiFi first!");
- return;
- }
- response->printf("Sending screenshot to %s:%i..\r\n", ip.c_str(), port);
+ waitScreenRefresh = true;
+ captureScreenshot(SCREENSHOT_TEMP_FILE, response);
+ waitScreenRefresh = false;
+
+ response->println("Note: is possible to send it to a PC using: scshot ip port");
+ }
+ else
+ {
+ if (!WiFi.isConnected())
+ {
+ response->println("Please connect your WiFi first!");
+ return;
+ }
+ response->printf("Sending screenshot to %s:%i..\r\n", ip.c_str(), port);
- waitScreenRefresh = true;
- captureScreenshot(SCREENSHOT_TEMP_FILE, ip.c_str(), port, response);
- waitScreenRefresh = false;
- }
+ waitScreenRefresh = true;
+ captureScreenshot(SCREENSHOT_TEMP_FILE, ip.c_str(), port, response);
+ waitScreenRefresh = false;
+ }
}
/**
- * @brief list of user preference key. This depends of EasyPreferences manifest.
- * @author @Hpsaturn. Method migrated from CanAirIO project
+ * @brief Lists user preference keys and their values.
+ * @author @Hpsaturn. Method migrated from CanAirIO project
+ *
+ * @details Shows only basic keys unless 'all' is specified.
+ *
+ * @details CLI command: klist
*/
void wcli_klist(char *args, Stream *response)
{
- Pair operands = wcli.parseCommand(args);
- String opt = operands.first();
- int key_count = PKEYS::KUSER+1;
- if (opt.equals("all")) key_count = 0; // Only show the basic keys to configure
- response->printf("\n%11s \t%s \t%s \r\n", "KEYNAME", "DEFINED", "VALUE");
- response->printf("\n%11s \t%s \t%s \r\n", "=======", "=======", "=====");
+ Pair operands = wcli.parseCommand(args);
+ String opt = operands.first();
+ int key_count = PKEYS::KUSER+1;
+ if (opt.equals("all")) key_count = 0; // Only show the basic keys to configure
+ response->printf("\n%11s \t%s \t%s \r\n", "KEYNAME", "DEFINED", "VALUE");
+ response->printf("\n%11s \t%s \t%s \r\n", "=======", "=======", "=====");
- for (int i = key_count; i < PKEYS::KCOUNT; i++)
- {
- if (i == PKEYS::KUSER) continue;
- String key = cfg.getKey((CONFKEYS)i);
- bool isDefined = cfg.isKey(key);
- String defined = isDefined ? "custom " : "default";
- String value = "";
- if (isDefined) value = cfg.getValue(key);
- response->printf("%11s \t%s \t%s \r\n", key, defined.c_str(), value.c_str());
- }
+ for (int i = key_count; i < PKEYS::KCOUNT; i++)
+ {
+ if (i == PKEYS::KUSER) continue;
+ String key = cfg.getKey((CONFKEYS)i);
+ bool isDefined = cfg.isKey(key);
+ String defined = isDefined ? "custom " : "default";
+ String value = "";
+ if (isDefined) value = cfg.getValue(key);
+ response->printf("%11s \t%s \t%s \r\n", key, defined.c_str(), value.c_str());
+ }
}
/**
- * @brief set an user preference key. This depends of EasyPreferences manifest.
+ * @brief Sets a user preference key to a given value.
* @author @Hpsaturn. Method migrated from CanAirIO project
+ *
+ * @details CLI command: kset
*/
void wcli_kset(char *args, Stream *response)
{
- Pair operands = wcli.parseCommand(args);
- String key = operands.first();
- String v = operands.second();
- if (cfg.saveAuto(key,v))
- response->printf("saved key %s\t: %s\r\n", key, v);
+ Pair operands = wcli.parseCommand(args);
+ String key = operands.first();
+ String v = operands.second();
+ if (cfg.saveAuto(key,v))
+ response->printf("saved key %s\t: %s\r\n", key, v);
}
-
/**
- * @brief Output NMEA sentences in CLI
+ * @brief Toggles outputting NMEA sentences in the CLI.
+ *
+ * @details CLI command: outnmea
*/
void wcli_outnmea(char *args, Stream *response)
{
- nmea_output_enable = !nmea_output_enable;
+ nmea_output_enable = !nmea_output_enable;
}
/**
- * @brief Cancel NMEA Output
+ * @brief Cancels NMEA output (Ctrl+C handler).
*/
void wcli_abort_handler()
{
- if (nmea_output_enable)
- {
- nmea_output_enable = false;
- delay(100);
- Serial.println("\r\nCancel NMEA output!");
- }
+ if (nmea_output_enable)
+ {
+ nmea_output_enable = false;
+ delay(100);
+ Serial.println("\r\nCancel NMEA output!");
+ }
}
/**
- * @brief Webfile server enable/disable option
+ * @brief Enables or disables the Web file server.
+ *
+ * @details CLI command: webfile
*/
void wcli_webfile(char *args, Stream *response)
{
- Pair operands = wcli.parseCommand(args);
- String commands = operands.first();
+ Pair operands = wcli.parseCommand(args);
+ String commands = operands.first();
- if (commands.isEmpty())
- response->println(F("missing parameter use: webfile \033[1;32menable/disable\033[0;37m"));
- else
- {
- if(commands.equals("enable"))
- {
- cfg.saveBool(PKEYS::KWEB_FILE, true);
- response->println("");
- response->printf("Web file server \033[1;32menabled\033[0;37m\r\n");
- response->println("Please reboot device");
- }
- if(commands.equals("disable"))
- {
- cfg.saveBool(PKEYS::KWEB_FILE, false);
- response->println("");
- response->printf("Web file server \033[1;32mdisabled\033[0;37m\r\n");
- response->println("Please reboot device");
- }
- }
+ if (commands.isEmpty())
+ response->println(F("missing parameter use: webfile \033[1;32menable/disable\033[0;37m"));
+ else
+ {
+ if(commands.equals("enable"))
+ {
+ cfg.saveBool(PKEYS::KWEB_FILE, true);
+ response->println("");
+ response->printf("Web file server \033[1;32menabled\033[0;37m\r\n");
+ response->println("Please reboot device");
+ }
+ if(commands.equals("disable"))
+ {
+ cfg.saveBool(PKEYS::KWEB_FILE, false);
+ response->println("");
+ response->printf("Web file server \033[1;32mdisabled\033[0;37m\r\n");
+ response->println("Please reboot device");
+ }
+ }
}
+/**
+ * @brief Initializes the CLI remote shell (e.g., Telnet).
+ */
void initRemoteShell()
{
#ifndef DISABLE_CLI_TELNET
- if (wcli.isTelnetRunning()) wcli.shellTelnet->attachLogo(logo);
+ if (wcli.isTelnetRunning()) wcli.shellTelnet->attachLogo(logo);
#endif
}
+/**
+ * @brief Initializes the local CLI shell, adds core commands, and sets up the environment.
+ */
void initShell()
{
- wcli.shell->attachLogo(logo);
- wcli.setSilentMode(true);
- // Main Commands:
- wcli.add("reboot", &wcli_reboot, "\tperform a ESP32 reboot");
- wcli.add("poweroff", &wcli_poweroff, "\tperform a ESP32 deep sleep");
- wcli.add("wipe", &wcli_swipe, "\t\twipe preferences to factory default");
- wcli.add("info", &wcli_info, "\t\tget device information");
- wcli.add("clear", &wcli_clear, "\t\tclear shell");
- wcli.add("scshot", &wcli_scshot, "\tscreenshot to SD or sending a PC");
- wcli.add("webfile", &wcli_webfile, "\tenable/disable Web file server");
- wcli.add("klist", &wcli_klist, "\t\tlist of user preferences. ('all' param show all)");
- wcli.add("kset", &wcli_kset, "\t\tset an user extra preference");
- wcli.add("outnmea", &wcli_outnmea, "\ttoggle GPS NMEA output (or Ctrl+C to stop)");
- wcli.shell->overrideAbortKey(&wcli_abort_handler);
- wcli.begin("IceNav");
+ wcli.shell->attachLogo(logo);
+ wcli.setSilentMode(true);
+ // Main Commands:
+ wcli.add("reboot", &wcli_reboot, "\tperform a ESP32 reboot");
+ wcli.add("poweroff", &wcli_poweroff, "\tperform a ESP32 deep sleep");
+ wcli.add("wipe", &wcli_swipe, "\t\twipe preferences to factory default");
+ wcli.add("info", &wcli_info, "\t\tget device information");
+ wcli.add("clear", &wcli_clear, "\t\tclear shell");
+ wcli.add("scshot", &wcli_scshot, "\tscreenshot to SD or sending a PC");
+ wcli.add("webfile", &wcli_webfile, "\tenable/disable Web file server");
+ wcli.add("klist", &wcli_klist, "\t\tlist of user preferences. ('all' param show all)");
+ wcli.add("kset", &wcli_kset, "\t\tset an user extra preference");
+ wcli.add("outnmea", &wcli_outnmea, "\ttoggle GPS NMEA output (or Ctrl+C to stop)");
+ wcli.shell->overrideAbortKey(&wcli_abort_handler);
+ wcli.begin("IceNav");
}
/**
- * @brief WiFi CLI init
- **/
+ * @brief Initializes the WiFi CLI, including local and remote shells.
+ */
void initCLI()
{
- Serial.begin(115200);
- ESP_LOGV(TAG, "init CLI");
- initShell();
- initRemoteShell();
+ Serial.begin(115200);
+ ESP_LOGV(TAG, "init CLI");
+ initShell();
+ initRemoteShell();
}
#endif
diff --git a/lib/cli/cli.hpp b/lib/cli/cli.hpp
index 2cfe57cc..6b7c0e67 100644
--- a/lib/cli/cli.hpp
+++ b/lib/cli/cli.hpp
@@ -3,7 +3,7 @@
* @author @Hpsaturn
* @brief Network CLI and custom internal commands
* @version Using https://github.com/hpsaturn/esp32-wifi-cli.git
- * @date 2025-05
+ * @date 2025-06
*/
#pragma once
diff --git a/lib/cli/utils.h b/lib/cli/utils.h
index b68d545d..48f5b199 100644
--- a/lib/cli/utils.h
+++ b/lib/cli/utils.h
@@ -2,8 +2,8 @@
* @file utils.h
* @author @Hpsaturn
* @brief Network CLI and custom internal commands
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -14,80 +14,106 @@
#include "tft.hpp"
extern Storage storage;
+/**
+ * @brief Path to the temporary file used for storing screenshots.
+ */
#define SCREENSHOT_TEMP_FILE "/sdcard/screenshot.png"
-// Capture the screenshot and save it to the SD card
+/**
+ * @brief Captures a screenshot from the TFT display and saves it to the SD card.
+ *
+ * @details Creates a PNG image of the current display, attempts to write it to the specified file,
+ * and prints the operation result to the response stream.
+ *
+ * @param filename Path where the screenshot will be saved.
+ * @param response Stream to send operation messages.
+ * @return true if the screenshot was successfully created and saved, false otherwise.
+ */
static bool captureScreenshot(const char *filename, Stream *response)
{
- size_t dlen;
- uint8_t *png = (uint8_t *)tft.createPng(&dlen, 0, 0, tft.width(), tft.height());
- if (!png)
- {
- response->println("Filed to create PNG");
- return false;
- }
+ size_t dlen;
+ uint8_t *png = (uint8_t *)tft.createPng(&dlen, 0, 0, tft.width(), tft.height());
+ if (!png)
+ {
+ response->println("Filed to create PNG");
+ return false;
+ }
- FILE *file = storage.open(filename, "w");
-
- bool result = false;
- if (file)
- {
- size_t err = storage.write(file, (uint8_t *)png, dlen);
- if (err != 0)
- response->println("Screenshot saved");
- else
- response->println("Error writing screenshot");
- free(png);
- storage.close(file);
- result = true;
- }
- else
- response->println("Failed to open file for writing");
+ FILE *file = storage.open(filename, "w");
+
+ bool result = false;
+ if (file)
+ {
+ size_t err = storage.write(file, (uint8_t *)png, dlen);
+ if (err != 0)
+ response->println("Screenshot saved");
+ else
+ response->println("Error writing screenshot");
+ free(png);
+ storage.close(file);
+ result = true;
+ }
+ else
+ response->println("Failed to open file for writing");
- return result;
+ return result;
}
-// WiFi client
+/**
+ * @brief WiFi client used for network operations in the CLI.
+ */
static WiFiClient client;
+/**
+ * @brief Captures a screenshot and sends it over WiFi to a remote PC.
+ *
+ * @details Connects to a specified IP and port, captures a screenshot using captureScreenshot(),
+ * then reads the file and sends its contents over the network connection.
+ * Reports status and errors to the response stream.
+ *
+ * @param filename Path where the screenshot will be saved and read from.
+ * @param pc_ip IP address of the remote PC to send the screenshot to.
+ * @param pc_port Port of the remote PC to send the screenshot to.
+ * @param response Stream to send operation messages.
+ */
static void captureScreenshot(const char *filename, const char *pc_ip, uint16_t pc_port, Stream *response)
{
- if (!client.connect(pc_ip, pc_port))
- {
- response->println("Connection to server failed");
- return;
- }
+ if (!client.connect(pc_ip, pc_port))
+ {
+ response->println("Connection to server failed");
+ return;
+ }
- response->println("Connected to server");
+ response->println("Connected to server");
- if (!captureScreenshot(filename, response))
- {
- client.stop();
- return;
- }
+ if (!captureScreenshot(filename, response))
+ {
+ client.stop();
+ return;
+ }
- FILE* file = storage.open(filename, "r");
- if (!file)
- {
- response->println("Failed to open file for reading");
- client.stop();
- return;
- }
+ FILE* file = storage.open(filename, "r");
+ if (!file)
+ {
+ response->println("Failed to open file for reading");
+ client.stop();
+ return;
+ }
- // Send the file data to the PC
- while (storage.fileAvailable(file))
- {
- size_t size = 0;
- uint8_t buffer[512];
- size = storage.read(file, buffer, sizeof(buffer));
- if (size > 0)
- {
- client.write(buffer, size);
- }
- }
+ // Send the file data to the PC
+ while (storage.fileAvailable(file))
+ {
+ size_t size = 0;
+ uint8_t buffer[512];
+ size = storage.read(file, buffer, sizeof(buffer));
+ if (size > 0)
+ {
+ client.write(buffer, size);
+ }
+ }
- storage.close(file);
- client.stop();
- response->println("Screenshot sent over WiFi");
+ storage.close(file);
+ client.stop();
+ response->println("Screenshot sent over WiFi");
}
#endif
\ No newline at end of file
diff --git a/lib/compass/compass.cpp b/lib/compass/compass.cpp
index 7b4fe9ae..f68dd451 100644
--- a/lib/compass/compass.cpp
+++ b/lib/compass/compass.cpp
@@ -1,8 +1,8 @@
/**
* @file compass.cpp
* @brief Compass definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "compass.hpp"
@@ -10,301 +10,301 @@
static const char* TAG PROGMEM = "Compass";
#ifdef HMC5883L
-DFRobot_QMC5883 comp = DFRobot_QMC5883(&Wire, HMC5883L_ADDRESS);
+ DFRobot_QMC5883 comp = DFRobot_QMC5883(&Wire, HMC5883L_ADDRESS);
#endif
#ifdef QMC5883
-DFRobot_QMC5883 comp = DFRobot_QMC5883(&Wire, QMC5883_ADDRESS);
+ DFRobot_QMC5883 comp = DFRobot_QMC5883(&Wire, QMC5883_ADDRESS);
#endif
#ifdef IMU_MPU9250
-MPU9250 IMU = MPU9250(Wire, 0x68);
+ MPU9250 IMU = MPU9250(Wire, 0x68);
#endif
/**
- * @brief Compass Class constructor with default values
- *
+ * @brief Compass class constructor with default filter and calibration values.
*/
Compass::Compass()
- : declinationAngle(0.22), offX(0.0), offY(0.0),
- headingSmooth(0.0), headingPrevious(0.0),
- minX(0.0), maxX(0.0), minY(0.0), maxY(0.0),
- kalmanFilterEnabled(true),
- kalmanFilter(0.01, 0.1, 1.0, 0.0)
+ : declinationAngle(0.22), offX(0.0), offY(0.0),
+ headingSmooth(0.0), headingPrevious(0.0),
+ minX(0.0), maxX(0.0), minY(0.0), maxY(0.0),
+ kalmanFilterEnabled(true),
+ kalmanFilter(0.01, 0.1, 1.0, 0.0)
{
}
/**
- * @brief Compass Init
- *
+ * @brief Initializes the compass/magnetometer sensor hardware and configuration.
*/
void Compass::init()
{
#ifdef HMC5883L
- if (!comp.begin())
- comp.begin();
- comp.setDataRate(HMC5883L_DATARATE_15HZ);
- comp.setSamples(HMC5883L_SAMPLES_1);
+ if (!comp.begin())
+ comp.begin();
+ comp.setDataRate(HMC5883L_DATARATE_15HZ);
+ comp.setSamples(HMC5883L_SAMPLES_1);
#endif
#ifdef QMC5883
- if (!comp.begin())
- comp.begin();
- comp.setDataRate(QMC5883_DATARATE_10HZ);
- comp.setSamples(QMC5883_SAMPLES_1);
+ if (!comp.begin())
+ comp.begin();
+ comp.setDataRate(QMC5883_DATARATE_10HZ);
+ comp.setSamples(QMC5883_SAMPLES_1);
#endif
#ifdef IMU_MPU9250
- int status = IMU.begin();
- if (status < 0)
- {
- ESP_LOGE(TAG, "IMU initialization unsuccessful");
- ESP_LOGE(TAG, "Check IMU wiring or try cycling power");
- ESP_LOGE(TAG, "Status: %i", status);
- }
+ int status = IMU.begin();
+ if (status < 0)
+ {
+ ESP_LOGE(TAG, "IMU initialization unsuccessful");
+ ESP_LOGE(TAG, "Check IMU wiring or try cycling power");
+ ESP_LOGE(TAG, "Status: %i", status);
+ }
#endif
}
/**
- * @brief Configure ADC Channel for battery reading
- *
- * @param x
- * @param y
- * @param z
+ * @brief Reads raw X, Y, Z magnetometer data from the compass sensor.
+ * @param x Reference variable for X-axis.
+ * @param y Reference variable for Y-axis.
+ * @param z Reference variable for Z-axis.
*/
void Compass::read(float &x, float &y, float &z)
{
#ifdef HMC5883L
- sVector_t mag = comp.readRaw();
- y = mag.YAxis;
- x = mag.XAxis;
- z = mag.ZAxis;
+ sVector_t mag = comp.readRaw();
+ y = mag.YAxis;
+ x = mag.XAxis;
+ z = mag.ZAxis;
#endif
#ifdef QMC5883
- sVector_t mag = comp.readRaw();
- y = mag.YAxis;
- x = mag.XAxis;
- z = mag.ZAxis;
+ sVector_t mag = comp.readRaw();
+ y = mag.YAxis;
+ x = mag.XAxis;
+ z = mag.ZAxis;
#endif
#ifdef IMU_MPU9250
- IMU.readSensor();
- x = IMU.getMagX_uT();
- y = IMU.getMagY_uT();
- z = IMU.getMagZ_uT();
+ IMU.readSensor();
+ x = IMU.getMagX_uT();
+ y = IMU.getMagY_uT();
+ z = IMU.getMagZ_uT();
#endif
#ifdef ICENAV_BOARD
- y = y * -1;
+ y = y * -1;
#endif
}
/**
- * @brief Get compass heading
+ * @brief Calculates the heading (in degrees) from the magnetometer data.
+ *
+ * @details Applies calibration offsets and applies a Kalman filter if enabled.
*
- * @return compass heading
+ * @return Heading in degrees.
*/
int Compass::getHeading()
{
- float y = 0.0;
- float x = 0.0;
- float z = 0.0;
+ float x = 0.0f;
+ float y = 0.0f;
+ float z = 0.0f;
- read(x, y, z);
-
- float headingNoFilter = atan2(y - offY, x - offX);
- headingNoFilter += declinationAngle;
+ read(x, y, z);
- headingNoFilter = wrapToPi(headingNoFilter);
+ float hx = x - offX;
+ float hy = y - offY;
- if (kalmanFilterEnabled)
- {
- headingNoFilter = unwrapFromPi(headingNoFilter, headingPrevious);
- headingSmooth = kalmanFilter.update(headingNoFilter);
- }
- else
- headingSmooth = headingNoFilter;
+ float heading = atan2f(hy, hx);
+ heading += declinationAngle;
+ heading = wrapToPi(heading);
- headingPrevious = headingNoFilter;
+ if (kalmanFilterEnabled)
+ {
+ heading = unwrapFromPi(heading, headingPrevious);
+ headingSmooth = kalmanFilter.update(heading);
+ }
+ else
+ {
+ headingSmooth = heading;
+ }
- float headingDegrees = (int)(headingSmooth * 180 / M_PI);
+ headingPrevious = heading;
- if (headingDegrees < 0)
- headingDegrees += 360;
+ int headingDeg = static_cast(headingSmooth * (180.0f / M_PI));
+ if (headingDeg < 0)
+ headingDeg += 360;
- return static_cast(headingDegrees);
+ return headingDeg;
}
/**
- * @brief Check compass heading is update
+ * @brief Checks if the compass heading has been updated since the last reading.
*
- * @return true/flase
+ * @details Compares the current heading with the previous value to detect changes.
+ *
+ * @return true if updated, false otherwise.
*/
bool Compass::isUpdated()
{
- int currentDegrees = getHeading();
- if (currentDegrees != previousDegrees)
- {
- previousDegrees = currentDegrees;
- return true;
- }
- return false;
+ int currentDegrees = getHeading();
+ if (currentDegrees != previousDegrees)
+ {
+ previousDegrees = currentDegrees;
+ return true;
+ }
+ return false;
}
/**
- * @brief Compass calibration
+ * @brief Performs compass calibration routine.
*
+ * @details Guides the user through a calibration process using the screen and touch input.
+ * Saves the calculated X and Y offsets to persistent configuration.
*/
void Compass::calibrate()
{
- bool cal = 1;
- float y = 0.0;
- float x = 0.0;
- float z = 0.0;
- uint16_t touchX, touchY;
-
- static const lgfx::v1::GFXfont *fontSmall;
- static const lgfx::v1::GFXfont *fontLarge;
-
-#ifdef LARGE_SCREEN
- fontSmall = &fonts::DejaVu18;
- fontLarge = &fonts::DejaVu40;
- static const float scale = 1.0f;
-#else
- fontSmall = &fonts::DejaVu12;
- fontLarge = &fonts::DejaVu24;
- static const float scale = 0.75f;
-#endif
-
- tft.drawCenterString("ROTATE THE DEVICE", tft.width() >> 1, 10 * scale, fontSmall);
- tft.drawPngFile(PSTR("/spiffs/turn.png"), (tft.width() / 2) - 50, 60 * scale);
- tft.drawCenterString("TOUCH TO START", tft.width() >> 1, 200 * scale, fontSmall);
- tft.drawCenterString("COMPASS CALIBRATION", tft.width() >> 1, 230 * scale, fontSmall);
-
- while (!tft.getTouch(&touchX, &touchY))
- {
- };
- delay(1000);
-
- unsigned long calTimeWas = millis();
-
- read(x, y, z);
-
- maxX = minX = x;
- maxY = minY = y;
-
- while (cal)
- {
- read(x, y, z);
-
- if (x > maxX)
- maxX = x;
- if (x < minX)
- minX = x;
- if (y > maxY)
- maxY = y;
- if (y < minY)
- minY = y;
-
- int secmillis = millis() - calTimeWas;
- int secs = (int)((COMPASS_CAL_TIME - secmillis + 1000) / 1000);
- tft.setTextColor(TFT_WHITE, TFT_BLACK);
- tft.setTextSize(3);
- tft.setTextPadding(tft.textWidth("88"));
- tft.drawNumber((COMPASS_CAL_TIME - secmillis) / 1000, (tft.width() >> 1), 280 * scale);
-
- if (secs == 0)
- {
- offX = (maxX + minX) / 2;
- offY = (maxY + minY) / 2;
- cal = 0;
- }
- }
-
- tft.setTextSize(1);
- tft.drawCenterString("DONE!", tft.width() >> 1, 340 * scale, fontLarge);
- tft.drawCenterString("TOUCH TO CONTINUE.", tft.width() >> 1, 380 * scale, fontSmall);
-
- while (!tft.getTouch(&touchX, &touchY))
- {
- };
-
- cfg.saveFloat(PKEYS::KCOMP_OFFSET_X, offX);
- cfg.saveFloat(PKEYS::KCOMP_OFFSET_Y, offY);
+ bool cal = 1;
+ float y = 0.0;
+ float x = 0.0;
+ float z = 0.0;
+ uint16_t touchX, touchY;
+
+ static const lgfx::v1::GFXfont *fontSmall;
+ static const lgfx::v1::GFXfont *fontLarge;
+
+ #ifdef LARGE_SCREEN
+ fontSmall = &fonts::DejaVu18;
+ fontLarge = &fonts::DejaVu40;
+ static const float scale = 1.0f;
+ #else
+ fontSmall = &fonts::DejaVu12;
+ fontLarge = &fonts::DejaVu24;
+ static const float scale = 0.75f;
+ #endif
+
+ tft.drawCenterString("ROTATE THE DEVICE", tft.width() >> 1, 10 * scale, fontSmall);
+ tft.drawPngFile(PSTR("/spiffs/turn.png"), (tft.width() / 2) - 50, 60 * scale);
+ tft.drawCenterString("TOUCH TO START", tft.width() >> 1, 200 * scale, fontSmall);
+ tft.drawCenterString("COMPASS CALIBRATION", tft.width() >> 1, 230 * scale, fontSmall);
+
+ while (!tft.getTouch(&touchX, &touchY))
+ {
+ };
+ delay(1000);
+
+ unsigned long calTimeWas = millis();
+
+ read(x, y, z);
+
+ maxX = minX = x;
+ maxY = minY = y;
+
+ while (cal)
+ {
+ read(x, y, z);
+
+ if (x > maxX)
+ maxX = x;
+ if (x < minX)
+ minX = x;
+ if (y > maxY)
+ maxY = y;
+ if (y < minY)
+ minY = y;
+
+ int secmillis = millis() - calTimeWas;
+ int secs = (int)((COMPASS_CAL_TIME - secmillis + 1000) / 1000);
+ tft.setTextColor(TFT_WHITE, TFT_BLACK);
+ tft.setTextSize(3);
+ tft.setTextPadding(tft.textWidth("88"));
+ tft.drawNumber((COMPASS_CAL_TIME - secmillis) / 1000, (tft.width() >> 1), 280 * scale);
+
+ if (secs == 0)
+ {
+ offX = (maxX + minX) / 2;
+ offY = (maxY + minY) / 2;
+ cal = 0;
+ }
+ }
+
+ tft.setTextSize(1);
+ tft.drawCenterString("DONE!", tft.width() >> 1, 340 * scale, fontLarge);
+ tft.drawCenterString("TOUCH TO CONTINUE.", tft.width() >> 1, 380 * scale, fontSmall);
+
+ while (!tft.getTouch(&touchX, &touchY))
+ {
+ };
+
+ cfg.saveFloat(PKEYS::KCOMP_OFFSET_X, offX);
+ cfg.saveFloat(PKEYS::KCOMP_OFFSET_Y, offY);
}
/**
- * @brief Set compass declination angle
- *
- * @param angle -> Declination angle
+ * @brief Sets the magnetic declination angle for heading correction.
+ * @param angle Declination angle in radians.
*/
void Compass::setDeclinationAngle(float angle)
{
- declinationAngle = angle;
+ declinationAngle = angle;
}
/**
- * @brief Set compass calibration offsets
- *
- * @param offsetX
- * @param offsetY
+ * @brief Sets the calibration offsets for the X and Y axes.
+ * @param offsetX X-axis offset.
+ * @param offsetY Y-axis offset.
*/
void Compass::setOffsets(float offsetX, float offsetY)
{
- offX = offsetX;
- offY = offsetY;
+ offX = offsetX;
+ offY = offsetY;
}
/**
- * @brief Enable compass Kalman filter
- *
- * @param enable -> true/false
+ * @brief Enables or disables the Kalman filter for compass heading smoothing.
+ * @param enabled True to enable, false to disable.
*/
void Compass::enableKalmanFilter(bool enabled)
{
- kalmanFilterEnabled = enabled;
+ kalmanFilterEnabled = enabled;
}
/**
- * @brief Set Kalman filter constants
- *
- * @param processNoise -> 0-1
- * @param measureNoise -> 0-1
+ * @brief Sets the Kalman filter process and measurement noise constants.
+ * @param processNoise Process noise covariance (0-1).
+ * @param measureNoise Measurement noise covariance (0-1).
*/
void Compass::setKalmanFilterConst(float processNoise, float measureNoise)
{
- kalmanFilter.setConstants(processNoise, measureNoise);
+ kalmanFilter.setConstants(processNoise, measureNoise);
}
/**
- * @brief Helper function to wrap angle to -pi to pi
- *
- * @param angle
- * @return wrap angle
+ * @brief Wraps an angle to the range [-pi, pi].
+ * @param angle Angle in radians.
+ * @return Wrapped angle in radians.
*/
float Compass::wrapToPi(float angle)
{
- while (angle < -M_PI)
- angle += 2 * M_PI;
- while (angle > M_PI)
- angle -= 2 * M_PI;
- return angle;
+ while (angle < -M_PI)
+ angle += 2 * M_PI;
+ while (angle > M_PI)
+ angle -= 2 * M_PI;
+ return angle;
}
/**
- * @brief Helper function to unwrap angle to -pi to pi
- *
- * @param angle
- * @param previousAngle
- * @return unrap angle
+ * @brief Unwraps an angle to avoid discontinuity across the [-pi, pi] boundary.
+ * @param angle Current angle in radians.
+ * @param previousAngle Previous angle in radians.
+ * @return Unwrapped angle in radians.
*/
float Compass::unwrapFromPi(float angle, float previousAngle)
{
- float delta = angle - previousAngle;
- if (delta > M_PI)
- angle -= 2 * M_PI;
- else if (delta < -M_PI)
- angle += 2 * M_PI;
- return angle;
+ float delta = angle - previousAngle;
+ if (delta > M_PI)
+ angle -= 2 * M_PI;
+ else if (delta < -M_PI)
+ angle += 2 * M_PI;
+ return angle;
}
diff --git a/lib/compass/compass.hpp b/lib/compass/compass.hpp
index b226691e..ee504336 100644
--- a/lib/compass/compass.hpp
+++ b/lib/compass/compass.hpp
@@ -1,8 +1,8 @@
/**
* @file compass.hpp
* @brief Compass definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -11,96 +11,121 @@
#include
#ifdef HMC5883L
-#include
-#define ENABLE_COMPASS
+ #include
+ #define ENABLE_COMPASS
#endif
#ifdef QMC5883
-#include
-#define ENABLE_COMPASS
+ #include
+ #define ENABLE_COMPASS
#endif
#ifdef IMU_MPU9250
-#include
-#define ENABLE_COMPASS
-#define ENABLE_IMU ;
+ #include
+ #define ENABLE_COMPASS
+ #define ENABLE_IMU ;
#endif
-#define COMPASS_CAL_TIME 16000
+#define COMPASS_CAL_TIME 16000 /**< Compass calibration duration in milliseconds. */
+/**
+ * @class KalmanFilter
+ * @brief Implements a simple 1D Kalman filter for angle estimation.
+ */
class KalmanFilter
{
public:
- KalmanFilter(float processNoise, float measurementNoise, float estimateError, float initialEstimate)
- : q(processNoise), r(measurementNoise), p(estimateError), x(initialEstimate) {}
-
- float update(float measurement)
- {
- measurement = wrapToPi(measurement);
- float y = measurement - x;
- y = wrapToPi(y);
-
- p = p + q;
- k = p / (p + r);
- x = x + k * y;
-
- x = wrapToPi(x);
-
- p = (1 - k) * p;
- return x;
- }
-
- void setConstants(float processNoise, float measurementNoise)
- {
- q = processNoise;
- r = measurementNoise;
- }
+ KalmanFilter(float processNoise, float measurementNoise, float estimateError, float initialEstimate)
+ : q(processNoise), r(measurementNoise), p(estimateError), x(initialEstimate) {}
+
+ /**
+ * @brief Updates the state estimate using the Kalman filter algorithm for angular measurements.
+ *
+ * @details Applies the Kalman filter update step, taking into account the wrapped angular measurement,
+ * and updates the internal state and covariance variables accordingly.
+ *
+ * @param measurement The new angle measurement to incorporate (in radians).
+ * @return float The updated state estimate (in radians, wrapped to [-Ο, Ο]).
+ */
+ float update(float measurement)
+ {
+ measurement = wrapToPi(measurement);
+ float y = measurement - x;
+ y = wrapToPi(y);
+
+ p = p + q;
+ k = p / (p + r);
+ x = x + k * y;
+
+ x = wrapToPi(x);
+
+ p = (1 - k) * p;
+ return x;
+ }
+
+ /**
+ * @brief Sets the process and measurement noise constants for the Kalman filter.
+ *
+ * @details Updates the internal parameters for process noise covariance (q) and measurement noise covariance (r).
+ *
+ * @param processNoise Value for the process noise covariance.
+ * @param measurementNoise Value for the measurement noise covariance.
+ */
+ void setConstants(float processNoise, float measurementNoise)
+ {
+ q = processNoise;
+ r = measurementNoise;
+ }
private:
- float q; // Process noise covariance
- float r; // Measurement noise covariance
- float p; // Estimate error covariance
- float k; // Kalman gain
- float x; // Value
-
- float wrapToPi(float angle)
- {
- while (angle < -M_PI)
- angle += 2 * M_PI;
- while (angle > M_PI)
- angle -= 2 * M_PI;
- return angle;
- }
+ float q; /**< Process noise covariance (Q), representing the process variance. */
+ float r; /**< Measurement noise covariance (R), representing the sensor variance. */
+ float p; /**< Estimate error covariance (P), representing the estimated error. */
+ float k; /**< Kalman gain (K), used to update the state estimate. */
+ float x; /**< Value (X), the current state estimate. */
+
+ float wrapToPi(float angle)
+ {
+ while (angle < -M_PI)
+ angle += 2 * M_PI;
+ while (angle > M_PI)
+ angle -= 2 * M_PI;
+ return angle;
+ }
};
+/**
+ * @class Compass
+ * @brief Provides high-level interface for compass (magnetometer) sensor management and heading calculation.
+ */
class Compass
{
public:
- Compass();
- void init();
- void read(float &x, float &y, float &z);
- int getHeading();
- bool isUpdated();
- void calibrate();
- void setDeclinationAngle(float angle);
- void setOffsets(float offsetX, float offsetY);
- void enableKalmanFilter(bool enabled);
- void setKalmanFilterConst(float processNoise, float measureNoise);
+ Compass();
+ void init();
+ void read(float &x, float &y, float &z);
+ int getHeading();
+ bool isUpdated();
+ void calibrate();
+ void setDeclinationAngle(float angle);
+ void setOffsets(float offsetX, float offsetY);
+ void enableKalmanFilter(bool enabled);
+ void setKalmanFilterConst(float processNoise, float measureNoise);
private:
- float declinationAngle;
- float offX;
- float offY;
- float headingSmooth;
- float headingPrevious;
- float minX;
- float maxX;
- float minY;
- float maxY;
- bool kalmanFilterEnabled;
- KalmanFilter kalmanFilter;
- int previousDegrees;
-
- float wrapToPi(float angle);
- float unwrapFromPi(float angle, float previousAngle);
+ float declinationAngle; /**< Magnetic declination angle (in radians or degrees, depending on use). */
+ float offX; /**< Magnetometer offset for X axis. */
+ float offY; /**< Magnetometer offset for Y axis. */
+ float headingSmooth; /**< Smoothed heading value. */
+ float headingPrevious; /**< Previous heading value (for smoothing or change detection). */
+ float minX; /**< Minimum observed value for X axis (for calibration). */
+ float maxX; /**< Maximum observed value for X axis (for calibration). */
+ float minY; /**< Minimum observed value for Y axis (for calibration). */
+ float maxY; /**< Maximum observed value for Y axis (for calibration). */
+ bool kalmanFilterEnabled; /**< True if the Kalman filter is enabled for heading smoothing. */
+ KalmanFilter kalmanFilter; /**< Kalman filter instance used for heading estimation. */
+ int previousDegrees; /**< Previous heading in degrees (integer value). */
+
+ float wrapToPi(float angle);
+ float unwrapFromPi(float angle, float previousAngle);
};
\ No newline at end of file
diff --git a/lib/gps/gps.cpp b/lib/gps/gps.cpp
index 6ac2b0b5..c1a64fd4 100644
--- a/lib/gps/gps.cpp
+++ b/lib/gps/gps.cpp
@@ -2,231 +2,259 @@
* @file gps.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief GPS definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "gps.hpp"
#include "lvgl.h"
#include "widgets.hpp"
-extern lv_obj_t *sunriseLabel;
-bool setTime = true;
-bool isGpsFixed = false;
-bool isTimeFixed = false;
-long gpsBaudDetected = 0;
-bool nmea_output_enable = false;
-gps_fix fix;
-NMEAGPS GPS;
+extern lv_obj_t *sunriseLabel; /**< Label object for displaying the sunrise time. */
+bool setTime = true; /**< Indicates if the system time should be set from GPS. */
+bool isGpsFixed = false; /**< Indicates whether a valid GPS fix has been acquired. */
+bool isTimeFixed = false; /**< Indicates whether the system time has been fixed using GPS. */
+long gpsBaudDetected = 0; /**< Detected GPS baud rate. */
+bool nmea_output_enable = false; /**< Enables or disables NMEA output. */
+gps_fix fix; /**< Latest parsed GPS fix data. */
+NMEAGPS GPS; /**< NMEAGPS parser instance. */
static const char* TAG PROGMEM = "GPS";
Gps::Gps() {}
+
/**
- * @brief Init GPS and custom NMEA parsing
+ * @brief Init GPS and custom NMEA parsing.
*
+ * @details Initializes the GPS port with the appropriate baud rate and buffer size.
+ * If a specific baud rate is not set (gpsBaud != 4), it uses the predefined baud rate array.
+ * Otherwise, it attempts to auto-detect the baud rate.
*/
void Gps::init()
{
- gpsPort.setRxBufferSize(1024);
+ gpsPort.setRxBufferSize(1024);
- if (gpsBaud != 4)
- gpsPort.begin(GPS_BAUD[gpsBaud], SERIAL_8N1, GPS_RX, GPS_TX);
- else
- {
- gpsBaudDetected = autoBaud();
+ if (gpsBaud != 4)
+ gpsPort.begin(GPS_BAUD[gpsBaud], SERIAL_8N1, GPS_RX, GPS_TX);
+ else
+ {
+ gpsBaudDetected = autoBaud();
- if (gpsBaudDetected != 0)
- gpsPort.begin(gpsBaudDetected, SERIAL_8N1, GPS_RX, GPS_TX);
- }
+ if (gpsBaudDetected != 0)
+ gpsPort.begin(gpsBaudDetected, SERIAL_8N1, GPS_RX, GPS_TX);
+ }
#ifdef AT6558D_GPS
- // FACTORY RESET
- // gpsPort.println("$PCAS10,3*1F\r\n");
- // gpsPort.flush();
- // delay(100);
-
- // GPS
- // gpsPort.println("$PCAS04,1*18\r\n")
-
- // GPS+GLONASS
- // gpsPort.println("$PCAS04,5*1C\r\n");
-
- // GPS+BDS+GLONASS
- gpsPort.println("$PCAS04,7*1E\r\n");
- gpsPort.flush();
- delay(100);
-
- // Update Rate
- gpsPort.println(GPS_RATE_PCAS[gpsUpdate]);
- gpsPort.flush();
- delay(100);
-
- // Set NMEA 4.1
- gpsPort.println("$PCAS05,2*1A\r\n");
- gpsPort.flush();
- delay(100);
+ // FACTORY RESET
+ // gpsPort.println("$PCAS10,3*1F\r\n");
+ // gpsPort.flush();
+ // delay(100);
+
+ // GPS
+ // gpsPort.println("$PCAS04,1*18\r\n")
+
+ // GPS+GLONASS
+ // gpsPort.println("$PCAS04,5*1C\r\n");
+
+ // GPS+BDS+GLONASS
+ gpsPort.println("$PCAS04,7*1E\r\n");
+ gpsPort.flush();
+ delay(100);
+
+ // Update Rate
+ gpsPort.println(GPS_RATE_PCAS[gpsUpdate]);
+ gpsPort.flush();
+ delay(100);
+
+ // Set NMEA 4.1
+ gpsPort.println("$PCAS05,2*1A\r\n");
+ gpsPort.flush();
+ delay(100);
#endif
-
}
/**
- * @brief return latitude from GPS or sys env pre-built variable
- *
- * @return latitude or 0.0 if not defined
+ * @brief Return latitude from GPS or system environment pre-built variable.
+ *
+ * @details Returns the current latitude using the GPS fix if available, otherwise uses the system configuration
+ * or a predefined default value. Returns 0.0 if latitude is not defined.
+ *
+ * @return Latitude value or 0.0 if not defined.
*/
-double Gps::getLat()
+float Gps::getLat()
{
- {
- if (fix.valid.location)
- return fix.latitude();
- else if (cfg.getDouble(PKEYS::KLAT_DFL, 0.0) != 0.0)
- return cfg.getDouble(PKEYS::KLAT_DFL, 0.0);
- else
- {
-#ifdef DEFAULT_LAT
- return DEFAULT_LAT;
-#else
- return 0.0;
-#endif
- }
- }
+ {
+ if (fix.valid.location)
+ return fix.latitude();
+ else if (cfg.getFloat(PKEYS::KLAT_DFL, 0.0) != 0.0)
+ return cfg.getFloat(PKEYS::KLAT_DFL, 0.0);
+ else
+ {
+ #ifdef DEFAULT_LAT
+ return DEFAULT_LAT;
+ #else
+ return 0.0;
+ #endif
+ }
+ }
}
/**
- * @brief return longitude from GPS or sys env pre-built variable
- *
- * @return longitude or 0.0 if not defined
+ * @brief Return longitude from GPS or system environment pre-built variable.
+ *
+ * @details Returns the current longitude using the GPS fix if available, otherwise uses the system configuration
+ * or a predefined default value. Returns 0.0 if longitude is not defined.
+ *
+ * @return Longitude value or 0.0 if not defined.
*/
-double Gps::getLon()
+float Gps::getLon()
{
- if (fix.valid.location)
- return fix.longitude();
- else if (cfg.getDouble(PKEYS::KLON_DFL, 0.0) != 0.0)
- return cfg.getDouble(PKEYS::KLON_DFL, 0.0);
- else
- {
-#ifdef DEFAULT_LON
- return DEFAULT_LON;
-#else
- return 0.0;
-#endif
- }
+ if (fix.valid.location)
+ return fix.longitude();
+ else if (cfg.getFloat(PKEYS::KLON_DFL, 0.0) != 0.0)
+ return cfg.getFloat(PKEYS::KLON_DFL, 0.0);
+ else
+ {
+ #ifdef DEFAULT_LON
+ return DEFAULT_LON;
+ #else
+ return 0.0;
+ #endif
+ }
}
/**
- * @brief Get GPS parsed data
+ * @brief Get GPS parsed data.
*
+ * @details Updates the GPS data structure with the latest parsed values from the GPS fix.
+ * Handles fix status, satellite information, time/date updates, position, altitude, speed,
+ * heading, dilution of precision values, and updates satellite tracker positions and status.
*/
void Gps::getGPSData()
{
- // GPS Fix
- if (fix.status != gps_fix::STATUS_NONE)
- isGpsFixed = true;
-
- // GPS Not fixed
- if (fix.status == gps_fix::STATUS_NONE)
- isGpsFixed = false;
-
- // Satellite Count
- gpsData.satellites = fix.satellites;
-
- // Fix Mode
- gpsData.fixMode = fix.status;
-
- // Time and Date
- if (fix.valid.time && fix.valid.date)
- {
- if (!setTime)
- {
- log_v("Get date, time, Sunrise and Sunset");
- // Set ESP RTC - Local time
- String TZ = cfg.isKey(CONFKEYS::KDEF_TZ) ? cfg.getString(CONFKEYS::KDEF_TZ, TZ) : "UTC";
- setLocalTime(fix.dateTime,getPosixTZ(TZ.c_str()));
- // Calculate Sunrise and Sunset only one time when date & time was valid
- calculateSun();
- setTime = true;
- lv_obj_send_event(sunriseLabel, LV_EVENT_VALUE_CHANGED, NULL);
- }
- }
-
- // Altitude
- if (fix.valid.altitude)
- gpsData.altitude = fix.alt.whole;
-
- // Speed
- if (fix.valid.speed)
- gpsData.speed = (uint16_t)fix.speed_kph();
-
- // Latitude and Longitude
- if (fix.valid.location)
- {
- gpsData.latitude = getLat();
- gpsData.longitude = getLon();
- }
-
- // Heading
- if (fix.valid.heading)
- gpsData.heading = (uint16_t)fix.heading();
-
- // HDOP , PDOP , VDOP
- if (fix.valid.hdop)
- gpsData.hdop = (float)fix.hdop / 1000;
- if (fix.valid.pdop)
- gpsData.pdop = (float)fix.pdop / 1000;
- if (fix.valid.vdop)
- gpsData.vdop = (float)fix.vdop / 1000;
-
- // Satellite info
- gpsData.satInView = (uint8_t)GPS.sat_count;
- for (uint8_t i = 0; i < gpsData.satInView; i++)
- {
- satTracker[i].satNum = (uint8_t)GPS.satellites[i].id;
- satTracker[i].elev = (uint8_t)GPS.satellites[i].elevation;
- satTracker[i].azim = (uint16_t)GPS.satellites[i].azimuth;
- satTracker[i].snr = (uint8_t)GPS.satellites[i].snr;
- satTracker[i].active = GPS.satellites[i].tracked;
- strncpy(satTracker[i].talker_id, GPS.satellites[i].talker_id, 3);
- int H = canvasRadius * (90 - satTracker[i].elev) / 90;
- satTracker[i].posX = canvasCenter_X + H * sin(DEG2RAD(satTracker[i].azim));
- satTracker[i].posY = canvasCenter_Y - H * cos(DEG2RAD(satTracker[i].azim));
- }
+ // GPS Fix
+ if (fix.status != gps_fix::STATUS_NONE)
+ isGpsFixed = true;
+
+ // GPS Not fixed
+ if (fix.status == gps_fix::STATUS_NONE)
+ isGpsFixed = false;
+
+ // Satellite Count
+ gpsData.satellites = fix.satellites;
+
+ // Fix Mode
+ gpsData.fixMode = fix.status;
+
+ // Time and Date
+ if (fix.valid.time && fix.valid.date)
+ {
+ if (!setTime)
+ {
+ log_v("Get date, time, Sunrise and Sunset");
+ // Set ESP RTC - Local time
+ String TZ = cfg.isKey(CONFKEYS::KDEF_TZ) ? cfg.getString(CONFKEYS::KDEF_TZ, TZ) : "UTC";
+ setLocalTime(fix.dateTime,getPosixTZ(TZ.c_str()));
+ // Calculate Sunrise and Sunset only one time when date & time was valid
+ calculateSun();
+ setTime = true;
+ lv_obj_send_event(sunriseLabel, LV_EVENT_VALUE_CHANGED, NULL);
+ }
+ }
+
+ // Altitude
+ if (fix.valid.altitude)
+ gpsData.altitude = fix.alt.whole;
+
+ // Speed
+ if (fix.valid.speed)
+ gpsData.speed = (uint16_t)fix.speed_kph();
+
+ // Latitude and Longitude
+ if (fix.valid.location)
+ {
+ gpsData.latitude = getLat();
+ gpsData.longitude = getLon();
+ }
+
+ // Heading
+ if (fix.valid.heading)
+ gpsData.heading = (uint16_t)fix.heading();
+
+ // HDOP , PDOP , VDOP
+ if (fix.valid.hdop)
+ gpsData.hdop = (float)fix.hdop / 1000;
+ if (fix.valid.pdop)
+ gpsData.pdop = (float)fix.pdop / 1000;
+ if (fix.valid.vdop)
+ gpsData.vdop = (float)fix.vdop / 1000;
+
+ // // Satellite info
+ gpsData.satInView = (uint8_t)GPS.sat_count;
+ for (uint8_t i = 0; i < gpsData.satInView; i++)
+ {
+ satTracker[i].satNum = (uint8_t)GPS.satellites[i].id;
+ satTracker[i].elev = (uint8_t)GPS.satellites[i].elevation;
+ satTracker[i].azim = (uint16_t)GPS.satellites[i].azimuth;
+ satTracker[i].snr = (uint8_t)GPS.satellites[i].snr;
+ satTracker[i].active = GPS.satellites[i].tracked;
+ strncpy(satTracker[i].talker_id, GPS.satellites[i].talker_id, 3);
+
+ int H = canvasRadius * (90 - satTracker[i].elev) / 90;
+
+ float azimRad = DEG2RAD((float)satTracker[i].azim);
+ float sinAzim = lutInit ? sinLUT(azimRad) : sinf(azimRad);
+ float cosAzim = lutInit ? cosLUT(azimRad) : cosf(azimRad);
+
+ satTracker[i].posX = canvasCenter_X + H * sinAzim;
+ satTracker[i].posY = canvasCenter_Y - H * cosAzim;
+ }
+
}
+
+
/**
- * @brief return pulse rate from RX GPS pin
- *
- * @return pulse rate
+ * @brief Detect the baud rate of the incoming GPS signal on a given RX pin.
+ *
+ * @details Measures the duration of low pulses on the RX line to estimate the baud rate of the connected GPS device.
+ * Returns the shortest measured pulse width as the likely bit duration.
+ *
+ * @param rxPin The GPIO pin number used for receiving GPS data.
+ * @return long The estimated baud rate (bit duration in microseconds).
*/
long Gps::detectRate(int rxPin)
{
- long rate = 10000, x = 2000;
- pinMode(rxPin, INPUT); // make sure Serial in is a input pin
- digitalWrite(rxPin, HIGH); // pull up enabled just for noise protection
-
- for (int i = 0; i < 5; i++)
- {
- x = pulseIn(rxPin, LOW, 125000); // measure the next zero bit width
- if (x < 1)
- continue;
- rate = x < rate ? x : rate;
- }
- return rate;
+ long rate = 10000, x = 2000;
+ pinMode(rxPin, INPUT); // make sure Serial in is a input pin
+ digitalWrite(rxPin, HIGH); // pull up enabled just for noise protection
+
+ for (int i = 0; i < 5; i++)
+ {
+ x = pulseIn(rxPin, LOW, 125000); // measure the next zero bit width
+ if (x < 1)
+ continue;
+ rate = x < rate ? x : rate;
+ }
+ return rate;
}
/**
- * @brief Detect GPS Baudrate
- *
- * @return baudrate
+ * @brief Detect GPS Baudrate.
+ *
+ * @details Measures the pulse width on the GPS RX pin multiple times to estimate the baud rate.
+ * Maps the measured pulse width to the nearest standard baud rate value.
+ *
+ * @return long Detected baud rate, or 0 if detection failed.
*/
long Gps::autoBaud()
{
- long rate = detectRate(GPS_RX) + detectRate(GPS_RX) + detectRate(GPS_RX);
- rate = rate / 3l;
- long baud = 0;
- /*
- Time Baud Rate
+ long rate = detectRate(GPS_RX) + detectRate(GPS_RX) + detectRate(GPS_RX);
+ rate = rate / 3l;
+ long baud = 0;
+ /*
+ Time Baud Rate
3333Β΅s (3.3ms)300
833Β΅s 1200
416Β΅s 2400
@@ -239,138 +267,283 @@ long Gps::autoBaud()
17.3Β΅s 57600
8Β΅s 115200
Megas min is about 10uS? so there may be some inaccuracy
- */
- if (rate < 12)
- baud = 115200;
- else if (rate < 20)
- baud = 57600;
- else if (rate < 30)
- baud = 38400;
- else if (rate < 40)
- baud = 28800;
- else if (rate < 60)
- baud = 19200;
- else if (rate < 80)
- baud = 14400;
- else if (rate < 150)
- baud = 9600;
- else if (rate < 300)
- baud = 4800;
- else if (rate < 600)
- baud = 2400;
- else if (rate < 1200)
- baud = 1200;
- else
- baud = 0;
-
- return baud;
+ */
+ if (rate < 12)
+ baud = 115200;
+ else if (rate < 20)
+ baud = 57600;
+ else if (rate < 30)
+ baud = 38400;
+ else if (rate < 40)
+ baud = 28800;
+ else if (rate < 60)
+ baud = 19200;
+ else if (rate < 80)
+ baud = 14400;
+ else if (rate < 150)
+ baud = 9600;
+ else if (rate < 300)
+ baud = 4800;
+ else if (rate < 600)
+ baud = 2400;
+ else if (rate < 1200)
+ baud = 1200;
+ else
+ baud = 0;
+
+ return baud;
}
/**
- * @brief Check if the speed has changed
- *
- * @return true if speed has changed, false otherwise
+ * @brief Check if the speed has changed.
+ *
+ * @details Compares the current speed with the previous value and updates the previous value if changed.
+ *
+ * @return true if speed has changed, false otherwise.
*/
bool Gps::isSpeedChanged()
{
- if (gpsData.speed != previousSpeed)
- {
- previousSpeed = gpsData.speed;
- return true;
- }
- return false;
+ if (gpsData.speed != previousSpeed)
+ {
+ previousSpeed = gpsData.speed;
+ return true;
+ }
+ return false;
}
/**
- * @brief Check if the altitude has changed
- *
- * @return true if altitude has changed, false otherwise
+ * @brief Check if the altitude has changed.
+ *
+ * @details Compares the current altitude with the previous value and updates the previous value if changed.
+ *
+ * @return true if altitude has changed, false otherwise.
*/
bool Gps::isAltitudeChanged()
{
- if (gpsData.altitude != previousAltitude)
- {
- previousAltitude = gpsData.altitude;
- return true;
- }
- return false;
+ if (gpsData.altitude != previousAltitude)
+ {
+ previousAltitude = gpsData.altitude;
+ return true;
+ }
+ return false;
}
+
/**
- * @brief Check if the latitude or longitude has changed
- *
- * @return true if latitude or longitude has changed, false otherwise
+ * @brief Check if the latitude or longitude has changed.
+ *
+ * @details Compares the current latitude and longitude with the previous values and updates them if changed.
+ *
+ * @return true if latitude or longitude has changed, false otherwise.
*/
bool Gps::hasLocationChange()
{
- if (gpsData.latitude != previousLatitude || gpsData.longitude != previousLongitude)
- {
- previousLatitude = gpsData.latitude;
- previousLongitude = gpsData.longitude;
- return true;
- }
- return false;
+ if (gpsData.latitude != previousLatitude || gpsData.longitude != previousLongitude)
+ {
+ previousLatitude = gpsData.latitude;
+ previousLongitude = gpsData.longitude;
+ return true;
+ }
+ return false;
}
/**
- * @brief Check if the PDOP, HDOP, or VDOP has changed
- *
- * @return true if PDOP, HDOP, or VDOP has changed, false otherwise
+ * @brief Check if the PDOP, HDOP, or VDOP has changed.
+ *
+ * @details Compares the current DOP values with the previous values and updates them if changed.
+ *
+ * @return true if PDOP, HDOP, or VDOP has changed, false otherwise.
*/
bool Gps::isDOPChanged()
{
- if (gpsData.pdop != previousPdop || gpsData.hdop != previousHdop || gpsData.vdop != previousVdop)
- {
- previousPdop = gpsData.pdop;
- previousHdop = gpsData.hdop;
- previousVdop = gpsData.vdop;
- return true;
- }
- return false;
+ if (gpsData.pdop != previousPdop || gpsData.hdop != previousHdop || gpsData.vdop != previousVdop)
+ {
+ previousPdop = gpsData.pdop;
+ previousHdop = gpsData.hdop;
+ previousVdop = gpsData.vdop;
+ return true;
+ }
+ return false;
}
/**
- * @brief set local time from GPS time and TZ
- *
- * @param gpsTime NeoGPS::time_t to convert
- * @param tz timezone TZ
+ * @brief Set system local time from GPS time and timezone.
+ *
+ * @details Converts the provided GPS time to a struct tm, sets the system time, applies the timezone,
+ * and logs both the local and UTC time. Also calculates and stores the UTC offset in gpsData.UTC.
+ *
+ * @param gpsTime The GPS time (NeoGPS::time_t) to set as system time.
+ * @param tz The timezone string (POSIX TZ format).
*/
void Gps::setLocalTime(NeoGPS::time_t gpsTime, const char* tz)
{
- struct tm timeinfo;
- timeinfo.tm_year = (2000 + gpsTime.year) - 1900;
- timeinfo.tm_mon = gpsTime.month - 1;
- timeinfo.tm_mday = gpsTime.date;
- timeinfo.tm_hour = gpsTime.hours;
- timeinfo.tm_min = gpsTime.minutes;
- timeinfo.tm_sec = gpsTime.seconds;
- struct timeval now = { .tv_sec = mktime(&timeinfo) };
- settimeofday(&now, NULL);
-
- setenv("TZ",tz,1);
- tzset();
-
- time_t tLocal = time(NULL);
- time_t tUTC = time(NULL);
- struct tm local_tm;
- struct tm UTC_tm;
- struct tm *tmLocal = localtime_r(&tLocal, &local_tm);
- struct tm *tmUTC = gmtime_r(&tUTC, &UTC_tm);
-
- char buffer[100];
- strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %Z", tmLocal);
- ESP_LOGI(TAG, "Current local time: %s",buffer);
- strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %Z", tmUTC);
- ESP_LOGI(TAG, "Current UTC time: %s", buffer);
-
-
- int UTC = tmLocal->tm_hour - tmUTC->tm_hour;
- if (UTC > 12)
- UTC -= 24;
- else if (UTC < -12)
- UTC += 24;
-
- gpsData.UTC = UTC;
-
- ESP_LOGI(TAG, "UTC: %i", UTC);
-}
\ No newline at end of file
+ struct tm timeinfo;
+ timeinfo.tm_year = (2000 + gpsTime.year) - 1900;
+ timeinfo.tm_mon = gpsTime.month - 1;
+ timeinfo.tm_mday = gpsTime.date;
+ timeinfo.tm_hour = gpsTime.hours;
+ timeinfo.tm_min = gpsTime.minutes;
+ timeinfo.tm_sec = gpsTime.seconds;
+ struct timeval now = { .tv_sec = mktime(&timeinfo) };
+ settimeofday(&now, NULL);
+
+ setenv("TZ",tz,1);
+ tzset();
+
+ time_t tLocal = time(NULL);
+ time_t tUTC = time(NULL);
+ struct tm local_tm;
+ struct tm UTC_tm;
+ struct tm *tmLocal = localtime_r(&tLocal, &local_tm);
+ struct tm *tmUTC = gmtime_r(&tUTC, &UTC_tm);
+
+ char buffer[100];
+ strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %Z", tmLocal);
+ ESP_LOGI(TAG, "Current local time: %s",buffer);
+ strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %Z", tmUTC);
+ ESP_LOGI(TAG, "Current UTC time: %s", buffer);
+
+
+ int UTC = tmLocal->tm_hour - tmUTC->tm_hour;
+ if (UTC > 12)
+ UTC -= 24;
+ else if (UTC < -12)
+ UTC += 24;
+
+ gpsData.UTC = UTC;
+
+ ESP_LOGI(TAG, "UTC: %i", UTC);
+}
+
+/**
+ * @brief Simulates a GPS signal over a preloaded track.
+ *
+ * @details Advances through the provided track data, simulating GPS coordinates and heading.
+ * Applies random offset noise and smoothing to emulate realistic GPS signal behavior.
+ * Updates the simulated GPS data every second if the step distance is above a threshold.
+ *
+ * @param trackData Vector of wayPoints representing the preloaded GPX track.
+ * @param speed Simulated speed in km/h to assign to the GPS data.
+ * @param refresh Simulation update rate refresh in ms
+ */
+void Gps::simFakeGPS(const std::vector& trackData, uint16_t speed, uint16_t refresh)
+{
+ if (millis() - lastSimulationTime > refresh)
+ {
+ lastSimulationTime = millis();
+
+ if (simulationIndex < (int)trackData.size() - 2)
+ {
+ if (simulationIndex == 0)
+ {
+ // --- First point: initialize simulation state ---
+ smoothedLat = trackData[0].lat;
+ smoothedLon = trackData[0].lon;
+ lastSimLat = smoothedLat;
+ lastSimLon = smoothedLon;
+ filteredHeading = 0.0f;
+ accumulatedDist = 0.0f; // Reset accumulated distance for new track
+
+ gpsData.latitude = smoothedLat;
+ gpsData.longitude = smoothedLon;
+ gpsData.heading = filteredHeading;
+ gpsData.speed = speed;
+ }
+ else
+ {
+ float rawLat = trackData[simulationIndex].lat;
+ float rawLon = trackData[simulationIndex].lon;
+
+ // Calculate expected distance based on speed and time
+ float expectedDist = (speed * 1000.0f) / 3600.0f; // Convert km/h to m/s
+
+ // Advance through track points until we've covered the expected distance
+ int currentIndex = simulationIndex;
+ int pointsAdvanced = 0;
+ const float maxSegmentDist = 100.0f; // Filter out unrealistic jumps (>100m)
+
+ // Add expected distance to accumulated distance
+ accumulatedDist += expectedDist;
+
+ while (currentIndex < (int)trackData.size() - 1 && pointsAdvanced < 10) { // Limit to prevent infinite loops
+ int nextIndex = currentIndex + 1;
+ float segmentDist = calcDist(trackData[currentIndex].lat, trackData[currentIndex].lon,
+ trackData[nextIndex].lat, trackData[nextIndex].lon);
+
+ // Skip unrealistic jumps or duplicate points
+ if (segmentDist > maxSegmentDist || segmentDist < 0.1f) {
+ currentIndex = nextIndex;
+ continue;
+ }
+
+ // Check if we can advance to this point
+ if (segmentDist <= accumulatedDist) {
+ accumulatedDist -= segmentDist;
+ currentIndex = nextIndex;
+ pointsAdvanced++;
+ } else {
+ break; // Not enough accumulated distance
+ }
+ }
+
+ // Update simulation index to the final point
+ simulationIndex = currentIndex;
+
+ // Update position to the final point
+ rawLat = trackData[simulationIndex].lat;
+ rawLon = trackData[simulationIndex].lon;
+
+ // --- Apply smoothing BEFORE adding noise ---
+ smoothedLat = posAlpha * rawLat + (1.0f - posAlpha) * smoothedLat;
+ smoothedLon = posAlpha * rawLon + (1.0f - posAlpha) * smoothedLon;
+
+ // --- Small noise to simulate GPS jitter ---
+ float latOffset = random(-3, 3) / 100000.0f; // Reduced noise for simulation
+ float lonOffset = random(-3, 3) / 100000.0f;
+
+ float noisyLat = smoothedLat + latOffset;
+ float noisyLon = smoothedLon + lonOffset;
+
+ // --- Realistic heading based on track direction ---
+ // Look ahead based on speed (faster = further lookahead)
+ int lookAhead = min(max(3, speed / 20), (int)trackData.size() - simulationIndex - 1);
+ int targetIdx = simulationIndex + lookAhead;
+
+ if (targetIdx < (int)trackData.size()) {
+ // Calculate heading towards future track point
+ float targetHeading = calcCourse(smoothedLat, smoothedLon,
+ trackData[targetIdx].lat,
+ trackData[targetIdx].lon);
+
+ if (simulationIndex > 1) {
+ // Smooth transition to target heading (faster adaptation for higher speeds)
+ float headingDiff = calcAngleDiff(targetHeading, filteredHeading);
+ float adaptationRate = min(0.3f, 0.1f + (speed / 200.0f)); // 0.1-0.3 based on speed
+ filteredHeading += adaptationRate * headingDiff;
+ } else {
+ // Initialize with target heading
+ filteredHeading = targetHeading;
+ }
+
+ // Normalize final heading
+ if (filteredHeading < 0.0f) filteredHeading += 360.0f;
+ if (filteredHeading >= 360.0f) filteredHeading -= 360.0f;
+ }
+
+ // --- Final output ---
+ gpsData.latitude = noisyLat;
+ gpsData.longitude = noisyLon;
+ gpsData.heading = filteredHeading;
+ gpsData.speed = speed;
+
+ lastSimLat = rawLat;
+ lastSimLon = rawLon;
+ }
+ simulationIndex++;
+ }
+ else
+ {
+ ESP_LOGI(TAG,"End of GPS signal simulation");
+ }
+ }
+}
diff --git a/lib/gps/gps.hpp b/lib/gps/gps.hpp
index 6b884700..f1b853da 100644
--- a/lib/gps/gps.hpp
+++ b/lib/gps/gps.hpp
@@ -2,106 +2,143 @@
* @file gps.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief GPS definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
+#include "globalGpxDef.h"
#include
#include
#include "settings.hpp"
+#include
-#define DEG2RAD(a) ((a) / (180 / M_PI)) // Convert degrees to radians
-#define RAD2DEG(a) ((a) * (180 / M_PI)) // Convert radians to degrees
-extern uint8_t GPS_TX;
-extern uint8_t GPS_RX;
+extern uint8_t GPS_TX; /**< GPS TX pin number. */
+extern uint8_t GPS_RX; /**< GPS RX pin number. */
-#define MAX_SATELLITES 120
-#define MAX_SATELLLITES_IN_VIEW 32
+#define MAX_SATELLITES 120 /**< Maximum number of satellites supported. */
+#define MAX_SATELLLITES_IN_VIEW 32 /**< Maximum number of satellites in view. */
-#define DEBUG_PORT Serial
-#define gpsPort Serial2
-#define GPS_PORT_NAME "Serial2"
-extern gps_fix fix;
-extern NMEAGPS GPS;
+#define DEBUG_PORT Serial /**< Serial port used for debug output. */
+#define gpsPort Serial2 /**< Serial port used for GPS communication. */
+#define GPS_PORT_NAME "Serial2" /**< Name of the GPS serial port. */
-extern bool setTime;
-void calculateSun();
-const char* getPosixTZ(const char* name);
+extern gps_fix fix; /**< Latest parsed GPS fix data. */
+extern NMEAGPS GPS; /**< NMEAGPS parser instance. */
-extern bool isGpsFixed;
-extern bool isTimeFixed;
-extern long gpsBaudDetected;
-extern bool nmea_output_enable;
+extern bool setTime; /**< Indicates if time should be set from GPS. */
+void calculateSun(); /**< Calculates sunrise and sunset times based on current GPS data. */
-static unsigned long GPS_BAUD[] PROGMEM = {4800, 9600, 19200, 0};
-static const char *GPS_BAUD_PCAS[] PROGMEM = {"$PCAS01,0*1C\r\n", "$PCAS01,1*1D\r\n", "$PCAS01,2*1E\r\n"};
-static const char *GPS_RATE_PCAS[] PROGMEM = {"$PCAS02,1000*2E\r\n", "$PCAS02,500*1A\r\n", "$PCAS02,250*18\r\n", "$PCAS02,200*1D\r\n", "$PCAS02,100*1E\r\n"};
+const char* getPosixTZ(const char* name); /**< Gets the POSIX time zone string for a given time zone name. @param name Time zone name (e.g., "CET", "UTC"). @return POSIX TZ string. */
+
+extern bool isGpsFixed; /**< Indicates whether a valid GPS fix has been acquired. */
+extern bool isTimeFixed; /**< Indicates whether the system time has been fixed using GPS. */
+extern long gpsBaudDetected; /**< Detected GPS baud rate. */
+extern bool nmea_output_enable; /**< Enables or disables NMEA output. */
+
+
+static unsigned long GPS_BAUD[] PROGMEM = {4800, 9600, 19200, 0}; /**< Supported GPS baud rates. */
+static const char *GPS_BAUD_PCAS[] PROGMEM = {"$PCAS01,0*1C\r\n", "$PCAS01,1*1D\r\n", "$PCAS01,2*1E\r\n"}; /**< NMEA command strings to set baud rate for PCAS modules. */
+static const char *GPS_RATE_PCAS[] PROGMEM = {"$PCAS02,1000*2E\r\n", "$PCAS02,500*1A\r\n", "$PCAS02,250*18\r\n", "$PCAS02,200*1D\r\n", "$PCAS02,100*1E\r\n"}; /**< NMEA command strings to set update rate for PCAS modules. */
/**
* @brief Satellite Constellation Canvas Definition
*
*/
-static const uint8_t canvasOffset = 15;
-static const uint8_t canvasSize = 180;
-static const uint8_t canvasCenter_X = canvasSize / 2;
-static const uint8_t canvasCenter_Y = canvasSize / 2;
-static const uint8_t canvasRadius = canvasCenter_X - canvasOffset;
+static const uint8_t canvasOffset = 15; /**< Offset from the edge to start drawing the satellite constellation canvas */
+static const uint8_t canvasSize = 180; /**< Total size (width and height) of the constellation canvas */
+static const uint8_t canvasCenter_X = canvasSize / 2; /**< X coordinate of the canvas center */
+static const uint8_t canvasCenter_Y = canvasSize / 2; /**< Y coordinate of the canvas center */
+static const uint8_t canvasRadius = canvasCenter_X - canvasOffset; /**< Radius of the drawable area for the constellation */
+
+/**
+ * @class GPS
+ * @brief Provides high-level access to GPS data and configuration.
+ *
+ * @details This class manages the GPS module, parsing NMEA data, and provides methods to access
+ * location, speed, satellite count, and other information.
+ */
class Gps
{
public:
- Gps();
- void init();
- double getLat();
- double getLon();
- void getGPSData();
- long detectRate(int rxPin);
- long autoBaud();
- bool isSpeedChanged();
- bool isAltitudeChanged();
- bool hasLocationChange();
- bool isDOPChanged();
- void setLocalTime(NeoGPS::time_t gpsTime, const char* tz);
-
- struct GPSDATA
- {
- uint8_t satellites;
- uint8_t fixMode;
- int16_t altitude;
- uint16_t speed;
- double latitude;
- double longitude;
- uint16_t heading;
- float hdop;
- float pdop;
- float vdop;
- uint8_t satInView;
- char sunriseHour[6];
- char sunsetHour[6];
- int UTC;
- } gpsData;
-
- struct SV
- {
- bool active;
- uint8_t satNum;
- uint8_t elev;
- uint16_t azim;
- uint8_t snr;
- uint16_t posX;
- uint16_t posY;
- char talker_id[3];
- } satTracker[MAX_SATELLITES];
+ Gps();
+ void init();
+ float getLat();
+ float getLon();
+ void getGPSData();
+ long detectRate(int rxPin);
+ long autoBaud();
+ bool isSpeedChanged();
+ bool isAltitudeChanged();
+ bool hasLocationChange();
+ bool isDOPChanged();
+ void setLocalTime(NeoGPS::time_t gpsTime, const char* tz);
+ void simFakeGPS(const std::vector& trackData, uint16_t speed, uint16_t refresh);
+
+ /**
+ * @struct GPSDATA
+ * @brief Holds parsed GPS data for easy access.
+ */
+ struct GPSDATA
+ {
+ uint8_t satellites; /**< Number of satellites used for fix. */
+ uint8_t fixMode; /**< GPS fix mode. */
+ int16_t altitude; /**< Altitude in meters. */
+ uint16_t speed; /**< Speed in km/h or knots. */
+ float latitude; /**< Latitude in decimal degrees. */
+ float longitude; /**< Longitude in decimal degrees. */
+ uint16_t heading; /**< Heading in degrees. */
+ float hdop; /**< Horizontal dilution of precision. */
+ float pdop; /**< Position dilution of precision. */
+ float vdop; /**< Vertical dilution of precision. */
+ uint8_t satInView; /**< Number of satellites in view. */
+ char sunriseHour[6]; /**< Sunrise time as string (HH:MM). */
+ char sunsetHour[6]; /**< Sunset time as string (HH:MM). */
+ int UTC; /**< UTC offset. */
+ } gpsData;
+
+ /**
+ * @struct SV
+ * @brief Holds information about a tracked satellite.
+ */
+ struct SV
+ {
+ bool active; /**< True if the satellite is active. */
+ uint8_t satNum; /**< Satellite number. */
+ uint8_t elev; /**< Elevation in degrees. */
+ uint16_t azim; /**< Azimuth in degrees. */
+ uint8_t snr; /**< Signal-to-noise ratio. */
+ uint16_t posX; /**< X position for display/map. */
+ uint16_t posY; /**< Y position for display/map. */
+ char talker_id[3]; /**< NMEA talker ID. */
+ } satTracker[MAX_SATELLITES];
private:
- uint16_t previousSpeed;
- int16_t previousAltitude;
- double previousLatitude;
- double previousLongitude;
- float previousHdop;
- float previousPdop;
- float previousVdop;
+ uint16_t previousSpeed; /**< Previous speed value for change detection. */
+ int16_t previousAltitude; /**< Previous altitude value for change detection. */
+ float previousLatitude; /**< Previous latitude for change detection. */
+ float previousLongitude; /**< Previous longitude for change detection. */
+ float previousHdop; /**< Previous HDOP for change detection. */
+ float previousPdop; /**< Previous PDOP for change detection. */
+ float previousVdop; /**< Previous VDOP for change detection. */
+
+ /**
+ * @brief Variables for "fake" GPS signal from loaded track (simulation)
+ *
+ */
+ const float posAlpha = 0.6f; /**< Position smoothing factor, range 0 (no smoothing) to 1 (full smoothing) */
+ const float headAlpha = 0.5f; /**< Heading smoothing factor, controls how fast heading adapts */
+ const float minStepDist = 3.0f; /**< Minimum distance in meters between simulation steps to update */
+ const int headingLookahead = 5; /**< Number of track points ahead used to calculate the heading */
+ float smoothedLat = 0.0f; /**< Smoothed latitude after filtering */
+ float smoothedLon = 0.0f; /**< Smoothed longitude after filtering */
+ float filteredHeading = 0.0f; /**< Smoothed heading after filtering */
+ float lastSimLat = 0.0f; /**< Last simulated latitude used for step distance */
+ float lastSimLon = 0.0f; /**< Last simulated longitude used for step distance */
+ float accumulatedDist = 0.0f; /**< Accumulated distance for multi-second simulation */
+ int simulationIndex = 0; /**< Current index in track simulation */
+ unsigned long lastSimulationTime = 0; /**< Timestamp of last simulation update in milliseconds */
};
\ No newline at end of file
diff --git a/lib/gpx/src/globalGpxDef.h b/lib/gpx/src/globalGpxDef.h
index 3738b20d..46a00eb7 100644
--- a/lib/gpx/src/globalGpxDef.h
+++ b/lib/gpx/src/globalGpxDef.h
@@ -2,8 +2,8 @@
* @file globalGpxDef.h
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief Global GPX Variables
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -11,53 +11,64 @@
#include
#include
-static const char* wptFile PROGMEM = "/sdcard/WPT/waypoint.gpx";
-static const char* wptFolder PROGMEM = "/sdcard/WPT";
-static const char* trkFolder PROGMEM = "/sdcard/TRK";
+static const char* wptFile PROGMEM = "/sdcard/WPT/waypoint.gpx"; /**< Path to the waypoint GPX file on the SD card. */
+static const char* wptFolder PROGMEM = "/sdcard/WPT"; /**< Path to the waypoint folder on the SD card. */
+static const char* trkFolder PROGMEM = "/sdcard/TRK"; /**< Path to the track folder on the SD card. */
/**
* @brief Waypoint action enum
*
+ * @details Enumeration of possible actions for GPX waypoints.
*/
enum gpxAction_t
{
- WPT_NONE,
- WPT_ADD,
- GPX_LOAD,
- GPX_EDIT,
- GPX_DEL,
+ WPT_NONE, /**< No waypoint action. */
+ WPT_ADD, /**< Add a new waypoint. */
+ GPX_LOAD, /**< Load waypoints from GPX file. */
+ GPX_EDIT, /**< Edit an existing waypoint. */
+ GPX_DEL, /**< Delete a waypoint. */
};
-/**
- * @brief Waypoint Action
- *
- */
-extern uint8_t gpxAction;
+extern uint8_t gpxAction; /**< Indicates the current GPX waypoint action to be performed. */
/**
* @brief Waypoint Structure
*
+ * @details Stores information related to a GPS waypoint.
*/
struct wayPoint
{
- double lat;
- double lon;
- float ele;
- char* time;
- char* name;
- char* desc;
- char* src;
- char* sym;
- char* type;
- uint8_t sat;
- float hdop;
- float vdop;
- float pdop;
+ float lat; /**< Latitude of the waypoint. */
+ float lon; /**< Longitude of the waypoint. */
+ float ele; /**< Elevation of the waypoint. */
+ char* time; /**< Timestamp of the waypoint (ISO 8601). */
+ char* name; /**< Name of the waypoint. */
+ char* desc; /**< Description of the waypoint. */
+ char* src; /**< Source of the waypoint data. */
+ char* sym; /**< Symbol associated with the waypoint. */
+ char* type; /**< Type/category of the waypoint. */
+ uint8_t sat; /**< Number of satellites used for this fix. */
+ float hdop; /**< Horizontal dilution of precision. */
+ float vdop; /**< Vertical dilution of precision. */
+ float pdop; /**< Position dilution of precision. */
};
+/**
+ * @brief Track turn points structure
+ *
+ * @details Structure representing a track turn point
+ */
+struct TurnPoint
+{
+ int idx; /**< Index of the track point */
+ float angle; /**< Turn angle at this point (positive = right, negative = left) */
+ float distance; /**< Distance from start to this point (in meters) */
+};
+
/**
* @Brief GPX header file format
*
+ * @details Static string containing the standard GPX 1.0 file header, to be used when creating new GPX files.
*/
static const char* gpxHeader PROGMEM = { "\n"
"> Map where the key is the file name and the value is a vector of tag element value.
+ * @return std::map> Map where the key is the file name and the value is a vector of tag element values.
*/
std::map> GPXParser::getTagElementList(const char* tag, const char* element, const std::string& folderPath)
{
- std::map> elementsByFile;
-
- DIR* dir = opendir(folderPath.c_str());
- if (!dir)
- {
- ESP_LOGE(TAGGPX, "Failed to open folder: %s", folderPath.c_str());
- return elementsByFile;
- }
-
- struct dirent* entry;
- while ((entry = readdir(dir)) != nullptr)
- {
- if (entry->d_type == DT_REG)
- {
- std::string fileName = entry->d_name;
-
- if (fileName.size() >= 4 && fileName.substr(fileName.size() - 4) == ".gpx")
- {
- std::string filePath = folderPath + "/" + fileName;
-
- GPXParser parser(filePath.c_str());
- std::vector elementValue;
-
- tinyxml2::XMLDocument doc;
- tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
- if (result == tinyxml2::XML_SUCCESS)
- {
- tinyxml2::XMLElement* root = doc.RootElement();
- if (root)
- {
- for (tinyxml2::XMLElement* Tag = root->FirstChildElement(tag); Tag!= nullptr; Tag = Tag->NextSiblingElement(tag))
- {
- tinyxml2::XMLElement* valueElement = Tag->FirstChildElement(element);
- if (valueElement)
- {
- const char* value = valueElement->GetText();
- if (value)
- elementValue.push_back(value);
- }
- }
- }
- else
- ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
- }
- else
- ESP_LOGE(TAGGPX, "Failed to load GPX file: %s", filePath.c_str());
-
- elementsByFile[fileName] = elementValue;
- }
- }
- }
-
- closedir(dir);
- return elementsByFile;
+ std::map> elementsByFile;
+
+ DIR* dir = opendir(folderPath.c_str());
+ if (!dir)
+ {
+ ESP_LOGE(TAGGPX, "Failed to open folder: %s", folderPath.c_str());
+ return elementsByFile;
+ }
+
+ struct dirent* entry;
+ while ((entry = readdir(dir)) != nullptr)
+ {
+ if (entry->d_type == DT_REG)
+ {
+ std::string fileName = entry->d_name;
+
+ if (fileName.size() >= 4 && fileName.substr(fileName.size() - 4) == ".gpx")
+ {
+ std::string filePath = folderPath + "/" + fileName;
+
+ GPXParser parser(filePath.c_str());
+ std::vector elementValue;
+
+ tinyxml2::XMLDocument doc;
+ tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
+ if (result == tinyxml2::XML_SUCCESS)
+ {
+ tinyxml2::XMLElement* root = doc.RootElement();
+ if (root)
+ {
+ for (tinyxml2::XMLElement* Tag = root->FirstChildElement(tag); Tag!= nullptr; Tag = Tag->NextSiblingElement(tag))
+ {
+ tinyxml2::XMLElement* valueElement = Tag->FirstChildElement(element);
+ if (valueElement)
+ {
+ const char* value = valueElement->GetText();
+ if (value)
+ elementValue.push_back(value);
+ }
+ }
+ }
+ else
+ ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
+ }
+ else
+ ESP_LOGE(TAGGPX, "Failed to load GPX file: %s", filePath.c_str());
+
+ elementsByFile[fileName] = elementValue;
+ }
+ }
+ }
+
+ closedir(dir);
+ return elementsByFile;
}
/**
* @brief Delete a tag from the GPX file with specified name value
*
- * @param tag
- * @param name The name value to delete
- * @return true if the waypoint was deleted successfully, false otherwise
+ * @details Loads the GPX file, searches for the first tag whose element matches the provided name,
+ * deletes it, and saves the file. Returns true if deletion was successful, false otherwise.
+ *
+ * @param tag The XML tag to search for (e.g., "wpt" for waypoint).
+ * @param name The name value to match for deletion.
+ * @return true if the tag was deleted successfully, false otherwise.
*/
bool GPXParser::deleteTagByName(const char* tag, const char* name)
{
- tinyxml2::XMLDocument doc;
- tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
- return false;
- }
-
- tinyxml2::XMLElement* root = doc.RootElement();
- if (!root)
- {
- ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
- return false;
- }
-
- for (tinyxml2::XMLElement* Tag = root->FirstChildElement(tag); Tag != nullptr; Tag = Tag->NextSiblingElement(tag))
- {
- tinyxml2::XMLElement* nameElement = Tag->FirstChildElement(gpxNameElem);
- if (nameElement && strcmp(nameElement->GetText(), name) == 0)
- {
- root->DeleteChild(Tag);
- result = doc.SaveFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
- return false;
- }
-
- // if (!root->FirstChildElement(gpxWaypointTag))
- // {
- // if (!root->FirstChildElement(gpxTrackTag))
- // {
- // if (remove(filePath.c_str()) != 0)
- // {
- // ESP_LOGE(TAGGPX, "Failed to delete file: %s", filePath.c_str());
- // return false;
- // }
- // ESP_LOGI(TAGGPX, "File %s deleted as it had no waypoints or tracks left", filePath.c_str());
- // }
- // else
- // {
- // ESP_LOGI(TAGGPX, "File %s not deleted as it contains tracks but no waypoints", filePath.c_str());
- // }
- // }
- return true;
- }
- }
-
- ESP_LOGE(TAGGPX, "Tag with name %s not found in file: %s", name, filePath.c_str());
- return false;
+ tinyxml2::XMLDocument doc;
+ tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
+ return false;
+ }
+
+ tinyxml2::XMLElement* root = doc.RootElement();
+ if (!root)
+ {
+ ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
+ return false;
+ }
+
+ for (tinyxml2::XMLElement* Tag = root->FirstChildElement(tag); Tag != nullptr; Tag = Tag->NextSiblingElement(tag))
+ {
+ tinyxml2::XMLElement* nameElement = Tag->FirstChildElement(gpxNameElem);
+ if (nameElement && strcmp(nameElement->GetText(), name) == 0)
+ {
+ root->DeleteChild(Tag);
+ result = doc.SaveFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
+ return false;
+ }
+
+ // if (!root->FirstChildElement(gpxWaypointTag))
+ // {
+ // if (!root->FirstChildElement(gpxTrackTag))
+ // {
+ // if (remove(filePath.c_str()) != 0)
+ // {
+ // ESP_LOGE(TAGGPX, "Failed to delete file: %s", filePath.c_str());
+ // return false;
+ // }
+ // ESP_LOGI(TAGGPX, "File %s deleted as it had no waypoints or tracks left", filePath.c_str());
+ // }
+ // else
+ // {
+ // ESP_LOGI(TAGGPX, "File %s not deleted as it contains tracks but no waypoints", filePath.c_str());
+ // }
+ // }
+ return true;
+ }
+ }
+
+ ESP_LOGE(TAGGPX, "Tag with name %s not found in file: %s", name, filePath.c_str());
+ return false;
}
/**
* @brief Retrieve waypoint details for a given name from a GPX file
*
+ * @details Searches the GPX file for a waypoint with the given name and returns its details.
+ *
* @param name Waypoint name to search for
- * @return wayPoint Struct containing waypoint details
+ * @return wayPoint Struct containing waypoint details (fields are zeroed/empty if not found)
*/
wayPoint GPXParser::getWaypointInfo(const char* name)
{
- wayPoint wp = {0};
-
- tinyxml2::XMLDocument doc;
- tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
- return wp;
- }
-
- tinyxml2::XMLElement* root = doc.RootElement();
- if (!root)
- {
- ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
- return wp;
- }
-
- tinyxml2::XMLElement* wpt = nullptr;
- for (wpt = root->FirstChildElement(gpxWaypointTag); wpt != nullptr; wpt = wpt->NextSiblingElement(gpxWaypointTag))
- {
- tinyxml2::XMLElement* nameElement = wpt->FirstChildElement(gpxNameElem);
- if (nameElement && strcmp(nameElement->GetText(), name) == 0)
- {
- wp.name = strdup(nameElement->GetText());
- break;
- }
- }
-
- if (wpt)
- {
- wpt->QueryDoubleAttribute(gpxLatElem, &wp.lat);
- wpt->QueryDoubleAttribute(gpxLonElem, &wp.lon);
-
- tinyxml2::XMLElement* element = nullptr;
-
- element = wpt->FirstChildElement(gpxEleElem);
- if (element)
- wp.ele = static_cast(element->DoubleText());
-
- element = wpt->FirstChildElement(gpxTimeElem);
- if (element)
- wp.time = strdup(element->GetText());
-
- element = wpt->FirstChildElement(gpxDescElem);
- if (element)
- wp.desc = strdup(element->GetText());
-
- element = wpt->FirstChildElement(gpxSrcElem);
- if (element)
- wp.src = strdup(element->GetText());
-
- element = wpt->FirstChildElement(gpxSymElem);
- if (element)
- wp.sym = strdup(element->GetText());
-
- element = wpt->FirstChildElement(gpxTypeElem);
- if (element)
- wp.type = strdup(element->GetText());
-
- element = wpt->FirstChildElement(gpxSatElem);
- if (element)
- wp.sat = static_cast(element->UnsignedText());
-
- element = wpt->FirstChildElement(gpxHdopElem);
- if (element)
- wp.hdop = static_cast(element->DoubleText());
-
- element = wpt->FirstChildElement(gpxVdopElem);
- if (element)
- wp.vdop = static_cast(element->DoubleText());
-
- element = wpt->FirstChildElement(gpxPdopElem);
- if (element)
- wp.pdop = static_cast(element->DoubleText());
- }
- else
- ESP_LOGE(TAGGPX, "Waypoint with name %s not found in file: %s", name, filePath.c_str());
-
- return wp;
+ wayPoint wp = {0};
+
+ tinyxml2::XMLDocument doc;
+ tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
+ return wp;
+ }
+
+ tinyxml2::XMLElement* root = doc.RootElement();
+ if (!root)
+ {
+ ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
+ return wp;
+ }
+
+ tinyxml2::XMLElement* wpt = nullptr;
+ for (wpt = root->FirstChildElement(gpxWaypointTag); wpt != nullptr; wpt = wpt->NextSiblingElement(gpxWaypointTag))
+ {
+ tinyxml2::XMLElement* nameElement = wpt->FirstChildElement(gpxNameElem);
+ if (nameElement && strcmp(nameElement->GetText(), name) == 0)
+ {
+ wp.name = strdup(nameElement->GetText());
+ break;
+ }
+ }
+
+ if (wpt)
+ {
+ wpt->QueryFloatAttribute(gpxLatElem, &wp.lat);
+ wpt->QueryFloatAttribute(gpxLonElem, &wp.lon);
+
+ tinyxml2::XMLElement* element = nullptr;
+
+ element = wpt->FirstChildElement(gpxEleElem);
+ if (element)
+ wp.ele = static_cast(element->DoubleText());
+
+ element = wpt->FirstChildElement(gpxTimeElem);
+ if (element)
+ wp.time = strdup(element->GetText());
+
+ element = wpt->FirstChildElement(gpxDescElem);
+ if (element)
+ wp.desc = strdup(element->GetText());
+
+ element = wpt->FirstChildElement(gpxSrcElem);
+ if (element)
+ wp.src = strdup(element->GetText());
+
+ element = wpt->FirstChildElement(gpxSymElem);
+ if (element)
+ wp.sym = strdup(element->GetText());
+
+ element = wpt->FirstChildElement(gpxTypeElem);
+ if (element)
+ wp.type = strdup(element->GetText());
+
+ element = wpt->FirstChildElement(gpxSatElem);
+ if (element)
+ wp.sat = static_cast(element->UnsignedText());
+
+ element = wpt->FirstChildElement(gpxHdopElem);
+ if (element)
+ wp.hdop = static_cast(element->DoubleText());
+
+ element = wpt->FirstChildElement(gpxVdopElem);
+ if (element)
+ wp.vdop = static_cast(element->DoubleText());
+
+ element = wpt->FirstChildElement(gpxPdopElem);
+ if (element)
+ wp.pdop = static_cast(element->DoubleText());
+ }
+ else
+ ESP_LOGE(TAGGPX, "Waypoint with name %s not found in file: %s", name, filePath.c_str());
+
+ return wp;
}
-
+
/**
* @brief Add a new waypoint to the GPX file
*
+ * @details Adds a new waypoint with the provided details to the GPX file. All required GPX elements are populated,
+ * and the waypoint is inserted at the end of the waypoint list. Returns true if the waypoint was added successfully,
+ * false otherwise.
+ *
* @param wp Waypoint struct containing the waypoint details
* @return true if the waypoint was added successfully, false otherwise
*/
bool GPXParser::addWaypoint(const wayPoint& wp)
{
- time_t tUTCwpt = time(NULL);
- struct tm UTCwpt_tm;
- struct tm *tmUTCwpt = gmtime_r(&tUTCwpt, &UTCwpt_tm);
- char textFmt[30];
- strftime(textFmt, sizeof(textFmt), "%Y-%m-%dT%H:%M:%SZ", tmUTCwpt);
-
- tinyxml2::XMLDocument doc;
- tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
- return false;
- }
-
- tinyxml2::XMLElement* root = doc.RootElement();
- if (!root)
- {
- ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
- return false;
- }
-
- tinyxml2::XMLElement* newWpt = doc.NewElement(gpxWaypointTag);
- newWpt->SetAttribute(gpxLatElem, formatDouble(wp.lat, 6).c_str());
- newWpt->SetAttribute(gpxLonElem, formatDouble(wp.lon, 6).c_str());
-
- tinyxml2::XMLElement* element = nullptr;
-
- element = doc.NewElement(gpxEleElem);
- element->SetText(wp.ele);
- newWpt->InsertEndChild(element);
-
- element = doc.NewElement(gpxTimeElem);
- element->SetText(textFmt);
- newWpt->InsertEndChild(element);
-
- element = doc.NewElement(gpxNameElem);
- element->SetText(wp.name ? wp.name : "");
- newWpt->InsertEndChild(element);
-
- // element = doc.NewElement(gpxDescElem);
- // element->SetText(wp.desc ? wp.desc : "");
- // newWpt->InsertEndChild(element);
-
- element = doc.NewElement(gpxSrcElem);
- element->SetText(wp.src ? wp.src : "IceNav");
- newWpt->InsertEndChild(element);
-
- // element = doc.NewElement(gpxSymElem);
- // element->SetText(wp.sym ? wp.sym : "");
- // newWpt->InsertEndChild(element);
-
- // element = doc.NewElement(gpxTypeElem);
- // element->SetText(wp.type ? wp.type : "");
- // newWpt->InsertEndChild(element);
-
- element = doc.NewElement(gpxSatElem);
- element->SetText(wp.sat);
- newWpt->InsertEndChild(element);
-
- element = doc.NewElement(gpxHdopElem);
- element->SetText(wp.hdop);
- newWpt->InsertEndChild(element);
-
- element = doc.NewElement(gpxVdopElem);
- element->SetText(wp.vdop);
- newWpt->InsertEndChild(element);
-
- element = doc.NewElement(gpxPdopElem);
- element->SetText(wp.pdop);
- newWpt->InsertEndChild(element);
-
- tinyxml2::XMLElement* lastWpt = root->LastChildElement(gpxWaypointTag);
- if (lastWpt)
- root->InsertAfterChild(lastWpt, newWpt);
- else
- root->InsertFirstChild(newWpt);
-
- result = doc.SaveFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
- return false;
- }
- return result == tinyxml2::XML_SUCCESS;
+ time_t tUTCwpt = time(NULL);
+ struct tm UTCwpt_tm;
+ struct tm *tmUTCwpt = gmtime_r(&tUTCwpt, &UTCwpt_tm);
+ char textFmt[30];
+ strftime(textFmt, sizeof(textFmt), "%Y-%m-%dT%H:%M:%SZ", tmUTCwpt);
+
+ tinyxml2::XMLDocument doc;
+ tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
+ return false;
+ }
+
+ tinyxml2::XMLElement* root = doc.RootElement();
+ if (!root)
+ {
+ ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
+ return false;
+ }
+
+ tinyxml2::XMLElement* newWpt = doc.NewElement(gpxWaypointTag);
+ newWpt->SetAttribute(gpxLatElem, formatFloat(wp.lat, 6).c_str());
+ newWpt->SetAttribute(gpxLonElem, formatFloat(wp.lon, 6).c_str());
+
+ tinyxml2::XMLElement* element = nullptr;
+
+ element = doc.NewElement(gpxEleElem);
+ element->SetText(wp.ele);
+ newWpt->InsertEndChild(element);
+
+ element = doc.NewElement(gpxTimeElem);
+ element->SetText(textFmt);
+ newWpt->InsertEndChild(element);
+
+ element = doc.NewElement(gpxNameElem);
+ element->SetText(wp.name ? wp.name : "");
+ newWpt->InsertEndChild(element);
+
+ // element = doc.NewElement(gpxDescElem);
+ // element->SetText(wp.desc ? wp.desc : "");
+ // newWpt->InsertEndChild(element);
+
+ element = doc.NewElement(gpxSrcElem);
+ element->SetText(wp.src ? wp.src : "IceNav");
+ newWpt->InsertEndChild(element);
+
+ // element = doc.NewElement(gpxSymElem);
+ // element->SetText(wp.sym ? wp.sym : "");
+ // newWpt->InsertEndChild(element);
+
+ // element = doc.NewElement(gpxTypeElem);
+ // element->SetText(wp.type ? wp.type : "");
+ // newWpt->InsertEndChild(element);
+
+ element = doc.NewElement(gpxSatElem);
+ element->SetText(wp.sat);
+ newWpt->InsertEndChild(element);
+
+ element = doc.NewElement(gpxHdopElem);
+ element->SetText(wp.hdop);
+ newWpt->InsertEndChild(element);
+
+ element = doc.NewElement(gpxVdopElem);
+ element->SetText(wp.vdop);
+ newWpt->InsertEndChild(element);
+
+ element = doc.NewElement(gpxPdopElem);
+ element->SetText(wp.pdop);
+ newWpt->InsertEndChild(element);
+
+ tinyxml2::XMLElement* lastWpt = root->LastChildElement(gpxWaypointTag);
+ if (lastWpt)
+ root->InsertAfterChild(lastWpt, newWpt);
+ else
+ root->InsertFirstChild(newWpt);
+
+ result = doc.SaveFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
+ return false;
+ }
+ return result == tinyxml2::XML_SUCCESS;
}
/**
- * @brief Load GPX track data and store coordinates from '' structure.
+* @brief Load GPX track data and store coordinates from '' structure.
+*
+* @details Loads all track points from the `` structure in the GPX file, extracting latitude and longitude for each ``,
+* and stores them as `wayPoint` structures in the provided vector. Returns true if the operation was successful, or false on error.
+*
+* @param trackData Vector to store track points (each point is a wayPoint).
+* @return true if the track data was loaded successfully, false otherwise.
+*/
+bool GPXParser::loadTrack(std::vector& trackData)
+{
+ tinyxml2::XMLDocument doc;
+ tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
+ return false;
+ }
+
+ tinyxml2::XMLElement* root = doc.RootElement();
+ if (!root)
+ {
+ ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
+ return false;
+ }
+
+ // Iterate through elements
+ for (tinyxml2::XMLElement* trk = root->FirstChildElement(gpxTrackTag); trk != nullptr; trk = trk->NextSiblingElement(gpxTrackTag))
+ {
+ // Iterate through elements
+ for (tinyxml2::XMLElement* trkseg = trk->FirstChildElement("trkseg"); trkseg != nullptr; trkseg = trkseg->NextSiblingElement("trkseg"))
+ {
+ // Iterate through elements
+ for (tinyxml2::XMLElement* trkpt = trkseg->FirstChildElement("trkpt"); trkpt != nullptr; trkpt = trkpt->NextSiblingElement("trkpt"))
+ {
+ wayPoint point = {0};
+
+ // Extract latitude and longitude
+ trkpt->QueryFloatAttribute(gpxLatElem, &point.lat);
+ trkpt->QueryFloatAttribute(gpxLonElem, &point.lon);
+
+ // // Extract optional elements
+ // tinyxml2::XMLElement* ele = trkpt->FirstChildElement("ele");
+ // if (ele) point.ele = static_cast(ele->DoubleText());
+
+ // tinyxml2::XMLElement* time = trkpt->FirstChildElement("time");
+ // if (time) point.time = strdup(time->GetText());
+
+ trackData.push_back(point);
+ }
+ }
+ }
+
+ return true;
+}
+
+// /**
+// * @brief Detect turn points in a track using a sliding window approach.
+// *
+// * This function processes the given track using a sliding window of configurable size.
+// * It calculates the angle between the start and end segments of the window to detect turns.
+// * A turn point is added if the global angle exceeds `thresholdDeg` and the total distance
+// * within the window is above `minDist`. Sharp turns above `sharpTurnDeg` are always included,
+// * regardless of distance.
+// *
+// * @param thresholdDeg Minimum angle difference (in degrees) to consider a turn.
+// * @param minDist Minimum total distance (in meters) within the window to validate a turn.
+// * @param sharpTurnDeg Angle (in degrees) above which any turn is considered sharp and relevant.
+// * @param windowSize Number of points before and after the center point to define the sliding window.
+// * @param trackData Vector of wayPoint structures representing the track to analyze.
+// * @return std::vector List of detected turn points:
+// * - index: index in trackData of the turn
+// * - angle: angle difference at turn (degrees, positive = right, negative = left)
+// * - accumDist: accumulated distance from the start of the track to this turn (meters)
+// */
+// std::vector GPXParser::getTurnPointsSlidingWindow(
+// float thresholdDeg, float minDist, float sharpTurnDeg,
+// int windowSize, const std::vector& trackData)
+// {
+// std::vector turnPoints;
+// float accumDist = 0.0f;
+
+// if (trackData.size() < 2 * windowSize + 1)
+// return turnPoints;
+
+// for (size_t i = windowSize; i < trackData.size() - windowSize; ++i)
+// {
+// float distWindow = 0.0f;
+// for (int j = int(i - windowSize); j < int(i + windowSize); ++j)
+// distWindow += calcDist(trackData[j].lat, trackData[j].lon,
+// trackData[j+1].lat, trackData[j+1].lon);
+
+// float brgStart = calcCourse(trackData[i - windowSize].lat, trackData[i - windowSize].lon,
+// trackData[i].lat, trackData[i].lon);
+// float brgEnd = calcCourse(trackData[i].lat, trackData[i].lon,
+// trackData[i + windowSize].lat, trackData[i + windowSize].lon);
+// float diff = calcAngleDiff(brgEnd, brgStart);
+
+// accumDist += calcDist(trackData[i-1].lat, trackData[i-1].lon,
+// trackData[i].lat, trackData[i].lon);
+
+// if (std::fabs(diff) > sharpTurnDeg)
+// {
+// turnPoints.push_back({static_cast(i), diff, accumDist});
+// continue;
+// }
+// if (distWindow < minDist)
+// continue;
+// if (std::fabs(diff) > thresholdDeg)
+// turnPoints.push_back({static_cast(i), diff, accumDist});
+// }
+// return turnPoints;
+// }
+
+/**
+ * @brief Detects turn points in a GPX track using a sliding window approach.
+ *
+ * @details This function analyzes a track using a window of N points before and after each point
+ * to estimate the turning angle between segments. It avoids false positives by skipping
+ * windows with abnormally large jumps (e.g., GPS noise or corrupt data).
*
- * @param trackData Vector to store track points (each point is a wayPoint).
- * @return true if the track data was loaded successfully, false otherwise.
+ * @param thresholdDeg Minimum angle (deg) to consider a turn.
+ * @param minDist Minimum distance (m) of the whole window to consider a valid curve.
+ * @param sharpTurnDeg Angle threshold (deg) for forced sharp turns.
+ * @param windowSize Number of points before/after to use in the window.
+ * @param trackData The vector of waypoints forming the track.
+ * @return A vector of TurnPoint structures.
*/
-bool GPXParser::loadTrack(std::vector& trackData)
+std::vector GPXParser::getTurnPointsSlidingWindow(
+ float thresholdDeg, float minDist, float sharpTurnDeg,
+ int windowSize, const std::vector& trackData)
{
- tinyxml2::XMLDocument doc;
- tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
- return false;
- }
-
- tinyxml2::XMLElement* root = doc.RootElement();
- if (!root)
- {
- ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
- return false;
- }
-
- // Iterate through elements
- for (tinyxml2::XMLElement* trk = root->FirstChildElement(gpxTrackTag); trk != nullptr; trk = trk->NextSiblingElement(gpxTrackTag))
- {
- // Iterate through elements
- for (tinyxml2::XMLElement* trkseg = trk->FirstChildElement("trkseg"); trkseg != nullptr; trkseg = trkseg->NextSiblingElement("trkseg"))
+ std::vector turnPoints;
+ float accumDist = 0.0f;
+
+ if (trackData.size() < 2 * windowSize + 1)
+ return turnPoints;
+
+ for (size_t i = windowSize; i < trackData.size() - windowSize; ++i)
{
- // Iterate through elements
- for (tinyxml2::XMLElement* trkpt = trkseg->FirstChildElement("trkpt"); trkpt != nullptr; trkpt = trkpt->NextSiblingElement("trkpt"))
- {
- wayPoint point = {0};
+ float distWindow = 0.0f;
+ bool skipWindow = false;
+
+ for (int j = int(i - windowSize); j < int(i + windowSize); ++j)
+ {
+ float d = calcDist(trackData[j].lat, trackData[j].lon,
+ trackData[j + 1].lat, trackData[j + 1].lon);
+
+ if (d > 200.0f)
+ { // Skip if suspicious jump
+ skipWindow = true;
+ break;
+ }
- // Extract latitude and longitude
- trkpt->QueryDoubleAttribute(gpxLatElem, &point.lat);
- trkpt->QueryDoubleAttribute(gpxLonElem, &point.lon);
+ distWindow += d;
+ }
+
+ if (skipWindow)
+ continue;
- // // Extract optional elements
- // tinyxml2::XMLElement* ele = trkpt->FirstChildElement("ele");
- // if (ele) point.ele = static_cast(ele->DoubleText());
+ float brgStart = calcCourse(trackData[i - windowSize].lat, trackData[i - windowSize].lon,
+ trackData[i].lat, trackData[i].lon);
+ float brgEnd = calcCourse(trackData[i].lat, trackData[i].lon,
+ trackData[i + windowSize].lat, trackData[i + windowSize].lon);
+ float diff = calcAngleDiff(brgEnd, brgStart);
- // tinyxml2::XMLElement* time = trkpt->FirstChildElement("time");
- // if (time) point.time = strdup(time->GetText());
+ accumDist += calcDist(trackData[i - 1].lat, trackData[i - 1].lon,
+ trackData[i].lat, trackData[i].lon);
- trackData.push_back(point);
- }
+ if (std::fabs(diff) > sharpTurnDeg)
+ {
+ turnPoints.push_back({static_cast(i), diff, accumDist});
+ continue;
+ }
+
+ if (distWindow < minDist)
+ continue;
+
+ if (std::fabs(diff) > thresholdDeg)
+ turnPoints.push_back({static_cast(i), diff, accumDist});
}
- }
- return true;
+ return turnPoints;
}
-
diff --git a/lib/gpx/src/gpxParser.hpp b/lib/gpx/src/gpxParser.hpp
index 19f4cdda..d34f4b61 100644
--- a/lib/gpx/src/gpxParser.hpp
+++ b/lib/gpx/src/gpxParser.hpp
@@ -2,8 +2,8 @@
* @file gpxParser.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief GPX Parser class
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -19,184 +19,189 @@
#include "esp_log.h"
#include "tinyxml2.h"
#include "globalGpxDef.h"
+#include "gpsMath.hpp"
static const char* TAGGPX PROGMEM = "GPXParser";
-static const char* gpxWaypointTag PROGMEM = "wpt";
-static const char* gpxTrackTag PROGMEM = "trk";
-static const char* gpxNameElem PROGMEM = "name";
-static const char* gpxLatElem PROGMEM = "lat";
-static const char* gpxLonElem PROGMEM = "lon";
-static const char* gpxEleElem PROGMEM ="ele";
-static const char* gpxTimeElem PROGMEM = "time";
-static const char* gpxDescElem PROGMEM = "desc";
-static const char* gpxSrcElem PROGMEM = "src";
-static const char* gpxSymElem PROGMEM = "sym";
-static const char* gpxTypeElem PROGMEM = "type";
-static const char* gpxSatElem PROGMEM = "sat";
-static const char* gpxHdopElem PROGMEM = "hdop";
-static const char* gpxVdopElem PROGMEM = "vdop";
-static const char* gpxPdopElem PROGMEM = "pdop";
+static const char* gpxWaypointTag PROGMEM = "wpt"; /**< GPX waypoint tag. */
+static const char* gpxTrackTag PROGMEM = "trk"; /**< GPX track tag. */
+static const char* gpxNameElem PROGMEM = "name"; /**< GPX name element. */
+static const char* gpxLatElem PROGMEM = "lat"; /**< GPX latitude attribute. */
+static const char* gpxLonElem PROGMEM = "lon"; /**< GPX longitude attribute. */
+static const char* gpxEleElem PROGMEM = "ele"; /**< GPX elevation element. */
+static const char* gpxTimeElem PROGMEM = "time"; /**< GPX time element. */
+static const char* gpxDescElem PROGMEM = "desc"; /**< GPX description element. */
+static const char* gpxSrcElem PROGMEM = "src"; /**< GPX source element. */
+static const char* gpxSymElem PROGMEM = "sym"; /**< GPX symbol element. */
+static const char* gpxTypeElem PROGMEM = "type"; /**< GPX type element. */
+static const char* gpxSatElem PROGMEM = "sat"; /**< GPX satellites element. */
+static const char* gpxHdopElem PROGMEM = "hdop"; /**< GPX horizontal dilution of precision element. */
+static const char* gpxVdopElem PROGMEM = "vdop"; /**< GPX vertical dilution of precision element. */
+static const char* gpxPdopElem PROGMEM = "pdop"; /**< GPX position dilution of precision element. */
+/**
+ * @class GPXParser
+ * @brief GPX file parser and editor class.
+ */
class GPXParser
{
- public:
- GPXParser(const char* filePath);
- GPXParser();
- ~GPXParser();
+public:
+ GPXParser(const char* filePath);
+ GPXParser();
+ ~GPXParser();
-
- template
- bool editTagAttrOrElem(const char* tag, const char* attribute, const char* element, const T& oldValue, const T& newValue);
- template
- bool insertTagAttrOrElem(const char* tag, const char* attribute, const char* element, const T& value);
+ template
+ bool editTagAttrOrElem(const char* tag, const char* attribute, const char* element, const T& oldValue, const T& newValue);
+ template
+ bool insertTagAttrOrElem(const char* tag, const char* attribute, const char* element, const T& value);
static std::map> getTagElementList(const char* tag, const char* element, const std::string& folderPath);
bool deleteTagByName(const char* tag, const char* name);
wayPoint getWaypointInfo(const char* name);
bool addWaypoint(const wayPoint& wp);
bool loadTrack(std::vector& trackData);
+ std::vector getTurnPointsSlidingWindow(float thresholdDeg, float minDist, float sharpTurnDeg,int windowSize, const std::vector& trackData);
- std::string filePath;
+ std::string filePath;
};
/**
- * @brief Edit tag attribute or element value in the GPX file
- *
- * @param tag
- * @param attribute nullptr for edit element
- * @param element nullptr for edit attribute
- * @param oldValue The old value of the attribute or element
- * @param newValue The new value of the attribute or element
- * @return true if the tag attribute or element value was edited successfully, false otherwise
- */
+* @brief Edit a tag, attribute, or element in the GPX file.
+*
+* @param tag XML tag name.
+* @param attribute XML attribute name (can be nullptr).
+* @param element XML element name (can be nullptr).
+* @param oldValue Old value to find.
+* @param newValue New value to replace with.
+* @return true if the edit was successful, false otherwise.
+*/
template
bool GPXParser::editTagAttrOrElem(const char* tag, const char* attribute, const char* element, const T& oldValue, const T& newValue)
{
- tinyxml2::XMLDocument doc;
- tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
- return false;
- }
-
- tinyxml2::XMLElement* root = doc.RootElement();
- if (!root)
- {
- ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
- return false;
- }
-
- std::ostringstream oldValueStream, newValueStream;
- oldValueStream << oldValue;
- newValueStream << newValue;
- std::string oldValueStr = oldValueStream.str();
- std::string newValueStr = newValueStream.str();
-
- for (tinyxml2::XMLElement* tagElement = root->FirstChildElement(tag); tagElement != nullptr; tagElement = tagElement->NextSiblingElement(tag))
- {
- if (attribute)
- {
- const char* attrValue = tagElement->Attribute(attribute);
- if (attrValue && oldValueStr == attrValue)
- {
- tagElement->SetAttribute(attribute, newValueStr.c_str());
- result = doc.SaveFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
- return false;
- }
- return true;
- }
- }
- else if (element)
- {
- tinyxml2::XMLElement* childElement = tagElement->FirstChildElement(element);
- if (childElement && childElement->GetText() && oldValueStr == childElement->GetText())
- {
- childElement->SetText(newValueStr.c_str());
- result = doc.SaveFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
- return false;
- }
- return true;
- }
- }
- }
-
- ESP_LOGE(TAGGPX, "Attribute/Element '%s' with value '%s' not found for tag '%s' in file: %s",
- attribute ? attribute : element, oldValueStr.c_str(), tag, filePath.c_str());
- return false;
+ tinyxml2::XMLDocument doc;
+ tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
+ return false;
+ }
+
+ tinyxml2::XMLElement* root = doc.RootElement();
+ if (!root)
+ {
+ ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
+ return false;
+ }
+
+ std::ostringstream oldValueStream, newValueStream;
+ oldValueStream << oldValue;
+ newValueStream << newValue;
+ std::string oldValueStr = oldValueStream.str();
+ std::string newValueStr = newValueStream.str();
+
+ for (tinyxml2::XMLElement* tagElement = root->FirstChildElement(tag); tagElement != nullptr; tagElement = tagElement->NextSiblingElement(tag))
+ {
+ if (attribute)
+ {
+ const char* attrValue = tagElement->Attribute(attribute);
+ if (attrValue && oldValueStr == attrValue)
+ {
+ tagElement->SetAttribute(attribute, newValueStr.c_str());
+ result = doc.SaveFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
+ return false;
+ }
+ return true;
+ }
+ }
+ else if (element)
+ {
+ tinyxml2::XMLElement* childElement = tagElement->FirstChildElement(element);
+ if (childElement && childElement->GetText() && oldValueStr == childElement->GetText())
+ {
+ childElement->SetText(newValueStr.c_str());
+ result = doc.SaveFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to save file: %s", filePath.c_str());
+ return false;
+ }
+ return true;
+ }
+ }
+ }
+
+ ESP_LOGE(TAGGPX, "Attribute/Element '%s' with value '%s' not found for tag '%s' in file: %s",
+ attribute ? attribute : element, oldValueStr.c_str(), tag, filePath.c_str());
+ return false;
}
/**
- * @brief Insert the tag attribute or element value in the GPX file
- *
- * @param tag
- * @param attribute nullptr for insert element
- * @param element nullptr for insert attribute
- * @param value value of the attribute or element
- * @return true if the tag attribute or element value was inserted successfully, false otherwise
- */
+* @brief Insert a tag, attribute, or element in the GPX file.
+*
+* @param tag XML tag name.
+* @param attribute XML attribute name (can be nullptr).
+* @param element XML element name (can be nullptr).
+* @param value Value to insert.
+* @return true if the insert was successful, false otherwise.
+*/
template
bool GPXParser::insertTagAttrOrElem(const char* tag, const char* attribute, const char* element, const T& value)
{
- tinyxml2::XMLDocument doc;
- tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
- return false;
- }
-
- tinyxml2::XMLElement* root = doc.RootElement();
- if (!root)
- {
- ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
- return false;
- }
-
- tinyxml2::XMLElement* tagElement = root->FirstChildElement(tag);
- if (!tagElement)
- {
- ESP_LOGE(TAGGPX, "Tag '%s' not found in file: %s", tag, filePath.c_str());
- return false;
- }
-
- std::ostringstream valueStream;
- valueStream << value;
- std::string valueStr = valueStream.str();
-
- if (attribute)
- tagElement->SetAttribute(attribute, valueStr.c_str());
- else if (element)
- {
- tinyxml2::XMLElement* childElement = tagElement->FirstChildElement(element);
- if (!childElement)
- {
- childElement = doc.NewElement(element);
- if (!childElement)
- {
- ESP_LOGE(TAGGPX, "Failed to create new element '%s'", element);
- return false;
- }
- tagElement->InsertEndChild(childElement);
- }
- childElement->SetText(valueStr.c_str());
- }
-
- result = doc.SaveFile(filePath.c_str());
- if (result != tinyxml2::XML_SUCCESS)
- {
- ESP_LOGE(TAGGPX, "Failed to save file after inserting attribute/element: %s", filePath.c_str());
- return false;
- }
-
- ESP_LOGI(TAGGPX, "Successfully inserted attribute/element '%s' into tag '%s'", attribute ? attribute : element, tag);
- return true;
+ tinyxml2::XMLDocument doc;
+ tinyxml2::XMLError result = doc.LoadFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to load file: %s", filePath.c_str());
+ return false;
+ }
+
+ tinyxml2::XMLElement* root = doc.RootElement();
+ if (!root)
+ {
+ ESP_LOGE(TAGGPX, "Failed to get root element in file: %s", filePath.c_str());
+ return false;
+ }
+
+ tinyxml2::XMLElement* tagElement = root->FirstChildElement(tag);
+ if (!tagElement)
+ {
+ ESP_LOGE(TAGGPX, "Tag '%s' not found in file: %s", tag, filePath.c_str());
+ return false;
+ }
+
+ std::ostringstream valueStream;
+ valueStream << value;
+ std::string valueStr = valueStream.str();
+
+ if (attribute)
+ tagElement->SetAttribute(attribute, valueStr.c_str());
+ else if (element)
+ {
+ tinyxml2::XMLElement* childElement = tagElement->FirstChildElement(element);
+ if (!childElement)
+ {
+ childElement = doc.NewElement(element);
+ if (!childElement)
+ {
+ ESP_LOGE(TAGGPX, "Failed to create new element '%s'", element);
+ return false;
+ }
+ tagElement->InsertEndChild(childElement);
+ }
+ childElement->SetText(valueStr.c_str());
+ }
+
+ result = doc.SaveFile(filePath.c_str());
+ if (result != tinyxml2::XML_SUCCESS)
+ {
+ ESP_LOGE(TAGGPX, "Failed to save file after inserting attribute/element: %s", filePath.c_str());
+ return false;
+ }
+
+ ESP_LOGI(TAGGPX, "Successfully inserted attribute/element '%s' into tag '%s'", attribute ? attribute : element, tag);
+ return true;
}
\ No newline at end of file
diff --git a/lib/gui/src/buttonBar.cpp b/lib/gui/src/buttonBar.cpp
index 71dd7223..01cc0271 100644
--- a/lib/gui/src/buttonBar.cpp
+++ b/lib/gui/src/buttonBar.cpp
@@ -2,8 +2,8 @@
* @file buttonBar.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Button Bar
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "buttonBar.hpp"
@@ -15,336 +15,343 @@ bool isTrackOpt;
bool isOptionLoaded = false;
bool isBarOpen = false;
-lv_obj_t *settingsScreen;
-lv_obj_t *buttonBar;
-lv_obj_t *menuBtn;
+lv_obj_t *settingsScreen; /**< Settings screen object. */
+lv_obj_t *buttonBar; /**< Button bar object. */
+lv_obj_t *menuBtn; /**< Menu button object. */
/**
- * @brief Button events
+ * @brief Handles button events on the button bar, triggering actions and UI changes based on the selected option.
*
- * @param event
+ * @param event Pointer to the LVGL event structure.
*/
void buttonBarEvent(lv_event_t *event)
{
- lv_obj_t * obj = (lv_obj_t*)lv_event_get_target(event);
- lv_obj_t * buttonBar = lv_obj_get_parent(obj);
- if(lv_obj_get_width(buttonBar) > LV_HOR_RES / 2)
- {
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, buttonBar);
- lv_anim_set_exec_cb(&a, hideShowAnim);
- lv_anim_set_values(&a, 256, 0);
- lv_anim_set_duration(&a, 250);
- lv_anim_start(&a);
- }
+ lv_obj_t * obj = (lv_obj_t*)lv_event_get_target(event);
+ lv_obj_t * buttonBar = lv_obj_get_parent(obj);
+ if(lv_obj_get_width(buttonBar) > LV_HOR_RES / 2)
+ {
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, buttonBar);
+ lv_anim_set_exec_cb(&a, hideShowAnim);
+ lv_anim_set_values(&a, 256, 0);
+ lv_anim_set_duration(&a, 250);
+ lv_anim_start(&a);
+ }
- char *option = (char *)lv_event_get_user_data(event);
+ char *option = (char *)lv_event_get_user_data(event);
- if (strcmp(option,"addwpt") == 0)
- {
- gpxAction = WPT_ADD;
- isMainScreen = false;
- mapView.redrawMap = false;
- lv_textarea_set_text(gpxTagValue, "");
- isScreenRotated = false;
- lv_obj_set_width(gpxTagValue, tft.width() -10);
- updateWaypoint(gpxAction);
- lv_screen_load(gpxDetailScreen);
- }
+ if (strcmp(option,"addwpt") == 0)
+ {
+ gpxAction = WPT_ADD;
+ isMainScreen = false;
+ mapView.redrawMap = false;
+ lv_textarea_set_text(gpxTagValue, "");
+ isScreenRotated = false;
+ lv_obj_set_width(gpxTagValue, tft.width() -10);
+ updateWaypoint(gpxAction);
+ lv_screen_load(gpxDetailScreen);
+ }
- if (strcmp(option,"waypoint") == 0)
- {
- isWaypointOpt = true;
- isTrackOpt = false;
- if (!isOptionLoaded)
- {
- isOptionLoaded = true;
- loadOptions();
- }
- }
- if (strcmp(option,"track") == 0)
- {
- isTrackOpt = true;
- isWaypointOpt = false;
- if (!isOptionLoaded)
- {
- isOptionLoaded = true;
- loadOptions();
- }
- }
- if (strcmp(option,"settings") == 0)
- {
- isMainScreen = false;
- lv_screen_load(settingsScreen);
- }
+ if (strcmp(option,"waypoint") == 0)
+ {
+ isWaypointOpt = true;
+ isTrackOpt = false;
+ if (!isOptionLoaded)
+ {
+ isOptionLoaded = true;
+ lv_obj_add_flag(menuBtn,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_set_size(buttonBar, 50 * scaleBut, 50 * scaleBut);
+ lv_obj_add_flag(buttonBar,LV_OBJ_FLAG_HIDDEN);
+ loadOptions();
+ }
+ }
+ if (strcmp(option,"track") == 0)
+ {
+ isTrackOpt = true;
+ isWaypointOpt = false;
+ if (!isOptionLoaded)
+ {
+ isOptionLoaded = true;
+ lv_obj_add_flag(menuBtn,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_set_size(buttonBar, 50 * scaleBut, 50 * scaleBut);
+ lv_obj_add_flag(buttonBar,LV_OBJ_FLAG_HIDDEN);
+ loadOptions();
+ }
+ }
+ if (strcmp(option,"settings") == 0)
+ {
+ isMainScreen = false;
+ lv_screen_load(settingsScreen);
+ }
}
/**
- * @brief Options events
+ * @brief Handles option events, triggering actions such as load, edit, delete, or exit based on the selected option.
*
- * @param event
+ * @param event Pointer to the LVGL event structure.
*/
void optionEvent(lv_event_t *event)
{
- char *action = (char *)lv_event_get_user_data(event);
- if (strcmp(action,"load") == 0)
- {
- gpxAction = GPX_LOAD;
- isMainScreen = false;
- lv_obj_del(option);
- updateGpxListScreen();
- if (isTrackOpt)
- lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Tracks");
- if (isWaypointOpt)
- lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
- lv_screen_load(listGPXScreen);
- }
- if (strcmp(action,"edit") == 0)
- {
- gpxAction = GPX_EDIT;
- isMainScreen = false;
- lv_obj_del(option);
- updateGpxListScreen();
- if (isTrackOpt)
- lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Tracks");
- if (isWaypointOpt)
- lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
- lv_screen_load(listGPXScreen);
- }
- if (strcmp(action,"delete") == 0)
- {
- gpxAction = GPX_DEL;
- isMainScreen = false;
- lv_obj_del(option);
- updateGpxListScreen();
- if (isTrackOpt)
- lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Tracks");
- if (isWaypointOpt)
- lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
- lv_screen_load(listGPXScreen);
- }
- if (strcmp(action,"exit") == 0)
- {
- isMainScreen = true;
- isTrackOpt = false;
- isWaypointOpt = false;
- lv_obj_del(option);
- }
+ char *action = (char *)lv_event_get_user_data(event);
+ if (strcmp(action,"load") == 0)
+ {
+ gpxAction = GPX_LOAD;
+ isMainScreen = false;
+ lv_obj_del(option);
+ updateGpxListScreen();
+ if (isTrackOpt)
+ lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Tracks");
+ if (isWaypointOpt)
+ lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
+ lv_screen_load(listGPXScreen);
+ }
+ if (strcmp(action,"edit") == 0)
+ {
+ gpxAction = GPX_EDIT;
+ isMainScreen = false;
+ lv_obj_del(option);
+ updateGpxListScreen();
+ if (isTrackOpt)
+ lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Tracks");
+ if (isWaypointOpt)
+ lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
+ lv_screen_load(listGPXScreen);
+ }
+ if (strcmp(action,"delete") == 0)
+ {
+ gpxAction = GPX_DEL;
+ isMainScreen = false;
+ lv_obj_del(option);
+ updateGpxListScreen();
+ if (isTrackOpt)
+ lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Tracks");
+ if (isWaypointOpt)
+ lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
+ lv_screen_load(listGPXScreen);
+ }
+ if (strcmp(action,"exit") == 0)
+ {
+ isMainScreen = true;
+ isTrackOpt = false;
+ isWaypointOpt = false;
+ lv_obj_del(option);
+ lv_obj_clear_flag(menuBtn,LV_OBJ_FLAG_HIDDEN);
+ }
- isOptionLoaded = false;
- isWaypointOpt = false;
- isTrackOpt = false;
- mapView.redrawMap = true;
+ isOptionLoaded = false;
+ isWaypointOpt = false;
+ isTrackOpt = false;
+ mapView.redrawMap = true;
}
/**
- * @brief Hide/Show Animation
+ * @brief Hide/Show animation for UI objects, adjusts width and toggles visibility and related flags.
*
- * @param event
+ * @param var Pointer to the LVGL object.
+ * @param v Animation value (typically width).
*/
void hideShowAnim(void * var, int32_t v)
{
- lv_obj_t * obj = (lv_obj_t*)var;
- int32_t max_w = lv_obj_get_width(lv_obj_get_parent(obj)) - LV_DPX(4);
- int32_t w;
- w = lv_map(v, 0, 256, LV_DPX(60) * scaleBut, max_w);
- lv_obj_set_width(obj, w);
- if (v == 0)
- {
- lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- isBarOpen = false;
- isScrolled = true;
- }
- else
- {
- lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- isBarOpen = true;
- isScrolled = false;
- }
+ lv_obj_t * obj = (lv_obj_t*)var;
+ int32_t max_w = lv_obj_get_width(lv_obj_get_parent(obj)) - LV_DPX(4);
+ int32_t w;
+ w = lv_map(v, 0, 256, LV_DPX(60) * scaleBut, max_w);
+ lv_obj_set_width(obj, w);
+ if (v == 0)
+ {
+ lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
+ isBarOpen = false;
+ isScrolled = true;
+ }
+ else
+ {
+ lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
+ isBarOpen = true;
+ isScrolled = false;
+ }
}
/**
- * @brief Hide/Show buttons event
+ * @brief Handles hide/show events for buttons, toggling the button bar visibility with animation.
*
- * @param event
+ * @param event Pointer to the LVGL event structure.
*/
void hideShowEvent(lv_event_t * e)
{
- if(lv_event_get_code(e) == LV_EVENT_CLICKED)
- {
- lv_obj_t * buttonBar = (lv_obj_t *)lv_event_get_user_data(e);
- if(lv_obj_get_width(buttonBar) < LV_HOR_RES / 2)
- {
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, buttonBar);
- lv_anim_set_exec_cb(&a, hideShowAnim);
- lv_anim_set_values(&a, 0, 256);
- lv_anim_set_duration(&a, 150);
- lv_anim_start(&a);
- }
- else
- {
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, buttonBar);
- lv_anim_set_exec_cb(&a, hideShowAnim);
- lv_anim_set_values(&a, 256, 0);
- lv_anim_set_duration(&a, 150);
- lv_anim_start(&a);
- }
- }
+ if(lv_event_get_code(e) == LV_EVENT_CLICKED)
+ {
+ lv_obj_t * buttonBar = (lv_obj_t *)lv_event_get_user_data(e);
+ if(lv_obj_get_width(buttonBar) < LV_HOR_RES / 2)
+ {
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, buttonBar);
+ lv_anim_set_exec_cb(&a, hideShowAnim);
+ lv_anim_set_values(&a, 0, 256);
+ lv_anim_set_duration(&a, 150);
+ lv_anim_start(&a);
+ }
+ else
+ {
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, buttonBar);
+ lv_anim_set_exec_cb(&a, hideShowAnim);
+ lv_anim_set_values(&a, 256, 0);
+ lv_anim_set_duration(&a, 150);
+ lv_anim_start(&a);
+ }
+ }
}
/**
- * @brief Create button bar screen
+ * @brief Creates and configures the floating button bar screen with menu and action buttons.
*
*/
void createButtonBarScr()
{
- // Button Bar
- buttonBar = lv_obj_create(mainScreen);
- lv_obj_remove_style_all(buttonBar);
- lv_obj_set_flex_flow(buttonBar, LV_FLEX_FLOW_ROW);
- lv_obj_set_flex_align(buttonBar, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_FLOATING);
- lv_obj_set_style_radius(buttonBar, LV_RADIUS_CIRCLE, 0);
- lv_obj_set_style_border_color(buttonBar, lv_color_white(), 0);
- lv_obj_set_style_border_width(buttonBar, 1, 0);
- lv_obj_set_style_border_opa(buttonBar,LV_OPA_20,0);
- lv_obj_set_style_bg_color(buttonBar, lv_color_black(), 0);
- lv_obj_set_style_bg_opa(buttonBar, 230, 0);
- lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_FLOATING);
- lv_obj_set_size(buttonBar, 50 * scaleBut, 50 * scaleBut);
- lv_obj_align(buttonBar, LV_ALIGN_BOTTOM_RIGHT, 0, -LV_DPX(14) );
- lv_obj_add_flag(buttonBar,LV_OBJ_FLAG_HIDDEN);
+ // Button Bar
+ buttonBar = lv_obj_create(mainScreen);
+ lv_obj_remove_style_all(buttonBar);
+ lv_obj_set_flex_flow(buttonBar, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(buttonBar, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_FLOATING);
+ lv_obj_set_style_radius(buttonBar, LV_RADIUS_CIRCLE, 0);
+ lv_obj_set_style_border_color(buttonBar, lv_color_white(), 0);
+ lv_obj_set_style_border_width(buttonBar, 1, 0);
+ lv_obj_set_style_border_opa(buttonBar,LV_OPA_20,0);
+ lv_obj_set_style_bg_color(buttonBar, lv_color_black(), 0);
+ lv_obj_set_style_bg_opa(buttonBar, 210, 0);
+ lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_FLOATING);
+ lv_obj_set_size(buttonBar, 50 * scaleBut, 50 * scaleBut);
+ lv_obj_align(buttonBar, LV_ALIGN_BOTTOM_RIGHT, 0, 0 );
+ lv_obj_add_flag(buttonBar,LV_OBJ_FLAG_HIDDEN);
- static lv_style_t style;
- lv_style_init(&style);
- lv_style_set_pad_column(&style, 10);
- lv_obj_add_style(buttonBar, &style, 0);
+ static lv_style_t style;
+ lv_style_init(&style);
+ lv_style_set_pad_column(&style, 10);
+ lv_obj_add_style(buttonBar, &style, 0);
- menuBtn = lv_img_create(mainScreen);
- lv_img_set_src(menuBtn, menuIconFile);
- lv_obj_add_flag(menuBtn, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
- lv_img_set_zoom(menuBtn,buttonScale);
- lv_obj_update_layout(menuBtn);
- lv_obj_add_event_cb(menuBtn, hideShowEvent, LV_EVENT_ALL, buttonBar);
- lv_obj_set_size(menuBtn, 48 * scaleBut, 48 * scaleBut);
- lv_obj_align(menuBtn, LV_ALIGN_BOTTOM_RIGHT, 0, -LV_DPX(15));
+ menuBtn = lv_img_create(mainScreen);
+ lv_img_set_src(menuBtn, menuIconFile);
+ lv_obj_add_flag(menuBtn, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_img_set_zoom(menuBtn,buttonScale);
+ lv_obj_update_layout(menuBtn);
+ lv_obj_add_event_cb(menuBtn, hideShowEvent, LV_EVENT_ALL, buttonBar);
+ lv_obj_set_size(menuBtn, 48 * scaleBut, 48 * scaleBut);
+ lv_obj_align(menuBtn, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
- lv_obj_t *imgBtn;
-
- // Add Waypoint Button
- imgBtn = lv_img_create(buttonBar);
- lv_img_set_src(imgBtn,addWptIconFile);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"addwpt");
+ lv_obj_t *imgBtn;
+
+ // Add Waypoint Button
+ imgBtn = lv_img_create(buttonBar);
+ lv_img_set_src(imgBtn,addWptIconFile);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"addwpt");
- // Waypoint Button
- imgBtn = lv_img_create(buttonBar);
- lv_img_set_src(imgBtn, waypointIconFile);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"waypoint");
-
- // Track Button
- imgBtn = lv_img_create(buttonBar);
- lv_img_set_src(imgBtn, trackIconFile);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"track");
-
- // Settings Button
- imgBtn = lv_img_create(buttonBar);
- lv_img_set_src(imgBtn, settingsIconFile);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"settings");
+ // Waypoint Button
+ imgBtn = lv_img_create(buttonBar);
+ lv_img_set_src(imgBtn, waypointIconFile);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"waypoint");
+
+ // Track Button
+ imgBtn = lv_img_create(buttonBar);
+ lv_img_set_src(imgBtn, trackIconFile);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"track");
+
+ // Settings Button
+ imgBtn = lv_img_create(buttonBar);
+ lv_img_set_src(imgBtn, settingsIconFile);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_event_cb(imgBtn, buttonBarEvent, LV_EVENT_PRESSED, (char*)"settings");
}
/**
- * @brief Load waypoint, track options modal dialog.
+ * @brief Loads the waypoint/track options modal dialog and creates option buttons.
*
*/
void loadOptions()
{
- option = lv_obj_create(lv_scr_act());
- lv_obj_remove_style_all(option);
+ option = lv_obj_create(lv_scr_act());
+ lv_obj_remove_style_all(option);
- lv_obj_set_style_radius(option, LV_RADIUS_CIRCLE, 0);
- lv_obj_set_style_border_color(option, lv_color_white(), 0);
- lv_obj_set_style_border_width(option, 1, 0);
- lv_obj_set_style_border_opa(option,LV_OPA_20,0);
- lv_obj_set_style_bg_color(option, lv_color_black(), 0);
- lv_obj_set_style_bg_opa(option, 255, 0);
- lv_obj_set_flex_flow(option, LV_FLEX_FLOW_ROW);
- lv_obj_set_flex_align(option, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_set_size(option, TFT_WIDTH, 50 * scaleBut);
- lv_obj_clear_flag(option, LV_OBJ_FLAG_SCROLLABLE);
- lv_obj_align(option, LV_ALIGN_BOTTOM_LEFT, 0, -10);
+ lv_obj_set_style_radius(option, LV_RADIUS_CIRCLE, 0);
+ lv_obj_set_style_border_color(option, lv_color_white(), 0);
+ lv_obj_set_style_border_width(option, 1, 0);
+ lv_obj_set_style_border_opa(option,LV_OPA_20,0);
+ lv_obj_set_style_bg_color(option, lv_color_black(), 0);
+ lv_obj_set_style_bg_opa(option, 210, 0);
+ lv_obj_set_flex_flow(option, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(option, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_set_size(option, TFT_WIDTH, 50 * scaleBut);
+ lv_obj_clear_flag(option, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_align(option, LV_ALIGN_BOTTOM_LEFT, 0, 0);
- static lv_style_t style;
- lv_style_init(&style);
- lv_style_set_pad_column(&style, 10);
- lv_obj_add_style(option, &style, 0);
+ static lv_style_t style;
+ lv_style_init(&style);
+ lv_style_set_pad_column(&style, 10);
+ lv_obj_add_style(option, &style, 0);
+
+ lv_obj_t *imgBtn;
+
+ // if (isTrackOpt)
+ // {
+ // // Save Button
+ // imgBtn = lv_img_create(option);
+ // lv_img_set_src(imgBtn, saveIconFile);
+ // lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ // lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"save");
+ // }
+
+ // Load Button
+ imgBtn = lv_img_create(option);
+ lv_img_set_src(imgBtn, loadIconFile);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_align(imgBtn,LV_ALIGN_BOTTOM_LEFT, 0, -40);
+ lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"load");
-
- lv_obj_t *imgBtn;
-
- // if (isTrackOpt)
- // {
- // // Save Button
- // imgBtn = lv_img_create(option);
- // lv_img_set_src(imgBtn, saveIconFile);
- // lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- // lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"save");
- // }
-
- // Load Button
- imgBtn = lv_img_create(option);
- lv_img_set_src(imgBtn, loadIconFile);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_align(imgBtn,LV_ALIGN_BOTTOM_LEFT, 0, -40);
- lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"load");
+ // Edit Button
+ imgBtn = lv_img_create(option);
+ lv_img_set_src(imgBtn, editIconFile);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"edit");
- // Edit Button
- imgBtn = lv_img_create(option);
- lv_img_set_src(imgBtn, editIconFile);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"edit");
+ // Delete Button
+ imgBtn = lv_img_create(option);
+ lv_img_set_src(imgBtn, deleteIconFile);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"delete");
- // Delete Button
- imgBtn = lv_img_create(option);
- lv_img_set_src(imgBtn, deleteIconFile);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"delete");
-
- // Exit Button
- imgBtn = lv_img_create(option);
- lv_img_set_src(imgBtn, exitIconFile);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"exit");
+ // Exit Button
+ imgBtn = lv_img_create(option);
+ lv_img_set_src(imgBtn, exitIconFile);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(imgBtn, optionEvent, LV_EVENT_PRESSED, (char*)"exit");
}
diff --git a/lib/gui/src/buttonBar.hpp b/lib/gui/src/buttonBar.hpp
index 09cdd760..bb0b30a8 100644
--- a/lib/gui/src/buttonBar.hpp
+++ b/lib/gui/src/buttonBar.hpp
@@ -2,8 +2,8 @@
* @file buttonBar.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Button Bar
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -13,23 +13,24 @@
#include "gpxDetailScr.hpp"
#include "gpxScr.hpp"
-static const char *waypointIconFile PROGMEM = "/wpt.bin"; // Waypoint icon
-static const char *trackIconFile PROGMEM = "/track.bin"; // Track icon
-static const char *settingsIconFile PROGMEM = "/settings.bin"; // Settings icon
-static const char *saveIconFile PROGMEM = "/save.bin"; // Save icon
-static const char *loadIconFile PROGMEM = "/load.bin"; // Load icon
-static const char *editIconFile PROGMEM = "/edit.bin"; // Edit icon
-static const char *deleteIconFile PROGMEM = "/delete.bin"; // Delete icon
-static const char *menuIconFile PROGMEM = "/menu.bin"; // Menu icon
-static const char *addWptIconFile PROGMEM = "/addwpt.bin"; // Add Waypoint icon
-static const char *exitIconFile PROGMEM = "/exit.bin"; // Exit icon
+static const char *waypointIconFile PROGMEM = "/wpt.bin"; /**< Waypoint icon file path. */
+static const char *trackIconFile PROGMEM = "/track.bin"; /**< Track icon file path. */
+static const char *settingsIconFile PROGMEM = "/settings.bin"; /**< Settings icon file path. */
+static const char *saveIconFile PROGMEM = "/save.bin"; /**< Save icon file path. */
+static const char *loadIconFile PROGMEM = "/load.bin"; /**< Load icon file path. */
+static const char *editIconFile PROGMEM = "/edit.bin"; /**< Edit icon file path. */
+static const char *deleteIconFile PROGMEM = "/delete.bin"; /**< Delete icon file path. */
+static const char *menuIconFile PROGMEM = "/menu.bin"; /**< Menu icon file path. */
+static const char *addWptIconFile PROGMEM = "/addwpt.bin"; /**< Add Waypoint icon file path. */
+static const char *exitIconFile PROGMEM = "/exit.bin"; /**< Exit icon file path. */
-static lv_obj_t *option;
+static lv_obj_t *option; /**< Pointer to the currently selected option object (LVGL). */
+
+extern bool isWaypointOpt; /**< Waypoint Option selected. */
+extern bool isTrackOpt; /**< Track Option selected. */
+extern bool isOptionLoaded; /**< Option selected & loaded. */
+extern bool isBarOpen; /**< Flag to determine if Button Bar is open. */
-extern bool isWaypointOpt; // Waypoint Option selected
-extern bool isTrackOpt; // Track Option selected
-extern bool isOptionLoaded; // Option selected & loaded
-extern bool isBarOpen; // Flag to determine if Button Bar is open
void buttonBarEvent(lv_event_t *event);
void optionEvent(lv_event_t *event);
diff --git a/lib/gui/src/deviceSettingsScr.cpp b/lib/gui/src/deviceSettingsScr.cpp
index 0706052c..fc72a676 100644
--- a/lib/gui/src/deviceSettingsScr.cpp
+++ b/lib/gui/src/deviceSettingsScr.cpp
@@ -2,44 +2,44 @@
* @file deviceSettingsScr.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Device Settings Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "deviceSettingsScr.hpp"
-lv_obj_t *deviceSettingsScreen; // Device Settings Screen
+lv_obj_t *deviceSettingsScreen; /**< Device Settings Screen. */
/**
- * @brief Device Settings Events
- *
- * @param event
+ * @brief Handles device settings events, updating configuration based on user selection.
+ *
+ * @param event Pointer to the LVGL event structure.
*/
static void deviceSettingsEvent(lv_event_t *event)
{
- lv_obj_t *obj = (lv_obj_t*)lv_event_get_target(event);
- char *option = (char *)lv_event_get_user_data(event);
- if (strcmp(option,"speed") == 0)
- {
- gpsBaud = lv_dropdown_get_selected(obj);
- saveGPSBaud(gpsBaud);
- }
- if (strcmp(option,"rate") == 0)
- {
- gpsUpdate = lv_dropdown_get_selected(obj);
- saveGPSUpdateRate(gpsUpdate);
- }
- if (strcmp(option, "back") == 0)
- {
- cfg.saveUInt(PKEYS::KDEF_BRIGT, defBright);
- lv_screen_load(settingsScreen);
- }
+ lv_obj_t *obj = (lv_obj_t*)lv_event_get_target(event);
+ char *option = (char *)lv_event_get_user_data(event);
+ if (strcmp(option,"speed") == 0)
+ {
+ gpsBaud = lv_dropdown_get_selected(obj);
+ saveGPSBaud(gpsBaud);
+ }
+ if (strcmp(option,"rate") == 0)
+ {
+ gpsUpdate = lv_dropdown_get_selected(obj);
+ saveGPSUpdateRate(gpsUpdate);
+ }
+ if (strcmp(option, "back") == 0)
+ {
+ cfg.saveUInt(PKEYS::KDEF_BRIGT, defBright);
+ lv_screen_load(settingsScreen);
+ }
}
/**
- * @brief Brightness callback
+ * @brief Brightness slider event callback, updates the display brightness.
*
- * @param e
+ * @param e Pointer to the LVGL event structure.
*/
static void brightnessEvent(lv_event_t *e)
{
@@ -49,154 +49,163 @@ static void brightnessEvent(lv_event_t *e)
}
/**
- * @brief Upgrade firmware event
- *
- * @param event
+ * @brief Handles the upgrade firmware event, checks for firmware file and updates accordingly.
+ *
+ * @param event Pointer to the LVGL event structure.
*/
static void upgradeEvent(lv_event_t *event)
{
- createMsgUpgrade();
- lv_screen_load(msgUpgrade);
- if (!checkFileUpgrade())
- {
- lv_label_set_text_static(msgUprgdText, LV_SYMBOL_WARNING " No Firmware found!");
- }
- else
- {
- lv_label_set_text_static(msgUprgdText, LV_SYMBOL_WARNING " Firmware found!");
- lv_obj_clear_flag(btnMsgUpgrade,LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(contMeter,LV_OBJ_FLAG_HIDDEN);
- }
+ createMsgUpgrade();
+ lv_screen_load(msgUpgrade);
+ if (!checkFileUpgrade())
+ {
+ lv_label_set_text_static(msgUprgdText, LV_SYMBOL_WARNING " No Firmware found!");
+ }
+ else
+ {
+ lv_label_set_text_static(msgUprgdText, LV_SYMBOL_WARNING " Firmware found!");
+ lv_obj_clear_flag(btnMsgUpgrade,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(contMeter,LV_OBJ_FLAG_HIDDEN);
+ }
}
/**
- * @brief Create brightness text
+ * @brief Creates and configures the brightness value label
*
*/
static lv_obj_t *createBrightText(lv_obj_t *parent, const char *icon, const char *txt)
{
- lv_obj_t *obj = lv_menu_cont_create(parent);
-
- lv_obj_t *img = NULL;
- lv_obj_t *label = NULL;
-
- if (icon)
- {
- img = lv_img_create(obj);
- lv_img_set_src(img, icon);
- }
-
- if (txt)
- {
- label = lv_label_create(obj);
- lv_label_set_text(label, txt);
- lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);
- lv_obj_set_flex_grow(label, 1);
- }
-
- if (icon && txt)
- {
- lv_obj_add_flag(img, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
- lv_obj_swap(img, label);
- }
-
- return obj;
+ lv_obj_t *obj = lv_menu_cont_create(parent);
+
+ lv_obj_t *img = NULL;
+ lv_obj_t *label = NULL;
+
+ if (icon)
+ {
+ img = lv_img_create(obj);
+ lv_img_set_src(img, icon);
+ }
+
+ if (txt)
+ {
+ label = lv_label_create(obj);
+ lv_label_set_text(label, txt);
+ lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);
+ lv_obj_set_flex_grow(label, 1);
+ }
+
+ if (icon && txt)
+ {
+ lv_obj_add_flag(img, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
+ lv_obj_swap(img, label);
+ }
+
+ return obj;
}
/**
- * @brief Create brightness slider
+ * @brief Creates a brightness slider with a label and icon, attaches an event callback, and returns the slider object.
*
+ * @param parent Parent LVGL object.
+ * @param icon Icon to display next to the slider.
+ * @param txt Text label for the slider.
+ * @param min Minimum slider value.
+ * @param max Maximum slider value.
+ * @param val Starting slider value.
+ * @param cb Event callback function.
+ * @param filter Event code filter for the callback.
+ * @return Pointer to the created LVGL slider object.
*/
static lv_obj_t *createBrightSlider(lv_obj_t *parent, const char *icon, const char *txt, int32_t min, int32_t max,
int32_t val, lv_event_cb_t cb, lv_event_code_t filter)
{
- lv_obj_t *obj = createBrightText(parent, icon, txt);
+ lv_obj_t *obj = createBrightText(parent, icon, txt);
- lv_obj_t *slider = lv_slider_create(obj);
- lv_obj_set_width(slider,TFT_WIDTH - 80);
- lv_slider_set_range(slider, min, max);
- lv_slider_set_value(slider, val, LV_ANIM_OFF);
+ lv_obj_t *slider = lv_slider_create(obj);
+ lv_obj_set_width(slider,TFT_WIDTH - 80);
+ lv_slider_set_range(slider, min, max);
+ lv_slider_set_value(slider, val, LV_ANIM_OFF);
- if (cb != NULL)
- lv_obj_add_event_cb(slider, cb, filter, NULL);
+ if (cb != NULL)
+ lv_obj_add_event_cb(slider, cb, filter, NULL);
- if (icon == NULL)
- lv_obj_add_flag(slider, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
+ if (icon == NULL)
+ lv_obj_add_flag(slider, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
- return slider;
+ return slider;
}
/**
- * @brief Create Device Settings screen
+ * @brief Creates the Device Settings screen
*
*/
void createDeviceSettingsScr()
{
- // Device Settings Screen
- deviceSettingsScreen = lv_obj_create(NULL);
- deviceSettingsOptions = lv_list_create(deviceSettingsScreen);
- lv_obj_set_size(deviceSettingsOptions, TFT_WIDTH, TFT_HEIGHT - 60);
-
- lv_obj_t *label;
- lv_obj_t *list;
- lv_obj_t *btn;
- lv_obj_t *dropdown;
-
- // GPS Speed
- list = lv_list_add_btn(deviceSettingsOptions, NULL, "GPS\nSpeed");
- lv_obj_set_style_text_font(list, fontOptions, 0);
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_OUT_LEFT_BOTTOM);
- dropdown = lv_dropdown_create(list);
- lv_dropdown_set_options(dropdown, "4800\n9600\n19200\nAUTO");
- lv_dropdown_set_selected(dropdown, gpsBaud);
- lv_obj_t* item = lv_dropdown_get_list(dropdown);
- lv_obj_set_style_bg_color(item, lv_color_hex(objectColor), LV_PART_SELECTED | LV_STATE_CHECKED);
- lv_obj_align_to(dropdown, list, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
- lv_obj_set_width(dropdown,TFT_WIDTH / 3);
- lv_obj_add_event_cb(dropdown, deviceSettingsEvent, LV_EVENT_VALUE_CHANGED, (char*)"speed");
-
- // GPS Update rate
- list = lv_list_add_btn(deviceSettingsOptions, NULL, "GPS\nUpdate rate");
- lv_obj_set_style_text_font(list, fontOptions, 0);
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- dropdown = lv_dropdown_create(list);
- lv_dropdown_set_options(dropdown, "1 Hz\n2 Hz\n4 Hz\n5 Hz\n10 Hz");
- lv_dropdown_set_selected(dropdown, gpsUpdate);
- item = lv_dropdown_get_list(dropdown);
- lv_obj_set_style_bg_color(item, lv_color_hex(objectColor), LV_PART_SELECTED | LV_STATE_CHECKED);
- #ifndef AT6558D_GPS
- lv_obj_set_style_text_color(list, lv_palette_darken(LV_PALETTE_GREY, 2), 0);
- lv_obj_add_state(list, LV_STATE_DISABLED);
- lv_obj_set_style_text_color(dropdown, lv_palette_darken(LV_PALETTE_GREY, 2), 0);
- lv_obj_add_state(dropdown, LV_STATE_DISABLED);
- #endif
- lv_obj_set_width(dropdown,TFT_WIDTH / 3);
- lv_obj_align_to(dropdown, list, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
- lv_obj_add_event_cb(dropdown, deviceSettingsEvent, LV_EVENT_VALUE_CHANGED, (char*)"rate");
-
- // Upgrade button
- list = lv_list_add_btn(deviceSettingsOptions, NULL, NULL);
- btn = lv_btn_create(list);
- lv_obj_set_size(btn, TFT_WIDTH - 45, 40 * scale);
- label = lv_label_create(btn);
- lv_obj_set_style_text_font(label, fontLarge, 0);
- lv_label_set_text_static(label, "Firmware Upgrade");
- lv_obj_center(label);
- lv_obj_add_event_cb(btn, upgradeEvent, LV_EVENT_CLICKED, NULL);
-
- // Brightness Slider
- createBrightSlider(deviceSettingsOptions, LV_SYMBOL_SETTINGS, "Brightness", 5, 255, defBright, brightnessEvent, LV_EVENT_VALUE_CHANGED);
-
- // Back button
- btn = lv_btn_create(deviceSettingsScreen);
- lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
- label = lv_label_create(btn);
- lv_obj_set_style_text_font(label, fontLarge, 0);
- lv_label_set_text_static(label, "Back");
- lv_obj_center(label);
- lv_obj_align(btn, LV_ALIGN_BOTTOM_MID, 0, -10);
- lv_obj_add_event_cb(btn, deviceSettingsEvent, LV_EVENT_CLICKED, (char*)"back");
+ // Device Settings Screen
+ deviceSettingsScreen = lv_obj_create(NULL);
+ deviceSettingsOptions = lv_list_create(deviceSettingsScreen);
+ lv_obj_set_size(deviceSettingsOptions, TFT_WIDTH, TFT_HEIGHT - 60);
+
+ lv_obj_t *label;
+ lv_obj_t *list;
+ lv_obj_t *btn;
+ lv_obj_t *dropdown;
+
+ // GPS Speed
+ list = lv_list_add_btn(deviceSettingsOptions, NULL, "GPS\nSpeed");
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_OUT_LEFT_BOTTOM);
+ dropdown = lv_dropdown_create(list);
+ lv_dropdown_set_options(dropdown, "4800\n9600\n19200\nAUTO");
+ lv_dropdown_set_selected(dropdown, gpsBaud);
+ lv_obj_t* item = lv_dropdown_get_list(dropdown);
+ lv_obj_set_style_bg_color(item, lv_color_hex(objectColor), LV_PART_SELECTED | LV_STATE_CHECKED);
+ lv_obj_align_to(dropdown, list, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
+ lv_obj_set_width(dropdown,TFT_WIDTH / 3);
+ lv_obj_add_event_cb(dropdown, deviceSettingsEvent, LV_EVENT_VALUE_CHANGED, (char*)"speed");
+
+ // GPS Update rate
+ list = lv_list_add_btn(deviceSettingsOptions, NULL, "GPS\nUpdate rate");
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ dropdown = lv_dropdown_create(list);
+ lv_dropdown_set_options(dropdown, "1 Hz\n2 Hz\n4 Hz\n5 Hz\n10 Hz");
+ lv_dropdown_set_selected(dropdown, gpsUpdate);
+ item = lv_dropdown_get_list(dropdown);
+ lv_obj_set_style_bg_color(item, lv_color_hex(objectColor), LV_PART_SELECTED | LV_STATE_CHECKED);
+ #ifndef AT6558D_GPS
+ lv_obj_set_style_text_color(list, lv_palette_darken(LV_PALETTE_GREY, 2), 0);
+ lv_obj_add_state(list, LV_STATE_DISABLED);
+ lv_obj_set_style_text_color(dropdown, lv_palette_darken(LV_PALETTE_GREY, 2), 0);
+ lv_obj_add_state(dropdown, LV_STATE_DISABLED);
+ #endif
+ lv_obj_set_width(dropdown,TFT_WIDTH / 3);
+ lv_obj_align_to(dropdown, list, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
+ lv_obj_add_event_cb(dropdown, deviceSettingsEvent, LV_EVENT_VALUE_CHANGED, (char*)"rate");
+
+ // Upgrade button
+ list = lv_list_add_btn(deviceSettingsOptions, NULL, NULL);
+ btn = lv_btn_create(list);
+ lv_obj_set_size(btn, TFT_WIDTH - 45, 40 * scale);
+ label = lv_label_create(btn);
+ lv_obj_set_style_text_font(label, fontLarge, 0);
+ lv_label_set_text_static(label, "Firmware Upgrade");
+ lv_obj_center(label);
+ lv_obj_add_event_cb(btn, upgradeEvent, LV_EVENT_CLICKED, NULL);
+
+ // Brightness Slider
+ createBrightSlider(deviceSettingsOptions, LV_SYMBOL_SETTINGS, "Brightness", 5, 255, defBright, brightnessEvent, LV_EVENT_VALUE_CHANGED);
+
+ // Back button
+ btn = lv_btn_create(deviceSettingsScreen);
+ lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
+ label = lv_label_create(btn);
+ lv_obj_set_style_text_font(label, fontLarge, 0);
+ lv_label_set_text_static(label, "Back");
+ lv_obj_center(label);
+ lv_obj_align(btn, LV_ALIGN_BOTTOM_MID, 0, -10);
+ lv_obj_add_event_cb(btn, deviceSettingsEvent, LV_EVENT_CLICKED, (char*)"back");
}
diff --git a/lib/gui/src/deviceSettingsScr.hpp b/lib/gui/src/deviceSettingsScr.hpp
index 82b92845..55afc378 100644
--- a/lib/gui/src/deviceSettingsScr.hpp
+++ b/lib/gui/src/deviceSettingsScr.hpp
@@ -2,8 +2,8 @@
* @file deviceSettingsScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Device Settings Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -13,7 +13,7 @@
#include "lvglSetup.hpp"
#include "firmUpgrade.hpp"
-static lv_obj_t *deviceSettingsOptions;
+static lv_obj_t *deviceSettingsOptions; /**< Device settings options */
static void deviceSettingsEvent(lv_event_t *event);
static void brightnessEvent(lv_event_t *e);
diff --git a/lib/gui/src/globalGuiDef.h b/lib/gui/src/globalGuiDef.h
index 3cbc0b7c..2e156c8c 100644
--- a/lib/gui/src/globalGuiDef.h
+++ b/lib/gui/src/globalGuiDef.h
@@ -1,8 +1,8 @@
/**
* @file globalGuiDef.h
* @brief Global GUI Variables
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -11,94 +11,90 @@
#include "tft.hpp"
#include "storage.hpp"
-/**
- * @Brief LVGL Display Driver
- *
- */
-extern lv_display_t *display;
+extern lv_display_t *display; /**< LVGL Display Driver */
/**
* @brief Screens definitions
*
*/
-extern lv_obj_t *mainScreen; // Main Screen
-extern lv_obj_t *tilesScreen; // Tiles Screen
-extern lv_obj_t *notifyBarIcons; // Notify Bar Icons
-extern lv_obj_t *notifyBarHour; // Notify Bar Hour
-extern lv_obj_t *settingsScreen; // Settings Screen
-extern lv_obj_t *mapSettingsScreen; // Map Settings Screen
-extern lv_obj_t *deviceSettingsScreen; // Device Settings Screen
-extern lv_obj_t *gpxDetailScreen; // Add Waypoint Screen
-extern lv_obj_t *listGPXScreen; // List Waypoint Screen
-
-extern lv_group_t * scrGroup; // Screen group
-extern lv_group_t * keyGroup; // GPIO group
-
-extern bool needReboot; // Flag to force device reboot
-extern bool isSearchingSat; // Flag to indicate that is searching satellites
-extern lv_obj_t *buttonBar; // Button Bar
-extern lv_obj_t *menuBtn; // Button Menu
-extern lv_obj_t *gpxTagValue; // Add / Edit Waypoint screen text area
-extern bool isScreenRotated; // Flag to know if screen is rotated
-
-extern lv_obj_t *powerMsg; // Power Message
+extern lv_obj_t *mainScreen; /**< Main Screen */
+extern lv_obj_t *tilesScreen; /**< Tiles Screen */
+extern lv_obj_t *notifyBarIcons; /**< Notify Bar Icons */
+extern lv_obj_t *notifyBarHour; /**< Notify Bar Hour */
+extern lv_obj_t *settingsScreen; /**< Settings Screen */
+extern lv_obj_t *mapSettingsScreen; /**< Map Settings Screen */
+extern lv_obj_t *deviceSettingsScreen; /**< Device Settings Screen */
+extern lv_obj_t *gpxDetailScreen; /**< Add Waypoint Screen */
+extern lv_obj_t *listGPXScreen; /**< List Waypoint Screen */
+
+extern lv_group_t *scrGroup; /**< Screen group */
+extern lv_group_t *keyGroup; /**< GPIO group */
+
+extern bool needReboot; /**< Flag to force device reboot */
+extern bool isSearchingSat; /**< Flag to indicate that device is searching for satellites */
+extern lv_obj_t *buttonBar; /**< Button Bar */
+extern lv_obj_t *menuBtn; /**< Button Menu */
+extern lv_obj_t *gpxTagValue; /**< Add/Edit Waypoint screen text area */
+extern bool isScreenRotated; /**< Flag to know if screen is rotated */
+extern bool isTrackLoaded; /**< Flag to know if track is loaded */
extern Storage storage;
#ifdef LARGE_SCREEN
- static const lv_font_t *fontDefault = &lv_font_montserrat_14;
- static const lv_font_t *fontSmall = &lv_font_montserrat_10;
- static const lv_font_t *fontSatInfo = &lv_font_montserrat_16;
- static const lv_font_t *fontMedium = &lv_font_montserrat_16;
- static const lv_font_t *fontLarge = &lv_font_montserrat_20;
- static const lv_font_t *fontLargeMedium = &lv_font_montserrat_24;
- static const lv_font_t *fontVeryLarge = &lv_font_montserrat_48;
- static const lv_font_t *fontOptions = &lv_font_montserrat_18;
- static const float scale = 1.0f;
- static const float scaleBut = 1.0f;
- static const float scaleSatInfo = 1.0f;
+ static const lv_font_t *fontDefault = &lv_font_montserrat_14; /**< Default font for large screens */
+ static const lv_font_t *fontSmall = &lv_font_montserrat_10; /**< Small font for large screens */
+ static const lv_font_t *fontSatInfo = &lv_font_montserrat_16; /**< Satellite info font for large screens */
+ static const lv_font_t *fontMedium = &lv_font_montserrat_16; /**< Medium font for large screens */
+ static const lv_font_t *fontLarge = &lv_font_montserrat_20; /**< Large font for large screens */
+ static const lv_font_t *fontLargeMedium = &lv_font_montserrat_24; /**< Large-medium font for large screens */
+ static const lv_font_t *fontVeryLarge = &lv_font_montserrat_48; /**< Very large font for large screens */
+ static const lv_font_t *fontOptions = &lv_font_montserrat_18; /**< Options font for large screens */
+ static const float scale = 1.0f; /**< UI scale for large screens */
+ static const float scaleBut = 1.0f; /**< Button scale for large screens */
+ static const float scaleSatInfo = 1.0f; /**< Satellite info scale for large screens */
#else
- static const lv_font_t *fontDefault = &lv_font_montserrat_12;
- static const lv_font_t *fontSmall = &lv_font_montserrat_8;
- static const lv_font_t *fontSatInfo = &lv_font_montserrat_10;
- static const lv_font_t *fontMedium = &lv_font_montserrat_14;
- static const lv_font_t *fontLarge = &lv_font_montserrat_12;
- static const lv_font_t *fontLargeMedium = &lv_font_montserrat_16;
- static const lv_font_t *fontVeryLarge = &lv_font_montserrat_38;
- static const lv_font_t *fontOptions = &lv_font_montserrat_12;
- static const float scale = 0.75f;
- static const float scaleBut = 0.60f;
- static const float scaleSatInfo = 0.80f;
+ static const lv_font_t *fontDefault = &lv_font_montserrat_12; /**< Default font for small screens */
+ static const lv_font_t *fontSmall = &lv_font_montserrat_8; /**< Small font for small screens */
+ static const lv_font_t *fontSatInfo = &lv_font_montserrat_10; /**< Satellite info font for small screens */
+ static const lv_font_t *fontMedium = &lv_font_montserrat_14; /**< Medium font for small screens */
+ static const lv_font_t *fontLarge = &lv_font_montserrat_12; /**< Large font for small screens */
+ static const lv_font_t *fontLargeMedium = &lv_font_montserrat_16; /**< Large-medium font for small screens */
+ static const lv_font_t *fontVeryLarge = &lv_font_montserrat_38; /**< Very large font for small screens */
+ static const lv_font_t *fontOptions = &lv_font_montserrat_12; /**< Options font for small screens */
+ static const float scale = 0.75f; /**< UI scale for small screens */
+ static const float scaleBut = 0.60f; /**< Button scale for small screens */
+ static const float scaleSatInfo = 0.80f; /**< Satellite info scale for small screens */
#endif
-static const int iconScale = LV_SCALE_NONE * scale;
-static const int buttonScale = LV_SCALE_NONE * scaleBut;
+
+static const int iconScale = LV_SCALE_NONE * scale; /**< Icon scale factor */
+static const int buttonScale = LV_SCALE_NONE * scaleBut; /**< Button scale factor */
/**
- * @brief Get PNG width and height
+ * @brief Get PNG width and height from file.
*
- * @param filename -> PNG file name
- * @param width -> PNG width
- * @param height -> PNG height
- * @return true/false if file doesn't exists
+ * @param filename PNG file name.
+ * @param width Pointer to store PNG width.
+ * @param height Pointer to store PNG height.
+ * @return true if the file exists and dimensions are read, false otherwise.
*/
static bool getPngSize(const char* filename, uint16_t *width, uint16_t *height)
{
- FILE* file = storage.open(filename, "r");
+ FILE* file = storage.open(filename, "r");
- if (!file)
- return false;
+ if (!file)
+ return false;
- uint8_t table[32];
+ uint8_t table[32];
- fread(table, sizeof(uint8_t), 32, file);
+ fread(table, sizeof(uint8_t), 32, file);
- *width=table[16]*256*256*256+table[17]*256*256+table[18]*256+table[19];
- *height=table[20]*256*256*256+table[21]*256*256+table[22]*256+table[23];
+ *width=table[16]*256*256*256+table[17]*256*256+table[18]*256+table[19];
+ *height=table[20]*256*256*256+table[21]*256*256+table[22]*256+table[23];
- storage.close(file);
+ storage.close(file);
- return true;
+ return true;
}
diff --git a/lib/gui/src/gpxDetailScr.cpp b/lib/gui/src/gpxDetailScr.cpp
index d1722966..29ab5fcd 100644
--- a/lib/gui/src/gpxDetailScr.cpp
+++ b/lib/gui/src/gpxDetailScr.cpp
@@ -2,8 +2,8 @@
* @file gpxDetailScr.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - GPX Tag detail Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "gpxDetailScr.hpp"
@@ -16,7 +16,7 @@ String gpxFileFolder;
// bool gpxWaypoint;
// bool gpxTrack;
-lv_obj_t *gpxDetailScreen;
+lv_obj_t *gpxDetailScreen; /**< Waypoint detail screen */
lv_obj_t *gpxTag;
lv_obj_t *gpxTagValue;
lv_obj_t *labelLat;
@@ -26,284 +26,286 @@ lv_obj_t *labelLonValue;
bool isScreenRotated = false;
/**
- * @brief GPX Detail Screen event
+ * @brief GPX Detail Screen event handler. Handles key and ready/cancel events for adding or editing GPX waypoints.
*
- * @param event
+ * @param event LVGL event pointer.
*/
static void gpxDetailScreenEvent(lv_event_t *event)
{
- lv_event_code_t code = lv_event_get_code(event);
- lv_obj_t *tagName = (lv_obj_t *)lv_event_get_target(event);
+ lv_event_code_t code = lv_event_get_code(event);
+ lv_obj_t *tagName = (lv_obj_t *)lv_event_get_target(event);
- #ifdef TDECK_ESP32S3
- if (code == LV_EVENT_KEY)
- {
- if ( lv_indev_get_key(lv_indev_active()) == 13 ) // Enter Key
- {
- createWptFile();
- GPXParser gpx;
+ #ifdef TDECK_ESP32S3
+ if (code == LV_EVENT_KEY)
+ {
+ if ( lv_indev_get_key(lv_indev_active()) == 13 ) // Enter Key
+ {
+ createWptFile();
+ GPXParser gpx;
- switch (gpxAction)
- {
- case WPT_ADD:
- addWpt.name = (char *)lv_textarea_get_text(tagName);
- if (strcmp(addWpt.name,"") != 0)
- {
- gpx.filePath = wptFile;
- gpx.addWaypoint(addWpt);
- }
- break;
- case GPX_EDIT:
- char *newName = (char *)lv_textarea_get_text(tagName);
- if (strcmp(loadWpt.name, newName) != 0)
- {
- gpx.filePath = gpxFileFolder.c_str();
- if (gpxWaypoint)
- gpx.editTagAttrOrElem(gpxWaypointTag, nullptr, gpxNameElem, loadWpt.name, newName);
- if (gpxTrack)
- gpx.editTagAttrOrElem(gpxTrackTag, nullptr, gpxNameElem, loadWpt.name, newName);
- }
- break;
- }
+ switch (gpxAction)
+ {
+ case WPT_ADD:
+ addWpt.name = (char *)lv_textarea_get_text(tagName);
+ if (strcmp(addWpt.name,"") != 0)
+ {
+ gpx.filePath = wptFile;
+ gpx.addWaypoint(addWpt);
+ }
+ break;
+ case GPX_EDIT:
+ char *newName = (char *)lv_textarea_get_text(tagName);
+ if (strcmp(loadWpt.name, newName) != 0)
+ {
+ gpx.filePath = gpxFileFolder.c_str();
+ if (gpxWaypoint)
+ gpx.editTagAttrOrElem(gpxWaypointTag, nullptr, gpxNameElem, loadWpt.name, newName);
+ if (gpxTrack)
+ gpx.editTagAttrOrElem(gpxTrackTag, nullptr, gpxNameElem, loadWpt.name, newName);
+ }
+ break;
+ }
- isMainScreen = true;
- mapView.redrawMap = true;
- gpxAction = WPT_NONE;
- lv_refr_now(display);
- loadMainScreen();
- }
+ isMainScreen = true;
+ mapView.redrawMap = true;
+ gpxAction = WPT_NONE;
+ lv_refr_now(display);
+ loadMainScreen();
+ }
- if ( lv_indev_get_key(lv_indev_active()) == 35 ) // # Key (ESCAPE)
- {
- isMainScreen = true;
- mapView.redrawMap = true;
- gpxAction = WPT_NONE;
- lv_refr_now(display);
- loadMainScreen();
- }
- }
- #endif
+ if ( lv_indev_get_key(lv_indev_active()) == 35 ) // # Key (ESCAPE)
+ {
+ isMainScreen = true;
+ mapView.redrawMap = true;
+ gpxAction = WPT_NONE;
+ lv_refr_now(display);
+ loadMainScreen();
+ }
+ }
+ #endif
- if (code == LV_EVENT_READY)
- {
- if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_270)
- {
- tft.setRotation(0);
- lv_display_set_rotation(display,LV_DISPLAY_ROTATION_0);
- }
-
- createWptFile();
- GPXParser gpx;
+ if (code == LV_EVENT_READY)
+ {
+ if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_270)
+ {
+ tft.setRotation(0);
+ lv_display_set_rotation(display,LV_DISPLAY_ROTATION_0);
+ }
+
+ createWptFile();
+ GPXParser gpx;
- switch (gpxAction)
- {
- case WPT_ADD:
- addWpt.name = (char *)lv_textarea_get_text(tagName);
- if (strcmp(addWpt.name,"") != 0)
- {
- gpx.filePath = wptFile;
- gpx.addWaypoint(addWpt);
- }
- break;
- case GPX_EDIT:
- char *newName = (char *)lv_textarea_get_text(tagName);
- if (strcmp(loadWpt.name, newName) != 0)
- {
- gpx.filePath = gpxFileFolder.c_str();
- if (gpxWaypoint)
- gpx.editTagAttrOrElem(gpxWaypointTag, nullptr, gpxNameElem, loadWpt.name, newName);
- if (gpxTrack)
- gpx.editTagAttrOrElem(gpxTrackTag, nullptr, gpxNameElem, loadWpt.name, newName);
- }
- break;
- }
+ switch (gpxAction)
+ {
+ case WPT_ADD:
+ addWpt.name = (char *)lv_textarea_get_text(tagName);
+ if (strcmp(addWpt.name,"") != 0)
+ {
+ gpx.filePath = wptFile;
+ gpx.addWaypoint(addWpt);
+ }
+ break;
+ case GPX_EDIT:
+ char *newName = (char *)lv_textarea_get_text(tagName);
+ if (strcmp(loadWpt.name, newName) != 0)
+ {
+ gpx.filePath = gpxFileFolder.c_str();
+ if (gpxWaypoint)
+ gpx.editTagAttrOrElem(gpxWaypointTag, nullptr, gpxNameElem, loadWpt.name, newName);
+ if (gpxTrack)
+ gpx.editTagAttrOrElem(gpxTrackTag, nullptr, gpxNameElem, loadWpt.name, newName);
+ }
+ break;
+ }
- isMainScreen = true;
- mapView.redrawMap = true;
- gpxAction = WPT_NONE;
- lv_refr_now(display);
- loadMainScreen();
- }
+ isMainScreen = true;
+ mapView.redrawMap = true;
+ gpxAction = WPT_NONE;
+ lv_refr_now(display);
+ loadMainScreen();
+ }
- if (code == LV_EVENT_CANCEL)
- {
- if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_270)
- {
- tft.setRotation(0);
- lv_display_set_rotation(display,LV_DISPLAY_ROTATION_0);
- }
- isMainScreen = true;
- mapView.redrawMap = true;
- gpxAction = WPT_NONE;
- lv_refr_now(display);
- loadMainScreen();
- }
+ if (code == LV_EVENT_CANCEL)
+ {
+ if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_270)
+ {
+ tft.setRotation(0);
+ lv_display_set_rotation(display,LV_DISPLAY_ROTATION_0);
+ }
+ isMainScreen = true;
+ mapView.redrawMap = true;
+ gpxAction = WPT_NONE;
+ lv_refr_now(display);
+ loadMainScreen();
+ }
}
/**
- * @brief Rotate Screen event
+ * @brief Rotate Screen event handler. Toggles the screen rotation state and updates the display accordingly.
*
- * @param event
+ * @param event LVGL event pointer.
*/
static void rotateScreen(lv_event_t *event)
{
- isScreenRotated = !isScreenRotated;
- log_v("%d",isScreenRotated);
- if (isScreenRotated)
- {
- tft.setRotation(1);
- lv_display_set_rotation(display, LV_DISPLAY_ROTATION_270);
- }
- else
- {
- tft.setRotation(0);
- lv_display_set_rotation(display, LV_DISPLAY_ROTATION_0);
- }
- lv_obj_set_width(gpxTagValue, tft.width() -10);
- lv_refr_now(display);
+ isScreenRotated = !isScreenRotated;
+ log_v("%d",isScreenRotated);
+ if (isScreenRotated)
+ {
+ tft.setRotation(1);
+ lv_display_set_rotation(display, LV_DISPLAY_ROTATION_270);
+ }
+ else
+ {
+ tft.setRotation(0);
+ lv_display_set_rotation(display, LV_DISPLAY_ROTATION_0);
+ }
+ lv_obj_set_width(gpxTagValue, tft.width() -10);
+ lv_refr_now(display);
}
/**
- * @brief GPX Tag Name event
+ * @brief GPX Waypoint Name event handler. Handles click event for adding or editing the GPX waypoint name.
*
- * @param event
+ * @param event LVGL event pointer.
*/
static void gpxTagNameEvent(lv_event_t *event)
{
- lv_event_code_t code = lv_event_get_code(event);
+ lv_event_code_t code = lv_event_get_code(event);
- if(code == LV_EVENT_CLICKED)
- {
- createWptFile();
- GPXParser gpx;
+ if(code == LV_EVENT_CLICKED)
+ {
+ createWptFile();
+ GPXParser gpx;
- switch (gpxAction)
- {
- case WPT_ADD:
- addWpt.name = (char *)lv_textarea_get_text(gpxTagValue);
- if (strcmp(addWpt.name,"") != 0)
- {
- gpx.filePath = wptFile;
- gpx.addWaypoint(addWpt);
- }
- case GPX_EDIT:
- char *newName = (char *)lv_textarea_get_text(gpxTagValue);
- if (strcmp(loadWpt.name, newName) != 0)
- {
- gpx.filePath = gpxFileFolder.c_str();
- if (gpxWaypoint)
- gpx.editTagAttrOrElem(gpxWaypointTag, nullptr, gpxNameElem, loadWpt.name, newName);
- if (gpxTrack)
- gpx.editTagAttrOrElem(gpxTrackTag, nullptr, gpxNameElem, loadWpt.name, newName);
- }
- break;
- }
+ switch (gpxAction)
+ {
+ case WPT_ADD:
+ addWpt.name = (char *)lv_textarea_get_text(gpxTagValue);
+ if (strcmp(addWpt.name,"") != 0)
+ {
+ gpx.filePath = wptFile;
+ gpx.addWaypoint(addWpt);
+ }
+ case GPX_EDIT:
+ char *newName = (char *)lv_textarea_get_text(gpxTagValue);
+ if (strcmp(loadWpt.name, newName) != 0)
+ {
+ gpx.filePath = gpxFileFolder.c_str();
+ if (gpxWaypoint)
+ gpx.editTagAttrOrElem(gpxWaypointTag, nullptr, gpxNameElem, loadWpt.name, newName);
+ if (gpxTrack)
+ gpx.editTagAttrOrElem(gpxTrackTag, nullptr, gpxNameElem, loadWpt.name, newName);
+ }
+ break;
+ }
- isMainScreen = true;
- mapView.redrawMap = true;
- gpxAction = WPT_NONE;
- lv_refr_now(display);
- loadMainScreen();
- }
+ isMainScreen = true;
+ mapView.redrawMap = true;
+ gpxAction = WPT_NONE;
+ lv_refr_now(display);
+ loadMainScreen();
+ }
}
/**
- * @brief Update current waypoint
+ * @brief Update current waypoint.
*
- * @param action add or edit action
+ * @param action Action type (add or edit).
*/
void updateWaypoint(uint8_t action)
{
- switch (action)
- {
- case WPT_ADD:
- addWpt.lat = gps.gpsData.latitude;
- addWpt.lon = gps.gpsData.longitude;
- addWpt.ele = gps.gpsData.altitude;
- addWpt.sat = gps.gpsData.satellites;
- addWpt.hdop = gps.gpsData.hdop;
- addWpt.pdop = gps.gpsData.pdop;
- addWpt.vdop = gps.gpsData.vdop;
- lv_label_set_text_static(labelLatValue, latFormatString(addWpt.lat));
- lv_label_set_text_static(labelLonValue, lonFormatString(addWpt.lon));
- break;
- case GPX_EDIT:
- lv_label_set_text_static(labelLatValue, latFormatString(loadWpt.lat));
- lv_label_set_text_static(labelLonValue, lonFormatString(loadWpt.lon));
- break;
- default:
- break;
- }
+ switch (action)
+ {
+ case WPT_ADD:
+ addWpt.lat = gps.gpsData.latitude;
+ addWpt.lon = gps.gpsData.longitude;
+ addWpt.ele = gps.gpsData.altitude;
+ addWpt.sat = gps.gpsData.satellites;
+ addWpt.hdop = gps.gpsData.hdop;
+ addWpt.pdop = gps.gpsData.pdop;
+ addWpt.vdop = gps.gpsData.vdop;
+ lv_label_set_text_static(labelLatValue, latFormatString(addWpt.lat));
+ lv_label_set_text_static(labelLonValue, lonFormatString(addWpt.lon));
+ break;
+ case GPX_EDIT:
+ lv_label_set_text_static(labelLatValue, latFormatString(loadWpt.lat));
+ lv_label_set_text_static(labelLonValue, lonFormatString(loadWpt.lon));
+ break;
+ default:
+ break;
+ }
}
/**
* @brief Create Waypoint screen
*
+ * @details Initializes the GPX Detail screen, including the text area for waypoint name,
+ * rotation button (if not TDECK_ESP32S3), and labels for latitude and longitude values.
*/
void createGpxDetailScreen()
{
- gpxDetailScreen = lv_obj_create(NULL);
+ gpxDetailScreen = lv_obj_create(NULL);
- gpxTagValue = lv_textarea_create(gpxDetailScreen);
- lv_textarea_set_one_line(gpxTagValue, true);
- lv_obj_align(gpxTagValue, LV_ALIGN_TOP_MID, 0, 40);
- lv_obj_set_width(gpxTagValue, tft.width() - 10);
- lv_obj_add_state(gpxTagValue, LV_STATE_FOCUSED);
- lv_obj_add_event_cb(gpxTagValue, gpxDetailScreenEvent, LV_EVENT_ALL, gpxDetailScreen);
- #ifndef TDECK_ESP32S3
- lv_obj_t *keyboard = lv_keyboard_create(gpxDetailScreen);
- lv_keyboard_set_mode(keyboard,LV_KEYBOARD_MODE_TEXT_UPPER);
- lv_keyboard_set_textarea(keyboard, gpxTagValue);
- #endif
+ gpxTagValue = lv_textarea_create(gpxDetailScreen);
+ lv_textarea_set_one_line(gpxTagValue, true);
+ lv_obj_align(gpxTagValue, LV_ALIGN_TOP_MID, 0, 40);
+ lv_obj_set_width(gpxTagValue, tft.width() - 10);
+ lv_obj_add_state(gpxTagValue, LV_STATE_FOCUSED);
+ lv_obj_add_event_cb(gpxTagValue, gpxDetailScreenEvent, LV_EVENT_ALL, gpxDetailScreen);
+ #ifndef TDECK_ESP32S3
+ lv_obj_t *keyboard = lv_keyboard_create(gpxDetailScreen);
+ lv_keyboard_set_mode(keyboard,LV_KEYBOARD_MODE_TEXT_UPPER);
+ lv_keyboard_set_textarea(keyboard, gpxTagValue);
+ #endif
- #ifdef TDECK_ESP32S3
- lv_group_add_obj(scrGroup, gpxTagValue);
- lv_group_focus_obj(gpxTagValue);
- #endif
+ #ifdef TDECK_ESP32S3
+ lv_group_add_obj(scrGroup, gpxTagValue);
+ lv_group_focus_obj(gpxTagValue);
+ #endif
- #ifndef TDECK_ESP32S3
- // Rotate Screen button
- static lv_style_t editBtnStyleOn;
- lv_style_init(&editBtnStyleOn);
- lv_style_set_bg_color(&editBtnStyleOn, lv_color_black());
- lv_style_set_text_color(&editBtnStyleOn, lv_color_white());
- lv_obj_t *rotateScreenBtn = lv_button_create(gpxDetailScreen);
- lv_obj_add_style(rotateScreenBtn, &editBtnStyleOn, LV_PART_MAIN | LV_STATE_DEFAULT);
- lv_obj_align(rotateScreenBtn, LV_ALIGN_TOP_RIGHT, -10, 5);
- lv_obj_add_flag(rotateScreenBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(rotateScreenBtn, rotateScreen, LV_EVENT_CLICKED, NULL);
- lv_obj_set_size(rotateScreenBtn, 40, 35);
- lv_obj_t *rotateScreenLbl = lv_label_create(rotateScreenBtn);
- lv_label_set_text(rotateScreenLbl, LV_SYMBOL_LOOP);
- lv_obj_center(rotateScreenLbl);
- #endif
+ #ifndef TDECK_ESP32S3
+ // Rotate Screen button
+ static lv_style_t editBtnStyleOn;
+ lv_style_init(&editBtnStyleOn);
+ lv_style_set_bg_color(&editBtnStyleOn, lv_color_black());
+ lv_style_set_text_color(&editBtnStyleOn, lv_color_white());
+ lv_obj_t *rotateScreenBtn = lv_button_create(gpxDetailScreen);
+ lv_obj_add_style(rotateScreenBtn, &editBtnStyleOn, LV_PART_MAIN | LV_STATE_DEFAULT);
+ lv_obj_align(rotateScreenBtn, LV_ALIGN_TOP_RIGHT, -10, 5);
+ lv_obj_add_flag(rotateScreenBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(rotateScreenBtn, rotateScreen, LV_EVENT_CLICKED, NULL);
+ lv_obj_set_size(rotateScreenBtn, 40, 35);
+ lv_obj_t *rotateScreenLbl = lv_label_create(rotateScreenBtn);
+ lv_label_set_text(rotateScreenLbl, LV_SYMBOL_LOOP);
+ lv_obj_center(rotateScreenLbl);
+ #endif
- gpxTag = lv_label_create(gpxDetailScreen);
- lv_obj_set_style_text_font(gpxTag, fontOptions, 0);
- lv_label_set_text_static(gpxTag, LV_SYMBOL_LEFT " Waypoint Name:");
- lv_obj_center(gpxTag);
- lv_obj_align(gpxTag,LV_ALIGN_TOP_LEFT,10,10);
- lv_obj_add_flag(gpxTag, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_event_cb(gpxTag, gpxTagNameEvent, LV_EVENT_ALL, NULL);
+ gpxTag = lv_label_create(gpxDetailScreen);
+ lv_obj_set_style_text_font(gpxTag, fontOptions, 0);
+ lv_label_set_text_static(gpxTag, LV_SYMBOL_LEFT " Waypoint Name:");
+ lv_obj_center(gpxTag);
+ lv_obj_align(gpxTag,LV_ALIGN_TOP_LEFT,10,10);
+ lv_obj_add_flag(gpxTag, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(gpxTag, gpxTagNameEvent, LV_EVENT_ALL, NULL);
- labelLat = lv_label_create(gpxDetailScreen);
- lv_obj_set_style_text_font(labelLat, fontOptions, 0);
- lv_label_set_text_static(labelLat, "Lat:");
- lv_obj_set_pos(labelLat, 10, 90);
+ labelLat = lv_label_create(gpxDetailScreen);
+ lv_obj_set_style_text_font(labelLat, fontOptions, 0);
+ lv_label_set_text_static(labelLat, "Lat:");
+ lv_obj_set_pos(labelLat, 10, 90);
- labelLon = lv_label_create(gpxDetailScreen);
- lv_obj_set_style_text_font(labelLon, fontOptions, 0);
- lv_label_set_text_static(labelLon, "Lon:");
- lv_obj_set_pos(labelLon, 10, 120);
+ labelLon = lv_label_create(gpxDetailScreen);
+ lv_obj_set_style_text_font(labelLon, fontOptions, 0);
+ lv_label_set_text_static(labelLon, "Lon:");
+ lv_obj_set_pos(labelLon, 10, 120);
- labelLatValue = lv_label_create(gpxDetailScreen);
- lv_obj_set_style_text_font(labelLatValue, fontOptions, 0);
- lv_label_set_text_static(labelLatValue, latFormatString(addWpt.lat));
- lv_obj_set_pos(labelLatValue, 60, 90);
-
- labelLonValue = lv_label_create(gpxDetailScreen);
- lv_obj_set_style_text_font(labelLonValue, fontOptions, 0);
- lv_label_set_text_static(labelLonValue, lonFormatString(addWpt.lon));
- lv_obj_set_pos(labelLonValue, 60, 120);
+ labelLatValue = lv_label_create(gpxDetailScreen);
+ lv_obj_set_style_text_font(labelLatValue, fontOptions, 0);
+ lv_label_set_text_static(labelLatValue, latFormatString(addWpt.lat));
+ lv_obj_set_pos(labelLatValue, 60, 90);
+
+ labelLonValue = lv_label_create(gpxDetailScreen);
+ lv_obj_set_style_text_font(labelLonValue, fontOptions, 0);
+ lv_label_set_text_static(labelLonValue, lonFormatString(addWpt.lon));
+ lv_obj_set_pos(labelLonValue, 60, 120);
}
diff --git a/lib/gui/src/gpxDetailScr.hpp b/lib/gui/src/gpxDetailScr.hpp
index d2b9411e..7d37930a 100644
--- a/lib/gui/src/gpxDetailScr.hpp
+++ b/lib/gui/src/gpxDetailScr.hpp
@@ -2,8 +2,8 @@
* @file gpxDetailScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - GPX Tag detail Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -12,13 +12,13 @@
#include "gpxScr.hpp"
#include "mainScr.hpp"
-extern lv_obj_t *gpxTagValue;
-extern lv_obj_t *gpxTag;
-extern lv_obj_t *labelLat;
-extern lv_obj_t *labelLatValue;
-extern lv_obj_t *labelLon;
-extern lv_obj_t *labelLonValue;
-extern bool isScreenRotated;
+extern lv_obj_t *gpxTagValue; /**< Add/Edit Waypoint name screen text area */
+extern lv_obj_t *gpxTag; /**< Name Tag label */
+extern lv_obj_t *labelLat; /**< Latitude label */
+extern lv_obj_t *labelLatValue; /**< Latitude value label */
+extern lv_obj_t *labelLon; /**< Longitude label */
+extern lv_obj_t *labelLonValue; /**< Longitude value label */
+extern bool isScreenRotated; /**< Flag to know if screen is rotated */
void loadMainScreen();
diff --git a/lib/gui/src/gpxScr.cpp b/lib/gui/src/gpxScr.cpp
index f04435ff..bed7970f 100644
--- a/lib/gui/src/gpxScr.cpp
+++ b/lib/gui/src/gpxScr.cpp
@@ -2,8 +2,8 @@
* @file gpxScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - GPX list screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "gpxScr.hpp"
@@ -16,201 +16,214 @@ extern bool isWaypointOpt;
extern bool isTrackOpt;
bool gpxWaypoint = false;
bool gpxTrack = false;
-extern std::vector trackData;
+bool isTrackLoaded = false;
-lv_obj_t *listGPXScreen; // Add Waypoint Screen
+extern std::vector trackData; /**< Vector containing track waypoints */
+extern std::vector turnPoints; /**< Vector containing turn points */
+
+lv_obj_t *listGPXScreen; /**< Add Waypoint screen */
static const char* TAG PROGMEM = "GPX List Screen";
/**
- * @brief Way point list event
- *
+ * @brief Waypoint list event handler. Handles long-press events on the GPX waypoint list for load, edit, or delete actions.
+ *
+ * @param event LVGL event pointer.
*/
void gpxListEvent(lv_event_t *event)
{
- lv_event_code_t code = lv_event_get_code(event);
- lv_obj_t *obj = (lv_obj_t *)lv_event_get_current_target(event);
- uint32_t row;
- uint32_t col;
-
- if (code == LV_EVENT_LONG_PRESSED)
- {
- lv_table_get_selected_cell(obj, &row, &col);
-
- if (row != 0)
- {
- String sel = String(lv_table_get_cell_value(obj, row, col));
- String gpxName = sel.substring(6,sel.length());
- String gpxFile = String(lv_table_get_cell_value(obj, row, col+1));
-
- if (gpxWaypoint)
- gpxFileFolder = String(wptFolder) + "/" + gpxFile;
- else if (gpxTrack)
- gpxFileFolder = String(trkFolder) + "/" + gpxFile;
-
- GPXParser gpx(gpxFileFolder.c_str());
-
- if (!sel.isEmpty())
- {
- switch (gpxAction)
- {
- case GPX_LOAD:
- if (gpxWaypoint)
- {
- loadWpt = gpx.getWaypointInfo(gpxName.c_str());
- LV_IMG_DECLARE(navup);
- lv_img_set_src(arrowNav, &navup);
-
- if (loadWpt.lat != 0 && loadWpt.lon != 0)
- {
- lv_obj_clear_flag(navTile, LV_OBJ_FLAG_HIDDEN);
-
- lv_label_set_text_fmt(latNav, "%s", latFormatString(loadWpt.lat));
- lv_label_set_text_fmt(lonNav, "%s", lonFormatString(loadWpt.lon));
- lv_label_set_text_fmt(nameNav, "%s", loadWpt.name);
-
- mapView.setWaypoint(loadWpt.lat, loadWpt.lon);
- mapView.updateMap();
-
- lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
- }
- else
- lv_obj_add_flag(navTile, LV_OBJ_FLAG_HIDDEN);
- }
-
- if (gpxTrack)
- {
- gpx.loadTrack(trackData);
- mapView.updateMap();
- lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
- }
-
- loadMainScreen();
- break;
- case GPX_EDIT:
- isMainScreen = false;
- mapView.redrawMap = false;
-
- if (gpxWaypoint)
- {
- loadWpt = gpx.getWaypointInfo(gpxName.c_str());
- lv_textarea_set_text(gpxTagValue, loadWpt.name);
- lv_label_set_text_static(gpxTag, LV_SYMBOL_LEFT " Waypoint Name:");
- lv_obj_clear_flag(labelLat, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(labelLatValue, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(labelLon, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(labelLonValue, LV_OBJ_FLAG_HIDDEN);
- }
-
- if (gpxTrack)
- {
- loadWpt.name = strdup(gpxName.c_str());
- lv_textarea_set_text(gpxTagValue, loadWpt.name);
- lv_label_set_text_static(gpxTag, LV_SYMBOL_LEFT " Track Name:");
- lv_obj_add_flag(labelLat, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(labelLatValue, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(labelLon, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(labelLonValue, LV_OBJ_FLAG_HIDDEN);
- }
-
- isScreenRotated = false;
- lv_obj_set_width(gpxTagValue, tft.width() - 10);
- updateWaypoint(gpxAction);
- lv_screen_load(gpxDetailScreen);
-
- break;
- case GPX_DEL:
- if (gpxWaypoint)
- gpx.deleteTagByName(gpxWaypointTag, gpxName.c_str());
- if (gpxTrack)
- gpx.deleteTagByName(gpxTrackTag, gpxName.c_str());
-
- loadMainScreen();
- break;
- default:
- break;
- }
- }
- }
- else if (row == 0)
- {
- lv_obj_add_flag(navTile, LV_OBJ_FLAG_HIDDEN);
- loadMainScreen();
- }
- }
+ lv_event_code_t code = lv_event_get_code(event);
+ lv_obj_t *obj = (lv_obj_t *)lv_event_get_current_target(event);
+ uint32_t row;
+ uint32_t col;
+
+ if (code == LV_EVENT_LONG_PRESSED)
+ {
+ lv_table_get_selected_cell(obj, &row, &col);
+
+ if (row != 0)
+ {
+ String sel = String(lv_table_get_cell_value(obj, row, col));
+ String gpxName = sel.substring(6,sel.length());
+ String gpxFile = String(lv_table_get_cell_value(obj, row, col+1));
+
+ if (gpxWaypoint)
+ gpxFileFolder = String(wptFolder) + "/" + gpxFile;
+ else if (gpxTrack)
+ gpxFileFolder = String(trkFolder) + "/" + gpxFile;
+
+ GPXParser gpx(gpxFileFolder.c_str());
+
+ if (!sel.isEmpty())
+ {
+ switch (gpxAction)
+ {
+ case GPX_LOAD:
+ showMsg(LV_SYMBOL_DOWNLOAD, " Loading data...");
+ if (gpxWaypoint)
+ {
+ loadWpt = gpx.getWaypointInfo(gpxName.c_str());
+ LV_IMG_DECLARE(navup);
+ lv_img_set_src(arrowNav, &navup);
+
+ if (loadWpt.lat != 0 && loadWpt.lon != 0)
+ {
+ lv_obj_clear_flag(navTile, LV_OBJ_FLAG_HIDDEN);
+
+ lv_label_set_text_fmt(latNav, "%s", latFormatString(loadWpt.lat));
+ lv_label_set_text_fmt(lonNav, "%s", lonFormatString(loadWpt.lon));
+ lv_label_set_text_fmt(nameNav, "%s", loadWpt.name);
+
+ mapView.setWaypoint(loadWpt.lat, loadWpt.lon);
+ mapView.updateMap();
+
+ lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
+ }
+ else
+ lv_obj_add_flag(navTile, LV_OBJ_FLAG_HIDDEN);
+ }
+
+ if (gpxTrack)
+ {
+ gpx.loadTrack(trackData);
+ turnPoints = gpx.getTurnPointsSlidingWindow(18.0f, 10, 70.0f, 5, trackData);
+ isTrackLoaded = true;
+ lv_obj_clear_flag(turnByTurn,LV_OBJ_FLAG_HIDDEN);
+ mapView.updateMap();
+ lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
+ }
+ closeMsg();
+ loadMainScreen();
+ break;
+ case GPX_EDIT:
+ isMainScreen = false;
+ mapView.redrawMap = false;
+
+ if (gpxWaypoint)
+ {
+ loadWpt = gpx.getWaypointInfo(gpxName.c_str());
+ lv_textarea_set_text(gpxTagValue, loadWpt.name);
+ lv_label_set_text_static(gpxTag, LV_SYMBOL_LEFT " Waypoint Name:");
+ lv_obj_clear_flag(labelLat, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(labelLatValue, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(labelLon, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(labelLonValue, LV_OBJ_FLAG_HIDDEN);
+ }
+
+ if (gpxTrack)
+ {
+ loadWpt.name = strdup(gpxName.c_str());
+ lv_textarea_set_text(gpxTagValue, loadWpt.name);
+ lv_label_set_text_static(gpxTag, LV_SYMBOL_LEFT " Track Name:");
+ lv_obj_add_flag(labelLat, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(labelLatValue, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(labelLon, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(labelLonValue, LV_OBJ_FLAG_HIDDEN);
+ }
+
+ isScreenRotated = false;
+ lv_obj_set_width(gpxTagValue, tft.width() - 10);
+ updateWaypoint(gpxAction);
+ lv_screen_load(gpxDetailScreen);
+
+ break;
+ case GPX_DEL:
+ if (gpxWaypoint)
+ gpx.deleteTagByName(gpxWaypointTag, gpxName.c_str());
+ if (gpxTrack)
+ gpx.deleteTagByName(gpxTrackTag, gpxName.c_str());
+
+ loadMainScreen();
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ else if (row == 0)
+ {
+ lv_obj_add_flag(navTile, LV_OBJ_FLAG_HIDDEN);
+ loadMainScreen();
+ }
+ }
}
/**
* @brief Create List Waypoint Screen
*
+ * @details Initializes the GPX Waypoint List screen with a two-column table,
+ * sets up column widths, headers, styles, and attaches the event callback for handling user actions.
*/
void createGpxListScreen()
{
- listGPXScreen = lv_table_create(NULL);
- lv_table_set_col_cnt(listGPXScreen, 2);
- lv_table_set_column_width(listGPXScreen,1,400);
- lv_obj_set_size(listGPXScreen, TFT_WIDTH, TFT_HEIGHT);
- lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
- lv_table_set_cell_value(listGPXScreen, 0, 1, LV_SYMBOL_FILE " File");
- lv_table_set_column_width(listGPXScreen, 0, TFT_WIDTH);
- lv_obj_add_event_cb(listGPXScreen, gpxListEvent, LV_EVENT_ALL, NULL);
- lv_obj_set_style_pad_ver(listGPXScreen, 15, LV_PART_ITEMS);
- lv_obj_set_style_border_width(listGPXScreen, 1, LV_PART_ITEMS);
- lv_obj_set_style_border_color(listGPXScreen, lv_color_hex(0x303030), LV_PART_ITEMS);
- lv_obj_set_style_border_side(listGPXScreen, LV_BORDER_SIDE_BOTTOM, LV_PART_ITEMS | LV_STATE_DEFAULT);
- lv_obj_set_style_bg_color(listGPXScreen, lv_color_hex(0x303030), LV_PART_ITEMS | LV_STATE_PRESSED);
- lv_obj_set_style_bg_opa(listGPXScreen, LV_OPA_100, LV_PART_ITEMS | LV_STATE_PRESSED);
+ listGPXScreen = lv_table_create(NULL);
+ lv_table_set_col_cnt(listGPXScreen, 2);
+ lv_table_set_column_width(listGPXScreen,1,400);
+ lv_obj_set_size(listGPXScreen, TFT_WIDTH, TFT_HEIGHT);
+ lv_table_set_cell_value(listGPXScreen, 0, 0, LV_SYMBOL_LEFT " Waypoints");
+ lv_table_set_cell_value(listGPXScreen, 0, 1, LV_SYMBOL_FILE " File");
+ lv_table_set_column_width(listGPXScreen, 0, TFT_WIDTH);
+ lv_obj_add_event_cb(listGPXScreen, gpxListEvent, LV_EVENT_ALL, NULL);
+ lv_obj_set_style_pad_ver(listGPXScreen, 15, LV_PART_ITEMS);
+ lv_obj_set_style_border_width(listGPXScreen, 1, LV_PART_ITEMS);
+ lv_obj_set_style_border_color(listGPXScreen, lv_color_hex(0x303030), LV_PART_ITEMS);
+ lv_obj_set_style_border_side(listGPXScreen, LV_BORDER_SIDE_BOTTOM, LV_PART_ITEMS | LV_STATE_DEFAULT);
+ lv_obj_set_style_bg_color(listGPXScreen, lv_color_hex(0x303030), LV_PART_ITEMS | LV_STATE_PRESSED);
+ lv_obj_set_style_bg_opa(listGPXScreen, LV_OPA_100, LV_PART_ITEMS | LV_STATE_PRESSED);
}
/**
- * @brief Update List Waypoint Screen from file
+ * @brief Update List Waypoint Screen from file.
*
+ * @details Refreshes the GPX list screen by loading and displaying waypoints or tracks from the corresponding files and folders.
*/
void updateGpxListScreen()
{
- lv_obj_clean(listGPXScreen);
- lv_table_set_row_count(listGPXScreen, 1);
- isMainScreen = false;
-
- if (isWaypointOpt)
- {
- gpxWaypoint = true;
- gpxTrack = false;
- uint16_t totalGpx = 1;
- std::map> waypointByFile = GPXParser::getTagElementList(gpxWaypointTag, gpxNameElem, wptFolder);
-
- for (std::map>::const_iterator it = waypointByFile.begin(); it != waypointByFile.end(); ++it)
- {
- const std::string& fileName = it->first;
- const std::vector& waypointNames = it->second;
-
- for (const std::string& gpxTagValue : waypointNames)
- {
- lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 0, LV_SYMBOL_GPS " - %s", gpxTagValue.c_str());
- lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 1, "%s", fileName.c_str());
- totalGpx++;
- }
- }
- }
-
- if (isTrackOpt)
- {
- gpxWaypoint = false;
- gpxTrack = true;
- uint16_t totalGpx = 1;
- std::map> tracksByFile = GPXParser::getTagElementList(gpxTrackTag, gpxNameElem, trkFolder);
-
- for (std::map>::const_iterator it = tracksByFile.begin(); it != tracksByFile.end(); ++it)
- {
- const std::string& fileName = it->first;
- const std::vector& trackNames = it->second;
-
- for (const std::string& trackName : trackNames)
- {
- lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 0, LV_SYMBOL_SHUFFLE " - %s", trackName.c_str());
- lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 1, "%s", fileName.c_str());
- totalGpx++;
- }
- }
- }
+ lv_obj_clean(listGPXScreen);
+ lv_table_set_row_count(listGPXScreen, 1);
+ isMainScreen = false;
+
+ showMsg(LV_SYMBOL_DOWNLOAD," Getting files...");
+ if (isWaypointOpt)
+ {
+ gpxWaypoint = true;
+ gpxTrack = false;
+ uint16_t totalGpx = 1;
+ std::map> waypointByFile = GPXParser::getTagElementList(gpxWaypointTag, gpxNameElem, wptFolder);
+
+ for (std::map>::const_iterator it = waypointByFile.begin(); it != waypointByFile.end(); ++it)
+ {
+ const std::string& fileName = it->first;
+ const std::vector& waypointNames = it->second;
+
+ for (const std::string& gpxTagValue : waypointNames)
+ {
+ lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 0, LV_SYMBOL_GPS " - %s", gpxTagValue.c_str());
+ lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 1, "%s", fileName.c_str());
+ totalGpx++;
+ }
+ }
+ }
+
+ if (isTrackOpt)
+ {
+ gpxWaypoint = false;
+ gpxTrack = true;
+ uint16_t totalGpx = 1;
+ std::map> tracksByFile = GPXParser::getTagElementList(gpxTrackTag, gpxNameElem, trkFolder);
+
+ for (std::map>::const_iterator it = tracksByFile.begin(); it != tracksByFile.end(); ++it)
+ {
+ const std::string& fileName = it->first;
+ const std::vector& trackNames = it->second;
+
+ for (const std::string& trackName : trackNames)
+ {
+ lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 0, LV_SYMBOL_SHUFFLE " - %s", trackName.c_str());
+ lv_table_set_cell_value_fmt(listGPXScreen, totalGpx, 1, "%s", fileName.c_str());
+ totalGpx++;
+ }
+ }
+ }
+ closeMsg();
}
\ No newline at end of file
diff --git a/lib/gui/src/gpxScr.hpp b/lib/gui/src/gpxScr.hpp
index 4de8d287..2786d015 100644
--- a/lib/gui/src/gpxScr.hpp
+++ b/lib/gui/src/gpxScr.hpp
@@ -2,8 +2,8 @@
* @file gpxScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - GPX list screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -13,9 +13,9 @@
#include "gpxParser.hpp"
#include "buttonBar.hpp"
-extern String gpxFileFolder;
-extern bool gpxTrack;
-extern bool gpxWaypoint;
+extern String gpxFileFolder; /**< GPX file folder path */
+extern bool gpxTrack; /**< Track mode flag */
+extern bool gpxWaypoint; /**< Waypoint mode flag */
void loadMainScreen();
void updateWaypoint(uint8_t action);
diff --git a/lib/gui/src/mainScr.cpp b/lib/gui/src/mainScr.cpp
index 0788cf64..7ef975be 100644
--- a/lib/gui/src/mainScr.cpp
+++ b/lib/gui/src/mainScr.cpp
@@ -2,33 +2,33 @@
* @file mainScr.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Main Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "mainScr.hpp"
-bool isMainScreen = false; // Flag to indicate main screen is selected
-bool isScrolled = true; // Flag to indicate when tileview was scrolled
-bool isReady = false; // Flag to indicate when tileview scroll was finished
-bool isScrollingMap = false; // Flag to indicate if map is scrolling
-bool canScrollMap = false; // Flag to indicate whet can scroll map
-uint8_t activeTile = 0; // Current active tile
-uint8_t gpxAction = WPT_NONE; // Current Waypoint Action
-int heading = 0; // Heading value (Compass or GPS)
-extern uint32_t DOUBLE_TOUCH_EVENT;
+bool isMainScreen = false;
+bool isScrolled = true;
+bool isReady = false;
+bool isScrollingMap = false;
+bool canScrollMap = false;
+uint8_t activeTile = 0;
+uint8_t gpxAction = WPT_NONE;
+int heading = 0;
+
+extern uint32_t DOUBLE_TOUCH_EVENT; /**< Event code for double touch gesture */
extern Compass compass;
extern Gps gps;
extern wayPoint loadWpt;
#ifdef LARGE_SCREEN
-uint8_t toolBarOffset = 100;
-uint8_t toolBarSpace = 60;
-#endif
-#ifndef LARGE_SCREEN
-uint8_t toolBarOffset = 80;
-uint8_t toolBarSpace = 50;
+ uint8_t toolBarOffset = 100; /**< Toolbar offset for large screens */
+ uint8_t toolBarSpace = 60; /**< Toolbar spacing for large screens */
+#else
+ uint8_t toolBarOffset = 80; /**< Toolbar offset for standard screens */
+ uint8_t toolBarSpace = 50; /**< Toolbar spacing for standard screens */
#endif
lv_obj_t *tilesScreen;
@@ -36,575 +36,519 @@ lv_obj_t *compassTile;
lv_obj_t *navTile;
lv_obj_t *mapTile;
lv_obj_t *satTrackTile;
-lv_obj_t *btnFullScreen;
lv_obj_t *btnZoomIn;
lv_obj_t *btnZoomOut;
-Maps mapView;
+lv_obj_t *mapCanvas; /**< LVGL for the map canvas */
+lv_layer_t canvasMapLayer; /**< LVGL drawing layer for the map canvas */
+
+extern Maps mapView;
/**
* @brief Update compass screen event
*
- * @param event
+ * @details Updates the compass screen UI elements (heading, coordinates, altitude, speed, sunrise/sunset) with current GPS and heading data when the relevant event is triggered.
+ *
+ * @param event LVGL event pointer.
*/
void updateCompassScr(lv_event_t *event)
{
- lv_obj_t *obj = (lv_obj_t *)lv_event_get_current_target(event);
- if (obj == compassHeading)
- {
- lv_label_set_text_fmt(compassHeading, "%5d\xC2\xB0", heading);
- lv_img_set_angle(compassImg, -(heading * 10));
- }
- if (obj == latitude)
- lv_label_set_text_fmt(latitude, "%s", latFormatString(gps.gpsData.latitude));
- if (obj == longitude)
- lv_label_set_text_fmt(longitude, "%s", lonFormatString(gps.gpsData.longitude));
- if (obj == altitude)
- lv_label_set_text_fmt(obj, "%4d m.", gps.gpsData.altitude);
- if (obj == speedLabel)
- lv_label_set_text_fmt(obj, "%3d Km/h", gps.gpsData.speed);
- if (obj == sunriseLabel)
- {
- lv_label_set_text_static(obj, gps.gpsData.sunriseHour);
- lv_label_set_text_static(sunsetLabel, gps.gpsData.sunsetHour);
- }
+ lv_obj_t *obj = (lv_obj_t *)lv_event_get_current_target(event);
+ if (obj == compassHeading)
+ {
+ lv_label_set_text_fmt(compassHeading, "%5d\xC2\xB0", heading);
+ lv_img_set_angle(compassImg, -(heading * 10));
+ }
+ if (obj == latitude)
+ lv_label_set_text_fmt(latitude, "%s", latFormatString(gps.gpsData.latitude));
+ if (obj == longitude)
+ lv_label_set_text_fmt(longitude, "%s", lonFormatString(gps.gpsData.longitude));
+ if (obj == altitude)
+ lv_label_set_text_fmt(obj, "%4d m.", gps.gpsData.altitude);
+ if (obj == speedLabel)
+ lv_label_set_text_fmt(obj, "%3d Km/h", gps.gpsData.speed);
+ if (obj == sunriseLabel)
+ {
+ lv_label_set_text_static(obj, gps.gpsData.sunriseHour);
+ lv_label_set_text_static(sunsetLabel, gps.gpsData.sunsetHour);
+ }
}
/**
- * @brief Get the active tile
+ * @brief Show Map Widgets.
*
- * @param event
+ * @details Displays or hides map-related UI widgets based on map user settings
*/
-void getActTile(lv_event_t *event)
+void showMapWidgets()
{
- if (isReady)
- {
- isScrolled = true;
- mapView.redrawMap = true;
-
- if (activeTile == MAP)
- {
- mapView.createMapScrSprites();
- if (mapSet.mapFullScreen)
- {
- lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(menuBtn, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(notifyBarHour, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(notifyBarIcons, LV_OBJ_FLAG_HIDDEN);
- }
- else
- {
- lv_obj_clear_flag(notifyBarHour, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(notifyBarIcons, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(menuBtn, LV_OBJ_FLAG_HIDDEN);
-
- if (isBarOpen)
- lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- else
- lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- }
- }
- else if (activeTile != MAP)
- {
- lv_obj_clear_flag(menuBtn, LV_OBJ_FLAG_HIDDEN);
-
- if (isBarOpen)
- lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- }
- }
- else
- isReady = true;
-
- lv_obj_t *actTile = lv_tileview_get_tile_act(tilesScreen);
- lv_coord_t tileX = lv_obj_get_x(actTile) / TFT_WIDTH;
- activeTile = tileX;
+ lv_obj_clear_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(zoomWidget, LV_OBJ_FLAG_HIDDEN);
+ if (mapSet.showMapSpeed)
+ lv_obj_clear_flag(mapSpeed,LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_add_flag(mapSpeed,LV_OBJ_FLAG_HIDDEN);
+ if (mapSet.showMapCompass)
+ lv_obj_clear_flag(miniCompass,LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_add_flag(miniCompass,LV_OBJ_FLAG_HIDDEN);
+ if (mapSet.showMapScale)
+ lv_obj_clear_flag(scaleWidget,LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_add_flag(scaleWidget,LV_OBJ_FLAG_HIDDEN);
}
/**
- * @brief Tile start scrolling event
+ * @brief Hide Map Widgets.
*
- * @param event
+ * @details Hides all map-related UI widgets on the screen.
*/
-void scrollTile(lv_event_t *event)
+void hideMapWidgets()
{
- isScrolled = false;
- isReady = false;
- mapView.redrawMap = false;
-
- if (mapSet.mapFullScreen)
- {
- lv_obj_clear_flag(notifyBarHour, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(notifyBarIcons, LV_OBJ_FLAG_HIDDEN);
- }
+ lv_obj_add_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(zoomWidget, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(mapSpeed,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(miniCompass,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(scaleWidget,LV_OBJ_FLAG_HIDDEN);
+}
- mapView.deleteMapScrSprites();
+/**
+ * @brief Get the active tile
+ *
+ * @details Handles the tileview scroll event, updates the active tile index, and manages map/widget visibility and bar status.
+ *
+ * @param event LVGL event pointer.
+ */
+void getActTile(lv_event_t *event)
+{
+ if (isReady)
+ {
+ isScrolled = true;
+ mapView.redrawMap = true;
+
+ if (activeTile == MAP)
+ {
+ mapView.createMapScrSprites();
+ if (mapView.isMapFound)
+ showMapWidgets();
+ else
+ hideMapWidgets();
+ }
+
+ if (isBarOpen)
+ lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
+ }
+ else
+ isReady = true;
+
+ lv_obj_t *actTile = lv_tileview_get_tile_act(tilesScreen);
+ lv_coord_t tileX = lv_obj_get_x(actTile) / TFT_WIDTH;
+ activeTile = tileX;
}
/**
- * @brief Update Main Screen
+ * @brief Tile start scrolling event
+ *
+ * @details Handles the beginning of a tile scroll event by resetting scroll and map redraw flags and deleting map screen sprites.
*
+ * @param event LVGL event pointer.
*/
-void updateMainScreen(lv_timer_t *t)
+void scrollTile(lv_event_t *event)
{
- if (isScrolled && isMainScreen)
- {
- switch (activeTile)
- {
- case COMPASS:
- #ifdef ENABLE_COMPASS
- if (!waitScreenRefresh)
- heading = compass.getHeading();
- if (compass.isUpdated())
- lv_obj_send_event(compassHeading, LV_EVENT_VALUE_CHANGED, NULL);
- #endif
- #ifndef ENABLE_COMPASS
- heading = gps.gpsData.heading;
- lv_obj_send_event(compassHeading, LV_EVENT_VALUE_CHANGED, NULL);
- #endif
- if (gps.hasLocationChange())
- {
- lv_obj_send_event(latitude, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_send_event(longitude, LV_EVENT_VALUE_CHANGED, NULL);
- }
- if (gps.isAltitudeChanged())
- lv_obj_send_event(altitude, LV_EVENT_VALUE_CHANGED, NULL);
- if (gps.isSpeedChanged())
- lv_obj_send_event(speedLabel, LV_EVENT_VALUE_CHANGED, NULL);
- break;
-
- case MAP:
- #ifdef ENABLE_COMPASS
- heading = compass.getHeading();
- #endif
- lv_obj_send_event(mapTile, LV_EVENT_VALUE_CHANGED, NULL);
- break;
-
- case NAV:
- lv_obj_send_event(navTile, LV_EVENT_VALUE_CHANGED, NULL);
- break;
-
- case SATTRACK:
- lv_obj_send_event(satTrackTile, LV_EVENT_VALUE_CHANGED, NULL);
- break;
-
- default:
- break;
- }
- }
+ isScrolled = false;
+ isReady = false;
+ mapView.redrawMap = false;
+ mapView.deleteMapScrSprites();
}
/**
- * @brief Map Gesture Event
+ * @brief Update Main Screen.
*
- * @param event
+ * @details Periodically updates the active main screen tiles and its widgets
*/
-void gestureEvent(lv_event_t *event)
+void updateMainScreen(lv_timer_t *t)
{
- lv_dir_t dir = lv_indev_get_gesture_dir(lv_indev_active());
-
- if (showMapToolBar)
- {
- // if (activeTile == MAP && isMainScreen)
- // {
- // switch (dir)
- // {
- // case LV_DIR_LEFT:
- // // mapView.panMap(1,0);
- // mapView.scrollMap(30,0);
- // break;
- // case LV_DIR_RIGHT:
- // // mapView.panMap(-1,0);
- // mapView.scrollMap(-30,0);
- // break;
- // case LV_DIR_TOP:
- // //mapView.panMap(0,1);
- // mapView.scrollMap(0,30);
- // break;
- // case LV_DIR_BOTTOM:
- // // mapView.panMap(0,-1);
- // mapView.scrollMap(0,-30);
- // break;
- // }
- // }
- }
+ if (isScrolled && isMainScreen)
+ {
+ switch (activeTile)
+ {
+ case COMPASS:
+ #ifdef ENABLE_COMPASS
+ if (!waitScreenRefresh)
+ heading = compass.getHeading();
+ if (compass.isUpdated())
+ lv_obj_send_event(compassHeading, LV_EVENT_VALUE_CHANGED, NULL);
+ #endif
+ #ifndef ENABLE_COMPASS
+ heading = gps.gpsData.heading;
+ lv_obj_send_event(compassHeading, LV_EVENT_VALUE_CHANGED, NULL);
+ #endif
+ if (gps.hasLocationChange())
+ {
+ lv_obj_send_event(latitude, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_send_event(longitude, LV_EVENT_VALUE_CHANGED, NULL);
+ }
+ if (gps.isAltitudeChanged())
+ lv_obj_send_event(altitude, LV_EVENT_VALUE_CHANGED, NULL);
+ if (gps.isSpeedChanged())
+ lv_obj_send_event(speedLabel, LV_EVENT_VALUE_CHANGED, NULL);
+ break;
+
+ case MAP:
+ #ifdef ENABLE_COMPASS
+ if (mapSet.mapRotationComp)
+ heading = compass.getHeading();
+ else
+ heading = gps.gpsData.heading;
+ #else
+ heading = gps.gpsData.heading;
+ #endif
+ lv_obj_send_event(mapTile, LV_EVENT_VALUE_CHANGED, NULL);
+ break;
+
+ case NAV:
+ lv_obj_send_event(navTile, LV_EVENT_VALUE_CHANGED, NULL);
+ break;
+
+ case SATTRACK:
+ lv_obj_send_event(satTrackTile, LV_EVENT_VALUE_CHANGED, NULL);
+ break;
+
+ default:
+ break;
+ }
+ }
}
/**
* @brief Update map event
*
- * @param event
+ * @details Handles map update events by generating and displaying the map (vector or render), updating map speed, scale, and compass widgets according to current settings.
+ *
+ * @param event LVGL event pointer.
*/
void updateMap(lv_event_t *event)
{
- if (mapSet.vectorMap)
- mapView.generateVectorMap(zoom);
- else
- mapView.generateRenderMap(zoom);
-
- if (mapView.redrawMap)
- mapView.displayMap();
+ mapView.generateMap(zoom);
+
+ if (mapView.redrawMap)
+ {
+ mapView.displayMap();
+ lv_canvas_set_buffer(mapCanvas, mapView.mapBuffer, tft.width(), tft.height()-27, LV_COLOR_FORMAT_RGB565_SWAPPED);
+ }
+
+ if (mapSet.showMapSpeed)
+ lv_label_set_text_fmt(mapSpeedLabel, "%3d", gps.gpsData.speed);
+
+ if (mapSet.showMapScale)
+ lv_label_set_text_fmt(scaleLabel, "%s", map_scale[zoom]);
+
+ if (mapSet.showMapCompass)
+ {
+ if (mapSet.compassRotation)
+ lv_img_set_angle(mapCompassImg, -(heading * 10));
+ }
}
/**
- * @brief Update Satellite Tracking
+ * @brief Update Satellite Tracking.
*
- * @param event
+ * @details Handles satellite tracking update events by refreshing DOP, altitude labels, and updating satellite SNR and sky plots.
*/
void updateSatTrack(lv_event_t *event)
{
- if (gps.isDOPChanged())
- {
- lv_label_set_text_fmt(pdopLabel, "PDOP: %.1f", gps.gpsData.pdop);
- lv_label_set_text_fmt(hdopLabel, "HDOP: %.1f", gps.gpsData.hdop);
- lv_label_set_text_fmt(vdopLabel, "VDOP: %.1f", gps.gpsData.vdop);
- }
-
- if (gps.isAltitudeChanged())
- lv_label_set_text_fmt(altLabel, "ALT: %4dm.", gps.gpsData.altitude);
-
- drawSatSNR();
- drawSatSky();
+ if (gps.isDOPChanged())
+ {
+ lv_label_set_text_fmt(pdopLabel, "PDOP: %.1f", gps.gpsData.pdop);
+ lv_label_set_text_fmt(hdopLabel, "HDOP: %.1f", gps.gpsData.hdop);
+ lv_label_set_text_fmt(vdopLabel, "VDOP: %.1f", gps.gpsData.vdop);
+ }
+
+ if (gps.isAltitudeChanged())
+ lv_label_set_text_fmt(altLabel, "ALT: %4dm.", gps.gpsData.altitude);
+
+ drawSatSNR();
+ drawSatSky();
}
/**
- * @brief Map Tool Bar Event
+ * @brief Map Tool Bar Event.
*
- * @param event
+ * @details Handles map toolbar visibility toggling, zoom button states, map scrollability, and map centering on GPS.
+ *
+ * @param event LVGL event pointer.
*/
void mapToolBarEvent(lv_event_t *event)
{
- lv_event_code_t code = lv_event_get_code(event);
-
- showMapToolBar = !showMapToolBar;
- canScrollMap = !canScrollMap;
-
- if (!mapSet.mapFullScreen)
- {
- lv_obj_set_pos(btnFullScreen, 10, mapView.mapScrHeight - toolBarOffset);
- lv_obj_set_pos(btnZoomOut, 10, mapView.mapScrHeight - (toolBarOffset + toolBarSpace));
- lv_obj_set_pos(btnZoomIn, 10, mapView.mapScrHeight - (toolBarOffset + (2 * toolBarSpace)));
- }
- else
- {
- lv_obj_set_pos(btnFullScreen, 10, mapView.mapScrFull - (toolBarOffset + 24));
- lv_obj_set_pos(btnZoomOut, 10, mapView.mapScrFull - (toolBarOffset + toolBarSpace + 24));
- lv_obj_set_pos(btnZoomIn, 10, mapView.mapScrFull - (toolBarOffset + (2 * toolBarSpace) + 24));
- }
-
- if (!showMapToolBar)
- {
- lv_obj_clear_flag(btnFullScreen, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_clear_flag(btnZoomOut, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_clear_flag(btnZoomIn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
- mapView.centerOnGps(gps.gpsData.latitude, gps.gpsData.longitude);
- }
- else
- {
- lv_obj_add_flag(btnFullScreen, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_flag(btnZoomOut, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_flag(btnZoomIn, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_clear_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
- }
+ lv_event_code_t code = lv_event_get_code(event);
+
+ showMapToolBar = !showMapToolBar;
+ canScrollMap = !canScrollMap;
+
+ if (!showMapToolBar)
+ {
+ lv_obj_clear_flag(btnZoomOut, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_clear_flag(btnZoomIn, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_add_flag(btnZoomOut, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(btnZoomIn, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
+ mapView.centerOnGps(gps.gpsData.latitude, gps.gpsData.longitude);
+ lv_obj_clear_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ }
+ else
+ {
+ lv_obj_add_flag(btnZoomOut, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_add_flag(btnZoomIn, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_clear_flag(btnZoomOut, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(btnZoomIn, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
+ if (!mapView.followGps)
+ lv_obj_add_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_clear_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ }
}
/**
- * @brief Scrool Map Event
+ * @brief Scroll Map Event.
+ *
+ * @details Handles map scrolling gestures, updating the map view position
*
- * @param event
+ * @param event LVGL event pointer.
*/
void scrollMapEvent(lv_event_t *event)
{
- if (canScrollMap)
- {
- lv_event_code_t code = lv_event_get_code(event);
- lv_indev_t * indev = lv_event_get_indev(event);
- static int last_x = 0, last_y = 0;
- static int dx = 0, dy = 0;
- lv_point_t p;
-
-
- switch (code)
- {
- case LV_EVENT_PRESSED:
- {
- lv_indev_get_point(indev, &p);
- last_x = p.x;
- last_y = p.y;
- isScrollingMap = true;
- break;
- }
-
- case LV_EVENT_PRESSING:
- {
- lv_indev_get_point(indev, &p);
-
- int dx = p.x - last_x;
- int dy = p.y - last_y;
-
- const int SCROLL_THRESHOLD = 5;
-
- if (abs(dx) > SCROLL_THRESHOLD || abs(dy) > SCROLL_THRESHOLD)
- {
- mapView.scrollMap(-dx, -dy);
- last_x = p.x;
- last_y = p.y;
- }
- break;
- }
-
- case LV_EVENT_PRESS_LOST:
- {
- isScrollingMap = false;
- break;
- }
- }
- }
+ if (canScrollMap)
+ {
+ lv_event_code_t code = lv_event_get_code(event);
+ lv_indev_t * indev = lv_event_get_indev(event);
+ static int last_x = 0, last_y = 0;
+ static int dx = 0, dy = 0;
+ lv_point_t p;
+
+
+ switch (code)
+ {
+ case LV_EVENT_PRESSED:
+ {
+ lv_indev_get_point(indev, &p);
+ last_x = p.x;
+ last_y = p.y;
+ isScrollingMap = true;
+ break;
+ }
+
+ case LV_EVENT_PRESSING:
+ {
+ lv_indev_get_point(indev, &p);
+
+ int dx = p.x - last_x;
+ int dy = p.y - last_y;
+
+ const int SCROLL_THRESHOLD = 5;
+
+ if (abs(dx) > SCROLL_THRESHOLD || abs(dy) > SCROLL_THRESHOLD)
+ {
+ mapView.scrollMap(-dx, -dy);
+ lv_obj_add_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ last_x = p.x;
+ last_y = p.y;
+ }
+ break;
+ }
+
+ case LV_EVENT_PRESS_LOST:
+ {
+ lv_obj_clear_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ isScrollingMap = false;
+ break;
+ }
+ }
+ }
}
-
-
/**
- * @brief Full Screen Event Toolbar
+ * @brief Zoom Event Toolbar.
*
- * @param event
- */
-void fullScreenEvent(lv_event_t *event)
-{
- mapSet.mapFullScreen = !mapSet.mapFullScreen;
-
- if (!mapSet.mapFullScreen)
- {
- lv_obj_set_pos(btnFullScreen, 10, mapView.mapScrHeight - toolBarOffset);
- lv_obj_set_pos(btnZoomOut, 10, mapView.mapScrHeight - (toolBarOffset + toolBarSpace));
- lv_obj_set_pos(btnZoomIn, 10, mapView.mapScrHeight - (toolBarOffset + (2 * toolBarSpace)));
-
- if (isBarOpen)
- lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- else
- lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
-
- lv_obj_clear_flag(menuBtn, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(notifyBarHour, LV_OBJ_FLAG_HIDDEN);
- lv_obj_clear_flag(notifyBarIcons, LV_OBJ_FLAG_HIDDEN);
- }
- else
- {
- lv_obj_set_pos(btnFullScreen, 10, mapView.mapScrFull - (toolBarOffset + 24));
- lv_obj_set_pos(btnZoomOut, 10, mapView.mapScrFull - (toolBarOffset + toolBarSpace + 24));
- lv_obj_set_pos(btnZoomIn, 10, mapView.mapScrFull - (toolBarOffset + (2 * toolBarSpace) + 24));
- lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(menuBtn, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(notifyBarHour, LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(notifyBarIcons, LV_OBJ_FLAG_HIDDEN);
- }
-
- mapView.deleteMapScrSprites();
- mapView.createMapScrSprites();
-
- mapView.redrawMap = true;
-
- lv_obj_invalidate(tilesScreen);
- lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
-}
-
-/**
- * @brief Zoom In Event Toolbar
+ * @details Handles zoom in/out toolbar events, updates zoom level, manages map position, and refreshes the map
*
- * @param event
+ * @param event LVGL event pointer.
*/
-void zoomInEvent(lv_event_t *event)
+void zoomEvent(lv_event_t *event)
{
- if (!mapSet.vectorMap)
- {
- if (zoom >= minZoom && zoom < maxZoom)
- zoom++;
- }
- else
- {
- zoom--;
- mapView.isPosMoved = true;
- if (zoom < 1)
- {
- zoom = 1;
- mapView.isPosMoved = false;
- }
- }
-
- lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
+ lv_obj_t *obj = (lv_obj_t *)lv_event_get_current_target(event);
+ if ( obj == btnZoomIn )
+ {
+ if (zoom >= minZoom && zoom < maxZoom)
+ zoom++;
+ }
+ else if ( obj == btnZoomOut )
+ {
+ if (zoom <= maxZoom && zoom > minZoom)
+ zoom--;
+ }
+ lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
+ lv_label_set_text_fmt(zoomLabel, "%2d", zoom);
}
/**
- * @brief Zoom Out Event Toolbar
+ * @brief Handles navigation waypoint screen updates
*
- * @param event
+ * @param event LVGL event pointer.
*/
-void zoomOutEvent(lv_event_t *event)
+void updateNavEvent(lv_event_t *event)
{
- if (!mapSet.vectorMap)
- {
- if (zoom <= maxZoom && zoom > minZoom)
- zoom--;
- }
- else
- {
- zoom++;
- mapView.isPosMoved = true;
- if (zoom > MAX_ZOOM)
- {
- zoom = MAX_ZOOM;
- mapView.isPosMoved = false;
- }
- }
-
- lv_obj_send_event(mapTile, LV_EVENT_REFRESH, NULL);
+ int wptDistance = (int)calcDist(gps.gpsData.latitude, gps.gpsData.longitude, loadWpt.lat, loadWpt.lon);
+ lv_label_set_text_fmt(distNav, "%d m.", wptDistance);
+
+ if (wptDistance == 0)
+ {
+ LV_IMG_DECLARE(navfinish);
+ lv_img_set_src(arrowNav, &navfinish);
+ lv_img_set_angle(arrowNav, 0);
+ }
+ else
+ {
+ #ifdef ENABLE_COMPASS
+ float wptCourse = calcCourse(gps.gpsData.latitude, gps.gpsData.longitude, loadWpt.lat, loadWpt.lon) - compass.getHeading();
+ #endif
+ #ifndef ENABLE_COMPASS
+ float wptCourse = calcCourse(gps.gpsData.latitude, gps.gpsData.longitude, loadWpt.lat, loadWpt.lon) - gps.gpsData.heading;
+ #endif
+ lv_img_set_angle(arrowNav, (wptCourse * 10));
+ }
}
/**
- * @brief Navigation update event
+ * @brief Create Canvas for Map.
+ *
+ * @details Initializes and creates the canvas object for rendering the map on the specified screen.
*
- * @param event
+ * @param screen Pointer to the LVGL screen object.
*/
-void updateNavEvent(lv_event_t *event)
+void createMapCanvas(_lv_obj_t *screen)
{
- int wptDistance = (int)calcDist(gps.gpsData.latitude, gps.gpsData.longitude, loadWpt.lat, loadWpt.lon);
- lv_label_set_text_fmt(distNav, "%d m.", wptDistance);
-
- if (wptDistance == 0)
- {
- LV_IMG_DECLARE(navfinish);
- lv_img_set_src(arrowNav, &navfinish);
- lv_img_set_angle(arrowNav, 0);
- }
- else
- {
-#ifdef ENABLE_COMPASS
- double wptCourse = calcCourse(gps.gpsData.latitude, gps.gpsData.longitude, loadWpt.lat, loadWpt.lon) - compass.getHeading();
-#endif
-#ifndef ENABLE_COMPASS
- double wptCourse = calcCourse(gps.gpsData.latitude, gps.gpsData.longitude, loadWpt.lat, loadWpt.lon) - gps.gpsData.heading;
-#endif
- lv_img_set_angle(arrowNav, (wptCourse * 10));
- }
+ // static lv_color_t *cbuf = (lv_color_t*)heap_caps_aligned_alloc(16, (tft.width()*tft.height()*sizeof(lv_color_t)), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);;
+ mapCanvas = lv_canvas_create(screen);
+ // lv_canvas_set_buffer(mapCanvas, cbuf, tft.width(), tft.height(), LV_COLOR_FORMAT_RGB565);
+ // lv_canvas_fill_bg(mapCanvas, lv_color_white(), LV_OPA_100);
+ // lv_canvas_init_layer(constCanvas, &canvasMapLayer);
}
/**
- * @brief Create Main Screen
+ * @brief Create Main Screen.
*
+ * @details Initializes and configures the main screen and its tiles, widgets, and event callbacks
*/
void createMainScr()
{
- mainScreen = lv_obj_create(NULL);
-
- // Main Screen Tiles
- tilesScreen = lv_tileview_create(mainScreen);
- compassTile = lv_tileview_add_tile(tilesScreen, 0, 0, LV_DIR_RIGHT);
- mapTile = lv_tileview_add_tile(tilesScreen, 1, 0, (lv_dir_t)(LV_DIR_LEFT | LV_DIR_RIGHT));
- navTile = lv_tileview_add_tile(tilesScreen, 2, 0, (lv_dir_t)(LV_DIR_LEFT | LV_DIR_RIGHT));
- lv_obj_add_flag(navTile, LV_OBJ_FLAG_HIDDEN);
- satTrackTile = lv_tileview_add_tile(tilesScreen, 3, 0, LV_DIR_LEFT);
- lv_obj_set_size(tilesScreen, TFT_WIDTH, TFT_HEIGHT - 25);
- lv_obj_set_pos(tilesScreen, 0, 25);
- static lv_style_t styleScroll;
- lv_style_init(&styleScroll);
- lv_style_set_bg_color(&styleScroll, lv_color_hex(0xFFFFFF));
- lv_obj_add_style(tilesScreen, &styleScroll, LV_PART_SCROLLBAR);
- // Main Screen Events
- lv_obj_add_event_cb(tilesScreen, getActTile, LV_EVENT_SCROLL_END, NULL);
- lv_obj_add_event_cb(tilesScreen, scrollTile, LV_EVENT_SCROLL_BEGIN, NULL);
-
- // Compass Tile
-
- // Compass Widget
- compassWidget(compassTile);
- // Position widget
- positionWidget(compassTile);
- // Altitude widget
- altitudeWidget(compassTile);
- // Speed widget
- speedWidget(compassTile);
- // Sunrise/Sunset widget
- sunWidget(compassTile);
-
- // Compass Tile Events
- lv_obj_add_event_cb(compassHeading, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_add_event_cb(latitude, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_add_event_cb(longitude, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_add_event_cb(altitude, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_add_event_cb(speedLabel, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_add_event_cb(sunriseLabel, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_add_event_cb(sunsetLabel, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Map Tile Toolbar
- btnFullScreen = lv_btn_create(mapTile);
- lv_obj_remove_style_all(btnFullScreen);
- lv_obj_set_size(btnFullScreen, 48, 48);
- lv_obj_add_event_cb(btnFullScreen, fullScreenEvent, LV_EVENT_CLICKED, NULL);
-
- btnZoomOut = lv_btn_create(mapTile);
- lv_obj_remove_style_all(btnZoomOut);
- lv_obj_set_size(btnZoomOut, 48, 48);
- lv_obj_add_event_cb(btnZoomOut, zoomOutEvent, LV_EVENT_CLICKED, NULL);
-
- btnZoomIn = lv_btn_create(mapTile);
- lv_obj_remove_style_all(btnZoomIn);
- lv_obj_set_size(btnZoomIn, 48, 48);
- lv_obj_add_event_cb(btnZoomIn, zoomInEvent, LV_EVENT_CLICKED, NULL);
-
- if (!mapSet.mapFullScreen)
- {
- lv_obj_set_pos(btnFullScreen, 10, mapView.mapScrHeight - toolBarOffset);
- lv_obj_set_pos(btnZoomOut, 10, mapView.mapScrHeight - (toolBarOffset + toolBarSpace));
- lv_obj_set_pos(btnZoomIn, 10, mapView.mapScrHeight - (toolBarOffset + (2 * toolBarSpace)));
- }
- else
- {
- lv_obj_set_pos(btnFullScreen, 10, mapView.mapScrFull - (toolBarOffset + 24));
- lv_obj_set_pos(btnZoomOut, 10, mapView.mapScrFull - (toolBarOffset + toolBarSpace + 24));
- lv_obj_set_pos(btnZoomIn, 10, mapView.mapScrFull - (toolBarOffset + (2 * toolBarSpace) + 24));
- }
-
- if (!showMapToolBar)
- {
- lv_obj_clear_flag(btnFullScreen, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_clear_flag(btnZoomOut, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_clear_flag(btnZoomIn, LV_OBJ_FLAG_CLICKABLE);
- }
- else
- {
- lv_obj_add_flag(btnFullScreen, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_flag(btnZoomOut, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_add_flag(btnZoomIn, LV_OBJ_FLAG_CLICKABLE);
- }
-
- // Map Tile Events
- lv_obj_add_event_cb(mapTile, updateMap, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_add_event_cb(mainScreen, gestureEvent, LV_EVENT_GESTURE, NULL);
- DOUBLE_TOUCH_EVENT = lv_event_register_id();
- lv_obj_add_event_cb(mapTile, mapToolBarEvent, (lv_event_code_t)DOUBLE_TOUCH_EVENT, NULL);
- lv_obj_add_event_cb(mapTile, scrollMapEvent, LV_EVENT_ALL, NULL);
-
- // Navigation Tile
- navigationScr(navTile);
-
- // Navigation Tile Events
- lv_obj_add_event_cb(navTile, updateNavEvent, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Satellite Tracking and info Tile
- satelliteScr(satTrackTile);
-#ifdef BOARD_HAS_PSRAM
-#ifndef TDECK_ESP32S3
- createConstCanvas(satTrackTile);
- drawSatConst();
- lv_obj_set_pos(constCanvas, (TFT_WIDTH / 2) - canvasCenter_X, 240);
-#endif
-#ifdef TDECK_ESP32S3
- createConstCanvas(constMsg);
- lv_obj_align(constCanvas, LV_ALIGN_CENTER, 0, 0);
- drawSatConst();
-#endif
-#endif
-
- // Satellite Tracking Event
- lv_obj_add_event_cb(satTrackTile, updateSatTrack, LV_EVENT_VALUE_CHANGED, NULL);
+ mainScreen = lv_obj_create(NULL);
+
+ // Main Screen Tiles
+ tilesScreen = lv_tileview_create(mainScreen);
+ compassTile = lv_tileview_add_tile(tilesScreen, 0, 0, LV_DIR_RIGHT);
+ mapTile = lv_tileview_add_tile(tilesScreen, 1, 0, (lv_dir_t)(LV_DIR_LEFT | LV_DIR_RIGHT));
+ navTile = lv_tileview_add_tile(tilesScreen, 2, 0, (lv_dir_t)(LV_DIR_LEFT | LV_DIR_RIGHT));
+ lv_obj_add_flag(navTile, LV_OBJ_FLAG_HIDDEN);
+ satTrackTile = lv_tileview_add_tile(tilesScreen, 3, 0, LV_DIR_LEFT);
+ lv_obj_set_size(tilesScreen, TFT_WIDTH, TFT_HEIGHT - 25);
+ lv_obj_set_pos(tilesScreen, 0, 25);
+ static lv_style_t styleScroll;
+ lv_style_init(&styleScroll);
+ lv_style_set_bg_color(&styleScroll, lv_color_hex(0xFFFFFF));
+ lv_obj_add_style(tilesScreen, &styleScroll, LV_PART_SCROLLBAR);
+ // Main Screen Events
+ lv_obj_add_event_cb(tilesScreen, getActTile, LV_EVENT_SCROLL_END, NULL);
+ lv_obj_add_event_cb(tilesScreen, scrollTile, LV_EVENT_SCROLL_BEGIN, NULL);
+
+ // ********** Compass Tile **********
+ // Compass Widget
+ compassWidget(compassTile);
+ // Position widget
+ positionWidget(compassTile);
+ // Altitude widget
+ altitudeWidget(compassTile);
+ // Speed widget
+ speedWidget(compassTile);
+ // Sunrise/Sunset widget
+ sunWidget(compassTile);
+ // Compass Tile Events
+ lv_obj_add_event_cb(compassHeading, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_add_event_cb(latitude, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_add_event_cb(longitude, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_add_event_cb(altitude, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_add_event_cb(speedLabel, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_add_event_cb(sunriseLabel, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_add_event_cb(sunsetLabel, updateCompassScr, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // ********** Map Tile **********
+ // Map Canvas
+ createMapCanvas(mapTile);
+ // Navigation Arrow Widget
+ navArrowWidget(mapTile);
+ // Map zoom Widget
+ mapZoomWidget(mapTile);
+ // Map speed Widget
+ mapSpeedWidget(mapTile);
+ // Map compass Widget
+ mapCompassWidget(mapTile);
+ // Map scale Widget
+ mapScaleWidget(mapTile);
+ // Turn by Turn navigation widget
+ turnByTurnWidget(mapTile);
+ // Map Tile Toolbar
+ btnZoomOut = lv_img_create(mapTile);
+ lv_img_set_src(btnZoomOut, zoomOutIconFile);
+ lv_img_set_zoom(btnZoomOut,buttonScale);
+ lv_obj_update_layout(btnZoomOut);
+ lv_obj_set_size(btnZoomOut, 48 * scaleBut, 48 * scaleBut);
+ btnZoomIn = lv_img_create(mapTile);
+ lv_img_set_src(btnZoomIn, zoomInIconFile);
+ lv_img_set_zoom(btnZoomIn,buttonScale);
+ lv_obj_update_layout(btnZoomIn);
+ lv_obj_set_size(btnZoomIn, 48 * scaleBut, 48 * scaleBut);
+ lv_obj_set_pos(btnZoomOut, 10, mapView.mapScrHeight - toolBarOffset);
+ lv_obj_set_pos(btnZoomIn, 10, mapView.mapScrHeight - (toolBarOffset + toolBarSpace));
+ if (!showMapToolBar)
+ {
+ lv_obj_clear_flag(btnZoomOut, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_clear_flag(btnZoomIn, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_add_flag(btnZoomOut, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(btnZoomIn, LV_OBJ_FLAG_HIDDEN);
+ }
+ else
+ {
+ lv_obj_add_flag(btnZoomOut, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_add_flag(btnZoomIn, (lv_obj_flag_t)(LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE));
+ lv_obj_clear_flag(btnZoomOut, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_flag(btnZoomIn, LV_OBJ_FLAG_HIDDEN);
+ }
+ // Map Tile Events
+ lv_obj_add_event_cb(mapTile, updateMap, LV_EVENT_VALUE_CHANGED, NULL);
+ DOUBLE_TOUCH_EVENT = lv_event_register_id();
+ lv_obj_add_event_cb(mapTile, mapToolBarEvent, (lv_event_code_t)DOUBLE_TOUCH_EVENT, NULL);
+ lv_obj_add_event_cb(mapTile, scrollMapEvent, LV_EVENT_ALL, NULL);
+ lv_obj_add_event_cb(btnZoomOut, zoomEvent, LV_EVENT_CLICKED, NULL);
+ lv_obj_add_event_cb(btnZoomIn, zoomEvent, LV_EVENT_CLICKED, NULL);
+
+ // ********** Navigation Tile **********
+ navigationScr(navTile);
+ // Navigation Tile Events
+ lv_obj_add_event_cb(navTile, updateNavEvent, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // ********** Satellite Tracking and info Tile **********
+ satelliteScr(satTrackTile);
+ #ifdef BOARD_HAS_PSRAM
+ #ifndef TDECK_ESP32S3
+ createConstCanvas(satTrackTile);
+ drawSatConst();
+ lv_obj_set_pos(constCanvas, (TFT_WIDTH / 2) - canvasCenter_X, 240);
+ #endif
+ #ifdef TDECK_ESP32S3
+ createConstCanvas(constMsg);
+ lv_obj_align(constCanvas, LV_ALIGN_CENTER, 0, 0);
+ drawSatConst();
+ #endif
+ #endif
+ // Satellite Tracking Event
+ lv_obj_add_event_cb(satTrackTile, updateSatTrack, LV_EVENT_VALUE_CHANGED, NULL);
}
diff --git a/lib/gui/src/mainScr.hpp b/lib/gui/src/mainScr.hpp
index df23c724..d439750d 100644
--- a/lib/gui/src/mainScr.hpp
+++ b/lib/gui/src/mainScr.hpp
@@ -3,7 +3,7 @@
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Main Screen
* @version 0.1.9
- * @date 2025-05
+ * @date 2025-06
*/
#pragma once
@@ -16,46 +16,54 @@
#include "navScr.hpp"
#include "satInfoScr.hpp"
#include "compass.hpp"
+#include "navigation.hpp"
-extern lv_timer_t *mainTimer; // Main Screen Timer
-#define UPDATE_MAINSCR_PERIOD 30 // Main Screen update time
+extern lv_timer_t *mainTimer; /**< Main Screen Timer */
+#define UPDATE_MAINSCR_PERIOD 30 /**< Main Screen update period (ms) */
-extern bool isScrolled; // Flag to indicate when tileview was scrolled
-extern bool isMainScreen; // Flag to indicate main screen is selected
-extern bool isReady; // Flag to indicate when tileview scroll was finished
-extern bool canScrollMap; // Flag to indicate whet can scroll map
-extern bool isScrollingMap; // Flag to indicate if map is scrolling
-static TFT_eSprite zoomSprite = TFT_eSprite(&tft); // Zoom sprite
+extern bool isScrolled; /**< Flag to indicate when tileview was scrolled */
+extern bool isMainScreen; /**< Flag to indicate main screen is selected */
+extern bool isReady; /**< Flag to indicate when tileview scroll was finished */
+extern bool canScrollMap; /**< Flag to indicate if map can be scrolled */
+extern bool isScrollingMap; /**< Flag to indicate if map is scrolling */
-extern uint8_t activeTile; // Active Tile in TileView control
-extern int heading; // Heading value (Compass or GPS)
+extern uint8_t activeTile; /**< Active Tile in TileView control */
+extern int heading; /**< Heading value (Compass or GPS) */
+static const char *zoomInIconFile PROGMEM = "/zoomin.bin"; /**< Zoom in icon file path */
+static const char *zoomOutIconFile PROGMEM = "/zoomout.bin"; /**< Zoom out icon file path */
+
+/**
+ * @brief Enum for identifying different tile screens in the application.
+ */
enum tileName
{
- COMPASS,
- MAP,
- NAV,
- SATTRACK,
+ COMPASS, /**< Compass screen */
+ MAP, /**< Map screen */
+ NAV, /**< Navigation screen */
+ SATTRACK, /**< Satellite track screen */
};
/**
* @brief Main Screen Tiles
*
+ * @details LVGL tile objects for main application screens.
*/
-extern lv_obj_t *compassTile;
-extern lv_obj_t *navTile;
-extern lv_obj_t *mapTile;
-extern lv_obj_t *satTrackTile;
+extern lv_obj_t *compassTile; /**< Compass screen tile */
+extern lv_obj_t *navTile; /**< Navigation screen tile */
+extern lv_obj_t *mapTile; /**< Map screen tile */
+extern lv_obj_t *satTrackTile; /**< Satellite track screen tile */
/**
* @brief Map Toolbar Buttons
*
+ * @details Toolbar button objects and toolbar layout configuration.
*/
-extern lv_obj_t *btnFullScreen;
-extern lv_obj_t *btnZoomIn;
-extern lv_obj_t *btnZoomOut;
-extern uint8_t toolBarOffset;
-extern uint8_t toolBarSpace;
+extern lv_obj_t *btnZoomIn; /**< Toolbar button for zooming in */
+extern lv_obj_t *btnZoomOut; /**< Toolbar button for zooming out */
+extern uint8_t toolBarOffset; /**< Offset for toolbar positioning */
+extern uint8_t toolBarSpace; /**< Space between toolbar buttons */
+
void updateCompassScr(lv_event_t * event);
@@ -63,15 +71,14 @@ void getActTile(lv_event_t *event);
void scrollTile(lv_event_t *event);
void updateMainScreen(lv_timer_t *t);
-void gestureEvent(lv_event_t *event);
void updateMap(lv_event_t *event);
void updateSatTrack(lv_event_t *event);
void mapToolBarEvent(lv_event_t *event);
void scrollMapEvent(lv_event_t *event);
-void fullScreenEvent(lv_event_t *event);
-void zoomOutEvent(lv_event_t *event);
-void zoomInEvent(lv_event_t *event);
+void zoomEvent(lv_event_t *event);
void updateNavEvent(lv_event_t *event);
-
+void createMapCanvas(_lv_obj_t *screen);
+void showMapWidgets();
+void hideMapWidgets();
void createMainScr();
\ No newline at end of file
diff --git a/lib/gui/src/mapSettingsScr.cpp b/lib/gui/src/mapSettingsScr.cpp
index cafb6bd5..a3bd6698 100644
--- a/lib/gui/src/mapSettingsScr.cpp
+++ b/lib/gui/src/mapSettingsScr.cpp
@@ -2,255 +2,251 @@
* @file mapSettingsScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Map Settings screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "mapSettingsScr.hpp"
-lv_obj_t *mapSettingsScreen; // Map Settings Screen
+lv_obj_t *mapSettingsScreen; /**< Map Settings Screen. */
+
+extern lv_obj_t *mapSpeed;
+extern lv_obj_t *miniCompass;
+extern lv_obj_t *mapCompassImg;
+extern lv_obj_t *scaleWidget;
+extern lv_obj_t *zoomLabel;
extern Maps mapView;
/**
- * @brief Map Settings Events
+ * @brief Handles events for map settings UI elements, updating configuration, UI visibility, and persistent storage as needed.
*
- * @param event
+ * @param event LVGL event pointer.
*/
static void mapSettingsEvents(lv_event_t *event)
{
- lv_obj_t *obj = lv_event_get_target_obj(event);
- lv_event_code_t code = lv_event_get_code(event);
-
- if (obj == btnBack)
- {
- if (needReboot)
- {
- cfg.saveBool(PKEYS::KMAP_VECTOR, mapSet.vectorMap);
- cfg.saveUInt(PKEYS::KDEF_ZOOM, defaultZoom);
- lv_obj_delete(mapSettingsScreen);
- showRestartScr();
- }
- else
- lv_screen_load(settingsScreen);
- }
-
- if (obj == zoomBtnUp)
- {
- if (code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT)
- {
- lv_spinbox_increment(zoomLevel);
- defaultZoom = (uint8_t)lv_spinbox_get_value(zoomLevel);
- zoom = defaultZoom;
- mapView.isPosMoved = true;
- cfg.saveUInt(PKEYS::KDEF_ZOOM, defaultZoom);
- }
- }
-
- if (obj == zoomBtnDown)
- {
- if (code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT)
- {
- lv_spinbox_decrement(zoomLevel);
- defaultZoom = (uint8_t)lv_spinbox_get_value(zoomLevel);
- zoom = defaultZoom;
- mapView.isPosMoved = true;
- cfg.saveUInt(PKEYS::KDEF_ZOOM, defaultZoom);
- }
- }
-
- if (obj == mapType)
- {
- mapSet.vectorMap = lv_obj_has_state(obj, LV_STATE_CHECKED);
- if (!mapSet.vectorMap)
- {
- minZoom = 6;
- maxZoom = 17;
- }
- else
- {
- minZoom = 1;
- maxZoom = 4;
- }
- lv_spinbox_set_range(zoomLevel, minZoom, maxZoom);
- defaultZoom = (uint8_t)lv_spinbox_get_value(zoomLevel);
- zoom = defaultZoom;
- needReboot = true;
- }
-
- if (obj == mapSwitch)
- {
- mapSet.mapRotationComp = lv_obj_has_state(obj, LV_STATE_CHECKED);
- cfg.saveBool(PKEYS::KMAP_ROT_MODE, mapSet.mapRotationComp);
- }
-
- if (obj == checkCompass)
- {
- mapSet.showMapCompass = lv_obj_has_state(obj, LV_STATE_CHECKED);
- cfg.saveBool(PKEYS::KMAP_COMPASS, mapSet.showMapCompass);
- }
-
- if (obj == checkCompassRot)
- {
- mapSet.compassRotation = lv_obj_has_state(obj, LV_STATE_CHECKED);
- cfg.saveBool(PKEYS::KMAP_COMP_ROT, mapSet.compassRotation);
- }
-
- if (obj == checkSpeed)
- {
- mapSet.showMapSpeed = lv_obj_has_state(obj, LV_STATE_CHECKED);
- cfg.saveBool(PKEYS::KMAP_SPEED, mapSet.showMapSpeed);
- }
-
- if (obj == checkScale)
- {
- mapSet.showMapScale = lv_obj_has_state(obj, LV_STATE_CHECKED);
- cfg.saveBool(PKEYS::KMAP_SCALE, mapSet.showMapScale);
- }
-
- if (obj == checkFullScreen)
- {
- mapSet.mapFullScreen = lv_obj_has_state(obj, LV_STATE_CHECKED);
- cfg.saveBool(PKEYS::KMAP_MODE, mapSet.mapFullScreen);
- needReboot = true;
- }
+ lv_obj_t *obj = lv_event_get_target_obj(event);
+ lv_event_code_t code = lv_event_get_code(event);
+
+ if (obj == btnBack)
+ {
+ if (needReboot)
+ {
+ cfg.saveBool(PKEYS::KMAP_VECTOR, mapSet.vectorMap);
+ cfg.saveUInt(PKEYS::KDEF_ZOOM, defaultZoom);
+ lv_obj_delete(mapSettingsScreen);
+ showRestartScr();
+ }
+ else
+ lv_screen_load(settingsScreen);
+ }
+
+ if (obj == zoomBtnUp)
+ {
+ if (code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT)
+ {
+ lv_spinbox_increment(zoomLevel);
+ defaultZoom = (uint8_t)lv_spinbox_get_value(zoomLevel);
+ zoom = defaultZoom;
+ lv_label_set_text_fmt(zoomLabel, "%2d", zoom);
+ cfg.saveUInt(PKEYS::KDEF_ZOOM, defaultZoom);
+ }
+ }
+
+ if (obj == zoomBtnDown)
+ {
+ if (code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT)
+ {
+ lv_spinbox_decrement(zoomLevel);
+ defaultZoom = (uint8_t)lv_spinbox_get_value(zoomLevel);
+ zoom = defaultZoom;
+ lv_label_set_text_fmt(zoomLabel, "%2d", zoom);
+ cfg.saveUInt(PKEYS::KDEF_ZOOM, defaultZoom);
+ }
+ }
+
+ if (obj == mapType)
+ {
+ mapSet.vectorMap = lv_obj_has_state(obj, LV_STATE_CHECKED);
+ minZoom = 6;
+ maxZoom = 17;
+ lv_spinbox_set_range(zoomLevel, minZoom, maxZoom);
+ defaultZoom = (uint8_t)lv_spinbox_get_value(zoomLevel);
+ zoom = defaultZoom;
+ lv_label_set_text_fmt(zoomLabel, "%2d", zoom);
+ needReboot = true;
+ }
+
+ if (obj == mapSwitch)
+ {
+ mapSet.mapRotationComp = lv_obj_has_state(obj, LV_STATE_CHECKED);
+ cfg.saveBool(PKEYS::KMAP_ROT_MODE, mapSet.mapRotationComp);
+ }
+
+ if (obj == checkCompass)
+ {
+ mapSet.showMapCompass = lv_obj_has_state(obj, LV_STATE_CHECKED);
+ cfg.saveBool(PKEYS::KMAP_COMPASS, mapSet.showMapCompass);
+ if (mapSet.showMapCompass)
+ lv_obj_clear_flag(miniCompass,LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_add_flag(miniCompass,LV_OBJ_FLAG_HIDDEN);
+ }
+
+ if (obj == checkCompassRot)
+ {
+ mapSet.compassRotation = lv_obj_has_state(obj, LV_STATE_CHECKED);
+ cfg.saveBool(PKEYS::KMAP_COMP_ROT, mapSet.compassRotation);
+ if (!mapSet.compassRotation);
+ lv_img_set_angle(mapCompassImg, 0);
+ }
+
+ if (obj == checkSpeed)
+ {
+ mapSet.showMapSpeed = lv_obj_has_state(obj, LV_STATE_CHECKED);
+ cfg.saveBool(PKEYS::KMAP_SPEED, mapSet.showMapSpeed);
+ if (mapSet.showMapSpeed)
+ lv_obj_clear_flag(mapSpeed,LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_add_flag(mapSpeed,LV_OBJ_FLAG_HIDDEN);
+ }
+
+ if (obj == checkScale)
+ {
+ mapSet.showMapScale = lv_obj_has_state(obj, LV_STATE_CHECKED);
+ cfg.saveBool(PKEYS::KMAP_SCALE, mapSet.showMapScale);
+ if (mapSet.showMapScale)
+ lv_obj_clear_flag(scaleWidget,LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_add_flag(scaleWidget,LV_OBJ_FLAG_HIDDEN);
+ }
}
/**
- * @brief Create Map Settings screen
+ * @brief Create Map Settings screen.
*
+ * @details Initializes map settings screen, including controls for map type, rotation, zoom, and display options.
*/
void createMapSettingsScr()
{
- // Map Settings Screen
- mapSettingsScreen = lv_obj_create(NULL);
- mapSettingsOptions = lv_list_create(mapSettingsScreen);
- lv_obj_set_size(mapSettingsOptions, TFT_WIDTH, TFT_HEIGHT - 60);
-
- lv_obj_t *label;
-
- // Map Type
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Map Type\nRENDER/VECTOR");
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- lv_obj_set_style_text_font(list, fontOptions, 0);
- mapType = lv_switch_create(list);
- label = lv_label_create(mapType);
- lv_label_set_text_static(label, "V R");
- lv_obj_center(label);
- if (mapSet.vectorMap)
- lv_obj_add_state(mapType, LV_STATE_CHECKED);
- else
- lv_obj_clear_state(mapType, LV_STATE_CHECKED);
- lv_obj_align_to(mapType, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_obj_add_event_cb(mapType, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Map Rotation
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Map Rotation Mode\nHEADING/COMPASS");
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- lv_obj_set_style_text_font(list, fontOptions, 0);
- mapSwitch = lv_switch_create(list);
- label = lv_label_create(mapSwitch);
- lv_label_set_text_static(label, "C H");
- lv_obj_center(label);
- if (mapSet.mapRotationComp)
- lv_obj_add_state(mapSwitch, LV_STATE_CHECKED);
- else
- lv_obj_clear_state(mapSwitch, LV_STATE_CHECKED);
- lv_obj_align_to(mapSwitch, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_obj_add_event_cb(mapSwitch, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Default zoom level
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Default\nZoom Level");
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- lv_obj_set_style_text_font(list, fontOptions, 0);
-
- zoomBtnUp = lv_btn_create(list);
- lv_obj_set_size(zoomBtnUp, 40 * scale, 40 * scale);
- lv_obj_align_to(zoomBtnUp, list, LV_ALIGN_LEFT_MID, 0, 0);
- lv_obj_set_style_bg_image_src(zoomBtnUp, LV_SYMBOL_PLUS, 0);
- lv_obj_add_event_cb(zoomBtnUp, mapSettingsEvents, LV_EVENT_ALL, NULL);
-
- zoomLevel = lv_spinbox_create(list);
- lv_spinbox_set_range(zoomLevel, minZoom, maxZoom);
- lv_obj_set_width(zoomLevel, 40 * scale);
- lv_obj_clear_flag(zoomLevel, LV_OBJ_FLAG_SCROLLABLE);
- lv_obj_set_style_text_font(zoomLevel, fontLarge, 0);
- lv_spinbox_set_value(zoomLevel, defaultZoom);
- lv_spinbox_set_digit_format(zoomLevel, 2, 0);
- lv_obj_align_to(zoomLevel, list, LV_ALIGN_RIGHT_MID, 0, 0);
- objHideCursor(zoomLevel);
-
- zoomBtnDown = lv_btn_create(list);
- lv_obj_set_size(zoomBtnDown, 40 * scale, 40 * scale);
- lv_obj_align_to(zoomBtnDown, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_obj_set_style_bg_image_src(zoomBtnDown, LV_SYMBOL_MINUS, 0);
- lv_obj_add_event_cb(zoomBtnDown, mapSettingsEvents, LV_EVENT_ALL, NULL);
-
- // Show Full Screen Map
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Show Full Screen Map");
- lv_obj_set_style_text_font(list, fontOptions, 0);
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- checkFullScreen = lv_checkbox_create(list);
- lv_obj_align_to(checkFullScreen, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_checkbox_set_text(checkFullScreen, " ");
- lv_obj_add_state(checkFullScreen, mapSet.mapFullScreen);
- lv_obj_add_event_cb(checkFullScreen, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Show Compass
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Show Compass");
- lv_obj_set_style_text_font(list, fontOptions, 0);
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- checkCompass = lv_checkbox_create(list);
- lv_obj_align_to(checkCompass, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_checkbox_set_text(checkCompass, " ");
- lv_obj_add_state(checkCompass, mapSet.showMapCompass);
- lv_obj_add_event_cb(checkCompass, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Compass Rotation
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Compass Rotation");
- lv_obj_set_style_text_font(list, fontOptions, 0);
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- checkCompassRot = lv_checkbox_create(list);
- lv_obj_align_to(checkCompassRot, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_checkbox_set_text(checkCompassRot, " ");
- lv_obj_add_state(checkCompassRot, mapSet.compassRotation);
- lv_obj_add_event_cb(checkCompassRot, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Show Speed
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Show Speed");
- lv_obj_set_style_text_font(list, fontOptions, 0);
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- checkSpeed = lv_checkbox_create(list);
- lv_obj_align_to(checkSpeed, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_checkbox_set_text(checkSpeed, " ");
- lv_obj_add_state(checkSpeed, mapSet.showMapSpeed);
- lv_obj_add_event_cb(checkSpeed, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Show Map Scale
- list = lv_list_add_btn(mapSettingsOptions, NULL, "Show Map Scale");
- lv_obj_set_style_text_font(list, fontOptions, 0);
- lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
- checkScale = lv_checkbox_create(list);
- lv_obj_align_to(checkScale, list, LV_ALIGN_RIGHT_MID, 0, 0);
- lv_checkbox_set_text(checkScale, " ");
- lv_obj_add_state(checkScale, mapSet.showMapScale);
- lv_obj_add_event_cb(checkScale, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
-
- // Back button
- btnBack = lv_btn_create(mapSettingsScreen);
- lv_obj_set_size(btnBack, TFT_WIDTH - 30, 40 * scale);
- label = lv_label_create(btnBack);
- lv_obj_set_style_text_font(label, fontLarge, 0);
- lv_label_set_text_static(label, "Back");
- lv_obj_center(label);
- lv_obj_align(btnBack, LV_ALIGN_BOTTOM_MID, 0, -10);
- lv_obj_add_event_cb(btnBack, mapSettingsEvents, LV_EVENT_CLICKED, NULL);
+ // Map Settings Screen
+ mapSettingsScreen = lv_obj_create(NULL);
+ mapSettingsOptions = lv_list_create(mapSettingsScreen);
+ lv_obj_set_size(mapSettingsOptions, TFT_WIDTH, TFT_HEIGHT - 60);
+
+ lv_obj_t *label;
+
+ // Map Type
+ list = lv_list_add_btn(mapSettingsOptions, NULL, "Map Type\nRENDER/VECTOR");
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ mapType = lv_switch_create(list);
+ label = lv_label_create(mapType);
+ lv_label_set_text_static(label, "V R");
+ lv_obj_center(label);
+ if (mapSet.vectorMap)
+ lv_obj_add_state(mapType, LV_STATE_CHECKED);
+ else
+ lv_obj_clear_state(mapType, LV_STATE_CHECKED);
+ lv_obj_align_to(mapType, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ lv_obj_add_event_cb(mapType, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // Map Rotation
+ list = lv_list_add_btn(mapSettingsOptions, NULL, "Map Rotation Mode\nHEADING/COMPASS");
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ mapSwitch = lv_switch_create(list);
+ label = lv_label_create(mapSwitch);
+ lv_label_set_text_static(label, "C H");
+ lv_obj_center(label);
+ if (mapSet.mapRotationComp)
+ lv_obj_add_state(mapSwitch, LV_STATE_CHECKED);
+ else
+ lv_obj_clear_state(mapSwitch, LV_STATE_CHECKED);
+ lv_obj_align_to(mapSwitch, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ lv_obj_add_event_cb(mapSwitch, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // Default zoom level
+ list = lv_list_add_btn(mapSettingsOptions, NULL, "Default\nZoom Level");
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+
+ zoomBtnUp = lv_btn_create(list);
+ lv_obj_set_size(zoomBtnUp, 40 * scale, 40 * scale);
+ lv_obj_align_to(zoomBtnUp, list, LV_ALIGN_LEFT_MID, 0, 0);
+ lv_obj_set_style_bg_image_src(zoomBtnUp, LV_SYMBOL_PLUS, 0);
+ lv_obj_add_event_cb(zoomBtnUp, mapSettingsEvents, LV_EVENT_ALL, NULL);
+
+ zoomLevel = lv_spinbox_create(list);
+ lv_spinbox_set_range(zoomLevel, minZoom, maxZoom);
+ lv_obj_set_width(zoomLevel, 40 * scale);
+ lv_obj_clear_flag(zoomLevel, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_style_text_font(zoomLevel, fontLarge, 0);
+ lv_spinbox_set_value(zoomLevel, defaultZoom);
+ lv_spinbox_set_digit_format(zoomLevel, 2, 0);
+ lv_obj_align_to(zoomLevel, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ objHideCursor(zoomLevel);
+
+ zoomBtnDown = lv_btn_create(list);
+ lv_obj_set_size(zoomBtnDown, 40 * scale, 40 * scale);
+ lv_obj_align_to(zoomBtnDown, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ lv_obj_set_style_bg_image_src(zoomBtnDown, LV_SYMBOL_MINUS, 0);
+ lv_obj_add_event_cb(zoomBtnDown, mapSettingsEvents, LV_EVENT_ALL, NULL);
+
+ // Show Compass
+ list = lv_list_add_btn(mapSettingsOptions, NULL, "Show Compass");
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ checkCompass = lv_checkbox_create(list);
+ lv_obj_align_to(checkCompass, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ lv_checkbox_set_text(checkCompass, " ");
+ lv_obj_add_state(checkCompass, mapSet.showMapCompass);
+ lv_obj_add_event_cb(checkCompass, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // Compass Rotation
+ list = lv_list_add_btn(mapSettingsOptions, NULL, "Compass Rotation");
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ checkCompassRot = lv_checkbox_create(list);
+ lv_obj_align_to(checkCompassRot, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ lv_checkbox_set_text(checkCompassRot, " ");
+ lv_obj_add_state(checkCompassRot, mapSet.compassRotation);
+ lv_obj_add_event_cb(checkCompassRot, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // Show Speed
+ list = lv_list_add_btn(mapSettingsOptions, NULL, "Show Speed");
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ checkSpeed = lv_checkbox_create(list);
+ lv_obj_align_to(checkSpeed, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ lv_checkbox_set_text(checkSpeed, " ");
+ lv_obj_add_state(checkSpeed, mapSet.showMapSpeed);
+ lv_obj_add_event_cb(checkSpeed, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // Show Map Scale
+ list = lv_list_add_btn(mapSettingsOptions, NULL, "Show Map Scale");
+ lv_obj_set_style_text_font(list, fontOptions, 0);
+ lv_obj_clear_flag(list, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_set_align(list, LV_ALIGN_LEFT_MID);
+ checkScale = lv_checkbox_create(list);
+ lv_obj_align_to(checkScale, list, LV_ALIGN_RIGHT_MID, 0, 0);
+ lv_checkbox_set_text(checkScale, " ");
+ lv_obj_add_state(checkScale, mapSet.showMapScale);
+ lv_obj_add_event_cb(checkScale, mapSettingsEvents, LV_EVENT_VALUE_CHANGED, NULL);
+
+ // Back button
+ btnBack = lv_btn_create(mapSettingsScreen);
+ lv_obj_set_size(btnBack, TFT_WIDTH - 30, 40 * scale);
+ label = lv_label_create(btnBack);
+ lv_obj_set_style_text_font(label, fontLarge, 0);
+ lv_label_set_text_static(label, "Back");
+ lv_obj_center(label);
+ lv_obj_align(btnBack, LV_ALIGN_BOTTOM_MID, 0, -10);
+ lv_obj_add_event_cb(btnBack, mapSettingsEvents, LV_EVENT_CLICKED, NULL);
}
diff --git a/lib/gui/src/mapSettingsScr.hpp b/lib/gui/src/mapSettingsScr.hpp
index 24a1da17..863403c7 100644
--- a/lib/gui/src/mapSettingsScr.hpp
+++ b/lib/gui/src/mapSettingsScr.hpp
@@ -2,8 +2,8 @@
* @file mapSettingsScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Map Settings screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -13,19 +13,20 @@
#include "settings.hpp"
#include "maps.hpp"
-static lv_obj_t *mapSettingsOptions;
-static lv_obj_t *mapSwitch;
-static lv_obj_t *mapType;
-static lv_obj_t *zoomLevel;
-static lv_obj_t *btnBack;
-static lv_obj_t *zoomBtnUp;
-static lv_obj_t *zoomBtnDown;
-static lv_obj_t *list;
-static lv_obj_t *checkCompass;
-static lv_obj_t *checkCompassRot;
-static lv_obj_t *checkSpeed;
-static lv_obj_t *checkScale;
-static lv_obj_t *checkFullScreen;
+static lv_obj_t *mapSettingsOptions; /**< Map settings options container object. */
+static lv_obj_t *mapSwitch; /**< Map enable/disable switch object. */
+static lv_obj_t *mapType; /**< Map type selection object. */
+static lv_obj_t *zoomLevel; /**< Zoom level selection object. */
+static lv_obj_t *btnBack; /**< Back button object in map settings. */
+static lv_obj_t *zoomBtnUp; /**< Zoom level increment button object. */
+static lv_obj_t *zoomBtnDown; /**< Zoom level decrement button object. */
+static lv_obj_t *list; /**< List object for settings options. */
+static lv_obj_t *checkCompass; /**< Checkbox for enabling compass display. */
+static lv_obj_t *checkCompassRot; /**< Checkbox for enabling compass rotation. */
+static lv_obj_t *checkSpeed; /**< Checkbox for displaying speed on the map. */
+static lv_obj_t *checkScale; /**< Checkbox for displaying map scale. */
+static lv_obj_t *checkFullScreen; /**< Checkbox for enabling fullscreen map display. */
+
static void mapSettingsEvents(lv_event_t *event);
void createMapSettingsScr();
diff --git a/lib/gui/src/navScr.cpp b/lib/gui/src/navScr.cpp
index f6523cca..9dcfefa5 100644
--- a/lib/gui/src/navScr.cpp
+++ b/lib/gui/src/navScr.cpp
@@ -2,8 +2,8 @@
* @file navScr.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Navigation screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "navScr.hpp"
@@ -15,120 +15,120 @@ lv_obj_t *distNav;
lv_obj_t *arrowNav;
/**
- * @brief Navigation screen
+ * @brief Creates and initializes the navigation screen, adding labels and widgets for navigation information display.
*
- * @param screen
+ * @param screen LVGL screen object to which the navigation UI elements are added.
*/
#ifndef TDECK_ESP32S3
void navigationScr(_lv_obj_t *screen)
{
- lv_obj_t * label;
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Navigation to:");
- lv_obj_center(label);
- lv_obj_align(label,LV_ALIGN_TOP_LEFT,10, 20);
-
- nameNav = lv_label_create(screen);
- lv_obj_set_style_text_font(nameNav, fontLargeMedium, 0);
- //lv_label_set_text_fmt(nameNav, "%s","");
- lv_label_set_long_mode(nameNav, LV_LABEL_LONG_SCROLL_CIRCULAR);
- lv_obj_set_width(nameNav,TFT_WIDTH-10);
- lv_obj_set_pos(nameNav,10, 55);
-
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Lat:");
- lv_obj_set_pos(label, 10, 90);
-
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Lon:");
- lv_obj_set_pos(label, 10, 120);
-
- latNav = lv_label_create(screen);
- lv_obj_set_style_text_font(latNav, fontOptions, 0);
- lv_label_set_text_fmt(latNav, "%s", "");
- lv_obj_set_pos(latNav, 60, 90);
-
- lonNav = lv_label_create(screen);
- lv_obj_set_style_text_font(lonNav, fontOptions, 0);
- lv_label_set_text_fmt(lonNav, "%s", "");
- lv_obj_set_pos(lonNav, 60, 120);
-
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Distance");
- lv_obj_align(label, LV_ALIGN_CENTER, 0, -50);
-
- distNav = lv_label_create(screen);
- lv_obj_set_style_text_font(distNav, fontVeryLarge, 0);
- lv_label_set_text_fmt(distNav,"%d m.", 0);
- lv_obj_align(distNav,LV_ALIGN_CENTER, 0, -5);
-
- arrowNav = lv_img_create(screen);
- lv_img_set_zoom(arrowNav,iconScale);
- lv_obj_update_layout(arrowNav);
- lv_obj_align(arrowNav,LV_ALIGN_CENTER, 0, 100);
-
- LV_IMG_DECLARE(navup);
- lv_img_set_src(arrowNav, &navup);
- lv_img_set_pivot(arrowNav, 50, 50) ;
+ lv_obj_t * label;
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Navigation to:");
+ lv_obj_center(label);
+ lv_obj_align(label,LV_ALIGN_TOP_LEFT,10, 20);
+
+ nameNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(nameNav, fontLargeMedium, 0);
+ //lv_label_set_text_fmt(nameNav, "%s","");
+ lv_label_set_long_mode(nameNav, LV_LABEL_LONG_SCROLL_CIRCULAR);
+ lv_obj_set_width(nameNav,TFT_WIDTH-10);
+ lv_obj_set_pos(nameNav,10, 55);
+
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Lat:");
+ lv_obj_set_pos(label, 10, 90);
+
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Lon:");
+ lv_obj_set_pos(label, 10, 120);
+
+ latNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(latNav, fontOptions, 0);
+ lv_label_set_text_fmt(latNav, "%s", "");
+ lv_obj_set_pos(latNav, 60, 90);
+
+ lonNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(lonNav, fontOptions, 0);
+ lv_label_set_text_fmt(lonNav, "%s", "");
+ lv_obj_set_pos(lonNav, 60, 120);
+
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Distance");
+ lv_obj_align(label, LV_ALIGN_CENTER, 0, -50);
+
+ distNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(distNav, fontVeryLarge, 0);
+ lv_label_set_text_fmt(distNav,"%d m.", 0);
+ lv_obj_align(distNav,LV_ALIGN_CENTER, 0, -5);
+
+ arrowNav = lv_img_create(screen);
+ lv_img_set_zoom(arrowNav,iconScale);
+ lv_obj_update_layout(arrowNav);
+ lv_obj_align(arrowNav,LV_ALIGN_CENTER, 0, 100);
+
+ LV_IMG_DECLARE(navup);
+ lv_img_set_src(arrowNav, &navup);
+ lv_img_set_pivot(arrowNav, 50, 50) ;
}
#endif
#ifdef TDECK_ESP32S3
void navigationScr(_lv_obj_t *screen)
{
- lv_obj_t * label;
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Navigation to:");
- lv_obj_center(label);
- lv_obj_align(label,LV_ALIGN_TOP_LEFT,10, 20);
-
- nameNav = lv_label_create(screen);
- lv_obj_set_style_text_font(nameNav, fontLargeMedium, 0);
- //lv_label_set_text_fmt(nameNav, "%s","");
- lv_label_set_long_mode(nameNav, LV_LABEL_LONG_SCROLL_CIRCULAR);
- lv_obj_set_width(nameNav,TFT_WIDTH-10);
- lv_obj_set_pos(nameNav,10, 37);
-
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Lat:");
- lv_obj_set_pos(label, 10, 70);
-
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Lon:");
- lv_obj_set_pos(label, 10, 90);
-
- latNav = lv_label_create(screen);
- lv_obj_set_style_text_font(latNav, fontOptions, 0);
- lv_label_set_text_fmt(latNav, "%s", "");
- lv_obj_set_pos(latNav, 60, 70);
-
- lonNav = lv_label_create(screen);
- lv_obj_set_style_text_font(lonNav, fontOptions, 0);
- lv_label_set_text_fmt(lonNav, "%s", "");
- lv_obj_set_pos(lonNav, 60, 90);
-
- label = lv_label_create(screen);
- lv_obj_set_style_text_font(label, fontOptions, 0);
- lv_label_set_text_static(label, "Distance");
- lv_obj_set_pos(label,10, 120);
-
- distNav = lv_label_create(screen);
- lv_obj_set_style_text_font(distNav, fontVeryLarge, 0);
- lv_label_set_text_fmt(distNav,"%d m.", 0);
- lv_obj_set_pos(distNav,10, 140);
-
- arrowNav = lv_img_create(screen);
- lv_obj_set_pos(arrowNav,TFT_WIDTH - 100, 35);
-
- LV_IMG_DECLARE(navup);
- lv_img_set_src(arrowNav, &navup);
- lv_img_set_pivot(arrowNav, 50, 50) ;
+ lv_obj_t * label;
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Navigation to:");
+ lv_obj_center(label);
+ lv_obj_align(label,LV_ALIGN_TOP_LEFT,10, 20);
+
+ nameNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(nameNav, fontLargeMedium, 0);
+ //lv_label_set_text_fmt(nameNav, "%s","");
+ lv_label_set_long_mode(nameNav, LV_LABEL_LONG_SCROLL_CIRCULAR);
+ lv_obj_set_width(nameNav,TFT_WIDTH-10);
+ lv_obj_set_pos(nameNav,10, 37);
+
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Lat:");
+ lv_obj_set_pos(label, 10, 70);
+
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Lon:");
+ lv_obj_set_pos(label, 10, 90);
+
+ latNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(latNav, fontOptions, 0);
+ lv_label_set_text_fmt(latNav, "%s", "");
+ lv_obj_set_pos(latNav, 60, 70);
+
+ lonNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(lonNav, fontOptions, 0);
+ lv_label_set_text_fmt(lonNav, "%s", "");
+ lv_obj_set_pos(lonNav, 60, 90);
+
+ label = lv_label_create(screen);
+ lv_obj_set_style_text_font(label, fontOptions, 0);
+ lv_label_set_text_static(label, "Distance");
+ lv_obj_set_pos(label,10, 120);
+
+ distNav = lv_label_create(screen);
+ lv_obj_set_style_text_font(distNav, fontVeryLarge, 0);
+ lv_label_set_text_fmt(distNav,"%d m.", 0);
+ lv_obj_set_pos(distNav,10, 140);
+
+ arrowNav = lv_img_create(screen);
+ lv_obj_set_pos(arrowNav,TFT_WIDTH - 100, 35);
+
+ LV_IMG_DECLARE(navup);
+ lv_img_set_src(arrowNav, &navup);
+ lv_img_set_pivot(arrowNav, 50, 50) ;
}
#endif
\ No newline at end of file
diff --git a/lib/gui/src/navScr.hpp b/lib/gui/src/navScr.hpp
index d310dd6e..b24204a5 100644
--- a/lib/gui/src/navScr.hpp
+++ b/lib/gui/src/navScr.hpp
@@ -2,8 +2,8 @@
* @file navScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Navigation screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -12,13 +12,14 @@
#include "navup.h"
/**
- * @brief Navigation Tile screen objects
+ * @brief Navigation Tile screen objects.
*
+ * @details References to objects used in the navigation tile for displaying waypoint name, latitude, longitude, distance, and navigation arrow.
*/
-extern lv_obj_t *nameNav;
-extern lv_obj_t *latNav;
-extern lv_obj_t *lonNav;
-extern lv_obj_t *distNav;
-extern lv_obj_t *arrowNav;
+extern lv_obj_t *nameNav; /**< Navigation waypoint name label. */
+extern lv_obj_t *latNav; /**< Navigation latitude label. */
+extern lv_obj_t *lonNav; /**< Navigation longitude label. */
+extern lv_obj_t *distNav; /**< Navigation distance label. */
+extern lv_obj_t *arrowNav; /**< Navigation arrow image object. */
void navigationScr(_lv_obj_t *screen);
\ No newline at end of file
diff --git a/lib/gui/src/notifyBar.cpp b/lib/gui/src/notifyBar.cpp
index d6dd1f96..95965d78 100644
--- a/lib/gui/src/notifyBar.cpp
+++ b/lib/gui/src/notifyBar.cpp
@@ -2,202 +2,203 @@
* @file notifyBar.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Notify Bar Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "notifyBar.hpp"
-lv_obj_t *mainScreen;
-lv_obj_t *notifyBarIcons;
-lv_obj_t *notifyBarHour;
+lv_obj_t *mainScreen; /**< Main screen */
+lv_obj_t *notifyBarIcons; /**< Notification bar icons container object. */
+lv_obj_t *notifyBarHour; /**< Notification bar hour display object. */
Storage storage;
Battery battery;
extern Gps gps;
/**
- * @brief Update notify bar event
+ * @brief Handles notify bar update events, refreshing display elements
*
- * @param event
+ * @param event LVGL event pointer.
*/
void updateNotifyBar(lv_event_t *event)
{
- lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(event);
-
- if (obj == gpsTime)
- {
- struct tm local_tm;
- time_t localTime = time(NULL);
- struct tm *now = localtime_r(&localTime,&local_tm);
-
- lv_label_set_text_fmt(obj, timeFormat, now->tm_hour, now->tm_min, now->tm_sec);
- }
-
-#ifdef ENABLE_TEMP
- if (obj == temp)
- lv_label_set_text_fmt(obj, "%02d\xC2\xB0", tempValue);
-#endif
-
- if (obj == gpsCount)
- lv_label_set_text_fmt(obj, LV_SYMBOL_GPS "%2d", gps.gpsData.satellites);
-
- if (obj == battIcon)
- {
- if (battLevel <= 160 && battLevel > 140)
- lv_label_set_text_static(obj, " " LV_SYMBOL_CHARGE);
- else if (battLevel <= 140 && battLevel > 80)
- lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_FULL);
- else if (battLevel <= 80 && battLevel > 60)
- lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_3);
- else if (battLevel <= 60 && battLevel > 40)
- lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_2);
- else if (battLevel <= 40 && battLevel > 20)
- lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_1);
- else if (battLevel <= 20)
- lv_label_set_text(obj, LV_SYMBOL_BATTERY_EMPTY);
- }
-
- if (obj == gpsFixMode)
- {
- switch (gps.gpsData.fixMode)
- {
- case gps_fix::STATUS_NONE:
- lv_label_set_text_static(obj, "----");
- break;
- case gps_fix::STATUS_STD:
- lv_label_set_text_static(obj, " 3D ");
- break;
- case gps_fix::STATUS_DGPS:
- lv_label_set_text_static(obj, "DGPS");
- break;
- case gps_fix::STATUS_PPS:
- lv_label_set_text_static(obj, "PPS");
- break;
- case gps_fix::STATUS_RTK_FLOAT:
- lv_label_set_text_static(obj, "RTK");
- break;
- case gps_fix::STATUS_RTK_FIXED:
- lv_label_set_text_static(obj, "RTK");
- break;
- case gps_fix::STATUS_TIME_ONLY:
- lv_label_set_text_static(obj, "TIME");
- break;
- case gps_fix::STATUS_EST:
- lv_label_set_text_static(obj, "EST");
- break;
- }
- }
-
- if (obj == wifi)
- {
- if (WiFi.status() == WL_CONNECTED)
- lv_label_set_text_static(obj, LV_SYMBOL_WIFI);
- else
- lv_label_set_text_static(obj," ");
- }
+ lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(event);
+
+ if (obj == gpsTime)
+ {
+ struct tm local_tm;
+ time_t localTime = time(NULL);
+ struct tm *now = localtime_r(&localTime,&local_tm);
+
+ lv_label_set_text_fmt(obj, timeFormat, now->tm_hour, now->tm_min, now->tm_sec);
+ }
+
+ #ifdef ENABLE_TEMP
+ if (obj == temp)
+ lv_label_set_text_fmt(obj, "%02d\xC2\xB0", tempValue);
+ #endif
+
+ if (obj == gpsCount)
+ lv_label_set_text_fmt(obj, LV_SYMBOL_GPS "%2d", gps.gpsData.satellites);
+
+ if (obj == battIcon)
+ {
+ if (battLevel <= 160 && battLevel > 140)
+ lv_label_set_text_static(obj, " " LV_SYMBOL_CHARGE);
+ else if (battLevel <= 140 && battLevel > 80)
+ lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_FULL);
+ else if (battLevel <= 80 && battLevel > 60)
+ lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_3);
+ else if (battLevel <= 60 && battLevel > 40)
+ lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_2);
+ else if (battLevel <= 40 && battLevel > 20)
+ lv_label_set_text_static(obj, LV_SYMBOL_BATTERY_1);
+ else if (battLevel <= 20)
+ lv_label_set_text(obj, LV_SYMBOL_BATTERY_EMPTY);
+ }
+
+ if (obj == gpsFixMode)
+ {
+ switch (gps.gpsData.fixMode)
+ {
+ case gps_fix::STATUS_NONE:
+ lv_label_set_text_static(obj, "----");
+ break;
+ case gps_fix::STATUS_STD:
+ lv_label_set_text_static(obj, " 3D ");
+ break;
+ case gps_fix::STATUS_DGPS:
+ lv_label_set_text_static(obj, "DGPS");
+ break;
+ case gps_fix::STATUS_PPS:
+ lv_label_set_text_static(obj, "PPS");
+ break;
+ case gps_fix::STATUS_RTK_FLOAT:
+ lv_label_set_text_static(obj, "RTK");
+ break;
+ case gps_fix::STATUS_RTK_FIXED:
+ lv_label_set_text_static(obj, "RTK");
+ break;
+ case gps_fix::STATUS_TIME_ONLY:
+ lv_label_set_text_static(obj, "TIME");
+ break;
+ case gps_fix::STATUS_EST:
+ lv_label_set_text_static(obj, "EST");
+ break;
+ }
+ }
+
+ if (obj == wifi)
+ {
+ if (WiFi.status() == WL_CONNECTED)
+ lv_label_set_text_static(obj, LV_SYMBOL_WIFI);
+ else
+ lv_label_set_text_static(obj," ");
+ }
}
/**
- * @brief Update notify bar info timer
+ * @brief Periodic timer callback to update notify bar information
*
*/
void updateNotifyBarTimer(lv_timer_t *t)
{
- lv_obj_send_event(gpsTime, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_send_event(gpsCount, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_send_event(gpsFixMode, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_send_event(wifi, LV_EVENT_VALUE_CHANGED, NULL);
-
- if (isGpsFixed)
- lv_led_toggle(gpsFix);
- else
- lv_led_off(gpsFix);
-
- #ifdef ENABLE_TEMP
- tempValue = (uint8_t)(bme.readTemperature() + tempOffset);
- if (tempValue != tempOld)
- {
- lv_obj_send_event(temp, LV_EVENT_VALUE_CHANGED, NULL);
- tempOld = tempValue;
- }
- #endif
-
- battLevel = battery.readBattery();
- if (battLevel != battLevelOld)
- {
- lv_obj_send_event(battIcon, LV_EVENT_VALUE_CHANGED, NULL);
- battLevelOld = battLevel;
- }
+ lv_obj_send_event(gpsTime, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_send_event(gpsCount, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_send_event(gpsFixMode, LV_EVENT_VALUE_CHANGED, NULL);
+ lv_obj_send_event(wifi, LV_EVENT_VALUE_CHANGED, NULL);
+
+ if (isGpsFixed)
+ lv_led_toggle(gpsFix);
+ else
+ lv_led_off(gpsFix);
+
+ #ifdef ENABLE_TEMP
+ tempValue = (uint8_t)(bme.readTemperature() + tempOffset);
+ if (tempValue != tempOld)
+ {
+ lv_obj_send_event(temp, LV_EVENT_VALUE_CHANGED, NULL);
+ tempOld = tempValue;
+ }
+ #endif
+
+ battLevel = battery.readBattery();
+ if (battLevel != battLevelOld)
+ {
+ lv_obj_send_event(battIcon, LV_EVENT_VALUE_CHANGED, NULL);
+ battLevelOld = battLevel;
+ }
}
/**
- * @brief Create a notify bar
+ * @brief Create a notify bar.
*
+ * @details Initializes and lays out the notification bar on the main screen, adding UI elements
*/
void createNotifyBar()
{
- notifyBarIcons = lv_obj_create(mainScreen);
- lv_obj_set_size(notifyBarIcons, (TFT_WIDTH / 3) * 2 , 24);
- lv_obj_set_pos(notifyBarIcons, (TFT_WIDTH / 3) + 1, 0);
- lv_obj_set_flex_flow(notifyBarIcons, LV_FLEX_FLOW_ROW);
- lv_obj_set_flex_align(notifyBarIcons, LV_FLEX_ALIGN_END, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_clear_flag(notifyBarIcons, LV_OBJ_FLAG_SCROLLABLE);
-
- notifyBarHour = lv_obj_create(mainScreen);
- lv_obj_set_size(notifyBarHour, TFT_WIDTH / 3 , 24);
- lv_obj_set_pos(notifyBarHour, 0, 0);
- lv_obj_set_flex_flow(notifyBarHour, LV_FLEX_FLOW_ROW);
- lv_obj_set_flex_align(notifyBarHour, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_clear_flag(notifyBarHour, LV_OBJ_FLAG_SCROLLABLE);
-
- static lv_style_t styleBar;
- lv_style_init(&styleBar);
- lv_style_set_bg_opa(&styleBar, LV_OPA_0);
- lv_style_set_border_opa(&styleBar, LV_OPA_0);
- lv_style_set_text_font(&styleBar, fontDefault);
- lv_obj_add_style(notifyBarIcons, &styleBar, LV_PART_MAIN);
- lv_obj_add_style(notifyBarHour, &styleBar, LV_PART_MAIN);
-
- gpsTime = lv_label_create(notifyBarHour);
- lv_obj_set_style_text_font(gpsTime, fontLarge, 0);
- lv_label_set_text_fmt(gpsTime, timeFormat, 0, 0, 0);
- lv_obj_add_event_cb(gpsTime, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
-
- wifi = lv_label_create(notifyBarIcons);
- lv_label_set_text_static(wifi, " ");
- lv_obj_add_event_cb(wifi, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
-
- #ifdef ENABLE_TEMP
- temp = lv_label_create(notifyBarIcons);
- lv_label_set_text_static(temp, "--\xC2\xB0");
- lv_obj_add_event_cb(temp, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
- #endif
-
- if (storage.getSdLoaded())
- {
- sdCard = lv_label_create(notifyBarIcons);
- lv_label_set_text_static(sdCard, LV_SYMBOL_SD_CARD);
- }
-
- gpsCount = lv_label_create(notifyBarIcons);
- lv_label_set_text_fmt(gpsCount, LV_SYMBOL_GPS "%2d", 0);
- lv_obj_add_event_cb(gpsCount, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
-
- gpsFix = lv_led_create(notifyBarIcons);
- lv_led_set_color(gpsFix, lv_palette_main(LV_PALETTE_RED));
- lv_obj_set_size(gpsFix, 7, 7);
- lv_led_off(gpsFix);
-
- gpsFixMode = lv_label_create(notifyBarIcons);
- lv_obj_set_style_text_font(gpsFixMode, fontSmall, 0);
- lv_label_set_text_static(gpsFixMode, "----");
- lv_obj_add_event_cb(gpsFixMode, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
-
- battIcon = lv_label_create(notifyBarIcons);
- lv_label_set_text_static(battIcon, LV_SYMBOL_BATTERY_EMPTY);
- lv_obj_add_event_cb(battIcon, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
-
- lv_timer_t *timerNotifyBar = lv_timer_create(updateNotifyBarTimer, UPDATE_NOTIFY_PERIOD, NULL);
- lv_timer_ready(timerNotifyBar);
+ notifyBarIcons = lv_obj_create(mainScreen);
+ lv_obj_set_size(notifyBarIcons, (TFT_WIDTH / 3) * 2 , 24);
+ lv_obj_set_pos(notifyBarIcons, (TFT_WIDTH / 3) + 1, 0);
+ lv_obj_set_flex_flow(notifyBarIcons, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(notifyBarIcons, LV_FLEX_ALIGN_END, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_clear_flag(notifyBarIcons, LV_OBJ_FLAG_SCROLLABLE);
+
+ notifyBarHour = lv_obj_create(mainScreen);
+ lv_obj_set_size(notifyBarHour, TFT_WIDTH / 3 , 24);
+ lv_obj_set_pos(notifyBarHour, 0, 0);
+ lv_obj_set_flex_flow(notifyBarHour, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(notifyBarHour, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_clear_flag(notifyBarHour, LV_OBJ_FLAG_SCROLLABLE);
+
+ static lv_style_t styleBar;
+ lv_style_init(&styleBar);
+ lv_style_set_bg_opa(&styleBar, LV_OPA_0);
+ lv_style_set_border_opa(&styleBar, LV_OPA_0);
+ lv_style_set_text_font(&styleBar, fontDefault);
+ lv_obj_add_style(notifyBarIcons, &styleBar, LV_PART_MAIN);
+ lv_obj_add_style(notifyBarHour, &styleBar, LV_PART_MAIN);
+
+ gpsTime = lv_label_create(notifyBarHour);
+ lv_obj_set_style_text_font(gpsTime, fontLarge, 0);
+ lv_label_set_text_fmt(gpsTime, timeFormat, 0, 0, 0);
+ lv_obj_add_event_cb(gpsTime, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
+
+ wifi = lv_label_create(notifyBarIcons);
+ lv_label_set_text_static(wifi, " ");
+ lv_obj_add_event_cb(wifi, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
+
+ #ifdef ENABLE_TEMP
+ temp = lv_label_create(notifyBarIcons);
+ lv_label_set_text_static(temp, "--\xC2\xB0");
+ lv_obj_add_event_cb(temp, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
+ #endif
+
+ if (storage.getSdLoaded())
+ {
+ sdCard = lv_label_create(notifyBarIcons);
+ lv_label_set_text_static(sdCard, LV_SYMBOL_SD_CARD);
+ }
+
+ gpsCount = lv_label_create(notifyBarIcons);
+ lv_label_set_text_fmt(gpsCount, LV_SYMBOL_GPS "%2d", 0);
+ lv_obj_add_event_cb(gpsCount, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
+
+ gpsFix = lv_led_create(notifyBarIcons);
+ lv_led_set_color(gpsFix, lv_palette_main(LV_PALETTE_RED));
+ lv_obj_set_size(gpsFix, 7, 7);
+ lv_led_off(gpsFix);
+
+ gpsFixMode = lv_label_create(notifyBarIcons);
+ lv_obj_set_style_text_font(gpsFixMode, fontSmall, 0);
+ lv_label_set_text_static(gpsFixMode, "----");
+ lv_obj_add_event_cb(gpsFixMode, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
+
+ battIcon = lv_label_create(notifyBarIcons);
+ lv_label_set_text_static(battIcon, LV_SYMBOL_BATTERY_EMPTY);
+ lv_obj_add_event_cb(battIcon, updateNotifyBar, LV_EVENT_VALUE_CHANGED, NULL);
+
+ lv_timer_t *timerNotifyBar = lv_timer_create(updateNotifyBarTimer, UPDATE_NOTIFY_PERIOD, NULL);
+ lv_timer_ready(timerNotifyBar);
}
diff --git a/lib/gui/src/notifyBar.hpp b/lib/gui/src/notifyBar.hpp
index 4223e437..40ce4c27 100644
--- a/lib/gui/src/notifyBar.hpp
+++ b/lib/gui/src/notifyBar.hpp
@@ -2,8 +2,8 @@
* @file notifyBar.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Notify Bar Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -15,26 +15,28 @@
#include "settings.hpp"
/**
- * @brief Notify Bar screen objects
+ * @brief Notify Bar screen objects.
*
+ * @details Objects used to display information in the notification bar
*/
-static lv_obj_t *gpsTime; // Time
-static lv_obj_t *gpsCount; // Satellite count
-static lv_obj_t *gpsFix; // Satellite fix
-static lv_obj_t *gpsFixMode; // Satellite fix mode
-static lv_obj_t *battIcon; // Battery level
-static lv_obj_t *sdCard; // SD card icon
-static lv_obj_t *temp; // Temperature
-static lv_obj_t *wifi; // Wifi
+static lv_obj_t *gpsTime; /**< Time display object. */
+static lv_obj_t *gpsCount; /**< Satellite count object. */
+static lv_obj_t *gpsFix; /**< Satellite fix status object. */
+static lv_obj_t *gpsFixMode; /**< Satellite fix mode object. */
+static lv_obj_t *battIcon; /**< Battery level icon object. */
+static lv_obj_t *sdCard; /**< SD card icon object. */
+static lv_obj_t *temp; /**< Temperature display object. */
+static lv_obj_t *wifi; /**< WiFi status object. */
-static float battLevel = 0;
-static float battLevelOld = 0;
+static float battLevel = 0; /**< Current battery level value. */
+static float battLevelOld = 0; /**< Previous battery level value. */
-#define UPDATE_NOTIFY_PERIOD 1000 // Notify Bar update time
+#define UPDATE_NOTIFY_PERIOD 1000 /**< Notify Bar update time in milliseconds. */
/**
- * @brief Temperature values
+ * @brief Temperature values.
*
+ * @details Format string for displaying time in HH:MM:SS format
*/
static const char* timeFormat PROGMEM = "%02d:%02d:%02d";
diff --git a/lib/gui/src/satInfoScr.cpp b/lib/gui/src/satInfoScr.cpp
index eeb06917..e885b2cb 100644
--- a/lib/gui/src/satInfoScr.cpp
+++ b/lib/gui/src/satInfoScr.cpp
@@ -2,8 +2,8 @@
* @file satInfoScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Satellite info screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "satInfoScr.hpp"
@@ -24,471 +24,486 @@ Gps gps;
/**
* @brief Draw Text on SNR Chart
*
- * @param text -> Text
- * @param layer
- * @param p
- * @param coords
- * @param color
- * @param font
- * @param offset
+ * @details Draws a text label onto a specified layer of the SNR chart using the provided font, color, and position.
+ *
+ * @param text Pointer to the text string to display.
+ * @param layer Pointer to the drawing layer.
+ * @param p Pointer to the position (lv_point_t) where the text should be drawn.
+ * @param coords Pointer to the base area coordinates.
+ * @param color Text color (lv_color_t).
+ * @param font Pointer to the font to use.
+ * @param offset Vertical offset from the base position.
*/
void drawTextOnLayer(const char * text, lv_layer_t * layer, lv_point_t * p, lv_area_t * coords, lv_color_t color, const void * font, int16_t offset)
{
- lv_draw_rect_dsc_t draw_rect_dsc;
- lv_draw_rect_dsc_init(&draw_rect_dsc);
-
- draw_rect_dsc.bg_opa = LV_OPA_TRANSP;
- draw_rect_dsc.radius = 0;
- draw_rect_dsc.bg_image_symbol_font = font;
- draw_rect_dsc.bg_image_src = text;
- draw_rect_dsc.bg_image_recolor = color;
-
- lv_area_t a;
- a.x1 = coords->x1 + p->x - 10;
- a.x2 = coords->x1 + p->x + 10;
- a.y1 = coords->y1 + p->y + 10 - offset;
- a.y2 = a.y1 - 20;
-
- lv_draw_rect(layer, &draw_rect_dsc, &a);
+ lv_draw_rect_dsc_t draw_rect_dsc;
+ lv_draw_rect_dsc_init(&draw_rect_dsc);
+
+ draw_rect_dsc.bg_opa = LV_OPA_TRANSP;
+ draw_rect_dsc.radius = 0;
+ draw_rect_dsc.bg_image_symbol_font = font;
+ draw_rect_dsc.bg_image_src = text;
+ draw_rect_dsc.bg_image_recolor = color;
+
+ lv_area_t a;
+ a.x1 = coords->x1 + p->x - 10;
+ a.x2 = coords->x1 + p->x + 10;
+ a.y1 = coords->y1 + p->y + 10 - offset;
+ a.y2 = a.y1 - 20;
+
+ lv_draw_rect(layer, &draw_rect_dsc, &a);
}
/**
- * @brief SNR Bar draw event
+ * @brief SNR Bar draw event.
+ *
+ * @details Handles the drawing of the Signal-to-Noise Ratio (SNR) bar chart for satellites. Colors each bar depending on the GNSS constellation
+ * and whether the satellite is active. After drawing, overlays signal values and satellite IDs on the chart.
*
- * @param event
+ * @param event LVGL event pointer.
*/
void satelliteBarDrawEvent(lv_event_t * event)
{
- lv_event_code_t e = lv_event_get_code(event);
- lv_obj_t * obj = (lv_obj_t *)lv_event_get_target(event);
- if (e == LV_EVENT_DRAW_TASK_ADDED)
- {
- lv_draw_task_t * drawTask = lv_event_get_draw_task(event);
- lv_draw_dsc_base_t * base_dsc = (lv_draw_dsc_base_t *)lv_draw_task_get_draw_dsc(drawTask);
- if(base_dsc->part == LV_PART_ITEMS)
- {
- uint16_t dscId = base_dsc->id2;
- //Change color/border of bar depending on GNSS and if SV is in use
- if (lv_draw_task_get_type(drawTask) == LV_DRAW_TASK_TYPE_FILL)
- {
- lv_draw_fill_dsc_t * fill_dsc = lv_draw_task_get_fill_dsc(drawTask);
- if(fill_dsc)
- {
- if ( strcmp(gps.satTracker[dscId].talker_id,"GP") == 0 )
- fill_dsc->color = gps.satTracker[dscId].active == true ? GP_INACTIVE_COLOR : GP_ACTIVE_COLOR;
- if ( strcmp(gps.satTracker[dscId].talker_id,"GL") == 0 )
- fill_dsc->color = gps.satTracker[dscId].active == true ? GL_INACTIVE_COLOR : GL_ACTIVE_COLOR;
- if ( strcmp(gps.satTracker[dscId].talker_id,"BD") == 0 )
- fill_dsc->color = gps.satTracker[dscId].active == true ? BD_INACTIVE_COLOR : BD_ACTIVE_COLOR;
- }
- }
- }
- }
-
- if (e == LV_EVENT_DRAW_POST_END)
- {
- lv_layer_t * layer = lv_event_get_layer(event);
- char buf[16];
-
- for (uint16_t i = 0; i < gps.gpsData.satInView; i++)
- {
- lv_area_t chartObjCoords;
- lv_obj_get_coords(obj, &chartObjCoords);
- lv_point_t p;
- lv_chart_get_point_pos_by_id(obj, lv_chart_get_series_next(obj, NULL), i, &p);
-
- //Draw signal at top of bar
- if (gps.satTracker[i].snr > 0)
- {
- lv_snprintf(buf, sizeof(buf), LV_SYMBOL_DUMMY"%d", gps.satTracker[i].snr);
- drawTextOnLayer(buf, layer, &p, &chartObjCoords, lv_color_white(), fontSmall, 15);
- }
-
- //Draw Satellite ID
- lv_snprintf(buf, sizeof(buf), LV_SYMBOL_DUMMY"%d", gps.satTracker[i].satNum);
- drawTextOnLayer(buf, layer, &p, &chartObjCoords, lv_color_white(), fontSmall, (chartObjCoords.y1 + p.y) - chartObjCoords.y2 + 10);
- }
- }
+ lv_event_code_t e = lv_event_get_code(event);
+ lv_obj_t * obj = (lv_obj_t *)lv_event_get_target(event);
+ if (e == LV_EVENT_DRAW_TASK_ADDED)
+ {
+ lv_draw_task_t * drawTask = lv_event_get_draw_task(event);
+ lv_draw_dsc_base_t * base_dsc = (lv_draw_dsc_base_t *)lv_draw_task_get_draw_dsc(drawTask);
+ if(base_dsc->part == LV_PART_ITEMS)
+ {
+ uint16_t dscId = base_dsc->id2;
+ //Change color/border of bar depending on GNSS and if SV is in use
+ if (lv_draw_task_get_type(drawTask) == LV_DRAW_TASK_TYPE_FILL)
+ {
+ lv_draw_fill_dsc_t * fill_dsc = lv_draw_task_get_fill_dsc(drawTask);
+ if(fill_dsc)
+ {
+ if ( strcmp(gps.satTracker[dscId].talker_id,"GP") == 0 )
+ fill_dsc->color = gps.satTracker[dscId].active == true ? GP_INACTIVE_COLOR : GP_ACTIVE_COLOR;
+ if ( strcmp(gps.satTracker[dscId].talker_id,"GL") == 0 )
+ fill_dsc->color = gps.satTracker[dscId].active == true ? GL_INACTIVE_COLOR : GL_ACTIVE_COLOR;
+ if ( strcmp(gps.satTracker[dscId].talker_id,"BD") == 0 )
+ fill_dsc->color = gps.satTracker[dscId].active == true ? BD_INACTIVE_COLOR : BD_ACTIVE_COLOR;
+ }
+ }
+ }
+ }
+
+ if (e == LV_EVENT_DRAW_POST_END)
+ {
+ lv_layer_t * layer = lv_event_get_layer(event);
+ char buf[16];
+
+ for (uint16_t i = 0; i < gps.gpsData.satInView; i++)
+ {
+ lv_area_t chartObjCoords;
+ lv_obj_get_coords(obj, &chartObjCoords);
+ lv_point_t p;
+ lv_chart_get_point_pos_by_id(obj, lv_chart_get_series_next(obj, NULL), i, &p);
+
+ //Draw signal at top of bar
+ if (gps.satTracker[i].snr > 0)
+ {
+ lv_snprintf(buf, sizeof(buf), LV_SYMBOL_DUMMY"%d", gps.satTracker[i].snr);
+ drawTextOnLayer(buf, layer, &p, &chartObjCoords, lv_color_white(), fontSmall, 15);
+ }
+
+ //Draw Satellite ID
+ lv_snprintf(buf, sizeof(buf), LV_SYMBOL_DUMMY"%d", gps.satTracker[i].satNum);
+ drawTextOnLayer(buf, layer, &p, &chartObjCoords, lv_color_white(), fontSmall, (chartObjCoords.y1 + p.y) - chartObjCoords.y2 + 10);
+ }
+ }
}
/**
- * @brief SNR Long press event for show constellation Map (only for T-DECK)
+ * @brief SNR long press event for showing constellation map (only for T-DECK).
+ *
+ * @details Handles the long press event on the SNR bar to display the constellation map message, specifically for the T-DECK device.
*
- * @param event
+ * @param event LVGL event pointer.
*/
void constSatEvent(lv_event_t *event)
{
- lv_event_code_t code = lv_event_get_code(event);
+ lv_event_code_t code = lv_event_get_code(event);
- if (code == LV_EVENT_LONG_PRESSED)
- lv_obj_clear_flag(constMsg,LV_OBJ_FLAG_HIDDEN);
+ if (code == LV_EVENT_LONG_PRESSED)
+ lv_obj_clear_flag(constMsg,LV_OBJ_FLAG_HIDDEN);
}
/**
- * @brief Event for hide constellation Map (only for T-DECK)
+ * @brief Event for hiding the constellation map (only for T-DECK).
*
- * @param event
+ * @details Handles the long press event to hide the constellation map message on the T-DECK device.
+ *
+ * @param event LVGL event pointer.
*/
void closeConstSatEvent(lv_event_t *event)
{
- lv_event_code_t code = lv_event_get_code(event);
+ lv_event_code_t code = lv_event_get_code(event);
- if (code == LV_EVENT_LONG_PRESSED)
- lv_obj_add_flag(constMsg,LV_OBJ_FLAG_HIDDEN);
+ if (code == LV_EVENT_LONG_PRESSED)
+ lv_obj_add_flag(constMsg,LV_OBJ_FLAG_HIDDEN);
}
- /**
+/**
* @brief Create Canvas for Satellite Constellation
*
- * @param screen
+ * @details Initializes and creates the canvas object for rendering the satellite constellation on the specified screen,
+ * allocates the required buffer, and sets up the drawing layer.
+ *
+ * @param screen Pointer to the LVGL screen object where the canvas will be created.
*/
void createConstCanvas(_lv_obj_t *screen)
{
- static lv_color_t *cbuf = (lv_color_t*)heap_caps_aligned_alloc(16, (canvasSize*canvasSize*sizeof(lv_color_t)), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);;
- constCanvas = lv_canvas_create(screen);
- lv_canvas_set_buffer(constCanvas, cbuf, canvasSize, canvasSize, LV_COLOR_FORMAT_RGB565);
- lv_canvas_fill_bg(constCanvas, lv_color_black(), LV_OPA_100);
+ static lv_color_t *cbuf = (lv_color_t*)heap_caps_aligned_alloc(16, (canvasSize*canvasSize*sizeof(lv_color_t)), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);;
+ constCanvas = lv_canvas_create(screen);
+ lv_canvas_set_buffer(constCanvas, cbuf, canvasSize, canvasSize, LV_COLOR_FORMAT_RGB565);
+ lv_canvas_fill_bg(constCanvas, lv_color_black(), LV_OPA_100);
- lv_canvas_init_layer(constCanvas, &canvasLayer);
+ lv_canvas_init_layer(constCanvas, &canvasLayer);
}
- /**
+/**
* @brief Satellite info screen
*
- * @param screen
+ * @details Creates and lays out the satellite information screen,
+ *
+ * @param screen Pointer to the LVGL screen object where the satellite info screen will be created.
*/
#ifndef TDECK_ESP32S3
void satelliteScr(_lv_obj_t *screen)
{
- lv_obj_t *infoGrid = lv_obj_create(screen);
- lv_obj_set_width(infoGrid,TFT_WIDTH);
- lv_obj_set_height(infoGrid,35);
- lv_obj_set_flex_align(infoGrid, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_clear_flag(infoGrid, LV_OBJ_FLAG_SCROLLABLE);
- lv_obj_set_flex_flow(infoGrid, LV_FLEX_FLOW_ROW_WRAP);
- lv_obj_set_pos(infoGrid,0,190);
-
- static lv_style_t styleGrid;
- lv_style_init(&styleGrid);
- lv_style_set_bg_opa(&styleGrid, LV_OPA_0);
- lv_style_set_border_opa(&styleGrid, LV_OPA_0);
- lv_obj_add_style(infoGrid, &styleGrid, LV_PART_MAIN);
-
- pdopLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(pdopLabel, fontDefault, 0);
- lv_label_set_text_fmt(pdopLabel, "PDOP: %.1f", 0);
-
- hdopLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(hdopLabel, fontDefault, 0);
- lv_label_set_text_fmt(hdopLabel, "HDOP: %.1f", 0);
-
- vdopLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(vdopLabel, fontDefault, 0);
- lv_label_set_text_fmt(vdopLabel, "VDOP: %.1f", 0);
-
- altLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(altLabel, fontDefault, 0);
- lv_label_set_text_fmt(altLabel, "ALT: %4dm.", 0);
-
- lv_obj_t * barCont = lv_obj_create(screen);
- lv_obj_set_size(barCont, TFT_WIDTH, 180);
- lv_obj_set_pos(barCont, 0, 5);
- lv_obj_t * wrapper = lv_obj_create(barCont);
- lv_obj_remove_style_all(wrapper);
- lv_obj_set_size(wrapper, TFT_WIDTH * 2, 120);
-
- lv_obj_t * gnssLabel = lv_label_create(barCont);
- lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
- lv_obj_set_pos(gnssLabel, 0, 127);
- lv_obj_set_width(gnssLabel,90);
- lv_obj_set_style_bg_color(gnssLabel, GP_ACTIVE_COLOR, 0);
- lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
- lv_obj_set_style_border_color(gnssLabel, GP_INACTIVE_COLOR, 0);
- lv_obj_set_style_border_width(gnssLabel, 1, 0);
- lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
- lv_label_set_text(gnssLabel, "GPS");
- lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
-
- gnssLabel = lv_label_create(barCont);
- lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
- lv_obj_set_pos(gnssLabel, 95, 127);
- lv_obj_set_width(gnssLabel,90);
- lv_obj_set_style_bg_color(gnssLabel, GL_ACTIVE_COLOR, 0);
- lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
- lv_obj_set_style_border_color(gnssLabel, GL_INACTIVE_COLOR, 0);
- lv_obj_set_style_border_width(gnssLabel, 1, 0);
- lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
- lv_label_set_text(gnssLabel, "GLONASS");
- lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
-
- gnssLabel = lv_label_create(barCont);
- lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
- lv_obj_set_pos(gnssLabel, 190, 127);
- lv_obj_set_width(gnssLabel,90);
- lv_obj_set_style_bg_color(gnssLabel, BD_ACTIVE_COLOR, 0);
- lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
- lv_obj_set_style_border_color(gnssLabel, BD_INACTIVE_COLOR, 0);
- lv_obj_set_style_border_width(gnssLabel, 1, 0);
- lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
- lv_label_set_text(gnssLabel, "BEIDOU");
- lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
-
- satelliteBar = lv_chart_create(wrapper);
- lv_obj_set_size(satelliteBar, TFT_WIDTH * 2, 120);
- lv_chart_set_div_line_count(satelliteBar, 10, 0);
- lv_chart_set_range(satelliteBar, LV_CHART_AXIS_PRIMARY_Y, 0, 60);
- satelliteBarSerie = lv_chart_add_series(satelliteBar, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
- lv_chart_set_type(satelliteBar, LV_CHART_TYPE_BAR);
- lv_obj_set_style_pad_all(satelliteBar, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
- lv_obj_set_style_pad_gap(satelliteBar, -7, LV_PART_ITEMS | LV_STATE_DEFAULT);
- lv_obj_set_style_pad_column(satelliteBar, 2, 0);
- lv_chart_set_point_count(satelliteBar, MAX_SATELLLITES_IN_VIEW );
- lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_TASK_ADDED, NULL);
- lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_POST_END, NULL);
- lv_obj_add_flag(satelliteBar, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
+ lv_obj_t *infoGrid = lv_obj_create(screen);
+ lv_obj_set_width(infoGrid,TFT_WIDTH);
+ lv_obj_set_height(infoGrid,35);
+ lv_obj_set_flex_align(infoGrid, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_clear_flag(infoGrid, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(infoGrid, LV_FLEX_FLOW_ROW_WRAP);
+ lv_obj_set_pos(infoGrid,0,190);
+
+ static lv_style_t styleGrid;
+ lv_style_init(&styleGrid);
+ lv_style_set_bg_opa(&styleGrid, LV_OPA_0);
+ lv_style_set_border_opa(&styleGrid, LV_OPA_0);
+ lv_obj_add_style(infoGrid, &styleGrid, LV_PART_MAIN);
+
+ pdopLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(pdopLabel, fontDefault, 0);
+ lv_label_set_text_fmt(pdopLabel, "PDOP: %.1f", 0);
+
+ hdopLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(hdopLabel, fontDefault, 0);
+ lv_label_set_text_fmt(hdopLabel, "HDOP: %.1f", 0);
+
+ vdopLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(vdopLabel, fontDefault, 0);
+ lv_label_set_text_fmt(vdopLabel, "VDOP: %.1f", 0);
+
+ altLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(altLabel, fontDefault, 0);
+ lv_label_set_text_fmt(altLabel, "ALT: %4dm.", 0);
+
+ lv_obj_t * barCont = lv_obj_create(screen);
+ lv_obj_set_size(barCont, TFT_WIDTH, 180);
+ lv_obj_set_pos(barCont, 0, 5);
+ lv_obj_t * wrapper = lv_obj_create(barCont);
+ lv_obj_remove_style_all(wrapper);
+ lv_obj_set_size(wrapper, TFT_WIDTH * 2, 120);
+
+ lv_obj_t * gnssLabel = lv_label_create(barCont);
+ lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
+ lv_obj_set_pos(gnssLabel, 0, 127);
+ lv_obj_set_width(gnssLabel,90);
+ lv_obj_set_style_bg_color(gnssLabel, GP_ACTIVE_COLOR, 0);
+ lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
+ lv_obj_set_style_border_color(gnssLabel, GP_INACTIVE_COLOR, 0);
+ lv_obj_set_style_border_width(gnssLabel, 1, 0);
+ lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
+ lv_label_set_text(gnssLabel, "GPS");
+ lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
+
+ gnssLabel = lv_label_create(barCont);
+ lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
+ lv_obj_set_pos(gnssLabel, 95, 127);
+ lv_obj_set_width(gnssLabel,90);
+ lv_obj_set_style_bg_color(gnssLabel, GL_ACTIVE_COLOR, 0);
+ lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
+ lv_obj_set_style_border_color(gnssLabel, GL_INACTIVE_COLOR, 0);
+ lv_obj_set_style_border_width(gnssLabel, 1, 0);
+ lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
+ lv_label_set_text(gnssLabel, "GLONASS");
+ lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
+
+ gnssLabel = lv_label_create(barCont);
+ lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
+ lv_obj_set_pos(gnssLabel, 190, 127);
+ lv_obj_set_width(gnssLabel,90);
+ lv_obj_set_style_bg_color(gnssLabel, BD_ACTIVE_COLOR, 0);
+ lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
+ lv_obj_set_style_border_color(gnssLabel, BD_INACTIVE_COLOR, 0);
+ lv_obj_set_style_border_width(gnssLabel, 1, 0);
+ lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
+ lv_label_set_text(gnssLabel, "BEIDOU");
+ lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
+
+ satelliteBar = lv_chart_create(wrapper);
+ lv_obj_set_size(satelliteBar, TFT_WIDTH * 2, 120);
+ lv_chart_set_div_line_count(satelliteBar, 10, 0);
+ lv_chart_set_range(satelliteBar, LV_CHART_AXIS_PRIMARY_Y, 0, 60);
+ satelliteBarSerie = lv_chart_add_series(satelliteBar, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
+ lv_chart_set_type(satelliteBar, LV_CHART_TYPE_BAR);
+ lv_obj_set_style_pad_all(satelliteBar, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
+ lv_obj_set_style_pad_gap(satelliteBar, -7, LV_PART_ITEMS | LV_STATE_DEFAULT);
+ lv_obj_set_style_pad_column(satelliteBar, 2, 0);
+ lv_chart_set_point_count(satelliteBar, MAX_SATELLLITES_IN_VIEW );
+ lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_TASK_ADDED, NULL);
+ lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_POST_END, NULL);
+ lv_obj_add_flag(satelliteBar, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
}
#endif
#ifdef TDECK_ESP32S3
void satelliteScr(_lv_obj_t *screen)
{
- lv_obj_t *infoGrid = lv_obj_create(screen);
- lv_obj_set_width(infoGrid,TFT_WIDTH);
- lv_obj_set_height(infoGrid,35);
- lv_obj_set_flex_align(infoGrid, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_clear_flag(infoGrid, LV_OBJ_FLAG_SCROLLABLE);
- lv_obj_set_flex_flow(infoGrid, LV_FLEX_FLOW_ROW_WRAP);
- lv_obj_set_pos(infoGrid,0,150);
-
- static lv_style_t styleGrid;
- lv_style_init(&styleGrid);
- lv_style_set_bg_opa(&styleGrid, LV_OPA_0);
- lv_style_set_border_opa(&styleGrid, LV_OPA_0);
- lv_obj_add_style(infoGrid, &styleGrid, LV_PART_MAIN);
-
- pdopLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(pdopLabel, fontDefault, 0);
- lv_label_set_text_fmt(pdopLabel, "PDOP: %.1f", 0);
-
- hdopLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(hdopLabel, fontDefault, 0);
- lv_label_set_text_fmt(hdopLabel, "HDOP: %.1f", 0);
-
- vdopLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(vdopLabel, fontDefault, 0);
- lv_label_set_text_fmt(vdopLabel, "VDOP: %.1f", 0);
-
- altLabel = lv_label_create(infoGrid);
- lv_obj_set_style_text_font(altLabel, fontDefault, 0);
- lv_label_set_text_fmt(altLabel, "ALT: %4dm.", 0);
-
- lv_obj_t * barCont = lv_obj_create(screen);
- lv_obj_set_size(barCont, TFT_WIDTH, 145);
- lv_obj_set_pos(barCont, 0, 5);
-
- lv_obj_t * wrapper = lv_obj_create(barCont);
- lv_obj_remove_style_all(wrapper);
- lv_obj_set_size(wrapper, TFT_WIDTH * 2, 100);
-
- lv_obj_t * gnssLabel = lv_label_create(barCont);
- lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
- lv_obj_set_pos(gnssLabel, 0, 102);
- lv_obj_set_width(gnssLabel,90);
- lv_obj_set_style_bg_color(gnssLabel, GP_ACTIVE_COLOR, 0);
- lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
- lv_obj_set_style_border_color(gnssLabel, GP_INACTIVE_COLOR, 0);
- lv_obj_set_style_border_width(gnssLabel, 1, 0);
- lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
- lv_label_set_text(gnssLabel, "GPS");
- lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
-
- gnssLabel = lv_label_create(barCont);
- lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
- lv_obj_set_pos(gnssLabel, 95, 102);
- lv_obj_set_width(gnssLabel,90);
- lv_obj_set_style_bg_color(gnssLabel, GL_ACTIVE_COLOR, 0);
- lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
- lv_obj_set_style_border_color(gnssLabel, GL_INACTIVE_COLOR, 0);
- lv_obj_set_style_border_width(gnssLabel, 1, 0);
- lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
- lv_label_set_text(gnssLabel, "GLONASS");
- lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
-
- gnssLabel = lv_label_create(barCont);
- lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
- lv_obj_set_pos(gnssLabel, 190, 102);
- lv_obj_set_width(gnssLabel,90);
- lv_obj_set_style_bg_color(gnssLabel, BD_ACTIVE_COLOR, 0);
- lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
- lv_obj_set_style_border_color(gnssLabel, BD_INACTIVE_COLOR, 0);
- lv_obj_set_style_border_width(gnssLabel, 1, 0);
- lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
- lv_label_set_text(gnssLabel, "BEIDOU");
- lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
-
- satelliteBar = lv_chart_create(wrapper);
- lv_obj_set_size(satelliteBar, TFT_WIDTH * 2, 100);
- lv_chart_set_div_line_count(satelliteBar, 10, 0);
- lv_chart_set_range(satelliteBar, LV_CHART_AXIS_PRIMARY_Y, 0, 60);
- satelliteBarSerie = lv_chart_add_series(satelliteBar, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
- lv_chart_set_type(satelliteBar, LV_CHART_TYPE_BAR);
- lv_obj_set_style_pad_all(satelliteBar, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
- lv_obj_set_style_pad_gap(satelliteBar, -7, LV_PART_ITEMS | LV_STATE_DEFAULT);
- lv_obj_set_style_pad_column(satelliteBar, 2, 0);
- lv_chart_set_point_count(satelliteBar, MAX_SATELLLITES_IN_VIEW );
- lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_TASK_ADDED, NULL);
- lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_POST_END, NULL);
- lv_obj_add_flag(satelliteBar, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
- lv_obj_add_event_cb(satelliteBar, constSatEvent, LV_EVENT_LONG_PRESSED, NULL);
-
- constMsg = lv_msgbox_create(screen);
- lv_obj_set_size(constMsg, 180, 185);
- lv_obj_set_align(constMsg,LV_ALIGN_CENTER);
- lv_obj_add_flag(constMsg,LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_event_cb(constMsg, closeConstSatEvent, LV_EVENT_LONG_PRESSED, NULL);
+ lv_obj_t *infoGrid = lv_obj_create(screen);
+ lv_obj_set_width(infoGrid,TFT_WIDTH);
+ lv_obj_set_height(infoGrid,35);
+ lv_obj_set_flex_align(infoGrid, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_clear_flag(infoGrid, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(infoGrid, LV_FLEX_FLOW_ROW_WRAP);
+ lv_obj_set_pos(infoGrid,0,150);
+
+ static lv_style_t styleGrid;
+ lv_style_init(&styleGrid);
+ lv_style_set_bg_opa(&styleGrid, LV_OPA_0);
+ lv_style_set_border_opa(&styleGrid, LV_OPA_0);
+ lv_obj_add_style(infoGrid, &styleGrid, LV_PART_MAIN);
+
+ pdopLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(pdopLabel, fontDefault, 0);
+ lv_label_set_text_fmt(pdopLabel, "PDOP: %.1f", 0);
+
+ hdopLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(hdopLabel, fontDefault, 0);
+ lv_label_set_text_fmt(hdopLabel, "HDOP: %.1f", 0);
+
+ vdopLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(vdopLabel, fontDefault, 0);
+ lv_label_set_text_fmt(vdopLabel, "VDOP: %.1f", 0);
+
+ altLabel = lv_label_create(infoGrid);
+ lv_obj_set_style_text_font(altLabel, fontDefault, 0);
+ lv_label_set_text_fmt(altLabel, "ALT: %4dm.", 0);
+
+ lv_obj_t * barCont = lv_obj_create(screen);
+ lv_obj_set_size(barCont, TFT_WIDTH, 145);
+ lv_obj_set_pos(barCont, 0, 5);
+
+ lv_obj_t * wrapper = lv_obj_create(barCont);
+ lv_obj_remove_style_all(wrapper);
+ lv_obj_set_size(wrapper, TFT_WIDTH * 2, 100);
+
+ lv_obj_t * gnssLabel = lv_label_create(barCont);
+ lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
+ lv_obj_set_pos(gnssLabel, 0, 102);
+ lv_obj_set_width(gnssLabel,90);
+ lv_obj_set_style_bg_color(gnssLabel, GP_ACTIVE_COLOR, 0);
+ lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
+ lv_obj_set_style_border_color(gnssLabel, GP_INACTIVE_COLOR, 0);
+ lv_obj_set_style_border_width(gnssLabel, 1, 0);
+ lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
+ lv_label_set_text(gnssLabel, "GPS");
+ lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
+
+ gnssLabel = lv_label_create(barCont);
+ lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
+ lv_obj_set_pos(gnssLabel, 95, 102);
+ lv_obj_set_width(gnssLabel,90);
+ lv_obj_set_style_bg_color(gnssLabel, GL_ACTIVE_COLOR, 0);
+ lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
+ lv_obj_set_style_border_color(gnssLabel, GL_INACTIVE_COLOR, 0);
+ lv_obj_set_style_border_width(gnssLabel, 1, 0);
+ lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
+ lv_label_set_text(gnssLabel, "GLONASS");
+ lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
+
+ gnssLabel = lv_label_create(barCont);
+ lv_obj_set_style_text_font(gnssLabel, fontSatInfo, 0);
+ lv_obj_set_pos(gnssLabel, 190, 102);
+ lv_obj_set_width(gnssLabel,90);
+ lv_obj_set_style_bg_color(gnssLabel, BD_ACTIVE_COLOR, 0);
+ lv_obj_set_style_bg_opa(gnssLabel, LV_OPA_100, 0);
+ lv_obj_set_style_border_color(gnssLabel, BD_INACTIVE_COLOR, 0);
+ lv_obj_set_style_border_width(gnssLabel, 1, 0);
+ lv_obj_set_style_border_opa(gnssLabel, LV_OPA_100, 0);
+ lv_label_set_text(gnssLabel, "BEIDOU");
+ lv_obj_set_style_text_align(gnssLabel, LV_TEXT_ALIGN_CENTER, 0);
+
+ satelliteBar = lv_chart_create(wrapper);
+ lv_obj_set_size(satelliteBar, TFT_WIDTH * 2, 100);
+ lv_chart_set_div_line_count(satelliteBar, 10, 0);
+ lv_chart_set_range(satelliteBar, LV_CHART_AXIS_PRIMARY_Y, 0, 60);
+ satelliteBarSerie = lv_chart_add_series(satelliteBar, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
+ lv_chart_set_type(satelliteBar, LV_CHART_TYPE_BAR);
+ lv_obj_set_style_pad_all(satelliteBar, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
+ lv_obj_set_style_pad_gap(satelliteBar, -7, LV_PART_ITEMS | LV_STATE_DEFAULT);
+ lv_obj_set_style_pad_column(satelliteBar, 2, 0);
+ lv_chart_set_point_count(satelliteBar, MAX_SATELLLITES_IN_VIEW );
+ lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_TASK_ADDED, NULL);
+ lv_obj_add_event_cb(satelliteBar, satelliteBarDrawEvent, LV_EVENT_DRAW_POST_END, NULL);
+ lv_obj_add_flag(satelliteBar, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
+ lv_obj_add_event_cb(satelliteBar, constSatEvent, LV_EVENT_LONG_PRESSED, NULL);
+
+ constMsg = lv_msgbox_create(screen);
+ lv_obj_set_size(constMsg, 180, 185);
+ lv_obj_set_align(constMsg,LV_ALIGN_CENTER);
+ lv_obj_add_flag(constMsg,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_event_cb(constMsg, closeConstSatEvent, LV_EVENT_LONG_PRESSED, NULL);
}
#endif
/**
* @brief Draw Satellite SNR Bars
*
- *
+ * @details Updates the SNR (Signal-to-Noise Ratio) bar chart with current satellite data.
*/
void drawSatSNR()
{
- for (int i = 0; i < MAX_SATELLLITES_IN_VIEW ; i++)
- {
- lv_chart_set_value_by_id(satelliteBar, satelliteBarSerie, i, LV_CHART_POINT_NONE);
- }
+ for (int i = 0; i < MAX_SATELLLITES_IN_VIEW ; i++)
+ {
+ lv_chart_set_value_by_id(satelliteBar, satelliteBarSerie, i, LV_CHART_POINT_NONE);
+ }
- for (int i = 0; i < gps.gpsData.satInView; ++i)
- {
- lv_chart_set_value_by_id(satelliteBar, satelliteBarSerie, i, gps.satTracker[i].snr);
- }
+ for (int i = 0; i < gps.gpsData.satInView; ++i)
+ {
+ lv_chart_set_value_by_id(satelliteBar, satelliteBarSerie, i, gps.satTracker[i].snr);
+ }
- lv_chart_refresh(satelliteBar);
+ lv_chart_refresh(satelliteBar);
}
/**
* @brief Draw Satellite Constellation
*
- *
+ * @details Draws the satellite constellation grid on the canvas, including concentric circles, cross lines, and cardinal direction labels.
*/
void drawSatConst()
{
- // Draw Circles
- lv_draw_arc_dsc_t dscArc;
- lv_draw_arc_dsc_init(&dscArc);
- dscArc.color = CONSTEL_COLOR;
- dscArc.width = 2;
- dscArc.center.x = canvasCenter_X;
- dscArc.center.y = canvasCenter_Y;
- dscArc.start_angle = 0;
- dscArc.end_angle = 360;
- dscArc.radius = canvasRadius;
- lv_draw_arc(&canvasLayer, &dscArc);
- dscArc.radius = ( canvasRadius * 2 ) / 3;
- lv_draw_arc(&canvasLayer, &dscArc);
- dscArc.radius = canvasRadius / 3 ;
- lv_draw_arc(&canvasLayer, &dscArc);
-
- // Draw Lines
- lv_draw_line_dsc_t dscLine;
- lv_draw_line_dsc_init(&dscLine);
- dscLine.color = CONSTEL_COLOR;
- dscLine.width = 2;
- dscLine.round_end = 1;
- dscLine.round_start = 1;
- dscLine.p1.x = canvasCenter_X;
- dscLine.p1.y = canvasOffset;
- dscLine.p2.x = canvasCenter_X;
- dscLine.p2.y = canvasSize-canvasOffset;
- lv_draw_line(&canvasLayer, &dscLine);
- dscLine.p1.x = canvasOffset;
- dscLine.p1.y = canvasCenter_Y;
- dscLine.p2.x = canvasSize-canvasOffset;
- dscLine.p2.y = canvasCenter_Y;
- lv_draw_line(&canvasLayer, &dscLine);
-
- // Draw Text Coordinates
- lv_draw_label_dsc_t dscLabel;
- lv_draw_label_dsc_init(&dscLabel);
- dscLabel.color = CONSTEL_COLOR;
- dscLabel.opa = LV_OPA_100;
- dscLabel.font = &lv_font_montserrat_12;
- dscLabel.text = "N";
- lv_area_t labelPos = {canvasCenter_X-5, 0, canvasCenter_X+5, 0};
- lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
- dscLabel.text = "S";
- labelPos = {canvasCenter_X-4, canvasSize-15, canvasCenter_X+4, canvasSize};
- lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
- dscLabel.text = "E";
- labelPos = {canvasSize-12, canvasCenter_Y-7 , canvasSize, canvasCenter_Y+7};
- lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
- dscLabel.text = "W";
- labelPos = {0, canvasCenter_Y-7, canvasSize - 10, canvasCenter_Y+7};
- lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
-
- // Finish Canvas Draw
- lv_canvas_finish_layer(constCanvas, &canvasLayer);
+ // Draw Circles
+ lv_draw_arc_dsc_t dscArc;
+ lv_draw_arc_dsc_init(&dscArc);
+ dscArc.color = CONSTEL_COLOR;
+ dscArc.width = 2;
+ dscArc.center.x = canvasCenter_X;
+ dscArc.center.y = canvasCenter_Y;
+ dscArc.start_angle = 0;
+ dscArc.end_angle = 360;
+ dscArc.radius = canvasRadius;
+ lv_draw_arc(&canvasLayer, &dscArc);
+ dscArc.radius = ( canvasRadius * 2 ) / 3;
+ lv_draw_arc(&canvasLayer, &dscArc);
+ dscArc.radius = canvasRadius / 3 ;
+ lv_draw_arc(&canvasLayer, &dscArc);
+
+ // Draw Lines
+ lv_draw_line_dsc_t dscLine;
+ lv_draw_line_dsc_init(&dscLine);
+ dscLine.color = CONSTEL_COLOR;
+ dscLine.width = 2;
+ dscLine.round_end = 1;
+ dscLine.round_start = 1;
+ dscLine.p1.x = canvasCenter_X;
+ dscLine.p1.y = canvasOffset;
+ dscLine.p2.x = canvasCenter_X;
+ dscLine.p2.y = canvasSize-canvasOffset;
+ lv_draw_line(&canvasLayer, &dscLine);
+ dscLine.p1.x = canvasOffset;
+ dscLine.p1.y = canvasCenter_Y;
+ dscLine.p2.x = canvasSize-canvasOffset;
+ dscLine.p2.y = canvasCenter_Y;
+ lv_draw_line(&canvasLayer, &dscLine);
+
+ // Draw Text Coordinates
+ lv_draw_label_dsc_t dscLabel;
+ lv_draw_label_dsc_init(&dscLabel);
+ dscLabel.color = CONSTEL_COLOR;
+ dscLabel.opa = LV_OPA_100;
+ dscLabel.font = &lv_font_montserrat_12;
+ dscLabel.text = "N";
+ lv_area_t labelPos = {canvasCenter_X-5, 0, canvasCenter_X+5, 0};
+ lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
+ dscLabel.text = "S";
+ labelPos = {canvasCenter_X-4, canvasSize-15, canvasCenter_X+4, canvasSize};
+ lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
+ dscLabel.text = "E";
+ labelPos = {canvasSize-12, canvasCenter_Y-7 , canvasSize, canvasCenter_Y+7};
+ lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
+ dscLabel.text = "W";
+ labelPos = {0, canvasCenter_Y-7, canvasSize - 10, canvasCenter_Y+7};
+ lv_draw_label(&canvasLayer, &dscLabel, &labelPos);
+
+ // Finish Canvas Draw
+ lv_canvas_finish_layer(constCanvas, &canvasLayer);
}
/**
* @brief Draw Satellite Position in Constellation
*
- *
+ * @details Draws the position of each satellite within the constellation canvas, including their colored circles (based on constellation and activity)
+ * and overlays their satellite numbers at their respective positions.
*/
void drawSatSky()
{
- lv_canvas_fill_bg(constCanvas, lv_color_black(), LV_OPA_100);
- drawSatConst();
-
- lv_layer_t satPosLayer;
- lv_canvas_init_layer(constCanvas, &satPosLayer);
-
- // Draw Satellite
- lv_draw_arc_dsc_t dscSat;
- lv_draw_arc_dsc_init(&dscSat);
- dscSat.width = 8;
- dscSat.start_angle = 0;
- dscSat.end_angle = 360;
- dscSat.radius = 8;
- dscSat.opa = LV_OPA_70;
-
- for (int i = 0; i < gps.gpsData.satInView; i++)
- {
- if ( strcmp(gps.satTracker[i].talker_id,"GP") == 0 )
- dscSat.color = gps.satTracker[i].active == true ? GP_INACTIVE_COLOR : GP_ACTIVE_COLOR;
- if ( strcmp(gps.satTracker[i].talker_id,"GL") == 0 )
- dscSat.color = gps.satTracker[i].active == true ? GL_INACTIVE_COLOR : GL_ACTIVE_COLOR;
- if ( strcmp(gps.satTracker[i].talker_id,"BD") == 0 )
- dscSat.color = gps.satTracker[i].active == true ? BD_INACTIVE_COLOR : BD_ACTIVE_COLOR;
- dscSat.center.x = gps.satTracker[i].posX;
- dscSat.center.y = gps.satTracker[i].posY;
- lv_draw_arc(&satPosLayer, &dscSat);
-
- // Draw Satellite Number
- char buf[16];
- lv_draw_rect_dsc_t draw_rect_dsc;
- lv_draw_rect_dsc_init(&draw_rect_dsc);
-
- lv_snprintf(buf, sizeof(buf), LV_SYMBOL_DUMMY"%d", gps.satTracker[i].satNum);
-
- draw_rect_dsc.bg_opa = LV_OPA_TRANSP;
- draw_rect_dsc.radius = 0;
- draw_rect_dsc.bg_image_symbol_font = &lv_font_montserrat_8;
- draw_rect_dsc.bg_image_src = buf;
- draw_rect_dsc.bg_image_recolor = lv_color_white();
-
- lv_area_t a;
- a.x1 = gps.satTracker[i].posX-8;
- a.x2 = gps.satTracker[i].posX+8;
- a.y1 = gps.satTracker[i].posY-5;
- a.y2 = gps.satTracker[i].posY+4;
-
- lv_draw_rect(&satPosLayer, &draw_rect_dsc, &a);
-
- // Finish Canvas Draw
- lv_canvas_finish_layer(constCanvas, &satPosLayer);
- }
+ lv_canvas_fill_bg(constCanvas, lv_color_black(), LV_OPA_100);
+ drawSatConst();
+
+ lv_layer_t satPosLayer;
+ lv_canvas_init_layer(constCanvas, &satPosLayer);
+
+ // Draw Satellite
+ lv_draw_arc_dsc_t dscSat;
+ lv_draw_arc_dsc_init(&dscSat);
+ dscSat.width = 8;
+ dscSat.start_angle = 0;
+ dscSat.end_angle = 360;
+ dscSat.radius = 8;
+ dscSat.opa = LV_OPA_70;
+
+ for (int i = 0; i < gps.gpsData.satInView; i++)
+ {
+ if ( strcmp(gps.satTracker[i].talker_id,"GP") == 0 )
+ dscSat.color = gps.satTracker[i].active == true ? GP_INACTIVE_COLOR : GP_ACTIVE_COLOR;
+ if ( strcmp(gps.satTracker[i].talker_id,"GL") == 0 )
+ dscSat.color = gps.satTracker[i].active == true ? GL_INACTIVE_COLOR : GL_ACTIVE_COLOR;
+ if ( strcmp(gps.satTracker[i].talker_id,"BD") == 0 )
+ dscSat.color = gps.satTracker[i].active == true ? BD_INACTIVE_COLOR : BD_ACTIVE_COLOR;
+ dscSat.center.x = gps.satTracker[i].posX;
+ dscSat.center.y = gps.satTracker[i].posY;
+ lv_draw_arc(&satPosLayer, &dscSat);
+
+ // Draw Satellite Number
+ char buf[16];
+ lv_draw_rect_dsc_t draw_rect_dsc;
+ lv_draw_rect_dsc_init(&draw_rect_dsc);
+
+ lv_snprintf(buf, sizeof(buf), LV_SYMBOL_DUMMY"%d", gps.satTracker[i].satNum);
+
+ draw_rect_dsc.bg_opa = LV_OPA_TRANSP;
+ draw_rect_dsc.radius = 0;
+ draw_rect_dsc.bg_image_symbol_font = &lv_font_montserrat_8;
+ draw_rect_dsc.bg_image_src = buf;
+ draw_rect_dsc.bg_image_recolor = lv_color_white();
+
+ lv_area_t a;
+ a.x1 = gps.satTracker[i].posX-8;
+ a.x2 = gps.satTracker[i].posX+8;
+ a.y1 = gps.satTracker[i].posY-5;
+ a.y2 = gps.satTracker[i].posY+4;
+
+ lv_draw_rect(&satPosLayer, &draw_rect_dsc, &a);
+
+ // Finish Canvas Draw
+ lv_canvas_finish_layer(constCanvas, &satPosLayer);
+ }
}
\ No newline at end of file
diff --git a/lib/gui/src/satInfoScr.hpp b/lib/gui/src/satInfoScr.hpp
index 97697b32..feec998f 100644
--- a/lib/gui/src/satInfoScr.hpp
+++ b/lib/gui/src/satInfoScr.hpp
@@ -2,8 +2,8 @@
* @file satInfoScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Satellite info screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -14,37 +14,42 @@
/**
* @brief Satellite SV Colors
*
+ * Color definitions for active and inactive states of satellite systems in the UI.
*/
// GPS
-#define GP_ACTIVE_COLOR lv_color_hex(0x104828)
-#define GP_INACTIVE_COLOR lv_color_hex(0x229954)
+#define GP_ACTIVE_COLOR lv_color_hex(0x104828) /**< Active color for GPS satellites. */
+#define GP_INACTIVE_COLOR lv_color_hex(0x229954) /**< Inactive color for GPS satellites. */
+
// GLONASS
-#define GL_ACTIVE_COLOR lv_color_hex(0x11364d)
-#define GL_INACTIVE_COLOR lv_color_hex(0x2471a3)
+#define GL_ACTIVE_COLOR lv_color_hex(0x11364d) /**< Active color for GLONASS satellites. */
+#define GL_INACTIVE_COLOR lv_color_hex(0x2471a3) /**< Inactive color for GLONASS satellites. */
+
// BEIDOU
-#define BD_ACTIVE_COLOR lv_color_hex(0x3b1c48)
-#define BD_INACTIVE_COLOR lv_color_hex(0x7d3c98)
+#define BD_ACTIVE_COLOR lv_color_hex(0x3b1c48) /**< Active color for BEIDOU satellites. */
+#define BD_INACTIVE_COLOR lv_color_hex(0x7d3c98) /**< Inactive color for BEIDOU satellites. */
/**
- * @brief Satellite Tracking Tile screen objects
+ * @brief Satellite Tracking Tile screen objects.
*
+ * @details Objects used in the satellite tracking tile
*/
-extern lv_obj_t *pdopLabel;
-extern lv_obj_t *hdopLabel;
-extern lv_obj_t *vdopLabel;
-extern lv_obj_t *altLabel;
-extern lv_obj_t *constCanvas;
-extern lv_obj_t *satelliteBar;
-extern lv_chart_series_t *satelliteBarSerie;
-extern lv_obj_t *constMsg;
+extern lv_obj_t *pdopLabel; /**< Label for PDOP value. */
+extern lv_obj_t *hdopLabel; /**< Label for HDOP value. */
+extern lv_obj_t *vdopLabel; /**< Label for VDOP value. */
+extern lv_obj_t *altLabel; /**< Label for altitude value. */
+extern lv_obj_t *constCanvas; /**< Canvas for constellation visualization. */
+extern lv_obj_t *satelliteBar; /**< Chart object for satellite signal bar. */
+extern lv_chart_series_t *satelliteBarSerie; /**< Series for satellite signal bar chart. */
+extern lv_obj_t *constMsg; /**< Label for constellation status messages. */
/**
- * @brief Satellite Constellation Layer Canvas Definition
+ * @brief Satellite Constellation Layer Canvas Definition.
*
+ * @details Definitions for the color and layers used for drawing the satellite constellation on the canvas.
*/
- #define CONSTEL_COLOR lv_color_hex(0x515a5a)
- extern lv_layer_t canvasLayer;
- extern lv_layer_t satLayer;
+#define CONSTEL_COLOR lv_color_hex(0x515a5a) /**< Color used for the constellation canvas background. */
+extern lv_layer_t canvasLayer; /**< Layer for the base canvas drawing. */
+extern lv_layer_t satLayer; /**< Layer for satellite elements. */
void drawTextOnLayer(const char * text, lv_layer_t * layer, lv_point_t * p, lv_area_t * coords, lv_color_t color, const void * font, int16_t offset);
diff --git a/lib/gui/src/searchSatScr.cpp b/lib/gui/src/searchSatScr.cpp
index 6ff602f0..6a63525d 100644
--- a/lib/gui/src/searchSatScr.cpp
+++ b/lib/gui/src/searchSatScr.cpp
@@ -2,118 +2,124 @@
* @file searchSatScr.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - GPS satellite search screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "searchSatScr.hpp"
-static unsigned long millisActual = 0;
-static bool skipSearch = false;
-bool isSearchingSat = true;
-extern uint8_t activeTile;
-lv_timer_t *mainTimer; // Main Screen Timer
+static unsigned long millisActual = 0; /**< Stores the current timestamp in milliseconds */
+static bool skipSearch = false; /**< Flag to indicate if satellite search should be skipped */
+bool isSearchingSat = true; /**< Flag to indicate if satellite search is in progress */
+extern uint8_t activeTile; /**< Index of the currently active tile */
+lv_timer_t *mainTimer; /**< Main Screen Timer */
/**
* @brief Button events
*
- * @param event
+ * @details Handles button events for the search screen.
+ *
+ * @param event LVGL event pointer.
*/
void buttonEvent(lv_event_t *event)
{
- char *option = (char *)lv_event_get_user_data(event);
- if (strcmp(option,"skip") == 0)
- skipSearch = true;
- if (strcmp(option,"settings") == 0)
- lv_screen_load(settingsScreen);
- lv_timer_resume(mainTimer);
+ char *option = (char *)lv_event_get_user_data(event);
+ if (strcmp(option,"skip") == 0)
+ skipSearch = true;
+ if (strcmp(option,"settings") == 0)
+ lv_screen_load(settingsScreen);
+ lv_timer_resume(mainTimer);
}
/**
* @brief Search valid GPS signal
*
+ * @details Checks for a valid GPS fix or a skip command.
+ *
+ * @param searchTimer LVGL timer pointer associated with the satellite search.
*/
void searchGPS(lv_timer_t *searchTimer)
{
- if (isGpsFixed)
- {
- millisActual = millis();
- while (millis() < millisActual + 500)
- ;
- lv_timer_del(searchTimer);
- lv_timer_resume(mainTimer);
- isSearchingSat = false;
- loadMainScreen();
- }
+ if (isGpsFixed)
+ {
+ millisActual = millis();
+ while (millis() < millisActual + 500)
+ ;
+ lv_timer_del(searchTimer);
+ lv_timer_resume(mainTimer);
+ isSearchingSat = false;
+ loadMainScreen();
+ }
- if (skipSearch)
- {
- lv_timer_del(searchTimer);
- isSearchingSat = false;
- zoom = defaultZoom;
- activeTile = 3;
- lv_tileview_set_tile_by_index(tilesScreen, 3, 0, LV_ANIM_OFF);
- loadMainScreen();
- }
+ if (skipSearch)
+ {
+ lv_timer_del(searchTimer);
+ isSearchingSat = false;
+ zoom = defaultZoom;
+ activeTile = 3;
+ lv_tileview_set_tile_by_index(tilesScreen, 3, 0, LV_ANIM_OFF);
+ loadMainScreen();
+ }
}
/**
* @brief Create Satellite Search Screen
*
+ * @details Creates the satellite search screen
*/
void createSearchSatScr()
{
- searchTimer = lv_timer_create(searchGPS, 100, NULL);
- lv_timer_ready(searchTimer);
- lv_timer_pause(mainTimer);
+ searchTimer = lv_timer_create(searchGPS, 100, NULL);
+ lv_timer_ready(searchTimer);
+ lv_timer_pause(mainTimer);
- searchSatScreen = lv_obj_create(NULL);
+ searchSatScreen = lv_obj_create(NULL);
- lv_obj_t *label = lv_label_create(searchSatScreen);
- lv_obj_set_style_text_font(label, &lv_font_montserrat_18, 0);
- lv_label_set_text(label, textSearch);
- lv_obj_set_align(label, LV_ALIGN_CENTER);
- lv_obj_set_y(label, -100);
+ lv_obj_t *label = lv_label_create(searchSatScreen);
+ lv_obj_set_style_text_font(label, &lv_font_montserrat_18, 0);
+ lv_label_set_text(label, textSearch);
+ lv_obj_set_align(label, LV_ALIGN_CENTER);
+ lv_obj_set_y(label, -100);
- lv_obj_t *spinner = lv_spinner_create(searchSatScreen);
- lv_obj_set_size(spinner, 130, 130);
- lv_spinner_set_anim_params(spinner, 2000, 200);
- lv_obj_center(spinner);
+ lv_obj_t *spinner = lv_spinner_create(searchSatScreen);
+ lv_obj_set_size(spinner, 130, 130);
+ lv_spinner_set_anim_params(spinner, 2000, 200);
+ lv_obj_center(spinner);
- lv_obj_t *satImg = lv_img_create(searchSatScreen);
- lv_img_set_src(satImg, satIconFile);
- lv_obj_set_align(satImg, LV_ALIGN_CENTER);
+ lv_obj_t *satImg = lv_img_create(searchSatScreen);
+ lv_img_set_src(satImg, satIconFile);
+ lv_obj_set_align(satImg, LV_ALIGN_CENTER);
- // Button Bar
- lv_obj_t *buttonBar = lv_obj_create(searchSatScreen);
- lv_obj_set_size(buttonBar, TFT_WIDTH, 68 * scaleBut);
- lv_obj_set_pos(buttonBar, 0, TFT_HEIGHT - 80 * scaleBut);
- lv_obj_set_flex_flow(buttonBar, LV_FLEX_FLOW_ROW);
- lv_obj_set_flex_align(buttonBar, LV_FLEX_ALIGN_END, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_SCROLLABLE);
- static lv_style_t styleBar;
- lv_style_init(&styleBar);
- lv_style_set_bg_opa(&styleBar, LV_OPA_0);
- lv_style_set_border_opa(&styleBar, LV_OPA_0);
- lv_obj_add_style(buttonBar, &styleBar, LV_PART_MAIN);
+ // Button Bar
+ lv_obj_t *buttonBar = lv_obj_create(searchSatScreen);
+ lv_obj_set_size(buttonBar, TFT_WIDTH, 68 * scaleBut);
+ lv_obj_set_pos(buttonBar, 0, TFT_HEIGHT - 80 * scaleBut);
+ lv_obj_set_flex_flow(buttonBar, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(buttonBar, LV_FLEX_ALIGN_END, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_clear_flag(buttonBar, LV_OBJ_FLAG_SCROLLABLE);
+ static lv_style_t styleBar;
+ lv_style_init(&styleBar);
+ lv_style_set_bg_opa(&styleBar, LV_OPA_0);
+ lv_style_set_border_opa(&styleBar, LV_OPA_0);
+ lv_obj_add_style(buttonBar, &styleBar, LV_PART_MAIN);
- lv_obj_t *imgBtn;
-
- // Settings Button
- imgBtn = lv_img_create(buttonBar);
- lv_img_set_src(imgBtn, confIconFile);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_event_cb(imgBtn, buttonEvent, LV_EVENT_PRESSED, (char*)"settings");
-
- // Skip Button
- imgBtn = lv_img_create(buttonBar);
- lv_img_set_src(imgBtn, skipIconFile);
- lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
- lv_img_set_zoom(imgBtn,buttonScale);
- lv_obj_update_layout(imgBtn);
- lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
- lv_obj_add_event_cb(imgBtn, buttonEvent, LV_EVENT_PRESSED, (char*)"skip");
+ lv_obj_t *imgBtn;
+
+ // Settings Button
+ imgBtn = lv_img_create(buttonBar);
+ lv_img_set_src(imgBtn, confIconFile);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_event_cb(imgBtn, buttonEvent, LV_EVENT_PRESSED, (char*)"settings");
+
+ // Skip Button
+ imgBtn = lv_img_create(buttonBar);
+ lv_img_set_src(imgBtn, skipIconFile);
+ lv_obj_add_flag(imgBtn, LV_OBJ_FLAG_CLICKABLE);
+ lv_img_set_zoom(imgBtn,buttonScale);
+ lv_obj_update_layout(imgBtn);
+ lv_obj_set_style_size(imgBtn,48 * scaleBut, 48 * scaleBut, 0);
+ lv_obj_add_event_cb(imgBtn, buttonEvent, LV_EVENT_PRESSED, (char*)"skip");
}
diff --git a/lib/gui/src/searchSatScr.hpp b/lib/gui/src/searchSatScr.hpp
index ff638140..b1c5fd1f 100644
--- a/lib/gui/src/searchSatScr.hpp
+++ b/lib/gui/src/searchSatScr.hpp
@@ -2,8 +2,8 @@
* @file searchSatScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - GPS satellite search screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -11,12 +11,12 @@
#include "gps.hpp"
#include "globalGuiDef.h"
-extern lv_obj_t *searchSatScreen; // Search Satellite Screen
-static lv_timer_t *searchTimer;
-static const char* textSearch PROGMEM = "Searching for satellites";
-static const char* satIconFile PROGMEM = "/sat.bin";
-static const char *skipIconFile PROGMEM = "/skip.bin"; // Skip icon
-static const char *confIconFile PROGMEM = "/settings.bin"; // Settings icon
+extern lv_obj_t *searchSatScreen; /**< Search Satellite Screen */
+static lv_timer_t *searchTimer; /**< Timer for satellite search process */
+static const char* textSearch PROGMEM = "Searching for satellites"; /**< Search status message */
+static const char* satIconFile PROGMEM = "/sat.bin"; /**< Path to satellite icon file */
+static const char *skipIconFile PROGMEM = "/skip.bin"; /**< Path to skip icon file */
+static const char *confIconFile PROGMEM = "/settings.bin"; /**< Path to settings icon file */
void loadMainScreen();
void searchGPS(lv_timer_t *searchTimer);
diff --git a/lib/gui/src/settingsScr.cpp b/lib/gui/src/settingsScr.cpp
index 2ae2a427..db5d50e2 100644
--- a/lib/gui/src/settingsScr.cpp
+++ b/lib/gui/src/settingsScr.cpp
@@ -2,153 +2,165 @@
* @file settingsScr.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Settings Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "settingsScr.hpp"
-bool needReboot = false;
+bool needReboot = false; /**< Flag to indicate if a system reboot is required */
+
extern Compass compass;
/**
* @brief Back button event
*
- * @param event
+ * @details Handles the back button action
+ *
+ * @param event LVGL event pointer.
*/
static void back(lv_event_t *event)
{
- if (isSearchingSat)
- {
- lv_timer_pause(mainTimer);
- lv_screen_load(searchSatScreen);
- }
- else
- loadMainScreen();
+ if (isSearchingSat)
+ {
+ lv_timer_pause(mainTimer);
+ lv_screen_load(searchSatScreen);
+ }
+ else
+ loadMainScreen();
}
/**
* @brief Touch Calibration
*
- * @param event
+ * @details Handles the touch calibration event.
+ *
+ * @param event LVGL event pointer.
*/
static void touchCalib(lv_event_t *event)
{
- repeatCalib = true;
- tft.fillScreen(TFT_BLACK);
- touchCalibrate();
- repeatCalib = false;
- isMainScreen = false;
- tft.fillScreen(TFT_BLACK);
- lv_screen_load(settingsScreen);
- lv_obj_invalidate(lv_scr_act());
+ repeatCalib = true;
+ tft.fillScreen(TFT_BLACK);
+ touchCalibrate();
+ repeatCalib = false;
+ isMainScreen = false;
+ tft.fillScreen(TFT_BLACK);
+ lv_screen_load(settingsScreen);
+ lv_obj_invalidate(lv_scr_act());
}
/**
* @brief Compass Calibration
*
- * @param event
+ * @details Handles the compass calibration event.
+ *
+ * @param event LVGL event pointer.
*/
#ifdef ENABLE_COMPASS
static void compassCalib(lv_event_t *event)
{
- tft.fillScreen(TFT_BLACK);
- compass.calibrate();
- tft.fillScreen(TFT_BLACK);
- isMainScreen = false;
- lv_screen_load(settingsScreen);
- lv_obj_invalidate(lv_scr_act());
+ tft.fillScreen(TFT_BLACK);
+ compass.calibrate();
+ tft.fillScreen(TFT_BLACK);
+ isMainScreen = false;
+ lv_screen_load(settingsScreen);
+ lv_obj_invalidate(lv_scr_act());
}
#endif
/**
* @brief Map Setting
*
- * @param event
+ * @details Handles the map settings event by loading the map settings screen.
+ *
+ * @param event LVGL event pointer.
*/
static void mapSettings(lv_event_t *event)
{
- lv_screen_load(mapSettingsScreen);
+ lv_screen_load(mapSettingsScreen);
}
/**
* @brief Device Settings
*
- * @param event
+ * @details Handles the device settings event by loading the device settings screen.
+ *
+ * @param event LVGL event pointer.
*/
static void deviceSettings(lv_event_t *event)
{
- lv_screen_load(deviceSettingsScreen);
+ lv_screen_load(deviceSettingsScreen);
}
/**
* @brief Create Settings screen
*
+ * @details Creates the settings screen
*/
void createSettingsScr()
{
- // Settings Screen
- settingsScreen = lv_obj_create(NULL);
- settingsButtons = lv_obj_create(settingsScreen);
- lv_obj_set_size(settingsButtons, TFT_WIDTH, TFT_HEIGHT);
- lv_obj_set_flex_align(settingsButtons, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_set_style_pad_row(settingsButtons, 20, 0);
- lv_obj_set_flex_flow(settingsButtons, LV_FLEX_FLOW_COLUMN);
- static lv_style_t styleSettings;
- lv_style_init(&styleSettings);
- lv_style_set_bg_opa(&styleSettings, LV_OPA_0);
- lv_style_set_border_opa(&styleSettings, LV_OPA_0);
- lv_obj_add_style(settingsButtons, &styleSettings, LV_PART_MAIN);
+ // Settings Screen
+ settingsScreen = lv_obj_create(NULL);
+ settingsButtons = lv_obj_create(settingsScreen);
+ lv_obj_set_size(settingsButtons, TFT_WIDTH, TFT_HEIGHT);
+ lv_obj_set_flex_align(settingsButtons, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_set_style_pad_row(settingsButtons, 20, 0);
+ lv_obj_set_flex_flow(settingsButtons, LV_FLEX_FLOW_COLUMN);
+ static lv_style_t styleSettings;
+ lv_style_init(&styleSettings);
+ lv_style_set_bg_opa(&styleSettings, LV_OPA_0);
+ lv_style_set_border_opa(&styleSettings, LV_OPA_0);
+ lv_obj_add_style(settingsButtons, &styleSettings, LV_PART_MAIN);
- lv_obj_t *btnLabel;
- lv_obj_t *btn;
+ lv_obj_t *btnLabel;
+ lv_obj_t *btn;
- #ifdef ENABLE_COMPASS
- // Compass Calibration
- btn = lv_btn_create(settingsButtons);
- lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
- btnLabel = lv_label_create(btn);
- lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
- lv_label_set_text_static(btnLabel, "Compass Calibration");
- lv_obj_center(btnLabel);
- lv_obj_add_event_cb(btn, compassCalib, LV_EVENT_CLICKED, NULL);
- #endif
+ #ifdef ENABLE_COMPASS
+ // Compass Calibration
+ btn = lv_btn_create(settingsButtons);
+ lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
+ btnLabel = lv_label_create(btn);
+ lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
+ lv_label_set_text_static(btnLabel, "Compass Calibration");
+ lv_obj_center(btnLabel);
+ lv_obj_add_event_cb(btn, compassCalib, LV_EVENT_CLICKED, NULL);
+ #endif
- #ifdef TOUCH_INPUT
- // Touch Calibration
- btn = lv_btn_create(settingsButtons);
- lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
- btnLabel = lv_label_create(btn);
- lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
- lv_label_set_text_static(btnLabel, "Touch Calibration");
- lv_obj_center(btnLabel);
- lv_obj_add_event_cb(btn, touchCalib, LV_EVENT_CLICKED, NULL);
- #endif
+ #ifdef TOUCH_INPUT
+ // Touch Calibration
+ btn = lv_btn_create(settingsButtons);
+ lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
+ btnLabel = lv_label_create(btn);
+ lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
+ lv_label_set_text_static(btnLabel, "Touch Calibration");
+ lv_obj_center(btnLabel);
+ lv_obj_add_event_cb(btn, touchCalib, LV_EVENT_CLICKED, NULL);
+ #endif
- // Map Settings
- btn = lv_btn_create(settingsButtons);
- lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
- btnLabel = lv_label_create(btn);
- lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
- lv_label_set_text_static(btnLabel, "Map Settings");
- lv_obj_center(btnLabel);
- lv_obj_add_event_cb(btn, mapSettings, LV_EVENT_CLICKED, NULL);
+ // Map Settings
+ btn = lv_btn_create(settingsButtons);
+ lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
+ btnLabel = lv_label_create(btn);
+ lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
+ lv_label_set_text_static(btnLabel, "Map Settings");
+ lv_obj_center(btnLabel);
+ lv_obj_add_event_cb(btn, mapSettings, LV_EVENT_CLICKED, NULL);
- // Device Settings
- btn = lv_btn_create(settingsButtons);
- lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
- btnLabel = lv_label_create(btn);
- lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
- lv_label_set_text_static(btnLabel, "Device Settings");
- lv_obj_center(btnLabel);
- lv_obj_add_event_cb(btn, deviceSettings, LV_EVENT_CLICKED, NULL);
+ // Device Settings
+ btn = lv_btn_create(settingsButtons);
+ lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
+ btnLabel = lv_label_create(btn);
+ lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
+ lv_label_set_text_static(btnLabel, "Device Settings");
+ lv_obj_center(btnLabel);
+ lv_obj_add_event_cb(btn, deviceSettings, LV_EVENT_CLICKED, NULL);
- // Back button
- btn = lv_btn_create(settingsButtons);
- lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
- btnLabel = lv_label_create(btn);
- lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
- lv_label_set_text_static(btnLabel, "Back");
- lv_obj_center(btnLabel);
- lv_obj_add_event_cb(btn, back, LV_EVENT_CLICKED, NULL);
+ // Back button
+ btn = lv_btn_create(settingsButtons);
+ lv_obj_set_size(btn, TFT_WIDTH - 30, 40 * scale);
+ btnLabel = lv_label_create(btn);
+ lv_obj_set_style_text_font(btnLabel, fontLarge, 0);
+ lv_label_set_text_static(btnLabel, "Back");
+ lv_obj_center(btnLabel);
+ lv_obj_add_event_cb(btn, back, LV_EVENT_CLICKED, NULL);
}
diff --git a/lib/gui/src/settingsScr.hpp b/lib/gui/src/settingsScr.hpp
index d6ad6400..6f392ed1 100644
--- a/lib/gui/src/settingsScr.hpp
+++ b/lib/gui/src/settingsScr.hpp
@@ -2,8 +2,8 @@
* @file settingsScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Settings Screen
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -21,5 +21,5 @@ static void compassCalib(lv_event_t *event);
static void mapSettings(lv_event_t *event);
static void deviceSettings(lv_event_t *event);
-static lv_obj_t *settingsButtons;
+static lv_obj_t *settingsButtons; /**< Object holding all settings screen buttons */
void createSettingsScr();
diff --git a/lib/gui/src/splashScr.cpp b/lib/gui/src/splashScr.cpp
index 19f8695d..1abe17e6 100644
--- a/lib/gui/src/splashScr.cpp
+++ b/lib/gui/src/splashScr.cpp
@@ -2,101 +2,94 @@
* @file splashScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief Splash screen - NOT LVGL
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "splashScr.hpp"
-static unsigned long millisActual = 0;
+static unsigned long millisActual = 0; /**< Current value of the system timer in milliseconds */
extern Maps mapView;
extern Gps gps;
/**
* @brief Splash screen
*
+ * @details Displays the splash screen with logo, device information, Preloads the map and initializes display settings.
*/
void splashScreen()
{
- // Preload Map
- if (mapSet.vectorMap)
- {
- mapView.isPosMoved = true;
- mapView.generateVectorMap(zoom);
- }
- else
- {
- mapView.currentMapTile = mapView.getMapTile(gps.gpsData.longitude, gps.gpsData.latitude, zoom, 0, 0);
- mapView.generateRenderMap(zoom);
- }
+ // Preload Map
+ mapView.currentMapTile = mapView.getMapTile(gps.gpsData.longitude, gps.gpsData.latitude, zoom, 0, 0);
+ mapView.generateMap(zoom);
- setTime = false;
+ setTime = false;
- tft.fillScreen(TFT_BLACK);
- millisActual = millis();
- tft.setBrightness(0);
+ tft.fillScreen(TFT_BLACK);
+ millisActual = millis();
+ tft.setBrightness(0);
- static uint16_t pngHeight = 0;
- static uint16_t pngWidth = 0;
+ static uint16_t pngHeight = 0;
+ static uint16_t pngWidth = 0;
- getPngSize(logoFile, &pngWidth, &pngHeight);
- tft.drawPngFile(logoFile, (tft.width() / 2) - (pngWidth / 2), (tft.height() / 2) - pngHeight);
+ getPngSize(logoFile, &pngWidth, &pngHeight);
+ tft.drawPngFile(logoFile, (tft.width() / 2) - (pngWidth / 2), (tft.height() / 2) - pngHeight);
- tft.setTextSize(1);
- tft.setTextColor(TFT_WHITE, TFT_BLACK);
+ tft.setTextSize(1);
+ tft.setTextColor(TFT_WHITE, TFT_BLACK);
- tft.drawCenterString("Map data from OpenStreetMap.", tft.width() >> 1, TFT_HEIGHT - 120);
- tft.drawCenterString("(c) OpenStreetMap", tft.width() >> 1, TFT_HEIGHT - 110);
- tft.drawCenterString("(c) OpenStreetMap contributors", tft.width() >> 1, TFT_HEIGHT - 100);
+ tft.drawCenterString("Map data from OpenStreetMap.", tft.width() >> 1, TFT_HEIGHT - 120);
+ tft.drawCenterString("(c) OpenStreetMap", tft.width() >> 1, TFT_HEIGHT - 110);
+ tft.drawCenterString("(c) OpenStreetMap contributors", tft.width() >> 1, TFT_HEIGHT - 100);
- char statusString[50] = "";
- tft.setTextColor(TFT_YELLOW, TFT_BLACK);
+ char statusString[50] = "";
+ tft.setTextColor(TFT_YELLOW, TFT_BLACK);
- memset(&statusString[0], 0, sizeof(statusString));
- sprintf(statusString, statusLine1, ESP.getChipModel(), ESP.getCpuFreqMHz());
- tft.drawString(statusString, 0, TFT_HEIGHT - 50);
+ memset(&statusString[0], 0, sizeof(statusString));
+ sprintf(statusString, statusLine1, ESP.getChipModel(), ESP.getCpuFreqMHz());
+ tft.drawString(statusString, 0, TFT_HEIGHT - 50);
- memset(&statusString[0], 0, sizeof(statusString));
- sprintf(statusString, statusLine2, (ESP.getFreeHeap() / 1024), (ESP.getFreeHeap() * 100) / ESP.getHeapSize());
- tft.drawString(statusString, 0, TFT_HEIGHT - 40);
+ memset(&statusString[0], 0, sizeof(statusString));
+ sprintf(statusString, statusLine2, (ESP.getFreeHeap() / 1024), (ESP.getFreeHeap() * 100) / ESP.getHeapSize());
+ tft.drawString(statusString, 0, TFT_HEIGHT - 40);
- memset(&statusString[0], 0, sizeof(statusString));
- sprintf(statusString, statusLine3, ESP.getPsramSize(), ESP.getPsramSize() - ESP.getFreePsram());
- tft.drawString(statusString, 0, TFT_HEIGHT - 30);
+ memset(&statusString[0], 0, sizeof(statusString));
+ sprintf(statusString, statusLine3, ESP.getPsramSize(), ESP.getPsramSize() - ESP.getFreePsram());
+ tft.drawString(statusString, 0, TFT_HEIGHT - 30);
- memset(&statusString[0], 0, sizeof(statusString));
- sprintf(statusString, statusLine4, String(VERSION), String(REVISION));
- tft.drawString(statusString, 0, TFT_HEIGHT - 20);
+ memset(&statusString[0], 0, sizeof(statusString));
+ sprintf(statusString, statusLine4, String(VERSION), String(REVISION));
+ tft.drawString(statusString, 0, TFT_HEIGHT - 20);
- memset(&statusString[0], 0, sizeof(statusString));
- sprintf(statusString, statusLine5, String(FLAVOR));
- tft.drawString(statusString, 0, TFT_HEIGHT - 10);
+ memset(&statusString[0], 0, sizeof(statusString));
+ sprintf(statusString, statusLine5, String(FLAVOR));
+ tft.drawString(statusString, 0, TFT_HEIGHT - 10);
- memset(&statusString[0], 0, sizeof(statusString));
- tft.setTextColor(TFT_WHITE, TFT_BLACK);
+ memset(&statusString[0], 0, sizeof(statusString));
+ tft.setTextColor(TFT_WHITE, TFT_BLACK);
- const uint8_t maxBrightness = 255;
+ const uint8_t maxBrightness = 255;
- for (uint8_t fadeIn = 0; fadeIn <= (maxBrightness - 1); fadeIn++)
- {
- tft.setBrightness(fadeIn);
- millisActual = millis();
- while (millis() < millisActual + 15);
- }
+ for (uint8_t fadeIn = 0; fadeIn <= (maxBrightness - 1); fadeIn++)
+ {
+ tft.setBrightness(fadeIn);
+ millisActual = millis();
+ while (millis() < millisActual + 15);
+ }
- millisActual = millis();
- while (millis() < millisActual + 100);
+ millisActual = millis();
+ while (millis() < millisActual + 100);
- for (uint8_t fadeOut = maxBrightness; fadeOut > 0; fadeOut--)
- {
- tft.setBrightness(fadeOut);
- millisActual = millis();
- while (millis() < millisActual + 15);
- }
+ for (uint8_t fadeOut = maxBrightness; fadeOut > 0; fadeOut--)
+ {
+ tft.setBrightness(fadeOut);
+ millisActual = millis();
+ while (millis() < millisActual + 15);
+ }
- tft.fillScreen(TFT_BLACK);
+ tft.fillScreen(TFT_BLACK);
- while (millis() < millisActual + 100);
+ while (millis() < millisActual + 100);
- tft.setBrightness(defBright);
+ tft.setBrightness(defBright);
}
diff --git a/lib/gui/src/splashScr.hpp b/lib/gui/src/splashScr.hpp
index 8c8a04fe..178f0b10 100644
--- a/lib/gui/src/splashScr.hpp
+++ b/lib/gui/src/splashScr.hpp
@@ -2,8 +2,8 @@
* @file splashScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief Splash screen - NOT LVGL
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -14,14 +14,15 @@
#include "gps.hpp"
#ifdef LARGE_SCREEN
-static const char* logoFile PROGMEM = "/spiffs/LOGO_LARGE.png";
+ static const char* logoFile PROGMEM = "/spiffs/LOGO_LARGE.png"; /**< Path to the large logo image for large screens */
#else
-static const char* logoFile PROGMEM = "/spiffs/LOGO_SMALL.png";
+ static const char* logoFile PROGMEM = "/spiffs/LOGO_SMALL.png"; /**< Path to the small logo image for smaller screens */
#endif
-static const char* statusLine1 PROGMEM = "Model:%s %dMhz";
-static const char* statusLine2 PROGMEM = "Free mem:%dK %d%%";
-static const char* statusLine3 PROGMEM = "PSRAM: %d - Used PSRAM: %d";
-static const char* statusLine4 PROGMEM = "Firmware v.%s rev.%s";
-static const char* statusLine5 PROGMEM = "ENV: %s";
+
+static const char* statusLine1 PROGMEM = "Model:%s %dMhz"; /**< Format string for model and CPU frequency */
+static const char* statusLine2 PROGMEM = "Free mem:%dK %d%%"; /**< Format string for free memory in KB and percentage */
+static const char* statusLine3 PROGMEM = "PSRAM: %d - Used PSRAM: %d"; /**< Format string for PSRAM total and used */
+static const char* statusLine4 PROGMEM = "Firmware v.%s rev.%s"; /**< Format string for firmware version and revision */
+static const char* statusLine5 PROGMEM = "ENV: %s"; /**< Format string for environment information */
void splashScreen();
diff --git a/lib/gui/src/upgradeScr.cpp b/lib/gui/src/upgradeScr.cpp
index bbd86f1b..e13ee44d 100644
--- a/lib/gui/src/upgradeScr.cpp
+++ b/lib/gui/src/upgradeScr.cpp
@@ -2,8 +2,8 @@
* @file upgradeScr.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL Firmware upgrade messages
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "upgradeScr.hpp"
@@ -16,73 +16,71 @@
/**
* @brief Upgrade Back Message Event
- *
*/
void msgBackEvent(lv_event_t *event)
{
- lv_screen_load(deviceSettingsScreen);
+ lv_screen_load(deviceSettingsScreen);
}
/**
* @brief Upgrade Message Event
- *
*/
void msgUpgrdEvent(lv_event_t *event)
{
- lv_obj_add_flag(btnMsgBack,LV_OBJ_FLAG_HIDDEN);
- lv_obj_add_flag(btnMsgUpgrade, LV_OBJ_FLAG_HIDDEN);
- onUpgrdStart();
- onUpgrdEnd();
+ lv_obj_add_flag(btnMsgBack,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(btnMsgUpgrade, LV_OBJ_FLAG_HIDDEN);
+ onUpgrdStart();
+ onUpgrdEnd();
}
-
/**
* @brief Create Upgrade Message
- *
+ *
+ * @details Creates the firmware upgrade message dialog
*/
void createMsgUpgrade()
{
- msgUpgrade = lv_obj_create(NULL);
- lv_obj_t *msgBox = lv_msgbox_create(msgUpgrade);
- lv_msgbox_add_title(msgBox, "Firmware Upgrade");
- lv_obj_t *content = lv_msgbox_get_content(msgBox);
- lv_obj_set_flex_flow(content, LV_FLEX_FLOW_COLUMN);
- lv_obj_set_flex_align(content, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
- lv_obj_set_height(msgBox,200);
+ msgUpgrade = lv_obj_create(NULL);
+ lv_obj_t *msgBox = lv_msgbox_create(msgUpgrade);
+ lv_msgbox_add_title(msgBox, "Firmware Upgrade");
+ lv_obj_t *content = lv_msgbox_get_content(msgBox);
+ lv_obj_set_flex_flow(content, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(content, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_set_height(msgBox,200);
- lv_obj_t *contText = lv_obj_create(content);
- lv_obj_set_size(contText, lv_pct(100), LV_SIZE_CONTENT);
- lv_obj_set_flex_flow(contText, LV_FLEX_FLOW_COLUMN);
- lv_obj_set_flex_align(contText, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);
- lv_obj_clear_flag(contText,LV_OBJ_FLAG_SCROLLABLE);
- lv_obj_set_style_border_color(contText,lv_color_black(),0);
+ lv_obj_t *contText = lv_obj_create(content);
+ lv_obj_set_size(contText, lv_pct(100), LV_SIZE_CONTENT);
+ lv_obj_set_flex_flow(contText, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(contText, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);
+ lv_obj_clear_flag(contText,LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_style_border_color(contText,lv_color_black(),0);
- msgUprgdText = lv_label_create(contText);
- lv_label_set_text_static(msgUprgdText,"");
- lv_obj_set_style_text_font(msgUprgdText, fontLarge, 0);
+ msgUprgdText = lv_label_create(contText);
+ lv_label_set_text_static(msgUprgdText,"");
+ lv_obj_set_style_text_font(msgUprgdText, fontLarge, 0);
- contMeter = lv_obj_create(content);
- lv_obj_set_size(contMeter, lv_pct(100), LV_SIZE_CONTENT);
- lv_obj_set_flex_flow(contMeter, LV_FLEX_FLOW_COLUMN);
- lv_obj_set_flex_align(contMeter, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);
- lv_obj_clear_flag(contMeter,LV_OBJ_FLAG_SCROLLABLE);
- lv_obj_set_style_border_color(contMeter,lv_color_black(),0);
- lv_obj_add_flag(contMeter,LV_OBJ_FLAG_HIDDEN);
+ contMeter = lv_obj_create(content);
+ lv_obj_set_size(contMeter, lv_pct(100), LV_SIZE_CONTENT);
+ lv_obj_set_flex_flow(contMeter, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(contMeter, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);
+ lv_obj_clear_flag(contMeter,LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_style_border_color(contMeter,lv_color_black(),0);
+ lv_obj_add_flag(contMeter,LV_OBJ_FLAG_HIDDEN);
- static uint32_t objectColor = 0x303030;
- static lv_style_t styleBtn;
- lv_style_init(&styleBtn);
- lv_style_set_bg_color(&styleBtn, lv_color_hex(objectColor));
- lv_style_set_border_color(&styleBtn, lv_color_hex(objectColor));
+ static uint32_t objectColor = 0x303030;
+ static lv_style_t styleBtn;
+ lv_style_init(&styleBtn);
+ lv_style_set_bg_color(&styleBtn, lv_color_hex(objectColor));
+ lv_style_set_border_color(&styleBtn, lv_color_hex(objectColor));
- btnMsgBack = lv_msgbox_add_footer_button(msgBox, "Back");
- lv_obj_add_event_cb(btnMsgBack, msgBackEvent, LV_EVENT_CLICKED, NULL);
- lv_obj_set_style_text_font(btnMsgBack, fontLarge, 0);
- lv_obj_add_style(btnMsgBack, &styleBtn, 0);
+ btnMsgBack = lv_msgbox_add_footer_button(msgBox, "Back");
+ lv_obj_add_event_cb(btnMsgBack, msgBackEvent, LV_EVENT_CLICKED, NULL);
+ lv_obj_set_style_text_font(btnMsgBack, fontLarge, 0);
+ lv_obj_add_style(btnMsgBack, &styleBtn, 0);
- btnMsgUpgrade = lv_msgbox_add_footer_button(msgBox, "UPGRADE");
- lv_obj_add_event_cb(btnMsgUpgrade, msgUpgrdEvent, LV_EVENT_CLICKED, NULL);
- lv_obj_set_style_text_font(btnMsgUpgrade, fontLarge, 0);
- lv_obj_add_style(btnMsgUpgrade, &styleBtn, 0);
- lv_obj_add_flag(btnMsgUpgrade,LV_OBJ_FLAG_HIDDEN);
+ btnMsgUpgrade = lv_msgbox_add_footer_button(msgBox, "UPGRADE");
+ lv_obj_add_event_cb(btnMsgUpgrade, msgUpgrdEvent, LV_EVENT_CLICKED, NULL);
+ lv_obj_set_style_text_font(btnMsgUpgrade, fontLarge, 0);
+ lv_obj_add_style(btnMsgUpgrade, &styleBtn, 0);
+ lv_obj_add_flag(btnMsgUpgrade,LV_OBJ_FLAG_HIDDEN);
}
\ No newline at end of file
diff --git a/lib/gui/src/upgradeScr.hpp b/lib/gui/src/upgradeScr.hpp
index 20631466..1788499e 100644
--- a/lib/gui/src/upgradeScr.hpp
+++ b/lib/gui/src/upgradeScr.hpp
@@ -2,8 +2,8 @@
* @file upgradeScr.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL Firmware upgrade messages
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -12,11 +12,11 @@
#include "firmUpgrade.hpp"
#include "globalGuiDef.h"
-extern lv_obj_t *msgUpgrade;
-extern lv_obj_t *msgUprgdText;
-extern lv_obj_t *btnMsgBack;
-extern lv_obj_t *btnMsgUpgrade;
-extern lv_obj_t *contMeter;
+extern lv_obj_t *msgUpgrade; /**< Upgrade message object */
+extern lv_obj_t *msgUprgdText; /**< Text label inside the upgrade message */
+extern lv_obj_t *btnMsgBack; /**< Back button inside the message dialog */
+extern lv_obj_t *btnMsgUpgrade; /**< Upgrade action button inside the message dialog */
+extern lv_obj_t *contMeter; /**< Meter container object */
void msgBackEvent(lv_event_t *event);
void msgUpgrdEvent(lv_event_t *event);
diff --git a/lib/gui/src/widgets.cpp b/lib/gui/src/widgets.cpp
index 71c60a61..787a7425 100644
--- a/lib/gui/src/widgets.cpp
+++ b/lib/gui/src/widgets.cpp
@@ -2,8 +2,8 @@
* @file widgets.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Widgets
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "widgets.hpp"
@@ -16,240 +16,408 @@ lv_obj_t *altitude;
lv_obj_t *speedLabel;
lv_obj_t *sunriseLabel;
lv_obj_t *sunsetLabel;
+lv_obj_t *navArrow;
+lv_obj_t *zoomLabel;
+lv_obj_t *zoomWidget;
+lv_obj_t *mapSpeedLabel;
+lv_obj_t *mapSpeed;
+lv_obj_t *miniCompass;
+lv_obj_t *mapCompassImg;
+lv_obj_t *scaleWidget;
+lv_obj_t *scaleLabel;
+lv_obj_t *turnByTurn;
+lv_obj_t *turnDistLabel;
+lv_obj_t *turnImg;
+
+LV_IMG_DECLARE(straight);
+LV_IMG_DECLARE(slleft);
+LV_IMG_DECLARE(slright);
+LV_IMG_DECLARE(tleft);
+LV_IMG_DECLARE(tright);
+LV_IMG_DECLARE(uleft);
+LV_IMG_DECLARE(uright);
+LV_IMG_DECLARE(finish);
extern Gps gps;
/**
* @brief Edit Screen Event (drag widgets)
- *
- * @param event
+ *
+ * @param event Pointer to the LVGL event structure
*/
void editWidget(lv_event_t *event)
{
- lv_event_code_t code = lv_event_get_code(event);
-
- if (code == LV_EVENT_LONG_PRESSED)
- canMoveWidget = !canMoveWidget;
+ lv_event_code_t code = lv_event_get_code(event);
+
+ if (code == LV_EVENT_LONG_PRESSED)
+ canMoveWidget = !canMoveWidget;
}
/**
* @brief Unselect widget
*
- * @param event
+ * @param event Pointer to the LVGL event structure
*/
void unselectWidget(lv_event_t *event)
{
- if (canMoveWidget)
- {
- lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(event);
- if (widgetSelected)
+ if (canMoveWidget)
{
- objUnselect(obj);
- char *widget = (char *)lv_event_get_user_data(event);
- saveWidgetPos(widget, newX, newY);
- canMoveWidget = !canMoveWidget;
- lv_obj_add_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
- widgetSelected = false;
+ lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(event);
+ if (widgetSelected)
+ {
+ objUnselect(obj);
+ char *widget = (char *)lv_event_get_user_data(event);
+ saveWidgetPos(widget, newX, newY);
+ canMoveWidget = !canMoveWidget;
+ lv_obj_add_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
+ widgetSelected = false;
+ }
+ isScrolled = true;
}
- isScrolled = true;
- }
}
/**
* @brief Drag widget event
*
- * @param event
+ * @param event Pointer to the LVGL event structure
*/
void dragWidget(lv_event_t *event)
{
- if (canMoveWidget)
- {
- isScrolled = false;
- lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(event);
- if (!widgetSelected)
+ if (canMoveWidget)
{
- objSelect(obj);
- lv_obj_clear_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
- widgetSelected = true;
- }
+ isScrolled = false;
+ lv_obj_t *obj = (lv_obj_t *)lv_event_get_target(event);
+ if (!widgetSelected)
+ {
+ objSelect(obj);
+ lv_obj_clear_flag(tilesScreen, LV_OBJ_FLAG_SCROLLABLE);
+ widgetSelected = true;
+ }
- lv_indev_t *indev = lv_indev_get_act();
- if (indev == NULL)
- return;
-
- lv_point_t vect;
- lv_indev_get_vect(indev, &vect);
-
- lv_coord_t x = lv_obj_get_x(obj) + vect.x;
- lv_coord_t y = lv_obj_get_y(obj) + vect.y;
- lv_coord_t width = lv_obj_get_width(obj);
- lv_coord_t height = lv_obj_get_height(obj);
-
- // Limit drag area
- if (x > 0 && y > 0 && (x + width) < TFT_WIDTH && (y + height) < TFT_HEIGHT - 25)
- {
- lv_obj_set_pos(obj, x, y);
- newX = x;
- newY = y;
+ lv_indev_t *indev = lv_indev_get_act();
+ if (indev == NULL)
+ return;
+
+ lv_point_t vect;
+ lv_indev_get_vect(indev, &vect);
+
+ lv_coord_t x = lv_obj_get_x(obj) + vect.x;
+ lv_coord_t y = lv_obj_get_y(obj) + vect.y;
+ lv_coord_t width = lv_obj_get_width(obj);
+ lv_coord_t height = lv_obj_get_height(obj);
+
+ // Limit drag area
+ if (x > 0 && y > 0 && (x + width) < TFT_WIDTH && (y + height) < TFT_HEIGHT - 25)
+ {
+ lv_obj_set_pos(obj, x, y);
+ newX = x;
+ newY = y;
+ }
}
- }
}
/**
* @brief Position widget
*
- * @param screen
+ * @param screen Pointer to the LVGL screen object where the widget will be created
*/
-void positionWidget(_lv_obj_t *screen)
+void positionWidget(lv_obj_t *screen)
{
- lv_obj_t *obj = lv_obj_create(screen);
- lv_obj_set_height(obj,40);
- lv_obj_set_pos(obj, coordPosX, coordPosY);
- lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
- latitude = lv_label_create(obj);
- lv_obj_set_style_text_font(latitude, fontMedium, 0);
- lv_label_set_text_fmt(latitude, "%s", latFormatString(gps.gpsData.latitude));
- longitude = lv_label_create(obj);
- lv_obj_set_style_text_font(longitude, fontMedium, 0);
- lv_label_set_text_fmt(longitude, "%s", lonFormatString(gps.gpsData.longitude));
- lv_obj_t *img = lv_img_create(obj);
- lv_img_set_src(img, positionIconFile);
- lv_img_set_zoom(img,iconScale);
- lv_obj_update_layout(latitude);
- lv_obj_update_layout(img);
- lv_obj_set_width(obj, lv_obj_get_width(latitude) + 40);
- lv_obj_align(latitude, LV_ALIGN_TOP_LEFT, 15, -12);
- lv_obj_align(longitude, LV_ALIGN_TOP_LEFT, 15, 3);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, -15, -10);
- objUnselect(obj);
- lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
- lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Coords_");
- lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Coords_");
+ lv_obj_t *obj = lv_obj_create(screen);
+ lv_obj_set_height(obj,40);
+ lv_obj_set_pos(obj, coordPosX, coordPosY);
+ lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
+ latitude = lv_label_create(obj);
+ lv_obj_set_style_text_font(latitude, fontMedium, 0);
+ lv_label_set_text_fmt(latitude, "%s", latFormatString(gps.gpsData.latitude));
+ longitude = lv_label_create(obj);
+ lv_obj_set_style_text_font(longitude, fontMedium, 0);
+ lv_label_set_text_fmt(longitude, "%s", lonFormatString(gps.gpsData.longitude));
+ lv_obj_t *img = lv_img_create(obj);
+ lv_img_set_src(img, positionIconFile);
+ lv_img_set_zoom(img,iconScale);
+ lv_obj_update_layout(latitude);
+ lv_obj_update_layout(img);
+ lv_obj_set_width(obj, lv_obj_get_width(latitude) + 40);
+ lv_obj_align(latitude, LV_ALIGN_TOP_LEFT, 15, -12);
+ lv_obj_align(longitude, LV_ALIGN_TOP_LEFT, 15, 3);
+ lv_obj_align(img, LV_ALIGN_TOP_LEFT, -15, -10);
+ objUnselect(obj);
+ lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
+ lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Coords_");
+ lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Coords_");
}
/**
* @brief Compass widget
*
- * @param screen
+ * @param screen Pointer to the LVGL screen object where the widget will be created
*/
-void compassWidget(_lv_obj_t *screen)
+void compassWidget(lv_obj_t *screen)
{
- lv_obj_t *obj = lv_obj_create(screen);
- lv_obj_set_size(obj, 200 * scale, 200 * scale);
- lv_obj_set_pos(obj, compassPosX, compassPosY);
- lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
- lv_obj_t *img = lv_img_create(obj);
- lv_img_set_src(img, arrowIconFile);
- lv_obj_align(img, LV_ALIGN_CENTER, 0, -30);
- lv_img_set_zoom(img,iconScale);
- lv_obj_update_layout(img);
- LV_IMG_DECLARE(bruj);
- compassImg = lv_img_create(obj);
- lv_img_set_src(compassImg, &bruj);
- lv_img_set_zoom(compassImg,iconScale);
- lv_obj_update_layout(compassImg);
- lv_obj_align_to(compassImg, obj, LV_ALIGN_CENTER, 0, 0);
- lv_img_set_pivot(compassImg, 100, 100) ;
- compassHeading = lv_label_create(obj);
- lv_obj_set_height(compassHeading,38);
- lv_obj_align(compassHeading, LV_ALIGN_CENTER, 0, 20);
- lv_obj_set_style_text_font(compassHeading, fontVeryLarge, 0);
- lv_label_set_text_static(compassHeading, "---\xC2\xB0");
- objUnselect(obj);
- lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
- lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Compass_");
- lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Compass_");
+ lv_obj_t *obj = lv_obj_create(screen);
+ lv_obj_set_size(obj, 200 * scale, 200 * scale);
+ lv_obj_set_pos(obj, compassPosX, compassPosY);
+ lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_t *img = lv_img_create(obj);
+ lv_img_set_src(img, arrowIconFile);
+ lv_obj_align(img, LV_ALIGN_CENTER, 0, -30);
+ lv_img_set_zoom(img,iconScale);
+ lv_obj_update_layout(img);
+ LV_IMG_DECLARE(bruj);
+ compassImg = lv_img_create(obj);
+ lv_img_set_src(compassImg, &bruj);
+ lv_img_set_zoom(compassImg,iconScale);
+ lv_obj_update_layout(compassImg);
+ lv_obj_align_to(compassImg, obj, LV_ALIGN_CENTER, 0, 0);
+ lv_img_set_pivot(compassImg, 100, 100) ;
+ compassHeading = lv_label_create(obj);
+ lv_obj_set_height(compassHeading,38);
+ lv_obj_align(compassHeading, LV_ALIGN_CENTER, 0, 20);
+ lv_obj_set_style_text_font(compassHeading, fontVeryLarge, 0);
+ lv_label_set_text_static(compassHeading, "---\xC2\xB0");
+ objUnselect(obj);
+ lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
+ lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Compass_");
+ lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Compass_");
}
/**
- * @brief Compass widget
+ * @brief Altitude widget
*
- * @param screen
+ * @param screen Pointer to the LVGL screen object where the widget will be created
*/
-void altitudeWidget(_lv_obj_t *screen)
+void altitudeWidget(lv_obj_t *screen)
{
- lv_obj_t *obj = lv_obj_create(screen);
- lv_obj_set_height(obj, 40 * scale);
- lv_obj_set_pos(obj, altitudePosX, altitudePosY);
- lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
- altitude = lv_label_create(obj);
- lv_obj_set_style_text_font(altitude, fontLargeMedium, 0);
- lv_label_set_text_static(altitude, "0 m.");
- lv_obj_t *img = lv_img_create(obj);
- lv_img_set_src(img, altitudeIconFile);
- lv_img_set_zoom(img,iconScale);
- lv_obj_update_layout(altitude);
- lv_obj_update_layout(img);
- lv_obj_set_width(obj, 140);
- lv_obj_align(img, LV_ALIGN_LEFT_MID, -15, 0);
- lv_obj_align(altitude, LV_ALIGN_CENTER, 15, 0);
- objUnselect(obj);
- lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
- lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Altitude_");
- lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Altitude_");
+ lv_obj_t *obj = lv_obj_create(screen);
+ lv_obj_set_height(obj, 40 * scale);
+ lv_obj_set_pos(obj, altitudePosX, altitudePosY);
+ lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_SPACE_AROUND, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_t *img = lv_img_create(obj);
+ lv_img_set_src(img, altitudeIconFile);
+ lv_img_set_zoom(img,iconScale);
+ lv_obj_update_layout(img);
+ lv_obj_set_width(obj, 150);
+ altitude = lv_label_create(obj);
+ lv_obj_set_style_text_font(altitude, fontLargeMedium, 0);
+ lv_label_set_text_static(altitude, "0 m.");
+ lv_obj_update_layout(altitude);
+ objUnselect(obj);
+ lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
+ lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Altitude_");
+ lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Altitude_");
}
/**
* @brief Speed widget
*
- * @param screen
+ * @param screen Pointer to the LVGL screen object where the widget will be created
*/
-void speedWidget(_lv_obj_t *screen)
+void speedWidget(lv_obj_t *screen)
{
- lv_obj_t *obj = lv_obj_create(screen);
- lv_obj_set_height(obj, 40 * scale);
- lv_obj_set_pos(obj, speedPosX, speedPosY);
- lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
- speedLabel = lv_label_create(obj);
- lv_obj_set_style_text_font(speedLabel, fontLargeMedium, 0);
- lv_label_set_text_static(speedLabel, "0 Km/h");
- lv_obj_t *img = lv_img_create(obj);
- lv_img_set_src(img, speedIconFile);
- lv_img_set_zoom(img,iconScale);
- lv_obj_update_layout(speedLabel);
- lv_obj_update_layout(img);
- lv_obj_set_width(obj, 160);
- lv_obj_align(img, LV_ALIGN_LEFT_MID, -10, 0);
- lv_obj_align(speedLabel, LV_ALIGN_CENTER, 20, 0);
- objUnselect(obj);
- lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
- lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Speed_");
- lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Speed_");
+ lv_obj_t *obj = lv_obj_create(screen);
+ lv_obj_set_height(obj, 40 * scale);
+ lv_obj_set_pos(obj, speedPosX, speedPosY);
+ lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_SPACE_AROUND, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_t *img = lv_img_create(obj);
+ lv_img_set_src(img, speedIconFile);
+ lv_img_set_zoom(img,iconScale);
+ lv_obj_update_layout(img);
+ lv_obj_set_width(obj, 170);
+ speedLabel = lv_label_create(obj);
+ lv_obj_set_style_text_font(speedLabel, fontLargeMedium, 0);
+ lv_label_set_text_static(speedLabel, "0 Km/h");
+ lv_obj_update_layout(speedLabel);
+ objUnselect(obj);
+ lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
+ lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Speed_");
+ lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Speed_");
}
/**
* @brief Sunrise/Sunset widget
*
- * @param screen
+ * @param screen Pointer to the LVGL screen object where the widget will be created
*/
-void sunWidget(_lv_obj_t *screen)
+void sunWidget(lv_obj_t *screen)
{
- lv_obj_t *obj = lv_obj_create(screen);
- lv_obj_set_size(obj, 70, 60);
- lv_obj_set_pos(obj, sunPosX, sunPosY);
- lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
-
- sunriseLabel = lv_label_create(obj);
- lv_obj_align(sunriseLabel, LV_ALIGN_TOP_RIGHT, 16, -2);
- lv_label_set_text_static(sunriseLabel, "");
- sunsetLabel = lv_label_create(obj);
- lv_obj_align(sunsetLabel,LV_ALIGN_BOTTOM_RIGHT, 16, 10);
- lv_label_set_text_static(sunsetLabel, "");
-
- lv_obj_t *img;
- img = lv_img_create(obj);
- lv_img_set_src(img, sunriseIconFile);
- lv_img_set_zoom(img,iconScale);
- lv_obj_update_layout(img);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, -10, -10);
- img = lv_img_create(obj);
- lv_img_set_src(img, sunsetIconFile);
- lv_img_set_zoom(img,iconScale);
- lv_obj_update_layout(img);
- lv_obj_align(img, LV_ALIGN_BOTTOM_LEFT, -10, 10);
-
- objUnselect(obj);
- lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
- lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Sun_");
- lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Sun_");
+ lv_obj_t *obj = lv_obj_create(screen);
+ lv_obj_set_size(obj, 100, 60 * scale);
+ lv_obj_set_pos(obj, sunPosX, sunPosY);
+ lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW_WRAP);
+ lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_SPACE_AROUND, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_t *img;
+ img = lv_img_create(obj);
+ lv_img_set_src(img, sunriseIconFile);
+ lv_img_set_zoom(img,iconScale);
+ lv_obj_update_layout(img);
+ sunriseLabel = lv_label_create(obj);
+ lv_label_set_text_static(sunriseLabel, "--:--");
+ img = lv_img_create(obj);
+ lv_obj_update_layout(sunriseLabel);
+ lv_img_set_src(img, sunsetIconFile);
+ lv_img_set_zoom(img,iconScale);
+ lv_obj_update_layout(img);
+ sunsetLabel = lv_label_create(obj);
+ lv_label_set_text_static(sunsetLabel, "--:--");
+ lv_obj_update_layout(sunsetLabel);
+ objUnselect(obj);
+ lv_obj_add_event_cb(obj, editWidget, LV_EVENT_LONG_PRESSED, NULL);
+ lv_obj_add_event_cb(obj, dragWidget, LV_EVENT_PRESSING, (char *)"Sun_");
+ lv_obj_add_event_cb(obj, unselectWidget, LV_EVENT_RELEASED, (char *)"Sun_");
+}
+
+/**
+ * @brief Map navigation arrow widget
+ *
+ * @param screen Pointer to the LVGL screen object where the widget will be created
+ */
+void navArrowWidget(lv_obj_t *screen)
+{
+ navArrow = lv_img_create(screen);
+ lv_img_set_src(navArrow, navArrowIconFile);
+ lv_obj_align(navArrow, LV_ALIGN_CENTER, 0, 0);
+ lv_obj_add_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+}
+
+/**
+ * @brief Map zoom widget
+ *
+ * @param screen Pointer to the LVGL screen object where the widget will be created
+ */
+void mapZoomWidget(lv_obj_t *screen)
+{
+ zoomWidget = lv_obj_create(screen);
+ lv_obj_set_size(zoomWidget, 64, 32);
+ lv_obj_clear_flag(zoomWidget, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(zoomWidget, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(zoomWidget, LV_FLEX_ALIGN_SPACE_AROUND, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_set_style_bg_color(zoomWidget, lv_color_black(), 0);
+ lv_obj_set_style_bg_opa(zoomWidget, 128, 0);
+ lv_obj_set_style_border_color(zoomWidget, lv_color_black(), 0);
+ lv_obj_set_style_border_width(zoomWidget, 1, 0);
+ lv_obj_set_style_border_opa(zoomWidget,128,0);
+ lv_obj_t *img = lv_img_create(zoomWidget);
+ lv_img_set_src(img, zoomIconFile);
+ zoomLabel = lv_label_create(zoomWidget);
+ lv_obj_set_style_text_font(zoomLabel, &lv_font_montserrat_20, 0);
+ lv_label_set_text_fmt(zoomLabel, "%2d", zoom);
+ lv_obj_add_flag(zoomWidget,LV_OBJ_FLAG_HIDDEN);
+}
+
+/**
+ * @brief Create and configure the map speed widget.
+ *
+ * @param screen Pointer to the LVGL screen object where the map speed widget will be created.
+ */
+void mapSpeedWidget(lv_obj_t *screen)
+{
+ mapSpeed = lv_obj_create(screen);
+ lv_obj_set_size(mapSpeed, 100, 32);
+ lv_obj_clear_flag(mapSpeed, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(mapSpeed, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(mapSpeed, LV_FLEX_ALIGN_SPACE_AROUND, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_set_style_bg_color(mapSpeed, lv_color_black(), 0);
+ lv_obj_set_style_bg_opa(mapSpeed, 128, 0);
+ lv_obj_set_style_border_color(mapSpeed, lv_color_black(), 0);
+ lv_obj_set_style_border_width(mapSpeed, 1, 0);
+ lv_obj_set_style_border_opa(mapSpeed,128,0);
+ lv_obj_align(mapSpeed, LV_ALIGN_BOTTOM_LEFT, 0, -1);
+ lv_obj_t *img = lv_img_create(mapSpeed);
+ lv_img_set_src(img, mapSpeedIconFile);
+ mapSpeedLabel = lv_label_create(mapSpeed);
+ lv_obj_set_style_text_font(mapSpeedLabel, &lv_font_montserrat_20, 0);
+ lv_label_set_text_fmt(mapSpeedLabel, "%3d", 0);
+ lv_obj_add_flag(mapSpeed,LV_OBJ_FLAG_HIDDEN);
+}
+
+/**
+ * @brief Map compass widget
+ *
+ * @param screen Pointer to the LVGL screen object where the map compass widget will be created.
+ */
+void mapCompassWidget(lv_obj_t *screen)
+{
+ miniCompass = lv_obj_create(screen);
+ lv_obj_set_size(miniCompass, 50, 50);
+ lv_obj_clear_flag(miniCompass, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_style_bg_color(miniCompass, lv_color_black(), 0);
+ lv_obj_set_style_bg_opa(miniCompass, 128, 0);
+ lv_obj_set_style_border_color(miniCompass, lv_color_black(), 0);
+ lv_obj_set_style_border_width(miniCompass, 1, 0);
+ lv_obj_set_style_border_opa(miniCompass,128,0);
+ lv_obj_set_align(miniCompass, LV_ALIGN_TOP_RIGHT);
+ mapCompassImg = lv_img_create(miniCompass);
+ LV_IMG_DECLARE(compassMap);
+ lv_img_set_src(mapCompassImg, &compassMap);
+ lv_obj_set_align(mapCompassImg, LV_ALIGN_CENTER);
+ lv_obj_add_flag(miniCompass,LV_OBJ_FLAG_HIDDEN);
+}
+
+/**
+ * @brief Map scale widget
+ *
+ * @param screen Pointer to the LVGL screen object where the map scale widget will be created.
+ */
+void mapScaleWidget(lv_obj_t *screen)
+{
+ scaleWidget = lv_obj_create(screen);
+ lv_obj_set_size(scaleWidget, 100, 32);
+ lv_obj_clear_flag(scaleWidget, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(scaleWidget, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(scaleWidget, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_set_style_bg_color(scaleWidget, lv_color_black(), 0);
+ lv_obj_set_style_bg_opa(scaleWidget, 128, 0);
+ lv_obj_set_style_border_color(scaleWidget, lv_color_black(), 0);
+ lv_obj_set_style_border_width(scaleWidget, 1, 0);
+ lv_obj_set_style_border_opa(scaleWidget,128,0);
+ lv_obj_align(scaleWidget, LV_ALIGN_BOTTOM_LEFT, 102, -1);
+ lv_obj_add_flag(scaleWidget,LV_OBJ_FLAG_HIDDEN);
+ scaleLabel = lv_label_create(scaleWidget);
+ lv_obj_set_style_text_font(scaleLabel, &lv_font_montserrat_12, 0);
+ lv_label_set_text_fmt(scaleLabel, "%s", map_scale[zoom]);
+ lv_obj_t * scale = lv_scale_create(scaleWidget);
+ lv_scale_set_mode(scale, LV_SCALE_MODE_HORIZONTAL_BOTTOM);
+ lv_scale_set_label_show(scale, false);
+ lv_obj_set_size(scale, 60, 10);
+ lv_scale_set_total_tick_count(scale, 2);
+ lv_scale_set_major_tick_every(scale, 2);
+ lv_scale_set_range(scale, 10, 20);
+}
+
+/**
+ * @brief Turn By Turn Navigation widget
+ *
+ * @param screen Pointer to the LVGL screen object where the navigationwidget will be created.
+ */
+void turnByTurnWidget(lv_obj_t *screen)
+{
+ turnByTurn = lv_obj_create(screen);
+ lv_obj_set_size(turnByTurn,60,100);
+ lv_obj_clear_flag(turnByTurn, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_set_flex_flow(turnByTurn, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(turnByTurn, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+ lv_obj_set_style_bg_opa(turnByTurn, 128, 0);
+ lv_obj_set_style_border_color(turnByTurn, lv_color_black(), 0);
+ lv_obj_set_style_border_width(turnByTurn, 1, 0);
+ lv_obj_set_style_border_opa(turnByTurn,128,0);
+ lv_obj_align(turnByTurn, LV_ALIGN_TOP_RIGHT, 0, 60);
+
+
+ turnImg = lv_img_create(turnByTurn);
+ lv_img_set_src(turnImg, &straight);
+
+ turnDistLabel = lv_label_create(turnByTurn);
+ lv_obj_set_style_text_font(turnDistLabel, &lv_font_montserrat_18, 0);
+ lv_label_set_text_fmt(turnDistLabel, "%4d", 0);
+ lv_obj_t *obj = lv_label_create(turnByTurn);
+ lv_obj_set_style_text_font(obj, &lv_font_montserrat_18, 0);
+ lv_label_set_text_static(obj,"m.");
+
+ lv_obj_add_flag(turnByTurn,LV_OBJ_FLAG_HIDDEN);
}
\ No newline at end of file
diff --git a/lib/gui/src/widgets.hpp b/lib/gui/src/widgets.hpp
index 39ab2d9b..7bac9c71 100644
--- a/lib/gui/src/widgets.hpp
+++ b/lib/gui/src/widgets.hpp
@@ -2,8 +2,8 @@
* @file widgets.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL - Widgets
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -11,40 +11,64 @@
#include "lvglFuncs.hpp"
#include "gpsMath.hpp"
#include "settings.hpp"
+#include "mapVars.h"
/**
* @brief Widget objects
*
+ * @details Declarations for UI widget objects
*/
-extern lv_obj_t *latitude;
-extern lv_obj_t *longitude;
-extern lv_obj_t *compassHeading;
-extern lv_obj_t *compassImg;
-extern lv_obj_t *altitude;
-extern lv_obj_t *speedLabel;
-extern lv_obj_t *sunriseLabel;
-extern lv_obj_t *sunsetLabel;
+extern lv_obj_t *latitude; /**< Latitude label */
+extern lv_obj_t *longitude; /**< Longitude label */
+extern lv_obj_t *compassHeading; /**< Compass heading label */
+extern lv_obj_t *compassImg; /**< Compass image object */
+extern lv_obj_t *altitude; /**< Altitude label */
+extern lv_obj_t *speedLabel; /**< Speed label */
+extern lv_obj_t *sunriseLabel; /**< Sunrise time label */
+extern lv_obj_t *sunsetLabel; /**< Sunset time label */
+extern lv_obj_t *navArrow; /**< Navigation arrow object */
+extern lv_obj_t *zoomLabel; /**< Zoom level label */
+extern lv_obj_t *zoomWidget; /**< Zoom widget object */
+extern lv_obj_t *mapSpeedLabel; /**< Map speed label */
+extern lv_obj_t *mapSpeed; /**< Map speed value object */
+extern lv_obj_t *miniCompass; /**< Mini compass widget */
+extern lv_obj_t *mapCompassImg; /**< Map compass image object */
+extern lv_obj_t *scaleWidget; /**< Scale widget object */
+extern lv_obj_t *scaleLabel; /**< Scale label */
+extern lv_obj_t *turnByTurn; /**< Turn-by-Turn navigation widget*/
+extern lv_obj_t *turnDistLabel; /**< Label object showing turn distance */
+extern lv_obj_t *turnImg; /**< Image object for turn indication */
void editWidget(lv_event_t *event);
void dragWidget(lv_event_t *event);
void unselectWidget(lv_event_t *event);
-static bool widgetSelected = false;
-static bool canMoveWidget = false;
-static lv_coord_t newX = 0;
-static lv_coord_t newY = 0;
-
-extern bool isScrolled; // Flag to indicate when tileview was scrolled
-
-static const char *arrowIconFile PROGMEM = "/arrow.bin"; // Compass Arrow Icon
-static const char *positionIconFile PROGMEM = "/pin.bin"; // Position Icon
-static const char *altitudeIconFile PROGMEM = "/altit.bin"; // Altitude Icon
-static const char *speedIconFile PROGMEM = "/speed.bin"; // Speed Icon
-static const char *sunriseIconFile PROGMEM = "/sunrise.bin"; // Sunrise Icon
-static const char *sunsetIconFile PROGMEM = "/sunset.bin"; // Sunset Icon
-
-void positionWidget(_lv_obj_t *screen);
-void compassWidget(_lv_obj_t *screen);
-void altitudeWidget(_lv_obj_t *screen);
-void speedWidget(_lv_obj_t *screen);
-void sunWidget(_lv_obj_t *screen);
\ No newline at end of file
+static bool widgetSelected = false; /**< Widget selection state */
+static bool canMoveWidget = false; /**< Permission to move widget */
+static lv_coord_t newX = 0; /**< New X coordinate for widget movement */
+static lv_coord_t newY = 0; /**< New Y coordinate for widget movement */
+
+extern bool isScrolled; /**< Flag to indicate when tileview was scrolled */
+
+static const char *arrowIconFile PROGMEM = "/arrow.bin"; /**< Compass arrow icon */
+static const char *positionIconFile PROGMEM = "/pin.bin"; /**< Position icon */
+static const char *altitudeIconFile PROGMEM = "/altit.bin"; /**< Altitude icon */
+static const char *speedIconFile PROGMEM = "/speed.bin"; /**< Speed icon */
+static const char *sunriseIconFile PROGMEM = "/sunrise.bin"; /**< Sunrise icon */
+static const char *sunsetIconFile PROGMEM = "/sunset.bin"; /**< Sunset icon */
+static const char *navArrowIconFile PROGMEM = "/navarrow.bin"; /**< Navigation arrow icon */
+static const char *zoomIconFile PROGMEM = "/zoom.bin"; /**< Zoom map icon */
+static const char *mapSpeedIconFile PROGMEM = "/mapspeed.bin"; /**< Speed map icon */
+
+
+void positionWidget(lv_obj_t *screen);
+void compassWidget(lv_obj_t *screen);
+void altitudeWidget(lv_obj_t *screen);
+void speedWidget(lv_obj_t *screen);
+void sunWidget(lv_obj_t *screen);
+void navArrowWidget(lv_obj_t *screen);
+void mapZoomWidget(lv_obj_t *screen);
+void mapSpeedWidget(lv_obj_t *screen);
+void mapCompassWidget(lv_obj_t *screen);
+void mapScaleWidget(lv_obj_t *screen);
+void turnByTurnWidget(lv_obj_t *screen);
\ No newline at end of file
diff --git a/lib/images/src/collapse.c b/lib/images/src/collapse.c
deleted file mode 100644
index c7d761ab..00000000
--- a/lib/images/src/collapse.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "collapse.h"
-#include
-
-// array size is 4608
-const unsigned char collapse[] PROGMEM = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
\ No newline at end of file
diff --git a/lib/images/src/collapse.h b/lib/images/src/collapse.h
deleted file mode 100644
index 2a523cf9..00000000
--- a/lib/images/src/collapse.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char collapse[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/compass.c b/lib/images/src/compass.c
old mode 100644
new mode 100755
index e79ef43a..1e8cb75e
--- a/lib/images/src/compass.c
+++ b/lib/images/src/compass.c
@@ -1,54 +1,125 @@
- #include
+#include "lvgl.h"
+#include "compass.h"
+#include
-// array size is 526
-const unsigned char mini_compass[] PROGMEM = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,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
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
-};
\ No newline at end of file
+#ifndef LV_ATTRIBUTE_IMAGE_COMPASS
+#define LV_ATTRIBUTE_IMAGE_COMPASS
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_COMPASS uint8_t compass_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 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, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfb, 0xfc, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x8e, 0xff, 0xff, 0x8e, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0xad, 0xfb, 0xf0, 0x45, 0x00, 0x0e, 0xf1, 0xff, 0xff, 0xf1, 0x0e, 0x00, 0x34, 0xe7, 0xfc, 0xaf, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x71, 0xff, 0xff, 0xff, 0xff, 0x71, 0x00, 0xad, 0xff, 0xff, 0xff, 0xff, 0xd3, 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, 0x15, 0xa4, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x04, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x04, 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x9c, 0x13, 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0x11, 0xa2, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xed, 0x77, 0x14, 0x00, 0x00, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x00, 0x00, 0x19, 0x80, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0x9c, 0x14, 0x00, 0x00, 0x00, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0x00, 0x00, 0x00, 0x1a, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xf3, 0xff, 0xff, 0xff, 0xf5, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf7, 0xff, 0xff, 0xff, 0xf4, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xdf, 0xff, 0xff, 0xff, 0xee, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xf1, 0xff, 0xff, 0xff, 0xe3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xff, 0xff, 0xff, 0xf5, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xf4, 0xff, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xf1, 0xff, 0xff, 0xff, 0xf6, 0x8c, 0x8c, 0xf6, 0xff, 0xff, 0xff, 0xf1, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xff, 0xff, 0xfa, 0x99, 0x1b, 0x00, 0x00, 0x16, 0x88, 0xf8, 0xff, 0xff, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xff, 0xff, 0xff, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x42, 0xff, 0xff, 0xff, 0xf1, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xfc, 0xa0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xa0, 0xfc, 0xdf, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xf1, 0xff, 0xff, 0xff, 0x48, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xad, 0xff, 0xff, 0xff, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xaa, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xaa, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0b, 0xf5, 0xff, 0xff, 0xf9, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf7, 0xff, 0xff, 0xf9, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x55, 0xff, 0xff, 0xff, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x92, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xff, 0x98, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xbd, 0xff, 0xff, 0xff, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xff, 0xff, 0xff, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xf6, 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, 0x00, 0x01, 0xf0, 0xff, 0xff, 0xee, 0x00, 0x00, 0x00,
+ 0x56, 0xdb, 0xee, 0xff, 0xff, 0xff, 0xfd, 0xee, 0xe9, 0xa4, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xb5, 0xec, 0xee, 0xfc, 0xff, 0xff, 0xff, 0xee, 0xd0, 0x43,
+ 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3,
+ 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3,
+ 0x53, 0xd9, 0xee, 0xff, 0xff, 0xff, 0xfd, 0xee, 0xe9, 0xa3, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xb3, 0xea, 0xee, 0xfc, 0xff, 0xff, 0xff, 0xee, 0xcf, 0x42,
+ 0x00, 0x00, 0x00, 0xec, 0xff, 0xff, 0xf7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf2, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc9, 0xff, 0xff, 0xff, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xff, 0xff, 0xff, 0xcf, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0xff, 0xff, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0x9c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0xfb, 0xff, 0xff, 0xfb, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf8, 0xff, 0xff, 0xfc, 0x15, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb6, 0xff, 0xff, 0xff, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xff, 0xf2, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xef, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xff, 0xff, 0xff, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xff, 0xff, 0xff, 0xfe, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xfe, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xff, 0xff, 0xff, 0xf7, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xf5, 0xff, 0xff, 0xff, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xe4, 0xff, 0xff, 0xff, 0xe9, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xe8, 0xff, 0xff, 0xff, 0xe4, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x7b, 0x79, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xf6, 0xff, 0xff, 0xff, 0xf7, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x9e, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0xff, 0xff, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x9f, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xef, 0x77, 0x15, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x15, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xac, 0x5a, 0x27, 0x02, 0xeb, 0xff, 0xff, 0xeb, 0x02, 0x27, 0x5b, 0xac, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xfc, 0xff, 0xff, 0xfc, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xab, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 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, 0x02, 0x4e, 0xb9, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xb7, 0x4d, 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, 0x14, 0x5f, 0x9c, 0xcf, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0x9c, 0x5f, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0xff, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xe4, 0xe3, 0x43, 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 compassMap =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(compass_map),
+ compass_map,
+};
diff --git a/lib/images/src/compass.h b/lib/images/src/compass.h
index ca147b9b..ff083f57 100644
--- a/lib/images/src/compass.h
+++ b/lib/images/src/compass.h
@@ -1,4 +1,13 @@
#pragma once
#include
+#include "lvgl.h"
-extern unsigned char mini_compass[] PROGMEM;
\ No newline at end of file
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_COMPASS
+#define LV_ATTRIBUTE_IMAGE_COMPASS
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_COMPASS uint8_t compass_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/expand.c b/lib/images/src/expand.c
deleted file mode 100644
index 58787fe6..00000000
--- a/lib/images/src/expand.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "expand.h"
-#include
-
-// array size is 4608
-const unsigned char expand[] PROGMEM = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
\ No newline at end of file
diff --git a/lib/images/src/expand.h b/lib/images/src/expand.h
deleted file mode 100644
index 4a716c6a..00000000
--- a/lib/images/src/expand.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char expand[] PROGMEM ;
\ No newline at end of file
diff --git a/lib/images/src/finish.c b/lib/images/src/finish.c
new file mode 100755
index 00000000..b4e7ecca
--- /dev/null
+++ b/lib/images/src/finish.c
@@ -0,0 +1,126 @@
+#include "lvgl.h"
+#include "finish.h"
+#include
+
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_FINISH
+#define LV_ATTRIBUTE_IMAGE_FINISH
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_FINISH uint8_t finish_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0x5f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1a, 0x75, 0x95, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x6b, 0xff, 0xff, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1a, 0x33, 0x33, 0x41, 0x2f, 0x1d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x0c, 0x5a, 0x99, 0xd6, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcc, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xd7, 0x00, 0x13, 0x91, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xf6, 0x01, 0x27, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xbd, 0xa4, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xff, 0xff, 0x16, 0x07, 0xfd, 0xff, 0x84, 0x25, 0x00, 0x00, 0x00, 0x61, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0x35, 0x00, 0xe3, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xff, 0xff, 0x54, 0x00, 0xc2, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x27, 0x20, 0x11, 0x11, 0x1b, 0x22, 0x2f, 0x46, 0x5b, 0x7c, 0xac, 0xdd, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xff, 0xff, 0x73, 0x00, 0xa1, 0xff, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xff, 0xff, 0x92, 0x00, 0x7f, 0xff, 0x96, 0x00, 0x00, 0x00, 0x00, 0x09, 0xb2, 0xbe, 0xa2, 0x8b, 0x88, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcc, 0xd0, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xff, 0xff, 0xb1, 0x00, 0x5e, 0xff, 0xc1, 0x4b, 0x90, 0xc1, 0xeb, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0x31, 0x12, 0x00, 0x00, 0x54, 0xff, 0xfb, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xd0, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0x00, 0x00, 0x00, 0x00, 0x33, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xff, 0xff, 0xef, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x11, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xff, 0x0f, 0x01, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x04, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xff, 0xff, 0x2e, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x01, 0x14, 0x22, 0x22, 0x1c, 0x5b, 0xff, 0xff, 0xdf, 0xc7, 0xdd, 0xf3, 0xff, 0x25, 0x00, 0x16, 0x34, 0x69, 0xec, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0x4d, 0x00, 0xb6, 0xff, 0xff, 0xe1, 0x9d, 0x6a, 0x40, 0x21, 0xee, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x08, 0xae, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xff, 0xff, 0x6c, 0x00, 0x94, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x91, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xff, 0xff, 0x8b, 0x00, 0x74, 0xff, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xaa, 0x00, 0x52, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x43, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xff, 0xc9, 0x00, 0x30, 0xff, 0xf9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x54, 0xff, 0xff, 0xfd, 0xee, 0xf3, 0xff, 0xff, 0xff, 0x91, 0x5b, 0x47, 0x38, 0x4b, 0xc5, 0xab, 0x90, 0x6f, 0x67, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xe8, 0x00, 0x0f, 0xff, 0xff, 0x21, 0x00, 0x22, 0x61, 0x94, 0xb1, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf9, 0xff, 0xfe, 0x09, 0x00, 0xed, 0xff, 0xbd, 0xe2, 0xff, 0xff, 0xff, 0xfb, 0x06, 0x00, 0x00, 0x00, 0x00, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x00, 0x00, 0x00, 0x00, 0xe2, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xff, 0xff, 0x27, 0x00, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xff, 0xff, 0x46, 0x00, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x53, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x98, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0x65, 0x00, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0xff, 0xb3, 0x74, 0xa8, 0xc4, 0xd4, 0xb6, 0x34, 0x53, 0x85, 0xc8, 0xfe, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x85, 0x00, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xd3, 0xe7, 0xe4, 0xdb, 0xc5, 0xf4, 0xff, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xff, 0xff, 0xa3, 0x00, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xff, 0xff, 0xc3, 0x00, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x00, 0xba, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xff, 0xff, 0xe2, 0x00, 0x06, 0xfc, 0xfa, 0xc7, 0x9a, 0x74, 0x4d, 0x38, 0x24, 0x0e, 0x00, 0x35, 0xff, 0xff, 0xff, 0xff, 0xff, 0x47, 0x00, 0x00, 0x00, 0x00, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0xff, 0xfc, 0x05, 0x00, 0x37, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x89, 0x76, 0x66, 0x6e, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xff, 0xff, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x9a, 0xbd, 0xd5, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xdc, 0xbd, 0x99, 0x62, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xff, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x11, 0x20, 0x22, 0x13, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xff, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xff, 0xff, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0xff, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xf8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xff, 0xff, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0xff, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 finish =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(finish_map),
+ finish_map,
+};
diff --git a/lib/images/src/finish.h b/lib/images/src/finish.h
new file mode 100644
index 00000000..5d417b13
--- /dev/null
+++ b/lib/images/src/finish.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_FINISH
+#define LV_ATTRIBUTE_IMAGE_FINISH
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_FINISH uint8_t finish_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/move.c b/lib/images/src/move.c
deleted file mode 100644
index 5294f5fb..00000000
--- a/lib/images/src/move.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "move.h"
-#include
-
-// array size is 4608
-const unsigned char move[] PROGMEM = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
\ No newline at end of file
diff --git a/lib/images/src/move.h b/lib/images/src/move.h
deleted file mode 100644
index 7c6c1808..00000000
--- a/lib/images/src/move.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char move[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/navigation.c b/lib/images/src/navigation.c
deleted file mode 100644
index 07459d7f..00000000
--- a/lib/images/src/navigation.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "navigation.h"
-#include
-
-// array size is 526
-const unsigned char navigation[] PROGMEM = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x35,0x03,0x36,0x03,0x36,0x03,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x56,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x76,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x02,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0xef,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x16,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x57,0x03,0xb9,0x03,0xb9,0x03,0x57,0x03,0x36,0x03,0x36,0x03,0x36,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x03,0x36,0x03,0x57,0x03,0x78,0x03,0x78,0x03,0x78,0x03,0x78,0x03,0x57,0x03,0x36,0x03,0x36,0x03,0x36,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x03,0x36,0x03,0x36,0x03,0x57,0x03,0x37,0x03,0x57,0x03,0x57,0x03,0x37,0x03,0x56,0x03,0x56,0x03,0x37,0x03,0x36,0x03,0x36,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x03,0x15,0x03,0x36,0x02,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xb5,0x03,0x36,0x03,0x15,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-
-};
-
diff --git a/lib/images/src/navigation.h b/lib/images/src/navigation.h
deleted file mode 100644
index 4da98b2e..00000000
--- a/lib/images/src/navigation.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char navigation[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/outtrack.c b/lib/images/src/outtrack.c
new file mode 100755
index 00000000..a664e6c4
--- /dev/null
+++ b/lib/images/src/outtrack.c
@@ -0,0 +1,125 @@
+#include "lvgl.h"
+#include "outtrack.h"
+#include
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_OUTTRACK
+#define LV_ATTRIBUTE_IMAGE_OUTTRACK
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_OUTTRACK uint8_t outtrack_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x84, 0xe9, 0x84, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x45, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0x84, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc7, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0x84, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x85, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x45, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xc4, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa5, 0xf1, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa0, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x2e, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x84, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa5, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xc5, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa0, 0xfa, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x00, 0xfc, 0x00, 0x00, 0xa5, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xe9, 0x84, 0xe9, 0xa4, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa0, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xf1, 0xa4, 0xe9, 0xa4, 0xe9, 0xa4, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0xa0, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xe9, 0xa4, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 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, 0xf3, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0xff, 0xff, 0x49, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xff, 0x9d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x4c, 0x00, 0xca, 0xff, 0xff, 0xff, 0xff, 0x9d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x52, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x46, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x51, 0xff, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 outtrack =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(outtrack_map),
+ outtrack_map,
+};
diff --git a/lib/images/src/outtrack.h b/lib/images/src/outtrack.h
new file mode 100644
index 00000000..c1eeeda4
--- /dev/null
+++ b/lib/images/src/outtrack.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_OUTTRACK
+#define LV_ATTRIBUTE_IMAGE_OUTTRACK
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_OUTTRACK uint8_t outtrack_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/slleft.c b/lib/images/src/slleft.c
new file mode 100755
index 00000000..b2e593b6
--- /dev/null
+++ b/lib/images/src/slleft.c
@@ -0,0 +1,126 @@
+#include "lvgl.h"
+#include "slleft.h"
+#include
+
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_SLLEFT
+#define LV_ATTRIBUTE_IMAGE_SLLEFT
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_SLLEFT uint8_t slleft_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x00, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 slleft =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(slleft_map),
+ slleft_map,
+};
diff --git a/lib/images/src/slleft.h b/lib/images/src/slleft.h
new file mode 100644
index 00000000..fda84a9e
--- /dev/null
+++ b/lib/images/src/slleft.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_SLLEFT
+#define LV_ATTRIBUTE_IMAGE_SLLEFT
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_SLLEFT uint8_t slleft_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/slright.c b/lib/images/src/slright.c
new file mode 100755
index 00000000..f33183f8
--- /dev/null
+++ b/lib/images/src/slright.c
@@ -0,0 +1,126 @@
+#include "lvgl.h"
+#include "slright.h"
+#include
+
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_SLRIGHT
+#define LV_ATTRIBUTE_IMAGE_SLRIGHT
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_SLRIGHT uint8_t slright_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x4f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x4f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 slright =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(slright_map),
+ slright_map,
+};
diff --git a/lib/images/src/slright.h b/lib/images/src/slright.h
new file mode 100644
index 00000000..31bc122d
--- /dev/null
+++ b/lib/images/src/slright.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_SLRIGHT
+#define LV_ATTRIBUTE_IMAGE_SLRIGHT
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_SLRIGHT uint8_t slright_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/speed.c b/lib/images/src/speed.c
deleted file mode 100644
index da303479..00000000
--- a/lib/images/src/speed.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "speed.h"
-#include
-
-// array size is 526
-const unsigned char speed_ico[] PROGMEM = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-};
\ No newline at end of file
diff --git a/lib/images/src/speed.h b/lib/images/src/speed.h
deleted file mode 100644
index bb95a2a5..00000000
--- a/lib/images/src/speed.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char speed_ico[] PROGMEM ;
\ No newline at end of file
diff --git a/lib/images/src/straight.c b/lib/images/src/straight.c
new file mode 100755
index 00000000..af2fe423
--- /dev/null
+++ b/lib/images/src/straight.c
@@ -0,0 +1,126 @@
+#include "lvgl.h"
+#include "straight.h"
+#include
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_STRAIGHT
+#define LV_ATTRIBUTE_IMAGE_STRAIGHT
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_STRAIGHT uint8_t straight_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x40, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x08, 0xff, 0xff, 0xff, 0xff, 0x10, 0xe4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0xe3, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xe1, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0xe3, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 straight =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(straight_map),
+ straight_map,
+};
+
diff --git a/lib/images/src/straight.h b/lib/images/src/straight.h
new file mode 100644
index 00000000..bbef77b8
--- /dev/null
+++ b/lib/images/src/straight.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_STRAIGHT
+#define LV_ATTRIBUTE_IMAGE_STRAIGHT
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_STRAIGHT uint8_t straight_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/tleft.c b/lib/images/src/tleft.c
new file mode 100755
index 00000000..39aa7178
--- /dev/null
+++ b/lib/images/src/tleft.c
@@ -0,0 +1,126 @@
+#include "lvgl.h"
+#include "tleft.h"
+#include
+
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_TLEFT
+#define LV_ATTRIBUTE_IMAGE_TLEFT
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_TLEFT uint8_t tleft_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x08, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xff, 0xff, 0xff, 0xff, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0xe2, 0xff, 0xff, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0xe2, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 tleft =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(tleft_map),
+ tleft_map,
+};
\ No newline at end of file
diff --git a/lib/images/src/tleft.h b/lib/images/src/tleft.h
new file mode 100644
index 00000000..b3065089
--- /dev/null
+++ b/lib/images/src/tleft.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_TLEFT
+#define LV_ATTRIBUTE_IMAGE_TLEFT
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_TLEFT uint8_t tleft_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/tright.c b/lib/images/src/tright.c
new file mode 100755
index 00000000..73323fd9
--- /dev/null
+++ b/lib/images/src/tright.c
@@ -0,0 +1,126 @@
+#include "lvgl.h"
+#include "tright.h"
+#include
+
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_TRIGHT
+#define LV_ATTRIBUTE_IMAGE_TRIGHT
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_TRIGHT uint8_t tright_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xff, 0xff, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 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, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 tright =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(tright_map),
+ tright_map,
+};
diff --git a/lib/images/src/tright.h b/lib/images/src/tright.h
new file mode 100644
index 00000000..0d78673f
--- /dev/null
+++ b/lib/images/src/tright.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_TRIGHT
+#define LV_ATTRIBUTE_IMAGE_TRIGHT
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_TRIGHT uint8_t tright_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/uleft.c b/lib/images/src/uleft.c
new file mode 100755
index 00000000..06376fa5
--- /dev/null
+++ b/lib/images/src/uleft.c
@@ -0,0 +1,126 @@
+#include "lvgl.h"
+#include "uleft.h"
+#include
+
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_ULEFT
+#define LV_ATTRIBUTE_IMAGE_ULEFT
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ULEFT uint8_t uleft_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x95, 0x89, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 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, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x13, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xff, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x18, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xaf, 0xaf, 0xaf, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 uleft =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(uleft_map),
+ uleft_map,
+};
diff --git a/lib/images/src/uleft.h b/lib/images/src/uleft.h
new file mode 100644
index 00000000..37b797e5
--- /dev/null
+++ b/lib/images/src/uleft.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_ULEFT
+#define LV_ATTRIBUTE_IMAGE_ULEFT
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ULEFT uint8_t uleft_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/uright.c b/lib/images/src/uright.c
new file mode 100755
index 00000000..f340981f
--- /dev/null
+++ b/lib/images/src/uright.c
@@ -0,0 +1,125 @@
+#include "lvgl.h"
+#include "uright.h"
+#include
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_URIGHT
+#define LV_ATTRIBUTE_IMAGE_URIGHT
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_URIGHT uint8_t uright_map[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x15, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x95, 0x89, 0xba, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xff, 0xff, 0xff, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x36, 0x00, 0x00, 0x00, 0xb3, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x46, 0x00, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x4f, 0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xb7, 0xff, 0xff, 0xff, 0xff, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xaf, 0xaf, 0xaf, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 uright =
+{
+ {
+ LV_IMAGE_HEADER_MAGIC,
+ LV_COLOR_FORMAT_RGB565A8,
+ 0,
+ 48,
+ 48,
+ 96,
+ },
+ sizeof(uright_map),
+ uright_map,
+};
diff --git a/lib/images/src/uright.h b/lib/images/src/uright.h
new file mode 100644
index 00000000..8445e4a9
--- /dev/null
+++ b/lib/images/src/uright.h
@@ -0,0 +1,13 @@
+#pragma once
+#include
+#include "lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMAGE_URIGHT
+#define LV_ATTRIBUTE_IMAGE_URIGHT
+#endif
+
+extern const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_URIGHT uint8_t uright_map[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/zoom.c b/lib/images/src/zoom.c
deleted file mode 100644
index d51b48f2..00000000
--- a/lib/images/src/zoom.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "zoom.h"
-#include
-
-// array size is 526
-const unsigned char zoom_ico[] PROGMEM = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,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,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-};
\ No newline at end of file
diff --git a/lib/images/src/zoom.h b/lib/images/src/zoom.h
deleted file mode 100644
index a1c127fa..00000000
--- a/lib/images/src/zoom.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char zoom_ico[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/zoomin.c b/lib/images/src/zoomin.c
deleted file mode 100644
index f0932852..00000000
--- a/lib/images/src/zoomin.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "zoomin.h"
-#include
-
-// array size is 4608
-const unsigned char zoomin[] PROGMEM = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
\ No newline at end of file
diff --git a/lib/images/src/zoomin.h b/lib/images/src/zoomin.h
deleted file mode 100644
index 24b4408c..00000000
--- a/lib/images/src/zoomin.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char zoomin[] PROGMEM;
\ No newline at end of file
diff --git a/lib/images/src/zoomout.c b/lib/images/src/zoomout.c
deleted file mode 100644
index 1b90d472..00000000
--- a/lib/images/src/zoomout.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "zoomout.h"
-#include
-
-// array size is 4608
-const unsigned char zoomout[] PROGMEM = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
\ No newline at end of file
diff --git a/lib/images/src/zoomout.h b/lib/images/src/zoomout.h
deleted file mode 100644
index ad2426da..00000000
--- a/lib/images/src/zoomout.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-#include
-
-extern const unsigned char zoomout[] PROGMEM;
\ No newline at end of file
diff --git a/lib/imu/imu.cpp b/lib/imu/imu.cpp
index 3cdbc46c..295b7d28 100644
--- a/lib/imu/imu.cpp
+++ b/lib/imu/imu.cpp
@@ -2,29 +2,30 @@
* @file imu.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief IMU definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "imu.hpp"
#ifdef MPU6050
-Adafruit_MPU6050 mpu;
+ Adafruit_MPU6050 mpu;
#endif
#ifdef ENABLE_IMU
static const char* TAG PROGMEM = "IMU";
+
/**
- * @brief Init IMU
+ * @brief Initialize the IMU (Inertial Measurement Unit)
*
*/
void initIMU()
{
- if (!mpu.begin())
- ESP_LOGE(TAG, "Failed to init IMU");
- else
- ESP_LOGI(TAG, "IMU init");
+ if (!mpu.begin())
+ ESP_LOGE(TAG, "Failed to init IMU");
+ else
+ ESP_LOGI(TAG, "IMU init");
}
#endif
\ No newline at end of file
diff --git a/lib/imu/imu.hpp b/lib/imu/imu.hpp
index 8ccf623a..690c0743 100644
--- a/lib/imu/imu.hpp
+++ b/lib/imu/imu.hpp
@@ -2,18 +2,18 @@
* @file imu.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief IMU definition and functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
#ifdef MPU6050
-#include
-extern Adafruit_MPU6050 mpu;
-#define ENABLE_IMU
+ #include
+ extern Adafruit_MPU6050 mpu;
+ #define ENABLE_IMU
#endif
#ifdef ENABLE_IMU
-void initIMU();
+ void initIMU();
#endif
\ No newline at end of file
diff --git a/lib/lvgl/lv_conf.h b/lib/lvgl/lv_conf.h
index 7c32b1b7..ade04f8d 100644
--- a/lib/lvgl/lv_conf.h
+++ b/lib/lvgl/lv_conf.h
@@ -58,7 +58,7 @@
* - LV_STDLIB_RTTHREAD: RT-Thread implementation
* - LV_STDLIB_CUSTOM: Implement the functions externally
*/
-#define LV_USE_STDLIB_SPRINTF LV_STDLIB_CLIB
+#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN
#define LV_STDINT_INCLUDE
#define LV_STDDEF_INCLUDE
@@ -116,6 +116,14 @@
#if LV_USE_OS == LV_OS_CUSTOM
#define LV_OS_CUSTOM_INCLUDE
#endif
+#if LV_USE_OS == LV_OS_FREERTOS
+ /*
+ * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM
+ * than unblocking a task using an intermediary object such as a binary semaphore.
+ * RTOS task notifications can only be used when there is only one task that can be the recipient of the event.
+ */
+ #define LV_USE_FREERTOS_TASK_NOTIFY 1
+#endif
/*========================
* RENDERING CONFIGURATION
@@ -141,11 +149,26 @@
/** The target buffer size for simple layer chunks. */
#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (64 * 1024) /**< [bytes]*/
+/* Limit the max allocated memory for simple and transformed layers.
+ * It should be at least `LV_DRAW_LAYER_SIMPLE_BUF_SIZE` sized but if transformed layers are also used
+ * it should be enough to store the largest widget too (width x height x 4 area).
+ * Set it to 0 to have no limit. */
+#define LV_DRAW_LAYER_MAX_MEMORY 0 /**< No limit by default [bytes]*/
+
/** Stack size of drawing thread.
* NOTE: If FreeType or ThorVG is enabled, it is recommended to set it to 32KB or more.
*/
#define LV_DRAW_THREAD_STACK_SIZE (8 * 1024) /**< [bytes]*/
+/** Thread priority of the drawing task.
+ * Higher values mean higher priority.
+ * Can use values from lv_thread_prio_t enum in lv_os.h: LV_THREAD_PRIO_LOWEST,
+ * LV_THREAD_PRIO_LOW, LV_THREAD_PRIO_MID, LV_THREAD_PRIO_HIGH, LV_THREAD_PRIO_HIGHEST
+ * Make sure the priority value aligns with the OS-specific priority levels.
+ * On systems with limited priority levels (e.g., FreeRTOS), a higher value can improve
+ * rendering performance but might cause other tasks to starve. */
+#define LV_DRAW_THREAD_PRIO LV_THREAD_PRIO_HIGH
+
#define LV_USE_DRAW_SW 1
#if LV_USE_DRAW_SW == 1
/*
@@ -203,6 +226,28 @@
#define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0
#endif
+/*Use TSi's aka (Think Silicon) NemaGFX */
+#define LV_USE_NEMA_GFX 0
+
+#if LV_USE_NEMA_GFX
+ /** Select which NemaGFX HAL to use. Possible options:
+ * - LV_NEMA_HAL_CUSTOM
+ * - LV_NEMA_HAL_STM32 */
+ #define LV_USE_NEMA_HAL LV_NEMA_HAL_CUSTOM
+ #if LV_USE_NEMA_HAL == LV_NEMA_HAL_STM32
+ #define LV_NEMA_STM32_HAL_INCLUDE
+ #endif
+
+ /*Enable Vector Graphics Operations. Available only if NemaVG library is present*/
+ #define LV_USE_NEMA_VG 0
+ #if LV_USE_NEMA_VG
+ /*Define application's resolution used for VG related buffer allocation */
+ #define LV_NEMA_GFX_MAX_RESX 800
+ #define LV_NEMA_GFX_MAX_RESY 600
+ #endif
+#endif
+
+
/** Use NXP's VG-Lite GPU on iMX RTxxx platforms. */
#define LV_USE_DRAW_VGLITE 0
@@ -222,13 +267,22 @@
/** Enable VGLite asserts. */
#define LV_USE_VGLITE_ASSERT 0
+
+ /** Enable VGLite error checks. */
+ #define LV_USE_VGLITE_CHECK_ERROR 0
#endif
/** Use NXP's PXP on iMX RTxxx platforms. */
-#define LV_USE_DRAW_PXP 0
+#define LV_USE_PXP 0
-#if LV_USE_DRAW_PXP
- #if LV_USE_OS
+#if LV_USE_PXP
+ /** Use PXP for drawing.*/
+ #define LV_USE_DRAW_PXP 1
+
+ /** Use PXP to rotate display.*/
+ #define LV_USE_ROTATE_PXP 0
+
+ #if LV_USE_DRAW_PXP && LV_USE_OS
/** Use additional draw thread for PXP processing.*/
#define LV_USE_PXP_DRAW_THREAD 1
#endif
@@ -237,6 +291,24 @@
#define LV_USE_PXP_ASSERT 0
#endif
+
+/** Use NXP's G2D on MPU platforms. */
+#define LV_USE_DRAW_G2D 0
+
+#if LV_USE_DRAW_G2D
+ /** Maximum number of buffers that can be stored for G2D draw unit.
+ * Includes the frame buffers and assets. */
+ #define LV_G2D_HASH_TABLE_SIZE 50
+
+ #if LV_USE_OS
+ /** Use additional draw thread for G2D processing.*/
+ #define LV_USE_G2D_DRAW_THREAD 1
+ #endif
+
+ /** Enable G2D asserts. */
+ #define LV_USE_G2D_ASSERT 0
+#endif
+
/** Use Renesas Dave2D on RA platforms. */
#define LV_USE_DRAW_DAVE2D 0
@@ -269,6 +341,22 @@
#define LV_VG_LITE_STROKE_CACHE_CNT 32
#endif
+
+/** Accelerate blends, fills, etc. with STM32 DMA2D */
+#define LV_USE_DRAW_DMA2D 0
+
+#if LV_USE_DRAW_DMA2D
+ #define LV_DRAW_DMA2D_HAL_INCLUDE "stm32h7xx_hal.h"
+
+ /* if enabled, the user is required to call `lv_draw_dma2d_transfer_complete_interrupt_handler`
+ * upon receiving the DMA2D global interrupt
+ */
+ #define LV_USE_DRAW_DMA2D_INTERRUPT 0
+#endif
+
+/** Draw using cached OpenGLES textures */
+#define LV_USE_DRAW_OPENGLES 0
+
/*=======================
* FEATURE CONFIGURATION
*=======================*/
@@ -365,11 +453,11 @@
* If size is not set to 0, the decoder will fail to decode when the cache is full.
* If size is 0, the cache function is not enabled and the decoded memory will be
* released immediately after use. */
-#define LV_CACHE_DEF_SIZE (32 * 1024)
+#define LV_CACHE_DEF_SIZE 0
/** Default number of image header cache entries. The cache is used to store the headers of images
* The main logic is like `LV_CACHE_DEF_SIZE` but for image headers. */
-#define LV_IMAGE_HEADER_CACHE_DEF_CNT 15
+#define LV_IMAGE_HEADER_CACHE_DEF_CNT 20
/** Number of stops allowed per gradient. Increase this to allow more stops.
* This adds (sizeof(lv_color_t) + 1) bytes per additional stop. */
@@ -513,6 +601,8 @@
#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /**< Hebrew, Arabic, Persian letters and all their forms */
#define LV_FONT_SIMSUN_14_CJK 0 /**< 1000 most common CJK radicals */
#define LV_FONT_SIMSUN_16_CJK 0 /**< 1000 most common CJK radicals */
+#define LV_FONT_SOURCE_HAN_SANS_SC_14_CJK 0 /**< 1338 most common CJK radicals */
+#define LV_FONT_SOURCE_HAN_SANS_SC_16_CJK 0 /**< 1338 most common CJK radicals */
/** Pixel perfect monospaced fonts */
#define LV_FONT_UNSCII_8 0
@@ -586,6 +676,9 @@
* In these languages characters should be replaced with another form based on their position in the text */
#define LV_USE_ARABIC_PERSIAN_CHARS 0
+/*The control character to use for signaling text recoloring*/
+#define LV_TXT_COLOR_CMD "#"
+
/*==================
* WIDGETS
*================*/
@@ -689,6 +782,8 @@
#define LV_USE_WIN 1
+#define LV_USE_3DTEXTURE 0
+
/*==================
* THEMES
*==================*/
@@ -732,7 +827,7 @@
/* File system interfaces for common APIs */
/** Setting a default driver letter allows skipping the driver prefix in filepaths. */
-#define LV_FS_DEFAULT_DRIVE_LETTER 'F'
+#define LV_FS_DEFAULT_DRIVER_LETTER 'F'
/** API for fopen, fread, etc. */
#define LV_USE_FS_STDIO 0
@@ -813,7 +908,6 @@
#define LV_GIF_CACHE_DECODE_DATA 0
#endif
-
/** Decode bin images to RAM */
#define LV_BIN_DECODER_RAM_LOAD 1
@@ -870,6 +964,10 @@
#if LV_USE_FFMPEG
/** Dump input information to stderr */
#define LV_FFMPEG_DUMP_FORMAT 0
+ /** Use lvgl file path in FFmpeg Player widget
+ * You won't be able to open URLs after enabling this feature.
+ * Note that FFmpeg image decoder will always use lvgl file system. */
+ #define LV_FFMPEG_PLAYER_USE_LV_FS 0
#endif
/*==================
@@ -929,6 +1027,39 @@
/** Profiler end point function with custom tag */
#define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG
+
+ /*Enable layout profiler*/
+ #define LV_PROFILER_LAYOUT 1
+
+ /*Enable disp refr profiler*/
+ #define LV_PROFILER_REFR 1
+
+ /*Enable draw profiler*/
+ #define LV_PROFILER_DRAW 1
+
+ /*Enable indev profiler*/
+ #define LV_PROFILER_INDEV 1
+
+ /*Enable decoder profiler*/
+ #define LV_PROFILER_DECODER 1
+
+ /*Enable font profiler*/
+ #define LV_PROFILER_FONT 1
+
+ /*Enable fs profiler*/
+ #define LV_PROFILER_FS 1
+
+ /*Enable style profiler*/
+ #define LV_PROFILER_STYLE 0
+
+ /*Enable timer profiler*/
+ #define LV_PROFILER_TIMER 1
+
+ /*Enable cache profiler*/
+ #define LV_PROFILER_CACHE 1
+
+ /*Enable event profiler*/
+ #define LV_PROFILER_EVENT 1
#endif
/** 1: Enable Monkey test */
@@ -985,6 +1116,20 @@
#endif
+/** Enable emulated input devices, time emulation, and screenshot compares. */
+#define LV_USE_TEST 0
+#if LV_USE_TEST
+
+/** Enable `lv_test_screenshot_compare`.
+ * Requires libpng and a few MB of extra RAM. */
+#define LV_USE_TEST_SCREENSHOT_COMPARE 0
+#endif /*LV_USE_TEST*/
+
+/** Enable loading XML UIs runtime */
+#define LV_USE_XML 0
+
+/*1: Enable color filter style*/
+#define LV_USE_COLOR_FILTER 0
/*==================
* DEVICES
*==================*/
@@ -1015,8 +1160,12 @@
/** Use Wayland to open a window and handle input on Linux or BSD desktops */
#define LV_USE_WAYLAND 0
#if LV_USE_WAYLAND
- #define LV_WAYLAND_WINDOW_DECORATIONS 0 /**< Draw client side window decorations only necessary on Mutter/GNOME */
- #define LV_WAYLAND_WL_SHELL 0 /**< Use the legacy wl_shell protocol instead of the default XDG shell */
+ #define LV_WAYLAND_BUF_COUNT 1 /**< Use 1 for single buffer with partial render mode or 2 for double buffer with full render mode*/
+ #define LV_WAYLAND_USE_DMABUF 0 /**< Use DMA buffers for frame buffers. Requires LV_DRAW_USE_G2D */
+ #define LV_WAYLAND_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL /**< DMABUF supports LV_DISPLAY_RENDER_MODE_FULL and LV_DISPLAY_RENDER_MODE_DIRECT*/
+ /**< When LV_WAYLAND_USE_DMABUF is disabled, only LV_DISPLAY_RENDER_MODE_PARTIAL is supported*/
+ #define LV_WAYLAND_WINDOW_DECORATIONS 0 /**< Draw client side window decorations only necessary on Mutter/GNOME. Not supported using DMABUF*/
+ #define LV_WAYLAND_WL_SHELL 0 /**< Use the legacy wl_shell protocol instead of the default XDG shell*/
#endif
/** Driver for /dev/fb */
@@ -1026,12 +1175,18 @@
#define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL
#define LV_LINUX_FBDEV_BUFFER_COUNT 0
#define LV_LINUX_FBDEV_BUFFER_SIZE 60
+ #define LV_LINUX_FBDEV_MMAP 1
#endif
/** Use Nuttx to open window and handle touchscreen */
#define LV_USE_NUTTX 0
#if LV_USE_NUTTX
+ #define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP 0
+
+ /** Use independent image heap for default draw buffer */
+ #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP 0
+
#define LV_USE_NUTTX_LIBUV 0
/** Use Nuttx custom init API to open window and handle touchscreen */
@@ -1046,11 +1201,23 @@
/** Driver for /dev/input */
#define LV_USE_NUTTX_TOUCHSCREEN 0
+
+ /*Touchscreen cursor size in pixels(<=0: disable cursor)*/
+ #define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE 0
#endif
/** Driver for /dev/dri/card */
#define LV_USE_LINUX_DRM 0
+#if LV_USE_LINUX_DRM
+
+ /* Use the MESA GBM library to allocate DMA buffers that can be
+ * shared across sub-systems and libraries using the Linux DMA-BUF API.
+ * The GBM library aims to provide a platform independent memory management system
+ * it supports the major GPU vendors - This option requires linking with libgbm */
+ #define LV_LINUX_DRM_GBM_BUFFERS 0
+#endif
+
/** Interface for TFT_eSPI */
#define LV_USE_TFT_ESPI 0
@@ -1076,15 +1243,35 @@
#define LV_USE_ST7789 0
#define LV_USE_ST7796 0
#define LV_USE_ILI9341 0
+#define LV_USE_FT81X 0
+
+#if (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341)
+ #define LV_USE_GENERIC_MIPI 1
+#else
+ #define LV_USE_GENERIC_MIPI 0
+#endif
-#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341)
/** Driver for Renesas GLCD */
#define LV_USE_RENESAS_GLCDC 0
+/** Driver for ST LTDC */
+#define LV_USE_ST_LTDC 0
+#if LV_USE_ST_LTDC
+ /* Only used for partial. */
+ #define LV_ST_LTDC_USE_DMA2D_FLUSH 0
+#endif
+
/** LVGL Windows backend */
#define LV_USE_WINDOWS 0
+/** LVGL UEFI backend */
+#define LV_USE_UEFI 0
+#if LV_USE_UEFI
+ #define LV_USE_UEFI_INCLUDE "myefi.h" /**< Header that hides the actual framework (EDK2, gnu-efi, ...) */
+ #define LV_UEFI_USE_MEMORY_SERVICES 0 /**< Use the memory functions from the boot services table */
+#endif
+
/** Use OpenGL to open window on PC and handle mouse and keyboard */
#define LV_USE_OPENGLES 0
#if LV_USE_OPENGLES
@@ -1104,50 +1291,76 @@
/** Enable examples to be built with the library. */
#define LV_BUILD_EXAMPLES 0
+/** Build the demos */
+#define LV_BUILD_DEMOS 0
+
/*===================
* DEMO USAGE
====================*/
-/** Show some widgets. This might be required to increase `LV_MEM_SIZE`. */
-#define LV_USE_DEMO_WIDGETS 0
-
-/** Demonstrate usage of encoder and keyboard. */
-#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
-
-/** Benchmark your system */
-#define LV_USE_DEMO_BENCHMARK 0
-
-/** Render test for each primitive.
- * - Requires at least 480x272 display. */
-#define LV_USE_DEMO_RENDER 0
-
-/** Stress test for LVGL */
-#define LV_USE_DEMO_STRESS 0
-
-/** Music player demo */
-#define LV_USE_DEMO_MUSIC 0
-#if LV_USE_DEMO_MUSIC
- #define LV_DEMO_MUSIC_SQUARE 0
- #define LV_DEMO_MUSIC_LANDSCAPE 0
- #define LV_DEMO_MUSIC_ROUND 0
- #define LV_DEMO_MUSIC_LARGE 0
- #define LV_DEMO_MUSIC_AUTO_PLAY 0
-#endif
-
-/** Flex layout demo */
-#define LV_USE_DEMO_FLEX_LAYOUT 0
-
-/** Smart-phone like multi-language demo */
-#define LV_USE_DEMO_MULTILANG 0
-
-/** Widget transformation demo */
-#define LV_USE_DEMO_TRANSFORM 0
-
-/** Demonstrate scroll settings */
-#define LV_USE_DEMO_SCROLL 0
+#if LV_BUILD_DEMOS
+ /** Show some widgets. This might be required to increase `LV_MEM_SIZE`. */
+ #define LV_USE_DEMO_WIDGETS 0
+
+ /** Demonstrate usage of encoder and keyboard. */
+ #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
+
+ /** Benchmark your system */
+ #define LV_USE_DEMO_BENCHMARK 0
+
+ #if LV_USE_DEMO_BENCHMARK
+ /** Use fonts where bitmaps are aligned 16 byte and has Nx16 byte stride */
+ #define LV_DEMO_BENCHMARK_ALIGNED_FONTS 0
+ #endif
-/** Vector graphic demo */
-#define LV_USE_DEMO_VECTOR_GRAPHIC 0
+ /** Render test for each primitive.
+ * - Requires at least 480x272 display. */
+ #define LV_USE_DEMO_RENDER 0
+
+ /** Stress test for LVGL */
+ #define LV_USE_DEMO_STRESS 0
+
+ /** Music player demo */
+ #define LV_USE_DEMO_MUSIC 0
+ #if LV_USE_DEMO_MUSIC
+ #define LV_DEMO_MUSIC_SQUARE 0
+ #define LV_DEMO_MUSIC_LANDSCAPE 0
+ #define LV_DEMO_MUSIC_ROUND 0
+ #define LV_DEMO_MUSIC_LARGE 0
+ #define LV_DEMO_MUSIC_AUTO_PLAY 0
+ #endif
+
+ /** Vector graphic demo */
+ #define LV_USE_DEMO_VECTOR_GRAPHIC 0
+
+ /*---------------------------
+ * Demos from lvgl/lv_demos
+ ---------------------------*/
+
+ /** Flex layout demo */
+ #define LV_USE_DEMO_FLEX_LAYOUT 0
+
+ /** Smart-phone like multi-language demo */
+ #define LV_USE_DEMO_MULTILANG 0
+
+ /** Widget transformation demo */
+ #define LV_USE_DEMO_TRANSFORM 0
+
+ /** Demonstrate scroll settings */
+ #define LV_USE_DEMO_SCROLL 0
+
+ /*E-bike demo with Lottie animations (if LV_USE_LOTTIE is enabled)*/
+ #define LV_USE_DEMO_EBIKE 0
+ #if LV_USE_DEMO_EBIKE
+ #define LV_DEMO_EBIKE_PORTRAIT 0 /*0: for 480x270..480x320, 1: for 480x800..720x1280*/
+ #endif
+
+ /** High-resolution demo */
+ #define LV_USE_DEMO_HIGH_RES 0
+
+ /* Smart watch demo */
+ #define LV_USE_DEMO_SMARTWATCH 0
+#endif /* LV_BUILD_DEMOS */
/*--END OF LV_CONF_H--*/
diff --git a/lib/lvgl/src/lvglFuncs.cpp b/lib/lvgl/src/lvglFuncs.cpp
index 412cf460..4a48c724 100644
--- a/lib/lvgl/src/lvglFuncs.cpp
+++ b/lib/lvgl/src/lvglFuncs.cpp
@@ -2,91 +2,127 @@
* @file lvglFuncs.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL custom functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "lvglFuncs.hpp"
+lv_obj_t *msgDialog; /**< Message dialog object. */
+
/**
- * @brief Custom LVGL function to hide cursor
+ * @brief Custom LVGL function to hide the object's cursor.
*
- * @param LVGL object
+ * @param obj Pointer to the LVGL object whose cursor will be hidden.
*/
void objHideCursor(_lv_obj_t *obj)
{
- static lv_style_t style1;
- lv_style_init(&style1);
- lv_style_set_bg_opa(&style1, LV_OPA_TRANSP);
- lv_style_set_text_opa(&style1, LV_OPA_TRANSP);
- lv_obj_add_style(obj, &style1, LV_PART_CURSOR);
+ static lv_style_t style1;
+ lv_style_init(&style1);
+ lv_style_set_bg_opa(&style1, LV_OPA_TRANSP);
+ lv_style_set_text_opa(&style1, LV_OPA_TRANSP);
+ lv_obj_add_style(obj, &style1, LV_PART_CURSOR);
- static lv_style_t style2;
- lv_style_init(&style2);
- lv_style_set_bg_opa(&style2, LV_OPA_100);
- lv_style_set_text_opa(&style2, LV_OPA_100);
- lv_obj_add_style(obj, &style2, LV_PART_CURSOR | LV_STATE_FOCUS_KEY);
- lv_obj_add_style(obj, &style2, LV_PART_CURSOR | LV_STATE_FOCUSED);
+ static lv_style_t style2;
+ lv_style_init(&style2);
+ lv_style_set_bg_opa(&style2, LV_OPA_100);
+ lv_style_set_text_opa(&style2, LV_OPA_100);
+ lv_obj_add_style(obj, &style2, LV_PART_CURSOR | LV_STATE_FOCUS_KEY);
+ lv_obj_add_style(obj, &style2, LV_PART_CURSOR | LV_STATE_FOCUSED);
}
/**
- * @brief Custom LVGL function to select widget
+ * @brief Custom LVGL function to select a widget.
+ *
+ * @details Applies a highlight style to the specified LVGL object to indicate that it is selected.
*
- * @param obj
+ * @param obj Pointer to the LVGL object to be selected.
*/
void objSelect(_lv_obj_t *obj)
{
- static lv_style_t styleWidget;
- lv_style_init(&styleWidget);
- lv_style_set_bg_color(&styleWidget, lv_color_hex(0xB8B8B8));
- lv_style_set_bg_opa(&styleWidget, LV_OPA_20);
- lv_style_set_border_opa(&styleWidget, LV_OPA_100);
- lv_obj_add_style(obj, &styleWidget, LV_PART_MAIN);
+ static lv_style_t styleWidget;
+ lv_style_init(&styleWidget);
+ lv_style_set_bg_color(&styleWidget, lv_color_hex(0xB8B8B8));
+ lv_style_set_bg_opa(&styleWidget, LV_OPA_20);
+ lv_style_set_border_opa(&styleWidget, LV_OPA_100);
+ lv_obj_add_style(obj, &styleWidget, LV_PART_MAIN);
}
/**
- * @brief Custom LVGL function to unselect widget
- *
- * @param obj
+ * @brief Custom LVGL function to unselect a widget.
+ *
+ * @details Removes the selection highlight by applying a transparent style to the specified LVGL object.
+ *
+ * @param obj Pointer to the LVGL object to be unselected.
*/
void objUnselect(_lv_obj_t *obj)
{
- static lv_style_t styleWidget;
- lv_style_init(&styleWidget);
- lv_style_set_bg_color(&styleWidget, lv_color_black());
- lv_style_set_bg_opa(&styleWidget, LV_OPA_0);
- lv_style_set_border_opa(&styleWidget, LV_OPA_0);
- lv_obj_add_style(obj, &styleWidget, LV_PART_MAIN);
+ static lv_style_t styleWidget;
+ lv_style_init(&styleWidget);
+ lv_style_set_bg_color(&styleWidget, lv_color_black());
+ lv_style_set_bg_opa(&styleWidget, LV_OPA_0);
+ lv_style_set_border_opa(&styleWidget, LV_OPA_0);
+ lv_obj_add_style(obj, &styleWidget, LV_PART_MAIN);
}
/**
- * @brief Restart timer callback
- *
- * @param timer
+ * @brief Restart timer callback.
+ *
+ * @param timer Pointer to the LVGL timer object that triggered the callback.
*/
void restartTimerCb(lv_timer_t *timer)
{
- if (lv_timer_get_idle() != 0)
- ESP.restart();
+ if (lv_timer_get_idle() != 0)
+ ESP.restart();
}
/**
- * @brief Show restart Screen
- *
+ * @brief Show restart screen.
+ *
*/
void showRestartScr()
{
- lv_obj_t *restartScr = lv_obj_create(NULL);
- lv_obj_set_size(restartScr, TFT_WIDTH, TFT_HEIGHT);
- lv_obj_t *restartMsg = lv_msgbox_create(restartScr);
- lv_obj_set_width(restartMsg,TFT_WIDTH - 20);
- lv_obj_set_align(restartMsg,LV_ALIGN_CENTER);
- lv_obj_set_style_text_font(restartMsg, fontDefault, 0);
- lv_obj_t *labelText = lv_msgbox_get_content(restartMsg);
- lv_obj_set_style_text_align(labelText, LV_TEXT_ALIGN_CENTER, 0);
- lv_msgbox_add_text(restartMsg, LV_SYMBOL_WARNING " This device will restart shortly");
- lv_screen_load(restartScr);
- lv_timer_t *restartTimer;
- restartTimer = lv_timer_create(restartTimerCb, 3000, NULL);
- lv_timer_reset(restartTimer);
+ lv_obj_t *restartScr = lv_obj_create(NULL);
+ lv_obj_set_size(restartScr, TFT_WIDTH, TFT_HEIGHT);
+ lv_obj_t *restartMsg = lv_msgbox_create(restartScr);
+ lv_obj_set_width(restartMsg,TFT_WIDTH - 20);
+ lv_obj_set_align(restartMsg,LV_ALIGN_CENTER);
+ lv_obj_set_style_text_font(restartMsg, fontDefault, 0);
+ lv_obj_t *labelText = lv_msgbox_get_content(restartMsg);
+ lv_obj_set_style_text_align(labelText, LV_TEXT_ALIGN_CENTER, 0);
+ lv_msgbox_add_text(restartMsg, LV_SYMBOL_WARNING " This device will restart shortly");
+ lv_screen_load(restartScr);
+ lv_timer_t *restartTimer;
+ restartTimer = lv_timer_create(restartTimerCb, 3000, NULL);
+ lv_timer_reset(restartTimer);
}
+
+/**
+ * @brief Show message dialog
+ *
+ * @param symbol LVGL symbol font
+ * @param message Message
+ */
+void showMsg(const char* symbol, const char* message)
+{
+ msgDialog = lv_msgbox_create(lv_scr_act());
+ lv_obj_set_width(msgDialog,TFT_WIDTH);
+ lv_obj_set_align(msgDialog,LV_ALIGN_CENTER);
+ lv_obj_set_style_text_font(msgDialog, fontDefault, 0);
+ lv_obj_t *labelText = lv_msgbox_get_content(msgDialog);
+ lv_obj_set_style_text_align(labelText, LV_TEXT_ALIGN_CENTER, 0);
+ char msg[100];
+ snprintf(msg, sizeof(msg), "%s %s", symbol, message);
+ lv_msgbox_add_text(msgDialog, msg);
+ lv_obj_invalidate(msgDialog);
+ lv_refr_now(display);
+}
+
+/**
+ * @brief Close message dialog.
+ *
+ */
+void closeMsg()
+{
+ lv_obj_del(msgDialog);
+}
\ No newline at end of file
diff --git a/lib/lvgl/src/lvglFuncs.hpp b/lib/lvgl/src/lvglFuncs.hpp
index d14b206b..01981d5b 100644
--- a/lib/lvgl/src/lvglFuncs.hpp
+++ b/lib/lvgl/src/lvglFuncs.hpp
@@ -2,8 +2,8 @@
* @file lvglFuncs.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL custom functions
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -16,3 +16,5 @@ void objSelect(_lv_obj_t *obj);
void objUnselect(_lv_obj_t *obj);
void restartTimerCb(lv_timer_t *timer);
void showRestartScr();
+void showMsg(const char* symbol, const char* message);
+void closeMsg();
diff --git a/lib/lvgl/src/lvglSetup.cpp b/lib/lvgl/src/lvglSetup.cpp
index 12043f24..4b5e4f69 100644
--- a/lib/lvgl/src/lvglSetup.cpp
+++ b/lib/lvgl/src/lvglSetup.cpp
@@ -2,247 +2,252 @@
* @file lvglSetup.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL Screen implementation
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "lvglSetup.hpp"
-lv_display_t *display;
+lv_display_t *display; /**< LVGL display driver */
-lv_obj_t *searchSatScreen; // Search Satellite Screen
-lv_style_t styleThemeBkg; // New Main Background Style
-lv_style_t styleObjectBkg; // New Objects Background Color
-lv_style_t styleObjectSel; // New Objects Selected Color
+lv_obj_t *searchSatScreen; /**< Search Satellite Screen object. */
+lv_style_t styleThemeBkg; /**< Main background style object. */
+lv_style_t styleObjectBkg; /**< Object background style. */
+lv_style_t styleObjectSel; /**< Object selected style. */
-lv_group_t *scrGroup; // Screen group
-lv_group_t *keyGroup; // GPIO group
-lv_obj_t *powerMsg; // Power Message
+lv_group_t *scrGroup; /**< LVGL group for screen. */
+lv_group_t *keyGroup; /**< LVGL group for GPIO keys. */
Power power;
-uint32_t DOUBLE_TOUCH_EVENT;
+uint32_t DOUBLE_TOUCH_EVENT; /**< Event identifier for double touch gesture. */
+
+Maps mapView;
+
+// Initialize memory pools after object creation
+void initializeMapsPools()
+{
+ // Memory monitoring is now handled internally
+}
/**
- * @brief LVGL display update
+ * @brief LVGL display flush callback.
*
+ * @details Updates the specified area of the display with the provided pixel map.
+ * Flush callback for an LVGL display driver, and utilizes DMA for fast image transfer.
+ *
+ * @param disp Pointer to the LVGL display driver.
+ * @param area Area of the display to update.
+ * @param px_map Pointer to the pixel data to be displayed.
*/
void IRAM_ATTR displayFlush(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map)
{
- uint32_t w = (area->x2 - area->x1 + 1);
- uint32_t h = (area->y2 - area->y1 + 1);
+ const uint32_t w = area->x2 - area->x1 + 1;
+ const uint32_t h = area->y2 - area->y1 + 1;
- tft.setSwapBytes(true);
- tft.setAddrWindow(area->x1, area->y1, w, h);
- tft.pushImageDMA(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1, (uint16_t*)px_map);
- tft.setSwapBytes(false);
+ tft.setSwapBytes(true);
+ tft.setAddrWindow(area->x1, area->y1, w, h);
+ tft.pushImageDMA(area->x1, area->y1, w, h, reinterpret_cast(px_map));
+ tft.setSwapBytes(false);
- lv_display_flush_ready(disp);
+ lv_display_flush_ready(disp);
}
/**
- * @brief LVGL touch read
+ * @brief Reads and processes LVGL touch input, handling gestures and events.
*
+ * @param indev_driver Pointer to the LVGL input device driver.
+ * @param data Pointer to the structure that will be populated with touch data.
*/
void IRAM_ATTR touchRead(lv_indev_t *indev_driver, lv_indev_data_t *data)
{
- lgfx::touch_point_t touchRaw[TOUCH_MAX_POINTS];
- static lgfx::touch_point_t touchPrev[TOUCH_MAX_POINTS];
- static bool prevValid = false;
- static bool pinchActive = false;
- static int lastZoomDir = ZOOM_NONE;
- static unsigned long lastTime = 0;
-
- int count = tft.getTouch(touchRaw, TOUCH_MAX_POINTS);
-
- unsigned long now = millis();
- float dt_ms = (now > lastTime) ? (float)(now - lastTime) : 1.0f;
-
- if (count == 0)
- {
- data->state = LV_INDEV_STATE_RELEASED;
-
- if (pinchActive && lastZoomDir != 0)
- {
- if (lastZoomDir == ZOOM_IN)
- lv_obj_send_event(btnZoomIn,LV_EVENT_CLICKED,NULL);
- else if (lastZoomDir == ZOOM_OUT)
- lv_obj_send_event(btnZoomOut,LV_EVENT_CLICKED,NULL);
- }
- pinchActive = false;
- prevValid = false;
- lastZoomDir = ZOOM_NONE;
- lastTime = now;
-
- if (countTouchReleases)
- {
- countTouchReleases = false;
- uint32_t touchReleaseTime = millis();
- if (!firstTouchReleaseTime)
- firstTouchReleaseTime = touchReleaseTime;
- numberTouchReleases++;
- }
-
- if (millis() - firstTouchReleaseTime > TOUCH_DOUBLE_TOUCH_INTERVAL)
- {
- if (numberTouchReleases == 2)
- {
- if (activeTile == MAP)
- lv_obj_send_event(mapTile, (lv_event_code_t)DOUBLE_TOUCH_EVENT, NULL);
- }
-
- numberTouchReleases = 0;
- firstTouchReleaseTime = 0;
- }
- }
- else
- {
- if (count == 1)
- {
- if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_0)
- {
- data->point.x = touchRaw[count-1].x;
- data->point.y = touchRaw[count-1].y;
- }
- else if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_270)
- {
- data->point.x = TFT_WIDTH - touchRaw[count-1].y;
- data->point.y = touchRaw[count-1].x;
- }
-
- countTouchReleases = true;
- pinchActive = false;
- prevValid = false;
- lastZoomDir = ZOOM_NONE;
- lastTime = now;
- data->state = LV_INDEV_STATE_PRESSED;
- }
- else if (count == 2)
- {
- if (prevValid)
- {
- zoom_dir zoomDir = pinchZoom(touchPrev, touchRaw, dt_ms);
- if (zoomDir != ZOOM_NONE && showMapToolBar)
- {
- pinchActive = true;
- lastZoomDir = zoomDir;
- }
- }
- touchPrev[0] = touchRaw[0];
- touchPrev[1] = touchRaw[1];
- prevValid = true;
- lastTime = now;
- }
- }
+ lgfx::touch_point_t touchRaw[TOUCH_MAX_POINTS];
+ static lgfx::touch_point_t touchPrev[TOUCH_MAX_POINTS];
+ static bool prevValid = false;
+ static bool pinchActive = false;
+ static int lastZoomDir = ZOOM_NONE;
+ static unsigned long lastTime = 0;
+
+ int count = tft.getTouch(touchRaw, TOUCH_MAX_POINTS);
+
+ unsigned long now = millis();
+ float dt_ms = (now > lastTime) ? (float)(now - lastTime) : 1.0f;
+
+ if (count == 0)
+ {
+ data->state = LV_INDEV_STATE_RELEASED;
+
+ if (pinchActive && lastZoomDir != 0)
+ {
+ if (lastZoomDir == ZOOM_IN)
+ lv_obj_send_event(btnZoomIn,LV_EVENT_CLICKED,NULL);
+ else if (lastZoomDir == ZOOM_OUT)
+ lv_obj_send_event(btnZoomOut,LV_EVENT_CLICKED,NULL);
+ }
+ pinchActive = false;
+ prevValid = false;
+ lastZoomDir = ZOOM_NONE;
+ lastTime = now;
+
+ if (countTouchReleases)
+ {
+ countTouchReleases = false;
+ uint32_t touchReleaseTime = millis();
+ if (!firstTouchReleaseTime)
+ firstTouchReleaseTime = touchReleaseTime;
+ numberTouchReleases++;
+ }
+
+ if (millis() - firstTouchReleaseTime > TOUCH_DOUBLE_TOUCH_INTERVAL)
+ {
+ if (numberTouchReleases == 2)
+ {
+ if (activeTile == MAP)
+ lv_obj_send_event(mapTile, (lv_event_code_t)DOUBLE_TOUCH_EVENT, NULL);
+ }
+
+ numberTouchReleases = 0;
+ firstTouchReleaseTime = 0;
+ }
+ }
+ else
+ {
+ if (count == 1)
+ {
+ if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_0)
+ {
+ data->point.x = touchRaw[count-1].x;
+ data->point.y = touchRaw[count-1].y;
+ }
+ else if (lv_display_get_rotation(display) == LV_DISPLAY_ROTATION_270)
+ {
+ data->point.x = TFT_WIDTH - touchRaw[count-1].y;
+ data->point.y = touchRaw[count-1].x;
+ }
+
+ countTouchReleases = true;
+ pinchActive = false;
+ prevValid = false;
+ lastZoomDir = ZOOM_NONE;
+ lastTime = now;
+ data->state = LV_INDEV_STATE_PRESSED;
+ }
+ else if (count == 2)
+ {
+ if (prevValid)
+ {
+ zoom_dir zoomDir = pinchZoom(touchPrev, touchRaw, dt_ms);
+ if (zoomDir != ZOOM_NONE && showMapToolBar)
+ {
+ pinchActive = true;
+ lastZoomDir = zoomDir;
+ }
+ }
+ touchPrev[0] = touchRaw[0];
+ touchPrev[1] = touchRaw[1];
+ prevValid = true;
+ lastTime = now;
+ }
+ }
}
#ifdef TDECK_ESP32S3
/**
- * @brief LVGL T-DECK keyboard read
+ * @brief Reads a key value from the T-DECK keyboard via I2C.
*
+ * @return The key value read from the keyboard.
*/
uint32_t keypadGetKey()
{
- char key_ch = 0;
- Wire.requestFrom(0x55, 1);
- while (Wire.available() > 0)
- {
- key_ch = Wire.read();
- }
- return key_ch;
+ char key_ch = 0;
+ Wire.requestFrom(0x55, 1);
+ while (Wire.available() > 0)
+ {
+ key_ch = Wire.read();
+ }
+ return key_ch;
}
/**
- * @brief LVGL T-DECK keyboard read
+ * @brief Reads key input from the T-DECK keyboard for LVGL input device.
*
+ * @param indev_driver Pointer to the LVGL input device driver.
+ * @param data Pointer to the structure that will be populated with key data.
*/
void IRAM_ATTR keypadRead(lv_indev_t *indev_driver, lv_indev_data_t *data)
{
- static uint32_t last_key = 0;
- uint32_t act_key;
- act_key = keypadGetKey();
- if (act_key != 0)
- {
- data->state = LV_INDEV_STATE_PRESSED;
- last_key = act_key;
- }
- else
- data->state = LV_INDEV_STATE_RELEASED;
-
- data->key = last_key;
+ static uint32_t last_key = 0;
+ uint32_t act_key;
+ act_key = keypadGetKey();
+ if (act_key != 0)
+ {
+ data->state = LV_INDEV_STATE_PRESSED;
+ last_key = act_key;
+ }
+ else
+ data->state = LV_INDEV_STATE_RELEASED;
+
+ data->key = last_key;
}
#endif
#ifdef POWER_SAVE
-extern const uint8_t BOARD_BOOT_PIN;
+extern const uint8_t BOARD_BOOT_PIN; /**< GPIO pin number used for board boot functionality. */
/**
-* @brief LVGL GPIO read
-*
-*/
+ * @brief Reads GPIO button state for LVGL input device.
+ *
+ * @param indev_driver Pointer to the LVGL input device driver.
+ * @param data Pointer to the structure that will be populated with key data.
+ */
void IRAM_ATTR gpioRead(lv_indev_t *indev_driver, lv_indev_data_t *data)
{
- uint8_t currentStat = gpioGetBut();
-
- if (currentStat == 0)
- {
- data->key = LV_KEY_ENTER;
- data->state = LV_INDEV_STATE_PRESSED;
- }
- else
- {
- data->key = 0;
- data->state = LV_INDEV_STATE_RELEASED;
- }
+ uint8_t currentStat = gpioGetBut();
+
+ if (currentStat == 0)
+ {
+ data->key = LV_KEY_ENTER;
+ data->state = LV_INDEV_STATE_PRESSED;
+ }
+ else
+ {
+ data->key = 0;
+ data->state = LV_INDEV_STATE_RELEASED;
+ }
}
/**
-* @brief LVGL GPIO long read event
-*
-*/
+ * @brief Handles LVGL GPIO long press event for shutdown message and device power-off.
+ *
+ * @param event Pointer to the LVGL event structure.
+ */
void gpioLongEvent(lv_event_t *event)
{
- powerMsg = lv_msgbox_create(lv_scr_act());
- lv_obj_set_width(powerMsg,TFT_WIDTH);
- lv_obj_set_align(powerMsg,LV_ALIGN_CENTER);
- lv_obj_set_style_text_font(powerMsg, fontDefault, 0);
- lv_obj_t *labelText = lv_msgbox_get_content(powerMsg);
- lv_obj_set_style_text_align(labelText, LV_TEXT_ALIGN_CENTER, 0);
- lv_msgbox_add_text(powerMsg, LV_SYMBOL_WARNING " This device will shutdown shortly");
- lv_obj_invalidate(powerMsg);
- lv_refr_now(display);
- vTaskDelay(2000);
- power.deviceShutdown();
+ showMsg(LV_SYMBOL_WARNING, " This device will shutdown shortly");
+ vTaskDelay(2000);
+ power.deviceShutdown();
}
/**
-* @brief LVGL GPIO short read event
-*
-*/
+ * @brief Handles LVGL GPIO short press event for sleep message and device suspend.
+ *
+ * @param event Pointer to the LVGL event structure.
+ */
void gpioClickEvent(lv_event_t *event)
{
- lv_indev_reset_long_press(lv_indev_active());
- lv_indev_reset(NULL,lv_scr_act());
- powerMsg = lv_msgbox_create(lv_scr_act());
- lv_obj_set_width(powerMsg,TFT_WIDTH);
- lv_obj_set_align(powerMsg,LV_ALIGN_CENTER);
- lv_obj_set_style_text_font(powerMsg, fontDefault, 0);
- lv_obj_t *labelText = lv_msgbox_get_content(powerMsg);
- lv_obj_set_style_text_align(labelText, LV_TEXT_ALIGN_CENTER, 0);
- lv_msgbox_add_text(powerMsg, LV_SYMBOL_WARNING " This device will sleep shortly");
- lv_obj_invalidate(powerMsg);
- lv_refr_now(display);
- vTaskDelay(2000);
- power.deviceSuspend();
+ showMsg(LV_SYMBOL_WARNING, " This device will sleep shortly");
+ vTaskDelay(2000);
+ power.deviceSuspend();
}
/**
-* @brief LVGL GPIO read
-*
-*/
+ * @brief Reads the state of the GPIO button pin.
+ *
+ * @return The current state of the GPIO button pin.
+ */
uint8_t gpioGetBut()
{
- return digitalRead(BOARD_BOOT_PIN);
+ return digitalRead(BOARD_BOOT_PIN);
}
#endif
@@ -255,164 +260,179 @@ uint8_t gpioGetBut()
*/
void applyModifyTheme(lv_theme_t *th, lv_obj_t *obj)
{
- LV_UNUSED(th);
- if (!lv_obj_check_type(obj, &lv_led_class))
- {
- if (!lv_obj_check_type(obj, &lv_button_class))
- lv_obj_add_style(obj, &styleThemeBkg, 0);
- if (lv_obj_check_type(obj, &lv_button_class))
- lv_obj_add_style(obj, &styleObjectBkg, 0);
- if (lv_obj_check_type(obj, &lv_switch_class))
- {
- lv_obj_add_style(obj, &styleObjectBkg, 0);
- lv_obj_add_style(obj, &styleObjectBkg, LV_PART_INDICATOR | LV_STATE_CHECKED);
- }
- if (lv_obj_check_type(obj, &lv_checkbox_class))
- {
- lv_obj_add_style(obj, &styleThemeBkg, LV_PART_INDICATOR | LV_STATE_DEFAULT);
- lv_obj_add_style(obj, &styleObjectBkg, LV_PART_INDICATOR | LV_STATE_CHECKED);
- }
- }
+ LV_UNUSED(th);
+ if (!lv_obj_check_type(obj, &lv_led_class))
+ {
+ if (!lv_obj_check_type(obj, &lv_button_class))
+ lv_obj_add_style(obj, &styleThemeBkg, 0);
+ if (lv_obj_check_type(obj, &lv_button_class))
+ lv_obj_add_style(obj, &styleObjectBkg, 0);
+ if (lv_obj_check_type(obj, &lv_switch_class))
+ {
+ lv_obj_add_style(obj, &styleObjectBkg, 0);
+ lv_obj_add_style(obj, &styleObjectBkg, LV_PART_INDICATOR | LV_STATE_CHECKED);
+ }
+ if (lv_obj_check_type(obj, &lv_checkbox_class))
+ {
+ lv_obj_add_style(obj, &styleThemeBkg, LV_PART_INDICATOR | LV_STATE_DEFAULT);
+ lv_obj_add_style(obj, &styleObjectBkg, LV_PART_INDICATOR | LV_STATE_CHECKED);
+ }
+ }
}
/**
- * @brief Custom Dark theme
+ * @brief Apply Custom Dark theme styles to the given object.
+ *
+ * @details Assigns custom styles to various LVGL objects (button, switch, checkbox, etc.)
*
+ * @param th Pointer to the LVGL theme (unused).
+ * @param obj Pointer to the LVGL object to style.
*/
void modifyTheme()
{
- /*Initialize the styles*/
- lv_style_init(&styleThemeBkg);
- lv_style_set_bg_color(&styleThemeBkg, lv_color_black());
- lv_style_set_border_color(&styleThemeBkg, lv_color_hex(objectColor));
- lv_style_init(&styleObjectBkg);
- lv_style_set_bg_color(&styleObjectBkg, lv_color_hex(objectColor));
- lv_style_set_border_color(&styleObjectBkg, lv_color_hex(objectColor));
- lv_style_init(&styleObjectSel);
- lv_style_set_bg_color(&styleObjectSel, lv_color_hex(0x757575));
-
- /*Initialize the new theme from the current theme*/
- lv_theme_t *th_act = lv_disp_get_theme(NULL);
- static lv_theme_t th_new;
- th_new = *th_act;
-
- /*Set the parent theme and the style apply callback for the new theme*/
- lv_theme_set_parent(&th_new, th_act);
- lv_theme_set_apply_cb(&th_new, applyModifyTheme);
-
- /*Assign the new theme to the current display*/
- lv_disp_set_theme(NULL, &th_new);
+ /*Initialize the styles*/
+ lv_style_init(&styleThemeBkg);
+ lv_style_set_bg_color(&styleThemeBkg, lv_color_black());
+ lv_style_set_border_color(&styleThemeBkg, lv_color_hex(objectColor));
+ lv_style_init(&styleObjectBkg);
+ lv_style_set_bg_color(&styleObjectBkg, lv_color_hex(objectColor));
+ lv_style_set_border_color(&styleObjectBkg, lv_color_hex(objectColor));
+ lv_style_init(&styleObjectSel);
+ lv_style_set_bg_color(&styleObjectSel, lv_color_hex(0x757575));
+
+ /*Initialize the new theme from the current theme*/
+ lv_theme_t *th_act = lv_disp_get_theme(NULL);
+ static lv_theme_t th_new;
+ th_new = *th_act;
+
+ /*Set the parent theme and the style apply callback for the new theme*/
+ lv_theme_set_parent(&th_new, th_act);
+ lv_theme_set_apply_cb(&th_new, applyModifyTheme);
+
+ /*Assign the new theme to the current display*/
+ lv_disp_set_theme(NULL, &th_new);
}
/**
- * @brief Setting up tick task for lvgl
- *
- * @param arg
+ * @brief Setting up tick task for LVGL. Increments the LVGL tick counter.
+ *
+ * @param arg Pointer to optional argument (unused).
*/
void lv_tick_task(void *arg)
{
- (void)arg;
- lv_tick_inc(LV_TICK_PERIOD_MS);
+ (void)arg;
+ lv_tick_inc(LV_TICK_PERIOD_MS);
}
/**
- * @brief Init LVGL
+ * @brief Initialize LVGL, display, input devices, themes, and main screens.
*
+ * @details Initialize the LVGL library, sets up the display buffers using PSRAM or RAM,
+ * configures input devices (touch, keypad, GPIO), applies the custom theme, creates main UI screens,
+ * and starts the periodic timer for LVGL ticks.
*/
void initLVGL()
{
- lv_init();
-
- display = lv_display_create(TFT_WIDTH, TFT_HEIGHT);
- lv_display_set_flush_cb(display, displayFlush);
- lv_display_set_flush_wait_cb(display, NULL);
-
- size_t DRAW_BUF_SIZE = 0;
-
- #ifdef BOARD_HAS_PSRAM
- assert(ESP.getFreePsram());
-
- if ( ESP.getPsramSize() >= 4000000 )
- // >4Mb PSRAM
- DRAW_BUF_SIZE = TFT_WIDTH * TFT_HEIGHT * sizeof(lv_color_t);
- else
- // 2Mb PSRAM
- DRAW_BUF_SIZE = ( TFT_WIDTH * TFT_HEIGHT * sizeof(lv_color_t) / 8);
-
- log_v("LVGL: allocating %u bytes PSRAM for draw buffer",DRAW_BUF_SIZE * 2);
- lv_color_t * drawBuf1 = (lv_color_t *)heap_caps_aligned_alloc(16, DRAW_BUF_SIZE, MALLOC_CAP_SPIRAM);
- lv_color_t * drawBuf2 = (lv_color_t *)heap_caps_aligned_alloc(16, DRAW_BUF_SIZE, MALLOC_CAP_SPIRAM);
- lv_display_set_buffers(display, drawBuf1, drawBuf2, DRAW_BUF_SIZE, LV_DISPLAY_RENDER_MODE_PARTIAL);
- #else
- DRAW_BUF_SIZE = TFT_WIDTH * TFT_HEIGHT / 10 * sizeof(lv_color_t);
- log_v("LVGL: allocating %u bytes RAM for draw buffer",DRAW_BUF_SIZE);
- lv_color_t * drawBuf1[DRAW_BUF_SIZE / 4];
- lv_display_set_buffers(display, drawBuf1, NULL, DRAW_BUF_SIZE, LV_DISPLAY_RENDER_MODE_PARTIAL);
- #endif
-
- #ifdef TOUCH_INPUT
- lv_indev_t *indev_drv = lv_indev_create();
- lv_indev_set_type(indev_drv, LV_INDEV_TYPE_POINTER);
- // lv_indev_set_long_press_time(indev_drv, 1500);
- lv_indev_set_read_cb(indev_drv, touchRead);
- #endif
-
- #ifdef TDECK_ESP32S3
- scrGroup = lv_group_create();
- lv_group_set_default(scrGroup);
- lv_indev_t *indev_keypad = lv_indev_create();
- lv_indev_set_type(indev_keypad, LV_INDEV_TYPE_KEYPAD);
- lv_indev_set_read_cb(indev_keypad, keypadRead);
- lv_indev_set_group(indev_keypad, lv_group_get_default());
- #endif
-
- #ifdef POWER_SAVE
- lv_indev_t *indev_gpio = lv_indev_create();
- lv_indev_set_type(indev_gpio, LV_INDEV_TYPE_KEYPAD);
- lv_indev_set_read_cb(indev_gpio, gpioRead);
- lv_indev_set_long_press_time(indev_gpio, longPressTime);
-
- keyGroup = lv_group_create();
- lv_group_add_obj(keyGroup,lv_scr_act());
- lv_indev_set_group(indev_gpio, keyGroup);
-
- lv_indev_add_event_cb(indev_gpio, gpioLongEvent, LV_EVENT_LONG_PRESSED, NULL);
- lv_indev_add_event_cb(indev_gpio, gpioClickEvent, LV_EVENT_SHORT_CLICKED, NULL);
- #endif
-
- // Create Main Timer
- mainTimer = lv_timer_create(updateMainScreen, UPDATE_MAINSCR_PERIOD, NULL);
- lv_timer_ready(mainTimer);
-
- modifyTheme();
-
- // Create Screens
- createSearchSatScr();
- createMainScr();
- createNotifyBar();
- createSettingsScr();
- createMapSettingsScr();
- createDeviceSettingsScr();
- createButtonBarScr();
- createGpxDetailScreen();
- createGpxListScreen();
-
- // Create and start a periodic timer interrupt to call lv_tick_inc
- const esp_timer_create_args_t periodic_timer_args = { .callback = &lv_tick_task, .name = "periodic_gui" };
- esp_timer_handle_t periodic_timer;
- ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
- ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
+ lv_init();
+
+ // Initialize Maps memory pools
+ initializeMapsPools();
+
+ display = lv_display_create(TFT_WIDTH, TFT_HEIGHT);
+ lv_display_set_flush_cb(display, displayFlush);
+ lv_display_set_flush_wait_cb(display, NULL);
+
+ size_t DRAW_BUF_SIZE = 0;
+
+ #ifdef BOARD_HAS_PSRAM
+ assert(ESP.getFreePsram());
+
+ if ( ESP.getPsramSize() >= 4000000 )
+ // >4Mb PSRAM
+ DRAW_BUF_SIZE = TFT_WIDTH * TFT_HEIGHT * sizeof(lv_color_t);
+ else
+ // 2Mb PSRAM
+ DRAW_BUF_SIZE = ( TFT_WIDTH * TFT_HEIGHT * sizeof(lv_color_t) / 8);
+
+ log_v("LVGL: allocating %u bytes PSRAM for draw buffer",DRAW_BUF_SIZE * 2);
+ lv_color_t * drawBuf1 = (lv_color_t *)heap_caps_aligned_alloc(16, DRAW_BUF_SIZE, MALLOC_CAP_SPIRAM);
+ lv_color_t * drawBuf2 = (lv_color_t *)heap_caps_aligned_alloc(16, DRAW_BUF_SIZE, MALLOC_CAP_SPIRAM);
+ lv_display_set_buffers(display, drawBuf1, drawBuf2, DRAW_BUF_SIZE, LV_DISPLAY_RENDER_MODE_PARTIAL);
+ #else
+ DRAW_BUF_SIZE = TFT_WIDTH * TFT_HEIGHT / 10 * sizeof(lv_color_t);
+ log_v("LVGL: allocating %u bytes RAM for draw buffer",DRAW_BUF_SIZE);
+ lv_color_t * drawBuf1[DRAW_BUF_SIZE / 4];
+ lv_display_set_buffers(display, drawBuf1, NULL, DRAW_BUF_SIZE, LV_DISPLAY_RENDER_MODE_PARTIAL);
+ #endif
+
+ #ifdef TOUCH_INPUT
+ lv_indev_t *indev_drv = lv_indev_create();
+ lv_indev_set_type(indev_drv, LV_INDEV_TYPE_POINTER);
+ // lv_indev_set_long_press_time(indev_drv, 1500);
+ lv_indev_set_read_cb(indev_drv, touchRead);
+ #endif
+
+ #ifdef TDECK_ESP32S3
+ scrGroup = lv_group_create();
+ lv_group_set_default(scrGroup);
+ lv_indev_t *indev_keypad = lv_indev_create();
+ lv_indev_set_type(indev_keypad, LV_INDEV_TYPE_KEYPAD);
+ lv_indev_set_read_cb(indev_keypad, keypadRead);
+ lv_indev_set_group(indev_keypad, lv_group_get_default());
+ #endif
+
+ #ifdef POWER_SAVE
+ lv_indev_t *indev_gpio = lv_indev_create();
+ lv_indev_set_type(indev_gpio, LV_INDEV_TYPE_KEYPAD);
+ lv_indev_set_read_cb(indev_gpio, gpioRead);
+ lv_indev_set_long_press_time(indev_gpio, longPressTime);
+
+ keyGroup = lv_group_create();
+ lv_group_add_obj(keyGroup,lv_scr_act());
+ lv_indev_set_group(indev_gpio, keyGroup);
+
+ lv_indev_add_event_cb(indev_gpio, gpioLongEvent, LV_EVENT_LONG_PRESSED, NULL);
+ lv_indev_add_event_cb(indev_gpio, gpioClickEvent, LV_EVENT_SHORT_CLICKED, NULL);
+ #endif
+
+ // Create Main Timer
+ mainTimer = lv_timer_create(updateMainScreen, UPDATE_MAINSCR_PERIOD, NULL);
+ lv_timer_ready(mainTimer);
+
+ modifyTheme();
+
+ // Create Screens
+ createSearchSatScr();
+ createMainScr();
+ createNotifyBar();
+ createSettingsScr();
+ createMapSettingsScr();
+ createDeviceSettingsScr();
+ createButtonBarScr();
+ createGpxDetailScreen();
+ createGpxListScreen();
+
+ // Create and start a periodic timer interrupt to call lv_tick_inc
+ const esp_timer_create_args_t periodic_timer_args = { .callback = &lv_tick_task, .name = "periodic_gui" };
+ esp_timer_handle_t periodic_timer;
+ ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
+ ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
}
/**
* @brief Load GPS Main Screen
- *
*/
void loadMainScreen()
{
- isMainScreen = true;
- isScrolled = true;
- isSearchingSat = false;
- gpxAction = WPT_NONE;
- lv_screen_load(mainScreen);
+ isMainScreen = true;
+ isScrolled = true;
+ isSearchingSat = false;
+ gpxAction = WPT_NONE;
+ lv_obj_clear_flag(menuBtn,LV_OBJ_FLAG_HIDDEN);
+ lv_obj_add_flag(buttonBar, LV_OBJ_FLAG_HIDDEN);
+ if (mapView.isMapFound)
+ lv_obj_clear_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ else
+ lv_obj_add_flag(navArrow, LV_OBJ_FLAG_HIDDEN);
+ lv_screen_load(mainScreen);
}
diff --git a/lib/lvgl/src/lvglSetup.hpp b/lib/lvgl/src/lvglSetup.hpp
index 63eda4c6..c4fe2b12 100644
--- a/lib/lvgl/src/lvglSetup.hpp
+++ b/lib/lvgl/src/lvglSetup.hpp
@@ -2,8 +2,8 @@
* @file lvglSetup.hpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief LVGL Screen implementation
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
@@ -23,12 +23,9 @@
#include "deviceSettingsScr.hpp"
#include "mapSettingsScr.hpp"
#include "gestures.hpp"
+#include "maps.hpp"
-/**
- * @brief Default display driver definition
- *
- */
-static uint32_t objectColor = 0x303030;
+static uint32_t objectColor = 0x303030; /**< Default display driver color definition. */
void IRAM_ATTR displayFlush(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map);
void IRAM_ATTR touchRead(lv_indev_t *indev_driver, lv_indev_data_t *data);
@@ -37,7 +34,7 @@ void IRAM_ATTR touchRead(lv_indev_t *indev_driver, lv_indev_data_t *data);
uint32_t keypadGetKey();
#endif
#ifdef POWER_SAVE
- static const uint16_t longPressTime = 1000; // Long press time
+ static const uint16_t longPressTime = 1000; /**< Long press time threshold in milliseconds. */
void IRAM_ATTR gpioRead(lv_indev_t *indev_driver, lv_indev_data_t *data);
void gpioLongEvent(lv_event_t *event);
void gpioClickEvent(lv_event_t *event);
diff --git a/lib/maps/src/mapVars.h b/lib/maps/src/mapVars.h
index 46018019..08b576ea 100644
--- a/lib/maps/src/mapVars.h
+++ b/lib/maps/src/mapVars.h
@@ -2,116 +2,36 @@
* @file mapsVars.h
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief Maps vars and structures
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#pragma once
- /**
- * @brief Map Widgets images.
- *
- */
#include "bruj.h"
-#include "navigation.h"
-#include "waypoint.h"
#include "compass.h"
-#include "zoom.h"
-#include "speed.h"
-#include "expand.h"
-#include "collapse.h"
-#include "zoomin.h"
-#include "zoomout.h"
+#include "waypoint.h"
#include "navfinish.h"
-#include "move.h"
+#include "straight.h"
+#include "slleft.h"
+#include "slright.h"
+#include "tleft.h"
+#include "tright.h"
+#include "uleft.h"
+#include "uright.h"
+#include "finish.h"
+#include "outtrack.h"
#include "globalGpxDef.h"
-/**
- * @brief Point in 16 bits projected coordinates (x,y) Vector Maps
- *
- */
-struct Point16
-{
- Point16(){};
- Point16(int16_t x, int16_t y) : x(x), y(y){};
- Point16 operator-(const Point16 p) { return Point16(x - p.x, y - p.y); };
- Point16 operator+(const Point16 p) { return Point16(x + p.x, y + p.y); };
- Point16(char *coordsPair);
- int16_t x;
- int16_t y;
-};
-
-/**
- * @brief Point in 32 bits projected coordinates (x,y) Vector Maps
- *
- */
-struct Point32
-{
- Point32(){};
- Point32(int32_t x, int32_t y) : x(x), y(y){};
- Point32(Point16 p) : x(p.x), y(p.y){};
- Point32 operator-(const Point32 p) { return Point32(x - p.x, y - p.y); };
- Point32 operator+(const Point32 p) { return Point32(x + p.x, y + p.y); };
- Point16 toPoint16() { return Point16(x, y); };
- bool operator==(const Point32 p) { return x == p.x && y == p.y; };
- int32_t x;
- int32_t y;
-};
-
-/**
- * @brief Bounding Box
- *
- */
-struct BBox
-{
- BBox(){};
- BBox(Point32 min, Point32 max) : min(min), max(max){};
- BBox operator-(const Point32 p) { return BBox(min - p, max - p); };
- bool containsPoint(const Point32 p);
- bool intersects(const BBox b);
- Point32 min;
- Point32 max;
-};
-
-static const String mapVectorFolder PROGMEM = "/sdcard/VECTMAP/"; // Vector Map Files Folder
-static const char *mapRenderFolder PROGMEM = "/sdcard/MAP/%u/%u/%u.png"; // Render Maps file folder
-static const char *noMapFile PROGMEM = "/spiffs/NOMAP.png"; // No map image file
+static const char *mapVectorFolder PROGMEM = "/sdcard/VECTMAP/%u/%u/%u.bin"; /**< Vector Map Files Folder */
+static const char *mapRenderFolder PROGMEM = "/sdcard/MAP/%u/%u/%u.png"; /**< Render Maps file folder */
+static const char *noMapFile PROGMEM = "/spiffs/NOMAP.png"; /**< No map image file */
static const char *map_scale[] PROGMEM = {"5000 Km", "2500 Km", "1500 Km",
- "700 Km", "350 Km", "150 Km",
- "100 Km", "40 Km", "20 Km",
- "10 Km", "5 Km", "2,5 Km",
- "1,5 Km", "700 m", "350 m",
- "150 m", "80 m", "40 m",
- "20 m", "10 m"}; // Scale label for map
-
-
-/**
- * @brief Vector map object colours
- *
- */
-static const uint16_t WHITE = 0xFFFF;
-static const uint16_t BLACK = 0x0000;
-static const uint16_t GREEN = 0x76EE;
-static const uint16_t GREENCLEAR = 0x9F93;
-static const uint16_t GREENCLEAR2 = 0xCF6E;
-static const uint16_t BLUE = 0x227E;
-static const uint16_t BLUECLEAR = 0x6D3E;
-static const uint16_t CYAN = 0xB7FF;
-static const uint16_t VIOLET = 0xAA1F;
-static const uint16_t ORANGE = 0xFCC2;
-static const uint16_t GRAY = 0x94B2;
-static const uint16_t GRAYCLEAR = 0xAD55;
-static const uint16_t GRAYCLEAR2 = 0xD69A;
-static const uint16_t BROWN = 0xAB00;
-static const uint16_t YELLOWCLEAR = 0xFFF5;
-static const uint16_t BACKGROUND_COLOR = 0xEF5D;
-
-/**
- * @brief Vector maps memory definition
- *
- */
-#define MAPBLOCKS_MAX 6 // max blocks in memory
-#define MAPBLOCK_SIZE_BITS 12 // 4096 x 4096 coords (~meters) per block
-#define MAPFOLDER_SIZE_BITS 4 // 16 x 16 map blocks per folder
-#define MAX_ZOOM 4 // Vector max MAX_ZOOM
\ No newline at end of file
+ "700 Km", "350 Km", "150 Km",
+ "100 Km", "40 Km", "20 Km",
+ "10 Km", "5 Km", "2,5 Km",
+ "1,5 Km", "700 m", "350 m",
+ "150 m", "80 m", "40 m",
+ "20 m", "10 m"
+ }; /**< Scale label for map */
diff --git a/lib/maps/src/maps.cpp b/lib/maps/src/maps.cpp
index d588252b..ffd87577 100644
--- a/lib/maps/src/maps.cpp
+++ b/lib/maps/src/maps.cpp
@@ -1,1380 +1,2503 @@
/**
* @file maps.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com) - Render Maps
- * @author @aresta - https://github.com/aresta/ESP32_GPS - Vector Maps
* @brief Maps draw class
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include "maps.hpp"
+#include
+#include
";
- }
-
- return returnText;
+ String returnText = "";
+
+ int startIdx = page * FILES_PER_PAGE;
+ int endIdx = startIdx + FILES_PER_PAGE;
+
+ if (ishtml)
+ {
+ returnText += "| Name | Size | | |
";
+ if (oldDir != "/")
+ {
+ returnText += "";
+ returnText += " ..";
+ returnText += " | dir | | | ";
+ returnText += "
";
+ }
+ }
+
+ for (int i = startIdx; i < endIdx && i < fileCache.size(); ++i)
+ {
+ FileEntry& entry = fileCache[i];
+
+ if (ishtml)
+ {
+ returnText += "";
+ if (entry.isDirectory)
+ {
+ returnText += " " + entry.name + "";
+ returnText += " | dir | ";
+ returnText += " | ";
+ returnText += " | ";
+ }
+ else
+ {
+ returnText += "
" + entry.name;
+ returnText += "" + humanReadableSize(entry.size) + " | ";
+ returnText += " | ";
+ returnText += " | ";
+ }
+ returnText += "
";
+ }
+ else
+ {
+ returnText += "File: " + entry.name + " Size: " + humanReadableSize(entry.size) + "\n";
+ }
+ }
+
+ if (ishtml)
+ {
+ returnText += "
";
+
+ returnText += "
";
+ if (page > 0)
+ {
+ returnText += "";
+ returnText += "";
+ }
+
+ returnText += " Page " + String(page + 1) + "/" + String((fileCache.size() / 10)+1) + " ";
+
+ if (fileCache.size() > endIdx)
+ {
+ returnText += "";
+ returnText += "";
+ }
+
+ returnText += "
";
+ }
+
+ return returnText;
}
/**
* @brief Create directories if needed for upload
*
- * @param filepath -> Full file path
- * @return true/false if successful
+ * @details Ensures that all directories in the provided file path exist by creating each
+ * missing directory in the path. Returns true if all directories are created/exist,
+ * false if any creation fails.
+ *
+ * @param filepath Full file path (relative to storage root)
+ * @return true if successful, false otherwise
*/
bool createDirectories(String filepath)
{
- uint8_t lastSlash = 0;
- while (true)
- {
- nextSlash = filepath.indexOf('/', lastSlash + 1);
- String dir = filepath.substring(0, nextSlash);
-
- String newDir = "/sdcard" + oldDir + "/" + dir;
- if (!storage.exists(newDir.c_str()))
- {
- if (!storage.mkdir(newDir.c_str()))
- {
- ESP_LOGE(TAG, "Directory %s creation error", newDir.c_str());
- return false;
- }
- ESP_LOGI(TAG, "Directory %s created",newDir.c_str());
- }
- if (nextSlash == 255) break;
- lastSlash = nextSlash;
-
- esp_task_wdt_reset();
- }
- return true;
+ uint8_t lastSlash = 0;
+ while (true)
+ {
+ nextSlash = filepath.indexOf('/', lastSlash + 1);
+ String dir = filepath.substring(0, nextSlash);
+
+ String newDir = "/sdcard" + oldDir + "/" + dir;
+ if (!storage.exists(newDir.c_str()))
+ {
+ if (!storage.mkdir(newDir.c_str()))
+ {
+ ESP_LOGE(TAG, "Directory %s creation error", newDir.c_str());
+ return false;
+ }
+ ESP_LOGI(TAG, "Directory %s created",newDir.c_str());
+ }
+ if (nextSlash == 255) break;
+ lastSlash = nextSlash;
+
+ esp_task_wdt_reset();
+ }
+ return true;
}
/**
* @brief Upload file handle
*
- * @param request
- * @param filename
- * @param index
- * @param data
- * @param len
+ * @details Handles file upload requests by writing the uploaded data in chunks to storage.
+ * Creates necessary directories if required, opens and writes to the file, and handles errors.
+ *
+ * @param request Pointer to the AsyncWebServerRequest representing the upload
+ * @param filename Name of the file being uploaded (may include path)
+ * @param index Current index of the upload data chunk
+ * @param data Pointer to the chunk data buffer
+ * @param len Length of the current chunk
+ * @param final True if this is the last chunk of the file
*/
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final)
{
- waitScreenRefresh = true;
-
- static FILE *file = nullptr;
-
- uint8_t lastSlashIndex = filename.lastIndexOf("/");
-
- if (lastSlashIndex != 255)
- {
- String path = filename.substring(0, lastSlashIndex);
- if (createDir != path)
- {
-
- if (!createDirectories(path))
- ESP_LOGE(TAG, "Directory creation error");
- createDir = path;
- }
- }
-
- if (!index)
- {
- String fullPath = "/sdcard" + oldDir + "/" + filename;
- file = storage.open(fullPath.c_str(), "w");
- if (!file)
- {
- ESP_LOGE(TAG, "Failed to open file for writing: %s", fullPath.c_str());
- request->send(500, "text/plain", "Failed to open file for writing");
- return;
- }
- ESP_LOGI(TAG, "Started writing file: %s", fullPath.c_str());
- }
-
- if (file)
- {
- if (fwrite(data, 1, len, file) != len)
- {
- ESP_LOGE(TAG, "Failed to write data to file");
- request->send(500, "text/plain", "Failed to write data to file");
- storage.close(file);
- file = nullptr;
- return;
- }
- }
-
- if (final)
- {
- ESP_LOGI(TAG, "Finished writing file");
- storage.close(file);
- file = nullptr;
- waitScreenRefresh = false;
- }
+ waitScreenRefresh = true;
+
+ static FILE *file = nullptr;
+
+ uint8_t lastSlashIndex = filename.lastIndexOf("/");
+
+ if (lastSlashIndex != 255)
+ {
+ String path = filename.substring(0, lastSlashIndex);
+ if (createDir != path)
+ {
+ if (!createDirectories(path))
+ ESP_LOGE(TAG, "Directory creation error");
+ createDir = path;
+ }
+ }
+
+ if (!index)
+ {
+ String fullPath = "/sdcard" + oldDir + "/" + filename;
+ file = storage.open(fullPath.c_str(), "w");
+ if (!file)
+ {
+ ESP_LOGE(TAG, "Failed to open file for writing: %s", fullPath.c_str());
+ request->send(500, "text/plain", "Failed to open file for writing");
+ return;
+ }
+ ESP_LOGI(TAG, "Started writing file: %s", fullPath.c_str());
+ }
+
+ if (file)
+ {
+ if (fwrite(data, 1, len, file) != len)
+ {
+ ESP_LOGE(TAG, "Failed to write data to file");
+ request->send(500, "text/plain", "Failed to write data to file");
+ storage.close(file);
+ file = nullptr;
+ return;
+ }
+ }
+
+ if (final)
+ {
+ ESP_LOGI(TAG, "Finished writing file");
+ storage.close(file);
+ file = nullptr;
+ waitScreenRefresh = false;
+ }
}
/**
* @brief Send PNG file from SPIFFS to webpage
*
- * @param imageFile
- * @param request
+ * @details Reads a PNG image file from SPIFFS, sends it to the client as an HTTP response,
+ *
+ * @param imageFile Path to the image file in storage
+ * @param request Pointer to the AsyncWebServerRequest
*/
void sendSpiffsImage(const char *imageFile,AsyncWebServerRequest *request)
{
- FILE *file = storage.open(imageFile,"r");
-
- if (file)
- {
- size_t size = storage.size(imageFile);
-
- #ifdef BOARD_HAS_PSRAM
- uint8_t *buffer = (uint8_t*)ps_malloc(sizeof(uint8_t)*size);
- #else
- uint8_t *buffer = (uint8_t*)malloc(sizeof(uint8_t)*size);
- #endif
-
- storage.read(file,buffer,size);
- storage.close(file);
- request->send_P(200,"image/png",buffer,size);
-
- free(buffer);
- }
+ FILE *file = storage.open(imageFile,"r");
+
+ if (file)
+ {
+ size_t size = storage.size(imageFile);
+
+ #ifdef BOARD_HAS_PSRAM
+ uint8_t *buffer = (uint8_t*)ps_malloc(sizeof(uint8_t)*size);
+ #else
+ uint8_t *buffer = (uint8_t*)malloc(sizeof(uint8_t)*size);
+ #endif
+
+ storage.read(file,buffer,size);
+ storage.close(file);
+ request->send_P(200,"image/png",buffer,size);
+
+ free(buffer);
+ }
}
/**
- * @brief Delete directory recursive
+ * @brief Delete directory recursively
*
- * @param dirPath -> directory path
- * @return true/false if successful
+ * @details Deletes a directory and all its contents (files and subdirectories) recursively.
+ * Uses a non-recursive approach with stacks to avoid stack overflow on deeply nested structures.
+ *
+ * @param dirPath Directory path to delete
+ * @return true if successful, false otherwise
*/
bool deleteDirRecursive(const char *dirPath)
{
- if (!dirPath || strlen(dirPath) == 0)
- {
- ESP_LOGE(TAG, "Error: Invalid directory path");
- return false;
- }
-
- // Normalize the input path
- std::string rootDir(dirPath);
-
- // Use two stacks: one for processing directories and another for tracking deletable directories
- std::stack dirStack; // Stack for directories to process
- std::stack deleteStack; // Stack for directories to delete
-
- dirStack.push(rootDir);
-
- while (!dirStack.empty())
- {
- std::string currentDir = dirStack.top();
- dirStack.pop();
-
- ESP_LOGI(TAG, "Processing directory: %s", currentDir.c_str());
-
- DIR *dir = opendir(currentDir.c_str());
- if (!dir)
- {
- ESP_LOGE(TAG, "Error opening directory: %s", currentDir.c_str());
- return false;
- }
-
- bool hasEntries = false; // Track if the directory has any entries
- struct dirent *entry;
- while ((entry = readdir(dir)) != NULL)
- {
- // Skip the current and parent directory entries
- if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
- continue;
-
- // Construct the full path for the current entry
- char entryPath[PATH_MAX];
- snprintf(entryPath, sizeof(entryPath), "%s/%s", currentDir.c_str(), entry->d_name);
-
- struct stat entryStat;
- if (stat(entryPath, &entryStat) == -1)
- {
- ESP_LOGE(TAG, "Error getting entry stats for: %s", entryPath);
- closedir(dir);
- return false;
- }
-
- if (S_ISDIR(entryStat.st_mode))
- {
- // Push the subdirectory onto the stack for later processing
- ESP_LOGI(TAG, "Found subdirectory: %s", entryPath);
- dirStack.push(std::string(entryPath));
- }
- else
- {
- // Delete the file
- ESP_LOGI(TAG, "Found file: %s", entryPath);
- if (remove(entryPath) != 0)
- {
- ESP_LOGE(TAG, "Error deleting file: %s", entryPath);
- closedir(dir);
- return false;
- }
- ESP_LOGI(TAG, "Deleted file: %s", entryPath);
- }
-
- hasEntries = true; // The directory is not empty
- }
-
- closedir(dir);
-
- // If the directory is empty, add it to the delete stack
- deleteStack.push(currentDir);
- }
-
- // Now delete all directories in reverse order (from deepest to root)
- while (!deleteStack.empty())
- {
- std::string dirToDelete = deleteStack.top();
- deleteStack.pop();
-
- ESP_LOGI(TAG, "Deleting directory: %s", dirToDelete.c_str());
- if (rmdir(dirToDelete.c_str()) != 0)
- {
- ESP_LOGE(TAG, "Error deleting directory: %s", dirToDelete.c_str());
- return false;
- }
- ESP_LOGI(TAG, "Deleted directory: %s", dirToDelete.c_str());
- }
-
- return true;
+ if (!dirPath || strlen(dirPath) == 0)
+ {
+ ESP_LOGE(TAG, "Error: Invalid directory path");
+ return false;
+ }
+
+ // Normalize the input path
+ std::string rootDir(dirPath);
+
+ // Use two stacks: one for processing directories and another for tracking deletable directories
+ std::stack dirStack; // Stack for directories to process
+ std::stack deleteStack; // Stack for directories to delete
+
+ dirStack.push(rootDir);
+
+ while (!dirStack.empty())
+ {
+ std::string currentDir = dirStack.top();
+ dirStack.pop();
+
+ ESP_LOGI(TAG, "Processing directory: %s", currentDir.c_str());
+
+ DIR *dir = opendir(currentDir.c_str());
+ if (!dir)
+ {
+ ESP_LOGE(TAG, "Error opening directory: %s", currentDir.c_str());
+ return false;
+ }
+
+ bool hasEntries = false; // Track if the directory has any entries
+ struct dirent *entry;
+ while ((entry = readdir(dir)) != NULL)
+ {
+ // Skip the current and parent directory entries
+ if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
+ continue;
+
+ // Construct the full path for the current entry
+ char entryPath[PATH_MAX];
+ snprintf(entryPath, sizeof(entryPath), "%s/%s", currentDir.c_str(), entry->d_name);
+
+ struct stat entryStat;
+ if (stat(entryPath, &entryStat) == -1)
+ {
+ ESP_LOGE(TAG, "Error getting entry stats for: %s", entryPath);
+ closedir(dir);
+ return false;
+ }
+
+ if (S_ISDIR(entryStat.st_mode))
+ {
+ // Push the subdirectory onto the stack for later processing
+ ESP_LOGI(TAG, "Found subdirectory: %s", entryPath);
+ dirStack.push(std::string(entryPath));
+ }
+ else
+ {
+ // Delete the file
+ ESP_LOGI(TAG, "Found file: %s", entryPath);
+ if (remove(entryPath) != 0)
+ {
+ ESP_LOGE(TAG, "Error deleting file: %s", entryPath);
+ closedir(dir);
+ return false;
+ }
+ ESP_LOGI(TAG, "Deleted file: %s", entryPath);
+ }
+
+ hasEntries = true; // The directory is not empty
+ }
+
+ closedir(dir);
+
+ // If the directory is empty, add it to the delete stack
+ deleteStack.push(currentDir);
+ }
+
+ // Now delete all directories in reverse order (from deepest to root)
+ while (!deleteStack.empty())
+ {
+ std::string dirToDelete = deleteStack.top();
+ deleteStack.pop();
+
+ ESP_LOGI(TAG, "Deleting directory: %s", dirToDelete.c_str());
+ if (rmdir(dirToDelete.c_str()) != 0)
+ {
+ ESP_LOGE(TAG, "Error deleting directory: %s", dirToDelete.c_str());
+ return false;
+ }
+ ESP_LOGI(TAG, "Deleted directory: %s", dirToDelete.c_str());
+ }
+
+ return true;
}
-
/**
* @brief Configure Web Server
*
+ * @details Sets up all routes, event sources, handlers, and static file/image serving for the web server.
+ * Handles file uploads, downloads, directory navigation, image serving, and server reboot via HTTP endpoints.
*/
void configureWebServer()
{
- server.onNotFound(webNotFound);
- server.onFileUpload(handleUpload);
- server.addHandler(&eventRefresh);
- oldDir = "";
- server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
- {
- String logMessage = "Client:" + request->client()->remoteIP().toString() + +" " + request->url();
- log_i("%s", logMessage.c_str());
- request->send_P(200, "text/html", index_html, webParser);
- });
-
-
- server.on("/logo", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/LOGO_LARGE.png",request); });
-
- server.on("/files", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/file.png",request); });
-
- server.on("/folder", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/folder.png",request); });
-
- server.on("/down", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/download.png", request); });
-
- server.on("/up", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/upload.png", request); });
-
- server.on("/del", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/delete.png", request); });
-
- server.on("/reb", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/reboot.png", request); });
-
- server.on("/list", HTTP_GET, [](AsyncWebServerRequest *request)
- { sendSpiffsImage("/spiffs/list.png", request); });
-
- server.on("/reboot", HTTP_GET, [](AsyncWebServerRequest *request)
- {
- String logMessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
- request->send(200, "text/html", reboot_html);
- log_i("%s",logMessage.c_str());
- rebootESP(); });
-
- server.on("/listfiles", HTTP_GET, [](AsyncWebServerRequest *request)
- {
- String logMessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
- log_i("%s", logMessage.c_str());
-
- int page = 0;
- if (request->hasParam("page"))
- {
- page = request->getParam("page")->value().toInt();
- }
-
- if (updateList)
- {
- esp_task_wdt_reset();
- cacheDirectoryContent(oldDir);
- }
-
- request->send(200, "text/html", listFiles(true, page)); });
-
- server.on("/file", HTTP_GET, [](AsyncWebServerRequest *request)
- {
- if (request->hasParam("name") && request->hasParam("action"))
- {
- const char *fileName = request->getParam("name")->value().c_str();
- const char *fileAction = request->getParam("action")->value().c_str();
-
- String logMessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url() + "?name=" + String(fileName) + "&action=" + String(fileAction);
- String path = "/sdcard" + oldDir + "/" + String(fileName);
-
- FILE* file = storage.open(path.c_str(), "r");
-
- log_i("folder %s",path.c_str());
- if (!file)
- {
- if (strcmp(fileAction, "deldir") == 0)
- {
- logMessage += " deleted";
- deletePath = path;
- deleteDir = true;
- request->send(200, "text/plain", "Deleting Folder: " + String(fileName) + " please wait...");
- updateList = true;
- }
- else
- request->send(400, "text/plain", "ERROR: file/ does not exist");
- }
- else
- {
- if (strcmp(fileAction, "download") == 0)
- {
- logMessage += " downloaded";
- AsyncWebServerResponse *response = request->beginChunkedResponse("application/octet-stream", [file](uint8_t *buffer, size_t maxLen, size_t index) -> size_t
- {
- size_t bytesRead = storage.read(file, buffer, maxLen);
- if (bytesRead == 0)
- storage.close(file);
- return bytesRead;
- });
- response->addHeader("Content-Disposition", "attachment; filename=\"" + path.substring(path.lastIndexOf('/') + 1) + "\"");
- request->send(response);
- }
- // else if (strcmp(fileAction, "deldir") == 0)
- // {
- // logMessage += " deleted";
- // deletePath = path;
- // deleteDir = true;
- // request->send(200, "text/plain", "Deleting Folder: " + String(fileName) + " please wait...");
- // updateList = true;
- // }
- else if (strcmp(fileAction, "delete") == 0)
- {
- logMessage += " deleted";
- storage.close(file);
- storage.remove(path.c_str());
- request->send(200, "text/plain", "Deleted File: " + String(fileName));
- updateList = true;
- }
- else
- {
- logMessage += " ERROR: invalid action param supplied";
- request->send(400, "text/plain", "ERROR: invalid action param supplied");
- }
- log_i("%s", logMessage.c_str());
- }
- }
- else
- {
- request->send(400, "text/plain", "ERROR: name and action params required");
- } });
-
- server.on("/changedirectory", HTTP_GET, [](AsyncWebServerRequest *request)
- {
- if (request->hasParam("dir"))
- {
- updateList = false;
-
- newDir = request->getParam("dir")->value();
- log_i("new dir %s", newDir.c_str());
- log_i("old dir %s", oldDir.c_str());
- // UP Directory
- if (newDir == "/..")
- {
- if (oldDir != "/..")
- {
- oldDir = oldDir.substring(0, oldDir.lastIndexOf("/"));
- currentDir = "";
- request->send(200, "text/plain", "Path:" + oldDir );
- }
- else
- {
- request->send(400, "text/plain", "Cannot go up from root directory");
- }
- }
- else
- // DOWN Directory
- {
- if (oldDir != "/")
- oldDir = oldDir + newDir;
- else
- oldDir = newDir;
- currentDir = "";
- request->send(200, "text/plain", "Path:" + oldDir);
- }
-
- cacheDirectoryContent(oldDir);
-
- }
- else
- {
- request->send(400, "text/plain", "ERROR: dir parameter required");
- }
- });
+ server.onNotFound(webNotFound);
+ server.onFileUpload(handleUpload);
+ server.addHandler(&eventRefresh);
+ oldDir = "";
+ server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
+ {
+ String logMessage = "Client:" + request->client()->remoteIP().toString() + +" " + request->url();
+ log_i("%s", logMessage.c_str());
+ request->send_P(200, "text/html", index_html, webParser);
+ });
+
+
+ server.on("/logo", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/LOGO_LARGE.png",request); });
+
+ server.on("/files", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/file.png",request); });
+
+ server.on("/folder", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/folder.png",request); });
+
+ server.on("/down", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/download.png", request); });
+
+ server.on("/up", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/upload.png", request); });
+
+ server.on("/del", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/delete.png", request); });
+
+ server.on("/reb", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/reboot.png", request); });
+
+ server.on("/list", HTTP_GET, [](AsyncWebServerRequest *request)
+ { sendSpiffsImage("/spiffs/list.png", request); });
+
+ server.on("/reboot", HTTP_GET, [](AsyncWebServerRequest *request)
+ {
+ String logMessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
+ request->send(200, "text/html", reboot_html);
+ log_i("%s",logMessage.c_str());
+ rebootESP(); });
+
+ server.on("/listfiles", HTTP_GET, [](AsyncWebServerRequest *request)
+ {
+ String logMessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
+ log_i("%s", logMessage.c_str());
+
+ int page = 0;
+ if (request->hasParam("page"))
+ {
+ page = request->getParam("page")->value().toInt();
+ }
+
+ if (updateList)
+ {
+ esp_task_wdt_reset();
+ cacheDirectoryContent(oldDir);
+ }
+ request->send(200, "text/html", listFiles(true, page)); });
+
+ server.on("/file", HTTP_GET, [](AsyncWebServerRequest *request)
+ {
+ if (request->hasParam("name") && request->hasParam("action"))
+ {
+ const char *fileName = request->getParam("name")->value().c_str();
+ const char *fileAction = request->getParam("action")->value().c_str();
+
+ String logMessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url() + "?name=" + String(fileName) + "&action=" + String(fileAction);
+ String path = "/sdcard" + oldDir + "/" + String(fileName);
+
+ FILE* file = storage.open(path.c_str(), "r");
+
+ log_i("folder %s",path.c_str());
+ if (!file)
+ {
+ if (strcmp(fileAction, "deldir") == 0)
+ {
+ logMessage += " deleted";
+ deletePath = path;
+ deleteDir = true;
+ request->send(200, "text/plain", "Deleting Folder: " + String(fileName) + " please wait...");
+ updateList = true;
+ }
+ else
+ request->send(400, "text/plain", "ERROR: file/ does not exist");
+ }
+ else
+ {
+ if (strcmp(fileAction, "download") == 0)
+ {
+ logMessage += " downloaded";
+ AsyncWebServerResponse *response = request->beginChunkedResponse("application/octet-stream", [file](uint8_t *buffer, size_t maxLen, size_t index) -> size_t
+ {
+ size_t bytesRead = storage.read(file, buffer, maxLen);
+ if (bytesRead == 0)
+ storage.close(file);
+ return bytesRead;
+ });
+ response->addHeader("Content-Disposition", "attachment; filename=\"" + path.substring(path.lastIndexOf('/') + 1) + "\"");
+ request->send(response);
+ }
+ // else if (strcmp(fileAction, "deldir") == 0)
+ // {
+ // logMessage += " deleted";
+ // deletePath = path;
+ // deleteDir = true;
+ // request->send(200, "text/plain", "Deleting Folder: " + String(fileName) + " please wait...");
+ // updateList = true;
+ // }
+ else if (strcmp(fileAction, "delete") == 0)
+ {
+ logMessage += " deleted";
+ storage.close(file);
+ storage.remove(path.c_str());
+ request->send(200, "text/plain", "Deleted File: " + String(fileName));
+ updateList = true;
+ }
+ else
+ {
+ logMessage += " ERROR: invalid action param supplied";
+ request->send(400, "text/plain", "ERROR: invalid action param supplied");
+ }
+ log_i("%s", logMessage.c_str());
+ }
+ }
+ else
+ {
+ request->send(400, "text/plain", "ERROR: name and action params required");
+ } });
+
+ server.on("/changedirectory", HTTP_GET, [](AsyncWebServerRequest *request)
+ {
+ if (request->hasParam("dir"))
+ {
+ updateList = false;
+
+ newDir = request->getParam("dir")->value();
+ log_i("new dir %s", newDir.c_str());
+ log_i("old dir %s", oldDir.c_str());
+ // UP Directory
+ if (newDir == "/..")
+ {
+ if (oldDir != "/..")
+ {
+ oldDir = oldDir.substring(0, oldDir.lastIndexOf("/"));
+ currentDir = "";
+ request->send(200, "text/plain", "Path:" + oldDir );
+ }
+ else
+ {
+ request->send(400, "text/plain", "Cannot go up from root directory");
+ }
+ }
+ else
+ // DOWN Directory
+ {
+ if (oldDir != "/")
+ oldDir = oldDir + newDir;
+ else
+ oldDir = newDir;
+ currentDir = "";
+ request->send(200, "text/plain", "Path:" + oldDir);
+ }
+
+ cacheDirectoryContent(oldDir);
+
+ }
+ else
+ {
+ request->send(400, "text/plain", "ERROR: dir parameter required");
+ }
+ });
}
\ No newline at end of file
diff --git a/platformio.ini b/platformio.ini
index 36fb48c3..5243e024 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -15,8 +15,8 @@ default_envs = ICENAV_BOARD
[common]
platform = espressif32@6.9.0
framework = arduino
-version = 0.2.2
-revision = 86
+version = 0.2.3
+revision = 88
monitor_speed = 115200
;monitor_rts = 0
;monitor_dtr = 0
@@ -24,8 +24,9 @@ monitor_filters =
esp32_exception_decoder
extra_scripts = pre:prebuild.py
build_flags =
- -D LV_CONF_PATH="${PROJECT_DIR}/lib/lvgl/lv_conf.h"
- -D CORE_DEBUG_LEVEL=0
+ -O3
+ -D LV_CONF_PATH="\"${PROJECT_DIR}/lib/lvgl/lv_conf.h\""
+ -D CORE_DEBUG_LEVEL=5
-D DISABLE_RADIO=1
-D BAUDRATE=115200
-D DEBUG=1
@@ -40,13 +41,13 @@ build_flags =
lib_deps =
; slashdevin/NeoGPS@4.2.9
https://github.com/jgauchia/NeoGPS.git#43c4766
- lvgl/lvgl@9.2.2
+ lvgl/lvgl@9.3.0
lovyan03/LovyanGFX@1.2.7
- hpsaturn/EasyPreferences@0.1.3
+ hpsaturn/EasyPreferences@0.1.4
hpsaturn/ESP32 Wifi CLI@0.3.4
kubafilinger/AsyncTCP@1.1.1
esphome/ESPAsyncWebServer-esphome@3.3.0
- jpb10/SolarCalculator@2.0.1
+ jpb10/SolarCalculator@2.0.2
https://github.com/leethomason/tinyxml2.git
[esp32_common]
@@ -132,8 +133,8 @@ build_flags =
;-DAT6558D_GPS
;-DHMC5883L
;-DBME280
- ;-DILI9488_XPT2046_SPI
- ;-DTFT_BL=33
+ -DILI9488_XPT2046_SPI
+ -DTFT_BL=33
[env:ESP32S3_N16R8]
extends = esp32_common
diff --git a/src/main.cpp b/src/main.cpp
index f94acc7a..67d0551d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2,8 +2,8 @@
* @file main.cpp
* @author Jordi GauchΓa (jgauchia@jgauchia.com)
* @brief ICENAV - ESP32 GPS Navigator main code
- * @version 0.2.2
- * @date 2025-05
+ * @version 0.2.3
+ * @date 2025-06
*/
#include
@@ -25,26 +25,26 @@
#include "tft.hpp"
#ifdef HMC5883L
-#include "compass.hpp"
+ #include "compass.hpp"
#endif
#ifdef QMC5883
-#include "compass.hpp"
+ #include "compass.hpp"
#endif
#ifdef IMU_MPU9250
-#include "compass.hpp"
+ #include "compass.hpp"
#endif
#ifdef BME280
-#include "bme.hpp"
+ #include "bme.hpp"
#endif
#ifdef MPU6050
-#include "imu.hpp"
+ #include "imu.hpp"
#endif
-extern xSemaphoreHandle gpsMutex;
+extern xSemaphoreHandle gpsMutex; /**< Mutex used to synchronize access to the GPS resource */
#include "webpage.h"
#include "webserver.h"
@@ -60,163 +60,194 @@ extern Power power;
extern Maps mapView;
extern Gps gps;
#ifdef ENABLE_COMPASS
-Compass compass;
+ Compass compass;
#endif
+std::vector trackData; /**< Vector for storing track data */
+std::vector turnPoints; /**< Vector for storing turn points */
-std::vector trackData;
+#include "navigation.hpp"
+NavState navState;
-
-/**
- * @brief Sunrise and Sunset
- *
- */
-static double transit, sunrise, sunset;
+static double transit, sunrise, sunset; /**< Variables to store solar transit, sunrise, and sunset times (in hours or fractional day) */
#include "timezone.c"
#include "settings.hpp"
#include "lvglSetup.hpp"
#include "tasks.hpp"
+
/**
* @brief Calculate Sunrise and Sunset
* Must be a global function
*
+ * @details Calls calcSunriseSunset to compute the solar transit, sunrise, and sunset times for
+ * the current date and GPS location. Adjusts times for UTC offset
*/
void calculateSun()
{
- calcSunriseSunset(2000 + fix.dateTime.year,
- fix.dateTime.month,
- fix.dateTime.date,
- gps.gpsData.latitude,
- gps.gpsData.longitude,
- transit,
- sunrise,
- sunset);
- int hours = (int)sunrise + gps.gpsData.UTC;
- int minutes = (int)round(((sunrise + gps.gpsData.UTC) - hours) * 60);
- snprintf(gps.gpsData.sunriseHour, 6, "%02d:%02d", hours, minutes);
- hours = (int)sunset + gps.gpsData.UTC;
- minutes = (int)round(((sunset + gps.gpsData.UTC) - hours) * 60);
- snprintf(gps.gpsData.sunsetHour, 6, "%02d:%02d", hours, minutes);
- log_i("Sunrise: %s",gps.gpsData.sunriseHour);
- log_i("Sunset: %s",gps.gpsData.sunsetHour);
+ calcSunriseSunset(2000 + fix.dateTime.year,
+ fix.dateTime.month,
+ fix.dateTime.date,
+ gps.gpsData.latitude,
+ gps.gpsData.longitude,
+ transit,
+ sunrise,
+ sunset);
+ int hours = (int)sunrise + gps.gpsData.UTC;
+ int minutes = (int)round(((sunrise + gps.gpsData.UTC) - hours) * 60);
+ snprintf(gps.gpsData.sunriseHour, 6, "%02d:%02d", hours, minutes);
+ hours = (int)sunset + gps.gpsData.UTC;
+ minutes = (int)round(((sunset + gps.gpsData.UTC) - hours) * 60);
+ snprintf(gps.gpsData.sunsetHour, 6, "%02d:%02d", hours, minutes);
+ log_i("Sunrise: %s",gps.gpsData.sunriseHour);
+ log_i("Sunset: %s",gps.gpsData.sunsetHour);
}
/**
- * @brief Setup
+ * @brief Initialize the ESP32 GPS Navigator system
*
+ * @details Performs complete system initialization including hardware setup,
+ * peripheral configuration, storage initialization, display setup,
+ * GPS initialization, LVGL GUI setup, and optional web server configuration.
+ * Sets up mutexes, GPIO pins, I2C communication, sensors, file systems,
+ * and launches background tasks for GPS processing and CLI interface.
*/
void setup()
{
- gpsMutex = xSemaphoreCreateMutex();
- esp_log_level_set("*", ESP_LOG_DEBUG);
- esp_log_level_set("storage", ESP_LOG_DEBUG);
-
-// Force GPIO0 to internal PullUP during boot (avoid LVGL key read)
-#ifdef POWER_SAVE
- pinMode(BOARD_BOOT_PIN, INPUT_PULLUP);
-#ifdef ICENAV_BOARD
- gpio_hold_dis(GPIO_NUM_46);
- gpio_hold_dis((gpio_num_t)BOARD_BOOT_PIN);
- gpio_deep_sleep_hold_dis();
-#endif
-#endif
-
-#ifdef TDECK_ESP32S3
- pinMode(BOARD_POWERON, OUTPUT);
- digitalWrite(BOARD_POWERON, HIGH);
- pinMode(GPIO_NUM_16, INPUT);
- pinMode(SD_CS, OUTPUT);
- pinMode(RADIO_CS_PIN, OUTPUT);
- pinMode(TFT_SPI_CS, OUTPUT);
- digitalWrite(SD_CS, HIGH);
- digitalWrite(RADIO_CS_PIN, HIGH);
- digitalWrite(TFT_SPI_CS, HIGH);
- pinMode(SPI_MISO, INPUT_PULLUP);
-#endif
-
- Wire.setPins(I2C_SDA_PIN, I2C_SCL_PIN);
- Wire.begin();
-
-#ifdef BME280
- initBME();
-#endif
-
-#ifdef ENABLE_COMPASS
- compass.init();
-#endif
-
-#ifdef ENABLE_IMU
- initIMU();
-#endif
-
- storage.initSD();
- storage.initSPIFFS();
- battery.initADC();
-
- initTFT();
- createGpxFolders();
-
- mapView.initMap(TFT_HEIGHT - 100, TFT_WIDTH, TFT_HEIGHT);
-
- loadPreferences();
- gps.init();
- initLVGL();
-
- // Get init Latitude and Longitude
- gps.gpsData.latitude = gps.getLat();
- gps.gpsData.longitude = gps.getLon();
-
- initGpsTask();
-
-#ifndef DISABLE_CLI
- initCLI();
- initCLITask();
-#endif
-
- if (WiFi.status() == WL_CONNECTED)
- {
- if (!MDNS.begin(hostname))
- log_e("nDNS init error");
-
- log_i("mDNS initialized");
- }
-
- if (WiFi.status() == WL_CONNECTED && enableWeb)
- {
- configureWebServer();
- server.begin();
- }
-
- if (WiFi.getMode() == WIFI_OFF)
- ESP_ERROR_CHECK(esp_event_loop_create_default());
-
- splashScreen();
- lv_screen_load(searchSatScreen);
+ gpsMutex = xSemaphoreCreateMutex();
+ esp_log_level_set("*", ESP_LOG_DEBUG);
+ esp_log_level_set("storage", ESP_LOG_DEBUG);
+
+ lutInit = initTrigLUT();
+
+ // Force GPIO0 to internal PullUP during boot (avoid LVGL key read)
+ #ifdef POWER_SAVE
+ pinMode(BOARD_BOOT_PIN, INPUT_PULLUP);
+ #ifdef ICENAV_BOARD
+ gpio_hold_dis(GPIO_NUM_46);
+ gpio_hold_dis((gpio_num_t)BOARD_BOOT_PIN);
+ gpio_deep_sleep_hold_dis();
+ #endif
+ #endif
+
+ #ifdef TDECK_ESP32S3
+ pinMode(BOARD_POWERON, OUTPUT);
+ digitalWrite(BOARD_POWERON, HIGH);
+ pinMode(GPIO_NUM_16, INPUT);
+ pinMode(SD_CS, OUTPUT);
+ pinMode(RADIO_CS_PIN, OUTPUT);
+ pinMode(TFT_SPI_CS, OUTPUT);
+ digitalWrite(SD_CS, HIGH);
+ digitalWrite(RADIO_CS_PIN, HIGH);
+ digitalWrite(TFT_SPI_CS, HIGH);
+ pinMode(SPI_MISO, INPUT_PULLUP);
+ #endif
+
+ Wire.setPins(I2C_SDA_PIN, I2C_SCL_PIN);
+ Wire.begin();
+
+ #ifdef BME280
+ initBME();
+ #endif
+
+ #ifdef ENABLE_COMPASS
+ compass.init();
+ #endif
+
+ #ifdef ENABLE_IMU
+ initIMU();
+ #endif
+
+ storage.initSD();
+ storage.initSPIFFS();
+ battery.initADC();
+
+ initTFT();
+ createGpxFolders();
+
+ mapView.initMap(tft.height() - 27, tft.width());
+
+ loadPreferences();
+ gps.init();
+ initLVGL();
+ mapView.fillPolygons = mapSet.fillPolygons;
+
+ // Get init Latitude and Longitude
+ gps.gpsData.latitude = gps.getLat();
+ gps.gpsData.longitude = gps.getLon();
+
+ initGpsTask();
+
+ #ifndef DISABLE_CLI
+ initCLI();
+ initCLITask();
+ #endif
+
+ if (WiFi.status() == WL_CONNECTED)
+ {
+ if (!MDNS.begin(hostname))
+ log_e("nDNS init error");
+
+ log_i("mDNS initialized");
+ }
+
+ if (WiFi.status() == WL_CONNECTED && enableWeb)
+ {
+ configureWebServer();
+ server.begin();
+ }
+
+ if (WiFi.getMode() == WIFI_OFF)
+ ESP_ERROR_CHECK(esp_event_loop_create_default());
+
+ splashScreen();
+ lv_screen_load(searchSatScreen);
}
/**
- * @brief Main Loop
+ * @brief Main application loop
*
+ * @details Continuously processes the LVGL GUI timer handler, manages screen refresh timing,
+ * handles web server directory deletion operations, and processes GPS navigation
+ * when track data is loaded. Includes simulation mode for testing navigation
+ * without actual GPS movement and real-time navigation updates based on GPS speed.
*/
void loop()
{
- if (!waitScreenRefresh)
- {
- lv_timer_handler();
- vTaskDelay(pdMS_TO_TICKS(TASK_SLEEP_PERIOD_MS));
- }
-
- // Deleting recursive directories in webfile server
- if (enableWeb && deleteDir)
- {
- deleteDir = false;
- if (deleteDirRecursive(deletePath.c_str()))
- {
- updateList = true;
- eventRefresh.send("refresh", nullptr, millis());
- eventRefresh.send("Folder deleted", "updateStatus", millis());
- }
- }
-}
+ if (!waitScreenRefresh)
+ {
+ lv_timer_handler();
+ vTaskDelay(pdMS_TO_TICKS(TASK_SLEEP_PERIOD_MS));
+ }
+
+ // Deleting recursive directories in webfile server
+ if (enableWeb && deleteDir)
+ {
+ deleteDir = false;
+ if (deleteDirRecursive(deletePath.c_str()))
+ {
+ updateList = true;
+ eventRefresh.send("refresh", nullptr, millis());
+ eventRefresh.send("Folder deleted", "updateStatus", millis());
+ }
+ }
+
+ if (isTrackLoaded)
+ {
+ if (navSet.simNavigation)
+ gps.simFakeGPS(trackData,120,1000);
+
+ if (gps.gpsData.speed !=0)
+ {
+ // Use optimized NavConfig for simulation
+ NavConfig simConfig;
+ simConfig.searchWindow = 150; // Larger window for simulation
+ simConfig.offTrackThreshold = 75.0f; // More tolerant for simulation
+ simConfig.maxBackwardJump = 10; // Allow more backward movement
+
+ updateNavigation(gps.gpsData.latitude, gps.gpsData.longitude, gps.gpsData.heading, gps.gpsData.speed,
+ trackData, turnPoints, navState, 20, 200, simConfig);
+ }
+ }
+}
\ No newline at end of file
diff --git a/tools/mass_copy/README.md b/tools/mass_copy/README.md
new file mode 100644
index 00000000..18421b5f
--- /dev/null
+++ b/tools/mass_copy/README.md
@@ -0,0 +1,363 @@
+# Mass File Copy Script - User Manual
+
+A high-performance bash script optimized for copying millions of small files to external devices using rsync.
+
+## Overview
+
+This script solves the common problem of slow file transfers when dealing with millions of small files. Traditional copy methods can take hours, while this optimized approach reduces transfer time to minutes.
+
+## Features
+
+- β
**No compression issues** - Copies files exactly as they are
+- β
**Real-time progress monitoring** - See exactly what's being copied
+- β
**Resumable transfers** - Continue interrupted copies
+- β
**Optimized for millions of small files** - Much faster than traditional copy methods
+- β
**Built-in integrity verification** - Sample file verification
+- β
**No temporary files** - Direct copy without intermediate TAR files
+- β
**Performance metrics** - Speed and time statistics
+
+## Performance Comparison
+
+| Method | 1 Million Small Files | Notes |
+|--------|----------------------|-------|
+| **rsync script** | **15-30 minutes** | β
Recommended |
+| TAR + copy | 25-45 minutes | β οΈ Compression issues |
+| cp file-by-file | 60-120 minutes | β Very slow |
+
+## System Requirements
+
+### Operating System
+- Debian/Ubuntu Linux (tested)
+- Other Linux distributions (should work)
+- bash shell version 4.0 or higher
+
+### Hardware Requirements
+- Minimum 1GB RAM (more recommended for large datasets)
+- Sufficient storage space on destination device
+- USB 2.0 or higher port (USB 3.0+ recommended)
+
+### Permissions
+- sudo privileges for device mounting/unmounting
+- Read access to source directories
+- User should be in `disk` group (recommended)
+
+## Dependencies
+
+### Required (Usually Pre-installed)
+```bash
+# Check if installed
+which rsync
+which bash
+which mount
+```
+
+### Optional (Recommended)
+```bash
+# Install for enhanced file verification
+sudo apt install coreutils
+```
+
+### Adding User to Disk Group (Recommended)
+```bash
+# Add current user to disk group
+sudo usermod -a -G disk $USER
+
+# Verify group membership
+groups $USER
+
+# Log out and back in for changes to take effect
+```
+
+## Installation
+
+### Quick Installation
+1. Download the script file (`rsync_copy.sh`)
+2. Make it executable:
+ ```bash
+ chmod +x rsync_copy.sh
+ ```
+3. Optionally move to system PATH:
+ ```bash
+ sudo cp rsync_copy.sh /usr/local/bin/
+ ```
+
+### Verification
+```bash
+# Test script help
+./rsync_copy.sh --help
+
+# Check system dependencies
+rsync --version
+```
+
+## Usage
+
+### Basic Syntax
+```bash
+./rsync_copy.sh [SOURCE] [DESTINATION_MOUNT] [DEVICE]
+```
+
+### Parameter Description
+- **SOURCE**: Full path to directory containing files to copy
+- **DESTINATION_MOUNT**: Mount point where device will be mounted (e.g., `/mnt/backup`)
+- **DEVICE**: Device path (e.g., `/dev/sdb1`, `/dev/sdc1`)
+
+### Identifying Your Device
+```bash
+# List all storage devices
+lsblk
+
+# Detailed device information
+sudo fdisk -l
+
+# Monitor device connections
+dmesg | tail -20
+```
+
+Common device patterns:
+- USB drives: `/dev/sdb1`, `/dev/sdc1`
+- SD cards: `/dev/mmcblk0p1`, `/dev/mmcblk1p1`
+- External drives: `/dev/sdd1`, `/dev/sde1`
+
+## Examples
+
+### Basic Examples
+```bash
+# Copy documents to USB drive
+./rsync_copy.sh /home/user/documents /mnt/usb /dev/sdb1
+
+# Copy photos to SD card
+./rsync_copy.sh /home/user/photos /mnt/sd /dev/mmcblk0p1
+
+# Copy project files to external drive
+./rsync_copy.sh /var/www/html /mnt/backup /dev/sdc1
+```
+
+### Advanced Examples
+```bash
+# Copy with logging
+./rsync_copy.sh /source /dest /dev/sdb1 2>&1 | tee transfer.log
+
+# Copy specific subdirectory
+./rsync_copy.sh /home/user/projects/important /mnt/backup /dev/sdb1
+
+# Copy system files (as root)
+sudo ./rsync_copy.sh /etc /mnt/backup /dev/sdb1
+```
+
+## Step-by-Step Process
+
+### 1. Pre-Transfer Preparation
+The script automatically performs:
+- Device mounting with optimized settings
+- Space verification (source vs. destination)
+- File counting and time estimation
+- Device write speed testing
+
+### 2. Transfer Process
+- Real-time progress display
+- File-by-file transfer status
+- Speed monitoring
+- Error detection and reporting
+
+### 3. Post-Transfer Verification
+- File count comparison
+- Sample integrity checking
+- Performance summary
+- Safe device unmounting
+
+## Workflow Overview
+
+```
+Start β Mount Device β Verify Space β Count Files β
+Speed Test β Rsync Transfer β Verification β Unmount β Complete
+```
+
+## File Organization
+
+After successful transfer, files are organized as:
+```
+/mount/point/backup/
+βββ [original directory structure preserved]
+βββ file1.txt
+βββ file2.jpg
+βββ subdirectory/
+ βββ file3.doc
+ βββ file4.pdf
+```
+
+## Performance Optimization
+
+### For Best Performance
+- Use USB 3.0+ ports and devices
+- Ensure source is on fast storage (SSD preferred)
+- Close unnecessary applications during transfer
+- Use wired connections for network storage
+
+### File System Recommendations
+- **FAT32**: Good compatibility, 4GB file limit
+- **exFAT**: Better for large files, good compatibility
+- **ext4**: Best performance on Linux, limited Windows compatibility
+- **NTFS**: Good for Windows compatibility
+
+### Batch Processing Large Datasets
+For extremely large datasets (10M+ files):
+```bash
+# Split into batches
+./rsync_copy.sh /source/batch1 /mnt/backup1 /dev/sdb1
+./rsync_copy.sh /source/batch2 /mnt/backup2 /dev/sdc1
+```
+
+## Troubleshooting
+
+### Common Issues and Solutions
+
+#### Device Not Detected
+```bash
+# Check device connection
+lsblk | grep -E "(sd|mmcblk)"
+
+# Check USB connections
+lsusb
+
+# Reconnect device and check dmesg
+dmesg | tail -10
+```
+
+#### Permission Denied
+```bash
+# Check current user groups
+groups
+
+# Add user to necessary groups
+sudo usermod -a -G disk,plugdev $USER
+
+# Logout and login again
+```
+
+#### Mount Failures
+```bash
+# Manually unmount if stuck
+sudo umount /dev/sdX1
+
+# Check filesystem
+sudo fsck.fat -v /dev/sdX1 # For FAT32
+sudo fsck.exfat /dev/sdX1 # For exFAT
+```
+
+#### Slow Performance
+- Check for background processes: `top` or `htop`
+- Verify USB port speed: `lsusb -t`
+- Monitor I/O: `sudo iotop`
+- Check device health: `sudo smartctl -a /dev/sdX`
+
+#### Transfer Interruption
+Simply re-run the same command. rsync will automatically resume from where it left off.
+
+## Monitoring and Logging
+
+### Real-time Monitoring
+```bash
+# In another terminal, monitor progress
+watch -n 5 'df -h /mnt/backup'
+
+# Monitor transfer speed
+sudo iotop -p $(pgrep rsync)
+```
+
+### Logging Options
+```bash
+# Basic logging
+./rsync_copy.sh /source /dest /dev/sdb1 > transfer.log 2>&1
+
+# Timestamped logging
+./rsync_copy.sh /source /dest /dev/sdb1 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' | tee transfer.log
+```
+
+## Security Considerations
+
+### Data Safety
+- Script performs read-only operations on source
+- No source data is modified or deleted
+- Destination device is safely unmounted
+- Sample verification ensures data integrity
+
+### Permission Management
+- Requires sudo only for mounting operations
+- Preserves original file permissions
+- Respects file ownership where possible
+
+## Integration and Automation
+
+### Scheduled Backups
+```bash
+# Edit crontab
+crontab -e
+
+# Add weekly backup (Sundays at 2 AM)
+0 2 * * 0 /path/to/rsync_copy.sh /home/user/data /mnt/backup /dev/sdb1
+```
+
+### Script Integration
+```bash
+# Call from other scripts
+if ./rsync_copy.sh "$SOURCE" "$DEST" "$DEVICE"; then
+ echo "Backup successful"
+ # Additional actions
+else
+ echo "Backup failed"
+ # Error handling
+fi
+```
+
+## Performance Metrics
+
+The script provides detailed statistics:
+- **Transfer Time**: Total time for complete operation
+- **Average Speed**: MB/s throughout transfer
+- **Files per Second**: Processing rate
+- **Device Speed**: Baseline write performance
+- **Verification Results**: Integrity check status
+
+## Best Practices
+
+### Before Transfer
+1. Test with small dataset first
+2. Ensure adequate free space (20% margin recommended)
+3. Close unnecessary applications
+4. Use high-quality cables and ports
+
+### During Transfer
+1. Avoid disconnecting devices
+2. Don't run other intensive I/O operations
+3. Monitor for error messages
+4. Keep system powered (for laptops)
+
+### After Transfer
+1. Review verification results
+2. Test sample files on destination
+3. Keep transfer logs for reference
+4. Safely store backup devices
+
+## Support and Maintenance
+
+### Regular Updates
+- Check for script updates periodically
+- Update system packages: `sudo apt update && sudo apt upgrade`
+- Verify dependency versions
+
+### Performance Monitoring
+- Keep transfer logs for trend analysis
+- Monitor device health regularly
+- Replace aging storage devices proactively
+
+## Limitations
+
+- Requires sudo privileges for mounting
+- Limited to devices with standard filesystems
+- Not suitable for encrypted devices (without manual setup)
+- Performance depends on source and destination device speeds
+
+---
+
+**Note**: Always test with non-critical data first. Ensure proper backups exist before running large-scale transfers.
\ No newline at end of file
diff --git a/tools/mass_copy/rsync_copy.sh b/tools/mass_copy/rsync_copy.sh
new file mode 100755
index 00000000..7998773f
--- /dev/null
+++ b/tools/mass_copy/rsync_copy.sh
@@ -0,0 +1,309 @@
+#!/bin/bash
+set -e
+
+# Fast mass copy using rsync with intelligent sync
+# Usage: ./rsync_copy.sh [SOURCE] [DESTINATION] [DEVICE]
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+# Function to show help
+show_help() {
+ echo -e "${BLUE}=== FAST MASS COPY WITH RSYNC ===${NC}"
+ echo ""
+ echo "Usage: $0 [SOURCE] [DESTINATION] [DEVICE]"
+ echo ""
+ echo "Features:"
+ echo " - Intelligent sync (only copies changed files)"
+ echo " - Built-in progress monitoring"
+ echo " - Resumable transfers"
+ echo " - Optimized for many small files"
+ echo " - Real-time speed display"
+ echo " - Preserves source folder name"
+ echo " - Automatic cleanup of obsolete files"
+ echo ""
+ echo "Examples:"
+ echo " $0 /home/user/files /mnt/sd /dev/sdc1"
+ echo " $0 /home/user/data /media/usb /dev/sdb1"
+ echo ""
+ exit 0
+}
+
+# Verify parameters
+if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
+ show_help
+fi
+
+if [ $# -lt 3 ]; then
+ echo -e "${RED}Error: 3 parameters required${NC}"
+ echo "Usage: $0 [SOURCE] [DESTINATION] [DEVICE]"
+ echo "Run '$0 --help' for more information"
+ exit 1
+fi
+
+SOURCE="$1"
+DESTINATION="$2"
+DEVICE="$3"
+
+# Extract source folder name
+SOURCE_FOLDER_NAME=$(basename "$SOURCE")
+
+# Validate inputs
+if [ ! -d "$SOURCE" ]; then
+ echo -e "${RED}Error: Source directory '$SOURCE' does not exist${NC}"
+ exit 1
+fi
+
+if [ ! -b "$DEVICE" ]; then
+ echo -e "${RED}Error: Device '$DEVICE' does not exist${NC}"
+ exit 1
+fi
+
+# Cleanup function
+cleanup() {
+ echo -e "${YELLOW}Cleaning up...${NC}"
+ if mountpoint -q "$DESTINATION" 2>/dev/null; then
+ sudo umount "$DESTINATION" 2>/dev/null || true
+ fi
+}
+
+trap cleanup EXIT INT TERM
+
+echo -e "${BLUE}=== FAST MASS COPY WITH RSYNC ===${NC}"
+echo -e "${BLUE}Start: $(date)${NC}"
+echo ""
+echo "Configuration:"
+echo " Source: $SOURCE"
+echo " Source folder name: $SOURCE_FOLDER_NAME"
+echo " Destination: $DESTINATION"
+echo " Device: $DEVICE"
+echo " Mode: Intelligent sync (only changed files)"
+echo ""
+
+# STEP 1: Mount device
+echo -e "${YELLOW}1. Mounting device...${NC}"
+sudo mkdir -p "$DESTINATION"
+sudo umount "$DEVICE" 2>/dev/null || true
+
+# Mount with optimizations for many small files
+sudo mount -t vfat -o rw,uid=$(id -u),gid=$(id -g),umask=0022,async,noatime,nodiratime "$DEVICE" "$DESTINATION"
+
+if ! mountpoint -q "$DESTINATION"; then
+ echo -e "${RED}Error: Could not mount $DEVICE at $DESTINATION${NC}"
+ exit 1
+fi
+
+echo -e "${GREEN} β Device mounted successfully${NC}"
+
+# STEP 2: Space verification
+echo -e "${YELLOW}2. Verifying available space...${NC}"
+
+# Get source size in bytes
+SOURCE_SIZE=$(du -sb "$SOURCE" | cut -f1)
+echo " Source size: $(du -sh "$SOURCE" | cut -f1)"
+
+# Initialize with default
+DESTINATION_FREE="0"
+
+# Method 1: Try df -B1 (most compatible)
+DF_OUTPUT=$(df -B1 "$DESTINATION" 2>/dev/null | tail -n 1)
+if [ -n "$DF_OUTPUT" ]; then
+ # Extract available space (4th column)
+ DESTINATION_FREE=$(echo "$DF_OUTPUT" | awk '{print $4}' | grep -E '^[0-9]+$' || echo "0")
+fi
+
+# Method 2: Fallback to df with KB
+if [ "$DESTINATION_FREE" = "0" ]; then
+ DF_KB=$(df "$DESTINATION" 2>/dev/null | tail -1 | awk '{print $4}' | tr -d 'K' | grep -E '^[0-9]+$' || echo "0")
+ if [ "$DF_KB" != "0" ]; then
+ DESTINATION_FREE=$((DF_KB * 1024))
+ fi
+fi
+
+# Ensure DESTINATION_FREE is numeric
+if ! [[ "$DESTINATION_FREE" =~ ^[0-9]+$ ]]; then
+ DESTINATION_FREE="0"
+fi
+
+echo " Free space: $(echo "$DESTINATION_FREE" | awk '{printf "%.1fG", $1/1024/1024/1024}')"
+
+# Check space only if we have valid numbers
+if [ "$DESTINATION_FREE" -gt 0 ] && [[ "$SOURCE_SIZE" =~ ^[0-9]+$ ]]; then
+ REQUIRED_SPACE=$((SOURCE_SIZE + SOURCE_SIZE / 10))
+ echo " Required space (with 10% margin): $(echo "$REQUIRED_SPACE" | awk '{printf "%.1fG", $1/1024/1024/1024}')"
+
+ if [ "$REQUIRED_SPACE" -gt "$DESTINATION_FREE" ]; then
+ echo -e "${RED}Error: Not enough space at destination${NC}"
+ echo " Required: $(echo "$REQUIRED_SPACE" | awk '{printf "%.1fG", $1/1024/1024/1024}')"
+ echo " Available: $(echo "$DESTINATION_FREE" | awk '{printf "%.1fG", $1/1024/1024/1024}')"
+ exit 1
+ fi
+ echo -e "${GREEN} β Sufficient space available${NC}"
+else
+ echo -e "${YELLOW} Warning: Could not verify space accurately, proceeding...${NC}"
+ echo " Debug: DESTINATION_FREE='$DESTINATION_FREE', SOURCE_SIZE='$SOURCE_SIZE'"
+fi
+
+# STEP 3: Analyze sync requirements
+echo -e "${YELLOW}3. Analyzing sync requirements...${NC}"
+
+TOTAL_FILES=$(find "$SOURCE" -type f 2>/dev/null | wc -l)
+echo " Source files: $TOTAL_FILES"
+
+# Check if destination exists to determine sync type
+if [ -d "$DESTINATION/$SOURCE_FOLDER_NAME" ]; then
+ DEST_FILES=$(find "$DESTINATION/$SOURCE_FOLDER_NAME" -type f 2>/dev/null | wc -l)
+ echo " Existing destination files: $DEST_FILES"
+ echo " Sync mode: Update existing destination"
+else
+ echo " Sync mode: Initial copy (destination doesn't exist)"
+fi
+
+# STEP 4: Device speed test
+echo -e "${YELLOW}4. Testing device write speed...${NC}"
+TEST_START=$(date +%s)
+dd if=/dev/zero of="$DESTINATION/speedtest.tmp" bs=10M count=1 oflag=direct status=none 2>/dev/null || true
+TEST_END=$(date +%s)
+TEST_TIME=$((TEST_END - TEST_START))
+if [ $TEST_TIME -eq 0 ]; then TEST_TIME=1; fi
+WRITE_SPEED=$((10 / TEST_TIME))
+rm -f "$DESTINATION/speedtest.tmp"
+
+echo " Write speed: ~${WRITE_SPEED}MB/s"
+
+# STEP 5: Rsync sync with intelligent behavior
+echo -e "${YELLOW}5. Starting intelligent sync...${NC}"
+echo " Destination folder: $DESTINATION/$SOURCE_FOLDER_NAME/"
+echo " Rsync will:"
+echo " - Only copy new/modified files"
+echo " - Remove files from destination that no longer exist in source"
+echo " - Resume interrupted transfers"
+echo ""
+
+RSYNC_START=$(date +%s)
+
+# Rsync with intelligent sync - only copies what's needed
+rsync -a \
+ --info=progress2 \
+ --partial \
+ --inplace \
+ --no-compress \
+ --delete-during \
+ --prune-empty-dirs \
+ --human-readable \
+ "$SOURCE/" "$DESTINATION/$SOURCE_FOLDER_NAME/"
+
+# Check rsync exit status
+RSYNC_EXIT_CODE=$?
+if [ $RSYNC_EXIT_CODE -ne 0 ]; then
+ echo -e "${RED}Error: rsync failed with exit code $RSYNC_EXIT_CODE${NC}"
+ exit 1
+fi
+
+RSYNC_END=$(date +%s)
+RSYNC_TIME=$((RSYNC_END - RSYNC_START))
+
+echo ""
+echo -e "${GREEN} β Sync completed successfully${NC}"
+
+# STEP 6: Verification
+echo -e "${YELLOW}6. Verifying sync result...${NC}"
+
+DEST_FILES_FINAL=$(find "$DESTINATION/$SOURCE_FOLDER_NAME" -type f 2>/dev/null | wc -l)
+DEST_SIZE=$(du -sh "$DESTINATION/$SOURCE_FOLDER_NAME" 2>/dev/null | cut -f1)
+
+echo " Source files: $TOTAL_FILES"
+echo " Destination files: $DEST_FILES_FINAL"
+echo " Source size: $(du -sh "$SOURCE" | cut -f1)"
+echo " Destination size: $DEST_SIZE"
+
+if [ "$TOTAL_FILES" -eq "$DEST_FILES_FINAL" ]; then
+ echo -e "${GREEN} β File count matches perfectly${NC}"
+else
+ DIFF=$((TOTAL_FILES - DEST_FILES_FINAL))
+ echo -e "${YELLOW} Warning: File count difference: $DIFF files${NC}"
+fi
+
+# STEP 7: Sample integrity check
+echo -e "${YELLOW}7. Sample integrity check...${NC}"
+echo " Checking 10 random files..."
+
+SAMPLE_COUNT=0
+SAMPLE_ERRORS=0
+
+for file in $(find "$SOURCE" -type f 2>/dev/null | shuf | head -10); do
+ SAMPLE_COUNT=$((SAMPLE_COUNT + 1))
+ rel_path=${file#$SOURCE/}
+ dest_file="$DESTINATION/$SOURCE_FOLDER_NAME/$rel_path"
+
+ if [ -f "$dest_file" ]; then
+ if cmp -s "$file" "$dest_file" 2>/dev/null; then
+ echo " β $rel_path"
+ else
+ echo " β $rel_path (content differs)"
+ SAMPLE_ERRORS=$((SAMPLE_ERRORS + 1))
+ fi
+ else
+ echo " β $rel_path (missing)"
+ SAMPLE_ERRORS=$((SAMPLE_ERRORS + 1))
+ fi
+done
+
+if [ $SAMPLE_ERRORS -eq 0 ]; then
+ echo -e "${GREEN} β Sample verification passed (${SAMPLE_COUNT}/${SAMPLE_COUNT} files OK)${NC}"
+else
+ echo -e "${YELLOW} Warning: $SAMPLE_ERRORS/$SAMPLE_COUNT sample files had issues${NC}"
+fi
+
+# STEP 8: Final sync and unmount
+echo -e "${YELLOW}8. Finalizing...${NC}"
+echo " Syncing filesystem..."
+sync
+sleep 2
+
+echo " Unmounting device..."
+sudo umount "$DESTINATION"
+sleep 1
+
+echo -e "${GREEN} β Device unmounted safely${NC}"
+
+# Calculate performance stats
+TOTAL_TIME=$RSYNC_TIME
+if [ $TOTAL_TIME -gt 0 ]; then
+ AVG_SPEED=$((SOURCE_SIZE / 1024 / 1024 / TOTAL_TIME))
+ FILES_PER_SEC=$((TOTAL_FILES / TOTAL_TIME))
+else
+ AVG_SPEED="N/A"
+ FILES_PER_SEC="N/A"
+fi
+
+echo ""
+echo -e "${GREEN}=== SYNC COMPLETED SUCCESSFULLY ===${NC}"
+echo -e "${GREEN}End: $(date)${NC}"
+echo ""
+echo "Performance Summary:"
+echo " Files processed: $TOTAL_FILES"
+echo " Data size: $(du -sh "$SOURCE" | cut -f1)"
+echo " Sync time: ${TOTAL_TIME}s ($((TOTAL_TIME / 60))m $((TOTAL_TIME % 60))s)"
+echo " Average speed: ${AVG_SPEED}MB/s"
+echo " Files/second: $FILES_PER_SEC"
+echo " Device write speed: ~${WRITE_SPEED}MB/s"
+echo " Sample verification: $((SAMPLE_COUNT - SAMPLE_ERRORS))/$SAMPLE_COUNT files OK"
+echo ""
+echo "Files synced to: $DESTINATION/$SOURCE_FOLDER_NAME/"
+echo ""
+echo -e "${BLUE}Rsync intelligently synced only new/modified files${NC}"
+echo -e "${BLUE}Next sync will be faster as only changes will be copied${NC}"
+
+# Final status
+if [ $SAMPLE_ERRORS -eq 0 ]; then
+ echo -e "${GREEN}β SYNC SUCCESSFUL - All verifications passed${NC}"
+ exit 0
+else
+ echo -e "${YELLOW}β SYNC COMPLETED with verification warnings${NC}"
+ exit 1
+fi
\ No newline at end of file