├── .github └── workflows │ └── build.yml ├── .gitignore ├── LICENSE ├── README.md ├── docs ├── Arduino_UNO_R4_WiFi.md ├── Boards │ ├── BlackPill-Witty.fzz │ ├── BlackPill-Witty.png │ ├── Nano-ESP01.fzz │ ├── Nano-ESP01.png │ ├── PiPico-XBee.fzz │ ├── PiPico-XBee.png │ ├── ProMicro-WT32-ETH01.fzz │ ├── ProMicro-WT32-ETH01.png │ ├── ProMicro-Witty.fzz │ ├── ProMicro-Witty.png │ ├── README.md │ └── convert_all.py ├── BuildYourOwn.md ├── Images │ ├── AddNewDeviceQR.png │ ├── BlynkNCP.png │ └── Uno-R4-Jumper.png └── RestoreFirmware.md ├── include ├── BlynkLogoBlack96.h ├── NotoSansBold15.h ├── TPicoC3_config.h ├── WioTerminalBacklight.h └── WioTerminal_config.h ├── lib └── README ├── platformio.ini ├── src ├── ArduinoUtils.h ├── BoardSetup.h └── main.cpp └── tools ├── .gitignore ├── BlynkNcpFlasher ├── .gitignore ├── platformio.ini └── src │ ├── loop_baud_check.h │ ├── loop_nina.h │ ├── loop_renesas.h │ ├── loop_simple.h │ ├── loop_vidor.h │ ├── loop_wio_terminal.h │ ├── main.cpp │ └── passthrough.h ├── blynk_tag.py ├── extra_ota_bin.py ├── extra_upload_ncp.py └── flash_wio_terminal.py /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: PlatformIO CI 2 | 3 | on: 4 | push: 5 | paths-ignore: ['**.md', '**.svg', '**.png', '**.fzz'] 6 | pull_request: 7 | paths-ignore: ['**.md', '**.svg', '**.png', '**.fzz'] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/cache@v3 16 | with: 17 | path: | 18 | ~/.cache/pip 19 | ~/.platformio/.cache 20 | key: ${{ runner.os }}-pio 21 | - uses: actions/setup-python@v4 22 | with: 23 | python-version: '3.9' 24 | - name: Install PlatformIO Core 25 | run: pip install --upgrade platformio 26 | # needed for [env:linux] build 27 | - name: Install Dependencies (libserialport) 28 | run: | 29 | git clone git://sigrok.org/libserialport 30 | cd libserialport/ 31 | ./autogen.sh 32 | ./configure 33 | make -j4 34 | sudo make install 35 | cd .. 36 | - name: Build Example Project 37 | run: | 38 | # uncomment the #define BLYNK_TEMPLATE etc. to not get compile errors 39 | sed -i 's\//#define BLYNK_\#define BLYNK_\g' src/main.cpp 40 | pio run 41 | - name: Build BlynkNcpFlasher 42 | run: | 43 | pio run --project-dir tools/BlynkNcpFlasher 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/** 2 | .DS_Store 3 | .pio/ 4 | .vscode/ 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Blynk.NCP integration for Arduino 3 | 4 | [![Issues](https://img.shields.io/github/issues/Blynk-Technologies/Blynk-NCP-Driver.svg)](https://github.com/Blynk-Technologies/Blynk-NCP-Driver/issues) 5 | [![Downloads](https://img.shields.io/github/downloads/Blynk-Technologies/Blynk-NCP-Driver/total)](https://github.com/Blynk-Technologies/Blynk-NCP-Driver/releases/latest) 6 | [![CI Status](https://img.shields.io/github/actions/workflow/status/Blynk-Technologies/Blynk-NCP-Example-Arduino/build.yml?branch=main&logo=github&label=tests)](https://github.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/actions) 7 | [![License](https://img.shields.io/github/license/Blynk-Technologies/Blynk-NCP-Example-Arduino?color=blue)](LICENSE) 8 | [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua) 9 | 10 | **Blynk.NCP** is a solution that off-loads connectivity to a **Network Co-Processor (NCP)** while your application logic resides on the **Primary MCU**. This implies a [dual-Microcontroller Unit (MCU)](https://docs.google.com/presentation/d/1aP2sQWB0J9EWj8Y1h5qeyfm2aFwaNSUKnCE-k7zxVnk/present) architecture. 11 | 12 | [**Read more about Blynk.NCP**](https://github.com/Blynk-Technologies/Blynk-NCP-Driver) 13 | 14 | ### Supported Dual-MCU Boards 15 | This example project is compatible with a set of ready-to-use Dual-MCU boards: 16 | 17 | Board | | 🔄 MCU / NCP | 🌐 | ⚙️ | 🗃️ 18 | :-- | --- | :--- | :--- | :--- | :--- 19 | [UNO R4 WiFi][1] | `unoR4wifi` | `✅ / ✅` | WiFi 2.4 | BLE | 4.25 MB 20 | [Portenta C33][2] | `portentaC33` | `⏳ / ✅` | WiFi 2.4 | BLE | 512 KB 21 | [Nano RP2040 Connect][3] | `rp2040connect` | `✅ / ❌` | WiFi 2.4 | BLE | 384 KB 22 | [Nano 33 IoT][4] | `nano33iot` | `✅ / ❌` | WiFi 2.4 | BLE | 384 KB 23 | [MKR WiFi 1010][5] | `mkrwifi1010` | `✅ / ❌` | WiFi 2.4 | BLE | 384 KB 24 | [T-PicoC3][6] | `t_pico_c3` | `✅ / ✅` | WiFi 2.4 | BLE | 512 KB 25 | [RPi Pico][7] + [ESP8266][8] | `pico_esp8266` | `✅ / ✅` | WiFi 2.4 | WiFiAP | 1000 KB 26 | [Wio Terminal][9] | `⏳` | `✅ / ❔` | WiFi 2.4/5 | BLE | ❔ 27 | 28 | 🔄 Over-the-Air Updates, 🌐 Connectivity, ⚙️ Provisioning, 🗃️ File System 29 | 30 | ### Custom Boards 31 | You can also [add one of the supported connectivity modules](docs/BuildYourOwn.md) to your custom board. 32 | 33 | ## Getting started 34 | 35 | 1. This is a **PlatformIO** project. Please install the [**VSCode plugin**][pio_vscode] or [**PlatformIO CLI**][pio_cli]. 36 | 2. Clone [this repository][self] using `git` or download it as a [`ZIP` file][self_zip]. 37 | 3. Flash the Blynk.NCP firmware (***replace `nano33iot` with your board type***): 38 | 39 | ```sh 40 | pio run -e nano33iot -t upload_ncp 41 | ``` 42 | 43 | > [!WARNING] 44 | > This overwrites both the Main MCU and the connectivity module firmware. 45 | > You can [restore the stock firmware][restore] easily. 46 | 4. Open `src/main.cpp` and fill in [information from your Blynk Template](https://bit.ly/BlynkInject): 47 | 48 | ```cpp 49 | #define BLYNK_TEMPLATE_ID "TMPxxxxxx" 50 | #define BLYNK_TEMPLATE_NAME "MyDevice" 51 | ``` 52 | 5. Upload the example project and run the serial monitor: 53 | 54 | ```sh 55 | pio run -e nano33iot -t upload -t monitor 56 | ``` 57 | 6. Use the Blynk iOS/Android app to configure your new device. 58 | Ensure that the Blynk App is installed on your smartphone. 59 | Open the `Blynk App` -> click `Add New Device` -> select `Find Devices Nearby` 60 | 61 | ## Troubleshooting 62 | 63 | If something doesn't work, try some of these solutions: 64 | 65 | - If your board is based on a `Raspberry Pi RP2040` chip, it may fail to work on Windows. Please apply [this fix][fix_windows_rp2040] 66 | - On `TTGO T-Pico C3`, you may need to connect `IO9` pin to `GND` to flash the NCP firmware 67 | - Upgrade PlatformIO to the latest version. Run: `pio upgrade` 68 | - Upgrade packages to the latest version. Run: `pio pkg update --no-save` 69 | 70 | ## Report an issue 71 | 72 | Issues are maintained in the [Blynk NCP Driver](https://github.com/Blynk-Technologies/Blynk-NCP-Driver/issues) repository. 73 | 74 | ## Disclaimer 75 | 76 | > The community edition of Blynk.NCP is available for personal use and evaluation. 77 | > If you're interested in using Blynk.NCP for commercial applications, feel free to [contact Blynk][blynk_sales]. Thank you! 78 | 79 | 80 | [self]: https://github.com/Blynk-Technologies/Blynk-NCP-Example-Arduino 81 | [self_zip]: https://github.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/archive/refs/heads/main.zip 82 | [blynk_sales]: https://blynk.io/en/contact-us-business 83 | [pio_vscode]: https://docs.platformio.org/en/stable/integration/ide/vscode.html#ide-vscode 84 | [pio_cli]: https://docs.platformio.org/en/stable/core/index.html 85 | [restore]: ./docs/RestoreFirmware.md 86 | [arduino_ide]: https://github.com/Blynk-Technologies/blynk-library/blob/master/examples/Blynk.Edgent/Edgent_NCP/Edgent_NCP.ino 87 | [fix_windows_rp2040]: https://arduino-pico.readthedocs.io/en/latest/platformio.html#important-steps-for-windows-users-before-installing 88 | 89 | [1]: https://store-usa.arduino.cc/products/uno-r4-wifi 90 | [2]: https://store-usa.arduino.cc/products/portenta-c33 91 | [3]: https://store-usa.arduino.cc/products/arduino-nano-rp2040-connect 92 | [4]: https://store-usa.arduino.cc/products/arduino-nano-33-iot 93 | [5]: https://store-usa.arduino.cc/products/arduino-mkr-wifi-1010 94 | [6]: https://www.lilygo.cc/products/lilygo%C2%AE-t-picoc3-esp32-c3-rp2040-1-14-inch-lcd-st7789v 95 | [7]: https://www.raspberrypi.com/products/raspberry-pi-pico 96 | [8]: https://www.waveshare.com/pico-esp8266.htm 97 | [9]: https://www.seeedstudio.com/Wio-Terminal-p-4509.html 98 | 99 | -------------------------------------------------------------------------------- /docs/Arduino_UNO_R4_WiFi.md: -------------------------------------------------------------------------------- 1 | # Arduino UNO R4 WiFi 2 | 3 | > __Note__: we're not responsible for any possible board damage, etc. Proceed at your own risk! 4 | 5 | ## 1. Switch the `UNO R4 WiFi` into ESP mode, upload `Blynk.NCP` firmware 6 | 7 | 1. Disconnect the UNO R4 WiFi from your PC 8 | 2. Short the pins highlighted in the image using a jumper wire: 9 | 10 | ![ESP32-S3 mode selection jumper](./Images/Uno-R4-Jumper.png) 11 | 12 | 3. Connect the UNO R4 WiFi to your PC 13 | 4. Upload ESP32 firmware: 14 | 15 | ```sh 16 | pio run -e unoR4wifi -t upload_ncp 17 | ``` 18 | 19 | ## 2. Upload the main MCU (Renesas) firmware 20 | 21 | 1. Disconnect the UNO R4 WiFi from your PC 22 | 2. **Unplug the jumper wire** 23 | 3. Connect the board again 24 | 4. Edit `src/main.cpp` to include your Blynk Template info, then run: 25 | ```sh 26 | pio run -e unoR4wifi -t upload -t monitor 27 | ``` 28 | 5. The expected Serial Monitor output: 29 | ```log 30 | [105] Main firmware: 0.1.0 31 | [107] Build: Jul 11 2023 14:29:58 32 | [215] NCP responding (baud 115200, 2363 us) 33 | [245] NCP responding (baud 460800, 1285 us) 34 | [250] Blynk.NCP firmware: 0.6.1 35 | [316] State: Configuring 36 | ``` 37 | 38 | ## 3. Use the Blynk iOS/Android app to configure your new device 39 | 40 | 1. Ensure that the Blynk App is installed on your smartphone and scan this QR code: 41 | Add New Device QR 42 | 43 | > __Note__: Alternatively, open the `Blynk App` -> click `Add New Device` -> select `Find Devices Nearby` 44 | 2. Follow the configuration wizard 45 | 3. The expected Serial Monitor output: 46 | ``` 47 | [23299] State: Connecting Cloud 48 | [23360] State: Connected 49 | [23362] Connected to Blynk 🙌 50 | ``` 51 | -------------------------------------------------------------------------------- /docs/Boards/BlackPill-Witty.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/BlackPill-Witty.fzz -------------------------------------------------------------------------------- /docs/Boards/BlackPill-Witty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/BlackPill-Witty.png -------------------------------------------------------------------------------- /docs/Boards/Nano-ESP01.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/Nano-ESP01.fzz -------------------------------------------------------------------------------- /docs/Boards/Nano-ESP01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/Nano-ESP01.png -------------------------------------------------------------------------------- /docs/Boards/PiPico-XBee.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/PiPico-XBee.fzz -------------------------------------------------------------------------------- /docs/Boards/PiPico-XBee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/PiPico-XBee.png -------------------------------------------------------------------------------- /docs/Boards/ProMicro-WT32-ETH01.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/ProMicro-WT32-ETH01.fzz -------------------------------------------------------------------------------- /docs/Boards/ProMicro-WT32-ETH01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/ProMicro-WT32-ETH01.png -------------------------------------------------------------------------------- /docs/Boards/ProMicro-Witty.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/ProMicro-Witty.fzz -------------------------------------------------------------------------------- /docs/Boards/ProMicro-Witty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Boards/ProMicro-Witty.png -------------------------------------------------------------------------------- /docs/Boards/README.md: -------------------------------------------------------------------------------- 1 | Raspberry Pi Pico - XBeeArduino Nano - ESP01SparkFun Pro Micro 3.3v - WT32-ETH01SparkFun Pro Micro 3.3v - Witty Cloud 2 | WeAct Black Pill V2.0 - Witty Cloud 3 | -------------------------------------------------------------------------------- /docs/Boards/convert_all.py: -------------------------------------------------------------------------------- 1 | import os 2 | import glob 3 | import tinify 4 | 5 | tinify.key = "" 6 | 7 | for fn in list(glob.glob('*.pdf')): 8 | print(f"Converting {fn} to PNG") 9 | orig_png = fn.replace('.pdf', '.orig.png') 10 | png = fn.replace('.pdf', '.png') 11 | os.system(f'convert -density 600 -alpha remove -alpha off "{fn}" "{orig_png}"') 12 | #-fuzz 4% -fill none -draw "color 0,0 floodfill" 13 | #-trim 14 | 15 | print(f"Optimizing {orig_png}") 16 | source = tinify.from_file(orig_png) 17 | source.to_file(png) 18 | 19 | # Cleanup 20 | #os.remove(fn) 21 | os.remove(orig_png) 22 | 23 | -------------------------------------------------------------------------------- /docs/BuildYourOwn.md: -------------------------------------------------------------------------------- 1 | # Building a new device using Blynk.NCP 2 | 3 | ![Blynk.NCP connection](./Images/BlynkNCP.png) 4 | 5 | ## Components Used in This Project 6 | 7 | You will need: 8 | 9 | - Raspberry Pi Pico 10 | - One of the [supported connectivity modules][supported_modules] 11 | - An adapter/breakout board for your connectivity module (in some cases) 12 | - Breadboard and some jumper wires 13 | 14 | ## 1. Flash `Blynk.NCP` firmware to your connectivity module 15 | 16 | Please follow the official firmware flashing guide. This is usually provided by the module vendor. 17 | Blynk.NCP is shipped as a combined firmware, so you only need to flash a single file (flash at address `0`). 18 | Select the [firmware file, corresponding to your module type][supported_modules]. 19 | 20 | To verify that `Blynk.NCP` is flashed correctly and running, check the **UART0** output (38400 or 115200, 8N1) of the module, right after the power-up: 21 | 22 | ```log 23 | <...bootloader output...> 24 | [rpc port] Blynk.NCP started 25 | Version: 0.x.x, Build: Jul 6 2023 16:56:18 26 | ``` 27 | 28 | After printing this bootlog identification, the device waits for the `BlynkNcpDriver` connection on the same port. 29 | 30 | ## 2. Assemble the board 31 | 32 | Connect Blynk.NCP to the Primary MCU of your choice (i.e. `STM32`, `ATmega`, `RP2040`, `ATSAMD`, `K210`, ...) using UART. 33 | Here are some examples: 34 | 35 | | Arduino Nano + ESP01 | RPi Pico + XBee modules (Macchina SuperB, DFRobot WiFi Bee) | Pro Micro + WT32 ETH01 | Pro Micro + Witty Cloud | 36 | | --- | --- | --- | --- | 37 | | ![1](./Boards/Nano-ESP01.png) | ![1](./Boards/PiPico-XBee.png) | ![1](./Boards/ProMicro-WT32-ETH01.png) | ![1](./Boards/ProMicro-Witty.png) | 38 | 39 | ## 3. Use the Blynk library to communicate with the NCP 40 | 41 | The official [`Blynk library`](https://github.com/blynkkk/blynk-library) provides everything needed to work with **Blynk.NCP**. 42 | 43 | 1. Use [this example](https://github.com/blynkkk/BlynkNcpExample) 44 | 2. Open `src/main.cpp` and fill in [information from your Blynk Template](https://bit.ly/BlynkInject): 45 | 46 | ```cpp 47 | #define BLYNK_TEMPLATE_ID "TMPxxxxxx" 48 | #define BLYNK_TEMPLATE_NAME "MyDevice" 49 | ``` 50 | 3. Run the example on your **Primary MCU**: 51 | 52 | ```sh 53 | pio run -e pico -t upload -t monitor 54 | ``` 55 | The expected debug output looks like this: 56 | 57 | ```log 58 | [1345] NCP responding (baud 115200, 2289 us) 59 | [1349] Blynk.NCP firmware: x.x.x 60 | [1684] State: Configuration 61 | ``` 62 | 63 | > __Note__: Blynk C++ library uses [`BlynkNcpDriver`](https://github.com/blynkkk/BlynkNcpDriver) internally to talk to the NCP. 64 | You can use this low-level, `C99` compatible library with minimal dependencies directly if you prefer. See [BlynkNcpDriver example](https://github.com/blynkkk/BlynkNcpDriver/blob/main/examples/BlynkNCP_LowLevel/BlynkNCP_LowLevel.ino). 65 | 66 | ## 4. Use the Blynk iOS/Android app to configure your new device 67 | 68 | Ensure that the Blynk App is installed on your smartphone. 69 | Open the `Blynk App` -> click `Add New Device` -> select `Find Devices Nearby` 70 | 71 | ## 5. Next steps 72 | 73 | When using `BlynkNcpDriver` directly or integrating `Blynk.NCP` with non-Arduino boards, additional development may be needed to support features like the primary MCU OTA upgrades, Real-Time Clock integration, etc. 74 | 75 | Please check out the [BlynkNcpDriver docs](https://github.com/blynkkk/BlynkNcpDriver/tree/main/docs) for further details. 76 | 77 | ## Disclaimer 78 | 79 | > The community edition of Blynk.NCP is available for personal use and evaluation. 80 | If you're interested in using Blynk.NCP for commercial applications, feel free to [contact Blynk][blynk_sales]. Thank you! 81 | 82 | [supported_modules]: https://docs.blynk.io/en/getting-started/supported-boards#connectivity-modules-supported-by-blynk.ncp 83 | [blynk_sales]: https://blynk.io/en/contact-us-business 84 | -------------------------------------------------------------------------------- /docs/Images/AddNewDeviceQR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Images/AddNewDeviceQR.png -------------------------------------------------------------------------------- /docs/Images/BlynkNCP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Images/BlynkNCP.png -------------------------------------------------------------------------------- /docs/Images/Uno-R4-Jumper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blynk-Technologies/Blynk-NCP-Example-Arduino/1374b6c622b39d14ba4cfe264c1ae26f1b488ab7/docs/Images/Uno-R4-Jumper.png -------------------------------------------------------------------------------- /docs/RestoreFirmware.md: -------------------------------------------------------------------------------- 1 | # Restoring the original firmware 2 | 3 | Board | Instructions 4 | :-- | :--- 5 | Arduino MKR/Nano | [The official guide][wifinina], start directly from **`Update the firmware`** step 6 | Arduino UNO R4 WiFi | [The official WiFi-S3 firmware][unoR4wifi] 7 | Arduino Portenta C33 | [The official WiFi-C3 firmware][portentaC33] 8 | Waveshare Pico ESP8266 | [The official wiki][pico8266], scroll down to the **`Download AT Firmware`** section 9 | 10 | [wifinina]: https://support.arduino.cc/hc/en-us/articles/360013896579-Check-and-update-the-firmware-for-WiFiNINA-and-WiFi101 11 | [unoR4wifi]: https://github.com/arduino/uno-r4-wifi-usb-bridge/releases/latest 12 | [portentaC33]: https://github.com/arduino/ArduinoCore-renesas/tree/main/libraries/WiFi/extra 13 | [pico8266]: https://www.waveshare.com/wiki/Pico-ESP8266 14 | -------------------------------------------------------------------------------- /include/NotoSansBold15.h: -------------------------------------------------------------------------------- 1 | /* A font vlw file can be converted to a byte array using: 2 | 3 | https://tomeko.net/online_tools/file_to_hex.php?lang=en 4 | 5 | Paste the byte array into a sketch tab and add two lines 6 | at the start with a unique font name and }; at the end: 7 | 8 | const uint8_t fontName[] PROGMEM = { 9 | 10 | Insert byte array here 11 | 12 | }; 13 | 14 | See example below. Include the tab in the main sketch, e.g.: 15 | 16 | #include "fontName.h" 17 | */ 18 | 19 | 20 | const uint8_t NotoSansBold15[] PROGMEM = { 21 | 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0C, 23 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 25 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 27 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 28 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0C, 30 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 32 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 34 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 35 | 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x0E, 37 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 38 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 39 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 41 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 42 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 43 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x02, 44 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 46 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 48 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 49 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0B, 51 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 53 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 54 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 55 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 56 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0C, 58 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 60 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 61 | 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 62 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 63 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x0C, 65 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 66 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 67 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 69 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 70 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 71 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x05, 72 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 74 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 76 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 77 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0B, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 79 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 81 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 83 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 84 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 85 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0B, 86 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x07, 88 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 90 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 91 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 92 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x0B, 93 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 94 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 95 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 96 | 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 97 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 98 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 99 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x0B, 100 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 102 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 103 | 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 104 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 105 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 106 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x0E, 107 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 108 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 109 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 110 | 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 111 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 112 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 113 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x0C, 114 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 115 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 116 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117 | 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 118 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 119 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 120 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x0B, 121 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 122 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 123 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 124 | 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 125 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 126 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 127 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x0E, 128 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 129 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 130 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 | 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 132 | 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 133 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 134 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x0A, 135 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 136 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x08, 137 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 138 | 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 139 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 140 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0C, 141 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x0A, 142 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 143 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 144 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 145 | 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 146 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 147 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0C, 148 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x0C, 149 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 150 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 151 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 152 | 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 153 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 154 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 155 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x09, 156 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 157 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 158 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 159 | 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 160 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 161 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 162 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x0D, 163 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 164 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 165 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 166 | 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 167 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 168 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0A, 169 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0A, 170 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 172 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173 | 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 174 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 175 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0D, 177 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 179 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 180 | 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 181 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 182 | 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 183 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x0E, 184 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 186 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 187 | 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 188 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xAE, 0xAE, 0x3D, 189 | 0x02, 0xFF, 0xFF, 0x52, 0x00, 0xFC, 0xFF, 0x4C, 0x00, 0xF6, 0xFF, 0x48, 0x00, 0xEE, 0xFF, 0x3F, 190 | 0x00, 0xD4, 0xFF, 0x15, 0x00, 0xB6, 0xFF, 0x08, 0x00, 0x41, 0x5D, 0x00, 0x00, 0x26, 0x39, 0x00, 191 | 0x06, 0xF6, 0xFF, 0x4C, 0x06, 0xEE, 0xFF, 0x3F, 0x00, 0x04, 0x17, 0x00, 0xAC, 0xAC, 0x00, 0xA5, 192 | 0xAE, 0x04, 0xF4, 0xF0, 0x00, 0xD6, 0xFC, 0x00, 0xDA, 0xDA, 0x00, 0xB4, 0xF4, 0x00, 0xB4, 0xB2, 193 | 0x00, 0xAC, 0xE7, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x59, 0xA7, 0x02, 194 | 0x48, 0xA7, 0x06, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xEE, 0x00, 0xA3, 0xF4, 0x00, 0x00, 0x00, 0x00, 195 | 0x00, 0xDF, 0xAE, 0x00, 0xC9, 0xB6, 0x00, 0x00, 0x08, 0xAE, 0xAE, 0xFF, 0xDF, 0xAE, 0xFC, 0xE1, 196 | 0xAE, 0x3B, 0x08, 0xBB, 0xD0, 0xFF, 0xCE, 0xCE, 0xFF, 0xCE, 0xBB, 0x3F, 0x00, 0x00, 0x66, 0xFF, 197 | 0x1F, 0x5B, 0xFF, 0x2A, 0x00, 0x00, 0x41, 0x63, 0xC3, 0xFA, 0x63, 0xC1, 0xFC, 0x63, 0x5D, 0x00, 198 | 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x00, 0x00, 0x02, 0xFC, 0x96, 0x02, 0xFC, 199 | 0x9D, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x57, 0x33, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x57, 200 | 0xFF, 0x30, 0x59, 0xFF, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x3D, 0x00, 0x00, 0x00, 201 | 0x00, 0x00, 0x02, 0x6E, 0xC9, 0x44, 0x06, 0x00, 0x00, 0x68, 0xEE, 0xFF, 0xFF, 0xFF, 0xFC, 0x85, 202 | 0x30, 0xFF, 0xFF, 0xC3, 0xDF, 0xA1, 0xD8, 0x5F, 0x55, 0xFF, 0xF0, 0x48, 0xB4, 0x00, 0x00, 0x00, 203 | 0x17, 0xF2, 0xFF, 0xEB, 0xC9, 0x0C, 0x00, 0x00, 0x00, 0x33, 0xD0, 0xFF, 0xFF, 0xF6, 0x8C, 0x08, 204 | 0x00, 0x00, 0x00, 0x6A, 0xF0, 0xFF, 0xFF, 0xAC, 0x02, 0x00, 0x00, 0x44, 0xB4, 0x5B, 0xFF, 0xF8, 205 | 0x50, 0xCE, 0x85, 0x83, 0xCE, 0xAE, 0xFF, 0xD6, 0x41, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x35, 206 | 0x00, 0x0C, 0x4A, 0x83, 0xCE, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xA7, 0x00, 0x00, 0x00, 207 | 0x00, 0x5D, 0xC9, 0xC7, 0x57, 0x00, 0x00, 0x00, 0x3F, 0xAE, 0x41, 0x00, 0x00, 0x2A, 0xFF, 0xE3, 208 | 0xE3, 0xFF, 0x28, 0x00, 0x00, 0xD2, 0xDF, 0x06, 0x00, 0x00, 0x6A, 0xFF, 0x5D, 0x5B, 0xFF, 0x70, 209 | 0x00, 0x61, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x50, 0x50, 0xFF, 0x94, 0x06, 0xE5, 0xCE, 210 | 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0x5B, 0x5B, 0xFF, 0x70, 0x7F, 0xFF, 0x3B, 0x63, 0x9B, 0x59, 211 | 0x00, 0x24, 0xFC, 0xE1, 0xE1, 0xFF, 0x41, 0xF4, 0xB0, 0x83, 0xFF, 0xFA, 0xFF, 0x7B, 0x00, 0x52, 212 | 0xC7, 0xC7, 0x5D, 0x96, 0xFC, 0x24, 0xE5, 0xF6, 0x08, 0xF6, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x2A, 213 | 0xFF, 0x90, 0x00, 0xFF, 0xC5, 0x00, 0xBB, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xB2, 0xF2, 0x13, 0x00, 214 | 0xFA, 0xDA, 0x00, 0xD0, 0xFC, 0x00, 0x00, 0x00, 0x41, 0xFF, 0x77, 0x00, 0x00, 0xBD, 0xFC, 0x72, 215 | 0xFC, 0xC3, 0x00, 0x00, 0x00, 0xD2, 0xE1, 0x06, 0x00, 0x00, 0x2E, 0xE7, 0xFF, 0xE9, 0x35, 0x00, 216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x3D, 0xAC, 217 | 0xE1, 0xBB, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xFA, 0xFF, 0xF0, 0xFC, 0xFF, 0x66, 218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xA7, 0x00, 0x70, 0xFF, 0xA3, 0x00, 0x00, 0x00, 0x00, 219 | 0x00, 0x55, 0xFF, 0xC7, 0x0C, 0xBF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD4, 0xFF, 220 | 0xF4, 0xFF, 0xB2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD6, 0xFF, 0xFF, 0xCC, 0x00, 0x00, 221 | 0x72, 0xB4, 0x77, 0x00, 0x0C, 0xE9, 0xFF, 0xB4, 0xE5, 0xFF, 0x94, 0x02, 0xE5, 0xFF, 0x63, 0x00, 222 | 0x52, 0xFF, 0xFC, 0x08, 0x1D, 0xE5, 0xFF, 0xD4, 0xFF, 0xDF, 0x02, 0x00, 0x57, 0xFF, 0xFC, 0x1F, 223 | 0x00, 0x1D, 0xE7, 0xFF, 0xFF, 0x48, 0x00, 0x00, 0x15, 0xEE, 0xFF, 0xF4, 0xB0, 0xD4, 0xFF, 0xFF, 224 | 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x35, 0xCC, 0xFF, 0xFF, 0xFF, 0xC1, 0x57, 0xE1, 0xFF, 0xB0, 0x04, 225 | 0x00, 0x00, 0x00, 0x06, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xAC, 0xF4, 0xF0, 226 | 0xDA, 0xDA, 0xB4, 0xB2, 0x0C, 0x0C, 0x00, 0x00, 0x4C, 0xAE, 0x46, 0x00, 0x13, 0xEB, 0xDA, 0x02, 227 | 0x00, 0x81, 0xFF, 0x68, 0x00, 0x00, 0xE3, 0xFC, 0x0C, 0x00, 0x22, 0xFF, 0xC3, 0x00, 0x00, 0x50, 228 | 0xFF, 0xA1, 0x00, 0x00, 0x59, 0xFF, 0x99, 0x00, 0x00, 0x59, 0xFF, 0x99, 0x00, 0x00, 0x4A, 0xFF, 229 | 0xA7, 0x00, 0x00, 0x11, 0xFF, 0xDA, 0x00, 0x00, 0x00, 0xCC, 0xFF, 0x22, 0x00, 0x00, 0x63, 0xFF, 230 | 0x81, 0x00, 0x00, 0x00, 0xCC, 0xF4, 0x17, 0x00, 0x00, 0x1B, 0x57, 0x28, 0x33, 0xAE, 0x5B, 0x00, 231 | 0x00, 0x00, 0xCE, 0xF8, 0x22, 0x00, 0x00, 0x52, 0xFF, 0x96, 0x00, 0x00, 0x02, 0xF6, 0xF4, 0x02, 232 | 0x00, 0x00, 0xAE, 0xFF, 0x3D, 0x00, 0x00, 0x96, 0xFF, 0x59, 0x00, 0x00, 0x66, 0xFF, 0x63, 0x00, 233 | 0x00, 0x70, 0xFF, 0x61, 0x00, 0x00, 0x9D, 0xFF, 0x57, 0x00, 0x00, 0xC1, 0xFF, 0x2C, 0x00, 0x11, 234 | 0xFC, 0xE1, 0x00, 0x00, 0x74, 0xFF, 0x79, 0x00, 0x0C, 0xE7, 0xDD, 0x08, 0x00, 0x1F, 0x57, 0x22, 235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xF2, 0x00, 236 | 0x00, 0x00, 0x1B, 0x3F, 0x02, 0xA7, 0xCE, 0x00, 0x2C, 0x2E, 0x5B, 0xFF, 0xF4, 0xE1, 0xE5, 0xE9, 237 | 0xFF, 0x9B, 0x2A, 0x61, 0xA1, 0xFF, 0xFF, 0xBB, 0x63, 0x3B, 0x00, 0x00, 0xBB, 0xEB, 0xD8, 0xDA, 238 | 0x0C, 0x00, 0x00, 0x6A, 0xFF, 0x81, 0x5B, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0x50, 0x17, 0x00, 0x6A, 239 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xF2, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x06, 240 | 0x00, 0x00, 0x02, 0x06, 0x06, 0x96, 0xFF, 0x0C, 0x06, 0x06, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 241 | 0xFF, 0xF2, 0x33, 0x94, 0x94, 0xD4, 0xFF, 0x96, 0x94, 0x8C, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x06, 242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x50, 0x02, 243 | 0x00, 0x00, 0x00, 0x99, 0xAE, 0x33, 0x02, 0xFC, 0xFA, 0x06, 0x39, 0xFF, 0xA1, 0x00, 0x5F, 0xF2, 244 | 0x39, 0x00, 0x8C, 0xF2, 0xF2, 0xF2, 0x52, 0x88, 0xEB, 0xEB, 0xEB, 0x50, 0x00, 0x26, 0x39, 0x00, 245 | 0x06, 0xF6, 0xFF, 0x4C, 0x06, 0xEE, 0xFF, 0x3F, 0x00, 0x04, 0x17, 0x00, 0x00, 0x00, 0x00, 0x04, 246 | 0xAC, 0xAA, 0x00, 0x00, 0x00, 0x55, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x46, 0x00, 0x00, 247 | 0x17, 0xFC, 0xE5, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x88, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0x28, 0x00, 248 | 0x00, 0x30, 0xFF, 0xC9, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x68, 0x00, 0x00, 0x02, 0xEB, 0xFA, 0x11, 249 | 0x00, 0x00, 0x4E, 0xFF, 0xAE, 0x00, 0x00, 0x00, 0xB2, 0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 250 | 0x72, 0xC5, 0xE3, 0xA5, 0x26, 0x00, 0x00, 0x83, 0xFF, 0xFF, 0xFA, 0xFF, 0xE9, 0x17, 0x04, 0xFA, 251 | 0xFF, 0x50, 0x02, 0xC3, 0xFF, 0x88, 0x4A, 0xFF, 0xF6, 0x00, 0x00, 0x59, 0xFF, 0xD0, 0x5B, 0xFF, 252 | 0xD4, 0x00, 0x00, 0x48, 0xFF, 0xF8, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x5D, 0xFF, 253 | 0xC5, 0x00, 0x00, 0x46, 0xFF, 0xFC, 0x50, 0xFF, 0xF2, 0x00, 0x00, 0x52, 0xFF, 0xE7, 0x0E, 0xFC, 254 | 0xFF, 0x26, 0x00, 0x96, 0xFF, 0xA7, 0x00, 0x9F, 0xFF, 0xE3, 0xB4, 0xFF, 0xFF, 0x3F, 0x00, 0x0E, 255 | 0xAE, 0xFF, 0xFF, 0xF2, 0x68, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 256 | 0x19, 0xA3, 0xAE, 0x2A, 0x00, 0x3F, 0xE9, 0xFF, 0xFF, 0x3D, 0x6E, 0xFC, 0xEE, 0xFF, 0xFF, 0x3D, 257 | 0xB4, 0xE1, 0x2E, 0xFF, 0xFF, 0x3D, 0x11, 0x15, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 258 | 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 259 | 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 260 | 0x00, 0x17, 0x85, 0xBF, 0xE1, 0xAC, 0x41, 0x00, 0x00, 0x28, 0xE9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 261 | 0x4A, 0x00, 0x00, 0xB4, 0x99, 0x1F, 0x06, 0xBB, 0xFF, 0xAC, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 262 | 0x72, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 263 | 0x00, 0x8E, 0xFF, 0xDA, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE5, 0x1D, 0x00, 0x00, 0x00, 264 | 0x00, 0x7B, 0xFF, 0xDF, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x77, 0xFF, 0xD2, 0x15, 0x00, 0x00, 0x00, 265 | 0x00, 0x4A, 0xFF, 0xFF, 0xF6, 0xF2, 0xF2, 0xF2, 0xF2, 0x06, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 266 | 0xFF, 0xFF, 0x06, 0x00, 0x4E, 0xA7, 0xD2, 0xD6, 0xAC, 0x4A, 0x00, 0x2E, 0xFC, 0xFF, 0xFC, 0xFC, 267 | 0xFF, 0xFF, 0x50, 0x00, 0x66, 0x46, 0x02, 0x06, 0xC7, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 268 | 0xA1, 0xFF, 0x8A, 0x00, 0x00, 0x3D, 0x59, 0x8A, 0xFA, 0xCE, 0x13, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 269 | 0xE1, 0x41, 0x00, 0x00, 0x00, 0x3D, 0x59, 0x7D, 0xE9, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 270 | 0x6A, 0xFF, 0xF4, 0x19, 0x02, 0x00, 0x00, 0x00, 0x8E, 0xFF, 0xE9, 0x5D, 0xF6, 0xAE, 0xA7, 0xC3, 271 | 0xFF, 0xFF, 0x81, 0x3D, 0xDD, 0xFF, 0xFF, 0xFF, 0xE7, 0x7B, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x0A, 272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAE, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 273 | 0xD2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 274 | 0x35, 0xFF, 0x8C, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x08, 0xD8, 0xDF, 0x1D, 0xFF, 0xFF, 0x00, 0x00, 275 | 0x00, 0x90, 0xFF, 0x3F, 0x3B, 0xFF, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x94, 0x00, 0x3D, 0xFF, 0xFF, 276 | 0x00, 0x00, 0xB2, 0xFF, 0xFA, 0xF8, 0xFA, 0xFF, 0xFF, 0xF8, 0x4E, 0x7F, 0xB4, 0xB4, 0xB4, 0xC5, 277 | 0xFF, 0xFF, 0xB4, 0x39, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 278 | 0x00, 0x3D, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x74, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x0C, 0x00, 0xB2, 279 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x00, 0xC3, 0xFF, 0x7B, 0x44, 0x44, 0x44, 0x06, 0x00, 0xEE, 280 | 0xFF, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xB6, 0xDD, 0xAC, 0x48, 0x00, 0x00, 0xF4, 281 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, 0x00, 0x13, 0x0C, 0x00, 0x1D, 0xC9, 0xFF, 0xBD, 0x00, 0x00, 282 | 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xEB, 0x17, 0x11, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xBB, 0x4A, 0xFC, 283 | 0xC3, 0xAC, 0xCE, 0xFF, 0xFF, 0x50, 0x2E, 0xD8, 0xFF, 0xFF, 0xFF, 0xE1, 0x5B, 0x00, 0x00, 0x00, 284 | 0x06, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0xAC, 0xB8, 0xB8, 0x39, 0x00, 0x00, 285 | 0x11, 0xCC, 0xFF, 0xFF, 0xFA, 0xF8, 0x50, 0x00, 0x00, 0x9F, 0xFF, 0xB4, 0x1D, 0x00, 0x00, 0x02, 286 | 0x00, 0x0E, 0xFC, 0xF2, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xAA, 0x7D, 0xE9, 0xF0, 287 | 0x94, 0x0C, 0x00, 0x5D, 0xFF, 0xF2, 0xF8, 0xBD, 0xFC, 0xFF, 0x9F, 0x00, 0x63, 0xFF, 0xF4, 0x1B, 288 | 0x00, 0x57, 0xFF, 0xF8, 0x00, 0x5B, 0xFF, 0xBF, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x06, 0x2A, 0xFF, 289 | 0xFA, 0x1D, 0x00, 0x52, 0xFF, 0xF6, 0x00, 0x00, 0xAC, 0xFF, 0xE5, 0xAA, 0xF4, 0xFF, 0x8C, 0x00, 290 | 0x00, 0x0C, 0xA1, 0xFC, 0xFF, 0xFC, 0x96, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0C, 0x02, 0x00, 291 | 0x00, 0x00, 0x6A, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x04, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 292 | 0xFF, 0xFF, 0xFF, 0x04, 0x24, 0x3D, 0x3D, 0x3D, 0x3D, 0x9D, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x00, 293 | 0x00, 0x02, 0xE1, 0xFF, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xD8, 0x00, 0x00, 0x00, 294 | 0x00, 0x00, 0x00, 0xCE, 0xFF, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xEE, 0x08, 0x00, 295 | 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xFF, 0xFC, 0x1F, 296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFC, 0xFF, 297 | 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x7F, 0xB4, 0xD4, 0xAC, 0x46, 0x00, 0x00, 0xC1, 0xFF, 298 | 0xF6, 0xD0, 0xFF, 0xFF, 0x52, 0x0A, 0xFF, 0xFC, 0x17, 0x00, 0x85, 0xFF, 0xA5, 0x04, 0xFA, 0xFF, 299 | 0x2C, 0x00, 0x96, 0xFF, 0x90, 0x00, 0x6E, 0xFF, 0xF2, 0xBF, 0xFF, 0xD4, 0x17, 0x00, 0x08, 0xC5, 300 | 0xFF, 0xFF, 0xFA, 0x39, 0x00, 0x04, 0xC7, 0xFF, 0xBD, 0x7F, 0xFC, 0xFC, 0x52, 0x55, 0xFF, 0xC5, 301 | 0x00, 0x00, 0x4A, 0xFF, 0xE9, 0x61, 0xFF, 0xB0, 0x00, 0x00, 0x1B, 0xFF, 0xFC, 0x2C, 0xFF, 0xFF, 302 | 0xA7, 0x96, 0xD6, 0xFF, 0xB2, 0x00, 0x55, 0xE1, 0xFF, 0xFF, 0xFC, 0x9F, 0x11, 0x00, 0x00, 0x00, 303 | 0x0A, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x7F, 0xB4, 0xB6, 0x90, 0x19, 0x00, 0x00, 0xC3, 0xFF, 304 | 0xFF, 0xFF, 0xFF, 0xE9, 0x19, 0x4A, 0xFF, 0xF0, 0x28, 0x08, 0xB6, 0xFF, 0x99, 0x79, 0xFF, 0xAA, 305 | 0x00, 0x00, 0x4C, 0xFF, 0xEE, 0x6A, 0xFF, 0xBF, 0x00, 0x00, 0x55, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 306 | 0x96, 0x7D, 0xE9, 0xFF, 0xFF, 0x00, 0x83, 0xFF, 0xFF, 0xFF, 0x7B, 0xFF, 0xF2, 0x00, 0x00, 0x1B, 307 | 0x4A, 0x22, 0x4C, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x11, 0xCC, 0xFF, 0x5B, 0x00, 0x79, 0xA1, 308 | 0xAA, 0xF2, 0xFF, 0xBB, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0xE9, 0x81, 0x06, 0x00, 0x00, 0x06, 0x0C, 309 | 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x41, 0x00, 0x06, 0xFA, 0xFF, 0x4E, 0x04, 0xE9, 0xFF, 310 | 0x3B, 0x00, 0x04, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x39, 311 | 0x00, 0x06, 0xF6, 0xFF, 0x4C, 0x06, 0xEE, 0xFF, 0x3F, 0x00, 0x04, 0x17, 0x00, 0x00, 0x2E, 0x41, 312 | 0x00, 0x06, 0xFA, 0xFF, 0x4E, 0x04, 0xE9, 0xFF, 0x3B, 0x00, 0x04, 0x0A, 0x00, 0x00, 0x00, 0x00, 313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xAE, 0x33, 0x02, 0xFC, 0xFA, 314 | 0x06, 0x39, 0xFF, 0xA1, 0x00, 0x5F, 0xF2, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 315 | 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xA7, 0xF2, 0x00, 0x00, 0x00, 0x28, 0xA7, 0xFF, 0xF4, 316 | 0x85, 0x00, 0x28, 0xAA, 0xFF, 0xE9, 0x7B, 0x0E, 0x00, 0x48, 0xFF, 0xFF, 0x79, 0x06, 0x00, 0x00, 317 | 0x00, 0x1F, 0xAA, 0xFC, 0xFA, 0x9B, 0x35, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8C, 0xF4, 0xFF, 0xCE, 318 | 0x61, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x72, 0xDD, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 319 | 0x46, 0x33, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x8C, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 320 | 0xF2, 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x39, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 321 | 0x9F, 0x52, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xE5, 0x19, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 322 | 0x00, 0x57, 0xE3, 0x72, 0x06, 0x00, 0x00, 0x00, 0x00, 0x24, 0xC3, 0xFF, 0xE5, 0x72, 0x06, 0x00, 323 | 0x00, 0x00, 0x00, 0x35, 0xB0, 0xFF, 0xE7, 0x72, 0x06, 0x00, 0x00, 0x00, 0x00, 0x28, 0xC7, 0xFF, 324 | 0xDF, 0x00, 0x00, 0x06, 0x66, 0xCE, 0xFF, 0xE3, 0x77, 0x1B, 0x8E, 0xF2, 0xFF, 0xCE, 0x5D, 0x02, 325 | 0x00, 0x57, 0xFF, 0xAE, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 326 | 0x00, 0x26, 0x88, 0xB8, 0xE5, 0xB4, 0x5F, 0x00, 0xB8, 0xFF, 0xFC, 0xF8, 0xFF, 0xFF, 0x6A, 0x33, 327 | 0x5D, 0x04, 0x00, 0x77, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFF, 0xAC, 0x00, 0x00, 0x00, 328 | 0x74, 0xFF, 0xF2, 0x2E, 0x00, 0x00, 0x7B, 0xFF, 0xDD, 0x2C, 0x00, 0x00, 0x00, 0xEE, 0xFC, 0x15, 329 | 0x00, 0x00, 0x00, 0x00, 0x5B, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x33, 0x00, 0x00, 0x00, 330 | 0x00, 0x22, 0xFF, 0xFF, 0x3B, 0x00, 0x00, 0x00, 0x1B, 0xF6, 0xFC, 0x33, 0x00, 0x00, 0x00, 0x00, 331 | 0x0C, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x7F, 0xA5, 0xA7, 0x94, 0x44, 0x00, 332 | 0x00, 0x00, 0x00, 0x00, 0x0C, 0xA5, 0xFF, 0xE5, 0xB0, 0xAA, 0xD8, 0xFF, 0xBD, 0x15, 0x00, 0x00, 333 | 0x02, 0xC3, 0xF2, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x52, 0xF4, 0xC3, 0x00, 0x00, 0x72, 0xFF, 0x4A, 334 | 0x15, 0x96, 0xE5, 0xEE, 0xBD, 0x6A, 0x6E, 0xFF, 0x4C, 0x00, 0xE3, 0xBF, 0x02, 0xD4, 0xF2, 0x7D, 335 | 0x5F, 0xFF, 0xA3, 0x04, 0xFC, 0x9F, 0x1B, 0xFF, 0x74, 0x55, 0xFF, 0x66, 0x00, 0x06, 0xFF, 0x9D, 336 | 0x00, 0xF2, 0xA7, 0x48, 0xFF, 0x57, 0x63, 0xFF, 0x44, 0x00, 0x22, 0xFF, 0x96, 0x00, 0xF8, 0xA1, 337 | 0x39, 0xFF, 0x5F, 0x55, 0xFF, 0x6C, 0x00, 0x7B, 0xFF, 0x9D, 0x35, 0xFF, 0x5B, 0x04, 0xFA, 0xA7, 338 | 0x02, 0xC3, 0xFF, 0xF2, 0xF8, 0xBB, 0xFF, 0xFA, 0xC5, 0x02, 0x00, 0x9D, 0xFC, 0x39, 0x02, 0x4C, 339 | 0x5B, 0x24, 0x00, 0x52, 0x55, 0x06, 0x00, 0x00, 0x15, 0xDD, 0xF6, 0x81, 0x44, 0x0E, 0x37, 0x52, 340 | 0x9D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x11, 0x92, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x08, 0x00, 341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0x4A, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 342 | 0x00, 0x3D, 0xB4, 0xB4, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xFA, 0xF8, 343 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xF6, 0xFA, 0xAA, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x00, 344 | 0x00, 0x59, 0xFF, 0xB2, 0x57, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x68, 0x0C, 345 | 0xFC, 0xFA, 0x11, 0x00, 0x00, 0x00, 0x0E, 0xFC, 0xFF, 0x1B, 0x00, 0xB8, 0xFF, 0x66, 0x00, 0x00, 346 | 0x00, 0x66, 0xFF, 0xE9, 0x63, 0x63, 0xAC, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 347 | 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0x00, 0x1D, 0xFF, 0xFF, 0x74, 0x63, 0x63, 0x63, 0xDA, 0xFF, 0x72, 348 | 0x00, 0x74, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0xCE, 0x00, 0xD0, 0xFF, 0x92, 0x00, 349 | 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, 0x26, 0x72, 0xAE, 0xAE, 0xAC, 0xA5, 0x90, 0x3F, 0x00, 0x00, 350 | 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8A, 0x00, 0xA7, 0xFF, 0xA7, 0x13, 0x3B, 0xAC, 0xFF, 351 | 0xF8, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x55, 0xFF, 0xF8, 0x00, 0xA7, 0xFF, 0xC5, 0x63, 0x81, 352 | 0xDD, 0xFF, 0x8E, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x22, 0x00, 0xA7, 0xFF, 0xBF, 353 | 0x50, 0x55, 0xB0, 0xFF, 0xE9, 0x06, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0x48, 0xA7, 354 | 0xFF, 0xA1, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x37, 0xA7, 0xFF, 0xF8, 0xEB, 0xEE, 0xFF, 0xFF, 0xC9, 355 | 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFC, 0xE5, 0x90, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xD6, 356 | 0xC9, 0xA3, 0x4A, 0x00, 0x00, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x00, 0x59, 0xFF, 0xFF, 357 | 0x70, 0x06, 0x0C, 0x61, 0x48, 0x00, 0xC7, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFC, 358 | 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 359 | 0x06, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x72, 0x00, 0x00, 0x00, 360 | 0x00, 0x00, 0x00, 0x96, 0xFF, 0xE3, 0x19, 0x00, 0x00, 0x02, 0x24, 0x00, 0x1B, 0xE9, 0xFF, 0xFA, 361 | 0xB6, 0xB6, 0xF6, 0xA1, 0x00, 0x00, 0x24, 0xBB, 0xFC, 0xFF, 0xFF, 0xF2, 0x6C, 0x00, 0x00, 0x00, 362 | 0x00, 0x02, 0x0C, 0x0A, 0x00, 0x00, 0x72, 0xAE, 0xAE, 0xAC, 0xA5, 0x79, 0x24, 0x00, 0x00, 0x00, 363 | 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0xA7, 0xFF, 0xA7, 0x13, 0x39, 0x85, 364 | 0xFF, 0xFF, 0x6A, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xE5, 0x00, 0xA7, 0xFF, 365 | 0xA1, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, 0x22, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 366 | 0xFF, 0x44, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0x2A, 0xA7, 0xFF, 0xA1, 0x00, 367 | 0x00, 0x00, 0x77, 0xFF, 0xF4, 0x02, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x52, 0xF2, 0xFF, 0x88, 0x00, 368 | 0xA7, 0xFF, 0xF8, 0xEB, 0xF8, 0xFF, 0xFF, 0xBB, 0x08, 0x00, 0xA7, 0xFF, 0xFF, 0xFC, 0xF2, 0xB6, 369 | 0x5F, 0x00, 0x00, 0x00, 0x72, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x66, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 370 | 0xFF, 0x94, 0xA7, 0xFF, 0xA7, 0x13, 0x13, 0x13, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 371 | 0xA7, 0xFF, 0xD8, 0x94, 0x94, 0x94, 0x2A, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4A, 0xA7, 0xFF, 372 | 0xC1, 0x57, 0x57, 0x57, 0x19, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 373 | 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xF8, 0xEB, 0xEB, 0xEB, 0x88, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 374 | 0x94, 0x72, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x44, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0xA7, 375 | 0xFF, 0xA1, 0x13, 0x13, 0x13, 0x06, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9D, 376 | 0x06, 0x06, 0x06, 0x02, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0xA7, 0xFF, 0xE1, 0xB4, 0xB4, 377 | 0xB4, 0x30, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 378 | 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 379 | 0x00, 0x30, 0x99, 0xBD, 0xE5, 0xB6, 0x94, 0x33, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 380 | 0xFF, 0x55, 0x00, 0x52, 0xFF, 0xFF, 0xA7, 0x24, 0x00, 0x1B, 0x6A, 0x02, 0x00, 0xC7, 0xFF, 0xC3, 381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFC, 0xFF, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 382 | 0x0C, 0xFF, 0xFF, 0x44, 0x00, 0x9B, 0xFF, 0xFF, 0xFF, 0xA7, 0x06, 0xFF, 0xFF, 0x48, 0x00, 0x8E, 383 | 0xEB, 0xF8, 0xFF, 0xA7, 0x00, 0xEB, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xA7, 0x00, 0x94, 384 | 0xFF, 0xEB, 0x2A, 0x00, 0x00, 0x9B, 0xFF, 0xA7, 0x00, 0x17, 0xE5, 0xFF, 0xFC, 0xBB, 0xB2, 0xF2, 385 | 0xFF, 0xA7, 0x00, 0x00, 0x1D, 0xAA, 0xFC, 0xFF, 0xFF, 0xFF, 0xD6, 0x6A, 0x00, 0x00, 0x00, 0x00, 386 | 0x02, 0x0C, 0x0C, 0x02, 0x00, 0x00, 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0x08, 0xAE, 0xAE, 0x08, 387 | 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 388 | 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 389 | 0xD8, 0x94, 0x94, 0x94, 0x99, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 390 | 0xFF, 0x0C, 0xA7, 0xFF, 0xC1, 0x57, 0x57, 0x57, 0x5F, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 391 | 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 392 | 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 393 | 0x0C, 0xFF, 0xFF, 0x0C, 0x66, 0xAE, 0xAE, 0xAE, 0xAE, 0x3B, 0x61, 0xF8, 0xFF, 0xFF, 0xE9, 0x39, 394 | 0x00, 0x48, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 395 | 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 396 | 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x35, 0xC3, 0xFF, 0xFF, 0xAA, 0x1D, 397 | 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0xA7, 398 | 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 399 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 400 | 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 401 | 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0x7D, 0x0C, 0xBF, 402 | 0xD6, 0xFF, 0xFF, 0x2C, 0x0C, 0xFF, 0xFF, 0xEB, 0x5F, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 403 | 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0x94, 0xAE, 0x6E, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x85, 0xFF, 404 | 0xE3, 0x15, 0xA7, 0xFF, 0xA1, 0x00, 0x50, 0xFF, 0xF8, 0x33, 0x00, 0xA7, 0xFF, 0xA1, 0x28, 0xF2, 405 | 0xFF, 0x5F, 0x00, 0x00, 0xA7, 0xFF, 0xAA, 0xD6, 0xFF, 0x96, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xFC, 406 | 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0xB6, 0xFF, 0xF8, 0x22, 0x00, 0x00, 0xA7, 407 | 0xFF, 0xA1, 0x00, 0xC5, 0xFF, 0xBB, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x2A, 0xFC, 0xFF, 0x59, 408 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x85, 0xFF, 0xE9, 0x13, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x08, 409 | 0xDF, 0xFF, 0x9B, 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 410 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 411 | 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 412 | 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 413 | 0x00, 0x00, 0xA7, 0xFF, 0xF8, 0xEB, 0xEB, 0xEB, 0xE5, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 414 | 0x72, 0xAE, 0xAE, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x41, 0xAE, 0xAE, 0x7B, 0xA7, 0xFF, 0xFF, 0xCC, 415 | 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFF, 0xFF, 0xB4, 0xA7, 0xFF, 0xF6, 0xFF, 0x1B, 0x00, 0x00, 0x04, 416 | 0xFA, 0xF6, 0xFF, 0xB4, 0xA7, 0xFF, 0xB2, 0xFF, 0x68, 0x00, 0x00, 0x57, 0xFF, 0xB2, 0xFF, 0xB4, 417 | 0xA7, 0xFF, 0x6A, 0xFF, 0xB6, 0x00, 0x00, 0xA7, 0xFC, 0x63, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0xCC, 418 | 0xFA, 0x08, 0x04, 0xFA, 0xC1, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x7F, 0xFF, 0x57, 0x52, 0xFF, 419 | 0x6A, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x2C, 0xFF, 0xA7, 0xA5, 0xFF, 0x1B, 0x50, 0xFF, 0xB4, 420 | 0xA7, 0xFF, 0x57, 0x00, 0xDF, 0xF6, 0xF6, 0xC3, 0x00, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x00, 421 | 0x90, 0xFF, 0xFF, 0x72, 0x00, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x00, 0x41, 0xFF, 0xFF, 0x1D, 422 | 0x00, 0x50, 0xFF, 0xB4, 0x72, 0xAE, 0xAE, 0x48, 0x00, 0x00, 0x00, 0x2A, 0xAE, 0x9D, 0xA7, 0xFF, 423 | 0xFF, 0xDD, 0x06, 0x00, 0x00, 0x3D, 0xFF, 0xE5, 0xA7, 0xFF, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x3D, 424 | 0xFF, 0xE5, 0xA7, 0xFF, 0xA1, 0xFF, 0xF4, 0x19, 0x00, 0x3D, 0xFF, 0xE5, 0xA7, 0xFF, 0x4C, 0xC3, 425 | 0xFF, 0x9F, 0x00, 0x3D, 0xFF, 0xE5, 0xA7, 0xFF, 0x52, 0x30, 0xFF, 0xFF, 0x33, 0x3D, 0xFF, 0xE5, 426 | 0xA7, 0xFF, 0x57, 0x00, 0x99, 0xFF, 0xCE, 0x1D, 0xFF, 0xE5, 0xA7, 0xFF, 0x57, 0x00, 0x15, 0xF2, 427 | 0xFF, 0x6A, 0xFF, 0xE5, 0xA7, 0xFF, 0x57, 0x00, 0x00, 0x77, 0xFF, 0xEB, 0xFF, 0xE5, 0xA7, 0xFF, 428 | 0x57, 0x00, 0x00, 0x02, 0xDA, 0xFF, 0xFF, 0xE5, 0xA7, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x4C, 0xFF, 429 | 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x5F, 0xAC, 0xE3, 0xE1, 0xAC, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 430 | 0xB6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0x6A, 0x04, 431 | 0x04, 0x72, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0xD6, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 432 | 0xC1, 0x00, 0x02, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xF8, 0x00, 0x0C, 0xFF, 433 | 0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x02, 0x06, 0xFF, 0xFF, 0x4C, 0x00, 0x00, 434 | 0x00, 0x00, 0x57, 0xFF, 0xFC, 0x00, 0x00, 0xE9, 0xFF, 0x83, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 435 | 0xD4, 0x00, 0x00, 0x8C, 0xFF, 0xEE, 0x28, 0x00, 0x00, 0x2C, 0xF2, 0xFF, 0x7D, 0x00, 0x00, 0x11, 436 | 0xDF, 0xFF, 0xFC, 0xBF, 0xC3, 0xFC, 0xFF, 0xD6, 0x0C, 0x00, 0x00, 0x00, 0x15, 0xA1, 0xFA, 0xFF, 437 | 0xFF, 0xFA, 0x96, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0C, 0x0A, 0x00, 0x00, 0x00, 438 | 0x00, 0x00, 0x72, 0xAE, 0xAE, 0xAC, 0xA5, 0x7B, 0x15, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 439 | 0xE9, 0x1D, 0xA7, 0xFF, 0xA7, 0x13, 0x50, 0xE7, 0xFF, 0x90, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x9D, 440 | 0xFF, 0xAE, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0xC3, 0xFF, 0xA5, 0xA7, 0xFF, 0xDF, 0xAA, 0xDA, 0xFF, 441 | 0xFF, 0x3F, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x5D, 0x00, 0xA7, 0xFF, 0xB8, 0x3B, 0x0C, 0x00, 442 | 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 443 | 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xAC, 0xE3, 444 | 0xE1, 0xAC, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 445 | 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0x6A, 0x04, 0x04, 0x72, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0xD6, 446 | 0xFF, 0x9D, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0xC1, 0x00, 0x02, 0xFF, 0xFF, 0x50, 0x00, 0x00, 447 | 0x00, 0x00, 0x5D, 0xFF, 0xF8, 0x00, 0x0C, 0xFF, 0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 448 | 0xFF, 0x02, 0x06, 0xFF, 0xFF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x57, 0xFF, 0xFC, 0x00, 0x00, 0xE9, 449 | 0xFF, 0x83, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 0xD4, 0x00, 0x00, 0x8C, 0xFF, 0xEE, 0x28, 0x00, 450 | 0x00, 0x2C, 0xF2, 0xFF, 0x81, 0x00, 0x00, 0x11, 0xDF, 0xFF, 0xFC, 0xBF, 0xC3, 0xFC, 0xFF, 0xD8, 451 | 0x0E, 0x00, 0x00, 0x00, 0x15, 0xA1, 0xFA, 0xFF, 0xFF, 0xFF, 0xC5, 0x15, 0x00, 0x00, 0x00, 0x00, 452 | 0x00, 0x00, 0x02, 0x0C, 0x8E, 0xFF, 0xF4, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 453 | 0x00, 0xBB, 0xFF, 0xE9, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x92, 0x94, 454 | 0x77, 0x00, 0x72, 0xAE, 0xAE, 0xAA, 0xA5, 0x70, 0x17, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 455 | 0xFF, 0xEB, 0x26, 0x00, 0xA7, 0xFF, 0xA7, 0x1F, 0x4E, 0xE3, 0xFF, 0x9D, 0x00, 0xA7, 0xFF, 0xA1, 456 | 0x00, 0x00, 0x9B, 0xFF, 0xB0, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x1B, 0xD4, 0xFF, 0x8C, 0x00, 0xA7, 457 | 0xFF, 0xFC, 0xF8, 0xFF, 0xFF, 0xD0, 0x13, 0x00, 0xA7, 0xFF, 0xF8, 0xEE, 0xFF, 0xEE, 0x08, 0x00, 458 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0xC5, 0xFF, 0x85, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x2A, 0xFC, 459 | 0xFC, 0x33, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x85, 0xFF, 0xD6, 0x06, 0xA7, 0xFF, 0xA1, 0x00, 460 | 0x00, 0x08, 0xDF, 0xFF, 0x8C, 0x00, 0x04, 0x79, 0xBB, 0xE5, 0xB6, 0x81, 0x24, 0x00, 0xAC, 0xFF, 461 | 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x11, 0xFF, 0xFF, 0x48, 0x02, 0x2A, 0x7B, 0x02, 0x28, 0xFF, 0xFF, 462 | 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xFF, 0xEB, 0x72, 0x08, 0x00, 0x00, 0x00, 0x2A, 0xDD, 463 | 0xFF, 0xFF, 0xE7, 0x4E, 0x00, 0x00, 0x00, 0x06, 0x70, 0xE5, 0xFF, 0xFF, 0x3B, 0x00, 0x00, 0x00, 464 | 0x00, 0x0C, 0xC9, 0xFF, 0xA1, 0x2C, 0x44, 0x00, 0x00, 0x00, 0xAC, 0xFF, 0xA1, 0x50, 0xFF, 0xEE, 465 | 0xB0, 0xC3, 0xFF, 0xFF, 0x46, 0x2E, 0xCE, 0xFF, 0xFF, 0xFF, 0xE3, 0x5D, 0x00, 0x00, 0x00, 0x02, 466 | 0x0C, 0x0A, 0x00, 0x00, 0x00, 0x77, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x3B, 0xAE, 0xFF, 467 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x2A, 0x3D, 0x3D, 0xC5, 0xFF, 0x88, 0x3D, 0x3D, 0x15, 468 | 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 469 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 470 | 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 471 | 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 472 | 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x77, 0xAE, 0x66, 0x00, 0x00, 0x00, 0x2E, 0xAE, 473 | 0xAE, 0x04, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 474 | 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 475 | 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 476 | 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAC, 0xFF, 477 | 0x9B, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0x02, 0x83, 0xFF, 0xDF, 0x11, 0x00, 0x00, 0x9B, 0xFF, 478 | 0xDA, 0x00, 0x19, 0xEE, 0xFF, 0xF6, 0xB4, 0xDA, 0xFF, 0xFF, 0x59, 0x00, 0x00, 0x2A, 0xC3, 0xFF, 479 | 0xFF, 0xFF, 0xDA, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 480 | 0x96, 0xAE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x72, 0xAE, 0x6E, 0x92, 0xFF, 0xA7, 0x00, 0x00, 0x00, 481 | 0x00, 0xE7, 0xFF, 0x52, 0x3D, 0xFF, 0xF6, 0x02, 0x00, 0x00, 0x3B, 0xFF, 0xF8, 0x04, 0x00, 0xE3, 482 | 0xFF, 0x4C, 0x00, 0x00, 0x8C, 0xFF, 0xA3, 0x00, 0x00, 0x8E, 0xFF, 0x9D, 0x00, 0x00, 0xDA, 0xFF, 483 | 0x4E, 0x00, 0x00, 0x39, 0xFF, 0xE9, 0x00, 0x2C, 0xFF, 0xF2, 0x02, 0x00, 0x00, 0x00, 0xE1, 0xFF, 484 | 0x3D, 0x7F, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0x83, 0xC3, 0xFF, 0x48, 0x00, 0x00, 485 | 0x00, 0x00, 0x35, 0xFF, 0xC1, 0xFC, 0xEE, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xFF, 0xFF, 486 | 0x9B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFF, 0xFF, 0x41, 0x00, 0x00, 0x00, 0xA1, 0xAE, 487 | 0x37, 0x00, 0x00, 0x00, 0x9F, 0xAE, 0x3F, 0x00, 0x00, 0x00, 0x8A, 0xAE, 0x3F, 0xAC, 0xFF, 0x7F, 488 | 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xA1, 0x00, 0x00, 0x02, 0xFA, 0xFF, 0x2E, 0x6A, 0xFF, 0xB4, 0x00, 489 | 0x00, 0x57, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x3F, 0xFF, 0xF2, 0x00, 0x28, 0xFF, 0xF6, 0x00, 0x00, 490 | 0xA5, 0xFF, 0xC7, 0xFF, 0x24, 0x00, 0x74, 0xFF, 0xA7, 0x00, 0x00, 0xEB, 0xFF, 0x35, 0x00, 0xE7, 491 | 0xF4, 0x6A, 0xFF, 0x66, 0x00, 0xAC, 0xFF, 0x68, 0x00, 0x00, 0xA7, 0xFF, 0x6A, 0x26, 0xFF, 0xAC, 492 | 0x3B, 0xFF, 0xA7, 0x00, 0xF4, 0xFF, 0x2A, 0x00, 0x00, 0x63, 0xFF, 0xA7, 0x63, 0xFF, 0x70, 0x02, 493 | 0xF6, 0xEE, 0x28, 0xFF, 0xEB, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xE3, 0xA3, 0xFF, 0x33, 0x00, 0xAE, 494 | 0xFF, 0x79, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xFF, 0xCE, 0xF6, 0x00, 0x00, 0x6E, 0xFF, 495 | 0xE5, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xFF, 0xFF, 0xAA, 0x00, 0x00, 0x30, 0xFF, 0xFF, 496 | 0xFF, 0x28, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xFF, 0x68, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xE7, 497 | 0x00, 0x00, 0x00, 0x5B, 0xAE, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x99, 0xAE, 0x59, 0x13, 0xE9, 0xFF, 498 | 0x72, 0x00, 0x00, 0x61, 0xFF, 0xE7, 0x0E, 0x00, 0x57, 0xFF, 0xF0, 0x17, 0x0C, 0xE7, 0xFF, 0x52, 499 | 0x00, 0x00, 0x00, 0xB2, 0xFF, 0xA5, 0x8A, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xF2, 0xFF, 500 | 0xFF, 0xF4, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xFF, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x00, 501 | 0x00, 0x1D, 0xF2, 0xFF, 0xFF, 0xE7, 0x13, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x90, 0xBD, 0xFF, 502 | 0xA5, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xE5, 0x0C, 0x22, 0xF8, 0xFF, 0x50, 0x00, 0x15, 0xEB, 0xFF, 503 | 0x57, 0x00, 0x00, 0x7F, 0xFF, 0xE9, 0x13, 0xA7, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x06, 0xDD, 0xFF, 504 | 0xA5, 0x8A, 0xAE, 0x6A, 0x00, 0x00, 0x00, 0x2A, 0xAE, 0xAE, 0x19, 0x55, 0xFF, 0xF6, 0x15, 0x00, 505 | 0x00, 0xAC, 0xFF, 0xB0, 0x00, 0x00, 0xCE, 0xFF, 0x88, 0x00, 0x2C, 0xFF, 0xFC, 0x28, 0x00, 0x00, 506 | 0x3D, 0xFF, 0xF8, 0x19, 0xAE, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0xB8, 0xFF, 0xF6, 507 | 0x19, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 508 | 0xA1, 0xFF, 0xEB, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xBB, 0x00, 0x00, 0x00, 509 | 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 510 | 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x48, 511 | 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x2A, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 512 | 0x33, 0x1B, 0x3D, 0x3D, 0x3D, 0x3D, 0xDD, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFF, 513 | 0xE5, 0x13, 0x00, 0x00, 0x00, 0x00, 0x26, 0xF6, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCE, 514 | 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, 0xD6, 0x08, 0x00, 0x00, 0x00, 0x00, 0x37, 515 | 0xFF, 0xFC, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xDD, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 516 | 0x88, 0xFF, 0xFF, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0x4A, 0xA1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 517 | 0xFF, 0x50, 0xAA, 0xAE, 0xAE, 0x6A, 0xF8, 0xFC, 0xBB, 0x72, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 518 | 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 519 | 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xFA, 520 | 0x3D, 0x24, 0xF8, 0xFF, 0xFF, 0x9B, 0x55, 0x57, 0x57, 0x35, 0x81, 0xAE, 0x26, 0x00, 0x00, 0x00, 521 | 0x70, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x15, 0xFC, 0xE5, 0x00, 0x00, 0x00, 0x00, 0xB2, 0xFF, 0x46, 522 | 0x00, 0x00, 0x00, 0x52, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x02, 0xEE, 0xFA, 0x0C, 0x00, 0x00, 0x00, 523 | 0x92, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x37, 0xFF, 0xC7, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0x26, 524 | 0x00, 0x00, 0x00, 0x79, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x19, 0xFC, 0xE3, 0x6E, 0xAE, 0xAE, 0xA5, 525 | 0x77, 0xBB, 0xFC, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 526 | 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 527 | 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x26, 0x3D, 0xFA, 0xF2, 0xA1, 0xFF, 0xFF, 0xF2, 528 | 0x37, 0x57, 0x57, 0x52, 0x00, 0x00, 0x00, 0x6E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 529 | 0xF2, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xFC, 0xDD, 0xC7, 0x00, 0x00, 0x00, 0x00, 530 | 0x04, 0xE5, 0xAA, 0x59, 0xFF, 0x48, 0x00, 0x00, 0x00, 0x68, 0xFF, 0x35, 0x00, 0xD8, 0xD2, 0x00, 531 | 0x00, 0x00, 0xD8, 0xC9, 0x00, 0x00, 0x59, 0xFF, 0x55, 0x00, 0x50, 0xFF, 0x5D, 0x00, 0x00, 0x00, 532 | 0xD8, 0xD8, 0x00, 0x28, 0x3D, 0x02, 0x00, 0x00, 0x00, 0x22, 0x3D, 0x0C, 0xA7, 0xA7, 0xA7, 0xA7, 533 | 0xA7, 0xA7, 0x28, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x15, 0x17, 0x63, 0x63, 0x1B, 0x00, 0x00, 534 | 0x72, 0xFF, 0xC7, 0x04, 0x00, 0x00, 0x41, 0xE1, 0x88, 0x00, 0x00, 0x08, 0x4A, 0x50, 0x4A, 0x04, 535 | 0x00, 0x00, 0x55, 0xFA, 0xFF, 0xFF, 0xFF, 0xE9, 0x39, 0x00, 0x15, 0xB8, 0x63, 0x50, 0xB6, 0xFF, 536 | 0xC3, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0xFF, 0xF2, 0x00, 0x4A, 0xC3, 0xFA, 0xFF, 0xFF, 0xFF, 537 | 0xF2, 0x26, 0xFF, 0xFF, 0x8A, 0x4A, 0x7B, 0xFF, 0xF2, 0x57, 0xFF, 0xF6, 0x00, 0x00, 0x68, 0xFF, 538 | 0xF2, 0x3B, 0xFF, 0xFF, 0x9B, 0x90, 0xF2, 0xFF, 0xF2, 0x00, 0x92, 0xFF, 0xFF, 0xE9, 0x4A, 0xCE, 539 | 0xF2, 0x00, 0x00, 0x06, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x44, 0x5D, 0x22, 0x00, 0x00, 0x00, 0x00, 540 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 541 | 0x00, 0xBB, 0xFF, 0x59, 0x19, 0x4E, 0x39, 0x00, 0x00, 0xBB, 0xFF, 0x9B, 0xF4, 0xFF, 0xFF, 0xB0, 542 | 0x00, 0xBB, 0xFF, 0xF6, 0x7F, 0x88, 0xFF, 0xFF, 0x63, 0xBB, 0xFF, 0x90, 0x00, 0x00, 0xAC, 0xFF, 543 | 0xAA, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xB6, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0x77, 0xFF, 544 | 0xB4, 0xBB, 0xFF, 0xB2, 0x00, 0x00, 0xC5, 0xFF, 0xA3, 0xBB, 0xFF, 0xFF, 0xBF, 0xC5, 0xFF, 0xFF, 545 | 0x44, 0xBB, 0xFA, 0x4E, 0xE5, 0xFF, 0xFA, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x00, 546 | 0x00, 0x00, 0x00, 0x00, 0x33, 0x50, 0x4C, 0x11, 0x00, 0x00, 0x19, 0xCE, 0xFF, 0xFF, 0xFF, 0xFC, 547 | 0x13, 0x00, 0xC9, 0xFF, 0xDA, 0x6E, 0x92, 0x9D, 0x00, 0x26, 0xFF, 0xFF, 0x2A, 0x00, 0x00, 0x00, 548 | 0x00, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 549 | 0x00, 0x24, 0xFF, 0xFF, 0x48, 0x00, 0x00, 0x1B, 0x00, 0x00, 0xC3, 0xFF, 0xF4, 0xAC, 0xB4, 0xF6, 550 | 0x00, 0x00, 0x17, 0xB2, 0xFC, 0xFF, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x06, 0x00, 551 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x5D, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 552 | 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x0E, 0x4E, 553 | 0x44, 0x00, 0xF0, 0xFF, 0x50, 0x00, 0x3D, 0xF0, 0xFF, 0xFF, 0xC7, 0xD2, 0xFF, 0x50, 0x00, 0xE1, 554 | 0xFF, 0xDA, 0x72, 0xC3, 0xFF, 0xFF, 0x50, 0x33, 0xFF, 0xFF, 0x2A, 0x00, 0x06, 0xF6, 0xFF, 0x50, 555 | 0x4E, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0xB6, 0xFF, 0x50, 0x4E, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0xBB, 556 | 0xFF, 0x50, 0x26, 0xFF, 0xFF, 0x37, 0x00, 0x0E, 0xFA, 0xFF, 0x50, 0x00, 0xCC, 0xFF, 0xEE, 0xA5, 557 | 0xD8, 0xFA, 0xFF, 0x50, 0x00, 0x1D, 0xD6, 0xFF, 0xFC, 0x85, 0x90, 0xFF, 0x50, 0x00, 0x00, 0x00, 558 | 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x50, 0x3F, 0x02, 0x00, 0x00, 0x00, 559 | 0x19, 0xCE, 0xFF, 0xFF, 0xFF, 0xDD, 0x26, 0x00, 0x00, 0xBF, 0xFF, 0xAA, 0x4C, 0x90, 0xFF, 0xD0, 560 | 0x00, 0x24, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0xF4, 0xFF, 0x1D, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 561 | 0xFF, 0xFF, 0x44, 0x4C, 0xFF, 0xF8, 0x63, 0x63, 0x63, 0x63, 0x63, 0x1B, 0x1B, 0xFF, 0xFF, 0x30, 562 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xE9, 0x9B, 0x96, 0xAA, 0xAE, 0x00, 0x00, 0x04, 563 | 0x8A, 0xF4, 0xFF, 0xFF, 0xFA, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0x00, 564 | 0x00, 0x00, 0x13, 0x57, 0x63, 0x57, 0x17, 0x00, 0x17, 0xE9, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0x5D, 565 | 0xFF, 0xF0, 0x57, 0x5B, 0x00, 0x00, 0x6C, 0xFF, 0xC5, 0x3D, 0x2A, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 566 | 0xFF, 0xAE, 0x00, 0x44, 0xA1, 0xFF, 0xD2, 0x63, 0x44, 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 567 | 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 568 | 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 569 | 0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x4E, 0x44, 0x00, 0x24, 0x3D, 0x13, 0x00, 0x3D, 0xF0, 570 | 0xFF, 0xFF, 0xC7, 0xB6, 0xFF, 0x50, 0x00, 0xDD, 0xFF, 0xD6, 0x74, 0xC3, 0xFF, 0xFF, 0x50, 0x30, 571 | 0xFF, 0xFF, 0x28, 0x00, 0x02, 0xF2, 0xFF, 0x50, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB6, 0xFF, 572 | 0x50, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x50, 0x24, 0xFF, 0xFF, 0x35, 0x00, 0x06, 573 | 0xF0, 0xFF, 0x50, 0x00, 0xCC, 0xFF, 0xE9, 0xA3, 0xD2, 0xFF, 0xFF, 0x50, 0x00, 0x24, 0xD6, 0xFF, 574 | 0xFC, 0x88, 0xF0, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0xF6, 0xFF, 0x4C, 0x00, 0x5D, 575 | 0x44, 0x08, 0x04, 0x68, 0xFF, 0xFA, 0x13, 0x00, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x00, 576 | 0x00, 0x33, 0x6A, 0x99, 0x9B, 0x70, 0x26, 0x00, 0x00, 0x44, 0x5D, 0x22, 0x00, 0x00, 0x00, 0x00, 577 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 578 | 0x00, 0xBB, 0xFF, 0x59, 0x15, 0x4E, 0x48, 0x02, 0x00, 0xBB, 0xFF, 0x96, 0xF4, 0xFF, 0xFF, 0xDF, 579 | 0x1D, 0xBB, 0xFF, 0xFF, 0x8A, 0x77, 0xF2, 0xFF, 0x90, 0xBB, 0xFF, 0xA5, 0x00, 0x00, 0x9D, 0xFF, 580 | 0xAE, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0x6E, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 581 | 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 582 | 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0x2C, 0x55, 0x0C, 0xE5, 0xFF, 0x77, 0x7B, 583 | 0xB2, 0x2E, 0x2E, 0x3D, 0x17, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 584 | 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x2C, 585 | 0x55, 0x0C, 0x00, 0x00, 0xE5, 0xFF, 0x77, 0x00, 0x00, 0x7B, 0xB2, 0x2E, 0x00, 0x00, 0x2E, 0x3D, 586 | 0x17, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 587 | 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 588 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xCC, 0xFF, 0x5D, 0x48, 0x52, 589 | 0xFA, 0xFF, 0x50, 0xF8, 0xFF, 0xFF, 0xE1, 0x08, 0x79, 0x9B, 0x72, 0x13, 0x00, 0x44, 0x5D, 0x22, 590 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 591 | 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x1B, 0x3D, 0x3D, 592 | 0x02, 0xBB, 0xFF, 0x5D, 0x00, 0x1F, 0xE7, 0xFF, 0x72, 0x00, 0xBB, 0xFF, 0x5D, 0x15, 0xDD, 0xFF, 593 | 0x88, 0x00, 0x00, 0xBB, 0xFF, 0x5F, 0xCC, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0xDF, 0xFF, 594 | 0xFC, 0x0E, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0xFF, 0xE1, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0xBB, 0xFF, 595 | 0x7F, 0x1B, 0xEE, 0xFF, 0x68, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x52, 0xFF, 0xF8, 0x2E, 0x00, 596 | 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x9D, 0xFF, 0xDA, 0x0C, 0x44, 0x5D, 0x22, 0xBB, 0xFF, 0x5D, 0xBB, 597 | 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 598 | 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0x2E, 0x37, 0x00, 599 | 0x1B, 0x4E, 0x44, 0x00, 0x00, 0x15, 0x4E, 0x4A, 0x04, 0x00, 0xBB, 0xFC, 0x6E, 0xFC, 0xFF, 0xFF, 600 | 0xCE, 0x57, 0xF8, 0xFF, 0xFF, 0xDF, 0x13, 0xBB, 0xFF, 0xFC, 0x83, 0x8A, 0xFF, 0xFF, 0xFF, 0x90, 601 | 0x7D, 0xFC, 0xFF, 0x74, 0xBB, 0xFF, 0xA1, 0x00, 0x00, 0xC7, 0xFF, 0xB0, 0x00, 0x00, 0xAE, 0xFF, 602 | 0x9D, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0xB0, 0xFF, 0x94, 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 603 | 0x5D, 0x00, 0x00, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 604 | 0xAE, 0xFF, 0x94, 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xAE, 0xFF, 0x94, 605 | 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0xA1, 606 | 0xFF, 0xA1, 0x2E, 0x37, 0x00, 0x17, 0x4E, 0x4A, 0x04, 0x00, 0xBB, 0xFC, 0x6C, 0xFA, 0xFF, 0xFF, 607 | 0xE1, 0x1D, 0xBB, 0xFF, 0xFF, 0x8A, 0x74, 0xF2, 0xFF, 0x90, 0xBB, 0xFF, 0xA5, 0x00, 0x00, 0x9D, 608 | 0xFF, 0xAE, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0x6E, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 609 | 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 610 | 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0x00, 0x00, 0x00, 0x35, 0x50, 0x44, 611 | 0x02, 0x00, 0x00, 0x00, 0x19, 0xCE, 0xFF, 0xFF, 0xFF, 0xE3, 0x3B, 0x00, 0x00, 0xC7, 0xFF, 0xD4, 612 | 0x6C, 0xB4, 0xFF, 0xEE, 0x13, 0x28, 0xFF, 0xFF, 0x22, 0x00, 0x00, 0xDA, 0xFF, 0x68, 0x4E, 0xFF, 613 | 0xFA, 0x00, 0x00, 0x00, 0xAA, 0xFF, 0x9B, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xAE, 0xFF, 0x99, 614 | 0x11, 0xFC, 0xFF, 0x3D, 0x00, 0x0C, 0xEB, 0xFF, 0x5B, 0x00, 0x99, 0xFF, 0xEE, 0xAA, 0xD8, 0xFF, 615 | 0xE3, 0x0C, 0x00, 0x04, 0x8A, 0xFA, 0xFF, 0xFF, 0xC1, 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0C, 616 | 0x06, 0x00, 0x00, 0x00, 0x2E, 0x3B, 0x00, 0x19, 0x4E, 0x39, 0x00, 0x00, 0xBB, 0xFF, 0x70, 0xF4, 617 | 0xFF, 0xFF, 0xB0, 0x00, 0xBB, 0xFF, 0xF6, 0x7F, 0x88, 0xFF, 0xFF, 0x63, 0xBB, 0xFF, 0x90, 0x00, 618 | 0x00, 0xA3, 0xFF, 0xAA, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xB6, 0xBB, 0xFF, 0x5F, 0x00, 619 | 0x00, 0x74, 0xFF, 0xB4, 0xBB, 0xFF, 0xB2, 0x00, 0x00, 0xBD, 0xFF, 0xA3, 0xBB, 0xFF, 0xFF, 0xBF, 620 | 0xC3, 0xFF, 0xFF, 0x3B, 0xBB, 0xFF, 0x88, 0xE5, 0xFF, 0xFA, 0x72, 0x00, 0xBB, 0xFF, 0x5B, 0x00, 621 | 0x0C, 0x04, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 622 | 0x00, 0x00, 0x00, 0x00, 0x72, 0x9B, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x4E, 623 | 0x44, 0x00, 0x24, 0x3D, 0x13, 0x00, 0x3D, 0xF0, 0xFF, 0xFF, 0xC5, 0xB8, 0xFF, 0x50, 0x00, 0xE1, 624 | 0xFF, 0xD6, 0x72, 0xC3, 0xFF, 0xFF, 0x50, 0x33, 0xFF, 0xFF, 0x2A, 0x00, 0x06, 0xF6, 0xFF, 0x50, 625 | 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB6, 0xFF, 0x50, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB8, 626 | 0xFF, 0x50, 0x26, 0xFF, 0xFF, 0x35, 0x00, 0x0A, 0xF6, 0xFF, 0x50, 0x00, 0xCC, 0xFF, 0xE9, 0xA3, 627 | 0xD2, 0xFA, 0xFF, 0x50, 0x00, 0x22, 0xD6, 0xFF, 0xFF, 0x8C, 0xE1, 0xFF, 0x50, 0x00, 0x00, 0x00, 628 | 0x0A, 0x06, 0x00, 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x50, 0x00, 629 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x9B, 630 | 0x30, 0x2E, 0x37, 0x00, 0x0E, 0x4E, 0x22, 0xBB, 0xFA, 0x35, 0xE9, 0xFF, 0x5F, 0xBB, 0xFF, 0xF4, 631 | 0xF4, 0xB4, 0x3B, 0xBB, 0xFF, 0xCC, 0x0C, 0x00, 0x00, 0xBB, 0xFF, 0x63, 0x00, 0x00, 0x00, 0xBB, 632 | 0xFF, 0x5D, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 633 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x4E, 0x4E, 0x26, 0x00, 0x00, 0xAC, 634 | 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x44, 0xFF, 0xF8, 0x55, 0x59, 0xA3, 0x44, 0x41, 0xFF, 0xFF, 0x79, 635 | 0x0C, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0xF6, 0x88, 0x08, 0x00, 0x00, 0x4C, 0xC3, 0xFF, 0xFF, 636 | 0x9B, 0x04, 0x00, 0x00, 0x00, 0x74, 0xFF, 0xEB, 0x50, 0xD8, 0x9D, 0x7D, 0xC9, 0xFF, 0xB0, 0x37, 637 | 0xE9, 0xFF, 0xFF, 0xFF, 0xC1, 0x1B, 0x00, 0x00, 0x0A, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x02, 0xE1, 638 | 0x99, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xB8, 0x3D, 0x39, 0x66, 0xFA, 0xFF, 0xFF, 0xFF, 0xF2, 0x41, 639 | 0xC1, 0xFF, 0xC5, 0x63, 0x5F, 0x00, 0x9B, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xA1, 0x00, 640 | 0x00, 0x00, 0x9B, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x72, 0xFF, 641 | 0xFA, 0xA5, 0xB6, 0x00, 0x11, 0xC7, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x37, 642 | 0x3D, 0x15, 0x00, 0x00, 0x22, 0x3D, 0x28, 0xEB, 0xFF, 0x57, 0x00, 0x00, 0x94, 0xFF, 0xA7, 0xEB, 643 | 0xFF, 0x57, 0x00, 0x00, 0x94, 0xFF, 0xA7, 0xEB, 0xFF, 0x57, 0x00, 0x00, 0x94, 0xFF, 0xA7, 0xEB, 644 | 0xFF, 0x57, 0x00, 0x00, 0x96, 0xFF, 0xA7, 0xEB, 0xFF, 0x57, 0x00, 0x00, 0xA1, 0xFF, 0xA7, 0xDF, 645 | 0xFF, 0x79, 0x00, 0x00, 0xD6, 0xFF, 0xA7, 0x9F, 0xFF, 0xF8, 0xA7, 0xCC, 0xFF, 0xFF, 0xA7, 0x19, 646 | 0xCC, 0xFF, 0xFF, 0xD2, 0x4C, 0xFF, 0xA7, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x3D, 647 | 0x3D, 0x13, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x1D, 0xB8, 0xFF, 0x8E, 0x00, 0x00, 0x0A, 0xFA, 0xFF, 648 | 0x3D, 0x57, 0xFF, 0xE5, 0x00, 0x00, 0x5D, 0xFF, 0xDF, 0x00, 0x04, 0xEE, 0xFF, 0x3D, 0x00, 0xB2, 649 | 0xFF, 0x7D, 0x00, 0x00, 0x90, 0xFF, 0x92, 0x0A, 0xFA, 0xFF, 0x1F, 0x00, 0x00, 0x30, 0xFF, 0xE7, 650 | 0x5B, 0xFF, 0xBD, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0xBF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 651 | 0x6E, 0xFF, 0xFF, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFA, 0xFF, 0x94, 0x00, 0x00, 0x00, 652 | 0x2E, 0x3D, 0x15, 0x00, 0x00, 0x2E, 0x3D, 0x28, 0x00, 0x00, 0x22, 0x3D, 0x28, 0xA7, 0xFF, 0x8A, 653 | 0x00, 0x02, 0xF6, 0xFF, 0xD2, 0x00, 0x00, 0xA7, 0xFF, 0x77, 0x57, 0xFF, 0xC9, 0x00, 0x39, 0xFF, 654 | 0xE9, 0xFF, 0x0E, 0x00, 0xF2, 0xFF, 0x2E, 0x0E, 0xFC, 0xFC, 0x0C, 0x77, 0xFF, 0x77, 0xFF, 0x50, 655 | 0x35, 0xFF, 0xE7, 0x00, 0x00, 0xC5, 0xFF, 0x50, 0xB4, 0xEB, 0x13, 0xFF, 0x8E, 0x77, 0xFF, 0x9D, 656 | 0x00, 0x00, 0x7F, 0xFF, 0x85, 0xF4, 0xA7, 0x00, 0xDA, 0xB8, 0xAC, 0xFF, 0x50, 0x00, 0x00, 0x37, 657 | 0xFF, 0xB2, 0xFF, 0x6E, 0x00, 0xA3, 0xF2, 0xDF, 0xFA, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xFA, 0xFF, 658 | 0x37, 0x00, 0x61, 0xFF, 0xFF, 0xBD, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xF8, 0x02, 0x00, 0x30, 659 | 0xFF, 0xFF, 0x74, 0x00, 0x00, 0x2C, 0x3D, 0x2E, 0x00, 0x00, 0x02, 0x3D, 0x3D, 0x19, 0x52, 0xFF, 660 | 0xFC, 0x2A, 0x00, 0x7B, 0xFF, 0xE9, 0x13, 0x00, 0xAA, 0xFF, 0xC1, 0x1F, 0xF6, 0xFF, 0x52, 0x00, 661 | 0x00, 0x15, 0xE9, 0xFF, 0xDF, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xFF, 0xF2, 0x13, 662 | 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFA, 0x9D, 663 | 0xFF, 0xDF, 0x0C, 0x00, 0x0A, 0xDD, 0xFF, 0x7F, 0x02, 0xD4, 0xFF, 0x94, 0x00, 0x92, 0xFF, 0xDD, 664 | 0x06, 0x00, 0x39, 0xFF, 0xFF, 0x3B, 0x3B, 0x3D, 0x17, 0x00, 0x00, 0x00, 0x37, 0x3D, 0x1D, 0xB6, 665 | 0xFF, 0xA7, 0x00, 0x00, 0x15, 0xFC, 0xFF, 0x3D, 0x4A, 0xFF, 0xF8, 0x04, 0x00, 0x66, 0xFF, 0xDF, 666 | 0x00, 0x02, 0xE3, 0xFF, 0x52, 0x00, 0xBB, 0xFF, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0xA7, 0x0E, 0xFC, 667 | 0xFF, 0x22, 0x00, 0x00, 0x1D, 0xFC, 0xF8, 0x66, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xFF, 668 | 0xE3, 0xFF, 0x61, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 669 | 0x02, 0xE3, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xE9, 0xFF, 0x3D, 0x00, 0x00, 0x00, 670 | 0x1D, 0x46, 0xA7, 0xFF, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xFF, 0xEE, 0x35, 0x00, 0x00, 671 | 0x00, 0x00, 0x39, 0x9B, 0x72, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x3D, 0x3D, 0x3D, 0x3D, 672 | 0x3D, 0x2A, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x33, 0x94, 0x94, 0x94, 0xFA, 0xFF, 0x83, 673 | 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xCC, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x13, 674 | 0xE7, 0xFF, 0x57, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x68, 0xFF, 0xFF, 0xB6, 675 | 0xAE, 0xAE, 0xA1, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x00, 0x00, 0x17, 0x83, 0xA5, 0x35, 676 | 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0xF2, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF2, 0xFF, 677 | 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x02, 0x50, 0xFF, 0xF6, 0x00, 0x00, 0xB4, 0xFF, 678 | 0xC9, 0x46, 0x00, 0x00, 0x7D, 0xEB, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x11, 0xFA, 0xFF, 0x00, 0x00, 679 | 0x00, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xFF, 680 | 0x7B, 0x19, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x30, 0x52, 0x1B, 0x39, 0x52, 681 | 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 682 | 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0x39, 0x52, 0x3D, 0xA5, 683 | 0x7F, 0x11, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x39, 0xFF, 0xB8, 0x00, 0x00, 684 | 0x00, 0x0C, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xF8, 685 | 0x41, 0x02, 0x00, 0x00, 0x57, 0xD2, 0xFF, 0xA7, 0x00, 0x00, 0xAE, 0xFF, 0xE5, 0x74, 0x00, 0x0C, 686 | 0xFF, 0xE9, 0x06, 0x00, 0x00, 0x0C, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xBB, 0x00, 0x00, 687 | 0x1D, 0x8E, 0xFF, 0xB6, 0x00, 0x00, 0x5D, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x1F, 0x50, 0x28, 0x00, 688 | 0x00, 0x00, 0x00, 0x46, 0x90, 0x5D, 0x15, 0x00, 0x00, 0x2E, 0x4E, 0xFF, 0xFF, 0xFF, 0xFA, 0xB4, 689 | 0xAE, 0xF0, 0x41, 0x52, 0x08, 0x46, 0xA3, 0xEE, 0xE7, 0x79, 0x00, 0x44, 0xBB, 0xD2, 0x88, 0x04, 690 | 0x24, 0xFA, 0xC5, 0x9D, 0xFC, 0x83, 0x5B, 0xFF, 0x11, 0x00, 0xAC, 0xB4, 0x3F, 0xFF, 0x7F, 0x4A, 691 | 0xE5, 0xA3, 0x00, 0x92, 0xFF, 0xFF, 0xDD, 0x1F, 0x00, 0x00, 0x0C, 0x24, 0x00, 0x00, 0x00, 0x0E, 692 | 0x4E, 0x6F, 0x74, 0x6F, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, 0x42, 0x6F, 0x6C, 0x64, 0x00, 0x0D, 693 | 0x4E, 0x6F, 0x74, 0x6F, 0x53, 0x61, 0x6E, 0x73, 0x2D, 0x42, 0x6F, 0x6C, 0x64, 0x01, 694 | }; 695 | -------------------------------------------------------------------------------- /include/TPicoC3_config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /* TFT_eSPI config */ 4 | 5 | #define USER_SETUP_LOADED 1 6 | 7 | #define ST7789_DRIVER 8 | 9 | #define TFT_WIDTH 135 10 | #define TFT_HEIGHT 240 11 | 12 | #define CGRAM_OFFSET // Library will add offsets required 13 | 14 | #define TFT_MISO -1 15 | #define TFT_MOSI 3 16 | #define TFT_SCLK 2 17 | #define TFT_CS 5 // Chip select control pin 18 | #define TFT_DC 1 // Data Command control pin 19 | #define TFT_RST 0 // Reset pin (could connect to RST pin) 20 | 21 | #define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH 22 | #define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters 23 | #define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters 24 | #define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm 25 | #define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. 26 | #define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. 27 | #define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT 28 | #define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts 29 | 30 | #define SMOOTH_FONT 1 31 | 32 | #define SPI_FREQUENCY 40000000 33 | #define SPI_READ_FREQUENCY 20000000 34 | #define SUPPORT_TRANSACTIONS 35 | 36 | 37 | /* T-PICO pin definitions */ 38 | 39 | #define PIN_TFT_BL 4 40 | #define PIN_PWR_ON 22 41 | #define PIN_BUTTON1 6 42 | #define PIN_BUTTON2 7 43 | #define PIN_RED_LED 25 44 | #define PIN_BAT_VOLT 26 45 | 46 | #define ESP32C3_RX_PIN 9 47 | #define ESP32C3_TX_PIN 8 48 | -------------------------------------------------------------------------------- /include/WioTerminalBacklight.h: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Kenta IDA 2 | // LICENSE: Boost Software License 3 | /** 4 | * @file lcd_backlight.hpp 5 | */ 6 | 7 | #ifndef LCD_BACKLIGHT_HPP__ 8 | #define LCD_BACKLIGHT_HPP__ 9 | 10 | //#include 11 | #include 12 | 13 | /** 14 | * @brief Controls Wio Terminal LCD back light brightness 15 | */ 16 | class LCDBackLight 17 | { 18 | private: 19 | uint8_t currentBrightness = 100; 20 | uint8_t maxBrightness = 100; 21 | public: 22 | /** 23 | * @brief Gets current brightness 24 | * @return current brightness. 25 | */ 26 | uint8_t getBrightness() const { return this->currentBrightness; } 27 | /** 28 | * @brief Gets maximum brightness 29 | * @return maximum brightness. 30 | */ 31 | uint8_t getMaxBrightness() const { return this->maxBrightness; } 32 | 33 | /** 34 | * @brief Sets brightness. 35 | * @param [in] brightness new value of brightness. If the brightness value exceeds maximum brightness, the value will be clipped. 36 | * 37 | */ 38 | void setBrightness(uint8_t brightness) 39 | { 40 | this->currentBrightness = brightness < this->maxBrightness ? brightness : this->maxBrightness; 41 | TC0->COUNT8.CC[0].reg = this->currentBrightness; 42 | while(TC0->COUNT8.SYNCBUSY.bit.CC0); 43 | } 44 | /** 45 | * @brief Sets maximum brightness. 46 | * @param [in] maxBrightness new value of maximum brightness. If the current brightness value exceeds maximum brightness, the current brightness will be clipped. 47 | * 48 | */ 49 | void setMaxBrightness(uint8_t maxBrightness) 50 | { 51 | this->maxBrightness = maxBrightness; 52 | if( this->currentBrightness > this->maxBrightness ) { 53 | this->currentBrightness = this->maxBrightness; 54 | } 55 | TC0->COUNT8.PER.reg = this->maxBrightness; 56 | while(TC0->COUNT8.SYNCBUSY.bit.PER); 57 | TC0->COUNT8.CC[0].reg = this->currentBrightness; 58 | while(TC0->COUNT8.SYNCBUSY.bit.CC0); 59 | } 60 | 61 | /** 62 | * @brief Initialize hardware/peripherals to control back light brightness. 63 | * @remark This function must be called before using other LCDBackLight class member functions. 64 | */ 65 | void initialize() 66 | { 67 | /* Enable Peripheral Clocks */ 68 | GCLK->PCHCTRL[9].reg = 0 | (1u<<6); // TC0, TC1 69 | while(!GCLK->PCHCTRL[9].bit.CHEN); 70 | GCLK->PCHCTRL[11].reg = 0 | (1u<<6); // EVSYS[0] 71 | while(!GCLK->PCHCTRL[11].bit.CHEN); 72 | GCLK->PCHCTRL[33].reg = 0 | (1u<<6); // CCL 73 | while(!GCLK->PCHCTRL[33].bit.CHEN); 74 | /* Enable Peropheral APB Clocks */ 75 | MCLK->APBAMASK.bit.TC0_ = 1; 76 | MCLK->APBBMASK.bit.EVSYS_ = 1; 77 | MCLK->APBCMASK.bit.CCL_ = 1; 78 | 79 | /* Configure PORT */ 80 | PORT->Group[2].DIRSET.reg = (1<<5); 81 | PORT->Group[2].EVCTRL.reg = 0x85; // PC05, OUT 82 | /* Configure EVSYS */ 83 | EVSYS->USER[1].reg = 0x01; // Channel0 -> PORT_EV0 84 | EVSYS->Channel[0].CHANNEL.reg = 0x74 | (0x02<<8) | (0x00<<10); // CCL_LUTOUT0, ASYNCHRONOUS, NO_EVT_OUTPUT 85 | /* Configure CCL */ 86 | CCL->CTRL.reg = (1<<0); // SWRST 87 | CCL->SEQCTRL[0].reg = 0x0; // Disable SEQCTRL 88 | CCL->LUTCTRL[0].reg = (0xaau << 24) | (1u<<22) | (0x6<<8) | (1<<1); // TRUTH=0xaa, LUTEO, INSEL0=0x06(TC), ENABLE 89 | CCL->CTRL.reg = (1<<1); // ENABLE 90 | 91 | /* Configure TC0 */ 92 | TC0->COUNT8.CTRLA.reg = (1u<<0); // SWRST; 93 | while( TC0->COUNT8.SYNCBUSY.bit.SWRST ); 94 | 95 | TC0->COUNT8.CTRLA.reg = (0x01 << 2) | (0x01 << 4) | (0x04 << 8); // MODE=COUNT8, PRESCALER=DIV16, PRESCSYNC=PRESC 96 | TC0->COUNT8.WAVE.reg = 0x02; // WAVEGEN=NPWM; 97 | TC0->COUNT8.CTRLBSET.reg = (1u<<1); // LUPD 98 | TC0->COUNT8.PER.reg = this->maxBrightness; 99 | TC0->COUNT8.CC[0].reg = this->currentBrightness; 100 | TC0->COUNT8.CC[1].reg = 0u; 101 | TC0->COUNT8.DBGCTRL.bit.DBGRUN = 1; 102 | TC0->COUNT8.INTFLAG.reg = 0x33; // Clear all flags 103 | while( TC0->COUNT8.SYNCBUSY.reg ); 104 | 105 | TC0->COUNT8.CTRLA.bit.ENABLE = 1; // ENABLE 106 | while( TC0->COUNT8.SYNCBUSY.bit.ENABLE ); 107 | } 108 | }; 109 | #endif //LCD_BACKLIGHT_HPP__ 110 | -------------------------------------------------------------------------------- /include/WioTerminal_config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /* TFT_eSPI config */ 4 | 5 | #define USER_SETUP_LOADED 1 6 | 7 | #define ILI9341_DRIVER 8 | 9 | #define TFT_WIDTH 320 10 | #define TFT_HEIGHT 240 11 | 12 | #define CGRAM_OFFSET // Library will add offsets required 13 | 14 | #define TFT_SPI_PORT LCD_SPI 15 | #define TFT_CS LCD_SS_PIN 16 | #define TFT_DC LCD_DC 17 | #define TFT_RST LCD_RESET 18 | 19 | #define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH 20 | #define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters 21 | #define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters 22 | #define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm 23 | #define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. 24 | #define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. 25 | #define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT 26 | #define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts 27 | 28 | #define SMOOTH_FONT 1 29 | 30 | #define SPI_FREQUENCY 40000000 31 | #define SPI_READ_FREQUENCY 20000000 32 | #define SUPPORT_TRANSACTIONS 33 | -------------------------------------------------------------------------------- /lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; https://docs.platformio.org/page/projectconf.html 3 | 4 | [platformio] 5 | default_envs = nano33iot, mkrwifi1010, rp2040connect, rp2040connect-mbed, t_pico_c3, unoR4wifi, portentaC33, pico_esp8266, uno, linux 6 | 7 | [env] 8 | framework = arduino 9 | monitor_speed = 115200 10 | 11 | # The project will use the letest Blynk.NCP binary by default 12 | # You can also specify the version 13 | #custom_ncp.firmware_ver = v0.6.3 14 | 15 | extra_scripts = 16 | tools/extra_upload_ncp.py 17 | tools/extra_ota_bin.py 18 | 19 | lib_deps = 20 | blynkkk/Blynk@1.3.2 21 | jandrassy/ArduinoOTA@1.0.11 22 | OneButton=https://github.com/mathertel/OneButton/archive/refs/heads/master.zip 23 | 24 | build_src_flags = 25 | -Wall -Wextra ; Additional warnings 26 | 27 | build_flags = 28 | -Wswitch -Wuninitialized 29 | -Wunused-function 30 | -Werror=return-type ; Fail on return type error 31 | -DNO_OTA_NETWORK ; Disable network functions in ArduinoOTA 32 | 33 | [rp2040] 34 | platform = https://github.com/maxgerhardt/platform-raspberrypi.git 35 | board_build.core = earlephilhower 36 | board_build.filesystem_size = 1M 37 | 38 | lib_ignore = 39 | WiFi 40 | 41 | [rp2040:mbed] 42 | platform = raspberrypi 43 | 44 | lib_ignore = 45 | WiFi 46 | ArduinoOTA 47 | 48 | [renesas] 49 | platform = renesas-ra@1.3.1 50 | 51 | lib_ignore = 52 | WiFiC3 53 | WiFiS3 54 | 55 | ######################################################## 56 | ## Dual-MCU boards 57 | ######################################################## 58 | 59 | [env:nano33iot] 60 | platform = atmelsam 61 | board = nano_33_iot 62 | custom_ncp.firmware = nina_w102.flash.bin 63 | custom_ncp.upload_speed = 921600 64 | 65 | [env:mkrwifi1010] 66 | platform = atmelsam 67 | board = mkrwifi1010 68 | custom_ncp.firmware = nina_w102.flash.bin 69 | custom_ncp.upload_speed = 921600 70 | 71 | [env:rp2040connect] 72 | extends = rp2040 73 | board = arduino_nano_connect 74 | board_build.filesystem_size = 8M 75 | custom_ncp.firmware = nina_w102.flash.bin 76 | custom_ncp.upload_speed = 921600 77 | custom_ncp.before_upload = no_reset 78 | 79 | [env:rp2040connect-mbed] 80 | extends = rp2040:mbed 81 | board = nanorp2040connect 82 | custom_ncp.firmware = nina_w102.flash.bin 83 | custom_ncp.upload_speed = 921600 84 | custom_ncp.before_upload = no_reset 85 | 86 | [env:t_pico_c3] 87 | extends = rp2040 88 | board = rpipico 89 | board_upload.maximum_size = 4194304 90 | board_build.filesystem_size = 2M 91 | custom_ncp.flasher = esptool 92 | custom_ncp.firmware = lilygo_pico_c3.flash.bin 93 | custom_ncp.upload_speed = 2000000 94 | custom_ncp.before_upload = usb_reset 95 | custom_ncp.pre_upload_message = 96 | Ensure your T-PicoC3 is connected in ESP mode (USB polarity indicator is GREEN) 97 | custom_ncp.post_upload_message = 98 | Blynk.NCP firmware is now running on the ESP32-S3. 99 | Please switch the Type C cable polarity (the USB indicator should be BLUE) to upload the main firmware. 100 | 101 | build_flags = 102 | ${env.build_flags} 103 | -DARDUINO_TTGO_T_PICO_C3 104 | -include "include/TPicoC3_config.h" 105 | 106 | lib_deps = 107 | ${env.lib_deps} 108 | bodmer/TFT_eSPI@2.5.31 109 | 110 | [env:unoR4wifi] 111 | extends = renesas 112 | board = uno_r4_wifi 113 | custom_ncp.flasher = esptool 114 | custom_ncp.firmware = uno_r4_wifi.flash.bin 115 | custom_ncp.upload_speed = 2000000 116 | custom_ncp.pre_upload_message = 117 | 1. Disconnect the UNO R4 WiFi from your PC 118 | 2. Short the pins highlighted in the image using a jumper wire: 119 | https://github.com/blynkkk/BlynkNcpExample/blob/main/docs/Images/Uno-R4-Jumper.png 120 | 3. Connect the UNO R4 WiFi to your PC 121 | custom_ncp.post_upload_message = 122 | 1. Disconnect the UNO R4 WiFi from your PC 123 | 2. Unplug the jumper wire 124 | 3. Connect the board to your PC again 125 | 126 | build_flags = 127 | ${env.build_flags} 128 | -DARDUINO_ARCH_RENESAS_UNO 129 | 130 | [env:portentaC33] 131 | extends = renesas 132 | board = portenta_c33 133 | custom_ncp.firmware = generic_esp32c3_4M.flash.bin 134 | custom_ncp.upload_speed = 460800 135 | 136 | [env:pico_esp8266] 137 | extends = rp2040 138 | board = rpipico 139 | custom_ncp.firmware = generic_esp8266_4M.flash.bin 140 | custom_ncp.upload_speed = 460800 141 | custom_ncp.manual_reset = yes 142 | #custom_ncp.erase_all = no 143 | custom_ncp.pre_upload_message = 144 | Switch your ESP8266 into Firware update mode: 145 | 1. Press and hold the Boot button (on some boards it can be marked as Flash or IO0) 146 | 2. Press Reset(RST/EN) button shortly 147 | 3. Release the Boot button 148 | custom_ncp.post_upload_message = 149 | Upload complete. Please power-cycle your device (unplug the board completely). 150 | 151 | [env:microduino_coreusb] 152 | platform = atmelavr 153 | board = leonardo 154 | custom_ncp.firmware = generic_esp8266_4M.flash.bin 155 | custom_ncp.upload_speed = 115200 156 | custom_ncp.manual_reset = yes 157 | custom_ncp.pre_upload_message = 158 | Switch your ESP8266 into Firware update mode: 159 | 1. Unplug your device from USB 160 | 2. Press and hold the button on the microduino wifi module 161 | 3. Plug in USB 162 | 4. Release the Boot button 163 | custom_ncp.post_upload_message = 164 | Upload complete. Please power-cycle your device (unplug the board completely). 165 | 166 | build_flags = 167 | -DBLYNK_NCP_TYPE_MICRODUINO_ESP8266 168 | -DBLYNK_NCP_SERIAL=Serial1 169 | -DBLYNK_NCP_BAUD=57600 170 | -DMICRODUINO_OLED ; Optional 171 | 172 | lib_deps = 173 | ${env.lib_deps} 174 | olikraus/U8glib@1.19.1 ; Optional 175 | 176 | [env:wio_terminal] 177 | platform = atmelsam 178 | board = seeed_wio_terminal 179 | custom_ncp.flasher = BlynkNcpFlasher, flash_wio_terminal 180 | custom_ncp.firmware = wio_terminal.zip 181 | 182 | build_flags = 183 | ${env.build_flags} 184 | -include "include/WioTerminal_config.h" 185 | 186 | lib_deps = 187 | ${env.lib_deps} 188 | bodmer/TFT_eSPI@2.5.31 189 | 190 | lib_ignore = 191 | Seeed_Arduino_LCD 192 | 193 | ######################################################## 194 | ## Generic boards (require connecting a separate NCP) 195 | ######################################################## 196 | 197 | [env:uno] 198 | platform = atmelavr 199 | board = uno 200 | custom_ncp.flasher = 201 | 202 | build_src_flags = 203 | ${env.build_src_flags} 204 | -DBLYNK_NCP_SERIAL=Serial1 205 | -DBLYNK_NCP_BAUD=57600 206 | -DBLYNK_NCP_RX=10 207 | -DBLYNK_NCP_TX=9 208 | #-DBLYNK_NCP_TYPE_WITTY_CLOUD 209 | 210 | [env:nano] 211 | platform = atmelavr 212 | board = nanoatmega328new 213 | #board = nanoatmega328 214 | custom_ncp.flasher = 215 | 216 | build_src_flags = 217 | ${env.build_src_flags} 218 | -DBLYNK_NCP_SERIAL=Serial1 219 | -DBLYNK_NCP_BAUD=57600 220 | -DBLYNK_NCP_RX=10 221 | -DBLYNK_NCP_TX=9 222 | #-DBLYNK_NCP_TYPE_WITTY_CLOUD 223 | 224 | [env:promicro8] 225 | platform = atmelavr 226 | board = sparkfun_promicro8 227 | custom_ncp.flasher = 228 | 229 | build_src_flags = 230 | ${env.build_src_flags} 231 | -DBLYNK_NCP_SERIAL=Serial1 232 | -DBLYNK_NCP_BAUD=57600 233 | #-DBLYNK_NCP_TYPE_WITTY_CLOUD 234 | 235 | [env:pico] 236 | extends = rp2040 237 | board = rpipico 238 | custom_ncp.flasher = 239 | 240 | build_src_flags = 241 | ${env.build_src_flags} 242 | #-DBLYNK_NCP_SERIAL=Serial1 243 | -DBLYNK_NCP_BAUD=115200 244 | 245 | [env:pico-mbed] 246 | extends = rp2040:mbed 247 | board = pico 248 | custom_ncp.flasher = 249 | 250 | build_src_flags = 251 | ${env.build_src_flags} 252 | -DBLYNK_NCP_SERIAL=Serial1 253 | -DBLYNK_NCP_BAUD=115200 254 | 255 | [env:linux] 256 | platform = native 257 | custom_ncp.flasher = esptool 258 | custom_ncp.firmware = generic_esp32_4M.flash.bin 259 | custom_ncp.upload_speed = 460800 260 | 261 | framework = 262 | 263 | lib_deps = 264 | ${env.lib_deps} 265 | EpoxyDuino=https://github.com/bxparks/EpoxyDuino.git 266 | 267 | lib_ignore = 268 | ArduinoOTA 269 | 270 | build_src_flags = 271 | ${env.build_src_flags} 272 | #-DBLYNK_NCP_PORT='"/dev/ttyUSB0"' 273 | -DBLYNK_NCP_BAUD=921600 274 | ## Uncomment one of these to enable the status LED / user button 275 | #-DBLYNK_NCP_TYPE_WITTY_CLOUD 276 | #-DBLYNK_NCP_TYPE_TTGO_T7 277 | #-DBLYNK_NCP_TYPE_TTGO_T7_S3 278 | #-DBLYNK_NCP_TYPE_TTGO_TOI_PLUS 279 | #-DBLYNK_NCP_TYPE_MACCHINA_SUPERB 280 | 281 | build_flags = 282 | ${env.build_flags} 283 | -DARDUINO=100 -DLINUX 284 | -DINPUT=1 -DINPUT_PULLUP=2 285 | -lserialport 286 | 287 | -------------------------------------------------------------------------------- /src/ArduinoUtils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #if !defined(__AVR__) 4 | // define std::min, std::max before Arduino 5 | #include 6 | #endif 7 | 8 | #include 9 | #include 10 | 11 | // Create Serial1 for ARDUINO_AVR_UNO and similar boards 12 | #if defined(__AVR_ATmega328P__) 13 | #include 14 | SoftwareSerial Serial1(BLYNK_NCP_RX, BLYNK_NCP_TX); 15 | #endif 16 | 17 | // Wait for serial console, up to 3 seconds 18 | template 19 | void waitSerialConsole(T& ser) { 20 | #if defined(LINUX) 21 | // Not needed on linux 22 | (void) ser; 23 | #elif defined(ARDUINO_UNOWIFIR4) 24 | delay(1500); 25 | #else 26 | while (!ser && (millis() < 3000)) { delay(10); } 27 | delay(100); 28 | #endif 29 | } 30 | 31 | static inline 32 | uint32_t rainbow(int val, int val_min, int val_max) 33 | { 34 | const int hue = map(val, val_min, val_max, 0, 1535); 35 | long red, green, blue; 36 | 37 | if (hue < 256) { 38 | red = 255; 39 | blue = hue; 40 | green = 0; 41 | } 42 | else if (hue < 512) { 43 | red = 511 - hue; 44 | blue = 255; 45 | green = 0; 46 | } 47 | else if (hue < 768) { 48 | red = 0; 49 | blue = 255; 50 | green = hue - 512; 51 | } 52 | else if (hue < 1024) { 53 | red = 0; 54 | blue = 1023 - hue; 55 | green = 255; 56 | } 57 | else if (hue < 1280) { 58 | red = hue - 1024; 59 | blue = 0; 60 | green = 255; 61 | } 62 | else { 63 | red = 255; 64 | blue = 0; 65 | green = 1535 - hue; 66 | } 67 | return (red << 16) | (green << 8) | blue; 68 | } 69 | 70 | static inline 71 | String RGBtoHEX(uint32_t rgb32) { 72 | char buff[32]; 73 | snprintf(buff, sizeof(buff), 74 | "#%02" PRIx32 "%02" PRIx32 "%02" PRIx32, 75 | (rgb32>>16)&0xFF, (rgb32>>8)&0xFF, rgb32&0xFF); 76 | return buff; 77 | } 78 | 79 | static inline 80 | uint16_t RGBtoRGB16(uint32_t rgb32) { 81 | return (rgb32>>8&0xf800) | (rgb32>>5&0x07e0) | (rgb32>>3&0x001f); 82 | } 83 | 84 | // Entry point for Linux target 85 | #if defined(LINUX) 86 | int main(int argc, char* argv[]) 87 | { 88 | (void) argc; 89 | (void) argv; 90 | 91 | setup(); 92 | while (true) { 93 | loop(); 94 | delay(1); 95 | } 96 | return 0; 97 | } 98 | #endif 99 | -------------------------------------------------------------------------------- /src/BoardSetup.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #if defined(ARDUINO_TTGO_T_PICO_C3) 4 | 5 | #include 6 | 7 | #include "BlynkLogoBlack96.h" 8 | #include "NotoSansBold15.h" 9 | 10 | TFT_eSPI tft; 11 | OneButton Button1(PIN_BUTTON1, true); 12 | OneButton Button2(PIN_BUTTON2, true); 13 | 14 | static 15 | void setupBoard() { 16 | /* Open the power supply */ 17 | pinMode(PIN_PWR_ON, OUTPUT); 18 | digitalWrite(PIN_PWR_ON, HIGH); 19 | 20 | tft.begin(); 21 | tft.initDMA(); 22 | tft.setSwapBytes(true); 23 | tft.setRotation(1); 24 | tft.fillScreen(TFT_BLACK); 25 | tft.pushImage((TFT_HEIGHT-96)/2, 26 | (TFT_WIDTH-96)/2, 27 | 96, 96, 28 | BlynkLogoBlack96); 29 | 30 | /* Gradually lighten up */ 31 | pinMode(PIN_TFT_BL, OUTPUT); 32 | for (int i = 0; i <= 120; i += 5) { 33 | analogWrite(PIN_TFT_BL, i); 34 | delay(20); 35 | } 36 | delay(1000); 37 | 38 | tft.fillScreen(TFT_BLACK); 39 | tft.loadFont(NotoSansBold15); 40 | tft.setTextWrap(true, true); 41 | } 42 | 43 | static 44 | void displayClear() { 45 | tft.fillScreen(TFT_BLACK); 46 | } 47 | 48 | static 49 | void displayMessage(const String& text) { 50 | Serial.println(text); 51 | tft.fillScreen(TFT_BLACK); 52 | tft.setTextColor(TFT_GREENYELLOW, TFT_BLACK); 53 | tft.setTextDatum(MC_DATUM); 54 | tft.drawString(text, TFT_HEIGHT/2, TFT_WIDTH/2); 55 | } 56 | 57 | static 58 | void displayColor(uint32_t color) { 59 | Serial.printf("Color: %06" PRIx32 "\n", color); 60 | tft.fillSmoothRoundRect(10, 10, TFT_HEIGHT-20, TFT_WIDTH-20, 7, 61 | RGBtoRGB16(color), TFT_BLACK); 62 | } 63 | 64 | #elif defined(SEEED_WIO_TERMINAL) 65 | 66 | #include 67 | #include "WioTerminalBacklight.h" 68 | #include "BlynkLogoBlack96.h" 69 | #include "NotoSansBold15.h" 70 | 71 | TFT_eSPI tft; 72 | LCDBackLight backLight; 73 | 74 | OneButton Button1(WIO_KEY_C, true); 75 | OneButton Button2(WIO_KEY_B, true); 76 | OneButton Button3(WIO_KEY_A, true); 77 | 78 | static 79 | void setupBoard() { 80 | pinMode(LED_BUILTIN, OUTPUT); 81 | digitalWrite(LED_BUILTIN, LOW); 82 | 83 | tft.begin(); 84 | tft.setSwapBytes(true); 85 | tft.setRotation(3); 86 | tft.fillScreen(TFT_BLACK); 87 | tft.pushImage((TFT_HEIGHT-96)/2, 88 | (TFT_WIDTH-96)/2, 89 | 96, 96, 90 | BlynkLogoBlack96); 91 | 92 | /* Gradually lighten up */ 93 | backLight.initialize(); 94 | for (int i = 0; i <= backLight.getMaxBrightness()/2; i++) { 95 | backLight.setBrightness(i); 96 | delay(20); 97 | } 98 | 99 | delay(1000); 100 | 101 | tft.fillScreen(TFT_BLACK); 102 | tft.loadFont(NotoSansBold15); 103 | tft.setTextWrap(true, true); 104 | } 105 | 106 | static 107 | void displayClear() { 108 | tft.fillScreen(TFT_BLACK); 109 | } 110 | 111 | static 112 | void displayMessage(const String& text) { 113 | Serial.println(text); 114 | tft.fillScreen(TFT_BLACK); 115 | tft.setTextColor(TFT_GREENYELLOW, TFT_BLACK); 116 | tft.setTextDatum(MC_DATUM); 117 | tft.drawString(text, TFT_HEIGHT/2, TFT_WIDTH/2); 118 | } 119 | 120 | static 121 | void displayColor(uint32_t color) { 122 | Serial.printf("Color: %06" PRIx32 "\n", color); 123 | tft.fillSmoothRoundRect(20, 20, TFT_HEIGHT-40, TFT_WIDTH-40, 7, 124 | RGBtoRGB16(color), TFT_BLACK); 125 | } 126 | 127 | #elif defined(MICRODUINO_OLED) 128 | 129 | #include 130 | 131 | U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); 132 | 133 | // Attach a momentary push button to pin 6 (active LOW) 134 | OneButton Button1(6, true); 135 | 136 | static 137 | void setupBoard() { 138 | u8g.setColorIndex(1); 139 | u8g.setFont(u8g_font_6x10); 140 | 141 | u8g.firstPage(); 142 | do { 143 | u8g.drawStr(10, 36, "Blynk.NCP"); 144 | } while(u8g.nextPage()); 145 | 146 | delay(1000); 147 | } 148 | 149 | static 150 | void displayClear() { 151 | u8g.firstPage(); 152 | do { 153 | //u8g.clear(); 154 | } while(u8g.nextPage()); 155 | } 156 | 157 | static 158 | void displayMessage(const String& text) { 159 | Serial.println(text); 160 | 161 | u8g.firstPage(); 162 | do { 163 | u8g.drawStr(10, 36, text.c_str()); 164 | } while(u8g.nextPage()); 165 | } 166 | 167 | static 168 | void displayColor(uint32_t color) { 169 | char buff[32]; 170 | snprintf(buff, sizeof(buff), 171 | "Color: %06" PRIx32, color); 172 | displayMessage(buff); 173 | } 174 | 175 | #else 176 | 177 | // Attach a momentary push button to pin 6 (active LOW) 178 | OneButton Button1(6, true); 179 | 180 | static 181 | void setupBoard() { 182 | } 183 | 184 | static 185 | void displayClear() { 186 | } 187 | 188 | static 189 | void displayMessage(const String& text) { 190 | Serial.println(text); 191 | } 192 | 193 | static 194 | void displayColor(uint32_t color) { 195 | char buff[32]; 196 | snprintf(buff, sizeof(buff), 197 | "Color: %06" PRIx32, color); 198 | displayMessage(buff); 199 | } 200 | 201 | #endif 202 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | /* Fill in information from your Blynk Template here */ 2 | /* Read more: https://bit.ly/BlynkInject */ 3 | //#define BLYNK_TEMPLATE_ID "TMPxxxxxx" 4 | //#define BLYNK_TEMPLATE_NAME "Device" 5 | 6 | /* The firmware version of the Primary MCU (used for OTA updates) */ 7 | #define BLYNK_FIRMWARE_VERSION "0.1.0" 8 | 9 | // Debug output 10 | #define BLYNK_PRINT Serial 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | BlynkTimer timer; 18 | 19 | BLYNK_CONNECTED() { 20 | BLYNK_LOG("Connected to Blynk 🙌"); 21 | Blynk.syncVirtual(V1); 22 | } 23 | 24 | BLYNK_DISCONNECTED() { 25 | BLYNK_LOG("Blynk disconnected"); 26 | } 27 | 28 | BLYNK_WRITE(V1) { 29 | uint32_t color = rainbow(param.asInt(), 0, 64); 30 | Blynk.setProperty(V0, "color", RGBtoHEX(color)); 31 | displayColor(color); 32 | } 33 | 34 | void setupUserButton() { 35 | Button1.setLongPressIntervalMs(1000); 36 | 37 | Button1.attachClick([]() { 38 | displayMessage("Click!"); 39 | timer.setTimeout(1000, displayClear); 40 | }); 41 | Button1.attachDoubleClick([]() { 42 | displayMessage("Double Click!"); 43 | timer.setTimeout(1000, displayClear); 44 | }); 45 | 46 | Button1.attachLongPressStart([]() { 47 | displayMessage("Hold button to reset config"); 48 | }); 49 | Button1.attachDuringLongPress([]() { 50 | const uint32_t t = Button1.getPressedMs(); 51 | if (t > 10000 && t < 15000) { 52 | displayMessage("Release button"); 53 | } else if (t > 15000) { 54 | displayClear(); 55 | } 56 | }); 57 | Button1.attachLongPressStop([]() { 58 | const uint32_t t = Button1.getPressedMs(); 59 | if (t > 10000 && t < 15000) { 60 | if (Blynk.resetConfig()) { 61 | BLYNK_LOG("Blynk.NCP configuration is erased"); 62 | } 63 | } 64 | displayClear(); 65 | }); 66 | } 67 | 68 | void setup() { 69 | Serial.begin(115200); 70 | Serial.println(); 71 | 72 | setupBoard(); 73 | setupUserButton(); 74 | waitSerialConsole(Serial); 75 | 76 | BLYNK_LOG("Main firmware: %s", BLYNK_FIRMWARE_VERSION); 77 | BLYNK_LOG("Build: %s", __DATE__ " " __TIME__); 78 | 79 | displayMessage("Initializing Blynk.NCP"); 80 | 81 | if (Blynk.initNCP()) { 82 | String ver = Blynk.getNcpVersion(); 83 | BLYNK_LOG("Blynk.NCP firmware: %s", ver.c_str()); 84 | } else { 85 | displayMessage("Cannot communicate to Blynk.NCP"); 86 | return; 87 | } 88 | 89 | // Print state changes 90 | Blynk.onStateChange([]() { 91 | displayMessage(Blynk.getStateString()); 92 | }); 93 | 94 | // Set config mode timeout to 30 minutes, for testing purposes 95 | Blynk.setConfigTimeout(30*60); 96 | 97 | // White labeling (use this ONLY if you have a branded Blynk App) 98 | //Blynk.setVendorPrefix("MyCompany"); 99 | //Blynk.setVendorServer("dashboard.mycompany.com"); 100 | 101 | // Product setup 102 | if (!Blynk.begin(BLYNK_TEMPLATE_ID, BLYNK_TEMPLATE_NAME)) { 103 | displayMessage("Error. Invalid Template ID?"); 104 | return; 105 | } 106 | 107 | // Publish some data periodically 108 | timer.setInterval(1000, []() { 109 | Blynk.virtualWrite(V0, millis() / 1000); 110 | }); 111 | } 112 | 113 | void loop() { 114 | timer.run(); 115 | Blynk.run(); 116 | Button1.tick(); 117 | delay(1); 118 | } 119 | -------------------------------------------------------------------------------- /tools/.gitignore: -------------------------------------------------------------------------------- 1 | ambd_flash_tool/ 2 | 3 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/.gitignore: -------------------------------------------------------------------------------- 1 | build/** 2 | .DS_Store 3 | .pio/ 4 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; https://docs.platformio.org/page/projectconf.html 3 | 4 | [env] 5 | framework = arduino 6 | monitor_speed = 115200 7 | 8 | ######################################################## 9 | ## Boards 10 | ######################################################## 11 | 12 | [env:mkrwifi1010] 13 | platform = atmelsam 14 | board = mkrwifi1010 15 | 16 | [env:nano33iot] 17 | platform = atmelsam 18 | board = nano_33_iot 19 | 20 | [env:rp2040connect] 21 | platform = raspberrypi 22 | board = nanorp2040connect 23 | 24 | [env:pico_esp8266] 25 | platform = raspberrypi 26 | board = pico 27 | 28 | [env:unoR4minima] 29 | platform = renesas-ra 30 | board = uno_r4_minima 31 | 32 | [env:unoR4wifi] 33 | platform = renesas-ra 34 | board = uno_r4_wifi 35 | 36 | [env:portentaC33] 37 | platform = renesas-ra 38 | board = portenta_c33 39 | 40 | [env:wio_terminal] 41 | platform = atmelsam 42 | board = seeed_wio_terminal 43 | 44 | [env:microduino_coreusb] 45 | platform = atmelavr 46 | board = leonardo 47 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/loop_baud_check.h: -------------------------------------------------------------------------------- 1 | 2 | void loop() { 3 | // check if the USB virtual serial wants a new baud rate 4 | if (SerialPC.baud() != baud) { 5 | baud = SerialPC.baud(); 6 | SerialNCP.begin(baud); 7 | } 8 | #include "passthrough.h" 9 | } 10 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/loop_nina.h: -------------------------------------------------------------------------------- 1 | 2 | void loop() { 3 | if (rts != SerialPC.rts()) { 4 | rts = SerialPC.rts(); 5 | #if defined(ARDUINO_SAMD_NANO_33_IOT) 6 | digitalWrite(NINA_RESETN, rts ? LOW : HIGH); 7 | #else 8 | digitalWrite(NINA_RESETN, rts ? HIGH : LOW); 9 | #endif 10 | } 11 | 12 | if (dtr != SerialPC.dtr()) { 13 | dtr = SerialPC.dtr(); 14 | digitalWrite(NINA_GPIO0, (dtr == 0) ? HIGH : LOW); 15 | } 16 | 17 | // check if the USB virtual serial wants a new baud rate 18 | if (SerialPC.baud() != baud) { 19 | rts = -1; 20 | dtr = -1; 21 | 22 | baud = SerialPC.baud(); 23 | SerialNCP.begin(baud); 24 | } 25 | #include "passthrough.h" 26 | } 27 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/loop_renesas.h: -------------------------------------------------------------------------------- 1 | 2 | void loop() { 3 | 4 | const auto _rts = SerialPC.rts(); 5 | const auto _dtr = SerialPC.dtr(); 6 | 7 | if ((rts != _rts) || (dtr != _dtr)) { 8 | rts = _rts; 9 | dtr = _dtr; 10 | #ifdef NCP_PIN_RESETN 11 | digitalWrite(NCP_PIN_RESETN, _rts ? LOW : HIGH); 12 | #endif 13 | #ifdef NCP_PIN_GPIO0 14 | digitalWrite(NCP_PIN_GPIO0, _dtr ? LOW : HIGH); 15 | #endif 16 | 17 | ledOFF(); 18 | } 19 | 20 | int len = 0; 21 | static uint8_t buffer[488]; 22 | while (SerialPC.available() && len < sizeof(buffer)) { 23 | buffer[len++] = SerialPC.read(); 24 | } 25 | if (len) { 26 | ledToggle(); 27 | SerialNCP.write(buffer, len); 28 | } 29 | 30 | len = 0; 31 | while (SerialNCP.available() && len < sizeof(buffer)) { 32 | buffer[len++] = SerialNCP.read(); 33 | } 34 | if (len) { 35 | SerialPC.write(buffer, len); 36 | } 37 | 38 | // check if the USB virtual serial wants a new baud rate 39 | if (SerialPC.baud() != baud) { 40 | //rts = -1; 41 | //dtr = -1; 42 | 43 | baud = SerialPC.baud(); 44 | SerialNCP.end(); 45 | SerialNCP.begin(baud); 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/loop_simple.h: -------------------------------------------------------------------------------- 1 | 2 | void loop() { 3 | #include "passthrough.h" 4 | } 5 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/loop_vidor.h: -------------------------------------------------------------------------------- 1 | 2 | void loop() { 3 | if (rts != SerialPC.rts()) { 4 | rts = SerialPC.rts(); 5 | FPGA.digitalWrite(FPGA_SPIWIFI_RESET, (rts == 1) ? LOW : HIGH); 6 | } 7 | 8 | if (dtr != SerialPC.dtr()) { 9 | dtr = SerialPC.dtr(); 10 | FPGA.digitalWrite(FPGA_NINA_GPIO0, (dtr == 1) ? HIGH : LOW); 11 | } 12 | 13 | // check if the USB virtual serial wants a new baud rate 14 | if (SerialPC.baud() != baud) { 15 | rts = -1; 16 | dtr = -1; 17 | 18 | baud = SerialPC.baud(); 19 | } 20 | 21 | #include "passthrough.h" 22 | } 23 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/loop_wio_terminal.h: -------------------------------------------------------------------------------- 1 | 2 | void loop() { 3 | // check if the USB virtual serial wants a new baud rate 4 | if (SerialPC.baud() != baud) { 5 | baud = SerialPC.baud(); 6 | SerialNCP.begin(baud); 7 | if (baud == 2400) { 8 | ncpReboot(); 9 | } 10 | } 11 | #include "passthrough.h" 12 | } 13 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #if !defined(SerialNCP) 4 | #define SerialPC Serial 5 | #endif 6 | 7 | void ledOFF(); 8 | void ledToggle(); 9 | 10 | #ifdef SerialNCP 11 | 12 | // Good, use the specified SerialNCP 13 | 14 | void ncpInit() {} 15 | 16 | #elif defined(ARDUINO_NANO_RP2040_CONNECT) || \ 17 | defined(ARDUINO_SAMD_NANO_33_IOT) || \ 18 | defined(ARDUINO_SAMD_MKRWIFI1010) 19 | 20 | #define SerialNCP SerialNina 21 | 22 | unsigned long baud = 115200; 23 | int rts = -1; 24 | int dtr = -1; 25 | 26 | void ncpInit() { 27 | SerialNCP.begin(baud); 28 | 29 | pinMode(NINA_GPIO0, OUTPUT); 30 | pinMode(NINA_RESETN, OUTPUT); 31 | } 32 | 33 | #include "loop_nina.h" 34 | 35 | #elif defined(ARDUINO_AVR_UNO_WIFI_REV2) 36 | 37 | #define SerialNCP SerialNina 38 | 39 | unsigned long baud = 115200; 40 | 41 | void ncpInit() { 42 | SerialNCP.begin(baud); 43 | 44 | pinMode(NINA_GPIO0, OUTPUT); 45 | pinMode(NINA_RESETN, OUTPUT); 46 | 47 | // Manually switch NINA module into upload mode 48 | digitalWrite(NINA_GPIO0, LOW); 49 | 50 | digitalWrite(NINA_RESETN, LOW); 51 | delay(100); 52 | digitalWrite(NINA_RESETN, HIGH); 53 | delay(100); 54 | digitalWrite(NINA_RESETN, LOW); 55 | } 56 | 57 | #include "loop_simple.h" 58 | 59 | #elif defined(ARDUINO_SAMD_MKRVIDOR4000) 60 | 61 | #include 62 | 63 | #define SerialNCP SerialNina 64 | 65 | unsigned long baud = 119400; 66 | int rts = -1; 67 | int dtr = -1; 68 | 69 | void ncpInit() { 70 | FPGA.begin(); 71 | SerialNCP.begin(baud); 72 | 73 | FPGA.pinMode(FPGA_NINA_GPIO0, OUTPUT); 74 | FPGA.pinMode(FPGA_SPIWIFI_RESET, OUTPUT); 75 | } 76 | 77 | #include "loop_vidor.h" 78 | 79 | #elif defined(ARDUINO_UNOWIFIR4) 80 | 81 | #undef SerialPC 82 | #define SerialPC SerialUSB 83 | #define SerialNCP Serial2 84 | 85 | unsigned long baud = 9600; 86 | int rts = -1; 87 | int dtr = -1; 88 | 89 | void ncpInit() { 90 | SerialNCP.begin(baud); 91 | } 92 | 93 | #include "loop_renesas.h" 94 | 95 | #elif defined(ARDUINO_UNOR4_MINIMA) 96 | 97 | #define SerialNCP Serial1 98 | 99 | unsigned long baud = 9600; 100 | int rts = -1; 101 | int dtr = -1; 102 | 103 | void ncpInit() { 104 | SerialNCP.begin(baud); 105 | } 106 | 107 | #include "loop_renesas.h" 108 | 109 | #elif defined(ARDUINO_PORTENTA_C33) 110 | 111 | #define SerialNCP Serial5 112 | #define NCP_PIN_GPIO0 (100) 113 | #define NCP_PIN_RESETN (101) 114 | #define LED_PIN LEDB 115 | 116 | unsigned long baud = 9600; 117 | int rts = -1; 118 | int dtr = -1; 119 | 120 | void ncpInit() { 121 | SerialNCP.begin(baud); 122 | 123 | pinMode(LEDR, OUTPUT); digitalWrite(LEDR, HIGH); 124 | pinMode(LEDG, OUTPUT); digitalWrite(LEDG, HIGH); 125 | 126 | pinMode(NCP_PIN_GPIO0, OUTPUT); 127 | pinMode(NCP_PIN_RESETN, OUTPUT); 128 | 129 | digitalWrite(NCP_PIN_GPIO0, HIGH); 130 | delay(100); 131 | digitalWrite(NCP_PIN_RESETN, HIGH); 132 | digitalWrite(NCP_PIN_RESETN, LOW); 133 | digitalWrite(NCP_PIN_RESETN, HIGH); 134 | } 135 | 136 | #include "loop_renesas.h" 137 | 138 | #elif defined(ARDUINO_RASPBERRY_PI_PICO) || \ 139 | defined(__AVR_ATmega32U4__) || \ 140 | defined(__AVR_ATmega16U4__) 141 | 142 | #define SerialNCP Serial1 143 | 144 | unsigned long baud = 74880; 145 | 146 | void ncpInit() { 147 | SerialNCP.begin(baud); 148 | } 149 | 150 | #include "loop_baud_check.h" 151 | 152 | #elif defined(SEEED_WIO_TERMINAL) 153 | 154 | #include "TFT_eSPI.h" 155 | TFT_eSPI tft; 156 | 157 | #define SerialNCP RTL8720D 158 | 159 | unsigned long baud = 115200; 160 | 161 | void ncpInit() { 162 | tft.begin(); 163 | tft.setRotation(3); 164 | tft.fillScreen(TFT_BLACK); 165 | 166 | tft.setFreeFont(&FreeSansBoldOblique12pt7b); 167 | tft.setTextColor(TFT_GREENYELLOW, TFT_BLACK); 168 | tft.setTextDatum(BC_DATUM); 169 | tft.drawString("Flashing RTL8720...", TFT_HEIGHT/2, TFT_WIDTH/2); 170 | 171 | pinMode(PIN_SERIAL2_RX, OUTPUT); 172 | pinMode(RTL8720D_CHIP_PU, OUTPUT); 173 | digitalWrite(PIN_SERIAL2_RX, LOW); 174 | digitalWrite(RTL8720D_CHIP_PU, LOW); 175 | delay(100); 176 | digitalWrite(RTL8720D_CHIP_PU, HIGH); 177 | delay(500); 178 | pinMode(PIN_SERIAL2_RX, INPUT); 179 | 180 | SerialNCP.begin(baud); 181 | } 182 | 183 | void ncpReboot() { 184 | tft.fillScreen(TFT_BLACK); 185 | tft.drawString("Firmware update OK", TFT_HEIGHT/2, TFT_WIDTH/2); 186 | 187 | digitalWrite(LED_BUILTIN, LOW); 188 | digitalWrite(RTL8720D_CHIP_PU, LOW); 189 | delay(100); 190 | digitalWrite(RTL8720D_CHIP_PU, HIGH); 191 | } 192 | 193 | #include "loop_wio_terminal.h" 194 | 195 | #else 196 | #error "Platform not supported" 197 | #endif 198 | 199 | /* 200 | * LED 201 | */ 202 | 203 | #if !defined(LED_PIN) && defined(LED_BUILTIN) 204 | #define LED_PIN LED_BUILTIN 205 | #endif 206 | 207 | #if defined(LED_PIN) 208 | void ledInit() { 209 | pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); 210 | } 211 | 212 | void ledOFF() { 213 | digitalWrite(LED_PIN, HIGH); 214 | } 215 | 216 | void ledToggle() { 217 | uint32_t now = millis(); 218 | static uint32_t last_toggle = now; 219 | if (now - last_toggle > 100) { 220 | last_toggle = now; 221 | digitalWrite(LED_PIN, !digitalRead(LED_PIN)); 222 | } 223 | } 224 | #else 225 | void ledInit() {} 226 | void ledOFF() {} 227 | void ledToggle() {} 228 | #endif 229 | 230 | 231 | /* 232 | * Main 233 | */ 234 | 235 | void setup() { 236 | SerialPC.begin(baud); 237 | 238 | ledInit(); 239 | ncpInit(); 240 | } 241 | 242 | -------------------------------------------------------------------------------- /tools/BlynkNcpFlasher/src/passthrough.h: -------------------------------------------------------------------------------- 1 | 2 | static char buffer[512]; 3 | 4 | if (SerialPC.available() > 0) { 5 | unsigned len = min(SerialPC.available(), sizeof(buffer)); 6 | SerialPC.readBytes(buffer, len); 7 | SerialNCP.write(buffer, len); 8 | ledToggle(); 9 | } 10 | 11 | if (SerialNCP.available() > 0) { 12 | unsigned len = min(SerialNCP.available(), sizeof(buffer)); 13 | SerialNCP.readBytes(buffer, len); 14 | SerialPC.write(buffer, len); 15 | } 16 | 17 | -------------------------------------------------------------------------------- /tools/blynk_tag.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Extract the binary tag from the firmware binary: 5 | python3 blynk-tag.py extract ./raw_firmware.bin ./tag.bin 6 | 7 | Create a new binary tag manually: 8 | python3 blynk-tag.py create ./tag.bin --mcu 0.1.2 --type TMPL0123456 --build "Apr 19 2023 12:01:07" --blynk "0.3.0" 9 | 10 | Show info in a tag or a firmware: 11 | python3 blynk-tag.py show ./tag.bin 12 | python3 blynk-tag.py show ./raw_firmware.bin 13 | 14 | """ 15 | import re 16 | 17 | def create_tag(taginfo): 18 | taginfo = map(lambda x: x.encode('utf-8'), taginfo) 19 | return b'\0'.join(taginfo) + b'\0\0' 20 | 21 | def find_tag(data): 22 | r = re.compile(b'blnkinf\\x00[\\w\\s\\.,:\\-\\(\\)\\x00]*?\\x00\\x00') 23 | match = r.search(data) 24 | if match is not None: 25 | return match[0] 26 | return None 27 | 28 | def parse_tag(tag): 29 | def pairwise(t): 30 | it = iter(t) 31 | return zip(it,it) 32 | 33 | taginfo = tag.split(b'\0') 34 | taginfo = list(map(lambda x: x.decode('utf-8'), taginfo)) 35 | return list(pairwise(taginfo[1:-2])) 36 | 37 | if __name__ == "__main__": 38 | import sys 39 | import argparse 40 | 41 | def run_extract(args): 42 | with open(args.file_in, 'rb') as f: 43 | data = f.read() 44 | tag = find_tag(data) 45 | if tag is None: 46 | print("Blynk info tag not found", file=sys.stderr) 47 | sys.exit(1) 48 | with open(args.file_out, 'wb') as f: 49 | f.write(tag) 50 | 51 | def run_show(args): 52 | with open(args.file_in, 'rb') as f: 53 | data = f.read() 54 | tag = find_tag(data) 55 | if tag is None: 56 | print("Blynk info tag not found", file=sys.stderr) 57 | sys.exit(1) 58 | 59 | for n,v in parse_tag(tag): 60 | print(f"{n}: {v}") 61 | 62 | def run_create(args): 63 | taginfo = ["blnkinf"] 64 | taginfo.extend(["mcu", args.mcu]) 65 | taginfo.extend(["fw-type", args.type]) 66 | if args.build: 67 | taginfo.extend(["build", args.build]) 68 | if args.blynk: 69 | taginfo.extend(["blynk", args.blynk]) 70 | 71 | tag = create_tag(taginfo) 72 | with open(args.file_out, 'wb') as f: 73 | f.write(tag) 74 | 75 | parser = argparse.ArgumentParser(description='Blynk firmware tag utility') 76 | subparsers = parser.add_subparsers() 77 | create = subparsers.add_parser('create') 78 | create.add_argument('--mcu', help='Version of the MCU firmware', required=True) 79 | create.add_argument('--type', help='Firmware type (usually same as TemplateID)', required=True) 80 | create.add_argument('--build', help='Firmware build date and time') 81 | create.add_argument('--blynk', help='Blynk library version') 82 | create.add_argument('file_out', metavar='FILE_OUT', help='output file') 83 | create.set_defaults(func=run_create) 84 | 85 | extract = subparsers.add_parser('extract') 86 | extract.add_argument('file_in', metavar='FILE_IN', help='input file') 87 | extract.add_argument('file_out', metavar='FILE_OUT', help='output file') 88 | extract.set_defaults(func=run_extract) 89 | 90 | show = subparsers.add_parser('show') 91 | show.add_argument('file_in', metavar='FILE_IN', help='input file') 92 | show.set_defaults(func=run_show) 93 | 94 | args = parser.parse_args() 95 | if "func" in args: 96 | args.func(args) 97 | else: 98 | parser.print_usage() 99 | -------------------------------------------------------------------------------- /tools/extra_ota_bin.py: -------------------------------------------------------------------------------- 1 | Import("env") 2 | 3 | import os 4 | import shutil 5 | 6 | pioenv = env["PIOENV"] 7 | ota_bin = f"build/firmware_{pioenv}.ota.bin" 8 | 9 | os.makedirs("./build", exist_ok=True) 10 | 11 | def copy_bin(source, target, env): 12 | shutil.copy(target[0].get_path(), ota_bin) 13 | 14 | if pioenv in ["rp2040connect"]: 15 | # BIN from ELF 16 | env.AddPostAction( 17 | "$BUILD_DIR/${PROGNAME}.elf", 18 | env.VerboseAction(" ".join([ 19 | "$OBJCOPY", "-O", "binary", "\"$BUILD_DIR/${PROGNAME}.elf\"", ota_bin 20 | ]), f"Building {ota_bin}") 21 | ) 22 | elif not "mbed" in pioenv: 23 | env.AddPostAction( 24 | "$BUILD_DIR/${PROGNAME}.bin", 25 | env.VerboseAction(copy_bin, f"Building {ota_bin}") 26 | ) 27 | 28 | -------------------------------------------------------------------------------- /tools/extra_upload_ncp.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import time 4 | import requests 5 | import fnmatch 6 | import json 7 | import subprocess 8 | 9 | Import("env") 10 | 11 | class dotdict(dict): 12 | __getattr__ = dict.get 13 | __setattr__ = dict.__setitem__ 14 | __delattr__ = dict.__delitem__ 15 | 16 | def toBool(v): 17 | if type(v) == str: 18 | return v.lower() in [ "yes", "true" ] 19 | else: 20 | return bool(v) 21 | 22 | pioenv = env["PIOENV"] 23 | 24 | custom_ncp = dotdict({}) 25 | custom_ncp.flasher = env.GetProjectOption("custom_ncp.flasher", "BlynkNcpFlasher, esptool") 26 | custom_ncp.firmware = env.GetProjectOption("custom_ncp.firmware", None) 27 | custom_ncp.firmware_ver = env.GetProjectOption("custom_ncp.firmware_ver", "latest") 28 | custom_ncp.upload_speed = env.GetProjectOption("custom_ncp.upload_speed", "460800") 29 | custom_ncp.manual_reset = toBool(env.GetProjectOption("custom_ncp.manual_reset", False)) 30 | custom_ncp.erase_all = toBool(env.GetProjectOption("custom_ncp.erase_all", True)) 31 | custom_ncp.use_stub = toBool(env.GetProjectOption("custom_ncp.use_stub", True)) 32 | if custom_ncp.manual_reset: 33 | custom_ncp.before_upload = env.GetProjectOption("custom_ncp.before_upload", "no_reset") 34 | custom_ncp.after_upload = env.GetProjectOption("custom_ncp.after_upload", "no_reset") 35 | else: 36 | custom_ncp.before_upload = env.GetProjectOption("custom_ncp.before_upload", "default_reset") 37 | custom_ncp.after_upload = env.GetProjectOption("custom_ncp.after_upload", "hard_reset") 38 | custom_ncp.pre_upload_message = env.GetProjectOption("custom_ncp.pre_upload_message", None) 39 | custom_ncp.post_upload_message = env.GetProjectOption("custom_ncp.post_upload_message", None) 40 | 41 | hint_no_flasher = """ 42 | Please follow the official firmware flashing guide. This is usually provided by the module vendor. 43 | Blynk.NCP is shipped as a combined firmware, so you only need to flash a single file (flash at address 0). 44 | 45 | Select the firmware file, corresponding to your module type: 46 | https://docs.blynk.io/en/getting-started/supported-boards#connectivity-modules-supported-by-blynk.ncp 47 | """ 48 | 49 | press_enter_msg = """ 50 | 51 | Press [Enter] when ready. 52 | """ 53 | 54 | def check_exec(cmd): 55 | if env.Execute(cmd): 56 | env.Exit(1) 57 | 58 | def download_file(url, filename): 59 | with requests.get(url, stream=True) as r: 60 | r.raise_for_status() 61 | with open(filename, 'wb') as f: 62 | for chunk in r.iter_content(chunk_size=8192): 63 | f.write(chunk) 64 | 65 | 66 | def get_release_info(release): 67 | repo = "blynkkk/BlynkNcpDriver" 68 | now = int(time.time()) 69 | 70 | if release is None: 71 | release = "latest" 72 | 73 | cached_info = f".pio/BlynkNCP/.cache/{release}.json" 74 | 75 | try: 76 | with open(cached_info, "r") as f: 77 | data = json.load(f) 78 | 79 | if release == "latest" and now - data["timestamp"] > 24*60*60: 80 | need_get_info = True 81 | else: 82 | need_get_info = False 83 | except: 84 | need_get_info = True 85 | 86 | if need_get_info: 87 | print("Getting Blynk.NCP release info") 88 | if release == "latest": 89 | url = f"https://api.github.com/repos/{repo}/releases/latest" 90 | else: 91 | url = f"https://api.github.com/repos/{repo}/releases/tags/{release}" 92 | 93 | with requests.get(url) as r: 94 | r.raise_for_status() 95 | data = r.json() 96 | data["timestamp"] = now 97 | 98 | os.makedirs(".pio/BlynkNCP/.cache/", exist_ok=True) 99 | with open(cached_info, "w") as f: 100 | json.dump(data, f) 101 | 102 | return data 103 | 104 | def get_download_url(filename, release_info): 105 | for asset in release_info["assets"]: 106 | asset_name = asset["name"] 107 | if fnmatch.fnmatch(asset_name, filename): 108 | return (asset_name, asset["browser_download_url"]) 109 | 110 | tag = release_info["tag_name"] 111 | raise Exception(f"{filename} not found in Blynk.NCP {tag}") 112 | 113 | def fetch_ncp(filename, release = None): 114 | ncp_path = f".pio/BlynkNCP/{release}/" 115 | ncp_full = ncp_path + filename 116 | if os.path.exists(ncp_full): 117 | return ncp_full 118 | 119 | try: 120 | release_info = get_release_info(release) 121 | except: 122 | raise Exception(f"Cannot get {release} release info") 123 | 124 | tag = release_info["tag_name"] 125 | ncp_path = f".pio/BlynkNCP/{tag}/" 126 | ncp_full = ncp_path + filename 127 | if os.path.exists(ncp_full): 128 | return ncp_full 129 | 130 | (fn, url) = get_download_url(filename, release_info) 131 | ncp_full = ncp_path + fn 132 | if not os.path.exists(ncp_full): 133 | print(f"Downloading {fn} ...") 134 | os.makedirs(ncp_path, exist_ok=True) 135 | download_file(url, ncp_full) 136 | return ncp_full 137 | 138 | def upload_ncp(*args, **kwargs): 139 | 140 | flashers = custom_ncp.flasher.split(",") 141 | flashers = list(filter(None, flashers)) # remove empty 142 | flashers = list(map(str.strip, flashers)) # strip all items 143 | 144 | if not len(flashers): 145 | print(hint_no_flasher) 146 | sys.exit(1) 147 | 148 | if custom_ncp.firmware is None: 149 | print("custom_ncp.firmware not specified") 150 | sys.exit(1) 151 | 152 | firmware = fetch_ncp(f"BlynkNCP_{custom_ncp.firmware}", custom_ncp.firmware_ver) 153 | 154 | for flasher in flashers: 155 | if flasher == "BlynkNcpFlasher": 156 | # Build and upload the flasher utility 157 | check_exec(f"pio run -d tools/BlynkNcpFlasher -e {pioenv} --target upload") 158 | elif flasher == "esptool": 159 | time.sleep(3) 160 | if custom_ncp.pre_upload_message: 161 | input(custom_ncp.pre_upload_message + press_enter_msg) 162 | 163 | check_exec(' '.join(["pio", "pkg", "exec", 164 | "-p", "tool-esptoolpy", "--", "esptool.py", 165 | "" if custom_ncp.use_stub else "--no-stub", 166 | "--baud", custom_ncp.upload_speed, 167 | "--before", custom_ncp.before_upload, 168 | "--after", custom_ncp.after_upload, 169 | "write_flash", 170 | #"--flash_mode", "dio", TODO: flash_mode 171 | #"--flash_freq", "40m", TODO: f_flash 172 | "--flash_size", "detect", 173 | "--erase-all" if custom_ncp.erase_all else "", 174 | "0x0", firmware 175 | ])) 176 | 177 | if custom_ncp.post_upload_message: 178 | input(custom_ncp.post_upload_message + press_enter_msg) 179 | elif flasher == "flash_wio_terminal": 180 | time.sleep(3) 181 | if custom_ncp.pre_upload_message: 182 | input(custom_ncp.pre_upload_message + press_enter_msg) 183 | 184 | check_exec(' '.join(["python3", 185 | "tools/flash_wio_terminal.py", 186 | "--erase-all" if custom_ncp.erase_all else "", 187 | firmware 188 | ])) 189 | 190 | if custom_ncp.post_upload_message: 191 | input(custom_ncp.post_upload_message + press_enter_msg) 192 | else: 193 | raise Exception(f"Flasher {flasher} is invalid") 194 | 195 | env.AddCustomTarget( 196 | name="upload_ncp", 197 | dependencies=None, 198 | actions=upload_ncp, 199 | title="Upload Blynk.NCP firmware" 200 | ) 201 | -------------------------------------------------------------------------------- /tools/flash_wio_terminal.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import requests 4 | import contextlib 5 | import platform 6 | import struct 7 | from pathlib import Path 8 | from zipfile import ZipFile, ZipInfo 9 | 10 | _local_path = os.path.realpath(os.path.dirname(__file__)) 11 | _ambd_flash_tool = Path(_local_path, "ambd_flash_tool") 12 | 13 | class ZipFileWithPermissions(ZipFile): 14 | """ Custom ZipFile class handling file permissions. """ 15 | def _extract_member(self, member, targetpath, pwd): 16 | if not isinstance(member, ZipInfo): 17 | member = self.getinfo(member) 18 | 19 | targetpath = super()._extract_member(member, targetpath, pwd) 20 | 21 | attr = member.external_attr >> 16 22 | if attr != 0: 23 | os.chmod(targetpath, attr) 24 | return targetpath 25 | 26 | 27 | @contextlib.contextmanager 28 | def pushd(new_dir): 29 | previous_dir = os.getcwd() 30 | os.chdir(new_dir) 31 | try: 32 | yield 33 | finally: 34 | os.chdir(previous_dir) 35 | 36 | try: 37 | import serial 38 | except ImportError: 39 | print("Installing pyserial module") 40 | res = os.system("pip3 install pyserial") 41 | if res != 0: 42 | print("pyserial module installation failed") 43 | sys.exit(1) 44 | import serial 45 | 46 | if os.name == 'nt': # sys.platform == 'win32': 47 | from serial.tools.list_ports_windows import comports 48 | elif os.name == 'posix': 49 | from serial.tools.list_ports_posix import comports 50 | else: 51 | raise ImportError("Sorry: no implementation for your platform ('{}') available".format(os.name)) 52 | 53 | # List of supported board USB IDs. Each board is a tuple of unique USB vendor 54 | # ID, USB product ID. 55 | BOARD_IDS = \ 56 | [{ 57 | "name": "wio terminal", 58 | "info": ("2886", "802D"), 59 | "isbootloader": False 60 | }, 61 | { 62 | "name": "wio terminal", 63 | "info": ("2886", "002D"), 64 | "isbootloader": True 65 | }] 66 | 67 | def getAllPortInfo(): 68 | return comports(include_links=False) 69 | 70 | def getAvailableBoard(): 71 | for info in getAllPortInfo(): 72 | port, desc, hwid = info 73 | ii = hwid.find("VID:PID") 74 | #hwid: USB VID:PID=2886:002D SER=4D68990C5337433838202020FF123244 LOCATION=7-3.1.3:1. 75 | if ii != -1: 76 | for b in BOARD_IDS: 77 | (vid, pid) = b["info"] 78 | if vid == hwid[ii + 8: ii + 8 + 4] and pid == hwid[ii + 8 + 5 :ii + 8 + 5 + 4 ]: 79 | if b["isbootloader"] == True : 80 | return port, True 81 | else: 82 | return port, False 83 | return None, False 84 | 85 | def stty(port, baud): 86 | if os.name == "posix": 87 | if platform.uname().system == "Darwin": 88 | return os.system(f"stty -f {port} {baud}") 89 | else: 90 | return os.system(f"stty -F {port} {baud}") 91 | elif os.name == "nt": 92 | return os.system(f"MODE {port}:BAUD={baud} PARITY=N DATA=8") 93 | 94 | raise Exception("stty not supported") 95 | 96 | def downloadFile(url, filename): 97 | with requests.get(url, stream=True) as r: 98 | r.raise_for_status() 99 | with open(filename, 'wb') as f: 100 | for chunk in r.iter_content(chunk_size=8192): 101 | f.write(chunk) 102 | 103 | def getFlashTool(): 104 | if not _ambd_flash_tool.exists(): 105 | zipfn = str(_ambd_flash_tool) + ".zip" 106 | downloadFile("https://github.com/Seeed-Studio/ambd_flash_tool/archive/refs/heads/master.zip", zipfn) 107 | with ZipFileWithPermissions(zipfn) as zf: 108 | zf.extractall(_local_path) 109 | Path(_local_path, "ambd_flash_tool-master").rename(_ambd_flash_tool) 110 | Path(zipfn).unlink() 111 | 112 | tool = Path(_ambd_flash_tool, 'tool') 113 | _platform = platform.platform() 114 | if 'Windows' in _platform: 115 | tool = str(Path(tool, 'windows', "amebad_image_tool.exe")) 116 | elif 'Linux' in _platform: 117 | tool = str(Path(tool, 'linux', 'amebad_image_tool')) 118 | elif _platform.find('Darwin') >= 0 or _platform.find('macOS') >= 0: 119 | tool = str(Path(tool, 'macos', 'amebad_image_tool')) 120 | else: 121 | raise Exception("Platform not supported") 122 | return tool 123 | 124 | def makeEmptyImage(length): 125 | empty = struct.pack('B', 0xFF) * 1024 126 | with open(Path(_ambd_flash_tool, "km0_boot_all.bin"), "wb") as f: 127 | for i in range(8): 128 | f.write(empty) 129 | 130 | with open(Path(_ambd_flash_tool, "km4_boot_all.bin"), "wb") as f: 131 | for i in range(4): 132 | f.write(empty) 133 | 134 | with open(Path(_ambd_flash_tool, "km0_km4_image2.bin"), "wb") as f: 135 | for i in range(length - 12): 136 | f.write(empty) 137 | 138 | def extractFirmware(filename): 139 | with ZipFile(filename) as zf: 140 | zf.extractall(_ambd_flash_tool) 141 | 142 | if __name__ == '__main__': 143 | import argparse 144 | parser = argparse.ArgumentParser(description='WIO Terminal flasher utility') 145 | parser.add_argument('--erase-all', action="store_true", help='Erase all flash') 146 | parser.add_argument('firmware', metavar='ZIP_FILE', help='firmware zip file') 147 | args = parser.parse_args() 148 | 149 | firmware = os.path.realpath(args.firmware) 150 | 151 | tool = getFlashTool() 152 | port, isbootloader = getAvailableBoard() 153 | if port == None: 154 | print("The device is not plugged in") 155 | sys.exit(1) 156 | 157 | with pushd(_ambd_flash_tool): 158 | if args.erase_all: 159 | print("Erasing, please wait...") 160 | makeEmptyImage(2048) 161 | os.system(f"{tool} {port}") 162 | print("Flashing, please wait...") 163 | extractFirmware(firmware) 164 | os.system(f"{tool} {port}") 165 | 166 | print("Done. Rebooting NCP") 167 | stty(port, 2400) 168 | 169 | --------------------------------------------------------------------------------