From 990f2482bb7ee2afb3f76581e23159b5fb0e8f2e Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 3 Feb 2024 10:46:26 +0700 Subject: [PATCH] Complete rewrite of the library with modular structure. --- AirGradient.cpp | 1008 ----- AirGradient.h | 341 -- LICENSE.md | 22 +- README.md | 41 +- examples/BASIC_v4/BASIC_v4.ino | 460 +++ examples/C02_CALIBRATION/C02_CALIBRATION.ino | 127 - examples/C02_SIMPLE/C02_SIMPLE.ino | 39 - .../CO2_TRAFFIC_LIGHT_SIMPLE.ino | 132 - examples/DIY_BASIC/DIY_BASIC.ino | 243 -- examples/DIY_OUTDOOR/DIY_OUTDOOR.ino | 212 - .../DIY_OUTDOOR_C3_1PP/DIY_OUTDOOR_C3_1PP.ino | 277 -- .../DIY_OUTDOOR_C3_1PST.ino | 338 -- examples/DIY_PRO/DIY_PRO.ino | 220 -- examples/DIY_PRO_V3_7/DIY_PRO_V3_7.ino | 424 -- examples/DIY_PRO_V4_2/DIY_PRO_V4_2.ino | 433 -- examples/MINI_DISPLAY/MINI_DISPLAY.ino | 380 -- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 1212 ++++++ examples/ONE_V9/ONE_V9.ino | 752 ---- examples/Open_Air_O-1PST/Open_Air_O-1PST.ino | 687 ++++ examples/PM2_SIMPLE/PM2_SIMPLE.ino | 54 - examples/SHT_SIMPLE/SHT_SIMPLE.ino | 45 - examples/TestCO2/TestCO2.ino | 43 + examples/TestESP32/TestESP32.ino | 369 ++ examples/TestESP8266/TestESP8266.ino | 164 + examples/TestPM/TestPM.ino | 69 + library.properties | 8 +- readme.txt | 47 +- src/AirGradient.cpp | 38 + src/AirGradient.h | 76 + src/bsp/BoardDef.cpp | 501 +++ src/bsp/BoardDef.h | 81 + src/bsp/HardwareWatchdog.cpp | 74 + src/bsp/HardwareWatchdog.h | 33 + src/bsp/LedBar.cpp | 126 + src/bsp/LedBar.h | 38 + src/bsp/PushButton.cpp | 73 + src/bsp/PushButton.h | 43 + src/bsp/StatusLed.cpp | 98 + src/bsp/StatusLed.h | 40 + src/co2/mb_crc.cpp | 73 + src/co2/mb_crc.h | 8 + src/co2/s8.cpp | 796 ++++ src/co2/s8.h | 129 + src/display/oled.cpp | 178 + src/display/oled.h | 52 + .../.github/ISSUE_TEMPLATE.md | 46 + .../.github/PULL_REQUEST_TEMPLATE.md | 26 + .../.github/workflows/githubci.yml | 36 + src/library/Adafruit-GFX-Library/.gitignore | 6 + .../Adafruit-GFX-Library/Adafruit_GFX.cpp | 2669 +++++++++++++ .../Adafruit-GFX-Library/Adafruit_GFX.h | 392 ++ .../Adafruit_GrayOLED.cpp | 421 ++ .../Adafruit-GFX-Library/Adafruit_GrayOLED.h | 100 + .../Adafruit-GFX-Library/Adafruit_SPITFT.cpp | 2561 ++++++++++++ .../Adafruit-GFX-Library/Adafruit_SPITFT.h | 530 +++ .../Adafruit_SPITFT_Macros.h | 6 + .../Adafruit-GFX-Library/CMakeLists.txt | 11 + .../Fonts/FreeMono12pt7b.h | 229 ++ .../Fonts/FreeMono18pt7b.h | 365 ++ .../Fonts/FreeMono24pt7b.h | 579 +++ .../Fonts/FreeMono9pt7b.h | 178 + .../Fonts/FreeMonoBold12pt7b.h | 252 ++ .../Fonts/FreeMonoBold18pt7b.h | 425 ++ .../Fonts/FreeMonoBold24pt7b.h | 674 ++++ .../Fonts/FreeMonoBold9pt7b.h | 191 + .../Fonts/FreeMonoBoldOblique12pt7b.h | 271 ++ .../Fonts/FreeMonoBoldOblique18pt7b.h | 462 +++ .../Fonts/FreeMonoBoldOblique24pt7b.h | 744 ++++ .../Fonts/FreeMonoBoldOblique9pt7b.h | 205 + .../Fonts/FreeMonoOblique12pt7b.h | 250 ++ .../Fonts/FreeMonoOblique18pt7b.h | 400 ++ .../Fonts/FreeMonoOblique24pt7b.h | 645 +++ .../Fonts/FreeMonoOblique9pt7b.h | 189 + .../Fonts/FreeSans12pt7b.h | 272 ++ .../Fonts/FreeSans18pt7b.h | 454 +++ .../Fonts/FreeSans24pt7b.h | 729 ++++ .../Fonts/FreeSans9pt7b.h | 203 + .../Fonts/FreeSansBold12pt7b.h | 290 ++ .../Fonts/FreeSansBold18pt7b.h | 483 +++ .../Fonts/FreeSansBold24pt7b.h | 786 ++++ .../Fonts/FreeSansBold9pt7b.h | 210 + .../Fonts/FreeSansBoldOblique12pt7b.h | 319 ++ .../Fonts/FreeSansBoldOblique18pt7b.h | 547 +++ .../Fonts/FreeSansBoldOblique24pt7b.h | 895 +++++ .../Fonts/FreeSansBoldOblique9pt7b.h | 229 ++ .../Fonts/FreeSansOblique12pt7b.h | 304 ++ .../Fonts/FreeSansOblique18pt7b.h | 520 +++ .../Fonts/FreeSansOblique24pt7b.h | 842 ++++ .../Fonts/FreeSansOblique9pt7b.h | 222 ++ .../Fonts/FreeSerif12pt7b.h | 261 ++ .../Fonts/FreeSerif18pt7b.h | 431 ++ .../Fonts/FreeSerif24pt7b.h | 692 ++++ .../Fonts/FreeSerif9pt7b.h | 197 + .../Fonts/FreeSerifBold12pt7b.h | 273 ++ .../Fonts/FreeSerifBold18pt7b.h | 464 +++ .../Fonts/FreeSerifBold24pt7b.h | 761 ++++ .../Fonts/FreeSerifBold9pt7b.h | 204 + .../Fonts/FreeSerifBoldItalic12pt7b.h | 294 ++ .../Fonts/FreeSerifBoldItalic18pt7b.h | 502 +++ .../Fonts/FreeSerifBoldItalic24pt7b.h | 795 ++++ .../Fonts/FreeSerifBoldItalic9pt7b.h | 217 + .../Fonts/FreeSerifItalic12pt7b.h | 273 ++ .../Fonts/FreeSerifItalic18pt7b.h | 452 +++ .../Fonts/FreeSerifItalic24pt7b.h | 739 ++++ .../Fonts/FreeSerifItalic9pt7b.h | 204 + .../Adafruit-GFX-Library/Fonts/Org_01.h | 131 + .../Adafruit-GFX-Library/Fonts/Picopixel.h | 123 + .../Fonts/Tiny3x3a2pt7b.h | 133 + .../Adafruit-GFX-Library/Fonts/TomThumb.h | 477 +++ src/library/Adafruit-GFX-Library/README.md | 47 + src/library/Adafruit-GFX-Library/component.mk | 1 + .../examples/GFXcanvas/GFXcanvas.ino | 113 + .../GFXcanvas/GFXcanvasSerialDemo.cpp | 92 + .../examples/GFXcanvas/GFXcanvasSerialDemo.h | 65 + .../examples/mock_ili9341/mock_ili9341.ino | 365 ++ .../Adafruit-GFX-Library/fontconvert/Makefile | 12 + .../fontconvert/bdf2adafruit.py | 135 + .../fontconvert/fontconvert.c | 291 ++ .../fontconvert/fontconvert_win.md | 88 + .../fontconvert/makefonts.sh | 38 + src/library/Adafruit-GFX-Library/gfxfont.h | 29 + src/library/Adafruit-GFX-Library/glcdfont.c | 143 + .../Adafruit-GFX-Library/library.properties | 10 + src/library/Adafruit-GFX-Library/license.txt | 24 + .../Adafruit_BusIO/.github/ISSUE_TEMPLATE.md | 46 + .../.github/PULL_REQUEST_TEMPLATE.md | 26 + .../.github/workflows/githubci.yml | 33 + .../Adafruit_BusIO_Register.cpp | 365 ++ .../Adafruit_BusIO/Adafruit_BusIO_Register.h | 105 + .../Adafruit_BusIO/Adafruit_I2CDevice.cpp | 317 ++ .../Adafruit_BusIO/Adafruit_I2CDevice.h | 36 + .../Adafruit_BusIO/Adafruit_I2CRegister.h | 10 + .../Adafruit_BusIO/Adafruit_SPIDevice.cpp | 508 +++ .../Adafruit_BusIO/Adafruit_SPIDevice.h | 142 + src/library/Adafruit_BusIO/CMakeLists.txt | 11 + src/library/Adafruit_BusIO/LICENSE | 21 + src/library/Adafruit_BusIO/README.md | 8 + src/library/Adafruit_BusIO/component.mk | 1 + .../i2c_address_detect/i2c_address_detect.ino | 21 + .../examples/i2c_readwrite/i2c_readwrite.ino | 41 + .../examples/i2c_registers/i2c_registers.ino | 38 + .../i2corspi_register/i2corspi_register.ino | 38 + .../examples/spi_modetest/spi_modetest.ino | 29 + .../examples/spi_readwrite/spi_readwrite.ino | 39 + .../spi_register_bits/spi_register_bits.ino | 192 + .../examples/spi_registers/spi_registers.ino | 34 + src/library/Adafruit_BusIO/library.properties | 9 + .../.github/ISSUE_TEMPLATE.md | 46 + .../.github/PULL_REQUEST_TEMPLATE.md | 26 + .../.github/workflows/githubci.yml | 29 + src/library/Adafruit_NeoPixel/.gitignore | 4 + .../Adafruit_NeoPixel/Adafruit_NeoPixel.cpp | 3474 +++++++++++++++++ .../Adafruit_NeoPixel/Adafruit_NeoPixel.h | 412 ++ src/library/Adafruit_NeoPixel/CONTRIBUTING.md | 13 + src/library/Adafruit_NeoPixel/COPYING | 165 + src/library/Adafruit_NeoPixel/README.md | 158 + src/library/Adafruit_NeoPixel/esp.c | 224 ++ src/library/Adafruit_NeoPixel/esp8266.c | 86 + src/library/Adafruit_NeoPixel/kendyte_k210.c | 74 + src/library/Adafruit_NeoPixel/keywords.txt | 72 + .../Adafruit_NeoPixel/library.properties | 10 + src/library/Adafruit_NeoPixel/rp2040_pio.h | 63 + .../Adafruit_SH110x/.github/ISSUE_TEMPLATE.md | 46 + .../.github/PULL_REQUEST_TEMPLATE.md | 26 + .../.github/workflows/githubci.yml | 32 + src/library/Adafruit_SH110x/.gitignore | 4 + .../Adafruit_SH110x/Adafruit_SH1106G.cpp | 177 + .../Adafruit_SH110x/Adafruit_SH1107.cpp | 195 + .../Adafruit_SH110x/Adafruit_SH110X.cpp | 250 ++ src/library/Adafruit_SH110x/Adafruit_SH110X.h | 133 + src/library/Adafruit_SH110x/README.md | 19 + .../SH1106_128x64_SPi_QTPY.ino | 357 ++ .../SH1106_128x64_i2c_QTPY.ino | 356 ++ .../OLED_featherwing/OLED_featherwing.ino | 79 + .../SH1107_128x128/SH1107_128x128.ino | 374 ++ .../Adafruit_SH110x/library.properties | 10 + src/library/Adafruit_SH110x/license.txt | 26 + src/library/Adafruit_SH110x/splash.h | 210 + .../.github/ISSUE_TEMPLATE.md | 46 + .../.github/PULL_REQUEST_TEMPLATE.md | 26 + .../Adafruit_SSD1306.cpp | 776 ++++ .../Adafruit_SSD1306.h | 189 + .../Adafruit_SSD1306_Wemos_OLED/README.md | 32 + .../Adafruit_SSD1306_Wemos_OLED/README.txt | 24 + .../ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino | 375 ++ .../ssd1306_128x32_spi/ssd1306_128x32_spi.ino | 368 ++ .../ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino | 375 ++ .../ssd1306_128x64_spi/ssd1306_128x64_spi.ino | 368 ++ .../ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino | 377 ++ .../library.properties | 9 + .../Adafruit_SSD1306_Wemos_OLED/license.txt | 26 + src/library/SensirionCore/.clang-format | 14 + src/library/SensirionCore/.editorconfig | 11 + src/library/SensirionCore/.gitignore | 3 + src/library/SensirionCore/.gitlab-ci.yml | 39 + src/library/SensirionCore/CHANGELOG.rst | 161 + src/library/SensirionCore/LICENSE | 29 + src/library/SensirionCore/README.md | 137 + .../AllCommandsI2c/AllCommandsI2c.ino | 62 + .../AllCommandsShdlc/AllCommandsShdlc.ino | 73 + src/library/SensirionCore/keywords.txt | 56 + src/library/SensirionCore/library.properties | 9 + src/library/SensirionCore/src/SensirionCore.h | 46 + .../src/SensirionCoreArduinoLibrary.h | 51 + .../SensirionCore/src/SensirionCrc.cpp | 64 + src/library/SensirionCore/src/SensirionCrc.h | 59 + .../SensirionCore/src/SensirionErrors.cpp | 148 + .../SensirionCore/src/SensirionErrors.h | 87 + .../src/SensirionI2CCommunication.cpp | 119 + .../src/SensirionI2CCommunication.h | 83 + .../SensirionCore/src/SensirionI2CRxFrame.h | 64 + .../SensirionCore/src/SensirionI2CTxFrame.cpp | 144 + .../SensirionCore/src/SensirionI2CTxFrame.h | 197 + .../SensirionCore/src/SensirionRxFrame.cpp | 129 + .../SensirionCore/src/SensirionRxFrame.h | 147 + .../src/SensirionShdlcCommunication.cpp | 184 + .../src/SensirionShdlcCommunication.h | 95 + .../SensirionCore/src/SensirionShdlcRxFrame.h | 86 + .../src/SensirionShdlcTxFrame.cpp | 130 + .../SensirionCore/src/SensirionShdlcTxFrame.h | 184 + .../SensirionCore/tests/compile_test.py | 45 + .../SensirionCore/tests/run_cppcheck.sh | 3 + .../SensirionCore/tests/syntax_check.sh | 5 + src/library/SensirionSGP41/.clang-format | 14 + src/library/SensirionSGP41/.gitlab-ci.yml | 44 + src/library/SensirionSGP41/CHANGELOG.md | 23 + src/library/SensirionSGP41/LICENSE | 29 + src/library/SensirionSGP41/README.md | 78 + .../examples/exampleUsage/exampleUsage.ino | 124 + src/library/SensirionSGP41/images/SGP41.png | Bin 0 -> 424504 bytes src/library/SensirionSGP41/keywords.txt | 27 + src/library/SensirionSGP41/library.properties | 10 + .../SensirionSGP41/src/SensirionI2CSgp41.cpp | 182 + .../SensirionSGP41/src/SensirionI2CSgp41.h | 140 + src/library/SensirionSHT4x/.clang-format | 14 + src/library/SensirionSHT4x/.gitignore | 70 + src/library/SensirionSHT4x/.gitlab-ci.yml | 103 + src/library/SensirionSHT4x/CHANGELOG.md | 19 + src/library/SensirionSHT4x/LICENSE | 29 + src/library/SensirionSHT4x/README.md | 206 + .../examples/exampleUsage/exampleUsage.ino | 89 + ...Arduino-Mega-2560-Rev3-i2c-pinout-3.3V.png | Bin 0 -> 415104 bytes .../images/Arduino-Micro-i2c-pinout-3.3V.png | Bin 0 -> 329645 bytes .../images/Arduino-Nano-i2c-pinout-3.3V.png | Bin 0 -> 303452 bytes .../Arduino-Uno-Rev3-i2c-pinout-3.3V.png | Bin 0 -> 322617 bytes .../SensirionSHT4x/images/SHT40_pinout.png | Bin 0 -> 130868 bytes .../images/esp32-devkitc-i2c-pinout-3.3V.png | Bin 0 -> 537095 bytes src/library/SensirionSHT4x/images/sht4x.png | Bin 0 -> 244244 bytes src/library/SensirionSHT4x/keywords.txt | 46 + src/library/SensirionSHT4x/library.properties | 11 + src/library/SensirionSHT4x/metadata.yml | 7 + .../SensirionSHT4x/src/SensirionI2CSht4x.cpp | 436 +++ .../SensirionSHT4x/src/SensirionI2CSht4x.h | 424 ++ .../CHANGELOG.md | 28 + .../Sensirion_Gas_Index_Algorithm/LICENSE | 29 + .../Sensirion_Gas_Index_Algorithm/README.md | 106 + .../exampleLowPowerUsage.ino | 160 + .../examples/exampleUsage/exampleUsage.ino | 174 + .../keywords.txt | 36 + .../library.json | 35 + .../library.properties | 10 + .../src/NOxGasIndexAlgorithm.h | 42 + .../src/SensirionGasIndexAlgorithm.cpp | 84 + .../src/SensirionGasIndexAlgorithm.h | 123 + .../src/VOCGasIndexAlgorithm.cpp | 47 + .../src/VOCGasIndexAlgorithm.h | 66 + .../algorithm/sensirion_gas_index_algorithm.c | 582 +++ .../algorithm/sensirion_gas_index_algorithm.h | 290 ++ src/pm/PMS.cpp | 166 + src/pm/PMS.h | 70 + src/pm/pms5003.cpp | 177 + src/pm/pms5003.h | 42 + src/pm/pms5003t.cpp | 223 ++ src/pm/pms5003t.h | 48 + src/sgp/sgp41.cpp | 240 ++ src/sgp/sgp41.h | 54 + src/sht/sht4x.cpp | 210 + src/sht/sht4x.h | 49 + 278 files changed, 54881 insertions(+), 5058 deletions(-) delete mode 100644 AirGradient.cpp delete mode 100644 AirGradient.h create mode 100644 examples/BASIC_v4/BASIC_v4.ino delete mode 100644 examples/C02_CALIBRATION/C02_CALIBRATION.ino delete mode 100644 examples/C02_SIMPLE/C02_SIMPLE.ino delete mode 100644 examples/CO2_TRAFFIC_LIGHT/CO2_TRAFFIC_LIGHT_SIMPLE.ino delete mode 100644 examples/DIY_BASIC/DIY_BASIC.ino delete mode 100644 examples/DIY_OUTDOOR/DIY_OUTDOOR.ino delete mode 100644 examples/DIY_OUTDOOR_C3_1PP/DIY_OUTDOOR_C3_1PP.ino delete mode 100644 examples/DIY_OUTDOOR_C3_1PST/DIY_OUTDOOR_C3_1PST.ino delete mode 100644 examples/DIY_PRO/DIY_PRO.ino delete mode 100644 examples/DIY_PRO_V3_7/DIY_PRO_V3_7.ino delete mode 100644 examples/DIY_PRO_V4_2/DIY_PRO_V4_2.ino delete mode 100644 examples/MINI_DISPLAY/MINI_DISPLAY.ino create mode 100644 examples/ONE_I-9PSL/ONE_I-9PSL.ino delete mode 100644 examples/ONE_V9/ONE_V9.ino create mode 100644 examples/Open_Air_O-1PST/Open_Air_O-1PST.ino delete mode 100644 examples/PM2_SIMPLE/PM2_SIMPLE.ino delete mode 100644 examples/SHT_SIMPLE/SHT_SIMPLE.ino create mode 100644 examples/TestCO2/TestCO2.ino create mode 100644 examples/TestESP32/TestESP32.ino create mode 100644 examples/TestESP8266/TestESP8266.ino create mode 100644 examples/TestPM/TestPM.ino create mode 100644 src/AirGradient.cpp create mode 100644 src/AirGradient.h create mode 100644 src/bsp/BoardDef.cpp create mode 100644 src/bsp/BoardDef.h create mode 100644 src/bsp/HardwareWatchdog.cpp create mode 100644 src/bsp/HardwareWatchdog.h create mode 100644 src/bsp/LedBar.cpp create mode 100644 src/bsp/LedBar.h create mode 100644 src/bsp/PushButton.cpp create mode 100644 src/bsp/PushButton.h create mode 100644 src/bsp/StatusLed.cpp create mode 100644 src/bsp/StatusLed.h create mode 100644 src/co2/mb_crc.cpp create mode 100644 src/co2/mb_crc.h create mode 100644 src/co2/s8.cpp create mode 100644 src/co2/s8.h create mode 100644 src/display/oled.cpp create mode 100644 src/display/oled.h create mode 100644 src/library/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md create mode 100644 src/library/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 src/library/Adafruit-GFX-Library/.github/workflows/githubci.yml create mode 100644 src/library/Adafruit-GFX-Library/.gitignore create mode 100644 src/library/Adafruit-GFX-Library/Adafruit_GFX.cpp create mode 100644 src/library/Adafruit-GFX-Library/Adafruit_GFX.h create mode 100644 src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp create mode 100644 src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.h create mode 100644 src/library/Adafruit-GFX-Library/Adafruit_SPITFT.cpp create mode 100644 src/library/Adafruit-GFX-Library/Adafruit_SPITFT.h create mode 100644 src/library/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h create mode 100644 src/library/Adafruit-GFX-Library/CMakeLists.txt create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/Org_01.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/Picopixel.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h create mode 100644 src/library/Adafruit-GFX-Library/Fonts/TomThumb.h create mode 100644 src/library/Adafruit-GFX-Library/README.md create mode 100644 src/library/Adafruit-GFX-Library/component.mk create mode 100644 src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino create mode 100644 src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp create mode 100644 src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h create mode 100644 src/library/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino create mode 100644 src/library/Adafruit-GFX-Library/fontconvert/Makefile create mode 100644 src/library/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py create mode 100644 src/library/Adafruit-GFX-Library/fontconvert/fontconvert.c create mode 100644 src/library/Adafruit-GFX-Library/fontconvert/fontconvert_win.md create mode 100644 src/library/Adafruit-GFX-Library/fontconvert/makefonts.sh create mode 100644 src/library/Adafruit-GFX-Library/gfxfont.h create mode 100644 src/library/Adafruit-GFX-Library/glcdfont.c create mode 100644 src/library/Adafruit-GFX-Library/library.properties create mode 100644 src/library/Adafruit-GFX-Library/license.txt create mode 100644 src/library/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md create mode 100644 src/library/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 src/library/Adafruit_BusIO/.github/workflows/githubci.yml create mode 100644 src/library/Adafruit_BusIO/Adafruit_BusIO_Register.cpp create mode 100644 src/library/Adafruit_BusIO/Adafruit_BusIO_Register.h create mode 100644 src/library/Adafruit_BusIO/Adafruit_I2CDevice.cpp create mode 100644 src/library/Adafruit_BusIO/Adafruit_I2CDevice.h create mode 100644 src/library/Adafruit_BusIO/Adafruit_I2CRegister.h create mode 100644 src/library/Adafruit_BusIO/Adafruit_SPIDevice.cpp create mode 100644 src/library/Adafruit_BusIO/Adafruit_SPIDevice.h create mode 100644 src/library/Adafruit_BusIO/CMakeLists.txt create mode 100644 src/library/Adafruit_BusIO/LICENSE create mode 100644 src/library/Adafruit_BusIO/README.md create mode 100644 src/library/Adafruit_BusIO/component.mk create mode 100644 src/library/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino create mode 100644 src/library/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino create mode 100644 src/library/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino create mode 100644 src/library/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino create mode 100644 src/library/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino create mode 100644 src/library/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino create mode 100644 src/library/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino create mode 100644 src/library/Adafruit_BusIO/examples/spi_registers/spi_registers.ino create mode 100644 src/library/Adafruit_BusIO/library.properties create mode 100644 src/library/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md create mode 100644 src/library/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 src/library/Adafruit_NeoPixel/.github/workflows/githubci.yml create mode 100644 src/library/Adafruit_NeoPixel/.gitignore create mode 100644 src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp create mode 100644 src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.h create mode 100644 src/library/Adafruit_NeoPixel/CONTRIBUTING.md create mode 100644 src/library/Adafruit_NeoPixel/COPYING create mode 100644 src/library/Adafruit_NeoPixel/README.md create mode 100644 src/library/Adafruit_NeoPixel/esp.c create mode 100644 src/library/Adafruit_NeoPixel/esp8266.c create mode 100644 src/library/Adafruit_NeoPixel/kendyte_k210.c create mode 100644 src/library/Adafruit_NeoPixel/keywords.txt create mode 100644 src/library/Adafruit_NeoPixel/library.properties create mode 100644 src/library/Adafruit_NeoPixel/rp2040_pio.h create mode 100644 src/library/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md create mode 100644 src/library/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 src/library/Adafruit_SH110x/.github/workflows/githubci.yml create mode 100644 src/library/Adafruit_SH110x/.gitignore create mode 100644 src/library/Adafruit_SH110x/Adafruit_SH1106G.cpp create mode 100644 src/library/Adafruit_SH110x/Adafruit_SH1107.cpp create mode 100644 src/library/Adafruit_SH110x/Adafruit_SH110X.cpp create mode 100644 src/library/Adafruit_SH110x/Adafruit_SH110X.h create mode 100644 src/library/Adafruit_SH110x/README.md create mode 100644 src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino create mode 100644 src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino create mode 100644 src/library/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino create mode 100644 src/library/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino create mode 100644 src/library/Adafruit_SH110x/library.properties create mode 100644 src/library/Adafruit_SH110x/license.txt create mode 100644 src/library/Adafruit_SH110x/splash.h create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/README.md create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/README.txt create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_spi/ssd1306_128x32_spi.ino create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_spi/ssd1306_128x64_spi.ino create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/library.properties create mode 100644 src/library/Adafruit_SSD1306_Wemos_OLED/license.txt create mode 100644 src/library/SensirionCore/.clang-format create mode 100644 src/library/SensirionCore/.editorconfig create mode 100644 src/library/SensirionCore/.gitignore create mode 100644 src/library/SensirionCore/.gitlab-ci.yml create mode 100644 src/library/SensirionCore/CHANGELOG.rst create mode 100644 src/library/SensirionCore/LICENSE create mode 100644 src/library/SensirionCore/README.md create mode 100644 src/library/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino create mode 100644 src/library/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino create mode 100644 src/library/SensirionCore/keywords.txt create mode 100644 src/library/SensirionCore/library.properties create mode 100644 src/library/SensirionCore/src/SensirionCore.h create mode 100644 src/library/SensirionCore/src/SensirionCoreArduinoLibrary.h create mode 100644 src/library/SensirionCore/src/SensirionCrc.cpp create mode 100644 src/library/SensirionCore/src/SensirionCrc.h create mode 100644 src/library/SensirionCore/src/SensirionErrors.cpp create mode 100644 src/library/SensirionCore/src/SensirionErrors.h create mode 100644 src/library/SensirionCore/src/SensirionI2CCommunication.cpp create mode 100644 src/library/SensirionCore/src/SensirionI2CCommunication.h create mode 100644 src/library/SensirionCore/src/SensirionI2CRxFrame.h create mode 100644 src/library/SensirionCore/src/SensirionI2CTxFrame.cpp create mode 100644 src/library/SensirionCore/src/SensirionI2CTxFrame.h create mode 100644 src/library/SensirionCore/src/SensirionRxFrame.cpp create mode 100644 src/library/SensirionCore/src/SensirionRxFrame.h create mode 100644 src/library/SensirionCore/src/SensirionShdlcCommunication.cpp create mode 100644 src/library/SensirionCore/src/SensirionShdlcCommunication.h create mode 100644 src/library/SensirionCore/src/SensirionShdlcRxFrame.h create mode 100644 src/library/SensirionCore/src/SensirionShdlcTxFrame.cpp create mode 100644 src/library/SensirionCore/src/SensirionShdlcTxFrame.h create mode 100644 src/library/SensirionCore/tests/compile_test.py create mode 100644 src/library/SensirionCore/tests/run_cppcheck.sh create mode 100644 src/library/SensirionCore/tests/syntax_check.sh create mode 100644 src/library/SensirionSGP41/.clang-format create mode 100644 src/library/SensirionSGP41/.gitlab-ci.yml create mode 100644 src/library/SensirionSGP41/CHANGELOG.md create mode 100644 src/library/SensirionSGP41/LICENSE create mode 100644 src/library/SensirionSGP41/README.md create mode 100644 src/library/SensirionSGP41/examples/exampleUsage/exampleUsage.ino create mode 100644 src/library/SensirionSGP41/images/SGP41.png create mode 100644 src/library/SensirionSGP41/keywords.txt create mode 100644 src/library/SensirionSGP41/library.properties create mode 100644 src/library/SensirionSGP41/src/SensirionI2CSgp41.cpp create mode 100644 src/library/SensirionSGP41/src/SensirionI2CSgp41.h create mode 100644 src/library/SensirionSHT4x/.clang-format create mode 100644 src/library/SensirionSHT4x/.gitignore create mode 100644 src/library/SensirionSHT4x/.gitlab-ci.yml create mode 100644 src/library/SensirionSHT4x/CHANGELOG.md create mode 100644 src/library/SensirionSHT4x/LICENSE create mode 100644 src/library/SensirionSHT4x/README.md create mode 100644 src/library/SensirionSHT4x/examples/exampleUsage/exampleUsage.ino create mode 100644 src/library/SensirionSHT4x/images/Arduino-Mega-2560-Rev3-i2c-pinout-3.3V.png create mode 100644 src/library/SensirionSHT4x/images/Arduino-Micro-i2c-pinout-3.3V.png create mode 100644 src/library/SensirionSHT4x/images/Arduino-Nano-i2c-pinout-3.3V.png create mode 100644 src/library/SensirionSHT4x/images/Arduino-Uno-Rev3-i2c-pinout-3.3V.png create mode 100644 src/library/SensirionSHT4x/images/SHT40_pinout.png create mode 100644 src/library/SensirionSHT4x/images/esp32-devkitc-i2c-pinout-3.3V.png create mode 100644 src/library/SensirionSHT4x/images/sht4x.png create mode 100644 src/library/SensirionSHT4x/keywords.txt create mode 100644 src/library/SensirionSHT4x/library.properties create mode 100644 src/library/SensirionSHT4x/metadata.yml create mode 100644 src/library/SensirionSHT4x/src/SensirionI2CSht4x.cpp create mode 100644 src/library/SensirionSHT4x/src/SensirionI2CSht4x.h create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/CHANGELOG.md create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/LICENSE create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/README.md create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/examples/exampleLowPowerUsage/exampleLowPowerUsage.ino create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/examples/exampleUsage/exampleUsage.ino create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/keywords.txt create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/library.json create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/library.properties create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.cpp create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.h create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.cpp create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.c create mode 100644 src/library/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.h create mode 100644 src/pm/PMS.cpp create mode 100644 src/pm/PMS.h create mode 100644 src/pm/pms5003.cpp create mode 100644 src/pm/pms5003.h create mode 100644 src/pm/pms5003t.cpp create mode 100644 src/pm/pms5003t.h create mode 100644 src/sgp/sgp41.cpp create mode 100644 src/sgp/sgp41.h create mode 100644 src/sht/sht4x.cpp create mode 100644 src/sht/sht4x.h diff --git a/AirGradient.cpp b/AirGradient.cpp deleted file mode 100644 index ccf2037..0000000 --- a/AirGradient.cpp +++ /dev/null @@ -1,1008 +0,0 @@ -/* - Test.h - Test library for Wiring - implementation - Copyright (c) 2006 John Doe. All right reserved. -*/ - - -// include this library's description file -#include "AirGradient.h" - -// include description files for other libraries used (if any) -#include -#include "Arduino.h" -#include -#include - - -// Constructor ///////////////////////////////////////////////////////////////// -// Function that handles the creation and setup of instances - -const int MHZ14A = 14; -const int MHZ19B = 19; // this one we use for AQI whatever - -const int MHZ14A_PREHEATING_TIME = 3 * 60 * 1000; -const int MHZ19B_PREHEATING_TIME = 3 * 60 * 1000; - -const int MHZ14A_RESPONSE_TIME = 60 * 1000; -const int MHZ19B_RESPONSE_TIME = 120 * 1000; - -const int STATUS_NO_RESPONSE = -2; -const int STATUS_CHECKSUM_MISMATCH = -3; -const int STATUS_INCOMPLETE = -4; -const int STATUS_NOT_READY = -5; -const int STATUS_PWM_NOT_CONFIGURED = -6; -const int STATUS_serial_MHZ19_NOT_CONFIGURED = -7; - -unsigned long lastRequest = 0; - -bool SerialConfigured = true; -bool PwmConfigured = true; - - -AirGradient::AirGradient(bool displayMsg,int baudRate) -{ - _debugMsg = displayMsg; - Wire.begin(); - Serial.begin(baudRate); - if (_debugMsg) { - Serial.println("AirGradiant Library instantiated successfully."); - } -} - -// Public Methods ////////////////////////////////////////////////////////////// -// Functions available in Wiring sketches, this library, and other libraries - - -void AirGradient::PMS_Init(){ - if (_debugMsg) { - Serial.println("Initializing PMS..."); - } - PMS_Init(D5,D6); -} -void AirGradient::PMS_Init(int rx_pin,int tx_pin){ - PMS_Init(rx_pin,tx_pin,9600); -} -void AirGradient::PMS_Init(int rx_pin,int tx_pin,int baudRate){ - _SoftSerial_PMS = new SoftwareSerial(rx_pin,tx_pin); - PMS(*_SoftSerial_PMS); - _SoftSerial_PMS->begin(baudRate); - - if(getPM2() <= 0){ - - if (_debugMsg) { - Serial.println("PMS Sensor Failed to Initialize "); - } - else{ - Serial.println("PMS Successfully Initialized. Heating up for 10s"); - delay(10000); - } - } - -} - - - -const char* AirGradient::getPM2(){ - if (getPM2_Raw()) { - int result_raw = getPM2_Raw(); - sprintf(Char_PM2,"%d", result_raw); - return Char_PM2; - } else { - //Serial.println("no PMS data"); - Char_PM2[0] = 'N'; - Char_PM2[1] = 'U'; - Char_PM2[2] = 'L'; - Char_PM2[3] = 'L'; - return Char_PM2; - } -} - -int AirGradient::getPM2_Raw(){ - int pm02; - DATA data; - requestRead(); - if (readUntil(data)) { - pm02 = data.PM_AE_UG_2_5; - return pm02; - } else { - return -1; - } -} - -int AirGradient::getPM1_Raw(){ - int pm02; - DATA data; - requestRead(); - if (readUntil(data)) { - pm02 = data.PM_AE_UG_1_0; - return pm02; - } else { - return -1; - } -} - -int AirGradient::getPM10_Raw(){ - int pm02; - DATA data; - requestRead(); - if (readUntil(data)) { - pm02 = data.PM_AE_UG_10_0; - return pm02; - } else { - return -1; - } -} - -int AirGradient::getPM0_3Count(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_RAW_0_3; - return count; - } else { - return -1; - } -} - -int AirGradient::getPM10_0Count(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_RAW_10_0; - return count; - } else { - return -1; - } -} - -int AirGradient::getPM5_0Count(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_RAW_5_0; - return count; - } else { - return -1; - } -} - -int AirGradient::getPM2_5Count(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_RAW_2_5; - return count; - } else { - return -1; - } -} - -int AirGradient::getPM1_0Count(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_RAW_1_0; - return count; - } else { - return -1; - } -} - -int AirGradient::getPM0_5Count(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_RAW_0_5; - return count; - } else { - return -1; - } -} - - -int AirGradient::getAMB_TMP(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_TMP; - return count; - } else { - return -1; - } -} - -int AirGradient::getAMB_HUM(){ - int count; - DATA data; - requestRead(); - if (readUntil(data)) { - count = data.PM_HUM; - return count; - } else { - return -1; - } -} - - -// Private Methods ///////////////////////////////////////////////////////////// -// Functions only available to other functions in this library - -//START PMS FUNCTIONS // - -void AirGradient::PMS(Stream& stream) -{ - this->_stream = &stream; -} - -// Standby mode. For low power consumption and prolong the life of the sensor. -void AirGradient::sleep() -{ - uint8_t command[] = { 0x42, 0x4D, 0xE4, 0x00, 0x00, 0x01, 0x73 }; - _stream->write(command, sizeof(command)); -} - -// Operating mode. Stable data should be got at least 30 seconds after the sensor wakeup from the sleep mode because of the fan's performance. -void AirGradient::wakeUp() -{ - uint8_t command[] = { 0x42, 0x4D, 0xE4, 0x00, 0x01, 0x01, 0x74 }; - _stream->write(command, sizeof(command)); -} - -// Active mode. Default mode after power up. In this mode sensor would send serial data to the host automatically. -void AirGradient::activeMode() -{ - - uint8_t command[] = { 0x42, 0x4D, 0xE1, 0x00, 0x01, 0x01, 0x71 }; - _stream->write(command, sizeof(command)); - _mode = MODE_ACTIVE; -} - -// Passive mode. In this mode sensor would send serial data to the host only for request. -void AirGradient::passiveMode() -{ - uint8_t command[] = { 0x42, 0x4D, 0xE1, 0x00, 0x00, 0x01, 0x70 }; - _stream->write(command, sizeof(command)); - _mode = MODE_PASSIVE; -} - -// Request read in Passive Mode. -void AirGradient::requestRead() -{ - if (_mode == MODE_PASSIVE) - { - uint8_t command[] = { 0x42, 0x4D, 0xE2, 0x00, 0x00, 0x01, 0x71 }; - _stream->write(command, sizeof(command)); - } -} - -// Non-blocking function for parse response. -bool AirGradient::read_PMS(DATA& data) -{ - _data = &data; - loop(); - - return _PMSstatus == STATUS_OK; -} - -// Blocking function for parse response. Default timeout is 1s. -bool AirGradient::readUntil(DATA& data, uint16_t timeout) -{ - _data = &data; - uint32_t start = millis(); - do - { - loop(); - if (_PMSstatus == STATUS_OK) break; - } while (millis() - start < timeout); - - return _PMSstatus == STATUS_OK; -} - -void AirGradient::loop() -{ - _PMSstatus = STATUS_WAITING; - if (_stream->available()) - { - uint8_t ch = _stream->read(); - - switch (_index) - { - case 0: - if (ch != 0x42) - { - return; - } - _calculatedChecksum = ch; - break; - - case 1: - if (ch != 0x4D) - { - _index = 0; - return; - } - _calculatedChecksum += ch; - break; - - case 2: - _calculatedChecksum += ch; - _frameLen = ch << 8; - break; - - case 3: - _frameLen |= ch; - // Unsupported sensor, different frame length, transmission error e.t.c. - if (_frameLen != 2 * 9 + 2 && _frameLen != 2 * 13 + 2) - { - _index = 0; - return; - } - _calculatedChecksum += ch; - break; - - default: - if (_index == _frameLen + 2) - { - _checksum = ch << 8; - } - else if (_index == _frameLen + 2 + 1) - { - _checksum |= ch; - - if (_calculatedChecksum == _checksum) - { - _PMSstatus = STATUS_OK; - - // Standard Particles, CF=1. - _data->PM_SP_UG_1_0 = makeWord(_payload[0], _payload[1]); - _data->PM_SP_UG_2_5 = makeWord(_payload[2], _payload[3]); - _data->PM_SP_UG_10_0 = makeWord(_payload[4], _payload[5]); - - // Atmospheric Environment. - _data->PM_AE_UG_1_0 = makeWord(_payload[6], _payload[7]); - _data->PM_AE_UG_2_5 = makeWord(_payload[8], _payload[9]); - _data->PM_AE_UG_10_0 = makeWord(_payload[10], _payload[11]); - - // Total particles count per 100ml air - _data->PM_RAW_0_3 = makeWord(_payload[12], _payload[13]); - _data->PM_RAW_0_5 = makeWord(_payload[14], _payload[15]); - _data->PM_RAW_1_0 = makeWord(_payload[16], _payload[17]); - _data->PM_RAW_2_5 = makeWord(_payload[18], _payload[19]); - _data->PM_RAW_5_0 = makeWord(_payload[20], _payload[21]); - _data->PM_RAW_10_0 = makeWord(_payload[22], _payload[23]); - - // Formaldehyde concentration (PMSxxxxST units only) - _data->AMB_HCHO = makeWord(_payload[24], _payload[25]) / 1000; - - // Temperature & humidity (PMSxxxxST units only) - _data->PM_TMP = makeWord(_payload[20], _payload[21]) / 10; - _data->PM_HUM = makeWord(_payload[22], _payload[23]) / 10; - } - - _index = 0; - return; - } - else - { - _calculatedChecksum += ch; - uint8_t payloadIndex = _index - 4; - - // Payload is common to all sensors (first 2x6 bytes). - if (payloadIndex < sizeof(_payload)) - { - _payload[payloadIndex] = ch; - } - } - - break; - } - - _index++; - } -} - -//END PMS FUNCTIONS // - -//START TMP_RH FUNCTIONS// - -TMP_RH_ErrorCode AirGradient::TMP_RH_Init(uint8_t address) { - if (_debugMsg) { - Serial.println("Initializing TMP_RH..."); - } - TMP_RH_ErrorCode error = SHT3XD_NO_ERROR; - _address = address; - periodicStart(SHT3XD_REPEATABILITY_HIGH, SHT3XD_FREQUENCY_10HZ); - return error; -} - -TMP_RH_ErrorCode AirGradient::reset() -{ - return softReset(); -} - -TMP_RH AirGradient::periodicFetchData() // -{ - TMP_RH result; - TMP_RH_ErrorCode error = writeCommand(SHT3XD_CMD_FETCH_DATA); - if (error == SHT3XD_NO_ERROR){ - result = readTemperatureAndHumidity(); - sprintf(result.t_char,"%d", result.t); - sprintf(result.rh_char,"%f", result.rh); - - return result; - } - else - return returnError(error); -} - -TMP_RH_ErrorCode AirGradient::periodicStop() { - return writeCommand(SHT3XD_CMD_STOP_PERIODIC); -} - -TMP_RH_ErrorCode AirGradient::periodicStart(TMP_RH_Repeatability repeatability, TMP_RH_Frequency frequency) // -{ - TMP_RH_ErrorCode error; - - switch (repeatability) - { - case SHT3XD_REPEATABILITY_LOW: - switch (frequency) - { - case SHT3XD_FREQUENCY_HZ5: - error = writeCommand(SHT3XD_CMD_PERIODIC_HALF_L); - break; - case SHT3XD_FREQUENCY_1HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_1_L); - break; - case SHT3XD_FREQUENCY_2HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_2_L); - break; - case SHT3XD_FREQUENCY_4HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_4_L); - break; - case SHT3XD_FREQUENCY_10HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_10_L); - break; - default: - error = SHT3XD_PARAM_WRONG_FREQUENCY; - break; - } - break; - case SHT3XD_REPEATABILITY_MEDIUM: - switch (frequency) - { - case SHT3XD_FREQUENCY_HZ5: - error = writeCommand(SHT3XD_CMD_PERIODIC_HALF_M); - break; - case SHT3XD_FREQUENCY_1HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_1_M); - break; - case SHT3XD_FREQUENCY_2HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_2_M); - break; - case SHT3XD_FREQUENCY_4HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_4_M); - break; - case SHT3XD_FREQUENCY_10HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_10_M); - break; - default: - error = SHT3XD_PARAM_WRONG_FREQUENCY; - break; - } - break; - - case SHT3XD_REPEATABILITY_HIGH: - switch (frequency) - { - case SHT3XD_FREQUENCY_HZ5: - error = writeCommand(SHT3XD_CMD_PERIODIC_HALF_H); - break; - case SHT3XD_FREQUENCY_1HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_1_H); - break; - case SHT3XD_FREQUENCY_2HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_2_H); - break; - case SHT3XD_FREQUENCY_4HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_4_H); - break; - case SHT3XD_FREQUENCY_10HZ: - error = writeCommand(SHT3XD_CMD_PERIODIC_10_H); - break; - default: - error = SHT3XD_PARAM_WRONG_FREQUENCY; - break; - } - break; - default: - error = SHT3XD_PARAM_WRONG_REPEATABILITY; - break; - } - - delay(100); - - return error; -} - - -TMP_RH_ErrorCode AirGradient::writeCommand(TMP_RH_Commands command) -{ - Wire.beginTransmission(_address); - Wire.write(command >> 8); - Wire.write(command & 0xFF); - return (TMP_RH_ErrorCode)(-10 * Wire.endTransmission()); -} - -TMP_RH_ErrorCode AirGradient::softReset() { - return writeCommand(SHT3XD_CMD_SOFT_RESET); -} - - -uint32_t AirGradient::readSerialNumber() -{ - uint32_t result = SHT3XD_NO_ERROR; - uint16_t buf[2]; - - if (writeCommand(SHT3XD_CMD_READ_SERIAL_NUMBER) == SHT3XD_NO_ERROR) { - if (read_TMP_RH(buf, 2) == SHT3XD_NO_ERROR) { - result = (buf[0] << 16) | buf[1]; - } - } - else if(writeCommand(SHT3XD_CMD_READ_SERIAL_NUMBER) != SHT3XD_NO_ERROR){ - if (_debugMsg) { - Serial.println("TMP_RH Failed to Initialize."); - } - - } - - return result; -} -uint32_t AirGradient::testTMP_RH() -{ - uint32_t result = SHT3XD_NO_ERROR; - uint16_t buf[2]; - - if (writeCommand(SHT3XD_CMD_READ_SERIAL_NUMBER) == SHT3XD_NO_ERROR) { - if (read_TMP_RH(buf, 2) == SHT3XD_NO_ERROR) { - result = (buf[0] << 16) | buf[1]; - } - if (_debugMsg) { - Serial.print("TMP_RH successfully initialized with serial number: "); - Serial.println(result); - } - - } - else if(writeCommand(SHT3XD_CMD_READ_SERIAL_NUMBER) != SHT3XD_NO_ERROR){ - if (_debugMsg) { - Serial.println("TMP_RH Failed to Initialize."); - } - - } - - return result; -} - -TMP_RH_ErrorCode AirGradient::clearAll() { - return writeCommand(SHT3XD_CMD_CLEAR_STATUS); -} - - -TMP_RH AirGradient::readTemperatureAndHumidity()// -{ - TMP_RH result; - - result.t = 0; - result.rh = 0; - - TMP_RH_ErrorCode error; - uint16_t buf[2]; - - if (error == SHT3XD_NO_ERROR) - error = read_TMP_RH(buf, 2); - - if (error == SHT3XD_NO_ERROR) { - result.t = calculateTemperature(buf[0]); - result.rh = calculateHumidity(buf[1]); - } - result.error = error; - - return result; -} - -TMP_RH_ErrorCode AirGradient::read_TMP_RH(uint16_t* data, uint8_t numOfPair)// -{ - uint8_t buf[2]; - uint8_t checksum; - - const uint8_t numOfBytes = numOfPair * 3; - Wire.requestFrom(_address, numOfBytes); - - int counter = 0; - - for (counter = 0; counter < numOfPair; counter++) { - Wire.readBytes(buf, (uint8_t)2); - checksum = Wire.read(); - - if (checkCrc(buf, checksum) != 0) - return SHT3XD_CRC_ERROR; - - data[counter] = (buf[0] << 8) | buf[1]; - } - - return SHT3XD_NO_ERROR; -} - - -uint8_t AirGradient::checkCrc(uint8_t data[], uint8_t checksum)// -{ - return calculateCrc(data) != checksum; -} - -float AirGradient::calculateTemperature(uint16_t rawValue)// -{ - float value = 175.0f * (float)rawValue / 65535.0f - 45.0f; - return round(value*10)/10; -} - - -float AirGradient::calculateHumidity(uint16_t rawValue)// -{ - return 100.0f * rawValue / 65535.0f; -} - -uint8_t AirGradient::calculateCrc(uint8_t data[]) -{ - uint8_t bit; - uint8_t crc = 0xFF; - uint8_t dataCounter = 0; - - for (; dataCounter < 2; dataCounter++) - { - crc ^= (data[dataCounter]); - for (bit = 8; bit > 0; --bit) - { - if (crc & 0x80) - crc = (crc << 1) ^ 0x131; - else - crc = (crc << 1); - } - } - - return crc; -} - -TMP_RH AirGradient::returnError(TMP_RH_ErrorCode error) { - TMP_RH result; - result.t = NULL; - result.rh = NULL; - - result.t_char[0] = 'N'; - result.t_char[1] = 'U'; - result.t_char[2] = 'L'; - result.t_char[3] = 'L'; - - result.rh_char[0] = 'N'; - result.rh_char[1] = 'U'; - result.rh_char[2] = 'L'; - result.rh_char[3] = 'L'; - - result.error = error; - return result; -} - -//END TMP_RH FUNCTIONS // - -//START CO2 FUNCTIONS // -void AirGradient::CO2_Init(){ - CO2_Init(D4,D3); -} -void AirGradient::CO2_Init(int rx_pin,int tx_pin){ - CO2_Init(rx_pin,tx_pin,9600); - -} -void AirGradient::CO2_Init(int rx_pin,int tx_pin,int baudRate){ - if (_debugMsg) { - Serial.println("Initializing CO2..."); - } - _SoftSerial_CO2 = new SoftwareSerial(rx_pin,tx_pin); - _SoftSerial_CO2->begin(baudRate); - - if(getCO2_Raw() == -1){ - if (_debugMsg) { - Serial.println("CO2 Sensor Failed to Initialize "); - } - } - else{ - Serial.println("CO2 Successfully Initialized. Heating up for 10s"); - delay(10000); - } -} - -int AirGradient::getCO2(int numberOfSamplesToTake) { - int successfulSamplesCounter = 0; - int co2AsPpmSum = 0; - for (int sample = 0; sample < numberOfSamplesToTake; sample++) { - int co2AsPpm = getCO2_Raw(); - if (co2AsPpm > 300 && co2AsPpm < 10000) { - Serial.println("CO2 read success " + String(co2AsPpm)); - successfulSamplesCounter++; - co2AsPpmSum += co2AsPpm; - } else { - Serial.println("CO2 read failed with " + String(co2AsPpm)); - } - - // without delay we get a few 10ms spacing, add some more - delay(250); - } - - if (successfulSamplesCounter <= 0) { - // total failure - return -5; - } - Serial.println("# of CO2 reads that worked: " + String(successfulSamplesCounter)); - Serial.println("CO2 reads sum " + String(co2AsPpmSum)); - return co2AsPpmSum / successfulSamplesCounter; -} - -// <<>> -int AirGradient::getCO2_Raw() { - - while(_SoftSerial_CO2->available()) // flush whatever we might have - _SoftSerial_CO2->read(); - - const byte CO2Command[] = {0XFE, 0X04, 0X00, 0X03, 0X00, 0X01, 0XD5, 0XC5}; - byte CO2Response[] = {0,0,0,0,0,0,0}; - int datapos = -1; - - const int commandSize = 8; - const int responseSize = 7; - - int numberOfBytesWritten = _SoftSerial_CO2->write(CO2Command, commandSize); - - if (numberOfBytesWritten != commandSize) { - // failed to write request - return -2; - } - - // attempt to read response - int timeoutCounter = 0; - while (_SoftSerial_CO2->available() < responseSize) { - timeoutCounter++; - if (timeoutCounter > 10) { - // timeout when reading response - return -3; - } - delay(50); - } - - // we have 7 bytes ready to be read - for (int i=0; i < responseSize; i++) { - CO2Response[i] = _SoftSerial_CO2->read(); - if ((CO2Response[i] == 0xFE) && (datapos == -1)){ - datapos = i; - } - Serial.print (CO2Response[i],HEX); - Serial.print (":"); - } - return CO2Response[datapos + 3]*256 + CO2Response[datapos + 4]; -} - -//END CO2 FUNCTIONS // - -//START MHZ19 FUNCTIONS // -void AirGradient::MHZ19_Init(uint8_t type) { - MHZ19_Init(9,10,type); -} -void AirGradient::MHZ19_Init(int rx_pin,int tx_pin, uint8_t type) { - MHZ19_Init(rx_pin,tx_pin,9600,type); -} -void AirGradient::MHZ19_Init(int rx_pin,int tx_pin, int baudRate, uint8_t type) { - if (_debugMsg) { - Serial.println("Initializing MHZ19..."); - } - _SoftSerial_MHZ19 = new SoftwareSerial(rx_pin,tx_pin); - _SoftSerial_MHZ19->begin(baudRate); - - if(readMHZ19() == -1){ - if (_debugMsg) { - Serial.println("MHZ19 Sensor Failed to Initialize "); - } - } - else{ - Serial.println("MHZ19 Successfully Initialized. Heating up for 10s"); - delay(10000); - } - - _type_MHZ19 = type; - - PwmConfigured = false; -} - -/** - * Enables or disables the debug mode (more logging). - */ -void AirGradient::setDebug_MHZ19(bool enable) { - debug_MHZ19 = enable; - if (debug_MHZ19) { - Serial.println(F("MHZ: debug mode ENABLED")); - } else { - Serial.println(F("MHZ: debug mode DISABLED")); - } -} - -bool AirGradient::isPreHeating_MHZ19() { - if (_type_MHZ19 == MHZ14A) { - return millis() < (MHZ14A_PREHEATING_TIME); - } else if (_type_MHZ19 == MHZ19B) { - return millis() < (MHZ19B_PREHEATING_TIME); - } else { - Serial.println(F("MHZ::isPreheating_MHZ19() => UNKNOWN SENSOR")); - return false; - }// -} - -bool AirGradient::isReady_MHZ19() { - if (isPreHeating_MHZ19()) return false; - if (_type_MHZ19 == MHZ14A) - return lastRequest < millis() - MHZ14A_RESPONSE_TIME; - else if (_type_MHZ19 == MHZ19B) - return lastRequest < millis() - MHZ19B_RESPONSE_TIME; - else { - Serial.print(F("MHZ::isReady_MHZ19() => UNKNOWN SENSOR \"")); - Serial.print(_type_MHZ19); - Serial.println(F("\"")); - return true; - } -} - - -int AirGradient::readMHZ19() { - - int firstRead = readInternal_MHZ19(); - int secondRead = readInternal_MHZ19(); - - if (abs(secondRead - firstRead) > 50) { - // we arrive here sometimes when the CO2 sensor is not connected - // could possibly also be fixed with a pull-up resistor on Rx but if we forget this then ... - Serial.println("MHZ::read() inconsistent values"); - return -1; - } - - Serial.println("MHZ::read(1) " + String(firstRead)); - Serial.println("MHZ::read(2) " + String(secondRead)); - - // TODO: return average? - return secondRead; -} - -int AirGradient::readInternal_MHZ19() { - if (!SerialConfigured) { - if (debug_MHZ19) Serial.println(F("-- serial is not configured")); - return STATUS_serial_MHZ19_NOT_CONFIGURED; - } - // if (!isReady_MHZ19()) return STATUS_NOT_READY; - if (debug_MHZ19) Serial.println(F("-- read CO2 uart ---")); - byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; - unsigned char response[9]; // for answer - - if (debug_MHZ19) Serial.print(F(" >> Sending CO2 request")); - _SoftSerial_MHZ19->write(cmd, 9); // request PPM CO2 - lastRequest = millis(); - - // clear the buffer - memset(response, 0, 9); - - int waited = 0; - while (_SoftSerial_MHZ19->available() == 0) { - if (debug_MHZ19) Serial.print("."); - delay(100); // wait a short moment to avoid false reading - if (waited++ > 10) { - if (debug_MHZ19) Serial.println(F("No response after 10 seconds")); - _SoftSerial_MHZ19->flush(); - return STATUS_NO_RESPONSE; - } - } - if (debug_MHZ19) Serial.println(); - - // The serial stream can get out of sync. The response starts with 0xff, try - // to resync. - // TODO: I think this might be wrong any only happens during initialization? - boolean skip = false; - while (_SoftSerial_MHZ19->available() > 0 && (unsigned char)_SoftSerial_MHZ19->peek() != 0xFF) { - if (!skip) { - Serial.print(F("MHZ: - skipping unexpected readings:")); - skip = true; - } - Serial.print(" "); - Serial.print(_SoftSerial_MHZ19->peek(), HEX); - _SoftSerial_MHZ19->read(); - } - if (skip) Serial.println(); - - if (_SoftSerial_MHZ19->available() > 0) { - int count = _SoftSerial_MHZ19->readBytes(response, 9); - if (count < 9) { - _SoftSerial_MHZ19->flush(); - return STATUS_INCOMPLETE; - } - } else { - _SoftSerial_MHZ19->flush(); - return STATUS_INCOMPLETE; - } - - if (debug_MHZ19) { - // print out the response in hexa - Serial.print(F(" << ")); - for (int i = 0; i < 9; i++) { - Serial.print(response[i], HEX); - Serial.print(F(" ")); - } - Serial.println(F("")); - } - - // checksum - byte check = getCheckSum_MHZ19(response); - if (response[8] != check) { - Serial.println(F("MHZ: Checksum not OK!")); - Serial.print(F("MHZ: Received: ")); - Serial.println(response[8], HEX); - Serial.print(F("MHZ: Should be: ")); - Serial.println(check, HEX); - temperature_MHZ19 = STATUS_CHECKSUM_MISMATCH; - _SoftSerial_MHZ19->flush(); - return STATUS_CHECKSUM_MISMATCH; - } - - int ppm_uart = 256 * (unsigned int)response[2] + (unsigned int)response[3]; - - temperature_MHZ19 = response[4] - 44; // - 40; - - byte status = response[5]; - if (debug_MHZ19) { - Serial.print(F(" # PPM UART: ")); - Serial.println(ppm_uart); - Serial.print(F(" # temperature_MHZ19? ")); - Serial.println(temperature_MHZ19); - } - - // Is always 0 for version 14a and 19b - // Version 19a?: status != 0x40 - if (debug_MHZ19 && status != 0) { - Serial.print(F(" ! Status maybe not OK ! ")); - Serial.println(status, HEX); - } else if (debug_MHZ19) { - Serial.print(F(" Status OK: ")); - Serial.println(status, HEX); - } - - _SoftSerial_MHZ19->flush(); - return ppm_uart; -} - - - -uint8_t AirGradient::getCheckSum_MHZ19(unsigned char* packet) { - if (!SerialConfigured) { - if (debug_MHZ19) Serial.println(F("-- serial is not configured")); - return STATUS_serial_MHZ19_NOT_CONFIGURED; - } - if (debug_MHZ19) Serial.println(F(" getCheckSum_MHZ19()")); - byte i; - unsigned char checksum = 0; - for (i = 1; i < 8; i++) { - checksum += packet[i]; - } - checksum = 0xff - checksum; - checksum += 1; - return checksum; -} - -//END MHZ19 FUNCTIONS // diff --git a/AirGradient.h b/AirGradient.h deleted file mode 100644 index 5ec8944..0000000 --- a/AirGradient.h +++ /dev/null @@ -1,341 +0,0 @@ -/* - Test.h - Test library for Wiring - description - Copyright (c) 2006 John Doe. All right reserved. -*/ - -// ensure this library description is only included once -#ifndef AirGradient_h -#define AirGradient_h - -#include -#include -#include "Stream.h" -//MHZ19 CONSTANTS START -// types of sensors. -extern const int MHZ14A; -extern const int MHZ19B; - -// status codes -extern const int STATUS_NO_RESPONSE; -extern const int STATUS_CHECKSUM_MISMATCH; -extern const int STATUS_INCOMPLETE; -extern const int STATUS_NOT_READY; -//MHZ19 CONSTANTS END - -//ENUMS AND STRUCT FOR TMP_RH START -typedef enum { - SHT3XD_CMD_READ_SERIAL_NUMBER = 0x3780, - - SHT3XD_CMD_READ_STATUS = 0xF32D, - SHT3XD_CMD_CLEAR_STATUS = 0x3041, - - SHT3XD_CMD_HEATER_ENABLE = 0x306D, - SHT3XD_CMD_HEATER_DISABLE = 0x3066, - - SHT3XD_CMD_SOFT_RESET = 0x30A2, - - SHT3XD_CMD_CLOCK_STRETCH_H = 0x2C06, - SHT3XD_CMD_CLOCK_STRETCH_M = 0x2C0D, - SHT3XD_CMD_CLOCK_STRETCH_L = 0x2C10, - - SHT3XD_CMD_POLLING_H = 0x2400, - SHT3XD_CMD_POLLING_M = 0x240B, - SHT3XD_CMD_POLLING_L = 0x2416, - - SHT3XD_CMD_ART = 0x2B32, - - SHT3XD_CMD_PERIODIC_HALF_H = 0x2032, - SHT3XD_CMD_PERIODIC_HALF_M = 0x2024, - SHT3XD_CMD_PERIODIC_HALF_L = 0x202F, - SHT3XD_CMD_PERIODIC_1_H = 0x2130, - SHT3XD_CMD_PERIODIC_1_M = 0x2126, - SHT3XD_CMD_PERIODIC_1_L = 0x212D, - SHT3XD_CMD_PERIODIC_2_H = 0x2236, - SHT3XD_CMD_PERIODIC_2_M = 0x2220, - SHT3XD_CMD_PERIODIC_2_L = 0x222B, - SHT3XD_CMD_PERIODIC_4_H = 0x2334, - SHT3XD_CMD_PERIODIC_4_M = 0x2322, - SHT3XD_CMD_PERIODIC_4_L = 0x2329, - SHT3XD_CMD_PERIODIC_10_H = 0x2737, - SHT3XD_CMD_PERIODIC_10_M = 0x2721, - SHT3XD_CMD_PERIODIC_10_L = 0x272A, - - SHT3XD_CMD_FETCH_DATA = 0xE000, - SHT3XD_CMD_STOP_PERIODIC = 0x3093, - - SHT3XD_CMD_READ_ALR_LIMIT_LS = 0xE102, - SHT3XD_CMD_READ_ALR_LIMIT_LC = 0xE109, - SHT3XD_CMD_READ_ALR_LIMIT_HS = 0xE11F, - SHT3XD_CMD_READ_ALR_LIMIT_HC = 0xE114, - - SHT3XD_CMD_WRITE_ALR_LIMIT_HS = 0x611D, - SHT3XD_CMD_WRITE_ALR_LIMIT_HC = 0x6116, - SHT3XD_CMD_WRITE_ALR_LIMIT_LC = 0x610B, - SHT3XD_CMD_WRITE_ALR_LIMIT_LS = 0x6100, - - SHT3XD_CMD_NO_SLEEP = 0x303E, - } TMP_RH_Commands; - - - typedef enum { - SHT3XD_REPEATABILITY_HIGH, - SHT3XD_REPEATABILITY_MEDIUM, - SHT3XD_REPEATABILITY_LOW, - } TMP_RH_Repeatability; - - typedef enum { - SHT3XD_MODE_CLOCK_STRETCH, - SHT3XD_MODE_POLLING, - } TMP_RH_Mode; - - typedef enum { - SHT3XD_FREQUENCY_HZ5, - SHT3XD_FREQUENCY_1HZ, - SHT3XD_FREQUENCY_2HZ, - SHT3XD_FREQUENCY_4HZ, - SHT3XD_FREQUENCY_10HZ - } TMP_RH_Frequency; - - typedef enum { - SHT3XD_NO_ERROR = 0, - - SHT3XD_CRC_ERROR = -101, - SHT3XD_TIMEOUT_ERROR = -102, - - SHT3XD_PARAM_WRONG_MODE = -501, - SHT3XD_PARAM_WRONG_REPEATABILITY = -502, - SHT3XD_PARAM_WRONG_FREQUENCY = -503, - SHT3XD_PARAM_WRONG_ALERT = -504, - - // Wire I2C translated error codes - SHT3XD_WIRE_I2C_DATA_TOO_LOG = -10, - SHT3XD_WIRE_I2C_RECEIVED_NACK_ON_ADDRESS = -20, - SHT3XD_WIRE_I2C_RECEIVED_NACK_ON_DATA = -30, - SHT3XD_WIRE_I2C_UNKNOW_ERROR = -40 - } TMP_RH_ErrorCode; - - typedef union { - uint16_t rawData; - struct { - uint8_t WriteDataChecksumStatus : 1; - uint8_t CommandStatus : 1; - uint8_t Reserved0 : 2; - uint8_t SystemResetDetected : 1; - uint8_t Reserved1 : 5; - uint8_t T_TrackingAlert : 1; - uint8_t RH_TrackingAlert : 1; - uint8_t Reserved2 : 1; - uint8_t HeaterStatus : 1; - uint8_t Reserved3 : 1; - uint8_t AlertPending : 1; - }; - } TMP_RH_RegisterStatus; - - struct TMP_RH { - float t; - int rh; - char t_char[10]; - char rh_char[10]; - TMP_RH_ErrorCode error; - }; - struct TMP_RH_Char { - TMP_RH_ErrorCode error; - }; -// ENUMS AND STRUCTS FOR TMP_RH END - -//ENUMS STRUCTS FOR CO2 START - struct CO2_READ_RESULT { - int co2 = -1; - bool success = false; -}; -//ENUMS STRUCTS FOR CO2 END - -// library interface description -class AirGradient -{ - // user-accessible "public" interface - public: - AirGradient(bool displayMsg=false,int baudRate=9600); - //void begin(int baudRate=9600); - - static void setOutput(Print& debugOut, bool verbose = true); - - void beginCO2(void); - void beginCO2(int,int); - void PMS_Init(void); - void PMS_Init(int,int); - void PMS_Init(int,int,int); - - bool _debugMsg; - - - //PMS VARIABLES PUBLIC_START - static const uint16_t SINGLE_RESPONSE_TIME = 1000; - static const uint16_t TOTAL_RESPONSE_TIME = 1000 * 10; - static const uint16_t STEADY_RESPONSE_TIME = 1000 * 30; - - static const uint16_t BAUD_RATE = 9600; - - struct DATA { - // Standard Particles, CF=1 - uint16_t PM_SP_UG_1_0; - uint16_t PM_SP_UG_2_5; - uint16_t PM_SP_UG_10_0; - - // Atmospheric environment - uint16_t PM_AE_UG_1_0; - uint16_t PM_AE_UG_2_5; - uint16_t PM_AE_UG_10_0; - - // Raw particles count (number of particles in 0.1l of air - uint16_t PM_RAW_0_3; - uint16_t PM_RAW_0_5; - uint16_t PM_RAW_1_0; - uint16_t PM_RAW_2_5; - uint16_t PM_RAW_5_0; - uint16_t PM_RAW_10_0; - - // Formaldehyde (HCHO) concentration in mg/m^3 - PMSxxxxST units only - uint16_t AMB_HCHO; - - // Temperature & humidity - PMSxxxxST units only - int16_t PM_TMP; - uint16_t PM_HUM; - }; - - void PMS(Stream&); - void sleep(); - void wakeUp(); - void activeMode(); - void passiveMode(); - - void requestRead(); - bool read_PMS(DATA& data); - bool readUntil(DATA& data, uint16_t timeout = SINGLE_RESPONSE_TIME); - - - const char* getPM2(); - int getPM2_Raw(); - int getPM1_Raw(); - int getPM10_Raw(); - - int getPM0_3Count(); - int getPM0_5Count(); - int getPM1_0Count(); - int getPM2_5Count(); - int getPM5_0Count(); - int getPM10_0Count(); - - int getAMB_TMP(); - int getAMB_HUM(); - - //PMS VARIABLES PUBLIC_END - - //TMP_RH VARIABLES PUBLIC START - void ClosedCube_TMP_RH(); - TMP_RH_ErrorCode TMP_RH_Init(uint8_t address); - TMP_RH_ErrorCode clearAll(); - - TMP_RH_ErrorCode softReset(); - TMP_RH_ErrorCode reset(); // same as softReset - - uint32_t readSerialNumber(); - uint32_t testTMP_RH(); - - TMP_RH_ErrorCode periodicStart(TMP_RH_Repeatability repeatability, TMP_RH_Frequency frequency); - TMP_RH periodicFetchData(); - TMP_RH_ErrorCode periodicStop(); - - //TMP_RH VARIABLES PUBLIC END - - //CO2 VARIABLES PUBLIC START - void CO2_Init(); - void CO2_Init(int,int); - void CO2_Init(int,int,int); - int getCO2(int numberOfSamplesToTake = 5); - int getCO2_Raw(); - SoftwareSerial *_SoftSerial_CO2; - - //CO2 VARIABLES PUBLIC END - - //MHZ19 VARIABLES PUBLIC START - void MHZ19_Init(uint8_t); - void MHZ19_Init(int,int,uint8_t); - void MHZ19_Init(int,int,int,uint8_t); - void setDebug_MHZ19(bool enable); - bool isPreHeating_MHZ19(); - bool isReady_MHZ19(); - - int readMHZ19(); - - //MHZ19 VARIABLES PUBLIC END - - - - // library-accessible "private" interface - private: - int value; - - - //PMS VARIABLES PRIVATE START - enum STATUS { STATUS_WAITING, STATUS_OK }; - enum MODE { MODE_ACTIVE, MODE_PASSIVE }; - - uint8_t _payload[32]; - Stream* _stream; - DATA* _data; - STATUS _PMSstatus; - MODE _mode = MODE_ACTIVE; - - uint8_t _index = 0; - uint16_t _frameLen; - uint16_t _checksum; - uint16_t _calculatedChecksum; - SoftwareSerial *_SoftSerial_PMS; - void loop(); - char Char_PM1[10]; - char Char_PM2[10]; - char Char_PM10[10]; - //PMS VARIABLES PRIVATE END - - //TMP_RH VARIABLES PRIVATE START - uint8_t _address; - TMP_RH_RegisterStatus _status; - - TMP_RH_ErrorCode writeCommand(TMP_RH_Commands command); - TMP_RH_ErrorCode writeAlertData(TMP_RH_Commands command, float temperature, float humidity); - - uint8_t checkCrc(uint8_t data[], uint8_t checksum); - uint8_t calculateCrc(uint8_t data[]); - - float calculateHumidity(uint16_t rawValue); - float calculateTemperature(uint16_t rawValue); - - TMP_RH readTemperatureAndHumidity(); - TMP_RH_ErrorCode read_TMP_RH(uint16_t* data, uint8_t numOfPair); - - TMP_RH returnError(TMP_RH_ErrorCode command); - //TMP_RH VARIABLES PRIVATE END - - //CO2 VARABLES PUBLIC START - char Char_CO2[10]; - - //CO2 VARABLES PUBLIC END - //MHZ19 VARABLES PUBLIC START - - int readInternal_MHZ19(); - - uint8_t _type_MHZ19, temperature_MHZ19; - bool debug_MHZ19 = false; - - Stream * _serial_MHZ19; - SoftwareSerial *_SoftSerial_MHZ19; - uint8_t getCheckSum_MHZ19(unsigned char *packet); - - //MHZ19 VARABLES PUBLIC END - -}; - - -#endif - diff --git a/LICENSE.md b/LICENSE.md index 7dd1351..03b5108 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,21 +1 @@ -The MIT License (MIT) - -Copyright (c) 2022 AirGradient - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License diff --git a/README.md b/README.md index 0d1a16e..783a97e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,41 @@ -AirGradient Arduino Library for ESP8266 (Wemos D1 MINI) +AirGradient Arduino Library for ESP8266 (Wemos D1 MINI) and ESP32 (ESP32-C3 Mini) ===================================================================================================== -Build your own low cost air quality sensor with optional display measuring PM2.5, CO2, Temperature and Humidity. +This is the code for the AirGradient open-source indoor and outdoor air quality monitors with ESP8266 / ESP32-C3 Microcontrollers. -This library makes it easy to read the sensor data from the Plantower PMS5003 PM2.5 sensor, the Senseair S8 and the SHT30/31 Temperature and Humidity sensor. Visit our DIY section for detailed build instructions and PCB layout. +More information on the air quality monitors and kits are available here: +Indoor Monitor: [https://www.airgradient.com/indoor/](https://www.airgradient.com/indoor/) +Outdoor Monitor: [https://www.airgradient.com/outdoor/](https://www.airgradient.com/outdoor/) -https://www.airgradient.com/open-airgradient/instructions/ +This library supports the following sensor modules: +- Plantower PMS5003 +- Plantower PMS5003T +- SenseAir S8 +- Sensirion SGP41 +- Sensirion SHT40 + +## Important information + +Make sure you have exactly the versions of libraries and boards installed as described in the comment section of the example files. + +If you have an older version of the AirGradient PCB not mentioned in the example files, please downgrade this library to version 2.4.15 to support these legacy boards. + +## Help & Support + +If you have any questions or problems, check out [our forum](https://forum.airgradient.com/). + +## The following libraries have been integrated into this library for ease of use + +- [Adafruit BusIO](https://github.com/adafruit/Adafruit_BusIO) +- [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) +- [Adafruit SH110X](https://github.com/adafruit/Adafruit_SH110X) +- [Adafruit SSD1306 Wemos Mini OLED](https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED) +- [Adafruit GFX Library](https://github.com/adafruit/Adafruit-GFX-Library) +- [Sensirion Gas Index Algorithm](https://github.com/Sensirion/arduino-gas-index-algorithm) +- [Sensirion Core](https://github.com/Sensirion/arduino-core/) +- [Sensirion I2C SGP41](https://github.com/Sensirion/arduino-i2c-sgp41) +- [Sensirion I2C SHT4x](https://github.com/Sensirion/arduino-i2c-sht4x) +- [PMS](https://github.com/fu-hsi/pms) + +## License +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino new file mode 100644 index 0000000..a630dbe --- /dev/null +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -0,0 +1,460 @@ +/* +This is the code for the AirGradient DIY BASIC Air Quality Monitor with an D1 ESP8266 Microcontroller. + +It is an air quality monitor for PM2.5, CO2, Temperature and Humidity with a small display and can send data over Wifi. + +Open source air quality monitors and kits are available: +Indoor Monitor: https://www.airgradient.com/indoor/ +Outdoor Monitor: https://www.airgradient.com/outdoor/ + +Build Instructions: +https://www.airgradient.com/documentation/diy-v4/ + +Following libraries need to be installed: +“WifiManager by tzapu, tablatronix” tested with version 2.0.16-rc.2 +"Arduino_JSON" by Arduino version 0.2.0 +"U8g2" by oliver version 2.34.22 + +Please make sure you have esp8266 board manager installed. Tested with version 3.1.2. + +Set board to "LOLIN(WEMOS) D1 R2 & mini" + +Configuration parameters, e.g. Celsius / Fahrenheit or PM unit (US AQI vs ug/m3) can be set through the AirGradient dashboard. + +If you have any questions please visit our forum at +https://forum.airgradient.com/ + +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License + +*/ + +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + bool inF; /** Temperature unit */ + bool inUSAQI; /** PMS standard */ + uint8_t ledBarMode; /** @ref UseLedBar*/ + char model[16]; /** Model string value, Just define, don't know how much + memory usage */ + char mqttBroker[128]; /** Mqtt broker link */ + uint32_t _check; /** Checksum configuration data */ +} ServerConfig_t; +static ServerConfig_t serverConfig; + +AirGradient ag = AirGradient(BOARD_DIY_BASIC_KIT); + +// CONFIGURATION START + +// set to the endpoint you would like to use +String APIROOT = "http://hw.airgradient.com/"; + +String wifiApPass = "cleanair"; + +// set to true if you want to connect to wifi. You have 60 seconds to connect. +// Then it will go into an offline mode. +boolean connectWIFI = true; + +// CONFIGURATION END + +unsigned long currentMillis = 0; + +const int oledInterval = 5000; +unsigned long previousOled = 0; +bool co2CalibrationRequest = false; +uint32_t serverConfigLoadTime = 0; +String HOSTPOT = ""; + +const int sendToServerInterval = 60000; +const int pollServerConfigInterval = 30000; +const int co2CalibCountdown = 5; /** Seconds */ +unsigned long previoussendToServer = 0; + +const int co2Interval = 5000; +unsigned long previousCo2 = 0; +int Co2 = 0; + +const int pm25Interval = 5000; +unsigned long previousPm25 = 0; +int pm25 = 0; + +const int tempHumInterval = 2500; +unsigned long previousTempHum = 0; +float temp = 0; +int hum = 0; +long val; + +void failedHandler(String msg); +void boardInit(void); +void getServerConfig(void); +void co2Calibration(void); + +void setup() { + Serial.begin(115200); + + /** Init I2C */ + Wire.begin(ag.getI2cSdaPin(), ag.getI2cSclPin()); + + /** Board init */ + boardInit(); + + /** Show boot display */ + displayShowText("Basic v4", "Lib:" + ag.getVersion(), ""); + delay(2000); + + if (connectWIFI) { + connectToWifi(); + } + + /** Show display */ + displayShowText("Warm Up", "Serial#", String(ESP.getChipId(), HEX)); + delay(10000); + + getServerConfig(); +} + +void loop() { + currentMillis = millis(); + updateOLED(); + updateCo2(); + updatePm25(); + updateTempHum(); + sendToServer(); + getServerConfig(); +} + +void updateCo2() { + if (currentMillis - previousCo2 >= co2Interval) { + previousCo2 += co2Interval; + Co2 = ag.s8.getCo2(); + Serial.println(String(Co2)); + } +} + +void updatePm25() { + if (currentMillis - previousPm25 >= pm25Interval) { + previousPm25 += pm25Interval; + if (ag.pms5003.readData()) { + pm25 = ag.pms5003.getPm25Ae(); + Serial.printf("PM25: %d\r\n", pm25); + } + } +} + +void updateTempHum() { + if (currentMillis - previousTempHum >= tempHumInterval) { + previousTempHum += tempHumInterval; + + /** Get temperature and humidity */ + temp = ag.sht.getTemperature(); + hum = ag.sht.getRelativeHumidity(); + + /** Print debug message */ + Serial.printf("SHT Humidity: %d%, Temperature: %0.2f\r\n", hum, temp); + } +} + +void updateOLED() { + if (currentMillis - previousOled >= oledInterval) { + previousOled += oledInterval; + + String ln1; + String ln2; + String ln3; + + if (serverConfig.inUSAQI) { + ln1 = "AQI:" + String(ag.pms5003.convertPm25ToUsAqi(pm25)); + } else { + ln1 = "PM :" + String(pm25) + " ug"; + } + ln2 = "CO2:" + String(Co2); + + if (serverConfig.inF) { + ln3 = + String((temp * 9 / 5) + 32).substring(0, 4) + " " + String(hum) + "%"; + } else { + ln3 = String(temp).substring(0, 4) + " " + String(hum) + "%"; + } + displayShowText(ln1, ln2, ln3); + } +} + +void displayShowText(String ln1, String ln2, String ln3) { + char buf[9]; + ag.display.clear(); + + ag.display.setCursor(1, 1); + ag.display.setText(ln1); + ag.display.setCursor(1, 19); + ag.display.setText(ln2); + ag.display.setCursor(1, 37); + ag.display.setText(ln3); + + ag.display.show(); +} + +void sendToServer() { + if (currentMillis - previoussendToServer >= sendToServerInterval) { + previoussendToServer += sendToServerInterval; + + String payload = "{\"wifi\":" + String(WiFi.RSSI()) + + (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) + + (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) + + ", \"atmp\":" + String(temp) + + (hum < 0 ? "" : ", \"rhum\":" + String(hum)) + "}"; + + if (WiFi.status() == WL_CONNECTED) { + Serial.println(payload); + String POSTURL = APIROOT + + "sensors/airgradient:" + String(ESP.getChipId(), HEX) + + "/measures"; + Serial.println(POSTURL); + WiFiClient client; + HTTPClient http; + http.begin(client, POSTURL); + http.addHeader("content-type", "application/json"); + int httpCode = http.POST(payload); + String response = http.getString(); + Serial.println(httpCode); + Serial.println(response); + http.end(); + } else { + Serial.println("WiFi Disconnected"); + } + } +} + +// Wifi Manager +void connectToWifi() { + WiFiManager wifiManager; + // WiFi.disconnect(); //to delete previous saved hotspot + String HOTSPOT = "AG-" + String(ESP.getChipId(), HEX); + // displayShowText("Connect", "AG-", String(ESP.getChipId(), HEX)); + delay(2000); + // wifiManager.setTimeout(90); + wifiManager.setConfigPortalBlocking(false); + wifiManager.setConfigPortalTimeout(180); + wifiManager.autoConnect(HOTSPOT.c_str(), wifiApPass.c_str()); + + uint32_t lastTime = millis(); + int count = 179; + displayShowText("180 sec", "SSID:",HOTSPOT); + while (wifiManager.getConfigPortalActive()) { + wifiManager.process(); + uint32_t ms = (uint32_t)(millis() - lastTime); + if (ms >= 1000) { + lastTime = millis(); + displayShowText(String(count) + " sec", "SSID:",HOTSPOT); + count--; + + // Timeout + if (count == 0) { + break; + } + } + } + if (!WiFi.isConnected()) { + displayShowText("Booting", "offline", "mode"); + Serial.println("failed to connect and hit timeout"); + delay(6000); + } +} + +void failedHandler(String msg) { + while (true) { + Serial.println(msg); + delay(1000); + } +} + +void boardInit(void) { + /** Init SHT sensor */ + if (ag.sht.begin(Wire) == false) { + failedHandler("SHT init failed"); + } + + /** CO2 init */ + if (ag.s8.begin(&Serial) == false) { + failedHandler("SenseAirS8 init failed"); + } + + /** PMS init */ + if (ag.pms5003.begin(&Serial) == false) { + failedHandler("PMS5003 init failed"); + } + + /** Display init */ + ag.display.begin(Wire); + ag.display.setTextColor(1); +} + +void showConfig(void) { + Serial.println("Server configuration: "); + Serial.printf(" inF: %s\r\n", serverConfig.inF ? "true" : "false"); + Serial.printf(" inUSAQI: %s\r\n", + serverConfig.inUSAQI ? "true" : "false"); + Serial.printf("useRGBLedBar: %d\r\n", (int)serverConfig.ledBarMode); + Serial.printf(" Model: %.*s\r\n", sizeof(serverConfig.model), + serverConfig.model); + Serial.printf(" Mqtt Broker: %.*s\r\n", sizeof(serverConfig.mqttBroker), + serverConfig.mqttBroker); +} + +void updateServerConfigLoadTime(void) { + serverConfigLoadTime = millis(); + if (serverConfigLoadTime == 0) { + serverConfigLoadTime = 1; + } +} + +void getServerConfig(void) { + /** Only trigger load configuration again after pollServerConfigInterval sec + */ + if (serverConfigLoadTime) { + uint32_t ms = (uint32_t)(millis() - serverConfigLoadTime); + if (ms < pollServerConfigInterval) { + return; + } + } + + updateServerConfigLoadTime(); + + Serial.println("Trigger load server configuration"); + if (WiFi.status() != WL_CONNECTED) { + Serial.println( + "Ignore get server configuration because WIFI not connected"); + return; + } + + // WiFiClient wifiClient; + HTTPClient httpClient; + + String getUrl = "http://hw.airgradient.com/sensors/airgradient:" + + String(ESP.getChipId(), HEX) + "/one/config"; + Serial.println("HttpClient get: " + getUrl); + WiFiClient client; + if (httpClient.begin(client, getUrl) == false) { + Serial.println("HttpClient init failed"); + updateServerConfigLoadTime(); + return; + } + + int respCode = httpClient.GET(); + + /** get failure */ + if (respCode != 200) { + Serial.printf("HttpClient get failed: %d\r\n", respCode); + updateServerConfigLoadTime(); + return; + } + + String respContent = httpClient.getString(); + Serial.println("Server config: " + respContent); + + /** Parse JSON */ + JSONVar root = JSON.parse(respContent); + if (JSON.typeof_(root) == "undefined") { + Serial.println("Server configura JSON invalid"); + updateServerConfigLoadTime(); + return; + } + + /** Get "country" */ + bool inF = serverConfig.inF; + if (JSON.typeof_(root["country"]) == "string") { + String country = root["country"]; + if (country == "US") { + inF = true; + } else { + inF = false; + } + } + + /** Get "pmStandard" */ + bool inUSAQI = serverConfig.inUSAQI; + if (JSON.typeof_(root["pmStandard"]) == "string") { + String standard = root["pmStandard"]; + if (standard == "ugm3") { + inUSAQI = false; + } else { + inUSAQI = true; + } + } + + /** Get CO2 "co2CalibrationRequested" */ + co2CalibrationRequest = false; + if (JSON.typeof_(root["co2CalibrationRequested"]) == "boolean") { + co2CalibrationRequest = root["co2CalibrationRequested"]; + } + + /** get "model" */ + String model = ""; + if (JSON.typeof_(root["model"]) == "string") { + String _model = root["model"]; + model = _model; + } + + /** get "mqttBrokerUrl" */ + String mqtt = ""; + if (JSON.typeof_(root["mqttBrokerUrl"]) == "string") { + String _mqtt = root["mqttBrokerUrl"]; + mqtt = _mqtt; + } + + if (inF != serverConfig.inF) { + serverConfig.inF = inF; + } + if (inUSAQI != serverConfig.inUSAQI) { + serverConfig.inUSAQI = inUSAQI; + } + if (model.length()) { + if (model != String(serverConfig.model)) { + memset(serverConfig.model, 0, sizeof(serverConfig.model)); + memcpy(serverConfig.model, model.c_str(), model.length()); + } + } + if (mqtt.length()) { + if (mqtt != String(serverConfig.mqttBroker)) { + memset(serverConfig.mqttBroker, 0, sizeof(serverConfig.mqttBroker)); + memcpy(serverConfig.mqttBroker, mqtt.c_str(), mqtt.length()); + } + } + + /** Show server configuration */ + showConfig(); + + /** Calibration */ + if (co2CalibrationRequest) { + co2Calibration(); + } +} + +void co2Calibration(void) { + /** Count down for co2CalibCountdown secs */ + for (int i = 0; i < co2CalibCountdown; i++) { + displayShowText("CO2 calib", "after", + String(co2CalibCountdown - i) + " sec"); + delay(1000); + } + + if (ag.s8.setBaselineCalibration()) { + displayShowText("Calib", "success", ""); + delay(1000); + displayShowText("Wait for", "finish", "..."); + int count = 0; + while (ag.s8.isBaseLineCalibrationDone() == false) { + delay(1000); + count++; + } + displayShowText("Finish", "after", String(count) + " sec"); + delay(2000); + } else { + displayShowText("Calib", "failure!!!", ""); + delay(2000); + } +} diff --git a/examples/C02_CALIBRATION/C02_CALIBRATION.ino b/examples/C02_CALIBRATION/C02_CALIBRATION.ino deleted file mode 100644 index a0aa3cf..0000000 --- a/examples/C02_CALIBRATION/C02_CALIBRATION.ino +++ /dev/null @@ -1,127 +0,0 @@ -/* - This is the code for forced calibration of the SenseAir S8 sensor. The sensor also has a one-week automatic baseline calibration that should calibrate the sensor latest after one week.0 - However if you need a faster calibration please proceed as following: - - 1. Flash this code - 2. Bring the sensor outside into fresh air and leave it there for at least 10 minutes - 3. Power on the sensor - 4. Follow the instructions on the display - 5. After the calibration has been done, flash back the previous code for AQ measurements - - The codes needs the following libraries installed: - “S8_UART” by Josep Comas tested with version 1.0.1 - “U8g2” by oliver tested with version 2.32.15 - -Many thanks to Josep Comas of the S8_UART library from which parts of below code are borrowed. - - */ - -#include -#include "s8_uart.h" -#include - -/* BEGIN CONFIGURATION */ - -// Display -//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//for DIY PRO -U8G2_SSD1306_64X48_ER_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); //for DIY BASIC - -#define DEBUG_BAUDRATE 115200 - -#if (defined USE_SOFTWARE_SERIAL || defined ARDUINO_ARCH_RP2040) - #define S8_RX_PIN 2 - #define S8_TX_PIN 0 -#else - #define S8_UART_PORT 1 -#endif - -#define COUNTDOWN (60) //seconds - -/* END CONFIGURATION */ - -#ifdef USE_SOFTWARE_SERIAL - SoftwareSerial S8_serial(S8_RX_PIN, S8_TX_PIN); -#else - #if defined(ARDUINO_ARCH_RP2040) - REDIRECT_STDOUT_TO(Serial) - UART S8_serial(S8_TX_PIN, S8_RX_PIN, NC, NC); - #else - HardwareSerial S8_serial(S8_UART_PORT); - #endif -#endif - - -S8_UART *sensor_S8; -S8_sensor sensor; - - -void setup() { - Serial.begin(DEBUG_BAUDRATE); - u8g2.begin(); - int i = 0; - while (!Serial && i < 50) { - delay(10); - i++; - } - S8_serial.begin(S8_BAUDRATE); - sensor_S8 = new S8_UART(S8_serial); - sensor_S8->get_firmware_version(sensor.firm_version); - int len = strlen(sensor.firm_version); - if (len == 0) { - Serial.println("SenseAir S8 CO2 sensor not found!"); - updateOLED2("SenseAir", "not", "found"); - while (1) { delay(1); }; - } - Serial.println(">>> SenseAir S8 NDIR CO2 sensor <<<"); - printf("Firmware version: %s\n", sensor.firm_version); - sensor.sensor_id = sensor_S8->get_sensor_ID(); - Serial.print("Sensor ID: 0x"); printIntToHex(sensor.sensor_id, 4); Serial.println(""); - Serial.println("Now, you put the sensor outside and wait."); - Serial.println("Countdown begins..."); - unsigned int seconds = COUNTDOWN; - while (seconds > 0) { - printf("Time remaining: %d minutes %d seconds\n", seconds / 60, seconds % 60); - updateOLED2("Wait", "for", String(seconds) + " Sec"); - delay(1000); - seconds--; - } - Serial.println("Time reamining: 0 minutes 0 seconds"); - // Start manual calibration - Serial.println("Starting manual calibration..."); - updateOLED2("Starting", "Manual", "Calibration"); - delay(2000); - if (!sensor_S8->manual_calibration()) { - Serial.println("Error setting manual calibration!"); - updateOLED2("Error", "Manual", "Calibration"); - while (1) { delay(10); } - } -} - -void loop() { - static unsigned int elapsed = 0; - delay(2000); - elapsed += 2; - - // Check if background calibration is finished - sensor.ack = sensor_S8->get_acknowledgement(); - if (sensor.ack & S8_MASK_CO2_BACKGROUND_CALIBRATION) { - printf("Manual calibration is finished. Elapsed: %u seconds\n", elapsed); - updateOLED2("Calibration", "finished", ""); - while (1) { delay(10); } - } else { - Serial.println("Doing manual calibration..."); - updateOLED2("Doing", "manual", "calibration"); - } -} - -void updateOLED2(String ln1, String ln2, String ln3) { - char buf[9]; - u8g2.firstPage(); - u8g2.firstPage(); - do { - u8g2.setFont(u8g2_font_t0_16_tf); - u8g2.drawStr(1, 10, String(ln1).c_str()); - u8g2.drawStr(1, 28, String(ln2).c_str()); - u8g2.drawStr(1, 46, String(ln3).c_str()); - } while ( u8g2.nextPage() ); -} diff --git a/examples/C02_SIMPLE/C02_SIMPLE.ino b/examples/C02_SIMPLE/C02_SIMPLE.ino deleted file mode 100644 index e4931fc..0000000 --- a/examples/C02_SIMPLE/C02_SIMPLE.ino +++ /dev/null @@ -1,39 +0,0 @@ -/* -This is the code for the AirGradient DIY Air Quality Sensor with an ESP8266 Microcontroller. - -It is a high quality sensor showing PM2.5, CO2, Temperature and Humidity on a small display and can send data over Wifi. - -For build instructions please visit https://www.airgradient.com/open-airgradient/instructions/ - -Compatible with the following sensors: -SenseAir S8 (CO2 Sensor) - -Please install ESP8266 board manager (tested with version 3.0.0) - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -Kits with all required components are available at https://www.airgradient.com/open-airgradient/shop/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - -#include -AirGradient ag = AirGradient(); - -void setup(){ - Serial.begin(115200); - ag.CO2_Init(); -} - -void loop(){ - -int CO2 = ag.getCO2_Raw(); -Serial.print("C02: "); -Serial.println(ag.getCO2()); - -delay(5000); -} diff --git a/examples/CO2_TRAFFIC_LIGHT/CO2_TRAFFIC_LIGHT_SIMPLE.ino b/examples/CO2_TRAFFIC_LIGHT/CO2_TRAFFIC_LIGHT_SIMPLE.ino deleted file mode 100644 index 6b6ff6e..0000000 --- a/examples/CO2_TRAFFIC_LIGHT/CO2_TRAFFIC_LIGHT_SIMPLE.ino +++ /dev/null @@ -1,132 +0,0 @@ -/* -This is the code for the AirGradient DIY CO2 Traffic light with an ESP8266 Microcontroller. - -For build instructions please visit: -https://www.airgradient.com/open-airgradient/instructions/diy-co2-traffic-light/ - -Kits (including a pre-soldered version) are available: -https://www.airgradient.com/open-airgradient/kits/ - -Compatible with the following sensors: -SenseAir S8 (CO2 Sensor) - -Please install ESP8266 board manager (tested with version 3.0.0) - -Please install the following libraries: -"Adafruit NeoMatrix" Library (tested with 1.2.0) -"WifiManager by tzapu, tablatronix" tested with Version 2.0.3-alpha - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - -#include -#include -#include -#include - -#include -#include -#include -#ifndef PSTR - #define PSTR // Make Arduino Due happy -#endif - -AirGradient ag = AirGradient(); -#define PIN D8 - -int co2 = 0; -String text = "AirGradient CO2"; -// set to true if you want to connect to wifi. The display will show values only when the sensor has wifi connection -boolean connectWIFI=true; -int greenToOrange = 800; -int orangeToRed = 1200; - -// change if you want to send the data to another server -String APIROOT = "http://hw.airgradient.com/"; - -Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN, - NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + - NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE, - NEO_GRB + NEO_KHZ800); - -void setup() { - Serial.begin(115200); - ag.CO2_Init(); - matrix.begin(); - matrix.setRotation(1); // change rotation - matrix.setTextWrap(false); - matrix.setBrightness(40); - matrix.setTextColor(matrix.Color(70,130,180)); - - Serial.println("Chip ID: "+String(ESP.getChipId(),HEX)); - if (connectWIFI) connectToWifi(); - delay(2000); -} - -void loop() { - showText(); -} - -int x = matrix.width(); - -void showText() { - Serial.println("in loop"); - matrix.fillScreen(0); - matrix.setCursor(x, 0); - matrix.print(String(text)); - if(--x < -100) { - x = matrix.width(); - Serial.println("end text"); - co2 = ag.getCO2_Raw(); - text = String(co2)+"ppm"; - if (co2>350) matrix.setTextColor(matrix.Color(0, 255, 0)); - if (co2>greenToOrange) matrix.setTextColor(matrix.Color(255, 90, 0)); - if (co2>orangeToRed) matrix.setTextColor(matrix.Color(255,0, 0)); - - // send payload - String payload = "{\"wifi\":" + String(WiFi.RSSI()) + ","; - payload = payload + "\"rco2\":" + String(co2); - payload = payload + "}"; - - if (connectWIFI) { - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(), HEX) + "/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - delay(20000); - } - - delay(10000); - } - - matrix.show(); - delay(100); -} - -// Wifi Manager -void connectToWifi(){ - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AIRGRADIENT-"+String(ESP.getChipId(),HEX); - wifiManager.setTimeout(120); - if(!wifiManager.autoConnect((const char*)HOTSPOT.c_str())) { - Serial.println("failed to connect and hit timeout"); - delay(3000); - ESP.restart(); - delay(5000); - } - } diff --git a/examples/DIY_BASIC/DIY_BASIC.ino b/examples/DIY_BASIC/DIY_BASIC.ino deleted file mode 100644 index d91a3d5..0000000 --- a/examples/DIY_BASIC/DIY_BASIC.ino +++ /dev/null @@ -1,243 +0,0 @@ -/* -This is the code for the AirGradient DIY BASIC Air Quality Sensor with an ESP8266 Microcontroller. - -It is a high quality sensor showing PM2.5, CO2, Temperature and Humidity on a small display and can send data over Wifi. - -Build Instructions: https://www.airgradient.com/open-airgradient/instructions/diy/ - -Kits (including a pre-soldered version) are available: https://www.airgradient.com/open-airgradient/kits/ - -The codes needs the following libraries installed: -“WifiManager by tzapu, tablatronix” tested with version 2.0.11-beta -“U8g2” by oliver tested with version 2.32.15 -"Arduino-SHT" by Johannes Winkelmann Version 1.2.2 - -Configuration: -Please set in the code below the configuration parameters. - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -MIT License - -*/ - - -#include -#include -#include -#include -#include -#include -#include "SHTSensor.h" - -AirGradient ag = AirGradient(); -SHTSensor sht; - -U8G2_SSD1306_64X48_ER_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); //for DIY BASIC - - -// CONFIGURATION START - -//set to the endpoint you would like to use -String APIROOT = "http://hw.airgradient.com/"; - -// set to true to switch from Celcius to Fahrenheit -boolean inF = false; - -// PM2.5 in US AQI (default ug/m3) -boolean inUSAQI = false; - -// set to true if you want to connect to wifi. You have 60 seconds to connect. Then it will go into an offline mode. -boolean connectWIFI=true; - -// CONFIGURATION END - - -unsigned long currentMillis = 0; - -const int oledInterval = 5000; -unsigned long previousOled = 0; - -const int sendToServerInterval = 10000; -unsigned long previoussendToServer = 0; - -const int co2Interval = 5000; -unsigned long previousCo2 = 0; -int Co2 = 0; - -const int pm25Interval = 5000; -unsigned long previousPm25 = 0; -int pm25 = 0; - -const int tempHumInterval = 2500; -unsigned long previousTempHum = 0; -float temp = 0; -int hum = 0; -long val; - -void setup() -{ - Serial.begin(115200); - sht.init(); - sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); - u8g2.setBusClock(100000); - u8g2.begin(); - updateOLED(); - - if (connectWIFI) { - connectToWifi(); - } - updateOLED2("Warm Up", "Serial#", String(ESP.getChipId(), HEX)); - ag.CO2_Init(); - ag.PMS_Init(); - //ag.TMP_RH_Init(0x44); -} - - -void loop() -{ - currentMillis = millis(); - updateOLED(); - updateCo2(); - updatePm25(); - updateTempHum(); - sendToServer(); -} - -void updateCo2() -{ - if (currentMillis - previousCo2 >= co2Interval) { - previousCo2 += co2Interval; - Co2 = ag.getCO2_Raw(); - Serial.println(String(Co2)); - } -} - -void updatePm25() -{ - if (currentMillis - previousPm25 >= pm25Interval) { - previousPm25 += pm25Interval; - pm25 = ag.getPM2_Raw(); - Serial.println(String(pm25)); - } -} - -void updateTempHum() -{ - if (currentMillis - previousTempHum >= tempHumInterval) { - previousTempHum += tempHumInterval; - if (sht.readSample()) { - Serial.print("SHT:\n"); - Serial.print(" RH: "); - Serial.print(sht.getHumidity(), 2); - Serial.print("\n"); - Serial.print(" T: "); - Serial.print(sht.getTemperature(), 2); - Serial.print("\n"); - temp = sht.getTemperature(); - hum = sht.getHumidity(); - } else { - Serial.print("Error in readSample()\n"); - } - Serial.println(String(temp)); - } -} - -void updateOLED() { - if (currentMillis - previousOled >= oledInterval) { - previousOled += oledInterval; - - String ln1; - String ln2; - String ln3; - - - if (inUSAQI){ - ln1 = "AQI:" + String(PM_TO_AQI_US(pm25)) ; - } else { - ln1 = "PM: " + String(pm25) +"ug" ; - } - - ln2 = "CO2:" + String(Co2); - - if (inF) { - ln3 = String((temp* 9 / 5) + 32).substring(0,4) + " " + String(hum)+"%"; - } else { - ln3 = String(temp).substring(0,4) + " " + String(hum)+"%"; - } - updateOLED2(ln1, ln2, ln3); - } -} - -void updateOLED2(String ln1, String ln2, String ln3) { - char buf[9]; - u8g2.firstPage(); - u8g2.firstPage(); - do { - u8g2.setFont(u8g2_font_t0_16_tf); - u8g2.drawStr(1, 10, String(ln1).c_str()); - u8g2.drawStr(1, 28, String(ln2).c_str()); - u8g2.drawStr(1, 46, String(ln3).c_str()); - } while ( u8g2.nextPage() ); -} - -void sendToServer() { - if (currentMillis - previoussendToServer >= sendToServerInterval) { - previoussendToServer += sendToServerInterval; - - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) - + (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) - + ", \"atmp\":" + String(temp) - + (hum < 0 ? "" : ", \"rhum\":" + String(hum)) - + "}"; - - if(WiFi.status()== WL_CONNECTED){ - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(), HEX) + "/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - } - else { - Serial.println("WiFi Disconnected"); - } - } -} - -// Wifi Manager - void connectToWifi() { - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AG-" + String(ESP.getChipId(), HEX); - updateOLED2("Connect", "Wifi AG-", String(ESP.getChipId(), HEX)); - delay(2000); - wifiManager.setTimeout(90); - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - updateOLED2("Booting", "offline", "mode"); - Serial.println("failed to connect and hit timeout"); - delay(6000); - } -} - -// Calculate PM2.5 US AQI -int PM_TO_AQI_US(int pm02) { - if (pm02 <= 12.0) return ((50 - 0) / (12.0 - .0) * (pm02 - .0) + 0); - else if (pm02 <= 35.4) return ((100 - 50) / (35.4 - 12.0) * (pm02 - 12.0) + 50); - else if (pm02 <= 55.4) return ((150 - 100) / (55.4 - 35.4) * (pm02 - 35.4) + 100); - else if (pm02 <= 150.4) return ((200 - 150) / (150.4 - 55.4) * (pm02 - 55.4) + 150); - else if (pm02 <= 250.4) return ((300 - 200) / (250.4 - 150.4) * (pm02 - 150.4) + 200); - else if (pm02 <= 350.4) return ((400 - 300) / (350.4 - 250.4) * (pm02 - 250.4) + 300); - else if (pm02 <= 500.4) return ((500 - 400) / (500.4 - 350.4) * (pm02 - 350.4) + 400); - else return 500; -}; diff --git a/examples/DIY_OUTDOOR/DIY_OUTDOOR.ino b/examples/DIY_OUTDOOR/DIY_OUTDOOR.ino deleted file mode 100644 index 207e729..0000000 --- a/examples/DIY_OUTDOOR/DIY_OUTDOOR.ino +++ /dev/null @@ -1,212 +0,0 @@ -/* -Important: This code is only for the AirGradient DIY OUTDOOR. - -Build Instructions: https://www.airgradient.com/open-airgradient/instructions/diy-outdoor/ - -Kits (including a pre-soldered version) are available: https://www.airgradient.com/open-airgradient/kits/ - -Configuration: -Install required libraries -Patch PMS library to accept temperature and humidity from PMS5003T - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License -*/ - -#include "PMS.h" -#include "SoftwareSerial.h" -#include - -#include -#include -#include -#include - -SoftwareSerial softSerial(D6, D5); -SoftwareSerial soft2(D3, D7); - - -PMS pms(softSerial); -PMS pms2(soft2); -PMS::DATA data; -PMS::DATA data2; - -float pm1Value=0; -int pm1Position = 0; - -float pm2Value=0; -int pm2Position = 0; - -float temp_pm1 = 0; -float hum_pm1 = 0; - -float temp_pm2 = 0; -float hum_pm2 = 0; - -unsigned long currentMillis = 0; - -const int pm1Interval = 5000; -unsigned long previousPm1 = 0; - -const int pm2Interval = 5000; -unsigned long previousPm2 = 0; - -String APIROOT = "http://hw.airgradient.com/"; - -void setup() -{ - Serial.begin(115200); - Serial.println("Chip ID: "+String(ESP.getChipId())); - softSerial.begin(9600); - soft2.begin(9600); - Wire.begin(); - pinMode(D7, OUTPUT); - connectToWifi(); -} - - -void loop() -{ - currentMillis = millis(); - updatePm1(); - updatePm2(); -} - - -void updatePm1() -{ - if (currentMillis - previousPm1 >= pm1Interval) { - digitalWrite(D7, HIGH); - delay(400); - digitalWrite(D7, LOW); - Serial.println("updatePm1: "+String(pm1Position)); - previousPm1 += pm1Interval; - pms.requestRead(); - if (pms.readUntil(data)){ - Serial.println("success read"); - int pm1 = data.PM_AE_UG_2_5; - temp_pm1 = data.AMB_TMP; - hum_pm1 = data.AMB_HUM; - Serial.print("PMS 1: PM 2.5 (ug/m3): "); - Serial.println(pm1); - Serial.print("PMS 1: Temp: "); - Serial.println(temp_pm1); - Serial.print("PMS 1: Hum: "); - Serial.println(hum_pm1); - Serial.println(); - delay(1000); - pm1Value=pm1Value+pm1; - pm1Position++; - if (pm1Position==20) { - sendToServerPM1(pm1Value); - pm1Position=0; - pm1Value=0; - } - } - } -} - -void updatePm2() -{ - if (currentMillis - previousPm2 >= pm2Interval) { - Serial.println("updatePm2: "+String(pm2Position)); - previousPm2 += pm2Interval; - pms2.requestRead(); - if (pms2.readUntil(data2)){ - int pm2 = data2.PM_AE_UG_2_5; - temp_pm2 = data2.AMB_TMP ; - hum_pm2 = data2.AMB_HUM; - Serial.print("PMS 2: PM 2.5 (ug/m3): "); - Serial.println(pm2); - Serial.print("PMS 2: Temp: "); - Serial.println(temp_pm2); - Serial.print("PMS 2: Hum: "); - Serial.println(hum_pm2); - Serial.println(); - delay(1000); - pm2Value=pm2Value+pm2; - pm2Position++; - if (pm2Position==20) { - sendToServerPM2(pm2Value); - pm2Position=0; - pm2Value=0; - } - } - } -} - -void sendToServerPM1(float pm1Value) { - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + ", \"pm02\":" + String(pm1Value/20) - + ", \"atmp\":" + String(temp_pm1/10) - + ", \"rhum\":" + String(hum_pm1/10) - + "}"; - - if(WiFi.status()== WL_CONNECTED){ - digitalWrite(D7, HIGH); - delay(300); - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId()) + "-1/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - digitalWrite(D7, LOW); - } - else { - Serial.println("WiFi Disconnected"); - } -} - - -void sendToServerPM2(float pm2Value) { - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + ", \"pm02\":" + String(pm2Value/20) - + ", \"atmp\":" + String(temp_pm2/10) - + ", \"rhum\":" + String(hum_pm2/10) - + "}"; - - if(WiFi.status()== WL_CONNECTED){ - digitalWrite(D7, HIGH); - delay(300); - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId()) + "-2/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - digitalWrite(D7, LOW); - } - else { - Serial.println("WiFi Disconnected"); - } -} - - -// Wifi Manager - void connectToWifi() { - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AIRGRADIENT-" + String(ESP.getChipId()); - wifiManager.setTimeout(60); - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - Serial.println("failed to connect and hit timeout"); - delay(6000); - } -} diff --git a/examples/DIY_OUTDOOR_C3_1PP/DIY_OUTDOOR_C3_1PP.ino b/examples/DIY_OUTDOOR_C3_1PP/DIY_OUTDOOR_C3_1PP.ino deleted file mode 100644 index 2ff762e..0000000 --- a/examples/DIY_OUTDOOR_C3_1PP/DIY_OUTDOOR_C3_1PP.ino +++ /dev/null @@ -1,277 +0,0 @@ -/* -Important: This code is only for the DIY OUTDOOR OPEN AIR Presoldered Kit with the ESP-C3. - -It is a high quality outdoor air quality sensor with dual PM2.5 modules and can send data over Wifi. - -Kits are available: https://www.airgradient.com/open-airgradient/kits/ - -The codes needs the following libraries installed: -“WifiManager by tzapu, tablatronix” tested with version 2.0.11-beta -“pms” by Markusz Kakl version 1.1.0 (needs to be patched for 5003T model) - -For built instructions and how to patch the PMS library: https://www.airgradient.com/open-airgradient/instructions/diy-open-air-presoldered-v11/ - -Note that below code only works with both PM sensor modules connected. - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - -#include "PMS.h" -#include -#include -#include -#include - -#define DEBUG true - -HTTPClient client; - -PMS pms1(Serial0); -PMS::DATA data1; - -float pm1Value01=0; -float pm1Value25=0; -float pm1Value10=0; -float pm1PCount=0; -float pm1temp = 0; -float pm1hum = 0; - -PMS pms2(Serial1); -PMS::DATA data2; - -float pm2Value01=0; -float pm2Value25=0; -float pm2Value10=0; -float pm2PCount=0; -float pm2temp = 0; -float pm2hum = 0; - -int countPosition = 0; -int targetCount = 20; - - -String APIROOT = "http://hw.airgradient.com/"; - -int loopCount = 0; - - -void IRAM_ATTR isr() { - debugln("pushed"); -} - -// select board LOLIN C3 mini to flash -void setup() { - if (DEBUG) { - Serial.begin(115200); - // see https://github.com/espressif/arduino-esp32/issues/6983 - Serial.setTxTimeoutMs(0); // <<<====== solves the delay issue - } - - debug("starting ..."); - debug("Serial Number: "+ getNormalizedMac()); - - // default hardware serial, PMS connector on the right side of the C3 mini on the Open Air - Serial0.begin(9600); - - // second hardware serial, PMS connector on the left side of the C3 mini on the Open Air - Serial1.begin(9600, SERIAL_8N1, 0, 1); - - // led - pinMode(10, OUTPUT); - - // push button - pinMode(9, INPUT_PULLUP); - attachInterrupt(9, isr, FALLING); - - pinMode(2, OUTPUT); - digitalWrite(2, LOW); - - // give the PMSs some time to start - countdown(3); - - connectToWifi(); - sendPing(); - switchLED(false); -} - -void loop() { - if(WiFi.status()== WL_CONNECTED) { - if (pms1.readUntil(data1, 2000) && pms2.readUntil(data2, 2000)) { - pm1Value01=pm1Value01+data1.PM_AE_UG_1_0; - pm1Value25=pm1Value25+data1.PM_AE_UG_2_5; - pm1Value10=pm1Value10+data1.PM_AE_UG_10_0; -// pm1PCount=pm1PCount+data1.PM_RAW_0_3; - pm1temp=pm1temp+data1.AMB_TMP; - pm1hum=pm1hum+data1.AMB_HUM; - pm2Value01=pm2Value01+data2.PM_AE_UG_1_0; - pm2Value25=pm2Value25+data2.PM_AE_UG_2_5; - pm2Value10=pm2Value10+data2.PM_AE_UG_10_0; -// pm2PCount=pm2PCount+data2.PM_RAW_0_3; - pm2temp=pm2temp+data2.AMB_TMP; - pm2hum=pm2hum+data2.AMB_HUM; - countPosition++; - if (countPosition==targetCount) { - pm1Value01 = pm1Value01 / targetCount; - pm1Value25 = pm1Value25 / targetCount; - pm1Value10 = pm1Value10 / targetCount; - //pm1PCount = pm1PCount / targetCount; - pm1temp = pm1temp / targetCount; - pm1hum = pm1hum / targetCount; - pm2Value01 = pm2Value01 / targetCount; - pm2Value25 = pm2Value25 / targetCount; - pm2Value10 = pm2Value10 / targetCount; -// pm2PCount = pm2PCount / targetCount; - pm2temp = pm2temp / targetCount; - pm2hum = pm2hum / targetCount; - postToServer(pm1Value01, pm1Value25,pm1Value10,pm1PCount, pm1temp,pm1hum,pm2Value01, pm2Value25,pm2Value10,pm2PCount, pm2temp,pm2hum); - - countPosition=0; - pm1Value01=0; - pm1Value25=0; - pm1Value10=0; -// pm1PCount=0; - pm1temp=0; - pm1hum=0; - pm2Value01=0; - pm2Value25=0; - pm2Value10=0; -// pm2PCount=0; - pm2temp=0; - pm2hum=0; - } - } - - } - -countdown(2); -} - -void debug(String msg) { - if (DEBUG) - Serial.print(msg); -} - -void debug(int msg) { - if (DEBUG) - Serial.print(msg); -} - -void debugln(String msg) { - if (DEBUG) - Serial.println(msg); -} - -void debugln(int msg) { - if (DEBUG) - Serial.println(msg); -} - -void switchLED(boolean ledON) { - if (ledON) { - digitalWrite(10, HIGH); - } else { - digitalWrite(10, LOW); - } -} - -void sendPing(){ - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + ", \"boot\":" + loopCount - + "}"; - sendPayload(payload); -} - -void postToServer(int pm1Value01, int pm1Value25, int pm1Value10, int pm1PCount, float pm1temp, float pm1hum,int pm2Value01, int pm2Value25, int pm2Value10, int pm2PCount, float pm2temp, float pm2hum) { - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + ", \"pm01\":" + String((pm1Value01+pm2Value01)/2) - + ", \"pm02\":" + String((pm1Value25+pm2Value25)/2) - + ", \"pm10\":" + String((pm1Value10+pm2Value10)/2) -// + ", \"pm003_count\":" + String((pm1PCount+pm2PCount)/2) - + ", \"atmp\":" + String((pm1temp+pm2temp)/20) - + ", \"rhum\":" + String((pm1hum+pm2hum)/20) - + ", \"boot\":" + loopCount - + ", \"channels\": {" - + "\"1\":{" - + "\"pm01\":" + String(pm1Value01) - + ", \"pm02\":" + String(pm1Value25) - + ", \"pm10\":" + String(pm1Value10) -// + ", \"pm003_count\":" + String(pm1PCount) - + ", \"atmp\":" + String(pm1temp/10) - + ", \"rhum\":" + String(pm1hum/10) - + "}" - + ", \"2\":{" - + " \"pm01\":" + String(pm1Value01) - + ", \"pm02\":" + String(pm2Value25) - + ", \"pm10\":" + String(pm2Value10) -// + ", \"pm003_count\":" + String(pm2PCount) - + ", \"atmp\":" + String(pm2temp/10) - + ", \"rhum\":" + String(pm2hum/10) - + "}" - + "}" - + "}"; - sendPayload(payload); -} - -void sendPayload(String payload) { - if(WiFi.status()== WL_CONNECTED){ - switchLED(true); - String url = APIROOT + "sensors/airgradient:" + getNormalizedMac() + "/measures"; - debugln(url); - debugln(payload); - client.setConnectTimeout(5 * 1000); - client.begin(url); - client.addHeader("content-type", "application/json"); - int httpCode = client.POST(payload); - debugln(httpCode); - client.end(); - resetWatchdog(); - switchLED(false); - } - else { - debug("post skipped, not network connection"); - } - loopCount++; -} - -void countdown(int from) { - debug("\n"); - while (from > 0) { - debug(String(from--)); - debug(" "); - delay(1000); - } - debug("\n"); -} - -void resetWatchdog() { - digitalWrite(2, HIGH); - delay(20); - digitalWrite(2, LOW); -} - -// Wifi Manager - void connectToWifi() { - WiFiManager wifiManager; - switchLED(true); - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AG-" + String(getNormalizedMac()); - wifiManager.setTimeout(180); - - - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - switchLED(false); - Serial.println("failed to connect and hit timeout"); - delay(6000); - } - -} - -String getNormalizedMac() { - String mac = WiFi.macAddress(); - mac.replace(":", ""); - mac.toLowerCase(); - return mac; -} diff --git a/examples/DIY_OUTDOOR_C3_1PST/DIY_OUTDOOR_C3_1PST.ino b/examples/DIY_OUTDOOR_C3_1PST/DIY_OUTDOOR_C3_1PST.ino deleted file mode 100644 index 2b251cb..0000000 --- a/examples/DIY_OUTDOOR_C3_1PST/DIY_OUTDOOR_C3_1PST.ino +++ /dev/null @@ -1,338 +0,0 @@ -/* -Important: This code is only for the AirGradient ONE Open Air Version with TVOC and CO2 sensor. - -It is a high quality sensor measuring PM2.5, CO2, TVOC, NOx, Temperature and Humidity and can send data over Wifi. - -Build Instructions: https://www.airgradient.com/open-airgradient/instructions/ - -Kits (including a pre-soldered version) are available: https://www.airgradient.com/ - -The codes needs the following libraries installed: -“WifiManager by tzapu, tablatronix” tested with version 2.0.11-beta -"Sensirion I2C SGP41" by Sensation Version 0.1.0 -"Sensirion Gas Index Algorithm" by Sensation Version 3.2.1 -"S8_UART" by Josep Comas Version 1.0.1 -“pms” by Markusz Kakl version 1.1.0 (needs to be patched for 5003T model) - -For built instructions and how to patch the PMS library: https://www.airgradient.com/open-airgradient/instructions/diy-open-air-presoldered-v11/ - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - -#include "PMS.h" -#include -#include -#include "s8_uart.h" -#include -#include -#include -#include -#include - -#define DEBUG true - -#define I2C_SDA 7 -#define I2C_SCL 6 - -HTTPClient client; - -SensirionI2CSgp41 sgp41; -VOCGasIndexAlgorithm voc_algorithm; -NOxGasIndexAlgorithm nox_algorithm; - -PMS pms1(Serial0); - -PMS::DATA data1; - -S8_UART * sensor_S8; -S8_sensor sensor; - -// time in seconds needed for NOx conditioning -uint16_t conditioning_s = 10; - -String APIROOT = "http://hw.airgradient.com/"; - -// set to true to switch from Celcius to Fahrenheit -//boolean inF = false; - -// PM2.5 in US AQI (default ug/m3) -//boolean inUSAQI = false; - -// Display Position -//boolean displayTop = true; - -// use RGB LED Bar -//boolean useRGBledBar = true; - -// set to true if you want to connect to wifi. You have 60 seconds to connect. Then it will go into an offline mode. -boolean connectWIFI = true; - -int loopCount = 0; - -unsigned long currentMillis = 0; - -const int oledInterval = 5000; -unsigned long previousOled = 0; - -const int sendToServerInterval = 10000; -unsigned long previoussendToServer = 0; - -const int tvocInterval = 1000; -unsigned long previousTVOC = 0; -int TVOC = -1; -int NOX = -1; - -const int co2Interval = 5000; -unsigned long previousCo2 = 0; -int Co2 = 0; - -const int pmInterval = 5000; -unsigned long previousPm = 0; -int pm25 = -1; -int pm01 = -1; -int pm10 = -1; -//int pm03PCount = -1; -float temp; -int hum; - -//const int tempHumInterval = 2500; -//unsigned long previousTempHum = 0; - - - -void setup() { - if (DEBUG) { - Serial.begin(115200); - // see https://github.com/espressif/arduino-esp32/issues/6983 - Serial.setTxTimeoutMs(0); // <<<====== solves the delay issue - } - - Wire.begin(I2C_SDA, I2C_SCL); - - Serial1.begin(9600, SERIAL_8N1, 0, 1); - Serial0.begin(9600); - - sgp41.begin(Wire); - - //init Watchdog - pinMode(2, OUTPUT); - digitalWrite(2, LOW); - - sensor_S8 = new S8_UART(Serial1); - - delay(500); - - // push button - pinMode(9, INPUT_PULLUP); - - countdown(3); - - if (connectWIFI) { - WiFi.begin("airgradient", "cleanair"); - int retries = 0; - while ((WiFi.status() != WL_CONNECTED) && (retries < 15)) { - retries++; - delay(500); - Serial.print("."); - } -if (retries > 14) { - Serial.println(F("WiFi connection FAILED")); - connectToWifi(); -} -if (WiFi.status() == WL_CONNECTED) { - sendPing(); - Serial.println(F("WiFi connected!")); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); -} - } - -} - -void loop() { - currentMillis = millis(); - updateTVOC(); - updateCo2(); - updatePm(); - sendToServer(); -} - -void updateTVOC() { - uint16_t error; - char errorMessage[256]; - uint16_t defaultRh = 0x8000; - uint16_t defaultT = 0x6666; - uint16_t srawVoc = 0; - uint16_t srawNox = 0; - uint16_t defaultCompenstaionRh = 0x8000; // in ticks as defined by SGP41 - uint16_t defaultCompenstaionT = 0x6666; // in ticks as defined by SGP41 - uint16_t compensationRh = 0; // in ticks as defined by SGP41 - uint16_t compensationT = 0; // in ticks as defined by SGP41 - - delay(1000); - - compensationT = static_cast < uint16_t > ((temp + 45) * 65535 / 175); - compensationRh = static_cast < uint16_t > (hum * 65535 / 100); - - if (conditioning_s > 0) { - error = sgp41.executeConditioning(compensationRh, compensationT, srawVoc); - conditioning_s--; - } else { - error = sgp41.measureRawSignals(compensationRh, compensationT, srawVoc, - srawNox); - } - - if (currentMillis - previousTVOC >= tvocInterval) { -previousTVOC += tvocInterval; -if (error) { - TVOC = -1; - NOX = -1; - //Serial.println(String(TVOC)); -} else { - TVOC = voc_algorithm.process(srawVoc); - NOX = nox_algorithm.process(srawNox); - //Serial.println(String(TVOC)); -} - } -} - -void updateCo2() { - if (currentMillis - previousCo2 >= co2Interval) { - previousCo2 += co2Interval; - Co2 = sensor_S8 -> get_co2(); - //Serial.println(String(Co2)); - } -} - -void updatePm() { - if (currentMillis - previousPm >= pmInterval) { - previousPm += pmInterval; - if (pms1.readUntil(data1, 2000)) { - pm01 = data1.PM_AE_UG_1_0; - pm25 = data1.PM_AE_UG_2_5; - pm10 = data1.PM_AE_UG_10_0; - // pm03PCount = data1.PM_RAW_0_3; - temp = data1.AMB_TMP; - hum = data1.AMB_HUM; - } else { - pm01 = -1; - pm25 = -1; - pm10 = -1; -// pm03PCount = -1; - temp = -10001; - hum = -10001; - } - } -} - - -void sendPing() { - String payload = "{\"wifi\":" + String(WiFi.RSSI()) + - ", \"boot\":" + loopCount + - "}"; -} - - -void sendToServer() { - if (currentMillis - previoussendToServer >= sendToServerInterval) { - previoussendToServer += sendToServerInterval; - String payload = "{\"wifi\":" + String(WiFi.RSSI()) + - (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) + - (pm01 < 0 ? "" : ", \"pm01\":" + String(pm01)) + - (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) + - (pm10 < 0 ? "" : ", \"pm10\":" + String(pm10)) + -// (pm03PCount < 0 ? "" : ", \"pm003_count\":" + String(pm03PCount)) + - (TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC)) + - (NOX < 0 ? "" : ", \"nox_index\":" + String(NOX)) + - ", \"atmp\":" + String(temp/10) + - (hum < 0 ? "" : ", \"rhum\":" + String(hum/10)) + - ", \"boot\":" + loopCount + - "}"; - - if (WiFi.status() == WL_CONNECTED) { - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(getNormalizedMac()) + "/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - //Serial.println(response); - http.end(); - resetWatchdog(); - loopCount++; - } else { - Serial.println("WiFi Disconnected"); - } - } -} - -void countdown(int from) { - debug("\n"); - while (from > 0) { - debug(String(from--)); - debug(" "); - delay(1000); - } - debug("\n"); -} - -void resetWatchdog() { - Serial.println("Watchdog reset"); - digitalWrite(2, HIGH); - delay(20); - digitalWrite(2, LOW); -} - -// Wifi Manager -void connectToWifi() { - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AG-" + String(getNormalizedMac()); - wifiManager.setTimeout(180); - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - Serial.println("failed to connect and hit timeout"); - delay(6000); - } - -} - -void debug(String msg) { - if (DEBUG) - Serial.print(msg); -} - -void debug(int msg) { - if (DEBUG) - Serial.print(msg); -} - -void debugln(String msg) { - if (DEBUG) - Serial.println(msg); -} - -void debugln(int msg) { - if (DEBUG) - Serial.println(msg); -} - -String getNormalizedMac() { - String mac = WiFi.macAddress(); - mac.replace(":", ""); - mac.toLowerCase(); - return mac; -} - - - - diff --git a/examples/DIY_PRO/DIY_PRO.ino b/examples/DIY_PRO/DIY_PRO.ino deleted file mode 100644 index 5d0aaf3..0000000 --- a/examples/DIY_PRO/DIY_PRO.ino +++ /dev/null @@ -1,220 +0,0 @@ -/* -This is the code for the AirGradient DIY PRO Air Quality Sensor with an ESP8266 Microcontroller. - -It is a high quality sensor showing PM2.5, CO2, Temperature and Humidity on a small display and can send data over Wifi. - -Build Instructions: https://www.airgradient.com/open-airgradient/instructions/diy-pro/ - -Kits (including a pre-soldered version) are available: https://www.airgradient.com/open-airgradient/kits/ - -The codes needs the following libraries installed: -“WifiManager by tzapu, tablatronix” tested with version 2.0.11-beta -“U8g2” by oliver tested with version 2.32.15 - -Configuration: -Please set in the code below the configuration parameters. - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - - -#include -#include -#include -#include -#include -#include - -AirGradient ag = AirGradient(); - -// Display bottom right -U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); - -// Replace above if you have display on top left -//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE); - - -// CONFIGURATION START - -//set to the endpoint you would like to use -String APIROOT = "http://hw.airgradient.com/"; - -// set to true to switch from Celcius to Fahrenheit -boolean inF = false; - -// set to true if you want to connect to wifi. You have 60 seconds to connect. Then it will go into an offline mode. -boolean connectWIFI=true; - -// CONFIGURATION END - - -unsigned long currentMillis = 0; - -const int oledInterval = 5000; -unsigned long previousOled = 0; - -const int sendToServerInterval = 10000; -unsigned long previoussendToServer = 0; - -const int co2Interval = 5000; -unsigned long previousCo2 = 0; -int Co2 = 0; - -const int pm25Interval = 5000; -unsigned long previousPm25 = 0; -int pm25 = 0; - -const int tempHumInterval = 2500; -unsigned long previousTempHum = 0; -float temp = 0; -int hum = 0; - -void setup() -{ - Serial.begin(115200); - u8g2.setBusClock(100000); - u8g2.begin(); - updateOLED(); - - if (connectWIFI) { - connectToWifi(); - } - - updateOLED2("Warming up the", "sensors.", ""); - - ag.CO2_Init(); - ag.PMS_Init(); - ag.TMP_RH_Init(0x44); -} - - -void loop() -{ - currentMillis = millis(); - updateOLED(); - updateCo2(); - updatePm25(); - updateTempHum(); - sendToServer(); -} - -void updateCo2() -{ - if (currentMillis - previousCo2 >= co2Interval) { - previousCo2 += co2Interval; - Co2 = ag.getCO2_Raw(); - Serial.println(String(Co2)); - } -} - -void updatePm25() -{ - if (currentMillis - previousPm25 >= pm25Interval) { - previousPm25 += pm25Interval; - pm25 = ag.getPM2_Raw(); - Serial.println(String(pm25)); - } -} - -void updateTempHum() -{ - if (currentMillis - previousTempHum >= tempHumInterval) { - previousTempHum += tempHumInterval; - TMP_RH result = ag.periodicFetchData(); - temp = result.t; - hum = result.rh; - Serial.println(String(temp)); - } -} - -void updateOLED() { - if (currentMillis - previousOled >= oledInterval) { - previousOled += oledInterval; - - String ln3; - String ln1 = "PM:" + String(pm25) + " AQI:" + String(PM_TO_AQI_US(pm25)) ; - String ln2 = "CO2:" + String(Co2); - - if (inF) { - ln3 = "F:" + String((temp* 9 / 5) + 32) + " H:" + String(hum)+"%"; - } else { - ln3 = "C:" + String(temp) + " H:" + String(hum)+"%"; - } - updateOLED2(ln1, ln2, ln3); - } -} - -void updateOLED2(String ln1, String ln2, String ln3) { - char buf[9]; - u8g2.firstPage(); - u8g2.firstPage(); - do { - u8g2.setFont(u8g2_font_t0_16_tf); - u8g2.drawStr(1, 10, String(ln1).c_str()); - u8g2.drawStr(1, 30, String(ln2).c_str()); - u8g2.drawStr(1, 50, String(ln3).c_str()); - } while ( u8g2.nextPage() ); -} - -void sendToServer() { - if (currentMillis - previoussendToServer >= sendToServerInterval) { - previoussendToServer += sendToServerInterval; - - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) - + (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) - + ", \"atmp\":" + String(temp) - + (hum < 0 ? "" : ", \"rhum\":" + String(hum)) - + "}"; - - if(WiFi.status()== WL_CONNECTED){ - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(), HEX) + "/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - } - else { - Serial.println("WiFi Disconnected"); - } - } -} - -// Wifi Manager - void connectToWifi() { - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AG-" + String(ESP.getChipId(), HEX); - updateOLED2("60s to connect", "to Wifi Hotspot", HOTSPOT); - wifiManager.setTimeout(60); - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - updateOLED2("booting into", "offline mode", ""); - Serial.println("failed to connect and hit timeout"); - delay(6000); - } -} - -// Calculate PM2.5 US AQI -int PM_TO_AQI_US(int pm02) { - if (pm02 <= 12.0) return ((50 - 0) / (12.0 - .0) * (pm02 - .0) + 0); - else if (pm02 <= 35.4) return ((100 - 50) / (35.4 - 12.0) * (pm02 - 12.0) + 50); - else if (pm02 <= 55.4) return ((150 - 100) / (55.4 - 35.4) * (pm02 - 35.4) + 100); - else if (pm02 <= 150.4) return ((200 - 150) / (150.4 - 55.4) * (pm02 - 55.4) + 150); - else if (pm02 <= 250.4) return ((300 - 200) / (250.4 - 150.4) * (pm02 - 150.4) + 200); - else if (pm02 <= 350.4) return ((400 - 300) / (350.4 - 250.4) * (pm02 - 250.4) + 300); - else if (pm02 <= 500.4) return ((500 - 400) / (500.4 - 350.4) * (pm02 - 350.4) + 400); - else return 500; -}; diff --git a/examples/DIY_PRO_V3_7/DIY_PRO_V3_7.ino b/examples/DIY_PRO_V3_7/DIY_PRO_V3_7.ino deleted file mode 100644 index 2f7ba68..0000000 --- a/examples/DIY_PRO_V3_7/DIY_PRO_V3_7.ino +++ /dev/null @@ -1,424 +0,0 @@ -/* -Important: This code is only for the DIY PRO PCB Version 3.7 that has a push button mounted. - -This is the code for the AirGradient DIY PRO Air Quality Sensor with an ESP8266 Microcontroller with the SGP40 TVOC module from AirGradient. - -It is a high quality sensor showing PM2.5, CO2, Temperature and Humidity on a small display and can send data over Wifi. - -Build Instructions: https://www.airgradient.com/open-airgradient/instructions/diy-pro-v37/ - -Kits (including a pre-soldered version) are available: https://www.airgradient.com/open-airgradient/kits/ - -The codes needs the following libraries installed: -“WifiManager by tzapu, tablatronix” tested with version 2.0.11-beta -“U8g2” by oliver tested with version 2.32.15 -"Sensirion I2C SGP41" by Sensation Version 0.1.0 -"Sensirion Gas Index Algorithm" by Sensation Version 3.2.1 - -Configuration: -Please set in the code below the configuration parameters. - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - - -#include -#include -#include -#include -#include - -#include - -//#include "SGP30.h" -#include -#include -#include - - -#include - -AirGradient ag = AirGradient(); -SensirionI2CSgp41 sgp41; -VOCGasIndexAlgorithm voc_algorithm; -NOxGasIndexAlgorithm nox_algorithm; -// time in seconds needed for NOx conditioning -uint16_t conditioning_s = 10; - -// for peristent saving and loading -int addr = 4; -byte value; - -// Display bottom right -U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); - -// Replace above if you have display on top left -//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE); - - -// CONFIGURATION START - -//set to the endpoint you would like to use -String APIROOT = "http://hw.airgradient.com/"; - -// set to true to switch from Celcius to Fahrenheit -boolean inF = false; - -// PM2.5 in US AQI (default ug/m3) -boolean inUSAQI = false; - -// Display Position -boolean displayTop = true; - -// set to true if you want to connect to wifi. You have 60 seconds to connect. Then it will go into an offline mode. -boolean connectWIFI=true; - -// CONFIGURATION END - - -unsigned long currentMillis = 0; - -const int oledInterval = 5000; -unsigned long previousOled = 0; - -const int sendToServerInterval = 10000; -unsigned long previoussendToServer = 0; - -const int tvocInterval = 1000; -unsigned long previousTVOC = 0; -int TVOC = 0; -int NOX = 0; - -const int co2Interval = 5000; -unsigned long previousCo2 = 0; -int Co2 = 0; - -const int pm25Interval = 5000; -unsigned long previousPm25 = 0; -int pm25 = 0; - -const int tempHumInterval = 2500; -unsigned long previousTempHum = 0; -float temp = 0; -int hum = 0; - -int buttonConfig=4; -int lastState = LOW; -int currentState; -unsigned long pressedTime = 0; -unsigned long releasedTime = 0; - -void setup() { - Serial.begin(115200); - Serial.println("Hello"); - u8g2.begin(); - //u8g2.setDisplayRotation(U8G2_R0); - - EEPROM.begin(512); - delay(500); - - buttonConfig = String(EEPROM.read(addr)).toInt(); - setConfig(); - - updateOLED2("Press Button", "Now for", "Config Menu"); - delay(2000); - - currentState = digitalRead(D7); - if (currentState == HIGH) - { - updateOLED2("Entering", "Config Menu", ""); - delay(3000); - lastState = LOW; - inConf(); - } - - if (connectWIFI) - { - connectToWifi(); - } - - updateOLED2("Warming Up", "Serial Number:", String(ESP.getChipId(), HEX)); - sgp41.begin(Wire); - ag.CO2_Init(); - ag.PMS_Init(); - ag.TMP_RH_Init(0x44); -} - -void loop() { - currentMillis = millis(); - updateTVOC(); - updateOLED(); - updateCo2(); - updatePm25(); - updateTempHum(); - sendToServer(); -} - -void inConf(){ - setConfig(); - currentState = digitalRead(D7); - - if(lastState == LOW && currentState == HIGH) { - pressedTime = millis(); - } - - else if(lastState == HIGH && currentState == LOW) { - releasedTime = millis(); - long pressDuration = releasedTime - pressedTime; - if( pressDuration < 1000 ) { - buttonConfig=buttonConfig+1; - if (buttonConfig>7) buttonConfig=0; - } - } - - if (lastState == HIGH && currentState == HIGH){ - long passedDuration = millis() - pressedTime; - if( passedDuration > 4000 ) { - // to do -// if (buttonConfig==4) { -// updateOLED2("Saved", "Release", "Button Now"); -// delay(1000); -// updateOLED2("Starting", "CO2", "Calibration"); -// delay(1000); -// Co2Calibration(); -// } else { - updateOLED2("Saved", "Release", "Button Now"); - delay(1000); - updateOLED2("Rebooting", "in", "5 seconds"); - delay(5000); - EEPROM.write(addr, char(buttonConfig)); - EEPROM.commit(); - delay(1000); - ESP.restart(); - // } - } - - } - lastState = currentState; - delay(100); - inConf(); -} - - -void setConfig() { - if (buttonConfig == 0) { - updateOLED2("Temp. in C", "PM in ug/m3", "Display Top"); - u8g2.setDisplayRotation(U8G2_R2); - inF = false; - inUSAQI = false; - } - if (buttonConfig == 1) { - updateOLED2("Temp. in C", "PM in US AQI", "Display Top"); - u8g2.setDisplayRotation(U8G2_R2); - inF = false; - inUSAQI = true; - } - if (buttonConfig == 2) { - updateOLED2("Temp. in F", "PM in ug/m3", "Display Top"); - u8g2.setDisplayRotation(U8G2_R2); - inF = true; - inUSAQI = false; - } - if (buttonConfig == 3) { - updateOLED2("Temp. in F", "PM in US AQI", "Display Top"); - u8g2.setDisplayRotation(U8G2_R2); - inF = true; - inUSAQI = true; - } - if (buttonConfig == 4) { - updateOLED2("Temp. in C", "PM in ug/m3", "Display Bottom"); - u8g2.setDisplayRotation(U8G2_R0); - inF = false; - inUSAQI = false; - } - if (buttonConfig == 5) { - updateOLED2("Temp. in C", "PM in US AQI", "Display Bottom"); - u8g2.setDisplayRotation(U8G2_R0); - inF = false; - inUSAQI = true; - } - if (buttonConfig == 6) { - updateOLED2("Temp. in F", "PM in ug/m3", "Display Bottom"); - u8g2.setDisplayRotation(U8G2_R0); - inF = true; - inUSAQI = false; - } - if (buttonConfig == 7) { - updateOLED2("Temp. in F", "PM in US AQI", "Display Bottom"); - u8g2.setDisplayRotation(U8G2_R0); - inF = true; - inUSAQI = true; - } - - - - // to do - // if (buttonConfig == 8) { - // updateOLED2("CO2", "Manual", "Calibration"); - // } -} - -void updateTVOC() -{ - uint16_t error; - char errorMessage[256]; - uint16_t defaultRh = 0x8000; - uint16_t defaultT = 0x6666; - uint16_t srawVoc = 0; - uint16_t srawNox = 0; - uint16_t defaultCompenstaionRh = 0x8000; // in ticks as defined by SGP41 - uint16_t defaultCompenstaionT = 0x6666; // in ticks as defined by SGP41 - uint16_t compensationRh = 0; // in ticks as defined by SGP41 - uint16_t compensationT = 0; // in ticks as defined by SGP41 - - delay(1000); - - compensationT = static_cast((temp + 45) * 65535 / 175); - compensationRh = static_cast(hum * 65535 / 100); - - if (conditioning_s > 0) { - error = sgp41.executeConditioning(compensationRh, compensationT, srawVoc); - conditioning_s--; - } else { - error = sgp41.measureRawSignals(compensationRh, compensationT, srawVoc, - srawNox); - } - - if (currentMillis - previousTVOC >= tvocInterval) { - previousTVOC += tvocInterval; - TVOC = voc_algorithm.process(srawVoc); - NOX = nox_algorithm.process(srawNox); - Serial.println(String(TVOC)); - } -} - -void updateCo2() -{ - if (currentMillis - previousCo2 >= co2Interval) { - previousCo2 += co2Interval; - Co2 = ag.getCO2_Raw(); - Serial.println(String(Co2)); - } -} - -void updatePm25() -{ - if (currentMillis - previousPm25 >= pm25Interval) { - previousPm25 += pm25Interval; - pm25 = ag.getPM2_Raw(); - Serial.println(String(pm25)); - } -} - -void updateTempHum() -{ - if (currentMillis - previousTempHum >= tempHumInterval) { - previousTempHum += tempHumInterval; - TMP_RH result = ag.periodicFetchData(); - temp = result.t; - hum = result.rh; - Serial.println(String(temp)); - } -} - -void updateOLED() { - if (currentMillis - previousOled >= oledInterval) { - previousOled += oledInterval; - - String ln3; - String ln1; - - if (inUSAQI) { - ln1 = "AQI:" + String(PM_TO_AQI_US(pm25)) + " CO2:" + String(Co2); - } else { - ln1 = "PM:" + String(pm25) + " CO2:" + String(Co2); - } - - String ln2 = "TVOC:" + String(TVOC) + " NOX:" + String(NOX); - - if (inF) { - ln3 = "F:" + String((temp* 9 / 5) + 32) + " H:" + String(hum)+"%"; - } else { - ln3 = "C:" + String(temp) + " H:" + String(hum)+"%"; - } - updateOLED2(ln1, ln2, ln3); - } -} - -void updateOLED2(String ln1, String ln2, String ln3) { - char buf[9]; - u8g2.firstPage(); - u8g2.firstPage(); - do { - u8g2.setFont(u8g2_font_t0_16_tf); - u8g2.drawStr(1, 10, String(ln1).c_str()); - u8g2.drawStr(1, 30, String(ln2).c_str()); - u8g2.drawStr(1, 50, String(ln3).c_str()); - } while ( u8g2.nextPage() ); -} - -void sendToServer() { - if (currentMillis - previoussendToServer >= sendToServerInterval) { - previoussendToServer += sendToServerInterval; - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) - + (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) - + (TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC)) - + (NOX < 0 ? "" : ", \"nox_index\":" + String(NOX)) - + ", \"atmp\":" + String(temp) - + (hum < 0 ? "" : ", \"rhum\":" + String(hum)) - + "}"; - - if(WiFi.status()== WL_CONNECTED){ - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(), HEX) + "/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - } - else { - Serial.println("WiFi Disconnected"); - } - } -} - -// Wifi Manager - void connectToWifi() { - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AG-" + String(ESP.getChipId(), HEX); - updateOLED2("90s to connect", "to Wifi Hotspot", HOTSPOT); - wifiManager.setTimeout(90); - - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - updateOLED2("booting into", "offline mode", ""); - Serial.println("failed to connect and hit timeout"); - delay(6000); - } - -} - -// Calculate PM2.5 US AQI -int PM_TO_AQI_US(int pm02) { - if (pm02 <= 12.0) return ((50 - 0) / (12.0 - .0) * (pm02 - .0) + 0); - else if (pm02 <= 35.4) return ((100 - 50) / (35.4 - 12.0) * (pm02 - 12.0) + 50); - else if (pm02 <= 55.4) return ((150 - 100) / (55.4 - 35.4) * (pm02 - 35.4) + 100); - else if (pm02 <= 150.4) return ((200 - 150) / (150.4 - 55.4) * (pm02 - 55.4) + 150); - else if (pm02 <= 250.4) return ((300 - 200) / (250.4 - 150.4) * (pm02 - 150.4) + 200); - else if (pm02 <= 350.4) return ((400 - 300) / (350.4 - 250.4) * (pm02 - 250.4) + 300); - else if (pm02 <= 500.4) return ((500 - 400) / (500.4 - 350.4) * (pm02 - 350.4) + 400); - else return 500; -}; diff --git a/examples/DIY_PRO_V4_2/DIY_PRO_V4_2.ino b/examples/DIY_PRO_V4_2/DIY_PRO_V4_2.ino deleted file mode 100644 index 6f20e7a..0000000 --- a/examples/DIY_PRO_V4_2/DIY_PRO_V4_2.ino +++ /dev/null @@ -1,433 +0,0 @@ -/* -Important: This code is only for the DIY PRO PCB Version 4.2 that has a push button mounted. - -This is the code for the AirGradient DIY PRO Air Quality Sensor with an ESP8266 Microcontroller with the SGP40 TVOC module from AirGradient. - -It is a high quality sensor showing PM2.5, CO2, Temperature and Humidity on a small display and can send data over Wifi. - -Build Instructions: https://www.airgradient.com/open-airgradient/instructions/diy-pro-v42/ - -Kits (including a pre-soldered version) are available: https://www.airgradient.com/open-airgradient/kits/ - -The codes needs the following libraries installed: -“WifiManager by tzapu, tablatronix” tested with version 2.0.11-beta -“U8g2” by oliver tested with version 2.32.15 -"Sensirion I2C SGP41" by Sensation Version 0.1.0 -"Sensirion Gas Index Algorithm" by Sensation Version 3.2.1 -"Arduino-SHT" by Johannes Winkelmann Version 1.2.2 - -Configuration: -Please set in the code below the configuration parameters. - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - - -#include -#include -#include -#include -#include - -#include -#include "SHTSensor.h" - -//#include "SGP30.h" -#include -#include -#include - - -#include - -AirGradient ag = AirGradient(); -SensirionI2CSgp41 sgp41; -VOCGasIndexAlgorithm voc_algorithm; -NOxGasIndexAlgorithm nox_algorithm; -SHTSensor sht; - -// time in seconds needed for NOx conditioning -uint16_t conditioning_s = 10; - -// for peristent saving and loading -int addr = 4; -byte value; - -// Display bottom right -U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); - -// Replace above if you have display on top left -//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE); - - -// CONFIGURATION START - -//set to the endpoint you would like to use -String APIROOT = "http://hw.airgradient.com/"; - -// set to true to switch from Celcius to Fahrenheit -boolean inF = false; - -// PM2.5 in US AQI (default ug/m3) -boolean inUSAQI = false; - -// Display Position -boolean displayTop = true; - -// set to true if you want to connect to wifi. You have 60 seconds to connect. Then it will go into an offline mode. -boolean connectWIFI=true; - -// CONFIGURATION END - - -unsigned long currentMillis = 0; - -const int oledInterval = 5000; -unsigned long previousOled = 0; - -const int sendToServerInterval = 10000; -unsigned long previoussendToServer = 0; - -const int tvocInterval = 1000; -unsigned long previousTVOC = 0; -int TVOC = 0; -int NOX = 0; - -const int co2Interval = 5000; -unsigned long previousCo2 = 0; -int Co2 = 0; - -const int pmInterval = 5000; -unsigned long previousPm = 0; -int pm25 = 0; -int pm01 = 0; -int pm10 = 0; -int pm03PCount = 0; - -const int tempHumInterval = 2500; -unsigned long previousTempHum = 0; -float temp = 0; -int hum = 0; - -int buttonConfig=0; -int lastState = LOW; -int currentState; -unsigned long pressedTime = 0; -unsigned long releasedTime = 0; - -void setup() { - Serial.begin(115200); - Serial.println("Hello"); - u8g2.begin(); - sht.init(); - sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); - //u8g2.setDisplayRotation(U8G2_R0); - - EEPROM.begin(512); - delay(500); - - buttonConfig = String(EEPROM.read(addr)).toInt(); - if (buttonConfig>3) buttonConfig=0; - delay(400); - setConfig(); - Serial.println("buttonConfig: "+String(buttonConfig)); - updateOLED2("Press Button", "Now for", "Config Menu"); - delay(2000); - pinMode(D7, INPUT_PULLUP); - currentState = digitalRead(D7); - if (currentState == LOW) - { - updateOLED2("Entering", "Config Menu", ""); - delay(3000); - lastState = HIGH; - setConfig(); - inConf(); - } - - if (connectWIFI) - { - connectToWifi(); - } - - updateOLED2("Warming Up", "Serial Number:", String(ESP.getChipId(), HEX)); - sgp41.begin(Wire); - ag.CO2_Init(); - ag.PMS_Init(); - ag.TMP_RH_Init(0x44); -} - -void loop() { - currentMillis = millis(); - updateTVOC(); - updateOLED(); - updateCo2(); - updatePm(); - updateTempHum(); - sendToServer(); -} - -void inConf(){ - setConfig(); - currentState = digitalRead(D7); - - if (currentState){ - Serial.println("currentState: high"); - } else { - Serial.println("currentState: low"); - } - - if(lastState == HIGH && currentState == LOW) { - pressedTime = millis(); - } - - else if(lastState == LOW && currentState == HIGH) { - releasedTime = millis(); - long pressDuration = releasedTime - pressedTime; - if( pressDuration < 1000 ) { - buttonConfig=buttonConfig+1; - if (buttonConfig>3) buttonConfig=0; - } - } - - if (lastState == LOW && currentState == LOW){ - long passedDuration = millis() - pressedTime; - if( passedDuration > 4000 ) { - // to do -// if (buttonConfig==4) { -// updateOLED2("Saved", "Release", "Button Now"); -// delay(1000); -// updateOLED2("Starting", "CO2", "Calibration"); -// delay(1000); -// Co2Calibration(); -// } else { - updateOLED2("Saved", "Release", "Button Now"); - delay(1000); - updateOLED2("Rebooting", "in", "5 seconds"); - delay(5000); - EEPROM.write(addr, char(buttonConfig)); - EEPROM.commit(); - delay(1000); - ESP.restart(); - // } - } - - } - lastState = currentState; - delay(100); - inConf(); -} - - -void setConfig() { - if (buttonConfig == 0) { - updateOLED2("Temp. in C", "PM in ug/m3", "Long Press Saves"); - u8g2.setDisplayRotation(U8G2_R0); - inF = false; - inUSAQI = false; - } - if (buttonConfig == 1) { - updateOLED2("Temp. in C", "PM in US AQI", "Long Press Saves"); - u8g2.setDisplayRotation(U8G2_R0); - inF = false; - inUSAQI = true; - } else if (buttonConfig == 2) { - updateOLED2("Temp. in F", "PM in ug/m3", "Long Press Saves"); - u8g2.setDisplayRotation(U8G2_R0); - inF = true; - inUSAQI = false; - } else if (buttonConfig == 3) { - updateOLED2("Temp. in F", "PM in US AQI", "Long Press Saves"); - u8g2.setDisplayRotation(U8G2_R0); - inF = true; - inUSAQI = true; - } - - - - // to do - // if (buttonConfig == 8) { - // updateOLED2("CO2", "Manual", "Calibration"); - // } -} - -void updateTVOC() -{ - uint16_t error; - char errorMessage[256]; - uint16_t defaultRh = 0x8000; - uint16_t defaultT = 0x6666; - uint16_t srawVoc = 0; - uint16_t srawNox = 0; - uint16_t defaultCompenstaionRh = 0x8000; // in ticks as defined by SGP41 - uint16_t defaultCompenstaionT = 0x6666; // in ticks as defined by SGP41 - uint16_t compensationRh = 0; // in ticks as defined by SGP41 - uint16_t compensationT = 0; // in ticks as defined by SGP41 - - delay(1000); - - compensationT = static_cast((temp + 45) * 65535 / 175); - compensationRh = static_cast(hum * 65535 / 100); - - if (conditioning_s > 0) { - error = sgp41.executeConditioning(compensationRh, compensationT, srawVoc); - conditioning_s--; - } else { - error = sgp41.measureRawSignals(compensationRh, compensationT, srawVoc, - srawNox); - } - - if (currentMillis - previousTVOC >= tvocInterval) { - previousTVOC += tvocInterval; - TVOC = voc_algorithm.process(srawVoc); - NOX = nox_algorithm.process(srawNox); - Serial.println(String(TVOC)); - } -} - -void updateCo2() -{ - if (currentMillis - previousCo2 >= co2Interval) { - previousCo2 += co2Interval; - Co2 = ag.getCO2_Raw(); - Serial.println(String(Co2)); - } -} - -void updatePm() -{ - if (currentMillis - previousPm >= pmInterval) { - previousPm += pmInterval; - pm01 = ag.getPM1_Raw(); - pm25 = ag.getPM2_Raw(); - pm10 = ag.getPM10_Raw(); - pm03PCount = ag.getPM0_3Count(); - Serial.println(String(pm25)); - } -} - -void updateTempHum() -{ - if (currentMillis - previousTempHum >= tempHumInterval) { - previousTempHum += tempHumInterval; - - if (sht.readSample()) { - Serial.print("SHT:\n"); - Serial.print(" RH: "); - Serial.print(sht.getHumidity(), 2); - Serial.print("\n"); - Serial.print(" T: "); - Serial.print(sht.getTemperature(), 2); - Serial.print("\n"); - temp = sht.getTemperature(); - hum = sht.getHumidity(); - } else { - Serial.print("Error in readSample()\n"); - } - Serial.println(String(temp)); - } -} - -void updateOLED() { - if (currentMillis - previousOled >= oledInterval) { - previousOled += oledInterval; - - String ln3; - String ln1; - - if (inUSAQI) { - ln1 = "AQI:" + String(PM_TO_AQI_US(pm25)) + " CO2:" + String(Co2); - } else { - ln1 = "PM:" + String(pm25) + " CO2:" + String(Co2); - } - - String ln2 = "TVOC:" + String(TVOC) + " NOX:" + String(NOX); - - if (inF) { - ln3 = "F:" + String((temp* 9 / 5) + 32) + " H:" + String(hum)+"%"; - } else { - ln3 = "C:" + String(temp) + " H:" + String(hum)+"%"; - } - updateOLED2(ln1, ln2, ln3); - } -} - -void updateOLED2(String ln1, String ln2, String ln3) { - char buf[9]; - u8g2.firstPage(); - u8g2.firstPage(); - do { - u8g2.setFont(u8g2_font_t0_16_tf); - u8g2.drawStr(1, 10, String(ln1).c_str()); - u8g2.drawStr(1, 30, String(ln2).c_str()); - u8g2.drawStr(1, 50, String(ln3).c_str()); - } while ( u8g2.nextPage() ); -} - -void sendToServer() { - if (currentMillis - previoussendToServer >= sendToServerInterval) { - previoussendToServer += sendToServerInterval; - String payload = "{\"wifi\":" + String(WiFi.RSSI()) - + (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) - + (pm01 < 0 ? "" : ", \"pm01\":" + String(pm01)) - + (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) - + (pm10 < 0 ? "" : ", \"pm10\":" + String(pm10)) - + (pm03PCount < 0 ? "" : ", \"pm003_count\":" + String(pm03PCount)) - + (TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC)) - + (NOX < 0 ? "" : ", \"nox_index\":" + String(NOX)) - + ", \"atmp\":" + String(temp) - + (hum < 0 ? "" : ", \"rhum\":" + String(hum)) - + "}"; - - if(WiFi.status()== WL_CONNECTED){ - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(), HEX) + "/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - } - else { - Serial.println("WiFi Disconnected"); - } - } -} - -// Wifi Manager - void connectToWifi() { - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AG-" + String(ESP.getChipId(), HEX); - updateOLED2("90s to connect", "to Wifi Hotspot", HOTSPOT); - wifiManager.setTimeout(90); - - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - updateOLED2("booting into", "offline mode", ""); - Serial.println("failed to connect and hit timeout"); - delay(6000); - } - -} - -// Calculate PM2.5 US AQI -int PM_TO_AQI_US(int pm02) { - if (pm02 <= 12.0) return ((50 - 0) / (12.0 - .0) * (pm02 - .0) + 0); - else if (pm02 <= 35.4) return ((100 - 50) / (35.4 - 12.0) * (pm02 - 12.0) + 50); - else if (pm02 <= 55.4) return ((150 - 100) / (55.4 - 35.4) * (pm02 - 35.4) + 100); - else if (pm02 <= 150.4) return ((200 - 150) / (150.4 - 55.4) * (pm02 - 55.4) + 150); - else if (pm02 <= 250.4) return ((300 - 200) / (250.4 - 150.4) * (pm02 - 150.4) + 200); - else if (pm02 <= 350.4) return ((400 - 300) / (350.4 - 250.4) * (pm02 - 250.4) + 300); - else if (pm02 <= 500.4) return ((500 - 400) / (500.4 - 350.4) * (pm02 - 350.4) + 400); - else return 500; -}; diff --git a/examples/MINI_DISPLAY/MINI_DISPLAY.ino b/examples/MINI_DISPLAY/MINI_DISPLAY.ino deleted file mode 100644 index 46cd7e9..0000000 --- a/examples/MINI_DISPLAY/MINI_DISPLAY.ino +++ /dev/null @@ -1,380 +0,0 @@ -/* -This is the code for the AirGradient DIY Mini Display with an ESP8266 Microcontroller. -It can be configures to show the outside air quality as well as one indoor location from the AirGradient platform. - -For build instructions please visit - -https://www.airgradient.com/open-airgradient/blog/airgradient-diy-display/ - -The codes needs the following libraries installed: -"WifiManager by tzapu, tablatronix" tested with Version 2.0.5-alpha -"Adafruit_ILI9341" tested with Version 1.5.10 -"Adafruit GFX library" tested with Version 1.10.12 (often automatically installed with above ILI9341 library) -"ArduinoJSON" by Benoit Blanchon tested with Version 5.13.5 - -Configuration: -Please set in the code below (line 90-) if you want to display the PM2.5 values in US AQI and temperature in F. - -If you have any questions please visit our forum at https://forum.airgradient.com/ - - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License -*/ - -#include - -#include - -#include - -#include - -#include - -#include - -#include - -#include - -#include - -#define TFT_CS D0 -#define TFT_DC D8 -#define TFT_RST - 1 -#define TS_CS D3 - -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); - -const char * locNameInside; -const char * locNameOutside; - -const char * place_timezone; -const char * location; -bool outdoor_offline; -bool indoor_offline; -const char * outdoor_policy; -const char * outdoor_date; -const char * indoor_date; -boolean prodMode = true; - -String deviceID; -const char * timex; -int pm02; -int pi02; -int pi02_outside; -int rco2; -float atmp; -float atmp_outside; -int rhum_outside; -int rhum; -int heat; - -const char * pi02_color; -const char * pi02_color_outside; -const char * pi02_category; -const char * pm02_color; -const char * pm02_category; -const char * rco2_color; -const char * rco2_category; -const char * heat_color; -const char * heat_color_outside; -const char * heat_category; - -// Configuration -#define API_ROOT "http://hw.airgradient.com/displays/" -boolean inUSaqi = false; -boolean inF = false; - -String getDeviceId() { - return String(ESP.getChipId(), HEX); -} - -void setup() { - Serial.begin(115200); - Serial.println("Chip ID"); - Serial.println(String(ESP.getChipId(), HEX)); - - tft.begin(); - tft.setRotation(2); - while (!Serial && (millis() <= 1000)); - welcomeMessage(); - connectToWifi(); - - Serial.print("Connecting"); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(); - - tft.fillScreen(ILI9341_BLACK); - delay(2000); -} - -void loop() { - - WiFiClient client; - HTTPClient http; - http.begin(client, API_ROOT + getDeviceId()); - - int httpCode = http.GET(); - if (httpCode == 200) { - String airData = http.getString(); - payloadToDataInside(airData); - Serial.print("airData1 : "); - Serial.println(airData); - } else { - Serial.println("error"); - Serial.println(httpCode); - } - http.end(); - - delay(1000); - updateDisplay(); - - delay(120000); - tft.fillScreen(ILI9341_BLACK); - tft.setTextColor(ILI9341_WHITE); - tft.setFont( & FreeSans12pt7b); - tft.setCursor(5, 20); - tft.println("requesting data..."); -} - -void payloadToDataInside(String payload) { - const size_t capacity = JSON_ARRAY_SIZE(1) + 2 * JSON_OBJECT_SIZE(2) + 2 * JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(10) + JSON_OBJECT_SIZE(13) + 530; - DynamicJsonBuffer jsonBuffer(capacity); - JsonObject & root = jsonBuffer.parseObject(payload); - location = root["place"]["name"]; - place_timezone = root["place"]["timezone"]; - JsonObject & outdoor = root["outdoor"]; - locNameOutside = outdoor["name"]; - outdoor_offline = outdoor["offline"]; - outdoor_policy = outdoor["guidelines"][0]["title"]; - JsonObject & outdoor_current = outdoor["current"]; - - atmp_outside = outdoor_current["atmp"]; - rhum_outside = outdoor_current["rhum"]; - outdoor_date = outdoor_current["date"]; - JsonObject & indoor = root["indoor"]; - locNameInside = indoor["name"]; - indoor_offline = indoor["offline"]; - JsonObject & indoor_current = indoor["current"]; - - atmp = indoor_current["atmp"]; - rhum = indoor_current["rhum"]; - rco2 = indoor_current["rco2"]; - indoor_date = indoor_current["date"]; - rco2_color = indoor_current["rco2_clr"]; - rco2_category = indoor_current["rco2_lbl"]; - - if (inUSaqi) { - pi02_outside = outdoor_current["pi02"]; - pi02_color_outside = outdoor_current["pi02_clr"]; - pi02_category = outdoor_current["pi02_lbl"]; - pi02 = indoor_current["pi02"]; - pi02_color = indoor_current["pi02_clr"]; - pi02_category = indoor_current["pi02_lbl"]; - } else { - pi02_outside = outdoor_current["pm02"]; - pi02_color_outside = outdoor_current["pm02_clr"]; - pi02_category = outdoor_current["pm02_lbl"]; - pi02 = indoor_current["pm02"]; - pi02_color = indoor_current["pm02_clr"]; - pi02_category = indoor_current["pm02_lbl"]; - } - -} - -void updateDisplay() { - int y = 25; - int boxHeight = 75; - int boxWidth = 110; - int radius = 8; - tft.fillScreen(ILI9341_BLACK); - - tft.setFont( & FreeSans9pt7b); - tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); - tft.setCursor(5, y); - tft.println(location); - - tft.drawLine(0, 35, 250, 35, ILI9341_WHITE); - - y = y + 50; - - tft.setFont( & FreeSans9pt7b); - tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); - tft.setCursor(5, y); - tft.println(locNameOutside); - tft.setFont( & FreeSans12pt7b); - - y = y + 12; - - if (String(pi02_color_outside) == "green") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_GREEN); - } else if (String(pi02_color_outside) == "yellow") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_YELLOW); - } else if (String(pi02_color_outside) == "orange") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_ORANGE); - } else if (String(pi02_color_outside) == "red") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_RED); - } else if (String(pi02_color_outside) == "purple") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_PURPLE); - } else if (String(pi02_color_outside) == "brown") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_MAROON); - } - - if (String(heat_color_outside) == "green") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_GREEN); - } else if (String(heat_color_outside) == "yellow") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_YELLOW); - } else if (String(heat_color_outside) == "orange") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_ORANGE); - } else if (String(heat_color_outside) == "red") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_RED); - } else if (String(heat_color_outside) == "purple") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_PURPLE); - } else if (String(heat_color_outside) == "brown") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_MAROON); - } - - tft.setFont( & FreeSans9pt7b); - tft.setTextColor(ILI9341_BLACK, ILI9341_BLACK); - tft.setCursor(20, y + boxHeight - 10); - - if (inUSaqi) { - tft.println("US AQI"); - } else { - tft.println("ug/m3"); - } - - tft.setFont( & FreeSans18pt7b); - tft.setTextColor(ILI9341_BLACK, ILI9341_BLACK); - tft.setCursor(20, y + 40); - tft.println(String(pi02_outside)); - - tft.setFont( & FreeSans9pt7b); - - tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); - - tft.setCursor(20 + boxWidth + 10, y + 20); - - if (inF) { - tft.println(String((atmp_outside * 9 / 5) + 32) + "F"); - } else { - tft.println(String(atmp_outside) + "C"); - } - - tft.setCursor(20 + boxWidth + 10, y + 40); - tft.println(String(rhum_outside) + "%"); - - tft.setTextColor(ILI9341_DARKGREY, ILI9341_BLACK); - tft.setCursor(20 + boxWidth + 10, y + 60); - tft.println(String(outdoor_date)); - - //inside - - y = y + 110; - - tft.setFont( & FreeSans9pt7b); - tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); - tft.setCursor(5, y); - tft.println(locNameInside); - tft.setFont( & FreeSans12pt7b); - - y = y + 12; - - if (String(pi02_color) == "green") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_GREEN); - } else if (String(pi02_color) == "yellow") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_YELLOW); - } else if (String(pi02_color) == "orange") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_ORANGE); - } else if (String(pi02_color) == "red") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_RED); - } else if (String(pi02_color) == "purple") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_PURPLE); - } else if (String(pi02_color) == "brown") { - tft.fillRoundRect(5, y, boxWidth, boxHeight, radius, ILI9341_MAROON); - } - - if (String(rco2_color) == "green") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_GREEN); - } else if (String(rco2_color) == "yellow") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_YELLOW); - } else if (String(rco2_color) == "orange") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_ORANGE); - } else if (String(rco2_color) == "red") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_RED); - } else if (String(rco2_color) == "purple") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_PURPLE); - } else if (String(rco2_color) == "brown") { - tft.fillRoundRect(5 + boxWidth + 10, y, boxWidth, boxHeight, radius, ILI9341_MAROON); - } - - tft.setFont( & FreeSans9pt7b); - tft.setTextColor(ILI9341_BLACK, ILI9341_BLACK); - tft.setCursor(20, y + boxHeight - 10); - - if (inUSaqi) { - tft.println("US AQI"); - } else { - tft.println("ug/m3"); - } - - tft.setCursor(20 + boxWidth + 10, y + boxHeight - 10); - tft.println("CO2 ppm"); - - tft.setFont( & FreeSans18pt7b); - tft.setTextColor(ILI9341_BLACK, ILI9341_BLACK); - tft.setCursor(20, y + 40); - tft.println(String(pi02)); - tft.setCursor(20 + boxWidth + 10, y + 40); - tft.println(String(rco2)); - - y = y + 100; - - tft.setFont( & FreeSans9pt7b); - tft.setTextColor(ILI9341_DARKGREY, ILI9341_BLACK); - tft.setCursor(boxWidth - 30, y); - tft.println(String(indoor_date)); -} - -void welcomeMessage() { - Serial.println("Welcome Message 2"); - tft.setFont( & FreeSans9pt7b); - tft.fillScreen(ILI9341_BLACK); - tft.setTextColor(ILI9341_WHITE); - - tft.setCursor(40, 24); - tft.setFont( & FreeSans12pt7b); - tft.setCursor(5, 20); - tft.println("AirGradient"); - - tft.setFont( & FreeSans9pt7b); - tft.setCursor(5, 100); - tft.println("id: " + String(ESP.getChipId(), HEX)); - - tft.setCursor(5, 140); - tft.println("connecting ..."); - - delay(2000); -} - -void connectToWifi() { - delay(2000); - - WiFiManager wifiManager; - //chWiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AIRGRADIENT-DISPLAY-" + String(ESP.getChipId(), HEX); - wifiManager.setTimeout(120); - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - Serial.println("failed to connect and hit timeout"); - delay(3000); - ESP.restart(); - delay(5000); - } -} diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino new file mode 100644 index 0000000..979f31f --- /dev/null +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -0,0 +1,1212 @@ +/* +This is the code for the AirGradient ONE open-source hardware indoor Air Quality Monitor with an ESP32-C3 Microcontroller. + +It is an air quality monitor for PM2.5, CO2, TVOCs, NOx, Temperature and Humidity with a small display, an RGB led bar and can send data over Wifi. + +Open source air quality monitors and kits are available: +Indoor Monitor: https://www.airgradient.com/indoor/ +Outdoor Monitor: https://www.airgradient.com/outdoor/ + +Build Instructions: https://www.airgradient.com/documentation/one-v9/ + +The codes needs the following libraries installed: +“WifiManager by tzapu, tablatronix” tested with version 2.0.16-rc.2 +"Arduino_JSON" by Arduino version 0.2.0 +"U8g2" by oliver version 2.34.22 + +Please make sure you have esp32 board manager installed. Tested with version 2.0.11. + +Important flashing settings: +- Set board to "ESP32C3 Dev Module" +- Enable "USB CDC On Boot" +- Flash frequency "80Mhz" +- Flash mode "QIO" +- Flash size "4MB" +- Partition scheme "Default 4MB with spiffs (1.2MB APP/1,5MB SPIFFS)" +- JTAG adapter "Disabled" + +Configuration parameters, e.g. Celsius / Fahrenheit or PM unit (US AQI vs ug/m3) can be set through the AirGradient dashboard. + +If you have any questions please visit our forum at +https://forum.airgradient.com/ + +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License + +*/ + +#include +#include +#include + +#include +#include +#include + +/** + * @brief Application state machine state + * + */ +enum { + APP_SM_WIFI_MANAGER_MODE, /** In WiFi Manger Mode */ + APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE, /** WiFi Manager has connected to mobile + phone */ + APP_SM_WIFI_MANAGER_STA_CONNECTING, /** After SSID and PW entered and OK + clicked, connection to WiFI network is + attempted*/ + APP_SM_WIFI_MANAGER_STA_CONNECTED, /** Connecting to WiFi worked */ + APP_SM_WIFI_OK_SERVER_CONNECTING, /** Once connected to WiFi an attempt to + reach the server is performed */ + APP_SM_WIFI_OK_SERVER_CONNNECTED, /** Server is reachable, all fine */ + /** Exceptions during WIFi Setup */ + APP_SM_WIFI_MANAGER_CONNECT_FAILED, /** Cannot connect to WiFi (e.g. wrong + password, WPA Enterprise etc.) */ + APP_SM_WIFI_OK_SERVER_CONNECT_FAILED, /** Connected to WiFi but server not + reachable, e.g. firewall block/ + whitelisting needed etc. */ + APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED, /** Server reachable but sensor + not configured correctly*/ + + /** During Normal Operation */ + APP_SM_WIFI_LOST, /** Connection to WiFi network failed credentials incorrect + encryption not supported etc. */ + APP_SM_SERVER_LOST, /** Connected to WiFi network but the server cannot be + reached through the internet, e.g. blocked by firewall + */ + APP_SM_SENSOR_CONFIG_FAILED, /** Server is reachable but there is some + configuration issue to be fixed on the server + side */ + APP_SM_NORMAL, +}; + +#define WIFI_CONNECT_COUNTDOWN_MAX 180 /** sec */ +#define LED_BAR_COUNT_INIT_VALUE (-1) +#define LED_BAR_ANIMATION_PERIOD 100 /** ms */ +#define DISP_UPDATE_INTERVAL 5000 /** ms */ +#define SERVER_CONFIG_UPDATE_INTERVAL 30000 /** ms */ +#define SERVER_SYNC_INTERVAL 60000 /** ms */ +#define SENSOR_CO2_CALIB_COUNTDOWN_MAX 5 /** sec */ +#define SENSOR_TVOC_UPDATE_INTERVAL 1000 /** ms */ +#define SENSOR_CO2_UPDATE_INTERVAL 5000 /** ms */ +#define SENSOR_PM_UPDATE_INTERVAL 5000 /** ms */ +#define SENSOR_TEMP_HUM_UPDATE_INTERVAL 5000 /** ms */ +#define WIFI_HOTSPOT_PASSWORD_DEFAULT "cleanair" + +/** + * @brief Use use LED bar state + * + */ +typedef enum { + UseLedBarOff, /** Don't use LED bar */ + UseLedBarPM, /** Use LED bar for PMS */ + UseLedBarCO2, /** Use LED bar for CO2 */ +} UseLedBar; + +typedef struct { + bool inF; /** Temperature unit */ + bool inUSAQI; /** PMS standard */ + uint8_t ledBarMode; /** @ref UseLedBar*/ + char model[16]; /** Model string value, Just define, don't know how much + memory usage */ + char mqttBroker[128]; /** Mqtt broker link */ + uint32_t _check; /** Checksum configuration data */ +} ServerConfig_t; +static ServerConfig_t serverConfig; + +#define DEBUG true + +/** Create airgradient instance */ +AirGradient ag(BOARD_ONE_INDOOR_MONITOR_V9_0); + +WiFiManager wifiManager; /** wifi manager instance */ +static int connectCountDown; /** wifi configuration countdown */ +static int ledCount; /** For LED animation */ +static int ledSmState = APP_SM_NORMAL; /** Save display SM */ +static int dispSmState = APP_SM_NORMAL; /** Save LED SM */ +static bool configFailed = false; /** Save is get server configuration failed */ +static bool serverFailed = false; /** Save is send server failed */ + +// Display bottom right +U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE); + +String APIROOT = "http://hw.airgradient.com/"; + +bool co2CalibrationRequest = false; +bool ledBarTestRequested = false; +uint32_t serverConfigLoadTime = 0; +String HOSTPOT = ""; +static bool wifiHasConfig = false; + +// set to true if you want to connect to wifi. You have 60 seconds to connect. +// Then it will go into an offline mode. +boolean connectWIFI = true; + +int loopCount = 0; + +unsigned long currentMillis = 0; +unsigned long previousOled = 0; +unsigned long previoussendToServer = 0; + +unsigned long previousTVOC = 0; +int TVOC = -1; +int NOX = -1; + +unsigned long previousCo2 = 0; +int Co2 = 0; + +unsigned long previousPm = 0; +int pm25 = -1; +int pm01 = -1; +int pm10 = -1; +int pm03PCount = -1; + +unsigned long previousTempHum = 0; +float temp; +int hum; + +int buttonConfig = 0; +PushButton::State lastState = PushButton::BUTTON_RELEASED; +PushButton::State currentState; +unsigned long pressedTime = 0; +unsigned long releasedTime = 0; + +void boardInit(void); +void failedHandler(String msg); +void getServerConfig(void); +void co2Calibration(void); +void setRGBledPMcolor(int pm25Value); +void setWifiConnectLedColor(void); +void setWifiConnectingLedColor(void); +void ledSmHandler(int sm); +void ledSmHandler(void); +void dispSmHandler(int sm); +void sensorLedColorHandler(void); +void appLedHandler(void); +void appDispHandler(void); +void appLedUnUseHandler(void); +void updateWiFiConnect(void); + +void setup() { + if (DEBUG) { + Serial.begin(115200); + } + + /** Init default server configuration */ + serverConfig.inF = false; + serverConfig.inUSAQI = false; + serverConfig.ledBarMode = UseLedBarCO2; + + /** Init I2C */ + Wire.begin(ag.getI2cSdaPin(), ag.getI2cSclPin()); + + /** Display init */ + u8g2.begin(); + + /** Show boot display */ + displayShowText("One V9", "Lib Ver: " + ag.getVersion(), ""); + delay(2000); /** Boot display wait */ + + /** Init sensor */ + boardInit(); + + /** WIFI connect */ + if (connectWIFI) { + connectToWifi(); + } + if (WiFi.status() == WL_CONNECTED) { + sendPing(); + Serial.println(F("WiFi connected!")); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + + /** Get first connected to wifi */ + getServerConfig(); + if (configFailed) { + dispSmHandler(APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED); + ledSmHandler(APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED); + delay(5000); + } + } + + /** Show display Warning up */ + displayShowText("Warming Up", "Serial Number:", String(getNormalizedMac())); + delay(10000); + + appLedHandler(); + appDispHandler(); +} + +void loop() { + currentMillis = millis(); + updateTVOC(); + updateDispLedBar(); + updateCo2(); + updatePm(); + updateTempHum(); + sendToServer(); + getServerConfig(); + updateWiFiConnect(); +} + +void ledTest() { + displayShowText("LED Test", "running", "....."); + setRGBledColor('r'); + delay(1000); + setRGBledColor('g'); + delay(1000); + setRGBledColor('b'); + delay(1000); + setRGBledColor('w'); + delay(1000); + setRGBledColor('n'); + delay(1000); + // LED Test +} + +void updateTVOC() { + if (currentMillis - previousTVOC >= SENSOR_TVOC_UPDATE_INTERVAL) { + previousTVOC += SENSOR_TVOC_UPDATE_INTERVAL; + + TVOC = ag.sgp41.getTvocIndex(); + NOX = ag.sgp41.getNoxIndex(); + + Serial.println(String(TVOC)); + Serial.println(String(NOX)); + } +} + +void updateCo2() { + if (currentMillis - previousCo2 >= SENSOR_CO2_UPDATE_INTERVAL) { + previousCo2 += SENSOR_CO2_UPDATE_INTERVAL; + Co2 = ag.s8.getCo2(); + Serial.println(String(Co2)); + } +} + +void updatePm() { + if (currentMillis - previousPm >= SENSOR_PM_UPDATE_INTERVAL) { + previousPm += SENSOR_PM_UPDATE_INTERVAL; + if (ag.pms5003.readData()) { + pm01 = ag.pms5003.getPm01Ae(); + pm25 = ag.pms5003.getPm25Ae(); + pm10 = ag.pms5003.getPm10Ae(); + pm03PCount = ag.pms5003.getPm03ParticleCount(); + } else { + pm01 = -1; + pm25 = -1; + pm10 = -1; + pm03PCount = -1; + } + } +} + +void updateTempHum() { + if (currentMillis - previousTempHum >= SENSOR_TEMP_HUM_UPDATE_INTERVAL) { + previousTempHum += SENSOR_TEMP_HUM_UPDATE_INTERVAL; + temp = ag.sht.getTemperature(); + hum = ag.sht.getRelativeHumidity(); + } +} + +void updateDispLedBar() { + if (currentMillis - previousOled >= DISP_UPDATE_INTERVAL) { + previousOled += DISP_UPDATE_INTERVAL; + appDispHandler(); + appLedHandler(); + } +} + +void sendPing() { + String payload = + "{\"wifi\":" + String(WiFi.RSSI()) + ", \"boot\":" + loopCount + "}"; + dispSmHandler(APP_SM_WIFI_OK_SERVER_CONNECTING); + delay(1500); + if (postToServer(payload)) { + dispSmHandler(APP_SM_WIFI_OK_SERVER_CONNNECTED); + ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNNECTED); + } else { + dispSmHandler(APP_SM_WIFI_OK_SERVER_CONNECT_FAILED); + ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNECT_FAILED); + } + delay(5000); +} + +void displayShowText(String ln1, String ln2, String ln3) { + char buf[9]; + // u8g2.firstPage(); + u8g2.firstPage(); + do { + u8g2.setFont(u8g2_font_t0_16_tf); + u8g2.drawStr(1, 10, String(ln1).c_str()); + u8g2.drawStr(1, 30, String(ln2).c_str()); + u8g2.drawStr(1, 50, String(ln3).c_str()); + } while (u8g2.nextPage()); +} + +void displayShowDashboard(String err) { + char buf[9]; + + /** Clear display dashboard */ + u8g2.firstPage(); + + /** Show content to dashboard */ + do { + u8g2.setFont(u8g2_font_t0_16_tf); + if ((err == NULL) || err.isEmpty()) { + /** Show temperature */ + if (serverConfig.inF) { + if (temp > -10001) { + float tempF = (temp * 9 / 5) + 32; + sprintf(buf, "%.1f°F", tempF); + } else { + sprintf(buf, "-°F"); + } + u8g2.drawUTF8(1, 10, buf); + } else { + if (temp > -10001) { + sprintf(buf, "%.1f°C", temp); + } else { + sprintf(buf, "-°C"); + } + u8g2.drawUTF8(1, 10, buf); + } + + /** Show humidity */ + if (hum >= 0) { + sprintf(buf, "%d%%", hum); + } else { + sprintf(buf, " -%%"); + } + if (hum > 99) { + u8g2.drawStr(97, 10, buf); + } else { + u8g2.drawStr(105, 10, buf); + // there might also be single digits, not considered, sprintf might + // actually support a leading space + } + } else { + Serial.println("Disp show error: " + err); + int strWidth = u8g2.getStrWidth(err.c_str()); + u8g2.drawStr((126 - strWidth) / 2, 10, err.c_str()); + } + + /** Draw horizontal line */ + u8g2.drawLine(1, 13, 128, 13); + + /** Show CO2 label */ + u8g2.setFont(u8g2_font_t0_12_tf); + u8g2.drawUTF8(1, 27, "CO2"); + + /** Show CO2 value */ + u8g2.setFont(u8g2_font_t0_22b_tf); + if (Co2 > 0) { + sprintf(buf, "%d", Co2); + } else { + sprintf(buf, "%s", "-"); + } + u8g2.drawStr(1, 48, buf); + + /** Show CO2 value index */ + u8g2.setFont(u8g2_font_t0_12_tf); + u8g2.drawStr(1, 61, "ppm"); + + /** Draw vertical line */ + u8g2.drawLine(45, 15, 45, 64); + + /** Draw PM2.5 label */ + u8g2.setFont(u8g2_font_t0_12_tf); + u8g2.drawStr(48, 27, "PM2.5"); + + /** Draw PM2.5 value */ + u8g2.setFont(u8g2_font_t0_22b_tf); + if (serverConfig.inUSAQI) { + if (pm25 >= 0) { + sprintf(buf, "%d", ag.pms5003.convertPm25ToUsAqi(pm25)); + } else { + sprintf(buf, "%s", "-"); + } + u8g2.drawStr(48, 48, buf); + u8g2.setFont(u8g2_font_t0_12_tf); + u8g2.drawUTF8(48, 61, "AQI"); + } else { + if (pm25 >= 0) { + sprintf(buf, "%d", pm25); + } else { + sprintf(buf, "%s", "-"); + } + u8g2.drawStr(48, 48, buf); + u8g2.setFont(u8g2_font_t0_12_tf); + u8g2.drawUTF8(48, 61, "ug/m³"); + } + + /** Draw vertical line */ + u8g2.drawLine(82, 15, 82, 64); + + /** Draw TVOC label */ + u8g2.setFont(u8g2_font_t0_12_tf); + u8g2.drawStr(85, 27, "TVOC:"); + + /** Draw TVOC value */ + if (TVOC >= 0) { + sprintf(buf, "%d", TVOC); + } else { + sprintf(buf, "%s", "-"); + } + u8g2.drawStr(85, 39, buf); + + /** Draw NOx label */ + u8g2.drawStr(85, 53, "NOx:"); + if (NOX >= 0) { + sprintf(buf, "%d", NOX); + } else { + sprintf(buf, "%s", "-"); + } + u8g2.drawStr(85, 63, buf); + } while (u8g2.nextPage()); +} + +bool postToServer(String payload) { + Serial.println(payload); + String POSTURL = APIROOT + + "sensors/airgradient:" + String(getNormalizedMac()) + + "/measures"; + Serial.println(POSTURL); + WiFiClient client; + HTTPClient http; + http.begin(client, POSTURL); + http.addHeader("content-type", "application/json"); + int httpCode = http.POST(payload); + String response = http.getString(); + Serial.println(httpCode); + Serial.println(response); + http.end(); + + return (httpCode == 200); +} + +void sendToServer() { + if (currentMillis - previoussendToServer >= SERVER_SYNC_INTERVAL) { + previoussendToServer += SERVER_SYNC_INTERVAL; + String payload = + "{\"wifi\":" + String(WiFi.RSSI()) + + (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) + + (pm01 < 0 ? "" : ", \"pm01\":" + String(pm01)) + + (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) + + (pm10 < 0 ? "" : ", \"pm10\":" + String(pm10)) + + (pm03PCount < 0 ? "" : ", \"pm003_count\":" + String(pm03PCount)) + + (TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC)) + + (NOX < 0 ? "" : ", \"nox_index\":" + String(NOX)) + + ", \"atmp\":" + String(temp) + + (hum < 0 ? "" : ", \"rhum\":" + String(hum)) + + ", \"boot\":" + loopCount + "}"; + if (WiFi.status() == WL_CONNECTED) { + Serial.println(payload); + if (postToServer(payload)) { + serverFailed = false; + } else { + serverFailed = true; + } + resetWatchdog(); + loopCount++; + } else { + Serial.println("WiFi Disconnected"); + } + } +} + +void countdown(int from) { + debug("\n"); + while (from > 0) { + debug(String(from--)); + debug(" "); + delay(1000); + } + debug("\n"); +} + +void resetWatchdog() { ag.watchdog.reset(); } + +bool wifiMangerClientConnected(void) { + return WiFi.softAPgetStationNum() ? true : false; +} + +// Wifi Manager +void connectToWifi() { + /** get wifi AP ssid */ + HOSTPOT = "airgradient-" + String(getNormalizedMac()); + wifiManager.setConfigPortalBlocking(false); + wifiManager.setTimeout(WIFI_CONNECT_COUNTDOWN_MAX); + + wifiManager.setAPCallback([](WiFiManager *obj) { + /** This callback if wifi connnected failed and try to start configuration + * portal */ + connectCountDown = WIFI_CONNECT_COUNTDOWN_MAX; + ledCount = LED_BAR_COUNT_INIT_VALUE; + dispSmState = APP_SM_WIFI_MANAGER_MODE; + ledSmState = APP_SM_WIFI_MANAGER_MODE; + }); + wifiManager.setSaveConfigCallback([]() { + /** Wifi connected save the configuration */ + dispSmState = APP_SM_WIFI_MANAGER_STA_CONNECTED; + ledSmHandler(APP_SM_WIFI_MANAGER_STA_CONNECTED); + }); + wifiManager.setSaveParamsCallback([]() { + /** Wifi set connect: ssid, password */ + ledCount = LED_BAR_COUNT_INIT_VALUE; + dispSmState = APP_SM_WIFI_MANAGER_STA_CONNECTING; + ledSmState = APP_SM_WIFI_MANAGER_STA_CONNECTING; + }); + wifiManager.autoConnect(HOSTPOT.c_str(), WIFI_HOTSPOT_PASSWORD_DEFAULT); + xTaskCreate( + [](void *obj) { + while (wifiManager.getConfigPortalActive()) { + wifiManager.process(); + } + vTaskDelete(NULL); + }, + "wifi_cfg", 4096, NULL, 10, NULL); + + /** Wait for WiFi connect and show LED, display status */ + uint32_t dispPeriod = millis(); + uint32_t ledPeriod = millis(); + bool clientConnectChanged = false; + + int dispSmStateOld = dispSmState; + while (wifiManager.getConfigPortalActive()) { + /** LED and display animation */ + if (WiFi.isConnected() == false) { + /** Display countdown */ + uint32_t ms = (uint32_t)(millis() - dispPeriod); + if (ms >= 1000) { + dispPeriod = millis(); + dispSmHandler(dispSmState); + } else { + if (dispSmStateOld != dispSmState) { + dispSmStateOld = dispSmState; + dispSmHandler(dispSmState); + } + } + + /** LED animations */ + ms = (uint32_t)(millis() - ledPeriod); + if (ms >= LED_BAR_ANIMATION_PERIOD) { + ledPeriod = millis(); + ledSmHandler(); + } + + /** Check for client connect to change led color */ + bool clientConnected = wifiMangerClientConnected(); + if (clientConnected != clientConnectChanged) { + clientConnectChanged = clientConnected; + if (clientConnectChanged) { + ledSmHandler(APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE); + } else { + ledCount = LED_BAR_COUNT_INIT_VALUE; + ledSmHandler(APP_SM_WIFI_MANAGER_MODE); + dispSmHandler(APP_SM_WIFI_MANAGER_MODE); + } + } + } + } + + /** Show display wifi connect result failed */ + if (WiFi.isConnected() == false) { + ledSmHandler(APP_SM_WIFI_MANAGER_CONNECT_FAILED); + dispSmHandler(APP_SM_WIFI_MANAGER_CONNECT_FAILED); + delay(6000); + } else { + wifiHasConfig = true; + } + + /** Update LED bar color */ + appLedHandler(); +} + +void debug(String msg) { + if (DEBUG) + Serial.print(msg); +} + +void debug(int msg) { + if (DEBUG) + Serial.print(msg); +} + +void debugln(String msg) { + if (DEBUG) + Serial.println(msg); +} + +void debugln(int msg) { + if (DEBUG) + Serial.println(msg); +} + +String getNormalizedMac() { + String mac = WiFi.macAddress(); + mac.replace(":", ""); + mac.toLowerCase(); + return mac; +} + +void setRGBledCO2color(int co2Value) { + if (co2Value >= 300 && co2Value < 800) { + setRGBledColor('g'); + } else if (co2Value >= 800 && co2Value < 1000) { + setRGBledColor('y'); + } else if (co2Value >= 1000 && co2Value < 1500) { + setRGBledColor('o'); + } else if (co2Value >= 1500 && co2Value < 2000) { + setRGBledColor('r'); + } else if (co2Value >= 2000 && co2Value < 3000) { + setRGBledColor('p'); + } else if (co2Value >= 3000 && co2Value < 10000) { + setRGBledColor('z'); + } else { + setRGBledColor('n'); + } +} + +void setRGBledColor(char color) { + int r = 0; + int g = 0; + int b = 0; + switch (color) { + case 'g': + g = 255; + break; + case 'y': + r = 255; + g = 255; + break; + case 'o': + r = 255; + g = 128; + break; + case 'r': + r = 255; + break; + case 'b': + b = 255; + break; + case 'w': + r = 255; + g = 255; + b = 255; + break; + case 'p': + r = 153; + b = 153; + break; + case 'z': + r = 102; + break; + case 'n': + default: + break; + } + + /** Sensor LED indicator has only show status on last 2 LED on LED Bar */ + int ledNum = ag.ledBar.getNumberOfLed() - 1; + ag.ledBar.setColor(r, g, b, ledNum); + + ledNum = ag.ledBar.getNumberOfLed() - 2; + ag.ledBar.setColor(r, g, b, ledNum); +} + +void boardInit(void) { + /** Init LED Bar */ + ag.ledBar.begin(); + + /** Button init */ + ag.button.begin(); + + /** Init sensor SGP41 */ + if (ag.sgp41.begin(Wire) == false) { + failedHandler("Init SGP41 failed"); + } + + /** INit SHT */ + if (ag.sht.begin(Wire) == false) { + failedHandler("Init SHT failed"); + } + + /** Init watchdog */ + ag.watchdog.begin(); + + /** Init S8 CO2 sensor */ + if (ag.s8.begin(Serial1) == false) { + failedHandler("Init SenseAirS8 failed"); + } + + /** Init PMS5003 */ + if (ag.pms5003.begin(Serial0) == false) { + failedHandler("Init PMS5003 failed"); + } +} + +void failedHandler(String msg) { + while (true) { + Serial.println(msg); + vTaskDelay(1000); + } +} + +void getServerConfigLoadTime(void) { + serverConfigLoadTime = millis(); + if (serverConfigLoadTime == 0) { + serverConfigLoadTime = 1; + } +} + +void getServerConfig(void) { + /** Only trigger load configuration again after pollServerConfigInterval sec + */ + if (serverConfigLoadTime) { + uint32_t ms = (uint32_t)(millis() - serverConfigLoadTime); + if (ms < SERVER_CONFIG_UPDATE_INTERVAL) { + return; + } + } + + getServerConfigLoadTime(); + + Serial.println("Trigger load server configuration"); + if (WiFi.status() != WL_CONNECTED) { + Serial.println( + "Ignore get server configuration because WIFI not connected"); + return; + } + + // WiFiClient wifiClient; + HTTPClient httpClient; + + String getUrl = "http://hw.airgradient.com/sensors/airgradient:" + + String(getNormalizedMac()) + "/one/config"; + Serial.println("HttpClient get: " + getUrl); + if (httpClient.begin(getUrl) == false) { + Serial.println("HttpClient init failed"); + getServerConfigLoadTime(); + configFailed = true; + return; + } + + int respCode = httpClient.GET(); + + /** get failure */ + if (respCode != 200) { + Serial.printf("HttpClient get failed: %d\r\n", respCode); + getServerConfigLoadTime(); + + /** Close client */ + httpClient.end(); + + configFailed = true; + + return; + } + configFailed = false; + + /** Get configuration content */ + String respContent = httpClient.getString(); + Serial.println("Server config: " + respContent); + + /** close client */ + httpClient.end(); + + /** Parse JSON */ + JSONVar root = JSON.parse(respContent); + if (JSON.typeof_(root) == "undefined") { + Serial.println("Server configura JSON invalid"); + getServerConfigLoadTime(); + return; + } + + /** Get "country" */ + bool inF = serverConfig.inF; + if (JSON.typeof_(root["country"]) == "string") { + String country = root["country"]; + if (country == "US") { + inF = true; + } else { + inF = false; + } + } + + /** Get "pmStandard" */ + bool inUSAQI = serverConfig.inUSAQI; + if (JSON.typeof_(root["pmStandard"]) == "string") { + String standard = root["pmStandard"]; + if (standard == "ugm3") { + inUSAQI = false; + } else { + inUSAQI = true; + } + } + + /** Get CO2 "co2CalibrationRequested" */ + co2CalibrationRequest = false; + if (JSON.typeof_(root["co2CalibrationRequested"]) == "boolean") { + co2CalibrationRequest = root["co2CalibrationRequested"]; + } + + /** Get "ledBarTestRequested" */ + if (JSON.typeof_(root["ledBarTestRequested"]) == "boolean") { + ledBarTestRequested = root["ledBarTestRequested"]; + } + + /** get "ledBarMode" */ + uint8_t ledBarMode = serverConfig.ledBarMode; + if (JSON.typeof_(root["ledBarMode"]) == "string") { + String _ledBarMode = root["ledBarMode"]; + if (_ledBarMode == "co2") { + ledBarMode = UseLedBarCO2; + } else if (_ledBarMode == "pm") { + ledBarMode = UseLedBarPM; + } else if (_ledBarMode == "off") { + ledBarMode = UseLedBarOff; + } + } + + /** get "model" */ + String model = ""; + if (JSON.typeof_(root["model"]) == "string") { + String _model = root["model"]; + model = _model; + } + + /** get "mqttBrokerUrl" */ + String mqtt = ""; + if (JSON.typeof_(root["mqttBrokerUrl"]) == "string") { + String _mqtt = root["mqttBrokerUrl"]; + mqtt = _mqtt; + } + + if (inF != serverConfig.inF) { + serverConfig.inF = inF; + } + if (inUSAQI != serverConfig.inUSAQI) { + serverConfig.inUSAQI = inUSAQI; + } + if (ledBarMode != serverConfig.ledBarMode) { + serverConfig.ledBarMode = ledBarMode; + } + if (model.length()) { + if (model != String(serverConfig.model)) { + memset(serverConfig.model, 0, sizeof(serverConfig.model)); + memcpy(serverConfig.model, model.c_str(), model.length()); + } + } + if (mqtt.length()) { + if (mqtt != String(serverConfig.mqttBroker)) { + memset(serverConfig.mqttBroker, 0, sizeof(serverConfig.mqttBroker)); + memcpy(serverConfig.mqttBroker, mqtt.c_str(), mqtt.length()); + } + } + + /** Show server configuration */ + showServerConfig(); + + /** Calibration */ + if (ledBarTestRequested) { + ledTest(); + } + if (co2CalibrationRequest) { + co2Calibration(); + } + + /** Update LED status */ + appLedHandler(); +} + +void showServerConfig(void) { + Serial.println("Server configuration: "); + Serial.printf(" inF: %s\r\n", serverConfig.inF ? "true" : "false"); + Serial.printf(" inUSAQI: %s\r\n", + serverConfig.inUSAQI ? "true" : "false"); + Serial.printf("useRGBLedBar: %d\r\n", (int)serverConfig.ledBarMode); + Serial.printf(" Model: %.*s\r\n", sizeof(serverConfig.model), + serverConfig.model); + Serial.printf(" Mqtt Broker: %.*s\r\n", sizeof(serverConfig.mqttBroker), + serverConfig.mqttBroker); +} + +void co2Calibration(void) { + /** Count down for co2CalibCountdown secs */ + for (int i = 0; i < SENSOR_CO2_CALIB_COUNTDOWN_MAX; i++) { + displayShowText( + "Start CO2 calib", + "after " + String(SENSOR_CO2_CALIB_COUNTDOWN_MAX - i) + " sec", ""); + delay(1000); + } + + if (ag.s8.setBaselineCalibration()) { + displayShowText("Calibration", "success", ""); + delay(1000); + displayShowText("Wait for", "calib finish", "..."); + int count = 0; + while (ag.s8.isBaseLineCalibrationDone() == false) { + delay(1000); + count++; + } + displayShowText("Calib finish", "after " + String(count), "sec"); + delay(2000); + } else { + displayShowText("Calibration", "failure!!!", ""); + delay(2000); + } + + /** Update display */ + appDispHandler(); +} + +void setRGBledPMcolor(int pm25Value) { + if (pm25Value >= 0 && pm25Value < 10) + setRGBledColor('g'); + if (pm25Value >= 10 && pm25Value < 35) + setRGBledColor('y'); + if (pm25Value >= 35 && pm25Value < 55) + setRGBledColor('o'); + if (pm25Value >= 55 && pm25Value < 150) + setRGBledColor('r'); + if (pm25Value >= 150 && pm25Value < 250) + setRGBledColor('p'); + if (pm25Value >= 250 && pm25Value < 1000) + setRGBledColor('p'); +} + +void setWifiConnectLedColor(void) { ag.ledBar.setColor(0, 0, 255); } + +void setWifiConnectingLedColor(void) { ag.ledBar.setColor(255, 255, 255); } + +void singleLedAnimation(uint8_t r, uint8_t g, uint8_t b) { + if (ledCount < 0) { + ledCount = 0; + ag.ledBar.setColor(r, g, b, ledCount); + } else { + ledCount++; + if (ledCount >= ag.ledBar.getNumberOfLed()) { + ledCount = 0; + } + ag.ledBar.setColor(r, g, b, ledCount); + } +} + +void ledSmHandler(int sm) { + if (sm > APP_SM_NORMAL) { + return; + } + + ledSmState = sm; + ag.ledBar.clear(); // Set all LED OFF + switch (sm) { + case APP_SM_WIFI_MANAGER_MODE: { + /** In WiFi Manager Mode */ + /** Turn LED OFF */ + /** Turn midle LED Color */ + ag.ledBar.setColor(0, 0, 255, ag.ledBar.getNumberOfLed() / 2); + break; + } + case APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE: { + /** WiFi Manager has connected to mobile phone */ + ag.ledBar.setColor(0, 0, 255); + break; + } + case APP_SM_WIFI_MANAGER_STA_CONNECTING: { + /** after SSID and PW entered and OK clicked, connection to WiFI network is + * attempted */ + singleLedAnimation(255, 255, 255); + break; + } + case APP_SM_WIFI_MANAGER_STA_CONNECTED: { + /** Connecting to WiFi worked */ + ag.ledBar.setColor(255, 255, 255); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNECTING: { + /** once connected to WiFi an attempt to reach the server is performed */ + singleLedAnimation(0, 255, 0); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNNECTED: { + /** Server is reachable, all fine */ + ag.ledBar.setColor(0, 255, 0); + break; + } + case APP_SM_WIFI_MANAGER_CONNECT_FAILED: { + /** Cannot connect to WiFi (e.g. wrong password, WPA Enterprise etc.) */ + ag.ledBar.setColor(255, 0, 0); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNECT_FAILED: { + /** Connected to WiFi but server not reachable, e.g. firewall block/ + * whitelisting needed etc. */ + ag.ledBar.setColor(233, 183, 54); /** orange */ + break; + } + case APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED: { + /** Server reachable but sensor not configured correctly */ + ag.ledBar.setColor(139, 24, 248); /** violet */ + break; + } + case APP_SM_WIFI_LOST: { + /** Connection to WiFi network failed credentials incorrect encryption not + * supported etc. */ + + /** WIFI failed status LED color */ + ag.ledBar.setColor(255, 0, 0, 0); + /** Show CO2 or PM color status */ + sensorLedColorHandler(); + break; + } + case APP_SM_SERVER_LOST: { + /** Connected to WiFi network but the server cannot be reached through the + * internet, e.g. blocked by firewall */ + + ag.ledBar.setColor(233, 183, 54, 0); + + /** Show CO2 or PM color status */ + sensorLedColorHandler(); + break; + } + case APP_SM_SENSOR_CONFIG_FAILED: { + /** Server is reachable but there is some configuration issue to be fixed on + * the server side */ + + ag.ledBar.setColor(139, 24, 248, 0); + + /** Show CO2 or PM color status */ + sensorLedColorHandler(); + break; + } + case APP_SM_NORMAL: { + + sensorLedColorHandler(); + break; + } + default: + break; + } + ag.ledBar.show(); +} + +void ledSmHandler(void) { ledSmHandler(ledSmState); } + +void dispSmHandler(int sm) { + if (sm > APP_SM_NORMAL) { + return; + } + + dispSmState = sm; + + switch (sm) { + case APP_SM_WIFI_MANAGER_MODE: + case APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE: { + if (connectCountDown >= 0) { + displayShowText(String(connectCountDown) + "s to connect", + "to airgradient-", String(getNormalizedMac())); + connectCountDown--; + } + break; + } + case APP_SM_WIFI_MANAGER_STA_CONNECTING: { + displayShowText("Trying to", "connect to WiFi", ".."); + break; + } + case APP_SM_WIFI_MANAGER_STA_CONNECTED: { + displayShowText("WiFi connection", "successful", ""); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNECTING: { + displayShowText("Connecting to", "Server", "..."); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNNECTED: { + displayShowText("Server", "connection", "successful"); + break; + } + case APP_SM_WIFI_MANAGER_CONNECT_FAILED: { + displayShowText("WiFi not", "connected", ""); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNECT_FAILED: { + //displayShowText("Server not", "reachable", ""); + break; + } + case APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED: { + displayShowText("Monitor not", "setup on", "dashboard"); + break; + } + case APP_SM_WIFI_LOST: { + displayShowDashboard("WiFi N/A"); + break; + } + case APP_SM_SERVER_LOST: { + displayShowDashboard("Server N/A"); + break; + } + case APP_SM_SENSOR_CONFIG_FAILED: { + displayShowDashboard("Add to Dashboard"); + break; + } + case APP_SM_NORMAL: { + displayShowDashboard(""); + } + detault: + break; + } +} + +void sensorLedColorHandler(void) { + switch (serverConfig.ledBarMode) { + case UseLedBarCO2: + setRGBledCO2color(Co2); + break; + case UseLedBarPM: + setRGBledPMcolor(pm25); + break; + default: + ag.ledBar.setColor(0, 0, 0, ag.ledBar.getNumberOfLed() - 1); + ag.ledBar.setColor(0, 0, 0, ag.ledBar.getNumberOfLed() - 2); + break; + } +} + +void appLedHandler(void) { + uint8_t state = APP_SM_NORMAL; + if (WiFi.isConnected() == false) { + state = APP_SM_WIFI_LOST; + } else if (configFailed) { + state = APP_SM_SENSOR_CONFIG_FAILED; + } else if (serverFailed) { + state = APP_SM_SERVER_LOST; + } + ledSmHandler(state); +} + +void appDispHandler(void) { + uint8_t state = APP_SM_NORMAL; + if (WiFi.isConnected() == false) { + state = APP_SM_WIFI_LOST; + } else if (configFailed) { + state = APP_SM_SENSOR_CONFIG_FAILED; + } else if (serverFailed) { + state = APP_SM_SERVER_LOST; + } + dispSmHandler(state); +} + +void updateWiFiConnect(void) { + static uint32_t lastRetry; + if (wifiHasConfig == false) { + return; + } + if (WiFi.isConnected()) { + lastRetry = millis(); + return; + } + uint32_t ms = (uint32_t)(millis() - lastRetry); + if (ms >= 10000) { + lastRetry = millis(); + WiFi.reconnect(); + } +} diff --git a/examples/ONE_V9/ONE_V9.ino b/examples/ONE_V9/ONE_V9.ino deleted file mode 100644 index a7b5d5a..0000000 --- a/examples/ONE_V9/ONE_V9.ino +++ /dev/null @@ -1,752 +0,0 @@ -/* -Important: This code is only for the DIY PRO / AirGradient ONE PCB Version 9 with the ESP-C3 MCU. - -It is a high quality sensor showing PM2.5, CO2, TVOC, NOx, Temperature and Humidity on a small display and LEDbar and can send data over Wifi. - -Build Instructions: https://www.airgradient.com/open-airgradient/instructions/ - -Kits (including a pre-soldered version) are available: https://www.airgradient.com/indoor/ - -The codes needs the following libraries installed: -"WifiManager by tzapu, tablatronix" tested with version 2.0.11-beta -"U8g2" by oliver tested with version 2.32.15 -"Sensirion I2C SGP41" by Sensation Version 0.1.0 -"Sensirion Gas Index Algorithm" by Sensation Version 3.2.1 -"pms" by Markusz Kakl version 1.1.0 -"S8_UART" by Josep Comas Version 1.0.1 -"Arduino-SHT" by Johannes Winkelmann Version 1.2.2 -"Adafruit NeoPixel" by Adafruit Version 1.11.0 - -Configuration: -Please set in the code below the configuration parameters. - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License - -*/ - -#include "PMS.h" - -#include - -#include - -#include "s8_uart.h" - -#include - -#include - -#include - -#include - -#include "SHTSensor.h" - -#include - -#include - -#include - -#include - -#define DEBUG true - -#define I2C_SDA 7 -#define I2C_SCL 6 - -HTTPClient client; - -Adafruit_NeoPixel pixels(11, 10, NEO_GRB + NEO_KHZ800); -SensirionI2CSgp41 sgp41; -VOCGasIndexAlgorithm voc_algorithm; -NOxGasIndexAlgorithm nox_algorithm; -SHTSensor sht; - -PMS pms1(Serial0); - -PMS::DATA data1; - -S8_UART * sensor_S8; -S8_sensor sensor; - -// time in seconds needed for NOx conditioning -uint16_t conditioning_s = 10; - -// for persistent saving and loading -int addr = 4; -byte value; - -// Display bottom right -U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); - -String APIROOT = "http://hw.airgradient.com/"; - -// set to true to switch from Celcius to Fahrenheit -boolean inF = false; - -// PM2.5 in US AQI (default ug/m3) -boolean inUSAQI = false; - -// use RGB LED Bar -boolean useRGBledBar = true; - -// set to true if you want to connect to wifi. You have 60 seconds to connect. Then it will go into an offline mode. -boolean connectWIFI = true; - -int loopCount = 0; - -unsigned long currentMillis = 0; - -const int oledInterval = 5000; -unsigned long previousOled = 0; - -const int sendToServerInterval = 10000; -unsigned long previoussendToServer = 0; - -const int tvocInterval = 1000; -unsigned long previousTVOC = 0; -int TVOC = -1; -int NOX = -1; - -const int co2Interval = 5000; -unsigned long previousCo2 = 0; -int Co2 = 0; - -const int pmInterval = 5000; -unsigned long previousPm = 0; -int pm25 = -1; -int pm01 = -1; -int pm10 = -1; -//int pm03PCount = -1; - -const int tempHumInterval = 5000; -unsigned long previousTempHum = 0; -float temp; -int hum; - -int buttonConfig = 0; -int lastState = LOW; -int currentState; -unsigned long pressedTime = 0; -unsigned long releasedTime = 0; - -void setup() { - if (DEBUG) { - Serial.begin(115200); - // see https://github.com/espressif/arduino-esp32/issues/6983 - Serial.setTxTimeoutMs(0); // <<<====== solves the delay issue - } - - Wire.begin(I2C_SDA, I2C_SCL); - pixels.begin(); - pixels.clear(); - - Serial1.begin(9600, SERIAL_8N1, 0, 1); - Serial0.begin(9600); - u8g2.begin(); - - updateOLED2("Warming Up", "Serial Number:", String(getNormalizedMac())); - sgp41.begin(Wire); - delay(300); - - sht.init(Wire); - //sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); - delay(300); - - //init Watchdog - pinMode(2, OUTPUT); - digitalWrite(2, LOW); - - sensor_S8 = new S8_UART(Serial1); - - EEPROM.begin(512); - delay(500); - - // push button - pinMode(9, INPUT_PULLUP); - - buttonConfig = String(EEPROM.read(addr)).toInt(); - if (buttonConfig > 7) buttonConfig = 0; - delay(400); - setConfig(); - Serial.println("buttonConfig: " + String(buttonConfig)); - - updateOLED2("Press Button", "for LED test &", "offline mode"); - delay(2000); - currentState = digitalRead(9); - if (currentState == LOW) { - ledTest(); - return; - } - - updateOLED2("Press Button", "Now for", "Config Menu"); - delay(2000); - currentState = digitalRead(9); - if (currentState == LOW) { - updateOLED2("Entering", "Config Menu", ""); - delay(3000); - lastState = HIGH; - setConfig(); - inConf(); - } - - if (connectWIFI) connectToWifi(); - if (WiFi.status() == WL_CONNECTED) { - sendPing(); - Serial.println(F("WiFi connected!")); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - } - updateOLED2("Warming Up", "Serial Number:", String(getNormalizedMac())); -} - -void loop() { - currentMillis = millis(); - updateTVOC(); - updateOLED(); - updateCo2(); - updatePm(); - updateTempHum(); - sendToServer(); -} - -void updateTVOC() { - uint16_t error; - char errorMessage[256]; - uint16_t defaultRh = 0x8000; - uint16_t defaultT = 0x6666; - uint16_t srawVoc = 0; - uint16_t srawNox = 0; - uint16_t defaultCompenstaionRh = 0x8000; // in ticks as defined by SGP41 - uint16_t defaultCompenstaionT = 0x6666; // in ticks as defined by SGP41 - uint16_t compensationRh = 0; // in ticks as defined by SGP41 - uint16_t compensationT = 0; // in ticks as defined by SGP41 - - delay(1000); - - compensationT = static_cast < uint16_t > ((temp + 45) * 65535 / 175); - compensationRh = static_cast < uint16_t > (hum * 65535 / 100); - - if (conditioning_s > 0) { - error = sgp41.executeConditioning(compensationRh, compensationT, srawVoc); - conditioning_s--; - } else { - error = sgp41.measureRawSignals(compensationRh, compensationT, srawVoc, - srawNox); - } - - if (currentMillis - previousTVOC >= tvocInterval) { - previousTVOC += tvocInterval; - if (error) { - TVOC = -1; - NOX = -1; - Serial.println(String(TVOC)); - } else { - TVOC = voc_algorithm.process(srawVoc); - NOX = nox_algorithm.process(srawNox); - Serial.println(String(TVOC)); - } - - } -} - -void updateCo2() { - if (currentMillis - previousCo2 >= co2Interval) { - previousCo2 += co2Interval; - Co2 = sensor_S8 -> get_co2(); - Serial.println(String(Co2)); - } -} - -void updatePm() { - if (currentMillis - previousPm >= pmInterval) { - previousPm += pmInterval; - if (pms1.readUntil(data1, 2000)) { - pm01 = data1.PM_AE_UG_1_0; - pm25 = data1.PM_AE_UG_2_5; - pm10 = data1.PM_AE_UG_10_0; -// pm03PCount = data1.PM_RAW_0_3; - } else { - pm01 = -1; - pm25 = -1; - pm10 = -1; -// pm03PCount = -1; - } - } -} - -void updateTempHum() { - if (currentMillis - previousTempHum >= tempHumInterval) { - previousTempHum += tempHumInterval; - - if (sht.readSample()) { - temp = sht.getTemperature(); - hum = sht.getHumidity(); - } else { - Serial.print("Error in readSample()\n"); - temp = -10001; - hum = -10001; - } - } -} - -void updateOLED() { - if (currentMillis - previousOled >= oledInterval) { - previousOled += oledInterval; - - String ln3; - String ln1; - - if (inUSAQI) { - ln1 = "AQI:" + String(PM_TO_AQI_US(pm25)) + " CO2:" + String(Co2); - } else { - ln1 = "PM:" + String(pm25) + " CO2:" + String(Co2); - } - - String ln2 = "TVOC:" + String(TVOC) + " NOX:" + String(NOX); - - if (inF) { - ln3 = "F:" + String((temp * 9 / 5) + 32) + " H:" + String(hum) + "%"; - } else { - ln3 = "C:" + String(temp) + " H:" + String(hum) + "%"; - } - //updateOLED2(ln1, ln2, ln3); - updateOLED3(); - setRGBledCO2color(Co2); - } -} - -void inConf() { - setConfig(); - currentState = digitalRead(9); - - if (currentState) { - Serial.println("currentState: high"); - } else { - Serial.println("currentState: low"); - } - - if (lastState == HIGH && currentState == LOW) { - pressedTime = millis(); - } else if (lastState == LOW && currentState == HIGH) { - releasedTime = millis(); - long pressDuration = releasedTime - pressedTime; - if (pressDuration < 1000) { - buttonConfig = buttonConfig + 1; - if (buttonConfig > 7) buttonConfig = 0; - } - } - - if (lastState == LOW && currentState == LOW) { - long passedDuration = millis() - pressedTime; - if (passedDuration > 4000) { - updateOLED2("Saved", "Release", "Button Now"); - delay(1000); - updateOLED2("Rebooting", "in", "5 seconds"); - delay(5000); - EEPROM.write(addr, char(buttonConfig)); - EEPROM.commit(); - delay(1000); - ESP.restart(); - } - - } - lastState = currentState; - delay(100); - inConf(); -} - -void setConfig() { - Serial.println("in setConfig"); - if (buttonConfig == 0) { - u8g2.setDisplayRotation(U8G2_R0); - updateOLED2("T:C, PM:ug/m3", "LED Bar: on", "Long Press Saves"); - inF = false; - inUSAQI = false; - useRGBledBar = true; - } else if (buttonConfig == 1) { - u8g2.setDisplayRotation(U8G2_R0); - updateOLED2("T:C, PM:US AQI", "LED Bar: on", "Long Press Saves"); - inF = false; - inUSAQI = true; - useRGBledBar = true; - } else if (buttonConfig == 2) { - u8g2.setDisplayRotation(U8G2_R0); - updateOLED2("T:F PM:ug/m3", "LED Bar: on", "Long Press Saves"); - inF = true; - inUSAQI = false; - useRGBledBar = true; - } else if (buttonConfig == 3) { - u8g2.setDisplayRotation(U8G2_R0); - updateOLED2("T:F PM:US AQI", "LED Bar: on", "Long Press Saves"); - inF = true; - inUSAQI = true; - useRGBledBar = true; - } else if (buttonConfig == 4) { - updateOLED2("T:C, PM:ug/m3", "LED Bar: off", "Long Press Saves"); - inF = false; - inUSAQI = false; - useRGBledBar = false; - } else if (buttonConfig == 5) { - u8g2.setDisplayRotation(U8G2_R0); - updateOLED2("T:C, PM:US AQI", "LED Bar: off", "Long Press Saves"); - inF = false; - inUSAQI = true; - useRGBledBar = false; - } else if (buttonConfig == 6) { - u8g2.setDisplayRotation(U8G2_R0); - updateOLED2("T:F PM:ug/m3", "LED Bar: off", "Long Press Saves"); - inF = true; - inUSAQI = false; - useRGBledBar = false; - } else if (buttonConfig == 7) { - u8g2.setDisplayRotation(U8G2_R0); - updateOLED2("T:F PM:US AQI", "LED Bar: off", "Long Press Saves"); - inF = true; - inUSAQI = true; - useRGBledBar = false; - } -} - -void sendPing() { - String payload = "{\"wifi\":" + String(WiFi.RSSI()) + - ", \"boot\":" + loopCount + - "}"; -} - -void updateOLED2(String ln1, String ln2, String ln3) { - char buf[9]; - u8g2.firstPage(); - u8g2.firstPage(); - do { - u8g2.setFont(u8g2_font_t0_16_tf); - u8g2.drawStr(1, 10, String(ln1).c_str()); - u8g2.drawStr(1, 30, String(ln2).c_str()); - u8g2.drawStr(1, 50, String(ln3).c_str()); - } while (u8g2.nextPage()); -} - -void updateOLED3() { - char buf[9]; - u8g2.firstPage(); - u8g2.firstPage(); - do { - - u8g2.setFont(u8g2_font_t0_16_tf); - - if (inF) { - if (temp > -10001) { - float tempF = (temp * 9 / 5) + 32; - sprintf(buf, "%.1f°F", tempF); - } else { - sprintf(buf, "-°F"); - } - u8g2.drawUTF8(1, 10, buf); - } else { - if (temp > -10001) { - sprintf(buf, "%.1f°C", temp); - } else { - sprintf(buf, "-°C"); - } - u8g2.drawUTF8(1, 10, buf); - } - - if (hum >= 0) { - sprintf(buf, "%d%%", hum); - } else { - sprintf(buf, " -%%"); - } - if (hum > 99) { - u8g2.drawStr(97, 10, buf); - } else { - u8g2.drawStr(105, 10, buf); - // there might also be single digits, not considered, sprintf might actually support a leading space - } - - u8g2.drawLine(1, 13, 128, 13); - u8g2.setFont(u8g2_font_t0_12_tf); - u8g2.drawUTF8(1, 27, "CO2"); - u8g2.setFont(u8g2_font_t0_22b_tf); - if (Co2 > 0) { - sprintf(buf, "%d", Co2); - } else { - sprintf(buf, "%s", "-"); - } - u8g2.drawStr(1, 48, buf); - u8g2.setFont(u8g2_font_t0_12_tf); - u8g2.drawStr(1, 61, "ppm"); - u8g2.drawLine(45, 15, 45, 64); - u8g2.setFont(u8g2_font_t0_12_tf); - u8g2.drawStr(48, 27, "PM2.5"); - u8g2.setFont(u8g2_font_t0_22b_tf); - - if (inUSAQI) { - if (pm25 >= 0) { - sprintf(buf, "%d", PM_TO_AQI_US(pm25)); - } else { - sprintf(buf, "%s", "-"); - } - u8g2.drawStr(48, 48, buf); - u8g2.setFont(u8g2_font_t0_12_tf); - u8g2.drawUTF8(48, 61, "AQI"); - } else { - if (pm25 >= 0) { - sprintf(buf, "%d", pm25); - } else { - sprintf(buf, "%s", "-"); - } - u8g2.drawStr(48, 48, buf); - u8g2.setFont(u8g2_font_t0_12_tf); - u8g2.drawUTF8(48, 61, "ug/m³"); - } - - u8g2.drawLine(82, 15, 82, 64); - u8g2.setFont(u8g2_font_t0_12_tf); - u8g2.drawStr(85, 27, "TVOC:"); - if (TVOC >= 0) { - sprintf(buf, "%d", TVOC); - } else { - sprintf(buf, "%s", "-"); - } - u8g2.drawStr(85, 39, buf); - u8g2.drawStr(85, 53, "NOx:"); - if (NOX >= 0) { - sprintf(buf, "%d", NOX); - } else { - sprintf(buf, "%s", "-"); - } - u8g2.drawStr(85, 63, buf); - - } while (u8g2.nextPage()); -} - -void sendToServer() { - if (currentMillis - previoussendToServer >= sendToServerInterval) { - previoussendToServer += sendToServerInterval; - String payload = "{\"wifi\":" + String(WiFi.RSSI()) + - (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) + - (pm01 < 0 ? "" : ", \"pm01\":" + String(pm01)) + - (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) + - (pm10 < 0 ? "" : ", \"pm10\":" + String(pm10)) + -// (pm03PCount < 0 ? "" : ", \"pm003_count\":" + String(pm03PCount)) + - (TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC)) + - (NOX < 0 ? "" : ", \"nox_index\":" + String(NOX)) + - ", \"atmp\":" + String(temp) + - (hum < 0 ? "" : ", \"rhum\":" + String(hum)) + - ", \"boot\":" + loopCount + - "}"; - - if (WiFi.status() == WL_CONNECTED) { - Serial.println(payload); - String POSTURL = APIROOT + "sensors/airgradient:" + String(getNormalizedMac()) + "/measures"; - Serial.println(POSTURL); - WiFiClient client; - HTTPClient http; - http.begin(client, POSTURL); - http.addHeader("content-type", "application/json"); - int httpCode = http.POST(payload); - String response = http.getString(); - Serial.println(httpCode); - Serial.println(response); - http.end(); - resetWatchdog(); - loopCount++; - } else { - Serial.println("WiFi Disconnected"); - } - } -} - -void countdown(int from) { - debug("\n"); - while (from > 0) { - debug(String(from--)); - debug(" "); - delay(1000); - } - debug("\n"); -} - -void resetWatchdog() { - Serial.println("Watchdog reset"); - digitalWrite(2, HIGH); - delay(20); - digitalWrite(2, LOW); -} - -// Wifi Manager -void connectToWifi() { - WiFiManager wifiManager; - //WiFi.disconnect(); //to delete previous saved hotspot - String HOTSPOT = "AG-" + String(getNormalizedMac()); - updateOLED2("180s to connect", "to Wifi Hotspot", HOTSPOT); - wifiManager.setTimeout(180); - if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) { - Serial.println("failed to connect and hit timeout"); - delay(6000); - } - -} - -void debug(String msg) { - if (DEBUG) - Serial.print(msg); -} - -void debug(int msg) { - if (DEBUG) - Serial.print(msg); -} - -void debugln(String msg) { - if (DEBUG) - Serial.println(msg); -} - -void debugln(int msg) { - if (DEBUG) - Serial.println(msg); -} - -String getNormalizedMac() { - String mac = WiFi.macAddress(); - mac.replace(":", ""); - mac.toLowerCase(); - return mac; -} - -void setRGBledCO2color(int co2Value) { - if (co2Value >= 300 && co2Value < 800) setRGBledColor('g'); - if (co2Value >= 800 && co2Value < 1000) setRGBledColor('y'); - if (co2Value >= 1000 && co2Value < 1500) setRGBledColor('o'); - if (co2Value >= 1500 && co2Value < 2000) setRGBledColor('r'); - if (co2Value >= 2000 && co2Value < 3000) setRGBledColor('p'); - if (co2Value >= 3000 && co2Value < 10000) setRGBledColor('z'); -} - -void setRGBledColor(char color) { - if (useRGBledBar) { - //pixels.clear(); - switch (color) { - case 'g': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(0, 255, 0)); - delay(30); - pixels.show(); - } - break; - case 'y': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(255, 255, 0)); - delay(30); - pixels.show(); - } - break; - case 'o': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(255, 128, 0)); - delay(30); - pixels.show(); - } - break; - case 'r': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(255, 0, 0)); - delay(30); - pixels.show(); - } - break; - case 'b': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(0, 0, 255)); - delay(30); - pixels.show(); - } - break; - case 'w': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(255, 255, 255)); - delay(30); - pixels.show(); - } - break; - case 'p': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(153, 0, 153)); - delay(30); - pixels.show(); - } - break; - case 'z': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(102, 0, 0)); - delay(30); - pixels.show(); - } - break; - case 'n': - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(0, 0, 0)); - delay(30); - pixels.show(); - } - break; - default: - // if nothing else matches, do the default - // default is optional - break; - } - } -} - -void ledTest() { - updateOLED2("LED Test", "running", "....."); - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(255, 0, 0)); - delay(30); - pixels.show(); - } - delay(500); - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(0, 255, 0)); - delay(30); - pixels.show(); - } - delay(500); - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(0, 0, 255)); - delay(30); - pixels.show(); - } - delay(500); - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(255, 255, 255)); - delay(30); - pixels.show(); - } - delay(500); - for (int i = 0; i < 11; i++) { - pixels.setPixelColor(i, pixels.Color(0, 0, 0)); - delay(30); - pixels.show(); - } - delay(500); -} - -// Calculate PM2.5 US AQI -int PM_TO_AQI_US(int pm02) { - if (pm02 <= 12.0) return ((50 - 0) / (12.0 - .0) * (pm02 - .0) + 0); - else if (pm02 <= 35.4) return ((100 - 50) / (35.4 - 12.0) * (pm02 - 12.0) + 50); - else if (pm02 <= 55.4) return ((150 - 100) / (55.4 - 35.4) * (pm02 - 35.4) + 100); - else if (pm02 <= 150.4) return ((200 - 150) / (150.4 - 55.4) * (pm02 - 55.4) + 150); - else if (pm02 <= 250.4) return ((300 - 200) / (250.4 - 150.4) * (pm02 - 150.4) + 200); - else if (pm02 <= 350.4) return ((400 - 300) / (350.4 - 250.4) * (pm02 - 250.4) + 300); - else if (pm02 <= 500.4) return ((500 - 400) / (500.4 - 350.4) * (pm02 - 350.4) + 400); - else return 500; -}; diff --git a/examples/Open_Air_O-1PST/Open_Air_O-1PST.ino b/examples/Open_Air_O-1PST/Open_Air_O-1PST.ino new file mode 100644 index 0000000..f91a0a9 --- /dev/null +++ b/examples/Open_Air_O-1PST/Open_Air_O-1PST.ino @@ -0,0 +1,687 @@ +/* +This is the code for the AirGradient Open Air open-source hardware outdoor Air Quality Monitor with an ESP32-C3 Microcontroller. + +It is an air quality monitor for PM2.5, CO2, TVOCs, NOx, Temperature and Humidity and can send data over Wifi. + +Open source air quality monitors and kits are available: +Indoor Monitor: https://www.airgradient.com/indoor/ +Outdoor Monitor: https://www.airgradient.com/outdoor/ + +Build Instructions: https://www.airgradient.com/documentation/open-air-pst-kit-1-3/ + +The codes needs the following libraries installed: +“WifiManager by tzapu, tablatronix” tested with version 2.0.16-rc.2 +"Arduino_JSON" by Arduino Version 0.2.0 + +Please make sure you have esp32 board manager installed. Tested with version 2.0.11. + +Important flashing settings: +- Set board to "ESP32C3 Dev Module" +- Enable "USB CDC On Boot" +- Flash frequency "80Mhz" +- Flash mode "QIO" +- Flash size "4MB" +- Partition scheme "Default 4MB with spiffs (1.2MB APP/1,5MB SPIFFS)" +- JTAG adapter "Disabled" + +If you have any questions please visit our forum at +https://forum.airgradient.com/ + +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License + +*/ + +#include +#include +#include +#include +#include +#include + +/** + * + * @brief Application state machine state + * + */ +enum { + APP_SM_WIFI_MANAGER_MODE, /** In WiFi Manger Mode */ + APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE, /** WiFi Manager has connected to mobile + phone */ + APP_SM_WIFI_MANAGER_STA_CONNECTING, /** After SSID and PW entered and OK + clicked, connection to WiFI network is + attempted*/ + APP_SM_WIFI_MANAGER_STA_CONNECTED, /** Connecting to WiFi worked */ + APP_SM_WIFI_OK_SERVER_CONNECTING, /** Once connected to WiFi an attempt to + reach the server is performed */ + APP_SM_WIFI_OK_SERVER_CONNNECTED, /** Server is reachable, all fine */ + /** Exceptions during WIFi Setup */ + APP_SM_WIFI_MANAGER_CONNECT_FAILED, /** Cannot connect to WiFi (e.g. wrong + password, WPA Enterprise etc.) */ + APP_SM_WIFI_OK_SERVER_CONNECT_FAILED, /** Connected to WiFi but server not + reachable, e.g. firewall block/ + whitelisting needed etc. */ + APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED, /** Server reachable but sensor + not configured correctly*/ + + /** During Normal Operation */ + APP_SM_WIFI_LOST, /** Connection to WiFi network failed credentials incorrect + encryption not supported etc. */ + APP_SM_SERVER_LOST, /** Connected to WiFi network but the server cannot be + reached through the internet, e.g. blocked by firewall + */ + APP_SM_SENSOR_CONFIG_FAILED, /** Server is reachable but there is some + configuration issue to be fixed on the server + side */ + APP_SM_NORMAL, +}; + +#define DEBUG true + +#define WIFI_CONNECT_COUNTDOWN_MAX 180 /** sec */ +#define WIFI_HOTSPOT_PASSWORD_DEFAULT "cleanair" + +AirGradient ag(BOARD_OUTDOOR_MONITOR_V1_3); + +// time in seconds needed for NOx conditioning +uint16_t conditioning_s = 10; + +String APIROOT = "http://hw.airgradient.com/"; + +typedef struct { + bool inF; /** Temperature unit */ + bool inUSAQI; /** PMS standard */ + uint8_t ledBarMode; /** @ref UseLedBar*/ + char model[16]; /** Model string value, Just define, don't know how much + memory usage */ + char mqttBroker[128]; /** Mqtt broker link */ + uint32_t _check; /** Checksum configuration data */ +} ServerConfig_t; +static ServerConfig_t serverConfig; + +// set to true if you want to connect to wifi. You have 60 seconds to connect. +// Then it will go into an offline mode. +boolean connectWIFI = true; + +static int ledSmState = APP_SM_NORMAL; +static bool serverFailed = false; +static bool configFailed = false; +static bool wifiHasConfig = false; + +int loopCount = 0; + +WiFiManager wifiManager; /** wifi manager instance */ + +unsigned long currentMillis = 0; + +const int oledInterval = 5000; +unsigned long previousOled = 0; + +const int sendToServerInterval = 60000; +const int pollServerConfigInterval = 30000; +const int co2CalibCountdown = 5; /** Seconds */ +unsigned long previoussendToServer = 0; + +const int tvocInterval = 1000; +unsigned long previousTVOC = 0; +int TVOC = -1; +int NOX = -1; + +const int co2Interval = 5000; +unsigned long previousCo2 = 0; +int Co2 = 0; + +const int pmInterval = 5000; +unsigned long previousPm = 0; +int pm25 = -1; +int pm01 = -1; +int pm10 = -1; +int pm03PCount = -1; +float temp; +int hum; + +bool co2CalibrationRequest = false; +uint32_t serverConfigLoadTime = 0; +String HOTSPOT = ""; + +// const int tempHumInterval = 2500; +// unsigned long previousTempHum = 0; + +void boardInit(void); +void failedHandler(String msg); +void getServerConfig(void); +void co2Calibration(void); + +void setup() { + if (DEBUG) { + Serial.begin(115200); + } + + /** Board init */ + boardInit(); + + delay(500); + + countdown(3); + + if (connectWIFI) { + connectToWifi(); + } + + if (WiFi.status() == WL_CONNECTED) { + sendPing(); + Serial.println(F("WiFi connected!")); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + } + + getServerConfig(); + if (configFailed) { + ledSmHandler(APP_SM_SENSOR_CONFIG_FAILED); + delay(5000); + } + + ledSmHandler(APP_SM_NORMAL); +} + +void loop() { + currentMillis = millis(); + updateTVOC(); + updateCo2(); + updatePm(); + sendToServer(); + getServerConfig(); +} + +void updateTVOC() { + delay(1000); + + if (currentMillis - previousTVOC >= tvocInterval) { + previousTVOC += tvocInterval; + TVOC = ag.sgp41.getTvocIndex(); + NOX = ag.sgp41.getNoxIndex(); + } +} + +void updateCo2() { + if (currentMillis - previousCo2 >= co2Interval) { + previousCo2 += co2Interval; + Co2 = ag.s8.getCo2(); + Serial.printf("CO2: %d\r\n", Co2); + } +} + +void updatePm() { + if (currentMillis - previousPm >= pmInterval) { + previousPm += pmInterval; + if (ag.pms5003t_1.readData()) { + pm01 = ag.pms5003t_1.getPm01Ae(); + pm25 = ag.pms5003t_1.getPm25Ae(); + pm10 = ag.pms5003t_1.getPm10Ae(); + pm03PCount = ag.pms5003t_1.getPm03ParticleCount(); + temp = ag.pms5003t_1.getTemperature(); + hum = ag.pms5003t_1.getRelativeHumidity(); + } + } +} + +void sendPing() { + String payload = + "{\"wifi\":" + String(WiFi.RSSI()) + ", \"boot\":" + loopCount + "}"; + if (postToServer(payload)) { + ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNNECTED); + } else { + ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNECT_FAILED); + } + delay(5000); +} + +bool postToServer(String &payload) { + String POSTURL = APIROOT + + "sensors/airgradient:" + String(getNormalizedMac()) + + "/measures"; + WiFiClient client; + HTTPClient http; + + ag.statusLed.setOn(); + + http.begin(client, POSTURL); + http.addHeader("content-type", "application/json"); + int httpCode = http.POST(payload); + Serial.printf("Post to %s, %d\r\n", POSTURL.c_str(), httpCode); + http.end(); + + ag.statusLed.setOff(); + + return (httpCode == 200); +} + +void sendToServer() { + if (currentMillis - previoussendToServer >= sendToServerInterval) { + previoussendToServer += sendToServerInterval; + String payload = + "{\"wifi\":" + String(WiFi.RSSI()) + + (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) + + (pm01 < 0 ? "" : ", \"pm01\":" + String(pm01)) + + (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) + + (pm10 < 0 ? "" : ", \"pm10\":" + String(pm10)) + + (pm03PCount < 0 ? "" : ", \"pm003_count\":" + String(pm03PCount)) + + (TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC)) + + (NOX < 0 ? "" : ", \"nox_index\":" + String(NOX)) + + ", \"atmp\":" + String(temp) + + (hum < 0 ? "" : ", \"rhum\":" + String(hum)) + + ", \"boot\":" + loopCount + "}"; + + if (WiFi.status() == WL_CONNECTED) { + postToServer(payload); + resetWatchdog(); + loopCount++; + } else { + Serial.println("WiFi Disconnected"); + } + } +} + +void countdown(int from) { + debug("\n"); + while (from > 0) { + debug(String(from--)); + debug(" "); + delay(1000); + } + debug("\n"); +} + +void resetWatchdog() { + Serial.println("Watchdog reset"); + ag.watchdog.reset(); +} + +bool wifiMangerClientConnected(void) { + return WiFi.softAPgetStationNum() ? true : false; +} + +// Wifi Manager +void connectToWifi() { + HOTSPOT = "airgradient-" + String(getNormalizedMac()); + + wifiManager.setConfigPortalBlocking(false); + wifiManager.setTimeout(WIFI_CONNECT_COUNTDOWN_MAX); + + wifiManager.setAPCallback([](WiFiManager *obj) { + /** This callback if wifi connnected failed and try to start configuration + * portal */ + ledSmState = APP_SM_WIFI_MANAGER_MODE; + }); + wifiManager.setSaveConfigCallback([]() { + /** Wifi connected save the configuration */ + ledSmHandler(APP_SM_WIFI_MANAGER_STA_CONNECTED); + }); + wifiManager.setSaveParamsCallback([]() { + /** Wifi set connect: ssid, password */ + ledSmHandler(APP_SM_WIFI_MANAGER_STA_CONNECTING); + }); + wifiManager.autoConnect(HOTSPOT.c_str(), WIFI_HOTSPOT_PASSWORD_DEFAULT); + + xTaskCreate( + [](void *obj) { + while (wifiManager.getConfigPortalActive()) { + wifiManager.process(); + } + vTaskDelete(NULL); + }, + "wifi_cfg", 4096, NULL, 10, NULL); + + uint32_t stimer = millis(); + bool clientConnectChanged = false; + while (wifiManager.getConfigPortalActive()) { + if (WiFi.isConnected() == false) { + if (ledSmState == APP_SM_WIFI_MANAGER_MODE) { + uint32_t ms = (uint32_t)(millis() - stimer); + if (ms >= 100) { + stimer = millis(); + ledSmHandler(ledSmState); + } + } + + /** Check for client connect to change led color */ + bool clientConnected = wifiMangerClientConnected(); + if (clientConnected != clientConnectChanged) { + clientConnectChanged = clientConnected; + if (clientConnectChanged) { + ledSmHandler(APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE); + } else { + ledSmHandler(APP_SM_WIFI_MANAGER_MODE); + } + } + } + } + + /** Show display wifi connect result failed */ + if (WiFi.isConnected() == false) { + ledSmHandler(APP_SM_WIFI_MANAGER_CONNECT_FAILED); + } else { + wifiHasConfig = true; + } +} + +void debug(String msg) { + if (DEBUG) + Serial.print(msg); +} + +void debug(int msg) { + if (DEBUG) + Serial.print(msg); +} + +void debugln(String msg) { + if (DEBUG) + Serial.println(msg); +} + +void debugln(int msg) { + if (DEBUG) + Serial.println(msg); +} + +String getNormalizedMac() { + String mac = WiFi.macAddress(); + mac.replace(":", ""); + mac.toLowerCase(); + return mac; +} + +void boardInit(void) { + if (Wire.begin(ag.getI2cSdaPin(), ag.getI2cSclPin()) == false) { + failedHandler("Init I2C failed"); + } + + ag.watchdog.begin(); + + ag.button.begin(); + + ag.statusLed.begin(); + + if (ag.pms5003t_1.begin(Serial0) == false) { + failedHandler("Init PMS5003T failed"); + } + + if (ag.s8.begin(Serial1) == false) { + failedHandler("Init SenseAirS8 failed"); + } + + if (ag.sgp41.begin(Wire) == false) { + failedHandler("Init SGP41 failed"); + } +} + +void failedHandler(String msg) { + while (true) { + Serial.println(msg); + vTaskDelay(1000); + } +} + +void updateServerConfigLoadTime(void) { + serverConfigLoadTime = millis(); + if (serverConfigLoadTime == 0) { + serverConfigLoadTime = 1; + } +} + +void showConfig(void) { + Serial.println("Server configuration: "); + Serial.printf(" inF: %s\r\n", serverConfig.inF ? "true" : "false"); + Serial.printf(" inUSAQI: %s\r\n", + serverConfig.inUSAQI ? "true" : "false"); + Serial.printf("useRGBLedBar: %d\r\n", (int)serverConfig.ledBarMode); + Serial.printf(" Model: %.*s\r\n", sizeof(serverConfig.model), + serverConfig.model); + Serial.printf(" Mqtt Broker: %.*s\r\n", sizeof(serverConfig.mqttBroker), + serverConfig.mqttBroker); +} + +void getServerConfig(void) { + /** Only trigger load configuration again after pollServerConfigInterval sec + */ + if (serverConfigLoadTime) { + uint32_t ms = (uint32_t)(millis() - serverConfigLoadTime); + if (ms < pollServerConfigInterval) { + return; + } + } + + updateServerConfigLoadTime(); + + Serial.println("Trigger load server configuration"); + if (WiFi.status() != WL_CONNECTED) { + Serial.println( + "Ignore get server configuration because WIFI not connected"); + return; + } + + // WiFiClient wifiClient; + HTTPClient httpClient; + + String getUrl = "http://hw.airgradient.com/sensors/airgradient:" + + String(getNormalizedMac()) + "/one/config"; + Serial.println("HttpClient get: " + getUrl); + if (httpClient.begin(getUrl) == false) { + Serial.println("HttpClient init failed"); + updateServerConfigLoadTime(); + return; + } + + int respCode = httpClient.GET(); + + /** get failure */ + if (respCode != 200) { + Serial.printf("HttpClient get failed: %d\r\n", respCode); + updateServerConfigLoadTime(); + httpClient.end(); + configFailed = true; + return; + } + + String respContent = httpClient.getString(); + Serial.println("Server config: " + respContent); + httpClient.end(); + + /** Parse JSON */ + JSONVar root = JSON.parse(respContent); + if (JSON.typeof_(root) == "undefined") { + Serial.println("Server configura JSON invalid"); + updateServerConfigLoadTime(); + configFailed = true; + return; + } + configFailed = false; + + /** Get "country" */ + bool inF = serverConfig.inF; + if (JSON.typeof_(root["country"]) == "string") { + String country = root["country"]; + if (country == "US") { + inF = true; + } else { + inF = false; + } + } + + /** Get "pmStandard" */ + bool inUSAQI = serverConfig.inUSAQI; + if (JSON.typeof_(root["pmStandard"]) == "string") { + String standard = root["pmStandard"]; + if (standard == "ugm3") { + inUSAQI = false; + } else { + inUSAQI = true; + } + } + + /** Get CO2 "co2CalibrationRequested" */ + co2CalibrationRequest = false; + if (JSON.typeof_(root["co2CalibrationRequested"]) == "boolean") { + co2CalibrationRequest = root["co2CalibrationRequested"]; + } + + /** get "model" */ + String model = ""; + if (JSON.typeof_(root["model"]) == "string") { + String _model = root["model"]; + model = _model; + } + + /** get "mqttBrokerUrl" */ + String mqtt = ""; + if (JSON.typeof_(root["mqttBrokerUrl"]) == "string") { + String _mqtt = root["mqttBrokerUrl"]; + mqtt = _mqtt; + } + + if (inF != serverConfig.inF) { + serverConfig.inF = inF; + } + if (inUSAQI != serverConfig.inUSAQI) { + serverConfig.inUSAQI = inUSAQI; + } + if (model.length()) { + if (model != String(serverConfig.model)) { + memset(serverConfig.model, 0, sizeof(serverConfig.model)); + memcpy(serverConfig.model, model.c_str(), model.length()); + } + } + if (mqtt.length()) { + if (mqtt != String(serverConfig.mqttBroker)) { + memset(serverConfig.mqttBroker, 0, sizeof(serverConfig.mqttBroker)); + memcpy(serverConfig.mqttBroker, mqtt.c_str(), mqtt.length()); + } + } + + /** Show server configuration */ + showConfig(); + + /** Calibration */ + if (co2CalibrationRequest) { + co2Calibration(); + } +} + +void co2Calibration(void) { + /** Count down for co2CalibCountdown secs */ + for (int i = 0; i < co2CalibCountdown; i++) { + Serial.printf("Start CO2 calib after %d sec\r\n", co2CalibCountdown - i); + delay(1000); + } + + if (ag.s8.setBaselineCalibration()) { + Serial.println("Calibration success"); + delay(1000); + Serial.println("Wait for calib finish..."); + int count = 0; + while (ag.s8.isBaseLineCalibrationDone() == false) { + delay(1000); + count++; + } + Serial.printf("Calib finish after %d sec\r\n", count); + delay(2000); + } else { + Serial.println("Calibration failure!!!"); + delay(2000); + } +} + +void ledSmHandler(int sm) { + if (sm > APP_SM_NORMAL) { + return; + } + + ledSmState = sm; + switch (sm) { + case APP_SM_WIFI_MANAGER_MODE: { + ag.statusLed.setToggle(); + break; + } + case APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE: { + ag.statusLed.setOn(); + break; + } + case APP_SM_WIFI_MANAGER_STA_CONNECTING: { + ag.statusLed.setOff(); + break; + } + case APP_SM_WIFI_MANAGER_STA_CONNECTED: { + ag.statusLed.setOff(); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNECTING: { + ag.statusLed.setOff(); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNNECTED: { + ag.statusLed.setOff(); + ag.statusLed.setOn(); + delay(50); + ag.statusLed.setOff(); + delay(950); + ag.statusLed.setOn(); + delay(50); + ag.statusLed.setOff(); + break; + } + case APP_SM_WIFI_MANAGER_CONNECT_FAILED: { + ag.statusLed.setOff(); + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 3 * 2; i++) { + ag.statusLed.setToggle(); + delay(100); + } + delay(2000); + } + ag.statusLed.setOff(); + break; + } + case APP_SM_WIFI_OK_SERVER_CONNECT_FAILED: { + ag.statusLed.setOff(); + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 4 * 2; i++) { + ag.statusLed.setToggle(); + delay(100); + } + delay(2000); + } + ag.statusLed.setOff(); + break; + } + case APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED: { + ag.statusLed.setOff(); + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 5 * 2; i++) { + ag.statusLed.setToggle(); + delay(100); + } + delay(2000); + } + ag.statusLed.setOff(); + break; + } + case APP_SM_WIFI_LOST: { + ag.statusLed.setOff(); + break; + } + case APP_SM_SERVER_LOST: { + ag.statusLed.setOff(); + break; + } + case APP_SM_SENSOR_CONFIG_FAILED: { + ag.statusLed.setOff(); + break; + } + case APP_SM_NORMAL: { + ag.statusLed.setOff(); + break; + } + default: + break; + } +} diff --git a/examples/PM2_SIMPLE/PM2_SIMPLE.ino b/examples/PM2_SIMPLE/PM2_SIMPLE.ino deleted file mode 100644 index b88ee58..0000000 --- a/examples/PM2_SIMPLE/PM2_SIMPLE.ino +++ /dev/null @@ -1,54 +0,0 @@ -/* -This is the code for the AirGradient DIY Air Quality Sensor with an ESP8266 Microcontroller. - -It is a high quality sensor showing PM2.5, CO2, Temperature and Humidity on a small display and can send data over Wifi. - -For build instructions please visit https://www.airgradient.com/open-airgradient/instructions/ - -Compatible with the following sensors: -Plantower PMS5003 (Fine Particle Sensor) - -Please install ESP8266 board manager (tested with version 3.0.0) - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -Kits with all required components are available at https://www.airgradient.com/open-airgradient/shop/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License -*/ - -#include - -AirGradient ag = AirGradient(); - -void setup() { - Serial.begin(115200); - ag.PMS_Init(); -} - -void loop() { - - int PM2 = ag.getPM2_Raw(); - - Serial.print("PM2.5 in ug/m3: "); - Serial.println(String(PM2)); - - Serial.print("PM2.5 in US AQI: "); - Serial.println(String(PM_TO_AQI_US(PM2))); - - delay(5000); -} - -int PM_TO_AQI_US(int pm02) { - if (pm02 <= 12.0) return ((50 - 0) / (12.0 - .0) * (pm02 - .0) + 0); - else if (pm02 <= 35.4) return ((100 - 50) / (35.4 - 12.0) * (pm02 - 12.0) + 50); - else if (pm02 <= 55.4) return ((150 - 100) / (55.4 - 35.4) * (pm02 - 35.4) + 100); - else if (pm02 <= 150.4) return ((200 - 150) / (150.4 - 55.4) * (pm02 - 55.4) + 150); - else if (pm02 <= 250.4) return ((300 - 200) / (250.4 - 150.4) * (pm02 - 150.4) + 200); - else if (pm02 <= 350.4) return ((400 - 300) / (350.4 - 250.4) * (pm02 - 250.4) + 300); - else if (pm02 <= 500.4) return ((500 - 400) / (500.4 - 350.4) * (pm02 - 350.4) + 400); - else return 500; -}; diff --git a/examples/SHT_SIMPLE/SHT_SIMPLE.ino b/examples/SHT_SIMPLE/SHT_SIMPLE.ino deleted file mode 100644 index 13108a6..0000000 --- a/examples/SHT_SIMPLE/SHT_SIMPLE.ino +++ /dev/null @@ -1,45 +0,0 @@ -/* -This is the code for the AirGradient DIY Air Quality Sensor with an ESP8266 Microcontroller. - -It is a high quality sensor showing PM2.5, CO2, Temperature and Humidity on a small display and can send data over Wifi. - -For build instructions please visit https://www.airgradient.com/open-airgradient/instructions/ - -Compatible with the following sensors: -SHT30/31 (Temperature/Humidity Sensor) - -Please install ESP8266 board manager (tested with version 3.0.0) - -If you are a school or university contact us for a free trial on the AirGradient platform. -https://www.airgradient.com/ - -Kits with all required components are available at https://www.airgradient.com/open-airgradient/shop/ - -If you have any questions please visit our forum at https://forum.airgradient.com/ - -CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License -*/ - -#include -AirGradient ag = AirGradient(); - -void setup(){ - Serial.begin(115200); - ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44 -} - -void loop(){ - - TMP_RH result = ag.periodicFetchData(); - - Serial.print("Relative Humidity in %: "); - Serial.println(result.rh); - - Serial.print(" Temperature in Celcius: "); - Serial.println(result.t); - - Serial.print(" Temperature in Fahrenheit: "); - Serial.println((result.t * 9 / 5) + 32); - - delay(5000); -} diff --git a/examples/TestCO2/TestCO2.ino b/examples/TestCO2/TestCO2.ino new file mode 100644 index 0000000..d7c4e32 --- /dev/null +++ b/examples/TestCO2/TestCO2.ino @@ -0,0 +1,43 @@ +/* +This is sample code for the AirGradient library with a minimal implementation to read CO2 values from the SenseAir S8 sensor. + +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License +*/ + +#include + +#ifdef ESP8266 +AirGradient ag = AirGradient(BOARD_DIY_PRO_INDOOR_V4_2); +// AirGradient ag = AirGradient(BOARD_DIY_BASIC_KIT); +#else +// AirGradient ag = AirGradient(BOARD_ONE_INDOOR_MONITOR_V9_0); +AirGradient ag = AirGradient(BOARD_OUTDOOR_MONITOR_V1_3); +#endif + +void failedHandler(String msg); + +void setup() { + Serial.begin(115200); + + /** Init CO2 sensor */ +#ifdef ESP8266 + if (ag.s8.begin(&Serial) == false) { +#else + if (ag.s8.begin(Serial1) == false) { +#endif + failedHandler("SenseAir S8 init failed"); + } +} + +void loop() { + int CO2 = ag.s8.getCo2(); + Serial.printf("CO2: %d\r\n", CO2); + delay(5000); +} + +void failedHandler(String msg) { + while (true) { + Serial.println(msg); + delay(1000); + } +} diff --git a/examples/TestESP32/TestESP32.ino b/examples/TestESP32/TestESP32.ino new file mode 100644 index 0000000..e548d0f --- /dev/null +++ b/examples/TestESP32/TestESP32.ino @@ -0,0 +1,369 @@ +#include +#include +#include + +/** + * AirGradient use ESP32C3 has default Serial0 use for PMS5003, to print log + * should use esp-hal-log instead. + */ +#include + +/** + * @brief Define test board + */ +#define TEST_BOARD_OUTDOOR_MONITOR_V1_3 0 +#define TEST_BOARD_ONE_INDOOR_MONITOR_V9_0 1 +/** + * @brief Define test sensor + */ +#define TEST_SENSOR_SenseAirS8 0 +#define TEST_SENSOR_SHT4x 0 +#define TEST_SENSOR_SGP4x 0 +#define TEST_SWITCH 0 +#define TEST_OLED 0 +#if TEST_BOARD_OUTDOOR_MONITOR_V1_3 +#define TEST_STATUS_LED 0 +#define TEST_PMS5003T 1 +#endif +#define TEST_WATCHDOG 1 + +#if TEST_BOARD_ONE_INDOOR_MONITOR_V9_0 +#define TEST_LED_BAR 1 +#define TEST_SENSOR_PMS5003 0 +#endif + +#if TEST_BOARD_OUTDOOR_MONITOR_V1_3 +AirGradient ag(BOARD_OUTDOOR_MONITOR_V1_3); +#elif TEST_BOARD_ONE_INDOOR_MONITOR_V9_0 +AirGradient ag(BOARD_ONE_INDOOR_MONITOR_V9_0); +#else +#error "Must enable board test +#endif + +void setup() { + + /** Print All AirGradient board define */ + printBoardDef(NULL); + +#if TEST_SENSOR_SenseAirS8 + /** Cause Serial is use default for PMS, CO2S8 should be use Serial 1 + * Serial 1 will be init by SenseAirS8 don't need to init any more on user + * code + */ + if (ag.s8.begin(Serial1)) { + log_i("CO2S8 sensor init success"); + } else { + log_i("CO2S8 sensor init failure"); + } + + log_i("Start baseline calib"); + if (ag.s8.setBaselineCalibration()) { + log_i("Calib success"); + } else { + log_e("Calib failure"); + } + delay(5000); // Wait for calib done +#endif + +#if TEST_SENSOR_PMS5003 + if (ag.pms5003.begin(Serial0)) { + log_i("PMS5003 sensor init success"); + } else { + log_i("PMS5003 sensor init failure"); + } +#endif + +#if TEST_PMS5003T + /** + * @brief PMS5003T_1 alway connect to Serial (esp32c3 RXD0, RXD0) + */ + if (ag.pms5003t_1.begin(Serial)) { + log_i("PMS5003T_1 sensor init success"); + } else { + log_i("PMS5003T_1 sensor init failure"); + } + + // TODO Only test without senseair s8 because it's share the UART bus +#if TEST_SENSOR_SenseAirS8 == 0 + if (ag.pms5003t_2.begin(Serial1)) { + log_i("PMS5003T_2 sensor init success"); + } else { + log_i("PMS5003T_2 sensor init failure"); + } +#endif +#endif + +#if TEST_SENSOR_SHT4x || TEST_SENSOR_SGP4x || TEST_OLED + Wire.begin(ag.getI2cSdaPin(), ag.getI2cSclPin()); +#endif + +#if TEST_SENSOR_SHT4x + + if (ag.sht.begin(Wire)) { + log_i("SHT init success"); + } else { + log_i("SHT init failed"); + } +#endif + +#if TEST_SENSOR_SGP4x + if (ag.sgp41.begin(Wire)) { + log_i("SGP init success"); + } else { + log_e("SGP init failure"); + } +#endif + +#if TEST_LED + led.begin(); +#endif + +#if TEST_SWITCH + ag.button.begin(); +#endif + +#if TEST_OLED + ag.display.begin(Wire); + ag.display.setTextSize(1); + ag.display.setCursor(0, 0); + ag.display.setTextColor(1); + ag.display.setText("180s to connect to wifi hostpost AC-xxxxx"); + ag.display.show(); +#endif + +#if TEST_STATUS_LED + ag.statusLed.begin(); +#endif + +#if TEST_LED_BAR + ag.ledBar.begin(); +#endif + +#if TEST_WATCHDOG + ag.watchdog.begin(); +#endif +} + +void loop() { + uint32_t ms; +#if TEST_SENSOR_SenseAirS8 + static uint32_t lastTime = 0; + + /** Wait for sensor ready */ + ms = (uint32_t)(millis() - lastTime); + if (ms >= 1000) { + lastTime = millis(); + log_i("CO2: %d (PPM)", ag.s8.getCo2()); + } +#endif + +#if TEST_SENSOR_PMS5003 + static uint32_t pmsTime = 0; + ms = (uint32_t)(millis() - pmsTime); + + if (ms >= 1000) { + pmsTime = millis(); + if (ag.pms5003.readData()) { + log_i("Passive mode PM 1.0 (ug/m3): %d", ag.pms5003.getPm10Ae()); + log_i("Passive mode PM 2.5 (ug/m3): %d", ag.pms5003.getPm25Ae()); + log_i("Passive mode PM 10.0 (ug/m3): %d", ag.pms5003.getPm10Ae()); + } else { + log_i("PMS sensor read failure"); + } + } +#endif + +#if TEST_PMS5003T + static uint32_t pmsTime = 0; + ms = (uint32_t)(millis() - pmsTime); + + if (ms >= 1000) { + pmsTime = millis(); + if (ag.pms5003t_1.readData()) { + log_i("PMS5003_1 PM 1.0 (ug/m3): %d", ag.pms5003t_1.getPm10Ae()); + log_i("PMS5003_1 PM 2.5 (ug/m3): %d", ag.pms5003t_1.getPm25Ae()); + log_i("PMS5003_1 PM 10.0 (ug/m3): %d", ag.pms5003t_1.getPm10Ae()); + log_i("PMS5003_1 PM 3.0 (ug/m3): %d", + ag.pms5003t_1.getPm03ParticleCount()); + log_i("Temperature : %02f °C", + ag.pms5003t_1.getTemperature()); + log_i("Humidity : %02f %%", + ag.pms5003t_1.getRelativeHumidity()); + } else { + log_i("PMS5003_1 sensor read failure"); + } + + if (ag.pms5003t_2.readData()) { + log_i("PMS5003_2 PM 1.0 (ug/m3): %d", ag.pms5003t_2.getPm10Ae()); + log_i("PMS5003_2 PM 2.5 (ug/m3): %d", ag.pms5003t_2.getPm25Ae()); + log_i("PMS5003_2 PM 10.0 (ug/m3): %d", ag.pms5003t_2.getPm10Ae()); + log_i("PMS5003_2 PM 3.0 (ug/m3): %d", + ag.pms5003t_2.getPm03ParticleCount()); + // log_i("Temperature : %02f °C", + // ag.pms5003t_1.getTemperature()); + // log_i("Humidity : %02f %%", + // ag.pms5003t_1.getRelativeHumidity()); + } else { + log_i("PMS5003_2 sensor read failure"); + } + } +#endif + +#if TEST_SENSOR_SHT4x + /** + * @brief Get SHT sensor data each 1sec + * + */ + static uint32_t shtTime = 0; + ms = (uint32_t)(millis() - shtTime); + if (ms >= 1000) { + shtTime = millis(); + log_i("Get sht temperature: %0.2f (degree celsius)", + ag.sht.getTemperature()); + log_i("Get sht temperature: %0.2f (%%)", ag.sht.getRelativeHumidity()); + } +#endif + +#if TEST_SENSOR_SGP4x + static uint32_t sgpTime; + ms = (uint32_t)(millis() - sgpTime); + if (ms >= 1000) { + sgpTime = millis(); + uint16_t rawVOC; + log_i("Get TVOC: %d", ag.sgp41.getTvocIndex()); + log_i("Get NOx: %d", ag.sgp41.getNoxIndex()); + } +#endif + +#if TEST_LED + static uint32_t ledTime; +#if TEST_BOARD_OUTDOOR_MONITOR_V1_3 + // ms = (uint32_t)(millis() - ledTime); + // if(ms >= 500) + // { + // ledTime = millis(); + // led.ledToggle(); + // } +#elif TEST_BOARD_ONE_INDOOR_MONITOR_V9_0 + + static int ledIndex; + static int ledIndexOld; + ms = (uint32_t)(millis() - ledTime); + if (ms >= 50) { + ledTime = millis(); + if (ledIndex == ledIndexOld) { + led.ledOff(); + } else { + // Turn last LED off + led.ledSetColor(0, 0, 0, ledIndexOld); + } + + // Turn new led ON + led.ledSetColor(255, 0, 0, ledIndex); + ledIndexOld = ledIndex; + ledIndex++; + if (ledIndex >= led.getNumberOfLed()) { + ledIndex = 0; + } + } +#else +#endif + +#endif + +#if TEST_SWITCH + static PushButton::State stateOld = PushButton::State::BUTTON_RELEASED; + PushButton::State state = ag.button.getState(); + if (state != stateOld) { + stateOld = state; + log_i("Button state changed: %s", ag.button.toString(state).c_str()); + if (state == PushButton::State::BUTTON_PRESSED) { + ag.statusLed.setOn(); + } else { + ag.statusLed.setOff(); + } + } +#endif + +#if TEST_LED_BAR + static uint32_t ledTime; + static uint8_t ledNum = 0; + static uint8_t ledIndex = 0; + static uint8_t ledStep = 0; + static bool ledOn = false; + + if (ledNum == 0) { + ledNum = ag.ledBar.getNumberOfLed(); + log_i("Get number of led: %d", ledNum); + if (ledNum) { + ag.ledBar.setBrighness(0xff); + for (int i = 0; i < ledNum; i++) { + // ag.ledBar.setColor(0xff, 0xff, 0xff, i); + // ag.ledBar.setColor(204, 136, 153, i); + // ag.ledBar.setColor(204, 0, 0, i); + // ag.ledBar.setColor(204, 100, 153, i); + ag.ledBar.setColor(0, 136, 255, i); + } + ag.ledBar.show(); + } + } else { + ms = (uint32_t)(millis() - ledTime); + if (ms >= 500) { + ledTime = millis(); + switch (ledStep) { + case 0: { + ag.ledBar.setColor(255, 0, 0, ledIndex); + ledIndex++; + if (ledIndex >= ledNum) { + ag.ledBar.setColor(0, 0, 0); + ledIndex = 0; + ledStep = 1; + } + ag.ledBar.show(); + break; + } + case 1: { + ledIndex++; + if (ledIndex >= ledNum) { + ag.ledBar.setColor(255, 0, 0); + ag.ledBar.show(); + ledIndex = ledNum - 1; + ledStep = 2; + } + break; + } + case 2: { + if (ledOn) { + ag.ledBar.setColor(255, 0, 0); + } else { + ag.ledBar.setColor(0, 0, 0); + } + ledOn = !ledOn; + ag.ledBar.show(); + + ledIndex--; + if (ledIndex == 0) { + ag.ledBar.setColor(0, 0, 0); + ag.ledBar.show(); + ledStep = 0; + ledIndex = 0; + } + break; + } + default: + break; + } + } + } +#endif + +#if TEST_WATCHDOG + static uint32_t wdgTime; + ms = (uint32_t)(millis() - wdgTime); + if (ms >= (1000 * 60)) { + wdgTime = millis(); + /** Reset watchdog reach 1 minutes */ + ag.watchdog.reset(); + } +#endif +} diff --git a/examples/TestESP8266/TestESP8266.ino b/examples/TestESP8266/TestESP8266.ino new file mode 100644 index 0000000..78ad5eb --- /dev/null +++ b/examples/TestESP8266/TestESP8266.ino @@ -0,0 +1,164 @@ +#include +#include + +/** + * @brief Define test board + */ +#define TEST_BOARD_DIY_BASIC_KIT 0 +#define TEST_BOARD_DIY_PRO_INDOOR_V4_2 1 + +/** + * @brief Define test sensor + */ +#define TEST_SENSOR_SenseAirS8 0 +#define TEST_SENSOR_PMS5003 0 +#define TEST_SENSOR_SHT4x 0 +#define TEST_SENSOR_SGP4x 1 +#define TEST_SWITCH 0 +#define TEST_OLED 0 + +#if TEST_BOARD_DIY_BASIC_KIT +AirGradient ag(BOARD_DIY_BASIC_KIT); +#elif TEST_BOARD_DIY_PRO_INDOOR_V4_2 +AirGradient ag(BOARD_DIY_PRO_INDOOR_V4_2); +#else +#error "Board test not defined" +#endif + +void setup() { + Serial.begin(115200); + + /** Print All AirGradient board define */ + printBoardDef(&Serial); + +#if TEST_SENSOR_SenseAirS8 + if (ag.s8.begin(&Serial) == true) { + Serial.println("CO2S8 sensor init success"); + } else { + Serial.println("CO2S8 sensor init failure"); + } + + if (ag.s8.setBaselineCalibration()) { + Serial.println("Manual calib success"); + } else { + Serial.println("Manual calib failure"); + } + delay(5000); +#endif + +#if TEST_SENSOR_PMS5003 + if (ag.pms5003.begin(&Serial) == true) { + Serial.println("PMS5003 sensor init success"); + } else { + Serial.println("PMS5003 sensor init failure"); + } +#endif + +#if TEST_SENSOR_SHT4x || TEST_SENSOR_SGP4x || TEST_OLED + Wire.begin(ag.getI2cSdaPin(), ag.getI2cSclPin()); +#endif + +#if TEST_SENSOR_SHT4x + if (ag.sht.begin(Wire, Serial)) { + Serial.println("SHT init success"); + } else { + Serial.println("SHT init failed"); + } +#endif + +#if TEST_SENSOR_SGP4x + if (ag.sgp41.begin(Wire, Serial)) { + Serial.println("SGP init succses"); + } else { + Serial.println("SGP init failure"); + } +#endif + +#if TEST_SWITCH + ag.button.begin(Serial); +#endif + +#if TEST_OLED + ag.display.begin(Wire, Serial); + ag.display.setTextSize(1); + ag.display.setCursor(0, 0); + ag.display.setTextColor(1); + ag.display.setText("Hello"); + ag.display.show(); +#endif +} + +void loop() { + uint32_t ms; +#if TEST_SENSOR_SenseAirS8 + static uint32_t lastTime = 0; + + /** Wait for sensor ready */ + // if(co2s8.isReady()) + // { + // Get sensor data each 1sec + ms = (uint32_t)(millis() - lastTime); + if (ms >= 1000) { + lastTime = millis(); + Serial.printf("CO2: %d (PMM)\r\n", ag.s8.getCo2()); + } + // } +#endif + +#if TEST_SENSOR_PMS5003 + static uint32_t pmsTime = 0; + ms = (uint32_t)(millis() - pmsTime); + if (ms >= 1000) { + pmsTime = millis(); + if (ag.pms5003.readData()) { + Serial.printf("Passive mode PM 1.0 (ug/m3): %d\r\n", + ag.pms5003.getPm01Ae()); + Serial.printf("Passive mode PM 2.5 (ug/m3): %d\r\n", + ag.pms5003.getPm25Ae()); + Serial.printf("Passive mode PM 10.5 (ug/m3): %d\r\n", + ag.pms5003.getPm10Ae()); + } + } +#endif + +#if TEST_SENSOR_SHT4x + /** + * @brief Get SHT sensor data each 1sec + * + */ + static uint32_t shtTime = 0; + ms = (uint32_t)(millis() - shtTime); + if (ms >= 1000) { + shtTime = millis(); + float temperature, humidity; + Serial.printf("SHT Temperature: %f, Humidity: %f\r\n", + ag.sht.getTemperature(), ag.sht.getRelativeHumidity()); + } +#endif + +#if TEST_SENSOR_SGP4x + static uint32_t sgpTime; + ms = (uint32_t)(millis() - sgpTime); + + /*** + * Must call this task on loop and avoid delay on loop over 1000 ms + */ + ag.sgp41.handle(); + + if (ms >= 1000) { + sgpTime = millis(); + Serial.printf("SGP TVOC: %d, NOx: %d\r\n", ag.sgp41.getTvocIndex(), + ag.sgp41.getNoxIndex()); + } +#endif + +#if TEST_SWITCH + static PushButton::State stateOld = PushButton::State::BUTTON_RELEASED; + PushButton::State state = ag.button.getState(); + if (state != stateOld) { + stateOld = state; + Serial.printf("Button state changed: %s\r\n", + ag.button.toString(state).c_str()); + } +#endif +} diff --git a/examples/TestPM/TestPM.ino b/examples/TestPM/TestPM.ino new file mode 100644 index 0000000..2ee53b7 --- /dev/null +++ b/examples/TestPM/TestPM.ino @@ -0,0 +1,69 @@ +/* +This is sample code for the AirGradient library with a minimal implementation to read PM values from the Plantower sensor. + +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License +*/ + +#include + +#ifdef ESP8266 +AirGradient ag = AirGradient(BOARD_DIY_PRO_INDOOR_V4_2); +// AirGradient ag = AirGradient(BOARD_DIY_BASIC_KIT); +#else +// AirGradient ag = AirGradient(BOARD_ONE_INDOOR_MONITOR_V9_0); +AirGradient ag = AirGradient(BOARD_OUTDOOR_MONITOR_V1_3); +#endif + +void failedHandler(String msg); + +void setup() { + Serial.begin(115200); +#ifdef ESP8266 + if(ag.pms5003.begin(&Serial) == false) { + failedHandler("Init PMS5003 failed"); + } +#else + if (ag.getBoardType() == BOARD_OUTDOOR_MONITOR_V1_3) { + if(ag.pms5003t_1.begin(Serial0) == false) { + failedHandler("Init PMS5003T failed"); + } + } else { + if(ag.pms5003.begin(Serial0) == false) { + failedHandler("Init PMS5003T failed"); + } + } +#endif +} + +void loop() { + int PM2; +#ifdef ESP8266 + PM2 = ag.pms5003.getPm25Ae(); + Serial.printf("PM2.5 in ug/m3: %d\r\n", PM2); + Serial.printf("PM2.5 in US AQI: %d\r\n", ag.pms5003.convertPm25ToUsAqi(PM2)); +#else + if (ag.getBoardType() == BOARD_OUTDOOR_MONITOR_V1_3) { + PM2 = ag.pms5003t_1.getPm25Ae(); + } else { + PM2 = ag.pms5003.getPm25Ae(); + } + + Serial.printf("PM2.5 in ug/m3: %d\r\n", PM2); + if (ag.getBoardType() == BOARD_OUTDOOR_MONITOR_V1_3) { + Serial.printf("PM2.5 in US AQI: %d\r\n", + ag.pms5003t_1.convertPm25ToUsAqi(PM2)); + } else { + Serial.printf("PM2.5 in US AQI: %d\r\n", + ag.pms5003.convertPm25ToUsAqi(PM2)); + } +#endif + + delay(5000); +} + +void failedHandler(String msg) { + while (true) { + Serial.println(msg); + delay(1000); + } +} diff --git a/library.properties b/library.properties index 6b27c88..224bb61 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=AirGradient Air Quality Sensor -version=2.4.15 +version=3.0.0 author=AirGradient maintainer=AirGradient -sentence=ESP8266 library for an air quality sensor featuring PM2.5, CO2, Temperature, TVOC and Humidity with OLED display. -paragraph=Air quality monitoring library supporting the Plantower PMS5003 particle sensor, the Senseair S8 CO2 sensor and the SHT3x/SHT4x sensor for humidity and temperature. Kits with all components including a nice enclosure are available in our online shop. You can also connect an OLED display or send the air quality data to the AirGradient platform or any other backend. Optionally you can connect the Sensirion SGP4x TVOC module from AirGradient. +sentence=ESP32-C3 / ESP8266 library for air quality monitor measuring PM, CO2, Temperature, TVOC and Humidity with OLED display. +paragraph=Library for the popular AirGradient open-hardware air quality monitors. Supports the Plantower PMS5003(T) particle sensors, the Senseair S8 CO2 sensor, the Sensirion SGP4x TVOC / NOx sensor and the Sensirion SHT4x temperature / humidity sensor. Monitors are available fully assembled or as kits for indoor and outdoors with very nice enclosure. You can send the air quality data to the AirGradient platform or any other backend. category=Sensors -url=https://www.airgradient.com/open-airgradient/instructions/ +url=https://www.airgradient.com/ architectures=* diff --git a/readme.txt b/readme.txt index 0d1a16e..a87347f 100644 --- a/readme.txt +++ b/readme.txt @@ -1,8 +1,47 @@ -AirGradient Arduino Library for ESP8266 (Wemos D1 MINI) +AirGradient Arduino Library for ESP8266 (Wemos D1 MINI) and ESP32 (ESP32-C3 Mini) ===================================================================================================== -Build your own low cost air quality sensor with optional display measuring PM2.5, CO2, Temperature and Humidity. +This is the code for the AirGradient open-source indoor and outdoor air quality monitors with ESP8266 / ESP32-C3 Microcontrollers. -This library makes it easy to read the sensor data from the Plantower PMS5003 PM2.5 sensor, the Senseair S8 and the SHT30/31 Temperature and Humidity sensor. Visit our DIY section for detailed build instructions and PCB layout. +More information on the air quality monitors and kits are available here: +Indoor Monitor: https://www.airgradient.com/indoor/ +Outdoor Monitor: https://www.airgradient.com/outdoor/ -https://www.airgradient.com/open-airgradient/instructions/ +This library supports the following sensor modules: +- Plantower PMS5003 +- Plantower PMS5003T +- SenseAir S8 +- Sensirion SGP41 +- Sensirion SHT40 + + +Important information +===================================================================================================== + +Make sure you have exactly the versions of libraries and boards installed as described in the comment section of the example files. + +If you have an older version of the AirGradient PCB not mentioned in the example files, please downgrade this library to version 2.4.15 to support these legacy boards. + + +Help & Support +===================================================================================================== + +If you have any questions or problems, check out our forum: https://forum.airgradient.com/ + +The following libraries have been integrated into this library for ease of use + +- Adafruit BusIO https://github.com/adafruit/Adafruit_BusIO +- Adafruit NeoPixel https://github.com/adafruit/Adafruit_NeoPixel +- Adafruit SH110X https://github.com/adafruit/Adafruit_SH110X +- Adafruit SSD1306 Wemos Mini OLED https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED +- Adafruit GFX Library https://github.com/adafruit/Adafruit-GFX-Library +- Sensirion Gas Index Algorithm https://github.com/Sensirion/arduino-gas-index-algorithm +- Sensirion Core https://github.com/Sensirion/arduino-core/ +- Sensirion I2C SGP41 https://github.com/Sensirion/arduino-i2c-sgp41 +- Sensirion I2C SHT4x https://github.com/Sensirion/arduino-i2c-sht4x +- PMS https://github.com/fu-hsi/pms + +License +===================================================================================================== + +CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License diff --git a/src/AirGradient.cpp b/src/AirGradient.cpp new file mode 100644 index 0000000..913b461 --- /dev/null +++ b/src/AirGradient.cpp @@ -0,0 +1,38 @@ +#include "AirGradient.h" + +#define AG_LIB_VER "3.0.0" + +AirGradient::AirGradient(BoardType type) + : pms5003(type), pms5003t_1(type), pms5003t_2(type), s8(type), sht(type), sgp41(type), + display(type), boardType(type), button(type), statusLed(type), + ledBar(type), watchdog(type) {} + +/** + * @brief Get pin number for I2C SDA + * + * @return int -1 if invalid + */ +int AirGradient::getI2cSdaPin(void) { + const BoardDef *bsp = getBoardDef(this->boardType); + if ((bsp == nullptr) || (bsp->I2C.supported == false)) { + return -1; + } + return bsp->I2C.sda_pin; +} + +/** + * @brief Get pin number for I2C SCL + * + * @return int -1 if invalid + */ +int AirGradient::getI2cSclPin(void) { + const BoardDef *bsp = getBoardDef(this->boardType); + if ((bsp == nullptr) || (bsp->I2C.supported == false)) { + return -1; + } + return bsp->I2C.scl_pin; +} + +String AirGradient::getVersion(void) { return AG_LIB_VER; } + +BoardType AirGradient::getBoardType(void) { return boardType; } diff --git a/src/AirGradient.h b/src/AirGradient.h new file mode 100644 index 0000000..a3fc632 --- /dev/null +++ b/src/AirGradient.h @@ -0,0 +1,76 @@ +#ifndef _AIR_GRADIENT_H_ +#define _AIR_GRADIENT_H_ + +#include "bsp/BoardDef.h" +#include "bsp/LedBar.h" +#include "bsp/PushButton.h" +#include "bsp/StatusLed.h" +#include "bsp/HardwareWatchdog.h" +#include "co2/s8.h" +#include "display/oled.h" +#include "pm/pms5003.h" +#include "pm/pms5003t.h" +#include "sgp/sgp41.h" +#include "sht/sht4x.h" + +class AirGradient { +public: + AirGradient(BoardType type); + + /** + * @brief Plantower PMS5003 sensor + */ + PMS5003 pms5003; + PMS5003T pms5003t_1; + PMS5003T pms5003t_2; + + /** + * @brief SenseAirS8 CO2 sensor + */ + S8 s8; + + /** + * @brief Temperature and humidity sensor + */ + Sht sht; + + /** + * @brief TVOC and NOx sensor + * + */ + Sgp41 sgp41; + + /** + * @brief Display + * + */ + Display display; + + /** + * @brief Push Button + */ + PushButton button; + + /** + * @brief LED + */ + StatusLed statusLed; + LedBar ledBar; + + /** + * @brief Hardware watchdog + */ + HardwareWatchdog watchdog; + + int getI2cSdaPin(void); + int getI2cSclPin(void); + + BoardType getBoardType(void); + + String getVersion(void); + +private: + BoardType boardType; +}; + +#endif /** _AIR_GRADIENT_H_ */ diff --git a/src/bsp/BoardDef.cpp b/src/bsp/BoardDef.cpp new file mode 100644 index 0000000..4c42f1f --- /dev/null +++ b/src/bsp/BoardDef.cpp @@ -0,0 +1,501 @@ +#include "BoardDef.h" +#if defined(ESP32) +#include "esp32-hal-log.h" +#endif + +const BoardDef bsps[BOARD_DEF_MAX] = { + /** BOARD_DIY_BASIC_KIT */ + [BOARD_DIY_BASIC_KIT] = + { + .SenseAirS8 = + { + .uart_tx_pin = 2, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .PMS5003 = + { + .uart_tx_pin = 14, + .uart_rx_pin = 12, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .I2C = + { + .sda_pin = 4, + .scl_pin = 5, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .SW = + { + .pin = -1, /** Not supported */ + .activeLevel = 0, /** Don't care */ + .supported = false, /** Not supported */ + }, + .LED = + { + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, + }, + .OLED = + { +#if defined(ESP8266) + .width = 64, + .height = 48, + .addr = 0x3C, + .supported = true, +#else + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#endif + }, + .WDG = + { + .resetPin = -1, + .supported = false, + }, + .name = "BOARD_DIY_BASIC_KIT", + }, + /** BOARD_DIY_PRO_INDOOR_V4_2 */ + [BOARD_DIY_PRO_INDOOR_V4_2] = + { + .SenseAirS8 = + { + .uart_tx_pin = 2, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .PMS5003 = + { + .uart_tx_pin = 14, + .uart_rx_pin = 12, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .I2C = + { + .sda_pin = 4, + .scl_pin = 5, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .SW = + { +#if defined(ESP8266) + .pin = 13, /** D7 */ + .activeLevel = 0, + .supported = true, +#else + .pin = -1, + .activeLevel = 1, + .supported = false, +#endif + }, + .LED = + { + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, + }, + .OLED = + { +#if defined(ESP8266) + .width = 128, + .height = 64, + .addr = 0x3C, + .supported = true, +#else + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#endif + }, + .WDG = + { + .resetPin = -1, + .supported = false, + }, + .name = "BOARD_DIY_PRO_INDOOR_V4_2", + }, + /** BOARD_ONE_INDOOR_MONITOR_V9_0 */ + [BOARD_ONE_INDOOR_MONITOR_V9_0] = + { + .SenseAirS8 = + { + .uart_tx_pin = 1, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + /** Use UART0 don't use define pin number */ + .PMS5003 = + { + .uart_tx_pin = -1, + .uart_rx_pin = -1, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .I2C = + { + .sda_pin = 7, + .scl_pin = 6, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .SW = + { +#if defined(ESP8266) + .pin = -1, + .activeLevel = 1, + .supported = false, +#else + .pin = 9, + .activeLevel = 0, + .supported = true, +#endif + }, + .LED = + { +#if defined(ESP8266) + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, +#else + .pin = 10, + .rgbNum = 11, + .onState = 1, + .supported = true, + .rgbSupported = true, +#endif + }, + .OLED = + { +#if defined(ESP8266) + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#else + .width = 128, + .height = 64, + .addr = 0x3C, + .supported = true, +#endif + }, + .WDG = + { +#if defined(ESP8266) + .resetPin = -1, + .supported = false, +#else + .resetPin = 2, + .supported = true, +#endif + }, + .name = "BOARD_ONE_INDOOR_MONITOR_V9_0", + }, + /** BOARD_OUTDOOR_MONITOR_V1_3 */ + [BOARD_OUTDOOR_MONITOR_V1_3] = { + .SenseAirS8 = + { + .uart_tx_pin = 1, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + /** Use UART0 don't use define pin number */ + .PMS5003 = + { + .uart_tx_pin = -1, + .uart_rx_pin = -1, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .I2C = + { + .sda_pin = 7, + .scl_pin = 6, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .SW = + { +#if defined(ESP8266) + .pin = -1, + .activeLevel = 1, + .supported = false, +#else + .pin = 9, + .activeLevel = 0, + .supported = true, +#endif + }, + .LED = + { +#if defined(ESP8266) + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, +#else + .pin = 10, + .rgbNum = 0, + .onState = 1, + .supported = true, + .rgbSupported = false, +#endif + }, + .OLED = + { +#if defined(ESP8266) + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#else + .width = 128, + .height = 64, + .addr = 0x3C, + .supported = true, +#endif + }, + .WDG = + { +#if defined(ESP8266) + .resetPin = -1, + .supported = false, +#else + .resetPin = 2, + .supported = true, +#endif + }, + .name = "BOARD_OUTDOOR_MONITOR_V1_3", + }}; + +/** + * @brief Get Board Support Package + * + * @param def Board define @ref BoardType + * @return const BoardDef* + */ +const BoardDef *getBoardDef(BoardType def) { + if (def >= BOARD_DEF_MAX) { + return NULL; + } + return &bsps[def]; +} + +#if defined(ESP8266) +#define bspPrintf(c, ...) \ + if (_debug != nullptr) { \ + _debug->printf("[BSP] " c "\r\n", ##__VA_ARGS__); \ + } +#else +#define bspPrintf(c, ...) log_i(c, ##__VA_ARGS__) +#endif + +/** + * @brief Print list of support Board and sensor + * + * @param _debug Serial debug + */ +void printBoardDef(Stream *_debug) { +#if defined(ESP8266) + if (_debug == NULL) { + return; + } +#endif + + for (int i = 0; i < BOARD_DEF_MAX; i++) { + bspPrintf("Board name: %s", bsps[i].name); + bspPrintf("\tSensor CO2 S8:"); + bspPrintf("\t\tSupported: %d", bsps[i].SenseAirS8.supported); + if (bsps[i].SenseAirS8.supported) { + bspPrintf("\t\tUART Tx: %d", bsps[i].SenseAirS8.uart_tx_pin); + bspPrintf("\t\tUART Rx: %d", bsps[i].SenseAirS8.uart_rx_pin); + } + + bspPrintf("\tSensor PMS5003:"); + bspPrintf("\t\tSupported: %d", bsps[i].PMS5003.supported); + if (bsps[i].PMS5003.supported) { + bspPrintf("\t\tUART Tx: %d", bsps[i].PMS5003.uart_tx_pin); + bspPrintf("\t\tUART Rx: %d", bsps[i].PMS5003.uart_rx_pin); + } + + bspPrintf("\tI2C"); + bspPrintf("\t\tSupported: %d", bsps[i].I2C.supported); + if (bsps[i].I2C.supported) { + bspPrintf("\t\tI2C SCL: %d", bsps[i].I2C.scl_pin); + bspPrintf("\t\tI2C SDA: %d", bsps[i].I2C.sda_pin); + } + + bspPrintf("\tSwitch"); + bspPrintf("\t\tSupported: %d", bsps[i].SW.supported); + if (bsps[i].SW.supported) { + bspPrintf("\t\tPin : %d", bsps[i].SW.pin); + bspPrintf("\t\tActive Level: %d", bsps[i].SW.activeLevel); + } + + bspPrintf("\tLED"); + bspPrintf("\t\tSupported: %d", bsps[i].LED.supported); + if (bsps[i].LED.supported) { + bspPrintf("\t\tPin : %d", bsps[i].LED.pin); + bspPrintf("\t\tRGB : %d", bsps[i].LED.rgbSupported); + if (bsps[i].LED.rgbSupported) { + bspPrintf("\t\tNumber of RGB: %d", bsps[i].LED.rgbNum); + } else { + bspPrintf("\t\tLED state ON: %d (Single LED)", bsps[i].LED.onState); + } + } + + bspPrintf("\tOLED"); + bspPrintf("\t\tSupported: %d", bsps[i].OLED.supported); + if (bsps[i].OLED.supported) { + bspPrintf("\t\tWidth : %d", bsps[i].OLED.width); + bspPrintf("\t\tHeigth : %d", bsps[i].OLED.height); + bspPrintf("\t\tI2C Addr: %d", bsps[i].OLED.addr); + } + + bspPrintf("\tWatchDog"); + bspPrintf("\t\tSupported: %d", bsps[i].WDG.supported); + if (bsps[i].OLED.supported) { + bspPrintf("\t\tReset Pin: %d", bsps[i].WDG.resetPin); + } + } +} + +bool getBoardDef_I2C_Supported(const BoardDef *bsp) { + if (bsp == nullptr) { + return false; + } + return bsp->I2C.supported; +} + +int getBoardDef_I2C_SDA(const BoardDef *bsp) { + if ((bsp == nullptr) || (bsp->I2C.supported == false)) { + return -1; + } + return bsp->I2C.sda_pin; +} + +int getBoardDef_I2C_SCL(const BoardDef *bsp) { + if ((bsp == nullptr) || (bsp->I2C.supported == false)) { + return -1; + } + return bsp->I2C.scl_pin; +} + +bool getBoardDef_SW_Supported(const BoardDef *bsp) { + if (bsp == nullptr) { + return false; + } + return bsp->SW.supported; +} + +int getBoardDef_SW_Pin(const BoardDef *bsp) { + if ((bsp == nullptr) || (bsp->SW.supported == false)) { + return -1; + } + return bsp->SW.supported; +} + +int getBoardDef_SW_ActiveLevel(const BoardDef *bsp) { + if (bsp == nullptr) { + return 0; + } + return bsp->SW.activeLevel; +} + +void AirGradientBspWdgInit(const BoardDef *bsp) { + if (bsp == nullptr) { + return; + } + if (bsp->WDG.supported) { + pinMode(bsp->WDG.resetPin, OUTPUT); + digitalWrite(bsp->WDG.resetPin, LOW); + delay(25); // Delay 25ms + digitalWrite(bsp->WDG.resetPin, HIGH); + } +} + +/** + * @brief Begin reset external watchdog. Must call @ref AirGradientBspWdgFeedEnd + * after 20 ms + * + * @param bsp + */ +void AirGradientBspWdgFeedBegin(const BoardDef *bsp) { + if (bsp == nullptr) { + return; + } + + if (bsp->WDG.supported) { + digitalWrite(bsp->WDG.resetPin, HIGH); + } +} + +/** + * @brief Call this function to finish watchdog feed after call @ref + * AirGradientBspWdgFeedBegin 25 ms + * + * @param bsp + */ +void AirGradientBspWdgFeedEnd(const BoardDef *bsp) { + if (bsp == nullptr) { + return; + } + + if (bsp->WDG.supported) { + digitalWrite(bsp->WDG.resetPin, LOW); + } +} diff --git a/src/bsp/BoardDef.h b/src/bsp/BoardDef.h new file mode 100644 index 0000000..7b62449 --- /dev/null +++ b/src/bsp/BoardDef.h @@ -0,0 +1,81 @@ +#ifndef _AIR_GRADIENT_BOARD_DEF_H_ +#define _AIR_GRADIENT_BOARD_DEF_H_ + +#include + +#if defined(ESP8266) +#define AgLog(c, ...) \ + if (this->_debugStream != nullptr) { \ + this->_debugStream->printf("[%s] " c "\r\n", this->TAG, ##__VA_ARGS__); \ + } +#else +#include +#define AgLog(c, ...) log_i(c, ##__VA_ARGS__) +#endif + +enum BoardType { + BOARD_DIY_BASIC_KIT = 0x00, + BOARD_DIY_PRO_INDOOR_V4_2 = 0x01, + BOARD_ONE_INDOOR_MONITOR_V9_0 = 0x02, + BOARD_OUTDOOR_MONITOR_V1_3 = 0x03, + BOARD_DEF_MAX +}; + +struct BoardDef { + /** Board Support CO2 SenseS8 */ + struct { + const int uart_tx_pin; /** UART tx pin */ + const int uart_rx_pin; /** UART rx pin */ + const bool supported; /** Is BSP supported for this sensor */ + } SenseAirS8; + + /** Board Support Plantower PMS5003 */ + struct { + const int uart_tx_pin; /** UART tx pin */ + const int uart_rx_pin; /** UART rx pin */ + const bool supported; /** Is BSP supported for this sensor */ + } PMS5003; + + /** I2C Bus */ + struct { + const int sda_pin; /** I2C SDA pin */ + const int scl_pin; /** I2C SCL pin */ + const bool supported; /** Is BSP supported I2C communication */ + } I2C; + + /** Switch */ + struct { + const int pin; /** Switch PIN */ + const int activeLevel; /** Switch pressed level */ + const bool supported; + } SW; + + /** LED */ + struct { + const int pin; /** Pin control */ + const int rgbNum; /** Number of RGB LED */ + const int onState; /** Single LED turn on state */ + const bool supported; /** SUpported LED */ + const bool rgbSupported; /** LED is RGB */ + } LED; + + /** OLED */ + struct { + const uint8_t width; /** Display Width */ + const uint8_t height; /** Display height */ + const uint8_t addr; /** OLED I2C address */ + const bool supported; + } OLED; + + /** Watchdog */ + struct { + const uint8_t resetPin; + const bool supported; + } WDG; + const char *name; +}; + +const BoardDef *getBoardDef(BoardType def); +void printBoardDef(Stream *_debug); + +#endif /** _AIR_GRADIENT_BOARD_DEF_H_ */ diff --git a/src/bsp/HardwareWatchdog.cpp b/src/bsp/HardwareWatchdog.cpp new file mode 100644 index 0000000..37a963c --- /dev/null +++ b/src/bsp/HardwareWatchdog.cpp @@ -0,0 +1,74 @@ +#include "HardwareWatchdog.h" + +HardwareWatchdog::HardwareWatchdog(BoardType type) : boardType(type) {} + +#if defined(ESP8266) +void HardwareWatchdog::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif + +/** + * @brief Initialize external watchdog + * + */ +void HardwareWatchdog::begin(void) { + if (this->_isInit) { + return; + } + + /** Get BSP */ + this->bsp = getBoardDef(this->boardType); + if ((this->bsp == nullptr) || (this->bsp->WDG.supported == false)) { + AgLog("Board not supported Watchdog"); + return; + } + + /** Init GPIO and first feed external watchdog */ + pinMode(this->bsp->WDG.resetPin, OUTPUT); + this->_feed(); + + this->_isInit = true; + AgLog("Inittialized"); +} + +/** + * @brief Reset Watchdog + * + */ +void HardwareWatchdog::reset(void) { + if (this->isInitInvalid()) { + return; + } + + this->_feed(); +} + +/** + * @brief Wathdog timeout + * + * @return int Millisecionds + */ +int HardwareWatchdog::getTimeout(void) { return 5 * 1000 * 60; } + +bool HardwareWatchdog::isInitInvalid(void) { + if (this->_isInit == false) { + AgLog("No-initialized"); + return true; + } + return false; +} + +/** + * @brief Reset external watchdog + * + */ +void HardwareWatchdog::_feed(void) { + digitalWrite(this->bsp->WDG.resetPin, HIGH); + delay(25); + digitalWrite(this->bsp->WDG.resetPin, LOW); + + AgLog("Reset"); +} diff --git a/src/bsp/HardwareWatchdog.h b/src/bsp/HardwareWatchdog.h new file mode 100644 index 0000000..77953ca --- /dev/null +++ b/src/bsp/HardwareWatchdog.h @@ -0,0 +1,33 @@ +#ifndef _HARDWARE_WATCHDOG_H_ +#define _HARDWARE_WATCHDOG_H_ + +#include + +#include "BoardDef.h" + +class HardwareWatchdog { +public: + HardwareWatchdog(BoardType type); +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + void begin(void); + void reset(void); + int getTimeout(void); + +private: + bool _isInit = false; + const BoardDef *bsp; + BoardType boardType; +#if defined(ESP8266) + Stream *_debugStream; + const char *TAG = "HardwareWatchdog"; +#else +#endif + + bool isInitInvalid(void); + void _feed(void); +}; + +#endif /** _HARDWARE_WATCHDOG_H_ */ diff --git a/src/bsp/LedBar.cpp b/src/bsp/LedBar.cpp new file mode 100644 index 0000000..b6747ba --- /dev/null +++ b/src/bsp/LedBar.cpp @@ -0,0 +1,126 @@ +#include "LedBar.h" + +#include "../library/Adafruit_NeoPixel/Adafruit_NeoPixel.h" + +#define pixel() ((Adafruit_NeoPixel *)this->pixels) + +#if defined(ESP8266) +void LedBar::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif +LedBar::LedBar(BoardType type) : _boardType(type) {} + +/** + * @brief LED bar initialize + * + */ +void LedBar::begin(void) { + if (this->_isInit) { + return; + } + + /** Get board support package define */ + this->_bsp = getBoardDef(this->_boardType); + if ((this->_bsp == nullptr) || (this->_bsp->LED.supported == false) || + (this->_bsp->LED.rgbNum == 0)) { + AgLog("Board Not supported or LED not available on board"); + return; + } + + /** Init pixels */ + this->pixels = new Adafruit_NeoPixel( + this->_bsp->LED.rgbNum, this->_bsp->LED.pin, NEO_GRB + NEO_KHZ800); + pixel()->begin(); + pixel()->clear(); + + this->_isInit = true; + + AgLog("Init"); +} + +/** + * @brief Set LED color, if LED is on the color update immedietly. Otherwise + * must setOn to show LED color + * + * @param red Color Red (0 - 255) + * @param green Color Green (0 - 255) + * @param blue Color Blue (0 - 255) + * @param ledNum Index of LED from 0 to getNumberOfLed() - 1 + */ +void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum) { + if (this->ledNumInvalid(ledNum)) { + return; + } + + pixel()->setPixelColor(ledNum, red, green, blue); +} + +/** + * @brief Set LED brightness apply for all LED bar + * + * @param brightness Brightness (0 - 255) + */ +void LedBar::setBrighness(uint8_t brightness) { + if (this->checkInit() == false) { + return; + } + pixel()->setBrightness(brightness); +} + +/** + * @brief Get number of LED on bar + * + * @return int Number of LED + */ +int LedBar::getNumberOfLed(void) { + if (this->checkInit() == false) { + return 0; + } + + return this->_bsp->LED.rgbNum; +} + +bool LedBar::checkInit(void) { + if (this->_isInit) { + return true; + } + AgLog("LED is not initialized"); + return false; +} + +bool LedBar::ledNumInvalid(int ledNum) { + if (this->checkInit() == false) { + return true; + } + + if ((ledNum < 0) || (ledNum >= this->_bsp->LED.rgbNum)) { + AgLog("ledNum invalid: %d", ledNum); + return true; + } + return false; +} + +void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue) { + for (int ledNum = 0; ledNum < this->_bsp->LED.rgbNum; ledNum++) { + this->setColor(red, green, blue, ledNum); + } +} + +/** + * @brief Call to turn LED on/off base on the setting color + * + */ +void LedBar::show(void) { + if (pixel()->canShow()) { + pixel()->show(); + } +} + +/** + * @brief Set all LED to off color (r,g,b) = (0,0,0) + * + */ +void LedBar::clear(void) { pixel()->clear(); } diff --git a/src/bsp/LedBar.h b/src/bsp/LedBar.h new file mode 100644 index 0000000..a682a06 --- /dev/null +++ b/src/bsp/LedBar.h @@ -0,0 +1,38 @@ +#ifndef _AIR_GRADIENT_LED_H_ +#define _AIR_GRADIENT_LED_H_ + +#include + +#include "BoardDef.h" + +class LedBar { +public: +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + LedBar(BoardType type); + void begin(void); + void setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum); + void setColor(uint8_t red, uint8_t green, uint8_t blue); + void setBrighness(uint8_t brightness); + int getNumberOfLed(void); + void show(void); + void clear(void); + +private: + const BoardDef *_bsp; + bool _isInit = false; + uint8_t _ledState = 0; + BoardType _boardType; + void *pixels = nullptr; +#if defined(ESP8266) + Stream *_debugStream = NULL; + const char *TAG = "LED"; +#else +#endif + bool checkInit(void); + bool ledNumInvalid(int ledNum); +}; + +#endif /** _AIR_GRADIENT_LED_H_ */ diff --git a/src/bsp/PushButton.cpp b/src/bsp/PushButton.cpp new file mode 100644 index 0000000..627219c --- /dev/null +++ b/src/bsp/PushButton.cpp @@ -0,0 +1,73 @@ +#include "PushButton.h" + +PushButton::PushButton(BoardType type) : _boardType(type) {} + +#if defined(ESP8266) +void PushButton::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif + +/** + * @brief Initialize PushButton, If PushButton is not initialized the get state + * + */ +void PushButton::begin(void) { + if (this->_isInit) { + return; + } + + this->_bsp = getBoardDef(this->_boardType); + if ((this->_bsp == nullptr) || (this->_bsp->SW.supported == false)) { + AgLog("Board not supported or switch not available"); + return; + } + + if (this->_boardType == BOARD_DIY_PRO_INDOOR_V4_2) { + pinMode(this->_bsp->SW.pin, INPUT_PULLUP); + } else { + pinMode(this->_bsp->SW.pin, INPUT); + } + + this->_isInit = true; + AgLog("Init"); +} + +/** + * @brief Get button state, Alway retrun State::BUTTON_RELEASED if no-initialize + * + * @return PushButton::State + */ +PushButton::State PushButton::getState(void) { + if (this->checkInit() == false) { + return State::BUTTON_RELEASED; + } + + if (digitalRead(this->_bsp->SW.pin) == this->_bsp->SW.activeLevel) { + return State::BUTTON_PRESSED; + } + return State::BUTTON_RELEASED; +} + +/** + * @brief Get PushButton::State as string + * + * @param state Buttons State + * @return String + */ +String PushButton::toString(PushButton::State state) { + if (state == BUTTON_PRESSED) { + return "Presssed"; + } + return "Released"; +} + +bool PushButton::checkInit(void) { + if (this->_isInit) { + return true; + } + AgLog("Switch not initialized"); + return false; +} diff --git a/src/bsp/PushButton.h b/src/bsp/PushButton.h new file mode 100644 index 0000000..b59dbf3 --- /dev/null +++ b/src/bsp/PushButton.h @@ -0,0 +1,43 @@ +#ifndef _AIR_GRADIENT_SW_H_ +#define _AIR_GRADIENT_SW_H_ + +#include "BoardDef.h" +#include + +class PushButton { +public: + /** + * @brief Enum button state + */ + enum State { BUTTON_PRESSED, BUTTON_RELEASED }; + +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + PushButton(BoardType type); + void begin(void); + State getState(void); + String toString(State state); + +private: + /** BSP constant variable */ + const BoardDef *_bsp; + /** Board type */ + BoardType _boardType; + /** Is inititalize flag */ + bool _isInit = false; + + /** Special variable for ESP8266 */ +#if defined(ESP8266) + Stream *_debugStream = nullptr; + const char *TAG = "PushButton"; +#else +#endif + + /** Method */ + + bool checkInit(void); +}; + +#endif /** _AIR_GRADIENT_SW_H_ */ diff --git a/src/bsp/StatusLed.cpp b/src/bsp/StatusLed.cpp new file mode 100644 index 0000000..9c90045 --- /dev/null +++ b/src/bsp/StatusLed.cpp @@ -0,0 +1,98 @@ +#include "StatusLed.h" + +StatusLed::StatusLed(BoardType boardType) : boardType(boardType) {} + +#if defined(ESP8266) +void StatusLed::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif + +/** + * @brief Initialized LED + * + */ +void StatusLed::begin(void) { + bsp = getBoardDef(this->boardType); + if ((bsp == nullptr) || (bsp->LED.supported == false)) { + AgLog("Board not support StatusLed"); + return; + } + + pinMode(bsp->LED.pin, OUTPUT); + digitalWrite(bsp->LED.pin, !bsp->LED.onState); + + this->state = LED_OFF; + this->isInit = true; + + AgLog("Init"); +} + +/** + * @brief Turn LED on + * + */ +void StatusLed::setOn(void) { + if (this->checkInit() == false) { + return; + } + digitalWrite(bsp->LED.pin, bsp->LED.onState); + this->state = LED_ON; + AgLog("Turn ON"); +} + +/** + * @brief Turn LED off + * + */ +void StatusLed::setOff(void) { + if (this->checkInit() == false) { + return; + } + digitalWrite(bsp->LED.pin, !bsp->LED.onState); + this->state = LED_OFF; + AgLog("Turn OFF"); +} + +/** + * @brief Set LED toggle + * + */ +void StatusLed::setToggle(void) { + if (this->state == LED_ON) { + this->setOff(); + } else { + this->setOn(); + } +} + +/** + * @brief Get current LED state + * + * @return StatusLed::State + */ +StatusLed::State StatusLed::getState(void) { return this->state; } + +/** + * @brief Convert LED state to string + * + * @param state LED state + * @return String + */ +String StatusLed::toString(StatusLed::State state) { + if (state == LED_ON) { + return "On"; + } + return "Off"; +} + +bool StatusLed::checkInit(void) { + if (this->isInit == false) { + AgLog("No-Initialized"); + return false; + } + + return true; +} diff --git a/src/bsp/StatusLed.h b/src/bsp/StatusLed.h new file mode 100644 index 0000000..ee271a8 --- /dev/null +++ b/src/bsp/StatusLed.h @@ -0,0 +1,40 @@ +#ifndef _STATUS_LED_H_ +#define _STATUS_LED_H_ + +#include "BoardDef.h" +#include + +class StatusLed { +public: + enum State { + LED_OFF, + LED_ON, + }; + + StatusLed(BoardType boardType); +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + void begin(void); + void setOn(void); + void setOff(void); + void setToggle(void); + State getState(void); + String toString(StatusLed::State state); + +private: + const BoardDef *bsp = nullptr; + BoardType boardType; + bool isInit = false; + State state; +#if defined(ESP8266) + Stream *_debugStream; + const char *TAG = "StatusLed"; +#else +#endif + + bool checkInit(void); +}; + +#endif /** _STATUS_LED_H_ */ diff --git a/src/co2/mb_crc.cpp b/src/co2/mb_crc.cpp new file mode 100644 index 0000000..462cca1 --- /dev/null +++ b/src/co2/mb_crc.cpp @@ -0,0 +1,73 @@ +#include "mb_crc.h" +#include + +/* ModBus CRC routine extracted from + * https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf */ + +/* Table of CRC values for high–order byte */ +static const uint8_t auchCRCHi[] = { + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40}; + +/* Table of CRC values for low–order byte */ +static const uint8_t auchCRCLo[] = { + 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, + 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, + 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, + 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, + 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, + 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, + 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, + 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, + 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, + 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, + 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, + 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, + 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, + 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, + 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, + 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, + 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, + 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, + 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, + 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, + 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, + 0x41, 0x81, 0x80, 0x40}; + +uint16_t AgMb16Crc(uint8_t *puchMsg, uint16_t usDataLen) { + /* + puchMsg -> message to calculate CRC upon + usDataLen -> quantity of bytes in message + */ + uint8_t uchCRCHi = 0xFF; /* high byte of CRC initialized */ + uint8_t uchCRCLo = 0xFF; /* low byte of CRC initialized */ + uint16_t uIndex; /* will index into CRC lookup table */ + + while (usDataLen--) /* pass through message buffer */ + { + uIndex = uchCRCLo ^ *puchMsg++; /* calculate the CRC */ + uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex]; + uchCRCHi = auchCRCLo[uIndex]; + } + return (uchCRCHi << 8 | uchCRCLo); +} diff --git a/src/co2/mb_crc.h b/src/co2/mb_crc.h new file mode 100644 index 0000000..b15274b --- /dev/null +++ b/src/co2/mb_crc.h @@ -0,0 +1,8 @@ +#ifndef _AIR_GRADIENT_MODBUS_CRC_H_ +#define _AIR_GRADIENT_MODBUS_CRC_H_ + +#include + +uint16_t AgMb16Crc(uint8_t *buf, uint16_t len); + +#endif /** _AIR_GRADIENT_MODBUS_CRC_H_ */ diff --git a/src/co2/s8.cpp b/src/co2/s8.cpp new file mode 100644 index 0000000..53d14e9 --- /dev/null +++ b/src/co2/s8.cpp @@ -0,0 +1,796 @@ +#include "s8.h" +#include "mb_crc.h" +#if defined(ESP8266) +#include +#else +#endif + +/** + * @brief Construct a new Sense Air S 8:: Sense Air S 8 object + * + * @param def + */ +S8::S8(BoardType def) : _boardDef(def) {} + +#if defined(ESP8266) +/** + * @brief Init sensor + * @return true = success, otherwise is failure + */ +bool S8::begin(void) { + if (this->_isInit) { + AgLog("Initialized, Call end() then try again"); + return true; + } + + return this->_begin(); +} + +/** + * @brief Init sensor has print debug log, if class create without serial debug + * before it's override last define + * + * @param _debugStream Serial print debug log, NULL if don't use + * @return true = success, otherwise is failure + */ +bool S8::begin(Stream *_debugStream) { + this->_debugStream = _debugStream; + return this->begin(); +} +#else +/** + * @brief Init sensor + * + * @param serial Target Serial use for communication with sensor + * @return true Success + * @return false Failure + */ +bool S8::begin(HardwareSerial &serial) { + this->_serial = &serial; + return this->_begin(); +} +#endif + +/** + * @brief De-Initialize sensor and release peripheral resource + * + */ +void S8::end(void) { + if (this->_isInit == false) { + AgLog("Senor is not initialized"); + return; + } + + // Deinit + AgLog("De-Inititlized"); +} + +/** + * @brief Get sensor firmware version + * + * @param firmver String buffer, len = 10 char + */ +void S8::getFirmwareVersion(char firmver[]) { + if (this->isInit() == false) { + return; + } + + if (firmver == NULL) { + return; + } + + strcpy(firmver, ""); + + // Ask software version + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR29, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + snprintf(firmver, S8_LEN_FIRMVER, "%0u.%0u", buf_msg[3], buf_msg[4]); + AgLog("Firmware version: %s", firmver); + } else { + AgLog("Firmware version not available!"); + } +} + +/** + * @brief Get sensor type ID + * + * @return int32_t Return ID + */ +int32_t S8::getSensorTypeId(void) { + if (this->isInit() == false) { + return -1; + } + + int32_t sensorType = 0; + + // Ask sensor type ID (high) + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR26, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + + // Save sensor type ID (high) + sensorType = (((int32_t)buf_msg[4] << 16) & 0x00FF0000); + + // Ask sensor type ID (low) + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR27, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + sensorType |= + ((buf_msg[3] << 8) & 0x0000FF00) | (buf_msg[4] & 0x000000FF); + } else { + AgLog("Error getting sensor type ID (low)!"); + } + } else { + AgLog("Error getting sensor type ID (high)!"); + } + + return sensorType; +} + +/** + * @brief Get sensor ID + * + * @return int32_t ID + */ +int32_t S8::getSensorId(void) { + if (this->isInit() == false) { + return -1; + } + + int32_t sensorID = 0; + + // Ask sensor ID (high) + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR30, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + + // Save sensor ID (high) + sensorID = (((int32_t)buf_msg[3] << 24) & 0xFF000000) | + (((int32_t)buf_msg[4] << 16) & 0x00FF0000); + + // Ask sensor ID (low) + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR31, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + sensorID |= ((buf_msg[3] << 8) & 0x0000FF00) | (buf_msg[4] & 0x000000FF); + } else { + AgLog("Error getting sensor ID (low)!"); + } + } else { + AgLog("Error getting sensor ID (high)!"); + } + + return sensorID; +} + +/** + * @brief Get memory map version + * + * @return int16_t + */ +int16_t S8::getMemoryMapVersion(void) { + if (this->isInit() == false) { + return -1; + } + + int16_t mmVersion = 0; + + // Ask memory map version + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR28, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + mmVersion = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + AgLog("Memory map version = %d", mmVersion); + } else { + AgLog("Error getting memory map version!"); + } + + return mmVersion; +} + +/** + * @brief Get CO2 + * + * @return int16_t (PPM), -1 if invalid. + */ +int16_t S8::getCo2(void) { + if (this->isInit() == false) { + return -1; + } + + int16_t co2 = 0; + + // Ask CO2 value + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR4, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + co2 = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + AgLog("CO2 value = %d ppm", co2); + } else { + AgLog("Error getting CO2 value!"); + } + + return co2; +} + +/** + * @brief Calibration CO2 value to baseline 400(PPM) + * + * @return true Success + * @return false Failure + */ + +bool S8::setBaselineCalibration(void) { + if (this->manualCalib()) { + isCalib = true; + return true; + } + return false; +} + +/** + * @brief Wait for background calibration done + * + * @return true Done + * @return false On calib + */ +bool S8::isBaseLineCalibrationDone(void) { + if (isCalib == false) { + return true; + } + if (getAcknowledgement() & S8_MASK_CO2_BACKGROUND_CALIBRATION) { + return true; + } + return false; +} + +/** + * @brief Get output PWM value + * + * @return int16_t PWM + */ +int16_t S8::getOutputPWM(void) { + if (this->isInit() == false) { + return -1; + } + + int16_t pwm = 0; + + // Ask PWM output + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR22, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + pwm = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + AgLog("PWM output (raw) = %d", pwm); + AgLog("PWM output (to ppm, normal version) = %d PPM", + (pwm / 16383.0) * 2000.0); + } else { + AgLog("Error getting PWM output!"); + } + + return pwm; +} + +/** + * @brief Get ABC calibration period + * + * @return int16_t Hour + */ +int16_t S8::getCalibPeriodABC(void) { + if (this->isInit() == false) { + return -1; + } + + int16_t period = 0; + + // Ask ABC period + sendCommand(MODBUS_FUNC_READ_HOLDING_REGISTERS, MODBUS_HR32, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_HOLDING_REGISTERS, nb, 7)) { + period = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + AgLog("ABC period: %d hour", period); + } else { + AgLog("Error getting ABC period!"); + } + + return period; +} + +/** + * @brief Set ABC calibration period + * + * @param period Hour, 4 - 4800 hour, 0 to disable + * @return true Success + * @return false Failure + */ +bool S8::setCalibPeriodABC(int16_t period) { + if (this->isInit() == false) { + return false; + } + + uint8_t buf_msg_sent[8]; + bool result = false; + + if (period >= 0 && period <= 4800) { // 0 = disable ABC algorithm + + // Ask set ABC period + sendCommand(MODBUS_FUNC_WRITE_SINGLE_REGISTER, MODBUS_HR32, period); + + // Save bytes sent + memcpy(buf_msg_sent, buf_msg, 8); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uartReadBytes(8, S8_TIMEOUT); + + // Check response + if (memcmp(buf_msg_sent, buf_msg, 8) == 0) { + result = true; + AgLog("Successful setting of ABC period"); + } else { + AgLog("Error in setting of ABC period!"); + } + } else { + AgLog("Invalid ABC period!"); + } + + return result; +} + +/** + * @brief Manual calibration sensor, must be place sensor at clean environment + * for 5 minute before calib + * + * @return true Success + * @return false Failure + */ +bool S8::manualCalib(void) { + if (this->isInit() == false) { + return false; + } + + bool result = clearAcknowledgement(); + + if (result) { + result = sendSpecialCommand(S8_CO2_BACKGROUND_CALIBRATION); + + if (result) { + AgLog("Manual calibration in background has started"); + } else { + AgLog("Error starting manual calibration!"); + } + } + + return result; +} + +/** + * @brief Get sensor acknowlegement flags + * + * @return int16_t Flags + */ +int16_t S8::getAcknowledgement(void) { + if (this->isInit() == false) { + return -1; + } + + int16_t flags = 0; + + // Ask acknowledgement flags + sendCommand(MODBUS_FUNC_READ_HOLDING_REGISTERS, MODBUS_HR1, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_HOLDING_REGISTERS, nb, 7)) { + flags = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + } else { + AgLog("Error getting acknowledgement flags!"); + } + + return flags; +} + +/** + * @brief Clea acknowlegement flags + * + * @return true Success + * @return false Failure + */ +bool S8::clearAcknowledgement(void) { + if (this->isInit() == false) { + return false; + } + + uint8_t buf_msg_sent[8]; + bool result = false; + + // Ask clear acknowledgement flags + sendCommand(MODBUS_FUNC_WRITE_SINGLE_REGISTER, MODBUS_HR1, 0x0000); + + // Save bytes sent + memcpy(buf_msg_sent, buf_msg, 8); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uartReadBytes(8, S8_TIMEOUT); + + // Check response + if (memcmp(buf_msg_sent, buf_msg, 8) == 0) { + result = true; + AgLog("Successful clearing acknowledgement flags"); + } else { + AgLog("Error clearing acknowledgement flags!"); + } + + return result; +} + +/** + * @brief Get sensor alarm status + * + * @return int16_t Alarm status + */ +int16_t S8::getAlarmStatus(void) { + if (this->isInit() == false) { + return -1; + } + + int16_t status = 0; + + // Ask alarm status + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR2, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + status = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + } else { + AgLog("Error getting alarm status!"); + } + + return status; +} + +/** + * @brief Get sensor status + * + * @return S8::Status Sensor status + */ +S8::Status S8::getStatus(void) { + if (this->isInit() == false) { + return (Status)0; + } + + int16_t status = 0; + + // Ask meter status + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR1, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + status = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + } else { + AgLog("Error getting meter status!"); + } + + return (Status)status; +} + +/** + * @brief Get sensor output status + * + * @return int16_t Output status + */ +int16_t S8::getOutputStatus(void) { + if (this->isInit() == false) { + return -1; + } + + int16_t status = 0; + + // Ask output status + sendCommand(MODBUS_FUNC_READ_INPUT_REGISTERS, MODBUS_IR3, 0x0001); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uint8_t nb = uartReadBytes(7, S8_TIMEOUT); + + // Check response and get data + if (validResponseLenght(MODBUS_FUNC_READ_INPUT_REGISTERS, nb, 7)) { + status = ((buf_msg[3] << 8) & 0xFF00) | (buf_msg[4] & 0x00FF); + } else { + AgLog("Error getting output status!"); + } + + return status; +} + +/** + * @brief Send special command to sensor, example manual calibration + * + * @param command Command + * @return true Success + * @return false Failure + */ +bool S8::sendSpecialCommand(CalibrationSpecialComamnd command) { + if (this->isInit() == false) { + return false; + } + + uint8_t buf_msg_sent[8]; + bool result = false; + + // Ask set user special command + sendCommand(MODBUS_FUNC_WRITE_SINGLE_REGISTER, MODBUS_HR2, command); + + // Save bytes sent + memcpy(buf_msg_sent, buf_msg, 8); + + // Wait response + memset(buf_msg, 0, S8_LEN_BUF_MSG); + uartReadBytes(8, S8_TIMEOUT); + + // Check response + if (memcmp(buf_msg_sent, buf_msg, 8) == 0) { + result = true; + AgLog("Successful setting user special command"); + } else { + AgLog("Error in setting user special command!"); + } + + return result; +} + +/** + * @brief Init sensor with BSP + * + * @param bsp AirGradient BSP @ref BoardDef + * @return true + * @return false + */ +bool S8::init(const BoardDef *bsp) { + return this->init(bsp->SenseAirS8.uart_tx_pin, bsp->SenseAirS8.uart_rx_pin); +} + +/** + * @brief Init sensor + * + * @param txPin UART TX pin + * @param rxPin UART RX pin + * @return true = success, otherwise failure + */ +bool S8::init(int txPin, int rxPin) { return this->init(txPin, rxPin, 9600); } + +bool S8::_begin(void) { + const BoardDef *bsp = getBoardDef(this->_boardDef); + if (bsp == NULL) { + AgLog("Board Type not supported"); + return false; + } + + if (bsp->SenseAirS8.supported == false) { + AgLog("Board is not support this sensor"); + return false; + } + + // Init sensor + if (this->init(bsp) == false) { + return false; + } + return true; +} + +/** + * @brief Init sensor + * + * @param txPin UART TX pin + * @param rxPin UART RX pin + * @param baud UART speed + * @return true = success, otherwise failure + */ +bool S8::init(int txPin, int rxPin, uint32_t baud) { +#if defined(ESP8266) + SoftwareSerial *uart = new SoftwareSerial(txPin, rxPin); + uart->begin(baud); + this->_uartStream = uart; +#else + this->_serial->begin(baud, SERIAL_8N1, rxPin, txPin); + this->_uartStream = this->_serial; +#endif + + /** Check communication by get firmware version */ + char fwVers[11]; + this->_isInit = true; + this->getFirmwareVersion(fwVers); + if (strlen(fwVers) == 0) { + this->_isInit = false; + return false; + } + AgLog("Firmware version: %s", fwVers); + + AgLog("Sensor successfully initialized. Heating up for 10s"); + this->_isInit = true; + this->_lastInitTime = millis(); + return true; +} + +/** + * @brief Check that sensor is initialized + * + * @return true Initialized + * @return false No-Initialized + */ +bool S8::isInit(void) { + if (this->_isInit) { + return true; + } + AgLog("Sensor no-initialized"); + return false; +} + +/** + * @brief UART write + * + * @param size Number of bytes + */ +void S8::uartWriteBytes(uint8_t size) { + this->_uartStream->write(buf_msg, size); + this->_uartStream->flush(); +} + +uint8_t S8::uartReadBytes(uint8_t max_bytes, uint32_t timeout_ms) { + uint8_t nb = 0; + uint32_t stime = millis(); + while (1) { + if (this->_uartStream->available()) { + buf_msg[nb] = this->_uartStream->read(); + nb++; + if (nb >= max_bytes) { + break; + } + } + + uint32_t ms = (uint32_t)(millis() - stime); + if (ms >= timeout_ms) { + break; + } + +#if defined(ESP32) + // Relax 5ms to avoid watchdog reset + vTaskDelay(pdMS_TO_TICKS(5)); +#endif + } + return nb; +} + +/** + * @brief Check reponse + * + * @param func Modbus function code + * @param nb Number of byte + * @return true + * @return false + */ +bool S8::validResponse(uint8_t func, uint8_t nb) { + uint16_t crc16; + bool result = false; + + if (nb >= 7) { + crc16 = AgMb16Crc(buf_msg, nb - 2); + if ((buf_msg[nb - 2] == (crc16 & 0x00FF)) && + (buf_msg[nb - 1] == ((crc16 >> 8) & 0x00FF))) { + + if (buf_msg[0] == MODBUS_ANY_ADDRESS && + (buf_msg[1] == MODBUS_FUNC_READ_HOLDING_REGISTERS || + buf_msg[1] == MODBUS_FUNC_READ_INPUT_REGISTERS) && + buf_msg[2] == nb - 5) { + AgLog("Valid response"); + result = true; + } else { + AgLog("Err: Unexpected response!"); + } + } else { + AgLog("Err: Checksum/length is invalid!"); + } + } else { + AgLog("Err: Invalid length!"); + } + + return result; +} + +/** + * @brief Check response length + * + * @param func Modbus function code + * @param nb Number of bytes + * @param len Length + * @return true Success + * @return false Failure + */ +bool S8::validResponseLenght(uint8_t func, uint8_t nb, uint8_t len) { + bool result = false; + if (nb == len) { + result = validResponse(func, nb); + } else { + AgLog("Err: Unexpected length!"); + } + + return result; +} + +void S8::sendCommand(uint8_t func, uint16_t reg, uint16_t value) { + uint16_t crc16; + + if (((func == MODBUS_FUNC_READ_HOLDING_REGISTERS || + func == MODBUS_FUNC_READ_INPUT_REGISTERS) && + value >= 1) || + (func == MODBUS_FUNC_WRITE_SINGLE_REGISTER)) { + buf_msg[0] = MODBUS_ANY_ADDRESS; // Address + buf_msg[1] = func; // Function + buf_msg[2] = (reg >> 8) & 0x00FF; // High-input register + buf_msg[3] = reg & 0x00FF; // Low-input register + buf_msg[4] = (value >> 8) & 0x00FF; // High-word to read or setup + buf_msg[5] = value & 0x00FF; // Low-word to read or setup + crc16 = AgMb16Crc(buf_msg, 6); + buf_msg[6] = crc16 & 0x00FF; + buf_msg[7] = (crc16 >> 8) & 0x00FF; + uartWriteBytes(8); + } +} diff --git a/src/co2/s8.h b/src/co2/s8.h new file mode 100644 index 0000000..a0a72db --- /dev/null +++ b/src/co2/s8.h @@ -0,0 +1,129 @@ +#ifndef _S8_H_ +#define _S8_H_ + +#include "../bsp/BoardDef.h" +#include "Arduino.h" + +class S8 { +public: + const int S8_BAUDRATE = + 9600; // Device to S8 Serial baudrate (should not be changed) + const int S8_TIMEOUT = 5000ul; // Timeout for communication in milliseconds + const int S8_LEN_BUF_MSG = + 20; // Max length of buffer for communication with the sensor + const int S8_LEN_FIRMVER = 10; // Length of software version + + enum ModbusAddr { + MODBUS_ANY_ADDRESS = 0XFE, // S8 uses any address + MODBUS_FUNC_READ_HOLDING_REGISTERS = 0X03, // Read holding registers (HR) + MODBUS_FUNC_READ_INPUT_REGISTERS = 0x04, // Read input registers (IR) + MODBUS_FUNC_WRITE_SINGLE_REGISTER = 0x06, // Write single register (SR) + }; + enum ModbusRegInput { + MODBUS_IR1 = 0x0000, // MeterStatus + MODBUS_IR2 = 0x0001, // AlarmStatus + MODBUS_IR3 = 0x0002, // OutputStatus + MODBUS_IR4 = 0x0003, // Space CO2 + MODBUS_IR22 = 0x0015, // PWM Output + MODBUS_IR26 = 0x0019, // Sensor Type ID High + MODBUS_IR27 = 0x001A, // Sensor Type ID Low + MODBUS_IR28 = 0x001B, // Memory Map version + MODBUS_IR29 = 0x001C, // FW version Main.Sub + MODBUS_IR30 = 0x001D, // Sensor ID High + MODBUS_IR31 = 0x001E, // Sensor ID Low + }; + enum ModbusRegHolding { + MODBUS_HR1 = 0x0000, // Acknowledgement Register + MODBUS_HR2 = 0x0001, // Special Command Register + MODBUS_HR32 = 0x001F, // ABC Period + }; + enum Status { + S8_MASK_METER_FATAL_ERROR = 0x0001, // Fatal error + S8_MASK_METER_OFFSET_REGULATION_ERROR = 0x0002, // Offset regulation error + S8_MASK_METER_ALGORITHM_ERROR = 0x0004, // Algorithm error + S8_MASK_METER_OUTPUT_ERROR = 0x0008, // Output error + S8_MASK_METER_SELF_DIAG_ERROR = 0x0010, // Self diagnostics error + S8_MASK_METER_OUT_OF_RANGE = 0x0020, // Out of range + S8_MASK_METER_MEMORY_ERROR = 0x0040, // Memory error + S8_MASK_METER_ANY_ERROR = 0x007F, // Mask to detect the previous errors + // (fatal error ... memory error) + }; + enum OutputStatus { + S8_MASK_OUTPUT_ALARM = + 0x0001, // Alarm output status (inverted due to Open Collector) + S8_MASK_OUTPUT_PWM = 0x0002, // PWM output status (=1 -> full output) + }; + enum AcknowledgementFLags { + S8_MASK_CO2_BACKGROUND_CALIBRATION = + 0x0020, // CO2 Background calibration performed = 1 + S8_MASK_CO2_NITROGEN_CALIBRATION = + 0x0040, // CO2 Nitrogen calibration performed = 1 + }; + enum CalibrationSpecialComamnd { + S8_CO2_BACKGROUND_CALIBRATION = 0x7C06, // CO2 Background calibration + S8_CO2_ZERO_CALIBRATION = 0x7C07, // CO2 Zero calibration + }; + + S8(BoardType def); +#if defined(ESP8266) + bool begin(void); + bool begin(Stream *_serialDebug); +#else + bool begin(HardwareSerial &serial); +#endif + void end(void); + int16_t getCo2(void); + bool setBaselineCalibration(void); + bool isBaseLineCalibrationDone(void); + +private: + /** Variables */ + const char *TAG = "S8"; + uint8_t buf_msg[20]; + Stream *_debugStream; + BoardType _boardDef; + Stream *_uartStream; +#if defined(ESP32) + HardwareSerial *_serial; +#endif + bool _isInit = false; + uint32_t _lastInitTime; + bool isCalib = false; + + /** Functions */ + bool _begin(void); + bool init(const BoardDef *bsp); + bool init(int txPin, int rxPin); + bool init(int txPin, int rxPin, uint32_t baud); + bool isInit(void); + + void uartWriteBytes(uint8_t size); // Send bytes to sensor + uint8_t + uartReadBytes(uint8_t max_bytes, + uint32_t timeout_seconds); // Read received bytes from sensor + bool validResponse( + uint8_t func, + uint8_t nb); // Check if response is valid according to sent command + bool validResponseLenght( + uint8_t func, uint8_t nb, + uint8_t len); // Check if response is valid according to sent command and + // checking expected total length + void sendCommand(uint8_t func, uint16_t reg, uint16_t value); // Send command + + void getFirmwareVersion(char firmwver[]); + int32_t getSensorTypeId(void); + int32_t getSensorId(void); + int16_t getMemoryMapVersion(void); + int16_t getOutputPWM(void); + int16_t getCalibPeriodABC(void); + bool setCalibPeriodABC(int16_t period); + bool manualCalib(void); + int16_t getAcknowledgement(void); + bool clearAcknowledgement(void); + Status getStatus(void); + int16_t getAlarmStatus(void); + int16_t getOutputStatus(void); + bool sendSpecialCommand(CalibrationSpecialComamnd command); +}; + +#endif diff --git a/src/display/oled.cpp b/src/display/oled.cpp new file mode 100644 index 0000000..9c52597 --- /dev/null +++ b/src/display/oled.cpp @@ -0,0 +1,178 @@ +#include "oled.h" +#include "../library/Adafruit_SH110x/Adafruit_SH110X.h" +#include "../library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h" + +#define disp(func) \ + if (this->_boardType == BOARD_DIY_BASIC_KIT) { \ + ((Adafruit_SSD1306 *)(this->oled))->func; \ + } else { \ + ((Adafruit_SH110X *)(this->oled))->func; \ + } + +#if defined(ESP8266) +void Display::begin(TwoWire &wire, Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(wire); +} +#else +#endif + +Display::Display(BoardType type) : _boardType(type) {} + +void Display::begin(TwoWire &wire) { + this->_bsp = getBoardDef(this->_boardType); + if ((this->_bsp == nullptr) || (this->_bsp->I2C.supported == false) || + (this->_bsp->OLED.supported == false)) { + AgLog("Init failed: board not supported"); + return; + } + + /** Init OLED */ + if (this->_boardType == BOARD_DIY_BASIC_KIT) { + AgLog("Init Adafruit_SSD1306"); + Adafruit_SSD1306 *_oled = new Adafruit_SSD1306(); + _oled->begin(wire, SSD1306_SWITCHCAPVCC, this->_bsp->OLED.addr); + this->oled = _oled; + } else { + AgLog("Init Adafruit_SH1106G"); + Adafruit_SH1106G *_oled = new Adafruit_SH1106G(this->_bsp->OLED.width, this->_bsp->OLED.height, &wire); + _oled->begin(this->_bsp->OLED.addr, false); + this->oled = _oled; + } + + this->_isInit = true; + disp(clearDisplay()); + AgLog("Init"); +} + +void Display::clear(void) { + if (this->checkInit() == false) { + return; + } + disp(clearDisplay()); +} + +void Display::invertDisplay(uint8_t i) { + if (this->checkInit() == false) { + return; + } + disp(invertDisplay(i)); +} + +void Display::show() { + if (this->checkInit() == false) { + return; + } + disp(display()); +} + +void Display::setContrast(uint8_t value) { + if (this->checkInit() == false) { + return; + } + disp(setContrast(value)); +} + +void Display::drawPixel(int16_t x, int16_t y, uint16_t color) { + if (this->checkInit() == false) { + return; + } + disp(drawPixel(x, y, color)); +} + +void Display::setTextSize(int size) { + if (this->checkInit() == false) { + return; + } + disp(setTextSize(size)); +} + +void Display::setCursor(int16_t x, int16_t y) { + if (this->checkInit() == false) { + return; + } + disp(setCursor(x, y)); +} + +/** + * @brief Set Text Color + * + * @param color 0:black, 1: While + */ +void Display::setTextColor(uint16_t color) { + if (this->checkInit() == false) { + return; + } + disp(setTextColor(color)); +} + +/** + * @brief Set text foreground color and background color + * + * @param foreGroundColor Text Color (foreground color) + * @param backGroundColor Text background color + */ +void Display::setTextColor(uint16_t foreGroundColor, uint16_t backGroundColor) { + if (this->checkInit() == false) { + return; + } + disp(setTextColor(foreGroundColor, backGroundColor)); +} + +void Display::setText(String text) { + if (this->checkInit() == false) { + return; + } + disp(print(text)); +} + +void Display::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], + int16_t w, int16_t h, uint16_t color) { + if (this->checkInit() == false) { + return; + } + disp(drawBitmap(x, y, bitmap, w, h, color)); +} + +void Display::setText(const char text[]) { + if (this->checkInit() == false) { + return; + } + disp(print(text)); +} + +void Display::drawLine(int x0, int y0, int x1, int y1, uint16_t color) { + if (this->checkInit() == false) { + return; + } + disp(drawLine(x0, y0, x1, y1, color)); +} + +void Display::drawCircle(int x, int y, int r, uint16_t color) { + if (this->checkInit() == false) { + return; + } + disp(drawCircle(x, y, r, color)); +} + +void Display::drawRect(int x0, int y0, int x1, int y1, uint16_t color) { + if (this->checkInit() == false) { + return; + } + disp(drawRect(x0, y0, x1, y1, color)); +} + +bool Display::checkInit(void) { + if (this->_isInit) { + return true; + } + AgLog("OLED is not init"); + return false; +} + +void Display::setRotation(uint8_t r) { + if (checkInit() == false) { + return; + } + disp(setRotation(r)); +} diff --git a/src/display/oled.h b/src/display/oled.h new file mode 100644 index 0000000..70739ee --- /dev/null +++ b/src/display/oled.h @@ -0,0 +1,52 @@ +#ifndef _AIR_GRADIENT_OLED_H_ +#define _AIR_GRADIENT_OLED_H_ + +#include "../bsp/BoardDef.h" +#include +#include + +class Display { +public: + const uint16_t COLOR_WHILTE = 1; + const uint16_t COLOR_BLACK = 0; +#if defined(ESP8266) + void begin(TwoWire &wire, Stream &debugStream); +#else +#endif + Display(BoardType type); + void begin(TwoWire &wire); + + void clear(void); // .clear + void invertDisplay(uint8_t i); + void show(); // .show() + + void setContrast(uint8_t value); + void drawPixel(int16_t x, int16_t y, uint16_t color); + void setTextSize(int size); + void setCursor(int16_t x, int16_t y); + void setTextColor(uint16_t color); + void setTextColor(uint16_t foreGroundColor, uint16_t backGroundColor); + void setText(String text); + void setText(const char text[]); + void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, + int16_t h, uint16_t color); + void drawLine(int x0, int y0, int x1, int y1, uint16_t color); + void drawCircle(int x, int y, int r, uint16_t color); + void drawRect(int x0, int y0, int x1, int y1, uint16_t color); + void setRotation(uint8_t r); + +private: + BoardType _boardType; + const BoardDef *_bsp = nullptr; + void *oled; + bool _isInit = false; +#if defined(ESP8266) + const char *TAG = "oled"; + Stream *_debugStream = nullptr; +#else + +#endif + bool checkInit(void); +}; + +#endif /** _AIR_GRADIENT_OLED_H_ */ diff --git a/src/library/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md b/src/library/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..f0e2614 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,46 @@ +Thank you for opening an issue on an Adafruit Arduino library repository. To +improve the speed of resolution please review the following guidelines and +common troubleshooting steps below before creating the issue: + +- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use + the forums at http://forums.adafruit.com to ask questions and troubleshoot why + something isn't working as expected. In many cases the problem is a common issue + that you will more quickly receive help from the forum community. GitHub issues + are meant for known defects in the code. If you don't know if there is a defect + in the code then start with troubleshooting on the forum first. + +- **If following a tutorial or guide be sure you didn't miss a step.** Carefully + check all of the steps and commands to run have been followed. Consult the + forum if you're unsure or have questions about steps in a guide/tutorial. + +- **For Arduino projects check these very common issues to ensure they don't apply**: + + - For uploading sketches or communicating with the board make sure you're using + a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes + very hard to tell the difference between a data and charge cable! Try using the + cable with other devices or swapping to another cable to confirm it is not + the problem. + + - **Be sure you are supplying adequate power to the board.** Check the specs of + your board and plug in an external power supply. In many cases just + plugging a board into your computer is not enough to power it and other + peripherals. + + - **Double check all soldering joints and connections.** Flakey connections + cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. + + - **Ensure you are using an official Arduino or Adafruit board.** We can't + guarantee a clone board will have the same functionality and work as expected + with this code and don't support them. + +If you're sure this issue is a defect in the code and checked the steps above +please fill in the following fields to provide enough troubleshooting information. +You may delete the guideline and text above to just leave the following details: + +- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** + +- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO + VERSION HERE** + +- List the steps to reproduce the problem below (if possible attach a sketch or + copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/src/library/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md b/src/library/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7b641eb --- /dev/null +++ b/src/library/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +Thank you for creating a pull request to contribute to Adafruit's GitHub code! +Before you open the request please review the following guidelines and tips to +help it be more easily integrated: + +- **Describe the scope of your change--i.e. what the change does and what parts + of the code were modified.** This will help us understand any risks of integrating + the code. + +- **Describe any known limitations with your change.** For example if the change + doesn't apply to a supported platform of the library please mention it. + +- **Please run any tests or examples that can exercise your modified code.** We + strive to not break users of the code and running tests/examples helps with this + process. + +Thank you again for contributing! We will try to test and integrate the change +as soon as we can, but be aware we have many GitHub repositories to manage and +can't immediately respond to every request. There is no need to bump or check in +on a pull request (it will clutter the discussion of the request). + +Also don't be worried if the request is closed or not integrated--sometimes the +priorities of Adafruit's GitHub code (education, ease of use) might not match the +priorities of the pull request. Don't fret, the open source community thrives on +forks and GitHub makes it easy to keep your changes in a forked repo. + +After reviewing the guidelines above you can delete this text from the pull request. diff --git a/src/library/Adafruit-GFX-Library/.github/workflows/githubci.yml b/src/library/Adafruit-GFX-Library/.github/workflows/githubci.yml new file mode 100644 index 0000000..a04a162 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/.github/workflows/githubci.yml @@ -0,0 +1,36 @@ +name: Arduino Library CI + +on: [pull_request, push, repository_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/setup-python@v4 + with: + python-version: '3.x' + - uses: actions/checkout@v3 + - uses: actions/checkout@v3 + with: + repository: adafruit/ci-arduino + path: ci + + - name: pre-install + run: bash ci/actions_install.sh + + - name: extra libraries + run: | + git clone --quiet https://github.com/adafruit/Adafruit_ILI9341.git /home/runner/Arduino/libraries/Adafruit_ILI9341 + + - name: test platforms + run: python3 ci/build_platform.py main_platforms + + - name: clang + run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . + + - name: doxygen + env: + GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} + PRETTYNAME : "Adafruit GFX Library" + run: bash ci/doxy_gen_and_deploy.sh diff --git a/src/library/Adafruit-GFX-Library/.gitignore b/src/library/Adafruit-GFX-Library/.gitignore new file mode 100644 index 0000000..469bb73 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/.gitignore @@ -0,0 +1,6 @@ +default.vim +fontconvert/fontconvert +# Our handy .gitignore for automation ease +Doxyfile* +doxygen_sqlite3.db +html \ No newline at end of file diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GFX.cpp b/src/library/Adafruit-GFX-Library/Adafruit_GFX.cpp new file mode 100644 index 0000000..af98900 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Adafruit_GFX.cpp @@ -0,0 +1,2669 @@ +/* +This is the core graphics library for all our displays, providing a common +set of graphics primitives (points, lines, circles, etc.). It needs to be +paired with a hardware-specific library for each display device we carry +(to handle the lower-level functions). + +Adafruit invests time and resources providing this open source code, please +support Adafruit & open-source hardware by purchasing products from Adafruit! + +Copyright (c) 2013 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Adafruit_GFX.h" +#include "glcdfont.c" +#ifdef __AVR__ +#include +#elif defined(ESP8266) || defined(ESP32) +#include +#endif + +// Many (but maybe not all) non-AVR board installs define macros +// for compatibility with existing PROGMEM-reading AVR code. +// Do our own checks and defines here for good measure... + +#ifndef pgm_read_byte +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#endif +#ifndef pgm_read_word +#define pgm_read_word(addr) (*(const unsigned short *)(addr)) +#endif +#ifndef pgm_read_dword +#define pgm_read_dword(addr) (*(const unsigned long *)(addr)) +#endif + +// Pointers are a peculiar case...typically 16-bit on AVR boards, +// 32 bits elsewhere. Try to accommodate both... + +#if !defined(__INT_MAX__) || (__INT_MAX__ > 0xFFFF) +#define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr)) +#else +#define pgm_read_pointer(addr) ((void *)pgm_read_word(addr)) +#endif + +inline GFXglyph *pgm_read_glyph_ptr(const GFXfont *gfxFont, uint8_t c) { +#ifdef __AVR__ + return &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[c]); +#else + // expression in __AVR__ section may generate "dereferencing type-punned + // pointer will break strict-aliasing rules" warning In fact, on other + // platforms (such as STM32) there is no need to do this pointer magic as + // program memory may be read in a usual way So expression may be simplified + return gfxFont->glyph + c; +#endif //__AVR__ +} + +inline uint8_t *pgm_read_bitmap_ptr(const GFXfont *gfxFont) { +#ifdef __AVR__ + return (uint8_t *)pgm_read_pointer(&gfxFont->bitmap); +#else + // expression in __AVR__ section generates "dereferencing type-punned pointer + // will break strict-aliasing rules" warning In fact, on other platforms (such + // as STM32) there is no need to do this pointer magic as program memory may + // be read in a usual way So expression may be simplified + return gfxFont->bitmap; +#endif //__AVR__ +} + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef _swap_int16_t +#define _swap_int16_t(a, b) \ + { \ + int16_t t = a; \ + a = b; \ + b = t; \ + } +#endif + +/**************************************************************************/ +/*! + @brief Instatiate a GFX context for graphics! Can only be done by a + superclass + @param w Display width, in pixels + @param h Display height, in pixels +*/ +/**************************************************************************/ +Adafruit_GFX::Adafruit_GFX(int16_t w, int16_t h) : WIDTH(w), HEIGHT(h) { + _width = WIDTH; + _height = HEIGHT; + rotation = 0; + cursor_y = cursor_x = 0; + textsize_x = textsize_y = 1; + textcolor = textbgcolor = 0xFFFF; + wrap = true; + _cp437 = false; + gfxFont = NULL; +} + +/**************************************************************************/ +/*! + @brief Write a line. Bresenham's algorithm - thx wikpedia + @param x0 Start point x coordinate + @param y0 Start point y coordinate + @param x1 End point x coordinate + @param y1 End point y coordinate + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + uint16_t color) { +#if defined(ESP8266) + yield(); +#endif + int16_t steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + _swap_int16_t(x0, y0); + _swap_int16_t(x1, y1); + } + + if (x0 > x1) { + _swap_int16_t(x0, x1); + _swap_int16_t(y0, y1); + } + + int16_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int16_t err = dx / 2; + int16_t ystep; + + if (y0 < y1) { + ystep = 1; + } else { + ystep = -1; + } + + for (; x0 <= x1; x0++) { + if (steep) { + writePixel(y0, x0, color); + } else { + writePixel(x0, y0, color); + } + err -= dy; + if (err < 0) { + y0 += ystep; + err += dx; + } + } +} + +/**************************************************************************/ +/*! + @brief Start a display-writing routine, overwrite in subclasses. +*/ +/**************************************************************************/ +void Adafruit_GFX::startWrite() {} + +/**************************************************************************/ +/*! + @brief Write a pixel, overwrite in subclasses if startWrite is defined! + @param x x coordinate + @param y y coordinate + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::writePixel(int16_t x, int16_t y, uint16_t color) { + drawPixel(x, y, color); +} + +/**************************************************************************/ +/*! + @brief Write a perfectly vertical line, overwrite in subclasses if + startWrite is defined! + @param x Top-most x coordinate + @param y Top-most y coordinate + @param h Height in pixels + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::writeFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + // Overwrite in subclasses if startWrite is defined! + // Can be just writeLine(x, y, x, y+h-1, color); + // or writeFillRect(x, y, 1, h, color); + drawFastVLine(x, y, h, color); +} + +/**************************************************************************/ +/*! + @brief Write a perfectly horizontal line, overwrite in subclasses if + startWrite is defined! + @param x Left-most x coordinate + @param y Left-most y coordinate + @param w Width in pixels + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::writeFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + // Overwrite in subclasses if startWrite is defined! + // Example: writeLine(x, y, x+w-1, y, color); + // or writeFillRect(x, y, w, 1, color); + drawFastHLine(x, y, w, color); +} + +/**************************************************************************/ +/*! + @brief Write a rectangle completely with one color, overwrite in + subclasses if startWrite is defined! + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param w Width in pixels + @param h Height in pixels + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + // Overwrite in subclasses if desired! + fillRect(x, y, w, h, color); +} + +/**************************************************************************/ +/*! + @brief End a display-writing routine, overwrite in subclasses if + startWrite is defined! +*/ +/**************************************************************************/ +void Adafruit_GFX::endWrite() {} + +/**************************************************************************/ +/*! + @brief Draw a perfectly vertical line (this is often optimized in a + subclass!) + @param x Top-most x coordinate + @param y Top-most y coordinate + @param h Height in pixels + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + startWrite(); + writeLine(x, y, x, y + h - 1, color); + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a perfectly horizontal line (this is often optimized in a + subclass!) + @param x Left-most x coordinate + @param y Left-most y coordinate + @param w Width in pixels + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + startWrite(); + writeLine(x, y, x + w - 1, y, color); + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Fill a rectangle completely with one color. Update in subclasses if + desired! + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param w Width in pixels + @param h Height in pixels + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + startWrite(); + for (int16_t i = x; i < x + w; i++) { + writeFastVLine(i, y, h, color); + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Fill the screen completely with one color. Update in subclasses if + desired! + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::fillScreen(uint16_t color) { + fillRect(0, 0, _width, _height, color); +} + +/**************************************************************************/ +/*! + @brief Draw a line + @param x0 Start point x coordinate + @param y0 Start point y coordinate + @param x1 End point x coordinate + @param y1 End point y coordinate + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + uint16_t color) { + // Update in subclasses if desired! + if (x0 == x1) { + if (y0 > y1) + _swap_int16_t(y0, y1); + drawFastVLine(x0, y0, y1 - y0 + 1, color); + } else if (y0 == y1) { + if (x0 > x1) + _swap_int16_t(x0, x1); + drawFastHLine(x0, y0, x1 - x0 + 1, color); + } else { + startWrite(); + writeLine(x0, y0, x1, y1, color); + endWrite(); + } +} + +/**************************************************************************/ +/*! + @brief Draw a circle outline + @param x0 Center-point x coordinate + @param y0 Center-point y coordinate + @param r Radius of circle + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, + uint16_t color) { +#if defined(ESP8266) + yield(); +#endif + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + startWrite(); + writePixel(x0, y0 + r, color); + writePixel(x0, y0 - r, color); + writePixel(x0 + r, y0, color); + writePixel(x0 - r, y0, color); + + while (x < y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + writePixel(x0 + x, y0 + y, color); + writePixel(x0 - x, y0 + y, color); + writePixel(x0 + x, y0 - y, color); + writePixel(x0 - x, y0 - y, color); + writePixel(x0 + y, y0 + x, color); + writePixel(x0 - y, y0 + x, color); + writePixel(x0 + y, y0 - x, color); + writePixel(x0 - y, y0 - x, color); + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Quarter-circle drawer, used to do circles and roundrects + @param x0 Center-point x coordinate + @param y0 Center-point y coordinate + @param r Radius of circle + @param cornername Mask bit #1 or bit #2 to indicate which quarters of + the circle we're doing + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawCircleHelper(int16_t x0, int16_t y0, int16_t r, + uint8_t cornername, uint16_t color) { + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + while (x < y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + if (cornername & 0x4) { + writePixel(x0 + x, y0 + y, color); + writePixel(x0 + y, y0 + x, color); + } + if (cornername & 0x2) { + writePixel(x0 + x, y0 - y, color); + writePixel(x0 + y, y0 - x, color); + } + if (cornername & 0x8) { + writePixel(x0 - y, y0 + x, color); + writePixel(x0 - x, y0 + y, color); + } + if (cornername & 0x1) { + writePixel(x0 - y, y0 - x, color); + writePixel(x0 - x, y0 - y, color); + } + } +} + +/**************************************************************************/ +/*! + @brief Draw a circle with filled color + @param x0 Center-point x coordinate + @param y0 Center-point y coordinate + @param r Radius of circle + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, + uint16_t color) { + startWrite(); + writeFastVLine(x0, y0 - r, 2 * r + 1, color); + fillCircleHelper(x0, y0, r, 3, 0, color); + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Quarter-circle drawer with fill, used for circles and roundrects + @param x0 Center-point x coordinate + @param y0 Center-point y coordinate + @param r Radius of circle + @param corners Mask bits indicating which quarters we're doing + @param delta Offset from center-point, used for round-rects + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, + uint8_t corners, int16_t delta, + uint16_t color) { + + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + int16_t px = x; + int16_t py = y; + + delta++; // Avoid some +1's in the loop + + while (x < y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + // These checks avoid double-drawing certain lines, important + // for the SSD1306 library which has an INVERT drawing mode. + if (x < (y + 1)) { + if (corners & 1) + writeFastVLine(x0 + x, y0 - y, 2 * y + delta, color); + if (corners & 2) + writeFastVLine(x0 - x, y0 - y, 2 * y + delta, color); + } + if (y != py) { + if (corners & 1) + writeFastVLine(x0 + py, y0 - px, 2 * px + delta, color); + if (corners & 2) + writeFastVLine(x0 - py, y0 - px, 2 * px + delta, color); + py = y; + } + px = x; + } +} + +/**************************************************************************/ +/*! + @brief Draw a rectangle with no fill color + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param w Width in pixels + @param h Height in pixels + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + startWrite(); + writeFastHLine(x, y, w, color); + writeFastHLine(x, y + h - 1, w, color); + writeFastVLine(x, y, h, color); + writeFastVLine(x + w - 1, y, h, color); + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a rounded rectangle with no fill color + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param w Width in pixels + @param h Height in pixels + @param r Radius of corner rounding + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, + int16_t r, uint16_t color) { + int16_t max_radius = ((w < h) ? w : h) / 2; // 1/2 minor axis + if (r > max_radius) + r = max_radius; + // smarter version + startWrite(); + writeFastHLine(x + r, y, w - 2 * r, color); // Top + writeFastHLine(x + r, y + h - 1, w - 2 * r, color); // Bottom + writeFastVLine(x, y + r, h - 2 * r, color); // Left + writeFastVLine(x + w - 1, y + r, h - 2 * r, color); // Right + // draw four corners + drawCircleHelper(x + r, y + r, r, 1, color); + drawCircleHelper(x + w - r - 1, y + r, r, 2, color); + drawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color); + drawCircleHelper(x + r, y + h - r - 1, r, 8, color); + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a rounded rectangle with fill color + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param w Width in pixels + @param h Height in pixels + @param r Radius of corner rounding + @param color 16-bit 5-6-5 Color to draw/fill with +*/ +/**************************************************************************/ +void Adafruit_GFX::fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, + int16_t r, uint16_t color) { + int16_t max_radius = ((w < h) ? w : h) / 2; // 1/2 minor axis + if (r > max_radius) + r = max_radius; + // smarter version + startWrite(); + writeFillRect(x + r, y, w - 2 * r, h, color); + // draw four corners + fillCircleHelper(x + w - r - 1, y + r, r, 1, h - 2 * r - 1, color); + fillCircleHelper(x + r, y + r, r, 2, h - 2 * r - 1, color); + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a triangle with no fill color + @param x0 Vertex #0 x coordinate + @param y0 Vertex #0 y coordinate + @param x1 Vertex #1 x coordinate + @param y1 Vertex #1 y coordinate + @param x2 Vertex #2 x coordinate + @param y2 Vertex #2 y coordinate + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color) { + drawLine(x0, y0, x1, y1, color); + drawLine(x1, y1, x2, y2, color); + drawLine(x2, y2, x0, y0, color); +} + +/**************************************************************************/ +/*! + @brief Draw a triangle with color-fill + @param x0 Vertex #0 x coordinate + @param y0 Vertex #0 y coordinate + @param x1 Vertex #1 x coordinate + @param y1 Vertex #1 y coordinate + @param x2 Vertex #2 x coordinate + @param y2 Vertex #2 y coordinate + @param color 16-bit 5-6-5 Color to fill/draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color) { + + int16_t a, b, y, last; + + // Sort coordinates by Y order (y2 >= y1 >= y0) + if (y0 > y1) { + _swap_int16_t(y0, y1); + _swap_int16_t(x0, x1); + } + if (y1 > y2) { + _swap_int16_t(y2, y1); + _swap_int16_t(x2, x1); + } + if (y0 > y1) { + _swap_int16_t(y0, y1); + _swap_int16_t(x0, x1); + } + + startWrite(); + if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing + a = b = x0; + if (x1 < a) + a = x1; + else if (x1 > b) + b = x1; + if (x2 < a) + a = x2; + else if (x2 > b) + b = x2; + writeFastHLine(a, y0, b - a + 1, color); + endWrite(); + return; + } + + int16_t dx01 = x1 - x0, dy01 = y1 - y0, dx02 = x2 - x0, dy02 = y2 - y0, + dx12 = x2 - x1, dy12 = y2 - y1; + int32_t sa = 0, sb = 0; + + // For upper part of triangle, find scanline crossings for segments + // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 + // is included here (and second loop will be skipped, avoiding a /0 + // error there), otherwise scanline y1 is skipped here and handled + // in the second loop...which also avoids a /0 error here if y0=y1 + // (flat-topped triangle). + if (y1 == y2) + last = y1; // Include y1 scanline + else + last = y1 - 1; // Skip it + + for (y = y0; y <= last; y++) { + a = x0 + sa / dy01; + b = x0 + sb / dy02; + sa += dx01; + sb += dx02; + /* longhand: + a = x0 + (x1 - x0) * (y - y0) / (y1 - y0); + b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); + */ + if (a > b) + _swap_int16_t(a, b); + writeFastHLine(a, y, b - a + 1, color); + } + + // For lower part of triangle, find scanline crossings for segments + // 0-2 and 1-2. This loop is skipped if y1=y2. + sa = (int32_t)dx12 * (y - y1); + sb = (int32_t)dx02 * (y - y0); + for (; y <= y2; y++) { + a = x1 + sa / dy12; + b = x0 + sb / dy02; + sa += dx12; + sb += dx02; + /* longhand: + a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); + b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); + */ + if (a > b) + _swap_int16_t(a, b); + writeFastHLine(a, y, b - a + 1, color); + } + endWrite(); +} + +// BITMAP / XBITMAP / GRAYSCALE / RGB BITMAP FUNCTIONS --------------------- + +/**************************************************************************/ +/*! + @brief Draw a PROGMEM-resident 1-bit image at the specified (x,y) + position, using the specified foreground color (unset bits are transparent). + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with monochrome bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], + int16_t w, int16_t h, uint16_t color) { + + int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte + uint8_t b = 0; + + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = pgm_read_byte(&bitmap[j * byteWidth + i / 8]); + if (b & 0x80) + writePixel(x + i, y, color); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a PROGMEM-resident 1-bit image at the specified (x,y) + position, using the specified foreground (for set bits) and background (unset + bits) colors. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with monochrome bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels + @param color 16-bit 5-6-5 Color to draw pixels with + @param bg 16-bit 5-6-5 Color to draw background with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], + int16_t w, int16_t h, uint16_t color, + uint16_t bg) { + + int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte + uint8_t b = 0; + + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = pgm_read_byte(&bitmap[j * byteWidth + i / 8]); + writePixel(x + i, y, (b & 0x80) ? color : bg); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a RAM-resident 1-bit image at the specified (x,y) position, + using the specified foreground color (unset bits are transparent). + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with monochrome bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels + @param color 16-bit 5-6-5 Color to draw with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, + int16_t h, uint16_t color) { + + int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte + uint8_t b = 0; + + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = bitmap[j * byteWidth + i / 8]; + if (b & 0x80) + writePixel(x + i, y, color); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a RAM-resident 1-bit image at the specified (x,y) position, + using the specified foreground (for set bits) and background (unset bits) + colors. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with monochrome bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels + @param color 16-bit 5-6-5 Color to draw pixels with + @param bg 16-bit 5-6-5 Color to draw background with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, + int16_t h, uint16_t color, uint16_t bg) { + + int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte + uint8_t b = 0; + + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = bitmap[j * byteWidth + i / 8]; + writePixel(x + i, y, (b & 0x80) ? color : bg); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw PROGMEM-resident XBitMap Files (*.xbm), exported from GIMP. + Usage: Export from GIMP to *.xbm, rename *.xbm to *.c and open in editor. + C Array can be directly used with this function. + There is no RAM-resident version of this function; if generating bitmaps + in RAM, use the format defined by drawBitmap() and call that instead. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with monochrome bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels + @param color 16-bit 5-6-5 Color to draw pixels with +*/ +/**************************************************************************/ +void Adafruit_GFX::drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[], + int16_t w, int16_t h, uint16_t color) { + + int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte + uint8_t b = 0; + + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b >>= 1; + else + b = pgm_read_byte(&bitmap[j * byteWidth + i / 8]); + // Nearly identical to drawBitmap(), only the bit order + // is reversed here (left-to-right = LSB to MSB): + if (b & 0x01) + writePixel(x + i, y, color); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a PROGMEM-resident 8-bit image (grayscale) at the specified + (x,y) pos. Specifically for 8-bit display devices such as IS31FL3731; no + color reduction/expansion is performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with grayscale bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawGrayscaleBitmap(int16_t x, int16_t y, + const uint8_t bitmap[], int16_t w, + int16_t h) { + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + writePixel(x + i, y, (uint8_t)pgm_read_byte(&bitmap[j * w + i])); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a RAM-resident 8-bit image (grayscale) at the specified (x,y) + pos. Specifically for 8-bit display devices such as IS31FL3731; no color + reduction/expansion is performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with grayscale bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, + int16_t w, int16_t h) { + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + writePixel(x + i, y, bitmap[j * w + i]); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a PROGMEM-resident 8-bit image (grayscale) with a 1-bit mask + (set bits = opaque, unset bits = clear) at the specified (x,y) position. + BOTH buffers (grayscale and mask) must be PROGMEM-resident. + Specifically for 8-bit display devices such as IS31FL3731; no color + reduction/expansion is performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with grayscale bitmap + @param mask byte array with mask bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawGrayscaleBitmap(int16_t x, int16_t y, + const uint8_t bitmap[], + const uint8_t mask[], int16_t w, + int16_t h) { + int16_t bw = (w + 7) / 8; // Bitmask scanline pad = whole byte + uint8_t b = 0; + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = pgm_read_byte(&mask[j * bw + i / 8]); + if (b & 0x80) { + writePixel(x + i, y, (uint8_t)pgm_read_byte(&bitmap[j * w + i])); + } + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a RAM-resident 8-bit image (grayscale) with a 1-bit mask + (set bits = opaque, unset bits = clear) at the specified (x,y) position. + BOTH buffers (grayscale and mask) must be RAM-residentt, no mix-and-match + Specifically for 8-bit display devices such as IS31FL3731; no color + reduction/expansion is performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with grayscale bitmap + @param mask byte array with mask bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, + uint8_t *mask, int16_t w, int16_t h) { + int16_t bw = (w + 7) / 8; // Bitmask scanline pad = whole byte + uint8_t b = 0; + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = mask[j * bw + i / 8]; + if (b & 0x80) { + writePixel(x + i, y, bitmap[j * w + i]); + } + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a PROGMEM-resident 16-bit image (RGB 5/6/5) at the specified + (x,y) position. For 16-bit display devices; no color reduction performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with 16-bit color bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], + int16_t w, int16_t h) { + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + writePixel(x + i, y, pgm_read_word(&bitmap[j * w + i])); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a RAM-resident 16-bit image (RGB 5/6/5) at the specified (x,y) + position. For 16-bit display devices; no color reduction performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with 16-bit color bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, + int16_t w, int16_t h) { + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + writePixel(x + i, y, bitmap[j * w + i]); + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a PROGMEM-resident 16-bit image (RGB 5/6/5) with a 1-bit mask + (set bits = opaque, unset bits = clear) at the specified (x,y) position. BOTH + buffers (color and mask) must be PROGMEM-resident. For 16-bit display + devices; no color reduction performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with 16-bit color bitmap + @param mask byte array with monochrome mask bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], + const uint8_t mask[], int16_t w, int16_t h) { + int16_t bw = (w + 7) / 8; // Bitmask scanline pad = whole byte + uint8_t b = 0; + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = pgm_read_byte(&mask[j * bw + i / 8]); + if (b & 0x80) { + writePixel(x + i, y, pgm_read_word(&bitmap[j * w + i])); + } + } + } + endWrite(); +} + +/**************************************************************************/ +/*! + @brief Draw a RAM-resident 16-bit image (RGB 5/6/5) with a 1-bit mask (set + bits = opaque, unset bits = clear) at the specified (x,y) position. BOTH + buffers (color and mask) must be RAM-resident. For 16-bit display devices; no + color reduction performed. + @param x Top left corner x coordinate + @param y Top left corner y coordinate + @param bitmap byte array with 16-bit color bitmap + @param mask byte array with monochrome mask bitmap + @param w Width of bitmap in pixels + @param h Height of bitmap in pixels +*/ +/**************************************************************************/ +void Adafruit_GFX::drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, + uint8_t *mask, int16_t w, int16_t h) { + int16_t bw = (w + 7) / 8; // Bitmask scanline pad = whole byte + uint8_t b = 0; + startWrite(); + for (int16_t j = 0; j < h; j++, y++) { + for (int16_t i = 0; i < w; i++) { + if (i & 7) + b <<= 1; + else + b = mask[j * bw + i / 8]; + if (b & 0x80) { + writePixel(x + i, y, bitmap[j * w + i]); + } + } + } + endWrite(); +} + +// TEXT- AND CHARACTER-HANDLING FUNCTIONS ---------------------------------- + +// Draw a character +/**************************************************************************/ +/*! + @brief Draw a single character + @param x Bottom left corner x coordinate + @param y Bottom left corner y coordinate + @param c The 8-bit font-indexed character (likely ascii) + @param color 16-bit 5-6-5 Color to draw chraracter with + @param bg 16-bit 5-6-5 Color to fill background with (if same as color, + no background) + @param size Font magnification level, 1 is 'original' size +*/ +/**************************************************************************/ +void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, + uint16_t color, uint16_t bg, uint8_t size) { + drawChar(x, y, c, color, bg, size, size); +} + +// Draw a character +/**************************************************************************/ +/*! + @brief Draw a single character + @param x Bottom left corner x coordinate + @param y Bottom left corner y coordinate + @param c The 8-bit font-indexed character (likely ascii) + @param color 16-bit 5-6-5 Color to draw chraracter with + @param bg 16-bit 5-6-5 Color to fill background with (if same as color, + no background) + @param size_x Font magnification level in X-axis, 1 is 'original' size + @param size_y Font magnification level in Y-axis, 1 is 'original' size +*/ +/**************************************************************************/ +void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, + uint16_t color, uint16_t bg, uint8_t size_x, + uint8_t size_y) { + + if (!gfxFont) { // 'Classic' built-in font + + if ((x >= _width) || // Clip right + (y >= _height) || // Clip bottom + ((x + 6 * size_x - 1) < 0) || // Clip left + ((y + 8 * size_y - 1) < 0)) // Clip top + return; + + if (!_cp437 && (c >= 176)) + c++; // Handle 'classic' charset behavior + + startWrite(); + for (int8_t i = 0; i < 5; i++) { // Char bitmap = 5 columns + uint8_t line = pgm_read_byte(&font[c * 5 + i]); + for (int8_t j = 0; j < 8; j++, line >>= 1) { + if (line & 1) { + if (size_x == 1 && size_y == 1) + writePixel(x + i, y + j, color); + else + writeFillRect(x + i * size_x, y + j * size_y, size_x, size_y, + color); + } else if (bg != color) { + if (size_x == 1 && size_y == 1) + writePixel(x + i, y + j, bg); + else + writeFillRect(x + i * size_x, y + j * size_y, size_x, size_y, bg); + } + } + } + if (bg != color) { // If opaque, draw vertical line for last column + if (size_x == 1 && size_y == 1) + writeFastVLine(x + 5, y, 8, bg); + else + writeFillRect(x + 5 * size_x, y, size_x, 8 * size_y, bg); + } + endWrite(); + + } else { // Custom font + + // Character is assumed previously filtered by write() to eliminate + // newlines, returns, non-printable characters, etc. Calling + // drawChar() directly with 'bad' characters of font may cause mayhem! + + c -= (uint8_t)pgm_read_byte(&gfxFont->first); + GFXglyph *glyph = pgm_read_glyph_ptr(gfxFont, c); + uint8_t *bitmap = pgm_read_bitmap_ptr(gfxFont); + + uint16_t bo = pgm_read_word(&glyph->bitmapOffset); + uint8_t w = pgm_read_byte(&glyph->width), h = pgm_read_byte(&glyph->height); + int8_t xo = pgm_read_byte(&glyph->xOffset), + yo = pgm_read_byte(&glyph->yOffset); + uint8_t xx, yy, bits = 0, bit = 0; + int16_t xo16 = 0, yo16 = 0; + + if (size_x > 1 || size_y > 1) { + xo16 = xo; + yo16 = yo; + } + + // Todo: Add character clipping here + + // NOTE: THERE IS NO 'BACKGROUND' COLOR OPTION ON CUSTOM FONTS. + // THIS IS ON PURPOSE AND BY DESIGN. The background color feature + // has typically been used with the 'classic' font to overwrite old + // screen contents with new data. This ONLY works because the + // characters are a uniform size; it's not a sensible thing to do with + // proportionally-spaced fonts with glyphs of varying sizes (and that + // may overlap). To replace previously-drawn text when using a custom + // font, use the getTextBounds() function to determine the smallest + // rectangle encompassing a string, erase the area with fillRect(), + // then draw new text. This WILL infortunately 'blink' the text, but + // is unavoidable. Drawing 'background' pixels will NOT fix this, + // only creates a new set of problems. Have an idea to work around + // this (a canvas object type for MCUs that can afford the RAM and + // displays supporting setAddrWindow() and pushColors()), but haven't + // implemented this yet. + + startWrite(); + for (yy = 0; yy < h; yy++) { + for (xx = 0; xx < w; xx++) { + if (!(bit++ & 7)) { + bits = pgm_read_byte(&bitmap[bo++]); + } + if (bits & 0x80) { + if (size_x == 1 && size_y == 1) { + writePixel(x + xo + xx, y + yo + yy, color); + } else { + writeFillRect(x + (xo16 + xx) * size_x, y + (yo16 + yy) * size_y, + size_x, size_y, color); + } + } + bits <<= 1; + } + } + endWrite(); + + } // End classic vs custom font +} +/**************************************************************************/ +/*! + @brief Print one byte/character of data, used to support print() + @param c The 8-bit ascii character to write +*/ +/**************************************************************************/ +size_t Adafruit_GFX::write(uint8_t c) { + if (!gfxFont) { // 'Classic' built-in font + + if (c == '\n') { // Newline? + cursor_x = 0; // Reset x to zero, + cursor_y += textsize_y * 8; // advance y one line + } else if (c != '\r') { // Ignore carriage returns + if (wrap && ((cursor_x + textsize_x * 6) > _width)) { // Off right? + cursor_x = 0; // Reset x to zero, + cursor_y += textsize_y * 8; // advance y one line + } + drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize_x, + textsize_y); + cursor_x += textsize_x * 6; // Advance x one char + } + + } else { // Custom font + + if (c == '\n') { + cursor_x = 0; + cursor_y += + (int16_t)textsize_y * (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } else if (c != '\r') { + uint8_t first = pgm_read_byte(&gfxFont->first); + if ((c >= first) && (c <= (uint8_t)pgm_read_byte(&gfxFont->last))) { + GFXglyph *glyph = pgm_read_glyph_ptr(gfxFont, c - first); + uint8_t w = pgm_read_byte(&glyph->width), + h = pgm_read_byte(&glyph->height); + if ((w > 0) && (h > 0)) { // Is there an associated bitmap? + int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); // sic + if (wrap && ((cursor_x + textsize_x * (xo + w)) > _width)) { + cursor_x = 0; + cursor_y += (int16_t)textsize_y * + (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } + drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize_x, + textsize_y); + } + cursor_x += + (uint8_t)pgm_read_byte(&glyph->xAdvance) * (int16_t)textsize_x; + } + } + } + return 1; +} + +/**************************************************************************/ +/*! + @brief Set text 'magnification' size. Each increase in s makes 1 pixel + that much bigger. + @param s Desired text size. 1 is default 6x8, 2 is 12x16, 3 is 18x24, etc +*/ +/**************************************************************************/ +void Adafruit_GFX::setTextSize(uint8_t s) { setTextSize(s, s); } + +/**************************************************************************/ +/*! + @brief Set text 'magnification' size. Each increase in s makes 1 pixel + that much bigger. + @param s_x Desired text width magnification level in X-axis. 1 is default + @param s_y Desired text width magnification level in Y-axis. 1 is default +*/ +/**************************************************************************/ +void Adafruit_GFX::setTextSize(uint8_t s_x, uint8_t s_y) { + textsize_x = (s_x > 0) ? s_x : 1; + textsize_y = (s_y > 0) ? s_y : 1; +} + +/**************************************************************************/ +/*! + @brief Set rotation setting for display + @param x 0 thru 3 corresponding to 4 cardinal rotations +*/ +/**************************************************************************/ +void Adafruit_GFX::setRotation(uint8_t x) { + rotation = (x & 3); + switch (rotation) { + case 0: + case 2: + _width = WIDTH; + _height = HEIGHT; + break; + case 1: + case 3: + _width = HEIGHT; + _height = WIDTH; + break; + } +} + +/**************************************************************************/ +/*! + @brief Set the font to display when print()ing, either custom or default + @param f The GFXfont object, if NULL use built in 6x8 font +*/ +/**************************************************************************/ +void Adafruit_GFX::setFont(const GFXfont *f) { + if (f) { // Font struct pointer passed in? + if (!gfxFont) { // And no current font struct? + // Switching from classic to new font behavior. + // Move cursor pos down 6 pixels so it's on baseline. + cursor_y += 6; + } + } else if (gfxFont) { // NULL passed. Current font struct defined? + // Switching from new to classic font behavior. + // Move cursor pos up 6 pixels so it's at top-left of char. + cursor_y -= 6; + } + gfxFont = (GFXfont *)f; +} + +/**************************************************************************/ +/*! + @brief Helper to determine size of a character with current font/size. + Broke this out as it's used by both the PROGMEM- and RAM-resident + getTextBounds() functions. + @param c The ASCII character in question + @param x Pointer to x location of character. Value is modified by + this function to advance to next character. + @param y Pointer to y location of character. Value is modified by + this function to advance to next character. + @param minx Pointer to minimum X coordinate, passed in to AND returned + by this function -- this is used to incrementally build a + bounding rectangle for a string. + @param miny Pointer to minimum Y coord, passed in AND returned. + @param maxx Pointer to maximum X coord, passed in AND returned. + @param maxy Pointer to maximum Y coord, passed in AND returned. +*/ +/**************************************************************************/ +void Adafruit_GFX::charBounds(unsigned char c, int16_t *x, int16_t *y, + int16_t *minx, int16_t *miny, int16_t *maxx, + int16_t *maxy) { + + if (gfxFont) { + + if (c == '\n') { // Newline? + *x = 0; // Reset x to zero, advance y by one line + *y += textsize_y * (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } else if (c != '\r') { // Not a carriage return; is normal char + uint8_t first = pgm_read_byte(&gfxFont->first), + last = pgm_read_byte(&gfxFont->last); + if ((c >= first) && (c <= last)) { // Char present in this font? + GFXglyph *glyph = pgm_read_glyph_ptr(gfxFont, c - first); + uint8_t gw = pgm_read_byte(&glyph->width), + gh = pgm_read_byte(&glyph->height), + xa = pgm_read_byte(&glyph->xAdvance); + int8_t xo = pgm_read_byte(&glyph->xOffset), + yo = pgm_read_byte(&glyph->yOffset); + if (wrap && ((*x + (((int16_t)xo + gw) * textsize_x)) > _width)) { + *x = 0; // Reset x to zero, advance y by one line + *y += textsize_y * (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } + int16_t tsx = (int16_t)textsize_x, tsy = (int16_t)textsize_y, + x1 = *x + xo * tsx, y1 = *y + yo * tsy, x2 = x1 + gw * tsx - 1, + y2 = y1 + gh * tsy - 1; + if (x1 < *minx) + *minx = x1; + if (y1 < *miny) + *miny = y1; + if (x2 > *maxx) + *maxx = x2; + if (y2 > *maxy) + *maxy = y2; + *x += xa * tsx; + } + } + + } else { // Default font + + if (c == '\n') { // Newline? + *x = 0; // Reset x to zero, + *y += textsize_y * 8; // advance y one line + // min/max x/y unchaged -- that waits for next 'normal' character + } else if (c != '\r') { // Normal char; ignore carriage returns + if (wrap && ((*x + textsize_x * 6) > _width)) { // Off right? + *x = 0; // Reset x to zero, + *y += textsize_y * 8; // advance y one line + } + int x2 = *x + textsize_x * 6 - 1, // Lower-right pixel of char + y2 = *y + textsize_y * 8 - 1; + if (x2 > *maxx) + *maxx = x2; // Track max x, y + if (y2 > *maxy) + *maxy = y2; + if (*x < *minx) + *minx = *x; // Track min x, y + if (*y < *miny) + *miny = *y; + *x += textsize_x * 6; // Advance x one char + } + } +} + +/**************************************************************************/ +/*! + @brief Helper to determine size of a string with current font/size. + Pass string and a cursor position, returns UL corner and W,H. + @param str The ASCII string to measure + @param x The current cursor X + @param y The current cursor Y + @param x1 The boundary X coordinate, returned by function + @param y1 The boundary Y coordinate, returned by function + @param w The boundary width, returned by function + @param h The boundary height, returned by function +*/ +/**************************************************************************/ +void Adafruit_GFX::getTextBounds(const char *str, int16_t x, int16_t y, + int16_t *x1, int16_t *y1, uint16_t *w, + uint16_t *h) { + + uint8_t c; // Current character + int16_t minx = 0x7FFF, miny = 0x7FFF, maxx = -1, maxy = -1; // Bound rect + // Bound rect is intentionally initialized inverted, so 1st char sets it + + *x1 = x; // Initial position is value passed in + *y1 = y; + *w = *h = 0; // Initial size is zero + + while ((c = *str++)) { + // charBounds() modifies x/y to advance for each character, + // and min/max x/y are updated to incrementally build bounding rect. + charBounds(c, &x, &y, &minx, &miny, &maxx, &maxy); + } + + if (maxx >= minx) { // If legit string bounds were found... + *x1 = minx; // Update x1 to least X coord, + *w = maxx - minx + 1; // And w to bound rect width + } + if (maxy >= miny) { // Same for height + *y1 = miny; + *h = maxy - miny + 1; + } +} + +/**************************************************************************/ +/*! + @brief Helper to determine size of a string with current font/size. Pass + string and a cursor position, returns UL corner and W,H. + @param str The ascii string to measure (as an arduino String() class) + @param x The current cursor X + @param y The current cursor Y + @param x1 The boundary X coordinate, set by function + @param y1 The boundary Y coordinate, set by function + @param w The boundary width, set by function + @param h The boundary height, set by function +*/ +/**************************************************************************/ +void Adafruit_GFX::getTextBounds(const String &str, int16_t x, int16_t y, + int16_t *x1, int16_t *y1, uint16_t *w, + uint16_t *h) { + if (str.length() != 0) { + getTextBounds(const_cast(str.c_str()), x, y, x1, y1, w, h); + } +} + +/**************************************************************************/ +/*! + @brief Helper to determine size of a PROGMEM string with current + font/size. Pass string and a cursor position, returns UL corner and W,H. + @param str The flash-memory ascii string to measure + @param x The current cursor X + @param y The current cursor Y + @param x1 The boundary X coordinate, set by function + @param y1 The boundary Y coordinate, set by function + @param w The boundary width, set by function + @param h The boundary height, set by function +*/ +/**************************************************************************/ +void Adafruit_GFX::getTextBounds(const __FlashStringHelper *str, int16_t x, + int16_t y, int16_t *x1, int16_t *y1, + uint16_t *w, uint16_t *h) { + uint8_t *s = (uint8_t *)str, c; + + *x1 = x; + *y1 = y; + *w = *h = 0; + + int16_t minx = _width, miny = _height, maxx = -1, maxy = -1; + + while ((c = pgm_read_byte(s++))) + charBounds(c, &x, &y, &minx, &miny, &maxx, &maxy); + + if (maxx >= minx) { + *x1 = minx; + *w = maxx - minx + 1; + } + if (maxy >= miny) { + *y1 = miny; + *h = maxy - miny + 1; + } +} + +/**************************************************************************/ +/*! + @brief Invert the display (ideally using built-in hardware command) + @param i True if you want to invert, false to make 'normal' +*/ +/**************************************************************************/ +void Adafruit_GFX::invertDisplay(bool i) { + // Do nothing, must be subclassed if supported by hardware + (void)i; // disable -Wunused-parameter warning +} + +/***************************************************************************/ + +/**************************************************************************/ +/*! + @brief Create a simple drawn button UI element +*/ +/**************************************************************************/ +Adafruit_GFX_Button::Adafruit_GFX_Button(void) { _gfx = 0; } + +/**************************************************************************/ +/*! + @brief Initialize button with our desired color/size/settings + @param gfx Pointer to our display so we can draw to it! + @param x The X coordinate of the center of the button + @param y The Y coordinate of the center of the button + @param w Width of the buttton + @param h Height of the buttton + @param outline Color of the outline (16-bit 5-6-5 standard) + @param fill Color of the button fill (16-bit 5-6-5 standard) + @param textcolor Color of the button label (16-bit 5-6-5 standard) + @param label Ascii string of the text inside the button + @param textsize The font magnification of the label text +*/ +/**************************************************************************/ +// Classic initButton() function: pass center & size +void Adafruit_GFX_Button::initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, + uint16_t w, uint16_t h, uint16_t outline, + uint16_t fill, uint16_t textcolor, + char *label, uint8_t textsize) { + // Tweak arguments and pass to the newer initButtonUL() function... + initButtonUL(gfx, x - (w / 2), y - (h / 2), w, h, outline, fill, textcolor, + label, textsize); +} + +/**************************************************************************/ +/*! + @brief Initialize button with our desired color/size/settings + @param gfx Pointer to our display so we can draw to it! + @param x The X coordinate of the center of the button + @param y The Y coordinate of the center of the button + @param w Width of the buttton + @param h Height of the buttton + @param outline Color of the outline (16-bit 5-6-5 standard) + @param fill Color of the button fill (16-bit 5-6-5 standard) + @param textcolor Color of the button label (16-bit 5-6-5 standard) + @param label Ascii string of the text inside the button + @param textsize_x The font magnification in X-axis of the label text + @param textsize_y The font magnification in Y-axis of the label text +*/ +/**************************************************************************/ +// Classic initButton() function: pass center & size +void Adafruit_GFX_Button::initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, + uint16_t w, uint16_t h, uint16_t outline, + uint16_t fill, uint16_t textcolor, + char *label, uint8_t textsize_x, + uint8_t textsize_y) { + // Tweak arguments and pass to the newer initButtonUL() function... + initButtonUL(gfx, x - (w / 2), y - (h / 2), w, h, outline, fill, textcolor, + label, textsize_x, textsize_y); +} + +/**************************************************************************/ +/*! + @brief Initialize button with our desired color/size/settings, with + upper-left coordinates + @param gfx Pointer to our display so we can draw to it! + @param x1 The X coordinate of the Upper-Left corner of the button + @param y1 The Y coordinate of the Upper-Left corner of the button + @param w Width of the buttton + @param h Height of the buttton + @param outline Color of the outline (16-bit 5-6-5 standard) + @param fill Color of the button fill (16-bit 5-6-5 standard) + @param textcolor Color of the button label (16-bit 5-6-5 standard) + @param label Ascii string of the text inside the button + @param textsize The font magnification of the label text +*/ +/**************************************************************************/ +void Adafruit_GFX_Button::initButtonUL(Adafruit_GFX *gfx, int16_t x1, + int16_t y1, uint16_t w, uint16_t h, + uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, + uint8_t textsize) { + initButtonUL(gfx, x1, y1, w, h, outline, fill, textcolor, label, textsize, + textsize); +} + +/**************************************************************************/ +/*! + @brief Initialize button with our desired color/size/settings, with + upper-left coordinates + @param gfx Pointer to our display so we can draw to it! + @param x1 The X coordinate of the Upper-Left corner of the button + @param y1 The Y coordinate of the Upper-Left corner of the button + @param w Width of the buttton + @param h Height of the buttton + @param outline Color of the outline (16-bit 5-6-5 standard) + @param fill Color of the button fill (16-bit 5-6-5 standard) + @param textcolor Color of the button label (16-bit 5-6-5 standard) + @param label Ascii string of the text inside the button + @param textsize_x The font magnification in X-axis of the label text + @param textsize_y The font magnification in Y-axis of the label text +*/ +/**************************************************************************/ +void Adafruit_GFX_Button::initButtonUL(Adafruit_GFX *gfx, int16_t x1, + int16_t y1, uint16_t w, uint16_t h, + uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, + uint8_t textsize_x, uint8_t textsize_y) { + _x1 = x1; + _y1 = y1; + _w = w; + _h = h; + _outlinecolor = outline; + _fillcolor = fill; + _textcolor = textcolor; + _textsize_x = textsize_x; + _textsize_y = textsize_y; + _gfx = gfx; + strncpy(_label, label, 9); + _label[9] = 0; // strncpy does not place a null at the end. + // When 'label' is >9 characters, _label is not terminated. +} + +/**************************************************************************/ +/*! + @brief Draw the button on the screen + @param inverted Whether to draw with fill/text swapped to indicate + 'pressed' +*/ +/**************************************************************************/ +void Adafruit_GFX_Button::drawButton(bool inverted) { + uint16_t fill, outline, text; + + if (!inverted) { + fill = _fillcolor; + outline = _outlinecolor; + text = _textcolor; + } else { + fill = _textcolor; + outline = _outlinecolor; + text = _fillcolor; + } + + uint8_t r = min(_w, _h) / 4; // Corner radius + _gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill); + _gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline); + + _gfx->setCursor(_x1 + (_w / 2) - (strlen(_label) * 3 * _textsize_x), + _y1 + (_h / 2) - (4 * _textsize_y)); + _gfx->setTextColor(text); + _gfx->setTextSize(_textsize_x, _textsize_y); + _gfx->print(_label); +} + +/**************************************************************************/ +/*! + @brief Helper to let us know if a coordinate is within the bounds of the + button + @param x The X coordinate to check + @param y The Y coordinate to check + @returns True if within button graphics outline +*/ +/**************************************************************************/ +bool Adafruit_GFX_Button::contains(int16_t x, int16_t y) { + return ((x >= _x1) && (x < (int16_t)(_x1 + _w)) && (y >= _y1) && + (y < (int16_t)(_y1 + _h))); +} + +/**************************************************************************/ +/*! + @brief Query whether the button was pressed since we last checked state + @returns True if was not-pressed before, now is. +*/ +/**************************************************************************/ +bool Adafruit_GFX_Button::justPressed() { return (currstate && !laststate); } + +/**************************************************************************/ +/*! + @brief Query whether the button was released since we last checked state + @returns True if was pressed before, now is not. +*/ +/**************************************************************************/ +bool Adafruit_GFX_Button::justReleased() { return (!currstate && laststate); } + +// ------------------------------------------------------------------------- + +// GFXcanvas1, GFXcanvas8 and GFXcanvas16 (currently a WIP, don't get too +// comfy with the implementation) provide 1-, 8- and 16-bit offscreen +// canvases, the address of which can be passed to drawBitmap() or +// pushColors() (the latter appears only in a couple of GFX-subclassed TFT +// libraries at this time). This is here mostly to help with the recently- +// added proportionally-spaced fonts; adds a way to refresh a section of the +// screen without a massive flickering clear-and-redraw...but maybe you'll +// find other uses too. VERY RAM-intensive, since the buffer is in MCU +// memory and not the display driver...GXFcanvas1 might be minimally useful +// on an Uno-class board, but this and the others are much more likely to +// require at least a Mega or various recent ARM-type boards (recommended, +// as the text+bitmap draw can be pokey). GFXcanvas1 requires 1 bit per +// pixel (rounded up to nearest byte per scanline), GFXcanvas8 is 1 byte +// per pixel (no scanline pad), and GFXcanvas16 uses 2 bytes per pixel (no +// scanline pad). +// NOT EXTENSIVELY TESTED YET. MAY CONTAIN WORST BUGS KNOWN TO HUMANKIND. + +#ifdef __AVR__ +// Bitmask tables of 0x80>>X and ~(0x80>>X), because X>>Y is slow on AVR +const uint8_t PROGMEM GFXcanvas1::GFXsetBit[] = {0x80, 0x40, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x01}; +const uint8_t PROGMEM GFXcanvas1::GFXclrBit[] = {0x7F, 0xBF, 0xDF, 0xEF, + 0xF7, 0xFB, 0xFD, 0xFE}; +#endif + +/**************************************************************************/ +/*! + @brief Instatiate a GFX 1-bit canvas context for graphics + @param w Display width, in pixels + @param h Display height, in pixels +*/ +/**************************************************************************/ +GFXcanvas1::GFXcanvas1(uint16_t w, uint16_t h) : Adafruit_GFX(w, h) { + uint32_t bytes = ((w + 7) / 8) * h; + if ((buffer = (uint8_t *)malloc(bytes))) { + memset(buffer, 0, bytes); + } +} + +/**************************************************************************/ +/*! + @brief Delete the canvas, free memory +*/ +/**************************************************************************/ +GFXcanvas1::~GFXcanvas1(void) { + if (buffer) + free(buffer); +} + +/**************************************************************************/ +/*! + @brief Draw a pixel to the canvas framebuffer + @param x x coordinate + @param y y coordinate + @param color Binary (on or off) color to fill with +*/ +/**************************************************************************/ +void GFXcanvas1::drawPixel(int16_t x, int16_t y, uint16_t color) { + if (buffer) { + if ((x < 0) || (y < 0) || (x >= _width) || (y >= _height)) + return; + + int16_t t; + switch (rotation) { + case 1: + t = x; + x = WIDTH - 1 - y; + y = t; + break; + case 2: + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + break; + case 3: + t = x; + x = y; + y = HEIGHT - 1 - t; + break; + } + + uint8_t *ptr = &buffer[(x / 8) + y * ((WIDTH + 7) / 8)]; +#ifdef __AVR__ + if (color) + *ptr |= pgm_read_byte(&GFXsetBit[x & 7]); + else + *ptr &= pgm_read_byte(&GFXclrBit[x & 7]); +#else + if (color) + *ptr |= 0x80 >> (x & 7); + else + *ptr &= ~(0x80 >> (x & 7)); +#endif + } +} + +/**********************************************************************/ +/*! + @brief Get the pixel color value at a given coordinate + @param x x coordinate + @param y y coordinate + @returns The desired pixel's binary color value, either 0x1 (on) or 0x0 + (off) +*/ +/**********************************************************************/ +bool GFXcanvas1::getPixel(int16_t x, int16_t y) const { + int16_t t; + switch (rotation) { + case 1: + t = x; + x = WIDTH - 1 - y; + y = t; + break; + case 2: + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + break; + case 3: + t = x; + x = y; + y = HEIGHT - 1 - t; + break; + } + return getRawPixel(x, y); +} + +/**********************************************************************/ +/*! + @brief Get the pixel color value at a given, unrotated coordinate. + This method is intended for hardware drivers to get pixel value + in physical coordinates. + @param x x coordinate + @param y y coordinate + @returns The desired pixel's binary color value, either 0x1 (on) or 0x0 + (off) +*/ +/**********************************************************************/ +bool GFXcanvas1::getRawPixel(int16_t x, int16_t y) const { + if ((x < 0) || (y < 0) || (x >= WIDTH) || (y >= HEIGHT)) + return 0; + if (buffer) { + uint8_t *ptr = &buffer[(x / 8) + y * ((WIDTH + 7) / 8)]; + +#ifdef __AVR__ + return ((*ptr) & pgm_read_byte(&GFXsetBit[x & 7])) != 0; +#else + return ((*ptr) & (0x80 >> (x & 7))) != 0; +#endif + } + return 0; +} + +/**************************************************************************/ +/*! + @brief Fill the framebuffer completely with one color + @param color Binary (on or off) color to fill with +*/ +/**************************************************************************/ +void GFXcanvas1::fillScreen(uint16_t color) { + if (buffer) { + uint32_t bytes = ((WIDTH + 7) / 8) * HEIGHT; + memset(buffer, color ? 0xFF : 0x00, bytes); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized vertical line drawing + @param x Line horizontal start point + @param y Line vertical start point + @param h Length of vertical line to be drawn, including first point + @param color Color to fill with +*/ +/**************************************************************************/ +void GFXcanvas1::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + + if (h < 0) { // Convert negative heights to positive equivalent + h *= -1; + y -= h - 1; + if (y < 0) { + h += y; + y = 0; + } + } + + // Edge rejection (no-draw if totally off canvas) + if ((x < 0) || (x >= width()) || (y >= height()) || ((y + h - 1) < 0)) { + return; + } + + if (y < 0) { // Clip top + h += y; + y = 0; + } + if (y + h > height()) { // Clip bottom + h = height() - y; + } + + if (getRotation() == 0) { + drawFastRawVLine(x, y, h, color); + } else if (getRotation() == 1) { + int16_t t = x; + x = WIDTH - 1 - y; + y = t; + x -= h - 1; + drawFastRawHLine(x, y, h, color); + } else if (getRotation() == 2) { + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + + y -= h - 1; + drawFastRawVLine(x, y, h, color); + } else if (getRotation() == 3) { + int16_t t = x; + x = y; + y = HEIGHT - 1 - t; + drawFastRawHLine(x, y, h, color); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized horizontal line drawing + @param x Line horizontal start point + @param y Line vertical start point + @param w Length of horizontal line to be drawn, including first point + @param color Color to fill with +*/ +/**************************************************************************/ +void GFXcanvas1::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if (w < 0) { // Convert negative widths to positive equivalent + w *= -1; + x -= w - 1; + if (x < 0) { + w += x; + x = 0; + } + } + + // Edge rejection (no-draw if totally off canvas) + if ((y < 0) || (y >= height()) || (x >= width()) || ((x + w - 1) < 0)) { + return; + } + + if (x < 0) { // Clip left + w += x; + x = 0; + } + if (x + w >= width()) { // Clip right + w = width() - x; + } + + if (getRotation() == 0) { + drawFastRawHLine(x, y, w, color); + } else if (getRotation() == 1) { + int16_t t = x; + x = WIDTH - 1 - y; + y = t; + drawFastRawVLine(x, y, w, color); + } else if (getRotation() == 2) { + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + + x -= w - 1; + drawFastRawHLine(x, y, w, color); + } else if (getRotation() == 3) { + int16_t t = x; + x = y; + y = HEIGHT - 1 - t; + y -= w - 1; + drawFastRawVLine(x, y, w, color); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized vertical line drawing into the raw canvas buffer + @param x Line horizontal start point + @param y Line vertical start point + @param h length of vertical line to be drawn, including first point + @param color Binary (on or off) color to fill with +*/ +/**************************************************************************/ +void GFXcanvas1::drawFastRawVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + // x & y already in raw (rotation 0) coordinates, no need to transform. + int16_t row_bytes = ((WIDTH + 7) / 8); + uint8_t *ptr = &buffer[(x / 8) + y * row_bytes]; + + if (color > 0) { +#ifdef __AVR__ + uint8_t bit_mask = pgm_read_byte(&GFXsetBit[x & 7]); +#else + uint8_t bit_mask = (0x80 >> (x & 7)); +#endif + for (int16_t i = 0; i < h; i++) { + *ptr |= bit_mask; + ptr += row_bytes; + } + } else { +#ifdef __AVR__ + uint8_t bit_mask = pgm_read_byte(&GFXclrBit[x & 7]); +#else + uint8_t bit_mask = ~(0x80 >> (x & 7)); +#endif + for (int16_t i = 0; i < h; i++) { + *ptr &= bit_mask; + ptr += row_bytes; + } + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized horizontal line drawing into the raw canvas buffer + @param x Line horizontal start point + @param y Line vertical start point + @param w length of horizontal line to be drawn, including first point + @param color Binary (on or off) color to fill with +*/ +/**************************************************************************/ +void GFXcanvas1::drawFastRawHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + // x & y already in raw (rotation 0) coordinates, no need to transform. + int16_t rowBytes = ((WIDTH + 7) / 8); + uint8_t *ptr = &buffer[(x / 8) + y * rowBytes]; + size_t remainingWidthBits = w; + + // check to see if first byte needs to be partially filled + if ((x & 7) > 0) { + // create bit mask for first byte + uint8_t startByteBitMask = 0x00; + for (int8_t i = (x & 7); ((i < 8) && (remainingWidthBits > 0)); i++) { +#ifdef __AVR__ + startByteBitMask |= pgm_read_byte(&GFXsetBit[i]); +#else + startByteBitMask |= (0x80 >> i); +#endif + remainingWidthBits--; + } + if (color > 0) { + *ptr |= startByteBitMask; + } else { + *ptr &= ~startByteBitMask; + } + + ptr++; + } + + // do the next remainingWidthBits bits + if (remainingWidthBits > 0) { + size_t remainingWholeBytes = remainingWidthBits / 8; + size_t lastByteBits = remainingWidthBits % 8; + uint8_t wholeByteColor = color > 0 ? 0xFF : 0x00; + + memset(ptr, wholeByteColor, remainingWholeBytes); + + if (lastByteBits > 0) { + uint8_t lastByteBitMask = 0x00; + for (size_t i = 0; i < lastByteBits; i++) { +#ifdef __AVR__ + lastByteBitMask |= pgm_read_byte(&GFXsetBit[i]); +#else + lastByteBitMask |= (0x80 >> i); +#endif + } + ptr += remainingWholeBytes; + + if (color > 0) { + *ptr |= lastByteBitMask; + } else { + *ptr &= ~lastByteBitMask; + } + } + } +} + +/**************************************************************************/ +/*! + @brief Instatiate a GFX 8-bit canvas context for graphics + @param w Display width, in pixels + @param h Display height, in pixels +*/ +/**************************************************************************/ +GFXcanvas8::GFXcanvas8(uint16_t w, uint16_t h) : Adafruit_GFX(w, h) { + uint32_t bytes = w * h; + if ((buffer = (uint8_t *)malloc(bytes))) { + memset(buffer, 0, bytes); + } +} + +/**************************************************************************/ +/*! + @brief Delete the canvas, free memory +*/ +/**************************************************************************/ +GFXcanvas8::~GFXcanvas8(void) { + if (buffer) + free(buffer); +} + +/**************************************************************************/ +/*! + @brief Draw a pixel to the canvas framebuffer + @param x x coordinate + @param y y coordinate + @param color 8-bit Color to fill with. Only lower byte of uint16_t is used. +*/ +/**************************************************************************/ +void GFXcanvas8::drawPixel(int16_t x, int16_t y, uint16_t color) { + if (buffer) { + if ((x < 0) || (y < 0) || (x >= _width) || (y >= _height)) + return; + + int16_t t; + switch (rotation) { + case 1: + t = x; + x = WIDTH - 1 - y; + y = t; + break; + case 2: + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + break; + case 3: + t = x; + x = y; + y = HEIGHT - 1 - t; + break; + } + + buffer[x + y * WIDTH] = color; + } +} + +/**********************************************************************/ +/*! + @brief Get the pixel color value at a given coordinate + @param x x coordinate + @param y y coordinate + @returns The desired pixel's 8-bit color value +*/ +/**********************************************************************/ +uint8_t GFXcanvas8::getPixel(int16_t x, int16_t y) const { + int16_t t; + switch (rotation) { + case 1: + t = x; + x = WIDTH - 1 - y; + y = t; + break; + case 2: + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + break; + case 3: + t = x; + x = y; + y = HEIGHT - 1 - t; + break; + } + return getRawPixel(x, y); +} + +/**********************************************************************/ +/*! + @brief Get the pixel color value at a given, unrotated coordinate. + This method is intended for hardware drivers to get pixel value + in physical coordinates. + @param x x coordinate + @param y y coordinate + @returns The desired pixel's 8-bit color value +*/ +/**********************************************************************/ +uint8_t GFXcanvas8::getRawPixel(int16_t x, int16_t y) const { + if ((x < 0) || (y < 0) || (x >= WIDTH) || (y >= HEIGHT)) + return 0; + if (buffer) { + return buffer[x + y * WIDTH]; + } + return 0; +} + +/**************************************************************************/ +/*! + @brief Fill the framebuffer completely with one color + @param color 8-bit Color to fill with. Only lower byte of uint16_t is used. +*/ +/**************************************************************************/ +void GFXcanvas8::fillScreen(uint16_t color) { + if (buffer) { + memset(buffer, color, WIDTH * HEIGHT); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized vertical line drawing + @param x Line horizontal start point + @param y Line vertical start point + @param h Length of vertical line to be drawn, including first point + @param color 8-bit Color to fill with. Only lower byte of uint16_t is + used. +*/ +/**************************************************************************/ +void GFXcanvas8::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if (h < 0) { // Convert negative heights to positive equivalent + h *= -1; + y -= h - 1; + if (y < 0) { + h += y; + y = 0; + } + } + + // Edge rejection (no-draw if totally off canvas) + if ((x < 0) || (x >= width()) || (y >= height()) || ((y + h - 1) < 0)) { + return; + } + + if (y < 0) { // Clip top + h += y; + y = 0; + } + if (y + h > height()) { // Clip bottom + h = height() - y; + } + + if (getRotation() == 0) { + drawFastRawVLine(x, y, h, color); + } else if (getRotation() == 1) { + int16_t t = x; + x = WIDTH - 1 - y; + y = t; + x -= h - 1; + drawFastRawHLine(x, y, h, color); + } else if (getRotation() == 2) { + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + + y -= h - 1; + drawFastRawVLine(x, y, h, color); + } else if (getRotation() == 3) { + int16_t t = x; + x = y; + y = HEIGHT - 1 - t; + drawFastRawHLine(x, y, h, color); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized horizontal line drawing + @param x Line horizontal start point + @param y Line vertical start point + @param w Length of horizontal line to be drawn, including 1st point + @param color 8-bit Color to fill with. Only lower byte of uint16_t is + used. +*/ +/**************************************************************************/ +void GFXcanvas8::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + + if (w < 0) { // Convert negative widths to positive equivalent + w *= -1; + x -= w - 1; + if (x < 0) { + w += x; + x = 0; + } + } + + // Edge rejection (no-draw if totally off canvas) + if ((y < 0) || (y >= height()) || (x >= width()) || ((x + w - 1) < 0)) { + return; + } + + if (x < 0) { // Clip left + w += x; + x = 0; + } + if (x + w >= width()) { // Clip right + w = width() - x; + } + + if (getRotation() == 0) { + drawFastRawHLine(x, y, w, color); + } else if (getRotation() == 1) { + int16_t t = x; + x = WIDTH - 1 - y; + y = t; + drawFastRawVLine(x, y, w, color); + } else if (getRotation() == 2) { + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + + x -= w - 1; + drawFastRawHLine(x, y, w, color); + } else if (getRotation() == 3) { + int16_t t = x; + x = y; + y = HEIGHT - 1 - t; + y -= w - 1; + drawFastRawVLine(x, y, w, color); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized vertical line drawing into the raw canvas buffer + @param x Line horizontal start point + @param y Line vertical start point + @param h length of vertical line to be drawn, including first point + @param color 8-bit Color to fill with. Only lower byte of uint16_t is + used. +*/ +/**************************************************************************/ +void GFXcanvas8::drawFastRawVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + // x & y already in raw (rotation 0) coordinates, no need to transform. + uint8_t *buffer_ptr = buffer + y * WIDTH + x; + for (int16_t i = 0; i < h; i++) { + (*buffer_ptr) = color; + buffer_ptr += WIDTH; + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized horizontal line drawing into the raw canvas buffer + @param x Line horizontal start point + @param y Line vertical start point + @param w length of horizontal line to be drawn, including first point + @param color 8-bit Color to fill with. Only lower byte of uint16_t is + used. +*/ +/**************************************************************************/ +void GFXcanvas8::drawFastRawHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + // x & y already in raw (rotation 0) coordinates, no need to transform. + memset(buffer + y * WIDTH + x, color, w); +} + +/**************************************************************************/ +/*! + @brief Instatiate a GFX 16-bit canvas context for graphics + @param w Display width, in pixels + @param h Display height, in pixels +*/ +/**************************************************************************/ +GFXcanvas16::GFXcanvas16(uint16_t w, uint16_t h) : Adafruit_GFX(w, h) { + uint32_t bytes = w * h * 2; + if ((buffer = (uint16_t *)malloc(bytes))) { + memset(buffer, 0, bytes); + } +} + +/**************************************************************************/ +/*! + @brief Delete the canvas, free memory +*/ +/**************************************************************************/ +GFXcanvas16::~GFXcanvas16(void) { + if (buffer) + free(buffer); +} + +/**************************************************************************/ +/*! + @brief Draw a pixel to the canvas framebuffer + @param x x coordinate + @param y y coordinate + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void GFXcanvas16::drawPixel(int16_t x, int16_t y, uint16_t color) { + if (buffer) { + if ((x < 0) || (y < 0) || (x >= _width) || (y >= _height)) + return; + + int16_t t; + switch (rotation) { + case 1: + t = x; + x = WIDTH - 1 - y; + y = t; + break; + case 2: + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + break; + case 3: + t = x; + x = y; + y = HEIGHT - 1 - t; + break; + } + + buffer[x + y * WIDTH] = color; + } +} + +/**********************************************************************/ +/*! + @brief Get the pixel color value at a given coordinate + @param x x coordinate + @param y y coordinate + @returns The desired pixel's 16-bit 5-6-5 color value +*/ +/**********************************************************************/ +uint16_t GFXcanvas16::getPixel(int16_t x, int16_t y) const { + int16_t t; + switch (rotation) { + case 1: + t = x; + x = WIDTH - 1 - y; + y = t; + break; + case 2: + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + break; + case 3: + t = x; + x = y; + y = HEIGHT - 1 - t; + break; + } + return getRawPixel(x, y); +} + +/**********************************************************************/ +/*! + @brief Get the pixel color value at a given, unrotated coordinate. + This method is intended for hardware drivers to get pixel value + in physical coordinates. + @param x x coordinate + @param y y coordinate + @returns The desired pixel's 16-bit 5-6-5 color value +*/ +/**********************************************************************/ +uint16_t GFXcanvas16::getRawPixel(int16_t x, int16_t y) const { + if ((x < 0) || (y < 0) || (x >= WIDTH) || (y >= HEIGHT)) + return 0; + if (buffer) { + return buffer[x + y * WIDTH]; + } + return 0; +} + +/**************************************************************************/ +/*! + @brief Fill the framebuffer completely with one color + @param color 16-bit 5-6-5 Color to fill with +*/ +/**************************************************************************/ +void GFXcanvas16::fillScreen(uint16_t color) { + if (buffer) { + uint8_t hi = color >> 8, lo = color & 0xFF; + if (hi == lo) { + memset(buffer, lo, WIDTH * HEIGHT * 2); + } else { + uint32_t i, pixels = WIDTH * HEIGHT; + for (i = 0; i < pixels; i++) + buffer[i] = color; + } + } +} + +/**************************************************************************/ +/*! + @brief Reverses the "endian-ness" of each 16-bit pixel within the + canvas; little-endian to big-endian, or big-endian to little. + Most microcontrollers (such as SAMD) are little-endian, while + most displays tend toward big-endianness. All the drawing + functions (including RGB bitmap drawing) take care of this + automatically, but some specialized code (usually involving + DMA) can benefit from having pixel data already in the + display-native order. Note that this does NOT convert to a + SPECIFIC endian-ness, it just flips the bytes within each word. +*/ +/**************************************************************************/ +void GFXcanvas16::byteSwap(void) { + if (buffer) { + uint32_t i, pixels = WIDTH * HEIGHT; + for (i = 0; i < pixels; i++) + buffer[i] = __builtin_bswap16(buffer[i]); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized vertical line drawing + @param x Line horizontal start point + @param y Line vertical start point + @param h length of vertical line to be drawn, including first point + @param color color 16-bit 5-6-5 Color to draw line with +*/ +/**************************************************************************/ +void GFXcanvas16::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if (h < 0) { // Convert negative heights to positive equivalent + h *= -1; + y -= h - 1; + if (y < 0) { + h += y; + y = 0; + } + } + + // Edge rejection (no-draw if totally off canvas) + if ((x < 0) || (x >= width()) || (y >= height()) || ((y + h - 1) < 0)) { + return; + } + + if (y < 0) { // Clip top + h += y; + y = 0; + } + if (y + h > height()) { // Clip bottom + h = height() - y; + } + + if (getRotation() == 0) { + drawFastRawVLine(x, y, h, color); + } else if (getRotation() == 1) { + int16_t t = x; + x = WIDTH - 1 - y; + y = t; + x -= h - 1; + drawFastRawHLine(x, y, h, color); + } else if (getRotation() == 2) { + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + + y -= h - 1; + drawFastRawVLine(x, y, h, color); + } else if (getRotation() == 3) { + int16_t t = x; + x = y; + y = HEIGHT - 1 - t; + drawFastRawHLine(x, y, h, color); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized horizontal line drawing + @param x Line horizontal start point + @param y Line vertical start point + @param w Length of horizontal line to be drawn, including 1st point + @param color Color 16-bit 5-6-5 Color to draw line with +*/ +/**************************************************************************/ +void GFXcanvas16::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if (w < 0) { // Convert negative widths to positive equivalent + w *= -1; + x -= w - 1; + if (x < 0) { + w += x; + x = 0; + } + } + + // Edge rejection (no-draw if totally off canvas) + if ((y < 0) || (y >= height()) || (x >= width()) || ((x + w - 1) < 0)) { + return; + } + + if (x < 0) { // Clip left + w += x; + x = 0; + } + if (x + w >= width()) { // Clip right + w = width() - x; + } + + if (getRotation() == 0) { + drawFastRawHLine(x, y, w, color); + } else if (getRotation() == 1) { + int16_t t = x; + x = WIDTH - 1 - y; + y = t; + drawFastRawVLine(x, y, w, color); + } else if (getRotation() == 2) { + x = WIDTH - 1 - x; + y = HEIGHT - 1 - y; + + x -= w - 1; + drawFastRawHLine(x, y, w, color); + } else if (getRotation() == 3) { + int16_t t = x; + x = y; + y = HEIGHT - 1 - t; + y -= w - 1; + drawFastRawVLine(x, y, w, color); + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized vertical line drawing into the raw canvas buffer + @param x Line horizontal start point + @param y Line vertical start point + @param h length of vertical line to be drawn, including first point + @param color color 16-bit 5-6-5 Color to draw line with +*/ +/**************************************************************************/ +void GFXcanvas16::drawFastRawVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + // x & y already in raw (rotation 0) coordinates, no need to transform. + uint16_t *buffer_ptr = buffer + y * WIDTH + x; + for (int16_t i = 0; i < h; i++) { + (*buffer_ptr) = color; + buffer_ptr += WIDTH; + } +} + +/**************************************************************************/ +/*! + @brief Speed optimized horizontal line drawing into the raw canvas buffer + @param x Line horizontal start point + @param y Line vertical start point + @param w length of horizontal line to be drawn, including first point + @param color color 16-bit 5-6-5 Color to draw line with +*/ +/**************************************************************************/ +void GFXcanvas16::drawFastRawHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + // x & y already in raw (rotation 0) coordinates, no need to transform. + uint32_t buffer_index = y * WIDTH + x; + for (uint32_t i = buffer_index; i < buffer_index + w; i++) { + buffer[i] = color; + } +} diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GFX.h b/src/library/Adafruit-GFX-Library/Adafruit_GFX.h new file mode 100644 index 0000000..8f157fa --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Adafruit_GFX.h @@ -0,0 +1,392 @@ +#ifndef _ADAFRUIT_GFX_H +#define _ADAFRUIT_GFX_H + +#if ARDUINO >= 100 +#include "Arduino.h" +#include "Print.h" +#else +#include "WProgram.h" +#endif +#include "gfxfont.h" + +// #include +// #include +#include "../Adafruit_BusIO/Adafruit_I2CDevice.h" +#include "../Adafruit_BusIO/Adafruit_SPIDevice.h" +/// A generic graphics superclass that can handle all sorts of drawing. At a +/// minimum you can subclass and provide drawPixel(). At a maximum you can do a +/// ton of overriding to optimize. Used for any/all Adafruit displays! +class Adafruit_GFX : public Print { + +public: + Adafruit_GFX(int16_t w, int16_t h); // Constructor + + /**********************************************************************/ + /*! + @brief Draw to the screen/framebuffer/etc. + Must be overridden in subclass. + @param x X coordinate in pixels + @param y Y coordinate in pixels + @param color 16-bit pixel color. + */ + /**********************************************************************/ + virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0; + + // TRANSACTION API / CORE DRAW API + // These MAY be overridden by the subclass to provide device-specific + // optimized code. Otherwise 'generic' versions are used. + virtual void startWrite(void); + virtual void writePixel(int16_t x, int16_t y, uint16_t color); + virtual void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + virtual void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + virtual void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + virtual void writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + uint16_t color); + virtual void endWrite(void); + + // CONTROL API + // These MAY be overridden by the subclass to provide device-specific + // optimized code. Otherwise 'generic' versions are used. + virtual void setRotation(uint8_t r); + virtual void invertDisplay(bool i); + + // BASIC DRAW API + // These MAY be overridden by the subclass to provide device-specific + // optimized code. Otherwise 'generic' versions are used. + + // It's good to implement those, even if using transaction API + virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + virtual void fillScreen(uint16_t color); + // Optional and probably not necessary to change + virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + uint16_t color); + virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + + // These exist only with Adafruit_GFX (no subclass overrides) + void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); + void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, + uint16_t color); + void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); + void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, + int16_t delta, uint16_t color); + void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, + int16_t y2, uint16_t color); + void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, + int16_t y2, uint16_t color); + void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color); + void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color); + void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, + int16_t h, uint16_t color); + void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, + int16_t h, uint16_t color, uint16_t bg); + void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, + uint16_t color); + void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, + uint16_t color, uint16_t bg); + void drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, + int16_t h, uint16_t color); + void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[], + int16_t w, int16_t h); + void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, + int16_t h); + void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[], + const uint8_t mask[], int16_t w, int16_t h); + void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, uint8_t *mask, + int16_t w, int16_t h); + void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], int16_t w, + int16_t h); + void drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, int16_t w, + int16_t h); + void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], + const uint8_t mask[], int16_t w, int16_t h); + void drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, uint8_t *mask, + int16_t w, int16_t h); + void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, + uint16_t bg, uint8_t size); + void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, + uint16_t bg, uint8_t size_x, uint8_t size_y); + void getTextBounds(const char *string, int16_t x, int16_t y, int16_t *x1, + int16_t *y1, uint16_t *w, uint16_t *h); + void getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y, + int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h); + void getTextBounds(const String &str, int16_t x, int16_t y, int16_t *x1, + int16_t *y1, uint16_t *w, uint16_t *h); + void setTextSize(uint8_t s); + void setTextSize(uint8_t sx, uint8_t sy); + void setFont(const GFXfont *f = NULL); + + /**********************************************************************/ + /*! + @brief Set text cursor location + @param x X coordinate in pixels + @param y Y coordinate in pixels + */ + /**********************************************************************/ + void setCursor(int16_t x, int16_t y) { + cursor_x = x; + cursor_y = y; + } + + /**********************************************************************/ + /*! + @brief Set text font color with transparant background + @param c 16-bit 5-6-5 Color to draw text with + @note For 'transparent' background, background and foreground + are set to same color rather than using a separate flag. + */ + /**********************************************************************/ + void setTextColor(uint16_t c) { textcolor = textbgcolor = c; } + + /**********************************************************************/ + /*! + @brief Set text font color with custom background color + @param c 16-bit 5-6-5 Color to draw text with + @param bg 16-bit 5-6-5 Color to draw background/fill with + */ + /**********************************************************************/ + void setTextColor(uint16_t c, uint16_t bg) { + textcolor = c; + textbgcolor = bg; + } + + /**********************************************************************/ + /*! + @brief Set whether text that is too long for the screen width should + automatically wrap around to the next line (else clip right). + @param w true for wrapping, false for clipping + */ + /**********************************************************************/ + void setTextWrap(bool w) { wrap = w; } + + /**********************************************************************/ + /*! + @brief Enable (or disable) Code Page 437-compatible charset. + There was an error in glcdfont.c for the longest time -- one + character (#176, the 'light shade' block) was missing -- this + threw off the index of every character that followed it. + But a TON of code has been written with the erroneous + character indices. By default, the library uses the original + 'wrong' behavior and old sketches will still work. Pass + 'true' to this function to use correct CP437 character values + in your code. + @param x true = enable (new behavior), false = disable (old behavior) + */ + /**********************************************************************/ + void cp437(bool x = true) { _cp437 = x; } + + using Print::write; +#if ARDUINO >= 100 + virtual size_t write(uint8_t); +#else + virtual void write(uint8_t); +#endif + + /************************************************************************/ + /*! + @brief Get width of the display, accounting for current rotation + @returns Width in pixels + */ + /************************************************************************/ + int16_t width(void) const { return _width; }; + + /************************************************************************/ + /*! + @brief Get height of the display, accounting for current rotation + @returns Height in pixels + */ + /************************************************************************/ + int16_t height(void) const { return _height; } + + /************************************************************************/ + /*! + @brief Get rotation setting for display + @returns 0 thru 3 corresponding to 4 cardinal rotations + */ + /************************************************************************/ + uint8_t getRotation(void) const { return rotation; } + + // get current cursor position (get rotation safe maximum values, + // using: width() for x, height() for y) + /************************************************************************/ + /*! + @brief Get text cursor X location + @returns X coordinate in pixels + */ + /************************************************************************/ + int16_t getCursorX(void) const { return cursor_x; } + + /************************************************************************/ + /*! + @brief Get text cursor Y location + @returns Y coordinate in pixels + */ + /************************************************************************/ + int16_t getCursorY(void) const { return cursor_y; }; + +protected: + void charBounds(unsigned char c, int16_t *x, int16_t *y, int16_t *minx, + int16_t *miny, int16_t *maxx, int16_t *maxy); + int16_t WIDTH; ///< This is the 'raw' display width - never changes + int16_t HEIGHT; ///< This is the 'raw' display height - never changes + int16_t _width; ///< Display width as modified by current rotation + int16_t _height; ///< Display height as modified by current rotation + int16_t cursor_x; ///< x location to start print()ing text + int16_t cursor_y; ///< y location to start print()ing text + uint16_t textcolor; ///< 16-bit background color for print() + uint16_t textbgcolor; ///< 16-bit text color for print() + uint8_t textsize_x; ///< Desired magnification in X-axis of text to print() + uint8_t textsize_y; ///< Desired magnification in Y-axis of text to print() + uint8_t rotation; ///< Display rotation (0 thru 3) + bool wrap; ///< If set, 'wrap' text at right edge of display + bool _cp437; ///< If set, use correct CP437 charset (default is off) + GFXfont *gfxFont; ///< Pointer to special font +}; + +/// A simple drawn button UI element +class Adafruit_GFX_Button { + +public: + Adafruit_GFX_Button(void); + // "Classic" initButton() uses center & size + void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, uint16_t w, + uint16_t h, uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, uint8_t textsize); + void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, uint16_t w, + uint16_t h, uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, uint8_t textsize_x, + uint8_t textsize_y); + // New/alt initButton() uses upper-left corner & size + void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1, uint16_t w, + uint16_t h, uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, uint8_t textsize); + void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1, uint16_t w, + uint16_t h, uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, uint8_t textsize_x, + uint8_t textsize_y); + void drawButton(bool inverted = false); + bool contains(int16_t x, int16_t y); + + /**********************************************************************/ + /*! + @brief Sets button state, should be done by some touch function + @param p True for pressed, false for not. + */ + /**********************************************************************/ + void press(bool p) { + laststate = currstate; + currstate = p; + } + + bool justPressed(); + bool justReleased(); + + /**********************************************************************/ + /*! + @brief Query whether the button is currently pressed + @returns True if pressed + */ + /**********************************************************************/ + bool isPressed(void) { return currstate; }; + +private: + Adafruit_GFX *_gfx; + int16_t _x1, _y1; // Coordinates of top-left corner + uint16_t _w, _h; + uint8_t _textsize_x; + uint8_t _textsize_y; + uint16_t _outlinecolor, _fillcolor, _textcolor; + char _label[10]; + + bool currstate, laststate; +}; + +/// A GFX 1-bit canvas context for graphics +class GFXcanvas1 : public Adafruit_GFX { +public: + GFXcanvas1(uint16_t w, uint16_t h); + ~GFXcanvas1(void); + void drawPixel(int16_t x, int16_t y, uint16_t color); + void fillScreen(uint16_t color); + void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + bool getPixel(int16_t x, int16_t y) const; + /**********************************************************************/ + /*! + @brief Get a pointer to the internal buffer memory + @returns A pointer to the allocated buffer + */ + /**********************************************************************/ + uint8_t *getBuffer(void) const { return buffer; } + +protected: + bool getRawPixel(int16_t x, int16_t y) const; + void drawFastRawVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastRawHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + uint8_t *buffer; ///< Raster data: no longer private, allow subclass access + +private: +#ifdef __AVR__ + // Bitmask tables of 0x80>>X and ~(0x80>>X), because X>>Y is slow on AVR + static const uint8_t PROGMEM GFXsetBit[], GFXclrBit[]; +#endif +}; + +/// A GFX 8-bit canvas context for graphics +class GFXcanvas8 : public Adafruit_GFX { +public: + GFXcanvas8(uint16_t w, uint16_t h); + ~GFXcanvas8(void); + void drawPixel(int16_t x, int16_t y, uint16_t color); + void fillScreen(uint16_t color); + void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + uint8_t getPixel(int16_t x, int16_t y) const; + /**********************************************************************/ + /*! + @brief Get a pointer to the internal buffer memory + @returns A pointer to the allocated buffer + */ + /**********************************************************************/ + uint8_t *getBuffer(void) const { return buffer; } + +protected: + uint8_t getRawPixel(int16_t x, int16_t y) const; + void drawFastRawVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastRawHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + uint8_t *buffer; ///< Raster data: no longer private, allow subclass access +}; + +/// A GFX 16-bit canvas context for graphics +class GFXcanvas16 : public Adafruit_GFX { +public: + GFXcanvas16(uint16_t w, uint16_t h); + ~GFXcanvas16(void); + void drawPixel(int16_t x, int16_t y, uint16_t color); + void fillScreen(uint16_t color); + void byteSwap(void); + void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + uint16_t getPixel(int16_t x, int16_t y) const; + /**********************************************************************/ + /*! + @brief Get a pointer to the internal buffer memory + @returns A pointer to the allocated buffer + */ + /**********************************************************************/ + uint16_t *getBuffer(void) const { return buffer; } + +protected: + uint16_t getRawPixel(int16_t x, int16_t y) const; + void drawFastRawVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastRawHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + uint16_t *buffer; ///< Raster data: no longer private, allow subclass access +}; + +#endif // _ADAFRUIT_GFX_H diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp b/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp new file mode 100644 index 0000000..f83118e --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp @@ -0,0 +1,421 @@ +/*! + * @file Adafruit_GrayOLED.cpp + * + * This is documentation for Adafruit's generic library for grayscale + * OLED displays: http://www.adafruit.com/category/63_98 + * + * These displays use I2C or SPI to communicate. I2C requires 2 pins + * (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK, + * select, data/command) and optionally a reset pin. Hardware SPI or + * 'bitbang' software SPI are both supported. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + */ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include "Adafruit_GrayOLED.h" +#include "Adafruit_GFX.h" + +// SOME DEFINES AND STATIC VARIABLES USED INTERNALLY ----------------------- + +#define grayoled_swap(a, b) \ + (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) ///< No-temp-var swap operation + +// CONSTRUCTORS, DESTRUCTOR ------------------------------------------------ + +/*! + @brief Constructor for I2C-interfaced OLED displays. + @param bpp Bits per pixel, 1 for monochrome, 4 for 16-gray + @param w + Display width in pixels + @param h + Display height in pixels + @param twi + Pointer to an existing TwoWire instance (e.g. &Wire, the + microcontroller's primary I2C bus). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param clkDuring + Speed (in Hz) for Wire transmissions in library calls. + Defaults to 400000 (400 KHz), a known 'safe' value for most + microcontrollers, and meets the OLED datasheet spec. + Some systems can operate I2C faster (800 KHz for ESP32, 1 MHz + for many other 32-bit MCUs), and some (perhaps not all) + Many OLED's can work with this -- so it's optionally be specified + here and is not a default behavior. (Ignored if using pre-1.5.7 + Arduino software, which operates I2C at a fixed 100 KHz.) + @param clkAfter + Speed (in Hz) for Wire transmissions following library + calls. Defaults to 100000 (100 KHz), the default Arduino Wire + speed. This is done rather than leaving it at the 'during' speed + because other devices on the I2C bus might not be compatible + with the faster rate. (Ignored if using pre-1.5.7 Arduino + software, which operates I2C at a fixed 100 KHz.) + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_GrayOLED::Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, + TwoWire *twi, int8_t rst_pin, + uint32_t clkDuring, uint32_t clkAfter) + : Adafruit_GFX(w, h), i2c_preclk(clkDuring), i2c_postclk(clkAfter), + buffer(NULL), dcPin(-1), csPin(-1), rstPin(rst_pin), _bpp(bpp) { + i2c_dev = NULL; + _theWire = twi; +} + +/*! + @brief Constructor for SPI GrayOLED displays, using software (bitbang) + SPI. + @param bpp Bits per pixel, 1 for monochrome, 4 for 16-gray + @param w + Display width in pixels + @param h + Display height in pixels + @param mosi_pin + MOSI (master out, slave in) pin (using Arduino pin numbering). + This transfers serial data from microcontroller to display. + @param sclk_pin + SCLK (serial clock) pin (using Arduino pin numbering). + This clocks each bit from MOSI. + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_GrayOLED::Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, + int8_t mosi_pin, int8_t sclk_pin, + int8_t dc_pin, int8_t rst_pin, + int8_t cs_pin) + : Adafruit_GFX(w, h), dcPin(dc_pin), csPin(cs_pin), rstPin(rst_pin), + _bpp(bpp) { + + spi_dev = new Adafruit_SPIDevice(cs_pin, sclk_pin, -1, mosi_pin, 1000000); +} + +/*! + @brief Constructor for SPI GrayOLED displays, using native hardware SPI. + @param bpp Bits per pixel, 1 for monochrome, 4 for 16-gray + @param w + Display width in pixels + @param h + Display height in pixels + @param spi + Pointer to an existing SPIClass instance (e.g. &SPI, the + microcontroller's primary SPI bus). + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @param bitrate + SPI clock rate for transfers to this display. Default if + unspecified is 8000000UL (8 MHz). + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_GrayOLED::Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, + SPIClass *spi, int8_t dc_pin, + int8_t rst_pin, int8_t cs_pin, + uint32_t bitrate) + : Adafruit_GFX(w, h), dcPin(dc_pin), csPin(cs_pin), rstPin(rst_pin), + _bpp(bpp) { + + spi_dev = new Adafruit_SPIDevice(cs_pin, bitrate, SPI_BITORDER_MSBFIRST, + SPI_MODE0, spi); +} + +/*! + @brief Destructor for Adafruit_GrayOLED object. +*/ +Adafruit_GrayOLED::~Adafruit_GrayOLED(void) { + if (buffer) { + free(buffer); + buffer = NULL; + } + if (spi_dev) + delete spi_dev; + if (i2c_dev) + delete i2c_dev; +} + +// LOW-LEVEL UTILS --------------------------------------------------------- + +/*! + @brief Issue single command byte to OLED, using I2C or hard/soft SPI as + needed. + @param c The single byte command +*/ +void Adafruit_GrayOLED::oled_command(uint8_t c) { + if (i2c_dev) { // I2C + uint8_t buf[2] = {0x00, c}; // Co = 0, D/C = 0 + i2c_dev->write(buf, 2); + } else { // SPI (hw or soft) -- transaction started in calling function + digitalWrite(dcPin, LOW); + spi_dev->write(&c, 1); + } +} + +// Issue list of commands to GrayOLED +/*! + @brief Issue multiple bytes of commands OLED, using I2C or hard/soft SPI as + needed. + @param c Pointer to the command array + @param n The number of bytes in the command array + @returns True for success on ability to write the data in I2C. +*/ + +bool Adafruit_GrayOLED::oled_commandList(const uint8_t *c, uint8_t n) { + if (i2c_dev) { // I2C + uint8_t dc_byte = 0x00; // Co = 0, D/C = 0 + if (!i2c_dev->write((uint8_t *)c, n, true, &dc_byte, 1)) { + return false; + } + } else { // SPI -- transaction started in calling function + digitalWrite(dcPin, LOW); + if (!spi_dev->write((uint8_t *)c, n)) { + return false; + } + } + return true; +} + +// ALLOCATE & INIT DISPLAY ------------------------------------------------- + +/*! + @brief Allocate RAM for image buffer, initialize peripherals and pins. + Note that subclasses must call this before other begin() init + @param addr + I2C address of corresponding oled display. + SPI displays (hardware or software) do not use addresses, but + this argument is still required. Default if unspecified is 0x3C. + @param reset + If true, and if the reset pin passed to the constructor is + valid, a hard reset will be performed before initializing the + display. If using multiple oled displays on the same bus, and + if they all share the same reset pin, you should only pass true + on the first display being initialized, false on all others, + else the already-initialized displays would be reset. Default if + unspecified is true. + @return true on successful allocation/init, false otherwise. + Well-behaved code should check the return value before + proceeding. + @note MUST call this function before any drawing or updates! +*/ +bool Adafruit_GrayOLED::_init(uint8_t addr, bool reset) { + + // attempt to malloc the bitmap framebuffer + if ((!buffer) && + !(buffer = (uint8_t *)malloc(_bpp * WIDTH * ((HEIGHT + 7) / 8)))) { + return false; + } + + // Reset OLED if requested and reset pin specified in constructor + if (reset && (rstPin >= 0)) { + pinMode(rstPin, OUTPUT); + digitalWrite(rstPin, HIGH); + delay(10); // VDD goes high at start, pause + digitalWrite(rstPin, LOW); // Bring reset low + delay(10); // Wait 10 ms + digitalWrite(rstPin, HIGH); // Bring out of reset + delay(10); + } + + // Setup pin directions + if (_theWire) { // using I2C + i2c_dev = new Adafruit_I2CDevice(addr, _theWire); + // look for i2c address: + if (!i2c_dev || !i2c_dev->begin()) { + return false; + } + } else { // Using one of the SPI modes, either soft or hardware + if (!spi_dev || !spi_dev->begin()) { + return false; + } + pinMode(dcPin, OUTPUT); // Set data/command pin as output + } + + clearDisplay(); + + // set max dirty window + window_x1 = 0; + window_y1 = 0; + window_x2 = WIDTH - 1; + window_y2 = HEIGHT - 1; + + return true; // Success +} + +// DRAWING FUNCTIONS ------------------------------------------------------- + +/*! + @brief Set/clear/invert a single pixel. This is also invoked by the + Adafruit_GFX library in generating many higher-level graphics + primitives. + @param x + Column of display -- 0 at left to (screen width - 1) at right. + @param y + Row of display -- 0 at top to (screen height -1) at bottom. + @param color + Pixel color, one of: MONOOLED_BLACK, MONOOLED_WHITE or + MONOOLED_INVERT. + @note Changes buffer contents only, no immediate effect on display. + Follow up with a call to display(), or with other graphics + commands as needed by one's own application. +*/ +void Adafruit_GrayOLED::drawPixel(int16_t x, int16_t y, uint16_t color) { + if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) { + // Pixel is in-bounds. Rotate coordinates if needed. + switch (getRotation()) { + case 1: + grayoled_swap(x, y); + x = WIDTH - x - 1; + break; + case 2: + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + break; + case 3: + grayoled_swap(x, y); + y = HEIGHT - y - 1; + break; + } + + // adjust dirty window + window_x1 = min(window_x1, x); + window_y1 = min(window_y1, y); + window_x2 = max(window_x2, x); + window_y2 = max(window_y2, y); + + if (_bpp == 1) { + switch (color) { + case MONOOLED_WHITE: + buffer[x + (y / 8) * WIDTH] |= (1 << (y & 7)); + break; + case MONOOLED_BLACK: + buffer[x + (y / 8) * WIDTH] &= ~(1 << (y & 7)); + break; + case MONOOLED_INVERSE: + buffer[x + (y / 8) * WIDTH] ^= (1 << (y & 7)); + break; + } + } + if (_bpp == 4) { + uint8_t *pixelptr = &buffer[x / 2 + (y * WIDTH / 2)]; + // Serial.printf("(%d, %d) -> offset %d\n", x, y, x/2 + (y * WIDTH / 2)); + if (x % 2 == 0) { // even, left nibble + uint8_t t = pixelptr[0] & 0x0F; + t |= (color & 0xF) << 4; + pixelptr[0] = t; + } else { // odd, right lower nibble + uint8_t t = pixelptr[0] & 0xF0; + t |= color & 0xF; + pixelptr[0] = t; + } + } + } +} + +/*! + @brief Clear contents of display buffer (set all pixels to off). + @note Changes buffer contents only, no immediate effect on display. + Follow up with a call to display(), or with other graphics + commands as needed by one's own application. +*/ +void Adafruit_GrayOLED::clearDisplay(void) { + memset(buffer, 0, _bpp * WIDTH * ((HEIGHT + 7) / 8)); + // set max dirty window + window_x1 = 0; + window_y1 = 0; + window_x2 = WIDTH - 1; + window_y2 = HEIGHT - 1; +} + +/*! + @brief Return color of a single pixel in display buffer. + @param x + Column of display -- 0 at left to (screen width - 1) at right. + @param y + Row of display -- 0 at top to (screen height -1) at bottom. + @return true if pixel is set (usually MONOOLED_WHITE, unless display invert + mode is enabled), false if clear (MONOOLED_BLACK). + @note Reads from buffer contents; may not reflect current contents of + screen if display() has not been called. +*/ +bool Adafruit_GrayOLED::getPixel(int16_t x, int16_t y) { + if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) { + // Pixel is in-bounds. Rotate coordinates if needed. + switch (getRotation()) { + case 1: + grayoled_swap(x, y); + x = WIDTH - x - 1; + break; + case 2: + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + break; + case 3: + grayoled_swap(x, y); + y = HEIGHT - y - 1; + break; + } + return (buffer[x + (y / 8) * WIDTH] & (1 << (y & 7))); + } + return false; // Pixel out of bounds +} + +/*! + @brief Get base address of display buffer for direct reading or writing. + @return Pointer to an unsigned 8-bit array, column-major, columns padded + to full byte boundary if needed. +*/ +uint8_t *Adafruit_GrayOLED::getBuffer(void) { return buffer; } + +// OTHER HARDWARE SETTINGS ------------------------------------------------- + +/*! + @brief Enable or disable display invert mode (white-on-black vs + black-on-white). Handy for testing! + @param i + If true, switch to invert mode (black-on-white), else normal + mode (white-on-black). + @note This has an immediate effect on the display, no need to call the + display() function -- buffer contents are not changed, rather a + different pixel mode of the display hardware is used. When + enabled, drawing MONOOLED_BLACK (value 0) pixels will actually draw + white, MONOOLED_WHITE (value 1) will draw black. +*/ +void Adafruit_GrayOLED::invertDisplay(bool i) { + oled_command(i ? GRAYOLED_INVERTDISPLAY : GRAYOLED_NORMALDISPLAY); +} + +/*! + @brief Adjust the display contrast. + @param level The contrast level from 0 to 0x7F + @note This has an immediate effect on the display, no need to call the + display() function -- buffer contents are not changed. +*/ +void Adafruit_GrayOLED::setContrast(uint8_t level) { + uint8_t cmd[] = {GRAYOLED_SETCONTRAST, level}; + oled_commandList(cmd, 2); +} + +#endif /* ATTIN85 not supported */ diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.h b/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.h new file mode 100644 index 0000000..d959254 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.h @@ -0,0 +1,100 @@ +/*! + * @file Adafruit_GrayOLED.h + * + * This is part of for Adafruit's GFX library, supplying generic support + * for grayscale OLED displays: http://www.adafruit.com/category/63_98 + * + * These displays use I2C or SPI to communicate. I2C requires 2 pins + * (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK, + * select, data/command) and optionally a reset pin. Hardware SPI or + * 'bitbang' software SPI are both supported. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Written by Limor Fried/Ladyada for Adafruit Industries, with + * contributions from the open source community. + * + * BSD license, all text above, and the splash screen header file, + * must be included in any redistribution. + * + */ + +#ifndef _Adafruit_GRAYOLED_H_ +#define _Adafruit_GRAYOLED_H_ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include "Adafruit_GFX.h" +// #include +// #include +#include +#include + +#define GRAYOLED_SETCONTRAST 0x81 ///< Generic contrast for almost all OLEDs +#define GRAYOLED_NORMALDISPLAY 0xA6 ///< Generic non-invert for almost all OLEDs +#define GRAYOLED_INVERTDISPLAY 0xA7 ///< Generic invert for almost all OLEDs + +#define MONOOLED_BLACK 0 ///< Default black 'color' for monochrome OLEDS +#define MONOOLED_WHITE 1 ///< Default white 'color' for monochrome OLEDS +#define MONOOLED_INVERSE 2 ///< Default inversion command for monochrome OLEDS + +/*! + @brief Class that stores state and functions for interacting with + generic grayscale OLED displays. +*/ +class Adafruit_GrayOLED : public Adafruit_GFX { +public: + Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, TwoWire *twi = &Wire, + int8_t rst_pin = -1, uint32_t preclk = 400000, + uint32_t postclk = 100000); + Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, int8_t mosi_pin, + int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin, + int8_t cs_pin); + Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, SPIClass *spi, + int8_t dc_pin, int8_t rst_pin, int8_t cs_pin, + uint32_t bitrate = 8000000UL); + + ~Adafruit_GrayOLED(void); + + /** + @brief The function that sub-classes define that writes out the buffer to + the display over I2C or SPI + **/ + virtual void display(void) = 0; + void clearDisplay(void); + void invertDisplay(bool i); + void setContrast(uint8_t contrastlevel); + void drawPixel(int16_t x, int16_t y, uint16_t color); + bool getPixel(int16_t x, int16_t y); + uint8_t *getBuffer(void); + + void oled_command(uint8_t c); + bool oled_commandList(const uint8_t *c, uint8_t n); + +protected: + bool _init(uint8_t i2caddr = 0x3C, bool reset = true); + + Adafruit_SPIDevice *spi_dev = NULL; ///< The SPI interface BusIO device + Adafruit_I2CDevice *i2c_dev = NULL; ///< The I2C interface BusIO device + int32_t i2c_preclk = 400000, ///< Configurable 'high speed' I2C rate + i2c_postclk = 100000; ///< Configurable 'low speed' I2C rate + uint8_t *buffer = NULL; ///< Internal 1:1 framebuffer of display mem + + int16_t window_x1, ///< Dirty tracking window minimum x + window_y1, ///< Dirty tracking window minimum y + window_x2, ///< Dirty tracking window maximum x + window_y2; ///< Dirty tracking window maximum y + + int dcPin, ///< The Arduino pin connected to D/C (for SPI) + csPin, ///< The Arduino pin connected to CS (for SPI) + rstPin; ///< The Arduino pin connected to reset (-1 if unused) + + uint8_t _bpp = 1; ///< Bits per pixel color for this display +private: + TwoWire *_theWire = NULL; ///< The underlying hardware I2C +}; + +#endif // end __AVR_ATtiny85__ +#endif // _Adafruit_GrayOLED_H_ diff --git a/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.cpp b/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.cpp new file mode 100644 index 0000000..eeffce7 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.cpp @@ -0,0 +1,2561 @@ +/*! + * @file Adafruit_SPITFT.cpp + * + * @mainpage Adafruit SPI TFT Displays (and some others) + * + * @section intro_sec Introduction + * + * Part of Adafruit's GFX graphics library. Originally this class was + * written to handle a range of color TFT displays connected via SPI, + * but over time this library and some display-specific subclasses have + * mutated to include some color OLEDs as well as parallel-interfaced + * displays. The name's been kept for the sake of older code. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + + * @section dependencies Dependencies + * + * This library depends on + * Adafruit_GFX being present on your system. Please make sure you have + * installed the latest version before using this library. + * + * @section author Author + * + * Written by Limor "ladyada" Fried for Adafruit Industries, + * with contributions from the open source community. + * + * @section license License + * + * BSD license, all text here must be included in any redistribution. + */ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include "Adafruit_SPITFT.h" + +#if defined(__AVR__) +#if defined(__AVR_XMEGA__) // only tested with __AVR_ATmega4809__ +#define AVR_WRITESPI(x) \ + for (SPI0_DATA = (x); (!(SPI0_INTFLAGS & _BV(SPI_IF_bp)));) +#else +#define AVR_WRITESPI(x) for (SPDR = (x); (!(SPSR & _BV(SPIF)));) +#endif +#endif + +#if defined(PORT_IOBUS) +// On SAMD21, redefine digitalPinToPort() to use the slightly-faster +// PORT_IOBUS rather than PORT (not needed on SAMD51). +#undef digitalPinToPort +#define digitalPinToPort(P) (&(PORT_IOBUS->Group[g_APinDescription[P].ulPort])) +#endif // end PORT_IOBUS + +#if defined(USE_SPI_DMA) && (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO)) +// #pragma message ("GFX DMA IS ENABLED. HIGHLY EXPERIMENTAL.") +#include "wiring_private.h" // pinPeripheral() function +#include +#include // memalign() function +#define tcNum 2 // Timer/Counter for parallel write strobe PWM +#define wrPeripheral PIO_CCL // Use CCL to invert write strobe + +// DMA transfer-in-progress indicator and callback +static volatile bool dma_busy = false; +static void dma_callback(Adafruit_ZeroDMA *dma) { dma_busy = false; } + +#if defined(__SAMD51__) +// Timer/counter info by index # +static const struct { + Tc *tc; // -> Timer/Counter base address + int gclk; // GCLK ID + int evu; // EVSYS user ID +} tcList[] = {{TC0, TC0_GCLK_ID, EVSYS_ID_USER_TC0_EVU}, + {TC1, TC1_GCLK_ID, EVSYS_ID_USER_TC1_EVU}, + {TC2, TC2_GCLK_ID, EVSYS_ID_USER_TC2_EVU}, + {TC3, TC3_GCLK_ID, EVSYS_ID_USER_TC3_EVU}, +#if defined(TC4) + {TC4, TC4_GCLK_ID, EVSYS_ID_USER_TC4_EVU}, +#endif +#if defined(TC5) + {TC5, TC5_GCLK_ID, EVSYS_ID_USER_TC5_EVU}, +#endif +#if defined(TC6) + {TC6, TC6_GCLK_ID, EVSYS_ID_USER_TC6_EVU}, +#endif +#if defined(TC7) + {TC7, TC7_GCLK_ID, EVSYS_ID_USER_TC7_EVU} +#endif +}; +#define NUM_TIMERS (sizeof tcList / sizeof tcList[0]) ///< # timer/counters +#endif // end __SAMD51__ + +#endif // end USE_SPI_DMA + +// Possible values for Adafruit_SPITFT.connection: +#define TFT_HARD_SPI 0 ///< Display interface = hardware SPI +#define TFT_SOFT_SPI 1 ///< Display interface = software SPI +#define TFT_PARALLEL 2 ///< Display interface = 8- or 16-bit parallel + +// CONSTRUCTORS ------------------------------------------------------------ + +/*! + @brief Adafruit_SPITFT constructor for software (bitbang) SPI. + @param w Display width in pixels at default rotation setting (0). + @param h Display height in pixels at default rotation setting (0). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param mosi Arduino pin # for bitbang SPI MOSI signal (required). + @param sck Arduino pin # for bitbang SPI SCK signal (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @param miso Arduino pin # for bitbang SPI MISO signal (optional, + -1 default, many displays don't support SPI read). + @note Output pins are not initialized; application typically will + need to call subclass' begin() function, which in turn calls + this library's initSPI() function to initialize pins. +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, int8_t dc, + int8_t mosi, int8_t sck, int8_t rst, + int8_t miso) + : Adafruit_GFX(w, h), connection(TFT_SOFT_SPI), _rst(rst), _cs(cs), + _dc(dc) { + swspi._sck = sck; + swspi._mosi = mosi; + swspi._miso = miso; +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(CORE_TEENSY) +#if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); + swspi.sckPinMask = digitalPinToBitMask(sck); + swspi.mosiPinMask = digitalPinToBitMask(mosi); +#endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + swspi.sckPortSet = portSetRegister(sck); + swspi.sckPortClr = portClearRegister(sck); + swspi.mosiPortSet = portSetRegister(mosi); + swspi.mosiPortClr = portClearRegister(mosi); + if (cs >= 0) { +#if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); +#endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { +#if !defined(KINETISK) + csPinMask = 0; +#endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + if (miso >= 0) { + swspi.misoPort = portInputRegister(miso); +#if !defined(KINETISK) + swspi.misoPinMask = digitalPinToBitMask(miso); +#endif + } else { + swspi.misoPort = portInputRegister(dc); + } +#else // !CORE_TEENSY + dcPinMask = digitalPinToBitMask(dc); + swspi.sckPinMask = digitalPinToBitMask(sck); + swspi.mosiPinMask = digitalPinToBitMask(mosi); + dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + swspi.sckPortSet = &(PORT->Group[g_APinDescription[sck].ulPort].OUTSET.reg); + swspi.sckPortClr = &(PORT->Group[g_APinDescription[sck].ulPort].OUTCLR.reg); + swspi.mosiPortSet = &(PORT->Group[g_APinDescription[mosi].ulPort].OUTSET.reg); + swspi.mosiPortClr = &(PORT->Group[g_APinDescription[mosi].ulPort].OUTCLR.reg); + if (cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + if (miso >= 0) { + swspi.misoPinMask = digitalPinToBitMask(miso); + swspi.misoPort = (PORTreg_t)portInputRegister(digitalPinToPort(miso)); + } else { + swspi.misoPinMask = 0; + swspi.misoPort = (PORTreg_t)portInputRegister(digitalPinToPort(dc)); + } +#endif // end !CORE_TEENSY +#else // !HAS_PORT_SET_CLR + dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet = digitalPinToBitMask(dc); + swspi.sckPort = (PORTreg_t)portOutputRegister(digitalPinToPort(sck)); + swspi.sckPinMaskSet = digitalPinToBitMask(sck); + swspi.mosiPort = (PORTreg_t)portOutputRegister(digitalPinToPort(mosi)); + swspi.mosiPinMaskSet = digitalPinToBitMask(mosi); + if (cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + if (miso >= 0) { + swspi.misoPort = (PORTreg_t)portInputRegister(digitalPinToPort(miso)); + swspi.misoPinMask = digitalPinToBitMask(miso); + } else { + swspi.misoPort = (PORTreg_t)portInputRegister(digitalPinToPort(dc)); + swspi.misoPinMask = 0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + swspi.sckPinMaskClr = ~swspi.sckPinMaskSet; + swspi.mosiPinMaskClr = ~swspi.mosiPinMaskSet; +#endif // !end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} + +/*! + @brief Adafruit_SPITFT constructor for hardware SPI using the board's + default SPI peripheral. + @param w Display width in pixels at default rotation setting (0). + @param h Display height in pixels at default rotation setting (0). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @note Output pins are not initialized; application typically will + need to call subclass' begin() function, which in turn calls + this library's initSPI() function to initialize pins. +*/ +#if defined(ESP8266) // See notes below +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, int8_t dc, + int8_t rst) + : Adafruit_GFX(w, h), connection(TFT_HARD_SPI), _rst(rst), _cs(cs), + _dc(dc) { + hwspi._spi = &SPI; +} +#else // !ESP8266 +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, int8_t dc, + int8_t rst) + : Adafruit_SPITFT(w, h, &SPI, cs, dc, rst) { + // This just invokes the hardware SPI constructor below, + // passing the default SPI device (&SPI). +} +#endif // end !ESP8266 + +#if !defined(ESP8266) +// ESP8266 compiler freaks out at this constructor -- it can't disambiguate +// beteween the SPIClass pointer (argument #3) and a regular integer. +// Solution here it to just not offer this variant on the ESP8266. You can +// use the default hardware SPI peripheral, or you can use software SPI, +// but if there's any library out there that creates a 'virtual' SPIClass +// peripheral and drives it with software bitbanging, that's not supported. +/*! + @brief Adafruit_SPITFT constructor for hardware SPI using a specific + SPI peripheral. + @param w Display width in pixels at default rotation (0). + @param h Display height in pixels at default rotation (0). + @param spiClass Pointer to SPIClass type (e.g. &SPI or &SPI1). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @note Output pins are not initialized in constructor; application + typically will need to call subclass' begin() function, which + in turn calls this library's initSPI() function to initialize + pins. EXCEPT...if you have built your own SERCOM SPI peripheral + (calling the SPIClass constructor) rather than one of the + built-in SPI devices (e.g. &SPI, &SPI1 and so forth), you will + need to call the begin() function for your object as well as + pinPeripheral() for the MOSI, MISO and SCK pins to configure + GPIO manually. Do this BEFORE calling the display-specific + begin or init function. Unfortunate but unavoidable. +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, + int8_t cs, int8_t dc, int8_t rst) + : Adafruit_GFX(w, h), connection(TFT_HARD_SPI), _rst(rst), _cs(cs), + _dc(dc) { + hwspi._spi = spiClass; +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(CORE_TEENSY) +#if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); +#endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + if (cs >= 0) { +#if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); +#endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { // see comments below +#if !defined(KINETISK) + csPinMask = 0; +#endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } +#else // !CORE_TEENSY + dcPinMask = digitalPinToBitMask(dc); + dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + if (cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } +#endif // end !CORE_TEENSY +#else // !HAS_PORT_SET_CLR + dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet = digitalPinToBitMask(dc); + if (cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; +#endif // end !HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} +#endif // end !ESP8266 + +/*! + @brief Adafruit_SPITFT constructor for parallel display connection. + @param w Display width in pixels at default rotation (0). + @param h Display height in pixels at default rotation (0). + @param busWidth If tft16 (enumeration in header file), is a 16-bit + parallel connection, else 8-bit. + 16-bit isn't fully implemented or tested yet so + applications should pass "tft8bitbus" for now...needed to + stick a required enum argument in there to + disambiguate this constructor from the soft-SPI case. + Argument is ignored on 8-bit architectures (no 'wide' + support there since PORTs are 8 bits anyway). + @param d0 Arduino pin # for data bit 0 (1+ are extrapolated). + The 8 (or 16) data bits MUST be contiguous and byte- + aligned (or word-aligned for wide interface) within + the same PORT register (might not correspond to + Arduino pin sequence). + @param wr Arduino pin # for write strobe (required). + @param dc Arduino pin # for data/command select (required). + @param cs Arduino pin # for chip-select (optional, -1 if unused, + tie CS low). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @param rd Arduino pin # for read strobe (optional, -1 if unused). + @note Output pins are not initialized; application typically will need + to call subclass' begin() function, which in turn calls this + library's initSPI() function to initialize pins. + Yes, the name is a misnomer...this library originally handled + only SPI displays, parallel being a recent addition (but not + wanting to break existing code). +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, + int8_t d0, int8_t wr, int8_t dc, int8_t cs, + int8_t rst, int8_t rd) + : Adafruit_GFX(w, h), connection(TFT_PARALLEL), _rst(rst), _cs(cs), + _dc(dc) { + tft8._d0 = d0; + tft8._wr = wr; + tft8._rd = rd; + tft8.wide = (busWidth == tft16bitbus); +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(CORE_TEENSY) + tft8.wrPortSet = portSetRegister(wr); + tft8.wrPortClr = portClearRegister(wr); +#if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); +#endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + if (cs >= 0) { +#if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); +#endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { // see comments below +#if !defined(KINETISK) + csPinMask = 0; +#endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + if (rd >= 0) { // if read-strobe pin specified... +#if defined(KINETISK) + tft8.rdPinMask = 1; +#else // !KINETISK + tft8.rdPinMask = digitalPinToBitMask(rd); +#endif + tft8.rdPortSet = portSetRegister(rd); + tft8.rdPortClr = portClearRegister(rd); + } else { + tft8.rdPinMask = 0; + tft8.rdPortSet = dcPortSet; + tft8.rdPortClr = dcPortClr; + } + // These are all uint8_t* pointers -- elsewhere they're recast + // as necessary if a 'wide' 16-bit interface is in use. + tft8.writePort = portOutputRegister(d0); + tft8.readPort = portInputRegister(d0); + tft8.dirSet = portModeRegister(d0); + tft8.dirClr = portModeRegister(d0); +#else // !CORE_TEENSY + tft8.wrPinMask = digitalPinToBitMask(wr); + tft8.wrPortSet = &(PORT->Group[g_APinDescription[wr].ulPort].OUTSET.reg); + tft8.wrPortClr = &(PORT->Group[g_APinDescription[wr].ulPort].OUTCLR.reg); + dcPinMask = digitalPinToBitMask(dc); + dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + if (cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + if (rd >= 0) { // if read-strobe pin specified... + tft8.rdPinMask = digitalPinToBitMask(rd); + tft8.rdPortSet = &(PORT->Group[g_APinDescription[rd].ulPort].OUTSET.reg); + tft8.rdPortClr = &(PORT->Group[g_APinDescription[rd].ulPort].OUTCLR.reg); + } else { + tft8.rdPinMask = 0; + tft8.rdPortSet = dcPortSet; + tft8.rdPortClr = dcPortClr; + } + // Get pointers to PORT write/read/dir bytes within 32-bit PORT + uint8_t dBit = g_APinDescription[d0].ulPin; // d0 bit # in PORT + PortGroup *p = (&(PORT->Group[g_APinDescription[d0].ulPort])); + uint8_t offset = dBit / 8; // d[7:0] byte # within PORT + if (tft8.wide) + offset &= ~1; // d[15:8] byte # within PORT + // These are all uint8_t* pointers -- elsewhere they're recast + // as necessary if a 'wide' 16-bit interface is in use. + tft8.writePort = (volatile uint8_t *)&(p->OUT.reg) + offset; + tft8.readPort = (volatile uint8_t *)&(p->IN.reg) + offset; + tft8.dirSet = (volatile uint8_t *)&(p->DIRSET.reg) + offset; + tft8.dirClr = (volatile uint8_t *)&(p->DIRCLR.reg) + offset; +#endif // end !CORE_TEENSY +#else // !HAS_PORT_SET_CLR + tft8.wrPort = (PORTreg_t)portOutputRegister(digitalPinToPort(wr)); + tft8.wrPinMaskSet = digitalPinToBitMask(wr); + dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet = digitalPinToBitMask(dc); + if (cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + if (rd >= 0) { // if read-strobe pin specified... + tft8.rdPort = (PORTreg_t)portOutputRegister(digitalPinToPort(rd)); + tft8.rdPinMaskSet = digitalPinToBitMask(rd); + } else { + tft8.rdPort = dcPort; + tft8.rdPinMaskSet = 0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + tft8.wrPinMaskClr = ~tft8.wrPinMaskSet; + tft8.rdPinMaskClr = ~tft8.rdPinMaskSet; + tft8.writePort = (PORTreg_t)portOutputRegister(digitalPinToPort(d0)); + tft8.readPort = (PORTreg_t)portInputRegister(digitalPinToPort(d0)); + tft8.portDir = (PORTreg_t)portModeRegister(digitalPinToPort(d0)); +#endif // end !HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} + +// end constructors ------- + +// CLASS MEMBER FUNCTIONS -------------------------------------------------- + +// begin() and setAddrWindow() MUST be declared by any subclass. + +/*! + @brief Configure microcontroller pins for TFT interfacing. Typically + called by a subclass' begin() function. + @param freq SPI frequency when using hardware SPI. If default (0) + is passed, will fall back on a device-specific value. + Value is ignored when using software SPI or parallel + connection. + @param spiMode SPI mode when using hardware SPI. MUST be one of the + values SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3 + defined in SPI.h. Do NOT attempt to pass '0' for + SPI_MODE0 and so forth...the values are NOT the same! + Use ONLY the defines! (Pity it's not an enum.) + @note Another anachronistically-named function; this is called even + when the display connection is parallel (not SPI). Also, this + could probably be made private...quite a few class functions + were generously put in the public section. +*/ +void Adafruit_SPITFT::initSPI(uint32_t freq, uint8_t spiMode) { + + if (!freq) + freq = DEFAULT_SPI_FREQ; // If no freq specified, use default + + // Init basic control pins common to all connection types + if (_cs >= 0) { + pinMode(_cs, OUTPUT); + digitalWrite(_cs, HIGH); // Deselect + } + pinMode(_dc, OUTPUT); + digitalWrite(_dc, HIGH); // Data mode + + if (connection == TFT_HARD_SPI) { + +#if defined(SPI_HAS_TRANSACTION) + hwspi.settings = SPISettings(freq, MSBFIRST, spiMode); +#else + hwspi._freq = freq; // Save freq value for later +#endif + hwspi._mode = spiMode; // Save spiMode value for later + // Call hwspi._spi->begin() ONLY if this is among the 'established' + // SPI interfaces in variant.h. For DIY roll-your-own SERCOM SPIs, + // begin() and pinPeripheral() calls MUST be made in one's calling + // code, BEFORE the screen-specific begin/init function is called. + // Reason for this is that SPI::begin() makes its own calls to + // pinPeripheral() based on g_APinDescription[n].ulPinType, which + // on non-established SPI interface pins will always be PIO_DIGITAL + // or similar, while we need PIO_SERCOM or PIO_SERCOM_ALT...it's + // highly unique between devices and variants for each pin or + // SERCOM so we can't make those calls ourselves here. And the SPI + // device needs to be set up before calling this because it's + // immediately followed with initialization commands. Blargh. + if ( +#if !defined(SPI_INTERFACES_COUNT) + 1 +#else +#if SPI_INTERFACES_COUNT > 0 + (hwspi._spi == &SPI) +#endif +#if SPI_INTERFACES_COUNT > 1 + || (hwspi._spi == &SPI1) +#endif +#if SPI_INTERFACES_COUNT > 2 + || (hwspi._spi == &SPI2) +#endif +#if SPI_INTERFACES_COUNT > 3 + || (hwspi._spi == &SPI3) +#endif +#if SPI_INTERFACES_COUNT > 4 + || (hwspi._spi == &SPI4) +#endif +#if SPI_INTERFACES_COUNT > 5 + || (hwspi._spi == &SPI5) +#endif +#endif // end SPI_INTERFACES_COUNT + ) { + hwspi._spi->begin(); + } + } else if (connection == TFT_SOFT_SPI) { + + pinMode(swspi._mosi, OUTPUT); + digitalWrite(swspi._mosi, LOW); + pinMode(swspi._sck, OUTPUT); + digitalWrite(swspi._sck, LOW); + if (swspi._miso >= 0) { + pinMode(swspi._miso, INPUT); + } + + } else { // TFT_PARALLEL + // Initialize data pins. We were only passed d0, so scan + // the pin description list looking for the other pins. + // They'll be on the same PORT, and within the next 7 (or 15) bits + // (because we need to write to a contiguous PORT byte or word). +#if defined(__AVR__) + // PORT registers are 8 bits wide, so just need a register match... + for (uint8_t i = 0; i < NUM_DIGITAL_PINS; i++) { + if ((PORTreg_t)portOutputRegister(digitalPinToPort(i)) == + tft8.writePort) { + pinMode(i, OUTPUT); + digitalWrite(i, LOW); + } + } +#elif defined(USE_FAST_PINIO) +#if defined(CORE_TEENSY) + if (!tft8.wide) { + *tft8.dirSet = 0xFF; // Set port to output + *tft8.writePort = 0x00; // Write all 0s + } else { + *(volatile uint16_t *)tft8.dirSet = 0xFFFF; + *(volatile uint16_t *)tft8.writePort = 0x0000; + } +#else // !CORE_TEENSY + uint8_t portNum = g_APinDescription[tft8._d0].ulPort, // d0 PORT # + dBit = g_APinDescription[tft8._d0].ulPin, // d0 bit in PORT + lastBit = dBit + (tft8.wide ? 15 : 7); + for (uint8_t i = 0; i < PINS_COUNT; i++) { + if ((g_APinDescription[i].ulPort == portNum) && + (g_APinDescription[i].ulPin >= dBit) && + (g_APinDescription[i].ulPin <= (uint32_t)lastBit)) { + pinMode(i, OUTPUT); + digitalWrite(i, LOW); + } + } +#endif // end !CORE_TEENSY +#endif + pinMode(tft8._wr, OUTPUT); + digitalWrite(tft8._wr, HIGH); + if (tft8._rd >= 0) { + pinMode(tft8._rd, OUTPUT); + digitalWrite(tft8._rd, HIGH); + } + } + + if (_rst >= 0) { + // Toggle _rst low to reset + pinMode(_rst, OUTPUT); + digitalWrite(_rst, HIGH); + delay(100); + digitalWrite(_rst, LOW); + delay(100); + digitalWrite(_rst, HIGH); + delay(200); + } + +#if defined(USE_SPI_DMA) && (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO)) + if (((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) && + (dma.allocate() == DMA_STATUS_OK)) { // Allocate channel + // The DMA library needs to alloc at least one valid descriptor, + // so we do that here. It's not used in the usual sense though, + // just before a transfer we copy descriptor[0] to this address. + if (dptr = dma.addDescriptor(NULL, NULL, 42, DMA_BEAT_SIZE_BYTE, false, + false)) { + // Alloc 2 scanlines worth of pixels on display's major axis, + // whichever that is, rounding each up to 2-pixel boundary. + int major = (WIDTH > HEIGHT) ? WIDTH : HEIGHT; + major += (major & 1); // -> next 2-pixel bound, if needed. + maxFillLen = major * 2; // 2 scanlines + // Note to future self: if you decide to make the pixel buffer + // much larger, remember that DMA transfer descriptors can't + // exceed 65,535 bytes (not 65,536), meaning 32,767 pixels max. + // Not that we have that kind of RAM to throw around right now. + if ((pixelBuf[0] = (uint16_t *)malloc(maxFillLen * sizeof(uint16_t)))) { + // Alloc OK. Get pointer to start of second scanline. + pixelBuf[1] = &pixelBuf[0][major]; + // Determine number of DMA descriptors needed to cover + // entire screen when entire 2-line pixelBuf is used + // (round up for fractional last descriptor). + int numDescriptors = (WIDTH * HEIGHT + (maxFillLen - 1)) / maxFillLen; + // DMA descriptors MUST be 128-bit (16 byte) aligned. + // memalign() is considered obsolete but it's replacements + // (aligned_alloc() or posix_memalign()) are not currently + // available in the version of ARM GCC in use, but this + // is, so here we are. + if ((descriptor = (DmacDescriptor *)memalign( + 16, numDescriptors * sizeof(DmacDescriptor)))) { + int dmac_id; + volatile uint32_t *data_reg; + + if (connection == TFT_HARD_SPI) { + // THIS IS AN AFFRONT TO NATURE, but I don't know + // any "clean" way to get the sercom number from the + // the SPIClass pointer (e.g. &SPI or &SPI1), which + // is all we have to work with. SPIClass does contain + // a SERCOM pointer but it is a PRIVATE member! + // Doing an UNSPEAKABLY HORRIBLE THING here, directly + // accessing the first 32-bit value in the SPIClass + // structure, knowing that's (currently) where the + // SERCOM pointer lives, but this ENTIRELY DEPENDS on + // that structure not changing nor the compiler + // rearranging things. Oh the humanity! + + if (*(SERCOM **)hwspi._spi == &sercom0) { + dmac_id = SERCOM0_DMAC_ID_TX; + data_reg = &SERCOM0->SPI.DATA.reg; +#if defined SERCOM1 + } else if (*(SERCOM **)hwspi._spi == &sercom1) { + dmac_id = SERCOM1_DMAC_ID_TX; + data_reg = &SERCOM1->SPI.DATA.reg; +#endif +#if defined SERCOM2 + } else if (*(SERCOM **)hwspi._spi == &sercom2) { + dmac_id = SERCOM2_DMAC_ID_TX; + data_reg = &SERCOM2->SPI.DATA.reg; +#endif +#if defined SERCOM3 + } else if (*(SERCOM **)hwspi._spi == &sercom3) { + dmac_id = SERCOM3_DMAC_ID_TX; + data_reg = &SERCOM3->SPI.DATA.reg; +#endif +#if defined SERCOM4 + } else if (*(SERCOM **)hwspi._spi == &sercom4) { + dmac_id = SERCOM4_DMAC_ID_TX; + data_reg = &SERCOM4->SPI.DATA.reg; +#endif +#if defined SERCOM5 + } else if (*(SERCOM **)hwspi._spi == &sercom5) { + dmac_id = SERCOM5_DMAC_ID_TX; + data_reg = &SERCOM5->SPI.DATA.reg; +#endif +#if defined SERCOM6 + } else if (*(SERCOM **)hwspi._spi == &sercom6) { + dmac_id = SERCOM6_DMAC_ID_TX; + data_reg = &SERCOM6->SPI.DATA.reg; +#endif +#if defined SERCOM7 + } else if (*(SERCOM **)hwspi._spi == &sercom7) { + dmac_id = SERCOM7_DMAC_ID_TX; + data_reg = &SERCOM7->SPI.DATA.reg; +#endif + } + dma.setPriority(DMA_PRIORITY_3); + dma.setTrigger(dmac_id); + dma.setAction(DMA_TRIGGER_ACTON_BEAT); + + // Initialize descriptor list. + for (int d = 0; d < numDescriptors; d++) { + // No need to set SRCADDR, DESCADDR or BTCNT -- + // those are done in the pixel-writing functions. + descriptor[d].BTCTRL.bit.VALID = true; + descriptor[d].BTCTRL.bit.EVOSEL = DMA_EVENT_OUTPUT_DISABLE; + descriptor[d].BTCTRL.bit.BLOCKACT = DMA_BLOCK_ACTION_NOACT; + descriptor[d].BTCTRL.bit.BEATSIZE = DMA_BEAT_SIZE_BYTE; + descriptor[d].BTCTRL.bit.DSTINC = 0; + descriptor[d].BTCTRL.bit.STEPSEL = DMA_STEPSEL_SRC; + descriptor[d].BTCTRL.bit.STEPSIZE = + DMA_ADDRESS_INCREMENT_STEP_SIZE_1; + descriptor[d].DSTADDR.reg = (uint32_t)data_reg; + } + + } else { // Parallel connection + +#if defined(__SAMD51__) + int dmaChannel = dma.getChannel(); + // Enable event output, use EVOSEL output + DMAC->Channel[dmaChannel].CHEVCTRL.bit.EVOE = 1; + DMAC->Channel[dmaChannel].CHEVCTRL.bit.EVOMODE = 0; + + // CONFIGURE TIMER/COUNTER (for write strobe) + + Tc *timer = tcList[tcNum].tc; // -> Timer struct + int id = tcList[tcNum].gclk; // Timer GCLK ID + GCLK_PCHCTRL_Type pchctrl; + + // Set up timer clock source from GCLK + GCLK->PCHCTRL[id].bit.CHEN = 0; // Stop timer + while (GCLK->PCHCTRL[id].bit.CHEN) + ; // Wait for it + pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; + pchctrl.bit.CHEN = 1; // Enable + GCLK->PCHCTRL[id].reg = pchctrl.reg; + while (!GCLK->PCHCTRL[id].bit.CHEN) + ; // Wait for it + + // Disable timer/counter before configuring it + timer->COUNT8.CTRLA.bit.ENABLE = 0; + while (timer->COUNT8.SYNCBUSY.bit.STATUS) + ; + + timer->COUNT8.WAVE.bit.WAVEGEN = 2; // NPWM + timer->COUNT8.CTRLA.bit.MODE = 1; // 8-bit + timer->COUNT8.CTRLA.bit.PRESCALER = 0; // 1:1 + while (timer->COUNT8.SYNCBUSY.bit.STATUS) + ; + + timer->COUNT8.CTRLBCLR.bit.DIR = 1; // Count UP + while (timer->COUNT8.SYNCBUSY.bit.CTRLB) + ; + timer->COUNT8.CTRLBSET.bit.ONESHOT = 1; // One-shot + while (timer->COUNT8.SYNCBUSY.bit.CTRLB) + ; + timer->COUNT8.PER.reg = 6; // PWM top + while (timer->COUNT8.SYNCBUSY.bit.PER) + ; + timer->COUNT8.CC[0].reg = 2; // Compare + while (timer->COUNT8.SYNCBUSY.bit.CC0) + ; + // Enable async input events, + // event action = restart. + timer->COUNT8.EVCTRL.bit.TCEI = 1; + timer->COUNT8.EVCTRL.bit.EVACT = 1; + + // Enable timer + timer->COUNT8.CTRLA.reg |= TC_CTRLA_ENABLE; + while (timer->COUNT8.SYNCBUSY.bit.STATUS) + ; + +#if (wrPeripheral == PIO_CCL) + // CONFIGURE CCL (inverts timer/counter output) + + MCLK->APBCMASK.bit.CCL_ = 1; // Enable CCL clock + CCL->CTRL.bit.ENABLE = 0; // Disable to config + CCL->CTRL.bit.SWRST = 1; // Reset CCL registers + CCL->LUTCTRL[tcNum].bit.ENABLE = 0; // Disable LUT + CCL->LUTCTRL[tcNum].bit.FILTSEL = 0; // No filter + CCL->LUTCTRL[tcNum].bit.INSEL0 = 6; // TC input + CCL->LUTCTRL[tcNum].bit.INSEL1 = 0; // MASK + CCL->LUTCTRL[tcNum].bit.INSEL2 = 0; // MASK + CCL->LUTCTRL[tcNum].bit.TRUTH = 1; // Invert in 0 + CCL->LUTCTRL[tcNum].bit.ENABLE = 1; // Enable LUT + CCL->CTRL.bit.ENABLE = 1; // Enable CCL +#endif + + // CONFIGURE EVENT SYSTEM + + // Set up event system clock source from GCLK... + // Disable EVSYS, wait for disable + GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN = 0; + while (GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN) + ; + pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; + pchctrl.bit.CHEN = 1; // Re-enable + GCLK->PCHCTRL[EVSYS_GCLK_ID_0].reg = pchctrl.reg; + // Wait for it, then enable EVSYS clock + while (!GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN) + ; + MCLK->APBBMASK.bit.EVSYS_ = 1; + + // Connect Timer EVU to ch 0 + EVSYS->USER[tcList[tcNum].evu].reg = 1; + // Datasheet recommends single write operation; + // reg instead of bit. Also datasheet: PATH bits + // must be zero when using async! + EVSYS_CHANNEL_Type ev; + ev.reg = 0; + ev.bit.PATH = 2; // Asynchronous + ev.bit.EVGEN = 0x22 + dmaChannel; // DMA channel 0+ + EVSYS->Channel[0].CHANNEL.reg = ev.reg; + + // Initialize descriptor list. + for (int d = 0; d < numDescriptors; d++) { + // No need to set SRCADDR, DESCADDR or BTCNT -- + // those are done in the pixel-writing functions. + descriptor[d].BTCTRL.bit.VALID = true; + // Event strobe on beat xfer: + descriptor[d].BTCTRL.bit.EVOSEL = 0x3; + descriptor[d].BTCTRL.bit.BLOCKACT = DMA_BLOCK_ACTION_NOACT; + descriptor[d].BTCTRL.bit.BEATSIZE = + tft8.wide ? DMA_BEAT_SIZE_HWORD : DMA_BEAT_SIZE_BYTE; + descriptor[d].BTCTRL.bit.SRCINC = 1; + descriptor[d].BTCTRL.bit.DSTINC = 0; + descriptor[d].BTCTRL.bit.STEPSEL = DMA_STEPSEL_SRC; + descriptor[d].BTCTRL.bit.STEPSIZE = + DMA_ADDRESS_INCREMENT_STEP_SIZE_1; + descriptor[d].DSTADDR.reg = (uint32_t)tft8.writePort; + } +#endif // __SAMD51 + } // end parallel-specific DMA setup + + lastFillColor = 0x0000; + lastFillLen = 0; + dma.setCallback(dma_callback); + return; // Success! + // else clean up any partial allocation... + } // end descriptor memalign() + free(pixelBuf[0]); + pixelBuf[0] = pixelBuf[1] = NULL; + } // end pixelBuf malloc() + // Don't currently have a descriptor delete function in + // ZeroDMA lib, but if we did, it would be called here. + } // end addDescriptor() + dma.free(); // Deallocate DMA channel + } +#endif // end USE_SPI_DMA +} + +/*! + @brief Allow changing the SPI clock speed after initialization + @param freq Desired frequency of SPI clock, may not be the + end frequency you get based on what the chip can do! +*/ +void Adafruit_SPITFT::setSPISpeed(uint32_t freq) { +#if defined(SPI_HAS_TRANSACTION) + hwspi.settings = SPISettings(freq, MSBFIRST, hwspi._mode); +#else + hwspi._freq = freq; // Save freq value for later +#endif +} + +/*! + @brief Call before issuing command(s) or data to display. Performs + chip-select (if required) and starts an SPI transaction (if + using hardware SPI and transactions are supported). Required + for all display types; not an SPI-specific function. +*/ +void Adafruit_SPITFT::startWrite(void) { + SPI_BEGIN_TRANSACTION(); + if (_cs >= 0) + SPI_CS_LOW(); +} + +/*! + @brief Call after issuing command(s) or data to display. Performs + chip-deselect (if required) and ends an SPI transaction (if + using hardware SPI and transactions are supported). Required + for all display types; not an SPI-specific function. +*/ +void Adafruit_SPITFT::endWrite(void) { + if (_cs >= 0) + SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +// ------------------------------------------------------------------------- +// Lower-level graphics operations. These functions require a chip-select +// and/or SPI transaction around them (via startWrite(), endWrite() above). +// Higher-level graphics primitives might start a single transaction and +// then make multiple calls to these functions (e.g. circle or text +// rendering might make repeated lines or rects) before ending the +// transaction. It's more efficient than starting a transaction every time. + +/*! + @brief Draw a single pixel to the display at requested coordinates. + Not self-contained; should follow a startWrite() call. + @param x Horizontal position (0 = left). + @param y Vertical position (0 = top). + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::writePixel(int16_t x, int16_t y, uint16_t color) { + if ((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { + setAddrWindow(x, y, 1, 1); + SPI_WRITE16(color); + } +} + +/*! + @brief Swap bytes in an array of pixels; converts little-to-big or + big-to-little endian. Used by writePixels() below in some + situations, but may also be helpful for user code occasionally. + @param src Source address of 16-bit pixels buffer. + @param len Number of pixels to byte-swap. + @param dest Optional destination address if different than src -- + otherwise, if NULL (default) or same address is passed, + pixel buffer is overwritten in-place. +*/ +void Adafruit_SPITFT::swapBytes(uint16_t *src, uint32_t len, uint16_t *dest) { + if (!dest) + dest = src; // NULL -> overwrite src buffer + for (uint32_t i = 0; i < len; i++) { + dest[i] = __builtin_bswap16(src[i]); + } +} + +/*! + @brief Issue a series of pixels from memory to the display. Not self- + contained; should follow startWrite() and setAddrWindow() calls. + @param colors Pointer to array of 16-bit pixel values in '565' RGB + format. + @param len Number of elements in 'colors' array. + @param block If true (default case if unspecified), function blocks + until DMA transfer is complete. This is simply IGNORED + if DMA is not enabled. If false, the function returns + immediately after the last DMA transfer is started, + and one should use the dmaWait() function before + doing ANY other display-related activities (or even + any SPI-related activities, if using an SPI display + that shares the bus with other devices). + @param bigEndian If true, bitmap in memory is in big-endian order (most + significant byte first). By default this is false, as + most microcontrollers seem to be little-endian and + 16-bit pixel values must be byte-swapped before + issuing to the display (which tend toward big-endian + when using SPI or 8-bit parallel). If an application + can optimize around this -- for example, a bitmap in a + uint16_t array having the byte values already ordered + big-endian, this can save time here, ESPECIALLY if + using this function's non-blocking DMA mode. +*/ +void Adafruit_SPITFT::writePixels(uint16_t *colors, uint32_t len, bool block, + bool bigEndian) { + + if (!len) + return; // Avoid 0-byte transfers + + // avoid paramater-not-used complaints + (void)block; + (void)bigEndian; + +#if defined(ESP32) + if (connection == TFT_HARD_SPI) { + if (!bigEndian) { + hwspi._spi->writePixels(colors, len * 2); // Inbuilt endian-swap + } else { + hwspi._spi->writeBytes((uint8_t *)colors, len * 2); // Issue bytes direct + } + return; + } +#elif defined(ARDUINO_NRF52_ADAFRUIT) && \ + defined(NRF52840_XXAA) // Adafruit nRF52 use SPIM3 DMA at 32Mhz + if (!bigEndian) { + swapBytes(colors, len); // convert little-to-big endian for display + } + hwspi._spi->transfer(colors, NULL, 2 * len); // NULL RX to avoid overwrite + if (!bigEndian) { + swapBytes(colors, len); // big-to-little endian to restore pixel buffer + } + + return; +#elif defined(ARDUINO_ARCH_RP2040) + spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1; + + if (!bigEndian) { + // switch to 16-bit writes + hw_write_masked(&spi_get_hw(pi_spi)->cr0, 15 << SPI_SSPCR0_DSS_LSB, + SPI_SSPCR0_DSS_BITS); + spi_write16_blocking(pi_spi, colors, len); + // switch back to 8-bit + hw_write_masked(&spi_get_hw(pi_spi)->cr0, 7 << SPI_SSPCR0_DSS_LSB, + SPI_SSPCR0_DSS_BITS); + } else { + spi_write_blocking(pi_spi, (uint8_t *)colors, len * 2); + } + return; +#elif defined(USE_SPI_DMA) && \ + (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO)) + if ((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) { + int maxSpan = maxFillLen / 2; // One scanline max + uint8_t pixelBufIdx = 0; // Active pixel buffer number +#if defined(__SAMD51__) + if (connection == TFT_PARALLEL) { + // Switch WR pin to PWM or CCL + pinPeripheral(tft8._wr, wrPeripheral); + } +#endif // end __SAMD51__ + if (!bigEndian) { // Normal little-endian situation... + while (len) { + int count = (len < maxSpan) ? len : maxSpan; + + // Because TFT and SAMD endianisms are different, must swap + // bytes from the 'colors' array passed into a DMA working + // buffer. This can take place while the prior DMA transfer + // is in progress, hence the need for two pixelBufs. + swapBytes(colors, count, pixelBuf[pixelBufIdx]); + colors += count; + + // The transfers themselves are relatively small, so we don't + // need a long descriptor list. We just alternate between the + // first two, sharing pixelBufIdx for that purpose. + descriptor[pixelBufIdx].SRCADDR.reg = + (uint32_t)pixelBuf[pixelBufIdx] + count * 2; + descriptor[pixelBufIdx].BTCTRL.bit.SRCINC = 1; + descriptor[pixelBufIdx].BTCNT.reg = count * 2; + descriptor[pixelBufIdx].DESCADDR.reg = 0; + + while (dma_busy) + ; // Wait for prior line to finish + + // Move new descriptor into place... + memcpy(dptr, &descriptor[pixelBufIdx], sizeof(DmacDescriptor)); + dma_busy = true; + dma.startJob(); // Trigger SPI DMA transfer + if (connection == TFT_PARALLEL) + dma.trigger(); + pixelBufIdx = 1 - pixelBufIdx; // Swap DMA pixel buffers + + len -= count; + } + } else { // bigEndian == true + // With big-endian pixel data, this can be handled as a single + // DMA transfer using chained descriptors. Even full screen, this + // needs only a relatively short descriptor list, each + // transferring a max of 32,767 (not 32,768) pixels. The list + // was allocated large enough to accommodate a full screen's + // worth of data, so this won't run past the end of the list. + int d, numDescriptors = (len + 32766) / 32767; + for (d = 0; d < numDescriptors; d++) { + int count = (len < 32767) ? len : 32767; + descriptor[d].SRCADDR.reg = (uint32_t)colors + count * 2; + descriptor[d].BTCTRL.bit.SRCINC = 1; + descriptor[d].BTCNT.reg = count * 2; + descriptor[d].DESCADDR.reg = (uint32_t)&descriptor[d + 1]; + len -= count; + colors += count; + } + descriptor[d - 1].DESCADDR.reg = 0; + + while (dma_busy) + ; // Wait for prior transfer (if any) to finish + + // Move first descriptor into place and start transfer... + memcpy(dptr, &descriptor[0], sizeof(DmacDescriptor)); + dma_busy = true; + dma.startJob(); // Trigger SPI DMA transfer + if (connection == TFT_PARALLEL) + dma.trigger(); + } // end bigEndian + + lastFillColor = 0x0000; // pixelBuf has been sullied + lastFillLen = 0; + if (block) { + while (dma_busy) + ; // Wait for last line to complete +#if defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO) + if (connection == TFT_HARD_SPI) { + // See SAMD51/21 note in writeColor() + hwspi._spi->setDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } +#endif // end __SAMD51__ || ARDUINO_SAMD_ZERO + } + return; + } +#endif // end USE_SPI_DMA + + // All other cases (bitbang SPI or non-DMA hard SPI or parallel), + // use a loop with the normal 16-bit data write function: + + if (!bigEndian) { + while (len--) { + SPI_WRITE16(*colors++); + } + } else { + // Well this is awkward. SPI_WRITE16() was designed for little-endian + // hosts and big-endian displays as that's nearly always the typical + // case. If the bigEndian flag was set, data is already in display's + // order...so each pixel needs byte-swapping before being issued. + // Rather than having a separate big-endian SPI_WRITE16 (adding more + // bloat), it's preferred if calling function is smart and only uses + // bigEndian where DMA is supported. But we gotta handle this... + while (len--) { + SPI_WRITE16(__builtin_bswap16(*colors++)); + } + } +} + +/*! + @brief Wait for the last DMA transfer in a prior non-blocking + writePixels() call to complete. This does nothing if DMA + is not enabled, and is not needed if blocking writePixels() + was used (as is the default case). +*/ +void Adafruit_SPITFT::dmaWait(void) { +#if defined(USE_SPI_DMA) && (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO)) + while (dma_busy) + ; +#if defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO) + if (connection == TFT_HARD_SPI) { + // See SAMD51/21 note in writeColor() + hwspi._spi->setDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } +#endif // end __SAMD51__ || ARDUINO_SAMD_ZERO +#endif +} + +/*! + @brief Check if DMA transfer is active. Always returts false if DMA + is not enabled. + @return true if DMA is enabled and transmitting data, false otherwise. +*/ +bool Adafruit_SPITFT::dmaBusy(void) const { +#if defined(USE_SPI_DMA) && (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO)) + return dma_busy; +#else + return false; +#endif +} + +/*! + @brief Issue a series of pixels, all the same color. Not self- + contained; should follow startWrite() and setAddrWindow() calls. + @param color 16-bit pixel color in '565' RGB format. + @param len Number of pixels to draw. +*/ +void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) { + + if (!len) + return; // Avoid 0-byte transfers + + uint8_t hi = color >> 8, lo = color; + +#if defined(ESP32) // ESP32 has a special SPI pixel-writing function... + if (connection == TFT_HARD_SPI) { +#define SPI_MAX_PIXELS_AT_ONCE 32 +#define TMPBUF_LONGWORDS (SPI_MAX_PIXELS_AT_ONCE + 1) / 2 +#define TMPBUF_PIXELS (TMPBUF_LONGWORDS * 2) + static uint32_t temp[TMPBUF_LONGWORDS]; + uint32_t c32 = color * 0x00010001; + uint16_t bufLen = (len < TMPBUF_PIXELS) ? len : TMPBUF_PIXELS, xferLen, + fillLen; + // Fill temp buffer 32 bits at a time + fillLen = (bufLen + 1) / 2; // Round up to next 32-bit boundary + for (uint32_t t = 0; t < fillLen; t++) { + temp[t] = c32; + } + // Issue pixels in blocks from temp buffer + while (len) { // While pixels remain + xferLen = (bufLen < len) ? bufLen : len; // How many this pass? + writePixels((uint16_t *)temp, xferLen); + len -= xferLen; + } + return; + } +#elif defined(ARDUINO_NRF52_ADAFRUIT) && \ + defined(NRF52840_XXAA) // Adafruit nRF52840 use SPIM3 DMA at 32Mhz + // at most 2 scan lines + uint32_t const pixbufcount = min(len, ((uint32_t)2 * width())); + uint16_t *pixbuf = (uint16_t *)rtos_malloc(2 * pixbufcount); + + // use SPI3 DMA if we could allocate buffer, else fall back to writing each + // pixel loop below + if (pixbuf) { + uint16_t const swap_color = __builtin_bswap16(color); + + // fill buffer with color + for (uint32_t i = 0; i < pixbufcount; i++) { + pixbuf[i] = swap_color; + } + + while (len) { + uint32_t const count = min(len, pixbufcount); + writePixels(pixbuf, count, true, true); + len -= count; + } + + rtos_free(pixbuf); + return; + } +#else // !ESP32 +#if defined(USE_SPI_DMA) && (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO)) + if (((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) && + (len >= 16)) { // Don't bother with DMA on short pixel runs + int i, d, numDescriptors; + if (hi == lo) { // If high & low bytes are same... + onePixelBuf = color; + // Can do this with a relatively short descriptor list, + // each transferring a max of 32,767 (not 32,768) pixels. + // This won't run off the end of the allocated descriptor list, + // since we're using much larger chunks per descriptor here. + numDescriptors = (len + 32766) / 32767; + for (d = 0; d < numDescriptors; d++) { + int count = (len < 32767) ? len : 32767; + descriptor[d].SRCADDR.reg = (uint32_t)&onePixelBuf; + descriptor[d].BTCTRL.bit.SRCINC = 0; + descriptor[d].BTCNT.reg = count * 2; + descriptor[d].DESCADDR.reg = (uint32_t)&descriptor[d + 1]; + len -= count; + } + descriptor[d - 1].DESCADDR.reg = 0; + } else { + // If high and low bytes are distinct, it's necessary to fill + // a buffer with pixel data (swapping high and low bytes because + // TFT and SAMD are different endianisms) and create a longer + // descriptor list pointing repeatedly to this data. We can do + // this slightly faster working 2 pixels (32 bits) at a time. + uint32_t *pixelPtr = (uint32_t *)pixelBuf[0], + twoPixels = __builtin_bswap16(color) * 0x00010001; + // We can avoid some or all of the buffer-filling if the color + // is the same as last time... + if (color == lastFillColor) { + // If length is longer than prior instance, fill only the + // additional pixels in the buffer and update lastFillLen. + if (len > lastFillLen) { + int fillStart = lastFillLen / 2, + fillEnd = (((len < maxFillLen) ? len : maxFillLen) + 1) / 2; + for (i = fillStart; i < fillEnd; i++) + pixelPtr[i] = twoPixels; + lastFillLen = fillEnd * 2; + } // else do nothing, don't set pixels or change lastFillLen + } else { + int fillEnd = (((len < maxFillLen) ? len : maxFillLen) + 1) / 2; + for (i = 0; i < fillEnd; i++) + pixelPtr[i] = twoPixels; + lastFillLen = fillEnd * 2; + lastFillColor = color; + } + + numDescriptors = (len + maxFillLen - 1) / maxFillLen; + for (d = 0; d < numDescriptors; d++) { + int pixels = (len < maxFillLen) ? len : maxFillLen, bytes = pixels * 2; + descriptor[d].SRCADDR.reg = (uint32_t)pixelPtr + bytes; + descriptor[d].BTCTRL.bit.SRCINC = 1; + descriptor[d].BTCNT.reg = bytes; + descriptor[d].DESCADDR.reg = (uint32_t)&descriptor[d + 1]; + len -= pixels; + } + descriptor[d - 1].DESCADDR.reg = 0; + } + memcpy(dptr, &descriptor[0], sizeof(DmacDescriptor)); +#if defined(__SAMD51__) + if (connection == TFT_PARALLEL) { + // Switch WR pin to PWM or CCL + pinPeripheral(tft8._wr, wrPeripheral); + } +#endif // end __SAMD51__ + + dma_busy = true; + dma.startJob(); + if (connection == TFT_PARALLEL) + dma.trigger(); + while (dma_busy) + ; // Wait for completion + // Unfortunately blocking is necessary. An earlier version returned + // immediately and checked dma_busy on startWrite() instead, but it + // turns out to be MUCH slower on many graphics operations (as when + // drawing lines, pixel-by-pixel), perhaps because it's a volatile + // type and doesn't cache. Working on this. +#if defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO) + if (connection == TFT_HARD_SPI) { + // SAMD51: SPI DMA seems to leave the SPI peripheral in a freaky + // state on completion. Workaround is to explicitly set it back... + // (5/17/2019: apparently SAMD21 too, in certain cases, observed + // with ST7789 display.) + hwspi._spi->setDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } +#endif // end __SAMD51__ + return; + } +#endif // end USE_SPI_DMA +#endif // end !ESP32 + + // All other cases (non-DMA hard SPI, bitbang SPI, parallel)... + + if (connection == TFT_HARD_SPI) { +#if defined(ESP8266) + do { + uint32_t pixelsThisPass = len; + if (pixelsThisPass > 50000) + pixelsThisPass = 50000; + len -= pixelsThisPass; + delay(1); // Periodic delay on long fills + while (pixelsThisPass--) { + hwspi._spi->write(hi); + hwspi._spi->write(lo); + } + } while (len); +#elif defined(ARDUINO_ARCH_RP2040) + spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1; + color = __builtin_bswap16(color); + + while (len--) + spi_write_blocking(pi_spi, (uint8_t *)&color, 2); +#else // !ESP8266 && !ARDUINO_ARCH_RP2040 + while (len--) { +#if defined(__AVR__) + AVR_WRITESPI(hi); + AVR_WRITESPI(lo); +#elif defined(ESP32) + hwspi._spi->write(hi); + hwspi._spi->write(lo); +#else + hwspi._spi->transfer(hi); + hwspi._spi->transfer(lo); +#endif + } +#endif // end !ESP8266 + } else if (connection == TFT_SOFT_SPI) { +#if defined(ESP8266) + do { + uint32_t pixelsThisPass = len; + if (pixelsThisPass > 20000) + pixelsThisPass = 20000; + len -= pixelsThisPass; + yield(); // Periodic yield() on long fills + while (pixelsThisPass--) { + for (uint16_t bit = 0, x = color; bit < 16; bit++) { + if (x & 0x8000) + SPI_MOSI_HIGH(); + else + SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + } + } while (len); +#else // !ESP8266 + while (len--) { +#if defined(__AVR__) + for (uint8_t bit = 0, x = hi; bit < 8; bit++) { + if (x & 0x80) + SPI_MOSI_HIGH(); + else + SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + for (uint8_t bit = 0, x = lo; bit < 8; bit++) { + if (x & 0x80) + SPI_MOSI_HIGH(); + else + SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } +#else // !__AVR__ + for (uint16_t bit = 0, x = color; bit < 16; bit++) { + if (x & 0x8000) + SPI_MOSI_HIGH(); + else + SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + x <<= 1; + SPI_SCK_LOW(); + } +#endif // end !__AVR__ + } +#endif // end !ESP8266 + } else { // PARALLEL + if (hi == lo) { +#if defined(__AVR__) + len *= 2; + *tft8.writePort = hi; + while (len--) { + TFT_WR_STROBE(); + } +#elif defined(USE_FAST_PINIO) + if (!tft8.wide) { + len *= 2; + *tft8.writePort = hi; + } else { + *(volatile uint16_t *)tft8.writePort = color; + } + while (len--) { + TFT_WR_STROBE(); + } +#endif + } else { + while (len--) { +#if defined(__AVR__) + *tft8.writePort = hi; + TFT_WR_STROBE(); + *tft8.writePort = lo; +#elif defined(USE_FAST_PINIO) + if (!tft8.wide) { + *tft8.writePort = hi; + TFT_WR_STROBE(); + *tft8.writePort = lo; + } else { + *(volatile uint16_t *)tft8.writePort = color; + } +#endif + TFT_WR_STROBE(); + } + } + } +} + +/*! + @brief Draw a filled rectangle to the display. Not self-contained; + should follow startWrite(). Typically used by higher-level + graphics primitives; user code shouldn't need to call this and + is likely to use the self-contained fillRect() instead. + writeFillRect() performs its own edge clipping and rejection; + see writeFillRectPreclipped() for a more 'raw' implementation. + @param x Horizontal position of first corner. + @param y Vertical position of first corner. + @param w Rectangle width in pixels (positive = right of first + corner, negative = left of first corner). + @param h Rectangle height in pixels (positive = below first + corner, negative = above first corner). + @param color 16-bit fill color in '565' RGB format. + @note Written in this deep-nested way because C by definition will + optimize for the 'if' case, not the 'else' -- avoids branches + and rejects clipped rectangles at the least-work possibility. +*/ +void Adafruit_SPITFT::writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + if (w && h) { // Nonzero width and height? + if (w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if (x < _width) { // Not off right + if (h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if (y < _height) { // Not off bottom + int16_t x2 = x + w - 1; + if (x2 >= 0) { // Not off left + int16_t y2 = y + h - 1; + if (y2 >= 0) { // Not off top + // Rectangle partly or fully overlaps screen + if (x < 0) { + x = 0; + w = x2 + 1; + } // Clip left + if (y < 0) { + y = 0; + h = y2 + 1; + } // Clip top + if (x2 >= _width) { + w = _width - x; + } // Clip right + if (y2 >= _height) { + h = _height - y; + } // Clip bottom + writeFillRectPreclipped(x, y, w, h, color); + } + } + } + } + } +} + +/*! + @brief Draw a horizontal line on the display. Performs edge clipping + and rejection. Not self-contained; should follow startWrite(). + Typically used by higher-level graphics primitives; user code + shouldn't need to call this and is likely to use the self- + contained drawFastHLine() instead. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param w Line width in pixels (positive = right of first point, + negative = point of first corner). + @param color 16-bit line color in '565' RGB format. +*/ +void inline Adafruit_SPITFT::writeFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if ((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width + if (w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if (x < _width) { // Not off right + int16_t x2 = x + w - 1; + if (x2 >= 0) { // Not off left + // Line partly or fully overlaps screen + if (x < 0) { + x = 0; + w = x2 + 1; + } // Clip left + if (x2 >= _width) { + w = _width - x; + } // Clip right + writeFillRectPreclipped(x, y, w, 1, color); + } + } + } +} + +/*! + @brief Draw a vertical line on the display. Performs edge clipping and + rejection. Not self-contained; should follow startWrite(). + Typically used by higher-level graphics primitives; user code + shouldn't need to call this and is likely to use the self- + contained drawFastVLine() instead. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param h Line height in pixels (positive = below first point, + negative = above first point). + @param color 16-bit line color in '565' RGB format. +*/ +void inline Adafruit_SPITFT::writeFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if ((x >= 0) && (x < _width) && h) { // X on screen, nonzero height + if (h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if (y < _height) { // Not off bottom + int16_t y2 = y + h - 1; + if (y2 >= 0) { // Not off top + // Line partly or fully overlaps screen + if (y < 0) { + y = 0; + h = y2 + 1; + } // Clip top + if (y2 >= _height) { + h = _height - y; + } // Clip bottom + writeFillRectPreclipped(x, y, 1, h, color); + } + } + } +} + +/*! + @brief A lower-level version of writeFillRect(). This version requires + all inputs are in-bounds, that width and height are positive, + and no part extends offscreen. NO EDGE CLIPPING OR REJECTION IS + PERFORMED. If higher-level graphics primitives are written to + handle their own clipping earlier in the drawing process, this + can avoid unnecessary function calls and repeated clipping + operations in the lower-level functions. + @param x Horizontal position of first corner. MUST BE WITHIN + SCREEN BOUNDS. + @param y Vertical position of first corner. MUST BE WITHIN SCREEN + BOUNDS. + @param w Rectangle width in pixels. MUST BE POSITIVE AND NOT + EXTEND OFF SCREEN. + @param h Rectangle height in pixels. MUST BE POSITIVE AND NOT + EXTEND OFF SCREEN. + @param color 16-bit fill color in '565' RGB format. + @note This is a new function, no graphics primitives besides rects + and horizontal/vertical lines are written to best use this yet. +*/ +inline void Adafruit_SPITFT::writeFillRectPreclipped(int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t color) { + setAddrWindow(x, y, w, h); + writeColor(color, (uint32_t)w * h); +} + +// ------------------------------------------------------------------------- +// Ever-so-slightly higher-level graphics operations. Similar to the 'write' +// functions above, but these contain their own chip-select and SPI +// transactions as needed (via startWrite(), endWrite()). They're typically +// used solo -- as graphics primitives in themselves, not invoked by higher- +// level primitives (which should use the functions above for better +// performance). + +/*! + @brief Draw a single pixel to the display at requested coordinates. + Self-contained and provides its own transaction as needed + (see writePixel(x,y,color) for a lower-level variant). + Edge clipping is performed here. + @param x Horizontal position (0 = left). + @param y Vertical position (0 = top). + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::drawPixel(int16_t x, int16_t y, uint16_t color) { + // Clip first... + if ((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { + // THEN set up transaction (if needed) and draw... + startWrite(); + setAddrWindow(x, y, 1, 1); + SPI_WRITE16(color); + endWrite(); + } +} + +/*! + @brief Draw a filled rectangle to the display. Self-contained and + provides its own transaction as needed (see writeFillRect() or + writeFillRectPreclipped() for lower-level variants). Edge + clipping and rejection is performed here. + @param x Horizontal position of first corner. + @param y Vertical position of first corner. + @param w Rectangle width in pixels (positive = right of first + corner, negative = left of first corner). + @param h Rectangle height in pixels (positive = below first + corner, negative = above first corner). + @param color 16-bit fill color in '565' RGB format. + @note This repeats the writeFillRect() function almost in its entirety, + with the addition of a transaction start/end. It's done this way + (rather than starting the transaction and calling writeFillRect() + to handle clipping and so forth) so that the transaction isn't + performed at all if the rectangle is rejected. It's really not + that much code. +*/ +void Adafruit_SPITFT::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + if (w && h) { // Nonzero width and height? + if (w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if (x < _width) { // Not off right + if (h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if (y < _height) { // Not off bottom + int16_t x2 = x + w - 1; + if (x2 >= 0) { // Not off left + int16_t y2 = y + h - 1; + if (y2 >= 0) { // Not off top + // Rectangle partly or fully overlaps screen + if (x < 0) { + x = 0; + w = x2 + 1; + } // Clip left + if (y < 0) { + y = 0; + h = y2 + 1; + } // Clip top + if (x2 >= _width) { + w = _width - x; + } // Clip right + if (y2 >= _height) { + h = _height - y; + } // Clip bottom + startWrite(); + writeFillRectPreclipped(x, y, w, h, color); + endWrite(); + } + } + } + } + } +} + +/*! + @brief Draw a horizontal line on the display. Self-contained and + provides its own transaction as needed (see writeFastHLine() for + a lower-level variant). Edge clipping and rejection is performed + here. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param w Line width in pixels (positive = right of first point, + negative = point of first corner). + @param color 16-bit line color in '565' RGB format. + @note This repeats the writeFastHLine() function almost in its + entirety, with the addition of a transaction start/end. It's + done this way (rather than starting the transaction and calling + writeFastHLine() to handle clipping and so forth) so that the + transaction isn't performed at all if the line is rejected. +*/ +void Adafruit_SPITFT::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if ((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width + if (w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if (x < _width) { // Not off right + int16_t x2 = x + w - 1; + if (x2 >= 0) { // Not off left + // Line partly or fully overlaps screen + if (x < 0) { + x = 0; + w = x2 + 1; + } // Clip left + if (x2 >= _width) { + w = _width - x; + } // Clip right + startWrite(); + writeFillRectPreclipped(x, y, w, 1, color); + endWrite(); + } + } + } +} + +/*! + @brief Draw a vertical line on the display. Self-contained and provides + its own transaction as needed (see writeFastHLine() for a lower- + level variant). Edge clipping and rejection is performed here. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param h Line height in pixels (positive = below first point, + negative = above first point). + @param color 16-bit line color in '565' RGB format. + @note This repeats the writeFastVLine() function almost in its + entirety, with the addition of a transaction start/end. It's + done this way (rather than starting the transaction and calling + writeFastVLine() to handle clipping and so forth) so that the + transaction isn't performed at all if the line is rejected. +*/ +void Adafruit_SPITFT::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if ((x >= 0) && (x < _width) && h) { // X on screen, nonzero height + if (h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if (y < _height) { // Not off bottom + int16_t y2 = y + h - 1; + if (y2 >= 0) { // Not off top + // Line partly or fully overlaps screen + if (y < 0) { + y = 0; + h = y2 + 1; + } // Clip top + if (y2 >= _height) { + h = _height - y; + } // Clip bottom + startWrite(); + writeFillRectPreclipped(x, y, 1, h, color); + endWrite(); + } + } + } +} + +/*! + @brief Essentially writePixel() with a transaction around it. I don't + think this is in use by any of our code anymore (believe it was + for some older BMP-reading examples), but is kept here in case + any user code relies on it. Consider it DEPRECATED. + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::pushColor(uint16_t color) { + startWrite(); + SPI_WRITE16(color); + endWrite(); +} + +/*! + @brief Draw a 16-bit image (565 RGB) at the specified (x,y) position. + For 16-bit display devices; no color reduction performed. + Adapted from https://github.com/PaulStoffregen/ILI9341_t3 + by Marc MERLIN. See examples/pictureEmbed to use this. + 5/6/2017: function name and arguments have changed for + compatibility with current GFX library and to avoid naming + problems in prior implementation. Formerly drawBitmap() with + arguments in different order. Handles its own transaction and + edge clipping/rejection. + @param x Top left corner horizontal coordinate. + @param y Top left corner vertical coordinate. + @param pcolors Pointer to 16-bit array of pixel values. + @param w Width of bitmap in pixels. + @param h Height of bitmap in pixels. +*/ +void Adafruit_SPITFT::drawRGBBitmap(int16_t x, int16_t y, uint16_t *pcolors, + int16_t w, int16_t h) { + + int16_t x2, y2; // Lower-right coord + if ((x >= _width) || // Off-edge right + (y >= _height) || // " top + ((x2 = (x + w - 1)) < 0) || // " left + ((y2 = (y + h - 1)) < 0)) + return; // " bottom + + int16_t bx1 = 0, by1 = 0, // Clipped top-left within bitmap + saveW = w; // Save original bitmap width value + if (x < 0) { // Clip left + w += x; + bx1 = -x; + x = 0; + } + if (y < 0) { // Clip top + h += y; + by1 = -y; + y = 0; + } + if (x2 >= _width) + w = _width - x; // Clip right + if (y2 >= _height) + h = _height - y; // Clip bottom + + pcolors += by1 * saveW + bx1; // Offset bitmap ptr to clipped top-left + startWrite(); + setAddrWindow(x, y, w, h); // Clipped area + while (h--) { // For each (clipped) scanline... + writePixels(pcolors, w); // Push one (clipped) row + pcolors += saveW; // Advance pointer by one full (unclipped) line + } + endWrite(); +} + +// ------------------------------------------------------------------------- +// Miscellaneous class member functions that don't draw anything. + +/*! + @brief Invert the colors of the display (if supported by hardware). + Self-contained, no transaction setup required. + @param i true = inverted display, false = normal display. +*/ +void Adafruit_SPITFT::invertDisplay(bool i) { + startWrite(); + writeCommand(i ? invertOnCommand : invertOffCommand); + endWrite(); +} + +/*! + @brief Given 8-bit red, green and blue values, return a 'packed' + 16-bit color value in '565' RGB format (5 bits red, 6 bits + green, 5 bits blue). This is just a mathematical operation, + no hardware is touched. + @param red 8-bit red brightnesss (0 = off, 255 = max). + @param green 8-bit green brightnesss (0 = off, 255 = max). + @param blue 8-bit blue brightnesss (0 = off, 255 = max). + @return 'Packed' 16-bit color value (565 format). +*/ +uint16_t Adafruit_SPITFT::color565(uint8_t red, uint8_t green, uint8_t blue) { + return ((red & 0xF8) << 8) | ((green & 0xFC) << 3) | (blue >> 3); +} + +/*! +@brief Adafruit_SPITFT Send Command handles complete sending of commands and +data +@param commandByte The Command Byte +@param dataBytes A pointer to the Data bytes to send +@param numDataBytes The number of bytes we should send +*/ +void Adafruit_SPITFT::sendCommand(uint8_t commandByte, uint8_t *dataBytes, + uint8_t numDataBytes) { + SPI_BEGIN_TRANSACTION(); + if (_cs >= 0) + SPI_CS_LOW(); + + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); // Send the command byte + + SPI_DC_HIGH(); + for (int i = 0; i < numDataBytes; i++) { + if ((connection == TFT_PARALLEL) && tft8.wide) { + SPI_WRITE16(*(uint16_t *)dataBytes); + dataBytes += 2; + } else { + spiWrite(*dataBytes); // Send the data bytes + dataBytes++; + } + } + + if (_cs >= 0) + SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +/*! + @brief Adafruit_SPITFT Send Command handles complete sending of commands and + data + @param commandByte The Command Byte + @param dataBytes A pointer to the Data bytes to send + @param numDataBytes The number of bytes we should send + */ +void Adafruit_SPITFT::sendCommand(uint8_t commandByte, const uint8_t *dataBytes, + uint8_t numDataBytes) { + SPI_BEGIN_TRANSACTION(); + if (_cs >= 0) + SPI_CS_LOW(); + + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); // Send the command byte + + SPI_DC_HIGH(); + for (int i = 0; i < numDataBytes; i++) { + if ((connection == TFT_PARALLEL) && tft8.wide) { + SPI_WRITE16(*(uint16_t *)dataBytes); + dataBytes += 2; + } else { + spiWrite(pgm_read_byte(dataBytes++)); + } + } + + if (_cs >= 0) + SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +/*! + @brief Adafruit_SPITFT sendCommand16 handles complete sending of + commands and data for 16-bit parallel displays. Currently somewhat + rigged for the NT35510, which has the odd behavior of wanting + commands 16-bit, but subsequent data as 8-bit values, despite + the 16-bit bus (high byte is always 0). Also seems to require + issuing and incrementing address with each transfer. + @param commandWord The command word (16 bits) + @param dataBytes A pointer to the data bytes to send + @param numDataBytes The number of bytes we should send + */ +void Adafruit_SPITFT::sendCommand16(uint16_t commandWord, + const uint8_t *dataBytes, + uint8_t numDataBytes) { + SPI_BEGIN_TRANSACTION(); + if (_cs >= 0) + SPI_CS_LOW(); + + if (numDataBytes == 0) { + SPI_DC_LOW(); // Command mode + SPI_WRITE16(commandWord); // Send the command word + SPI_DC_HIGH(); // Data mode + } + for (int i = 0; i < numDataBytes; i++) { + SPI_DC_LOW(); // Command mode + SPI_WRITE16(commandWord); // Send the command word + SPI_DC_HIGH(); // Data mode + commandWord++; + SPI_WRITE16((uint16_t)pgm_read_byte(dataBytes++)); + } + + if (_cs >= 0) + SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +/*! + @brief Read 8 bits of data from display configuration memory (not RAM). + This is highly undocumented/supported and should be avoided, + function is only included because some of the examples use it. + @param commandByte + The command register to read data from. + @param index + The byte index into the command to read from. + @return Unsigned 8-bit data read from display register. + */ +/**************************************************************************/ +uint8_t Adafruit_SPITFT::readcommand8(uint8_t commandByte, uint8_t index) { + uint8_t result; + startWrite(); + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); + SPI_DC_HIGH(); // Data mode + do { + result = spiRead(); + } while (index--); // Discard bytes up to index'th + endWrite(); + return result; +} + +/*! + @brief Read 16 bits of data from display register. + For 16-bit parallel displays only. + @param addr Command/register to access. + @return Unsigned 16-bit data. + */ +uint16_t Adafruit_SPITFT::readcommand16(uint16_t addr) { +#if defined(USE_FAST_PINIO) // NOT SUPPORTED without USE_FAST_PINIO + uint16_t result = 0; + if ((connection == TFT_PARALLEL) && tft8.wide) { + startWrite(); + SPI_DC_LOW(); // Command mode + SPI_WRITE16(addr); + SPI_DC_HIGH(); // Data mode + TFT_RD_LOW(); // Read line LOW +#if defined(HAS_PORT_SET_CLR) + *(volatile uint16_t *)tft8.dirClr = 0xFFFF; // Input state + result = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.dirSet = 0xFFFF; // Output state +#else // !HAS_PORT_SET_CLR + *(volatile uint16_t *)tft8.portDir = 0x0000; // Input state + result = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.portDir = 0xFFFF; // Output state +#endif // end !HAS_PORT_SET_CLR + TFT_RD_HIGH(); // Read line HIGH + endWrite(); + } + return result; +#else + (void)addr; // disable -Wunused-parameter warning + return 0; +#endif // end !USE_FAST_PINIO +} + +// ------------------------------------------------------------------------- +// Lowest-level hardware-interfacing functions. Many of these are inline and +// compile to different things based on #defines -- typically just a few +// instructions. Others, not so much, those are not inlined. + +/*! + @brief Start an SPI transaction if using the hardware SPI interface to + the display. If using an earlier version of the Arduino platform + (before the addition of SPI transactions), this instead attempts + to set up the SPI clock and mode. No action is taken if the + connection is not hardware SPI-based. This does NOT include a + chip-select operation -- see startWrite() for a function that + encapsulated both actions. +*/ +inline void Adafruit_SPITFT::SPI_BEGIN_TRANSACTION(void) { + if (connection == TFT_HARD_SPI) { +#if defined(SPI_HAS_TRANSACTION) + hwspi._spi->beginTransaction(hwspi.settings); +#else // No transactions, configure SPI manually... +#if defined(__AVR__) || defined(TEENSYDUINO) || defined(ARDUINO_ARCH_STM32F1) + hwspi._spi->setClockDivider(SPI_CLOCK_DIV2); +#elif defined(__arm__) + hwspi._spi->setClockDivider(11); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->setFrequency(hwspi._freq); +#elif defined(RASPI) || defined(ARDUINO_ARCH_STM32F1) + hwspi._spi->setClock(hwspi._freq); +#endif + hwspi._spi->setBitOrder(MSBFIRST); + hwspi._spi->setDataMode(hwspi._mode); +#endif // end !SPI_HAS_TRANSACTION + } +} + +/*! + @brief End an SPI transaction if using the hardware SPI interface to + the display. No action is taken if the connection is not + hardware SPI-based or if using an earlier version of the Arduino + platform (before the addition of SPI transactions). This does + NOT include a chip-deselect operation -- see endWrite() for a + function that encapsulated both actions. +*/ +inline void Adafruit_SPITFT::SPI_END_TRANSACTION(void) { +#if defined(SPI_HAS_TRANSACTION) + if (connection == TFT_HARD_SPI) { + hwspi._spi->endTransaction(); + } +#endif +} + +/*! + @brief Issue a single 8-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the byte. This is another of + those functions in the library with a now-not-accurate name + that's being maintained for compatibility with outside code. + This function is used even if display connection is parallel. + @param b 8-bit value to write. +*/ +void Adafruit_SPITFT::spiWrite(uint8_t b) { + if (connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(b); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write(b); +#elif defined(ARDUINO_ARCH_RP2040) + spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1; + spi_write_blocking(pi_spi, &b, 1); +#else + hwspi._spi->transfer(b); +#endif + } else if (connection == TFT_SOFT_SPI) { + for (uint8_t bit = 0; bit < 8; bit++) { + if (b & 0x80) + SPI_MOSI_HIGH(); + else + SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + b <<= 1; + SPI_SCK_LOW(); + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = b; +#elif defined(USE_FAST_PINIO) + if (!tft8.wide) + *tft8.writePort = b; + else + *(volatile uint16_t *)tft8.writePort = b; +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Write a single command byte to the display. Chip-select and + transaction must have been previously set -- this ONLY sets + the device to COMMAND mode, issues the byte and then restores + DATA mode. There is no corresponding explicit writeData() + function -- just use spiWrite(). + @param cmd 8-bit command to write. +*/ +void Adafruit_SPITFT::writeCommand(uint8_t cmd) { + SPI_DC_LOW(); + spiWrite(cmd); + SPI_DC_HIGH(); +} + +/*! + @brief Read a single 8-bit value from the display. Chip-select and + transaction must have been previously set -- this ONLY reads + the byte. This is another of those functions in the library + with a now-not-accurate name that's being maintained for + compatibility with outside code. This function is used even if + display connection is parallel. + @return Unsigned 8-bit value read (always zero if USE_FAST_PINIO is + not supported by the MCU architecture). +*/ +uint8_t Adafruit_SPITFT::spiRead(void) { + uint8_t b = 0; + uint16_t w = 0; + if (connection == TFT_HARD_SPI) { + return hwspi._spi->transfer((uint8_t)0); + } else if (connection == TFT_SOFT_SPI) { + if (swspi._miso >= 0) { + for (uint8_t i = 0; i < 8; i++) { + SPI_SCK_HIGH(); + b <<= 1; + if (SPI_MISO_READ()) + b++; + SPI_SCK_LOW(); + } + } + return b; + } else { // TFT_PARALLEL + if (tft8._rd >= 0) { +#if defined(USE_FAST_PINIO) + TFT_RD_LOW(); // Read line LOW +#if defined(__AVR__) + *tft8.portDir = 0x00; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.portDir = 0xFF; // Restore port to output +#else // !__AVR__ + if (!tft8.wide) { // 8-bit TFT connection +#if defined(HAS_PORT_SET_CLR) + *tft8.dirClr = 0xFF; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.dirSet = 0xFF; // Restore port to output +#else // !HAS_PORT_SET_CLR + *tft8.portDir = 0x00; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.portDir = 0xFF; // Restore port to output +#endif // end HAS_PORT_SET_CLR + } else { // 16-bit TFT connection +#if defined(HAS_PORT_SET_CLR) + *(volatile uint16_t *)tft8.dirClr = 0xFFFF; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.dirSet = 0xFFFF; // Output state +#else // !HAS_PORT_SET_CLR + *(volatile uint16_t *)tft8.portDir = 0x0000; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.portDir = 0xFFFF; // Output state +#endif // end !HAS_PORT_SET_CLR + } + TFT_RD_HIGH(); // Read line HIGH +#endif // end !__AVR__ +#else // !USE_FAST_PINIO + w = 0; // Parallel TFT is NOT SUPPORTED without USE_FAST_PINIO +#endif // end !USE_FAST_PINIO + } + return w; + } +} + +/*! + @brief Issue a single 16-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the word. + Thus operates ONLY on 'wide' (16-bit) parallel displays! + @param w 16-bit value to write. +*/ +void Adafruit_SPITFT::write16(uint16_t w) { + if (connection == TFT_PARALLEL) { +#if defined(USE_FAST_PINIO) + if (tft8.wide) + *(volatile uint16_t *)tft8.writePort = w; +#else + (void)w; // disable -Wunused-parameter warning +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Write a single command word to the display. Chip-select and + transaction must have been previously set -- this ONLY sets + the device to COMMAND mode, issues the byte and then restores + DATA mode. This operates ONLY on 'wide' (16-bit) parallel + displays! + @param cmd 16-bit command to write. +*/ +void Adafruit_SPITFT::writeCommand16(uint16_t cmd) { + SPI_DC_LOW(); + write16(cmd); + SPI_DC_HIGH(); +} + +/*! + @brief Read a single 16-bit value from the display. Chip-select and + transaction must have been previously set -- this ONLY reads + the byte. This operates ONLY on 'wide' (16-bit) parallel + displays! + @return Unsigned 16-bit value read (always zero if USE_FAST_PINIO is + not supported by the MCU architecture). +*/ +uint16_t Adafruit_SPITFT::read16(void) { + uint16_t w = 0; + if (connection == TFT_PARALLEL) { + if (tft8._rd >= 0) { +#if defined(USE_FAST_PINIO) + TFT_RD_LOW(); // Read line LOW + if (tft8.wide) { // 16-bit TFT connection +#if defined(HAS_PORT_SET_CLR) + *(volatile uint16_t *)tft8.dirClr = 0xFFFF; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.dirSet = 0xFFFF; // Output state +#else // !HAS_PORT_SET_CLR + *(volatile uint16_t *)tft8.portDir = 0x0000; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.portDir = 0xFFFF; // Output state +#endif // end !HAS_PORT_SET_CLR + } + TFT_RD_HIGH(); // Read line HIGH +#else // !USE_FAST_PINIO + w = 0; // Parallel TFT is NOT SUPPORTED without USE_FAST_PINIO +#endif // end !USE_FAST_PINIO + } + } + return w; +} + +/*! + @brief Set the software (bitbang) SPI MOSI line HIGH. +*/ +inline void Adafruit_SPITFT::SPI_MOSI_HIGH(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *swspi.mosiPortSet = 1; +#else // !KINETISK + *swspi.mosiPortSet = swspi.mosiPinMask; +#endif +#else // !HAS_PORT_SET_CLR + *swspi.mosiPort |= swspi.mosiPinMaskSet; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._mosi, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI MOSI line LOW. +*/ +inline void Adafruit_SPITFT::SPI_MOSI_LOW(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *swspi.mosiPortClr = 1; +#else // !KINETISK + *swspi.mosiPortClr = swspi.mosiPinMask; +#endif +#else // !HAS_PORT_SET_CLR + *swspi.mosiPort &= swspi.mosiPinMaskClr; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._mosi, LOW); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI SCK line HIGH. +*/ +inline void Adafruit_SPITFT::SPI_SCK_HIGH(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *swspi.sckPortSet = 1; +#else // !KINETISK + *swspi.sckPortSet = swspi.sckPinMask; +#endif +#else // !HAS_PORT_SET_CLR + *swspi.sckPort |= swspi.sckPinMaskSet; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._sck, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI SCK line LOW. +*/ +inline void Adafruit_SPITFT::SPI_SCK_LOW(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *swspi.sckPortClr = 1; +#else // !KINETISK + *swspi.sckPortClr = swspi.sckPinMask; +#endif +#else // !HAS_PORT_SET_CLR + *swspi.sckPort &= swspi.sckPinMaskClr; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._sck, LOW); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Read the state of the software (bitbang) SPI MISO line. + @return true if HIGH, false if LOW. +*/ +inline bool Adafruit_SPITFT::SPI_MISO_READ(void) { +#if defined(USE_FAST_PINIO) +#if defined(KINETISK) + return *swspi.misoPort; +#else // !KINETISK + return *swspi.misoPort & swspi.misoPinMask; +#endif // end !KINETISK +#else // !USE_FAST_PINIO + return digitalRead(swspi._miso); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Issue a single 16-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the word. Despite the name, + this function is used even if display connection is parallel; + name was maintaned for backward compatibility. Naming is also + not consistent with the 8-bit version, spiWrite(). Sorry about + that. Again, staying compatible with outside code. + @param w 16-bit value to write. +*/ +void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { + if (connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(w >> 8); + AVR_WRITESPI(w); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write16(w); +#elif defined(ARDUINO_ARCH_RP2040) + spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1; + w = __builtin_bswap16(w); + spi_write_blocking(pi_spi, (uint8_t *)&w, 2); +#else + // MSB, LSB because TFTs are generally big-endian + hwspi._spi->transfer(w >> 8); + hwspi._spi->transfer(w); +#endif + } else if (connection == TFT_SOFT_SPI) { + for (uint8_t bit = 0; bit < 16; bit++) { + if (w & 0x8000) + SPI_MOSI_HIGH(); + else + SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + w <<= 1; + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = w >> 8; + TFT_WR_STROBE(); + *tft8.writePort = w; +#elif defined(USE_FAST_PINIO) + if (!tft8.wide) { + *tft8.writePort = w >> 8; + TFT_WR_STROBE(); + *tft8.writePort = w; + } else { + *(volatile uint16_t *)tft8.writePort = w; + } +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Issue a single 32-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the longword. Despite the + name, this function is used even if display connection is + parallel; name was maintaned for backward compatibility. Naming + is also not consistent with the 8-bit version, spiWrite(). + Sorry about that. Again, staying compatible with outside code. + @param l 32-bit value to write. +*/ +void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) { + if (connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(l >> 24); + AVR_WRITESPI(l >> 16); + AVR_WRITESPI(l >> 8); + AVR_WRITESPI(l); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write32(l); +#elif defined(ARDUINO_ARCH_RP2040) + spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1; + l = __builtin_bswap32(l); + spi_write_blocking(pi_spi, (uint8_t *)&l, 4); +#else + hwspi._spi->transfer(l >> 24); + hwspi._spi->transfer(l >> 16); + hwspi._spi->transfer(l >> 8); + hwspi._spi->transfer(l); +#endif + } else if (connection == TFT_SOFT_SPI) { + for (uint8_t bit = 0; bit < 32; bit++) { + if (l & 0x80000000) + SPI_MOSI_HIGH(); + else + SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + l <<= 1; + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = l >> 24; + TFT_WR_STROBE(); + *tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *tft8.writePort = l >> 8; + TFT_WR_STROBE(); + *tft8.writePort = l; +#elif defined(USE_FAST_PINIO) + if (!tft8.wide) { + *tft8.writePort = l >> 24; + TFT_WR_STROBE(); + *tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *tft8.writePort = l >> 8; + TFT_WR_STROBE(); + *tft8.writePort = l; + } else { + *(volatile uint16_t *)tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *(volatile uint16_t *)tft8.writePort = l; + } +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Set the WR line LOW, then HIGH. Used for parallel-connected + interfaces when writing data. +*/ +inline void Adafruit_SPITFT::TFT_WR_STROBE(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *tft8.wrPortClr = 1; + *tft8.wrPortSet = 1; +#else // !KINETISK + *tft8.wrPortClr = tft8.wrPinMask; + *tft8.wrPortSet = tft8.wrPinMask; +#endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + *tft8.wrPort &= tft8.wrPinMaskClr; + *tft8.wrPort |= tft8.wrPinMaskSet; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._wr, LOW); + digitalWrite(tft8._wr, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the RD line HIGH. Used for parallel-connected interfaces + when reading data. +*/ +inline void Adafruit_SPITFT::TFT_RD_HIGH(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) + *tft8.rdPortSet = tft8.rdPinMask; +#else // !HAS_PORT_SET_CLR + *tft8.rdPort |= tft8.rdPinMaskSet; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._rd, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the RD line LOW. Used for parallel-connected interfaces + when reading data. +*/ +inline void Adafruit_SPITFT::TFT_RD_LOW(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) + *tft8.rdPortClr = tft8.rdPinMask; +#else // !HAS_PORT_SET_CLR + *tft8.rdPort &= tft8.rdPinMaskClr; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._rd, LOW); +#endif // end !USE_FAST_PINIO +} + +#endif // end __AVR_ATtiny85__ diff --git a/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.h b/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.h new file mode 100644 index 0000000..8064a74 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.h @@ -0,0 +1,530 @@ +/*! + * @file Adafruit_SPITFT.h + * + * Part of Adafruit's GFX graphics library. Originally this class was + * written to handle a range of color TFT displays connected via SPI, + * but over time this library and some display-specific subclasses have + * mutated to include some color OLEDs as well as parallel-interfaced + * displays. The name's been kept for the sake of older code. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Written by Limor "ladyada" Fried for Adafruit Industries, + * with contributions from the open source community. + * + * BSD license, all text here must be included in any redistribution. + */ + +#ifndef _ADAFRUIT_SPITFT_H_ +#define _ADAFRUIT_SPITFT_H_ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include "Adafruit_GFX.h" +#include + +// HARDWARE CONFIG --------------------------------------------------------- + +#if defined(__AVR__) +typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit +#define USE_FAST_PINIO ///< Use direct PORT register access +#elif defined(ARDUINO_STM32_FEATHER) // WICED +typedef class HardwareSPI SPIClass; ///< SPI is a bit odd on WICED +typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +#elif defined(__arm__) +#if defined(ARDUINO_ARCH_SAMD) +// Adafruit M0, M4 +typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +#define USE_FAST_PINIO ///< Use direct PORT register access +#define HAS_PORT_SET_CLR ///< PORTs have set & clear registers +#elif defined(CORE_TEENSY) +// PJRC Teensy 4.x +#if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x +typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit + // PJRC Teensy 3.x +#else +typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit +#endif +#define USE_FAST_PINIO ///< Use direct PORT register access +#define HAS_PORT_SET_CLR ///< PORTs have set & clear registers +#else +// Arduino Due? +typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +// USE_FAST_PINIO not available here (yet)...Due has a totally different +// GPIO register set and will require some changes elsewhere (e.g. in +// constructors especially). +#endif +#else // !ARM +// Probably ESP8266 or ESP32. USE_FAST_PINIO is not available here (yet) +// but don't worry about it too much...the digitalWrite() implementation +// on these platforms is reasonably efficient and already RAM-resident, +// only gotcha then is no parallel connection support for now. +typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +#endif // end !ARM +typedef volatile ADAGFX_PORT_t *PORTreg_t; ///< PORT register type + +#if defined(__AVR__) +#define DEFAULT_SPI_FREQ 8000000L ///< Hardware SPI default speed +#else +#define DEFAULT_SPI_FREQ 16000000L ///< Hardware SPI default speed +#endif + +#if defined(ADAFRUIT_PYPORTAL) || defined(ADAFRUIT_PYPORTAL_M4_TITANO) || \ + defined(ADAFRUIT_PYBADGE_M4_EXPRESS) || \ + defined(ADAFRUIT_PYGAMER_M4_EXPRESS) || \ + defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) || defined(NRF52_SERIES) || \ + defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) +#define USE_SPI_DMA ///< Auto DMA +#else + //#define USE_SPI_DMA ///< If set, + // use DMA if available +#endif +// Another "oops" name -- this now also handles parallel DMA. +// If DMA is enabled, Arduino sketch MUST #include +// Estimated RAM usage: +// 4 bytes/pixel on display major axis + 8 bytes/pixel on minor axis, +// e.g. 320x240 pixels = 320 * 4 + 240 * 8 = 3,200 bytes. + +#if defined(USE_SPI_DMA) && (defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO)) +#include +#endif + +// This is kind of a kludge. Needed a way to disambiguate the software SPI +// and parallel constructors via their argument lists. Originally tried a +// bool as the first argument to the parallel constructor (specifying 8-bit +// vs 16-bit interface) but the compiler regards this as equivalent to an +// integer and thus still ambiguous. SO...the parallel constructor requires +// an enumerated type as the first argument: tft8 (for 8-bit parallel) or +// tft16 (for 16-bit)...even though 16-bit isn't fully implemented or tested +// and might never be, still needed that disambiguation from soft SPI. +/*! For first arg to parallel constructor */ +enum tftBusWidth { tft8bitbus, tft16bitbus }; + +// CLASS DEFINITION -------------------------------------------------------- + +/*! + @brief Adafruit_SPITFT is an intermediary class between Adafruit_GFX + and various hardware-specific subclasses for different displays. + It handles certain operations that are common to a range of + displays (address window, area fills, etc.). Originally these were + all color TFT displays interfaced via SPI, but it's since expanded + to include color OLEDs and parallel-interfaced TFTs. THE NAME HAS + BEEN KEPT TO AVOID BREAKING A LOT OF SUBCLASSES AND EXAMPLE CODE. + Many of the class member functions similarly live on with names + that don't necessarily accurately describe what they're doing, + again to avoid breaking a lot of other code. If in doubt, read + the comments. +*/ +class Adafruit_SPITFT : public Adafruit_GFX { + +public: + // CONSTRUCTORS -------------------------------------------------------- + + // Software SPI constructor: expects width & height (at default rotation + // setting 0), 4 signal pins (cs, dc, mosi, sclk), 2 optional pins + // (reset, miso). cs argument is required but can be -1 if unused -- + // rather than moving it to the optional arguments, it was done this way + // to avoid breaking existing code (-1 option was a later addition). + Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, int8_t dc, int8_t mosi, + int8_t sck, int8_t rst = -1, int8_t miso = -1); + + // Hardware SPI constructor using the default SPI port: expects width & + // height (at default rotation setting 0), 2 signal pins (cs, dc), + // optional reset pin. cs is required but can be -1 if unused -- rather + // than moving it to the optional arguments, it was done this way to + // avoid breaking existing code (-1 option was a later addition). + Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, int8_t dc, + int8_t rst = -1); + +#if !defined(ESP8266) // See notes in .cpp + // Hardware SPI constructor using an arbitrary SPI peripheral: expects + // width & height (rotation 0), SPIClass pointer, 2 signal pins (cs, dc) + // and optional reset pin. cs is required but can be -1 if unused. + Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, int8_t cs, + int8_t dc, int8_t rst = -1); +#endif // end !ESP8266 + + // Parallel constructor: expects width & height (rotation 0), flag + // indicating whether 16-bit (true) or 8-bit (false) interface, 3 signal + // pins (d0, wr, dc), 3 optional pins (cs, rst, rd). 16-bit parallel + // isn't even fully implemented but the 'wide' flag was added as a + // required argument to avoid ambiguity with other constructors. + Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, int8_t d0, + int8_t wr, int8_t dc, int8_t cs = -1, int8_t rst = -1, + int8_t rd = -1); + + // DESTRUCTOR ---------------------------------------------------------- + + ~Adafruit_SPITFT(){}; + + // CLASS MEMBER FUNCTIONS ---------------------------------------------- + + // These first two functions MUST be declared by subclasses: + + /*! + @brief Display-specific initialization function. + @param freq SPI frequency, in hz (or 0 for default or unused). + */ + virtual void begin(uint32_t freq) = 0; + + /*! + @brief Set up the specific display hardware's "address window" + for subsequent pixel-pushing operations. + @param x Leftmost pixel of area to be drawn (MUST be within + display bounds at current rotation setting). + @param y Topmost pixel of area to be drawn (MUST be within + display bounds at current rotation setting). + @param w Width of area to be drawn, in pixels (MUST be >0 and, + added to x, within display bounds at current rotation). + @param h Height of area to be drawn, in pixels (MUST be >0 and, + added to x, within display bounds at current rotation). + */ + virtual void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, + uint16_t h) = 0; + + // Remaining functions do not need to be declared in subclasses + // unless they wish to provide hardware-specific optimizations. + // Brief comments here...documented more thoroughly in .cpp file. + + // Subclass' begin() function invokes this to initialize hardware. + // freq=0 to use default SPI speed. spiMode must be one of the SPI_MODEn + // values defined in SPI.h, which are NOT the same as 0 for SPI_MODE0, + // 1 for SPI_MODE1, etc...use ONLY the SPI_MODEn defines! Only! + // Name is outdated (interface may be parallel) but for compatibility: + void initSPI(uint32_t freq = 0, uint8_t spiMode = SPI_MODE0); + void setSPISpeed(uint32_t freq); + // Chip select and/or hardware SPI transaction start as needed: + void startWrite(void); + // Chip deselect and/or hardware SPI transaction end as needed: + void endWrite(void); + void sendCommand(uint8_t commandByte, uint8_t *dataBytes, + uint8_t numDataBytes); + void sendCommand(uint8_t commandByte, const uint8_t *dataBytes = NULL, + uint8_t numDataBytes = 0); + void sendCommand16(uint16_t commandWord, const uint8_t *dataBytes = NULL, + uint8_t numDataBytes = 0); + uint8_t readcommand8(uint8_t commandByte, uint8_t index = 0); + uint16_t readcommand16(uint16_t addr); + + // These functions require a chip-select and/or SPI transaction + // around them. Higher-level graphics primitives might start a + // single transaction and then make multiple calls to these functions + // (e.g. circle or text rendering might make repeated lines or rects) + // before ending the transaction. It's more efficient than starting a + // transaction every time. + void writePixel(int16_t x, int16_t y, uint16_t color); + void writePixels(uint16_t *colors, uint32_t len, bool block = true, + bool bigEndian = false); + void writeColor(uint16_t color, uint32_t len); + void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + // This is a new function, similar to writeFillRect() except that + // all arguments MUST be onscreen, sorted and clipped. If higher-level + // primitives can handle their own sorting/clipping, it avoids repeating + // such operations in the low-level code, making it potentially faster. + // CALLING THIS WITH UNCLIPPED OR NEGATIVE VALUES COULD BE DISASTROUS. + inline void writeFillRectPreclipped(int16_t x, int16_t y, int16_t w, + int16_t h, uint16_t color); + // Another new function, companion to the new non-blocking + // writePixels() variant. + void dmaWait(void); + // Used by writePixels() in some situations, but might have rare need in + // user code, so it's public... + bool dmaBusy(void) const; // true if DMA is used and busy, false otherwise + void swapBytes(uint16_t *src, uint32_t len, uint16_t *dest = NULL); + + // These functions are similar to the 'write' functions above, but with + // a chip-select and/or SPI transaction built-in. They're typically used + // solo -- that is, as graphics primitives in themselves, not invoked by + // higher-level primitives (which should use the functions above). + void drawPixel(int16_t x, int16_t y, uint16_t color); + void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + // A single-pixel push encapsulated in a transaction. I don't think + // this is used anymore (BMP demos might've used it?) but is provided + // for backward compatibility, consider it deprecated: + void pushColor(uint16_t color); + + using Adafruit_GFX::drawRGBBitmap; // Check base class first + void drawRGBBitmap(int16_t x, int16_t y, uint16_t *pcolors, int16_t w, + int16_t h); + + void invertDisplay(bool i); + uint16_t color565(uint8_t r, uint8_t g, uint8_t b); + + // Despite parallel additions, function names kept for compatibility: + void spiWrite(uint8_t b); // Write single byte as DATA + void writeCommand(uint8_t cmd); // Write single byte as COMMAND + uint8_t spiRead(void); // Read single byte of data + void write16(uint16_t w); // Write 16-bit value as DATA + void writeCommand16(uint16_t cmd); // Write 16-bit value as COMMAND + uint16_t read16(void); // Read single 16-bit value + + // Most of these low-level functions were formerly macros in + // Adafruit_SPITFT_Macros.h. Some have been made into inline functions + // to avoid macro mishaps. Despite the addition of code for a parallel + // display interface, the names have been kept for backward + // compatibility (some subclasses may be invoking these): + void SPI_WRITE16(uint16_t w); // Not inline + void SPI_WRITE32(uint32_t l); // Not inline + // Old code had both a spiWrite16() function and SPI_WRITE16 macro + // in addition to the SPI_WRITE32 macro. The latter two have been + // made into functions here, and spiWrite16() removed (use SPI_WRITE16() + // instead). It looks like most subclasses had gotten comfortable with + // SPI_WRITE16 and SPI_WRITE32 anyway so those names were kept rather + // than the less-obnoxious camelcase variants, oh well. + + // Placing these functions entirely in the class definition inlines + // them implicitly them while allowing their use in other code: + + /*! + @brief Set the chip-select line HIGH. Does NOT check whether CS pin + is set (>=0), that should be handled in calling function. + Despite function name, this is used even if the display + connection is parallel. + */ + void SPI_CS_HIGH(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *csPortSet = 1; +#else // !KINETISK + *csPortSet = csPinMask; +#endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + *csPort |= csPinMaskSet; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(_cs, HIGH); +#endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the chip-select line LOW. Does NOT check whether CS pin + is set (>=0), that should be handled in calling function. + Despite function name, this is used even if the display + connection is parallel. + */ + void SPI_CS_LOW(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *csPortClr = 1; +#else // !KINETISK + *csPortClr = csPinMask; +#endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + *csPort &= csPinMaskClr; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(_cs, LOW); +#endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the data/command line HIGH (data mode). + */ + void SPI_DC_HIGH(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *dcPortSet = 1; +#else // !KINETISK + *dcPortSet = dcPinMask; +#endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + *dcPort |= dcPinMaskSet; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(_dc, HIGH); +#endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the data/command line LOW (command mode). + */ + void SPI_DC_LOW(void) { +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if defined(KINETISK) + *dcPortClr = 1; +#else // !KINETISK + *dcPortClr = dcPinMask; +#endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + *dcPort &= dcPinMaskClr; +#endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(_dc, LOW); +#endif // end !USE_FAST_PINIO + } + +protected: + // A few more low-level member functions -- some may have previously + // been macros. Shouldn't have a need to access these externally, so + // they've been moved to the protected section. Additionally, they're + // declared inline here and the code is in the .cpp file, since outside + // code doesn't need to see these. + inline void SPI_MOSI_HIGH(void); + inline void SPI_MOSI_LOW(void); + inline void SPI_SCK_HIGH(void); + inline void SPI_SCK_LOW(void); + inline bool SPI_MISO_READ(void); + inline void SPI_BEGIN_TRANSACTION(void); + inline void SPI_END_TRANSACTION(void); + inline void TFT_WR_STROBE(void); // Parallel interface write strobe + inline void TFT_RD_HIGH(void); // Parallel interface read high + inline void TFT_RD_LOW(void); // Parallel interface read low + + // CLASS INSTANCE VARIABLES -------------------------------------------- + + // Here be dragons! There's a big union of three structures here -- + // one each for hardware SPI, software (bitbang) SPI, and parallel + // interfaces. This is to save some memory, since a display's connection + // will be only one of these. The order of some things is a little weird + // in an attempt to get values to align and pack better in RAM. + +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) + PORTreg_t csPortSet; ///< PORT register for chip select SET + PORTreg_t csPortClr; ///< PORT register for chip select CLEAR + PORTreg_t dcPortSet; ///< PORT register for data/command SET + PORTreg_t dcPortClr; ///< PORT register for data/command CLEAR +#else // !HAS_PORT_SET_CLR + PORTreg_t csPort; ///< PORT register for chip select + PORTreg_t dcPort; ///< PORT register for data/command +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +#if defined(__cplusplus) && (__cplusplus >= 201100) + union { +#endif + struct { // Values specific to HARDWARE SPI: + SPIClass *_spi; ///< SPI class pointer +#if defined(SPI_HAS_TRANSACTION) + SPISettings settings; ///< SPI transaction settings +#else + uint32_t _freq; ///< SPI bitrate (if no SPI transactions) +#endif + uint32_t _mode; ///< SPI data mode (transactions or no) + } hwspi; ///< Hardware SPI values + struct { // Values specific to SOFTWARE SPI: +#if defined(USE_FAST_PINIO) + PORTreg_t misoPort; ///< PORT (PIN) register for MISO +#if defined(HAS_PORT_SET_CLR) + PORTreg_t mosiPortSet; ///< PORT register for MOSI SET + PORTreg_t mosiPortClr; ///< PORT register for MOSI CLEAR + PORTreg_t sckPortSet; ///< PORT register for SCK SET + PORTreg_t sckPortClr; ///< PORT register for SCK CLEAR +#if !defined(KINETISK) + ADAGFX_PORT_t mosiPinMask; ///< Bitmask for MOSI + ADAGFX_PORT_t sckPinMask; ///< Bitmask for SCK +#endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + PORTreg_t mosiPort; ///< PORT register for MOSI + PORTreg_t sckPort; ///< PORT register for SCK + ADAGFX_PORT_t mosiPinMaskSet; ///< Bitmask for MOSI SET (OR) + ADAGFX_PORT_t mosiPinMaskClr; ///< Bitmask for MOSI CLEAR (AND) + ADAGFX_PORT_t sckPinMaskSet; ///< Bitmask for SCK SET (OR bitmask) + ADAGFX_PORT_t sckPinMaskClr; ///< Bitmask for SCK CLEAR (AND) +#endif // end HAS_PORT_SET_CLR +#if !defined(KINETISK) + ADAGFX_PORT_t misoPinMask; ///< Bitmask for MISO +#endif // end !KINETISK +#endif // end USE_FAST_PINIO + int8_t _mosi; ///< MOSI pin # + int8_t _miso; ///< MISO pin # + int8_t _sck; ///< SCK pin # + } swspi; ///< Software SPI values + struct { // Values specific to 8-bit parallel: +#if defined(USE_FAST_PINIO) + +#if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + volatile uint32_t *writePort; ///< PORT register for DATA WRITE + volatile uint32_t *readPort; ///< PORT (PIN) register for DATA READ +#else + volatile uint8_t *writePort; ///< PORT register for DATA WRITE + volatile uint8_t *readPort; ///< PORT (PIN) register for DATA READ +#endif +#if defined(HAS_PORT_SET_CLR) + // Port direction register pointers are always 8-bit regardless of + // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. +#if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + volatile uint32_t *dirSet; ///< PORT byte data direction SET + volatile uint32_t *dirClr; ///< PORT byte data direction CLEAR +#else + volatile uint8_t *dirSet; ///< PORT byte data direction SET + volatile uint8_t *dirClr; ///< PORT byte data direction CLEAR +#endif + PORTreg_t wrPortSet; ///< PORT register for write strobe SET + PORTreg_t wrPortClr; ///< PORT register for write strobe CLEAR + PORTreg_t rdPortSet; ///< PORT register for read strobe SET + PORTreg_t rdPortClr; ///< PORT register for read strobe CLEAR +#if !defined(KINETISK) + ADAGFX_PORT_t wrPinMask; ///< Bitmask for write strobe +#endif // end !KINETISK + ADAGFX_PORT_t rdPinMask; ///< Bitmask for read strobe +#else // !HAS_PORT_SET_CLR + // Port direction register pointer is always 8-bit regardless of + // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. + volatile uint8_t *portDir; ///< PORT direction register + PORTreg_t wrPort; ///< PORT register for write strobe + PORTreg_t rdPort; ///< PORT register for read strobe + ADAGFX_PORT_t wrPinMaskSet; ///< Bitmask for write strobe SET (OR) + ADAGFX_PORT_t wrPinMaskClr; ///< Bitmask for write strobe CLEAR (AND) + ADAGFX_PORT_t rdPinMaskSet; ///< Bitmask for read strobe SET (OR) + ADAGFX_PORT_t rdPinMaskClr; ///< Bitmask for read strobe CLEAR (AND) +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO + int8_t _d0; ///< Data pin 0 # + int8_t _wr; ///< Write strobe pin # + int8_t _rd; ///< Read strobe pin # (or -1) + bool wide = 0; ///< If true, is 16-bit interface + } tft8; ///< Parallel interface settings +#if defined(__cplusplus) && (__cplusplus >= 201100) + }; ///< Only one interface is active +#endif +#if defined(USE_SPI_DMA) && \ + (defined(__SAMD51__) || \ + defined(ARDUINO_SAMD_ZERO)) // Used by hardware SPI and tft8 + Adafruit_ZeroDMA dma; ///< DMA instance + DmacDescriptor *dptr = NULL; ///< 1st descriptor + DmacDescriptor *descriptor = NULL; ///< Allocated descriptor list + uint16_t *pixelBuf[2]; ///< Working buffers + uint16_t maxFillLen; ///< Max pixels per DMA xfer + uint16_t lastFillColor = 0; ///< Last color used w/fill + uint32_t lastFillLen = 0; ///< # of pixels w/last fill + uint8_t onePixelBuf; ///< For hi==lo fill +#endif +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) +#if !defined(KINETISK) + ADAGFX_PORT_t csPinMask; ///< Bitmask for chip select + ADAGFX_PORT_t dcPinMask; ///< Bitmask for data/command +#endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + ADAGFX_PORT_t csPinMaskSet; ///< Bitmask for chip select SET (OR) + ADAGFX_PORT_t csPinMaskClr; ///< Bitmask for chip select CLEAR (AND) + ADAGFX_PORT_t dcPinMaskSet; ///< Bitmask for data/command SET (OR) + ADAGFX_PORT_t dcPinMaskClr; ///< Bitmask for data/command CLEAR (AND) +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO + uint8_t connection; ///< TFT_HARD_SPI, TFT_SOFT_SPI, etc. + int8_t _rst; ///< Reset pin # (or -1) + int8_t _cs; ///< Chip select pin # (or -1) + int8_t _dc; ///< Data/command pin # + + int16_t _xstart = 0; ///< Internal framebuffer X offset + int16_t _ystart = 0; ///< Internal framebuffer Y offset + uint8_t invertOnCommand = 0; ///< Command to enable invert mode + uint8_t invertOffCommand = 0; ///< Command to disable invert mode + + uint32_t _freq = 0; ///< Dummy var to keep subclasses happy +}; + +#endif // end __AVR_ATtiny85__ +#endif // end _ADAFRUIT_SPITFT_H_ diff --git a/src/library/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h b/src/library/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h new file mode 100644 index 0000000..fcd6253 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h @@ -0,0 +1,6 @@ +// THIS FILE INTENTIONALLY LEFT BLANK. + +// Macros previously #defined here have been made into (mostly) inline +// functions in the Adafruit_SPITFT class. Other libraries might still +// contain code trying to #include this header file, so until everything's +// updated this file still exists (but doing nothing) to avoid trouble. diff --git a/src/library/Adafruit-GFX-Library/CMakeLists.txt b/src/library/Adafruit-GFX-Library/CMakeLists.txt new file mode 100644 index 0000000..c8f764c --- /dev/null +++ b/src/library/Adafruit-GFX-Library/CMakeLists.txt @@ -0,0 +1,11 @@ +# Adafruit GFX Library +# https://github.com/adafruit/Adafruit-GFX-Library +# BSD License + +cmake_minimum_required(VERSION 3.5) + +idf_component_register(SRCS "Adafruit_GFX.cpp" "Adafruit_GrayOLED.cpp" "Adafruit_SPITFT.cpp" "glcdfont.c" + INCLUDE_DIRS "." + REQUIRES arduino Adafruit_BusIO) + +project(Adafruit-GFX-Library) diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h new file mode 100644 index 0000000..d124f20 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h @@ -0,0 +1,229 @@ +#pragma once +#include + +const uint8_t FreeMono12pt7bBitmaps[] PROGMEM = { + 0x49, 0x24, 0x92, 0x48, 0x01, 0xF8, 0xE7, 0xE7, 0x67, 0x42, 0x42, 0x42, + 0x42, 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1F, 0xF1, 0x10, 0x4C, 0x12, + 0x3F, 0xE1, 0x20, 0x48, 0x12, 0x04, 0x81, 0x20, 0x48, 0x04, 0x07, 0xA2, + 0x19, 0x02, 0x40, 0x10, 0x03, 0x00, 0x3C, 0x00, 0x80, 0x10, 0x06, 0x01, + 0xE0, 0xA7, 0xC0, 0x40, 0x10, 0x04, 0x00, 0x3C, 0x19, 0x84, 0x21, 0x08, + 0x66, 0x0F, 0x00, 0x0C, 0x1C, 0x78, 0x01, 0xE0, 0xCC, 0x21, 0x08, 0x43, + 0x30, 0x78, 0x3E, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, 0x14, 0x8A, + 0x43, 0x11, 0x8F, 0x60, 0xFD, 0xA4, 0x90, 0x05, 0x25, 0x24, 0x92, 0x48, + 0x92, 0x24, 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, 0x00, 0x04, 0x02, + 0x11, 0x07, 0xF0, 0xC0, 0x50, 0x48, 0x42, 0x00, 0x08, 0x04, 0x02, 0x01, + 0x00, 0x87, 0xFC, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x3B, 0x9C, 0xCE, + 0x62, 0x00, 0xFF, 0xE0, 0xFF, 0x80, 0x00, 0x80, 0xC0, 0x40, 0x20, 0x20, + 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x80, + 0x80, 0x40, 0x00, 0x1C, 0x31, 0x90, 0x58, 0x38, 0x0C, 0x06, 0x03, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x34, 0x13, 0x18, 0x70, 0x30, 0xE1, 0x44, 0x81, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F, 0xC0, 0x1E, 0x10, 0x90, + 0x68, 0x10, 0x08, 0x0C, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0E, + 0x07, 0xFE, 0x3E, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, 0xE0, 0x04, + 0x00, 0x80, 0x10, 0x04, 0x01, 0x00, 0xD8, 0x63, 0xE0, 0x06, 0x0A, 0x0A, + 0x12, 0x22, 0x22, 0x42, 0x42, 0x82, 0x82, 0xFF, 0x02, 0x02, 0x02, 0x0F, + 0x7F, 0x20, 0x10, 0x08, 0x04, 0x02, 0xF1, 0x8C, 0x03, 0x00, 0x80, 0x40, + 0x20, 0x18, 0x16, 0x18, 0xF0, 0x0F, 0x8C, 0x08, 0x08, 0x04, 0x04, 0x02, + 0x79, 0x46, 0xC1, 0xE0, 0x60, 0x28, 0x14, 0x19, 0x08, 0x78, 0xFF, 0x81, + 0x81, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, + 0x08, 0x3E, 0x31, 0xB0, 0x70, 0x18, 0x0C, 0x05, 0x8C, 0x38, 0x63, 0x40, + 0x60, 0x30, 0x18, 0x1B, 0x18, 0xF8, 0x3C, 0x31, 0x30, 0x50, 0x28, 0x0C, + 0x0F, 0x06, 0x85, 0x3C, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, 0xE0, 0xFF, + 0x80, 0x07, 0xFC, 0x39, 0xCE, 0x00, 0x00, 0x06, 0x33, 0x98, 0xC4, 0x00, + 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x06, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, + 0x00, 0x30, 0x01, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x06, + 0x00, 0x30, 0x01, 0x80, 0x18, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0C, 0x02, + 0x00, 0x00, 0x3E, 0x60, 0xA0, 0x20, 0x10, 0x08, 0x08, 0x18, 0x10, 0x08, + 0x00, 0x00, 0x00, 0x01, 0xC0, 0xE0, 0x1C, 0x31, 0x10, 0x50, 0x28, 0x14, + 0x3A, 0x25, 0x22, 0x91, 0x4C, 0xA3, 0xF0, 0x08, 0x02, 0x01, 0x80, 0x7C, + 0x3F, 0x00, 0x0C, 0x00, 0x48, 0x01, 0x20, 0x04, 0x40, 0x21, 0x00, 0x84, + 0x04, 0x08, 0x1F, 0xE0, 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xE1, + 0xF0, 0xFF, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, 0x1F, 0xC2, 0x06, + 0x40, 0x68, 0x05, 0x00, 0xA0, 0x14, 0x05, 0xFF, 0x00, 0x1E, 0x48, 0x74, + 0x05, 0x01, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01, + 0x30, 0x87, 0xC0, 0xFE, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, 0x05, + 0x01, 0x40, 0x50, 0x14, 0x0D, 0x02, 0x41, 0x3F, 0x80, 0xFF, 0xC8, 0x09, + 0x01, 0x20, 0x04, 0x00, 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, + 0xA0, 0x14, 0x03, 0xFF, 0xC0, 0xFF, 0xE8, 0x05, 0x00, 0xA0, 0x04, 0x00, + 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0xF0, + 0x00, 0x1F, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, 0x20, 0x04, 0x00, + 0x83, 0xF0, 0x0B, 0x01, 0x20, 0x23, 0x0C, 0x3E, 0x00, 0xE1, 0xD0, 0x24, + 0x09, 0x02, 0x40, 0x90, 0x27, 0xF9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02, + 0x40, 0xB8, 0x70, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x40, 0x81, 0x1F, 0xC0, 0x0F, 0xE0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, + 0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, 0xC6, 0x30, 0x7C, 0x00, + 0xF1, 0xE4, 0x0C, 0x41, 0x04, 0x20, 0x44, 0x04, 0x80, 0x5C, 0x06, 0x60, + 0x43, 0x04, 0x10, 0x40, 0x84, 0x08, 0x40, 0xCF, 0x07, 0xF8, 0x04, 0x00, + 0x80, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80, + 0x90, 0x12, 0x03, 0xFF, 0xC0, 0xE0, 0x3B, 0x01, 0x94, 0x14, 0xA0, 0xA4, + 0x89, 0x24, 0x49, 0x14, 0x48, 0xA2, 0x45, 0x12, 0x10, 0x90, 0x04, 0x80, + 0x24, 0x01, 0x78, 0x3C, 0xE0, 0xF6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24, + 0xC2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, 0xA4, 0x0A, 0x40, 0x6F, + 0x06, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18, 0x01, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC0, 0xF0, 0xFF, 0x10, + 0x64, 0x05, 0x01, 0x40, 0x50, 0x34, 0x19, 0xFC, 0x40, 0x10, 0x04, 0x01, + 0x00, 0x40, 0x3E, 0x00, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC1, + 0xF0, 0x0C, 0x01, 0xF1, 0x30, 0xE0, 0xFF, 0x04, 0x18, 0x40, 0xC4, 0x04, + 0x40, 0x44, 0x0C, 0x41, 0x87, 0xE0, 0x43, 0x04, 0x10, 0x40, 0x84, 0x04, + 0x40, 0x4F, 0x03, 0x1F, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, 0xC0, + 0x0E, 0x00, 0x40, 0x18, 0x06, 0x01, 0xE1, 0xA7, 0xC0, 0xFF, 0xF0, 0x86, + 0x10, 0x82, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, + 0x02, 0x00, 0x40, 0x7F, 0x00, 0xF0, 0xF4, 0x02, 0x40, 0x24, 0x02, 0x40, + 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x22, 0x04, 0x30, + 0xC0, 0xF0, 0xF8, 0x7C, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, 0x20, 0x40, + 0x80, 0x82, 0x02, 0x10, 0x08, 0x40, 0x11, 0x00, 0x48, 0x01, 0xA0, 0x03, + 0x00, 0x0C, 0x00, 0xF8, 0x7C, 0x80, 0x22, 0x00, 0x88, 0xC2, 0x23, 0x10, + 0x8E, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, 0x91, 0x41, 0x85, 0x06, 0x14, + 0x18, 0x70, 0x60, 0x80, 0xF0, 0xF2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80, + 0x50, 0x06, 0x00, 0x60, 0x0D, 0x00, 0x88, 0x10, 0xC2, 0x04, 0x60, 0x2F, + 0x0F, 0xF0, 0xF2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, 0x50, 0x05, 0x00, + 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x01, 0xFC, 0xFF, 0x40, + 0xA0, 0x90, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x50, 0x30, 0x18, + 0x0F, 0xFC, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9C, 0x80, 0x60, 0x10, + 0x08, 0x02, 0x01, 0x00, 0x40, 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20, + 0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x3C, 0x08, 0x0C, 0x09, 0x0C, 0x4C, 0x14, 0x04, 0xFF, 0xFC, 0x84, 0x21, + 0x3E, 0x00, 0x60, 0x08, 0x02, 0x3F, 0x98, 0x28, 0x0A, 0x02, 0xC3, 0x9F, + 0x30, 0xE0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x13, 0xE0, 0xA0, + 0x86, 0x02, 0x20, 0x09, 0x00, 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1B, + 0x9F, 0x00, 0x1F, 0x4C, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, 0x20, 0x02, + 0x00, 0x60, 0x43, 0xF0, 0x00, 0xC0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3C, + 0x98, 0x52, 0x06, 0x80, 0x50, 0x0A, 0x01, 0x40, 0x24, 0x0C, 0xC2, 0x87, + 0x98, 0x3F, 0x18, 0x68, 0x06, 0x01, 0xFF, 0xE0, 0x08, 0x03, 0x00, 0x60, + 0xC7, 0xC0, 0x0F, 0x98, 0x08, 0x04, 0x02, 0x07, 0xF8, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x03, 0xF8, 0x1E, 0x6C, 0x39, 0x03, 0x40, + 0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20, + 0x08, 0x3E, 0x00, 0xC0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, 0x11, + 0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0x2E, 0x1C, 0x08, 0x04, + 0x02, 0x00, 0x00, 0x03, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, + 0x80, 0x43, 0xFE, 0x04, 0x08, 0x10, 0x00, 0x1F, 0xC0, 0x81, 0x02, 0x04, + 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0B, 0xE0, 0xE0, 0x02, 0x00, 0x20, + 0x02, 0x00, 0x20, 0x02, 0x3C, 0x21, 0x02, 0x60, 0x2C, 0x03, 0x80, 0x24, + 0x02, 0x20, 0x21, 0x02, 0x08, 0xE1, 0xF0, 0x78, 0x04, 0x02, 0x01, 0x00, + 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, 0xFE, + 0xDC, 0xE3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, 0x21, 0x09, 0x08, 0x48, + 0x42, 0x42, 0x17, 0x18, 0xC0, 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20, + 0x22, 0x02, 0x20, 0x22, 0x02, 0x20, 0x2F, 0x07, 0x1F, 0x04, 0x11, 0x01, + 0x40, 0x18, 0x03, 0x00, 0x60, 0x0A, 0x02, 0x20, 0x83, 0xE0, 0xCF, 0x85, + 0x06, 0x60, 0x24, 0x01, 0x40, 0x14, 0x01, 0x40, 0x16, 0x02, 0x50, 0x44, + 0xF8, 0x40, 0x04, 0x00, 0x40, 0x0F, 0x00, 0x1E, 0x6C, 0x3B, 0x03, 0x40, + 0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20, + 0x04, 0x03, 0xC0, 0xE3, 0x8B, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, 0x00, + 0x80, 0x20, 0x3F, 0x80, 0x1F, 0x58, 0x34, 0x05, 0x80, 0x1E, 0x00, 0x60, + 0x06, 0x01, 0xC0, 0xAF, 0xC0, 0x20, 0x04, 0x00, 0x80, 0x10, 0x0F, 0xF0, + 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x03, 0x04, 0x3F, + 0x00, 0xC1, 0xC8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, 0x90, 0x12, 0x02, + 0x61, 0xC7, 0xCC, 0xF8, 0xF9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, 0x08, + 0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, 0x00, 0xF0, 0x7A, 0x01, 0x10, + 0x08, 0x8C, 0x42, 0x62, 0x12, 0x90, 0xA5, 0x05, 0x18, 0x28, 0xC0, 0x86, + 0x00, 0x78, 0xF3, 0x04, 0x18, 0x80, 0xD0, 0x06, 0x00, 0x70, 0x09, 0x81, + 0x0C, 0x20, 0x6F, 0x8F, 0xF0, 0xF2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80, + 0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, 0x00, 0x40, 0x08, 0x0F, + 0xE0, 0xFF, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0xBF, + 0xC0, 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, 0x10, 0x84, 0x20, + 0xC0, 0xFF, 0xFF, 0xC0, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4C, 0x42, + 0x10, 0x84, 0x26, 0x00, 0x38, 0x13, 0x38, 0x38}; + +const GFXglyph FreeMono12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 14, 0, 1}, // 0x20 ' ' + {0, 3, 15, 14, 6, -14}, // 0x21 '!' + {6, 8, 7, 14, 3, -14}, // 0x22 '"' + {13, 10, 16, 14, 2, -14}, // 0x23 '#' + {33, 10, 17, 14, 2, -14}, // 0x24 '$' + {55, 10, 15, 14, 2, -14}, // 0x25 '%' + {74, 9, 12, 14, 3, -11}, // 0x26 '&' + {88, 3, 7, 14, 5, -14}, // 0x27 ''' + {91, 3, 18, 14, 7, -14}, // 0x28 '(' + {98, 3, 18, 14, 4, -14}, // 0x29 ')' + {105, 9, 9, 14, 3, -14}, // 0x2A '*' + {116, 9, 11, 14, 3, -11}, // 0x2B '+' + {129, 5, 7, 14, 3, -3}, // 0x2C ',' + {134, 11, 1, 14, 2, -6}, // 0x2D '-' + {136, 3, 3, 14, 5, -2}, // 0x2E '.' + {138, 9, 18, 14, 3, -15}, // 0x2F '/' + {159, 9, 15, 14, 3, -14}, // 0x30 '0' + {176, 7, 14, 14, 4, -13}, // 0x31 '1' + {189, 9, 15, 14, 2, -14}, // 0x32 '2' + {206, 10, 15, 14, 2, -14}, // 0x33 '3' + {225, 8, 15, 14, 3, -14}, // 0x34 '4' + {240, 9, 15, 14, 3, -14}, // 0x35 '5' + {257, 9, 15, 14, 3, -14}, // 0x36 '6' + {274, 8, 15, 14, 3, -14}, // 0x37 '7' + {289, 9, 15, 14, 3, -14}, // 0x38 '8' + {306, 9, 15, 14, 3, -14}, // 0x39 '9' + {323, 3, 10, 14, 5, -9}, // 0x3A ':' + {327, 5, 13, 14, 3, -9}, // 0x3B ';' + {336, 11, 11, 14, 2, -11}, // 0x3C '<' + {352, 12, 4, 14, 1, -8}, // 0x3D '=' + {358, 11, 11, 14, 2, -11}, // 0x3E '>' + {374, 9, 14, 14, 3, -13}, // 0x3F '?' + {390, 9, 16, 14, 3, -14}, // 0x40 '@' + {408, 14, 14, 14, 0, -13}, // 0x41 'A' + {433, 11, 14, 14, 2, -13}, // 0x42 'B' + {453, 10, 14, 14, 2, -13}, // 0x43 'C' + {471, 10, 14, 14, 2, -13}, // 0x44 'D' + {489, 11, 14, 14, 2, -13}, // 0x45 'E' + {509, 11, 14, 14, 2, -13}, // 0x46 'F' + {529, 11, 14, 14, 2, -13}, // 0x47 'G' + {549, 10, 14, 14, 2, -13}, // 0x48 'H' + {567, 7, 14, 14, 4, -13}, // 0x49 'I' + {580, 11, 14, 14, 2, -13}, // 0x4A 'J' + {600, 12, 14, 14, 2, -13}, // 0x4B 'K' + {621, 11, 14, 14, 2, -13}, // 0x4C 'L' + {641, 13, 14, 14, 1, -13}, // 0x4D 'M' + {664, 12, 14, 14, 1, -13}, // 0x4E 'N' + {685, 12, 14, 14, 1, -13}, // 0x4F 'O' + {706, 10, 14, 14, 2, -13}, // 0x50 'P' + {724, 12, 17, 14, 1, -13}, // 0x51 'Q' + {750, 12, 14, 14, 2, -13}, // 0x52 'R' + {771, 10, 14, 14, 2, -13}, // 0x53 'S' + {789, 11, 14, 14, 2, -13}, // 0x54 'T' + {809, 12, 14, 14, 1, -13}, // 0x55 'U' + {830, 14, 14, 14, 0, -13}, // 0x56 'V' + {855, 14, 14, 14, 0, -13}, // 0x57 'W' + {880, 12, 14, 14, 1, -13}, // 0x58 'X' + {901, 12, 14, 14, 1, -13}, // 0x59 'Y' + {922, 9, 14, 14, 3, -13}, // 0x5A 'Z' + {938, 3, 18, 14, 7, -14}, // 0x5B '[' + {945, 9, 18, 14, 3, -15}, // 0x5C '\' + {966, 3, 18, 14, 5, -14}, // 0x5D ']' + {973, 9, 6, 14, 3, -14}, // 0x5E '^' + {980, 14, 1, 14, 0, 3}, // 0x5F '_' + {982, 4, 4, 14, 4, -15}, // 0x60 '`' + {984, 10, 10, 14, 2, -9}, // 0x61 'a' + {997, 13, 15, 14, 0, -14}, // 0x62 'b' + {1022, 11, 10, 14, 2, -9}, // 0x63 'c' + {1036, 11, 15, 14, 2, -14}, // 0x64 'd' + {1057, 10, 10, 14, 2, -9}, // 0x65 'e' + {1070, 9, 15, 14, 4, -14}, // 0x66 'f' + {1087, 11, 14, 14, 2, -9}, // 0x67 'g' + {1107, 10, 15, 14, 2, -14}, // 0x68 'h' + {1126, 9, 15, 14, 3, -14}, // 0x69 'i' + {1143, 7, 19, 14, 3, -14}, // 0x6A 'j' + {1160, 12, 15, 14, 1, -14}, // 0x6B 'k' + {1183, 9, 15, 14, 3, -14}, // 0x6C 'l' + {1200, 13, 10, 14, 1, -9}, // 0x6D 'm' + {1217, 12, 10, 14, 1, -9}, // 0x6E 'n' + {1232, 11, 10, 14, 2, -9}, // 0x6F 'o' + {1246, 12, 14, 14, 1, -9}, // 0x70 'p' + {1267, 11, 14, 14, 2, -9}, // 0x71 'q' + {1287, 10, 10, 14, 3, -9}, // 0x72 'r' + {1300, 10, 10, 14, 2, -9}, // 0x73 's' + {1313, 11, 14, 14, 1, -13}, // 0x74 't' + {1333, 11, 10, 14, 2, -9}, // 0x75 'u' + {1347, 13, 10, 14, 1, -9}, // 0x76 'v' + {1364, 13, 10, 14, 1, -9}, // 0x77 'w' + {1381, 12, 10, 14, 1, -9}, // 0x78 'x' + {1396, 12, 14, 14, 1, -9}, // 0x79 'y' + {1417, 9, 10, 14, 3, -9}, // 0x7A 'z' + {1429, 5, 18, 14, 5, -14}, // 0x7B '{' + {1441, 1, 18, 14, 7, -14}, // 0x7C '|' + {1444, 5, 18, 14, 5, -14}, // 0x7D '}' + {1456, 10, 3, 14, 2, -7}}; // 0x7E '~' + +const GFXfont FreeMono12pt7b PROGMEM = {(uint8_t *)FreeMono12pt7bBitmaps, + (GFXglyph *)FreeMono12pt7bGlyphs, 0x20, + 0x7E, 24}; + +// Approx. 2132 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h new file mode 100644 index 0000000..6a3641c --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h @@ -0,0 +1,365 @@ +#pragma once +#include + +const uint8_t FreeMono18pt7bBitmaps[] PROGMEM = { + 0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, 0x00, 0x6F, 0xF6, 0xF1, + 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC3, 0x98, 0x33, 0x06, 0x60, 0xCC, + 0x18, 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, 0x20, 0x10, 0x80, + 0x42, 0x01, 0x10, 0x04, 0x41, 0xFF, 0xF0, 0x44, 0x02, 0x10, 0x08, 0x40, + 0x21, 0x0F, 0xFF, 0xC2, 0x10, 0x08, 0x40, 0x21, 0x00, 0x84, 0x02, 0x10, + 0x08, 0x40, 0x23, 0x00, 0x88, 0x02, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80, + 0x1F, 0xA3, 0x07, 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, 0x0C, + 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x18, 0x00, 0x20, 0x01, 0x80, 0x0C, 0x00, + 0x70, 0x05, 0xE0, 0xC9, 0xF8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, + 0x10, 0x00, 0x1E, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, + 0x10, 0x08, 0x40, 0x0F, 0x00, 0x00, 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xE0, + 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, 0x08, 0x08, + 0x10, 0x30, 0x10, 0xC0, 0x1E, 0x00, 0x0F, 0xC1, 0x00, 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xC0, 0x6C, 0x3C, 0x62, + 0x82, 0x68, 0x34, 0x81, 0xCC, 0x08, 0x61, 0xC3, 0xE7, 0xFF, 0xFF, 0xF6, + 0x66, 0x66, 0x08, 0xC4, 0x62, 0x31, 0x8C, 0xC6, 0x31, 0x8C, 0x63, 0x18, + 0xC3, 0x18, 0xC2, 0x18, 0xC3, 0x18, 0x86, 0x10, 0xC2, 0x18, 0xC6, 0x10, + 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x8C, 0x62, 0x31, 0x98, 0x80, 0x02, 0x00, + 0x10, 0x00, 0x80, 0x04, 0x0C, 0x21, 0x9D, 0x70, 0x1C, 0x00, 0xA0, 0x0D, + 0x80, 0xC6, 0x04, 0x10, 0x40, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE, 0x02, + 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, + 0x01, 0x00, 0x3E, 0x78, 0xF3, 0xC7, 0x8E, 0x18, 0x70, 0xC1, 0x80, 0xFF, + 0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x08, 0x00, 0xC0, 0x04, 0x00, 0x60, + 0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40, 0x02, + 0x00, 0x20, 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00, + 0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x00, + 0x0F, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, 0x60, 0x0E, 0x00, 0x30, + 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, + 0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, 0xC0, 0xF8, 0x00, 0x06, + 0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, 0x31, 0x00, 0x08, 0x00, 0x40, + 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, + 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x0F, 0x80, + 0xC3, 0x08, 0x04, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, + 0x10, 0x01, 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, + 0x18, 0x01, 0x80, 0x58, 0x03, 0x80, 0x1F, 0xFF, 0x80, 0x0F, 0xC0, 0xC0, + 0x86, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, + 0x20, 0x0F, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x40, + 0x01, 0x00, 0x04, 0x00, 0x2C, 0x01, 0x9C, 0x0C, 0x0F, 0xC0, 0x01, 0xC0, + 0x14, 0x02, 0x40, 0x64, 0x04, 0x40, 0xC4, 0x08, 0x41, 0x84, 0x10, 0x42, + 0x04, 0x20, 0x44, 0x04, 0x40, 0x48, 0x04, 0xFF, 0xF0, 0x04, 0x00, 0x40, + 0x04, 0x00, 0x40, 0x04, 0x07, 0xF0, 0x3F, 0xF0, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x0B, 0xF0, 0x30, 0x30, 0x00, 0x60, + 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0E, + 0x00, 0x2C, 0x01, 0x0C, 0x18, 0x0F, 0xC0, 0x01, 0xF0, 0x60, 0x18, 0x03, + 0x00, 0x20, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0xF8, 0x98, 0x4A, + 0x02, 0xE0, 0x3C, 0x01, 0x80, 0x14, 0x01, 0x40, 0x14, 0x03, 0x20, 0x21, + 0x0C, 0x0F, 0x80, 0xFF, 0xF8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, 0x02, + 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x08, 0x00, 0x80, 0x18, + 0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, 0x0F, + 0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03, + 0x40, 0x11, 0x83, 0x07, 0xF0, 0x60, 0xC4, 0x01, 0x60, 0x0E, 0x00, 0x30, + 0x01, 0x80, 0x0E, 0x00, 0xD0, 0x04, 0x60, 0xC1, 0xFC, 0x00, 0x1F, 0x03, + 0x08, 0x40, 0x4C, 0x02, 0x80, 0x28, 0x02, 0x80, 0x18, 0x03, 0xC0, 0x74, + 0x05, 0x21, 0x91, 0xF1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, 0x00, 0x40, + 0x0C, 0x01, 0x80, 0x60, 0xF8, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, + 0x1D, 0xFF, 0xFD, 0xC0, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0xF1, 0xE3, 0x8F, 0x1C, 0x38, 0xE1, 0xC3, 0x06, 0x00, 0x00, 0x06, + 0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x38, + 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E, + 0x00, 0x07, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70, + 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x70, + 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x60, 0x00, 0x3F, + 0x8E, 0x0C, 0x80, 0x28, 0x01, 0x80, 0x10, 0x01, 0x00, 0x10, 0x02, 0x00, + 0xC0, 0x38, 0x06, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, + 0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x0F, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24, + 0x01, 0x40, 0x0A, 0x00, 0x50, 0x1E, 0x83, 0x14, 0x20, 0xA2, 0x05, 0x10, + 0x28, 0x81, 0x46, 0x0A, 0x18, 0x50, 0x3F, 0x80, 0x04, 0x00, 0x10, 0x00, + 0x80, 0x02, 0x00, 0x18, 0x18, 0x3F, 0x00, 0x1F, 0xF0, 0x00, 0x06, 0x80, + 0x00, 0x34, 0x00, 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, 0x04, + 0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, 0x10, 0x10, 0x01, 0x80, 0x80, + 0x08, 0x06, 0x00, 0x7F, 0xF0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, 0x00, + 0x10, 0x18, 0x00, 0xC0, 0x80, 0x06, 0x04, 0x00, 0x11, 0xFC, 0x0F, 0xF0, + 0xFF, 0xF8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, 0x04, 0x10, 0x01, 0x04, + 0x00, 0x41, 0x00, 0x10, 0x40, 0x08, 0x10, 0x0C, 0x07, 0xFF, 0x01, 0x00, + 0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01, + 0x10, 0x00, 0x44, 0x00, 0x21, 0x00, 0x33, 0xFF, 0xF8, 0x03, 0xF1, 0x06, + 0x0E, 0x8C, 0x01, 0xC4, 0x00, 0x64, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x01, + 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83, + 0x03, 0x80, 0x7E, 0x00, 0xFF, 0xE0, 0x20, 0x18, 0x20, 0x0C, 0x20, 0x04, + 0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02, + 0x20, 0x04, 0x20, 0x0C, 0x20, 0x18, 0xFF, 0xE0, 0xFF, 0xFF, 0x08, 0x00, + 0x84, 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20, + 0x40, 0x10, 0x20, 0x0F, 0xF0, 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00, + 0x80, 0x00, 0x40, 0x02, 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00, + 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11, + 0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, 0x40, 0x10, 0x20, 0x0F, 0xF0, + 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, + 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF9, + 0x06, 0x07, 0x84, 0x00, 0xC4, 0x00, 0x24, 0x00, 0x12, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x0F, 0xF8, + 0x00, 0x14, 0x00, 0x09, 0x00, 0x04, 0x80, 0x02, 0x20, 0x01, 0x18, 0x00, + 0x83, 0x01, 0xC0, 0x7F, 0x00, 0xFC, 0x3F, 0x20, 0x04, 0x20, 0x04, 0x20, + 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x3F, + 0xFC, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, + 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xFC, 0x3F, 0xFF, 0xF8, 0x10, + 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, + 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, + 0x00, 0x10, 0x00, 0x81, 0xFF, 0xF0, 0x03, 0xFF, 0x80, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, + 0x00, 0x21, 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0C, 0x18, 0x01, 0xF0, + 0x00, 0xFF, 0x1F, 0x84, 0x01, 0x81, 0x00, 0xC0, 0x40, 0x60, 0x10, 0x30, + 0x04, 0x18, 0x01, 0x0C, 0x00, 0x46, 0x00, 0x13, 0x00, 0x05, 0xF0, 0x01, + 0xC6, 0x00, 0x60, 0xC0, 0x10, 0x18, 0x04, 0x06, 0x01, 0x00, 0xC0, 0x40, + 0x30, 0x10, 0x04, 0x04, 0x01, 0x81, 0x00, 0x23, 0xFC, 0x0F, 0xFF, 0x80, + 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, + 0x42, 0x00, 0x84, 0x01, 0x08, 0x02, 0x10, 0x04, 0x20, 0x0F, 0xFF, 0xF0, + 0xF0, 0x01, 0xE7, 0x00, 0x70, 0xA0, 0x0A, 0x16, 0x03, 0x42, 0x40, 0x48, + 0x4C, 0x19, 0x08, 0x82, 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10, + 0x86, 0xC2, 0x10, 0x50, 0x42, 0x0E, 0x08, 0x41, 0xC1, 0x08, 0x00, 0x21, + 0x00, 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x02, 0x7F, 0x03, 0xF0, + 0xF8, 0x1F, 0xC6, 0x00, 0x41, 0xC0, 0x10, 0x50, 0x04, 0x12, 0x01, 0x04, + 0xC0, 0x41, 0x10, 0x10, 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04, + 0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, 0x01, 0x90, 0x40, 0x24, + 0x10, 0x05, 0x04, 0x01, 0xC1, 0x00, 0x31, 0xFC, 0x0C, 0x03, 0xE0, 0x06, + 0x0C, 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x05, + 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x0E, 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, + 0x06, 0x00, 0x7C, 0x00, 0xFF, 0xF0, 0x10, 0x0C, 0x10, 0x02, 0x10, 0x03, + 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, 0x10, 0x06, 0x10, 0x0C, + 0x1F, 0xF0, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0xC0, 0x03, 0xE0, 0x06, 0x0C, + 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x07, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0E, + 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, + 0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7F, 0xC6, 0x38, 0x1E, 0xFF, + 0xF0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, 0x01, 0x81, 0x00, 0x10, 0x20, + 0x02, 0x04, 0x00, 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, 0x7F, + 0xC0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, 0x18, 0x04, 0x01, 0x80, 0x80, + 0x10, 0x10, 0x03, 0x02, 0x00, 0x20, 0x40, 0x06, 0x7F, 0x80, 0x70, 0x0F, + 0xC8, 0x61, 0xE2, 0x01, 0x90, 0x02, 0x40, 0x09, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x38, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, + 0x00, 0x60, 0x01, 0x80, 0x0F, 0x00, 0x2B, 0x03, 0x23, 0xF0, 0xFF, 0xFF, + 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10, 0x20, 0x20, 0x00, 0x40, 0x00, + 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x01, 0xFF, 0xC0, + 0xFC, 0x1F, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, 0x00, + 0x10, 0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, + 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, 0x04, 0x10, 0x04, + 0x0C, 0x06, 0x03, 0x06, 0x00, 0x7C, 0x00, 0xFE, 0x03, 0xF8, 0x80, 0x02, + 0x04, 0x00, 0x10, 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xC0, 0x30, + 0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, 0x30, 0x10, 0x00, 0x80, 0x80, + 0x06, 0x0C, 0x00, 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, 0x11, + 0x00, 0x00, 0xD8, 0x00, 0x06, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, + 0xFC, 0x0F, 0xE8, 0x00, 0x19, 0x00, 0x03, 0x10, 0x00, 0x62, 0x00, 0x08, + 0x41, 0x81, 0x08, 0x28, 0x21, 0x05, 0x04, 0x21, 0xA0, 0x84, 0x36, 0x30, + 0x84, 0x46, 0x08, 0x88, 0xC1, 0x31, 0x18, 0x24, 0x12, 0x04, 0x82, 0x40, + 0xB0, 0x48, 0x14, 0x09, 0x02, 0x80, 0xA0, 0x30, 0x1C, 0x06, 0x03, 0x80, + 0x7E, 0x0F, 0xC2, 0x00, 0x60, 0x60, 0x0C, 0x06, 0x03, 0x00, 0x60, 0xC0, + 0x0C, 0x10, 0x00, 0xC6, 0x00, 0x0D, 0x80, 0x00, 0xA0, 0x00, 0x1C, 0x00, + 0x03, 0x80, 0x00, 0xD8, 0x00, 0x11, 0x00, 0x06, 0x30, 0x01, 0x83, 0x00, + 0x60, 0x30, 0x08, 0x06, 0x03, 0x00, 0x60, 0xC0, 0x06, 0x7F, 0x07, 0xF0, + 0xFC, 0x1F, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, 0x80, 0xC1, 0x80, 0x20, + 0x80, 0x18, 0xC0, 0x04, 0x40, 0x03, 0x60, 0x00, 0xE0, 0x00, 0x20, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x20, 0x03, 0xFF, 0x80, 0xFF, 0xF4, 0x00, 0xA0, 0x09, + 0x00, 0x48, 0x04, 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01, + 0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, 0x24, 0x01, 0x40, 0x0C, 0x00, + 0x60, 0x03, 0xFF, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, + 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, 0x80, 0x02, 0x00, 0x10, + 0x00, 0xC0, 0x02, 0x00, 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40, + 0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, 0x00, 0x20, 0x00, 0x80, + 0x04, 0x00, 0x10, 0x00, 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00, + 0x08, 0x00, 0x40, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, + 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xF8, 0x02, 0x00, 0x38, 0x03, 0x60, + 0x11, 0x01, 0x8C, 0x18, 0x31, 0x80, 0xD8, 0x03, 0x80, 0x08, 0xFF, 0xFF, + 0xF8, 0xC1, 0x83, 0x06, 0x0C, 0x0F, 0xC0, 0x70, 0x30, 0x00, 0x10, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x0F, 0xF8, 0x30, 0x08, 0x40, 0x08, 0x80, + 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x38, 0x60, 0xE8, 0x3F, 0x8F, 0xF0, + 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, + 0x01, 0x0F, 0x80, 0x4C, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, 0x08, + 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01, 0x18, + 0x00, 0x86, 0x00, 0x21, 0xC0, 0x10, 0x5C, 0x18, 0xF1, 0xF8, 0x00, 0x07, + 0xE4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, 0x00, 0x50, 0x00, 0x20, 0x00, + 0x40, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, 0xC3, + 0x07, 0x01, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, + 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7C, 0x20, 0x60, 0xC8, 0x20, 0x0A, + 0x10, 0x01, 0x84, 0x00, 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, + 0x00, 0x22, 0x00, 0x08, 0xC0, 0x06, 0x10, 0x01, 0x82, 0x00, 0xE0, 0x60, + 0xE8, 0x0F, 0xE3, 0xC0, 0x07, 0xE0, 0x1C, 0x18, 0x30, 0x0C, 0x60, 0x06, + 0x40, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0xC0, 0x00, + 0x40, 0x00, 0x60, 0x00, 0x30, 0x03, 0x0C, 0x0E, 0x03, 0xF0, 0x03, 0xFC, + 0x18, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x0F, 0xFF, 0x82, 0x00, + 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, + 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0xFF, 0xF0, 0x0F, + 0xC7, 0x9C, 0x3A, 0x18, 0x07, 0x08, 0x01, 0x8C, 0x00, 0xC4, 0x00, 0x22, + 0x00, 0x11, 0x00, 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, 0x01, + 0x82, 0x01, 0x40, 0xC3, 0x20, 0x3F, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0xF0, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x47, + 0xC0, 0x2C, 0x18, 0x1C, 0x04, 0x0C, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, + 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, + 0x04, 0x00, 0x82, 0x00, 0x47, 0xC0, 0xF8, 0x06, 0x00, 0x18, 0x00, 0x60, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, + 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x03, 0xFF, 0xF0, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x40, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, + 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x08, 0x06, 0xFE, 0x00, 0xF0, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0xFE, 0x10, 0x30, 0x10, 0xE0, 0x11, 0xC0, 0x13, 0x00, 0x16, 0x00, 0x1E, + 0x00, 0x1B, 0x00, 0x11, 0x80, 0x10, 0xC0, 0x10, 0x60, 0x10, 0x30, 0x10, + 0x18, 0x10, 0x1C, 0xF0, 0x3F, 0x7E, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, + 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, + 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0xFF, 0xFC, 0xEF, 0x9E, 0x07, 0x1E, 0x20, 0xC1, + 0x82, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, 0x21, 0x02, + 0x04, 0x20, 0x40, 0x84, 0x08, 0x10, 0x81, 0x02, 0x10, 0x20, 0x42, 0x04, + 0x08, 0x40, 0x81, 0x3E, 0x1C, 0x38, 0x71, 0xF0, 0x0B, 0x06, 0x07, 0x01, + 0x03, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10, + 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x13, + 0xF0, 0x3E, 0x07, 0xC0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, 0x00, 0x50, + 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x05, 0x00, 0x12, 0x00, + 0x22, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0xF1, 0xFC, 0x05, 0xC1, 0x81, + 0xC0, 0x10, 0x60, 0x02, 0x18, 0x00, 0xC4, 0x00, 0x11, 0x00, 0x04, 0x40, + 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, 0x08, 0x60, 0x02, 0x14, 0x01, + 0x04, 0xC1, 0x81, 0x0F, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xE3, 0xC6, + 0x0E, 0x86, 0x00, 0xE1, 0x00, 0x18, 0xC0, 0x06, 0x20, 0x00, 0x88, 0x00, + 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, 0x61, 0x00, 0x18, + 0x20, 0x0A, 0x06, 0x0C, 0x80, 0x7C, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, + 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0F, 0xF0, 0xF8, + 0x7C, 0x11, 0x8C, 0x2C, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, + 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xD1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00, + 0x30, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x00, 0x1C, + 0x01, 0xF0, 0x1A, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x00, 0xFF, 0xFC, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x08, 0x01, 0x06, 0x0F, 0x03, 0xF8, 0xF0, 0x3E, 0x08, + 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, + 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, + 0xE0, 0x41, 0xD0, 0x1F, 0x8E, 0xFE, 0x0F, 0xE2, 0x00, 0x20, 0x60, 0x0C, + 0x0C, 0x01, 0x80, 0x80, 0x20, 0x18, 0x0C, 0x01, 0x01, 0x00, 0x30, 0x60, + 0x02, 0x08, 0x00, 0x41, 0x00, 0x0C, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00, + 0x01, 0x40, 0x00, 0x38, 0x00, 0xFC, 0x07, 0xE4, 0x00, 0x10, 0x80, 0x02, + 0x18, 0x20, 0xC3, 0x0E, 0x18, 0x21, 0x42, 0x04, 0x28, 0x40, 0x8D, 0x88, + 0x19, 0x93, 0x03, 0x22, 0x60, 0x2C, 0x68, 0x05, 0x85, 0x00, 0xA0, 0xA0, + 0x1C, 0x1C, 0x01, 0x81, 0x80, 0x7C, 0x1F, 0x18, 0x03, 0x06, 0x03, 0x01, + 0x83, 0x00, 0x63, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x03, 0x80, 0x03, 0x60, + 0x03, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xF0, + 0x7E, 0xFC, 0x1F, 0x90, 0x01, 0x8C, 0x00, 0x86, 0x00, 0xC1, 0x80, 0x40, + 0xC0, 0x60, 0x20, 0x20, 0x18, 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8C, + 0x00, 0x64, 0x00, 0x16, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, + 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x07, 0xFE, 0x00, + 0xFF, 0xF4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, + 0xC0, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x14, 0x00, 0xA0, 0x07, 0xFF, + 0xE0, 0x07, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x30, 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x0C, 0x07, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x0C, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0xE0, 0x1C, 0x00, 0x44, 0x0D, 0x84, + 0x36, 0x04, 0x40, 0x07, 0x00}; + +const GFXglyph FreeMono18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 21, 0, 1}, // 0x20 ' ' + {0, 4, 22, 21, 8, -21}, // 0x21 '!' + {11, 11, 10, 21, 5, -20}, // 0x22 '"' + {25, 14, 24, 21, 3, -21}, // 0x23 '#' + {67, 13, 26, 21, 4, -22}, // 0x24 '$' + {110, 15, 21, 21, 3, -20}, // 0x25 '%' + {150, 12, 18, 21, 4, -17}, // 0x26 '&' + {177, 4, 10, 21, 8, -20}, // 0x27 ''' + {182, 5, 25, 21, 10, -20}, // 0x28 '(' + {198, 5, 25, 21, 6, -20}, // 0x29 ')' + {214, 13, 12, 21, 4, -20}, // 0x2A '*' + {234, 15, 17, 21, 3, -17}, // 0x2B '+' + {266, 7, 10, 21, 5, -4}, // 0x2C ',' + {275, 15, 1, 21, 3, -9}, // 0x2D '-' + {277, 5, 5, 21, 8, -4}, // 0x2E '.' + {281, 13, 26, 21, 4, -22}, // 0x2F '/' + {324, 13, 21, 21, 4, -20}, // 0x30 '0' + {359, 13, 21, 21, 4, -20}, // 0x31 '1' + {394, 13, 21, 21, 3, -20}, // 0x32 '2' + {429, 14, 21, 21, 3, -20}, // 0x33 '3' + {466, 12, 21, 21, 4, -20}, // 0x34 '4' + {498, 14, 21, 21, 3, -20}, // 0x35 '5' + {535, 12, 21, 21, 5, -20}, // 0x36 '6' + {567, 12, 21, 21, 4, -20}, // 0x37 '7' + {599, 13, 21, 21, 4, -20}, // 0x38 '8' + {634, 12, 21, 21, 5, -20}, // 0x39 '9' + {666, 5, 15, 21, 8, -14}, // 0x3A ':' + {676, 7, 20, 21, 5, -14}, // 0x3B ';' + {694, 15, 16, 21, 3, -17}, // 0x3C '<' + {724, 17, 6, 21, 2, -12}, // 0x3D '=' + {737, 15, 16, 21, 3, -17}, // 0x3E '>' + {767, 12, 20, 21, 5, -19}, // 0x3F '?' + {797, 13, 23, 21, 4, -20}, // 0x40 '@' + {835, 21, 20, 21, 0, -19}, // 0x41 'A' + {888, 18, 20, 21, 1, -19}, // 0x42 'B' + {933, 17, 20, 21, 2, -19}, // 0x43 'C' + {976, 16, 20, 21, 2, -19}, // 0x44 'D' + {1016, 17, 20, 21, 1, -19}, // 0x45 'E' + {1059, 17, 20, 21, 1, -19}, // 0x46 'F' + {1102, 17, 20, 21, 2, -19}, // 0x47 'G' + {1145, 16, 20, 21, 2, -19}, // 0x48 'H' + {1185, 13, 20, 21, 4, -19}, // 0x49 'I' + {1218, 17, 20, 21, 3, -19}, // 0x4A 'J' + {1261, 18, 20, 21, 1, -19}, // 0x4B 'K' + {1306, 15, 20, 21, 3, -19}, // 0x4C 'L' + {1344, 19, 20, 21, 1, -19}, // 0x4D 'M' + {1392, 18, 20, 21, 1, -19}, // 0x4E 'N' + {1437, 17, 20, 21, 2, -19}, // 0x4F 'O' + {1480, 16, 20, 21, 1, -19}, // 0x50 'P' + {1520, 17, 24, 21, 2, -19}, // 0x51 'Q' + {1571, 19, 20, 21, 1, -19}, // 0x52 'R' + {1619, 14, 20, 21, 3, -19}, // 0x53 'S' + {1654, 15, 20, 21, 3, -19}, // 0x54 'T' + {1692, 17, 20, 21, 2, -19}, // 0x55 'U' + {1735, 21, 20, 21, 0, -19}, // 0x56 'V' + {1788, 19, 20, 21, 1, -19}, // 0x57 'W' + {1836, 19, 20, 21, 1, -19}, // 0x58 'X' + {1884, 17, 20, 21, 2, -19}, // 0x59 'Y' + {1927, 13, 20, 21, 4, -19}, // 0x5A 'Z' + {1960, 5, 25, 21, 10, -20}, // 0x5B '[' + {1976, 13, 26, 21, 4, -22}, // 0x5C '\' + {2019, 5, 25, 21, 6, -20}, // 0x5D ']' + {2035, 13, 9, 21, 4, -20}, // 0x5E '^' + {2050, 21, 1, 21, 0, 4}, // 0x5F '_' + {2053, 6, 5, 21, 5, -21}, // 0x60 '`' + {2057, 16, 15, 21, 3, -14}, // 0x61 'a' + {2087, 18, 21, 21, 1, -20}, // 0x62 'b' + {2135, 15, 15, 21, 3, -14}, // 0x63 'c' + {2164, 18, 21, 21, 2, -20}, // 0x64 'd' + {2212, 16, 15, 21, 2, -14}, // 0x65 'e' + {2242, 14, 21, 21, 4, -20}, // 0x66 'f' + {2279, 17, 22, 21, 2, -14}, // 0x67 'g' + {2326, 17, 21, 21, 1, -20}, // 0x68 'h' + {2371, 14, 22, 21, 4, -21}, // 0x69 'i' + {2410, 10, 29, 21, 5, -21}, // 0x6A 'j' + {2447, 16, 21, 21, 2, -20}, // 0x6B 'k' + {2489, 14, 21, 21, 4, -20}, // 0x6C 'l' + {2526, 19, 15, 21, 1, -14}, // 0x6D 'm' + {2562, 17, 15, 21, 1, -14}, // 0x6E 'n' + {2594, 15, 15, 21, 3, -14}, // 0x6F 'o' + {2623, 18, 22, 21, 1, -14}, // 0x70 'p' + {2673, 18, 22, 21, 2, -14}, // 0x71 'q' + {2723, 15, 15, 21, 3, -14}, // 0x72 'r' + {2752, 13, 15, 21, 4, -14}, // 0x73 's' + {2777, 16, 20, 21, 1, -19}, // 0x74 't' + {2817, 17, 15, 21, 1, -14}, // 0x75 'u' + {2849, 19, 15, 21, 1, -14}, // 0x76 'v' + {2885, 19, 15, 21, 1, -14}, // 0x77 'w' + {2921, 17, 15, 21, 2, -14}, // 0x78 'x' + {2953, 17, 22, 21, 2, -14}, // 0x79 'y' + {3000, 13, 15, 21, 4, -14}, // 0x7A 'z' + {3025, 8, 25, 21, 6, -20}, // 0x7B '{' + {3050, 1, 25, 21, 10, -20}, // 0x7C '|' + {3054, 8, 25, 21, 7, -20}, // 0x7D '}' + {3079, 15, 5, 21, 3, -11}}; // 0x7E '~' + +const GFXfont FreeMono18pt7b PROGMEM = {(uint8_t *)FreeMono18pt7bBitmaps, + (GFXglyph *)FreeMono18pt7bGlyphs, 0x20, + 0x7E, 35}; + +// Approx. 3761 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h new file mode 100644 index 0000000..2540ed4 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h @@ -0,0 +1,579 @@ +#pragma once +#include + +const uint8_t FreeMono24pt7bBitmaps[] PROGMEM = { + 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x10, 0x84, 0x21, 0x08, + 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0xFE, 0x7F, 0x7C, 0x3E, 0x7C, + 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x3C, + 0x3E, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x01, + 0x86, 0x00, 0x30, 0xC0, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18, 0x60, 0x03, + 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x70, 0x01, 0x8C, 0x00, 0x61, 0x80, 0x0C, + 0x30, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18, + 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x7F, 0xFF, 0xEF, 0xFF, + 0xFC, 0x06, 0x18, 0x00, 0xC7, 0x00, 0x38, 0xC0, 0x06, 0x18, 0x00, 0xC3, + 0x00, 0x18, 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x01, 0x86, + 0x00, 0x30, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0F, 0xC0, + 0x0F, 0xFD, 0x87, 0x03, 0xE3, 0x80, 0x39, 0xC0, 0x06, 0x60, 0x01, 0x98, + 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F, + 0x80, 0x03, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, + 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x80, 0x0E, 0xFC, 0x0F, 0x37, + 0xFF, 0x80, 0x7F, 0x80, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x80, 0x01, 0xFE, 0x00, 0x38, + 0x70, 0x03, 0x03, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, + 0x01, 0x80, 0x30, 0x30, 0x03, 0x87, 0x00, 0x1F, 0xE0, 0x30, 0x78, 0x1F, + 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00, + 0x0C, 0x01, 0xE0, 0x00, 0x7F, 0x80, 0x0E, 0x1C, 0x00, 0xC0, 0xC0, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x0C, 0x0E, 0x00, + 0xE1, 0xC0, 0x07, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xEC, 0x01, 0xFF, 0x00, + 0xE1, 0x00, 0x70, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, + 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x7C, 0x00, 0x3B, 0x83, + 0xD8, 0x60, 0xFE, 0x0C, 0x33, 0x03, 0x98, 0xC0, 0x66, 0x30, 0x0D, 0x8C, + 0x03, 0xC3, 0x00, 0x70, 0x60, 0x1C, 0x1C, 0x0F, 0x03, 0x87, 0x7C, 0x7F, + 0x9F, 0x07, 0x80, 0x00, 0xFE, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x3C, + 0x70, 0xE1, 0xC3, 0x87, 0x00, 0x06, 0x1C, 0x30, 0xE1, 0x87, 0x0E, 0x18, + 0x70, 0xE1, 0xC3, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x0C, + 0x1C, 0x38, 0x70, 0x60, 0xE1, 0xC1, 0x83, 0x83, 0x06, 0x06, 0x04, 0xC1, + 0xC1, 0x83, 0x83, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0xE0, 0xE1, 0xC3, + 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x87, 0x0E, 0x1C, 0x30, 0x61, 0xC3, + 0x0E, 0x18, 0x70, 0xC1, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x03, 0x00, 0x00, 0xC0, 0x10, 0x30, 0x3F, 0x8C, 0x7C, 0xFF, 0xFC, 0x07, + 0xF8, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0C, 0xC0, 0x06, 0x18, 0x03, 0x87, + 0x00, 0xC0, 0xC0, 0x60, 0x18, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, + 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, + 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, + 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, + 0x1F, 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C, + 0x1C, 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF0, 0x7D, 0xFF, + 0xFF, 0xFF, 0xEF, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06, + 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0E, 0x00, + 0x03, 0x00, 0x01, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x0C, 0x00, 0x07, + 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x03, + 0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xE0, 0x18, 0x30, 0x03, 0x1C, 0x00, + 0xE6, 0x00, 0x19, 0x80, 0x06, 0xE0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, + 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, + 0x76, 0x00, 0x19, 0x80, 0x06, 0x70, 0x03, 0x8C, 0x00, 0xC3, 0x80, 0x60, + 0x78, 0x78, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x03, 0x80, 0x07, 0x80, 0x0F, + 0x80, 0x1D, 0x80, 0x39, 0x80, 0x71, 0x80, 0xE1, 0x80, 0xC1, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xC0, 0xE0, + 0xC0, 0x1C, 0x60, 0x03, 0xB8, 0x00, 0x6C, 0x00, 0x0F, 0x00, 0x03, 0x00, + 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, + 0x00, 0xD0, 0x00, 0x38, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, + 0xF8, 0x01, 0xFF, 0xC0, 0x70, 0x3C, 0x18, 0x01, 0xC6, 0x00, 0x18, 0x00, + 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, + 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xD8, 0x00, + 0x3B, 0x80, 0x0E, 0x3E, 0x07, 0x81, 0xFF, 0xE0, 0x07, 0xE0, 0x00, 0x00, + 0x3C, 0x00, 0x7C, 0x00, 0x6C, 0x00, 0xCC, 0x00, 0x8C, 0x01, 0x8C, 0x03, + 0x0C, 0x03, 0x0C, 0x06, 0x0C, 0x04, 0x0C, 0x0C, 0x0C, 0x08, 0x0C, 0x10, + 0x0C, 0x30, 0x0C, 0x20, 0x0C, 0x60, 0x0C, 0x40, 0x0C, 0x80, 0x0C, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, + 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0xFF, 0x07, 0xFF, 0xE0, + 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, + 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC7, 0xE0, 0x1F, 0xFF, 0x03, + 0x80, 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60, + 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x06, 0xC0, 0x01, 0xDC, 0x00, 0x71, 0xF0, 0x3C, 0x0F, + 0xFF, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xF0, 0x3E, 0x00, 0x1E, + 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, + 0x18, 0x00, 0x06, 0x00, 0x03, 0x80, 0x00, 0xC1, 0xF8, 0x31, 0xFF, 0x0C, + 0xF0, 0xF3, 0x70, 0x0C, 0xD8, 0x01, 0xBC, 0x00, 0x6E, 0x00, 0x0F, 0x80, + 0x03, 0xC0, 0x00, 0xD8, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0x30, 0x01, + 0x8E, 0x00, 0x61, 0xC0, 0x30, 0x38, 0x38, 0x07, 0xFC, 0x00, 0x7C, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xC0, + 0x00, 0x60, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, + 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, + 0x00, 0x0C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC0, 0xF1, 0xC0, 0x0E, + 0x60, 0x01, 0xB8, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x36, 0x00, 0x18, 0xC0, 0x0C, 0x1C, 0x0E, 0x03, 0xFF, 0x00, 0xFF, + 0xC0, 0x70, 0x38, 0x30, 0x03, 0x18, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x03, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x60, 0x01, 0x98, + 0x00, 0xE3, 0x00, 0x70, 0x70, 0x38, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x07, + 0xE0, 0x03, 0xFE, 0x01, 0xC1, 0xC0, 0xC0, 0x38, 0x60, 0x07, 0x18, 0x00, + 0xCC, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x01, 0xB0, 0x00, 0x3C, 0x00, 0x1F, + 0x00, 0x07, 0x60, 0x03, 0xD8, 0x01, 0xB3, 0x00, 0xCC, 0xF0, 0xF3, 0x0F, + 0xF8, 0xC1, 0xF8, 0x30, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, + 0xE0, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80, + 0x07, 0xC0, 0xFF, 0xC0, 0x1F, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, + 0xF7, 0xC0, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF1, 0xF8, 0x7C, 0x3F, 0x0F, + 0x83, 0xE0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x38, 0x04, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, + 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x20, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0x7F, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xFE, 0x3E, 0x07, 0x98, 0x00, 0xEC, 0x00, + 0x36, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0xC0, + 0x00, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, + 0x78, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE0, 0xE0, 0xE0, 0x1C, 0x30, + 0x03, 0x1C, 0x00, 0x66, 0x00, 0x19, 0x80, 0x06, 0xC0, 0x01, 0xB0, 0x07, + 0xEC, 0x07, 0xFB, 0x03, 0xC6, 0xC1, 0xC1, 0xB0, 0xE0, 0x6C, 0x30, 0x1B, + 0x0C, 0x06, 0xC3, 0x01, 0xB0, 0xC0, 0x6C, 0x18, 0x1B, 0x07, 0x86, 0xC0, + 0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, + 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x80, 0xC0, 0xFF, 0xF0, + 0x0F, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1B, 0x00, + 0x00, 0x01, 0x98, 0x00, 0x00, 0x11, 0x80, 0x00, 0x03, 0x0C, 0x00, 0x00, + 0x30, 0xC0, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, + 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x80, 0x30, 0x00, + 0x18, 0x01, 0x80, 0x01, 0x80, 0x18, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, + 0xFC, 0x00, 0x20, 0x00, 0xC0, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, + 0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x01, 0x80, + 0x00, 0x18, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x03, + 0xFF, 0xFF, 0x01, 0x80, 0x0E, 0x06, 0x00, 0x1C, 0x18, 0x00, 0x38, 0x60, + 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x38, 0x60, 0x01, + 0xC1, 0x80, 0x1E, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x60, 0x03, 0xC1, + 0x80, 0x03, 0x86, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x60, 0x00, 0x31, 0x80, + 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x61, 0x80, 0x03, + 0x86, 0x00, 0x1C, 0xFF, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00, 0xFC, 0x00, + 0x0F, 0xFE, 0x60, 0xF0, 0x3D, 0x87, 0x00, 0x3E, 0x38, 0x00, 0x38, 0xC0, + 0x00, 0xE7, 0x00, 0x01, 0x98, 0x00, 0x06, 0x60, 0x00, 0x03, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, + 0xC7, 0x00, 0x06, 0x0E, 0x00, 0x70, 0x1E, 0x07, 0x80, 0x3F, 0xFC, 0x00, + 0x1F, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0x00, 0x3C, 0x0C, 0x00, + 0x38, 0x30, 0x00, 0x70, 0xC0, 0x00, 0xC3, 0x00, 0x03, 0x8C, 0x00, 0x06, + 0x30, 0x00, 0x1C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30, + 0x00, 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30, 0x00, + 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x30, + 0xC0, 0x01, 0xC3, 0x00, 0x0E, 0x0C, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0xFF, + 0xF8, 0x00, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE1, 0x80, 0x01, 0x86, 0x00, + 0x06, 0x18, 0x00, 0x18, 0x60, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x00, + 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F, + 0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00, + 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, + 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x80, 0x00, 0xC6, 0x00, + 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x00, + 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F, + 0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00, + 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0xFF, 0xF0, 0x03, 0xFF, + 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x98, 0x1E, 0x03, 0xF0, 0x70, + 0x01, 0xE1, 0x80, 0x01, 0xC6, 0x00, 0x01, 0x9C, 0x00, 0x03, 0x30, 0x00, + 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x03, 0xFF, + 0xC0, 0x07, 0xFF, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x37, 0x00, 0x00, 0x66, + 0x00, 0x00, 0xCC, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x1C, 0x00, 0x06, 0x1E, + 0x00, 0x0C, 0x0F, 0x00, 0xF8, 0x0F, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x7F, + 0x01, 0xFC, 0xFE, 0x03, 0xF8, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, + 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, + 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, + 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, + 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFE, + 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xFF, 0xFC, + 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, + 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x60, 0xC0, 0x00, 0xC1, 0x80, 0x01, 0x83, 0x00, 0x03, + 0x06, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x30, 0x38, 0x00, 0x60, + 0x38, 0x01, 0x80, 0x3C, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xC0, 0x00, + 0xFF, 0x81, 0xFE, 0xFF, 0x81, 0xFE, 0x18, 0x00, 0x30, 0x18, 0x00, 0xE0, + 0x18, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x18, 0x07, 0x00, 0x18, 0x0E, 0x00, + 0x18, 0x18, 0x00, 0x18, 0x70, 0x00, 0x18, 0xE0, 0x00, 0x19, 0xE0, 0x00, + 0x1B, 0xF8, 0x00, 0x1F, 0x1C, 0x00, 0x1C, 0x06, 0x00, 0x18, 0x03, 0x00, + 0x18, 0x03, 0x80, 0x18, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x18, 0x00, 0xC0, + 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x70, 0x18, 0x00, 0x30, + 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x01, + 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, + 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, + 0x06, 0x00, 0x18, 0x30, 0x00, 0xC1, 0x80, 0x06, 0x0C, 0x00, 0x30, 0x60, + 0x01, 0x83, 0x00, 0x0C, 0x18, 0x00, 0x60, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xF3, 0x60, 0x01, + 0xB0, 0xD8, 0x00, 0x6C, 0x33, 0x00, 0x33, 0x0C, 0xC0, 0x0C, 0xC3, 0x38, + 0x07, 0x30, 0xC6, 0x01, 0x8C, 0x31, 0xC0, 0xE3, 0x0C, 0x30, 0x30, 0xC3, + 0x0C, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x0C, 0xC0, + 0xC3, 0x03, 0x30, 0x30, 0xC0, 0x78, 0x0C, 0x30, 0x1E, 0x03, 0x0C, 0x03, + 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0x30, 0x00, 0x03, 0x0C, + 0x00, 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0xFF, 0x00, 0x3F, + 0xFF, 0xC0, 0x0F, 0xF0, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0x1E, 0x00, + 0x0C, 0x1F, 0x00, 0x0C, 0x1B, 0x00, 0x0C, 0x19, 0x80, 0x0C, 0x19, 0xC0, + 0x0C, 0x18, 0xC0, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x30, + 0x0C, 0x18, 0x38, 0x0C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x0C, 0x18, 0x0E, + 0x0C, 0x18, 0x06, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x01, + 0x8C, 0x18, 0x01, 0xCC, 0x18, 0x00, 0xCC, 0x18, 0x00, 0x6C, 0x18, 0x00, + 0x7C, 0x18, 0x00, 0x3C, 0x7F, 0x80, 0x1C, 0x7F, 0x80, 0x1C, 0x00, 0x7E, + 0x00, 0x01, 0xFF, 0xC0, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00, + 0x38, 0x38, 0x00, 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00, + 0x06, 0x60, 0x00, 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, + 0x0E, 0x30, 0x00, 0x0C, 0x38, 0x00, 0x1C, 0x1C, 0x00, 0x38, 0x0E, 0x00, + 0x70, 0x07, 0x81, 0xE0, 0x03, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0xFF, 0xFF, + 0x07, 0xFF, 0xFE, 0x06, 0x00, 0x78, 0x30, 0x00, 0xE1, 0x80, 0x03, 0x0C, + 0x00, 0x0C, 0x60, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, 0xC0, 0x01, + 0xC6, 0x00, 0x0C, 0x30, 0x00, 0xC1, 0x80, 0x1E, 0x0F, 0xFF, 0xC0, 0x7F, + 0xF8, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, + 0x00, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFF, + 0x80, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00, 0x38, 0x38, 0x00, + 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00, 0x06, 0x60, 0x00, + 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0E, 0x30, 0x00, + 0x0C, 0x18, 0x00, 0x1C, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x81, + 0xE0, 0x00, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xFF, + 0x87, 0x07, 0xFF, 0xFE, 0x07, 0x00, 0xF8, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, + 0x80, 0x18, 0x03, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00, + 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, + 0x70, 0x18, 0x00, 0x60, 0x18, 0x01, 0xC0, 0x18, 0x07, 0x80, 0x1F, 0xFF, + 0x00, 0x1F, 0xFC, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x07, 0x00, 0x18, 0x03, + 0x80, 0x18, 0x01, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00, + 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0xFF, 0x80, 0x1F, 0xFF, 0x80, + 0x0F, 0x03, 0xF8, 0x00, 0xFF, 0xE6, 0x1E, 0x07, 0xE3, 0x80, 0x1E, 0x30, + 0x00, 0xE6, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x60, 0x00, 0x07, + 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0xC0, + 0x00, 0x3F, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, + 0x06, 0xF8, 0x01, 0xED, 0xE0, 0x7C, 0xCF, 0xFF, 0x00, 0x3F, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xF0, 0x0C, 0x03, 0xC0, 0x30, + 0x0F, 0x00, 0xC0, 0x3C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, + 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, + 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, + 0x03, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0xFF, + 0x01, 0xFF, 0xFE, 0x03, 0xFC, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00, + 0x01, 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, + 0x18, 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00, 0x01, + 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x18, + 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x80, 0x03, 0x83, + 0x00, 0x06, 0x07, 0x00, 0x1C, 0x07, 0x00, 0x70, 0x07, 0x83, 0xC0, 0x07, + 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF, + 0x18, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x00, 0x60, + 0x00, 0x30, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x03, 0x00, 0x0C, + 0x00, 0x30, 0x00, 0xC0, 0x03, 0x80, 0x0C, 0x00, 0x18, 0x01, 0x80, 0x01, + 0x80, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0E, 0x03, + 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, 0x00, 0x00, 0x30, 0xC0, 0x00, + 0x03, 0x0C, 0x00, 0x00, 0x30, 0x80, 0x00, 0x01, 0x98, 0x00, 0x00, 0x19, + 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x00, + 0xFF, 0x80, 0x7F, 0xFF, 0xE0, 0x1F, 0xF3, 0x00, 0x00, 0x30, 0xC0, 0x00, + 0x0C, 0x30, 0x00, 0x03, 0x0C, 0x03, 0x80, 0xC3, 0x01, 0xE0, 0x30, 0x60, + 0x78, 0x0C, 0x18, 0x1F, 0x02, 0x06, 0x04, 0xC0, 0x81, 0x83, 0x30, 0x60, + 0x60, 0xCC, 0x18, 0x18, 0x31, 0x86, 0x06, 0x18, 0x61, 0x81, 0x86, 0x18, + 0x60, 0x71, 0x87, 0x18, 0x0C, 0x40, 0xC6, 0x03, 0x30, 0x31, 0x00, 0xCC, + 0x0C, 0xC0, 0x33, 0x01, 0xB0, 0x0D, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, + 0xD8, 0x06, 0xC0, 0x34, 0x00, 0xF0, 0x07, 0x00, 0x3C, 0x01, 0xC0, 0x0E, + 0x00, 0x7F, 0x00, 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00, + 0x38, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x60, 0x03, 0x00, 0xC0, 0x01, 0x81, + 0x80, 0x01, 0xC3, 0x80, 0x00, 0xE7, 0x00, 0x00, 0x76, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66, + 0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x03, 0x81, 0xC0, 0x07, 0x00, + 0xE0, 0x06, 0x00, 0x60, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x18, 0x38, 0x00, + 0x1C, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, + 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x70, 0x06, 0x00, + 0x60, 0x03, 0x00, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC3, + 0x00, 0x00, 0xE7, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x07, 0xFF, 0xE0, 0x07, 0xFF, + 0xE0, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00, 0x19, 0x80, 0x0C, 0x60, 0x07, + 0x18, 0x03, 0x86, 0x00, 0xC1, 0x80, 0x70, 0x00, 0x38, 0x00, 0x0C, 0x00, + 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C, + 0x00, 0x06, 0x00, 0x03, 0x80, 0x31, 0xC0, 0x0C, 0x60, 0x03, 0x30, 0x00, + 0xDC, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, + 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0xFF, 0xFC, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, + 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, + 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x80, 0x00, 0x60, + 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x00, 0x07, 0x00, + 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, + 0x0C, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, + 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, + 0x18, 0x30, 0x60, 0xC1, 0x83, 0xFF, 0xFC, 0x00, 0x40, 0x00, 0x30, 0x00, + 0x1E, 0x00, 0x0E, 0xC0, 0x07, 0x38, 0x01, 0x87, 0x00, 0xC0, 0xC0, 0x60, + 0x18, 0x38, 0x03, 0x1C, 0x00, 0xE6, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x3C, 0x0E, 0x07, 0x03, + 0x01, 0xFC, 0x00, 0x7F, 0xFC, 0x01, 0xC0, 0x3C, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x60, 0x0F, 0xF9, 0x81, 0xFF, 0xFE, 0x0F, 0x80, 0x38, 0x70, 0x00, 0x63, + 0x80, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00, + 0x07, 0x86, 0x00, 0x76, 0x1E, 0x07, 0x9F, 0x3F, 0xF8, 0x7C, 0x3F, 0x80, + 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, + 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x1F, 0x80, + 0x18, 0xFF, 0xC0, 0x33, 0x81, 0xC0, 0x6E, 0x01, 0xC0, 0xF0, 0x00, 0xC1, + 0xE0, 0x01, 0xC3, 0x80, 0x01, 0x87, 0x00, 0x03, 0x8C, 0x00, 0x03, 0x18, + 0x00, 0x06, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80, + 0x00, 0x63, 0x80, 0x01, 0x87, 0x00, 0x03, 0x0F, 0x00, 0x0E, 0x1F, 0x00, + 0x38, 0x37, 0x00, 0xE3, 0xE7, 0x03, 0x87, 0xC7, 0xFE, 0x00, 0x03, 0xF0, + 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF9, 0x83, 0xC0, 0xFC, 0x38, 0x01, 0xE3, + 0x00, 0x07, 0x38, 0x00, 0x19, 0x80, 0x00, 0xDC, 0x00, 0x06, 0xC0, 0x00, + 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, + 0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00, + 0xC7, 0x00, 0x1E, 0x1E, 0x03, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x01, 0xF8, 0x18, 0x07, + 0xFE, 0x18, 0x0F, 0x07, 0x98, 0x1C, 0x01, 0xD8, 0x38, 0x00, 0xF8, 0x70, + 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0, 0x00, 0x18, 0xC0, + 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, + 0x00, 0x18, 0x60, 0x00, 0x38, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x38, + 0x00, 0xD8, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x9F, 0x07, 0xFE, 0x1F, 0x01, + 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x07, 0x80, 0xF0, 0x70, 0x01, + 0xC3, 0x00, 0x07, 0x30, 0x00, 0x19, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x0C, 0x00, 0x00, + 0x60, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, + 0x00, 0xC7, 0x00, 0x0E, 0x1E, 0x03, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0xC0, 0x3F, 0xFC, 0x0E, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00, + 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x9F, 0xFF, 0xF0, + 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, + 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, + 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x03, 0xFF, 0xFC, 0x7F, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xFC, + 0x7C, 0x38, 0x1C, 0xF8, 0xE0, 0x0D, 0x83, 0x00, 0x0F, 0x0E, 0x00, 0x1E, + 0x18, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63, + 0x00, 0x00, 0xC6, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x18, 0x00, 0x06, 0x18, + 0x00, 0x1C, 0x30, 0x00, 0x38, 0x30, 0x00, 0xF0, 0x70, 0x03, 0x60, 0x78, + 0x1C, 0xC0, 0x3F, 0xF1, 0x80, 0x1F, 0x83, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, + 0x80, 0x00, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xC0, 0x00, 0xF8, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, + 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x18, 0xFF, 0x80, + 0x37, 0x03, 0x80, 0x7C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03, + 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, + 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, + 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, + 0x63, 0xFC, 0x07, 0xFF, 0xF8, 0x0F, 0xF0, 0x01, 0xC0, 0x00, 0x70, 0x00, + 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x03, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x00, 0x0C, + 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, + 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, + 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, + 0x70, 0x03, 0x80, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, + 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x1F, 0xE0, 0x60, 0x7F, 0x81, + 0x80, 0x60, 0x06, 0x07, 0x00, 0x18, 0x38, 0x00, 0x61, 0xC0, 0x01, 0x8E, + 0x00, 0x06, 0x70, 0x00, 0x1B, 0x80, 0x00, 0x7F, 0x00, 0x01, 0xCE, 0x00, + 0x06, 0x1C, 0x00, 0x18, 0x38, 0x00, 0x60, 0x70, 0x01, 0x80, 0xE0, 0x06, + 0x01, 0xC0, 0x18, 0x03, 0x80, 0x60, 0x07, 0x0F, 0x80, 0x7F, 0xFE, 0x01, + 0xFF, 0x3F, 0xC0, 0x0F, 0xF0, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x3C, 0x0F, 0x9F, 0x87, 0xE0, 0xFB, + 0x1C, 0xC7, 0x01, 0xE0, 0xD8, 0x38, 0x1C, 0x07, 0x01, 0x81, 0x80, 0x60, + 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, + 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, + 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, + 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x8F, 0xE0, + 0x7C, 0x1F, 0xFE, 0x07, 0xC1, 0xF0, 0x00, 0x1F, 0x00, 0xF8, 0xFF, 0x81, + 0xF3, 0x83, 0x80, 0x6C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03, + 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, + 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, + 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, + 0x67, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xFE, + 0x00, 0xF0, 0x3C, 0x07, 0x00, 0x38, 0x38, 0x00, 0x71, 0xC0, 0x00, 0xE6, + 0x00, 0x01, 0x98, 0x00, 0x06, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x36, 0x00, 0x01, + 0x98, 0x00, 0x06, 0x70, 0x00, 0x38, 0xE0, 0x01, 0xC1, 0xC0, 0x0E, 0x03, + 0xC0, 0xF0, 0x07, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x01, 0xF1, + 0xFF, 0x83, 0xE7, 0x03, 0x80, 0xD8, 0x01, 0x81, 0xE0, 0x01, 0x83, 0xC0, + 0x03, 0x87, 0x00, 0x03, 0x0E, 0x00, 0x07, 0x18, 0x00, 0x06, 0x30, 0x00, + 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00, + 0xC7, 0x00, 0x03, 0x0E, 0x00, 0x06, 0x1E, 0x00, 0x18, 0x36, 0x00, 0x70, + 0x67, 0x03, 0xC0, 0xC7, 0xFE, 0x01, 0x83, 0xF0, 0x03, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, + 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x01, + 0xF8, 0x00, 0x07, 0xFF, 0x1F, 0x0F, 0x07, 0x9F, 0x1C, 0x01, 0xD8, 0x38, + 0x00, 0x78, 0x70, 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0, + 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, + 0x00, 0x18, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x30, + 0x00, 0x78, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x98, 0x07, 0xFF, 0x18, 0x01, + 0xFC, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x03, 0xFF, 0x00, 0x03, 0xFF, 0x7E, 0x03, 0xC3, 0xF0, 0x7F, 0x81, 0x8F, + 0x0E, 0x0C, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00, + 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, + 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, + 0x00, 0x00, 0x30, 0x00, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x00, 0x07, 0xF0, + 0x07, 0xFF, 0x63, 0xC0, 0xF9, 0xC0, 0x0E, 0x60, 0x01, 0x98, 0x00, 0x66, + 0x00, 0x19, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0xC0, 0x00, + 0x7C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, + 0xF8, 0x00, 0x7F, 0x00, 0x3B, 0xF0, 0x3C, 0xDF, 0xFE, 0x00, 0xFE, 0x00, + 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, + 0x00, 0x06, 0x00, 0x03, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x0C, 0x00, 0x00, + 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, + 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, + 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x07, 0x07, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x3F, 0x80, 0xF8, + 0x03, 0xF1, 0xF0, 0x07, 0xE0, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, + 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, + 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, + 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x18, 0x00, 0xF0, + 0x18, 0x03, 0x60, 0x38, 0x3C, 0xF8, 0x3F, 0xF1, 0xF0, 0x1F, 0x00, 0x00, + 0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF0, 0xC0, 0x00, 0xC0, 0x30, 0x00, + 0x30, 0x06, 0x00, 0x1C, 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x00, 0xC0, 0x03, 0x80, 0x30, 0x00, 0x60, 0x18, 0x00, 0x18, 0x06, 0x00, + 0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x06, 0x18, + 0x00, 0x00, 0xC6, 0x00, 0x00, 0x33, 0x00, 0x00, 0x0E, 0xC0, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x0F, 0xF1, + 0x80, 0x00, 0x20, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x03, 0x01, + 0x80, 0x81, 0xE0, 0x60, 0x30, 0x78, 0x10, 0x0C, 0x1E, 0x0C, 0x03, 0x0C, + 0xC3, 0x00, 0xC3, 0x30, 0xC0, 0x10, 0xCC, 0x30, 0x06, 0x61, 0x98, 0x01, + 0x98, 0x66, 0x00, 0x66, 0x19, 0x80, 0x0B, 0x03, 0x60, 0x03, 0xC0, 0xD0, + 0x00, 0xF0, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x0E, 0x01, 0xC0, 0x3F, 0x81, + 0xFE, 0x3F, 0x81, 0xFE, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x00, + 0xE0, 0x01, 0x81, 0xC0, 0x00, 0xC3, 0x80, 0x00, 0x67, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x67, 0x00, 0x00, 0xC3, + 0x80, 0x01, 0x81, 0xC0, 0x03, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x0C, 0x00, + 0x38, 0x18, 0x00, 0x1C, 0x7F, 0x81, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00, + 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00, + 0x18, 0x0C, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x60, 0x03, 0x00, + 0x60, 0x03, 0x00, 0xC0, 0x01, 0x80, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC1, + 0x80, 0x00, 0xC3, 0x00, 0x00, 0x63, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36, + 0x00, 0x00, 0x34, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, + 0x00, 0xFF, 0xFF, 0x7F, 0xFF, 0xB0, 0x01, 0x98, 0x01, 0xCC, 0x01, 0xC0, + 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0, + 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x03, 0x70, + 0x01, 0xB0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xE0, 0x7C, 0x0C, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, + 0x00, 0x60, 0x0C, 0x03, 0x00, 0xE0, 0xF0, 0x1E, 0x00, 0x70, 0x06, 0x00, + 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, + 0x0C, 0x01, 0x80, 0x18, 0x03, 0xE0, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x1F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x01, + 0x80, 0x38, 0x01, 0xE0, 0x3C, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x03, 0x00, + 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0, + 0xF8, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0xFC, 0x03, 0x70, 0xE0, 0x76, 0x07, + 0x8E, 0xC0, 0x1F, 0xC0, 0x00, 0xF0}; + +const GFXglyph FreeMono24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 28, 0, 1}, // 0x20 ' ' + {0, 5, 30, 28, 11, -28}, // 0x21 '!' + {19, 16, 14, 28, 6, -28}, // 0x22 '"' + {47, 19, 32, 28, 4, -29}, // 0x23 '#' + {123, 18, 33, 28, 5, -29}, // 0x24 '$' + {198, 20, 29, 28, 4, -27}, // 0x25 '%' + {271, 18, 25, 28, 5, -23}, // 0x26 '&' + {328, 7, 14, 28, 11, -28}, // 0x27 ''' + {341, 7, 34, 28, 14, -27}, // 0x28 '(' + {371, 7, 34, 28, 8, -27}, // 0x29 ')' + {401, 18, 16, 28, 5, -27}, // 0x2A '*' + {437, 20, 22, 28, 4, -23}, // 0x2B '+' + {492, 9, 14, 28, 6, -6}, // 0x2C ',' + {508, 22, 2, 28, 3, -13}, // 0x2D '-' + {514, 7, 6, 28, 11, -4}, // 0x2E '.' + {520, 18, 35, 28, 5, -30}, // 0x2F '/' + {599, 18, 30, 28, 5, -28}, // 0x30 '0' + {667, 16, 29, 28, 6, -28}, // 0x31 '1' + {725, 18, 29, 28, 5, -28}, // 0x32 '2' + {791, 19, 30, 28, 5, -28}, // 0x33 '3' + {863, 16, 28, 28, 6, -27}, // 0x34 '4' + {919, 19, 29, 28, 5, -27}, // 0x35 '5' + {988, 18, 30, 28, 6, -28}, // 0x36 '6' + {1056, 18, 28, 28, 5, -27}, // 0x37 '7' + {1119, 18, 30, 28, 5, -28}, // 0x38 '8' + {1187, 18, 30, 28, 6, -28}, // 0x39 '9' + {1255, 7, 21, 28, 11, -19}, // 0x3A ':' + {1274, 10, 27, 28, 7, -19}, // 0x3B ';' + {1308, 22, 22, 28, 3, -23}, // 0x3C '<' + {1369, 24, 9, 28, 2, -17}, // 0x3D '=' + {1396, 21, 22, 28, 4, -23}, // 0x3E '>' + {1454, 17, 28, 28, 6, -26}, // 0x3F '?' + {1514, 18, 32, 28, 5, -28}, // 0x40 '@' + {1586, 28, 26, 28, 0, -25}, // 0x41 'A' + {1677, 22, 26, 28, 3, -25}, // 0x42 'B' + {1749, 22, 28, 28, 3, -26}, // 0x43 'C' + {1826, 22, 26, 28, 3, -25}, // 0x44 'D' + {1898, 22, 26, 28, 3, -25}, // 0x45 'E' + {1970, 22, 26, 28, 3, -25}, // 0x46 'F' + {2042, 23, 28, 28, 3, -26}, // 0x47 'G' + {2123, 23, 26, 28, 3, -25}, // 0x48 'H' + {2198, 16, 26, 28, 6, -25}, // 0x49 'I' + {2250, 23, 27, 28, 4, -25}, // 0x4A 'J' + {2328, 24, 26, 28, 3, -25}, // 0x4B 'K' + {2406, 21, 26, 28, 4, -25}, // 0x4C 'L' + {2475, 26, 26, 28, 1, -25}, // 0x4D 'M' + {2560, 24, 26, 28, 2, -25}, // 0x4E 'N' + {2638, 24, 28, 28, 2, -26}, // 0x4F 'O' + {2722, 21, 26, 28, 3, -25}, // 0x50 'P' + {2791, 24, 32, 28, 2, -26}, // 0x51 'Q' + {2887, 24, 26, 28, 3, -25}, // 0x52 'R' + {2965, 20, 28, 28, 4, -26}, // 0x53 'S' + {3035, 22, 26, 28, 3, -25}, // 0x54 'T' + {3107, 23, 27, 28, 3, -25}, // 0x55 'U' + {3185, 28, 26, 28, 0, -25}, // 0x56 'V' + {3276, 26, 26, 28, 1, -25}, // 0x57 'W' + {3361, 24, 26, 28, 2, -25}, // 0x58 'X' + {3439, 24, 26, 28, 2, -25}, // 0x59 'Y' + {3517, 18, 26, 28, 5, -25}, // 0x5A 'Z' + {3576, 7, 34, 28, 13, -27}, // 0x5B '[' + {3606, 18, 35, 28, 5, -30}, // 0x5C '\' + {3685, 7, 34, 28, 8, -27}, // 0x5D ']' + {3715, 18, 12, 28, 5, -28}, // 0x5E '^' + {3742, 28, 2, 28, 0, 5}, // 0x5F '_' + {3749, 8, 7, 28, 7, -29}, // 0x60 '`' + {3756, 22, 22, 28, 3, -20}, // 0x61 'a' + {3817, 23, 29, 28, 2, -27}, // 0x62 'b' + {3901, 21, 22, 28, 4, -20}, // 0x63 'c' + {3959, 24, 29, 28, 3, -27}, // 0x64 'd' + {4046, 21, 22, 28, 3, -20}, // 0x65 'e' + {4104, 19, 28, 28, 6, -27}, // 0x66 'f' + {4171, 23, 30, 28, 3, -20}, // 0x67 'g' + {4258, 23, 28, 28, 3, -27}, // 0x68 'h' + {4339, 18, 29, 28, 5, -28}, // 0x69 'i' + {4405, 14, 38, 28, 6, -28}, // 0x6A 'j' + {4472, 22, 28, 28, 4, -27}, // 0x6B 'k' + {4549, 18, 28, 28, 5, -27}, // 0x6C 'l' + {4612, 28, 21, 28, 0, -20}, // 0x6D 'm' + {4686, 23, 21, 28, 2, -20}, // 0x6E 'n' + {4747, 22, 22, 28, 3, -20}, // 0x6F 'o' + {4808, 23, 30, 28, 2, -20}, // 0x70 'p' + {4895, 24, 30, 28, 3, -20}, // 0x71 'q' + {4985, 21, 20, 28, 5, -19}, // 0x72 'r' + {5038, 18, 22, 28, 5, -20}, // 0x73 's' + {5088, 21, 27, 28, 3, -25}, // 0x74 't' + {5159, 23, 21, 28, 3, -19}, // 0x75 'u' + {5220, 26, 20, 28, 1, -19}, // 0x76 'v' + {5285, 26, 20, 28, 1, -19}, // 0x77 'w' + {5350, 24, 20, 28, 2, -19}, // 0x78 'x' + {5410, 24, 29, 28, 2, -19}, // 0x79 'y' + {5497, 17, 20, 28, 6, -19}, // 0x7A 'z' + {5540, 11, 34, 28, 8, -27}, // 0x7B '{' + {5587, 2, 34, 28, 13, -27}, // 0x7C '|' + {5596, 11, 34, 28, 9, -27}, // 0x7D '}' + {5643, 20, 6, 28, 4, -15}}; // 0x7E '~' + +const GFXfont FreeMono24pt7b PROGMEM = {(uint8_t *)FreeMono24pt7bBitmaps, + (GFXglyph *)FreeMono24pt7bGlyphs, 0x20, + 0x7E, 47}; + +// Approx. 6330 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h new file mode 100644 index 0000000..a2e9a00 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h @@ -0,0 +1,178 @@ +#pragma once +#include + +const uint8_t FreeMono9pt7bBitmaps[] PROGMEM = { + 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4, + 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E, + 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8, + 0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8, + 0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10, + 0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, + 0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04, + 0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60, + 0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38, + 0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02, + 0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A, + 0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81, + 0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88, + 0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38, + 0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C, + 0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2, + 0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80, + 0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80, + 0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82, + 0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40, + 0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE, + 0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E, + 0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE, + 0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF, + 0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF, + 0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E, + 0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0, + 0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0, + 0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21, + 0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, + 0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91, + 0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49, + 0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, + 0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40, + 0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82, + 0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23, + 0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80, + 0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10, + 0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82, + 0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04, + 0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8, + 0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80, + 0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81, + 0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04, + 0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02, + 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0, + 0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80, + 0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12, + 0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10, + 0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81, + 0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D, + 0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50, + 0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10, + 0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01, + 0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21, + 0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48, + 0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23, + 0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31, + 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18, + 0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84, + 0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09, + 0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10, + 0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3, + 0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01, + 0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0, + 0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10, + 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49, + 0x2C, 0x61, 0x24, 0x30}; + +const GFXglyph FreeMono9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 11, 0, 1}, // 0x20 ' ' + {0, 2, 11, 11, 4, -10}, // 0x21 '!' + {3, 6, 5, 11, 2, -10}, // 0x22 '"' + {7, 7, 12, 11, 2, -10}, // 0x23 '#' + {18, 8, 12, 11, 1, -10}, // 0x24 '$' + {30, 7, 11, 11, 2, -10}, // 0x25 '%' + {40, 7, 10, 11, 2, -9}, // 0x26 '&' + {49, 3, 5, 11, 4, -10}, // 0x27 ''' + {51, 2, 13, 11, 5, -10}, // 0x28 '(' + {55, 2, 13, 11, 4, -10}, // 0x29 ')' + {59, 7, 7, 11, 2, -10}, // 0x2A '*' + {66, 7, 7, 11, 2, -8}, // 0x2B '+' + {73, 3, 5, 11, 2, -1}, // 0x2C ',' + {75, 9, 1, 11, 1, -5}, // 0x2D '-' + {77, 2, 2, 11, 4, -1}, // 0x2E '.' + {78, 7, 13, 11, 2, -11}, // 0x2F '/' + {90, 7, 11, 11, 2, -10}, // 0x30 '0' + {100, 5, 11, 11, 3, -10}, // 0x31 '1' + {107, 7, 11, 11, 2, -10}, // 0x32 '2' + {117, 8, 11, 11, 1, -10}, // 0x33 '3' + {128, 6, 11, 11, 3, -10}, // 0x34 '4' + {137, 7, 11, 11, 2, -10}, // 0x35 '5' + {147, 7, 11, 11, 2, -10}, // 0x36 '6' + {157, 7, 11, 11, 2, -10}, // 0x37 '7' + {167, 7, 11, 11, 2, -10}, // 0x38 '8' + {177, 7, 11, 11, 2, -10}, // 0x39 '9' + {187, 2, 8, 11, 4, -7}, // 0x3A ':' + {189, 3, 11, 11, 3, -7}, // 0x3B ';' + {194, 8, 8, 11, 1, -8}, // 0x3C '<' + {202, 9, 4, 11, 1, -6}, // 0x3D '=' + {207, 9, 8, 11, 1, -8}, // 0x3E '>' + {216, 7, 10, 11, 2, -9}, // 0x3F '?' + {225, 8, 12, 11, 2, -10}, // 0x40 '@' + {237, 11, 10, 11, 0, -9}, // 0x41 'A' + {251, 9, 10, 11, 1, -9}, // 0x42 'B' + {263, 9, 10, 11, 1, -9}, // 0x43 'C' + {275, 9, 10, 11, 1, -9}, // 0x44 'D' + {287, 9, 10, 11, 1, -9}, // 0x45 'E' + {299, 9, 10, 11, 1, -9}, // 0x46 'F' + {311, 10, 10, 11, 1, -9}, // 0x47 'G' + {324, 9, 10, 11, 1, -9}, // 0x48 'H' + {336, 5, 10, 11, 3, -9}, // 0x49 'I' + {343, 8, 10, 11, 2, -9}, // 0x4A 'J' + {353, 9, 10, 11, 1, -9}, // 0x4B 'K' + {365, 8, 10, 11, 2, -9}, // 0x4C 'L' + {375, 11, 10, 11, 0, -9}, // 0x4D 'M' + {389, 9, 10, 11, 1, -9}, // 0x4E 'N' + {401, 9, 10, 11, 1, -9}, // 0x4F 'O' + {413, 8, 10, 11, 1, -9}, // 0x50 'P' + {423, 9, 13, 11, 1, -9}, // 0x51 'Q' + {438, 9, 10, 11, 1, -9}, // 0x52 'R' + {450, 7, 10, 11, 2, -9}, // 0x53 'S' + {459, 9, 10, 11, 1, -9}, // 0x54 'T' + {471, 9, 10, 11, 1, -9}, // 0x55 'U' + {483, 11, 10, 11, 0, -9}, // 0x56 'V' + {497, 11, 10, 11, 0, -9}, // 0x57 'W' + {511, 9, 10, 11, 1, -9}, // 0x58 'X' + {523, 9, 10, 11, 1, -9}, // 0x59 'Y' + {535, 7, 10, 11, 2, -9}, // 0x5A 'Z' + {544, 2, 13, 11, 5, -10}, // 0x5B '[' + {548, 7, 13, 11, 2, -11}, // 0x5C '\' + {560, 2, 13, 11, 4, -10}, // 0x5D ']' + {564, 7, 5, 11, 2, -10}, // 0x5E '^' + {569, 11, 1, 11, 0, 2}, // 0x5F '_' + {571, 3, 3, 11, 3, -11}, // 0x60 '`' + {573, 9, 8, 11, 1, -7}, // 0x61 'a' + {582, 9, 11, 11, 1, -10}, // 0x62 'b' + {595, 7, 8, 11, 2, -7}, // 0x63 'c' + {602, 9, 11, 11, 1, -10}, // 0x64 'd' + {615, 8, 8, 11, 1, -7}, // 0x65 'e' + {623, 6, 11, 11, 3, -10}, // 0x66 'f' + {632, 9, 11, 11, 1, -7}, // 0x67 'g' + {645, 9, 11, 11, 1, -10}, // 0x68 'h' + {658, 7, 10, 11, 2, -9}, // 0x69 'i' + {667, 5, 13, 11, 3, -9}, // 0x6A 'j' + {676, 8, 11, 11, 2, -10}, // 0x6B 'k' + {687, 7, 11, 11, 2, -10}, // 0x6C 'l' + {697, 9, 8, 11, 1, -7}, // 0x6D 'm' + {706, 9, 8, 11, 1, -7}, // 0x6E 'n' + {715, 9, 8, 11, 1, -7}, // 0x6F 'o' + {724, 9, 11, 11, 1, -7}, // 0x70 'p' + {737, 9, 11, 11, 1, -7}, // 0x71 'q' + {750, 7, 8, 11, 3, -7}, // 0x72 'r' + {757, 7, 8, 11, 2, -7}, // 0x73 's' + {764, 8, 10, 11, 2, -9}, // 0x74 't' + {774, 8, 8, 11, 1, -7}, // 0x75 'u' + {782, 9, 8, 11, 1, -7}, // 0x76 'v' + {791, 9, 8, 11, 1, -7}, // 0x77 'w' + {800, 9, 8, 11, 1, -7}, // 0x78 'x' + {809, 9, 11, 11, 1, -7}, // 0x79 'y' + {822, 7, 8, 11, 2, -7}, // 0x7A 'z' + {829, 3, 13, 11, 4, -10}, // 0x7B '{' + {834, 1, 13, 11, 5, -10}, // 0x7C '|' + {836, 3, 13, 11, 4, -10}, // 0x7D '}' + {841, 7, 3, 11, 2, -6}}; // 0x7E '~' + +const GFXfont FreeMono9pt7b PROGMEM = {(uint8_t *)FreeMono9pt7bBitmaps, + (GFXglyph *)FreeMono9pt7bGlyphs, 0x20, + 0x7E, 18}; + +// Approx. 1516 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h new file mode 100644 index 0000000..a205386 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h @@ -0,0 +1,252 @@ +#pragma once +#include + +const uint8_t FreeMonoBold12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xF6, 0x66, 0x60, 0x6F, 0x60, 0xE7, 0xE7, 0x62, 0x42, + 0x42, 0x42, 0x42, 0x11, 0x87, 0x30, 0xC6, 0x18, 0xC3, 0x31, 0xFF, 0xFF, + 0xF9, 0x98, 0x33, 0x06, 0x60, 0xCC, 0x7F, 0xEF, 0xFC, 0x66, 0x0C, 0xC3, + 0x98, 0x63, 0x04, 0x40, 0x0C, 0x03, 0x00, 0xC0, 0xFE, 0x7F, 0x9C, 0x66, + 0x09, 0x80, 0x78, 0x0F, 0xE0, 0x7F, 0x03, 0xE0, 0xF8, 0x7F, 0xFB, 0xFC, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x38, 0x1F, 0x0C, 0x42, 0x10, 0xC4, 0x1F, + 0x03, 0x9C, 0x3C, 0x7F, 0x33, 0xE0, 0x8C, 0x21, 0x08, 0xC3, 0xE0, 0x70, + 0x3E, 0x1F, 0xC6, 0x61, 0x80, 0x70, 0x0C, 0x07, 0x83, 0xEE, 0xDF, 0xB3, + 0xCC, 0x73, 0xFE, 0x7F, 0x80, 0xFD, 0x24, 0x90, 0x39, 0xDC, 0xE6, 0x73, + 0x18, 0xC6, 0x31, 0x8C, 0x31, 0x8E, 0x31, 0xC4, 0xE7, 0x1C, 0xE3, 0x1C, + 0x63, 0x18, 0xC6, 0x31, 0x98, 0xCE, 0x67, 0x10, 0x0C, 0x03, 0x00, 0xC3, + 0xB7, 0xFF, 0xDF, 0xE1, 0xE0, 0xFC, 0x33, 0x0C, 0xC0, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x3B, 0x9C, 0xCE, 0x62, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x00, 0x40, 0x30, 0x1C, 0x07, 0x03, 0x80, 0xE0, 0x30, + 0x1C, 0x06, 0x03, 0x80, 0xC0, 0x70, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0x60, + 0x38, 0x0E, 0x01, 0x00, 0x1E, 0x0F, 0xC6, 0x1B, 0x87, 0xC0, 0xF0, 0x3C, + 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x87, 0x61, 0x8F, 0xC1, 0xE0, 0x1C, + 0x0F, 0x0F, 0xC3, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x1F, 0x1F, 0xEE, 0x1F, 0x83, 0xC0, + 0xC0, 0x70, 0x38, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE3, 0xF0, 0xFF, 0xFF, + 0xFC, 0x3F, 0x0F, 0xF1, 0x87, 0x00, 0x60, 0x0C, 0x03, 0x83, 0xE0, 0x7C, + 0x01, 0xC0, 0x0C, 0x01, 0x80, 0x3C, 0x0F, 0xFF, 0x9F, 0xC0, 0x07, 0x07, + 0x83, 0xC3, 0xE1, 0xB1, 0xD8, 0xCC, 0xC6, 0xE3, 0x7F, 0xFF, 0xE0, 0x61, + 0xF8, 0xFC, 0x7F, 0x9F, 0xE6, 0x01, 0x80, 0x60, 0x1F, 0x87, 0xF9, 0x86, + 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xC1, 0xBF, 0xE7, 0xE0, 0x07, 0xC7, 0xF3, + 0xC1, 0xC0, 0x60, 0x38, 0x0E, 0xF3, 0xFE, 0xF1, 0xF8, 0x3E, 0x0F, 0x83, + 0x71, 0xCF, 0xE1, 0xF0, 0xFF, 0xFF, 0xFC, 0x1F, 0x07, 0x01, 0x80, 0x60, + 0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x1E, + 0x1F, 0xEE, 0x1F, 0x03, 0xC0, 0xF0, 0x36, 0x19, 0xFE, 0x7F, 0xB8, 0x7C, + 0x0F, 0x03, 0xE1, 0xDF, 0xE3, 0xF0, 0x3E, 0x1F, 0xCE, 0x3B, 0x07, 0xC1, + 0xF0, 0x7E, 0x3D, 0xFF, 0x3D, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x3F, 0x8F, + 0x80, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x77, 0x70, 0x00, 0x00, 0x76, 0x6C, + 0xC8, 0x80, 0x00, 0x30, 0x0F, 0x03, 0xE0, 0xF8, 0x3E, 0x0F, 0x80, 0x3E, + 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x0F, 0x80, 0x3E, 0x00, 0xF8, + 0x03, 0xE0, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x0F, 0x00, 0x40, 0x00, 0x7C, + 0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x3C, 0x3C, 0x18, 0x08, 0x00, 0x07, + 0x03, 0x81, 0xC0, 0x1E, 0x07, 0xF1, 0xC7, 0x30, 0x6C, 0x0D, 0x87, 0xB3, + 0xF6, 0xE6, 0xD8, 0xDB, 0x1B, 0x73, 0x67, 0xFC, 0x7F, 0x80, 0x30, 0x03, + 0x00, 0x71, 0xC7, 0xF8, 0x7C, 0x00, 0x3F, 0x80, 0x7F, 0x80, 0x1F, 0x00, + 0x76, 0x00, 0xEE, 0x01, 0x8C, 0x07, 0x18, 0x0E, 0x38, 0x1F, 0xF0, 0x7F, + 0xF0, 0xC0, 0x61, 0x80, 0xCF, 0xC7, 0xFF, 0x8F, 0xC0, 0xFF, 0xC7, 0xFF, + 0x0C, 0x1C, 0x60, 0x63, 0x03, 0x18, 0x38, 0xFF, 0x87, 0xFE, 0x30, 0x39, + 0x80, 0xCC, 0x06, 0x60, 0x7F, 0xFF, 0x7F, 0xF0, 0x0F, 0xF3, 0xFF, 0x70, + 0x76, 0x03, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x60, + 0x37, 0x07, 0x3F, 0xF0, 0xFC, 0xFF, 0x0F, 0xFC, 0x60, 0xE6, 0x06, 0x60, + 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x76, 0x0E, 0xFF, + 0xCF, 0xF8, 0xFF, 0xF7, 0xFF, 0x8C, 0x0C, 0x60, 0x63, 0x1B, 0x18, 0xC0, + 0xFE, 0x07, 0xF0, 0x31, 0x81, 0x8C, 0xCC, 0x06, 0x60, 0x3F, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFF, 0xCC, 0x06, 0x60, 0x33, 0x19, 0x98, 0xC0, 0xFE, + 0x07, 0xF0, 0x31, 0x81, 0x8C, 0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80, + 0x0F, 0xF1, 0xFF, 0x9C, 0x1C, 0xC0, 0x6C, 0x03, 0x60, 0x03, 0x00, 0x18, + 0x7F, 0xC3, 0xFE, 0x01, 0xB8, 0x0C, 0xE0, 0xE3, 0xFF, 0x07, 0xE0, 0x7C, + 0xF9, 0xF3, 0xE3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0xFF, 0x0F, + 0xFC, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0xFC, 0xFF, 0xF3, 0xF0, + 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, + 0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xF0, 0x0F, 0xF8, 0x7F, 0xC0, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, 0x31, + 0xC3, 0x0F, 0xF8, 0x1F, 0x00, 0xFC, 0xFB, 0xF3, 0xE3, 0x0E, 0x0C, 0x70, + 0x33, 0x80, 0xFC, 0x03, 0xF0, 0x0F, 0xE0, 0x39, 0xC0, 0xC3, 0x03, 0x0E, + 0x0C, 0x18, 0xFC, 0x7F, 0xF0, 0xF0, 0xFF, 0x0F, 0xF0, 0x18, 0x01, 0x80, + 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, + 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9E, 0x1E, 0x7C, 0xF9, + 0xB3, 0xE6, 0xFD, 0x99, 0xF6, 0x67, 0x99, 0x8E, 0x66, 0x31, 0x98, 0x06, + 0xFC, 0xFF, 0xF3, 0xF0, 0xF1, 0xFF, 0xCF, 0xCF, 0x0C, 0x78, 0x63, 0xE3, + 0x1B, 0x18, 0xDC, 0xC6, 0x76, 0x31, 0xB1, 0x8F, 0x8C, 0x3C, 0x61, 0xE7, + 0xE7, 0x3F, 0x18, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03, + 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07, 0x60, 0x67, 0x0E, 0x3F, 0xC0, 0xF0, + 0xFF, 0x8F, 0xFE, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03, 0x30, 0x73, 0xFE, + 0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0x03, 0xFC, + 0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07, + 0x60, 0x67, 0x0E, 0x3F, 0xC1, 0xF0, 0x18, 0x33, 0xFF, 0x3F, 0xE0, 0xFF, + 0x83, 0xFF, 0x83, 0x07, 0x0C, 0x0C, 0x30, 0x30, 0xC1, 0xC3, 0xFE, 0x0F, + 0xF0, 0x31, 0xE0, 0xC3, 0x83, 0x07, 0x0C, 0x0C, 0xFE, 0x3F, 0xF8, 0x70, + 0x3F, 0xDF, 0xFE, 0x1F, 0x03, 0xC0, 0xF8, 0x07, 0xE0, 0x7E, 0x01, 0xF0, + 0x3C, 0x0F, 0x87, 0xFF, 0xBF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC6, 0x3C, 0x63, + 0xC6, 0x3C, 0x63, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x3F, 0xC3, 0xFC, 0xFF, 0xFF, 0xFF, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, + 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x63, 0x9C, 0x1F, 0xC0, 0xF0, + 0xFC, 0x3F, 0xFC, 0x3F, 0x30, 0x0C, 0x38, 0x1C, 0x18, 0x18, 0x1C, 0x38, + 0x1C, 0x38, 0x0E, 0x70, 0x0E, 0x70, 0x0F, 0x60, 0x07, 0xE0, 0x07, 0xE0, + 0x03, 0xC0, 0x03, 0xC0, 0xFC, 0xFF, 0xF3, 0xF6, 0x01, 0xDC, 0xC6, 0x77, + 0x99, 0xDE, 0x67, 0x79, 0x8D, 0xFE, 0x3F, 0xF8, 0xF3, 0xE3, 0xCF, 0x8F, + 0x3C, 0x38, 0x70, 0xE1, 0xC0, 0xF8, 0xFB, 0xE3, 0xE3, 0x86, 0x0F, 0x38, + 0x1F, 0xC0, 0x3E, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x77, 0x03, 0x8E, + 0x1E, 0x1C, 0xFC, 0xFF, 0xF3, 0xF0, 0xF9, 0xFF, 0x9F, 0x30, 0xC3, 0x9C, + 0x19, 0x81, 0xF8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x3F, 0xC3, 0xFC, 0xFF, 0xBF, 0xEC, 0x3B, 0x0C, 0xC6, 0x33, 0x80, 0xC0, + 0x60, 0x38, 0xCC, 0x36, 0x0F, 0x03, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C, + 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xFE, 0x40, 0x30, 0x0E, + 0x01, 0x80, 0x70, 0x0C, 0x03, 0x80, 0x60, 0x1C, 0x03, 0x00, 0xE0, 0x18, + 0x07, 0x00, 0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0C, 0x01, 0xFF, 0xC6, + 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1F, 0xFE, 0x04, 0x03, + 0x01, 0xE0, 0xFC, 0x7B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, + 0xCE, 0x73, 0x3F, 0x07, 0xF8, 0x00, 0xC0, 0x0C, 0x1F, 0xC7, 0xFC, 0x60, + 0xCC, 0x0C, 0xC1, 0xCF, 0xFF, 0x3F, 0xF0, 0xF0, 0x07, 0x80, 0x0C, 0x00, + 0x60, 0x03, 0x7C, 0x1F, 0xF8, 0xF1, 0xC7, 0x07, 0x30, 0x19, 0x80, 0xCC, + 0x06, 0x60, 0x73, 0xC7, 0x7F, 0xFB, 0xDF, 0x00, 0x1F, 0xB3, 0xFF, 0x70, + 0xFE, 0x07, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0x70, 0x77, 0xFF, 0x1F, + 0xC0, 0x01, 0xE0, 0x0F, 0x00, 0x18, 0x00, 0xC1, 0xF6, 0x3F, 0xF1, 0xC7, + 0x9C, 0x1C, 0xC0, 0x66, 0x03, 0x30, 0x19, 0x81, 0xC7, 0x1E, 0x3F, 0xFC, + 0x7D, 0xE0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, + 0x0E, 0x00, 0x70, 0x73, 0xFF, 0x1F, 0xC0, 0x07, 0xC3, 0xFC, 0x60, 0x0C, + 0x0F, 0xFD, 0xFF, 0x86, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, + 0x81, 0xFF, 0xBF, 0xF0, 0x1F, 0x79, 0xFF, 0xDC, 0x79, 0x81, 0xCC, 0x06, + 0x60, 0x33, 0x01, 0x9C, 0x1C, 0x71, 0xE1, 0xFF, 0x07, 0xD8, 0x00, 0xC0, + 0x06, 0x00, 0x70, 0x7F, 0x03, 0xF0, 0xF0, 0x03, 0xC0, 0x03, 0x00, 0x0C, + 0x00, 0x37, 0xC0, 0xFF, 0x83, 0xC7, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, + 0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF3, 0xFF, 0xCF, 0xC0, 0x06, 0x00, 0xC0, + 0x00, 0x3F, 0x07, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, + 0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x06, 0x06, 0x00, 0xFF, 0xFF, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0xFE, 0xFC, + 0xF0, 0x07, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x3F, 0x19, 0xF8, 0xDE, 0x07, + 0xE0, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x6F, 0x03, 0x1C, 0x78, 0xFF, 0xC7, + 0xE0, 0x7E, 0x0F, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF8, 0xFE, 0xF1, + 0xFF, 0xF1, 0xCE, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, + 0x8C, 0x63, 0x19, 0xF7, 0xBF, 0xEF, 0x78, 0x77, 0xC1, 0xFF, 0x83, 0xC7, + 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF1, + 0xFF, 0xC7, 0xC0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xC0, 0x3C, 0x03, + 0xC0, 0x3E, 0x07, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xF7, 0xE3, 0xFF, 0xC3, + 0xC3, 0x8E, 0x07, 0x30, 0x0C, 0xC0, 0x33, 0x00, 0xCE, 0x07, 0x3C, 0x38, + 0xFF, 0xC3, 0x7E, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x0F, 0xE0, 0x3F, 0x80, + 0x1F, 0xBC, 0xFF, 0xF7, 0x0F, 0x38, 0x1C, 0xC0, 0x33, 0x00, 0xCC, 0x03, + 0x38, 0x1C, 0x70, 0xF0, 0xFF, 0xC1, 0xFB, 0x00, 0x0C, 0x00, 0x30, 0x00, + 0xC0, 0x1F, 0xC0, 0x7F, 0x79, 0xE7, 0xFF, 0x1F, 0x31, 0xC0, 0x18, 0x01, + 0x80, 0x18, 0x01, 0x80, 0x18, 0x0F, 0xFC, 0xFF, 0xC0, 0x3F, 0x9F, 0xFE, + 0x1F, 0x82, 0xFE, 0x1F, 0xE0, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0xF0, 0x30, + 0x06, 0x00, 0xC0, 0x7F, 0xEF, 0xFC, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, + 0x00, 0xC0, 0x18, 0x71, 0xFE, 0x1F, 0x00, 0xF1, 0xF7, 0x8F, 0x8C, 0x0C, + 0x60, 0x63, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x38, 0xF0, 0xFF, 0xC3, + 0xEE, 0xFC, 0xFF, 0xF3, 0xF3, 0x87, 0x0E, 0x1C, 0x1C, 0x60, 0x73, 0x80, + 0xEC, 0x03, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xF8, 0x7F, 0xE1, + 0xF7, 0x39, 0x8C, 0xE6, 0x37, 0xB0, 0xFF, 0xC3, 0xFF, 0x07, 0xBC, 0x1C, + 0xF0, 0x73, 0x81, 0x86, 0x00, 0x7C, 0xF9, 0xF3, 0xE3, 0xCF, 0x07, 0xF8, + 0x0F, 0xC0, 0x1E, 0x00, 0xFC, 0x07, 0x38, 0x38, 0x73, 0xF3, 0xFF, 0xCF, + 0xC0, 0xF9, 0xFF, 0x9F, 0x70, 0xE3, 0x0C, 0x39, 0xC1, 0x98, 0x19, 0x81, + 0xF8, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0xFF, 0x0F, + 0xF0, 0x7F, 0xCF, 0xF9, 0x8E, 0x33, 0x80, 0x70, 0x1C, 0x07, 0x01, 0xC6, + 0x70, 0xFF, 0xFF, 0xFF, 0x80, 0x0E, 0x3C, 0x60, 0xC1, 0x83, 0x06, 0x0C, + 0x39, 0xE3, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x3C, 0x38, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0xE1, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x3C, + 0x79, 0x83, 0x06, 0x0C, 0x18, 0x31, 0xE3, 0x80, 0x3C, 0x37, 0xE7, 0x67, + 0xE6, 0x1C}; + +const GFXglyph FreeMonoBold12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 14, 0, 1}, // 0x20 ' ' + {0, 4, 15, 14, 5, -14}, // 0x21 '!' + {8, 8, 7, 14, 3, -13}, // 0x22 '"' + {15, 11, 18, 14, 2, -15}, // 0x23 '#' + {40, 10, 20, 14, 2, -16}, // 0x24 '$' + {65, 10, 15, 14, 2, -14}, // 0x25 '%' + {84, 10, 13, 14, 2, -12}, // 0x26 '&' + {101, 3, 7, 14, 5, -13}, // 0x27 ''' + {104, 5, 19, 14, 6, -14}, // 0x28 '(' + {116, 5, 19, 14, 3, -14}, // 0x29 ')' + {128, 10, 10, 14, 2, -14}, // 0x2A '*' + {141, 12, 13, 14, 1, -12}, // 0x2B '+' + {161, 5, 7, 14, 4, -2}, // 0x2C ',' + {166, 12, 2, 14, 1, -7}, // 0x2D '-' + {169, 3, 3, 14, 5, -2}, // 0x2E '.' + {171, 10, 20, 14, 2, -16}, // 0x2F '/' + {196, 10, 15, 14, 2, -14}, // 0x30 '0' + {215, 10, 15, 14, 2, -14}, // 0x31 '1' + {234, 10, 15, 14, 2, -14}, // 0x32 '2' + {253, 11, 15, 14, 1, -14}, // 0x33 '3' + {274, 9, 14, 14, 2, -13}, // 0x34 '4' + {290, 10, 15, 14, 2, -14}, // 0x35 '5' + {309, 10, 15, 14, 2, -14}, // 0x36 '6' + {328, 10, 15, 14, 2, -14}, // 0x37 '7' + {347, 10, 15, 14, 2, -14}, // 0x38 '8' + {366, 10, 15, 14, 3, -14}, // 0x39 '9' + {385, 3, 11, 14, 5, -10}, // 0x3A ':' + {390, 4, 15, 14, 4, -10}, // 0x3B ';' + {398, 12, 11, 14, 1, -11}, // 0x3C '<' + {415, 12, 7, 14, 1, -9}, // 0x3D '=' + {426, 12, 11, 14, 1, -11}, // 0x3E '>' + {443, 9, 14, 14, 3, -13}, // 0x3F '?' + {459, 11, 19, 14, 2, -14}, // 0x40 '@' + {486, 15, 14, 14, -1, -13}, // 0x41 'A' + {513, 13, 14, 14, 0, -13}, // 0x42 'B' + {536, 12, 14, 14, 1, -13}, // 0x43 'C' + {557, 12, 14, 14, 1, -13}, // 0x44 'D' + {578, 13, 14, 14, 0, -13}, // 0x45 'E' + {601, 13, 14, 14, 0, -13}, // 0x46 'F' + {624, 13, 14, 14, 1, -13}, // 0x47 'G' + {647, 14, 14, 14, 0, -13}, // 0x48 'H' + {672, 10, 14, 14, 2, -13}, // 0x49 'I' + {690, 13, 14, 14, 1, -13}, // 0x4A 'J' + {713, 14, 14, 14, 0, -13}, // 0x4B 'K' + {738, 12, 14, 14, 1, -13}, // 0x4C 'L' + {759, 14, 14, 14, 0, -13}, // 0x4D 'M' + {784, 13, 14, 14, 0, -13}, // 0x4E 'N' + {807, 12, 14, 14, 1, -13}, // 0x4F 'O' + {828, 12, 14, 14, 0, -13}, // 0x50 'P' + {849, 12, 17, 14, 1, -13}, // 0x51 'Q' + {875, 14, 14, 14, 0, -13}, // 0x52 'R' + {900, 10, 14, 14, 2, -13}, // 0x53 'S' + {918, 12, 14, 14, 1, -13}, // 0x54 'T' + {939, 12, 14, 14, 1, -13}, // 0x55 'U' + {960, 16, 14, 14, -1, -13}, // 0x56 'V' + {988, 14, 14, 14, 0, -13}, // 0x57 'W' + {1013, 14, 14, 14, 0, -13}, // 0x58 'X' + {1038, 12, 14, 14, 1, -13}, // 0x59 'Y' + {1059, 10, 14, 14, 2, -13}, // 0x5A 'Z' + {1077, 5, 19, 14, 6, -14}, // 0x5B '[' + {1089, 10, 20, 14, 2, -16}, // 0x5C '\' + {1114, 5, 19, 14, 3, -14}, // 0x5D ']' + {1126, 10, 8, 14, 2, -15}, // 0x5E '^' + {1136, 14, 2, 14, 0, 4}, // 0x5F '_' + {1140, 4, 4, 14, 4, -15}, // 0x60 '`' + {1142, 12, 11, 14, 1, -10}, // 0x61 'a' + {1159, 13, 15, 14, 0, -14}, // 0x62 'b' + {1184, 12, 11, 14, 1, -10}, // 0x63 'c' + {1201, 13, 15, 14, 1, -14}, // 0x64 'd' + {1226, 12, 11, 14, 1, -10}, // 0x65 'e' + {1243, 11, 15, 14, 2, -14}, // 0x66 'f' + {1264, 13, 16, 14, 1, -10}, // 0x67 'g' + {1290, 14, 15, 14, 0, -14}, // 0x68 'h' + {1317, 11, 14, 14, 1, -13}, // 0x69 'i' + {1337, 8, 19, 15, 3, -13}, // 0x6A 'j' + {1356, 13, 15, 14, 1, -14}, // 0x6B 'k' + {1381, 11, 15, 14, 1, -14}, // 0x6C 'l' + {1402, 15, 11, 14, 0, -10}, // 0x6D 'm' + {1423, 14, 11, 14, 0, -10}, // 0x6E 'n' + {1443, 12, 11, 14, 1, -10}, // 0x6F 'o' + {1460, 14, 16, 14, 0, -10}, // 0x70 'p' + {1488, 14, 16, 14, 0, -10}, // 0x71 'q' + {1516, 12, 11, 14, 1, -10}, // 0x72 'r' + {1533, 10, 11, 14, 2, -10}, // 0x73 's' + {1547, 11, 14, 14, 1, -13}, // 0x74 't' + {1567, 13, 11, 14, 0, -10}, // 0x75 'u' + {1585, 14, 11, 14, 0, -10}, // 0x76 'v' + {1605, 14, 11, 14, 0, -10}, // 0x77 'w' + {1625, 14, 11, 14, 0, -10}, // 0x78 'x' + {1645, 12, 16, 14, 1, -10}, // 0x79 'y' + {1669, 11, 11, 14, 1, -10}, // 0x7A 'z' + {1685, 7, 19, 14, 3, -14}, // 0x7B '{' + {1702, 2, 19, 14, 6, -14}, // 0x7C '|' + {1707, 7, 19, 14, 4, -14}, // 0x7D '}' + {1724, 12, 4, 14, 1, -7}}; // 0x7E '~' + +const GFXfont FreeMonoBold12pt7b PROGMEM = { + (uint8_t *)FreeMonoBold12pt7bBitmaps, (GFXglyph *)FreeMonoBold12pt7bGlyphs, + 0x20, 0x7E, 24}; + +// Approx. 2402 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h new file mode 100644 index 0000000..36664c1 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h @@ -0,0 +1,425 @@ +#pragma once +#include + +const uint8_t FreeMonoBold18pt7bBitmaps[] PROGMEM = { + 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9C, 0xE7, 0x39, 0xC4, 0x03, 0xBF, + 0xFF, 0xB8, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC1, 0x98, 0x33, + 0x06, 0x60, 0xCC, 0x18, 0x0E, 0x1C, 0x0F, 0x3C, 0x1F, 0x3C, 0x1E, 0x3C, + 0x1E, 0x3C, 0x1E, 0x78, 0x1E, 0x78, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x1E, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x7F, 0xFE, 0x7F, 0xFE, + 0x7F, 0xFE, 0x7F, 0xFE, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xF0, + 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x03, 0x00, 0x1E, 0x00, 0x78, 0x01, + 0xE0, 0x1F, 0xF1, 0xFF, 0xE7, 0xFF, 0xBE, 0x1E, 0xF0, 0x3B, 0xC0, 0xCF, + 0xE0, 0x3F, 0xF8, 0x7F, 0xF0, 0x7F, 0xE0, 0x1F, 0xF0, 0x0F, 0xE0, 0x3F, + 0x80, 0xFF, 0x87, 0xFF, 0xFE, 0xFF, 0xF3, 0x7F, 0x80, 0x78, 0x01, 0xE0, + 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xC0, 0x1E, 0x00, 0xFF, 0x03, 0x86, + 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x38, 0x70, 0x3F, 0xC2, 0x1E, 0x3E, + 0x03, 0xF8, 0x3F, 0x83, 0xF8, 0x0F, 0x8F, 0x18, 0x7F, 0x01, 0xC7, 0x03, + 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x1C, 0x70, 0x1F, 0xC0, 0x0F, 0x00, 0x03, + 0xD0, 0x1F, 0xF0, 0x7F, 0xE1, 0xFF, 0xC3, 0xE6, 0x07, 0x80, 0x0F, 0x00, + 0x0F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0xFE, 0x03, 0xFE, 0xFF, 0xBD, 0xFE, + 0x3F, 0xFC, 0x3F, 0x7C, 0x7C, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x7E, + 0xF0, 0xFF, 0xFF, 0xF6, 0x66, 0x66, 0x07, 0x0F, 0x1F, 0x1E, 0x3E, 0x3C, + 0x78, 0x78, 0x78, 0x70, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0x78, 0x78, 0x78, 0x3C, 0x3C, 0x1E, 0x1F, 0x0F, 0x07, 0xE0, 0xF0, 0xF8, + 0x78, 0x7C, 0x3C, 0x3E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x3C, 0x3C, 0x78, 0xF8, 0xF0, 0xE0, + 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0xFE, 0x1F, 0xF8, 0x07, 0xE0, 0x0F, 0xF0, 0x1F, 0xF8, + 0x1E, 0x78, 0x1C, 0x38, 0x18, 0x18, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x3E, 0x78, 0xF3, 0xC7, + 0x8E, 0x1C, 0x70, 0xE1, 0x80, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF, + 0x3F, 0xFF, 0xE0, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x0E, 0x00, 0x3C, 0x00, + 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0, + 0x01, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03, + 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80, + 0x1E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, 0x03, 0x00, 0x00, + 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x3F, 0xFC, 0x7C, 0x3E, 0x78, 0x1E, + 0xF8, 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, + 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x1F, 0x78, 0x1E, + 0x7C, 0x3E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x07, 0xC0, + 0x1F, 0x80, 0xFF, 0x03, 0xFE, 0x0F, 0xBC, 0x0C, 0x78, 0x00, 0xF0, 0x01, + 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x81, 0xFF, 0xFB, 0xFF, 0xF7, + 0xFF, 0xE7, 0xFF, 0x80, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xFF, 0xEF, + 0x87, 0xDE, 0x07, 0xF8, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, + 0x78, 0x03, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x0F, 0xC0, 0x7F, 0xF0, 0xFF, 0xF8, 0xFF, 0xFC, 0x70, 0x3E, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3C, 0x03, 0xFC, 0x03, 0xF0, 0x03, 0xF0, + 0x03, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, + 0xE0, 0x3F, 0xFF, 0xFE, 0xFF, 0xFC, 0x7F, 0xF8, 0x1F, 0xE0, 0x00, 0xF8, + 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xC0, 0x77, 0x80, 0xEF, 0x03, 0x9E, 0x0F, + 0x3C, 0x1C, 0x78, 0x70, 0xF1, 0xE1, 0xE3, 0x83, 0xCF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x07, 0xFC, 0x0F, 0xF8, 0x1F, 0xF0, + 0x1F, 0xC0, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xC0, + 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x7B, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF, 0x0F, + 0xFF, 0xC3, 0x83, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, + 0x00, 0x0F, 0xB8, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xC3, 0xFF, 0xC0, 0x7F, + 0x80, 0x00, 0xFC, 0x07, 0xFC, 0x3F, 0xF8, 0xFF, 0xF1, 0xF8, 0x07, 0xC0, + 0x1F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE7, 0xC3, 0xDF, 0xC7, 0x7F, 0xCF, + 0xFF, 0xDF, 0x8F, 0xFC, 0x07, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3D, 0xE0, + 0xFB, 0xFF, 0xE3, 0xFF, 0xC3, 0xFF, 0x01, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1E, + 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, + 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38, + 0x00, 0x70, 0x00, 0x07, 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0x83, + 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1E, 0xF0, 0x78, 0xFF, 0xE0, + 0xFF, 0x81, 0xFF, 0x0F, 0xFF, 0x9E, 0x0F, 0x78, 0x0F, 0xF0, 0x1F, 0xE0, + 0x3F, 0xE0, 0xFB, 0xFF, 0xE7, 0xFF, 0xC7, 0xFF, 0x03, 0xF8, 0x00, 0x0F, + 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0xC3, 0xDF, 0x03, 0xBC, 0x07, + 0xF8, 0x0F, 0xF0, 0x1F, 0xF0, 0x3D, 0xF1, 0xFB, 0xFF, 0xF3, 0xFE, 0xE3, + 0xFB, 0xC3, 0xE7, 0x80, 0x1E, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xE7, 0xFF, + 0x8F, 0xFE, 0x1F, 0xF0, 0x1F, 0x80, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00, + 0x00, 0x00, 0xEF, 0xFF, 0xEE, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF3, 0xC7, 0x8E, 0x3C, 0x70, 0xE1, 0x87, 0x0C, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, + 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7C, 0x00, + 0x07, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xFF, + 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, + 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x3F, 0x80, + 0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x03, 0x80, + 0x00, 0x1F, 0xC0, 0xFF, 0xE3, 0xFF, 0xF7, 0xFF, 0xEF, 0x07, 0xFE, 0x03, + 0xDC, 0x07, 0x80, 0x0F, 0x00, 0x7C, 0x03, 0xF8, 0x1F, 0xC0, 0x1E, 0x00, + 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3E, + 0x00, 0x7C, 0x00, 0x70, 0x00, 0x07, 0xE0, 0x1F, 0xE0, 0x7F, 0xE1, 0xE1, + 0xC7, 0x83, 0xCE, 0x03, 0xBC, 0x07, 0x70, 0x0E, 0xE0, 0x7D, 0xC3, 0xFB, + 0x8F, 0xF7, 0x3C, 0xEE, 0x71, 0xDC, 0xE3, 0xB9, 0xC7, 0x73, 0xCE, 0xE3, + 0xFF, 0xC3, 0xFF, 0x83, 0xFF, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x02, + 0x1E, 0x1E, 0x3F, 0xFC, 0x1F, 0xF0, 0x1F, 0x80, 0x0F, 0xF8, 0x00, 0x7F, + 0xF0, 0x01, 0xFF, 0xC0, 0x03, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xF8, + 0x00, 0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x1E, 0x00, + 0x78, 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x01, 0xFF, + 0xFE, 0x07, 0xFF, 0xF8, 0x3C, 0x00, 0xF3, 0xFC, 0x1F, 0xEF, 0xF8, 0x7F, + 0xFF, 0xE1, 0xFF, 0x7F, 0x03, 0xF8, 0x7F, 0xFC, 0x0F, 0xFF, 0xF0, 0xFF, + 0xFF, 0x8F, 0xFF, 0xF8, 0x3C, 0x07, 0xC3, 0xC0, 0x3C, 0x3C, 0x03, 0xC3, + 0xC0, 0x7C, 0x3F, 0xFF, 0x83, 0xFF, 0xF0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE, + 0x3C, 0x03, 0xE3, 0xC0, 0x1F, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x01, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFC, 0x7F, 0xFF, 0x00, 0x01, + 0xF8, 0xC1, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0xFF, 0xF7, 0xE0, 0x7E, 0xF8, + 0x07, 0xFE, 0x00, 0x7F, 0x80, 0x0E, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, + 0x07, 0x7F, 0x03, 0xE7, 0xFF, 0xFC, 0x7F, 0xFF, 0x03, 0xFF, 0xC0, 0x1F, + 0xE0, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC, 0x78, 0x1F, + 0x9E, 0x03, 0xE7, 0x80, 0x79, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7, + 0x80, 0x3D, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7, 0x80, 0x7D, 0xE0, + 0x1E, 0x78, 0x1F, 0xBF, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0xF0, 0x7F, 0xF0, + 0x00, 0x7F, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xE3, 0xC0, + 0x3C, 0x78, 0x07, 0x8F, 0x1C, 0xF1, 0xE3, 0xCC, 0x3F, 0xF8, 0x07, 0xFF, + 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xF1, 0x8F, 0x0C, + 0x79, 0xE0, 0x0F, 0x3C, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF3, 0xC0, 0x1E, 0x78, 0x63, 0xCF, 0x1E, 0x79, 0xE3, 0xC6, 0x3F, 0xF8, + 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xE0, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0x80, + 0x7F, 0xF0, 0x07, 0xFC, 0x00, 0x01, 0xFC, 0xE0, 0x7F, 0xFE, 0x1F, 0xFF, + 0xE3, 0xFF, 0xFE, 0x7F, 0x03, 0xE7, 0xC0, 0x1E, 0xF8, 0x00, 0xEF, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x03, 0xFE, 0xF0, + 0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x3F, 0xF7, 0x80, 0x1E, 0x7E, 0x01, 0xE3, + 0xFF, 0xFE, 0x1F, 0xFF, 0xE0, 0xFF, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x0F, + 0xE3, 0xFC, 0x7F, 0x9F, 0xE3, 0xFC, 0x7F, 0x1F, 0xC1, 0xE0, 0x3C, 0x0F, + 0x01, 0xE0, 0x78, 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xFF, 0xFE, + 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0x01, 0xE0, 0x78, + 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC3, 0xFC, 0x7F, 0xBF, 0xE3, 0xFF, + 0xFF, 0x1F, 0xF7, 0xF0, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, + 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, + 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x38, 0x07, 0x8F, + 0x00, 0xF1, 0xE0, 0x1E, 0x3C, 0x03, 0xC7, 0x80, 0xF8, 0xF8, 0x3F, 0x1F, + 0xFF, 0xC3, 0xFF, 0xF0, 0x1F, 0xFC, 0x00, 0x7E, 0x00, 0xFF, 0x0F, 0xCF, + 0xF9, 0xFE, 0xFF, 0x9F, 0xEF, 0xF8, 0xFC, 0x3C, 0x1F, 0x03, 0xC3, 0xE0, + 0x3C, 0x7C, 0x03, 0xCF, 0x80, 0x3D, 0xF0, 0x03, 0xFE, 0x00, 0x3F, 0xF8, + 0x03, 0xFF, 0x80, 0x3E, 0x7C, 0x03, 0xC3, 0xE0, 0x3C, 0x1E, 0x03, 0xC0, + 0xF0, 0x3C, 0x0F, 0x0F, 0xF8, 0x7E, 0xFF, 0x87, 0xFF, 0xF8, 0x7F, 0x7F, + 0x03, 0xE0, 0xFF, 0xC0, 0x3F, 0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0x1E, + 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, + 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x01, 0x87, 0x80, 0xF1, 0xE0, 0x3C, + 0x78, 0x0F, 0x1E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0xFC, 0x01, 0xF9, 0xFC, 0x07, 0xF3, 0xF8, + 0x0F, 0xE3, 0xF8, 0x3F, 0x87, 0xF0, 0x7F, 0x0F, 0xF1, 0xFE, 0x1F, 0xE3, + 0xFC, 0x3D, 0xE7, 0x78, 0x7B, 0xDE, 0xF0, 0xF7, 0xBD, 0xE1, 0xE7, 0xF3, + 0xC3, 0xCF, 0xE7, 0x87, 0x8F, 0x8F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x3C, + 0x3C, 0x00, 0x79, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xF7, + 0xF0, 0x1F, 0xC0, 0xFC, 0x1F, 0xEF, 0xE1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, + 0xFF, 0x3F, 0x83, 0xC3, 0xF8, 0x3C, 0x3F, 0xC3, 0xC3, 0xFC, 0x3C, 0x3D, + 0xE3, 0xC3, 0xDE, 0x3C, 0x3C, 0xF3, 0xC3, 0xC7, 0xBC, 0x3C, 0x7B, 0xC3, + 0xC3, 0xFC, 0x3C, 0x3F, 0xC3, 0xC1, 0xFC, 0x3C, 0x1F, 0xCF, 0xF8, 0xFC, + 0xFF, 0x87, 0xCF, 0xF8, 0x7C, 0x7F, 0x03, 0xC0, 0x01, 0xF8, 0x00, 0x7F, + 0xE0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xC0, 0x3E, 0x78, + 0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, + 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F, 0x78, 0x01, 0xE7, 0xC0, 0x3E, + 0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x1F, 0xFF, 0x00, 0x7F, 0xE0, 0x01, 0xF8, + 0x00, 0x7F, 0xF8, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3C, 0x0F, + 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0xCF, 0x03, 0xF3, + 0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0xFE, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x3C, 0x00, 0x3F, 0xF8, 0x0F, 0xFE, 0x03, 0xFF, 0x80, 0x7F, 0xC0, + 0x00, 0x01, 0xF8, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F, + 0x0F, 0xC7, 0xC0, 0x3E, 0x78, 0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF, + 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F, + 0x78, 0x01, 0xE7, 0xC0, 0x3E, 0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF, + 0x00, 0x7F, 0xE0, 0x03, 0xF8, 0x00, 0x3F, 0x8E, 0x07, 0xFF, 0xF0, 0xFF, + 0xFF, 0x0F, 0xFF, 0xE0, 0x60, 0x78, 0x7F, 0xF8, 0x07, 0xFF, 0xF0, 0x3F, + 0xFF, 0xE0, 0xFF, 0xFF, 0x01, 0xE0, 0x7C, 0x0F, 0x01, 0xE0, 0x78, 0x0F, + 0x03, 0xC0, 0x78, 0x1E, 0x0F, 0xC0, 0xFF, 0xFC, 0x07, 0xFF, 0xC0, 0x3F, + 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0x0F, 0x80, 0x78, 0x3C, 0x03, 0xC0, 0xF0, + 0x1E, 0x07, 0xC3, 0xFE, 0x1F, 0xBF, 0xF0, 0x7F, 0xFF, 0x83, 0xF7, 0xF8, + 0x0F, 0x00, 0x07, 0xE7, 0x07, 0xFF, 0x8F, 0xFF, 0xC7, 0xFF, 0xE7, 0xC1, + 0xF3, 0xC0, 0x79, 0xE0, 0x3C, 0xF8, 0x00, 0x7F, 0x80, 0x1F, 0xFC, 0x07, + 0xFF, 0x81, 0xFF, 0xE0, 0x0F, 0xFB, 0x00, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, + 0xFC, 0x1F, 0xFF, 0xFF, 0xBF, 0xFF, 0x8D, 0xFF, 0x80, 0x3F, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0xE1, + 0xE3, 0xFC, 0x3C, 0x7F, 0x87, 0x8F, 0x60, 0xF0, 0xC0, 0x1E, 0x00, 0x03, + 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, + 0x80, 0x00, 0xF0, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0x7F, + 0xE0, 0xFF, 0x0F, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFE, 0xFF, 0x1F, 0xF3, + 0xC0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, + 0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, + 0x00, 0xF0, 0xF0, 0x07, 0x87, 0xC0, 0x7C, 0x1F, 0x07, 0xC0, 0xFF, 0xFE, + 0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x03, 0xFD, + 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFB, 0xF8, 0x1F, 0xE1, 0xC0, 0x07, 0x03, + 0xC0, 0x1E, 0x07, 0x80, 0x3C, 0x07, 0x80, 0xF0, 0x0F, 0x01, 0xE0, 0x0F, + 0x03, 0x80, 0x1E, 0x0F, 0x00, 0x3E, 0x1E, 0x00, 0x3C, 0x78, 0x00, 0x78, + 0xF0, 0x00, 0x7B, 0xC0, 0x00, 0xF7, 0x80, 0x01, 0xFF, 0x00, 0x01, 0xFC, + 0x00, 0x03, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0x0F, + 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFE, 0x0F, 0xF7, 0x80, 0x0F, 0x3C, + 0x38, 0x78, 0xE3, 0xE3, 0x87, 0x1F, 0x1C, 0x38, 0xF8, 0xE1, 0xEF, 0xE7, + 0x0F, 0x7F, 0x78, 0x7B, 0xBB, 0xC3, 0xFD, 0xFE, 0x0F, 0xEF, 0xF0, 0x7E, + 0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x07, 0xC1, 0xF0, + 0x3E, 0x0F, 0x81, 0xF0, 0x7C, 0x00, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC, + 0x7F, 0xBF, 0x07, 0xE1, 0xE0, 0xF8, 0x3E, 0x3E, 0x03, 0xEF, 0x80, 0x3D, + 0xE0, 0x03, 0xF8, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x3F, + 0x80, 0x0F, 0x78, 0x03, 0xC7, 0x80, 0xF8, 0x78, 0x3E, 0x0F, 0x8F, 0xE3, + 0xFF, 0xFC, 0x7F, 0xFF, 0x8F, 0xF7, 0xE0, 0xFC, 0x7E, 0x07, 0xEF, 0xF0, + 0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x1E, 0x07, 0x81, 0xF0, 0xF8, 0x0F, + 0x0F, 0x00, 0x79, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xF8, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07, 0xFE, + 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3C, 0xF0, + 0x78, 0xF0, 0xF0, 0x70, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0x80, 0x07, + 0x00, 0x0F, 0x00, 0x1E, 0x0E, 0x1C, 0x0F, 0x38, 0x0F, 0x78, 0x0F, 0x7F, + 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFE, 0xE0, 0x01, + 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0E, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, + 0x00, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, + 0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, + 0x38, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x07, 0x00, 0x1F, 0x00, + 0x7F, 0x00, 0xFE, 0x03, 0xDE, 0x0F, 0x1E, 0x3E, 0x3E, 0xF8, 0x3F, 0xE0, + 0x3F, 0x80, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xC3, 0x87, 0x0E, 0x1C, 0x30, 0x01, 0xFC, 0x01, 0xFF, 0xC0, + 0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x00, 0x78, 0x0F, 0xFF, 0x07, 0xFF, 0xE1, + 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x80, 0xF3, 0xC0, 0x1E, 0x78, 0x0F, 0xCF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0x7F, 0x3E, 0x7C, 0x00, 0x1F, + 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, + 0x3F, 0x01, 0xFF, 0xF8, 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0xFC, 0x1F, 0x1F, + 0x01, 0xF3, 0xC0, 0x1E, 0x78, 0x03, 0xCF, 0x00, 0x79, 0xE0, 0x0F, 0x3E, + 0x03, 0xE7, 0xE0, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFF, 0xF0, 0xF9, + 0xF8, 0x00, 0x03, 0xF3, 0x87, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0, + 0xFF, 0xC0, 0x3F, 0xC0, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3E, + 0x00, 0x4F, 0x80, 0xF7, 0xFF, 0xF9, 0xFF, 0xF8, 0x7F, 0xF8, 0x0F, 0xF0, + 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x03, 0xF3, 0xC0, 0xFF, 0xBC, 0x1F, 0xFF, 0xC3, 0xFF, + 0xFC, 0x7E, 0x0F, 0xC7, 0x80, 0x7C, 0xF0, 0x03, 0xCF, 0x00, 0x3C, 0xF0, + 0x03, 0xCF, 0x00, 0x3C, 0xF8, 0x07, 0xC7, 0xE0, 0xFC, 0x7F, 0xFF, 0xF3, + 0xFF, 0xFF, 0x0F, 0xFF, 0xF0, 0x3F, 0x3E, 0x03, 0xF0, 0x03, 0xFF, 0x01, + 0xFF, 0xE0, 0xFF, 0xFC, 0x7E, 0x0F, 0x9E, 0x01, 0xEF, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x7F, 0xFF, + 0xCF, 0xFF, 0xF1, 0xFF, 0xF8, 0x0F, 0xF0, 0x03, 0xFC, 0x07, 0xFF, 0x0F, + 0xFF, 0x1F, 0xFF, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, + 0xFC, 0xFF, 0xF8, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, + 0xF8, 0xFF, 0xF8, 0x07, 0xE7, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0xFF, + 0xF7, 0xC1, 0xF9, 0xF0, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xF0, 0x07, + 0x9E, 0x00, 0xF3, 0xE0, 0x3E, 0x3E, 0x0F, 0xC7, 0xFF, 0xF8, 0x7F, 0xFF, + 0x07, 0xFD, 0xE0, 0x3F, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E, + 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFC, 0x00, 0xFE, 0x00, 0x3E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0x78, 0xF8, 0x03, 0xDF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, + 0x07, 0xE1, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x78, + 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x1F, 0xC1, 0xFD, + 0xFE, 0x0F, 0xFF, 0xF0, 0x7F, 0xBF, 0x01, 0xF8, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, + 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0xFE, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, + 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, + 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xFF, 0xFE, 0xFF, 0xEF, 0xFC, 0x7F, 0x00, + 0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x0F, + 0x00, 0x03, 0xC7, 0xF0, 0xF3, 0xFC, 0x3C, 0xFF, 0x0F, 0x3F, 0x83, 0xDF, + 0x00, 0xFF, 0x80, 0x3F, 0xC0, 0x0F, 0xE0, 0x03, 0xFC, 0x00, 0xF7, 0x80, + 0x3C, 0xF0, 0x0F, 0x1F, 0x0F, 0xC3, 0xFB, 0xF1, 0xFF, 0xFC, 0x7F, 0xDF, + 0x0F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0x3D, 0xE3, + 0xC1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xFE, 0x3E, 0x3C, 0x78, + 0xF0, 0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0x3C, 0x3C, 0x78, 0xF0, + 0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0xFE, 0x3E, 0x7F, 0xF8, 0xF9, + 0xFF, 0xE3, 0xE7, 0xDF, 0x0F, 0x1E, 0x1E, 0x7C, 0x03, 0xEF, 0xF0, 0x3F, + 0xFF, 0x83, 0xFF, 0xFC, 0x1F, 0x87, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, + 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, + 0x7F, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x03, 0xF8, + 0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC7, 0xE0, 0xFD, 0xF0, 0x07, + 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xE0, 0x0F, + 0xBF, 0x07, 0xE3, 0xFF, 0xF8, 0x3F, 0xFE, 0x03, 0xFF, 0x80, 0x1F, 0xC0, + 0x3E, 0x7E, 0x03, 0xF7, 0xFC, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC1, 0xF8, + 0x3F, 0x0F, 0x80, 0x7C, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, + 0xF0, 0x03, 0xC7, 0xC0, 0x3E, 0x3F, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xFF, + 0xE0, 0x7B, 0xFE, 0x03, 0xCF, 0xC0, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, + 0x80, 0x00, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFE, 0x00, + 0x00, 0x03, 0xF3, 0xE0, 0x7F, 0xDF, 0x87, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7, + 0xE0, 0xFC, 0x7C, 0x03, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03, + 0xC7, 0x80, 0x1E, 0x3E, 0x01, 0xF0, 0xFC, 0x1F, 0x83, 0xFF, 0xFC, 0x1F, + 0xFF, 0xE0, 0x3F, 0xEF, 0x00, 0x7E, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, + 0x3F, 0xC0, 0x7E, 0x1E, 0x7F, 0x3F, 0xFF, 0xBF, 0xFF, 0xFF, 0xF1, 0xFE, + 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, + 0x80, 0x03, 0xC0, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xFF, 0xE1, 0xFF, 0xE0, + 0x07, 0xE6, 0x1F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x78, 0x1E, 0x78, 0x0E, + 0x7F, 0xE0, 0x3F, 0xFC, 0x03, 0xFE, 0x60, 0x1F, 0xE0, 0x0F, 0xF8, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFC, 0x07, 0xE0, 0x0C, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0xFF, 0xF3, 0xFF, 0xF9, 0xFF, + 0xFC, 0xFF, 0xFC, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x07, 0x8F, 0xFF, 0xC3, 0xFF, + 0xC1, 0xFF, 0xC0, 0x3F, 0x80, 0xFC, 0x1F, 0xBF, 0x0F, 0xEF, 0xC3, 0xFB, + 0xF0, 0xFE, 0x3C, 0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF0, 0x1E, 0x3C, + 0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF8, 0x7E, 0x3F, 0xFF, 0xC7, 0xFF, + 0xF0, 0xFF, 0x7C, 0x0F, 0x9E, 0x7F, 0x07, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, + 0xFE, 0xFE, 0x0F, 0xE1, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x1E, 0x01, + 0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x3E, 0x78, 0x00, 0xF7, 0x80, 0x07, 0xFC, + 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7E, + 0x03, 0xF7, 0xF8, 0x3F, 0xFF, 0xC1, 0xFE, 0xFC, 0x07, 0xF3, 0xC7, 0x0F, + 0x1E, 0x7C, 0xF0, 0x73, 0xE7, 0x83, 0x9F, 0x7C, 0x1F, 0xFF, 0xC0, 0xFF, + 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFC, 0xF8, 0x07, 0xC7, 0xC0, + 0x1E, 0x3E, 0x00, 0xE0, 0xE0, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC, 0x7F, + 0xBF, 0x07, 0xE1, 0xF1, 0xF0, 0x1F, 0xFC, 0x01, 0xFF, 0x00, 0x1F, 0xC0, + 0x07, 0xF8, 0x01, 0xFF, 0xC0, 0x7E, 0xFC, 0x1F, 0x8F, 0xC7, 0xE0, 0xFD, + 0xFE, 0x3F, 0xFF, 0xC7, 0xFF, 0xF0, 0x7F, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, + 0xFC, 0x7F, 0xBF, 0x07, 0xE3, 0xC0, 0x78, 0x3C, 0x0E, 0x07, 0x83, 0xC0, + 0x78, 0x70, 0x0F, 0x1E, 0x00, 0xE3, 0x80, 0x1E, 0xF0, 0x01, 0xDC, 0x00, + 0x3F, 0x80, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, + 0x38, 0x00, 0x0F, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x1F, + 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF9, 0xC7, + 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x1E, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x81, 0xF0, 0xFC, 0x7E, 0x1F, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xF8, 0xFC, 0x3E, 0x0F, + 0x83, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xF0, 0x7E, + 0x0F, 0xC3, 0xF0, 0x38, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, 0x3E, 0x0F, 0xC1, 0xF8, 0x3E, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x7C, 0x0F, 0xC1, 0xF0, + 0x7C, 0x3F, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x83, 0xE1, 0xF8, + 0xFC, 0x3F, 0x07, 0x00, 0x1E, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xDF, 0xFC, + 0xFF, 0x3F, 0xFB, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0x78}; + +const GFXglyph FreeMonoBold18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 21, 0, 1}, // 0x20 ' ' + {0, 5, 22, 21, 8, -21}, // 0x21 '!' + {14, 11, 10, 21, 5, -20}, // 0x22 '"' + {28, 16, 25, 21, 3, -22}, // 0x23 '#' + {78, 14, 28, 21, 4, -23}, // 0x24 '$' + {127, 15, 21, 21, 3, -20}, // 0x25 '%' + {167, 15, 20, 21, 3, -19}, // 0x26 '&' + {205, 4, 10, 21, 8, -20}, // 0x27 ''' + {210, 8, 27, 21, 9, -21}, // 0x28 '(' + {237, 8, 27, 21, 4, -21}, // 0x29 ')' + {264, 16, 15, 21, 3, -21}, // 0x2A '*' + {294, 16, 19, 21, 3, -18}, // 0x2B '+' + {332, 7, 10, 21, 5, -3}, // 0x2C ',' + {341, 19, 4, 21, 1, -11}, // 0x2D '-' + {351, 5, 5, 21, 8, -4}, // 0x2E '.' + {355, 15, 28, 21, 3, -23}, // 0x2F '/' + {408, 16, 23, 21, 3, -22}, // 0x30 '0' + {454, 15, 22, 21, 3, -21}, // 0x31 '1' + {496, 15, 23, 21, 3, -22}, // 0x32 '2' + {540, 16, 23, 21, 3, -22}, // 0x33 '3' + {586, 15, 21, 21, 3, -20}, // 0x34 '4' + {626, 17, 22, 21, 2, -21}, // 0x35 '5' + {673, 15, 23, 21, 4, -22}, // 0x36 '6' + {717, 15, 22, 21, 3, -21}, // 0x37 '7' + {759, 15, 23, 21, 3, -22}, // 0x38 '8' + {803, 15, 23, 21, 4, -22}, // 0x39 '9' + {847, 5, 16, 21, 8, -15}, // 0x3A ':' + {857, 7, 22, 21, 5, -15}, // 0x3B ';' + {877, 18, 16, 21, 1, -17}, // 0x3C '<' + {913, 19, 10, 21, 1, -14}, // 0x3D '=' + {937, 18, 16, 21, 2, -17}, // 0x3E '>' + {973, 15, 21, 21, 4, -20}, // 0x3F '?' + {1013, 15, 27, 21, 3, -21}, // 0x40 '@' + {1064, 22, 21, 21, -1, -20}, // 0x41 'A' + {1122, 20, 21, 21, 1, -20}, // 0x42 'B' + {1175, 19, 21, 21, 1, -20}, // 0x43 'C' + {1225, 18, 21, 21, 2, -20}, // 0x44 'D' + {1273, 19, 21, 21, 1, -20}, // 0x45 'E' + {1323, 19, 21, 21, 1, -20}, // 0x46 'F' + {1373, 20, 21, 21, 1, -20}, // 0x47 'G' + {1426, 21, 21, 21, 0, -20}, // 0x48 'H' + {1482, 14, 21, 21, 4, -20}, // 0x49 'I' + {1519, 19, 21, 21, 2, -20}, // 0x4A 'J' + {1569, 20, 21, 21, 1, -20}, // 0x4B 'K' + {1622, 18, 21, 21, 2, -20}, // 0x4C 'L' + {1670, 23, 21, 21, -1, -20}, // 0x4D 'M' + {1731, 20, 21, 21, 1, -20}, // 0x4E 'N' + {1784, 20, 21, 21, 1, -20}, // 0x4F 'O' + {1837, 18, 21, 21, 1, -20}, // 0x50 'P' + {1885, 20, 26, 21, 1, -20}, // 0x51 'Q' + {1950, 21, 21, 21, 0, -20}, // 0x52 'R' + {2006, 17, 21, 21, 2, -20}, // 0x53 'S' + {2051, 19, 21, 21, 1, -20}, // 0x54 'T' + {2101, 21, 21, 21, 0, -20}, // 0x55 'U' + {2157, 23, 21, 21, -1, -20}, // 0x56 'V' + {2218, 21, 21, 21, 0, -20}, // 0x57 'W' + {2274, 19, 21, 21, 1, -20}, // 0x58 'X' + {2324, 20, 21, 21, 1, -20}, // 0x59 'Y' + {2377, 16, 21, 21, 3, -20}, // 0x5A 'Z' + {2419, 8, 27, 21, 9, -21}, // 0x5B '[' + {2446, 15, 28, 21, 3, -23}, // 0x5C '\' + {2499, 8, 27, 21, 4, -21}, // 0x5D ']' + {2526, 15, 11, 21, 3, -21}, // 0x5E '^' + {2547, 21, 4, 21, 0, 4}, // 0x5F '_' + {2558, 6, 6, 21, 6, -22}, // 0x60 '`' + {2563, 19, 16, 21, 1, -15}, // 0x61 'a' + {2601, 19, 22, 21, 1, -21}, // 0x62 'b' + {2654, 17, 16, 21, 2, -15}, // 0x63 'c' + {2688, 20, 22, 21, 1, -21}, // 0x64 'd' + {2743, 18, 16, 21, 1, -15}, // 0x65 'e' + {2779, 16, 22, 21, 4, -21}, // 0x66 'f' + {2823, 19, 23, 21, 1, -15}, // 0x67 'g' + {2878, 21, 22, 21, 0, -21}, // 0x68 'h' + {2936, 16, 22, 21, 3, -21}, // 0x69 'i' + {2980, 12, 29, 21, 5, -21}, // 0x6A 'j' + {3024, 18, 22, 21, 2, -21}, // 0x6B 'k' + {3074, 16, 22, 21, 3, -21}, // 0x6C 'l' + {3118, 22, 16, 21, -1, -15}, // 0x6D 'm' + {3162, 20, 16, 21, 0, -15}, // 0x6E 'n' + {3202, 19, 16, 21, 1, -15}, // 0x6F 'o' + {3240, 21, 23, 21, 0, -15}, // 0x70 'p' + {3301, 21, 23, 22, 1, -15}, // 0x71 'q' + {3362, 17, 16, 21, 3, -15}, // 0x72 'r' + {3396, 16, 16, 21, 3, -15}, // 0x73 's' + {3428, 17, 21, 21, 1, -20}, // 0x74 't' + {3473, 18, 16, 21, 1, -15}, // 0x75 'u' + {3509, 21, 16, 21, 0, -15}, // 0x76 'v' + {3551, 21, 16, 21, 0, -15}, // 0x77 'w' + {3593, 19, 16, 21, 1, -15}, // 0x78 'x' + {3631, 19, 23, 21, 1, -15}, // 0x79 'y' + {3686, 14, 16, 21, 3, -15}, // 0x7A 'z' + {3714, 10, 27, 21, 6, -21}, // 0x7B '{' + {3748, 4, 27, 21, 9, -21}, // 0x7C '|' + {3762, 10, 27, 21, 6, -21}, // 0x7D '}' + {3796, 17, 8, 21, 2, -13}}; // 0x7E '~' + +const GFXfont FreeMonoBold18pt7b PROGMEM = { + (uint8_t *)FreeMonoBold18pt7bBitmaps, (GFXglyph *)FreeMonoBold18pt7bGlyphs, + 0x20, 0x7E, 35}; + +// Approx. 4485 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h new file mode 100644 index 0000000..eb79d6e --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h @@ -0,0 +1,674 @@ +#pragma once +#include + +const uint8_t FreeMonoBold24pt7bBitmaps[] PROGMEM = { + 0x38, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF3, 0xE7, 0xCF, + 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE3, 0x82, 0x00, 0x00, 0x00, 0x71, 0xF7, + 0xFF, 0xEF, 0x9E, 0x00, 0xFC, 0x7E, 0xF8, 0x7D, 0xF0, 0xFB, 0xE1, 0xF7, + 0xC3, 0xEF, 0x87, 0xDF, 0x0F, 0xBE, 0x1F, 0x38, 0x1C, 0x70, 0x38, 0xE0, + 0x71, 0xC0, 0xE3, 0x81, 0xC7, 0x03, 0x80, 0x01, 0xC1, 0xC0, 0x0F, 0x8F, + 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F, 0x8F, 0x80, + 0x7E, 0x3E, 0x01, 0xF0, 0xF8, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x03, 0xFF, + 0xFF, 0x9F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, + 0x81, 0xF1, 0xF0, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x00, 0x7C, 0x7C, 0x1F, + 0xFF, 0xFC, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x9F, 0xFF, + 0xFC, 0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, + 0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F, + 0x8F, 0x80, 0x3C, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x1F, 0xFF, 0x07, 0xFF, 0xF1, 0xFF, 0xFE, + 0x7F, 0xFF, 0xDF, 0xC1, 0xFB, 0xF0, 0x1F, 0x7C, 0x01, 0xEF, 0x80, 0x39, + 0xF8, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x03, 0xFF, 0xF0, + 0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, + 0x80, 0x1F, 0xF8, 0x07, 0xFF, 0x81, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, + 0xFF, 0xF1, 0xDF, 0xFC, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, + 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x01, 0xC0, 0x00, + 0x0F, 0x80, 0x00, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0xF0, 0xE0, 0x0F, 0x07, + 0x80, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xF0, 0x78, 0x03, + 0xC3, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC1, 0xF0, 0xF8, 0x7F, 0x00, 0x3F, + 0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x07, 0xE0, 0xF8, 0x38, + 0x1F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0x1E, 0x00, 0xF0, 0x78, 0x07, 0x01, + 0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0F, 0x07, 0x80, 0x38, 0x78, 0x01, + 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0xFC, + 0x01, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xC7, 0x00, 0x7C, + 0x10, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xC7, 0xCF, 0xFF, + 0x3F, 0x7E, 0xFF, 0xFF, 0xE7, 0xFF, 0xBE, 0x1F, 0xF9, 0xF0, 0x7F, 0x8F, + 0x83, 0xFC, 0x7C, 0x0F, 0xE3, 0xF0, 0x7F, 0xCF, 0xFF, 0xFF, 0x7F, 0xFF, + 0xF9, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x0F, 0xE0, 0x00, 0xFD, 0xF7, 0xDF, + 0x7D, 0xF7, 0xDF, 0x38, 0xE3, 0x8E, 0x38, 0xE0, 0x01, 0x80, 0xF0, 0x7C, + 0x3F, 0x0F, 0xC7, 0xE1, 0xF8, 0xFC, 0x3E, 0x0F, 0x87, 0xC1, 0xF0, 0x7C, + 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, + 0x81, 0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0xF8, 0x3E, 0x0F, 0xC1, 0xF0, 0x7E, + 0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x03, 0xC0, 0x60, 0x3C, 0x0F, 0x83, 0xF0, + 0xFC, 0x1F, 0x83, 0xE0, 0xFC, 0x1F, 0x07, 0xC1, 0xF8, 0x3E, 0x0F, 0x83, + 0xE0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, + 0x1E, 0x0F, 0x83, 0xE0, 0xF8, 0x7C, 0x1F, 0x0F, 0xC3, 0xE1, 0xF8, 0x7C, + 0x3F, 0x0F, 0x83, 0xE0, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00, + 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x10, 0x7C, 0x11, 0xF3, 0xE7, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x87, 0xFF, 0xF0, 0x07, + 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, + 0x1F, 0x8F, 0xC0, 0xF8, 0x3E, 0x03, 0x80, 0xE0, 0x00, 0x38, 0x00, 0x00, + 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, + 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, + 0x01, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, + 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, + 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x70, 0x00, 0x1F, + 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C, 0x1C, + 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF, 0x80, + 0x00, 0x00, 0x60, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, + 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00, + 0x1F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, + 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, + 0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE, + 0x1F, 0x83, 0xF1, 0xF8, 0x0F, 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF7, 0xC0, + 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, + 0xE0, 0x03, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFF, 0xC0, 0x07, 0xFE, 0x00, + 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7D, 0xF0, 0x07, 0xCF, + 0x80, 0x3E, 0x7E, 0x03, 0xF1, 0xF8, 0x3F, 0x0F, 0xFF, 0xF8, 0x3F, 0xFF, + 0x80, 0xFF, 0xF8, 0x03, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, + 0x3F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xEF, 0x80, + 0xFC, 0xF8, 0x07, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, + 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x3F, 0xFF, 0xE7, + 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x01, 0xFC, + 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, 0x3F, + 0x03, 0xFB, 0xF0, 0x07, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFB, 0x80, 0x07, + 0xC0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF8, 0x00, + 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00, + 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, + 0x0E, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, + 0xE0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFE, 0x7E, 0x03, 0xF1, 0xC0, 0x0F, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x0F, + 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, + 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x01, 0xFF, 0xC0, + 0x3F, 0xBF, 0xFF, 0xFD, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, + 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x07, + 0xF8, 0x00, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xEF, 0x80, 0x3E, 0xF8, 0x03, + 0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x80, 0xF0, 0xF8, 0x1F, 0x0F, 0x81, + 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xC0, 0xF8, 0x78, 0x0F, 0x8F, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, + 0x80, 0x07, 0xFE, 0x00, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07, + 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC3, + 0xFF, 0xFC, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, + 0x01, 0xF0, 0x00, 0x0F, 0xBF, 0x00, 0x7F, 0xFF, 0x03, 0xFF, 0xFC, 0x1F, + 0xFF, 0xF0, 0xFF, 0xFF, 0x83, 0xC0, 0xFE, 0x00, 0x01, 0xF0, 0x00, 0x0F, + 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, + 0x03, 0xE0, 0x00, 0x3F, 0xF0, 0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xFF, 0xF9, + 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0x1F, 0xF0, 0x00, 0x00, + 0x1F, 0xC0, 0x0F, 0xFF, 0x01, 0xFF, 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xE1, + 0xFF, 0x00, 0x1F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, + 0x7C, 0x00, 0x0F, 0x8F, 0xC0, 0xF9, 0xFF, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, + 0xCF, 0xFF, 0xFC, 0xFF, 0x0F, 0xEF, 0xE0, 0x3E, 0xFC, 0x03, 0xFF, 0x80, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3F, 0x7E, + 0x03, 0xF3, 0xF0, 0x7E, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF, 0x80, + 0x7F, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xF0, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, + 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, + 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x06, 0x00, 0x01, 0xF8, 0x00, 0xFF, + 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7, 0xE0, 0x7E, 0xFC, + 0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7, + 0xC0, 0x3E, 0x7E, 0x07, 0xE3, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, + 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xC0, 0x3E, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xF7, 0xE0, + 0x7E, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x03, + 0xFC, 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xF8, + 0x7F, 0xFF, 0xC7, 0xE0, 0xFE, 0xFC, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x3F, 0xFC, 0x07, 0xF7, 0xE0, + 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0x9F, 0x03, + 0xF1, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, + 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x0F, 0xF0, 0x7F, 0xFE, 0x0F, 0xFF, 0xC0, + 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, + 0xEF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, + 0xFF, 0xFF, 0xEF, 0x80, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0x1F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x0F, 0x03, 0xC1, 0xE0, 0x78, 0x1C, + 0x07, 0x01, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x7F, + 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, + 0x01, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x01, 0xFF, 0x80, + 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1E, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, + 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x7F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xF0, 0x01, + 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xF0, + 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x01, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xC0, 0x7E, 0xF8, 0x03, 0xFF, 0x80, 0x1F, + 0x70, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x3F, + 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, + 0x3F, 0x80, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0x80, 0x3F, 0xF8, + 0x0F, 0xFF, 0x83, 0xE0, 0xF8, 0x78, 0x07, 0x1E, 0x00, 0xF3, 0x80, 0x0E, + 0x70, 0x01, 0xDE, 0x00, 0x3B, 0x80, 0x3F, 0x70, 0x1F, 0xEE, 0x07, 0xFD, + 0xC1, 0xFF, 0xB8, 0x7E, 0x77, 0x0F, 0x0E, 0xE3, 0xC1, 0xDC, 0x70, 0x3B, + 0x8E, 0x07, 0x71, 0xC0, 0xEE, 0x3C, 0x1D, 0xC3, 0xC3, 0xB8, 0x7F, 0xF7, + 0x07, 0xFF, 0xE0, 0x7F, 0xFC, 0x03, 0xFB, 0xC0, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x61, 0xF0, 0x3E, 0x1F, 0xFF, 0xC3, + 0xFF, 0xF0, 0x1F, 0xFC, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x7F, + 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x7F, 0xFE, + 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x0F, 0xBE, 0x00, + 0x00, 0x7D, 0xF8, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x3E, 0x3E, 0x00, 0x03, + 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF0, 0x3F, 0x00, 0x0F, 0x80, + 0xF8, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8, + 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x00, 0xF8, 0x00, 0xF8, 0x0F, + 0x80, 0x03, 0xE1, 0xFF, 0x80, 0xFF, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, + 0x7F, 0xFF, 0xFF, 0x83, 0xFF, 0xDF, 0xF8, 0x0F, 0xFC, 0x7F, 0xFF, 0xC0, + 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, + 0xFE, 0x07, 0xC0, 0x1F, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, + 0x00, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, + 0xFC, 0x1F, 0x00, 0x3F, 0x87, 0xC0, 0x03, 0xF1, 0xF0, 0x00, 0x7C, 0x7C, + 0x00, 0x1F, 0x1F, 0x00, 0x07, 0xC7, 0xC0, 0x03, 0xF7, 0xFF, 0xFF, 0xFB, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xE7, 0x01, 0xFF, 0xFF, 0xC1, 0xFF, + 0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFE, 0x07, 0xF8, 0xFC, 0x01, 0xFC, 0xFC, + 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x0F, 0xBE, 0x00, 0x03, 0x9F, + 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x1F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x39, 0xFC, 0x00, + 0x7C, 0x7F, 0x80, 0xFF, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x81, 0xFF, + 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, + 0xF0, 0x0F, 0xF0, 0xF8, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F, + 0x1F, 0x00, 0x0F, 0xCF, 0x80, 0x03, 0xE7, 0xC0, 0x01, 0xF3, 0xE0, 0x00, + 0xF9, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x3E, 0x00, + 0x0F, 0x9F, 0x00, 0x07, 0xCF, 0x80, 0x07, 0xE7, 0xC0, 0x03, 0xE3, 0xE0, + 0x03, 0xF1, 0xF0, 0x07, 0xF1, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, + 0x7F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, + 0xF0, 0xF8, 0x00, 0xF8, 0x7C, 0x00, 0x7C, 0x3E, 0x0E, 0x3E, 0x1F, 0x0F, + 0x9F, 0x0F, 0x87, 0xC7, 0x07, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, + 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x1F, + 0x0F, 0x80, 0x0F, 0x87, 0xC3, 0x87, 0xC1, 0xC3, 0xE3, 0xE0, 0x01, 0xF1, + 0xF0, 0x00, 0xF8, 0xF8, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, + 0xFF, 0xF8, 0xF8, 0x00, 0x7C, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F, 0x1F, + 0x07, 0x0F, 0x8F, 0x87, 0xC3, 0x87, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01, + 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, + 0x1F, 0x0F, 0x80, 0x0F, 0x87, 0xC0, 0x07, 0xC3, 0xE0, 0x03, 0xE0, 0xE0, + 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, + 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, + 0x7F, 0x8E, 0x00, 0xFF, 0xF7, 0x81, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE1, + 0xFF, 0xFF, 0xF1, 0xFE, 0x03, 0xF8, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0x3E, + 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x07, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x0F, + 0xFE, 0xF8, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0xC0, 0x01, 0xF3, 0xF0, 0x00, 0xF9, 0xFC, 0x00, 0x7C, 0x7F, + 0x80, 0xFE, 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xE1, 0xFF, 0x1F, 0xFC, 0xFF, + 0xE7, 0xFF, 0x3F, 0xF9, 0xFF, 0xCF, 0xFE, 0x3F, 0xE1, 0xFF, 0x07, 0xC0, + 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, + 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, + 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0x00, + 0x3E, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, + 0x00, 0x3E, 0x07, 0xC0, 0x0F, 0x87, 0xFE, 0x1F, 0xFB, 0xFF, 0xCF, 0xFF, + 0xFF, 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xF7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFC, 0x03, 0xE0, + 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x1F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, + 0xE0, 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x07, + 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x07, 0xC0, 0xE0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, + 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x1F, 0x83, + 0xF8, 0x3F, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, + 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xE0, 0xFF, 0x9F, 0xFE, + 0x3F, 0xFB, 0xFF, 0xC7, 0xFF, 0x7F, 0xF8, 0xFF, 0xE7, 0xFE, 0x0F, 0xF8, + 0x3E, 0x01, 0xF8, 0x07, 0xC0, 0xFE, 0x00, 0xF8, 0x3F, 0x80, 0x1F, 0x0F, + 0xE0, 0x03, 0xE3, 0xF8, 0x00, 0x7D, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x01, + 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0xFE, 0x7F, + 0x00, 0x1F, 0x87, 0xF0, 0x03, 0xE0, 0x7E, 0x00, 0x7C, 0x07, 0xE0, 0x0F, + 0x80, 0x7E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0xF8, 0x1F, + 0xF7, 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFD, 0xFF, + 0x80, 0x7F, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x0F, 0x80, 0x0E, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07, 0xC1, + 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00, 0x7D, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0xFF, 0xFF, 0xE0, 0x3F, 0x80, 0x03, 0xF8, 0xFF, 0x80, 0x0F, 0xF9, + 0xFF, 0x00, 0x1F, 0xF3, 0xFF, 0x00, 0x7F, 0xE3, 0xFE, 0x00, 0xFF, 0x83, + 0xFE, 0x03, 0xFE, 0x07, 0xFC, 0x07, 0xFC, 0x0F, 0xFC, 0x1F, 0xF8, 0x1F, + 0xF8, 0x3F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0x7D, 0xF1, 0xF7, 0xC0, 0xFB, + 0xE3, 0xEF, 0x81, 0xF7, 0xEF, 0xDF, 0x03, 0xE7, 0xDF, 0x3E, 0x07, 0xCF, + 0xFE, 0x7C, 0x0F, 0x8F, 0xF8, 0xF8, 0x1F, 0x1F, 0xF1, 0xF0, 0x3E, 0x1F, + 0xE3, 0xE0, 0x7C, 0x3F, 0x87, 0xC0, 0xF8, 0x3F, 0x0F, 0x81, 0xF0, 0x00, + 0x1F, 0x03, 0xE0, 0x00, 0x3E, 0x1F, 0xF8, 0x03, 0xFF, 0x7F, 0xF8, 0x0F, + 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFD, 0xFF, 0x80, 0x3F, + 0xF0, 0x7F, 0x00, 0x7F, 0xEF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, + 0xFC, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1, 0xFF, 0x00, 0xF8, 0x1F, 0xF0, + 0x0F, 0x81, 0xFF, 0x80, 0xF8, 0x1F, 0xFC, 0x0F, 0x81, 0xFF, 0xC0, 0xF8, + 0x1F, 0x7E, 0x0F, 0x81, 0xF3, 0xF0, 0xF8, 0x1F, 0x3F, 0x0F, 0x81, 0xF1, + 0xF8, 0xF8, 0x1F, 0x0F, 0xCF, 0x81, 0xF0, 0xFC, 0xF8, 0x1F, 0x07, 0xEF, + 0x81, 0xF0, 0x3F, 0xF8, 0x1F, 0x03, 0xFF, 0x81, 0xF0, 0x1F, 0xF8, 0x1F, + 0x00, 0xFF, 0x81, 0xF0, 0x0F, 0xF8, 0x7F, 0xE0, 0x7F, 0x8F, 0xFF, 0x03, + 0xF8, 0xFF, 0xF0, 0x3F, 0x8F, 0xFF, 0x01, 0xF8, 0x7F, 0xE0, 0x0F, 0x80, + 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, + 0xFE, 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1, + 0xF8, 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE, + 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00, + 0x7F, 0xF0, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xE7, 0xE0, 0x00, 0xFC, 0x7E, + 0x00, 0x3F, 0x0F, 0xE0, 0x0F, 0xE0, 0xFF, 0x07, 0xF8, 0x0F, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x03, + 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xFC, 0x7F, 0xFF, 0xFE, 0x1F, 0x00, 0xFE, 0x1F, 0x00, 0x3F, 0x1F, + 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, + 0x00, 0x3F, 0x1F, 0x00, 0x7E, 0x1F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0xFF, + 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1, 0xF8, + 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00, 0x1F, + 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE, 0x00, + 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFD, + 0xF0, 0x00, 0x1F, 0x3F, 0x00, 0x07, 0xE7, 0xF0, 0x01, 0xF8, 0x7F, 0x00, + 0x7F, 0x07, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x03, 0xFF, 0x87, 0x80, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x07, + 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x0F, 0x01, 0xF8, 0x00, 0x7F, 0xFF, + 0x80, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, + 0x7F, 0xFF, 0xFE, 0x00, 0xF8, 0x07, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0xF8, + 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x3F, + 0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xC0, 0x0F, + 0xFF, 0xF0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xF8, 0x3F, + 0x80, 0x0F, 0x81, 0xFC, 0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0x80, 0x7E, 0x00, + 0xF8, 0x03, 0xF0, 0x7F, 0xF0, 0x1F, 0xEF, 0xFF, 0x81, 0xFF, 0xFF, 0xF8, + 0x0F, 0xFF, 0xFF, 0x80, 0x7F, 0x7F, 0xF0, 0x07, 0xE0, 0x01, 0xFC, 0x70, + 0x1F, 0xFD, 0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFC, + 0x0F, 0xE7, 0xE0, 0x1F, 0x9F, 0x00, 0x3E, 0x7C, 0x00, 0xF9, 0xF0, 0x01, + 0xC7, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xE0, 0x00, + 0x0F, 0xDC, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0xC0, 0x0F, + 0xFF, 0xC0, 0xFE, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x1C, + 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xF0, 0x7F, + 0xE0, 0xF8, 0x3F, 0xF0, 0x7C, 0x1F, 0xF8, 0x3E, 0x0F, 0xFC, 0x1F, 0x07, + 0xFE, 0x0F, 0x83, 0xEE, 0x07, 0xC0, 0xE0, 0x03, 0xE0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, + 0xF0, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x03, + 0xFF, 0xF8, 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, + 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1, + 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, + 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, + 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, + 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, + 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x80, 0x1F, 0x80, 0xF8, 0x01, 0xF0, 0x0F, + 0xE0, 0x7F, 0x00, 0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, + 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x1F, 0xFB, + 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0x7F, + 0xE0, 0x1F, 0xF8, 0x7C, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x7C, 0x03, 0xE0, + 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, + 0xF8, 0x00, 0xF8, 0x07, 0xC0, 0x03, 0xF0, 0x1F, 0x00, 0x07, 0xC0, 0xF8, + 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0xF8, 0x7C, 0x00, + 0x03, 0xF3, 0xF0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x1F, 0xBE, 0x00, 0x00, + 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x07, + 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, + 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE3, 0xE0, 0x00, 0x3C, 0x3E, + 0x0F, 0x83, 0xC3, 0xE1, 0xF8, 0x3C, 0x3E, 0x1F, 0x87, 0xC3, 0xE1, 0xFC, + 0x7C, 0x3E, 0x3F, 0xC7, 0xC1, 0xE3, 0xFC, 0x7C, 0x1F, 0x3F, 0xE7, 0xC1, + 0xF7, 0xFE, 0x78, 0x1F, 0x7F, 0xE7, 0x81, 0xF7, 0x9F, 0xF8, 0x1F, 0xF9, + 0xFF, 0x81, 0xFF, 0x9F, 0xF8, 0x0F, 0xF9, 0xFF, 0x80, 0xFF, 0x0F, 0xF8, + 0x0F, 0xF0, 0xFF, 0x80, 0xFF, 0x0F, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFE, + 0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x3F, + 0x00, 0x7F, 0x80, 0xFF, 0x3F, 0xF0, 0x7F, 0xEF, 0xFC, 0x1F, 0xFB, 0xFF, + 0x07, 0xFE, 0x7F, 0x80, 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xFC, 0x0F, 0x80, + 0x1F, 0x87, 0xC0, 0x03, 0xF3, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x1F, 0xFC, + 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, + 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFC, 0xF8, 0x00, + 0x7E, 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x1F, + 0x07, 0xFC, 0x0F, 0xFB, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF8, + 0x7F, 0xF7, 0xFC, 0x0F, 0xF8, 0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF, + 0xFC, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0x80, 0x7F, 0x87, 0xE0, 0x1F, + 0x80, 0xFC, 0x07, 0xC0, 0x1F, 0x03, 0xE0, 0x03, 0xE1, 0xF8, 0x00, 0xFC, + 0x7C, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00, + 0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xE0, 0x03, + 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x7F, 0xFF, 0xF3, + 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x3E, 0x03, + 0xF1, 0xF0, 0x1F, 0x8F, 0x81, 0xF8, 0x7C, 0x1F, 0x83, 0xE1, 0xF8, 0x0E, + 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, + 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x70, 0x7E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E, + 0x01, 0xF7, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xBF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBE, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, + 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, + 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, + 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x60, 0x00, 0x0F, 0x00, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, + 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, + 0x00, 0x1F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x07, + 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, + 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, + 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, + 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0xC0, 0x00, 0x40, 0x00, 0x06, 0x00, 0x00, 0xF0, + 0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x00, 0xFF, + 0xF8, 0x1F, 0x9F, 0x83, 0xF0, 0xFC, 0x7E, 0x07, 0xEF, 0xC0, 0x3F, 0xF8, + 0x01, 0xFF, 0x80, 0x0F, 0x70, 0x00, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xE0, 0x78, 0x3E, 0x0F, 0xC3, 0xF0, 0x7C, 0x1E, 0x06, 0x01, 0xFF, + 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF, + 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x01, 0xFF, + 0xF8, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, + 0xF8, 0x7F, 0x00, 0xF8, 0xFC, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x03, + 0xF8, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, + 0xFF, 0x1F, 0xFE, 0xFE, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xE0, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x0F, + 0xE0, 0x03, 0xEF, 0xFF, 0x00, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0xF8, 0x3F, 0xE0, 0x7F, 0x07, 0xF0, 0x03, 0xF0, 0xFC, 0x00, + 0x3E, 0x1F, 0x80, 0x07, 0xE3, 0xE0, 0x00, 0x7C, 0x7C, 0x00, 0x0F, 0x8F, + 0x80, 0x01, 0xF1, 0xF0, 0x00, 0x3E, 0x3E, 0x00, 0x07, 0xC7, 0xE0, 0x01, + 0xF8, 0xFC, 0x00, 0x3E, 0x1F, 0xC0, 0x0F, 0xCF, 0xFE, 0x07, 0xF3, 0xFF, + 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE0, 0xFE, 0x7F, 0xF0, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFF, 0x18, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0x81, 0xFC, 0x7E, 0x00, + 0x7C, 0x7C, 0x00, 0x7C, 0xFC, 0x00, 0x3C, 0xF8, 0x00, 0x38, 0xF8, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7C, 0x00, 0x06, 0x7E, 0x00, 0x1F, 0x7F, 0x80, 0x7F, 0x3F, 0xFF, + 0xFF, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x00, 0xFF, + 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0xF8, 0x00, 0xFE, 0x3E, 0x00, 0xFF, 0xEF, 0x80, 0xFF, 0xFF, + 0xE0, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFE, 0x1F, 0xE0, 0xFF, 0x87, 0xE0, + 0x0F, 0xE1, 0xF0, 0x01, 0xF8, 0xFC, 0x00, 0x7E, 0x3E, 0x00, 0x0F, 0x8F, + 0x80, 0x03, 0xE3, 0xE0, 0x00, 0xF8, 0xF8, 0x00, 0x3E, 0x3E, 0x00, 0x0F, + 0x8F, 0xC0, 0x07, 0xE1, 0xF0, 0x01, 0xF8, 0x7E, 0x00, 0xFE, 0x0F, 0xE0, + 0x7F, 0xE3, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, + 0xFF, 0xEF, 0xE0, 0x0F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x7F, 0x81, 0xFC, + 0x7E, 0x00, 0x7E, 0xFC, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x80, 0x7E, + 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, + 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, + 0xFF, 0xFF, 0x07, 0xFF, 0xF8, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0, + 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, + 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, + 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, + 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x01, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0xE1, 0xFF, + 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xFF, 0xBF, 0x83, 0xFF, 0xFF, 0xE3, + 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFB, 0xFC, 0x3F, 0xF9, 0xF8, 0x07, 0xF0, + 0xF8, 0x01, 0xF8, 0xFC, 0x00, 0xFC, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F, + 0x1F, 0x00, 0x0F, 0x8F, 0x80, 0x07, 0xC7, 0xC0, 0x03, 0xE3, 0xF0, 0x03, + 0xF0, 0xF8, 0x01, 0xF8, 0x7E, 0x01, 0xFC, 0x3F, 0xC3, 0xFE, 0x0F, 0xFF, + 0xFF, 0x03, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F, 0xFB, 0xE0, 0x07, + 0xF1, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFE, 0x00, + 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFE, 0x00, + 0x0F, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x0F, 0xC0, 0x07, 0xCF, 0xFC, 0x01, + 0xF7, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x07, 0xFC, 0x1F, + 0x81, 0xFC, 0x03, 0xE0, 0x7E, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, 0xC0, + 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, + 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, + 0x1F, 0xF0, 0x3F, 0xEF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, + 0xFF, 0xDF, 0xF0, 0x3F, 0xE0, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, + 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, + 0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7F, 0xFF, 0xF7, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x7C, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, + 0xFF, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, + 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0xBF, 0xFF, 0xBF, 0xFF, + 0x9F, 0xFF, 0xCF, 0xFF, 0x83, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80, + 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, + 0x87, 0xFC, 0x07, 0xC7, 0xFF, 0x03, 0xE3, 0xFF, 0x81, 0xF1, 0xFF, 0xC0, + 0xF8, 0x7F, 0xC0, 0x7C, 0xFE, 0x00, 0x3E, 0xFE, 0x00, 0x1F, 0xFE, 0x00, + 0x0F, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0xE0, + 0x00, 0xFF, 0xF8, 0x00, 0x7C, 0xFE, 0x00, 0x3E, 0x3F, 0x80, 0x1F, 0x0F, + 0xE0, 0x3F, 0x81, 0xFF, 0xBF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, + 0x7F, 0xFB, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, + 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x03, 0xFF, + 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xF8, + 0x00, 0x3C, 0x1F, 0x00, 0xFD, 0xFC, 0xFF, 0x07, 0xFF, 0xFF, 0xFE, 0x1F, + 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0xF0, 0xFF, 0x1F, 0x87, 0xC1, 0xF8, + 0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, + 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, + 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, + 0x1F, 0x07, 0xC1, 0xF1, 0xFE, 0x1F, 0x87, 0xEF, 0xFC, 0x7F, 0x1F, 0xFF, + 0xF1, 0xFC, 0x7F, 0xFF, 0xC7, 0xF1, 0xFD, 0xFE, 0x1F, 0x87, 0xE0, 0x00, + 0x1F, 0x80, 0x1F, 0x9F, 0xF8, 0x1F, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0x87, + 0xFF, 0xFF, 0xC1, 0xFF, 0x07, 0xF0, 0x7F, 0x01, 0xF8, 0x3F, 0x00, 0x7C, + 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07, + 0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00, + 0x7C, 0x1F, 0x00, 0x3E, 0x3F, 0xE0, 0x7F, 0xBF, 0xF8, 0x7F, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFE, 0x1F, 0xFB, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x01, + 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xC1, + 0xFE, 0x0F, 0xF1, 0xFC, 0x01, 0xFC, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x1F, + 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x7E, 0xF8, 0x00, 0x7E, 0x7F, 0x00, + 0x7F, 0x1F, 0xC0, 0xFF, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x80, 0x7F, + 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x03, + 0xF9, 0xFF, 0xC0, 0x7F, 0xBF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, + 0xFF, 0xC3, 0xFF, 0x83, 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0xFC, 0x00, 0x7E, + 0x0F, 0xC0, 0x03, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, + 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x3F, 0x0F, 0xC0, 0x03, + 0xF0, 0xFE, 0x00, 0x7E, 0x0F, 0xF8, 0x1F, 0xE0, 0xFF, 0xFF, 0xFC, 0x0F, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0x0F, 0x9F, 0xFC, 0x00, 0xF8, 0x7F, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xFC, + 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0x3F, 0xF9, 0xFC, 0x0F, 0xFF, 0xDF, 0xE1, 0xFF, 0xFF, 0xFE, 0x3F, + 0xFF, 0xFF, 0xE3, 0xF8, 0x1F, 0xFC, 0x7F, 0x00, 0x7F, 0x07, 0xC0, 0x03, + 0xF0, 0xFC, 0x00, 0x3F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, + 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0xC0, 0x01, 0xF0, 0xFC, 0x00, + 0x3F, 0x07, 0xE0, 0x07, 0xF0, 0x7F, 0x81, 0xFF, 0x03, 0xFF, 0xFF, 0xF0, + 0x1F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x9F, 0x00, 0x0F, + 0xE1, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x00, + 0x03, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x01, + 0xF0, 0x3F, 0xC7, 0xFC, 0x7F, 0xCF, 0xFE, 0x7F, 0xDF, 0xFF, 0x7F, 0xFF, + 0xFF, 0x3F, 0xFF, 0x0E, 0x07, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, + 0x00, 0x07, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, + 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, + 0x00, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xE0, 0x7F, 0xFF, 0xC0, 0x03, 0xFC, 0x60, 0x7F, 0xFF, 0x87, 0xFF, 0xFC, + 0x7F, 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0x01, 0xF9, 0xF0, 0x07, 0xCF, 0xC0, + 0x1C, 0x7F, 0xF0, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x00, 0x0F, 0xFD, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0x3F, + 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0xFF, + 0xF8, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, + 0x80, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, + 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x03, 0x83, 0xF0, 0x1F, 0x87, + 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x03, + 0xFC, 0x00, 0x7F, 0x01, 0xFE, 0x7F, 0x81, 0xFF, 0x3F, 0xC0, 0xFF, 0x9F, + 0xE0, 0x7F, 0xC7, 0xF0, 0x1F, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, + 0x3E, 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, + 0x83, 0xE0, 0x07, 0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x01, + 0xF8, 0x3F, 0x01, 0xFC, 0x1F, 0xC1, 0xFF, 0x07, 0xFF, 0xFF, 0xC3, 0xFF, + 0xFF, 0xE0, 0xFF, 0xF7, 0xF0, 0x3F, 0xF3, 0xF0, 0x03, 0xF0, 0x00, 0x7F, + 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F, + 0xFF, 0x7F, 0xE0, 0x7F, 0xE0, 0xF8, 0x01, 0xF0, 0x0F, 0xC0, 0x1F, 0x00, + 0x7C, 0x03, 0xE0, 0x07, 0xE0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xF0, + 0x7C, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF8, 0xF8, 0x00, 0x0F, 0x9F, 0x00, + 0x00, 0xFD, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x7F, 0x80, 0x1F, 0xEF, 0xFC, 0x03, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, + 0xFC, 0x03, 0xFF, 0x7F, 0x80, 0x1F, 0xE1, 0xF0, 0xF8, 0x7C, 0x1F, 0x1F, + 0x87, 0xC1, 0xF1, 0xF8, 0xFC, 0x1F, 0x1F, 0xCF, 0x80, 0xFB, 0xFC, 0xF8, + 0x0F, 0xBF, 0xDF, 0x80, 0xFB, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0x7F, + 0xDF, 0xF0, 0x07, 0xF9, 0xFF, 0x00, 0x7F, 0x9F, 0xE0, 0x07, 0xF0, 0xFE, + 0x00, 0x3F, 0x0F, 0xE0, 0x03, 0xF0, 0x7E, 0x00, 0x3E, 0x07, 0xC0, 0x03, + 0xE0, 0x3C, 0x00, 0x3F, 0xC0, 0xFF, 0x1F, 0xF8, 0x7F, 0xE7, 0xFE, 0x1F, + 0xF9, 0xFF, 0x87, 0xFE, 0x3F, 0xC0, 0xFF, 0x03, 0xF8, 0x7F, 0x00, 0x7F, + 0x3F, 0x80, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, + 0x07, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xFE, + 0x00, 0xFE, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x7F, 0xC0, 0xFF, 0xBF, 0xF8, + 0x7F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0x7F, 0xC0, 0xFF, 0x80, + 0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x03, + 0xFF, 0x7F, 0x80, 0x7F, 0x8F, 0xC0, 0x07, 0x81, 0xF0, 0x03, 0xE0, 0x7E, + 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xF0, 0x3E, 0x00, 0x7C, 0x0F, 0x80, + 0x0F, 0x87, 0xC0, 0x03, 0xE1, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x1F, 0xFE, + 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xFF, 0x80, + 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, + 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x3F, 0xBE, 0x0F, 0xC3, 0x83, 0xF0, 0x00, 0xFC, 0x00, + 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, + 0xC0, 0x3B, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0x07, + 0xF8, 0x1F, 0x80, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x0F, 0x81, 0xFE, 0x0F, + 0xF0, 0x3F, 0x80, 0xFF, 0x01, 0xFE, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, + 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF8, + 0x07, 0xF8, 0x0F, 0xF0, 0x3F, 0xC0, 0x7F, 0x00, 0x78, 0x77, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE0, 0x78, 0x03, 0xF0, 0x0F, + 0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x7E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, + 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, + 0x07, 0xC0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x03, 0xFC, 0x1F, 0xE0, 0xFC, + 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0xF8, 0x07, 0xE0, 0x7F, 0x83, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0x78, + 0x00, 0x07, 0x80, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0x03, 0x9F, 0xFE, 0x1F, + 0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0x87, 0xFF, 0x9C, 0x0F, 0xFC, 0x00, + 0x0F, 0xE0, 0x00, 0x1F, 0x00}; + +const GFXglyph FreeMonoBold24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 28, 0, 1}, // 0x20 ' ' + {0, 7, 31, 28, 10, -29}, // 0x21 '!' + {28, 15, 14, 28, 6, -28}, // 0x22 '"' + {55, 22, 34, 28, 3, -30}, // 0x23 '#' + {149, 19, 38, 28, 5, -31}, // 0x24 '$' + {240, 21, 30, 28, 4, -28}, // 0x25 '%' + {319, 21, 28, 28, 4, -26}, // 0x26 '&' + {393, 6, 14, 28, 11, -28}, // 0x27 ''' + {404, 10, 37, 28, 12, -29}, // 0x28 '(' + {451, 10, 37, 28, 6, -29}, // 0x29 ')' + {498, 21, 19, 28, 4, -28}, // 0x2A '*' + {548, 23, 26, 28, 3, -25}, // 0x2B '+' + {623, 9, 14, 28, 7, -6}, // 0x2C ',' + {639, 24, 5, 28, 2, -15}, // 0x2D '-' + {654, 7, 6, 28, 11, -4}, // 0x2E '.' + {660, 20, 38, 28, 4, -32}, // 0x2F '/' + {755, 21, 31, 28, 4, -29}, // 0x30 '0' + {837, 20, 29, 28, 4, -28}, // 0x31 '1' + {910, 21, 30, 28, 3, -29}, // 0x32 '2' + {989, 21, 31, 28, 4, -29}, // 0x33 '3' + {1071, 20, 28, 28, 4, -27}, // 0x34 '4' + {1141, 21, 31, 28, 4, -29}, // 0x35 '5' + {1223, 20, 31, 28, 5, -29}, // 0x36 '6' + {1301, 20, 30, 28, 4, -29}, // 0x37 '7' + {1376, 20, 31, 28, 4, -29}, // 0x38 '8' + {1454, 20, 31, 28, 5, -29}, // 0x39 '9' + {1532, 7, 22, 28, 11, -20}, // 0x3A ':' + {1552, 10, 28, 28, 6, -20}, // 0x3B ';' + {1587, 24, 21, 28, 2, -23}, // 0x3C '<' + {1650, 24, 14, 28, 2, -19}, // 0x3D '=' + {1692, 23, 22, 28, 3, -23}, // 0x3E '>' + {1756, 20, 29, 28, 5, -27}, // 0x3F '?' + {1829, 19, 36, 28, 4, -28}, // 0x40 '@' + {1915, 29, 27, 28, -1, -26}, // 0x41 'A' + {2013, 26, 27, 28, 1, -26}, // 0x42 'B' + {2101, 25, 29, 28, 2, -27}, // 0x43 'C' + {2192, 25, 27, 28, 1, -26}, // 0x44 'D' + {2277, 25, 27, 28, 1, -26}, // 0x45 'E' + {2362, 25, 27, 28, 1, -26}, // 0x46 'F' + {2447, 25, 29, 28, 2, -27}, // 0x47 'G' + {2538, 26, 27, 28, 1, -26}, // 0x48 'H' + {2626, 19, 27, 28, 5, -26}, // 0x49 'I' + {2691, 25, 28, 28, 3, -26}, // 0x4A 'J' + {2779, 27, 27, 28, 1, -26}, // 0x4B 'K' + {2871, 25, 27, 28, 2, -26}, // 0x4C 'L' + {2956, 31, 27, 28, -1, -26}, // 0x4D 'M' + {3061, 28, 27, 28, 0, -26}, // 0x4E 'N' + {3156, 27, 29, 28, 1, -27}, // 0x4F 'O' + {3254, 24, 27, 28, 1, -26}, // 0x50 'P' + {3335, 27, 35, 28, 1, -27}, // 0x51 'Q' + {3454, 28, 27, 28, 0, -26}, // 0x52 'R' + {3549, 22, 29, 28, 3, -27}, // 0x53 'S' + {3629, 25, 27, 28, 2, -26}, // 0x54 'T' + {3714, 28, 28, 28, 0, -26}, // 0x55 'U' + {3812, 30, 27, 28, -1, -26}, // 0x56 'V' + {3914, 28, 27, 28, 0, -26}, // 0x57 'W' + {4009, 26, 27, 28, 1, -26}, // 0x58 'X' + {4097, 26, 27, 28, 1, -26}, // 0x59 'Y' + {4185, 21, 27, 28, 4, -26}, // 0x5A 'Z' + {4256, 10, 37, 28, 12, -29}, // 0x5B '[' + {4303, 20, 38, 28, 4, -32}, // 0x5C '\' + {4398, 10, 37, 28, 6, -29}, // 0x5D ']' + {4445, 20, 15, 28, 4, -29}, // 0x5E '^' + {4483, 28, 5, 28, 0, 5}, // 0x5F '_' + {4501, 9, 8, 28, 8, -30}, // 0x60 '`' + {4510, 24, 23, 28, 2, -21}, // 0x61 'a' + {4579, 27, 31, 28, 0, -29}, // 0x62 'b' + {4684, 24, 23, 28, 3, -21}, // 0x63 'c' + {4753, 26, 31, 28, 2, -29}, // 0x64 'd' + {4854, 24, 23, 28, 2, -21}, // 0x65 'e' + {4923, 22, 30, 28, 4, -29}, // 0x66 'f' + {5006, 25, 31, 28, 2, -21}, // 0x67 'g' + {5103, 26, 30, 28, 1, -29}, // 0x68 'h' + {5201, 21, 29, 28, 4, -28}, // 0x69 'i' + {5278, 17, 38, 28, 5, -28}, // 0x6A 'j' + {5359, 25, 30, 28, 2, -29}, // 0x6B 'k' + {5453, 21, 30, 28, 4, -29}, // 0x6C 'l' + {5532, 30, 22, 28, -1, -21}, // 0x6D 'm' + {5615, 25, 22, 28, 1, -21}, // 0x6E 'n' + {5684, 25, 23, 28, 2, -21}, // 0x6F 'o' + {5756, 28, 31, 28, 0, -21}, // 0x70 'p' + {5865, 28, 31, 28, 1, -21}, // 0x71 'q' + {5974, 24, 22, 28, 3, -21}, // 0x72 'r' + {6040, 21, 23, 28, 4, -21}, // 0x73 's' + {6101, 23, 28, 28, 1, -26}, // 0x74 't' + {6182, 25, 22, 28, 1, -20}, // 0x75 'u' + {6251, 28, 21, 28, 0, -20}, // 0x76 'v' + {6325, 28, 21, 28, 0, -20}, // 0x77 'w' + {6399, 26, 21, 28, 1, -20}, // 0x78 'x' + {6468, 26, 30, 28, 1, -20}, // 0x79 'y' + {6566, 19, 21, 28, 5, -20}, // 0x7A 'z' + {6616, 14, 37, 28, 7, -29}, // 0x7B '{' + {6681, 5, 36, 28, 12, -28}, // 0x7C '|' + {6704, 14, 37, 28, 8, -29}, // 0x7D '}' + {6769, 22, 10, 28, 3, -17}}; // 0x7E '~' + +const GFXfont FreeMonoBold24pt7b PROGMEM = { + (uint8_t *)FreeMonoBold24pt7bBitmaps, (GFXglyph *)FreeMonoBold24pt7bGlyphs, + 0x20, 0x7E, 47}; + +// Approx. 7469 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h new file mode 100644 index 0000000..44320f8 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h @@ -0,0 +1,191 @@ +#pragma once +#include + +const uint8_t FreeMonoBold9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xD2, 0x1F, 0x80, 0xEC, 0x89, 0x12, 0x24, 0x40, 0x36, 0x36, + 0x36, 0x7F, 0x7F, 0x36, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x00, 0x18, 0xFF, + 0xFE, 0x3C, 0x1F, 0x1F, 0x83, 0x46, 0x8D, 0xF0, 0xC1, 0x83, 0x00, 0x61, + 0x22, 0x44, 0x86, 0x67, 0x37, 0x11, 0x22, 0x4C, 0x70, 0x3C, 0x7E, 0x60, + 0x60, 0x30, 0x7B, 0xDF, 0xCE, 0xFF, 0x7F, 0xC9, 0x24, 0x37, 0x66, 0xCC, + 0xCC, 0xCC, 0x66, 0x31, 0xCE, 0x66, 0x33, 0x33, 0x33, 0x66, 0xC8, 0x18, + 0x18, 0xFF, 0xFF, 0x3C, 0x3C, 0x66, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, + 0x18, 0x18, 0x18, 0x6B, 0x48, 0xFF, 0xFF, 0xC0, 0xF0, 0x02, 0x0C, 0x18, + 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x20, 0x00, 0x38, + 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x38, 0xF3, + 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0xFD, 0xF8, 0x3C, 0xFE, 0xC7, 0x03, + 0x03, 0x06, 0x0C, 0x18, 0x70, 0xE3, 0xFF, 0xFF, 0x7C, 0xFE, 0x03, 0x03, + 0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xFE, 0x7C, 0x1C, 0x38, 0xB1, 0x64, + 0xD9, 0xBF, 0xFF, 0x3E, 0x7C, 0x7E, 0x3F, 0x18, 0x0F, 0xC7, 0xF3, 0x1C, + 0x06, 0x03, 0xC3, 0xFF, 0x9F, 0x80, 0x0F, 0x3F, 0x30, 0x60, 0x60, 0xDC, + 0xFE, 0xE3, 0xC3, 0x63, 0x7E, 0x3C, 0xFF, 0xFF, 0xC3, 0x03, 0x06, 0x06, + 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0x9F, 0x63, + 0xC7, 0x8F, 0xF1, 0xC0, 0x3C, 0x7E, 0xE6, 0xC3, 0xC3, 0xE7, 0x7F, 0x3B, + 0x06, 0x0E, 0xFC, 0xF0, 0xF0, 0x0F, 0x6C, 0x00, 0x1A, 0xD2, 0x00, 0x01, + 0x83, 0x87, 0x0E, 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0xFF, 0xFF, 0xC0, 0x00, + 0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0xF9, 0xE3, 0xC1, 0x80, + 0x7C, 0xFE, 0xC7, 0x03, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x30, 0x30, 0x1E, + 0x1F, 0x1C, 0xDC, 0x6C, 0x76, 0x7B, 0x6D, 0xB6, 0xDB, 0x6F, 0xF3, 0xFC, + 0x06, 0x33, 0xF8, 0x78, 0x3C, 0x07, 0xC0, 0x38, 0x05, 0x81, 0xB0, 0x36, + 0x0F, 0xE1, 0xFC, 0x71, 0xDF, 0x7F, 0xEF, 0x80, 0xFF, 0x3F, 0xE6, 0x19, + 0x86, 0x7F, 0x1F, 0xE6, 0x1D, 0x83, 0x60, 0xFF, 0xFF, 0xF0, 0x1F, 0xBF, + 0xD8, 0xF8, 0x3C, 0x06, 0x03, 0x01, 0x80, 0x61, 0xBF, 0xC7, 0xC0, 0xFE, + 0x3F, 0xE6, 0x19, 0x83, 0x60, 0xD8, 0x36, 0x0D, 0x83, 0x61, 0xBF, 0xEF, + 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC3, 0x61, 0xFF, + 0xFF, 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC0, 0x60, + 0x7C, 0x3E, 0x00, 0x1F, 0x9F, 0xE6, 0x1B, 0x06, 0xC0, 0x30, 0x0C, 0x7F, + 0x1F, 0xE1, 0x9F, 0xE3, 0xF0, 0xF7, 0xFB, 0xD8, 0xCC, 0x66, 0x33, 0xF9, + 0xFC, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, + 0x33, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x30, 0x0C, 0x03, 0x00, 0xCC, 0x33, + 0x0C, 0xC7, 0x3F, 0x87, 0xC0, 0xF7, 0xBD, 0xE6, 0x61, 0xB0, 0x78, 0x1F, + 0x06, 0xE1, 0x98, 0x63, 0x3C, 0xFF, 0x3C, 0xFC, 0x7E, 0x0C, 0x06, 0x03, + 0x01, 0x80, 0xC6, 0x63, 0x31, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0x3D, 0xC7, + 0x3D, 0xE7, 0xBC, 0xD7, 0x9B, 0xB3, 0x76, 0x60, 0xDE, 0x3F, 0xC7, 0x80, + 0xE1, 0xFE, 0x3D, 0xE3, 0x3C, 0x66, 0xCC, 0xDD, 0x99, 0xB3, 0x1E, 0x63, + 0xDE, 0x3B, 0xC3, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, + 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 0x00, 0xFE, 0x7F, 0x98, 0x6C, + 0x36, 0x1B, 0xF9, 0xF8, 0xC0, 0x60, 0x7C, 0x3E, 0x00, 0x1F, 0x07, 0xF1, + 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, + 0x0C, 0x33, 0xFE, 0x7F, 0x80, 0xFC, 0x7F, 0x18, 0xCC, 0x66, 0x73, 0xF1, + 0xF0, 0xCC, 0x63, 0x7D, 0xFE, 0x60, 0x3F, 0xBF, 0xF0, 0x78, 0x0F, 0x03, + 0xF8, 0x3F, 0x83, 0xC3, 0xFF, 0xBF, 0x80, 0xFF, 0xFF, 0xF6, 0x7B, 0x3D, + 0x98, 0xC0, 0x60, 0x30, 0x18, 0x3F, 0x1F, 0x80, 0xF1, 0xFE, 0x3D, 0x83, + 0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xC7, 0xF0, 0x7C, 0x00, + 0xFB, 0xFF, 0x7D, 0xC3, 0x18, 0xC3, 0x18, 0x36, 0x06, 0xC0, 0x50, 0x0E, + 0x01, 0xC0, 0x10, 0x00, 0xFB, 0xFE, 0xF6, 0x0D, 0x93, 0x6E, 0xDB, 0xB7, + 0xAD, 0xEE, 0x7B, 0x8E, 0xE3, 0x18, 0xF3, 0xFC, 0xF7, 0x38, 0xFC, 0x1E, + 0x03, 0x01, 0xE0, 0xCC, 0x73, 0xBC, 0xFF, 0x3C, 0xF3, 0xFC, 0xF7, 0x38, + 0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x0F, 0xC3, 0xF0, 0xFE, 0xFE, + 0xC6, 0xCC, 0x18, 0x18, 0x30, 0x63, 0xC3, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xFF, 0x01, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, + 0x30, 0x30, 0x60, 0x60, 0xC0, 0x80, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, + 0xFF, 0x10, 0x71, 0xE3, 0x6C, 0x70, 0x40, 0xFF, 0xFF, 0xFC, 0x88, 0x80, + 0x7E, 0x3F, 0x8F, 0xCF, 0xEE, 0x36, 0x1B, 0xFE, 0xFF, 0xE0, 0x38, 0x06, + 0x01, 0xBC, 0x7F, 0x9C, 0x76, 0x0D, 0x83, 0x71, 0xFF, 0xEE, 0xF0, 0x3F, + 0xBF, 0xF8, 0x78, 0x3C, 0x07, 0x05, 0xFE, 0x7E, 0x03, 0x80, 0xE0, 0x18, + 0xF6, 0x7F, 0xB8, 0xEC, 0x1B, 0x06, 0xE3, 0x9F, 0xF3, 0xFC, 0x3E, 0x3F, + 0xB0, 0xFF, 0xFF, 0xFE, 0x01, 0xFE, 0x7E, 0x1F, 0x3F, 0x30, 0x7E, 0x7E, + 0x30, 0x30, 0x30, 0x30, 0xFE, 0xFE, 0x3F, 0xBF, 0xF9, 0xD8, 0x6C, 0x37, + 0x39, 0xFC, 0x76, 0x03, 0x01, 0x8F, 0xC7, 0xC0, 0xE0, 0x70, 0x18, 0x0D, + 0xC7, 0xF3, 0x99, 0x8C, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0x18, 0x18, 0x00, + 0x78, 0x78, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x60, 0x3F, 0xFC, + 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0x80, 0xE0, 0x70, 0x18, 0x0D, + 0xE6, 0xF3, 0xE1, 0xE0, 0xF8, 0x6E, 0x73, 0xF9, 0xE0, 0x78, 0x78, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0xFD, 0x9F, 0xF9, 0x9B, + 0x33, 0x66, 0x6C, 0xCD, 0xBD, 0xFF, 0xBF, 0xEE, 0x7F, 0x98, 0xCC, 0x66, + 0x33, 0x1B, 0xDF, 0xEF, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x1D, 0xFC, + 0x7C, 0xEF, 0x1F, 0xF9, 0xC3, 0xB0, 0x36, 0x06, 0xE1, 0xDF, 0xF3, 0x78, + 0x60, 0x0C, 0x03, 0xE0, 0x7C, 0x00, 0x1E, 0xEF, 0xFF, 0x87, 0x60, 0x6C, + 0x0D, 0xC3, 0x9F, 0xF0, 0xF6, 0x00, 0xC0, 0x18, 0x0F, 0x81, 0xF0, 0x77, + 0xBF, 0xCF, 0x06, 0x03, 0x01, 0x83, 0xF9, 0xFC, 0x3F, 0xFF, 0xC3, 0xFC, + 0x3F, 0xC3, 0xFF, 0xFC, 0x60, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x60, + 0x61, 0x7F, 0x3E, 0xE7, 0x73, 0x98, 0xCC, 0x66, 0x33, 0x19, 0xFE, 0x7F, + 0xFB, 0xFF, 0x7C, 0xC6, 0x18, 0xC1, 0xB0, 0x36, 0x03, 0x80, 0x70, 0xF1, + 0xFE, 0x3D, 0xBB, 0x37, 0x63, 0xF8, 0x77, 0x0E, 0xE1, 0x8C, 0xF7, 0xFB, + 0xCD, 0x83, 0x83, 0xC3, 0xBB, 0xDF, 0xEF, 0xF3, 0xFC, 0xF6, 0x18, 0xCC, + 0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x06, 0x0F, 0xC3, 0xF0, 0xFF, 0xFF, + 0x30, 0xC3, 0x0C, 0x7F, 0xFF, 0x37, 0x66, 0x66, 0xCC, 0x66, 0x66, 0x73, + 0xFF, 0xFF, 0xFF, 0xF0, 0xCE, 0x66, 0x66, 0x33, 0x66, 0x66, 0xEC, 0x70, + 0x7C, 0xF3, 0xC0, 0xC0}; + +const GFXglyph FreeMonoBold9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 11, 0, 1}, // 0x20 ' ' + {0, 3, 11, 11, 4, -10}, // 0x21 '!' + {5, 7, 5, 11, 2, -10}, // 0x22 '"' + {10, 8, 12, 11, 1, -10}, // 0x23 '#' + {22, 7, 14, 11, 2, -11}, // 0x24 '$' + {35, 7, 11, 11, 2, -10}, // 0x25 '%' + {45, 8, 10, 11, 1, -9}, // 0x26 '&' + {55, 3, 5, 11, 4, -10}, // 0x27 ''' + {57, 4, 14, 11, 5, -10}, // 0x28 '(' + {64, 4, 14, 11, 2, -10}, // 0x29 ')' + {71, 8, 7, 11, 2, -10}, // 0x2A '*' + {78, 8, 9, 11, 2, -8}, // 0x2B '+' + {87, 3, 5, 11, 3, -1}, // 0x2C ',' + {89, 9, 2, 11, 1, -5}, // 0x2D '-' + {92, 2, 2, 11, 4, -1}, // 0x2E '.' + {93, 7, 15, 11, 2, -12}, // 0x2F '/' + {107, 7, 12, 11, 2, -11}, // 0x30 '0' + {118, 7, 11, 11, 2, -10}, // 0x31 '1' + {128, 8, 12, 11, 1, -11}, // 0x32 '2' + {140, 8, 12, 11, 2, -11}, // 0x33 '3' + {152, 7, 10, 11, 2, -9}, // 0x34 '4' + {161, 9, 11, 11, 1, -10}, // 0x35 '5' + {174, 8, 12, 11, 2, -11}, // 0x36 '6' + {186, 8, 11, 11, 1, -10}, // 0x37 '7' + {197, 7, 12, 11, 2, -11}, // 0x38 '8' + {208, 8, 12, 11, 2, -11}, // 0x39 '9' + {220, 2, 8, 11, 4, -7}, // 0x3A ':' + {222, 3, 11, 11, 3, -7}, // 0x3B ';' + {227, 9, 8, 11, 1, -8}, // 0x3C '<' + {236, 9, 6, 11, 1, -7}, // 0x3D '=' + {243, 9, 8, 11, 1, -8}, // 0x3E '>' + {252, 8, 11, 11, 2, -10}, // 0x3F '?' + {263, 9, 15, 11, 1, -11}, // 0x40 '@' + {280, 11, 11, 11, 0, -10}, // 0x41 'A' + {296, 10, 11, 11, 1, -10}, // 0x42 'B' + {310, 9, 11, 11, 1, -10}, // 0x43 'C' + {323, 10, 11, 11, 0, -10}, // 0x44 'D' + {337, 9, 11, 11, 1, -10}, // 0x45 'E' + {350, 9, 11, 11, 1, -10}, // 0x46 'F' + {363, 10, 11, 11, 1, -10}, // 0x47 'G' + {377, 9, 11, 11, 1, -10}, // 0x48 'H' + {390, 6, 11, 11, 3, -10}, // 0x49 'I' + {399, 10, 11, 11, 1, -10}, // 0x4A 'J' + {413, 10, 11, 11, 1, -10}, // 0x4B 'K' + {427, 9, 11, 11, 1, -10}, // 0x4C 'L' + {440, 11, 11, 11, 0, -10}, // 0x4D 'M' + {456, 11, 11, 11, 0, -10}, // 0x4E 'N' + {472, 11, 11, 11, 0, -10}, // 0x4F 'O' + {488, 9, 11, 11, 1, -10}, // 0x50 'P' + {501, 11, 14, 11, 0, -10}, // 0x51 'Q' + {521, 9, 11, 11, 1, -10}, // 0x52 'R' + {534, 9, 11, 11, 1, -10}, // 0x53 'S' + {547, 9, 11, 11, 1, -10}, // 0x54 'T' + {560, 11, 11, 11, 0, -10}, // 0x55 'U' + {576, 11, 11, 11, 0, -10}, // 0x56 'V' + {592, 10, 11, 11, 0, -10}, // 0x57 'W' + {606, 10, 11, 11, 0, -10}, // 0x58 'X' + {620, 10, 11, 11, 0, -10}, // 0x59 'Y' + {634, 8, 11, 11, 2, -10}, // 0x5A 'Z' + {645, 4, 14, 11, 5, -10}, // 0x5B '[' + {652, 7, 15, 11, 2, -12}, // 0x5C '\' + {666, 4, 14, 11, 2, -10}, // 0x5D ']' + {673, 7, 6, 11, 2, -11}, // 0x5E '^' + {679, 11, 2, 11, 0, 3}, // 0x5F '_' + {682, 3, 3, 11, 3, -11}, // 0x60 '`' + {684, 9, 8, 11, 1, -7}, // 0x61 'a' + {693, 10, 11, 11, 0, -10}, // 0x62 'b' + {707, 9, 8, 11, 1, -7}, // 0x63 'c' + {716, 10, 11, 11, 1, -10}, // 0x64 'd' + {730, 9, 8, 11, 1, -7}, // 0x65 'e' + {739, 8, 11, 11, 2, -10}, // 0x66 'f' + {750, 9, 12, 11, 1, -7}, // 0x67 'g' + {764, 9, 11, 11, 1, -10}, // 0x68 'h' + {777, 8, 11, 11, 2, -10}, // 0x69 'i' + {788, 6, 15, 11, 2, -10}, // 0x6A 'j' + {800, 9, 11, 11, 1, -10}, // 0x6B 'k' + {813, 8, 11, 11, 2, -10}, // 0x6C 'l' + {824, 11, 8, 11, 0, -7}, // 0x6D 'm' + {835, 9, 8, 11, 1, -7}, // 0x6E 'n' + {844, 9, 8, 11, 1, -7}, // 0x6F 'o' + {853, 11, 12, 11, 0, -7}, // 0x70 'p' + {870, 11, 12, 11, 0, -7}, // 0x71 'q' + {887, 9, 8, 11, 1, -7}, // 0x72 'r' + {896, 8, 8, 11, 2, -7}, // 0x73 's' + {904, 8, 11, 11, 1, -10}, // 0x74 't' + {915, 9, 8, 11, 1, -7}, // 0x75 'u' + {924, 11, 8, 11, 0, -7}, // 0x76 'v' + {935, 11, 8, 11, 0, -7}, // 0x77 'w' + {946, 9, 8, 11, 1, -7}, // 0x78 'x' + {955, 10, 12, 11, 0, -7}, // 0x79 'y' + {970, 7, 8, 11, 2, -7}, // 0x7A 'z' + {977, 4, 14, 11, 3, -10}, // 0x7B '{' + {984, 2, 14, 11, 5, -10}, // 0x7C '|' + {988, 4, 14, 11, 4, -10}, // 0x7D '}' + {995, 9, 4, 11, 1, -6}}; // 0x7E '~' + +const GFXfont FreeMonoBold9pt7b PROGMEM = {(uint8_t *)FreeMonoBold9pt7bBitmaps, + (GFXglyph *)FreeMonoBold9pt7bGlyphs, + 0x20, 0x7E, 18}; + +// Approx. 1672 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h new file mode 100644 index 0000000..095fdd3 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h @@ -0,0 +1,271 @@ +#pragma once +#include + +const uint8_t FreeMonoBoldOblique12pt7bBitmaps[] PROGMEM = { + 0x1C, 0xF3, 0xCE, 0x38, 0xE7, 0x1C, 0x61, 0x86, 0x00, 0x63, 0x8C, 0x00, + 0xE7, 0xE7, 0xE6, 0xC6, 0xC6, 0xC4, 0x84, 0x03, 0x30, 0x19, 0x81, 0xDC, + 0x0C, 0xE0, 0x66, 0x1F, 0xFC, 0xFF, 0xE1, 0x98, 0x0C, 0xC0, 0xEE, 0x06, + 0x70, 0xFF, 0xCF, 0xFE, 0x1D, 0xC0, 0xCC, 0x06, 0x60, 0x77, 0x03, 0x30, + 0x00, 0x01, 0x00, 0x70, 0x0C, 0x07, 0xF1, 0xFE, 0x71, 0xCC, 0x11, 0x80, + 0x3F, 0x03, 0xF0, 0x0F, 0x20, 0x6E, 0x0D, 0xC3, 0x3F, 0xE7, 0xF8, 0x1C, + 0x03, 0x00, 0x60, 0x0C, 0x00, 0x0E, 0x03, 0xE0, 0xC4, 0x10, 0x82, 0x30, + 0x7C, 0x07, 0x78, 0x7C, 0x7F, 0x19, 0xF0, 0x62, 0x08, 0x41, 0x18, 0x3E, + 0x03, 0x80, 0x07, 0xC1, 0xF8, 0x62, 0x0C, 0x01, 0x80, 0x38, 0x0F, 0x03, + 0xF7, 0x6F, 0xD8, 0xF3, 0x1E, 0x7F, 0xE7, 0xF8, 0xFF, 0x6D, 0x20, 0x06, + 0x1C, 0x70, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, + 0x70, 0x60, 0xC1, 0x00, 0x0C, 0x18, 0x38, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x30, 0x61, 0xC3, 0x0E, 0x38, 0x61, 0xC2, 0x00, 0x06, 0x00, 0xC0, + 0x18, 0x3F, 0x7F, 0xFE, 0xFF, 0x07, 0x81, 0xF8, 0x77, 0x0C, 0x60, 0x03, + 0x00, 0x70, 0x07, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0xE0, 0x0C, + 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x18, 0x00, 0x1C, 0xE3, 0x1C, 0x63, 0x08, + 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x70, 0x01, + 0x80, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C, + 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, + 0x03, 0x80, 0x0C, 0x00, 0x20, 0x00, 0x07, 0x83, 0xF8, 0xE3, 0x98, 0x37, + 0x06, 0xC0, 0xD8, 0x1B, 0x03, 0xE0, 0xF8, 0x1B, 0x03, 0x60, 0xEE, 0x38, + 0xFE, 0x0F, 0x00, 0x03, 0xC1, 0xF0, 0x7E, 0x0C, 0xC0, 0x38, 0x07, 0x00, + 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF0, + 0x03, 0xE0, 0x3F, 0x83, 0x8E, 0x38, 0x31, 0x81, 0x80, 0x18, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, 0x38, 0x03, 0x80, 0x38, 0x47, 0x87, 0x3F, 0xF3, 0xFF, + 0x80, 0x07, 0xC1, 0xFF, 0x18, 0x70, 0x03, 0x00, 0x30, 0x06, 0x07, 0xC0, + 0x7C, 0x00, 0xE0, 0x06, 0x00, 0x60, 0x06, 0xC1, 0xCF, 0xF8, 0x7E, 0x00, + 0x01, 0xE0, 0x3C, 0x0F, 0x03, 0x60, 0xCC, 0x3B, 0x8E, 0x63, 0x8C, 0x61, + 0x9F, 0xFB, 0xFF, 0x01, 0x81, 0xF8, 0x3F, 0x00, 0x0F, 0xF1, 0xFE, 0x18, + 0x01, 0x80, 0x18, 0x03, 0xF8, 0x3F, 0xC3, 0x8E, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x0C, 0xC1, 0xCF, 0xF8, 0x7E, 0x00, 0x03, 0xE1, 0xFC, 0x70, 0x1C, + 0x03, 0x00, 0xC0, 0x1B, 0xC7, 0xFC, 0xF3, 0x98, 0x33, 0x06, 0x60, 0xCE, + 0x30, 0xFC, 0x0F, 0x00, 0xFF, 0xFF, 0xFB, 0x07, 0x60, 0xC0, 0x38, 0x06, + 0x01, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x1C, 0x03, 0x80, 0x60, 0x08, + 0x00, 0x07, 0x83, 0xF8, 0xE3, 0xB0, 0x36, 0x06, 0xC0, 0xDC, 0x31, 0xFC, + 0x3F, 0x8C, 0x3B, 0x03, 0x60, 0x6C, 0x39, 0xFE, 0x1F, 0x00, 0x07, 0x81, + 0xF8, 0x63, 0x98, 0x33, 0x06, 0x60, 0xCE, 0x79, 0xFF, 0x1E, 0xC0, 0x18, + 0x06, 0x01, 0xC0, 0x71, 0xFC, 0x3E, 0x00, 0x19, 0xCC, 0x00, 0x00, 0x00, + 0x67, 0x30, 0x06, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0xC3, + 0x0E, 0x18, 0x20, 0x00, 0x00, 0x18, 0x03, 0xC0, 0x7C, 0x1F, 0x03, 0xE0, + 0x3E, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x08, 0x7F, 0xFB, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFB, 0xFF, 0xC0, 0x30, 0x01, + 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x7C, 0x1F, 0x03, 0xE0, 0x7C, + 0x07, 0x80, 0x20, 0x00, 0x3E, 0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x1C, + 0x3C, 0x38, 0x18, 0x00, 0x06, 0x07, 0x03, 0x00, 0x03, 0xC0, 0x7E, 0x0C, + 0x71, 0x83, 0x30, 0x33, 0x0F, 0x33, 0xE6, 0x76, 0x6C, 0x66, 0xC6, 0x6C, + 0x6C, 0xFC, 0xC7, 0xEC, 0x00, 0xC0, 0x0C, 0x00, 0xE3, 0x07, 0xF0, 0x3C, + 0x00, 0x07, 0xF0, 0x1F, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0x3B, 0x00, 0xE7, + 0x01, 0x8E, 0x07, 0x1C, 0x1F, 0xF8, 0x3F, 0xF0, 0xE0, 0x71, 0x80, 0xEF, + 0xC7, 0xFF, 0x8F, 0xC0, 0x3F, 0xF1, 0xFF, 0xC3, 0x06, 0x38, 0x31, 0xC1, + 0x8C, 0x18, 0x7F, 0xC3, 0xFE, 0x38, 0x39, 0xC0, 0xCC, 0x06, 0x60, 0x6F, + 0xFF, 0x7F, 0xE0, 0x03, 0xEC, 0x3F, 0xF1, 0xC3, 0x8C, 0x06, 0x60, 0x19, + 0x80, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x03, 0x3C, 0x1C, + 0x7F, 0xE0, 0x7E, 0x00, 0x3F, 0xE1, 0xFF, 0x87, 0x0C, 0x30, 0x31, 0x81, + 0x8C, 0x0C, 0xE0, 0x67, 0x03, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0xE1, 0xCF, + 0xFC, 0x7F, 0x80, 0x1F, 0xFE, 0x3F, 0xFC, 0x38, 0x38, 0x70, 0x70, 0xCC, + 0xC1, 0x98, 0x03, 0xF0, 0x0F, 0xE0, 0x1D, 0x80, 0x31, 0x18, 0x60, 0x70, + 0xC0, 0xE7, 0xFF, 0x9F, 0xFF, 0x00, 0x1F, 0xFF, 0x1F, 0xFE, 0x0E, 0x06, + 0x0C, 0x0E, 0x0C, 0xC4, 0x0C, 0xC0, 0x1F, 0xC0, 0x1F, 0xC0, 0x19, 0xC0, + 0x19, 0x80, 0x18, 0x00, 0x38, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x07, 0xEC, + 0x7F, 0xF3, 0x83, 0x9C, 0x06, 0x60, 0x19, 0x80, 0x0C, 0x00, 0x30, 0xFE, + 0xC3, 0xFB, 0x01, 0xCC, 0x07, 0x3C, 0x38, 0x7F, 0xE0, 0x7E, 0x00, 0x0F, + 0xBF, 0x1F, 0xBE, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x0C, 0x1C, 0x1F, + 0xF8, 0x1F, 0xF8, 0x18, 0x18, 0x18, 0x38, 0x18, 0x38, 0x38, 0x30, 0x7C, + 0xFC, 0xFC, 0xF8, 0x3F, 0xF3, 0xFF, 0x03, 0x00, 0x70, 0x07, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0xFF, 0xCF, 0xFC, + 0x03, 0xFF, 0x03, 0xFF, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, + 0x00, 0x70, 0x20, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE1, 0xC0, + 0xFF, 0x80, 0x3F, 0x00, 0x1F, 0x9F, 0x1F, 0x9E, 0x0E, 0x38, 0x0C, 0x70, + 0x0C, 0xE0, 0x0F, 0xC0, 0x1F, 0xC0, 0x1F, 0xE0, 0x1C, 0xE0, 0x18, 0x60, + 0x18, 0x70, 0x38, 0x70, 0xFE, 0x3C, 0xFC, 0x3C, 0x3F, 0xC1, 0xFE, 0x01, + 0x80, 0x1C, 0x00, 0xE0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x18, 0xE0, + 0xC6, 0x06, 0x30, 0x7F, 0xFF, 0xFF, 0xF8, 0x1E, 0x07, 0x87, 0x81, 0xE0, + 0xF0, 0xF0, 0x7C, 0x7C, 0x1F, 0x1F, 0x06, 0xCF, 0x81, 0xBF, 0x60, 0xEF, + 0x98, 0x3B, 0xEE, 0x0C, 0x73, 0x83, 0x1C, 0xC0, 0xC0, 0x30, 0xFC, 0x7E, + 0x3F, 0x1F, 0x80, 0x3C, 0x3F, 0x3E, 0x3F, 0x1E, 0x0C, 0x1F, 0x1C, 0x1F, + 0x1C, 0x1B, 0x98, 0x3B, 0x98, 0x3B, 0x98, 0x31, 0xF8, 0x31, 0xF8, 0x30, + 0xF0, 0x70, 0xF0, 0xFC, 0x70, 0xF8, 0x70, 0x03, 0xE0, 0x3F, 0xE1, 0xC3, + 0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00, + 0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0x7C, 0x00, 0x3F, 0xE1, 0xFF, 0x83, + 0x0E, 0x38, 0x31, 0xC1, 0x8C, 0x0C, 0x60, 0xC3, 0xFC, 0x3F, 0xC1, 0xC0, + 0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80, 0x03, 0xE0, 0x3F, 0xE1, 0xC3, + 0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00, + 0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0xFC, 0x03, 0x02, 0x1F, 0xFC, 0xFF, + 0xE0, 0x1F, 0xF0, 0x3F, 0xF0, 0x38, 0x70, 0x60, 0x60, 0xC0, 0xC1, 0x87, + 0x07, 0xFC, 0x0F, 0xF0, 0x18, 0xF0, 0x30, 0xE0, 0x60, 0xC1, 0xC1, 0xCF, + 0xE1, 0xFF, 0xC3, 0xC0, 0x0F, 0xB1, 0xFF, 0x30, 0xE6, 0x06, 0x60, 0x67, + 0x80, 0x7F, 0x01, 0xFC, 0x01, 0xC4, 0x0C, 0xC0, 0xCE, 0x18, 0xFF, 0x8B, + 0xE0, 0x7F, 0xFB, 0xFF, 0xD9, 0xCF, 0xCE, 0x7C, 0x63, 0x63, 0x18, 0x18, + 0x01, 0xC0, 0x0E, 0x00, 0x60, 0x03, 0x00, 0x18, 0x0F, 0xF8, 0x7F, 0xC0, + 0x7E, 0xFF, 0xF3, 0xF3, 0x03, 0x1C, 0x0C, 0x60, 0x31, 0x81, 0xC6, 0x06, + 0x38, 0x18, 0xE0, 0x63, 0x03, 0x8C, 0x0C, 0x30, 0x70, 0x7F, 0x80, 0xF8, + 0x00, 0xFC, 0x7F, 0xF8, 0xFD, 0xC0, 0x61, 0x81, 0xC3, 0x87, 0x07, 0x0C, + 0x0E, 0x38, 0x0C, 0x60, 0x19, 0xC0, 0x3F, 0x00, 0x7C, 0x00, 0xF8, 0x00, + 0xE0, 0x01, 0x80, 0x00, 0x7E, 0x7E, 0xFC, 0xFD, 0xC0, 0x73, 0x9C, 0xE7, + 0x79, 0x8E, 0xF7, 0x1B, 0xEE, 0x36, 0xD8, 0x7D, 0xF0, 0xF3, 0xE1, 0xE7, + 0x83, 0x8F, 0x07, 0x1E, 0x1C, 0x38, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, + 0x1C, 0x07, 0x38, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, + 0xE0, 0x0E, 0xE0, 0x1C, 0x70, 0x38, 0x70, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, + 0xFF, 0xC7, 0xCC, 0x38, 0x73, 0x83, 0x9C, 0x0F, 0xC0, 0x7C, 0x01, 0xC0, + 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x0F, 0xF8, 0x7F, 0x80, 0x0F, 0xF8, + 0x7F, 0xE1, 0xC7, 0x86, 0x1C, 0x18, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x70, 0xC3, 0x83, 0x1C, 0x1C, 0x7F, 0xF3, 0xFF, 0x80, 0x0F, + 0x87, 0xC3, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x38, 0x1C, 0x0C, 0x06, + 0x03, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x3E, 0x3F, 0x00, 0x41, 0xC3, 0x83, + 0x07, 0x0E, 0x1C, 0x18, 0x38, 0x70, 0xE0, 0xC1, 0xC3, 0x83, 0x06, 0x0E, + 0x1C, 0x18, 0x20, 0x1F, 0x0F, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x0C, + 0x0E, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x7C, 0x3E, + 0x00, 0x02, 0x01, 0x80, 0xF0, 0x7E, 0x3B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF, + 0xFF, 0xFF, 0xFC, 0xCE, 0x73, 0x1F, 0xC3, 0xFE, 0x00, 0x60, 0x06, 0x0F, + 0xE3, 0xFE, 0x70, 0xCC, 0x0C, 0xC3, 0xCF, 0xFF, 0x7F, 0xF0, 0x1E, 0x00, + 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xDF, 0x81, 0xFF, 0x83, 0xC3, 0x8F, + 0x03, 0x1C, 0x06, 0x38, 0x0C, 0x70, 0x18, 0xE0, 0x63, 0xE1, 0x9F, 0xFE, + 0x3D, 0xF8, 0x00, 0x0F, 0xF3, 0xFF, 0x30, 0x76, 0x07, 0xE0, 0x6C, 0x00, + 0xC0, 0x0C, 0x00, 0xE0, 0x67, 0xFE, 0x3F, 0x80, 0x00, 0x3C, 0x00, 0xF0, + 0x01, 0xC0, 0x06, 0x07, 0xD8, 0x7F, 0xE3, 0x0F, 0x98, 0x1E, 0x60, 0x73, + 0x01, 0xCC, 0x07, 0x30, 0x3C, 0xE1, 0xF1, 0xFF, 0xE3, 0xF7, 0x80, 0x0F, + 0xC1, 0xFE, 0x78, 0x76, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x0C, 0x00, 0xE0, + 0xE7, 0xFE, 0x1F, 0x80, 0x00, 0xFC, 0x07, 0xF8, 0x0C, 0x00, 0x38, 0x01, + 0xFF, 0x07, 0xFE, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x30, + 0x00, 0x60, 0x01, 0xC0, 0x1F, 0xF8, 0x3F, 0xF0, 0x00, 0x0F, 0xBC, 0x7F, + 0xF3, 0x0F, 0x18, 0x1C, 0xC0, 0x73, 0x01, 0x8C, 0x0E, 0x30, 0x38, 0xE3, + 0xE1, 0xFF, 0x83, 0xEC, 0x00, 0x30, 0x01, 0xC0, 0x06, 0x07, 0xF0, 0x1F, + 0x80, 0x1E, 0x01, 0xF0, 0x03, 0x00, 0x18, 0x00, 0xDE, 0x0F, 0xF8, 0x78, + 0xC3, 0x86, 0x18, 0x30, 0xC1, 0x8E, 0x1C, 0x70, 0xE3, 0x06, 0x7E, 0xFF, + 0xE7, 0xE0, 0x03, 0x80, 0x70, 0x00, 0x0F, 0xC1, 0xF0, 0x06, 0x00, 0xC0, + 0x38, 0x07, 0x00, 0xC0, 0x18, 0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x70, + 0x07, 0x00, 0x00, 0xFF, 0x1F, 0xF0, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60, + 0x06, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x1C, 0x03, 0x87, + 0xF0, 0xFE, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0C, 0xFC, + 0x33, 0xE0, 0xDE, 0x07, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF8, 0x06, 0xF0, + 0x39, 0xC3, 0xE7, 0xEF, 0x1F, 0x80, 0x0F, 0x81, 0xF0, 0x06, 0x01, 0xC0, + 0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61, + 0xFF, 0xFF, 0xF8, 0x3F, 0xBC, 0x7F, 0xFC, 0xF3, 0x98, 0xC6, 0x33, 0x9C, + 0xE7, 0x39, 0xCC, 0x63, 0x18, 0xC6, 0x31, 0x8D, 0xF7, 0xBF, 0xEF, 0x78, + 0x3D, 0xE1, 0xFF, 0x8F, 0x8C, 0x38, 0x61, 0x83, 0x0C, 0x18, 0xE1, 0xC7, + 0x0E, 0x30, 0x67, 0xEF, 0xFE, 0x7E, 0x07, 0xC1, 0xFE, 0x38, 0x76, 0x03, + 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x06, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x1E, + 0xFC, 0x1F, 0xFE, 0x0F, 0x87, 0x0F, 0x03, 0x0E, 0x03, 0x0E, 0x03, 0x0E, + 0x07, 0x0E, 0x06, 0x1F, 0x0C, 0x1F, 0xF8, 0x19, 0xF0, 0x18, 0x00, 0x18, + 0x00, 0x38, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xDE, 0x3F, 0xFC, 0xC3, + 0xE3, 0x03, 0x84, 0x07, 0x18, 0x0E, 0x30, 0x1C, 0x60, 0x78, 0xE1, 0xE0, + 0xFF, 0xC0, 0xF9, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x1C, 0x01, 0xFC, 0x03, + 0xF8, 0x1E, 0x78, 0x7F, 0xF0, 0x7C, 0xC3, 0xC0, 0x0E, 0x00, 0x30, 0x00, + 0xC0, 0x03, 0x00, 0x1C, 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0x07, 0xF1, 0xFF, + 0x30, 0x73, 0x86, 0x3F, 0x81, 0xFE, 0x03, 0xE6, 0x06, 0xE0, 0xEF, 0xFC, + 0xFF, 0x00, 0x0C, 0x07, 0x01, 0x83, 0xFF, 0xFF, 0xCE, 0x03, 0x00, 0xC0, + 0x30, 0x1C, 0x07, 0x01, 0x83, 0x7F, 0xCF, 0xC0, 0xF0, 0xFF, 0x1F, 0x60, + 0x76, 0x07, 0x60, 0x76, 0x06, 0x60, 0x66, 0x0E, 0x61, 0xE7, 0xFF, 0x3E, + 0xF0, 0x7E, 0x7E, 0xFC, 0xFC, 0xE0, 0xC0, 0xC3, 0x81, 0x86, 0x03, 0x98, + 0x07, 0x70, 0x06, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x38, 0x00, 0xF8, 0x7F, + 0xE3, 0xE6, 0x63, 0x1B, 0xDC, 0x6F, 0x61, 0xFF, 0x87, 0xFC, 0x1E, 0xF0, + 0x73, 0x81, 0xCE, 0x06, 0x38, 0x00, 0x3E, 0x7C, 0xF9, 0xF1, 0xE7, 0x03, + 0xF8, 0x07, 0xC0, 0x1F, 0x01, 0xFC, 0x0F, 0x38, 0x78, 0xFB, 0xF7, 0xEF, + 0x9F, 0x80, 0x1F, 0x1F, 0x3E, 0x1F, 0x1C, 0x1C, 0x0C, 0x18, 0x0E, 0x38, + 0x0E, 0x70, 0x06, 0x60, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x1F, 0xF1, + 0xFF, 0x38, 0xE3, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC6, 0x38, 0x67, + 0xFE, 0x7F, 0xE0, 0x01, 0xC0, 0xF0, 0x70, 0x18, 0x06, 0x03, 0x80, 0xE0, + 0x30, 0x1C, 0x3E, 0x0F, 0x00, 0x60, 0x18, 0x06, 0x03, 0x80, 0xC0, 0x30, + 0x0F, 0x01, 0xC0, 0x0C, 0x71, 0xC7, 0x18, 0x63, 0x8E, 0x30, 0xC3, 0x1C, + 0x71, 0x86, 0x38, 0xE3, 0x04, 0x00, 0x0E, 0x07, 0x80, 0xC0, 0x60, 0x70, + 0x30, 0x18, 0x0C, 0x06, 0x01, 0xC1, 0xE1, 0xC0, 0xC0, 0xE0, 0x70, 0x30, + 0x38, 0x78, 0x38, 0x00, 0x3C, 0x27, 0xE6, 0xEF, 0xCC, 0x38}; + +const GFXglyph FreeMonoBoldOblique12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 14, 0, 1}, // 0x20 ' ' + {0, 6, 15, 14, 6, -14}, // 0x21 '!' + {12, 8, 7, 14, 6, -13}, // 0x22 '"' + {19, 13, 18, 14, 2, -15}, // 0x23 '#' + {49, 11, 20, 14, 3, -16}, // 0x24 '$' + {77, 11, 15, 14, 3, -14}, // 0x25 '%' + {98, 11, 13, 14, 2, -12}, // 0x26 '&' + {116, 3, 7, 14, 8, -13}, // 0x27 ''' + {119, 7, 19, 14, 7, -14}, // 0x28 '(' + {136, 7, 19, 14, 2, -14}, // 0x29 ')' + {153, 11, 10, 14, 4, -14}, // 0x2A '*' + {167, 12, 13, 14, 3, -12}, // 0x2B '+' + {187, 6, 7, 14, 3, -2}, // 0x2C ',' + {193, 13, 2, 14, 2, -7}, // 0x2D '-' + {197, 3, 3, 14, 6, -2}, // 0x2E '.' + {199, 14, 20, 14, 2, -16}, // 0x2F '/' + {234, 11, 15, 14, 3, -14}, // 0x30 '0' + {255, 11, 15, 14, 2, -14}, // 0x31 '1' + {276, 13, 15, 14, 1, -14}, // 0x32 '2' + {301, 12, 15, 14, 2, -14}, // 0x33 '3' + {324, 11, 14, 14, 3, -13}, // 0x34 '4' + {344, 12, 15, 14, 2, -14}, // 0x35 '5' + {367, 11, 15, 14, 4, -14}, // 0x36 '6' + {388, 11, 15, 14, 4, -14}, // 0x37 '7' + {409, 11, 15, 14, 3, -14}, // 0x38 '8' + {430, 11, 15, 14, 3, -14}, // 0x39 '9' + {451, 5, 11, 14, 5, -10}, // 0x3A ':' + {458, 7, 15, 14, 3, -10}, // 0x3B ';' + {472, 13, 11, 14, 2, -11}, // 0x3C '<' + {490, 13, 7, 14, 2, -9}, // 0x3D '=' + {502, 13, 11, 14, 2, -11}, // 0x3E '>' + {520, 9, 14, 14, 5, -13}, // 0x3F '?' + {536, 12, 19, 14, 2, -14}, // 0x40 '@' + {565, 15, 14, 14, 0, -13}, // 0x41 'A' + {592, 13, 14, 14, 1, -13}, // 0x42 'B' + {615, 14, 14, 14, 2, -13}, // 0x43 'C' + {640, 13, 14, 14, 1, -13}, // 0x44 'D' + {663, 15, 14, 14, 0, -13}, // 0x45 'E' + {690, 16, 14, 14, 0, -13}, // 0x46 'F' + {718, 14, 14, 14, 1, -13}, // 0x47 'G' + {743, 16, 14, 14, 0, -13}, // 0x48 'H' + {771, 12, 14, 14, 2, -13}, // 0x49 'I' + {792, 16, 14, 14, 0, -13}, // 0x4A 'J' + {820, 16, 14, 14, 0, -13}, // 0x4B 'K' + {848, 13, 14, 14, 1, -13}, // 0x4C 'L' + {871, 18, 14, 14, 0, -13}, // 0x4D 'M' + {903, 16, 14, 14, 1, -13}, // 0x4E 'N' + {931, 14, 14, 14, 1, -13}, // 0x4F 'O' + {956, 13, 14, 14, 1, -13}, // 0x50 'P' + {979, 14, 17, 14, 1, -13}, // 0x51 'Q' + {1009, 15, 14, 14, 0, -13}, // 0x52 'R' + {1036, 12, 14, 14, 3, -13}, // 0x53 'S' + {1057, 13, 14, 14, 2, -13}, // 0x54 'T' + {1080, 14, 14, 14, 2, -13}, // 0x55 'U' + {1105, 15, 14, 14, 1, -13}, // 0x56 'V' + {1132, 15, 14, 14, 1, -13}, // 0x57 'W' + {1159, 16, 14, 14, 0, -13}, // 0x58 'X' + {1187, 13, 14, 14, 2, -13}, // 0x59 'Y' + {1210, 14, 14, 14, 1, -13}, // 0x5A 'Z' + {1235, 9, 19, 14, 5, -14}, // 0x5B '[' + {1257, 7, 20, 14, 5, -16}, // 0x5C '\' + {1275, 9, 19, 14, 3, -14}, // 0x5D ']' + {1297, 10, 8, 14, 4, -15}, // 0x5E '^' + {1307, 15, 2, 14, -1, 4}, // 0x5F '_' + {1311, 4, 4, 14, 7, -15}, // 0x60 '`' + {1313, 12, 11, 14, 2, -10}, // 0x61 'a' + {1330, 15, 15, 14, -1, -14}, // 0x62 'b' + {1359, 12, 11, 14, 2, -10}, // 0x63 'c' + {1376, 14, 15, 14, 2, -14}, // 0x64 'd' + {1403, 12, 11, 14, 2, -10}, // 0x65 'e' + {1420, 15, 15, 14, 2, -14}, // 0x66 'f' + {1449, 14, 16, 14, 2, -10}, // 0x67 'g' + {1477, 13, 15, 14, 1, -14}, // 0x68 'h' + {1502, 11, 14, 14, 2, -13}, // 0x69 'i' + {1522, 12, 19, 14, 1, -13}, // 0x6A 'j' + {1551, 14, 15, 14, 1, -14}, // 0x6B 'k' + {1578, 11, 15, 14, 2, -14}, // 0x6C 'l' + {1599, 15, 11, 14, 0, -10}, // 0x6D 'm' + {1620, 13, 11, 14, 1, -10}, // 0x6E 'n' + {1638, 12, 11, 14, 2, -10}, // 0x6F 'o' + {1655, 16, 16, 14, -1, -10}, // 0x70 'p' + {1687, 15, 16, 14, 1, -10}, // 0x71 'q' + {1717, 14, 11, 14, 1, -10}, // 0x72 'r' + {1737, 12, 11, 14, 2, -10}, // 0x73 's' + {1754, 10, 14, 14, 2, -13}, // 0x74 't' + {1772, 12, 11, 14, 2, -10}, // 0x75 'u' + {1789, 15, 11, 14, 1, -10}, // 0x76 'v' + {1810, 14, 11, 14, 2, -10}, // 0x77 'w' + {1830, 14, 11, 14, 1, -10}, // 0x78 'x' + {1850, 16, 16, 14, 0, -10}, // 0x79 'y' + {1882, 12, 11, 14, 2, -10}, // 0x7A 'z' + {1899, 10, 19, 14, 4, -14}, // 0x7B '{' + {1923, 6, 19, 14, 5, -14}, // 0x7C '|' + {1938, 9, 19, 14, 3, -14}, // 0x7D '}' + {1960, 12, 4, 14, 3, -7}}; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique12pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique12pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique12pt7bGlyphs, 0x20, 0x7E, 24}; + +// Approx. 2638 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h new file mode 100644 index 0000000..0400f25 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h @@ -0,0 +1,462 @@ +#pragma once +#include + +const uint8_t FreeMonoBoldOblique18pt7bBitmaps[] PROGMEM = { + 0x0F, 0x07, 0xC7, 0xE3, 0xF1, 0xF0, 0xF8, 0xFC, 0x7C, 0x3E, 0x1F, 0x0F, + 0x07, 0x87, 0xC3, 0xC1, 0xE0, 0x60, 0x00, 0x38, 0x3E, 0x1F, 0x0F, 0x83, + 0x80, 0xF8, 0xFF, 0x0E, 0xF1, 0xEF, 0x1E, 0xE1, 0xCE, 0x1C, 0xC1, 0xCC, + 0x18, 0xC1, 0x88, 0x18, 0x00, 0xE3, 0x80, 0x79, 0xE0, 0x1C, 0x70, 0x07, + 0x1C, 0x03, 0xCF, 0x00, 0xF3, 0xC0, 0x38, 0xE0, 0x7F, 0xFF, 0x3F, 0xFF, + 0xCF, 0xFF, 0xF3, 0xFF, 0xF8, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0x8E, 0x0F, + 0xFF, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F, 0xFF, 0x83, 0xCF, 0x00, 0xF3, + 0xC0, 0x38, 0xE0, 0x1E, 0x78, 0x07, 0x9E, 0x01, 0xC7, 0x00, 0x71, 0xC0, + 0x00, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xF0, 0x03, 0xFF, + 0x81, 0xFF, 0xF0, 0xFF, 0xF8, 0x3C, 0x1E, 0x1E, 0x07, 0x87, 0x80, 0x01, + 0xF0, 0x00, 0x7F, 0xC0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x07, 0xF0, 0x00, + 0x3C, 0x70, 0x0F, 0x3C, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xF8, 0xFF, 0xFC, + 0x3F, 0xFE, 0x0C, 0xFE, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, + 0xF0, 0x00, 0x18, 0x00, 0x03, 0xC0, 0x0F, 0xE0, 0x1C, 0x70, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x70, 0x38, 0xE0, 0x1F, 0xC3, 0x0F, 0x1F, 0x01, 0xFC, + 0x0F, 0xE0, 0x7F, 0x00, 0xF8, 0xF0, 0x83, 0xF8, 0x07, 0x1C, 0x0E, 0x0C, + 0x0C, 0x0C, 0x0C, 0x1C, 0x0E, 0x38, 0x07, 0xF0, 0x03, 0xC0, 0x00, 0x7A, + 0x01, 0xFF, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0x9C, 0x0F, 0x00, 0x0F, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x1F, 0x80, 0x3F, 0xC0, 0x7F, 0xCF, 0x79, 0xFF, + 0xF1, 0xFE, 0xF1, 0xFC, 0xF0, 0xF8, 0xFF, 0xFE, 0xFF, 0xFE, 0x7F, 0xFE, + 0x1F, 0xBC, 0x7B, 0xFD, 0xEF, 0x73, 0x9C, 0xC6, 0x00, 0x01, 0xC0, 0xF0, + 0x3C, 0x1E, 0x0F, 0x03, 0xC1, 0xE0, 0x70, 0x3C, 0x0F, 0x07, 0x81, 0xE0, + 0x78, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3E, + 0x07, 0x81, 0xE0, 0x7C, 0x1F, 0x03, 0x80, 0x07, 0x03, 0xC0, 0xF8, 0x3E, + 0x07, 0x81, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x78, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x3C, 0x1E, 0x07, 0x83, 0xC1, + 0xE0, 0x78, 0x3C, 0x0E, 0x00, 0x00, 0xC0, 0x03, 0xC0, 0x07, 0x00, 0x0E, + 0x02, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x1F, 0xF0, 0x1F, 0x80, + 0x7F, 0x81, 0xEF, 0x07, 0x8F, 0x0F, 0x1E, 0x08, 0x10, 0x00, 0x00, 0x70, + 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00, + 0x1E, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F, + 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, + 0x01, 0xC0, 0x00, 0x70, 0x00, 0x0F, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1, + 0xC0, 0xC0, 0xE0, 0x60, 0x00, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x38, 0x00, 0x03, 0xC0, + 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, + 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x01, 0xFF, + 0x01, 0xFF, 0xC1, 0xFF, 0xE1, 0xF1, 0xF9, 0xE0, 0x7C, 0xF0, 0x1E, 0xF0, + 0x0F, 0x78, 0x07, 0xB8, 0x03, 0x9C, 0x03, 0xDE, 0x01, 0xCF, 0x00, 0xE7, + 0x00, 0x73, 0xC0, 0x79, 0xE0, 0x3C, 0xF0, 0x1C, 0x78, 0x1E, 0x3E, 0x1E, + 0x0F, 0xFF, 0x07, 0xFF, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x03, + 0xF8, 0x0F, 0xE0, 0x7F, 0xC0, 0xF7, 0x81, 0x8F, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x3C, 0x00, + 0x78, 0x00, 0xF0, 0x01, 0xC0, 0x03, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x07, 0xFC, 0x00, 0xFF, 0xE0, 0x1F, + 0xFF, 0x03, 0xC1, 0xF0, 0x78, 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0F, 0x00, + 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x3F, 0x00, + 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, + 0x3F, 0x03, 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x87, 0xFF, 0xF8, 0xFF, 0xFF, + 0x00, 0x00, 0xFE, 0x00, 0xFF, 0xC0, 0x7F, 0xF8, 0x3F, 0xFF, 0x0E, 0x07, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xFF, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, + 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xF1, 0xFF, 0xF8, 0xFF, 0xFC, + 0x3F, 0xFE, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, + 0xFE, 0x00, 0xFE, 0x01, 0xEE, 0x03, 0xDE, 0x07, 0x9E, 0x0F, 0x1C, 0x1E, + 0x1C, 0x3C, 0x3C, 0x78, 0x3C, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFC, 0x00, 0x70, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07, + 0xFF, 0xC1, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xE0, 0x00, 0x3B, 0xE0, 0x1F, 0xFE, 0x07, 0xFF, 0xC1, 0xFF, 0xF8, + 0x78, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, + 0x0F, 0x18, 0x0F, 0xCF, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF0, + 0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xFC, 0x03, 0xFF, 0x81, 0xFF, 0xE0, 0x7F, + 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x9F, + 0x01, 0xEF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xF1, 0xFC, 0x3E, 0x3E, 0x03, + 0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E, 0x03, 0xC3, 0xE0, 0xF8, 0x7F, 0xFE, + 0x07, 0xFF, 0x80, 0x7F, 0xE0, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, + 0x00, 0x78, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xC0, + 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, + 0xFF, 0xF0, 0xF8, 0x3E, 0x3E, 0x03, 0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E, + 0x03, 0xC3, 0xE0, 0xF0, 0x3F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xE0, 0x7F, + 0xFE, 0x1F, 0x83, 0xE3, 0xC0, 0x3C, 0xF0, 0x07, 0x9E, 0x01, 0xF3, 0xE0, + 0x7C, 0x7F, 0xFF, 0x87, 0xFF, 0xE0, 0x7F, 0xF0, 0x03, 0xF8, 0x00, 0x00, + 0x7E, 0x00, 0x7F, 0xC0, 0x3F, 0xF8, 0x1F, 0xFE, 0x0F, 0x87, 0xC3, 0xC0, + 0xF1, 0xE0, 0x3C, 0x78, 0x0F, 0x1E, 0x03, 0xC7, 0x81, 0xF1, 0xF1, 0xFC, + 0x7F, 0xFE, 0x0F, 0xFF, 0x81, 0xFD, 0xE0, 0x3E, 0xF0, 0x00, 0x7C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x81, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xE0, + 0x07, 0xE0, 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8F, 0x9F, 0x3E, 0x38, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0xF0, 0x1E, + 0x07, 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x30, 0x0E, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, + 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0x38, + 0x3F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x9F, 0xFF, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xF0, + 0x00, 0x00, 0x03, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, + 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x0F, 0xE0, + 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0x3E, 0x00, 0x07, + 0x00, 0x00, 0x07, 0xE0, 0xFF, 0xC7, 0xFF, 0xBF, 0xFF, 0xF0, 0x7F, 0x80, + 0xFE, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x0F, 0xE1, 0xFE, 0x0F, 0xF0, 0x7E, + 0x01, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0x70, 0x00, 0x00, 0x3E, 0x00, 0x3F, 0xE0, 0x1F, 0xF8, 0x0F, 0x0F, + 0x07, 0x01, 0xC3, 0x80, 0x71, 0xE0, 0x1C, 0x70, 0x0E, 0x18, 0x0F, 0x8E, + 0x1F, 0xE3, 0x8F, 0xF0, 0xE7, 0x9C, 0x33, 0xC7, 0x1C, 0xE1, 0xC7, 0x38, + 0x71, 0xCF, 0x18, 0x73, 0xFE, 0x38, 0x7F, 0xCE, 0x0F, 0xF3, 0x80, 0x00, + 0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0xC0, 0x7F, 0xF0, 0x0F, + 0xF8, 0x01, 0xF8, 0x00, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8, + 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xBC, 0x00, + 0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x07, 0x87, 0x80, 0x1E, 0x1E, 0x00, 0xF0, + 0x78, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, + 0x1E, 0x00, 0xF1, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF, + 0x07, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF, + 0xF0, 0x38, 0x0F, 0x81, 0xC0, 0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x3E, 0x07, + 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0xE0, 0x1F, + 0x87, 0x00, 0x3C, 0x38, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0xF3, 0xFF, + 0xFF, 0xBF, 0xFF, 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0x00, 0x00, 0x7F, + 0x30, 0x0F, 0xFF, 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, 0xF8, 0x3F, 0x1F, + 0x00, 0x78, 0xF0, 0x03, 0xCF, 0x80, 0x1C, 0x78, 0x00, 0x03, 0xC0, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, + 0x00, 0x1F, 0x00, 0x38, 0x7E, 0x07, 0xC3, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, + 0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xFF, 0x80, 0x7F, 0xFE, 0x07, + 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x78, 0x1F, 0x03, 0x80, 0x7C, 0x1C, 0x01, + 0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x03, 0xC3, 0x80, 0x1E, 0x1C, + 0x00, 0xF1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x07, 0xC3, 0x80, 0x7C, + 0x3C, 0x07, 0xC3, 0xFF, 0xFC, 0x3F, 0xFF, 0xC1, 0xFF, 0xFC, 0x0F, 0xFF, + 0x80, 0x00, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC3, 0xFF, + 0xFF, 0x03, 0xC0, 0x3C, 0x0F, 0x00, 0xE0, 0x3C, 0x73, 0x80, 0xE3, 0xCC, + 0x03, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, + 0x1E, 0x00, 0x3C, 0x70, 0x00, 0xF0, 0x07, 0x03, 0xC0, 0x1C, 0x0E, 0x00, + 0xF1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE0, + 0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, + 0x3C, 0x01, 0xC0, 0x70, 0x07, 0x80, 0xE1, 0x8E, 0x03, 0xC7, 0x1C, 0x07, + 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0xF1, + 0xC0, 0x01, 0xE3, 0x80, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, + 0x00, 0x00, 0x3F, 0x18, 0x0F, 0xFF, 0xC0, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0, + 0xFC, 0x0F, 0x0F, 0x80, 0x38, 0xF8, 0x01, 0x87, 0x80, 0x00, 0x78, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x7F, 0xEF, 0x07, 0xFF, 0x78, + 0x3F, 0xFB, 0xC0, 0xFF, 0x9E, 0x00, 0x38, 0xFC, 0x03, 0xC3, 0xFF, 0xFE, + 0x1F, 0xFF, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xF8, 0xFE, + 0x0F, 0xF3, 0xFC, 0x1F, 0xE7, 0xF8, 0x3F, 0x8F, 0xE0, 0x3C, 0x07, 0x80, + 0x70, 0x0E, 0x00, 0xE0, 0x1C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x0F, + 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xE0, + 0x3C, 0x03, 0x80, 0x70, 0x07, 0x00, 0xE0, 0x1E, 0x03, 0xC0, 0xFF, 0x1F, + 0xE1, 0xFE, 0x7F, 0xC7, 0xFC, 0xFF, 0x87, 0xF1, 0xFE, 0x00, 0x07, 0xFF, + 0xE1, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, 0xE0, 0x07, 0x80, 0x00, 0xE0, + 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0x80, + 0x00, 0x70, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0E, 0x00, + 0x01, 0xC0, 0x0F, 0xFF, 0xC3, 0xFF, 0xF8, 0x7F, 0xFF, 0x07, 0xFF, 0xE0, + 0x00, 0x3F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, + 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x1C, 0x03, 0x80, + 0x78, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xC0, 0x38, 0x07, 0x80, 0x70, 0x1F, + 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFC, 0x00, + 0x00, 0x07, 0xF8, 0xFC, 0x1F, 0xFB, 0xFC, 0x3F, 0xE7, 0xF0, 0x7F, 0xCF, + 0xE0, 0x3C, 0x1E, 0x00, 0x70, 0xF8, 0x00, 0xE3, 0xE0, 0x03, 0xCF, 0x00, + 0x07, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, + 0xF9, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x83, 0xE0, 0x07, 0x03, 0xC0, 0x1E, + 0x07, 0x80, 0xFF, 0x8F, 0xE3, 0xFF, 0x0F, 0xC7, 0xFE, 0x1F, 0x8F, 0xF8, + 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0xFF, 0xF0, 0x1F, 0xFE, 0x00, 0xFF, 0xE0, + 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0xC0, + 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, 0x60, 0x78, + 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0E, 0x07, 0x00, 0xE7, 0xFF, 0xFE, 0xFF, + 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x0F, 0xC0, 0x1F, 0x87, 0xE0, + 0x0F, 0xC7, 0xF8, 0x0F, 0xE1, 0xFC, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x3F, + 0x07, 0xF0, 0x3F, 0xC7, 0xF8, 0x1F, 0xE3, 0xF8, 0x0E, 0xF3, 0xDC, 0x07, + 0x7B, 0xDE, 0x03, 0x9F, 0xEF, 0x03, 0xCF, 0xE7, 0x81, 0xE7, 0xE3, 0x80, + 0xE3, 0xF1, 0xC0, 0x70, 0xF1, 0xE0, 0x38, 0x70, 0xF0, 0x3C, 0x00, 0x70, + 0x3F, 0xC1, 0xFE, 0x3F, 0xE1, 0xFF, 0x1F, 0xF0, 0xFF, 0x8F, 0xF0, 0x7F, + 0x80, 0x0F, 0xC1, 0xFE, 0x1F, 0xC1, 0xFF, 0x1F, 0xC3, 0xFE, 0x1F, 0xE1, + 0xFE, 0x07, 0xE0, 0x38, 0x07, 0xF0, 0x78, 0x07, 0xF0, 0x78, 0x0F, 0xF8, + 0x70, 0x0F, 0x78, 0x70, 0x0E, 0x78, 0xF0, 0x0E, 0x7C, 0xF0, 0x1E, 0x3C, + 0xF0, 0x1E, 0x3E, 0xE0, 0x1E, 0x1E, 0xE0, 0x1C, 0x1F, 0xE0, 0x1C, 0x0F, + 0xE0, 0x3C, 0x0F, 0xE0, 0x7F, 0x87, 0xC0, 0xFF, 0x87, 0xC0, 0xFF, 0x87, + 0xC0, 0xFF, 0x03, 0xC0, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF, 0xC0, + 0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x0F, + 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x01, + 0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87, 0xFF, + 0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x00, 0x0F, 0xFF, 0x80, + 0x7F, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x38, 0x0F, 0x81, 0xC0, + 0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x0F, 0x07, 0x00, 0xF0, 0x38, 0x0F, 0x83, + 0xFF, 0xF8, 0x1F, 0xFF, 0x80, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x38, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, + 0xE0, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF, + 0xC0, 0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, + 0x0F, 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x01, 0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87, + 0xFF, 0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x01, 0xFE, 0x30, + 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFF, 0x07, 0x83, 0xC0, 0x07, 0xFF, + 0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x03, 0xFF, 0xFE, 0x03, 0xC0, 0xF8, + 0x0E, 0x01, 0xE0, 0x38, 0x07, 0x81, 0xE0, 0x3E, 0x07, 0x83, 0xF0, 0x1F, + 0xFF, 0x80, 0x7F, 0xFC, 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x3C, 0x3E, + 0x00, 0xE0, 0x7C, 0x03, 0x80, 0xF0, 0x1E, 0x03, 0xE1, 0xFF, 0x07, 0xFF, + 0xFC, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xF8, 0x00, 0x7C, 0xE0, 0x7F, + 0xFC, 0x1F, 0xFF, 0x87, 0xFF, 0xE0, 0xF8, 0x7C, 0x3C, 0x07, 0x87, 0x80, + 0xE0, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x3F, 0xF8, 0x03, 0xFF, + 0x80, 0x07, 0xF8, 0x40, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xFC, 0x1F, + 0x1F, 0xFF, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0x7F, 0xFF, + 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x0E, 0x1F, 0xE1, 0xC3, + 0xBC, 0x78, 0x77, 0x0F, 0x1E, 0xE1, 0xC1, 0x80, 0x38, 0x00, 0x0F, 0x00, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x3C, 0x00, + 0x07, 0x80, 0x0F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xFF, 0x00, + 0x7F, 0x8F, 0xF3, 0xFE, 0x7F, 0xDF, 0xF7, 0xFC, 0xFF, 0x1F, 0xE3, 0xC0, + 0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0F, 0x0F, 0x00, 0x70, 0x78, 0x03, 0x83, + 0xC0, 0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0E, 0x0F, 0x00, 0x70, 0x78, 0x03, + 0x83, 0xC0, 0x3C, 0x1F, 0x01, 0xC0, 0xFC, 0x3E, 0x03, 0xFF, 0xE0, 0x1F, + 0xFE, 0x00, 0x7F, 0xE0, 0x00, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0xFF, + 0x87, 0xFF, 0xFF, 0x0F, 0xFB, 0xFC, 0x1F, 0xE1, 0xC0, 0x0F, 0x03, 0xC0, + 0x1C, 0x07, 0x80, 0x78, 0x0F, 0x01, 0xE0, 0x1E, 0x03, 0x80, 0x1E, 0x0F, + 0x00, 0x3C, 0x3C, 0x00, 0x78, 0x70, 0x00, 0xF1, 0xE0, 0x01, 0xE7, 0x80, + 0x01, 0xEF, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, + 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7F, 0x87, 0xFF, + 0xFF, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFE, 0x78, 0x00, 0xF1, 0xE3, + 0xC3, 0x87, 0x8F, 0x0E, 0x1E, 0x7C, 0x78, 0x79, 0xF9, 0xC1, 0xEF, 0xEF, + 0x07, 0xBF, 0xBC, 0x1D, 0xFE, 0xE0, 0x77, 0x7F, 0x81, 0xFD, 0xFE, 0x07, + 0xE3, 0xF0, 0x3F, 0x8F, 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0xF8, 0x0F, 0x83, + 0xE0, 0x3E, 0x0F, 0x80, 0xF0, 0x3C, 0x00, 0x07, 0xE0, 0x7E, 0x0F, 0xF0, + 0xFF, 0x0F, 0xF0, 0xFE, 0x0F, 0xE0, 0xFE, 0x03, 0xC0, 0xF8, 0x01, 0xE1, + 0xE0, 0x01, 0xF3, 0xC0, 0x00, 0xF7, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xEF, + 0x00, 0x07, 0xCF, 0x80, 0x0F, 0x87, 0xC0, 0x1F, 0x03, 0xC0, 0x7F, 0x07, + 0xF0, 0xFF, 0x8F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xE0, 0x7E, 0x0F, + 0xEF, 0xF0, 0xFF, 0xFF, 0x0F, 0xEF, 0xE0, 0xFE, 0x3C, 0x0F, 0x01, 0xE1, + 0xE0, 0x1E, 0x3E, 0x00, 0xF7, 0xC0, 0x0F, 0xF8, 0x00, 0x7F, 0x00, 0x07, + 0xE0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, + 0x78, 0x00, 0x07, 0x00, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xE0, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, + 0xF0, 0xF0, 0x7C, 0x1C, 0x1F, 0x03, 0x87, 0xC0, 0x61, 0xF0, 0x00, 0x7C, + 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x07, + 0x07, 0xC0, 0xE1, 0xF0, 0x3C, 0x7C, 0x07, 0x9F, 0xFF, 0xF3, 0xFF, 0xFC, + 0x7F, 0xFF, 0x8F, 0xFF, 0xF0, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, + 0x70, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00, + 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, + 0x80, 0xE0, 0x38, 0x0F, 0x03, 0xC0, 0xF0, 0x1C, 0x07, 0x81, 0xE0, 0x78, + 0x0E, 0x03, 0xC0, 0xF0, 0x3C, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, + 0xF0, 0x3C, 0x0F, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, 0xF0, 0x3C, 0x06, + 0x07, 0xF8, 0x3F, 0xC1, 0xFC, 0x0F, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x1C, 0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, + 0x1C, 0x0F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x80, 0x00, 0x40, 0x01, 0x80, + 0x07, 0x80, 0x3F, 0x80, 0xFF, 0x03, 0xFF, 0x0F, 0x9F, 0x3E, 0x1E, 0xF8, + 0x3F, 0xE0, 0x3F, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0xC3, 0xC7, 0x0E, 0x3C, 0x30, 0x00, 0xFE, 0x00, + 0x7F, 0xF0, 0x1F, 0xFF, 0x03, 0xFF, 0xE0, 0x00, 0x3C, 0x07, 0xFF, 0x83, + 0xFF, 0xF0, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0x80, 0xF3, 0xE0, 0x1E, 0x78, + 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xF8, 0xFE, 0x7E, 0x07, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xC0, + 0x00, 0x0F, 0x00, 0x00, 0x3C, 0xFC, 0x00, 0xEF, 0xFC, 0x03, 0xFF, 0xF8, + 0x1F, 0xFF, 0xE0, 0x7E, 0x0F, 0xC1, 0xE0, 0x1F, 0x07, 0x00, 0x3C, 0x1C, + 0x00, 0xF0, 0xE0, 0x03, 0xC3, 0x80, 0x1E, 0x0F, 0x00, 0xF8, 0x3E, 0x07, + 0xC7, 0xFF, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0x81, 0xF1, 0xF8, 0x00, + 0x00, 0xFE, 0x60, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xF0, 0x3C, + 0xF8, 0x03, 0x9E, 0x00, 0x67, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, + 0xC0, 0x00, 0x7E, 0x01, 0xC7, 0xFF, 0xF8, 0xFF, 0xFE, 0x0F, 0xFF, 0x80, + 0x7F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, 0x07, 0xE3, 0x80, 0xFF, 0xDC, 0x0F, + 0xFF, 0xE0, 0xFF, 0xFF, 0x0F, 0xC1, 0xF0, 0xF8, 0x07, 0x87, 0x80, 0x1C, + 0x78, 0x00, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x70, 0xF0, 0x07, 0x87, 0xE0, + 0xFC, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFE, 0x07, 0xE3, 0xE0, + 0x00, 0xFC, 0x01, 0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0xFE, 0x3E, 0x0F, 0xCE, + 0x00, 0xF7, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x1E, 0xFF, 0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0, 0x3F, 0xF0, + 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0xC0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, + 0xFF, 0xFC, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x01, 0xC0, + 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x1F, + 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0x01, 0xF9, + 0xF8, 0x3F, 0xFF, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xE3, 0xE0, 0xFC, 0x3E, + 0x03, 0xE1, 0xE0, 0x0E, 0x1E, 0x00, 0x70, 0xF0, 0x03, 0x87, 0x80, 0x3C, + 0x3E, 0x03, 0xE1, 0xF8, 0x7E, 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xFF, + 0xFC, 0x01, 0xF9, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, + 0x7F, 0xF8, 0x07, 0xFF, 0x80, 0x3F, 0xF8, 0x00, 0xFF, 0x00, 0x00, 0x0F, + 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03, 0xC0, 0x00, + 0x38, 0x00, 0x03, 0x9F, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFE, + 0x07, 0xC3, 0xE0, 0x70, 0x1E, 0x0F, 0x01, 0xC0, 0xF0, 0x1C, 0x0E, 0x03, + 0xC0, 0xE0, 0x3C, 0x1E, 0x03, 0x81, 0xE0, 0x38, 0x7F, 0x0F, 0xFF, 0xF8, + 0xFF, 0xFF, 0x8F, 0xF7, 0xF0, 0xFE, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xF0, + 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, + 0x01, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0xFF, 0x81, 0xFF, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, + 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x78, 0x00, + 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x1F, 0xFE, + 0x0F, 0xFF, 0x03, 0xFF, 0x80, 0x7F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0xFE, + 0x00, 0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, + 0xCF, 0xF0, 0x3C, 0xFF, 0x03, 0x9F, 0xF0, 0x38, 0xFE, 0x07, 0xBF, 0x00, + 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0, + 0x0F, 0x7E, 0x00, 0xE3, 0xF0, 0x7E, 0x1F, 0xE7, 0xE1, 0xFE, 0xFE, 0x3F, + 0xE7, 0xE1, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x00, + 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, + 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, + 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, + 0x7C, 0x78, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF0, 0xF1, + 0xF1, 0xE1, 0xC3, 0x83, 0xC7, 0x87, 0x07, 0x8F, 0x0E, 0x0E, 0x1C, 0x3C, + 0x1C, 0x38, 0x78, 0x78, 0x70, 0xE0, 0xF1, 0xE1, 0xC1, 0xC7, 0xE3, 0xC3, + 0xFF, 0xCF, 0xC7, 0xFF, 0x9F, 0x9F, 0xFF, 0x3E, 0x3E, 0x0F, 0x8F, 0x80, + 0xFD, 0xFF, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xE0, 0x7E, 0x1F, 0x07, 0xC0, + 0x78, 0x3C, 0x03, 0x81, 0xE0, 0x1C, 0x0E, 0x01, 0xE0, 0x70, 0x0F, 0x07, + 0x80, 0x70, 0x3C, 0x03, 0x87, 0xF0, 0x3F, 0x7F, 0xC3, 0xFF, 0xFE, 0x1F, + 0xEF, 0xE0, 0xFE, 0x01, 0xFC, 0x01, 0xFF, 0x80, 0xFF, 0xF8, 0x7F, 0xFE, + 0x3E, 0x0F, 0xDF, 0x01, 0xF7, 0x80, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, + 0x01, 0xEF, 0x80, 0xFB, 0xF0, 0x7C, 0x7F, 0xFF, 0x1F, 0xFF, 0x03, 0xFF, + 0x80, 0x3F, 0x80, 0x07, 0xC7, 0xE0, 0x1F, 0xBF, 0xF0, 0x3F, 0xFF, 0xF0, + 0x7F, 0xFF, 0xE0, 0x3F, 0x07, 0xE0, 0x78, 0x03, 0xC0, 0xE0, 0x07, 0x81, + 0xC0, 0x0F, 0x07, 0x00, 0x1E, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xF0, 0x3E, + 0x07, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFE, 0x03, 0xDF, 0xF0, 0x07, 0x1F, + 0x80, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFE, 0x00, + 0x0F, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x01, 0xF8, + 0xF8, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x3E, 0x07, 0xC1, + 0xF0, 0x0F, 0x07, 0x80, 0x1C, 0x3C, 0x00, 0x70, 0xF0, 0x03, 0x83, 0xC0, + 0x0E, 0x0F, 0x80, 0x78, 0x3F, 0x07, 0xE0, 0x7F, 0xFF, 0x81, 0xFF, 0xFC, + 0x03, 0xFF, 0x70, 0x03, 0xF3, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xE0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, + 0xF8, 0x00, 0x0F, 0xC3, 0xC1, 0xFC, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFE, + 0x03, 0xFC, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x07, 0x80, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0xFC, 0x0F, 0xFF, + 0xE0, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x03, 0xF3, 0x0F, 0xFF, 0x3F, 0xFF, + 0x3F, 0xFF, 0x7C, 0x0E, 0x78, 0x00, 0x7F, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF, + 0x00, 0x3F, 0x70, 0x0F, 0xF8, 0x1F, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, + 0x0F, 0xE0, 0x06, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x7F, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFC, 0x1C, 0x00, 0x3C, 0x00, + 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0x7C, 0x0E, + 0x7F, 0xFF, 0x7F, 0xFE, 0x3F, 0xFC, 0x0F, 0xE0, 0x7C, 0x0F, 0xFF, 0x07, + 0xFF, 0x81, 0xFF, 0xE0, 0x7E, 0x78, 0x03, 0x9E, 0x00, 0xE7, 0x80, 0x79, + 0xE0, 0x1E, 0x78, 0x07, 0x1E, 0x01, 0xC7, 0x80, 0xF1, 0xE0, 0xFC, 0x7F, + 0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF8, 0x3E, 0x7C, 0x7F, 0x87, 0xFF, 0xFC, + 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, 0xE1, 0xE0, 0x3C, 0x0F, 0x03, 0xC0, + 0x78, 0x3C, 0x01, 0xE1, 0xC0, 0x0F, 0x1E, 0x00, 0x79, 0xE0, 0x03, 0xCE, + 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x80, 0x00, + 0x78, 0x00, 0x7E, 0x03, 0xF7, 0xF0, 0x3F, 0xFF, 0x81, 0xFD, 0xF8, 0x0F, + 0xE7, 0x8E, 0x1C, 0x3C, 0xF9, 0xE1, 0xE7, 0xCE, 0x0F, 0x7E, 0xF0, 0x7B, + 0xF7, 0x03, 0xFF, 0xF8, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0, + 0x3E, 0x3E, 0x01, 0xF1, 0xF0, 0x0F, 0x07, 0x00, 0x0F, 0xE3, 0xF8, 0xFF, + 0x1F, 0xC7, 0xF9, 0xFE, 0x1F, 0x87, 0xF0, 0x7E, 0x7C, 0x01, 0xFF, 0xC0, + 0x07, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x01, 0xF7, + 0xC0, 0x1F, 0x1F, 0x03, 0xF0, 0x7C, 0x7F, 0xCF, 0xFB, 0xFE, 0x7F, 0xDF, + 0xE3, 0xFC, 0x07, 0xF0, 0x7F, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x07, + 0xE0, 0xFE, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0xF0, 0x01, + 0xE1, 0xE0, 0x01, 0xE1, 0xC0, 0x01, 0xE3, 0xC0, 0x00, 0xF7, 0x80, 0x00, + 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, + 0xF0, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF0, 0x00, 0x1F, + 0xFF, 0xC7, 0xFF, 0xF1, 0xFF, 0xF8, 0xFF, 0xFE, 0x3C, 0x1F, 0x0E, 0x1F, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF8, 0x3C, 0xFF, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xE3, 0xFF, 0xF8, 0x00, + 0xF0, 0x1F, 0x03, 0xF0, 0x7E, 0x07, 0x80, 0x70, 0x0F, 0x00, 0xF0, 0x0E, + 0x00, 0xE0, 0x1E, 0x01, 0xC0, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0xC0, 0x3C, + 0x03, 0xC0, 0x38, 0x03, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0xE0, 0x7E, + 0x03, 0xE0, 0x1C, 0x00, 0x02, 0x07, 0x07, 0x0F, 0x0F, 0x0E, 0x0E, 0x0E, + 0x1E, 0x1E, 0x1C, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x78, 0x78, + 0x70, 0x70, 0x70, 0xF0, 0xF0, 0xE0, 0xE0, 0x01, 0xC0, 0x1F, 0x00, 0xFC, + 0x07, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x0F, 0x00, + 0x78, 0x03, 0xC0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x3F, 0x03, 0xC0, 0x1C, + 0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x0F, 0xE0, 0x7E, 0x07, + 0xE0, 0x1E, 0x00, 0x0F, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xFF, 0xFC, 0xFF, + 0x3F, 0xFF, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0xF0}; + +const GFXglyph FreeMonoBoldOblique18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 21, 0, 1}, // 0x20 ' ' + {0, 9, 22, 21, 9, -21}, // 0x21 '!' + {25, 12, 10, 21, 9, -20}, // 0x22 '"' + {40, 18, 25, 21, 4, -22}, // 0x23 '#' + {97, 18, 28, 21, 4, -23}, // 0x24 '$' + {160, 16, 21, 21, 5, -20}, // 0x25 '%' + {202, 16, 20, 21, 4, -19}, // 0x26 '&' + {242, 5, 10, 21, 12, -20}, // 0x27 ''' + {249, 10, 27, 21, 11, -21}, // 0x28 '(' + {283, 10, 27, 21, 4, -21}, // 0x29 ')' + {317, 15, 15, 21, 6, -21}, // 0x2A '*' + {346, 18, 19, 21, 4, -18}, // 0x2B '+' + {389, 9, 10, 21, 4, -3}, // 0x2C ',' + {401, 18, 4, 21, 4, -11}, // 0x2D '-' + {410, 5, 5, 21, 8, -4}, // 0x2E '.' + {414, 21, 28, 21, 2, -23}, // 0x2F '/' + {488, 17, 23, 21, 5, -22}, // 0x30 '0' + {537, 15, 22, 21, 3, -21}, // 0x31 '1' + {579, 20, 23, 21, 2, -22}, // 0x32 '2' + {637, 18, 23, 21, 3, -22}, // 0x33 '3' + {689, 16, 21, 21, 4, -20}, // 0x34 '4' + {731, 18, 22, 21, 4, -21}, // 0x35 '5' + {781, 19, 23, 21, 5, -22}, // 0x36 '6' + {836, 16, 22, 21, 6, -21}, // 0x37 '7' + {880, 19, 23, 21, 3, -22}, // 0x38 '8' + {935, 18, 23, 21, 4, -22}, // 0x39 '9' + {987, 7, 16, 21, 9, -15}, // 0x3A ':' + {1001, 11, 22, 21, 4, -15}, // 0x3B ';' + {1032, 18, 16, 21, 4, -17}, // 0x3C '<' + {1068, 19, 10, 21, 3, -14}, // 0x3D '=' + {1092, 19, 16, 21, 3, -17}, // 0x3E '>' + {1130, 14, 21, 21, 8, -20}, // 0x3F '?' + {1167, 18, 27, 21, 3, -21}, // 0x40 '@' + {1228, 22, 21, 21, 0, -20}, // 0x41 'A' + {1286, 21, 21, 21, 1, -20}, // 0x42 'B' + {1342, 21, 21, 21, 2, -20}, // 0x43 'C' + {1398, 21, 21, 21, 1, -20}, // 0x44 'D' + {1454, 22, 21, 21, 0, -20}, // 0x45 'E' + {1512, 23, 21, 21, 0, -20}, // 0x46 'F' + {1573, 21, 21, 21, 2, -20}, // 0x47 'G' + {1629, 23, 21, 21, 0, -20}, // 0x48 'H' + {1690, 19, 21, 21, 2, -20}, // 0x49 'I' + {1740, 23, 21, 21, 0, -20}, // 0x4A 'J' + {1801, 23, 21, 21, 0, -20}, // 0x4B 'K' + {1862, 20, 21, 21, 1, -20}, // 0x4C 'L' + {1915, 25, 21, 21, 0, -20}, // 0x4D 'M' + {1981, 24, 21, 21, 1, -20}, // 0x4E 'N' + {2044, 20, 21, 21, 2, -20}, // 0x4F 'O' + {2097, 21, 21, 21, 1, -20}, // 0x50 'P' + {2153, 20, 26, 21, 2, -20}, // 0x51 'Q' + {2218, 22, 21, 21, 0, -20}, // 0x52 'R' + {2276, 19, 21, 21, 3, -20}, // 0x53 'S' + {2326, 19, 21, 21, 3, -20}, // 0x54 'T' + {2376, 21, 21, 21, 3, -20}, // 0x55 'U' + {2432, 23, 21, 21, 1, -20}, // 0x56 'V' + {2493, 22, 21, 21, 2, -20}, // 0x57 'W' + {2551, 24, 21, 21, 0, -20}, // 0x58 'X' + {2614, 20, 21, 21, 3, -20}, // 0x59 'Y' + {2667, 19, 21, 21, 2, -20}, // 0x5A 'Z' + {2717, 13, 27, 21, 8, -21}, // 0x5B '[' + {2761, 10, 28, 21, 8, -23}, // 0x5C '\' + {2796, 13, 27, 21, 4, -21}, // 0x5D ']' + {2840, 15, 11, 21, 6, -21}, // 0x5E '^' + {2861, 21, 4, 21, -1, 4}, // 0x5F '_' + {2872, 6, 6, 21, 10, -22}, // 0x60 '`' + {2877, 19, 16, 21, 2, -15}, // 0x61 'a' + {2915, 22, 22, 21, 0, -21}, // 0x62 'b' + {2976, 19, 16, 21, 3, -15}, // 0x63 'c' + {3014, 21, 22, 21, 3, -21}, // 0x64 'd' + {3072, 18, 16, 21, 3, -15}, // 0x65 'e' + {3108, 21, 22, 21, 3, -21}, // 0x66 'f' + {3166, 21, 23, 21, 2, -15}, // 0x67 'g' + {3227, 20, 22, 21, 1, -21}, // 0x68 'h' + {3282, 16, 22, 21, 3, -21}, // 0x69 'i' + {3326, 18, 29, 21, 2, -21}, // 0x6A 'j' + {3392, 20, 22, 21, 1, -21}, // 0x6B 'k' + {3447, 16, 22, 21, 3, -21}, // 0x6C 'l' + {3491, 23, 16, 21, 0, -15}, // 0x6D 'm' + {3537, 21, 16, 21, 1, -15}, // 0x6E 'n' + {3579, 18, 16, 21, 3, -15}, // 0x6F 'o' + {3615, 23, 23, 21, -1, -15}, // 0x70 'p' + {3682, 22, 23, 21, 2, -15}, // 0x71 'q' + {3746, 20, 16, 21, 2, -15}, // 0x72 'r' + {3786, 16, 16, 21, 4, -15}, // 0x73 's' + {3818, 16, 21, 21, 4, -20}, // 0x74 't' + {3860, 18, 16, 21, 3, -15}, // 0x75 'u' + {3896, 21, 16, 21, 2, -15}, // 0x76 'v' + {3938, 21, 16, 21, 3, -15}, // 0x77 'w' + {3980, 21, 16, 21, 1, -15}, // 0x78 'x' + {4022, 24, 23, 21, -1, -15}, // 0x79 'y' + {4091, 18, 16, 21, 3, -15}, // 0x7A 'z' + {4127, 12, 27, 21, 8, -21}, // 0x7B '{' + {4168, 8, 27, 21, 8, -21}, // 0x7C '|' + {4195, 13, 27, 21, 4, -21}, // 0x7D '}' + {4239, 17, 8, 21, 4, -13}}; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique18pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique18pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique18pt7bGlyphs, 0x20, 0x7E, 35}; + +// Approx. 4928 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h new file mode 100644 index 0000000..ac923bf --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h @@ -0,0 +1,744 @@ +#pragma once +#include + +const uint8_t FreeMonoBoldOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xE0, 0x3F, 0x07, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xE0, 0xFE, + 0x0F, 0xE0, 0xFE, 0x0F, 0xC0, 0xFC, 0x1F, 0xC1, 0xF8, 0x1F, 0x81, 0xF8, + 0x1F, 0x81, 0xF0, 0x1F, 0x01, 0xF0, 0x1E, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xC0, 0x7E, 0x0F, 0xE0, 0xFE, 0x0F, 0xC0, 0x78, 0x00, 0x7E, + 0x1F, 0xBF, 0x0F, 0xDF, 0x87, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF1, + 0xE0, 0xF8, 0xF0, 0x7C, 0x78, 0x3C, 0x38, 0x1E, 0x1C, 0x0F, 0x0E, 0x07, + 0x0E, 0x03, 0x83, 0x01, 0x80, 0x00, 0x1C, 0x1C, 0x00, 0x3E, 0x3E, 0x00, + 0x3E, 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 0x00, + 0x7C, 0x7C, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x0F, + 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFE, 0x03, 0xE3, 0xE0, 0x03, 0xE3, 0xE0, 0x03, 0xC3, 0xC0, 0x07, + 0xC7, 0xC0, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0x0F, 0x0F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, + 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x3E, 0x1E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, + 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x7C, 0x7C, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0xFF, 0x00, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, + 0x01, 0xFF, 0xFF, 0x81, 0xFC, 0x1F, 0xC1, 0xF8, 0x03, 0xC0, 0xF8, 0x01, + 0xE0, 0x7C, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xFF, + 0x80, 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x00, + 0x7F, 0xC0, 0x00, 0x07, 0xE0, 0xE0, 0x01, 0xF0, 0xF0, 0x00, 0xF8, 0xF8, + 0x00, 0xFC, 0x7E, 0x00, 0xFC, 0x3F, 0x81, 0xFE, 0x1F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xE0, 0x03, 0xC3, 0xC0, 0x0E, 0x07, 0x00, + 0x70, 0x1C, 0x01, 0xC0, 0x70, 0x07, 0x01, 0xC0, 0x1C, 0x0E, 0x00, 0x78, + 0x78, 0x00, 0xFF, 0xC0, 0x03, 0xFE, 0x1F, 0x03, 0xE3, 0xFC, 0x00, 0x7F, + 0xC0, 0x0F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xC0, 0x03, 0xF8, 0x7C, 0x0F, + 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x01, 0xE1, 0xE0, 0x07, 0x03, 0x80, 0x38, + 0x0E, 0x00, 0xE0, 0x38, 0x03, 0x80, 0xE0, 0x0E, 0x07, 0x00, 0x3C, 0x3C, + 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, + 0x01, 0xFF, 0x80, 0x3F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFE, 0x01, 0xF1, + 0xE0, 0x1F, 0x04, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, + 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xE3, + 0xE7, 0xFF, 0x3F, 0x7E, 0xFF, 0xFB, 0xE7, 0xFF, 0x9E, 0x1F, 0xF1, 0xF0, + 0xFF, 0x8F, 0x83, 0xF8, 0x7C, 0x1F, 0xC3, 0xF0, 0xFF, 0x9F, 0xFF, 0xFC, + 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xFD, 0xF0, 0x1F, 0x80, 0x00, 0x7E, + 0xFD, 0xF3, 0xE7, 0xCF, 0x3E, 0x7C, 0xF1, 0xE3, 0xC7, 0x0E, 0x18, 0x00, + 0x00, 0x18, 0x00, 0xF0, 0x07, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xC0, 0x3E, + 0x01, 0xF8, 0x07, 0xC0, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0xF8, + 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x3E, 0x00, 0xF8, + 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x03, + 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x00, 0xC0, 0x07, 0x80, 0x3F, 0x00, 0xFC, + 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xF0, 0x07, + 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, + 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, + 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x00, 0x00, 0x3C, + 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x08, + 0x3C, 0x09, 0xF9, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, + 0x87, 0xFF, 0xE0, 0x07, 0xF8, 0x00, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x7F, + 0xF8, 0x07, 0xE7, 0xE0, 0x3E, 0x3F, 0x01, 0xE0, 0xF8, 0x0E, 0x07, 0x80, + 0x00, 0x07, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x7C, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xFC, + 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xE0, 0x3C, 0x07, 0x80, 0x78, 0x0F, 0x00, + 0xE0, 0x0C, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xE0, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, + 0xE0, 0x7F, 0xFF, 0xC0, 0xFC, 0x1F, 0x83, 0xF0, 0x1F, 0x8F, 0xC0, 0x1F, + 0x1F, 0x00, 0x3E, 0x7C, 0x00, 0x7C, 0xF8, 0x00, 0xF9, 0xF0, 0x01, 0xF3, + 0xC0, 0x07, 0xCF, 0x80, 0x0F, 0x9F, 0x00, 0x1E, 0x3E, 0x00, 0x3C, 0x78, + 0x00, 0xF8, 0xF0, 0x01, 0xF3, 0xE0, 0x03, 0xE7, 0xC0, 0x07, 0x8F, 0x80, + 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0x7C, 0x01, 0xF0, 0xFC, 0x07, + 0xC1, 0xFC, 0x3F, 0x81, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, + 0x03, 0xFF, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x7E, + 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xFB, 0xE0, 0x1F, + 0x9E, 0x00, 0xF1, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, + 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, + 0x03, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, + 0x01, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0xFF, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x03, 0xFF, 0xF0, + 0x01, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0x07, 0xF0, 0x1F, 0x00, + 0xFC, 0x0F, 0x80, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF0, 0x01, 0xF0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8, + 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x70, 0x3F, 0x80, 0x3E, 0x1F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x1F, + 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x0F, 0x81, 0xFC, 0x07, + 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xC0, + 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xC0, + 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x3C, 0x01, + 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, + 0xFC, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x07, 0xF0, 0x00, + 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xE0, 0x03, 0xFF, + 0x80, 0x1F, 0xBE, 0x00, 0x7C, 0xF0, 0x03, 0xE7, 0xC0, 0x1F, 0x1F, 0x00, + 0xF8, 0x7C, 0x07, 0xE1, 0xE0, 0x3F, 0x07, 0x81, 0xF8, 0x3E, 0x07, 0xC0, + 0xF8, 0x3E, 0x03, 0xC1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, + 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0x80, 0x00, 0xF8, 0x00, 0x3F, 0xF8, 0x01, + 0xFF, 0xE0, 0x07, 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x7F, 0xF0, 0x01, 0xFF, + 0xFF, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xE0, 0x3F, + 0xFF, 0xE0, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF7, 0xF0, 0x00, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x0F, 0x01, 0xFC, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, + 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0xF8, 0x3C, 0x03, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, + 0xFC, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0x00, + 0x01, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, + 0xFF, 0xFE, 0x01, 0xFE, 0x1C, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x0F, + 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x3E, + 0xFF, 0x80, 0x7D, 0xFF, 0xC0, 0x7F, 0xFF, 0xE0, 0x7F, 0xFF, 0xE0, 0x7F, + 0x87, 0xF0, 0xFF, 0x03, 0xF0, 0xFC, 0x01, 0xF0, 0xF8, 0x01, 0xF0, 0xF8, + 0x01, 0xF0, 0xF8, 0x01, 0xF0, 0xF8, 0x03, 0xE0, 0xF8, 0x03, 0xE0, 0xFC, + 0x07, 0xC0, 0xFE, 0x0F, 0xC0, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x00, 0x3F, + 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, + 0xFF, 0xE7, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFB, 0xE0, 0x07, + 0xCF, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, + 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x1F, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFF, + 0xE0, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xE0, 0x7F, 0xFF, 0xC0, 0xFC, 0x1F, + 0xC3, 0xF0, 0x1F, 0x8F, 0xC0, 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0x7C, + 0x7C, 0x01, 0xF0, 0xFC, 0x07, 0xE0, 0xFC, 0x1F, 0x81, 0xFF, 0xFE, 0x01, + 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xE0, 0xFE, + 0x0F, 0xC3, 0xF0, 0x0F, 0xC7, 0xC0, 0x0F, 0x9F, 0x00, 0x1F, 0x3E, 0x00, + 0x3E, 0x7C, 0x00, 0xFC, 0xFC, 0x03, 0xF1, 0xFC, 0x1F, 0xE3, 0xFF, 0xFF, + 0x83, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x01, 0xFC, 0x00, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xFC, 0x01, 0xFF, + 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0xF0, 0x7F, 0x07, 0xE0, 0x3F, 0x07, 0xC0, + 0x1F, 0x0F, 0xC0, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, + 0x3F, 0x0F, 0xC0, 0x7F, 0x0F, 0xE1, 0xFF, 0x07, 0xFF, 0xFE, 0x07, 0xFF, + 0xFE, 0x03, 0xFF, 0xBE, 0x01, 0xFF, 0x7C, 0x00, 0xFC, 0x7C, 0x00, 0x00, + 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x0F, + 0xE0, 0x00, 0x1F, 0xC0, 0x38, 0x7F, 0x80, 0x7F, 0xFF, 0x00, 0xFF, 0xFE, + 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0x07, 0x83, + 0xF1, 0xFC, 0x7F, 0x1F, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1F, 0x8F, 0xE3, 0xF8, 0xFC, + 0x1E, 0x00, 0x00, 0x3C, 0x00, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, + 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x03, 0xE0, 0x0F, 0xC0, + 0x1F, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x03, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, + 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x0F, + 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xE0, + 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, + 0x80, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, + 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x7F, + 0xE0, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x07, 0xFC, + 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0x80, + 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x01, 0xFF, + 0xE1, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0x1F, 0xFE, 0x00, + 0xFF, 0x80, 0x1F, 0xF0, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, + 0xE0, 0x07, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xC0, 0x0F, 0xE0, + 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, + 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xF0, 0x01, + 0xFF, 0xF0, 0x0F, 0xFF, 0xE0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xC1, 0xE0, + 0x07, 0x87, 0xC0, 0x0F, 0x0F, 0x00, 0x1C, 0x3C, 0x00, 0x78, 0x78, 0x07, + 0xF1, 0xE0, 0x3F, 0xE3, 0xC1, 0xFF, 0x87, 0x87, 0xFF, 0x0E, 0x1F, 0x9E, + 0x3C, 0x7C, 0x3C, 0x78, 0xF0, 0x78, 0xF3, 0xC0, 0xE1, 0xC7, 0x83, 0xC3, + 0x8F, 0x07, 0x8F, 0x1E, 0x0F, 0x1E, 0x3E, 0x1C, 0x3C, 0x7F, 0xFC, 0x78, + 0x7F, 0xFC, 0xF0, 0x7F, 0xF1, 0xE0, 0x3F, 0xE3, 0xC0, 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3F, 0x01, + 0xC0, 0x7F, 0xFF, 0x80, 0x7F, 0xFE, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0x80, + 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xE0, + 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x7F, 0xF0, 0x00, 0x01, 0xE7, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00, + 0x7C, 0x7C, 0x00, 0x01, 0xE1, 0xF8, 0x00, 0x0F, 0x87, 0xE0, 0x00, 0x7C, + 0x0F, 0x80, 0x01, 0xF0, 0x3E, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x3F, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFC, + 0x01, 0xFF, 0xFF, 0xF8, 0x0F, 0xC0, 0x07, 0xE0, 0x3E, 0x00, 0x0F, 0x87, + 0xFF, 0x03, 0xFF, 0xBF, 0xFC, 0x1F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, + 0xC1, 0xFF, 0xEF, 0xFE, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x3F, + 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, + 0xFF, 0x80, 0x7C, 0x00, 0xFC, 0x03, 0xE0, 0x03, 0xE0, 0x1E, 0x00, 0x1F, + 0x01, 0xF0, 0x00, 0xF8, 0x0F, 0x80, 0x0F, 0x80, 0x7C, 0x01, 0xF8, 0x03, + 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x03, 0xC0, 0x0F, 0xF0, 0x3E, 0x00, 0x1F, + 0x81, 0xF0, 0x00, 0x7C, 0x0F, 0x80, 0x03, 0xE0, 0x78, 0x00, 0x1F, 0x03, + 0xC0, 0x03, 0xF1, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0x87, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x03, 0xFF, 0xE6, 0x00, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x03, + 0xFF, 0xFF, 0xF0, 0x7F, 0x81, 0xFF, 0x0F, 0xE0, 0x07, 0xE1, 0xF8, 0x00, + 0x3E, 0x1F, 0x00, 0x03, 0xE3, 0xF0, 0x00, 0x3C, 0x3E, 0x00, 0x03, 0xC7, + 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xC0, + 0x00, 0x70, 0x7E, 0x00, 0x1F, 0x07, 0xF8, 0x07, 0xF0, 0x3F, 0xFF, 0xFF, + 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF0, 0x07, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0x00, 0xFE, + 0x01, 0xF0, 0x07, 0xE0, 0x1E, 0x00, 0x3F, 0x01, 0xE0, 0x01, 0xF0, 0x3E, + 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x03, 0xC0, 0x01, + 0xF0, 0x7C, 0x00, 0x1F, 0x07, 0xC0, 0x03, 0xF0, 0x7C, 0x00, 0x3E, 0x07, + 0x80, 0x03, 0xE0, 0x78, 0x00, 0x7E, 0x0F, 0x80, 0x07, 0xC0, 0xF8, 0x00, + 0xFC, 0x0F, 0x80, 0x1F, 0x80, 0xF0, 0x07, 0xF0, 0x7F, 0xFF, 0xFE, 0x07, + 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, + 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, + 0xFE, 0x1F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x00, 0x78, 0x00, 0xF8, + 0x07, 0xC0, 0x07, 0xC0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0xF1, 0xE0, 0x0F, + 0x0F, 0x8E, 0x00, 0x78, 0x7C, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F, 0xFE, + 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00, + 0x07, 0xC3, 0xC0, 0x00, 0x3E, 0x1E, 0x1E, 0x01, 0xE0, 0xE0, 0xF0, 0x0F, + 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x7C, 0x07, 0xC0, 0x03, 0xE1, 0xFF, 0xFF, + 0xFE, 0x1F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF8, + 0x1F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xC0, + 0x1F, 0x00, 0x0F, 0x80, 0x3E, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x7C, 0x00, + 0xF0, 0x70, 0xF8, 0x03, 0xE1, 0xF0, 0xE0, 0x07, 0xC3, 0xC0, 0x00, 0x0F, + 0xFF, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xFF, + 0xFC, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xC3, 0xE0, 0x00, 0x07, 0x87, + 0xC0, 0x00, 0x1F, 0x07, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0x80, + 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, + 0x00, 0x00, 0x07, 0xF8, 0x60, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0x80, 0xFE, 0x0F, 0xE0, + 0x03, 0xE0, 0xF8, 0x00, 0x3C, 0x1F, 0x00, 0x03, 0xC3, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x7F, 0xFC, 0xF8, 0x0F, 0xFF, + 0xEF, 0x80, 0xFF, 0xFE, 0xF8, 0x0F, 0xFF, 0xCF, 0x80, 0x7F, 0xF8, 0xF8, + 0x00, 0x1F, 0x0F, 0xC0, 0x01, 0xF0, 0xFE, 0x00, 0x1F, 0x07, 0xF8, 0x07, + 0xE0, 0x7F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFC, 0x00, + 0x7F, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x0F, 0xF8, 0x0F, + 0xFC, 0x7F, 0xF0, 0x7F, 0xF1, 0xFF, 0xC1, 0xFF, 0xC7, 0xFE, 0x03, 0xFE, + 0x1F, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, + 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, + 0x00, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x1E, + 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, + 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x07, 0xFE, 0x1F, 0xF8, 0x3F, 0xF8, 0xFF, + 0xF0, 0xFF, 0xE3, 0xFF, 0xC3, 0xFF, 0x8F, 0xFE, 0x0F, 0xFC, 0x3F, 0xF8, + 0x00, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, + 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, + 0xF8, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x3F, + 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, + 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x07, 0x00, 0x0F, 0x80, + 0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x78, 0x00, 0x78, 0x01, + 0xF0, 0x01, 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x0F, + 0x80, 0x3F, 0x00, 0x1F, 0xC0, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, + 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x03, 0xFF, 0xC3, 0xFE, 0x0F, 0xFF, 0x8F, 0xFC, 0x1F, + 0xFF, 0x3F, 0xF8, 0x3F, 0xFE, 0x7F, 0xF0, 0x7F, 0xF8, 0x7F, 0xC0, 0x1F, + 0x01, 0xFC, 0x00, 0x3E, 0x07, 0xF0, 0x00, 0x78, 0x3F, 0x80, 0x01, 0xF0, + 0xFE, 0x00, 0x03, 0xE3, 0xF0, 0x00, 0x07, 0xDF, 0xC0, 0x00, 0x0F, 0xFE, + 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xFF, 0xFE, + 0x00, 0x01, 0xFC, 0xFC, 0x00, 0x03, 0xE0, 0xFC, 0x00, 0x0F, 0x81, 0xF8, + 0x00, 0x1F, 0x01, 0xF8, 0x00, 0x3E, 0x03, 0xF0, 0x00, 0x78, 0x03, 0xE0, + 0x00, 0xF0, 0x07, 0xE0, 0x1F, 0xFE, 0x0F, 0xF8, 0x7F, 0xFC, 0x1F, 0xF8, + 0xFF, 0xF8, 0x1F, 0xF1, 0xFF, 0xF0, 0x3F, 0xE1, 0xFF, 0xC0, 0x7F, 0x80, + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x0E, 0x00, 0xF0, 0x01, 0xE0, 0x3E, 0x00, + 0x7C, 0x07, 0xC0, 0x0F, 0x80, 0xF8, 0x01, 0xF0, 0x1E, 0x00, 0x7C, 0x07, + 0xC0, 0x0F, 0x9F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0x9F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x3F, + 0xC1, 0xFF, 0x00, 0x1F, 0xF0, 0x7F, 0xC0, 0x07, 0xFC, 0x1F, 0xF0, 0x03, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0xE0, + 0x3F, 0xE0, 0x0F, 0xF8, 0x1F, 0xF0, 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0xF7, + 0xC3, 0xFF, 0x00, 0x7D, 0xF1, 0xF7, 0xC0, 0x1F, 0x7C, 0xFD, 0xF0, 0x07, + 0xDF, 0xBE, 0x78, 0x01, 0xE3, 0xFF, 0x3E, 0x00, 0x78, 0xFF, 0xCF, 0x80, + 0x3E, 0x3F, 0xE3, 0xE0, 0x0F, 0x87, 0xF0, 0xF8, 0x03, 0xE1, 0xFC, 0x3C, + 0x00, 0xF0, 0x7E, 0x1F, 0x00, 0x7C, 0x1F, 0x07, 0xC0, 0x1F, 0x00, 0x01, + 0xF0, 0x07, 0xC0, 0x00, 0x78, 0x07, 0xFE, 0x01, 0xFF, 0x83, 0xFF, 0xC0, + 0xFF, 0xF0, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F, 0xFE, 0x0F, 0xFC, + 0x03, 0xFF, 0x00, 0x07, 0xF8, 0x07, 0xFF, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, + 0xFC, 0x0F, 0xFF, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFE, 0x0F, 0xFE, 0x01, + 0xFE, 0x00, 0xF8, 0x01, 0xFF, 0x00, 0xF0, 0x01, 0xFF, 0x01, 0xF0, 0x03, + 0xFF, 0x81, 0xF0, 0x03, 0xFF, 0x81, 0xF0, 0x03, 0xEF, 0xC1, 0xF0, 0x03, + 0xCF, 0xC1, 0xE0, 0x07, 0xC7, 0xE3, 0xE0, 0x07, 0xC7, 0xE3, 0xE0, 0x07, + 0xC3, 0xF3, 0xE0, 0x07, 0xC3, 0xF3, 0xC0, 0x07, 0x81, 0xF7, 0xC0, 0x0F, + 0x81, 0xFF, 0xC0, 0x0F, 0x80, 0xFF, 0xC0, 0x0F, 0x80, 0xFF, 0xC0, 0x0F, + 0x00, 0xFF, 0x80, 0x0F, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x7F, 0x80, 0xFF, + 0xF0, 0x3F, 0x80, 0xFF, 0xF0, 0x3F, 0x00, 0xFF, 0xF0, 0x1F, 0x00, 0x7F, + 0xE0, 0x1F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, + 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xF0, 0x7F, 0x83, + 0xF8, 0x03, 0xF0, 0xFC, 0x00, 0x7E, 0x1F, 0x00, 0x07, 0xE7, 0xE0, 0x00, + 0x7C, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x3E, 0xF0, + 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0xF8, 0x00, 0x07, + 0xDF, 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x3E, 0x7C, 0x00, 0x0F, 0xCF, 0xC0, + 0x01, 0xF0, 0xF8, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x83, 0xFC, 0x1F, 0xE0, + 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x03, 0xFF, + 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF8, + 0x07, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF0, 0x0F, + 0x80, 0x7F, 0x00, 0xF8, 0x01, 0xF0, 0x0F, 0x00, 0x1F, 0x01, 0xF0, 0x01, + 0xF0, 0x1F, 0x00, 0x1F, 0x01, 0xF0, 0x03, 0xE0, 0x1E, 0x00, 0x7E, 0x01, + 0xE0, 0x0F, 0xC0, 0x3F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, + 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7F, 0xFF, + 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, + 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xFF, 0x80, 0x03, + 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xF0, 0x7F, + 0x83, 0xF8, 0x03, 0xF0, 0xFC, 0x00, 0x3F, 0x1F, 0x00, 0x07, 0xE7, 0xC0, + 0x00, 0x7D, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x3F, + 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0xF8, 0x00, + 0x07, 0xDF, 0x00, 0x01, 0xFB, 0xE0, 0x00, 0x3E, 0x7E, 0x00, 0x0F, 0x8F, + 0xC0, 0x03, 0xF0, 0xFC, 0x01, 0xFC, 0x1F, 0xE0, 0xFF, 0x01, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1F, 0xF8, 0x38, 0x0F, 0xFF, 0xFF, + 0x81, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x00, 0xF0, + 0x1F, 0x80, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, + 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x00, 0x7C, 0x03, + 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x1E, 0x00, 0x3E, 0x00, 0xF0, 0x01, 0xF0, + 0x0F, 0x80, 0x1F, 0x80, 0x7C, 0x01, 0xF8, 0x03, 0xE0, 0x3F, 0x80, 0x1F, + 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, + 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x1E, 0x07, 0xF0, 0x01, 0xF0, 0x1F, 0xC0, + 0x0F, 0x80, 0x7E, 0x00, 0x7C, 0x03, 0xF8, 0x03, 0xC0, 0x0F, 0xC0, 0xFF, + 0xE0, 0x7F, 0xCF, 0xFF, 0x01, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, + 0x3F, 0xDF, 0xFC, 0x01, 0xFC, 0x00, 0x0F, 0xE1, 0x80, 0x0F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xC1, 0xFC, 0x0F, + 0xE0, 0x7C, 0x01, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x03, 0xE0, + 0x03, 0xC0, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFF, 0x80, 0x01, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFE, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0xF8, 0xF8, 0x00, + 0x3E, 0x3E, 0x00, 0x1F, 0x8F, 0xC0, 0x0F, 0xC3, 0xFC, 0x0F, 0xF0, 0xFF, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x03, 0x9F, 0xFE, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF7, 0xFF, + 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x9F, 0x07, 0x83, 0xE7, + 0x83, 0xE0, 0xFB, 0xE0, 0xF8, 0x3E, 0xF8, 0x3E, 0x0F, 0x3E, 0x0F, 0x07, + 0xCF, 0x07, 0xC1, 0xF3, 0x81, 0xF0, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x7C, 0x00, 0x07, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, + 0x80, 0x3F, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xF0, 0x7F, 0xE7, + 0xFF, 0x8F, 0xFF, 0x7F, 0xF9, 0xFF, 0xF7, 0xFF, 0x1F, 0xFE, 0x7F, 0xF0, + 0xFF, 0xC1, 0xE0, 0x01, 0xF0, 0x1E, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, + 0x3E, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xE0, 0x3C, 0x00, 0x3E, 0x07, 0xC0, + 0x03, 0xE0, 0x7C, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xC0, 0x7C, 0x00, 0x3C, + 0x07, 0x80, 0x07, 0xC0, 0xF8, 0x00, 0x7C, 0x0F, 0x80, 0x07, 0xC0, 0xF8, + 0x00, 0x78, 0x0F, 0x80, 0x0F, 0x80, 0xFC, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, + 0x00, 0xFF, 0x07, 0xE0, 0x07, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x03, + 0xFF, 0xF0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x7F, 0xF0, + 0x1F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x0F, + 0xFF, 0x7F, 0xE0, 0x3F, 0xF8, 0x7C, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0xF8, + 0x07, 0xC0, 0x03, 0xE0, 0x1F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x00, + 0xF8, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x0F, 0xC0, 0xFC, 0x00, 0x1F, + 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x01, 0xF0, 0xFC, 0x00, 0x07, 0xC3, + 0xE0, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x3E, 0xFC, 0x00, 0x00, 0xFB, 0xE0, + 0x00, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x3F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0x1E, 0x00, + 0x01, 0xE0, 0xF0, 0x7C, 0x1F, 0x0F, 0x87, 0xE0, 0xF0, 0x7C, 0x3F, 0x0F, + 0x83, 0xE3, 0xF8, 0x7C, 0x1F, 0x1F, 0xE3, 0xC0, 0xF9, 0xFF, 0x3E, 0x07, + 0xCF, 0xF9, 0xF0, 0x3E, 0xFF, 0xCF, 0x01, 0xF7, 0xBE, 0xF8, 0x0F, 0xFD, + 0xF7, 0xC0, 0x7B, 0xCF, 0xFC, 0x03, 0xFE, 0x7F, 0xE0, 0x3F, 0xE3, 0xFF, + 0x01, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x7F, 0x80, 0x7F, 0x83, 0xFC, 0x03, + 0xF8, 0x1F, 0xC0, 0x1F, 0xC0, 0xFE, 0x00, 0xFC, 0x07, 0xF0, 0x07, 0xE0, + 0x3F, 0x00, 0x3E, 0x01, 0xF8, 0x00, 0x01, 0xFE, 0x03, 0xFE, 0x03, 0xFF, + 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFE, 0x07, 0xFE, 0x03, 0xFC, + 0x03, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0xFE, 0x07, 0xE0, 0x00, 0x7E, + 0x1F, 0xC0, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x1F, + 0xFC, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, + 0xF8, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x01, 0xF8, 0x7E, 0x00, 0x03, 0xF0, + 0x7E, 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x0F, 0xC0, 0x1F, 0x80, 0x7F, 0xE0, + 0x7F, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, + 0xFF, 0xE0, 0x7F, 0xC0, 0xFF, 0xC0, 0x7F, 0xC0, 0x7F, 0xFF, 0xF0, 0x3F, + 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0x80, 0xFF, 0x87, 0xC0, + 0x1F, 0x01, 0xF8, 0x0F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, 0xC3, 0xE0, 0x01, + 0xF1, 0xF0, 0x00, 0x7E, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFE, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x07, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0x01, 0xFF, + 0xFF, 0xC0, 0x3F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0, + 0x3F, 0xFF, 0xFC, 0x07, 0xC0, 0x3F, 0x00, 0xF8, 0x0F, 0xC0, 0x1F, 0x03, + 0xF0, 0x03, 0xC0, 0xFC, 0x00, 0xF8, 0x3F, 0x00, 0x0E, 0x0F, 0xC0, 0x00, + 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x07, 0xE0, 0x00, 0x01, 0xF8, 0x0E, 0x00, 0x7E, 0x03, 0xE0, 0x1F, + 0x80, 0x7C, 0x07, 0xE0, 0x0F, 0x01, 0xF8, 0x03, 0xE0, 0x7E, 0x00, 0x7C, + 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, 0x0F, + 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0x80, 0x7C, 0x00, 0x1E, 0x00, 0x07, 0x80, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01, + 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF8, + 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, + 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x00, 0x20, 0x03, 0xC0, 0x3E, 0x01, 0xF0, + 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x0F, 0x80, + 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x03, + 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x03, 0xE0, 0x1F, + 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0xF8, + 0x07, 0xC0, 0x3E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x00, 0xFF, 0xC0, 0x7F, + 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x03, 0xE0, 0x00, 0xF0, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, + 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, + 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x7F, 0xE0, 0x3F, 0xF8, + 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x01, + 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x1F, 0xF0, 0x03, + 0xFF, 0x80, 0xFF, 0xF8, 0x1F, 0xCF, 0xC3, 0xF8, 0xFE, 0x7E, 0x07, 0xEF, + 0xC0, 0x3F, 0xF8, 0x03, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0xE0, 0x7F, 0xFF, + 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, + 0x06, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, 0x07, 0xFF, + 0xFE, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x3E, 0x00, 0x7F, 0xFE, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, + 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, 0x00, 0x78, 0x7C, 0x00, 0x78, 0xF8, 0x00, + 0xF8, 0xF8, 0x03, 0xF8, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, + 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFD, 0xFE, 0x0F, 0xE0, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x00, 0x0F, 0xBF, 0xFC, 0x00, 0x7F, + 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0x00, 0xFF, 0x03, + 0xF8, 0x0F, 0xE0, 0x07, 0xE0, 0x7E, 0x00, 0x3F, 0x03, 0xE0, 0x00, 0xF8, + 0x1F, 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x01, 0xF0, 0x7C, + 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0xC0, 0xFC, 0x00, + 0x7C, 0x0F, 0xE0, 0x07, 0xE3, 0xFF, 0xC0, 0xFE, 0x3F, 0xFF, 0xFF, 0xE1, + 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0x7F, 0x9F, 0xFC, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x00, 0x1F, 0xE3, 0x80, 0x7F, 0xFF, 0xC0, 0x7F, 0xFF, + 0xE0, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x01, 0xFC, 0x7E, 0x00, + 0x7C, 0x7E, 0x00, 0x3E, 0x3E, 0x00, 0x0E, 0x3E, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, + 0x00, 0x01, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x0C, 0x7F, 0x80, 0x3F, 0x1F, + 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x00, + 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0x87, 0xC0, 0x0F, + 0xFF, 0x7C, 0x03, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, + 0x81, 0xFC, 0x0F, 0xF8, 0x3F, 0x00, 0x3F, 0x83, 0xE0, 0x01, 0xF0, 0x7C, + 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0x80, 0x01, + 0xF0, 0xF8, 0x00, 0x1E, 0x0F, 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x3E, 0x0F, + 0xC0, 0x07, 0xE0, 0xFC, 0x00, 0xFE, 0x07, 0xF0, 0x3F, 0xF8, 0x7F, 0xFF, + 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xC0, 0xFF, 0xE7, 0xF8, + 0x03, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xF0, 0x03, 0xFF, + 0xF8, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x1F, 0xE0, 0x7E, 0x3F, 0x80, + 0x1F, 0x3F, 0x00, 0x0F, 0x7E, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x1C, 0x7F, 0x01, 0xFE, 0x7F, 0xFF, + 0xFE, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x03, 0xFF, + 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF0, + 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x01, 0xF0, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0xE0, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0x0F, 0xFE, 0xFF, 0x03, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, + 0x0F, 0xFF, 0xFF, 0xF1, 0xFC, 0x1F, 0xFE, 0x3F, 0x80, 0x7F, 0x03, 0xE0, + 0x03, 0xF0, 0x7E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xE0, 0xF8, 0x00, 0x3E, + 0x0F, 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x3E, 0x0F, 0x80, 0x03, 0xC0, 0xF8, + 0x00, 0x7C, 0x0F, 0xC0, 0x0F, 0xC0, 0xFC, 0x01, 0xFC, 0x07, 0xF0, 0x7F, + 0x80, 0x7F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x00, + 0xFF, 0xEF, 0x80, 0x03, 0xF0, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00, + 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x03, + 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x01, 0xF1, 0xF8, 0x00, 0x79, 0xFF, 0x80, 0x1E, 0xFF, 0xF0, 0x0F, + 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xF8, + 0x1F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xC0, 0x7C, 0x00, + 0xF0, 0x1E, 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF8, + 0x01, 0xE0, 0x3C, 0x00, 0xF8, 0x0F, 0x00, 0x3E, 0x1F, 0xF8, 0x3F, 0xEF, + 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x3F, + 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, + 0x3F, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, + 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x3F, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, + 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00, + 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x00, 0x01, + 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, + 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xC0, 0x0F, + 0xFC, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x3C, 0x3F, 0xF0, + 0x1F, 0x1F, 0xFC, 0x07, 0xC7, 0xFF, 0x01, 0xF1, 0xFF, 0xC0, 0x78, 0x7F, + 0xE0, 0x1E, 0x7F, 0x80, 0x0F, 0xBF, 0x80, 0x03, 0xFF, 0xC0, 0x00, 0xFF, + 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x01, + 0xF7, 0xF0, 0x00, 0x7C, 0xFE, 0x00, 0x1E, 0x1F, 0xC0, 0x0F, 0x83, 0xF8, + 0x1F, 0xE0, 0xFF, 0xEF, 0xF8, 0x3F, 0xFB, 0xFE, 0x1F, 0xFE, 0xFF, 0x07, + 0xFF, 0x9F, 0xC0, 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x03, + 0xFF, 0x80, 0x07, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, + 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0x81, 0xE0, + 0x3F, 0xBF, 0x9F, 0xE1, 0xFF, 0xFE, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFF, 0xFC, 0x7F, 0xC7, 0xF1, 0xF0, 0x7E, 0x1F, 0x87, 0xC1, 0xF0, + 0x7C, 0x1F, 0x07, 0x81, 0xE0, 0x7C, 0x1E, 0x0F, 0x81, 0xE0, 0xF8, 0x3E, + 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3C, 0x0F, 0x03, + 0xC1, 0xF0, 0x7C, 0x0F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF1, + 0xFE, 0x1F, 0x87, 0xEF, 0xFC, 0x7F, 0x1F, 0xFF, 0xF3, 0xFC, 0x7F, 0xFF, + 0xCF, 0xF3, 0xFF, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x01, 0xF8, 0x01, 0xF9, + 0xFF, 0x80, 0xFE, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x83, + 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xF8, 0x1F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, + 0x81, 0xF0, 0x03, 0xC0, 0x7C, 0x00, 0xF0, 0x1E, 0x00, 0x7C, 0x0F, 0x80, + 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF8, 0x01, 0xE0, 0x3C, 0x00, 0xF8, 0x0F, + 0x00, 0x3E, 0x1F, 0xF8, 0x3F, 0xEF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, + 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, + 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0xFF, + 0x03, 0xF8, 0xFE, 0x00, 0xFE, 0x7C, 0x00, 0x3F, 0x7C, 0x00, 0x0F, 0xBE, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, + 0xC0, 0x00, 0xFB, 0xE0, 0x00, 0xFD, 0xF8, 0x00, 0x7C, 0xFE, 0x00, 0xFE, + 0x3F, 0x81, 0xFE, 0x1F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x01, 0xFF, 0xFC, + 0x00, 0x7F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x07, + 0xF9, 0xFF, 0xC0, 0x1F, 0xF7, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xC0, 0x7F, + 0xFF, 0xFF, 0xC0, 0x7F, 0xF0, 0x3F, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0x7E, + 0x00, 0x3F, 0x00, 0xF8, 0x00, 0x3E, 0x01, 0xF0, 0x00, 0x7C, 0x03, 0xC0, + 0x00, 0xF8, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x07, 0xE0, 0x3E, 0x00, + 0x0F, 0x80, 0x7C, 0x00, 0x3F, 0x01, 0xFC, 0x00, 0xFC, 0x03, 0xFE, 0x07, + 0xF8, 0x07, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0x80, 0x1E, 0xFF, 0xFC, + 0x00, 0x7C, 0xFF, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x1F, + 0xFF, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x07, 0xFF, 0x3F, 0xC0, 0xFF, 0xFD, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, + 0xFF, 0xFF, 0x8F, 0xE0, 0x7F, 0xF8, 0xFC, 0x00, 0xFE, 0x07, 0xC0, 0x03, + 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1E, 0x00, 0x07, 0xC1, + 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x01, 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xF0, + 0x01, 0xF8, 0x1F, 0x80, 0x1F, 0xC0, 0xFF, 0x03, 0xFC, 0x03, 0xFF, 0xFF, + 0xE0, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, 0xE7, 0xC0, + 0x01, 0xFC, 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x7F, + 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x0F, 0x80, 0x3F, 0xC3, 0xFE, 0x07, 0xFC, 0xFF, 0xE0, + 0x7F, 0xDF, 0xFF, 0x07, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0x1C, 0x00, 0x7F, + 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xC0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xCE, 0x03, 0xFF, 0xFC, + 0x0F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC3, 0xF8, 0x0F, 0x87, + 0xC0, 0x0E, 0x0F, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xFF, 0x80, 0x3F, + 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00, + 0x3F, 0x1C, 0x00, 0x3E, 0x7C, 0x00, 0x7C, 0xFC, 0x03, 0xF3, 0xFF, 0xFF, + 0xE7, 0xFF, 0xFF, 0x8F, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, + 0x80, 0x00, 0x78, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, + 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x00, + 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0xF7, 0xFF, + 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFE, 0x1F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, + 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xE0, + 0x3F, 0xC7, 0xC0, 0x07, 0x8F, 0x80, 0x1F, 0x3E, 0x00, 0x3E, 0x7C, 0x00, + 0x7C, 0xF8, 0x00, 0xF1, 0xF0, 0x03, 0xE3, 0xE0, 0x07, 0xC7, 0xC0, 0x0F, + 0x8F, 0x80, 0x1F, 0x1F, 0x00, 0x7C, 0x3E, 0x01, 0xF8, 0x7E, 0x0F, 0xFC, + 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xFF, 0xEF, 0xE1, 0xFF, 0xBF, 0x80, + 0xFC, 0x00, 0x00, 0x7F, 0xF0, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xE1, 0xF8, 0x03, 0xE0, + 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x0F, 0x80, 0xF8, 0x00, 0xFC, + 0x1F, 0x80, 0x07, 0xC1, 0xF0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xE7, 0xE0, + 0x00, 0x3E, 0x7C, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x03, + 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7F, 0xC0, 0x1F, 0xEF, 0xFC, 0x03, 0xFF, + 0xFF, 0xC0, 0x7F, 0xFF, 0xFC, 0x07, 0xFE, 0x7F, 0x80, 0x3F, 0xC3, 0xE1, + 0xF0, 0xF8, 0x3E, 0x3F, 0x0F, 0x03, 0xE3, 0xF1, 0xF0, 0x3E, 0x7F, 0x1E, + 0x03, 0xE7, 0xF3, 0xE0, 0x3E, 0xFF, 0xBC, 0x03, 0xFF, 0xFF, 0xC0, 0x3F, + 0xFF, 0xFC, 0x03, 0xFE, 0xFF, 0x80, 0x3F, 0xEF, 0xF8, 0x03, 0xFC, 0xFF, + 0x00, 0x3F, 0x8F, 0xF0, 0x03, 0xF8, 0x7E, 0x00, 0x3F, 0x07, 0xE0, 0x01, + 0xF0, 0x7C, 0x00, 0x1E, 0x07, 0xC0, 0x00, 0x03, 0xFE, 0x0F, 0xF8, 0x3F, + 0xF0, 0xFF, 0xC1, 0xFF, 0x8F, 0xFE, 0x0F, 0xFC, 0x7F, 0xF0, 0x7F, 0xC1, + 0xFF, 0x00, 0xFE, 0x1F, 0xC0, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xFF, 0xC0, + 0x00, 0x3F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x7F, 0xE0, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xE3, + 0xF8, 0x00, 0xFE, 0x0F, 0xE0, 0x3F, 0xE0, 0x7F, 0xC3, 0xFF, 0x87, 0xFF, + 0x3F, 0xFC, 0x7F, 0xF9, 0xFF, 0xE3, 0xFF, 0x87, 0xFE, 0x0F, 0xF8, 0x00, + 0x01, 0xFE, 0x03, 0xFE, 0x03, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, + 0x07, 0xFF, 0x07, 0xFE, 0x03, 0xFC, 0x03, 0xFC, 0x01, 0xF8, 0x01, 0xF0, + 0x00, 0xF8, 0x03, 0xF0, 0x00, 0xF8, 0x03, 0xE0, 0x00, 0xFC, 0x07, 0xC0, + 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x7E, 0x1F, 0x00, + 0x00, 0x7E, 0x3E, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x00, 0x3E, 0x7C, 0x00, + 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, + 0x07, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, + 0xE0, 0xFF, 0xFF, 0xE0, 0x7C, 0x0F, 0xE0, 0x3C, 0x0F, 0xE0, 0x1E, 0x0F, + 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, + 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0xF0, 0x3F, + 0x00, 0xF8, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x00, 0x1F, 0xC0, 0x1F, + 0xE0, 0x1F, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x03, + 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x3F, 0xC0, 0x1F, 0xC0, + 0x0F, 0xE0, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, + 0x80, 0x07, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, + 0x7E, 0x00, 0x3F, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x3E, + 0x07, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x0F, + 0x03, 0xE0, 0x7C, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x3C, 0x07, + 0x80, 0xF0, 0x3E, 0x07, 0xC0, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, + 0xC0, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0xC0, + 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x0F, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8, + 0x07, 0xF8, 0x03, 0xE0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x1F, 0x80, 0x7F, + 0xC0, 0x7F, 0xC0, 0x3F, 0xC0, 0x1F, 0xC0, 0x07, 0x80, 0x00, 0x03, 0xE0, + 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xE0, 0x39, 0xFF, 0xE0, 0xF7, 0xFF, 0xE7, + 0xFF, 0xCF, 0xFF, 0xFE, 0x0F, 0xFF, 0x38, 0x0F, 0xFC, 0x00, 0x0F, 0xE0, + 0x00, 0x0F, 0x80}; + +const GFXglyph FreeMonoBoldOblique24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 28, 0, 1}, // 0x20 ' ' + {0, 12, 31, 28, 12, -29}, // 0x21 '!' + {47, 17, 14, 28, 11, -28}, // 0x22 '"' + {77, 24, 34, 28, 5, -30}, // 0x23 '#' + {179, 25, 38, 28, 4, -31}, // 0x24 '$' + {298, 22, 30, 28, 6, -28}, // 0x25 '%' + {381, 21, 28, 28, 5, -26}, // 0x26 '&' + {455, 7, 14, 28, 16, -28}, // 0x27 ''' + {468, 14, 37, 28, 14, -29}, // 0x28 '(' + {533, 14, 37, 28, 5, -29}, // 0x29 ')' + {598, 21, 19, 28, 8, -28}, // 0x2A '*' + {648, 24, 26, 28, 5, -25}, // 0x2B '+' + {726, 12, 14, 28, 6, -6}, // 0x2C ',' + {747, 24, 5, 28, 5, -15}, // 0x2D '-' + {762, 7, 6, 28, 11, -4}, // 0x2E '.' + {768, 28, 38, 28, 3, -32}, // 0x2F '/' + {901, 23, 31, 28, 6, -29}, // 0x30 '0' + {991, 21, 30, 28, 4, -29}, // 0x31 '1' + {1070, 26, 30, 28, 3, -29}, // 0x32 '2' + {1168, 25, 31, 28, 4, -29}, // 0x33 '3' + {1265, 22, 28, 28, 5, -27}, // 0x34 '4' + {1342, 25, 31, 28, 4, -29}, // 0x35 '5' + {1439, 24, 31, 28, 7, -29}, // 0x36 '6' + {1532, 22, 30, 28, 9, -29}, // 0x37 '7' + {1615, 23, 31, 28, 6, -29}, // 0x38 '8' + {1705, 24, 31, 28, 5, -29}, // 0x39 '9' + {1798, 10, 22, 28, 11, -20}, // 0x3A ':' + {1826, 15, 28, 28, 5, -20}, // 0x3B ';' + {1879, 25, 21, 28, 5, -23}, // 0x3C '<' + {1945, 26, 14, 28, 4, -19}, // 0x3D '=' + {1991, 25, 22, 28, 4, -23}, // 0x3E '>' + {2060, 19, 29, 28, 10, -27}, // 0x3F '?' + {2129, 23, 36, 28, 5, -28}, // 0x40 '@' + {2233, 30, 27, 28, 0, -26}, // 0x41 'A' + {2335, 29, 27, 28, 1, -26}, // 0x42 'B' + {2433, 28, 29, 28, 3, -27}, // 0x43 'C' + {2535, 28, 27, 28, 1, -26}, // 0x44 'D' + {2630, 29, 27, 28, 1, -26}, // 0x45 'E' + {2728, 31, 27, 28, 0, -26}, // 0x46 'F' + {2833, 28, 29, 28, 3, -27}, // 0x47 'G' + {2935, 30, 27, 28, 1, -26}, // 0x48 'H' + {3037, 25, 27, 28, 3, -26}, // 0x49 'I' + {3122, 31, 28, 28, 0, -26}, // 0x4A 'J' + {3231, 31, 27, 28, 0, -26}, // 0x4B 'K' + {3336, 27, 27, 28, 1, -26}, // 0x4C 'L' + {3428, 34, 27, 28, 0, -26}, // 0x4D 'M' + {3543, 32, 27, 28, 1, -26}, // 0x4E 'N' + {3651, 27, 29, 28, 3, -27}, // 0x4F 'O' + {3749, 28, 27, 28, 1, -26}, // 0x50 'P' + {3844, 27, 35, 28, 3, -27}, // 0x51 'Q' + {3963, 29, 27, 28, 0, -26}, // 0x52 'R' + {4061, 26, 29, 28, 3, -27}, // 0x53 'S' + {4156, 26, 27, 28, 4, -26}, // 0x54 'T' + {4244, 28, 28, 28, 4, -26}, // 0x55 'U' + {4342, 30, 27, 28, 2, -26}, // 0x56 'V' + {4444, 29, 27, 28, 3, -26}, // 0x57 'W' + {4542, 32, 27, 28, 0, -26}, // 0x58 'X' + {4650, 26, 27, 28, 4, -26}, // 0x59 'Y' + {4738, 27, 27, 28, 2, -26}, // 0x5A 'Z' + {4830, 18, 37, 28, 10, -29}, // 0x5B '[' + {4914, 13, 38, 28, 10, -32}, // 0x5C '\' + {4976, 18, 37, 28, 5, -29}, // 0x5D ']' + {5060, 20, 15, 28, 8, -29}, // 0x5E '^' + {5098, 29, 5, 28, -2, 5}, // 0x5F '_' + {5117, 8, 8, 28, 13, -30}, // 0x60 '`' + {5125, 24, 23, 28, 3, -21}, // 0x61 'a' + {5194, 29, 31, 28, 0, -29}, // 0x62 'b' + {5307, 25, 23, 28, 3, -21}, // 0x63 'c' + {5379, 28, 31, 28, 3, -29}, // 0x64 'd' + {5488, 24, 23, 28, 3, -21}, // 0x65 'e' + {5557, 28, 30, 28, 4, -29}, // 0x66 'f' + {5662, 28, 31, 28, 3, -21}, // 0x67 'g' + {5771, 26, 30, 28, 2, -29}, // 0x68 'h' + {5869, 23, 29, 28, 3, -28}, // 0x69 'i' + {5953, 23, 38, 28, 3, -28}, // 0x6A 'j' + {6063, 26, 30, 28, 2, -29}, // 0x6B 'k' + {6161, 23, 30, 28, 3, -29}, // 0x6C 'l' + {6248, 30, 22, 28, 0, -21}, // 0x6D 'm' + {6331, 26, 22, 28, 2, -21}, // 0x6E 'n' + {6403, 25, 23, 28, 3, -21}, // 0x6F 'o' + {6475, 31, 31, 28, -1, -21}, // 0x70 'p' + {6596, 29, 31, 28, 2, -21}, // 0x71 'q' + {6709, 28, 22, 28, 2, -21}, // 0x72 'r' + {6786, 23, 23, 28, 4, -21}, // 0x73 's' + {6853, 20, 28, 28, 5, -26}, // 0x74 't' + {6923, 23, 22, 28, 5, -20}, // 0x75 'u' + {6987, 28, 21, 28, 3, -20}, // 0x76 'v' + {7061, 28, 21, 28, 3, -20}, // 0x77 'w' + {7135, 29, 21, 28, 1, -20}, // 0x78 'x' + {7212, 32, 30, 28, -1, -20}, // 0x79 'y' + {7332, 25, 21, 28, 4, -20}, // 0x7A 'z' + {7398, 17, 37, 28, 10, -29}, // 0x7B '{' + {7477, 11, 36, 28, 11, -28}, // 0x7C '|' + {7527, 17, 37, 28, 6, -29}, // 0x7D '}' + {7606, 23, 10, 28, 5, -17}}; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique24pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique24pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique24pt7bGlyphs, 0x20, 0x7E, 47}; + +// Approx. 8307 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h new file mode 100644 index 0000000..86d3e9c --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h @@ -0,0 +1,205 @@ +#pragma once +#include + +const uint8_t FreeMonoBoldOblique9pt7bBitmaps[] PROGMEM = { + 0x39, 0xCC, 0x67, 0x31, 0x8C, 0x07, 0x38, 0x6C, 0xD9, 0x36, 0x48, 0x80, + 0x09, 0x0D, 0x86, 0xCF, 0xF7, 0xF9, 0xB3, 0xFD, 0xFE, 0x6C, 0x36, 0x1B, + 0x00, 0x00, 0x06, 0x07, 0x07, 0xE6, 0x33, 0x01, 0xE0, 0x7C, 0x06, 0x43, + 0x33, 0xBF, 0x83, 0x03, 0x00, 0x80, 0x1C, 0x11, 0x10, 0x88, 0x83, 0xB8, + 0xF3, 0xB8, 0x22, 0x21, 0x11, 0x07, 0x00, 0x0F, 0x1F, 0x30, 0x30, 0x38, + 0x7B, 0xDF, 0xCE, 0xFF, 0x7E, 0xFA, 0x80, 0x19, 0x8C, 0xC6, 0x63, 0x18, + 0xC6, 0x31, 0xC6, 0x30, 0x31, 0xC6, 0x31, 0x8C, 0x63, 0x31, 0x98, 0xCC, + 0x40, 0x08, 0x08, 0xFF, 0xFF, 0x38, 0x6C, 0x6C, 0x0C, 0x06, 0x03, 0x1F, + 0xFF, 0xF8, 0xC0, 0x60, 0x30, 0x10, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0xFF, + 0xC0, 0xFC, 0x00, 0x00, 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80, + 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x00, 0x0F, + 0x0F, 0xCC, 0x6C, 0x36, 0x1B, 0x0D, 0x05, 0x86, 0xC3, 0x63, 0x3F, 0x8F, + 0x00, 0x06, 0x1C, 0x3C, 0x6C, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x18, 0xFE, + 0xFE, 0x07, 0x83, 0xF1, 0x8C, 0x43, 0x00, 0xC0, 0xE0, 0x70, 0x38, 0x38, + 0x1C, 0x6F, 0xF3, 0xFC, 0x1F, 0x1F, 0xC0, 0x60, 0x30, 0x30, 0x70, 0x38, + 0x06, 0x03, 0x03, 0xBF, 0x9F, 0x80, 0x03, 0x07, 0x0B, 0x1B, 0x32, 0x66, + 0xFF, 0xFF, 0x1E, 0x1E, 0x3F, 0x9F, 0x98, 0x0F, 0xC7, 0xF3, 0x18, 0x0C, + 0x06, 0x06, 0x7F, 0x1E, 0x00, 0x07, 0x87, 0xCE, 0x06, 0x06, 0x03, 0xF3, + 0xFD, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0xFF, 0xFF, 0xC3, 0x06, 0x06, + 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x1F, 0x1F, 0xDC, 0x6C, 0x36, 0x31, + 0xF1, 0xF8, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0x1E, 0x3F, 0x33, 0x63, + 0x63, 0x67, 0x7F, 0x3E, 0x06, 0x1C, 0xF8, 0xF0, 0x77, 0x00, 0x00, 0xEE, + 0x1C, 0x70, 0x00, 0x00, 0x03, 0x0C, 0x61, 0x08, 0x00, 0x00, 0xC1, 0xE1, + 0xE1, 0xE0, 0xF0, 0x07, 0x00, 0xF0, 0x0C, 0x7F, 0xDF, 0xF0, 0x00, 0x00, + 0x7F, 0xFF, 0xF0, 0x30, 0x0F, 0x00, 0xE0, 0x1E, 0x07, 0xC7, 0x87, 0x83, + 0x00, 0x7D, 0xFF, 0x18, 0x30, 0xE3, 0x9C, 0x30, 0x01, 0xC3, 0x80, 0x0F, + 0x0F, 0xCC, 0x6C, 0x36, 0x72, 0x79, 0x7D, 0xB6, 0xDA, 0x6F, 0xB3, 0xD8, + 0x0C, 0x07, 0xE1, 0xE0, 0x0F, 0x83, 0xF0, 0x1E, 0x03, 0xC0, 0xD8, 0x31, + 0x87, 0xF1, 0xFE, 0x30, 0xDF, 0x3F, 0xC7, 0x80, 0x3F, 0xC7, 0xFC, 0x61, + 0x8C, 0x31, 0xFC, 0x3F, 0x84, 0x19, 0x83, 0x30, 0x6F, 0xFB, 0xFE, 0x00, + 0x0F, 0xF1, 0xFF, 0x30, 0x66, 0x06, 0x60, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xE0, 0xC7, 0xF8, 0x3F, 0x00, 0x3F, 0x87, 0xF8, 0x63, 0x8C, 0x31, 0x06, + 0x60, 0xCC, 0x19, 0x86, 0x31, 0xCF, 0xF3, 0xF8, 0x00, 0x3F, 0xE3, 0xFE, + 0x18, 0x61, 0xB6, 0x1F, 0x01, 0xF0, 0x32, 0x03, 0x00, 0x30, 0x4F, 0xFC, + 0xFF, 0xC0, 0x3F, 0xF3, 0xFE, 0x18, 0x61, 0xB6, 0x1F, 0x03, 0xF0, 0x32, + 0x03, 0x00, 0x30, 0x0F, 0xC0, 0xFC, 0x00, 0x0F, 0xE3, 0xFC, 0xC1, 0x30, + 0x06, 0x01, 0x80, 0x31, 0xF6, 0x3E, 0xE1, 0x9F, 0xF0, 0xF8, 0x00, 0x1E, + 0xF3, 0xCF, 0x18, 0x61, 0x84, 0x10, 0xC3, 0xFC, 0x3F, 0xC3, 0x08, 0x31, + 0x8F, 0xBC, 0xFB, 0xC0, 0x3F, 0xCF, 0xF0, 0x60, 0x10, 0x0C, 0x03, 0x00, + 0xC0, 0x20, 0x18, 0x3F, 0xCF, 0xF0, 0x07, 0xF0, 0x7F, 0x00, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x61, 0x84, 0x10, 0xC3, 0x0F, 0xE0, 0x7C, 0x00, 0x3E, + 0xE7, 0xFC, 0x66, 0x0D, 0x81, 0x60, 0x7C, 0x0E, 0xC1, 0x98, 0x31, 0x1F, + 0x3B, 0xE7, 0x00, 0x3F, 0x07, 0xE0, 0x30, 0x06, 0x00, 0xC0, 0x10, 0x06, + 0x00, 0xC3, 0x18, 0x6F, 0xFB, 0xFF, 0x00, 0x38, 0x39, 0xC3, 0xC7, 0x3C, + 0x79, 0xE3, 0xDA, 0x1F, 0xF0, 0x9D, 0x8C, 0xCC, 0x60, 0x67, 0xCF, 0x3C, + 0x78, 0x3C, 0xF9, 0xE7, 0x87, 0x18, 0x3C, 0xC1, 0x66, 0x1B, 0xB0, 0xCD, + 0x06, 0x78, 0x31, 0xC3, 0xCE, 0x3E, 0x30, 0x0F, 0x0F, 0xE7, 0x1D, 0x83, + 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3, 0x9F, 0xC3, 0xC0, 0x3F, 0xC7, 0xFC, + 0x61, 0x8C, 0x31, 0x8E, 0x3F, 0x87, 0xE1, 0x80, 0x30, 0x0F, 0xC3, 0xF0, + 0x00, 0x0F, 0x0F, 0xE7, 0x1D, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3, + 0x1F, 0xC3, 0xC0, 0x80, 0x7F, 0x3F, 0xC0, 0x3F, 0xC3, 0xFE, 0x18, 0x61, + 0x86, 0x10, 0xE3, 0xFC, 0x3F, 0x83, 0x18, 0x31, 0xCF, 0x8F, 0xF8, 0x70, + 0x1E, 0xCF, 0xF7, 0x19, 0x80, 0x70, 0x1F, 0x81, 0xF3, 0x0C, 0xC3, 0x3F, + 0x8B, 0xC0, 0x7F, 0xCF, 0xF9, 0x93, 0x66, 0x60, 0xC0, 0x18, 0x02, 0x00, + 0xC0, 0x18, 0x0F, 0xC1, 0xF8, 0x00, 0xF9, 0xFF, 0x7D, 0x83, 0x30, 0x64, + 0x09, 0x83, 0x30, 0x66, 0x0C, 0xE3, 0x0F, 0xC0, 0xF0, 0x00, 0xF9, 0xFE, + 0x3D, 0x83, 0x30, 0xC6, 0x30, 0xE6, 0x0D, 0x81, 0xB0, 0x3C, 0x07, 0x00, + 0x60, 0x00, 0xF9, 0xFF, 0x3D, 0x83, 0x36, 0x64, 0xC8, 0xBF, 0x35, 0xE7, + 0xB8, 0xE7, 0x1C, 0xE3, 0x18, 0x00, 0x3C, 0xF3, 0xCF, 0x1C, 0xC0, 0xD8, + 0x0F, 0x00, 0x60, 0x0F, 0x01, 0xB8, 0x31, 0x8F, 0x3C, 0xF3, 0xC0, 0x79, + 0xEE, 0x38, 0xC6, 0x19, 0x81, 0xE0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x0F, + 0xC3, 0xF8, 0x00, 0x3F, 0xCF, 0xF3, 0x18, 0xCC, 0x06, 0x03, 0x01, 0x80, + 0xC6, 0x61, 0xBF, 0xCF, 0xF0, 0x1E, 0x3C, 0xC1, 0x83, 0x06, 0x08, 0x30, + 0x60, 0xC1, 0x06, 0x0F, 0x1E, 0x00, 0x06, 0x31, 0x86, 0x31, 0x8C, 0x31, + 0x8C, 0x61, 0x8C, 0x60, 0x1E, 0x78, 0x30, 0x60, 0xC1, 0x86, 0x0C, 0x18, + 0x30, 0x41, 0x8F, 0x1E, 0x00, 0x08, 0x1C, 0x3C, 0x76, 0xE7, 0xC3, 0x7F, + 0xFF, 0xFC, 0x88, 0x80, 0x0F, 0x07, 0xE1, 0xF9, 0xFE, 0xE3, 0x30, 0xCF, + 0xFD, 0xFF, 0x38, 0x07, 0x00, 0x60, 0x0F, 0xC1, 0xFC, 0x71, 0xCC, 0x19, + 0x83, 0x30, 0xDF, 0xFB, 0xBC, 0x00, 0x1F, 0xCF, 0xF6, 0x1B, 0x00, 0xC0, + 0x30, 0x0F, 0xF1, 0xF8, 0x01, 0xE0, 0x38, 0x03, 0x0F, 0x63, 0xFC, 0xC3, + 0x30, 0x66, 0x0C, 0xC3, 0x9F, 0xF9, 0xF7, 0x00, 0x1F, 0x1F, 0xD8, 0x3F, + 0xFF, 0xFE, 0x1B, 0xFC, 0xF8, 0x07, 0xC3, 0xF1, 0x81, 0xFE, 0x7F, 0x84, + 0x03, 0x00, 0xC0, 0x30, 0x3F, 0x8F, 0xE0, 0x1E, 0xE7, 0xFD, 0x86, 0x60, + 0xCC, 0x19, 0xC6, 0x3F, 0xC1, 0xD8, 0x03, 0x00, 0xE1, 0xF8, 0x3E, 0x00, + 0x38, 0x1E, 0x01, 0x00, 0xDC, 0x3F, 0x8C, 0x62, 0x19, 0x84, 0x63, 0x3D, + 0xFF, 0x7C, 0x06, 0x03, 0x00, 0x03, 0xC3, 0xE0, 0x20, 0x30, 0x18, 0x0C, + 0x3F, 0xFF, 0xE0, 0x01, 0x81, 0x80, 0x07, 0xF3, 0xF8, 0x0C, 0x04, 0x06, + 0x03, 0x01, 0x80, 0xC0, 0x40, 0x67, 0xE3, 0xE0, 0x38, 0x0E, 0x01, 0x80, + 0x4F, 0x37, 0xCF, 0x83, 0xC0, 0xF0, 0x26, 0x39, 0xEE, 0x78, 0x1F, 0x0F, + 0x01, 0x80, 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x3F, 0xFF, 0xE0, 0x7E, + 0xE7, 0xFF, 0x33, 0x32, 0x63, 0x66, 0x36, 0x62, 0xF7, 0x7F, 0x67, 0x77, + 0x8F, 0xF8, 0xC3, 0x10, 0x66, 0x08, 0xC3, 0x3C, 0x7F, 0x8F, 0x1F, 0x0F, + 0xE6, 0x1F, 0x03, 0xC0, 0xF8, 0x67, 0xF0, 0xF8, 0x3F, 0xE3, 0xFF, 0x1C, + 0x31, 0x83, 0x18, 0x31, 0x86, 0x3F, 0xE3, 0x78, 0x30, 0x03, 0x00, 0xFC, + 0x0F, 0x80, 0x1E, 0xEF, 0xFD, 0x86, 0x60, 0xCC, 0x19, 0xC7, 0x3F, 0xE1, + 0xE8, 0x03, 0x00, 0x60, 0x3E, 0x07, 0xC0, 0x39, 0xDF, 0xF1, 0xC0, 0x60, + 0x10, 0x0C, 0x0F, 0xF3, 0xF8, 0x1F, 0x7F, 0x63, 0x7E, 0x1F, 0xC3, 0xFE, + 0xFC, 0x10, 0x08, 0x0C, 0x1F, 0xEF, 0xF1, 0x80, 0x80, 0xC0, 0x60, 0x3F, + 0x8F, 0x80, 0xF3, 0xFC, 0xF6, 0x09, 0x86, 0x61, 0x98, 0xE7, 0xF8, 0xFE, + 0xFB, 0xFF, 0x7C, 0xC6, 0x19, 0x83, 0x60, 0x6C, 0x07, 0x00, 0xC0, 0xF1, + 0xFE, 0x3D, 0xB3, 0x37, 0xC7, 0xF8, 0xEE, 0x1D, 0xC3, 0x30, 0x79, 0xEF, + 0x38, 0xEE, 0x0F, 0x01, 0xE0, 0x6E, 0x3C, 0xE7, 0xBC, 0x3C, 0xF3, 0x8F, + 0x18, 0xC1, 0x9C, 0x19, 0x81, 0xF0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, + 0xFC, 0x0F, 0xC0, 0x7F, 0xBF, 0xD9, 0xC1, 0x83, 0x83, 0x1B, 0xFD, 0xFE, + 0x06, 0x1C, 0x60, 0xC1, 0x86, 0x3C, 0x70, 0x30, 0x41, 0x83, 0x07, 0x06, + 0x00, 0x33, 0x32, 0x26, 0x66, 0x44, 0xCC, 0xC8, 0x0C, 0x0E, 0x04, 0x0C, + 0x0C, 0x0C, 0x0F, 0x0F, 0x18, 0x18, 0x10, 0x30, 0xF0, 0xE0, 0x38, 0x7C, + 0xF7, 0xC1, 0xC0}; + +const GFXglyph FreeMonoBoldOblique9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 11, 0, 1}, // 0x20 ' ' + {0, 5, 11, 11, 4, -10}, // 0x21 '!' + {7, 7, 5, 11, 4, -10}, // 0x22 '"' + {12, 9, 12, 11, 2, -10}, // 0x23 '#' + {26, 9, 14, 11, 2, -11}, // 0x24 '$' + {42, 9, 11, 11, 2, -10}, // 0x25 '%' + {55, 8, 10, 11, 2, -9}, // 0x26 '&' + {65, 2, 5, 11, 6, -10}, // 0x27 ''' + {67, 5, 14, 11, 5, -10}, // 0x28 '(' + {76, 5, 14, 11, 2, -10}, // 0x29 ')' + {85, 8, 7, 11, 3, -10}, // 0x2A '*' + {92, 9, 9, 11, 2, -8}, // 0x2B '+' + {103, 4, 5, 11, 2, -1}, // 0x2C ',' + {106, 9, 2, 11, 2, -5}, // 0x2D '-' + {109, 3, 2, 11, 4, -1}, // 0x2E '.' + {110, 11, 15, 11, 1, -12}, // 0x2F '/' + {131, 9, 12, 11, 2, -11}, // 0x30 '0' + {145, 8, 12, 11, 2, -11}, // 0x31 '1' + {157, 10, 12, 11, 1, -11}, // 0x32 '2' + {172, 9, 12, 11, 2, -11}, // 0x33 '3' + {186, 8, 10, 11, 2, -9}, // 0x34 '4' + {196, 9, 11, 11, 3, -10}, // 0x35 '5' + {209, 9, 12, 11, 3, -11}, // 0x36 '6' + {223, 8, 11, 11, 3, -10}, // 0x37 '7' + {234, 9, 12, 11, 2, -11}, // 0x38 '8' + {248, 8, 12, 11, 3, -11}, // 0x39 '9' + {260, 4, 8, 11, 4, -7}, // 0x3A ':' + {264, 6, 11, 11, 2, -7}, // 0x3B ';' + {273, 10, 8, 11, 2, -8}, // 0x3C '<' + {283, 10, 6, 11, 1, -7}, // 0x3D '=' + {291, 10, 8, 11, 1, -8}, // 0x3E '>' + {301, 7, 11, 11, 4, -10}, // 0x3F '?' + {311, 9, 15, 11, 2, -11}, // 0x40 '@' + {328, 11, 11, 11, 0, -10}, // 0x41 'A' + {344, 11, 11, 11, 0, -10}, // 0x42 'B' + {360, 12, 11, 11, 1, -10}, // 0x43 'C' + {377, 11, 11, 11, 0, -10}, // 0x44 'D' + {393, 12, 11, 11, 0, -10}, // 0x45 'E' + {410, 12, 11, 11, 0, -10}, // 0x46 'F' + {427, 11, 11, 11, 1, -10}, // 0x47 'G' + {443, 12, 11, 11, 0, -10}, // 0x48 'H' + {460, 10, 11, 11, 1, -10}, // 0x49 'I' + {474, 12, 11, 11, 0, -10}, // 0x4A 'J' + {491, 11, 11, 11, 0, -10}, // 0x4B 'K' + {507, 11, 11, 11, 0, -10}, // 0x4C 'L' + {523, 13, 11, 11, 0, -10}, // 0x4D 'M' + {541, 13, 11, 11, 0, -10}, // 0x4E 'N' + {559, 10, 11, 11, 1, -10}, // 0x4F 'O' + {573, 11, 11, 11, 0, -10}, // 0x50 'P' + {589, 10, 14, 11, 1, -10}, // 0x51 'Q' + {607, 12, 11, 11, 0, -10}, // 0x52 'R' + {624, 10, 11, 11, 2, -10}, // 0x53 'S' + {638, 11, 11, 11, 1, -10}, // 0x54 'T' + {654, 11, 11, 11, 1, -10}, // 0x55 'U' + {670, 11, 11, 11, 1, -10}, // 0x56 'V' + {686, 11, 11, 11, 1, -10}, // 0x57 'W' + {702, 12, 11, 11, 0, -10}, // 0x58 'X' + {719, 11, 11, 11, 1, -10}, // 0x59 'Y' + {735, 10, 11, 11, 1, -10}, // 0x5A 'Z' + {749, 7, 14, 11, 4, -10}, // 0x5B '[' + {762, 5, 15, 11, 4, -12}, // 0x5C '\' + {772, 7, 14, 11, 2, -10}, // 0x5D ']' + {785, 8, 6, 11, 3, -11}, // 0x5E '^' + {791, 11, 2, 11, -1, 3}, // 0x5F '_' + {794, 3, 3, 11, 5, -11}, // 0x60 '`' + {796, 10, 8, 11, 1, -7}, // 0x61 'a' + {806, 11, 11, 11, 0, -10}, // 0x62 'b' + {822, 10, 8, 11, 1, -7}, // 0x63 'c' + {832, 11, 11, 11, 1, -10}, // 0x64 'd' + {848, 9, 8, 11, 1, -7}, // 0x65 'e' + {857, 10, 11, 11, 2, -10}, // 0x66 'f' + {871, 11, 12, 11, 1, -7}, // 0x67 'g' + {888, 10, 11, 11, 1, -10}, // 0x68 'h' + {902, 9, 11, 11, 1, -10}, // 0x69 'i' + {915, 9, 15, 11, 1, -10}, // 0x6A 'j' + {932, 10, 11, 11, 1, -10}, // 0x6B 'k' + {946, 9, 11, 11, 1, -10}, // 0x6C 'l' + {959, 12, 8, 11, 0, -7}, // 0x6D 'm' + {971, 11, 8, 11, 1, -7}, // 0x6E 'n' + {982, 10, 8, 11, 1, -7}, // 0x6F 'o' + {992, 12, 12, 11, -1, -7}, // 0x70 'p' + {1010, 11, 12, 11, 1, -7}, // 0x71 'q' + {1027, 10, 8, 11, 1, -7}, // 0x72 'r' + {1037, 8, 8, 11, 2, -7}, // 0x73 's' + {1045, 9, 11, 11, 1, -10}, // 0x74 't' + {1058, 10, 8, 11, 1, -7}, // 0x75 'u' + {1068, 11, 8, 11, 1, -7}, // 0x76 'v' + {1079, 11, 8, 11, 1, -7}, // 0x77 'w' + {1090, 11, 8, 11, 1, -7}, // 0x78 'x' + {1101, 12, 12, 11, 0, -7}, // 0x79 'y' + {1119, 9, 8, 11, 2, -7}, // 0x7A 'z' + {1128, 7, 14, 11, 3, -10}, // 0x7B '{' + {1141, 4, 14, 11, 4, -10}, // 0x7C '|' + {1148, 8, 14, 11, 2, -10}, // 0x7D '}' + {1162, 9, 4, 11, 2, -6}}; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique9pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique9pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique9pt7bGlyphs, 0x20, 0x7E, 18}; + +// Approx. 1839 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h new file mode 100644 index 0000000..0617603 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h @@ -0,0 +1,250 @@ +#pragma once +#include + +const uint8_t FreeMonoOblique12pt7bBitmaps[] PROGMEM = { + 0x11, 0x11, 0x12, 0x22, 0x22, 0x00, 0x0E, 0xE0, 0xE7, 0xE7, 0xC6, 0xC6, + 0xC6, 0x84, 0x84, 0x02, 0x40, 0x88, 0x12, 0x02, 0x40, 0x48, 0x7F, 0xC2, + 0x40, 0x48, 0x11, 0x1F, 0xF8, 0x48, 0x09, 0x02, 0x40, 0x48, 0x09, 0x02, + 0x20, 0x02, 0x01, 0x00, 0xF4, 0xC3, 0x60, 0x50, 0x04, 0x00, 0xC0, 0x0F, + 0x00, 0x60, 0x0A, 0x02, 0x81, 0x30, 0xC7, 0xC0, 0x80, 0x20, 0x08, 0x00, + 0x0E, 0x02, 0x20, 0x84, 0x10, 0x82, 0x20, 0x38, 0x00, 0x38, 0x38, 0x38, + 0x08, 0xE0, 0x22, 0x08, 0x41, 0x08, 0x22, 0x03, 0x80, 0x07, 0x84, 0x04, + 0x02, 0x01, 0x00, 0xC1, 0xA2, 0x8A, 0x85, 0x43, 0x31, 0x8F, 0x60, 0xFF, + 0x6D, 0x20, 0x00, 0x44, 0x42, 0x21, 0x08, 0x84, 0x21, 0x08, 0x42, 0x10, + 0x42, 0x00, 0x00, 0x84, 0x10, 0x84, 0x21, 0x08, 0x46, 0x21, 0x10, 0x88, + 0x44, 0x00, 0x04, 0x02, 0x02, 0x1D, 0x13, 0xF0, 0x40, 0x50, 0x48, 0x44, + 0x00, 0x02, 0x00, 0x40, 0x08, 0x02, 0x00, 0x41, 0xFF, 0xC1, 0x00, 0x20, + 0x08, 0x01, 0x00, 0x20, 0x00, 0x1C, 0xE3, 0x18, 0x63, 0x08, 0x00, 0xFF, + 0xE0, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, + 0x60, 0x02, 0x00, 0x20, 0x03, 0x00, 0x10, 0x01, 0x00, 0x18, 0x00, 0x80, + 0x08, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, 0x00, 0x07, 0x06, 0x23, + 0x04, 0x81, 0x40, 0x50, 0x14, 0x06, 0x02, 0x80, 0xA0, 0x28, 0x0A, 0x04, + 0x83, 0x11, 0x83, 0x80, 0x03, 0x03, 0x83, 0x83, 0x43, 0x20, 0x10, 0x08, + 0x08, 0x04, 0x02, 0x01, 0x01, 0x00, 0x80, 0x43, 0xFE, 0x01, 0xC0, 0x62, + 0x0C, 0x10, 0x81, 0x00, 0x10, 0x02, 0x00, 0x60, 0x0C, 0x01, 0x00, 0x20, + 0x0C, 0x01, 0x80, 0x20, 0x04, 0x04, 0xFF, 0xC0, 0x07, 0xC3, 0x0C, 0x00, + 0x80, 0x10, 0x06, 0x01, 0x81, 0xC0, 0x0C, 0x00, 0x40, 0x08, 0x01, 0x00, + 0x20, 0x09, 0x86, 0x0F, 0x00, 0x00, 0xC0, 0x50, 0x24, 0x12, 0x04, 0x82, + 0x21, 0x08, 0x82, 0x21, 0x10, 0x4F, 0xF8, 0x04, 0x01, 0x00, 0x80, 0xF8, + 0x0F, 0xE2, 0x00, 0x40, 0x08, 0x01, 0x00, 0x4E, 0x0E, 0x20, 0x02, 0x00, + 0x40, 0x08, 0x01, 0x00, 0x40, 0x19, 0x06, 0x1F, 0x00, 0x01, 0xE0, 0xC0, + 0x60, 0x18, 0x02, 0x00, 0x80, 0x13, 0xC5, 0x88, 0xE0, 0x98, 0x12, 0x02, + 0x40, 0x48, 0x10, 0x84, 0x0F, 0x00, 0xFF, 0xA0, 0x20, 0x08, 0x04, 0x01, + 0x00, 0x80, 0x20, 0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0x10, 0x08, 0x02, + 0x00, 0x07, 0x81, 0x08, 0x40, 0x90, 0x12, 0x02, 0x40, 0x84, 0x20, 0x78, + 0x30, 0x88, 0x0A, 0x01, 0x40, 0x28, 0x08, 0x82, 0x0F, 0x80, 0x07, 0x81, + 0x08, 0x40, 0x90, 0x12, 0x02, 0x40, 0xC8, 0x39, 0x8D, 0x1E, 0x40, 0x08, + 0x02, 0x00, 0xC0, 0x30, 0x18, 0x3E, 0x00, 0x19, 0xCC, 0x00, 0x00, 0x0C, + 0xE6, 0x00, 0x06, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x1C, 0x30, 0xE1, 0x86, + 0x08, 0x00, 0x00, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x06, 0x00, 0x30, + 0x00, 0xC0, 0x06, 0x00, 0x18, 0x00, 0xC0, 0x7F, 0xF8, 0x00, 0x00, 0x01, + 0xFF, 0xE0, 0x18, 0x00, 0xC0, 0x03, 0x00, 0x18, 0x00, 0x60, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x3E, 0xC3, 0x81, 0x01, 0x03, + 0x06, 0x18, 0x20, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x07, 0x82, 0x31, + 0x04, 0x81, 0x20, 0x48, 0x74, 0x65, 0x21, 0x48, 0x92, 0x28, 0x7A, 0x00, + 0x80, 0x20, 0x04, 0x00, 0xF8, 0x07, 0xE0, 0x02, 0x80, 0x0A, 0x00, 0x48, + 0x01, 0x20, 0x08, 0x40, 0x41, 0x01, 0x04, 0x0F, 0xF0, 0x20, 0x41, 0x01, + 0x04, 0x02, 0x20, 0x0B, 0xE1, 0xF0, 0x1F, 0xF0, 0x40, 0xC2, 0x02, 0x10, + 0x10, 0x81, 0x84, 0x18, 0x7F, 0x82, 0x02, 0x10, 0x08, 0x80, 0x44, 0x02, + 0x60, 0x22, 0x03, 0x7F, 0xE0, 0x07, 0x91, 0x87, 0x20, 0x34, 0x02, 0x40, + 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x04, 0x04, 0x61, + 0x81, 0xE0, 0x1F, 0xE0, 0x41, 0x82, 0x06, 0x10, 0x11, 0x00, 0x88, 0x04, + 0x40, 0x22, 0x01, 0x10, 0x11, 0x00, 0x88, 0x08, 0x40, 0xC2, 0x0C, 0x7F, + 0x80, 0x1F, 0xFC, 0x20, 0x10, 0x80, 0x82, 0x00, 0x08, 0x00, 0x22, 0x01, + 0xF8, 0x04, 0x20, 0x10, 0x00, 0x40, 0x01, 0x01, 0x0C, 0x04, 0x20, 0x13, + 0xFF, 0xC0, 0x1F, 0xFC, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x00, 0x22, + 0x01, 0xF8, 0x04, 0x20, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0C, 0x00, 0x20, + 0x03, 0xF8, 0x00, 0x07, 0xD0, 0x83, 0x30, 0x12, 0x00, 0x40, 0x04, 0x00, + 0x80, 0x08, 0x00, 0x83, 0xE8, 0x04, 0x80, 0x4C, 0x04, 0x60, 0x41, 0xF8, + 0x0F, 0x3C, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x81, 0x01, 0x02, 0x03, + 0xFC, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x40, 0x80, 0x81, 0x02, 0x02, + 0x1F, 0x1E, 0x00, 0x3F, 0xE0, 0x40, 0x08, 0x01, 0x00, 0x20, 0x08, 0x01, + 0x00, 0x20, 0x04, 0x00, 0x80, 0x20, 0x04, 0x00, 0x81, 0xFF, 0x00, 0x03, + 0xFE, 0x00, 0x20, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x20, 0x40, 0x40, 0x80, 0x81, 0x01, 0x02, 0x04, 0x06, 0x10, 0x07, + 0xC0, 0x00, 0x1F, 0x1E, 0x10, 0x10, 0x20, 0xC0, 0x43, 0x00, 0x88, 0x01, + 0x20, 0x07, 0xC0, 0x0C, 0x40, 0x10, 0x40, 0x20, 0x80, 0x41, 0x01, 0x81, + 0x02, 0x02, 0x1F, 0x87, 0x00, 0x3F, 0x80, 0x40, 0x04, 0x00, 0x40, 0x08, + 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x01, 0x10, 0x11, 0x02, 0x10, + 0x2F, 0xFE, 0x1C, 0x03, 0x85, 0x03, 0x02, 0x82, 0x81, 0x41, 0x40, 0xA1, + 0x20, 0x89, 0x30, 0x44, 0x90, 0x22, 0x88, 0x11, 0x44, 0x08, 0x42, 0x08, + 0x03, 0x04, 0x01, 0x02, 0x00, 0x87, 0xC3, 0xE0, 0x3C, 0x3E, 0x18, 0x08, + 0x38, 0x20, 0x50, 0x41, 0x20, 0x82, 0x61, 0x04, 0x42, 0x08, 0x88, 0x10, + 0x90, 0x41, 0x20, 0x83, 0x41, 0x02, 0x82, 0x06, 0x1F, 0x04, 0x00, 0x03, + 0xC0, 0x61, 0x84, 0x04, 0x40, 0x14, 0x00, 0xA0, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x14, 0x00, 0xA0, 0x08, 0x80, 0x86, 0x18, 0x0F, 0x00, 0x1F, 0xE0, + 0x40, 0x82, 0x02, 0x10, 0x10, 0x80, 0x84, 0x08, 0x40, 0x83, 0xF8, 0x10, + 0x00, 0x80, 0x04, 0x00, 0x60, 0x02, 0x00, 0x7F, 0x00, 0x03, 0xC0, 0x61, + 0x84, 0x04, 0x40, 0x14, 0x00, 0xA0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x14, + 0x00, 0xA0, 0x08, 0x80, 0x86, 0x18, 0x1F, 0x00, 0x40, 0x0F, 0xC4, 0x41, + 0xC0, 0x1F, 0xE0, 0x40, 0x82, 0x02, 0x10, 0x10, 0x80, 0x84, 0x08, 0x60, + 0x83, 0xF8, 0x10, 0xC0, 0x82, 0x04, 0x08, 0x40, 0x42, 0x03, 0x7E, 0x0C, + 0x07, 0xA3, 0x0C, 0x40, 0x90, 0x12, 0x00, 0x40, 0x06, 0x00, 0x3C, 0x00, + 0x40, 0x0A, 0x01, 0x40, 0x4C, 0x11, 0x7C, 0x00, 0xFF, 0xE8, 0x42, 0x84, + 0x20, 0x40, 0x04, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x10, + 0x01, 0x00, 0x10, 0x0F, 0xE0, 0xF8, 0xF9, 0x00, 0x88, 0x08, 0x80, 0x44, + 0x02, 0x20, 0x11, 0x01, 0x08, 0x08, 0x80, 0x44, 0x02, 0x20, 0x31, 0x01, + 0x04, 0x30, 0x1E, 0x00, 0xF8, 0x7D, 0x00, 0x42, 0x01, 0x08, 0x08, 0x20, + 0x40, 0x81, 0x02, 0x08, 0x08, 0x20, 0x11, 0x00, 0x48, 0x01, 0x20, 0x05, + 0x00, 0x14, 0x00, 0x60, 0x00, 0xF8, 0x7D, 0x00, 0x44, 0x01, 0x11, 0x84, + 0x46, 0x21, 0x18, 0x84, 0xA2, 0x12, 0x90, 0x91, 0x42, 0x45, 0x0A, 0x14, + 0x28, 0x60, 0xC1, 0x83, 0x06, 0x00, 0x1E, 0x1E, 0x10, 0x10, 0x10, 0x40, + 0x21, 0x00, 0x24, 0x00, 0x78, 0x00, 0x60, 0x01, 0xC0, 0x06, 0x80, 0x09, + 0x80, 0x21, 0x00, 0x81, 0x02, 0x02, 0x1E, 0x1F, 0x00, 0xF0, 0xF4, 0x04, + 0x20, 0x82, 0x18, 0x11, 0x01, 0x20, 0x1C, 0x00, 0x80, 0x08, 0x00, 0x80, + 0x10, 0x01, 0x00, 0x10, 0x0F, 0xE0, 0x0F, 0xF1, 0x01, 0x10, 0x21, 0x04, + 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, 0x0C, 0x01, 0x82, 0x10, 0x22, 0x04, + 0x40, 0x47, 0xFC, 0x0E, 0x20, 0x40, 0x81, 0x02, 0x08, 0x10, 0x20, 0x40, + 0x82, 0x04, 0x08, 0x10, 0x20, 0x81, 0xE0, 0x84, 0x20, 0x84, 0x20, 0x84, + 0x21, 0x04, 0x21, 0x08, 0x21, 0x08, 0x40, 0x1E, 0x04, 0x08, 0x20, 0x40, + 0x81, 0x02, 0x04, 0x10, 0x20, 0x40, 0x81, 0x02, 0x08, 0x11, 0xE0, 0x04, + 0x06, 0x04, 0x84, 0x44, 0x14, 0x0C, 0xFF, 0xFE, 0x99, 0x90, 0x1F, 0xC0, + 0x06, 0x00, 0x20, 0x02, 0x1F, 0xE6, 0x04, 0xC0, 0x48, 0x04, 0x81, 0xC7, + 0xEF, 0x18, 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x09, 0xF0, 0x50, + 0xC3, 0x03, 0x10, 0x08, 0x80, 0x48, 0x02, 0x40, 0x23, 0x03, 0x1C, 0x33, + 0xBE, 0x00, 0x0F, 0xD3, 0x07, 0x60, 0x24, 0x02, 0x80, 0x08, 0x00, 0x80, + 0x08, 0x06, 0x41, 0xC3, 0xF0, 0x00, 0x38, 0x00, 0x40, 0x02, 0x00, 0x20, + 0x01, 0x07, 0xC8, 0x43, 0x44, 0x0E, 0x40, 0x24, 0x01, 0x20, 0x09, 0x00, + 0xC8, 0x0E, 0x20, 0xE0, 0xF9, 0xC0, 0x0F, 0x86, 0x09, 0x00, 0xA0, 0x1F, + 0xFF, 0x00, 0x20, 0x06, 0x00, 0x60, 0xC7, 0xE0, 0x01, 0xF8, 0x10, 0x01, + 0x00, 0x08, 0x00, 0x40, 0x1F, 0xF0, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, + 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x03, 0xFE, 0x00, 0x0F, 0x31, 0x86, + 0x10, 0x10, 0x80, 0x88, 0x04, 0x40, 0x22, 0x02, 0x10, 0x10, 0x43, 0x81, + 0xE4, 0x00, 0x40, 0x02, 0x00, 0x20, 0x3E, 0x00, 0x1C, 0x00, 0x20, 0x03, + 0x00, 0x10, 0x00, 0x80, 0x05, 0xF0, 0x30, 0xC3, 0x02, 0x10, 0x10, 0x80, + 0x84, 0x0C, 0x20, 0x63, 0x02, 0x10, 0x13, 0xE3, 0xE0, 0x01, 0x80, 0x40, + 0x10, 0x00, 0x00, 0x07, 0xC0, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, + 0x04, 0x01, 0x0F, 0xFC, 0x00, 0x40, 0x10, 0x0C, 0x00, 0x00, 0x07, 0xF0, + 0x04, 0x01, 0x00, 0x40, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, + 0x01, 0x00, 0x8F, 0xC0, 0x18, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, + 0x1F, 0x10, 0x81, 0x30, 0x14, 0x01, 0xC0, 0x26, 0x02, 0x20, 0x21, 0x02, + 0x08, 0xE1, 0xE0, 0x0F, 0x80, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x20, + 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x0F, 0xFC, 0x3B, 0xB8, + 0x33, 0x91, 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x12, 0x10, 0x48, 0x42, + 0x21, 0x0B, 0xC6, 0x30, 0x19, 0xE0, 0xE3, 0x08, 0x11, 0x01, 0x10, 0x11, + 0x02, 0x10, 0x21, 0x02, 0x20, 0x2F, 0x87, 0x0F, 0x86, 0x19, 0x80, 0xA0, + 0x18, 0x03, 0x00, 0x60, 0x14, 0x06, 0x61, 0x87, 0xC0, 0x19, 0xF0, 0x28, + 0x20, 0xC0, 0x42, 0x01, 0x10, 0x04, 0x40, 0x11, 0x00, 0x86, 0x06, 0x14, + 0x30, 0xCF, 0x02, 0x00, 0x08, 0x00, 0x20, 0x03, 0xF0, 0x00, 0x0F, 0x39, + 0x85, 0x18, 0x18, 0x80, 0x88, 0x04, 0x40, 0x22, 0x01, 0x18, 0x18, 0x63, + 0x81, 0xE4, 0x00, 0x20, 0x01, 0x00, 0x10, 0x07, 0xE0, 0x1C, 0x78, 0x2C, + 0x01, 0x80, 0x18, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x07, + 0xFC, 0x00, 0x0F, 0x44, 0x32, 0x04, 0x80, 0x1E, 0x00, 0x60, 0x0A, 0x02, + 0xC1, 0x2F, 0x80, 0x10, 0x08, 0x04, 0x02, 0x0F, 0xF9, 0x00, 0x80, 0x40, + 0x20, 0x20, 0x10, 0x08, 0x04, 0x19, 0xF0, 0xE0, 0xF2, 0x02, 0x40, 0x24, + 0x02, 0x40, 0x24, 0x06, 0x40, 0x44, 0x04, 0x41, 0xC3, 0xE6, 0xF8, 0xFA, + 0x01, 0x08, 0x10, 0x41, 0x02, 0x08, 0x10, 0x80, 0x48, 0x02, 0x40, 0x14, + 0x00, 0xC0, 0x00, 0xE0, 0x7A, 0x01, 0x10, 0x08, 0x8C, 0x84, 0xA4, 0x25, + 0x21, 0x4A, 0x0A, 0x50, 0x63, 0x02, 0x18, 0x00, 0x1E, 0x3C, 0x20, 0x40, + 0x46, 0x00, 0xB0, 0x03, 0x00, 0x0E, 0x00, 0xC8, 0x06, 0x10, 0x20, 0x23, + 0xE3, 0xC0, 0x3C, 0x3C, 0x40, 0x20, 0x81, 0x02, 0x08, 0x08, 0x20, 0x31, + 0x00, 0x48, 0x01, 0x40, 0x05, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x08, + 0x03, 0xF0, 0x00, 0x3F, 0xC4, 0x18, 0x06, 0x01, 0x80, 0x60, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x9F, 0xF0, 0x06, 0x10, 0x20, 0x41, 0x02, 0x04, 0x08, + 0x21, 0x80, 0x81, 0x02, 0x08, 0x10, 0x20, 0x40, 0xC0, 0x01, 0x11, 0x12, + 0x22, 0x24, 0x44, 0x44, 0x88, 0x80, 0x0C, 0x08, 0x10, 0x20, 0x40, 0x82, + 0x04, 0x08, 0x0C, 0x20, 0x81, 0x02, 0x04, 0x08, 0x21, 0x80, 0x38, 0x28, + 0x88, 0x0E, 0x00}; + +const GFXglyph FreeMonoOblique12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 14, 0, 1}, // 0x20 ' ' + {0, 4, 15, 14, 6, -14}, // 0x21 '!' + {8, 8, 7, 14, 5, -14}, // 0x22 '"' + {15, 11, 16, 14, 3, -14}, // 0x23 '#' + {37, 10, 18, 14, 4, -15}, // 0x24 '$' + {60, 11, 15, 14, 3, -14}, // 0x25 '%' + {81, 9, 12, 14, 3, -11}, // 0x26 '&' + {95, 3, 7, 14, 8, -14}, // 0x27 ''' + {98, 5, 18, 14, 8, -14}, // 0x28 '(' + {110, 5, 18, 14, 4, -14}, // 0x29 ')' + {122, 9, 9, 14, 5, -14}, // 0x2A '*' + {133, 11, 11, 14, 3, -11}, // 0x2B '+' + {149, 6, 7, 14, 3, -3}, // 0x2C ',' + {155, 11, 1, 14, 3, -6}, // 0x2D '-' + {157, 3, 3, 14, 6, -2}, // 0x2E '.' + {159, 13, 18, 14, 2, -15}, // 0x2F '/' + {189, 10, 15, 14, 4, -14}, // 0x30 '0' + {208, 9, 15, 14, 3, -14}, // 0x31 '1' + {225, 12, 15, 14, 2, -14}, // 0x32 '2' + {248, 11, 15, 14, 3, -14}, // 0x33 '3' + {269, 10, 15, 14, 3, -14}, // 0x34 '4' + {288, 11, 15, 14, 3, -14}, // 0x35 '5' + {309, 11, 15, 14, 4, -14}, // 0x36 '6' + {330, 10, 15, 14, 5, -14}, // 0x37 '7' + {349, 11, 15, 14, 3, -14}, // 0x38 '8' + {370, 11, 15, 14, 3, -14}, // 0x39 '9' + {391, 5, 10, 14, 5, -9}, // 0x3A ':' + {398, 7, 13, 14, 3, -9}, // 0x3B ';' + {410, 12, 11, 14, 3, -11}, // 0x3C '<' + {427, 13, 4, 14, 2, -8}, // 0x3D '=' + {434, 12, 11, 14, 2, -11}, // 0x3E '>' + {451, 8, 14, 14, 6, -13}, // 0x3F '?' + {465, 10, 16, 14, 3, -14}, // 0x40 '@' + {485, 14, 14, 14, 0, -13}, // 0x41 'A' + {510, 13, 14, 14, 1, -13}, // 0x42 'B' + {533, 12, 14, 14, 3, -13}, // 0x43 'C' + {554, 13, 14, 14, 1, -13}, // 0x44 'D' + {577, 14, 14, 14, 1, -13}, // 0x45 'E' + {602, 14, 14, 14, 1, -13}, // 0x46 'F' + {627, 12, 14, 14, 3, -13}, // 0x47 'G' + {648, 15, 14, 14, 1, -13}, // 0x48 'H' + {675, 11, 14, 14, 3, -13}, // 0x49 'I' + {695, 15, 14, 14, 2, -13}, // 0x4A 'J' + {722, 15, 14, 14, 1, -13}, // 0x4B 'K' + {749, 12, 14, 14, 2, -13}, // 0x4C 'L' + {770, 17, 14, 14, 0, -13}, // 0x4D 'M' + {800, 15, 14, 14, 1, -13}, // 0x4E 'N' + {827, 13, 14, 14, 2, -13}, // 0x4F 'O' + {850, 13, 14, 14, 1, -13}, // 0x50 'P' + {873, 13, 17, 14, 2, -13}, // 0x51 'Q' + {901, 13, 14, 14, 1, -13}, // 0x52 'R' + {924, 11, 14, 14, 3, -13}, // 0x53 'S' + {944, 12, 14, 14, 4, -13}, // 0x54 'T' + {965, 13, 14, 14, 3, -13}, // 0x55 'U' + {988, 14, 14, 14, 3, -13}, // 0x56 'V' + {1013, 14, 14, 14, 3, -13}, // 0x57 'W' + {1038, 15, 14, 14, 1, -13}, // 0x58 'X' + {1065, 12, 14, 14, 4, -13}, // 0x59 'Y' + {1086, 12, 14, 14, 2, -13}, // 0x5A 'Z' + {1107, 7, 18, 14, 6, -14}, // 0x5B '[' + {1123, 5, 18, 14, 6, -15}, // 0x5C '\' + {1135, 7, 18, 14, 3, -14}, // 0x5D ']' + {1151, 9, 6, 14, 5, -14}, // 0x5E '^' + {1158, 15, 1, 14, -1, 3}, // 0x5F '_' + {1160, 3, 4, 14, 6, -15}, // 0x60 '`' + {1162, 12, 10, 14, 2, -9}, // 0x61 'a' + {1177, 13, 15, 14, 1, -14}, // 0x62 'b' + {1202, 12, 10, 14, 3, -9}, // 0x63 'c' + {1217, 13, 15, 14, 2, -14}, // 0x64 'd' + {1242, 11, 10, 14, 3, -9}, // 0x65 'e' + {1256, 13, 15, 14, 3, -14}, // 0x66 'f' + {1281, 13, 14, 14, 3, -9}, // 0x67 'g' + {1304, 13, 15, 14, 1, -14}, // 0x68 'h' + {1329, 10, 15, 14, 2, -14}, // 0x69 'i' + {1348, 10, 19, 14, 2, -14}, // 0x6A 'j' + {1372, 12, 15, 14, 2, -14}, // 0x6B 'k' + {1395, 10, 15, 14, 2, -14}, // 0x6C 'l' + {1414, 14, 10, 14, 0, -9}, // 0x6D 'm' + {1432, 12, 10, 14, 1, -9}, // 0x6E 'n' + {1447, 11, 10, 14, 3, -9}, // 0x6F 'o' + {1461, 14, 14, 14, 0, -9}, // 0x70 'p' + {1486, 13, 14, 14, 3, -9}, // 0x71 'q' + {1509, 13, 10, 14, 2, -9}, // 0x72 'r' + {1526, 10, 10, 14, 3, -9}, // 0x73 's' + {1539, 9, 14, 14, 3, -13}, // 0x74 't' + {1555, 12, 10, 14, 2, -9}, // 0x75 'u' + {1570, 13, 10, 14, 3, -9}, // 0x76 'v' + {1587, 13, 10, 14, 3, -9}, // 0x77 'w' + {1604, 14, 10, 14, 1, -9}, // 0x78 'x' + {1622, 14, 14, 14, 1, -9}, // 0x79 'y' + {1647, 11, 10, 14, 3, -9}, // 0x7A 'z' + {1661, 7, 18, 14, 5, -14}, // 0x7B '{' + {1677, 4, 17, 14, 6, -13}, // 0x7C '|' + {1686, 7, 18, 14, 4, -14}, // 0x7D '}' + {1702, 11, 3, 14, 3, -7}}; // 0x7E '~' + +const GFXfont FreeMonoOblique12pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique12pt7bBitmaps, + (GFXglyph *)FreeMonoOblique12pt7bGlyphs, 0x20, 0x7E, 24}; + +// Approx. 2379 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h new file mode 100644 index 0000000..c12ae08 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h @@ -0,0 +1,400 @@ +#pragma once +#include + +const uint8_t FreeMonoOblique18pt7bBitmaps[] PROGMEM = { + 0x00, 0x1C, 0x38, 0x70, 0xC1, 0x83, 0x06, 0x18, 0x30, 0x60, 0xC1, 0x02, + 0x04, 0x00, 0x00, 0x01, 0xC7, 0x8F, 0x1C, 0x00, 0x78, 0x7B, 0xC3, 0xFC, + 0x3D, 0xE1, 0xEF, 0x0F, 0x70, 0x73, 0x83, 0x98, 0x18, 0xC0, 0xC6, 0x06, + 0x00, 0x00, 0x8C, 0x01, 0x18, 0x06, 0x20, 0x08, 0x40, 0x11, 0x80, 0x62, + 0x00, 0xC4, 0x01, 0x18, 0x02, 0x30, 0x7F, 0xFC, 0x10, 0x80, 0x23, 0x00, + 0xC4, 0x01, 0x88, 0x3F, 0xFF, 0x04, 0x60, 0x18, 0x80, 0x21, 0x00, 0x46, + 0x01, 0x88, 0x03, 0x10, 0x04, 0x60, 0x08, 0xC0, 0x31, 0x00, 0x00, 0x30, + 0x00, 0x20, 0x00, 0x20, 0x00, 0xF9, 0x03, 0x0F, 0x06, 0x03, 0x04, 0x03, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x78, + 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x40, 0x04, 0x40, 0x08, 0x40, 0x18, + 0xF0, 0x60, 0x9F, 0x80, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x03, 0xC0, 0x0C, 0x60, 0x08, 0x20, 0x10, 0x20, 0x10, 0x20, + 0x10, 0x40, 0x18, 0x80, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x78, 0x07, 0xC0, + 0x3C, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x02, 0x18, 0x04, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x10, 0x0C, 0x20, 0x07, 0xC0, 0x01, 0xF0, 0x11, 0x81, + 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x80, 0x04, 0x00, 0xF0, + 0x09, 0x86, 0x84, 0x48, 0x32, 0x40, 0xA2, 0x07, 0x10, 0x30, 0x43, 0x81, + 0xE7, 0x80, 0x7B, 0xFD, 0xEF, 0x73, 0x98, 0xC6, 0x00, 0x01, 0x02, 0x06, + 0x0C, 0x0C, 0x18, 0x10, 0x30, 0x30, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x40, 0x60, 0x60, 0x20, 0x04, 0x06, + 0x06, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, + 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x40, 0xC0, 0x01, + 0x00, 0x04, 0x00, 0x10, 0x00, 0xC6, 0xE3, 0xF8, 0x7E, 0x00, 0x70, 0x03, + 0x40, 0x19, 0x80, 0xC2, 0x06, 0x0C, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x02, + 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE, + 0x02, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x02, + 0x00, 0x04, 0x00, 0x0F, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1, 0xC0, 0xC0, + 0xE0, 0x60, 0x00, 0xFF, 0xFF, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x04, 0x00, + 0x01, 0x80, 0x00, 0x60, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, + 0x10, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x20, 0x00, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0x40, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x80, 0x00, 0x20, + 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x01, + 0xF0, 0x18, 0x60, 0x80, 0x86, 0x01, 0x10, 0x04, 0x80, 0x12, 0x00, 0x50, + 0x01, 0x40, 0x0D, 0x00, 0x24, 0x00, 0xA0, 0x02, 0x80, 0x1A, 0x00, 0x48, + 0x01, 0x20, 0x0C, 0x80, 0x22, 0x01, 0x84, 0x0C, 0x18, 0x60, 0x3E, 0x00, + 0x00, 0x60, 0x07, 0x00, 0x68, 0x06, 0x40, 0xE4, 0x04, 0x20, 0x01, 0x00, + 0x08, 0x00, 0x40, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, + 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x00, + 0x3C, 0x00, 0x61, 0x80, 0x40, 0x40, 0x40, 0x10, 0x60, 0x08, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, + 0x00, 0x1C, 0x01, 0x1C, 0x00, 0x8F, 0xFF, 0xC0, 0x00, 0xFC, 0x03, 0x06, + 0x06, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x0C, 0x00, 0xF0, 0x00, 0x18, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x40, 0x18, 0x70, 0x30, + 0x0F, 0xC0, 0x00, 0x1C, 0x00, 0xD0, 0x06, 0x80, 0x32, 0x00, 0x88, 0x04, + 0x20, 0x30, 0x81, 0x84, 0x04, 0x10, 0x20, 0x41, 0x81, 0x0C, 0x08, 0x60, + 0x21, 0x00, 0x8F, 0xFF, 0x80, 0x18, 0x00, 0x40, 0x01, 0x00, 0x04, 0x00, + 0x10, 0x07, 0xE0, 0x03, 0xFF, 0x03, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, + 0x40, 0x00, 0x20, 0x00, 0x30, 0x00, 0x1B, 0xE0, 0x0E, 0x0C, 0x00, 0x02, + 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x04, 0x60, 0x04, 0x18, 0x04, 0x06, 0x0C, 0x00, 0xF8, 0x00, + 0x00, 0x3F, 0x00, 0xC0, 0x03, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x30, 0x00, 0x20, 0x00, 0x40, 0x00, 0x43, 0xE0, 0x4C, 0x30, 0xB0, 0x18, + 0xE0, 0x08, 0xC0, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x10, 0xC0, 0x10, + 0x40, 0x20, 0x20, 0xC0, 0x1F, 0x00, 0xFF, 0xFC, 0x00, 0xE0, 0x04, 0x00, + 0x60, 0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40, + 0x06, 0x00, 0x20, 0x03, 0x00, 0x10, 0x01, 0x80, 0x08, 0x00, 0xC0, 0x04, + 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0xF0, 0x06, 0x18, 0x10, 0x18, 0x40, + 0x11, 0x00, 0x22, 0x00, 0x44, 0x00, 0x88, 0x02, 0x18, 0x08, 0x18, 0x60, + 0x1F, 0x80, 0xC1, 0x82, 0x01, 0x88, 0x01, 0x20, 0x02, 0x40, 0x04, 0x80, + 0x09, 0x00, 0x23, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0x00, 0xF0, 0x06, + 0x18, 0x10, 0x10, 0x40, 0x30, 0x80, 0x22, 0x00, 0x44, 0x00, 0x88, 0x03, + 0x10, 0x0E, 0x30, 0x34, 0x30, 0xD0, 0x3E, 0x20, 0x00, 0x40, 0x01, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0xC0, 0x02, 0x00, 0x18, 0x0F, 0xC0, + 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xC7, 0xCF, + 0x9F, 0x1C, 0x00, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x1C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x0F, 0x01, + 0xC0, 0x70, 0x0E, 0x03, 0x80, 0x60, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xE0, 0x00, 0x38, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x18, 0x00, 0x03, 0x80, + 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, + 0x00, 0x0E, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, + 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x1F, 0xCE, 0x06, 0x80, + 0x38, 0x01, 0x80, 0x10, 0x01, 0x00, 0x20, 0x04, 0x01, 0x80, 0xF0, 0x18, + 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x80, 0xF8, + 0x07, 0x00, 0x01, 0xF0, 0x0C, 0x30, 0x30, 0x30, 0x40, 0x21, 0x00, 0x44, + 0x00, 0x88, 0x01, 0x10, 0x1E, 0x40, 0xC4, 0x86, 0x11, 0x08, 0x22, 0x20, + 0x48, 0x40, 0x90, 0x82, 0x21, 0x84, 0x40, 0xFC, 0x80, 0x01, 0x00, 0x02, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x0C, 0x18, 0x07, 0xC0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x68, 0x00, 0x06, 0x40, 0x00, 0x32, 0x00, 0x03, 0x10, 0x00, + 0x10, 0x80, 0x01, 0x84, 0x00, 0x18, 0x10, 0x00, 0xC0, 0x80, 0x0C, 0x04, + 0x00, 0x60, 0x20, 0x06, 0x01, 0x00, 0x3F, 0xFC, 0x02, 0x00, 0x20, 0x10, + 0x01, 0x01, 0x00, 0x08, 0x08, 0x00, 0x40, 0x80, 0x02, 0x0C, 0x00, 0x09, + 0xFC, 0x07, 0xF0, 0x0F, 0xFF, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, + 0x02, 0x00, 0x40, 0x80, 0x10, 0x40, 0x08, 0x10, 0x06, 0x04, 0x03, 0x01, + 0xFF, 0x80, 0x40, 0x38, 0x20, 0x02, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, + 0x04, 0x40, 0x01, 0x10, 0x00, 0x84, 0x00, 0x41, 0x00, 0x23, 0xFF, 0xF0, + 0x00, 0xFC, 0x40, 0xC1, 0xF0, 0xC0, 0x1C, 0x60, 0x06, 0x10, 0x00, 0x88, + 0x00, 0x24, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x08, 0x03, 0x01, 0x83, 0x80, 0x3F, 0x00, 0x0F, 0xFE, 0x00, + 0x80, 0xC0, 0x20, 0x18, 0x10, 0x02, 0x04, 0x00, 0x41, 0x00, 0x10, 0x40, + 0x04, 0x20, 0x01, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, 0x08, 0x20, 0x02, + 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x10, 0x40, 0x08, 0x20, 0x06, 0x08, + 0x03, 0x02, 0x01, 0x83, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x10, 0x02, 0x02, + 0x00, 0x60, 0x20, 0x06, 0x02, 0x00, 0x60, 0x20, 0x00, 0x04, 0x00, 0x00, + 0x40, 0x80, 0x04, 0x10, 0x00, 0x7F, 0x00, 0x04, 0x10, 0x00, 0x81, 0x00, + 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x81, 0x00, 0x08, 0x10, 0x00, + 0x81, 0x00, 0x18, 0x10, 0x01, 0x8F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x10, + 0x03, 0x02, 0x00, 0x30, 0x20, 0x03, 0x02, 0x00, 0x20, 0x20, 0x00, 0x04, + 0x00, 0x00, 0x40, 0x80, 0x04, 0x10, 0x00, 0x7F, 0x00, 0x04, 0x10, 0x00, + 0x81, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, + 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFE, + 0x40, 0xC0, 0xF0, 0x40, 0x1C, 0x20, 0x03, 0x10, 0x00, 0x88, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x01, + 0xFE, 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x40, 0x04, + 0x18, 0x01, 0x03, 0x81, 0xC0, 0x3F, 0x80, 0x07, 0xE1, 0xF8, 0x08, 0x02, + 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x20, 0x04, 0x01, 0x00, 0x20, 0x18, + 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x3F, 0xFC, 0x01, 0x00, 0x60, + 0x10, 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x20, 0x04, 0x02, 0x00, + 0x40, 0x10, 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x81, 0xF8, 0x3F, 0x00, + 0x0F, 0xFF, 0x80, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x04, + 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x0C, 0x04, 0x00, + 0x80, 0x40, 0x08, 0x08, 0x00, 0x80, 0x80, 0x08, 0x08, 0x01, 0x00, 0x80, + 0x10, 0x0C, 0x02, 0x00, 0x60, 0xC0, 0x01, 0xF0, 0x00, 0x0F, 0xE1, 0xF8, + 0x08, 0x03, 0x00, 0x80, 0x60, 0x04, 0x06, 0x00, 0x20, 0x60, 0x01, 0x06, + 0x00, 0x10, 0xC0, 0x00, 0x8C, 0x00, 0x04, 0xC0, 0x00, 0x2F, 0x80, 0x01, + 0x8E, 0x00, 0x18, 0x30, 0x00, 0x80, 0xC0, 0x04, 0x06, 0x00, 0x20, 0x10, + 0x02, 0x00, 0xC0, 0x10, 0x06, 0x00, 0x80, 0x30, 0x04, 0x00, 0x81, 0xFC, + 0x07, 0x80, 0x07, 0xFC, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, + 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, + 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x10, 0x20, 0x04, + 0x08, 0x01, 0x04, 0x00, 0x81, 0x00, 0x20, 0x40, 0x0B, 0xFF, 0xFE, 0x0F, + 0x00, 0x1E, 0x03, 0x00, 0x38, 0x05, 0x00, 0x68, 0x04, 0x80, 0x68, 0x04, + 0x80, 0xC8, 0x04, 0x80, 0x90, 0x04, 0x81, 0x90, 0x08, 0x43, 0x10, 0x08, + 0x42, 0x10, 0x08, 0x46, 0x10, 0x08, 0x4C, 0x20, 0x10, 0x2C, 0x20, 0x10, + 0x38, 0x20, 0x10, 0x30, 0x20, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, + 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0xFC, 0x07, 0xE0, 0x1F, + 0x01, 0xFC, 0x0C, 0x00, 0x80, 0x78, 0x02, 0x01, 0xE0, 0x18, 0x04, 0x80, + 0x60, 0x13, 0x01, 0x00, 0x4C, 0x04, 0x03, 0x18, 0x10, 0x0C, 0x60, 0xC0, + 0x20, 0x83, 0x00, 0x83, 0x08, 0x06, 0x0C, 0x20, 0x18, 0x18, 0x80, 0x40, + 0x66, 0x01, 0x00, 0x98, 0x04, 0x03, 0x40, 0x30, 0x0D, 0x00, 0xC0, 0x14, + 0x02, 0x00, 0x70, 0x3F, 0x80, 0xC0, 0x00, 0xF8, 0x01, 0x83, 0x01, 0x00, + 0xC1, 0x00, 0x21, 0x00, 0x19, 0x00, 0x04, 0x80, 0x02, 0x80, 0x01, 0x40, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x28, 0x00, 0x14, 0x00, 0x12, + 0x00, 0x09, 0x80, 0x08, 0x40, 0x08, 0x30, 0x08, 0x0C, 0x18, 0x01, 0xF0, + 0x00, 0x0F, 0xFE, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, 0x02, 0x00, + 0x40, 0x80, 0x10, 0x40, 0x04, 0x10, 0x02, 0x04, 0x01, 0x01, 0x01, 0x80, + 0x7F, 0x80, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x40, + 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xF8, + 0x01, 0x83, 0x01, 0x00, 0xC1, 0x00, 0x21, 0x00, 0x19, 0x00, 0x05, 0x00, + 0x02, 0x80, 0x01, 0x40, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x28, + 0x00, 0x14, 0x00, 0x12, 0x00, 0x09, 0x80, 0x08, 0x40, 0x08, 0x30, 0x08, + 0x0C, 0x18, 0x03, 0xF0, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0xFE, 0x18, 0xC0, + 0xF0, 0x0F, 0xFE, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, 0x02, 0x00, + 0x40, 0x80, 0x10, 0x40, 0x04, 0x10, 0x02, 0x04, 0x01, 0x01, 0x01, 0x80, + 0x7F, 0x80, 0x20, 0x60, 0x08, 0x0C, 0x02, 0x03, 0x80, 0x80, 0x60, 0x40, + 0x18, 0x10, 0x03, 0x04, 0x00, 0xC1, 0x00, 0x1B, 0xF8, 0x07, 0x00, 0x7E, + 0x40, 0x60, 0xF0, 0x20, 0x1C, 0x10, 0x02, 0x08, 0x00, 0x82, 0x00, 0x00, + 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00, + 0x18, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x02, + 0x38, 0x01, 0x0B, 0x81, 0x82, 0x3F, 0x80, 0x3F, 0xFF, 0xA0, 0x20, 0x50, + 0x10, 0x28, 0x08, 0x24, 0x08, 0x10, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x1F, + 0xFC, 0x00, 0x7E, 0x0F, 0xC4, 0x00, 0x42, 0x00, 0x10, 0x80, 0x08, 0x20, + 0x02, 0x08, 0x00, 0x82, 0x00, 0x21, 0x00, 0x08, 0x40, 0x04, 0x10, 0x01, + 0x04, 0x00, 0x41, 0x00, 0x10, 0x80, 0x0C, 0x20, 0x02, 0x08, 0x00, 0x82, + 0x00, 0x60, 0x80, 0x10, 0x10, 0x08, 0x06, 0x0C, 0x00, 0x7C, 0x00, 0xFE, + 0x03, 0xF9, 0x80, 0x02, 0x0C, 0x00, 0x30, 0x20, 0x01, 0x01, 0x00, 0x10, + 0x08, 0x01, 0x80, 0x60, 0x08, 0x03, 0x00, 0xC0, 0x18, 0x04, 0x00, 0x40, + 0x60, 0x02, 0x06, 0x00, 0x10, 0x20, 0x00, 0xC3, 0x00, 0x06, 0x10, 0x00, + 0x31, 0x80, 0x00, 0x88, 0x00, 0x04, 0x80, 0x00, 0x2C, 0x00, 0x01, 0xC0, + 0x00, 0x0E, 0x00, 0x00, 0x7F, 0x07, 0xF2, 0x00, 0x04, 0x20, 0x00, 0xC2, + 0x00, 0x08, 0x20, 0xC0, 0x82, 0x0C, 0x18, 0x21, 0xA1, 0x02, 0x1A, 0x10, + 0x23, 0x23, 0x04, 0x32, 0x30, 0x46, 0x22, 0x04, 0x62, 0x60, 0x4C, 0x26, + 0x04, 0xC2, 0x40, 0x58, 0x24, 0x05, 0x82, 0xC0, 0x70, 0x28, 0x07, 0x02, + 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x00, 0x0F, 0xC1, 0xF8, 0x30, 0x03, 0x00, + 0xC0, 0x30, 0x06, 0x03, 0x00, 0x18, 0x10, 0x00, 0xC1, 0x00, 0x03, 0x18, + 0x00, 0x09, 0x80, 0x00, 0x78, 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x01, + 0xA0, 0x00, 0x19, 0x80, 0x01, 0x84, 0x00, 0x18, 0x30, 0x01, 0x80, 0xC0, + 0x08, 0x06, 0x00, 0x80, 0x18, 0x08, 0x00, 0xC1, 0xF8, 0x3F, 0x80, 0x7E, + 0x0F, 0xC4, 0x00, 0xC1, 0x80, 0x60, 0x20, 0x30, 0x0C, 0x08, 0x03, 0x04, + 0x00, 0x43, 0x00, 0x19, 0x80, 0x02, 0xC0, 0x00, 0xE0, 0x00, 0x10, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x40, 0x03, 0xFF, 0x80, 0x0F, 0xFF, 0x86, 0x00, + 0x82, 0x00, 0x81, 0x00, 0xC1, 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0x00, + 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, + 0x60, 0x10, 0x60, 0x18, 0x20, 0x08, 0x20, 0x04, 0x20, 0x02, 0x30, 0x03, + 0x1F, 0xFF, 0x80, 0x07, 0xE0, 0x80, 0x10, 0x02, 0x00, 0xC0, 0x18, 0x02, + 0x00, 0x40, 0x18, 0x03, 0x00, 0x40, 0x08, 0x01, 0x00, 0x60, 0x0C, 0x01, + 0x00, 0x20, 0x04, 0x01, 0x80, 0x30, 0x04, 0x00, 0x80, 0x10, 0x06, 0x00, + 0xFC, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, + 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x07, 0xE0, 0x0C, 0x01, 0x00, 0x20, 0x04, + 0x01, 0x80, 0x30, 0x04, 0x00, 0x80, 0x30, 0x06, 0x00, 0x80, 0x10, 0x02, + 0x00, 0xC0, 0x18, 0x02, 0x00, 0x40, 0x18, 0x03, 0x00, 0x40, 0x08, 0x03, + 0x00, 0x60, 0xF8, 0x00, 0x01, 0x00, 0x1C, 0x01, 0xB0, 0x19, 0x81, 0x86, + 0x18, 0x11, 0x80, 0xD8, 0x03, 0x80, 0x18, 0xFF, 0xFF, 0xF8, 0xC7, 0x1C, + 0x71, 0x80, 0x03, 0xF8, 0x0C, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x07, 0xFC, 0x18, 0x0C, 0x20, 0x04, 0x40, 0x04, 0x80, 0x04, + 0x80, 0x08, 0x80, 0x38, 0xC0, 0xE8, 0x3F, 0x0F, 0x0F, 0x00, 0x00, 0x20, + 0x00, 0x04, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x04, 0x00, 0x00, 0x87, + 0xC0, 0x13, 0x0C, 0x06, 0x80, 0x40, 0xE0, 0x0C, 0x18, 0x00, 0x82, 0x00, + 0x10, 0xC0, 0x02, 0x10, 0x00, 0x42, 0x00, 0x08, 0x40, 0x02, 0x08, 0x00, + 0x43, 0x80, 0x10, 0x70, 0x04, 0x09, 0x83, 0x0F, 0x1F, 0x80, 0x01, 0xFC, + 0x83, 0x03, 0xC6, 0x00, 0xE4, 0x00, 0x22, 0x00, 0x12, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x18, 0x00, 0x64, + 0x00, 0x61, 0x81, 0xC0, 0x7F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x60, 0x3F, 0x18, 0x10, 0x64, + 0x18, 0x0D, 0x08, 0x01, 0xC2, 0x00, 0x71, 0x00, 0x0C, 0x80, 0x02, 0x20, + 0x00, 0x88, 0x00, 0x62, 0x00, 0x18, 0x80, 0x0E, 0x20, 0x03, 0x04, 0x03, + 0x40, 0xC1, 0xB0, 0x1F, 0x8F, 0x00, 0x01, 0xF0, 0x0E, 0x0C, 0x18, 0x06, + 0x30, 0x02, 0x60, 0x01, 0x40, 0x01, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x60, 0x06, 0x30, 0x1C, 0x0F, 0xE0, + 0x00, 0x1F, 0xE0, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x07, 0xFF, 0xC0, 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, + 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0F, + 0xFF, 0x00, 0x03, 0xE3, 0xE1, 0x83, 0x60, 0x40, 0x38, 0x10, 0x03, 0x04, + 0x00, 0x60, 0x80, 0x0C, 0x20, 0x01, 0x84, 0x00, 0x20, 0x80, 0x04, 0x10, + 0x01, 0x82, 0x00, 0x30, 0x60, 0x0C, 0x04, 0x02, 0x80, 0x61, 0x90, 0x07, + 0xC6, 0x00, 0x00, 0xC0, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, + 0x30, 0x00, 0x0C, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x40, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x23, 0xE0, 0x0B, + 0x0C, 0x05, 0x00, 0x81, 0x80, 0x20, 0x40, 0x08, 0x10, 0x02, 0x08, 0x00, + 0x82, 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, 0x10, 0x01, 0x84, 0x00, 0x61, + 0x00, 0x30, 0x40, 0x0C, 0xFC, 0x1F, 0xC0, 0x00, 0x30, 0x00, 0x60, 0x00, + 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x20, + 0x00, 0x40, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x10, 0x1F, 0xFF, + 0x80, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, + 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, + 0x40, 0x00, 0x80, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, + 0x00, 0x80, 0x03, 0x00, 0x0C, 0x0F, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x60, + 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0xC0, 0x00, 0x30, 0xFC, + 0x08, 0x18, 0x02, 0x0C, 0x00, 0x8C, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x05, + 0x80, 0x01, 0xB0, 0x00, 0x46, 0x00, 0x31, 0xC0, 0x0C, 0x30, 0x02, 0x06, + 0x00, 0x80, 0xC0, 0x60, 0x30, 0xF8, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x20, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x08, 0x0F, 0xFF, 0xC0, + 0x1C, 0xF1, 0xE0, 0xF1, 0xE3, 0x0E, 0x1C, 0x10, 0xC1, 0x81, 0x08, 0x10, + 0x30, 0x81, 0x03, 0x18, 0x10, 0x21, 0x83, 0x02, 0x10, 0x30, 0x21, 0x02, + 0x06, 0x10, 0x20, 0x63, 0x02, 0x04, 0x30, 0x60, 0x42, 0x06, 0x04, 0xF8, + 0x70, 0xF0, 0x0E, 0x3E, 0x01, 0x60, 0x81, 0xC0, 0x20, 0xC0, 0x10, 0x40, + 0x08, 0x20, 0x04, 0x30, 0x02, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, + 0x00, 0x42, 0x00, 0x21, 0x00, 0x20, 0x80, 0x13, 0xF0, 0x3E, 0x01, 0xF0, + 0x06, 0x0C, 0x18, 0x06, 0x20, 0x03, 0x60, 0x01, 0x40, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x02, 0x80, 0x06, 0xC0, 0x04, 0x40, 0x18, + 0x30, 0x60, 0x1F, 0x80, 0x0F, 0x1F, 0x80, 0x16, 0x0C, 0x01, 0xC0, 0x20, + 0x30, 0x03, 0x03, 0x00, 0x10, 0x20, 0x01, 0x02, 0x00, 0x10, 0x40, 0x01, + 0x04, 0x00, 0x10, 0x40, 0x02, 0x06, 0x00, 0x60, 0x60, 0x04, 0x0B, 0x00, + 0x80, 0x98, 0x30, 0x08, 0xFC, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, + 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x03, + 0xF1, 0xE1, 0x83, 0x20, 0x40, 0x34, 0x10, 0x03, 0x84, 0x00, 0x30, 0x80, + 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x06, 0x10, 0x00, 0xC2, 0x00, + 0x30, 0x60, 0x0E, 0x04, 0x03, 0x40, 0x60, 0xC8, 0x07, 0xE2, 0x00, 0x00, + 0x40, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x87, 0xC0, 0x23, 0x08, 0x04, 0xC0, 0x00, + 0xE0, 0x00, 0x18, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x02, + 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x08, + 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFA, 0x0C, 0x1C, 0x20, 0x08, 0x80, 0x11, + 0x00, 0x03, 0x00, 0x03, 0xF8, 0x00, 0x7C, 0x00, 0x0C, 0x00, 0x09, 0x00, + 0x16, 0x00, 0x2C, 0x00, 0x9E, 0x06, 0x27, 0xF0, 0x00, 0x08, 0x00, 0x40, + 0x02, 0x00, 0x10, 0x00, 0x80, 0x7F, 0xFC, 0x40, 0x02, 0x00, 0x10, 0x00, + 0x80, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x40, + 0x02, 0x00, 0xD8, 0x1C, 0x3F, 0x00, 0xF0, 0x1E, 0x20, 0x04, 0x80, 0x09, + 0x00, 0x12, 0x00, 0x24, 0x00, 0xC8, 0x01, 0x20, 0x02, 0x40, 0x04, 0x80, + 0x09, 0x00, 0x12, 0x00, 0x64, 0x03, 0x8C, 0x1D, 0x0F, 0xC3, 0x80, 0xFE, + 0x0F, 0xE6, 0x00, 0x20, 0x40, 0x08, 0x08, 0x03, 0x01, 0x80, 0x40, 0x30, + 0x18, 0x06, 0x02, 0x00, 0x40, 0x80, 0x08, 0x30, 0x01, 0x84, 0x00, 0x31, + 0x80, 0x02, 0x20, 0x00, 0x48, 0x00, 0x09, 0x00, 0x01, 0xC0, 0x00, 0xF8, + 0x0F, 0xA0, 0x01, 0x90, 0x00, 0x88, 0x40, 0xC4, 0x30, 0x42, 0x18, 0x61, + 0x1A, 0x20, 0x8D, 0x10, 0x4C, 0x98, 0x26, 0x48, 0x16, 0x2C, 0x0B, 0x14, + 0x07, 0x0A, 0x03, 0x07, 0x01, 0x81, 0x00, 0x0F, 0x83, 0xE0, 0xC0, 0x18, + 0x0C, 0x0C, 0x01, 0x83, 0x00, 0x18, 0xC0, 0x01, 0xB0, 0x00, 0x1C, 0x00, + 0x03, 0x00, 0x00, 0xF0, 0x00, 0x63, 0x00, 0x18, 0x30, 0x06, 0x06, 0x01, + 0x80, 0x60, 0x60, 0x06, 0x3F, 0x07, 0xE0, 0x0F, 0xC0, 0xF8, 0x30, 0x01, + 0x00, 0x80, 0x18, 0x04, 0x00, 0x80, 0x30, 0x0C, 0x01, 0x80, 0xC0, 0x04, + 0x04, 0x00, 0x30, 0x60, 0x01, 0x86, 0x00, 0x04, 0x20, 0x00, 0x23, 0x00, + 0x01, 0xB0, 0x00, 0x0D, 0x00, 0x00, 0x38, 0x00, 0x01, 0x80, 0x00, 0x08, + 0x00, 0x00, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, + 0x20, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFF, 0x10, 0x06, 0x10, 0x0C, 0x10, + 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, + 0x00, 0x0C, 0x00, 0x18, 0x04, 0x30, 0x0C, 0x60, 0x0C, 0xFF, 0xF8, 0x00, + 0xE0, 0x20, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x04, 0x00, + 0x80, 0x20, 0x08, 0x0E, 0x00, 0x60, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, + 0x40, 0x08, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x18, 0x00, 0x00, 0x10, + 0xC3, 0x08, 0x20, 0x86, 0x18, 0x41, 0x04, 0x30, 0xC2, 0x08, 0x21, 0x86, + 0x10, 0x43, 0x0C, 0x20, 0x06, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x10, 0x04, 0x02, 0x00, 0x80, 0x20, 0x0C, 0x01, 0xC0, 0xC0, 0x40, 0x10, + 0x04, 0x03, 0x00, 0x80, 0x20, 0x08, 0x02, 0x01, 0x00, 0xC0, 0xE0, 0x00, + 0x1E, 0x02, 0x66, 0x0D, 0x86, 0x16, 0x06, 0x48, 0x07, 0x00}; + +const GFXglyph FreeMonoOblique18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 21, 0, 1}, // 0x20 ' ' + {0, 7, 22, 21, 9, -21}, // 0x21 '!' + {20, 13, 10, 21, 7, -20}, // 0x22 '"' + {37, 15, 24, 21, 5, -21}, // 0x23 '#' + {82, 16, 26, 21, 4, -22}, // 0x24 '$' + {134, 16, 21, 21, 5, -20}, // 0x25 '%' + {176, 13, 18, 21, 5, -17}, // 0x26 '&' + {206, 5, 10, 21, 12, -20}, // 0x27 ''' + {213, 8, 25, 21, 12, -20}, // 0x28 '(' + {238, 8, 25, 21, 5, -20}, // 0x29 ')' + {263, 14, 11, 21, 7, -19}, // 0x2A '*' + {283, 15, 17, 21, 5, -17}, // 0x2B '+' + {315, 9, 10, 21, 4, -4}, // 0x2C ',' + {327, 16, 1, 21, 5, -9}, // 0x2D '-' + {329, 5, 5, 21, 8, -4}, // 0x2E '.' + {333, 19, 26, 21, 3, -22}, // 0x2F '/' + {395, 14, 21, 21, 5, -20}, // 0x30 '0' + {432, 13, 21, 21, 4, -20}, // 0x31 '1' + {467, 17, 21, 21, 3, -20}, // 0x32 '2' + {512, 16, 21, 21, 3, -20}, // 0x33 '3' + {554, 14, 21, 21, 5, -20}, // 0x34 '4' + {591, 17, 21, 21, 4, -20}, // 0x35 '5' + {636, 16, 21, 21, 6, -20}, // 0x36 '6' + {678, 13, 21, 21, 8, -20}, // 0x37 '7' + {713, 15, 21, 21, 5, -20}, // 0x38 '8' + {753, 15, 21, 21, 5, -20}, // 0x39 '9' + {793, 7, 15, 21, 8, -14}, // 0x3A ':' + {807, 11, 20, 21, 4, -14}, // 0x3B ';' + {835, 17, 16, 21, 5, -17}, // 0x3C '<' + {869, 19, 6, 21, 3, -12}, // 0x3D '=' + {884, 18, 16, 21, 3, -17}, // 0x3E '>' + {920, 12, 20, 21, 8, -19}, // 0x3F '?' + {950, 15, 23, 21, 5, -20}, // 0x40 '@' + {994, 21, 20, 21, 0, -19}, // 0x41 'A' + {1047, 18, 20, 21, 2, -19}, // 0x42 'B' + {1092, 18, 20, 21, 4, -19}, // 0x43 'C' + {1137, 18, 20, 21, 2, -19}, // 0x44 'D' + {1182, 20, 20, 21, 2, -19}, // 0x45 'E' + {1232, 20, 20, 21, 2, -19}, // 0x46 'F' + {1282, 18, 20, 21, 4, -19}, // 0x47 'G' + {1327, 21, 20, 21, 2, -19}, // 0x48 'H' + {1380, 17, 20, 21, 4, -19}, // 0x49 'I' + {1423, 20, 20, 21, 4, -19}, // 0x4A 'J' + {1473, 21, 20, 21, 2, -19}, // 0x4B 'K' + {1526, 18, 20, 21, 2, -19}, // 0x4C 'L' + {1571, 24, 20, 21, 1, -19}, // 0x4D 'M' + {1631, 22, 20, 21, 2, -19}, // 0x4E 'N' + {1686, 17, 20, 21, 4, -19}, // 0x4F 'O' + {1729, 18, 20, 21, 2, -19}, // 0x50 'P' + {1774, 17, 24, 21, 4, -19}, // 0x51 'Q' + {1825, 18, 20, 21, 2, -19}, // 0x52 'R' + {1870, 18, 20, 21, 3, -19}, // 0x53 'S' + {1915, 17, 20, 21, 5, -19}, // 0x54 'T' + {1958, 18, 20, 21, 5, -19}, // 0x55 'U' + {2003, 21, 20, 21, 4, -19}, // 0x56 'V' + {2056, 20, 20, 21, 4, -19}, // 0x57 'W' + {2106, 21, 20, 21, 2, -19}, // 0x58 'X' + {2159, 18, 20, 21, 5, -19}, // 0x59 'Y' + {2204, 17, 20, 21, 4, -19}, // 0x5A 'Z' + {2247, 11, 25, 21, 9, -20}, // 0x5B '[' + {2282, 8, 27, 21, 9, -22}, // 0x5C '\' + {2309, 11, 25, 21, 5, -20}, // 0x5D ']' + {2344, 13, 9, 21, 7, -20}, // 0x5E '^' + {2359, 21, 1, 21, -1, 4}, // 0x5F '_' + {2362, 5, 5, 21, 9, -21}, // 0x60 '`' + {2366, 16, 15, 21, 3, -14}, // 0x61 'a' + {2396, 19, 21, 21, 1, -20}, // 0x62 'b' + {2446, 17, 15, 21, 4, -14}, // 0x63 'c' + {2478, 18, 21, 21, 4, -20}, // 0x64 'd' + {2526, 16, 15, 21, 4, -14}, // 0x65 'e' + {2556, 19, 21, 21, 4, -20}, // 0x66 'f' + {2606, 19, 22, 21, 4, -14}, // 0x67 'g' + {2659, 18, 21, 21, 2, -20}, // 0x68 'h' + {2707, 15, 22, 21, 3, -21}, // 0x69 'i' + {2749, 15, 29, 21, 3, -21}, // 0x6A 'j' + {2804, 18, 21, 21, 2, -20}, // 0x6B 'k' + {2852, 15, 21, 21, 3, -20}, // 0x6C 'l' + {2892, 20, 15, 21, 1, -14}, // 0x6D 'm' + {2930, 17, 15, 21, 2, -14}, // 0x6E 'n' + {2962, 16, 15, 21, 4, -14}, // 0x6F 'o' + {2992, 20, 22, 21, 0, -14}, // 0x70 'p' + {3047, 19, 22, 21, 4, -14}, // 0x71 'q' + {3100, 19, 15, 21, 3, -14}, // 0x72 'r' + {3136, 15, 15, 21, 4, -14}, // 0x73 's' + {3165, 13, 20, 21, 5, -19}, // 0x74 't' + {3198, 15, 15, 21, 4, -14}, // 0x75 'u' + {3227, 19, 15, 21, 4, -14}, // 0x76 'v' + {3263, 17, 15, 21, 5, -14}, // 0x77 'w' + {3295, 19, 15, 21, 2, -14}, // 0x78 'x' + {3331, 21, 22, 21, 1, -14}, // 0x79 'y' + {3389, 16, 15, 21, 4, -14}, // 0x7A 'z' + {3419, 11, 25, 21, 8, -20}, // 0x7B '{' + {3454, 6, 24, 21, 9, -19}, // 0x7C '|' + {3472, 10, 25, 21, 6, -20}, // 0x7D '}' + {3504, 15, 5, 21, 5, -11}}; // 0x7E '~' + +const GFXfont FreeMonoOblique18pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique18pt7bBitmaps, + (GFXglyph *)FreeMonoOblique18pt7bGlyphs, 0x20, 0x7E, 35}; + +// Approx. 4186 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h new file mode 100644 index 0000000..28bbf9e --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h @@ -0,0 +1,645 @@ +#pragma once +#include + +const uint8_t FreeMonoOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xC0, 0xF0, 0x3C, 0x0E, 0x03, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x01, + 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x00, 0xC0, 0x70, 0x1C, 0x06, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0F, 0x83, 0xE0, 0xF8, + 0x1C, 0x00, 0x7E, 0x3F, 0x7E, 0x3F, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, + 0x78, 0x3C, 0xF8, 0x7C, 0xF0, 0x78, 0xF0, 0x78, 0xF0, 0x78, 0xE0, 0x70, + 0xE0, 0x70, 0xE0, 0x70, 0xC0, 0x60, 0x00, 0x18, 0x30, 0x00, 0x61, 0x80, + 0x01, 0x86, 0x00, 0x04, 0x18, 0x00, 0x30, 0xC0, 0x00, 0xC3, 0x00, 0x03, + 0x0C, 0x00, 0x18, 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, + 0x07, 0xFF, 0xFF, 0x1F, 0xFF, 0xFC, 0x03, 0x0C, 0x00, 0x18, 0x30, 0x00, + 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x30, 0xC0, 0x1F, 0xFF, + 0xF8, 0x7F, 0xFF, 0xE0, 0x18, 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, + 0x06, 0x18, 0x00, 0x30, 0x40, 0x00, 0xC3, 0x00, 0x03, 0x0C, 0x00, 0x18, + 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x80, 0x00, 0x3F, 0x00, 0x07, 0xFD, 0x80, + 0x70, 0x7C, 0x06, 0x00, 0xE0, 0x60, 0x02, 0x07, 0x00, 0x10, 0x30, 0x00, + 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18, + 0x00, 0x00, 0xC2, 0x00, 0x06, 0x30, 0x00, 0x61, 0x80, 0x03, 0x1E, 0x00, + 0x30, 0xFC, 0x07, 0x06, 0x7F, 0xF0, 0x00, 0xFE, 0x00, 0x01, 0x80, 0x00, + 0x0C, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x78, 0x00, 0x07, 0xF8, 0x00, 0x38, 0x60, 0x01, 0xC0, 0xC0, + 0x06, 0x03, 0x00, 0x30, 0x0C, 0x00, 0xC0, 0x30, 0x03, 0x01, 0x80, 0x0C, + 0x0E, 0x00, 0x38, 0x70, 0x00, 0x7F, 0x81, 0xC0, 0xF8, 0x3F, 0x00, 0x07, + 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x00, 0x78, 0x00, 0x01, + 0x00, 0x78, 0x00, 0x07, 0xF8, 0x00, 0x38, 0x60, 0x01, 0x80, 0xC0, 0x06, + 0x03, 0x00, 0x30, 0x0C, 0x00, 0xC0, 0x30, 0x03, 0x01, 0x80, 0x0C, 0x0E, + 0x00, 0x18, 0x70, 0x00, 0x7F, 0x80, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, + 0x0F, 0xF8, 0x03, 0x8E, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x01, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x03, + 0xE0, 0x01, 0xCC, 0x0E, 0x60, 0xC3, 0xD8, 0x18, 0x63, 0x03, 0x18, 0xC0, + 0x33, 0x18, 0x06, 0xC3, 0x00, 0x70, 0x60, 0x0E, 0x0C, 0x01, 0xC0, 0xC0, + 0x78, 0x1C, 0x3B, 0xE1, 0xFE, 0x3C, 0x1F, 0x00, 0x00, 0x7E, 0xFD, 0xF3, + 0xE7, 0xCF, 0x3E, 0x78, 0xF1, 0xE3, 0x87, 0x0E, 0x18, 0x00, 0x00, 0x60, + 0x18, 0x07, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x0C, 0x03, 0x80, + 0x60, 0x1C, 0x03, 0x80, 0xE0, 0x1C, 0x03, 0x80, 0xF0, 0x1C, 0x03, 0x80, + 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x30, 0x02, 0x00, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x00, + 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x38, 0x0E, 0x01, + 0x80, 0x70, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x20, 0x00, 0x18, + 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x0E, 0x0C, 0x0B, + 0xF3, 0x3E, 0x3F, 0xFE, 0x01, 0xFC, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x0E, + 0x60, 0x07, 0x18, 0x01, 0x83, 0x00, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x30, 0x00, 0x01, + 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, + 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, + 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xE0, + 0x3C, 0x07, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0x3C, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, + 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x0F, 0xF8, 0x01, + 0xC1, 0xC0, 0x38, 0x0E, 0x07, 0x00, 0x60, 0xE0, 0x03, 0x0C, 0x00, 0x31, + 0x80, 0x03, 0x18, 0x00, 0x33, 0x00, 0x03, 0x30, 0x00, 0x33, 0x00, 0x03, + 0x20, 0x00, 0x26, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x40, 0x00, + 0x4C, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0x00, 0x0C, 0xC0, 0x01, 0x8C, 0x00, + 0x18, 0xC0, 0x01, 0x8C, 0x00, 0x30, 0xC0, 0x07, 0x06, 0x00, 0xE0, 0x60, + 0x1C, 0x03, 0x87, 0x80, 0x3F, 0xF0, 0x00, 0xFC, 0x00, 0x00, 0x0E, 0x00, + 0x0F, 0x00, 0x0F, 0x80, 0x0E, 0xC0, 0x1C, 0xC0, 0x1C, 0x60, 0x1C, 0x30, + 0x08, 0x18, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x07, 0xE0, 0x00, 0x3F, 0xE0, 0x01, 0xE0, 0xE0, 0x07, 0x00, 0xE0, 0x1C, + 0x00, 0xE0, 0x30, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x00, 0x03, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, + 0x00, 0xC3, 0x80, 0x01, 0x87, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x00, + 0x0F, 0xC0, 0x01, 0xFF, 0xC0, 0x1E, 0x07, 0x80, 0xE0, 0x06, 0x03, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, + 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x01, + 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, + 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE3, 0x00, 0x07, 0x0E, 0x00, + 0x38, 0x1E, 0x03, 0xC0, 0x3F, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0xF8, 0x00, 0x1B, 0x00, 0x06, 0x60, 0x01, 0x8C, 0x00, 0x63, + 0x00, 0x18, 0x60, 0x07, 0x0C, 0x00, 0xC1, 0x80, 0x30, 0x30, 0x0C, 0x0C, + 0x03, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x06, 0x00, 0xC1, 0x80, 0x30, + 0x60, 0x06, 0x18, 0x00, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xC0, 0x00, 0xC0, + 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00, + 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x40, + 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, + 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0xBF, 0xC0, 0x0F, 0xFF, + 0x80, 0xF8, 0x1E, 0x02, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, + 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x06, + 0x00, 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0xC0, 0x01, 0x87, 0x00, + 0x38, 0x1E, 0x07, 0x80, 0x7F, 0xF8, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x03, + 0xF0, 0x00, 0xFF, 0xC0, 0x1F, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, + 0x80, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, + 0x0E, 0x00, 0x00, 0x60, 0x00, 0x07, 0x0F, 0x80, 0x31, 0xFF, 0x01, 0x9C, + 0x3C, 0x0D, 0x80, 0x60, 0xD8, 0x03, 0x87, 0x80, 0x0C, 0x38, 0x00, 0x61, + 0xC0, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x00, 0xC3, 0x00, 0x0C, 0x18, 0x00, + 0x60, 0xE0, 0x06, 0x03, 0x00, 0x30, 0x1C, 0x07, 0x00, 0x70, 0x70, 0x01, + 0xFF, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0xFF, 0xDF, 0xFF, 0xFC, 0x00, 0x0F, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x00, 0x3F, 0x00, 0x0F, + 0xFC, 0x01, 0xC1, 0xE0, 0x70, 0x06, 0x06, 0x00, 0x30, 0xC0, 0x03, 0x1C, + 0x00, 0x31, 0x80, 0x03, 0x18, 0x00, 0x31, 0x80, 0x06, 0x18, 0x00, 0xE0, + 0xC0, 0x1C, 0x0F, 0x07, 0x80, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0xE0, 0x70, + 0x18, 0x03, 0x83, 0x00, 0x1C, 0x60, 0x00, 0xC6, 0x00, 0x0C, 0xC0, 0x00, + 0xCC, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0x00, 0x18, 0xC0, 0x03, 0x8E, 0x00, + 0x70, 0x60, 0x0E, 0x07, 0x83, 0xC0, 0x3F, 0xF0, 0x00, 0xFC, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0xFF, 0x80, 0x0F, 0x07, 0x00, 0x70, 0x0E, 0x03, 0x80, + 0x18, 0x0C, 0x00, 0x70, 0x60, 0x00, 0xC1, 0x80, 0x03, 0x0C, 0x00, 0x0C, + 0x30, 0x00, 0x30, 0xC0, 0x01, 0xC3, 0x00, 0x0F, 0x0C, 0x00, 0x6C, 0x38, + 0x03, 0xF0, 0x60, 0x1D, 0x81, 0xE1, 0xE6, 0x03, 0xFE, 0x18, 0x03, 0xE0, + 0xC0, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x03, + 0xC0, 0x00, 0x7C, 0x00, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x00, 0x07, 0x83, + 0xF1, 0xFC, 0x7F, 0x1F, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7E, 0x3F, 0x8F, 0xE3, 0xF0, 0x78, + 0x00, 0x00, 0x3C, 0x00, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3E, + 0x00, 0xF8, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x70, 0x01, + 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0C, 0x00, 0x3F, 0xFF, 0xFF, 0x9F, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, + 0x00, 0x06, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, + 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x70, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x07, 0xF0, 0x3F, 0xFC, 0x78, + 0x1E, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x06, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x07, 0xC0, 0x07, + 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0x7C, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0xF0, 0x07, 0x07, 0x01, 0xC0, + 0x70, 0x60, 0x06, 0x1C, 0x00, 0xC3, 0x00, 0x18, 0xC0, 0x03, 0x18, 0x00, + 0x66, 0x00, 0xFC, 0xC0, 0x7F, 0x98, 0x1C, 0x66, 0x06, 0x0C, 0xC1, 0x81, + 0x98, 0x30, 0x33, 0x0C, 0x0E, 0x61, 0x81, 0x98, 0x30, 0x33, 0x06, 0x06, + 0x60, 0xF0, 0xCC, 0x0F, 0xF9, 0x80, 0x7F, 0x30, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x03, 0x80, 0x00, 0x30, 0x00, 0x07, 0x00, 0x00, + 0x70, 0x18, 0x0F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x0F, + 0xFE, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x31, 0x80, + 0x00, 0x06, 0x30, 0x00, 0x01, 0x86, 0x00, 0x00, 0x60, 0xC0, 0x00, 0x0C, + 0x1C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x40, 0x30, 0x00, 0x18, 0x06, 0x00, + 0x06, 0x00, 0xC0, 0x00, 0xC0, 0x18, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFF, + 0xF0, 0x01, 0xFF, 0xFE, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x18, 0x03, + 0x00, 0x03, 0x00, 0x40, 0x00, 0x30, 0x18, 0x00, 0x06, 0x06, 0x00, 0x00, + 0xC0, 0xC0, 0x00, 0x18, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x0F, 0xFC, 0x03, + 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xC0, 0x06, 0x00, 0x38, 0x01, 0x80, 0x07, + 0x00, 0xC0, 0x00, 0xC0, 0x30, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, + 0x03, 0x00, 0xC0, 0x01, 0x80, 0x60, 0x00, 0xC0, 0x18, 0x01, 0xE0, 0x07, + 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0xE0, 0x03, 0x80, 0x30, 0x00, 0x70, + 0x0C, 0x00, 0x0E, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x60, 0x60, 0x00, + 0x18, 0x18, 0x00, 0x06, 0x06, 0x00, 0x03, 0x01, 0x80, 0x01, 0xC0, 0x60, + 0x00, 0xE0, 0x30, 0x00, 0x70, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xFC, 0xC0, 0x3C, 0x0F, 0x60, 0x78, 0x01, + 0xF0, 0x70, 0x00, 0x70, 0x70, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x30, 0x00, + 0x06, 0x38, 0x00, 0x02, 0x18, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, + 0x60, 0x00, 0x60, 0x38, 0x00, 0xE0, 0x0F, 0x01, 0xE0, 0x03, 0xFF, 0xC0, + 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0C, + 0x00, 0xF0, 0x03, 0x00, 0x1C, 0x01, 0xC0, 0x03, 0x80, 0x60, 0x00, 0x60, + 0x18, 0x00, 0x1C, 0x06, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC0, 0xC0, 0x00, + 0x30, 0x30, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0, + 0x00, 0x60, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x00, 0x03, 0x01, + 0x80, 0x00, 0xC0, 0xE0, 0x00, 0x70, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x0C, + 0x03, 0x00, 0x06, 0x00, 0xC0, 0x07, 0x00, 0x60, 0x07, 0x80, 0xFF, 0xFF, + 0xC0, 0x3F, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, + 0x01, 0x80, 0x01, 0x80, 0x30, 0x00, 0x60, 0x0C, 0x00, 0x0C, 0x01, 0x80, + 0x01, 0x80, 0x30, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, + 0x30, 0x18, 0x00, 0x06, 0x03, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x1F, 0xF8, + 0x00, 0x07, 0x03, 0x00, 0x00, 0xC0, 0x60, 0x00, 0x18, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x01, + 0x80, 0x60, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x01, 0x80, 0x01, 0x80, 0x60, + 0x00, 0x30, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, + 0xF0, 0x7F, 0xFF, 0xFF, 0x00, 0x60, 0x00, 0x30, 0x06, 0x00, 0x06, 0x00, + 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x60, 0x0C, 0x00, + 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x0C, 0x00, 0x01, 0x80, 0xC0, 0x00, + 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x38, 0x18, 0x00, 0x03, 0x01, + 0x80, 0x00, 0x30, 0x18, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0xFC, 0x00, + 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xFC, 0xC0, 0x3C, + 0x0F, 0xE0, 0x78, 0x01, 0xF0, 0x70, 0x00, 0x30, 0x70, 0x00, 0x18, 0x70, + 0x00, 0x0C, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x01, 0x80, 0x1F, 0xFE, 0xC0, 0x0F, 0xFF, 0x60, 0x00, 0x06, + 0x30, 0x00, 0x06, 0x18, 0x00, 0x03, 0x0C, 0x00, 0x01, 0x87, 0x00, 0x00, + 0xC1, 0x80, 0x00, 0xE0, 0xE0, 0x00, 0x60, 0x38, 0x00, 0x70, 0x0F, 0x00, + 0xF8, 0x03, 0xFF, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xFC, 0x1F, 0xE0, + 0x7F, 0x83, 0xFC, 0x03, 0x00, 0x06, 0x00, 0x60, 0x01, 0x80, 0x1C, 0x00, + 0x30, 0x03, 0x00, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x38, 0x01, + 0x80, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x18, 0x01, 0xFF, 0xFF, + 0x00, 0x3F, 0xFF, 0xC0, 0x06, 0x00, 0x18, 0x01, 0x80, 0x03, 0x00, 0x30, + 0x00, 0x60, 0x06, 0x00, 0x0C, 0x00, 0xC0, 0x03, 0x00, 0x38, 0x00, 0x60, + 0x06, 0x00, 0x0C, 0x00, 0xC0, 0x01, 0x80, 0x18, 0x00, 0x70, 0x03, 0x00, + 0x0C, 0x00, 0xE0, 0x01, 0x80, 0xFF, 0x83, 0xFE, 0x1F, 0xF0, 0x7F, 0xC0, + 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, + 0x80, 0x00, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, + 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x83, 0xFF, 0xFE, 0x00, + 0x00, 0x0F, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00, 0x00, + 0x00, 0xC0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x07, + 0x00, 0x20, 0x00, 0x60, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x06, + 0x00, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x0C, 0x00, 0xC0, 0x00, + 0xC0, 0x0C, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x00, 0x07, 0x00, 0x70, 0x00, + 0x3C, 0x1C, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, + 0xFF, 0x07, 0xF8, 0x3F, 0xF8, 0x3F, 0xC0, 0x18, 0x00, 0x70, 0x00, 0xC0, + 0x07, 0x00, 0x0C, 0x00, 0x60, 0x00, 0x60, 0x0E, 0x00, 0x03, 0x00, 0xE0, + 0x00, 0x18, 0x0C, 0x00, 0x00, 0xC1, 0xC0, 0x00, 0x0C, 0x1C, 0x00, 0x00, + 0x61, 0x80, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x1B, 0x78, 0x00, 0x01, 0xF0, + 0xE0, 0x00, 0x0F, 0x03, 0x80, 0x00, 0x60, 0x0C, 0x00, 0x03, 0x00, 0x70, + 0x00, 0x18, 0x01, 0x80, 0x01, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x60, 0x00, + 0x60, 0x01, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, + 0x03, 0x00, 0xFF, 0xE0, 0x1F, 0x87, 0xFF, 0x00, 0x7C, 0x00, 0x07, 0xFF, + 0xE0, 0x03, 0xFF, 0xF0, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0xC0, 0x03, 0x00, 0x60, 0x01, 0x80, 0x60, 0x00, 0xC0, 0x30, 0x00, + 0x60, 0x18, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x18, 0x06, 0x00, + 0x0C, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0x07, 0xF0, 0x00, 0x7F, 0x01, 0xB0, 0x00, 0xD8, 0x01, 0xB0, 0x00, 0xD8, + 0x01, 0x98, 0x01, 0x98, 0x01, 0x98, 0x03, 0x30, 0x01, 0x98, 0x03, 0x30, + 0x03, 0x18, 0x06, 0x30, 0x03, 0x1C, 0x0C, 0x30, 0x03, 0x0C, 0x0C, 0x30, + 0x03, 0x0C, 0x18, 0x60, 0x07, 0x0C, 0x30, 0x60, 0x06, 0x0C, 0x30, 0x60, + 0x06, 0x06, 0x60, 0x60, 0x06, 0x06, 0xC0, 0x60, 0x06, 0x06, 0xC0, 0xC0, + 0x0C, 0x07, 0x80, 0xC0, 0x0C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0xC0, + 0x0C, 0x00, 0x01, 0xC0, 0x0C, 0x00, 0x01, 0x80, 0x18, 0x00, 0x01, 0x80, + 0x18, 0x00, 0x01, 0x80, 0x18, 0x00, 0x01, 0x80, 0xFF, 0x80, 0x3F, 0xE0, + 0xFF, 0x80, 0x3F, 0xE0, 0x07, 0xE0, 0x0F, 0xFC, 0x3F, 0x80, 0x3F, 0xF0, + 0x0F, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x10, 0x01, 0x98, 0x00, 0xC0, 0x06, + 0x60, 0x03, 0x00, 0x19, 0xC0, 0x0C, 0x00, 0x63, 0x00, 0x30, 0x01, 0x0C, + 0x01, 0x80, 0x0C, 0x18, 0x06, 0x00, 0x30, 0x60, 0x18, 0x00, 0xC1, 0xC0, + 0x60, 0x03, 0x03, 0x01, 0x00, 0x08, 0x0C, 0x0C, 0x00, 0x60, 0x18, 0x30, + 0x01, 0x80, 0x60, 0xC0, 0x06, 0x01, 0xC3, 0x00, 0x18, 0x03, 0x18, 0x00, + 0xC0, 0x0C, 0x60, 0x03, 0x00, 0x19, 0x80, 0x0C, 0x00, 0x66, 0x00, 0x30, + 0x01, 0xD8, 0x00, 0x80, 0x03, 0xC0, 0x06, 0x00, 0x0F, 0x00, 0xFF, 0xC0, + 0x1C, 0x03, 0xFE, 0x00, 0x70, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xF0, + 0x00, 0xF0, 0x78, 0x03, 0x80, 0x1C, 0x07, 0x00, 0x0E, 0x0E, 0x00, 0x06, + 0x0C, 0x00, 0x06, 0x18, 0x00, 0x07, 0x38, 0x00, 0x03, 0x30, 0x00, 0x03, + 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, + 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x30, + 0x60, 0x00, 0x70, 0x70, 0x00, 0xE0, 0x38, 0x01, 0xC0, 0x1E, 0x0F, 0x00, + 0x0F, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, + 0xC0, 0x06, 0x00, 0x78, 0x01, 0x80, 0x06, 0x00, 0xC0, 0x01, 0xC0, 0x30, + 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, 0x03, 0x00, 0xC0, 0x01, 0xC0, + 0x60, 0x00, 0x60, 0x18, 0x00, 0x30, 0x06, 0x00, 0x18, 0x01, 0x80, 0x3C, + 0x00, 0xFF, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x7F, + 0xF0, 0x00, 0xF0, 0x78, 0x03, 0x80, 0x1C, 0x07, 0x00, 0x0E, 0x0E, 0x00, + 0x06, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x38, 0x00, 0x03, 0x30, 0x00, + 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, + 0x06, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x18, 0x60, 0x00, + 0x30, 0x60, 0x00, 0x70, 0x30, 0x00, 0xE0, 0x38, 0x01, 0xC0, 0x0E, 0x0F, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0xF8, + 0x30, 0x3F, 0xFF, 0xF0, 0x78, 0x0F, 0x80, 0x07, 0xFF, 0xFC, 0x01, 0xFF, + 0xFF, 0xC0, 0x06, 0x00, 0x78, 0x01, 0x80, 0x0E, 0x00, 0xC0, 0x01, 0xC0, + 0x30, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, 0x03, 0x00, 0xC0, 0x00, + 0xC0, 0x60, 0x00, 0x60, 0x18, 0x00, 0x30, 0x06, 0x00, 0x38, 0x01, 0x80, + 0x3C, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x0C, 0x07, 0x80, 0x03, + 0x00, 0x70, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x01, 0x80, 0x18, 0x00, 0x70, + 0x06, 0x00, 0x0C, 0x01, 0x80, 0x03, 0x80, 0x60, 0x00, 0x60, 0x30, 0x00, + 0x1C, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x00, 0xF0, 0x00, 0x1F, 0xC0, 0x00, + 0x7F, 0xF3, 0x00, 0xE0, 0x3B, 0x03, 0x80, 0x0F, 0x07, 0x00, 0x0E, 0x06, + 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x18, 0x20, 0x00, 0x18, 0x60, 0x00, 0x18, 0x60, + 0x00, 0x30, 0x60, 0x00, 0x70, 0xF0, 0x00, 0xE0, 0xF8, 0x01, 0xC0, 0xDC, + 0x07, 0x80, 0x8F, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0xFF, 0xFE, 0x3F, + 0xFF, 0xFE, 0x30, 0x18, 0x06, 0x60, 0x18, 0x06, 0x60, 0x18, 0x06, 0x60, + 0x38, 0x0C, 0x60, 0x30, 0x04, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0xFF, 0xFE, 0x00, 0xFF, + 0xFC, 0x00, 0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF1, 0x80, 0x00, 0x60, + 0x60, 0x00, 0x30, 0x18, 0x00, 0x0C, 0x06, 0x00, 0x03, 0x03, 0x80, 0x00, + 0xC0, 0xC0, 0x00, 0x30, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x06, 0x03, 0x00, + 0x01, 0x81, 0xC0, 0x00, 0x60, 0x60, 0x00, 0x18, 0x18, 0x00, 0x0C, 0x06, + 0x00, 0x03, 0x01, 0x80, 0x00, 0xC0, 0xC0, 0x00, 0x30, 0x30, 0x00, 0x1C, + 0x0C, 0x00, 0x06, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0xC0, 0x30, 0x00, + 0x70, 0x0E, 0x00, 0x38, 0x01, 0xC0, 0x1C, 0x00, 0x38, 0x1E, 0x00, 0x07, + 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x07, + 0xFC, 0xE0, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x60, 0x30, + 0x00, 0x18, 0x06, 0x00, 0x02, 0x00, 0xC0, 0x00, 0xC0, 0x0C, 0x00, 0x30, + 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x60, 0x00, 0xC0, + 0x0C, 0x00, 0x18, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x18, 0x00, + 0x06, 0x06, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x03, 0x8C, + 0x00, 0x00, 0x31, 0x80, 0x00, 0x06, 0x60, 0x00, 0x00, 0xD8, 0x00, 0x00, + 0x1B, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x38, 0x00, 0x00, 0xFF, 0xC0, + 0x7F, 0xFF, 0xF8, 0x0F, 0xF8, 0xC0, 0x00, 0x0C, 0x18, 0x00, 0x01, 0x83, + 0x00, 0x00, 0x30, 0x60, 0x08, 0x0C, 0x0C, 0x07, 0x01, 0x81, 0x81, 0xE0, + 0x30, 0x60, 0x2C, 0x0C, 0x0C, 0x0D, 0x81, 0x81, 0x81, 0x30, 0x30, 0x30, + 0x66, 0x0C, 0x06, 0x08, 0xC1, 0x80, 0xC3, 0x0C, 0x30, 0x18, 0x41, 0x8C, + 0x03, 0x18, 0x31, 0x80, 0x62, 0x06, 0x30, 0x0C, 0xC0, 0xCC, 0x03, 0x10, + 0x19, 0x80, 0x66, 0x03, 0x30, 0x0C, 0x80, 0x6C, 0x01, 0xB0, 0x0D, 0x80, + 0x34, 0x01, 0xB0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00, + 0xF0, 0x00, 0x03, 0xF8, 0x03, 0xF8, 0x1F, 0xC0, 0x3F, 0xC0, 0x30, 0x00, + 0x30, 0x01, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x30, 0x00, 0x18, 0x03, 0x00, + 0x00, 0xE0, 0x30, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1C, 0x30, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x03, 0xB0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x36, 0x00, 0x00, 0x03, 0x38, 0x00, + 0x00, 0x30, 0xC0, 0x00, 0x03, 0x07, 0x00, 0x00, 0x30, 0x18, 0x00, 0x03, + 0x00, 0x60, 0x00, 0x30, 0x03, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, + 0x70, 0x03, 0x00, 0x01, 0x80, 0xFF, 0x80, 0xFF, 0x07, 0xFC, 0x07, 0xF8, + 0x00, 0x7F, 0x80, 0x7F, 0x7F, 0x00, 0x7F, 0x1C, 0x00, 0x18, 0x0C, 0x00, + 0x30, 0x0C, 0x00, 0x70, 0x06, 0x00, 0xE0, 0x06, 0x00, 0xC0, 0x03, 0x01, + 0x80, 0x03, 0x03, 0x00, 0x01, 0x86, 0x00, 0x01, 0x8C, 0x00, 0x00, 0xD8, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, + 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, + 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFE, 0x07, 0xFF, + 0xF8, 0x0C, 0x00, 0x30, 0x10, 0x00, 0xC0, 0x60, 0x03, 0x80, 0xC0, 0x0E, + 0x01, 0x80, 0x38, 0x03, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x60, 0x18, + 0x00, 0xC0, 0x60, 0x01, 0x81, 0x80, 0x02, 0x06, 0x00, 0x0C, 0x18, 0x00, + 0x18, 0x60, 0x00, 0x30, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x80, 0x01, 0xFE, + 0x03, 0xFC, 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, + 0x80, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x40, 0x01, 0x80, + 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x60, 0x00, 0xC0, 0x01, + 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x80, + 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xFF, 0x01, + 0xFE, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x07, 0x00, 0xC0, + 0x30, 0x0C, 0x03, 0x80, 0x60, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x0C, 0x03, + 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x04, 0x01, 0xFE, + 0x03, 0xFC, 0x00, 0x10, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x06, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x06, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0xFF, 0x01, + 0xFE, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x07, 0x80, 0x03, 0x60, 0x01, + 0x8C, 0x00, 0xC3, 0x80, 0xE0, 0x60, 0x70, 0x1C, 0x38, 0x03, 0x1C, 0x00, + 0x6E, 0x00, 0x1F, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC3, 0x86, 0x0C, 0x18, 0x70, 0xC0, 0x00, 0x3F, 0x80, 0x0F, 0xFF, 0x80, + 0x78, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, + 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x38, 0x03, 0xFC, 0xC0, 0x7F, 0xFF, + 0x07, 0xC0, 0x0C, 0x38, 0x00, 0x31, 0xC0, 0x01, 0xCE, 0x00, 0x06, 0x30, + 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00, 0x07, 0x8E, 0x00, 0x7C, 0x1C, 0x0F, + 0x3F, 0x3F, 0xF0, 0xFC, 0x7F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0xC0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0x07, 0xE0, 0x00, 0xC3, + 0xFF, 0x00, 0x19, 0xC0, 0xF0, 0x03, 0x60, 0x07, 0x00, 0xD8, 0x00, 0x60, + 0x1E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0xC0, 0x60, 0x00, 0x18, 0x0C, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x60, 0x60, 0x00, 0x0C, 0x0C, 0x00, 0x01, 0x81, + 0x80, 0x00, 0x60, 0x70, 0x00, 0x0C, 0x0E, 0x00, 0x03, 0x01, 0xC0, 0x00, + 0x60, 0x3C, 0x00, 0x18, 0x05, 0x80, 0x06, 0x01, 0xB8, 0x01, 0x83, 0xF3, + 0xC1, 0xE0, 0x7E, 0x3F, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, + 0x07, 0xFF, 0x30, 0x38, 0x0F, 0xC1, 0x80, 0x1F, 0x0C, 0x00, 0x18, 0x60, + 0x00, 0x63, 0x00, 0x01, 0x9C, 0x00, 0x06, 0x60, 0x00, 0x01, 0x80, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0xC7, 0x00, + 0x0E, 0x0F, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, + 0x1F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0xFC, 0x0C, 0x01, + 0xFF, 0x86, 0x01, 0xC0, 0xE3, 0x03, 0x80, 0x1B, 0x03, 0x80, 0x05, 0x81, + 0x80, 0x03, 0xC1, 0x80, 0x00, 0xE1, 0x80, 0x00, 0x60, 0xC0, 0x00, 0x30, + 0x60, 0x00, 0x18, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x06, 0x18, 0x00, 0x02, + 0x0C, 0x00, 0x03, 0x06, 0x00, 0x01, 0x83, 0x00, 0x01, 0xC1, 0xC0, 0x01, + 0xE0, 0x60, 0x01, 0xE0, 0x38, 0x01, 0xB0, 0x0F, 0x03, 0x9F, 0x03, 0xFF, + 0x0F, 0x80, 0x7E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0x80, 0x78, + 0x0F, 0x03, 0x80, 0x0E, 0x1C, 0x00, 0x18, 0xE0, 0x00, 0x73, 0x00, 0x00, + 0xD8, 0x00, 0x03, 0x60, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x03, 0x07, 0x80, 0xF8, + 0x0F, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, + 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x07, 0xFF, 0xFC, 0x03, + 0xFF, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xC0, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xFE, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x87, 0xC1, 0xE0, 0xF3, 0xE1, 0xC0, + 0x1B, 0x01, 0xC0, 0x07, 0x81, 0xC0, 0x03, 0xC0, 0xC0, 0x00, 0xE0, 0xC0, + 0x00, 0x60, 0x60, 0x00, 0x30, 0x60, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x18, + 0x00, 0x06, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x03, 0x03, 0x00, 0x03, 0x81, + 0xC0, 0x01, 0xC0, 0x60, 0x01, 0xC0, 0x38, 0x03, 0x60, 0x0F, 0x07, 0x30, + 0x03, 0xFF, 0x18, 0x00, 0x7E, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x03, 0x80, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x83, 0xF0, 0x01, + 0x8F, 0xF8, 0x01, 0x98, 0x1C, 0x03, 0xB0, 0x0E, 0x03, 0x40, 0x06, 0x03, + 0x80, 0x06, 0x03, 0x00, 0x06, 0x03, 0x00, 0x06, 0x07, 0x00, 0x06, 0x06, + 0x00, 0x0E, 0x06, 0x00, 0x0E, 0x06, 0x00, 0x0E, 0x06, 0x00, 0x0C, 0x0C, + 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x18, 0x0C, + 0x00, 0x18, 0x18, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFF, 0x01, 0xFF, 0x00, + 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x1F, + 0xF0, 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, + 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, + 0x00, 0x01, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x70, 0x00, + 0x07, 0x00, 0x00, 0x70, 0x00, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x03, 0xFF, 0xF0, + 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, + 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0x00, + 0xC0, 0x00, 0x0C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, + 0x18, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, + 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, + 0x03, 0x80, 0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0xC1, + 0xFF, 0x00, 0x80, 0x70, 0x01, 0x80, 0xC0, 0x01, 0x83, 0x80, 0x01, 0x87, + 0x00, 0x01, 0x8C, 0x00, 0x03, 0x38, 0x00, 0x03, 0x70, 0x00, 0x03, 0xF8, + 0x00, 0x03, 0x9C, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x0E, 0x00, 0x06, 0x07, + 0x00, 0x06, 0x03, 0x80, 0x06, 0x01, 0x80, 0x04, 0x00, 0xC0, 0x0C, 0x00, + 0xE0, 0xFC, 0x03, 0xFE, 0xFC, 0x03, 0xFC, 0x01, 0xFF, 0x00, 0x3F, 0xE0, + 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, + 0x00, 0x70, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, + 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x1E, 0x07, 0x81, 0xE7, 0xE1, 0xF8, 0x3D, 0x8E, 0xE3, + 0x81, 0xE0, 0xF8, 0x30, 0x38, 0x1E, 0x06, 0x06, 0x03, 0x80, 0xC1, 0x80, + 0x60, 0x18, 0x30, 0x0C, 0x03, 0x06, 0x01, 0x80, 0x60, 0xC0, 0x30, 0x08, + 0x18, 0x0C, 0x03, 0x06, 0x01, 0x80, 0x60, 0xC0, 0x30, 0x0C, 0x18, 0x06, + 0x01, 0x83, 0x00, 0x80, 0x60, 0x40, 0x30, 0x0C, 0x18, 0x06, 0x01, 0x83, + 0x00, 0xC0, 0x30, 0x60, 0x18, 0x06, 0x7F, 0x03, 0xC1, 0xFF, 0xE0, 0xF8, + 0x3E, 0x00, 0x03, 0xE0, 0x1F, 0x1F, 0xF0, 0x3E, 0x60, 0x70, 0x0F, 0x80, + 0x70, 0x3C, 0x00, 0x60, 0x70, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, + 0x07, 0x00, 0x06, 0x0C, 0x00, 0x1C, 0x18, 0x00, 0x30, 0x30, 0x00, 0x60, + 0x60, 0x00, 0xC1, 0xC0, 0x01, 0x83, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, + 0x00, 0x18, 0x18, 0x00, 0x30, 0x70, 0x00, 0x67, 0xFC, 0x07, 0xFF, 0xF0, + 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0x00, 0x3C, 0x0F, 0x01, 0xC0, + 0x1C, 0x0C, 0x00, 0x38, 0x60, 0x00, 0x63, 0x00, 0x00, 0xDC, 0x00, 0x03, + 0x60, 0x00, 0x0D, 0x80, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, + 0x00, 0x1B, 0x00, 0x00, 0x6C, 0x00, 0x03, 0xB0, 0x00, 0x0C, 0x60, 0x00, + 0x61, 0xC0, 0x03, 0x03, 0x80, 0x38, 0x0F, 0x03, 0xC0, 0x0F, 0xFE, 0x00, + 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x8F, 0xFE, 0x00, 0xFC, + 0xE0, 0x78, 0x00, 0xCC, 0x00, 0xE0, 0x06, 0xC0, 0x03, 0x00, 0x3C, 0x00, + 0x1C, 0x01, 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x03, 0x00, 0xE0, 0x00, 0x18, + 0x06, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x06, 0x01, 0x80, 0x00, 0x30, 0x0C, + 0x00, 0x03, 0x00, 0xE0, 0x00, 0x18, 0x07, 0x00, 0x01, 0x80, 0x3C, 0x00, + 0x1C, 0x01, 0xE0, 0x01, 0xC0, 0x0D, 0x80, 0x1C, 0x00, 0xCF, 0x03, 0xC0, + 0x06, 0x3F, 0xF8, 0x00, 0x30, 0x7F, 0x00, 0x01, 0x80, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, + 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0xE1, 0xF0, 0x78, + 0x1C, 0xFC, 0x38, 0x01, 0xB0, 0x1C, 0x00, 0x2C, 0x0E, 0x00, 0x0F, 0x03, + 0x00, 0x01, 0xC1, 0x80, 0x00, 0x60, 0x60, 0x00, 0x18, 0x30, 0x00, 0x06, + 0x0C, 0x00, 0x01, 0x83, 0x00, 0x00, 0x60, 0xC0, 0x00, 0x30, 0x30, 0x00, + 0x0C, 0x0C, 0x00, 0x07, 0x03, 0x80, 0x03, 0xC0, 0x60, 0x01, 0xB0, 0x1C, + 0x00, 0xD8, 0x03, 0xC0, 0xE6, 0x00, 0x7F, 0xF1, 0x80, 0x07, 0xE0, 0x60, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x7F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x3E, 0x03, 0xF8, 0x7F, + 0xC0, 0x18, 0xF0, 0x60, 0x0C, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xC0, + 0x00, 0x03, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x3F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0x00, + 0x0F, 0xFE, 0xC0, 0xF0, 0x3E, 0x0E, 0x00, 0x70, 0xE0, 0x01, 0x06, 0x00, + 0x08, 0x30, 0x00, 0x41, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3F, 0xF0, 0x00, + 0x3F, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00, + 0xCC, 0x00, 0x06, 0x60, 0x00, 0x33, 0x00, 0x03, 0x3C, 0x00, 0x71, 0xF8, + 0x0F, 0x0D, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0x0C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, + 0x00, 0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0E, + 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x38, 0x0F, + 0x9F, 0xFF, 0x03, 0xF8, 0x00, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xC6, 0x00, + 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x01, 0x86, + 0x00, 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x01, + 0x86, 0x00, 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x38, 0x60, + 0x07, 0x83, 0x80, 0x6C, 0x1E, 0x1E, 0x7C, 0x7F, 0xE3, 0xE0, 0xF8, 0x00, + 0x00, 0x7F, 0xC0, 0xFF, 0xFF, 0xF0, 0x3F, 0xF1, 0xC0, 0x00, 0xC0, 0x30, + 0x00, 0x60, 0x0C, 0x00, 0x18, 0x03, 0x00, 0x0C, 0x00, 0xE0, 0x06, 0x00, + 0x18, 0x01, 0x80, 0x06, 0x00, 0xC0, 0x01, 0x80, 0x30, 0x00, 0x60, 0x18, + 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x03, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x30, + 0xC0, 0x00, 0x06, 0x30, 0x00, 0x01, 0x98, 0x00, 0x00, 0x6C, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x07, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x3F, + 0xCC, 0x00, 0x03, 0x06, 0x00, 0x01, 0x83, 0x00, 0x01, 0x81, 0x81, 0x80, + 0xC0, 0xC1, 0xE0, 0x60, 0x60, 0xF0, 0x60, 0x30, 0xD8, 0x30, 0x18, 0x6C, + 0x30, 0x0C, 0x66, 0x18, 0x06, 0x33, 0x18, 0x03, 0x31, 0x8C, 0x01, 0x98, + 0x66, 0x00, 0xD8, 0x36, 0x00, 0x6C, 0x1B, 0x00, 0x3C, 0x0F, 0x00, 0x1E, + 0x07, 0x80, 0x0E, 0x03, 0x80, 0x07, 0x01, 0xC0, 0x00, 0x07, 0xF0, 0x3F, + 0xC3, 0xFC, 0x0F, 0xF0, 0x38, 0x00, 0x60, 0x07, 0x00, 0x70, 0x00, 0xE0, + 0x38, 0x00, 0x18, 0x1C, 0x00, 0x03, 0x0C, 0x00, 0x00, 0xEE, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xDC, 0x00, + 0x00, 0xE3, 0x80, 0x00, 0x70, 0x70, 0x00, 0x38, 0x0E, 0x00, 0x18, 0x01, + 0x80, 0x1C, 0x00, 0x30, 0x0E, 0x00, 0x0E, 0x0F, 0xF0, 0x3F, 0xE3, 0xFC, + 0x0F, 0xF8, 0x03, 0xF8, 0x07, 0xF8, 0x3F, 0xC0, 0x3F, 0xC0, 0x60, 0x00, + 0x30, 0x01, 0x80, 0x01, 0x80, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, + 0x03, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x03, + 0x00, 0x60, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x03, 0x06, + 0x00, 0x00, 0x1C, 0x30, 0x00, 0x00, 0x63, 0x00, 0x00, 0x03, 0x30, 0x00, + 0x00, 0x19, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, + 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xC3, 0x00, 0x0C, 0x18, 0x00, 0xC0, 0xC0, + 0x0C, 0x00, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, + 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, + 0x00, 0x18, 0x00, 0x01, 0x80, 0x0C, 0x18, 0x00, 0x61, 0x80, 0x02, 0x1F, + 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0x00, 0x0E, 0x00, 0x7C, 0x01, 0xC0, 0x03, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x00, + 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0xC0, 0x0F, 0x00, 0xF8, + 0x01, 0xF0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x80, + 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80, 0x03, + 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x01, 0x80, 0xC0, + 0x60, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x40, + 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, + 0x30, 0x18, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x80, 0x80, 0xC0, 0x60, 0x30, + 0x00, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, + 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x0C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x7C, 0x03, + 0xC0, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x06, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x0E, + 0x00, 0xF8, 0x01, 0xC0, 0x00, 0x0F, 0x00, 0x01, 0xFC, 0x03, 0x70, 0xE0, + 0x7E, 0x07, 0x1E, 0xC0, 0x3F, 0x80, 0x01, 0xE0}; + +const GFXglyph FreeMonoOblique24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 28, 0, 1}, // 0x20 ' ' + {0, 10, 30, 28, 12, -28}, // 0x21 '!' + {38, 16, 14, 28, 10, -28}, // 0x22 '"' + {66, 22, 32, 28, 6, -29}, // 0x23 '#' + {154, 21, 33, 28, 6, -29}, // 0x24 '$' + {241, 22, 29, 28, 6, -27}, // 0x25 '%' + {321, 19, 25, 28, 6, -23}, // 0x26 '&' + {381, 7, 14, 28, 16, -28}, // 0x27 ''' + {394, 11, 34, 28, 16, -27}, // 0x28 '(' + {441, 11, 34, 28, 7, -27}, // 0x29 ')' + {488, 18, 17, 28, 10, -28}, // 0x2A '*' + {527, 22, 22, 28, 6, -23}, // 0x2B '+' + {588, 12, 14, 28, 5, -6}, // 0x2C ',' + {609, 22, 2, 28, 6, -13}, // 0x2D '-' + {615, 7, 6, 28, 11, -4}, // 0x2E '.' + {621, 24, 35, 28, 5, -30}, // 0x2F '/' + {726, 20, 30, 28, 7, -28}, // 0x30 '0' + {801, 17, 29, 28, 6, -28}, // 0x31 '1' + {863, 23, 29, 28, 4, -28}, // 0x32 '2' + {947, 22, 30, 28, 5, -28}, // 0x33 '3' + {1030, 19, 28, 28, 7, -27}, // 0x34 '4' + {1097, 21, 29, 28, 6, -27}, // 0x35 '5' + {1174, 21, 30, 28, 9, -28}, // 0x36 '6' + {1253, 18, 28, 28, 10, -27}, // 0x37 '7' + {1316, 20, 30, 28, 7, -28}, // 0x38 '8' + {1391, 22, 30, 28, 6, -28}, // 0x39 '9' + {1474, 10, 21, 28, 11, -19}, // 0x3A ':' + {1501, 15, 27, 28, 5, -19}, // 0x3B ';' + {1552, 23, 22, 28, 6, -23}, // 0x3C '<' + {1616, 25, 9, 28, 4, -17}, // 0x3D '=' + {1645, 24, 22, 28, 4, -23}, // 0x3E '>' + {1711, 16, 28, 28, 11, -26}, // 0x3F '?' + {1767, 19, 32, 28, 7, -28}, // 0x40 '@' + {1843, 27, 26, 28, 1, -25}, // 0x41 'A' + {1931, 26, 26, 28, 2, -25}, // 0x42 'B' + {2016, 25, 28, 28, 5, -26}, // 0x43 'C' + {2104, 26, 26, 28, 2, -25}, // 0x44 'D' + {2189, 27, 26, 28, 2, -25}, // 0x45 'E' + {2277, 28, 26, 28, 2, -25}, // 0x46 'F' + {2368, 25, 28, 28, 5, -26}, // 0x47 'G' + {2456, 27, 26, 28, 3, -25}, // 0x48 'H' + {2544, 22, 26, 28, 6, -25}, // 0x49 'I' + {2616, 28, 27, 28, 5, -25}, // 0x4A 'J' + {2711, 29, 26, 28, 2, -25}, // 0x4B 'K' + {2806, 25, 26, 28, 3, -25}, // 0x4C 'L' + {2888, 32, 26, 28, 1, -25}, // 0x4D 'M' + {2992, 30, 26, 28, 2, -25}, // 0x4E 'N' + {3090, 24, 28, 28, 5, -26}, // 0x4F 'O' + {3174, 26, 26, 28, 2, -25}, // 0x50 'P' + {3259, 24, 32, 28, 5, -26}, // 0x51 'Q' + {3355, 26, 26, 28, 2, -25}, // 0x52 'R' + {3440, 24, 28, 28, 5, -26}, // 0x53 'S' + {3524, 24, 26, 28, 7, -25}, // 0x54 'T' + {3602, 26, 27, 28, 6, -25}, // 0x55 'U' + {3690, 27, 26, 28, 6, -25}, // 0x56 'V' + {3778, 27, 26, 28, 6, -25}, // 0x57 'W' + {3866, 29, 26, 28, 2, -25}, // 0x58 'X' + {3961, 24, 26, 28, 7, -25}, // 0x59 'Y' + {4039, 23, 26, 28, 5, -25}, // 0x5A 'Z' + {4114, 15, 34, 28, 12, -27}, // 0x5B '[' + {4178, 10, 35, 28, 12, -30}, // 0x5C '\' + {4222, 15, 34, 28, 6, -27}, // 0x5D ']' + {4286, 18, 12, 28, 9, -28}, // 0x5E '^' + {4313, 28, 2, 28, -1, 5}, // 0x5F '_' + {4320, 6, 7, 28, 13, -29}, // 0x60 '`' + {4326, 22, 22, 28, 4, -20}, // 0x61 'a' + {4387, 27, 29, 28, 1, -27}, // 0x62 'b' + {4485, 22, 22, 28, 6, -20}, // 0x63 'c' + {4546, 25, 29, 28, 5, -27}, // 0x64 'd' + {4637, 22, 22, 28, 5, -20}, // 0x65 'e' + {4698, 26, 28, 28, 5, -27}, // 0x66 'f' + {4789, 25, 30, 28, 5, -20}, // 0x67 'g' + {4883, 24, 28, 28, 3, -27}, // 0x68 'h' + {4967, 19, 29, 28, 5, -28}, // 0x69 'i' + {5036, 20, 38, 28, 4, -28}, // 0x6A 'j' + {5131, 24, 28, 28, 3, -27}, // 0x6B 'k' + {5215, 19, 28, 28, 5, -27}, // 0x6C 'l' + {5282, 27, 21, 28, 1, -20}, // 0x6D 'm' + {5353, 23, 21, 28, 3, -20}, // 0x6E 'n' + {5414, 22, 22, 28, 5, -20}, // 0x6F 'o' + {5475, 29, 30, 28, -1, -20}, // 0x70 'p' + {5584, 26, 30, 28, 5, -20}, // 0x71 'q' + {5682, 25, 20, 28, 4, -19}, // 0x72 'r' + {5745, 21, 22, 28, 5, -20}, // 0x73 's' + {5803, 17, 27, 28, 7, -25}, // 0x74 't' + {5861, 21, 21, 28, 6, -19}, // 0x75 'u' + {5917, 26, 20, 28, 5, -19}, // 0x76 'v' + {5982, 25, 20, 28, 6, -19}, // 0x77 'w' + {6045, 26, 20, 28, 3, -19}, // 0x78 'x' + {6110, 29, 29, 28, 1, -19}, // 0x79 'y' + {6216, 21, 20, 28, 5, -19}, // 0x7A 'z' + {6269, 15, 34, 28, 10, -27}, // 0x7B '{' + {6333, 9, 35, 28, 12, -28}, // 0x7C '|' + {6373, 15, 34, 28, 8, -27}, // 0x7D '}' + {6437, 20, 6, 28, 7, -15}}; // 0x7E '~' + +const GFXfont FreeMonoOblique24pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique24pt7bBitmaps, + (GFXglyph *)FreeMonoOblique24pt7bGlyphs, 0x20, 0x7E, 47}; + +// Approx. 7124 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h new file mode 100644 index 0000000..1e82964 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h @@ -0,0 +1,189 @@ +#pragma once +#include + +const uint8_t FreeMonoOblique9pt7bBitmaps[] PROGMEM = { + 0x11, 0x22, 0x24, 0x40, 0x00, 0xC0, 0xDE, 0xE5, 0x29, 0x00, 0x09, 0x05, + 0x02, 0x82, 0x47, 0xF8, 0xA0, 0x51, 0xFE, 0x28, 0x14, 0x0A, 0x09, 0x00, + 0x08, 0x1D, 0x23, 0x40, 0x70, 0x1C, 0x02, 0x82, 0x84, 0x78, 0x20, 0x20, + 0x1C, 0x11, 0x08, 0x83, 0x80, 0x18, 0x71, 0xC0, 0x1C, 0x11, 0x08, 0x83, + 0x80, 0x1E, 0x60, 0x81, 0x03, 0x0A, 0x65, 0x46, 0x88, 0xE8, 0xFA, 0x80, + 0x12, 0x24, 0x48, 0x88, 0x88, 0x88, 0x80, 0x01, 0x11, 0x11, 0x11, 0x22, + 0x44, 0x80, 0x10, 0x22, 0x5B, 0xC3, 0x0A, 0x22, 0x00, 0x04, 0x02, 0x02, + 0x1F, 0xF0, 0x80, 0x40, 0x20, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0x80, 0xF0, + 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, + 0x08, 0x08, 0x00, 0x1C, 0x45, 0x0A, 0x18, 0x30, 0x61, 0x42, 0x85, 0x11, + 0xC0, 0x04, 0x38, 0x90, 0x20, 0x81, 0x02, 0x04, 0x08, 0x23, 0xF8, 0x07, + 0x04, 0xC4, 0x20, 0x10, 0x10, 0x30, 0x20, 0x20, 0x60, 0x40, 0x3F, 0x80, + 0x0F, 0x00, 0x40, 0x20, 0x20, 0x60, 0x18, 0x04, 0x02, 0x01, 0x43, 0x1E, + 0x00, 0x03, 0x05, 0x0A, 0x12, 0x22, 0x22, 0x42, 0x7F, 0x04, 0x04, 0x1E, + 0x1F, 0x88, 0x08, 0x05, 0xC3, 0x30, 0x08, 0x04, 0x02, 0x02, 0x42, 0x1E, + 0x00, 0x07, 0x18, 0x20, 0x40, 0x5C, 0xA6, 0xC2, 0x82, 0x82, 0xC4, 0x78, + 0xFF, 0x04, 0x10, 0x20, 0x82, 0x04, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x23, + 0x41, 0x41, 0x62, 0x1C, 0x66, 0x82, 0x82, 0x84, 0x78, 0x1E, 0x23, 0x41, + 0x41, 0x43, 0x65, 0x3A, 0x02, 0x04, 0x18, 0xE0, 0x6C, 0x00, 0x36, 0x18, + 0xC0, 0x00, 0x19, 0x8C, 0xC4, 0x00, 0x01, 0x83, 0x06, 0x0C, 0x06, 0x00, + 0x80, 0x30, 0x04, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x20, 0x0C, 0x01, 0x00, + 0x60, 0x20, 0x60, 0xC1, 0x80, 0x3D, 0x8E, 0x08, 0x10, 0xC6, 0x08, 0x00, + 0x01, 0x80, 0x1C, 0x45, 0x0A, 0x79, 0x34, 0x69, 0x4E, 0x81, 0x03, 0x03, + 0xC0, 0x0F, 0x00, 0x60, 0x12, 0x02, 0x40, 0x88, 0x21, 0x07, 0xE1, 0x04, + 0x20, 0x5E, 0x3C, 0x3F, 0x84, 0x11, 0x04, 0x82, 0x3F, 0x88, 0x32, 0x04, + 0x81, 0x60, 0xBF, 0xC0, 0x1E, 0x98, 0xD0, 0x28, 0x08, 0x04, 0x02, 0x01, + 0x00, 0x41, 0x1F, 0x00, 0x3F, 0x0C, 0x22, 0x04, 0x81, 0x20, 0x48, 0x12, + 0x09, 0x02, 0x43, 0x3F, 0x00, 0x3F, 0xC4, 0x11, 0x00, 0x88, 0x3E, 0x08, + 0x82, 0x00, 0x82, 0x60, 0xBF, 0xE0, 0x3F, 0xE2, 0x08, 0x40, 0x11, 0x03, + 0xE0, 0x44, 0x08, 0x01, 0x00, 0x60, 0x1F, 0x00, 0x1E, 0x98, 0xD0, 0x08, + 0x08, 0x04, 0x7A, 0x05, 0x02, 0x41, 0x1F, 0x00, 0x3D, 0xE2, 0x18, 0x42, + 0x08, 0x43, 0xF8, 0x41, 0x08, 0x21, 0x08, 0x21, 0x1E, 0xF0, 0x3F, 0x82, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x20, 0x10, 0x7F, 0x00, 0x0F, 0xE0, + 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x20, 0x84, 0x10, 0x84, 0x0F, 0x00, + 0x3C, 0xE2, 0x10, 0x44, 0x11, 0x02, 0xC0, 0x64, 0x08, 0x81, 0x08, 0x61, + 0x1E, 0x38, 0x3E, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x04, 0x42, + 0x10, 0xBF, 0xE0, 0x38, 0x38, 0xC3, 0x05, 0x28, 0x29, 0x42, 0x52, 0x13, + 0x10, 0x99, 0x84, 0x08, 0x20, 0x47, 0x8F, 0x00, 0x70, 0xE6, 0x08, 0xA1, + 0x14, 0x22, 0x48, 0x49, 0x11, 0x22, 0x14, 0x43, 0x1E, 0x20, 0x1E, 0x18, + 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x00, 0x3F, 0x84, + 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x00, 0x80, 0x60, 0x3E, 0x00, 0x1E, + 0x18, 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x08, 0x0F, + 0x44, 0x60, 0x3F, 0x84, 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x10, 0x84, + 0x60, 0xBC, 0x10, 0x0F, 0x88, 0xC8, 0x24, 0x01, 0x80, 0x38, 0x05, 0x02, + 0xC2, 0x5E, 0x00, 0xFF, 0xC4, 0x44, 0x02, 0x01, 0x00, 0x80, 0x40, 0x60, + 0x20, 0x7E, 0x00, 0xF1, 0xD0, 0x24, 0x09, 0x02, 0x41, 0xA0, 0x48, 0x12, + 0x04, 0xC6, 0x1F, 0x00, 0xF1, 0xE8, 0x11, 0x02, 0x20, 0x82, 0x20, 0x44, + 0x09, 0x01, 0x40, 0x28, 0x02, 0x00, 0xF1, 0xE8, 0x09, 0x12, 0x26, 0x45, + 0x48, 0xAA, 0x29, 0x45, 0x28, 0xC6, 0x18, 0xC0, 0x38, 0xE2, 0x08, 0x26, + 0x05, 0x00, 0x40, 0x18, 0x04, 0x81, 0x08, 0x41, 0x1C, 0x70, 0xE3, 0xA0, + 0x90, 0x84, 0x81, 0x80, 0x80, 0x40, 0x20, 0x20, 0x7E, 0x00, 0x3F, 0x90, + 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x82, 0x7F, 0x00, 0x39, 0x08, + 0x44, 0x21, 0x08, 0x42, 0x21, 0x0E, 0x00, 0x88, 0x44, 0x44, 0x22, 0x22, + 0x11, 0x11, 0x38, 0x42, 0x11, 0x08, 0x42, 0x10, 0x84, 0x2E, 0x00, 0x08, + 0x28, 0x92, 0x18, 0x20, 0xFF, 0xC0, 0xA4, 0x3E, 0x00, 0x80, 0x47, 0xA4, + 0x34, 0x12, 0x18, 0xF7, 0x38, 0x01, 0x00, 0x40, 0x09, 0xE1, 0xC6, 0x20, + 0x44, 0x09, 0x01, 0x30, 0x46, 0x13, 0xBC, 0x00, 0x1F, 0x48, 0x74, 0x0A, + 0x00, 0x80, 0x20, 0x0C, 0x18, 0xF8, 0x01, 0x80, 0x40, 0x23, 0x96, 0x32, + 0x0A, 0x05, 0x02, 0x81, 0x61, 0x1F, 0xE0, 0x1F, 0x30, 0xD0, 0x3F, 0xF8, + 0x04, 0x01, 0x00, 0x7C, 0x07, 0xC3, 0x00, 0x80, 0xFE, 0x10, 0x04, 0x01, + 0x00, 0x40, 0x10, 0x08, 0x0F, 0xE0, 0x1D, 0xD8, 0xC4, 0x12, 0x04, 0x82, + 0x20, 0x8C, 0x61, 0xE8, 0x02, 0x01, 0x07, 0x80, 0x30, 0x04, 0x01, 0x00, + 0x5C, 0x38, 0x88, 0x22, 0x08, 0x82, 0x21, 0x18, 0x4F, 0x3C, 0x04, 0x04, + 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0xFF, 0x01, 0x00, 0x80, + 0x03, 0xF0, 0x10, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x80, 0x40, 0x47, + 0xC0, 0x38, 0x08, 0x04, 0x02, 0x71, 0x20, 0xA0, 0xA0, 0x68, 0x24, 0x11, + 0x38, 0xE0, 0x3C, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, + 0xFF, 0x3E, 0xE2, 0x64, 0x88, 0x91, 0x12, 0x24, 0x48, 0x91, 0x17, 0x33, + 0x37, 0x14, 0x4C, 0x24, 0x12, 0x09, 0x08, 0x85, 0xE3, 0x1E, 0x10, 0x90, + 0x30, 0x18, 0x0C, 0x0B, 0x08, 0x78, 0x33, 0xC3, 0x8C, 0x40, 0x88, 0x12, + 0x02, 0x60, 0x8C, 0x31, 0x78, 0x20, 0x08, 0x03, 0xE0, 0x00, 0x1C, 0xD8, + 0xC4, 0x12, 0x04, 0x81, 0x20, 0x4C, 0x21, 0xF8, 0x02, 0x00, 0x81, 0xF0, + 0x73, 0x8E, 0x04, 0x04, 0x02, 0x01, 0x00, 0x81, 0xFC, 0x1F, 0x61, 0x40, + 0x3C, 0x03, 0x81, 0x82, 0xFC, 0x10, 0x63, 0xF9, 0x02, 0x04, 0x10, 0x20, + 0x40, 0x7C, 0xE3, 0x10, 0x90, 0x48, 0x24, 0x22, 0x11, 0x18, 0xF6, 0xF3, + 0xD0, 0x44, 0x10, 0x88, 0x24, 0x09, 0x02, 0x80, 0x40, 0xE1, 0xD0, 0x24, + 0x91, 0x24, 0x55, 0x19, 0x86, 0x61, 0x10, 0x39, 0xC4, 0x20, 0xB0, 0x30, + 0x0C, 0x04, 0x86, 0x13, 0x8E, 0x3C, 0x71, 0x04, 0x10, 0x40, 0x88, 0x09, + 0x00, 0xA0, 0x06, 0x00, 0x40, 0x08, 0x01, 0x00, 0xFC, 0x00, 0x7F, 0x42, + 0x04, 0x08, 0x10, 0x20, 0x42, 0xFE, 0x0C, 0x41, 0x04, 0x30, 0x8C, 0x08, + 0x21, 0x04, 0x10, 0x60, 0x24, 0x94, 0x92, 0x52, 0x40, 0x18, 0x20, 0x82, + 0x10, 0x40, 0xC4, 0x10, 0x82, 0x08, 0xC0, 0x61, 0x24, 0x30}; + +const GFXglyph FreeMonoOblique9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 11, 0, 1}, // 0x20 ' ' + {0, 4, 11, 11, 4, -10}, // 0x21 '!' + {6, 5, 5, 11, 4, -10}, // 0x22 '"' + {10, 9, 12, 11, 2, -10}, // 0x23 '#' + {24, 8, 12, 11, 3, -10}, // 0x24 '$' + {36, 9, 11, 11, 2, -10}, // 0x25 '%' + {49, 7, 10, 11, 2, -9}, // 0x26 '&' + {58, 2, 5, 11, 6, -10}, // 0x27 ''' + {60, 4, 13, 11, 6, -10}, // 0x28 '(' + {67, 4, 13, 11, 3, -10}, // 0x29 ')' + {74, 7, 7, 11, 4, -10}, // 0x2A '*' + {81, 9, 8, 11, 2, -8}, // 0x2B '+' + {90, 4, 5, 11, 2, -1}, // 0x2C ',' + {93, 9, 1, 11, 2, -5}, // 0x2D '-' + {95, 2, 2, 11, 4, -1}, // 0x2E '.' + {96, 9, 13, 11, 2, -11}, // 0x2F '/' + {111, 7, 11, 11, 3, -10}, // 0x30 '0' + {121, 7, 11, 11, 2, -10}, // 0x31 '1' + {131, 9, 11, 11, 2, -10}, // 0x32 '2' + {144, 9, 11, 11, 2, -10}, // 0x33 '3' + {157, 8, 11, 11, 2, -10}, // 0x34 '4' + {168, 9, 11, 11, 2, -10}, // 0x35 '5' + {181, 8, 11, 11, 3, -10}, // 0x36 '6' + {192, 7, 11, 11, 4, -10}, // 0x37 '7' + {202, 8, 11, 11, 3, -10}, // 0x38 '8' + {213, 8, 11, 11, 3, -10}, // 0x39 '9' + {224, 3, 8, 11, 4, -7}, // 0x3A ':' + {227, 5, 11, 11, 2, -7}, // 0x3B ';' + {234, 9, 8, 11, 2, -8}, // 0x3C '<' + {243, 9, 4, 11, 2, -6}, // 0x3D '=' + {248, 9, 8, 11, 2, -8}, // 0x3E '>' + {257, 7, 10, 11, 4, -9}, // 0x3F '?' + {266, 7, 12, 11, 3, -10}, // 0x40 '@' + {277, 11, 10, 11, 0, -9}, // 0x41 'A' + {291, 10, 10, 11, 1, -9}, // 0x42 'B' + {304, 9, 10, 11, 2, -9}, // 0x43 'C' + {316, 10, 10, 11, 1, -9}, // 0x44 'D' + {329, 10, 10, 11, 1, -9}, // 0x45 'E' + {342, 11, 10, 11, 1, -9}, // 0x46 'F' + {356, 9, 10, 11, 2, -9}, // 0x47 'G' + {368, 11, 10, 11, 1, -9}, // 0x48 'H' + {382, 9, 10, 11, 2, -9}, // 0x49 'I' + {394, 11, 10, 11, 2, -9}, // 0x4A 'J' + {408, 11, 10, 11, 1, -9}, // 0x4B 'K' + {422, 10, 10, 11, 1, -9}, // 0x4C 'L' + {435, 13, 10, 11, 0, -9}, // 0x4D 'M' + {452, 11, 10, 11, 1, -9}, // 0x4E 'N' + {466, 9, 10, 11, 2, -9}, // 0x4F 'O' + {478, 10, 10, 11, 1, -9}, // 0x50 'P' + {491, 9, 13, 11, 2, -9}, // 0x51 'Q' + {506, 10, 10, 11, 1, -9}, // 0x52 'R' + {519, 9, 10, 11, 2, -9}, // 0x53 'S' + {531, 9, 10, 11, 3, -9}, // 0x54 'T' + {543, 10, 10, 11, 2, -9}, // 0x55 'U' + {556, 11, 10, 11, 2, -9}, // 0x56 'V' + {570, 11, 10, 11, 2, -9}, // 0x57 'W' + {584, 11, 10, 11, 1, -9}, // 0x58 'X' + {598, 9, 10, 11, 3, -9}, // 0x59 'Y' + {610, 9, 10, 11, 2, -9}, // 0x5A 'Z' + {622, 5, 13, 11, 5, -10}, // 0x5B '[' + {631, 4, 14, 11, 4, -11}, // 0x5C '\' + {638, 5, 13, 11, 2, -10}, // 0x5D ']' + {647, 7, 5, 11, 3, -10}, // 0x5E '^' + {652, 11, 1, 11, 0, 2}, // 0x5F '_' + {654, 2, 3, 11, 5, -11}, // 0x60 '`' + {655, 9, 8, 11, 2, -7}, // 0x61 'a' + {664, 11, 11, 11, 0, -10}, // 0x62 'b' + {680, 10, 8, 11, 2, -7}, // 0x63 'c' + {690, 9, 11, 11, 2, -10}, // 0x64 'd' + {703, 9, 8, 11, 2, -7}, // 0x65 'e' + {712, 10, 11, 11, 2, -10}, // 0x66 'f' + {726, 10, 11, 11, 2, -7}, // 0x67 'g' + {740, 10, 11, 11, 1, -10}, // 0x68 'h' + {754, 8, 11, 11, 2, -10}, // 0x69 'i' + {765, 9, 14, 11, 1, -10}, // 0x6A 'j' + {781, 9, 11, 11, 1, -10}, // 0x6B 'k' + {794, 8, 11, 11, 2, -10}, // 0x6C 'l' + {805, 11, 8, 11, 0, -7}, // 0x6D 'm' + {816, 9, 8, 11, 1, -7}, // 0x6E 'n' + {825, 9, 8, 11, 2, -7}, // 0x6F 'o' + {834, 11, 11, 11, 0, -7}, // 0x70 'p' + {850, 10, 11, 11, 2, -7}, // 0x71 'q' + {864, 9, 8, 11, 2, -7}, // 0x72 'r' + {873, 8, 8, 11, 2, -7}, // 0x73 's' + {881, 7, 10, 11, 2, -9}, // 0x74 't' + {890, 9, 8, 11, 2, -7}, // 0x75 'u' + {899, 10, 8, 11, 2, -7}, // 0x76 'v' + {909, 10, 8, 11, 2, -7}, // 0x77 'w' + {919, 10, 8, 11, 1, -7}, // 0x78 'x' + {929, 12, 11, 11, 0, -7}, // 0x79 'y' + {946, 8, 8, 11, 2, -7}, // 0x7A 'z' + {954, 6, 13, 11, 4, -10}, // 0x7B '{' + {964, 3, 12, 11, 5, -9}, // 0x7C '|' + {969, 6, 13, 11, 3, -10}, // 0x7D '}' + {979, 7, 3, 11, 3, -6}}; // 0x7E '~' + +const GFXfont FreeMonoOblique9pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique9pt7bBitmaps, + (GFXglyph *)FreeMonoOblique9pt7bGlyphs, 0x20, 0x7E, 18}; + +// Approx. 1654 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h new file mode 100644 index 0000000..6e77392 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h @@ -0,0 +1,272 @@ +#pragma once +#include + +const uint8_t FreeSans12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x06, 0x30, + 0x31, 0x03, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x03, 0x18, 0x18, + 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x01, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, + 0x04, 0x03, 0xE1, 0xFF, 0x72, 0x6C, 0x47, 0x88, 0xF1, 0x07, 0x20, 0x7E, + 0x03, 0xF0, 0x17, 0x02, 0x3C, 0x47, 0x88, 0xF1, 0x1B, 0x26, 0x7F, 0xC3, + 0xE0, 0x10, 0x02, 0x00, 0x00, 0x06, 0x03, 0xC0, 0x40, 0x7E, 0x0C, 0x0E, + 0x70, 0x80, 0xC3, 0x18, 0x0C, 0x31, 0x00, 0xE7, 0x30, 0x07, 0xE6, 0x00, + 0x3C, 0x40, 0x00, 0x0C, 0x7C, 0x00, 0x8F, 0xE0, 0x19, 0xC7, 0x01, 0x18, + 0x30, 0x31, 0x83, 0x02, 0x1C, 0x70, 0x40, 0xFE, 0x04, 0x07, 0xC0, 0x0F, + 0x00, 0x7E, 0x03, 0x9C, 0x0C, 0x30, 0x30, 0xC0, 0xE7, 0x01, 0xF8, 0x03, + 0x80, 0x3E, 0x01, 0xCC, 0x6E, 0x19, 0xB0, 0x7C, 0xC0, 0xF3, 0x03, 0xCE, + 0x1F, 0x9F, 0xE6, 0x1E, 0x1C, 0xFF, 0xA0, 0x08, 0x8C, 0x66, 0x31, 0x98, + 0xC6, 0x31, 0x8C, 0x63, 0x08, 0x63, 0x08, 0x61, 0x0C, 0x20, 0x82, 0x18, + 0xC3, 0x18, 0xC3, 0x18, 0xC6, 0x31, 0x8C, 0x62, 0x31, 0x88, 0xC4, 0x62, + 0x00, 0x10, 0x23, 0x5B, 0xE3, 0x8D, 0x91, 0x00, 0x0C, 0x03, 0x00, 0xC0, + 0x30, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xF5, 0x60, + 0xFF, 0xF0, 0xF0, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x02, 0x0C, 0x10, 0x20, + 0xC1, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, + 0x6E, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, + 0x0E, 0xC1, 0x9C, 0x71, 0xFC, 0x1F, 0x00, 0x08, 0xCF, 0xFF, 0x8C, 0x63, + 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x1F, 0x0F, 0xF9, 0x87, 0x60, 0x7C, + 0x06, 0x00, 0xC0, 0x18, 0x07, 0x01, 0xC0, 0xF0, 0x78, 0x1C, 0x06, 0x00, + 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0x0F, 0xF3, 0x87, 0x60, 0x6C, + 0x0C, 0x01, 0x80, 0x70, 0x7C, 0x0F, 0x80, 0x18, 0x01, 0x80, 0x3C, 0x07, + 0x80, 0xD8, 0x73, 0xFC, 0x1F, 0x00, 0x01, 0x80, 0x70, 0x0E, 0x03, 0xC0, + 0xD8, 0x1B, 0x06, 0x61, 0x8C, 0x21, 0x8C, 0x33, 0x06, 0x7F, 0xFF, 0xFE, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xCF, 0xF9, 0x80, 0x30, 0x06, + 0x00, 0xDE, 0x1F, 0xE7, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07, + 0x81, 0xF8, 0x73, 0xFC, 0x1F, 0x00, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x74, + 0x01, 0x80, 0x33, 0xC7, 0xFE, 0xF0, 0xDC, 0x1F, 0x01, 0xE0, 0x3C, 0x06, + 0xC1, 0xDC, 0x71, 0xFC, 0x1F, 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0x00, 0x60, + 0x18, 0x02, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, 0x01, 0x80, + 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 0x66, + 0x0C, 0xC1, 0x8C, 0x61, 0xFC, 0x3F, 0x8E, 0x3B, 0x01, 0xE0, 0x3C, 0x07, + 0x80, 0xD8, 0x31, 0xFC, 0x1F, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x6C, + 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x61, 0xEF, 0xFC, 0x79, 0x80, 0x30, 0x05, + 0x81, 0x98, 0x73, 0xFC, 0x1E, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0xF0, 0x00, + 0x0F, 0x56, 0x00, 0x00, 0x07, 0x01, 0xE0, 0xF8, 0x3C, 0x0F, 0x00, 0xE0, + 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xF0, 0x07, + 0xC0, 0x0F, 0x00, 0x70, 0x1E, 0x0F, 0x03, 0xC0, 0xF0, 0x08, 0x00, 0x1F, + 0x1F, 0xEE, 0x1B, 0x03, 0xC0, 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0, + 0xE0, 0x30, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xFE, + 0x00, 0x0F, 0xFE, 0x00, 0xF0, 0x3E, 0x07, 0x00, 0x3C, 0x38, 0x00, 0x30, + 0xC1, 0xE0, 0x66, 0x0F, 0xD9, 0xD8, 0x61, 0xC3, 0xC3, 0x07, 0x0F, 0x1C, + 0x1C, 0x3C, 0x60, 0x60, 0xF1, 0x81, 0x83, 0xC6, 0x06, 0x1B, 0x18, 0x38, + 0xEE, 0x71, 0xE7, 0x18, 0xFD, 0xF8, 0x71, 0xE7, 0xC0, 0xE0, 0x00, 0x01, + 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x07, 0xE0, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x0C, 0x30, + 0x0C, 0x30, 0x1C, 0x38, 0x18, 0x18, 0x1F, 0xF8, 0x3F, 0xFC, 0x30, 0x1C, + 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0xFF, 0xC7, 0xFF, 0x30, + 0x19, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, 0xD8, 0x0C, 0xFF, 0xC7, 0xFF, + 0x30, 0x0D, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x06, 0xFF, 0xF7, + 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xF0, 0xE0, 0x73, 0x80, 0x66, 0x00, 0x6C, + 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x6C, 0x00, 0xDC, 0x03, 0x1E, 0x0E, 0x1F, 0xF8, 0x0F, 0xC0, + 0xFF, 0x83, 0xFF, 0x8C, 0x07, 0x30, 0x0E, 0xC0, 0x1B, 0x00, 0x7C, 0x00, + 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00, + 0x6C, 0x03, 0xB0, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xEF, 0xFE, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, 0xDF, + 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00, + 0x07, 0xF0, 0x1F, 0xFC, 0x3C, 0x1E, 0x70, 0x06, 0x60, 0x03, 0xE0, 0x00, + 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x03, 0xC0, 0x03, + 0x60, 0x03, 0x60, 0x07, 0x30, 0x0F, 0x3C, 0x1F, 0x1F, 0xFB, 0x07, 0xE1, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, + 0x3C, 0x1E, 0x0F, 0x07, 0xC7, 0x7F, 0x1F, 0x00, 0xC0, 0x3B, 0x01, 0xCC, + 0x0E, 0x30, 0x70, 0xC3, 0x83, 0x1C, 0x0C, 0xE0, 0x33, 0x80, 0xDE, 0x03, + 0xDC, 0x0E, 0x38, 0x30, 0x60, 0xC1, 0xC3, 0x03, 0x8C, 0x06, 0x30, 0x1C, + 0xC0, 0x3B, 0x00, 0x60, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, + 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, + 0xFF, 0xFF, 0xF0, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xD0, + 0x0F, 0xD8, 0x1B, 0xD8, 0x1B, 0xD8, 0x1B, 0xCC, 0x33, 0xCC, 0x33, 0xCC, + 0x33, 0xC6, 0x63, 0xC6, 0x63, 0xC6, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC1, 0x83, 0xE0, 0x1F, 0x00, 0xFC, 0x07, 0xE0, 0x3D, 0x81, 0xEE, + 0x0F, 0x30, 0x79, 0xC3, 0xC6, 0x1E, 0x18, 0xF0, 0xE7, 0x83, 0x3C, 0x1D, + 0xE0, 0x6F, 0x01, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, 0xC0, 0x03, 0xE0, 0x0F, + 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, + 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, + 0x33, 0x00, 0x18, 0xC0, 0x18, 0x78, 0x3C, 0x1F, 0xFC, 0x03, 0xF8, 0x00, + 0xFF, 0x8F, 0xFE, 0xC0, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, + 0xFF, 0xEF, 0xFC, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, + 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xC0, 0xFC, 0x78, + 0x3C, 0x1F, 0xFF, 0x03, 0xF9, 0x80, 0x00, 0x40, 0xFF, 0xC3, 0xFF, 0xCC, + 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x0C, 0xFF, 0xE3, + 0xFF, 0xCC, 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x06, + 0xC0, 0x1B, 0x00, 0x70, 0x0F, 0xE0, 0x7F, 0xC3, 0x83, 0x9C, 0x07, 0x60, + 0x0D, 0x80, 0x06, 0x00, 0x1E, 0x00, 0x3F, 0x80, 0x3F, 0xC0, 0x0F, 0x80, + 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0xDE, 0x0E, 0x3F, 0xF0, 0x3F, 0x80, + 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x80, 0xEE, 0x0E, 0x3F, 0xE0, 0x7C, 0x00, 0x60, 0x06, 0xC0, + 0x1D, 0xC0, 0x31, 0x80, 0x63, 0x01, 0xC7, 0x03, 0x06, 0x06, 0x0C, 0x1C, + 0x1C, 0x30, 0x18, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, 0x00, 0xDC, 0x01, + 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0xE0, 0x30, 0x1D, 0x80, 0xE0, + 0x76, 0x07, 0x81, 0xD8, 0x1E, 0x06, 0x70, 0x7C, 0x18, 0xC1, 0xB0, 0xE3, + 0x0C, 0xC3, 0x8C, 0x33, 0x0C, 0x38, 0xC6, 0x30, 0x67, 0x18, 0xC1, 0x98, + 0x67, 0x06, 0x61, 0xD8, 0x1D, 0x83, 0x60, 0x3C, 0x0D, 0x80, 0xF0, 0x3E, + 0x03, 0xC0, 0x70, 0x0F, 0x01, 0xC0, 0x18, 0x07, 0x00, 0x70, 0x0E, 0x60, + 0x38, 0xE0, 0x60, 0xE1, 0xC0, 0xC3, 0x01, 0xCC, 0x01, 0xF8, 0x01, 0xE0, + 0x03, 0x80, 0x07, 0x80, 0x1F, 0x00, 0x33, 0x00, 0xE7, 0x03, 0x86, 0x06, + 0x0E, 0x1C, 0x0E, 0x70, 0x0C, 0xC0, 0x1C, 0x60, 0x06, 0x70, 0x0E, 0x30, + 0x1C, 0x38, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x60, 0x03, + 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03, + 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, + 0xC0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, + 0xF0, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, 0x20, 0x60, 0x40, + 0x81, 0x81, 0x02, 0x06, 0x04, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x0E, 0x05, 0x86, 0xC3, 0x21, 0x19, + 0x8C, 0x83, 0xC1, 0x80, 0xFF, 0xFE, 0xE3, 0x8C, 0x30, 0x3F, 0x07, 0xF8, + 0xE1, 0xCC, 0x0C, 0x00, 0xC0, 0x1C, 0x3F, 0xCF, 0x8C, 0xC0, 0xCC, 0x0C, + 0xE3, 0xC7, 0xEF, 0x3C, 0x70, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0xF8, 0xDF, 0xCF, 0x0E, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xE0, 0x6F, 0x0E, 0xDF, 0xCC, 0xF8, 0x1F, 0x0F, 0xE7, 0x1B, + 0x83, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x38, 0x37, 0x1C, 0xFE, 0x1F, + 0x00, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3C, 0xCF, 0xFB, 0x8F, + 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, 0x8F, 0x3F, + 0x63, 0xCC, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, + 0x00, 0xC0, 0x1C, 0x0D, 0xC3, 0x1F, 0xE1, 0xF0, 0x3B, 0xD8, 0xC6, 0x7F, + 0xEC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0x1E, 0x67, 0xFD, 0xC7, + 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x9F, + 0xB1, 0xE6, 0x00, 0xC0, 0x3E, 0x0E, 0x7F, 0xC7, 0xE0, 0xC0, 0x30, 0x0C, + 0x03, 0x00, 0xC0, 0x33, 0xCD, 0xFB, 0xC7, 0xE0, 0xF0, 0x3C, 0x0F, 0x03, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xF0, 0x3F, 0xFF, 0xFF, + 0xF0, 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, + 0xE0, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x83, 0x30, 0xC6, 0x30, + 0xCC, 0x1B, 0x83, 0xF0, 0x77, 0x0C, 0x61, 0x8E, 0x30, 0xE6, 0x0C, 0xC1, + 0xD8, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xCF, 0x1F, 0x6F, 0xDF, 0xFC, + 0x78, 0xFC, 0x18, 0x3C, 0x0C, 0x1E, 0x06, 0x0F, 0x03, 0x07, 0x81, 0x83, + 0xC0, 0xC1, 0xE0, 0x60, 0xF0, 0x30, 0x78, 0x18, 0x3C, 0x0C, 0x18, 0xCF, + 0x37, 0xEF, 0x1F, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, + 0x0F, 0x03, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, + 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x1F, 0xC1, 0xF0, 0xCF, 0x8D, + 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, + 0x07, 0xF0, 0xEF, 0xFC, 0xCF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00, + 0x1E, 0x67, 0xFD, 0xC7, 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, + 0x7C, 0x1D, 0xC7, 0x9F, 0xF1, 0xE6, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, + 0xCF, 0x7F, 0x38, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x1F, + 0xEE, 0x1B, 0x00, 0xC0, 0x3C, 0x07, 0xF0, 0x3E, 0x01, 0xF0, 0x3E, 0x1D, + 0xFE, 0x3E, 0x00, 0x63, 0x19, 0xFF, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x31, + 0xE7, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x7E, 0x3D, 0xFB, 0x3C, 0xC0, 0xE0, 0x66, 0x06, 0x60, 0x67, 0x0C, + 0x30, 0xC3, 0x0C, 0x39, 0x81, 0x98, 0x19, 0x81, 0xF0, 0x0F, 0x00, 0xE0, + 0x0E, 0x00, 0xC1, 0xC1, 0xB0, 0xE1, 0xD8, 0x70, 0xCC, 0x2C, 0x66, 0x36, + 0x31, 0x9B, 0x18, 0xCD, 0x98, 0x64, 0x6C, 0x16, 0x36, 0x0F, 0x1A, 0x07, + 0x8F, 0x03, 0x83, 0x80, 0xC1, 0xC0, 0x60, 0xEE, 0x18, 0xC6, 0x0C, 0xC1, + 0xF0, 0x1C, 0x01, 0x80, 0x78, 0x1B, 0x03, 0x30, 0xC7, 0x30, 0x66, 0x06, + 0xE0, 0x6C, 0x0D, 0x83, 0x38, 0x63, 0x0C, 0x63, 0x0E, 0x60, 0xCC, 0x1B, + 0x03, 0x60, 0x3C, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x78, 0x0E, + 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x81, 0xC0, 0x60, 0x30, + 0x18, 0x0E, 0x03, 0xFF, 0xFF, 0xC0, 0x19, 0xCC, 0x63, 0x18, 0xC6, 0x31, + 0x99, 0x86, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1C, 0x60, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0xC7, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x0C, 0x33, 0x31, + 0x8C, 0x63, 0x18, 0xC6, 0x73, 0x00, 0x70, 0x3E, 0x09, 0xE4, 0x1F, 0x03, + 0x80}; + +const GFXglyph FreeSans12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 6, 0, 1}, // 0x20 ' ' + {0, 2, 18, 8, 3, -17}, // 0x21 '!' + {5, 6, 6, 8, 1, -16}, // 0x22 '"' + {10, 13, 16, 13, 0, -15}, // 0x23 '#' + {36, 11, 20, 13, 1, -17}, // 0x24 '$' + {64, 20, 17, 21, 1, -16}, // 0x25 '%' + {107, 14, 17, 16, 1, -16}, // 0x26 '&' + {137, 2, 6, 5, 1, -16}, // 0x27 ''' + {139, 5, 23, 8, 2, -17}, // 0x28 '(' + {154, 5, 23, 8, 1, -17}, // 0x29 ')' + {169, 7, 7, 9, 1, -17}, // 0x2A '*' + {176, 10, 11, 14, 2, -10}, // 0x2B '+' + {190, 2, 6, 7, 2, -1}, // 0x2C ',' + {192, 6, 2, 8, 1, -7}, // 0x2D '-' + {194, 2, 2, 6, 2, -1}, // 0x2E '.' + {195, 7, 18, 7, 0, -17}, // 0x2F '/' + {211, 11, 17, 13, 1, -16}, // 0x30 '0' + {235, 5, 17, 13, 3, -16}, // 0x31 '1' + {246, 11, 17, 13, 1, -16}, // 0x32 '2' + {270, 11, 17, 13, 1, -16}, // 0x33 '3' + {294, 11, 17, 13, 1, -16}, // 0x34 '4' + {318, 11, 17, 13, 1, -16}, // 0x35 '5' + {342, 11, 17, 13, 1, -16}, // 0x36 '6' + {366, 11, 17, 13, 1, -16}, // 0x37 '7' + {390, 11, 17, 13, 1, -16}, // 0x38 '8' + {414, 11, 17, 13, 1, -16}, // 0x39 '9' + {438, 2, 13, 6, 2, -12}, // 0x3A ':' + {442, 2, 16, 6, 2, -11}, // 0x3B ';' + {446, 12, 12, 14, 1, -11}, // 0x3C '<' + {464, 12, 6, 14, 1, -8}, // 0x3D '=' + {473, 12, 12, 14, 1, -11}, // 0x3E '>' + {491, 10, 18, 13, 2, -17}, // 0x3F '?' + {514, 22, 21, 24, 1, -17}, // 0x40 '@' + {572, 16, 18, 16, 0, -17}, // 0x41 'A' + {608, 13, 18, 16, 2, -17}, // 0x42 'B' + {638, 15, 18, 17, 1, -17}, // 0x43 'C' + {672, 14, 18, 17, 2, -17}, // 0x44 'D' + {704, 12, 18, 15, 2, -17}, // 0x45 'E' + {731, 11, 18, 14, 2, -17}, // 0x46 'F' + {756, 16, 18, 18, 1, -17}, // 0x47 'G' + {792, 13, 18, 17, 2, -17}, // 0x48 'H' + {822, 2, 18, 7, 2, -17}, // 0x49 'I' + {827, 9, 18, 13, 1, -17}, // 0x4A 'J' + {848, 14, 18, 16, 2, -17}, // 0x4B 'K' + {880, 10, 18, 14, 2, -17}, // 0x4C 'L' + {903, 16, 18, 20, 2, -17}, // 0x4D 'M' + {939, 13, 18, 18, 2, -17}, // 0x4E 'N' + {969, 17, 18, 19, 1, -17}, // 0x4F 'O' + {1008, 12, 18, 16, 2, -17}, // 0x50 'P' + {1035, 17, 19, 19, 1, -17}, // 0x51 'Q' + {1076, 14, 18, 17, 2, -17}, // 0x52 'R' + {1108, 14, 18, 16, 1, -17}, // 0x53 'S' + {1140, 12, 18, 15, 1, -17}, // 0x54 'T' + {1167, 13, 18, 17, 2, -17}, // 0x55 'U' + {1197, 15, 18, 15, 0, -17}, // 0x56 'V' + {1231, 22, 18, 22, 0, -17}, // 0x57 'W' + {1281, 15, 18, 16, 0, -17}, // 0x58 'X' + {1315, 16, 18, 16, 0, -17}, // 0x59 'Y' + {1351, 13, 18, 15, 1, -17}, // 0x5A 'Z' + {1381, 4, 23, 7, 2, -17}, // 0x5B '[' + {1393, 7, 18, 7, 0, -17}, // 0x5C '\' + {1409, 4, 23, 7, 1, -17}, // 0x5D ']' + {1421, 9, 9, 11, 1, -16}, // 0x5E '^' + {1432, 15, 1, 13, -1, 4}, // 0x5F '_' + {1434, 5, 4, 6, 1, -17}, // 0x60 '`' + {1437, 12, 13, 13, 1, -12}, // 0x61 'a' + {1457, 12, 18, 13, 1, -17}, // 0x62 'b' + {1484, 10, 13, 12, 1, -12}, // 0x63 'c' + {1501, 11, 18, 13, 1, -17}, // 0x64 'd' + {1526, 11, 13, 13, 1, -12}, // 0x65 'e' + {1544, 5, 18, 7, 1, -17}, // 0x66 'f' + {1556, 11, 18, 13, 1, -12}, // 0x67 'g' + {1581, 10, 18, 13, 1, -17}, // 0x68 'h' + {1604, 2, 18, 5, 2, -17}, // 0x69 'i' + {1609, 4, 23, 6, 0, -17}, // 0x6A 'j' + {1621, 11, 18, 12, 1, -17}, // 0x6B 'k' + {1646, 2, 18, 5, 1, -17}, // 0x6C 'l' + {1651, 17, 13, 19, 1, -12}, // 0x6D 'm' + {1679, 10, 13, 13, 1, -12}, // 0x6E 'n' + {1696, 11, 13, 13, 1, -12}, // 0x6F 'o' + {1714, 12, 17, 13, 1, -12}, // 0x70 'p' + {1740, 11, 17, 13, 1, -12}, // 0x71 'q' + {1764, 6, 13, 8, 1, -12}, // 0x72 'r' + {1774, 10, 13, 12, 1, -12}, // 0x73 's' + {1791, 5, 16, 7, 1, -15}, // 0x74 't' + {1801, 10, 13, 13, 1, -12}, // 0x75 'u' + {1818, 12, 13, 12, 0, -12}, // 0x76 'v' + {1838, 17, 13, 17, 0, -12}, // 0x77 'w' + {1866, 11, 13, 11, 0, -12}, // 0x78 'x' + {1884, 11, 18, 11, 0, -12}, // 0x79 'y' + {1909, 10, 13, 12, 1, -12}, // 0x7A 'z' + {1926, 5, 23, 8, 1, -17}, // 0x7B '{' + {1941, 2, 23, 6, 2, -17}, // 0x7C '|' + {1947, 5, 23, 8, 2, -17}, // 0x7D '}' + {1962, 10, 5, 12, 1, -10}}; // 0x7E '~' + +const GFXfont FreeSans12pt7b PROGMEM = {(uint8_t *)FreeSans12pt7bBitmaps, + (GFXglyph *)FreeSans12pt7bGlyphs, 0x20, + 0x7E, 29}; + +// Approx. 2641 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h new file mode 100644 index 0000000..f3a9606 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h @@ -0,0 +1,454 @@ +#pragma once +#include + +const uint8_t FreeSans18pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x20, 0x3F, 0xFC, 0xE3, 0xF1, + 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 0x82, 0x41, 0x00, 0x01, 0xC3, 0x80, + 0x38, 0x70, 0x06, 0x0E, 0x00, 0xC1, 0x80, 0x38, 0x70, 0x07, 0x0E, 0x0F, + 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0xE1, 0xC0, 0x1C, 0x38, 0x03, + 0x87, 0x00, 0x70, 0xE0, 0x0C, 0x18, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF, + 0xFF, 0xC1, 0xC3, 0x80, 0x30, 0x60, 0x06, 0x0C, 0x01, 0xC3, 0x80, 0x38, + 0x70, 0x07, 0x0E, 0x00, 0xC1, 0x80, 0x03, 0x00, 0x0F, 0xC0, 0x3F, 0xF0, + 0x3F, 0xF8, 0x7B, 0x3C, 0xF3, 0x1C, 0xE3, 0x0E, 0xE3, 0x0E, 0xE3, 0x0E, + 0xE3, 0x00, 0xE3, 0x00, 0xF3, 0x00, 0x7B, 0x00, 0x7F, 0x80, 0x1F, 0xF0, + 0x07, 0xFC, 0x03, 0x7E, 0x03, 0x0F, 0x03, 0x07, 0xE3, 0x07, 0xE3, 0x07, + 0xE3, 0x07, 0xE3, 0x0F, 0x73, 0x3E, 0x7F, 0xFC, 0x3F, 0xF8, 0x0F, 0xE0, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x78, 0x00, + 0xE0, 0x0F, 0xF0, 0x06, 0x00, 0xFF, 0xC0, 0x70, 0x07, 0x0E, 0x07, 0x00, + 0x70, 0x38, 0x38, 0x03, 0x00, 0xC3, 0x80, 0x18, 0x06, 0x1C, 0x00, 0xE0, + 0x71, 0xC0, 0x03, 0x87, 0x8C, 0x00, 0x1F, 0xF8, 0xE0, 0x00, 0x7F, 0x86, + 0x00, 0x01, 0xF8, 0x70, 0x00, 0x00, 0x03, 0x03, 0xC0, 0x00, 0x38, 0x7F, + 0x80, 0x01, 0x87, 0xFE, 0x00, 0x1C, 0x38, 0x70, 0x00, 0xC3, 0x81, 0xC0, + 0x0E, 0x18, 0x06, 0x00, 0xE0, 0xC0, 0x30, 0x07, 0x07, 0x03, 0x80, 0x70, + 0x1C, 0x38, 0x03, 0x80, 0xFF, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0x80, 0x07, + 0x80, 0x01, 0xF0, 0x00, 0x7F, 0x80, 0x0F, 0xFC, 0x01, 0xE1, 0xE0, 0x1C, + 0x0E, 0x01, 0xC0, 0xE0, 0x1C, 0x0E, 0x01, 0xE1, 0xE0, 0x0E, 0x3C, 0x00, + 0x77, 0x80, 0x07, 0xF0, 0x00, 0x7C, 0x00, 0x0F, 0xE0, 0x03, 0xCF, 0x1C, + 0x78, 0x79, 0xC7, 0x03, 0xDC, 0xE0, 0x1F, 0x8E, 0x00, 0xF8, 0xE0, 0x0F, + 0x0E, 0x00, 0x70, 0xF0, 0x0F, 0x87, 0xC3, 0xFC, 0x7F, 0xFD, 0xC3, 0xFF, + 0x0E, 0x0F, 0xC0, 0xF0, 0xFF, 0xFF, 0xFA, 0x40, 0x06, 0x06, 0x0C, 0x0C, + 0x18, 0x18, 0x38, 0x30, 0x70, 0x70, 0x70, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x70, 0x70, 0x70, 0x30, 0x38, 0x18, + 0x18, 0x0C, 0x0C, 0x06, 0x03, 0xC0, 0x60, 0x30, 0x30, 0x38, 0x18, 0x1C, + 0x0C, 0x0E, 0x0E, 0x0E, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x0E, 0x0E, 0x0E, 0x0C, 0x1C, 0x18, 0x38, 0x30, 0x30, + 0x60, 0xC0, 0x0C, 0x03, 0x00, 0xC3, 0xB7, 0xFF, 0xC7, 0x81, 0xE0, 0xEC, + 0x73, 0x88, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, + 0xF6, 0xDA, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xC0, 0x30, 0x18, + 0x06, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x06, 0x01, 0x80, 0x60, 0x30, 0x0C, + 0x03, 0x00, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x00, 0xC0, 0x30, 0x18, 0x06, + 0x01, 0x80, 0xC0, 0x30, 0x00, 0x07, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C, + 0x3C, 0x78, 0x1E, 0x70, 0x0E, 0x70, 0x0E, 0xE0, 0x07, 0xE0, 0x07, 0xE0, + 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, + 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3C, + 0x3C, 0x1F, 0xF8, 0x1F, 0xF0, 0x07, 0xE0, 0x03, 0x03, 0x07, 0x0F, 0x3F, + 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xE0, 0x1F, 0xF8, + 0x3F, 0xFC, 0x7C, 0x3E, 0x70, 0x0F, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, + 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, + 0x60, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0, + 0x07, 0xFE, 0x07, 0xFF, 0x87, 0x83, 0xC3, 0x80, 0xF3, 0x80, 0x39, 0xC0, + 0x1C, 0xE0, 0x0E, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x3F, 0x00, + 0x1F, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xF0, 0x01, + 0xF8, 0x00, 0xFE, 0x00, 0x77, 0x00, 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, + 0xF8, 0x07, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0xF8, + 0x00, 0xF8, 0x01, 0xF8, 0x03, 0xB8, 0x03, 0x38, 0x07, 0x38, 0x0E, 0x38, + 0x1C, 0x38, 0x18, 0x38, 0x38, 0x38, 0x70, 0x38, 0x60, 0x38, 0xE0, 0x38, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F, 0xFF, + 0xC7, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x39, + 0xF0, 0x3F, 0xFE, 0x1F, 0xFF, 0x8F, 0x83, 0xE7, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xFC, 0x00, + 0xEF, 0x00, 0x73, 0xC0, 0xF0, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xE0, 0x00, + 0x03, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C, 0x1E, 0x38, 0x0E, 0x70, 0x0E, + 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8, 0xFF, 0xFC, + 0xFC, 0x3E, 0xF0, 0x0E, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, + 0x60, 0x07, 0x70, 0x0F, 0x70, 0x0E, 0x3C, 0x3E, 0x3F, 0xFC, 0x1F, 0xF8, + 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x06, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, + 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x07, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83, + 0xC7, 0x80, 0xF3, 0x80, 0x39, 0xC0, 0x1C, 0xE0, 0x0E, 0x78, 0x0F, 0x1E, + 0x0F, 0x07, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xE3, 0xE0, 0xF9, 0xC0, 0x1D, + 0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xF7, 0x00, + 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x07, 0xE0, + 0x1F, 0xF8, 0x3F, 0xFC, 0x7C, 0x3C, 0x70, 0x0E, 0xF0, 0x0E, 0xE0, 0x06, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0F, 0x78, 0x3F, + 0x3F, 0xFF, 0x1F, 0xF7, 0x07, 0xC7, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0E, + 0x70, 0x0E, 0x70, 0x1C, 0x78, 0x3C, 0x3F, 0xF8, 0x1F, 0xF0, 0x07, 0xC0, + 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x07, 0xFF, 0xB6, 0xD6, 0x00, 0x00, 0x80, 0x03, 0xC0, 0x07, 0xE0, + 0x0F, 0xC0, 0x3F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF0, 0x00, 0xE0, 0x00, + 0x7C, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, + 0x7E, 0x00, 0x0F, 0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x80, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x0F, 0xE0, 0x00, 0xFC, + 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0x80, 0x0F, 0xC0, + 0x1F, 0x80, 0x7F, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x01, 0xC0, 0x00, + 0x80, 0x00, 0x00, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xC3, 0xEF, 0x01, + 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0x00, 0x0E, 0x00, 0x38, 0x00, 0xF0, + 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x00, + 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x0F, 0xE0, 0x03, 0xE0, 0x01, 0xF0, + 0x07, 0x80, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x1E, + 0x3C, 0x03, 0xE0, 0x1E, 0x38, 0x0F, 0xF3, 0x8E, 0x78, 0x1E, 0x3F, 0x0F, + 0x70, 0x38, 0x1F, 0x07, 0x70, 0x78, 0x0F, 0x07, 0xE0, 0x70, 0x0E, 0x07, + 0xE0, 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x0E, 0x07, 0xE0, 0xE0, 0x1C, 0x07, + 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x38, 0x1C, + 0xF0, 0x70, 0x78, 0x3C, 0x70, 0x78, 0xFC, 0x78, 0x78, 0x3F, 0xDF, 0xF0, + 0x38, 0x1F, 0x0F, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x07, 0xF0, 0x0E, 0x00, 0x01, 0xFF, 0xFE, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x03, + 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xDC, 0x00, 0x07, 0x78, + 0x00, 0x3C, 0xE0, 0x00, 0xE3, 0x80, 0x03, 0x8F, 0x00, 0x1E, 0x1C, 0x00, + 0x70, 0x70, 0x01, 0xC1, 0xE0, 0x0E, 0x03, 0x80, 0x38, 0x0E, 0x00, 0xE0, + 0x3C, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0xFF, 0xFF, 0x83, 0xC0, 0x0E, + 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xF1, 0xE0, 0x01, 0xC7, 0x00, 0x07, 0xBC, + 0x00, 0x1E, 0xF0, 0x00, 0x3B, 0x80, 0x00, 0xF0, 0xFF, 0xFC, 0x1F, 0xFF, + 0xE3, 0xFF, 0xFE, 0x70, 0x03, 0xCE, 0x00, 0x3D, 0xC0, 0x03, 0xB8, 0x00, + 0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x73, 0x80, 0x1E, 0x7F, 0xFF, + 0x8F, 0xFF, 0xF1, 0xFF, 0xFF, 0x38, 0x00, 0xF7, 0x00, 0x0E, 0xE0, 0x00, + 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03, + 0xF8, 0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0x80, 0x00, 0xFF, + 0x00, 0x0F, 0xFF, 0x00, 0xFF, 0xFE, 0x07, 0xE0, 0x7C, 0x3E, 0x00, 0x78, + 0xF0, 0x00, 0xE7, 0x80, 0x03, 0xDC, 0x00, 0x07, 0x70, 0x00, 0x03, 0x80, + 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, + 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x77, + 0x00, 0x03, 0xDE, 0x00, 0x0E, 0x3C, 0x00, 0x78, 0xF8, 0x03, 0xC1, 0xF8, + 0x1F, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x03, 0xF8, 0x00, 0xFF, 0xF8, + 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x0E, 0x00, 0xF8, 0xE0, 0x03, 0xCE, 0x00, + 0x1C, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00, 0x07, 0xE0, + 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, + 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xE0, 0x00, 0xEE, 0x00, 0x0E, + 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x0F, 0x8F, 0xFF, 0xF0, 0xFF, 0xFE, + 0x0F, 0xFF, 0x80, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0x80, 0x00, + 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, + 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0xEE, 0x00, + 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, + 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00, + 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, + 0x00, 0x1F, 0xFF, 0xCF, 0xFF, 0xE7, 0xFF, 0xF3, 0x80, 0x01, 0xC0, 0x00, + 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, + 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7F, + 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x0F, 0x80, 0xFC, 0x1E, 0x00, + 0x3E, 0x3C, 0x00, 0x0E, 0x78, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x70, 0x00, + 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x03, + 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0x70, 0x00, 0x07, 0x70, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x3C, 0x00, + 0x1F, 0x1E, 0x00, 0x3F, 0x0F, 0xC0, 0xF7, 0x07, 0xFF, 0xE7, 0x03, 0xFF, + 0xC3, 0x00, 0xFF, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, + 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, + 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, + 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, + 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, + 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0x80, 0x7E, + 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, + 0x3F, 0x00, 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x07, 0x8E, 0x00, 0xF0, + 0xE0, 0x1E, 0x0E, 0x03, 0xE0, 0xE0, 0x7C, 0x0E, 0x0F, 0x80, 0xE1, 0xF0, + 0x0E, 0x1E, 0x00, 0xE3, 0xC0, 0x0E, 0x7C, 0x00, 0xEF, 0xE0, 0x0F, 0xCE, + 0x00, 0xF8, 0xF0, 0x0F, 0x07, 0x80, 0xE0, 0x3C, 0x0E, 0x03, 0xC0, 0xE0, + 0x1E, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0x78, 0xE0, 0x03, 0xCE, + 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0F, 0xE0, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, + 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, + 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, + 0x38, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0x00, 0x1F, 0xF8, + 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, + 0x00, 0x3F, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xE7, + 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE3, 0x81, 0xC7, 0xE3, + 0x81, 0xC7, 0xE3, 0x81, 0xC7, 0xE1, 0xC3, 0x87, 0xE1, 0xC3, 0x87, 0xE1, + 0xC3, 0x87, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0, + 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x3C, 0x07, 0xE0, + 0x3C, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xC0, 0x07, + 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xEF, 0x00, 0x7E, 0x70, 0x07, 0xE7, 0x80, + 0x7E, 0x3C, 0x07, 0xE1, 0xC0, 0x7E, 0x1E, 0x07, 0xE0, 0xE0, 0x7E, 0x0F, + 0x07, 0xE0, 0x78, 0x7E, 0x03, 0x87, 0xE0, 0x3C, 0x7E, 0x01, 0xE7, 0xE0, + 0x0E, 0x7E, 0x00, 0xF7, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x03, 0xFE, + 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x01, 0xFF, + 0xF0, 0x01, 0xFF, 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0, + 0x00, 0xF1, 0xE0, 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, + 0xB8, 0x00, 0x03, 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x01, 0xE3, 0xC0, 0x01, + 0xE0, 0xF0, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, + 0x80, 0x3E, 0xE0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, + 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x1E, 0xFF, 0xFF, 0x3F, 0xFF, + 0x8F, 0xFF, 0xC3, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, + 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF, + 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0, 0x00, 0xF1, 0xE0, + 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70, 0x00, 0x01, 0xF8, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xB8, 0x00, 0x03, + 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x39, 0xE3, 0xC0, 0x1F, 0xE0, 0xF0, 0x07, + 0xE0, 0x3E, 0x03, 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xEE, 0x00, 0x3F, + 0x83, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, 0xFF, 0xFE, 0x0F, 0xFF, + 0xF8, 0xFF, 0xFF, 0xCE, 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0, + 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xCE, + 0x00, 0x3C, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8E, 0x00, 0x3C, + 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, + 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00, + 0x0F, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xE0, 0x7C, 0x38, + 0x01, 0xE7, 0x00, 0x0E, 0x70, 0x00, 0xE7, 0x00, 0x00, 0x70, 0x00, 0x07, + 0x80, 0x00, 0x3E, 0x00, 0x01, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xF8, + 0x00, 0x3F, 0xE0, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xE0, 0x00, + 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x77, 0x80, 0x0E, 0x7C, 0x03, 0xE3, 0xFF, + 0xFC, 0x1F, 0xFF, 0x80, 0x3F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x80, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, + 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, + 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0xFC, 0x00, + 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, + 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, + 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, + 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x1E, 0xF0, 0x07, + 0x9F, 0x01, 0xF1, 0xFF, 0xFC, 0x1F, 0xFE, 0x00, 0x7F, 0x00, 0xE0, 0x00, + 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1C, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0x3C, + 0x00, 0x70, 0xE0, 0x07, 0x87, 0x80, 0x3C, 0x1C, 0x01, 0xC0, 0xE0, 0x0E, + 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x83, 0x80, 0x1C, + 0x1C, 0x00, 0xE0, 0xE0, 0x07, 0x8E, 0x00, 0x1C, 0x70, 0x00, 0xE3, 0x80, + 0x07, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0xEE, 0x00, 0x07, 0xE0, 0x00, 0x1F, + 0x00, 0x00, 0xF8, 0x00, 0x03, 0x80, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x70, + 0x03, 0xC0, 0x0F, 0x78, 0x03, 0xE0, 0x0F, 0x78, 0x03, 0xE0, 0x0E, 0x38, + 0x07, 0xE0, 0x0E, 0x38, 0x07, 0xF0, 0x1E, 0x3C, 0x07, 0x70, 0x1E, 0x3C, + 0x07, 0x70, 0x1C, 0x1C, 0x0E, 0x70, 0x1C, 0x1C, 0x0E, 0x38, 0x3C, 0x1C, + 0x0E, 0x38, 0x3C, 0x1E, 0x1E, 0x38, 0x38, 0x0E, 0x1C, 0x38, 0x38, 0x0E, + 0x1C, 0x1C, 0x38, 0x0E, 0x1C, 0x1C, 0x78, 0x0F, 0x3C, 0x1C, 0x70, 0x07, + 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, + 0x70, 0x0E, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, + 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x03, 0xC0, 0x01, + 0xE0, 0x03, 0xC0, 0xF0, 0x00, 0x7B, 0xC0, 0x07, 0x8F, 0x00, 0x38, 0x78, + 0x03, 0xC1, 0xE0, 0x3C, 0x07, 0x81, 0xC0, 0x3C, 0x1E, 0x00, 0xF1, 0xE0, + 0x03, 0x8E, 0x00, 0x1E, 0xF0, 0x00, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x0F, + 0x80, 0x00, 0x7C, 0x00, 0x07, 0xF0, 0x00, 0x3B, 0x80, 0x03, 0xDE, 0x00, + 0x3C, 0x78, 0x01, 0xC1, 0xC0, 0x1E, 0x0F, 0x01, 0xE0, 0x3C, 0x0E, 0x00, + 0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x1E, 0x70, 0x00, 0xF7, 0x80, 0x03, 0xC0, + 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x81, + 0xE0, 0x0F, 0x01, 0xC0, 0x1C, 0x03, 0xC0, 0x78, 0x03, 0xC1, 0xE0, 0x07, + 0x83, 0x80, 0x07, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0F, 0x78, 0x00, 0x0E, + 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, + 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x70, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x00, + 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, + 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x7C, 0x00, + 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0xE3, 0x8E, 0x38, 0xE3, + 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, + 0x8E, 0x38, 0xE3, 0x8F, 0xFF, 0xFC, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x60, + 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x03, 0x00, + 0x40, 0x18, 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06, + 0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, + 0x1C, 0x7F, 0xFF, 0xFC, 0x07, 0x00, 0x78, 0x03, 0xC0, 0x3F, 0x01, 0xD8, + 0x0C, 0xE0, 0xE3, 0x06, 0x1C, 0x70, 0xE3, 0x83, 0x18, 0x1D, 0xC0, 0x6C, + 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0xF0, 0xE0, 0xE0, + 0xE0, 0x07, 0xF0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0x03, 0xC7, 0x00, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0xFE, 0x0F, 0xFF, 0x1F, 0xF3, + 0x9F, 0x01, 0xCF, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x79, 0xE0, 0xFC, 0x7F, + 0xEF, 0x9F, 0xE3, 0xC7, 0xE1, 0xE0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8, + 0xFF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E, + 0xF8, 0x1E, 0xFC, 0x3C, 0xEF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0x07, 0xF0, + 0x1F, 0xF8, 0x3F, 0xFC, 0x3C, 0x1E, 0x78, 0x0E, 0x70, 0x07, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x07, + 0x70, 0x07, 0x78, 0x0E, 0x7C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, + 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, + 0x1C, 0x00, 0x0E, 0x0F, 0xC7, 0x1F, 0xFB, 0x9F, 0xFF, 0xDF, 0x07, 0xEF, + 0x01, 0xF7, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, + 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x77, 0x00, 0x7B, 0xC0, 0x7D, 0xF0, + 0x7E, 0x7F, 0xFB, 0x1F, 0xF9, 0x83, 0xF0, 0xC0, 0x07, 0xE0, 0x1F, 0xF8, + 0x3F, 0xFC, 0x7C, 0x1E, 0x70, 0x0E, 0x60, 0x06, 0xE0, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x07, + 0x78, 0x0E, 0x3C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x0E, 0x3C, + 0xF9, 0xC3, 0x87, 0x0E, 0x7F, 0xFF, 0xFC, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, + 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0x07, 0xC7, 0x1F, + 0xF7, 0x3F, 0xFF, 0x3C, 0x3F, 0x78, 0x0F, 0x70, 0x0F, 0xE0, 0x07, 0xE0, + 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0x70, + 0x0F, 0x78, 0x0F, 0x7C, 0x3F, 0x3F, 0xF7, 0x1F, 0xE7, 0x07, 0xC7, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3F, 0xFC, 0x1F, + 0xF8, 0x07, 0xE0, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x71, 0xF8, 0xE7, 0xFD, 0xDF, 0xFB, 0xF0, 0xFF, + 0xC0, 0xFF, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, + 0xE0, 0x0F, 0xC0, 0x1C, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x1C, 0x71, 0xC7, 0x00, 0x00, 0x07, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, + 0x73, 0xFF, 0xFB, 0xC0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x3C, 0xE0, 0x78, 0xE0, 0xF0, + 0xE1, 0xE0, 0xE3, 0xC0, 0xE7, 0x80, 0xEF, 0x00, 0xEF, 0x80, 0xFF, 0x80, + 0xFB, 0xC0, 0xF1, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0x70, 0xE0, 0x78, + 0xE0, 0x3C, 0xE0, 0x1C, 0xE0, 0x1E, 0xE0, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE3, 0xE0, 0xF8, 0xE7, 0xF1, 0xFE, + 0xEF, 0xFB, 0xFE, 0xF8, 0x7F, 0x0F, 0xF0, 0x3E, 0x07, 0xF0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE3, 0xF1, 0xCF, 0xFB, 0xBF, 0xF7, 0xE1, 0xFF, 0x81, + 0xFE, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, + 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x38, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83, 0xC7, + 0x80, 0xF3, 0x80, 0x3B, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, + 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3B, 0x80, 0x39, 0xE0, 0x3C, 0x78, + 0x3C, 0x3F, 0xFE, 0x0F, 0xFE, 0x01, 0xFC, 0x00, 0xE3, 0xE0, 0xE7, 0xF8, + 0xEF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E, + 0xF8, 0x1E, 0xFC, 0x3E, 0xFF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x07, 0xE1, + 0x8F, 0xFC, 0xCF, 0xFF, 0x67, 0x83, 0xF7, 0x80, 0xFB, 0x80, 0x3F, 0xC0, + 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, + 0x00, 0x3B, 0x80, 0x3D, 0xE0, 0x3E, 0xF8, 0x3F, 0x3F, 0xFF, 0x8F, 0xFD, + 0xC1, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, + 0x07, 0x00, 0x03, 0x80, 0xE3, 0xF7, 0xFB, 0xFF, 0x8F, 0x07, 0x83, 0x81, + 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, + 0x38, 0x00, 0x0F, 0xC0, 0xFF, 0x87, 0xFF, 0x3C, 0x1E, 0xE0, 0x3B, 0x80, + 0x0E, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x7F, 0x00, + 0x3F, 0x80, 0x7E, 0x01, 0xFC, 0x1F, 0x7F, 0xF8, 0xFF, 0xC1, 0xFC, 0x00, + 0x38, 0x70, 0xE1, 0xCF, 0xFF, 0xFF, 0x9C, 0x38, 0x70, 0xE1, 0xC3, 0x87, + 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0xE7, 0xC7, 0x80, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, + 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xFC, + 0x0F, 0xFC, 0x3F, 0x7F, 0xEE, 0xFF, 0x9C, 0x7E, 0x38, 0x70, 0x03, 0xB8, + 0x03, 0x9C, 0x01, 0xC7, 0x00, 0xE3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x38, + 0x38, 0x38, 0x1C, 0x1C, 0x07, 0x0E, 0x03, 0x8E, 0x01, 0xC7, 0x00, 0x77, + 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0x70, 0x00, 0xF0, 0x1C, 0x03, 0xB8, 0x1F, 0x03, 0xDC, 0x0F, 0x81, 0xCE, + 0x07, 0xC0, 0xE7, 0x83, 0xE0, 0x71, 0xC3, 0xB8, 0x70, 0xE1, 0xDC, 0x38, + 0x70, 0xEE, 0x1C, 0x1C, 0x63, 0x0E, 0x0E, 0x71, 0xCE, 0x07, 0x38, 0xE7, + 0x03, 0x9C, 0x73, 0x80, 0xEC, 0x19, 0x80, 0x7E, 0x0F, 0xC0, 0x3F, 0x07, + 0xE0, 0x0F, 0x83, 0xF0, 0x07, 0x80, 0xF0, 0x03, 0xC0, 0x78, 0x01, 0xE0, + 0x3C, 0x00, 0x70, 0x07, 0x38, 0x0E, 0x3C, 0x1C, 0x1C, 0x1C, 0x0E, 0x38, + 0x0F, 0x70, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x03, 0xE0, + 0x07, 0xE0, 0x07, 0x70, 0x0E, 0x78, 0x1E, 0x38, 0x1C, 0x1C, 0x38, 0x1E, + 0x78, 0x0E, 0x70, 0x07, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xC7, 0x01, + 0xC3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x70, 0x38, 0x38, 0x1C, 0x3C, 0x07, + 0x1C, 0x03, 0x8E, 0x01, 0xCE, 0x00, 0x77, 0x00, 0x3B, 0x80, 0x1F, 0x80, + 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x38, + 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, + 0x00, 0x00, 0x7F, 0xFC, 0xFF, 0xF9, 0xFF, 0xF0, 0x00, 0xE0, 0x03, 0x80, + 0x0E, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0x07, 0x0F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0xF8, 0xE0, 0xF8, 0x38, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x0F, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0xF0, 0xF8, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1F, + 0x07, 0x1F, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0xF8, 0xF0, 0xE0, 0x38, 0x00, 0xFC, 0x03, 0xFC, 0x1F, 0x3E, + 0x3C, 0x1F, 0xE0, 0x1F, 0x80, 0x1E, 0x00}; + +const GFXglyph FreeSans18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 9, 0, 1}, // 0x20 ' ' + {0, 3, 26, 12, 4, -25}, // 0x21 '!' + {10, 9, 9, 12, 1, -24}, // 0x22 '"' + {21, 19, 24, 19, 0, -23}, // 0x23 '#' + {78, 16, 30, 19, 2, -26}, // 0x24 '$' + {138, 29, 25, 31, 1, -24}, // 0x25 '%' + {229, 20, 25, 23, 2, -24}, // 0x26 '&' + {292, 3, 9, 7, 2, -24}, // 0x27 ''' + {296, 8, 33, 12, 3, -25}, // 0x28 '(' + {329, 8, 33, 12, 1, -25}, // 0x29 ')' + {362, 10, 10, 14, 2, -25}, // 0x2A '*' + {375, 16, 16, 20, 2, -15}, // 0x2B '+' + {407, 3, 9, 10, 3, -3}, // 0x2C ',' + {411, 8, 3, 12, 2, -10}, // 0x2D '-' + {414, 3, 4, 9, 3, -3}, // 0x2E '.' + {416, 10, 26, 10, 0, -25}, // 0x2F '/' + {449, 16, 25, 19, 2, -24}, // 0x30 '0' + {499, 8, 25, 19, 4, -24}, // 0x31 '1' + {524, 16, 25, 19, 2, -24}, // 0x32 '2' + {574, 17, 25, 19, 1, -24}, // 0x33 '3' + {628, 16, 25, 19, 1, -24}, // 0x34 '4' + {678, 17, 25, 19, 1, -24}, // 0x35 '5' + {732, 16, 25, 19, 2, -24}, // 0x36 '6' + {782, 16, 25, 19, 2, -24}, // 0x37 '7' + {832, 17, 25, 19, 1, -24}, // 0x38 '8' + {886, 16, 25, 19, 1, -24}, // 0x39 '9' + {936, 3, 19, 9, 3, -18}, // 0x3A ':' + {944, 3, 24, 9, 3, -18}, // 0x3B ';' + {953, 17, 17, 20, 2, -16}, // 0x3C '<' + {990, 17, 9, 20, 2, -12}, // 0x3D '=' + {1010, 17, 17, 20, 2, -16}, // 0x3E '>' + {1047, 15, 26, 19, 3, -25}, // 0x3F '?' + {1096, 32, 31, 36, 1, -25}, // 0x40 '@' + {1220, 22, 26, 23, 1, -25}, // 0x41 'A' + {1292, 19, 26, 23, 3, -25}, // 0x42 'B' + {1354, 22, 26, 25, 1, -25}, // 0x43 'C' + {1426, 20, 26, 24, 3, -25}, // 0x44 'D' + {1491, 18, 26, 22, 3, -25}, // 0x45 'E' + {1550, 17, 26, 21, 3, -25}, // 0x46 'F' + {1606, 24, 26, 27, 1, -25}, // 0x47 'G' + {1684, 19, 26, 25, 3, -25}, // 0x48 'H' + {1746, 3, 26, 10, 4, -25}, // 0x49 'I' + {1756, 14, 26, 18, 1, -25}, // 0x4A 'J' + {1802, 20, 26, 24, 3, -25}, // 0x4B 'K' + {1867, 15, 26, 20, 3, -25}, // 0x4C 'L' + {1916, 24, 26, 30, 3, -25}, // 0x4D 'M' + {1994, 20, 26, 26, 3, -25}, // 0x4E 'N' + {2059, 25, 26, 27, 1, -25}, // 0x4F 'O' + {2141, 18, 26, 23, 3, -25}, // 0x50 'P' + {2200, 25, 28, 27, 1, -25}, // 0x51 'Q' + {2288, 20, 26, 25, 3, -25}, // 0x52 'R' + {2353, 20, 26, 23, 1, -25}, // 0x53 'S' + {2418, 19, 26, 22, 1, -25}, // 0x54 'T' + {2480, 19, 26, 25, 3, -25}, // 0x55 'U' + {2542, 21, 26, 23, 1, -25}, // 0x56 'V' + {2611, 32, 26, 33, 0, -25}, // 0x57 'W' + {2715, 21, 26, 23, 1, -25}, // 0x58 'X' + {2784, 23, 26, 24, 0, -25}, // 0x59 'Y' + {2859, 19, 26, 22, 1, -25}, // 0x5A 'Z' + {2921, 6, 33, 10, 2, -25}, // 0x5B '[' + {2946, 10, 26, 10, 0, -25}, // 0x5C '\' + {2979, 6, 33, 10, 1, -25}, // 0x5D ']' + {3004, 13, 13, 16, 2, -24}, // 0x5E '^' + {3026, 21, 2, 19, -1, 5}, // 0x5F '_' + {3032, 7, 5, 9, 1, -25}, // 0x60 '`' + {3037, 17, 19, 19, 1, -18}, // 0x61 'a' + {3078, 16, 26, 20, 2, -25}, // 0x62 'b' + {3130, 16, 19, 18, 1, -18}, // 0x63 'c' + {3168, 17, 26, 20, 1, -25}, // 0x64 'd' + {3224, 16, 19, 19, 1, -18}, // 0x65 'e' + {3262, 7, 26, 10, 1, -25}, // 0x66 'f' + {3285, 16, 27, 19, 1, -18}, // 0x67 'g' + {3339, 15, 26, 19, 2, -25}, // 0x68 'h' + {3388, 3, 26, 8, 2, -25}, // 0x69 'i' + {3398, 6, 34, 9, 0, -25}, // 0x6A 'j' + {3424, 16, 26, 18, 2, -25}, // 0x6B 'k' + {3476, 3, 26, 7, 2, -25}, // 0x6C 'l' + {3486, 24, 19, 28, 2, -18}, // 0x6D 'm' + {3543, 15, 19, 19, 2, -18}, // 0x6E 'n' + {3579, 17, 19, 19, 1, -18}, // 0x6F 'o' + {3620, 16, 25, 20, 2, -18}, // 0x70 'p' + {3670, 17, 25, 20, 1, -18}, // 0x71 'q' + {3724, 9, 19, 12, 2, -18}, // 0x72 'r' + {3746, 14, 19, 17, 2, -18}, // 0x73 's' + {3780, 7, 23, 10, 1, -22}, // 0x74 't' + {3801, 15, 19, 19, 2, -18}, // 0x75 'u' + {3837, 17, 19, 17, 0, -18}, // 0x76 'v' + {3878, 25, 19, 25, 0, -18}, // 0x77 'w' + {3938, 16, 19, 17, 0, -18}, // 0x78 'x' + {3976, 17, 27, 17, 0, -18}, // 0x79 'y' + {4034, 15, 19, 17, 1, -18}, // 0x7A 'z' + {4070, 8, 33, 12, 1, -25}, // 0x7B '{' + {4103, 2, 33, 9, 3, -25}, // 0x7C '|' + {4112, 8, 33, 12, 3, -25}, // 0x7D '}' + {4145, 15, 7, 18, 1, -15}}; // 0x7E '~' + +const GFXfont FreeSans18pt7b PROGMEM = {(uint8_t *)FreeSans18pt7bBitmaps, + (GFXglyph *)FreeSans18pt7bGlyphs, 0x20, + 0x7E, 42}; + +// Approx. 4831 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h new file mode 100644 index 0000000..3559530 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h @@ -0,0 +1,729 @@ +#pragma once +#include + +const uint8_t FreeSans24pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66, + 0x66, 0x00, 0x0F, 0xFF, 0xFF, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, + 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x60, 0x00, 0x70, + 0x3C, 0x00, 0x70, 0x3C, 0x00, 0xF0, 0x38, 0x00, 0xF0, 0x38, 0x00, 0xF0, + 0x78, 0x00, 0xE0, 0x78, 0x00, 0xE0, 0x78, 0x01, 0xE0, 0x70, 0x01, 0xE0, + 0x70, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x03, 0xC0, + 0xE0, 0x03, 0xC0, 0xE0, 0x03, 0xC0, 0xE0, 0x03, 0x81, 0xE0, 0x03, 0x81, + 0xE0, 0x03, 0x81, 0xE0, 0x07, 0x81, 0xC0, 0x07, 0x81, 0xC0, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x0F, 0x03, 0x80, 0x0F, 0x03, + 0x80, 0x0F, 0x07, 0x80, 0x0E, 0x07, 0x80, 0x0E, 0x07, 0x80, 0x1E, 0x07, + 0x00, 0x1E, 0x07, 0x00, 0x1E, 0x07, 0x00, 0x1C, 0x0F, 0x00, 0x1C, 0x0F, + 0x00, 0x00, 0x38, 0x00, 0x01, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xFE, + 0x01, 0xFF, 0xFE, 0x07, 0xE7, 0x3E, 0x0F, 0x8E, 0x3C, 0x3E, 0x1C, 0x3C, + 0x78, 0x38, 0x38, 0xF0, 0x70, 0x71, 0xE0, 0xE0, 0xE3, 0xC1, 0xC0, 0x07, + 0x83, 0x80, 0x0F, 0x87, 0x00, 0x0F, 0x8E, 0x00, 0x1F, 0xDC, 0x00, 0x1F, + 0xF8, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x03, + 0xFF, 0x80, 0x07, 0x1F, 0x80, 0x0E, 0x1F, 0x00, 0x1C, 0x1F, 0x00, 0x38, + 0x1F, 0xC0, 0x70, 0x3F, 0x80, 0xE0, 0x7F, 0x81, 0xC0, 0xFF, 0x03, 0x81, + 0xEF, 0x07, 0x07, 0x9F, 0x0E, 0x0F, 0x3E, 0x1C, 0x3E, 0x3F, 0x39, 0xF8, + 0x3F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0x80, 0x00, + 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x1C, 0x00, 0x0F, 0xC0, 0x00, 0x78, 0x00, 0x3F, 0xE0, 0x00, + 0xE0, 0x01, 0xFF, 0xE0, 0x03, 0x80, 0x03, 0xFF, 0xE0, 0x07, 0x00, 0x0F, + 0x87, 0xC0, 0x1C, 0x00, 0x3C, 0x03, 0xC0, 0x38, 0x00, 0x70, 0x03, 0x80, + 0xE0, 0x00, 0xE0, 0x07, 0x03, 0xC0, 0x01, 0xC0, 0x0E, 0x07, 0x00, 0x03, + 0x80, 0x1C, 0x1E, 0x00, 0x07, 0x80, 0x78, 0x38, 0x00, 0x07, 0xC3, 0xE0, + 0xF0, 0x00, 0x07, 0xFF, 0xC1, 0xC0, 0x00, 0x0F, 0xFF, 0x07, 0x80, 0x00, + 0x0F, 0xFC, 0x0E, 0x00, 0x00, 0x07, 0xE0, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x3F, 0x00, 0x00, 0x03, 0x80, 0xFF, + 0x80, 0x00, 0x0E, 0x07, 0xFF, 0x80, 0x00, 0x3C, 0x0F, 0xFF, 0x80, 0x00, + 0x70, 0x3E, 0x1F, 0x00, 0x01, 0xE0, 0xF0, 0x0F, 0x00, 0x03, 0x81, 0xC0, + 0x0E, 0x00, 0x0F, 0x03, 0x80, 0x1C, 0x00, 0x1C, 0x07, 0x00, 0x38, 0x00, + 0x78, 0x0E, 0x00, 0x70, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x03, 0x80, 0x1F, + 0x0F, 0x80, 0x07, 0x00, 0x1F, 0xFF, 0x00, 0x1C, 0x00, 0x3F, 0xFC, 0x00, + 0x38, 0x00, 0x1F, 0xF0, 0x00, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, + 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xFC, 0x00, 0x07, + 0xC3, 0xC0, 0x00, 0xF8, 0x1E, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0xF0, 0x0E, + 0x00, 0x0F, 0x00, 0xE0, 0x00, 0xF0, 0x0E, 0x00, 0x07, 0x81, 0xE0, 0x00, + 0x7C, 0x3C, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0xE0, 0x00, + 0x1F, 0x1E, 0x07, 0x83, 0xE0, 0xF0, 0x78, 0x7C, 0x0F, 0x8F, 0x87, 0x80, + 0x7C, 0xF0, 0xF0, 0x03, 0xFF, 0x0F, 0x00, 0x1F, 0xE0, 0xF0, 0x00, 0xFE, + 0x0F, 0x00, 0x0F, 0xC0, 0xF0, 0x00, 0x7E, 0x0F, 0x80, 0x0F, 0xF0, 0x7C, + 0x01, 0xFF, 0x07, 0xF0, 0x7D, 0xF8, 0x3F, 0xFF, 0x8F, 0xC1, 0xFF, 0xF0, + 0x7E, 0x0F, 0xFE, 0x03, 0xE0, 0x3F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF6, 0x66, 0x01, 0xC0, 0x70, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0x78, + 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x70, 0x3C, + 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, + 0xC0, 0x70, 0x1E, 0x07, 0x81, 0xE0, 0x38, 0x0F, 0x03, 0xC0, 0x70, 0x1E, + 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x18, 0x07, 0xE0, 0x38, 0x07, + 0x01, 0xC0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0E, 0x03, 0x80, 0xF0, 0x1C, + 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x07, 0x81, 0xE0, 0x78, + 0x1E, 0x07, 0x03, 0xC0, 0xF0, 0x38, 0x1E, 0x07, 0x01, 0xC0, 0xE0, 0x38, + 0x1C, 0x06, 0x03, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x63, + 0x1B, 0xFF, 0xFF, 0xFF, 0xC3, 0xF0, 0x07, 0x80, 0x3F, 0x01, 0xCE, 0x07, + 0x3C, 0x38, 0x70, 0x21, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, + 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xF3, + 0x33, 0x36, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, + 0x00, 0x38, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x07, 0x00, 0x30, 0x03, 0x80, + 0x1C, 0x00, 0xC0, 0x06, 0x00, 0x70, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0E, + 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, 0x80, 0x0C, 0x00, 0xE0, 0x07, 0x00, + 0x30, 0x03, 0x80, 0x1C, 0x00, 0xC0, 0x06, 0x00, 0x70, 0x03, 0x80, 0x18, + 0x01, 0xC0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x38, 0x00, 0x00, 0xFC, 0x00, + 0x0F, 0xFC, 0x00, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x1F, 0x87, 0xE0, 0xF8, + 0x07, 0xC3, 0xC0, 0x0F, 0x1F, 0x00, 0x3E, 0x78, 0x00, 0x79, 0xE0, 0x01, + 0xE7, 0x80, 0x07, 0xBC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, + 0xDE, 0x00, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x01, 0xE7, 0xC0, 0x0F, 0x8F, + 0x00, 0x3C, 0x3E, 0x01, 0xF0, 0x7C, 0x1F, 0x81, 0xFF, 0xFE, 0x03, 0xFF, + 0xF0, 0x03, 0xFF, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x60, 0x1C, 0x03, 0x80, + 0xF0, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x3C, 0x07, 0x80, 0xF0, + 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, + 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x01, 0xFF, + 0xFE, 0x0F, 0xFF, 0xFC, 0x3F, 0x03, 0xF9, 0xF0, 0x03, 0xE7, 0x80, 0x07, + 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xC0, + 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, + 0x7C, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0xC0, + 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, + 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, + 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, + 0xF0, 0x1F, 0x87, 0xC0, 0x1F, 0x1F, 0x00, 0x1F, 0x3C, 0x00, 0x1E, 0x78, + 0x00, 0x3C, 0xF0, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0x80, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0x7F, + 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x03, + 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x1F, + 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xE7, 0xC0, 0x07, 0xC7, + 0xE0, 0x3F, 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x03, + 0xFC, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x3F, + 0xE0, 0x00, 0x7B, 0xC0, 0x01, 0xE7, 0x80, 0x07, 0x8F, 0x00, 0x0F, 0x1E, + 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0x78, 0x03, 0xC0, 0xF0, 0x07, 0x81, 0xE0, + 0x1E, 0x03, 0xC0, 0x78, 0x07, 0x81, 0xE0, 0x0F, 0x03, 0xC0, 0x1E, 0x0F, + 0x00, 0x3C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x1F, 0xFF, 0xF0, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0x3F, 0x80, 0x7B, 0xFF, + 0x81, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x1F, 0x80, 0xFC, 0x78, 0x01, 0xF8, + 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x7C, 0x00, 0xF1, 0xFC, 0x0F, 0xC3, + 0xFF, 0xFE, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x7F, 0xFC, 0x03, 0xFF, 0xF8, 0x1F, 0x83, + 0xF0, 0xF8, 0x07, 0xC3, 0xC0, 0x0F, 0x8F, 0x00, 0x1E, 0x78, 0x00, 0x79, + 0xE0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0xFE, 0x03, 0xCF, + 0xFE, 0x0F, 0x7F, 0xFE, 0x3F, 0xFF, 0xFC, 0xFF, 0x03, 0xF3, 0xF0, 0x03, + 0xEF, 0x80, 0x07, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x70, 0x00, 0x3D, 0xC0, 0x00, 0xF7, 0x80, + 0x07, 0x9F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0xFC, 0x0F, 0xC1, 0xFF, 0xFE, + 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0x00, 0x00, + 0x78, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, + 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, + 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, + 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x3F, + 0x03, 0xF1, 0xF0, 0x03, 0xC7, 0xC0, 0x0F, 0x9E, 0x00, 0x1E, 0x78, 0x00, + 0x79, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0x8F, 0x00, 0x3C, 0x3F, 0x03, 0xF0, + 0x7F, 0xFF, 0x80, 0x7F, 0xF8, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0xFC, + 0x0F, 0xC7, 0xC0, 0x0F, 0x9E, 0x00, 0x1E, 0xF8, 0x00, 0x7F, 0xC0, 0x00, + 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x80, 0x07, 0xDE, 0x00, 0x1E, 0x7C, 0x00, 0xF8, 0xFC, 0x0F, 0xC3, 0xFF, + 0xFF, 0x07, 0xFF, 0xF8, 0x07, 0xFF, 0x80, 0x07, 0xF8, 0x00, 0x01, 0xFC, + 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xF0, 0x7E, 0x3E, + 0x00, 0xF1, 0xE0, 0x07, 0xCF, 0x00, 0x1E, 0xF0, 0x00, 0x77, 0x80, 0x03, + 0xBC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0, + 0x03, 0xEF, 0x00, 0x1F, 0x7C, 0x01, 0xF9, 0xF8, 0x3F, 0xCF, 0xFF, 0xFE, + 0x3F, 0xFE, 0xF0, 0xFF, 0xE7, 0x80, 0xFC, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x9E, 0x00, 0x3C, 0xF0, 0x03, 0xC7, + 0xC0, 0x3E, 0x1F, 0x03, 0xE0, 0xFF, 0xFE, 0x03, 0xFF, 0xE0, 0x0F, 0xFE, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF3, 0x33, 0x36, 0xEC, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xC0, + 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, + 0x80, 0x03, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xF0, + 0x00, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, + 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xC0, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x3F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, + 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, + 0x0F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7E, 0x0F, 0xE7, 0x80, + 0x3E, 0x78, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, + 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, + 0x00, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFC, 0x03, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7E, + 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xF0, 0x07, 0xC0, 0x00, + 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x3C, 0x00, 0x7E, 0x00, + 0x3E, 0x0F, 0x00, 0x3F, 0xE3, 0xC3, 0xE3, 0xE0, 0x1F, 0xFE, 0x78, 0x3C, + 0x78, 0x07, 0xE1, 0xFF, 0x07, 0xDF, 0x01, 0xF0, 0x1F, 0xC0, 0xFB, 0xC0, + 0x7C, 0x01, 0xF8, 0x0F, 0x78, 0x0F, 0x00, 0x3F, 0x01, 0xEF, 0x03, 0xC0, + 0x07, 0xC0, 0x3F, 0xC0, 0x78, 0x00, 0xF8, 0x07, 0xF8, 0x0F, 0x00, 0x1F, + 0x00, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x1F, 0xE0, 0x78, 0x00, 0x78, 0x07, + 0xFC, 0x0F, 0x00, 0x1F, 0x00, 0xF7, 0x81, 0xE0, 0x03, 0xC0, 0x1E, 0xF0, + 0x3C, 0x00, 0x78, 0x07, 0x9E, 0x07, 0x80, 0x1F, 0x01, 0xF3, 0xE0, 0xF8, + 0x07, 0xC0, 0x3C, 0x3C, 0x0F, 0x81, 0xF8, 0x0F, 0x87, 0x81, 0xF8, 0x7F, + 0x87, 0xE0, 0xF8, 0x1F, 0xFE, 0xFF, 0xF8, 0x0F, 0x01, 0xFF, 0x1F, 0xFC, + 0x01, 0xF0, 0x0F, 0x80, 0xFE, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, + 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, + 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xF7, 0xC0, 0x00, 0x03, + 0xDF, 0x00, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x78, 0xF8, 0x00, 0x01, 0xE3, + 0xE0, 0x00, 0x0F, 0x87, 0x80, 0x00, 0x3C, 0x1F, 0x00, 0x01, 0xF0, 0x7C, + 0x00, 0x07, 0x80, 0xF0, 0x00, 0x1E, 0x03, 0xE0, 0x00, 0xF8, 0x0F, 0x80, + 0x03, 0xC0, 0x1E, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x7C, 0x01, 0xF0, 0x01, + 0xE0, 0x03, 0xC0, 0x07, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFE, 0x00, 0xFF, + 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x07, 0xC0, 0x78, 0x00, + 0x0F, 0x83, 0xE0, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0xF8, 0x3C, 0x00, 0x01, + 0xF1, 0xF0, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x3E, + 0xF8, 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x01, 0xE0, 0xFF, 0xFF, 0x80, 0x7F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x0F, 0x00, 0x0F, 0xC7, + 0x80, 0x01, 0xE3, 0xC0, 0x00, 0xF9, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1E, + 0x78, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x9E, 0x00, 0x07, 0x8F, 0x00, 0x03, + 0xC7, 0x80, 0x07, 0xC3, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, + 0xF8, 0x7F, 0xFF, 0xFE, 0x3C, 0x00, 0x0F, 0x9E, 0x00, 0x03, 0xEF, 0x00, + 0x00, 0xF7, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, + 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFF, + 0x00, 0x01, 0xF7, 0x80, 0x01, 0xFB, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8, + 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, + 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0xFE, 0x01, + 0xF8, 0x07, 0xC0, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x3C, + 0x3C, 0x00, 0x01, 0xE3, 0xE0, 0x00, 0x07, 0x9E, 0x00, 0x00, 0x3C, 0xF0, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x78, 0x00, + 0x00, 0x7B, 0xC0, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x3C, 0x78, 0x00, 0x01, + 0xE3, 0xE0, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x81, + 0xFE, 0x03, 0xF8, 0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xF8, 0x00, 0x3F, + 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, + 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFE, 0x0F, 0x00, 0x0F, 0xE1, 0xE0, + 0x00, 0x7E, 0x3C, 0x00, 0x07, 0xE7, 0x80, 0x00, 0x7C, 0xF0, 0x00, 0x07, + 0xDE, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x0F, 0x78, 0x00, 0x01, 0xEF, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, + 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xF7, + 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x03, 0xDE, 0x00, 0x00, 0xFB, 0xC0, 0x00, + 0x3E, 0x78, 0x00, 0x0F, 0xCF, 0x00, 0x03, 0xF1, 0xE0, 0x01, 0xFC, 0x3F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, + 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFE, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0xFE, + 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0x80, 0x7F, + 0x01, 0xF8, 0x00, 0x3F, 0x07, 0xE0, 0x00, 0x1F, 0x0F, 0x80, 0x00, 0x1E, + 0x3E, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x3D, 0xF0, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0x00, + 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x07, 0xBC, 0x00, + 0x00, 0x0F, 0x78, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x7D, 0xF0, 0x00, + 0x00, 0xF9, 0xF0, 0x00, 0x03, 0xF3, 0xF0, 0x00, 0x07, 0xE3, 0xF0, 0x00, + 0x1F, 0xC3, 0xF0, 0x00, 0xFF, 0x83, 0xFC, 0x07, 0xEF, 0x03, 0xFF, 0xFF, + 0x9E, 0x03, 0xFF, 0xFE, 0x1C, 0x01, 0xFF, 0xF0, 0x38, 0x00, 0x7F, 0x80, + 0x00, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, + 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, + 0x03, 0xC0, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, + 0x07, 0xF8, 0x01, 0xFF, 0x80, 0x3E, 0xF0, 0x0F, 0x9F, 0x83, 0xF1, 0xFF, + 0xFC, 0x3F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x07, + 0xDE, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0x7C, 0x78, 0x00, 0x1F, 0x0F, 0x00, + 0x07, 0xC1, 0xE0, 0x01, 0xF0, 0x3C, 0x00, 0x7C, 0x07, 0x80, 0x1F, 0x00, + 0xF0, 0x07, 0xC0, 0x1E, 0x01, 0xF0, 0x03, 0xC0, 0x7C, 0x00, 0x78, 0x1F, + 0x00, 0x0F, 0x07, 0xC0, 0x01, 0xE1, 0xF0, 0x00, 0x3C, 0x7E, 0x00, 0x07, + 0x9F, 0xE0, 0x00, 0xF7, 0xFE, 0x00, 0x1F, 0xF7, 0xC0, 0x03, 0xFC, 0x7C, + 0x00, 0x7F, 0x07, 0xC0, 0x0F, 0xC0, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x3C, + 0x00, 0xF8, 0x07, 0x80, 0x1F, 0x80, 0xF0, 0x01, 0xF0, 0x1E, 0x00, 0x1F, + 0x03, 0xC0, 0x03, 0xF0, 0x78, 0x00, 0x3E, 0x0F, 0x00, 0x03, 0xE1, 0xE0, + 0x00, 0x3E, 0x3C, 0x00, 0x07, 0xC7, 0x80, 0x00, 0x7C, 0xF0, 0x00, 0x07, + 0xDE, 0x00, 0x00, 0xFC, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFC, 0x00, + 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0xFF, 0xF7, 0x00, 0x00, 0xEF, 0xF7, 0x80, 0x01, 0xEF, 0xF7, 0x80, + 0x01, 0xEF, 0xF3, 0xC0, 0x01, 0xCF, 0xF3, 0xC0, 0x03, 0xCF, 0xF3, 0xC0, + 0x03, 0xCF, 0xF1, 0xE0, 0x03, 0x8F, 0xF1, 0xE0, 0x07, 0x8F, 0xF1, 0xE0, + 0x07, 0x8F, 0xF0, 0xF0, 0x0F, 0x0F, 0xF0, 0xF0, 0x0F, 0x0F, 0xF0, 0xF0, + 0x0F, 0x0F, 0xF0, 0x78, 0x1E, 0x0F, 0xF0, 0x78, 0x1E, 0x0F, 0xF0, 0x78, + 0x1E, 0x0F, 0xF0, 0x3C, 0x3C, 0x0F, 0xF0, 0x3C, 0x3C, 0x0F, 0xF0, 0x3C, + 0x3C, 0x0F, 0xF0, 0x1E, 0x78, 0x0F, 0xF0, 0x1E, 0x78, 0x0F, 0xF0, 0x0E, + 0x78, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x07, + 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x03, + 0xE0, 0x0F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3F, + 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, + 0x3F, 0xDE, 0x00, 0x0F, 0xF7, 0xC0, 0x03, 0xFC, 0xF8, 0x00, 0xFF, 0x1E, + 0x00, 0x3F, 0xC7, 0xC0, 0x0F, 0xF0, 0xF0, 0x03, 0xFC, 0x3E, 0x00, 0xFF, + 0x07, 0xC0, 0x3F, 0xC0, 0xF0, 0x0F, 0xF0, 0x3E, 0x03, 0xFC, 0x07, 0xC0, + 0xFF, 0x00, 0xF0, 0x3F, 0xC0, 0x3E, 0x0F, 0xF0, 0x07, 0x83, 0xFC, 0x01, + 0xF0, 0xFF, 0x00, 0x3E, 0x3F, 0xC0, 0x07, 0x8F, 0xF0, 0x01, 0xF3, 0xFC, + 0x00, 0x3E, 0xFF, 0x00, 0x07, 0xBF, 0xC0, 0x01, 0xFF, 0xF0, 0x00, 0x3F, + 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, + 0x80, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0x80, + 0xFF, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x03, 0xF0, 0x3E, 0x00, + 0x00, 0xF8, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x0F, 0x1F, 0x00, + 0x00, 0x07, 0xCF, 0x00, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x00, 0xF7, 0xC0, + 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x00, 0x3E, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x0F, + 0x3E, 0x00, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0x07, 0x87, 0xC0, 0x00, 0x07, + 0xC1, 0xF0, 0x00, 0x07, 0xC0, 0xFC, 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x07, + 0xE0, 0x0F, 0xF0, 0x1F, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, + 0xFE, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0xFE, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, + 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0xFF, + 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x03, 0xF0, 0x3E, 0x00, 0x00, + 0xF8, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x0F, 0x1F, 0x00, 0x00, + 0x07, 0xCF, 0x00, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x00, 0xF7, 0xC0, 0x00, + 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, + 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x00, 0x3E, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x0F, 0x3E, + 0x00, 0x00, 0x0F, 0x8F, 0x00, 0x03, 0x87, 0x87, 0xC0, 0x03, 0xE7, 0xC1, + 0xF0, 0x00, 0xFF, 0xC0, 0xFC, 0x00, 0x3F, 0xE0, 0x3F, 0x00, 0x0F, 0xE0, + 0x0F, 0xF0, 0x1F, 0xF0, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xC7, 0xC0, 0x01, 0xFF, 0x01, 0xE0, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xF0, 0x00, 0x3F, 0x3C, 0x00, 0x07, + 0xCF, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xBC, 0x00, + 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xBC, + 0x00, 0x03, 0xCF, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0xF8, 0xFF, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xF0, 0x00, + 0x3F, 0x3C, 0x00, 0x03, 0xCF, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x1E, 0xF0, + 0x00, 0x07, 0xBC, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x1E, + 0xF0, 0x00, 0x07, 0xBC, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, + 0x1E, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x7F, 0xC0, 0x00, + 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x81, 0xF8, 0x07, + 0xF0, 0x7C, 0x00, 0x1F, 0x0F, 0x00, 0x01, 0xE3, 0xE0, 0x00, 0x3E, 0x78, + 0x00, 0x03, 0xCF, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x07, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, + 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xFF, 0xF8, + 0x00, 0x03, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x3E, 0xF8, 0x00, + 0x07, 0x9F, 0x80, 0x01, 0xF1, 0xFE, 0x01, 0xFC, 0x1F, 0xFF, 0xFF, 0x01, + 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, + 0x00, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x7D, 0xE0, 0x00, 0x1E, 0x7C, 0x00, 0x0F, 0x9F, + 0x80, 0x07, 0xE3, 0xF8, 0x07, 0xF0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, + 0x00, 0xFF, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0xF7, 0xC0, + 0x00, 0x0F, 0x9E, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x03, 0xC7, 0xC0, 0x00, + 0x3E, 0x1E, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0xF8, + 0x1E, 0x00, 0x07, 0xC0, 0xF8, 0x00, 0x3C, 0x07, 0xC0, 0x03, 0xE0, 0x1E, + 0x00, 0x1F, 0x00, 0xF8, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x80, 0x1E, 0x00, + 0x7C, 0x00, 0xF8, 0x03, 0xC0, 0x03, 0xC0, 0x1E, 0x00, 0x1F, 0x01, 0xF0, + 0x00, 0xF8, 0x0F, 0x00, 0x03, 0xC0, 0x78, 0x00, 0x1F, 0x07, 0x80, 0x00, + 0xF8, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x78, + 0xF0, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x7B, 0xC0, + 0x00, 0x03, 0xDE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, + 0x00, 0x3F, 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0x80, 0x03, + 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFC, 0x00, 0x1E, 0x7C, 0x00, 0x7F, 0x80, + 0x0F, 0x9F, 0x00, 0x1F, 0xE0, 0x03, 0xE7, 0xC0, 0x07, 0xF8, 0x00, 0xF8, + 0xF0, 0x01, 0xFF, 0x00, 0x3C, 0x3E, 0x00, 0xF3, 0xC0, 0x1F, 0x0F, 0x80, + 0x3C, 0xF0, 0x07, 0xC3, 0xE0, 0x0F, 0x3C, 0x01, 0xF0, 0x78, 0x07, 0xC7, + 0x80, 0x78, 0x1F, 0x01, 0xE1, 0xE0, 0x1E, 0x07, 0xC0, 0x78, 0x78, 0x0F, + 0x80, 0xF0, 0x1E, 0x1E, 0x03, 0xE0, 0x3C, 0x0F, 0x83, 0xC0, 0xF0, 0x0F, + 0x83, 0xC0, 0xF0, 0x3C, 0x03, 0xE0, 0xF0, 0x3C, 0x1F, 0x00, 0x78, 0x3C, + 0x0F, 0x87, 0xC0, 0x1E, 0x1E, 0x01, 0xE1, 0xE0, 0x07, 0x87, 0x80, 0x78, + 0x78, 0x01, 0xF1, 0xE0, 0x1E, 0x1E, 0x00, 0x3C, 0xF8, 0x03, 0xCF, 0x80, + 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x3C, 0xF0, 0x00, 0xFB, + 0xC0, 0x0F, 0xBC, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x07, 0xF8, 0x00, + 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xF8, + 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x00, + 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x01, 0xF3, 0xF0, 0x00, 0x1F, 0x8F, 0x80, 0x00, 0xF8, 0x3E, 0x00, 0x0F, + 0x80, 0xF8, 0x00, 0xF8, 0x07, 0xC0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00, + 0x7C, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x3E, + 0x3E, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x1F, 0xF0, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x07, + 0xDF, 0x00, 0x00, 0x7C, 0x78, 0x00, 0x03, 0xE3, 0xE0, 0x00, 0x3E, 0x0F, + 0x80, 0x03, 0xE0, 0x3E, 0x00, 0x1F, 0x01, 0xF0, 0x01, 0xF0, 0x07, 0xC0, + 0x1F, 0x00, 0x3F, 0x00, 0xF8, 0x00, 0xF8, 0x0F, 0x80, 0x03, 0xE0, 0xF8, + 0x00, 0x1F, 0x8F, 0xC0, 0x00, 0x7C, 0x7C, 0x00, 0x01, 0xF7, 0xC0, 0x00, + 0x0F, 0xC0, 0xFC, 0x00, 0x00, 0xFD, 0xF0, 0x00, 0x03, 0xE7, 0xE0, 0x00, + 0x1F, 0x0F, 0x80, 0x00, 0x7C, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x1F, + 0x00, 0xF8, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, + 0x0F, 0x80, 0x7C, 0x00, 0x1E, 0x01, 0xE0, 0x00, 0x7C, 0x0F, 0x80, 0x00, + 0xF8, 0x7C, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x0F, + 0x3C, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3F, 0xFF, + 0xFF, 0xC7, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xE0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x07, 0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x18, 0x00, 0xE0, + 0x07, 0x00, 0x18, 0x00, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xC0, 0x07, 0x00, + 0x38, 0x00, 0xC0, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x38, 0x01, + 0xC0, 0x06, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x30, 0x01, 0xC0, 0x0E, + 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0xFF, 0xFF, + 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3F, + 0x00, 0x0F, 0xC0, 0x07, 0xF8, 0x01, 0xCE, 0x00, 0x73, 0x80, 0x3C, 0x70, + 0x0E, 0x1C, 0x07, 0x87, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x38, 0x07, 0x0E, + 0x01, 0xC7, 0x80, 0x79, 0xC0, 0x0E, 0x70, 0x03, 0xB8, 0x00, 0x70, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x01, 0xE0, 0x3C, 0x07, + 0x00, 0xE0, 0x1C, 0x01, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, 0x7E, 0x03, 0xF8, 0x7C, 0x00, 0xF8, 0x78, 0x00, 0x78, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, + 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0xF8, 0x3F, 0xFE, 0x78, + 0x7F, 0x80, 0x78, 0xFC, 0x00, 0x78, 0xF8, 0x00, 0x78, 0xF0, 0x00, 0x78, + 0xF0, 0x00, 0xF8, 0xF0, 0x00, 0xF8, 0xF8, 0x03, 0xF8, 0x7E, 0x0F, 0xF8, + 0x7F, 0xFF, 0x7F, 0x3F, 0xFE, 0x3F, 0x1F, 0xFC, 0x3F, 0x07, 0xE0, 0x1F, + 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, + 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x7E, + 0x03, 0xC7, 0xFE, 0x0F, 0x7F, 0xFC, 0x3D, 0xFF, 0xF8, 0xFF, 0x07, 0xF3, + 0xF8, 0x07, 0xCF, 0xC0, 0x0F, 0xBE, 0x00, 0x1E, 0xF8, 0x00, 0x7B, 0xE0, + 0x01, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFF, + 0x80, 0x07, 0xBE, 0x00, 0x1E, 0xFC, 0x00, 0xFB, 0xF8, 0x07, 0xCF, 0xF0, + 0x7F, 0x3B, 0xFF, 0xF8, 0xE7, 0xFF, 0xC3, 0x8F, 0xFE, 0x00, 0x0F, 0xE0, + 0x00, 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, 0xFF, 0xC3, + 0xF0, 0x3F, 0x1F, 0x00, 0xF9, 0xF0, 0x03, 0xCF, 0x00, 0x0F, 0x78, 0x00, + 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x1E, 0x00, 0x1E, 0xF0, 0x00, 0xF7, 0xC0, 0x0F, 0x9F, 0x00, 0xF8, 0xFC, + 0x0F, 0xC3, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x3F, 0xFC, 0x00, 0x7F, 0x00, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, + 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x01, + 0xFC, 0x1E, 0x0F, 0xFE, 0x3C, 0x3F, 0xFF, 0x78, 0xFF, 0xFF, 0xF3, 0xF8, + 0x3F, 0xE7, 0xC0, 0x1F, 0xDF, 0x00, 0x1F, 0xBE, 0x00, 0x1F, 0x78, 0x00, + 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, + 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, + 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0xC0, 0x07, 0xE7, + 0xC0, 0x1F, 0xCF, 0xE0, 0xFF, 0x8F, 0xFF, 0xF7, 0x0F, 0xFF, 0xCE, 0x0F, + 0xFF, 0x1C, 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0xFF, + 0xFC, 0x07, 0xFF, 0xF8, 0x1F, 0x83, 0xF0, 0xF8, 0x07, 0xC7, 0xC0, 0x0F, + 0x9E, 0x00, 0x1E, 0x78, 0x00, 0x7B, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x1E, + 0x7C, 0x00, 0x78, 0xF8, 0x03, 0xE3, 0xF0, 0x3F, 0x07, 0xFF, 0xF8, 0x0F, + 0xFF, 0xE0, 0x1F, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xC3, 0xF0, 0xFC, + 0x7F, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x3F, 0xFF, 0xFF, 0xFF, 0x1E, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, + 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, + 0x1E, 0x07, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0xF8, 0xF0, 0xFF, 0xFB, 0xC7, + 0xFF, 0xFF, 0x3F, 0x83, 0xFC, 0xF8, 0x07, 0xF7, 0xC0, 0x0F, 0xDE, 0x00, + 0x1F, 0x78, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, + 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, + 0x00, 0x3F, 0xC0, 0x00, 0xF7, 0x80, 0x07, 0xDE, 0x00, 0x1F, 0x7C, 0x00, + 0xFC, 0xF8, 0x07, 0xF3, 0xF8, 0x3F, 0xC7, 0xFF, 0xEF, 0x0F, 0xFF, 0x3C, + 0x1F, 0xF8, 0xF0, 0x1F, 0x83, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x79, 0xE0, + 0x01, 0xE7, 0xC0, 0x0F, 0x8F, 0x80, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, + 0x80, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, + 0x00, 0xF0, 0xFE, 0x1E, 0x3F, 0xE3, 0xCF, 0xFF, 0x7B, 0xFF, 0xEF, 0xF0, + 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x7F, 0xC0, 0x0F, 0xF8, 0x01, 0xFE, 0x00, + 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, + 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, + 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, + 0xFE, 0x00, 0x3C, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, + 0xFF, 0xFE, 0xFE, 0xF8, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x1F, 0x3C, 0x01, 0xF1, 0xE0, 0x1F, 0x0F, + 0x01, 0xF0, 0x78, 0x1F, 0x03, 0xC1, 0xF0, 0x1E, 0x1F, 0x00, 0xF1, 0xF0, + 0x07, 0x9F, 0x00, 0x3D, 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x7F, + 0x7C, 0x03, 0xF1, 0xF0, 0x1F, 0x07, 0xC0, 0xF0, 0x3E, 0x07, 0x80, 0xF8, + 0x3C, 0x03, 0xC1, 0xE0, 0x1F, 0x0F, 0x00, 0x7C, 0x78, 0x03, 0xE3, 0xC0, + 0x0F, 0x9E, 0x00, 0x3C, 0xF0, 0x01, 0xF7, 0x80, 0x07, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x03, 0xF0, 0xE3, 0xFE, 0x0F, 0xFC, 0xE7, + 0xFF, 0x1F, 0xFE, 0xEF, 0xFF, 0xBF, 0xFE, 0xFE, 0x0F, 0xF8, 0x3F, 0xFC, + 0x07, 0xF0, 0x1F, 0xF8, 0x03, 0xE0, 0x0F, 0xF8, 0x03, 0xE0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0x00, + 0x7E, 0x0E, 0x1F, 0xF8, 0xE7, 0xFF, 0xCE, 0xFF, 0xFE, 0xEF, 0x07, 0xFF, + 0xE0, 0x1F, 0xFC, 0x01, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x00, 0x0F, + 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, + 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0xFE, 0x00, 0x07, 0xFF, 0x00, 0x3F, 0xFF, + 0x80, 0xFF, 0xFF, 0x83, 0xF8, 0x3F, 0x87, 0xC0, 0x1F, 0x1F, 0x00, 0x1F, + 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, + 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, + 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xF3, 0xC0, + 0x01, 0xE7, 0xC0, 0x07, 0xC7, 0xC0, 0x1F, 0x0F, 0xE0, 0xFE, 0x0F, 0xFF, + 0xF8, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x00, 0xFE, + 0x03, 0x8F, 0xFE, 0x0E, 0x7F, 0xFC, 0x3B, 0xFF, 0xF8, 0xFF, 0x87, 0xF3, + 0xF8, 0x07, 0xCF, 0xC0, 0x0F, 0xBE, 0x00, 0x1E, 0xF8, 0x00, 0x7B, 0xE0, + 0x01, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFF, + 0x80, 0x07, 0xBE, 0x00, 0x1E, 0xFC, 0x00, 0xFB, 0xF8, 0x07, 0xCF, 0xF0, + 0x7F, 0x3F, 0xFF, 0xF8, 0xF7, 0xFF, 0xC3, 0xC7, 0xFE, 0x0F, 0x07, 0xE0, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0x00, 0x07, 0xFF, 0x1C, 0x3F, 0xFF, 0x38, 0xFF, 0xFF, 0x73, 0xF8, + 0x3F, 0xE7, 0xC0, 0x1F, 0xDF, 0x00, 0x1F, 0xBE, 0x00, 0x1F, 0x78, 0x00, + 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, + 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, + 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0xC0, 0x07, 0xE7, + 0xC0, 0x1F, 0xCF, 0xE0, 0xFF, 0x8F, 0xFF, 0xEF, 0x0F, 0xFF, 0xDE, 0x0F, + 0xFE, 0x3C, 0x07, 0xF0, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x78, 0x00, 0xFE, 0x1F, 0xE7, 0xFE, 0xFF, 0xFF, 0x8F, + 0xC0, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x01, 0xFC, 0x00, 0xFF, 0xF0, + 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3E, 0x07, 0xE7, 0xC0, 0x3E, 0x78, 0x01, + 0xE7, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xFC, + 0x00, 0x1F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x03, 0xFE, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, + 0x80, 0x1F, 0x7E, 0x07, 0xE7, 0xFF, 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xF0, + 0x03, 0xFC, 0x00, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x8F, 0xFF, + 0xFF, 0xFF, 0xC7, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, + 0xE0, 0x78, 0x1F, 0xC7, 0xF0, 0xFC, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, + 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, + 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x3F, 0xF8, 0x07, 0xFF, + 0xE0, 0xFF, 0x7F, 0xFF, 0x77, 0xFF, 0xE7, 0x1F, 0xFC, 0x70, 0x7E, 0x00, + 0x78, 0x00, 0x3E, 0xF0, 0x00, 0x79, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xE3, + 0xC0, 0x07, 0x87, 0xC0, 0x0F, 0x07, 0x80, 0x3C, 0x0F, 0x00, 0x78, 0x1F, + 0x01, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x07, 0x80, 0x7C, 0x1F, 0x00, 0x78, + 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xF1, 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, + 0x80, 0x03, 0xDE, 0x00, 0x07, 0xBC, 0x00, 0x0F, 0x70, 0x00, 0x0F, 0xE0, + 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, + 0xF8, 0x03, 0xE0, 0x07, 0x9E, 0x00, 0xFC, 0x01, 0xE7, 0x80, 0x3F, 0x00, + 0x79, 0xF0, 0x0F, 0xC0, 0x3E, 0x3C, 0x07, 0xF0, 0x0F, 0x0F, 0x01, 0xFE, + 0x03, 0xC3, 0xC0, 0x7F, 0x80, 0xF0, 0x78, 0x1D, 0xE0, 0x78, 0x1E, 0x0F, + 0x38, 0x1E, 0x07, 0x83, 0xCF, 0x07, 0x81, 0xE0, 0xF3, 0xC1, 0xE0, 0x3C, + 0x38, 0xF0, 0xF0, 0x0F, 0x1E, 0x1C, 0x3C, 0x03, 0xC7, 0x87, 0x8F, 0x00, + 0x71, 0xE1, 0xE3, 0x80, 0x1E, 0x70, 0x79, 0xE0, 0x07, 0xBC, 0x0E, 0x78, + 0x01, 0xEF, 0x03, 0xDE, 0x00, 0x3B, 0xC0, 0xF7, 0x00, 0x0F, 0xE0, 0x3F, + 0xC0, 0x03, 0xF8, 0x07, 0xF0, 0x00, 0x7E, 0x01, 0xF8, 0x00, 0x1F, 0x80, + 0x7E, 0x00, 0x07, 0xC0, 0x1F, 0x80, 0x01, 0xF0, 0x03, 0xC0, 0x00, 0x7C, + 0x00, 0x78, 0xF0, 0x03, 0xE1, 0xE0, 0x0F, 0x07, 0xC0, 0x78, 0x0F, 0x03, + 0xE0, 0x1E, 0x0F, 0x00, 0x7C, 0x78, 0x00, 0xF3, 0xE0, 0x01, 0xEF, 0x00, + 0x07, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x03, + 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xC0, 0x03, 0xCF, 0x00, 0x0F, 0x1E, + 0x00, 0x78, 0x7C, 0x03, 0xE0, 0xF0, 0x0F, 0x03, 0xE0, 0x78, 0x07, 0xC3, + 0xE0, 0x0F, 0x1F, 0x00, 0x3E, 0x78, 0x00, 0x7C, 0x78, 0x00, 0x3D, 0xE0, + 0x01, 0xF7, 0x80, 0x07, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0xF0, 0xF0, 0x03, + 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x78, 0x1E, 0x01, 0xE0, 0x3C, 0x07, 0x80, + 0xF0, 0x3C, 0x03, 0xC0, 0xF0, 0x07, 0x87, 0xC0, 0x1E, 0x1E, 0x00, 0x78, + 0x78, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x0F, 0x3C, 0x00, 0x1F, 0xE0, + 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, + 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x01, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3E, 0x00, 0x0F, 0xF0, 0x00, + 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xF7, + 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x01, 0xE0, 0x00, 0x3E, + 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, + 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, + 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0x7C, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xE0, 0xFC, 0x1F, 0x87, 0x80, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, + 0xC0, 0x78, 0x1E, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0xC0, 0x3C, 0x03, 0x80, + 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, + 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0xFC, 0x1F, 0x80, + 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x1F, 0x83, 0xF0, 0x0F, 0x00, + 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0xC0, 0x3E, 0x03, + 0xC0, 0x78, 0x1F, 0x07, 0x80, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0x70, 0x1E, 0x1F, 0x83, 0xF0, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0xF0, 0x0D, + 0xFF, 0x01, 0xF0, 0xF8, 0x7C, 0x0F, 0xFD, 0x80, 0x7F, 0x80, 0x03, 0xE0}; + +const GFXglyph FreeSans24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 12, 0, 1}, // 0x20 ' ' + {0, 4, 34, 16, 6, -33}, // 0x21 '!' + {17, 11, 12, 16, 2, -32}, // 0x22 '"' + {34, 24, 33, 26, 1, -31}, // 0x23 '#' + {133, 23, 41, 26, 1, -34}, // 0x24 '$' + {251, 39, 34, 42, 1, -32}, // 0x25 '%' + {417, 28, 34, 31, 2, -32}, // 0x26 '&' + {536, 4, 12, 9, 2, -32}, // 0x27 ''' + {542, 10, 44, 16, 3, -33}, // 0x28 '(' + {597, 10, 44, 16, 2, -33}, // 0x29 ')' + {652, 14, 14, 18, 2, -33}, // 0x2A '*' + {677, 23, 22, 27, 2, -21}, // 0x2B '+' + {741, 4, 12, 13, 4, -4}, // 0x2C ',' + {747, 11, 4, 16, 2, -14}, // 0x2D '-' + {753, 4, 5, 12, 4, -4}, // 0x2E '.' + {756, 13, 35, 13, 0, -33}, // 0x2F '/' + {813, 22, 34, 26, 2, -32}, // 0x30 '0' + {907, 11, 33, 26, 5, -32}, // 0x31 '1' + {953, 22, 33, 26, 2, -32}, // 0x32 '2' + {1044, 23, 34, 26, 1, -32}, // 0x33 '3' + {1142, 23, 33, 26, 1, -32}, // 0x34 '4' + {1237, 22, 34, 26, 2, -32}, // 0x35 '5' + {1331, 22, 34, 26, 2, -32}, // 0x36 '6' + {1425, 21, 33, 26, 2, -32}, // 0x37 '7' + {1512, 22, 34, 26, 2, -32}, // 0x38 '8' + {1606, 21, 34, 26, 2, -32}, // 0x39 '9' + {1696, 4, 25, 12, 4, -24}, // 0x3A ':' + {1709, 4, 32, 12, 4, -24}, // 0x3B ';' + {1725, 23, 23, 27, 2, -22}, // 0x3C '<' + {1792, 23, 12, 27, 2, -16}, // 0x3D '=' + {1827, 23, 23, 27, 2, -22}, // 0x3E '>' + {1894, 20, 35, 26, 4, -34}, // 0x3F '?' + {1982, 43, 42, 48, 2, -34}, // 0x40 '@' + {2208, 30, 34, 31, 1, -33}, // 0x41 'A' + {2336, 25, 34, 31, 4, -33}, // 0x42 'B' + {2443, 29, 36, 33, 2, -34}, // 0x43 'C' + {2574, 27, 34, 33, 4, -33}, // 0x44 'D' + {2689, 24, 34, 30, 4, -33}, // 0x45 'E' + {2791, 22, 34, 28, 4, -33}, // 0x46 'F' + {2885, 31, 36, 36, 2, -34}, // 0x47 'G' + {3025, 26, 34, 34, 4, -33}, // 0x48 'H' + {3136, 4, 34, 13, 5, -33}, // 0x49 'I' + {3153, 19, 35, 25, 2, -33}, // 0x4A 'J' + {3237, 27, 34, 32, 4, -33}, // 0x4B 'K' + {3352, 21, 34, 26, 4, -33}, // 0x4C 'L' + {3442, 32, 34, 40, 4, -33}, // 0x4D 'M' + {3578, 26, 34, 34, 4, -33}, // 0x4E 'N' + {3689, 33, 36, 37, 2, -34}, // 0x4F 'O' + {3838, 24, 34, 31, 4, -33}, // 0x50 'P' + {3940, 33, 38, 37, 2, -34}, // 0x51 'Q' + {4097, 26, 34, 33, 4, -33}, // 0x52 'R' + {4208, 27, 36, 31, 2, -34}, // 0x53 'S' + {4330, 26, 34, 30, 2, -33}, // 0x54 'T' + {4441, 26, 35, 34, 4, -33}, // 0x55 'U' + {4555, 29, 34, 30, 1, -33}, // 0x56 'V' + {4679, 42, 34, 44, 1, -33}, // 0x57 'W' + {4858, 29, 34, 31, 1, -33}, // 0x58 'X' + {4982, 30, 34, 32, 1, -33}, // 0x59 'Y' + {5110, 27, 34, 29, 1, -33}, // 0x5A 'Z' + {5225, 8, 44, 13, 3, -33}, // 0x5B '[' + {5269, 13, 35, 13, 0, -33}, // 0x5C '\' + {5326, 8, 44, 13, 1, -33}, // 0x5D ']' + {5370, 18, 18, 22, 2, -32}, // 0x5E '^' + {5411, 28, 2, 26, -1, 7}, // 0x5F '_' + {5418, 10, 7, 12, 1, -34}, // 0x60 '`' + {5427, 24, 27, 26, 1, -25}, // 0x61 'a' + {5508, 22, 35, 26, 3, -33}, // 0x62 'b' + {5605, 21, 27, 24, 1, -25}, // 0x63 'c' + {5676, 23, 35, 26, 1, -33}, // 0x64 'd' + {5777, 22, 27, 25, 1, -25}, // 0x65 'e' + {5852, 10, 34, 13, 1, -33}, // 0x66 'f' + {5895, 22, 36, 26, 1, -25}, // 0x67 'g' + {5994, 19, 34, 25, 3, -33}, // 0x68 'h' + {6075, 4, 34, 10, 3, -33}, // 0x69 'i' + {6092, 8, 44, 11, 0, -33}, // 0x6A 'j' + {6136, 21, 34, 24, 3, -33}, // 0x6B 'k' + {6226, 4, 34, 10, 3, -33}, // 0x6C 'l' + {6243, 32, 26, 38, 3, -25}, // 0x6D 'm' + {6347, 20, 26, 25, 3, -25}, // 0x6E 'n' + {6412, 23, 27, 25, 1, -25}, // 0x6F 'o' + {6490, 22, 35, 26, 3, -25}, // 0x70 'p' + {6587, 23, 35, 26, 1, -25}, // 0x71 'q' + {6688, 12, 26, 16, 3, -25}, // 0x72 'r' + {6727, 20, 27, 23, 1, -25}, // 0x73 's' + {6795, 10, 32, 13, 1, -30}, // 0x74 't' + {6835, 20, 26, 25, 3, -24}, // 0x75 'u' + {6900, 23, 25, 23, 0, -24}, // 0x76 'v' + {6972, 34, 25, 34, 0, -24}, // 0x77 'w' + {7079, 22, 25, 22, 0, -24}, // 0x78 'x' + {7148, 22, 35, 22, 0, -24}, // 0x79 'y' + {7245, 20, 25, 23, 1, -24}, // 0x7A 'z' + {7308, 11, 44, 16, 2, -33}, // 0x7B '{' + {7369, 3, 44, 12, 4, -33}, // 0x7C '|' + {7386, 11, 44, 16, 2, -33}, // 0x7D '}' + {7447, 19, 7, 24, 2, -19}}; // 0x7E '~' + +const GFXfont FreeSans24pt7b PROGMEM = {(uint8_t *)FreeSans24pt7bBitmaps, + (GFXglyph *)FreeSans24pt7bGlyphs, 0x20, + 0x7E, 56}; + +// Approx. 8136 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h new file mode 100644 index 0000000..91c33b0 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h @@ -0,0 +1,203 @@ +#pragma once +#include + +const uint8_t FreeSans9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF, + 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F, + 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, + 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, + 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, + 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81, + 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4, + 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46, + 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30, + 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10, + 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, + 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, + 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, + 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, + 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, + 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78, + 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF, + 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, + 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, + 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, + 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0, + 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF, + 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71, + 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, + 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, + 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, + 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, + 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, + 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, + 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, + 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, + 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, + 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, + 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, + 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83, + 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, + 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, + 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, + 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, + 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8, + 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, + 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, + 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F, + 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, + 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, + 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, + 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, + 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, + 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, + 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, + 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, + 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, + 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F, + 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, + 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30, + 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98, + 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81, + 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00, + 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06, + 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, + 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D, + 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, + 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2, + 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0, + 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B, + 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C, + 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03, + 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, + 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66, + 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, + 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C, + 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF, + 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, + 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, + 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, + 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, + 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, + 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, + 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36, + 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42, + 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE, + 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E, + 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, + 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38}; + +const GFXglyph FreeSans9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 2, 13, 6, 2, -12}, // 0x21 '!' + {4, 5, 4, 6, 1, -12}, // 0x22 '"' + {7, 10, 12, 10, 0, -11}, // 0x23 '#' + {22, 9, 16, 10, 1, -13}, // 0x24 '$' + {40, 16, 13, 16, 1, -12}, // 0x25 '%' + {66, 11, 13, 12, 1, -12}, // 0x26 '&' + {84, 2, 4, 4, 1, -12}, // 0x27 ''' + {85, 4, 17, 6, 1, -12}, // 0x28 '(' + {94, 4, 17, 6, 1, -12}, // 0x29 ')' + {103, 5, 5, 7, 1, -12}, // 0x2A '*' + {107, 6, 8, 11, 3, -7}, // 0x2B '+' + {113, 2, 4, 5, 2, 0}, // 0x2C ',' + {114, 4, 1, 6, 1, -4}, // 0x2D '-' + {115, 2, 1, 5, 1, 0}, // 0x2E '.' + {116, 5, 13, 5, 0, -12}, // 0x2F '/' + {125, 8, 13, 10, 1, -12}, // 0x30 '0' + {138, 4, 13, 10, 3, -12}, // 0x31 '1' + {145, 9, 13, 10, 1, -12}, // 0x32 '2' + {160, 8, 13, 10, 1, -12}, // 0x33 '3' + {173, 7, 13, 10, 2, -12}, // 0x34 '4' + {185, 9, 13, 10, 1, -12}, // 0x35 '5' + {200, 9, 13, 10, 1, -12}, // 0x36 '6' + {215, 8, 13, 10, 0, -12}, // 0x37 '7' + {228, 9, 13, 10, 1, -12}, // 0x38 '8' + {243, 8, 13, 10, 1, -12}, // 0x39 '9' + {256, 2, 10, 5, 1, -9}, // 0x3A ':' + {259, 3, 12, 5, 1, -8}, // 0x3B ';' + {264, 9, 9, 11, 1, -8}, // 0x3C '<' + {275, 9, 4, 11, 1, -5}, // 0x3D '=' + {280, 9, 9, 11, 1, -8}, // 0x3E '>' + {291, 9, 13, 10, 1, -12}, // 0x3F '?' + {306, 17, 16, 18, 1, -12}, // 0x40 '@' + {340, 12, 13, 12, 0, -12}, // 0x41 'A' + {360, 11, 13, 12, 1, -12}, // 0x42 'B' + {378, 11, 13, 13, 1, -12}, // 0x43 'C' + {396, 11, 13, 13, 1, -12}, // 0x44 'D' + {414, 9, 13, 11, 1, -12}, // 0x45 'E' + {429, 8, 13, 11, 1, -12}, // 0x46 'F' + {442, 12, 13, 14, 1, -12}, // 0x47 'G' + {462, 11, 13, 13, 1, -12}, // 0x48 'H' + {480, 2, 13, 5, 2, -12}, // 0x49 'I' + {484, 7, 13, 10, 1, -12}, // 0x4A 'J' + {496, 11, 13, 12, 1, -12}, // 0x4B 'K' + {514, 8, 13, 10, 1, -12}, // 0x4C 'L' + {527, 13, 13, 15, 1, -12}, // 0x4D 'M' + {549, 11, 13, 13, 1, -12}, // 0x4E 'N' + {567, 13, 13, 14, 1, -12}, // 0x4F 'O' + {589, 10, 13, 12, 1, -12}, // 0x50 'P' + {606, 13, 14, 14, 1, -12}, // 0x51 'Q' + {629, 12, 13, 13, 1, -12}, // 0x52 'R' + {649, 10, 13, 12, 1, -12}, // 0x53 'S' + {666, 9, 13, 11, 1, -12}, // 0x54 'T' + {681, 11, 13, 13, 1, -12}, // 0x55 'U' + {699, 11, 13, 12, 0, -12}, // 0x56 'V' + {717, 17, 13, 17, 0, -12}, // 0x57 'W' + {745, 12, 13, 12, 0, -12}, // 0x58 'X' + {765, 12, 13, 12, 0, -12}, // 0x59 'Y' + {785, 10, 13, 11, 1, -12}, // 0x5A 'Z' + {802, 3, 17, 5, 1, -12}, // 0x5B '[' + {809, 5, 13, 5, 0, -12}, // 0x5C '\' + {818, 3, 17, 5, 0, -12}, // 0x5D ']' + {825, 7, 7, 8, 1, -12}, // 0x5E '^' + {832, 10, 1, 10, 0, 3}, // 0x5F '_' + {834, 4, 3, 5, 0, -12}, // 0x60 '`' + {836, 9, 10, 10, 1, -9}, // 0x61 'a' + {848, 9, 13, 10, 1, -12}, // 0x62 'b' + {863, 8, 10, 9, 1, -9}, // 0x63 'c' + {873, 8, 13, 10, 1, -12}, // 0x64 'd' + {886, 8, 10, 10, 1, -9}, // 0x65 'e' + {896, 4, 13, 5, 1, -12}, // 0x66 'f' + {903, 8, 14, 10, 1, -9}, // 0x67 'g' + {917, 8, 13, 10, 1, -12}, // 0x68 'h' + {930, 2, 13, 4, 1, -12}, // 0x69 'i' + {934, 4, 17, 4, 0, -12}, // 0x6A 'j' + {943, 9, 13, 9, 1, -12}, // 0x6B 'k' + {958, 2, 13, 4, 1, -12}, // 0x6C 'l' + {962, 13, 10, 15, 1, -9}, // 0x6D 'm' + {979, 8, 10, 10, 1, -9}, // 0x6E 'n' + {989, 8, 10, 10, 1, -9}, // 0x6F 'o' + {999, 9, 13, 10, 1, -9}, // 0x70 'p' + {1014, 8, 13, 10, 1, -9}, // 0x71 'q' + {1027, 5, 10, 6, 1, -9}, // 0x72 'r' + {1034, 8, 10, 9, 1, -9}, // 0x73 's' + {1044, 4, 12, 5, 1, -11}, // 0x74 't' + {1050, 8, 10, 10, 1, -9}, // 0x75 'u' + {1060, 9, 10, 9, 0, -9}, // 0x76 'v' + {1072, 13, 10, 13, 0, -9}, // 0x77 'w' + {1089, 8, 10, 9, 0, -9}, // 0x78 'x' + {1099, 9, 14, 9, 0, -9}, // 0x79 'y' + {1115, 7, 10, 9, 1, -9}, // 0x7A 'z' + {1124, 4, 17, 6, 1, -12}, // 0x7B '{' + {1133, 2, 17, 4, 2, -12}, // 0x7C '|' + {1138, 4, 17, 6, 1, -12}, // 0x7D '}' + {1147, 7, 3, 9, 1, -7}}; // 0x7E '~' + +const GFXfont FreeSans9pt7b PROGMEM = {(uint8_t *)FreeSans9pt7bBitmaps, + (GFXglyph *)FreeSans9pt7bGlyphs, 0x20, + 0x7E, 22}; + +// Approx. 1822 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h new file mode 100644 index 0000000..c1d6ef4 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h @@ -0,0 +1,290 @@ +#pragma once +#include + +const uint8_t FreeSansBold12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x60, 0xFF, 0xF0, 0xF3, 0xFC, 0xFF, + 0x3F, 0xCF, 0x61, 0x98, 0x60, 0x0E, 0x70, 0x73, 0x83, 0x18, 0xFF, 0xF7, + 0xFF, 0xBF, 0xFC, 0x73, 0x83, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFD, 0xFF, + 0xE3, 0x18, 0x39, 0xC1, 0xCE, 0x0E, 0x70, 0x02, 0x00, 0x7E, 0x0F, 0xF8, + 0x7F, 0xE7, 0xAF, 0xB9, 0x3D, 0xC8, 0x0F, 0x40, 0x3F, 0x00, 0xFF, 0x00, + 0xFC, 0x05, 0xFF, 0x27, 0xF9, 0x3F, 0xEB, 0xEF, 0xFE, 0x3F, 0xE0, 0x7C, + 0x00, 0x80, 0x04, 0x00, 0x3C, 0x06, 0x0F, 0xC1, 0x81, 0xFC, 0x30, 0x73, + 0x8C, 0x0C, 0x31, 0x81, 0xCE, 0x60, 0x1F, 0xCC, 0x03, 0xF3, 0x00, 0x3C, + 0x67, 0x80, 0x19, 0xF8, 0x02, 0x7F, 0x80, 0xCE, 0x70, 0x11, 0x86, 0x06, + 0x39, 0xC1, 0x87, 0xF8, 0x30, 0x7E, 0x0C, 0x07, 0x80, 0x07, 0x80, 0x1F, + 0xC0, 0x3F, 0xE0, 0x3C, 0xE0, 0x3C, 0xE0, 0x3E, 0xE0, 0x0F, 0xC0, 0x07, + 0x00, 0x3F, 0x8C, 0x7F, 0xCC, 0xF1, 0xFC, 0xF0, 0xF8, 0xF0, 0x78, 0xF8, + 0xF8, 0x7F, 0xFC, 0x3F, 0xDE, 0x1F, 0x8E, 0xFF, 0xFF, 0x66, 0x0C, 0x73, + 0x8E, 0x71, 0xC7, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x1C, 0x71, 0xC3, + 0x8E, 0x18, 0x70, 0xC3, 0x87, 0x1C, 0x38, 0xE3, 0x87, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xCE, 0x38, 0xE7, 0x1C, 0x63, 0x80, 0x10, 0x23, 0x5F, 0xF3, + 0x87, 0x1B, 0x14, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, + 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0xFF, 0xF3, 0x36, 0xC0, 0xFF, + 0xFF, 0xC0, 0xFF, 0xF0, 0x0C, 0x30, 0x86, 0x18, 0x61, 0x0C, 0x30, 0xC2, + 0x18, 0x61, 0x84, 0x30, 0xC0, 0x1F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, + 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, + 0xF7, 0x9E, 0x7F, 0xE3, 0xFC, 0x0F, 0x00, 0x06, 0x1C, 0x7F, 0xFF, 0xE3, + 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x1F, 0x83, + 0xFC, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xE0, + 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x03, 0x80, 0x7F, 0xF7, 0xFF, 0x7F, 0xF0, + 0x1F, 0x07, 0xFC, 0xFF, 0xEF, 0x1E, 0xF1, 0xE0, 0x1E, 0x03, 0xC0, 0x78, + 0x07, 0xC0, 0x1E, 0x00, 0xF0, 0x0F, 0xF0, 0xFF, 0x1F, 0x7F, 0xE7, 0xFC, + 0x1F, 0x80, 0x03, 0xC0, 0xF8, 0x1F, 0x07, 0xE1, 0xBC, 0x27, 0x8C, 0xF3, + 0x1E, 0x63, 0xD8, 0x7B, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x80, 0xF0, 0x1E, + 0x03, 0xC0, 0x3F, 0xE7, 0xFE, 0x7F, 0xE7, 0x00, 0x60, 0x06, 0xF8, 0x7F, + 0xCF, 0xFE, 0xF1, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFE, 0x1E, 0xFF, + 0xE7, 0xFC, 0x3F, 0x00, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9F, 0xF0, 0x0F, + 0x78, 0xFF, 0xCF, 0xFE, 0xF9, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF7, + 0x9F, 0x7F, 0xE3, 0xFC, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, + 0x1C, 0x07, 0x01, 0xE0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0F, 0x01, 0xE0, + 0x38, 0x0F, 0x01, 0xE0, 0x3C, 0x00, 0x0F, 0x03, 0xFC, 0x7F, 0xC7, 0x9E, + 0x70, 0xE7, 0x0E, 0x39, 0xC1, 0xF8, 0x3F, 0xC7, 0x9E, 0xF0, 0xFF, 0x0F, + 0xF0, 0xFF, 0x9F, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0x1F, 0x03, 0xFC, 0x7F, + 0xEF, 0x9E, 0xF0, 0xEF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF9, 0xF7, 0xFF, 0x3F, + 0xF1, 0xEF, 0x00, 0xEF, 0x1E, 0x7F, 0xE7, 0xFC, 0x1F, 0x00, 0xFF, 0xF0, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0x11, 0x6C, + 0x00, 0x10, 0x07, 0x03, 0xF1, 0xFC, 0x7E, 0x0F, 0x80, 0xE0, 0x0F, 0xC0, + 0x3F, 0x80, 0x7F, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0E, 0x00, 0xFC, + 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0x00, 0xF0, 0x7F, 0x1F, 0x8F, 0xE0, 0xF0, + 0x08, 0x00, 0x1F, 0x07, 0xFC, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0x00, + 0xF0, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x0E, 0x00, 0xE0, 0x00, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xFC, 0x03, 0xC0, + 0xF0, 0x38, 0x01, 0xC3, 0x80, 0x07, 0x18, 0x3D, 0x99, 0x87, 0xEC, 0x6C, + 0x71, 0xC3, 0xC3, 0x06, 0x1E, 0x18, 0x30, 0xF1, 0x81, 0x87, 0x8C, 0x18, + 0x7C, 0x60, 0xC3, 0x63, 0x8E, 0x3B, 0x8F, 0xDF, 0x8C, 0x3C, 0xF0, 0x70, + 0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x80, 0x1F, 0xFE, 0x00, 0x1F, 0xC0, + 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x07, + 0x70, 0x0F, 0x78, 0x0E, 0x78, 0x0E, 0x38, 0x1E, 0x3C, 0x1C, 0x3C, 0x3F, + 0xFC, 0x3F, 0xFE, 0x3F, 0xFE, 0x78, 0x0E, 0x78, 0x0F, 0x70, 0x0F, 0xF0, + 0x07, 0xFF, 0xC3, 0xFF, 0xCF, 0xFF, 0x3C, 0x3E, 0xF0, 0x7B, 0xC1, 0xEF, + 0x0F, 0xBF, 0xFC, 0xFF, 0xE3, 0xFF, 0xCF, 0x07, 0xBC, 0x0F, 0xF0, 0x3F, + 0xC0, 0xFF, 0x07, 0xFF, 0xFE, 0xFF, 0xFB, 0xFF, 0x80, 0x07, 0xE0, 0x1F, + 0xF8, 0x3F, 0xFC, 0x7C, 0x3E, 0x78, 0x1F, 0xF8, 0x0F, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF8, 0x0F, 0x78, + 0x1F, 0x7C, 0x3E, 0x3F, 0xFE, 0x1F, 0xFC, 0x07, 0xF0, 0xFF, 0xE1, 0xFF, + 0xE3, 0xFF, 0xE7, 0x83, 0xEF, 0x03, 0xDE, 0x07, 0xFC, 0x07, 0xF8, 0x0F, + 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x07, 0xBC, + 0x1F, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0x80, 0xFF, 0xF7, 0xFF, 0xBF, 0xFD, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFC, 0xFF, 0xE7, 0xFF, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0x03, 0xF0, 0x0F, 0xFC, 0x3F, 0xFE, 0x3E, 0x1F, + 0x78, 0x07, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x7F, 0xF0, 0x7F, + 0xF0, 0x7F, 0xF0, 0x07, 0x78, 0x07, 0x7C, 0x0F, 0x3E, 0x1F, 0x3F, 0xFB, + 0x0F, 0xFB, 0x03, 0xE3, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, + 0x3F, 0xC0, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, + 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x3C, + 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, + 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7B, 0xFE, 0x7F, 0xC3, 0xE0, 0xF0, 0x3E, + 0xF0, 0x3C, 0xF0, 0x78, 0xF0, 0xF0, 0xF1, 0xE0, 0xF3, 0xC0, 0xF7, 0x80, + 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFB, 0xC0, 0xF1, 0xE0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0x78, 0xF0, 0x3C, 0xF0, 0x3E, 0xF0, 0x1E, 0xF0, 0x1E, + 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, + 0x1F, 0xFE, 0x0F, 0xFF, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xFF, 0xE1, 0xFF, + 0xF9, 0xFF, 0xFC, 0xEF, 0xFE, 0x77, 0xFB, 0x3B, 0xFD, 0xDD, 0xFE, 0xFC, + 0xFF, 0x7E, 0x7F, 0x9F, 0x3F, 0xCF, 0x9F, 0xE7, 0x8F, 0xF3, 0xC7, 0xF8, + 0xE3, 0xC0, 0xF0, 0x1F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0xFF, 0xE1, 0xFF, + 0xC3, 0xFD, 0xC7, 0xFB, 0x8F, 0xF3, 0x9F, 0xE7, 0x3F, 0xC7, 0x7F, 0x8F, + 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x1F, 0xF8, 0x1F, 0xF0, 0x3F, 0xE0, 0x3C, + 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0, + 0x7B, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, + 0x00, 0xF7, 0x80, 0xF3, 0xC0, 0x78, 0xF0, 0xF8, 0x7F, 0xFC, 0x1F, 0xFC, + 0x03, 0xF8, 0x00, 0xFF, 0xE3, 0xFF, 0xEF, 0xFF, 0xBC, 0x1F, 0xF0, 0x3F, + 0xC0, 0xFF, 0x03, 0xFC, 0x1F, 0xFF, 0xFB, 0xFF, 0xCF, 0xFE, 0x3C, 0x00, + 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x00, 0x03, + 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0, 0x7B, + 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x04, + 0xF7, 0x87, 0xF3, 0xC3, 0xF8, 0xF0, 0xF8, 0x7F, 0xFC, 0x1F, 0xFF, 0x83, + 0xF1, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3E, + 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x3C, 0xFF, 0xF8, 0xFF, 0xF0, + 0xFF, 0xF8, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, + 0xF0, 0x3C, 0xF0, 0x1F, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE7, 0xC3, 0xEF, + 0x03, 0xDE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x7F, 0xF0, 0x3F, 0xF8, 0x0F, + 0xF8, 0x01, 0xF0, 0x01, 0xFE, 0x03, 0xDE, 0x0F, 0xBF, 0xFE, 0x3F, 0xF8, + 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, + 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, + 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, + 0x00, 0x70, 0x0E, 0xF0, 0x3D, 0xE0, 0x79, 0xC0, 0xE3, 0x81, 0xC7, 0x87, + 0x87, 0x0E, 0x0E, 0x1C, 0x1E, 0x78, 0x1C, 0xE0, 0x39, 0xC0, 0x73, 0x80, + 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x70, + 0x38, 0x1C, 0xE0, 0xF0, 0x79, 0xE1, 0xF0, 0xF3, 0xC3, 0xE1, 0xE3, 0x87, + 0xC3, 0x87, 0x0F, 0x87, 0x0E, 0x3B, 0x9E, 0x1E, 0x77, 0x38, 0x1C, 0xEE, + 0x70, 0x39, 0xCC, 0xE0, 0x73, 0x99, 0xC0, 0x6E, 0x3F, 0x00, 0xFC, 0x7E, + 0x01, 0xF8, 0xFC, 0x03, 0xF0, 0xF8, 0x03, 0xE1, 0xE0, 0x07, 0x83, 0xC0, + 0x0F, 0x07, 0x80, 0xF0, 0x3C, 0xF0, 0xF9, 0xE1, 0xE1, 0xE7, 0x83, 0xCF, + 0x03, 0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3F, 0x00, + 0xFF, 0x01, 0xFE, 0x07, 0x9E, 0x0F, 0x1E, 0x3C, 0x3C, 0xF8, 0x3D, 0xE0, + 0x78, 0xF0, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x78, 0x1E, + 0x78, 0x0E, 0x70, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, + 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, + 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF8, 0x07, 0x80, 0x78, 0x07, 0x80, 0x7C, 0x03, 0xC0, 0x3C, 0x03, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0xF3, 0xCF, + 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xFF, 0xFF, + 0xC0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x40, + 0xC1, 0x81, 0x03, 0x06, 0xFF, 0xFF, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, + 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xFF, 0xFF, 0xC0, 0x0F, 0x00, + 0xF0, 0x0F, 0x01, 0xF8, 0x1B, 0x83, 0x9C, 0x39, 0xC3, 0x0C, 0x70, 0xE7, + 0x0E, 0xE0, 0x70, 0xFF, 0xFF, 0xFF, 0xFC, 0xE6, 0x30, 0x1F, 0x83, 0xFF, + 0x1F, 0xFD, 0xE1, 0xE0, 0x0F, 0x03, 0xF9, 0xFF, 0xDF, 0x1E, 0xF0, 0xF7, + 0x8F, 0xBF, 0xFC, 0xFF, 0xE3, 0xCF, 0x80, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x7B, 0xC3, 0xFF, 0x9F, 0xFE, 0xF8, 0xF7, 0x83, 0xFC, + 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xE3, 0xDF, 0xFE, 0xFF, 0xE7, 0xBE, + 0x00, 0x0F, 0x83, 0xFE, 0x7F, 0xF7, 0x8F, 0xF0, 0x7F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x77, 0x8F, 0x7F, 0xF3, 0xFE, 0x0F, 0x80, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x8F, 0xBC, 0xFF, 0xEF, 0xFF, 0x78, 0xFF, + 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3D, 0xE3, 0xEF, 0xFF, 0x3F, + 0xF8, 0xFB, 0xC0, 0x1F, 0x81, 0xFE, 0x1F, 0xF9, 0xF1, 0xCF, 0x07, 0x7F, + 0xFB, 0xFF, 0xDE, 0x00, 0xF0, 0x03, 0xC3, 0x9F, 0xFC, 0x7F, 0xC0, 0xF8, + 0x00, 0x3E, 0xFD, 0xFB, 0xC7, 0x9F, 0xBF, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, + 0x8F, 0x1E, 0x3C, 0x78, 0xF0, 0x1E, 0x79, 0xFB, 0xDF, 0xFE, 0xF1, 0xFF, + 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC7, 0xDF, 0xFE, 0x7F, + 0xF1, 0xF7, 0x80, 0x3C, 0x01, 0xFF, 0x1E, 0x7F, 0xF0, 0xFE, 0x00, 0xF0, + 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x7C, 0xFF, 0xEF, 0xFF, 0xF9, + 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, + 0xFF, 0x0F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, + 0xF3, 0xC0, 0x00, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, + 0xF3, 0xCF, 0xFF, 0xFF, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, + 0x0F, 0x0F, 0xF1, 0xEF, 0x3C, 0xF7, 0x8F, 0xF0, 0xFF, 0x0F, 0xF8, 0xFF, + 0x8F, 0x3C, 0xF1, 0xCF, 0x1E, 0xF0, 0xEF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x8F, 0x9F, 0xFB, 0xFB, 0xFF, 0xFF, + 0xFC, 0xF8, 0xFF, 0x1E, 0x1F, 0xE3, 0xC3, 0xFC, 0x78, 0x7F, 0x8F, 0x0F, + 0xF1, 0xE1, 0xFE, 0x3C, 0x3F, 0xC7, 0x87, 0xF8, 0xF0, 0xFF, 0x1E, 0x1E, + 0xF7, 0xCF, 0xFE, 0xFF, 0xFF, 0x9F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, + 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF0, 0x0F, 0x81, 0xFF, 0x1F, + 0xFC, 0xF1, 0xEF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7B, 0xC7, + 0x9F, 0xFC, 0x7F, 0xC0, 0xF8, 0x00, 0xF7, 0xC7, 0xFF, 0x3F, 0xFD, 0xF1, + 0xEF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC7, 0xBF, 0xFD, + 0xFF, 0xCF, 0x78, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x00, + 0x0F, 0x79, 0xFF, 0xDF, 0xFE, 0xF1, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, + 0x0F, 0xF0, 0x7B, 0xC7, 0xDF, 0xFE, 0x7F, 0xF1, 0xF7, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0xF3, 0xF7, 0xFF, 0xF8, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x1F, 0x87, 0xFC, 0xFF, 0xEF, + 0x0F, 0xF8, 0x0F, 0xF0, 0x7F, 0xE0, 0xFF, 0x01, 0xFF, 0x0F, 0xFF, 0xE7, + 0xFE, 0x1F, 0x80, 0x79, 0xE7, 0xBF, 0xFD, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, + 0x7D, 0xF3, 0xC0, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, + 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1F, 0xFF, 0xF7, 0xFF, 0x3E, 0xF0, 0xF0, + 0x7B, 0x83, 0x9E, 0x1C, 0xF1, 0xE3, 0x8E, 0x1C, 0x70, 0x77, 0x83, 0xB8, + 0x1D, 0xC0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0x70, 0x00, 0xF0, 0xE1, 0xDC, + 0x78, 0x77, 0x1F, 0x3D, 0xE7, 0xCF, 0x79, 0xB3, 0x8E, 0x6C, 0xE3, 0xBB, + 0x38, 0xEE, 0xFC, 0x1F, 0x3F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, 0x7C, 0x78, + 0x0E, 0x1E, 0x00, 0x78, 0xF3, 0xC7, 0x8F, 0x78, 0x3B, 0x81, 0xFC, 0x07, + 0xC0, 0x1E, 0x01, 0xF0, 0x1F, 0xC0, 0xEF, 0x0F, 0x78, 0xF1, 0xE7, 0x87, + 0x00, 0xF0, 0x7B, 0x83, 0x9E, 0x1C, 0x71, 0xE3, 0x8E, 0x1E, 0x70, 0x73, + 0x83, 0xB8, 0x1F, 0xC0, 0x7E, 0x03, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, + 0x3C, 0x07, 0xC0, 0x3E, 0x01, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1C, 0xF3, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBC, 0xF0, 0xE3, 0x8E, + 0x38, 0xE3, 0x8E, 0x3C, 0xF1, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0xE3, 0x8F, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x0F, 0x3D, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0xF3, 0xCE, 0x00, 0x78, 0x0F, 0xE0, 0xCF, 0x30, 0x7F, + 0x01, 0xE0}; + +const GFXglyph FreeSansBold12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 7, 0, 1}, // 0x20 ' ' + {0, 4, 17, 8, 3, -16}, // 0x21 '!' + {9, 10, 6, 11, 1, -17}, // 0x22 '"' + {17, 13, 16, 13, 0, -15}, // 0x23 '#' + {43, 13, 20, 13, 0, -17}, // 0x24 '$' + {76, 19, 17, 21, 1, -16}, // 0x25 '%' + {117, 16, 17, 17, 1, -16}, // 0x26 '&' + {151, 4, 6, 6, 1, -17}, // 0x27 ''' + {154, 6, 22, 8, 1, -17}, // 0x28 '(' + {171, 6, 22, 8, 1, -17}, // 0x29 ')' + {188, 7, 8, 9, 1, -17}, // 0x2A '*' + {195, 11, 11, 14, 2, -10}, // 0x2B '+' + {211, 4, 7, 6, 1, -2}, // 0x2C ',' + {215, 6, 3, 8, 1, -7}, // 0x2D '-' + {218, 4, 3, 6, 1, -2}, // 0x2E '.' + {220, 6, 17, 7, 0, -16}, // 0x2F '/' + {233, 12, 17, 13, 1, -16}, // 0x30 '0' + {259, 7, 17, 14, 3, -16}, // 0x31 '1' + {274, 12, 17, 13, 1, -16}, // 0x32 '2' + {300, 12, 17, 13, 1, -16}, // 0x33 '3' + {326, 11, 17, 13, 1, -16}, // 0x34 '4' + {350, 12, 17, 13, 1, -16}, // 0x35 '5' + {376, 12, 17, 13, 1, -16}, // 0x36 '6' + {402, 11, 17, 13, 1, -16}, // 0x37 '7' + {426, 12, 17, 13, 1, -16}, // 0x38 '8' + {452, 12, 17, 13, 1, -16}, // 0x39 '9' + {478, 4, 12, 6, 1, -11}, // 0x3A ':' + {484, 4, 16, 6, 1, -11}, // 0x3B ';' + {492, 12, 12, 14, 1, -11}, // 0x3C '<' + {510, 12, 9, 14, 1, -9}, // 0x3D '=' + {524, 12, 12, 14, 1, -11}, // 0x3E '>' + {542, 12, 18, 15, 2, -17}, // 0x3F '?' + {569, 21, 21, 23, 1, -17}, // 0x40 '@' + {625, 16, 18, 17, 0, -17}, // 0x41 'A' + {661, 14, 18, 17, 2, -17}, // 0x42 'B' + {693, 16, 18, 17, 1, -17}, // 0x43 'C' + {729, 15, 18, 17, 2, -17}, // 0x44 'D' + {763, 13, 18, 16, 2, -17}, // 0x45 'E' + {793, 12, 18, 15, 2, -17}, // 0x46 'F' + {820, 16, 18, 18, 1, -17}, // 0x47 'G' + {856, 14, 18, 18, 2, -17}, // 0x48 'H' + {888, 4, 18, 7, 2, -17}, // 0x49 'I' + {897, 11, 18, 14, 1, -17}, // 0x4A 'J' + {922, 16, 18, 17, 2, -17}, // 0x4B 'K' + {958, 11, 18, 15, 2, -17}, // 0x4C 'L' + {983, 17, 18, 21, 2, -17}, // 0x4D 'M' + {1022, 15, 18, 18, 2, -17}, // 0x4E 'N' + {1056, 17, 18, 19, 1, -17}, // 0x4F 'O' + {1095, 14, 18, 16, 2, -17}, // 0x50 'P' + {1127, 17, 19, 19, 1, -17}, // 0x51 'Q' + {1168, 16, 18, 17, 2, -17}, // 0x52 'R' + {1204, 15, 18, 16, 1, -17}, // 0x53 'S' + {1238, 12, 18, 15, 2, -17}, // 0x54 'T' + {1265, 14, 18, 18, 2, -17}, // 0x55 'U' + {1297, 15, 18, 16, 0, -17}, // 0x56 'V' + {1331, 23, 18, 23, 0, -17}, // 0x57 'W' + {1383, 15, 18, 16, 1, -17}, // 0x58 'X' + {1417, 16, 18, 15, 0, -17}, // 0x59 'Y' + {1453, 13, 18, 15, 1, -17}, // 0x5A 'Z' + {1483, 6, 23, 8, 2, -17}, // 0x5B '[' + {1501, 7, 17, 7, 0, -16}, // 0x5C '\' + {1516, 6, 23, 8, 0, -17}, // 0x5D ']' + {1534, 12, 11, 14, 1, -16}, // 0x5E '^' + {1551, 15, 2, 13, -1, 4}, // 0x5F '_' + {1555, 4, 3, 6, 0, -17}, // 0x60 '`' + {1557, 13, 13, 14, 1, -12}, // 0x61 'a' + {1579, 13, 18, 15, 2, -17}, // 0x62 'b' + {1609, 12, 13, 13, 1, -12}, // 0x63 'c' + {1629, 13, 18, 15, 1, -17}, // 0x64 'd' + {1659, 13, 13, 14, 1, -12}, // 0x65 'e' + {1681, 7, 18, 8, 1, -17}, // 0x66 'f' + {1697, 13, 18, 15, 1, -12}, // 0x67 'g' + {1727, 12, 18, 14, 2, -17}, // 0x68 'h' + {1754, 4, 18, 7, 2, -17}, // 0x69 'i' + {1763, 6, 23, 7, 0, -17}, // 0x6A 'j' + {1781, 12, 18, 14, 2, -17}, // 0x6B 'k' + {1808, 4, 18, 6, 2, -17}, // 0x6C 'l' + {1817, 19, 13, 21, 2, -12}, // 0x6D 'm' + {1848, 12, 13, 15, 2, -12}, // 0x6E 'n' + {1868, 13, 13, 15, 1, -12}, // 0x6F 'o' + {1890, 13, 18, 15, 2, -12}, // 0x70 'p' + {1920, 13, 18, 15, 1, -12}, // 0x71 'q' + {1950, 8, 13, 9, 2, -12}, // 0x72 'r' + {1963, 12, 13, 13, 1, -12}, // 0x73 's' + {1983, 6, 15, 8, 1, -14}, // 0x74 't' + {1995, 12, 13, 15, 2, -12}, // 0x75 'u' + {2015, 13, 13, 13, 0, -12}, // 0x76 'v' + {2037, 18, 13, 19, 0, -12}, // 0x77 'w' + {2067, 13, 13, 13, 0, -12}, // 0x78 'x' + {2089, 13, 18, 13, 0, -12}, // 0x79 'y' + {2119, 10, 13, 12, 1, -12}, // 0x7A 'z' + {2136, 6, 23, 9, 1, -17}, // 0x7B '{' + {2154, 2, 22, 7, 2, -17}, // 0x7C '|' + {2160, 6, 23, 9, 3, -17}, // 0x7D '}' + {2178, 12, 5, 12, 0, -7}}; // 0x7E '~' + +const GFXfont FreeSansBold12pt7b PROGMEM = { + (uint8_t *)FreeSansBold12pt7bBitmaps, (GFXglyph *)FreeSansBold12pt7bGlyphs, + 0x20, 0x7E, 29}; + +// Approx. 2858 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h new file mode 100644 index 0000000..f0e2807 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h @@ -0,0 +1,483 @@ +#pragma once +#include + +const uint8_t FreeSansBold18pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE7, 0x39, 0xCE, 0x73, 0x80, + 0x0F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xC7, 0xFE, 0x3F, 0xF1, 0xFF, 0x8F, + 0xFC, 0x7D, 0xC1, 0xCE, 0x0E, 0x70, 0x70, 0x03, 0xC3, 0x80, 0x3C, 0x78, + 0x03, 0xC7, 0x80, 0x38, 0x78, 0x07, 0x87, 0x07, 0xFF, 0xFF, 0x7F, 0xFF, + 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xF0, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0xF1, + 0xE0, 0x0F, 0x1E, 0x00, 0xE1, 0xE0, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xCF, 0xFF, 0xFC, 0x1C, 0x3C, 0x03, 0xC3, 0x80, 0x3C, 0x78, 0x03, + 0xC7, 0x80, 0x38, 0x78, 0x03, 0x87, 0x80, 0x00, 0x60, 0x00, 0x7F, 0x80, + 0x3F, 0xFC, 0x0F, 0xFF, 0xC3, 0xFF, 0xFC, 0xFC, 0xDF, 0x9F, 0x19, 0xFB, + 0xC3, 0x1F, 0x78, 0x63, 0xEF, 0x8C, 0x01, 0xFD, 0x80, 0x1F, 0xF0, 0x01, + 0xFF, 0xC0, 0x1F, 0xFE, 0x00, 0x7F, 0xE0, 0x03, 0xFE, 0x00, 0x67, 0xE0, + 0x0C, 0x7F, 0xE1, 0x8F, 0xFC, 0x31, 0xFF, 0xC6, 0x3E, 0xFC, 0xDF, 0x9F, + 0xFF, 0xF1, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0x7F, 0x80, 0x01, 0x80, 0x00, + 0x30, 0x00, 0x06, 0x00, 0x0F, 0x00, 0x1C, 0x01, 0xFE, 0x00, 0xE0, 0x1F, + 0xF8, 0x0E, 0x00, 0xFF, 0xC0, 0x70, 0x0F, 0x0F, 0x07, 0x00, 0x70, 0x38, + 0x38, 0x03, 0x81, 0xC3, 0x80, 0x1C, 0x0E, 0x3C, 0x00, 0xF0, 0xF1, 0xC0, + 0x03, 0xFF, 0x1C, 0x00, 0x1F, 0xF8, 0xE0, 0x00, 0x7F, 0x8E, 0x00, 0x00, + 0xF0, 0x70, 0xF8, 0x00, 0x07, 0x1F, 0xF0, 0x00, 0x39, 0xFF, 0xC0, 0x03, + 0x8F, 0xFE, 0x00, 0x1C, 0xF0, 0x78, 0x01, 0xC7, 0x01, 0xC0, 0x0C, 0x38, + 0x0E, 0x00, 0xE1, 0xC0, 0x70, 0x06, 0x0F, 0x07, 0x80, 0x70, 0x3F, 0xF8, + 0x07, 0x01, 0xFF, 0xC0, 0x38, 0x07, 0xFC, 0x03, 0x80, 0x0F, 0x80, 0x01, + 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0x1F, 0x1E, + 0x00, 0x7C, 0x78, 0x01, 0xF1, 0xE0, 0x07, 0xE7, 0x80, 0x0F, 0xBC, 0x00, + 0x1F, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xF0, 0xF0, 0xFF, + 0xE3, 0xC7, 0xE7, 0xCF, 0x3F, 0x0F, 0xF8, 0xF8, 0x3F, 0xE3, 0xE0, 0x7F, + 0x8F, 0x80, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x3F, 0xE1, 0xFF, 0xFF, 0x83, + 0xFF, 0xFF, 0x07, 0xFE, 0x7E, 0x07, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFD, + 0xCE, 0x70, 0x07, 0x87, 0x83, 0xC3, 0xC1, 0xE1, 0xE0, 0xF0, 0x78, 0x78, + 0x3C, 0x1E, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, + 0x0F, 0x03, 0x81, 0xE0, 0xF0, 0x78, 0x1E, 0x0F, 0x03, 0x81, 0xE0, 0x70, + 0x3C, 0x0E, 0x07, 0x80, 0xF0, 0x38, 0x1E, 0x07, 0x83, 0xC0, 0xF0, 0x78, + 0x3C, 0x0F, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, + 0xC1, 0xE0, 0xF0, 0x78, 0x78, 0x3C, 0x1E, 0x0F, 0x0F, 0x07, 0x87, 0x83, + 0xC1, 0xC1, 0xE0, 0xE0, 0xF0, 0x00, 0x06, 0x00, 0x60, 0x06, 0x07, 0x6E, + 0x7F, 0xE3, 0xFC, 0x0F, 0x01, 0xF8, 0x1F, 0x83, 0x9C, 0x10, 0x80, 0x03, + 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x03, + 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x8C, 0x63, + 0x37, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x80, 0x01, + 0x81, 0xC0, 0xC0, 0x60, 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x06, 0x03, 0x01, + 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x01, + 0x81, 0xC0, 0xC0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0xFF, + 0xC7, 0xE3, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, + 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, + 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, + 0xF1, 0xFF, 0xF0, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x01, 0xC0, + 0xF0, 0x3C, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xC1, 0xF0, 0x7C, + 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, + 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, + 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, + 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x03, 0xF0, + 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, + 0x03, 0xE0, 0x03, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0x80, + 0x07, 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFF, 0xCF, 0xC3, 0xF7, 0xC0, + 0xFB, 0xE0, 0x7D, 0xF0, 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x80, + 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, + 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7, 0xC3, 0xF3, 0xFF, 0xF8, 0xFF, + 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x01, 0xFC, + 0x01, 0xFC, 0x03, 0xFC, 0x07, 0x7C, 0x07, 0x7C, 0x0E, 0x7C, 0x0E, 0x7C, + 0x1C, 0x7C, 0x18, 0x7C, 0x38, 0x7C, 0x70, 0x7C, 0x60, 0x7C, 0xE0, 0x7C, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x7C, + 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x1F, 0xFF, 0x0F, 0xFF, + 0x8F, 0xFF, 0xC7, 0xFF, 0xE3, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, + 0x00, 0x79, 0xF0, 0x3F, 0xFE, 0x1F, 0xFF, 0x8F, 0xFF, 0xE7, 0xC3, 0xF0, + 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xFE, 0x03, + 0xFF, 0x03, 0xFF, 0xC3, 0xF3, 0xFF, 0xF1, 0xFF, 0xF8, 0x3F, 0xF0, 0x07, + 0xE0, 0x00, 0x03, 0xF8, 0x03, 0xFF, 0x81, 0xFF, 0xF0, 0xFF, 0xFE, 0x3E, + 0x1F, 0x9F, 0x03, 0xE7, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0xF8, 0x3E, 0xFF, + 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFE, 0x1F, 0xBF, 0x03, 0xFF, 0x80, 0x7F, + 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xF7, 0x80, 0x7D, 0xF0, 0x3E, 0x7E, + 0x1F, 0x8F, 0xFF, 0xC1, 0xFF, 0xF0, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0xF8, + 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, + 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x03, + 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xE0, 0x07, 0xFC, 0x0F, 0xFF, 0x07, + 0xFF, 0xC7, 0xC3, 0xF3, 0xC0, 0xF9, 0xE0, 0x3C, 0xF0, 0x1E, 0x78, 0x1F, + 0x1E, 0x1F, 0x07, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xE3, 0xF1, 0xF9, 0xF0, + 0x7D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7, + 0xC3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x07, + 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFF, 0xC7, 0xE3, 0xF7, 0xE0, 0xFB, + 0xE0, 0x3D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, + 0xF7, 0xE3, 0xFB, 0xFF, 0xFC, 0xFF, 0xFE, 0x3F, 0xDF, 0x07, 0xCF, 0x80, + 0x07, 0x80, 0x03, 0xDF, 0x03, 0xE7, 0xC3, 0xE3, 0xFF, 0xF0, 0xFF, 0xF0, + 0x3F, 0xF0, 0x07, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xC6, 0x33, 0x9B, 0xD8, 0x00, 0x00, 0xC0, 0x00, + 0xF0, 0x01, 0xFC, 0x03, 0xFF, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0xFC, 0x03, + 0xF8, 0x00, 0xF0, 0x00, 0x3F, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x07, + 0xFF, 0x00, 0x3F, 0xF0, 0x01, 0xFC, 0x00, 0x1F, 0x00, 0x00, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xC0, 0x00, 0x3C, 0x00, 0x0F, 0xE0, 0x03, 0xFF, 0x00, 0x3F, 0xF0, + 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xC0, 0x07, 0xF0, + 0x0F, 0xFC, 0x1F, 0xF8, 0x3F, 0xF8, 0x3F, 0xF0, 0x0F, 0xE0, 0x03, 0xC0, + 0x00, 0xC0, 0x00, 0x00, 0x07, 0xF0, 0x07, 0xFF, 0x03, 0xFF, 0xF1, 0xFF, + 0xFC, 0x7E, 0x3F, 0xBF, 0x03, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, + 0xC0, 0x03, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, + 0x1F, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, + 0x00, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x07, 0xF0, 0x03, 0xE0, 0x01, 0xF8, 0x07, + 0x80, 0x00, 0x7C, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x03, 0xE3, 0x9E, 0x3C, + 0x0F, 0xF7, 0x8E, 0x38, 0x1F, 0xFF, 0x0E, 0x78, 0x3E, 0x1F, 0x07, 0x70, + 0x38, 0x0F, 0x07, 0x70, 0x78, 0x0F, 0x07, 0xE0, 0x70, 0x0E, 0x07, 0xE0, + 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x0E, 0x07, 0xE0, 0xE0, 0x1E, 0x0F, 0xE0, + 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x3C, 0x1E, 0xE0, 0xF0, 0x3C, 0x3C, 0xF0, + 0xF0, 0xFC, 0x7C, 0x70, 0x7F, 0xFF, 0xF8, 0x78, 0x3F, 0xCF, 0xF0, 0x3C, + 0x1F, 0x07, 0xC0, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, + 0xC0, 0x01, 0x00, 0x07, 0xF0, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x01, 0xFF, + 0x80, 0x01, 0xFF, 0x80, 0x01, 0xF7, 0xC0, 0x03, 0xE7, 0xC0, 0x03, 0xE7, + 0xC0, 0x03, 0xE3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC1, + 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, + 0xF8, 0x1F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x3E, 0x00, 0x7C, 0x3E, 0x00, + 0x7E, 0x3E, 0x00, 0x3E, 0x7C, 0x00, 0x3E, 0x7C, 0x00, 0x3F, 0x7C, 0x00, + 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xF8, + 0x07, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, + 0x80, 0x3E, 0xF8, 0x07, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, + 0xFF, 0xFF, 0xCF, 0x80, 0x7E, 0xF8, 0x01, 0xEF, 0x80, 0x1F, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xEF, 0xFF, + 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC3, 0xF8, 0x1F, 0x87, 0xE0, 0x1F, 0x9F, + 0x80, 0x1F, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x7D, 0xF0, 0x00, + 0xFB, 0xF0, 0x03, 0xF3, 0xF0, 0x0F, 0xC7, 0xF0, 0x3F, 0x87, 0xFF, 0xFE, + 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x01, 0xFE, 0x00, 0xFF, 0xFC, 0x07, + 0xFF, 0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x8F, 0x80, 0xFE, 0x7C, 0x01, + 0xF3, 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x01, 0xF7, 0xC0, 0x07, 0xFE, + 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x03, + 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7D, 0xF0, + 0x03, 0xEF, 0x80, 0x3E, 0x7C, 0x07, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, + 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, + 0xFF, 0x7F, 0xFF, 0xEF, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7F, 0xFF, 0xCF, 0xFF, + 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, + 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0xFF, 0xEF, 0xFF, 0xF7, + 0xFF, 0xFB, 0xFF, 0xFD, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, + 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF, + 0xF8, 0x0F, 0xFF, 0xFC, 0x1F, 0xC0, 0xFE, 0x3F, 0x00, 0x7E, 0x7E, 0x00, + 0x3F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xF8, 0x03, + 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, + 0x1F, 0x7E, 0x00, 0x3F, 0x3F, 0x00, 0x7F, 0x1F, 0xC1, 0xFF, 0x0F, 0xFF, + 0xFF, 0x07, 0xFF, 0xE7, 0x03, 0xFF, 0xC7, 0x00, 0xFF, 0x07, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, + 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, + 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, + 0xF8, 0x1F, 0xFC, 0x3F, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, + 0xF8, 0x01, 0xFB, 0xE0, 0x0F, 0xCF, 0x80, 0x7E, 0x3E, 0x03, 0xF0, 0xF8, + 0x1F, 0x83, 0xE0, 0xFC, 0x0F, 0x87, 0xE0, 0x3E, 0x3F, 0x00, 0xF8, 0xF8, + 0x03, 0xE7, 0xE0, 0x0F, 0xBF, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xF0, 0x03, + 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x3F, 0xBF, 0x00, 0xFC, 0x7E, 0x03, 0xE0, + 0xFC, 0x0F, 0x81, 0xF8, 0x3E, 0x07, 0xE0, 0xF8, 0x0F, 0xC3, 0xE0, 0x1F, + 0x8F, 0x80, 0x7F, 0x3E, 0x00, 0xFC, 0xF8, 0x01, 0xFB, 0xE0, 0x03, 0xF0, + 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, + 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0xFF, + 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFB, 0xC3, 0xDF, 0xFB, + 0xC3, 0xDF, 0xFB, 0xC3, 0xDF, 0xFB, 0xC3, 0xDF, 0xF9, 0xC7, 0xDF, 0xF9, + 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF8, + 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, + 0x7F, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, + 0x3E, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x1F, + 0xFF, 0x01, 0xFF, 0xF0, 0x1F, 0xFF, 0x81, 0xFF, 0xF8, 0x1F, 0xFF, 0xC1, + 0xFF, 0xBC, 0x1F, 0xFB, 0xE1, 0xFF, 0x9F, 0x1F, 0xF9, 0xF1, 0xFF, 0x8F, + 0x9F, 0xF8, 0x79, 0xFF, 0x87, 0xDF, 0xF8, 0x3D, 0xFF, 0x83, 0xFF, 0xF8, + 0x1F, 0xFF, 0x81, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF, 0xF8, 0x07, 0xFF, + 0x80, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x1F, 0x00, 0x7F, 0x00, 0x01, 0xFF, + 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFC, 0x1F, 0xC1, 0xF8, + 0x03, 0xF1, 0xF8, 0x00, 0xFC, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x7C, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, + 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x0F, + 0xBE, 0x00, 0x0F, 0x9F, 0x00, 0x07, 0xCF, 0xC0, 0x07, 0xE3, 0xF0, 0x07, + 0xE0, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, + 0x7F, 0xFF, 0xEF, 0x80, 0xFF, 0xF0, 0x0F, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, + 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x1F, 0xFC, 0x07, 0xEF, 0xFF, 0xFD, + 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 0xFF, 0xE0, 0xF8, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, + 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, + 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFC, 0x1F, 0xC1, 0xF8, + 0x03, 0xF1, 0xF8, 0x00, 0xFC, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x7C, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, + 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x01, 0x0F, + 0xBE, 0x01, 0xCF, 0x9F, 0x01, 0xFF, 0xCF, 0xC0, 0x7F, 0xE3, 0xF0, 0x1F, + 0xE0, 0xFE, 0x0F, 0xF0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFE, 0x03, 0xFF, + 0xEF, 0x80, 0x3F, 0xC3, 0x80, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0xFF, + 0xFE, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xCF, 0x80, 0x3F, 0x7C, 0x00, 0xFB, + 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x01, 0xF7, 0xC0, 0x0F, 0x3E, 0x00, + 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC3, 0xFF, 0xFF, 0x1F, + 0x00, 0xFC, 0xF8, 0x03, 0xE7, 0xC0, 0x1F, 0x3E, 0x00, 0xF9, 0xF0, 0x07, + 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF3, 0xE0, 0x0F, 0x9F, 0x00, 0x7C, 0xF8, + 0x03, 0xF7, 0xC0, 0x0F, 0xC0, 0x07, 0xF8, 0x01, 0xFF, 0xF0, 0x3F, 0xFF, + 0x87, 0xFF, 0xFC, 0x7E, 0x0F, 0xCF, 0xC0, 0x7E, 0xF8, 0x03, 0xEF, 0x80, + 0x3E, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x3F, + 0xFF, 0x81, 0xFF, 0xFC, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0x00, 0x03, 0xF0, + 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xFF, 0xE0, 0x7E, + 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x3F, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x03, 0xE0, + 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, + 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, + 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x3F, 0xFF, 0xC3, 0xFF, 0xFC, + 0x0F, 0xFF, 0x00, 0x3F, 0xC0, 0xF8, 0x00, 0xFB, 0xE0, 0x03, 0xE7, 0xC0, + 0x1F, 0x9F, 0x00, 0x7C, 0x7C, 0x01, 0xF0, 0xF8, 0x07, 0xC3, 0xE0, 0x3E, + 0x0F, 0x80, 0xF8, 0x1E, 0x03, 0xE0, 0x7C, 0x1F, 0x01, 0xF0, 0x7C, 0x03, + 0xC1, 0xF0, 0x0F, 0x87, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x01, 0xE3, + 0xC0, 0x07, 0xCF, 0x00, 0x1F, 0x7C, 0x00, 0x3D, 0xE0, 0x00, 0xFF, 0x80, + 0x03, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, + 0xF8, 0x00, 0x03, 0xE0, 0x00, 0xF8, 0x07, 0xC0, 0x3F, 0xF8, 0x07, 0xE0, + 0x3E, 0xFC, 0x07, 0xE0, 0x3E, 0x7C, 0x0F, 0xE0, 0x3E, 0x7C, 0x0F, 0xE0, + 0x7E, 0x7C, 0x0F, 0xE0, 0x7C, 0x7C, 0x0F, 0xF0, 0x7C, 0x3E, 0x0F, 0xF0, + 0x7C, 0x3E, 0x1E, 0xF0, 0x78, 0x3E, 0x1E, 0x70, 0xF8, 0x1E, 0x1E, 0x70, + 0xF8, 0x1E, 0x1E, 0x78, 0xF8, 0x1F, 0x1E, 0x78, 0xF0, 0x1F, 0x3C, 0x78, + 0xF0, 0x0F, 0x3C, 0x39, 0xF0, 0x0F, 0x3C, 0x3D, 0xF0, 0x0F, 0x3C, 0x3D, + 0xE0, 0x0F, 0xBC, 0x3D, 0xE0, 0x07, 0xF8, 0x3D, 0xE0, 0x07, 0xF8, 0x1F, + 0xE0, 0x07, 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, + 0xC0, 0x03, 0xF0, 0x0F, 0x80, 0x03, 0xF0, 0x0F, 0x80, 0x01, 0xF0, 0x0F, + 0x80, 0xFE, 0x01, 0xF9, 0xF8, 0x07, 0xE3, 0xF0, 0x3F, 0x0F, 0xC0, 0xF8, + 0x1F, 0x87, 0xE0, 0x7E, 0x3F, 0x00, 0xFC, 0xFC, 0x01, 0xF7, 0xE0, 0x07, + 0xFF, 0x00, 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0xFC, + 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0x00, + 0x1F, 0x7E, 0x00, 0xFC, 0xF8, 0x03, 0xE3, 0xF0, 0x1F, 0x87, 0xC0, 0x7C, + 0x1F, 0x83, 0xF0, 0x3F, 0x1F, 0x80, 0xFC, 0x7E, 0x01, 0xFB, 0xF0, 0x07, + 0xF0, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0x9F, 0x00, 0xFC, 0xFC, 0x07, 0xC3, + 0xE0, 0x7E, 0x1F, 0x83, 0xE0, 0x7C, 0x1F, 0x03, 0xF1, 0xF0, 0x0F, 0x8F, + 0x80, 0x7E, 0xF8, 0x01, 0xF7, 0xC0, 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, + 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x7E, 0x00, 0x1F, + 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF8, + 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00, + 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, + 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x38, 0x06, + 0x01, 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, 0x0C, 0x03, 0x80, + 0x60, 0x18, 0x07, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, 0xFF, + 0xFF, 0xFF, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, + 0x0F, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x1E, + 0x78, 0x1E, 0x78, 0x1E, 0x70, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0x07, 0xF8, 0x07, + 0xFF, 0x83, 0xFF, 0xF1, 0xFF, 0xFE, 0x7C, 0x1F, 0xBE, 0x03, 0xE0, 0x00, + 0xF8, 0x01, 0xFE, 0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xF8, 0xFB, 0xF0, 0x3E, + 0xF8, 0x0F, 0xBE, 0x07, 0xEF, 0xC3, 0xFB, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F, + 0xFB, 0xF1, 0xF8, 0xFC, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE7, 0xE0, 0xFB, 0xFC, + 0x3F, 0xFF, 0xCF, 0xFF, 0xF3, 0xF8, 0x7E, 0xFC, 0x0F, 0xBF, 0x03, 0xFF, + 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0, + 0x3F, 0xFC, 0x0F, 0xBF, 0x87, 0xEF, 0xFF, 0xF3, 0xFF, 0xFC, 0xFB, 0xFC, + 0x3E, 0x7E, 0x00, 0x03, 0xF0, 0x07, 0xFE, 0x0F, 0xFF, 0x87, 0xFF, 0xE7, + 0xE1, 0xFB, 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0xFB, 0xE0, 0x7D, 0xF8, 0x7E, 0x7F, + 0xFE, 0x3F, 0xFE, 0x0F, 0xFE, 0x00, 0xFC, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, + 0xF8, 0x1F, 0x1F, 0x0F, 0xFB, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0x8F, + 0xF7, 0xC0, 0x7F, 0xF8, 0x0F, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, + 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFE, 0x03, 0xF7, 0xC0, 0x7E, 0xFC, 0x3F, + 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFB, 0xE0, 0xFC, 0x7C, 0x07, 0xE0, + 0x07, 0xFE, 0x03, 0xFF, 0xE0, 0xFF, 0xF8, 0x7E, 0x1F, 0x1F, 0x03, 0xCF, + 0x80, 0xFB, 0xE0, 0x1E, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0xE0, + 0x00, 0xF8, 0x00, 0x3F, 0x03, 0xE7, 0xE1, 0xF9, 0xFF, 0xFC, 0x3F, 0xFE, + 0x07, 0xFF, 0x00, 0x7F, 0x00, 0x0F, 0xC7, 0xF3, 0xFC, 0xFF, 0x3E, 0x0F, + 0x83, 0xE3, 0xFE, 0xFF, 0xBF, 0xE3, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, + 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, + 0x0F, 0x80, 0x07, 0xC7, 0xC3, 0xFD, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF, 0x7E, + 0x1F, 0xDF, 0x03, 0xFF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, + 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xDF, 0x03, 0xF7, 0xE1, 0xFD, + 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 0xFD, 0xF0, 0x7C, 0x7C, 0x00, 0x1F, 0x00, + 0x07, 0xFF, 0x03, 0xF7, 0xE1, 0xF9, 0xFF, 0xFC, 0x3F, 0xFE, 0x01, 0xFE, + 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, + 0xC0, 0x03, 0xE0, 0x01, 0xF1, 0xF0, 0xFB, 0xFE, 0x7F, 0xFF, 0xBF, 0xFF, + 0xDF, 0xC3, 0xFF, 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, + 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, + 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xC0, 0xFF, 0xFF, 0xF0, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x3E, 0x7C, 0xF9, 0xF0, 0x00, 0x00, 0x1F, 0x3E, 0x7C, 0xF9, + 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, + 0x7C, 0xF9, 0xF3, 0xFF, 0xFF, 0xFE, 0xF8, 0xF8, 0x00, 0x7C, 0x00, 0x3E, + 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x3E, + 0xF8, 0x3E, 0x7C, 0x3F, 0x3E, 0x3F, 0x1F, 0x3F, 0x0F, 0x9F, 0x07, 0xDF, + 0x03, 0xFF, 0x81, 0xFF, 0xC0, 0xFF, 0xF0, 0x7F, 0xF8, 0x3F, 0x7E, 0x1F, + 0x1F, 0x0F, 0x87, 0xC7, 0xC3, 0xF3, 0xE0, 0xF9, 0xF0, 0x7E, 0xF8, 0x1F, + 0x7C, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0xF8, 0x3F, 0x1F, + 0x7F, 0x9F, 0xF3, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xC3, 0xF8, + 0x7F, 0xF8, 0x3F, 0x07, 0xFE, 0x07, 0xC0, 0xFF, 0xC0, 0xF8, 0x1F, 0xF8, + 0x1F, 0x03, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, 0xFC, 0x0F, 0x81, + 0xFF, 0x81, 0xF0, 0x3F, 0xF0, 0x3E, 0x07, 0xFE, 0x07, 0xC0, 0xFF, 0xC0, + 0xF8, 0x1F, 0xF8, 0x1F, 0x03, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, + 0x80, 0xF8, 0xF8, 0x7D, 0xFF, 0x3F, 0xFF, 0xDF, 0xFF, 0xEF, 0xE1, 0xFF, + 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, + 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, + 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xE0, 0x03, 0xF8, 0x01, 0xFF, 0xC0, 0x7F, + 0xFC, 0x1F, 0xFF, 0xC7, 0xF0, 0xFC, 0xF8, 0x0F, 0xBF, 0x01, 0xFF, 0xC0, + 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0xC0, + 0x7E, 0xF8, 0x0F, 0x9F, 0x87, 0xF1, 0xFF, 0xFC, 0x1F, 0xFF, 0x01, 0xFF, + 0xC0, 0x0F, 0xE0, 0x00, 0xF8, 0xF8, 0x3E, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, + 0xFC, 0xFE, 0x1F, 0xBF, 0x03, 0xEF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8, 0x07, + 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xFF, 0x03, 0xEF, + 0xE1, 0xFB, 0xFF, 0xFC, 0xFF, 0xFF, 0x3E, 0xFF, 0x0F, 0x8F, 0x83, 0xE0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0xE3, 0xE1, 0xFF, 0x7C, 0x7F, 0xFF, 0x9F, 0xFF, + 0xF7, 0xF1, 0xFE, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, + 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0xC0, 0x7E, 0xF8, 0x0F, + 0xDF, 0x83, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE1, 0xFF, 0x7C, 0x1F, 0x8F, + 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, + 0x00, 0x03, 0xE0, 0x00, 0x7C, 0xF8, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xE1, + 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, + 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, + 0x0F, 0xFF, 0x87, 0xFF, 0xE7, 0xE1, 0xF3, 0xE0, 0x79, 0xF8, 0x00, 0xFF, + 0x80, 0x3F, 0xFC, 0x1F, 0xFF, 0x83, 0xFF, 0xC0, 0x3F, 0xF0, 0x01, 0xFF, + 0xC0, 0x7D, 0xF0, 0x7E, 0xFF, 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0x01, 0xFE, + 0x00, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0x3E, 0x1F, + 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xF3, + 0xF8, 0xFC, 0x3E, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, + 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, + 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xF0, 0xFF, 0xFF, + 0xFF, 0x7F, 0xFF, 0x9F, 0xF7, 0xC7, 0xE3, 0xE0, 0x7C, 0x07, 0xCF, 0x80, + 0xF9, 0xF0, 0x1F, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x7C, 0x1F, 0x07, 0x83, + 0xC0, 0xF8, 0xF8, 0x1F, 0x1F, 0x01, 0xE3, 0xC0, 0x3E, 0x78, 0x07, 0xDF, + 0x00, 0x7B, 0xC0, 0x0F, 0xF8, 0x01, 0xFF, 0x00, 0x1F, 0xC0, 0x03, 0xF8, + 0x00, 0x7F, 0x00, 0x07, 0xC0, 0x00, 0xFC, 0x1F, 0x03, 0xEF, 0x83, 0xE0, + 0x7D, 0xF0, 0x7E, 0x1F, 0x3E, 0x0F, 0xC3, 0xE3, 0xC3, 0xF8, 0x7C, 0x7C, + 0x7F, 0x0F, 0x0F, 0x8F, 0xF3, 0xE1, 0xF1, 0xDE, 0x7C, 0x1E, 0x7B, 0xCF, + 0x83, 0xEF, 0x39, 0xE0, 0x7D, 0xE7, 0x3C, 0x07, 0xB8, 0xFF, 0x80, 0xF7, + 0x1F, 0xE0, 0x1F, 0xE3, 0xFC, 0x03, 0xFC, 0x3F, 0x80, 0x3F, 0x07, 0xF0, + 0x07, 0xE0, 0xFC, 0x00, 0xFC, 0x1F, 0x80, 0x0F, 0x83, 0xF0, 0x00, 0xFC, + 0x1F, 0x9F, 0x07, 0xE7, 0xE3, 0xF0, 0xF8, 0xF8, 0x1F, 0x7E, 0x07, 0xDF, + 0x00, 0xFF, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0x00, 0xF8, 0x00, 0x7F, 0x00, + 0x3F, 0xE0, 0x0F, 0xF8, 0x07, 0xDF, 0x03, 0xF7, 0xE0, 0xF8, 0xF8, 0x7E, + 0x3F, 0x1F, 0x07, 0xEF, 0xC0, 0xF8, 0x7C, 0x03, 0xEF, 0x80, 0xF9, 0xF8, + 0x1F, 0x1F, 0x03, 0xE3, 0xE0, 0xF8, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, + 0x78, 0x0F, 0x1F, 0x01, 0xF3, 0xC0, 0x3E, 0x78, 0x03, 0xDF, 0x00, 0x7F, + 0xC0, 0x0F, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, + 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x07, 0xF8, + 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x03, 0xE0, 0x00, 0x7F, 0xFE, 0x7F, 0xFE, + 0x7F, 0xFE, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, + 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, + 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x87, + 0xC7, 0xE3, 0xF1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, + 0xE0, 0xF0, 0xF9, 0xF8, 0xF0, 0x7E, 0x0F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, + 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xFC, 0x7E, 0x1F, 0x07, 0x80, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE0, 0xF0, 0x7C, 0x3E, 0x1F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, + 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x1F, 0x83, 0xC7, 0xE7, 0xC3, + 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC7, 0xE3, 0xE1, + 0xF0, 0xF0, 0x00, 0x3C, 0x00, 0xFE, 0x0F, 0xFE, 0x1E, 0x1F, 0xFC, 0x0F, + 0xC0, 0x0F, 0x00}; + +const GFXglyph FreeSansBold18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 10, 0, 1}, // 0x20 ' ' + {0, 5, 25, 12, 4, -24}, // 0x21 '!' + {16, 13, 9, 17, 2, -25}, // 0x22 '"' + {31, 20, 24, 19, 0, -23}, // 0x23 '#' + {91, 19, 29, 19, 0, -25}, // 0x24 '$' + {160, 29, 25, 31, 1, -24}, // 0x25 '%' + {251, 22, 25, 25, 2, -24}, // 0x26 '&' + {320, 5, 9, 9, 2, -25}, // 0x27 ''' + {326, 9, 33, 12, 1, -25}, // 0x28 '(' + {364, 9, 33, 12, 1, -25}, // 0x29 ')' + {402, 12, 11, 14, 0, -25}, // 0x2A '*' + {419, 16, 16, 20, 2, -15}, // 0x2B '+' + {451, 5, 11, 9, 2, -4}, // 0x2C ',' + {458, 9, 4, 12, 1, -10}, // 0x2D '-' + {463, 5, 5, 9, 2, -4}, // 0x2E '.' + {467, 9, 25, 10, 0, -24}, // 0x2F '/' + {496, 17, 25, 19, 1, -24}, // 0x30 '0' + {550, 10, 25, 19, 3, -24}, // 0x31 '1' + {582, 17, 25, 19, 1, -24}, // 0x32 '2' + {636, 17, 25, 19, 1, -24}, // 0x33 '3' + {690, 16, 25, 19, 2, -24}, // 0x34 '4' + {740, 17, 25, 19, 1, -24}, // 0x35 '5' + {794, 18, 25, 19, 1, -24}, // 0x36 '6' + {851, 17, 25, 19, 1, -24}, // 0x37 '7' + {905, 17, 25, 19, 1, -24}, // 0x38 '8' + {959, 17, 25, 19, 1, -24}, // 0x39 '9' + {1013, 5, 18, 9, 2, -17}, // 0x3A ':' + {1025, 5, 24, 9, 2, -17}, // 0x3B ';' + {1040, 18, 17, 20, 1, -16}, // 0x3C '<' + {1079, 17, 12, 20, 2, -13}, // 0x3D '=' + {1105, 18, 17, 20, 1, -16}, // 0x3E '>' + {1144, 18, 26, 21, 2, -25}, // 0x3F '?' + {1203, 32, 31, 34, 1, -25}, // 0x40 '@' + {1327, 24, 26, 24, 0, -25}, // 0x41 'A' + {1405, 20, 26, 25, 3, -25}, // 0x42 'B' + {1470, 23, 26, 25, 1, -25}, // 0x43 'C' + {1545, 21, 26, 25, 3, -25}, // 0x44 'D' + {1614, 19, 26, 23, 3, -25}, // 0x45 'E' + {1676, 17, 26, 22, 3, -25}, // 0x46 'F' + {1732, 24, 26, 27, 1, -25}, // 0x47 'G' + {1810, 20, 26, 26, 3, -25}, // 0x48 'H' + {1875, 5, 26, 11, 3, -25}, // 0x49 'I' + {1892, 16, 26, 20, 1, -25}, // 0x4A 'J' + {1944, 22, 26, 25, 3, -25}, // 0x4B 'K' + {2016, 17, 26, 22, 3, -25}, // 0x4C 'L' + {2072, 24, 26, 30, 3, -25}, // 0x4D 'M' + {2150, 20, 26, 26, 3, -25}, // 0x4E 'N' + {2215, 25, 26, 27, 1, -25}, // 0x4F 'O' + {2297, 19, 26, 24, 3, -25}, // 0x50 'P' + {2359, 25, 27, 27, 1, -25}, // 0x51 'Q' + {2444, 21, 26, 25, 3, -25}, // 0x52 'R' + {2513, 20, 26, 24, 2, -25}, // 0x53 'S' + {2578, 19, 26, 23, 2, -25}, // 0x54 'T' + {2640, 20, 26, 26, 3, -25}, // 0x55 'U' + {2705, 22, 26, 23, 1, -25}, // 0x56 'V' + {2777, 32, 26, 34, 1, -25}, // 0x57 'W' + {2881, 22, 26, 24, 1, -25}, // 0x58 'X' + {2953, 21, 26, 22, 1, -25}, // 0x59 'Y' + {3022, 19, 26, 21, 1, -25}, // 0x5A 'Z' + {3084, 8, 33, 12, 2, -25}, // 0x5B '[' + {3117, 10, 25, 10, 0, -24}, // 0x5C '\' + {3149, 8, 33, 12, 1, -25}, // 0x5D ']' + {3182, 16, 15, 20, 2, -23}, // 0x5E '^' + {3212, 21, 3, 19, -1, 5}, // 0x5F '_' + {3220, 7, 5, 9, 1, -25}, // 0x60 '`' + {3225, 18, 19, 20, 1, -18}, // 0x61 'a' + {3268, 18, 26, 22, 2, -25}, // 0x62 'b' + {3327, 17, 19, 20, 1, -18}, // 0x63 'c' + {3368, 19, 26, 22, 1, -25}, // 0x64 'd' + {3430, 18, 19, 20, 1, -18}, // 0x65 'e' + {3473, 10, 26, 12, 1, -25}, // 0x66 'f' + {3506, 18, 26, 21, 1, -18}, // 0x67 'g' + {3565, 17, 26, 21, 2, -25}, // 0x68 'h' + {3621, 5, 26, 10, 2, -25}, // 0x69 'i' + {3638, 7, 33, 10, 0, -25}, // 0x6A 'j' + {3667, 17, 26, 20, 2, -25}, // 0x6B 'k' + {3723, 5, 26, 9, 2, -25}, // 0x6C 'l' + {3740, 27, 19, 31, 2, -18}, // 0x6D 'm' + {3805, 17, 19, 21, 2, -18}, // 0x6E 'n' + {3846, 19, 19, 21, 1, -18}, // 0x6F 'o' + {3892, 18, 26, 22, 2, -18}, // 0x70 'p' + {3951, 19, 26, 22, 1, -18}, // 0x71 'q' + {4013, 11, 19, 14, 2, -18}, // 0x72 'r' + {4040, 17, 19, 19, 1, -18}, // 0x73 's' + {4081, 9, 23, 12, 1, -22}, // 0x74 't' + {4107, 17, 19, 21, 2, -18}, // 0x75 'u' + {4148, 19, 19, 19, 0, -18}, // 0x76 'v' + {4194, 27, 19, 27, 0, -18}, // 0x77 'w' + {4259, 18, 19, 19, 1, -18}, // 0x78 'x' + {4302, 19, 26, 19, 0, -18}, // 0x79 'y' + {4364, 16, 19, 18, 1, -18}, // 0x7A 'z' + {4402, 9, 33, 14, 1, -25}, // 0x7B '{' + {4440, 3, 33, 10, 4, -25}, // 0x7C '|' + {4453, 9, 33, 14, 3, -25}, // 0x7D '}' + {4491, 15, 6, 18, 1, -10}}; // 0x7E '~' + +const GFXfont FreeSansBold18pt7b PROGMEM = { + (uint8_t *)FreeSansBold18pt7bBitmaps, (GFXglyph *)FreeSansBold18pt7bGlyphs, + 0x20, 0x7E, 42}; + +// Approx. 5175 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h new file mode 100644 index 0000000..5dd7a54 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h @@ -0,0 +1,786 @@ +#pragma once +#include + +const uint8_t FreeSansBold24pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xC7, 0x0E, 0x1C, 0x00, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, + 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFD, 0xF0, 0x3E, + 0x7C, 0x0F, 0x9F, 0x03, 0xE3, 0x80, 0x70, 0xE0, 0x1C, 0x00, 0xF8, 0x3E, + 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, + 0x7C, 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC1, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, + 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x1F, 0x00, 0x1F, 0x07, + 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, 0x03, 0xFF, + 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, + 0xFF, 0xFF, 0xFC, 0x0F, 0x87, 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, + 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC3, 0xE0, 0x03, 0xE0, + 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0x73, 0xFE, 0x7F, 0x38, + 0xFF, 0x3F, 0x1C, 0x3F, 0xDF, 0x8E, 0x0F, 0xEF, 0xC7, 0x07, 0xF7, 0xE3, + 0x80, 0x03, 0xF9, 0xC0, 0x01, 0xFE, 0xE0, 0x00, 0x7F, 0xF0, 0x00, 0x3F, + 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x80, + 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0xE7, 0xFC, 0x00, 0x71, 0xFF, + 0x00, 0x38, 0x7F, 0xFF, 0x1C, 0x1F, 0xFF, 0x8E, 0x0F, 0xFF, 0xC7, 0x07, + 0xFF, 0xE3, 0x87, 0xFB, 0xF9, 0xC3, 0xF9, 0xFE, 0xE7, 0xFC, 0x7F, 0xFF, + 0xFC, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x00, 0x3F, + 0xE0, 0x00, 0x03, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0x70, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x00, 0x1F, 0xF0, 0x00, 0x78, 0x00, + 0x7F, 0xF8, 0x01, 0xE0, 0x01, 0xFF, 0xF0, 0x03, 0xC0, 0x07, 0xFF, 0xF0, + 0x0F, 0x00, 0x0F, 0x83, 0xE0, 0x1E, 0x00, 0x3E, 0x03, 0xE0, 0x78, 0x00, + 0x78, 0x03, 0xC0, 0xF0, 0x00, 0xF0, 0x07, 0x83, 0xC0, 0x01, 0xE0, 0x0F, + 0x07, 0x80, 0x03, 0xE0, 0x3E, 0x1E, 0x00, 0x03, 0xE0, 0xF8, 0x3C, 0x00, + 0x07, 0xFF, 0xF0, 0xF0, 0x00, 0x07, 0xFF, 0xC1, 0xE0, 0x00, 0x07, 0xFF, + 0x07, 0x80, 0x00, 0x07, 0xFC, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0xFF, 0x80, 0x00, + 0x07, 0x87, 0xFF, 0xC0, 0x00, 0x0F, 0x0F, 0xFF, 0x80, 0x00, 0x3C, 0x3F, + 0xFF, 0x80, 0x00, 0x78, 0xFC, 0x1F, 0x00, 0x01, 0xE1, 0xF0, 0x1F, 0x00, + 0x03, 0xC3, 0xC0, 0x1E, 0x00, 0x0F, 0x07, 0x80, 0x3C, 0x00, 0x1E, 0x0F, + 0x00, 0x78, 0x00, 0x78, 0x1F, 0x01, 0xF0, 0x00, 0xF0, 0x1F, 0x07, 0xC0, + 0x03, 0xC0, 0x3F, 0xFF, 0x80, 0x07, 0x80, 0x3F, 0xFE, 0x00, 0x1E, 0x00, + 0x7F, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0xE0, 0x00, 0xF0, 0x00, 0x1F, 0x00, + 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, + 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xCF, 0xC0, 0x00, 0xFE, + 0x1F, 0x00, 0x03, 0xF8, 0x7C, 0x00, 0x0F, 0xE1, 0xF0, 0x00, 0x3F, 0xC7, + 0xC0, 0x00, 0x7F, 0x3E, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xC0, + 0x00, 0x07, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x07, 0xFF, 0x03, 0xE0, 0x3F, 0xFE, 0x0F, 0x83, 0xFF, 0xF8, 0x3E, 0x1F, + 0xF3, 0xF1, 0xF8, 0x7F, 0x07, 0xE7, 0xE3, 0xFC, 0x1F, 0xFF, 0x0F, 0xE0, + 0x3F, 0xFC, 0x3F, 0x80, 0x7F, 0xF0, 0xFE, 0x01, 0xFF, 0x83, 0xF8, 0x03, + 0xFE, 0x0F, 0xF0, 0x0F, 0xF0, 0x3F, 0xE0, 0x7F, 0xE0, 0x7F, 0xC3, 0xFF, + 0xC1, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFB, 0xFC, + 0x0F, 0xFF, 0xC7, 0xF8, 0x1F, 0xFE, 0x0F, 0xE0, 0x0F, 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x7C, 0xF8, 0xE1, 0xC0, 0x00, + 0xF0, 0x0F, 0x80, 0xF8, 0x07, 0xC0, 0x7C, 0x07, 0xE0, 0x3E, 0x03, 0xF0, + 0x1F, 0x80, 0xF8, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, + 0xC0, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, + 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x00, 0xF8, 0x07, 0xE0, 0x3F, 0x01, + 0xF8, 0x07, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xC0, 0x3F, 0x00, 0xF8, 0x07, + 0xE0, 0x1F, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xE0, 0x78, + 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, + 0x0F, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, + 0x7E, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, + 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xE0, 0x3F, 0x01, 0xF8, + 0x0F, 0xC0, 0x7C, 0x07, 0xE0, 0x3F, 0x01, 0xF0, 0x1F, 0x80, 0xF8, 0x0F, + 0xC0, 0x7C, 0x07, 0xE0, 0x3E, 0x03, 0xF0, 0x1F, 0x01, 0xF0, 0x00, 0x03, + 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x06, 0x38, 0xDF, 0xFF, 0xFF, 0xFF, + 0x9F, 0xFE, 0x07, 0xC0, 0x1F, 0xC0, 0x3F, 0x80, 0xF7, 0x83, 0xC7, 0x87, + 0x8F, 0x02, 0x08, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, + 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, + 0x00, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x87, 0x0E, 0x1C, 0x78, 0xEF, 0xDF, 0x38, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, + 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x38, + 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, + 0xE0, 0x07, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x70, + 0x03, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, + 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x1F, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x3F, 0xC3, 0xFC, 0x7F, 0x81, 0xFE, 0x7F, + 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x7F, + 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x81, 0xFE, 0x3F, + 0xC3, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x0F, + 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0x3C, 0x01, 0xF0, + 0x07, 0xC0, 0x3F, 0x01, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, + 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, + 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, + 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x01, 0xFE, 0x00, 0x0F, 0xFF, 0x80, + 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x9F, + 0xE0, 0xFF, 0x7F, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, + 0x03, 0xFF, 0xF0, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, + 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x00, 0x01, + 0xFC, 0x00, 0x03, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, + 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x01, 0xFE, 0x00, 0x0F, + 0xFF, 0x80, 0x7F, 0xFF, 0x81, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F, 0xFF, + 0xFF, 0x1F, 0xE1, 0xFF, 0x7F, 0x81, 0xFE, 0xFE, 0x01, 0xFD, 0xFC, 0x03, + 0xFB, 0xF8, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7F, + 0x00, 0x01, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0xC0, + 0x00, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0xC0, + 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, + 0x07, 0xFF, 0xF8, 0x0F, 0xF7, 0xF8, 0x3F, 0xCF, 0xFF, 0xFF, 0x9F, 0xFF, + 0xFE, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x07, 0xF8, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, + 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x7B, 0xF8, 0x01, + 0xEF, 0xE0, 0x0F, 0x3F, 0x80, 0x78, 0xFE, 0x01, 0xE3, 0xF8, 0x0F, 0x0F, + 0xE0, 0x38, 0x3F, 0x81, 0xE0, 0xFE, 0x07, 0x03, 0xF8, 0x3C, 0x0F, 0xE1, + 0xE0, 0x3F, 0x87, 0x00, 0xFE, 0x3C, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, + 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x1F, 0xFF, 0xFC, 0x3F, + 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0x8F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xF1, 0xF8, 0x03, 0xEF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, + 0x1F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC, 0xFE, 0x07, 0xFC, 0x00, 0x07, 0xF8, + 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, + 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xF8, + 0x0F, 0xF7, 0xF8, 0x3F, 0xEF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x0F, 0xFF, + 0xFC, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x00, 0xFF, + 0x00, 0x07, 0xFF, 0x80, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x81, 0xFF, 0xFF, + 0x87, 0xFF, 0xFF, 0x8F, 0xF0, 0xFF, 0x3F, 0xC0, 0xFE, 0x7F, 0x00, 0x00, + 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE3, 0xF0, 0x1F, + 0xDF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF9, 0xFF, + 0x87, 0xFB, 0xFC, 0x07, 0xF7, 0xF8, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, + 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0x7E, 0x00, 0xFE, 0xFC, 0x01, + 0xFD, 0xFC, 0x07, 0xFB, 0xF8, 0x0F, 0xE3, 0xFC, 0x7F, 0xC7, 0xFF, 0xFF, + 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0x80, + 0x03, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0x00, + 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, + 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, + 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0, + 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, + 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x7F, 0x83, 0xFC, 0x7F, + 0x00, 0xFC, 0x7E, 0x00, 0xFC, 0x7E, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x7E, + 0x00, 0xFC, 0x3F, 0x00, 0xF8, 0x3F, 0x83, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, + 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0xC3, 0xFC, 0x7F, + 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, + 0x00, 0xFE, 0x7F, 0x83, 0xFE, 0x7F, 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, + 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x3F, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xC3, 0xFC, 0x7F, 0x01, 0xFE, 0xFF, + 0x00, 0xFE, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0x7F, + 0x01, 0xFF, 0x7F, 0xC3, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x07, 0xFE, 0x7F, 0x01, 0xFC, 0x7E, 0x00, + 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0x01, 0xFC, 0x7F, + 0x83, 0xFC, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0x1F, + 0xFF, 0xE0, 0x07, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x1C, 0x38, 0x71, 0xE7, 0xBF, 0x7C, 0xE0, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xF0, 0x01, + 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x7F, 0xFC, + 0x01, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xE0, 0x00, + 0x1F, 0xF8, 0x00, 0x3F, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, + 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xE0, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x80, 0x00, + 0x01, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xFE, 0x00, + 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, + 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xE0, + 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF, + 0xFC, 0x03, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x1E, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFF, 0xC0, 0x1F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, + 0x83, 0xFE, 0x7F, 0x01, 0xFE, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, + 0x01, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, + 0x3F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xE0, + 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, + 0x03, 0xFE, 0x01, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x7F, + 0x80, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x07, 0xF0, 0x00, + 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x3F, 0x00, 0x00, 0x00, + 0x3E, 0x0F, 0xC0, 0x07, 0xE3, 0xC3, 0xE1, 0xF0, 0x03, 0xFE, 0xF8, 0x3C, + 0x7E, 0x01, 0xFF, 0xFF, 0x07, 0x8F, 0x80, 0x7E, 0x1F, 0xC0, 0x7B, 0xF0, + 0x1F, 0x81, 0xF8, 0x0F, 0x7C, 0x03, 0xE0, 0x1F, 0x01, 0xEF, 0x80, 0xF8, + 0x03, 0xC0, 0x3F, 0xF0, 0x1E, 0x00, 0x78, 0x07, 0xFC, 0x07, 0xC0, 0x0F, + 0x00, 0xFF, 0x80, 0xF0, 0x01, 0xE0, 0x1F, 0xF0, 0x1E, 0x00, 0x38, 0x07, + 0xFE, 0x07, 0xC0, 0x0F, 0x00, 0xFF, 0xC0, 0xF8, 0x01, 0xE0, 0x1E, 0xF8, + 0x1F, 0x00, 0x38, 0x07, 0xDF, 0x03, 0xE0, 0x0F, 0x00, 0xF3, 0xF0, 0x7C, + 0x03, 0xE0, 0x3E, 0x3E, 0x0F, 0xC0, 0xFC, 0x0F, 0x87, 0xC0, 0xFC, 0x3F, + 0xC7, 0xF0, 0xFC, 0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xC1, 0xFF, 0xEF, 0xFF, + 0x01, 0xFC, 0x1F, 0xF8, 0xFF, 0x80, 0x1F, 0xC0, 0xFC, 0x07, 0xC0, 0x01, + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x60, 0x00, 0x01, 0xFF, 0xFF, + 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, + 0x0F, 0xF8, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, + 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, + 0x3F, 0xFE, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, + 0x7F, 0x7F, 0x00, 0x00, 0x7E, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x80, 0x00, + 0xFE, 0x3F, 0x80, 0x01, 0xFC, 0x1F, 0x80, 0x01, 0xFC, 0x1F, 0xC0, 0x01, + 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x0F, 0xE0, 0x03, 0xF8, 0x0F, 0xE0, 0x03, + 0xF0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, + 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, 0x1F, + 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, + 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x00, 0xFE, 0x3F, 0x80, 0x00, 0xFE, 0x7F, + 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, + 0x8F, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x3F, 0x80, 0x1F, 0xF7, 0xF0, + 0x01, 0xFE, 0xFE, 0x00, 0x1F, 0xDF, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x7F, + 0x7F, 0x00, 0x1F, 0xCF, 0xE0, 0x07, 0xF9, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, + 0xFF, 0x87, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xE3, + 0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFD, 0xFC, 0x00, + 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, + 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xEF, 0xFF, 0xFF, + 0xFD, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFF, + 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0xFF, 0xC1, 0xFF, 0x81, 0xFF, 0x0F, 0xF8, 0x01, 0xFE, + 0x3F, 0xC0, 0x07, 0xF9, 0xFE, 0x00, 0x0F, 0xE7, 0xF8, 0x00, 0x1F, 0xDF, + 0xC0, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0F, 0xE0, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, + 0x7F, 0x00, 0x01, 0xFD, 0xFC, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x3F, 0xCF, + 0xF0, 0x00, 0xFE, 0x3F, 0xE0, 0x07, 0xF8, 0x7F, 0xE0, 0x7F, 0xC0, 0xFF, + 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, + 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0xFF, 0xFF, 0xC0, + 0x0F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0xFE, 0x00, 0xFF, 0xCF, 0xE0, 0x03, + 0xFC, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, + 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, + 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, + 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, + 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x1F, + 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x0F, 0xFC, 0xFF, + 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF7, + 0xFF, 0xFF, 0xFB, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, + 0x07, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, + 0xFE, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x9F, 0xC0, 0x00, 0x0F, 0xE0, + 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFC, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, + 0x07, 0xFE, 0x03, 0xFF, 0x0F, 0xF0, 0x01, 0xFE, 0x3F, 0xC0, 0x01, 0xFC, + 0x7F, 0x00, 0x01, 0xFD, 0xFE, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, + 0x00, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xC0, + 0x07, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xBF, 0x80, 0x00, 0x3F, 0x7F, 0x00, + 0x00, 0x7E, 0xFF, 0x00, 0x01, 0xFC, 0xFF, 0x00, 0x03, 0xF9, 0xFF, 0x00, + 0x0F, 0xF1, 0xFF, 0x00, 0x3F, 0xE3, 0xFF, 0x83, 0xFF, 0xC3, 0xFF, 0xFF, + 0xFF, 0x83, 0xFF, 0xFF, 0xDF, 0x03, 0xFF, 0xFF, 0x9E, 0x03, 0xFF, 0xFE, + 0x3C, 0x01, 0xFF, 0xF0, 0x78, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x0F, + 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, + 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, + 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, + 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, + 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, + 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, + 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, + 0xFF, 0xC0, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, + 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, + 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, + 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, + 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, + 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0xE0, + 0x1F, 0xFF, 0x80, 0x7F, 0xFE, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xE0, 0x1F, + 0xFF, 0xC0, 0xFF, 0xFF, 0x87, 0xFD, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0xFE, + 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x7F, 0x8F, 0xE0, 0x03, 0xFC, 0x3F, 0x80, + 0x1F, 0xE0, 0xFE, 0x00, 0xFF, 0x83, 0xF8, 0x07, 0xFC, 0x0F, 0xE0, 0x1F, + 0xE0, 0x3F, 0x80, 0xFF, 0x00, 0xFE, 0x07, 0xF8, 0x03, 0xF8, 0x3F, 0xC0, + 0x0F, 0xE1, 0xFE, 0x00, 0x3F, 0x8F, 0xF0, 0x00, 0xFE, 0x7F, 0x80, 0x03, + 0xFB, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, + 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x3F, 0xF7, + 0xF8, 0x00, 0xFF, 0x8F, 0xF0, 0x03, 0xFC, 0x3F, 0xC0, 0x0F, 0xE0, 0x7F, + 0x80, 0x3F, 0x80, 0xFF, 0x00, 0xFE, 0x01, 0xFE, 0x03, 0xF8, 0x07, 0xFC, + 0x0F, 0xE0, 0x0F, 0xF0, 0x3F, 0x80, 0x1F, 0xE0, 0xFE, 0x00, 0x3F, 0xC3, + 0xF8, 0x00, 0xFF, 0x8F, 0xE0, 0x01, 0xFE, 0x3F, 0x80, 0x03, 0xFC, 0xFE, + 0x00, 0x07, 0xFB, 0xF8, 0x00, 0x1F, 0xF0, 0xFE, 0x00, 0x01, 0xFC, 0x00, + 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, + 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, + 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, + 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, + 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, + 0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xE0, 0x03, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFC, + 0x07, 0xFF, 0xFF, 0xBE, 0x03, 0xEF, 0xFF, 0xDF, 0x01, 0xF7, 0xFF, 0xEF, + 0x80, 0xFB, 0xFF, 0xF7, 0xC0, 0xFD, 0xFF, 0xFB, 0xF0, 0x7C, 0xFF, 0xFC, + 0xF8, 0x3E, 0x7F, 0xFE, 0x7C, 0x1F, 0x3F, 0xFF, 0x3E, 0x0F, 0x9F, 0xFF, + 0x9F, 0x8F, 0x8F, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, + 0xF1, 0xF1, 0xF1, 0xFF, 0xF8, 0xFC, 0xF8, 0xFF, 0xFC, 0x3E, 0xF8, 0x7F, + 0xFE, 0x1F, 0x7C, 0x3F, 0xFF, 0x0F, 0xBE, 0x1F, 0xFF, 0x87, 0xDF, 0x0F, + 0xFF, 0xC3, 0xFF, 0x07, 0xFF, 0xE0, 0xFF, 0x83, 0xFF, 0xF0, 0x7F, 0xC1, + 0xFF, 0xF8, 0x3F, 0xE0, 0xFF, 0xFC, 0x1F, 0xF0, 0x7F, 0xFE, 0x07, 0xF0, + 0x3F, 0xFF, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, + 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF0, + 0x07, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xF8, 0x07, 0xFF, 0xEF, 0xC0, 0x7F, + 0xFE, 0xFE, 0x07, 0xFF, 0xE7, 0xE0, 0x7F, 0xFE, 0x7F, 0x07, 0xFF, 0xE3, + 0xF0, 0x7F, 0xFE, 0x1F, 0x87, 0xFF, 0xE1, 0xFC, 0x7F, 0xFE, 0x0F, 0xC7, + 0xFF, 0xE0, 0xFE, 0x7F, 0xFE, 0x07, 0xE7, 0xFF, 0xE0, 0x3F, 0x7F, 0xFE, + 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xE0, 0x0F, + 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, + 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, + 0x0F, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, + 0x80, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, + 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x3F, 0xC0, + 0x0F, 0xF8, 0x3F, 0xC0, 0x01, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, + 0x00, 0x3F, 0xCF, 0xE0, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, 0xF7, 0xF8, + 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFE, + 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, + 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF, + 0xFC, 0x00, 0x01, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x7F, + 0x3F, 0xC0, 0x00, 0x7F, 0x8F, 0xE0, 0x00, 0x3F, 0x87, 0xF8, 0x00, 0x3F, + 0xC1, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, + 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xE0, 0x0F, 0xFB, 0xF8, 0x00, 0xFF, + 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, + 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF8, + 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, + 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x0F, 0xE0, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, + 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x7F, 0xFF, + 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, + 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x3F, 0xC0, 0x07, 0xF8, 0x3F, 0xC0, + 0x01, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, 0x3F, 0xCF, 0xE0, + 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x03, 0xFF, 0xF8, + 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, 0xFF, + 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x21, 0xFE, + 0xFE, 0x00, 0x38, 0xFE, 0x7F, 0x00, 0x3E, 0x7F, 0x3F, 0xC0, 0x3F, 0xFF, + 0x8F, 0xE0, 0x0F, 0xFF, 0x87, 0xF8, 0x03, 0xFF, 0xC1, 0xFE, 0x00, 0xFF, + 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, + 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xCF, 0xC0, 0x01, 0xFF, 0x03, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, + 0xF8, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8, + 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFC, 0xFE, 0x00, 0x3F, 0xEF, 0xE0, + 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, + 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x01, 0xFC, 0xFE, + 0x00, 0x3F, 0xCF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x8F, + 0xE0, 0x07, 0xF8, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, + 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, + 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, + 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0xFF, 0x00, 0xFF, 0xC0, + 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF0, 0x3F, + 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFC, 0x7F, 0xC0, 0xFF, 0xCF, 0xF0, 0x03, + 0xFE, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, + 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x7F, 0xFC, + 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xF0, + 0x07, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, + 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, + 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, + 0x00, 0x0F, 0xE7, 0xFC, 0x03, 0xFE, 0x7F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, + 0x07, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, + 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, + 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, + 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, + 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, + 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, + 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, + 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xBF, 0xC0, 0x1F, 0xE7, 0xFC, 0x07, 0xFC, + 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, + 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03, + 0xFF, 0xF0, 0x00, 0x1F, 0xDF, 0xC0, 0x01, 0xFC, 0xFE, 0x00, 0x0F, 0xE7, + 0xF0, 0x00, 0x7F, 0x1F, 0xC0, 0x03, 0xF0, 0xFE, 0x00, 0x3F, 0x87, 0xF0, + 0x01, 0xFC, 0x1F, 0xC0, 0x0F, 0xC0, 0xFE, 0x00, 0xFE, 0x03, 0xF0, 0x07, + 0xF0, 0x1F, 0x80, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x03, 0xF0, 0x1F, 0xC0, + 0x1F, 0x80, 0xFC, 0x00, 0xFE, 0x07, 0xE0, 0x03, 0xF0, 0x7F, 0x00, 0x1F, + 0x83, 0xF0, 0x00, 0xFE, 0x1F, 0x80, 0x03, 0xF1, 0xF8, 0x00, 0x1F, 0x8F, + 0xC0, 0x00, 0xFC, 0x7E, 0x00, 0x03, 0xF3, 0xE0, 0x00, 0x1F, 0xBF, 0x00, + 0x00, 0xFD, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xFF, + 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0xFF, 0xE0, 0x07, 0xF0, 0x03, 0xFD, + 0xFC, 0x01, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0xE0, 0x0F, 0xE7, 0xF0, + 0x07, 0xFC, 0x01, 0xFC, 0x7F, 0x00, 0xFF, 0x80, 0x7F, 0x8F, 0xE0, 0x1F, + 0xF0, 0x0F, 0xE1, 0xFC, 0x07, 0xFF, 0x01, 0xFC, 0x3F, 0x80, 0xFB, 0xE0, + 0x3F, 0x83, 0xF0, 0x1F, 0x7C, 0x07, 0xE0, 0x7F, 0x03, 0xEF, 0x81, 0xFC, + 0x0F, 0xE0, 0x7D, 0xF0, 0x3F, 0x80, 0xFC, 0x1F, 0x9F, 0x07, 0xF0, 0x1F, + 0x83, 0xE3, 0xE0, 0xFC, 0x03, 0xF0, 0x7C, 0x7C, 0x1F, 0x80, 0x7F, 0x0F, + 0x8F, 0x87, 0xF0, 0x07, 0xE1, 0xF0, 0xF8, 0xFC, 0x00, 0xFC, 0x7E, 0x1F, + 0x1F, 0x80, 0x1F, 0x8F, 0x83, 0xE3, 0xF0, 0x01, 0xF9, 0xF0, 0x7C, 0x7E, + 0x00, 0x3F, 0x3E, 0x0F, 0x9F, 0x80, 0x07, 0xE7, 0xC0, 0xFB, 0xF0, 0x00, + 0xFD, 0xF0, 0x1F, 0x7E, 0x00, 0x0F, 0xBE, 0x03, 0xEF, 0xC0, 0x01, 0xFF, + 0xC0, 0x7D, 0xF0, 0x00, 0x3F, 0xF8, 0x0F, 0xFE, 0x00, 0x03, 0xFF, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x00, 0x0F, 0xF8, 0x03, 0xFE, + 0x00, 0x01, 0xFF, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xE0, 0x07, 0xF8, 0x00, + 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0x07, + 0xE0, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x07, 0xF9, 0xFF, 0x00, 0x3F, 0xC3, + 0xFC, 0x00, 0xFF, 0x07, 0xF8, 0x07, 0xF8, 0x1F, 0xE0, 0x1F, 0xC0, 0x3F, + 0xC0, 0xFF, 0x00, 0xFF, 0x07, 0xF8, 0x01, 0xFE, 0x1F, 0xE0, 0x03, 0xF8, + 0xFF, 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x1F, 0xDF, 0xE0, 0x00, 0x3F, 0xFF, + 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x03, + 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x7F, 0x7F, 0x80, 0x03, 0xF8, + 0xFF, 0x00, 0x1F, 0xE1, 0xFC, 0x00, 0x7F, 0x07, 0xF8, 0x03, 0xFC, 0x0F, + 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0x7F, 0x83, 0xFC, 0x01, 0xFE, + 0x0F, 0xF0, 0x03, 0xFC, 0x7F, 0x80, 0x0F, 0xFB, 0xFE, 0x00, 0x1F, 0xE0, + 0xFF, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x7F, 0x9F, 0xE0, 0x03, 0xFC, 0xFF, + 0x00, 0x3F, 0xC3, 0xFC, 0x01, 0xFE, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x00, + 0xFF, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0x80, 0x3F, 0x83, 0xF8, + 0x01, 0xFC, 0x3F, 0xC0, 0x07, 0xF1, 0xFC, 0x00, 0x3F, 0x8F, 0xE0, 0x00, + 0xFE, 0xFE, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF, + 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, + 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xC0, 0x00, + 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFE, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, + 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, + 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, + 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, + 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x03, 0xC0, 0x07, 0x00, + 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x07, + 0x00, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, + 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xE0, + 0x03, 0x80, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, + 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, + 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, + 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xF0, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xFC, 0x00, + 0x7D, 0xF0, 0x01, 0xF7, 0xC0, 0x0F, 0xDF, 0x80, 0x3E, 0x3E, 0x00, 0xF8, + 0xFC, 0x07, 0xE1, 0xF0, 0x1F, 0x07, 0xC0, 0xFC, 0x1F, 0x83, 0xE0, 0x3E, + 0x0F, 0x80, 0xFC, 0x7E, 0x01, 0xF1, 0xF0, 0x07, 0xC7, 0xC0, 0x1F, 0xBE, + 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x0F, 0x83, 0xC0, 0xF0, 0x38, 0x1E, + 0x01, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, + 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x7F, 0x03, 0xFC, 0x7E, 0x01, 0xFC, + 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0xFC, + 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, 0xC1, 0xFC, 0xFF, 0x01, 0xFC, + 0xFE, 0x01, 0xFC, 0xFE, 0x03, 0xFC, 0xFE, 0x03, 0xFC, 0xFF, 0x07, 0xFC, + 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x3F, 0xFD, 0xFE, + 0x1F, 0xF0, 0xFF, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, + 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x0F, + 0xC0, 0x3F, 0x9F, 0xF8, 0x1F, 0xDF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0xE3, 0xFF, 0xFF, 0xF9, 0xFF, 0x83, 0xFE, 0xFF, 0x80, 0xFF, 0x7F, + 0x80, 0x3F, 0xBF, 0xC0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, + 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, + 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xDF, 0xF0, 0x1F, 0xEF, 0xFC, 0x1F, + 0xF7, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xF8, 0xFE, 0xFF, + 0xF8, 0x7F, 0x3F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x07, + 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0x9F, 0xF0, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x7F, 0xFC, 0x00, + 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0xFD, + 0xFE, 0x03, 0xFB, 0xFE, 0x0F, 0xF3, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x87, + 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, 0x01, 0xFE, 0x00, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, + 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x3F, 0x80, 0x7E, 0x1F, 0xC0, 0xFF, 0xCF, 0xE1, 0xFF, 0xF7, + 0xF1, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0x83, + 0xFF, 0x7F, 0x80, 0xFF, 0xBF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, + 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, + 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0xDF, 0xC0, 0x1F, 0xEF, + 0xF0, 0x1F, 0xF7, 0xFC, 0x1F, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, + 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xBF, 0x81, 0xFF, 0x9F, 0xC0, 0x3F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, + 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xC3, 0xF8, 0x7F, 0x80, 0xFC, 0x7F, 0x00, + 0xFC, 0x7F, 0x00, 0x7C, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7E, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x7F, 0x00, + 0xFE, 0x3F, 0xC1, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, + 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x01, 0xFC, 0x1F, 0xF0, 0xFF, + 0xC3, 0xFF, 0x1F, 0xFC, 0x7F, 0x81, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, + 0x0F, 0xFF, 0xBF, 0xFE, 0xFF, 0xFB, 0xFF, 0xE1, 0xFC, 0x07, 0xF0, 0x1F, + 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, + 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, + 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x07, 0xFE, + 0x7F, 0x0F, 0xFF, 0x7F, 0x1F, 0xFF, 0x7F, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, + 0xFF, 0x7F, 0xC3, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x00, + 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, + 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFF, 0x00, + 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0xC3, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, + 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x07, 0xFE, 0x7F, 0x01, 0xF8, + 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x7F, 0x00, + 0xFF, 0x7F, 0x01, 0xFE, 0x7F, 0xC3, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, + 0xF8, 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, + 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x3F, 0x83, + 0xF8, 0xFF, 0xC7, 0xF7, 0xFF, 0xCF, 0xEF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, + 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x01, 0xFF, 0xFE, 0x01, 0xFF, 0xF8, + 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, + 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, + 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF0, 0x00, + 0x00, 0x00, 0x07, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, + 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, + 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, + 0x1F, 0xC7, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFE, 0xFE, 0x00, + 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, + 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, + 0x00, 0x01, 0xFC, 0x03, 0xFB, 0xF8, 0x0F, 0xE7, 0xF0, 0x3F, 0xCF, 0xE0, + 0xFF, 0x1F, 0xC3, 0xFC, 0x3F, 0x87, 0xF0, 0x7F, 0x1F, 0xC0, 0xFE, 0x7F, + 0x01, 0xFD, 0xFC, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xE0, 0x7F, 0xDF, 0xC0, 0xFF, 0x3F, 0xC1, + 0xFC, 0x3F, 0x83, 0xF8, 0x3F, 0x87, 0xF0, 0x7F, 0x8F, 0xE0, 0x7F, 0x1F, + 0xC0, 0xFF, 0x3F, 0x80, 0xFE, 0x7F, 0x01, 0xFE, 0xFE, 0x01, 0xFD, 0xFC, + 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x1F, 0x80, 0x7E, + 0x0F, 0xE7, 0xFE, 0x1F, 0xF8, 0xFE, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x83, 0xFF, 0x0F, 0xFF, 0xF0, 0x1F, 0xE0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, + 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, + 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, + 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, + 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, + 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, + 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, + 0xF0, 0xFE, 0x1F, 0xC1, 0xFC, 0xFF, 0xE3, 0xFB, 0xFF, 0xE7, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0xFF, + 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, + 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, + 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, + 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00, + 0xFE, 0x00, 0x7F, 0x80, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 0xFE, 0x01, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFF, 0x07, 0xFC, 0xFF, + 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x7F, 0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, + 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xBF, 0x80, 0x3F, 0x9F, 0xE0, 0x3F, + 0xCF, 0xF8, 0x3F, 0xE3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, + 0xF0, 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFE, + 0x1F, 0x80, 0x7F, 0x3F, 0xF0, 0x3F, 0xBF, 0xFE, 0x1F, 0xDF, 0xFF, 0x8F, + 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xF3, 0xFF, 0x07, 0xFD, 0xFF, 0x01, 0xFE, + 0xFF, 0x00, 0x7F, 0x7F, 0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, + 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xBF, 0xE0, 0x3F, 0xDF, 0xF8, + 0x3F, 0xCF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE3, 0xFB, 0xFF, 0xE1, 0xFD, + 0xFF, 0xF0, 0xFE, 0x7F, 0xE0, 0x7F, 0x0F, 0xC0, 0x3F, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x1F, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x81, 0xFF, 0x9F, 0xC3, 0xFF, + 0xEF, 0xE1, 0xFF, 0xF7, 0xF1, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFD, 0xFF, + 0x07, 0xFE, 0xFF, 0x01, 0xFF, 0x7F, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, + 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, + 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xBF, 0x80, 0x3F, + 0xDF, 0xE0, 0x3F, 0xEF, 0xF8, 0x3F, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFC, 0x7F, 0xFE, 0xFE, 0x1F, 0xFF, 0x7F, 0x03, 0xFF, 0x3F, 0x80, 0x7E, + 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0xFE, 0x1F, 0xFC, + 0x7F, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x80, + 0xFF, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, + 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, + 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x07, + 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, + 0x81, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0xC0, 0x00, 0x7F, + 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x07, + 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x81, 0xFE, 0x7F, + 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x01, + 0xFF, 0x80, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, + 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, + 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, + 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xFF, 0x3F, 0xF1, 0xFF, 0x0F, + 0xF0, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, + 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, + 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, + 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, + 0xFE, 0x00, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xBF, 0x9F, 0xFF, 0x7F, 0x1F, + 0xFC, 0xFE, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0x9F, + 0xC0, 0x1F, 0xC7, 0xE0, 0x0F, 0xE3, 0xF8, 0x07, 0xE1, 0xFC, 0x07, 0xF0, + 0x7E, 0x03, 0xF8, 0x3F, 0x81, 0xF8, 0x1F, 0xC0, 0xFC, 0x07, 0xE0, 0xFE, + 0x03, 0xF8, 0x7E, 0x00, 0xFC, 0x3F, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x1F, + 0x80, 0x0F, 0xCF, 0xC0, 0x07, 0xE7, 0xE0, 0x03, 0xF7, 0xE0, 0x00, 0xFF, + 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x07, + 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0xFC, 0x03, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0x01, 0xFF, 0xF8, 0x0F, 0xE0, + 0x3F, 0x3F, 0x03, 0xFE, 0x07, 0xE7, 0xE0, 0x7F, 0xC1, 0xFC, 0xFE, 0x0F, + 0xF8, 0x3F, 0x9F, 0xC1, 0xFF, 0x07, 0xE1, 0xF8, 0x3D, 0xE0, 0xFC, 0x3F, + 0x0F, 0xBE, 0x3F, 0x87, 0xF1, 0xF7, 0xC7, 0xE0, 0x7E, 0x3E, 0xF8, 0xFC, + 0x0F, 0xC7, 0xDF, 0x1F, 0x81, 0xF9, 0xF1, 0xE3, 0xF0, 0x3F, 0x3E, 0x3E, + 0xFC, 0x03, 0xF7, 0xC7, 0xDF, 0x80, 0x7E, 0xF8, 0xFB, 0xF0, 0x0F, 0xDE, + 0x1F, 0x7C, 0x00, 0xFF, 0xC1, 0xFF, 0x80, 0x1F, 0xF8, 0x3F, 0xF0, 0x03, + 0xFF, 0x07, 0xFE, 0x00, 0x7F, 0xC0, 0xFF, 0x80, 0x07, 0xF8, 0x1F, 0xF0, + 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, + 0xF0, 0x00, 0xFF, 0x00, 0xFF, 0x7F, 0x81, 0xFE, 0x3F, 0x81, 0xFC, 0x3F, + 0xC3, 0xFC, 0x1F, 0xC3, 0xF8, 0x0F, 0xE7, 0xF0, 0x0F, 0xEF, 0xF0, 0x07, + 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00, + 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x03, + 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x0F, 0xE7, 0xF0, 0x1F, + 0xE7, 0xF0, 0x1F, 0xC3, 0xF8, 0x3F, 0xC3, 0xFC, 0x7F, 0x81, 0xFC, 0x7F, + 0x01, 0xFE, 0xFF, 0x00, 0xFF, 0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xDF, + 0xC0, 0x0F, 0xC7, 0xF0, 0x07, 0xE3, 0xF8, 0x07, 0xF1, 0xFC, 0x03, 0xF0, + 0x7F, 0x01, 0xF8, 0x3F, 0x81, 0xFC, 0x0F, 0xC0, 0xFC, 0x07, 0xF0, 0x7E, + 0x03, 0xF8, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x8F, + 0xC0, 0x0F, 0xCF, 0xC0, 0x07, 0xE7, 0xE0, 0x03, 0xFB, 0xF0, 0x00, 0xFD, + 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x07, + 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x1F, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x0F, 0xFC, 0x00, + 0x07, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7F, 0xFF, + 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xBF, + 0xFF, 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, + 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, + 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, 0xFF, + 0x87, 0xE0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, + 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3F, + 0x0F, 0xF0, 0x7F, 0x03, 0xF8, 0x1F, 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, + 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, + 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xE0, 0x3F, 0xE0, 0xFF, 0x07, 0xF8, 0x1F, + 0xC0, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFC, 0x07, 0xF0, 0x3F, 0xC1, 0xFE, 0x0F, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, + 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, + 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x80, 0x7F, 0x81, 0xFC, + 0x0F, 0xE0, 0xFF, 0x0F, 0xC0, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, + 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, + 0x0F, 0xC3, 0xFE, 0x1F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x00, 0x1F, 0x00, + 0x03, 0xFE, 0x00, 0x1F, 0xF8, 0x0F, 0xFF, 0xF0, 0xFF, 0x0F, 0xFF, 0xF0, + 0x1F, 0xF8, 0x00, 0x7F, 0x80, 0x00, 0xF8}; + +const GFXglyph FreeSansBold24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 13, 0, 1}, // 0x20 ' ' + {0, 7, 34, 16, 5, -33}, // 0x21 '!' + {30, 18, 12, 22, 2, -33}, // 0x22 '"' + {57, 26, 33, 26, 0, -31}, // 0x23 '#' + {165, 25, 40, 26, 1, -34}, // 0x24 '$' + {290, 39, 34, 42, 1, -32}, // 0x25 '%' + {456, 30, 35, 34, 3, -33}, // 0x26 '&' + {588, 7, 12, 12, 3, -33}, // 0x27 ''' + {599, 13, 44, 16, 2, -33}, // 0x28 '(' + {671, 13, 44, 16, 1, -33}, // 0x29 ')' + {743, 15, 15, 18, 1, -33}, // 0x2A '*' + {772, 23, 22, 27, 2, -21}, // 0x2B '+' + {836, 7, 15, 12, 2, -6}, // 0x2C ',' + {850, 13, 6, 16, 1, -15}, // 0x2D '-' + {860, 7, 7, 12, 2, -6}, // 0x2E '.' + {867, 13, 34, 13, 0, -32}, // 0x2F '/' + {923, 24, 35, 26, 1, -33}, // 0x30 '0' + {1028, 14, 33, 26, 4, -32}, // 0x31 '1' + {1086, 23, 34, 26, 2, -33}, // 0x32 '2' + {1184, 23, 35, 26, 2, -33}, // 0x33 '3' + {1285, 22, 33, 26, 2, -32}, // 0x34 '4' + {1376, 23, 34, 26, 2, -32}, // 0x35 '5' + {1474, 23, 35, 26, 2, -33}, // 0x36 '6' + {1575, 23, 33, 26, 1, -32}, // 0x37 '7' + {1670, 24, 35, 26, 1, -33}, // 0x38 '8' + {1775, 24, 35, 26, 1, -33}, // 0x39 '9' + {1880, 7, 25, 12, 2, -24}, // 0x3A ':' + {1902, 7, 33, 12, 2, -24}, // 0x3B ';' + {1931, 23, 23, 27, 2, -22}, // 0x3C '<' + {1998, 23, 18, 27, 2, -19}, // 0x3D '=' + {2050, 23, 23, 27, 2, -22}, // 0x3E '>' + {2117, 24, 35, 29, 3, -34}, // 0x3F '?' + {2222, 43, 41, 46, 1, -34}, // 0x40 '@' + {2443, 32, 34, 33, 0, -33}, // 0x41 'A' + {2579, 27, 34, 33, 4, -33}, // 0x42 'B' + {2694, 30, 36, 34, 2, -34}, // 0x43 'C' + {2829, 28, 34, 34, 4, -33}, // 0x44 'D' + {2948, 25, 34, 31, 4, -33}, // 0x45 'E' + {3055, 24, 34, 30, 4, -33}, // 0x46 'F' + {3157, 31, 36, 36, 2, -34}, // 0x47 'G' + {3297, 27, 34, 35, 4, -33}, // 0x48 'H' + {3412, 7, 34, 15, 4, -33}, // 0x49 'I' + {3442, 22, 35, 27, 1, -33}, // 0x4A 'J' + {3539, 30, 34, 34, 4, -33}, // 0x4B 'K' + {3667, 23, 34, 29, 4, -33}, // 0x4C 'L' + {3765, 33, 34, 41, 4, -33}, // 0x4D 'M' + {3906, 28, 34, 35, 4, -33}, // 0x4E 'N' + {4025, 33, 36, 37, 2, -34}, // 0x4F 'O' + {4174, 26, 34, 32, 4, -33}, // 0x50 'P' + {4285, 33, 37, 37, 2, -34}, // 0x51 'Q' + {4438, 28, 34, 34, 4, -33}, // 0x52 'R' + {4557, 28, 36, 32, 2, -34}, // 0x53 'S' + {4683, 27, 34, 30, 2, -33}, // 0x54 'T' + {4798, 27, 35, 35, 4, -33}, // 0x55 'U' + {4917, 29, 34, 31, 1, -33}, // 0x56 'V' + {5041, 43, 34, 45, 1, -33}, // 0x57 'W' + {5224, 30, 34, 32, 1, -33}, // 0x58 'X' + {5352, 29, 34, 30, 1, -33}, // 0x59 'Y' + {5476, 26, 34, 29, 1, -33}, // 0x5A 'Z' + {5587, 11, 43, 16, 3, -33}, // 0x5B '[' + {5647, 14, 34, 13, -1, -32}, // 0x5C '\' + {5707, 11, 43, 16, 1, -33}, // 0x5D ']' + {5767, 22, 20, 27, 3, -32}, // 0x5E '^' + {5822, 28, 4, 26, -1, 6}, // 0x5F '_' + {5836, 9, 7, 12, 1, -35}, // 0x60 '`' + {5844, 24, 26, 27, 2, -24}, // 0x61 'a' + {5922, 25, 35, 29, 3, -33}, // 0x62 'b' + {6032, 23, 26, 26, 2, -24}, // 0x63 'c' + {6107, 25, 35, 29, 2, -33}, // 0x64 'd' + {6217, 24, 26, 27, 2, -24}, // 0x65 'e' + {6295, 14, 34, 16, 1, -33}, // 0x66 'f' + {6355, 24, 36, 29, 2, -24}, // 0x67 'g' + {6463, 23, 34, 28, 3, -33}, // 0x68 'h' + {6561, 7, 34, 13, 3, -33}, // 0x69 'i' + {6591, 10, 45, 13, 0, -33}, // 0x6A 'j' + {6648, 23, 34, 27, 3, -33}, // 0x6B 'k' + {6746, 7, 34, 13, 3, -33}, // 0x6C 'l' + {6776, 36, 25, 42, 3, -24}, // 0x6D 'm' + {6889, 23, 25, 29, 3, -24}, // 0x6E 'n' + {6961, 25, 26, 29, 2, -24}, // 0x6F 'o' + {7043, 25, 36, 29, 3, -24}, // 0x70 'p' + {7156, 25, 36, 29, 2, -24}, // 0x71 'q' + {7269, 15, 25, 18, 3, -24}, // 0x72 'r' + {7316, 24, 26, 26, 1, -24}, // 0x73 's' + {7394, 12, 32, 16, 2, -30}, // 0x74 't' + {7442, 23, 26, 29, 3, -24}, // 0x75 'u' + {7517, 25, 25, 25, 0, -24}, // 0x76 'v' + {7596, 35, 25, 37, 1, -24}, // 0x77 'w' + {7706, 24, 25, 26, 1, -24}, // 0x78 'x' + {7781, 25, 36, 26, 0, -24}, // 0x79 'y' + {7894, 21, 25, 24, 1, -24}, // 0x7A 'z' + {7960, 13, 43, 18, 2, -33}, // 0x7B '{' + {8030, 4, 44, 13, 5, -33}, // 0x7C '|' + {8052, 13, 43, 18, 3, -33}, // 0x7D '}' + {8122, 21, 8, 23, 1, -14}}; // 0x7E '~' + +const GFXfont FreeSansBold24pt7b PROGMEM = { + (uint8_t *)FreeSansBold24pt7bBitmaps, (GFXglyph *)FreeSansBold24pt7bGlyphs, + 0x20, 0x7E, 56}; + +// Approx. 8815 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h new file mode 100644 index 0000000..cffb178 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h @@ -0,0 +1,210 @@ +#pragma once +#include + +const uint8_t FreeSansBold9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFE, 0x48, 0x7E, 0xEF, 0xDF, 0xBF, 0x74, 0x40, 0x19, 0x86, + 0x67, 0xFD, 0xFF, 0x33, 0x0C, 0xC3, 0x33, 0xFE, 0xFF, 0x99, 0x86, 0x61, + 0x90, 0x10, 0x1F, 0x1F, 0xDE, 0xFF, 0x3F, 0x83, 0xC0, 0xFC, 0x1F, 0x09, + 0xFC, 0xFE, 0xF7, 0xF1, 0xE0, 0x40, 0x38, 0x10, 0x7C, 0x30, 0xC6, 0x20, + 0xC6, 0x40, 0xC6, 0x40, 0x7C, 0x80, 0x39, 0x9C, 0x01, 0x3E, 0x03, 0x63, + 0x02, 0x63, 0x04, 0x63, 0x0C, 0x3E, 0x08, 0x1C, 0x0E, 0x01, 0xF8, 0x3B, + 0x83, 0xB8, 0x3F, 0x01, 0xE0, 0x3E, 0x67, 0x76, 0xE3, 0xEE, 0x1C, 0xF3, + 0xC7, 0xFE, 0x3F, 0x70, 0xFF, 0xF4, 0x18, 0x63, 0x1C, 0x73, 0x8E, 0x38, + 0xE3, 0x8E, 0x18, 0x70, 0xC3, 0x06, 0x08, 0x61, 0x83, 0x0E, 0x38, 0x71, + 0xC7, 0x1C, 0x71, 0xC6, 0x38, 0xE3, 0x18, 0x40, 0x21, 0x3E, 0x45, 0x28, + 0x38, 0x70, 0xE7, 0xFF, 0xE7, 0x0E, 0x1C, 0xFC, 0x9C, 0xFF, 0xC0, 0xFC, + 0x08, 0xC4, 0x23, 0x10, 0x84, 0x62, 0x11, 0x88, 0x00, 0x3E, 0x3F, 0x9D, + 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xDD, 0xCF, 0xE3, 0xE0, + 0x08, 0xFF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x80, 0x3E, 0x3F, 0xB8, + 0xFC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x0F, 0xF7, 0xF8, + 0x3C, 0x7F, 0xE7, 0xE7, 0x07, 0x0C, 0x0E, 0x07, 0x07, 0xE7, 0xE7, 0x7E, + 0x3C, 0x0E, 0x1E, 0x1E, 0x2E, 0x2E, 0x4E, 0x4E, 0x8E, 0xFF, 0xFF, 0x0E, + 0x0E, 0x0E, 0x7F, 0x3F, 0x90, 0x18, 0x0D, 0xE7, 0xFB, 0x9E, 0x07, 0x03, + 0x81, 0xF1, 0xFF, 0xE7, 0xC0, 0x3E, 0x3F, 0x9C, 0xFC, 0x0E, 0xE7, 0xFB, + 0xDF, 0xC7, 0xE3, 0xF1, 0xDD, 0xEF, 0xE3, 0xE0, 0xFF, 0xFF, 0xC0, 0xE0, + 0xE0, 0x60, 0x70, 0x30, 0x38, 0x1C, 0x0C, 0x0E, 0x07, 0x03, 0x80, 0x3F, + 0x1F, 0xEE, 0x3F, 0x87, 0xE3, 0xCF, 0xC7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7F, + 0x3D, 0xFE, 0x3F, 0x00, 0x3E, 0x3F, 0xBD, 0xDC, 0x7E, 0x3F, 0x1F, 0xDE, + 0xFF, 0x3B, 0x81, 0xF9, 0xCF, 0xE3, 0xC0, 0xFC, 0x00, 0x07, 0xE0, 0xFC, + 0x00, 0x07, 0xE5, 0xE0, 0x00, 0x83, 0xC7, 0xDF, 0x0C, 0x07, 0x80, 0xF8, + 0x1F, 0x01, 0x80, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x70, + 0x3F, 0x03, 0xE0, 0x38, 0x7D, 0xF1, 0xE0, 0x80, 0x00, 0x3E, 0x3F, 0xB8, + 0xFC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x0E, 0x00, 0x03, 0x81, 0xC0, + 0x03, 0xF0, 0x0F, 0xFC, 0x1E, 0x0E, 0x38, 0x02, 0x70, 0xE9, 0x63, 0x19, + 0xC2, 0x19, 0xC6, 0x11, 0xC6, 0x33, 0xC6, 0x32, 0x63, 0xFE, 0x73, 0xDC, + 0x3C, 0x00, 0x1F, 0xF8, 0x07, 0xF0, 0x07, 0x00, 0xF0, 0x0F, 0x80, 0xF8, + 0x1D, 0x81, 0x9C, 0x19, 0xC3, 0x8C, 0x3F, 0xE7, 0xFE, 0x70, 0x66, 0x07, + 0xE0, 0x70, 0xFF, 0x9F, 0xFB, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0x3F, 0xF7, + 0x06, 0xE0, 0xFC, 0x1F, 0x83, 0xFF, 0xEF, 0xF8, 0x1F, 0x83, 0xFE, 0x78, + 0xE7, 0x07, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x07, 0x07, 0x78, + 0xF3, 0xFE, 0x1F, 0x80, 0xFF, 0x8F, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, 0x7E, + 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x0E, 0xE0, 0xEF, 0xFC, 0xFF, 0x80, + 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0, 0xE0, 0x70, 0x38, + 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0, + 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x00, 0x0F, 0x87, 0xF9, 0xE3, 0xB8, 0x3E, + 0x01, 0xC0, 0x38, 0xFF, 0x1F, 0xE0, 0x6E, 0x0D, 0xE3, 0x9F, 0xD0, 0xF2, + 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0x07, 0xE0, + 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xE7, 0xE7, 0xE7, 0x7E, 0x3C, + 0xE0, 0xEE, 0x1C, 0xE3, 0x8E, 0x70, 0xEE, 0x0F, 0xC0, 0xFE, 0x0F, 0x70, + 0xE7, 0x0E, 0x38, 0xE1, 0xCE, 0x0E, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0xE1, + 0xFF, 0x87, 0xFE, 0x1F, 0xEC, 0x7F, 0xB3, 0x7E, 0xCD, 0xFB, 0x37, 0xEC, + 0xDF, 0x9E, 0x7E, 0x79, 0xF9, 0xE7, 0xE7, 0x9C, 0xE0, 0xFE, 0x1F, 0xC3, + 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, 0xBF, 0x37, 0xE7, 0xFC, 0x7F, 0x87, 0xF0, + 0xFE, 0x0E, 0x0F, 0x81, 0xFF, 0x1E, 0x3C, 0xE0, 0xEE, 0x03, 0xF0, 0x1F, + 0x80, 0xFC, 0x07, 0xE0, 0x3B, 0x83, 0x9E, 0x3C, 0x7F, 0xC0, 0xF8, 0x00, + 0xFF, 0x9F, 0xFB, 0x87, 0xF0, 0x7E, 0x0F, 0xC3, 0xFF, 0xF7, 0xFC, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x0F, 0x81, 0xFF, 0x1E, 0x3C, 0xE0, + 0xEE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE1, 0xBB, 0x8F, 0x9E, 0x3C, + 0x7F, 0xE0, 0xFB, 0x80, 0x08, 0xFF, 0x8F, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, + 0xEE, 0x0E, 0xFF, 0xCF, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, 0xEE, 0x0E, 0xE0, + 0xF0, 0x3F, 0x0F, 0xFB, 0xC7, 0xF0, 0x7E, 0x01, 0xFC, 0x1F, 0xF0, 0x3F, + 0x00, 0xFC, 0x1D, 0xC7, 0xBF, 0xE1, 0xF8, 0xFF, 0xFF, 0xC7, 0x03, 0x81, + 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0xFC, + 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, + 0xC7, 0xBF, 0xE1, 0xF0, 0x60, 0x67, 0x0E, 0x70, 0xE3, 0x0C, 0x30, 0xC3, + 0x9C, 0x19, 0x81, 0x98, 0x1F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x06, 0x00, + 0x61, 0xC3, 0xB8, 0xE1, 0x9C, 0x70, 0xCE, 0x3C, 0xE3, 0x36, 0x71, 0x9B, + 0x30, 0xED, 0x98, 0x36, 0x7C, 0x1B, 0x3C, 0x0F, 0x1E, 0x07, 0x8F, 0x01, + 0xC3, 0x80, 0xE1, 0x80, 0x70, 0xE7, 0x8E, 0x39, 0xC1, 0xF8, 0x1F, 0x80, + 0xF0, 0x07, 0x00, 0xF0, 0x1F, 0x81, 0x9C, 0x39, 0xC7, 0x0E, 0x70, 0xE0, + 0xE0, 0xFC, 0x39, 0xC7, 0x18, 0xC3, 0xB8, 0x36, 0x07, 0xC0, 0x70, 0x0E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xC0, 0xE0, 0xE0, 0xF0, + 0x70, 0x70, 0x70, 0x78, 0x38, 0x38, 0x1F, 0xFF, 0xF8, 0xFF, 0xEE, 0xEE, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xF0, 0x86, 0x10, 0x86, 0x10, 0x84, 0x30, + 0x84, 0x30, 0x80, 0xFF, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xF0, + 0x18, 0x1C, 0x3C, 0x3E, 0x36, 0x66, 0x63, 0xC3, 0xFF, 0xC0, 0xCC, 0x3F, + 0x1F, 0xEE, 0x38, 0x0E, 0x3F, 0x9E, 0xEE, 0x3B, 0x9E, 0xFF, 0x9E, 0xE0, + 0xE0, 0x38, 0x0E, 0x03, 0xBC, 0xFF, 0xBC, 0xEE, 0x1F, 0x87, 0xE1, 0xF8, + 0x7F, 0x3B, 0xFE, 0xEF, 0x00, 0x1F, 0x3F, 0xDC, 0x7C, 0x0E, 0x07, 0x03, + 0x80, 0xE3, 0x7F, 0x8F, 0x00, 0x03, 0x81, 0xC0, 0xE7, 0x77, 0xFB, 0xBF, + 0x8F, 0xC7, 0xE3, 0xF1, 0xFD, 0xEF, 0xF3, 0xB8, 0x3E, 0x3F, 0x9C, 0xDC, + 0x3F, 0xFF, 0xFF, 0x81, 0xC3, 0x7F, 0x8F, 0x00, 0x3B, 0xDD, 0xFF, 0xB9, + 0xCE, 0x73, 0x9C, 0xE7, 0x00, 0x3B, 0xBF, 0xDD, 0xFC, 0x7E, 0x3F, 0x1F, + 0x8F, 0xEF, 0x7F, 0x9D, 0xC0, 0xFC, 0x77, 0xF1, 0xF0, 0xE0, 0x70, 0x38, + 0x1D, 0xEF, 0xFF, 0x9F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x38, + 0xFC, 0x7F, 0xFF, 0xFF, 0xFE, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x7F, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x7E, 0x77, 0x73, 0xF1, 0xF8, 0xFE, + 0x77, 0x39, 0xDC, 0x6E, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0x7B, + 0xFF, 0xFE, 0x39, 0xF8, 0xE7, 0xE3, 0x9F, 0x8E, 0x7E, 0x39, 0xF8, 0xE7, + 0xE3, 0x9F, 0x8E, 0x70, 0xEF, 0x7F, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, + 0xC7, 0xE3, 0xF1, 0xC0, 0x1E, 0x1F, 0xE7, 0x3B, 0x87, 0xE1, 0xF8, 0x7E, + 0x1D, 0xCE, 0x7F, 0x87, 0x80, 0xEF, 0x3F, 0xEF, 0x3B, 0x87, 0xE1, 0xF8, + 0x7E, 0x1F, 0xCE, 0xFF, 0xBB, 0xCE, 0x03, 0x80, 0xE0, 0x38, 0x00, 0x3B, + 0xBF, 0xFD, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xEF, 0x7F, 0x9D, 0xC0, 0xE0, + 0x70, 0x38, 0x1C, 0xEF, 0xFF, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x80, 0x3E, + 0x3F, 0xB8, 0xFC, 0x0F, 0xC3, 0xFC, 0x3F, 0xC7, 0xFF, 0x1F, 0x00, 0x73, + 0xBF, 0xF7, 0x39, 0xCE, 0x73, 0x9E, 0x70, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, + 0x3F, 0x1F, 0x8F, 0xC7, 0xFF, 0xBD, 0xC0, 0xE1, 0x98, 0x67, 0x39, 0xCC, + 0x33, 0x0D, 0xC3, 0xE0, 0x78, 0x1E, 0x07, 0x00, 0xE3, 0x1D, 0x9E, 0x66, + 0x79, 0x99, 0xE6, 0x77, 0xB8, 0xD2, 0xC3, 0xCF, 0x0F, 0x3C, 0x3C, 0xF0, + 0x73, 0x80, 0x73, 0x9C, 0xE3, 0xF0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xFC, + 0x73, 0x9C, 0xE0, 0xE1, 0xD8, 0x67, 0x39, 0xCE, 0x33, 0x0E, 0xC3, 0xE0, + 0x78, 0x1E, 0x03, 0x00, 0xC0, 0x70, 0x38, 0x0E, 0x00, 0xFE, 0xFE, 0x0E, + 0x1C, 0x38, 0x38, 0x70, 0xE0, 0xFF, 0xFF, 0x37, 0x66, 0x66, 0x6E, 0xE6, + 0x66, 0x66, 0x67, 0x30, 0xFF, 0xFF, 0x80, 0xCE, 0x66, 0x66, 0x67, 0x76, + 0x66, 0x66, 0x6E, 0xC0, 0x71, 0x8E}; + +const GFXglyph FreeSansBold9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 3, 13, 6, 2, -12}, // 0x21 '!' + {5, 7, 5, 9, 1, -12}, // 0x22 '"' + {10, 10, 12, 10, 0, -11}, // 0x23 '#' + {25, 9, 15, 10, 1, -13}, // 0x24 '$' + {42, 16, 13, 16, 0, -12}, // 0x25 '%' + {68, 12, 13, 13, 1, -12}, // 0x26 '&' + {88, 3, 5, 5, 1, -12}, // 0x27 ''' + {90, 6, 17, 6, 1, -12}, // 0x28 '(' + {103, 6, 17, 6, 0, -12}, // 0x29 ')' + {116, 5, 6, 7, 1, -12}, // 0x2A '*' + {120, 7, 8, 11, 2, -7}, // 0x2B '+' + {127, 3, 5, 4, 1, -1}, // 0x2C ',' + {129, 5, 2, 6, 0, -5}, // 0x2D '-' + {131, 3, 2, 4, 1, -1}, // 0x2E '.' + {132, 5, 13, 5, 0, -12}, // 0x2F '/' + {141, 9, 13, 10, 1, -12}, // 0x30 '0' + {156, 5, 13, 10, 2, -12}, // 0x31 '1' + {165, 9, 13, 10, 1, -12}, // 0x32 '2' + {180, 8, 13, 10, 1, -12}, // 0x33 '3' + {193, 8, 13, 10, 2, -12}, // 0x34 '4' + {206, 9, 13, 10, 1, -12}, // 0x35 '5' + {221, 9, 13, 10, 1, -12}, // 0x36 '6' + {236, 9, 13, 10, 0, -12}, // 0x37 '7' + {251, 10, 13, 10, 0, -12}, // 0x38 '8' + {268, 9, 13, 10, 1, -12}, // 0x39 '9' + {283, 3, 9, 4, 1, -8}, // 0x3A ':' + {287, 3, 12, 4, 1, -8}, // 0x3B ';' + {292, 9, 9, 11, 1, -8}, // 0x3C '<' + {303, 9, 6, 11, 1, -6}, // 0x3D '=' + {310, 9, 9, 11, 1, -8}, // 0x3E '>' + {321, 9, 13, 11, 1, -12}, // 0x3F '?' + {336, 16, 15, 18, 0, -12}, // 0x40 '@' + {366, 12, 13, 13, 0, -12}, // 0x41 'A' + {386, 11, 13, 13, 1, -12}, // 0x42 'B' + {404, 12, 13, 13, 1, -12}, // 0x43 'C' + {424, 12, 13, 13, 1, -12}, // 0x44 'D' + {444, 9, 13, 12, 1, -12}, // 0x45 'E' + {459, 9, 13, 11, 1, -12}, // 0x46 'F' + {474, 11, 13, 14, 1, -12}, // 0x47 'G' + {492, 11, 13, 13, 1, -12}, // 0x48 'H' + {510, 3, 13, 6, 1, -12}, // 0x49 'I' + {515, 8, 13, 10, 1, -12}, // 0x4A 'J' + {528, 12, 13, 13, 1, -12}, // 0x4B 'K' + {548, 8, 13, 11, 1, -12}, // 0x4C 'L' + {561, 14, 13, 16, 1, -12}, // 0x4D 'M' + {584, 11, 13, 14, 1, -12}, // 0x4E 'N' + {602, 13, 13, 14, 1, -12}, // 0x4F 'O' + {624, 11, 13, 12, 1, -12}, // 0x50 'P' + {642, 13, 14, 14, 1, -12}, // 0x51 'Q' + {665, 12, 13, 13, 1, -12}, // 0x52 'R' + {685, 11, 13, 12, 1, -12}, // 0x53 'S' + {703, 9, 13, 12, 2, -12}, // 0x54 'T' + {718, 11, 13, 13, 1, -12}, // 0x55 'U' + {736, 12, 13, 12, 0, -12}, // 0x56 'V' + {756, 17, 13, 17, 0, -12}, // 0x57 'W' + {784, 12, 13, 12, 0, -12}, // 0x58 'X' + {804, 11, 13, 12, 1, -12}, // 0x59 'Y' + {822, 9, 13, 11, 1, -12}, // 0x5A 'Z' + {837, 4, 17, 6, 1, -12}, // 0x5B '[' + {846, 5, 13, 5, 0, -12}, // 0x5C '\' + {855, 4, 17, 6, 0, -12}, // 0x5D ']' + {864, 8, 8, 11, 1, -12}, // 0x5E '^' + {872, 10, 1, 10, 0, 4}, // 0x5F '_' + {874, 3, 2, 5, 0, -12}, // 0x60 '`' + {875, 10, 10, 10, 1, -9}, // 0x61 'a' + {888, 10, 13, 11, 1, -12}, // 0x62 'b' + {905, 9, 10, 10, 1, -9}, // 0x63 'c' + {917, 9, 13, 11, 1, -12}, // 0x64 'd' + {932, 9, 10, 10, 1, -9}, // 0x65 'e' + {944, 5, 13, 6, 1, -12}, // 0x66 'f' + {953, 9, 14, 11, 1, -9}, // 0x67 'g' + {969, 9, 13, 11, 1, -12}, // 0x68 'h' + {984, 3, 13, 5, 1, -12}, // 0x69 'i' + {989, 4, 17, 5, 0, -12}, // 0x6A 'j' + {998, 9, 13, 10, 1, -12}, // 0x6B 'k' + {1013, 3, 13, 5, 1, -12}, // 0x6C 'l' + {1018, 14, 10, 16, 1, -9}, // 0x6D 'm' + {1036, 9, 10, 11, 1, -9}, // 0x6E 'n' + {1048, 10, 10, 11, 1, -9}, // 0x6F 'o' + {1061, 10, 14, 11, 1, -9}, // 0x70 'p' + {1079, 9, 14, 11, 1, -9}, // 0x71 'q' + {1095, 6, 10, 7, 1, -9}, // 0x72 'r' + {1103, 9, 10, 10, 1, -9}, // 0x73 's' + {1115, 5, 12, 6, 1, -11}, // 0x74 't' + {1123, 9, 10, 11, 1, -9}, // 0x75 'u' + {1135, 10, 10, 10, 0, -9}, // 0x76 'v' + {1148, 14, 10, 14, 0, -9}, // 0x77 'w' + {1166, 10, 10, 10, 0, -9}, // 0x78 'x' + {1179, 10, 14, 10, 0, -9}, // 0x79 'y' + {1197, 8, 10, 9, 1, -9}, // 0x7A 'z' + {1207, 4, 17, 7, 1, -12}, // 0x7B '{' + {1216, 1, 17, 5, 2, -12}, // 0x7C '|' + {1219, 4, 17, 7, 2, -12}, // 0x7D '}' + {1228, 8, 2, 9, 0, -4}}; // 0x7E '~' + +const GFXfont FreeSansBold9pt7b PROGMEM = {(uint8_t *)FreeSansBold9pt7bBitmaps, + (GFXglyph *)FreeSansBold9pt7bGlyphs, + 0x20, 0x7E, 22}; + +// Approx. 1902 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h new file mode 100644 index 0000000..ff76ce3 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h @@ -0,0 +1,319 @@ +#pragma once +#include + +const uint8_t FreeSansBoldOblique12pt7bBitmaps[] PROGMEM = { + 0x1C, 0x3C, 0x78, 0xE1, 0xC3, 0x8F, 0x1C, 0x38, 0x70, 0xC1, 0x83, 0x00, + 0x1C, 0x78, 0xF0, 0x71, 0xFC, 0xFE, 0x3B, 0x8E, 0xC3, 0x30, 0xC0, 0x01, + 0x8C, 0x07, 0x38, 0x0C, 0x61, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x83, 0x9C, + 0x0E, 0x70, 0x1C, 0xE1, 0xFF, 0xF3, 0xFF, 0xC7, 0xFF, 0x83, 0x18, 0x0E, + 0x70, 0x18, 0xC0, 0x73, 0x80, 0x00, 0x40, 0x07, 0xF0, 0x3F, 0xF0, 0xFF, + 0xF3, 0xC9, 0xE7, 0xB3, 0xCF, 0x60, 0x1F, 0xC0, 0x3F, 0xC0, 0x3F, 0xE0, + 0x1F, 0xE0, 0x1B, 0xE0, 0x33, 0xDE, 0x47, 0xBC, 0x8F, 0x7F, 0x7C, 0x7F, + 0xF0, 0x7F, 0x80, 0x18, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x01, 0x87, + 0x80, 0xC3, 0xF0, 0x61, 0xFE, 0x10, 0xE1, 0x8C, 0x30, 0x66, 0x0C, 0x3B, + 0x03, 0xFC, 0x80, 0x7E, 0x60, 0x0F, 0x30, 0x00, 0x18, 0x70, 0x0C, 0x7E, + 0x03, 0x1F, 0xC1, 0x8E, 0x30, 0xC3, 0x1C, 0x60, 0xFE, 0x18, 0x1F, 0x8C, + 0x07, 0x80, 0x01, 0xE0, 0x07, 0xF0, 0x1F, 0xE0, 0x79, 0xC0, 0xF3, 0x81, + 0xEE, 0x01, 0xF8, 0x01, 0xE0, 0x1F, 0xC6, 0x7B, 0xDD, 0xE3, 0xF7, 0x87, + 0xEF, 0x07, 0x9F, 0x1F, 0x3F, 0xFF, 0x3F, 0xDE, 0x3F, 0x1C, 0x7F, 0xEE, + 0xCC, 0x03, 0x83, 0x81, 0x81, 0xC1, 0xC0, 0xE0, 0xE0, 0x70, 0x70, 0x38, + 0x3C, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x18, 0x0E, 0x07, + 0x01, 0x80, 0x06, 0x03, 0x81, 0xC0, 0x60, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0xE0, 0xE0, 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x06, + 0x07, 0x07, 0x00, 0x0C, 0x0C, 0x4F, 0xFF, 0x1C, 0x3C, 0x6C, 0x44, 0x03, + 0x80, 0x38, 0x07, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x0E, + 0x00, 0xE0, 0x0C, 0x00, 0x7B, 0xDC, 0x23, 0x33, 0x00, 0x7F, 0xFF, 0xF0, + 0x7F, 0xE0, 0x00, 0xC0, 0x30, 0x18, 0x04, 0x03, 0x00, 0x80, 0x60, 0x10, + 0x0C, 0x02, 0x01, 0x80, 0x40, 0x30, 0x08, 0x06, 0x01, 0x00, 0xC0, 0x00, + 0x03, 0xC0, 0x7F, 0x87, 0xFC, 0x78, 0xF3, 0xC7, 0xBC, 0x3D, 0xE1, 0xEF, + 0x0F, 0xF0, 0x7F, 0x87, 0xBC, 0x3D, 0xE1, 0xEF, 0x1E, 0x78, 0xF3, 0xFF, + 0x0F, 0xF0, 0x3E, 0x00, 0x03, 0x83, 0x83, 0xCF, 0xEF, 0xF0, 0x78, 0x38, + 0x1C, 0x0E, 0x0F, 0x07, 0x03, 0x81, 0xC1, 0xE0, 0xF0, 0x70, 0x38, 0x00, + 0x03, 0xF0, 0x0F, 0xF8, 0x7F, 0xF8, 0xF1, 0xF3, 0xC1, 0xE7, 0x83, 0xC0, + 0x07, 0x80, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x7C, 0x01, 0xE0, + 0x07, 0x00, 0x1F, 0xFC, 0x3F, 0xF8, 0xFF, 0xF0, 0x07, 0xE0, 0xFF, 0x8F, + 0xFE, 0xF8, 0xF7, 0x87, 0x80, 0x78, 0x0F, 0x80, 0xFC, 0x07, 0xE0, 0x0F, + 0x80, 0x3C, 0x01, 0xEF, 0x0F, 0x78, 0xF3, 0xFF, 0x8F, 0xF8, 0x3F, 0x00, + 0x00, 0x78, 0x07, 0xC0, 0x7E, 0x03, 0xF0, 0x37, 0x03, 0x38, 0x31, 0xC3, + 0x9E, 0x38, 0xF1, 0x87, 0x1F, 0xFE, 0xFF, 0xF7, 0xFF, 0x80, 0xF0, 0x07, + 0x00, 0x38, 0x03, 0xC0, 0x07, 0xFC, 0x1F, 0xF0, 0xFF, 0xC3, 0x00, 0x1C, + 0x00, 0x7F, 0x81, 0xFF, 0x0F, 0xFE, 0x38, 0xF8, 0x01, 0xE0, 0x07, 0x80, + 0x1E, 0xF0, 0xF3, 0xC7, 0xCF, 0xFE, 0x1F, 0xF0, 0x3F, 0x00, 0x03, 0xE0, + 0x7F, 0x87, 0xFE, 0x78, 0xF3, 0xC0, 0x3D, 0xE1, 0xFF, 0x8F, 0xFE, 0xF8, + 0xF7, 0xC7, 0xBC, 0x3D, 0xE1, 0xEF, 0x1E, 0x7C, 0xF3, 0xFF, 0x0F, 0xF0, + 0x1F, 0x00, 0x7F, 0xFB, 0xFF, 0xDF, 0xFE, 0x00, 0xE0, 0x0E, 0x00, 0xE0, + 0x0E, 0x00, 0xE0, 0x0F, 0x00, 0x70, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3C, + 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x00, 0x03, 0xF0, 0x1F, 0xE0, 0xFF, 0xC7, + 0x8F, 0x1C, 0x3C, 0x71, 0xE0, 0xFF, 0x03, 0xF8, 0x3F, 0xF1, 0xF1, 0xE7, + 0x87, 0xBC, 0x1E, 0xF0, 0x7B, 0xE3, 0xCF, 0xFF, 0x1F, 0xF8, 0x1F, 0x80, + 0x03, 0xE0, 0x3F, 0xE1, 0xFF, 0x8F, 0x9F, 0x3C, 0x3D, 0xE0, 0xF7, 0x83, + 0xDE, 0x1F, 0x78, 0xFD, 0xFF, 0xE3, 0xFF, 0x87, 0xDE, 0x00, 0xF3, 0xC7, + 0x8F, 0xFE, 0x1F, 0xF0, 0x3F, 0x00, 0x1C, 0xF3, 0x80, 0x00, 0x00, 0x00, + 0x01, 0xCF, 0x38, 0x0E, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, + 0xE3, 0x81, 0x06, 0x18, 0x60, 0x00, 0x00, 0x01, 0xC0, 0x7E, 0x1F, 0xE7, + 0xF8, 0x7E, 0x03, 0xE0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x78, 0x00, + 0xC0, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xFF, 0x9F, 0xFC, 0x7F, 0xF0, 0x30, 0x01, 0xE0, 0x0F, 0xE0, 0x3F, 0xC0, + 0x7F, 0x80, 0x7C, 0x07, 0xE1, 0xFE, 0x7F, 0x87, 0xE0, 0x38, 0x00, 0x00, + 0x00, 0x0F, 0xC1, 0xFF, 0x8F, 0xFC, 0xF1, 0xFF, 0x07, 0xF0, 0x3C, 0x01, + 0xE0, 0x1E, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0x1C, 0x01, 0xC0, 0x0E, 0x00, + 0x00, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xFF, + 0x80, 0x3C, 0x0F, 0x01, 0xC0, 0x0E, 0x0E, 0x00, 0x1C, 0x70, 0xF7, 0x73, + 0x87, 0xF8, 0xCC, 0x31, 0xE3, 0x61, 0x87, 0x0D, 0x8C, 0x1C, 0x3C, 0x30, + 0x61, 0xB1, 0x81, 0x86, 0xC6, 0x0C, 0x3B, 0x18, 0x71, 0xCC, 0x63, 0xCE, + 0x31, 0xFB, 0xF0, 0xE3, 0xCF, 0x01, 0xC0, 0x00, 0x03, 0xC0, 0xC0, 0x07, + 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x1F, 0x80, + 0x1F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x07, 0x7C, 0x07, 0x1E, 0x03, 0x8F, + 0x03, 0x87, 0x83, 0xC3, 0xC1, 0xFF, 0xE1, 0xFF, 0xF0, 0xFF, 0xFC, 0xF0, + 0x1E, 0x70, 0x0F, 0x78, 0x07, 0xB8, 0x03, 0xC0, 0x0F, 0xFE, 0x0F, 0xFF, + 0x87, 0xFF, 0xE3, 0xC0, 0xF1, 0xC0, 0x78, 0xE0, 0x3C, 0xF0, 0x3C, 0x7F, + 0xFC, 0x3F, 0xFC, 0x1F, 0xFF, 0x0E, 0x07, 0xCF, 0x01, 0xE7, 0x80, 0xF3, + 0x80, 0x79, 0xC0, 0x79, 0xFF, 0xF8, 0xFF, 0xFC, 0x7F, 0xF8, 0x00, 0x01, + 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE1, 0xF3, 0xC0, 0x79, 0xE0, 0x3D, + 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, + 0x0F, 0x00, 0xE7, 0x80, 0xF3, 0xE0, 0xF0, 0xFF, 0xF8, 0x3F, 0xF0, 0x07, + 0xE0, 0x00, 0x1F, 0xFC, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0x81, 0xF1, 0xC0, + 0x79, 0xE0, 0x3C, 0xF0, 0x1E, 0x78, 0x0F, 0x38, 0x07, 0x9C, 0x03, 0xDE, + 0x03, 0xCF, 0x01, 0xE7, 0x81, 0xF3, 0x80, 0xF1, 0xC1, 0xF1, 0xFF, 0xF0, + 0xFF, 0xF0, 0x7F, 0xE0, 0x00, 0x0F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1C, + 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xFF, + 0xF8, 0xFF, 0xF8, 0xFF, 0xF8, 0x1F, 0xFF, 0x1F, 0xFE, 0x1F, 0xFE, 0x1C, + 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0xF8, 0x3F, 0xF8, 0x3F, + 0xF8, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0x03, 0xFF, 0xC3, + 0xE0, 0xF3, 0xC0, 0x39, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x7F, + 0x78, 0x3F, 0xBC, 0x1F, 0xDE, 0x01, 0xCF, 0x00, 0xE7, 0xC0, 0xF1, 0xF0, + 0xF8, 0xFF, 0xFC, 0x3F, 0xEC, 0x07, 0xE6, 0x00, 0x1E, 0x03, 0x8F, 0x01, + 0xC7, 0x01, 0xE3, 0x80, 0xF3, 0xC0, 0x79, 0xE0, 0x38, 0xF0, 0x1C, 0x7F, + 0xFE, 0x3F, 0xFF, 0x3F, 0xFF, 0x9E, 0x03, 0x8F, 0x01, 0xC7, 0x01, 0xE3, + 0x80, 0xF3, 0xC0, 0x71, 0xE0, 0x38, 0xF0, 0x3C, 0x70, 0x1E, 0x00, 0x1E, + 0x3C, 0x78, 0xE1, 0xC7, 0x8F, 0x1E, 0x38, 0x71, 0xE3, 0xC7, 0x8E, 0x1C, + 0x78, 0xF1, 0xE0, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x38, + 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xC0, 0x07, 0x3C, 0x3C, + 0xF0, 0xF3, 0xC3, 0x8F, 0x1E, 0x3F, 0xF8, 0x7F, 0xC0, 0xFC, 0x00, 0x1E, + 0x07, 0xC7, 0x83, 0xE1, 0xE1, 0xE0, 0x70, 0xF0, 0x1C, 0x78, 0x0F, 0x3C, + 0x03, 0xDE, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x07, 0xDE, 0x01, + 0xE7, 0xC0, 0x78, 0xF0, 0x1C, 0x3E, 0x0F, 0x07, 0x83, 0xC0, 0xF0, 0xF0, + 0x3C, 0x38, 0x07, 0x80, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, + 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x38, 0x01, 0xC0, 0x1F, 0xFE, 0xFF, 0xF7, 0xFF, 0x80, 0x1F, 0x03, + 0xF1, 0xF0, 0x3F, 0x1F, 0x07, 0xF1, 0xF0, 0x7F, 0x3F, 0x0F, 0xE3, 0xF0, + 0xEE, 0x3B, 0x1E, 0xE3, 0xB1, 0xDE, 0x3B, 0x1D, 0xE7, 0xB3, 0x9C, 0x7B, + 0x39, 0xC7, 0x37, 0x9C, 0x73, 0x73, 0xCF, 0x3F, 0x3C, 0xF3, 0xE3, 0x8F, + 0x3E, 0x38, 0xE3, 0xC3, 0x8E, 0x3C, 0x78, 0x1E, 0x03, 0x87, 0xC0, 0xE1, + 0xF0, 0x38, 0x7C, 0x1E, 0x1F, 0x87, 0x8F, 0xE1, 0xC3, 0xB8, 0x70, 0xEF, + 0x1C, 0x39, 0xCF, 0x1E, 0x73, 0xC7, 0x8E, 0xE1, 0xC3, 0xB8, 0x70, 0xEE, + 0x1C, 0x1F, 0x8F, 0x07, 0xE3, 0xC1, 0xF0, 0xE0, 0x3C, 0x38, 0x0F, 0x00, + 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE3, 0xE3, 0xC0, 0xF9, 0xE0, + 0x3D, 0xE0, 0x1E, 0xF0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x03, 0xDE, + 0x01, 0xEF, 0x00, 0xF7, 0xC0, 0xF1, 0xF0, 0xF0, 0xFF, 0xF0, 0x3F, 0xF0, + 0x07, 0xE0, 0x00, 0x1F, 0xFC, 0x1F, 0xFE, 0x1F, 0xFF, 0x1C, 0x1F, 0x1C, + 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x1E, 0x3F, 0xFC, 0x3F, 0xFC, 0x7F, + 0xF0, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE3, 0xE3, + 0xC0, 0xF9, 0xC0, 0x3D, 0xE0, 0x1E, 0xF0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, + 0xFC, 0x03, 0xDE, 0x09, 0xEF, 0x0E, 0xE7, 0xC7, 0xF1, 0xF1, 0xF0, 0xFF, + 0xF8, 0x3F, 0xFE, 0x07, 0xE6, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x0F, 0xFF, + 0x87, 0xFF, 0xE3, 0x81, 0xF1, 0xC0, 0x78, 0xE0, 0x3C, 0xF0, 0x1C, 0x78, + 0x1E, 0x3F, 0xFC, 0x1F, 0xFC, 0x1F, 0xFF, 0x8F, 0x03, 0xC7, 0x81, 0xE3, + 0x80, 0xF1, 0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x1F, 0x00, 0x03, + 0xF8, 0x0F, 0xFE, 0x1F, 0xFF, 0x1E, 0x1F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, + 0x00, 0x3F, 0x00, 0x1F, 0xF0, 0x0F, 0xFC, 0x01, 0xFE, 0x00, 0x3E, 0xF0, + 0x1E, 0xF0, 0x1E, 0xF8, 0x3C, 0x7F, 0xF8, 0x7F, 0xF0, 0x1F, 0xC0, 0x7F, + 0xFE, 0xFF, 0xFD, 0xFF, 0xF8, 0x1C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, + 0x03, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xE0, 0x01, + 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x1E, 0x07, 0x1C, + 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x0E, 0x38, 0x0E, 0x78, 0x1E, 0x78, + 0x1E, 0x78, 0x1E, 0x78, 0x1C, 0x70, 0x1C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, + 0x38, 0xF8, 0x78, 0xFF, 0xF0, 0x7F, 0xE0, 0x1F, 0x80, 0xF0, 0x1F, 0xE0, + 0x39, 0xC0, 0xF3, 0x81, 0xC7, 0x07, 0x8E, 0x0E, 0x1C, 0x3C, 0x3C, 0x70, + 0x79, 0xE0, 0xF3, 0x80, 0xEF, 0x01, 0xDC, 0x03, 0xB8, 0x07, 0xE0, 0x0F, + 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x70, 0x7F, 0x87, 0x83, + 0xFC, 0x3C, 0x3D, 0xE1, 0xE1, 0xEF, 0x1F, 0x0E, 0x78, 0xD8, 0xF3, 0xC6, + 0xC7, 0x0E, 0x76, 0x78, 0x73, 0x33, 0x83, 0xB9, 0x9C, 0x1D, 0xCD, 0xC0, + 0xEC, 0x6E, 0x07, 0xE3, 0xE0, 0x3E, 0x1F, 0x01, 0xF0, 0xF0, 0x0F, 0x87, + 0x80, 0x78, 0x38, 0x03, 0xC1, 0xC0, 0x00, 0x0F, 0x03, 0xC3, 0xC1, 0xE0, + 0xF8, 0xF0, 0x1E, 0x78, 0x07, 0x9E, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x0F, + 0xC0, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x0F, 0xF0, + 0x07, 0x9E, 0x03, 0xC7, 0x80, 0xF0, 0xF0, 0x78, 0x3C, 0x3C, 0x0F, 0x80, + 0x78, 0x1E, 0xF0, 0x79, 0xE0, 0xF3, 0xC3, 0xC3, 0xCF, 0x07, 0x9E, 0x0F, + 0x78, 0x0F, 0xE0, 0x1F, 0x80, 0x3F, 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, + 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x1F, 0xFF, + 0x0F, 0xFF, 0x87, 0xFF, 0xC0, 0x03, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x03, + 0xE0, 0x03, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, + 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xFF, 0xF0, 0xFF, 0xF8, 0x7F, 0xFC, + 0x00, 0x0F, 0xC3, 0xF0, 0xFC, 0x38, 0x1E, 0x07, 0x01, 0xC0, 0x70, 0x1C, + 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, + 0x03, 0x80, 0xFC, 0x3F, 0x0F, 0xC0, 0x08, 0x88, 0xC4, 0x44, 0x66, 0x66, + 0x66, 0x62, 0x22, 0x33, 0x33, 0x30, 0x0F, 0xC3, 0xF0, 0xFC, 0x07, 0x03, + 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x03, 0xC0, + 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xE0, 0x70, 0xFC, 0x3F, 0x0F, 0xC0, 0x03, + 0x80, 0xF0, 0x1E, 0x07, 0xE1, 0xDC, 0x3B, 0x8E, 0x71, 0x86, 0x70, 0xFC, + 0x1F, 0x83, 0x80, 0x7F, 0xFE, 0xFF, 0xFC, 0xE6, 0x30, 0x07, 0xE0, 0xFF, + 0x8F, 0xFE, 0x70, 0xE0, 0x07, 0x03, 0xF8, 0xFF, 0xCF, 0x9E, 0xF0, 0xF7, + 0x8F, 0x3F, 0xF8, 0xFF, 0xC3, 0xDF, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x9F, 0x07, 0xFF, 0x0F, 0xFF, 0x3E, 0x3E, + 0x78, 0x3C, 0xF0, 0x79, 0xC0, 0xF3, 0x81, 0xEF, 0x07, 0x9F, 0x1F, 0x3F, + 0xFC, 0x7F, 0xF0, 0xEF, 0x80, 0x07, 0xC0, 0xFF, 0x8F, 0xFE, 0xF8, 0xF7, + 0x87, 0xB8, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0xF7, 0x8F, 0x1F, 0xF8, 0xFF, + 0x81, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x03, + 0xC0, 0xF7, 0x87, 0xFE, 0x1F, 0xFC, 0x7C, 0x78, 0xF0, 0x73, 0xC0, 0xE7, + 0x81, 0x8F, 0x07, 0x1E, 0x0E, 0x3E, 0x3C, 0x7F, 0xF8, 0x7F, 0xE0, 0x7D, + 0xC0, 0x07, 0xC0, 0xFF, 0x8F, 0xFE, 0xF0, 0xF7, 0x87, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0xF0, 0x07, 0xC7, 0x9F, 0xF8, 0xFF, 0x81, 0xF0, 0x00, 0x07, + 0x87, 0xC7, 0xE3, 0xC1, 0xC3, 0xF9, 0xFC, 0x78, 0x3C, 0x1C, 0x0E, 0x07, + 0x07, 0x83, 0x81, 0xC0, 0xE0, 0xF0, 0x78, 0x00, 0x03, 0xDE, 0x1F, 0xF8, + 0x7F, 0xF1, 0xF1, 0xE3, 0xC1, 0xCF, 0x03, 0x9E, 0x06, 0x3C, 0x0C, 0x78, + 0x38, 0xF8, 0xF1, 0xFF, 0xC1, 0xFF, 0x81, 0xF7, 0x00, 0x0E, 0x3C, 0x3C, + 0x78, 0xF0, 0x7F, 0xC0, 0x7E, 0x00, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x07, + 0x00, 0x3C, 0x00, 0xF7, 0xC3, 0xBF, 0x8F, 0xFF, 0x3C, 0x3D, 0xE0, 0xE7, + 0x83, 0x9C, 0x0E, 0x70, 0x79, 0xC1, 0xEF, 0x07, 0x3C, 0x1C, 0xE0, 0x73, + 0x83, 0xC0, 0x0E, 0x3C, 0x70, 0x00, 0x03, 0x8F, 0x1E, 0x38, 0x71, 0xE3, + 0xC7, 0x0E, 0x1C, 0x78, 0xF1, 0xC0, 0x03, 0xC0, 0xE0, 0x38, 0x00, 0x00, + 0x01, 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0xF0, 0x38, 0x0E, 0x03, 0x81, + 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0xF0, 0xF8, 0x3E, 0x0F, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x87, 0x87, 0x1E, + 0x0E, 0x78, 0x3D, 0xE0, 0x7F, 0x80, 0xFE, 0x01, 0xFE, 0x03, 0xFC, 0x0F, + 0x38, 0x1E, 0x78, 0x38, 0xF0, 0x70, 0xF0, 0xE1, 0xE0, 0x0E, 0x3C, 0x78, + 0xE1, 0xC3, 0x8F, 0x1E, 0x38, 0x71, 0xE3, 0xC7, 0x0E, 0x1C, 0x78, 0xF1, + 0xC0, 0x1C, 0xF1, 0xE0, 0xEF, 0xDF, 0x87, 0xFF, 0xFE, 0x7C, 0x78, 0xF3, + 0xC3, 0x87, 0x9C, 0x1C, 0x38, 0xE1, 0xE1, 0xC7, 0x0E, 0x0E, 0x78, 0x70, + 0xF3, 0xC3, 0x87, 0x9C, 0x3C, 0x38, 0xE1, 0xE1, 0xC7, 0x0E, 0x0E, 0x00, + 0x3D, 0xF0, 0xEF, 0xE3, 0xFF, 0xCF, 0x0F, 0x78, 0x39, 0xC0, 0xE7, 0x03, + 0x9C, 0x1E, 0xF0, 0x7B, 0xC1, 0xCE, 0x07, 0x38, 0x1C, 0xE0, 0xF0, 0x07, + 0xE0, 0x7F, 0xE3, 0xFF, 0x9F, 0x1F, 0x78, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, + 0x1F, 0xF0, 0x7B, 0xE3, 0xE7, 0xFF, 0x1F, 0xF8, 0x1F, 0x80, 0x0E, 0x7C, + 0x0F, 0xFE, 0x0F, 0xFF, 0x1F, 0x1F, 0x1E, 0x0F, 0x1E, 0x0F, 0x1C, 0x0F, + 0x1C, 0x0F, 0x3C, 0x1E, 0x3E, 0x3E, 0x3F, 0xFC, 0x3F, 0xF8, 0x7B, 0xE0, + 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, 0x07, 0xBC, + 0x7F, 0xF3, 0xFF, 0x9F, 0x1E, 0x78, 0x3B, 0xC0, 0xEF, 0x03, 0x3C, 0x0C, + 0xF0, 0x73, 0xE3, 0xCF, 0xFF, 0x1F, 0xF8, 0x3C, 0xE0, 0x03, 0x80, 0x1E, + 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3D, 0xCE, 0xE3, 0xF8, 0xF0, 0x78, + 0x1E, 0x07, 0x01, 0xC0, 0xF0, 0x3C, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x1F, + 0xC3, 0xFE, 0x7F, 0xFF, 0x0F, 0xF0, 0x0F, 0xE0, 0x7F, 0xC1, 0xFE, 0x03, + 0xEE, 0x1E, 0xFF, 0xC7, 0xFC, 0x3F, 0x00, 0x1E, 0x1E, 0x1C, 0x7F, 0xFF, + 0x3C, 0x38, 0x38, 0x38, 0x78, 0x78, 0x70, 0x7C, 0xF8, 0x78, 0x38, 0x3C, + 0xE0, 0xE3, 0x83, 0x9E, 0x0E, 0x70, 0x79, 0xC1, 0xE7, 0x07, 0x3C, 0x1C, + 0xF0, 0xF3, 0xE7, 0xCF, 0xFF, 0x1F, 0xF8, 0x3C, 0xE0, 0xF0, 0x77, 0x87, + 0xBC, 0x38, 0xE3, 0xC7, 0x1C, 0x39, 0xE1, 0xCE, 0x0E, 0xE0, 0x77, 0x03, + 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x00, 0xF1, 0xC3, 0xF8, 0xE3, 0xFC, + 0xF1, 0xDE, 0x79, 0xEF, 0x3C, 0xE7, 0xB6, 0x73, 0xDB, 0x70, 0xED, 0xB8, + 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3C, 0x0F, 0x1E, 0x07, 0x8E, 0x00, 0x0F, + 0x1E, 0x0F, 0x3C, 0x0F, 0x38, 0x07, 0x70, 0x07, 0xF0, 0x03, 0xE0, 0x03, + 0xC0, 0x07, 0xC0, 0x0F, 0xE0, 0x1E, 0xE0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, + 0x78, 0x3C, 0x1C, 0x78, 0x78, 0xF0, 0xE1, 0xE3, 0xC1, 0xC7, 0x03, 0x9E, + 0x07, 0x38, 0x0E, 0xE0, 0x1D, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x78, 0x00, + 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x7E, 0x00, 0xF8, 0x01, 0xE0, 0x00, 0x1F, + 0xF9, 0xFF, 0xCF, 0xFC, 0x01, 0xE0, 0x3E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3F, 0xF9, 0xFF, 0xCF, 0xFC, 0x00, 0x07, 0x87, 0xC3, + 0xE3, 0xC1, 0xC0, 0xE0, 0x70, 0x38, 0x3C, 0x1C, 0x0E, 0x1E, 0x0F, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x38, 0x1C, 0x0F, 0x87, 0xC1, 0xC0, 0x0C, + 0x30, 0x86, 0x18, 0x61, 0x8C, 0x30, 0xC3, 0x0C, 0x61, 0x86, 0x18, 0x63, + 0x0C, 0x30, 0xC2, 0x00, 0x00, 0x07, 0x07, 0xC3, 0xE0, 0x70, 0x38, 0x3C, + 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xE0, 0xF0, 0xE0, 0x70, 0x78, 0x38, 0x1C, + 0x0E, 0x07, 0x07, 0x8F, 0x87, 0xC3, 0xC0, 0x3C, 0x07, 0xE0, 0xC7, 0x30, + 0x7E, 0x01, 0xC0}; + +const GFXglyph FreeSansBoldOblique12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 7, 0, 1}, // 0x20 ' ' + {0, 7, 17, 8, 3, -16}, // 0x21 '!' + {15, 10, 6, 11, 4, -17}, // 0x22 '"' + {23, 15, 16, 13, 1, -15}, // 0x23 '#' + {53, 15, 21, 13, 1, -17}, // 0x24 '$' + {93, 18, 18, 21, 3, -17}, // 0x25 '%' + {134, 15, 17, 17, 2, -16}, // 0x26 '&' + {166, 4, 6, 6, 4, -17}, // 0x27 ''' + {169, 9, 22, 8, 2, -17}, // 0x28 '(' + {194, 9, 22, 8, -1, -16}, // 0x29 ')' + {219, 8, 8, 9, 3, -17}, // 0x2A '*' + {227, 12, 11, 14, 2, -10}, // 0x2B '+' + {244, 5, 7, 7, 1, -2}, // 0x2C ',' + {249, 7, 3, 8, 2, -7}, // 0x2D '-' + {252, 4, 3, 7, 2, -2}, // 0x2E '.' + {254, 10, 17, 7, 0, -16}, // 0x2F '/' + {276, 13, 17, 13, 2, -16}, // 0x30 '0' + {304, 9, 17, 13, 4, -16}, // 0x31 '1' + {324, 15, 17, 13, 1, -16}, // 0x32 '2' + {356, 13, 17, 13, 2, -16}, // 0x33 '3' + {384, 13, 17, 13, 1, -16}, // 0x34 '4' + {412, 14, 17, 13, 1, -16}, // 0x35 '5' + {442, 13, 17, 13, 2, -16}, // 0x36 '6' + {470, 13, 17, 13, 3, -16}, // 0x37 '7' + {498, 14, 17, 13, 1, -16}, // 0x38 '8' + {528, 14, 17, 13, 2, -16}, // 0x39 '9' + {558, 6, 12, 8, 3, -11}, // 0x3A ':' + {567, 7, 16, 8, 2, -11}, // 0x3B ';' + {581, 13, 12, 14, 2, -11}, // 0x3C '<' + {601, 14, 9, 14, 1, -9}, // 0x3D '=' + {617, 13, 12, 14, 1, -10}, // 0x3E '>' + {637, 13, 18, 15, 4, -17}, // 0x3F '?' + {667, 22, 21, 23, 2, -17}, // 0x40 '@' + {725, 17, 18, 17, 0, -17}, // 0x41 'A' + {764, 17, 18, 17, 2, -17}, // 0x42 'B' + {803, 17, 18, 17, 3, -17}, // 0x43 'C' + {842, 17, 18, 17, 2, -17}, // 0x44 'D' + {881, 16, 18, 16, 2, -17}, // 0x45 'E' + {917, 16, 18, 15, 2, -17}, // 0x46 'F' + {953, 17, 18, 19, 3, -17}, // 0x47 'G' + {992, 17, 18, 17, 2, -17}, // 0x48 'H' + {1031, 7, 18, 7, 2, -17}, // 0x49 'I' + {1047, 14, 18, 13, 1, -17}, // 0x4A 'J' + {1079, 18, 18, 17, 2, -17}, // 0x4B 'K' + {1120, 13, 18, 15, 2, -17}, // 0x4C 'L' + {1150, 20, 18, 20, 2, -17}, // 0x4D 'M' + {1195, 18, 18, 17, 2, -17}, // 0x4E 'N' + {1236, 17, 18, 19, 3, -17}, // 0x4F 'O' + {1275, 16, 18, 16, 2, -17}, // 0x50 'P' + {1311, 17, 19, 19, 3, -17}, // 0x51 'Q' + {1352, 17, 18, 17, 2, -17}, // 0x52 'R' + {1391, 16, 18, 16, 2, -17}, // 0x53 'S' + {1427, 15, 18, 15, 3, -17}, // 0x54 'T' + {1461, 16, 18, 17, 3, -17}, // 0x55 'U' + {1497, 15, 18, 16, 4, -17}, // 0x56 'V' + {1531, 21, 18, 23, 4, -17}, // 0x57 'W' + {1579, 18, 18, 16, 1, -17}, // 0x58 'X' + {1620, 15, 18, 16, 4, -17}, // 0x59 'Y' + {1654, 17, 18, 15, 1, -17}, // 0x5A 'Z' + {1693, 10, 23, 8, 1, -17}, // 0x5B '[' + {1722, 4, 23, 7, 3, -22}, // 0x5C '\' + {1734, 10, 23, 8, 0, -17}, // 0x5D ']' + {1763, 11, 11, 14, 3, -16}, // 0x5E '^' + {1779, 15, 2, 13, -2, 4}, // 0x5F '_' + {1783, 4, 3, 8, 4, -17}, // 0x60 '`' + {1785, 13, 13, 13, 1, -12}, // 0x61 'a' + {1807, 15, 18, 15, 1, -17}, // 0x62 'b' + {1841, 13, 13, 13, 2, -12}, // 0x63 'c' + {1863, 15, 18, 15, 2, -17}, // 0x64 'd' + {1897, 13, 13, 13, 2, -12}, // 0x65 'e' + {1919, 9, 18, 8, 2, -17}, // 0x66 'f' + {1940, 15, 18, 15, 1, -12}, // 0x67 'g' + {1974, 14, 18, 15, 2, -17}, // 0x68 'h' + {2006, 7, 18, 7, 2, -17}, // 0x69 'i' + {2022, 10, 23, 7, -1, -17}, // 0x6A 'j' + {2051, 15, 18, 13, 1, -17}, // 0x6B 'k' + {2085, 7, 18, 7, 2, -17}, // 0x6C 'l' + {2101, 21, 13, 21, 1, -12}, // 0x6D 'm' + {2136, 14, 13, 15, 2, -12}, // 0x6E 'n' + {2159, 14, 13, 15, 2, -12}, // 0x6F 'o' + {2182, 16, 18, 15, 0, -12}, // 0x70 'p' + {2218, 14, 18, 15, 2, -12}, // 0x71 'q' + {2250, 10, 13, 9, 2, -12}, // 0x72 'r' + {2267, 12, 13, 13, 3, -12}, // 0x73 's' + {2287, 8, 15, 8, 2, -14}, // 0x74 't' + {2302, 14, 13, 15, 2, -12}, // 0x75 'u' + {2325, 13, 13, 13, 3, -12}, // 0x76 'v' + {2347, 17, 13, 19, 3, -12}, // 0x77 'w' + {2375, 16, 13, 13, 0, -12}, // 0x78 'x' + {2401, 15, 18, 13, 1, -12}, // 0x79 'y' + {2435, 13, 13, 12, 1, -12}, // 0x7A 'z' + {2457, 9, 23, 9, 3, -17}, // 0x7B '{' + {2483, 6, 23, 7, 1, -17}, // 0x7C '|' + {2501, 9, 23, 9, 0, -17}, // 0x7D '}' + {2527, 12, 5, 14, 2, -7}}; // 0x7E '~' + +const GFXfont FreeSansBoldOblique12pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique12pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique12pt7bGlyphs, 0x20, 0x7E, 29}; + +// Approx. 3207 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h new file mode 100644 index 0000000..441c6b5 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h @@ -0,0 +1,547 @@ +#pragma once +#include + +const uint8_t FreeSansBoldOblique18pt7bBitmaps[] PROGMEM = { + 0x06, 0x01, 0xC0, 0x7C, 0x1F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, + 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x01, 0xC0, + 0x60, 0x7C, 0x1F, 0x07, 0xC3, 0xF0, 0xF8, 0x00, 0x78, 0x7B, 0xC3, 0xFE, + 0x3F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0x83, 0x9C, 0x1C, 0xC0, 0xC0, 0x00, + 0x3C, 0x38, 0x00, 0xF1, 0xE0, 0x07, 0x87, 0x00, 0x1E, 0x3C, 0x00, 0xF0, + 0xE0, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xF8, + 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xE1, 0xE0, 0x07, 0x8F, 0x00, 0x1C, + 0x3C, 0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, + 0x01, 0xE3, 0xC0, 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x01, 0xE1, 0xC0, 0x07, + 0x8F, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0xFC, + 0x00, 0xFF, 0xC0, 0x3F, 0xFC, 0x0F, 0xFF, 0xC3, 0xE6, 0x78, 0x78, 0xCF, + 0x1E, 0x39, 0xE3, 0xC7, 0x3C, 0x78, 0xC0, 0x0F, 0x98, 0x01, 0xFF, 0x00, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0x7F, 0x80, 0x0F, 0xF0, + 0x03, 0xBE, 0x00, 0x67, 0xCF, 0x8C, 0xF9, 0xF1, 0x9F, 0x3E, 0x77, 0xC7, + 0xEF, 0xF8, 0x7F, 0xFE, 0x0F, 0xFF, 0x80, 0xFF, 0xE0, 0x03, 0xE0, 0x00, + 0x38, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x07, 0x01, 0xE0, + 0x03, 0x81, 0xFE, 0x00, 0xC0, 0xFF, 0x80, 0x70, 0x7F, 0xF0, 0x38, 0x1E, + 0x3C, 0x1C, 0x0F, 0x07, 0x06, 0x03, 0x81, 0xC3, 0x80, 0xE0, 0xF1, 0xC0, + 0x3C, 0x78, 0xE0, 0x0F, 0xFE, 0x30, 0x01, 0xFF, 0x1C, 0x00, 0x7F, 0x8E, + 0x00, 0x07, 0x83, 0x00, 0x00, 0x01, 0x83, 0xE0, 0x00, 0xE3, 0xFE, 0x00, + 0x71, 0xFF, 0x80, 0x18, 0xFF, 0xF0, 0x0C, 0x3C, 0x3C, 0x07, 0x1C, 0x07, + 0x03, 0x87, 0x01, 0xC0, 0xC1, 0xE1, 0xE0, 0x60, 0x7F, 0xF8, 0x38, 0x0F, + 0xFC, 0x1C, 0x03, 0xFE, 0x06, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x03, + 0xFC, 0x00, 0x3F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0x3C, 0x01, 0xF1, 0xE0, + 0x0F, 0x8F, 0x00, 0x7C, 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x3F, + 0x00, 0x03, 0xF0, 0x00, 0x7F, 0xC7, 0x8F, 0xFE, 0x3C, 0xFC, 0xFB, 0xCF, + 0x83, 0xFE, 0xF8, 0x1F, 0xE7, 0xC0, 0x7E, 0x3E, 0x03, 0xE1, 0xF0, 0x1F, + 0x0F, 0xE3, 0xFC, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF, 0x87, 0xFE, 0x7C, 0x0F, + 0xE1, 0xF0, 0x7B, 0xFF, 0xEF, 0x7B, 0x9C, 0xC0, 0x00, 0x78, 0x07, 0x80, + 0x78, 0x03, 0x80, 0x3C, 0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, + 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80, + 0x1C, 0x00, 0x01, 0xC0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x01, 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x1E, + 0x00, 0xF0, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x1E, 0x01, + 0xE0, 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x03, 0x00, 0x70, 0x07, + 0x04, 0x63, 0xFF, 0xF7, 0xFF, 0x1F, 0x83, 0xF0, 0x3B, 0x87, 0x38, 0x21, + 0x00, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x7C, 0x07, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, + 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x3E, 0x7C, 0xF3, 0xE7, 0xC1, 0x87, 0x0C, 0x39, 0xE3, 0x00, 0x7F, + 0xDF, 0xFF, 0xFB, 0xFE, 0x7D, 0xF7, 0xBE, 0xF8, 0x00, 0x0E, 0x00, 0x18, + 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x30, 0x00, + 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0, + 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, + 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0xC0, + 0x7F, 0xF8, 0x3F, 0xFE, 0x0F, 0x8F, 0xC7, 0xC1, 0xF1, 0xE0, 0x7C, 0xF8, + 0x1F, 0x3E, 0x07, 0xDF, 0x01, 0xF7, 0xC0, 0x7D, 0xF0, 0x3F, 0x7C, 0x0F, + 0xBF, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x1F, 0x3E, 0x07, 0xCF, + 0x81, 0xE3, 0xE0, 0xF8, 0xFC, 0x7C, 0x1F, 0xFF, 0x07, 0xFF, 0x80, 0xFF, + 0xC0, 0x0F, 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0xFF, + 0x3F, 0xF3, 0xFF, 0x9F, 0xFC, 0x03, 0xE0, 0x1F, 0x01, 0xF0, 0x0F, 0x80, + 0x7C, 0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E, + 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E, 0x00, 0x00, 0x1F, 0x80, + 0x07, 0xFF, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xE0, 0x7E, 0x1F, 0x83, 0xE0, + 0x7C, 0x1F, 0x03, 0xE1, 0xF0, 0x1F, 0x0F, 0x80, 0xF8, 0x00, 0x0F, 0x80, + 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0xFC, + 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, + 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xFF, 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF0, + 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0xE0, 0x7F, + 0xFF, 0x0F, 0x83, 0xF0, 0xF0, 0x1F, 0x1F, 0x01, 0xF1, 0xE0, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0xFF, 0x80, + 0x0F, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xCF, 0x80, 0x7C, + 0xF8, 0x07, 0xCF, 0x80, 0xF8, 0xFC, 0x3F, 0x8F, 0xFF, 0xF0, 0x7F, 0xFE, + 0x03, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, + 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0xEF, 0x80, 0x3D, 0xF0, 0x0F, + 0x7C, 0x03, 0xCF, 0x80, 0xF1, 0xF0, 0x1C, 0x3E, 0x07, 0x07, 0xC1, 0xE1, + 0xF0, 0x78, 0x3E, 0x1E, 0x07, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xDF, 0xFF, + 0xFB, 0xFF, 0xFF, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x1F, + 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xFF, 0xF0, 0x3F, 0xFF, 0x03, + 0xFF, 0xF0, 0x3F, 0xFF, 0x07, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x00, + 0xF7, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 0xF0, 0xFC, + 0x3E, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, + 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x8F, 0xC3, 0xF0, 0xFF, 0xFE, 0x07, 0xFF, + 0xC0, 0x3F, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, + 0xFF, 0x03, 0xFF, 0xE0, 0xF8, 0x7E, 0x3E, 0x07, 0xC7, 0x80, 0x01, 0xF0, + 0x00, 0x3C, 0xFC, 0x07, 0xFF, 0xC1, 0xFF, 0xFC, 0x3F, 0xFF, 0xC7, 0xE1, + 0xF8, 0xF8, 0x1F, 0x3E, 0x03, 0xE7, 0x80, 0x7C, 0xF0, 0x0F, 0x9E, 0x01, + 0xE3, 0xC0, 0x7C, 0x78, 0x1F, 0x0F, 0x87, 0xE0, 0xFF, 0xF8, 0x1F, 0xFE, + 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xF9, 0xFF, + 0xFF, 0x7F, 0xFF, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, + 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xF0, 0x00, 0x7C, + 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0x07, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x07, 0xFF, 0xE0, 0xFF, + 0xFF, 0x0F, 0x81, 0xF1, 0xF0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1F, + 0x07, 0xE0, 0xFF, 0xFC, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, + 0xF0, 0xFC, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x07, 0xCF, 0x80, 0x7C, + 0xF8, 0x0F, 0x8F, 0x80, 0xF8, 0xFC, 0x3F, 0x0F, 0xFF, 0xF0, 0x7F, 0xFE, + 0x03, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, + 0xFF, 0x03, 0xFF, 0xE0, 0xFC, 0x3E, 0x3F, 0x03, 0xC7, 0xC0, 0x79, 0xF0, + 0x0F, 0x3E, 0x01, 0xE7, 0xC0, 0x3C, 0xF8, 0x0F, 0x9F, 0x03, 0xE3, 0xF0, + 0xFC, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFE, 0x07, 0xE7, 0x80, 0x01, + 0xF0, 0x00, 0x3C, 0x7C, 0x0F, 0x8F, 0xC3, 0xE1, 0xFF, 0xF8, 0x1F, 0xFE, + 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x0F, 0x87, 0xC3, 0xC3, 0xE1, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE1, 0xF0, 0xF0, + 0xF8, 0x7C, 0x00, 0x07, 0xC1, 0xF0, 0x78, 0x3E, 0x0F, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x83, 0xE0, 0xF0, 0x7C, + 0x1F, 0x00, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x3C, 0x00, 0x3F, 0x80, 0x3F, 0xE0, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, + 0xFC, 0x07, 0xFC, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0x80, 0x1F, + 0xFE, 0x00, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x78, 0x00, + 0x03, 0x00, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xC7, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x18, 0x00, 0x03, 0xC0, + 0x00, 0x7F, 0x00, 0x0F, 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x3F, + 0xF8, 0x01, 0xFF, 0x00, 0x07, 0xE0, 0x07, 0xFC, 0x07, 0xFF, 0x07, 0xFF, + 0x87, 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0x80, 0x07, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x03, 0xF8, 0x03, 0xFF, 0xC1, 0xFF, 0xF8, 0xFF, 0xFE, 0x7E, 0x1F, + 0xDF, 0x03, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xC0, 0x03, 0xE0, + 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, + 0x80, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFE, + 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xE0, 0x0F, 0x80, 0x00, + 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x01, 0xF1, 0xCF, 0x0F, 0x03, 0xFD, + 0xC7, 0x8F, 0x03, 0xFF, 0xE1, 0xC7, 0x03, 0xE3, 0xE0, 0xE7, 0x03, 0xC0, + 0xF0, 0x73, 0x83, 0xC0, 0x78, 0x3B, 0x81, 0xE0, 0x38, 0x1D, 0xC1, 0xE0, + 0x1C, 0x1C, 0xC0, 0xF0, 0x1C, 0x0E, 0xE0, 0x70, 0x0E, 0x0F, 0x70, 0x78, + 0x0E, 0x07, 0x38, 0x3C, 0x0F, 0x07, 0x1C, 0x1E, 0x0F, 0x87, 0x8E, 0x0F, + 0x8F, 0xCF, 0x87, 0x07, 0xFF, 0xFF, 0x83, 0xC1, 0xFE, 0x7F, 0x00, 0xE0, + 0x3C, 0x1F, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F, + 0xC0, 0x01, 0x00, 0x03, 0xF8, 0x07, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x00, + 0x1F, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, + 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x03, + 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0x7C, 0x00, 0x7E, 0xF8, 0x00, 0xF9, + 0xF0, 0x03, 0xF3, 0xE0, 0x07, 0xC3, 0xE0, 0x1F, 0x87, 0xC0, 0x3E, 0x0F, + 0x80, 0xF8, 0x1F, 0x01, 0xF0, 0x3E, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, + 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xF1, 0xF0, 0x03, 0xE7, 0xC0, 0x07, 0xCF, + 0x80, 0x0F, 0xBE, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x7C, 0x07, + 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, + 0xC0, 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F, + 0x80, 0x1E, 0x1F, 0x80, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3E, 0x00, 0xFC, 0x3E, + 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, + 0x00, 0xF8, 0x7C, 0x01, 0xF8, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, + 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x07, 0xE0, 0x7F, 0x0F, 0xC0, 0x3F, 0x1F, + 0x80, 0x1F, 0x3F, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x7E, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x7C, 0xF8, + 0x00, 0x7C, 0xFC, 0x00, 0xF8, 0xFC, 0x01, 0xF8, 0x7F, 0x07, 0xF0, 0x7F, + 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x07, + 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x0F, + 0x80, 0x7E, 0x0F, 0x80, 0x3F, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F, + 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x3F, + 0x00, 0x1F, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, + 0x00, 0x3E, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 0x00, 0xF8, 0x7C, + 0x01, 0xF8, 0x7C, 0x07, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF, + 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x07, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x0F, + 0x80, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF0, 0x3F, + 0xFF, 0xF0, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x07, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, 0xF8, + 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFE, + 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, + 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xFC, 0x03, + 0xFF, 0xFE, 0x07, 0xE0, 0x7E, 0x0F, 0x80, 0x3F, 0x1F, 0x00, 0x1F, 0x3E, + 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0xF8, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xF8, 0x07, 0xFE, 0xF8, + 0x07, 0xFE, 0xF8, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFC, 0x00, 0x7E, 0xFC, + 0x00, 0x7C, 0x7E, 0x00, 0xFC, 0x7F, 0x83, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xBC, 0x0F, 0xFF, 0x38, 0x03, 0xFC, 0x38, 0x03, 0xE0, 0x07, 0xC0, + 0xF8, 0x01, 0xF0, 0x7E, 0x00, 0x7C, 0x1F, 0x00, 0x3F, 0x07, 0xC0, 0x0F, + 0x81, 0xF0, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, + 0x1F, 0x83, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, + 0x3F, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x07, 0xE0, 0xF8, 0x01, + 0xF0, 0x3E, 0x00, 0x7C, 0x1F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0, + 0x03, 0xF0, 0x7C, 0x00, 0xF8, 0x3F, 0x00, 0x3E, 0x00, 0x07, 0xC3, 0xF0, + 0xFC, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, + 0x3F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xE1, 0xF0, 0x7C, 0x1F, + 0x07, 0xC3, 0xF0, 0xFC, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, + 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x7C, 0x0F, + 0x8F, 0x81, 0xF8, 0xF8, 0x1F, 0x0F, 0x81, 0xF0, 0xF8, 0x1F, 0x0F, 0xC3, + 0xF0, 0xFF, 0xFE, 0x07, 0xFF, 0xC0, 0x3F, 0xF8, 0x01, 0xFC, 0x00, 0x07, + 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7C, 0x03, 0xF0, 0x3F, 0x03, 0xF8, + 0x0F, 0x81, 0xF8, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x7E, 0x00, 0x7E, 0x3F, + 0x00, 0x1F, 0x1F, 0x80, 0x07, 0xCF, 0xC0, 0x01, 0xF7, 0xE0, 0x00, 0x7F, + 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, + 0xFE, 0xFC, 0x00, 0x3F, 0x1F, 0x80, 0x1F, 0x87, 0xE0, 0x07, 0xC0, 0xFC, + 0x01, 0xF0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x1F, 0x01, 0xFC, 0x0F, 0xC0, + 0x3F, 0x03, 0xE0, 0x0F, 0xE0, 0xF8, 0x01, 0xF8, 0x3E, 0x00, 0x3F, 0x00, + 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, + 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, + 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 0x03, + 0xF8, 0x01, 0xFC, 0x07, 0xF0, 0x07, 0xF8, 0x1F, 0xE0, 0x0F, 0xF0, 0x3F, + 0xC0, 0x3F, 0xE0, 0x7F, 0x80, 0x7F, 0xC0, 0xFF, 0x01, 0xFF, 0x01, 0xFE, + 0x03, 0xFE, 0x07, 0xDC, 0x07, 0x7C, 0x0F, 0xB8, 0x1E, 0xF8, 0x1F, 0x70, + 0x3D, 0xF0, 0x3E, 0xF0, 0xF7, 0xC0, 0xF9, 0xE1, 0xEF, 0x81, 0xF3, 0xC7, + 0x9F, 0x03, 0xE7, 0x8F, 0x3E, 0x07, 0xCF, 0x3C, 0x7C, 0x0F, 0x9E, 0x79, + 0xF0, 0x3E, 0x3C, 0xE3, 0xE0, 0x7C, 0x7B, 0xC7, 0xC0, 0xF8, 0xF7, 0x8F, + 0x81, 0xF1, 0xFE, 0x1E, 0x07, 0xE3, 0xFC, 0x7C, 0x0F, 0x87, 0xF0, 0xF8, + 0x1F, 0x0F, 0xE1, 0xF0, 0x3E, 0x1F, 0x83, 0xE0, 0x7C, 0x3F, 0x0F, 0x81, + 0xF0, 0x7E, 0x1F, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x7E, 0x00, 0xF8, 0x1F, + 0xC0, 0x1F, 0x03, 0xF8, 0x03, 0xE0, 0x7F, 0x80, 0x7C, 0x0F, 0xF0, 0x1F, + 0x01, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, 0xBC, 0x0F, 0x81, 0xF7, + 0xC1, 0xF0, 0x3E, 0xF8, 0x7C, 0x0F, 0x8F, 0x0F, 0x81, 0xF1, 0xF1, 0xF0, + 0x3E, 0x3E, 0x3E, 0x07, 0xC3, 0xC7, 0xC0, 0xF8, 0x7D, 0xF0, 0x3E, 0x0F, + 0xBE, 0x07, 0xC0, 0xF7, 0xC0, 0xF8, 0x1F, 0xF8, 0x1F, 0x01, 0xFE, 0x03, + 0xC0, 0x3F, 0xC0, 0xF8, 0x07, 0xF8, 0x1F, 0x00, 0x7F, 0x03, 0xE0, 0x0F, + 0xE0, 0x7C, 0x01, 0xF8, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7E, 0x07, 0xF0, + 0x7E, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00, 0x0F, + 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xFF, 0x80, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8, 0x00, + 0x1F, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x9F, 0x80, 0x0F, 0x87, 0xE0, + 0x0F, 0x83, 0xF8, 0x1F, 0x80, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x0F, + 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xF0, 0xF8, 0x07, 0xE1, 0xF0, 0x07, 0xC3, + 0xE0, 0x0F, 0x8F, 0xC0, 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0x7C, + 0x01, 0xF0, 0xF8, 0x07, 0xC3, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, + 0xF8, 0x1F, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x00, + 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x3F, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7F, 0x07, + 0xF0, 0x7E, 0x01, 0xF8, 0x7E, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00, + 0x0F, 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xF7, 0x80, + 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8, + 0x02, 0x1F, 0x7C, 0x03, 0x9F, 0x3E, 0x03, 0xFF, 0x9F, 0x81, 0xFF, 0x87, + 0xE0, 0x7F, 0x83, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFC, 0x01, 0xFE, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xFF, + 0xF8, 0x07, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 0x80, + 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F, 0x80, + 0x1E, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, + 0xE0, 0x3F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3E, 0x01, 0xF8, 0x3E, 0x00, + 0xF8, 0x3E, 0x00, 0xF8, 0x7E, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x01, + 0xF0, 0x7C, 0x01, 0xF0, 0x7C, 0x01, 0xF0, 0xFC, 0x01, 0xF0, 0xF8, 0x01, + 0xF0, 0xF8, 0x01, 0xF0, 0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xC0, 0x3F, 0xFF, + 0x81, 0xFF, 0xFF, 0x0F, 0xC0, 0xFC, 0x3E, 0x01, 0xF1, 0xF0, 0x07, 0xC7, + 0xC0, 0x1F, 0x1F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, + 0x80, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x03, 0xFE, + 0x00, 0x01, 0xF8, 0x00, 0x03, 0xEF, 0x80, 0x0F, 0xBE, 0x00, 0x3C, 0xFC, + 0x01, 0xF3, 0xF8, 0x1F, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, + 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, + 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, + 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, + 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, + 0x00, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, + 0x3F, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00, + 0x7E, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7C, 0x00, + 0x7C, 0x7C, 0x00, 0xFC, 0x7C, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x00, + 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x01, 0xF8, 0xF8, 0x01, 0xF0, 0xF8, 0x01, + 0xF0, 0xF8, 0x03, 0xE0, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xC0, 0x7F, 0xFF, + 0x80, 0x1F, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0xF0, 0x03, + 0xE7, 0xC0, 0x0F, 0x9F, 0x00, 0x7C, 0x7C, 0x01, 0xF1, 0xF0, 0x0F, 0x87, + 0xC0, 0x3E, 0x1F, 0x01, 0xF0, 0x7C, 0x07, 0x81, 0xF0, 0x3E, 0x03, 0xC0, + 0xF0, 0x0F, 0x07, 0xC0, 0x3E, 0x1E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xC0, + 0x0F, 0x9F, 0x00, 0x3E, 0x78, 0x00, 0xFB, 0xE0, 0x01, 0xEF, 0x00, 0x07, + 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0, + 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x07, 0xE0, 0x1F, 0xF8, + 0x07, 0xE0, 0x3F, 0xF8, 0x0F, 0xE0, 0x3E, 0xF8, 0x0F, 0xE0, 0x7E, 0xF8, + 0x1F, 0xE0, 0x7C, 0xF8, 0x1F, 0xE0, 0x7C, 0xF8, 0x3F, 0xE0, 0xF8, 0xF8, + 0x3D, 0xE0, 0xF8, 0x78, 0x3D, 0xE1, 0xF0, 0x78, 0x79, 0xE1, 0xF0, 0x78, + 0x79, 0xE1, 0xE0, 0x78, 0xF9, 0xE3, 0xE0, 0x78, 0xF1, 0xE3, 0xC0, 0x79, + 0xF1, 0xE7, 0xC0, 0x79, 0xE1, 0xE7, 0x80, 0x79, 0xE1, 0xE7, 0x80, 0x7B, + 0xC1, 0xEF, 0x80, 0x7B, 0xC1, 0xEF, 0x00, 0x7F, 0x81, 0xFF, 0x00, 0x7F, + 0x81, 0xFE, 0x00, 0x7F, 0x01, 0xFE, 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x7F, + 0x01, 0xFC, 0x00, 0x7E, 0x01, 0xF8, 0x00, 0x3E, 0x01, 0xF8, 0x00, 0x3C, + 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x07, 0xE0, 0x7E, 0x01, 0xF8, 0x07, 0xE0, + 0x7E, 0x00, 0xFC, 0x1F, 0x80, 0x1F, 0x83, 0xE0, 0x01, 0xF8, 0xF8, 0x00, + 0x3F, 0x3F, 0x00, 0x03, 0xEF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x0F, 0xFC, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x3E, 0xF8, 0x00, 0x0F, 0xDF, 0x80, 0x03, 0xF3, 0xF0, 0x00, 0xFC, + 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x07, 0xE0, 0xFC, 0x01, 0xF8, 0x0F, 0xC0, + 0x7E, 0x01, 0xF8, 0x1F, 0x80, 0x3F, 0x80, 0x7C, 0x00, 0xFD, 0xF8, 0x07, + 0xE7, 0xE0, 0x1F, 0x1F, 0x80, 0xFC, 0x3E, 0x07, 0xE0, 0xFC, 0x1F, 0x03, + 0xF0, 0xFC, 0x07, 0xC7, 0xE0, 0x1F, 0x1F, 0x00, 0x7E, 0xFC, 0x00, 0xFB, + 0xE0, 0x03, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, + 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, + 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xE0, 0x00, + 0x07, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF8, 0x00, + 0x03, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xF0, 0x7F, 0xFF, 0xF0, 0x00, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F, + 0xF0, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x00, 0xE7, 0x39, 0xCE, 0x31, 0x8C, + 0x63, 0x1C, 0xE7, 0x39, 0xCE, 0x31, 0x8C, 0x63, 0x9C, 0xE7, 0x38, 0x01, + 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x1F, 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, + 0x00, 0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x03, + 0x9E, 0x07, 0x9E, 0x0F, 0x1E, 0x0F, 0x1E, 0x1E, 0x1E, 0x1C, 0x0F, 0x3C, + 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xF3, 0x8C, 0x71, 0x80, 0x01, 0xFE, 0x01, 0xFF, 0xE0, + 0xFF, 0xF8, 0x7F, 0xFF, 0x1F, 0x0F, 0xC7, 0x81, 0xF0, 0x00, 0x7C, 0x00, + 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xE3, 0xFE, 0xF9, 0xF0, 0x7C, 0xF8, 0x1F, + 0x3E, 0x0F, 0xCF, 0x87, 0xF3, 0xFF, 0xF8, 0xFF, 0xFE, 0x1F, 0xEF, 0x81, + 0xE3, 0xF0, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, + 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF9, 0xF8, 0x0F, 0xFF, + 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xFC, 0x3F, 0x1F, 0x83, 0xF1, 0xF0, + 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, + 0x03, 0xE7, 0xC0, 0x3E, 0x7E, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0xFF, 0x87, + 0xFF, 0xF0, 0xFB, 0xFE, 0x0F, 0x9F, 0x80, 0x00, 0xFC, 0x01, 0xFF, 0xC0, + 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF7, 0xC0, 0x7D, 0xF0, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x0F, + 0xBE, 0x07, 0xCF, 0xC3, 0xF1, 0xFF, 0xF8, 0x7F, 0xFC, 0x0F, 0xFE, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, + 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x7E, 0x7C, + 0x07, 0xFD, 0xF0, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E, + 0x07, 0xE1, 0xF0, 0x1F, 0x87, 0xC0, 0x3C, 0x3E, 0x00, 0xF0, 0xF8, 0x07, + 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83, + 0xF0, 0xFE, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x7E, + 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xE0, 0x3F, 0xFE, 0x0F, 0xFF, 0xE3, + 0xF0, 0x7E, 0x7C, 0x07, 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x3F, + 0x07, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x03, 0xFF, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7C, 0x07, 0xC0, 0x3E, 0x0F, + 0xFE, 0x7F, 0xF3, 0xFF, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, + 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x07, 0xC0, 0x3E, 0x01, + 0xF0, 0x0F, 0x80, 0xF8, 0x07, 0xC0, 0x00, 0x00, 0x7C, 0x7C, 0x07, 0xFD, + 0xF0, 0x3F, 0xF7, 0x81, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E, 0x07, 0xE1, + 0xF8, 0x0F, 0x87, 0xC0, 0x3C, 0x1E, 0x00, 0xF0, 0xF8, 0x03, 0xC3, 0xE0, + 0x1F, 0x0F, 0x80, 0x78, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83, 0xF0, 0xFE, + 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0x3F, 0xEF, 0x00, 0x3E, 0x7C, 0x00, + 0x01, 0xF0, 0x00, 0x07, 0xC3, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3F, 0x0F, + 0xC0, 0x7F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x0F, 0x80, 0x00, 0xF8, 0xF8, 0x0F, 0xBF, 0xE0, 0xFF, 0xFF, 0x0F, + 0xFF, 0xF1, 0xFC, 0x3F, 0x1F, 0x81, 0xF1, 0xF0, 0x1F, 0x1F, 0x01, 0xF1, + 0xE0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, + 0x7C, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C, 0x07, + 0xCF, 0x80, 0x78, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, + 0x0F, 0x87, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00, + 0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, + 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, + 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x1F, + 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xF0, 0x1F, 0xC0, 0x3F, 0x80, + 0x7E, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, + 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, + 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E, 0x01, + 0xF7, 0xE0, 0x0F, 0xFE, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xFC, + 0x01, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0xFC, 0xFC, 0x07, 0xC3, 0xE0, 0x3E, + 0x1F, 0x01, 0xF0, 0xFC, 0x0F, 0x83, 0xE0, 0xF8, 0x1F, 0x87, 0xC0, 0xFC, + 0x00, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x1F, + 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x87, + 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00, 0x0F, 0x8F, + 0x83, 0xF0, 0x3E, 0xFF, 0x3F, 0xE0, 0xF7, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, + 0xFF, 0x1F, 0xC7, 0xF8, 0x7C, 0x7C, 0x0F, 0x81, 0xF1, 0xF0, 0x3E, 0x07, + 0xCF, 0x81, 0xF0, 0x3E, 0x3E, 0x07, 0xC0, 0xF8, 0xF8, 0x1F, 0x03, 0xE3, + 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x7C, 0x0F, 0x81, 0xF1, 0xF0, + 0x3E, 0x07, 0xC7, 0xC0, 0xF8, 0x1F, 0x1F, 0x03, 0xE0, 0x7C, 0x7C, 0x0F, + 0x81, 0xE3, 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x00, 0x0F, 0x8F, + 0x80, 0xFB, 0xFE, 0x0F, 0xFF, 0xF1, 0xFF, 0xFF, 0x1F, 0xC3, 0xF1, 0xF8, + 0x1F, 0x1F, 0x01, 0xF1, 0xF0, 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x3E, 0x3E, + 0x03, 0xE3, 0xE0, 0x3E, 0x3C, 0x03, 0xE7, 0xC0, 0x3E, 0x7C, 0x07, 0xC7, + 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0x80, 0x7C, 0xF8, 0x07, 0x80, 0x00, 0xFE, + 0x00, 0x7F, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xF8, 0xFE, 0x7C, 0x0F, + 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x1F, + 0xFC, 0x03, 0xEF, 0x80, 0x7D, 0xF8, 0x1F, 0x3F, 0x07, 0xE3, 0xFF, 0xF8, + 0x7F, 0xFE, 0x07, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xE7, 0xE0, 0x0F, + 0xBF, 0xC0, 0x7D, 0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xF0, 0xFC, 0x1F, 0x81, + 0xF0, 0x7C, 0x07, 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x01, 0xF0, + 0xF0, 0x07, 0xC3, 0xC0, 0x3E, 0x1F, 0x00, 0xF8, 0x7E, 0x07, 0xC1, 0xFC, + 0x7F, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0xFB, 0xFE, 0x03, 0xE7, 0xE0, + 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, + 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x01, + 0xF1, 0xF0, 0x7F, 0xDF, 0x0F, 0xFD, 0xF1, 0xFF, 0xFE, 0x3F, 0x8F, 0xE3, + 0xE0, 0x7E, 0x7C, 0x03, 0xE7, 0xC0, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x3C, + 0xF8, 0x07, 0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xFC, 0x3F, + 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x83, 0xFF, 0xF0, 0x1F, 0x9F, 0x00, 0x01, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x0F, 0x8E, 0x1F, 0x7C, 0x3F, + 0xF0, 0xFF, 0xE1, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, 0x00, + 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, + 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x00, 0x01, 0xFC, 0x01, 0xFF, 0xC0, + 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF3, 0xF0, 0x00, 0xFF, + 0x80, 0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xF8, 0x03, 0xFE, 0x00, 0x1F, + 0xBE, 0x03, 0xEF, 0xC1, 0xFB, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xFF, 0x00, + 0xFE, 0x00, 0x0F, 0x81, 0xF0, 0x7C, 0x0F, 0x81, 0xF0, 0xFF, 0xBF, 0xF7, + 0xFE, 0x3E, 0x07, 0xC0, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, + 0xF8, 0x1F, 0x03, 0xE0, 0x7F, 0x0F, 0xE1, 0xFC, 0x1F, 0x80, 0x1F, 0x01, + 0xF1, 0xF0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0, + 0x3E, 0x3E, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C, + 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xF8, 0x3F, 0x8F, + 0xFF, 0xF8, 0xFF, 0xFF, 0x07, 0xFD, 0xF0, 0x3F, 0x1F, 0x00, 0xF8, 0x0F, + 0xFE, 0x03, 0xEF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0x3E, 0x3E, 0x0F, 0x8F, + 0x87, 0xC1, 0xE1, 0xF0, 0x78, 0xF8, 0x1E, 0x3E, 0x07, 0x9F, 0x01, 0xF7, + 0x80, 0x7F, 0xE0, 0x1F, 0xF0, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80, + 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x1F, 0x07, 0xFF, 0x03, 0xE0, 0xFB, + 0xE0, 0xFC, 0x1F, 0x7C, 0x1F, 0x87, 0xCF, 0x87, 0xF0, 0xF9, 0xF0, 0xFE, + 0x3E, 0x3E, 0x3D, 0xC7, 0xC3, 0xC7, 0xB9, 0xF0, 0x79, 0xE7, 0x3E, 0x0F, + 0x3C, 0xE7, 0x81, 0xEF, 0x1D, 0xF0, 0x3D, 0xE3, 0xBC, 0x07, 0xBC, 0x7F, + 0x80, 0xFF, 0x0F, 0xE0, 0x1F, 0xE1, 0xFC, 0x03, 0xF8, 0x3F, 0x00, 0x7F, + 0x07, 0xE0, 0x0F, 0xC0, 0xF8, 0x01, 0xF8, 0x1F, 0x00, 0x00, 0x0F, 0xC1, + 0xF8, 0x3F, 0x07, 0xC0, 0x7C, 0x3E, 0x01, 0xF9, 0xF8, 0x03, 0xEF, 0xC0, + 0x0F, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x80, 0x01, 0xFC, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x3E, 0xF8, + 0x01, 0xFB, 0xF0, 0x07, 0xC7, 0xC0, 0x3E, 0x1F, 0x81, 0xF8, 0x7E, 0x0F, + 0xC0, 0xF8, 0x00, 0x1F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x0F, 0x03, + 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3C, 0x03, 0xE1, + 0xF0, 0x07, 0x87, 0x80, 0x1F, 0x3E, 0x00, 0x7C, 0xF0, 0x01, 0xF7, 0xC0, + 0x07, 0xDE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFE, 0x00, 0x03, + 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3F, + 0xFF, 0x87, 0xFF, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, + 0xF0, 0x01, 0xFC, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, + 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xFF, 0xF8, 0xFF, 0xFF, 0x1F, 0xFF, + 0xE3, 0xFF, 0xFC, 0x00, 0x00, 0x7C, 0x03, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, + 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, + 0xE0, 0x0F, 0x80, 0x3C, 0x01, 0xF0, 0x1F, 0x80, 0x70, 0x01, 0xF8, 0x01, + 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, + 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xFC, 0x07, 0xE0, 0x0F, 0x80, + 0x1E, 0x00, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0x0E, + 0x07, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, + 0x03, 0x81, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, 0x01, + 0x80, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0xFE, 0x00, + 0x78, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, + 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x7E, 0x00, 0x38, 0x07, 0xE0, + 0x3E, 0x00, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, + 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x01, 0xF8, 0x0F, 0xE0, 0x3F, 0x00, + 0xF8, 0x00, 0x0F, 0x00, 0x1F, 0xC1, 0xDF, 0xF0, 0xEE, 0x3F, 0xE6, 0x07, + 0xF0, 0x01, 0xE0}; + +const GFXglyph FreeSansBoldOblique18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 10, 0, 1}, // 0x20 ' ' + {0, 10, 25, 12, 4, -24}, // 0x21 '!' + {32, 13, 9, 17, 6, -25}, // 0x22 '"' + {47, 22, 24, 19, 1, -23}, // 0x23 '#' + {113, 19, 31, 19, 2, -26}, // 0x24 '$' + {187, 26, 26, 31, 5, -25}, // 0x25 '%' + {272, 21, 25, 25, 3, -24}, // 0x26 '&' + {338, 5, 9, 8, 6, -25}, // 0x27 ''' + {344, 13, 33, 12, 3, -25}, // 0x28 '(' + {398, 13, 33, 12, -1, -25}, // 0x29 ')' + {452, 12, 11, 14, 5, -25}, // 0x2A '*' + {469, 18, 16, 20, 3, -15}, // 0x2B '+' + {505, 7, 11, 10, 1, -4}, // 0x2C ',' + {515, 10, 4, 12, 2, -10}, // 0x2D '-' + {520, 6, 5, 10, 2, -4}, // 0x2E '.' + {524, 15, 25, 10, 0, -24}, // 0x2F '/' + {571, 18, 25, 19, 3, -24}, // 0x30 '0' + {628, 13, 25, 19, 6, -24}, // 0x31 '1' + {669, 21, 25, 19, 1, -24}, // 0x32 '2' + {735, 20, 25, 19, 2, -24}, // 0x33 '3' + {798, 19, 25, 19, 2, -24}, // 0x34 '4' + {858, 20, 24, 19, 2, -23}, // 0x35 '5' + {918, 19, 25, 19, 3, -24}, // 0x36 '6' + {978, 19, 24, 19, 5, -23}, // 0x37 '7' + {1035, 20, 25, 19, 2, -24}, // 0x38 '8' + {1098, 19, 25, 19, 2, -24}, // 0x39 '9' + {1158, 9, 18, 12, 4, -17}, // 0x3A ':' + {1179, 10, 24, 12, 3, -17}, // 0x3B ';' + {1209, 19, 17, 20, 3, -16}, // 0x3C '<' + {1250, 20, 12, 20, 2, -13}, // 0x3D '=' + {1280, 19, 17, 20, 1, -15}, // 0x3E '>' + {1321, 18, 26, 21, 6, -25}, // 0x3F '?' + {1380, 33, 31, 34, 3, -25}, // 0x40 '@' + {1508, 23, 26, 25, 1, -25}, // 0x41 'A' + {1583, 24, 26, 25, 3, -25}, // 0x42 'B' + {1661, 24, 26, 25, 4, -25}, // 0x43 'C' + {1739, 24, 26, 25, 3, -25}, // 0x44 'D' + {1817, 24, 26, 23, 3, -25}, // 0x45 'E' + {1895, 23, 26, 21, 3, -25}, // 0x46 'F' + {1970, 24, 26, 27, 4, -25}, // 0x47 'G' + {2048, 26, 26, 25, 2, -25}, // 0x48 'H' + {2133, 10, 26, 10, 2, -25}, // 0x49 'I' + {2166, 20, 26, 19, 2, -25}, // 0x4A 'J' + {2231, 26, 26, 25, 3, -25}, // 0x4B 'K' + {2316, 18, 26, 21, 3, -25}, // 0x4C 'L' + {2375, 31, 26, 29, 2, -25}, // 0x4D 'M' + {2476, 27, 26, 25, 2, -25}, // 0x4E 'N' + {2564, 25, 26, 27, 4, -25}, // 0x4F 'O' + {2646, 23, 26, 23, 3, -25}, // 0x50 'P' + {2721, 25, 27, 27, 4, -25}, // 0x51 'Q' + {2806, 24, 26, 25, 3, -25}, // 0x52 'R' + {2884, 22, 26, 23, 3, -25}, // 0x53 'S' + {2956, 21, 26, 21, 5, -25}, // 0x54 'T' + {3025, 24, 26, 25, 4, -25}, // 0x55 'U' + {3103, 22, 26, 23, 6, -25}, // 0x56 'V' + {3175, 32, 26, 33, 6, -25}, // 0x57 'W' + {3279, 27, 26, 23, 1, -25}, // 0x58 'X' + {3367, 22, 26, 23, 6, -25}, // 0x59 'Y' + {3439, 25, 26, 21, 1, -25}, // 0x5A 'Z' + {3521, 15, 33, 12, 1, -25}, // 0x5B '[' + {3583, 5, 25, 10, 5, -24}, // 0x5C '\' + {3599, 15, 33, 12, -1, -25}, // 0x5D ']' + {3661, 16, 15, 20, 4, -23}, // 0x5E '^' + {3691, 21, 3, 19, -2, 5}, // 0x5F '_' + {3699, 5, 5, 12, 6, -25}, // 0x60 '`' + {3703, 18, 19, 19, 2, -18}, // 0x61 'a' + {3746, 20, 26, 21, 2, -25}, // 0x62 'b' + {3811, 18, 19, 19, 3, -18}, // 0x63 'c' + {3854, 22, 26, 21, 3, -25}, // 0x64 'd' + {3926, 19, 19, 19, 2, -18}, // 0x65 'e' + {3972, 13, 26, 12, 3, -25}, // 0x66 'f' + {4015, 22, 27, 21, 1, -18}, // 0x67 'g' + {4090, 20, 26, 21, 2, -25}, // 0x68 'h' + {4155, 10, 26, 10, 2, -25}, // 0x69 'i' + {4188, 15, 34, 10, -2, -25}, // 0x6A 'j' + {4252, 21, 26, 19, 2, -25}, // 0x6B 'k' + {4321, 10, 26, 10, 2, -25}, // 0x6C 'l' + {4354, 30, 19, 31, 2, -18}, // 0x6D 'm' + {4426, 20, 19, 21, 2, -18}, // 0x6E 'n' + {4474, 19, 19, 21, 3, -18}, // 0x6F 'o' + {4520, 22, 27, 21, 0, -18}, // 0x70 'p' + {4595, 20, 27, 21, 3, -18}, // 0x71 'q' + {4663, 15, 19, 14, 2, -18}, // 0x72 'r' + {4699, 18, 19, 19, 2, -18}, // 0x73 's' + {4742, 11, 23, 12, 4, -22}, // 0x74 't' + {4774, 20, 19, 21, 3, -18}, // 0x75 'u' + {4822, 18, 19, 19, 5, -18}, // 0x76 'v' + {4865, 27, 19, 27, 4, -18}, // 0x77 'w' + {4930, 22, 19, 19, 1, -18}, // 0x78 'x' + {4983, 22, 27, 19, 1, -18}, // 0x79 'y' + {5058, 19, 19, 17, 1, -18}, // 0x7A 'z' + {5104, 14, 33, 14, 2, -25}, // 0x7B '{' + {5162, 9, 33, 10, 2, -25}, // 0x7C '|' + {5200, 14, 33, 14, 2, -25}, // 0x7D '}' + {5258, 17, 6, 20, 3, -10}}; // 0x7E '~' + +const GFXfont FreeSansBoldOblique18pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique18pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique18pt7bGlyphs, 0x20, 0x7E, 42}; + +// Approx. 5943 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h new file mode 100644 index 0000000..a20229d --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h @@ -0,0 +1,895 @@ +#pragma once +#include + +const uint8_t FreeSansBoldOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xE0, 0x07, 0xF0, 0x1F, 0xC0, 0xFF, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, + 0x80, 0xFE, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x1F, + 0x80, 0x7E, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0xF8, 0x03, 0xE0, 0x0F, + 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1F, + 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, 0xF8, 0x00, + 0x7E, 0x0F, 0xDF, 0x83, 0xF7, 0xE0, 0xFF, 0xF0, 0x7E, 0xFC, 0x1F, 0xBF, + 0x07, 0xEF, 0xC1, 0xFB, 0xE0, 0x7C, 0xF8, 0x1F, 0x3C, 0x07, 0x8F, 0x01, + 0xE3, 0x80, 0x70, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x03, + 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0x7C, 0x00, 0x0F, 0x83, + 0xE0, 0x00, 0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, + 0x7F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x0F, + 0x83, 0xE0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x3E, 0x0F, + 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF8, 0x7C, 0x00, + 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0x07, 0xC0, 0x00, 0xF8, 0x3E, + 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x07, 0xC1, 0xF0, 0x00, + 0x3E, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF8, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, + 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0xE0, 0x1F, + 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0x07, 0xF3, 0x9F, 0xC1, 0xF8, 0xE3, 0xF0, + 0x7C, 0x38, 0xFC, 0x3F, 0x0E, 0x3F, 0x0F, 0xC7, 0x8F, 0xC3, 0xF1, 0xC0, + 0x00, 0xFE, 0x70, 0x00, 0x3F, 0xDC, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, + 0xE0, 0x00, 0x3F, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, + 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x77, 0xF8, 0x00, 0x1C, 0xFE, + 0x00, 0x07, 0x3F, 0x8F, 0xE3, 0xCF, 0xE3, 0xF8, 0xE3, 0xF8, 0xFE, 0x38, + 0xFC, 0x3F, 0x8E, 0x7F, 0x0F, 0xF3, 0x9F, 0xC3, 0xFD, 0xFF, 0xE0, 0x7F, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0x80, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x07, + 0x80, 0x7F, 0xE0, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0x1E, 0x01, 0xFF, 0xF0, + 0x01, 0xC0, 0x3F, 0xFF, 0x80, 0x3C, 0x07, 0xE1, 0xF8, 0x07, 0x80, 0x78, + 0x07, 0x80, 0xF0, 0x0F, 0x80, 0x78, 0x0E, 0x00, 0xF0, 0x07, 0x81, 0xC0, + 0x0F, 0x00, 0xF8, 0x3C, 0x00, 0xF0, 0x0F, 0x07, 0x80, 0x0F, 0xC3, 0xF0, + 0xF0, 0x00, 0xFF, 0xFE, 0x0E, 0x00, 0x07, 0xFF, 0xC1, 0xE0, 0x00, 0x7F, + 0xF8, 0x3C, 0x00, 0x03, 0xFF, 0x07, 0x80, 0x00, 0x0F, 0xC0, 0x70, 0x00, + 0x00, 0x00, 0x0E, 0x03, 0xF0, 0x00, 0x01, 0xE0, 0xFF, 0xC0, 0x00, 0x3C, + 0x1F, 0xFE, 0x00, 0x03, 0x83, 0xFF, 0xE0, 0x00, 0x70, 0x7F, 0xFF, 0x00, + 0x0F, 0x0F, 0xC3, 0xF0, 0x01, 0xE0, 0xF0, 0x0F, 0x00, 0x3C, 0x1F, 0x00, + 0xF0, 0x03, 0x81, 0xE0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xF0, 0x0F, 0x01, + 0xE0, 0x1E, 0x01, 0xE0, 0x1F, 0x87, 0xE0, 0x1C, 0x01, 0xFF, 0xFC, 0x03, + 0x80, 0x0F, 0xFF, 0x80, 0x78, 0x00, 0xFF, 0xF0, 0x0F, 0x00, 0x07, 0xFE, + 0x01, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0xF0, + 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00, 0x03, 0xFF, 0xF8, 0x00, + 0x3F, 0x9F, 0xC0, 0x03, 0xF8, 0x7E, 0x00, 0x1F, 0xC3, 0xF0, 0x00, 0xFE, + 0x1F, 0x00, 0x07, 0xF1, 0xF8, 0x00, 0x3F, 0xCF, 0xC0, 0x01, 0xFE, 0xFC, + 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0x07, 0xC1, 0xFF, + 0xF8, 0x3E, 0x3F, 0xFF, 0xE3, 0xE3, 0xFE, 0x3F, 0x1F, 0x1F, 0xC1, 0xFD, + 0xF1, 0xFC, 0x07, 0xFF, 0x8F, 0xC0, 0x3F, 0xF8, 0xFE, 0x00, 0xFF, 0xC7, + 0xF0, 0x07, 0xFC, 0x3F, 0x80, 0x1F, 0xC1, 0xFC, 0x00, 0xFE, 0x0F, 0xF0, + 0x1F, 0xF8, 0x7F, 0xC1, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, + 0xFC, 0x3F, 0xFF, 0xCF, 0xE0, 0x7F, 0xF8, 0x7F, 0x80, 0xFF, 0x00, 0x00, + 0x7E, 0xFD, 0xFF, 0xEF, 0xDF, 0xBF, 0x7C, 0xF9, 0xE3, 0xC7, 0x00, 0x00, + 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, + 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x01, 0xF0, 0x01, 0xF8, + 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xF0, 0x01, + 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, + 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, + 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x7C, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, + 0x00, 0x1F, 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x03, + 0xE0, 0x03, 0xF0, 0x01, 0xF0, 0x01, 0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, + 0x7C, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3F, 0x00, + 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x03, 0x80, 0x07, + 0x00, 0x0E, 0x07, 0x3C, 0x6F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x0F, 0xE0, + 0x1F, 0xC0, 0x7F, 0x81, 0xEF, 0x87, 0x8F, 0x0E, 0x1E, 0x08, 0x10, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, + 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xC7, 0xF1, 0xF8, 0xFE, 0x3F, + 0x8F, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0xF0, 0xFC, 0x3C, 0x0C, + 0x00, 0x7F, 0xFD, 0xFF, 0xF7, 0xFF, 0x9F, 0xFE, 0xFF, 0xFB, 0xFF, 0xE0, + 0x7F, 0x7F, 0x7F, 0x7E, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x70, 0x00, 0x0E, + 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x03, + 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x01, + 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, + 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, + 0x38, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, + 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, + 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x1F, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF0, + 0x1F, 0xC7, 0xF8, 0x1F, 0xC1, 0xFE, 0x1F, 0xC0, 0x7F, 0x0F, 0xC0, 0x3F, + 0x8F, 0xE0, 0x1F, 0xC7, 0xF0, 0x0F, 0xE3, 0xF0, 0x07, 0xF3, 0xF8, 0x03, + 0xF9, 0xFC, 0x01, 0xFC, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0xFE, 0x7F, 0x00, + 0x7F, 0x3F, 0x80, 0x3F, 0x9F, 0xC0, 0x1F, 0xCF, 0xE0, 0x1F, 0xEF, 0xE0, + 0x0F, 0xE7, 0xF0, 0x07, 0xF3, 0xF8, 0x03, 0xF9, 0xFC, 0x03, 0xF8, 0xFE, + 0x01, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, 0x80, 0xFE, 0x1F, 0xE0, 0x7F, 0x0F, + 0xF8, 0xFF, 0x03, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x0F, + 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x3F, 0xF9, 0xFF, + 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0x7F, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0x80, + 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xFC, + 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x1F, 0xC0, 0x0F, + 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x01, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, + 0x7F, 0x00, 0x3F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x00, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xE0, + 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0x07, 0xFC, 0x07, 0xF0, 0x1F, 0xE0, 0x7F, + 0x00, 0x7F, 0x03, 0xF0, 0x03, 0xF8, 0x1F, 0x80, 0x1F, 0xC1, 0xF8, 0x00, + 0xFE, 0x0F, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0xFF, + 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xF0, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0xF0, 0x07, + 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC0, 0xFE, 0x1F, 0xF0, 0x7F, 0x01, 0xFC, + 0x1F, 0x80, 0x7F, 0x07, 0xE0, 0x1F, 0xC3, 0xF0, 0x07, 0xF0, 0xFC, 0x01, + 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80, 0x01, + 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xFF, 0x80, + 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x3F, 0x80, + 0x3F, 0xCF, 0xE0, 0x0F, 0xE3, 0xF8, 0x07, 0xF8, 0xFF, 0x83, 0xFC, 0x3F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xE0, + 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x7F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, 0x3D, 0xFC, 0x00, 0x3C, 0xFE, 0x00, 0x3E, 0x7E, 0x00, + 0x3E, 0x7F, 0x00, 0x1E, 0x3F, 0x80, 0x1E, 0x1F, 0xC0, 0x1E, 0x0F, 0xC0, + 0x1F, 0x07, 0xE0, 0x1F, 0x07, 0xF0, 0x1F, 0x03, 0xF8, 0x1F, 0x01, 0xFC, + 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFE, 0x0F, 0x80, 0x7F, 0x07, 0xFF, 0xFF, + 0xF7, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, + 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, + 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x03, 0xE3, 0xF0, 0x00, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, 0xF8, 0x03, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xE1, 0xFF, 0x03, 0xF0, 0x1F, 0xE0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0xFE, 0x1F, + 0xC0, 0x3F, 0x83, 0xF8, 0x07, 0xF0, 0x7F, 0x83, 0xFC, 0x0F, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0x0F, + 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, + 0x00, 0x1F, 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x1F, 0xC3, + 0xFC, 0x1F, 0x80, 0xFE, 0x0F, 0xC0, 0x3F, 0x0F, 0xC0, 0x00, 0x07, 0xE0, + 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF8, 0xFC, 0x01, 0xF9, + 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x3F, + 0xE1, 0xFF, 0x1F, 0xE0, 0x7F, 0x8F, 0xE0, 0x1F, 0xCF, 0xE0, 0x0F, 0xE7, + 0xF0, 0x07, 0xF3, 0xF0, 0x03, 0xF9, 0xF8, 0x01, 0xF8, 0xFC, 0x01, 0xFC, + 0x7E, 0x00, 0xFE, 0x3F, 0x00, 0xFE, 0x1F, 0xC0, 0xFF, 0x0F, 0xF0, 0xFF, + 0x03, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, + 0x80, 0x07, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xCF, + 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, + 0x9F, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x1F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xE0, + 0x00, 0x03, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, + 0x01, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, + 0xC0, 0xFE, 0x0F, 0xF0, 0x3E, 0x01, 0xFC, 0x1F, 0x80, 0x3F, 0x07, 0xC0, + 0x0F, 0xC1, 0xF0, 0x03, 0xF0, 0x7C, 0x01, 0xF8, 0x1F, 0x00, 0xFC, 0x03, + 0xF0, 0x7F, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, + 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x81, 0xFE, 0x1F, 0xE0, 0xFE, 0x03, + 0xFC, 0x3F, 0x00, 0x7F, 0x1F, 0xC0, 0x1F, 0xC7, 0xE0, 0x07, 0xF3, 0xF8, + 0x01, 0xFC, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x0F, 0xE3, + 0xFC, 0x07, 0xF0, 0xFF, 0x87, 0xFC, 0x3F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, + 0x00, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x00, 0x3F, + 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFF, 0x00, + 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF0, 0x3F, 0xC3, 0xF8, 0x3F, 0xC0, 0xFE, + 0x1F, 0xC0, 0x3F, 0x1F, 0xC0, 0x1F, 0x8F, 0xE0, 0x0F, 0xC7, 0xE0, 0x07, + 0xE7, 0xF0, 0x03, 0xF3, 0xF8, 0x01, 0xF9, 0xFC, 0x01, 0xFC, 0xFE, 0x00, + 0xFE, 0x7F, 0x00, 0xFE, 0x3F, 0xC0, 0xFF, 0x1F, 0xF0, 0xFF, 0x87, 0xFF, + 0xFF, 0xC3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x3F, 0xF3, 0xF0, 0x07, + 0xE3, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7E, 0x1F, 0xC0, 0x7E, 0x0F, 0xF0, 0xFF, 0x07, 0xFF, 0xFF, 0x01, + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFF, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7E, 0x0F, 0xE0, + 0xFE, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x07, 0xF0, 0x7F, 0x07, + 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, + 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, + 0x03, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0xF0, 0x0F, 0xC0, + 0x3C, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, + 0x01, 0xF8, 0x00, 0x03, 0xFE, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, + 0x0F, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x3F, 0xFE, + 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, + 0x7F, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x01, 0xF8, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0xF1, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x7E, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xFF, + 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xC0, + 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFF, + 0xC0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, + 0xE0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, + 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, + 0x1F, 0xFF, 0xFE, 0x3F, 0xC1, 0xFF, 0x3F, 0x80, 0xFF, 0x7F, 0x00, 0x7F, + 0x7E, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, + 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, + 0x01, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x00, + 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x1F, 0xF8, 0x00, 0x07, + 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x07, 0xE0, + 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF0, 0x0F, 0xC0, 0x00, + 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xF1, + 0xF1, 0xF0, 0x7C, 0x00, 0xFF, 0xCF, 0x07, 0x87, 0xE0, 0x1F, 0xFF, 0xF8, + 0x3C, 0x7E, 0x01, 0xF8, 0x7F, 0x81, 0xE3, 0xE0, 0x1F, 0x01, 0xF8, 0x0F, + 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x79, 0xF0, 0x1F, 0x00, 0x7C, 0x03, 0xDF, + 0x00, 0xF0, 0x03, 0xE0, 0x1C, 0xF8, 0x0F, 0x80, 0x1E, 0x01, 0xE7, 0xC0, + 0x78, 0x00, 0xF0, 0x0F, 0x3C, 0x07, 0xC0, 0x0F, 0x00, 0xF3, 0xE0, 0x3C, + 0x00, 0x78, 0x07, 0x9F, 0x03, 0xE0, 0x07, 0x80, 0x78, 0xF8, 0x1F, 0x00, + 0x7C, 0x07, 0xC7, 0xC0, 0xF8, 0x07, 0xC0, 0x7C, 0x3E, 0x07, 0xC0, 0x7E, + 0x07, 0xC1, 0xF0, 0x3F, 0x07, 0xF8, 0xFC, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, + 0xC0, 0x7E, 0x07, 0xFF, 0xBF, 0xFC, 0x01, 0xF0, 0x1F, 0xF8, 0xFF, 0x80, + 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0xE0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x03, 0x80, 0x00, 0x01, 0xFF, + 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, + 0xFE, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, + 0xF0, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x7F, + 0xF0, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0xFF, + 0xF0, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x03, 0xFB, + 0xF8, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x07, 0xE3, 0xF8, 0x00, 0x0F, 0xE3, + 0xF8, 0x00, 0x0F, 0xC3, 0xF8, 0x00, 0x1F, 0xC3, 0xF8, 0x00, 0x1F, 0x83, + 0xF8, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x7F, 0x01, + 0xFC, 0x00, 0xFE, 0x01, 0xFC, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFF, 0xFF, + 0xFC, 0x01, 0xFF, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, + 0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x0F, 0xE0, 0x00, + 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x3F, 0x80, 0x00, + 0xFE, 0x3F, 0x80, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, + 0x7F, 0x01, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, + 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, + 0xFF, 0x03, 0xF8, 0x00, 0xFF, 0x03, 0xF8, 0x00, 0x7F, 0x07, 0xF0, 0x00, + 0x7F, 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0x7E, 0x07, 0xF0, 0x00, + 0xFE, 0x0F, 0xF0, 0x03, 0xFC, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, + 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, + 0xF8, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xC0, 0x07, 0xFC, 0x1F, 0xC0, 0x01, + 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x01, + 0xFC, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0x7F, 0x00, 0x07, + 0xF8, 0x7F, 0x00, 0x0F, 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, + 0xE0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, + 0xFC, 0x01, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0x03, 0xFE, 0x07, 0xFC, 0x01, + 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xE0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, + 0x7F, 0x1F, 0xC0, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0xFE, 0x00, 0x03, + 0xF8, 0xFF, 0x00, 0x07, 0xF8, 0xFF, 0x00, 0x07, 0xF0, 0x7F, 0x80, 0x1F, + 0xF0, 0x7F, 0xE0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, + 0x80, 0x1F, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xF8, + 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, + 0xE0, 0x03, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, + 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x03, 0xFE, 0x07, 0xF0, 0x01, + 0xFF, 0x07, 0xF0, 0x00, 0xFF, 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, + 0x7F, 0x0F, 0xF0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, + 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x1F, 0xC0, 0x00, + 0x7F, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, + 0xFE, 0x1F, 0xC0, 0x01, 0xFE, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x01, + 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x07, 0xF8, 0x7F, 0x00, 0x0F, + 0xF0, 0x7F, 0x00, 0x1F, 0xF0, 0x7F, 0x00, 0x7F, 0xE0, 0x7F, 0xFF, 0xFF, + 0xC0, 0x7F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, + 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, + 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, + 0xE0, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, + 0xFE, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, + 0xFE, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, + 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, + 0xC0, 0x0F, 0xFF, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF, + 0xF8, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, + 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFC, 0x07, 0xFC, 0x0F, 0xF8, + 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x1F, 0xC7, 0xF0, + 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x7F, + 0x00, 0x3F, 0xFF, 0x3F, 0x00, 0x1F, 0xFF, 0xBF, 0x80, 0x0F, 0xFF, 0x9F, + 0xC0, 0x07, 0xFF, 0xCF, 0xE0, 0x03, 0xFF, 0xE7, 0xF0, 0x03, 0xFF, 0xF3, + 0xF8, 0x00, 0x01, 0xF9, 0xFC, 0x00, 0x01, 0xF8, 0xFF, 0x00, 0x00, 0xFC, + 0x7F, 0x80, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, + 0x87, 0xFC, 0x00, 0xFF, 0x81, 0xFF, 0x81, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFE, 0xF8, 0x03, 0xFF, 0xFC, + 0x78, 0x00, 0x7F, 0xFC, 0x3C, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0x3F, 0x80, + 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0x3F, + 0x80, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x03, 0xF8, 0x00, + 0x3F, 0x80, 0xFF, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x03, 0xF8, + 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, 0x0F, 0xFF, 0xFF, 0xFE, 0x03, + 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, + 0x01, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xF8, 0x0F, 0xE0, 0x00, + 0x7F, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, 0xF0, + 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, + 0xF0, 0x00, 0x3F, 0x80, 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x01, 0xFC, + 0x07, 0xF0, 0x00, 0x3F, 0x80, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, + 0xFE, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x7F, 0x00, 0x07, 0xF0, 0x1F, 0xC0, + 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, + 0x0F, 0xE0, 0x3F, 0x81, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, + 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x7F, 0x01, 0xFC, + 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, + 0x03, 0xF8, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0xFE, + 0x03, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x0F, 0xE0, 0xFE, 0x03, 0xFC, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0, + 0xFE, 0x01, 0xFC, 0x1F, 0xC0, 0x3F, 0x83, 0xF8, 0x0F, 0xE0, 0x7F, 0x01, + 0xFC, 0x0F, 0xF0, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xF8, 0x03, + 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0x1F, 0xE0, + 0x00, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x00, 0xFF, 0x00, + 0x7F, 0x00, 0x1F, 0xF0, 0x03, 0xF8, 0x01, 0xFF, 0x00, 0x1F, 0xC0, 0x1F, + 0xE0, 0x00, 0xFE, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xE0, 0x00, 0x7F, + 0x01, 0xFE, 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0x00, 0x1F, 0xC1, 0xFE, 0x00, + 0x00, 0xFE, 0x1F, 0xE0, 0x00, 0x0F, 0xE3, 0xFE, 0x00, 0x00, 0x7F, 0x3F, + 0xC0, 0x00, 0x03, 0xFB, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, + 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xC0, + 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x01, 0xFF, + 0x9F, 0xE0, 0x00, 0x0F, 0xF8, 0xFF, 0x00, 0x00, 0x7F, 0x83, 0xFC, 0x00, + 0x03, 0xF8, 0x1F, 0xF0, 0x00, 0x1F, 0xC0, 0x7F, 0x80, 0x01, 0xFC, 0x01, + 0xFE, 0x00, 0x0F, 0xE0, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x3F, 0xC0, 0x03, + 0xF8, 0x01, 0xFF, 0x00, 0x3F, 0x80, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x3F, + 0xE0, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x07, 0xFC, 0x03, 0xF8, + 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, + 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, + 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, + 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, + 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, + 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, + 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, + 0x80, 0x03, 0xFF, 0x80, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x01, + 0xFF, 0xC0, 0x3F, 0xF0, 0x00, 0xFF, 0xE0, 0x3F, 0xF8, 0x00, 0xFF, 0xF0, + 0x1F, 0xFC, 0x00, 0x7F, 0xF8, 0x0F, 0xFE, 0x00, 0x7D, 0xF8, 0x07, 0xEF, + 0x00, 0x3E, 0xFC, 0x03, 0xF7, 0x80, 0x3F, 0xFE, 0x03, 0xFB, 0xC0, 0x1F, + 0x7F, 0x01, 0xFD, 0xE0, 0x1F, 0xBF, 0x00, 0xFE, 0xF0, 0x0F, 0x9F, 0x80, + 0x7E, 0x78, 0x0F, 0xDF, 0xC0, 0x7F, 0x3E, 0x07, 0xCF, 0xE0, 0x3F, 0x9F, + 0x07, 0xE7, 0xF0, 0x1F, 0xCF, 0x83, 0xE3, 0xF0, 0x0F, 0xE7, 0xC3, 0xF1, + 0xF8, 0x07, 0xE3, 0xE1, 0xF9, 0xFC, 0x07, 0xF1, 0xF0, 0xF8, 0xFE, 0x03, + 0xF8, 0xF8, 0xFC, 0x7F, 0x01, 0xFC, 0x7C, 0x7C, 0x3F, 0x00, 0xFC, 0x3E, + 0x7E, 0x1F, 0x80, 0x7E, 0x1F, 0x3E, 0x1F, 0xC0, 0x7F, 0x0F, 0xBF, 0x0F, + 0xE0, 0x3F, 0x87, 0xDF, 0x07, 0xE0, 0x1F, 0xC3, 0xFF, 0x83, 0xF0, 0x0F, + 0xC1, 0xFF, 0xC3, 0xF8, 0x0F, 0xE0, 0xFF, 0xC1, 0xFC, 0x07, 0xF0, 0x7F, + 0xE0, 0xFE, 0x03, 0xF8, 0x3F, 0xE0, 0x7E, 0x01, 0xFC, 0x1F, 0xF0, 0x3F, + 0x00, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0xFE, 0x07, 0xF8, 0x1F, 0xC0, 0x7F, + 0x03, 0xF8, 0x0F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xC0, + 0x01, 0xFC, 0x07, 0xFC, 0x00, 0x3F, 0x80, 0xFF, 0x80, 0x07, 0xF0, 0x1F, + 0xF0, 0x00, 0xFC, 0x07, 0xFF, 0x00, 0x3F, 0x80, 0xFF, 0xE0, 0x07, 0xF0, + 0x1F, 0xFC, 0x00, 0xFE, 0x03, 0xFF, 0xC0, 0x1F, 0x80, 0xFF, 0xF8, 0x03, + 0xF0, 0x1F, 0xFF, 0x80, 0xFE, 0x03, 0xFB, 0xF0, 0x1F, 0xC0, 0x7E, 0x7E, + 0x03, 0xF8, 0x0F, 0xC7, 0xE0, 0x7E, 0x03, 0xF8, 0xFC, 0x0F, 0xC0, 0x7F, + 0x1F, 0x83, 0xF8, 0x0F, 0xE1, 0xF8, 0x7F, 0x01, 0xF8, 0x3F, 0x0F, 0xE0, + 0x3F, 0x07, 0xF1, 0xF8, 0x0F, 0xE0, 0x7E, 0x3F, 0x01, 0xFC, 0x0F, 0xCF, + 0xE0, 0x3F, 0x00, 0xFD, 0xFC, 0x07, 0xE0, 0x1F, 0xBF, 0x81, 0xFC, 0x03, + 0xF7, 0xE0, 0x3F, 0x80, 0x3F, 0xFC, 0x07, 0xF0, 0x07, 0xFF, 0x80, 0xFC, + 0x00, 0xFF, 0xF0, 0x1F, 0x80, 0x0F, 0xFC, 0x07, 0xF0, 0x01, 0xFF, 0x80, + 0xFE, 0x00, 0x3F, 0xF0, 0x1F, 0xC0, 0x03, 0xFE, 0x03, 0xF0, 0x00, 0x7F, + 0xC0, 0x7E, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, + 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, + 0x3F, 0xF0, 0x3F, 0xF8, 0x1F, 0xF0, 0x03, 0xFE, 0x07, 0xF0, 0x00, 0x7F, + 0x83, 0xF8, 0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xFC, 0x7F, 0x00, 0x00, + 0x7F, 0x3F, 0x80, 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x07, 0xF7, 0xF0, 0x00, + 0x01, 0xFD, 0xFC, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0xDF, 0xC0, + 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE, + 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0x07, 0xF3, + 0xF8, 0x00, 0x01, 0xFC, 0xFE, 0x00, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0x7F, + 0x8F, 0xF0, 0x00, 0x1F, 0xC1, 0xFE, 0x00, 0x0F, 0xE0, 0x7F, 0xC0, 0x0F, + 0xF8, 0x1F, 0xFC, 0x0F, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, + 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x1F, + 0xFF, 0x80, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x03, + 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, + 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC1, 0xFE, 0x00, 0xFF, 0x83, 0xF8, + 0x00, 0xFF, 0x07, 0xF0, 0x00, 0xFE, 0x0F, 0xE0, 0x01, 0xFC, 0x1F, 0xC0, + 0x03, 0xF8, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x1F, 0xC1, 0xFC, 0x00, + 0x3F, 0x83, 0xF8, 0x00, 0xFE, 0x07, 0xF0, 0x07, 0xFC, 0x1F, 0xFF, 0xFF, + 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE, + 0x03, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00, + 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, + 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x01, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0xF0, + 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x3F, 0xF0, 0x3F, + 0xF0, 0x1F, 0xF0, 0x03, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x83, 0xFC, 0x00, + 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xFC, 0x7F, 0x00, 0x00, 0x7F, 0x3F, 0x80, + 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x07, 0xF3, 0xF0, 0x00, 0x01, 0xFD, 0xFC, + 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0xDF, 0x80, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x3F, + 0xBF, 0x80, 0x00, 0x0F, 0xEF, 0xE0, 0x01, 0x87, 0xF3, 0xF8, 0x00, 0xF1, + 0xFC, 0xFE, 0x00, 0x7C, 0xFE, 0x3F, 0xC0, 0x3F, 0xFF, 0x8F, 0xF0, 0x07, + 0xFF, 0xC1, 0xFE, 0x01, 0xFF, 0xE0, 0x7F, 0xC0, 0x3F, 0xF8, 0x1F, 0xFC, + 0x0F, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x0F, + 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x9F, 0x80, + 0x01, 0xFF, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x01, 0xFF, 0xFF, + 0xF0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, + 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xE0, + 0x03, 0xFE, 0x0F, 0xF0, 0x00, 0xFF, 0x07, 0xF0, 0x00, 0x3F, 0x83, 0xF8, + 0x00, 0x1F, 0xC1, 0xFC, 0x00, 0x0F, 0xC0, 0xFE, 0x00, 0x07, 0xE0, 0xFE, + 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x3F, 0x80, 0x0F, 0xF0, 0x1F, + 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x07, + 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFF, 0x01, + 0xFC, 0x00, 0x7F, 0x80, 0xFE, 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x0F, 0xE0, + 0x3F, 0x80, 0x07, 0xF0, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, 0xC0, 0x01, 0xFC, + 0x0F, 0xE0, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0xFE, 0x03, 0xF8, 0x00, 0x7F, + 0x01, 0xFC, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x0F, + 0xE0, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, + 0xFF, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, + 0xF8, 0x0F, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0x7F, 0xC1, 0xFE, 0x00, 0xFF, + 0x07, 0xF0, 0x01, 0xFC, 0x3F, 0x80, 0x07, 0xF0, 0xFE, 0x00, 0x1F, 0xC3, + 0xF8, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, + 0xE0, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, + 0xFE, 0x00, 0x1F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x03, 0xFF, + 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x7E, 0x3F, + 0x80, 0x03, 0xF8, 0xFF, 0x00, 0x1F, 0xE3, 0xFF, 0x01, 0xFF, 0x07, 0xFF, + 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, + 0xF0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, + 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x7F, + 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE, + 0x0F, 0xE0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE, + 0x0F, 0xE0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, + 0x1F, 0xC0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, 0x80, 0x03, 0xF8, + 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x03, 0xF8, + 0x3F, 0x80, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, + 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x0F, 0xE0, + 0xFE, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x0F, 0xE0, + 0xFE, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x1F, 0xC0, 0xFF, 0x00, 0x3F, 0x80, + 0xFF, 0xC0, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFE, 0x00, + 0x3F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xE7, + 0xF0, 0x00, 0x7F, 0x1F, 0xC0, 0x01, 0xFC, 0x7F, 0x00, 0x0F, 0xE1, 0xFC, + 0x00, 0x3F, 0x87, 0xF0, 0x01, 0xFC, 0x1F, 0xC0, 0x07, 0xF0, 0x3F, 0x00, + 0x3F, 0x80, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xF0, 0x0F, 0xC0, 0x1F, + 0x80, 0x3F, 0x80, 0xFE, 0x00, 0xFE, 0x03, 0xF0, 0x03, 0xF8, 0x1F, 0xC0, + 0x0F, 0xE0, 0x7E, 0x00, 0x1F, 0x83, 0xF8, 0x00, 0x7E, 0x0F, 0xC0, 0x01, + 0xF8, 0x7E, 0x00, 0x07, 0xE1, 0xF8, 0x00, 0x1F, 0x8F, 0xC0, 0x00, 0x7E, + 0x3F, 0x00, 0x01, 0xF9, 0xF8, 0x00, 0x07, 0xE7, 0xE0, 0x00, 0x0F, 0xFF, + 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0x00, + 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, + 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xFF, 0xC0, 0x0F, 0xF0, 0x03, 0xFB, 0xF8, + 0x01, 0xFE, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0xC0, 0x1F, 0xCF, 0xE0, 0x0F, + 0xF8, 0x03, 0xF9, 0xFC, 0x03, 0xFF, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0xE0, + 0x1F, 0xC7, 0xF0, 0x1F, 0xFC, 0x07, 0xF0, 0x7E, 0x03, 0xFF, 0x80, 0xFE, + 0x0F, 0xC0, 0x7D, 0xF0, 0x1F, 0x81, 0xF8, 0x1F, 0xBE, 0x07, 0xF0, 0x3F, + 0x03, 0xE7, 0xC0, 0xFC, 0x07, 0xE0, 0xFC, 0xF8, 0x3F, 0x80, 0xFC, 0x1F, + 0x1F, 0x07, 0xE0, 0x1F, 0x83, 0xE3, 0xE0, 0xFC, 0x03, 0xF0, 0xFC, 0x7C, + 0x3F, 0x00, 0x7E, 0x1F, 0x0F, 0x87, 0xE0, 0x0F, 0xC7, 0xE1, 0xF1, 0xF8, + 0x01, 0xF8, 0xF8, 0x3E, 0x3F, 0x00, 0x3F, 0x3F, 0x07, 0xCF, 0xC0, 0x07, + 0xE7, 0xC0, 0xF9, 0xF8, 0x00, 0xFC, 0xF8, 0x1F, 0x3E, 0x00, 0x1F, 0xBE, + 0x03, 0xEF, 0xC0, 0x01, 0xF7, 0xC0, 0x7D, 0xF0, 0x00, 0x3F, 0xF8, 0x0F, + 0xFE, 0x00, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, + 0x00, 0x1F, 0xF0, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0xFF, 0x80, 0x00, + 0x7F, 0x80, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x01, 0xFC, + 0x00, 0x7F, 0x80, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x01, + 0xFC, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x07, 0xFC, 0x00, 0xFF, + 0x00, 0x1F, 0xE0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x03, 0xFC, + 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x00, 0xFF, 0x07, 0xF8, 0x00, + 0x03, 0xFC, 0x3F, 0x80, 0x00, 0x1F, 0xE3, 0xF8, 0x00, 0x00, 0x7F, 0x3F, + 0xC0, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00, + 0x7F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x1F, + 0xF0, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, + 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0xFE, + 0x00, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x00, 0xFF, 0x3F, 0xC0, 0x00, 0x0F, + 0xF1, 0xFE, 0x00, 0x00, 0xFF, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x3F, 0xC0, + 0x00, 0x7F, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x07, 0xF8, 0x00, 0x7F, 0x80, + 0x3F, 0xC0, 0x07, 0xF8, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x07, + 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x7F, + 0xBF, 0xC0, 0x07, 0xF8, 0xFE, 0x00, 0x3F, 0x87, 0xF8, 0x03, 0xFC, 0x3F, + 0xC0, 0x3F, 0xC0, 0xFE, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x3F, 0xC1, + 0xFE, 0x00, 0xFE, 0x0F, 0xE0, 0x07, 0xF0, 0xFE, 0x00, 0x3F, 0x8F, 0xE0, + 0x00, 0xFE, 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, + 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0xFF, + 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFF, + 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, + 0xC0, 0x3F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0x80, + 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7E, 0x00, 0x03, 0xF0, + 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, + 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, + 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, + 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, + 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, + 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xFF, 0xC0, + 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0x81, + 0xC3, 0xC7, 0x8F, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0xC7, 0x8F, 0x1E, + 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x8F, 0x1E, 0x3C, 0x38, 0x70, 0xE1, + 0xC3, 0x87, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0x00, 0x7F, 0xF8, 0x03, 0xFF, + 0xC0, 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x01, 0xF8, 0x00, + 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, + 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03, + 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, + 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x7F, + 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, + 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, + 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x01, 0xFF, + 0xE0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, + 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x3E, 0xFC, 0x01, 0xF3, 0xE0, + 0x1F, 0x1F, 0x01, 0xF8, 0xF8, 0x0F, 0x87, 0xE0, 0xFC, 0x3F, 0x07, 0xC0, + 0xF8, 0x7C, 0x07, 0xC7, 0xE0, 0x3E, 0x3E, 0x01, 0xFB, 0xF0, 0x0F, 0xDF, + 0x00, 0x3F, 0xF0, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xE0, 0xF8, 0xF0, 0xF1, 0xE1, + 0xC3, 0xC3, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x7F, 0x03, 0xFC, 0x3F, 0x00, + 0xFE, 0x1F, 0x80, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x1F, + 0xFF, 0xC0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xF7, 0xF0, 0xFF, + 0x83, 0xF8, 0xFF, 0x01, 0xF8, 0x7F, 0x00, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, + 0x80, 0x7F, 0x1F, 0xC0, 0x7F, 0x8F, 0xF0, 0xFF, 0x87, 0xFF, 0xFF, 0xC3, + 0xFF, 0xFF, 0xE0, 0xFF, 0xF7, 0xF8, 0x3F, 0xF3, 0xFC, 0x07, 0xE0, 0x00, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x3F, 0x80, 0x1F, + 0x9F, 0xFC, 0x03, 0xF7, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, + 0x83, 0xFF, 0x0F, 0xF0, 0x7F, 0x80, 0xFF, 0x0F, 0xE0, 0x1F, 0xE3, 0xF8, + 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x8F, 0xC0, 0x07, 0xF1, 0xF8, 0x00, 0xFE, + 0x7F, 0x00, 0x1F, 0xCF, 0xC0, 0x03, 0xF9, 0xF8, 0x00, 0xFE, 0x3F, 0x00, + 0x1F, 0xC7, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x3F, 0xC0, 0x3F, 0xC7, + 0xF8, 0x0F, 0xF0, 0xFF, 0x83, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xF0, 0x1F, 0x9F, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, + 0xE0, 0x7F, 0xFF, 0xF0, 0x7F, 0x83, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, 0x00, + 0x7F, 0x3F, 0x80, 0x3F, 0x9F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, + 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0x9F, + 0xE0, 0x3F, 0x87, 0xF8, 0x3F, 0x83, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, + 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x7F, 0x00, 0x3F, + 0xF3, 0xF8, 0x03, 0xFF, 0xDF, 0x80, 0x7F, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, + 0xE0, 0x3F, 0xC3, 0xFF, 0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xC0, 0x3F, 0x81, + 0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x07, 0xE0, 0xFE, 0x00, 0x3F, 0x07, 0xF0, + 0x03, 0xF8, 0x7F, 0x00, 0x1F, 0x83, 0xF8, 0x00, 0xFC, 0x1F, 0xC0, 0x07, + 0xE0, 0xFE, 0x00, 0x3F, 0x07, 0xF0, 0x03, 0xF0, 0x3F, 0x80, 0x3F, 0x81, + 0xFC, 0x01, 0xFC, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC3, 0xFF, 0x01, 0xFF, + 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xCF, + 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xFC, 0x00, + 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0x87, 0xF8, + 0x7F, 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0xBF, 0x80, 0x1F, + 0xDF, 0xC0, 0x0F, 0xEF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x3F, 0x80, 0x3F, 0x9F, 0xE0, 0x3F, 0x87, 0xF8, 0x3F, 0xC3, 0xFF, + 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0x0F, 0xF8, 0x07, 0xFE, + 0x01, 0xFF, 0x80, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x03, 0xF0, 0x01, + 0xFC, 0x03, 0xFF, 0xF1, 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x80, 0xFE, + 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, + 0x1F, 0xC0, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, + 0xE0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, + 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x07, 0xC3, 0xF8, + 0x01, 0xFF, 0x9F, 0x80, 0x1F, 0xFE, 0xFC, 0x01, 0xFF, 0xFF, 0xE0, 0x1F, + 0xFF, 0xFF, 0x01, 0xFE, 0x1F, 0xF8, 0x1F, 0xE0, 0x3F, 0x80, 0xFE, 0x01, + 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x00, 0x3F, 0x07, 0xF0, 0x01, 0xF8, + 0x3F, 0x80, 0x0F, 0x81, 0xF8, 0x00, 0x7C, 0x1F, 0xC0, 0x07, 0xE0, 0xFE, + 0x00, 0x3F, 0x07, 0xF0, 0x01, 0xF0, 0x3F, 0x80, 0x1F, 0x81, 0xFC, 0x00, + 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x1F, 0xF0, + 0x0F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x01, 0xFF, 0xF7, 0xE0, 0x07, + 0xFE, 0x7F, 0x00, 0x0F, 0xC3, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01, + 0xFC, 0x0F, 0xE0, 0x0F, 0xC0, 0x7F, 0x00, 0xFE, 0x03, 0xFC, 0x1F, 0xE0, + 0x1F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0x01, + 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xE0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x0F, + 0xC0, 0x1F, 0xCF, 0xFE, 0x03, 0xFB, 0xFF, 0xE0, 0x7F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFF, 0xC3, 0xFF, 0x07, 0xF8, 0x7F, 0x80, 0x7F, 0x0F, 0xE0, 0x0F, + 0xE1, 0xFC, 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x0F, 0xE0, 0x07, 0xE1, 0xFC, + 0x01, 0xFC, 0x3F, 0x00, 0x3F, 0x87, 0xE0, 0x07, 0xF1, 0xFC, 0x00, 0xFC, + 0x3F, 0x80, 0x1F, 0x87, 0xF0, 0x07, 0xF0, 0xFC, 0x00, 0xFE, 0x1F, 0x80, + 0x1F, 0xC7, 0xF0, 0x03, 0xF0, 0xFE, 0x00, 0x7E, 0x1F, 0xC0, 0x1F, 0xC3, + 0xF0, 0x03, 0xF8, 0xFE, 0x00, 0x7F, 0x1F, 0xC0, 0x0F, 0xC0, 0x01, 0xFC, + 0x07, 0xF0, 0x1F, 0x80, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, + 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7E, + 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0x7F, + 0x01, 0xFC, 0x07, 0xE0, 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x00, 0x00, 0x0F, + 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x3F, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0xFE, + 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x03, 0xF8, + 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, + 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, + 0x07, 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, + 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, + 0x7E, 0x00, 0x0F, 0xC0, 0x03, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xC0, 0x0F, + 0xF8, 0x03, 0xFE, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x7F, 0x00, 0xFE, 0x07, 0xE0, 0x3F, 0xC0, 0x7E, 0x07, + 0xF8, 0x0F, 0xE0, 0xFF, 0x00, 0xFE, 0x1F, 0xC0, 0x0F, 0xE3, 0xF8, 0x00, + 0xFC, 0x7F, 0x00, 0x0F, 0xCF, 0xE0, 0x01, 0xFD, 0xFC, 0x00, 0x1F, 0xFF, + 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, + 0x3F, 0xFF, 0xC0, 0x03, 0xFE, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x03, 0xF0, + 0xFE, 0x00, 0x7F, 0x07, 0xF0, 0x07, 0xF0, 0x7F, 0x00, 0x7F, 0x07, 0xF8, + 0x07, 0xE0, 0x3F, 0x80, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0xC0, 0xFE, + 0x01, 0xFC, 0x0F, 0xC0, 0x1F, 0xE0, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0x80, + 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, + 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, + 0x3F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, + 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, + 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0xFC, 0x03, 0xF0, 0x07, + 0xE3, 0xFF, 0x0F, 0xFC, 0x07, 0xEF, 0xFF, 0x3F, 0xFE, 0x0F, 0xFF, 0xFF, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xF8, 0x7F, 0xF0, 0xFF, + 0x0F, 0xE0, 0x3F, 0xC0, 0x7F, 0x0F, 0xE0, 0x3F, 0x80, 0x7F, 0x1F, 0xC0, + 0x3F, 0x80, 0x7E, 0x1F, 0xC0, 0x3F, 0x00, 0x7E, 0x1F, 0xC0, 0x3F, 0x00, + 0xFE, 0x1F, 0x80, 0x7F, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0x00, 0xFC, 0x3F, + 0x80, 0x7F, 0x00, 0xFC, 0x3F, 0x80, 0x7E, 0x01, 0xFC, 0x3F, 0x00, 0x7E, + 0x01, 0xFC, 0x3F, 0x00, 0xFE, 0x01, 0xFC, 0x7F, 0x00, 0xFE, 0x01, 0xF8, + 0x7F, 0x00, 0xFE, 0x01, 0xF8, 0x7F, 0x00, 0xFC, 0x03, 0xF8, 0x7E, 0x01, + 0xFC, 0x03, 0xF8, 0x7E, 0x01, 0xFC, 0x03, 0xF8, 0xFE, 0x01, 0xFC, 0x03, + 0xF0, 0xFE, 0x01, 0xF8, 0x03, 0xF0, 0xFE, 0x01, 0xF8, 0x07, 0xF0, 0x07, + 0xF0, 0xFE, 0x00, 0xFE, 0x7F, 0xF0, 0x1F, 0x9F, 0xFF, 0x03, 0xFF, 0xFF, + 0xF0, 0xFF, 0xFF, 0xFE, 0x1F, 0xF8, 0x3F, 0xC3, 0xFC, 0x03, 0xF8, 0x7F, + 0x00, 0x7F, 0x0F, 0xE0, 0x0F, 0xE3, 0xF8, 0x01, 0xF8, 0x7F, 0x00, 0x3F, + 0x0F, 0xC0, 0x0F, 0xE1, 0xF8, 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x8F, 0xE0, + 0x07, 0xE1, 0xFC, 0x00, 0xFC, 0x3F, 0x00, 0x3F, 0x87, 0xE0, 0x07, 0xF1, + 0xFC, 0x00, 0xFE, 0x3F, 0x80, 0x1F, 0x87, 0xF0, 0x03, 0xF0, 0xFC, 0x00, + 0xFE, 0x3F, 0x80, 0x1F, 0xC7, 0xF0, 0x03, 0xF8, 0xFE, 0x00, 0x7E, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x0F, 0xFF, + 0xFC, 0x07, 0xFF, 0xFF, 0x83, 0xFC, 0x1F, 0xE1, 0xFE, 0x03, 0xFC, 0xFF, + 0x00, 0xFF, 0x3F, 0x80, 0x1F, 0xDF, 0xC0, 0x07, 0xF7, 0xF0, 0x01, 0xFD, + 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x03, + 0xFB, 0xF8, 0x00, 0xFE, 0xFE, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xCF, 0xF0, + 0x0F, 0xF3, 0xFC, 0x07, 0xF8, 0x7F, 0x83, 0xFC, 0x1F, 0xFF, 0xFE, 0x03, + 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x7F, 0x00, + 0x00, 0x01, 0xFC, 0x3F, 0x00, 0x0F, 0xCF, 0xFE, 0x00, 0x7E, 0xFF, 0xF8, + 0x07, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x01, 0xFF, 0x87, 0xF8, 0x0F, + 0xF0, 0x1F, 0xE0, 0xFF, 0x00, 0xFF, 0x07, 0xF0, 0x03, 0xF8, 0x3F, 0x80, + 0x1F, 0xC1, 0xF8, 0x00, 0xFE, 0x0F, 0xC0, 0x07, 0xF0, 0xFE, 0x00, 0x3F, + 0x87, 0xF0, 0x01, 0xFC, 0x3F, 0x00, 0x1F, 0xC1, 0xF8, 0x00, 0xFE, 0x1F, + 0xC0, 0x07, 0xF0, 0xFE, 0x00, 0x7F, 0x07, 0xF8, 0x07, 0xF8, 0x3F, 0xC0, + 0x7F, 0x81, 0xFF, 0x87, 0xF8, 0x1F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, + 0x07, 0xF7, 0xFF, 0xC0, 0x3F, 0x1F, 0xF8, 0x01, 0xF8, 0x7F, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x07, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x87, 0xF0, + 0x0F, 0xFE, 0x7F, 0x01, 0xFF, 0xF7, 0xE0, 0x3F, 0xFF, 0x7E, 0x07, 0xFF, + 0xFF, 0xE0, 0xFF, 0x07, 0xFE, 0x1F, 0xE0, 0x3F, 0xE3, 0xFC, 0x03, 0xFC, + 0x3F, 0x80, 0x1F, 0xC7, 0xF0, 0x01, 0xFC, 0x7F, 0x00, 0x1F, 0xC7, 0xF0, + 0x01, 0xF8, 0xFE, 0x00, 0x1F, 0x8F, 0xE0, 0x03, 0xF8, 0xFE, 0x00, 0x3F, + 0x8F, 0xE0, 0x03, 0xF8, 0xFE, 0x00, 0x7F, 0x0F, 0xE0, 0x07, 0xF0, 0xFE, + 0x00, 0xFF, 0x0F, 0xF0, 0x1F, 0xF0, 0x7F, 0x87, 0xFF, 0x07, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0x7E, 0x03, 0xFF, 0xEF, 0xE0, 0x1F, 0xFC, 0xFE, 0x00, + 0x7F, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x07, + 0xF0, 0xF0, 0x7F, 0x3F, 0x07, 0xE7, 0xE0, 0x7E, 0xFE, 0x0F, 0xFF, 0xE0, + 0xFF, 0xFE, 0x0F, 0xFC, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, + 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, + 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, + 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, + 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x07, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 0xE0, 0xFF, 0x1F, 0xC0, 0x7F, 0x1F, + 0xC0, 0x7F, 0x1F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x1F, 0xFF, 0xC0, 0x0F, + 0xFF, 0xF0, 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, + 0x0F, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFE, + 0x00, 0xFE, 0xFF, 0x03, 0xFC, 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xF8, 0x3F, + 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x03, 0xFE, 0x00, 0x03, 0xF0, 0x1F, 0xC0, + 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x1F, 0xFF, 0x7F, 0xFD, + 0xFF, 0xFF, 0xFF, 0xC7, 0xF0, 0x1F, 0xC0, 0x7E, 0x01, 0xF8, 0x0F, 0xE0, + 0x3F, 0x80, 0xFE, 0x03, 0xF0, 0x0F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, + 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0xF0, 0xFF, 0xC3, 0xFF, + 0x07, 0xFC, 0x0F, 0xE0, 0x0F, 0xC0, 0x0F, 0xE1, 0xF8, 0x01, 0xFC, 0x7F, + 0x00, 0x3F, 0x0F, 0xE0, 0x0F, 0xE1, 0xFC, 0x01, 0xFC, 0x3F, 0x00, 0x3F, + 0x87, 0xE0, 0x07, 0xE1, 0xFC, 0x00, 0xFC, 0x3F, 0x80, 0x3F, 0x87, 0xF0, + 0x07, 0xF0, 0xFC, 0x00, 0xFE, 0x1F, 0x80, 0x1F, 0x87, 0xF0, 0x03, 0xF0, + 0xFE, 0x00, 0xFE, 0x1F, 0x80, 0x1F, 0xC3, 0xF0, 0x03, 0xF0, 0xFE, 0x00, + 0x7E, 0x1F, 0xC0, 0x1F, 0xC3, 0xF8, 0x07, 0xF8, 0x7F, 0x01, 0xFF, 0x0F, + 0xF0, 0x7F, 0xC1, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x03, 0xFF, 0xEF, + 0xE0, 0x3F, 0xF9, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0x7F, + 0x00, 0x3F, 0xBF, 0x80, 0x3F, 0x8F, 0xC0, 0x1F, 0xC7, 0xE0, 0x1F, 0xC3, + 0xF0, 0x0F, 0xC1, 0xFC, 0x0F, 0xE0, 0xFE, 0x07, 0xE0, 0x7F, 0x07, 0xF0, + 0x3F, 0x83, 0xF0, 0x0F, 0xC3, 0xF8, 0x07, 0xE1, 0xF8, 0x03, 0xF1, 0xFC, + 0x01, 0xF8, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7E, + 0x00, 0x0F, 0xBF, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, + 0x80, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x1F, + 0xE0, 0x00, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0x01, 0xFF, + 0xF8, 0x1F, 0xE0, 0x3F, 0x7F, 0x03, 0xFC, 0x0F, 0xEF, 0xE0, 0xFF, 0x81, + 0xF9, 0xFC, 0x1F, 0xF0, 0x7F, 0x3F, 0x83, 0xFE, 0x0F, 0xC3, 0xF0, 0xFF, + 0xC3, 0xF8, 0x7E, 0x1E, 0xF8, 0x7E, 0x0F, 0xC7, 0xDF, 0x1F, 0xC1, 0xF8, + 0xFB, 0xE3, 0xF0, 0x3F, 0x1E, 0x7C, 0x7E, 0x07, 0xE7, 0xCF, 0x9F, 0x80, + 0xFC, 0xF1, 0xF3, 0xF0, 0x1F, 0xBE, 0x3E, 0xFC, 0x03, 0xF7, 0x87, 0xDF, + 0x80, 0x7E, 0xF0, 0xFF, 0xE0, 0x0F, 0xFE, 0x1F, 0xFC, 0x01, 0xFF, 0x83, + 0xFF, 0x00, 0x3F, 0xF0, 0x7F, 0xE0, 0x07, 0xFC, 0x0F, 0xF8, 0x00, 0x7F, + 0x81, 0xFF, 0x00, 0x0F, 0xF0, 0x3F, 0xC0, 0x01, 0xFC, 0x07, 0xF8, 0x00, + 0x3F, 0x80, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x7F, + 0x80, 0x7F, 0x03, 0xF8, 0x03, 0xF8, 0x3F, 0x80, 0x1F, 0xE3, 0xF8, 0x00, + 0x7F, 0x3F, 0x80, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, + 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF, 0x80, 0x00, + 0x1F, 0xFE, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xDF, 0xC0, 0x01, 0xFC, + 0xFE, 0x00, 0x1F, 0xE7, 0xF8, 0x00, 0xFE, 0x1F, 0xC0, 0x0F, 0xE0, 0xFE, + 0x00, 0xFF, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x00, 0xFF, 0x00, + 0x0F, 0xE0, 0x03, 0xF0, 0x7F, 0x00, 0x3F, 0x83, 0xF8, 0x01, 0xF8, 0x1F, + 0xC0, 0x1F, 0xC0, 0xFE, 0x00, 0xFC, 0x03, 0xF8, 0x0F, 0xE0, 0x1F, 0xC0, + 0x7E, 0x00, 0xFE, 0x07, 0xE0, 0x07, 0xF0, 0x3F, 0x00, 0x3F, 0x83, 0xF0, + 0x01, 0xFC, 0x1F, 0x80, 0x0F, 0xE1, 0xF8, 0x00, 0x3F, 0x0F, 0xC0, 0x01, + 0xF8, 0xFC, 0x00, 0x0F, 0xC7, 0xC0, 0x00, 0x7F, 0x7E, 0x00, 0x03, 0xFB, + 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0x80, + 0x00, 0x1F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x3F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF8, 0x00, + 0x01, 0xFF, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x07, + 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0xFF, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0x80, + 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, + 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, + 0xE0, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xF0, 0x07, 0xFC, + 0x01, 0xFE, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, + 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, + 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x3F, 0x00, 0x7F, 0x80, 0x1F, 0x80, 0x07, 0xE0, 0x03, 0xFC, 0x00, 0x3F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, + 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, + 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F, + 0x80, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xC0, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x70, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x70, + 0x07, 0x80, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, + 0xFE, 0x00, 0x7F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, + 0xFF, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x07, 0xF8, 0x03, 0xF0, 0x00, 0xF8, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, + 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x80, + 0x3F, 0xC0, 0x0F, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0x80, 0x07, 0xFF, + 0x03, 0xDF, 0xFE, 0x0F, 0xF0, 0x7F, 0xFB, 0x80, 0xFF, 0xE0, 0x01, 0xFF, + 0x00, 0x03, 0xF0}; + +const GFXglyph FreeSansBoldOblique24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 13, 0, 1}, // 0x20 ' ' + {0, 14, 34, 16, 5, -33}, // 0x21 '!' + {60, 18, 12, 22, 8, -33}, // 0x22 '"' + {87, 29, 33, 26, 2, -31}, // 0x23 '#' + {207, 26, 42, 26, 3, -35}, // 0x24 '$' + {344, 36, 34, 42, 6, -32}, // 0x25 '%' + {497, 29, 35, 34, 4, -33}, // 0x26 '&' + {624, 7, 12, 11, 8, -33}, // 0x27 ''' + {635, 17, 44, 16, 4, -33}, // 0x28 '(' + {729, 17, 44, 16, 0, -34}, // 0x29 ')' + {823, 15, 15, 18, 7, -33}, // 0x2A '*' + {852, 24, 22, 27, 4, -21}, // 0x2B '+' + {918, 10, 15, 13, 1, -6}, // 0x2C ',' + {937, 14, 6, 16, 3, -15}, // 0x2D '-' + {948, 8, 7, 13, 3, -6}, // 0x2E '.' + {955, 20, 34, 13, 0, -32}, // 0x2F '/' + {1040, 25, 35, 26, 4, -33}, // 0x30 '0' + {1150, 17, 33, 26, 8, -32}, // 0x31 '1' + {1221, 29, 34, 26, 1, -33}, // 0x32 '2' + {1345, 26, 35, 26, 3, -33}, // 0x33 '3' + {1459, 25, 32, 26, 3, -31}, // 0x34 '4' + {1559, 27, 34, 26, 3, -32}, // 0x35 '5' + {1674, 25, 35, 26, 4, -33}, // 0x36 '6' + {1784, 26, 33, 26, 6, -32}, // 0x37 '7' + {1892, 26, 35, 26, 3, -33}, // 0x38 '8' + {2006, 25, 35, 26, 4, -33}, // 0x39 '9' + {2116, 12, 25, 16, 5, -24}, // 0x3A ':' + {2154, 14, 33, 16, 3, -24}, // 0x3B ';' + {2212, 26, 23, 27, 4, -22}, // 0x3C '<' + {2287, 26, 18, 27, 3, -19}, // 0x3D '=' + {2346, 26, 23, 27, 1, -21}, // 0x3E '>' + {2421, 24, 35, 29, 8, -34}, // 0x3F '?' + {2526, 45, 41, 46, 3, -34}, // 0x40 '@' + {2757, 32, 34, 34, 1, -33}, // 0x41 'A' + {2893, 32, 34, 34, 4, -33}, // 0x42 'B' + {3029, 32, 36, 34, 5, -34}, // 0x43 'C' + {3173, 32, 34, 34, 4, -33}, // 0x44 'D' + {3309, 32, 34, 31, 4, -33}, // 0x45 'E' + {3445, 32, 34, 29, 3, -33}, // 0x46 'F' + {3581, 33, 36, 37, 5, -34}, // 0x47 'G' + {3730, 35, 34, 34, 3, -33}, // 0x48 'H' + {3879, 14, 34, 13, 3, -33}, // 0x49 'I' + {3939, 27, 35, 26, 3, -33}, // 0x4A 'J' + {4058, 37, 34, 34, 3, -33}, // 0x4B 'K' + {4216, 24, 34, 29, 4, -33}, // 0x4C 'L' + {4318, 41, 34, 39, 3, -33}, // 0x4D 'M' + {4493, 35, 34, 34, 3, -33}, // 0x4E 'N' + {4642, 34, 36, 37, 5, -34}, // 0x4F 'O' + {4795, 31, 34, 31, 4, -33}, // 0x50 'P' + {4927, 34, 37, 37, 5, -34}, // 0x51 'Q' + {5085, 33, 34, 34, 4, -33}, // 0x52 'R' + {5226, 30, 36, 31, 4, -34}, // 0x53 'S' + {5361, 28, 34, 29, 7, -33}, // 0x54 'T' + {5480, 32, 35, 34, 6, -33}, // 0x55 'U' + {5620, 30, 34, 31, 8, -33}, // 0x56 'V' + {5748, 43, 34, 44, 8, -33}, // 0x57 'W' + {5931, 37, 34, 31, 1, -33}, // 0x58 'X' + {6089, 29, 34, 31, 9, -33}, // 0x59 'Y' + {6213, 33, 34, 29, 1, -33}, // 0x5A 'Z' + {6354, 21, 43, 16, 1, -33}, // 0x5B '[' + {6467, 7, 36, 13, 6, -34}, // 0x5C '\' + {6499, 21, 43, 16, -1, -33}, // 0x5D ']' + {6612, 21, 20, 27, 6, -32}, // 0x5E '^' + {6665, 29, 4, 26, -3, 6}, // 0x5F '_' + {6680, 7, 7, 16, 8, -35}, // 0x60 '`' + {6687, 25, 26, 26, 2, -24}, // 0x61 'a' + {6769, 27, 35, 29, 3, -33}, // 0x62 'b' + {6888, 25, 26, 26, 4, -24}, // 0x63 'c' + {6970, 29, 35, 29, 4, -33}, // 0x64 'd' + {7097, 25, 26, 26, 3, -24}, // 0x65 'e' + {7179, 18, 34, 16, 4, -33}, // 0x66 'f' + {7256, 29, 35, 29, 2, -24}, // 0x67 'g' + {7383, 27, 34, 29, 3, -33}, // 0x68 'h' + {7498, 14, 34, 13, 3, -33}, // 0x69 'i' + {7558, 19, 44, 13, -2, -33}, // 0x6A 'j' + {7663, 28, 34, 26, 3, -33}, // 0x6B 'k' + {7782, 14, 34, 13, 3, -33}, // 0x6C 'l' + {7842, 40, 25, 42, 3, -24}, // 0x6D 'm' + {7967, 27, 25, 29, 3, -24}, // 0x6E 'n' + {8052, 26, 26, 29, 4, -24}, // 0x6F 'o' + {8137, 29, 35, 29, 1, -24}, // 0x70 'p' + {8264, 28, 35, 29, 3, -24}, // 0x71 'q' + {8387, 20, 25, 18, 3, -24}, // 0x72 'r' + {8450, 24, 26, 26, 3, -24}, // 0x73 's' + {8528, 14, 32, 16, 5, -30}, // 0x74 't' + {8584, 27, 26, 29, 4, -24}, // 0x75 'u' + {8672, 25, 25, 26, 6, -24}, // 0x76 'v' + {8751, 35, 25, 37, 6, -24}, // 0x77 'w' + {8861, 29, 25, 26, 1, -24}, // 0x78 'x' + {8952, 29, 35, 26, 2, -24}, // 0x79 'y' + {9079, 26, 25, 23, 1, -24}, // 0x7A 'z' + {9161, 18, 43, 18, 4, -33}, // 0x7B '{' + {9258, 13, 43, 13, 3, -33}, // 0x7C '|' + {9328, 18, 43, 18, 2, -33}, // 0x7D '}' + {9425, 22, 8, 27, 5, -14}}; // 0x7E '~' + +const GFXfont FreeSansBoldOblique24pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique24pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique24pt7bGlyphs, 0x20, 0x7E, 56}; + +// Approx. 10119 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h new file mode 100644 index 0000000..ff72f73 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h @@ -0,0 +1,229 @@ +#pragma once +#include + +const uint8_t FreeSansBoldOblique9pt7bBitmaps[] PROGMEM = { + 0x21, 0x8E, 0x73, 0x18, 0xC6, 0x21, 0x19, 0xCE, 0x00, 0xEF, 0xDF, 0xBE, + 0x68, 0x80, 0x06, 0xC1, 0x99, 0xFF, 0xBF, 0xF1, 0xB0, 0x66, 0x0C, 0xC7, + 0xFC, 0xFF, 0x8C, 0x83, 0x30, 0x64, 0x00, 0x02, 0x00, 0xF0, 0x7F, 0x1D, + 0x73, 0xEE, 0x78, 0x0F, 0x00, 0xF8, 0x0F, 0xC1, 0xBB, 0xA7, 0x74, 0xEF, + 0xF8, 0xFE, 0x04, 0x00, 0x80, 0x3C, 0x11, 0xF8, 0x8E, 0x66, 0x31, 0x90, + 0xCE, 0x83, 0xF4, 0x07, 0xB0, 0x00, 0x9E, 0x04, 0xFC, 0x26, 0x31, 0x98, + 0xC4, 0x7E, 0x20, 0xF0, 0x07, 0x80, 0xFC, 0x1D, 0xC1, 0xDC, 0x1F, 0x80, + 0xE0, 0x3E, 0x37, 0x77, 0xE3, 0xEE, 0x3C, 0xE3, 0xCF, 0xFE, 0x3C, 0xE0, + 0xFF, 0xE8, 0x06, 0x06, 0x0C, 0x18, 0x38, 0x30, 0x70, 0x60, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x70, 0x30, 0x0C, 0x0E, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, 0x30, 0x60, 0x60, + 0x32, 0xBF, 0x9C, 0xD2, 0x40, 0x0C, 0x06, 0x07, 0x1F, 0xFF, 0xF0, 0xC0, + 0xE0, 0x60, 0x77, 0x72, 0x6C, 0xFF, 0xC0, 0xFC, 0x02, 0x02, 0x04, 0x04, + 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x0F, 0x07, 0xE3, + 0x9D, 0xC7, 0x71, 0xDC, 0x7E, 0x1F, 0x8E, 0xE3, 0xB8, 0xEE, 0x73, 0xF8, + 0x3C, 0x00, 0x04, 0x3B, 0xF7, 0xE1, 0xC3, 0x06, 0x1C, 0x38, 0x70, 0xC1, + 0x87, 0x00, 0x0F, 0x87, 0xFC, 0xE3, 0xB8, 0x70, 0x0E, 0x03, 0x80, 0xF0, + 0x38, 0x1E, 0x07, 0x01, 0xC0, 0x7F, 0xCF, 0xF8, 0x0F, 0xC7, 0xFC, 0xE3, + 0xB8, 0x70, 0x1C, 0x0F, 0x03, 0xF0, 0x0E, 0x01, 0xDC, 0x3B, 0x8E, 0x7F, + 0x83, 0xE0, 0x03, 0xC0, 0xE0, 0x58, 0x2E, 0x13, 0x8C, 0xE6, 0x33, 0xFE, + 0xFF, 0x81, 0xC0, 0x60, 0x18, 0x0F, 0xE3, 0xFC, 0x60, 0x0C, 0x03, 0x78, + 0x7F, 0x9C, 0x70, 0x0E, 0x01, 0xDC, 0x33, 0x8E, 0x7F, 0x83, 0xE0, 0x0F, + 0x07, 0xE3, 0x9D, 0xC0, 0x7F, 0x1F, 0xEF, 0x3B, 0x8E, 0xE3, 0xB8, 0xCE, + 0x71, 0xF8, 0x3C, 0x00, 0x7F, 0xDF, 0xF0, 0x18, 0x0C, 0x06, 0x03, 0x81, + 0xC0, 0x60, 0x38, 0x0C, 0x07, 0x01, 0x80, 0x60, 0x00, 0x0F, 0x83, 0xFC, + 0xE3, 0x9C, 0x73, 0x9C, 0x3F, 0x0F, 0xE3, 0x8E, 0xE1, 0xDC, 0x3B, 0x8E, + 0x7F, 0xC3, 0xE0, 0x0F, 0x83, 0xF8, 0xE3, 0xB8, 0x77, 0x0E, 0xE1, 0xDC, + 0x7B, 0xFE, 0x3D, 0xC0, 0x33, 0x8E, 0x7F, 0x87, 0xC0, 0x77, 0x00, 0x00, + 0x0E, 0xE0, 0x39, 0xC0, 0x00, 0x01, 0xCE, 0x71, 0x19, 0x80, 0x00, 0x00, + 0x70, 0xFD, 0xF8, 0x70, 0x3F, 0x03, 0xF8, 0x1E, 0x01, 0x80, 0x7F, 0xDF, + 0xF0, 0x00, 0x00, 0xFF, 0xBF, 0xE0, 0x60, 0x1E, 0x07, 0xF0, 0x3F, 0x03, + 0x87, 0xEF, 0xC3, 0x80, 0x00, 0x00, 0x1F, 0x1F, 0xFE, 0x1F, 0x87, 0x01, + 0xC0, 0xE0, 0x70, 0x78, 0x3C, 0x0E, 0x00, 0x00, 0xE0, 0x38, 0x00, 0x00, + 0xFC, 0x00, 0xFF, 0xC0, 0xF0, 0x78, 0x70, 0x07, 0x38, 0x01, 0xCC, 0x3F, + 0x36, 0x31, 0x8D, 0x98, 0x63, 0xC4, 0x11, 0xF3, 0x0C, 0x6C, 0xC6, 0x73, + 0x3E, 0xF8, 0xE7, 0x3C, 0x1E, 0x00, 0x03, 0xFE, 0x00, 0x3F, 0x00, 0x01, + 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0xC0, 0x6F, 0x03, 0x38, 0x31, 0xC3, 0x8E, + 0x1F, 0xF1, 0xFF, 0x8C, 0x1E, 0xE0, 0x76, 0x03, 0x80, 0x1F, 0xF0, 0xFF, + 0xC6, 0x0E, 0x70, 0x73, 0x87, 0x1F, 0xF0, 0xFF, 0x86, 0x0E, 0x70, 0x73, + 0x83, 0x9C, 0x38, 0xFF, 0xC7, 0xF8, 0x00, 0x07, 0xE0, 0xFF, 0x8F, 0x1E, + 0x70, 0x77, 0x00, 0x30, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x03, 0xBC, + 0x38, 0xFF, 0x83, 0xF0, 0x00, 0x1F, 0xE0, 0xFF, 0x86, 0x1E, 0x70, 0x73, + 0x83, 0x9C, 0x1C, 0xC0, 0xE6, 0x07, 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, + 0x8F, 0xF0, 0x00, 0x1F, 0xF8, 0xFF, 0x86, 0x00, 0x70, 0x03, 0x80, 0x1F, + 0xF0, 0xFF, 0x86, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xFF, 0xC7, 0xFC, + 0x00, 0x1F, 0xF1, 0xFF, 0x18, 0x03, 0x80, 0x38, 0x03, 0xFC, 0x3F, 0xC7, + 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE0, 0x00, 0x07, 0xC1, 0xFE, + 0x38, 0x77, 0x03, 0x70, 0x0E, 0x00, 0xE1, 0xEE, 0x1E, 0xE0, 0x6E, 0x0E, + 0x70, 0xE7, 0xFC, 0x1F, 0x40, 0x1C, 0x1C, 0x60, 0x63, 0x83, 0x8E, 0x0E, + 0x38, 0x38, 0xFF, 0xC3, 0xFF, 0x1C, 0x1C, 0x70, 0x71, 0xC1, 0xC6, 0x06, + 0x18, 0x38, 0xE0, 0xE0, 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE, + 0x00, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x00, 0xE0, 0x1C, + 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x87, 0xC0, 0x1C, 0x3C, 0x71, 0xC1, 0x8E, + 0x0E, 0x70, 0x3B, 0x80, 0xFC, 0x03, 0xF0, 0x0E, 0xE0, 0x73, 0x81, 0xC7, + 0x07, 0x1C, 0x18, 0x38, 0xE0, 0xF0, 0x1C, 0x07, 0x01, 0x80, 0xE0, 0x38, + 0x0E, 0x03, 0x80, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xFF, 0x7F, 0x80, 0x1E, + 0x1F, 0x1E, 0x1E, 0x3E, 0x1E, 0x3E, 0x3E, 0x36, 0x3E, 0x36, 0x6E, 0x36, + 0x6C, 0x76, 0xCC, 0x76, 0xDC, 0x67, 0x9C, 0x67, 0x98, 0xE7, 0x18, 0xE7, + 0x18, 0x1C, 0x1C, 0x70, 0x63, 0xE1, 0x8F, 0x8E, 0x3E, 0x38, 0xDC, 0xC3, + 0x33, 0x1C, 0xEC, 0x71, 0xF1, 0xC7, 0xC6, 0x1E, 0x18, 0x38, 0xE0, 0xE0, + 0x07, 0xC0, 0xFF, 0x8E, 0x1E, 0xE0, 0x77, 0x03, 0xF0, 0x1F, 0x80, 0xFC, + 0x07, 0xE0, 0x77, 0x03, 0xBC, 0x38, 0xFF, 0x81, 0xF0, 0x00, 0x1F, 0xF0, + 0xFF, 0xC6, 0x0E, 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, 0x87, 0xF8, 0x70, + 0x03, 0x80, 0x1C, 0x00, 0xC0, 0x0E, 0x00, 0x00, 0x07, 0xC0, 0xFF, 0x8F, + 0x1C, 0xE0, 0x77, 0x03, 0xB0, 0x1F, 0x80, 0xFC, 0x06, 0xE1, 0x77, 0x1F, + 0x3C, 0x78, 0xFF, 0xC1, 0xF6, 0x00, 0x20, 0x1F, 0xF0, 0xFF, 0xC6, 0x0E, + 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, 0x87, 0xFC, 0x70, 0x73, 0x83, 0x9C, + 0x38, 0xC1, 0xC6, 0x0F, 0x00, 0x07, 0xE0, 0xFF, 0xC7, 0x0E, 0x70, 0x73, + 0x80, 0x1F, 0x80, 0x7F, 0x80, 0x7E, 0x00, 0x77, 0x03, 0xBC, 0x38, 0xFF, + 0xC3, 0xF8, 0x00, 0xFF, 0xDF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x06, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xC0, 0x18, 0x07, 0x00, 0x38, 0x31, 0xC1, + 0x8C, 0x1C, 0xE0, 0xE7, 0x07, 0x38, 0x31, 0xC3, 0x9C, 0x1C, 0xE0, 0xE7, + 0x06, 0x38, 0x70, 0xFF, 0x03, 0xE0, 0x00, 0xE0, 0xFC, 0x1D, 0x87, 0x30, + 0xC6, 0x38, 0xC6, 0x19, 0xC3, 0xB0, 0x7E, 0x0F, 0x80, 0xF0, 0x1C, 0x03, + 0x00, 0xE1, 0xC3, 0xF1, 0xE3, 0xB8, 0xF1, 0xDC, 0x78, 0xCE, 0x6C, 0xE7, + 0x36, 0x63, 0xB3, 0x70, 0xD9, 0xB0, 0x7C, 0xD8, 0x3C, 0x78, 0x1E, 0x3C, + 0x0E, 0x1C, 0x07, 0x0E, 0x00, 0x0E, 0x1C, 0x38, 0xE0, 0xE7, 0x01, 0xD8, + 0x07, 0xE0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x0F, 0xC0, 0x77, 0x01, 0x8E, + 0x0E, 0x38, 0x70, 0xF0, 0xE0, 0xEE, 0x39, 0xC7, 0x39, 0xC3, 0x70, 0x7C, + 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x3F, 0xF3, + 0xFF, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x3C, 0x07, + 0x80, 0x70, 0x0F, 0xFC, 0xFF, 0xC0, 0x0F, 0x0F, 0x0C, 0x1C, 0x18, 0x18, + 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x78, 0x78, 0x12, + 0x4C, 0x92, 0x49, 0x26, 0xD9, 0x20, 0x1E, 0x1E, 0x06, 0x06, 0x06, 0x0C, + 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x38, 0x30, 0xF0, 0xF0, 0x06, + 0x0E, 0x0E, 0x1B, 0x33, 0x33, 0x63, 0x63, 0xFF, 0xE0, 0xCC, 0x1F, 0x8F, + 0xF3, 0x1C, 0x06, 0x1F, 0x9F, 0xEE, 0x3B, 0x9C, 0xFF, 0x1D, 0xC0, 0x18, + 0x03, 0x00, 0xE0, 0x1D, 0xC3, 0xFC, 0x71, 0xDC, 0x3B, 0x87, 0x70, 0xEE, + 0x39, 0xCF, 0x7F, 0xCF, 0xE0, 0x0F, 0x0F, 0xF7, 0x1D, 0xC0, 0xE0, 0x38, + 0x0E, 0x03, 0x8E, 0x7F, 0x0F, 0x80, 0x00, 0x60, 0x06, 0x00, 0x61, 0xEE, + 0x3F, 0xE7, 0x9C, 0x71, 0xCE, 0x1C, 0xE1, 0xCE, 0x1C, 0xE3, 0x87, 0xF8, + 0x7F, 0x80, 0x1F, 0x0F, 0xE7, 0x1D, 0xC7, 0xFF, 0xFF, 0xFE, 0x03, 0x8E, + 0x7F, 0x0F, 0x80, 0x1C, 0xF3, 0x3F, 0xFD, 0xC7, 0x18, 0x63, 0x8E, 0x30, + 0xC0, 0x0F, 0x71, 0xFE, 0x3C, 0xE3, 0x8E, 0x70, 0xE7, 0x0E, 0x70, 0xC7, + 0x1C, 0x3F, 0xC3, 0xFC, 0x01, 0xCE, 0x38, 0x7F, 0x03, 0xE0, 0x18, 0x03, + 0x00, 0xE0, 0x1D, 0xE3, 0xFE, 0x71, 0xCC, 0x3B, 0x86, 0x70, 0xCC, 0x39, + 0x87, 0x30, 0xEE, 0x18, 0x39, 0xC0, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE, + 0x00, 0x06, 0x06, 0x00, 0x0E, 0x0E, 0x0C, 0x0C, 0x1C, 0x1C, 0x1C, 0x18, + 0x18, 0x38, 0x38, 0x30, 0x70, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x1C, 0xE3, + 0x38, 0x6E, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xE1, 0x9C, 0x73, 0x8E, 0x38, + 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x00, 0x3B, 0x9E, 0x3F, + 0xFF, 0x39, 0xC7, 0x71, 0xC6, 0x71, 0x86, 0x71, 0x8E, 0x63, 0x8E, 0x63, + 0x8C, 0xE3, 0x8C, 0xE3, 0x1C, 0x3B, 0xC7, 0xFC, 0xE3, 0xB8, 0x77, 0x0C, + 0xE1, 0x98, 0x73, 0x0E, 0xE1, 0xDC, 0x30, 0x0F, 0x87, 0xF9, 0xE7, 0xB8, + 0x7E, 0x0F, 0xC1, 0xF8, 0x77, 0x9E, 0x7F, 0x87, 0xC0, 0x1D, 0xE1, 0xFE, + 0x1C, 0x73, 0x87, 0x38, 0x73, 0x87, 0x38, 0xE3, 0x8E, 0x7F, 0xC7, 0xF8, + 0x60, 0x06, 0x00, 0x60, 0x0E, 0x00, 0x1E, 0xE7, 0xFD, 0xE7, 0x38, 0xEE, + 0x1D, 0xC3, 0xB8, 0x77, 0x1C, 0x7F, 0x8F, 0xF0, 0x0E, 0x01, 0x80, 0x30, + 0x06, 0x00, 0x3B, 0x36, 0x38, 0x70, 0x70, 0x70, 0x60, 0x60, 0xE0, 0xE0, + 0x3E, 0x3F, 0xF8, 0xFC, 0x0F, 0xC3, 0xF8, 0x3D, 0x8E, 0xFE, 0x3E, 0x00, + 0x38, 0xCF, 0xFE, 0x71, 0x86, 0x38, 0xE3, 0x8F, 0x3C, 0x31, 0xDC, 0x77, + 0x19, 0x86, 0x63, 0xB8, 0xEE, 0x33, 0x9C, 0xFF, 0x1F, 0xC0, 0xE1, 0x98, + 0xE6, 0x31, 0x9C, 0x66, 0x1B, 0x86, 0xC1, 0xF0, 0x78, 0x0E, 0x00, 0xE7, + 0x1B, 0x9C, 0xEE, 0x73, 0x3B, 0xDC, 0xEB, 0x63, 0xAD, 0x8F, 0xBC, 0x1C, + 0xF0, 0x73, 0xC1, 0xCE, 0x00, 0x1C, 0xE1, 0xCC, 0x0D, 0x80, 0xF8, 0x0F, + 0x00, 0xF0, 0x1F, 0x03, 0xB8, 0x33, 0x87, 0x38, 0x70, 0xCE, 0x38, 0xC6, + 0x19, 0xC3, 0x30, 0x66, 0x0F, 0x81, 0xF0, 0x3C, 0x03, 0x80, 0x60, 0x18, + 0x0F, 0x01, 0xC0, 0x00, 0x1F, 0xCF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0x7F, 0xBF, 0xE0, 0x0E, 0x38, 0x61, 0x83, 0x06, 0x0C, 0x78, + 0xF0, 0xC1, 0x83, 0x0E, 0x1C, 0x38, 0x78, 0x70, 0x18, 0xC4, 0x21, 0x18, + 0xC4, 0x21, 0x18, 0xC4, 0x23, 0x18, 0x80, 0x1C, 0x3C, 0x38, 0x70, 0xE1, + 0x83, 0x06, 0x1E, 0x5C, 0x60, 0xC1, 0x83, 0x0C, 0x38, 0xE0, 0x71, 0x8E}; + +const GFXglyph FreeSansBoldOblique9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 5, 13, 6, 2, -12}, // 0x21 '!' + {9, 7, 5, 9, 3, -12}, // 0x22 '"' + {14, 11, 12, 10, 1, -11}, // 0x23 '#' + {31, 11, 16, 10, 1, -13}, // 0x24 '$' + {53, 14, 13, 16, 2, -12}, // 0x25 '%' + {76, 12, 13, 13, 2, -12}, // 0x26 '&' + {96, 3, 5, 4, 3, -12}, // 0x27 ''' + {98, 8, 17, 6, 2, -12}, // 0x28 '(' + {115, 8, 17, 6, -2, -13}, // 0x29 ')' + {132, 6, 6, 7, 3, -12}, // 0x2A '*' + {137, 9, 8, 11, 2, -7}, // 0x2B '+' + {146, 4, 6, 5, 0, -2}, // 0x2C ',' + {149, 5, 2, 6, 1, -5}, // 0x2D '-' + {151, 3, 2, 5, 1, -1}, // 0x2E '.' + {152, 8, 13, 5, 0, -12}, // 0x2F '/' + {165, 10, 13, 10, 1, -12}, // 0x30 '0' + {182, 7, 13, 10, 3, -12}, // 0x31 '1' + {194, 11, 13, 10, 1, -12}, // 0x32 '2' + {212, 11, 13, 10, 1, -12}, // 0x33 '3' + {230, 10, 12, 10, 1, -11}, // 0x34 '4' + {245, 11, 13, 10, 1, -12}, // 0x35 '5' + {263, 10, 13, 10, 2, -12}, // 0x36 '6' + {280, 10, 13, 10, 2, -12}, // 0x37 '7' + {297, 11, 13, 10, 1, -12}, // 0x38 '8' + {315, 11, 13, 10, 1, -12}, // 0x39 '9' + {333, 4, 9, 6, 2, -8}, // 0x3A ':' + {338, 5, 12, 6, 1, -8}, // 0x3B ';' + {346, 10, 9, 11, 1, -8}, // 0x3C '<' + {358, 10, 6, 11, 1, -6}, // 0x3D '=' + {366, 10, 9, 11, 1, -7}, // 0x3E '>' + {378, 10, 13, 11, 3, -12}, // 0x3F '?' + {395, 18, 16, 18, 1, -13}, // 0x40 '@' + {431, 13, 13, 13, 0, -12}, // 0x41 'A' + {453, 13, 13, 13, 1, -12}, // 0x42 'B' + {475, 13, 13, 13, 2, -12}, // 0x43 'C' + {497, 13, 13, 13, 1, -12}, // 0x44 'D' + {519, 13, 13, 12, 1, -12}, // 0x45 'E' + {541, 12, 13, 11, 1, -12}, // 0x46 'F' + {561, 12, 13, 14, 2, -12}, // 0x47 'G' + {581, 14, 13, 13, 1, -12}, // 0x48 'H' + {604, 5, 13, 5, 1, -12}, // 0x49 'I' + {613, 11, 13, 10, 1, -12}, // 0x4A 'J' + {631, 14, 13, 13, 1, -12}, // 0x4B 'K' + {654, 10, 13, 11, 1, -12}, // 0x4C 'L' + {671, 16, 13, 15, 1, -12}, // 0x4D 'M' + {697, 14, 13, 13, 1, -12}, // 0x4E 'N' + {720, 13, 13, 14, 2, -12}, // 0x4F 'O' + {742, 13, 13, 12, 1, -12}, // 0x50 'P' + {764, 13, 14, 14, 2, -12}, // 0x51 'Q' + {787, 13, 13, 13, 1, -12}, // 0x52 'R' + {809, 13, 13, 12, 1, -12}, // 0x53 'S' + {831, 11, 13, 11, 3, -12}, // 0x54 'T' + {849, 13, 13, 13, 2, -12}, // 0x55 'U' + {871, 11, 13, 12, 3, -12}, // 0x56 'V' + {889, 17, 13, 17, 3, -12}, // 0x57 'W' + {917, 14, 13, 12, 0, -12}, // 0x58 'X' + {940, 11, 13, 12, 3, -12}, // 0x59 'Y' + {958, 12, 13, 11, 1, -12}, // 0x5A 'Z' + {978, 8, 17, 6, 0, -12}, // 0x5B '[' + {995, 3, 17, 5, 2, -16}, // 0x5C '\' + {1002, 8, 17, 6, 0, -13}, // 0x5D ']' + {1019, 8, 8, 11, 2, -12}, // 0x5E '^' + {1027, 11, 1, 10, -1, 4}, // 0x5F '_' + {1029, 3, 2, 6, 3, -12}, // 0x60 '`' + {1030, 10, 10, 10, 1, -9}, // 0x61 'a' + {1043, 11, 13, 11, 1, -12}, // 0x62 'b' + {1061, 10, 10, 10, 1, -9}, // 0x63 'c' + {1074, 12, 13, 11, 1, -12}, // 0x64 'd' + {1094, 10, 10, 10, 1, -9}, // 0x65 'e' + {1107, 6, 13, 6, 2, -12}, // 0x66 'f' + {1117, 12, 14, 11, 0, -9}, // 0x67 'g' + {1138, 11, 13, 11, 1, -12}, // 0x68 'h' + {1156, 5, 13, 5, 1, -12}, // 0x69 'i' + {1165, 8, 17, 5, -1, -12}, // 0x6A 'j' + {1182, 11, 13, 10, 1, -12}, // 0x6B 'k' + {1200, 5, 13, 5, 1, -12}, // 0x6C 'l' + {1209, 16, 10, 16, 1, -9}, // 0x6D 'm' + {1229, 11, 10, 11, 1, -9}, // 0x6E 'n' + {1243, 11, 10, 11, 1, -9}, // 0x6F 'o' + {1257, 12, 14, 11, 0, -9}, // 0x70 'p' + {1278, 11, 14, 11, 1, -9}, // 0x71 'q' + {1298, 8, 10, 7, 1, -9}, // 0x72 'r' + {1308, 9, 10, 10, 2, -9}, // 0x73 's' + {1320, 6, 12, 6, 2, -11}, // 0x74 't' + {1329, 10, 10, 11, 2, -9}, // 0x75 'u' + {1342, 10, 10, 10, 2, -9}, // 0x76 'v' + {1355, 14, 10, 14, 2, -9}, // 0x77 'w' + {1373, 12, 10, 10, 0, -9}, // 0x78 'x' + {1388, 11, 14, 10, 1, -9}, // 0x79 'y' + {1408, 10, 10, 9, 0, -9}, // 0x7A 'z' + {1421, 7, 17, 7, 2, -12}, // 0x7B '{' + {1436, 5, 17, 5, 1, -12}, // 0x7C '|' + {1447, 7, 17, 7, 0, -13}, // 0x7D '}' + {1462, 8, 2, 11, 2, -4}}; // 0x7E '~' + +const GFXfont FreeSansBoldOblique9pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique9pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique9pt7bGlyphs, 0x20, 0x7E, 22}; + +// Approx. 2136 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h new file mode 100644 index 0000000..ce55f4d --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h @@ -0,0 +1,304 @@ +#pragma once +#include + +const uint8_t FreeSansOblique12pt7bBitmaps[] PROGMEM = { + 0x0C, 0x61, 0x86, 0x18, 0x63, 0x0C, 0x30, 0xC2, 0x18, 0x61, 0x00, 0x00, + 0xC3, 0x00, 0xCF, 0x3C, 0xE2, 0x8A, 0x20, 0x01, 0x8C, 0x03, 0x18, 0x06, + 0x60, 0x18, 0xC0, 0x31, 0x83, 0xFF, 0x87, 0xFF, 0x03, 0x18, 0x0C, 0x60, + 0x18, 0xC0, 0x23, 0x03, 0xFF, 0x8F, 0xFF, 0x02, 0x30, 0x0C, 0x60, 0x18, + 0x80, 0x63, 0x00, 0xC6, 0x00, 0x00, 0x80, 0x3F, 0x03, 0xFC, 0x32, 0x73, + 0x91, 0x99, 0x8C, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0x7E, 0x01, 0xFC, 0x0C, + 0xEC, 0x43, 0x62, 0x1B, 0x11, 0x9D, 0x9C, 0x7F, 0xC1, 0xF8, 0x02, 0x00, + 0x10, 0x01, 0x80, 0x00, 0x00, 0x01, 0x83, 0xC0, 0x60, 0xFC, 0x18, 0x30, + 0xC2, 0x0C, 0x18, 0xC1, 0x83, 0x30, 0x38, 0xCC, 0x03, 0xF1, 0x00, 0x3C, + 0x40, 0x00, 0x18, 0xF0, 0x06, 0x3F, 0x01, 0x8C, 0x30, 0x23, 0x06, 0x0C, + 0x60, 0xC3, 0x0E, 0x30, 0xC0, 0xFC, 0x10, 0x0F, 0x00, 0x01, 0xE0, 0x3F, + 0x81, 0x8C, 0x18, 0x60, 0xC3, 0x06, 0x30, 0x1F, 0x00, 0xE0, 0x1F, 0x01, + 0xDC, 0xD8, 0x6D, 0x81, 0xEC, 0x0E, 0x60, 0x73, 0x87, 0xCF, 0xE6, 0x3E, + 0x38, 0xFE, 0xA0, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, + 0x60, 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x40, 0x60, + 0x60, 0x20, 0x04, 0x06, 0x06, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x20, 0x60, + 0xC0, 0x0C, 0x0C, 0x49, 0x7F, 0x3C, 0x3C, 0x6C, 0x00, 0x03, 0x00, 0x30, + 0x03, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0xC0, + 0x0C, 0x00, 0x77, 0x22, 0x6C, 0xFF, 0xF0, 0xFC, 0x00, 0x40, 0x30, 0x08, + 0x06, 0x01, 0x00, 0xC0, 0x20, 0x18, 0x04, 0x02, 0x00, 0x80, 0x40, 0x10, + 0x08, 0x02, 0x01, 0x00, 0xC0, 0x20, 0x00, 0x07, 0xC0, 0xFE, 0x1C, 0x73, + 0x83, 0x30, 0x36, 0x03, 0x60, 0x36, 0x03, 0xC0, 0x7C, 0x07, 0xC0, 0x6C, + 0x06, 0xC0, 0xEC, 0x0C, 0xE3, 0x87, 0xF0, 0x3E, 0x00, 0x02, 0x0C, 0x77, + 0xEF, 0xC1, 0x83, 0x0C, 0x18, 0x30, 0x61, 0xC3, 0x06, 0x0C, 0x18, 0x60, + 0x03, 0xF0, 0x1F, 0xE0, 0xE1, 0xC7, 0x03, 0x18, 0x0C, 0x00, 0x30, 0x01, + 0x80, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x78, 0x07, 0x80, 0x38, 0x01, 0xC0, + 0x06, 0x00, 0x1F, 0xFC, 0xFF, 0xE0, 0x07, 0xC0, 0xFE, 0x1C, 0x73, 0x03, + 0x30, 0x30, 0x03, 0x00, 0xE0, 0x7C, 0x07, 0xC0, 0x0E, 0x00, 0x60, 0x06, + 0xC0, 0x6C, 0x0C, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x00, 0x60, 0x06, 0x00, + 0xE0, 0x1E, 0x03, 0xE0, 0x6C, 0x0C, 0xC1, 0x8C, 0x30, 0xC6, 0x1C, 0xC1, + 0x8F, 0xFF, 0xFF, 0xE0, 0x18, 0x03, 0x00, 0x30, 0x03, 0x00, 0x0F, 0xF8, + 0x7F, 0xC6, 0x00, 0x30, 0x01, 0x00, 0x1B, 0xC0, 0xFF, 0x06, 0x1C, 0x60, + 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x0C, 0x60, 0x63, 0x86, 0x0F, 0xE0, + 0x3E, 0x00, 0x03, 0xC0, 0xFE, 0x1C, 0x73, 0x83, 0x30, 0x06, 0x00, 0x67, + 0x87, 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0x4C, 0x0C, 0xE1, + 0x87, 0xF8, 0x3E, 0x00, 0x3F, 0xFB, 0xFF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x70, 0x03, 0x00, 0x30, 0x03, + 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x00, 0x07, 0xC0, 0xFE, 0x1C, + 0x73, 0x03, 0x30, 0x33, 0x03, 0x38, 0x61, 0xFC, 0x3F, 0xC7, 0x0E, 0x60, + 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x07, 0xC1, + 0xFE, 0x38, 0x73, 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x07, 0x70, 0xF3, + 0xFE, 0x1E, 0x60, 0x0E, 0x00, 0xCC, 0x1C, 0xE3, 0x87, 0xF0, 0x3C, 0x00, + 0x39, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC0, 0x1C, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x1C, 0x20, 0x86, 0x30, 0x00, 0x00, 0x01, 0xC0, + 0x3C, 0x0F, 0x81, 0xE0, 0x7C, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x3E, + 0x00, 0x38, 0x00, 0x40, 0x7F, 0xFB, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, + 0x7F, 0xF0, 0x20, 0x01, 0xC0, 0x07, 0xC0, 0x0F, 0x80, 0x0F, 0x00, 0x1C, + 0x03, 0xE0, 0x78, 0x1F, 0x03, 0xC0, 0x38, 0x00, 0x00, 0x00, 0x0F, 0x87, + 0xF9, 0xC3, 0xB0, 0x3C, 0x06, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x01, 0xC0, + 0x30, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x3F, 0x80, 0x01, 0xFF, 0xE0, 0x0F, 0x01, 0xE0, 0x38, 0x00, 0xE0, 0xE0, + 0x00, 0xC3, 0x87, 0x81, 0xCE, 0x1F, 0xB1, 0x98, 0x71, 0xC3, 0x61, 0x83, + 0x86, 0xC6, 0x06, 0x0F, 0x0C, 0x0C, 0x3E, 0x30, 0x30, 0x6C, 0x60, 0x61, + 0xD8, 0xC1, 0x87, 0x31, 0xC7, 0x1C, 0x61, 0xF7, 0xF0, 0x63, 0xCF, 0x80, + 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x78, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xDC, 0x01, 0xCC, + 0x01, 0x8C, 0x03, 0x8C, 0x03, 0x0C, 0x06, 0x0C, 0x0E, 0x0E, 0x0F, 0xFE, + 0x1F, 0xFE, 0x18, 0x06, 0x38, 0x06, 0x30, 0x06, 0x70, 0x06, 0x60, 0x07, + 0x0F, 0xF8, 0x1F, 0xF8, 0x60, 0x38, 0xC0, 0x31, 0x80, 0x63, 0x00, 0xCE, + 0x03, 0x18, 0x0C, 0x3F, 0xF0, 0x7F, 0xF0, 0xC0, 0x73, 0x00, 0x66, 0x00, + 0xCC, 0x01, 0x98, 0x06, 0x70, 0x1C, 0xFF, 0xF1, 0xFF, 0x80, 0x01, 0xF8, + 0x07, 0xFE, 0x0E, 0x0E, 0x1C, 0x03, 0x38, 0x03, 0x30, 0x00, 0x60, 0x00, + 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x06, + 0xC0, 0x0C, 0xE0, 0x1C, 0x70, 0x78, 0x3F, 0xF0, 0x1F, 0x80, 0x0F, 0xF8, + 0x1F, 0xFC, 0x18, 0x0E, 0x18, 0x07, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, + 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x70, 0x06, 0x70, 0x06, 0x60, 0x0C, + 0x60, 0x0C, 0x60, 0x18, 0xE0, 0x78, 0xFF, 0xE0, 0xFF, 0x80, 0x0F, 0xFF, + 0x1F, 0xFE, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x38, 0x00, + 0x30, 0x00, 0x3F, 0xFC, 0x3F, 0xF8, 0x70, 0x00, 0x70, 0x00, 0x60, 0x00, + 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xFF, 0xF8, 0xFF, 0xF8, 0x0F, 0xFE, + 0x3F, 0xFC, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x18, + 0x00, 0x3F, 0xF0, 0x7F, 0xE1, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x0C, 0x00, + 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x01, 0xF8, 0x07, 0xFE, + 0x0E, 0x0F, 0x18, 0x03, 0x30, 0x03, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, + 0xC0, 0x7F, 0xC0, 0x7E, 0xC0, 0x02, 0xC0, 0x06, 0xC0, 0x06, 0xE0, 0x0E, + 0x60, 0x1E, 0x78, 0x3C, 0x3F, 0xE4, 0x0F, 0x84, 0x0C, 0x01, 0x8E, 0x00, + 0xC6, 0x00, 0xE3, 0x00, 0x61, 0x80, 0x30, 0xC0, 0x18, 0xE0, 0x0C, 0x60, + 0x0E, 0x3F, 0xFE, 0x1F, 0xFF, 0x1C, 0x01, 0x8E, 0x01, 0xC6, 0x00, 0xE3, + 0x00, 0x61, 0x80, 0x31, 0xC0, 0x18, 0xC0, 0x1C, 0x60, 0x0C, 0x00, 0x0C, + 0x71, 0x86, 0x18, 0x63, 0x8C, 0x30, 0xC3, 0x1C, 0x61, 0x86, 0x18, 0xE3, + 0x00, 0x00, 0x18, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, 0x8C, 0x0C, 0x60, 0x63, + 0x07, 0x1C, 0x70, 0x7F, 0x01, 0xF0, 0x00, 0x0C, 0x03, 0x87, 0x01, 0xC1, + 0x80, 0xE0, 0x60, 0x60, 0x18, 0x70, 0x06, 0x38, 0x03, 0x9C, 0x00, 0xCE, + 0x00, 0x37, 0x80, 0x0F, 0x70, 0x07, 0x8C, 0x01, 0xC3, 0x80, 0x60, 0x60, + 0x18, 0x1C, 0x06, 0x03, 0x03, 0x80, 0xE0, 0xC0, 0x18, 0x30, 0x07, 0x00, + 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x0E, 0x01, 0x80, 0x30, + 0x06, 0x01, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xFF, 0xFF, + 0xFC, 0x0E, 0x00, 0x71, 0xE0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1E, + 0x01, 0xE1, 0xE0, 0x36, 0x3B, 0x03, 0x63, 0x30, 0x6E, 0x33, 0x0E, 0xC3, + 0x30, 0xCC, 0x33, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x31, 0xC6, 0x33, 0x18, + 0x61, 0xE1, 0x8E, 0x1E, 0x18, 0xC1, 0xC1, 0x8C, 0x1C, 0x38, 0x0C, 0x01, + 0x8F, 0x00, 0xC7, 0x80, 0x63, 0xE0, 0x71, 0xF0, 0x30, 0xD8, 0x18, 0xEE, + 0x0C, 0x63, 0x06, 0x31, 0xC7, 0x18, 0xE3, 0x0C, 0x31, 0x8C, 0x1C, 0xC6, + 0x06, 0x63, 0x03, 0xF1, 0x80, 0xF1, 0xC0, 0x78, 0xC0, 0x3C, 0x60, 0x0E, + 0x00, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0x83, 0xC3, 0x80, 0x63, 0x00, 0x3B, + 0x80, 0x0D, 0x80, 0x06, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0xF8, 0x00, 0x6C, 0x00, 0x36, 0x00, 0x31, 0x80, 0x30, 0xF0, 0x78, 0x3F, + 0xF0, 0x07, 0xE0, 0x00, 0x0F, 0xF8, 0x3F, 0xF8, 0x60, 0x38, 0xC0, 0x31, + 0x80, 0x63, 0x00, 0xCE, 0x03, 0x18, 0x0E, 0x3F, 0xF8, 0x7F, 0xE1, 0xC0, + 0x03, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, + 0x80, 0x00, 0x00, 0xFC, 0x01, 0xFF, 0xC0, 0xF0, 0x78, 0x70, 0x06, 0x38, + 0x01, 0xCC, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x03, 0x38, 0x1D, 0xC6, 0x03, 0xE1, + 0xE0, 0xF0, 0x3F, 0xFE, 0x03, 0xF1, 0xC0, 0x00, 0x20, 0x0F, 0xFC, 0x1F, + 0xFE, 0x18, 0x07, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x06, 0x30, + 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x70, 0x1C, 0x70, 0x0C, 0x60, 0x0C, 0x60, + 0x0C, 0x60, 0x18, 0xE0, 0x18, 0xC0, 0x18, 0xC0, 0x1C, 0x03, 0xF8, 0x1F, + 0xF8, 0x70, 0x38, 0xC0, 0x33, 0x00, 0x66, 0x00, 0x0C, 0x00, 0x1E, 0x00, + 0x1F, 0xC0, 0x0F, 0xF0, 0x01, 0xF0, 0x00, 0xEC, 0x00, 0xD8, 0x01, 0xB0, + 0x06, 0x70, 0x38, 0x7F, 0xE0, 0x3F, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, + 0x01, 0xC0, 0x06, 0x00, 0x18, 0x00, 0x60, 0x03, 0x80, 0x0C, 0x00, 0x30, + 0x00, 0xC0, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x18, + 0x00, 0xE0, 0x00, 0x18, 0x03, 0x38, 0x03, 0x30, 0x07, 0x30, 0x06, 0x30, + 0x06, 0x70, 0x06, 0x70, 0x0E, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0xE0, + 0x0C, 0xC0, 0x1C, 0xC0, 0x18, 0xC0, 0x18, 0xC0, 0x38, 0xE0, 0x70, 0x7F, + 0xE0, 0x1F, 0x80, 0xC0, 0x0F, 0xC0, 0x1B, 0x80, 0x73, 0x00, 0xC6, 0x03, + 0x0C, 0x06, 0x18, 0x18, 0x30, 0x70, 0x60, 0xC0, 0xE3, 0x81, 0xC6, 0x01, + 0x9C, 0x03, 0x30, 0x06, 0xE0, 0x0D, 0x80, 0x1E, 0x00, 0x3C, 0x00, 0x70, + 0x00, 0xC0, 0x70, 0x1F, 0x01, 0xC0, 0x6C, 0x0F, 0x03, 0xB0, 0x3C, 0x0C, + 0xC1, 0xF0, 0x73, 0x06, 0xC1, 0x8C, 0x3B, 0x06, 0x30, 0xC6, 0x30, 0xC7, + 0x18, 0xC3, 0x18, 0x67, 0x0C, 0xE1, 0x98, 0x33, 0x06, 0xE0, 0xDC, 0x1B, + 0x03, 0x60, 0x6C, 0x07, 0x81, 0xE0, 0x1C, 0x07, 0x80, 0x70, 0x1C, 0x01, + 0x80, 0x70, 0x00, 0x07, 0x00, 0xE0, 0xE0, 0x38, 0x0C, 0x0E, 0x01, 0xC3, + 0x80, 0x18, 0xE0, 0x03, 0x98, 0x00, 0x36, 0x00, 0x07, 0x80, 0x00, 0xF0, + 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x01, 0xDC, 0x00, 0x73, 0x80, 0x1C, 0x30, + 0x03, 0x07, 0x00, 0xC0, 0x60, 0x38, 0x0E, 0x0E, 0x00, 0xC0, 0xE0, 0x06, + 0x60, 0x0C, 0x70, 0x1C, 0x70, 0x38, 0x30, 0x70, 0x38, 0x60, 0x18, 0xC0, + 0x1D, 0xC0, 0x1F, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x0F, 0xFF, + 0x87, 0xFF, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, + 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, + 0xC0, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xF8, 0x7F, 0xFC, + 0x00, 0x07, 0xC1, 0xE0, 0x60, 0x18, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x1C, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x06, + 0x01, 0x80, 0x60, 0x1E, 0x07, 0x80, 0x93, 0x6C, 0x92, 0x49, 0x24, 0xDB, + 0x24, 0x07, 0x81, 0xE0, 0x18, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x03, + 0x01, 0xC0, 0x60, 0x18, 0x06, 0x01, 0x80, 0xE0, 0x30, 0x0C, 0x03, 0x00, + 0xC0, 0x60, 0x18, 0x1E, 0x0F, 0x80, 0x03, 0x01, 0xC0, 0xD8, 0x36, 0x19, + 0x84, 0x63, 0x19, 0x83, 0x60, 0xC0, 0xFF, 0xFC, 0xE6, 0x23, 0x07, 0xC3, + 0xFC, 0xE3, 0x98, 0x30, 0x06, 0x01, 0x87, 0xF3, 0xC6, 0xC0, 0xD8, 0x3B, + 0x0E, 0x7F, 0x77, 0xCC, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, + 0x0C, 0xF0, 0x7F, 0xC3, 0x87, 0x38, 0x19, 0x80, 0xCC, 0x06, 0x60, 0x32, + 0x03, 0xB0, 0x19, 0xC1, 0xCE, 0x1C, 0x7F, 0xC3, 0x7C, 0x00, 0x0F, 0x83, + 0xF8, 0xE3, 0xB8, 0x36, 0x07, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x1B, + 0x86, 0x3F, 0xC3, 0xE0, 0x00, 0x0C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, + 0x18, 0x3E, 0x61, 0xFF, 0x0E, 0x3C, 0x70, 0x71, 0x80, 0xCE, 0x07, 0x30, + 0x18, 0xC0, 0x63, 0x01, 0x8C, 0x0E, 0x38, 0x78, 0x7F, 0xC0, 0xFB, 0x00, + 0x07, 0xC1, 0xFE, 0x38, 0x77, 0x03, 0x60, 0x37, 0xFF, 0xFF, 0xFC, 0x00, + 0xC0, 0x0C, 0x06, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x07, 0x0F, 0x1C, 0x18, + 0x18, 0x7E, 0x7E, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, + 0xC0, 0xC0, 0x03, 0xCC, 0x3F, 0xA1, 0xC7, 0x8E, 0x0E, 0x30, 0x38, 0xC0, + 0xC6, 0x03, 0x18, 0x0C, 0x60, 0x71, 0x81, 0xC7, 0x0E, 0x0F, 0xF8, 0x1E, + 0x60, 0x03, 0x80, 0x0C, 0x30, 0x70, 0x7F, 0x80, 0xF8, 0x00, 0x0C, 0x00, + 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x01, 0x9E, 0x1F, 0xF1, 0xC7, 0x38, 0x33, + 0x03, 0x30, 0x33, 0x07, 0x30, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0xC6, + 0x0C, 0x18, 0xC0, 0x00, 0x18, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xC6, + 0x00, 0x01, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x0C, 0x06, 0x03, + 0x01, 0x81, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x03, + 0x87, 0x83, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x18, 0x61, 0x83, 0x38, 0x33, 0x81, 0xB8, 0x0F, 0xC0, 0x77, 0x03, 0x18, + 0x30, 0xC1, 0x87, 0x0C, 0x18, 0x60, 0xE3, 0x03, 0x00, 0x18, 0xC6, 0x63, + 0x18, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xC6, 0x00, 0x1B, 0xE3, 0xC3, + 0xFD, 0xFC, 0xF1, 0xE1, 0x9C, 0x18, 0x33, 0x03, 0x06, 0x60, 0xC0, 0xCC, + 0x18, 0x3B, 0x83, 0x06, 0x60, 0x60, 0xCC, 0x0C, 0x19, 0x83, 0x03, 0x30, + 0x60, 0xE6, 0x0C, 0x18, 0x1B, 0xE1, 0xFF, 0x3C, 0x73, 0x83, 0x30, 0x33, + 0x03, 0x30, 0x77, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x0C, 0x60, 0xC0, + 0x07, 0xC1, 0xFE, 0x38, 0x77, 0x03, 0x60, 0x3E, 0x03, 0xC0, 0x3C, 0x06, + 0xC0, 0x6C, 0x0E, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x0C, 0xF0, 0x3F, 0xE0, + 0xE1, 0xC7, 0x03, 0x1C, 0x0C, 0x60, 0x31, 0x80, 0xCE, 0x07, 0x38, 0x18, + 0xE0, 0xE3, 0xC7, 0x0F, 0xF8, 0x77, 0xC1, 0x80, 0x06, 0x00, 0x18, 0x00, + 0x60, 0x03, 0x80, 0x00, 0x0F, 0x98, 0xFF, 0xCE, 0x3C, 0xE0, 0xE6, 0x03, + 0x70, 0x1B, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x07, 0x38, 0x78, 0xFF, 0x83, + 0xCC, 0x00, 0x60, 0x07, 0x00, 0x38, 0x01, 0x80, 0x0C, 0x00, 0x1B, 0x8F, + 0xCF, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x18, 0x0C, 0x06, + 0x00, 0x0F, 0xC1, 0xFF, 0x30, 0x76, 0x03, 0x60, 0x07, 0x80, 0x3F, 0x80, + 0x7E, 0x00, 0x6C, 0x06, 0xE0, 0xCF, 0xF8, 0x3E, 0x00, 0x18, 0x30, 0x67, + 0xEF, 0xC6, 0x0C, 0x30, 0x60, 0xC1, 0x83, 0x0C, 0x18, 0x3C, 0x38, 0x30, + 0x33, 0x03, 0x30, 0x37, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0xC0, + 0xEC, 0x0C, 0xC3, 0xCF, 0xFC, 0x7C, 0xC0, 0xC0, 0x78, 0x1B, 0x03, 0x60, + 0xC6, 0x18, 0xC6, 0x19, 0xC3, 0x30, 0x6C, 0x0D, 0x81, 0xE0, 0x3C, 0x03, + 0x00, 0xC1, 0xC3, 0xE1, 0xE1, 0xB0, 0xF0, 0xD8, 0x78, 0xCC, 0x6C, 0x66, + 0x36, 0x63, 0x33, 0x30, 0x99, 0xB0, 0x58, 0xD8, 0x2C, 0x78, 0x1C, 0x3C, + 0x0E, 0x1C, 0x06, 0x0E, 0x00, 0x0C, 0x1C, 0x30, 0xE0, 0xE3, 0x01, 0x98, + 0x07, 0xC0, 0x0E, 0x00, 0x30, 0x01, 0xE0, 0x0F, 0x80, 0x73, 0x01, 0x8C, + 0x0C, 0x38, 0x60, 0x60, 0x18, 0x0C, 0x60, 0x61, 0x83, 0x86, 0x0C, 0x1C, + 0x60, 0x31, 0x80, 0xCC, 0x03, 0x30, 0x0D, 0x80, 0x36, 0x00, 0xF0, 0x03, + 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x06, 0x00, 0xF0, 0x03, 0x80, 0x00, + 0x1F, 0xF1, 0xFF, 0x00, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, + 0x18, 0x03, 0x00, 0x60, 0x0F, 0xFC, 0xFF, 0xC0, 0x07, 0x0E, 0x18, 0x18, + 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0xE0, 0xE0, 0x60, 0x60, 0x60, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x60, 0x0C, 0x30, 0x82, 0x08, 0x61, + 0x84, 0x10, 0x43, 0x0C, 0x20, 0x86, 0x18, 0x41, 0x04, 0x30, 0xC2, 0x00, + 0x00, 0x06, 0x07, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, + 0x01, 0xC0, 0xE0, 0x60, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0x01, + 0x83, 0x83, 0x80, 0x38, 0x0F, 0x82, 0x38, 0x83, 0xE0, 0x38}; + +const GFXglyph FreeSansOblique12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 7, 0, 1}, // 0x20 ' ' + {0, 6, 18, 7, 3, -17}, // 0x21 '!' + {14, 6, 6, 9, 4, -16}, // 0x22 '"' + {19, 15, 18, 13, 1, -17}, // 0x23 '#' + {53, 13, 21, 13, 2, -17}, // 0x24 '$' + {88, 19, 17, 21, 3, -16}, // 0x25 '%' + {129, 13, 17, 16, 2, -16}, // 0x26 '&' + {157, 2, 6, 5, 4, -16}, // 0x27 ''' + {159, 8, 23, 8, 3, -17}, // 0x28 '(' + {182, 8, 23, 8, 0, -16}, // 0x29 ')' + {205, 8, 8, 9, 4, -17}, // 0x2A '*' + {213, 12, 11, 14, 2, -10}, // 0x2B '+' + {230, 4, 6, 7, 1, -1}, // 0x2C ',' + {233, 6, 2, 8, 2, -7}, // 0x2D '-' + {235, 3, 2, 7, 2, -1}, // 0x2E '.' + {236, 10, 18, 7, 0, -17}, // 0x2F '/' + {259, 12, 17, 13, 2, -16}, // 0x30 '0' + {285, 7, 17, 13, 5, -16}, // 0x31 '1' + {300, 14, 17, 13, 1, -16}, // 0x32 '2' + {330, 12, 17, 13, 2, -16}, // 0x33 '3' + {356, 12, 17, 13, 2, -16}, // 0x34 '4' + {382, 13, 17, 13, 2, -16}, // 0x35 '5' + {410, 12, 17, 13, 2, -16}, // 0x36 '6' + {436, 13, 17, 13, 3, -16}, // 0x37 '7' + {464, 12, 17, 13, 2, -16}, // 0x38 '8' + {490, 12, 17, 13, 2, -16}, // 0x39 '9' + {516, 5, 12, 7, 3, -11}, // 0x3A ':' + {524, 6, 16, 7, 2, -11}, // 0x3B ';' + {536, 13, 12, 14, 2, -11}, // 0x3C '<' + {556, 13, 6, 14, 2, -8}, // 0x3D '=' + {566, 13, 12, 14, 1, -10}, // 0x3E '>' + {586, 11, 18, 13, 4, -17}, // 0x3F '?' + {611, 23, 21, 24, 2, -17}, // 0x40 '@' + {672, 16, 18, 16, 0, -17}, // 0x41 'A' + {708, 15, 18, 16, 2, -17}, // 0x42 'B' + {742, 16, 18, 17, 2, -17}, // 0x43 'C' + {778, 16, 18, 17, 2, -17}, // 0x44 'D' + {814, 16, 18, 16, 2, -17}, // 0x45 'E' + {850, 15, 18, 14, 2, -17}, // 0x46 'F' + {884, 16, 18, 19, 3, -17}, // 0x47 'G' + {920, 17, 18, 17, 2, -17}, // 0x48 'H' + {959, 6, 18, 7, 2, -17}, // 0x49 'I' + {973, 13, 18, 12, 1, -17}, // 0x4A 'J' + {1003, 18, 18, 16, 2, -17}, // 0x4B 'K' + {1044, 11, 18, 13, 2, -17}, // 0x4C 'L' + {1069, 20, 18, 20, 2, -17}, // 0x4D 'M' + {1114, 17, 18, 18, 2, -17}, // 0x4E 'N' + {1153, 17, 18, 18, 2, -17}, // 0x4F 'O' + {1192, 15, 18, 15, 2, -17}, // 0x50 'P' + {1226, 18, 19, 19, 2, -17}, // 0x51 'Q' + {1269, 16, 18, 17, 2, -17}, // 0x52 'R' + {1305, 15, 18, 16, 2, -17}, // 0x53 'S' + {1339, 14, 18, 15, 4, -17}, // 0x54 'T' + {1371, 16, 18, 17, 3, -17}, // 0x55 'U' + {1407, 15, 18, 15, 4, -17}, // 0x56 'V' + {1441, 22, 18, 22, 4, -17}, // 0x57 'W' + {1491, 19, 18, 16, 0, -17}, // 0x58 'X' + {1534, 16, 18, 16, 4, -17}, // 0x59 'Y' + {1570, 17, 18, 15, 1, -17}, // 0x5A 'Z' + {1609, 10, 23, 7, 0, -17}, // 0x5B '[' + {1638, 3, 18, 7, 4, -17}, // 0x5C '\' + {1645, 10, 23, 7, -1, -16}, // 0x5D ']' + {1674, 10, 9, 11, 2, -16}, // 0x5E '^' + {1686, 14, 1, 13, -1, 4}, // 0x5F '_' + {1688, 4, 4, 8, 4, -17}, // 0x60 '`' + {1690, 11, 13, 13, 2, -12}, // 0x61 'a' + {1708, 13, 18, 13, 1, -17}, // 0x62 'b' + {1738, 11, 13, 12, 2, -12}, // 0x63 'c' + {1756, 14, 18, 13, 2, -17}, // 0x64 'd' + {1788, 12, 13, 13, 2, -12}, // 0x65 'e' + {1808, 8, 18, 6, 2, -17}, // 0x66 'f' + {1826, 14, 18, 13, 1, -12}, // 0x67 'g' + {1858, 12, 18, 13, 1, -17}, // 0x68 'h' + {1885, 5, 18, 5, 2, -17}, // 0x69 'i' + {1897, 9, 23, 6, -1, -17}, // 0x6A 'j' + {1923, 13, 18, 12, 1, -17}, // 0x6B 'k' + {1953, 5, 18, 5, 2, -17}, // 0x6C 'l' + {1965, 19, 13, 20, 1, -12}, // 0x6D 'm' + {1996, 12, 13, 13, 1, -12}, // 0x6E 'n' + {2016, 12, 13, 13, 2, -12}, // 0x6F 'o' + {2036, 14, 18, 14, 0, -12}, // 0x70 'p' + {2068, 13, 18, 13, 2, -12}, // 0x71 'q' + {2098, 9, 13, 8, 1, -12}, // 0x72 'r' + {2113, 12, 13, 12, 1, -12}, // 0x73 's' + {2133, 7, 16, 6, 2, -15}, // 0x74 't' + {2147, 12, 13, 13, 2, -12}, // 0x75 'u' + {2167, 11, 13, 12, 3, -12}, // 0x76 'v' + {2185, 17, 13, 17, 3, -12}, // 0x77 'w' + {2213, 14, 13, 12, 0, -12}, // 0x78 'x' + {2236, 14, 18, 11, 0, -12}, // 0x79 'y' + {2268, 12, 13, 12, 1, -12}, // 0x7A 'z' + {2288, 8, 23, 8, 3, -17}, // 0x7B '{' + {2311, 6, 23, 6, 1, -17}, // 0x7C '|' + {2329, 9, 23, 8, -1, -16}, // 0x7D '}' + {2355, 11, 5, 14, 3, -10}}; // 0x7E '~' + +const GFXfont FreeSansOblique12pt7b PROGMEM = { + (uint8_t *)FreeSansOblique12pt7bBitmaps, + (GFXglyph *)FreeSansOblique12pt7bGlyphs, 0x20, 0x7E, 29}; + +// Approx. 3034 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h new file mode 100644 index 0000000..f85b07f --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h @@ -0,0 +1,520 @@ +#pragma once +#include + +const uint8_t FreeSansOblique18pt7bBitmaps[] PROGMEM = { + 0x03, 0x83, 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x38, 0x1C, 0x0E, 0x07, 0x07, + 0x83, 0x81, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x0C, 0x04, 0x00, 0x00, + 0x01, 0xC0, 0xE0, 0x70, 0x78, 0x00, 0x71, 0xDC, 0x7F, 0x3F, 0x8E, 0xE3, + 0xB8, 0xEC, 0x33, 0x0C, 0xC3, 0x00, 0x00, 0x38, 0x70, 0x01, 0xC3, 0x80, + 0x0C, 0x18, 0x00, 0xE1, 0xC0, 0x06, 0x0C, 0x00, 0x70, 0xE0, 0x03, 0x87, + 0x03, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0x60, 0xC0, 0x07, + 0x0E, 0x00, 0x30, 0x60, 0x03, 0x87, 0x00, 0x18, 0x30, 0x1F, 0xFF, 0xF8, + 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x07, 0x0E, 0x00, 0x30, 0x70, 0x03, 0x87, + 0x00, 0x1C, 0x38, 0x00, 0xC1, 0x80, 0x0E, 0x1C, 0x00, 0x60, 0xC0, 0x00, + 0x00, 0x0C, 0x00, 0x07, 0xF8, 0x01, 0xFF, 0xC0, 0x3F, 0xFE, 0x07, 0x99, + 0xF0, 0xF1, 0x87, 0x0E, 0x18, 0x71, 0xC1, 0x87, 0x1C, 0x38, 0x01, 0xC3, + 0x00, 0x1C, 0x30, 0x01, 0xE3, 0x00, 0x0F, 0xB0, 0x00, 0xFF, 0x80, 0x03, + 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x6F, 0xC0, 0x06, 0x3C, 0x00, 0xC1, 0xCE, + 0x0C, 0x1C, 0xE0, 0xC1, 0xCE, 0x0C, 0x38, 0xF1, 0xC3, 0x8F, 0x98, 0xF0, + 0x7F, 0xFE, 0x03, 0xFF, 0xC0, 0x0F, 0xF0, 0x00, 0x30, 0x00, 0x03, 0x00, + 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xE0, 0x03, + 0x81, 0xFC, 0x00, 0xC0, 0xFF, 0x00, 0x60, 0x70, 0xE0, 0x38, 0x38, 0x18, + 0x1C, 0x0C, 0x06, 0x0E, 0x03, 0x01, 0x83, 0x00, 0xC0, 0xE1, 0x80, 0x38, + 0x70, 0xE0, 0x0F, 0xF8, 0x70, 0x01, 0xFC, 0x18, 0x00, 0x3E, 0x0C, 0x00, + 0x00, 0x06, 0x07, 0x80, 0x03, 0x87, 0xF8, 0x00, 0xC3, 0xFE, 0x00, 0x61, + 0xE1, 0xC0, 0x30, 0x60, 0x30, 0x1C, 0x30, 0x0C, 0x0E, 0x0C, 0x03, 0x03, + 0x03, 0x01, 0x81, 0x80, 0xE1, 0xE0, 0xC0, 0x1F, 0xF0, 0x70, 0x07, 0xF8, + 0x18, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0, + 0x1E, 0x3C, 0x03, 0xC1, 0xC0, 0x38, 0x1C, 0x03, 0x81, 0xC0, 0x38, 0x38, + 0x03, 0xC7, 0x00, 0x1D, 0xE0, 0x01, 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xF0, + 0x01, 0xF7, 0x87, 0x3C, 0x3C, 0xE7, 0x81, 0xCE, 0x70, 0x1F, 0xCE, 0x00, + 0xFC, 0xE0, 0x07, 0x8E, 0x00, 0x78, 0xF0, 0x1F, 0x8F, 0x87, 0xFC, 0x7F, + 0xF9, 0xC3, 0xFE, 0x1E, 0x1F, 0x80, 0xE0, 0x77, 0xFE, 0xEE, 0xCC, 0xC0, + 0x00, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x30, 0x06, 0x00, 0xE0, + 0x0C, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x38, 0x07, 0x00, 0x70, 0x07, 0x00, + 0x70, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03, 0x00, + 0x18, 0x00, 0x01, 0x80, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x06, 0x00, + 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x03, + 0x80, 0x38, 0x03, 0x00, 0x70, 0x06, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x00, 0x06, 0x01, 0x84, 0x47, 0xF7, 0xFF, 0xCF, 0xC1, + 0xE0, 0xD8, 0x67, 0x18, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0F, 0x00, + 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xE0, + 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3B, 0xDC, 0x21, 0x18, 0x98, 0xFF, 0xFF, + 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0x06, 0x00, 0x18, 0x00, 0x30, 0x00, 0xC0, + 0x01, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0x03, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00, + 0x18, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x18, 0x00, 0x30, + 0x00, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x7F, 0xC0, 0x7F, 0xF8, + 0x3E, 0x1E, 0x0F, 0x03, 0xC7, 0x80, 0x71, 0xC0, 0x1C, 0xE0, 0x07, 0x38, + 0x01, 0xDE, 0x00, 0x77, 0x00, 0x1D, 0xC0, 0x0F, 0x70, 0x03, 0xFC, 0x00, + 0xEE, 0x00, 0x3B, 0x80, 0x0E, 0xE0, 0x07, 0xB8, 0x01, 0xCE, 0x00, 0xF3, + 0x80, 0x38, 0xF0, 0x1E, 0x1E, 0x1F, 0x07, 0xFF, 0x80, 0xFF, 0xC0, 0x0F, + 0x80, 0x00, 0x00, 0xC0, 0x70, 0x3C, 0x3E, 0xFF, 0xBF, 0xEF, 0xF8, 0x1E, + 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07, + 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0xE0, 0x38, 0x00, 0x00, 0x3F, + 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0xE0, 0x7C, 0x1E, 0x07, 0x80, 0xF0, 0xF0, + 0x07, 0x0E, 0x00, 0x70, 0xE0, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00, + 0x1F, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0x80, 0x00, + 0x70, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFF, + 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, 0xC1, 0xF0, 0x70, + 0x0E, 0x1C, 0x01, 0xC3, 0x80, 0x38, 0xE0, 0x07, 0x00, 0x01, 0xC0, 0x00, + 0xF0, 0x03, 0xFC, 0x00, 0x7F, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0x00, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x1E, 0x70, 0x03, + 0x8F, 0x00, 0xF1, 0xF0, 0x7C, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xC0, + 0x00, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x1F, + 0x80, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xDC, 0x01, 0xE7, 0x00, 0x71, 0xC0, + 0x38, 0xF0, 0x1C, 0x38, 0x0E, 0x0E, 0x07, 0x03, 0x83, 0x80, 0xE1, 0xC0, + 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x70, 0x00, 0x38, + 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x01, 0xFF, + 0xF0, 0x3F, 0xFF, 0x03, 0xFF, 0xE0, 0x78, 0x00, 0x07, 0x00, 0x00, 0x70, + 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0xFC, 0x01, 0xFF, 0xF0, 0x1F, + 0xFF, 0x83, 0xE0, 0x78, 0x3C, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, + 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x8E, 0x00, 0x78, + 0xE0, 0x0F, 0x0F, 0x81, 0xE0, 0x7F, 0xFC, 0x03, 0xFF, 0x80, 0x0F, 0xE0, + 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, 0xE1, 0xF0, 0xF0, + 0x0E, 0x1C, 0x01, 0xC7, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x1F, + 0x01, 0xCF, 0xF8, 0x3B, 0xFF, 0x87, 0xE0, 0xF8, 0xF0, 0x0F, 0x3C, 0x00, + 0xE7, 0x80, 0x1C, 0xE0, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x1C, 0x70, 0x03, + 0x8F, 0x00, 0xE0, 0xF0, 0x78, 0x1F, 0xFF, 0x01, 0xFF, 0x80, 0x0F, 0xC0, + 0x00, 0x3F, 0xFF, 0xCF, 0xFF, 0xF7, 0xFF, 0xFC, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, + 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, + 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x38, 0x00, + 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x7E, + 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x07, 0xC1, 0xF0, 0xE0, 0x0E, 0x38, 0x01, + 0xC7, 0x00, 0x38, 0xE0, 0x0E, 0x1C, 0x01, 0xC3, 0xC0, 0xF0, 0x3F, 0xFC, + 0x03, 0xFE, 0x01, 0xFF, 0xF0, 0x7C, 0x1E, 0x1E, 0x01, 0xE3, 0x80, 0x1C, + 0xE0, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x0E, 0x70, 0x03, 0x8F, 0x00, 0xF1, + 0xF0, 0x7C, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xC0, 0x00, 0x00, 0x7E, + 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x07, 0xC1, 0xE0, 0xE0, 0x1E, 0x38, 0x01, + 0xC7, 0x00, 0x39, 0xC0, 0x07, 0x38, 0x00, 0xE7, 0x00, 0x3C, 0xE0, 0x07, + 0x9E, 0x01, 0xE3, 0xE0, 0xFC, 0x3F, 0xFB, 0x83, 0xFE, 0xF0, 0x3F, 0x1C, + 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1C, 0x70, 0x07, 0x8E, 0x01, 0xE1, + 0xE0, 0xF8, 0x1F, 0xFE, 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x0E, 0x3C, + 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0xF1, 0xE3, 0x80, 0x07, 0x0F, 0x0F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x78, 0x70, 0x10, 0x10, + 0x30, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x1F, 0x80, 0x1F, + 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, + 0x00, 0x0F, 0xC0, 0x00, 0x78, 0x00, 0x01, 0x00, 0x7F, 0xFF, 0xDF, 0xFF, + 0xF7, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFB, + 0xFF, 0xFE, 0xFF, 0xFF, 0x80, 0x10, 0x00, 0x03, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, + 0x00, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00, + 0x7F, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xF8, + 0x0F, 0xFC, 0x1F, 0xFE, 0x3C, 0x1F, 0x78, 0x07, 0x70, 0x07, 0xE0, 0x07, + 0xE0, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, + 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, + 0x3C, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFE, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x0F, 0x80, 0x03, 0xE0, 0x0F, + 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x01, 0xF0, 0x0F, 0x0F, + 0x03, 0xFD, 0xC7, 0x8F, 0x03, 0xFE, 0xE1, 0xC7, 0x03, 0xC3, 0x60, 0xE7, + 0x03, 0xC0, 0xF0, 0x77, 0x83, 0xC0, 0x70, 0x3B, 0x83, 0xC0, 0x78, 0x1D, + 0xC1, 0xC0, 0x38, 0x1F, 0xC1, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x1C, 0x0F, + 0x70, 0x70, 0x0E, 0x07, 0x38, 0x38, 0x0E, 0x07, 0x9C, 0x1C, 0x0F, 0x07, + 0x8E, 0x0F, 0x0F, 0x8F, 0x87, 0x03, 0xFD, 0xFF, 0x83, 0xC1, 0xFC, 0xFF, + 0x80, 0xE0, 0x7C, 0x3F, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x01, 0xF8, 0x07, 0x00, 0x00, 0x7F, 0xFF, + 0x80, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x01, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFF, + 0x00, 0x01, 0xDE, 0x00, 0x07, 0x9C, 0x00, 0x0E, 0x38, 0x00, 0x3C, 0x70, + 0x00, 0x70, 0xF0, 0x01, 0xC1, 0xE0, 0x07, 0x83, 0xC0, 0x0E, 0x07, 0x80, + 0x38, 0x07, 0x00, 0x70, 0x0E, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x0F, + 0xFF, 0xF8, 0x1C, 0x00, 0xF0, 0x70, 0x01, 0xE1, 0xE0, 0x01, 0xC3, 0x80, + 0x03, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x78, 0x00, 0x1E, 0xE0, 0x00, + 0x3C, 0x07, 0xFF, 0xC0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0E, 0x00, 0xF0, + 0xF0, 0x03, 0x87, 0x00, 0x1C, 0x38, 0x00, 0xE1, 0xC0, 0x07, 0x0E, 0x00, + 0x70, 0xF0, 0x03, 0x87, 0x00, 0x78, 0x3F, 0xFF, 0x81, 0xFF, 0xF8, 0x0F, + 0xFF, 0xF0, 0xE0, 0x03, 0xC7, 0x00, 0x0E, 0x38, 0x00, 0x71, 0xC0, 0x03, + 0x9E, 0x00, 0x1C, 0xE0, 0x00, 0xE7, 0x00, 0x0E, 0x38, 0x00, 0xF1, 0xC0, + 0x0F, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0x00, 0x1F, + 0x80, 0x03, 0xFF, 0x80, 0x1F, 0xFF, 0x01, 0xF8, 0x3E, 0x07, 0x80, 0x38, + 0x38, 0x00, 0xF1, 0xC0, 0x01, 0xCF, 0x00, 0x07, 0x38, 0x00, 0x01, 0xE0, + 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, + 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x7B, 0x80, 0x01, 0xCE, + 0x00, 0x0F, 0x3C, 0x00, 0x38, 0x70, 0x01, 0xE1, 0xE0, 0x0F, 0x07, 0xC0, + 0xF8, 0x0F, 0xFF, 0xC0, 0x1F, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xFF, + 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xE0, 0x38, 0x03, 0xE0, 0xF0, 0x03, + 0xC1, 0xC0, 0x03, 0x83, 0x80, 0x03, 0x87, 0x00, 0x07, 0x1E, 0x00, 0x0E, + 0x3C, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xE0, 0x00, 0x71, 0xC0, 0x00, 0xE7, + 0x80, 0x03, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x38, 0x00, 0x3C, 0x70, + 0x00, 0x71, 0xE0, 0x01, 0xE3, 0x80, 0x03, 0x87, 0x00, 0x0E, 0x0E, 0x00, + 0x3C, 0x1C, 0x01, 0xF0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFE, 0x01, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x38, 0x00, + 0x00, 0xF0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x70, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, + 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, + 0xC1, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x7F, 0xFF, + 0xC1, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, + 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xC0, 0x00, 0x07, 0xFF, + 0xF0, 0x1F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0x38, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, + 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xFF, + 0xFC, 0x03, 0xE0, 0x3E, 0x07, 0x80, 0x0E, 0x0F, 0x00, 0x0F, 0x1E, 0x00, + 0x07, 0x1C, 0x00, 0x07, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, 0x00, 0xF0, 0x07, 0xFE, 0xE0, 0x07, 0xFE, 0xE0, 0x07, + 0xFE, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, + 0x1C, 0xF0, 0x00, 0x3C, 0x70, 0x00, 0x7C, 0x78, 0x00, 0xFC, 0x3E, 0x03, + 0xDC, 0x1F, 0xFF, 0x98, 0x0F, 0xFE, 0x18, 0x03, 0xF8, 0x18, 0x07, 0x00, + 0x07, 0x83, 0x80, 0x03, 0xC1, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0xF0, + 0x00, 0x70, 0x70, 0x00, 0x78, 0x38, 0x00, 0x3C, 0x1C, 0x00, 0x1C, 0x1E, + 0x00, 0x0E, 0x0F, 0x00, 0x07, 0x07, 0x00, 0x07, 0x83, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xE0, 0x00, 0x70, 0x70, 0x00, 0x78, + 0x38, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x1E, 0x00, 0x0E, 0x0E, 0x00, 0x0F, + 0x07, 0x00, 0x07, 0x83, 0x80, 0x03, 0x81, 0xC0, 0x01, 0xC1, 0xE0, 0x00, + 0xE0, 0xE0, 0x00, 0xF0, 0x70, 0x00, 0x78, 0x00, 0x07, 0x0F, 0x0F, 0x0E, + 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0x38, + 0x38, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xF0, 0xE0, 0x00, 0x01, + 0xC0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, + 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, + 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x1E, + 0x1C, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0x70, 0xE0, 0x3C, 0x38, 0x0E, 0x0F, + 0x0F, 0x81, 0xFF, 0xC0, 0x7F, 0xE0, 0x07, 0xE0, 0x00, 0x07, 0x00, 0x07, + 0x83, 0x80, 0x07, 0x81, 0xC0, 0x0F, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0x70, 0x0F, 0x00, 0x38, 0x0F, 0x00, 0x1C, 0x1F, 0x00, 0x1E, 0x1E, + 0x00, 0x0F, 0x1E, 0x00, 0x07, 0x1E, 0x00, 0x03, 0x9F, 0x00, 0x01, 0xDF, + 0xC0, 0x01, 0xFC, 0xE0, 0x00, 0xFC, 0x78, 0x00, 0x7C, 0x1C, 0x00, 0x3C, + 0x0F, 0x00, 0x1C, 0x07, 0x80, 0x1E, 0x01, 0xE0, 0x0E, 0x00, 0xF0, 0x07, + 0x00, 0x38, 0x03, 0x80, 0x1E, 0x01, 0xC0, 0x07, 0x01, 0xE0, 0x03, 0xC0, + 0xE0, 0x00, 0xE0, 0x70, 0x00, 0x78, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, + 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, + 0x00, 0x70, 0x00, 0x70, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, + 0xC0, 0x00, 0xF8, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x7E, 0x0F, 0x80, + 0x03, 0xF0, 0xFC, 0x00, 0x3F, 0x07, 0x70, 0x01, 0xF8, 0x3B, 0x80, 0x1D, + 0xC1, 0xDC, 0x00, 0xEE, 0x0E, 0xE0, 0x0E, 0xE0, 0xE7, 0x00, 0x77, 0x07, + 0x38, 0x07, 0x38, 0x39, 0xC0, 0x31, 0xC1, 0xCE, 0x03, 0x9E, 0x1E, 0x38, + 0x38, 0xE0, 0xE1, 0xC1, 0xC7, 0x07, 0x0E, 0x1C, 0x38, 0x38, 0x70, 0xE1, + 0xC1, 0xC3, 0x8E, 0x1E, 0x1E, 0x1C, 0x70, 0xE0, 0xE0, 0xE7, 0x07, 0x07, + 0x07, 0x38, 0x38, 0x38, 0x1F, 0x81, 0xC1, 0xC0, 0xF8, 0x1E, 0x1C, 0x07, + 0xC0, 0xE0, 0xE0, 0x3C, 0x07, 0x07, 0x01, 0xE0, 0x38, 0x00, 0x07, 0x80, + 0x03, 0x83, 0xE0, 0x01, 0xC1, 0xF0, 0x00, 0xE0, 0xF8, 0x00, 0xE0, 0xFE, + 0x00, 0x70, 0x7F, 0x00, 0x38, 0x3B, 0xC0, 0x1C, 0x1D, 0xE0, 0x1E, 0x0E, + 0x70, 0x0E, 0x0E, 0x3C, 0x07, 0x07, 0x0E, 0x03, 0x83, 0x87, 0x81, 0xC1, + 0xC3, 0xC1, 0xE1, 0xE0, 0xE0, 0xE0, 0xE0, 0x78, 0x70, 0x70, 0x1C, 0x38, + 0x38, 0x0F, 0x1C, 0x1C, 0x07, 0x9E, 0x1E, 0x01, 0xCE, 0x0E, 0x00, 0xF7, + 0x07, 0x00, 0x3B, 0x83, 0x80, 0x1F, 0xC1, 0xC0, 0x07, 0xC1, 0xC0, 0x03, + 0xE0, 0xE0, 0x01, 0xF0, 0x70, 0x00, 0x78, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x03, 0xE0, 0x7C, 0x07, 0x80, 0x1E, 0x0F, + 0x00, 0x0E, 0x1C, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x38, 0x00, 0x07, 0x70, + 0x00, 0x07, 0x70, 0x00, 0x07, 0x70, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xE0, + 0x00, 0x0F, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, + 0x00, 0x1C, 0xE0, 0x00, 0x1C, 0xF0, 0x00, 0x38, 0x70, 0x00, 0x78, 0x78, + 0x00, 0xF0, 0x3E, 0x07, 0xE0, 0x1F, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x03, + 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x81, 0xC0, + 0x1F, 0x0F, 0x00, 0x3C, 0x38, 0x00, 0x70, 0xE0, 0x01, 0xC3, 0x80, 0x07, + 0x1E, 0x00, 0x1C, 0x78, 0x00, 0xE1, 0xC0, 0x07, 0x87, 0x00, 0x3C, 0x1F, + 0xFF, 0xE0, 0xFF, 0xFF, 0x03, 0xFF, 0xF0, 0x0E, 0x00, 0x00, 0x38, 0x00, + 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01, + 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, + 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, + 0x7C, 0x07, 0xC0, 0x78, 0x00, 0xF0, 0x78, 0x00, 0x38, 0x78, 0x00, 0x1E, + 0x78, 0x00, 0x07, 0x38, 0x00, 0x03, 0xBC, 0x00, 0x01, 0xDC, 0x00, 0x00, + 0xEE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x1D, 0xC0, 0x00, 0x0E, 0xE0, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x38, 0x00, + 0x87, 0x9E, 0x00, 0xE7, 0x87, 0x00, 0x7F, 0x83, 0xC0, 0x1F, 0x80, 0xF8, + 0x1F, 0x80, 0x3F, 0xFF, 0xE0, 0x0F, 0xFF, 0x78, 0x01, 0xFE, 0x1E, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xF8, + 0x1F, 0xFF, 0xF0, 0x38, 0x00, 0xF0, 0xF0, 0x00, 0xE1, 0xC0, 0x01, 0xC3, + 0x80, 0x03, 0x87, 0x00, 0x07, 0x1E, 0x00, 0x0E, 0x3C, 0x00, 0x38, 0x70, + 0x00, 0xF0, 0xE0, 0x03, 0xC1, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x0F, 0xFF, + 0xF8, 0x1C, 0x00, 0x78, 0x38, 0x00, 0x70, 0x70, 0x00, 0xE1, 0xE0, 0x01, + 0xC3, 0x80, 0x03, 0x87, 0x00, 0x06, 0x0E, 0x00, 0x1C, 0x1C, 0x00, 0x38, + 0x78, 0x00, 0x70, 0xE0, 0x00, 0xE1, 0xC0, 0x01, 0xE0, 0x00, 0x3F, 0xC0, + 0x07, 0xFF, 0xC0, 0x3F, 0xFF, 0x81, 0xF0, 0x1E, 0x0F, 0x00, 0x3C, 0x38, + 0x00, 0x71, 0xC0, 0x01, 0xC7, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x07, 0xFF, 0x00, + 0x03, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xF3, 0x80, 0x01, 0xCE, 0x00, + 0x07, 0x38, 0x00, 0x18, 0xE0, 0x00, 0xE3, 0xC0, 0x07, 0x07, 0x80, 0x7C, + 0x1F, 0xFF, 0xE0, 0x3F, 0xFE, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, + 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0xC0, + 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x78, + 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xE0, 0x00, 0x0E, 0x00, 0x0F, 0x0E, 0x00, 0x0F, 0x0E, 0x00, 0x0E, 0x0E, + 0x00, 0x0E, 0x1E, 0x00, 0x0E, 0x1C, 0x00, 0x1E, 0x1C, 0x00, 0x1C, 0x1C, + 0x00, 0x1C, 0x3C, 0x00, 0x1C, 0x3C, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x38, + 0x00, 0x38, 0x38, 0x00, 0x38, 0x78, 0x00, 0x38, 0x70, 0x00, 0x78, 0x70, + 0x00, 0x78, 0x70, 0x00, 0x70, 0xF0, 0x00, 0x70, 0xF0, 0x00, 0x70, 0xE0, + 0x00, 0xF0, 0xE0, 0x00, 0xE0, 0xF0, 0x03, 0xE0, 0x78, 0x0F, 0xC0, 0x7F, + 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0xE0, 0x00, 0x3F, 0x80, + 0x03, 0xFC, 0x00, 0x1D, 0xE0, 0x01, 0xE7, 0x00, 0x0E, 0x38, 0x00, 0xE1, + 0xC0, 0x07, 0x0E, 0x00, 0x70, 0x70, 0x07, 0x83, 0xC0, 0x38, 0x1E, 0x03, + 0xC0, 0xF0, 0x1C, 0x03, 0x81, 0xE0, 0x1C, 0x0E, 0x00, 0xE0, 0xF0, 0x07, + 0x07, 0x00, 0x3C, 0x70, 0x01, 0xE3, 0x80, 0x0F, 0x38, 0x00, 0x39, 0xC0, + 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0xE0, 0x07, 0x80, + 0x1E, 0xE0, 0x07, 0xC0, 0x1E, 0xE0, 0x0F, 0xC0, 0x1C, 0xE0, 0x0F, 0xC0, + 0x3C, 0xE0, 0x1F, 0xC0, 0x38, 0xE0, 0x1D, 0xC0, 0x78, 0xE0, 0x3D, 0xC0, + 0x70, 0xE0, 0x39, 0xC0, 0xF0, 0xE0, 0x79, 0xC0, 0xE0, 0xE0, 0x71, 0xC0, + 0xE0, 0xE0, 0xF1, 0xC1, 0xC0, 0xE0, 0xE1, 0xC1, 0xC0, 0xE1, 0xE1, 0xC3, + 0xC0, 0x61, 0xC1, 0xC3, 0x80, 0x63, 0xC1, 0xC7, 0x80, 0x63, 0x80, 0xE7, + 0x00, 0x67, 0x80, 0xEF, 0x00, 0x67, 0x00, 0xEE, 0x00, 0x7F, 0x00, 0xEE, + 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0xF8, + 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF0, + 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, + 0xF0, 0x07, 0x80, 0x0F, 0x01, 0xE0, 0x01, 0xE0, 0x78, 0x00, 0x1C, 0x1E, + 0x00, 0x03, 0xC7, 0x80, 0x00, 0x39, 0xE0, 0x00, 0x07, 0xB8, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xF3, 0x80, 0x00, 0x3C, + 0x78, 0x00, 0x0F, 0x0F, 0x00, 0x03, 0xC0, 0xF0, 0x00, 0x70, 0x1E, 0x00, + 0x1E, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x03, 0xC0, 0x78, 0x00, + 0x78, 0x1E, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x3C, 0xE0, 0x00, 0x71, 0xE0, + 0x01, 0xE3, 0xC0, 0x07, 0x83, 0xC0, 0x1E, 0x07, 0x80, 0x78, 0x07, 0x00, + 0xE0, 0x0F, 0x03, 0xC0, 0x1E, 0x0F, 0x00, 0x1C, 0x3C, 0x00, 0x3C, 0xF0, + 0x00, 0x39, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x00, + 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xC0, 0x00, 0x03, + 0x80, 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x00, 0x01, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, + 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x03, 0xC0, + 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, + 0x00, 0x38, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03, 0x80, + 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x70, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, + 0xCC, 0xCC, 0xCC, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0x33, 0x33, + 0x33, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, 0x70, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xE0, + 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x1E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1E, 0x00, 0xE0, + 0x07, 0x03, 0xF8, 0x1F, 0xC0, 0xFC, 0x00, 0x00, 0xF0, 0x03, 0xC0, 0x1F, + 0x00, 0x7C, 0x03, 0xB8, 0x1C, 0xE0, 0x63, 0x83, 0x8E, 0x1C, 0x38, 0x60, + 0x73, 0x81, 0xCC, 0x07, 0x70, 0x1F, 0x80, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0xF1, 0xC3, 0x86, 0x0C, 0x00, 0xFE, 0x01, 0xFF, 0xE0, 0xFF, + 0xFC, 0x3C, 0x0F, 0x1C, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0E, + 0x00, 0x1F, 0x83, 0xFF, 0xE3, 0xFE, 0x39, 0xF0, 0x1E, 0xF0, 0x07, 0x38, + 0x01, 0xCE, 0x00, 0xF3, 0xC0, 0xFC, 0xFF, 0xF7, 0x9F, 0xF1, 0xE1, 0xF0, + 0x38, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, + 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x71, 0xF0, 0x0E, 0xFF, 0x83, 0xFF, + 0xF8, 0x7F, 0x0F, 0x0F, 0x80, 0xF1, 0xE0, 0x0E, 0x38, 0x01, 0xCF, 0x00, + 0x39, 0xE0, 0x07, 0x38, 0x00, 0xE7, 0x00, 0x38, 0xE0, 0x07, 0x3C, 0x00, + 0xE7, 0x80, 0x38, 0xF8, 0x0F, 0x1F, 0x87, 0xC3, 0xFF, 0xF0, 0xE7, 0xFC, + 0x1C, 0x7E, 0x00, 0x01, 0xF8, 0x07, 0xFC, 0x0F, 0xFE, 0x1E, 0x0F, 0x3C, + 0x07, 0x78, 0x07, 0x70, 0x07, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xE0, + 0x00, 0xE0, 0x00, 0xE0, 0x0E, 0xE0, 0x1C, 0xF0, 0x3C, 0x78, 0x78, 0x7F, + 0xF0, 0x3F, 0xE0, 0x0F, 0x80, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00, + 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x01, 0xE0, 0x1F, + 0x1C, 0x07, 0xFD, 0xC0, 0xFF, 0xDC, 0x1E, 0x0F, 0xC3, 0xC0, 0x7C, 0x38, + 0x07, 0x87, 0x00, 0x38, 0x70, 0x03, 0x8F, 0x00, 0x38, 0xE0, 0x07, 0x8E, + 0x00, 0x70, 0xE0, 0x07, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0F, 0x01, 0xF0, + 0x78, 0x7E, 0x07, 0xFF, 0xE0, 0x3F, 0xEE, 0x01, 0xF8, 0xE0, 0x01, 0xF8, + 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xC1, 0xF3, 0xC0, 0x79, 0xC0, 0x1D, 0xC0, + 0x0E, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x1C, 0x00, 0x0E, + 0x00, 0x07, 0x00, 0x73, 0xC0, 0x78, 0xF0, 0x78, 0x7F, 0xF8, 0x1F, 0xF8, + 0x03, 0xF0, 0x00, 0x01, 0xE0, 0x7C, 0x1F, 0x83, 0x80, 0x70, 0x1C, 0x03, + 0x83, 0xFC, 0x7F, 0x8F, 0xF0, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x0F, 0x01, + 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0xE0, 0x1C, 0x00, 0x00, 0xFC, 0x60, 0x7F, 0xCC, 0x1F, 0xFF, 0x87, 0xC3, + 0xF1, 0xE0, 0x3E, 0x38, 0x03, 0x8E, 0x00, 0x71, 0xC0, 0x0E, 0x38, 0x01, + 0xCE, 0x00, 0x79, 0xC0, 0x0E, 0x38, 0x01, 0xC7, 0x00, 0x78, 0xE0, 0x0F, + 0x1E, 0x03, 0xC1, 0xE1, 0xF8, 0x3F, 0xFF, 0x03, 0xFE, 0xE0, 0x1F, 0x1C, + 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x38, 0x07, 0x07, 0x83, 0xC0, + 0x7F, 0xF8, 0x0F, 0xFC, 0x00, 0x7E, 0x00, 0x00, 0x07, 0x00, 0x01, 0xC0, + 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, + 0x38, 0xFC, 0x0E, 0xFF, 0x87, 0xFF, 0xF1, 0xF8, 0x3C, 0x7C, 0x07, 0x1E, + 0x01, 0xC7, 0x00, 0x73, 0xC0, 0x1C, 0xE0, 0x0F, 0x38, 0x03, 0x8E, 0x00, + 0xE3, 0x80, 0x39, 0xE0, 0x0E, 0x70, 0x07, 0x9C, 0x01, 0xC7, 0x00, 0x71, + 0xC0, 0x1C, 0xE0, 0x07, 0x38, 0x03, 0x80, 0x07, 0x07, 0x0F, 0x0E, 0x00, + 0x00, 0x00, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0xE0, 0x00, 0x3C, 0x00, + 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, + 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, + 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, + 0x38, 0x00, 0xE0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00, + 0x38, 0x00, 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1C, 0x00, 0x03, + 0x80, 0x00, 0x70, 0x1E, 0x0E, 0x07, 0x83, 0xC1, 0xE0, 0x70, 0x70, 0x0E, + 0x1C, 0x01, 0xCF, 0x00, 0x3B, 0xC0, 0x0F, 0xF8, 0x01, 0xFF, 0x80, 0x3E, + 0x70, 0x07, 0x8E, 0x00, 0xE0, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, + 0x38, 0x1C, 0x07, 0x03, 0x80, 0xF0, 0xE0, 0x0E, 0x1C, 0x01, 0xE0, 0x07, + 0x07, 0x0F, 0x0E, 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, + 0xE0, 0x1E, 0x7C, 0x0F, 0x83, 0xBF, 0xE7, 0xF8, 0x7F, 0xFD, 0xFF, 0x8F, + 0xC3, 0xF0, 0xF1, 0xE0, 0x3C, 0x0E, 0x38, 0x07, 0x01, 0xCF, 0x01, 0xE0, + 0x39, 0xC0, 0x38, 0x07, 0x38, 0x07, 0x00, 0xE7, 0x00, 0xE0, 0x1C, 0xE0, + 0x1C, 0x07, 0x3C, 0x07, 0x00, 0xE7, 0x00, 0xE0, 0x1C, 0xE0, 0x1C, 0x03, + 0x9C, 0x03, 0x80, 0xF3, 0x80, 0x70, 0x1C, 0x70, 0x1C, 0x03, 0x9C, 0x03, + 0x80, 0x73, 0x80, 0x70, 0x0E, 0x00, 0x1E, 0x3E, 0x07, 0x7F, 0xE1, 0xFF, + 0xF8, 0x7E, 0x0F, 0x1F, 0x01, 0xC7, 0x80, 0x73, 0xC0, 0x1C, 0xE0, 0x07, + 0x38, 0x03, 0xCE, 0x00, 0xE3, 0x80, 0x39, 0xE0, 0x0E, 0x70, 0x03, 0x9C, + 0x01, 0xC7, 0x00, 0x71, 0xC0, 0x1C, 0x70, 0x07, 0x38, 0x01, 0xCE, 0x00, + 0xE0, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE1, 0xE3, 0xC0, 0x79, + 0xC0, 0x1D, 0xC0, 0x0E, 0xE0, 0x07, 0x70, 0x03, 0xF0, 0x01, 0xF8, 0x01, + 0xDC, 0x00, 0xEE, 0x00, 0x77, 0x00, 0x73, 0xC0, 0x78, 0xF0, 0xF8, 0x7F, + 0xF8, 0x1F, 0xF8, 0x03, 0xF0, 0x00, 0x03, 0x8F, 0x80, 0x1D, 0xFF, 0x01, + 0xFF, 0xFC, 0x0F, 0xC1, 0xE0, 0x7C, 0x07, 0x83, 0xC0, 0x1C, 0x1C, 0x00, + 0xE1, 0xE0, 0x07, 0x0E, 0x00, 0x38, 0x70, 0x01, 0xC3, 0x80, 0x1E, 0x1C, + 0x00, 0xE1, 0xE0, 0x07, 0x0F, 0x00, 0x70, 0x78, 0x07, 0x83, 0xF0, 0xF8, + 0x3F, 0xFF, 0x81, 0xDF, 0xF8, 0x0E, 0x3F, 0x00, 0x70, 0x00, 0x03, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0xF8, 0xF0, 0x7F, 0xEE, 0x0F, 0xFF, 0xE1, 0xF0, + 0xFE, 0x3C, 0x07, 0xE3, 0x80, 0x3E, 0x70, 0x03, 0xC7, 0x00, 0x3C, 0x70, + 0x03, 0xCE, 0x00, 0x3C, 0xE0, 0x07, 0x8E, 0x00, 0x78, 0xE0, 0x07, 0x8E, + 0x00, 0xF8, 0xF0, 0x1F, 0x87, 0x87, 0xF0, 0x7F, 0xF7, 0x03, 0xFE, 0x70, + 0x0F, 0x8F, 0x00, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, + 0x00, 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x04, 0x00, 0x1E, + 0x78, 0xE7, 0xC7, 0x7C, 0x3F, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x07, 0x00, + 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, + 0x00, 0x70, 0x07, 0x00, 0x38, 0x00, 0x01, 0xF8, 0x07, 0xFE, 0x0F, 0xFF, + 0x1E, 0x0F, 0x3C, 0x07, 0x38, 0x07, 0x38, 0x00, 0x3C, 0x00, 0x3F, 0x80, + 0x1F, 0xF8, 0x07, 0xFC, 0x00, 0x7E, 0x00, 0x0E, 0xE0, 0x0E, 0xE0, 0x1E, + 0xF0, 0x3C, 0x7F, 0xF8, 0x7F, 0xF0, 0x1F, 0xC0, 0x0E, 0x03, 0x80, 0xE0, + 0x38, 0x7F, 0xDF, 0xEF, 0xF8, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x38, + 0x1E, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xFC, 0x3F, 0x07, + 0x80, 0x1C, 0x03, 0xC7, 0x00, 0xE1, 0xC0, 0x38, 0xF0, 0x0E, 0x38, 0x03, + 0x8E, 0x00, 0xE3, 0x80, 0x70, 0xE0, 0x1C, 0x78, 0x07, 0x1C, 0x01, 0xC7, + 0x00, 0x71, 0xC0, 0x3C, 0x70, 0x0E, 0x38, 0x07, 0x8E, 0x03, 0xE3, 0x81, + 0xF8, 0xFF, 0xFE, 0x1F, 0xFF, 0x03, 0xF1, 0xC0, 0xE0, 0x07, 0xE0, 0x0F, + 0xE0, 0x0E, 0xE0, 0x1C, 0x70, 0x1C, 0x70, 0x38, 0x70, 0x38, 0x70, 0x70, + 0x70, 0xF0, 0x70, 0xE0, 0x71, 0xC0, 0x71, 0xC0, 0x33, 0x80, 0x3B, 0x80, + 0x3F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0xE0, 0x1C, + 0x07, 0xE0, 0x3C, 0x0E, 0xE0, 0x3C, 0x0E, 0xE0, 0x7C, 0x1C, 0xE0, 0x7C, + 0x1C, 0xE0, 0xEC, 0x38, 0xE0, 0xEC, 0x38, 0x61, 0xCC, 0x70, 0x61, 0xCC, + 0x70, 0x63, 0x8C, 0xE0, 0x73, 0x8C, 0xE0, 0x77, 0x0C, 0xC0, 0x77, 0x0D, + 0xC0, 0x7E, 0x0D, 0x80, 0x7E, 0x0F, 0x80, 0x7C, 0x0F, 0x80, 0x7C, 0x0F, + 0x00, 0x78, 0x0F, 0x00, 0x78, 0x0E, 0x00, 0x0E, 0x00, 0xE1, 0xE0, 0x38, + 0x1C, 0x0E, 0x03, 0xC3, 0x80, 0x38, 0xE0, 0x07, 0xBC, 0x00, 0x77, 0x00, + 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x1C, 0x00, 0x07, 0xC0, 0x01, 0xF8, 0x00, + 0x77, 0x80, 0x1E, 0x70, 0x07, 0x8F, 0x00, 0xE0, 0xE0, 0x38, 0x1C, 0x0E, + 0x01, 0xC3, 0x80, 0x38, 0x00, 0x0E, 0x00, 0x70, 0xF0, 0x0F, 0x07, 0x00, + 0xE0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x38, 0x07, 0x03, 0x80, 0x70, + 0x70, 0x07, 0x07, 0x00, 0x70, 0xE0, 0x03, 0x9E, 0x00, 0x39, 0xC0, 0x03, + 0xB8, 0x00, 0x3B, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, + 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, + 0x07, 0x00, 0x00, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, + 0x00, 0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x3F, 0xFF, 0x00, 0x01, 0xC0, 0x00, + 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C, + 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x00, 0x7F, 0xFE, 0x1F, 0xFF, 0xC3, 0xFF, 0xF8, 0x00, 0x00, + 0x70, 0x1F, 0x01, 0xF0, 0x3C, 0x03, 0x80, 0x38, 0x07, 0x00, 0x70, 0x07, + 0x00, 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x01, 0xE0, 0x3C, 0x0F, 0x80, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x80, 0x38, + 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x0E, 0x00, 0xF8, 0x0F, 0x80, 0x78, + 0x00, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, + 0x01, 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x01, + 0x81, 0x80, 0xC0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x01, + 0x80, 0xC0, 0x00, 0x01, 0xE0, 0x1F, 0x01, 0xF0, 0x07, 0x00, 0xE0, 0x0E, + 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, + 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x1F, 0x03, 0xC0, 0x78, 0x07, 0x00, 0x70, + 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0xC0, + 0xF8, 0x0F, 0x80, 0xE0, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x7F, 0x83, 0x63, + 0xC7, 0xC1, 0xFE, 0x00, 0xFC, 0x00, 0x78}; + +const GFXglyph FreeSansOblique18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 10, 0, 1}, // 0x20 ' ' + {0, 9, 26, 10, 4, -25}, // 0x21 '!' + {30, 10, 9, 12, 6, -24}, // 0x22 '"' + {42, 21, 25, 19, 2, -24}, // 0x23 '#' + {108, 20, 31, 19, 2, -26}, // 0x24 '$' + {186, 26, 25, 31, 5, -24}, // 0x25 '%' + {268, 20, 25, 23, 3, -24}, // 0x26 '&' + {331, 4, 9, 7, 6, -24}, // 0x27 ''' + {336, 12, 33, 12, 4, -25}, // 0x28 '(' + {386, 12, 33, 12, -1, -24}, // 0x29 ')' + {436, 10, 10, 14, 6, -25}, // 0x2A '*' + {449, 18, 16, 20, 3, -15}, // 0x2B '+' + {485, 5, 8, 10, 2, -2}, // 0x2C ',' + {490, 9, 3, 12, 3, -10}, // 0x2D '-' + {494, 4, 4, 10, 3, -3}, // 0x2E '.' + {496, 15, 26, 10, 0, -25}, // 0x2F '/' + {545, 18, 25, 19, 3, -24}, // 0x30 '0' + {602, 10, 25, 19, 7, -24}, // 0x31 '1' + {634, 20, 25, 19, 2, -24}, // 0x32 '2' + {697, 19, 25, 19, 2, -24}, // 0x33 '3' + {757, 18, 25, 19, 2, -24}, // 0x34 '4' + {814, 20, 25, 19, 2, -24}, // 0x35 '5' + {877, 19, 25, 19, 3, -24}, // 0x36 '6' + {937, 18, 25, 19, 5, -24}, // 0x37 '7' + {994, 19, 25, 19, 3, -24}, // 0x38 '8' + {1054, 19, 25, 19, 2, -24}, // 0x39 '9' + {1114, 7, 19, 10, 4, -18}, // 0x3A ':' + {1131, 8, 24, 10, 3, -18}, // 0x3B ';' + {1155, 19, 17, 20, 3, -16}, // 0x3C '<' + {1196, 18, 9, 20, 3, -12}, // 0x3D '=' + {1217, 19, 17, 20, 2, -15}, // 0x3E '>' + {1258, 16, 26, 19, 6, -25}, // 0x3F '?' + {1310, 33, 31, 36, 3, -25}, // 0x40 '@' + {1438, 23, 26, 23, 0, -25}, // 0x41 'A' + {1513, 21, 26, 23, 3, -25}, // 0x42 'B' + {1582, 22, 26, 25, 4, -25}, // 0x43 'C' + {1654, 23, 26, 25, 3, -25}, // 0x44 'D' + {1729, 23, 26, 23, 3, -25}, // 0x45 'E' + {1804, 22, 26, 21, 3, -25}, // 0x46 'F' + {1876, 24, 26, 27, 4, -25}, // 0x47 'G' + {1954, 25, 26, 25, 3, -25}, // 0x48 'H' + {2036, 8, 26, 10, 4, -25}, // 0x49 'I' + {2062, 18, 26, 18, 2, -25}, // 0x4A 'J' + {2121, 25, 26, 23, 3, -25}, // 0x4B 'K' + {2203, 16, 26, 19, 3, -25}, // 0x4C 'L' + {2255, 29, 26, 30, 3, -25}, // 0x4D 'M' + {2350, 25, 26, 26, 3, -25}, // 0x4E 'N' + {2432, 24, 26, 27, 4, -25}, // 0x4F 'O' + {2510, 22, 26, 23, 3, -25}, // 0x50 'P' + {2582, 25, 28, 27, 4, -25}, // 0x51 'Q' + {2670, 23, 26, 25, 3, -25}, // 0x52 'R' + {2745, 22, 26, 23, 3, -25}, // 0x53 'S' + {2817, 20, 26, 21, 6, -25}, // 0x54 'T' + {2882, 24, 26, 25, 4, -25}, // 0x55 'U' + {2960, 21, 26, 23, 6, -25}, // 0x56 'V' + {3029, 32, 26, 33, 6, -25}, // 0x57 'W' + {3133, 27, 26, 23, 1, -25}, // 0x58 'X' + {3221, 23, 26, 24, 6, -25}, // 0x59 'Y' + {3296, 25, 26, 21, 1, -25}, // 0x5A 'Z' + {3378, 13, 33, 10, 1, -25}, // 0x5B '[' + {3432, 4, 26, 10, 5, -25}, // 0x5C '\' + {3445, 13, 33, 10, -1, -24}, // 0x5D ']' + {3499, 14, 14, 16, 3, -24}, // 0x5E '^' + {3524, 21, 2, 19, -2, 5}, // 0x5F '_' + {3530, 6, 5, 12, 6, -25}, // 0x60 '`' + {3534, 18, 19, 19, 2, -18}, // 0x61 'a' + {3577, 19, 26, 20, 2, -25}, // 0x62 'b' + {3639, 16, 19, 18, 3, -18}, // 0x63 'c' + {3677, 20, 26, 20, 3, -25}, // 0x64 'd' + {3742, 17, 19, 19, 3, -18}, // 0x65 'e' + {3783, 11, 26, 9, 2, -25}, // 0x66 'f' + {3819, 19, 27, 19, 2, -18}, // 0x67 'g' + {3884, 18, 26, 19, 2, -25}, // 0x68 'h' + {3943, 8, 26, 8, 2, -25}, // 0x69 'i' + {3969, 14, 34, 8, -2, -25}, // 0x6A 'j' + {4029, 19, 26, 18, 2, -25}, // 0x6B 'k' + {4091, 8, 26, 8, 2, -25}, // 0x6C 'l' + {4117, 27, 19, 29, 2, -18}, // 0x6D 'm' + {4182, 18, 19, 19, 2, -18}, // 0x6E 'n' + {4225, 17, 19, 19, 3, -18}, // 0x6F 'o' + {4266, 21, 26, 20, 0, -18}, // 0x70 'p' + {4335, 20, 27, 19, 2, -18}, // 0x71 'q' + {4403, 13, 19, 11, 2, -18}, // 0x72 'r' + {4434, 16, 19, 18, 2, -18}, // 0x73 's' + {4472, 10, 23, 9, 3, -22}, // 0x74 't' + {4501, 18, 19, 19, 3, -18}, // 0x75 'u' + {4544, 16, 19, 17, 4, -18}, // 0x76 'v' + {4582, 24, 19, 25, 4, -18}, // 0x77 'w' + {4639, 19, 19, 17, 1, -18}, // 0x78 'x' + {4685, 20, 27, 17, 0, -18}, // 0x79 'y' + {4753, 19, 19, 17, 1, -18}, // 0x7A 'z' + {4799, 12, 33, 12, 3, -25}, // 0x7B '{' + {4849, 9, 33, 9, 2, -25}, // 0x7C '|' + {4887, 12, 33, 12, 0, -24}, // 0x7D '}' + {4937, 16, 7, 20, 5, -15}}; // 0x7E '~' + +const GFXfont FreeSansOblique18pt7b PROGMEM = { + (uint8_t *)FreeSansOblique18pt7bBitmaps, + (GFXglyph *)FreeSansOblique18pt7bGlyphs, 0x20, 0x7E, 42}; + +// Approx. 5623 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h new file mode 100644 index 0000000..805aefa --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h @@ -0,0 +1,842 @@ +#pragma once +#include + +const uint8_t FreeSansOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x3C, 0x07, + 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x1E, 0x00, 0x78, + 0x7B, 0xC3, 0xDE, 0x1F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0xC3, 0xDC, 0x1C, + 0xE0, 0xE7, 0x07, 0x30, 0x31, 0x81, 0x80, 0x00, 0x07, 0x81, 0xC0, 0x00, + 0x78, 0x3C, 0x00, 0x07, 0x03, 0xC0, 0x00, 0xF0, 0x38, 0x00, 0x0E, 0x07, + 0x80, 0x01, 0xE0, 0x70, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xC0, 0xF0, 0x00, + 0x3C, 0x0E, 0x00, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xFE, 0x00, 0x70, 0x3C, 0x00, 0x0F, 0x03, 0x80, 0x00, 0xF0, 0x78, 0x00, + 0x0E, 0x07, 0x80, 0x01, 0xE0, 0x70, 0x00, 0x1C, 0x0F, 0x00, 0x03, 0xC0, + 0xE0, 0x00, 0x3C, 0x1E, 0x00, 0x03, 0x81, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0x03, 0x80, 0x00, 0xE0, + 0x78, 0x00, 0x1E, 0x07, 0x00, 0x01, 0xC0, 0xF0, 0x00, 0x1C, 0x0F, 0x00, + 0x03, 0xC0, 0xE0, 0x00, 0x38, 0x1E, 0x00, 0x07, 0x81, 0xC0, 0x00, 0x78, + 0x3C, 0x00, 0x07, 0x03, 0xC0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0x7F, + 0xFF, 0xE0, 0x1F, 0x18, 0xF8, 0x0F, 0x8E, 0x1F, 0x07, 0xC3, 0x83, 0xC1, + 0xE0, 0xE0, 0xF0, 0x70, 0x38, 0x3C, 0x3C, 0x0C, 0x0F, 0x0F, 0x07, 0x00, + 0x03, 0xC1, 0xC0, 0x00, 0xF0, 0x70, 0x00, 0x3E, 0x1C, 0x00, 0x0F, 0xE6, + 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xFE, 0x00, 0x03, 0xFF, 0xE0, 0x00, + 0x3F, 0xFC, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xC7, 0xF0, 0x00, 0x70, 0x7C, + 0x00, 0x1C, 0x0F, 0x00, 0x06, 0x03, 0xCF, 0x03, 0x80, 0xF3, 0xC0, 0xE0, + 0x3C, 0xF0, 0x38, 0x0E, 0x3C, 0x0E, 0x07, 0x8F, 0x03, 0x01, 0xE3, 0xE1, + 0xC0, 0xF0, 0xF8, 0x70, 0x78, 0x1F, 0x9C, 0xFC, 0x03, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x80, 0x1F, 0x00, 0x00, 0x70, 0x07, 0xFC, 0x00, 0x0E, + 0x00, 0xFF, 0xE0, 0x01, 0xC0, 0x1E, 0x1E, 0x00, 0x3C, 0x03, 0x80, 0xF0, + 0x03, 0x80, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x0E, 0x00, 0xE0, + 0x07, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x3C, 0x00, 0xE0, 0x0E, 0x03, 0x80, + 0x0E, 0x00, 0xE0, 0x70, 0x00, 0xF0, 0x1C, 0x0E, 0x00, 0x07, 0x87, 0xC1, + 0xE0, 0x00, 0x7F, 0xF8, 0x1C, 0x00, 0x03, 0xFE, 0x03, 0x80, 0x00, 0x0F, + 0x80, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x1F, + 0x00, 0x00, 0x1C, 0x07, 0xFC, 0x00, 0x03, 0x80, 0xFF, 0xE0, 0x00, 0x70, + 0x1E, 0x1E, 0x00, 0x0F, 0x03, 0x80, 0xF0, 0x00, 0xE0, 0x70, 0x07, 0x00, + 0x1C, 0x07, 0x00, 0x70, 0x03, 0x80, 0xE0, 0x07, 0x00, 0x70, 0x0E, 0x00, + 0x70, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x1C, 0x00, + 0xF0, 0x1C, 0x03, 0x80, 0x07, 0x87, 0xC0, 0x70, 0x00, 0x7F, 0xF8, 0x07, + 0x00, 0x03, 0xFE, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, + 0x03, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0xF8, 0x7C, 0x00, 0x78, 0x0F, + 0x00, 0x1E, 0x03, 0xC0, 0x0F, 0x00, 0xF0, 0x03, 0xC0, 0x3C, 0x00, 0xF0, + 0x1E, 0x00, 0x3C, 0x07, 0x80, 0x0F, 0x87, 0xC0, 0x01, 0xE3, 0xE0, 0x00, + 0x7F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xFC, 0x00, + 0x03, 0xFF, 0x00, 0x01, 0xFB, 0xE0, 0x70, 0xF8, 0x7C, 0x1C, 0x7C, 0x1F, + 0x0E, 0x3C, 0x03, 0xE3, 0x9E, 0x00, 0x79, 0xE7, 0x80, 0x1F, 0xF3, 0xC0, + 0x03, 0xF8, 0xF0, 0x00, 0xFE, 0x3C, 0x00, 0x1F, 0x0F, 0x00, 0x07, 0xC3, + 0xE0, 0x03, 0xF8, 0xF8, 0x03, 0xFE, 0x3F, 0x83, 0xF7, 0xC7, 0xFF, 0xF8, + 0xF0, 0xFF, 0xFC, 0x3E, 0x1F, 0xFC, 0x07, 0x81, 0xFC, 0x00, 0x00, 0x7B, + 0xDF, 0xEF, 0x7B, 0xDC, 0xE7, 0x31, 0x80, 0x00, 0x0E, 0x00, 0x38, 0x00, + 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, + 0x0F, 0x00, 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, + 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, + 0x00, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, + 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x07, + 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, + 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xC0, 0x07, 0x00, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x18, 0xE3, + 0x7B, 0xBF, 0xFF, 0xF3, 0xFF, 0x01, 0xE0, 0x1F, 0xC0, 0xF7, 0x07, 0x9E, + 0x1C, 0x38, 0x20, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x78, + 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, + 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, + 0x78, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3E, 0x7C, 0xF9, 0xE7, + 0xC1, 0x83, 0x0C, 0x18, 0x63, 0xC6, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x7D, 0xF7, 0xBE, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, + 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, + 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, 0x0C, + 0x00, 0x00, 0xE0, 0x00, 0x06, 0x00, 0x00, 0x70, 0x00, 0x03, 0x00, 0x00, + 0x38, 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, + 0x00, 0x60, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x38, + 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, 0x00, + 0x60, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, + 0xE0, 0x3F, 0x0F, 0xC0, 0xF8, 0x07, 0x81, 0xE0, 0x0F, 0x87, 0x80, 0x0F, + 0x1F, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x78, 0x00, 0x79, 0xE0, 0x00, 0xF3, + 0xC0, 0x01, 0xE7, 0x80, 0x07, 0xDE, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0x78, + 0x00, 0x3C, 0xF0, 0x00, 0x79, 0xE0, 0x00, 0xF7, 0x80, 0x03, 0xEF, 0x00, + 0x07, 0xDE, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x7C, 0xF0, 0x00, + 0xF1, 0xE0, 0x03, 0xE3, 0xC0, 0x07, 0x87, 0xC0, 0x1F, 0x0F, 0x80, 0x7C, + 0x0F, 0xC3, 0xF0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x1F, 0xFC, 0x00, + 0x0F, 0xC0, 0x00, 0x00, 0x18, 0x01, 0xC0, 0x1C, 0x01, 0xE0, 0x1F, 0x0F, + 0xFB, 0xFF, 0xDF, 0xFC, 0xFF, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x00, 0x00, 0x03, 0xFC, + 0x00, 0x03, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xE0, 0x0F, + 0xC0, 0xFC, 0x03, 0xE0, 0x07, 0xC0, 0xF8, 0x00, 0xF8, 0x1F, 0x00, 0x0F, + 0x03, 0xC0, 0x01, 0xE0, 0xF8, 0x00, 0x3C, 0x1E, 0x00, 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xFF, + 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x3F, + 0xFF, 0xE0, 0x1F, 0x81, 0xF8, 0x1F, 0x00, 0x7C, 0x1F, 0x00, 0x1E, 0x0F, + 0x00, 0x0F, 0x0F, 0x80, 0x07, 0x87, 0x80, 0x03, 0xC0, 0x00, 0x03, 0xC0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xE0, + 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x79, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x3C, 0x00, + 0x0F, 0x1E, 0x00, 0x0F, 0x0F, 0x80, 0x1F, 0x83, 0xF0, 0x3F, 0x81, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xBC, + 0x00, 0x0F, 0xBC, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x78, 0x00, 0x7C, 0x78, + 0x00, 0xF8, 0x78, 0x00, 0xF0, 0x78, 0x01, 0xE0, 0xF0, 0x03, 0xC0, 0xF0, + 0x07, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xF0, 0x3C, 0x01, 0xE0, + 0x78, 0x01, 0xE0, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, + 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x80, 0x00, 0x7F, 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x03, 0xFF, + 0xFF, 0x00, 0x7F, 0xFF, 0xE0, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC7, 0xE0, 0x00, 0xF7, 0xFF, 0x80, 0x1F, + 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0x3F, + 0x03, 0xC0, 0x03, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0xF0, 0x7C, 0x00, + 0x3C, 0x0F, 0x80, 0x0F, 0x80, 0xFC, 0x07, 0xE0, 0x1F, 0xFF, 0xF8, 0x01, + 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xFE, 0x01, 0xF8, + 0x3E, 0x03, 0xE0, 0x1F, 0x07, 0xC0, 0x1F, 0x0F, 0x80, 0x0F, 0x0F, 0x00, + 0x0F, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x1F, + 0x80, 0x3C, 0x7F, 0xE0, 0x3D, 0xFF, 0xF0, 0x7B, 0xFF, 0xF8, 0x7F, 0xC1, + 0xF8, 0x7F, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0xFC, 0x00, 0x3C, 0xF8, 0x00, + 0x3C, 0xF8, 0x00, 0x3C, 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x38, 0xF0, 0x00, + 0x78, 0xF0, 0x00, 0x78, 0xF0, 0x00, 0xF0, 0xF8, 0x01, 0xF0, 0x7C, 0x03, + 0xE0, 0x7E, 0x0F, 0xC0, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, + 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, + 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x1F, + 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0x81, 0xF8, 0x1F, 0x00, 0x7C, 0x0F, + 0x00, 0x1E, 0x0F, 0x00, 0x0F, 0x07, 0x80, 0x07, 0x83, 0xC0, 0x03, 0xC1, + 0xE0, 0x03, 0xC0, 0xF8, 0x03, 0xC0, 0x7E, 0x07, 0xC0, 0x1F, 0xFF, 0xC0, + 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x07, 0xE0, 0x7E, + 0x07, 0xC0, 0x0F, 0x07, 0x80, 0x07, 0xC7, 0xC0, 0x01, 0xE3, 0xC0, 0x00, + 0xF3, 0xC0, 0x00, 0x79, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1C, 0x78, 0x00, + 0x1E, 0x3C, 0x00, 0x0F, 0x1F, 0x00, 0x0F, 0x0F, 0xC0, 0x0F, 0x83, 0xF0, + 0x3F, 0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xFC, + 0x03, 0xFF, 0xFC, 0x07, 0xF0, 0x7E, 0x07, 0xC0, 0x3E, 0x0F, 0x80, 0x1F, + 0x0F, 0x00, 0x0F, 0x1E, 0x00, 0x0F, 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x0F, + 0x3C, 0x00, 0x0F, 0x3C, 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0x3C, 0x00, 0x3F, + 0x3E, 0x00, 0x7E, 0x3E, 0x00, 0xFE, 0x1F, 0x83, 0xFE, 0x1F, 0xFF, 0xFE, + 0x0F, 0xFF, 0xBC, 0x07, 0xFE, 0x3C, 0x01, 0xF8, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF0, 0xF0, 0x01, 0xF0, + 0xF0, 0x03, 0xE0, 0xF8, 0x07, 0xC0, 0xFC, 0x1F, 0xC0, 0x7F, 0xFF, 0x80, + 0x3F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xC1, 0xF0, + 0x78, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F, + 0x07, 0x83, 0xE0, 0xF8, 0x00, 0x03, 0xE0, 0x7C, 0x0F, 0x03, 0xE0, 0x7C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x7C, 0x0F, + 0x81, 0xE0, 0x7C, 0x01, 0x80, 0x30, 0x0C, 0x01, 0x80, 0x60, 0x3C, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x00, + 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0E, + 0x00, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE3, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, + 0xC7, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF8, 0x04, 0x00, 0x00, 0x01, 0xC0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x01, + 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x3F, 0xF8, 0x0F, 0xFF, 0xC1, 0xFF, 0xFE, 0x1F, 0x03, 0xE3, 0xE0, + 0x1F, 0x7C, 0x00, 0xF7, 0x80, 0x0F, 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x80, + 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x3E, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x7F, 0xE0, 0x0F, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, + 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, + 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0xF8, + 0x00, 0xFC, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0xF9, 0xE1, 0xF0, 0x78, 0x03, + 0xFF, 0xCF, 0x07, 0x87, 0xC0, 0x3F, 0x0F, 0xF0, 0x3C, 0x7C, 0x03, 0xE0, + 0x3F, 0x01, 0xE3, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0x3E, 0x03, 0xE0, 0x0F, + 0x80, 0x79, 0xE0, 0x1E, 0x00, 0x7C, 0x03, 0xDF, 0x01, 0xE0, 0x03, 0xC0, + 0x3E, 0xF0, 0x1F, 0x00, 0x3E, 0x01, 0xE7, 0x80, 0xF0, 0x01, 0xE0, 0x0F, + 0x38, 0x07, 0x80, 0x0F, 0x00, 0xFB, 0xC0, 0x78, 0x00, 0xF0, 0x07, 0x9E, + 0x03, 0xC0, 0x07, 0x80, 0x7C, 0xF0, 0x1E, 0x00, 0x78, 0x07, 0xC7, 0x80, + 0xF0, 0x07, 0xC0, 0x7E, 0x3C, 0x07, 0x80, 0x7C, 0x07, 0xE1, 0xE0, 0x3E, + 0x07, 0xE0, 0x7E, 0x0F, 0x00, 0xF8, 0x7F, 0x8F, 0xC0, 0x7C, 0x07, 0xFF, + 0x7F, 0xFC, 0x01, 0xE0, 0x1F, 0xF1, 0xFF, 0x80, 0x0F, 0x00, 0x7E, 0x0F, + 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0xF8, 0x00, 0x00, + 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x3F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x1E, + 0x7C, 0x00, 0x00, 0x79, 0xF0, 0x00, 0x03, 0xC7, 0xC0, 0x00, 0x0F, 0x1F, + 0x00, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x0F, 0x03, 0xE0, + 0x00, 0x78, 0x0F, 0x80, 0x01, 0xE0, 0x3E, 0x00, 0x0F, 0x00, 0xF8, 0x00, + 0x3C, 0x03, 0xE0, 0x01, 0xE0, 0x0F, 0x80, 0x0F, 0x80, 0x1E, 0x00, 0x3C, + 0x00, 0x7C, 0x01, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, + 0xFF, 0x00, 0xFF, 0xFF, 0xFC, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x03, + 0xC0, 0xF8, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0xF8, + 0xF8, 0x00, 0x03, 0xE3, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x3E, 0xF8, + 0x00, 0x00, 0x7B, 0xE0, 0x00, 0x01, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0F, + 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, + 0x1F, 0x81, 0xE0, 0x00, 0x7C, 0x0F, 0x00, 0x01, 0xE0, 0x78, 0x00, 0x0F, + 0x03, 0xC0, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x3C, 0x0F, + 0x00, 0x01, 0xE0, 0x78, 0x00, 0x1E, 0x07, 0xC0, 0x03, 0xE0, 0x3F, 0xFF, + 0xFC, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE, + 0x07, 0x80, 0x01, 0xF0, 0x3C, 0x00, 0x07, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, + 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x07, 0x87, 0x80, 0x00, 0x3C, 0x3C, 0x00, + 0x01, 0xE1, 0xE0, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x0F, + 0x87, 0x80, 0x00, 0xF8, 0x3C, 0x00, 0x1F, 0x81, 0xFF, 0xFF, 0xF8, 0x1F, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x1F, + 0xFF, 0xFC, 0x00, 0xFE, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x3E, 0x00, + 0x07, 0x81, 0xF0, 0x00, 0x1E, 0x07, 0x80, 0x00, 0x3C, 0x3C, 0x00, 0x00, + 0xF1, 0xF0, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0x07, + 0x8F, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x07, 0xC1, + 0xF0, 0x00, 0x3E, 0x03, 0xE0, 0x03, 0xF0, 0x0F, 0xE0, 0x3F, 0x80, 0x1F, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF, + 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0x80, 0x3E, 0x00, 0x3F, 0x80, 0x78, 0x00, + 0x1F, 0x80, 0xF0, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x1E, 0x07, 0xC0, 0x00, + 0x3E, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00, + 0xF0, 0xF8, 0x00, 0x01, 0xE1, 0xF0, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x07, + 0x87, 0x80, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0x78, + 0x7C, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x01, 0xE1, 0xE0, 0x00, 0x07, 0x87, + 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x78, 0x3C, + 0x00, 0x01, 0xF0, 0x78, 0x00, 0x03, 0xC1, 0xF0, 0x00, 0x0F, 0x03, 0xE0, + 0x00, 0x3E, 0x07, 0x80, 0x01, 0xF8, 0x0F, 0x00, 0x0F, 0xE0, 0x1F, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, + 0x07, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0xFF, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xFF, + 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, + 0xFF, 0xC0, 0xFF, 0xFF, 0xFE, 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xFF, + 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, + 0xF0, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, + 0xFF, 0xFF, 0xC0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xC0, 0x00, 0xF8, 0x0F, + 0xC0, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x1F, 0x07, 0x80, 0x00, 0x07, 0x87, + 0xC0, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xFF, + 0xBC, 0x00, 0x0F, 0xFF, 0xDE, 0x00, 0x0F, 0xFF, 0xEF, 0x00, 0x07, 0xFF, + 0xF7, 0x80, 0x00, 0x00, 0x73, 0xC0, 0x00, 0x00, 0x39, 0xE0, 0x00, 0x00, + 0x3C, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x00, + 0x0F, 0x8F, 0x00, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x0F, 0xC3, 0xF0, 0x00, + 0x0F, 0xE0, 0xFC, 0x00, 0x1F, 0xF0, 0x7F, 0x80, 0x7F, 0x78, 0x1F, 0xFF, + 0xFE, 0x38, 0x03, 0xFF, 0xFE, 0x1C, 0x00, 0xFF, 0xFC, 0x0E, 0x00, 0x0F, + 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x03, 0xC0, + 0x78, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x01, 0xF0, 0x3E, 0x00, 0x00, 0xF0, + 0x1E, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x80, 0x00, 0x3E, + 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xC0, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x07, + 0x80, 0xF0, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x01, + 0xF0, 0x3C, 0x00, 0x00, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, + 0xFC, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x00, + 0x0F, 0x01, 0xE0, 0x00, 0x07, 0x81, 0xF0, 0x00, 0x07, 0xC0, 0xF8, 0x00, + 0x03, 0xE0, 0x78, 0x00, 0x01, 0xE0, 0x3C, 0x00, 0x00, 0xF0, 0x1E, 0x00, + 0x00, 0x78, 0x1F, 0x00, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x3C, 0x07, 0x80, + 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x0F, 0x81, 0xF0, + 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x03, 0xC0, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x81, 0xF0, 0x3E, 0x07, + 0x80, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1E, 0x03, 0xC0, 0x78, 0x1F, 0x03, + 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x81, + 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1E, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, + 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x0F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0xF0, + 0x01, 0xE0, 0x78, 0x00, 0xF0, 0x78, 0x00, 0xF8, 0x3C, 0x00, 0x78, 0x1E, + 0x00, 0x3C, 0x0F, 0x00, 0x3E, 0x07, 0xC0, 0x3E, 0x03, 0xF0, 0x7E, 0x00, + 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xC0, 0x78, 0x00, 0x07, 0xC0, 0x1E, 0x00, + 0x03, 0xE0, 0x0F, 0x80, 0x03, 0xF0, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0xF0, + 0x00, 0xFC, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x07, + 0xC0, 0x3F, 0x00, 0x01, 0xE0, 0x1F, 0x80, 0x00, 0x78, 0x0F, 0x80, 0x00, + 0x1E, 0x07, 0xC0, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x03, 0xE3, 0xF0, 0x00, + 0x00, 0xF1, 0xFC, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x0F, 0x7F, 0xE0, + 0x00, 0x07, 0xFE, 0xF8, 0x00, 0x01, 0xFE, 0x1E, 0x00, 0x00, 0x7F, 0x07, + 0xC0, 0x00, 0x1F, 0x80, 0xF0, 0x00, 0x0F, 0xC0, 0x3E, 0x00, 0x03, 0xE0, + 0x07, 0x80, 0x00, 0xF0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x0F, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x78, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x07, 0x80, 0x00, 0xF8, + 0x03, 0xE0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x00, + 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0xF8, + 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF0, 0x00, + 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x7C, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, + 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE0, + 0x01, 0xF8, 0x00, 0x00, 0x7E, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x0F, 0xF0, + 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x3F, 0xC0, 0x00, 0x1F, + 0xC0, 0x7F, 0x80, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0x00, 0xEF, 0x03, 0xFE, + 0x00, 0x03, 0xFE, 0x07, 0xBC, 0x00, 0x0F, 0x78, 0x0F, 0x3C, 0x00, 0x1E, + 0xF0, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0xF9, + 0xE0, 0x03, 0xCF, 0x81, 0xE3, 0xC0, 0x07, 0x9E, 0x03, 0xC7, 0x80, 0x1E, + 0x3C, 0x07, 0x8F, 0x00, 0x38, 0x78, 0x1F, 0x1E, 0x00, 0xF0, 0xF0, 0x3C, + 0x1E, 0x03, 0xC3, 0xE0, 0x78, 0x3C, 0x07, 0x87, 0x80, 0xF0, 0x78, 0x1E, + 0x0F, 0x01, 0xE0, 0xF0, 0x3C, 0x1E, 0x07, 0xC1, 0xE0, 0xF0, 0x7C, 0x0F, + 0x03, 0xC1, 0xE0, 0xF0, 0x1E, 0x07, 0x87, 0x81, 0xE0, 0x3C, 0x0F, 0x0E, + 0x03, 0xC0, 0x78, 0x0F, 0x3C, 0x07, 0x81, 0xF0, 0x1E, 0x70, 0x1F, 0x03, + 0xC0, 0x3D, 0xE0, 0x3C, 0x07, 0x80, 0x7F, 0x80, 0x78, 0x0F, 0x00, 0xFF, + 0x00, 0xF0, 0x3E, 0x01, 0xFC, 0x01, 0xE0, 0x78, 0x03, 0xF8, 0x07, 0xC0, + 0xF0, 0x07, 0xE0, 0x0F, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x01, 0xF0, + 0x00, 0x03, 0xC0, 0x7E, 0x00, 0x01, 0xF0, 0x3F, 0x80, 0x00, 0x78, 0x0F, + 0xE0, 0x00, 0x1E, 0x03, 0xFC, 0x00, 0x07, 0x80, 0xFF, 0x00, 0x03, 0xE0, + 0x3F, 0xE0, 0x00, 0xF0, 0x1F, 0xF8, 0x00, 0x3C, 0x07, 0x9E, 0x00, 0x0F, + 0x01, 0xE7, 0xC0, 0x03, 0xC0, 0x78, 0xF0, 0x01, 0xF0, 0x1E, 0x3E, 0x00, + 0x78, 0x0F, 0x87, 0x80, 0x1E, 0x03, 0xC1, 0xF0, 0x07, 0x80, 0xF0, 0x7C, + 0x01, 0xE0, 0x3C, 0x0F, 0x00, 0xF8, 0x1F, 0x03, 0xE0, 0x3C, 0x07, 0x80, + 0x78, 0x0F, 0x01, 0xE0, 0x1F, 0x03, 0xC0, 0x78, 0x07, 0xC1, 0xF0, 0x1E, + 0x00, 0xF8, 0x78, 0x0F, 0x80, 0x3E, 0x1E, 0x03, 0xC0, 0x07, 0x87, 0x80, + 0xF0, 0x01, 0xF1, 0xE0, 0x3C, 0x00, 0x3C, 0xF8, 0x0F, 0x00, 0x0F, 0xBC, + 0x07, 0xC0, 0x03, 0xEF, 0x01, 0xE0, 0x00, 0x7F, 0xC0, 0x78, 0x00, 0x1F, + 0xF0, 0x1E, 0x00, 0x03, 0xFC, 0x0F, 0x80, 0x00, 0xFE, 0x03, 0xC0, 0x00, + 0x1F, 0x80, 0xF0, 0x00, 0x07, 0xE0, 0x3C, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x00, + 0x0F, 0xFF, 0xFF, 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, + 0x0F, 0x80, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x0F, + 0x07, 0x80, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x00, + 0xF3, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x00, + 0x1E, 0xF0, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x00, + 0x00, 0xF7, 0x80, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, + 0x00, 0x3C, 0xF0, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x1E, 0x3E, 0x00, + 0x00, 0x1F, 0x0F, 0x00, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xF0, + 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x7F, 0x80, 0x1F, + 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, + 0x0F, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, 0x3F, 0x81, 0xE0, + 0x00, 0x7C, 0x0F, 0x00, 0x01, 0xE0, 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, + 0x78, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xE0, + 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0xF8, 0x3C, 0x00, 0x0F, 0x81, 0xE0, + 0x01, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, + 0x80, 0x3F, 0xFF, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFF, + 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, 0x0F, 0xC0, 0x00, + 0xFC, 0x0F, 0x80, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x0F, 0x07, 0x80, 0x00, + 0x07, 0xC7, 0xC0, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x00, 0xF3, 0xC0, 0x00, + 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x00, 0x1E, 0xF0, 0x00, + 0x00, 0x0F, 0x78, 0x00, 0x00, 0x07, 0xB8, 0x00, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x03, 0xDE, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x00, 0xF7, 0x80, + 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3C, 0xF0, + 0x00, 0x00, 0x3C, 0x78, 0x00, 0x08, 0x3E, 0x3E, 0x00, 0x0E, 0x1E, 0x0F, + 0x00, 0x0F, 0x9F, 0x07, 0xC0, 0x07, 0xFF, 0x03, 0xF0, 0x01, 0xFF, 0x00, + 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x7E, 0x00, 0x0F, 0xF0, 0x1F, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, + 0xC0, 0x07, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE, + 0x03, 0xE0, 0x00, 0xFC, 0x0F, 0x00, 0x01, 0xF0, 0x3C, 0x00, 0x03, 0xC1, + 0xF0, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0xF0, 0x78, + 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x00, 0x78, 0x3E, 0x00, + 0x03, 0xE0, 0xF0, 0x00, 0x1F, 0x03, 0xC0, 0x01, 0xF8, 0x0F, 0xFF, 0xFF, + 0xC0, 0x7F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xF0, + 0x1E, 0x00, 0x07, 0xE0, 0xF8, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x1E, 0x0F, + 0x00, 0x00, 0x78, 0x3C, 0x00, 0x01, 0xE0, 0xF0, 0x00, 0x07, 0x87, 0xC0, + 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x03, 0xC1, 0xE0, 0x00, + 0x0F, 0x07, 0x80, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x03, + 0xC3, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC, + 0x00, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x1F, 0xC0, 0x7F, 0x01, + 0xF0, 0x00, 0xFC, 0x0F, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x0F, 0x07, 0x00, + 0x00, 0x78, 0x78, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x1E, 0x1E, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x0F, + 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x01, 0xE7, + 0x80, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x71, 0xE0, 0x00, 0x07, 0x8F, 0x00, + 0x00, 0x3C, 0x7C, 0x00, 0x03, 0xC1, 0xF0, 0x00, 0x7C, 0x0F, 0xE0, 0x1F, + 0xC0, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xF8, 0x00, + 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x0F, 0x00, 0x00, 0x3C, 0x1E, + 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x03, 0xC1, 0xE0, + 0x00, 0x07, 0x83, 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x1F, 0x00, + 0x00, 0x7C, 0x3C, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x01, 0xE0, 0xF0, 0x00, + 0x03, 0xC3, 0xE0, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x1F, 0x0F, 0x00, 0x00, + 0x3C, 0x1E, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x03, + 0xE1, 0xF0, 0x00, 0x07, 0x83, 0xC0, 0x00, 0x0F, 0x07, 0x80, 0x00, 0x1E, + 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF8, 0x78, 0x00, 0x01, 0xE0, + 0xF0, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x0F, 0x83, 0xC0, 0x00, 0x1E, 0x07, + 0x80, 0x00, 0x7C, 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x07, 0xE0, 0x1F, + 0xC0, 0x7F, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, + 0xFF, 0xC0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x0F, 0xBE, 0x00, 0x00, 0x79, 0xF0, 0x00, 0x07, 0xC7, 0x80, 0x00, + 0x3C, 0x3C, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x01, 0xF0, + 0x7C, 0x00, 0x0F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x80, 0x78, + 0x00, 0x78, 0x03, 0xC0, 0x07, 0xC0, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x03, + 0xE0, 0x07, 0xC0, 0x1E, 0x00, 0x3E, 0x01, 0xF0, 0x01, 0xF0, 0x0F, 0x00, + 0x07, 0x80, 0xF0, 0x00, 0x3C, 0x07, 0x80, 0x01, 0xE0, 0x78, 0x00, 0x0F, + 0x07, 0xC0, 0x00, 0x7C, 0x3C, 0x00, 0x03, 0xE3, 0xE0, 0x00, 0x1F, 0x1E, + 0x00, 0x00, 0xF9, 0xF0, 0x00, 0x03, 0xCF, 0x00, 0x00, 0x1E, 0xF0, 0x00, + 0x00, 0xF7, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF0, + 0x00, 0x1F, 0x00, 0x03, 0xDE, 0x00, 0x07, 0xE0, 0x00, 0xFB, 0xC0, 0x00, + 0xFC, 0x00, 0x1E, 0x78, 0x00, 0x3F, 0x80, 0x07, 0xCF, 0x00, 0x07, 0xF0, + 0x00, 0xF9, 0xE0, 0x01, 0xFE, 0x00, 0x3E, 0x3C, 0x00, 0x7F, 0xC0, 0x07, + 0xC7, 0x80, 0x0F, 0x78, 0x01, 0xF0, 0xF0, 0x03, 0xEF, 0x00, 0x3E, 0x1E, + 0x00, 0x79, 0xE0, 0x0F, 0x83, 0xC0, 0x1F, 0x3C, 0x01, 0xF0, 0x78, 0x03, + 0xC7, 0x80, 0x3C, 0x0F, 0x00, 0xF8, 0xF0, 0x0F, 0x80, 0xE0, 0x1E, 0x1E, + 0x01, 0xE0, 0x1C, 0x07, 0xC1, 0xC0, 0x7C, 0x03, 0x80, 0xF0, 0x3C, 0x0F, + 0x00, 0x70, 0x3E, 0x07, 0x83, 0xE0, 0x0E, 0x07, 0x80, 0xF0, 0x78, 0x01, + 0xC1, 0xF0, 0x1E, 0x1F, 0x00, 0x3C, 0x3C, 0x03, 0xC3, 0xE0, 0x07, 0x8F, + 0x80, 0x78, 0x78, 0x00, 0xF1, 0xE0, 0x0F, 0x1F, 0x00, 0x1E, 0x7C, 0x01, + 0xE3, 0xC0, 0x03, 0xCF, 0x00, 0x3C, 0xF8, 0x00, 0x7B, 0xE0, 0x07, 0x9E, + 0x00, 0x0F, 0x78, 0x00, 0xF7, 0xC0, 0x01, 0xFF, 0x00, 0x1E, 0xF0, 0x00, + 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0x80, 0x00, 0xFE, + 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, + 0x00, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x07, 0xC0, 0x00, 0x3E, 0x00, + 0x7C, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x01, 0xF0, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x00, 0xF8, + 0x0F, 0x80, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x00, 0x7C, 0x1F, 0x00, 0x00, + 0x07, 0xC3, 0xE0, 0x00, 0x00, 0x7C, 0x7C, 0x00, 0x00, 0x03, 0xEF, 0x80, + 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x0F, 0xBE, 0x00, + 0x00, 0x01, 0xF3, 0xE0, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x03, 0xE1, + 0xF0, 0x00, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x01, + 0xF0, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x03, 0xE0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x03, 0xF0, 0x00, + 0x1F, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x0F, 0xC0, 0x00, 0x0F, 0x80, 0xF8, + 0x00, 0x00, 0x7D, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x1F, 0x1F, 0x80, + 0x00, 0xF8, 0x3E, 0x00, 0x03, 0xE0, 0xF8, 0x00, 0x1F, 0x01, 0xF0, 0x00, + 0xF8, 0x07, 0xC0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x3E, 0x01, 0xF0, + 0x00, 0xF8, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, + 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x7C, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x01, + 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x7F, + 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xC0, 0x1F, + 0xF0, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, + 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0x7F, 0xC0, 0x3F, 0xE0, 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0xE3, + 0x8E, 0x38, 0xE1, 0x86, 0x18, 0x61, 0x87, 0x1C, 0x71, 0xC7, 0x0C, 0x30, + 0xC3, 0x0C, 0x38, 0xE3, 0x8E, 0x38, 0x61, 0x86, 0x18, 0x61, 0xC7, 0x1C, + 0x71, 0xC0, 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x07, 0xFC, 0x03, 0xFE, 0x00, + 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, + 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, + 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, + 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x03, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x7F, 0x80, 0x3F, 0xE0, + 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x1F, 0x00, + 0x1F, 0xC0, 0x0E, 0xE0, 0x0E, 0x70, 0x0F, 0x38, 0x07, 0x1C, 0x07, 0x0E, + 0x03, 0x83, 0x83, 0x81, 0xC3, 0xC0, 0xE1, 0xC0, 0x71, 0xC0, 0x39, 0xE0, + 0x0E, 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x01, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x78, 0x3C, 0x1C, 0x0E, 0x0E, 0x07, 0x00, + 0x1F, 0xE0, 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x7E, + 0x07, 0xE1, 0xF0, 0x07, 0xC3, 0xC0, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xE0, 0x0F, 0xFF, + 0xC0, 0xFF, 0xFF, 0x07, 0xFF, 0x9E, 0x1F, 0xC0, 0x3C, 0x7C, 0x00, 0x78, + 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xC7, 0x80, 0x07, 0x8F, 0x00, 0x1F, 0x1E, + 0x00, 0x7E, 0x3F, 0x07, 0xFC, 0x3F, 0xFF, 0x7E, 0x7F, 0xFC, 0xFC, 0x7F, + 0xF0, 0xF8, 0x3F, 0x00, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x83, 0xE0, 0x03, 0xC7, 0xFC, + 0x01, 0xEF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xF7, 0x83, 0xF0, 0x7F, 0x00, + 0xF8, 0x3F, 0x00, 0x3E, 0x1F, 0x00, 0x0F, 0x1F, 0x80, 0x07, 0x8F, 0x80, + 0x03, 0xC7, 0x80, 0x01, 0xE3, 0xC0, 0x00, 0xF1, 0xE0, 0x00, 0x79, 0xF0, + 0x00, 0x3C, 0xF0, 0x00, 0x3C, 0x78, 0x00, 0x1E, 0x3C, 0x00, 0x0F, 0x1E, + 0x00, 0x0F, 0x9F, 0x00, 0x07, 0x8F, 0xC0, 0x07, 0xC7, 0xE0, 0x07, 0xC3, + 0xF8, 0x07, 0xC1, 0xFE, 0x0F, 0xC1, 0xEF, 0xFF, 0xE0, 0xF3, 0xFF, 0xC0, + 0x78, 0xFF, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xFF, + 0x80, 0x3F, 0xFF, 0x01, 0xFF, 0xFE, 0x0F, 0xE0, 0xF8, 0x7E, 0x01, 0xF1, + 0xF0, 0x03, 0xCF, 0x80, 0x0F, 0x3C, 0x00, 0x3D, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x0F, 0x3C, + 0x00, 0x3C, 0xF8, 0x01, 0xE1, 0xF0, 0x0F, 0x87, 0xE0, 0xFC, 0x0F, 0xFF, + 0xE0, 0x3F, 0xFF, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x3C, 0x00, 0x3F, 0x07, 0x80, 0x1F, 0xF8, 0xF0, 0x0F, 0xFF, 0x3E, 0x03, + 0xFF, 0xF7, 0x80, 0xFC, 0x1F, 0xF0, 0x3F, 0x00, 0xFE, 0x07, 0xC0, 0x0F, + 0xC1, 0xF0, 0x01, 0xF0, 0x3C, 0x00, 0x3E, 0x0F, 0x80, 0x07, 0xC1, 0xE0, + 0x00, 0x78, 0x3C, 0x00, 0x1F, 0x0F, 0x80, 0x03, 0xC1, 0xE0, 0x00, 0x78, + 0x3C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xE0, 0xF0, 0x00, 0x7C, 0x1E, 0x00, + 0x0F, 0x03, 0xC0, 0x03, 0xE0, 0x78, 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x80, + 0xF8, 0x07, 0xF0, 0x1F, 0x83, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFE, + 0xF0, 0x03, 0xFF, 0x1E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x80, + 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0xFE, 0x0F, 0xC1, + 0xF0, 0x07, 0xC7, 0xC0, 0x0F, 0x8F, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, + 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBF, 0xFF, 0xFF, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0x80, 0x03, 0xCF, 0x80, 0x0F, 0x0F, 0x80, 0x3E, + 0x1F, 0x81, 0xF8, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0x1F, 0xFC, 0x00, + 0x0F, 0xE0, 0x00, 0x00, 0x3E, 0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xE0, 0x3E, + 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x7F, 0xF0, 0xFF, 0xE3, + 0xFF, 0xC0, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x3E, + 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x80, 0x1E, 0x00, + 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, + 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x07, + 0xFE, 0x3C, 0x01, 0xFF, 0xE7, 0x00, 0xFF, 0xFE, 0xE0, 0x1F, 0x83, 0xFC, + 0x07, 0xC0, 0x3F, 0x81, 0xF0, 0x03, 0xF0, 0x3C, 0x00, 0x7C, 0x0F, 0x00, + 0x0F, 0x81, 0xE0, 0x01, 0xF0, 0x78, 0x00, 0x3E, 0x0F, 0x00, 0x07, 0xC1, + 0xE0, 0x00, 0xF0, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xE0, 0x00, + 0xF8, 0x3C, 0x00, 0x1F, 0x07, 0x80, 0x03, 0xC0, 0xF0, 0x00, 0xF8, 0x1E, + 0x00, 0x3F, 0x03, 0xE0, 0x07, 0xE0, 0x3E, 0x01, 0xF8, 0x07, 0xE0, 0xFF, + 0x00, 0x7F, 0xFD, 0xE0, 0x0F, 0xFF, 0x3C, 0x00, 0xFF, 0xCF, 0x00, 0x07, + 0xE1, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x01, 0xE0, 0x03, 0xE0, + 0x3C, 0x00, 0xF8, 0x07, 0xE0, 0x7F, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF, + 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x78, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x83, 0xF0, 0x0F, + 0x1F, 0xF0, 0x1E, 0xFF, 0xF0, 0x3F, 0xFF, 0xE0, 0xFF, 0x87, 0xE1, 0xFC, + 0x07, 0xC3, 0xF0, 0x07, 0x87, 0xC0, 0x0F, 0x1F, 0x00, 0x1E, 0x3E, 0x00, + 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0xC7, 0xC0, 0x07, + 0x8F, 0x00, 0x0F, 0x1E, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0x78, 0x00, 0xF1, + 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x0F, 0x8F, 0x00, 0x1E, 0x1E, + 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x01, + 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xC0, + 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, + 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x00, 0x00, 0x07, + 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, + 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, + 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, + 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, + 0x78, 0x00, 0x3E, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x0F, 0xE0, 0x03, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x0F, 0x81, 0xE0, 0x0F, 0x80, + 0xF0, 0x0F, 0x80, 0xF0, 0x1F, 0x00, 0x78, 0x1F, 0x00, 0x3C, 0x1F, 0x00, + 0x1E, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x0F, 0x1E, 0x00, 0x07, 0xBF, 0x80, + 0x03, 0xFF, 0xC0, 0x01, 0xFD, 0xE0, 0x01, 0xFC, 0xF8, 0x00, 0xFC, 0x3C, + 0x00, 0x7C, 0x1F, 0x00, 0x3C, 0x07, 0x80, 0x1E, 0x03, 0xC0, 0x1F, 0x01, + 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x3E, 0x03, 0xC0, 0x0F, 0x01, 0xE0, + 0x07, 0x81, 0xE0, 0x03, 0xE0, 0xF0, 0x00, 0xF0, 0x78, 0x00, 0x7C, 0x00, + 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x3C, 0x07, + 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, + 0xF0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x00, 0x00, + 0x07, 0xE0, 0x1F, 0x80, 0xF9, 0xFF, 0x07, 0xFC, 0x0F, 0x3F, 0xF8, 0xFF, + 0xE0, 0xF7, 0xFF, 0x9F, 0xFF, 0x0F, 0xF0, 0xFF, 0xC3, 0xF0, 0xFC, 0x07, + 0xF8, 0x1F, 0x1F, 0x80, 0x3F, 0x00, 0xF1, 0xF0, 0x03, 0xE0, 0x0F, 0x1E, + 0x00, 0x3C, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x0F, 0x1E, 0x00, 0x3C, 0x00, + 0xF1, 0xE0, 0x07, 0x80, 0x0F, 0x3C, 0x00, 0x78, 0x01, 0xF3, 0xC0, 0x07, + 0x80, 0x1E, 0x3C, 0x00, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x80, 0x1E, 0x3C, + 0x00, 0xF0, 0x01, 0xE7, 0xC0, 0x0F, 0x00, 0x3C, 0x78, 0x00, 0xF0, 0x03, + 0xC7, 0x80, 0x0F, 0x00, 0x3C, 0x78, 0x01, 0xE0, 0x03, 0xC7, 0x80, 0x1E, + 0x00, 0x3C, 0xF8, 0x01, 0xE0, 0x07, 0x8F, 0x00, 0x1E, 0x00, 0x78, 0xF0, + 0x01, 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x07, 0xE0, 0x1F, + 0x3F, 0xF0, 0x3C, 0xFF, 0xF0, 0x7B, 0xFF, 0xE0, 0xFF, 0x07, 0xE1, 0xF8, + 0x07, 0xC7, 0xE0, 0x07, 0x8F, 0x80, 0x0F, 0x1F, 0x00, 0x1E, 0x3C, 0x00, + 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x07, + 0x8F, 0x00, 0x0F, 0x1E, 0x00, 0x3E, 0x3C, 0x00, 0x78, 0xF0, 0x00, 0xF1, + 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x0F, 0x8F, 0x00, 0x1E, 0x3E, + 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x00, + 0x1F, 0x80, 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0xFE, + 0x0F, 0xC1, 0xF0, 0x0F, 0x87, 0xC0, 0x0F, 0x8F, 0x00, 0x0F, 0x3C, 0x00, + 0x1E, 0x78, 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xC0, 0x00, 0xF7, 0x80, 0x01, + 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x78, 0x00, 0x1E, 0xF0, 0x00, 0x3D, + 0xE0, 0x00, 0xF3, 0xC0, 0x01, 0xE7, 0x80, 0x07, 0x8F, 0x80, 0x1F, 0x0F, + 0x80, 0x7C, 0x1F, 0x83, 0xF8, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F, + 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x3C, 0x7F, 0xE0, + 0x07, 0xBF, 0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0x3D, 0xE0, 0xFC, 0x07, 0xF0, + 0x0F, 0x80, 0xFC, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x07, 0xC0, 0x01, 0xE0, + 0xF8, 0x00, 0x3C, 0x1F, 0x00, 0x07, 0x83, 0xC0, 0x00, 0xF0, 0x78, 0x00, + 0x1E, 0x1F, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0xF0, 0x78, 0x00, 0x1E, 0x0F, + 0x00, 0x03, 0xC3, 0xE0, 0x00, 0xF8, 0x7C, 0x00, 0x1E, 0x0F, 0x80, 0x07, + 0xC1, 0xF8, 0x01, 0xF0, 0x3F, 0x80, 0x7C, 0x0F, 0xF8, 0x3F, 0x81, 0xEF, + 0xFF, 0xE0, 0x3C, 0xFF, 0xF8, 0x07, 0x8F, 0xFC, 0x00, 0xF0, 0xFE, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x3F, + 0xF8, 0xF0, 0x1F, 0xFF, 0x3C, 0x0F, 0xFF, 0xDF, 0x07, 0xE0, 0xFF, 0x83, + 0xE0, 0x1F, 0xE1, 0xF0, 0x03, 0xF8, 0x78, 0x00, 0xFE, 0x3C, 0x00, 0x1F, + 0x8F, 0x00, 0x07, 0xC7, 0x80, 0x01, 0xF1, 0xE0, 0x00, 0x7C, 0x78, 0x00, + 0x1F, 0x3C, 0x00, 0x0F, 0x8F, 0x00, 0x03, 0xE3, 0xC0, 0x00, 0xF8, 0xF0, + 0x00, 0x3E, 0x3C, 0x00, 0x1F, 0x8F, 0x00, 0x0F, 0xC3, 0xC0, 0x03, 0xF0, + 0xF8, 0x01, 0xFC, 0x1F, 0x00, 0xFF, 0x07, 0xE0, 0xFF, 0xC0, 0xFF, 0xFD, + 0xE0, 0x1F, 0xFE, 0x78, 0x03, 0xFF, 0x3E, 0x00, 0x3F, 0x0F, 0x80, 0x00, + 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x87, 0xCF, 0xC3, 0xCF, 0xE1, 0xEF, + 0xE0, 0xFF, 0x80, 0x7F, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, + 0x00, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, + 0x03, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x3F, 0x80, 0x07, 0xFF, 0x00, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0xFC, + 0x1F, 0x87, 0x80, 0x3C, 0x7C, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x00, + 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, + 0xC0, 0x07, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xBC, + 0x00, 0x3D, 0xE0, 0x01, 0xEF, 0x00, 0x1F, 0x7C, 0x01, 0xF3, 0xF0, 0x1F, + 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x03, + 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC1, 0xFF, 0xEF, 0xFF, + 0x7F, 0xF0, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0xF0, 0x7F, 0x81, + 0xF8, 0x07, 0xC0, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x1E, 0x0F, 0x00, 0x1E, + 0x1F, 0x00, 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x3C, + 0x1E, 0x00, 0x3C, 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x3C, 0x00, 0x3C, + 0x3C, 0x00, 0x7C, 0x3C, 0x00, 0x78, 0x78, 0x00, 0x78, 0x78, 0x00, 0x78, + 0x78, 0x00, 0x78, 0x78, 0x00, 0xF8, 0x78, 0x00, 0xF0, 0xF0, 0x01, 0xF0, + 0xF0, 0x03, 0xF0, 0xF0, 0x07, 0xF0, 0xF8, 0x1F, 0xF0, 0xFF, 0xFF, 0xE0, + 0x7F, 0xFD, 0xE0, 0x3F, 0xF1, 0xE0, 0x1F, 0xC0, 0x00, 0xF0, 0x00, 0x7F, + 0xC0, 0x01, 0xEF, 0x00, 0x0F, 0xBC, 0x00, 0x3C, 0x78, 0x01, 0xE1, 0xE0, + 0x07, 0x87, 0x80, 0x3C, 0x1E, 0x01, 0xF0, 0x78, 0x07, 0x81, 0xE0, 0x3E, + 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x80, 0x38, 0x1E, 0x00, 0xF0, 0xF0, 0x03, + 0xC7, 0xC0, 0x0F, 0x1E, 0x00, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xDE, + 0x00, 0x07, 0x78, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x07, 0xC0, 0x0F, 0x78, 0x03, + 0xE0, 0x0F, 0xBC, 0x03, 0xF0, 0x07, 0x9E, 0x01, 0xF8, 0x03, 0xCF, 0x00, + 0xFC, 0x03, 0xC7, 0x80, 0xFE, 0x01, 0xE3, 0xC0, 0x77, 0x01, 0xE0, 0xE0, + 0x7B, 0x80, 0xF0, 0x70, 0x39, 0xC0, 0xF0, 0x38, 0x3C, 0xE0, 0x78, 0x1C, + 0x1E, 0x78, 0x78, 0x0F, 0x1E, 0x3C, 0x3C, 0x07, 0x8F, 0x1E, 0x3C, 0x03, + 0xC7, 0x0F, 0x1E, 0x01, 0xE7, 0x87, 0x9E, 0x00, 0xF3, 0x81, 0xCF, 0x00, + 0x7B, 0xC0, 0xEF, 0x00, 0x3D, 0xC0, 0x77, 0x80, 0x1F, 0xE0, 0x3F, 0x80, + 0x0F, 0xF0, 0x1F, 0xC0, 0x07, 0xF0, 0x0F, 0xC0, 0x01, 0xF8, 0x07, 0xE0, + 0x00, 0xF8, 0x03, 0xE0, 0x00, 0x7C, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0xF0, + 0x00, 0x00, 0x03, 0xC0, 0x07, 0xC0, 0xF8, 0x01, 0xE0, 0x1E, 0x00, 0xF0, + 0x07, 0x80, 0x78, 0x00, 0xF0, 0x3C, 0x00, 0x3C, 0x1F, 0x00, 0x0F, 0x8F, + 0x80, 0x01, 0xE7, 0xC0, 0x00, 0x7D, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xC0, 0x00, + 0x07, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xF7, 0x80, 0x00, 0xF9, 0xF0, + 0x00, 0x3C, 0x3C, 0x00, 0x1E, 0x0F, 0x80, 0x0F, 0x01, 0xE0, 0x07, 0x80, + 0x7C, 0x03, 0xE0, 0x0F, 0x01, 0xF0, 0x03, 0xE0, 0xF8, 0x00, 0x78, 0x00, + 0x03, 0xC0, 0x01, 0xE0, 0x78, 0x00, 0x78, 0x0F, 0x00, 0x0F, 0x01, 0xE0, + 0x03, 0xC0, 0x3C, 0x00, 0x78, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x07, 0xC0, + 0x0F, 0x00, 0xF0, 0x01, 0xE0, 0x3C, 0x00, 0x3C, 0x07, 0x80, 0x07, 0x81, + 0xE0, 0x00, 0xF0, 0x3C, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xC0, 0x00, + 0x3C, 0x78, 0x00, 0x07, 0x9E, 0x00, 0x00, 0xF3, 0xC0, 0x00, 0x1E, 0xF0, + 0x00, 0x03, 0xDE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x01, + 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xE0, + 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, + 0x00, 0x01, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, + 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, + 0x00, 0x03, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x7E, 0x00, 0xFE, + 0x00, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, + 0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x00, + 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, + 0x38, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x00, 0x78, 0x00, + 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x60, 0x06, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x00, + 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0x80, 0x38, 0x03, + 0x80, 0x38, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, + 0x00, 0xE0, 0x06, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x0F, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x1C, + 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, + 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0, + 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xE0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, + 0x0F, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x01, 0xFE, + 0x00, 0xCF, 0xFC, 0x0E, 0xE3, 0xF0, 0xE6, 0x07, 0xFF, 0x60, 0x0F, 0xF0, + 0x00, 0x1E, 0x00}; + +const GFXglyph FreeSansOblique24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 13, 0, 1}, // 0x20 ' ' + {0, 11, 34, 13, 6, -33}, // 0x21 '!' + {47, 13, 12, 17, 8, -32}, // 0x22 '"' + {67, 28, 34, 26, 3, -32}, // 0x23 '#' + {186, 26, 42, 26, 3, -35}, // 0x24 '$' + {323, 36, 34, 42, 6, -32}, // 0x25 '%' + {476, 26, 34, 31, 4, -32}, // 0x26 '&' + {587, 5, 12, 9, 8, -32}, // 0x27 ''' + {595, 15, 44, 16, 5, -33}, // 0x28 '(' + {678, 15, 44, 16, 1, -33}, // 0x29 ')' + {761, 14, 13, 18, 8, -33}, // 0x2A '*' + {784, 23, 22, 27, 5, -20}, // 0x2B '+' + {848, 7, 12, 13, 3, -4}, // 0x2C ',' + {859, 12, 4, 16, 5, -14}, // 0x2D '-' + {865, 6, 5, 13, 4, -4}, // 0x2E '.' + {869, 21, 35, 13, -1, -33}, // 0x2F '/' + {961, 23, 34, 26, 5, -32}, // 0x30 '0' + {1059, 13, 33, 26, 10, -32}, // 0x31 '1' + {1113, 27, 33, 26, 2, -32}, // 0x32 '2' + {1225, 25, 34, 26, 3, -32}, // 0x33 '3' + {1332, 24, 33, 26, 3, -32}, // 0x34 '4' + {1431, 27, 34, 26, 3, -32}, // 0x35 '5' + {1546, 24, 34, 26, 4, -32}, // 0x36 '6' + {1648, 26, 33, 26, 6, -32}, // 0x37 '7' + {1756, 25, 34, 26, 3, -32}, // 0x38 '8' + {1863, 24, 34, 26, 4, -32}, // 0x39 '9' + {1965, 10, 25, 13, 5, -24}, // 0x3A ':' + {1997, 11, 32, 13, 4, -24}, // 0x3B ';' + {2041, 26, 23, 27, 4, -22}, // 0x3C '<' + {2116, 26, 12, 27, 3, -16}, // 0x3D '=' + {2155, 26, 23, 27, 2, -21}, // 0x3E '>' + {2230, 20, 35, 26, 9, -34}, // 0x3F '?' + {2318, 45, 42, 48, 4, -34}, // 0x40 '@' + {2555, 30, 34, 31, 1, -33}, // 0x41 'A' + {2683, 29, 34, 31, 4, -33}, // 0x42 'B' + {2807, 30, 36, 33, 5, -34}, // 0x43 'C' + {2942, 31, 34, 33, 4, -33}, // 0x44 'D' + {3074, 31, 34, 31, 4, -33}, // 0x45 'E' + {3206, 30, 34, 28, 4, -33}, // 0x46 'F' + {3334, 33, 36, 37, 5, -34}, // 0x47 'G' + {3483, 33, 34, 34, 4, -33}, // 0x48 'H' + {3624, 11, 34, 13, 5, -33}, // 0x49 'I' + {3671, 25, 35, 24, 2, -33}, // 0x4A 'J' + {3781, 34, 34, 31, 4, -33}, // 0x4B 'K' + {3926, 22, 34, 26, 4, -33}, // 0x4C 'L' + {4020, 39, 34, 40, 4, -33}, // 0x4D 'M' + {4186, 34, 34, 34, 4, -33}, // 0x4E 'N' + {4331, 33, 36, 36, 5, -34}, // 0x4F 'O' + {4480, 29, 34, 30, 4, -33}, // 0x50 'P' + {4604, 33, 38, 36, 5, -34}, // 0x51 'Q' + {4761, 30, 34, 33, 4, -33}, // 0x52 'R' + {4889, 29, 36, 31, 4, -34}, // 0x53 'S' + {5020, 28, 34, 29, 7, -33}, // 0x54 'T' + {5139, 31, 35, 34, 6, -33}, // 0x55 'U' + {5275, 29, 34, 30, 8, -33}, // 0x56 'V' + {5399, 43, 34, 44, 8, -33}, // 0x57 'W' + {5582, 36, 34, 31, 1, -33}, // 0x58 'X' + {5735, 30, 34, 32, 8, -33}, // 0x59 'Y' + {5863, 34, 34, 29, 1, -33}, // 0x5A 'Z' + {6008, 18, 44, 13, 1, -33}, // 0x5B '[' + {6107, 6, 35, 13, 7, -33}, // 0x5C '\' + {6134, 18, 44, 13, -1, -33}, // 0x5D ']' + {6233, 17, 18, 22, 6, -32}, // 0x5E '^' + {6272, 29, 2, 26, -3, 7}, // 0x5F '_' + {6280, 8, 7, 16, 8, -34}, // 0x60 '`' + {6287, 23, 27, 26, 3, -25}, // 0x61 'a' + {6365, 25, 35, 26, 3, -33}, // 0x62 'b' + {6475, 22, 27, 24, 4, -25}, // 0x63 'c' + {6550, 27, 35, 26, 4, -33}, // 0x64 'd' + {6669, 23, 27, 26, 4, -25}, // 0x65 'e' + {6747, 15, 34, 12, 3, -33}, // 0x66 'f' + {6811, 27, 36, 26, 2, -25}, // 0x67 'g' + {6933, 23, 34, 25, 3, -33}, // 0x68 'h' + {7031, 11, 34, 10, 3, -33}, // 0x69 'i' + {7078, 18, 44, 11, -2, -33}, // 0x6A 'j' + {7177, 25, 34, 24, 3, -33}, // 0x6B 'k' + {7284, 11, 34, 10, 3, -33}, // 0x6C 'l' + {7331, 36, 26, 38, 3, -25}, // 0x6D 'm' + {7448, 23, 26, 25, 3, -25}, // 0x6E 'n' + {7523, 23, 27, 26, 4, -25}, // 0x6F 'o' + {7601, 27, 36, 26, 1, -25}, // 0x70 'p' + {7723, 26, 36, 26, 3, -25}, // 0x71 'q' + {7840, 17, 26, 15, 3, -25}, // 0x72 'r' + {7896, 21, 27, 24, 3, -25}, // 0x73 's' + {7967, 13, 32, 12, 4, -30}, // 0x74 't' + {8019, 24, 26, 25, 4, -24}, // 0x75 'u' + {8097, 22, 25, 23, 6, -24}, // 0x76 'v' + {8166, 33, 25, 34, 6, -24}, // 0x77 'w' + {8270, 26, 25, 23, 1, -24}, // 0x78 'x' + {8352, 27, 35, 23, 0, -24}, // 0x79 'y' + {8471, 25, 25, 23, 1, -24}, // 0x7A 'z' + {8550, 16, 44, 16, 5, -33}, // 0x7B '{' + {8638, 12, 44, 12, 3, -33}, // 0x7C '|' + {8704, 16, 44, 16, -1, -33}, // 0x7D '}' + {8792, 21, 7, 27, 6, -19}}; // 0x7E '~' + +const GFXfont FreeSansOblique24pt7b PROGMEM = { + (uint8_t *)FreeSansOblique24pt7bBitmaps, + (GFXglyph *)FreeSansOblique24pt7bGlyphs, 0x20, 0x7E, 56}; + +// Approx. 9483 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h new file mode 100644 index 0000000..0b5db81 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h @@ -0,0 +1,222 @@ +#pragma once +#include + +const uint8_t FreeSansOblique9pt7bBitmaps[] PROGMEM = { + 0x10, 0x84, 0x22, 0x10, 0x84, 0x42, 0x10, 0x08, 0x00, 0xDE, 0xE5, 0x20, + 0x06, 0x40, 0x88, 0x13, 0x06, 0x43, 0xFE, 0x32, 0x04, 0x40, 0x98, 0x32, + 0x1F, 0xF0, 0x98, 0x22, 0x04, 0xC0, 0x02, 0x01, 0xF8, 0x6B, 0x99, 0x33, + 0x40, 0x68, 0x0F, 0x00, 0xF8, 0x07, 0xC1, 0x1B, 0x23, 0x64, 0x4E, 0x98, + 0xFC, 0x04, 0x00, 0x80, 0x3C, 0x08, 0xCC, 0x23, 0x18, 0x86, 0x32, 0x0C, + 0x64, 0x19, 0x90, 0x1E, 0x40, 0x01, 0x1E, 0x02, 0x66, 0x09, 0x8C, 0x23, + 0x18, 0x86, 0x62, 0x07, 0x80, 0x0F, 0x06, 0x63, 0x18, 0xC6, 0x3F, 0x07, + 0x03, 0xC1, 0xB3, 0xC7, 0xB0, 0xCC, 0x33, 0x3E, 0x79, 0x80, 0xFA, 0x04, + 0x10, 0x60, 0x83, 0x04, 0x18, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x10, + 0x30, 0x20, 0x08, 0x18, 0x10, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x18, 0x30, + 0x41, 0x82, 0x0C, 0x10, 0x40, 0x19, 0x73, 0x16, 0x48, 0x04, 0x04, 0x02, + 0x1F, 0xF0, 0x80, 0x80, 0x40, 0x20, 0x6D, 0x28, 0xF0, 0xC0, 0x01, 0x02, + 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x0F, + 0x19, 0xC8, 0x6C, 0x36, 0x1A, 0x0F, 0x05, 0x86, 0xC3, 0x61, 0xB1, 0x9C, + 0x87, 0x80, 0x08, 0xCD, 0xE3, 0x18, 0xC4, 0x23, 0x18, 0xC4, 0x00, 0x07, + 0x83, 0x1C, 0x41, 0x98, 0x30, 0x06, 0x01, 0x80, 0x60, 0x38, 0x1C, 0x06, + 0x01, 0x80, 0x20, 0x0F, 0xF8, 0x0F, 0x86, 0x73, 0x0C, 0x83, 0x00, 0xC0, + 0x60, 0xE0, 0x06, 0x01, 0xB0, 0x6C, 0x13, 0x8C, 0x7C, 0x00, 0x00, 0x80, + 0xC0, 0xE0, 0xA0, 0x90, 0x98, 0x8C, 0x86, 0xFF, 0x81, 0x01, 0x80, 0xC0, + 0x60, 0x0F, 0xC3, 0x00, 0x40, 0x08, 0x03, 0x00, 0x7F, 0x1C, 0x70, 0x06, + 0x00, 0xC0, 0x1B, 0x06, 0x71, 0x87, 0xE0, 0x0F, 0x86, 0x73, 0x0D, 0x80, + 0x60, 0x1F, 0xCF, 0x3B, 0x86, 0xC1, 0xB0, 0x6C, 0x33, 0x98, 0x3C, 0x00, + 0x7F, 0xC0, 0x20, 0x10, 0x0C, 0x06, 0x01, 0x00, 0x80, 0x60, 0x10, 0x0C, + 0x02, 0x01, 0x80, 0x40, 0x00, 0x0F, 0x86, 0x73, 0x0C, 0xC3, 0x30, 0xCC, + 0x61, 0xE1, 0x86, 0x41, 0xB0, 0x6C, 0x13, 0x8C, 0x3E, 0x00, 0x0F, 0x06, + 0x73, 0x0D, 0x83, 0x60, 0xD8, 0x77, 0x3C, 0xFE, 0x01, 0x80, 0x6C, 0x33, + 0x98, 0x7C, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x00, + 0x0C, 0x62, 0x11, 0x00, 0x00, 0x01, 0xC3, 0x8F, 0x0C, 0x07, 0x00, 0xE0, + 0x1E, 0x01, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x40, 0x3C, 0x03, 0x80, + 0x70, 0x18, 0x78, 0xE1, 0xC0, 0x00, 0x00, 0x1F, 0x30, 0xD0, 0x78, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFE, + 0x00, 0xC0, 0xE0, 0xC0, 0x18, 0x61, 0xD3, 0x31, 0x9C, 0xD8, 0xC2, 0x36, + 0x31, 0x8F, 0x18, 0x67, 0xC6, 0x11, 0xB1, 0x8C, 0xCC, 0x67, 0x63, 0x0E, + 0xF0, 0x60, 0x00, 0x1C, 0x00, 0x01, 0x81, 0x00, 0x1F, 0xC0, 0x01, 0xC0, + 0x1C, 0x03, 0xC0, 0x24, 0x06, 0x60, 0x46, 0x0C, 0x61, 0x86, 0x1F, 0xE3, + 0x06, 0x20, 0x26, 0x03, 0x40, 0x30, 0x1F, 0xE1, 0x87, 0x30, 0x33, 0x03, + 0x30, 0x23, 0x06, 0x3F, 0xC6, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x0C, + 0x7F, 0x80, 0x07, 0xC1, 0x86, 0x30, 0x32, 0x03, 0x60, 0x04, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x6C, 0x06, 0xC0, 0xC6, 0x18, 0x3E, 0x00, 0x1F, 0xE0, + 0xC1, 0x84, 0x06, 0x60, 0x33, 0x01, 0x98, 0x0C, 0x80, 0x64, 0x02, 0x60, + 0x33, 0x01, 0x98, 0x18, 0x81, 0x87, 0xF0, 0x00, 0x1F, 0xF1, 0x80, 0x10, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x3F, 0xE2, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x04, 0x00, 0x7F, 0xC0, 0x1F, 0xF1, 0x80, 0x10, 0x03, 0x00, 0x30, 0x03, + 0x00, 0x3F, 0xC2, 0x00, 0x60, 0x06, 0x00, 0x60, 0x04, 0x00, 0x40, 0x00, + 0x07, 0xE0, 0xE1, 0x8C, 0x06, 0xC0, 0x36, 0x00, 0x60, 0x03, 0x07, 0xF8, + 0x02, 0xC0, 0x36, 0x01, 0x98, 0x1C, 0xE1, 0xC1, 0xF2, 0x00, 0x18, 0x08, + 0xC0, 0xC4, 0x06, 0x60, 0x33, 0x01, 0x18, 0x18, 0xFF, 0xC4, 0x06, 0x60, + 0x23, 0x01, 0x18, 0x18, 0x80, 0xC4, 0x06, 0x00, 0x33, 0x32, 0x26, 0x66, + 0x44, 0xCC, 0xC0, 0x00, 0xC0, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x30, + 0x0C, 0x03, 0x30, 0xCC, 0x63, 0x18, 0x7C, 0x00, 0x18, 0x18, 0x60, 0xC1, + 0x0E, 0x0C, 0x60, 0x33, 0x00, 0xD8, 0x03, 0xF0, 0x0C, 0xC0, 0x61, 0x81, + 0x86, 0x06, 0x0C, 0x10, 0x30, 0x40, 0x60, 0x18, 0x0C, 0x04, 0x06, 0x03, + 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x18, 0x08, 0x07, 0xF8, 0x18, 0x06, + 0x18, 0x0E, 0x18, 0x0E, 0x34, 0x1E, 0x34, 0x36, 0x34, 0x34, 0x24, 0x64, + 0x24, 0x6C, 0x64, 0xCC, 0x64, 0x8C, 0x65, 0x88, 0x43, 0x08, 0x43, 0x18, + 0x18, 0x08, 0xE0, 0x47, 0x06, 0x6C, 0x33, 0x61, 0x99, 0x08, 0x8C, 0xC4, + 0x66, 0x61, 0xB3, 0x0D, 0x18, 0x38, 0x81, 0xC4, 0x06, 0x00, 0x07, 0xC0, + 0xC3, 0x8C, 0x0E, 0xC0, 0x36, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x36, 0x01, 0xB8, 0x18, 0xE1, 0x81, 0xF0, 0x00, 0x1F, 0xE1, 0x83, 0x10, + 0x33, 0x03, 0x30, 0x33, 0x06, 0x3F, 0xC2, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x04, 0x00, 0x40, 0x00, 0x07, 0xC0, 0xC3, 0x8C, 0x0E, 0xC0, 0x36, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x36, 0x09, 0xB8, 0x78, 0xE3, 0x81, + 0xF6, 0x00, 0x10, 0x1F, 0xF0, 0xC0, 0xC4, 0x06, 0x60, 0x33, 0x01, 0x18, + 0x18, 0xFF, 0x04, 0x0C, 0x60, 0x63, 0x03, 0x18, 0x18, 0x80, 0xC4, 0x06, + 0x00, 0x07, 0xC1, 0x87, 0x30, 0x33, 0x03, 0x30, 0x03, 0xC0, 0x0F, 0xC0, + 0x1E, 0x00, 0x6C, 0x06, 0xC0, 0x46, 0x0C, 0x3F, 0x00, 0xFF, 0xC3, 0x00, + 0xC0, 0x20, 0x18, 0x06, 0x01, 0x80, 0x60, 0x10, 0x0C, 0x03, 0x00, 0xC0, + 0x20, 0x00, 0x30, 0x13, 0x03, 0x20, 0x36, 0x03, 0x60, 0x26, 0x06, 0x60, + 0x64, 0x06, 0xC0, 0x6C, 0x04, 0xC0, 0xCE, 0x18, 0x3E, 0x00, 0xC0, 0x78, + 0x0B, 0x03, 0x20, 0xC4, 0x18, 0xC6, 0x18, 0x83, 0x30, 0x64, 0x0D, 0x80, + 0xA0, 0x1C, 0x03, 0x00, 0xC1, 0x83, 0xC1, 0x83, 0xC3, 0x86, 0xC2, 0x86, + 0xC6, 0x84, 0xC4, 0x8C, 0xCC, 0xC8, 0xC8, 0xD8, 0xD8, 0xD0, 0xD0, 0xF0, + 0x70, 0xE0, 0x60, 0xE0, 0x60, 0xE0, 0x0C, 0x0C, 0x30, 0x60, 0x63, 0x01, + 0x98, 0x02, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x0C, 0x80, 0x33, 0x01, + 0x8C, 0x0C, 0x18, 0x60, 0x60, 0xC0, 0x66, 0x0C, 0x60, 0xC2, 0x18, 0x33, + 0x03, 0x60, 0x1C, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x00, 0x30, + 0x00, 0x1F, 0xF0, 0x07, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, + 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x00, 0xFF, 0xC0, 0x0E, 0x10, 0x20, + 0x41, 0x02, 0x04, 0x08, 0x20, 0x40, 0x81, 0x04, 0x08, 0x10, 0x20, 0xE0, + 0xAA, 0xA9, 0x55, 0x40, 0x0E, 0x08, 0x10, 0x20, 0x41, 0x02, 0x04, 0x08, + 0x20, 0x40, 0x81, 0x04, 0x08, 0x10, 0xE0, 0x0C, 0x18, 0x51, 0xA2, 0x4C, + 0x50, 0x80, 0xFF, 0xE0, 0xC8, 0x80, 0x0F, 0x86, 0x33, 0x0C, 0x03, 0x03, + 0xDF, 0xEE, 0x0B, 0x02, 0xC1, 0x9F, 0xE0, 0x10, 0x04, 0x01, 0x00, 0xDC, + 0x39, 0x88, 0x32, 0x0D, 0x83, 0x40, 0xD0, 0x64, 0x1B, 0x8C, 0xBC, 0x00, + 0x1F, 0x18, 0xD8, 0x6C, 0x0C, 0x06, 0x03, 0x01, 0x86, 0x66, 0x3E, 0x00, + 0x00, 0x20, 0x08, 0x01, 0x0F, 0x23, 0x14, 0xC1, 0x18, 0x26, 0x04, 0xC0, + 0x98, 0x23, 0x04, 0x71, 0x87, 0xD0, 0x0F, 0x0C, 0x76, 0x0D, 0x83, 0xFF, + 0xF0, 0x0C, 0x03, 0x06, 0x63, 0x0F, 0x80, 0x1C, 0xC2, 0x1E, 0x20, 0x84, + 0x10, 0x41, 0x04, 0x20, 0x80, 0x0F, 0x46, 0x33, 0x0C, 0xC1, 0x60, 0xD8, + 0x26, 0x09, 0x86, 0x71, 0x8F, 0xE0, 0x10, 0x04, 0xC2, 0x1F, 0x00, 0x10, + 0x04, 0x01, 0x00, 0x9F, 0x39, 0x88, 0x22, 0x09, 0x02, 0x40, 0x90, 0x44, + 0x12, 0x04, 0x81, 0x00, 0x10, 0x02, 0x22, 0x64, 0x44, 0x48, 0x80, 0x04, + 0x00, 0x01, 0x08, 0x20, 0x82, 0x08, 0x41, 0x04, 0x10, 0x42, 0x08, 0xE0, + 0x10, 0x08, 0x04, 0x04, 0x32, 0x31, 0x20, 0xA0, 0xB8, 0x6C, 0x22, 0x11, + 0x90, 0xC8, 0x30, 0x11, 0x22, 0x22, 0x64, 0x44, 0x48, 0x80, 0x2F, 0x3C, + 0x63, 0x8C, 0x86, 0x19, 0x08, 0x44, 0x10, 0x88, 0x21, 0x10, 0x82, 0x21, + 0x04, 0x82, 0x11, 0x04, 0x20, 0x00, 0x0B, 0xF3, 0x18, 0x82, 0x20, 0x90, + 0x24, 0x09, 0x04, 0x41, 0x20, 0x48, 0x10, 0x0F, 0x0C, 0x76, 0x0D, 0x83, + 0xC0, 0xF0, 0x3C, 0x1B, 0x06, 0xE3, 0x0F, 0x00, 0x17, 0xC3, 0x1C, 0x41, + 0x98, 0x32, 0x06, 0x40, 0xC8, 0x33, 0x06, 0x71, 0x8B, 0xC1, 0x00, 0x20, + 0x08, 0x01, 0x00, 0x00, 0x1E, 0xCC, 0x66, 0x09, 0x82, 0xC0, 0xB0, 0x4C, + 0x13, 0x04, 0x63, 0x0F, 0xC0, 0x20, 0x08, 0x02, 0x00, 0x80, 0x2C, 0x60, + 0x81, 0x04, 0x08, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x33, 0x63, 0x60, 0x70, + 0x1E, 0x03, 0xC3, 0xC6, 0x7C, 0x22, 0xF2, 0x44, 0x44, 0xCC, 0xCE, 0x21, + 0x20, 0x90, 0x48, 0x24, 0x12, 0x13, 0x09, 0x84, 0xE6, 0x3E, 0x00, 0xC1, + 0xE1, 0xB0, 0xC8, 0xC4, 0x43, 0x61, 0xA0, 0xF0, 0x70, 0x18, 0x00, 0xC7, + 0x1E, 0x38, 0xB3, 0xCD, 0x96, 0x4C, 0xB6, 0x6D, 0xB1, 0x4D, 0x0E, 0x78, + 0x63, 0x83, 0x1C, 0x00, 0x10, 0xC3, 0x10, 0x24, 0x07, 0x80, 0xE0, 0x1C, + 0x07, 0x81, 0x90, 0x23, 0x08, 0x20, 0x30, 0x46, 0x18, 0x42, 0x08, 0xC1, + 0x10, 0x24, 0x07, 0x80, 0xE0, 0x1C, 0x03, 0x00, 0x60, 0x08, 0x03, 0x01, + 0xC0, 0x00, 0x3F, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0x7F, 0x00, 0x18, 0x88, 0x42, 0x10, 0x88, 0xC3, 0x18, 0x88, 0x42, 0x18, + 0xE0, 0x11, 0x22, 0x22, 0x24, 0x44, 0x4C, 0x88, 0x88, 0x00, 0x38, 0xC2, + 0x10, 0x88, 0xC6, 0x18, 0x88, 0x42, 0x10, 0x88, 0xC0, 0x70, 0x4E, 0x41, + 0xC0}; + +const GFXglyph FreeSansOblique9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 5, 13, 5, 2, -12}, // 0x21 '!' + {9, 5, 4, 6, 3, -12}, // 0x22 '"' + {12, 11, 13, 10, 1, -12}, // 0x23 '#' + {30, 11, 16, 10, 1, -13}, // 0x24 '$' + {52, 15, 13, 16, 2, -12}, // 0x25 '%' + {77, 10, 13, 12, 2, -12}, // 0x26 '&' + {94, 2, 4, 3, 3, -12}, // 0x27 ''' + {95, 7, 17, 6, 2, -12}, // 0x28 '(' + {110, 7, 17, 6, -1, -12}, // 0x29 ')' + {125, 6, 5, 7, 3, -12}, // 0x2A '*' + {129, 9, 8, 11, 2, -7}, // 0x2B '+' + {138, 3, 5, 5, 1, -1}, // 0x2C ',' + {140, 4, 1, 6, 2, -4}, // 0x2D '-' + {141, 2, 1, 5, 2, 0}, // 0x2E '.' + {142, 8, 13, 5, 0, -12}, // 0x2F '/' + {155, 9, 13, 10, 2, -12}, // 0x30 '0' + {170, 5, 13, 10, 4, -12}, // 0x31 '1' + {179, 11, 13, 10, 1, -12}, // 0x32 '2' + {197, 10, 13, 10, 1, -12}, // 0x33 '3' + {214, 9, 13, 10, 1, -12}, // 0x34 '4' + {229, 11, 13, 10, 1, -12}, // 0x35 '5' + {247, 10, 13, 10, 2, -12}, // 0x36 '6' + {264, 10, 13, 10, 2, -12}, // 0x37 '7' + {281, 10, 13, 10, 1, -12}, // 0x38 '8' + {298, 10, 13, 10, 1, -12}, // 0x39 '9' + {315, 4, 9, 5, 2, -8}, // 0x3A ':' + {320, 5, 12, 5, 1, -8}, // 0x3B ';' + {328, 9, 9, 11, 2, -8}, // 0x3C '<' + {339, 10, 4, 11, 1, -5}, // 0x3D '=' + {344, 9, 9, 11, 1, -7}, // 0x3E '>' + {355, 9, 13, 10, 3, -12}, // 0x3F '?' + {370, 18, 16, 18, 1, -12}, // 0x40 '@' + {406, 12, 13, 12, 0, -12}, // 0x41 'A' + {426, 12, 13, 12, 1, -12}, // 0x42 'B' + {446, 12, 13, 13, 2, -12}, // 0x43 'C' + {466, 13, 13, 13, 1, -12}, // 0x44 'D' + {488, 12, 13, 12, 1, -12}, // 0x45 'E' + {508, 12, 13, 11, 1, -12}, // 0x46 'F' + {528, 13, 13, 14, 2, -12}, // 0x47 'G' + {550, 13, 13, 13, 1, -12}, // 0x48 'H' + {572, 4, 13, 5, 2, -12}, // 0x49 'I' + {579, 10, 13, 9, 1, -12}, // 0x4A 'J' + {596, 14, 13, 12, 1, -12}, // 0x4B 'K' + {619, 9, 13, 10, 1, -12}, // 0x4C 'L' + {634, 16, 13, 15, 1, -12}, // 0x4D 'M' + {660, 13, 13, 13, 1, -12}, // 0x4E 'N' + {682, 13, 13, 14, 2, -12}, // 0x4F 'O' + {704, 12, 13, 12, 1, -12}, // 0x50 'P' + {724, 13, 14, 14, 2, -12}, // 0x51 'Q' + {747, 13, 13, 13, 1, -12}, // 0x52 'R' + {769, 12, 13, 12, 1, -12}, // 0x53 'S' + {789, 10, 13, 11, 3, -12}, // 0x54 'T' + {806, 12, 13, 13, 2, -12}, // 0x55 'U' + {826, 11, 13, 12, 3, -12}, // 0x56 'V' + {844, 16, 13, 17, 3, -12}, // 0x57 'W' + {870, 14, 13, 12, 0, -12}, // 0x58 'X' + {893, 12, 13, 12, 3, -12}, // 0x59 'Y' + {913, 12, 13, 11, 1, -12}, // 0x5A 'Z' + {933, 7, 17, 5, 0, -12}, // 0x5B '[' + {948, 2, 13, 5, 3, -12}, // 0x5C '\' + {952, 7, 17, 5, 0, -12}, // 0x5D ']' + {967, 7, 7, 8, 2, -12}, // 0x5E '^' + {974, 11, 1, 10, -1, 3}, // 0x5F '_' + {976, 3, 3, 6, 3, -12}, // 0x60 '`' + {978, 10, 10, 10, 1, -9}, // 0x61 'a' + {991, 10, 13, 10, 1, -12}, // 0x62 'b' + {1008, 9, 10, 9, 1, -9}, // 0x63 'c' + {1020, 11, 13, 10, 1, -12}, // 0x64 'd' + {1038, 10, 10, 10, 1, -9}, // 0x65 'e' + {1051, 6, 13, 5, 1, -12}, // 0x66 'f' + {1061, 10, 14, 10, 0, -9}, // 0x67 'g' + {1079, 10, 13, 10, 1, -12}, // 0x68 'h' + {1096, 4, 13, 4, 1, -12}, // 0x69 'i' + {1103, 6, 17, 4, -1, -12}, // 0x6A 'j' + {1116, 9, 13, 9, 1, -12}, // 0x6B 'k' + {1131, 4, 13, 4, 1, -12}, // 0x6C 'l' + {1138, 15, 10, 15, 1, -9}, // 0x6D 'm' + {1157, 10, 11, 10, 1, -10}, // 0x6E 'n' + {1171, 10, 10, 10, 1, -9}, // 0x6F 'o' + {1184, 11, 14, 10, 0, -9}, // 0x70 'p' + {1204, 10, 14, 10, 1, -9}, // 0x71 'q' + {1222, 7, 10, 6, 1, -9}, // 0x72 'r' + {1231, 8, 10, 9, 1, -9}, // 0x73 's' + {1241, 4, 12, 5, 2, -11}, // 0x74 't' + {1247, 9, 10, 10, 2, -9}, // 0x75 'u' + {1259, 9, 10, 9, 2, -9}, // 0x76 'v' + {1271, 13, 10, 13, 2, -9}, // 0x77 'w' + {1288, 11, 10, 9, 0, -9}, // 0x78 'x' + {1302, 11, 14, 9, 0, -9}, // 0x79 'y' + {1322, 9, 10, 9, 1, -9}, // 0x7A 'z' + {1334, 5, 17, 6, 2, -12}, // 0x7B '{' + {1345, 4, 17, 5, 1, -12}, // 0x7C '|' + {1354, 5, 17, 6, 0, -12}, // 0x7D '}' + {1365, 9, 3, 11, 2, -7}}; // 0x7E '~' + +const GFXfont FreeSansOblique9pt7b PROGMEM = { + (uint8_t *)FreeSansOblique9pt7bBitmaps, + (GFXglyph *)FreeSansOblique9pt7bGlyphs, 0x20, 0x7E, 22}; + +// Approx. 2041 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h new file mode 100644 index 0000000..22cb53d --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h @@ -0,0 +1,261 @@ +#pragma once +#include + +const uint8_t FreeSerif12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFE, 0xA8, 0x3F, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x0C, 0x40, 0xC4, + 0x08, 0x40, 0x8C, 0x08, 0xC7, 0xFF, 0x18, 0x81, 0x88, 0x10, 0x81, 0x08, + 0xFF, 0xE1, 0x18, 0x31, 0x03, 0x10, 0x31, 0x02, 0x10, 0x04, 0x07, 0xC6, + 0x5B, 0x12, 0xC4, 0xB1, 0x0F, 0x41, 0xF0, 0x1E, 0x01, 0xE0, 0x58, 0x13, + 0x84, 0xE1, 0x3C, 0x4F, 0x96, 0x3F, 0x01, 0x00, 0x00, 0x04, 0x03, 0x83, + 0x03, 0x9F, 0x81, 0xC2, 0x20, 0x60, 0x90, 0x38, 0x24, 0x0C, 0x12, 0x03, + 0x0D, 0x00, 0xC6, 0x47, 0x9E, 0x23, 0x10, 0x09, 0x84, 0x04, 0xE1, 0x03, + 0x30, 0x40, 0x8C, 0x20, 0x43, 0x08, 0x10, 0xC4, 0x08, 0x1E, 0x00, 0x03, + 0xC0, 0x02, 0x30, 0x03, 0x08, 0x01, 0x84, 0x00, 0xC4, 0x00, 0x7C, 0xF8, + 0x1C, 0x38, 0x1E, 0x08, 0x33, 0x0C, 0x31, 0xC4, 0x10, 0x74, 0x18, 0x3A, + 0x0C, 0x0E, 0x07, 0x03, 0x83, 0xC3, 0xE2, 0x7E, 0x3E, 0xFF, 0xA0, 0x04, + 0x21, 0x08, 0x61, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC1, 0x04, 0x18, 0x20, + 0x40, 0x81, 0x81, 0x02, 0x04, 0x18, 0x20, 0x83, 0x0C, 0x30, 0xC3, 0x0C, + 0x30, 0x86, 0x10, 0x84, 0x20, 0x30, 0xB3, 0xD7, 0x54, 0x38, 0x7C, 0xD3, + 0x30, 0x30, 0x10, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x41, 0xFF, 0xC1, + 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x00, 0xDF, 0x95, 0x00, 0xFC, 0xFC, + 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C, + 0x10, 0x60, 0xC0, 0x1E, 0x0C, 0xC6, 0x19, 0x86, 0xC0, 0xB0, 0x3C, 0x0F, + 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E, + 0x00, 0x11, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, + 0x0C, 0xFC, 0x1E, 0x18, 0xC4, 0x1A, 0x06, 0x01, 0x80, 0x60, 0x10, 0x0C, + 0x02, 0x01, 0x00, 0xC0, 0x60, 0x30, 0x18, 0x1F, 0xF8, 0x1E, 0x18, 0xE8, + 0x18, 0x06, 0x01, 0x00, 0x80, 0xF0, 0x7E, 0x03, 0xC0, 0x70, 0x0C, 0x03, + 0x00, 0xC0, 0x6E, 0x11, 0xF8, 0x01, 0x00, 0xC0, 0x70, 0x2C, 0x0B, 0x04, + 0xC2, 0x30, 0x8C, 0x43, 0x20, 0xC8, 0x33, 0xFF, 0x03, 0x00, 0xC0, 0x30, + 0x0C, 0x00, 0x03, 0xF1, 0x00, 0x40, 0x18, 0x0F, 0x80, 0xF8, 0x0E, 0x01, + 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x20, 0x1B, 0x8C, 0x7C, 0x00, 0x01, + 0xC3, 0xC1, 0xC0, 0xC0, 0x70, 0x18, 0x0E, 0xF3, 0xCE, 0xC1, 0xF0, 0x3C, + 0x0F, 0x03, 0xC0, 0xD8, 0x36, 0x08, 0xC6, 0x1E, 0x00, 0x3F, 0xD0, 0x38, + 0x08, 0x06, 0x01, 0x80, 0x40, 0x10, 0x0C, 0x02, 0x00, 0x80, 0x20, 0x10, + 0x04, 0x01, 0x00, 0x80, 0x20, 0x1F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0xF8, + 0x67, 0x30, 0xF0, 0x1E, 0x09, 0xE6, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0D, + 0x86, 0x1F, 0x00, 0x1E, 0x08, 0xC6, 0x1B, 0x02, 0xC0, 0xF0, 0x3C, 0x0F, + 0x03, 0xE0, 0xDC, 0x73, 0xEC, 0x06, 0x01, 0x80, 0xC0, 0x70, 0x38, 0x38, + 0x18, 0x00, 0xFC, 0x00, 0x3F, 0xCC, 0xC0, 0x00, 0x00, 0x06, 0x77, 0x12, + 0x40, 0x00, 0x00, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x07, 0x00, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x00, 0x10, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x0E, 0x00, 0x3C, 0x00, 0xF0, + 0x03, 0xC0, 0x0F, 0x00, 0x30, 0x0E, 0x07, 0x81, 0xE0, 0x78, 0x0E, 0x00, + 0x00, 0x00, 0x7C, 0x86, 0x83, 0xC3, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x08, + 0x10, 0x10, 0x00, 0x00, 0x30, 0x30, 0x30, 0x03, 0xF0, 0x06, 0x06, 0x06, + 0x00, 0x86, 0x00, 0x26, 0x0E, 0xD3, 0x0C, 0xC7, 0x0C, 0x63, 0x84, 0x31, + 0xC6, 0x18, 0xE3, 0x08, 0x71, 0x8C, 0x4C, 0xC6, 0x46, 0x3D, 0xC1, 0x80, + 0x00, 0x30, 0x10, 0x07, 0xF0, 0x00, 0x80, 0x00, 0x60, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x2E, 0x00, 0x13, 0x00, 0x19, 0xC0, 0x08, 0x60, 0x04, 0x38, + 0x04, 0x0C, 0x03, 0xFF, 0x03, 0x03, 0x81, 0x00, 0xE1, 0x80, 0x70, 0xC0, + 0x3D, 0xF0, 0x3F, 0xFF, 0x83, 0x0C, 0x30, 0x63, 0x06, 0x30, 0x63, 0x06, + 0x30, 0xC3, 0xF0, 0x30, 0xE3, 0x06, 0x30, 0x33, 0x03, 0x30, 0x33, 0x07, + 0x30, 0xEF, 0xFC, 0x07, 0xE2, 0x38, 0x3C, 0xC0, 0x3B, 0x00, 0x36, 0x00, + 0x38, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x03, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x47, 0x03, 0x03, 0xF8, 0xFF, 0xC0, 0x30, + 0x78, 0x30, 0x1C, 0x30, 0x0E, 0x30, 0x06, 0x30, 0x03, 0x30, 0x03, 0x30, + 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x06, 0x30, 0x06, 0x30, + 0x0C, 0x30, 0x78, 0xFF, 0xC0, 0xFF, 0xFC, 0xC0, 0x33, 0x00, 0x4C, 0x00, + 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30, 0x30, 0xC0, 0x43, 0x00, + 0x0C, 0x00, 0x30, 0x08, 0xC0, 0x23, 0x03, 0xBF, 0xFE, 0xFF, 0xFC, 0xC0, + 0x33, 0x00, 0x4C, 0x00, 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30, + 0x30, 0xC0, 0x43, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x3F, + 0x00, 0x07, 0xE4, 0x1C, 0x3C, 0x30, 0x0C, 0x60, 0x0C, 0x60, 0x04, 0xC0, + 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x60, + 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x1C, 0x1C, 0x07, 0xE0, 0xFC, 0x3F, 0x30, + 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, + 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, + 0x0C, 0x30, 0x0C, 0xFC, 0x3F, 0xFC, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, + 0xC3, 0x0C, 0x30, 0xC3, 0x3F, 0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xC8, 0xF0, 0xFC, 0xFE, 0x30, + 0x38, 0x30, 0x20, 0x30, 0x40, 0x30, 0x80, 0x33, 0x00, 0x36, 0x00, 0x3E, + 0x00, 0x37, 0x00, 0x33, 0x80, 0x31, 0xC0, 0x30, 0xE0, 0x30, 0x70, 0x30, + 0x38, 0x30, 0x3C, 0xFC, 0x7F, 0xFC, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, + 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, + 0xC0, 0x01, 0x80, 0x03, 0x00, 0x26, 0x00, 0x8C, 0x07, 0x7F, 0xFE, 0xF8, + 0x01, 0xE7, 0x00, 0x70, 0xE0, 0x0E, 0x1E, 0x03, 0xC2, 0xC0, 0x58, 0x5C, + 0x1B, 0x09, 0x82, 0x61, 0x38, 0x4C, 0x27, 0x11, 0x84, 0x72, 0x30, 0x8E, + 0xC6, 0x10, 0xD0, 0xC2, 0x1E, 0x18, 0x41, 0x83, 0x1C, 0x30, 0x67, 0xC4, + 0x3F, 0xF0, 0x1F, 0x78, 0x0E, 0x3C, 0x04, 0x3E, 0x04, 0x2E, 0x04, 0x27, + 0x04, 0x23, 0x84, 0x23, 0xC4, 0x21, 0xE4, 0x20, 0xE4, 0x20, 0x74, 0x20, + 0x3C, 0x20, 0x1C, 0x20, 0x0C, 0x70, 0x0C, 0xF8, 0x04, 0x07, 0xC0, 0x30, + 0x60, 0xC0, 0x63, 0x00, 0x66, 0x00, 0xD8, 0x00, 0xF0, 0x01, 0xE0, 0x03, + 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1B, 0x00, 0x66, 0x00, 0xC6, 0x03, 0x06, + 0x0C, 0x03, 0xE0, 0xFF, 0x83, 0x0E, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03, + 0x30, 0x63, 0x0E, 0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x0F, 0xC0, 0x0F, 0xE0, 0x18, 0x30, 0x30, 0x18, 0x60, 0x0C, 0x60, + 0x0C, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, + 0x06, 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x03, + 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0xFF, 0x80, 0x61, 0xC0, 0xC1, + 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x0C, 0x1C, 0x18, 0x70, 0x3F, 0x80, + 0x67, 0x00, 0xC7, 0x01, 0x8F, 0x03, 0x0F, 0x06, 0x0E, 0x0C, 0x0E, 0x7E, + 0x0F, 0x1F, 0x46, 0x19, 0x81, 0x30, 0x27, 0x02, 0xF0, 0x0F, 0x00, 0xF8, + 0x07, 0xC0, 0x38, 0x03, 0xC0, 0x34, 0x06, 0x80, 0xDC, 0x32, 0x7C, 0xFF, + 0xFF, 0x86, 0x0E, 0x0C, 0x1C, 0x18, 0x10, 0x30, 0x00, 0x60, 0x00, 0xC0, + 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, + 0x60, 0x00, 0xC0, 0x07, 0xE0, 0xFC, 0x1F, 0x30, 0x0E, 0x30, 0x04, 0x30, + 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, + 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x18, 0x08, 0x1C, 0x18, 0x07, + 0xE0, 0xFE, 0x0F, 0x9C, 0x03, 0x0E, 0x01, 0x83, 0x00, 0x81, 0xC0, 0x40, + 0x60, 0x40, 0x38, 0x20, 0x0C, 0x30, 0x07, 0x10, 0x01, 0x98, 0x00, 0xE8, + 0x00, 0x34, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFC, + 0xFC, 0x3D, 0xE1, 0xC0, 0x63, 0x83, 0x01, 0x86, 0x0E, 0x04, 0x1C, 0x18, + 0x10, 0x70, 0x70, 0x80, 0xC3, 0xC2, 0x03, 0x8B, 0x08, 0x06, 0x6E, 0x40, + 0x1D, 0x19, 0x00, 0x74, 0x78, 0x00, 0xE1, 0xE0, 0x03, 0x83, 0x80, 0x0E, + 0x0C, 0x00, 0x10, 0x10, 0x00, 0x40, 0x40, 0x7F, 0x1F, 0x9E, 0x03, 0x07, + 0x03, 0x01, 0xC3, 0x00, 0x71, 0x00, 0x19, 0x00, 0x0F, 0x00, 0x03, 0x80, + 0x01, 0xE0, 0x01, 0xB0, 0x01, 0x9C, 0x00, 0x87, 0x00, 0x81, 0xC0, 0x80, + 0xE0, 0xC0, 0x79, 0xF8, 0x7F, 0xFE, 0x1F, 0x78, 0x0C, 0x38, 0x08, 0x1C, + 0x18, 0x0E, 0x10, 0x06, 0x20, 0x07, 0x60, 0x03, 0xC0, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, + 0xE0, 0x7F, 0xFB, 0x00, 0xC8, 0x07, 0x20, 0x38, 0x01, 0xC0, 0x07, 0x00, + 0x38, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x05, + 0xC0, 0x3E, 0x01, 0xBF, 0xFE, 0xFE, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, + 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xF0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C, + 0x18, 0x10, 0x30, 0x60, 0x40, 0xC1, 0x81, 0x03, 0x06, 0xF8, 0xC6, 0x31, + 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xF0, 0x0C, 0x07, + 0x01, 0x60, 0xD8, 0x23, 0x18, 0xC4, 0x1B, 0x06, 0x80, 0xC0, 0xFF, 0xF0, + 0xC7, 0x0C, 0x30, 0x3E, 0x31, 0x8C, 0x30, 0x0C, 0x03, 0x07, 0xC6, 0x33, + 0x0C, 0xC3, 0x31, 0xC7, 0xB8, 0x20, 0x38, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0xF1, 0xC6, 0x61, 0xD8, 0x36, 0x0D, 0x83, 0x60, 0xD8, 0x26, 0x19, + 0x84, 0x3E, 0x00, 0x1E, 0x23, 0x63, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1, + 0x72, 0x3C, 0x00, 0x80, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x61, 0xD8, 0x8E, + 0x61, 0xB0, 0x6C, 0x1B, 0x06, 0xC1, 0xB0, 0x6E, 0x19, 0xCE, 0x3D, 0xC0, + 0x1E, 0x08, 0xE4, 0x1B, 0xFE, 0xC0, 0x30, 0x0C, 0x03, 0x81, 0x60, 0x9C, + 0x41, 0xE0, 0x0F, 0x08, 0xC4, 0x06, 0x03, 0x01, 0x81, 0xF0, 0x60, 0x30, + 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0xFC, 0x00, 0x1F, 0x03, + 0x1F, 0x60, 0xC6, 0x0C, 0x60, 0xC3, 0x18, 0x1F, 0x02, 0x00, 0x40, 0x07, + 0xFC, 0x40, 0x24, 0x02, 0xC0, 0x2C, 0x04, 0xE0, 0x83, 0xF0, 0x30, 0x1E, + 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0D, 0xE1, 0xCE, 0x30, 0xC6, 0x18, + 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x79, 0xE0, 0x31, 0x80, + 0x00, 0x09, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xDF, 0x0C, 0x30, 0x00, 0x00, + 0x31, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xF2, 0xF0, + 0x20, 0x1C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0xFB, 0x08, 0x62, + 0x0C, 0x81, 0xE0, 0x3E, 0x06, 0xE0, 0xCE, 0x18, 0xC3, 0x0E, 0xF3, 0xE0, + 0x13, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0xF8, 0xF7, + 0x8F, 0x0E, 0x3C, 0xE3, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30, + 0x63, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30, 0x67, 0x9E, 0x3C, + 0xF7, 0x87, 0x18, 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x30, + 0xC6, 0x19, 0xE7, 0x80, 0x1E, 0x18, 0xE4, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, + 0x0F, 0x03, 0x60, 0x9C, 0x41, 0xE0, 0x77, 0x87, 0x18, 0xC3, 0x98, 0x33, + 0x06, 0x60, 0xCC, 0x19, 0x83, 0x30, 0xC7, 0x10, 0xDC, 0x18, 0x03, 0x00, + 0x60, 0x0C, 0x07, 0xE0, 0x1E, 0x8C, 0xE6, 0x1B, 0x06, 0xC1, 0xB0, 0x6C, + 0x1B, 0x06, 0xE1, 0x98, 0xE3, 0xD8, 0x06, 0x01, 0x80, 0x60, 0x18, 0x1F, + 0x37, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7C, 0x7B, + 0x0E, 0x1C, 0x1E, 0x0F, 0x07, 0xC3, 0x87, 0x8A, 0xE0, 0x21, 0x8F, 0x98, + 0x61, 0x86, 0x18, 0x61, 0x86, 0x19, 0x38, 0xE3, 0x98, 0x66, 0x19, 0x86, + 0x61, 0x98, 0x66, 0x19, 0x86, 0x61, 0x9C, 0xE3, 0xDC, 0xF8, 0xEE, 0x08, + 0xC1, 0x18, 0x41, 0x88, 0x32, 0x03, 0x40, 0x68, 0x06, 0x00, 0xC0, 0x10, + 0x00, 0xF3, 0xE7, 0x61, 0x83, 0x70, 0xC2, 0x30, 0xC2, 0x30, 0xC4, 0x19, + 0x64, 0x19, 0x68, 0x0E, 0x38, 0x0E, 0x38, 0x0C, 0x30, 0x04, 0x10, 0xFB, + 0xC6, 0x30, 0x64, 0x0F, 0x00, 0xC0, 0x0C, 0x03, 0xC0, 0x98, 0x21, 0x8C, + 0x3B, 0xCF, 0x80, 0xF8, 0xEE, 0x08, 0xC1, 0x18, 0x41, 0x88, 0x31, 0x03, + 0x40, 0x68, 0x06, 0x00, 0xC0, 0x08, 0x02, 0x00, 0x40, 0x10, 0x1E, 0x03, + 0x80, 0x7F, 0x90, 0xE0, 0x30, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0xE0, 0x30, + 0x5C, 0x3F, 0xF8, 0x19, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xB0, 0x63, 0x18, + 0xC6, 0x31, 0x8C, 0x61, 0x80, 0xFF, 0xFF, 0x80, 0xC3, 0x18, 0xC6, 0x31, + 0x8C, 0x63, 0x06, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xCC, 0x00, 0x38, 0x06, + 0x62, 0x41, 0xC0}; + +const GFXglyph FreeSerif12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 6, 0, 1}, // 0x20 ' ' + {0, 2, 16, 8, 3, -15}, // 0x21 '!' + {4, 6, 6, 10, 1, -15}, // 0x22 '"' + {9, 12, 16, 12, 0, -15}, // 0x23 '#' + {33, 10, 18, 12, 1, -16}, // 0x24 '$' + {56, 18, 17, 20, 1, -16}, // 0x25 '%' + {95, 17, 16, 19, 1, -15}, // 0x26 '&' + {129, 2, 6, 5, 1, -15}, // 0x27 ''' + {131, 6, 20, 8, 1, -15}, // 0x28 '(' + {146, 6, 20, 8, 1, -15}, // 0x29 ')' + {161, 8, 10, 12, 3, -14}, // 0x2A '*' + {171, 11, 11, 14, 1, -10}, // 0x2B '+' + {187, 3, 6, 6, 2, -2}, // 0x2C ',' + {190, 6, 1, 8, 1, -5}, // 0x2D '-' + {191, 2, 3, 6, 2, -2}, // 0x2E '.' + {192, 7, 17, 7, 0, -16}, // 0x2F '/' + {207, 10, 17, 12, 1, -16}, // 0x30 '0' + {229, 6, 17, 12, 3, -16}, // 0x31 '1' + {242, 10, 15, 12, 1, -14}, // 0x32 '2' + {261, 10, 16, 12, 1, -15}, // 0x33 '3' + {281, 10, 16, 12, 1, -15}, // 0x34 '4' + {301, 10, 17, 12, 1, -16}, // 0x35 '5' + {323, 10, 17, 12, 1, -16}, // 0x36 '6' + {345, 10, 16, 12, 0, -15}, // 0x37 '7' + {365, 10, 17, 12, 1, -16}, // 0x38 '8' + {387, 10, 18, 12, 1, -16}, // 0x39 '9' + {410, 2, 12, 6, 2, -11}, // 0x3A ':' + {413, 4, 15, 6, 2, -11}, // 0x3B ';' + {421, 12, 13, 14, 1, -12}, // 0x3C '<' + {441, 12, 6, 14, 1, -8}, // 0x3D '=' + {450, 12, 13, 14, 1, -11}, // 0x3E '>' + {470, 8, 17, 11, 2, -16}, // 0x3F '?' + {487, 17, 16, 21, 2, -15}, // 0x40 '@' + {521, 17, 16, 17, 0, -15}, // 0x41 'A' + {555, 12, 16, 15, 1, -15}, // 0x42 'B' + {579, 15, 16, 16, 1, -15}, // 0x43 'C' + {609, 16, 16, 17, 0, -15}, // 0x44 'D' + {641, 14, 16, 15, 0, -15}, // 0x45 'E' + {669, 14, 16, 14, 0, -15}, // 0x46 'F' + {697, 16, 16, 17, 1, -15}, // 0x47 'G' + {729, 16, 16, 17, 0, -15}, // 0x48 'H' + {761, 6, 16, 8, 1, -15}, // 0x49 'I' + {773, 8, 16, 9, 0, -15}, // 0x4A 'J' + {789, 16, 16, 17, 1, -15}, // 0x4B 'K' + {821, 15, 16, 15, 0, -15}, // 0x4C 'L' + {851, 19, 16, 21, 1, -15}, // 0x4D 'M' + {889, 16, 16, 17, 1, -15}, // 0x4E 'N' + {921, 15, 16, 17, 1, -15}, // 0x4F 'O' + {951, 12, 16, 14, 0, -15}, // 0x50 'P' + {975, 16, 20, 17, 1, -15}, // 0x51 'Q' + {1015, 15, 16, 16, 0, -15}, // 0x52 'R' + {1045, 11, 16, 13, 0, -15}, // 0x53 'S' + {1067, 15, 16, 15, 0, -15}, // 0x54 'T' + {1097, 16, 16, 17, 1, -15}, // 0x55 'U' + {1129, 17, 16, 17, 0, -15}, // 0x56 'V' + {1163, 22, 16, 23, 0, -15}, // 0x57 'W' + {1207, 17, 16, 17, 0, -15}, // 0x58 'X' + {1241, 16, 16, 17, 0, -15}, // 0x59 'Y' + {1273, 14, 16, 15, 1, -15}, // 0x5A 'Z' + {1301, 5, 20, 8, 2, -15}, // 0x5B '[' + {1314, 7, 17, 7, 0, -16}, // 0x5C '\' + {1329, 5, 20, 8, 1, -15}, // 0x5D ']' + {1342, 10, 9, 11, 1, -15}, // 0x5E '^' + {1354, 12, 1, 12, 0, 3}, // 0x5F '_' + {1356, 5, 4, 6, 0, -15}, // 0x60 '`' + {1359, 10, 11, 10, 1, -10}, // 0x61 'a' + {1373, 10, 17, 12, 1, -16}, // 0x62 'b' + {1395, 8, 11, 11, 1, -10}, // 0x63 'c' + {1406, 10, 17, 12, 1, -16}, // 0x64 'd' + {1428, 10, 11, 11, 1, -10}, // 0x65 'e' + {1442, 9, 17, 9, 0, -16}, // 0x66 'f' + {1462, 12, 16, 11, 0, -10}, // 0x67 'g' + {1486, 11, 17, 12, 0, -16}, // 0x68 'h' + {1510, 5, 16, 7, 0, -15}, // 0x69 'i' + {1520, 6, 21, 8, 0, -15}, // 0x6A 'j' + {1536, 11, 17, 12, 1, -16}, // 0x6B 'k' + {1560, 5, 17, 6, 0, -16}, // 0x6C 'l' + {1571, 18, 11, 19, 0, -10}, // 0x6D 'm' + {1596, 11, 11, 12, 0, -10}, // 0x6E 'n' + {1612, 10, 11, 12, 1, -10}, // 0x6F 'o' + {1626, 11, 16, 12, 0, -10}, // 0x70 'p' + {1648, 10, 16, 12, 1, -10}, // 0x71 'q' + {1668, 8, 11, 8, 0, -10}, // 0x72 'r' + {1679, 7, 11, 9, 1, -10}, // 0x73 's' + {1689, 6, 13, 7, 1, -12}, // 0x74 't' + {1699, 10, 11, 12, 1, -10}, // 0x75 'u' + {1713, 11, 11, 11, 0, -10}, // 0x76 'v' + {1729, 16, 11, 16, 0, -10}, // 0x77 'w' + {1751, 11, 11, 12, 0, -10}, // 0x78 'x' + {1767, 11, 16, 11, 0, -10}, // 0x79 'y' + {1789, 10, 11, 10, 0, -10}, // 0x7A 'z' + {1803, 5, 21, 12, 2, -16}, // 0x7B '{' + {1817, 1, 17, 5, 2, -16}, // 0x7C '|' + {1820, 5, 21, 12, 5, -15}, // 0x7D '}' + {1834, 12, 3, 12, 0, -6}}; // 0x7E '~' + +const GFXfont FreeSerif12pt7b PROGMEM = {(uint8_t *)FreeSerif12pt7bBitmaps, + (GFXglyph *)FreeSerif12pt7bGlyphs, + 0x20, 0x7E, 29}; + +// Approx. 2511 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h new file mode 100644 index 0000000..3fd1ba5 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h @@ -0,0 +1,431 @@ +#pragma once +#include + +const uint8_t FreeSerif18pt7bBitmaps[] PROGMEM = { + 0x6F, 0xFF, 0xFF, 0xFE, 0x66, 0x66, 0x66, 0x64, 0x40, 0x00, 0x6F, 0xF6, + 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x46, 0x42, 0x42, 0x42, 0x03, 0x06, 0x01, + 0x83, 0x00, 0xC1, 0x80, 0x61, 0xC0, 0x30, 0xC0, 0x38, 0x60, 0x18, 0x30, + 0xFF, 0xFF, 0x7F, 0xFF, 0x83, 0x06, 0x01, 0x86, 0x00, 0xC3, 0x00, 0xC1, + 0x87, 0xFF, 0xFF, 0xFF, 0xFE, 0x18, 0x30, 0x0C, 0x18, 0x06, 0x18, 0x06, + 0x0C, 0x03, 0x06, 0x01, 0x83, 0x00, 0xC1, 0x80, 0x60, 0xC0, 0x02, 0x00, + 0x10, 0x03, 0xE0, 0x64, 0xE6, 0x23, 0x61, 0x1B, 0x08, 0x58, 0x42, 0xE2, + 0x03, 0x90, 0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF0, 0x0F, 0xC0, 0x4E, + 0x02, 0x38, 0x10, 0xE0, 0x87, 0x04, 0x3C, 0x21, 0xE1, 0x1B, 0xC9, 0xCF, + 0xFC, 0x1F, 0x80, 0x10, 0x00, 0x80, 0x07, 0x80, 0x20, 0x0F, 0xF0, 0x70, + 0x0F, 0x07, 0xD0, 0x0F, 0x02, 0x18, 0x07, 0x01, 0x18, 0x07, 0x00, 0x8C, + 0x03, 0x80, 0x4C, 0x01, 0x80, 0x44, 0x00, 0xC0, 0x26, 0x00, 0x60, 0x22, + 0x0F, 0x30, 0x33, 0x1F, 0xCC, 0x73, 0x1E, 0x37, 0xF1, 0x8E, 0x19, 0xE1, + 0x8E, 0x04, 0x00, 0x86, 0x02, 0x00, 0xC7, 0x01, 0x00, 0xC3, 0x80, 0x80, + 0x61, 0x80, 0x80, 0x60, 0xC0, 0x40, 0x30, 0x60, 0x40, 0x30, 0x38, 0xE0, + 0x30, 0x0F, 0xE0, 0x18, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0x61, 0x80, 0x00, 0x60, 0x60, 0x00, 0x30, 0x30, 0x00, 0x18, 0x18, + 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x8E, 0x00, 0x01, 0xCE, + 0x00, 0x00, 0x7C, 0x3F, 0xC0, 0x38, 0x07, 0x80, 0x3E, 0x03, 0x80, 0x77, + 0x01, 0x80, 0x73, 0xC0, 0x80, 0xF0, 0xF0, 0xC0, 0x70, 0x7C, 0xC0, 0x78, + 0x1E, 0x40, 0x3C, 0x07, 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x0F, + 0xC0, 0xFF, 0x0D, 0xF0, 0xC7, 0xFC, 0x7F, 0xC1, 0xFC, 0x1F, 0x80, 0x3C, + 0x00, 0xFF, 0xFE, 0x92, 0x40, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, + 0xC0, 0x60, 0x70, 0x30, 0x18, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, + 0x70, 0x38, 0x0C, 0x06, 0x03, 0x80, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x80, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x60, 0x18, 0x0C, + 0x07, 0x01, 0x80, 0xC0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, + 0xE0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x00, 0x0C, 0x00, 0xC0, 0x0C, 0x0C, 0x46, 0xE4, 0xF7, 0x5E, 0x1F, 0x00, + 0xC0, 0x17, 0x8E, 0x4E, 0xE4, 0xFC, 0xC6, 0x0C, 0x00, 0xC0, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x6F, 0xFF, + 0x11, 0x24, 0x80, 0xFF, 0xFF, 0x6F, 0xF6, 0x00, 0xC0, 0x60, 0x18, 0x06, + 0x03, 0x80, 0xC0, 0x30, 0x1C, 0x06, 0x01, 0x80, 0xE0, 0x30, 0x0C, 0x07, + 0x01, 0x80, 0x60, 0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, + 0x00, 0x03, 0xE0, 0x0E, 0x70, 0x1C, 0x38, 0x38, 0x1C, 0x38, 0x1C, 0x78, + 0x1E, 0x70, 0x0E, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, + 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0E, 0x70, + 0x0E, 0x78, 0x1E, 0x38, 0x1C, 0x38, 0x1C, 0x1C, 0x38, 0x0C, 0x30, 0x03, + 0xC0, 0x06, 0x03, 0x83, 0xE3, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, + 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, + 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xE1, 0xFF, 0x07, 0xC0, 0x1F, 0xF0, 0x3F, + 0xF8, 0x70, 0xF8, 0x60, 0x3C, 0xC0, 0x3C, 0x80, 0x1C, 0x00, 0x1C, 0x00, + 0x1C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, + 0xC0, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x01, 0x10, + 0x02, 0x3F, 0xFE, 0x7F, 0xFC, 0xFF, 0xFC, 0x0F, 0xC0, 0xFF, 0x0C, 0x3C, + 0x80, 0xE4, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x04, 0x00, 0x40, 0x04, 0x00, + 0xF8, 0x1F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0xE0, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x00, 0x60, 0x03, 0x78, 0x73, 0xFF, 0x0F, 0xC0, 0x00, 0x30, + 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xB0, 0x01, 0x30, 0x03, 0x30, + 0x06, 0x30, 0x04, 0x30, 0x08, 0x30, 0x18, 0x30, 0x10, 0x30, 0x20, 0x30, + 0x60, 0x30, 0xC0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x30, 0x00, 0x30, + 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x7F, 0xC3, + 0xFE, 0x1F, 0xE1, 0x80, 0x08, 0x00, 0xC0, 0x07, 0xC0, 0x7F, 0x81, 0xFF, + 0x00, 0xFC, 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x60, 0x03, 0x00, 0x18, + 0x00, 0xC0, 0x06, 0x00, 0x60, 0x07, 0x78, 0x73, 0xFF, 0x0F, 0xC0, 0x00, + 0x0E, 0x00, 0xF8, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x7C, 0x00, 0x79, 0xF0, 0x7F, 0xFC, 0xF8, 0x3C, 0xF0, 0x1E, 0xF0, + 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0F, 0x78, + 0x0F, 0x78, 0x0E, 0x3C, 0x1E, 0x1E, 0x3C, 0x0F, 0xF8, 0x07, 0xE0, 0x3F, + 0xFD, 0xFF, 0xF7, 0xFF, 0xF0, 0x06, 0x80, 0x18, 0x00, 0x60, 0x03, 0x00, + 0x0C, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x00, + 0x0C, 0x00, 0x70, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, + 0x1C, 0x00, 0x60, 0x00, 0x0F, 0x83, 0xFC, 0x70, 0xE6, 0x07, 0xC0, 0x3C, + 0x03, 0xC0, 0x3E, 0x03, 0x70, 0x67, 0x8C, 0x3D, 0x81, 0xF0, 0x0F, 0x81, + 0x7C, 0x21, 0xE6, 0x0E, 0xC0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, + 0x06, 0x70, 0xE3, 0xFC, 0x0F, 0x80, 0x07, 0xC0, 0x1F, 0xF0, 0x3C, 0x78, + 0x38, 0x3C, 0x78, 0x1E, 0x70, 0x1E, 0xF0, 0x0E, 0xF0, 0x0F, 0xF0, 0x0F, + 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0x78, 0x0F, 0x3C, 0x3F, + 0x1F, 0xEE, 0x0F, 0x9E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x78, + 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x00, 0x6F, 0xF6, + 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x67, 0xBC, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0xEF, 0x78, 0x42, 0x22, 0x20, 0x00, 0x00, 0xC0, + 0x00, 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x03, 0xF0, + 0x03, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, + 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xC0, + 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x80, + 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0xFC, + 0x00, 0xFC, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x00, 0xF0, + 0x00, 0x30, 0x00, 0x00, 0x1F, 0x81, 0xFF, 0x18, 0x7D, 0x81, 0xEC, 0x07, + 0xF0, 0x3F, 0x81, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, 0x38, 0x01, 0x80, + 0x08, 0x00, 0xC0, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x3C, 0x01, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0x00, + 0x01, 0xFF, 0xC0, 0x07, 0x80, 0xF0, 0x0F, 0x00, 0x38, 0x1C, 0x00, 0x1C, + 0x38, 0x00, 0x0C, 0x38, 0x00, 0x06, 0x70, 0x1E, 0x02, 0x70, 0x3F, 0xE3, + 0xF0, 0x71, 0xE1, 0xE0, 0xE0, 0xC1, 0xE0, 0xC0, 0xC1, 0xE0, 0xC1, 0xC1, + 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0x83, 0xE1, 0x83, 0x82, 0xE1, 0x83, 0x86, + 0x71, 0xC7, 0x8C, 0x70, 0xF9, 0xF8, 0x38, 0xF0, 0xF0, 0x3C, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x07, 0x80, 0x70, 0x03, 0xFF, 0xE0, 0x00, 0x7F, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x5C, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x8E, 0x00, + 0x01, 0x8F, 0x00, 0x01, 0x87, 0x00, 0x03, 0x07, 0x80, 0x03, 0x03, 0x80, + 0x02, 0x03, 0xC0, 0x06, 0x03, 0xC0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, + 0x0C, 0x01, 0xE0, 0x18, 0x00, 0xF0, 0x18, 0x00, 0xF0, 0x30, 0x00, 0x78, + 0x30, 0x00, 0x78, 0x70, 0x00, 0x7C, 0xFC, 0x01, 0xFF, 0xFF, 0xFC, 0x03, + 0xFF, 0xF8, 0x1E, 0x0F, 0xC1, 0xE0, 0x3C, 0x1E, 0x01, 0xE1, 0xE0, 0x1E, + 0x1E, 0x01, 0xE1, 0xE0, 0x1E, 0x1E, 0x03, 0xC1, 0xE0, 0x78, 0x1F, 0xFE, + 0x01, 0xFF, 0xF0, 0x1E, 0x07, 0xC1, 0xE0, 0x1E, 0x1E, 0x00, 0xF1, 0xE0, + 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1E, + 0x07, 0xE3, 0xFF, 0xF8, 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0x08, 0x0F, 0xFF, + 0x60, 0xFC, 0x1F, 0x87, 0xC0, 0x1E, 0x3C, 0x00, 0x38, 0xF0, 0x00, 0x67, + 0x80, 0x01, 0x9E, 0x00, 0x02, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, + 0x00, 0x02, 0x1F, 0x00, 0x38, 0x3F, 0x03, 0x80, 0x7F, 0xFC, 0x00, 0x3F, + 0x80, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x78, 0x3F, 0x80, 0xF0, 0x0F, + 0x81, 0xE0, 0x0F, 0x83, 0xC0, 0x0F, 0x07, 0x80, 0x0F, 0x0F, 0x00, 0x1E, + 0x1E, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, + 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x07, 0x8F, 0x00, 0x1E, 0x1E, + 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xE0, 0xF0, 0x0F, 0x81, 0xE0, + 0x7E, 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x87, 0xFF, + 0xF8, 0x3C, 0x01, 0x83, 0xC0, 0x08, 0x3C, 0x00, 0x83, 0xC0, 0x00, 0x3C, + 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x02, 0x03, 0xC0, 0x60, 0x3F, 0xFE, 0x03, + 0xFF, 0xE0, 0x3C, 0x06, 0x03, 0xC0, 0x20, 0x3C, 0x00, 0x03, 0xC0, 0x00, + 0x3C, 0x00, 0x03, 0xC0, 0x01, 0x3C, 0x00, 0x23, 0xC0, 0x06, 0x3C, 0x01, + 0xE7, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xBF, 0xFF, 0xCF, 0x00, + 0x67, 0x80, 0x13, 0xC0, 0x09, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, + 0x02, 0x1E, 0x03, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xC0, 0x61, 0xE0, 0x10, + 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, + 0x03, 0xC0, 0x03, 0xF0, 0x03, 0xFC, 0x00, 0x00, 0xFE, 0x04, 0x07, 0xFF, + 0xB8, 0x1F, 0x03, 0xF0, 0xF8, 0x01, 0xE3, 0xE0, 0x01, 0xC7, 0x80, 0x01, + 0x9E, 0x00, 0x01, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x00, 0x07, 0x80, 0x07, 0xFF, 0x00, 0x07, 0xDE, 0x00, 0x07, 0xBC, + 0x00, 0x0F, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xF0, + 0x00, 0xF1, 0xF0, 0x01, 0xE1, 0xF0, 0x03, 0xC1, 0xF8, 0x1F, 0x00, 0xFF, + 0xFC, 0x00, 0x3F, 0x80, 0xFF, 0x03, 0xFD, 0xF8, 0x07, 0xE3, 0xC0, 0x0F, + 0x0F, 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, + 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xFF, 0xFF, 0x0F, 0xFF, + 0xFC, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, 0x00, 0x3C, + 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, 0x00, 0x3C, 0x3C, + 0x00, 0xF1, 0xF8, 0x07, 0xEF, 0xF0, 0x3F, 0xC0, 0xFF, 0xBF, 0x0F, 0x07, + 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, + 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xF3, 0xFE, 0x0F, 0xF0, + 0x7E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC6, 0x38, 0xF3, 0x8F, 0xF0, 0x7C, 0x00, 0xFF, 0x07, 0xFC, + 0xFC, 0x03, 0xC0, 0xF0, 0x07, 0x01, 0xE0, 0x1C, 0x03, 0xC0, 0x60, 0x07, + 0x81, 0x80, 0x0F, 0x06, 0x00, 0x1E, 0x18, 0x00, 0x3C, 0x60, 0x00, 0x79, + 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xDF, 0x00, 0x07, 0x8F, + 0x00, 0x0F, 0x0F, 0x00, 0x1E, 0x0F, 0x00, 0x3C, 0x0F, 0x00, 0x78, 0x0F, + 0x00, 0xF0, 0x1F, 0x01, 0xE0, 0x1F, 0x03, 0xC0, 0x1F, 0x0F, 0xC0, 0x3F, + 0x3F, 0xC1, 0xFF, 0x80, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x1E, + 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, + 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, + 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x04, 0xF0, + 0x01, 0x1E, 0x00, 0x63, 0xC0, 0x3C, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 0xFC, + 0x00, 0x03, 0xF9, 0xF0, 0x00, 0x1F, 0x87, 0x80, 0x01, 0xF8, 0x3E, 0x00, + 0x0F, 0xC1, 0xF0, 0x00, 0x5E, 0x0B, 0xC0, 0x06, 0xF0, 0x5E, 0x00, 0x37, + 0x82, 0x78, 0x03, 0x3C, 0x13, 0xC0, 0x19, 0xE0, 0x8F, 0x01, 0x8F, 0x04, + 0x78, 0x0C, 0x78, 0x21, 0xE0, 0xC3, 0xC1, 0x0F, 0x06, 0x1E, 0x08, 0x3C, + 0x60, 0xF0, 0x41, 0xE3, 0x07, 0x82, 0x07, 0xB0, 0x3C, 0x10, 0x3D, 0x81, + 0xE0, 0x81, 0xF8, 0x0F, 0x04, 0x07, 0xC0, 0x78, 0x20, 0x3C, 0x03, 0xC1, + 0x00, 0xE0, 0x1E, 0x1C, 0x06, 0x01, 0xFB, 0xF8, 0x10, 0x1F, 0xE0, 0xFC, + 0x00, 0xFE, 0x78, 0x00, 0x70, 0x78, 0x00, 0x40, 0xF8, 0x00, 0x81, 0xF8, + 0x01, 0x02, 0xF8, 0x02, 0x04, 0xF8, 0x04, 0x08, 0xF0, 0x08, 0x11, 0xF0, + 0x10, 0x21, 0xF0, 0x20, 0x41, 0xF0, 0x40, 0x81, 0xF0, 0x81, 0x01, 0xF1, + 0x02, 0x01, 0xE2, 0x04, 0x03, 0xE4, 0x08, 0x03, 0xE8, 0x10, 0x03, 0xF0, + 0x20, 0x03, 0xE0, 0x40, 0x03, 0xC0, 0x80, 0x03, 0x81, 0x00, 0x07, 0x07, + 0x00, 0x06, 0x3F, 0x80, 0x04, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xFF, 0x00, + 0x3E, 0x0F, 0x80, 0xF0, 0x07, 0x83, 0xC0, 0x07, 0x87, 0x80, 0x07, 0x1E, + 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, + 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, + 0x07, 0xF8, 0x00, 0x0F, 0x78, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xE0, 0x01, + 0xE1, 0xE0, 0x03, 0xC1, 0xE0, 0x0F, 0x01, 0xF0, 0x7C, 0x00, 0xFF, 0xE0, + 0x00, 0x7F, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 0xC1, 0xF0, 0xF0, 0x1E, + 0x3C, 0x07, 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0xCF, + 0x01, 0xF3, 0xC0, 0x78, 0xF0, 0x7C, 0x3F, 0xFE, 0x0F, 0xFE, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1F, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xFF, + 0x00, 0x3E, 0x0F, 0x80, 0xF0, 0x07, 0x83, 0xC0, 0x07, 0x87, 0x80, 0x0F, + 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF0, 0x00, 0x1D, 0xE0, 0x00, 0x3F, + 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, + 0x00, 0x07, 0xF8, 0x00, 0x0F, 0x70, 0x00, 0x1C, 0xF0, 0x00, 0x79, 0xE0, + 0x00, 0xF1, 0xE0, 0x03, 0xC1, 0xC0, 0x07, 0x01, 0xC0, 0x1C, 0x01, 0xE0, + 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xF0, + 0x03, 0xFF, 0xF0, 0x0F, 0x07, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0x78, 0x1E, + 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x3C, 0x07, 0x81, 0xE0, 0x78, + 0x0F, 0x0F, 0x80, 0x7F, 0xF8, 0x03, 0xFE, 0x00, 0x1E, 0x78, 0x00, 0xF1, + 0xE0, 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, 0xE0, 0xF0, 0x0F, 0x03, 0xC0, + 0x78, 0x0F, 0x03, 0xC0, 0x7C, 0x3F, 0x01, 0xF3, 0xFC, 0x07, 0xE0, 0x07, + 0x84, 0x1F, 0xFC, 0x3C, 0x3E, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x70, + 0x02, 0x78, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, + 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, + 0x0F, 0xE0, 0x0F, 0x70, 0x1E, 0x78, 0x3C, 0x4F, 0xF8, 0x43, 0xF0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x7C, 0x0F, 0x03, 0x80, 0xF0, 0x10, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0xFF, 0x01, 0xFD, + 0xF8, 0x01, 0xC3, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, + 0x00, 0x83, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, + 0x83, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, 0x83, + 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, 0x81, 0xE0, + 0x04, 0x07, 0x80, 0x30, 0x0F, 0x81, 0x80, 0x1F, 0xFC, 0x00, 0x1F, 0xC0, + 0x00, 0xFF, 0xC0, 0x7F, 0x3E, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0E, 0x00, + 0x18, 0x0F, 0x00, 0x18, 0x07, 0x00, 0x10, 0x07, 0x80, 0x30, 0x07, 0x80, + 0x30, 0x03, 0xC0, 0x60, 0x03, 0xC0, 0x60, 0x01, 0xE0, 0x40, 0x01, 0xE0, + 0xC0, 0x00, 0xF0, 0xC0, 0x00, 0xF1, 0x80, 0x00, 0x71, 0x80, 0x00, 0x7B, + 0x00, 0x00, 0x3B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0xFF, 0x9F, + 0xF0, 0x3F, 0x9F, 0x03, 0xE0, 0x07, 0x07, 0x80, 0xF0, 0x03, 0x03, 0xC0, + 0x78, 0x01, 0x80, 0xE0, 0x1E, 0x00, 0x80, 0x78, 0x0F, 0x00, 0xC0, 0x1C, + 0x03, 0x80, 0x60, 0x0F, 0x01, 0xE0, 0x20, 0x07, 0x81, 0xF0, 0x30, 0x01, + 0xC0, 0xBC, 0x18, 0x00, 0xF0, 0xDE, 0x08, 0x00, 0x78, 0x67, 0x0C, 0x00, + 0x1E, 0x23, 0xC4, 0x00, 0x0F, 0x31, 0xE6, 0x00, 0x03, 0x90, 0x7B, 0x00, + 0x01, 0xF8, 0x3D, 0x00, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x3C, 0x07, 0xC0, + 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x03, 0x00, 0x70, + 0x00, 0x01, 0x80, 0x10, 0x00, 0x00, 0x80, 0x08, 0x00, 0x7F, 0xE0, 0xFF, + 0x0F, 0xC0, 0x1E, 0x03, 0xE0, 0x0E, 0x00, 0xF0, 0x06, 0x00, 0x3C, 0x06, + 0x00, 0x0F, 0x06, 0x00, 0x07, 0x86, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x7B, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x03, + 0xF0, 0x00, 0x03, 0x78, 0x00, 0x01, 0x9E, 0x00, 0x01, 0x87, 0x80, 0x01, + 0x83, 0xE0, 0x01, 0x80, 0xF0, 0x01, 0x80, 0x3C, 0x01, 0x80, 0x1F, 0x01, + 0xC0, 0x07, 0xC1, 0xE0, 0x03, 0xF3, 0xFE, 0x0F, 0xFE, 0xFF, 0xC0, 0xFF, + 0x7E, 0x00, 0x1C, 0x1E, 0x00, 0x18, 0x1F, 0x00, 0x30, 0x0F, 0x00, 0x60, + 0x07, 0x80, 0x60, 0x03, 0xC0, 0xC0, 0x03, 0xE1, 0x80, 0x01, 0xE1, 0x80, + 0x00, 0xF3, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x7E, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x9C, + 0x00, 0x78, 0xC0, 0x07, 0x84, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x3C, + 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x00, 0x00, 0x78, 0x00, 0x47, 0x80, 0x06, 0x78, 0x00, 0x33, 0x80, + 0x07, 0x3F, 0xFF, 0xFB, 0xFF, 0xFF, 0xC0, 0xFF, 0x83, 0x06, 0x0C, 0x18, + 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0xF0, 0xC0, 0x18, 0x06, 0x01, + 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, 0x0C, + 0x03, 0x80, 0x60, 0x18, 0x07, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, + 0x1C, 0x03, 0xFE, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, + 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x1F, 0xF0, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x76, 0x00, 0xCE, + 0x03, 0x8C, 0x06, 0x1C, 0x1C, 0x18, 0x30, 0x30, 0xE0, 0x31, 0x80, 0x67, + 0x00, 0x6C, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0xE0, 0x70, + 0x18, 0x0C, 0x03, 0x1F, 0x03, 0x8C, 0x38, 0x31, 0xC1, 0x8E, 0x0C, 0x00, + 0x60, 0x0F, 0x01, 0x98, 0x30, 0xC3, 0x86, 0x38, 0x31, 0xC1, 0x8E, 0x0C, + 0x78, 0xE5, 0xFB, 0xCF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0xF8, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x39, + 0xF0, 0x3B, 0xFC, 0x3C, 0x3E, 0x38, 0x0E, 0x38, 0x0F, 0x38, 0x07, 0x38, + 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x06, 0x38, 0x0E, 0x38, + 0x0C, 0x3C, 0x1C, 0x1F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x7F, 0xE3, 0x87, + 0xD8, 0x0F, 0x60, 0x1B, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, + 0x0E, 0x00, 0x3C, 0x01, 0x78, 0x19, 0xFF, 0xC3, 0xFE, 0x03, 0xE0, 0x00, + 0x00, 0x00, 0x1C, 0x00, 0x7C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x07, 0x9C, 0x1F, 0xDC, 0x38, 0x7C, 0x70, + 0x3C, 0x70, 0x1C, 0x60, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, + 0x1C, 0xE0, 0x1C, 0xF0, 0x1C, 0x70, 0x1C, 0x7C, 0x3E, 0x3F, 0xDF, 0x0F, + 0x90, 0x0F, 0x81, 0xFF, 0x08, 0x3C, 0x80, 0xE7, 0xFF, 0x7F, 0xFF, 0x00, + 0x18, 0x00, 0xC0, 0x07, 0x00, 0x38, 0x03, 0xE0, 0x37, 0x83, 0x3F, 0xF0, + 0xFF, 0x03, 0xF0, 0x01, 0xF0, 0x3F, 0xC3, 0x8E, 0x18, 0x00, 0xC0, 0x0E, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x03, 0xFE, 0x1F, 0xF0, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x0E, 0x00, 0x70, 0x07, 0xC0, 0xFF, 0x80, 0x0F, 0xC0, 0x1F, 0xFF, + 0x38, 0xFF, 0x70, 0x70, 0x70, 0x70, 0x70, 0x30, 0x70, 0x30, 0x70, 0x30, + 0x38, 0x20, 0x1C, 0x60, 0x0F, 0x80, 0x10, 0x00, 0x20, 0x00, 0x60, 0x00, + 0x7F, 0xE0, 0x3F, 0xFC, 0x1F, 0xFE, 0x20, 0x06, 0x40, 0x02, 0xC0, 0x02, + 0xC0, 0x04, 0xF0, 0x18, 0x7F, 0xF0, 0x1F, 0x80, 0x00, 0x00, 0x38, 0x00, + 0xF8, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, + 0x38, 0x00, 0x38, 0xF0, 0x3B, 0xF8, 0x3E, 0x3C, 0x3C, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x7C, 0x3E, 0xFE, 0x7F, 0x18, 0x3C, + 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3C, 0x7C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0xFF, 0x03, 0x03, + 0xC1, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xC3, 0xE0, 0x70, + 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, + 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x37, 0x3B, 0xF8, 0xF8, 0x00, 0x00, + 0x1C, 0x00, 0x3E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x3F, 0x8E, 0x0F, 0x07, 0x06, 0x03, + 0x86, 0x01, 0xC4, 0x00, 0xE4, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x1D, 0xC0, + 0x0E, 0x70, 0x07, 0x1C, 0x03, 0x8F, 0x01, 0xC3, 0xC0, 0xE0, 0xF0, 0xF8, + 0x3C, 0xFE, 0x7F, 0x80, 0x00, 0x1C, 0x7C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x3C, 0xFF, 0x38, 0xF0, 0x7C, 0x3E, 0xFE, 0x7F, 0x83, + 0xE3, 0xF0, 0xE0, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, 0x07, 0x01, + 0xC3, 0x81, 0xC0, 0x70, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, 0x07, + 0x01, 0xC3, 0x81, 0xC0, 0x70, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, + 0x07, 0x01, 0xC3, 0x81, 0xE0, 0x73, 0xF9, 0xFC, 0x7F, 0x38, 0xF0, 0xFB, + 0xF8, 0x3E, 0x3C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, + 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, + 0x1C, 0x78, 0x3C, 0xFE, 0x7F, 0x07, 0xE0, 0x1F, 0xF8, 0x3C, 0x7C, 0x78, + 0x3E, 0x70, 0x1E, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, + 0x0F, 0xF8, 0x0F, 0x78, 0x0E, 0x7C, 0x1C, 0x3E, 0x3C, 0x0F, 0xF0, 0x07, + 0xC0, 0x18, 0xF0, 0xFB, 0xFC, 0x3E, 0x1E, 0x38, 0x0E, 0x38, 0x0F, 0x38, + 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x06, 0x38, + 0x0E, 0x38, 0x0C, 0x3E, 0x1C, 0x3B, 0xF8, 0x39, 0xE0, 0x38, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xFF, + 0x00, 0x07, 0xC4, 0x1F, 0xEC, 0x3C, 0x3C, 0x70, 0x1C, 0x70, 0x1C, 0x60, + 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xF0, + 0x1C, 0x70, 0x1C, 0x78, 0x3C, 0x3F, 0xDC, 0x1F, 0x1C, 0x00, 0x1C, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, + 0xFF, 0x19, 0xFF, 0x7C, 0xF3, 0x9C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, + 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x1F, 0x07, 0xF0, 0x3E, + 0x58, 0x7C, 0x0F, 0x03, 0xC0, 0x7C, 0x07, 0x80, 0xF8, 0x1F, 0x81, 0xF8, + 0x1E, 0x03, 0xC0, 0xF0, 0x3E, 0x1A, 0x7C, 0x10, 0x30, 0x70, 0xFE, 0xFE, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x79, + 0x7E, 0x3C, 0xF8, 0x7C, 0x38, 0x3C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x3C, 0x7C, 0x1F, 0xDF, 0x0F, 0x18, 0xFE, 0x1F, + 0x7C, 0x06, 0x38, 0x04, 0x1C, 0x04, 0x1C, 0x0C, 0x0E, 0x08, 0x0E, 0x18, + 0x07, 0x10, 0x07, 0x10, 0x07, 0x20, 0x03, 0xA0, 0x03, 0xE0, 0x01, 0xC0, + 0x01, 0xC0, 0x00, 0x80, 0x00, 0x80, 0xFC, 0x7F, 0x1F, 0x78, 0x3C, 0x06, + 0x38, 0x1C, 0x04, 0x38, 0x1C, 0x04, 0x1C, 0x1C, 0x0C, 0x1C, 0x0E, 0x08, + 0x1C, 0x1E, 0x18, 0x0E, 0x17, 0x10, 0x0E, 0x37, 0x10, 0x07, 0x23, 0x30, + 0x07, 0x63, 0xA0, 0x07, 0x43, 0xE0, 0x03, 0xC1, 0xC0, 0x03, 0x81, 0xC0, + 0x01, 0x80, 0x80, 0x01, 0x00, 0x80, 0x7F, 0x7E, 0x1E, 0x0C, 0x07, 0x8C, + 0x01, 0xC4, 0x00, 0x76, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x03, + 0xE0, 0x01, 0x70, 0x01, 0x1C, 0x01, 0x8F, 0x01, 0x83, 0x80, 0x80, 0xE0, + 0xC0, 0x79, 0xF0, 0xFF, 0xFE, 0x0F, 0x7C, 0x06, 0x38, 0x06, 0x1C, 0x04, + 0x1C, 0x0C, 0x0E, 0x0C, 0x0E, 0x08, 0x0F, 0x18, 0x07, 0x10, 0x07, 0x90, + 0x03, 0xB0, 0x03, 0xA0, 0x01, 0xE0, 0x01, 0xE0, 0x00, 0xC0, 0x00, 0xC0, + 0x00, 0x80, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x7E, 0x00, + 0x7C, 0x00, 0x78, 0x00, 0x7F, 0xF9, 0xFF, 0xE6, 0x07, 0x10, 0x38, 0x00, + 0xE0, 0x07, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xE0, 0x07, + 0x01, 0x38, 0x0D, 0xC0, 0x3F, 0xFF, 0xBF, 0xFE, 0x07, 0x0E, 0x1C, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0x60, + 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, + 0x0E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x38, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x08, 0x06, 0x06, + 0x08, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, + 0x70, 0xE0, 0x3E, 0x00, 0x7F, 0x87, 0xE3, 0xFE, 0x00, 0x7C}; + +const GFXglyph FreeSerif18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 9, 0, 1}, // 0x20 ' ' + {0, 4, 24, 12, 5, -23}, // 0x21 '!' + {12, 8, 9, 14, 3, -23}, // 0x22 '"' + {21, 17, 23, 17, 0, -22}, // 0x23 '#' + {70, 13, 27, 17, 2, -24}, // 0x24 '$' + {114, 25, 23, 29, 2, -22}, // 0x25 '%' + {186, 25, 25, 27, 1, -24}, // 0x26 '&' + {265, 3, 9, 7, 2, -23}, // 0x27 ''' + {269, 9, 30, 12, 2, -23}, // 0x28 '(' + {303, 9, 30, 12, 1, -22}, // 0x29 ')' + {337, 12, 14, 18, 3, -23}, // 0x2A '*' + {358, 16, 18, 20, 2, -17}, // 0x2B '+' + {394, 4, 9, 9, 2, -3}, // 0x2C ',' + {399, 8, 2, 12, 1, -8}, // 0x2D '-' + {401, 4, 4, 9, 2, -3}, // 0x2E '.' + {403, 10, 24, 10, 0, -23}, // 0x2F '/' + {433, 16, 24, 18, 1, -23}, // 0x30 '0' + {481, 10, 24, 18, 3, -23}, // 0x31 '1' + {511, 16, 24, 17, 1, -23}, // 0x32 '2' + {559, 13, 24, 17, 2, -23}, // 0x33 '3' + {598, 16, 23, 18, 0, -22}, // 0x34 '4' + {644, 13, 24, 17, 2, -23}, // 0x35 '5' + {683, 16, 24, 18, 1, -23}, // 0x36 '6' + {731, 14, 23, 18, 1, -22}, // 0x37 '7' + {772, 12, 25, 18, 2, -24}, // 0x38 '8' + {810, 16, 26, 17, 1, -24}, // 0x39 '9' + {862, 4, 17, 9, 2, -16}, // 0x3A ':' + {871, 5, 22, 9, 2, -16}, // 0x3B ';' + {885, 18, 18, 20, 1, -17}, // 0x3C '<' + {926, 18, 9, 20, 1, -12}, // 0x3D '=' + {947, 18, 18, 20, 1, -17}, // 0x3E '>' + {988, 13, 25, 16, 2, -24}, // 0x3F '?' + {1029, 24, 25, 30, 3, -24}, // 0x40 '@' + {1104, 24, 23, 25, 1, -22}, // 0x41 'A' + {1173, 20, 23, 22, 1, -22}, // 0x42 'B' + {1231, 22, 24, 23, 1, -23}, // 0x43 'C' + {1297, 23, 23, 25, 1, -22}, // 0x44 'D' + {1364, 20, 23, 21, 2, -22}, // 0x45 'E' + {1422, 17, 23, 20, 2, -22}, // 0x46 'F' + {1471, 23, 24, 25, 1, -23}, // 0x47 'G' + {1540, 22, 23, 25, 2, -22}, // 0x48 'H' + {1604, 9, 23, 11, 2, -22}, // 0x49 'I' + {1630, 12, 23, 13, 0, -22}, // 0x4A 'J' + {1665, 23, 23, 25, 2, -22}, // 0x4B 'K' + {1732, 19, 23, 21, 2, -22}, // 0x4C 'L' + {1787, 29, 23, 31, 1, -22}, // 0x4D 'M' + {1871, 23, 23, 25, 1, -22}, // 0x4E 'N' + {1938, 23, 24, 25, 1, -23}, // 0x4F 'O' + {2007, 18, 23, 20, 1, -22}, // 0x50 'P' + {2059, 23, 30, 25, 1, -23}, // 0x51 'Q' + {2146, 21, 23, 23, 2, -22}, // 0x52 'R' + {2207, 16, 24, 19, 1, -23}, // 0x53 'S' + {2255, 20, 23, 21, 1, -22}, // 0x54 'T' + {2313, 22, 23, 25, 2, -22}, // 0x55 'U' + {2377, 24, 23, 25, 0, -22}, // 0x56 'V' + {2446, 33, 23, 33, 0, -22}, // 0x57 'W' + {2541, 25, 23, 25, 0, -22}, // 0x58 'X' + {2613, 24, 23, 25, 1, -22}, // 0x59 'Y' + {2682, 21, 23, 21, 0, -22}, // 0x5A 'Z' + {2743, 7, 28, 12, 3, -22}, // 0x5B '[' + {2768, 10, 24, 10, 0, -23}, // 0x5C '\' + {2798, 7, 28, 12, 2, -22}, // 0x5D ']' + {2823, 15, 13, 16, 1, -22}, // 0x5E '^' + {2848, 18, 2, 17, 0, 3}, // 0x5F '_' + {2853, 8, 6, 9, 1, -23}, // 0x60 '`' + {2859, 13, 16, 15, 2, -15}, // 0x61 'a' + {2885, 16, 25, 17, 1, -24}, // 0x62 'b' + {2935, 14, 16, 16, 1, -15}, // 0x63 'c' + {2963, 16, 25, 17, 1, -24}, // 0x64 'd' + {3013, 13, 16, 16, 1, -15}, // 0x65 'e' + {3039, 13, 25, 13, 0, -24}, // 0x66 'f' + {3080, 16, 24, 16, 1, -15}, // 0x67 'g' + {3128, 16, 25, 17, 1, -24}, // 0x68 'h' + {3178, 8, 24, 10, 0, -23}, // 0x69 'i' + {3202, 9, 32, 12, 0, -23}, // 0x6A 'j' + {3238, 17, 25, 18, 1, -24}, // 0x6B 'k' + {3292, 8, 25, 9, 0, -24}, // 0x6C 'l' + {3317, 26, 16, 27, 1, -15}, // 0x6D 'm' + {3369, 16, 16, 17, 1, -15}, // 0x6E 'n' + {3401, 16, 16, 17, 1, -15}, // 0x6F 'o' + {3433, 16, 24, 17, 1, -15}, // 0x70 'p' + {3481, 16, 24, 17, 1, -15}, // 0x71 'q' + {3529, 11, 16, 12, 1, -15}, // 0x72 'r' + {3551, 10, 16, 13, 1, -15}, // 0x73 's' + {3571, 8, 19, 10, 2, -18}, // 0x74 't' + {3590, 16, 16, 17, 1, -15}, // 0x75 'u' + {3622, 16, 16, 16, 0, -15}, // 0x76 'v' + {3654, 24, 16, 24, 0, -15}, // 0x77 'w' + {3702, 17, 16, 17, 0, -15}, // 0x78 'x' + {3736, 16, 24, 16, 0, -15}, // 0x79 'y' + {3784, 14, 16, 15, 0, -15}, // 0x7A 'z' + {3812, 8, 30, 17, 3, -23}, // 0x7B '{' + {3842, 2, 24, 7, 2, -23}, // 0x7C '|' + {3848, 8, 30, 17, 6, -22}, // 0x7D '}' + {3878, 16, 4, 17, 1, -10}}; // 0x7E '~' + +const GFXfont FreeSerif18pt7b PROGMEM = {(uint8_t *)FreeSerif18pt7bBitmaps, + (GFXglyph *)FreeSerif18pt7bGlyphs, + 0x20, 0x7E, 42}; + +// Approx. 4558 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h new file mode 100644 index 0000000..cac1999 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h @@ -0,0 +1,692 @@ +#pragma once +#include + +const uint8_t FreeSerif24pt7bBitmaps[] PROGMEM = { + 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x61, 0x08, + 0x42, 0x10, 0x84, 0x00, 0x00, 0xEF, 0xFF, 0xEE, 0x60, 0x6F, 0x0F, 0xF0, + 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, + 0x66, 0x06, 0x00, 0xE0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x07, + 0x03, 0x80, 0x0E, 0x06, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x38, 0x00, 0xE0, + 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC1, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, + 0xF0, 0x18, 0x0C, 0x00, 0x70, 0x38, 0x00, 0xE0, 0x70, 0x01, 0xC0, 0xE0, + 0x03, 0x81, 0xC0, 0x07, 0x03, 0x80, 0x0C, 0x06, 0x07, 0xFF, 0xFF, 0xEF, + 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x06, + 0x03, 0x80, 0x0C, 0x06, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0, + 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x01, 0xFC, 0x01, 0xE4, 0xF8, 0x70, 0x87, 0x9C, 0x10, + 0x77, 0x02, 0x06, 0xE0, 0x40, 0xDC, 0x08, 0x0B, 0x81, 0x00, 0x78, 0x20, + 0x07, 0x84, 0x00, 0xFC, 0x80, 0x0F, 0xF0, 0x00, 0xFE, 0x00, 0x07, 0xF0, + 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x05, 0xFC, 0x00, 0x8F, + 0x80, 0x10, 0xF8, 0x02, 0x0F, 0x00, 0x40, 0xF0, 0x08, 0x1E, 0x01, 0x03, + 0xE0, 0x20, 0x7C, 0x04, 0x0F, 0xC0, 0x83, 0xBC, 0x10, 0xE3, 0xE2, 0x78, + 0x3F, 0xFE, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x01, 0xF0, 0x00, 0xC0, 0x03, 0xFC, 0x01, 0xE0, 0x03, 0xC7, 0x81, 0xE0, + 0x03, 0xC0, 0x7F, 0x60, 0x03, 0xC0, 0x20, 0x70, 0x01, 0xE0, 0x10, 0x30, + 0x01, 0xE0, 0x08, 0x38, 0x00, 0xE0, 0x04, 0x18, 0x00, 0xF0, 0x02, 0x1C, + 0x00, 0x78, 0x02, 0x0C, 0x00, 0x38, 0x01, 0x0E, 0x00, 0x1C, 0x01, 0x86, + 0x00, 0x0E, 0x00, 0x86, 0x00, 0x07, 0x00, 0x87, 0x03, 0xE1, 0x80, 0xC3, + 0x07, 0xFC, 0xE1, 0xC3, 0x87, 0xC6, 0x3F, 0xC1, 0x87, 0x81, 0x8F, 0x81, + 0xC7, 0x80, 0x40, 0x00, 0xC3, 0xC0, 0x20, 0x00, 0xE3, 0xC0, 0x10, 0x00, + 0x61, 0xC0, 0x08, 0x00, 0x61, 0xE0, 0x04, 0x00, 0x70, 0xF0, 0x06, 0x00, + 0x30, 0x70, 0x02, 0x00, 0x38, 0x38, 0x03, 0x00, 0x18, 0x1C, 0x01, 0x00, + 0x1C, 0x0E, 0x01, 0x80, 0x0C, 0x07, 0x01, 0x80, 0x0E, 0x01, 0xC3, 0x80, + 0x06, 0x00, 0x7F, 0x80, 0x06, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x70, 0xE0, 0x00, + 0x00, 0xE0, 0x60, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x30, 0x00, + 0x01, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x70, 0x00, + 0x01, 0xE0, 0xE0, 0x00, 0x01, 0xE1, 0xC0, 0x00, 0x00, 0xF3, 0x80, 0x00, + 0x00, 0xFF, 0x0F, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0xF8, 0x01, 0xE0, + 0x01, 0xFC, 0x01, 0xC0, 0x07, 0x7C, 0x01, 0xC0, 0x0F, 0x3E, 0x01, 0x80, + 0x1E, 0x3E, 0x03, 0x00, 0x3C, 0x1F, 0x03, 0x00, 0x7C, 0x1F, 0x06, 0x00, + 0x78, 0x0F, 0x86, 0x00, 0x78, 0x07, 0xCC, 0x00, 0xF8, 0x07, 0xE8, 0x00, + 0xF8, 0x03, 0xF8, 0x00, 0xF8, 0x01, 0xF0, 0x00, 0xF8, 0x01, 0xF8, 0x00, + 0xFC, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFE, 0x01, 0x7E, 0x03, 0xBF, 0x86, + 0x7F, 0x0F, 0x1F, 0xFE, 0x3F, 0xFC, 0x0F, 0xF8, 0x0F, 0xE0, 0x03, 0xF0, + 0x6F, 0xFF, 0xFF, 0x66, 0x66, 0x66, 0x00, 0x10, 0x02, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x38, 0x03, 0x80, + 0x78, 0x07, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x07, 0x00, 0x70, 0x07, 0x80, + 0x38, 0x03, 0x80, 0x38, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x06, 0x00, 0x30, + 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, + 0x0C, 0x00, 0x60, 0x07, 0x00, 0x30, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x1C, + 0x01, 0xE0, 0x0E, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0E, 0x00, 0xE0, 0x1E, + 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x70, 0x0E, 0x00, 0xC0, + 0x18, 0x03, 0x00, 0x40, 0x08, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, + 0x43, 0x86, 0xE1, 0x0F, 0xF1, 0x1F, 0xF9, 0x3E, 0x3D, 0x78, 0x07, 0xC0, + 0x01, 0x00, 0x07, 0xC0, 0x19, 0x30, 0xF9, 0x1E, 0xF1, 0x0F, 0xE1, 0x07, + 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x38, 0x00, 0x00, + 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, + 0x00, 0x00, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, + 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, + 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0x73, 0xEF, 0xFF, 0x7C, 0x10, 0x42, 0x08, 0xC6, 0x00, + 0xFF, 0xFF, 0xFC, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x1C, 0x00, 0xE0, 0x03, + 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xE0, 0x03, + 0x80, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x07, + 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x07, + 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x38, 0x00, 0x00, 0xFC, 0x00, 0x0E, 0x1C, 0x00, 0x70, 0x38, 0x03, + 0x80, 0x70, 0x1E, 0x01, 0xE0, 0xF0, 0x03, 0x83, 0xC0, 0x0F, 0x0F, 0x00, + 0x3C, 0x7C, 0x00, 0xF9, 0xE0, 0x01, 0xE7, 0x80, 0x07, 0xBE, 0x00, 0x1F, + 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8, + 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, + 0x7F, 0xE0, 0x01, 0xF7, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x7C, 0x00, 0xF8, + 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x07, 0x00, 0x38, 0x1E, 0x01, 0xE0, 0x38, + 0x07, 0x00, 0x70, 0x38, 0x00, 0xE1, 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x80, + 0x1C, 0x03, 0xE0, 0x7F, 0x0C, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, + 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, + 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3F, + 0x0F, 0xFF, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x07, 0xFF, 0xE0, 0x70, 0x3F, + 0x83, 0x00, 0x7C, 0x30, 0x01, 0xF1, 0x00, 0x0F, 0x98, 0x00, 0x3C, 0x80, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x1C, + 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, + 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x43, 0x00, + 0x02, 0x30, 0x00, 0x23, 0xFF, 0xFF, 0x3F, 0xFF, 0xF3, 0xFF, 0xFF, 0x80, + 0x03, 0xF8, 0x03, 0xFF, 0x01, 0x83, 0xE0, 0x80, 0x3C, 0x40, 0x0F, 0x10, + 0x01, 0xC8, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, + 0x80, 0x00, 0xC0, 0x00, 0x78, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x01, 0xFE, + 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xC0, + 0x00, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, + 0x30, 0x00, 0x0C, 0x70, 0x06, 0x3F, 0x07, 0x0F, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x01, + 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xDC, 0x00, 0x0C, 0xE0, 0x00, 0x47, 0x00, + 0x06, 0x38, 0x00, 0x61, 0xC0, 0x06, 0x0E, 0x00, 0x30, 0x70, 0x03, 0x03, + 0x80, 0x30, 0x1C, 0x01, 0x80, 0xE0, 0x18, 0x07, 0x01, 0x80, 0x38, 0x08, + 0x01, 0xC0, 0xC0, 0x0E, 0x0C, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE0, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, + 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x00, + 0x40, 0x7F, 0xF8, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0xC0, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0, + 0x3F, 0xFE, 0x00, 0xFF, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7C, + 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x1C, + 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x30, + 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x71, 0xE0, 0x1C, 0x3F, 0x07, 0x07, + 0xFF, 0x80, 0x3F, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, + 0x07, 0xC7, 0xE0, 0x3E, 0xFF, 0xC3, 0xF8, 0x3F, 0x1F, 0x80, 0x7C, 0xF8, + 0x03, 0xF7, 0xC0, 0x0F, 0xBE, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, + 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x00, 0x1F, 0x78, 0x00, 0xFB, 0xE0, + 0x07, 0x9F, 0x00, 0x3C, 0x78, 0x03, 0xE3, 0xE0, 0x1E, 0x0F, 0x81, 0xE0, + 0x3E, 0x1E, 0x00, 0xFF, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0xFF, 0xF3, 0xFF, + 0xFF, 0x3F, 0xFF, 0xE7, 0x00, 0x0E, 0x40, 0x00, 0xEC, 0x00, 0x1C, 0x80, + 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, + 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x38, + 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, + 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xC0, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC1, 0xE0, 0xC0, 0x1C, 0x70, + 0x07, 0x18, 0x00, 0xEE, 0x00, 0x3B, 0x80, 0x0E, 0xF0, 0x03, 0xBC, 0x00, + 0xE7, 0x80, 0x71, 0xF0, 0x38, 0x3E, 0x1C, 0x07, 0xEE, 0x00, 0xFE, 0x00, + 0x1F, 0xC0, 0x03, 0xF8, 0x03, 0xFF, 0x01, 0xC7, 0xE0, 0xE0, 0xFC, 0x70, + 0x0F, 0x98, 0x01, 0xEE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x01, 0xF8, 0x00, + 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0x70, 0x03, 0x9E, 0x00, 0xE3, 0xE0, 0xF0, + 0x7F, 0xF0, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x03, 0xC3, + 0xE0, 0x3C, 0x0F, 0x83, 0xC0, 0x3C, 0x3E, 0x00, 0xF1, 0xE0, 0x07, 0xCF, + 0x00, 0x3E, 0xF8, 0x00, 0xF7, 0xC0, 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x01, + 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7C, + 0x00, 0xF9, 0xF0, 0x0F, 0xC7, 0xE1, 0xFC, 0x1F, 0xF9, 0xE0, 0x3F, 0x1F, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, + 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, + 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x00, 0x77, 0xFF, 0xF7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0x39, 0xF7, + 0xDF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xEF, + 0xFF, 0x7C, 0x10, 0x42, 0x08, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, + 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xE0, + 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, + 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, + 0x0F, 0xFE, 0x0C, 0x1F, 0x88, 0x03, 0xEC, 0x01, 0xF7, 0x00, 0x7F, 0xC0, + 0x3F, 0xE0, 0x1F, 0x70, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xE0, + 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x70, 0x00, 0x30, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x03, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, + 0xFF, 0x00, 0x00, 0xFC, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x07, 0xC0, + 0x00, 0x30, 0x0F, 0x00, 0x00, 0x18, 0x1E, 0x00, 0x00, 0x0C, 0x1E, 0x00, + 0x00, 0x04, 0x3C, 0x00, 0xF8, 0x06, 0x3C, 0x01, 0xFD, 0xC2, 0x78, 0x03, + 0xC7, 0xC3, 0x78, 0x07, 0x07, 0x81, 0xF0, 0x0E, 0x03, 0x81, 0xF0, 0x0E, + 0x03, 0x81, 0xF0, 0x1C, 0x07, 0x81, 0xF0, 0x1C, 0x07, 0x01, 0xF0, 0x38, + 0x07, 0x01, 0xF0, 0x38, 0x07, 0x03, 0xF0, 0x38, 0x0F, 0x02, 0xF0, 0x38, + 0x0E, 0x02, 0xF0, 0x38, 0x1E, 0x04, 0x78, 0x38, 0x1E, 0x0C, 0x78, 0x1C, + 0x6E, 0x18, 0x38, 0x1F, 0xC7, 0xF0, 0x3C, 0x0F, 0x03, 0xE0, 0x1E, 0x00, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x60, 0x00, 0xFC, 0x03, 0xE0, 0x00, 0x3F, + 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x0D, + 0xF0, 0x00, 0x00, 0x0D, 0xF0, 0x00, 0x00, 0x18, 0xF0, 0x00, 0x00, 0x18, + 0xF8, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x30, 0x7C, 0x00, 0x00, 0x30, + 0x7C, 0x00, 0x00, 0x60, 0x3E, 0x00, 0x00, 0x60, 0x3E, 0x00, 0x00, 0xE0, + 0x1E, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x01, 0x80, + 0x0F, 0x80, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0x00, + 0x07, 0xC0, 0x07, 0x00, 0x07, 0xC0, 0x06, 0x00, 0x03, 0xE0, 0x06, 0x00, + 0x03, 0xE0, 0x0E, 0x00, 0x01, 0xF0, 0x0C, 0x00, 0x01, 0xF0, 0x1C, 0x00, + 0x01, 0xF8, 0x3C, 0x00, 0x01, 0xF8, 0x7E, 0x00, 0x01, 0xFC, 0xFF, 0x80, + 0x0F, 0xFF, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x1F, 0x01, 0xF8, + 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF8, 0x0F, 0x80, 0x1F, 0x81, 0xF0, + 0x01, 0xF0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x07, 0xC0, 0xF8, 0x00, 0xF8, + 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0x7C, 0x01, 0xF0, 0x0F, 0x80, + 0xFC, 0x01, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xC0, 0x07, 0xC0, 0x7F, 0x00, + 0xF8, 0x01, 0xF0, 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x03, 0xE0, 0x7C, 0x00, + 0x3E, 0x0F, 0x80, 0x07, 0xC1, 0xF0, 0x00, 0xF8, 0x3E, 0x00, 0x1F, 0x07, + 0xC0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x07, + 0xC0, 0x7C, 0x07, 0xF0, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x00, 0x00, + 0x1F, 0xF0, 0x20, 0x07, 0xFF, 0xEE, 0x01, 0xF8, 0x1F, 0xE0, 0x3E, 0x00, + 0x7E, 0x07, 0x80, 0x01, 0xE0, 0xF0, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xE3, + 0xE0, 0x00, 0x06, 0x3C, 0x00, 0x00, 0x67, 0xC0, 0x00, 0x02, 0x7C, 0x00, + 0x00, 0x27, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x02, 0x0F, 0x80, 0x00, 0xE0, 0x7E, 0x00, 0x1C, 0x03, 0xF8, 0x0F, 0x00, + 0x0F, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, + 0xFF, 0xF8, 0x00, 0x3E, 0x03, 0xFC, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xF8, + 0x00, 0x7E, 0x01, 0xF0, 0x00, 0x7E, 0x03, 0xE0, 0x00, 0x7C, 0x07, 0xC0, + 0x00, 0x7C, 0x0F, 0x80, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF8, 0x3E, 0x00, + 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xF0, 0xF8, 0x00, 0x03, 0xE1, 0xF0, 0x00, + 0x07, 0xC3, 0xE0, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x1F, 0x0F, 0x80, 0x00, + 0x3E, 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, + 0xF0, 0xF8, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x1E, + 0x07, 0xC0, 0x00, 0x7C, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x03, 0xE0, + 0x3E, 0x00, 0x1F, 0x80, 0x7C, 0x00, 0x7C, 0x00, 0xF8, 0x0F, 0xF0, 0x07, + 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, + 0xFF, 0xFF, 0xE0, 0x7C, 0x00, 0x1C, 0x0F, 0x80, 0x01, 0x81, 0xF0, 0x00, + 0x30, 0x3E, 0x00, 0x02, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x20, 0x0F, 0x80, 0x04, + 0x01, 0xF0, 0x01, 0x80, 0x3E, 0x00, 0x70, 0x07, 0xFF, 0xFE, 0x00, 0xFF, + 0xFF, 0xC0, 0x1F, 0x00, 0x38, 0x03, 0xE0, 0x03, 0x00, 0x7C, 0x00, 0x20, + 0x0F, 0x80, 0x04, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0xF8, 0x00, 0x03, 0x1F, 0x00, 0x00, 0x43, 0xE0, 0x00, 0x18, + 0x7C, 0x00, 0x07, 0x0F, 0x80, 0x01, 0xC1, 0xF0, 0x00, 0xF8, 0x7F, 0xFF, + 0xFF, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, + 0x00, 0x07, 0x1F, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x1F, 0x00, 0x01, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x08, 0x1F, 0x00, 0x08, 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x38, 0x1F, + 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x1F, 0x00, 0x38, 0x1F, 0x00, 0x18, 0x1F, + 0x00, 0x08, 0x1F, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0xFF, + 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x00, 0xFF, 0xFE, 0x70, 0x07, 0xE0, + 0x1F, 0xE0, 0x1F, 0x00, 0x0F, 0xC0, 0x78, 0x00, 0x07, 0x81, 0xE0, 0x00, + 0x07, 0x07, 0xC0, 0x00, 0x0E, 0x1F, 0x00, 0x00, 0x0C, 0x3E, 0x00, 0x00, + 0x08, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, + 0x7C, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x01, 0xFD, 0xF0, 0x00, 0x01, 0xF3, + 0xE0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x0F, 0x8F, + 0x80, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x7C, 0x3E, + 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xE0, 0xFC, + 0x00, 0x07, 0xC0, 0xFC, 0x00, 0x0F, 0x80, 0x7C, 0x00, 0x3F, 0x00, 0x7F, + 0x01, 0xFC, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xE0, + 0x1F, 0xFC, 0xFE, 0x00, 0x1F, 0xC1, 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, + 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E, + 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, + 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, + 0x00, 0x0F, 0x81, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, + 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, + 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E, + 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, + 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0xFE, + 0x00, 0x1F, 0xCF, 0xFE, 0x01, 0xFF, 0xC0, 0xFF, 0xF8, 0xFE, 0x03, 0xE0, + 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, + 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, + 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, + 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x0F, 0xE3, 0xFF, 0xE0, 0x0F, 0xFF, + 0x80, 0xFE, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, + 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, + 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, + 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3C, 0x0E, 0x1E, 0x0F, 0x8F, 0x07, + 0xCF, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0xFF, 0xF8, 0x3F, 0xFC, 0x3F, 0xC0, + 0x07, 0xE0, 0x0F, 0x80, 0x07, 0x80, 0x0F, 0x80, 0x07, 0x00, 0x0F, 0x80, + 0x0E, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x38, 0x00, 0x0F, 0x80, + 0x70, 0x00, 0x0F, 0x80, 0xE0, 0x00, 0x0F, 0x81, 0xC0, 0x00, 0x0F, 0x83, + 0x80, 0x00, 0x0F, 0x87, 0x00, 0x00, 0x0F, 0x9E, 0x00, 0x00, 0x0F, 0xBC, + 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x0F, 0xDF, + 0x80, 0x00, 0x0F, 0x8F, 0xC0, 0x00, 0x0F, 0x87, 0xE0, 0x00, 0x0F, 0x83, + 0xF0, 0x00, 0x0F, 0x81, 0xF8, 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x0F, 0x80, + 0x7E, 0x00, 0x0F, 0x80, 0x3F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x0F, 0x80, + 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, 0x0F, 0x80, 0x07, 0xE0, 0x0F, 0x80, + 0x07, 0xF0, 0x1F, 0xC0, 0x07, 0xFC, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF0, + 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x7C, 0x00, 0x01, 0x1F, 0x00, 0x00, 0xC7, 0xC0, 0x00, 0x21, 0xF0, + 0x00, 0x18, 0x7C, 0x00, 0x0E, 0x1F, 0x00, 0x1F, 0x8F, 0xFF, 0xFF, 0xCF, + 0xFF, 0xFF, 0xF0, 0xFF, 0x80, 0x00, 0x03, 0xFE, 0x7F, 0x80, 0x00, 0x07, + 0xF0, 0x3F, 0x00, 0x00, 0x1F, 0xC0, 0x7E, 0x00, 0x00, 0x3F, 0x80, 0xFE, + 0x00, 0x00, 0xFF, 0x01, 0xFC, 0x00, 0x01, 0xBE, 0x03, 0x7C, 0x00, 0x03, + 0x7C, 0x06, 0xF8, 0x00, 0x0E, 0xF8, 0x0D, 0xF8, 0x00, 0x19, 0xF0, 0x19, + 0xF0, 0x00, 0x73, 0xE0, 0x33, 0xF0, 0x00, 0xC7, 0xC0, 0x63, 0xE0, 0x03, + 0x8F, 0x80, 0xC7, 0xE0, 0x06, 0x1F, 0x01, 0x87, 0xC0, 0x1C, 0x3E, 0x03, + 0x0F, 0xC0, 0x30, 0x7C, 0x06, 0x0F, 0x80, 0x60, 0xF8, 0x0C, 0x1F, 0x81, + 0x81, 0xF0, 0x18, 0x1F, 0x03, 0x03, 0xE0, 0x30, 0x3F, 0x0C, 0x07, 0xC0, + 0x60, 0x3E, 0x18, 0x0F, 0x80, 0xC0, 0x7C, 0x70, 0x1F, 0x01, 0x80, 0x7C, + 0xC0, 0x3E, 0x03, 0x00, 0xFB, 0x80, 0x7C, 0x06, 0x00, 0xFE, 0x00, 0xF8, + 0x0C, 0x01, 0xFC, 0x01, 0xF0, 0x18, 0x03, 0xF0, 0x03, 0xE0, 0x30, 0x03, + 0xE0, 0x07, 0xC0, 0x60, 0x07, 0x80, 0x0F, 0x81, 0xE0, 0x07, 0x00, 0x1F, + 0x07, 0xE0, 0x0C, 0x00, 0xFF, 0x3F, 0xF0, 0x08, 0x07, 0xFF, 0x80, 0xFF, + 0x00, 0x03, 0xFF, 0x3F, 0x80, 0x00, 0xFC, 0x1F, 0xC0, 0x00, 0x78, 0x0F, + 0xC0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, 0x0F, 0xF0, 0x00, 0x30, 0x0D, + 0xF8, 0x00, 0x30, 0x0D, 0xFC, 0x00, 0x30, 0x0C, 0xFC, 0x00, 0x30, 0x0C, + 0x7E, 0x00, 0x30, 0x0C, 0x3F, 0x00, 0x30, 0x0C, 0x1F, 0x80, 0x30, 0x0C, + 0x1F, 0xC0, 0x30, 0x0C, 0x0F, 0xE0, 0x30, 0x0C, 0x07, 0xE0, 0x30, 0x0C, + 0x03, 0xF0, 0x30, 0x0C, 0x01, 0xF8, 0x30, 0x0C, 0x01, 0xFC, 0x30, 0x0C, + 0x00, 0xFE, 0x30, 0x0C, 0x00, 0x7E, 0x30, 0x0C, 0x00, 0x3F, 0x30, 0x0C, + 0x00, 0x1F, 0xB0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, + 0x00, 0x07, 0xF0, 0x0C, 0x00, 0x03, 0xF0, 0x0C, 0x00, 0x01, 0xF0, 0x0C, + 0x00, 0x00, 0xF0, 0x1E, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x70, 0xFF, + 0xC0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xE0, 0x00, 0x03, + 0xFF, 0xF0, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, + 0x07, 0xC0, 0x7C, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x00, + 0x7C, 0x3C, 0x00, 0x00, 0xF1, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x0F, + 0x9E, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xFF, + 0x80, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xE0, + 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, + 0x00, 0x7D, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00, + 0x3E, 0x3C, 0x00, 0x00, 0xF0, 0xF8, 0x00, 0x07, 0xC1, 0xE0, 0x00, 0x1E, + 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0x80, 0x07, 0xC0, 0x1F, 0x00, 0x3E, 0x00, + 0x1F, 0x03, 0xE0, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0xFF, + 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x7C, 0x1F, 0xC0, 0xF8, 0x07, 0xC1, 0xF0, + 0x07, 0xC3, 0xE0, 0x0F, 0x87, 0xC0, 0x0F, 0x8F, 0x80, 0x1F, 0x1F, 0x00, + 0x3E, 0x3E, 0x00, 0x7C, 0x7C, 0x00, 0xF8, 0xF8, 0x01, 0xF1, 0xF0, 0x07, + 0xC3, 0xE0, 0x0F, 0x87, 0xC0, 0x3E, 0x0F, 0x81, 0xF8, 0x1F, 0xFF, 0xC0, + 0x3F, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xF0, + 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFF, 0xF8, + 0x00, 0x07, 0xC0, 0xF8, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x7C, + 0x03, 0xE0, 0x00, 0x7C, 0x07, 0x80, 0x00, 0x78, 0x1F, 0x00, 0x00, 0xF8, + 0x3C, 0x00, 0x00, 0xF0, 0xF8, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x03, 0xE3, + 0xC0, 0x00, 0x03, 0xCF, 0x80, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x0F, 0xBE, + 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x3E, 0xF8, 0x00, 0x00, 0x7D, 0xF0, + 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x03, 0xEF, 0x80, + 0x00, 0x07, 0xCF, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, + 0x00, 0x7C, 0x3C, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xE0, 0x78, 0x00, + 0x0F, 0x80, 0x78, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x78, 0x00, 0x7C, 0x03, + 0xE0, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x1F, + 0x03, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x03, + 0xE0, 0x1F, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xE0, 0x1F, 0x00, 0x3E, 0x01, + 0xF0, 0x03, 0xE0, 0x1F, 0x00, 0x3E, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, + 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x07, 0xF0, 0x01, 0xFF, 0xFC, 0x00, + 0x1F, 0xFE, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x1F, 0x1F, 0x80, 0x01, 0xF0, + 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x03, 0xF0, + 0x01, 0xF0, 0x1F, 0x80, 0x1F, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F, + 0x00, 0x7E, 0x01, 0xF0, 0x03, 0xF0, 0x1F, 0x00, 0x1F, 0x83, 0xF8, 0x00, + 0xFC, 0xFF, 0xF0, 0x0F, 0xF0, 0x03, 0xF0, 0x20, 0x7F, 0xF3, 0x07, 0xC1, + 0xF8, 0x78, 0x03, 0xC3, 0x80, 0x0E, 0x3C, 0x00, 0x31, 0xE0, 0x01, 0xCF, + 0x00, 0x06, 0x7C, 0x00, 0x33, 0xE0, 0x01, 0x9F, 0x80, 0x00, 0x7E, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0xC0, 0x01, + 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7F, + 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, + 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xEF, 0x00, 0x1F, 0x3C, 0x01, 0xF1, + 0xF8, 0x1F, 0x0C, 0xFF, 0xF0, 0x40, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x7C, 0x07, 0xF0, 0x0F, 0x80, 0x3C, 0x01, 0xF0, + 0x07, 0x00, 0x3E, 0x00, 0x60, 0x07, 0xC0, 0x08, 0x00, 0xF8, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0x3F, 0xE0, 0x00, + 0xFC, 0x0F, 0x80, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x20, 0x07, 0xC0, 0x00, + 0x60, 0x07, 0xC0, 0x00, 0x60, 0x03, 0xE0, 0x00, 0xC0, 0x03, 0xF0, 0x01, + 0xC0, 0x01, 0xFC, 0x07, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xF8, + 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0x3F, 0xC0, 0x00, 0x7E, 0x0F, 0x80, 0x00, + 0x3C, 0x0F, 0xC0, 0x00, 0x38, 0x07, 0xC0, 0x00, 0x38, 0x07, 0xC0, 0x00, + 0x30, 0x03, 0xE0, 0x00, 0x70, 0x03, 0xE0, 0x00, 0x60, 0x01, 0xF0, 0x00, + 0x60, 0x01, 0xF0, 0x00, 0xE0, 0x01, 0xF8, 0x00, 0xC0, 0x00, 0xF8, 0x01, + 0xC0, 0x00, 0xF8, 0x01, 0x80, 0x00, 0x7C, 0x01, 0x80, 0x00, 0x7C, 0x03, + 0x80, 0x00, 0x3E, 0x03, 0x00, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x1F, 0x06, + 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x1F, 0x8E, 0x00, 0x00, 0x0F, 0x8C, + 0x00, 0x00, 0x0F, 0x9C, 0x00, 0x00, 0x07, 0xD8, 0x00, 0x00, 0x07, 0xD8, + 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xE0, + 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xF1, 0xFF, + 0xF0, 0x1F, 0xF3, 0xF8, 0x07, 0xF8, 0x00, 0x7C, 0x1F, 0x80, 0x3F, 0x00, + 0x03, 0x80, 0xF8, 0x01, 0xF0, 0x00, 0x30, 0x0F, 0x80, 0x1F, 0x00, 0x03, + 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x30, 0x07, 0xC0, 0x0F, 0x80, 0x06, 0x00, + 0x3E, 0x00, 0x7C, 0x00, 0x60, 0x03, 0xE0, 0x07, 0xC0, 0x06, 0x00, 0x3E, + 0x00, 0x7C, 0x00, 0xC0, 0x01, 0xF0, 0x07, 0xE0, 0x0C, 0x00, 0x1F, 0x00, + 0xFE, 0x01, 0xC0, 0x01, 0xF0, 0x0D, 0xE0, 0x18, 0x00, 0x0F, 0x80, 0xDF, + 0x01, 0x80, 0x00, 0xF8, 0x19, 0xF0, 0x30, 0x00, 0x07, 0xC1, 0x8F, 0x83, + 0x00, 0x00, 0x7C, 0x38, 0xF8, 0x30, 0x00, 0x07, 0xC3, 0x0F, 0x86, 0x00, + 0x00, 0x3E, 0x30, 0x7C, 0x60, 0x00, 0x03, 0xE7, 0x07, 0xCE, 0x00, 0x00, + 0x3E, 0x60, 0x3E, 0xC0, 0x00, 0x01, 0xF6, 0x03, 0xEC, 0x00, 0x00, 0x1F, + 0xE0, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0xC0, + 0x1F, 0x80, 0x00, 0x00, 0xF8, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x0F, + 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x20, 0x00, 0x7F, 0xFE, 0x03, 0xFF, 0x8F, 0xF8, 0x00, + 0x7E, 0x01, 0xFC, 0x00, 0x1C, 0x00, 0x7E, 0x00, 0x1C, 0x00, 0x1F, 0x00, + 0x0C, 0x00, 0x07, 0xC0, 0x0E, 0x00, 0x03, 0xF0, 0x0E, 0x00, 0x00, 0xF8, + 0x0E, 0x00, 0x00, 0x3E, 0x06, 0x00, 0x00, 0x1F, 0x86, 0x00, 0x00, 0x07, + 0xC7, 0x00, 0x00, 0x01, 0xF7, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x3F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x03, 0x9F, 0x00, 0x00, + 0x01, 0x8F, 0xC0, 0x00, 0x01, 0x83, 0xF0, 0x00, 0x01, 0xC0, 0xF8, 0x00, + 0x01, 0xC0, 0x7E, 0x00, 0x01, 0xC0, 0x1F, 0x80, 0x01, 0xC0, 0x07, 0xC0, + 0x00, 0xC0, 0x03, 0xF0, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0xE0, 0x00, 0x7F, + 0x00, 0xF0, 0x00, 0x1F, 0x80, 0xFC, 0x00, 0x1F, 0xF3, 0xFF, 0x80, 0x7F, + 0xFE, 0xFF, 0xF8, 0x03, 0xFF, 0x3F, 0xE0, 0x00, 0x7C, 0x1F, 0xC0, 0x00, + 0x78, 0x0F, 0xC0, 0x00, 0x70, 0x07, 0xE0, 0x00, 0x60, 0x03, 0xF0, 0x00, + 0xE0, 0x01, 0xF0, 0x01, 0xC0, 0x01, 0xF8, 0x01, 0x80, 0x00, 0xFC, 0x03, + 0x80, 0x00, 0x7C, 0x07, 0x00, 0x00, 0x7E, 0x06, 0x00, 0x00, 0x3F, 0x0E, + 0x00, 0x00, 0x1F, 0x1C, 0x00, 0x00, 0x1F, 0x98, 0x00, 0x00, 0x0F, 0xF8, + 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xF8, + 0xF0, 0x00, 0x3E, 0x38, 0x00, 0x0F, 0x86, 0x00, 0x03, 0xF0, 0xC0, 0x00, + 0x7C, 0x10, 0x00, 0x1F, 0x02, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7E, + 0x00, 0x01, 0x0F, 0x80, 0x00, 0x63, 0xF0, 0x00, 0x0C, 0xFC, 0x00, 0x03, + 0xBF, 0x00, 0x00, 0xE7, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, + 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, + 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0F, 0x07, 0xFC, 0xE0, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1C, + 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70, 0x01, + 0xC0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, + 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0xC0, 0x07, 0xFF, 0x83, 0xC0, 0xE0, 0x70, 0x38, 0x1C, + 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, + 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x3F, 0xFC, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xDC, + 0x00, 0x39, 0xC0, 0x07, 0x9E, 0x00, 0x70, 0xE0, 0x0F, 0x0F, 0x00, 0xE0, + 0x70, 0x1E, 0x07, 0x81, 0xC0, 0x38, 0x3C, 0x03, 0xC3, 0x80, 0x1C, 0x78, + 0x01, 0xE7, 0x00, 0x0E, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xC0, 0x38, 0x07, 0x03, + 0xF0, 0x07, 0x0E, 0x03, 0x81, 0xC1, 0xE0, 0x30, 0x78, 0x0E, 0x1E, 0x03, + 0x83, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x73, 0x80, 0x70, 0xE0, + 0x70, 0x38, 0x38, 0x0E, 0x1C, 0x03, 0x8F, 0x00, 0xE3, 0xC0, 0x38, 0xF0, + 0x0E, 0x3E, 0x07, 0x8F, 0xC3, 0xE1, 0xFF, 0x3F, 0x1F, 0x07, 0x80, 0x06, + 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0x80, 0x00, 0x3C, 0x7E, 0x01, 0xEF, 0xFC, 0x0F, 0xC3, 0xF0, + 0x7C, 0x07, 0x83, 0xC0, 0x3E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0xC7, 0x80, + 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x78, 0x01, 0xE3, + 0xC0, 0x0F, 0x1E, 0x00, 0x70, 0xF0, 0x03, 0x87, 0x80, 0x38, 0x3C, 0x01, + 0xC1, 0xE0, 0x1C, 0x0F, 0xC1, 0xC0, 0x1F, 0xFC, 0x00, 0x3F, 0x80, 0x01, + 0xFC, 0x00, 0xFF, 0xE0, 0x38, 0x3E, 0x0E, 0x03, 0xE3, 0x80, 0x7C, 0xE0, + 0x07, 0x18, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, + 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x1B, 0xC0, + 0x02, 0x7C, 0x01, 0x87, 0xE0, 0x60, 0x7F, 0xF8, 0x07, 0xFE, 0x00, 0x3F, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x0F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x7C, 0x78, 0x07, 0xFD, + 0xE0, 0x3C, 0x3F, 0x81, 0xC0, 0x3E, 0x0E, 0x00, 0xF8, 0x38, 0x01, 0xE1, + 0xE0, 0x07, 0x87, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xC0, + 0x07, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xE0, 0x07, + 0x87, 0x80, 0x1E, 0x1F, 0x00, 0x78, 0x3E, 0x03, 0xE0, 0xFC, 0x1F, 0xF0, + 0xFF, 0xDF, 0x00, 0xFC, 0x60, 0x03, 0xF8, 0x03, 0xFF, 0x01, 0xC1, 0xE0, + 0xC0, 0x3C, 0x70, 0x0F, 0x98, 0x01, 0xE7, 0xFF, 0xFB, 0xFF, 0xFE, 0xE0, + 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, + 0x1F, 0x00, 0x05, 0xE0, 0x02, 0x7C, 0x01, 0x8F, 0xC1, 0xC3, 0xFF, 0xE0, + 0x7F, 0xF0, 0x07, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0xFF, 0xC0, 0xE3, 0xE0, + 0x60, 0x70, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0xFF, 0x83, 0xFF, 0xC0, 0x3C, + 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, + 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3F, + 0x00, 0xFF, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x03, 0xC7, 0xFE, + 0x3C, 0x1F, 0xF1, 0xC0, 0x70, 0x1E, 0x03, 0xC0, 0xF0, 0x0E, 0x07, 0x80, + 0x70, 0x3C, 0x03, 0x81, 0xE0, 0x1C, 0x07, 0x80, 0xC0, 0x3E, 0x0E, 0x00, + 0x78, 0xE0, 0x01, 0xFC, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0xFF, 0xFE, 0x0C, + 0x00, 0x38, 0xC0, 0x00, 0x4C, 0x00, 0x02, 0x60, 0x00, 0x17, 0x00, 0x01, + 0x38, 0x00, 0x09, 0xE0, 0x00, 0x87, 0xC0, 0x38, 0x1F, 0xFF, 0x00, 0x3F, + 0xC0, 0x00, 0x06, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0x80, + 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, + 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x87, 0xE0, 0x1E, + 0x7F, 0xC0, 0x7B, 0x0F, 0x81, 0xF8, 0x1E, 0x07, 0x80, 0x3C, 0x1E, 0x00, + 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, + 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, + 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, + 0xC3, 0xF0, 0x1F, 0x9F, 0xF1, 0xFF, 0x0E, 0x03, 0xE0, 0x7C, 0x0F, 0x80, + 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x70, + 0x7E, 0x1F, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, + 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, + 0xE7, 0xFF, 0x00, 0xE0, 0x1F, 0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, 0x3F, 0x07, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x0E, 0xE0, + 0xEF, 0x1C, 0xFF, 0x87, 0xE0, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x7F, 0xE1, 0xE0, 0x3E, 0x03, 0xC0, 0x70, 0x07, 0x81, 0x80, + 0x0F, 0x06, 0x00, 0x1E, 0x18, 0x00, 0x3C, 0x60, 0x00, 0x79, 0x80, 0x00, + 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xDE, 0x00, 0x07, 0x9E, 0x00, 0x0F, + 0x3E, 0x00, 0x1E, 0x3E, 0x00, 0x3C, 0x3E, 0x00, 0x78, 0x3C, 0x00, 0xF0, + 0x3C, 0x01, 0xE0, 0x7C, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xFE, 0x7F, 0xE3, + 0xFF, 0x03, 0x03, 0xE1, 0xFC, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, + 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, + 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xE7, 0xFF, 0x1E, 0x1F, 0x01, + 0xF8, 0x1F, 0xCF, 0xF0, 0xFF, 0x80, 0xFF, 0x0F, 0x70, 0xF8, 0x0F, 0x81, + 0xF8, 0x0F, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0x1E, 0x07, + 0x80, 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xE0, 0x0F, + 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x78, 0x07, 0x80, 0x3C, 0x0F, 0x00, 0xF0, + 0x07, 0x81, 0xE0, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0x1E, 0x07, 0x80, + 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xE0, 0x0F, 0x03, + 0xC0, 0x3C, 0x01, 0xE0, 0x78, 0x07, 0x80, 0x3C, 0x1F, 0x81, 0xF8, 0x0F, + 0xCF, 0xFC, 0xFF, 0xC7, 0xFE, 0x1E, 0x1F, 0x83, 0xF9, 0xFF, 0x03, 0xFC, + 0x3E, 0x07, 0xC0, 0x7C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, + 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, + 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, + 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x0F, 0xC0, 0x7E, + 0x7F, 0xC3, 0xFC, 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0xF0, 0x7C, 0x0F, + 0x80, 0xF8, 0x3C, 0x01, 0xF1, 0xE0, 0x03, 0xE7, 0x80, 0x0F, 0xBE, 0x00, + 0x3F, 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, + 0xF8, 0x00, 0x7F, 0xF0, 0x01, 0xE7, 0xC0, 0x07, 0x9F, 0x80, 0x3E, 0x3E, + 0x00, 0xF0, 0x7C, 0x07, 0x80, 0xF8, 0x3C, 0x01, 0xFF, 0xE0, 0x00, 0xFC, + 0x00, 0x0E, 0x3F, 0x07, 0xF7, 0xFE, 0x07, 0xE0, 0xF8, 0x3E, 0x03, 0xE1, + 0xE0, 0x0F, 0x0F, 0x00, 0x7C, 0x78, 0x03, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, + 0x78, 0xF0, 0x03, 0xC7, 0x80, 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x8F, + 0x00, 0x38, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, 0x00, 0xE0, 0xF8, 0x0E, + 0x07, 0xE0, 0xE0, 0x3D, 0xFE, 0x01, 0xE7, 0xC0, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0x80, 0x00, 0x01, + 0xF8, 0x20, 0x3F, 0xF3, 0x03, 0xC1, 0xF8, 0x3C, 0x07, 0xC3, 0xC0, 0x1E, + 0x1C, 0x00, 0xF1, 0xE0, 0x07, 0x8E, 0x00, 0x3C, 0xF0, 0x01, 0xE7, 0x80, + 0x0F, 0x3C, 0x00, 0x79, 0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, 0x00, 0xF3, + 0xE0, 0x07, 0x9F, 0x00, 0x3C, 0x7C, 0x01, 0xE3, 0xE0, 0x1F, 0x0F, 0xC1, + 0xF8, 0x3F, 0xF3, 0xC0, 0x7E, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xE0, 0x06, 0x3C, 0xFC, + 0xFE, 0xFA, 0x78, 0xF8, 0x71, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, + 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xF8, 0x0F, 0xFC, + 0x00, 0x1F, 0x91, 0x87, 0x98, 0x1D, 0xC0, 0x6E, 0x03, 0x70, 0x0B, 0xC0, + 0x5F, 0x80, 0x7E, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xE0, 0x3F, 0x00, 0x7E, + 0x01, 0xF0, 0x07, 0xC0, 0x3E, 0x01, 0xF8, 0x0D, 0xE0, 0xC8, 0xF8, 0x00, + 0x04, 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x3C, 0x07, 0xFC, 0xFF, 0xC3, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xE2, + 0x1F, 0xC0, 0xF8, 0xFC, 0x0F, 0xE1, 0xF0, 0x0F, 0x83, 0xC0, 0x1E, 0x0F, + 0x00, 0x78, 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, + 0x78, 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, 0x78, + 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, 0x78, 0x3C, + 0x01, 0xE0, 0xF8, 0x0F, 0x81, 0xF0, 0xFF, 0x03, 0xFE, 0x7F, 0x07, 0xE1, + 0xC0, 0xFF, 0x81, 0xFC, 0xFC, 0x01, 0xC1, 0xE0, 0x07, 0x07, 0x80, 0x18, + 0x0F, 0x00, 0x60, 0x3C, 0x01, 0x00, 0x78, 0x0C, 0x01, 0xE0, 0x30, 0x07, + 0x81, 0x80, 0x0F, 0x06, 0x00, 0x3C, 0x10, 0x00, 0x78, 0xC0, 0x01, 0xE3, + 0x00, 0x03, 0x98, 0x00, 0x0F, 0x60, 0x00, 0x3D, 0x00, 0x00, 0x7C, 0x00, + 0x01, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x40, 0x00, 0xFF, 0x8F, 0xF8, 0x3F, 0x7E, 0x07, 0xE0, 0x0E, 0x3E, 0x03, + 0xC0, 0x0C, 0x1E, 0x03, 0xE0, 0x0C, 0x1E, 0x01, 0xE0, 0x0C, 0x1E, 0x01, + 0xE0, 0x18, 0x0F, 0x00, 0xF0, 0x18, 0x0F, 0x01, 0xF0, 0x10, 0x07, 0x81, + 0xF0, 0x30, 0x07, 0x81, 0x78, 0x30, 0x07, 0x83, 0x78, 0x60, 0x03, 0xC3, + 0x38, 0x60, 0x03, 0xC6, 0x3C, 0x40, 0x01, 0xC6, 0x3C, 0xC0, 0x01, 0xEC, + 0x1E, 0xC0, 0x01, 0xEC, 0x1F, 0x80, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0xF8, + 0x0F, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x60, + 0x06, 0x00, 0x00, 0x20, 0x02, 0x00, 0x7F, 0xE7, 0xF0, 0x7E, 0x0F, 0x00, + 0xF8, 0x38, 0x01, 0xE0, 0xC0, 0x07, 0xC6, 0x00, 0x0F, 0x30, 0x00, 0x1E, + 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, + 0x00, 0x3F, 0x00, 0x00, 0xDE, 0x00, 0x06, 0x7C, 0x00, 0x30, 0xF0, 0x01, + 0xC1, 0xE0, 0x06, 0x07, 0xC0, 0x30, 0x0F, 0x01, 0xC0, 0x1E, 0x0F, 0x00, + 0xFC, 0xFE, 0x07, 0xFC, 0xFF, 0xC0, 0xFC, 0xFC, 0x01, 0xE1, 0xE0, 0x03, + 0x07, 0x80, 0x18, 0x0F, 0x00, 0x60, 0x3C, 0x01, 0x80, 0x78, 0x0C, 0x01, + 0xE0, 0x30, 0x03, 0xC0, 0xC0, 0x0F, 0x06, 0x00, 0x3E, 0x18, 0x00, 0x78, + 0x40, 0x01, 0xF3, 0x00, 0x03, 0xCC, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, + 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x40, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x60, + 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x01, + 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00, + 0xF1, 0x00, 0x78, 0x40, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xE0, + 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, + 0xE0, 0x01, 0xF0, 0x04, 0x78, 0x01, 0x3E, 0x00, 0xDF, 0x00, 0x37, 0x80, + 0x1F, 0xFF, 0xFE, 0xFF, 0xFF, 0x80, 0x01, 0xE0, 0x78, 0x1C, 0x07, 0x80, + 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x70, 0x1C, 0x0E, 0x00, 0x70, + 0x07, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x01, 0xC0, + 0x1E, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0x00, 0x70, 0x0F, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x0E, 0x07, 0x01, 0xC0, 0x70, + 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x3C, 0x07, 0x03, 0xC0, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0xFF, 0x80, 0xC7, 0x0F, 0x87, 0xB8, 0x0F, 0xFC, 0x00, + 0x07, 0xC0}; + +const GFXglyph FreeSerif24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 12, 0, 1}, // 0x20 ' ' + {0, 5, 32, 16, 6, -31}, // 0x21 '!' + {20, 12, 12, 19, 4, -31}, // 0x22 '"' + {38, 23, 31, 23, 0, -30}, // 0x23 '#' + {128, 19, 37, 24, 2, -33}, // 0x24 '$' + {216, 33, 32, 39, 3, -30}, // 0x25 '%' + {348, 32, 33, 37, 2, -31}, // 0x26 '&' + {480, 4, 12, 9, 3, -31}, // 0x27 ''' + {486, 12, 40, 16, 2, -31}, // 0x28 '(' + {546, 12, 40, 16, 2, -30}, // 0x29 ')' + {606, 16, 19, 24, 4, -30}, // 0x2A '*' + {644, 23, 23, 27, 2, -22}, // 0x2B '+' + {711, 6, 11, 12, 2, -4}, // 0x2C ',' + {720, 11, 2, 16, 2, -10}, // 0x2D '-' + {723, 5, 5, 12, 3, -3}, // 0x2E '.' + {727, 14, 32, 14, 0, -30}, // 0x2F '/' + {783, 22, 33, 23, 1, -31}, // 0x30 '0' + {874, 13, 32, 24, 5, -31}, // 0x31 '1' + {926, 21, 31, 23, 1, -30}, // 0x32 '2' + {1008, 18, 32, 23, 2, -30}, // 0x33 '3' + {1080, 21, 31, 24, 1, -30}, // 0x34 '4' + {1162, 19, 33, 24, 2, -31}, // 0x35 '5' + {1241, 21, 33, 23, 2, -31}, // 0x36 '6' + {1328, 20, 31, 24, 1, -30}, // 0x37 '7' + {1406, 18, 33, 23, 3, -31}, // 0x38 '8' + {1481, 21, 33, 24, 1, -31}, // 0x39 '9' + {1568, 5, 22, 12, 4, -20}, // 0x3A ':' + {1582, 6, 27, 12, 3, -20}, // 0x3B ';' + {1603, 24, 25, 27, 1, -24}, // 0x3C '<' + {1678, 24, 11, 27, 1, -16}, // 0x3D '=' + {1711, 24, 25, 27, 2, -23}, // 0x3E '>' + {1786, 17, 32, 21, 3, -31}, // 0x3F '?' + {1854, 32, 33, 41, 4, -31}, // 0x40 '@' + {1986, 32, 32, 34, 1, -31}, // 0x41 'A' + {2114, 27, 31, 30, 0, -30}, // 0x42 'B' + {2219, 28, 33, 31, 2, -31}, // 0x43 'C' + {2335, 31, 31, 34, 1, -30}, // 0x44 'D' + {2456, 27, 31, 29, 2, -30}, // 0x45 'E' + {2561, 24, 31, 27, 2, -30}, // 0x46 'F' + {2654, 31, 33, 35, 2, -31}, // 0x47 'G' + {2782, 30, 31, 34, 2, -30}, // 0x48 'H' + {2899, 13, 31, 15, 1, -30}, // 0x49 'I' + {2950, 17, 32, 18, 0, -30}, // 0x4A 'J' + {3018, 32, 31, 33, 1, -30}, // 0x4B 'K' + {3142, 26, 31, 29, 2, -30}, // 0x4C 'L' + {3243, 39, 31, 41, 1, -30}, // 0x4D 'M' + {3395, 32, 32, 34, 1, -30}, // 0x4E 'N' + {3523, 30, 33, 34, 2, -31}, // 0x4F 'O' + {3647, 23, 31, 27, 2, -30}, // 0x50 'P' + {3737, 31, 40, 34, 2, -31}, // 0x51 'Q' + {3892, 28, 31, 31, 2, -30}, // 0x52 'R' + {4001, 21, 33, 25, 2, -31}, // 0x53 'S' + {4088, 27, 31, 28, 1, -30}, // 0x54 'T' + {4193, 32, 32, 34, 1, -30}, // 0x55 'U' + {4321, 32, 32, 33, 0, -30}, // 0x56 'V' + {4449, 44, 32, 45, 0, -30}, // 0x57 'W' + {4625, 33, 31, 34, 0, -30}, // 0x58 'X' + {4753, 32, 31, 33, 0, -30}, // 0x59 'Y' + {4877, 27, 31, 29, 1, -30}, // 0x5A 'Z' + {4982, 9, 38, 16, 4, -30}, // 0x5B '[' + {5025, 14, 32, 14, 0, -30}, // 0x5C '\' + {5081, 9, 38, 16, 3, -30}, // 0x5D ']' + {5124, 20, 17, 22, 1, -30}, // 0x5E '^' + {5167, 24, 2, 23, 0, 5}, // 0x5F '_' + {5173, 10, 8, 12, 1, -31}, // 0x60 '`' + {5183, 18, 21, 20, 1, -20}, // 0x61 'a' + {5231, 21, 32, 24, 1, -31}, // 0x62 'b' + {5315, 19, 21, 21, 1, -20}, // 0x63 'c' + {5365, 22, 32, 23, 1, -31}, // 0x64 'd' + {5453, 18, 21, 21, 1, -20}, // 0x65 'e' + {5501, 17, 33, 18, 0, -32}, // 0x66 'f' + {5572, 21, 31, 22, 1, -20}, // 0x67 'g' + {5654, 22, 32, 23, 0, -31}, // 0x68 'h' + {5742, 11, 32, 13, 0, -31}, // 0x69 'i' + {5786, 12, 42, 16, 0, -31}, // 0x6A 'j' + {5849, 23, 32, 24, 1, -31}, // 0x6B 'k' + {5941, 11, 32, 12, 0, -31}, // 0x6C 'l' + {5985, 35, 21, 37, 1, -20}, // 0x6D 'm' + {6077, 22, 21, 23, 0, -20}, // 0x6E 'n' + {6135, 22, 21, 23, 1, -20}, // 0x6F 'o' + {6193, 21, 31, 24, 1, -20}, // 0x70 'p' + {6275, 21, 31, 23, 1, -20}, // 0x71 'q' + {6357, 15, 21, 16, 1, -20}, // 0x72 'r' + {6397, 13, 21, 17, 2, -20}, // 0x73 's' + {6432, 12, 26, 13, 1, -25}, // 0x74 't' + {6471, 22, 21, 23, 1, -20}, // 0x75 'u' + {6529, 22, 22, 22, 0, -20}, // 0x76 'v' + {6590, 32, 22, 32, 0, -20}, // 0x77 'w' + {6678, 22, 21, 23, 0, -20}, // 0x78 'x' + {6736, 22, 31, 22, 0, -20}, // 0x79 'y' + {6822, 18, 21, 20, 1, -20}, // 0x7A 'z' + {6870, 11, 41, 23, 5, -31}, // 0x7B '{' + {6927, 3, 32, 9, 3, -30}, // 0x7C '|' + {6939, 11, 41, 23, 7, -31}, // 0x7D '}' + {6996, 22, 5, 23, 1, -13}}; // 0x7E '~' + +const GFXfont FreeSerif24pt7b PROGMEM = {(uint8_t *)FreeSerif24pt7bBitmaps, + (GFXglyph *)FreeSerif24pt7bGlyphs, + 0x20, 0x7E, 56}; + +// Approx. 7682 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h new file mode 100644 index 0000000..22f82e4 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h @@ -0,0 +1,197 @@ +#pragma once +#include + +const uint8_t FreeSerif9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xEA, 0x03, 0xDE, 0xF7, 0x20, 0x11, 0x09, 0x04, 0x82, 0x4F, 0xF9, + 0x10, 0x89, 0xFF, 0x24, 0x12, 0x09, 0x0C, 0x80, 0x10, 0x7C, 0xD6, 0xD2, + 0xD0, 0xF0, 0x38, 0x1E, 0x17, 0x93, 0x93, 0xD6, 0x7C, 0x10, 0x38, 0x43, + 0x3C, 0x39, 0x21, 0x8A, 0x0C, 0x50, 0x65, 0x39, 0xCB, 0x20, 0xB9, 0x05, + 0x88, 0x4C, 0x44, 0x64, 0x21, 0xC0, 0x0E, 0x00, 0xC8, 0x06, 0x40, 0x32, + 0x01, 0xA0, 0x07, 0x78, 0x31, 0x87, 0x88, 0x46, 0x86, 0x34, 0x30, 0xC1, + 0xC7, 0x17, 0xCF, 0x00, 0xFE, 0x08, 0x88, 0x84, 0x63, 0x18, 0xC6, 0x10, + 0x82, 0x08, 0x20, 0x82, 0x08, 0x21, 0x0C, 0x63, 0x18, 0xC4, 0x22, 0x22, + 0x00, 0x63, 0x9A, 0xDC, 0x72, 0xB6, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, + 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD8, 0xF0, 0xF0, 0x08, 0x84, 0x22, + 0x10, 0x8C, 0x42, 0x31, 0x00, 0x1C, 0x31, 0x98, 0xD8, 0x3C, 0x1E, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC4, 0x61, 0xC0, 0x13, 0x8C, 0x63, 0x18, + 0xC6, 0x31, 0x8C, 0x67, 0x80, 0x3C, 0x4E, 0x86, 0x06, 0x06, 0x04, 0x0C, + 0x08, 0x10, 0x20, 0x41, 0xFE, 0x3C, 0xC6, 0x06, 0x04, 0x1C, 0x3E, 0x07, + 0x03, 0x03, 0x03, 0x06, 0xF8, 0x04, 0x18, 0x71, 0x64, 0xC9, 0xA3, 0x46, + 0xFE, 0x18, 0x30, 0x60, 0x0F, 0x10, 0x20, 0x3C, 0x0E, 0x07, 0x03, 0x03, + 0x03, 0x02, 0x04, 0xF8, 0x07, 0x1C, 0x30, 0x60, 0x60, 0xDC, 0xE6, 0xC3, + 0xC3, 0xC3, 0x43, 0x66, 0x3C, 0x7F, 0x82, 0x02, 0x02, 0x04, 0x04, 0x04, + 0x08, 0x08, 0x08, 0x10, 0x10, 0x3C, 0x8F, 0x1E, 0x3E, 0x4F, 0x06, 0x36, + 0xC7, 0x8F, 0x1B, 0x33, 0xC0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0xC3, + 0x63, 0x3F, 0x06, 0x06, 0x0C, 0x38, 0x60, 0xF0, 0x0F, 0xD8, 0x00, 0x03, + 0x28, 0x01, 0x87, 0x0E, 0x1C, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x80, + 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x80, 0x1C, 0x01, 0xC0, 0x1C, 0x01, + 0xC0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x79, 0x1A, 0x18, 0x30, 0x60, 0x83, + 0x04, 0x10, 0x20, 0x40, 0x03, 0x00, 0x0F, 0x83, 0x8C, 0x60, 0x26, 0x02, + 0xC7, 0x9C, 0xC9, 0xD8, 0x9D, 0x99, 0xD9, 0x26, 0xEC, 0x60, 0x03, 0x04, + 0x0F, 0x80, 0x02, 0x00, 0x10, 0x01, 0xC0, 0x16, 0x00, 0x98, 0x04, 0xC0, + 0x43, 0x03, 0xF8, 0x20, 0x61, 0x03, 0x18, 0x1D, 0xE1, 0xF0, 0xFF, 0x86, + 0x1C, 0xC1, 0x98, 0x33, 0x0C, 0x7E, 0x0C, 0x31, 0x83, 0x30, 0x66, 0x0C, + 0xC3, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0x81, 0xE0, 0x1C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC1, 0x8F, 0xC0, 0xFF, 0x03, 0x1C, 0x30, + 0x63, 0x07, 0x30, 0x33, 0x03, 0x30, 0x33, 0x03, 0x30, 0x33, 0x06, 0x30, + 0xCF, 0xF0, 0xFF, 0x98, 0x26, 0x01, 0x80, 0x61, 0x1F, 0xC6, 0x11, 0x80, + 0x60, 0x18, 0x16, 0x0F, 0xFE, 0xFF, 0xB0, 0x58, 0x0C, 0x06, 0x13, 0xF9, + 0x84, 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x23, 0x0E, 0x60, 0x26, + 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x6C, 0x06, 0xC0, 0x66, 0x06, 0x30, 0x60, + 0xF8, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x66, 0x0C, 0xFF, 0x98, 0x33, 0x06, + 0x60, 0xCC, 0x19, 0x83, 0x78, 0xF0, 0xF6, 0x66, 0x66, 0x66, 0x66, 0x6F, + 0x3C, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x6D, 0xBC, 0xF3, 0xE6, 0x08, + 0x61, 0x06, 0x20, 0x64, 0x07, 0x80, 0x6C, 0x06, 0x60, 0x63, 0x06, 0x18, + 0x60, 0xCF, 0x3F, 0xF0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, + 0x80, 0x60, 0x18, 0x16, 0x0B, 0xFE, 0xF0, 0x0E, 0x70, 0x38, 0xE0, 0x71, + 0xE1, 0x62, 0xC2, 0xC5, 0xC9, 0x89, 0x93, 0x13, 0x26, 0x23, 0x8C, 0x47, + 0x18, 0x84, 0x33, 0x88, 0xF0, 0xE0, 0xEE, 0x09, 0xC1, 0x2C, 0x25, 0xC4, + 0x9C, 0x91, 0x92, 0x1A, 0x41, 0xC8, 0x19, 0x03, 0x70, 0x20, 0x1F, 0x06, + 0x31, 0x83, 0x20, 0x2C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x09, + 0x83, 0x18, 0xC1, 0xF0, 0xFE, 0x31, 0x98, 0x6C, 0x36, 0x1B, 0x19, 0xF8, + 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x06, 0x31, 0x83, 0x20, 0x2C, + 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x19, 0x83, 0x18, 0xC0, 0xE0, + 0x0E, 0x00, 0xE0, 0x07, 0xFE, 0x0C, 0x61, 0x86, 0x30, 0xC6, 0x18, 0xC6, + 0x1F, 0x83, 0x70, 0x67, 0x0C, 0x71, 0x87, 0x78, 0x70, 0x1D, 0x31, 0x98, + 0x4C, 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xA0, 0xD8, 0xCB, 0xC0, 0xFF, + 0xF8, 0xCE, 0x18, 0x83, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, + 0xC0, 0x18, 0x07, 0x80, 0xF0, 0xEC, 0x09, 0x81, 0x30, 0x26, 0x04, 0xC0, + 0x98, 0x13, 0x02, 0x60, 0x4C, 0x08, 0xC2, 0x0F, 0x80, 0xF8, 0x77, 0x02, + 0x30, 0x23, 0x04, 0x18, 0x41, 0x84, 0x0C, 0x80, 0xC8, 0x07, 0x00, 0x70, + 0x02, 0x00, 0x20, 0xFB, 0xE7, 0xB0, 0xC0, 0x8C, 0x20, 0x86, 0x18, 0x41, + 0x8C, 0x40, 0xCB, 0x20, 0x65, 0x90, 0x1A, 0x70, 0x0E, 0x38, 0x03, 0x1C, + 0x01, 0x04, 0x00, 0x82, 0x00, 0xFC, 0xF9, 0x83, 0x06, 0x10, 0x19, 0x00, + 0xD0, 0x03, 0x00, 0x1C, 0x01, 0x30, 0x11, 0xC1, 0x86, 0x08, 0x19, 0xE3, + 0xF0, 0xF8, 0xF6, 0x06, 0x30, 0x41, 0x88, 0x1D, 0x00, 0xD0, 0x06, 0x00, + 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xF0, 0x3F, 0xCC, 0x11, 0x06, 0x01, + 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x38, 0x06, 0x05, 0xC1, 0x7F, 0xE0, + 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB8, 0x82, 0x10, 0x82, 0x10, 0x86, 0x10, + 0x86, 0x10, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xF8, 0x18, 0x1C, 0x34, 0x26, + 0x62, 0x42, 0xC1, 0xFF, 0x80, 0x84, 0x20, 0x79, 0x98, 0x30, 0xE6, 0xD9, + 0xB3, 0x3F, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC3, 0x61, + 0xB0, 0xD8, 0x6C, 0x63, 0xE0, 0x3C, 0xCF, 0x06, 0x0C, 0x18, 0x18, 0x9E, + 0x01, 0x03, 0x80, 0xC0, 0x60, 0x31, 0xD9, 0x9D, 0x86, 0xC3, 0x61, 0xB0, + 0xCC, 0x63, 0xF0, 0x3C, 0x46, 0xFE, 0xC0, 0xC0, 0xE1, 0x62, 0x3C, 0x1E, + 0x41, 0x83, 0x06, 0x1E, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x0F, 0x00, 0x3C, + 0x19, 0xF6, 0x31, 0x8C, 0x1E, 0x08, 0x04, 0x01, 0xFC, 0x40, 0xB0, 0x2E, + 0x11, 0xF8, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC6, 0x63, + 0x31, 0x98, 0xCC, 0x6F, 0x78, 0x60, 0x02, 0xE6, 0x66, 0x66, 0xF0, 0x18, + 0x00, 0x33, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8B, 0x80, 0x20, 0x70, 0x18, + 0x0C, 0x06, 0x03, 0x3D, 0x88, 0xD8, 0x78, 0x36, 0x19, 0x8C, 0x6F, 0x78, + 0x2E, 0x66, 0x66, 0x66, 0x66, 0x66, 0xF0, 0xEE, 0x71, 0xCE, 0x66, 0x31, + 0x98, 0xC6, 0x63, 0x19, 0x8C, 0x66, 0x31, 0xBD, 0xEF, 0xEE, 0x39, 0x98, + 0xCC, 0x66, 0x33, 0x19, 0x8D, 0xEF, 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1E, + 0x0D, 0x8C, 0x7C, 0xEE, 0x39, 0x98, 0x6C, 0x36, 0x1B, 0x0D, 0x8C, 0xFC, + 0x60, 0x30, 0x18, 0x1E, 0x00, 0x3D, 0x31, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, + 0x8C, 0xFE, 0x03, 0x01, 0x80, 0xC0, 0xF0, 0x6D, 0xC6, 0x18, 0x61, 0x86, + 0x3C, 0x76, 0x38, 0x58, 0x3E, 0x38, 0xFE, 0x27, 0x98, 0xC6, 0x31, 0x8C, + 0x38, 0xE7, 0x31, 0x98, 0xCC, 0x66, 0x33, 0x19, 0x8C, 0x7F, 0xF3, 0x61, + 0x22, 0x32, 0x14, 0x1C, 0x08, 0x08, 0xEF, 0x36, 0x61, 0x62, 0x22, 0x32, + 0x35, 0x41, 0x9C, 0x18, 0x81, 0x08, 0xF7, 0x12, 0x0E, 0x03, 0x01, 0xC1, + 0x21, 0x09, 0xCF, 0xF3, 0x61, 0x62, 0x32, 0x34, 0x14, 0x1C, 0x08, 0x08, + 0x08, 0x10, 0xE0, 0xFD, 0x18, 0x60, 0x83, 0x0C, 0x70, 0xFE, 0x19, 0x8C, + 0x63, 0x18, 0xC4, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF0, 0xC3, 0x18, + 0xC6, 0x31, 0x84, 0x33, 0x18, 0xC6, 0x31, 0x98, 0x70, 0x24, 0xC1, 0xC0}; + +const GFXglyph FreeSerif9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 2, 12, 6, 2, -11}, // 0x21 '!' + {3, 5, 4, 7, 1, -11}, // 0x22 '"' + {6, 9, 12, 9, 0, -11}, // 0x23 '#' + {20, 8, 14, 9, 1, -12}, // 0x24 '$' + {34, 13, 12, 15, 1, -11}, // 0x25 '%' + {54, 13, 13, 14, 1, -12}, // 0x26 '&' + {76, 2, 4, 4, 1, -11}, // 0x27 ''' + {77, 5, 15, 6, 1, -11}, // 0x28 '(' + {87, 5, 15, 6, 0, -11}, // 0x29 ')' + {97, 6, 8, 9, 3, -11}, // 0x2A '*' + {103, 9, 9, 10, 0, -8}, // 0x2B '+' + {114, 2, 3, 4, 2, 0}, // 0x2C ',' + {115, 4, 1, 6, 1, -3}, // 0x2D '-' + {116, 2, 2, 5, 1, -1}, // 0x2E '.' + {117, 5, 12, 5, 0, -11}, // 0x2F '/' + {125, 9, 13, 9, 0, -12}, // 0x30 '0' + {140, 5, 13, 9, 2, -12}, // 0x31 '1' + {149, 8, 12, 9, 1, -11}, // 0x32 '2' + {161, 8, 12, 9, 0, -11}, // 0x33 '3' + {173, 7, 12, 9, 1, -11}, // 0x34 '4' + {184, 8, 12, 9, 0, -11}, // 0x35 '5' + {196, 8, 13, 9, 1, -12}, // 0x36 '6' + {209, 8, 12, 9, 0, -11}, // 0x37 '7' + {221, 7, 13, 9, 1, -12}, // 0x38 '8' + {233, 8, 14, 9, 1, -12}, // 0x39 '9' + {247, 2, 8, 5, 1, -7}, // 0x3A ':' + {249, 3, 10, 5, 1, -7}, // 0x3B ';' + {253, 9, 9, 10, 1, -8}, // 0x3C '<' + {264, 9, 5, 10, 1, -6}, // 0x3D '=' + {270, 10, 9, 10, 0, -8}, // 0x3E '>' + {282, 7, 13, 8, 1, -12}, // 0x3F '?' + {294, 12, 13, 16, 2, -12}, // 0x40 '@' + {314, 13, 12, 13, 0, -11}, // 0x41 'A' + {334, 11, 12, 11, 0, -11}, // 0x42 'B' + {351, 11, 12, 12, 1, -11}, // 0x43 'C' + {368, 12, 12, 13, 0, -11}, // 0x44 'D' + {386, 10, 12, 11, 1, -11}, // 0x45 'E' + {401, 9, 12, 10, 1, -11}, // 0x46 'F' + {415, 12, 12, 13, 1, -11}, // 0x47 'G' + {433, 11, 12, 13, 1, -11}, // 0x48 'H' + {450, 4, 12, 6, 1, -11}, // 0x49 'I' + {456, 6, 12, 7, 0, -11}, // 0x4A 'J' + {465, 12, 12, 13, 1, -11}, // 0x4B 'K' + {483, 10, 12, 11, 1, -11}, // 0x4C 'L' + {498, 15, 12, 16, 0, -11}, // 0x4D 'M' + {521, 11, 12, 13, 1, -11}, // 0x4E 'N' + {538, 11, 13, 13, 1, -12}, // 0x4F 'O' + {556, 9, 12, 10, 1, -11}, // 0x50 'P' + {570, 11, 16, 13, 1, -12}, // 0x51 'Q' + {592, 11, 12, 12, 1, -11}, // 0x52 'R' + {609, 9, 12, 10, 0, -11}, // 0x53 'S' + {623, 11, 12, 11, 0, -11}, // 0x54 'T' + {640, 11, 12, 13, 1, -11}, // 0x55 'U' + {657, 12, 12, 13, 0, -11}, // 0x56 'V' + {675, 17, 12, 17, 0, -11}, // 0x57 'W' + {701, 13, 12, 13, 0, -11}, // 0x58 'X' + {721, 12, 12, 13, 0, -11}, // 0x59 'Y' + {739, 11, 12, 11, 0, -11}, // 0x5A 'Z' + {756, 3, 15, 6, 2, -11}, // 0x5B '[' + {762, 5, 12, 5, 0, -11}, // 0x5C '\' + {770, 3, 15, 6, 1, -11}, // 0x5D ']' + {776, 8, 7, 8, 0, -11}, // 0x5E '^' + {783, 9, 1, 9, 0, 2}, // 0x5F '_' + {785, 4, 3, 5, 0, -11}, // 0x60 '`' + {787, 7, 8, 8, 1, -7}, // 0x61 'a' + {794, 9, 13, 9, 0, -12}, // 0x62 'b' + {809, 7, 8, 8, 0, -7}, // 0x63 'c' + {816, 9, 13, 9, 0, -12}, // 0x64 'd' + {831, 8, 8, 8, 0, -7}, // 0x65 'e' + {839, 7, 13, 7, 1, -12}, // 0x66 'f' + {851, 10, 12, 8, 0, -7}, // 0x67 'g' + {866, 9, 13, 9, 0, -12}, // 0x68 'h' + {881, 4, 11, 5, 1, -10}, // 0x69 'i' + {887, 5, 15, 6, 0, -10}, // 0x6A 'j' + {897, 9, 13, 9, 1, -12}, // 0x6B 'k' + {912, 4, 13, 5, 1, -12}, // 0x6C 'l' + {919, 14, 8, 14, 0, -7}, // 0x6D 'm' + {933, 9, 8, 9, 0, -7}, // 0x6E 'n' + {942, 9, 8, 9, 0, -7}, // 0x6F 'o' + {951, 9, 12, 9, 0, -7}, // 0x70 'p' + {965, 9, 12, 9, 0, -7}, // 0x71 'q' + {979, 6, 8, 6, 0, -7}, // 0x72 'r' + {985, 6, 8, 7, 1, -7}, // 0x73 's' + {991, 5, 9, 5, 0, -8}, // 0x74 't' + {997, 9, 8, 9, 0, -7}, // 0x75 'u' + {1006, 8, 8, 8, 0, -7}, // 0x76 'v' + {1014, 12, 8, 12, 0, -7}, // 0x77 'w' + {1026, 9, 8, 9, 0, -7}, // 0x78 'x' + {1035, 8, 12, 8, 0, -7}, // 0x79 'y' + {1047, 7, 8, 7, 1, -7}, // 0x7A 'z' + {1054, 5, 16, 9, 1, -12}, // 0x7B '{' + {1064, 1, 12, 4, 1, -11}, // 0x7C '|' + {1066, 5, 16, 9, 3, -11}, // 0x7D '}' + {1076, 9, 3, 9, 0, -5}}; // 0x7E '~' + +const GFXfont FreeSerif9pt7b PROGMEM = {(uint8_t *)FreeSerif9pt7bBitmaps, + (GFXglyph *)FreeSerif9pt7bGlyphs, 0x20, + 0x7E, 22}; + +// Approx. 1752 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h new file mode 100644 index 0000000..9dedae0 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h @@ -0,0 +1,273 @@ +#pragma once +#include + +const uint8_t FreeSerifBold12pt7bBitmaps[] PROGMEM = { + 0x7F, 0xFF, 0x77, 0x66, 0x22, 0x00, 0x6F, 0xF7, 0xE3, 0xF1, 0xF8, 0xFC, + 0x7E, 0x3A, 0x09, 0x04, 0x0C, 0x40, 0xCC, 0x0C, 0xC0, 0x8C, 0x18, 0xC7, + 0xFF, 0x18, 0xC1, 0x88, 0x19, 0x81, 0x98, 0xFF, 0xE3, 0x18, 0x31, 0x83, + 0x18, 0x33, 0x03, 0x30, 0x08, 0x01, 0x00, 0xFC, 0x24, 0xEC, 0x8D, 0x90, + 0xBA, 0x07, 0xC0, 0x7E, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x9F, 0x11, 0xE2, + 0x3E, 0x46, 0xE9, 0xC7, 0xC0, 0x20, 0x04, 0x00, 0x1E, 0x0C, 0x0E, 0x7F, + 0x07, 0x10, 0x83, 0xC4, 0x40, 0xE1, 0x30, 0x38, 0x88, 0x0E, 0x26, 0x03, + 0x91, 0x1E, 0x78, 0x8E, 0x40, 0x27, 0x10, 0x11, 0xC4, 0x0C, 0xE1, 0x02, + 0x38, 0x81, 0x0E, 0x20, 0x43, 0x90, 0x20, 0x78, 0x03, 0xE0, 0x01, 0x9E, + 0x00, 0xE3, 0x80, 0x38, 0xE0, 0x0F, 0x30, 0x03, 0xF0, 0x00, 0x78, 0x7C, + 0x1F, 0x06, 0x1B, 0xE1, 0x1C, 0x7C, 0x8F, 0x1F, 0x23, 0xC3, 0xF0, 0xF8, + 0x7C, 0x3E, 0x0F, 0x97, 0xC7, 0xFC, 0xFE, 0x3E, 0xFF, 0xFE, 0x90, 0x00, + 0x31, 0x0C, 0x31, 0x86, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x86, 0x18, 0x60, + 0xC1, 0x02, 0x04, 0x03, 0x06, 0x0C, 0x30, 0x61, 0x87, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0x86, 0x38, 0xC2, 0x10, 0x80, 0x1C, 0x6E, 0xFA, 0xEF, 0xF1, + 0xC7, 0xFF, 0xAF, 0xBB, 0x1C, 0x04, 0x00, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x6F, 0xF7, 0x11, 0x24, 0xFF, 0xFF, 0xC0, 0x6F, 0xF6, 0x03, 0x07, + 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x60, + 0x60, 0x60, 0xC0, 0x0E, 0x07, 0x71, 0xC7, 0x38, 0xEF, 0x1D, 0xE3, 0xFC, + 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xF7, 0x1C, 0xE3, 0x8E, 0xE0, + 0xF8, 0x06, 0x0F, 0x1F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0xF9, 0xFF, 0x0F, 0x03, 0xFC, 0x7F, 0xC4, + 0x3E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x1C, 0x03, 0x80, 0x30, 0x06, 0x00, + 0xC1, 0x18, 0x13, 0xFE, 0x7F, 0xEF, 0xFE, 0x1F, 0x0C, 0xFA, 0x0F, 0x01, + 0xE0, 0x38, 0x0E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3C, 0x03, 0x80, 0x70, + 0x0D, 0xC1, 0xBC, 0x43, 0xF0, 0x03, 0x80, 0xE0, 0x78, 0x3E, 0x17, 0x89, + 0xE2, 0x79, 0x1E, 0x87, 0xA1, 0xEF, 0xFF, 0xFF, 0xFF, 0xC1, 0xE0, 0x78, + 0x1E, 0x3F, 0xE7, 0xF8, 0xFF, 0x10, 0x04, 0x00, 0xF8, 0x1F, 0xC7, 0xFC, + 0x1F, 0xC0, 0x78, 0x07, 0x00, 0x60, 0x0D, 0xC1, 0x3C, 0x43, 0xF0, 0x00, + 0xE0, 0xF0, 0x38, 0x1E, 0x07, 0x80, 0xF0, 0x3F, 0xE7, 0x9E, 0xF1, 0xFE, + 0x3F, 0xC7, 0xF8, 0xF7, 0x1E, 0xE3, 0x8E, 0x60, 0xF8, 0x7F, 0xEF, 0xFD, + 0xFF, 0xA0, 0x68, 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x0C, + 0x03, 0x00, 0x60, 0x1C, 0x03, 0x00, 0x60, 0x1F, 0x0E, 0x73, 0x87, 0x70, + 0xEF, 0x1D, 0xF3, 0x1F, 0x81, 0xF8, 0x1F, 0xCC, 0xFB, 0x8F, 0xF0, 0xFE, + 0x1F, 0xC3, 0x9C, 0xF1, 0xF8, 0x1F, 0x06, 0x71, 0xC7, 0x78, 0xEF, 0x1F, + 0xE3, 0xFC, 0x7F, 0x8F, 0x79, 0xE7, 0xFC, 0x0F, 0x01, 0xC0, 0x78, 0x1C, + 0x0F, 0x07, 0x00, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 0x6F, 0xF6, 0x00, + 0x06, 0xFF, 0x71, 0x22, 0xC0, 0x00, 0x04, 0x00, 0x70, 0x07, 0xC0, 0xFC, + 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0x80, 0x0F, + 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x1F, 0x01, 0xF0, + 0x1F, 0x03, 0xF0, 0x3E, 0x00, 0xE0, 0x02, 0x00, 0x00, 0x3E, 0x11, 0xEC, + 0x3F, 0x8F, 0xE3, 0xC0, 0xF0, 0x78, 0x18, 0x08, 0x02, 0x00, 0x00, 0x00, + 0x1C, 0x07, 0x81, 0xE0, 0x30, 0x03, 0xF0, 0x0E, 0x18, 0x18, 0x04, 0x30, + 0x66, 0x70, 0xDB, 0x61, 0x99, 0xE3, 0x19, 0xE3, 0x31, 0xE6, 0x31, 0xE6, + 0x31, 0xE6, 0xF2, 0x66, 0xB2, 0x73, 0x3C, 0x38, 0x00, 0x1E, 0x04, 0x03, + 0xF8, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x1B, 0xC0, 0x09, 0xE0, 0x0C, 0xF8, 0x04, 0x3C, 0x02, 0x1F, + 0x03, 0xFF, 0x81, 0x03, 0xC1, 0x80, 0xF0, 0x80, 0x7D, 0xF0, 0xFF, 0xFF, + 0xC0, 0xF3, 0xC3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xCE, 0x0F, + 0xF0, 0x3C, 0x70, 0xF0, 0xE3, 0xC3, 0xCF, 0x0F, 0x3C, 0x3C, 0xF0, 0xE3, + 0xC7, 0xBF, 0xF8, 0x07, 0xE2, 0x38, 0x7C, 0xE0, 0x3B, 0xC0, 0x37, 0x00, + 0x7E, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x03, + 0x80, 0x07, 0x80, 0x27, 0x00, 0xC7, 0x86, 0x03, 0xF0, 0xFF, 0xE0, 0x1E, + 0x1E, 0x0F, 0x07, 0x87, 0x81, 0xE3, 0xC0, 0xF1, 0xE0, 0x3C, 0xF0, 0x1E, + 0x78, 0x0F, 0x3C, 0x07, 0x9E, 0x03, 0xCF, 0x01, 0xE7, 0x80, 0xE3, 0xC0, + 0xF1, 0xE0, 0xF0, 0xF0, 0xE1, 0xFF, 0xC0, 0xFF, 0xFC, 0x78, 0x38, 0xF0, + 0x31, 0xE0, 0x23, 0xC4, 0x07, 0x88, 0x0F, 0x30, 0x1F, 0xE0, 0x3C, 0xC0, + 0x78, 0x80, 0xF1, 0x01, 0xE0, 0x23, 0xC0, 0x47, 0x81, 0x8F, 0x07, 0x7F, + 0xFE, 0xFF, 0xFC, 0xF0, 0x73, 0xC0, 0xCF, 0x01, 0x3C, 0x40, 0xF1, 0x03, + 0xCC, 0x0F, 0xF0, 0x3C, 0xC0, 0xF1, 0x03, 0xC4, 0x0F, 0x00, 0x3C, 0x00, + 0xF0, 0x03, 0xC0, 0x3F, 0xC0, 0x07, 0xE2, 0x1C, 0x3E, 0x38, 0x0E, 0x78, + 0x06, 0x70, 0x06, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x7F, 0xF0, 0x1E, 0x70, 0x1E, 0x78, 0x1E, 0x38, 0x1E, 0x1E, 0x1E, 0x07, + 0xF0, 0xFE, 0xFF, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, + 0x3C, 0x78, 0x3C, 0x7F, 0xFC, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, + 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xFE, 0xFF, 0xFF, 0x3C, 0x3C, + 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0xFF, 0x0F, 0xF0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0xE3, 0xCE, + 0x38, 0xE3, 0x83, 0xE0, 0xFE, 0x7F, 0x3C, 0x0E, 0x1E, 0x04, 0x0F, 0x04, + 0x07, 0x84, 0x03, 0xCC, 0x01, 0xEE, 0x00, 0xFF, 0x00, 0x7F, 0xC0, 0x3C, + 0xF0, 0x1E, 0x7C, 0x0F, 0x1F, 0x07, 0x87, 0xC3, 0xC1, 0xF1, 0xE0, 0x7D, + 0xFC, 0xFF, 0xFE, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x01, 0x78, + 0x0D, 0xE0, 0x67, 0x83, 0xBF, 0xFE, 0xFC, 0x01, 0xF3, 0xC0, 0x3E, 0x3E, + 0x03, 0xE2, 0xE0, 0x5E, 0x2F, 0x05, 0xE2, 0xF0, 0x5E, 0x27, 0x09, 0xE2, + 0x78, 0x9E, 0x23, 0x91, 0xE2, 0x3D, 0x1E, 0x23, 0xF1, 0xE2, 0x1E, 0x1E, + 0x21, 0xE1, 0xE2, 0x0C, 0x1E, 0x20, 0xC1, 0xEF, 0x88, 0x3F, 0xF8, 0x1E, + 0xF8, 0x18, 0xF8, 0x11, 0xF8, 0x22, 0xF8, 0x45, 0xF0, 0x89, 0xF1, 0x11, + 0xF2, 0x21, 0xF4, 0x41, 0xF8, 0x81, 0xF1, 0x01, 0xE2, 0x03, 0xC4, 0x03, + 0x8C, 0x03, 0x7C, 0x02, 0x07, 0xF0, 0x0F, 0x1E, 0x0E, 0x03, 0x8F, 0x01, + 0xE7, 0x00, 0x77, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, + 0x03, 0xFC, 0x01, 0xEE, 0x00, 0xE7, 0x80, 0xF1, 0xC0, 0x70, 0x70, 0x70, + 0x0F, 0xE0, 0xFF, 0x87, 0x9E, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F, 0x78, + 0xF7, 0x9E, 0x7F, 0x87, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0x78, + 0x0F, 0xE0, 0x07, 0xF0, 0x0F, 0x1E, 0x0E, 0x07, 0x8F, 0x01, 0xE7, 0x00, + 0xF7, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, + 0x01, 0xEE, 0x00, 0xE7, 0x00, 0xF1, 0xC0, 0x70, 0x70, 0x70, 0x1C, 0xF0, + 0x03, 0xE0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0xFF, 0xE0, 0x3C, + 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x38, 0x3C, + 0x70, 0x3F, 0xC0, 0x3D, 0xE0, 0x3C, 0xF0, 0x3C, 0xF8, 0x3C, 0x78, 0x3C, + 0x3C, 0x3C, 0x3E, 0xFF, 0x1F, 0x1F, 0x27, 0x0E, 0x60, 0x6E, 0x06, 0xF0, + 0x2F, 0x80, 0x7F, 0x07, 0xFC, 0x1F, 0xE0, 0x7E, 0x01, 0xF8, 0x07, 0xC0, + 0x7C, 0x06, 0xF0, 0xC9, 0xF8, 0xFF, 0xFF, 0xC7, 0x9F, 0x0F, 0x1C, 0x1E, + 0x10, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, + 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x07, 0xF8, 0xFE, + 0x1E, 0xF0, 0x09, 0xE0, 0x13, 0xC0, 0x27, 0x80, 0x4F, 0x00, 0x9E, 0x01, + 0x3C, 0x02, 0x78, 0x04, 0xF0, 0x09, 0xE0, 0x13, 0xC0, 0x27, 0x80, 0x47, + 0x81, 0x07, 0x84, 0x07, 0xF0, 0xFF, 0x0F, 0x9E, 0x03, 0x0F, 0x00, 0x83, + 0xC0, 0x81, 0xE0, 0x40, 0xF8, 0x60, 0x3C, 0x20, 0x1E, 0x10, 0x07, 0x90, + 0x03, 0xC8, 0x00, 0xF4, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x7F, 0x9E, 0xF8, 0x3C, 0x08, + 0xF0, 0x78, 0x31, 0xE0, 0xF0, 0x41, 0xE0, 0xF0, 0x83, 0xC3, 0xE3, 0x07, + 0x85, 0xC4, 0x07, 0x93, 0xC8, 0x0F, 0x27, 0xB0, 0x0E, 0x47, 0x40, 0x1F, + 0x0F, 0x80, 0x3E, 0x1F, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0, + 0x30, 0x00, 0x80, 0x40, 0xFF, 0x9F, 0x9F, 0x07, 0x07, 0x83, 0x03, 0xE3, + 0x00, 0xF9, 0x00, 0x3D, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, + 0xF8, 0x00, 0xBE, 0x00, 0x8F, 0x00, 0x83, 0xC0, 0xC1, 0xF0, 0xE0, 0xFD, + 0xF8, 0xFF, 0xFF, 0x1F, 0x7C, 0x06, 0x3C, 0x04, 0x3E, 0x0C, 0x1E, 0x08, + 0x0F, 0x10, 0x0F, 0x30, 0x07, 0xA0, 0x07, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x0F, 0xF0, 0x7F, 0xFC, + 0xE0, 0xF1, 0x83, 0xE2, 0x07, 0x84, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x03, + 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x08, 0xF0, 0x13, 0xC0, 0x6F, 0x81, + 0x9E, 0x07, 0x7F, 0xFE, 0xFF, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, + 0x73, 0x9C, 0xE7, 0x39, 0xF0, 0xC0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, + 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x03, 0xF9, 0xCE, + 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCF, 0xF0, 0x0C, + 0x07, 0x81, 0xE0, 0xCC, 0x33, 0x18, 0x66, 0x1B, 0x87, 0xC0, 0xC0, 0xFF, + 0xF0, 0xC7, 0x1C, 0x30, 0x1F, 0x0E, 0x71, 0xCF, 0x39, 0xE0, 0x3C, 0x1F, + 0x8E, 0xF3, 0x9E, 0xF3, 0xDE, 0x79, 0xFF, 0x80, 0xF8, 0x07, 0x80, 0x78, + 0x07, 0x80, 0x78, 0x07, 0xB8, 0x7D, 0xE7, 0x8E, 0x78, 0xF7, 0x8F, 0x78, + 0xF7, 0x8F, 0x78, 0xF7, 0x8E, 0x79, 0xC4, 0x78, 0x1F, 0x1D, 0xDC, 0xFE, + 0x7F, 0x07, 0x83, 0xC1, 0xE0, 0x78, 0x3C, 0x47, 0xC0, 0x03, 0xE0, 0x1E, + 0x01, 0xE0, 0x1E, 0x01, 0xE1, 0xDE, 0x7B, 0xE7, 0x1E, 0xF1, 0xEF, 0x1E, + 0xF1, 0xEF, 0x1E, 0xF1, 0xE7, 0x1E, 0x7B, 0xE1, 0xDF, 0x1F, 0x0C, 0x67, + 0x1B, 0xC7, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0x78, 0x4E, 0x21, 0xF0, 0x1E, + 0x3B, 0x7B, 0x78, 0x78, 0xFC, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0xFC, 0x3E, 0x0E, 0x7F, 0xCE, 0x79, 0xEF, 0x3C, 0xE7, 0x0F, + 0xC1, 0x00, 0x60, 0x1C, 0x03, 0xFE, 0x7F, 0xE3, 0xFF, 0x80, 0xF0, 0x33, + 0xFC, 0xF8, 0x07, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0xB8, 0x7D, 0xE7, + 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xEF, + 0xFF, 0x31, 0xE7, 0x8C, 0x03, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, + 0xBF, 0x06, 0x0F, 0x0F, 0x06, 0x00, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xCF, 0xCE, 0x7C, 0xF8, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0xF9, 0xE1, 0x8F, 0x10, 0x79, + 0x03, 0xD8, 0x1F, 0xE0, 0xF7, 0x87, 0x9E, 0x3C, 0x71, 0xE3, 0xDF, 0xBF, + 0xF9, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0xBF, + 0xFB, 0xCF, 0x0F, 0xBE, 0x79, 0xE7, 0x8F, 0x3C, 0xF1, 0xE7, 0x9E, 0x3C, + 0xF3, 0xC7, 0x9E, 0x78, 0xF3, 0xCF, 0x1E, 0x79, 0xE3, 0xCF, 0x3C, 0x7B, + 0xFF, 0xDF, 0x80, 0xFB, 0x87, 0xDE, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, + 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0xFF, 0xF0, 0x1F, 0x07, 0x71, 0xC7, + 0x78, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0x71, 0xC7, 0x70, 0x7C, 0x00, + 0xFB, 0x87, 0xDE, 0x78, 0xE7, 0x8F, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F, + 0x78, 0xE7, 0x9E, 0x7F, 0x87, 0x80, 0x78, 0x07, 0x80, 0x78, 0x0F, 0xC0, + 0x1E, 0x23, 0x9E, 0x71, 0xEF, 0x1E, 0xF1, 0xEF, 0x1E, 0xF1, 0xEF, 0x1E, + 0x71, 0xE7, 0x9E, 0x1F, 0xE0, 0x1E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3F, + 0xF9, 0xDF, 0xF7, 0xDD, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, + 0x0F, 0xC0, 0x3D, 0x43, 0xC3, 0xE0, 0xFC, 0x7E, 0x1F, 0x87, 0x83, 0xC2, + 0xBC, 0x08, 0x18, 0x38, 0x78, 0xFC, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x79, 0x3E, 0xFB, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, + 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x3F, 0xF0, 0xFC, 0xEF, 0x08, + 0xE1, 0x1E, 0x41, 0xC8, 0x3D, 0x03, 0xC0, 0x78, 0x0E, 0x00, 0xC0, 0x10, + 0x00, 0xFD, 0xF7, 0xBC, 0x71, 0x9E, 0x38, 0x87, 0x1E, 0x43, 0xCF, 0x40, + 0xEB, 0xA0, 0x7C, 0xF0, 0x1C, 0x70, 0x0E, 0x38, 0x06, 0x08, 0x01, 0x04, + 0x00, 0xFC, 0xF7, 0x84, 0x3C, 0x81, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x80, + 0xBC, 0x13, 0xC2, 0x1E, 0xFB, 0xF0, 0xFC, 0xEF, 0x08, 0xE1, 0x1E, 0x43, + 0xC8, 0x3A, 0x07, 0xC0, 0x78, 0x0E, 0x01, 0xC0, 0x18, 0x02, 0x00, 0x41, + 0xC8, 0x3A, 0x03, 0x80, 0xFF, 0xB1, 0xE8, 0x70, 0x3C, 0x1E, 0x07, 0x83, + 0xC1, 0xE0, 0x78, 0xBC, 0x2F, 0xF8, 0x07, 0x0E, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0xE0, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x18, 0x07, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x70, 0xE0, 0x70, 0x1F, 0x8B, 0x3F, 0x01, 0xC0}; + +const GFXglyph FreeSerifBold12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 6, 0, 1}, // 0x20 ' ' + {0, 4, 16, 8, 2, -15}, // 0x21 '!' + {8, 9, 7, 13, 2, -15}, // 0x22 '"' + {16, 12, 16, 12, 0, -15}, // 0x23 '#' + {40, 11, 20, 12, 1, -17}, // 0x24 '$' + {68, 18, 16, 24, 3, -15}, // 0x25 '%' + {104, 18, 16, 20, 1, -15}, // 0x26 '&' + {140, 3, 7, 7, 2, -15}, // 0x27 ''' + {143, 6, 21, 8, 1, -16}, // 0x28 '(' + {159, 6, 21, 8, 1, -16}, // 0x29 ')' + {175, 9, 10, 12, 2, -15}, // 0x2A '*' + {187, 12, 12, 16, 2, -11}, // 0x2B '+' + {205, 4, 8, 6, 1, -3}, // 0x2C ',' + {209, 6, 3, 8, 1, -6}, // 0x2D '-' + {212, 4, 4, 6, 1, -3}, // 0x2E '.' + {214, 8, 17, 7, -1, -15}, // 0x2F '/' + {231, 11, 16, 12, 1, -15}, // 0x30 '0' + {253, 9, 16, 12, 1, -15}, // 0x31 '1' + {271, 12, 16, 12, 0, -15}, // 0x32 '2' + {295, 11, 16, 12, 1, -15}, // 0x33 '3' + {317, 10, 16, 12, 1, -15}, // 0x34 '4' + {337, 11, 16, 12, 1, -15}, // 0x35 '5' + {359, 11, 16, 12, 1, -15}, // 0x36 '6' + {381, 11, 16, 12, 0, -15}, // 0x37 '7' + {403, 11, 16, 12, 1, -15}, // 0x38 '8' + {425, 11, 16, 12, 1, -15}, // 0x39 '9' + {447, 4, 11, 8, 2, -10}, // 0x3A ':' + {453, 4, 15, 8, 2, -10}, // 0x3B ';' + {461, 14, 14, 16, 1, -12}, // 0x3C '<' + {486, 14, 8, 16, 1, -9}, // 0x3D '=' + {500, 14, 14, 16, 1, -12}, // 0x3E '>' + {525, 10, 16, 12, 1, -15}, // 0x3F '?' + {545, 16, 16, 22, 3, -15}, // 0x40 '@' + {577, 17, 16, 17, 0, -15}, // 0x41 'A' + {611, 14, 16, 16, 1, -15}, // 0x42 'B' + {639, 15, 16, 17, 1, -15}, // 0x43 'C' + {669, 17, 16, 18, 0, -15}, // 0x44 'D' + {703, 15, 16, 16, 1, -15}, // 0x45 'E' + {733, 14, 16, 15, 1, -15}, // 0x46 'F' + {761, 16, 16, 19, 1, -15}, // 0x47 'G' + {793, 16, 16, 19, 2, -15}, // 0x48 'H' + {825, 8, 16, 9, 1, -15}, // 0x49 'I' + {841, 12, 18, 12, 0, -15}, // 0x4A 'J' + {868, 17, 16, 19, 2, -15}, // 0x4B 'K' + {902, 14, 16, 16, 2, -15}, // 0x4C 'L' + {930, 20, 16, 23, 1, -15}, // 0x4D 'M' + {970, 15, 16, 17, 1, -15}, // 0x4E 'N' + {1000, 17, 16, 19, 1, -15}, // 0x4F 'O' + {1034, 12, 16, 15, 2, -15}, // 0x50 'P' + {1058, 17, 20, 19, 1, -15}, // 0x51 'Q' + {1101, 16, 16, 17, 1, -15}, // 0x52 'R' + {1133, 12, 16, 14, 1, -15}, // 0x53 'S' + {1157, 15, 16, 15, 0, -15}, // 0x54 'T' + {1187, 15, 16, 17, 1, -15}, // 0x55 'U' + {1217, 17, 17, 17, 0, -15}, // 0x56 'V' + {1254, 23, 16, 24, 0, -15}, // 0x57 'W' + {1300, 17, 16, 17, 0, -15}, // 0x58 'X' + {1334, 16, 16, 17, 1, -15}, // 0x59 'Y' + {1366, 15, 16, 16, 0, -15}, // 0x5A 'Z' + {1396, 5, 20, 8, 2, -15}, // 0x5B '[' + {1409, 8, 17, 7, -1, -15}, // 0x5C '\' + {1426, 5, 20, 8, 2, -15}, // 0x5D ']' + {1439, 10, 9, 14, 2, -15}, // 0x5E '^' + {1451, 12, 1, 12, 0, 4}, // 0x5F '_' + {1453, 5, 4, 8, 0, -16}, // 0x60 '`' + {1456, 11, 11, 12, 1, -10}, // 0x61 'a' + {1472, 12, 16, 13, 1, -15}, // 0x62 'b' + {1496, 9, 11, 10, 1, -10}, // 0x63 'c' + {1509, 12, 16, 13, 1, -15}, // 0x64 'd' + {1533, 10, 11, 11, 1, -10}, // 0x65 'e' + {1547, 8, 16, 9, 1, -15}, // 0x66 'f' + {1563, 11, 16, 12, 1, -10}, // 0x67 'g' + {1585, 12, 16, 13, 1, -15}, // 0x68 'h' + {1609, 6, 16, 7, 1, -15}, // 0x69 'i' + {1621, 8, 21, 10, 0, -15}, // 0x6A 'j' + {1642, 13, 16, 13, 1, -15}, // 0x6B 'k' + {1668, 6, 16, 7, 1, -15}, // 0x6C 'l' + {1680, 19, 11, 20, 1, -10}, // 0x6D 'm' + {1707, 12, 11, 13, 1, -10}, // 0x6E 'n' + {1724, 11, 11, 12, 1, -10}, // 0x6F 'o' + {1740, 12, 16, 13, 1, -10}, // 0x70 'p' + {1764, 12, 16, 13, 1, -10}, // 0x71 'q' + {1788, 10, 11, 10, 1, -10}, // 0x72 'r' + {1802, 8, 11, 10, 1, -10}, // 0x73 's' + {1813, 8, 15, 8, 1, -14}, // 0x74 't' + {1828, 12, 11, 14, 1, -10}, // 0x75 'u' + {1845, 11, 11, 12, 0, -10}, // 0x76 'v' + {1861, 17, 11, 17, 0, -10}, // 0x77 'w' + {1885, 12, 11, 12, 0, -10}, // 0x78 'x' + {1902, 11, 16, 12, 0, -10}, // 0x79 'y' + {1924, 10, 11, 11, 1, -10}, // 0x7A 'z' + {1938, 8, 21, 9, 0, -16}, // 0x7B '{' + {1959, 2, 17, 5, 2, -15}, // 0x7C '|' + {1964, 8, 21, 9, 2, -16}, // 0x7D '}' + {1985, 11, 4, 12, 1, -7}}; // 0x7E '~' + +const GFXfont FreeSerifBold12pt7b PROGMEM = { + (uint8_t *)FreeSerifBold12pt7bBitmaps, + (GFXglyph *)FreeSerifBold12pt7bGlyphs, 0x20, 0x7E, 29}; + +// Approx. 2663 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h new file mode 100644 index 0000000..faecf4f --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h @@ -0,0 +1,464 @@ +#pragma once +#include + +const uint8_t FreeSerifBold18pt7bBitmaps[] PROGMEM = { + 0x7B, 0xEF, 0xFF, 0xFF, 0xF7, 0x9E, 0x71, 0xC7, 0x0C, 0x20, 0x82, 0x00, + 0x00, 0x07, 0x3E, 0xFF, 0xFF, 0xDC, 0x60, 0x37, 0x83, 0xFC, 0x1F, 0xE0, + 0xFF, 0x07, 0xB8, 0x3D, 0xC0, 0xCC, 0x06, 0x20, 0x31, 0x01, 0x80, 0x03, + 0x8E, 0x00, 0xC3, 0x80, 0x30, 0xE0, 0x1C, 0x38, 0x07, 0x0E, 0x01, 0xC3, + 0x87, 0xFF, 0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xC1, 0x87, 0x00, 0xE1, 0xC0, + 0x38, 0x70, 0x0E, 0x1C, 0x03, 0x86, 0x0F, 0xFF, 0xF3, 0xFF, 0xFC, 0xFF, + 0xFF, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0x70, 0xE0, 0x1C, 0x30, 0x07, 0x0C, + 0x01, 0x87, 0x00, 0x61, 0xC0, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0xFF, + 0x03, 0x27, 0x8C, 0x47, 0x38, 0x86, 0x71, 0x0C, 0xF2, 0x09, 0xF4, 0x03, + 0xF8, 0x03, 0xF8, 0x07, 0xFC, 0x03, 0xFC, 0x03, 0xFE, 0x01, 0xFE, 0x03, + 0xFC, 0x04, 0xFC, 0x08, 0xFA, 0x10, 0xF4, 0x21, 0xEC, 0x43, 0xD8, 0x8F, + 0x3D, 0x3C, 0x3F, 0xF0, 0x1F, 0x00, 0x08, 0x00, 0x10, 0x00, 0x03, 0xC0, + 0x18, 0x01, 0xFE, 0x0F, 0x00, 0x7C, 0xFF, 0xC0, 0x1F, 0x0F, 0x90, 0x07, + 0xC1, 0x06, 0x00, 0xF0, 0x21, 0x80, 0x3E, 0x04, 0x30, 0x07, 0x81, 0x8C, + 0x00, 0xF0, 0x21, 0x80, 0x1E, 0x0C, 0x60, 0x03, 0xC1, 0x18, 0x1E, 0x3C, + 0xE3, 0x0F, 0xE7, 0xF8, 0xC3, 0xE6, 0x3C, 0x18, 0xF8, 0x40, 0x06, 0x3E, + 0x08, 0x01, 0x87, 0x81, 0x00, 0x31, 0xF0, 0x20, 0x0C, 0x3E, 0x04, 0x01, + 0x87, 0x81, 0x00, 0x60, 0xF0, 0x60, 0x18, 0x1E, 0x08, 0x03, 0x03, 0xC7, + 0x00, 0xC0, 0x3F, 0xC0, 0x18, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x00, 0x7F, + 0xE0, 0x00, 0x38, 0xF8, 0x00, 0x1E, 0x1F, 0x00, 0x07, 0x83, 0xC0, 0x01, + 0xF0, 0xF0, 0x00, 0x7C, 0x38, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0xF0, 0x1F, 0xF0, 0x18, 0x1C, 0xFE, + 0x0C, 0x0E, 0x1F, 0xC3, 0x07, 0x87, 0xF1, 0x81, 0xE0, 0xFE, 0x40, 0xF8, + 0x1F, 0xF0, 0x3F, 0x07, 0xF8, 0x0F, 0xC0, 0xFE, 0x03, 0xF8, 0x1F, 0xC0, + 0xFE, 0x07, 0xF8, 0x9F, 0xE3, 0xFF, 0xE7, 0xFF, 0x9F, 0xF0, 0xFF, 0xC3, + 0xF8, 0x0F, 0x80, 0x3C, 0x00, 0x6F, 0xFF, 0xFF, 0x66, 0x66, 0x00, 0x81, + 0x81, 0x81, 0x81, 0x80, 0xC0, 0xE0, 0x70, 0x70, 0x38, 0x3C, 0x1E, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x0E, 0x07, 0x03, 0x80, 0xE0, + 0x70, 0x18, 0x06, 0x01, 0x00, 0x40, 0x10, 0x04, 0x80, 0x30, 0x0C, 0x03, + 0x00, 0xC0, 0x60, 0x38, 0x1C, 0x07, 0x03, 0x81, 0xC0, 0xF0, 0x78, 0x3C, + 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xE0, 0x70, 0x38, 0x38, 0x1C, 0x0C, + 0x0C, 0x06, 0x04, 0x04, 0x04, 0x00, 0x03, 0x00, 0x1E, 0x00, 0x78, 0x1D, + 0xE6, 0xFB, 0x3D, 0xED, 0xF3, 0xFF, 0x01, 0xC0, 0x7F, 0xF3, 0xED, 0xFF, + 0x33, 0xD9, 0xE6, 0x07, 0x80, 0x1E, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, + 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, + 0x38, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x73, 0xEF, 0xFF, 0xFD, 0xF0, + 0xC2, 0x18, 0xC6, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x7B, 0xFF, 0xFF, 0xFD, + 0xE0, 0x00, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, + 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, + 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x00, + 0x03, 0xC0, 0x0E, 0x70, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x7C, 0x3E, + 0x7C, 0x3E, 0x7C, 0x3E, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3E, 0x7C, 0x3E, + 0x7C, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C, 0x1E, 0x78, 0x0E, 0x70, 0x03, 0xC0, + 0x00, 0xC0, 0x3C, 0x0F, 0xC3, 0xFC, 0x4F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x1F, 0xEF, 0xFF, + 0x03, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3F, 0xFC, 0x30, 0xFE, 0x60, 0x7E, + 0x40, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x78, + 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x01, + 0x0C, 0x03, 0x1F, 0xFF, 0x1F, 0xFF, 0x3F, 0xFE, 0x7F, 0xFE, 0xFF, 0xFE, + 0x03, 0xF0, 0x0F, 0xF8, 0x3F, 0xFC, 0x21, 0xFE, 0x40, 0xFE, 0x00, 0x7E, + 0x00, 0x7E, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xFC, 0x03, 0xFE, + 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, + 0x00, 0x0E, 0x70, 0x0E, 0xFC, 0x1C, 0xFE, 0x38, 0x7F, 0xE0, 0x3F, 0x80, + 0x00, 0x38, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0x5F, 0x00, + 0xBE, 0x02, 0x7C, 0x08, 0xF8, 0x31, 0xF0, 0x43, 0xE1, 0x07, 0xC4, 0x0F, + 0x88, 0x1F, 0x20, 0x3E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x0F, 0xFE, 0x1F, + 0xF8, 0x7F, 0xF0, 0xFF, 0xE1, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, + 0x3F, 0x80, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xC3, 0xFF, 0x80, 0x3F, 0x80, + 0x0F, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x37, 0x80, 0x4F, 0x81, + 0x9F, 0xC6, 0x3F, 0xF8, 0x1F, 0x80, 0x00, 0x07, 0x00, 0x7C, 0x01, 0xF0, + 0x03, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, + 0x7F, 0xF0, 0x7F, 0xFC, 0xFC, 0x7E, 0xFC, 0x7E, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0x7C, 0x3F, 0x7C, 0x3E, 0x3C, 0x3E, + 0x3E, 0x3C, 0x1E, 0x78, 0x07, 0xE0, 0x7F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFE, + 0xFF, 0xFE, 0xFF, 0xFC, 0xC0, 0x1C, 0x80, 0x18, 0x80, 0x38, 0x00, 0x38, + 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, + 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x80, + 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0xE0, 0x38, 0x78, 0x70, 0x3C, + 0xF0, 0x1E, 0xF0, 0x1E, 0xF8, 0x1E, 0xF8, 0x1E, 0xFE, 0x3C, 0x7F, 0xB0, + 0x7F, 0xE0, 0x3F, 0xF0, 0x0F, 0xF8, 0x1F, 0xFC, 0x39, 0xFE, 0x70, 0xFF, + 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x1F, 0xF0, 0x1F, 0xF0, 0x1E, 0x78, 0x3E, + 0x7C, 0x7C, 0x3F, 0xF8, 0x0F, 0xE0, 0x07, 0xE0, 0x1E, 0x78, 0x3C, 0x7C, + 0x7C, 0x3C, 0x7C, 0x3E, 0xFC, 0x3E, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x3F, 0xFC, 0x3F, 0x7E, 0x3F, 0x7E, 0x3F, 0x3F, 0xFE, 0x0F, 0xFE, + 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xC0, + 0x0F, 0x80, 0x3E, 0x00, 0xE0, 0x00, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, + 0x00, 0x07, 0xBF, 0xFF, 0xFF, 0xDE, 0x39, 0xFB, 0xF7, 0xEF, 0xC7, 0x00, + 0x00, 0x00, 0x01, 0xE7, 0xEF, 0xFF, 0xFF, 0xBF, 0x06, 0x08, 0x30, 0xC2, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x07, 0xF0, + 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, + 0xC0, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, + 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x18, 0x00, 0x03, + 0xE0, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, + 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x1F, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0x1F, + 0xB8, 0x3E, 0xF0, 0xFF, 0xC3, 0xFF, 0x0F, 0xD8, 0x3F, 0x00, 0xF8, 0x07, + 0xC0, 0x1E, 0x00, 0x60, 0x03, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x03, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x01, + 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xE0, 0x07, 0xC0, 0xF0, 0x0F, 0x00, + 0x38, 0x1E, 0x00, 0x0C, 0x3C, 0x07, 0x06, 0x38, 0x1F, 0x72, 0x78, 0x3C, + 0xF3, 0x78, 0x78, 0xE1, 0xF0, 0x70, 0xE1, 0xF0, 0xF0, 0xE1, 0xF0, 0xE0, + 0xC1, 0xF1, 0xE1, 0xC1, 0xF1, 0xC1, 0xC1, 0xF1, 0xC3, 0x82, 0xF1, 0xC3, + 0x86, 0x71, 0xC7, 0x8C, 0x79, 0xFB, 0xF8, 0x78, 0xF1, 0xF0, 0x3C, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x78, 0x03, 0xFF, + 0xE0, 0x00, 0x7F, 0x80, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0xFE, 0x00, 0x01, 0xBF, 0x00, 0x01, 0xBF, 0x00, 0x01, 0x1F, + 0x00, 0x03, 0x1F, 0x80, 0x02, 0x1F, 0x80, 0x06, 0x0F, 0xC0, 0x06, 0x0F, + 0xC0, 0x04, 0x07, 0xE0, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x18, 0x03, + 0xF0, 0x18, 0x03, 0xF0, 0x30, 0x01, 0xF8, 0x30, 0x01, 0xF8, 0x70, 0x01, + 0xFC, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xE1, 0xF8, + 0x3F, 0x07, 0xC1, 0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x7E, 0x0F, 0xC3, 0xF0, + 0x7E, 0x1F, 0x87, 0xE0, 0xFC, 0x7C, 0x07, 0xFF, 0x00, 0x3F, 0xFF, 0x01, + 0xF8, 0xFE, 0x0F, 0xC1, 0xF8, 0x7E, 0x0F, 0xC3, 0xF0, 0x3F, 0x1F, 0x81, + 0xF8, 0xFC, 0x0F, 0xC7, 0xE0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x3F, 0x0F, + 0xC3, 0xF0, 0xFF, 0xFF, 0x1F, 0xFF, 0xC0, 0x00, 0x7E, 0x04, 0x07, 0xFF, + 0x18, 0x1F, 0x07, 0xF0, 0x7C, 0x03, 0xE1, 0xF0, 0x03, 0xC7, 0xC0, 0x03, + 0x9F, 0x80, 0x03, 0x3F, 0x00, 0x06, 0x7C, 0x00, 0x05, 0xF8, 0x00, 0x03, + 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, + 0x00, 0x01, 0xF0, 0x00, 0x23, 0xF0, 0x00, 0xC3, 0xF0, 0x07, 0x03, 0xF0, + 0x3C, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, + 0x00, 0x7E, 0x1F, 0x80, 0xFC, 0x1F, 0x81, 0xF8, 0x1F, 0x83, 0xF0, 0x1F, + 0x07, 0xE0, 0x3F, 0x0F, 0xC0, 0x7E, 0x1F, 0x80, 0x7E, 0x3F, 0x00, 0xFC, + 0x7E, 0x01, 0xF8, 0xFC, 0x03, 0xF1, 0xF8, 0x07, 0xE3, 0xF0, 0x0F, 0xC7, + 0xE0, 0x1F, 0x8F, 0xC0, 0x3F, 0x1F, 0x80, 0x7C, 0x3F, 0x01, 0xF8, 0x7E, + 0x03, 0xE0, 0xFC, 0x0F, 0x81, 0xF8, 0x1F, 0x03, 0xF0, 0xFC, 0x0F, 0xFF, + 0xE0, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xC0, 0x78, + 0x7E, 0x01, 0xC3, 0xF0, 0x06, 0x1F, 0x80, 0x10, 0xFC, 0x10, 0x87, 0xE0, + 0x80, 0x3F, 0x0C, 0x01, 0xF8, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03, + 0xF1, 0xC0, 0x1F, 0x86, 0x00, 0xFC, 0x10, 0x07, 0xE0, 0x80, 0x3F, 0x00, + 0x09, 0xF8, 0x00, 0xCF, 0xC0, 0x0C, 0x7E, 0x00, 0x63, 0xF0, 0x0F, 0x1F, + 0x81, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xFF, 0xFC, + 0xFC, 0x0F, 0x9F, 0x80, 0x73, 0xF0, 0x06, 0x7E, 0x00, 0x4F, 0xC1, 0x09, + 0xF8, 0x20, 0x3F, 0x0C, 0x07, 0xE3, 0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, + 0xF1, 0xC0, 0x7E, 0x18, 0x0F, 0xC1, 0x01, 0xF8, 0x20, 0x3F, 0x00, 0x07, + 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F, + 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7E, 0x02, 0x01, 0xFF, 0xE3, 0x01, 0xF0, + 0x3F, 0x81, 0xF0, 0x07, 0xC1, 0xF0, 0x01, 0xE1, 0xF0, 0x00, 0x71, 0xF8, + 0x00, 0x18, 0xFC, 0x00, 0x0C, 0x7C, 0x00, 0x02, 0x7E, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, + 0xF0, 0x0F, 0xFF, 0xF8, 0x01, 0xFE, 0x7C, 0x00, 0x7E, 0x3F, 0x00, 0x3F, + 0x1F, 0x80, 0x1F, 0x87, 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0xFC, 0x03, + 0xF0, 0x1F, 0x83, 0xF0, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0xFF, + 0xC3, 0xFF, 0x7F, 0x81, 0xFE, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x7F, 0x81, 0xFE, 0xFF, 0xC3, 0xFF, 0xFF, + 0xEF, 0xF0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, + 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, + 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x1F, 0xE7, 0xFF, 0x07, 0xFF, 0x01, 0xFE, + 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, + 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, + 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, + 0x70, 0xFC, 0xF8, 0xFC, 0xF8, 0xF8, 0xF0, 0xF8, 0x71, 0xF0, 0x7F, 0xE0, + 0x1F, 0x80, 0xFF, 0xC3, 0xFF, 0x3F, 0xC0, 0x3E, 0x0F, 0xC0, 0x1C, 0x07, + 0xE0, 0x18, 0x03, 0xF0, 0x18, 0x01, 0xF8, 0x18, 0x00, 0xFC, 0x18, 0x00, + 0x7E, 0x18, 0x00, 0x3F, 0x18, 0x00, 0x1F, 0x9C, 0x00, 0x0F, 0xDF, 0x00, + 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xF0, 0x01, 0xF9, 0xF8, 0x00, 0xFC, 0xFE, + 0x00, 0x7E, 0x3F, 0x80, 0x3F, 0x0F, 0xE0, 0x1F, 0x83, 0xF8, 0x0F, 0xC0, + 0xFC, 0x07, 0xE0, 0x7F, 0x03, 0xF0, 0x1F, 0xC1, 0xF8, 0x07, 0xF1, 0xFE, + 0x03, 0xFD, 0xFF, 0x8F, 0xFF, 0xFF, 0xE0, 0x03, 0xFC, 0x00, 0x0F, 0xC0, + 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, + 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x01, 0x3F, + 0x00, 0x19, 0xF8, 0x00, 0xCF, 0xC0, 0x0C, 0x7E, 0x00, 0x63, 0xF0, 0x0F, + 0x1F, 0x81, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0x80, 0x03, 0xFE, + 0x7F, 0x00, 0x07, 0xF8, 0x7E, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x3F, 0xC1, + 0x7C, 0x00, 0x5F, 0x82, 0xFC, 0x01, 0xBF, 0x05, 0xF8, 0x02, 0x7E, 0x09, + 0xF8, 0x0C, 0xFC, 0x13, 0xF0, 0x11, 0xF8, 0x23, 0xE0, 0x23, 0xF0, 0x47, + 0xE0, 0xC7, 0xE0, 0x87, 0xC1, 0x0F, 0xC1, 0x0F, 0xC6, 0x1F, 0x82, 0x0F, + 0x88, 0x3F, 0x04, 0x1F, 0xB0, 0x7E, 0x08, 0x3F, 0x60, 0xFC, 0x10, 0x3E, + 0x81, 0xF8, 0x20, 0x7F, 0x03, 0xF0, 0x40, 0x7C, 0x07, 0xE0, 0x80, 0xF8, + 0x0F, 0xC1, 0x00, 0xE0, 0x1F, 0x82, 0x01, 0xC0, 0x3F, 0x0E, 0x03, 0x80, + 0xFF, 0x7F, 0x82, 0x03, 0xFF, 0xFE, 0x00, 0xFE, 0xFE, 0x00, 0x70, 0xFE, + 0x00, 0x40, 0xFE, 0x00, 0x81, 0xFC, 0x01, 0x03, 0xFC, 0x02, 0x05, 0xFC, + 0x04, 0x09, 0xFC, 0x08, 0x11, 0xFC, 0x10, 0x23, 0xF8, 0x20, 0x43, 0xF8, + 0x40, 0x83, 0xF8, 0x81, 0x03, 0xF9, 0x02, 0x03, 0xFA, 0x04, 0x03, 0xF4, + 0x08, 0x07, 0xF8, 0x10, 0x07, 0xF0, 0x20, 0x07, 0xE0, 0x40, 0x07, 0xC0, + 0x80, 0x07, 0x81, 0x00, 0x0F, 0x02, 0x00, 0x0E, 0x0E, 0x00, 0x0C, 0x7F, + 0x00, 0x08, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xF0, 0x7C, 0x01, + 0xF0, 0x1F, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x01, 0xF1, 0xF8, 0x00, 0xFC, + 0xFC, 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x0F, 0xFF, 0x00, 0x07, + 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, + 0x7F, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x9F, 0x80, + 0x0F, 0xC7, 0xC0, 0x07, 0xC1, 0xF0, 0x07, 0xC0, 0xFC, 0x07, 0xE0, 0x3F, + 0x07, 0xC0, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xFC, 0x0F, + 0xFF, 0xE0, 0xFC, 0x7E, 0x1F, 0x87, 0xE3, 0xF0, 0x7E, 0x7E, 0x0F, 0xCF, + 0xC1, 0xF9, 0xF8, 0x3F, 0x3F, 0x07, 0xE7, 0xE0, 0xFC, 0xFC, 0x3F, 0x1F, + 0x8F, 0xC3, 0xFF, 0xF0, 0x7F, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, + 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, + 0x00, 0x1F, 0xE0, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, + 0x01, 0xF0, 0x7C, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x01, + 0xF1, 0xF8, 0x00, 0xFC, 0xFC, 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, + 0x0F, 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, + 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x3E, + 0x00, 0x0F, 0x9F, 0x80, 0x0F, 0xC7, 0xC0, 0x07, 0xC1, 0xF0, 0x07, 0xC0, + 0x78, 0x03, 0xC0, 0x1E, 0x07, 0xC0, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, + 0xF8, 0x00, 0x0F, 0xE0, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0xFC, 0x3F, + 0x01, 0xF8, 0x3F, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, 0xC0, 0xFC, + 0x1F, 0x81, 0xF8, 0x3F, 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xFC, 0x1F, 0x81, + 0xF8, 0x7E, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x0F, 0xDF, 0xC0, 0x1F, + 0x9F, 0x80, 0x3F, 0x1F, 0x80, 0x7E, 0x3F, 0x80, 0xFC, 0x3F, 0x81, 0xF8, + 0x3F, 0x03, 0xF0, 0x7F, 0x07, 0xE0, 0x7F, 0x1F, 0xE0, 0x7F, 0x7F, 0xE0, + 0xFF, 0x07, 0xC2, 0x1F, 0xF2, 0x3C, 0x3E, 0x70, 0x0E, 0xF0, 0x06, 0xF0, + 0x06, 0xF0, 0x02, 0xF8, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x7F, 0xE0, 0x3F, + 0xF8, 0x1F, 0xFC, 0x0F, 0xFE, 0x03, 0xFE, 0x00, 0xFF, 0x00, 0x3F, 0x80, + 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0E, 0xF0, 0x1E, 0xF8, 0x3C, 0x9F, + 0xF8, 0x87, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x3F, 0x83, + 0xF0, 0x7C, 0x1F, 0x81, 0xC0, 0xFC, 0x06, 0x07, 0xE0, 0x20, 0x3F, 0x00, + 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, + 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, + 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, + 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0xE0, 0xFF, 0xC1, 0xFD, 0xFE, 0x01, 0xC3, + 0xF0, 0x02, 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, + 0x02, 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, + 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, 0x0F, + 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, 0x0F, 0xC0, + 0x18, 0x1F, 0x80, 0x40, 0x7E, 0x03, 0x00, 0xFC, 0x18, 0x01, 0xFF, 0xC0, + 0x00, 0xFC, 0x00, 0xFF, 0xF0, 0x7F, 0x3F, 0xC0, 0x1E, 0x1F, 0x80, 0x0C, + 0x1F, 0x80, 0x08, 0x0F, 0xC0, 0x18, 0x0F, 0xC0, 0x18, 0x07, 0xE0, 0x10, + 0x07, 0xE0, 0x30, 0x07, 0xE0, 0x20, 0x03, 0xF0, 0x60, 0x03, 0xF0, 0x60, + 0x01, 0xF8, 0x40, 0x01, 0xF8, 0xC0, 0x00, 0xF8, 0x80, 0x00, 0xFC, 0x80, + 0x00, 0xFD, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, + 0x00, 0x0C, 0x00, 0xFF, 0xE7, 0xFF, 0x0F, 0xCF, 0xE0, 0x7F, 0x00, 0xE1, + 0xF8, 0x0F, 0xC0, 0x30, 0x7E, 0x03, 0xF0, 0x0C, 0x1F, 0x80, 0x7C, 0x02, + 0x03, 0xE0, 0x1F, 0x81, 0x80, 0xFC, 0x07, 0xE0, 0x60, 0x3F, 0x03, 0xF8, + 0x10, 0x07, 0xC0, 0xBF, 0x0C, 0x01, 0xF8, 0x2F, 0xC3, 0x00, 0x7E, 0x19, + 0xF0, 0x80, 0x0F, 0x84, 0x7C, 0x60, 0x03, 0xF3, 0x0F, 0x98, 0x00, 0xFC, + 0xC3, 0xE4, 0x00, 0x1F, 0x20, 0xFB, 0x00, 0x07, 0xF8, 0x1F, 0xC0, 0x00, + 0xFC, 0x07, 0xE0, 0x00, 0x3F, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x3E, 0x00, + 0x01, 0xE0, 0x0F, 0x00, 0x00, 0x78, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x70, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x06, 0x00, 0x00, 0x20, 0x00, + 0x80, 0x00, 0xFF, 0xF3, 0xFE, 0x7F, 0x80, 0x78, 0x3F, 0x80, 0x70, 0x1F, + 0xC0, 0x60, 0x0F, 0xC0, 0xC0, 0x0F, 0xE1, 0x80, 0x07, 0xF1, 0x00, 0x03, + 0xF3, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x9F, 0x80, 0x01, 0x8F, 0xC0, 0x03, 0x0F, 0xE0, 0x06, 0x07, 0xE0, 0x06, + 0x07, 0xF0, 0x0C, 0x03, 0xF8, 0x1C, 0x03, 0xF8, 0x3C, 0x03, 0xFC, 0xFF, + 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0x7F, 0x80, 0x1E, 0x3F, 0x80, 0x1C, 0x1F, + 0x80, 0x18, 0x1F, 0xC0, 0x10, 0x0F, 0xC0, 0x30, 0x07, 0xE0, 0x20, 0x07, + 0xE0, 0x60, 0x03, 0xF0, 0xC0, 0x03, 0xF0, 0x80, 0x01, 0xF9, 0x80, 0x01, + 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x00, 0x01, + 0xFF, 0x80, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0x01, 0xF8, 0xE0, 0x1F, + 0x86, 0x01, 0xFC, 0x20, 0x0F, 0xC1, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, + 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, + 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x01, 0x0F, 0xC0, 0x18, 0xFC, + 0x00, 0xC7, 0xE0, 0x06, 0x7E, 0x00, 0x77, 0xF0, 0x07, 0x3F, 0x00, 0xFB, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xE0, 0x1E, + 0x01, 0xC0, 0x38, 0x07, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0x80, + 0x70, 0x07, 0x00, 0xE0, 0x1C, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x70, 0x0E, + 0x01, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0xFF, 0xFF, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x7E, 0x00, 0xEE, 0x03, + 0x9C, 0x07, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0xE0, 0x71, 0xC0, 0x77, 0x00, + 0xEE, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE0, 0xF0, + 0x78, 0x3C, 0x0E, 0x07, 0x0F, 0xE0, 0x3F, 0xF0, 0x78, 0xF8, 0x78, 0x7C, + 0x78, 0x7C, 0x38, 0x7C, 0x00, 0x7C, 0x03, 0xFC, 0x1E, 0x7C, 0x7C, 0x7C, + 0xFC, 0x7C, 0xFC, 0x7C, 0xFC, 0xFC, 0xFF, 0xFD, 0x7F, 0x7F, 0x3C, 0x3C, + 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0xF8, 0x1F, 0x7F, 0x87, 0xE3, + 0xF1, 0xF0, 0x7E, 0x7C, 0x0F, 0x9F, 0x03, 0xF7, 0xC0, 0xFD, 0xF0, 0x3F, + 0x7C, 0x0F, 0xDF, 0x03, 0xF7, 0xC0, 0xFD, 0xF0, 0x3E, 0x7C, 0x1F, 0x1F, + 0x8F, 0xC6, 0x7F, 0xC1, 0x07, 0xC0, 0x07, 0xC0, 0x7F, 0xC3, 0xC7, 0x9F, + 0x1E, 0x78, 0x7B, 0xE1, 0xCF, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, + 0x80, 0x3F, 0x00, 0x7C, 0x00, 0xFC, 0x61, 0xFF, 0x03, 0xF0, 0x00, 0x7F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, + 0x01, 0xF0, 0x00, 0x7C, 0x07, 0x9F, 0x07, 0xF7, 0xC3, 0xE3, 0xF1, 0xF8, + 0x7C, 0x7C, 0x1F, 0x3F, 0x07, 0xCF, 0xC1, 0xF3, 0xF0, 0x7C, 0xFC, 0x1F, + 0x3F, 0x07, 0xCF, 0xC1, 0xF1, 0xF0, 0x7C, 0x7E, 0x1F, 0x0F, 0x8F, 0xC1, + 0xFD, 0xFC, 0x3E, 0x70, 0x0F, 0xC0, 0x7F, 0xC3, 0xC7, 0x1E, 0x1E, 0xF8, + 0x7B, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, + 0x03, 0x7E, 0x18, 0xFF, 0xC1, 0xFE, 0x03, 0xF0, 0x0F, 0x83, 0xF8, 0xF3, + 0xBE, 0xF7, 0xDC, 0xF8, 0x1F, 0x03, 0xE0, 0xFF, 0x1F, 0xE1, 0xF0, 0x3E, + 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x1F, 0x07, 0xF8, 0x0F, 0xC0, 0x1F, 0xFF, 0xDF, 0x1F, 0xFF, + 0x07, 0x8F, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7C, 0x78, 0x3C, + 0x1E, 0x3E, 0x03, 0xFC, 0x03, 0x00, 0x07, 0x00, 0x07, 0x80, 0x03, 0xFF, + 0xF1, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F, 0xFF, 0xF8, 0x01, 0xFC, 0x00, 0x7F, + 0x00, 0x73, 0xFF, 0xF0, 0x7F, 0xC0, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, + 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, + 0x7C, 0x3E, 0xFF, 0x1F, 0xCF, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, + 0xF0, 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0x83, + 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xFC, 0x7F, 0x39, 0xFB, 0xF7, + 0xE7, 0x80, 0x00, 0x00, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, + 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x7F, 0x03, 0xC0, 0xFC, 0x1F, 0x83, 0xF0, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, + 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7D, 0xCF, 0xF9, 0xEE, 0x7C, 0xFF, 0x0F, + 0x80, 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x7F, 0x9F, 0x07, 0x87, + 0xC1, 0x81, 0xF0, 0xC0, 0x7C, 0x60, 0x1F, 0x30, 0x07, 0xDE, 0x01, 0xFF, + 0xC0, 0x7F, 0xF0, 0x1F, 0x3E, 0x07, 0xCF, 0xC1, 0xF1, 0xF8, 0x7C, 0x3E, + 0x1F, 0x07, 0xC7, 0xC1, 0xFB, 0xF9, 0xFF, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF, + 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, + 0xE7, 0xCF, 0x9F, 0x7F, 0xFC, 0x7C, 0x1F, 0x0F, 0xBF, 0xCF, 0xF1, 0xF8, + 0xFF, 0x3F, 0x3E, 0x0F, 0x83, 0xE7, 0xC1, 0xF0, 0x7C, 0xF8, 0x3E, 0x0F, + 0x9F, 0x07, 0xC1, 0xF3, 0xE0, 0xF8, 0x3E, 0x7C, 0x1F, 0x07, 0xCF, 0x83, + 0xE0, 0xF9, 0xF0, 0x7C, 0x1F, 0x3E, 0x0F, 0x83, 0xE7, 0xC1, 0xF0, 0x7C, + 0xF8, 0x3E, 0x0F, 0x9F, 0x07, 0xC1, 0xF7, 0xF1, 0xFC, 0x7F, 0xFC, 0x7C, + 0x3E, 0xFF, 0x1F, 0xCF, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, + 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0x83, 0xE7, + 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xFC, 0x7F, 0x07, 0xF0, 0x0F, 0xFE, + 0x0F, 0x8F, 0x8F, 0x87, 0xE7, 0xC1, 0xF7, 0xE0, 0xFF, 0xF0, 0x7F, 0xF8, + 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xEF, 0x83, 0xE7, 0xC1, 0xF1, + 0xF1, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0xFE, 0x7C, 0x07, 0xDF, 0xE0, 0xFE, + 0x3E, 0x1F, 0x07, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0xCF, 0x81, 0xF9, 0xF0, + 0x3F, 0x3E, 0x07, 0xE7, 0xC0, 0xFC, 0xF8, 0x1F, 0x9F, 0x03, 0xE3, 0xE0, + 0xFC, 0x7E, 0x3F, 0x0F, 0xBF, 0xC1, 0xF3, 0xE0, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x1F, 0xE0, + 0x00, 0x07, 0xC1, 0x0F, 0xF9, 0x8F, 0xCD, 0xCF, 0xC3, 0xE7, 0xC1, 0xF7, + 0xE0, 0xFB, 0xF0, 0x7D, 0xF8, 0x3E, 0xFC, 0x1F, 0x7E, 0x0F, 0xBF, 0x07, + 0xDF, 0x83, 0xE7, 0xE1, 0xF1, 0xF1, 0xF8, 0x7F, 0x7C, 0x1F, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xF8, + 0x01, 0xFE, 0xFC, 0x73, 0xEF, 0xDF, 0xFE, 0xFC, 0xF7, 0xC3, 0xBE, 0x01, + 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, + 0x01, 0xF0, 0x1F, 0xE0, 0x1E, 0x23, 0xFE, 0x70, 0xEE, 0x06, 0xE0, 0x2F, + 0x80, 0xFF, 0x07, 0xFC, 0x3F, 0xE0, 0xFF, 0x81, 0xF8, 0x07, 0xC0, 0x7E, + 0x0E, 0xBF, 0xC8, 0xF8, 0x04, 0x03, 0x01, 0xC0, 0xF0, 0x7C, 0x3F, 0xEF, + 0xF9, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, + 0x7C, 0x5F, 0x37, 0xF8, 0xFE, 0x1E, 0x00, 0xFC, 0x7F, 0x1F, 0x07, 0xC7, + 0xC1, 0xF1, 0xF0, 0x7C, 0x7C, 0x1F, 0x1F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, + 0x7C, 0x7C, 0x1F, 0x1F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, 0x7C, 0x7C, 0x1F, + 0x1F, 0x8F, 0xC3, 0xFD, 0xFC, 0x7C, 0x60, 0xFF, 0x9F, 0xBF, 0x83, 0x0F, + 0x81, 0x87, 0xE0, 0x81, 0xF0, 0x40, 0xF8, 0x40, 0x3E, 0x20, 0x1F, 0x30, + 0x07, 0xD0, 0x03, 0xF8, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x0E, + 0x00, 0x07, 0x00, 0x01, 0x00, 0xFF, 0x3F, 0xCF, 0x7E, 0x1F, 0x06, 0x3E, + 0x0F, 0x06, 0x3E, 0x0F, 0x84, 0x1F, 0x0F, 0x8C, 0x1F, 0x1F, 0x88, 0x0F, + 0x17, 0xC8, 0x0F, 0x97, 0xD8, 0x0F, 0xB3, 0xD0, 0x07, 0xE3, 0xF0, 0x07, + 0xE3, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0x81, 0xC0, 0x01, + 0x80, 0xC0, 0x01, 0x80, 0x80, 0xFF, 0x3F, 0x7E, 0x0C, 0x3E, 0x08, 0x3F, + 0x18, 0x1F, 0x30, 0x0F, 0xE0, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x03, + 0xF0, 0x05, 0xF8, 0x0C, 0xF8, 0x18, 0xFC, 0x30, 0x7E, 0x70, 0x7E, 0xFC, + 0xFF, 0xFF, 0x3F, 0x7E, 0x0C, 0x7C, 0x0C, 0x3E, 0x08, 0x3E, 0x08, 0x1E, + 0x18, 0x1F, 0x10, 0x0F, 0x30, 0x0F, 0xA0, 0x0F, 0xA0, 0x07, 0xE0, 0x07, + 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, + 0x00, 0x61, 0x00, 0xF2, 0x00, 0xF6, 0x00, 0xFC, 0x00, 0x78, 0x00, 0x7F, + 0xFD, 0xFF, 0xF7, 0x0F, 0xD0, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x01, + 0xF0, 0x0F, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0xC1, 0x3E, 0x05, 0xF8, 0x7F, + 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xF8, 0x3E, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x87, + 0x80, 0x1E, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, + 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x0F, 0x80, 0x78, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x0F, 0x80, 0xF0, + 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, + 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x0F, 0x0F, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xE0, + 0xF8, 0x3C, 0x00, 0x3E, 0x00, 0x7F, 0xC6, 0xFF, 0xFF, 0x61, 0xFE, 0x00, + 0x7C}; + +const GFXglyph FreeSerifBold18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 9, 0, 1}, // 0x20 ' ' + {0, 6, 24, 12, 3, -23}, // 0x21 '!' + {18, 13, 10, 19, 3, -23}, // 0x22 '"' + {35, 18, 24, 17, 0, -23}, // 0x23 '#' + {89, 15, 28, 17, 1, -25}, // 0x24 '$' + {142, 27, 24, 35, 4, -23}, // 0x25 '%' + {223, 26, 25, 29, 2, -23}, // 0x26 '&' + {305, 4, 10, 10, 3, -23}, // 0x27 ''' + {310, 9, 30, 12, 2, -23}, // 0x28 '(' + {344, 9, 30, 12, 1, -23}, // 0x29 ')' + {378, 14, 15, 18, 2, -23}, // 0x2A '*' + {405, 19, 19, 24, 2, -17}, // 0x2B '+' + {451, 6, 12, 9, 1, -5}, // 0x2C ',' + {460, 8, 4, 12, 2, -9}, // 0x2D '-' + {464, 6, 6, 9, 1, -5}, // 0x2E '.' + {469, 11, 25, 10, -1, -23}, // 0x2F '/' + {504, 16, 24, 18, 1, -23}, // 0x30 '0' + {552, 12, 24, 18, 3, -23}, // 0x31 '1' + {588, 16, 24, 17, 1, -23}, // 0x32 '2' + {636, 16, 24, 18, 0, -23}, // 0x33 '3' + {684, 15, 24, 18, 1, -23}, // 0x34 '4' + {729, 15, 24, 18, 1, -23}, // 0x35 '5' + {774, 16, 24, 18, 1, -23}, // 0x36 '6' + {822, 16, 24, 17, 1, -23}, // 0x37 '7' + {870, 16, 24, 17, 1, -23}, // 0x38 '8' + {918, 16, 24, 18, 1, -23}, // 0x39 '9' + {966, 6, 16, 12, 3, -15}, // 0x3A ':' + {978, 7, 22, 12, 2, -15}, // 0x3B ';' + {998, 19, 20, 24, 2, -18}, // 0x3C '<' + {1046, 19, 12, 24, 2, -14}, // 0x3D '=' + {1075, 19, 20, 24, 3, -18}, // 0x3E '>' + {1123, 14, 24, 18, 2, -23}, // 0x3F '?' + {1165, 24, 25, 33, 4, -23}, // 0x40 '@' + {1240, 24, 24, 25, 1, -23}, // 0x41 'A' + {1312, 21, 24, 23, 1, -23}, // 0x42 'B' + {1375, 23, 25, 25, 1, -23}, // 0x43 'C' + {1447, 23, 24, 26, 1, -23}, // 0x44 'D' + {1516, 21, 24, 23, 2, -23}, // 0x45 'E' + {1579, 19, 24, 22, 2, -23}, // 0x46 'F' + {1636, 25, 25, 27, 1, -23}, // 0x47 'G' + {1715, 24, 24, 27, 2, -23}, // 0x48 'H' + {1787, 11, 24, 14, 2, -23}, // 0x49 'I' + {1820, 16, 27, 18, 0, -23}, // 0x4A 'J' + {1874, 25, 24, 27, 2, -23}, // 0x4B 'K' + {1949, 21, 24, 23, 2, -23}, // 0x4C 'L' + {2012, 31, 24, 33, 1, -23}, // 0x4D 'M' + {2105, 23, 24, 25, 1, -23}, // 0x4E 'N' + {2174, 25, 25, 27, 1, -23}, // 0x4F 'O' + {2253, 19, 24, 22, 2, -23}, // 0x50 'P' + {2310, 25, 30, 27, 1, -23}, // 0x51 'Q' + {2404, 23, 24, 25, 2, -23}, // 0x52 'R' + {2473, 16, 25, 20, 2, -23}, // 0x53 'S' + {2523, 21, 24, 23, 1, -23}, // 0x54 'T' + {2586, 22, 25, 25, 2, -23}, // 0x55 'U' + {2655, 24, 24, 25, 0, -23}, // 0x56 'V' + {2727, 34, 25, 34, 0, -23}, // 0x57 'W' + {2834, 24, 24, 25, 1, -23}, // 0x58 'X' + {2906, 24, 24, 25, 1, -23}, // 0x59 'Y' + {2978, 21, 24, 23, 1, -23}, // 0x5A 'Z' + {3041, 8, 29, 12, 2, -23}, // 0x5B '[' + {3070, 11, 25, 10, -1, -23}, // 0x5C '\' + {3105, 8, 29, 12, 2, -23}, // 0x5D ']' + {3134, 15, 13, 20, 3, -23}, // 0x5E '^' + {3159, 18, 3, 17, 0, 3}, // 0x5F '_' + {3166, 8, 6, 12, 0, -23}, // 0x60 '`' + {3172, 16, 16, 18, 1, -15}, // 0x61 'a' + {3204, 18, 24, 19, 1, -23}, // 0x62 'b' + {3258, 14, 16, 15, 1, -15}, // 0x63 'c' + {3286, 18, 24, 19, 1, -23}, // 0x64 'd' + {3340, 14, 16, 16, 1, -15}, // 0x65 'e' + {3368, 11, 24, 14, 2, -23}, // 0x66 'f' + {3401, 17, 23, 17, 1, -15}, // 0x67 'g' + {3450, 17, 24, 19, 1, -23}, // 0x68 'h' + {3501, 7, 24, 10, 2, -23}, // 0x69 'i' + {3522, 11, 31, 14, 0, -23}, // 0x6A 'j' + {3565, 18, 24, 19, 1, -23}, // 0x6B 'k' + {3619, 7, 24, 10, 1, -23}, // 0x6C 'l' + {3640, 27, 16, 29, 1, -15}, // 0x6D 'm' + {3694, 17, 16, 19, 1, -15}, // 0x6E 'n' + {3728, 17, 16, 18, 1, -15}, // 0x6F 'o' + {3762, 19, 23, 19, 0, -15}, // 0x70 'p' + {3817, 17, 23, 19, 1, -15}, // 0x71 'q' + {3866, 13, 16, 15, 1, -15}, // 0x72 'r' + {3892, 12, 16, 14, 1, -15}, // 0x73 's' + {3916, 10, 21, 12, 1, -20}, // 0x74 't' + {3943, 18, 16, 20, 1, -15}, // 0x75 'u' + {3979, 17, 16, 17, 0, -15}, // 0x76 'v' + {4013, 24, 16, 25, 0, -15}, // 0x77 'w' + {4061, 16, 16, 18, 1, -15}, // 0x78 'x' + {4093, 16, 23, 17, 0, -15}, // 0x79 'y' + {4139, 14, 16, 16, 0, -15}, // 0x7A 'z' + {4167, 11, 31, 14, 1, -24}, // 0x7B '{' + {4210, 3, 25, 8, 2, -23}, // 0x7C '|' + {4220, 11, 31, 14, 3, -24}, // 0x7D '}' + {4263, 16, 5, 18, 1, -11}}; // 0x7E '~' + +const GFXfont FreeSerifBold18pt7b PROGMEM = { + (uint8_t *)FreeSerifBold18pt7bBitmaps, + (GFXglyph *)FreeSerifBold18pt7bGlyphs, 0x20, 0x7E, 42}; + +// Approx. 4945 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h new file mode 100644 index 0000000..e6681f5 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h @@ -0,0 +1,761 @@ +#pragma once +#include + +const uint8_t FreeSerifBold24pt7bBitmaps[] PROGMEM = { + 0x3C, 0x7E, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x7E, 0x7C, 0x7C, + 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x38, 0x18, 0x10, 0x10, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x70, 0x07, + 0x7C, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xC0, + 0x3E, 0xE0, 0x0E, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xC4, 0x00, 0xE2, + 0x00, 0x20, 0x00, 0xF0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x0F, + 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0x78, 0x3C, 0x00, 0xF0, + 0x78, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, + 0xF3, 0xFF, 0xFF, 0xE0, 0x78, 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xC0, 0xE0, + 0x03, 0x81, 0xC0, 0x0F, 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x0F, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x03, 0x81, 0xC0, 0x0F, + 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0x78, 0x3C, 0x00, 0xF0, + 0x78, 0x01, 0xE0, 0xE0, 0x03, 0x81, 0xC0, 0x07, 0x07, 0x80, 0x1E, 0x0F, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, + 0x7F, 0xF0, 0x0F, 0x37, 0xE0, 0xE1, 0x8F, 0x8E, 0x0C, 0x3C, 0x70, 0x60, + 0xE7, 0x83, 0x03, 0x3C, 0x18, 0x19, 0xF0, 0xC0, 0x4F, 0xC6, 0x02, 0x7F, + 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, + 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x3F, 0xF8, 0x01, + 0xFF, 0xC0, 0x0C, 0xFF, 0x00, 0x63, 0xFA, 0x03, 0x0F, 0xD0, 0x18, 0x3E, + 0x80, 0xC1, 0xF6, 0x06, 0x0F, 0xB8, 0x30, 0x79, 0xC1, 0x87, 0xCF, 0x0C, + 0x3C, 0x7E, 0x67, 0xC0, 0xFF, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0xC0, 0x00, + 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x3E, 0x00, 0x0C, 0x00, 0x0F, 0xF0, 0x03, 0x80, 0x07, 0xE7, 0x03, + 0xE0, 0x01, 0xF8, 0x7F, 0xFC, 0x00, 0x3E, 0x07, 0xF7, 0x00, 0x0F, 0xC0, + 0x80, 0xE0, 0x03, 0xF0, 0x10, 0x38, 0x00, 0x7E, 0x02, 0x07, 0x00, 0x0F, + 0x80, 0x41, 0xC0, 0x03, 0xF0, 0x10, 0x30, 0x00, 0x7E, 0x02, 0x0E, 0x00, + 0x0F, 0x80, 0xC1, 0x80, 0x01, 0xF0, 0x10, 0x70, 0x00, 0x3E, 0x06, 0x1C, + 0x00, 0x07, 0xC1, 0x83, 0x80, 0x00, 0x7C, 0x60, 0xE0, 0x1F, 0x07, 0xF8, + 0x18, 0x0F, 0xF8, 0x7C, 0x07, 0x07, 0xF1, 0x00, 0x00, 0xC1, 0xF8, 0x10, + 0x00, 0x38, 0x3F, 0x02, 0x00, 0x06, 0x0F, 0xC0, 0x40, 0x01, 0xC3, 0xF0, + 0x08, 0x00, 0x30, 0x7E, 0x01, 0x00, 0x0E, 0x1F, 0x80, 0x40, 0x03, 0x83, + 0xF0, 0x08, 0x00, 0x60, 0x7E, 0x01, 0x00, 0x1C, 0x0F, 0x80, 0x40, 0x03, + 0x01, 0xF0, 0x18, 0x00, 0xE0, 0x3E, 0x02, 0x00, 0x18, 0x03, 0xC0, 0xC0, + 0x07, 0x00, 0x7C, 0x70, 0x00, 0xC0, 0x07, 0xFC, 0x00, 0x38, 0x00, 0x7E, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x07, 0x8F, + 0xE0, 0x00, 0x03, 0xC1, 0xF8, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x7C, + 0x07, 0xC0, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0x07, 0xE0, 0x7C, 0x00, 0x01, + 0xF8, 0x1E, 0x00, 0x00, 0x7F, 0x07, 0x80, 0x00, 0x1F, 0xE3, 0x80, 0x00, + 0x03, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xE0, 0x3F, + 0xF0, 0x07, 0xFC, 0x01, 0xF0, 0x07, 0xFF, 0x00, 0x78, 0x07, 0xBF, 0xE0, + 0x1C, 0x03, 0x87, 0xFC, 0x07, 0x01, 0xE0, 0xFF, 0x81, 0x80, 0xF0, 0x3F, + 0xE0, 0xC0, 0x7C, 0x07, 0xFC, 0x30, 0x1F, 0x00, 0xFF, 0x98, 0x0F, 0xC0, + 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x3F, + 0x80, 0x3F, 0xF0, 0x0F, 0xF0, 0x07, 0xFE, 0x03, 0xFC, 0x00, 0xFF, 0x81, + 0x7F, 0x80, 0x3F, 0xF8, 0xDF, 0xF0, 0x1F, 0xFF, 0xE3, 0xFF, 0x0E, 0xFF, + 0xF8, 0xFF, 0xFE, 0x1F, 0xFC, 0x0F, 0xFE, 0x03, 0xFE, 0x00, 0xFE, 0x00, + 0x3E, 0x00, 0x77, 0xFF, 0xFF, 0xFF, 0xEE, 0x73, 0x9C, 0xE2, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x60, 0x1C, 0x03, 0x80, 0x70, 0x06, 0x00, 0xE0, 0x1C, + 0x01, 0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0xF8, + 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, + 0x0F, 0x80, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xC0, 0x1C, + 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x03, 0x00, + 0x10, 0x00, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, + 0x70, 0x03, 0x80, 0x38, 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x1E, 0x01, 0xE0, + 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, + 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, + 0x38, 0x03, 0x80, 0x70, 0x07, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x0C, + 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x03, 0xE0, 0x3C, 0x78, 0xEF, 0x9C, 0x7B, 0xF7, 0x3F, 0xFE, 0xDF, 0x8F, + 0xFF, 0xC0, 0x7F, 0x00, 0x3F, 0xC0, 0x7E, 0xBF, 0x3F, 0x77, 0xEF, 0x9C, + 0xFF, 0xC7, 0x1E, 0x63, 0xE3, 0x80, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x01, 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x7E, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x06, 0x06, 0x0C, + 0x18, 0x30, 0x60, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, + 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x00, 0x1E, 0x00, 0x7C, 0x00, + 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, + 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x01, + 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0, + 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE0, 0x03, + 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x00, 0xFC, 0x00, + 0x0F, 0x3C, 0x00, 0x78, 0x78, 0x03, 0xE1, 0xF0, 0x1F, 0x03, 0xE0, 0x7C, + 0x0F, 0x83, 0xF0, 0x3F, 0x0F, 0xC0, 0xFC, 0x7F, 0x03, 0xF9, 0xFC, 0x0F, + 0xE7, 0xF0, 0x3F, 0xBF, 0xC0, 0xFE, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, + 0xF0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x3F, + 0x9F, 0xC0, 0xFE, 0x7F, 0x03, 0xF9, 0xFC, 0x0F, 0xE3, 0xF0, 0x3F, 0x0F, + 0xC0, 0xFC, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x80, 0xF8, 0x7C, 0x01, 0xE1, + 0xE0, 0x03, 0xCF, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x18, 0x00, 0x1E, 0x00, + 0x1F, 0x80, 0x1F, 0xE0, 0x1F, 0xF8, 0x1D, 0xFE, 0x00, 0x3F, 0x80, 0x0F, + 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, + 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, + 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, + 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, + 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3F, 0xF8, 0xFF, 0xFF, 0xC0, 0x00, 0xFC, + 0x00, 0x1F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x1C, + 0x1F, 0xF1, 0xC0, 0x7F, 0x8C, 0x01, 0xFC, 0x40, 0x0F, 0xE0, 0x00, 0x3F, + 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, + 0x00, 0x70, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38, + 0x01, 0x03, 0x80, 0x18, 0x38, 0x00, 0x81, 0x80, 0x1C, 0x1F, 0xFF, 0xE1, + 0xFF, 0xFF, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, + 0xE0, 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x30, 0xFF, 0xC2, + 0x01, 0xFE, 0x30, 0x0F, 0xF1, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, + 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, + 0x1F, 0xC0, 0x03, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xF0, 0x00, 0xFF, + 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, + 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x3C, + 0x00, 0x01, 0xC7, 0x80, 0x0E, 0x7F, 0x00, 0xE3, 0xFC, 0x06, 0x1F, 0xF8, + 0xE0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, + 0xFF, 0x00, 0x0D, 0xF8, 0x00, 0xEF, 0xC0, 0x06, 0x7E, 0x00, 0x63, 0xF0, + 0x07, 0x1F, 0x80, 0x30, 0xFC, 0x03, 0x07, 0xE0, 0x38, 0x3F, 0x03, 0x81, + 0xF8, 0x18, 0x0F, 0xC1, 0xC0, 0x7E, 0x1C, 0x03, 0xF0, 0xC0, 0x1F, 0x8E, + 0x00, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, + 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x07, 0xFF, + 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xE0, 0xFF, 0xFE, 0x0F, 0xFF, 0xE1, 0xFF, + 0xFC, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x3F, + 0x80, 0x03, 0xFF, 0x80, 0x7F, 0xFE, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0x87, + 0xFF, 0xFC, 0x7F, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x7E, + 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, + 0xC0, 0x00, 0x0C, 0x78, 0x00, 0x8F, 0xE0, 0x18, 0xFF, 0x87, 0x0F, 0xFF, + 0xE0, 0x7F, 0xF8, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x38, 0x00, 0x1F, 0x00, + 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, + 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, + 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xFF, 0x01, 0xFF, 0xFE, 0x1F, 0xF1, 0xFC, + 0xFF, 0x07, 0xE7, 0xF8, 0x3F, 0xBF, 0xC1, 0xFD, 0xFE, 0x07, 0xFF, 0xF0, + 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0x7F, 0xFF, 0x03, 0xFB, + 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x07, 0xE3, 0xF0, 0x3F, 0x1F, 0xC1, + 0xF0, 0x7E, 0x0F, 0x01, 0xF0, 0xF8, 0x03, 0xC7, 0x00, 0x07, 0xE0, 0x00, + 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFF, + 0xFF, 0x3F, 0xFF, 0xF9, 0x80, 0x07, 0x98, 0x00, 0x3C, 0xC0, 0x03, 0xE4, + 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, + 0x01, 0xFE, 0x00, 0x38, 0x7C, 0x07, 0x80, 0xF0, 0x78, 0x07, 0xC3, 0xC0, + 0x1F, 0x3E, 0x00, 0xF9, 0xF0, 0x07, 0xCF, 0xC0, 0x3E, 0x7E, 0x01, 0xF3, + 0xF8, 0x0F, 0x1F, 0xE0, 0xF8, 0x7F, 0xC7, 0x83, 0xFF, 0xF0, 0x0F, 0xFE, + 0x00, 0x7F, 0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x1F, 0xFF, 0x03, + 0xBF, 0xFC, 0x7C, 0x7F, 0xE7, 0xC1, 0xFF, 0x3E, 0x07, 0xFF, 0xE0, 0x1F, + 0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, + 0x03, 0xE7, 0x80, 0x1F, 0x3E, 0x01, 0xF0, 0xF8, 0x0F, 0x83, 0xE1, 0xF8, + 0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x1C, 0x3C, 0x00, + 0xF0, 0x78, 0x07, 0x81, 0xF8, 0x3E, 0x07, 0xE1, 0xF8, 0x0F, 0xC7, 0xE0, + 0x3F, 0x3F, 0x80, 0xFE, 0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xFF, 0xE0, 0x3F, + 0xFF, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0x3F, 0xDF, + 0xC0, 0xFF, 0x7F, 0x03, 0xFC, 0xFC, 0x0F, 0xF3, 0xFC, 0x7F, 0x83, 0xFF, + 0xFE, 0x07, 0xF7, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xF8, + 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xC0, 0x00, + 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7E, 0x3C, 0x3C, 0x3F, 0x3F, 0xDF, 0xEF, 0xF7, 0xF9, 0xF8, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7F, 0x7F, + 0xBF, 0xFF, 0xFF, 0xFB, 0xFC, 0xFE, 0x07, 0x03, 0x01, 0x81, 0x81, 0x81, + 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x01, + 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, + 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, + 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, + 0xE0, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFF, 0x00, + 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, + 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, + 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, + 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, + 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x0F, + 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x07, 0xF0, 0x07, 0xFF, 0x03, 0x87, 0xE1, 0xC0, 0xFC, 0xF0, 0x3F, + 0xBE, 0x07, 0xEF, 0xC1, 0xFF, 0xF0, 0x7F, 0xFC, 0x1F, 0xDF, 0x07, 0xF7, + 0x81, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, + 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x04, 0x00, 0x01, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x00, 0x1F, 0x80, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, + 0xC0, 0x07, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x1F, + 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x03, 0x80, 0x3C, 0x00, 0x00, 0xE0, 0x3C, 0x00, 0x00, 0x30, 0x3E, + 0x00, 0x00, 0x0C, 0x3E, 0x00, 0x3C, 0x37, 0x1F, 0x00, 0x7E, 0xF1, 0x9F, + 0x00, 0x7C, 0xF8, 0xCF, 0x80, 0x78, 0x7C, 0x37, 0xC0, 0x7C, 0x3C, 0x1F, + 0xC0, 0x3C, 0x1E, 0x0F, 0xE0, 0x3C, 0x0F, 0x07, 0xF0, 0x3E, 0x0F, 0x03, + 0xF8, 0x1E, 0x07, 0x81, 0xFC, 0x0F, 0x03, 0xC0, 0xFE, 0x0F, 0x03, 0xE0, + 0x7F, 0x07, 0x81, 0xE0, 0x6F, 0x83, 0xC1, 0xF0, 0x37, 0xC1, 0xE1, 0x78, + 0x31, 0xF0, 0xF9, 0xBC, 0x18, 0xF8, 0x3F, 0x9E, 0x38, 0x3C, 0x0F, 0x0F, + 0xF8, 0x1F, 0x00, 0x01, 0xF0, 0x07, 0x80, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0xC0, 0x01, 0xF8, 0x03, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x03, + 0xFF, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x07, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, + 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, + 0x37, 0xF8, 0x00, 0x00, 0x33, 0xF8, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x00, + 0x61, 0xFC, 0x00, 0x00, 0x61, 0xFE, 0x00, 0x00, 0xC1, 0xFE, 0x00, 0x00, + 0xC0, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x01, 0x80, 0x7F, 0x00, 0x01, + 0x80, 0x7F, 0x80, 0x03, 0x80, 0x7F, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, + 0xFF, 0xFF, 0xC0, 0x07, 0x00, 0x3F, 0xC0, 0x06, 0x00, 0x1F, 0xE0, 0x0E, + 0x00, 0x1F, 0xE0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, 0x00, 0x0F, 0xF0, 0x1C, + 0x00, 0x0F, 0xF8, 0x1C, 0x00, 0x0F, 0xF8, 0x7E, 0x00, 0x0F, 0xFC, 0xFF, + 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x1F, 0xF8, + 0x7F, 0x00, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x01, 0xFE, + 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, + 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, + 0x00, 0xFF, 0x0F, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0x0F, + 0xF0, 0xFF, 0x00, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, 0x01, + 0xFE, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, + 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, + 0x0F, 0xE0, 0xFF, 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x87, 0xF0, + 0x3F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x01, + 0xFF, 0xF0, 0x60, 0x0F, 0xC1, 0xF9, 0x80, 0xFC, 0x01, 0xFE, 0x07, 0xE0, + 0x01, 0xF8, 0x3F, 0x00, 0x03, 0xE1, 0xFC, 0x00, 0x07, 0x87, 0xE0, 0x00, + 0x1E, 0x3F, 0x80, 0x00, 0x38, 0xFE, 0x00, 0x00, 0x67, 0xF8, 0x00, 0x01, + 0x9F, 0xC0, 0x00, 0x02, 0x7F, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, + 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x87, 0xF0, 0x00, 0x07, 0x0F, 0xE0, 0x00, 0x38, 0x1F, 0x80, 0x01, 0xC0, + 0x3F, 0x00, 0x1E, 0x00, 0x7F, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x0F, + 0xF8, 0x7F, 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, + 0xF0, 0x07, 0xF0, 0x0F, 0xF0, 0x03, 0xF8, 0x0F, 0xF0, 0x03, 0xFC, 0x0F, + 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x0F, + 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, + 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, + 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, + 0xF0, 0x00, 0xFE, 0x0F, 0xF0, 0x00, 0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x0F, + 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x03, 0xF8, 0x0F, + 0xF0, 0x03, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xC0, 0x0F, + 0xF8, 0x3F, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, + 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x1F, 0xE0, 0x1F, 0xC1, 0xFE, 0x00, + 0x3C, 0x1F, 0xE0, 0x01, 0xC1, 0xFE, 0x00, 0x0C, 0x1F, 0xE0, 0x00, 0xC1, + 0xFE, 0x00, 0x04, 0x1F, 0xE0, 0x20, 0x41, 0xFE, 0x02, 0x00, 0x1F, 0xE0, + 0x60, 0x01, 0xFE, 0x06, 0x00, 0x1F, 0xE0, 0xE0, 0x01, 0xFE, 0x1E, 0x00, + 0x1F, 0xFF, 0xE0, 0x01, 0xFF, 0xFE, 0x00, 0x1F, 0xE3, 0xE0, 0x01, 0xFE, + 0x0E, 0x00, 0x1F, 0xE0, 0x60, 0x01, 0xFE, 0x06, 0x00, 0x1F, 0xE0, 0x20, + 0x01, 0xFE, 0x02, 0x00, 0x1F, 0xE0, 0x00, 0x11, 0xFE, 0x00, 0x03, 0x1F, + 0xE0, 0x00, 0x71, 0xFE, 0x00, 0x07, 0x1F, 0xE0, 0x00, 0xE1, 0xFE, 0x00, + 0x1E, 0x1F, 0xE0, 0x03, 0xE3, 0xFF, 0x01, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xC7, 0xFC, 0x07, + 0xE3, 0xFC, 0x00, 0xF1, 0xFE, 0x00, 0x38, 0xFF, 0x00, 0x0C, 0x7F, 0x80, + 0x06, 0x3F, 0xC0, 0x01, 0x1F, 0xE0, 0x20, 0x8F, 0xF0, 0x10, 0x07, 0xF8, + 0x18, 0x03, 0xFC, 0x0C, 0x01, 0xFE, 0x0E, 0x00, 0xFF, 0x1F, 0x00, 0x7F, + 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xE3, 0xE0, 0x0F, 0xF0, 0x70, 0x07, + 0xF8, 0x18, 0x03, 0xFC, 0x0C, 0x01, 0xFE, 0x02, 0x00, 0xFF, 0x01, 0x00, + 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, + 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x00, + 0x3F, 0xFE, 0x0C, 0x00, 0x3F, 0x07, 0xC6, 0x00, 0x7E, 0x00, 0xFF, 0x00, + 0x7E, 0x00, 0x1F, 0x80, 0x7E, 0x00, 0x07, 0xC0, 0x7F, 0x00, 0x01, 0xE0, + 0x3F, 0x00, 0x00, 0x70, 0x3F, 0x80, 0x00, 0x38, 0x1F, 0xC0, 0x00, 0x0C, + 0x1F, 0xE0, 0x00, 0x06, 0x0F, 0xE0, 0x00, 0x01, 0x07, 0xF0, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFF, 0xFF, 0xF8, 0x00, + 0x3F, 0xF1, 0xFC, 0x00, 0x0F, 0xF0, 0xFF, 0x00, 0x07, 0xF8, 0x7F, 0x80, + 0x03, 0xFC, 0x1F, 0xC0, 0x01, 0xFE, 0x0F, 0xE0, 0x00, 0xFF, 0x03, 0xF8, + 0x00, 0x7F, 0x80, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x1F, 0xE0, 0x0F, + 0xC0, 0x0F, 0xF0, 0x03, 0xF8, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, + 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0x9F, 0xF8, 0x03, 0xFF, + 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, + 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xF0, 0x3F, 0xC0, 0x07, + 0xF8, 0x1F, 0xE0, 0x03, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, + 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, + 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, + 0xFF, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, + 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0x7F, + 0x80, 0x0F, 0xF0, 0x3F, 0xC0, 0x07, 0xF8, 0x1F, 0xE0, 0x03, 0xFC, 0x0F, + 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, + 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0xFF, 0xC0, 0x1F, 0xF9, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xFE, 0x7F, 0xE0, 0x7F, 0x80, 0xFF, 0x01, + 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, + 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, + 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, + 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, + 0x0F, 0xFC, 0x7F, 0xFF, 0x01, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x01, 0xFE, + 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, + 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, + 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, + 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, + 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x1F, + 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x78, 0x1F, 0xE3, + 0xF0, 0x7F, 0x8F, 0xC1, 0xFC, 0x3F, 0x07, 0xF0, 0xFC, 0x1F, 0xC1, 0xE0, + 0xFE, 0x07, 0xC3, 0xF0, 0x0F, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0xFF, 0xFC, + 0x1F, 0xFF, 0x0F, 0xFC, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x1E, 0x00, 0x7F, + 0x80, 0x07, 0x00, 0x1F, 0xE0, 0x03, 0x80, 0x07, 0xF8, 0x01, 0xC0, 0x01, + 0xFE, 0x00, 0xE0, 0x00, 0x7F, 0x80, 0x70, 0x00, 0x1F, 0xE0, 0x38, 0x00, + 0x07, 0xF8, 0x1C, 0x00, 0x01, 0xFE, 0x0E, 0x00, 0x00, 0x7F, 0x87, 0x00, + 0x00, 0x1F, 0xE3, 0xC0, 0x00, 0x07, 0xF9, 0xF8, 0x00, 0x01, 0xFE, 0xFE, + 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x07, 0xFD, + 0xFF, 0x00, 0x01, 0xFE, 0x7F, 0xE0, 0x00, 0x7F, 0x8F, 0xF8, 0x00, 0x1F, + 0xE1, 0xFF, 0x00, 0x07, 0xF8, 0x3F, 0xE0, 0x01, 0xFE, 0x07, 0xFC, 0x00, + 0x7F, 0x81, 0xFF, 0x80, 0x1F, 0xE0, 0x3F, 0xE0, 0x07, 0xF8, 0x07, 0xFC, + 0x01, 0xFE, 0x00, 0xFF, 0x80, 0x7F, 0x80, 0x1F, 0xF0, 0x1F, 0xE0, 0x07, + 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x83, 0xFF, 0x00, 0x3F, 0xF3, 0xFF, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, + 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x1F, 0xE0, 0x00, 0x31, 0xFE, + 0x00, 0x03, 0x1F, 0xE0, 0x00, 0x71, 0xFE, 0x00, 0x07, 0x1F, 0xE0, 0x00, + 0xE1, 0xFE, 0x00, 0x1E, 0x1F, 0xE0, 0x07, 0xE3, 0xFF, 0x01, 0xFE, 0xFF, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0x7F, 0xF0, 0x00, 0x01, 0xFF, 0xE1, + 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x1F, 0xE0, 0x00, 0x0F, 0xFC, 0x03, 0xFC, + 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xC0, 0x00, 0x2F, 0xF0, 0x0B, 0xF8, 0x00, + 0x0D, 0xFE, 0x01, 0x7F, 0x80, 0x01, 0xBF, 0xC0, 0x27, 0xF0, 0x00, 0x67, + 0xF8, 0x04, 0xFF, 0x00, 0x0C, 0xFF, 0x00, 0x8F, 0xE0, 0x03, 0x1F, 0xE0, + 0x11, 0xFE, 0x00, 0x63, 0xFC, 0x02, 0x3F, 0xC0, 0x08, 0x7F, 0x80, 0x43, + 0xF8, 0x03, 0x0F, 0xF0, 0x08, 0x7F, 0x80, 0x61, 0xFE, 0x01, 0x07, 0xF0, + 0x18, 0x3F, 0xC0, 0x20, 0xFF, 0x03, 0x07, 0xF8, 0x04, 0x0F, 0xE0, 0xC0, + 0xFF, 0x00, 0x81, 0xFE, 0x18, 0x1F, 0xE0, 0x10, 0x3F, 0xC6, 0x03, 0xFC, + 0x02, 0x03, 0xF8, 0xC0, 0x7F, 0x80, 0x40, 0x7F, 0x98, 0x0F, 0xF0, 0x08, + 0x07, 0xF6, 0x01, 0xFE, 0x01, 0x00, 0xFF, 0xC0, 0x3F, 0xC0, 0x20, 0x0F, + 0xF0, 0x07, 0xF8, 0x04, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x80, 0x1F, 0x80, + 0x1F, 0xE0, 0x10, 0x03, 0xF0, 0x03, 0xFC, 0x02, 0x00, 0x7E, 0x00, 0x7F, + 0x80, 0x40, 0x07, 0x80, 0x0F, 0xF0, 0x0C, 0x00, 0xF0, 0x01, 0xFE, 0x07, + 0xC0, 0x0C, 0x00, 0x7F, 0xE7, 0xFF, 0x01, 0x80, 0x3F, 0xFF, 0xFF, 0xC0, + 0x03, 0xFE, 0xFF, 0xC0, 0x01, 0xF0, 0xFF, 0xC0, 0x01, 0xC0, 0xFF, 0xC0, + 0x01, 0x80, 0xFF, 0x80, 0x03, 0x01, 0xFF, 0x80, 0x06, 0x03, 0xFF, 0x80, + 0x0C, 0x07, 0xFF, 0x80, 0x18, 0x0D, 0xFF, 0x80, 0x30, 0x19, 0xFF, 0x00, + 0x60, 0x31, 0xFF, 0x00, 0xC0, 0x61, 0xFF, 0x01, 0x80, 0xC1, 0xFF, 0x03, + 0x01, 0x83, 0xFF, 0x06, 0x03, 0x03, 0xFE, 0x0C, 0x06, 0x03, 0xFE, 0x18, + 0x0C, 0x03, 0xFE, 0x30, 0x18, 0x03, 0xFE, 0x60, 0x30, 0x03, 0xFE, 0xC0, + 0x60, 0x07, 0xFD, 0x80, 0xC0, 0x07, 0xFF, 0x01, 0x80, 0x07, 0xFE, 0x03, + 0x00, 0x07, 0xFC, 0x06, 0x00, 0x07, 0xF8, 0x0C, 0x00, 0x07, 0xF0, 0x18, + 0x00, 0x0F, 0xE0, 0x30, 0x00, 0x0F, 0xC0, 0x60, 0x00, 0x0F, 0x80, 0xC0, + 0x00, 0x0F, 0x01, 0xC0, 0x00, 0x0E, 0x0F, 0xC0, 0x00, 0x1C, 0x7F, 0xE0, + 0x00, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x3F, + 0x07, 0xF0, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x7E, + 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, 0x3F, 0x00, 0x03, 0xF8, 0x3F, + 0x80, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, 0x3F, 0xCF, + 0xE0, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x03, 0xFF, + 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, + 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x0F, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFD, 0xFC, 0x00, 0x01, + 0xFC, 0xFE, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, 0xFF, 0x1F, 0xC0, 0x00, + 0x7F, 0x0F, 0xE0, 0x00, 0x3F, 0x83, 0xF8, 0x00, 0x3F, 0x80, 0xFC, 0x00, + 0x1F, 0x80, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x03, 0xF8, + 0x3F, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, + 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x01, 0xFE, 0x1F, 0xE0, 0x7F, 0x81, 0xFC, + 0x1F, 0xE0, 0x7F, 0x87, 0xF8, 0x0F, 0xE1, 0xFE, 0x03, 0xFC, 0x7F, 0x80, + 0xFF, 0x1F, 0xE0, 0x3F, 0xC7, 0xF8, 0x0F, 0xF1, 0xFE, 0x03, 0xFC, 0x7F, + 0x80, 0xFF, 0x1F, 0xE0, 0x3F, 0x87, 0xF8, 0x1F, 0xE1, 0xFE, 0x07, 0xF0, + 0x7F, 0x87, 0xF8, 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xF8, 0x01, 0xFE, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, + 0x03, 0xFF, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, + 0x3F, 0xFF, 0x80, 0x00, 0x3F, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0xFC, 0x00, + 0x7E, 0x00, 0x3F, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, + 0x3F, 0x00, 0x03, 0xF8, 0x3F, 0x80, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, + 0x1F, 0xE0, 0x00, 0x3F, 0xCF, 0xE0, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, + 0xF7, 0xF8, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xC0, 0x00, + 0x1F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00, + 0x03, 0xFD, 0xFC, 0x00, 0x01, 0xFC, 0xFE, 0x00, 0x01, 0xFE, 0x7F, 0x80, + 0x00, 0xFF, 0x1F, 0xC0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x3F, 0x83, 0xF8, + 0x00, 0x3F, 0x80, 0xFC, 0x00, 0x1F, 0x80, 0x3F, 0x00, 0x1F, 0x80, 0x0F, + 0xC0, 0x1F, 0x80, 0x03, 0xF0, 0x1F, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, + 0x0F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x00, + 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x07, 0xFF, 0x80, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xFF, 0xE0, + 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xC3, 0xFC, 0x00, 0xFF, 0x01, 0xFC, + 0x01, 0xFE, 0x03, 0xFC, 0x03, 0xFC, 0x03, 0xF8, 0x07, 0xF8, 0x07, 0xF8, + 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, + 0x7F, 0x80, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x01, 0xFE, 0x01, 0xFC, 0x03, + 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x1F, 0xE0, 0x0F, 0xF0, 0xFF, 0x00, 0x1F, + 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0x9F, 0xE0, 0x00, 0xFF, + 0x3F, 0xC0, 0x01, 0xFE, 0x3F, 0xC0, 0x03, 0xFC, 0x7F, 0xC0, 0x07, 0xF8, + 0x7F, 0xC0, 0x0F, 0xF0, 0x7F, 0x80, 0x1F, 0xE0, 0xFF, 0x80, 0x3F, 0xC0, + 0xFF, 0x80, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x01, 0xFE, 0x01, + 0xFF, 0x03, 0xFC, 0x01, 0xFF, 0x0F, 0xFC, 0x03, 0xFE, 0x7F, 0xFE, 0x03, + 0xFF, 0x03, 0xF8, 0x10, 0x7F, 0xF9, 0x87, 0xC1, 0xFC, 0x78, 0x03, 0xE7, + 0x80, 0x0F, 0x3C, 0x00, 0x3B, 0xE0, 0x01, 0xDF, 0x00, 0x06, 0xF8, 0x00, + 0x37, 0xE0, 0x00, 0xBF, 0x80, 0x01, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x3F, + 0xFC, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, + 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x07, 0xFC, 0x00, + 0x1F, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0xC0, 0x01, 0xEE, 0x00, 0x0F, 0x78, 0x00, 0xF3, 0xE0, 0x0F, 0x9F, 0xC0, + 0xF8, 0x8F, 0xFF, 0x04, 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x3F, 0xC3, 0xFF, 0x03, 0xFC, 0x0F, 0xE0, 0x3F, 0xC0, + 0x7C, 0x03, 0xFC, 0x03, 0xC0, 0x3F, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0x80, + 0x3F, 0xC0, 0x10, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0xFF, + 0xFE, 0x07, 0xFC, 0xFF, 0xC0, 0x07, 0xC1, 0xFE, 0x00, 0x0E, 0x07, 0xF8, + 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, + 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, + 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, + 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, + 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, + 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, + 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x03, + 0x00, 0xFF, 0x00, 0x0C, 0x03, 0xFC, 0x00, 0x30, 0x07, 0xF0, 0x01, 0x80, + 0x0F, 0xE0, 0x0E, 0x00, 0x1F, 0xE0, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00, + 0x1F, 0xF0, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0x9F, 0xFC, 0x00, 0x1F, 0x07, + 0xFC, 0x00, 0x07, 0x01, 0xFE, 0x00, 0x03, 0x00, 0x7F, 0x80, 0x03, 0x80, + 0x3F, 0xC0, 0x01, 0x80, 0x1F, 0xE0, 0x00, 0xC0, 0x07, 0xF8, 0x00, 0xC0, + 0x03, 0xFC, 0x00, 0x60, 0x00, 0xFF, 0x00, 0x30, 0x00, 0x7F, 0x80, 0x30, + 0x00, 0x1F, 0xE0, 0x18, 0x00, 0x0F, 0xF0, 0x18, 0x00, 0x07, 0xF8, 0x0C, + 0x00, 0x01, 0xFE, 0x06, 0x00, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x3F, 0xC3, + 0x00, 0x00, 0x1F, 0xE3, 0x80, 0x00, 0x0F, 0xF1, 0x80, 0x00, 0x03, 0xFC, + 0xC0, 0x00, 0x01, 0xFE, 0xC0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x3F, + 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0xFF, 0xF8, 0x7F, 0xFF, 0x0F, 0xFB, 0xFF, 0x00, 0xFF, + 0xC0, 0x1F, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x70, 0x3F, 0x80, 0x0F, 0xE0, + 0x03, 0x81, 0xFE, 0x00, 0x7F, 0x80, 0x1C, 0x0F, 0xF0, 0x03, 0xFC, 0x00, + 0xC0, 0x3F, 0x80, 0x0F, 0xE0, 0x06, 0x01, 0xFE, 0x00, 0x7F, 0x00, 0x70, + 0x0F, 0xF0, 0x07, 0xFC, 0x03, 0x00, 0x3F, 0x80, 0x3F, 0xE0, 0x18, 0x01, + 0xFE, 0x01, 0xFF, 0x01, 0xC0, 0x0F, 0xF0, 0x1B, 0xFC, 0x0C, 0x00, 0x3F, + 0x80, 0xCF, 0xE0, 0x60, 0x01, 0xFE, 0x06, 0x7F, 0x07, 0x00, 0x0F, 0xF0, + 0x63, 0xFC, 0x30, 0x00, 0x3F, 0x83, 0x0F, 0xE1, 0x80, 0x01, 0xFE, 0x30, + 0x7F, 0x1C, 0x00, 0x07, 0xF1, 0x81, 0xFC, 0xC0, 0x00, 0x3F, 0x8C, 0x0F, + 0xE6, 0x00, 0x01, 0xFE, 0xC0, 0x7F, 0x70, 0x00, 0x07, 0xF6, 0x01, 0xFB, + 0x00, 0x00, 0x3F, 0xE0, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x7F, 0xC0, + 0x00, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, + 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x07, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, + 0x00, 0x70, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x0F, + 0xFF, 0x3F, 0xF8, 0x01, 0xF8, 0x1F, 0xF8, 0x01, 0xE0, 0x0F, 0xF8, 0x01, + 0xC0, 0x0F, 0xF8, 0x01, 0x80, 0x07, 0xFC, 0x03, 0x80, 0x03, 0xFE, 0x07, + 0x00, 0x03, 0xFE, 0x06, 0x00, 0x01, 0xFF, 0x0C, 0x00, 0x00, 0xFF, 0x9C, + 0x00, 0x00, 0xFF, 0x98, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xF0, + 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xFC, + 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x19, 0xFE, 0x00, 0x00, 0x31, 0xFF, + 0x00, 0x00, 0x70, 0xFF, 0x80, 0x00, 0x60, 0x7F, 0x80, 0x00, 0xC0, 0x7F, + 0xC0, 0x01, 0xC0, 0x3F, 0xE0, 0x03, 0x80, 0x1F, 0xE0, 0x07, 0x00, 0x1F, + 0xF0, 0x07, 0x00, 0x0F, 0xF8, 0x0F, 0x00, 0x0F, 0xF8, 0x3F, 0x80, 0x1F, + 0xFC, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0xF0, 0x00, + 0x7E, 0x1F, 0xF0, 0x00, 0x38, 0x1F, 0xF0, 0x00, 0x38, 0x0F, 0xF0, 0x00, + 0x70, 0x0F, 0xF8, 0x00, 0x60, 0x07, 0xF8, 0x00, 0x60, 0x07, 0xFC, 0x00, + 0xC0, 0x03, 0xFC, 0x01, 0xC0, 0x01, 0xFE, 0x01, 0x80, 0x01, 0xFE, 0x03, + 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x86, 0x00, 0x00, 0x7F, 0x8E, + 0x00, 0x00, 0x7F, 0xCC, 0x00, 0x00, 0x3F, 0xD8, 0x00, 0x00, 0x3F, 0xF8, + 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xFE, + 0x00, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0x3F, 0x80, 0x7F, 0xC3, + 0xE0, 0x07, 0xF8, 0x38, 0x00, 0xFF, 0x83, 0x80, 0x0F, 0xF0, 0x30, 0x01, + 0xFE, 0x07, 0x00, 0x3F, 0xE0, 0x60, 0x03, 0xFC, 0x06, 0x00, 0x7F, 0xC0, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0x80, + 0x00, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, + 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x01, 0x07, 0xFC, 0x00, 0x30, 0xFF, 0x80, + 0x03, 0x0F, 0xF0, 0x00, 0x31, 0xFF, 0x00, 0x07, 0x1F, 0xE0, 0x00, 0xF3, + 0xFE, 0x00, 0x1E, 0x7F, 0xC0, 0x03, 0xE7, 0xF8, 0x01, 0xFE, 0xFF, 0xFF, + 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x7C, 0x0F, 0x81, + 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, + 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, + 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xFF, 0xFF, 0xF8, 0xF0, + 0x01, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x0F, 0x00, + 0x1F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, + 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1F, + 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, + 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, + 0x1E, 0xFF, 0xFF, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, + 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, + 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, + 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, + 0x0F, 0x81, 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x00, 0x78, 0x00, 0x07, 0xC0, + 0x00, 0x3F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xE0, 0x01, 0xEF, 0x00, 0x0F, + 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x87, 0x80, 0x78, 0x3C, 0x03, 0xC0, 0xF0, + 0x3C, 0x07, 0x81, 0xE0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0xCF, 0x00, + 0x1E, 0x78, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x70, 0x1F, 0x03, 0xF0, 0x7E, 0x03, 0xE0, 0x3E, 0x01, 0xE0, 0x1E, + 0x00, 0xE0, 0x03, 0xFC, 0x00, 0x3F, 0xFC, 0x03, 0xE1, 0xF8, 0x0F, 0x03, + 0xF0, 0x7C, 0x07, 0xC1, 0xF8, 0x1F, 0x87, 0xE0, 0x7E, 0x1F, 0x81, 0xF8, + 0x3C, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x01, 0xFE, 0x00, 0x3F, 0xF8, 0x03, + 0xE7, 0xE0, 0x3E, 0x1F, 0x83, 0xF0, 0x7E, 0x1F, 0x81, 0xF8, 0x7E, 0x07, + 0xE3, 0xF8, 0x1F, 0x8F, 0xE0, 0x7E, 0x3F, 0x83, 0xF8, 0xFF, 0x1F, 0xE1, + 0xFF, 0xDF, 0xF7, 0xFE, 0x3F, 0x07, 0xE0, 0xF8, 0xFF, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x0F, 0xC7, 0xF0, 0x07, 0xEF, 0xFE, 0x03, 0xFC, 0x3F, 0x81, 0xFC, 0x0F, + 0xE0, 0xFC, 0x03, 0xF0, 0x7E, 0x01, 0xFC, 0x3F, 0x00, 0xFE, 0x1F, 0x80, + 0x3F, 0x8F, 0xC0, 0x1F, 0xC7, 0xE0, 0x0F, 0xE3, 0xF0, 0x07, 0xF1, 0xF8, + 0x03, 0xF8, 0xFC, 0x01, 0xFC, 0x7E, 0x00, 0xFE, 0x3F, 0x00, 0x7F, 0x1F, + 0x80, 0x3F, 0x0F, 0xC0, 0x1F, 0x87, 0xE0, 0x1F, 0xC3, 0xF0, 0x0F, 0xC1, + 0xF8, 0x07, 0xE0, 0xFE, 0x07, 0xE0, 0x73, 0x87, 0xE0, 0x30, 0xFF, 0xC0, + 0x10, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0xE0, 0x3E, 0x3E, 0x0F, + 0x83, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0x9F, 0x01, 0xF3, 0xE0, 0x1C, 0x7C, + 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, + 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC, + 0x00, 0x1F, 0xC0, 0x21, 0xFE, 0x0C, 0x3F, 0xFF, 0x01, 0xFF, 0x80, 0x0F, + 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, + 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, + 0xF8, 0x00, 0x01, 0xF8, 0x03, 0xF1, 0xF8, 0x07, 0xFD, 0xF8, 0x1F, 0xC7, + 0xF8, 0x1F, 0x83, 0xF8, 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7E, 0x01, + 0xF8, 0x7E, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, + 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, + 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x7F, 0x01, + 0xF8, 0x3F, 0x03, 0xF8, 0x3F, 0x03, 0xF8, 0x1F, 0x87, 0xFC, 0x0F, 0xFD, + 0xFF, 0x03, 0xF1, 0xC0, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xF8, + 0x7C, 0x3C, 0x0F, 0x1F, 0x03, 0xE7, 0xC0, 0xFB, 0xF0, 0x3E, 0xFC, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, + 0xC0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x0C, 0xFC, + 0x06, 0x3F, 0xC3, 0x07, 0xFF, 0x80, 0xFF, 0xC0, 0x0F, 0xC0, 0x00, 0xFC, + 0x01, 0xFF, 0x81, 0xF1, 0xC1, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0x7C, 0x7E, + 0x1C, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x1F, 0xFF, 0x0F, + 0xFF, 0x80, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, + 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, + 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, + 0xFC, 0x00, 0x7E, 0x00, 0x7F, 0x80, 0xFF, 0xF8, 0x00, 0x07, 0xF0, 0x03, + 0xFF, 0xFC, 0xF8, 0x7F, 0xBE, 0x07, 0x87, 0xC0, 0xF9, 0xF8, 0x1F, 0xBF, + 0x03, 0xF7, 0xE0, 0x7E, 0xFC, 0x0F, 0xDF, 0x81, 0xF9, 0xF0, 0x3F, 0x3E, + 0x07, 0xC3, 0xE1, 0xF8, 0x3C, 0x7E, 0x01, 0xFF, 0x00, 0x60, 0x00, 0x38, + 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x7F, 0xFF, 0x0F, 0xFF, 0xF9, 0xFF, + 0xFF, 0x9F, 0xFF, 0xF9, 0xFF, 0xFF, 0x0F, 0xFF, 0xEF, 0x00, 0x3F, 0xC0, + 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x1C, 0xF8, 0x07, 0x0F, 0xFF, 0xC0, 0x7F, + 0xC0, 0xFF, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, + 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, + 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x87, 0xE0, 0x1F, 0x9F, 0xF0, 0x1F, 0xBF, + 0xF8, 0x1F, 0xF1, 0xF8, 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x3F, 0xC1, 0xFE, 0xFF, 0xE3, + 0xFF, 0x0F, 0x07, 0xE1, 0xFE, 0x3F, 0xC7, 0xF8, 0x7F, 0x03, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, + 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, + 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE1, 0xFE, 0xFF, 0xE0, 0x00, + 0x70, 0x07, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x07, 0xF0, 0x0F, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0xFC, 0x03, 0xF0, + 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, + 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, + 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, + 0xDC, 0x3F, 0xF8, 0xFB, 0xE3, 0xEF, 0x0F, 0xBC, 0x7C, 0x7F, 0xE0, 0x7E, + 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, + 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE1, 0xFF, 0x83, + 0xF0, 0x3F, 0x01, 0xF8, 0x0E, 0x00, 0xFC, 0x06, 0x00, 0x7E, 0x06, 0x00, + 0x3F, 0x06, 0x00, 0x1F, 0x86, 0x00, 0x0F, 0xC7, 0x00, 0x07, 0xE7, 0x80, + 0x03, 0xF7, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7E, 0x7F, + 0x00, 0x3F, 0x1F, 0xC0, 0x1F, 0x8F, 0xE0, 0x0F, 0xC3, 0xF8, 0x07, 0xE0, + 0xFE, 0x03, 0xF0, 0x7F, 0x81, 0xF8, 0x1F, 0xC0, 0xFC, 0x0F, 0xF0, 0xFF, + 0x07, 0xFD, 0xFF, 0xC7, 0xFF, 0xFF, 0x87, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, + 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, + 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, + 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x0F, 0xF7, + 0xFF, 0x00, 0x07, 0xE0, 0x3F, 0x07, 0xFC, 0xFF, 0x87, 0xFC, 0x0F, 0xEF, + 0xFE, 0x7F, 0xF0, 0x3F, 0xC3, 0xFF, 0x1F, 0x81, 0xFC, 0x0F, 0xE0, 0x7E, + 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x83, 0xF0, 0x1F, + 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0xFC, 0x07, 0xE0, 0x3F, 0x07, + 0xE0, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x0F, 0xC1, 0xF8, 0x0F, 0xC0, + 0x7E, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x83, 0xF0, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0xFC, 0x07, 0xE0, 0x3F, + 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x0F, 0xC1, 0xF8, 0x0F, + 0xC0, 0x7E, 0x1F, 0xE0, 0xFF, 0x07, 0xFB, 0xFF, 0x8F, 0xFC, 0x7F, 0xE0, + 0x00, 0x07, 0xE0, 0xFF, 0x9F, 0xF0, 0x3F, 0xBF, 0xF8, 0x1F, 0xF1, 0xF8, + 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x3F, 0xC1, 0xFE, 0xFF, 0xE3, 0xFF, 0x01, 0xFC, 0x00, + 0x3F, 0xF8, 0x03, 0xE3, 0xE0, 0x3E, 0x0F, 0x83, 0xF0, 0x7E, 0x1F, 0x01, + 0xF1, 0xF8, 0x0F, 0xCF, 0xC0, 0x7E, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, + 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, + 0xFF, 0xC0, 0x7F, 0x7E, 0x03, 0xF3, 0xF0, 0x1F, 0x8F, 0x80, 0xF8, 0x7E, + 0x0F, 0xC1, 0xF0, 0x7C, 0x07, 0xC7, 0xC0, 0x1F, 0xFC, 0x00, 0x3F, 0x80, + 0x00, 0x0F, 0xC0, 0xFF, 0xBF, 0xF0, 0x3F, 0xF1, 0xF8, 0x1F, 0xC0, 0xFC, + 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFE, 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0x7F, + 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, + 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, + 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0xFE, 0x1F, 0x80, 0xFC, + 0x1F, 0xC1, 0xF8, 0x1F, 0xE3, 0xF8, 0x1F, 0xBF, 0xE0, 0x1F, 0x8F, 0xC0, + 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, + 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xF8, 0x00, + 0x00, 0xF8, 0x08, 0x07, 0xFE, 0x18, 0x0F, 0xC7, 0x38, 0x1F, 0x83, 0xF8, + 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7E, 0x01, 0xF8, + 0x7E, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, + 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, + 0xFE, 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, + 0x3F, 0x83, 0xF8, 0x1F, 0xC7, 0xF8, 0x0F, 0xFD, 0xF8, 0x03, 0xF1, 0xF8, + 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, + 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFF, + 0x00, 0x07, 0x9F, 0xF3, 0xF8, 0xFE, 0xFF, 0x8F, 0xFF, 0xF1, 0xFE, 0x7E, + 0x3F, 0x87, 0x87, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, + 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, + 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, + 0xF8, 0x00, 0x7F, 0x80, 0x3F, 0xFC, 0x00, 0x0F, 0x84, 0x3F, 0xF8, 0xE1, + 0xF3, 0x80, 0xEF, 0x00, 0xDE, 0x01, 0xBE, 0x01, 0x7E, 0x00, 0xFF, 0x01, + 0xFF, 0x81, 0xFF, 0xC3, 0xFF, 0xC3, 0xFF, 0xC1, 0xFF, 0x80, 0xFF, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x00, 0x7E, 0x00, 0xFE, 0x01, 0xDF, 0x0F, + 0x37, 0xFC, 0x43, 0xF0, 0x01, 0x00, 0x0C, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x7C, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xF3, 0xFF, 0xC3, 0xF0, 0x0F, + 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, + 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, + 0xFC, 0x23, 0xF0, 0x8F, 0xE6, 0x1F, 0xF0, 0x7F, 0x80, 0xF8, 0x00, 0xFF, + 0x87, 0xFC, 0x1F, 0xC0, 0xFE, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F, 0x81, + 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x01, 0xF8, + 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F, + 0x81, 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x01, + 0xF8, 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x7F, 0x03, 0xF8, + 0x7F, 0xC0, 0xFF, 0xEF, 0xF8, 0x3F, 0xE7, 0xC0, 0x0F, 0xC2, 0x00, 0xFF, + 0xF1, 0xFC, 0xFF, 0x01, 0xE3, 0xFC, 0x03, 0x07, 0xF0, 0x0C, 0x1F, 0xC0, + 0x60, 0x3F, 0x81, 0x80, 0xFE, 0x04, 0x01, 0xF8, 0x30, 0x07, 0xF0, 0xC0, + 0x1F, 0xC6, 0x00, 0x3F, 0x98, 0x00, 0xFE, 0x40, 0x01, 0xFB, 0x00, 0x07, + 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x01, 0xF0, + 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, + 0x01, 0x00, 0x00, 0xFF, 0xE7, 0xFF, 0x3F, 0xBF, 0xE0, 0xFE, 0x07, 0x0F, + 0xE0, 0x7F, 0x03, 0x83, 0xF0, 0x1F, 0x81, 0x81, 0xFC, 0x0F, 0xC0, 0xC0, + 0xFE, 0x07, 0xF0, 0x40, 0x3F, 0x03, 0xF8, 0x60, 0x1F, 0xC3, 0xFC, 0x30, + 0x07, 0xE1, 0xFE, 0x10, 0x03, 0xF0, 0x9F, 0x98, 0x01, 0xFC, 0xCF, 0xCC, + 0x00, 0x7E, 0x67, 0xEC, 0x00, 0x3F, 0xE1, 0xFE, 0x00, 0x1F, 0xF0, 0xFE, + 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x03, 0xF8, 0x3F, 0x80, 0x00, 0xFC, 0x0F, + 0x80, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x3E, 0x03, 0xE0, 0x00, 0x0F, 0x00, + 0xE0, 0x00, 0x07, 0x00, 0x70, 0x00, 0x03, 0x80, 0x38, 0x00, 0x00, 0x80, + 0x08, 0x00, 0xFF, 0xF3, 0xFD, 0xFF, 0x03, 0xC3, 0xFC, 0x0E, 0x07, 0xF0, + 0x30, 0x1F, 0xE1, 0x80, 0x3F, 0x8C, 0x00, 0x7F, 0x70, 0x01, 0xFF, 0x80, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, + 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1B, 0xF8, 0x00, 0xCF, 0xF0, 0x06, 0x1F, + 0xC0, 0x38, 0x3F, 0x80, 0xC0, 0xFF, 0x07, 0x01, 0xFC, 0x3C, 0x07, 0xFB, + 0xFC, 0x7F, 0xF0, 0xFF, 0xE3, 0xFB, 0xFC, 0x07, 0x8F, 0xE0, 0x18, 0x7F, + 0x01, 0x81, 0xF8, 0x0C, 0x0F, 0xE0, 0x60, 0x7F, 0x06, 0x01, 0xF8, 0x30, + 0x0F, 0xE1, 0x80, 0x7F, 0x18, 0x01, 0xF8, 0xC0, 0x0F, 0xE6, 0x00, 0x3F, + 0x60, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, + 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x03, 0x82, 0x00, 0x3E, + 0x30, 0x01, 0xF1, 0x00, 0x0F, 0x98, 0x00, 0x3F, 0x80, 0x00, 0xF0, 0x00, + 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xE0, 0x7F, 0x30, 0x1F, 0xC6, 0x07, + 0xF8, 0x80, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x3F, + 0x80, 0x0F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xF8, + 0x00, 0xFE, 0x03, 0x3F, 0xC0, 0x67, 0xF0, 0x19, 0xFE, 0x07, 0x3F, 0x83, + 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x00, 0x7C, 0x07, 0xE0, 0x3E, 0x00, + 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, + 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, + 0x1F, 0x00, 0xF8, 0x03, 0xC0, 0x3C, 0x01, 0xF0, 0x00, 0xF0, 0x03, 0xE0, + 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, + 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, + 0x00, 0x3E, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, 0x00, + 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, + 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0x7C, 0x00, 0xF0, + 0x00, 0xF0, 0x03, 0xE0, 0x3C, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, + 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x07, 0xC0, 0x7E, + 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xC0, 0x47, 0xFF, 0xC3, 0x9F, + 0xFF, 0xFF, 0x70, 0x7F, 0xF8, 0x80, 0x7F, 0xC0, 0x00, 0x3E, 0x00}; + +const GFXglyph FreeSerifBold24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 12, 0, 1}, // 0x20 ' ' + {0, 8, 34, 16, 4, -32}, // 0x21 '!' + {34, 17, 13, 26, 4, -32}, // 0x22 '"' + {62, 23, 33, 23, 0, -32}, // 0x23 '#' + {157, 21, 39, 24, 1, -34}, // 0x24 '$' + {260, 35, 34, 47, 6, -32}, // 0x25 '%' + {409, 34, 34, 39, 3, -32}, // 0x26 '&' + {554, 5, 13, 13, 4, -32}, // 0x27 ''' + {563, 12, 41, 16, 2, -32}, // 0x28 '(' + {625, 12, 41, 16, 1, -32}, // 0x29 ')' + {687, 18, 21, 24, 3, -32}, // 0x2A '*' + {735, 26, 25, 32, 3, -24}, // 0x2B '+' + {817, 8, 15, 12, 2, -6}, // 0x2C ',' + {832, 11, 5, 16, 2, -12}, // 0x2D '-' + {839, 8, 8, 12, 2, -6}, // 0x2E '.' + {847, 15, 33, 13, -1, -32}, // 0x2F '/' + {909, 22, 34, 23, 1, -32}, // 0x30 '0' + {1003, 18, 33, 23, 3, -32}, // 0x31 '1' + {1078, 21, 33, 24, 1, -32}, // 0x32 '2' + {1165, 21, 34, 24, 1, -32}, // 0x33 '3' + {1255, 21, 33, 24, 1, -32}, // 0x34 '4' + {1342, 20, 32, 23, 2, -31}, // 0x35 '5' + {1422, 21, 34, 24, 1, -32}, // 0x36 '6' + {1512, 21, 32, 23, 1, -31}, // 0x37 '7' + {1596, 21, 34, 23, 1, -32}, // 0x38 '8' + {1686, 22, 34, 23, 1, -32}, // 0x39 '9' + {1780, 8, 24, 16, 4, -22}, // 0x3A ':' + {1804, 9, 31, 16, 3, -22}, // 0x3B ';' + {1839, 26, 26, 32, 3, -24}, // 0x3C '<' + {1924, 26, 17, 32, 3, -20}, // 0x3D '=' + {1980, 26, 26, 32, 3, -24}, // 0x3E '>' + {2065, 18, 34, 24, 3, -32}, // 0x3F '?' + {2142, 33, 34, 44, 5, -32}, // 0x40 '@' + {2283, 32, 33, 34, 1, -32}, // 0x41 'A' + {2415, 28, 32, 31, 1, -31}, // 0x42 'B' + {2527, 30, 34, 33, 2, -32}, // 0x43 'C' + {2655, 32, 32, 34, 1, -31}, // 0x44 'D' + {2783, 28, 32, 32, 2, -31}, // 0x45 'E' + {2895, 25, 32, 29, 2, -31}, // 0x46 'F' + {2995, 33, 34, 36, 2, -32}, // 0x47 'G' + {3136, 33, 32, 37, 2, -31}, // 0x48 'H' + {3268, 15, 32, 18, 2, -31}, // 0x49 'I' + {3328, 22, 37, 24, 0, -31}, // 0x4A 'J' + {3430, 34, 32, 36, 2, -31}, // 0x4B 'K' + {3566, 28, 32, 31, 2, -31}, // 0x4C 'L' + {3678, 43, 32, 45, 0, -31}, // 0x4D 'M' + {3850, 31, 32, 34, 1, -31}, // 0x4E 'N' + {3974, 33, 34, 37, 2, -32}, // 0x4F 'O' + {4115, 26, 32, 30, 2, -31}, // 0x50 'P' + {4219, 33, 41, 37, 2, -32}, // 0x51 'Q' + {4389, 31, 32, 34, 2, -31}, // 0x52 'R' + {4513, 21, 34, 27, 3, -32}, // 0x53 'S' + {4603, 28, 32, 30, 1, -31}, // 0x54 'T' + {4715, 30, 33, 34, 2, -31}, // 0x55 'U' + {4839, 33, 32, 33, 0, -31}, // 0x56 'V' + {4971, 45, 33, 46, 1, -31}, // 0x57 'W' + {5157, 32, 32, 34, 1, -31}, // 0x58 'X' + {5285, 32, 32, 33, 1, -31}, // 0x59 'Y' + {5413, 28, 32, 30, 1, -31}, // 0x5A 'Z' + {5525, 11, 39, 16, 3, -31}, // 0x5B '[' + {5579, 15, 33, 13, -1, -32}, // 0x5C '\' + {5641, 11, 39, 16, 2, -31}, // 0x5D ']' + {5695, 21, 17, 27, 3, -31}, // 0x5E '^' + {5740, 24, 3, 23, 0, 5}, // 0x5F '_' + {5749, 11, 9, 16, 0, -33}, // 0x60 '`' + {5762, 22, 24, 23, 1, -22}, // 0x61 'a' + {5828, 25, 33, 26, 0, -31}, // 0x62 'b' + {5932, 19, 24, 20, 1, -22}, // 0x63 'c' + {5989, 24, 33, 26, 1, -31}, // 0x64 'd' + {6088, 18, 24, 21, 1, -22}, // 0x65 'e' + {6142, 17, 33, 18, 1, -32}, // 0x66 'f' + {6213, 19, 32, 24, 2, -22}, // 0x67 'g' + {6289, 24, 32, 26, 0, -31}, // 0x68 'h' + {6385, 11, 33, 14, 1, -32}, // 0x69 'i' + {6431, 14, 42, 18, 0, -32}, // 0x6A 'j' + {6505, 25, 32, 26, 0, -31}, // 0x6B 'k' + {6605, 11, 32, 13, 0, -31}, // 0x6C 'l' + {6649, 37, 23, 39, 0, -22}, // 0x6D 'm' + {6756, 24, 23, 26, 0, -22}, // 0x6E 'n' + {6825, 21, 24, 24, 1, -22}, // 0x6F 'o' + {6888, 24, 32, 26, 0, -22}, // 0x70 'p' + {6984, 24, 32, 26, 1, -22}, // 0x71 'q' + {7080, 19, 23, 20, 0, -22}, // 0x72 'r' + {7135, 15, 24, 19, 2, -22}, // 0x73 's' + {7180, 14, 31, 16, 1, -29}, // 0x74 't' + {7235, 25, 23, 27, 0, -21}, // 0x75 'u' + {7307, 22, 23, 23, 0, -21}, // 0x76 'v' + {7371, 33, 23, 33, 0, -21}, // 0x77 'w' + {7466, 22, 22, 24, 1, -21}, // 0x78 'x' + {7527, 21, 31, 23, 0, -21}, // 0x79 'y' + {7609, 19, 22, 21, 1, -21}, // 0x7A 'z' + {7662, 14, 42, 19, 1, -33}, // 0x7B '{' + {7736, 4, 33, 10, 3, -32}, // 0x7C '|' + {7753, 14, 42, 19, 4, -33}, // 0x7D '}' + {7827, 22, 7, 24, 1, -14}}; // 0x7E '~' + +const GFXfont FreeSerifBold24pt7b PROGMEM = { + (uint8_t *)FreeSerifBold24pt7bBitmaps, + (GFXglyph *)FreeSerifBold24pt7bGlyphs, 0x20, 0x7E, 56}; + +// Approx. 8519 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h new file mode 100644 index 0000000..2f1cf8f --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h @@ -0,0 +1,204 @@ +#pragma once +#include + +const uint8_t FreeSerifBold9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xF4, 0x92, 0x1F, 0xF0, 0xCF, 0x3C, 0xE3, 0x88, 0x13, 0x09, 0x84, + 0xC2, 0x47, 0xF9, 0x90, 0xC8, 0x4C, 0xFF, 0x13, 0x09, 0x0C, 0x86, 0x40, + 0x10, 0x38, 0xD6, 0x92, 0xD2, 0xF0, 0x7C, 0x3E, 0x17, 0x93, 0x93, 0xD6, + 0x7C, 0x10, 0x3C, 0x21, 0xCF, 0x0E, 0x24, 0x30, 0xA0, 0xC5, 0x03, 0x34, + 0xE7, 0x26, 0x40, 0xB9, 0x04, 0xC4, 0x23, 0x30, 0x8C, 0x84, 0x1C, 0x0F, + 0x00, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0xE7, 0x8F, 0x18, 0x9C, 0x8C, 0xE4, + 0xE3, 0xC7, 0x9E, 0x3C, 0x72, 0xFD, 0xE0, 0xFF, 0x80, 0x32, 0x44, 0xCC, + 0xCC, 0xCC, 0xC4, 0x62, 0x10, 0x84, 0x22, 0x33, 0x33, 0x33, 0x32, 0x64, + 0x80, 0x31, 0x6B, 0xB1, 0x8E, 0xD6, 0x8C, 0x00, 0x08, 0x04, 0x02, 0x01, + 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xDF, 0x95, 0x00, 0xFF, 0xFF, + 0x80, 0x0C, 0x21, 0x86, 0x10, 0xC3, 0x08, 0x61, 0x84, 0x30, 0xC0, 0x1C, + 0x33, 0x98, 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xB1, 0x98, 0xC3, + 0x80, 0x08, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBF, 0x3C, 0x3F, + 0x23, 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x18, 0x18, 0x18, 0x5F, 0xDF, 0xE0, + 0x7C, 0x8E, 0x0E, 0x0E, 0x0C, 0x1E, 0x07, 0x03, 0x03, 0x02, 0xE6, 0xF8, + 0x06, 0x0E, 0x0E, 0x3E, 0x2E, 0x4E, 0x8E, 0x8E, 0xFF, 0xFF, 0x0E, 0x0E, + 0x3F, 0x7E, 0x40, 0x40, 0xF8, 0xFC, 0x1E, 0x06, 0x02, 0x02, 0xE4, 0xF8, + 0x07, 0x1C, 0x30, 0x70, 0xFC, 0xE6, 0xE7, 0xE7, 0xE7, 0x67, 0x66, 0x3C, + 0x7F, 0x3F, 0xA0, 0xD0, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x04, 0x06, + 0x03, 0x00, 0x3C, 0xC6, 0xC6, 0xC6, 0xFC, 0x7C, 0x3E, 0xCF, 0xC7, 0xC7, + 0xC6, 0x7C, 0x3E, 0x33, 0xB8, 0xDC, 0x7E, 0x3F, 0x1D, 0xCE, 0x7F, 0x07, + 0x07, 0x0F, 0x1C, 0x00, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x37, 0xE5, + 0x40, 0x00, 0x00, 0x70, 0x78, 0x78, 0x78, 0x38, 0x03, 0x80, 0x3C, 0x03, + 0xC0, 0x30, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0xC0, 0x3C, 0x03, + 0xC0, 0x1C, 0x01, 0xC1, 0xE1, 0xE1, 0xE0, 0xE0, 0x00, 0x00, 0x3D, 0x9F, + 0x3E, 0x70, 0xE1, 0x04, 0x08, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0x81, 0x83, + 0x18, 0xC4, 0x89, 0x9C, 0x4C, 0xE4, 0x67, 0x22, 0x39, 0x22, 0x4F, 0xE3, + 0x00, 0x0C, 0x10, 0x1F, 0x00, 0x02, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, + 0xB8, 0x05, 0xC0, 0x4F, 0x02, 0x38, 0x3F, 0xE1, 0x07, 0x18, 0x3D, 0xE3, + 0xF0, 0xFF, 0x87, 0x1C, 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x0E, 0x71, 0xC7, + 0x38, 0xE7, 0x1C, 0xE7, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0xC1, 0xB0, 0x1E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x0E, 0x04, 0xE1, 0x0F, 0xC0, 0xFF, + 0x0E, 0x71, 0xC7, 0x38, 0x77, 0x0E, 0xE1, 0xDC, 0x3B, 0x87, 0x70, 0xCE, + 0x39, 0xC6, 0x7F, 0x80, 0xFF, 0xCE, 0x19, 0xC1, 0x38, 0x87, 0x30, 0xFE, + 0x1C, 0xC3, 0x88, 0x70, 0x2E, 0x0D, 0xC3, 0x7F, 0xE0, 0xFF, 0xDC, 0x37, + 0x05, 0xC4, 0x73, 0x1F, 0xC7, 0x31, 0xC4, 0x70, 0x1C, 0x07, 0x03, 0xE0, + 0x1F, 0x23, 0x0E, 0x70, 0x6E, 0x02, 0xE0, 0x0E, 0x00, 0xE1, 0xFE, 0x0E, + 0x60, 0xE7, 0x0E, 0x38, 0xE0, 0xF8, 0xF9, 0xF7, 0x0E, 0x70, 0xE7, 0x0E, + 0x70, 0xE7, 0xFE, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xEF, 0x9F, + 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0x1F, 0x0E, 0x0E, 0x0E, + 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xCE, 0xCC, 0x78, 0xF9, 0xF3, + 0x82, 0x1C, 0x20, 0xE2, 0x07, 0x20, 0x3F, 0x01, 0xDC, 0x0E, 0x70, 0x73, + 0xC3, 0x8F, 0x1C, 0x3D, 0xF3, 0xF0, 0xF8, 0x0E, 0x01, 0xC0, 0x38, 0x07, + 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x2E, 0x09, 0xC3, 0x7F, 0xE0, 0xF8, + 0x0F, 0x3C, 0x1E, 0x3C, 0x1E, 0x2E, 0x2E, 0x2E, 0x2E, 0x26, 0x4E, 0x27, + 0x4E, 0x27, 0x4E, 0x23, 0x8E, 0x23, 0x8E, 0x21, 0x0E, 0x71, 0x1F, 0xF0, + 0xEE, 0x09, 0xE1, 0x3E, 0x25, 0xE4, 0x9E, 0x91, 0xD2, 0x1E, 0x43, 0xC8, + 0x39, 0x03, 0x70, 0x20, 0x1F, 0x83, 0x0C, 0x70, 0xEE, 0x07, 0xE0, 0x7E, + 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x77, 0x0E, 0x30, 0xC1, 0xF8, 0xFF, 0x1C, + 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0xE7, 0xF1, 0xC0, 0x70, 0x1C, 0x07, 0x03, + 0xE0, 0x0F, 0x83, 0x9C, 0x70, 0xE6, 0x06, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, + 0x07, 0xE0, 0x76, 0x06, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0x78, 0x03, 0xE0, + 0xFF, 0x07, 0x38, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x38, 0x7E, 0x07, 0x70, + 0x77, 0x87, 0x3C, 0x71, 0xEF, 0x8F, 0x39, 0x47, 0xC1, 0xC0, 0xF0, 0x7C, + 0x3E, 0x0F, 0x83, 0xC3, 0xC6, 0xBC, 0xFF, 0xFC, 0xE3, 0x8E, 0x10, 0xE0, + 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xF0, + 0xF8, 0xEE, 0x09, 0xC1, 0x38, 0x27, 0x04, 0xE0, 0x9C, 0x13, 0x82, 0x70, + 0x4E, 0x08, 0xE2, 0x0F, 0x80, 0xFC, 0x7B, 0xC1, 0x0E, 0x08, 0x70, 0x81, + 0xC4, 0x0E, 0x20, 0x7A, 0x01, 0xD0, 0x0E, 0x80, 0x38, 0x01, 0xC0, 0x04, + 0x00, 0x20, 0x00, 0xFD, 0xFB, 0xDC, 0x38, 0x43, 0x87, 0x10, 0xE1, 0xC4, + 0x38, 0xF2, 0x07, 0x2E, 0x81, 0xD3, 0xA0, 0x34, 0x70, 0x0E, 0x1C, 0x03, + 0x87, 0x00, 0x60, 0x80, 0x10, 0x20, 0xFE, 0xF3, 0xC3, 0x0F, 0x10, 0x39, + 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x01, 0x70, 0x09, 0xC0, 0x8F, 0x08, 0x3D, + 0xF3, 0xF0, 0xFC, 0x7B, 0xC1, 0x8E, 0x08, 0x38, 0x81, 0xE8, 0x07, 0x40, + 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1F, 0x00, 0xFF, 0xD8, + 0x72, 0x1E, 0x43, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x38, 0x2E, 0x0F, + 0x83, 0x7F, 0xE0, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF0, 0xC1, + 0x06, 0x18, 0x20, 0xC3, 0x04, 0x18, 0x60, 0x83, 0x0C, 0xF3, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0xF0, 0x18, 0x1C, 0x34, 0x26, 0x62, 0x43, 0xC1, + 0xFF, 0x80, 0xC6, 0x30, 0x7C, 0x63, 0xB1, 0xC0, 0xE1, 0xF3, 0x3B, 0x9D, + 0xCE, 0xFF, 0x80, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0x77, 0x1D, + 0xC7, 0x71, 0xDC, 0x77, 0x39, 0x3C, 0x3C, 0xED, 0x9F, 0x0E, 0x1C, 0x38, + 0x39, 0x3C, 0x07, 0x80, 0xE0, 0x38, 0xEE, 0x77, 0xB8, 0xEE, 0x3B, 0x8E, + 0xE3, 0xB8, 0xE7, 0x78, 0xEF, 0x3C, 0x66, 0xE6, 0xFE, 0xE0, 0xE0, 0xE0, + 0x72, 0x3C, 0x3E, 0xED, 0xC7, 0xC7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC7, + 0xC0, 0x31, 0xDF, 0xBF, 0x7E, 0xE7, 0x90, 0x60, 0xFC, 0xFE, 0x0C, 0x17, + 0xC0, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0xE7, 0x39, 0xCE, 0x73, + 0x9C, 0xE7, 0x3B, 0xFF, 0x73, 0x9D, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, + 0x1C, 0x71, 0xCF, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x7D, 0xBE, + 0xF0, 0x1C, 0x07, 0x01, 0xCE, 0x71, 0x1C, 0x87, 0x41, 0xF8, 0x77, 0x1C, + 0xE7, 0x1B, 0xEF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0xF7, + 0x38, 0xF7, 0xB9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, + 0x39, 0xCE, 0xFF, 0xFE, 0xF7, 0x1E, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, + 0x39, 0xCE, 0xFF, 0xC0, 0x3E, 0x31, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, + 0xC6, 0x3E, 0x00, 0xF7, 0x1E, 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0x77, 0x1D, + 0xCE, 0x7F, 0x1C, 0x07, 0x01, 0xC0, 0xF8, 0x00, 0x3C, 0x9C, 0xEE, 0x3B, + 0x8E, 0xE3, 0xB8, 0xEE, 0x39, 0xCE, 0x3F, 0x80, 0xE0, 0x38, 0x0E, 0x07, + 0xC0, 0xF7, 0x7B, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xF8, 0x7E, 0x73, + 0xC7, 0x8E, 0x39, 0xB0, 0x10, 0xCF, 0x9C, 0x71, 0xC7, 0x1C, 0x71, 0xD3, + 0x80, 0xF7, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x3F, + 0xC0, 0xFB, 0xB8, 0x8C, 0x87, 0x43, 0xC0, 0xE0, 0x70, 0x10, 0x08, 0x00, + 0xF7, 0xB6, 0x31, 0x73, 0xA3, 0x3A, 0x3D, 0xA3, 0xDC, 0x18, 0xC1, 0x88, + 0x10, 0x80, 0xFB, 0xB8, 0x8E, 0x83, 0x81, 0xC0, 0xF0, 0x98, 0xCE, 0xEF, + 0x80, 0xF7, 0x62, 0x72, 0x34, 0x34, 0x3C, 0x18, 0x18, 0x10, 0x10, 0x10, + 0xE0, 0xE0, 0xFF, 0x1C, 0x70, 0xE3, 0x87, 0x1C, 0x71, 0xFE, 0x19, 0x8C, + 0x63, 0x18, 0xCC, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF8, 0xC3, 0x18, + 0xC6, 0x31, 0x86, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xF0, 0x8E}; + +const GFXglyph FreeSerifBold9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 3, 12, 6, 1, -11}, // 0x21 '!' + {5, 6, 5, 10, 2, -11}, // 0x22 '"' + {9, 9, 13, 9, 0, -12}, // 0x23 '#' + {24, 8, 14, 9, 1, -12}, // 0x24 '$' + {38, 14, 12, 18, 2, -11}, // 0x25 '%' + {59, 13, 12, 15, 1, -11}, // 0x26 '&' + {79, 2, 5, 5, 1, -11}, // 0x27 ''' + {81, 4, 15, 6, 1, -11}, // 0x28 '(' + {89, 4, 15, 6, 1, -11}, // 0x29 ')' + {97, 7, 7, 9, 2, -11}, // 0x2A '*' + {104, 9, 9, 12, 1, -8}, // 0x2B '+' + {115, 3, 6, 4, 1, -2}, // 0x2C ',' + {118, 4, 2, 6, 1, -4}, // 0x2D '-' + {119, 3, 3, 4, 1, -2}, // 0x2E '.' + {121, 6, 13, 5, 0, -11}, // 0x2F '/' + {131, 9, 12, 9, 0, -11}, // 0x30 '0' + {145, 6, 12, 9, 1, -11}, // 0x31 '1' + {154, 9, 12, 9, 0, -11}, // 0x32 '2' + {168, 8, 12, 9, 0, -11}, // 0x33 '3' + {180, 8, 12, 9, 1, -11}, // 0x34 '4' + {192, 8, 12, 9, 1, -11}, // 0x35 '5' + {204, 8, 12, 9, 1, -11}, // 0x36 '6' + {216, 9, 12, 9, 0, -11}, // 0x37 '7' + {230, 8, 12, 9, 1, -11}, // 0x38 '8' + {242, 9, 12, 9, 0, -11}, // 0x39 '9' + {256, 3, 9, 6, 1, -8}, // 0x3A ':' + {260, 3, 12, 6, 2, -8}, // 0x3B ';' + {265, 10, 10, 12, 1, -9}, // 0x3C '<' + {278, 10, 5, 12, 1, -6}, // 0x3D '=' + {285, 10, 10, 12, 1, -8}, // 0x3E '>' + {298, 7, 12, 9, 1, -11}, // 0x3F '?' + {309, 13, 12, 17, 2, -11}, // 0x40 '@' + {329, 13, 12, 13, 0, -11}, // 0x41 'A' + {349, 11, 12, 12, 0, -11}, // 0x42 'B' + {366, 11, 12, 13, 1, -11}, // 0x43 'C' + {383, 11, 12, 13, 1, -11}, // 0x44 'D' + {400, 11, 12, 12, 1, -11}, // 0x45 'E' + {417, 10, 12, 11, 1, -11}, // 0x46 'F' + {432, 12, 12, 14, 1, -11}, // 0x47 'G' + {450, 12, 12, 14, 1, -11}, // 0x48 'H' + {468, 5, 12, 7, 1, -11}, // 0x49 'I' + {476, 8, 14, 9, 0, -11}, // 0x4A 'J' + {490, 13, 12, 14, 1, -11}, // 0x4B 'K' + {510, 11, 12, 12, 1, -11}, // 0x4C 'L' + {527, 16, 12, 17, 0, -11}, // 0x4D 'M' + {551, 11, 12, 13, 1, -11}, // 0x4E 'N' + {568, 12, 12, 14, 1, -11}, // 0x4F 'O' + {586, 10, 12, 11, 1, -11}, // 0x50 'P' + {601, 12, 15, 14, 1, -11}, // 0x51 'Q' + {624, 12, 12, 13, 1, -11}, // 0x52 'R' + {642, 8, 12, 10, 1, -11}, // 0x53 'S' + {654, 12, 12, 12, 0, -11}, // 0x54 'T' + {672, 11, 12, 13, 1, -11}, // 0x55 'U' + {689, 13, 13, 13, 0, -11}, // 0x56 'V' + {711, 18, 12, 18, 0, -11}, // 0x57 'W' + {738, 13, 12, 13, 0, -11}, // 0x58 'X' + {758, 13, 12, 13, 0, -11}, // 0x59 'Y' + {778, 11, 12, 12, 1, -11}, // 0x5A 'Z' + {795, 4, 15, 6, 1, -11}, // 0x5B '[' + {803, 6, 13, 5, 0, -11}, // 0x5C '\' + {813, 4, 15, 6, 1, -11}, // 0x5D ']' + {821, 8, 7, 10, 1, -11}, // 0x5E '^' + {828, 9, 1, 9, 0, 3}, // 0x5F '_' + {830, 4, 3, 6, 0, -12}, // 0x60 '`' + {832, 9, 9, 9, 0, -8}, // 0x61 'a' + {843, 10, 12, 10, 0, -11}, // 0x62 'b' + {858, 7, 9, 8, 0, -8}, // 0x63 'c' + {866, 10, 12, 10, 0, -11}, // 0x64 'd' + {881, 8, 9, 8, 0, -8}, // 0x65 'e' + {890, 7, 12, 7, 0, -11}, // 0x66 'f' + {901, 7, 13, 9, 1, -8}, // 0x67 'g' + {913, 10, 12, 10, 0, -11}, // 0x68 'h' + {928, 5, 12, 5, 0, -11}, // 0x69 'i' + {936, 6, 16, 7, 0, -11}, // 0x6A 'j' + {948, 10, 12, 10, 0, -11}, // 0x6B 'k' + {963, 5, 12, 5, 0, -11}, // 0x6C 'l' + {971, 15, 9, 15, 0, -8}, // 0x6D 'm' + {988, 10, 9, 10, 0, -8}, // 0x6E 'n' + {1000, 9, 9, 9, 0, -8}, // 0x6F 'o' + {1011, 10, 13, 10, 0, -8}, // 0x70 'p' + {1028, 10, 13, 10, 0, -8}, // 0x71 'q' + {1045, 8, 9, 8, 0, -8}, // 0x72 'r' + {1054, 5, 9, 7, 1, -8}, // 0x73 's' + {1060, 6, 11, 6, 0, -10}, // 0x74 't' + {1069, 10, 9, 10, 0, -8}, // 0x75 'u' + {1081, 9, 9, 9, 0, -8}, // 0x76 'v' + {1092, 12, 9, 13, 0, -8}, // 0x77 'w' + {1106, 9, 9, 9, 0, -8}, // 0x78 'x' + {1117, 8, 13, 9, 0, -8}, // 0x79 'y' + {1130, 7, 9, 8, 1, -8}, // 0x7A 'z' + {1138, 5, 16, 7, 0, -12}, // 0x7B '{' + {1148, 1, 13, 4, 1, -11}, // 0x7C '|' + {1150, 5, 16, 7, 2, -12}, // 0x7D '}' + {1160, 8, 2, 9, 1, -4}}; // 0x7E '~' + +const GFXfont FreeSerifBold9pt7b PROGMEM = { + (uint8_t *)FreeSerifBold9pt7bBitmaps, (GFXglyph *)FreeSerifBold9pt7bGlyphs, + 0x20, 0x7E, 22}; + +// Approx. 1834 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h new file mode 100644 index 0000000..d6674ce --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h @@ -0,0 +1,294 @@ +#pragma once +#include + +const uint8_t FreeSerifBoldItalic12pt7bBitmaps[] PROGMEM = { + 0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0E, 0x0C, 0x0C, 0x08, 0x18, 0x10, 0x00, + 0x00, 0x60, 0xF0, 0xF0, 0x60, 0x61, 0xF1, 0xF8, 0xF8, 0x6C, 0x34, 0x12, + 0x08, 0x01, 0x8C, 0x06, 0x60, 0x31, 0x80, 0xCC, 0x06, 0x30, 0xFF, 0xF0, + 0xC6, 0x03, 0x18, 0x0C, 0xC0, 0x63, 0x0F, 0xFF, 0x0C, 0x60, 0x33, 0x01, + 0x8C, 0x06, 0x30, 0x19, 0x80, 0x00, 0x80, 0x08, 0x07, 0xC1, 0x96, 0x31, + 0x33, 0x13, 0x3A, 0x23, 0xE0, 0x1E, 0x01, 0xF0, 0x07, 0x80, 0x7C, 0x05, + 0xC4, 0xCC, 0x48, 0xCC, 0x8C, 0xF8, 0x83, 0x30, 0x1E, 0x01, 0x00, 0x00, + 0x02, 0x07, 0x83, 0x03, 0x9F, 0x81, 0xC4, 0x20, 0x71, 0x10, 0x3C, 0x44, + 0x0E, 0x22, 0x03, 0x88, 0x80, 0xE4, 0x40, 0x1E, 0x31, 0xE0, 0x08, 0xE4, + 0x06, 0x71, 0x01, 0x3C, 0x40, 0x8E, 0x10, 0x23, 0x88, 0x10, 0xE2, 0x04, + 0x39, 0x02, 0x07, 0x80, 0x00, 0xF0, 0x01, 0x98, 0x03, 0x98, 0x03, 0x98, + 0x03, 0xB0, 0x03, 0xE0, 0x03, 0x80, 0x0F, 0x9F, 0x19, 0xCE, 0x31, 0xCC, + 0x61, 0xC8, 0xE1, 0xC8, 0xE0, 0xF0, 0xE0, 0xE0, 0xF0, 0x70, 0x78, 0x79, + 0x3F, 0xBE, 0x7F, 0xED, 0x20, 0x02, 0x08, 0x20, 0xC3, 0x0E, 0x18, 0x30, + 0xE1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x20, 0x40, 0x80, 0x81, 0x01, 0x00, + 0x10, 0x10, 0x20, 0x20, 0x40, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x70, 0xE1, + 0x83, 0x0C, 0x18, 0x61, 0x86, 0x00, 0x00, 0x0C, 0x33, 0x6C, 0x9B, 0xAE, + 0x1C, 0x3F, 0xEC, 0x9B, 0x36, 0x0C, 0x02, 0x00, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x31, 0xCE, 0x31, 0x08, 0x98, 0xFF, 0xFF, 0xC0, 0x6F, 0xF6, + 0x01, 0x80, 0x60, 0x30, 0x0C, 0x07, 0x01, 0x80, 0xE0, 0x30, 0x1C, 0x06, + 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x03, 0x00, 0x03, 0x81, 0xC8, 0x71, + 0x1C, 0x33, 0x86, 0xE1, 0xDC, 0x3B, 0x87, 0xE0, 0xFC, 0x3B, 0x87, 0x70, + 0xEC, 0x39, 0x87, 0x31, 0xC2, 0x30, 0x3C, 0x00, 0x01, 0xC3, 0xF0, 0x38, + 0x0E, 0x03, 0x81, 0xE0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x1E, + 0x07, 0x01, 0xC0, 0xF0, 0xFF, 0x80, 0x07, 0x81, 0xF8, 0x47, 0x90, 0x70, + 0x0E, 0x01, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, + 0x40, 0x8F, 0xF3, 0xFC, 0xFF, 0x80, 0x07, 0xC3, 0x3C, 0x03, 0x80, 0x70, + 0x0C, 0x03, 0x81, 0xC0, 0xFC, 0x07, 0xC0, 0x78, 0x07, 0x00, 0xE0, 0x1C, + 0x03, 0x30, 0xE7, 0x10, 0x7C, 0x00, 0x00, 0x10, 0x01, 0x80, 0x3C, 0x03, + 0xE0, 0x2E, 0x02, 0x70, 0x23, 0x82, 0x38, 0x21, 0xC2, 0x0E, 0x1F, 0xF9, + 0xFF, 0xC0, 0x38, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0xF0, 0x7E, 0x0F, + 0xE0, 0x80, 0x08, 0x01, 0xE0, 0x1F, 0x83, 0xF8, 0x03, 0xC0, 0x1C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x08, 0x61, 0x8F, 0x30, 0x7C, 0x00, 0x00, 0x60, + 0x78, 0x1C, 0x0F, 0x01, 0xC0, 0x70, 0x1F, 0xC3, 0x8C, 0xE1, 0xDC, 0x3B, + 0x87, 0x61, 0xEC, 0x3D, 0x87, 0x31, 0xE2, 0x38, 0x3C, 0x00, 0x3F, 0xEF, + 0xF9, 0xFF, 0x60, 0xC8, 0x18, 0x06, 0x00, 0x80, 0x30, 0x0C, 0x01, 0x80, + 0x60, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x00, 0x03, 0x81, 0x88, 0x61, + 0x8C, 0x31, 0x86, 0x38, 0xC7, 0xB0, 0x78, 0x0F, 0x86, 0x71, 0x87, 0x60, + 0x6C, 0x0D, 0x81, 0xB0, 0x63, 0x18, 0x3E, 0x00, 0x07, 0x81, 0xC8, 0x71, + 0x8E, 0x33, 0xC6, 0x70, 0xCE, 0x39, 0xC7, 0x38, 0xE3, 0x38, 0x3F, 0x01, + 0xC0, 0x38, 0x0E, 0x03, 0x81, 0xC0, 0xE0, 0x00, 0x0C, 0x3C, 0x78, 0x60, + 0x00, 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x0E, 0x0F, 0x0F, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x18, 0x10, 0x20, 0x40, 0x00, 0x10, + 0x07, 0x01, 0xF0, 0x7C, 0x3F, 0x0F, 0x80, 0xE0, 0x0F, 0x80, 0x3E, 0x00, + 0xF8, 0x03, 0xE0, 0x07, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7C, 0x00, + 0xF8, 0x01, 0xE0, 0x1F, 0x07, 0xE0, 0xF8, 0x1F, 0x01, 0xE0, 0x0C, 0x00, + 0x00, 0x1E, 0x19, 0x8C, 0xE6, 0x70, 0x38, 0x38, 0x1C, 0x18, 0x18, 0x08, + 0x08, 0x00, 0x00, 0x03, 0x03, 0xC1, 0xE0, 0x60, 0x00, 0x03, 0xF0, 0x07, + 0x06, 0x06, 0x00, 0x86, 0x0E, 0x66, 0x0D, 0xDB, 0x0C, 0xE7, 0x06, 0x33, + 0x83, 0x31, 0xC3, 0x18, 0xE1, 0x8C, 0x70, 0xCC, 0x4C, 0x66, 0x46, 0x1F, + 0xC1, 0x80, 0x00, 0x30, 0x10, 0x07, 0xF0, 0x00, 0x10, 0x00, 0x30, 0x00, + 0x70, 0x00, 0x70, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0x78, 0x03, 0x78, 0x02, + 0x38, 0x04, 0x38, 0x0C, 0x38, 0x0F, 0xF8, 0x18, 0x3C, 0x30, 0x3C, 0x20, + 0x3C, 0x60, 0x3C, 0xF8, 0x7F, 0x1F, 0xFC, 0x07, 0x9E, 0x07, 0x0F, 0x07, + 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x0E, 0x3C, 0x0F, 0xE0, 0x1E, 0x3C, 0x1E, + 0x1E, 0x1C, 0x1E, 0x3C, 0x1E, 0x3C, 0x1E, 0x3C, 0x3E, 0x38, 0x3C, 0x7C, + 0x78, 0xFF, 0xE0, 0x01, 0xF2, 0x0E, 0x1C, 0x38, 0x18, 0xE0, 0x33, 0xC0, + 0x4F, 0x00, 0x9E, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, + 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x04, 0x1E, 0x30, 0x0F, 0x80, 0x1F, + 0xFC, 0x01, 0xE3, 0xC0, 0x70, 0x78, 0x1C, 0x0E, 0x0F, 0x03, 0xC3, 0xC0, + 0xF0, 0xE0, 0x3C, 0x38, 0x0F, 0x1E, 0x03, 0xC7, 0x81, 0xF1, 0xC0, 0x78, + 0xF0, 0x1E, 0x3C, 0x0F, 0x0F, 0x03, 0xC3, 0x81, 0xC1, 0xE1, 0xE0, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0x83, 0xC1, 0xC1, 0xC0, 0x40, 0xE0, 0x20, 0xF0, + 0x00, 0x78, 0xC0, 0x38, 0x40, 0x1F, 0xE0, 0x1E, 0x70, 0x0F, 0x18, 0x07, + 0x08, 0x03, 0x84, 0x03, 0xC0, 0x61, 0xE0, 0x20, 0xE0, 0x30, 0xF8, 0x78, + 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x07, 0x87, 0x07, 0x02, 0x07, 0x02, 0x0F, + 0x00, 0x0F, 0x18, 0x0E, 0x10, 0x0F, 0xF0, 0x1E, 0x70, 0x1E, 0x30, 0x1C, + 0x20, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xFE, + 0x00, 0x01, 0xF9, 0x03, 0xC3, 0x83, 0x81, 0xC3, 0x80, 0x43, 0xC0, 0x23, + 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x3F, 0xF8, 0x0F, 0x3C, 0x07, + 0x9E, 0x03, 0xCF, 0x01, 0xC3, 0x80, 0xE1, 0xE0, 0xF0, 0x78, 0x70, 0x0F, + 0xE0, 0x00, 0x1F, 0xE7, 0xF0, 0x78, 0x3C, 0x07, 0x83, 0xC0, 0x70, 0x3C, + 0x0F, 0x03, 0x80, 0xF0, 0x78, 0x0E, 0x07, 0x80, 0xE0, 0x70, 0x1F, 0xFF, + 0x01, 0xE0, 0xF0, 0x1C, 0x0F, 0x03, 0xC0, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, + 0xE0, 0x38, 0x1E, 0x07, 0xC3, 0xE0, 0xFE, 0x7F, 0x00, 0x1F, 0xC1, 0xE0, + 0x70, 0x1C, 0x0F, 0x03, 0xC0, 0xE0, 0x38, 0x1E, 0x07, 0x81, 0xC0, 0x70, + 0x3C, 0x0F, 0x03, 0x81, 0xF0, 0xFE, 0x00, 0x01, 0xFC, 0x03, 0xC0, 0x0F, + 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x0E, 0x70, 0x3B, 0xC0, 0xCE, + 0x01, 0xF0, 0x00, 0x1F, 0xEF, 0x83, 0xC1, 0x81, 0xC1, 0x80, 0xE1, 0x80, + 0xF1, 0x80, 0x79, 0x00, 0x39, 0x00, 0x1F, 0x80, 0x1F, 0xE0, 0x0F, 0x70, + 0x07, 0x3C, 0x07, 0x8E, 0x03, 0xC7, 0x01, 0xE3, 0xC0, 0xE0, 0xE0, 0xF8, + 0x78, 0xFE, 0xFE, 0x00, 0x1F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0x00, + 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x70, + 0x00, 0xE0, 0x03, 0xC0, 0x27, 0x00, 0xCE, 0x03, 0x3C, 0x1E, 0xFF, 0xFC, + 0x0F, 0x80, 0x7E, 0x0F, 0x00, 0xF0, 0x1E, 0x03, 0xE0, 0x3C, 0x0F, 0x80, + 0xB8, 0x17, 0x01, 0x70, 0x5E, 0x02, 0xF1, 0xBC, 0x05, 0xE2, 0x70, 0x11, + 0xC8, 0xE0, 0x23, 0xB3, 0xC0, 0x47, 0x47, 0x81, 0x0F, 0x8E, 0x02, 0x1E, + 0x1C, 0x04, 0x38, 0x78, 0x08, 0x70, 0xF0, 0x30, 0xC3, 0xE0, 0xF9, 0x8F, + 0xE0, 0x1F, 0x03, 0xE0, 0xF0, 0x38, 0x1E, 0x02, 0x03, 0xE0, 0xC0, 0xBC, + 0x10, 0x13, 0xC2, 0x02, 0x78, 0x40, 0x47, 0x90, 0x10, 0xF2, 0x02, 0x0F, + 0x40, 0x41, 0xE8, 0x18, 0x1E, 0x02, 0x03, 0xC0, 0x40, 0x38, 0x08, 0x06, + 0x03, 0x00, 0x40, 0x10, 0x08, 0x00, 0x01, 0xF8, 0x07, 0x1C, 0x0E, 0x0E, + 0x1E, 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF8, 0x1F, + 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, 0x70, 0x70, + 0x38, 0xE0, 0x1F, 0x80, 0x1F, 0xFC, 0x07, 0x9E, 0x07, 0x0F, 0x07, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x1E, 0x0E, 0x3C, 0x1F, 0xF0, 0x1E, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7C, 0x00, + 0xFE, 0x00, 0x01, 0xF8, 0x07, 0x1C, 0x0E, 0x0E, 0x1E, 0x0F, 0x3C, 0x0F, + 0x3C, 0x0F, 0x78, 0x0F, 0x78, 0x1F, 0xF8, 0x1F, 0xF0, 0x1E, 0xF0, 0x1E, + 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, 0x70, 0x70, 0x39, 0xC0, 0x0E, 0x00, + 0x08, 0x02, 0x3F, 0x04, 0x7F, 0xF8, 0x83, 0xF0, 0x1F, 0xF8, 0x07, 0x9E, + 0x07, 0x8F, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x0E, 0x3C, + 0x1F, 0xF0, 0x1E, 0xF0, 0x1C, 0xF0, 0x3C, 0xF0, 0x3C, 0x78, 0x3C, 0x78, + 0x3C, 0x78, 0x7C, 0x3C, 0xFE, 0x3E, 0x07, 0x91, 0xC7, 0x18, 0x73, 0x82, + 0x38, 0x23, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x01, 0xE0, 0x1E, + 0x40, 0xE4, 0x0E, 0x60, 0xCE, 0x1C, 0x9F, 0x00, 0x7F, 0xFE, 0xE7, 0x9D, + 0x0E, 0x16, 0x3C, 0x20, 0x78, 0x40, 0xE0, 0x01, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0xFF, 0x00, 0x7F, 0x1F, 0x3C, 0x0E, 0x38, 0x04, 0x38, 0x0C, + 0x78, 0x08, 0x78, 0x08, 0x70, 0x08, 0x70, 0x10, 0xF0, 0x10, 0xF0, 0x10, + 0xF0, 0x10, 0xF0, 0x20, 0xF0, 0x20, 0xF0, 0x20, 0xF0, 0x40, 0x78, 0xC0, + 0x3F, 0x00, 0xFF, 0x1F, 0x3C, 0x06, 0x3C, 0x04, 0x3C, 0x08, 0x3C, 0x08, + 0x3C, 0x10, 0x1C, 0x20, 0x1C, 0x20, 0x1E, 0x40, 0x1E, 0x80, 0x1E, 0x80, + 0x1F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x08, 0x00, 0xFE, 0x7C, + 0x79, 0xE1, 0xC1, 0x8F, 0x0E, 0x08, 0x78, 0x70, 0x43, 0xC7, 0x84, 0x1E, + 0x3E, 0x20, 0x72, 0xF2, 0x03, 0x97, 0x90, 0x1D, 0x1D, 0x00, 0xE8, 0xE8, + 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, 0xC1, 0xC0, 0x0E, 0x0E, 0x00, 0x20, + 0x60, 0x01, 0x02, 0x00, 0x1F, 0xCF, 0x83, 0xC1, 0x81, 0xE1, 0x80, 0x71, + 0x80, 0x39, 0x80, 0x1F, 0x80, 0x07, 0x80, 0x03, 0x80, 0x01, 0xE0, 0x01, + 0xF0, 0x00, 0xB8, 0x00, 0x9C, 0x00, 0x8F, 0x00, 0x83, 0x80, 0xC1, 0xC0, + 0xE0, 0xF0, 0xF9, 0xFE, 0x00, 0xFE, 0x7C, 0xE0, 0x63, 0x81, 0x0F, 0x08, + 0x1C, 0x40, 0x71, 0x01, 0xE8, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, + 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0xFF, 0x00, 0x1F, + 0xFE, 0x38, 0x78, 0x60, 0xF1, 0x83, 0xC2, 0x0F, 0x00, 0x1E, 0x00, 0x78, + 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x47, + 0x81, 0x1F, 0x06, 0x3C, 0x3C, 0xFF, 0xF0, 0x07, 0xC1, 0x80, 0xE0, 0x30, + 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x80, 0xC0, 0x30, 0x0C, + 0x07, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, 0xE0, 0xC3, 0x06, 0x18, 0x61, + 0x83, 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x60, 0xC3, 0x0F, 0x81, 0xC0, 0xE0, + 0x60, 0x30, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x81, 0x80, 0xC0, 0x60, + 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x1F, 0x00, 0x0C, 0x07, 0x81, 0xE0, 0xDC, + 0x33, 0x18, 0xC6, 0x1B, 0x06, 0xC0, 0xC0, 0xFF, 0xF0, 0xC7, 0x0C, 0x30, + 0x07, 0x70, 0xCE, 0x1C, 0xE3, 0x8E, 0x70, 0xC7, 0x0C, 0x71, 0xCE, 0x1C, + 0xE1, 0x8E, 0x79, 0xE9, 0xA7, 0x1C, 0x02, 0x07, 0xC0, 0x38, 0x06, 0x01, + 0xC0, 0x38, 0x06, 0x71, 0xF7, 0x38, 0xE7, 0x1C, 0xC3, 0xB8, 0x77, 0x1C, + 0xE3, 0xB8, 0xE7, 0x18, 0xE6, 0x0F, 0x80, 0x07, 0x0C, 0xCE, 0x66, 0x07, + 0x03, 0x83, 0x81, 0xC0, 0xE0, 0x70, 0xBC, 0x87, 0x80, 0x00, 0x08, 0x03, + 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x77, 0x03, 0x3C, 0x18, + 0xE0, 0xE3, 0x87, 0x0E, 0x1C, 0x70, 0x71, 0xC3, 0x87, 0x0E, 0x3C, 0x38, + 0xE8, 0xE5, 0xA1, 0xE7, 0x00, 0x07, 0x0C, 0xCE, 0x66, 0x37, 0x33, 0xBB, + 0xB1, 0xE0, 0xE0, 0x70, 0xB8, 0x87, 0x80, 0x00, 0x38, 0x01, 0xB0, 0x0C, + 0xC0, 0x30, 0x01, 0xC0, 0x07, 0x00, 0x7E, 0x00, 0xE0, 0x03, 0x80, 0x0E, + 0x00, 0x30, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x00, 0xC0, 0x33, 0x00, 0xD8, 0x01, 0xC0, 0x00, 0x03, 0x80, + 0x73, 0xC7, 0x1C, 0x38, 0xE1, 0xCF, 0x06, 0x70, 0x1E, 0x01, 0x00, 0x1C, + 0x00, 0xF8, 0x07, 0xF0, 0xC7, 0x8C, 0x0C, 0x60, 0x63, 0x86, 0x07, 0xE0, + 0x01, 0x00, 0xF8, 0x01, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x31, 0xC3, + 0xBE, 0x1E, 0x70, 0xE3, 0x8F, 0x38, 0x71, 0xC3, 0x8E, 0x1C, 0xE1, 0xC7, + 0x0E, 0x3A, 0x71, 0xD3, 0x0F, 0x00, 0x1C, 0x71, 0xC0, 0x00, 0x6F, 0x8E, + 0x31, 0xC7, 0x18, 0x63, 0x8E, 0xBC, 0xE0, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0x00, 0x00, 0x0F, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x70, 0x0E, 0x01, 0xC0, + 0x38, 0x0E, 0x01, 0xC0, 0x38, 0x06, 0x01, 0xC3, 0x38, 0x6E, 0x07, 0x80, + 0x01, 0x00, 0xF8, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x33, 0xE3, + 0x8C, 0x1C, 0xC0, 0xE4, 0x06, 0x40, 0x7E, 0x03, 0xF0, 0x1D, 0x81, 0xCE, + 0x0E, 0x72, 0x71, 0xA3, 0x8E, 0x00, 0x06, 0x7C, 0x70, 0xE1, 0xC3, 0x0E, + 0x1C, 0x38, 0x61, 0xC3, 0x87, 0x0C, 0x38, 0x72, 0xE9, 0xE0, 0x3C, 0x73, + 0xC7, 0x7D, 0x71, 0xE7, 0x9C, 0xF1, 0xCE, 0x3C, 0xF3, 0x8E, 0x39, 0xC3, + 0x8E, 0x71, 0xC3, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xD7, 0x1C, 0x7B, 0x8E, + 0x1C, 0x3C, 0xF1, 0xD7, 0x1E, 0x73, 0xCE, 0x3C, 0xE3, 0x8E, 0x39, 0xC7, + 0x9C, 0x71, 0xC7, 0x1D, 0x71, 0xEE, 0x1C, 0x0F, 0x06, 0x63, 0x9D, 0xC7, + 0x71, 0xF8, 0x7E, 0x3F, 0x8E, 0xE3, 0xB9, 0xC6, 0x60, 0xF0, 0x0F, 0x38, + 0x1F, 0x70, 0x71, 0xC1, 0xC7, 0x0E, 0x1C, 0x38, 0xF0, 0xE3, 0x83, 0x8E, + 0x1C, 0x70, 0x71, 0xC1, 0xCE, 0x07, 0xE0, 0x38, 0x00, 0xE0, 0x03, 0x80, + 0x3F, 0x00, 0x07, 0x70, 0xCE, 0x18, 0xE3, 0x8E, 0x70, 0xE7, 0x1C, 0xF1, + 0xCE, 0x1C, 0xE3, 0x8E, 0x38, 0xE7, 0x87, 0xB0, 0x07, 0x00, 0x70, 0x0F, + 0x03, 0xF8, 0x0D, 0xDF, 0x71, 0xAC, 0xF0, 0x38, 0x0E, 0x03, 0x81, 0xC0, + 0x70, 0x1C, 0x0E, 0x00, 0x1D, 0x99, 0x8C, 0x46, 0x23, 0x80, 0xE0, 0x70, + 0x1C, 0x06, 0x23, 0x19, 0x17, 0x00, 0x0C, 0x10, 0xE3, 0xF3, 0x86, 0x1C, + 0x38, 0x71, 0xC3, 0x87, 0x0E, 0x9E, 0x38, 0x00, 0xF8, 0xE3, 0x8E, 0x38, + 0xC3, 0x9C, 0x71, 0xC7, 0x18, 0x71, 0x87, 0x38, 0xE3, 0x8E, 0xFA, 0xF3, + 0xAE, 0x3C, 0xF0, 0xDC, 0x33, 0x0C, 0xC2, 0x31, 0x8C, 0xC3, 0x60, 0xF0, + 0x38, 0x0C, 0x02, 0x00, 0xE0, 0x86, 0xE3, 0x0C, 0xC6, 0x19, 0x9C, 0x23, + 0x78, 0xC7, 0xF9, 0x0E, 0x74, 0x1C, 0xF0, 0x31, 0xC0, 0x43, 0x00, 0x84, + 0x00, 0x0E, 0x31, 0xF3, 0x83, 0xA0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, + 0x00, 0xE0, 0x0B, 0x02, 0x5D, 0x3C, 0xF1, 0xC3, 0x00, 0x04, 0x67, 0x8C, + 0x79, 0x87, 0x10, 0xE2, 0x1C, 0x81, 0x90, 0x3A, 0x07, 0x80, 0xF0, 0x1C, + 0x03, 0x00, 0x40, 0x08, 0x32, 0x07, 0x80, 0x3F, 0xCF, 0xE6, 0x30, 0x08, + 0x04, 0x02, 0x01, 0x00, 0xC0, 0x30, 0x1E, 0x0F, 0x98, 0x76, 0x07, 0x00, + 0x01, 0xE0, 0x70, 0x1C, 0x03, 0x80, 0x60, 0x1C, 0x03, 0x80, 0x60, 0x0C, + 0x03, 0x80, 0xF0, 0x3C, 0x07, 0x00, 0x40, 0x0C, 0x01, 0x80, 0x70, 0x0E, + 0x01, 0xC0, 0x30, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, + 0x18, 0x06, 0x01, 0x80, 0xE0, 0x38, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x1F, + 0x07, 0x03, 0x80, 0xE0, 0x30, 0x0C, 0x07, 0x01, 0x80, 0xE0, 0xE0, 0x00, + 0x38, 0x0F, 0xCD, 0x1F, 0x80, 0xE0}; + +const GFXglyph FreeSerifBoldItalic12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 6, 0, 1}, // 0x20 ' ' + {0, 8, 17, 9, 2, -15}, // 0x21 '!' + {17, 9, 7, 13, 4, -15}, // 0x22 '"' + {25, 14, 16, 12, -1, -15}, // 0x23 '#' + {53, 12, 20, 12, 0, -17}, // 0x24 '$' + {83, 18, 18, 20, 1, -16}, // 0x25 '%' + {124, 16, 17, 19, 0, -15}, // 0x26 '&' + {158, 3, 7, 7, 3, -15}, // 0x27 ''' + {161, 7, 21, 8, 1, -15}, // 0x28 '(' + {180, 7, 21, 8, -1, -15}, // 0x29 ')' + {199, 10, 10, 12, 1, -15}, // 0x2A '*' + {212, 12, 12, 14, 1, -11}, // 0x2B '+' + {230, 5, 8, 6, -2, -3}, // 0x2C ',' + {235, 6, 3, 8, 0, -6}, // 0x2D '-' + {238, 4, 4, 6, 0, -2}, // 0x2E '.' + {240, 10, 16, 8, 0, -15}, // 0x2F '/' + {260, 11, 17, 12, 0, -15}, // 0x30 '0' + {284, 10, 17, 12, 0, -15}, // 0x31 '1' + {306, 11, 17, 12, 0, -15}, // 0x32 '2' + {330, 11, 17, 12, 0, -15}, // 0x33 '3' + {354, 13, 16, 12, 0, -15}, // 0x34 '4' + {380, 12, 17, 12, 0, -15}, // 0x35 '5' + {406, 11, 17, 12, 1, -15}, // 0x36 '6' + {430, 11, 16, 12, 2, -15}, // 0x37 '7' + {452, 11, 17, 12, 0, -15}, // 0x38 '8' + {476, 11, 17, 12, 0, -15}, // 0x39 '9' + {500, 7, 12, 6, 0, -10}, // 0x3A ':' + {511, 8, 15, 6, -1, -10}, // 0x3B ';' + {526, 12, 13, 14, 1, -12}, // 0x3C '<' + {546, 12, 6, 14, 2, -8}, // 0x3D '=' + {555, 13, 13, 14, 1, -12}, // 0x3E '>' + {577, 9, 17, 12, 2, -15}, // 0x3F '?' + {597, 17, 16, 20, 1, -15}, // 0x40 '@' + {631, 16, 17, 17, 0, -15}, // 0x41 'A' + {665, 16, 17, 15, 0, -15}, // 0x42 'B' + {699, 15, 17, 15, 1, -15}, // 0x43 'C' + {731, 18, 17, 17, 0, -15}, // 0x44 'D' + {770, 17, 17, 15, 0, -15}, // 0x45 'E' + {807, 16, 17, 15, 0, -15}, // 0x46 'F' + {841, 17, 17, 17, 1, -15}, // 0x47 'G' + {878, 20, 17, 18, 0, -15}, // 0x48 'H' + {921, 10, 17, 9, 0, -15}, // 0x49 'I' + {943, 14, 18, 12, 0, -15}, // 0x4A 'J' + {975, 17, 17, 16, 0, -15}, // 0x4B 'K' + {1012, 15, 17, 15, 0, -15}, // 0x4C 'L' + {1044, 23, 17, 21, 0, -15}, // 0x4D 'M' + {1093, 19, 17, 17, 0, -15}, // 0x4E 'N' + {1134, 16, 17, 16, 1, -15}, // 0x4F 'O' + {1168, 16, 17, 14, 0, -15}, // 0x50 'P' + {1202, 16, 21, 16, 1, -15}, // 0x51 'Q' + {1244, 16, 17, 16, 0, -15}, // 0x52 'R' + {1278, 12, 17, 12, 0, -15}, // 0x53 'S' + {1304, 15, 17, 14, 2, -15}, // 0x54 'T' + {1336, 16, 17, 17, 3, -15}, // 0x55 'U' + {1370, 16, 16, 17, 3, -15}, // 0x56 'V' + {1402, 21, 16, 22, 3, -15}, // 0x57 'W' + {1444, 17, 17, 17, 0, -15}, // 0x58 'X' + {1481, 14, 17, 15, 3, -15}, // 0x59 'Y' + {1511, 15, 17, 13, 0, -15}, // 0x5A 'Z' + {1543, 10, 20, 8, -1, -15}, // 0x5B '[' + {1568, 6, 16, 10, 3, -15}, // 0x5C '\' + {1580, 9, 20, 8, -1, -15}, // 0x5D ']' + {1603, 10, 9, 14, 2, -15}, // 0x5E '^' + {1615, 12, 1, 12, 0, 4}, // 0x5F '_' + {1617, 5, 4, 8, 2, -15}, // 0x60 '`' + {1620, 12, 12, 12, 0, -10}, // 0x61 'a' + {1638, 11, 18, 12, 1, -16}, // 0x62 'b' + {1663, 9, 12, 10, 1, -10}, // 0x63 'c' + {1677, 14, 18, 12, 0, -16}, // 0x64 'd' + {1709, 9, 12, 10, 1, -10}, // 0x65 'e' + {1723, 14, 22, 12, -2, -16}, // 0x66 'f' + {1762, 13, 16, 12, -1, -10}, // 0x67 'g' + {1788, 13, 18, 13, 0, -16}, // 0x68 'h' + {1818, 6, 17, 7, 1, -15}, // 0x69 'i' + {1831, 11, 21, 8, -2, -15}, // 0x6A 'j' + {1860, 13, 18, 12, 0, -16}, // 0x6B 'k' + {1890, 7, 18, 7, 1, -16}, // 0x6C 'l' + {1906, 18, 12, 18, 0, -10}, // 0x6D 'm' + {1933, 12, 12, 13, 0, -10}, // 0x6E 'n' + {1951, 10, 12, 11, 1, -10}, // 0x6F 'o' + {1966, 14, 16, 12, -2, -10}, // 0x70 'p' + {1994, 12, 16, 12, 0, -10}, // 0x71 'q' + {2018, 10, 11, 10, 0, -10}, // 0x72 'r' + {2032, 9, 12, 9, 0, -10}, // 0x73 's' + {2046, 7, 15, 7, 1, -13}, // 0x74 't' + {2060, 12, 12, 13, 1, -10}, // 0x75 'u' + {2078, 10, 11, 11, 1, -10}, // 0x76 'v' + {2092, 15, 11, 16, 1, -10}, // 0x77 'w' + {2113, 13, 12, 11, -1, -10}, // 0x78 'x' + {2133, 11, 16, 10, -1, -10}, // 0x79 'y' + {2155, 10, 13, 10, 0, -10}, // 0x7A 'z' + {2172, 11, 21, 8, 0, -16}, // 0x7B '{' + {2201, 2, 16, 6, 3, -15}, // 0x7C '|' + {2205, 10, 21, 8, -3, -16}, // 0x7D '}' + {2232, 11, 4, 14, 1, -7}}; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic12pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic12pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic12pt7bGlyphs, 0x20, 0x7E, 29}; + +// Approx. 2910 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h new file mode 100644 index 0000000..8e75b24 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h @@ -0,0 +1,502 @@ +#pragma once +#include + +const uint8_t FreeSerifBoldItalic18pt7bBitmaps[] PROGMEM = { + 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x3C, 0x07, + 0x80, 0xE0, 0x1C, 0x03, 0x00, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0x78, 0x00, 0x38, + 0x1D, 0xE0, 0xF7, 0x83, 0xDC, 0x0E, 0x70, 0x39, 0xC0, 0xE6, 0x03, 0x18, + 0x0C, 0x40, 0x23, 0x01, 0x80, 0x00, 0x38, 0x60, 0x07, 0x0E, 0x00, 0x70, + 0xC0, 0x06, 0x1C, 0x00, 0xE1, 0xC0, 0x0E, 0x38, 0x01, 0xC3, 0x81, 0xFF, + 0xFF, 0x1F, 0xFF, 0xE1, 0xFF, 0xFE, 0x03, 0x86, 0x00, 0x30, 0xE0, 0x07, + 0x0E, 0x00, 0x71, 0xC0, 0x0E, 0x1C, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, + 0xFF, 0xF0, 0x1C, 0x30, 0x01, 0x87, 0x00, 0x38, 0x70, 0x03, 0x0E, 0x00, + 0x70, 0xE0, 0x07, 0x0C, 0x00, 0xE1, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x0C, + 0x00, 0x7E, 0x00, 0xFF, 0xC0, 0xF3, 0x70, 0x71, 0x9C, 0x70, 0xC6, 0x38, + 0x43, 0x1C, 0x61, 0x0F, 0x30, 0x87, 0xD8, 0x03, 0xF8, 0x00, 0xFE, 0x00, + 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xDF, 0x10, 0x47, + 0x88, 0x63, 0xCC, 0x31, 0xE6, 0x10, 0xF3, 0x98, 0x71, 0xCC, 0x78, 0x7E, + 0x78, 0x07, 0xF8, 0x03, 0xF0, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x03, 0xC0, + 0x18, 0x01, 0xFE, 0x0F, 0x00, 0x7C, 0xFF, 0xC0, 0x1F, 0x0F, 0x98, 0x07, + 0xC1, 0x06, 0x00, 0xF8, 0x21, 0x80, 0x3E, 0x04, 0x30, 0x07, 0xC1, 0x8C, + 0x00, 0xF0, 0x21, 0x80, 0x1E, 0x0C, 0x60, 0x03, 0xC1, 0x0C, 0x00, 0x78, + 0xC3, 0x03, 0xC7, 0xF8, 0x61, 0xFC, 0x7C, 0x18, 0x7C, 0xC0, 0x06, 0x1F, + 0x08, 0x00, 0xC7, 0xC1, 0x00, 0x30, 0xF0, 0x20, 0x06, 0x3E, 0x04, 0x01, + 0x87, 0xC1, 0x00, 0x30, 0xF0, 0x20, 0x0C, 0x1E, 0x0C, 0x03, 0x03, 0xC1, + 0x00, 0x60, 0x3C, 0xC0, 0x18, 0x07, 0xF8, 0x03, 0x00, 0x7C, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x1E, 0x38, 0x00, 0x0E, 0x0E, 0x00, + 0x0F, 0x07, 0x00, 0x07, 0x83, 0x80, 0x03, 0xC3, 0x80, 0x01, 0xE3, 0x80, + 0x00, 0xF7, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7F, 0x0F, + 0xF0, 0xE7, 0x81, 0xE0, 0xE3, 0xE0, 0xE0, 0xE1, 0xF0, 0x60, 0xE0, 0x7C, + 0x60, 0xF0, 0x3E, 0x20, 0x78, 0x1F, 0xB0, 0x3C, 0x07, 0xF0, 0x1F, 0x03, + 0xF0, 0x0F, 0x80, 0xFC, 0x03, 0xF0, 0x7F, 0x8D, 0xFF, 0xEF, 0xFC, 0x7F, + 0xE3, 0xFC, 0x0F, 0xC0, 0x78, 0x00, 0x3B, 0xDE, 0xE7, 0x39, 0x8C, 0x46, + 0x00, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1C, 0x07, 0x01, 0xE0, + 0x38, 0x0F, 0x01, 0xC0, 0x38, 0x0F, 0x01, 0xE0, 0x38, 0x07, 0x00, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x06, + 0x00, 0xC0, 0x08, 0x00, 0x80, 0x10, 0x00, 0x06, 0x00, 0x40, 0x04, 0x00, + 0x80, 0x18, 0x01, 0x00, 0x30, 0x06, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x70, + 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x01, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x3C, + 0x07, 0x00, 0xE0, 0x38, 0x06, 0x01, 0xC0, 0x70, 0x18, 0x06, 0x01, 0x80, + 0x00, 0x07, 0x00, 0x38, 0x01, 0xC1, 0x8E, 0x3E, 0x23, 0xF9, 0x3F, 0xEB, + 0xE0, 0xE0, 0xFF, 0xF7, 0x93, 0xF8, 0x9F, 0x8E, 0x60, 0x70, 0x03, 0x80, + 0x08, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, + 0x00, 0x0E, 0x00, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, + 0x01, 0xC0, 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xE1, 0xC3, 0x0C, 0x30, 0xC2, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x7B, 0xFF, 0xFF, 0x78, 0x00, 0x1C, + 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, + 0x01, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70, + 0x03, 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x07, 0x30, 0x1C, 0x30, + 0x78, 0x60, 0xE0, 0xE3, 0xC1, 0xCF, 0x83, 0x9E, 0x0F, 0x3C, 0x1E, 0xF8, + 0x3D, 0xE0, 0x7B, 0xC1, 0xFF, 0x83, 0xFF, 0x07, 0xBC, 0x0F, 0x78, 0x3E, + 0xF0, 0x7D, 0xE0, 0xF3, 0x81, 0xE7, 0x07, 0x8E, 0x0F, 0x0C, 0x3C, 0x18, + 0x70, 0x19, 0xC0, 0x1E, 0x00, 0x00, 0x06, 0x01, 0xF8, 0x1F, 0xF0, 0x03, + 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, + 0x07, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xE0, 0x07, + 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, + 0x0F, 0xC0, 0xFF, 0xF0, 0x00, 0xF8, 0x01, 0xFC, 0x03, 0xFE, 0x06, 0x3F, + 0x08, 0x1F, 0x18, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xC0, + 0x01, 0x80, 0x03, 0x00, 0x06, 0x02, 0x0C, 0x06, 0x08, 0x0C, 0x1F, 0xFC, + 0x3F, 0xFC, 0x7F, 0xF8, 0xFF, 0xF8, 0x00, 0xF0, 0x07, 0xF8, 0x1F, 0xF0, + 0x61, 0xF0, 0x81, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x3C, 0x00, + 0xE0, 0x07, 0xC0, 0x3F, 0xC0, 0x1F, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x1E, + 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x9C, 0x0E, 0x3C, + 0x38, 0x7F, 0xE0, 0x7E, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x3C, + 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x02, 0xF8, 0x01, 0x3C, 0x00, + 0x9F, 0x00, 0x47, 0xC0, 0x31, 0xE0, 0x18, 0x78, 0x0C, 0x3E, 0x06, 0x0F, + 0x83, 0x03, 0xC1, 0x80, 0xF0, 0x7F, 0xFF, 0x1F, 0xFF, 0xCF, 0xFF, 0xF0, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01, + 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x60, 0x00, 0x30, 0x00, + 0x10, 0x00, 0x1F, 0x00, 0x0F, 0xE0, 0x0F, 0xF8, 0x07, 0xFE, 0x00, 0x3F, + 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1C, 0x00, + 0x0E, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, 0x87, 0x83, 0x83, 0xE3, 0x81, + 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0F, 0x80, 0x1F, 0x00, + 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, + 0x1F, 0xF0, 0x1F, 0xFE, 0x0F, 0xCF, 0x07, 0xC3, 0xC7, 0xE1, 0xE3, 0xE0, + 0xF1, 0xF0, 0x78, 0xF8, 0x3C, 0x78, 0x3E, 0x3C, 0x1F, 0x1E, 0x0F, 0x0F, + 0x0F, 0x83, 0x87, 0x81, 0xE7, 0x80, 0x7F, 0x80, 0x0F, 0x80, 0x00, 0x3F, + 0xFF, 0x3F, 0xFE, 0x3F, 0xFE, 0x7F, 0xFC, 0x60, 0x1C, 0x80, 0x38, 0x80, + 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0x03, + 0x80, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x1C, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x00, + 0xF8, 0x00, 0xFF, 0x00, 0xE1, 0xC0, 0xE0, 0xF0, 0xF0, 0x38, 0x78, 0x1C, + 0x3C, 0x0E, 0x1F, 0x07, 0x0F, 0x87, 0x07, 0xE7, 0x01, 0xFF, 0x00, 0x7E, + 0x00, 0x1F, 0x80, 0x3F, 0xE0, 0x73, 0xF0, 0x70, 0xFC, 0x70, 0x3E, 0x70, + 0x0F, 0x38, 0x07, 0x9C, 0x03, 0xCE, 0x01, 0xE7, 0x00, 0xE1, 0xC0, 0xE0, + 0x70, 0xE0, 0x0F, 0xC0, 0x00, 0x00, 0xF8, 0x01, 0xFF, 0x01, 0xF3, 0xC1, + 0xF0, 0xE1, 0xF0, 0x70, 0xF0, 0x3C, 0xF8, 0x1E, 0x7C, 0x0F, 0x3C, 0x0F, + 0x9E, 0x07, 0xCF, 0x03, 0xE7, 0x83, 0xF3, 0xC1, 0xF0, 0xF1, 0xF8, 0x3F, + 0xF8, 0x0F, 0xFC, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, + 0x3C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x07, + 0x83, 0xF0, 0xFC, 0x3F, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0x3F, 0x0F, 0xC3, 0xF0, 0x78, 0x00, 0x03, 0xC0, 0xFC, + 0x1F, 0x83, 0xF0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x03, 0xC0, 0x7C, 0x0F, 0x80, 0xF0, 0x0E, 0x01, 0x80, 0x30, 0x0C, + 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x7C, 0x00, + 0x7F, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, + 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x04, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, + 0x38, 0x00, 0x0F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xFC, 0x00, + 0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFC, 0x03, 0xFC, 0x00, 0xFC, 0x00, + 0x3C, 0x00, 0x08, 0x00, 0x00, 0x07, 0xC0, 0xFF, 0x0E, 0x3C, 0x70, 0xF3, + 0xC7, 0x8C, 0x3C, 0x01, 0xE0, 0x1F, 0x00, 0xF0, 0x07, 0x80, 0x78, 0x07, + 0x80, 0x30, 0x03, 0x00, 0x10, 0x01, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0x78, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0xFF, 0xF8, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x03, 0x81, 0xC0, + 0x00, 0xE1, 0xC0, 0x18, 0x38, 0xE0, 0x3F, 0xCC, 0xE0, 0x3C, 0xE7, 0x70, + 0x3C, 0x71, 0xF0, 0x1C, 0x30, 0xF8, 0x1E, 0x38, 0x7C, 0x0E, 0x1C, 0x3E, + 0x0F, 0x0E, 0x1F, 0x07, 0x0E, 0x0F, 0x83, 0x87, 0x0D, 0xC1, 0xC7, 0x86, + 0x70, 0xE5, 0xC6, 0x38, 0x7C, 0xFE, 0x1C, 0x1C, 0x3E, 0x07, 0x00, 0x00, + 0x01, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x40, 0x1F, 0x00, 0xE0, 0x03, 0xFF, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, + 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x17, 0xC0, 0x00, 0x67, 0x80, 0x00, 0x8F, + 0x00, 0x03, 0x1F, 0x00, 0x0C, 0x3E, 0x00, 0x10, 0x7C, 0x00, 0x60, 0xF8, + 0x00, 0x81, 0xF0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x18, 0x07, 0xC0, + 0x60, 0x0F, 0x81, 0xC0, 0x1F, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x7C, 0x3C, + 0x00, 0xFC, 0xFE, 0x0F, 0xFE, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x01, + 0xF8, 0x7E, 0x01, 0xF8, 0x3F, 0x01, 0xF0, 0x3F, 0x01, 0xF0, 0x3F, 0x01, + 0xF0, 0x3F, 0x03, 0xE0, 0x3F, 0x03, 0xE0, 0x7E, 0x03, 0xE0, 0xFC, 0x03, + 0xE3, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xC3, 0xE0, 0x07, 0xC1, 0xF8, 0x0F, + 0xC0, 0xF8, 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFC, 0x1F, + 0x80, 0xFC, 0x1F, 0x01, 0xFC, 0x1F, 0x01, 0xF8, 0x1F, 0x03, 0xF0, 0x3F, + 0x0F, 0xE0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0x82, 0x01, + 0xFF, 0xE8, 0x07, 0xE0, 0xF0, 0x3F, 0x80, 0xE0, 0xFE, 0x00, 0xC1, 0xF8, + 0x01, 0x87, 0xE0, 0x02, 0x1F, 0x80, 0x04, 0x3F, 0x00, 0x00, 0xFC, 0x00, + 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, + 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, + 0xF0, 0x00, 0x03, 0xE0, 0x01, 0x07, 0xE0, 0x06, 0x07, 0xE0, 0x18, 0x07, + 0xE0, 0xE0, 0x07, 0xFF, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x01, + 0xFF, 0xFE, 0x00, 0x1F, 0x87, 0xE0, 0x07, 0xE0, 0x7C, 0x01, 0xF0, 0x1F, + 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x0F, 0x80, 0x3F, 0x03, 0xE0, + 0x0F, 0xC0, 0xF8, 0x03, 0xF0, 0x3E, 0x00, 0xFC, 0x1F, 0x00, 0x3F, 0x07, + 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xF0, 0xFC, 0x01, 0xF8, 0x3E, 0x00, 0x7E, + 0x0F, 0x80, 0x3F, 0x83, 0xE0, 0x0F, 0xC1, 0xF8, 0x07, 0xF0, 0x7C, 0x01, + 0xF8, 0x1F, 0x00, 0xFC, 0x07, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x01, 0xFF, + 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFC, + 0x07, 0xE0, 0x78, 0x0F, 0xC0, 0x60, 0x1F, 0x00, 0x40, 0x3E, 0x00, 0x80, + 0x7C, 0x01, 0x01, 0xF8, 0x10, 0x03, 0xE0, 0x60, 0x07, 0xC3, 0x80, 0x0F, + 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x7C, 0x38, 0x00, 0xF8, 0x30, 0x03, 0xF0, + 0x60, 0x07, 0xC0, 0x80, 0x0F, 0x81, 0x00, 0x1F, 0x00, 0x10, 0x7E, 0x00, + 0x60, 0xF8, 0x01, 0xC1, 0xF0, 0x07, 0x03, 0xE0, 0x1E, 0x0F, 0xC0, 0xFC, + 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFC, + 0x07, 0xE0, 0x78, 0x0F, 0xC0, 0x60, 0x1F, 0x00, 0x40, 0x3E, 0x00, 0x80, + 0x7C, 0x01, 0x01, 0xF8, 0x20, 0x03, 0xE0, 0xC0, 0x07, 0xC3, 0x80, 0x0F, + 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7C, 0x38, 0x00, 0xF8, 0x30, 0x03, 0xF0, + 0x60, 0x07, 0xC0, 0x80, 0x0F, 0x81, 0x00, 0x1F, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0xFF, 0xF6, + 0x01, 0xF8, 0x3C, 0x03, 0xE0, 0x1C, 0x0F, 0xC0, 0x0C, 0x0F, 0xC0, 0x08, + 0x1F, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFC, 0x03, 0xFF, + 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0xF8, 0xFC, 0x00, 0xF8, 0xFC, 0x00, 0xF8, + 0xFC, 0x00, 0xF0, 0x7C, 0x01, 0xF0, 0x7E, 0x01, 0xF0, 0x3E, 0x01, 0xF0, + 0x1F, 0x83, 0xE0, 0x0F, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x3F, + 0xF8, 0x0F, 0xE0, 0x7F, 0x00, 0x7E, 0x01, 0xF8, 0x03, 0xF0, 0x0F, 0x80, + 0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x07, 0xE0, 0x07, 0xC0, 0x3E, 0x00, 0x7E, + 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x00, 0xF8, 0x07, + 0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF0, 0x03, 0xE0, 0x1F, 0x00, + 0x3F, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x7E, 0x00, 0x7C, + 0x03, 0xE0, 0x07, 0xE0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x01, 0xF0, 0x0F, + 0xC0, 0x0F, 0x80, 0x7C, 0x00, 0xFC, 0x03, 0xE0, 0x0F, 0xE0, 0x3F, 0x80, + 0xFF, 0xC7, 0xFF, 0x00, 0x07, 0xFE, 0x03, 0xF8, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, + 0x80, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80, + 0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x3F, + 0x80, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x01, 0xFE, 0x00, 0x0F, 0xC0, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF0, 0x00, + 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, + 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x61, 0xF0, + 0x0F, 0x3F, 0x00, 0xE7, 0xE0, 0x07, 0xFC, 0x00, 0x3F, 0x00, 0x00, 0x07, + 0xFF, 0x3F, 0x80, 0xFE, 0x07, 0x80, 0x7E, 0x03, 0x00, 0x3F, 0x03, 0x00, + 0x1F, 0x03, 0x00, 0x0F, 0x83, 0x00, 0x07, 0xC3, 0x00, 0x07, 0xE3, 0x00, + 0x03, 0xE3, 0x00, 0x01, 0xF3, 0x00, 0x00, 0xFB, 0x80, 0x00, 0xFB, 0xC0, + 0x00, 0x7F, 0xE0, 0x00, 0x3E, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x1F, + 0x00, 0x0F, 0x8F, 0x80, 0x07, 0xC7, 0xE0, 0x07, 0xE1, 0xF0, 0x03, 0xE0, + 0xFC, 0x01, 0xF0, 0x3E, 0x00, 0xF8, 0x1F, 0x00, 0xFC, 0x07, 0xC0, 0xFE, + 0x07, 0xF0, 0xFF, 0xCF, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x07, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, + 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, + 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x03, + 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x11, 0xF0, 0x00, 0xC7, 0xC0, + 0x06, 0x1F, 0x00, 0x38, 0x7C, 0x01, 0xE3, 0xF0, 0x3F, 0x9F, 0xFF, 0xFC, + 0xFF, 0xFF, 0xF0, 0x07, 0xF8, 0x00, 0x7F, 0x80, 0xFC, 0x00, 0x3F, 0x80, + 0x3E, 0x00, 0x3F, 0x80, 0x1F, 0x00, 0x3F, 0x80, 0x1F, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x1B, 0xE0, 0x07, 0xF0, 0x0D, 0xF0, 0x02, 0xF8, 0x0D, 0xF0, + 0x03, 0x7C, 0x0C, 0xF8, 0x01, 0xBE, 0x06, 0x7C, 0x00, 0xDF, 0x06, 0x7C, + 0x00, 0xCF, 0x83, 0x3E, 0x00, 0x67, 0xC3, 0x1F, 0x00, 0x31, 0xE3, 0x0F, + 0x80, 0x38, 0xF9, 0x8F, 0x80, 0x18, 0x7D, 0x87, 0xC0, 0x0C, 0x3F, 0x83, + 0xE0, 0x06, 0x1F, 0xC1, 0xF0, 0x06, 0x0F, 0xC1, 0xF0, 0x03, 0x07, 0xC0, + 0xF8, 0x01, 0x83, 0xE0, 0x7C, 0x01, 0xC0, 0xE0, 0x7E, 0x00, 0xE0, 0x70, + 0x3F, 0x00, 0xF8, 0x30, 0x3F, 0x80, 0xFF, 0x10, 0x7F, 0xF0, 0x00, 0x07, + 0xF0, 0x0F, 0xE0, 0x3E, 0x00, 0x78, 0x07, 0xE0, 0x06, 0x00, 0x7C, 0x00, + 0xC0, 0x1F, 0xC0, 0x10, 0x03, 0xF8, 0x06, 0x00, 0x6F, 0x80, 0xC0, 0x19, + 0xF0, 0x10, 0x03, 0x3F, 0x02, 0x00, 0x63, 0xE0, 0xC0, 0x0C, 0x7C, 0x18, + 0x03, 0x07, 0xC2, 0x00, 0x60, 0xF8, 0x40, 0x0C, 0x0F, 0x98, 0x03, 0x81, + 0xF3, 0x00, 0x60, 0x3F, 0x40, 0x0C, 0x03, 0xF8, 0x01, 0x80, 0x7F, 0x00, + 0x60, 0x07, 0xC0, 0x0C, 0x00, 0xF8, 0x01, 0x80, 0x0F, 0x00, 0x70, 0x01, + 0xE0, 0x0E, 0x00, 0x18, 0x03, 0xE0, 0x03, 0x00, 0x02, 0x00, 0x60, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xC0, 0x07, 0xC3, 0xE0, 0x1F, 0x03, 0xC0, + 0x7C, 0x03, 0xC1, 0xF0, 0x07, 0x87, 0xE0, 0x0F, 0x8F, 0x80, 0x1F, 0x3F, + 0x00, 0x3E, 0x7C, 0x00, 0x7D, 0xF8, 0x01, 0xFB, 0xE0, 0x03, 0xF7, 0xC0, + 0x07, 0xDF, 0x80, 0x1F, 0xBF, 0x00, 0x3F, 0x7C, 0x00, 0x7C, 0xF8, 0x01, + 0xF9, 0xF0, 0x03, 0xE3, 0xE0, 0x0F, 0xC7, 0xC0, 0x1F, 0x07, 0x80, 0x7C, + 0x0F, 0x81, 0xF0, 0x0F, 0x87, 0xC0, 0x0F, 0xFE, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x07, 0xE3, 0xF0, 0x0F, 0x83, 0xE0, + 0x1F, 0x07, 0xE0, 0x3E, 0x0F, 0xC0, 0x7C, 0x1F, 0x81, 0xF0, 0x3F, 0x03, + 0xE0, 0xFE, 0x07, 0xC1, 0xF8, 0x0F, 0x87, 0xF0, 0x3E, 0x1F, 0xC0, 0x7F, + 0xFE, 0x00, 0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, + 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, + 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xC0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xC0, 0x07, 0xC3, 0xE0, 0x1F, 0x03, 0xC0, + 0x7C, 0x03, 0xC1, 0xF0, 0x07, 0x87, 0xE0, 0x0F, 0x8F, 0x80, 0x1F, 0x3F, + 0x00, 0x3E, 0x7C, 0x00, 0x7D, 0xF8, 0x01, 0xFB, 0xF0, 0x03, 0xF7, 0xC0, + 0x07, 0xDF, 0x80, 0x0F, 0xBF, 0x00, 0x3F, 0x7C, 0x00, 0x7C, 0xF8, 0x01, + 0xF9, 0xF0, 0x03, 0xE3, 0xE0, 0x07, 0xC7, 0xC0, 0x1F, 0x07, 0x80, 0x7C, + 0x0F, 0x01, 0xF0, 0x0F, 0x07, 0x80, 0x07, 0xFE, 0x00, 0x03, 0x80, 0x00, + 0x0C, 0x00, 0x00, 0x3C, 0x00, 0x20, 0xFF, 0xC1, 0x87, 0xFF, 0xFE, 0x1E, + 0xFF, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, + 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF0, 0x3F, + 0x01, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xE0, 0x7E, 0x03, 0xE0, 0xFE, + 0x03, 0xE1, 0xF8, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xDF, 0xC0, + 0x0F, 0xCF, 0xC0, 0x0F, 0xCF, 0xC0, 0x0F, 0x8F, 0xE0, 0x0F, 0x87, 0xE0, + 0x1F, 0x87, 0xE0, 0x1F, 0x03, 0xF0, 0x1F, 0x03, 0xF0, 0x1F, 0x03, 0xF0, + 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0xFF, 0xE1, 0xFE, 0x00, 0xF8, 0x40, + 0xFF, 0xB0, 0x38, 0x3C, 0x1C, 0x07, 0x0F, 0x01, 0xC3, 0xC0, 0x20, 0xF0, + 0x08, 0x3E, 0x02, 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, + 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x00, + 0x03, 0xC4, 0x00, 0xF1, 0x00, 0x3C, 0x60, 0x0F, 0x38, 0x07, 0x8F, 0x83, + 0xC2, 0x3F, 0xE0, 0x83, 0xF0, 0x00, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xCF, + 0x1F, 0x1E, 0x70, 0xF8, 0x77, 0x0F, 0x83, 0x30, 0x7C, 0x09, 0x03, 0xE0, + 0x40, 0x3F, 0x02, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, + 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, + 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0xFF, 0xF0, 0x00, + 0x7F, 0xF0, 0xFF, 0x1F, 0xC0, 0x3E, 0x1F, 0x80, 0x1C, 0x1F, 0x80, 0x18, + 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x30, 0x3F, 0x00, 0x30, + 0x3E, 0x00, 0x30, 0x3E, 0x00, 0x30, 0x7E, 0x00, 0x60, 0x7C, 0x00, 0x60, + 0x7C, 0x00, 0x60, 0x7C, 0x00, 0xC0, 0x7C, 0x00, 0xC0, 0xF8, 0x00, 0xC0, + 0xF8, 0x00, 0xC0, 0xF8, 0x01, 0x80, 0xF8, 0x01, 0x80, 0xF8, 0x03, 0x80, + 0xF8, 0x03, 0x00, 0x7C, 0x06, 0x00, 0x7E, 0x1E, 0x00, 0x3F, 0xF8, 0x00, + 0x0F, 0xE0, 0x00, 0xFF, 0xE0, 0x7F, 0x3F, 0x80, 0x1C, 0x1F, 0x80, 0x18, + 0x1F, 0x80, 0x18, 0x1F, 0x80, 0x30, 0x1F, 0x80, 0x30, 0x0F, 0x80, 0x60, + 0x0F, 0x80, 0x40, 0x0F, 0x80, 0xC0, 0x0F, 0x81, 0x80, 0x0F, 0x81, 0x00, + 0x0F, 0xC3, 0x00, 0x0F, 0xC6, 0x00, 0x07, 0xC6, 0x00, 0x07, 0xCC, 0x00, + 0x07, 0xC8, 0x00, 0x07, 0xD8, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0x80, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0xFF, 0xCF, 0xF8, 0x7E, 0x7F, 0x07, + 0xE0, 0x38, 0x7C, 0x07, 0x80, 0x60, 0xF8, 0x0F, 0x00, 0x81, 0xF0, 0x1E, + 0x03, 0x03, 0xE0, 0x3E, 0x04, 0x07, 0xE0, 0xFC, 0x18, 0x07, 0xC1, 0xF8, + 0x20, 0x0F, 0x87, 0xF0, 0xC0, 0x1F, 0x0B, 0xE1, 0x00, 0x3E, 0x37, 0xC6, + 0x00, 0x7C, 0x47, 0x88, 0x00, 0xF9, 0x8F, 0x30, 0x01, 0xF2, 0x1F, 0x40, + 0x03, 0xEC, 0x3E, 0x80, 0x03, 0xF0, 0x7F, 0x00, 0x07, 0xE0, 0xFC, 0x00, + 0x0F, 0x81, 0xF8, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x3C, 0x07, 0xC0, 0x00, + 0x78, 0x07, 0x00, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x01, + 0x80, 0x30, 0x00, 0x02, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x3F, 0x81, 0xFC, + 0x07, 0x80, 0x7C, 0x03, 0x00, 0x3F, 0x03, 0x00, 0x0F, 0x83, 0x80, 0x07, + 0xC1, 0x80, 0x03, 0xE1, 0x80, 0x00, 0xF9, 0x80, 0x00, 0x7D, 0x80, 0x00, + 0x3F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, + 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xBE, 0x00, 0x00, 0xCF, 0x00, + 0x00, 0xC7, 0xC0, 0x00, 0xC3, 0xE0, 0x00, 0xC1, 0xF0, 0x00, 0xC0, 0x7C, + 0x00, 0xE0, 0x3E, 0x00, 0xE0, 0x1F, 0x00, 0xF8, 0x1F, 0xE0, 0xFF, 0x1F, + 0xF8, 0x00, 0xFF, 0xC3, 0xF9, 0xF8, 0x07, 0x87, 0xC0, 0x38, 0x3E, 0x01, + 0x81, 0xF0, 0x18, 0x07, 0xC0, 0x80, 0x3E, 0x0C, 0x01, 0xF0, 0xC0, 0x07, + 0xC4, 0x00, 0x3E, 0x60, 0x01, 0xF6, 0x00, 0x07, 0xA0, 0x00, 0x3F, 0x00, + 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, + 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, + 0x7E, 0x00, 0x07, 0xF0, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x3F, + 0xFF, 0xC3, 0xE0, 0x7E, 0x1C, 0x07, 0xE0, 0xC0, 0x3E, 0x0C, 0x03, 0xF0, + 0x40, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, + 0x80, 0x00, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, + 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x83, 0xE0, 0x0C, 0x3F, 0x00, + 0xC3, 0xF0, 0x0E, 0x1F, 0x00, 0xF1, 0xF8, 0x1F, 0x9F, 0xFF, 0xF8, 0xFF, + 0xFF, 0xC0, 0x01, 0xFC, 0x0F, 0xE0, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x1E, + 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, + 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xFF, 0x03, 0xF8, 0x00, 0xE0, 0x38, 0x07, 0x01, 0xC0, + 0x70, 0x0C, 0x03, 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x03, + 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x03, 0x80, 0xE0, 0x38, + 0x07, 0x01, 0xC0, 0x03, 0xFC, 0x0F, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0x38, + 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00, 0x3C, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x00, 0x1C, + 0x00, 0xF0, 0x03, 0xC0, 0xFE, 0x03, 0xF8, 0x00, 0x03, 0xC0, 0x03, 0xC0, + 0x07, 0xE0, 0x07, 0xE0, 0x0E, 0x70, 0x0E, 0x70, 0x1C, 0x78, 0x1C, 0x38, + 0x3C, 0x3C, 0x38, 0x1C, 0x78, 0x1E, 0x70, 0x0E, 0xF0, 0x0E, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE1, 0xE3, 0xC1, 0xC1, 0xC0, 0xC0, 0x00, + 0xF7, 0x80, 0xFD, 0xE0, 0x7C, 0xF0, 0x3C, 0x3C, 0x1E, 0x0F, 0x0F, 0x83, + 0x83, 0xC1, 0xE1, 0xE0, 0x78, 0x78, 0x1C, 0x3E, 0x0F, 0x0F, 0x03, 0xC3, + 0xC1, 0xF0, 0xF0, 0xFC, 0xFE, 0x6F, 0x6F, 0xF3, 0xF1, 0xF8, 0xF8, 0x3C, + 0x1C, 0x00, 0x01, 0xE0, 0x1F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x07, 0x80, + 0x07, 0x80, 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x3C, 0x1E, 0xFE, + 0x1F, 0x9F, 0x1F, 0x0F, 0x1E, 0x0F, 0x3E, 0x0F, 0x3C, 0x0F, 0x3C, 0x1F, + 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x78, 0x3C, 0xF0, 0x78, 0xF0, 0xF0, + 0xF1, 0xE0, 0x7F, 0xC0, 0x3F, 0x00, 0x01, 0xF0, 0x3F, 0xC3, 0xCE, 0x3C, + 0xF3, 0xC7, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x03, 0x78, 0x31, 0xE3, 0x0F, 0xF0, 0x1E, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x0F, + 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x01, 0xEF, 0x00, 0x7F, 0xE0, 0x3E, 0x7C, + 0x07, 0x8F, 0x01, 0xE1, 0xE0, 0x78, 0x3C, 0x0F, 0x0F, 0x83, 0xC1, 0xE0, + 0x78, 0x3C, 0x1E, 0x0F, 0x83, 0xC1, 0xF0, 0x78, 0x7C, 0x0F, 0x0F, 0x91, + 0xE3, 0xF6, 0x3F, 0xDF, 0x83, 0xF3, 0xE0, 0x3C, 0x38, 0x00, 0x01, 0xE0, + 0x3F, 0x83, 0xCE, 0x3C, 0x73, 0xC3, 0x9E, 0x1D, 0xE1, 0xCF, 0x1C, 0xFB, + 0xC7, 0xF8, 0x3C, 0x01, 0xE0, 0x0F, 0x02, 0x78, 0x31, 0xE3, 0x0F, 0xF0, + 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x1D, 0xC0, 0x01, 0xCE, 0x00, 0x1C, + 0x70, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, + 0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, + 0x00, 0x0F, 0x00, 0x0E, 0x70, 0x00, 0x77, 0x80, 0x03, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xFC, 0x1F, 0x1F, 0x87, 0xC3, 0xC1, + 0xF0, 0x78, 0x3C, 0x1F, 0x07, 0x83, 0xE0, 0xF0, 0xF8, 0x0E, 0x3E, 0x01, + 0xFF, 0x80, 0x3F, 0xC0, 0x0C, 0x00, 0x03, 0xC0, 0x00, 0x7F, 0x80, 0x0F, + 0xFE, 0x00, 0x7F, 0xF0, 0x70, 0xFF, 0x1C, 0x03, 0xE3, 0x80, 0x3C, 0x70, + 0x07, 0x0F, 0x03, 0xE0, 0xFF, 0xF0, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x03, + 0xE0, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, + 0x1F, 0x00, 0x0F, 0x0E, 0x07, 0x9F, 0x83, 0xDF, 0xC3, 0xE9, 0xE1, 0xE8, + 0xF0, 0xF8, 0xF8, 0x7C, 0x78, 0x7C, 0x3C, 0x3E, 0x3E, 0x1E, 0x1E, 0x1F, + 0x0F, 0x0F, 0x0F, 0x87, 0x87, 0xCB, 0xC3, 0xCB, 0xE1, 0xE9, 0xE0, 0xFC, + 0xF0, 0x38, 0x00, 0x03, 0x03, 0xC1, 0xE0, 0xF0, 0x30, 0x00, 0x00, 0x00, + 0x07, 0x3F, 0x87, 0x83, 0xC1, 0xE0, 0xF0, 0xF0, 0x78, 0x3C, 0x1E, 0x1E, + 0x0F, 0x27, 0x17, 0x93, 0xF1, 0xF8, 0x70, 0x00, 0x00, 0x06, 0x00, 0x0F, + 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0xFE, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, + 0x00, 0x7C, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF8, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, + 0x03, 0xC0, 0xE3, 0xC0, 0xE7, 0x80, 0xFF, 0x00, 0x7C, 0x00, 0x1F, 0xC0, + 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, + 0x00, 0x1F, 0x00, 0x0F, 0x3F, 0x87, 0x87, 0x83, 0xC3, 0x03, 0xE3, 0x01, + 0xE3, 0x00, 0xF3, 0x00, 0x7B, 0x80, 0x7B, 0xC0, 0x3F, 0xE0, 0x1E, 0xF0, + 0x1F, 0x78, 0x0F, 0x1E, 0x07, 0x8F, 0x13, 0xC7, 0x93, 0xE1, 0xF9, 0xE0, + 0xF8, 0xF0, 0x38, 0x00, 0x1F, 0xC0, 0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x1F, + 0x03, 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, + 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x8F, 0x31, 0xEC, 0x3F, 0x07, + 0xC0, 0x70, 0x00, 0x01, 0x87, 0x07, 0x0F, 0xE7, 0xE7, 0xE0, 0xF3, 0xF9, + 0xF8, 0x3D, 0x9E, 0x9E, 0x0F, 0x47, 0xC7, 0x83, 0xE1, 0xD1, 0xE1, 0xF8, + 0xF8, 0xF0, 0x7C, 0x3C, 0x3C, 0x1F, 0x0F, 0x1F, 0x0F, 0x87, 0xC7, 0x83, + 0xE1, 0xE1, 0xE0, 0xF0, 0x78, 0x78, 0x3C, 0x1E, 0x3C, 0x1F, 0x0F, 0x0F, + 0x27, 0x83, 0xC3, 0xD1, 0xE0, 0xF0, 0xFC, 0xF8, 0x78, 0x1C, 0x00, 0x01, + 0x8F, 0x0F, 0xE7, 0xE0, 0xF3, 0xF8, 0x3C, 0x9E, 0x0F, 0x47, 0x87, 0xA3, + 0xC1, 0xE8, 0xF0, 0x7C, 0x3C, 0x1E, 0x1E, 0x0F, 0x87, 0x83, 0xE1, 0xE0, + 0xF0, 0xF8, 0x3C, 0x3C, 0x1F, 0x0F, 0x27, 0x83, 0xD1, 0xE0, 0xFC, 0x78, + 0x1C, 0x00, 0x01, 0xF0, 0x0E, 0x30, 0x38, 0x70, 0xF0, 0xF3, 0xC1, 0xE7, + 0x83, 0xDE, 0x07, 0xBC, 0x1F, 0xF8, 0x3F, 0xE0, 0x7B, 0xC0, 0xF7, 0x83, + 0xCF, 0x07, 0x9E, 0x1E, 0x1C, 0x38, 0x1C, 0xE0, 0x1F, 0x00, 0x00, 0xE3, + 0x80, 0xFD, 0xF8, 0x0F, 0xFF, 0x81, 0xE8, 0xF0, 0x3E, 0x1E, 0x07, 0x83, + 0xC0, 0xF0, 0x78, 0x3E, 0x1F, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x1E, 0x1F, + 0x07, 0x83, 0xC0, 0xF0, 0xF8, 0x1E, 0x1E, 0x03, 0xC7, 0x80, 0xFF, 0xE0, + 0x1E, 0xF0, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, + 0xF8, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xEF, 0x07, 0xFF, 0x0F, 0x1E, 0x1E, + 0x1E, 0x1E, 0x1E, 0x3C, 0x1E, 0x7C, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xF0, + 0x7C, 0xF0, 0x78, 0xF0, 0xF8, 0xF0, 0xF8, 0xF1, 0xF0, 0xFE, 0xF0, 0x7E, + 0xF0, 0x39, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, + 0xC0, 0x1F, 0xF8, 0x03, 0x9C, 0x7F, 0x7C, 0x3D, 0xF8, 0x7A, 0xE0, 0xF8, + 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF0, 0x01, + 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0x07, 0x18, 0xFF, + 0xC7, 0x1C, 0x70, 0x63, 0x81, 0x1E, 0x08, 0xF8, 0x07, 0xE0, 0x1F, 0x00, + 0x7C, 0x01, 0xF0, 0x07, 0x84, 0x3C, 0x20, 0xE1, 0x87, 0x1C, 0x70, 0x9E, + 0x00, 0x00, 0x80, 0x60, 0x30, 0x1C, 0x1F, 0x1F, 0xF7, 0xFC, 0x78, 0x1E, + 0x07, 0x83, 0xC0, 0xF0, 0x3C, 0x1F, 0x07, 0x81, 0xE0, 0x79, 0x3C, 0x4F, + 0x23, 0xF0, 0xFC, 0x1C, 0x00, 0x0F, 0x0F, 0x3F, 0x87, 0x8F, 0x83, 0xC7, + 0xC1, 0xE3, 0xE1, 0xE1, 0xE0, 0xF0, 0xF0, 0x78, 0xF8, 0x78, 0x78, 0x3C, + 0x3C, 0x3E, 0x1E, 0x1F, 0x1E, 0x1F, 0x0F, 0x17, 0x97, 0x9B, 0xCB, 0xF9, + 0xF9, 0xF8, 0xF8, 0x78, 0x38, 0x00, 0x18, 0x37, 0xC3, 0xDE, 0x1E, 0x78, + 0x73, 0xC1, 0x9E, 0x08, 0xF0, 0xC7, 0x84, 0x3C, 0x41, 0xE4, 0x0F, 0x40, + 0x7C, 0x03, 0xC0, 0x1C, 0x00, 0xC0, 0x04, 0x00, 0x38, 0x10, 0xDF, 0x06, + 0x3D, 0xE0, 0xC7, 0xBC, 0x38, 0x73, 0xC7, 0x06, 0x79, 0xF0, 0x8F, 0x3E, + 0x11, 0xEB, 0xC4, 0x3F, 0x79, 0x07, 0xCF, 0x60, 0xF9, 0xE8, 0x1E, 0x3E, + 0x03, 0x87, 0x80, 0x70, 0xF0, 0x0C, 0x0C, 0x01, 0x01, 0x00, 0x03, 0x83, + 0x87, 0xF1, 0xF0, 0x3C, 0xF8, 0x0F, 0x60, 0x03, 0xD0, 0x00, 0xF8, 0x00, + 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0F, + 0xC0, 0x02, 0xF1, 0x39, 0x3C, 0xCF, 0xCF, 0xE3, 0xE1, 0xF0, 0x70, 0x38, + 0x00, 0x01, 0x83, 0x07, 0xE3, 0xC1, 0xF1, 0xE0, 0x78, 0xF0, 0x3E, 0x18, + 0x1F, 0x08, 0x07, 0x84, 0x03, 0xC6, 0x01, 0xE2, 0x00, 0xFB, 0x00, 0x3D, + 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xE0, 0x00, 0x60, 0x00, 0x60, 0x0E, 0x60, 0x0F, 0xE0, 0x07, 0xE0, 0x01, + 0xC0, 0x00, 0x1F, 0xFC, 0x3F, 0xF8, 0x7F, 0xE1, 0x81, 0x82, 0x06, 0x00, + 0x08, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x40, + 0x01, 0x80, 0x07, 0xC0, 0x1F, 0x86, 0x3F, 0x8E, 0xCF, 0x9C, 0x07, 0x30, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0xF8, 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00, + 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x1F, 0x00, 0x7E, 0x00, 0x30, 0x00, + 0x60, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, + 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, + 0x00, 0xF0, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0xC0, 0x07, + 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x10, 0x00, 0xF0, 0x03, 0xF0, + 0x0F, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, + 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x0F, 0x80, 0x7C, 0x00, + 0x3E, 0x00, 0x7F, 0xC6, 0xFF, 0xFF, 0x61, 0xFE, 0x00, 0x7C}; + +const GFXglyph FreeSerifBoldItalic18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 9, 0, 1}, // 0x20 ' ' + {0, 11, 25, 14, 2, -23}, // 0x21 '!' + {35, 14, 10, 19, 4, -23}, // 0x22 '"' + {53, 20, 25, 17, -1, -24}, // 0x23 '#' + {116, 17, 29, 18, 0, -25}, // 0x24 '$' + {178, 27, 25, 29, 1, -23}, // 0x25 '%' + {263, 25, 25, 27, 0, -23}, // 0x26 '&' + {342, 5, 10, 10, 4, -23}, // 0x27 ''' + {349, 11, 30, 12, 1, -23}, // 0x28 '(' + {391, 11, 30, 12, -2, -23}, // 0x29 ')' + {433, 13, 15, 18, 2, -23}, // 0x2A '*' + {458, 17, 17, 20, 1, -16}, // 0x2B '+' + {495, 7, 11, 9, -2, -4}, // 0x2C ',' + {505, 9, 4, 12, 0, -9}, // 0x2D '-' + {510, 6, 5, 9, 0, -3}, // 0x2E '.' + {514, 14, 25, 12, 0, -23}, // 0x2F '/' + {558, 15, 25, 18, 1, -23}, // 0x30 '0' + {605, 15, 25, 17, 0, -23}, // 0x31 '1' + {652, 16, 25, 18, 0, -23}, // 0x32 '2' + {702, 15, 25, 17, 1, -23}, // 0x33 '3' + {749, 18, 24, 17, 0, -23}, // 0x34 '4' + {803, 17, 25, 18, 0, -23}, // 0x35 '5' + {857, 17, 25, 18, 1, -23}, // 0x36 '6' + {911, 16, 24, 17, 3, -23}, // 0x37 '7' + {959, 17, 25, 18, 0, -23}, // 0x38 '8' + {1013, 17, 25, 18, 0, -23}, // 0x39 '9' + {1067, 10, 17, 9, 0, -15}, // 0x3A ':' + {1089, 11, 22, 9, -1, -15}, // 0x3B ';' + {1120, 18, 19, 20, 1, -18}, // 0x3C '<' + {1163, 18, 10, 20, 2, -13}, // 0x3D '=' + {1186, 18, 19, 20, 2, -18}, // 0x3E '>' + {1229, 13, 25, 17, 3, -23}, // 0x3F '?' + {1270, 25, 25, 29, 2, -23}, // 0x40 '@' + {1349, 23, 25, 24, 0, -23}, // 0x41 'A' + {1421, 24, 25, 22, 0, -23}, // 0x42 'B' + {1496, 23, 25, 22, 1, -23}, // 0x43 'C' + {1568, 26, 25, 25, 0, -23}, // 0x44 'D' + {1650, 23, 25, 22, 0, -23}, // 0x45 'E' + {1722, 23, 25, 21, 0, -23}, // 0x46 'F' + {1794, 24, 25, 25, 2, -23}, // 0x47 'G' + {1869, 29, 25, 26, 0, -23}, // 0x48 'H' + {1960, 15, 25, 13, 0, -23}, // 0x49 'I' + {2007, 20, 27, 17, 0, -23}, // 0x4A 'J' + {2075, 25, 25, 23, 0, -23}, // 0x4B 'K' + {2154, 22, 25, 21, 0, -23}, // 0x4C 'L' + {2223, 33, 25, 31, 0, -23}, // 0x4D 'M' + {2327, 27, 25, 25, 0, -23}, // 0x4E 'N' + {2412, 23, 25, 24, 1, -23}, // 0x4F 'O' + {2484, 23, 25, 21, 0, -23}, // 0x50 'P' + {2556, 23, 31, 24, 1, -23}, // 0x51 'Q' + {2646, 24, 25, 23, 0, -23}, // 0x52 'R' + {2721, 18, 25, 18, 0, -23}, // 0x53 'S' + {2778, 21, 25, 21, 3, -23}, // 0x54 'T' + {2844, 24, 25, 25, 4, -23}, // 0x55 'U' + {2919, 24, 25, 25, 4, -23}, // 0x56 'V' + {2994, 31, 25, 32, 4, -23}, // 0x57 'W' + {3091, 25, 25, 24, 0, -23}, // 0x58 'X' + {3170, 21, 25, 22, 4, -23}, // 0x59 'Y' + {3236, 21, 25, 20, 0, -23}, // 0x5A 'Z' + {3302, 14, 30, 12, -1, -23}, // 0x5B '[' + {3355, 10, 25, 14, 4, -23}, // 0x5C '\' + {3387, 14, 30, 12, -2, -23}, // 0x5D ']' + {3440, 16, 13, 20, 2, -23}, // 0x5E '^' + {3466, 18, 3, 17, 0, 3}, // 0x5F '_' + {3473, 7, 6, 12, 3, -23}, // 0x60 '`' + {3479, 18, 17, 18, 0, -15}, // 0x61 'a' + {3518, 16, 26, 17, 1, -24}, // 0x62 'b' + {3570, 13, 17, 15, 1, -15}, // 0x63 'c' + {3598, 19, 25, 18, 1, -23}, // 0x64 'd' + {3658, 13, 17, 15, 1, -15}, // 0x65 'e' + {3686, 21, 32, 17, -3, -24}, // 0x66 'f' + {3770, 19, 23, 17, -1, -15}, // 0x67 'g' + {3825, 17, 25, 19, 1, -23}, // 0x68 'h' + {3879, 9, 25, 10, 1, -23}, // 0x69 'i' + {3908, 16, 31, 12, -3, -23}, // 0x6A 'j' + {3970, 17, 25, 18, 1, -23}, // 0x6B 'k' + {4024, 11, 25, 10, 1, -23}, // 0x6C 'l' + {4059, 26, 17, 27, 0, -15}, // 0x6D 'm' + {4115, 18, 17, 18, 0, -15}, // 0x6E 'n' + {4154, 15, 17, 17, 1, -15}, // 0x6F 'o' + {4186, 19, 23, 17, -2, -15}, // 0x70 'p' + {4241, 16, 23, 17, 1, -15}, // 0x71 'q' + {4287, 15, 16, 14, 0, -15}, // 0x72 'r' + {4317, 13, 17, 12, 0, -15}, // 0x73 's' + {4345, 10, 22, 10, 1, -20}, // 0x74 't' + {4373, 17, 17, 19, 1, -15}, // 0x75 'u' + {4410, 13, 16, 15, 2, -15}, // 0x76 'v' + {4436, 19, 16, 23, 3, -15}, // 0x77 'w' + {4474, 18, 17, 17, -1, -15}, // 0x78 'x' + {4513, 17, 23, 15, -2, -15}, // 0x79 'y' + {4562, 15, 19, 14, 0, -15}, // 0x7A 'z' + {4598, 15, 32, 12, 0, -24}, // 0x7B '{' + {4658, 3, 25, 9, 4, -23}, // 0x7C '|' + {4668, 15, 32, 12, -5, -24}, // 0x7D '}' + {4728, 16, 5, 20, 2, -11}}; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic18pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic18pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic18pt7bGlyphs, 0x20, 0x7E, 42}; + +// Approx. 5410 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h new file mode 100644 index 0000000..e2fa4cb --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h @@ -0,0 +1,795 @@ +#pragma once +#include + +const uint8_t FreeSerifBoldItalic24pt7bBitmaps[] PROGMEM = { + 0x00, 0x3C, 0x00, 0xFC, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, + 0x3F, 0x00, 0x7E, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1E, + 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x0E, 0x00, + 0x18, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x03, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0x00, + 0x3C, 0x00, 0x1C, 0x01, 0xC7, 0xC0, 0x7D, 0xF8, 0x1F, 0xBF, 0x03, 0xF7, + 0xC0, 0x7C, 0xF8, 0x0F, 0x9E, 0x01, 0xE3, 0xC0, 0x3C, 0x70, 0x07, 0x1E, + 0x00, 0xE3, 0x80, 0x38, 0x70, 0x07, 0x0C, 0x00, 0xC0, 0x00, 0x03, 0xC1, + 0xE0, 0x00, 0x70, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xE0, 0x00, + 0x70, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0x81, 0xC0, 0x00, 0xF0, 0x78, + 0x00, 0x1E, 0x0F, 0x00, 0x07, 0x83, 0xC0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x00, 0xE0, 0x70, 0x00, 0x3C, 0x1E, 0x00, + 0x07, 0x83, 0xC0, 0x00, 0xE0, 0x70, 0x00, 0x3C, 0x1E, 0x00, 0x07, 0x83, + 0xC0, 0x00, 0xE0, 0x70, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x1F, + 0xFF, 0xFF, 0x00, 0x38, 0x1C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xE0, 0xF0, + 0x00, 0x38, 0x1C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0x78, + 0x3C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0x78, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x1F, + 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xF1, 0x9E, 0x01, 0xC1, 0x8F, 0x03, 0x83, + 0x8F, 0x03, 0x83, 0x06, 0x07, 0x83, 0x06, 0x07, 0x87, 0x06, 0x07, 0xC7, + 0x04, 0x07, 0xE6, 0x04, 0x07, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFF, + 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x1F, + 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x3B, 0xF8, 0x20, 0x31, + 0xF8, 0x20, 0x30, 0xF8, 0x60, 0x70, 0xF8, 0x60, 0x60, 0xF8, 0x60, 0x60, + 0xF8, 0xF0, 0xE0, 0xF0, 0xF0, 0xE1, 0xE0, 0x78, 0xC3, 0xE0, 0x3C, 0xC7, + 0xC0, 0x0F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80, + 0x00, 0x03, 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xF0, + 0x00, 0x70, 0x00, 0xFF, 0x80, 0x1C, 0x00, 0x3F, 0x38, 0x1F, 0x00, 0x0F, + 0xC7, 0xFF, 0xE0, 0x03, 0xF0, 0x3F, 0xB8, 0x00, 0x7E, 0x04, 0x07, 0x00, + 0x1F, 0x80, 0x81, 0xC0, 0x03, 0xF0, 0x10, 0x38, 0x00, 0xFC, 0x02, 0x0E, + 0x00, 0x1F, 0x80, 0x81, 0x80, 0x03, 0xF0, 0x10, 0x70, 0x00, 0x7C, 0x06, + 0x1C, 0x00, 0x0F, 0x80, 0x83, 0x80, 0x01, 0xF0, 0x30, 0xE0, 0x00, 0x1E, + 0x0C, 0x1C, 0x07, 0xC3, 0xE3, 0x07, 0x03, 0xFC, 0x3F, 0xC0, 0xC0, 0xFC, + 0x43, 0xE0, 0x38, 0x3E, 0x0C, 0x00, 0x0E, 0x0F, 0xC0, 0x80, 0x01, 0xC3, + 0xF0, 0x10, 0x00, 0x70, 0xFC, 0x02, 0x00, 0x0C, 0x1F, 0x80, 0x40, 0x03, + 0x83, 0xE0, 0x08, 0x00, 0x60, 0xFC, 0x02, 0x00, 0x1C, 0x1F, 0x80, 0x40, + 0x07, 0x03, 0xE0, 0x10, 0x00, 0xE0, 0x7C, 0x02, 0x00, 0x38, 0x0F, 0x80, + 0xC0, 0x06, 0x01, 0xF0, 0x30, 0x01, 0xC0, 0x1F, 0x0C, 0x00, 0x30, 0x01, + 0xFF, 0x00, 0x0E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x01, 0xF1, 0xE0, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x00, + 0xF0, 0x3C, 0x00, 0x00, 0x78, 0x1E, 0x00, 0x00, 0x7C, 0x0F, 0x00, 0x00, + 0x3E, 0x0F, 0x80, 0x00, 0x1F, 0x07, 0x80, 0x00, 0x0F, 0x87, 0x80, 0x00, + 0x07, 0xC7, 0x80, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0x07, 0xFE, + 0x03, 0xCF, 0xC0, 0xFE, 0x03, 0xC7, 0xE0, 0x3C, 0x07, 0xC3, 0xF0, 0x1C, + 0x07, 0xC0, 0xFC, 0x0C, 0x03, 0xC0, 0x7E, 0x0E, 0x03, 0xE0, 0x3F, 0x0E, + 0x01, 0xF0, 0x1F, 0xC6, 0x01, 0xF8, 0x07, 0xF6, 0x00, 0xFC, 0x03, 0xFF, + 0x00, 0x7E, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x7F, 0x80, 0x1F, 0xC0, 0x1F, + 0xC0, 0x07, 0xF0, 0x0F, 0xF0, 0x13, 0xFE, 0x0F, 0xFE, 0x18, 0xFF, 0xFE, + 0xFF, 0xF8, 0x3F, 0xFE, 0x3F, 0xF8, 0x07, 0xF8, 0x03, 0xF0, 0x00, 0x1C, + 0x7D, 0xFB, 0xF7, 0xCF, 0x9E, 0x3C, 0x71, 0xE3, 0x87, 0x0C, 0x00, 0x00, + 0x04, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x3C, 0x01, 0xE0, 0x0F, 0x80, 0x3C, 0x00, 0xF0, 0x07, + 0xC0, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x03, + 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, + 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80, + 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x01, + 0x00, 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x01, 0x80, 0x06, 0x00, + 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xF0, + 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x7C, + 0x01, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3C, + 0x01, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0xF0, + 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x06, 0x00, 0x30, 0x00, 0x80, 0x00, 0x00, + 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0x0E, 0x1D, 0xF1, + 0xC7, 0xFF, 0x11, 0xFF, 0xE2, 0x3F, 0x7E, 0x4F, 0xC0, 0x3E, 0x00, 0x07, + 0xC0, 0x3F, 0x27, 0xEF, 0xC4, 0x7F, 0xF8, 0x8F, 0xFE, 0x38, 0xFB, 0x87, + 0x0E, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x70, 0x00, 0x00, + 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x03, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x01, + 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, + 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0x80, 0x00, 0x0F, 0x07, 0xE1, 0xFC, 0x7F, 0x1F, 0xC3, 0xF0, 0x7C, + 0x0E, 0x03, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x1C, 0x04, 0x00, 0x7F, 0xF7, + 0xFF, 0x7F, 0xEF, 0xFE, 0xFF, 0xE0, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0x7E, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, + 0x78, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, + 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xE0, + 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, + 0x1E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0xE3, 0x80, 0x0F, 0x07, 0x00, 0x7C, 0x1C, 0x03, 0xE0, 0x78, 0x0F, 0x81, + 0xE0, 0x7C, 0x07, 0x83, 0xF0, 0x1F, 0x0F, 0xC0, 0xFC, 0x7E, 0x03, 0xF1, + 0xF8, 0x0F, 0xCF, 0xE0, 0x3F, 0x3F, 0x00, 0xFD, 0xFC, 0x07, 0xF7, 0xF0, + 0x1F, 0xDF, 0xC0, 0x7F, 0x7E, 0x01, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F, + 0xBF, 0x80, 0xFE, 0xFC, 0x03, 0xF3, 0xF0, 0x1F, 0xCF, 0xC0, 0x7F, 0x3F, + 0x01, 0xF8, 0xFC, 0x07, 0xE3, 0xE0, 0x3F, 0x0F, 0x80, 0xFC, 0x1E, 0x07, + 0xE0, 0x78, 0x1F, 0x00, 0xE0, 0x78, 0x03, 0x83, 0xC0, 0x07, 0x1E, 0x00, + 0x07, 0xE0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 0x00, + 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, + 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00, + 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, + 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, + 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF0, 0x00, 0x3F, + 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xF8, 0x0F, 0xFF, 0xF0, 0x00, + 0x0F, 0x80, 0x01, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x7F, 0xFE, 0x03, 0x83, + 0xF8, 0x0C, 0x07, 0xF0, 0x60, 0x1F, 0xC3, 0x00, 0x3F, 0x00, 0x00, 0xFC, + 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0E, 0x00, 0x00, 0x70, 0x06, 0x03, 0x80, 0x10, 0x1C, 0x00, 0xC0, 0xE0, + 0x06, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, + 0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, + 0x60, 0xFE, 0x03, 0x01, 0xFC, 0x08, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, + 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0xFC, + 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xF0, 0x00, + 0x7F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x03, + 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, + 0x00, 0x0F, 0x80, 0x00, 0x3C, 0x1C, 0x01, 0xF0, 0xF8, 0x07, 0x83, 0xF0, + 0x3C, 0x0F, 0xE1, 0xE0, 0x1F, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xE0, 0x00, + 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xFC, 0x00, + 0x06, 0xFC, 0x00, 0x06, 0x7E, 0x00, 0x06, 0x3F, 0x00, 0x06, 0x3F, 0x00, + 0x06, 0x1F, 0x80, 0x06, 0x0F, 0xC0, 0x06, 0x07, 0xE0, 0x03, 0x07, 0xE0, + 0x03, 0x03, 0xF0, 0x03, 0x01, 0xF8, 0x03, 0x01, 0xFC, 0x03, 0x00, 0xFC, + 0x03, 0x00, 0x7E, 0x03, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, + 0xF0, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x03, + 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, + 0x7F, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x07, + 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00, + 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, + 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0xFC, + 0x07, 0x80, 0xFC, 0x0F, 0x00, 0xFE, 0x1E, 0x00, 0x7F, 0xF8, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, + 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x01, 0xFC, + 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, + 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x0F, 0xE1, 0xF0, 0x3F, 0x81, 0xF0, + 0x7F, 0x03, 0xF0, 0xFC, 0x07, 0xE3, 0xF8, 0x0F, 0xC7, 0xF0, 0x1F, 0x8F, + 0xC0, 0x7F, 0x1F, 0x80, 0xFE, 0x3F, 0x01, 0xFC, 0x7C, 0x03, 0xF0, 0xF8, + 0x0F, 0xE1, 0xF0, 0x1F, 0xC1, 0xE0, 0x3F, 0x03, 0xC0, 0xFC, 0x07, 0x81, + 0xF0, 0x07, 0x87, 0xC0, 0x07, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xFF, + 0xFC, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, + 0x07, 0x00, 0x1C, 0x08, 0x00, 0x78, 0x30, 0x01, 0xE0, 0x40, 0x03, 0xC0, + 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, + 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x78, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x3C, 0x78, + 0x03, 0xC1, 0xE0, 0x3C, 0x07, 0x81, 0xE0, 0x3C, 0x1F, 0x01, 0xE0, 0xF8, + 0x0F, 0x07, 0xC0, 0x78, 0x3F, 0x03, 0xC1, 0xF8, 0x3C, 0x0F, 0xE1, 0xE0, + 0x3F, 0x9E, 0x01, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x1F, 0xFC, 0x03, 0xCF, 0xF0, 0x3C, 0x3F, 0x83, 0xC0, 0xFC, 0x3C, + 0x03, 0xF1, 0xE0, 0x1F, 0x9E, 0x00, 0x7C, 0xF0, 0x03, 0xE7, 0x80, 0x1F, + 0x3C, 0x00, 0xF9, 0xE0, 0x07, 0x87, 0x00, 0x3C, 0x3C, 0x03, 0xC0, 0xF0, + 0x3C, 0x03, 0xC3, 0xC0, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, + 0xE0, 0x03, 0xF1, 0xE0, 0x0F, 0xC1, 0xC0, 0x3F, 0x03, 0xC0, 0xFE, 0x07, + 0x81, 0xF8, 0x0F, 0x87, 0xF0, 0x1F, 0x0F, 0xC0, 0x3E, 0x3F, 0x80, 0xFC, + 0x7F, 0x01, 0xF8, 0xFC, 0x03, 0xF1, 0xF8, 0x07, 0xE3, 0xF0, 0x1F, 0xC7, + 0xE0, 0x3F, 0x8F, 0xC0, 0x7E, 0x0F, 0x81, 0xFC, 0x1F, 0x03, 0xF8, 0x1F, + 0x0F, 0xE0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03, + 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF8, + 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x1F, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x1F, 0x81, 0xFE, 0x0F, + 0xF0, 0x7F, 0x81, 0xF8, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x7E, 0x07, 0xF8, 0x3F, + 0xC1, 0xFE, 0x07, 0xE0, 0x1E, 0x00, 0x00, 0x78, 0x01, 0xF8, 0x07, 0xF8, + 0x0F, 0xF0, 0x1F, 0xE0, 0x1F, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x1F, 0x80, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0xF8, 0x00, + 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x0C, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x7F, 0x00, 0x03, 0xFF, 0x00, 0x0F, 0xFC, 0x00, 0x3F, 0xF0, + 0x01, 0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00, + 0xFF, 0x80, 0x00, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x00, + 0x1F, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, + 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x80, + 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x1F, 0xFC, + 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xF0, 0x00, + 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x01, 0xF8, 0x01, 0xFF, 0x80, 0xF1, 0xF0, 0x38, 0x3E, + 0x1E, 0x0F, 0xC7, 0xC3, 0xF1, 0xF0, 0xFC, 0x7C, 0x3F, 0x0E, 0x0F, 0xC0, + 0x07, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x07, + 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xC0, 0x01, 0xF8, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, + 0x01, 0xF8, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x1F, + 0xFF, 0xC0, 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7C, + 0x00, 0x03, 0x80, 0x7C, 0x00, 0x00, 0xE0, 0x7C, 0x00, 0x00, 0x38, 0x3C, + 0x00, 0xF0, 0x4C, 0x3E, 0x00, 0xFD, 0xE7, 0x1E, 0x00, 0xF3, 0xF1, 0x9F, + 0x00, 0xF1, 0xF0, 0xEF, 0x80, 0xF0, 0x78, 0x3F, 0x80, 0xF0, 0x3C, 0x1F, + 0xC0, 0x78, 0x1E, 0x0F, 0xE0, 0x78, 0x1E, 0x07, 0xF0, 0x3C, 0x0F, 0x03, + 0xF8, 0x3E, 0x07, 0x81, 0xFC, 0x1E, 0x07, 0x81, 0xFE, 0x0F, 0x03, 0xC0, + 0xDF, 0x07, 0x83, 0xC0, 0x6F, 0x83, 0xC3, 0xE0, 0x63, 0xE1, 0xF3, 0xF0, + 0x71, 0xF0, 0x7E, 0x78, 0x70, 0xF8, 0x1E, 0x3F, 0xF0, 0x3E, 0x00, 0x07, + 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x03, 0xF0, + 0x07, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, + 0x7E, 0x00, 0x00, 0x06, 0xFC, 0x00, 0x00, 0x19, 0xF8, 0x00, 0x00, 0x63, + 0xF8, 0x00, 0x00, 0xC7, 0xF0, 0x00, 0x03, 0x07, 0xE0, 0x00, 0x06, 0x0F, + 0xC0, 0x00, 0x18, 0x1F, 0x80, 0x00, 0x60, 0x3F, 0x00, 0x00, 0xC0, 0x7F, + 0x00, 0x03, 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, + 0x00, 0x60, 0x03, 0xF0, 0x00, 0xC0, 0x07, 0xE0, 0x03, 0x00, 0x0F, 0xE0, + 0x0E, 0x00, 0x1F, 0xC0, 0x18, 0x00, 0x3F, 0x80, 0x70, 0x00, 0x7F, 0x01, + 0xC0, 0x00, 0xFE, 0x03, 0x80, 0x01, 0xFE, 0x1F, 0x80, 0x07, 0xFE, 0x7F, + 0xC0, 0x3F, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xE0, 0x00, + 0xFE, 0x1F, 0xE0, 0x01, 0xFC, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x0F, + 0xE0, 0x3F, 0xC0, 0x1F, 0xC0, 0x7F, 0x80, 0x3F, 0x80, 0xFF, 0x00, 0x7F, + 0x01, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x03, 0xF8, 0x0F, 0xF0, 0x07, 0xF0, + 0x1F, 0xC0, 0x0F, 0xC0, 0x7F, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x7F, 0xFF, + 0x00, 0x00, 0xFE, 0x1F, 0xC0, 0x03, 0xF8, 0x0F, 0xE0, 0x07, 0xF0, 0x0F, + 0xE0, 0x0F, 0xE0, 0x1F, 0xC0, 0x1F, 0xC0, 0x3F, 0xC0, 0x7F, 0x00, 0x7F, + 0x80, 0xFE, 0x00, 0xFF, 0x01, 0xFC, 0x01, 0xFE, 0x03, 0xF0, 0x07, 0xFC, + 0x0F, 0xE0, 0x0F, 0xF0, 0x1F, 0xC0, 0x3F, 0xE0, 0x3F, 0x80, 0x7F, 0x80, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x0F, 0xF8, 0x07, 0xFF, 0xFF, 0xC0, 0x3F, + 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x08, 0x00, 0x7F, 0xFE, 0xC0, + 0x0F, 0xF0, 0x7E, 0x00, 0xFE, 0x01, 0xF0, 0x1F, 0xE0, 0x07, 0x01, 0xFE, + 0x00, 0x38, 0x1F, 0xE0, 0x00, 0xC0, 0xFE, 0x00, 0x06, 0x0F, 0xF0, 0x00, + 0x30, 0xFF, 0x00, 0x01, 0x07, 0xF8, 0x00, 0x08, 0x7F, 0x80, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x00, 0x06, 0x03, 0xFC, 0x00, + 0x70, 0x0F, 0xE0, 0x07, 0x00, 0x1F, 0xC0, 0xE0, 0x00, 0x7F, 0xFE, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFE, + 0x00, 0x00, 0xFE, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x3F, 0x00, 0x03, 0xF8, + 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x03, + 0xF8, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x1F, 0xC0, 0x03, 0xFC, + 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x7F, 0x00, 0x0F, 0xF0, 0x0F, 0xC0, 0x01, + 0xFE, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x7F, 0x00, 0x07, 0xF8, 0x0F, 0xE0, + 0x01, 0xFF, 0x03, 0xF8, 0x00, 0x3F, 0xE0, 0x7F, 0x00, 0x07, 0xF8, 0x0F, + 0xE0, 0x00, 0xFF, 0x01, 0xFC, 0x00, 0x3F, 0xE0, 0x7F, 0x00, 0x07, 0xF8, + 0x0F, 0xE0, 0x01, 0xFF, 0x01, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x0F, + 0xF0, 0x0F, 0xE0, 0x01, 0xFC, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0x80, + 0x1F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0x7F, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x3F, 0xC0, 0x7E, 0x00, 0x3F, 0x80, 0x1E, + 0x00, 0x3F, 0x80, 0x0E, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x04, + 0x00, 0x7F, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, + 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0xFC, 0x0F, 0x00, + 0x01, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, 0xFC, 0x3E, 0x00, + 0x03, 0xF8, 0x1E, 0x00, 0x03, 0xF8, 0x0C, 0x00, 0x03, 0xF8, 0x0C, 0x00, + 0x03, 0xF8, 0x0C, 0x00, 0x07, 0xF0, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x08, + 0x07, 0xF0, 0x00, 0x18, 0x07, 0xE0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, + 0x0F, 0xE0, 0x00, 0x70, 0x0F, 0xE0, 0x01, 0xE0, 0x1F, 0xC0, 0x07, 0xE0, + 0x1F, 0xE0, 0x3F, 0xE0, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC0, + 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0x03, 0xF0, + 0x01, 0xFC, 0x01, 0xE0, 0x03, 0xF8, 0x01, 0xC0, 0x0F, 0xE0, 0x01, 0x80, + 0x1F, 0xC0, 0x02, 0x00, 0x3F, 0x80, 0x04, 0x00, 0x7F, 0x00, 0x00, 0x01, + 0xFC, 0x03, 0x00, 0x03, 0xF8, 0x04, 0x00, 0x07, 0xF0, 0x18, 0x00, 0x0F, + 0xC0, 0xF0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFE, + 0x1F, 0x00, 0x03, 0xF8, 0x1E, 0x00, 0x07, 0xF0, 0x18, 0x00, 0x0F, 0xE0, + 0x30, 0x00, 0x1F, 0xC0, 0x60, 0x00, 0x7F, 0x00, 0x80, 0x00, 0xFE, 0x01, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0F, 0xFF, 0xEE, 0x00, 0x3F, 0xC0, + 0xFC, 0x00, 0x7F, 0x00, 0x7C, 0x01, 0xFE, 0x00, 0x3C, 0x03, 0xFC, 0x00, + 0x38, 0x07, 0xF8, 0x00, 0x18, 0x07, 0xF0, 0x00, 0x18, 0x0F, 0xF0, 0x00, + 0x10, 0x1F, 0xE0, 0x00, 0x10, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x1F, + 0xFF, 0xFF, 0x00, 0x07, 0xFC, 0xFF, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, + 0xF8, 0xFF, 0x00, 0x03, 0xF0, 0xFF, 0x00, 0x03, 0xF0, 0xFF, 0x00, 0x07, + 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xE0, 0x7F, 0x80, 0x07, + 0xE0, 0x3F, 0x80, 0x0F, 0xE0, 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, + 0xC0, 0x07, 0xF0, 0x3F, 0x80, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xE0, + 0x00, 0x01, 0xFF, 0xFC, 0x7F, 0xFE, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, 0x00, + 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, + 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, + 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, + 0x7F, 0x00, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x01, 0xFC, 0x00, + 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x7F, 0xFF, + 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x00, + 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0x1F, 0xC0, + 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x3F, 0x80, + 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, + 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x0F, 0xE0, + 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x07, 0xFC, + 0x01, 0xFF, 0x00, 0x3F, 0xFF, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xF8, + 0x03, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, + 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, + 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, + 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, + 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, + 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFC, + 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x07, 0x03, 0xF0, 0x01, 0xF0, 0xFE, 0x00, + 0x3E, 0x1F, 0xC0, 0x07, 0xC3, 0xF0, 0x00, 0xF8, 0xFC, 0x00, 0x0F, 0x3F, + 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x01, 0xFF, 0xF8, + 0xFF, 0xC0, 0x1F, 0xF8, 0x0F, 0xC0, 0x03, 0xF8, 0x01, 0xC0, 0x00, 0xFE, + 0x00, 0xE0, 0x00, 0x3F, 0x80, 0x70, 0x00, 0x1F, 0xC0, 0x38, 0x00, 0x07, + 0xF0, 0x1C, 0x00, 0x01, 0xFC, 0x0E, 0x00, 0x00, 0x7F, 0x07, 0x00, 0x00, + 0x3F, 0x83, 0x80, 0x00, 0x0F, 0xE1, 0xC0, 0x00, 0x03, 0xF8, 0xE0, 0x00, + 0x00, 0xFC, 0x60, 0x00, 0x00, 0x7F, 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0x00, + 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0x7F, + 0x00, 0x00, 0x3F, 0x9F, 0xC0, 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x07, 0xF0, + 0xFE, 0x00, 0x01, 0xFC, 0x1F, 0xC0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0x1F, + 0x80, 0xFE, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x03, 0xF8, 0x0F, 0xE0, 0x00, + 0xFE, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x0F, 0xE0, + 0x0F, 0xF8, 0x07, 0xFC, 0x0F, 0xFF, 0xC7, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, + 0x00, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, + 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x04, 0x1F, 0xC0, 0x00, 0x60, 0xFC, 0x00, 0x06, + 0x0F, 0xE0, 0x00, 0x30, 0x7F, 0x00, 0x03, 0x83, 0xF8, 0x00, 0x7C, 0x3F, + 0x80, 0x0F, 0xC1, 0xFE, 0x03, 0xFE, 0x1F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x03, 0xFC, 0x00, 0x03, + 0xFC, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x0F, 0xF8, + 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xF0, 0x00, + 0x6F, 0xC0, 0x03, 0xFF, 0x00, 0x06, 0xFC, 0x00, 0x37, 0xF0, 0x00, 0x6F, + 0xE0, 0x06, 0x7E, 0x00, 0x04, 0xFE, 0x00, 0xEF, 0xE0, 0x00, 0xCF, 0xE0, + 0x0C, 0xFE, 0x00, 0x0C, 0xFE, 0x01, 0x8F, 0xE0, 0x00, 0xCF, 0xE0, 0x38, + 0xFC, 0x00, 0x18, 0x7E, 0x03, 0x1F, 0xC0, 0x01, 0x87, 0xE0, 0x61, 0xFC, + 0x00, 0x18, 0x7E, 0x0E, 0x1F, 0xC0, 0x01, 0x87, 0xE0, 0xC3, 0xF8, 0x00, + 0x30, 0x7F, 0x18, 0x3F, 0x80, 0x03, 0x07, 0xF3, 0x83, 0xF8, 0x00, 0x30, + 0x7F, 0x30, 0x3F, 0x00, 0x06, 0x07, 0xF7, 0x07, 0xF0, 0x00, 0x60, 0x3F, + 0xE0, 0x7F, 0x00, 0x06, 0x03, 0xFC, 0x07, 0xF0, 0x00, 0xE0, 0x3F, 0xC0, + 0x7E, 0x00, 0x0C, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0xC0, 0x3F, 0x00, 0xFE, + 0x00, 0x0C, 0x03, 0xF0, 0x0F, 0xE0, 0x01, 0xC0, 0x3E, 0x01, 0xFC, 0x00, + 0x1C, 0x03, 0xC0, 0x1F, 0xC0, 0x07, 0xE0, 0x3C, 0x03, 0xFE, 0x00, 0xFF, + 0xC1, 0x81, 0xFF, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0xFF, + 0x00, 0x1F, 0xF8, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x00, 0xF0, + 0x00, 0x7F, 0x00, 0x07, 0x00, 0x03, 0xFC, 0x00, 0x38, 0x00, 0x1F, 0xE0, + 0x01, 0x80, 0x01, 0xBF, 0x80, 0x0C, 0x00, 0x0D, 0xFC, 0x00, 0x60, 0x00, + 0x67, 0xF0, 0x07, 0x00, 0x02, 0x3F, 0x80, 0x30, 0x00, 0x30, 0xFE, 0x01, + 0x80, 0x01, 0x87, 0xF0, 0x0C, 0x00, 0x0C, 0x1F, 0xC0, 0xC0, 0x00, 0xC0, + 0xFE, 0x06, 0x00, 0x06, 0x07, 0xF8, 0x30, 0x00, 0x30, 0x1F, 0xC1, 0x80, + 0x01, 0x80, 0xFF, 0x18, 0x00, 0x18, 0x03, 0xF8, 0xC0, 0x00, 0xC0, 0x1F, + 0xC6, 0x00, 0x06, 0x00, 0x7F, 0x60, 0x00, 0x60, 0x03, 0xFB, 0x00, 0x03, + 0x00, 0x0F, 0xF8, 0x00, 0x18, 0x00, 0x7F, 0xC0, 0x01, 0xC0, 0x01, 0xFC, + 0x00, 0x0C, 0x00, 0x0F, 0xE0, 0x00, 0x60, 0x00, 0x3F, 0x00, 0x03, 0x00, + 0x01, 0xF0, 0x00, 0x38, 0x00, 0x07, 0x80, 0x01, 0xC0, 0x00, 0x3C, 0x00, + 0x3F, 0x00, 0x01, 0xE0, 0x03, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x7E, + 0x1F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, + 0x1F, 0x80, 0xFE, 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x7E, 0x07, 0xF0, 0x00, + 0xFE, 0x1F, 0xC0, 0x01, 0xFC, 0x7F, 0x80, 0x03, 0xF8, 0xFE, 0x00, 0x07, + 0xF3, 0xFC, 0x00, 0x1F, 0xE7, 0xF0, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x7F, + 0xBF, 0xC0, 0x00, 0xFE, 0x7F, 0x80, 0x03, 0xFC, 0xFE, 0x00, 0x07, 0xFB, + 0xFC, 0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x7F, 0x9F, + 0xC0, 0x00, 0xFE, 0x3F, 0x80, 0x03, 0xFC, 0x7F, 0x00, 0x07, 0xF0, 0xFE, + 0x00, 0x1F, 0xC0, 0xFC, 0x00, 0x3F, 0x81, 0xF8, 0x00, 0xFE, 0x03, 0xF0, + 0x03, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0, + 0xFC, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x01, 0xFF, + 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0xFE, 0x1F, 0xE0, 0x01, 0xFC, + 0x1F, 0xE0, 0x03, 0xF0, 0x1F, 0xC0, 0x0F, 0xE0, 0x3F, 0xC0, 0x1F, 0xC0, + 0x7F, 0x80, 0x3F, 0x80, 0xFF, 0x00, 0x7E, 0x01, 0xFE, 0x01, 0xFC, 0x03, + 0xFC, 0x03, 0xF8, 0x0F, 0xF8, 0x07, 0xF0, 0x1F, 0xE0, 0x0F, 0xC0, 0x7F, + 0x80, 0x3F, 0x81, 0xFE, 0x00, 0x7F, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, + 0x1F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x7E, 0x1F, 0x80, 0x01, + 0xF0, 0x0F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0xFE, + 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x7E, 0x07, 0xF0, 0x00, 0xFE, 0x1F, 0xC0, + 0x01, 0xFC, 0x7F, 0x80, 0x03, 0xF8, 0xFE, 0x00, 0x07, 0xF3, 0xFC, 0x00, + 0x1F, 0xE7, 0xF8, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x7F, 0xBF, 0xC0, 0x00, + 0xFF, 0x7F, 0x80, 0x01, 0xFC, 0xFE, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x0F, + 0xF7, 0xF8, 0x00, 0x1F, 0xCF, 0xF0, 0x00, 0x7F, 0x9F, 0xC0, 0x00, 0xFE, + 0x3F, 0x80, 0x01, 0xFC, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x0F, 0xE1, + 0xFC, 0x00, 0x3F, 0x81, 0xF8, 0x00, 0x7E, 0x03, 0xF0, 0x01, 0xF8, 0x03, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x1F, 0x80, 0x03, 0xE0, 0x7E, 0x00, 0x03, + 0xF3, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x7F, 0xE0, 0x03, 0x03, 0xFF, + 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xC0, 0xE0, 0x3F, + 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, + 0xFF, 0xF8, 0x00, 0x3F, 0xC3, 0xFC, 0x00, 0x3F, 0x81, 0xFE, 0x00, 0x3F, + 0x80, 0xFF, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, + 0x00, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0xFE, + 0x01, 0xFE, 0x00, 0xFE, 0x03, 0xFC, 0x00, 0xFE, 0x07, 0xF8, 0x01, 0xFC, + 0x1F, 0xF0, 0x01, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x00, 0x03, 0xFD, + 0xFE, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, 0xF8, + 0xFF, 0x00, 0x07, 0xF8, 0x7F, 0x80, 0x07, 0xF0, 0x7F, 0x80, 0x07, 0xF0, + 0x3F, 0x80, 0x07, 0xF0, 0x3F, 0xC0, 0x0F, 0xE0, 0x3F, 0xC0, 0x0F, 0xE0, + 0x1F, 0xC0, 0x0F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, + 0x0F, 0xF0, 0x3F, 0xF0, 0x0F, 0xF8, 0xFF, 0xFC, 0x0F, 0xFE, 0x00, 0x1F, + 0x83, 0x00, 0x7F, 0xF7, 0x00, 0xF8, 0x7E, 0x01, 0xE0, 0x1E, 0x03, 0xC0, + 0x0E, 0x03, 0xC0, 0x0E, 0x07, 0xC0, 0x0E, 0x07, 0xC0, 0x04, 0x07, 0xC0, + 0x04, 0x07, 0xE0, 0x04, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, + 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x7F, + 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x20, 0x00, 0xF8, 0x20, 0x00, + 0xF8, 0x20, 0x00, 0xF8, 0x70, 0x00, 0xF8, 0x70, 0x00, 0xF0, 0x78, 0x01, + 0xF0, 0x78, 0x03, 0xE0, 0x7E, 0x07, 0xC0, 0x47, 0xFF, 0x80, 0xC0, 0xFC, + 0x00, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFC, 0xFE, 0x3F, 0x8F, 0x9E, + 0x07, 0xF0, 0xF3, 0x81, 0xFC, 0x0E, 0x60, 0x3F, 0x81, 0x98, 0x07, 0xF0, + 0x13, 0x00, 0xFC, 0x02, 0x00, 0x3F, 0x80, 0x40, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, + 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0xFC, 0x07, 0xF0, 0x00, 0x38, 0x07, 0xF0, + 0x00, 0x38, 0x07, 0xF0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, 0x0F, 0xE0, + 0x00, 0x70, 0x0F, 0xE0, 0x00, 0x60, 0x0F, 0xE0, 0x00, 0x60, 0x1F, 0xC0, + 0x00, 0xE0, 0x1F, 0xC0, 0x00, 0xC0, 0x1F, 0xC0, 0x00, 0xC0, 0x3F, 0x80, + 0x00, 0xC0, 0x3F, 0x80, 0x01, 0x80, 0x3F, 0x80, 0x01, 0x80, 0x3F, 0x80, + 0x01, 0x80, 0x7F, 0x00, 0x01, 0x80, 0x7F, 0x00, 0x03, 0x00, 0x7F, 0x00, + 0x03, 0x00, 0x7E, 0x00, 0x03, 0x00, 0xFE, 0x00, 0x06, 0x00, 0xFE, 0x00, + 0x06, 0x00, 0xFC, 0x00, 0x06, 0x00, 0xFC, 0x00, 0x0E, 0x00, 0xFC, 0x00, + 0x0C, 0x00, 0xFC, 0x00, 0x1C, 0x00, 0xFC, 0x00, 0x18, 0x00, 0x7E, 0x00, + 0x38, 0x00, 0x7E, 0x00, 0x70, 0x00, 0x3F, 0x81, 0xE0, 0x00, 0x0F, 0xFF, + 0x80, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x03, 0xFE, 0x7F, 0xE0, + 0x01, 0xF8, 0x7F, 0x80, 0x01, 0xC0, 0xFF, 0x00, 0x03, 0x80, 0xFE, 0x00, + 0x0E, 0x01, 0xFC, 0x00, 0x18, 0x03, 0xF8, 0x00, 0x70, 0x07, 0xF0, 0x00, + 0xC0, 0x0F, 0xF0, 0x03, 0x80, 0x1F, 0xE0, 0x0E, 0x00, 0x1F, 0xC0, 0x18, + 0x00, 0x3F, 0x80, 0x70, 0x00, 0x7F, 0x00, 0xC0, 0x00, 0xFE, 0x03, 0x00, + 0x01, 0xFC, 0x0E, 0x00, 0x03, 0xF8, 0x18, 0x00, 0x07, 0xF8, 0x60, 0x00, + 0x07, 0xF1, 0xC0, 0x00, 0x0F, 0xE3, 0x00, 0x00, 0x1F, 0xCC, 0x00, 0x00, + 0x3F, 0xB8, 0x00, 0x00, 0x7F, 0x60, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xFF, 0xF8, + 0xFF, 0xF0, 0xFF, 0x9F, 0xF8, 0x1F, 0xE0, 0x0F, 0x87, 0xF8, 0x07, 0xE0, + 0x07, 0x03, 0xF8, 0x03, 0xF0, 0x03, 0x80, 0xFE, 0x01, 0xF8, 0x01, 0x80, + 0x7F, 0x00, 0xFC, 0x00, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xC0, 0x1F, 0xC0, + 0x7F, 0x80, 0x60, 0x0F, 0xE0, 0x3F, 0xC0, 0x60, 0x07, 0xF0, 0x37, 0xE0, + 0x30, 0x03, 0xF8, 0x1B, 0xF0, 0x30, 0x00, 0xFC, 0x19, 0xF8, 0x18, 0x00, + 0x7E, 0x0C, 0xFE, 0x18, 0x00, 0x3F, 0x84, 0x7F, 0x0C, 0x00, 0x1F, 0xC6, + 0x3F, 0x8C, 0x00, 0x0F, 0xE2, 0x1F, 0xC6, 0x00, 0x07, 0xF3, 0x07, 0xE6, + 0x00, 0x03, 0xF9, 0x83, 0xF3, 0x00, 0x01, 0xFD, 0x81, 0xFB, 0x00, 0x00, + 0x7E, 0xC0, 0xFD, 0x80, 0x00, 0x3F, 0xC0, 0x7F, 0x80, 0x00, 0x1F, 0xE0, + 0x3F, 0xC0, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x0F, 0xE0, + 0x00, 0x03, 0xF0, 0x07, 0xE0, 0x00, 0x01, 0xF8, 0x01, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x00, 0x1C, 0x00, + 0x38, 0x00, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00, + 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0xFF, 0xC0, 0x3F, + 0xE0, 0x0F, 0xC0, 0x03, 0xF8, 0x01, 0xE0, 0x00, 0xFE, 0x00, 0xE0, 0x00, + 0x3F, 0x80, 0x70, 0x00, 0x07, 0xE0, 0x18, 0x00, 0x01, 0xFC, 0x0C, 0x00, + 0x00, 0x7F, 0x06, 0x00, 0x00, 0x0F, 0xC3, 0x00, 0x00, 0x03, 0xF9, 0x80, + 0x00, 0x00, 0xFE, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x07, 0xF8, + 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x0F, + 0xC0, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x00, 0x77, 0xF0, 0x00, 0x00, 0x39, 0xFC, 0x00, 0x00, + 0x1C, 0x3F, 0x00, 0x00, 0x06, 0x0F, 0xE0, 0x00, 0x03, 0x03, 0xF8, 0x00, + 0x01, 0x80, 0x7E, 0x00, 0x00, 0xE0, 0x1F, 0xC0, 0x00, 0x70, 0x07, 0xF0, + 0x00, 0x38, 0x01, 0xFC, 0x00, 0x1E, 0x00, 0x7F, 0x80, 0x1F, 0xC0, 0x1F, + 0xF0, 0x0F, 0xFC, 0x3F, 0xFF, 0x80, 0xFF, 0xF8, 0x3F, 0xF3, 0xFC, 0x00, + 0xFC, 0x1F, 0xC0, 0x07, 0x81, 0xFC, 0x00, 0x70, 0x0F, 0xC0, 0x0E, 0x00, + 0xFE, 0x00, 0xC0, 0x0F, 0xE0, 0x1C, 0x00, 0x7E, 0x03, 0x80, 0x07, 0xF0, + 0x30, 0x00, 0x7F, 0x06, 0x00, 0x03, 0xF0, 0xE0, 0x00, 0x3F, 0x8C, 0x00, + 0x03, 0xF9, 0x80, 0x00, 0x1F, 0xB0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, + 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, + 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x3F, + 0xFF, 0xFF, 0x03, 0xF8, 0x0F, 0xF0, 0x7C, 0x01, 0xFE, 0x07, 0x80, 0x3F, + 0xC0, 0x70, 0x03, 0xF8, 0x06, 0x00, 0x7F, 0x80, 0xC0, 0x0F, 0xF0, 0x08, + 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x07, 0xF8, 0x00, 0xC0, 0xFF, 0x00, 0x0C, 0x1F, 0xE0, 0x01, 0x81, 0xFE, + 0x00, 0x38, 0x3F, 0xC0, 0x07, 0x87, 0xF8, 0x01, 0xF0, 0xFF, 0x00, 0xFF, + 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xE0, 0x0F, + 0xFC, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, + 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF0, + 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, + 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xFE, 0x01, + 0xFF, 0xC0, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x1C, + 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, + 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x07, 0x00, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01, + 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x00, 0x7F, 0xE0, + 0x0F, 0xFC, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0x07, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, + 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00, + 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, + 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x07, 0xFC, + 0x01, 0xFF, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0x00, + 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xEF, 0x00, 0x1E, 0x78, 0x00, 0xF1, + 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x3C, 0x07, 0xC1, 0xE0, 0x3C, 0x07, 0x83, + 0xE0, 0x3C, 0x1E, 0x00, 0xF1, 0xF0, 0x07, 0x8F, 0x00, 0x1E, 0xF8, 0x00, + 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x3E, + 0x0F, 0x83, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x0E, 0x01, 0xC0, 0x00, 0x3C, + 0x0C, 0x03, 0xF9, 0xF0, 0x1F, 0x3F, 0x80, 0xF8, 0x7E, 0x07, 0xC1, 0xF8, + 0x3F, 0x07, 0xC0, 0xF8, 0x1F, 0x07, 0xE0, 0x7C, 0x3F, 0x01, 0xF0, 0xFC, + 0x0F, 0x87, 0xE0, 0x3E, 0x1F, 0x80, 0xF8, 0x7E, 0x03, 0xC3, 0xF8, 0x1F, + 0x0F, 0xC0, 0x7C, 0x3F, 0x03, 0xF0, 0xFC, 0x0F, 0x83, 0xF0, 0x7E, 0x3F, + 0xC2, 0xF8, 0xBF, 0x9B, 0xE4, 0x7F, 0xCF, 0xE0, 0xFE, 0x3F, 0x01, 0xE0, + 0x78, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x7E, + 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, + 0x03, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x3E, 0x01, 0xF9, 0xFC, 0x07, + 0xEF, 0xF8, 0x1F, 0x47, 0xF0, 0x7E, 0x0F, 0xC3, 0xF8, 0x3F, 0x0F, 0xC0, + 0xFC, 0x3F, 0x03, 0xF1, 0xF8, 0x0F, 0xC7, 0xE0, 0x3F, 0x1F, 0x01, 0xF8, + 0x7C, 0x07, 0xE3, 0xF0, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x03, 0xF1, 0xF8, + 0x0F, 0x87, 0xE0, 0x7C, 0x1F, 0x03, 0xE0, 0xFC, 0x0F, 0x03, 0xF0, 0x78, + 0x0F, 0xC7, 0xC0, 0x1F, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x3F, 0x00, + 0x3F, 0xE0, 0x1E, 0x3C, 0x0F, 0x0F, 0x07, 0x87, 0xC3, 0xE1, 0xF1, 0xF0, + 0x38, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, + 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x03, 0x3F, + 0x00, 0xCF, 0xE0, 0x61, 0xFC, 0x70, 0x3F, 0xF8, 0x07, 0xFC, 0x00, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, + 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, + 0x07, 0x9F, 0x80, 0x0F, 0xFF, 0xC0, 0x0F, 0x9F, 0xE0, 0x0F, 0x87, 0xF0, + 0x0F, 0x83, 0xF0, 0x0F, 0xC1, 0xF8, 0x07, 0xC0, 0xFC, 0x07, 0xE0, 0x7C, + 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x1F, 0x81, 0xF8, 0x0F, + 0x80, 0xFC, 0x0F, 0xC0, 0xFE, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x3F, 0x03, + 0xF0, 0x1F, 0x83, 0xF8, 0x0F, 0xC1, 0xF8, 0xC7, 0xE1, 0xFC, 0xC3, 0xF9, + 0xBE, 0xC0, 0xFF, 0x9F, 0xC0, 0x7F, 0x8F, 0xC0, 0x0F, 0x83, 0xC0, 0x00, + 0x00, 0x3F, 0x00, 0x3F, 0xE0, 0x1E, 0x3C, 0x0F, 0x0F, 0x07, 0x83, 0xC3, + 0xE0, 0xF1, 0xF0, 0x3C, 0xFC, 0x1E, 0x3F, 0x0F, 0x9F, 0x83, 0xC7, 0xE3, + 0xE1, 0xFB, 0xE0, 0xFF, 0xE0, 0x3F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, 0x00, + 0xFC, 0x03, 0x3F, 0x01, 0x8F, 0xC0, 0xC1, 0xF8, 0x70, 0x7F, 0xF8, 0x07, + 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xCE, 0x00, + 0x00, 0x78, 0xF0, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x1F, + 0x06, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F, + 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01, + 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x1F, 0x00, 0x00, 0xF1, 0xE0, + 0x00, 0x0F, 0x3E, 0x00, 0x00, 0xF3, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x7F, 0xF0, 0x00, 0x7E, + 0x3F, 0xE0, 0x7C, 0x0F, 0xF0, 0x7E, 0x07, 0xC0, 0x7E, 0x03, 0xE0, 0x3F, + 0x01, 0xF0, 0x1F, 0x01, 0xF8, 0x0F, 0x80, 0xFC, 0x07, 0xC0, 0xFC, 0x01, + 0xE0, 0xFC, 0x00, 0x78, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF0, 0x00, + 0x1C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xF8, 0x00, + 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x77, 0xFF, + 0x80, 0xF0, 0x7F, 0xC0, 0xF0, 0x07, 0xE0, 0xF0, 0x01, 0xF0, 0x78, 0x00, + 0xF8, 0x3C, 0x00, 0x78, 0x1F, 0x00, 0x7C, 0x07, 0xC0, 0x78, 0x01, 0xFF, + 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x1F, + 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, + 0x00, 0x1F, 0x87, 0xC0, 0x3E, 0x1F, 0xC0, 0xFC, 0x7F, 0x81, 0xF9, 0x9F, + 0x03, 0xE6, 0x3E, 0x07, 0xD8, 0x7C, 0x1F, 0xA0, 0xF8, 0x3F, 0x83, 0xF0, + 0x7F, 0x07, 0xE0, 0xFC, 0x0F, 0xC3, 0xF8, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, + 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF0, + 0x3F, 0x17, 0xE0, 0x7E, 0x6F, 0xC0, 0xF9, 0x9F, 0x01, 0xF6, 0x3E, 0x03, + 0xF8, 0xFC, 0x07, 0xF1, 0xC0, 0x07, 0x80, 0x01, 0xE0, 0x3F, 0x03, 0xF0, + 0x3F, 0x03, 0xF0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC7, + 0xFC, 0x1F, 0xC0, 0xF8, 0x0F, 0x81, 0xF8, 0x1F, 0x81, 0xF0, 0x1F, 0x03, + 0xF0, 0x3E, 0x03, 0xE0, 0x3E, 0x07, 0xE0, 0x7C, 0x07, 0xC0, 0xFC, 0x2F, + 0x84, 0xF8, 0xCF, 0x98, 0xFF, 0x0F, 0xE0, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, + 0x7C, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, + 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, + 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x1F, + 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, + 0x60, 0xF8, 0x03, 0xC3, 0xC0, 0x0F, 0x1F, 0x00, 0x3C, 0xF8, 0x00, 0x7F, + 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFC, 0x00, 0x07, + 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x01, + 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x03, + 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE3, 0xFF, 0x03, 0xE0, 0xFC, 0x07, + 0xE0, 0xF0, 0x07, 0xE0, 0xE0, 0x07, 0xC1, 0xC0, 0x0F, 0xC3, 0x80, 0x0F, + 0xC7, 0x00, 0x0F, 0x8E, 0x00, 0x0F, 0xBE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, + 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0x3E, 0x00, 0x3F, 0x3F, 0x00, 0x3F, + 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x7E, 0x1F, 0x04, 0x7E, 0x1F, 0x8C, 0x7E, + 0x0F, 0x98, 0x7C, 0x0F, 0xF0, 0xFC, 0x07, 0xE0, 0xE0, 0x03, 0xC0, 0x00, + 0x08, 0x0F, 0xC7, 0xFE, 0x07, 0xF0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7C, + 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0x80, 0x7C, 0x07, 0xE0, 0x3E, 0x01, + 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xC0, 0x3E, 0x03, 0xF0, 0x1F, 0x80, 0xF8, + 0x0F, 0xC0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x8F, 0x8C, 0x7C, 0x43, + 0xE4, 0x1F, 0xE0, 0xFE, 0x03, 0xC0, 0x00, 0x00, 0x70, 0x78, 0x0F, 0x83, + 0xFE, 0x3F, 0x87, 0xF8, 0x1F, 0xCF, 0xF1, 0xFF, 0x03, 0xF1, 0x3E, 0x73, + 0xE0, 0x7E, 0x47, 0xD8, 0x7C, 0x0F, 0xD0, 0xFB, 0x1F, 0x81, 0xF4, 0x3E, + 0xC3, 0xF0, 0x3E, 0x87, 0xF0, 0x7C, 0x0F, 0xE0, 0xFE, 0x1F, 0x81, 0xF4, + 0x1F, 0x83, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xE0, 0xFC, 0x1F, 0x81, + 0xF8, 0x1F, 0x83, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xE0, 0xFC, 0x0F, + 0x80, 0xF8, 0x1F, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0xFC, + 0x0F, 0x88, 0xF8, 0x1F, 0x81, 0xF3, 0x3F, 0x03, 0xE0, 0x3E, 0x47, 0xE0, + 0xFC, 0x07, 0xF0, 0xFC, 0x1F, 0x80, 0xFE, 0x18, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x70, 0xF8, 0x7F, 0xC3, 0xF8, 0x1F, 0x8F, 0xF0, 0x3F, 0x33, 0xE0, + 0x7C, 0x87, 0xC1, 0xF9, 0x0F, 0x83, 0xF4, 0x1F, 0x07, 0xD0, 0x3E, 0x0F, + 0xE0, 0xFC, 0x3F, 0x81, 0xF8, 0x7F, 0x03, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, + 0x1F, 0x87, 0xE0, 0x3E, 0x0F, 0xC0, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x03, + 0xE0, 0xFC, 0x0F, 0xC9, 0xF8, 0x1F, 0x33, 0xE0, 0x3E, 0x47, 0xC0, 0x7F, + 0x1F, 0x80, 0xFE, 0x38, 0x00, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x0E, 0x38, + 0x03, 0xC1, 0xC0, 0x78, 0x1E, 0x0F, 0x81, 0xF0, 0xF0, 0x1F, 0x1F, 0x01, + 0xF3, 0xE0, 0x1F, 0x3E, 0x03, 0xF7, 0xC0, 0x3F, 0x7C, 0x03, 0xF7, 0xC0, + 0x3E, 0xFC, 0x03, 0xEF, 0xC0, 0x7E, 0xF8, 0x07, 0xCF, 0x80, 0x7C, 0xF8, + 0x0F, 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x3C, 0x03, + 0xC7, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x1F, 0x00, 0x3F, 0xE7, 0xF8, + 0x01, 0xF9, 0xFF, 0x00, 0x1F, 0x47, 0xF0, 0x07, 0xF0, 0x7E, 0x00, 0xFE, + 0x0F, 0xC0, 0x1F, 0x81, 0xF8, 0x03, 0xF0, 0x3F, 0x00, 0xFC, 0x07, 0xE0, + 0x1F, 0x81, 0xFC, 0x03, 0xE0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x1F, 0x81, + 0xFC, 0x03, 0xF0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x0F, 0x81, 0xF8, 0x03, + 0xF0, 0x3E, 0x00, 0x7E, 0x0F, 0xC0, 0x0F, 0x81, 0xF0, 0x01, 0xF0, 0x7C, + 0x00, 0x7F, 0x1F, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xF3, 0xE0, 0x00, 0x3E, + 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xFC, + 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0xF9, 0xF0, 0x1F, 0x1F, 0xC0, 0xF8, + 0x7E, 0x07, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xF8, 0x1F, 0x87, 0xE0, 0x7C, + 0x3F, 0x01, 0xF0, 0xFC, 0x0F, 0xC7, 0xE0, 0x3E, 0x1F, 0x80, 0xF8, 0x7E, + 0x07, 0xE3, 0xF0, 0x1F, 0x8F, 0xC0, 0x7C, 0x3F, 0x03, 0xF0, 0xFC, 0x0F, + 0xC3, 0xF0, 0x7E, 0x0F, 0xC3, 0xF8, 0x3F, 0x9B, 0xE0, 0x7F, 0xDF, 0x01, + 0xFE, 0x7C, 0x01, 0xF1, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3E, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xF8, + 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x71, 0xE1, 0xFF, 0x3E, 0x07, 0xE7, 0xF0, + 0x7E, 0xFF, 0x07, 0xE9, 0xE0, 0x7D, 0x0E, 0x07, 0xD0, 0x00, 0xFE, 0x00, + 0x0F, 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80, + 0x01, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, + 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0x01, + 0xF1, 0x07, 0xFF, 0x0F, 0x0F, 0x0E, 0x07, 0x1E, 0x06, 0x1E, 0x06, 0x1F, + 0x02, 0x1F, 0x02, 0x1F, 0x80, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x07, + 0xF8, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFC, 0x40, 0x7C, 0x40, 0x7C, 0x60, + 0x3C, 0xE0, 0x38, 0xF0, 0x38, 0xF8, 0xF0, 0xDF, 0xC0, 0x00, 0x20, 0x03, + 0x00, 0x38, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0x7F, 0x07, 0xFF, 0x3F, 0xF8, + 0x7C, 0x07, 0xE0, 0x3F, 0x01, 0xF0, 0x0F, 0x80, 0xFC, 0x07, 0xC0, 0x3E, + 0x03, 0xF0, 0x1F, 0x80, 0xF8, 0x07, 0xC0, 0x7E, 0x03, 0xF1, 0x1F, 0x08, + 0xF8, 0x87, 0xC8, 0x3F, 0xC1, 0xFC, 0x07, 0x80, 0x00, 0x00, 0x40, 0x00, + 0x1F, 0x03, 0xF7, 0xF8, 0x0F, 0x87, 0xE0, 0x3E, 0x1F, 0x81, 0xF8, 0x7E, + 0x07, 0xC1, 0xF0, 0x1F, 0x07, 0xC0, 0xFC, 0x3F, 0x03, 0xE0, 0xF8, 0x0F, + 0x83, 0xE0, 0x7E, 0x0F, 0x81, 0xF8, 0x7E, 0x0F, 0xC1, 0xF0, 0x3F, 0x07, + 0xC1, 0xFC, 0x1F, 0x07, 0xE0, 0xF8, 0x2F, 0x83, 0xE1, 0x3C, 0x6F, 0x8D, + 0xF1, 0x3E, 0x67, 0xC8, 0xFF, 0x1F, 0xE3, 0xF8, 0x7F, 0x07, 0xC0, 0xF0, + 0x00, 0x06, 0x07, 0x1F, 0x07, 0xBF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, + 0xF8, 0x3C, 0x7C, 0x0C, 0x3E, 0x06, 0x1F, 0x03, 0x0F, 0x83, 0x07, 0xC1, + 0x83, 0xE1, 0x81, 0xF1, 0x80, 0xF9, 0x80, 0x7C, 0xC0, 0x3E, 0xC0, 0x1F, + 0xC0, 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xC0, 0x00, 0xC0, 0x00, + 0x40, 0x00, 0x06, 0x01, 0x81, 0xC7, 0xC0, 0x30, 0x7F, 0xF8, 0x0E, 0x0F, + 0x9F, 0x01, 0xC1, 0xF3, 0xE0, 0x78, 0x3E, 0x7C, 0x1F, 0x03, 0xCF, 0xC3, + 0xE0, 0x30, 0xF8, 0xFC, 0x06, 0x1F, 0x1F, 0xC0, 0x83, 0xE7, 0xF8, 0x30, + 0x7C, 0xFF, 0x04, 0x0F, 0xB7, 0xE1, 0x81, 0xF6, 0xFC, 0x60, 0x3F, 0x8F, + 0x98, 0x07, 0xE1, 0xF3, 0x00, 0xFC, 0x3E, 0xC0, 0x1F, 0x07, 0xF0, 0x03, + 0xE0, 0xFC, 0x00, 0x78, 0x1F, 0x80, 0x0F, 0x03, 0xE0, 0x01, 0xC0, 0x78, + 0x00, 0x30, 0x0E, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0xF0, 0x1E, 0x0F, + 0xF0, 0x3E, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0xFF, 0x00, 0xF9, 0x8E, 0x00, + 0xFB, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xBF, 0x00, 0x01, + 0xBF, 0x08, 0x73, 0x1F, 0x18, 0xFF, 0x1F, 0x30, 0xFE, 0x1F, 0xE0, 0xFC, + 0x0F, 0xC0, 0x78, 0x07, 0x80, 0x00, 0x30, 0x1C, 0x0F, 0xF0, 0x7C, 0x07, + 0xE0, 0xF8, 0x0F, 0xC1, 0xF0, 0x0F, 0xC1, 0xE0, 0x1F, 0x81, 0xC0, 0x3F, + 0x03, 0x00, 0x3E, 0x06, 0x00, 0x7E, 0x08, 0x00, 0xFC, 0x30, 0x01, 0xF8, + 0x60, 0x01, 0xF1, 0x80, 0x03, 0xE3, 0x00, 0x07, 0xCC, 0x00, 0x0F, 0xD8, + 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x01, 0xC1, 0x80, 0x07, 0xE6, + 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x07, + 0xFF, 0xE1, 0xFF, 0xF8, 0x3F, 0xFF, 0x07, 0xFF, 0xC0, 0x80, 0x70, 0x30, + 0x1C, 0x04, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, + 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x30, + 0x00, 0x0C, 0x00, 0x03, 0xE0, 0x00, 0xFE, 0x00, 0x1F, 0xE0, 0xC7, 0xFC, + 0x3D, 0xCF, 0xC7, 0x90, 0xF8, 0xF0, 0x07, 0x9C, 0x00, 0x3E, 0x00, 0x00, + 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, + 0x07, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, + 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0xC0, + 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, + 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x3E, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, + 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, + 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, + 0x7C, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, + 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0x01, 0x3F, + 0xFE, 0x1D, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0x00, 0x1F, 0xF0, 0x00, 0x1F, + 0x00}; + +const GFXglyph FreeSerifBoldItalic24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 12, 0, 1}, // 0x20 ' ' + {0, 15, 33, 18, 3, -31}, // 0x21 '!' + {62, 19, 13, 26, 6, -31}, // 0x22 '"' + {93, 27, 33, 23, -2, -32}, // 0x23 '#' + {205, 24, 39, 24, -1, -33}, // 0x24 '$' + {322, 35, 32, 39, 2, -30}, // 0x25 '%' + {462, 33, 33, 37, 0, -31}, // 0x26 '&' + {599, 7, 13, 13, 6, -31}, // 0x27 ''' + {611, 14, 41, 16, 1, -31}, // 0x28 '(' + {683, 14, 41, 16, -2, -31}, // 0x29 ')' + {755, 19, 20, 23, 3, -31}, // 0x2A '*' + {803, 22, 23, 27, 2, -22}, // 0x2B '+' + {867, 10, 15, 12, -3, -5}, // 0x2C ',' + {886, 12, 5, 16, 0, -12}, // 0x2D '-' + {894, 8, 7, 12, 0, -5}, // 0x2E '.' + {901, 19, 33, 16, 0, -31}, // 0x2F '/' + {980, 22, 33, 23, 1, -31}, // 0x30 '0' + {1071, 20, 32, 23, 0, -31}, // 0x31 '1' + {1151, 22, 32, 23, 1, -31}, // 0x32 '2' + {1239, 22, 33, 24, 0, -31}, // 0x33 '3' + {1330, 25, 32, 23, 0, -31}, // 0x34 '4' + {1430, 24, 32, 24, 0, -30}, // 0x35 '5' + {1526, 23, 32, 24, 1, -30}, // 0x36 '6' + {1618, 23, 31, 23, 3, -30}, // 0x37 '7' + {1708, 21, 33, 23, 1, -31}, // 0x38 '8' + {1795, 23, 33, 23, 0, -31}, // 0x39 '9' + {1890, 13, 22, 12, 0, -20}, // 0x3A ':' + {1926, 15, 30, 12, -2, -20}, // 0x3B ';' + {1983, 24, 25, 27, 1, -23}, // 0x3C '<' + {2058, 24, 14, 27, 3, -18}, // 0x3D '=' + {2100, 24, 25, 27, 3, -23}, // 0x3E '>' + {2175, 18, 33, 24, 4, -31}, // 0x3F '?' + {2250, 33, 33, 39, 3, -31}, // 0x40 '@' + {2387, 31, 32, 33, 0, -31}, // 0x41 'A' + {2511, 31, 31, 30, 0, -30}, // 0x42 'B' + {2632, 29, 33, 29, 2, -31}, // 0x43 'C' + {2752, 35, 31, 34, 0, -30}, // 0x44 'D' + {2888, 32, 31, 30, 0, -30}, // 0x45 'E' + {3012, 31, 31, 29, 0, -30}, // 0x46 'F' + {3133, 32, 33, 33, 2, -31}, // 0x47 'G' + {3265, 39, 31, 35, 0, -30}, // 0x48 'H' + {3417, 21, 31, 18, 0, -30}, // 0x49 'I' + {3499, 27, 36, 23, 0, -30}, // 0x4A 'J' + {3621, 34, 31, 31, 0, -30}, // 0x4B 'K' + {3753, 29, 31, 29, 0, -30}, // 0x4C 'L' + {3866, 44, 32, 41, 0, -30}, // 0x4D 'M' + {4042, 37, 32, 33, 0, -30}, // 0x4E 'N' + {4190, 31, 33, 32, 2, -31}, // 0x4F 'O' + {4318, 31, 31, 28, 0, -30}, // 0x50 'P' + {4439, 31, 42, 32, 2, -31}, // 0x51 'Q' + {4602, 32, 31, 31, 0, -30}, // 0x52 'R' + {4726, 24, 33, 24, 0, -31}, // 0x53 'S' + {4825, 27, 31, 28, 4, -30}, // 0x54 'T' + {4930, 32, 32, 34, 5, -30}, // 0x55 'U' + {5058, 31, 32, 33, 6, -30}, // 0x56 'V' + {5182, 41, 32, 44, 6, -30}, // 0x57 'W' + {5346, 34, 31, 33, 0, -30}, // 0x58 'X' + {5478, 28, 31, 30, 6, -30}, // 0x59 'Y' + {5587, 28, 31, 26, 0, -30}, // 0x5A 'Z' + {5696, 19, 38, 16, -2, -30}, // 0x5B '[' + {5787, 13, 33, 19, 6, -31}, // 0x5C '\' + {5841, 19, 38, 16, -3, -30}, // 0x5D ']' + {5932, 21, 17, 27, 3, -30}, // 0x5E '^' + {5977, 24, 3, 23, 0, 5}, // 0x5F '_' + {5986, 10, 9, 16, 4, -32}, // 0x60 '`' + {5998, 22, 23, 24, 1, -21}, // 0x61 'a' + {6062, 22, 33, 23, 1, -31}, // 0x62 'b' + {6153, 18, 23, 20, 1, -21}, // 0x63 'c' + {6205, 25, 34, 24, 1, -32}, // 0x64 'd' + {6312, 18, 23, 20, 1, -21}, // 0x65 'e' + {6364, 28, 41, 23, -4, -31}, // 0x66 'f' + {6508, 25, 31, 23, -1, -21}, // 0x67 'g' + {6605, 23, 34, 26, 1, -32}, // 0x68 'h' + {6703, 12, 33, 14, 2, -31}, // 0x69 'i' + {6753, 22, 42, 16, -4, -31}, // 0x6A 'j' + {6869, 24, 34, 24, 1, -32}, // 0x6B 'k' + {6971, 13, 34, 14, 2, -32}, // 0x6C 'l' + {7027, 35, 23, 36, 0, -21}, // 0x6D 'm' + {7128, 23, 23, 25, 0, -21}, // 0x6E 'n' + {7195, 20, 23, 22, 1, -21}, // 0x6F 'o' + {7253, 27, 31, 23, -4, -21}, // 0x70 'p' + {7358, 22, 31, 23, 1, -21}, // 0x71 'q' + {7444, 20, 22, 19, 0, -21}, // 0x72 'r' + {7499, 16, 23, 17, 0, -21}, // 0x73 's' + {7545, 13, 29, 13, 2, -27}, // 0x74 't' + {7593, 22, 23, 25, 2, -21}, // 0x75 'u' + {7657, 17, 23, 21, 3, -21}, // 0x76 'v' + {7706, 27, 23, 31, 3, -21}, // 0x77 'w' + {7784, 24, 23, 22, -1, -21}, // 0x78 'x' + {7853, 23, 31, 20, -3, -21}, // 0x79 'y' + {7943, 19, 25, 19, 0, -20}, // 0x7A 'z' + {8003, 20, 41, 16, 0, -31}, // 0x7B '{' + {8106, 4, 33, 13, 5, -31}, // 0x7C '|' + {8123, 20, 41, 16, -6, -31}, // 0x7D '}' + {8226, 21, 7, 27, 3, -14}}; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic24pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic24pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic24pt7bGlyphs, 0x20, 0x7E, 56}; + +// Approx. 8917 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h new file mode 100644 index 0000000..b5d9a55 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h @@ -0,0 +1,217 @@ +#pragma once +#include + +const uint8_t FreeSerifBoldItalic9pt7bBitmaps[] PROGMEM = { + 0x0C, 0x31, 0xC6, 0x18, 0x41, 0x08, 0x20, 0x0E, 0x38, 0xE0, 0xCF, 0x38, + 0xA2, 0x88, 0x02, 0x40, 0xC8, 0x13, 0x06, 0x43, 0xFC, 0x32, 0x06, 0x40, + 0x98, 0x7F, 0x84, 0xC0, 0x90, 0x32, 0x04, 0xC0, 0x01, 0x01, 0xF0, 0x4B, + 0x99, 0x33, 0x24, 0x78, 0x07, 0x80, 0x38, 0x0B, 0x89, 0x31, 0x26, 0x64, + 0xC7, 0x30, 0x3C, 0x04, 0x00, 0x38, 0x41, 0x9F, 0x06, 0x48, 0x31, 0x60, + 0xCD, 0x03, 0x2C, 0x07, 0x27, 0x81, 0x39, 0x05, 0xC4, 0x26, 0x10, 0x98, + 0x84, 0x66, 0x10, 0xE0, 0x03, 0x80, 0x22, 0x03, 0x10, 0x19, 0x00, 0xF0, + 0x0F, 0x3C, 0xF8, 0xCC, 0xC4, 0xE7, 0x47, 0x3E, 0x38, 0xE1, 0xE7, 0x97, + 0xCF, 0x00, 0xFA, 0x80, 0x08, 0x88, 0x84, 0x62, 0x10, 0x84, 0x21, 0x08, + 0x41, 0x00, 0x20, 0x84, 0x10, 0x84, 0x21, 0x08, 0xC6, 0x23, 0x11, 0x00, + 0x18, 0x18, 0xD6, 0x38, 0x18, 0xF7, 0x18, 0x18, 0x08, 0x04, 0x02, 0x01, + 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0x6D, 0x95, 0x00, 0xFF, 0xC0, + 0xFF, 0x80, 0x06, 0x0C, 0x30, 0x60, 0x83, 0x04, 0x18, 0x20, 0xC1, 0x06, + 0x00, 0x0F, 0x0C, 0x8C, 0x6E, 0x37, 0x1B, 0x1F, 0x8F, 0xC7, 0xC7, 0x63, + 0xB1, 0x89, 0x83, 0x80, 0x06, 0x1E, 0x0E, 0x0E, 0x0C, 0x0C, 0x1C, 0x18, + 0x18, 0x18, 0x38, 0x38, 0xFC, 0x1F, 0x13, 0xD0, 0xE0, 0x70, 0x38, 0x38, + 0x18, 0x18, 0x18, 0x08, 0x08, 0x4F, 0xCF, 0xE0, 0x1F, 0x11, 0xC0, 0xE0, + 0x60, 0xC1, 0xF0, 0x38, 0x0C, 0x06, 0x03, 0x01, 0x19, 0x8F, 0x00, 0x00, + 0x80, 0xC0, 0xE1, 0xE0, 0xB0, 0x98, 0x9C, 0x8C, 0xFF, 0x07, 0x03, 0x01, + 0x80, 0x0F, 0x88, 0x08, 0x07, 0x83, 0xE0, 0x78, 0x1C, 0x06, 0x03, 0x01, + 0x80, 0x9C, 0x87, 0x80, 0x03, 0x87, 0x07, 0x07, 0x07, 0x03, 0xE3, 0x99, + 0xCC, 0xC6, 0x63, 0x33, 0x89, 0x87, 0x80, 0x3F, 0xBF, 0x90, 0x80, 0xC0, + 0x40, 0x60, 0x20, 0x30, 0x30, 0x10, 0x18, 0x08, 0x00, 0x1E, 0x13, 0x31, + 0x31, 0x3A, 0x1C, 0x1C, 0x6E, 0xC6, 0xC6, 0xC6, 0x44, 0x38, 0x0E, 0x1C, + 0x8C, 0x6C, 0x36, 0x3B, 0x1D, 0x8E, 0x7E, 0x0E, 0x07, 0x07, 0x0E, 0x0C, + 0x00, 0x39, 0xCE, 0x00, 0x03, 0x9C, 0xE0, 0x39, 0xCE, 0x00, 0x01, 0x8C, + 0x22, 0x20, 0x00, 0x01, 0xC3, 0xC7, 0x8E, 0x06, 0x01, 0xE0, 0x3C, 0x07, + 0x80, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x60, 0x1E, 0x03, + 0xC0, 0x78, 0x1C, 0x3C, 0x78, 0xF0, 0x40, 0x00, 0x1C, 0x27, 0x37, 0x07, + 0x0E, 0x1C, 0x30, 0x60, 0x40, 0x00, 0xE0, 0xE0, 0xE0, 0x0F, 0x80, 0xC3, + 0x08, 0x04, 0xC3, 0x3C, 0x24, 0xE2, 0x27, 0x33, 0x39, 0x11, 0xC9, 0x93, + 0x77, 0x18, 0x00, 0x70, 0x40, 0xFC, 0x00, 0x00, 0x80, 0x18, 0x01, 0x80, + 0x38, 0x05, 0x80, 0x5C, 0x09, 0xC1, 0x1C, 0x1F, 0xC2, 0x0C, 0x20, 0xC4, + 0x0E, 0xF3, 0xF0, 0x3F, 0xE0, 0xC7, 0x0C, 0x71, 0xC7, 0x1C, 0xE1, 0xF0, + 0x39, 0xC3, 0x8E, 0x38, 0xE3, 0x0E, 0x71, 0xE7, 0x1C, 0xFF, 0x00, 0x07, + 0xD1, 0xC7, 0x38, 0x27, 0x02, 0x70, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xE0, + 0x0E, 0x00, 0x60, 0x87, 0x18, 0x1E, 0x00, 0x3F, 0xE0, 0x30, 0xE0, 0xC1, + 0x87, 0x07, 0x1C, 0x1C, 0x60, 0x73, 0x81, 0xCE, 0x07, 0x38, 0x38, 0xC0, + 0xE7, 0x07, 0x1C, 0x78, 0xFF, 0x80, 0x1F, 0xF8, 0x61, 0xC3, 0x04, 0x38, + 0x81, 0xCC, 0x0F, 0xE0, 0xE2, 0x07, 0x10, 0x38, 0x81, 0x81, 0x1C, 0x18, + 0xE3, 0x8F, 0xFC, 0x00, 0x3F, 0xF8, 0x61, 0xC3, 0x04, 0x38, 0x81, 0xCC, + 0x0F, 0xE0, 0xE2, 0x07, 0x10, 0x38, 0x81, 0x80, 0x1C, 0x00, 0xE0, 0x0F, + 0x80, 0x00, 0x07, 0x91, 0xC7, 0x38, 0x27, 0x00, 0x70, 0x0F, 0x00, 0xE1, + 0xFE, 0x0E, 0xE0, 0xCE, 0x0C, 0x60, 0xC7, 0x1C, 0x1F, 0x00, 0x1F, 0x7E, + 0x1C, 0x38, 0x30, 0x60, 0xE1, 0xC1, 0xC3, 0x83, 0x06, 0x0F, 0xFC, 0x1C, + 0x38, 0x38, 0x70, 0x60, 0xC1, 0xC3, 0x83, 0x87, 0x0F, 0x9F, 0x00, 0x3F, + 0x0C, 0x0C, 0x1C, 0x1C, 0x18, 0x38, 0x38, 0x38, 0x30, 0x70, 0x70, 0xF8, + 0x07, 0xC0, 0xE0, 0x38, 0x0C, 0x07, 0x01, 0xC0, 0x70, 0x18, 0x0E, 0x03, + 0x80, 0xC3, 0x30, 0xDC, 0x1E, 0x00, 0x1F, 0x78, 0x71, 0x83, 0x18, 0x39, + 0x81, 0xD0, 0x0D, 0x00, 0xFC, 0x07, 0x60, 0x3B, 0x81, 0x8C, 0x1C, 0x70, + 0xE1, 0x8F, 0xBE, 0x00, 0x1F, 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x1C, 0x01, + 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x01, 0x70, 0x37, 0x0E, 0xFF, 0xE0, + 0x1E, 0x07, 0x87, 0x07, 0x83, 0x83, 0x82, 0xC3, 0xC1, 0x62, 0xE0, 0xB1, + 0x70, 0x99, 0x30, 0x4D, 0xB8, 0x27, 0x9C, 0x13, 0x8C, 0x11, 0xC6, 0x0C, + 0xC7, 0x0F, 0x47, 0xC0, 0x3C, 0x3C, 0x38, 0x20, 0xE0, 0x85, 0xC4, 0x13, + 0x10, 0x4E, 0x42, 0x3A, 0x08, 0x78, 0x21, 0xE0, 0x83, 0x84, 0x0C, 0x18, + 0x10, 0x00, 0x40, 0x07, 0xC1, 0xCE, 0x38, 0x73, 0x87, 0x70, 0x77, 0x07, + 0xF0, 0xFE, 0x0E, 0xE0, 0xEE, 0x1C, 0xE1, 0xC6, 0x38, 0x3E, 0x00, 0x3F, + 0xC0, 0xC7, 0x0C, 0x71, 0xC7, 0x1C, 0x71, 0x8E, 0x3F, 0xC3, 0x80, 0x30, + 0x03, 0x00, 0x70, 0x07, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0xCE, 0x38, 0x73, + 0x87, 0x70, 0x77, 0x07, 0xF0, 0x7E, 0x0E, 0xE0, 0xEE, 0x0C, 0xE1, 0xC6, + 0x38, 0x36, 0x01, 0x80, 0x3C, 0x2D, 0xFC, 0x3F, 0xC0, 0xE7, 0x0C, 0x71, + 0xC7, 0x1C, 0x71, 0x8E, 0x3F, 0x83, 0xB8, 0x3B, 0x83, 0x3C, 0x71, 0xC7, + 0x1C, 0xF9, 0xF0, 0x0C, 0x89, 0x8C, 0x46, 0x23, 0x80, 0xE0, 0x78, 0x0E, + 0x03, 0x21, 0x90, 0xCC, 0xC9, 0xC0, 0x7F, 0xE9, 0xDF, 0x31, 0x4E, 0x21, + 0xC0, 0x38, 0x06, 0x01, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x38, 0x0F, 0xC0, + 0x7C, 0xF3, 0x82, 0x30, 0x27, 0x04, 0x70, 0x46, 0x04, 0xE0, 0x4E, 0x08, + 0xE0, 0x8E, 0x08, 0xE1, 0x0F, 0x30, 0x3C, 0x00, 0xFC, 0x73, 0x82, 0x38, + 0x23, 0x84, 0x38, 0x83, 0x90, 0x39, 0x01, 0xA0, 0x1C, 0x01, 0xC0, 0x18, + 0x01, 0x00, 0xF9, 0xF7, 0x30, 0xE2, 0x30, 0xC2, 0x38, 0xC4, 0x3B, 0xC4, + 0x3A, 0xE8, 0x3C, 0xE8, 0x3C, 0xF0, 0x18, 0xF0, 0x18, 0x60, 0x10, 0x60, + 0x10, 0x40, 0x3F, 0x78, 0x61, 0x83, 0x98, 0x1D, 0x00, 0x70, 0x03, 0x80, + 0x1C, 0x01, 0x60, 0x0B, 0x80, 0x9C, 0x08, 0x60, 0xC3, 0x8F, 0x7E, 0x00, + 0xF9, 0xE6, 0x18, 0xC2, 0x1C, 0x81, 0xA0, 0x34, 0x07, 0x00, 0xC0, 0x18, + 0x07, 0x00, 0xE0, 0x1C, 0x0F, 0xC0, 0x3F, 0xE6, 0x19, 0x87, 0x21, 0xC0, + 0x30, 0x0E, 0x03, 0x80, 0x60, 0x1C, 0x07, 0x05, 0xC1, 0x38, 0xEF, 0xFC, + 0x0E, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, 0x30, 0x20, 0x60, 0x60, + 0x60, 0x40, 0xF0, 0xC6, 0x10, 0xC6, 0x10, 0x86, 0x30, 0x86, 0x30, 0x1E, + 0x0C, 0x18, 0x20, 0xC1, 0x83, 0x04, 0x18, 0x30, 0x60, 0x83, 0x06, 0x3C, + 0x00, 0x18, 0x1C, 0x34, 0x26, 0x66, 0x43, 0xC3, 0xFF, 0x80, 0xC6, 0x30, + 0x0D, 0x9D, 0x8C, 0xCC, 0x6E, 0x26, 0x33, 0x19, 0xBE, 0x66, 0x00, 0x00, + 0x78, 0x18, 0x30, 0x30, 0x3E, 0x73, 0x63, 0x63, 0x63, 0xC6, 0xC6, 0xCC, + 0x70, 0x0F, 0x3B, 0x70, 0x70, 0xE0, 0xE0, 0xE2, 0xE4, 0x78, 0x00, 0x00, + 0xF0, 0x1C, 0x06, 0x01, 0x83, 0xE3, 0x30, 0xCC, 0x63, 0x19, 0xCC, 0x63, + 0x38, 0xCF, 0x1D, 0x80, 0x0E, 0x75, 0xCB, 0xBE, 0xDE, 0x38, 0x72, 0x78, + 0x00, 0xE0, 0x34, 0x0C, 0x01, 0x80, 0x30, 0x1F, 0x01, 0x80, 0x30, 0x06, + 0x01, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x30, 0x06, 0x04, 0x80, 0xE0, 0x00, + 0x1C, 0x19, 0xD8, 0xCC, 0x66, 0x60, 0xE1, 0x80, 0xF0, 0x7E, 0x43, 0x21, + 0x8F, 0x00, 0x00, 0x1E, 0x07, 0x03, 0x01, 0x80, 0xD8, 0xFC, 0x76, 0x33, + 0x19, 0x99, 0xCC, 0xD6, 0x77, 0x30, 0x39, 0xC0, 0x0F, 0x31, 0x8C, 0xC6, + 0x31, 0xAE, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x18, + 0x0C, 0x06, 0x03, 0x03, 0x01, 0x80, 0xC2, 0xC1, 0xC0, 0x00, 0x0F, 0x00, + 0xC0, 0x60, 0x18, 0x06, 0xF3, 0x90, 0xC8, 0x34, 0x0F, 0x06, 0xC1, 0x98, + 0x66, 0xB9, 0xC0, 0x03, 0xCC, 0x63, 0x39, 0x8C, 0x66, 0x31, 0x8E, 0x70, + 0x7B, 0x99, 0xAF, 0xCE, 0x66, 0x63, 0x67, 0x33, 0x31, 0x99, 0x8C, 0xCC, + 0xE7, 0xC6, 0x30, 0x73, 0x7F, 0x73, 0x73, 0x63, 0x67, 0xE6, 0xC7, 0xC6, + 0x1E, 0x33, 0x63, 0x63, 0xC3, 0xC6, 0xC6, 0xCC, 0x78, 0x1D, 0xC3, 0xB1, + 0xCC, 0x63, 0x19, 0xCE, 0x63, 0x18, 0xCC, 0x3E, 0x1C, 0x06, 0x03, 0xE0, + 0x0D, 0x99, 0x8C, 0xCC, 0x6E, 0x76, 0x33, 0x19, 0x9C, 0x7C, 0x06, 0x07, + 0x07, 0xC0, 0x76, 0x3A, 0x30, 0x70, 0x60, 0x60, 0x60, 0xE0, 0x3D, 0x14, + 0x58, 0x38, 0x60, 0xA2, 0xF0, 0x08, 0xCC, 0xF6, 0x31, 0x98, 0xC6, 0x35, + 0xC0, 0xE3, 0x63, 0x66, 0x66, 0x66, 0xCC, 0xCC, 0xFE, 0xEC, 0xE6, 0xCD, + 0x8B, 0x26, 0x8E, 0x18, 0x20, 0xE4, 0xD9, 0x36, 0xE5, 0xDA, 0x77, 0x19, + 0xC6, 0x61, 0x10, 0x39, 0xC7, 0xB0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xE1, + 0x5A, 0x67, 0x00, 0x39, 0x8C, 0xC3, 0x21, 0xA0, 0xD0, 0x68, 0x38, 0x0C, + 0x04, 0x04, 0x14, 0x0C, 0x00, 0x3E, 0x46, 0x0C, 0x08, 0x10, 0x20, 0x70, + 0x1A, 0x0E, 0x03, 0x0E, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x10, 0x60, 0x30, + 0x30, 0x30, 0x60, 0x60, 0x60, 0x30, 0xFF, 0xF0, 0x0C, 0x06, 0x06, 0x06, + 0x04, 0x0C, 0x0C, 0x0C, 0x06, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0xE0, + 0x71, 0x8F}; + +const GFXglyph FreeSerifBoldItalic9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 6, 13, 7, 1, -11}, // 0x21 '!' + {10, 6, 5, 10, 3, -11}, // 0x22 '"' + {14, 11, 13, 9, -1, -12}, // 0x23 '#' + {32, 11, 15, 9, -1, -12}, // 0x24 '$' + {53, 14, 13, 15, 1, -11}, // 0x25 '%' + {76, 13, 13, 14, 0, -11}, // 0x26 '&' + {98, 2, 5, 5, 3, -11}, // 0x27 ''' + {100, 5, 16, 6, 1, -11}, // 0x28 '(' + {110, 5, 16, 6, -1, -11}, // 0x29 ')' + {120, 8, 8, 9, 1, -11}, // 0x2A '*' + {128, 9, 9, 10, 0, -8}, // 0x2B '+' + {139, 3, 6, 5, -1, -2}, // 0x2C ',' + {142, 5, 2, 6, 0, -4}, // 0x2D '-' + {144, 3, 3, 4, 0, -1}, // 0x2E '.' + {146, 7, 12, 6, 0, -11}, // 0x2F '/' + {157, 9, 13, 9, 0, -11}, // 0x30 '0' + {172, 8, 13, 9, 0, -11}, // 0x31 '1' + {185, 9, 13, 9, 0, -11}, // 0x32 '2' + {200, 9, 13, 9, 0, -11}, // 0x33 '3' + {215, 9, 12, 9, 0, -11}, // 0x34 '4' + {229, 9, 13, 9, 0, -11}, // 0x35 '5' + {244, 9, 13, 9, 1, -11}, // 0x36 '6' + {259, 9, 12, 9, 1, -11}, // 0x37 '7' + {273, 8, 13, 9, 0, -11}, // 0x38 '8' + {286, 9, 13, 9, 0, -11}, // 0x39 '9' + {301, 5, 9, 5, 0, -7}, // 0x3A ':' + {307, 5, 11, 5, 0, -7}, // 0x3B ';' + {314, 9, 10, 10, 1, -9}, // 0x3C '<' + {326, 9, 5, 10, 1, -6}, // 0x3D '=' + {332, 9, 10, 10, 1, -9}, // 0x3E '>' + {344, 8, 13, 9, 1, -11}, // 0x3F '?' + {357, 13, 13, 15, 1, -12}, // 0x40 '@' + {379, 12, 13, 13, 0, -11}, // 0x41 'A' + {399, 12, 13, 12, 0, -11}, // 0x42 'B' + {419, 12, 13, 11, 1, -11}, // 0x43 'C' + {439, 14, 13, 13, 0, -11}, // 0x44 'D' + {462, 13, 13, 11, 0, -11}, // 0x45 'E' + {484, 13, 13, 11, 0, -11}, // 0x46 'F' + {506, 12, 13, 13, 1, -11}, // 0x47 'G' + {526, 15, 13, 14, 0, -11}, // 0x48 'H' + {551, 8, 13, 7, 0, -11}, // 0x49 'I' + {564, 10, 14, 9, 0, -11}, // 0x4A 'J' + {582, 13, 13, 12, 0, -11}, // 0x4B 'K' + {604, 12, 13, 11, 0, -11}, // 0x4C 'L' + {624, 17, 13, 16, 0, -11}, // 0x4D 'M' + {652, 14, 13, 13, 0, -11}, // 0x4E 'N' + {675, 12, 13, 12, 1, -11}, // 0x4F 'O' + {695, 12, 13, 11, 0, -11}, // 0x50 'P' + {715, 12, 16, 12, 1, -11}, // 0x51 'Q' + {739, 12, 13, 12, 0, -11}, // 0x52 'R' + {759, 9, 13, 9, 0, -11}, // 0x53 'S' + {774, 11, 13, 11, 2, -11}, // 0x54 'T' + {792, 12, 13, 13, 2, -11}, // 0x55 'U' + {812, 12, 12, 13, 2, -11}, // 0x56 'V' + {830, 16, 12, 17, 2, -11}, // 0x57 'W' + {854, 13, 13, 13, 0, -11}, // 0x58 'X' + {876, 11, 13, 11, 2, -11}, // 0x59 'Y' + {894, 11, 13, 10, 0, -11}, // 0x5A 'Z' + {912, 8, 15, 6, -1, -11}, // 0x5B '[' + {927, 5, 12, 7, 2, -11}, // 0x5C '\' + {935, 7, 15, 6, -1, -11}, // 0x5D ']' + {949, 8, 7, 10, 1, -11}, // 0x5E '^' + {956, 9, 1, 9, 0, 3}, // 0x5F '_' + {958, 4, 3, 6, 2, -11}, // 0x60 '`' + {960, 9, 9, 9, 0, -7}, // 0x61 'a' + {971, 8, 14, 9, 0, -12}, // 0x62 'b' + {985, 8, 9, 8, 0, -7}, // 0x63 'c' + {994, 10, 14, 9, 0, -12}, // 0x64 'd' + {1012, 7, 9, 7, 0, -7}, // 0x65 'e' + {1020, 11, 17, 9, -2, -12}, // 0x66 'f' + {1044, 9, 12, 9, 0, -7}, // 0x67 'g' + {1058, 9, 14, 10, 0, -12}, // 0x68 'h' + {1074, 5, 13, 5, 1, -11}, // 0x69 'i' + {1083, 9, 16, 6, -1, -11}, // 0x6A 'j' + {1101, 10, 14, 9, 0, -12}, // 0x6B 'k' + {1119, 5, 14, 5, 1, -12}, // 0x6C 'l' + {1128, 13, 9, 14, 0, -7}, // 0x6D 'm' + {1143, 8, 9, 9, 0, -7}, // 0x6E 'n' + {1152, 8, 9, 9, 0, -7}, // 0x6F 'o' + {1161, 10, 12, 9, -2, -7}, // 0x70 'p' + {1176, 9, 12, 9, 0, -7}, // 0x71 'q' + {1190, 8, 8, 7, 0, -7}, // 0x72 'r' + {1198, 6, 9, 6, 0, -7}, // 0x73 's' + {1205, 5, 12, 5, 1, -10}, // 0x74 't' + {1213, 8, 9, 10, 1, -7}, // 0x75 'u' + {1222, 7, 8, 8, 1, -7}, // 0x76 'v' + {1229, 10, 8, 12, 1, -7}, // 0x77 'w' + {1239, 10, 9, 9, -1, -7}, // 0x78 'x' + {1251, 9, 12, 8, -1, -7}, // 0x79 'y' + {1265, 8, 9, 7, 0, -7}, // 0x7A 'z' + {1274, 8, 16, 6, 0, -12}, // 0x7B '{' + {1290, 1, 12, 5, 2, -11}, // 0x7C '|' + {1292, 8, 16, 6, -2, -12}, // 0x7D '}' + {1308, 8, 2, 10, 1, -4}}; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic9pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic9pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic9pt7bGlyphs, 0x20, 0x7E, 22}; + +// Approx. 1982 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h new file mode 100644 index 0000000..85de005 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h @@ -0,0 +1,273 @@ +#pragma once +#include + +const uint8_t FreeSerifItalic12pt7bBitmaps[] PROGMEM = { + 0x0C, 0x31, 0xC6, 0x18, 0x43, 0x0C, 0x20, 0x84, 0x10, 0x03, 0x0C, 0x30, + 0x66, 0xCD, 0x12, 0x24, 0x51, 0x00, 0x03, 0x10, 0x11, 0x80, 0x8C, 0x0C, + 0x40, 0x46, 0x1F, 0xFC, 0x21, 0x01, 0x18, 0x18, 0x80, 0x84, 0x3F, 0xF8, + 0x62, 0x02, 0x30, 0x31, 0x01, 0x08, 0x08, 0xC0, 0x00, 0x40, 0x08, 0x07, + 0xC0, 0xCA, 0x18, 0xA1, 0x92, 0x19, 0x01, 0xD0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x2E, 0x02, 0x64, 0x46, 0x44, 0x64, 0x46, 0x64, 0xC1, 0xF0, 0x08, + 0x00, 0x80, 0x00, 0x08, 0x0F, 0x0C, 0x0C, 0x7C, 0x0C, 0x22, 0x06, 0x12, + 0x06, 0x09, 0x03, 0x09, 0x01, 0x84, 0x80, 0xC4, 0x8F, 0x3C, 0x4C, 0x40, + 0x4C, 0x20, 0x4E, 0x10, 0x26, 0x08, 0x23, 0x08, 0x11, 0x84, 0x10, 0xC4, + 0x08, 0x3C, 0x00, 0x00, 0xE0, 0x02, 0x60, 0x0C, 0xC0, 0x19, 0x80, 0x36, + 0x00, 0x70, 0x00, 0xC0, 0x07, 0x9F, 0x33, 0x08, 0xC3, 0x13, 0x06, 0x46, + 0x0D, 0x0C, 0x0C, 0x18, 0x1C, 0x1C, 0x5C, 0x9F, 0x1E, 0xFA, 0xA0, 0x02, + 0x08, 0x20, 0xC3, 0x06, 0x18, 0x30, 0xE1, 0x83, 0x06, 0x0C, 0x18, 0x30, + 0x60, 0x40, 0x80, 0x81, 0x00, 0x08, 0x10, 0x10, 0x20, 0x40, 0xC1, 0x83, + 0x06, 0x0C, 0x18, 0x70, 0xC1, 0x83, 0x0C, 0x10, 0x41, 0x04, 0x00, 0x18, + 0x18, 0x18, 0x93, 0x74, 0x38, 0xD7, 0x93, 0x18, 0x18, 0x04, 0x00, 0x80, + 0x10, 0x02, 0x00, 0x41, 0xFF, 0xC1, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, + 0x00, 0x6C, 0x95, 0x00, 0xF8, 0xFC, 0x00, 0x40, 0x18, 0x02, 0x00, 0xC0, + 0x30, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x01, 0x00, 0x60, 0x18, 0x03, 0x00, + 0xC0, 0x10, 0x06, 0x00, 0x07, 0x81, 0x98, 0x61, 0x18, 0x33, 0x06, 0xC0, + 0xD8, 0x1B, 0x03, 0xE0, 0xF8, 0x1F, 0x03, 0x60, 0x6C, 0x19, 0x83, 0x10, + 0xC3, 0x30, 0x3C, 0x00, 0x01, 0x87, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x18, + 0x0C, 0x06, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, 0xFE, 0x00, + 0x0F, 0x0C, 0x64, 0x0C, 0x03, 0x00, 0xC0, 0x20, 0x18, 0x0C, 0x02, 0x01, + 0x00, 0x80, 0x40, 0x20, 0x10, 0x2F, 0xF0, 0x07, 0x86, 0x30, 0x0C, 0x03, + 0x01, 0x81, 0x81, 0xF0, 0x1E, 0x03, 0x80, 0x60, 0x18, 0x06, 0x01, 0x00, + 0xCC, 0x63, 0xE0, 0x00, 0x20, 0x0C, 0x03, 0x80, 0xA0, 0x2C, 0x09, 0x82, + 0x30, 0x84, 0x31, 0x8C, 0x33, 0x06, 0x7F, 0xE0, 0x30, 0x06, 0x00, 0x80, + 0x30, 0x03, 0xE1, 0x80, 0x20, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x06, + 0x00, 0xC0, 0x18, 0x03, 0x00, 0x40, 0x18, 0x02, 0x30, 0x87, 0xE0, 0x00, + 0x70, 0x3C, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x7F, 0x07, 0x18, 0x60, + 0xCE, 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCC, 0x18, 0x41, 0x86, 0x30, 0x3E, + 0x00, 0x7F, 0xF0, 0x18, 0x03, 0x00, 0xC0, 0x10, 0x06, 0x01, 0x80, 0x30, + 0x0C, 0x01, 0x00, 0x60, 0x08, 0x03, 0x00, 0xC0, 0x10, 0x06, 0x00, 0x0F, + 0x83, 0x18, 0xC1, 0x98, 0x33, 0x06, 0x71, 0x87, 0x60, 0x70, 0x17, 0x0C, + 0x71, 0x07, 0x60, 0x6C, 0x0D, 0x81, 0xB0, 0x63, 0x1C, 0x3E, 0x00, 0x07, + 0x83, 0x18, 0xC1, 0x18, 0x36, 0x06, 0xC0, 0xD8, 0x1B, 0x07, 0x60, 0xE6, + 0x38, 0x7F, 0x00, 0xC0, 0x30, 0x0C, 0x07, 0x03, 0xC0, 0xC0, 0x00, 0x33, + 0x30, 0x00, 0x00, 0xCC, 0xC0, 0x18, 0xC6, 0x00, 0x00, 0x00, 0x03, 0x18, + 0x44, 0x40, 0x00, 0x00, 0x03, 0x00, 0xF0, 0x38, 0x1E, 0x07, 0x80, 0xE0, + 0x0F, 0x00, 0x1C, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x00, 0x10, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x0C, 0x00, 0xF0, 0x01, + 0xC0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x0F, 0x03, 0xC1, 0xE0, 0x78, 0x0E, + 0x00, 0x80, 0x00, 0x3E, 0x21, 0x90, 0x60, 0x30, 0x38, 0x38, 0x30, 0x30, + 0x20, 0x20, 0x10, 0x00, 0x00, 0x06, 0x03, 0x01, 0x80, 0x07, 0xE0, 0x1C, + 0x18, 0x30, 0x04, 0x60, 0x02, 0x61, 0xDA, 0xC3, 0x31, 0xC6, 0x31, 0xC4, + 0x31, 0xCC, 0x31, 0xCC, 0x21, 0xCC, 0x62, 0x6C, 0xE4, 0x67, 0x38, 0x30, + 0x00, 0x1C, 0x08, 0x07, 0xF0, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x80, 0x0B, + 0x00, 0x16, 0x00, 0x4E, 0x00, 0x9C, 0x02, 0x18, 0x08, 0x30, 0x1F, 0xE0, + 0x40, 0xC1, 0x81, 0xC2, 0x03, 0x8C, 0x07, 0x3C, 0x1F, 0x80, 0x1F, 0xF0, + 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x38, 0x60, 0xC3, 0x03, 0xF0, + 0x1C, 0x30, 0x60, 0x61, 0x81, 0x86, 0x06, 0x38, 0x18, 0xC0, 0xC3, 0x06, + 0x3F, 0xF0, 0x01, 0xF9, 0x06, 0x0F, 0x1C, 0x06, 0x38, 0x02, 0x30, 0x02, + 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, + 0xC0, 0x00, 0xC0, 0x08, 0x60, 0x10, 0x30, 0x60, 0x1F, 0x80, 0x1F, 0xF0, + 0x07, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x03, 0x0E, 0x03, 0x0C, 0x03, + 0x0C, 0x03, 0x1C, 0x03, 0x1C, 0x07, 0x18, 0x06, 0x18, 0x06, 0x38, 0x0C, + 0x30, 0x18, 0x30, 0x70, 0xFF, 0x80, 0x1F, 0xFF, 0x07, 0x07, 0x06, 0x02, + 0x06, 0x02, 0x06, 0x00, 0x0E, 0x10, 0x0C, 0x30, 0x0F, 0xF0, 0x1C, 0x20, + 0x18, 0x20, 0x18, 0x00, 0x18, 0x00, 0x38, 0x04, 0x30, 0x08, 0x30, 0x38, + 0xFF, 0xF8, 0x1F, 0xFF, 0x07, 0x07, 0x07, 0x02, 0x06, 0x02, 0x06, 0x00, + 0x0E, 0x10, 0x0C, 0x30, 0x0F, 0xF0, 0x1C, 0x20, 0x1C, 0x20, 0x18, 0x00, + 0x18, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0xFC, 0x00, 0x01, 0xF1, + 0x06, 0x0F, 0x18, 0x07, 0x38, 0x02, 0x30, 0x02, 0x60, 0x00, 0x60, 0x00, + 0xE0, 0x00, 0xC0, 0x7F, 0xC0, 0x1C, 0xC0, 0x1C, 0xC0, 0x18, 0xC0, 0x18, + 0x60, 0x18, 0x30, 0x38, 0x0F, 0xC0, 0x1F, 0xC7, 0xE0, 0xE0, 0x70, 0x18, + 0x0E, 0x03, 0x01, 0x80, 0x60, 0x30, 0x1C, 0x0E, 0x03, 0x01, 0x80, 0x7F, + 0xF0, 0x1C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 0x81, + 0xC0, 0x60, 0x38, 0x0C, 0x06, 0x07, 0xE3, 0xF0, 0x1F, 0x83, 0x81, 0x80, + 0xC0, 0x60, 0x70, 0x30, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x81, 0x80, + 0xC1, 0xF8, 0x03, 0xF0, 0x0C, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x18, 0x03, + 0x80, 0x30, 0x03, 0x00, 0x30, 0x07, 0x00, 0x60, 0x06, 0x0C, 0xE0, 0xCC, + 0x07, 0x80, 0x1F, 0xCF, 0x83, 0x83, 0x81, 0x81, 0x00, 0xC3, 0x00, 0x62, + 0x00, 0x72, 0x00, 0x36, 0x00, 0x1E, 0x00, 0x1D, 0x80, 0x0C, 0xE0, 0x06, + 0x30, 0x03, 0x1C, 0x03, 0x87, 0x01, 0x81, 0x80, 0xC0, 0xE1, 0xF9, 0xFC, + 0x1F, 0xC0, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0, + 0x03, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x38, 0x0C, 0xC0, + 0x23, 0x03, 0xBF, 0xFE, 0x0F, 0x00, 0x78, 0x38, 0x07, 0x81, 0xC0, 0x38, + 0x0E, 0x02, 0xC0, 0x70, 0x3E, 0x05, 0xC1, 0x70, 0x2E, 0x13, 0x01, 0x31, + 0x98, 0x11, 0x89, 0xC0, 0x8C, 0x8C, 0x04, 0x6C, 0x60, 0x23, 0x43, 0x02, + 0x1C, 0x38, 0x10, 0xE1, 0x81, 0x86, 0x1C, 0x1F, 0x23, 0xF8, 0x1E, 0x07, + 0xC1, 0xC0, 0x60, 0x70, 0x10, 0x1C, 0x0C, 0x05, 0x82, 0x02, 0x60, 0x80, + 0x9C, 0x60, 0x23, 0x10, 0x10, 0xC4, 0x04, 0x19, 0x01, 0x06, 0xC0, 0x40, + 0xE0, 0x20, 0x38, 0x08, 0x0E, 0x06, 0x01, 0x03, 0xE0, 0x40, 0x01, 0xF0, + 0x0C, 0x10, 0x30, 0x10, 0xC0, 0x33, 0x00, 0x6E, 0x00, 0xD8, 0x01, 0xF0, + 0x03, 0xC0, 0x0D, 0x80, 0x1B, 0x00, 0x76, 0x00, 0xCC, 0x03, 0x08, 0x0C, + 0x18, 0x70, 0x0F, 0x80, 0x1F, 0xF0, 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x38, 0x30, 0xC1, 0x83, 0x0E, 0x1F, 0xE0, 0x60, 0x01, 0x80, 0x06, + 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x06, 0x10, + 0x30, 0x30, 0xC0, 0x33, 0x00, 0x66, 0x00, 0xD8, 0x01, 0xB0, 0x03, 0xE0, + 0x0F, 0x80, 0x1B, 0x00, 0x36, 0x00, 0xCC, 0x03, 0x98, 0x06, 0x18, 0x18, + 0x18, 0xC0, 0x0E, 0x00, 0x20, 0x01, 0xF8, 0x36, 0x7F, 0x80, 0x1F, 0xF0, + 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x38, 0x70, 0xC3, 0x83, 0xF8, + 0x1D, 0xC0, 0x63, 0x01, 0x8C, 0x06, 0x18, 0x38, 0x60, 0xC1, 0xC3, 0x03, + 0x3F, 0x0F, 0x07, 0x90, 0xC7, 0x18, 0x21, 0x82, 0x18, 0x01, 0xC0, 0x0E, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xC4, 0x0C, 0x40, 0xC6, 0x08, 0xE1, + 0x89, 0xE0, 0x7F, 0xFE, 0xC7, 0x1D, 0x0C, 0x14, 0x18, 0x20, 0x70, 0x00, + 0xE0, 0x01, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, + 0x01, 0xC0, 0x03, 0x00, 0x0E, 0x00, 0x7F, 0x80, 0x7E, 0x1F, 0x38, 0x0C, + 0x38, 0x0C, 0x30, 0x08, 0x30, 0x08, 0x70, 0x08, 0x70, 0x10, 0x60, 0x10, + 0x60, 0x10, 0xE0, 0x10, 0xC0, 0x20, 0xC0, 0x20, 0xC0, 0x60, 0xC0, 0x40, + 0x61, 0x80, 0x3F, 0x00, 0xFC, 0x3E, 0xE0, 0x18, 0xC0, 0x21, 0x80, 0xC3, + 0x81, 0x07, 0x04, 0x0E, 0x08, 0x0C, 0x20, 0x18, 0x80, 0x31, 0x00, 0x64, + 0x00, 0xF0, 0x01, 0xE0, 0x01, 0x80, 0x02, 0x00, 0x04, 0x00, 0xFD, 0xF8, + 0xF7, 0x07, 0x06, 0x30, 0x60, 0x63, 0x07, 0x04, 0x30, 0x70, 0x83, 0x8F, + 0x08, 0x38, 0xB1, 0x03, 0x93, 0x10, 0x19, 0x32, 0x01, 0xA3, 0x20, 0x1A, + 0x34, 0x01, 0xC3, 0x40, 0x1C, 0x38, 0x01, 0x83, 0x00, 0x18, 0x30, 0x01, + 0x02, 0x00, 0x1F, 0x9F, 0x0E, 0x06, 0x06, 0x04, 0x07, 0x08, 0x03, 0x10, + 0x03, 0x20, 0x03, 0xC0, 0x01, 0x80, 0x01, 0xC0, 0x03, 0xC0, 0x06, 0xE0, + 0x0C, 0x60, 0x18, 0x60, 0x30, 0x70, 0x70, 0x78, 0xF8, 0xFC, 0xFC, 0xFB, + 0x81, 0x8C, 0x08, 0x60, 0x83, 0x8C, 0x0C, 0xC0, 0x64, 0x03, 0xC0, 0x0C, + 0x00, 0xE0, 0x07, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x00, 0xC0, 0x1F, 0xC0, + 0x1F, 0xFE, 0x30, 0x38, 0xC0, 0xF1, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, + 0x70, 0x01, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, + 0x47, 0x01, 0x1C, 0x06, 0x7F, 0xF8, 0x07, 0x04, 0x08, 0x08, 0x08, 0x18, + 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, + 0x80, 0xE0, 0xC0, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x30, 0x18, 0x18, 0x08, + 0x0C, 0x04, 0x06, 0x06, 0x03, 0x03, 0x0E, 0x04, 0x08, 0x10, 0x60, 0x81, + 0x02, 0x04, 0x18, 0x20, 0x40, 0x81, 0x02, 0x08, 0x10, 0x20, 0x47, 0x80, + 0x0C, 0x03, 0x81, 0xE0, 0x4C, 0x33, 0x08, 0x66, 0x19, 0x03, 0xC0, 0xC0, + 0xFF, 0xF0, 0xCE, 0x63, 0x07, 0xA0, 0xCE, 0x18, 0x63, 0x04, 0x60, 0xC6, + 0x0C, 0xC0, 0xCC, 0x18, 0xC3, 0x8C, 0x5A, 0x79, 0xC0, 0x38, 0x06, 0x01, + 0x80, 0x40, 0x30, 0x0C, 0xE3, 0xCC, 0xC3, 0x70, 0xD8, 0x36, 0x19, 0x06, + 0xC3, 0x30, 0x8C, 0xC3, 0xE0, 0x0F, 0x0C, 0xCC, 0x6C, 0x06, 0x06, 0x03, + 0x01, 0x80, 0xC0, 0x73, 0x1E, 0x00, 0x00, 0x70, 0x01, 0x80, 0x0C, 0x00, + 0x60, 0x02, 0x03, 0xF0, 0x31, 0x83, 0x08, 0x30, 0xC3, 0x06, 0x18, 0x31, + 0x81, 0x8C, 0x18, 0x61, 0xCB, 0x16, 0x8F, 0x38, 0x07, 0x19, 0x31, 0x63, + 0x62, 0xEC, 0xD0, 0xC0, 0xC0, 0xE6, 0x78, 0x00, 0x38, 0x01, 0x30, 0x0C, + 0x00, 0x20, 0x01, 0x80, 0x06, 0x00, 0xFE, 0x00, 0x40, 0x03, 0x00, 0x0C, + 0x00, 0x30, 0x00, 0x80, 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x04, + 0x00, 0x30, 0x00, 0xC0, 0x02, 0x00, 0x90, 0x03, 0x80, 0x00, 0x07, 0xC0, + 0xC7, 0x18, 0x61, 0x86, 0x18, 0xE1, 0x8C, 0x07, 0x80, 0x80, 0x1C, 0x00, + 0xF0, 0x33, 0x84, 0x18, 0x80, 0x88, 0x08, 0x61, 0x03, 0xE0, 0x1C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x18, 0x01, 0x8E, 0x1B, 0x61, 0xC6, 0x38, 0x63, + 0x8C, 0x30, 0xC3, 0x0C, 0x60, 0xC6, 0x1A, 0x61, 0xA4, 0x1C, 0x18, 0xC6, + 0x00, 0x0B, 0xC6, 0x23, 0x18, 0x8C, 0x63, 0x5C, 0x01, 0x80, 0xC0, 0x60, + 0x00, 0x00, 0x0C, 0x1E, 0x02, 0x03, 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, + 0x18, 0x08, 0x0C, 0x06, 0x02, 0x1B, 0x0F, 0x00, 0x1C, 0x01, 0x80, 0x30, + 0x06, 0x01, 0x80, 0x33, 0xC6, 0x30, 0x88, 0x32, 0x06, 0x80, 0xF0, 0x1B, + 0x06, 0x60, 0xC4, 0x18, 0xD2, 0x0C, 0x3C, 0x61, 0x86, 0x18, 0xC3, 0x0C, + 0x21, 0x86, 0x18, 0x43, 0x2D, 0x38, 0x78, 0xE7, 0x0D, 0xB5, 0x8D, 0x1C, + 0xC7, 0x0C, 0x63, 0x8E, 0x31, 0x86, 0x30, 0xC3, 0x18, 0xC1, 0x0C, 0x61, + 0x84, 0xB0, 0xC6, 0xB0, 0x63, 0x80, 0x78, 0xE1, 0xB6, 0x14, 0x63, 0x84, + 0x38, 0xC3, 0x0C, 0x70, 0x86, 0x18, 0x61, 0x96, 0x1A, 0xC1, 0xC0, 0x0F, + 0x06, 0x63, 0x0D, 0x83, 0x60, 0xF0, 0x3C, 0x1B, 0x06, 0xC3, 0x39, 0x87, + 0x80, 0x1E, 0xF0, 0x39, 0xC1, 0x86, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30, + 0xC3, 0x06, 0x18, 0x60, 0xC6, 0x07, 0xC0, 0x60, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x1F, 0x00, 0x07, 0x81, 0x9C, 0x63, 0x98, 0x76, 0x0C, 0xC1, 0xB0, + 0x76, 0x0E, 0xC3, 0x98, 0xB1, 0xE6, 0x00, 0x80, 0x30, 0x06, 0x00, 0xC0, + 0xFC, 0x79, 0x8F, 0xC5, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, + 0x10, 0x00, 0x1E, 0x98, 0xCC, 0x27, 0x11, 0x80, 0xE0, 0x39, 0x0C, 0x86, + 0x62, 0x2E, 0x00, 0x08, 0x67, 0xCC, 0x30, 0xC6, 0x18, 0x61, 0x8C, 0x34, + 0xE0, 0xF0, 0xCC, 0x19, 0x83, 0x30, 0xC6, 0x18, 0x87, 0x31, 0x66, 0x3C, + 0xCB, 0x1A, 0x6B, 0x8E, 0x00, 0x70, 0xCC, 0x33, 0x04, 0xC2, 0x18, 0x86, + 0x41, 0x90, 0x68, 0x1C, 0x06, 0x01, 0x00, 0x61, 0x0F, 0x84, 0x36, 0x30, + 0xDC, 0xC1, 0x35, 0x08, 0xD4, 0x23, 0x91, 0x0E, 0x48, 0x30, 0xE0, 0xC3, + 0x02, 0x08, 0x00, 0x0C, 0x63, 0x4A, 0x07, 0x00, 0x70, 0x06, 0x00, 0x20, + 0x07, 0x00, 0xB0, 0x0B, 0x21, 0x14, 0xE1, 0x80, 0x38, 0x63, 0x0C, 0x30, + 0x86, 0x10, 0xC4, 0x0C, 0x81, 0xA0, 0x34, 0x07, 0x00, 0x60, 0x08, 0x02, + 0x00, 0x40, 0x10, 0x04, 0x07, 0x00, 0x1F, 0x90, 0x80, 0x80, 0xC0, 0xC0, + 0x40, 0x60, 0x60, 0x60, 0x38, 0x3E, 0x03, 0xA0, 0x60, 0x00, 0x83, 0x81, + 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x10, 0x10, 0x1C, 0x06, 0x03, 0x03, + 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x18, 0x07, 0x00, 0xFF, 0xFF, 0x07, + 0x00, 0xC0, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x80, + 0x60, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x78, + 0x18, 0x8C, 0x0F, 0x00}; + +const GFXglyph FreeSerifItalic12pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 6, 0, 1}, // 0x20 ' ' + {0, 6, 16, 8, 1, -15}, // 0x21 '!' + {12, 7, 6, 8, 3, -15}, // 0x22 '"' + {18, 13, 16, 12, 0, -15}, // 0x23 '#' + {44, 12, 20, 12, 0, -17}, // 0x24 '$' + {74, 17, 17, 20, 2, -16}, // 0x25 '%' + {111, 15, 16, 19, 2, -15}, // 0x26 '&' + {141, 2, 6, 5, 4, -15}, // 0x27 ''' + {143, 7, 20, 8, 1, -15}, // 0x28 '(' + {161, 7, 20, 8, 0, -15}, // 0x29 ')' + {179, 8, 10, 12, 4, -15}, // 0x2A '*' + {189, 11, 11, 16, 2, -10}, // 0x2B '+' + {205, 3, 6, 6, 0, -2}, // 0x2C ',' + {208, 5, 1, 8, 1, -5}, // 0x2D '-' + {209, 2, 3, 6, 1, -2}, // 0x2E '.' + {210, 11, 16, 7, 0, -15}, // 0x2F '/' + {232, 11, 17, 12, 1, -16}, // 0x30 '0' + {256, 9, 17, 12, 1, -16}, // 0x31 '1' + {276, 10, 15, 12, 1, -14}, // 0x32 '2' + {295, 10, 16, 12, 1, -15}, // 0x33 '3' + {315, 11, 16, 12, 0, -15}, // 0x34 '4' + {337, 11, 16, 12, 0, -15}, // 0x35 '5' + {359, 12, 17, 12, 1, -16}, // 0x36 '6' + {385, 11, 16, 12, 2, -15}, // 0x37 '7' + {407, 11, 17, 12, 1, -16}, // 0x38 '8' + {431, 11, 17, 12, 1, -16}, // 0x39 '9' + {455, 4, 11, 6, 1, -10}, // 0x3A ':' + {461, 5, 14, 6, 0, -10}, // 0x3B ';' + {470, 12, 13, 14, 1, -12}, // 0x3C '<' + {490, 12, 6, 16, 2, -8}, // 0x3D '=' + {499, 12, 13, 14, 2, -12}, // 0x3E '>' + {519, 9, 16, 11, 3, -15}, // 0x3F '?' + {537, 16, 16, 19, 2, -15}, // 0x40 '@' + {569, 15, 15, 16, 0, -14}, // 0x41 'A' + {598, 14, 16, 14, 0, -15}, // 0x42 'B' + {626, 16, 16, 15, 1, -15}, // 0x43 'C' + {658, 16, 16, 17, 0, -15}, // 0x44 'D' + {690, 16, 16, 14, 0, -15}, // 0x45 'E' + {722, 16, 16, 14, 0, -15}, // 0x46 'F' + {754, 16, 16, 17, 1, -15}, // 0x47 'G' + {786, 19, 16, 17, 0, -15}, // 0x48 'H' + {824, 9, 16, 8, 0, -15}, // 0x49 'I' + {842, 12, 16, 10, 0, -15}, // 0x4A 'J' + {866, 17, 16, 15, 0, -15}, // 0x4B 'K' + {900, 14, 16, 14, 0, -15}, // 0x4C 'L' + {928, 21, 16, 20, 0, -15}, // 0x4D 'M' + {970, 18, 16, 16, 0, -15}, // 0x4E 'N' + {1006, 15, 16, 16, 1, -15}, // 0x4F 'O' + {1036, 14, 16, 14, 0, -15}, // 0x50 'P' + {1064, 15, 20, 16, 1, -15}, // 0x51 'Q' + {1102, 14, 16, 15, 0, -15}, // 0x52 'R' + {1130, 12, 16, 11, 0, -15}, // 0x53 'S' + {1154, 15, 16, 14, 2, -15}, // 0x54 'T' + {1184, 16, 16, 17, 3, -15}, // 0x55 'U' + {1216, 15, 16, 16, 3, -15}, // 0x56 'V' + {1246, 20, 16, 21, 3, -15}, // 0x57 'W' + {1286, 16, 16, 16, 0, -15}, // 0x58 'X' + {1318, 13, 16, 14, 3, -15}, // 0x59 'Y' + {1344, 15, 16, 14, 0, -15}, // 0x5A 'Z' + {1374, 8, 20, 9, 1, -15}, // 0x5B '[' + {1394, 8, 16, 12, 3, -15}, // 0x5C '\' + {1410, 7, 20, 9, 1, -15}, // 0x5D ']' + {1428, 10, 9, 10, 0, -15}, // 0x5E '^' + {1440, 12, 1, 12, 0, 3}, // 0x5F '_' + {1442, 4, 4, 6, 3, -15}, // 0x60 '`' + {1444, 12, 11, 12, 0, -10}, // 0x61 'a' + {1461, 10, 16, 11, 1, -15}, // 0x62 'b' + {1481, 9, 11, 10, 1, -10}, // 0x63 'c' + {1494, 13, 16, 12, 0, -15}, // 0x64 'd' + {1520, 8, 11, 10, 1, -10}, // 0x65 'e' + {1531, 14, 22, 10, -2, -16}, // 0x66 'f' + {1570, 12, 16, 11, -1, -10}, // 0x67 'g' + {1594, 12, 16, 12, 0, -15}, // 0x68 'h' + {1618, 5, 16, 6, 1, -15}, // 0x69 'i' + {1628, 9, 21, 7, -2, -15}, // 0x6A 'j' + {1652, 11, 16, 11, 0, -15}, // 0x6B 'k' + {1674, 6, 16, 6, 1, -15}, // 0x6C 'l' + {1686, 17, 11, 17, 0, -10}, // 0x6D 'm' + {1710, 12, 11, 12, 0, -10}, // 0x6E 'n' + {1727, 10, 11, 11, 1, -10}, // 0x6F 'o' + {1741, 13, 16, 11, -2, -10}, // 0x70 'p' + {1767, 11, 16, 12, 0, -10}, // 0x71 'q' + {1789, 9, 11, 9, 0, -10}, // 0x72 'r' + {1802, 9, 11, 8, 0, -10}, // 0x73 's' + {1815, 6, 13, 6, 1, -12}, // 0x74 't' + {1825, 11, 11, 12, 1, -10}, // 0x75 'u' + {1841, 10, 11, 11, 1, -10}, // 0x76 'v' + {1855, 14, 11, 16, 2, -10}, // 0x77 'w' + {1875, 12, 11, 10, -1, -10}, // 0x78 'x' + {1892, 11, 16, 11, 0, -10}, // 0x79 'y' + {1914, 9, 13, 9, 0, -10}, // 0x7A 'z' + {1929, 9, 21, 10, 1, -16}, // 0x7B '{' + {1953, 1, 16, 7, 3, -15}, // 0x7C '|' + {1955, 9, 21, 10, 0, -16}, // 0x7D '}' + {1979, 11, 3, 13, 1, -6}}; // 0x7E '~' + +const GFXfont FreeSerifItalic12pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic12pt7bBitmaps, + (GFXglyph *)FreeSerifItalic12pt7bGlyphs, 0x20, 0x7E, 29}; + +// Approx. 2656 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h new file mode 100644 index 0000000..c25db35 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h @@ -0,0 +1,452 @@ +#pragma once +#include + +const uint8_t FreeSerifItalic18pt7bBitmaps[] PROGMEM = { + 0x01, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0x81, 0xE0, 0x70, 0x1C, 0x06, 0x01, + 0x80, 0xC0, 0x30, 0x0C, 0x02, 0x01, 0x80, 0x40, 0x10, 0x00, 0x00, 0x01, + 0x80, 0xF0, 0x3C, 0x06, 0x00, 0x38, 0x77, 0x8F, 0x78, 0xF7, 0x0E, 0x60, + 0xE6, 0x0C, 0xC1, 0x8C, 0x18, 0x81, 0x00, 0x00, 0x60, 0xC0, 0x0C, 0x38, + 0x03, 0x86, 0x00, 0x60, 0xC0, 0x0C, 0x38, 0x03, 0x06, 0x00, 0x60, 0xC0, + 0xFF, 0xFF, 0x1F, 0xFF, 0xE0, 0x61, 0xC0, 0x1C, 0x30, 0x03, 0x06, 0x00, + 0x61, 0xC0, 0x18, 0x30, 0x3F, 0xFF, 0xC7, 0xFF, 0xF8, 0x18, 0x30, 0x03, + 0x0E, 0x00, 0xE1, 0x80, 0x18, 0x30, 0x03, 0x0C, 0x00, 0xC1, 0x80, 0x18, + 0x70, 0x00, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x0F, 0xC0, 0x61, 0xE1, + 0x86, 0xC6, 0x0D, 0x8C, 0x1A, 0x18, 0x24, 0x38, 0xC0, 0x39, 0x80, 0x7F, + 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xDC, 0x03, 0x38, + 0x06, 0x32, 0x0C, 0x64, 0x18, 0xDC, 0x71, 0xB8, 0xC6, 0x39, 0x8C, 0x3F, + 0x30, 0x1F, 0x80, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x07, 0x80, 0x60, + 0x0F, 0xE0, 0xE0, 0x0F, 0x0F, 0xB0, 0x0E, 0x04, 0x30, 0x07, 0x02, 0x18, + 0x07, 0x01, 0x18, 0x03, 0x00, 0x8C, 0x01, 0x80, 0x8C, 0x00, 0xC0, 0x4C, + 0x00, 0x60, 0x66, 0x1F, 0x30, 0x66, 0x1F, 0xCC, 0x63, 0x1C, 0x67, 0xE3, + 0x1C, 0x19, 0xE1, 0x1C, 0x04, 0x01, 0x8C, 0x02, 0x00, 0x8E, 0x01, 0x00, + 0xC7, 0x00, 0x80, 0xC3, 0x00, 0x80, 0x61, 0x80, 0xC0, 0x60, 0xC0, 0xC0, + 0x20, 0x70, 0xE0, 0x30, 0x1F, 0xC0, 0x10, 0x07, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xFC, 0x00, 0x07, 0x18, 0x00, 0x18, 0x60, 0x00, 0xE1, 0x80, 0x03, + 0x8C, 0x00, 0x0E, 0x60, 0x00, 0x3B, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x7F, 0x1F, 0xC3, 0x3C, 0x1C, 0x38, 0x70, 0x61, 0xE1, 0xE3, 0x87, + 0x07, 0x8C, 0x3C, 0x0F, 0x60, 0xF0, 0x3D, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xE0, 0x3E, 0x07, 0xC0, 0x7C, 0x77, 0x84, 0xFF, 0x8F, 0xE1, 0xF8, 0x0F, + 0x00, 0x3B, 0xDE, 0xE7, 0x33, 0x18, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, + 0xC0, 0xC0, 0xE0, 0x60, 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x01, 0x00, 0x80, 0x40, 0x30, + 0x08, 0x04, 0x02, 0x00, 0x04, 0x01, 0x00, 0x80, 0x60, 0x10, 0x08, 0x04, + 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x81, + 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x18, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x06, 0x00, 0x60, 0x06, 0x0C, 0x43, 0xE4, 0xF1, 0x58, 0x0E, 0x00, + 0xF0, 0x74, 0xEE, 0x47, 0xC4, 0x30, 0x60, 0x06, 0x00, 0x60, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x31, 0xCE, + 0x31, 0x08, 0x98, 0xFF, 0xFF, 0x6F, 0xF6, 0x00, 0x06, 0x00, 0x0E, 0x00, + 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, + 0xE0, 0x00, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, + 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, + 0x00, 0x60, 0x00, 0xE0, 0x00, 0x00, 0x78, 0x00, 0xC3, 0x00, 0xC1, 0xC0, + 0xC0, 0x60, 0xE0, 0x30, 0xE0, 0x1C, 0x70, 0x0E, 0x70, 0x07, 0x38, 0x03, + 0xBC, 0x01, 0xDC, 0x01, 0xEE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3B, 0x80, + 0x1D, 0xC0, 0x1E, 0xE0, 0x0E, 0x70, 0x0F, 0x38, 0x07, 0x1C, 0x07, 0x06, + 0x03, 0x83, 0x83, 0x80, 0xC3, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x7F, 0x00, + 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x01, + 0xC0, 0x38, 0x03, 0x80, 0x38, 0x03, 0x80, 0x70, 0x07, 0x00, 0x70, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x1E, 0x0F, 0xF8, 0x01, 0xF0, 0x07, 0xFC, + 0x0C, 0x3E, 0x10, 0x1F, 0x20, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, + 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x04, + 0x30, 0x0C, 0x7F, 0xF8, 0xFF, 0xF0, 0x00, 0x7C, 0x00, 0xFF, 0x00, 0xC3, + 0xC0, 0x80, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1C, 0x00, + 0x38, 0x00, 0xF0, 0x03, 0xFC, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x01, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x03, 0x07, 0x87, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x01, 0x80, + 0x01, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0xB0, 0x01, 0xB8, + 0x01, 0x9C, 0x01, 0x8C, 0x00, 0x86, 0x00, 0x87, 0x00, 0x83, 0x80, 0x81, + 0x80, 0x81, 0xC0, 0xC0, 0xE0, 0xC0, 0x70, 0xFF, 0xFF, 0x7F, 0xFF, 0x00, + 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0x80, + 0x01, 0xFF, 0x01, 0xFF, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, + 0x0F, 0xC0, 0x0F, 0xF0, 0x00, 0xF8, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, + 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, + 0x00, 0x30, 0x00, 0x30, 0x70, 0xE0, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x03, + 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, + 0x00, 0x3C, 0x00, 0x3D, 0xF0, 0x1F, 0xFE, 0x1F, 0x0F, 0x8E, 0x03, 0xC7, + 0x00, 0xF7, 0x00, 0x7B, 0x80, 0x3D, 0x80, 0x1E, 0xC0, 0x0F, 0x60, 0x0F, + 0xB0, 0x07, 0x98, 0x03, 0xC4, 0x03, 0xC3, 0x03, 0xC0, 0xC3, 0x80, 0x1F, + 0x00, 0x3F, 0xFF, 0x7F, 0xFE, 0x40, 0x0E, 0x80, 0x0C, 0x00, 0x18, 0x00, + 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xC0, 0x01, 0xC0, 0x01, + 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, + 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0x00, + 0xF8, 0x03, 0x0E, 0x06, 0x06, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, + 0x03, 0x0E, 0x06, 0x07, 0x8E, 0x07, 0xD8, 0x03, 0xE0, 0x07, 0xF0, 0x1C, + 0xF8, 0x30, 0x3C, 0x60, 0x1C, 0x60, 0x0E, 0xC0, 0x06, 0xC0, 0x06, 0xC0, + 0x06, 0xC0, 0x06, 0xE0, 0x0C, 0x60, 0x18, 0x38, 0x30, 0x0F, 0xC0, 0x01, + 0xF8, 0x07, 0x8C, 0x0E, 0x06, 0x1E, 0x02, 0x3C, 0x03, 0x3C, 0x03, 0x78, + 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x07, 0x78, 0x07, 0x78, 0x07, 0x3C, + 0x0E, 0x3E, 0x1E, 0x1F, 0xEE, 0x07, 0x9C, 0x00, 0x38, 0x00, 0x78, 0x00, + 0x70, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xE0, 0x00, 0x0C, + 0x3C, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1E, 0x18, + 0x00, 0x07, 0x03, 0xC1, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x03, 0x81, 0xC0, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0x01, 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x01, + 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xE0, + 0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, + 0x00, 0x03, 0xC0, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, + 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x01, + 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x01, 0xF0, 0x03, 0xF0, 0x03, + 0xF0, 0x00, 0xF0, 0x00, 0x20, 0x00, 0x00, 0x0F, 0x81, 0x86, 0x30, 0x33, + 0x03, 0x30, 0x30, 0x03, 0x00, 0x60, 0x0E, 0x01, 0xC0, 0x38, 0x06, 0x00, + 0xC0, 0x08, 0x01, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x00, 0x00, 0x7F, 0x00, 0x03, 0xFF, 0xE0, + 0x07, 0x80, 0xF0, 0x0E, 0x00, 0x38, 0x1C, 0x00, 0x0C, 0x38, 0x0E, 0x06, + 0x70, 0x3F, 0xE2, 0x70, 0x71, 0xE3, 0xF0, 0x60, 0xE1, 0xE0, 0xC0, 0xC1, + 0xE0, 0xC0, 0xC1, 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0x82, + 0xE1, 0x83, 0x82, 0x71, 0x83, 0x86, 0x71, 0xC7, 0x8C, 0x38, 0xF9, 0xF8, + 0x3C, 0xF0, 0xF0, 0x1E, 0x00, 0x00, 0x0F, 0x80, 0x30, 0x03, 0xFF, 0xE0, + 0x00, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, + 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x5E, 0x00, 0x04, 0xF0, + 0x00, 0x63, 0x80, 0x02, 0x1C, 0x00, 0x20, 0xE0, 0x01, 0x07, 0x00, 0x10, + 0x3C, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0xC0, 0x38, 0x04, 0x01, 0xC0, + 0x60, 0x0E, 0x06, 0x00, 0x78, 0x30, 0x03, 0xC3, 0x00, 0x1E, 0x38, 0x00, + 0xFB, 0xF0, 0x1F, 0xE0, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x78, 0x3C, + 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x01, 0xE0, 0x78, + 0x1E, 0x03, 0x83, 0xE0, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0x0F, 0x00, + 0x70, 0x3C, 0x03, 0x80, 0xF0, 0x3C, 0x07, 0x81, 0xC0, 0x3C, 0x0E, 0x01, + 0xE0, 0xF0, 0x0F, 0x07, 0x80, 0xF0, 0x38, 0x0F, 0x81, 0xC1, 0xF8, 0x1F, + 0xFF, 0x83, 0xFF, 0xE0, 0x00, 0x00, 0x3F, 0x08, 0x07, 0xFF, 0xC0, 0xF8, + 0x3E, 0x0F, 0x00, 0x70, 0xF0, 0x03, 0x8F, 0x00, 0x08, 0xF0, 0x00, 0x47, + 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x03, 0x80, 0x02, 0x1E, 0x00, 0x20, 0x78, 0x02, 0x03, 0xE0, 0x60, + 0x07, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0xFF, 0xFC, + 0x00, 0x78, 0x1F, 0x00, 0x3C, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x0E, 0x00, + 0x78, 0x07, 0x00, 0x1E, 0x07, 0x80, 0x0F, 0x03, 0x80, 0x07, 0x81, 0xC0, + 0x03, 0xC1, 0xE0, 0x01, 0xE0, 0xF0, 0x00, 0xF0, 0x70, 0x00, 0x78, 0x38, + 0x00, 0x78, 0x3C, 0x00, 0x3C, 0x1E, 0x00, 0x3E, 0x0E, 0x00, 0x1E, 0x0F, + 0x00, 0x1E, 0x07, 0x80, 0x1E, 0x03, 0x80, 0x3E, 0x01, 0xC0, 0x7E, 0x01, + 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xF0, + 0x1E, 0x01, 0xC0, 0x78, 0x02, 0x01, 0xE0, 0x08, 0x07, 0x00, 0x00, 0x1C, + 0x08, 0x00, 0xF0, 0x60, 0x03, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xF0, + 0x01, 0xE0, 0xC0, 0x07, 0x03, 0x00, 0x1C, 0x08, 0x00, 0xF0, 0x20, 0x03, + 0x80, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x81, 0xE0, 0x06, 0x07, 0x00, + 0x38, 0x1C, 0x03, 0xC0, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, + 0xFC, 0x07, 0xFF, 0xF0, 0x1E, 0x01, 0xC0, 0x78, 0x02, 0x01, 0xE0, 0x08, + 0x07, 0x00, 0x20, 0x1C, 0x00, 0x00, 0xF0, 0x20, 0x03, 0x81, 0x80, 0x0E, + 0x0C, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x07, 0x03, 0x00, 0x1C, 0x0C, + 0x00, 0xF0, 0x20, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x01, + 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xF8, + 0x00, 0x00, 0x00, 0x3F, 0x02, 0x01, 0xFF, 0x88, 0x0F, 0x81, 0xF0, 0x3C, + 0x01, 0xE0, 0xF0, 0x01, 0xC3, 0xC0, 0x01, 0x0F, 0x80, 0x02, 0x1E, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00, + 0x0F, 0x00, 0x3F, 0xFE, 0x00, 0x1E, 0x3C, 0x00, 0x38, 0x78, 0x00, 0x70, + 0xF0, 0x00, 0xE0, 0xE0, 0x01, 0xC1, 0xE0, 0x07, 0x01, 0xE0, 0x0E, 0x01, + 0xF0, 0x3C, 0x01, 0xFF, 0xF0, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x3F, + 0xE0, 0x3E, 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x1C, + 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x70, + 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1F, 0xFF, 0xF0, 0x03, 0xFF, + 0xFE, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, + 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x78, 0x03, 0xC0, 0x0E, 0x00, 0x78, 0x01, + 0xC0, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x0E, 0x00, 0x78, 0x03, 0xE0, 0x3F, + 0xE1, 0xFF, 0x00, 0x07, 0xFC, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x0F, + 0x00, 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x70, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, + 0x1E, 0x78, 0x0F, 0x38, 0x07, 0xF8, 0x01, 0xF0, 0x00, 0x07, 0xFC, 0x7F, + 0x80, 0xF8, 0x0F, 0x00, 0x38, 0x07, 0x00, 0x3C, 0x07, 0x00, 0x1C, 0x06, + 0x00, 0x0E, 0x06, 0x00, 0x07, 0x0C, 0x00, 0x07, 0x8C, 0x00, 0x03, 0x9C, + 0x00, 0x01, 0xD8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x73, + 0x80, 0x00, 0x39, 0xE0, 0x00, 0x3C, 0x78, 0x00, 0x1C, 0x1C, 0x00, 0x0E, + 0x0F, 0x00, 0x07, 0x03, 0x80, 0x07, 0x81, 0xE0, 0x03, 0x80, 0x70, 0x01, + 0xC0, 0x3C, 0x01, 0xE0, 0x1F, 0x03, 0xFE, 0x3F, 0xE0, 0x07, 0xFC, 0x00, + 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, + 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, + 0x00, 0x78, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00, 0xE0, + 0x00, 0x0E, 0x00, 0x11, 0xE0, 0x03, 0x1E, 0x00, 0x61, 0xC0, 0x06, 0x1C, + 0x01, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0x07, 0xF0, 0x00, 0x7E, 0x03, + 0xE0, 0x01, 0xF0, 0x03, 0xC0, 0x03, 0xE0, 0x07, 0x80, 0x0F, 0x80, 0x1F, + 0x00, 0x37, 0x00, 0x2E, 0x00, 0x5E, 0x00, 0x5C, 0x01, 0xB8, 0x01, 0xB8, + 0x06, 0x70, 0x02, 0x78, 0x09, 0xE0, 0x04, 0x70, 0x33, 0xC0, 0x08, 0xE0, + 0xC7, 0x00, 0x31, 0xC1, 0x0E, 0x00, 0x43, 0x86, 0x3C, 0x00, 0x87, 0x18, + 0x70, 0x03, 0x0E, 0x20, 0xE0, 0x06, 0x1C, 0xC3, 0xC0, 0x08, 0x3B, 0x07, + 0x80, 0x10, 0x7C, 0x0E, 0x00, 0x60, 0x78, 0x1C, 0x00, 0x80, 0xE0, 0x78, + 0x03, 0x01, 0x80, 0xF0, 0x07, 0x03, 0x03, 0xE0, 0x3F, 0x84, 0x1F, 0xF0, + 0x00, 0x07, 0xC0, 0x3F, 0xC0, 0x78, 0x03, 0xE0, 0x0E, 0x00, 0x70, 0x03, + 0xC0, 0x18, 0x01, 0xF0, 0x0E, 0x00, 0x6C, 0x03, 0x00, 0x1B, 0x80, 0xC0, + 0x0C, 0xE0, 0x30, 0x03, 0x18, 0x1C, 0x00, 0xC7, 0x06, 0x00, 0x30, 0xC1, + 0x80, 0x18, 0x38, 0xE0, 0x06, 0x06, 0x30, 0x01, 0x81, 0x8C, 0x00, 0xC0, + 0x73, 0x00, 0x30, 0x0D, 0xC0, 0x0C, 0x03, 0xE0, 0x03, 0x00, 0x78, 0x01, + 0x80, 0x1E, 0x00, 0x60, 0x07, 0x00, 0x38, 0x00, 0xC0, 0x0E, 0x00, 0x30, + 0x0F, 0xE0, 0x04, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x07, 0xC1, + 0xE0, 0x1E, 0x01, 0xE0, 0x78, 0x01, 0xC1, 0xE0, 0x03, 0xC7, 0x80, 0x07, + 0x9F, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF8, 0x00, 0x3D, 0xE0, 0x00, 0xFF, + 0xC0, 0x01, 0xEF, 0x80, 0x03, 0xDE, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0x78, + 0x00, 0x7C, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC1, 0xC0, 0x0F, 0x03, 0xC0, + 0x3C, 0x03, 0xC1, 0xF0, 0x03, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x00, 0x07, + 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x0E, 0x0F, 0x80, 0x78, 0x1F, 0x01, 0xC0, + 0x3C, 0x07, 0x00, 0xF0, 0x1C, 0x03, 0xC0, 0xF0, 0x0F, 0x03, 0x80, 0x78, + 0x0E, 0x01, 0xE0, 0x78, 0x1F, 0x01, 0xFF, 0xF8, 0x07, 0x7F, 0x00, 0x1C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xC1, 0xE0, + 0x1E, 0x01, 0xC0, 0x78, 0x03, 0xC1, 0xE0, 0x03, 0x87, 0x80, 0x07, 0x8F, + 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xC0, + 0x01, 0xFF, 0x80, 0x03, 0xDE, 0x00, 0x07, 0xBC, 0x00, 0x1F, 0x78, 0x00, + 0x3C, 0xF0, 0x00, 0xF1, 0xE0, 0x01, 0xE3, 0xC0, 0x07, 0x83, 0x80, 0x1E, + 0x07, 0x80, 0x78, 0x07, 0x01, 0xC0, 0x03, 0xDE, 0x00, 0x01, 0xC0, 0x00, + 0x06, 0x00, 0x00, 0x18, 0x00, 0x10, 0x7F, 0xC0, 0xC3, 0xFF, 0xFF, 0x08, + 0x07, 0xF0, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x78, 0x3C, 0x03, + 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x01, 0xE0, 0x78, 0x1E, + 0x03, 0x83, 0xF0, 0x1F, 0xFE, 0x01, 0xFF, 0xC0, 0x0F, 0x38, 0x00, 0x71, + 0xE0, 0x03, 0x87, 0x00, 0x3C, 0x38, 0x01, 0xC1, 0xE0, 0x0E, 0x07, 0x00, + 0xF0, 0x3C, 0x07, 0x81, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x3C, 0x1E, 0x00, + 0xF3, 0xFC, 0x07, 0xC0, 0x00, 0xF8, 0x81, 0xFF, 0xC1, 0xE1, 0xE1, 0xE0, + 0x70, 0xF0, 0x10, 0x78, 0x08, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, + 0x80, 0x3C, 0x40, 0x1E, 0x20, 0x0F, 0x38, 0x07, 0x9E, 0x07, 0x8F, 0x87, + 0x84, 0x7F, 0xC2, 0x0F, 0x80, 0x3F, 0xFF, 0xF7, 0xFF, 0xFF, 0x70, 0x78, + 0x76, 0x07, 0x02, 0xC0, 0x70, 0x28, 0x0F, 0x02, 0x00, 0xF0, 0x00, 0x0E, + 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, 0x00, + 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, + 0xFF, 0xE0, 0x00, 0x7F, 0xE0, 0xFE, 0x3F, 0x00, 0x78, 0x3C, 0x00, 0x60, + 0xF0, 0x01, 0x81, 0xE0, 0x03, 0x03, 0xC0, 0x06, 0x07, 0x00, 0x08, 0x1E, + 0x00, 0x30, 0x3C, 0x00, 0x60, 0x70, 0x00, 0x81, 0xE0, 0x01, 0x03, 0xC0, + 0x06, 0x07, 0x80, 0x0C, 0x0E, 0x00, 0x10, 0x3C, 0x00, 0x60, 0x78, 0x00, + 0xC0, 0xF0, 0x01, 0x01, 0xE0, 0x06, 0x03, 0xC0, 0x08, 0x03, 0xC0, 0x30, + 0x07, 0xC1, 0xC0, 0x07, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFF, 0x01, + 0xFB, 0xE0, 0x07, 0x8E, 0x00, 0x18, 0x78, 0x01, 0x83, 0xC0, 0x0C, 0x1E, + 0x00, 0xC0, 0xF0, 0x06, 0x03, 0x80, 0x60, 0x1C, 0x02, 0x00, 0xE0, 0x30, + 0x07, 0x83, 0x00, 0x3C, 0x10, 0x01, 0xE1, 0x80, 0x07, 0x08, 0x00, 0x38, + 0x80, 0x01, 0xC4, 0x00, 0x0E, 0x40, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFF, + 0x3F, 0xC3, 0xFB, 0xE0, 0x78, 0x07, 0x8E, 0x03, 0xC0, 0x18, 0x78, 0x0E, + 0x01, 0x83, 0xC0, 0x70, 0x0C, 0x1E, 0x03, 0x80, 0x40, 0xF0, 0x3C, 0x06, + 0x03, 0x81, 0xE0, 0x60, 0x1C, 0x17, 0x83, 0x00, 0xE0, 0xBC, 0x30, 0x07, + 0x09, 0xE1, 0x00, 0x38, 0x47, 0x18, 0x01, 0xE4, 0x38, 0x80, 0x0F, 0x21, + 0xCC, 0x00, 0x7A, 0x0E, 0x40, 0x01, 0xD0, 0x76, 0x00, 0x0F, 0x03, 0xA0, + 0x00, 0x78, 0x1F, 0x00, 0x03, 0x80, 0xF0, 0x00, 0x1C, 0x07, 0x00, 0x00, + 0xC0, 0x38, 0x00, 0x06, 0x00, 0x80, 0x00, 0x20, 0x04, 0x00, 0x00, 0x0F, + 0xF8, 0x7F, 0x03, 0xE0, 0x3E, 0x01, 0xC0, 0x18, 0x01, 0xE0, 0x30, 0x01, + 0xE0, 0x60, 0x00, 0xE0, 0xC0, 0x00, 0xF1, 0xC0, 0x00, 0x71, 0x80, 0x00, + 0x7B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xCE, 0x00, 0x01, 0x8F, 0x00, 0x01, + 0x07, 0x00, 0x03, 0x07, 0x00, 0x06, 0x07, 0x80, 0x0C, 0x03, 0x80, 0x18, + 0x03, 0xC0, 0x78, 0x03, 0xE0, 0xFE, 0x1F, 0xF8, 0xFF, 0x87, 0xE7, 0xC0, + 0x38, 0x70, 0x06, 0x0E, 0x01, 0x81, 0xE0, 0x30, 0x1C, 0x0C, 0x03, 0x83, + 0x00, 0x78, 0xC0, 0x07, 0x30, 0x00, 0xE4, 0x00, 0x1D, 0x80, 0x03, 0xE0, + 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, + 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, + 0x3F, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xE0, 0xE0, 0x0F, 0x82, + 0x00, 0x3C, 0x18, 0x01, 0xE0, 0x40, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x07, + 0x80, 0x00, 0x3C, 0x00, 0xC1, 0xE0, 0x02, 0x0F, 0x00, 0x18, 0x38, 0x01, + 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x01, 0xF8, 0x0C, 0x00, 0xC0, + 0x06, 0x00, 0x30, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03, + 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x03, 0x00, 0x18, 0x01, 0xC0, + 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x06, + 0x00, 0x30, 0x01, 0xF8, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x30, + 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x07, + 0x00, 0x30, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, + 0x60, 0x07, 0x00, 0x30, 0x03, 0xF0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x01, 0x80, + 0x18, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x1F, 0x00, 0x36, 0x00, 0xCE, 0x01, 0x8C, 0x06, 0x1C, 0x0C, + 0x18, 0x38, 0x38, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x6E, 0x00, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0xE3, 0x8F, 0x0E, 0x18, 0x30, 0x01, 0xEC, 0x0E, + 0x58, 0x30, 0x70, 0xE0, 0xC3, 0x81, 0x86, 0x07, 0x1C, 0x0C, 0x38, 0x18, + 0xE0, 0x71, 0xC0, 0xE3, 0x83, 0x87, 0x0B, 0x2F, 0x36, 0xCF, 0xCF, 0x1F, + 0x1C, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, + 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, 0x7C, 0x1C, 0xFE, + 0x19, 0x8F, 0x1A, 0x07, 0x3C, 0x07, 0x38, 0x07, 0x38, 0x07, 0x70, 0x0E, + 0x70, 0x0E, 0x70, 0x1C, 0x60, 0x18, 0xE0, 0x30, 0xE0, 0x60, 0xE1, 0xC0, + 0x3F, 0x00, 0x01, 0xF0, 0x38, 0xC3, 0x8E, 0x78, 0x73, 0x80, 0x3C, 0x01, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x47, 0x84, 0x3F, + 0xC0, 0x7C, 0x00, 0x00, 0x01, 0x80, 0x07, 0xC0, 0x00, 0xE0, 0x00, 0x60, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x06, 0x00, 0xF7, + 0x01, 0xC7, 0x81, 0xC3, 0x81, 0xC1, 0xC1, 0xE0, 0xE0, 0xE0, 0x60, 0xF0, + 0x30, 0x78, 0x38, 0x78, 0x18, 0x3C, 0x0C, 0x1E, 0x0C, 0x0F, 0x0E, 0x27, + 0xCB, 0x21, 0xF9, 0xE0, 0x78, 0xE0, 0x00, 0xF0, 0x1C, 0xC3, 0x86, 0x38, + 0x33, 0xC3, 0x1C, 0x31, 0xE3, 0x1F, 0xE0, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x47, 0x84, 0x3F, 0xC0, 0x7C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x33, + 0x00, 0x06, 0x30, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0x01, 0xC0, 0x00, 0x18, + 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x03, + 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x06, 0x00, 0x00, + 0x60, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0xC0, 0x00, + 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00, + 0x03, 0x00, 0x00, 0x30, 0x00, 0xC6, 0x00, 0x0C, 0xC0, 0x00, 0x78, 0x00, + 0x00, 0x01, 0xF8, 0x07, 0x1F, 0x0E, 0x0F, 0x0C, 0x0E, 0x18, 0x0E, 0x18, + 0x0E, 0x18, 0x1E, 0x18, 0x3C, 0x0C, 0x78, 0x07, 0xE0, 0x08, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x0F, 0xE0, 0x13, 0xF0, 0x60, 0x78, 0xC0, 0x38, 0xC0, + 0x18, 0xC0, 0x18, 0xC0, 0x30, 0x60, 0x60, 0x3F, 0x80, 0x03, 0x00, 0x1F, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0E, + 0x00, 0x0C, 0x00, 0x1C, 0x38, 0x1C, 0x7C, 0x1C, 0xCC, 0x19, 0x0C, 0x3A, + 0x0C, 0x3C, 0x1C, 0x3C, 0x18, 0x38, 0x18, 0x70, 0x38, 0x70, 0x38, 0x70, + 0x30, 0x60, 0x72, 0xE0, 0x76, 0xE0, 0x7C, 0xC0, 0x70, 0x03, 0x03, 0xC1, + 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x7E, 0x0F, 0x03, 0x81, 0x81, + 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x1C, 0x1C, 0x4C, 0x47, 0xC3, 0xC0, 0x00, + 0x0C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x03, 0xF0, 0x00, 0xE0, 0x01, 0x80, 0x03, 0x00, + 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x80, 0x06, + 0x00, 0x0C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 0x00, + 0x0C, 0x06, 0x30, 0x0C, 0xC0, 0x0F, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0C, + 0x00, 0x38, 0xFC, 0x70, 0x60, 0xE1, 0x81, 0x86, 0x07, 0x10, 0x0E, 0x40, + 0x1B, 0x80, 0x3F, 0x00, 0xE7, 0x01, 0xCE, 0x03, 0x0C, 0x06, 0x1C, 0x5C, + 0x1D, 0x38, 0x3E, 0x60, 0x38, 0x03, 0x1F, 0x07, 0x07, 0x06, 0x0E, 0x0E, + 0x0E, 0x0C, 0x1C, 0x1C, 0x18, 0x38, 0x38, 0x38, 0x30, 0x70, 0x70, 0x70, + 0x64, 0xE4, 0xE8, 0xF0, 0xE0, 0x00, 0x06, 0x18, 0x1E, 0x3E, 0x3C, 0x3F, + 0x0E, 0x4C, 0x47, 0x0C, 0x8C, 0x8E, 0x1D, 0x0D, 0x0E, 0x1E, 0x1A, 0x0E, + 0x1C, 0x1E, 0x0C, 0x3C, 0x1C, 0x1C, 0x38, 0x38, 0x1C, 0x38, 0x38, 0x1C, + 0x30, 0x38, 0x18, 0x70, 0x30, 0x39, 0x70, 0x70, 0x32, 0x60, 0x70, 0x3C, + 0x60, 0x60, 0x38, 0x06, 0x0E, 0x1F, 0x1F, 0x83, 0x99, 0xC1, 0x98, 0xC1, + 0xD8, 0xE0, 0xE8, 0x70, 0x78, 0x30, 0x38, 0x38, 0x3C, 0x1C, 0x1C, 0x0E, + 0x0E, 0x06, 0x0E, 0x03, 0x17, 0x01, 0xB3, 0x80, 0xF1, 0x80, 0x70, 0x01, + 0xF0, 0x0E, 0x38, 0x38, 0x30, 0xE0, 0x73, 0x80, 0xEE, 0x01, 0xDC, 0x03, + 0xF8, 0x0F, 0xE0, 0x1D, 0xC0, 0x3B, 0x80, 0xE7, 0x03, 0x8E, 0x06, 0x0E, + 0x38, 0x07, 0xC0, 0x00, 0x00, 0xE7, 0xC0, 0x7C, 0xFE, 0x01, 0xD1, 0xF0, + 0x1E, 0x0F, 0x01, 0xC0, 0xF0, 0x38, 0x0F, 0x03, 0x80, 0xF0, 0x38, 0x0E, + 0x03, 0x01, 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0x60, 0x78, 0x06, 0x0F, + 0x00, 0xE1, 0xC0, 0x0F, 0xF0, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, + 0x00, 0x1C, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x0F, 0xF0, 0x00, 0x00, + 0xF7, 0x03, 0xCE, 0x0F, 0x06, 0x1E, 0x06, 0x1C, 0x04, 0x3C, 0x04, 0x78, + 0x04, 0x78, 0x0C, 0xF0, 0x08, 0xF0, 0x18, 0xF0, 0x38, 0xF0, 0xF0, 0xF9, + 0x70, 0x7E, 0x70, 0x3C, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x0F, 0xF0, 0x7C, 0x70, 0xE7, 0xC7, 0x4C, + 0x34, 0x01, 0xA0, 0x1E, 0x00, 0xF0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x1C, + 0x00, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x07, 0x88, 0x63, 0x86, + 0x0C, 0x30, 0x21, 0xC1, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x1C, + 0x10, 0x60, 0x83, 0x06, 0x18, 0x71, 0x82, 0x78, 0x00, 0x02, 0x03, 0x03, + 0x07, 0xF7, 0xF8, 0xE0, 0x60, 0x70, 0x38, 0x1C, 0x0C, 0x0E, 0x07, 0x03, + 0x01, 0x91, 0xC8, 0xF8, 0x78, 0x00, 0x1C, 0x0D, 0xF8, 0x38, 0x60, 0x70, + 0xC1, 0xC3, 0x83, 0x87, 0x07, 0x0C, 0x1E, 0x38, 0x78, 0x70, 0xB0, 0xE2, + 0x61, 0x8D, 0xC7, 0x33, 0x2C, 0xC6, 0x5F, 0x0F, 0x38, 0x1C, 0x00, 0x18, + 0x1B, 0xE0, 0x73, 0x81, 0xC6, 0x03, 0x18, 0x0C, 0x70, 0x21, 0xC1, 0x83, + 0x0C, 0x0C, 0x20, 0x31, 0x00, 0xC8, 0x03, 0x40, 0x0E, 0x00, 0x30, 0x00, + 0x80, 0x00, 0x18, 0x04, 0x1B, 0xE0, 0x30, 0x71, 0x80, 0xC1, 0xC6, 0x07, + 0x01, 0x1C, 0x2C, 0x08, 0x70, 0xB0, 0x20, 0xC4, 0xC1, 0x03, 0x21, 0x84, + 0x0D, 0x86, 0x20, 0x34, 0x19, 0x00, 0xE0, 0x68, 0x03, 0x81, 0xA0, 0x0C, + 0x07, 0x00, 0x30, 0x18, 0x00, 0x80, 0x40, 0x00, 0x03, 0x07, 0x0F, 0x8F, + 0x13, 0x93, 0x01, 0xB0, 0x01, 0xE0, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xC0, + 0x01, 0xC0, 0x03, 0xE0, 0x02, 0x60, 0x04, 0x62, 0x08, 0x64, 0xF0, 0x7C, + 0xE0, 0x30, 0x06, 0x06, 0x3F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x81, + 0x03, 0x82, 0x01, 0x82, 0x01, 0xC4, 0x01, 0xC4, 0x01, 0xC8, 0x00, 0xC8, + 0x00, 0xD0, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x80, + 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x78, 0x00, 0x70, 0x00, 0x1F, 0xFC, + 0x7F, 0xE1, 0x01, 0x08, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, + 0x06, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x38, 0x01, 0xF0, 0x0B, 0xE0, + 0x01, 0xC6, 0x03, 0x98, 0x03, 0x80, 0x00, 0x70, 0x0C, 0x01, 0x80, 0x38, + 0x03, 0x80, 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x00, 0xE0, + 0x0C, 0x01, 0xC0, 0x1C, 0x07, 0x80, 0x30, 0x04, 0x00, 0x20, 0x03, 0x00, + 0x30, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0C, 0x00, + 0xC0, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xC0, 0x06, + 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0C, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x1E, + 0x03, 0x80, 0x38, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE0, + 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x70, 0x00, 0x1E, 0x00, 0x3F, 0xE1, + 0xF8, 0x7F, 0xC0, 0x07, 0x80}; + +const GFXglyph FreeSerifItalic18pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 9, 0, 1}, // 0x20 ' ' + {0, 10, 23, 12, 1, -22}, // 0x21 '!' + {29, 12, 9, 12, 4, -22}, // 0x22 '"' + {43, 19, 23, 17, 0, -22}, // 0x23 '#' + {98, 15, 29, 17, 1, -25}, // 0x24 '$' + {153, 25, 23, 29, 3, -22}, // 0x25 '%' + {225, 22, 23, 27, 3, -22}, // 0x26 '&' + {289, 5, 9, 7, 4, -22}, // 0x27 ''' + {295, 9, 29, 12, 1, -22}, // 0x28 '(' + {328, 9, 29, 12, 1, -22}, // 0x29 ')' + {361, 12, 14, 18, 5, -22}, // 0x2A '*' + {382, 16, 18, 24, 4, -17}, // 0x2B '+' + {418, 5, 8, 9, -1, -2}, // 0x2C ',' + {423, 8, 2, 12, 2, -8}, // 0x2D '-' + {425, 4, 4, 9, 1, -3}, // 0x2E '.' + {427, 16, 23, 10, 0, -22}, // 0x2F '/' + {473, 17, 24, 17, 1, -23}, // 0x30 '0' + {524, 12, 24, 17, 2, -23}, // 0x31 '1' + {560, 16, 23, 17, 1, -22}, // 0x32 '2' + {606, 17, 24, 18, 0, -23}, // 0x33 '3' + {657, 17, 24, 17, 0, -23}, // 0x34 '4' + {708, 16, 23, 18, 0, -22}, // 0x35 '5' + {754, 17, 24, 18, 1, -23}, // 0x36 '6' + {805, 16, 23, 17, 3, -22}, // 0x37 '7' + {851, 16, 24, 18, 1, -23}, // 0x38 '8' + {899, 16, 24, 17, 1, -23}, // 0x39 '9' + {947, 7, 15, 9, 2, -14}, // 0x3A ':' + {961, 9, 20, 9, 1, -14}, // 0x3B ';' + {984, 18, 18, 20, 2, -17}, // 0x3C '<' + {1025, 18, 9, 23, 3, -12}, // 0x3D '=' + {1046, 18, 18, 20, 2, -17}, // 0x3E '>' + {1087, 12, 23, 16, 4, -22}, // 0x3F '?' + {1122, 24, 23, 27, 2, -22}, // 0x40 '@' + {1191, 21, 23, 23, 0, -22}, // 0x41 'A' + {1252, 21, 23, 21, 0, -22}, // 0x42 'B' + {1313, 21, 23, 21, 2, -22}, // 0x43 'C' + {1374, 25, 23, 25, 0, -22}, // 0x44 'D' + {1446, 22, 23, 20, 0, -22}, // 0x45 'E' + {1510, 22, 23, 20, 0, -22}, // 0x46 'F' + {1574, 23, 23, 24, 2, -22}, // 0x47 'G' + {1641, 27, 23, 25, 0, -22}, // 0x48 'H' + {1719, 14, 23, 11, 0, -22}, // 0x49 'I' + {1760, 17, 23, 15, 0, -22}, // 0x4A 'J' + {1809, 25, 23, 22, 0, -22}, // 0x4B 'K' + {1881, 20, 23, 20, 0, -22}, // 0x4C 'L' + {1939, 31, 23, 29, 0, -22}, // 0x4D 'M' + {2029, 26, 23, 24, 0, -22}, // 0x4E 'N' + {2104, 23, 23, 23, 1, -22}, // 0x4F 'O' + {2171, 22, 23, 20, 0, -22}, // 0x50 'P' + {2235, 23, 29, 23, 1, -22}, // 0x51 'Q' + {2319, 21, 23, 22, 0, -22}, // 0x52 'R' + {2380, 17, 23, 16, 0, -22}, // 0x53 'S' + {2429, 20, 23, 21, 3, -22}, // 0x54 'T' + {2487, 23, 23, 25, 4, -22}, // 0x55 'U' + {2554, 21, 23, 23, 5, -22}, // 0x56 'V' + {2615, 29, 23, 31, 5, -22}, // 0x57 'W' + {2699, 24, 23, 23, 0, -22}, // 0x58 'X' + {2768, 19, 23, 21, 4, -22}, // 0x59 'Y' + {2823, 22, 23, 20, 0, -22}, // 0x5A 'Z' + {2887, 13, 28, 14, 1, -22}, // 0x5B '[' + {2933, 12, 23, 17, 4, -22}, // 0x5C '\' + {2968, 12, 28, 14, 1, -22}, // 0x5D ']' + {3010, 15, 13, 15, 0, -22}, // 0x5E '^' + {3035, 18, 2, 17, 0, 3}, // 0x5F '_' + {3040, 6, 6, 9, 5, -22}, // 0x60 '`' + {3045, 15, 15, 17, 1, -14}, // 0x61 'a' + {3074, 16, 24, 17, 1, -23}, // 0x62 'b' + {3122, 13, 15, 14, 1, -14}, // 0x63 'c' + {3147, 17, 24, 18, 1, -23}, // 0x64 'd' + {3198, 13, 15, 14, 1, -14}, // 0x65 'e' + {3223, 20, 31, 15, -3, -23}, // 0x66 'f' + {3301, 16, 22, 15, -1, -14}, // 0x67 'g' + {3345, 16, 24, 17, 1, -23}, // 0x68 'h' + {3393, 9, 23, 9, 1, -22}, // 0x69 'i' + {3419, 15, 30, 10, -3, -22}, // 0x6A 'j' + {3476, 15, 24, 16, 1, -23}, // 0x6B 'k' + {3521, 8, 25, 9, 1, -23}, // 0x6C 'l' + {3546, 24, 15, 25, 0, -14}, // 0x6D 'm' + {3591, 17, 15, 17, 0, -14}, // 0x6E 'n' + {3623, 15, 15, 17, 1, -14}, // 0x6F 'o' + {3652, 20, 22, 16, -3, -14}, // 0x70 'p' + {3707, 16, 22, 17, 1, -14}, // 0x71 'q' + {3751, 13, 15, 13, 1, -14}, // 0x72 'r' + {3776, 13, 15, 12, 0, -14}, // 0x73 's' + {3801, 9, 18, 8, 1, -17}, // 0x74 't' + {3822, 15, 15, 17, 1, -14}, // 0x75 'u' + {3851, 14, 15, 16, 2, -14}, // 0x76 'v' + {3878, 22, 15, 24, 1, -14}, // 0x77 'w' + {3920, 16, 15, 15, -1, -14}, // 0x78 'x' + {3950, 16, 22, 16, 0, -14}, // 0x79 'y' + {3994, 14, 18, 14, 0, -14}, // 0x7A 'z' + {4026, 12, 30, 14, 2, -23}, // 0x7B '{' + {4071, 2, 23, 10, 4, -22}, // 0x7C '|' + {4077, 12, 31, 14, 0, -24}, // 0x7D '}' + {4124, 17, 4, 19, 1, -10}}; // 0x7E '~' + +const GFXfont FreeSerifItalic18pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic18pt7bBitmaps, + (GFXglyph *)FreeSerifItalic18pt7bGlyphs, 0x20, 0x7E, 42}; + +// Approx. 4805 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h new file mode 100644 index 0000000..98233a7 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h @@ -0,0 +1,739 @@ +#pragma once +#include + +const uint8_t FreeSerifItalic24pt7bBitmaps[] PROGMEM = { + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x1C, + 0x01, 0xC0, 0x3C, 0x03, 0x80, 0x38, 0x03, 0x80, 0x30, 0x07, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xF8, 0x0F, 0x80, 0xF8, 0x07, 0x00, + 0x38, 0x1D, 0xE0, 0x77, 0x83, 0xDC, 0x0E, 0x70, 0x39, 0xC1, 0xEE, 0x07, + 0x38, 0x1C, 0xC0, 0x63, 0x01, 0x8C, 0x06, 0x20, 0x10, 0x00, 0x06, 0x03, + 0x00, 0x07, 0x03, 0x80, 0x03, 0x81, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0xC0, + 0xE0, 0x00, 0xE0, 0x70, 0x00, 0xE0, 0x70, 0x00, 0x70, 0x38, 0x00, 0x30, + 0x18, 0x00, 0x38, 0x1C, 0x03, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x0E, + 0x07, 0x00, 0x06, 0x03, 0x00, 0x07, 0x03, 0x80, 0x03, 0x81, 0xC0, 0x03, + 0x81, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0x70, 0x1F, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFF, 0x80, 0x70, 0x38, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x0C, 0x00, + 0x1C, 0x0E, 0x00, 0x0E, 0x07, 0x00, 0x0E, 0x07, 0x00, 0x07, 0x03, 0x80, + 0x03, 0x81, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0xFF, 0x80, 0x1C, 0x2F, 0x01, + 0x83, 0x3C, 0x1C, 0x18, 0xE1, 0xC0, 0xC3, 0x0E, 0x06, 0x18, 0x70, 0x60, + 0x83, 0x83, 0x04, 0x1E, 0x18, 0x00, 0xF8, 0xC0, 0x03, 0xEC, 0x00, 0x0F, + 0xE0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, + 0x00, 0x7F, 0x00, 0x03, 0x7C, 0x00, 0x19, 0xE0, 0x01, 0x87, 0x80, 0x0C, + 0x3C, 0x00, 0x60, 0xE2, 0x03, 0x07, 0x10, 0x30, 0x39, 0x81, 0x81, 0xCE, + 0x0C, 0x0C, 0x70, 0x60, 0xE3, 0xC6, 0x06, 0x0F, 0x30, 0x60, 0x1F, 0x9E, + 0x00, 0x3F, 0x80, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, + 0x80, 0x00, 0x01, 0xF0, 0x00, 0xC0, 0x03, 0xFE, 0x01, 0xE0, 0x03, 0xC7, + 0x83, 0xE0, 0x03, 0xC0, 0x7F, 0x60, 0x03, 0xC0, 0x20, 0x70, 0x01, 0xC0, + 0x10, 0x30, 0x01, 0xE0, 0x08, 0x38, 0x00, 0xE0, 0x04, 0x18, 0x00, 0xF0, + 0x02, 0x1C, 0x00, 0x70, 0x02, 0x0C, 0x00, 0x38, 0x01, 0x0E, 0x00, 0x1C, + 0x01, 0x8E, 0x00, 0x0E, 0x00, 0x86, 0x00, 0x07, 0x00, 0x87, 0x03, 0xE1, + 0x80, 0xC3, 0x07, 0xFC, 0xE1, 0xC3, 0x87, 0xC6, 0x3F, 0x81, 0x87, 0x81, + 0x8F, 0x81, 0xC7, 0x80, 0x40, 0x00, 0xC3, 0xC0, 0x20, 0x00, 0xE3, 0xC0, + 0x10, 0x00, 0x61, 0xC0, 0x08, 0x00, 0x61, 0xE0, 0x04, 0x00, 0x70, 0xF0, + 0x06, 0x00, 0x30, 0x70, 0x02, 0x00, 0x38, 0x38, 0x03, 0x00, 0x18, 0x1C, + 0x01, 0x00, 0x1C, 0x0E, 0x01, 0x80, 0x0C, 0x07, 0x01, 0x80, 0x0E, 0x01, + 0xC3, 0x80, 0x06, 0x00, 0x7F, 0x80, 0x06, 0x00, 0x1F, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x71, + 0xC0, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x38, 0x38, + 0x00, 0x01, 0xE0, 0xE0, 0x00, 0x07, 0x87, 0x00, 0x00, 0x1E, 0x18, 0x00, + 0x00, 0x78, 0xC0, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7F, + 0xC1, 0xFE, 0x03, 0x9F, 0x03, 0xE0, 0x3C, 0x3C, 0x07, 0x01, 0xE0, 0xF8, + 0x1C, 0x0F, 0x03, 0xE0, 0xE0, 0x7C, 0x07, 0x83, 0x01, 0xE0, 0x1F, 0x1C, + 0x07, 0x80, 0x7C, 0x60, 0x3E, 0x00, 0xFB, 0x00, 0xF8, 0x03, 0xFC, 0x03, + 0xE0, 0x07, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7C, + 0x00, 0xFC, 0x01, 0xF8, 0x0F, 0xF0, 0x03, 0xF0, 0xF3, 0xF0, 0x87, 0xFF, + 0x07, 0xFC, 0x07, 0xF0, 0x07, 0xC0, 0x39, 0xDE, 0xE7, 0x3B, 0x9C, 0xC6, + 0x31, 0x00, 0x00, 0x10, 0x01, 0x00, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, + 0x1C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3C, + 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0E, 0x00, + 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, + 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x01, 0x80, 0x0C, 0x00, 0x60, + 0x01, 0x00, 0x0C, 0x00, 0x20, 0x00, 0x00, 0x80, 0x06, 0x00, 0x10, 0x00, + 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, + 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0xE1, 0x07, 0xE1, 0x0F, + 0xF1, 0x1F, 0x19, 0x30, 0x07, 0xC0, 0x03, 0x80, 0x0D, 0x60, 0x79, 0x3C, + 0xF1, 0x1F, 0xE1, 0x0F, 0xE1, 0x07, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, + 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, + 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, + 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x7C, 0xF9, + 0xF1, 0xE1, 0xC3, 0x0C, 0x10, 0xC1, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, + 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x3C, + 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, + 0xF0, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, + 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, 0x00, + 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, + 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x03, 0x86, + 0x00, 0x30, 0x18, 0x03, 0x00, 0xC0, 0x38, 0x03, 0x03, 0x80, 0x18, 0x38, + 0x00, 0xC1, 0xC0, 0x07, 0x1C, 0x00, 0x38, 0xE0, 0x01, 0xCF, 0x00, 0x0E, + 0x70, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xE0, 0x01, 0xEE, 0x00, + 0x0F, 0xF0, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xC0, 0x01, 0xCE, + 0x00, 0x1E, 0x70, 0x00, 0xF3, 0x80, 0x07, 0x1C, 0x00, 0x78, 0xE0, 0x03, + 0x83, 0x00, 0x38, 0x18, 0x03, 0x80, 0xE0, 0x18, 0x03, 0x01, 0x80, 0x0C, + 0x38, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, + 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E, + 0x00, 0x0F, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1E, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x01, 0xE0, + 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0x01, 0xFF, + 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xFE, 0x00, 0x7F, 0xF8, 0x07, 0x07, 0xE0, + 0x60, 0x1F, 0x06, 0x00, 0x7C, 0x20, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, + 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, + 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x01, 0x03, 0x00, 0x08, + 0x30, 0x00, 0xC3, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0xFF, 0xC0, 0x06, 0x0F, 0x80, 0x30, 0x1E, 0x01, 0x80, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x01, + 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x0F, + 0x80, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, + 0x00, 0x1E, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, + 0x38, 0x00, 0x00, 0xC0, 0x70, 0x06, 0x03, 0xF8, 0x70, 0x07, 0xFF, 0x00, + 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x03, 0xC0, + 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x37, 0x80, 0x00, + 0xDC, 0x00, 0x06, 0x70, 0x00, 0x33, 0xC0, 0x01, 0x8F, 0x00, 0x0C, 0x38, + 0x00, 0x60, 0xE0, 0x03, 0x07, 0x80, 0x18, 0x1E, 0x00, 0xC0, 0x70, 0x06, + 0x03, 0xC0, 0x30, 0x0F, 0x01, 0x80, 0x38, 0x0C, 0x00, 0xE0, 0x70, 0x07, + 0x81, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0x00, 0x0F, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, + 0x70, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0xFF, + 0xF0, 0x07, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x70, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x3F, + 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00, + 0x70, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, + 0x70, 0x0E, 0x03, 0xF0, 0xE0, 0x07, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0x00, + 0x00, 0x0E, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, + 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF9, 0xF8, 0x01, 0xFF, 0xFC, + 0x07, 0xE0, 0x7C, 0x0F, 0x80, 0x7C, 0x3E, 0x00, 0x78, 0x78, 0x00, 0x78, + 0xF0, 0x00, 0xF3, 0xC0, 0x01, 0xE7, 0x80, 0x03, 0xCF, 0x00, 0x07, 0x9C, + 0x00, 0x0F, 0x38, 0x00, 0x3E, 0x70, 0x00, 0x78, 0xE0, 0x00, 0xF1, 0xC0, + 0x03, 0xC1, 0x80, 0x07, 0x83, 0x00, 0x1E, 0x03, 0x00, 0x38, 0x06, 0x01, + 0xE0, 0x03, 0x07, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF, + 0xCF, 0xFF, 0xFC, 0xE0, 0x00, 0xCC, 0x00, 0x0E, 0x40, 0x00, 0x60, 0x00, + 0x07, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x01, 0x80, + 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07, + 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, + 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x38, + 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x03, 0x83, + 0x80, 0x1C, 0x03, 0x00, 0xE0, 0x0E, 0x07, 0x00, 0x1C, 0x1C, 0x00, 0x70, + 0x70, 0x01, 0xC1, 0xC0, 0x07, 0x07, 0x80, 0x1C, 0x1E, 0x00, 0xE0, 0x3C, + 0x07, 0x80, 0xFC, 0x38, 0x01, 0xFB, 0xC0, 0x03, 0xF8, 0x00, 0x0F, 0xE0, + 0x00, 0x7F, 0xC0, 0x07, 0x1F, 0x80, 0x78, 0x3F, 0x03, 0x80, 0x7C, 0x1E, + 0x00, 0xF8, 0x70, 0x01, 0xE3, 0x80, 0x03, 0xCE, 0x00, 0x07, 0x38, 0x00, + 0x1C, 0xE0, 0x00, 0x73, 0x80, 0x01, 0xCE, 0x00, 0x06, 0x1C, 0x00, 0x38, + 0x70, 0x01, 0xC0, 0xE0, 0x0E, 0x01, 0xE0, 0xE0, 0x01, 0xFE, 0x00, 0x00, + 0x1F, 0x80, 0x03, 0xC3, 0x00, 0x1C, 0x02, 0x00, 0xE0, 0x0C, 0x07, 0x00, + 0x18, 0x3C, 0x00, 0x60, 0xE0, 0x01, 0xC7, 0x80, 0x07, 0x1E, 0x00, 0x1C, + 0xF0, 0x00, 0x73, 0xC0, 0x01, 0xCF, 0x00, 0x07, 0x3C, 0x00, 0x3C, 0xF0, + 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x1E, 0x00, 0x78, 0x7C, 0x03, + 0xE0, 0xF8, 0x3F, 0x01, 0xFF, 0xBC, 0x03, 0xF1, 0xE0, 0x00, 0x0F, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, + 0x0F, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x07, 0xC3, 0xE1, 0xF0, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x3E, 0x1F, 0x0F, 0x83, 0x80, 0x01, 0xC0, 0x7C, 0x0F, 0x81, + 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0x80, 0xF8, 0x1F, 0x01, 0xE0, + 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, + 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, + 0xC0, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, + 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, + 0x00, 0x7F, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x03, 0xF0, 0x06, 0x1C, 0x0C, 0x0E, 0x1C, 0x06, 0x1C, 0x07, 0x1C, 0x07, + 0x1C, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, + 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0x00, + 0xF8, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x1F, + 0xFF, 0x80, 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7C, + 0x00, 0x07, 0x80, 0x7C, 0x00, 0x00, 0xE0, 0x3C, 0x00, 0x00, 0x38, 0x3C, + 0x00, 0x00, 0x0C, 0x3C, 0x00, 0x78, 0x07, 0x1E, 0x00, 0xFE, 0xE1, 0x9E, + 0x00, 0xF1, 0xF0, 0xEF, 0x00, 0xE0, 0xF0, 0x37, 0x80, 0xE0, 0x38, 0x1F, + 0x80, 0x70, 0x1C, 0x0F, 0xC0, 0x70, 0x1E, 0x07, 0xE0, 0x38, 0x0F, 0x03, + 0xF0, 0x18, 0x07, 0x01, 0xF8, 0x1C, 0x03, 0x80, 0xFC, 0x0E, 0x01, 0xC0, + 0xDE, 0x07, 0x01, 0xE0, 0x6F, 0x03, 0x80, 0xE0, 0x73, 0xC1, 0xC0, 0xF0, + 0x31, 0xE0, 0xF0, 0xF8, 0x30, 0xF0, 0x38, 0xDC, 0x30, 0x3C, 0x1F, 0xC7, + 0xF0, 0x0E, 0x07, 0x81, 0xF0, 0x07, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x03, 0xF0, + 0x0F, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x03, 0xF0, + 0x00, 0x00, 0x37, 0x80, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x19, 0xE0, 0x00, + 0x01, 0x8F, 0x80, 0x00, 0x08, 0x7C, 0x00, 0x00, 0xC3, 0xE0, 0x00, 0x0C, + 0x0F, 0x00, 0x00, 0x60, 0x78, 0x00, 0x06, 0x03, 0xC0, 0x00, 0x20, 0x1F, + 0x00, 0x03, 0x00, 0xF8, 0x00, 0x3F, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x00, + 0x18, 0x00, 0xF0, 0x00, 0xC0, 0x07, 0x80, 0x0C, 0x00, 0x3E, 0x00, 0xE0, + 0x01, 0xF0, 0x06, 0x00, 0x0F, 0x80, 0x70, 0x00, 0x3C, 0x03, 0x00, 0x01, + 0xE0, 0x38, 0x00, 0x0F, 0x83, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xF3, + 0xFC, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF8, 0x00, + 0x3E, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xC0, + 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x78, 0x01, 0xF0, + 0x07, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF0, + 0x3F, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0xFF, 0xFC, 0x00, 0x1F, 0x07, 0xE0, + 0x01, 0xE0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x3C, + 0x00, 0x7C, 0x03, 0xC0, 0x07, 0xC0, 0x7C, 0x00, 0x7C, 0x07, 0xC0, 0x07, + 0xC0, 0x78, 0x00, 0x7C, 0x0F, 0x80, 0x0F, 0x80, 0xF8, 0x00, 0xF8, 0x0F, + 0x00, 0x1F, 0x00, 0xF0, 0x03, 0xE0, 0x1F, 0x81, 0xFC, 0x03, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x01, 0xFE, 0x04, 0x00, 0x3F, 0xFF, + 0xE0, 0x03, 0xF0, 0x1F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF0, 0x00, 0x78, + 0x0F, 0x80, 0x00, 0xE0, 0x3C, 0x00, 0x03, 0x81, 0xF0, 0x00, 0x04, 0x0F, + 0x80, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x41, 0xF0, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x07, 0xC0, 0x00, 0x18, 0x0F, 0x80, + 0x00, 0xC0, 0x3E, 0x00, 0x06, 0x00, 0x7C, 0x00, 0x70, 0x00, 0xFC, 0x07, + 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xC0, 0xFC, 0x00, 0x07, 0xC0, + 0x1F, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0xF0, + 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x3C, + 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x01, 0xF0, 0x0F, + 0x00, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x3E, 0x03, + 0xE0, 0x00, 0x1F, 0x01, 0xE0, 0x00, 0x1F, 0x81, 0xF0, 0x00, 0x0F, 0x80, + 0xF8, 0x00, 0x07, 0xC0, 0x78, 0x00, 0x03, 0xE0, 0x3C, 0x00, 0x03, 0xE0, + 0x3E, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xF0, + 0x0F, 0x80, 0x01, 0xF8, 0x07, 0xC0, 0x01, 0xF0, 0x03, 0xE0, 0x01, 0xF0, + 0x01, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x0F, 0xE0, 0x01, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, + 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, 0x30, 0x03, 0xE0, 0x01, 0x00, + 0x1E, 0x00, 0x08, 0x01, 0xF0, 0x00, 0x40, 0x0F, 0x80, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x03, 0xC0, 0x10, 0x00, 0x3E, 0x01, 0x80, 0x01, 0xF0, 0x08, + 0x00, 0x0F, 0x01, 0xC0, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, + 0x3E, 0x07, 0x00, 0x01, 0xE0, 0x18, 0x00, 0x1F, 0x00, 0xC0, 0x00, 0xF8, + 0x04, 0x00, 0x07, 0x80, 0x20, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x08, 0x0F, 0x80, 0x00, 0xC0, + 0x7C, 0x00, 0x0E, 0x03, 0xC0, 0x00, 0xE0, 0x1E, 0x00, 0x0F, 0x01, 0xF8, + 0x03, 0xF8, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x00, 0x03, 0xFF, + 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, + 0x30, 0x03, 0xE0, 0x01, 0x00, 0x1E, 0x00, 0x08, 0x01, 0xF0, 0x00, 0x40, + 0x0F, 0x80, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x3E, + 0x00, 0x80, 0x01, 0xF0, 0x0C, 0x00, 0x0F, 0x00, 0xC0, 0x00, 0xF8, 0x0E, + 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xE0, 0x18, 0x00, + 0x1F, 0x00, 0xC0, 0x00, 0xF8, 0x06, 0x00, 0x07, 0xC0, 0x20, 0x00, 0x3C, + 0x01, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFF, + 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x02, 0x00, 0x1F, 0xFF, 0x8C, 0x00, + 0xFC, 0x07, 0xF8, 0x03, 0xE0, 0x03, 0xF0, 0x0F, 0x00, 0x03, 0xC0, 0x3C, + 0x00, 0x03, 0x80, 0xF0, 0x00, 0x07, 0x03, 0xC0, 0x00, 0x0E, 0x0F, 0x80, + 0x00, 0x08, 0x3E, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x3F, + 0xFF, 0xE0, 0x00, 0x0F, 0xE7, 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x1E, + 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x01, 0xE0, + 0x78, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x0F, 0x01, 0xF0, 0x00, 0x1E, 0x01, + 0xF0, 0x00, 0x3C, 0x01, 0xE0, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x01, + 0xF8, 0x0F, 0x80, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, + 0xFF, 0xE0, 0x7F, 0xF0, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, + 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, + 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, + 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xFF, 0x80, 0x01, + 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, + 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, + 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xF8, 0x00, + 0xFE, 0x00, 0xFF, 0xE0, 0x7F, 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x1F, 0xE0, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01, + 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xF8, 0x00, + 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, + 0x0F, 0xE0, 0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x01, 0xC1, 0xE0, 0x07, 0xC7, + 0x80, 0x0F, 0x8F, 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x01, 0xFF, 0xE1, 0xFF, 0x80, 0x3F, 0xC0, 0x1F, 0x80, 0x0F, 0x80, + 0x0F, 0x00, 0x07, 0xC0, 0x0F, 0x00, 0x03, 0xC0, 0x0F, 0x00, 0x01, 0xE0, + 0x0E, 0x00, 0x01, 0xF0, 0x0E, 0x00, 0x00, 0xF8, 0x0E, 0x00, 0x00, 0x78, + 0x1C, 0x00, 0x00, 0x3C, 0x1C, 0x00, 0x00, 0x3E, 0x3C, 0x00, 0x00, 0x1F, + 0x38, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, + 0xFE, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x01, 0xE7, 0xC0, 0x00, 0x01, + 0xF3, 0xE0, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00, + 0x3C, 0x1F, 0x00, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xE0, 0x00, + 0x0F, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x07, 0xC0, 0x1F, 0x00, + 0x03, 0xC0, 0x07, 0x80, 0x01, 0xE0, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xF8, + 0x01, 0xFC, 0x01, 0xFE, 0x03, 0xFF, 0xC3, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, + 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, + 0xF0, 0x00, 0x08, 0x3C, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x41, 0xF0, 0x00, + 0x18, 0x3C, 0x00, 0x07, 0x07, 0x80, 0x01, 0xC1, 0xF8, 0x01, 0xF8, 0x7F, + 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xC0, + 0x0F, 0xC0, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0xFC, + 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, + 0xFF, 0x00, 0x02, 0xF0, 0x00, 0x37, 0x80, 0x01, 0xBC, 0x00, 0x19, 0xE0, + 0x00, 0x6F, 0x80, 0x0E, 0xF8, 0x00, 0x1B, 0xE0, 0x03, 0x3E, 0x00, 0x04, + 0x78, 0x01, 0x8F, 0x00, 0x03, 0x1E, 0x00, 0xE7, 0xC0, 0x00, 0xC7, 0x80, + 0x31, 0xF0, 0x00, 0x21, 0xE0, 0x18, 0x78, 0x00, 0x18, 0x78, 0x0E, 0x1E, + 0x00, 0x06, 0x1E, 0x03, 0x0F, 0x80, 0x01, 0x87, 0x81, 0x83, 0xE0, 0x00, + 0x41, 0xF0, 0xE0, 0xF0, 0x00, 0x30, 0x7C, 0x30, 0x3C, 0x00, 0x0C, 0x0F, + 0x18, 0x1F, 0x00, 0x03, 0x03, 0xCE, 0x07, 0xC0, 0x01, 0x80, 0xF3, 0x01, + 0xE0, 0x00, 0x60, 0x3D, 0x80, 0xF8, 0x00, 0x18, 0x0F, 0xE0, 0x3E, 0x00, + 0x0C, 0x03, 0xF0, 0x0F, 0x00, 0x03, 0x00, 0xF8, 0x03, 0xC0, 0x00, 0xC0, + 0x3E, 0x01, 0xF0, 0x00, 0x70, 0x0F, 0x00, 0x7C, 0x00, 0x1C, 0x01, 0x80, + 0x3F, 0x00, 0x0F, 0x80, 0x60, 0x1F, 0xC0, 0x0F, 0xF8, 0x10, 0x1F, 0xFE, + 0x00, 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0xF8, + 0x00, 0x1C, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x03, 0xF0, 0x00, 0x60, 0x00, + 0x7E, 0x00, 0x0C, 0x00, 0x0B, 0xE0, 0x03, 0x80, 0x03, 0x7C, 0x00, 0x60, + 0x00, 0x67, 0x80, 0x0C, 0x00, 0x0C, 0xF8, 0x03, 0x80, 0x03, 0x0F, 0x00, + 0x70, 0x00, 0x61, 0xF0, 0x0C, 0x00, 0x0C, 0x3E, 0x01, 0x80, 0x01, 0x83, + 0xC0, 0x70, 0x00, 0x60, 0x7C, 0x0C, 0x00, 0x0C, 0x07, 0x81, 0x80, 0x01, + 0x80, 0xF8, 0x30, 0x00, 0x60, 0x0F, 0x0E, 0x00, 0x0C, 0x01, 0xE1, 0x80, + 0x01, 0x80, 0x3E, 0x30, 0x00, 0x30, 0x03, 0xCE, 0x00, 0x0C, 0x00, 0x7D, + 0x80, 0x01, 0x80, 0x07, 0xB0, 0x00, 0x30, 0x00, 0xF6, 0x00, 0x0E, 0x00, + 0x1F, 0xC0, 0x01, 0x80, 0x01, 0xF0, 0x00, 0x30, 0x00, 0x3E, 0x00, 0x0E, + 0x00, 0x03, 0xC0, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x7C, 0x00, 0x06, 0x00, + 0x3F, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x0F, 0x00, 0x78, + 0x00, 0x78, 0x00, 0xF0, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0x81, + 0xF0, 0x00, 0x1E, 0x07, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x01, 0xF1, 0xF0, + 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x7C, 0xF8, 0x00, + 0x01, 0xF7, 0xE0, 0x00, 0x0F, 0xDF, 0x00, 0x00, 0x3F, 0x7C, 0x00, 0x00, + 0xFB, 0xF0, 0x00, 0x07, 0xEF, 0xC0, 0x00, 0x1F, 0xBE, 0x00, 0x00, 0x7C, + 0xF8, 0x00, 0x03, 0xF3, 0xE0, 0x00, 0x0F, 0x8F, 0x80, 0x00, 0x3E, 0x3E, + 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x0F, 0x81, 0xE0, 0x00, 0x3E, 0x07, 0x80, + 0x01, 0xF0, 0x1F, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x03, + 0xC0, 0x00, 0xF8, 0x3E, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x0F, 0x81, 0xF8, + 0x00, 0x7C, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x1E, 0x00, 0x7C, 0x01, + 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x78, 0x00, 0xF8, 0x03, 0xC0, + 0x07, 0xC0, 0x3E, 0x00, 0x3C, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x00, 0x3E, + 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xC0, 0x7E, 0x00, 0x3F, 0xFF, 0xE0, 0x01, + 0xEF, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, + 0xFE, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x0F, 0x00, 0x78, 0x00, 0x78, 0x00, + 0xF0, 0x03, 0xC0, 0x03, 0xE0, 0x1E, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x1E, + 0x07, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x01, 0xF1, 0xF8, 0x00, 0x07, 0xC7, + 0xC0, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x01, 0xF7, 0xE0, + 0x00, 0x0F, 0xDF, 0x80, 0x00, 0x3F, 0x7C, 0x00, 0x00, 0xFB, 0xF0, 0x00, + 0x03, 0xEF, 0xC0, 0x00, 0x1F, 0xBE, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x01, + 0xF3, 0xE0, 0x00, 0x0F, 0x8F, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x01, 0xF0, + 0xF8, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x3E, 0x07, 0x80, 0x01, 0xF0, 0x1F, + 0x00, 0x07, 0x80, 0x3C, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x01, 0xE0, + 0x1E, 0x00, 0x01, 0xF3, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x04, 0x0F, 0xF0, 0x00, + 0x60, 0x7F, 0xFC, 0x07, 0x03, 0xFF, 0xFF, 0xF8, 0x38, 0x1F, 0xFF, 0x80, + 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF8, 0x00, + 0x3E, 0x0F, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xC0, + 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x78, 0x01, 0xF0, + 0x07, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF0, + 0x1F, 0x80, 0x1F, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, 0x1E, 0x1E, 0x00, + 0x01, 0xE1, 0xE0, 0x00, 0x3E, 0x1F, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x3C, + 0x0F, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x7C, 0x07, 0x80, 0x07, 0xC0, 0x7C, + 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x80, 0x3C, 0x00, 0xF8, 0x03, 0xE0, 0x0F, + 0x00, 0x1E, 0x00, 0xF0, 0x01, 0xE0, 0x1F, 0x00, 0x1F, 0x03, 0xF8, 0x00, + 0xF8, 0xFF, 0xE0, 0x0F, 0xE0, 0x00, 0x3F, 0x06, 0x01, 0xFF, 0xDC, 0x07, + 0xC1, 0xF0, 0x1E, 0x01, 0xE0, 0x3C, 0x01, 0xC0, 0xF0, 0x03, 0x81, 0xE0, + 0x03, 0x03, 0xC0, 0x04, 0x07, 0x80, 0x08, 0x0F, 0x80, 0x00, 0x1F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x08, 0x00, 0x78, 0x10, + 0x00, 0xF0, 0x20, 0x01, 0xE0, 0xC0, 0x03, 0xC1, 0x80, 0x07, 0x83, 0x80, + 0x1E, 0x07, 0x00, 0x3C, 0x0F, 0x00, 0xF0, 0x1F, 0x87, 0xC0, 0x23, 0xFF, + 0x00, 0x81, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFD, 0xF0, + 0x3E, 0x07, 0xB8, 0x07, 0xC0, 0x76, 0x00, 0xF8, 0x04, 0x80, 0x3E, 0x00, + 0xB0, 0x07, 0xC0, 0x14, 0x00, 0xF8, 0x02, 0x00, 0x1E, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0xFF, 0x00, + 0x00, 0x7F, 0xFE, 0x03, 0xFE, 0x1F, 0xE0, 0x01, 0xF8, 0x1F, 0x80, 0x01, + 0xC0, 0x3E, 0x00, 0x03, 0x80, 0x7C, 0x00, 0x07, 0x00, 0xF8, 0x00, 0x0C, + 0x03, 0xE0, 0x00, 0x18, 0x07, 0xC0, 0x00, 0x70, 0x0F, 0x80, 0x00, 0xC0, + 0x1F, 0x00, 0x01, 0x80, 0x7C, 0x00, 0x03, 0x00, 0xF8, 0x00, 0x0E, 0x01, + 0xF0, 0x00, 0x18, 0x07, 0xC0, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x60, 0x1F, + 0x00, 0x01, 0x80, 0x3E, 0x00, 0x03, 0x00, 0xF8, 0x00, 0x06, 0x01, 0xF0, + 0x00, 0x18, 0x03, 0xE0, 0x00, 0x30, 0x07, 0xC0, 0x00, 0x60, 0x1F, 0x00, + 0x00, 0xC0, 0x3E, 0x00, 0x03, 0x00, 0x7C, 0x00, 0x06, 0x00, 0xF8, 0x00, + 0x18, 0x01, 0xF0, 0x00, 0x30, 0x03, 0xE0, 0x00, 0xC0, 0x03, 0xE0, 0x03, + 0x80, 0x03, 0xE0, 0x0E, 0x00, 0x03, 0xF0, 0x78, 0x00, 0x03, 0xFF, 0xC0, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x0F, 0xF9, 0xFC, 0x00, 0x1F, + 0x07, 0xC0, 0x00, 0x78, 0x3E, 0x00, 0x03, 0x81, 0xF0, 0x00, 0x18, 0x0F, + 0x80, 0x01, 0xC0, 0x7C, 0x00, 0x0C, 0x01, 0xE0, 0x00, 0xC0, 0x0F, 0x80, + 0x06, 0x00, 0x7C, 0x00, 0x60, 0x03, 0xE0, 0x07, 0x00, 0x1F, 0x00, 0x30, + 0x00, 0xF8, 0x03, 0x00, 0x03, 0xC0, 0x18, 0x00, 0x1E, 0x01, 0x80, 0x00, + 0xF8, 0x1C, 0x00, 0x07, 0xC0, 0xC0, 0x00, 0x3E, 0x0C, 0x00, 0x01, 0xF0, + 0x60, 0x00, 0x07, 0x86, 0x00, 0x00, 0x3C, 0x30, 0x00, 0x01, 0xE3, 0x00, + 0x00, 0x0F, 0xB0, 0x00, 0x00, 0x7D, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0xFF, 0xE3, 0xFF, 0x81, 0xFE, 0x7F, 0x01, 0xFC, 0x00, 0xF8, 0x7C, + 0x01, 0xF0, 0x00, 0xE0, 0xF8, 0x03, 0xE0, 0x01, 0x81, 0xF0, 0x03, 0xC0, + 0x07, 0x03, 0xE0, 0x07, 0x80, 0x0C, 0x03, 0xC0, 0x0F, 0x00, 0x18, 0x07, + 0x80, 0x1E, 0x00, 0x60, 0x0F, 0x00, 0x7E, 0x00, 0xC0, 0x1F, 0x00, 0xFC, + 0x03, 0x00, 0x3E, 0x03, 0xF8, 0x06, 0x00, 0x7C, 0x05, 0xF0, 0x18, 0x00, + 0xF8, 0x1B, 0xE0, 0x30, 0x01, 0xF0, 0x33, 0xC0, 0xC0, 0x01, 0xE0, 0xC7, + 0x83, 0x80, 0x03, 0xC1, 0x8F, 0x06, 0x00, 0x07, 0x86, 0x1E, 0x1C, 0x00, + 0x0F, 0x0C, 0x3C, 0x30, 0x00, 0x1F, 0x30, 0x7C, 0xE0, 0x00, 0x3E, 0x60, + 0xF9, 0x80, 0x00, 0x7D, 0x81, 0xF7, 0x00, 0x00, 0xFB, 0x03, 0xEC, 0x00, + 0x01, 0xFC, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x07, 0xE0, 0x00, 0x03, 0xE0, + 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x1F, 0x00, 0x00, 0x0F, 0x00, 0x3C, 0x00, + 0x00, 0x1E, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x00, 0x00, 0x70, + 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, + 0x00, 0x07, 0xFF, 0x83, 0xFF, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x7C, 0x00, + 0x78, 0x00, 0x7C, 0x00, 0x70, 0x00, 0x3C, 0x00, 0xE0, 0x00, 0x3E, 0x01, + 0xC0, 0x00, 0x3E, 0x01, 0x80, 0x00, 0x1F, 0x03, 0x00, 0x00, 0x1F, 0x07, + 0x00, 0x00, 0x0F, 0x0E, 0x00, 0x00, 0x0F, 0x9C, 0x00, 0x00, 0x0F, 0xB8, + 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, 0xC0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1C, 0xF0, 0x00, 0x00, 0x38, 0xF8, + 0x00, 0x00, 0x30, 0xF8, 0x00, 0x00, 0x60, 0x7C, 0x00, 0x00, 0xC0, 0x7C, + 0x00, 0x01, 0xC0, 0x3C, 0x00, 0x03, 0x80, 0x3E, 0x00, 0x07, 0x00, 0x3E, + 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x7F, 0x00, 0x3F, + 0xC0, 0xFF, 0xC1, 0xFF, 0xF0, 0x7F, 0xF0, 0x7F, 0xC7, 0xF0, 0x03, 0xE0, + 0xF8, 0x00, 0x70, 0x3E, 0x00, 0x38, 0x07, 0x80, 0x0C, 0x01, 0xE0, 0x07, + 0x00, 0x7C, 0x03, 0x80, 0x1F, 0x00, 0xC0, 0x03, 0xC0, 0x60, 0x00, 0xF0, + 0x30, 0x00, 0x3E, 0x1C, 0x00, 0x07, 0x8E, 0x00, 0x01, 0xE3, 0x00, 0x00, + 0x7D, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x03, 0xFF, + 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x81, 0xF0, 0x00, 0xFC, 0x0E, 0x00, 0x0F, + 0xC0, 0x60, 0x00, 0xFC, 0x06, 0x00, 0x0F, 0xC0, 0x20, 0x00, 0x7C, 0x00, + 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, + 0x08, 0x0F, 0xC0, 0x00, 0x80, 0xFC, 0x00, 0x0C, 0x07, 0xC0, 0x00, 0x60, + 0x7E, 0x00, 0x07, 0x07, 0xE0, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x03, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, + 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x07, 0x00, + 0x03, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80, 0x03, + 0xFC, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0x80, + 0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, + 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, + 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, + 0x80, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00, + 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, + 0x80, 0x00, 0xFF, 0x80, 0x07, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0xF0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, + 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x78, 0x00, 0x38, + 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, + 0xC0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x38, 0x03, 0xFC, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xBC, + 0x00, 0x39, 0xC0, 0x07, 0x1E, 0x00, 0x70, 0xE0, 0x0E, 0x0F, 0x00, 0xE0, + 0x70, 0x1E, 0x07, 0x81, 0xC0, 0x38, 0x3C, 0x03, 0xC3, 0x80, 0x1C, 0x78, + 0x01, 0xE7, 0x00, 0x0E, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x60, 0xF0, 0xF8, 0x78, 0x3C, 0x1E, 0x0E, 0x07, 0x00, 0x1E, 0x70, + 0x03, 0x0B, 0x80, 0x70, 0x3C, 0x07, 0x01, 0xE0, 0x70, 0x0E, 0x07, 0x00, + 0x70, 0x78, 0x03, 0x83, 0x80, 0x38, 0x3C, 0x01, 0xC1, 0xC0, 0x0E, 0x1E, + 0x00, 0xF0, 0xF0, 0x07, 0x0F, 0x00, 0x78, 0x78, 0x03, 0xC3, 0xC0, 0x3E, + 0x1E, 0x01, 0x70, 0xF0, 0x17, 0x0F, 0x81, 0x38, 0xBE, 0x11, 0xC8, 0xFF, + 0x0F, 0x83, 0xF0, 0x70, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x78, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x0F, + 0x80, 0x71, 0xFE, 0x03, 0x98, 0xF8, 0x3D, 0x03, 0xE1, 0xE8, 0x0F, 0x0E, + 0x80, 0x78, 0x78, 0x03, 0xC7, 0xC0, 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x0F, + 0x1E, 0x00, 0x78, 0xF0, 0x03, 0xC7, 0x80, 0x3C, 0x38, 0x01, 0xE3, 0xC0, + 0x1E, 0x1E, 0x00, 0xE0, 0xE0, 0x0E, 0x07, 0x00, 0xF0, 0x78, 0x07, 0x03, + 0xC0, 0xE0, 0x0F, 0x0E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x38, + 0x60, 0x38, 0x1C, 0x1C, 0x0F, 0x0E, 0x03, 0x87, 0x80, 0x03, 0xC0, 0x00, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x02, 0x3E, 0x01, + 0x87, 0x80, 0xC1, 0xF0, 0x60, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x71, + 0x70, 0x00, 0xC1, 0x70, 0x03, 0x80, 0xF0, 0x07, 0x80, 0xE0, 0x07, 0x01, + 0xE0, 0x0E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x01, 0xC0, 0x3C, 0x01, + 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0x80, 0xF0, 0x07, + 0x80, 0xF0, 0x07, 0x80, 0xF0, 0x0F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x17, + 0x08, 0xF0, 0x27, 0x10, 0x78, 0x47, 0x20, 0x7F, 0x87, 0xC0, 0x1E, 0x07, + 0x00, 0x00, 0x1F, 0x00, 0x1C, 0xF0, 0x1C, 0x1C, 0x0E, 0x07, 0x07, 0x01, + 0xC3, 0xC0, 0xF1, 0xE0, 0x38, 0x70, 0x1C, 0x3C, 0x0E, 0x1F, 0x0F, 0x07, + 0x8F, 0x01, 0xFE, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x01, 0x3C, 0x00, 0xC7, 0x80, 0x61, 0xF0, 0x60, 0x3F, 0xF0, + 0x03, 0xE0, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x03, 0x1C, 0x00, 0x00, + 0xC3, 0x80, 0x00, 0x38, 0x70, 0x00, 0x06, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, + 0xFF, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0xE0, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, + 0x03, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0x80, 0x00, 0x38, + 0x60, 0x00, 0x07, 0x0C, 0x00, 0x00, 0xE3, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x07, 0x0E, 0x00, 0x70, 0x3E, 0x07, 0x01, 0xF0, + 0x70, 0x0E, 0x07, 0x80, 0x70, 0x3C, 0x03, 0x81, 0xC0, 0x1C, 0x0E, 0x01, + 0xE0, 0x70, 0x0E, 0x03, 0x80, 0xF0, 0x0E, 0x0F, 0x00, 0x30, 0xE0, 0x00, + 0xFE, 0x00, 0x0C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x7E, 0x00, + 0x03, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x8F, 0xF0, 0x18, 0x0F, 0xC1, 0x80, + 0x1F, 0x18, 0x00, 0x78, 0xC0, 0x01, 0xC6, 0x00, 0x0E, 0x30, 0x00, 0x61, + 0xC0, 0x07, 0x06, 0x00, 0x70, 0x1C, 0x0E, 0x00, 0x3F, 0xC0, 0x00, 0x00, + 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, + 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x03, 0x80, 0x78, 0x7E, 0x03, 0x86, 0x70, + 0x3C, 0x43, 0x81, 0xE4, 0x1C, 0x0E, 0x40, 0xE0, 0x74, 0x0E, 0x07, 0xA0, + 0x70, 0x3E, 0x03, 0x81, 0xE0, 0x1C, 0x0F, 0x00, 0xE0, 0xF0, 0x0E, 0x07, + 0x80, 0x70, 0x38, 0x03, 0x81, 0xC0, 0x1C, 0x1E, 0x00, 0xC2, 0xF0, 0x0E, + 0x27, 0x00, 0x73, 0x38, 0x03, 0x93, 0xC0, 0x1F, 0x1E, 0x00, 0xE0, 0x03, + 0x81, 0xF0, 0x7C, 0x1F, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x71, 0xFC, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x03, 0xC0, 0xF0, + 0x38, 0x0E, 0x07, 0x81, 0xE0, 0x70, 0x1C, 0x0F, 0x03, 0x84, 0xE2, 0x39, + 0x0F, 0x81, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, + 0xF0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3F, 0xC0, 0x00, 0xF0, 0x00, 0x1E, + 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x78, + 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xE0, + 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x00, + 0x00, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, + 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x01, 0xC7, 0x00, 0x38, 0xC0, 0x07, + 0x30, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, + 0x00, 0x70, 0xFF, 0x83, 0x80, 0xF0, 0x3C, 0x06, 0x01, 0xE0, 0x60, 0x0E, + 0x06, 0x00, 0x70, 0xE0, 0x07, 0x8C, 0x00, 0x3C, 0xC0, 0x01, 0xCC, 0x00, + 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0x9E, 0x00, 0x38, 0xF0, 0x01, 0xC3, + 0x80, 0x1E, 0x1E, 0x00, 0xF0, 0x70, 0x07, 0x03, 0xC2, 0x78, 0x0E, 0x13, + 0xC0, 0x79, 0x1E, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0xE1, 0xFC, 0x0F, + 0x80, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x70, 0x1E, 0x03, 0xC0, 0x78, 0x0E, 0x03, + 0xC0, 0x78, 0x0E, 0x01, 0xC0, 0x78, 0x0F, 0x01, 0xC0, 0x38, 0x4F, 0x11, + 0xE4, 0x39, 0x07, 0xC0, 0x70, 0x00, 0x07, 0x81, 0xC0, 0x78, 0xFE, 0x0F, + 0xC1, 0xF8, 0x3C, 0x33, 0x84, 0x70, 0x78, 0x87, 0x10, 0xE0, 0xF2, 0x0E, + 0x41, 0xC1, 0xC8, 0x39, 0x07, 0x87, 0xA0, 0x74, 0x0F, 0x0F, 0x40, 0xE8, + 0x1E, 0x1F, 0x01, 0xE0, 0x38, 0x3C, 0x07, 0xC0, 0xF0, 0xF8, 0x0F, 0x01, + 0xE1, 0xE0, 0x1E, 0x03, 0xC3, 0xC0, 0x38, 0x07, 0x07, 0x00, 0xF0, 0x1E, + 0x1E, 0x01, 0xE0, 0x3C, 0x3C, 0x03, 0x80, 0x79, 0x70, 0x07, 0x00, 0xE2, + 0xE0, 0x1E, 0x03, 0x8B, 0xC0, 0x3C, 0x07, 0x27, 0x80, 0x70, 0x0F, 0x8E, + 0x00, 0xE0, 0x1E, 0x00, 0x07, 0x81, 0xE3, 0xFC, 0x3F, 0x83, 0xC2, 0x3C, + 0x1E, 0x21, 0xE0, 0xF2, 0x0F, 0x07, 0x20, 0x70, 0x39, 0x07, 0x83, 0xD0, + 0x3C, 0x1F, 0x01, 0xE0, 0xE8, 0x0E, 0x0F, 0x80, 0xF0, 0x78, 0x07, 0x83, + 0xC0, 0x38, 0x1C, 0x01, 0xC1, 0xE0, 0x1E, 0x0F, 0x00, 0xF1, 0x70, 0x07, + 0x0B, 0x80, 0x38, 0xBC, 0x01, 0xC9, 0xE0, 0x0F, 0x8E, 0x00, 0x38, 0x00, + 0x00, 0x1F, 0x80, 0x07, 0x8F, 0x00, 0x70, 0x3C, 0x07, 0x00, 0xE0, 0x70, + 0x07, 0x87, 0x80, 0x3C, 0x78, 0x01, 0xE7, 0x80, 0x0F, 0x3C, 0x00, 0x7B, + 0xC0, 0x03, 0xDE, 0x00, 0x3D, 0xF0, 0x01, 0xEF, 0x80, 0x0F, 0x78, 0x00, + 0xF3, 0xC0, 0x07, 0x9E, 0x00, 0x78, 0xF0, 0x03, 0x87, 0x80, 0x38, 0x1C, + 0x03, 0x80, 0xF0, 0x38, 0x03, 0xC3, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x3C, + 0x3F, 0x00, 0x7F, 0x8F, 0xF0, 0x01, 0xF7, 0x3F, 0x00, 0x1D, 0x83, 0xF0, + 0x07, 0xA0, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x1E, 0x00, 0xF8, 0x03, 0xC0, + 0x1F, 0x00, 0xF0, 0x03, 0xE0, 0x1E, 0x00, 0x7C, 0x03, 0xC0, 0x1F, 0x00, + 0x70, 0x03, 0xE0, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0x00, 0x70, 0x03, + 0xC0, 0x0E, 0x00, 0xF8, 0x03, 0xC0, 0x1E, 0x00, 0x78, 0x07, 0x80, 0x0F, + 0x01, 0xE0, 0x01, 0xE0, 0x70, 0x00, 0x7C, 0x3C, 0x00, 0x0F, 0x7C, 0x00, + 0x01, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x8D, + 0xC0, 0x38, 0x2E, 0x07, 0x80, 0xF0, 0x78, 0x07, 0x03, 0x80, 0x38, 0x38, + 0x03, 0xC3, 0xC0, 0x1E, 0x3C, 0x00, 0xE1, 0xE0, 0x07, 0x1E, 0x00, 0x78, + 0xF0, 0x03, 0x87, 0x80, 0x3C, 0x78, 0x01, 0xE3, 0xC0, 0x1F, 0x1E, 0x01, + 0x70, 0xF0, 0x17, 0x87, 0x80, 0xBC, 0x3C, 0x09, 0xC0, 0xF1, 0x8E, 0x07, + 0xF8, 0xF0, 0x1F, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, + 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x07, 0x87, 0x3F, 0x87, 0xC3, 0xC7, 0xE1, + 0xE6, 0xF0, 0xF6, 0x00, 0x72, 0x00, 0x3A, 0x00, 0x1D, 0x00, 0x1F, 0x00, + 0x0E, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, + 0x00, 0x00, 0x01, 0xF8, 0x81, 0x87, 0xC1, 0x80, 0xE1, 0xC0, 0x60, 0xE0, + 0x10, 0x70, 0x08, 0x3C, 0x04, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, + 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC1, 0x01, 0xE0, 0x80, 0x70, + 0x40, 0x38, 0x30, 0x1C, 0x38, 0x0C, 0x1C, 0x0E, 0x0F, 0x0E, 0x04, 0x7C, + 0x00, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x78, 0x1F, 0x03, 0xFF, 0x7F, 0xF0, + 0xF0, 0x0E, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x1C, 0x01, 0xC0, 0x3C, 0x03, + 0xC0, 0x38, 0x03, 0x80, 0x78, 0x07, 0x80, 0x70, 0x8F, 0x10, 0xF1, 0x0F, + 0x20, 0xFC, 0x07, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x0E, 0x7F, 0x00, 0xE0, + 0xF0, 0x1E, 0x0E, 0x01, 0xE1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, + 0x1C, 0x07, 0xC3, 0xC0, 0x78, 0x3C, 0x0F, 0x83, 0xC0, 0xB8, 0x38, 0x1F, + 0x87, 0x83, 0x70, 0x78, 0x27, 0x07, 0x86, 0x70, 0x70, 0xC7, 0x1F, 0x08, + 0xE1, 0xE1, 0x0E, 0x2E, 0x60, 0xE4, 0xFC, 0x0F, 0x87, 0x00, 0x70, 0x1C, + 0x03, 0xBF, 0x00, 0xF1, 0xE0, 0x3C, 0x78, 0x07, 0x1E, 0x00, 0xC3, 0x80, + 0x30, 0xE0, 0x08, 0x38, 0x06, 0x0E, 0x01, 0x03, 0x80, 0xC0, 0xF0, 0x20, + 0x3C, 0x10, 0x07, 0x04, 0x01, 0xC2, 0x00, 0x71, 0x00, 0x1C, 0xC0, 0x07, + 0x60, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x00, + 0x00, 0x0C, 0x00, 0x40, 0x3B, 0xF8, 0x01, 0x00, 0xF1, 0xE0, 0x0C, 0x03, + 0xC3, 0x80, 0x78, 0x07, 0x0E, 0x01, 0xE0, 0x0C, 0x38, 0x0F, 0x80, 0x20, + 0xE0, 0x6E, 0x00, 0x83, 0x81, 0x38, 0x04, 0x0F, 0x0C, 0xE0, 0x10, 0x1C, + 0x23, 0x80, 0x80, 0x71, 0x8E, 0x06, 0x01, 0xCC, 0x38, 0x10, 0x07, 0x20, + 0xE0, 0x80, 0x1D, 0x83, 0x86, 0x00, 0x7C, 0x07, 0x30, 0x01, 0xF0, 0x1C, + 0x80, 0x07, 0x80, 0x74, 0x00, 0x1E, 0x01, 0xF0, 0x00, 0x70, 0x07, 0x80, + 0x01, 0xC0, 0x1C, 0x00, 0x06, 0x00, 0x60, 0x00, 0x10, 0x01, 0x00, 0x00, + 0x00, 0xE0, 0x38, 0x1F, 0x81, 0xF0, 0x8F, 0x09, 0x80, 0x3C, 0x40, 0x00, + 0x72, 0x00, 0x01, 0xD0, 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x38, + 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, + 0x01, 0x70, 0x00, 0x09, 0xC0, 0x00, 0x67, 0x00, 0x01, 0x1E, 0x10, 0x08, + 0x38, 0x40, 0x40, 0xE2, 0x39, 0x03, 0xD0, 0xF8, 0x0F, 0x83, 0xC0, 0x1C, + 0x00, 0x07, 0x80, 0x33, 0xFC, 0x03, 0xC1, 0xE0, 0x1E, 0x07, 0x80, 0x70, + 0x3C, 0x01, 0x80, 0xE0, 0x0C, 0x07, 0x80, 0x40, 0x3C, 0x02, 0x00, 0xE0, + 0x20, 0x07, 0x81, 0x00, 0x3C, 0x18, 0x01, 0xE0, 0x80, 0x07, 0x0C, 0x00, + 0x38, 0x40, 0x01, 0xE4, 0x00, 0x0F, 0x60, 0x00, 0x3A, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, 0x00, + 0x80, 0x00, 0x0C, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, + 0x04, 0x00, 0x0E, 0x40, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, + 0xFF, 0x87, 0xFF, 0x82, 0x00, 0x83, 0x00, 0xC1, 0x00, 0xC0, 0x00, 0xC0, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, + 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xE8, 0xFC, 0x70, 0x1E, 0x38, 0x03, 0x88, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x0F, + 0x00, 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x70, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x80, + 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x07, + 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x80, + 0x00, 0x70, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, + 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C, + 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x18, 0x00, 0x08, 0x00, 0x1C, + 0x00, 0x7E, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, + 0x01, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x80, + 0x07, 0x80, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1C, 0x00, + 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFF, 0x80, 0xC7, 0xFF, 0x87, 0xBC, 0x3F, + 0xFE, 0x60, 0x3F, 0xF0, 0x00, 0x1F, 0x00}; + +const GFXglyph FreeSerifItalic24pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 12, 0, 1}, // 0x20 ' ' + {0, 12, 32, 16, 2, -30}, // 0x21 '!' + {48, 14, 12, 16, 6, -31}, // 0x22 '"' + {69, 25, 31, 23, 0, -30}, // 0x23 '#' + {166, 21, 38, 24, 2, -33}, // 0x24 '$' + {266, 33, 32, 39, 4, -30}, // 0x25 '%' + {398, 30, 33, 37, 4, -31}, // 0x26 '&' + {522, 5, 12, 9, 6, -31}, // 0x27 ''' + {530, 13, 39, 16, 2, -30}, // 0x28 '(' + {594, 13, 39, 16, 0, -30}, // 0x29 ')' + {658, 16, 20, 23, 7, -31}, // 0x2A '*' + {698, 23, 23, 32, 4, -22}, // 0x2B '+' + {765, 7, 11, 12, -1, -4}, // 0x2C ',' + {775, 11, 3, 16, 2, -11}, // 0x2D '-' + {780, 5, 5, 12, 1, -3}, // 0x2E '.' + {784, 21, 33, 14, 0, -31}, // 0x2F '/' + {871, 21, 31, 23, 2, -30}, // 0x30 '0' + {953, 17, 32, 23, 2, -31}, // 0x31 '1' + {1021, 21, 31, 24, 0, -30}, // 0x32 '2' + {1103, 22, 32, 23, 0, -31}, // 0x33 '3' + {1191, 22, 32, 23, 0, -31}, // 0x34 '4' + {1279, 22, 32, 24, 0, -31}, // 0x35 '5' + {1367, 23, 32, 23, 1, -31}, // 0x36 '6' + {1459, 21, 32, 23, 4, -31}, // 0x37 '7' + {1543, 22, 32, 23, 1, -31}, // 0x38 '8' + {1631, 22, 33, 23, 1, -31}, // 0x39 '9' + {1722, 9, 22, 12, 2, -20}, // 0x3A ':' + {1747, 11, 27, 12, 1, -20}, // 0x3B ';' + {1785, 23, 25, 27, 3, -24}, // 0x3C '<' + {1857, 24, 12, 31, 4, -17}, // 0x3D '=' + {1893, 24, 25, 27, 3, -24}, // 0x3E '>' + {1968, 16, 33, 21, 6, -31}, // 0x3F '?' + {2034, 33, 33, 37, 3, -31}, // 0x40 '@' + {2171, 29, 31, 31, 0, -30}, // 0x41 'A' + {2284, 28, 31, 28, 0, -30}, // 0x42 'B' + {2393, 30, 33, 29, 2, -31}, // 0x43 'C' + {2517, 33, 31, 33, 0, -30}, // 0x44 'D' + {2645, 29, 31, 27, 0, -30}, // 0x45 'E' + {2758, 29, 31, 27, 0, -30}, // 0x46 'F' + {2871, 31, 33, 32, 2, -31}, // 0x47 'G' + {2999, 36, 31, 33, 0, -30}, // 0x48 'H' + {3139, 18, 31, 15, 0, -30}, // 0x49 'I' + {3209, 23, 32, 20, 0, -30}, // 0x4A 'J' + {3301, 33, 31, 30, 0, -30}, // 0x4B 'K' + {3429, 27, 31, 27, 0, -30}, // 0x4C 'L' + {3534, 42, 31, 39, 0, -30}, // 0x4D 'M' + {3697, 35, 32, 32, 0, -30}, // 0x4E 'N' + {3837, 30, 33, 31, 2, -31}, // 0x4F 'O' + {3961, 29, 31, 27, 0, -30}, // 0x50 'P' + {4074, 30, 41, 31, 2, -31}, // 0x51 'Q' + {4228, 28, 31, 29, 0, -30}, // 0x52 'R' + {4337, 23, 33, 21, 0, -31}, // 0x53 'S' + {4432, 27, 31, 28, 4, -30}, // 0x54 'T' + {4537, 31, 32, 33, 5, -30}, // 0x55 'U' + {4661, 29, 32, 31, 6, -30}, // 0x56 'V' + {4777, 39, 32, 42, 6, -30}, // 0x57 'W' + {4933, 32, 31, 31, 0, -30}, // 0x58 'X' + {5057, 26, 31, 28, 5, -30}, // 0x59 'Y' + {5158, 29, 31, 26, 0, -30}, // 0x5A 'Z' + {5271, 17, 39, 18, 1, -31}, // 0x5B '[' + {5354, 17, 33, 23, 5, -31}, // 0x5C '\' + {5425, 17, 39, 18, 1, -31}, // 0x5D ']' + {5508, 20, 17, 20, 0, -31}, // 0x5E '^' + {5551, 24, 2, 23, 0, 5}, // 0x5F '_' + {5557, 8, 8, 12, 6, -31}, // 0x60 '`' + {5565, 21, 21, 23, 1, -20}, // 0x61 'a' + {5621, 21, 33, 22, 1, -31}, // 0x62 'b' + {5708, 18, 22, 19, 1, -20}, // 0x63 'c' + {5758, 24, 33, 23, 1, -31}, // 0x64 'd' + {5857, 18, 22, 19, 1, -20}, // 0x65 'e' + {5907, 27, 42, 20, -4, -31}, // 0x66 'f' + {6049, 21, 31, 21, -1, -20}, // 0x67 'g' + {6131, 21, 32, 23, 1, -31}, // 0x68 'h' + {6215, 10, 32, 12, 2, -30}, // 0x69 'i' + {6255, 19, 41, 13, -3, -30}, // 0x6A 'j' + {6353, 21, 33, 21, 1, -31}, // 0x6B 'k' + {6440, 11, 33, 12, 2, -31}, // 0x6C 'l' + {6486, 31, 21, 34, 1, -20}, // 0x6D 'm' + {6568, 21, 21, 23, 1, -20}, // 0x6E 'n' + {6624, 21, 22, 22, 1, -20}, // 0x6F 'o' + {6682, 27, 31, 22, -4, -20}, // 0x70 'p' + {6787, 21, 31, 23, 1, -20}, // 0x71 'q' + {6869, 17, 21, 17, 1, -20}, // 0x72 'r' + {6914, 17, 22, 16, 0, -20}, // 0x73 's' + {6961, 12, 26, 11, 1, -24}, // 0x74 't' + {7000, 20, 22, 23, 1, -20}, // 0x75 'u' + {7055, 18, 22, 21, 3, -20}, // 0x76 'v' + {7105, 30, 22, 32, 2, -20}, // 0x77 'w' + {7188, 22, 22, 20, -1, -20}, // 0x78 'x' + {7249, 21, 31, 22, 1, -20}, // 0x79 'y' + {7331, 17, 24, 18, 0, -19}, // 0x7A 'z' + {7382, 17, 40, 19, 2, -31}, // 0x7B '{' + {7467, 3, 33, 13, 5, -31}, // 0x7C '|' + {7480, 16, 41, 19, 0, -32}, // 0x7D '}' + {7562, 22, 6, 25, 2, -14}}; // 0x7E '~' + +const GFXfont FreeSerifItalic24pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic24pt7bBitmaps, + (GFXglyph *)FreeSerifItalic24pt7bGlyphs, 0x20, 0x7E, 56}; + +// Approx. 8251 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h new file mode 100644 index 0000000..be4ad05 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h @@ -0,0 +1,204 @@ +#pragma once +#include + +const uint8_t FreeSerifItalic9pt7bBitmaps[] PROGMEM = { + 0x11, 0x12, 0x22, 0x24, 0x40, 0x0C, 0xDE, 0xE5, 0x40, 0x04, 0x82, 0x20, + 0x98, 0x24, 0x7F, 0xC4, 0x82, 0x23, 0xFC, 0x24, 0x11, 0x04, 0x83, 0x20, + 0x1C, 0x1B, 0x99, 0x4D, 0x26, 0x81, 0xC0, 0x70, 0x1C, 0x13, 0x49, 0xA4, + 0xDA, 0xC7, 0xC1, 0x00, 0x80, 0x1C, 0x61, 0xCF, 0x0E, 0x28, 0x30, 0xA0, + 0xC5, 0x03, 0x34, 0xE7, 0xAE, 0x40, 0xB1, 0x05, 0x84, 0x26, 0x20, 0x99, + 0x84, 0x3C, 0x03, 0x80, 0x6C, 0x06, 0xC0, 0x78, 0x06, 0x01, 0xEF, 0x66, + 0x24, 0x24, 0xC3, 0x8C, 0x10, 0xE3, 0x87, 0xCE, 0xFA, 0x08, 0x21, 0x08, + 0x61, 0x8C, 0x30, 0xC3, 0x0C, 0x30, 0x41, 0x02, 0x00, 0x10, 0x40, 0x82, + 0x0C, 0x30, 0xC3, 0x0C, 0x61, 0x84, 0x21, 0x08, 0x00, 0x30, 0xCA, 0x5E, + 0x6A, 0x93, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, + 0x08, 0x00, 0x56, 0xF0, 0xF0, 0x03, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10, + 0x30, 0x20, 0x60, 0x40, 0xC0, 0x0E, 0x0C, 0x8C, 0x6C, 0x36, 0x1F, 0x0F, + 0x07, 0x87, 0xC3, 0x61, 0xB1, 0x88, 0x83, 0x80, 0x04, 0x70, 0xC3, 0x08, + 0x21, 0x86, 0x10, 0x43, 0x08, 0xF8, 0x1C, 0x67, 0x83, 0x03, 0x02, 0x06, + 0x0C, 0x08, 0x10, 0x20, 0x42, 0xFC, 0x0F, 0x08, 0xC0, 0x60, 0xC1, 0xE0, + 0x38, 0x0C, 0x06, 0x03, 0x01, 0x01, 0x1F, 0x00, 0x01, 0x01, 0x81, 0x41, + 0x61, 0x21, 0x11, 0x18, 0x88, 0xFF, 0x02, 0x03, 0x01, 0x00, 0x0F, 0x84, + 0x04, 0x03, 0x80, 0x60, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x03, 0x1E, 0x00, + 0x01, 0x83, 0x87, 0x07, 0x03, 0x03, 0x73, 0xCD, 0x86, 0xC3, 0x61, 0xB1, + 0x88, 0xC3, 0xC0, 0x7F, 0x40, 0x80, 0x80, 0x40, 0x40, 0x60, 0x20, 0x20, + 0x10, 0x10, 0x18, 0x08, 0x00, 0x1E, 0x19, 0xCC, 0x66, 0x33, 0xB0, 0xE0, + 0x50, 0xCC, 0xC3, 0x61, 0xB0, 0xCC, 0xC3, 0xC0, 0x0E, 0x19, 0x8C, 0x6C, + 0x36, 0x1B, 0x0D, 0x86, 0xE6, 0x3F, 0x03, 0x03, 0x06, 0x0C, 0x00, 0x33, + 0x00, 0x00, 0xCC, 0x33, 0x00, 0x00, 0x44, 0x48, 0x01, 0x83, 0x86, 0x1C, + 0x0C, 0x03, 0x80, 0x30, 0x07, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x0F, + 0xF8, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x18, 0x38, 0x70, 0xC0, 0x80, 0x00, + 0x3C, 0x8C, 0x18, 0x30, 0xC3, 0x0C, 0x20, 0x40, 0x80, 0x06, 0x00, 0x0F, + 0xC0, 0xC3, 0x0C, 0x04, 0xC7, 0xBC, 0x64, 0xE2, 0x27, 0x31, 0x39, 0x91, + 0xCC, 0x93, 0x3B, 0x0E, 0x00, 0x1F, 0x80, 0x01, 0x00, 0x60, 0x14, 0x04, + 0xC0, 0x98, 0x23, 0x07, 0xE1, 0x04, 0x20, 0x88, 0x1B, 0x8F, 0x80, 0x3F, + 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3E, 0x04, 0x61, 0x86, 0x30, 0xC4, + 0x19, 0x86, 0x7F, 0x80, 0x07, 0x91, 0x86, 0x30, 0x26, 0x02, 0x60, 0x0C, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x61, 0x83, 0xE0, 0x3F, 0xC0, + 0x63, 0x82, 0x0C, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0x40, 0x66, 0x07, 0x30, + 0x31, 0x03, 0x18, 0x71, 0xFE, 0x00, 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80, + 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10, 0x30, 0x02, 0x04, 0x60, 0x8F, 0xF8, + 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80, 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10, + 0x30, 0x02, 0x00, 0x60, 0x0F, 0x80, 0x07, 0x91, 0x87, 0x30, 0x26, 0x02, + 0x60, 0x0C, 0x00, 0xC1, 0xFC, 0x0C, 0xC0, 0xCC, 0x0C, 0x60, 0x83, 0xF0, + 0x3E, 0x3C, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0x81, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x3C, 0x78, 0x1E, 0x18, 0x20, + 0xC1, 0x83, 0x04, 0x18, 0x30, 0x41, 0x87, 0x80, 0x0F, 0x81, 0x80, 0x80, + 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x04, 0x36, 0x1E, 0x00, 0x3E, 0x78, + 0x61, 0x82, 0x10, 0x31, 0x01, 0xB0, 0x0E, 0x00, 0x58, 0x06, 0x60, 0x33, + 0x01, 0x0C, 0x18, 0x61, 0xE7, 0xC0, 0x3E, 0x01, 0x80, 0x20, 0x0C, 0x01, + 0x80, 0x30, 0x04, 0x01, 0x80, 0x30, 0x04, 0x0D, 0x83, 0x7F, 0xE0, 0x1C, + 0x07, 0x0C, 0x0E, 0x0C, 0x14, 0x14, 0x1C, 0x14, 0x2C, 0x16, 0x4C, 0x26, + 0x48, 0x26, 0x98, 0x27, 0x18, 0x27, 0x10, 0x42, 0x30, 0xF4, 0x7C, 0x38, + 0x78, 0x60, 0x83, 0x04, 0x2C, 0x41, 0x22, 0x09, 0x10, 0x4D, 0x84, 0x28, + 0x21, 0x41, 0x06, 0x10, 0x21, 0xE1, 0x00, 0x07, 0x83, 0x18, 0xC1, 0xB0, + 0x36, 0x07, 0xC0, 0xF0, 0x3E, 0x06, 0xC0, 0xD8, 0x31, 0x8C, 0x1E, 0x00, + 0x3F, 0xC1, 0x9C, 0x21, 0x8C, 0x31, 0x86, 0x31, 0x87, 0xE1, 0x80, 0x30, + 0x04, 0x01, 0x80, 0x78, 0x00, 0x07, 0x83, 0x18, 0xC1, 0x98, 0x36, 0x07, + 0xC0, 0xF0, 0x1E, 0x06, 0xC0, 0xD8, 0x31, 0x04, 0x13, 0x01, 0x80, 0x70, + 0xB7, 0xE0, 0x3F, 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3F, 0x04, 0xC1, + 0x98, 0x31, 0x84, 0x31, 0x86, 0x78, 0x70, 0x1E, 0x4C, 0x63, 0x08, 0xC0, + 0x38, 0x07, 0x00, 0x60, 0x0C, 0x43, 0x10, 0xC6, 0x62, 0x70, 0x7F, 0xE9, + 0x8E, 0x31, 0x04, 0x01, 0x80, 0x30, 0x06, 0x00, 0x80, 0x30, 0x06, 0x00, + 0x80, 0x7E, 0x00, 0x7C, 0xF3, 0x02, 0x30, 0x46, 0x04, 0x60, 0x46, 0x04, + 0x40, 0x8C, 0x08, 0xC0, 0x8C, 0x10, 0xE3, 0x03, 0xC0, 0xF8, 0xEC, 0x0C, + 0x81, 0x18, 0x43, 0x08, 0x62, 0x0C, 0x81, 0x90, 0x14, 0x03, 0x00, 0x60, + 0x08, 0x00, 0xFB, 0xCE, 0x43, 0x0C, 0x86, 0x11, 0x8C, 0x43, 0x38, 0x86, + 0xB2, 0x0D, 0x24, 0x1C, 0x50, 0x38, 0xA0, 0x21, 0x80, 0x42, 0x01, 0x04, + 0x00, 0x3E, 0x71, 0x82, 0x0C, 0x40, 0xC8, 0x07, 0x00, 0x60, 0x06, 0x00, + 0xB0, 0x13, 0x02, 0x18, 0x61, 0x8F, 0x3E, 0xF9, 0xC8, 0x23, 0x10, 0xC8, + 0x34, 0x05, 0x01, 0x80, 0x40, 0x30, 0x0C, 0x03, 0x03, 0xE0, 0x3F, 0xE4, + 0x19, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x40, 0x18, 0x06, 0x05, + 0x81, 0x7F, 0xE0, 0x0E, 0x10, 0x20, 0x81, 0x02, 0x04, 0x10, 0x20, 0x40, + 0x82, 0x04, 0x08, 0x1C, 0x00, 0x81, 0x04, 0x18, 0x20, 0xC1, 0x04, 0x08, + 0x20, 0x41, 0x38, 0x20, 0x82, 0x08, 0x41, 0x04, 0x10, 0xC2, 0x08, 0x20, + 0x8C, 0x00, 0x18, 0x18, 0x2C, 0x24, 0x46, 0x42, 0x83, 0xFF, 0x80, 0xD8, + 0x80, 0x1F, 0x98, 0x98, 0x4C, 0x2C, 0x36, 0x33, 0x3A, 0xEE, 0x38, 0x08, + 0x04, 0x02, 0x03, 0x71, 0xCC, 0xC6, 0xC3, 0x63, 0x21, 0x93, 0x8F, 0x00, + 0x1F, 0x33, 0x60, 0xC0, 0xC0, 0xC0, 0xC4, 0x78, 0x01, 0x80, 0x40, 0x60, + 0x20, 0xF1, 0x89, 0x8C, 0xC4, 0xC2, 0x63, 0x33, 0xAE, 0xE0, 0x0E, 0x65, + 0x8B, 0x2F, 0x98, 0x31, 0x3C, 0x01, 0xE0, 0x40, 0x08, 0x02, 0x00, 0x40, + 0x3E, 0x03, 0x00, 0x40, 0x08, 0x01, 0x00, 0x60, 0x0C, 0x01, 0x00, 0x20, + 0x04, 0x01, 0x00, 0xC0, 0x00, 0x1E, 0x19, 0xD8, 0xCC, 0xE1, 0xC3, 0x01, + 0xE0, 0xBC, 0x82, 0x41, 0x31, 0x0F, 0x00, 0x38, 0x08, 0x04, 0x02, 0x03, + 0x39, 0x6C, 0xC6, 0x46, 0x63, 0x21, 0x11, 0xB8, 0xE0, 0x30, 0x00, 0xE2, + 0x44, 0xC8, 0xCE, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x83, 0x04, 0x08, 0x10, + 0x60, 0x81, 0x02, 0x04, 0x70, 0x38, 0x10, 0x10, 0x10, 0x37, 0x22, 0x24, + 0x38, 0x78, 0x48, 0x4D, 0xC6, 0x73, 0x32, 0x26, 0x64, 0x4C, 0xDE, 0x77, + 0x39, 0x5E, 0xCC, 0xCC, 0xCE, 0x66, 0x62, 0x22, 0x11, 0x11, 0xB9, 0x8E, + 0x77, 0x3B, 0x33, 0x62, 0x62, 0x42, 0x4D, 0xCE, 0x0F, 0x18, 0xD8, 0x7C, + 0x3C, 0x3E, 0x1B, 0x18, 0xF0, 0x3B, 0x87, 0x31, 0x8C, 0x43, 0x31, 0x88, + 0x62, 0x30, 0xF0, 0x60, 0x10, 0x04, 0x03, 0x80, 0x0F, 0x18, 0x98, 0x4C, + 0x2C, 0x26, 0x33, 0x38, 0xEC, 0x04, 0x02, 0x03, 0x03, 0xC0, 0x76, 0x50, + 0xC1, 0x06, 0x08, 0x10, 0x60, 0x1A, 0x6C, 0xC8, 0xC0, 0xD1, 0xB3, 0x5C, + 0x23, 0xC8, 0xC4, 0x21, 0x18, 0xE0, 0xC3, 0x42, 0x42, 0xC6, 0x86, 0x8C, + 0x9D, 0xEE, 0x62, 0xC4, 0x89, 0xA3, 0x47, 0x0C, 0x10, 0xE2, 0x2C, 0x44, + 0xD8, 0x9D, 0x23, 0xA4, 0x65, 0x0C, 0xC1, 0x10, 0x19, 0x95, 0x43, 0x01, + 0x80, 0xC0, 0xA0, 0x91, 0x8E, 0x70, 0x88, 0x46, 0x23, 0x20, 0x90, 0x50, + 0x28, 0x18, 0x08, 0x08, 0x08, 0x18, 0x00, 0x3F, 0x42, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x72, 0x0E, 0x08, 0x61, 0x04, 0x30, 0x86, 0x08, 0x61, 0x04, + 0x30, 0xC3, 0x8F, 0x00, 0xFF, 0xF0, 0x1E, 0x0C, 0x10, 0x20, 0xC1, 0x82, + 0x04, 0x1C, 0x30, 0x40, 0x83, 0x04, 0x08, 0x20, 0x60, 0x99, 0x8E}; + +const GFXglyph FreeSerifItalic9pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 5, 0, 1}, // 0x20 ' ' + {0, 4, 12, 6, 1, -11}, // 0x21 '!' + {6, 5, 4, 6, 3, -11}, // 0x22 '"' + {9, 10, 12, 9, 0, -11}, // 0x23 '#' + {24, 9, 15, 9, 1, -12}, // 0x24 '$' + {41, 14, 12, 15, 1, -11}, // 0x25 '%' + {62, 12, 12, 14, 1, -11}, // 0x26 '&' + {80, 2, 4, 4, 3, -11}, // 0x27 ''' + {81, 6, 15, 6, 1, -11}, // 0x28 '(' + {93, 6, 15, 6, 0, -11}, // 0x29 ')' + {105, 6, 8, 9, 3, -11}, // 0x2A '*' + {111, 9, 9, 12, 1, -8}, // 0x2B '+' + {122, 2, 4, 5, 0, -1}, // 0x2C ',' + {123, 4, 1, 6, 1, -3}, // 0x2D '-' + {124, 2, 2, 5, 0, -1}, // 0x2E '.' + {125, 8, 12, 5, 0, -11}, // 0x2F '/' + {137, 9, 13, 9, 1, -12}, // 0x30 '0' + {152, 6, 13, 9, 1, -12}, // 0x31 '1' + {162, 8, 12, 9, 1, -11}, // 0x32 '2' + {174, 9, 12, 9, 0, -11}, // 0x33 '3' + {188, 9, 12, 9, 0, -11}, // 0x34 '4' + {202, 9, 12, 9, 0, -11}, // 0x35 '5' + {216, 9, 13, 9, 1, -12}, // 0x36 '6' + {231, 9, 12, 9, 1, -11}, // 0x37 '7' + {245, 9, 13, 9, 1, -12}, // 0x38 '8' + {260, 9, 13, 9, 0, -12}, // 0x39 '9' + {275, 4, 8, 4, 1, -7}, // 0x3A ':' + {279, 4, 10, 4, 1, -7}, // 0x3B ';' + {284, 9, 9, 10, 1, -8}, // 0x3C '<' + {295, 9, 5, 12, 2, -6}, // 0x3D '=' + {301, 9, 9, 10, 1, -8}, // 0x3E '>' + {312, 7, 12, 8, 2, -11}, // 0x3F '?' + {323, 13, 12, 14, 1, -11}, // 0x40 '@' + {343, 11, 11, 12, 0, -10}, // 0x41 'A' + {359, 11, 12, 11, 0, -11}, // 0x42 'B' + {376, 12, 12, 11, 1, -11}, // 0x43 'C' + {394, 13, 12, 13, 0, -11}, // 0x44 'D' + {414, 12, 12, 10, 0, -11}, // 0x45 'E' + {432, 12, 12, 10, 0, -11}, // 0x46 'F' + {450, 12, 12, 12, 1, -11}, // 0x47 'G' + {468, 14, 12, 13, 0, -11}, // 0x48 'H' + {489, 7, 12, 6, 0, -11}, // 0x49 'I' + {500, 9, 12, 8, 0, -11}, // 0x4A 'J' + {514, 13, 12, 12, 0, -11}, // 0x4B 'K' + {534, 11, 12, 10, 0, -11}, // 0x4C 'L' + {551, 16, 12, 15, 0, -11}, // 0x4D 'M' + {575, 13, 12, 12, 0, -11}, // 0x4E 'N' + {595, 11, 12, 12, 1, -11}, // 0x4F 'O' + {612, 11, 12, 10, 0, -11}, // 0x50 'P' + {629, 11, 15, 12, 1, -11}, // 0x51 'Q' + {650, 11, 12, 11, 0, -11}, // 0x52 'R' + {667, 10, 12, 8, 0, -11}, // 0x53 'S' + {682, 11, 12, 11, 2, -11}, // 0x54 'T' + {699, 12, 12, 13, 2, -11}, // 0x55 'U' + {717, 11, 12, 12, 2, -11}, // 0x56 'V' + {734, 15, 12, 16, 2, -11}, // 0x57 'W' + {757, 12, 12, 12, 0, -11}, // 0x58 'X' + {775, 10, 12, 11, 2, -11}, // 0x59 'Y' + {790, 11, 12, 10, 0, -11}, // 0x5A 'Z' + {807, 7, 15, 7, 0, -11}, // 0x5B '[' + {821, 6, 12, 9, 2, -11}, // 0x5C '\' + {830, 6, 15, 7, 1, -11}, // 0x5D ']' + {842, 8, 7, 8, 0, -11}, // 0x5E '^' + {849, 9, 1, 9, 0, 2}, // 0x5F '_' + {851, 3, 3, 5, 2, -11}, // 0x60 '`' + {853, 9, 8, 9, 0, -7}, // 0x61 'a' + {862, 9, 12, 9, 0, -11}, // 0x62 'b' + {876, 8, 8, 7, 0, -7}, // 0x63 'c' + {884, 9, 12, 9, 0, -11}, // 0x64 'd' + {898, 7, 8, 7, 0, -7}, // 0x65 'e' + {905, 11, 17, 8, -1, -12}, // 0x66 'f' + {929, 9, 12, 8, 0, -7}, // 0x67 'g' + {943, 9, 12, 9, 0, -11}, // 0x68 'h' + {957, 4, 12, 4, 1, -11}, // 0x69 'i' + {963, 7, 16, 5, -1, -11}, // 0x6A 'j' + {977, 8, 12, 8, 0, -11}, // 0x6B 'k' + {989, 4, 12, 5, 1, -11}, // 0x6C 'l' + {995, 13, 8, 13, 0, -7}, // 0x6D 'm' + {1008, 8, 8, 9, 0, -7}, // 0x6E 'n' + {1016, 9, 8, 9, 0, -7}, // 0x6F 'o' + {1025, 10, 12, 8, -1, -7}, // 0x70 'p' + {1040, 9, 12, 9, 0, -7}, // 0x71 'q' + {1054, 7, 8, 7, 0, -7}, // 0x72 'r' + {1061, 7, 8, 6, 0, -7}, // 0x73 's' + {1068, 5, 9, 4, 0, -8}, // 0x74 't' + {1074, 8, 8, 9, 1, -7}, // 0x75 'u' + {1082, 7, 8, 8, 1, -7}, // 0x76 'v' + {1089, 11, 8, 12, 1, -7}, // 0x77 'w' + {1100, 9, 8, 8, -1, -7}, // 0x78 'x' + {1109, 9, 12, 9, 0, -7}, // 0x79 'y' + {1123, 8, 9, 7, 0, -7}, // 0x7A 'z' + {1132, 6, 15, 7, 1, -11}, // 0x7B '{' + {1144, 1, 12, 5, 2, -11}, // 0x7C '|' + {1146, 7, 16, 7, 0, -12}, // 0x7D '}' + {1160, 8, 3, 10, 1, -5}}; // 0x7E '~' + +const GFXfont FreeSerifItalic9pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic9pt7bBitmaps, + (GFXglyph *)FreeSerifItalic9pt7bGlyphs, 0x20, 0x7E, 22}; + +// Approx. 1835 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/Org_01.h b/src/library/Adafruit-GFX-Library/Fonts/Org_01.h new file mode 100644 index 0000000..9b80258 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/Org_01.h @@ -0,0 +1,131 @@ +#pragma once +#include + +// Org_v01 by Orgdot (www.orgdot.com/aliasfonts). A tiny, +// stylized font with all characters within a 6 pixel height. + +const uint8_t Org_01Bitmaps[] PROGMEM = { + 0xE8, 0xA0, 0x57, 0xD5, 0xF5, 0x00, 0xFD, 0x3E, 0x5F, 0x80, 0x88, 0x88, + 0x88, 0x80, 0xF4, 0xBF, 0x2E, 0x80, 0x80, 0x6A, 0x40, 0x95, 0x80, 0xAA, + 0x80, 0x5D, 0x00, 0xC0, 0xF0, 0x80, 0x08, 0x88, 0x88, 0x00, 0xFC, 0x63, + 0x1F, 0x80, 0xF8, 0xF8, 0x7F, 0x0F, 0x80, 0xF8, 0x7E, 0x1F, 0x80, 0x8C, + 0x7E, 0x10, 0x80, 0xFC, 0x3E, 0x1F, 0x80, 0xFC, 0x3F, 0x1F, 0x80, 0xF8, + 0x42, 0x10, 0x80, 0xFC, 0x7F, 0x1F, 0x80, 0xFC, 0x7E, 0x1F, 0x80, 0x90, + 0xB0, 0x2A, 0x22, 0xF0, 0xF0, 0x88, 0xA8, 0xF8, 0x4E, 0x02, 0x00, 0xFD, + 0x6F, 0x0F, 0x80, 0xFC, 0x7F, 0x18, 0x80, 0xF4, 0x7D, 0x1F, 0x00, 0xFC, + 0x21, 0x0F, 0x80, 0xF4, 0x63, 0x1F, 0x00, 0xFC, 0x3F, 0x0F, 0x80, 0xFC, + 0x3F, 0x08, 0x00, 0xFC, 0x2F, 0x1F, 0x80, 0x8C, 0x7F, 0x18, 0x80, 0xF9, + 0x08, 0x4F, 0x80, 0x78, 0x85, 0x2F, 0x80, 0x8D, 0xB1, 0x68, 0x80, 0x84, + 0x21, 0x0F, 0x80, 0xFD, 0x6B, 0x5A, 0x80, 0xFC, 0x63, 0x18, 0x80, 0xFC, + 0x63, 0x1F, 0x80, 0xFC, 0x7F, 0x08, 0x00, 0xFC, 0x63, 0x3F, 0x80, 0xFC, + 0x7F, 0x29, 0x00, 0xFC, 0x3E, 0x1F, 0x80, 0xF9, 0x08, 0x42, 0x00, 0x8C, + 0x63, 0x1F, 0x80, 0x8C, 0x62, 0xA2, 0x00, 0xAD, 0x6B, 0x5F, 0x80, 0x8A, + 0x88, 0xA8, 0x80, 0x8C, 0x54, 0x42, 0x00, 0xF8, 0x7F, 0x0F, 0x80, 0xEA, + 0xC0, 0x82, 0x08, 0x20, 0x80, 0xD5, 0xC0, 0x54, 0xF8, 0x80, 0xF1, 0xFF, + 0x8F, 0x99, 0xF0, 0xF8, 0x8F, 0x1F, 0x99, 0xF0, 0xFF, 0x8F, 0x6B, 0xA4, + 0xF9, 0x9F, 0x10, 0x8F, 0x99, 0x90, 0xF0, 0x55, 0xC0, 0x8A, 0xF9, 0x90, + 0xF8, 0xFD, 0x63, 0x10, 0xF9, 0x99, 0xF9, 0x9F, 0xF9, 0x9F, 0x80, 0xF9, + 0x9F, 0x20, 0xF8, 0x88, 0x47, 0x1F, 0x27, 0xC8, 0x42, 0x00, 0x99, 0x9F, + 0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F, + 0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0}; + +const GFXglyph Org_01Glyphs[] PROGMEM = {{0, 0, 0, 6, 0, 1}, // 0x20 ' ' + {0, 1, 5, 2, 0, -4}, // 0x21 '!' + {1, 3, 1, 4, 0, -4}, // 0x22 '"' + {2, 5, 5, 6, 0, -4}, // 0x23 '#' + {6, 5, 5, 6, 0, -4}, // 0x24 '$' + {10, 5, 5, 6, 0, -4}, // 0x25 '%' + {14, 5, 5, 6, 0, -4}, // 0x26 '&' + {18, 1, 1, 2, 0, -4}, // 0x27 ''' + {19, 2, 5, 3, 0, -4}, // 0x28 '(' + {21, 2, 5, 3, 0, -4}, // 0x29 ')' + {23, 3, 3, 4, 0, -3}, // 0x2A '*' + {25, 3, 3, 4, 0, -3}, // 0x2B '+' + {27, 1, 2, 2, 0, 0}, // 0x2C ',' + {28, 4, 1, 5, 0, -2}, // 0x2D '-' + {29, 1, 1, 2, 0, 0}, // 0x2E '.' + {30, 5, 5, 6, 0, -4}, // 0x2F '/' + {34, 5, 5, 6, 0, -4}, // 0x30 '0' + {38, 1, 5, 2, 0, -4}, // 0x31 '1' + {39, 5, 5, 6, 0, -4}, // 0x32 '2' + {43, 5, 5, 6, 0, -4}, // 0x33 '3' + {47, 5, 5, 6, 0, -4}, // 0x34 '4' + {51, 5, 5, 6, 0, -4}, // 0x35 '5' + {55, 5, 5, 6, 0, -4}, // 0x36 '6' + {59, 5, 5, 6, 0, -4}, // 0x37 '7' + {63, 5, 5, 6, 0, -4}, // 0x38 '8' + {67, 5, 5, 6, 0, -4}, // 0x39 '9' + {71, 1, 4, 2, 0, -3}, // 0x3A ':' + {72, 1, 4, 2, 0, -3}, // 0x3B ';' + {73, 3, 5, 4, 0, -4}, // 0x3C '<' + {75, 4, 3, 5, 0, -3}, // 0x3D '=' + {77, 3, 5, 4, 0, -4}, // 0x3E '>' + {79, 5, 5, 6, 0, -4}, // 0x3F '?' + {83, 5, 5, 6, 0, -4}, // 0x40 '@' + {87, 5, 5, 6, 0, -4}, // 0x41 'A' + {91, 5, 5, 6, 0, -4}, // 0x42 'B' + {95, 5, 5, 6, 0, -4}, // 0x43 'C' + {99, 5, 5, 6, 0, -4}, // 0x44 'D' + {103, 5, 5, 6, 0, -4}, // 0x45 'E' + {107, 5, 5, 6, 0, -4}, // 0x46 'F' + {111, 5, 5, 6, 0, -4}, // 0x47 'G' + {115, 5, 5, 6, 0, -4}, // 0x48 'H' + {119, 5, 5, 6, 0, -4}, // 0x49 'I' + {123, 5, 5, 6, 0, -4}, // 0x4A 'J' + {127, 5, 5, 6, 0, -4}, // 0x4B 'K' + {131, 5, 5, 6, 0, -4}, // 0x4C 'L' + {135, 5, 5, 6, 0, -4}, // 0x4D 'M' + {139, 5, 5, 6, 0, -4}, // 0x4E 'N' + {143, 5, 5, 6, 0, -4}, // 0x4F 'O' + {147, 5, 5, 6, 0, -4}, // 0x50 'P' + {151, 5, 5, 6, 0, -4}, // 0x51 'Q' + {155, 5, 5, 6, 0, -4}, // 0x52 'R' + {159, 5, 5, 6, 0, -4}, // 0x53 'S' + {163, 5, 5, 6, 0, -4}, // 0x54 'T' + {167, 5, 5, 6, 0, -4}, // 0x55 'U' + {171, 5, 5, 6, 0, -4}, // 0x56 'V' + {175, 5, 5, 6, 0, -4}, // 0x57 'W' + {179, 5, 5, 6, 0, -4}, // 0x58 'X' + {183, 5, 5, 6, 0, -4}, // 0x59 'Y' + {187, 5, 5, 6, 0, -4}, // 0x5A 'Z' + {191, 2, 5, 3, 0, -4}, // 0x5B '[' + {193, 5, 5, 6, 0, -4}, // 0x5C '\' + {197, 2, 5, 3, 0, -4}, // 0x5D ']' + {199, 3, 2, 4, 0, -4}, // 0x5E '^' + {200, 5, 1, 6, 0, 1}, // 0x5F '_' + {201, 1, 1, 2, 0, -4}, // 0x60 '`' + {202, 4, 4, 5, 0, -3}, // 0x61 'a' + {204, 4, 5, 5, 0, -4}, // 0x62 'b' + {207, 4, 4, 5, 0, -3}, // 0x63 'c' + {209, 4, 5, 5, 0, -4}, // 0x64 'd' + {212, 4, 4, 5, 0, -3}, // 0x65 'e' + {214, 3, 5, 4, 0, -4}, // 0x66 'f' + {216, 4, 5, 5, 0, -3}, // 0x67 'g' + {219, 4, 5, 5, 0, -4}, // 0x68 'h' + {222, 1, 4, 2, 0, -3}, // 0x69 'i' + {223, 2, 5, 3, 0, -3}, // 0x6A 'j' + {225, 4, 5, 5, 0, -4}, // 0x6B 'k' + {228, 1, 5, 2, 0, -4}, // 0x6C 'l' + {229, 5, 4, 6, 0, -3}, // 0x6D 'm' + {232, 4, 4, 5, 0, -3}, // 0x6E 'n' + {234, 4, 4, 5, 0, -3}, // 0x6F 'o' + {236, 4, 5, 5, 0, -3}, // 0x70 'p' + {239, 4, 5, 5, 0, -3}, // 0x71 'q' + {242, 4, 4, 5, 0, -3}, // 0x72 'r' + {244, 4, 4, 5, 0, -3}, // 0x73 's' + {246, 5, 5, 6, 0, -4}, // 0x74 't' + {250, 4, 4, 5, 0, -3}, // 0x75 'u' + {252, 4, 4, 5, 0, -3}, // 0x76 'v' + {254, 5, 4, 6, 0, -3}, // 0x77 'w' + {257, 4, 4, 5, 0, -3}, // 0x78 'x' + {259, 4, 5, 5, 0, -3}, // 0x79 'y' + {262, 4, 4, 5, 0, -3}, // 0x7A 'z' + {264, 3, 5, 4, 0, -4}, // 0x7B '{' + {266, 1, 5, 2, 0, -4}, // 0x7C '|' + {267, 3, 5, 4, 0, -4}, // 0x7D '}' + {269, 5, 3, 6, 0, -3}}; // 0x7E '~' + +const GFXfont Org_01 PROGMEM = {(uint8_t *)Org_01Bitmaps, + (GFXglyph *)Org_01Glyphs, 0x20, 0x7E, 7}; + +// Approx. 943 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/Picopixel.h b/src/library/Adafruit-GFX-Library/Fonts/Picopixel.h new file mode 100644 index 0000000..463b1b5 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/Picopixel.h @@ -0,0 +1,123 @@ +#pragma once +#include + +// Picopixel by Sebastian Weber. A tiny font +// with all characters within a 6 pixel height. + +const uint8_t PicopixelBitmaps[] PROGMEM = { + 0xE8, 0xB4, 0x57, 0xD5, 0xF5, 0x00, 0x4E, 0x3E, 0x80, 0xA5, 0x4A, 0x4A, + 0x5A, 0x50, 0xC0, 0x6A, 0x40, 0x95, 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60, + 0xE0, 0x80, 0x25, 0x48, 0x56, 0xD4, 0x75, 0x40, 0xC5, 0x4E, 0xC5, 0x1C, + 0x97, 0x92, 0xF3, 0x1C, 0x53, 0x54, 0xE5, 0x48, 0x55, 0x54, 0x55, 0x94, + 0xA0, 0x46, 0x64, 0xE3, 0x80, 0x98, 0xC5, 0x04, 0x56, 0xC6, 0x57, 0xDA, + 0xD7, 0x5C, 0x72, 0x46, 0xD6, 0xDC, 0xF3, 0xCE, 0xF3, 0x48, 0x72, 0xD4, + 0xB7, 0xDA, 0xF8, 0x24, 0xD4, 0xBB, 0x5A, 0x92, 0x4E, 0x8E, 0xEB, 0x58, + 0x80, 0x9D, 0xB9, 0x90, 0x56, 0xD4, 0xD7, 0x48, 0x56, 0xD4, 0x40, 0xD7, + 0x5A, 0x71, 0x1C, 0xE9, 0x24, 0xB6, 0xD4, 0xB6, 0xA4, 0x8C, 0x6B, 0x55, + 0x00, 0xB5, 0x5A, 0xB5, 0x24, 0xE5, 0x4E, 0xEA, 0xC0, 0x91, 0x12, 0xD5, + 0xC0, 0x54, 0xF0, 0x90, 0xC7, 0xF0, 0x93, 0x5E, 0x71, 0x80, 0x25, 0xDE, + 0x5E, 0x30, 0x6E, 0x80, 0x77, 0x9C, 0x93, 0x5A, 0xB8, 0x45, 0x60, 0x92, + 0xEA, 0xAA, 0x40, 0xD5, 0x6A, 0xD6, 0x80, 0x55, 0x00, 0xD7, 0x40, 0x75, + 0x90, 0xE8, 0x71, 0xE0, 0xBA, 0x40, 0xB5, 0x80, 0xB5, 0x00, 0x8D, 0x54, + 0xAA, 0x80, 0xAC, 0xE0, 0xE5, 0x70, 0x6A, 0x26, 0xFC, 0xC8, 0xAC, 0x5A}; + +const GFXglyph PicopixelGlyphs[] PROGMEM = {{0, 0, 0, 2, 0, 1}, // 0x20 ' ' + {0, 1, 5, 2, 0, -4}, // 0x21 '!' + {1, 3, 2, 4, 0, -4}, // 0x22 '"' + {2, 5, 5, 6, 0, -4}, // 0x23 '#' + {6, 3, 6, 4, 0, -4}, // 0x24 '$' + {9, 3, 5, 4, 0, -4}, // 0x25 '%' + {11, 4, 5, 5, 0, -4}, // 0x26 '&' + {14, 1, 2, 2, 0, -4}, // 0x27 ''' + {15, 2, 5, 3, 0, -4}, // 0x28 '(' + {17, 2, 5, 3, 0, -4}, // 0x29 ')' + {19, 3, 3, 4, 0, -3}, // 0x2A '*' + {21, 3, 3, 4, 0, -3}, // 0x2B '+' + {23, 2, 2, 3, 0, 0}, // 0x2C ',' + {24, 3, 1, 4, 0, -2}, // 0x2D '-' + {25, 1, 1, 2, 0, 0}, // 0x2E '.' + {26, 3, 5, 4, 0, -4}, // 0x2F '/' + {28, 3, 5, 4, 0, -4}, // 0x30 '0' + {30, 2, 5, 3, 0, -4}, // 0x31 '1' + {32, 3, 5, 4, 0, -4}, // 0x32 '2' + {34, 3, 5, 4, 0, -4}, // 0x33 '3' + {36, 3, 5, 4, 0, -4}, // 0x34 '4' + {38, 3, 5, 4, 0, -4}, // 0x35 '5' + {40, 3, 5, 4, 0, -4}, // 0x36 '6' + {42, 3, 5, 4, 0, -4}, // 0x37 '7' + {44, 3, 5, 4, 0, -4}, // 0x38 '8' + {46, 3, 5, 4, 0, -4}, // 0x39 '9' + {48, 1, 3, 2, 0, -3}, // 0x3A ':' + {49, 2, 4, 3, 0, -3}, // 0x3B ';' + {50, 2, 3, 3, 0, -3}, // 0x3C '<' + {51, 3, 3, 4, 0, -3}, // 0x3D '=' + {53, 2, 3, 3, 0, -3}, // 0x3E '>' + {54, 3, 5, 4, 0, -4}, // 0x3F '?' + {56, 3, 5, 4, 0, -4}, // 0x40 '@' + {58, 3, 5, 4, 0, -4}, // 0x41 'A' + {60, 3, 5, 4, 0, -4}, // 0x42 'B' + {62, 3, 5, 4, 0, -4}, // 0x43 'C' + {64, 3, 5, 4, 0, -4}, // 0x44 'D' + {66, 3, 5, 4, 0, -4}, // 0x45 'E' + {68, 3, 5, 4, 0, -4}, // 0x46 'F' + {70, 3, 5, 4, 0, -4}, // 0x47 'G' + {72, 3, 5, 4, 0, -4}, // 0x48 'H' + {74, 1, 5, 2, 0, -4}, // 0x49 'I' + {75, 3, 5, 4, 0, -4}, // 0x4A 'J' + {77, 3, 5, 4, 0, -4}, // 0x4B 'K' + {79, 3, 5, 4, 0, -4}, // 0x4C 'L' + {81, 5, 5, 6, 0, -4}, // 0x4D 'M' + {85, 4, 5, 5, 0, -4}, // 0x4E 'N' + {88, 3, 5, 4, 0, -4}, // 0x4F 'O' + {90, 3, 5, 4, 0, -4}, // 0x50 'P' + {92, 3, 6, 4, 0, -4}, // 0x51 'Q' + {95, 3, 5, 4, 0, -4}, // 0x52 'R' + {97, 3, 5, 4, 0, -4}, // 0x53 'S' + {99, 3, 5, 4, 0, -4}, // 0x54 'T' + {101, 3, 5, 4, 0, -4}, // 0x55 'U' + {103, 3, 5, 4, 0, -4}, // 0x56 'V' + {105, 5, 5, 6, 0, -4}, // 0x57 'W' + {109, 3, 5, 4, 0, -4}, // 0x58 'X' + {111, 3, 5, 4, 0, -4}, // 0x59 'Y' + {113, 3, 5, 4, 0, -4}, // 0x5A 'Z' + {115, 2, 5, 3, 0, -4}, // 0x5B '[' + {117, 3, 5, 4, 0, -4}, // 0x5C '\' + {119, 2, 5, 3, 0, -4}, // 0x5D ']' + {121, 3, 2, 4, 0, -4}, // 0x5E '^' + {122, 4, 1, 4, 0, 1}, // 0x5F '_' + {123, 2, 2, 3, 0, -4}, // 0x60 '`' + {124, 3, 4, 4, 0, -3}, // 0x61 'a' + {126, 3, 5, 4, 0, -4}, // 0x62 'b' + {128, 3, 3, 4, 0, -2}, // 0x63 'c' + {130, 3, 5, 4, 0, -4}, // 0x64 'd' + {132, 3, 4, 4, 0, -3}, // 0x65 'e' + {134, 2, 5, 3, 0, -4}, // 0x66 'f' + {136, 3, 5, 4, 0, -3}, // 0x67 'g' + {138, 3, 5, 4, 0, -4}, // 0x68 'h' + {140, 1, 5, 2, 0, -4}, // 0x69 'i' + {141, 2, 6, 3, 0, -4}, // 0x6A 'j' + {143, 3, 5, 4, 0, -4}, // 0x6B 'k' + {145, 2, 5, 3, 0, -4}, // 0x6C 'l' + {147, 5, 3, 6, 0, -2}, // 0x6D 'm' + {149, 3, 3, 4, 0, -2}, // 0x6E 'n' + {151, 3, 3, 4, 0, -2}, // 0x6F 'o' + {153, 3, 4, 4, 0, -2}, // 0x70 'p' + {155, 3, 4, 4, 0, -2}, // 0x71 'q' + {157, 2, 3, 3, 0, -2}, // 0x72 'r' + {158, 3, 4, 4, 0, -3}, // 0x73 's' + {160, 2, 5, 3, 0, -4}, // 0x74 't' + {162, 3, 3, 4, 0, -2}, // 0x75 'u' + {164, 3, 3, 4, 0, -2}, // 0x76 'v' + {166, 5, 3, 6, 0, -2}, // 0x77 'w' + {168, 3, 3, 4, 0, -2}, // 0x78 'x' + {170, 3, 4, 4, 0, -2}, // 0x79 'y' + {172, 3, 4, 4, 0, -3}, // 0x7A 'z' + {174, 3, 5, 4, 0, -4}, // 0x7B '{' + {176, 1, 6, 2, 0, -4}, // 0x7C '|' + {177, 3, 5, 4, 0, -4}, // 0x7D '}' + {179, 4, 2, 5, 0, -3}}; // 0x7E '~' + +const GFXfont Picopixel PROGMEM = {(uint8_t *)PicopixelBitmaps, + (GFXglyph *)PicopixelGlyphs, 0x20, 0x7E, 7}; + +// Approx. 852 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h b/src/library/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h new file mode 100644 index 0000000..5b0ba4a --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h @@ -0,0 +1,133 @@ +#pragma once +#include + +/** +** The FontStruction “Tiny3x3a” +** (https://fontstruct.com/fontstructions/show/670512) by “Michaelangel007” is +** licensed under a Creative Commons Attribution Non-commercial Share Alike +*license +** (http://creativecommons.org/licenses/by-nc-sa/3.0/). +** “Tiny3x3a” was originally cloned (copied) from the FontStruction +** “CHECKER” (https://fontstruct.com/fontstructions/show/2391) by Wolf grant +** Grant, which is licensed under a Creative Commons Attribution Non-commercial +** Share Alike license (http://creativecommons.org/licenses/by-nc-sa/3.0/). +* +* Converted by eadmaster with fontconvert +**/ + +const uint8_t Tiny3x3a2pt7bBitmaps[] PROGMEM = { + 0xC0, 0xB4, 0xBF, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0x59, 0x80, 0x80, 0x64, + 0x98, 0xF0, 0x5D, 0x00, 0xC0, 0xE0, 0x80, 0x2A, 0x00, 0x55, 0x00, 0x94, + 0xC9, 0x80, 0xEF, 0x80, 0xBC, 0x80, 0x6B, 0x00, 0x9F, 0x80, 0xE4, 0x80, + 0x7F, 0x00, 0xFC, 0x80, 0xA0, 0x58, 0x64, 0xE3, 0x80, 0x98, 0xD8, 0xD8, + 0x80, 0x5E, 0x80, 0xDF, 0x80, 0x71, 0x80, 0xD7, 0x00, 0xFB, 0x80, 0xFA, + 0x00, 0xD7, 0x80, 0xBE, 0x80, 0xE0, 0x27, 0x00, 0xBA, 0x80, 0x93, 0x80, + 0xFE, 0x80, 0xF6, 0x80, 0xF7, 0x80, 0xFE, 0x00, 0xF7, 0x00, 0xDE, 0x80, + 0x6B, 0x00, 0xE9, 0x00, 0xB7, 0x80, 0xB5, 0x00, 0xBF, 0x80, 0xAA, 0x80, + 0xA9, 0x00, 0xEB, 0x80, 0xEC, 0x88, 0x80, 0xDC, 0x54, 0xE0, 0x90, 0x70, + 0xBC, 0xF0, 0x7C, 0xB0, 0x68, 0xFC, 0xBC, 0xC0, 0x58, 0x9A, 0x80, 0xA4, + 0xDC, 0xD4, 0xF0, 0xF8, 0xF4, 0xE0, 0x60, 0x59, 0x80, 0xBC, 0xA8, 0xEC, + 0xF0, 0xAC, 0x80, 0x90, 0x79, 0x80, 0xF0, 0xCF, 0x00, 0x78}; + +const GFXglyph Tiny3x3a2pt7bGlyphs[] PROGMEM = { + {0, 0, 0, 4, 0, 1}, // 0x20 ' ' + {0, 1, 2, 3, 1, -2}, // 0x21 '!' + {1, 3, 2, 4, 0, -2}, // 0x22 '"' + {2, 3, 3, 4, 0, -2}, // 0x23 '#' + {4, 3, 3, 4, 0, -2}, // 0x24 '$' + {6, 3, 3, 4, 0, -2}, // 0x25 '%' + {8, 3, 3, 4, 0, -2}, // 0x26 '&' + {10, 1, 1, 3, 1, -2}, // 0x27 ''' + {11, 2, 3, 3, 0, -2}, // 0x28 '(' + {12, 2, 3, 4, 1, -2}, // 0x29 ')' + {13, 2, 2, 4, 1, -2}, // 0x2A '*' + {14, 3, 3, 4, 0, -2}, // 0x2B '+' + {16, 1, 2, 2, 0, 0}, // 0x2C ',' + {17, 3, 1, 4, 0, -1}, // 0x2D '-' + {18, 1, 1, 2, 0, 0}, // 0x2E '.' + {19, 3, 3, 4, 0, -2}, // 0x2F '/' + {21, 3, 3, 4, 0, -2}, // 0x30 '0' + {23, 2, 3, 3, 0, -2}, // 0x31 '1' + {24, 3, 3, 4, 0, -2}, // 0x32 '2' + {26, 3, 3, 4, 0, -2}, // 0x33 '3' + {28, 3, 3, 4, 0, -2}, // 0x34 '4' + {30, 3, 3, 4, 0, -2}, // 0x35 '5' + {32, 3, 3, 4, 0, -2}, // 0x36 '6' + {34, 3, 3, 4, 0, -2}, // 0x37 '7' + {36, 3, 3, 4, 0, -2}, // 0x38 '8' + {38, 3, 3, 4, 0, -2}, // 0x39 '9' + {40, 1, 3, 3, 1, -2}, // 0x3A ':' + {41, 2, 3, 3, 0, -1}, // 0x3B ';' + {42, 2, 3, 3, 0, -2}, // 0x3C '<' + {43, 3, 3, 4, 0, -2}, // 0x3D '=' + {45, 2, 3, 4, 1, -2}, // 0x3E '>' + {46, 2, 3, 4, 1, -2}, // 0x3F '?' + {47, 3, 3, 4, 0, -2}, // 0x40 '@' + {49, 3, 3, 4, 0, -2}, // 0x41 'A' + {51, 3, 3, 4, 0, -2}, // 0x42 'B' + {53, 3, 3, 4, 0, -2}, // 0x43 'C' + {55, 3, 3, 4, 0, -2}, // 0x44 'D' + {57, 3, 3, 4, 0, -2}, // 0x45 'E' + {59, 3, 3, 4, 0, -2}, // 0x46 'F' + {61, 3, 3, 4, 0, -2}, // 0x47 'G' + {63, 3, 3, 4, 0, -2}, // 0x48 'H' + {65, 1, 3, 3, 1, -2}, // 0x49 'I' + {66, 3, 3, 4, 0, -2}, // 0x4A 'J' + {68, 3, 3, 4, 0, -2}, // 0x4B 'K' + {70, 3, 3, 4, 0, -2}, // 0x4C 'L' + {72, 3, 3, 4, 0, -2}, // 0x4D 'M' + {74, 3, 3, 4, 0, -2}, // 0x4E 'N' + {76, 3, 3, 4, 0, -2}, // 0x4F 'O' + {78, 3, 3, 4, 0, -2}, // 0x50 'P' + {80, 3, 3, 4, 0, -2}, // 0x51 'Q' + {82, 3, 3, 4, 0, -2}, // 0x52 'R' + {84, 3, 3, 4, 0, -2}, // 0x53 'S' + {86, 3, 3, 4, 0, -2}, // 0x54 'T' + {88, 3, 3, 4, 0, -2}, // 0x55 'U' + {90, 3, 3, 4, 0, -2}, // 0x56 'V' + {92, 3, 3, 4, 0, -2}, // 0x57 'W' + {94, 3, 3, 4, 0, -2}, // 0x58 'X' + {96, 3, 3, 4, 0, -2}, // 0x59 'Y' + {98, 3, 3, 4, 0, -2}, // 0x5A 'Z' + {100, 2, 3, 3, 0, -2}, // 0x5B '[' + {101, 3, 3, 4, 0, -2}, // 0x5C '\' + {103, 2, 3, 4, 1, -2}, // 0x5D ']' + {104, 3, 2, 4, 0, -2}, // 0x5E '^' + {105, 3, 1, 4, 0, 0}, // 0x5F '_' + {106, 2, 2, 3, 0, -2}, // 0x60 '`' + {107, 2, 2, 3, 0, -1}, // 0x61 'a' + {108, 2, 3, 3, 0, -2}, // 0x62 'b' + {109, 2, 2, 3, 0, -1}, // 0x63 'c' + {110, 2, 3, 3, 0, -2}, // 0x64 'd' + {111, 2, 2, 3, 0, -1}, // 0x65 'e' + {112, 2, 3, 3, 0, -2}, // 0x66 'f' + {113, 2, 3, 3, 0, -1}, // 0x67 'g' + {114, 2, 3, 3, 0, -2}, // 0x68 'h' + {115, 1, 2, 2, 0, -1}, // 0x69 'i' + {116, 2, 3, 3, 0, -1}, // 0x6A 'j' + {117, 3, 3, 4, 0, -2}, // 0x6B 'k' + {119, 2, 3, 3, 0, -2}, // 0x6C 'l' + {120, 3, 2, 4, 0, -1}, // 0x6D 'm' + {121, 3, 2, 4, 0, -1}, // 0x6E 'n' + {122, 2, 2, 3, 0, -1}, // 0x6F 'o' + {123, 2, 3, 3, 0, -1}, // 0x70 'p' + {124, 2, 3, 3, 0, -1}, // 0x71 'q' + {125, 2, 2, 3, 0, -1}, // 0x72 'r' + {126, 2, 2, 3, 0, -1}, // 0x73 's' + {127, 3, 3, 4, 0, -2}, // 0x74 't' + {129, 3, 2, 4, 0, -1}, // 0x75 'u' + {130, 3, 2, 4, 0, -1}, // 0x76 'v' + {131, 3, 2, 4, 0, -1}, // 0x77 'w' + {132, 2, 2, 3, 0, -1}, // 0x78 'x' + {133, 3, 3, 4, 0, -1}, // 0x79 'y' + {135, 2, 2, 3, 0, -1}, // 0x7A 'z' + {136, 3, 3, 4, 0, -2}, // 0x7B '{' + {138, 1, 4, 3, 1, -2}, // 0x7C '|' + {139, 3, 3, 4, 0, -2}, // 0x7D '}' + {141, 3, 2, 4, 0, -2}}; // 0x7E '~' + +const GFXfont Tiny3x3a2pt7b PROGMEM = {(uint8_t *)Tiny3x3a2pt7bBitmaps, + (GFXglyph *)Tiny3x3a2pt7bGlyphs, 0x20, + 0x7E, 4}; + +// Approx. 814 bytes diff --git a/src/library/Adafruit-GFX-Library/Fonts/TomThumb.h b/src/library/Adafruit-GFX-Library/Fonts/TomThumb.h new file mode 100644 index 0000000..2155500 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/Fonts/TomThumb.h @@ -0,0 +1,477 @@ +#pragma once +#include + +/** +** The original 3x5 font is licensed under the 3-clause BSD license: +** +** Copyright 1999 Brian J. Swetland +** Copyright 1999 Vassilii Khachaturov +** Portions (of vt100.c/vt100.h) copyright Dan Marks +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions, and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions, and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the authors may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** Modifications to Tom Thumb for improved readability are from Robey Pointer, +** see: +** http://robey.lag.net/2010/01/23/tiny-monospace-font.html +** +** The original author does not have any objection to relicensing of Robey +** Pointer's modifications (in this file) in a more permissive license. See +** the discussion at the above blog, and also here: +** http://opengameart.org/forumtopic/how-to-submit-art-using-the-3-clause-bsd-license +** +** Feb 21, 2016: Conversion from Linux BDF --> Adafruit GFX font, +** with the help of this Python script: +** https://gist.github.com/skelliam/322d421f028545f16f6d +** William Skellenger (williamj@skellenger.net) +** Twitter: @skelliam +** +** Jan 09, 2020: Bitmaps now compressed, to fix the bounding box problem, +** because non-compressed the calculated text width were wrong. +** Andreas Merkle (web@blue-andi.de) +*/ + +#define TOMTHUMB_USE_EXTENDED 0 + +const uint8_t TomThumbBitmaps[] PROGMEM = { + 0x00, /* 0x20 space */ + 0xE8, /* 0x21 exclam */ + 0xB4, /* 0x22 quotedbl */ + 0xBE, 0xFA, /* 0x23 numbersign */ + 0x79, 0xE4, /* 0x24 dollar */ + 0x85, 0x42, /* 0x25 percent */ + 0xDB, 0xD6, /* 0x26 ampersand */ + 0xC0, /* 0x27 quotesingle */ + 0x6A, 0x40, /* 0x28 parenleft */ + 0x95, 0x80, /* 0x29 parenright */ + 0xAA, 0x80, /* 0x2A asterisk */ + 0x5D, 0x00, /* 0x2B plus */ + 0x60, /* 0x2C comma */ + 0xE0, /* 0x2D hyphen */ + 0x80, /* 0x2E period */ + 0x25, 0x48, /* 0x2F slash */ + 0x76, 0xDC, /* 0x30 zero */ + 0x75, 0x40, /* 0x31 one */ + 0xC5, 0x4E, /* 0x32 two */ + 0xC5, 0x1C, /* 0x33 three */ + 0xB7, 0x92, /* 0x34 four */ + 0xF3, 0x1C, /* 0x35 five */ + 0x73, 0xDE, /* 0x36 six */ + 0xE5, 0x48, /* 0x37 seven */ + 0xF7, 0xDE, /* 0x38 eight */ + 0xF7, 0x9C, /* 0x39 nine */ + 0xA0, /* 0x3A colon */ + 0x46, /* 0x3B semicolon */ + 0x2A, 0x22, /* 0x3C less */ + 0xE3, 0x80, /* 0x3D equal */ + 0x88, 0xA8, /* 0x3E greater */ + 0xE5, 0x04, /* 0x3F question */ + 0x57, 0xC6, /* 0x40 at */ + 0x57, 0xDA, /* 0x41 A */ + 0xD7, 0x5C, /* 0x42 B */ + 0x72, 0x46, /* 0x43 C */ + 0xD6, 0xDC, /* 0x44 D */ + 0xF3, 0xCE, /* 0x45 E */ + 0xF3, 0xC8, /* 0x46 F */ + 0x73, 0xD6, /* 0x47 G */ + 0xB7, 0xDA, /* 0x48 H */ + 0xE9, 0x2E, /* 0x49 I */ + 0x24, 0xD4, /* 0x4A J */ + 0xB7, 0x5A, /* 0x4B K */ + 0x92, 0x4E, /* 0x4C L */ + 0xBF, 0xDA, /* 0x4D M */ + 0xBF, 0xFA, /* 0x4E N */ + 0x56, 0xD4, /* 0x4F O */ + 0xD7, 0x48, /* 0x50 P */ + 0x56, 0xF6, /* 0x51 Q */ + 0xD7, 0xEA, /* 0x52 R */ + 0x71, 0x1C, /* 0x53 S */ + 0xE9, 0x24, /* 0x54 T */ + 0xB6, 0xD6, /* 0x55 U */ + 0xB6, 0xA4, /* 0x56 V */ + 0xB7, 0xFA, /* 0x57 W */ + 0xB5, 0x5A, /* 0x58 X */ + 0xB5, 0x24, /* 0x59 Y */ + 0xE5, 0x4E, /* 0x5A Z */ + 0xF2, 0x4E, /* 0x5B bracketleft */ + 0x88, 0x80, /* 0x5C backslash */ + 0xE4, 0x9E, /* 0x5D bracketright */ + 0x54, /* 0x5E asciicircum */ + 0xE0, /* 0x5F underscore */ + 0x90, /* 0x60 grave */ + 0xCE, 0xF0, /* 0x61 a */ + 0x9A, 0xDC, /* 0x62 b */ + 0x72, 0x30, /* 0x63 c */ + 0x2E, 0xD6, /* 0x64 d */ + 0x77, 0x30, /* 0x65 e */ + 0x2B, 0xA4, /* 0x66 f */ + 0x77, 0x94, /* 0x67 g */ + 0x9A, 0xDA, /* 0x68 h */ + 0xB8, /* 0x69 i */ + 0x20, 0x9A, 0x80, /* 0x6A j */ + 0x97, 0x6A, /* 0x6B k */ + 0xC9, 0x2E, /* 0x6C l */ + 0xFF, 0xD0, /* 0x6D m */ + 0xD6, 0xD0, /* 0x6E n */ + 0x56, 0xA0, /* 0x6F o */ + 0xD6, 0xE8, /* 0x70 p */ + 0x76, 0xB2, /* 0x71 q */ + 0x72, 0x40, /* 0x72 r */ + 0x79, 0xE0, /* 0x73 s */ + 0x5D, 0x26, /* 0x74 t */ + 0xB6, 0xB0, /* 0x75 u */ + 0xB7, 0xA0, /* 0x76 v */ + 0xBF, 0xF0, /* 0x77 w */ + 0xA9, 0x50, /* 0x78 x */ + 0xB5, 0x94, /* 0x79 y */ + 0xEF, 0x70, /* 0x7A z */ + 0x6A, 0x26, /* 0x7B braceleft */ + 0xD8, /* 0x7C bar */ + 0xC8, 0xAC, /* 0x7D braceright */ + 0x78, /* 0x7E asciitilde */ +#if (TOMTHUMB_USE_EXTENDED) + 0xB8, /* 0xA1 exclamdown */ + 0x5E, 0x74, /* 0xA2 cent */ + 0x6B, 0xAE, /* 0xA3 sterling */ + 0xAB, 0xAA, /* 0xA4 currency */ + 0xB5, 0x74, /* 0xA5 yen */ + 0xD8, /* 0xA6 brokenbar */ + 0x6A, 0xAC, /* 0xA7 section */ + 0xA0, /* 0xA8 dieresis */ + 0x71, 0x80, /* 0xA9 copyright */ + 0x77, 0x8E, /* 0xAA ordfeminine */ + 0x64, /* 0xAB guillemotleft */ + 0xE4, /* 0xAC logicalnot */ + 0xC0, /* 0xAD softhyphen */ + 0xDA, 0x80, /* 0xAE registered */ + 0xE0, /* 0xAF macron */ + 0x55, 0x00, /* 0xB0 degree */ + 0x5D, 0x0E, /* 0xB1 plusminus */ + 0xC9, 0x80, /* 0xB2 twosuperior */ + 0xEF, 0x80, /* 0xB3 threesuperior */ + 0x60, /* 0xB4 acute */ + 0xB6, 0xE8, /* 0xB5 mu */ + 0x75, 0xB6, /* 0xB6 paragraph */ + 0xFF, 0x80, /* 0xB7 periodcentered */ + 0x47, 0x00, /* 0xB8 cedilla */ + 0xE0, /* 0xB9 onesuperior */ + 0x55, 0x0E, /* 0xBA ordmasculine */ + 0x98, /* 0xBB guillemotright */ + 0x90, 0x32, /* 0xBC onequarter */ + 0x90, 0x66, /* 0xBD onehalf */ + 0xD8, 0x32, /* 0xBE threequarters */ + 0x41, 0x4E, /* 0xBF questiondown */ + 0x45, 0x7A, /* 0xC0 Agrave */ + 0x51, 0x7A, /* 0xC1 Aacute */ + 0xE1, 0x7A, /* 0xC2 Acircumflex */ + 0x79, 0x7A, /* 0xC3 Atilde */ + 0xAA, 0xFA, /* 0xC4 Adieresis */ + 0xDA, 0xFA, /* 0xC5 Aring */ + 0x7B, 0xEE, /* 0xC6 AE */ + 0x72, 0x32, 0x80, /* 0xC7 Ccedilla */ + 0x47, 0xEE, /* 0xC8 Egrave */ + 0x53, 0xEE, /* 0xC9 Eacute */ + 0xE3, 0xEE, /* 0xCA Ecircumflex */ + 0xA3, 0xEE, /* 0xCB Edieresis */ + 0x47, 0xAE, /* 0xCC Igrave */ + 0x53, 0xAE, /* 0xCD Iacute */ + 0xE3, 0xAE, /* 0xCE Icircumflex */ + 0xA3, 0xAE, /* 0xCF Idieresis */ + 0xD7, 0xDC, /* 0xD0 Eth */ + 0xCE, 0xFA, /* 0xD1 Ntilde */ + 0x47, 0xDE, /* 0xD2 Ograve */ + 0x53, 0xDE, /* 0xD3 Oacute */ + 0xE3, 0xDE, /* 0xD4 Ocircumflex */ + 0xCF, 0xDE, /* 0xD5 Otilde */ + 0xA3, 0xDE, /* 0xD6 Odieresis */ + 0xAA, 0x80, /* 0xD7 multiply */ + 0x77, 0xDC, /* 0xD8 Oslash */ + 0x8A, 0xDE, /* 0xD9 Ugrave */ + 0x2A, 0xDE, /* 0xDA Uacute */ + 0xE2, 0xDE, /* 0xDB Ucircumflex */ + 0xA2, 0xDE, /* 0xDC Udieresis */ + 0x2A, 0xF4, /* 0xDD Yacute */ + 0x9E, 0xF8, /* 0xDE Thorn */ + 0x77, 0x5D, 0x00, /* 0xDF germandbls */ + 0x45, 0xDE, /* 0xE0 agrave */ + 0x51, 0xDE, /* 0xE1 aacute */ + 0xE1, 0xDE, /* 0xE2 acircumflex */ + 0x79, 0xDE, /* 0xE3 atilde */ + 0xA1, 0xDE, /* 0xE4 adieresis */ + 0x6D, 0xDE, /* 0xE5 aring */ + 0x7F, 0xE0, /* 0xE6 ae */ + 0x71, 0x94, /* 0xE7 ccedilla */ + 0x45, 0xF6, /* 0xE8 egrave */ + 0x51, 0xF6, /* 0xE9 eacute */ + 0xE1, 0xF6, /* 0xEA ecircumflex */ + 0xA1, 0xF6, /* 0xEB edieresis */ + 0x9A, 0x80, /* 0xEC igrave */ + 0x65, 0x40, /* 0xED iacute */ + 0xE1, 0x24, /* 0xEE icircumflex */ + 0xA1, 0x24, /* 0xEF idieresis */ + 0x79, 0xD6, /* 0xF0 eth */ + 0xCF, 0x5A, /* 0xF1 ntilde */ + 0x45, 0x54, /* 0xF2 ograve */ + 0x51, 0x54, /* 0xF3 oacute */ + 0xE1, 0x54, /* 0xF4 ocircumflex */ + 0xCD, 0x54, /* 0xF5 otilde */ + 0xA1, 0x54, /* 0xF6 odieresis */ + 0x43, 0x84, /* 0xF7 divide */ + 0x7E, 0xE0, /* 0xF8 oslash */ + 0x8A, 0xD6, /* 0xF9 ugrave */ + 0x2A, 0xD6, /* 0xFA uacute */ + 0xE2, 0xD6, /* 0xFB ucircumflex */ + 0xA2, 0xD6, /* 0xFC udieresis */ + 0x2A, 0xB2, 0x80, /* 0xFD yacute */ + 0x9A, 0xE8, /* 0xFE thorn */ + 0xA2, 0xB2, 0x80, /* 0xFF ydieresis */ + 0x00, /* 0x11D gcircumflex */ + 0x7B, 0xE6, /* 0x152 OE */ + 0x7F, 0x70, /* 0x153 oe */ + 0xAF, 0x3C, /* 0x160 Scaron */ + 0xAF, 0x3C, /* 0x161 scaron */ + 0xA2, 0xA4, /* 0x178 Ydieresis */ + 0xBD, 0xEE, /* 0x17D Zcaron */ + 0xBD, 0xEE, /* 0x17E zcaron */ + 0x00, /* 0xEA4 uni0EA4 */ + 0x00, /* 0x13A0 uni13A0 */ + 0x80, /* 0x2022 bullet */ + 0xA0, /* 0x2026 ellipsis */ + 0x7F, 0xE6, /* 0x20AC Euro */ + 0xEA, 0xAA, 0xE0, /* 0xFFFD uniFFFD */ +#endif /* (TOMTHUMB_USE_EXTENDED) */ +}; + +/* {offset, width, height, advance cursor, x offset, y offset} */ +const GFXglyph TomThumbGlyphs[] PROGMEM = { + {0, 1, 1, 2, 0, -5}, /* 0x20 space */ + {1, 1, 5, 2, 0, -5}, /* 0x21 exclam */ + {2, 3, 2, 4, 0, -5}, /* 0x22 quotedbl */ + {3, 3, 5, 4, 0, -5}, /* 0x23 numbersign */ + {5, 3, 5, 4, 0, -5}, /* 0x24 dollar */ + {7, 3, 5, 4, 0, -5}, /* 0x25 percent */ + {9, 3, 5, 4, 0, -5}, /* 0x26 ampersand */ + {11, 1, 2, 2, 0, -5}, /* 0x27 quotesingle */ + {12, 2, 5, 3, 0, -5}, /* 0x28 parenleft */ + {14, 2, 5, 3, 0, -5}, /* 0x29 parenright */ + {16, 3, 3, 4, 0, -5}, /* 0x2A asterisk */ + {18, 3, 3, 4, 0, -4}, /* 0x2B plus */ + {20, 2, 2, 3, 0, -2}, /* 0x2C comma */ + {21, 3, 1, 4, 0, -3}, /* 0x2D hyphen */ + {22, 1, 1, 2, 0, -1}, /* 0x2E period */ + {23, 3, 5, 4, 0, -5}, /* 0x2F slash */ + {25, 3, 5, 4, 0, -5}, /* 0x30 zero */ + {27, 2, 5, 3, 0, -5}, /* 0x31 one */ + {29, 3, 5, 4, 0, -5}, /* 0x32 two */ + {31, 3, 5, 4, 0, -5}, /* 0x33 three */ + {33, 3, 5, 4, 0, -5}, /* 0x34 four */ + {35, 3, 5, 4, 0, -5}, /* 0x35 five */ + {37, 3, 5, 4, 0, -5}, /* 0x36 six */ + {39, 3, 5, 4, 0, -5}, /* 0x37 seven */ + {41, 3, 5, 4, 0, -5}, /* 0x38 eight */ + {43, 3, 5, 4, 0, -5}, /* 0x39 nine */ + {45, 1, 3, 2, 0, -4}, /* 0x3A colon */ + {46, 2, 4, 3, 0, -4}, /* 0x3B semicolon */ + {47, 3, 5, 4, 0, -5}, /* 0x3C less */ + {49, 3, 3, 4, 0, -4}, /* 0x3D equal */ + {51, 3, 5, 4, 0, -5}, /* 0x3E greater */ + {53, 3, 5, 4, 0, -5}, /* 0x3F question */ + {55, 3, 5, 4, 0, -5}, /* 0x40 at */ + {57, 3, 5, 4, 0, -5}, /* 0x41 A */ + {59, 3, 5, 4, 0, -5}, /* 0x42 B */ + {61, 3, 5, 4, 0, -5}, /* 0x43 C */ + {63, 3, 5, 4, 0, -5}, /* 0x44 D */ + {65, 3, 5, 4, 0, -5}, /* 0x45 E */ + {67, 3, 5, 4, 0, -5}, /* 0x46 F */ + {69, 3, 5, 4, 0, -5}, /* 0x47 G */ + {71, 3, 5, 4, 0, -5}, /* 0x48 H */ + {73, 3, 5, 4, 0, -5}, /* 0x49 I */ + {75, 3, 5, 4, 0, -5}, /* 0x4A J */ + {77, 3, 5, 4, 0, -5}, /* 0x4B K */ + {79, 3, 5, 4, 0, -5}, /* 0x4C L */ + {81, 3, 5, 4, 0, -5}, /* 0x4D M */ + {83, 3, 5, 4, 0, -5}, /* 0x4E N */ + {85, 3, 5, 4, 0, -5}, /* 0x4F O */ + {87, 3, 5, 4, 0, -5}, /* 0x50 P */ + {89, 3, 5, 4, 0, -5}, /* 0x51 Q */ + {91, 3, 5, 4, 0, -5}, /* 0x52 R */ + {93, 3, 5, 4, 0, -5}, /* 0x53 S */ + {95, 3, 5, 4, 0, -5}, /* 0x54 T */ + {97, 3, 5, 4, 0, -5}, /* 0x55 U */ + {99, 3, 5, 4, 0, -5}, /* 0x56 V */ + {101, 3, 5, 4, 0, -5}, /* 0x57 W */ + {103, 3, 5, 4, 0, -5}, /* 0x58 X */ + {105, 3, 5, 4, 0, -5}, /* 0x59 Y */ + {107, 3, 5, 4, 0, -5}, /* 0x5A Z */ + {109, 3, 5, 4, 0, -5}, /* 0x5B bracketleft */ + {111, 3, 3, 4, 0, -4}, /* 0x5C backslash */ + {113, 3, 5, 4, 0, -5}, /* 0x5D bracketright */ + {115, 3, 2, 4, 0, -5}, /* 0x5E asciicircum */ + {116, 3, 1, 4, 0, -1}, /* 0x5F underscore */ + {117, 2, 2, 3, 0, -5}, /* 0x60 grave */ + {118, 3, 4, 4, 0, -4}, /* 0x61 a */ + {120, 3, 5, 4, 0, -5}, /* 0x62 b */ + {122, 3, 4, 4, 0, -4}, /* 0x63 c */ + {124, 3, 5, 4, 0, -5}, /* 0x64 d */ + {126, 3, 4, 4, 0, -4}, /* 0x65 e */ + {128, 3, 5, 4, 0, -5}, /* 0x66 f */ + {130, 3, 5, 4, 0, -4}, /* 0x67 g */ + {132, 3, 5, 4, 0, -5}, /* 0x68 h */ + {134, 1, 5, 2, 0, -5}, /* 0x69 i */ + {135, 3, 6, 4, 0, -5}, /* 0x6A j */ + {138, 3, 5, 4, 0, -5}, /* 0x6B k */ + {140, 3, 5, 4, 0, -5}, /* 0x6C l */ + {142, 3, 4, 4, 0, -4}, /* 0x6D m */ + {144, 3, 4, 4, 0, -4}, /* 0x6E n */ + {146, 3, 4, 4, 0, -4}, /* 0x6F o */ + {148, 3, 5, 4, 0, -4}, /* 0x70 p */ + {150, 3, 5, 4, 0, -4}, /* 0x71 q */ + {152, 3, 4, 4, 0, -4}, /* 0x72 r */ + {154, 3, 4, 4, 0, -4}, /* 0x73 s */ + {156, 3, 5, 4, 0, -5}, /* 0x74 t */ + {158, 3, 4, 4, 0, -4}, /* 0x75 u */ + {160, 3, 4, 4, 0, -4}, /* 0x76 v */ + {162, 3, 4, 4, 0, -4}, /* 0x77 w */ + {164, 3, 4, 4, 0, -4}, /* 0x78 x */ + {166, 3, 5, 4, 0, -4}, /* 0x79 y */ + {168, 3, 4, 4, 0, -4}, /* 0x7A z */ + {170, 3, 5, 4, 0, -5}, /* 0x7B braceleft */ + {172, 1, 5, 2, 0, -5}, /* 0x7C bar */ + {173, 3, 5, 4, 0, -5}, /* 0x7D braceright */ + {175, 3, 2, 4, 0, -5}, /* 0x7E asciitilde */ +#if (TOMTHUMB_USE_EXTENDED) + {176, 1, 5, 2, 0, -5}, /* 0xA1 exclamdown */ + {177, 3, 5, 4, 0, -5}, /* 0xA2 cent */ + {179, 3, 5, 4, 0, -5}, /* 0xA3 sterling */ + {181, 3, 5, 4, 0, -5}, /* 0xA4 currency */ + {183, 3, 5, 4, 0, -5}, /* 0xA5 yen */ + {185, 1, 5, 2, 0, -5}, /* 0xA6 brokenbar */ + {186, 3, 5, 4, 0, -5}, /* 0xA7 section */ + {188, 3, 1, 4, 0, -5}, /* 0xA8 dieresis */ + {189, 3, 3, 4, 0, -5}, /* 0xA9 copyright */ + {191, 3, 5, 4, 0, -5}, /* 0xAA ordfeminine */ + {193, 2, 3, 3, 0, -5}, /* 0xAB guillemotleft */ + {194, 3, 2, 4, 0, -4}, /* 0xAC logicalnot */ + {195, 2, 1, 3, 0, -3}, /* 0xAD softhyphen */ + {196, 3, 3, 4, 0, -5}, /* 0xAE registered */ + {198, 3, 1, 4, 0, -5}, /* 0xAF macron */ + {199, 3, 3, 4, 0, -5}, /* 0xB0 degree */ + {201, 3, 5, 4, 0, -5}, /* 0xB1 plusminus */ + {203, 3, 3, 4, 0, -5}, /* 0xB2 twosuperior */ + {205, 3, 3, 4, 0, -5}, /* 0xB3 threesuperior */ + {207, 2, 2, 3, 0, -5}, /* 0xB4 acute */ + {208, 3, 5, 4, 0, -5}, /* 0xB5 mu */ + {210, 3, 5, 4, 0, -5}, /* 0xB6 paragraph */ + {212, 3, 3, 4, 0, -4}, /* 0xB7 periodcentered */ + {214, 3, 3, 4, 0, -3}, /* 0xB8 cedilla */ + {216, 1, 3, 2, 0, -5}, /* 0xB9 onesuperior */ + {217, 3, 5, 4, 0, -5}, /* 0xBA ordmasculine */ + {219, 2, 3, 3, 0, -5}, /* 0xBB guillemotright */ + {220, 3, 5, 4, 0, -5}, /* 0xBC onequarter */ + {222, 3, 5, 4, 0, -5}, /* 0xBD onehalf */ + {224, 3, 5, 4, 0, -5}, /* 0xBE threequarters */ + {226, 3, 5, 4, 0, -5}, /* 0xBF questiondown */ + {228, 3, 5, 4, 0, -5}, /* 0xC0 Agrave */ + {230, 3, 5, 4, 0, -5}, /* 0xC1 Aacute */ + {232, 3, 5, 4, 0, -5}, /* 0xC2 Acircumflex */ + {234, 3, 5, 4, 0, -5}, /* 0xC3 Atilde */ + {236, 3, 5, 4, 0, -5}, /* 0xC4 Adieresis */ + {238, 3, 5, 4, 0, -5}, /* 0xC5 Aring */ + {240, 3, 5, 4, 0, -5}, /* 0xC6 AE */ + {242, 3, 6, 4, 0, -5}, /* 0xC7 Ccedilla */ + {245, 3, 5, 4, 0, -5}, /* 0xC8 Egrave */ + {247, 3, 5, 4, 0, -5}, /* 0xC9 Eacute */ + {249, 3, 5, 4, 0, -5}, /* 0xCA Ecircumflex */ + {251, 3, 5, 4, 0, -5}, /* 0xCB Edieresis */ + {253, 3, 5, 4, 0, -5}, /* 0xCC Igrave */ + {255, 3, 5, 4, 0, -5}, /* 0xCD Iacute */ + {257, 3, 5, 4, 0, -5}, /* 0xCE Icircumflex */ + {259, 3, 5, 4, 0, -5}, /* 0xCF Idieresis */ + {261, 3, 5, 4, 0, -5}, /* 0xD0 Eth */ + {263, 3, 5, 4, 0, -5}, /* 0xD1 Ntilde */ + {265, 3, 5, 4, 0, -5}, /* 0xD2 Ograve */ + {267, 3, 5, 4, 0, -5}, /* 0xD3 Oacute */ + {269, 3, 5, 4, 0, -5}, /* 0xD4 Ocircumflex */ + {271, 3, 5, 4, 0, -5}, /* 0xD5 Otilde */ + {273, 3, 5, 4, 0, -5}, /* 0xD6 Odieresis */ + {275, 3, 3, 4, 0, -4}, /* 0xD7 multiply */ + {277, 3, 5, 4, 0, -5}, /* 0xD8 Oslash */ + {279, 3, 5, 4, 0, -5}, /* 0xD9 Ugrave */ + {281, 3, 5, 4, 0, -5}, /* 0xDA Uacute */ + {283, 3, 5, 4, 0, -5}, /* 0xDB Ucircumflex */ + {285, 3, 5, 4, 0, -5}, /* 0xDC Udieresis */ + {287, 3, 5, 4, 0, -5}, /* 0xDD Yacute */ + {289, 3, 5, 4, 0, -5}, /* 0xDE Thorn */ + {291, 3, 6, 4, 0, -5}, /* 0xDF germandbls */ + {294, 3, 5, 4, 0, -5}, /* 0xE0 agrave */ + {296, 3, 5, 4, 0, -5}, /* 0xE1 aacute */ + {298, 3, 5, 4, 0, -5}, /* 0xE2 acircumflex */ + {300, 3, 5, 4, 0, -5}, /* 0xE3 atilde */ + {302, 3, 5, 4, 0, -5}, /* 0xE4 adieresis */ + {304, 3, 5, 4, 0, -5}, /* 0xE5 aring */ + {306, 3, 4, 4, 0, -4}, /* 0xE6 ae */ + {308, 3, 5, 4, 0, -4}, /* 0xE7 ccedilla */ + {310, 3, 5, 4, 0, -5}, /* 0xE8 egrave */ + {312, 3, 5, 4, 0, -5}, /* 0xE9 eacute */ + {314, 3, 5, 4, 0, -5}, /* 0xEA ecircumflex */ + {316, 3, 5, 4, 0, -5}, /* 0xEB edieresis */ + {318, 2, 5, 3, 0, -5}, /* 0xEC igrave */ + {320, 2, 5, 3, 0, -5}, /* 0xED iacute */ + {322, 3, 5, 4, 0, -5}, /* 0xEE icircumflex */ + {324, 3, 5, 4, 0, -5}, /* 0xEF idieresis */ + {326, 3, 5, 4, 0, -5}, /* 0xF0 eth */ + {328, 3, 5, 4, 0, -5}, /* 0xF1 ntilde */ + {330, 3, 5, 4, 0, -5}, /* 0xF2 ograve */ + {332, 3, 5, 4, 0, -5}, /* 0xF3 oacute */ + {334, 3, 5, 4, 0, -5}, /* 0xF4 ocircumflex */ + {336, 3, 5, 4, 0, -5}, /* 0xF5 otilde */ + {338, 3, 5, 4, 0, -5}, /* 0xF6 odieresis */ + {340, 3, 5, 4, 0, -5}, /* 0xF7 divide */ + {342, 3, 4, 4, 0, -4}, /* 0xF8 oslash */ + {344, 3, 5, 4, 0, -5}, /* 0xF9 ugrave */ + {346, 3, 5, 4, 0, -5}, /* 0xFA uacute */ + {348, 3, 5, 4, 0, -5}, /* 0xFB ucircumflex */ + {350, 3, 5, 4, 0, -5}, /* 0xFC udieresis */ + {352, 3, 6, 4, 0, -5}, /* 0xFD yacute */ + {355, 3, 5, 4, 0, -4}, /* 0xFE thorn */ + {357, 3, 6, 4, 0, -5}, /* 0xFF ydieresis */ + {360, 1, 1, 2, 0, -1}, /* 0x11D gcircumflex */ + {361, 3, 5, 4, 0, -5}, /* 0x152 OE */ + {363, 3, 4, 4, 0, -4}, /* 0x153 oe */ + {365, 3, 5, 4, 0, -5}, /* 0x160 Scaron */ + {367, 3, 5, 4, 0, -5}, /* 0x161 scaron */ + {369, 3, 5, 4, 0, -5}, /* 0x178 Ydieresis */ + {371, 3, 5, 4, 0, -5}, /* 0x17D Zcaron */ + {373, 3, 5, 4, 0, -5}, /* 0x17E zcaron */ + {375, 1, 1, 2, 0, -1}, /* 0xEA4 uni0EA4 */ + {376, 1, 1, 2, 0, -1}, /* 0x13A0 uni13A0 */ + {377, 1, 1, 2, 0, -3}, /* 0x2022 bullet */ + {378, 3, 1, 4, 0, -1}, /* 0x2026 ellipsis */ + {379, 3, 5, 4, 0, -5}, /* 0x20AC Euro */ + {381, 4, 5, 5, 0, -5}, /* 0xFFFD uniFFFD */ +#endif /* (TOMTHUMB_USE_EXTENDED) */ +}; + +const GFXfont TomThumb PROGMEM = {(uint8_t *)TomThumbBitmaps, + (GFXglyph *)TomThumbGlyphs, 0x20, 0x7E, 6}; diff --git a/src/library/Adafruit-GFX-Library/README.md b/src/library/Adafruit-GFX-Library/README.md new file mode 100644 index 0000000..6f36460 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/README.md @@ -0,0 +1,47 @@ +# Adafruit GFX Library ![Build Status](https://github.com/adafruit/Adafruit-GFX-Library/workflows/Arduino%20Library%20CI/badge.svg) + +This is the core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.). It needs to be paired with a hardware-specific library for each display device we carry (to handle the lower-level functions). + +Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information. +All text above must be included in any redistribution. + +Recent Arduino IDE releases include the Library Manager for easy installation. Otherwise, to download, click the DOWNLOAD ZIP button, uncompress and rename the uncompressed folder Adafruit_GFX. Confirm that the Adafruit_GFX folder contains Adafruit_GFX.cpp and Adafruit_GFX.h. Place the Adafruit_GFX library folder your ArduinoSketchFolder/Libraries/ folder. You may need to create the Libraries subfolder if its your first library. Restart the IDE. + +**You will also need to install the latest Adafruit BusIO library.** Search for "Adafruit BusIO" in the library manager, or install by hand from https://github.com/adafruit/Adafruit_BusIO + +# Useful Resources + +- Image2Code: This is a handy Java GUI utility to convert a BMP file into the array code necessary to display the image with the drawBitmap function. Check out the code at ehubin's GitHub repository: https://github.com/ehubin/Adafruit-GFX-Library/tree/master/Img2Code + +- drawXBitmap function: You can use the GIMP photo editor to save a .xbm file and use the array saved in the file to draw a bitmap with the drawXBitmap function. See the pull request here for more details: https://github.com/adafruit/Adafruit-GFX-Library/pull/31 + +- 'Fonts' folder contains bitmap fonts for use with recent (1.1 and later) Adafruit_GFX. To use a font in your Arduino sketch, \#include the corresponding .h file and pass address of GFXfont struct to setFont(). Pass NULL to revert to 'classic' fixed-space bitmap font. + +- 'fontconvert' folder contains a command-line tool for converting TTF fonts to Adafruit_GFX header format. + +- You can also use [this GFX Font Customiser tool](https://github.com/tchapi/Adafruit-GFX-Font-Customiser) (_web version [here](https://tchapi.github.io/Adafruit-GFX-Font-Customiser/)_) to customize or correct the output from [fontconvert](https://github.com/adafruit/Adafruit-GFX-Library/tree/master/fontconvert), and create fonts with only a subset of characters to optimize size. + +--- + +### Roadmap + +The PRIME DIRECTIVE is to maintain backward compatibility with existing Arduino sketches -- many are hosted elsewhere and don't track changes here, some are in print and can never be changed! This "little" library has grown organically over time and sometimes we paint ourselves into a design corner and just have to live with it or add progressively more ungainly workarounds. + +**We are grateful for everyone's contributions, but pull requests for the following will NOT be merged:** + +- Additional or incompatible font formats (see Prime Directive above). There are already two formats and the code is quite bloaty there as it is. This also creates liabilities for tools and documentation. What's there isn't perfect but it does the job. + +- Additional or incompatible bitmap formats, for similar reasons. It's getting messy. + +- Adding background color to custom fonts to erase prior screen contents. The ONLY acceptable methods are to clear the area with a filled rect, or (to avoid flicker) draw text into a GFXcanvas1 and copy to screen with drawBitmap() w/background color. This is on purpose and by design. We've discussed this. Glyphs can overlap. + +- Scrolling, whether hardware- or software-based. Such implementations tend to rely on hardware-specific features (not universally available), read access to the screen's framebuffer (ditto) and/or the addition of virtual functions in GFX which them must be added in *every* subclass, of which there are many. The GFX API is largely "set" at this point and this is just a limitation we live with now. + +- Please don't reformat code for the sake of reformatting code. The resulting large "visual diff" makes it impossible to untangle actual bug fixes from merely rearranged lines. clang-format will be the final arbiter. + +- Please no more pentagram-drawing PRs. Any oddly-specific drawing functions can go in your own code and aren't helpful in a library context. + +If you *must* have one of these features, consider creating a fork with the features required for your project...it's easy to keep synced with the upstream code. diff --git a/src/library/Adafruit-GFX-Library/component.mk b/src/library/Adafruit-GFX-Library/component.mk new file mode 100644 index 0000000..004b18e --- /dev/null +++ b/src/library/Adafruit-GFX-Library/component.mk @@ -0,0 +1 @@ +COMPONENT_ADD_INCLUDEDIRS = . diff --git a/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino b/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino new file mode 100644 index 0000000..d4e3370 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino @@ -0,0 +1,113 @@ +/*** +This example is intended to demonstrate the use of getPixel() versus +getRawPixel() and the fast horizontal and vertical drawing routines +in the GFXcanvas family of classes, + +When using the GFXcanvas* classes as the image buffer for a hardware driver, +there is a need to get individual pixel color values at given physical +coordinates. Rather than subclasses or client classes call getBuffer() and +reinterpret the byte layout of the buffer, two methods are added to each of the +GFXcanvas* classes that allow fetching of specific pixel values. + + * getPixel(x, y) : Gets the pixel color value at the rotated coordinates in +the image. + * getRawPixel(x,y) : Gets the pixel color value at the unrotated coordinates +in the image. This is useful for getting the pixel value to map to a hardware +pixel location. This method was made protected as only the hardware driver +should be accessing it. + +The GFXcanvas*SerialDemo classes in this example will print to Serial the +contents of the underlying GFXcanvas buffer in both the current rotated layout +and the underlying physical layout. +***/ + +#include "GFXcanvasSerialDemo.h" +#include + +void setup() { + Serial.begin(115200); + + // first create a rectangular GFXcanvas8SerialDemo object and draw to it + GFXcanvas8SerialDemo demo8(21, 11); + + demo8.fillScreen(0x00); + demo8.setRotation(1); // now canvas is 11x21 + demo8.fillCircle(5, 10, 5, 0xAA); + demo8.writeFastHLine(0, 0, 11, 0x11); + demo8.writeFastHLine(10, 10, -11, 0x22); + demo8.writeFastHLine(0, 20, 11, 0x33); + demo8.writeFastVLine(0, 0, 21, 0x44); + demo8.writeFastVLine(10, 20, -21, 0x55); + + Serial.println("Demonstrating GFXcanvas rotated and raw pixels.\n"); + + // print it out rotated + + Serial.println("The canvas's content in the rotation of '0':\n"); + demo8.setRotation(0); + demo8.print(true); + Serial.println("\n"); + + Serial.println("The canvas's content in the rotation of '1' (which is what " + "it was drawn in):\n"); + demo8.setRotation(1); + demo8.print(true); + Serial.println("\n"); + + Serial.println("The canvas's content in the rotation of '2':\n"); + demo8.setRotation(2); + demo8.print(true); + Serial.println("\n"); + + Serial.println("The canvas's content in the rotation of '3':\n"); + demo8.setRotation(3); + demo8.print(true); + Serial.println("\n"); + + // print it out unrotated + Serial.println("The canvas's content in it's raw, physical layout:\n"); + demo8.print(false); + Serial.println("\n"); + + // Demonstrate GFXcanvas1SerialDemo + + GFXcanvas1SerialDemo demo1(21, 11); + demo1.fillScreen(0); + demo1.setRotation(0); + demo1.writeFastHLine(0, 0, 9, 1); + demo1.setRotation(1); + demo1.writeFastHLine(0, 0, 9, 1); + demo1.setRotation(2); + demo1.writeFastHLine(0, 0, 9, 1); + demo1.setRotation(3); + demo1.writeFastHLine(0, 0, 9, 1); + demo1.setRotation(1); + demo1.fillRect(3, 8, 5, 5, 1); + + Serial.println("\nThe GFXcanvas1 raw content after drawing a fast horizontal " + "line in each rotation:\n"); + demo1.print(false); + Serial.println("\n"); + + // Demonstrate GFXcanvas16SerialDemo + + GFXcanvas16SerialDemo demo16(21, 11); + demo16.fillScreen(0); + demo16.setRotation(0); + demo16.writeFastHLine(0, 0, 9, 0x1111); + demo16.setRotation(1); + demo16.writeFastHLine(0, 0, 9, 0x2222); + demo16.setRotation(2); + demo16.writeFastHLine(0, 0, 9, 0x3333); + demo16.setRotation(3); + demo16.writeFastHLine(0, 0, 9, 0x4444); + demo16.setRotation(1); + demo16.fillRect(3, 8, 5, 5, 0x8888); + + Serial.println("\nThe GFXcanvas16 raw content after drawing a fast " + "horizontal line in each rotation:\n"); + demo16.print(false); + Serial.println("\n"); +} + +void loop() {} diff --git a/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp b/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp new file mode 100644 index 0000000..ed83a96 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp @@ -0,0 +1,92 @@ +#include "GFXcanvasSerialDemo.h" +#include + +GFXcanvas1SerialDemo::GFXcanvas1SerialDemo(uint16_t w, uint16_t h) + : GFXcanvas1(w, h) {} + +void GFXcanvas1SerialDemo::print(bool rotated) { + char pixel_buffer[8]; + uint16_t width, height; + + if (rotated) { + width = this->width(); + height = this->height(); + } else { + width = this->WIDTH; + height = this->HEIGHT; + } + + for (uint16_t y = 0; y < height; y++) { + for (uint16_t x = 0; x < width; x++) { + bool pixel; + if (rotated) { + pixel = this->getPixel(x, y); + } else { + pixel = this->getRawPixel(x, y); + } + sprintf(pixel_buffer, " %d", pixel); + Serial.print(pixel_buffer); + } + Serial.print("\n"); + } +} + +GFXcanvas8SerialDemo::GFXcanvas8SerialDemo(uint16_t w, uint16_t h) + : GFXcanvas8(w, h) {} + +void GFXcanvas8SerialDemo::print(bool rotated) { + char pixel_buffer[8]; + uint16_t width, height; + + if (rotated) { + width = this->width(); + height = this->height(); + } else { + width = this->WIDTH; + height = this->HEIGHT; + } + + for (uint16_t y = 0; y < height; y++) { + for (uint16_t x = 0; x < width; x++) { + uint8_t pixel; + if (rotated) { + pixel = this->getPixel(x, y); + } else { + pixel = this->getRawPixel(x, y); + } + sprintf(pixel_buffer, " %02x", pixel); + Serial.print(pixel_buffer); + } + Serial.print("\n"); + } +} + +GFXcanvas16SerialDemo::GFXcanvas16SerialDemo(uint16_t w, uint16_t h) + : GFXcanvas16(w, h) {} + +void GFXcanvas16SerialDemo::print(bool rotated) { + char pixel_buffer[8]; + uint16_t width, height; + + if (rotated) { + width = this->width(); + height = this->height(); + } else { + width = this->WIDTH; + height = this->HEIGHT; + } + + for (uint16_t y = 0; y < height; y++) { + for (uint16_t x = 0; x < width; x++) { + uint16_t pixel; + if (rotated) { + pixel = this->getPixel(x, y); + } else { + pixel = this->getRawPixel(x, y); + } + sprintf(pixel_buffer, " %04x", pixel); + Serial.print(pixel_buffer); + } + Serial.print("\n"); + } +} diff --git a/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h b/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h new file mode 100644 index 0000000..a1ab457 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h @@ -0,0 +1,65 @@ +#ifndef __GFXcanvasSerialDemo__ +#define __GFXcanvasSerialDemo__ +#include "../../Adafruit_GFX.h" + +/**********************************************************************/ +/*! + @brief Demonstrates using the GFXconvas classes as the backing store + for a device driver. +*/ +/**********************************************************************/ +class GFXcanvas1SerialDemo : public GFXcanvas1 { +public: + GFXcanvas1SerialDemo(uint16_t w, uint16_t h); + + /**********************************************************************/ + /*! + @brief Prints the current contents of the canvas to Serial + @param rotated true to print according to the current GFX rotation, + false to print to the native rotation of the canvas (or unrotated). + */ + /**********************************************************************/ + void print(bool rotated); +}; + +/**********************************************************************/ +/*! + @brief Demonstrates using the GFXconvas classes as the backing store + for a device driver. +*/ +/**********************************************************************/ +class GFXcanvas8SerialDemo : public GFXcanvas8 { +public: + GFXcanvas8SerialDemo(uint16_t w, uint16_t h); + + /**********************************************************************/ + /*! + @brief Prints the current contents of the canvas to Serial + @param rotated true to print according to the current GFX rotation, + false to print to the native rotation of the canvas (or unrotated). + */ + /**********************************************************************/ + void print(bool rotated); +}; + +/**********************************************************************/ +/*! + @brief Demonstrates using the GFXconvas classes as the backing store + for a device driver. +*/ +/**********************************************************************/ +class GFXcanvas16SerialDemo : public GFXcanvas16 { +public: + GFXcanvas16SerialDemo(uint16_t w, uint16_t h); + + /**********************************************************************/ + /*! + @brief Prints the current contents of the canvas to Serial + @param rotated true to print according to the current GFX rotation, + false to print to the native rotation of the canvas (or unrotated). + */ + /**********************************************************************/ + void print(bool rotated); +}; + +#endif // __GFXcanvasSerialDemo__ diff --git a/src/library/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino b/src/library/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino new file mode 100644 index 0000000..d141839 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino @@ -0,0 +1,365 @@ +/*************************************************** + This is our GFX example for the Adafruit ILI9341 Breakout and Shield + ----> http://www.adafruit.com/products/1651 + + Check out the links above for our tutorials and wiring diagrams + These displays use SPI to communicate, 4 or 5 pins are required to + interface (RST is optional) + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ + + +#include "SPI.h" +#include "Adafruit_GFX.h" +#include "Adafruit_ILI9341.h" + +// For the Adafruit shield, these are the default. +#define TFT_DC 9 +#define TFT_CS 10 + +// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC +Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); +// If using the breakout, change pins as desired +//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); + +void setup() { + Serial.begin(9600); + Serial.println("ILI9341 Test!"); + + tft.begin(); + + // read diagnostics (optional but can help debug problems) + uint8_t x = tft.readcommand8(ILI9341_RDMODE); + Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); + x = tft.readcommand8(ILI9341_RDMADCTL); + Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); + x = tft.readcommand8(ILI9341_RDPIXFMT); + Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); + x = tft.readcommand8(ILI9341_RDIMGFMT); + Serial.print("Image Format: 0x"); Serial.println(x, HEX); + x = tft.readcommand8(ILI9341_RDSELFDIAG); + Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); + + Serial.println(F("Benchmark Time (microseconds)")); + delay(10); + Serial.print(F("Screen fill ")); + Serial.println(testFillScreen()); + delay(500); + + Serial.print(F("Text ")); + Serial.println(testText()); + delay(3000); + + Serial.print(F("Lines ")); + Serial.println(testLines(ILI9341_CYAN)); + delay(500); + + Serial.print(F("Horiz/Vert Lines ")); + Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); + delay(500); + + Serial.print(F("Rectangles (outline) ")); + Serial.println(testRects(ILI9341_GREEN)); + delay(500); + + Serial.print(F("Rectangles (filled) ")); + Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); + delay(500); + + Serial.print(F("Circles (filled) ")); + Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); + + Serial.print(F("Circles (outline) ")); + Serial.println(testCircles(10, ILI9341_WHITE)); + delay(500); + + Serial.print(F("Triangles (outline) ")); + Serial.println(testTriangles()); + delay(500); + + Serial.print(F("Triangles (filled) ")); + Serial.println(testFilledTriangles()); + delay(500); + + Serial.print(F("Rounded rects (outline) ")); + Serial.println(testRoundRects()); + delay(500); + + Serial.print(F("Rounded rects (filled) ")); + Serial.println(testFilledRoundRects()); + delay(500); + + Serial.println(F("Done!")); + +} + + +void loop(void) { + for(uint8_t rotation=0; rotation<4; rotation++) { + tft.setRotation(rotation); + testText(); + delay(1000); + } +} + +unsigned long testFillScreen() { + unsigned long start = micros(); + tft.fillScreen(ILI9341_BLACK); + yield(); + tft.fillScreen(ILI9341_RED); + yield(); + tft.fillScreen(ILI9341_GREEN); + yield(); + tft.fillScreen(ILI9341_BLUE); + yield(); + tft.fillScreen(ILI9341_BLACK); + yield(); + return micros() - start; +} + +unsigned long testText() { + tft.fillScreen(ILI9341_BLACK); + unsigned long start = micros(); + tft.setCursor(0, 0); + tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); + tft.println("Hello World!"); + tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); + tft.println(1234.56); + tft.setTextColor(ILI9341_RED); tft.setTextSize(3); + tft.println(0xDEADBEEF, HEX); + tft.println(); + tft.setTextColor(ILI9341_GREEN); + tft.setTextSize(5); + tft.println("Groop"); + tft.setTextSize(2); + tft.println("I implore thee,"); + tft.setTextSize(1); + tft.println("my foonting turlingdromes."); + tft.println("And hooptiously drangle me"); + tft.println("with crinkly bindlewurdles,"); + tft.println("Or I will rend thee"); + tft.println("in the gobberwarts"); + tft.println("with my blurglecruncheon,"); + tft.println("see if I don't!"); + return micros() - start; +} + +unsigned long testLines(uint16_t color) { + unsigned long start, t; + int x1, y1, x2, y2, + w = tft.width(), + h = tft.height(); + + tft.fillScreen(ILI9341_BLACK); + yield(); + + x1 = y1 = 0; + y2 = h - 1; + start = micros(); + for(x2=0; x20; i-=6) { + i2 = i / 2; + start = micros(); + tft.fillRect(cx-i2, cy-i2, i, i, color1); + t += micros() - start; + // Outlines are not included in timing results + tft.drawRect(cx-i2, cy-i2, i, i, color2); + yield(); + } + + return t; +} + +unsigned long testFilledCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; + + tft.fillScreen(ILI9341_BLACK); + start = micros(); + for(x=radius; x10; i-=5) { + start = micros(); + tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(0, i*10, i*10)); + t += micros() - start; + tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(i*10, i*10, 0)); + yield(); + } + + return t; +} + +unsigned long testRoundRects() { + unsigned long start; + int w, i, i2, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(ILI9341_BLACK); + w = min(tft.width(), tft.height()); + start = micros(); + for(i=0; i20; i-=6) { + i2 = i / 2; + tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); + yield(); + } + + return micros() - start; +} diff --git a/src/library/Adafruit-GFX-Library/fontconvert/Makefile b/src/library/Adafruit-GFX-Library/fontconvert/Makefile new file mode 100644 index 0000000..47f5a0e --- /dev/null +++ b/src/library/Adafruit-GFX-Library/fontconvert/Makefile @@ -0,0 +1,12 @@ +all: fontconvert + +CC = gcc +CFLAGS = -Wall -I/usr/local/include/freetype2 -I/usr/include/freetype2 -I/usr/include +LIBS = -lfreetype + +fontconvert: fontconvert.c + $(CC) $(CFLAGS) $< $(LIBS) -o $@ + strip $@ + +clean: + rm -f fontconvert diff --git a/src/library/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py b/src/library/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py new file mode 100644 index 0000000..9d9ee8a --- /dev/null +++ b/src/library/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py @@ -0,0 +1,135 @@ +#!/usr/bin/python2 + +# MIT License. + +# Copyright (c) 2016 William Skellenger +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +# This small script is designed to mostly take a BDF file and convert it to a +# format that can largely be cut/pasted as an Adafruit-format font. +# It was written in an hour or so and did what I needed it to do. +# I used it for one file. Maybe it bombs on other files. +# William Skellenger, Feb 2016 +# (email: williamj@skellenger.net) +# (Twitter: @skelliam) +# +# Usage: bdf2adafruit.py > out.txt +# +# Once you have out.txt you can cut/paste the contents into a new font +# header file as part of the Adafruit GFX library. + +import sys + +myfile = open(sys.argv[1]) + +processing = 0 +getting_rows = 0 + +chars = [] +bitmapData = [] + +class Glyph: + encoding = -1 + rows = [] + comment = "" + offset = -1 + width = 0 + height = 0 + advance = 0 + xoffs = 0 + yoffs = 0 + def __init__(self, comment): + self.comment = comment + self.rows = [] + +for line in myfile.readlines(): + if 'STARTCHAR' in line: + processing = 1 + vals = line.split() + g = Glyph(vals[1]) + #g.width = 8 #in this example always 8 bits wide + elif 'ENDCHAR' in line: + dataByteCompressed = 0 + dataByteCompressedIndex = 8 + g.height = len(bitmapData) + for value in bitmapData: + bitIndex = 0 + while bitIndex < g.width: + bit = (value >> (7 - bitIndex)) & 0x01 + dataByteCompressed |= bit << (dataByteCompressedIndex - 1) + dataByteCompressedIndex -= 1 + if dataByteCompressedIndex == 0: + dataByteCompressedIndex = 8 + g.rows.append(dataByteCompressed) + dataByteCompressed = 0 + bitIndex += 1 + if 8 != dataByteCompressedIndex: + g.rows.append(dataByteCompressed) + + chars.append(g) #append the completed glyph into list + processing = 0 + getting_rows = 0 + bitmapData.clear() + + if processing: + if 'ENCODING' in line: + vals = line.split() + g.encoding = int(vals[1]) + elif 'DWIDTH' in line: + vals = line.split() + #g.advance = int(vals[1]) #cursor advance seems to be the first number in DWIDTH + elif 'BBX' in line: + vals = line.split() + g.xoffs = 0 + g.yoffs = -(int(vals[2]) + int(vals[4])) + g.advance = (int(vals[1]) + 1) #x bounding box + 1 + g.width = int(vals[1]) + elif 'BITMAP' in line: + getting_rows = 1 + elif getting_rows: + #g.rows.append(int(line, 16)) #append pixel rows into glyph's list of rows + bitmapData.append(int(line, 16)) + +print + +i=0 +for char in chars: + char.offset = i + print("\t", end='') + num = 3 + for row in char.rows: + if num != 3: + print(" ", end = '') + print("0x%02X," %(row), end = ''), + i+=1 + num-=1 + + if num == 1: + print("\t\t", end = '') + if num == 2: + print("\t\t\t", end = '') + print("\t/* 0x%02X %s */" %(char.encoding, char.comment)) + +for char in chars: + # offset, bit-width, bit-height, advance cursor, x offset, y offset + print("\t{ %d, %d, %d, %d, %d, %d }, /* 0x%02X %s */" %( + char.offset, char.width, char.height, + char.advance, char.xoffs, char.yoffs, + char.encoding, char.comment)) diff --git a/src/library/Adafruit-GFX-Library/fontconvert/fontconvert.c b/src/library/Adafruit-GFX-Library/fontconvert/fontconvert.c new file mode 100644 index 0000000..302d1da --- /dev/null +++ b/src/library/Adafruit-GFX-Library/fontconvert/fontconvert.c @@ -0,0 +1,291 @@ +/* +TrueType to Adafruit_GFX font converter. Derived from Peter Jakobs' +Adafruit_ftGFX fork & makefont tool, and Paul Kourany's Adafruit_mfGFX. + +NOT AN ARDUINO SKETCH. This is a command-line tool for preprocessing +fonts to be used with the Adafruit_GFX Arduino library. + +For UNIX-like systems. Outputs to stdout; redirect to header file, e.g.: + ./fontconvert ~/Library/Fonts/FreeSans.ttf 18 > FreeSans18pt7b.h + +REQUIRES FREETYPE LIBRARY. www.freetype.org + +Currently this only extracts the printable 7-bit ASCII chars of a font. +Will eventually extend with some int'l chars a la ftGFX, not there yet. +Keep 7-bit fonts around as an option in that case, more compact. + +See notes at end for glyph nomenclature & other tidbits. +*/ +#ifndef ARDUINO + +#include +#include +#include +#include +#include FT_GLYPH_H +#include FT_MODULE_H +#include FT_TRUETYPE_DRIVER_H +#include "../gfxfont.h" // Adafruit_GFX font structures + +#define DPI 141 // Approximate res. of Adafruit 2.8" TFT + +// Accumulate bits for output, with periodic hexadecimal byte write +void enbit(uint8_t value) { + static uint8_t row = 0, sum = 0, bit = 0x80, firstCall = 1; + if (value) + sum |= bit; // Set bit if needed + if (!(bit >>= 1)) { // Advance to next bit, end of byte reached? + if (!firstCall) { // Format output table nicely + if (++row >= 12) { // Last entry on line? + printf(",\n "); // Newline format output + row = 0; // Reset row counter + } else { // Not end of line + printf(", "); // Simple comma delim + } + } + printf("0x%02X", sum); // Write byte value + sum = 0; // Clear for next byte + bit = 0x80; // Reset bit counter + firstCall = 0; // Formatting flag + } +} + +int main(int argc, char *argv[]) { + int i, j, err, size, first = ' ', last = '~', bitmapOffset = 0, x, y, byte; + char *fontName, c, *ptr; + FT_Library library; + FT_Face face; + FT_Glyph glyph; + FT_Bitmap *bitmap; + FT_BitmapGlyphRec *g; + GFXglyph *table; + uint8_t bit; + + // Parse command line. Valid syntaxes are: + // fontconvert [filename] [size] + // fontconvert [filename] [size] [last char] + // fontconvert [filename] [size] [first char] [last char] + // Unless overridden, default first and last chars are + // ' ' (space) and '~', respectively + + if (argc < 3) { + fprintf(stderr, "Usage: %s fontfile size [first] [last]\n", argv[0]); + return 1; + } + + size = atoi(argv[2]); + + if (argc == 4) { + last = atoi(argv[3]); + } else if (argc == 5) { + first = atoi(argv[3]); + last = atoi(argv[4]); + } + + if (last < first) { + i = first; + first = last; + last = i; + } + + ptr = strrchr(argv[1], '/'); // Find last slash in filename + if (ptr) + ptr++; // First character of filename (path stripped) + else + ptr = argv[1]; // No path; font in local dir. + + // Allocate space for font name and glyph table + if ((!(fontName = malloc(strlen(ptr) + 20))) || + (!(table = (GFXglyph *)malloc((last - first + 1) * sizeof(GFXglyph))))) { + fprintf(stderr, "Malloc error\n"); + return 1; + } + + // Derive font table names from filename. Period (filename + // extension) is truncated and replaced with the font size & bits. + strcpy(fontName, ptr); + ptr = strrchr(fontName, '.'); // Find last period (file ext) + if (!ptr) + ptr = &fontName[strlen(fontName)]; // If none, append + // Insert font size and 7/8 bit. fontName was alloc'd w/extra + // space to allow this, we're not sprintfing into Forbidden Zone. + sprintf(ptr, "%dpt%db", size, (last > 127) ? 8 : 7); + // Space and punctuation chars in name replaced w/ underscores. + for (i = 0; (c = fontName[i]); i++) { + if (isspace(c) || ispunct(c)) + fontName[i] = '_'; + } + + // Init FreeType lib, load font + if ((err = FT_Init_FreeType(&library))) { + fprintf(stderr, "FreeType init error: %d", err); + return err; + } + + // Use TrueType engine version 35, without subpixel rendering. + // This improves clarity of fonts since this library does not + // support rendering multiple levels of gray in a glyph. + // See https://github.com/adafruit/Adafruit-GFX-Library/issues/103 + FT_UInt interpreter_version = TT_INTERPRETER_VERSION_35; + FT_Property_Set(library, "truetype", "interpreter-version", + &interpreter_version); + + if ((err = FT_New_Face(library, argv[1], 0, &face))) { + fprintf(stderr, "Font load error: %d", err); + FT_Done_FreeType(library); + return err; + } + + // << 6 because '26dot6' fixed-point format + FT_Set_Char_Size(face, size << 6, 0, DPI, 0); + + // Currently all symbols from 'first' to 'last' are processed. + // Fonts may contain WAY more glyphs than that, but this code + // will need to handle encoding stuff to deal with extracting + // the right symbols, and that's not done yet. + // fprintf(stderr, "%ld glyphs\n", face->num_glyphs); + + printf("const uint8_t %sBitmaps[] PROGMEM = {\n ", fontName); + + // Process glyphs and output huge bitmap data array + for (i = first, j = 0; i <= last; i++, j++) { + // MONO renderer provides clean image with perfect crop + // (no wasted pixels) via bitmap struct. + if ((err = FT_Load_Char(face, i, FT_LOAD_TARGET_MONO))) { + fprintf(stderr, "Error %d loading char '%c'\n", err, i); + continue; + } + + if ((err = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_MONO))) { + fprintf(stderr, "Error %d rendering char '%c'\n", err, i); + continue; + } + + if ((err = FT_Get_Glyph(face->glyph, &glyph))) { + fprintf(stderr, "Error %d getting glyph '%c'\n", err, i); + continue; + } + + bitmap = &face->glyph->bitmap; + g = (FT_BitmapGlyphRec *)glyph; + + // Minimal font and per-glyph information is stored to + // reduce flash space requirements. Glyph bitmaps are + // fully bit-packed; no per-scanline pad, though end of + // each character may be padded to next byte boundary + // when needed. 16-bit offset means 64K max for bitmaps, + // code currently doesn't check for overflow. (Doesn't + // check that size & offsets are within bounds either for + // that matter...please convert fonts responsibly.) + table[j].bitmapOffset = bitmapOffset; + table[j].width = bitmap->width; + table[j].height = bitmap->rows; + table[j].xAdvance = face->glyph->advance.x >> 6; + table[j].xOffset = g->left; + table[j].yOffset = 1 - g->top; + + for (y = 0; y < bitmap->rows; y++) { + for (x = 0; x < bitmap->width; x++) { + byte = x / 8; + bit = 0x80 >> (x & 7); + enbit(bitmap->buffer[y * bitmap->pitch + byte] & bit); + } + } + + // Pad end of char bitmap to next byte boundary if needed + int n = (bitmap->width * bitmap->rows) & 7; + if (n) { // Pixel count not an even multiple of 8? + n = 8 - n; // # bits to next multiple + while (n--) + enbit(0); + } + bitmapOffset += (bitmap->width * bitmap->rows + 7) / 8; + + FT_Done_Glyph(glyph); + } + + printf(" };\n\n"); // End bitmap array + + // Output glyph attributes table (one per character) + printf("const GFXglyph %sGlyphs[] PROGMEM = {\n", fontName); + for (i = first, j = 0; i <= last; i++, j++) { + printf(" { %5d, %3d, %3d, %3d, %4d, %4d }", table[j].bitmapOffset, + table[j].width, table[j].height, table[j].xAdvance, table[j].xOffset, + table[j].yOffset); + if (i < last) { + printf(", // 0x%02X", i); + if ((i >= ' ') && (i <= '~')) { + printf(" '%c'", i); + } + putchar('\n'); + } + } + printf(" }; // 0x%02X", last); + if ((last >= ' ') && (last <= '~')) + printf(" '%c'", last); + printf("\n\n"); + + // Output font structure + printf("const GFXfont %s PROGMEM = {\n", fontName); + printf(" (uint8_t *)%sBitmaps,\n", fontName); + printf(" (GFXglyph *)%sGlyphs,\n", fontName); + if (face->size->metrics.height == 0) { + // No face height info, assume fixed width and get from a glyph. + printf(" 0x%02X, 0x%02X, %d };\n\n", first, last, table[0].height); + } else { + printf(" 0x%02X, 0x%02X, %ld };\n\n", first, last, + face->size->metrics.height >> 6); + } + printf("// Approx. %d bytes\n", bitmapOffset + (last - first + 1) * 7 + 7); + // Size estimate is based on AVR struct and pointer sizes; + // actual size may vary. + + FT_Done_FreeType(library); + + return 0; +} + +/* ------------------------------------------------------------------------- + +Character metrics are slightly different from classic GFX & ftGFX. +In classic GFX: cursor position is the upper-left pixel of each 5x7 +character; lower extent of most glyphs (except those w/descenders) +is +6 pixels in Y direction. +W/new GFX fonts: cursor position is on baseline, where baseline is +'inclusive' (containing the bottom-most row of pixels in most symbols, +except those with descenders; ftGFX is one pixel lower). + +Cursor Y will be moved automatically when switching between classic +and new fonts. If you switch fonts, any print() calls will continue +along the same baseline. + + ...........#####.. -- yOffset + ..........######.. + ..........######.. + .........#######.. + ........#########. + * = Cursor pos. ........#########. + .......##########. + ......#####..####. + ......#####..####. + *.#.. .....#####...####. + .#.#. ....############## + #...# ...############### + #...# ...############### + ##### ..#####......##### + #...# .#####.......##### +====== #...# ====== #*###.........#### ======= Baseline + || xOffset + +glyph->xOffset and yOffset are pixel offsets, in GFX coordinate space +(+Y is down), from the cursor position to the top-left pixel of the +glyph bitmap. i.e. yOffset is typically negative, xOffset is typically +zero but a few glyphs will have other values (even negative xOffsets +sometimes, totally normal). glyph->xAdvance is the distance to move +the cursor on the X axis after drawing the corresponding symbol. + +There's also some changes with regard to 'background' color and new GFX +fonts (classic fonts unchanged). See Adafruit_GFX.cpp for explanation. +*/ + +#endif /* !ARDUINO */ diff --git a/src/library/Adafruit-GFX-Library/fontconvert/fontconvert_win.md b/src/library/Adafruit-GFX-Library/fontconvert/fontconvert_win.md new file mode 100644 index 0000000..361078b --- /dev/null +++ b/src/library/Adafruit-GFX-Library/fontconvert/fontconvert_win.md @@ -0,0 +1,88 @@ +### A short guide to use fontconvert.c to create your own fonts using MinGW. + +#### STEP 1: INSTALL MinGW + +Install MinGW (Minimalist GNU for Windows) from [MinGW.org](http://www.mingw.org/). +Please read carefully the instructions found on [Getting started page](http://www.mingw.org/wiki/Getting_Started). +I suggest installing with the "Graphical User Interface Installer". +To complete your initial installation you should further install some "packages". +For our purpose you should only install the "Basic Setup" packages. +To do that: + +1. Open the MinGW Installation Manager +2. From the left panel click "Basic Setup". +3. On the right panel choose "mingw32-base", "mingw-gcc-g++", "mingw-gcc-objc" and "msys-base" +and click "Mark for installation" +4. From the Menu click "Installation" and then "Apply changes". In the pop-up window select "Apply". + + +#### STEP 2: INSTALL Freetype Library + +To read about the freetype project visit [freetype.org](https://www.freetype.org/). +To Download the latest version of freetype go to [download page](http://download.savannah.gnu.org/releases/freetype/) +and choose "freetype-2.7.tar.gz" file (or a newer version if available). +To avoid long cd commands later in the command prompt, I suggest you unzip the file in the C:\ directory. +(I also renamed the folder to "ft27") +Before you build the library it's good to read these articles: +* [Using MSYS with MinGW](http://www.mingw.org/wiki/MSYS) +* [Installation and Use of Supplementary Libraries with MinGW](http://www.mingw.org/wiki/LibraryPathHOWTO) +* [Include Path](http://www.mingw.org/wiki/IncludePathHOWTO) + +Inside the unzipped folder there is another folder named "docs". Open it and read the INSTALL.UNIX (using notepad). +Pay attention to paragraph 3 (Build and Install the Library). So, let's begin the installation. +To give the appropriate commands we will use the MSYS command prompt (not cmd.exe of windows) which is UNIX like. +Follow the path C:\MinGW\msys\1.0 and double click "msys.bat". The command prompt environment appears. +Enter "ft27" directory using the cd commands: +``` +cd /c +cd ft27 +``` + +and then type one by one the commands: +``` +./configure --prefix=/mingw +make +make install +``` +Once you're finished, go inside "C:\MinGW\include" and there should be a new folder named "freetype2". +That, hopefully, means that you have installed the library correctly !! + +#### STEP 3: Build fontconvert.c + +Before proceeding I suggest you make a copy of Adafruit_GFX_library folder in C:\ directory. +Then, inside "fontconvert" folder open the "makefile" with an editor ( I used notepad++). +Change the commands so in the end the program looks like : +``` +all: fontconvert + +CC = gcc +CFLAGS = -Wall -I c:/mingw/include/freetype2 +LIBS = -lfreetype + +fontconvert: fontconvert.c + $(CC) $(CFLAGS) $< $(LIBS) -o $@ + +clean: + rm -f fontconvert +``` +Go back in the command prompt and with a cd command enter the fontconvert directory. +``` +cd /c/adafruit_gfx_library\fontconvert +``` +Give the command: +``` +make +``` +This command will, eventually, create a "fontconvert.exe" file inside fontconvert directory. + +#### STEP 4: Create your own font header files + +Now that you have an executable file, you can use it to create your own fonts to work with Adafruit GFX lib. +So, if we suppose that you already have a .ttf file with your favorite fonts, jump to the command prompt and type: +``` +./fontconvert yourfonts.ttf 9 > yourfonts9pt7b.h +``` +You can read more details at: [learn.adafruit](https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts). + +Taraaaaaammm !! you've just created your new font header file. Put it inside the "Fonts" folder, grab a cup of coffee +and start playing with your Arduino (or whatever else ....)+ display module project. diff --git a/src/library/Adafruit-GFX-Library/fontconvert/makefonts.sh b/src/library/Adafruit-GFX-Library/fontconvert/makefonts.sh new file mode 100644 index 0000000..35f07ea --- /dev/null +++ b/src/library/Adafruit-GFX-Library/fontconvert/makefonts.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Ugly little Bash script, generates a set of .h files for GFX using +# GNU FreeFont sources. There are three fonts: 'Mono' (Courier-like), +# 'Sans' (Helvetica-like) and 'Serif' (Times-like); four styles: regular, +# bold, oblique or italic, and bold+oblique or bold+italic; and four +# sizes: 9, 12, 18 and 24 point. No real error checking or anything, +# this just powers through all the combinations, calling the fontconvert +# utility and redirecting the output to a .h file for each combo. + +# Adafruit_GFX repository does not include the source outline fonts +# (huge zipfile, different license) but they're easily acquired: +# http://savannah.gnu.org/projects/freefont/ + +convert=./fontconvert +inpath=~/Desktop/freefont/ +outpath=../Fonts/ +fonts=(FreeMono FreeSans FreeSerif) +styles=("" Bold Italic BoldItalic Oblique BoldOblique) +sizes=(9 12 18 24) + +for f in ${fonts[*]} +do + for index in ${!styles[*]} + do + st=${styles[$index]} + for si in ${sizes[*]} + do + infile=$inpath$f$st".ttf" + if [ -f $infile ] # Does source combination exist? + then + outfile=$outpath$f$st$si"pt7b.h" +# printf "%s %s %s > %s\n" $convert $infile $si $outfile + $convert $infile $si > $outfile + fi + done + done +done diff --git a/src/library/Adafruit-GFX-Library/gfxfont.h b/src/library/Adafruit-GFX-Library/gfxfont.h new file mode 100644 index 0000000..175bad6 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/gfxfont.h @@ -0,0 +1,29 @@ +// Font structures for newer Adafruit_GFX (1.1 and later). +// Example fonts are included in 'Fonts' directory. +// To use a font in your Arduino sketch, #include the corresponding .h +// file and pass address of GFXfont struct to setFont(). Pass NULL to +// revert to 'classic' fixed-space bitmap font. + +#ifndef _GFXFONT_H_ +#define _GFXFONT_H_ + +/// Font data stored PER GLYPH +typedef struct { + uint16_t bitmapOffset; ///< Pointer into GFXfont->bitmap + uint8_t width; ///< Bitmap dimensions in pixels + uint8_t height; ///< Bitmap dimensions in pixels + uint8_t xAdvance; ///< Distance to advance cursor (x axis) + int8_t xOffset; ///< X dist from cursor pos to UL corner + int8_t yOffset; ///< Y dist from cursor pos to UL corner +} GFXglyph; + +/// Data stored for FONT AS A WHOLE +typedef struct { + uint8_t *bitmap; ///< Glyph bitmaps, concatenated + GFXglyph *glyph; ///< Glyph array + uint16_t first; ///< ASCII extents (first char) + uint16_t last; ///< ASCII extents (last char) + uint8_t yAdvance; ///< Newline distance (y axis) +} GFXfont; + +#endif // _GFXFONT_H_ diff --git a/src/library/Adafruit-GFX-Library/glcdfont.c b/src/library/Adafruit-GFX-Library/glcdfont.c new file mode 100644 index 0000000..535da3a --- /dev/null +++ b/src/library/Adafruit-GFX-Library/glcdfont.c @@ -0,0 +1,143 @@ +// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. +// See gfxfont.h for newer custom bitmap font info. + +#ifndef FONT5X7_H +#define FONT5X7_H + +#ifdef __AVR__ +#include +#include +#elif defined(ESP8266) +#include +#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) +// PROGMEM is defefind for T4 to place data in specific memory section +#undef PROGMEM +#define PROGMEM +#else +#define PROGMEM +#endif + +// Standard ASCII 5x7 font + +static const unsigned char font[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, + 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, + 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, + 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, + 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, + 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, + 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, + 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, + 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, + 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, + 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, + 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, + 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, + 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, + 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, + 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, + 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, + 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, + 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, + 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, + 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, + 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, + 0x22, 0x14, 0x08, 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, + 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, + 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, + 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, + 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, + 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, + 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, + 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, + 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, + 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, + 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, + 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, + 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, + 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, + 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, + 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, + 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, + 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, + 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, + 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, + 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, + 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C, + 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, + 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, + 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, + 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, + 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, + 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut + 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, + 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, + 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, + 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0x7D, 0x12, 0x11, + 0x12, 0x7D, // A-umlaut + 0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, + 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, + 0x32, 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut + 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, + 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x3D, 0x42, 0x42, 0x42, + 0x3D, // O-umlaut + 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, + 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, + 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, + 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, + 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, + 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, + 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, + 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, + 0x14, 0x08, 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old + // code + 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block + 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, + 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, + 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, + 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, + 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, + 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, + 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, + 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, + 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, + 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, + 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, + 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, + 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, + 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, + 0x38, 0x44, 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta + 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, + 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, + 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, + 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, + 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, + 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, + 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, + 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, + 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, + 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, + 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP +}; + +// allow clean compilation with [-Wunused-const-variable=] and [-Wall] +static inline void avoid_unused_const_variable_compiler_warning(void) { + (void)font; +} + +#endif // FONT5X7_H diff --git a/src/library/Adafruit-GFX-Library/library.properties b/src/library/Adafruit-GFX-Library/library.properties new file mode 100644 index 0000000..7d8849e --- /dev/null +++ b/src/library/Adafruit-GFX-Library/library.properties @@ -0,0 +1,10 @@ +name=Adafruit GFX Library +version=1.11.9 +author=Adafruit +maintainer=Adafruit +sentence=Adafruit GFX graphics core library, this is the 'core' class that all our other graphics libraries derive from. +paragraph=Install this library in addition to the display library for your hardware. +category=Display +url=https://github.com/adafruit/Adafruit-GFX-Library +architectures=* +depends=Adafruit BusIO diff --git a/src/library/Adafruit-GFX-Library/license.txt b/src/library/Adafruit-GFX-Library/license.txt new file mode 100644 index 0000000..7492e93 --- /dev/null +++ b/src/library/Adafruit-GFX-Library/license.txt @@ -0,0 +1,24 @@ +Software License Agreement (BSD License) + +Copyright (c) 2012 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/src/library/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md b/src/library/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..f0e2614 --- /dev/null +++ b/src/library/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,46 @@ +Thank you for opening an issue on an Adafruit Arduino library repository. To +improve the speed of resolution please review the following guidelines and +common troubleshooting steps below before creating the issue: + +- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use + the forums at http://forums.adafruit.com to ask questions and troubleshoot why + something isn't working as expected. In many cases the problem is a common issue + that you will more quickly receive help from the forum community. GitHub issues + are meant for known defects in the code. If you don't know if there is a defect + in the code then start with troubleshooting on the forum first. + +- **If following a tutorial or guide be sure you didn't miss a step.** Carefully + check all of the steps and commands to run have been followed. Consult the + forum if you're unsure or have questions about steps in a guide/tutorial. + +- **For Arduino projects check these very common issues to ensure they don't apply**: + + - For uploading sketches or communicating with the board make sure you're using + a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes + very hard to tell the difference between a data and charge cable! Try using the + cable with other devices or swapping to another cable to confirm it is not + the problem. + + - **Be sure you are supplying adequate power to the board.** Check the specs of + your board and plug in an external power supply. In many cases just + plugging a board into your computer is not enough to power it and other + peripherals. + + - **Double check all soldering joints and connections.** Flakey connections + cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. + + - **Ensure you are using an official Arduino or Adafruit board.** We can't + guarantee a clone board will have the same functionality and work as expected + with this code and don't support them. + +If you're sure this issue is a defect in the code and checked the steps above +please fill in the following fields to provide enough troubleshooting information. +You may delete the guideline and text above to just leave the following details: + +- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** + +- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO + VERSION HERE** + +- List the steps to reproduce the problem below (if possible attach a sketch or + copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/src/library/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md b/src/library/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7b641eb --- /dev/null +++ b/src/library/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +Thank you for creating a pull request to contribute to Adafruit's GitHub code! +Before you open the request please review the following guidelines and tips to +help it be more easily integrated: + +- **Describe the scope of your change--i.e. what the change does and what parts + of the code were modified.** This will help us understand any risks of integrating + the code. + +- **Describe any known limitations with your change.** For example if the change + doesn't apply to a supported platform of the library please mention it. + +- **Please run any tests or examples that can exercise your modified code.** We + strive to not break users of the code and running tests/examples helps with this + process. + +Thank you again for contributing! We will try to test and integrate the change +as soon as we can, but be aware we have many GitHub repositories to manage and +can't immediately respond to every request. There is no need to bump or check in +on a pull request (it will clutter the discussion of the request). + +Also don't be worried if the request is closed or not integrated--sometimes the +priorities of Adafruit's GitHub code (education, ease of use) might not match the +priorities of the pull request. Don't fret, the open source community thrives on +forks and GitHub makes it easy to keep your changes in a forked repo. + +After reviewing the guidelines above you can delete this text from the pull request. diff --git a/src/library/Adafruit_BusIO/.github/workflows/githubci.yml b/src/library/Adafruit_BusIO/.github/workflows/githubci.yml new file mode 100644 index 0000000..8a57d75 --- /dev/null +++ b/src/library/Adafruit_BusIO/.github/workflows/githubci.yml @@ -0,0 +1,33 @@ +name: Arduino Library CI + +on: [pull_request, push, repository_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/setup-python@v4 + with: + python-version: '3.x' + - uses: actions/checkout@v3 + - uses: actions/checkout@v3 + with: + repository: adafruit/ci-arduino + path: ci + + - name: Install the prerequisites + run: bash ci/actions_install.sh + + - name: Check for correct code formatting with clang-format + run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . + + - name: Check for correct documentation with doxygen + env: + GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} + PRETTYNAME : "Adafruit Bus IO Library" + run: bash ci/doxy_gen_and_deploy.sh + + - name: Test the code on supported platforms + run: python3 ci/build_platform.py main_platforms zero feather32u4 + diff --git a/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.cpp b/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.cpp new file mode 100644 index 0000000..673f774 --- /dev/null +++ b/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.cpp @@ -0,0 +1,365 @@ +#include "Adafruit_BusIO_Register.h" + +#if !defined(SPI_INTERFACES_COUNT) || \ + (defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0)) + +/*! + * @brief Create a register we access over an I2C Device (which defines the + * bus and address) + * @param i2cdevice The I2CDevice to use for underlying I2C access + * @param reg_addr The address pointer value for the I2C/SMBus register, can + * be 8 or 16 bits + * @param width The width of the register data itself, defaults to 1 byte + * @param byteorder The byte order of the register (used when width is > 1), + * defaults to LSBFIRST + * @param address_width The width of the register address itself, defaults + * to 1 byte + */ +Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, + uint16_t reg_addr, + uint8_t width, + uint8_t byteorder, + uint8_t address_width) { + _i2cdevice = i2cdevice; + _spidevice = nullptr; + _addrwidth = address_width; + _address = reg_addr; + _byteorder = byteorder; + _width = width; +} + +/*! + * @brief Create a register we access over an SPI Device (which defines the + * bus and CS pin) + * @param spidevice The SPIDevice to use for underlying SPI access + * @param reg_addr The address pointer value for the SPI register, can + * be 8 or 16 bits + * @param type The method we use to read/write data to SPI (which is not + * as well defined as I2C) + * @param width The width of the register data itself, defaults to 1 byte + * @param byteorder The byte order of the register (used when width is > 1), + * defaults to LSBFIRST + * @param address_width The width of the register address itself, defaults + * to 1 byte + */ +Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice, + uint16_t reg_addr, + Adafruit_BusIO_SPIRegType type, + uint8_t width, + uint8_t byteorder, + uint8_t address_width) { + _spidevice = spidevice; + _spiregtype = type; + _i2cdevice = nullptr; + _addrwidth = address_width; + _address = reg_addr; + _byteorder = byteorder; + _width = width; +} + +/*! + * @brief Create a register we access over an I2C or SPI Device. This is a + * handy function because we can pass in nullptr for the unused interface, + * allowing libraries to mass-define all the registers + * @param i2cdevice The I2CDevice to use for underlying I2C access, if + * nullptr we use SPI + * @param spidevice The SPIDevice to use for underlying SPI access, if + * nullptr we use I2C + * @param reg_addr The address pointer value for the I2C/SMBus/SPI register, + * can be 8 or 16 bits + * @param type The method we use to read/write data to SPI (which is not + * as well defined as I2C) + * @param width The width of the register data itself, defaults to 1 byte + * @param byteorder The byte order of the register (used when width is > 1), + * defaults to LSBFIRST + * @param address_width The width of the register address itself, defaults + * to 1 byte + */ +Adafruit_BusIO_Register::Adafruit_BusIO_Register( + Adafruit_I2CDevice *i2cdevice, Adafruit_SPIDevice *spidevice, + Adafruit_BusIO_SPIRegType type, uint16_t reg_addr, uint8_t width, + uint8_t byteorder, uint8_t address_width) { + _spidevice = spidevice; + _i2cdevice = i2cdevice; + _spiregtype = type; + _addrwidth = address_width; + _address = reg_addr; + _byteorder = byteorder; + _width = width; +} + +/*! + * @brief Write a buffer of data to the register location + * @param buffer Pointer to data to write + * @param len Number of bytes to write + * @return True on successful write (only really useful for I2C as SPI is + * uncheckable) + */ +bool Adafruit_BusIO_Register::write(uint8_t *buffer, uint8_t len) { + + uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), + (uint8_t)(_address >> 8)}; + + if (_i2cdevice) { + return _i2cdevice->write(buffer, len, true, addrbuffer, _addrwidth); + } + if (_spidevice) { + if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { + // very special case! + + // pass the special opcode address which we set as the high byte of the + // regaddr + addrbuffer[0] = + (uint8_t)(_address >> 8) & ~0x01; // set bottom bit low to write + // the 'actual' reg addr is the second byte then + addrbuffer[1] = (uint8_t)(_address & 0xFF); + // the address appears to be a byte longer + return _spidevice->write(buffer, len, addrbuffer, _addrwidth + 1); + } + + if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { + addrbuffer[0] &= ~0x80; + } + if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) { + addrbuffer[0] |= 0x80; + } + if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) { + addrbuffer[0] &= ~0x80; + addrbuffer[0] |= 0x40; + } + return _spidevice->write(buffer, len, addrbuffer, _addrwidth); + } + return false; +} + +/*! + * @brief Write up to 4 bytes of data to the register location + * @param value Data to write + * @param numbytes How many bytes from 'value' to write + * @return True on successful write (only really useful for I2C as SPI is + * uncheckable) + */ +bool Adafruit_BusIO_Register::write(uint32_t value, uint8_t numbytes) { + if (numbytes == 0) { + numbytes = _width; + } + if (numbytes > 4) { + return false; + } + + // store a copy + _cached = value; + + for (int i = 0; i < numbytes; i++) { + if (_byteorder == LSBFIRST) { + _buffer[i] = value & 0xFF; + } else { + _buffer[numbytes - i - 1] = value & 0xFF; + } + value >>= 8; + } + return write(_buffer, numbytes); +} + +/*! + * @brief Read data from the register location. This does not do any error + * checking! + * @return Returns 0xFFFFFFFF on failure, value otherwise + */ +uint32_t Adafruit_BusIO_Register::read(void) { + if (!read(_buffer, _width)) { + return -1; + } + + uint32_t value = 0; + + for (int i = 0; i < _width; i++) { + value <<= 8; + if (_byteorder == LSBFIRST) { + value |= _buffer[_width - i - 1]; + } else { + value |= _buffer[i]; + } + } + + return value; +} + +/*! + * @brief Read cached data from last time we wrote to this register + * @return Returns 0xFFFFFFFF on failure, value otherwise + */ +uint32_t Adafruit_BusIO_Register::readCached(void) { return _cached; } + +/*! + * @brief Read a buffer of data from the register location + * @param buffer Pointer to data to read into + * @param len Number of bytes to read + * @return True on successful write (only really useful for I2C as SPI is + * uncheckable) + */ +bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) { + uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), + (uint8_t)(_address >> 8)}; + + if (_i2cdevice) { + return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len); + } + if (_spidevice) { + if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { + // very special case! + + // pass the special opcode address which we set as the high byte of the + // regaddr + addrbuffer[0] = + (uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read + // the 'actual' reg addr is the second byte then + addrbuffer[1] = (uint8_t)(_address & 0xFF); + // the address appears to be a byte longer + return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer, + len); + } + if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { + addrbuffer[0] |= 0x80; + } + if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) { + addrbuffer[0] &= ~0x80; + } + if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) { + addrbuffer[0] |= 0x80 | 0x40; + } + return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len); + } + return false; +} + +/*! + * @brief Read 2 bytes of data from the register location + * @param value Pointer to uint16_t variable to read into + * @return True on successful write (only really useful for I2C as SPI is + * uncheckable) + */ +bool Adafruit_BusIO_Register::read(uint16_t *value) { + if (!read(_buffer, 2)) { + return false; + } + + if (_byteorder == LSBFIRST) { + *value = _buffer[1]; + *value <<= 8; + *value |= _buffer[0]; + } else { + *value = _buffer[0]; + *value <<= 8; + *value |= _buffer[1]; + } + return true; +} + +/*! + * @brief Read 1 byte of data from the register location + * @param value Pointer to uint8_t variable to read into + * @return True on successful write (only really useful for I2C as SPI is + * uncheckable) + */ +bool Adafruit_BusIO_Register::read(uint8_t *value) { + if (!read(_buffer, 1)) { + return false; + } + + *value = _buffer[0]; + return true; +} + +/*! + * @brief Pretty printer for this register + * @param s The Stream to print to, defaults to &Serial + */ +void Adafruit_BusIO_Register::print(Stream *s) { + uint32_t val = read(); + s->print("0x"); + s->print(val, HEX); +} + +/*! + * @brief Pretty printer for this register + * @param s The Stream to print to, defaults to &Serial + */ +void Adafruit_BusIO_Register::println(Stream *s) { + print(s); + s->println(); +} + +/*! + * @brief Create a slice of the register that we can address without + * touching other bits + * @param reg The Adafruit_BusIO_Register which defines the bus/register + * @param bits The number of bits wide we are slicing + * @param shift The number of bits that our bit-slice is shifted from LSB + */ +Adafruit_BusIO_RegisterBits::Adafruit_BusIO_RegisterBits( + Adafruit_BusIO_Register *reg, uint8_t bits, uint8_t shift) { + _register = reg; + _bits = bits; + _shift = shift; +} + +/*! + * @brief Read 4 bytes of data from the register + * @return data The 4 bytes to read + */ +uint32_t Adafruit_BusIO_RegisterBits::read(void) { + uint32_t val = _register->read(); + val >>= _shift; + return val & ((1 << (_bits)) - 1); +} + +/*! + * @brief Write 4 bytes of data to the register + * @param data The 4 bytes to write + * @return True on successful write (only really useful for I2C as SPI is + * uncheckable) + */ +bool Adafruit_BusIO_RegisterBits::write(uint32_t data) { + uint32_t val = _register->read(); + + // mask off the data before writing + uint32_t mask = (1 << (_bits)) - 1; + data &= mask; + + mask <<= _shift; + val &= ~mask; // remove the current data at that spot + val |= data << _shift; // and add in the new data + + return _register->write(val, _register->width()); +} + +/*! + * @brief The width of the register data, helpful for doing calculations + * @returns The data width used when initializing the register + */ +uint8_t Adafruit_BusIO_Register::width(void) { return _width; } + +/*! + * @brief Set the default width of data + * @param width the default width of data read from register + */ +void Adafruit_BusIO_Register::setWidth(uint8_t width) { _width = width; } + +/*! + * @brief Set register address + * @param address the address from register + */ +void Adafruit_BusIO_Register::setAddress(uint16_t address) { + _address = address; +} + +/*! + * @brief Set the width of register address + * @param address_width the width for register address + */ +void Adafruit_BusIO_Register::setAddressWidth(uint16_t address_width) { + _addrwidth = address_width; +} + +#endif // SPI exists diff --git a/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.h b/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.h new file mode 100644 index 0000000..871a95d --- /dev/null +++ b/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.h @@ -0,0 +1,105 @@ +#ifndef Adafruit_BusIO_Register_h +#define Adafruit_BusIO_Register_h + +#include + +#if !defined(SPI_INTERFACES_COUNT) || \ + (defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0)) + +#include "Adafruit_I2CDevice.h" +#include "Adafruit_SPIDevice.h" + +typedef enum _Adafruit_BusIO_SPIRegType { + ADDRBIT8_HIGH_TOREAD = 0, + /*!< + * ADDRBIT8_HIGH_TOREAD + * When reading a register you must actually send the value 0x80 + register + * address to the device. e.g. To read the register 0x0B the register value + * 0x8B is sent and to write 0x0B is sent. + */ + AD8_HIGH_TOREAD_AD7_HIGH_TOINC = 1, + + /*!< + * ADDRBIT8_HIGH_TOWRITE + * When writing to a register you must actually send the value 0x80 + + * the register address to the device. e.g. To write to the register 0x19 the + * register value 0x99 is sent and to read 0x19 is sent. + */ + ADDRBIT8_HIGH_TOWRITE = 2, + + /*!< + * ADDRESSED_OPCODE_LOWBIT_TO_WRITE + * Used by the MCP23S series, we send 0x40 |'rd with the opcode + * Then set the lowest bit to write + */ + ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE = 3, + +} Adafruit_BusIO_SPIRegType; + +/*! + * @brief The class which defines a device register (a location to read/write + * data from) + */ +class Adafruit_BusIO_Register { +public: + Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, uint16_t reg_addr, + uint8_t width = 1, uint8_t byteorder = LSBFIRST, + uint8_t address_width = 1); + + Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice, uint16_t reg_addr, + Adafruit_BusIO_SPIRegType type, uint8_t width = 1, + uint8_t byteorder = LSBFIRST, + uint8_t address_width = 1); + + Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, + Adafruit_SPIDevice *spidevice, + Adafruit_BusIO_SPIRegType type, uint16_t reg_addr, + uint8_t width = 1, uint8_t byteorder = LSBFIRST, + uint8_t address_width = 1); + + bool read(uint8_t *buffer, uint8_t len); + bool read(uint8_t *value); + bool read(uint16_t *value); + uint32_t read(void); + uint32_t readCached(void); + bool write(uint8_t *buffer, uint8_t len); + bool write(uint32_t value, uint8_t numbytes = 0); + + uint8_t width(void); + + void setWidth(uint8_t width); + void setAddress(uint16_t address); + void setAddressWidth(uint16_t address_width); + + void print(Stream *s = &Serial); + void println(Stream *s = &Serial); + +private: + Adafruit_I2CDevice *_i2cdevice; + Adafruit_SPIDevice *_spidevice; + Adafruit_BusIO_SPIRegType _spiregtype; + uint16_t _address; + uint8_t _width, _addrwidth, _byteorder; + uint8_t _buffer[4]; // we won't support anything larger than uint32 for + // non-buffered read + uint32_t _cached = 0; +}; + +/*! + * @brief The class which defines a slice of bits from within a device register + * (a location to read/write data from) + */ +class Adafruit_BusIO_RegisterBits { +public: + Adafruit_BusIO_RegisterBits(Adafruit_BusIO_Register *reg, uint8_t bits, + uint8_t shift); + bool write(uint32_t value); + uint32_t read(void); + +private: + Adafruit_BusIO_Register *_register; + uint8_t _bits, _shift; +}; + +#endif // SPI exists +#endif // BusIO_Register_h diff --git a/src/library/Adafruit_BusIO/Adafruit_I2CDevice.cpp b/src/library/Adafruit_BusIO/Adafruit_I2CDevice.cpp new file mode 100644 index 0000000..92c1731 --- /dev/null +++ b/src/library/Adafruit_BusIO/Adafruit_I2CDevice.cpp @@ -0,0 +1,317 @@ +#include "Adafruit_I2CDevice.h" + +//#define DEBUG_SERIAL Serial + +/*! + * @brief Create an I2C device at a given address + * @param addr The 7-bit I2C address for the device + * @param theWire The I2C bus to use, defaults to &Wire + */ +Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) { + _addr = addr; + _wire = theWire; + _begun = false; +#ifdef ARDUINO_ARCH_SAMD + _maxBufferSize = 250; // as defined in Wire.h's RingBuffer +#elif defined(ESP32) + _maxBufferSize = I2C_BUFFER_LENGTH; +#else + _maxBufferSize = 32; +#endif +} + +/*! + * @brief Initializes and does basic address detection + * @param addr_detect Whether we should attempt to detect the I2C address + * with a scan. 99% of sensors/devices don't mind, but once in a while they + * don't respond well to a scan! + * @return True if I2C initialized and a device with the addr found + */ +bool Adafruit_I2CDevice::begin(bool addr_detect) { + _wire->begin(); + _begun = true; + + if (addr_detect) { + return detected(); + } + return true; +} + +/*! + * @brief De-initialize device, turn off the Wire interface + */ +void Adafruit_I2CDevice::end(void) { + // Not all port implement Wire::end(), such as + // - ESP8266 + // - AVR core without WIRE_HAS_END + // - ESP32: end() is implemented since 2.0.1 which is latest at the moment. + // Temporarily disable for now to give time for user to update. +#if !(defined(ESP8266) || \ + (defined(ARDUINO_ARCH_AVR) && !defined(WIRE_HAS_END)) || \ + defined(ARDUINO_ARCH_ESP32)) + _wire->end(); + _begun = false; +#endif +} + +/*! + * @brief Scans I2C for the address - note will give a false-positive + * if there's no pullups on I2C + * @return True if I2C initialized and a device with the addr found + */ +bool Adafruit_I2CDevice::detected(void) { + // Init I2C if not done yet + if (!_begun && !begin()) { + return false; + } + + // A basic scanner, see if it ACK's + _wire->beginTransmission(_addr); +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("Address 0x")); + DEBUG_SERIAL.print(_addr); +#endif + if (_wire->endTransmission() == 0) { +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.println(F(" Detected")); +#endif + return true; + } +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.println(F(" Not detected")); +#endif + return false; +} + +/*! + * @brief Write a buffer or two to the I2C device. Cannot be more than + * maxBufferSize() bytes. + * @param buffer Pointer to buffer of data to write. This is const to + * ensure the content of this buffer doesn't change. + * @param len Number of bytes from buffer to write + * @param prefix_buffer Pointer to optional array of data to write before + * buffer. Cannot be more than maxBufferSize() bytes. This is const to + * ensure the content of this buffer doesn't change. + * @param prefix_len Number of bytes from prefix buffer to write + * @param stop Whether to send an I2C STOP signal on write + * @return True if write was successful, otherwise false. + */ +bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop, + const uint8_t *prefix_buffer, + size_t prefix_len) { + if ((len + prefix_len) > maxBufferSize()) { + // currently not guaranteed to work if more than 32 bytes! + // we will need to find out if some platforms have larger + // I2C buffer sizes :/ +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.println(F("\tI2CDevice could not write such a large buffer")); +#endif + return false; + } + + _wire->beginTransmission(_addr); + + // Write the prefix data (usually an address) + if ((prefix_len != 0) && (prefix_buffer != nullptr)) { + if (_wire->write(prefix_buffer, prefix_len) != prefix_len) { +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.println(F("\tI2CDevice failed to write")); +#endif + return false; + } + } + + // Write the data itself + if (_wire->write(buffer, len) != len) { +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.println(F("\tI2CDevice failed to write")); +#endif + return false; + } + +#ifdef DEBUG_SERIAL + + DEBUG_SERIAL.print(F("\tI2CWRITE @ 0x")); + DEBUG_SERIAL.print(_addr, HEX); + DEBUG_SERIAL.print(F(" :: ")); + if ((prefix_len != 0) && (prefix_buffer != nullptr)) { + for (uint16_t i = 0; i < prefix_len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(prefix_buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + } + } + for (uint16_t i = 0; i < len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + if (i % 32 == 31) { + DEBUG_SERIAL.println(); + } + } + + if (stop) { + DEBUG_SERIAL.print("\tSTOP"); + } +#endif + + if (_wire->endTransmission(stop) == 0) { +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.println(); + // DEBUG_SERIAL.println("Sent!"); +#endif + return true; + } else { +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.println("\tFailed to send!"); +#endif + return false; + } +} + +/*! + * @brief Read from I2C into a buffer from the I2C device. + * Cannot be more than maxBufferSize() bytes. + * @param buffer Pointer to buffer of data to read into + * @param len Number of bytes from buffer to read. + * @param stop Whether to send an I2C STOP signal on read + * @return True if read was successful, otherwise false. + */ +bool Adafruit_I2CDevice::read(uint8_t *buffer, size_t len, bool stop) { + size_t pos = 0; + while (pos < len) { + size_t read_len = + ((len - pos) > maxBufferSize()) ? maxBufferSize() : (len - pos); + bool read_stop = (pos < (len - read_len)) ? false : stop; + if (!_read(buffer + pos, read_len, read_stop)) + return false; + pos += read_len; + } + return true; +} + +bool Adafruit_I2CDevice::_read(uint8_t *buffer, size_t len, bool stop) { +#if defined(TinyWireM_h) + size_t recv = _wire->requestFrom((uint8_t)_addr, (uint8_t)len); +#elif defined(ARDUINO_ARCH_MEGAAVR) + size_t recv = _wire->requestFrom(_addr, len, stop); +#else + size_t recv = _wire->requestFrom((uint8_t)_addr, (uint8_t)len, (uint8_t)stop); +#endif + + if (recv != len) { + // Not enough data available to fulfill our obligation! +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tI2CDevice did not receive enough data: ")); + DEBUG_SERIAL.println(recv); +#endif + return false; + } + + for (uint16_t i = 0; i < len; i++) { + buffer[i] = _wire->read(); + } + +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tI2CREAD @ 0x")); + DEBUG_SERIAL.print(_addr, HEX); + DEBUG_SERIAL.print(F(" :: ")); + for (uint16_t i = 0; i < len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + if (len % 32 == 31) { + DEBUG_SERIAL.println(); + } + } + DEBUG_SERIAL.println(); +#endif + + return true; +} + +/*! + * @brief Write some data, then read some data from I2C into another buffer. + * Cannot be more than maxBufferSize() bytes. The buffers can point to + * same/overlapping locations. + * @param write_buffer Pointer to buffer of data to write from + * @param write_len Number of bytes from buffer to write. + * @param read_buffer Pointer to buffer of data to read into. + * @param read_len Number of bytes from buffer to read. + * @param stop Whether to send an I2C STOP signal between the write and read + * @return True if write & read was successful, otherwise false. + */ +bool Adafruit_I2CDevice::write_then_read(const uint8_t *write_buffer, + size_t write_len, uint8_t *read_buffer, + size_t read_len, bool stop) { + if (!write(write_buffer, write_len, stop)) { + return false; + } + + return read(read_buffer, read_len); +} + +/*! + * @brief Returns the 7-bit address of this device + * @return The 7-bit address of this device + */ +uint8_t Adafruit_I2CDevice::address(void) { return _addr; } + +/*! + * @brief Change the I2C clock speed to desired (relies on + * underlying Wire support! + * @param desiredclk The desired I2C SCL frequency + * @return True if this platform supports changing I2C speed. + * Not necessarily that the speed was achieved! + */ +bool Adafruit_I2CDevice::setSpeed(uint32_t desiredclk) { +#if defined(__AVR_ATmega328__) || \ + defined(__AVR_ATmega328P__) // fix arduino core set clock + // calculate TWBR correctly + + if ((F_CPU / 18) < desiredclk) { +#ifdef DEBUG_SERIAL + Serial.println(F("I2C.setSpeed too high.")); +#endif + return false; + } + uint32_t atwbr = ((F_CPU / desiredclk) - 16) / 2; + if (atwbr > 16320) { +#ifdef DEBUG_SERIAL + Serial.println(F("I2C.setSpeed too low.")); +#endif + return false; + } + + if (atwbr <= 255) { + atwbr /= 1; + TWSR = 0x0; + } else if (atwbr <= 1020) { + atwbr /= 4; + TWSR = 0x1; + } else if (atwbr <= 4080) { + atwbr /= 16; + TWSR = 0x2; + } else { // if (atwbr <= 16320) + atwbr /= 64; + TWSR = 0x3; + } + TWBR = atwbr; + +#ifdef DEBUG_SERIAL + Serial.print(F("TWSR prescaler = ")); + Serial.println(pow(4, TWSR)); + Serial.print(F("TWBR = ")); + Serial.println(atwbr); +#endif + return true; +#elif (ARDUINO >= 157) && !defined(ARDUINO_STM32_FEATHER) && \ + !defined(TinyWireM_h) + _wire->setClock(desiredclk); + return true; + +#else + (void)desiredclk; + return false; +#endif +} diff --git a/src/library/Adafruit_BusIO/Adafruit_I2CDevice.h b/src/library/Adafruit_BusIO/Adafruit_I2CDevice.h new file mode 100644 index 0000000..6bda7ba --- /dev/null +++ b/src/library/Adafruit_BusIO/Adafruit_I2CDevice.h @@ -0,0 +1,36 @@ +#ifndef Adafruit_I2CDevice_h +#define Adafruit_I2CDevice_h + +#include +#include + +///< The class which defines how we will talk to this device over I2C +class Adafruit_I2CDevice { +public: + Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire = &Wire); + uint8_t address(void); + bool begin(bool addr_detect = true); + void end(void); + bool detected(void); + + bool read(uint8_t *buffer, size_t len, bool stop = true); + bool write(const uint8_t *buffer, size_t len, bool stop = true, + const uint8_t *prefix_buffer = nullptr, size_t prefix_len = 0); + bool write_then_read(const uint8_t *write_buffer, size_t write_len, + uint8_t *read_buffer, size_t read_len, + bool stop = false); + bool setSpeed(uint32_t desiredclk); + + /*! @brief How many bytes we can read in a transaction + * @return The size of the Wire receive/transmit buffer */ + size_t maxBufferSize() { return _maxBufferSize; } + +private: + uint8_t _addr; + TwoWire *_wire; + bool _begun; + size_t _maxBufferSize; + bool _read(uint8_t *buffer, size_t len, bool stop); +}; + +#endif // Adafruit_I2CDevice_h diff --git a/src/library/Adafruit_BusIO/Adafruit_I2CRegister.h b/src/library/Adafruit_BusIO/Adafruit_I2CRegister.h new file mode 100644 index 0000000..da3c439 --- /dev/null +++ b/src/library/Adafruit_BusIO/Adafruit_I2CRegister.h @@ -0,0 +1,10 @@ +#ifndef _ADAFRUIT_I2C_REGISTER_H_ +#define _ADAFRUIT_I2C_REGISTER_H_ + +#include "Adafruit_BusIO_Register.h" +#include + +typedef Adafruit_BusIO_Register Adafruit_I2CRegister; +typedef Adafruit_BusIO_RegisterBits Adafruit_I2CRegisterBits; + +#endif diff --git a/src/library/Adafruit_BusIO/Adafruit_SPIDevice.cpp b/src/library/Adafruit_BusIO/Adafruit_SPIDevice.cpp new file mode 100644 index 0000000..034dc08 --- /dev/null +++ b/src/library/Adafruit_BusIO/Adafruit_SPIDevice.cpp @@ -0,0 +1,508 @@ +#include "Adafruit_SPIDevice.h" + +//#define DEBUG_SERIAL Serial + +/*! + * @brief Create an SPI device with the given CS pin and settings + * @param cspin The arduino pin number to use for chip select + * @param freq The SPI clock frequency to use, defaults to 1MHz + * @param dataOrder The SPI data order to use for bits within each byte, + * defaults to SPI_BITORDER_MSBFIRST + * @param dataMode The SPI mode to use, defaults to SPI_MODE0 + * @param theSPI The SPI bus to use, defaults to &theSPI + */ +Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, uint32_t freq, + BusIOBitOrder dataOrder, + uint8_t dataMode, SPIClass *theSPI) { +#ifdef BUSIO_HAS_HW_SPI + _cs = cspin; + _sck = _mosi = _miso = -1; + _spi = theSPI; + _begun = false; + _spiSetting = new SPISettings(freq, dataOrder, dataMode); + _freq = freq; + _dataOrder = dataOrder; + _dataMode = dataMode; +#else + // unused, but needed to suppress compiler warns + (void)cspin; + (void)freq; + (void)dataOrder; + (void)dataMode; + (void)theSPI; +#endif +} + +/*! + * @brief Create an SPI device with the given CS pin and settings + * @param cspin The arduino pin number to use for chip select + * @param sckpin The arduino pin number to use for SCK + * @param misopin The arduino pin number to use for MISO, set to -1 if not + * used + * @param mosipin The arduino pin number to use for MOSI, set to -1 if not + * used + * @param freq The SPI clock frequency to use, defaults to 1MHz + * @param dataOrder The SPI data order to use for bits within each byte, + * defaults to SPI_BITORDER_MSBFIRST + * @param dataMode The SPI mode to use, defaults to SPI_MODE0 + */ +Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, int8_t sckpin, + int8_t misopin, int8_t mosipin, + uint32_t freq, BusIOBitOrder dataOrder, + uint8_t dataMode) { + _cs = cspin; + _sck = sckpin; + _miso = misopin; + _mosi = mosipin; + +#ifdef BUSIO_USE_FAST_PINIO + csPort = (BusIO_PortReg *)portOutputRegister(digitalPinToPort(cspin)); + csPinMask = digitalPinToBitMask(cspin); + if (mosipin != -1) { + mosiPort = (BusIO_PortReg *)portOutputRegister(digitalPinToPort(mosipin)); + mosiPinMask = digitalPinToBitMask(mosipin); + } + if (misopin != -1) { + misoPort = (BusIO_PortReg *)portInputRegister(digitalPinToPort(misopin)); + misoPinMask = digitalPinToBitMask(misopin); + } + clkPort = (BusIO_PortReg *)portOutputRegister(digitalPinToPort(sckpin)); + clkPinMask = digitalPinToBitMask(sckpin); +#endif + + _freq = freq; + _dataOrder = dataOrder; + _dataMode = dataMode; + _begun = false; +} + +/*! + * @brief Release memory allocated in constructors + */ +Adafruit_SPIDevice::~Adafruit_SPIDevice() { + if (_spiSetting) + delete _spiSetting; +} + +/*! + * @brief Initializes SPI bus and sets CS pin high + * @return Always returns true because there's no way to test success of SPI + * init + */ +bool Adafruit_SPIDevice::begin(void) { + if (_cs != -1) { + pinMode(_cs, OUTPUT); + digitalWrite(_cs, HIGH); + } + + if (_spi) { // hardware SPI +#ifdef BUSIO_HAS_HW_SPI + _spi->begin(); +#endif + } else { + pinMode(_sck, OUTPUT); + + if ((_dataMode == SPI_MODE0) || (_dataMode == SPI_MODE1)) { + // idle low on mode 0 and 1 + digitalWrite(_sck, LOW); + } else { + // idle high on mode 2 or 3 + digitalWrite(_sck, HIGH); + } + if (_mosi != -1) { + pinMode(_mosi, OUTPUT); + digitalWrite(_mosi, HIGH); + } + if (_miso != -1) { + pinMode(_miso, INPUT); + } + } + + _begun = true; + return true; +} + +/*! + * @brief Transfer (send/receive) a buffer over hard/soft SPI, without + * transaction management + * @param buffer The buffer to send and receive at the same time + * @param len The number of bytes to transfer + */ +void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { + // + // HARDWARE SPI + // + if (_spi) { +#ifdef BUSIO_HAS_HW_SPI +#if defined(SPARK) + _spi->transfer(buffer, buffer, len, nullptr); +#elif defined(STM32) + for (size_t i = 0; i < len; i++) { + _spi->transfer(buffer[i]); + } +#else + _spi->transfer(buffer, len); +#endif + return; +#endif + } + + // + // SOFTWARE SPI + // + uint8_t startbit; + if (_dataOrder == SPI_BITORDER_LSBFIRST) { + startbit = 0x1; + } else { + startbit = 0x80; + } + + bool towrite, lastmosi = !(buffer[0] & startbit); + uint8_t bitdelay_us = (1000000 / _freq) / 2; + + for (size_t i = 0; i < len; i++) { + uint8_t reply = 0; + uint8_t send = buffer[i]; + + /* + Serial.print("\tSending software SPI byte 0x"); + Serial.print(send, HEX); + Serial.print(" -> 0x"); + */ + + // Serial.print(send, HEX); + for (uint8_t b = startbit; b != 0; + b = (_dataOrder == SPI_BITORDER_LSBFIRST) ? b << 1 : b >> 1) { + + if (bitdelay_us) { + delayMicroseconds(bitdelay_us); + } + + if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) { + towrite = send & b; + if ((_mosi != -1) && (lastmosi != towrite)) { +#ifdef BUSIO_USE_FAST_PINIO + if (towrite) + *mosiPort = *mosiPort | mosiPinMask; + else + *mosiPort = *mosiPort & ~mosiPinMask; +#else + digitalWrite(_mosi, towrite); +#endif + lastmosi = towrite; + } + +#ifdef BUSIO_USE_FAST_PINIO + *clkPort = *clkPort | clkPinMask; // Clock high +#else + digitalWrite(_sck, HIGH); +#endif + + if (bitdelay_us) { + delayMicroseconds(bitdelay_us); + } + + if (_miso != -1) { +#ifdef BUSIO_USE_FAST_PINIO + if (*misoPort & misoPinMask) { +#else + if (digitalRead(_miso)) { +#endif + reply |= b; + } + } + +#ifdef BUSIO_USE_FAST_PINIO + *clkPort = *clkPort & ~clkPinMask; // Clock low +#else + digitalWrite(_sck, LOW); +#endif + } else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3) + +#ifdef BUSIO_USE_FAST_PINIO + *clkPort = *clkPort | clkPinMask; // Clock high +#else + digitalWrite(_sck, HIGH); +#endif + + if (bitdelay_us) { + delayMicroseconds(bitdelay_us); + } + + if (_mosi != -1) { +#ifdef BUSIO_USE_FAST_PINIO + if (send & b) + *mosiPort = *mosiPort | mosiPinMask; + else + *mosiPort = *mosiPort & ~mosiPinMask; +#else + digitalWrite(_mosi, send & b); +#endif + } + +#ifdef BUSIO_USE_FAST_PINIO + *clkPort = *clkPort & ~clkPinMask; // Clock low +#else + digitalWrite(_sck, LOW); +#endif + + if (_miso != -1) { +#ifdef BUSIO_USE_FAST_PINIO + if (*misoPort & misoPinMask) { +#else + if (digitalRead(_miso)) { +#endif + reply |= b; + } + } + } + if (_miso != -1) { + buffer[i] = reply; + } + } + } + return; +} + +/*! + * @brief Transfer (send/receive) one byte over hard/soft SPI, without + * transaction management + * @param send The byte to send + * @return The byte received while transmitting + */ +uint8_t Adafruit_SPIDevice::transfer(uint8_t send) { + uint8_t data = send; + transfer(&data, 1); + return data; +} + +/*! + * @brief Manually begin a transaction (calls beginTransaction if hardware + * SPI) + */ +void Adafruit_SPIDevice::beginTransaction(void) { + if (_spi) { +#ifdef BUSIO_HAS_HW_SPI + _spi->beginTransaction(*_spiSetting); +#endif + } +} + +/*! + * @brief Manually end a transaction (calls endTransaction if hardware SPI) + */ +void Adafruit_SPIDevice::endTransaction(void) { + if (_spi) { +#ifdef BUSIO_HAS_HW_SPI + _spi->endTransaction(); +#endif + } +} + +/*! + * @brief Assert/Deassert the CS pin if it is defined + * @param value The state the CS is set to + */ +void Adafruit_SPIDevice::setChipSelect(int value) { + if (_cs != -1) { + digitalWrite(_cs, value); + } +} + +/*! + * @brief Write a buffer or two to the SPI device, with transaction + * management. + * @brief Manually begin a transaction (calls beginTransaction if hardware + * SPI) with asserting the CS pin + */ +void Adafruit_SPIDevice::beginTransactionWithAssertingCS() { + beginTransaction(); + setChipSelect(LOW); +} + +/*! + * @brief Manually end a transaction (calls endTransaction if hardware SPI) + * with deasserting the CS pin + */ +void Adafruit_SPIDevice::endTransactionWithDeassertingCS() { + setChipSelect(HIGH); + endTransaction(); +} + +/*! + * @brief Write a buffer or two to the SPI device, with transaction + * management. + * @param buffer Pointer to buffer of data to write + * @param len Number of bytes from buffer to write + * @param prefix_buffer Pointer to optional array of data to write before + * buffer. + * @param prefix_len Number of bytes from prefix buffer to write + * @return Always returns true because there's no way to test success of SPI + * writes + */ +bool Adafruit_SPIDevice::write(const uint8_t *buffer, size_t len, + const uint8_t *prefix_buffer, + size_t prefix_len) { + beginTransactionWithAssertingCS(); + + // do the writing +#if defined(ARDUINO_ARCH_ESP32) + if (_spi) { + if (prefix_len > 0) { + _spi->transferBytes((uint8_t *)prefix_buffer, nullptr, prefix_len); + } + if (len > 0) { + _spi->transferBytes((uint8_t *)buffer, nullptr, len); + } + } else +#endif + { + for (size_t i = 0; i < prefix_len; i++) { + transfer(prefix_buffer[i]); + } + for (size_t i = 0; i < len; i++) { + transfer(buffer[i]); + } + } + endTransactionWithDeassertingCS(); + +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Wrote: ")); + if ((prefix_len != 0) && (prefix_buffer != nullptr)) { + for (uint16_t i = 0; i < prefix_len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(prefix_buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + } + } + for (uint16_t i = 0; i < len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + if (i % 32 == 31) { + DEBUG_SERIAL.println(); + } + } + DEBUG_SERIAL.println(); +#endif + + return true; +} + +/*! + * @brief Read from SPI into a buffer from the SPI device, with transaction + * management. + * @param buffer Pointer to buffer of data to read into + * @param len Number of bytes from buffer to read. + * @param sendvalue The 8-bits of data to write when doing the data read, + * defaults to 0xFF + * @return Always returns true because there's no way to test success of SPI + * writes + */ +bool Adafruit_SPIDevice::read(uint8_t *buffer, size_t len, uint8_t sendvalue) { + memset(buffer, sendvalue, len); // clear out existing buffer + + beginTransactionWithAssertingCS(); + transfer(buffer, len); + endTransactionWithDeassertingCS(); + +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Read: ")); + for (uint16_t i = 0; i < len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + if (len % 32 == 31) { + DEBUG_SERIAL.println(); + } + } + DEBUG_SERIAL.println(); +#endif + + return true; +} + +/*! + * @brief Write some data, then read some data from SPI into another buffer, + * with transaction management. The buffers can point to same/overlapping + * locations. This does not transmit-receive at the same time! + * @param write_buffer Pointer to buffer of data to write from + * @param write_len Number of bytes from buffer to write. + * @param read_buffer Pointer to buffer of data to read into. + * @param read_len Number of bytes from buffer to read. + * @param sendvalue The 8-bits of data to write when doing the data read, + * defaults to 0xFF + * @return Always returns true because there's no way to test success of SPI + * writes + */ +bool Adafruit_SPIDevice::write_then_read(const uint8_t *write_buffer, + size_t write_len, uint8_t *read_buffer, + size_t read_len, uint8_t sendvalue) { + beginTransactionWithAssertingCS(); + // do the writing +#if defined(ARDUINO_ARCH_ESP32) + if (_spi) { + if (write_len > 0) { + _spi->transferBytes((uint8_t *)write_buffer, nullptr, write_len); + } + } else +#endif + { + for (size_t i = 0; i < write_len; i++) { + transfer(write_buffer[i]); + } + } + +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Wrote: ")); + for (uint16_t i = 0; i < write_len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(write_buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + if (write_len % 32 == 31) { + DEBUG_SERIAL.println(); + } + } + DEBUG_SERIAL.println(); +#endif + + // do the reading + for (size_t i = 0; i < read_len; i++) { + read_buffer[i] = transfer(sendvalue); + } + +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Read: ")); + for (uint16_t i = 0; i < read_len; i++) { + DEBUG_SERIAL.print(F("0x")); + DEBUG_SERIAL.print(read_buffer[i], HEX); + DEBUG_SERIAL.print(F(", ")); + if (read_len % 32 == 31) { + DEBUG_SERIAL.println(); + } + } + DEBUG_SERIAL.println(); +#endif + + endTransactionWithDeassertingCS(); + + return true; +} + +/*! + * @brief Write some data and read some data at the same time from SPI + * into the same buffer, with transaction management. This is basicaly a wrapper + * for transfer() with CS-pin and transaction management. This /does/ + * transmit-receive at the same time! + * @param buffer Pointer to buffer of data to write/read to/from + * @param len Number of bytes from buffer to write/read. + * @return Always returns true because there's no way to test success of SPI + * writes + */ +bool Adafruit_SPIDevice::write_and_read(uint8_t *buffer, size_t len) { + beginTransactionWithAssertingCS(); + transfer(buffer, len); + endTransactionWithDeassertingCS(); + + return true; +} diff --git a/src/library/Adafruit_BusIO/Adafruit_SPIDevice.h b/src/library/Adafruit_BusIO/Adafruit_SPIDevice.h new file mode 100644 index 0000000..74123b9 --- /dev/null +++ b/src/library/Adafruit_BusIO/Adafruit_SPIDevice.h @@ -0,0 +1,142 @@ +#ifndef Adafruit_SPIDevice_h +#define Adafruit_SPIDevice_h + +#include + +#if !defined(SPI_INTERFACES_COUNT) || \ + (defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0)) +// HW SPI available +#include +#define BUSIO_HAS_HW_SPI +#else +// SW SPI ONLY +enum { SPI_MODE0, SPI_MODE1, SPI_MODE2, _SPI_MODE4 }; +typedef uint8_t SPIClass; +#endif + +// some modern SPI definitions don't have BitOrder enum +#if (defined(__AVR__) && !defined(ARDUINO_ARCH_MEGAAVR)) || \ + defined(ESP8266) || defined(TEENSYDUINO) || defined(SPARK) || \ + defined(ARDUINO_ARCH_SPRESENSE) || defined(MEGATINYCORE) || \ + defined(DXCORE) || defined(ARDUINO_AVR_ATmega4809) || \ + defined(ARDUINO_AVR_ATmega4808) || defined(ARDUINO_AVR_ATmega3209) || \ + defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \ + defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \ + defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) || \ + defined(ARDUINO_ARCH_XMC) + +typedef enum _BitOrder { + SPI_BITORDER_MSBFIRST = MSBFIRST, + SPI_BITORDER_LSBFIRST = LSBFIRST, +} BusIOBitOrder; + +#elif defined(ESP32) || defined(__ASR6501__) || defined(__ASR6502__) + +// some modern SPI definitions don't have BitOrder enum and have different SPI +// mode defines +typedef enum _BitOrder { + SPI_BITORDER_MSBFIRST = SPI_MSBFIRST, + SPI_BITORDER_LSBFIRST = SPI_LSBFIRST, +} BusIOBitOrder; + +#else +// Some platforms have a BitOrder enum but its named MSBFIRST/LSBFIRST +#define SPI_BITORDER_MSBFIRST MSBFIRST +#define SPI_BITORDER_LSBFIRST LSBFIRST +typedef BitOrder BusIOBitOrder; +#endif + +#if defined(__IMXRT1062__) // Teensy 4.x +// *Warning* I disabled the usage of FAST_PINIO as the set/clear operations +// used in the cpp file are not atomic and can effect multiple IO pins +// and if an interrupt happens in between the time the code reads the register +// and writes out the updated value, that changes one or more other IO pins +// on that same IO port, those change will be clobbered when the updated +// values are written back. A fast version can be implemented that uses the +// ports set and clear registers which are atomic. +// typedef volatile uint32_t BusIO_PortReg; +// typedef uint32_t BusIO_PortMask; +//#define BUSIO_USE_FAST_PINIO + +#elif defined(ARDUINO_ARCH_XMC) +#undef BUSIO_USE_FAST_PINIO + +#elif defined(__AVR__) || defined(TEENSYDUINO) +typedef volatile uint8_t BusIO_PortReg; +typedef uint8_t BusIO_PortMask; +#define BUSIO_USE_FAST_PINIO + +#elif defined(ESP8266) || defined(ESP32) || defined(__SAM3X8E__) || \ + defined(ARDUINO_ARCH_SAMD) +typedef volatile uint32_t BusIO_PortReg; +typedef uint32_t BusIO_PortMask; +#define BUSIO_USE_FAST_PINIO + +#elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ + !defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040) +typedef volatile uint32_t BusIO_PortReg; +typedef uint32_t BusIO_PortMask; +#if !defined(__ASR6501__) && !defined(__ASR6502__) +#define BUSIO_USE_FAST_PINIO +#endif + +#else +#undef BUSIO_USE_FAST_PINIO +#endif + +/**! The class which defines how we will talk to this device over SPI **/ +class Adafruit_SPIDevice { +public: +#ifdef BUSIO_HAS_HW_SPI + Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000, + BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST, + uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = &SPI); +#else + Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000, + BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST, + uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = nullptr); +#endif + Adafruit_SPIDevice(int8_t cspin, int8_t sck, int8_t miso, int8_t mosi, + uint32_t freq = 1000000, + BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST, + uint8_t dataMode = SPI_MODE0); + ~Adafruit_SPIDevice(); + + bool begin(void); + bool read(uint8_t *buffer, size_t len, uint8_t sendvalue = 0xFF); + bool write(const uint8_t *buffer, size_t len, + const uint8_t *prefix_buffer = nullptr, size_t prefix_len = 0); + bool write_then_read(const uint8_t *write_buffer, size_t write_len, + uint8_t *read_buffer, size_t read_len, + uint8_t sendvalue = 0xFF); + bool write_and_read(uint8_t *buffer, size_t len); + + uint8_t transfer(uint8_t send); + void transfer(uint8_t *buffer, size_t len); + void beginTransaction(void); + void endTransaction(void); + void beginTransactionWithAssertingCS(); + void endTransactionWithDeassertingCS(); + +private: +#ifdef BUSIO_HAS_HW_SPI + SPIClass *_spi = nullptr; + SPISettings *_spiSetting = nullptr; +#else + uint8_t *_spi = nullptr; + uint8_t *_spiSetting = nullptr; +#endif + uint32_t _freq; + BusIOBitOrder _dataOrder; + uint8_t _dataMode; + void setChipSelect(int value); + + int8_t _cs, _sck, _mosi, _miso; +#ifdef BUSIO_USE_FAST_PINIO + BusIO_PortReg *mosiPort, *clkPort, *misoPort, *csPort; + BusIO_PortMask mosiPinMask, misoPinMask, clkPinMask, csPinMask; +#endif + bool _begun; +}; + +#endif // Adafruit_SPIDevice_h diff --git a/src/library/Adafruit_BusIO/CMakeLists.txt b/src/library/Adafruit_BusIO/CMakeLists.txt new file mode 100644 index 0000000..a7ea6e9 --- /dev/null +++ b/src/library/Adafruit_BusIO/CMakeLists.txt @@ -0,0 +1,11 @@ +# Adafruit Bus IO Library +# https://github.com/adafruit/Adafruit_BusIO +# MIT License + +cmake_minimum_required(VERSION 3.5) + +idf_component_register(SRCS "Adafruit_I2CDevice.cpp" "Adafruit_BusIO_Register.cpp" "Adafruit_SPIDevice.cpp" + INCLUDE_DIRS "." + REQUIRES arduino) + +project(Adafruit_BusIO) diff --git a/src/library/Adafruit_BusIO/LICENSE b/src/library/Adafruit_BusIO/LICENSE new file mode 100644 index 0000000..860e3e2 --- /dev/null +++ b/src/library/Adafruit_BusIO/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Adafruit Industries + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/library/Adafruit_BusIO/README.md b/src/library/Adafruit_BusIO/README.md new file mode 100644 index 0000000..1cc06a1 --- /dev/null +++ b/src/library/Adafruit_BusIO/README.md @@ -0,0 +1,8 @@ +# Adafruit Bus IO Library [![Build Status](https://github.com/adafruit/Adafruit_BusIO/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_BusIO/actions) + + +This is a helper library to abstract away I2C & SPI transactions and registers + +Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! + +MIT license, all text above must be included in any redistribution diff --git a/src/library/Adafruit_BusIO/component.mk b/src/library/Adafruit_BusIO/component.mk new file mode 100644 index 0000000..004b18e --- /dev/null +++ b/src/library/Adafruit_BusIO/component.mk @@ -0,0 +1 @@ +COMPONENT_ADD_INCLUDEDIRS = . diff --git a/src/library/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino b/src/library/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino new file mode 100644 index 0000000..b150525 --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino @@ -0,0 +1,21 @@ +#include + +Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(0x10); + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("I2C address detection test"); + + if (!i2c_dev.begin()) { + Serial.print("Did not find device at 0x"); + Serial.println(i2c_dev.address(), HEX); + while (1); + } + Serial.print("Device found on address 0x"); + Serial.println(i2c_dev.address(), HEX); +} + +void loop() { + +} diff --git a/src/library/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino b/src/library/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino new file mode 100644 index 0000000..909cf31 --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino @@ -0,0 +1,41 @@ +#include + +#define I2C_ADDRESS 0x60 +Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS); + + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("I2C device read and write test"); + + if (!i2c_dev.begin()) { + Serial.print("Did not find device at 0x"); + Serial.println(i2c_dev.address(), HEX); + while (1); + } + Serial.print("Device found on address 0x"); + Serial.println(i2c_dev.address(), HEX); + + uint8_t buffer[32]; + // Try to read 32 bytes + i2c_dev.read(buffer, 32); + Serial.print("Read: "); + for (uint8_t i=0; i<32; i++) { + Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + } + Serial.println(); + + // read a register by writing first, then reading + buffer[0] = 0x0C; // we'll reuse the same buffer + i2c_dev.write_then_read(buffer, 1, buffer, 2, false); + Serial.print("Write then Read: "); + for (uint8_t i=0; i<2; i++) { + Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + } + Serial.println(); +} + +void loop() { + +} diff --git a/src/library/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino b/src/library/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino new file mode 100644 index 0000000..41a3043 --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino @@ -0,0 +1,38 @@ +#include +#include + +#define I2C_ADDRESS 0x60 +Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS); + + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("I2C device register test"); + + if (!i2c_dev.begin()) { + Serial.print("Did not find device at 0x"); + Serial.println(i2c_dev.address(), HEX); + while (1); + } + Serial.print("Device found on address 0x"); + Serial.println(i2c_dev.address(), HEX); + + Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(&i2c_dev, 0x0C, 2, LSBFIRST); + uint16_t id; + id_reg.read(&id); + Serial.print("ID register = 0x"); Serial.println(id, HEX); + + Adafruit_BusIO_Register thresh_reg = Adafruit_BusIO_Register(&i2c_dev, 0x01, 2, LSBFIRST); + uint16_t thresh; + thresh_reg.read(&thresh); + Serial.print("Initial threshold register = 0x"); Serial.println(thresh, HEX); + + thresh_reg.write(~thresh); + + Serial.print("Post threshold register = 0x"); Serial.println(thresh_reg.read(), HEX); +} + +void loop() { + +} \ No newline at end of file diff --git a/src/library/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino b/src/library/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino new file mode 100644 index 0000000..992a2e0 --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino @@ -0,0 +1,38 @@ +#include + +// Define which interface to use by setting the unused interface to NULL! + +#define SPIDEVICE_CS 10 +Adafruit_SPIDevice *spi_dev = NULL; // new Adafruit_SPIDevice(SPIDEVICE_CS); + +#define I2C_ADDRESS 0x5D +Adafruit_I2CDevice *i2c_dev = new Adafruit_I2CDevice(I2C_ADDRESS); + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("I2C or SPI device register test"); + + if (spi_dev && !spi_dev->begin()) { + Serial.println("Could not initialize SPI device"); + } + + if (i2c_dev) { + if (i2c_dev->begin()) { + Serial.print("Device found on I2C address 0x"); + Serial.println(i2c_dev->address(), HEX); + } else { + Serial.print("Did not find I2C device at 0x"); + Serial.println(i2c_dev->address(), HEX); + } + } + + Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, 0x0F); + uint8_t id=0; + id_reg.read(&id); + Serial.print("ID register = 0x"); Serial.println(id, HEX); +} + +void loop() { + +} diff --git a/src/library/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino b/src/library/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino new file mode 100644 index 0000000..10168c5 --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino @@ -0,0 +1,29 @@ +#include + +#define SPIDEVICE_CS 10 +Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS, 100000, SPI_BITORDER_MSBFIRST, SPI_MODE1); +//Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS, 13, 12, 11, 100000, SPI_BITORDER_MSBFIRST, SPI_MODE1); + + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("SPI device mode test"); + + if (!spi_dev.begin()) { + Serial.println("Could not initialize SPI device"); + while (1); + } +} + +void loop() { + Serial.println("\n\nTransfer test"); + for (uint16_t x=0; x<=0xFF; x++) { + uint8_t i = x; + Serial.print("0x"); Serial.print(i, HEX); + spi_dev.read(&i, 1, i); + Serial.print("/"); Serial.print(i, HEX); + Serial.print(", "); + delay(25); + } +} \ No newline at end of file diff --git a/src/library/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino b/src/library/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino new file mode 100644 index 0000000..6f2c063 --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino @@ -0,0 +1,39 @@ +#include + +#define SPIDEVICE_CS 10 +Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS); + + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("SPI device read and write test"); + + if (!spi_dev.begin()) { + Serial.println("Could not initialize SPI device"); + while (1); + } + + uint8_t buffer[32]; + + // Try to read 32 bytes + spi_dev.read(buffer, 32); + Serial.print("Read: "); + for (uint8_t i=0; i<32; i++) { + Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + } + Serial.println(); + + // read a register by writing first, then reading + buffer[0] = 0x8F; // we'll reuse the same buffer + spi_dev.write_then_read(buffer, 1, buffer, 2, false); + Serial.print("Write then Read: "); + for (uint8_t i=0; i<2; i++) { + Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + } + Serial.println(); +} + +void loop() { + +} diff --git a/src/library/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino b/src/library/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino new file mode 100644 index 0000000..e70a17b --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino @@ -0,0 +1,192 @@ +/*************************************************** + + This is an example for how to use Adafruit_BusIO_RegisterBits from Adafruit_BusIO library. + + Designed specifically to work with the Adafruit RTD Sensor + ----> https://www.adafruit.com/products/3328 + uisng a MAX31865 RTD-to-Digital Converter + ----> https://datasheets.maximintegrated.com/en/ds/MAX31865.pdf + + This sensor uses SPI to communicate, 4 pins are required to + interface. + A fifth pin helps to detect when a new conversion is ready. + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Example written (2020/3) by Andreas Hardtung/AnHard. + BSD license, all text above must be included in any redistribution + ****************************************************/ + +#include +#include + +#define MAX31865_SPI_SPEED (5000000) +#define MAX31865_SPI_BITORDER (SPI_BITORDER_MSBFIRST) +#define MAX31865_SPI_MODE (SPI_MODE1) + +#define MAX31865_SPI_CS (10) +#define MAX31865_READY_PIN (2) + + +Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( MAX31865_SPI_CS, MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, MAX31865_SPI_MODE, &SPI); // Hardware SPI +// Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( MAX31865_SPI_CS, 13, 12, 11, MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, MAX31865_SPI_MODE); // Software SPI + +// MAX31865 chip related ********************************************************************************************* +Adafruit_BusIO_Register config_reg = Adafruit_BusIO_Register(&spi_dev, 0x00, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST); +Adafruit_BusIO_RegisterBits bias_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 7); +Adafruit_BusIO_RegisterBits auto_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 6); +Adafruit_BusIO_RegisterBits oneS_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 5); +Adafruit_BusIO_RegisterBits wire_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 4); +Adafruit_BusIO_RegisterBits faultT_bits = Adafruit_BusIO_RegisterBits(&config_reg, 2, 2); +Adafruit_BusIO_RegisterBits faultR_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 1); +Adafruit_BusIO_RegisterBits fi50hz_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 0); + +Adafruit_BusIO_Register rRatio_reg = Adafruit_BusIO_Register(&spi_dev, 0x01, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); +Adafruit_BusIO_RegisterBits rRatio_bits = Adafruit_BusIO_RegisterBits(&rRatio_reg, 15, 1); +Adafruit_BusIO_RegisterBits fault_bit = Adafruit_BusIO_RegisterBits(&rRatio_reg, 1, 0); + +Adafruit_BusIO_Register maxRratio_reg = Adafruit_BusIO_Register(&spi_dev, 0x03, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); +Adafruit_BusIO_RegisterBits maxRratio_bits = Adafruit_BusIO_RegisterBits(&maxRratio_reg, 15, 1); + +Adafruit_BusIO_Register minRratio_reg = Adafruit_BusIO_Register(&spi_dev, 0x05, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); +Adafruit_BusIO_RegisterBits minRratio_bits = Adafruit_BusIO_RegisterBits(&minRratio_reg, 15, 1); + +Adafruit_BusIO_Register fault_reg = Adafruit_BusIO_Register(&spi_dev, 0x07, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST); +Adafruit_BusIO_RegisterBits range_high_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 7); +Adafruit_BusIO_RegisterBits range_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 6); +Adafruit_BusIO_RegisterBits refin_high_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 5); +Adafruit_BusIO_RegisterBits refin_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 4); +Adafruit_BusIO_RegisterBits rtdin_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 3); +Adafruit_BusIO_RegisterBits voltage_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 2); + +// Print the details of the configuration register. +void printConfig( void ) { + Serial.print("BIAS: "); if (bias_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); + Serial.print(", AUTO: "); if (auto_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); + Serial.print(", ONES: "); if (oneS_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); + Serial.print(", WIRE: "); if (wire_bit.read() ) Serial.print("3"); else Serial.print("2/4"); + Serial.print(", FAULTCLEAR: "); if (faultR_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); + Serial.print(", "); if (fi50hz_bit.read() ) Serial.print("50HZ"); else Serial.print("60HZ"); + Serial.println(); +} + +// Check and print faults. Then clear them. +void checkFaults( void ) { + if (fault_bit.read()) { + Serial.print("MAX: "); Serial.println(maxRratio_bits.read()); + Serial.print("VAL: "); Serial.println( rRatio_bits.read()); + Serial.print("MIN: "); Serial.println(minRratio_bits.read()); + + if (range_high_fault_bit.read() ) Serial.println("Range high fault"); + if ( range_low_fault_bit.read() ) Serial.println("Range low fault"); + if (refin_high_fault_bit.read() ) Serial.println("REFIN high fault"); + if ( refin_low_fault_bit.read() ) Serial.println("REFIN low fault"); + if ( rtdin_low_fault_bit.read() ) Serial.println("RTDIN low fault"); + if ( voltage_fault_bit.read() ) Serial.println("Voltage fault"); + + faultR_bit.write(1); // clear fault + } +} + +void setup() { + #if (MAX31865_1_READY_PIN != -1) + pinMode(MAX31865_READY_PIN ,INPUT_PULLUP); + #endif + + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("SPI Adafruit_BusIO_RegisterBits test on MAX31865"); + + if (!spi_dev.begin()) { + Serial.println("Could not initialize SPI device"); + while (1); + } + + // Set up for automode 50Hz. We don't care about selfheating. We want the highest possible sampling rate. + auto_bit.write(0); // Don't switch filtermode while auto_mode is on. + fi50hz_bit.write(1); // Set filter to 50Hz mode. + faultR_bit.write(1); // Clear faults. + bias_bit.write(1); // In automode we want to have the bias current always on. + delay(5); // Wait until bias current settles down. + // 10.5 time constants of the input RC network is required. + // 10ms worst case for 10kω reference resistor and a 0.1µF capacitor across the RTD inputs. + // Adafruit Module has 0.1µF and only 430/4300ω So here 0.43/4.3ms + auto_bit.write(1); // Now we can set automode. Automatically starting first conversion. + + // Test the READY_PIN + #if (defined( MAX31865_READY_PIN ) && (MAX31865_READY_PIN != -1)) + int i = 0; + while (digitalRead(MAX31865_READY_PIN) && i++ <= 100) { delay(1); } + if (i >= 100) { + Serial.print("ERROR: Max31865 Pin detection does not work. PIN:"); + Serial.println(MAX31865_READY_PIN); + } + #else + delay(100); + #endif + + // Set ratio range. + // Setting the temperatures would need some more calculation - not related to Adafruit_BusIO_RegisterBits. + uint16_t ratio = rRatio_bits.read(); + maxRratio_bits.write( (ratio < 0x8fffu-1000u) ? ratio + 1000u : 0x8fffu ); + minRratio_bits.write( (ratio > 1000u) ? ratio - 1000u : 0u ); + + printConfig(); + checkFaults(); +} + +void loop() { + #if (defined( MAX31865_READY_PIN ) && (MAX31865_1_READY_PIN != -1)) + // Is conversion ready? + if (!digitalRead(MAX31865_READY_PIN)) + #else + // Warant conversion is ready. + delay(21); // 21ms for 50Hz-mode. 19ms in 60Hz-mode. + #endif + { + // Read ratio, calculate temperature, scale, filter and print. + Serial.println( rRatio2C( rRatio_bits.read() ) * 100.0f, 0); // Temperature scaled by 100 + // Check, print, clear faults. + checkFaults(); + } + + // Do something else. + //delay(15000); +} + + +// Module/Sensor related. Here Adafruit PT100 module with a 2_Wire PT100 Class C ***************************** +float rRatio2C(uint16_t ratio) { + // A simple linear conversion. + const float R0 = 100.0f; + const float Rref = 430.0f; + const float alphaPT = 0.003850f; + const float ADCmax = (1u << 15) - 1.0f; + const float rscale = Rref / ADCmax; + // Measured temperature in boiling water 101.08°C with factor a = 1 and b = 0. Rref and MAX at about 22±2°C. + // Measured temperature in ice/water bath 0.76°C with factor a = 1 and b = 0. Rref and MAX at about 22±2°C. + //const float a = 1.0f / (alphaPT * R0); + const float a = (100.0f/101.08f) / (alphaPT * R0); + //const float b = 0.0f; // 101.08 + const float b = -0.76f; // 100.32 > 101.08 + + return filterRing( ((ratio * rscale) - R0) * a + b ); +} + +// General purpose ********************************************************************************************* +#define RINGLENGTH 250 +float filterRing( float newVal ) { + static float ring[RINGLENGTH] = { 0.0 }; + static uint8_t ringIndex = 0; + static bool ringFull = false; + + if ( ringIndex == RINGLENGTH ) { ringFull = true; ringIndex = 0; } + ring[ringIndex] = newVal; + uint8_t loopEnd = (ringFull) ? RINGLENGTH : ringIndex + 1; + float ringSum = 0.0f; + for (uint8_t i = 0; i < loopEnd; i++) ringSum += ring[i]; + ringIndex++; + return ringSum / loopEnd; +} diff --git a/src/library/Adafruit_BusIO/examples/spi_registers/spi_registers.ino b/src/library/Adafruit_BusIO/examples/spi_registers/spi_registers.ino new file mode 100644 index 0000000..091a353 --- /dev/null +++ b/src/library/Adafruit_BusIO/examples/spi_registers/spi_registers.ino @@ -0,0 +1,34 @@ +#include +#include + +#define SPIDEVICE_CS 10 +Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS); + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("SPI device register test"); + + if (!spi_dev.begin()) { + Serial.println("Could not initialize SPI device"); + while (1); + } + + Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(&spi_dev, 0x0F, ADDRBIT8_HIGH_TOREAD); + uint8_t id = 0; + id_reg.read(&id); + Serial.print("ID register = 0x"); Serial.println(id, HEX); + + Adafruit_BusIO_Register thresh_reg = Adafruit_BusIO_Register(&spi_dev, 0x0C, ADDRBIT8_HIGH_TOREAD, 2, LSBFIRST); + uint16_t thresh = 0; + thresh_reg.read(&thresh); + Serial.print("Initial threshold register = 0x"); Serial.println(thresh, HEX); + + thresh_reg.write(~thresh); + + Serial.print("Post threshold register = 0x"); Serial.println(thresh_reg.read(), HEX); +} + +void loop() { + +} diff --git a/src/library/Adafruit_BusIO/library.properties b/src/library/Adafruit_BusIO/library.properties new file mode 100644 index 0000000..ba652bb --- /dev/null +++ b/src/library/Adafruit_BusIO/library.properties @@ -0,0 +1,9 @@ +name=Adafruit BusIO +version=1.14.5 +author=Adafruit +maintainer=Adafruit +sentence=This is a library for abstracting away I2C and SPI interfacing +paragraph=This is a library for abstracting away I2C and SPI interfacing +category=Signal Input/Output +url=https://github.com/adafruit/Adafruit_BusIO +architectures=* diff --git a/src/library/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md b/src/library/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..f0e2614 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,46 @@ +Thank you for opening an issue on an Adafruit Arduino library repository. To +improve the speed of resolution please review the following guidelines and +common troubleshooting steps below before creating the issue: + +- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use + the forums at http://forums.adafruit.com to ask questions and troubleshoot why + something isn't working as expected. In many cases the problem is a common issue + that you will more quickly receive help from the forum community. GitHub issues + are meant for known defects in the code. If you don't know if there is a defect + in the code then start with troubleshooting on the forum first. + +- **If following a tutorial or guide be sure you didn't miss a step.** Carefully + check all of the steps and commands to run have been followed. Consult the + forum if you're unsure or have questions about steps in a guide/tutorial. + +- **For Arduino projects check these very common issues to ensure they don't apply**: + + - For uploading sketches or communicating with the board make sure you're using + a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes + very hard to tell the difference between a data and charge cable! Try using the + cable with other devices or swapping to another cable to confirm it is not + the problem. + + - **Be sure you are supplying adequate power to the board.** Check the specs of + your board and plug in an external power supply. In many cases just + plugging a board into your computer is not enough to power it and other + peripherals. + + - **Double check all soldering joints and connections.** Flakey connections + cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. + + - **Ensure you are using an official Arduino or Adafruit board.** We can't + guarantee a clone board will have the same functionality and work as expected + with this code and don't support them. + +If you're sure this issue is a defect in the code and checked the steps above +please fill in the following fields to provide enough troubleshooting information. +You may delete the guideline and text above to just leave the following details: + +- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** + +- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO + VERSION HERE** + +- List the steps to reproduce the problem below (if possible attach a sketch or + copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/src/library/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md b/src/library/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7b641eb --- /dev/null +++ b/src/library/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +Thank you for creating a pull request to contribute to Adafruit's GitHub code! +Before you open the request please review the following guidelines and tips to +help it be more easily integrated: + +- **Describe the scope of your change--i.e. what the change does and what parts + of the code were modified.** This will help us understand any risks of integrating + the code. + +- **Describe any known limitations with your change.** For example if the change + doesn't apply to a supported platform of the library please mention it. + +- **Please run any tests or examples that can exercise your modified code.** We + strive to not break users of the code and running tests/examples helps with this + process. + +Thank you again for contributing! We will try to test and integrate the change +as soon as we can, but be aware we have many GitHub repositories to manage and +can't immediately respond to every request. There is no need to bump or check in +on a pull request (it will clutter the discussion of the request). + +Also don't be worried if the request is closed or not integrated--sometimes the +priorities of Adafruit's GitHub code (education, ease of use) might not match the +priorities of the pull request. Don't fret, the open source community thrives on +forks and GitHub makes it easy to keep your changes in a forked repo. + +After reviewing the guidelines above you can delete this text from the pull request. diff --git a/src/library/Adafruit_NeoPixel/.github/workflows/githubci.yml b/src/library/Adafruit_NeoPixel/.github/workflows/githubci.yml new file mode 100644 index 0000000..3cc6520 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/.github/workflows/githubci.yml @@ -0,0 +1,29 @@ +name: Arduino Library CI + +on: [pull_request, push, repository_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/setup-python@v4 + with: + python-version: '3.x' + - uses: actions/checkout@v3 + - uses: actions/checkout@v3 + with: + repository: adafruit/ci-arduino + path: ci + + - name: pre-install + run: bash ci/actions_install.sh + + - name: test platforms + run: python3 ci/build_platform.py main_platforms + + - name: doxygen + env: + GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} + PRETTYNAME : "Adafruit NeoPixel Library" + run: bash ci/doxy_gen_and_deploy.sh diff --git a/src/library/Adafruit_NeoPixel/.gitignore b/src/library/Adafruit_NeoPixel/.gitignore new file mode 100644 index 0000000..c2a26c0 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/.gitignore @@ -0,0 +1,4 @@ +# Our handy .gitignore for automation ease +Doxyfile* +doxygen_sqlite3.db +html diff --git a/src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp b/src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp new file mode 100644 index 0000000..12e4761 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp @@ -0,0 +1,3474 @@ +/*! + * @file Adafruit_NeoPixel.cpp + * + * @mainpage Arduino Library for driving Adafruit NeoPixel addressable LEDs, + * FLORA RGB Smart Pixels and compatible devicess -- WS2811, WS2812, WS2812B, + * SK6812, etc. + * + * @section intro_sec Introduction + * + * This is the documentation for Adafruit's NeoPixel library for the + * Arduino platform, allowing a broad range of microcontroller boards + * (most AVR boards, many ARM devices, ESP8266 and ESP32, among others) + * to control Adafruit NeoPixels, FLORA RGB Smart Pixels and compatible + * devices -- WS2811, WS2812, WS2812B, SK6812, etc. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing products + * from Adafruit! + * + * @section author Author + * + * Written by Phil "Paint Your Dragon" Burgess for Adafruit Industries, + * with contributions by PJRC, Michael Miller and other members of the + * open source community. + * + * @section license License + * + * This file is part of the Adafruit_NeoPixel library. + * + * Adafruit_NeoPixel is free software: you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Adafruit_NeoPixel is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with NeoPixel. If not, see + * . + * + */ + +#include "Adafruit_NeoPixel.h" + +#if defined(TARGET_LPC1768) +#include +#endif + +#if defined(NRF52) || defined(NRF52_SERIES) +#include "nrf.h" + +// Interrupt is only disabled if there is no PWM device available +// Note: Adafruit Bluefruit nrf52 does not use this option +//#define NRF52_DISABLE_INT +#endif + +#if defined(ARDUINO_ARCH_NRF52840) +#if defined __has_include +#if __has_include() +#include +#endif +#endif +#endif + +/*! + @brief NeoPixel constructor when length, pin and pixel type are known + at compile-time. + @param n Number of NeoPixels in strand. + @param p Arduino pin number which will drive the NeoPixel data in. + @param t Pixel type -- add together NEO_* constants defined in + Adafruit_NeoPixel.h, for example NEO_GRB+NEO_KHZ800 for + NeoPixels expecting an 800 KHz (vs 400 KHz) data stream + with color bytes expressed in green, red, blue order per + pixel. + @return Adafruit_NeoPixel object. Call the begin() function before use. +*/ +Adafruit_NeoPixel::Adafruit_NeoPixel(uint16_t n, int16_t p, neoPixelType t) + : begun(false), brightness(0), pixels(NULL), endTime(0) { + updateType(t); + updateLength(n); + setPin(p); +#if defined(ARDUINO_ARCH_RP2040) + // Find a free SM on one of the PIO's + sm = pio_claim_unused_sm(pio, false); // don't panic + // Try pio1 if SM not found + if (sm < 0) { + pio = pio1; + sm = pio_claim_unused_sm(pio, true); // panic if no SM is free + } + init = true; +#endif +} + +/*! + @brief "Empty" NeoPixel constructor when length, pin and/or pixel type + are not known at compile-time, and must be initialized later with + updateType(), updateLength() and setPin(). + @return Adafruit_NeoPixel object. Call the begin() function before use. + @note This function is deprecated, here only for old projects that + may still be calling it. New projects should instead use the + 'new' keyword with the first constructor syntax (length, pin, + type). +*/ +Adafruit_NeoPixel::Adafruit_NeoPixel() + : +#if defined(NEO_KHZ400) + is800KHz(true), +#endif + begun(false), numLEDs(0), numBytes(0), pin(-1), brightness(0), + pixels(NULL), rOffset(1), gOffset(0), bOffset(2), wOffset(1), endTime(0) { +} + +/*! + @brief Deallocate Adafruit_NeoPixel object, set data pin back to INPUT. +*/ +Adafruit_NeoPixel::~Adafruit_NeoPixel() { + free(pixels); + if (pin >= 0) + pinMode(pin, INPUT); +} + +/*! + @brief Configure NeoPixel pin for output. +*/ +void Adafruit_NeoPixel::begin(void) { + if (pin >= 0) { + pinMode(pin, OUTPUT); + digitalWrite(pin, LOW); + } + begun = true; +} + +/*! + @brief Change the length of a previously-declared Adafruit_NeoPixel + strip object. Old data is deallocated and new data is cleared. + Pin number and pixel format are unchanged. + @param n New length of strip, in pixels. + @note This function is deprecated, here only for old projects that + may still be calling it. New projects should instead use the + 'new' keyword with the first constructor syntax (length, pin, + type). +*/ +void Adafruit_NeoPixel::updateLength(uint16_t n) { + free(pixels); // Free existing data (if any) + + // Allocate new data -- note: ALL PIXELS ARE CLEARED + numBytes = n * ((wOffset == rOffset) ? 3 : 4); + if ((pixels = (uint8_t *)malloc(numBytes))) { + memset(pixels, 0, numBytes); + numLEDs = n; + } else { + numLEDs = numBytes = 0; + } +} + +/*! + @brief Change the pixel format of a previously-declared + Adafruit_NeoPixel strip object. If format changes from one of + the RGB variants to an RGBW variant (or RGBW to RGB), the old + data will be deallocated and new data is cleared. Otherwise, + the old data will remain in RAM and is not reordered to the + new format, so it's advisable to follow up with clear(). + @param t Pixel type -- add together NEO_* constants defined in + Adafruit_NeoPixel.h, for example NEO_GRB+NEO_KHZ800 for + NeoPixels expecting an 800 KHz (vs 400 KHz) data stream + with color bytes expressed in green, red, blue order per + pixel. + @note This function is deprecated, here only for old projects that + may still be calling it. New projects should instead use the + 'new' keyword with the first constructor syntax + (length, pin, type). +*/ +void Adafruit_NeoPixel::updateType(neoPixelType t) { + bool oldThreeBytesPerPixel = (wOffset == rOffset); // false if RGBW + + wOffset = (t >> 6) & 0b11; // See notes in header file + rOffset = (t >> 4) & 0b11; // regarding R/G/B/W offsets + gOffset = (t >> 2) & 0b11; + bOffset = t & 0b11; +#if defined(NEO_KHZ400) + is800KHz = (t < 256); // 400 KHz flag is 1<<8 +#endif + + // If bytes-per-pixel has changed (and pixel data was previously + // allocated), re-allocate to new size. Will clear any data. + if (pixels) { + bool newThreeBytesPerPixel = (wOffset == rOffset); + if (newThreeBytesPerPixel != oldThreeBytesPerPixel) + updateLength(numLEDs); + } +} + +// RP2040 specific driver +#if defined(ARDUINO_ARCH_RP2040) +void Adafruit_NeoPixel::rp2040Init(uint8_t pin, bool is800KHz) +{ + uint offset = pio_add_program(pio, &ws2812_program); + + if (is800KHz) + { + // 800kHz, 8 bit transfers + ws2812_program_init(pio, sm, offset, pin, 800000, 8); + } + else + { + // 400kHz, 8 bit transfers + ws2812_program_init(pio, sm, offset, pin, 400000, 8); + } +} +// Not a user API +void Adafruit_NeoPixel::rp2040Show(uint8_t pin, uint8_t *pixels, uint32_t numBytes, bool is800KHz) +{ + if (this->init) + { + // On first pass through initialise the PIO + rp2040Init(pin, is800KHz); + this->init = false; + } + + while(numBytes--) + // Bits for transmission must be shifted to top 8 bits + pio_sm_put_blocking(pio, sm, ((uint32_t)*pixels++)<< 24); +} + +#endif + +#if defined(ESP8266) +// ESP8266 show() is external to enforce ICACHE_RAM_ATTR execution +extern "C" IRAM_ATTR void espShow(uint16_t pin, uint8_t *pixels, + uint32_t numBytes, uint8_t type); +#elif defined(ESP32) +extern "C" void espShow(uint16_t pin, uint8_t *pixels, uint32_t numBytes, + uint8_t type); +#endif // ESP8266 + +#if defined(K210) +#define KENDRYTE_K210 1 +#endif + +#if defined(KENDRYTE_K210) +extern "C" void k210Show(uint8_t pin, uint8_t *pixels, uint32_t numBytes, + boolean is800KHz); +#endif // KENDRYTE_K210 +/*! + @brief Transmit pixel data in RAM to NeoPixels. + @note On most architectures, interrupts are temporarily disabled in + order to achieve the correct NeoPixel signal timing. This means + that the Arduino millis() and micros() functions, which require + interrupts, will lose small intervals of time whenever this + function is called (about 30 microseconds per RGB pixel, 40 for + RGBW pixels). There's no easy fix for this, but a few + specialized alternative or companion libraries exist that use + very device-specific peripherals to work around it. +*/ +void Adafruit_NeoPixel::show(void) { + + if (!pixels) + return; + + // Data latch = 300+ microsecond pause in the output stream. Rather than + // put a delay at the end of the function, the ending time is noted and + // the function will simply hold off (if needed) on issuing the + // subsequent round of data until the latch time has elapsed. This + // allows the mainline code to start generating the next frame of data + // rather than stalling for the latch. + while (!canShow()) + ; + // endTime is a private member (rather than global var) so that multiple + // instances on different pins can be quickly issued in succession (each + // instance doesn't delay the next). + + // In order to make this code runtime-configurable to work with any pin, + // SBI/CBI instructions are eschewed in favor of full PORT writes via the + // OUT or ST instructions. It relies on two facts: that peripheral + // functions (such as PWM) take precedence on output pins, so our PORT- + // wide writes won't interfere, and that interrupts are globally disabled + // while data is being issued to the LEDs, so no other code will be + // accessing the PORT. The code takes an initial 'snapshot' of the PORT + // state, computes 'pin high' and 'pin low' values, and writes these back + // to the PORT register as needed. + + // NRF52 may use PWM + DMA (if available), may not need to disable interrupt + // ESP32 may not disable interrupts because espShow() uses RMT which tries to acquire locks +#if !(defined(NRF52) || defined(NRF52_SERIES) || defined(ESP32)) + noInterrupts(); // Need 100% focus on instruction timing +#endif + +#if defined(__AVR__) + // AVR MCUs -- ATmega & ATtiny (no XMEGA) --------------------------------- + + volatile uint16_t i = numBytes; // Loop counter + volatile uint8_t *ptr = pixels, // Pointer to next byte + b = *ptr++, // Current byte value + hi, // PORT w/output bit set high + lo; // PORT w/output bit set low + + // Hand-tuned assembly code issues data to the LED drivers at a specific + // rate. There's separate code for different CPU speeds (8, 12, 16 MHz) + // for both the WS2811 (400 KHz) and WS2812 (800 KHz) drivers. The + // datastream timing for the LED drivers allows a little wiggle room each + // way (listed in the datasheets), so the conditions for compiling each + // case are set up for a range of frequencies rather than just the exact + // 8, 12 or 16 MHz values, permitting use with some close-but-not-spot-on + // devices (e.g. 16.5 MHz DigiSpark). The ranges were arrived at based + // on the datasheet figures and have not been extensively tested outside + // the canonical 8/12/16 MHz speeds; there's no guarantee these will work + // close to the extremes (or possibly they could be pushed further). + // Keep in mind only one CPU speed case actually gets compiled; the + // resulting program isn't as massive as it might look from source here. + +// 8 MHz(ish) AVR --------------------------------------------------------- +#if (F_CPU >= 7400000UL) && (F_CPU <= 9500000UL) + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + + volatile uint8_t n1, n2 = 0; // First, next bits out + + // Squeezing an 800 KHz stream out of an 8 MHz chip requires code + // specific to each PORT register. + + // 10 instruction clocks per bit: HHxxxxxLLL + // OUT instructions: ^ ^ ^ (T=0,2,7) + + // PORTD OUTPUT ---------------------------------------------------- + +#if defined(PORTD) +#if defined(PORTB) || defined(PORTC) || defined(PORTF) + if (port == &PORTD) { +#endif // defined(PORTB/C/F) + + hi = PORTD | pinMask; + lo = PORTD & ~pinMask; + n1 = lo; + if (b & 0x80) + n1 = hi; + + // Dirty trick: RJMPs proceeding to the next instruction are used + // to delay two clock cycles in one instruction word (rather than + // using two NOPs). This was necessary in order to squeeze the + // loop down to exactly 64 words -- the maximum possible for a + // relative branch. + + asm volatile( + "headD:" + "\n\t" // Clk Pseudocode + // Bit 7: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n2] , %[lo]" + "\n\t" // 1 n2 = lo + "out %[port] , %[n1]" + "\n\t" // 1 PORT = n1 + "rjmp .+0" + "\n\t" // 2 nop nop + "sbrc %[byte] , 6" + "\n\t" // 1-2 if(b & 0x40) + "mov %[n2] , %[hi]" + "\n\t" // 0-1 n2 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "rjmp .+0" + "\n\t" // 2 nop nop + // Bit 6: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n1] , %[lo]" + "\n\t" // 1 n1 = lo + "out %[port] , %[n2]" + "\n\t" // 1 PORT = n2 + "rjmp .+0" + "\n\t" // 2 nop nop + "sbrc %[byte] , 5" + "\n\t" // 1-2 if(b & 0x20) + "mov %[n1] , %[hi]" + "\n\t" // 0-1 n1 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "rjmp .+0" + "\n\t" // 2 nop nop + // Bit 5: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n2] , %[lo]" + "\n\t" // 1 n2 = lo + "out %[port] , %[n1]" + "\n\t" // 1 PORT = n1 + "rjmp .+0" + "\n\t" // 2 nop nop + "sbrc %[byte] , 4" + "\n\t" // 1-2 if(b & 0x10) + "mov %[n2] , %[hi]" + "\n\t" // 0-1 n2 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "rjmp .+0" + "\n\t" // 2 nop nop + // Bit 4: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n1] , %[lo]" + "\n\t" // 1 n1 = lo + "out %[port] , %[n2]" + "\n\t" // 1 PORT = n2 + "rjmp .+0" + "\n\t" // 2 nop nop + "sbrc %[byte] , 3" + "\n\t" // 1-2 if(b & 0x08) + "mov %[n1] , %[hi]" + "\n\t" // 0-1 n1 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "rjmp .+0" + "\n\t" // 2 nop nop + // Bit 3: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n2] , %[lo]" + "\n\t" // 1 n2 = lo + "out %[port] , %[n1]" + "\n\t" // 1 PORT = n1 + "rjmp .+0" + "\n\t" // 2 nop nop + "sbrc %[byte] , 2" + "\n\t" // 1-2 if(b & 0x04) + "mov %[n2] , %[hi]" + "\n\t" // 0-1 n2 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "rjmp .+0" + "\n\t" // 2 nop nop + // Bit 2: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n1] , %[lo]" + "\n\t" // 1 n1 = lo + "out %[port] , %[n2]" + "\n\t" // 1 PORT = n2 + "rjmp .+0" + "\n\t" // 2 nop nop + "sbrc %[byte] , 1" + "\n\t" // 1-2 if(b & 0x02) + "mov %[n1] , %[hi]" + "\n\t" // 0-1 n1 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "rjmp .+0" + "\n\t" // 2 nop nop + // Bit 1: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n2] , %[lo]" + "\n\t" // 1 n2 = lo + "out %[port] , %[n1]" + "\n\t" // 1 PORT = n1 + "rjmp .+0" + "\n\t" // 2 nop nop + "sbrc %[byte] , 0" + "\n\t" // 1-2 if(b & 0x01) + "mov %[n2] , %[hi]" + "\n\t" // 0-1 n2 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "sbiw %[count], 1" + "\n\t" // 2 i-- (don't act on Z flag yet) + // Bit 0: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi + "mov %[n1] , %[lo]" + "\n\t" // 1 n1 = lo + "out %[port] , %[n2]" + "\n\t" // 1 PORT = n2 + "ld %[byte] , %a[ptr]+" + "\n\t" // 2 b = *ptr++ + "sbrc %[byte] , 7" + "\n\t" // 1-2 if(b & 0x80) + "mov %[n1] , %[hi]" + "\n\t" // 0-1 n1 = hi + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo + "brne headD" + "\n" // 2 while(i) (Z flag set above) + : [byte] "+r"(b), [n1] "+r"(n1), [n2] "+r"(n2), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTD)), [ptr] "e"(ptr), [hi] "r"(hi), + [lo] "r"(lo)); + +#if defined(PORTB) || defined(PORTC) || defined(PORTF) + } else // other PORT(s) +#endif // defined(PORTB/C/F) +#endif // defined(PORTD) + + // PORTB OUTPUT ---------------------------------------------------- + +#if defined(PORTB) +#if defined(PORTD) || defined(PORTC) || defined(PORTF) + if (port == &PORTB) { +#endif // defined(PORTD/C/F) + + // Same as above, just switched to PORTB and stripped of comments. + hi = PORTB | pinMask; + lo = PORTB & ~pinMask; + n1 = lo; + if (b & 0x80) + n1 = hi; + + asm volatile( + "headB:" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 6" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 5" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 4" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 3" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 2" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 1" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 0" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "sbiw %[count], 1" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "ld %[byte] , %a[ptr]+" + "\n\t" + "sbrc %[byte] , 7" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "brne headB" + "\n" + : [byte] "+r"(b), [n1] "+r"(n1), [n2] "+r"(n2), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTB)), [ptr] "e"(ptr), [hi] "r"(hi), + [lo] "r"(lo)); + +#if defined(PORTD) || defined(PORTC) || defined(PORTF) + } +#endif +#if defined(PORTC) || defined(PORTF) + else +#endif // defined(PORTC/F) +#endif // defined(PORTB) + + // PORTC OUTPUT ---------------------------------------------------- + +#if defined(PORTC) +#if defined(PORTD) || defined(PORTB) || defined(PORTF) + if (port == &PORTC) { +#endif // defined(PORTD/B/F) + + // Same as above, just switched to PORTC and stripped of comments. + hi = PORTC | pinMask; + lo = PORTC & ~pinMask; + n1 = lo; + if (b & 0x80) + n1 = hi; + + asm volatile( + "headC:" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 6" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 5" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 4" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 3" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 2" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 1" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 0" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "sbiw %[count], 1" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "ld %[byte] , %a[ptr]+" + "\n\t" + "sbrc %[byte] , 7" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "brne headC" + "\n" + : [byte] "+r"(b), [n1] "+r"(n1), [n2] "+r"(n2), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTC)), [ptr] "e"(ptr), [hi] "r"(hi), + [lo] "r"(lo)); + +#if defined(PORTD) || defined(PORTB) || defined(PORTF) + } +#endif // defined(PORTD/B/F) +#if defined(PORTF) + else +#endif +#endif // defined(PORTC) + + // PORTF OUTPUT ---------------------------------------------------- + +#if defined(PORTF) +#if defined(PORTD) || defined(PORTB) || defined(PORTC) + if (port == &PORTF) { +#endif // defined(PORTD/B/C) + + hi = PORTF | pinMask; + lo = PORTF & ~pinMask; + n1 = lo; + if (b & 0x80) + n1 = hi; + + asm volatile( + "headF:" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 6" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 5" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 4" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 3" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 2" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 1" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "rjmp .+0" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n2] , %[lo]" + "\n\t" + "out %[port] , %[n1]" + "\n\t" + "rjmp .+0" + "\n\t" + "sbrc %[byte] , 0" + "\n\t" + "mov %[n2] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "sbiw %[count], 1" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "mov %[n1] , %[lo]" + "\n\t" + "out %[port] , %[n2]" + "\n\t" + "ld %[byte] , %a[ptr]+" + "\n\t" + "sbrc %[byte] , 7" + "\n\t" + "mov %[n1] , %[hi]" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "brne headF" + "\n" + : [byte] "+r"(b), [n1] "+r"(n1), [n2] "+r"(n2), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTF)), [ptr] "e"(ptr), [hi] "r"(hi), + [lo] "r"(lo)); + +#if defined(PORTD) || defined(PORTB) || defined(PORTC) + } +#endif // defined(PORTD/B/C) +#endif // defined(PORTF) + +#if defined(NEO_KHZ400) + } else { // end 800 KHz, do 400 KHz + + // Timing is more relaxed; unrolling the inner loop for each bit is + // not necessary. Still using the peculiar RJMPs as 2X NOPs, not out + // of need but just to trim the code size down a little. + // This 400-KHz-datastream-on-8-MHz-CPU code is not quite identical + // to the 800-on-16 code later -- the hi/lo timing between WS2811 and + // WS2812 is not simply a 2:1 scale! + + // 20 inst. clocks per bit: HHHHxxxxxxLLLLLLLLLL + // ST instructions: ^ ^ ^ (T=0,4,10) + + volatile uint8_t next, bit; + + hi = *port | pinMask; + lo = *port & ~pinMask; + next = lo; + bit = 8; + + asm volatile("head20:" + "\n\t" // Clk Pseudocode (T = 0) + "st %a[port], %[hi]" + "\n\t" // 2 PORT = hi (T = 2) + "sbrc %[byte] , 7" + "\n\t" // 1-2 if(b & 128) + "mov %[next], %[hi]" + "\n\t" // 0-1 next = hi (T = 4) + "st %a[port], %[next]" + "\n\t" // 2 PORT = next (T = 6) + "mov %[next] , %[lo]" + "\n\t" // 1 next = lo (T = 7) + "dec %[bit]" + "\n\t" // 1 bit-- (T = 8) + "breq nextbyte20" + "\n\t" // 1-2 if(bit == 0) + "rol %[byte]" + "\n\t" // 1 b <<= 1 (T = 10) + "st %a[port], %[lo]" + "\n\t" // 2 PORT = lo (T = 12) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 14) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 16) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 18) + "rjmp head20" + "\n\t" // 2 -> head20 (next bit out) + "nextbyte20:" + "\n\t" // (T = 10) + "st %a[port], %[lo]" + "\n\t" // 2 PORT = lo (T = 12) + "nop" + "\n\t" // 1 nop (T = 13) + "ldi %[bit] , 8" + "\n\t" // 1 bit = 8 (T = 14) + "ld %[byte] , %a[ptr]+" + "\n\t" // 2 b = *ptr++ (T = 16) + "sbiw %[count], 1" + "\n\t" // 2 i-- (T = 18) + "brne head20" + "\n" // 2 if(i != 0) -> (next byte) + : [port] "+e"(port), [byte] "+r"(b), [bit] "+r"(bit), + [next] "+r"(next), [count] "+w"(i) + : [hi] "r"(hi), [lo] "r"(lo), [ptr] "e"(ptr)); + } +#endif // NEO_KHZ400 + +// 12 MHz(ish) AVR -------------------------------------------------------- +#elif (F_CPU >= 11100000UL) && (F_CPU <= 14300000UL) + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + + // In the 12 MHz case, an optimized 800 KHz datastream (no dead time + // between bytes) requires a PORT-specific loop similar to the 8 MHz + // code (but a little more relaxed in this case). + + // 15 instruction clocks per bit: HHHHxxxxxxLLLLL + // OUT instructions: ^ ^ ^ (T=0,4,10) + + volatile uint8_t next; + + // PORTD OUTPUT ---------------------------------------------------- + +#if defined(PORTD) +#if defined(PORTB) || defined(PORTC) || defined(PORTF) + if (port == &PORTD) { +#endif // defined(PORTB/C/F) + + hi = PORTD | pinMask; + lo = PORTD & ~pinMask; + next = lo; + if (b & 0x80) + next = hi; + + // Don't "optimize" the OUT calls into the bitTime subroutine; + // we're exploiting the RCALL and RET as 3- and 4-cycle NOPs! + asm volatile("headD:" + "\n\t" // (T = 0) + "out %[port], %[hi]" + "\n\t" // (T = 1) + "rcall bitTimeD" + "\n\t" // Bit 7 (T = 15) + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeD" + "\n\t" // Bit 6 + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeD" + "\n\t" // Bit 5 + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeD" + "\n\t" // Bit 4 + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeD" + "\n\t" // Bit 3 + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeD" + "\n\t" // Bit 2 + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeD" + "\n\t" // Bit 1 + // Bit 0: + "out %[port] , %[hi]" + "\n\t" // 1 PORT = hi (T = 1) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 3) + "ld %[byte] , %a[ptr]+" + "\n\t" // 2 b = *ptr++ (T = 5) + "out %[port] , %[next]" + "\n\t" // 1 PORT = next (T = 6) + "mov %[next] , %[lo]" + "\n\t" // 1 next = lo (T = 7) + "sbrc %[byte] , 7" + "\n\t" // 1-2 if(b & 0x80) (T = 8) + "mov %[next] , %[hi]" + "\n\t" // 0-1 next = hi (T = 9) + "nop" + "\n\t" // 1 (T = 10) + "out %[port] , %[lo]" + "\n\t" // 1 PORT = lo (T = 11) + "sbiw %[count], 1" + "\n\t" // 2 i-- (T = 13) + "brne headD" + "\n\t" // 2 if(i != 0) -> (next byte) + "rjmp doneD" + "\n\t" + "bitTimeD:" + "\n\t" // nop nop nop (T = 4) + "out %[port], %[next]" + "\n\t" // 1 PORT = next (T = 5) + "mov %[next], %[lo]" + "\n\t" // 1 next = lo (T = 6) + "rol %[byte]" + "\n\t" // 1 b <<= 1 (T = 7) + "sbrc %[byte], 7" + "\n\t" // 1-2 if(b & 0x80) (T = 8) + "mov %[next], %[hi]" + "\n\t" // 0-1 next = hi (T = 9) + "nop" + "\n\t" // 1 (T = 10) + "out %[port], %[lo]" + "\n\t" // 1 PORT = lo (T = 11) + "ret" + "\n\t" // 4 nop nop nop nop (T = 15) + "doneD:" + "\n" + : [byte] "+r"(b), [next] "+r"(next), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTD)), [ptr] "e"(ptr), + [hi] "r"(hi), [lo] "r"(lo)); + +#if defined(PORTB) || defined(PORTC) || defined(PORTF) + } else // other PORT(s) +#endif // defined(PORTB/C/F) +#endif // defined(PORTD) + + // PORTB OUTPUT ---------------------------------------------------- + +#if defined(PORTB) +#if defined(PORTD) || defined(PORTC) || defined(PORTF) + if (port == &PORTB) { +#endif // defined(PORTD/C/F) + + hi = PORTB | pinMask; + lo = PORTB & ~pinMask; + next = lo; + if (b & 0x80) + next = hi; + + // Same as above, just set for PORTB & stripped of comments + asm volatile("headB:" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeB" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeB" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeB" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeB" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeB" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeB" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeB" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "rjmp .+0" + "\n\t" + "ld %[byte] , %a[ptr]+" + "\n\t" + "out %[port] , %[next]" + "\n\t" + "mov %[next] , %[lo]" + "\n\t" + "sbrc %[byte] , 7" + "\n\t" + "mov %[next] , %[hi]" + "\n\t" + "nop" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "sbiw %[count], 1" + "\n\t" + "brne headB" + "\n\t" + "rjmp doneB" + "\n\t" + "bitTimeB:" + "\n\t" + "out %[port], %[next]" + "\n\t" + "mov %[next], %[lo]" + "\n\t" + "rol %[byte]" + "\n\t" + "sbrc %[byte], 7" + "\n\t" + "mov %[next], %[hi]" + "\n\t" + "nop" + "\n\t" + "out %[port], %[lo]" + "\n\t" + "ret" + "\n\t" + "doneB:" + "\n" + : [byte] "+r"(b), [next] "+r"(next), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTB)), [ptr] "e"(ptr), + [hi] "r"(hi), [lo] "r"(lo)); + +#if defined(PORTD) || defined(PORTC) || defined(PORTF) + } +#endif +#if defined(PORTC) || defined(PORTF) + else +#endif // defined(PORTC/F) +#endif // defined(PORTB) + + // PORTC OUTPUT ---------------------------------------------------- + +#if defined(PORTC) +#if defined(PORTD) || defined(PORTB) || defined(PORTF) + if (port == &PORTC) { +#endif // defined(PORTD/B/F) + + hi = PORTC | pinMask; + lo = PORTC & ~pinMask; + next = lo; + if (b & 0x80) + next = hi; + + // Same as above, just set for PORTC & stripped of comments + asm volatile("headC:" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "rjmp .+0" + "\n\t" + "ld %[byte] , %a[ptr]+" + "\n\t" + "out %[port] , %[next]" + "\n\t" + "mov %[next] , %[lo]" + "\n\t" + "sbrc %[byte] , 7" + "\n\t" + "mov %[next] , %[hi]" + "\n\t" + "nop" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "sbiw %[count], 1" + "\n\t" + "brne headC" + "\n\t" + "rjmp doneC" + "\n\t" + "bitTimeC:" + "\n\t" + "out %[port], %[next]" + "\n\t" + "mov %[next], %[lo]" + "\n\t" + "rol %[byte]" + "\n\t" + "sbrc %[byte], 7" + "\n\t" + "mov %[next], %[hi]" + "\n\t" + "nop" + "\n\t" + "out %[port], %[lo]" + "\n\t" + "ret" + "\n\t" + "doneC:" + "\n" + : [byte] "+r"(b), [next] "+r"(next), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTC)), [ptr] "e"(ptr), + [hi] "r"(hi), [lo] "r"(lo)); + +#if defined(PORTD) || defined(PORTB) || defined(PORTF) + } +#endif // defined(PORTD/B/F) +#if defined(PORTF) + else +#endif +#endif // defined(PORTC) + + // PORTF OUTPUT ---------------------------------------------------- + +#if defined(PORTF) +#if defined(PORTD) || defined(PORTB) || defined(PORTC) + if (port == &PORTF) { +#endif // defined(PORTD/B/C) + + hi = PORTF | pinMask; + lo = PORTF & ~pinMask; + next = lo; + if (b & 0x80) + next = hi; + + // Same as above, just set for PORTF & stripped of comments + asm volatile("headF:" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port], %[hi]" + "\n\t" + "rcall bitTimeC" + "\n\t" + "out %[port] , %[hi]" + "\n\t" + "rjmp .+0" + "\n\t" + "ld %[byte] , %a[ptr]+" + "\n\t" + "out %[port] , %[next]" + "\n\t" + "mov %[next] , %[lo]" + "\n\t" + "sbrc %[byte] , 7" + "\n\t" + "mov %[next] , %[hi]" + "\n\t" + "nop" + "\n\t" + "out %[port] , %[lo]" + "\n\t" + "sbiw %[count], 1" + "\n\t" + "brne headF" + "\n\t" + "rjmp doneC" + "\n\t" + "bitTimeC:" + "\n\t" + "out %[port], %[next]" + "\n\t" + "mov %[next], %[lo]" + "\n\t" + "rol %[byte]" + "\n\t" + "sbrc %[byte], 7" + "\n\t" + "mov %[next], %[hi]" + "\n\t" + "nop" + "\n\t" + "out %[port], %[lo]" + "\n\t" + "ret" + "\n\t" + "doneC:" + "\n" + : [byte] "+r"(b), [next] "+r"(next), [count] "+w"(i) + : [port] "I"(_SFR_IO_ADDR(PORTF)), [ptr] "e"(ptr), + [hi] "r"(hi), [lo] "r"(lo)); + +#if defined(PORTD) || defined(PORTB) || defined(PORTC) + } +#endif // defined(PORTD/B/C) +#endif // defined(PORTF) + +#if defined(NEO_KHZ400) + } else { // 400 KHz + + // 30 instruction clocks per bit: HHHHHHxxxxxxxxxLLLLLLLLLLLLLLL + // ST instructions: ^ ^ ^ (T=0,6,15) + + volatile uint8_t next, bit; + + hi = *port | pinMask; + lo = *port & ~pinMask; + next = lo; + bit = 8; + + asm volatile("head30:" + "\n\t" // Clk Pseudocode (T = 0) + "st %a[port], %[hi]" + "\n\t" // 2 PORT = hi (T = 2) + "sbrc %[byte] , 7" + "\n\t" // 1-2 if(b & 128) + "mov %[next], %[hi]" + "\n\t" // 0-1 next = hi (T = 4) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 6) + "st %a[port], %[next]" + "\n\t" // 2 PORT = next (T = 8) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 10) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 12) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 14) + "nop" + "\n\t" // 1 nop (T = 15) + "st %a[port], %[lo]" + "\n\t" // 2 PORT = lo (T = 17) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 19) + "dec %[bit]" + "\n\t" // 1 bit-- (T = 20) + "breq nextbyte30" + "\n\t" // 1-2 if(bit == 0) + "rol %[byte]" + "\n\t" // 1 b <<= 1 (T = 22) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 24) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 26) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 28) + "rjmp head30" + "\n\t" // 2 -> head30 (next bit out) + "nextbyte30:" + "\n\t" // (T = 22) + "nop" + "\n\t" // 1 nop (T = 23) + "ldi %[bit] , 8" + "\n\t" // 1 bit = 8 (T = 24) + "ld %[byte] , %a[ptr]+" + "\n\t" // 2 b = *ptr++ (T = 26) + "sbiw %[count], 1" + "\n\t" // 2 i-- (T = 28) + "brne head30" + "\n" // 1-2 if(i != 0) -> (next byte) + : [port] "+e"(port), [byte] "+r"(b), [bit] "+r"(bit), + [next] "+r"(next), [count] "+w"(i) + : [hi] "r"(hi), [lo] "r"(lo), [ptr] "e"(ptr)); + } +#endif // NEO_KHZ400 + +// 16 MHz(ish) AVR -------------------------------------------------------- +#elif (F_CPU >= 15400000UL) && (F_CPU <= 19000000L) + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + + // WS2811 and WS2812 have different hi/lo duty cycles; this is + // similar but NOT an exact copy of the prior 400-on-8 code. + + // 20 inst. clocks per bit: HHHHHxxxxxxxxLLLLLLL + // ST instructions: ^ ^ ^ (T=0,5,13) + + volatile uint8_t next, bit; + + hi = *port | pinMask; + lo = *port & ~pinMask; + next = lo; + bit = 8; + + asm volatile("head20:" + "\n\t" // Clk Pseudocode (T = 0) + "st %a[port], %[hi]" + "\n\t" // 2 PORT = hi (T = 2) + "sbrc %[byte], 7" + "\n\t" // 1-2 if(b & 128) + "mov %[next], %[hi]" + "\n\t" // 0-1 next = hi (T = 4) + "dec %[bit]" + "\n\t" // 1 bit-- (T = 5) + "st %a[port], %[next]" + "\n\t" // 2 PORT = next (T = 7) + "mov %[next] , %[lo]" + "\n\t" // 1 next = lo (T = 8) + "breq nextbyte20" + "\n\t" // 1-2 if(bit == 0) (from dec above) + "rol %[byte]" + "\n\t" // 1 b <<= 1 (T = 10) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 12) + "nop" + "\n\t" // 1 nop (T = 13) + "st %a[port], %[lo]" + "\n\t" // 2 PORT = lo (T = 15) + "nop" + "\n\t" // 1 nop (T = 16) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 18) + "rjmp head20" + "\n\t" // 2 -> head20 (next bit out) + "nextbyte20:" + "\n\t" // (T = 10) + "ldi %[bit] , 8" + "\n\t" // 1 bit = 8 (T = 11) + "ld %[byte] , %a[ptr]+" + "\n\t" // 2 b = *ptr++ (T = 13) + "st %a[port], %[lo]" + "\n\t" // 2 PORT = lo (T = 15) + "nop" + "\n\t" // 1 nop (T = 16) + "sbiw %[count], 1" + "\n\t" // 2 i-- (T = 18) + "brne head20" + "\n" // 2 if(i != 0) -> (next byte) + : [port] "+e"(port), [byte] "+r"(b), [bit] "+r"(bit), + [next] "+r"(next), [count] "+w"(i) + : [ptr] "e"(ptr), [hi] "r"(hi), [lo] "r"(lo)); + +#if defined(NEO_KHZ400) + } else { // 400 KHz + + // The 400 KHz clock on 16 MHz MCU is the most 'relaxed' version. + + // 40 inst. clocks per bit: HHHHHHHHxxxxxxxxxxxxLLLLLLLLLLLLLLLLLLLL + // ST instructions: ^ ^ ^ (T=0,8,20) + + volatile uint8_t next, bit; + + hi = *port | pinMask; + lo = *port & ~pinMask; + next = lo; + bit = 8; + + asm volatile("head40:" + "\n\t" // Clk Pseudocode (T = 0) + "st %a[port], %[hi]" + "\n\t" // 2 PORT = hi (T = 2) + "sbrc %[byte] , 7" + "\n\t" // 1-2 if(b & 128) + "mov %[next] , %[hi]" + "\n\t" // 0-1 next = hi (T = 4) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 6) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 8) + "st %a[port], %[next]" + "\n\t" // 2 PORT = next (T = 10) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 12) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 14) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 16) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 18) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 20) + "st %a[port], %[lo]" + "\n\t" // 2 PORT = lo (T = 22) + "nop" + "\n\t" // 1 nop (T = 23) + "mov %[next] , %[lo]" + "\n\t" // 1 next = lo (T = 24) + "dec %[bit]" + "\n\t" // 1 bit-- (T = 25) + "breq nextbyte40" + "\n\t" // 1-2 if(bit == 0) + "rol %[byte]" + "\n\t" // 1 b <<= 1 (T = 27) + "nop" + "\n\t" // 1 nop (T = 28) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 30) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 32) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 34) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 36) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 38) + "rjmp head40" + "\n\t" // 2 -> head40 (next bit out) + "nextbyte40:" + "\n\t" // (T = 27) + "ldi %[bit] , 8" + "\n\t" // 1 bit = 8 (T = 28) + "ld %[byte] , %a[ptr]+" + "\n\t" // 2 b = *ptr++ (T = 30) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 32) + "st %a[port], %[lo]" + "\n\t" // 2 PORT = lo (T = 34) + "rjmp .+0" + "\n\t" // 2 nop nop (T = 36) + "sbiw %[count], 1" + "\n\t" // 2 i-- (T = 38) + "brne head40" + "\n" // 1-2 if(i != 0) -> (next byte) + : [port] "+e"(port), [byte] "+r"(b), [bit] "+r"(bit), + [next] "+r"(next), [count] "+w"(i) + : [ptr] "e"(ptr), [hi] "r"(hi), [lo] "r"(lo)); + } +#endif // NEO_KHZ400 + +#else +#error "CPU SPEED NOT SUPPORTED" +#endif // end F_CPU ifdefs on __AVR__ + + // END AVR ---------------------------------------------------------------- + +#elif defined(__arm__) + + // ARM MCUs -- Teensy 3.0, 3.1, LC, Arduino Due, RP2040 ------------------- + +#if defined(ARDUINO_ARCH_RP2040) + // Use PIO + rp2040Show(pin, pixels, numBytes, is800KHz); + +#elif defined(TEENSYDUINO) && \ + defined(KINETISK) // Teensy 3.0, 3.1, 3.2, 3.5, 3.6 +#define CYCLES_800_T0H (F_CPU / 4000000) +#define CYCLES_800_T1H (F_CPU / 1250000) +#define CYCLES_800 (F_CPU / 800000) +#define CYCLES_400_T0H (F_CPU / 2000000) +#define CYCLES_400_T1H (F_CPU / 833333) +#define CYCLES_400 (F_CPU / 400000) + + uint8_t *p = pixels, *end = p + numBytes, pix, mask; + volatile uint8_t *set = portSetRegister(pin), *clr = portClearRegister(pin); + uint32_t cyc; + + ARM_DEMCR |= ARM_DEMCR_TRCENA; + ARM_DWT_CTRL |= ARM_DWT_CTRL_CYCCNTENA; + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + cyc = ARM_DWT_CYCCNT + CYCLES_800; + while (p < end) { + pix = *p++; + for (mask = 0x80; mask; mask >>= 1) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_800) + ; + cyc = ARM_DWT_CYCCNT; + *set = 1; + if (pix & mask) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_800_T1H) + ; + } else { + while (ARM_DWT_CYCCNT - cyc < CYCLES_800_T0H) + ; + } + *clr = 1; + } + } + while (ARM_DWT_CYCCNT - cyc < CYCLES_800) + ; +#if defined(NEO_KHZ400) + } else { // 400 kHz bitstream + cyc = ARM_DWT_CYCCNT + CYCLES_400; + while (p < end) { + pix = *p++; + for (mask = 0x80; mask; mask >>= 1) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_400) + ; + cyc = ARM_DWT_CYCCNT; + *set = 1; + if (pix & mask) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_400_T1H) + ; + } else { + while (ARM_DWT_CYCCNT - cyc < CYCLES_400_T0H) + ; + } + *clr = 1; + } + } + while (ARM_DWT_CYCCNT - cyc < CYCLES_400) + ; + } +#endif // NEO_KHZ400 + +#elif defined(TEENSYDUINO) && (defined(__IMXRT1052__) || defined(__IMXRT1062__)) +#define CYCLES_800_T0H (F_CPU_ACTUAL / 4000000) +#define CYCLES_800_T1H (F_CPU_ACTUAL / 1250000) +#define CYCLES_800 (F_CPU_ACTUAL / 800000) +#define CYCLES_400_T0H (F_CPU_ACTUAL / 2000000) +#define CYCLES_400_T1H (F_CPU_ACTUAL / 833333) +#define CYCLES_400 (F_CPU_ACTUAL / 400000) + + uint8_t *p = pixels, *end = p + numBytes, pix, mask; + volatile uint32_t *set = portSetRegister(pin), *clr = portClearRegister(pin); + uint32_t cyc, msk = digitalPinToBitMask(pin); + + ARM_DEMCR |= ARM_DEMCR_TRCENA; + ARM_DWT_CTRL |= ARM_DWT_CTRL_CYCCNTENA; + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + cyc = ARM_DWT_CYCCNT + CYCLES_800; + while (p < end) { + pix = *p++; + for (mask = 0x80; mask; mask >>= 1) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_800) + ; + cyc = ARM_DWT_CYCCNT; + *set = msk; + if (pix & mask) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_800_T1H) + ; + } else { + while (ARM_DWT_CYCCNT - cyc < CYCLES_800_T0H) + ; + } + *clr = msk; + } + } + while (ARM_DWT_CYCCNT - cyc < CYCLES_800) + ; +#if defined(NEO_KHZ400) + } else { // 400 kHz bitstream + cyc = ARM_DWT_CYCCNT + CYCLES_400; + while (p < end) { + pix = *p++; + for (mask = 0x80; mask; mask >>= 1) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_400) + ; + cyc = ARM_DWT_CYCCNT; + *set = msk; + if (pix & mask) { + while (ARM_DWT_CYCCNT - cyc < CYCLES_400_T1H) + ; + } else { + while (ARM_DWT_CYCCNT - cyc < CYCLES_400_T0H) + ; + } + *clr = msk; + } + } + while (ARM_DWT_CYCCNT - cyc < CYCLES_400) + ; + } +#endif // NEO_KHZ400 + +#elif defined(TEENSYDUINO) && defined(__MKL26Z64__) // Teensy-LC + +#if F_CPU == 48000000 + uint8_t *p = pixels, pix, count, dly, bitmask = digitalPinToBitMask(pin); + volatile uint8_t *reg = portSetRegister(pin); + uint32_t num = numBytes; + asm volatile("L%=_begin:" + "\n\t" + "ldrb %[pix], [%[p], #0]" + "\n\t" + "lsl %[pix], #24" + "\n\t" + "movs %[count], #7" + "\n\t" + "L%=_loop:" + "\n\t" + "lsl %[pix], #1" + "\n\t" + "bcs L%=_loop_one" + "\n\t" + "L%=_loop_zero:" + "\n\t" + "strb %[bitmask], [%[reg], #0]" + "\n\t" + "movs %[dly], #4" + "\n\t" + "L%=_loop_delay_T0H:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_loop_delay_T0H" + "\n\t" + "strb %[bitmask], [%[reg], #4]" + "\n\t" + "movs %[dly], #13" + "\n\t" + "L%=_loop_delay_T0L:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_loop_delay_T0L" + "\n\t" + "b L%=_next" + "\n\t" + "L%=_loop_one:" + "\n\t" + "strb %[bitmask], [%[reg], #0]" + "\n\t" + "movs %[dly], #13" + "\n\t" + "L%=_loop_delay_T1H:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_loop_delay_T1H" + "\n\t" + "strb %[bitmask], [%[reg], #4]" + "\n\t" + "movs %[dly], #4" + "\n\t" + "L%=_loop_delay_T1L:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_loop_delay_T1L" + "\n\t" + "nop" + "\n\t" + "L%=_next:" + "\n\t" + "sub %[count], #1" + "\n\t" + "bne L%=_loop" + "\n\t" + "lsl %[pix], #1" + "\n\t" + "bcs L%=_last_one" + "\n\t" + "L%=_last_zero:" + "\n\t" + "strb %[bitmask], [%[reg], #0]" + "\n\t" + "movs %[dly], #4" + "\n\t" + "L%=_last_delay_T0H:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_last_delay_T0H" + "\n\t" + "strb %[bitmask], [%[reg], #4]" + "\n\t" + "movs %[dly], #10" + "\n\t" + "L%=_last_delay_T0L:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_last_delay_T0L" + "\n\t" + "b L%=_repeat" + "\n\t" + "L%=_last_one:" + "\n\t" + "strb %[bitmask], [%[reg], #0]" + "\n\t" + "movs %[dly], #13" + "\n\t" + "L%=_last_delay_T1H:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_last_delay_T1H" + "\n\t" + "strb %[bitmask], [%[reg], #4]" + "\n\t" + "movs %[dly], #1" + "\n\t" + "L%=_last_delay_T1L:" + "\n\t" + "sub %[dly], #1" + "\n\t" + "bne L%=_last_delay_T1L" + "\n\t" + "nop" + "\n\t" + "L%=_repeat:" + "\n\t" + "add %[p], #1" + "\n\t" + "sub %[num], #1" + "\n\t" + "bne L%=_begin" + "\n\t" + "L%=_done:" + "\n\t" + : [p] "+r"(p), [pix] "=&r"(pix), [count] "=&r"(count), + [dly] "=&r"(dly), [num] "+r"(num) + : [bitmask] "r"(bitmask), [reg] "r"(reg)); +#else +#error "Sorry, only 48 MHz is supported, please set Tools > CPU Speed to 48 MHz" +#endif // F_CPU == 48000000 + + // Begin of support for nRF52 based boards ------------------------- + +#elif defined(NRF52) || defined(NRF52_SERIES) +// [[[Begin of the Neopixel NRF52 EasyDMA implementation +// by the Hackerspace San Salvador]]] +// This technique uses the PWM peripheral on the NRF52. The PWM uses the +// EasyDMA feature included on the chip. This technique loads the duty +// cycle configuration for each cycle when the PWM is enabled. For this +// to work we need to store a 16 bit configuration for each bit of the +// RGB(W) values in the pixel buffer. +// Comparator values for the PWM were hand picked and are guaranteed to +// be 100% organic to preserve freshness and high accuracy. Current +// parameters are: +// * PWM Clock: 16Mhz +// * Minimum step time: 62.5ns +// * Time for zero in high (T0H): 0.31ms +// * Time for one in high (T1H): 0.75ms +// * Cycle time: 1.25us +// * Frequency: 800Khz +// For 400Khz we just double the calculated times. +// ---------- BEGIN Constants for the EasyDMA implementation ----------- +// The PWM starts the duty cycle in LOW. To start with HIGH we +// need to set the 15th bit on each register. + +// WS2812 (rev A) timing is 0.35 and 0.7us +//#define MAGIC_T0H 5UL | (0x8000) // 0.3125us +//#define MAGIC_T1H 12UL | (0x8000) // 0.75us + +// WS2812B (rev B) timing is 0.4 and 0.8 us +#define MAGIC_T0H 6UL | (0x8000) // 0.375us +#define MAGIC_T1H 13UL | (0x8000) // 0.8125us + +// WS2811 (400 khz) timing is 0.5 and 1.2 +#define MAGIC_T0H_400KHz 8UL | (0x8000) // 0.5us +#define MAGIC_T1H_400KHz 19UL | (0x8000) // 1.1875us + +// For 400Khz, we double value of CTOPVAL +#define CTOPVAL 20UL // 1.25us +#define CTOPVAL_400KHz 40UL // 2.5us + +// ---------- END Constants for the EasyDMA implementation ------------- +// +// If there is no device available an alternative cycle-counter +// implementation is tried. +// The nRF52 runs with a fixed clock of 64Mhz. The alternative +// implementation is the same as the one used for the Teensy 3.0/1/2 but +// with the Nordic SDK HAL & registers syntax. +// The number of cycles was hand picked and is guaranteed to be 100% +// organic to preserve freshness and high accuracy. +// ---------- BEGIN Constants for cycle counter implementation --------- +#define CYCLES_800_T0H 18 // ~0.36 uS +#define CYCLES_800_T1H 41 // ~0.76 uS +#define CYCLES_800 71 // ~1.25 uS + +#define CYCLES_400_T0H 26 // ~0.50 uS +#define CYCLES_400_T1H 70 // ~1.26 uS +#define CYCLES_400 156 // ~2.50 uS + // ---------- END of Constants for cycle counter implementation -------- + + // To support both the SoftDevice + Neopixels we use the EasyDMA + // feature from the NRF25. However this technique implies to + // generate a pattern and store it on the memory. The actual + // memory used in bytes corresponds to the following formula: + // totalMem = numBytes*8*2+(2*2) + // The two additional bytes at the end are needed to reset the + // sequence. + // + // If there is not enough memory, we will fall back to cycle counter + // using DWT + uint32_t pattern_size = + numBytes * 8 * sizeof(uint16_t) + 2 * sizeof(uint16_t); + uint16_t *pixels_pattern = NULL; + + NRF_PWM_Type *pwm = NULL; + + // Try to find a free PWM device, which is not enabled + // and has no connected pins + NRF_PWM_Type *PWM[] = { + NRF_PWM0, + NRF_PWM1, + NRF_PWM2 +#if defined(NRF_PWM3) + , + NRF_PWM3 +#endif + }; + + for (unsigned int device = 0; device < (sizeof(PWM) / sizeof(PWM[0])); + device++) { + if ((PWM[device]->ENABLE == 0) && + (PWM[device]->PSEL.OUT[0] & PWM_PSEL_OUT_CONNECT_Msk) && + (PWM[device]->PSEL.OUT[1] & PWM_PSEL_OUT_CONNECT_Msk) && + (PWM[device]->PSEL.OUT[2] & PWM_PSEL_OUT_CONNECT_Msk) && + (PWM[device]->PSEL.OUT[3] & PWM_PSEL_OUT_CONNECT_Msk)) { + pwm = PWM[device]; + break; + } + } + + // only malloc if there is PWM device available + if (pwm != NULL) { +#if defined(ARDUINO_NRF52_ADAFRUIT) // use thread-safe malloc + pixels_pattern = (uint16_t *)rtos_malloc(pattern_size); +#else + pixels_pattern = (uint16_t *)malloc(pattern_size); +#endif + } + + // Use the identified device to choose the implementation + // If a PWM device is available use DMA + if ((pixels_pattern != NULL) && (pwm != NULL)) { + uint16_t pos = 0; // bit position + + for (uint16_t n = 0; n < numBytes; n++) { + uint8_t pix = pixels[n]; + + for (uint8_t mask = 0x80; mask > 0; mask >>= 1) { +#if defined(NEO_KHZ400) + if (!is800KHz) { + pixels_pattern[pos] = + (pix & mask) ? MAGIC_T1H_400KHz : MAGIC_T0H_400KHz; + } else +#endif + { + pixels_pattern[pos] = (pix & mask) ? MAGIC_T1H : MAGIC_T0H; + } + + pos++; + } + } + + // Zero padding to indicate the end of que sequence + pixels_pattern[pos++] = 0 | (0x8000); // Seq end + pixels_pattern[pos++] = 0 | (0x8000); // Seq end + + // Set the wave mode to count UP + pwm->MODE = (PWM_MODE_UPDOWN_Up << PWM_MODE_UPDOWN_Pos); + + // Set the PWM to use the 16MHz clock + pwm->PRESCALER = + (PWM_PRESCALER_PRESCALER_DIV_1 << PWM_PRESCALER_PRESCALER_Pos); + + // Setting of the maximum count + // but keeping it on 16Mhz allows for more granularity just + // in case someone wants to do more fine-tuning of the timing. +#if defined(NEO_KHZ400) + if (!is800KHz) { + pwm->COUNTERTOP = (CTOPVAL_400KHz << PWM_COUNTERTOP_COUNTERTOP_Pos); + } else +#endif + { + pwm->COUNTERTOP = (CTOPVAL << PWM_COUNTERTOP_COUNTERTOP_Pos); + } + + // Disable loops, we want the sequence to repeat only once + pwm->LOOP = (PWM_LOOP_CNT_Disabled << PWM_LOOP_CNT_Pos); + + // On the "Common" setting the PWM uses the same pattern for the + // for supported sequences. The pattern is stored on half-word + // of 16bits + pwm->DECODER = (PWM_DECODER_LOAD_Common << PWM_DECODER_LOAD_Pos) | + (PWM_DECODER_MODE_RefreshCount << PWM_DECODER_MODE_Pos); + + // Pointer to the memory storing the patter + pwm->SEQ[0].PTR = (uint32_t)(pixels_pattern) << PWM_SEQ_PTR_PTR_Pos; + + // Calculation of the number of steps loaded from memory. + pwm->SEQ[0].CNT = (pattern_size / sizeof(uint16_t)) << PWM_SEQ_CNT_CNT_Pos; + + // The following settings are ignored with the current config. + pwm->SEQ[0].REFRESH = 0; + pwm->SEQ[0].ENDDELAY = 0; + + // The Neopixel implementation is a blocking algorithm. DMA + // allows for non-blocking operation. To "simulate" a blocking + // operation we enable the interruption for the end of sequence + // and block the execution thread until the event flag is set by + // the peripheral. + // pwm->INTEN |= (PWM_INTEN_SEQEND0_Enabled<PSEL.OUT[0] = g_APinDescription[pin].name; +#else + pwm->PSEL.OUT[0] = g_ADigitalPinMap[pin]; +#endif + + // Enable the PWM + pwm->ENABLE = 1; + + // After all of this and many hours of reading the documentation + // we are ready to start the sequence... + pwm->EVENTS_SEQEND[0] = 0; + pwm->TASKS_SEQSTART[0] = 1; + + // But we have to wait for the flag to be set. + while (!pwm->EVENTS_SEQEND[0]) { +#if defined(ARDUINO_NRF52_ADAFRUIT) || defined(ARDUINO_ARCH_NRF52840) + yield(); +#endif + } + + // Before leave we clear the flag for the event. + pwm->EVENTS_SEQEND[0] = 0; + + // We need to disable the device and disconnect + // all the outputs before leave or the device will not + // be selected on the next call. + // TODO: Check if disabling the device causes performance issues. + pwm->ENABLE = 0; + + pwm->PSEL.OUT[0] = 0xFFFFFFFFUL; + +#if defined(ARDUINO_NRF52_ADAFRUIT) // use thread-safe free + rtos_free(pixels_pattern); +#else + free(pixels_pattern); +#endif + } // End of DMA implementation + // --------------------------------------------------------------------- + else { +#ifndef ARDUINO_ARCH_NRF52840 +// Fall back to DWT +#if defined(ARDUINO_NRF52_ADAFRUIT) + // Bluefruit Feather 52 uses freeRTOS + // Critical Section is used since it does not block SoftDevice execution + taskENTER_CRITICAL(); +#elif defined(NRF52_DISABLE_INT) + // If you are using the Bluetooth SoftDevice we advise you to not disable + // the interrupts. Disabling the interrupts even for short periods of time + // causes the SoftDevice to stop working. + // Disable the interrupts only in cases where you need high performance for + // the LEDs and if you are not using the EasyDMA feature. + __disable_irq(); +#endif + + NRF_GPIO_Type *nrf_port = (NRF_GPIO_Type *)digitalPinToPort(pin); + uint32_t pinMask = digitalPinToBitMask(pin); + + uint32_t CYCLES_X00 = CYCLES_800; + uint32_t CYCLES_X00_T1H = CYCLES_800_T1H; + uint32_t CYCLES_X00_T0H = CYCLES_800_T0H; + +#if defined(NEO_KHZ400) + if (!is800KHz) { + CYCLES_X00 = CYCLES_400; + CYCLES_X00_T1H = CYCLES_400_T1H; + CYCLES_X00_T0H = CYCLES_400_T0H; + } +#endif + + // Enable DWT in debug core + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + + // Tries to re-send the frame if is interrupted by the SoftDevice. + while (1) { + uint8_t *p = pixels; + + uint32_t cycStart = DWT->CYCCNT; + uint32_t cyc = 0; + + for (uint16_t n = 0; n < numBytes; n++) { + uint8_t pix = *p++; + + for (uint8_t mask = 0x80; mask; mask >>= 1) { + while (DWT->CYCCNT - cyc < CYCLES_X00) + ; + cyc = DWT->CYCCNT; + + nrf_port->OUTSET |= pinMask; + + if (pix & mask) { + while (DWT->CYCCNT - cyc < CYCLES_X00_T1H) + ; + } else { + while (DWT->CYCCNT - cyc < CYCLES_X00_T0H) + ; + } + + nrf_port->OUTCLR |= pinMask; + } + } + while (DWT->CYCCNT - cyc < CYCLES_X00) + ; + + // If total time longer than 25%, resend the whole data. + // Since we are likely to be interrupted by SoftDevice + if ((DWT->CYCCNT - cycStart) < (8 * numBytes * ((CYCLES_X00 * 5) / 4))) { + break; + } + + // re-send need 300us delay + delayMicroseconds(300); + } + +// Enable interrupts again +#if defined(ARDUINO_NRF52_ADAFRUIT) + taskEXIT_CRITICAL(); +#elif defined(NRF52_DISABLE_INT) + __enable_irq(); +#endif +#endif + } + // END of NRF52 implementation + +#elif defined(__SAMD21E17A__) || defined(__SAMD21G18A__) || \ + defined(__SAMD21E18A__) || defined(__SAMD21J18A__) || \ + defined (__SAMD11C14A__) + // Arduino Zero, Gemma/Trinket M0, SODAQ Autonomo + // and others + // Tried this with a timer/counter, couldn't quite get adequate + // resolution. So yay, you get a load of goofball NOPs... + + uint8_t *ptr, *end, p, bitMask, portNum; + uint32_t pinMask; + + portNum = g_APinDescription[pin].ulPort; + pinMask = 1ul << g_APinDescription[pin].ulPin; + ptr = pixels; + end = ptr + numBytes; + p = *ptr++; + bitMask = 0x80; + + volatile uint32_t *set = &(PORT->Group[portNum].OUTSET.reg), + *clr = &(PORT->Group[portNum].OUTCLR.reg); + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + for (;;) { + *set = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop;"); + if (p & bitMask) { + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop;"); + *clr = pinMask; + } else { + *clr = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop;"); + } + if (bitMask >>= 1) { + asm("nop; nop; nop; nop; nop; nop; nop; nop; nop;"); + } else { + if (ptr >= end) + break; + p = *ptr++; + bitMask = 0x80; + } + } +#if defined(NEO_KHZ400) + } else { // 400 KHz bitstream + for (;;) { + *set = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;"); + if (p & bitMask) { + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop;"); + *clr = pinMask; + } else { + *clr = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop;"); + } + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;"); + if (bitMask >>= 1) { + asm("nop; nop; nop; nop; nop; nop; nop;"); + } else { + if (ptr >= end) + break; + p = *ptr++; + bitMask = 0x80; + } + } + } +#endif + +//---- +#elif defined(XMC1100_XMC2GO) || defined(XMC1100_H_BRIDGE2GO) || defined(XMC1100_Boot_Kit) || defined(XMC1300_Boot_Kit) + + // XMC1100/1200/1300 with ARM Cortex M0 are running with 32MHz, XMC1400 runs with 48MHz so may not work + // Tried this with a timer/counter, couldn't quite get adequate + // resolution. So yay, you get a load of goofball NOPs... + + uint8_t *ptr, *end, p, bitMask, portNum; + uint32_t pinMask; + + ptr = pixels; + end = ptr + numBytes; + p = *ptr++; + bitMask = 0x80; + + XMC_GPIO_PORT_t* XMC_port = mapping_port_pin[ pin ].port; + uint8_t XMC_pin = mapping_port_pin[ pin ].pin; + + uint32_t omrhigh = (uint32_t)XMC_GPIO_OUTPUT_LEVEL_HIGH << XMC_pin; + uint32_t omrlow = (uint32_t)XMC_GPIO_OUTPUT_LEVEL_LOW << XMC_pin; + +#ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled + if(is800KHz) { +#endif + for(;;) { + XMC_port->OMR = omrhigh; + asm("nop; nop; nop; nop;"); + if(p & bitMask) { + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop;"); + XMC_port->OMR = omrlow; + } else { + XMC_port->OMR = omrlow; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop;"); + } + if(bitMask >>= 1) { + asm("nop; nop; nop; nop; nop;"); + } else { + if(ptr >= end) break; + p = *ptr++; + bitMask = 0x80; + } + } +#ifdef NEO_KHZ400 // untested code + } else { // 400 KHz bitstream + for(;;) { + XMC_port->OMR = omrhigh; + asm("nop; nop; nop; nop; nop;"); + if(p & bitMask) { + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop;"); + XMC_port->OMR = omrlow; + } else { + XMC_port->OMR = omrlow; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop;"); + } + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;"); + if(bitMask >>= 1) { + asm("nop; nop; nop;"); + } else { + if(ptr >= end) break; + p = *ptr++; + bitMask = 0x80; + } + } + } + +#endif +//---- + +//---- +#elif defined(XMC4700_Relax_Kit) || defined(XMC4800_Relax_Kit) + +// XMC4700 and XMC4800 with ARM Cortex M4 are running with 144MHz +// Tried this with a timer/counter, couldn't quite get adequate +// resolution. So yay, you get a load of goofball NOPs... + +uint8_t *ptr, *end, p, bitMask, portNum; +uint32_t pinMask; + +ptr = pixels; +end = ptr + numBytes; +p = *ptr++; +bitMask = 0x80; + +XMC_GPIO_PORT_t* XMC_port = mapping_port_pin[ pin ].port; +uint8_t XMC_pin = mapping_port_pin[ pin ].pin; + +uint32_t omrhigh = (uint32_t)XMC_GPIO_OUTPUT_LEVEL_HIGH << XMC_pin; +uint32_t omrlow = (uint32_t)XMC_GPIO_OUTPUT_LEVEL_LOW << XMC_pin; + +#ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled +if(is800KHz) { +#endif + + for(;;) { + XMC_port->OMR = omrhigh; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop;"); + if(p & bitMask) { + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;"); + XMC_port->OMR = omrlow; + } else { + XMC_port->OMR = omrlow; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;"); + } + if(bitMask >>= 1) { + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;"); + } else { + if(ptr >= end) break; + p = *ptr++; + bitMask = 0x80; + } + } + + +#ifdef NEO_KHZ400 + } else { // 400 KHz bitstream + // ToDo! + } +#endif +//---- + +#elif defined(__SAMD51__) // M4 + + uint8_t *ptr, *end, p, bitMask, portNum, bit; + uint32_t pinMask; + + portNum = g_APinDescription[pin].ulPort; + pinMask = 1ul << g_APinDescription[pin].ulPin; + ptr = pixels; + end = ptr + numBytes; + p = *ptr++; + bitMask = 0x80; + + volatile uint32_t *set = &(PORT->Group[portNum].OUTSET.reg), + *clr = &(PORT->Group[portNum].OUTCLR.reg); + + // SAMD51 overclock-compatible timing is only a mild abomination. + // It uses SysTick for a consistent clock reference regardless of + // optimization / cache settings. That's the good news. The bad news, + // since SysTick->VAL is a volatile type it's slow to access...and then, + // with the SysTick interval that Arduino sets up (1 ms), this would + // require a subtract and MOD operation for gauging elapsed time, and + // all taken in combination that lacks adequate temporal resolution + // for NeoPixel timing. So a kind of horrible thing is done here... + // since interrupts are turned off anyway and it's generally accepted + // by now that we're gonna lose track of time in the NeoPixel lib, + // the SysTick timer is reconfigured for a period matching the NeoPixel + // bit timing (either 800 or 400 KHz) and we watch SysTick->VAL very + // closely (just a threshold, no subtract or MOD or anything) and that + // seems to work just well enough. When finished, the SysTick + // peripheral is set back to its original state. + + uint32_t t0, t1, top, ticks, saveLoad = SysTick->LOAD, saveVal = SysTick->VAL; + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + top = (uint32_t)(F_CPU * 0.00000125); // Bit hi + lo = 1.25 uS + t0 = top - (uint32_t)(F_CPU * 0.00000040); // 0 = 0.4 uS hi + t1 = top - (uint32_t)(F_CPU * 0.00000080); // 1 = 0.8 uS hi +#if defined(NEO_KHZ400) + } else { // 400 KHz bitstream + top = (uint32_t)(F_CPU * 0.00000250); // Bit hi + lo = 2.5 uS + t0 = top - (uint32_t)(F_CPU * 0.00000050); // 0 = 0.5 uS hi + t1 = top - (uint32_t)(F_CPU * 0.00000120); // 1 = 1.2 uS hi + } +#endif + + SysTick->LOAD = top; // Config SysTick for NeoPixel bit freq + SysTick->VAL = top; // Set to start value (counts down) + (void)SysTick->VAL; // Dummy read helps sync up 1st bit + + for (;;) { + *set = pinMask; // Set output high + ticks = (p & bitMask) ? t1 : t0; // SysTick threshold, + while (SysTick->VAL > ticks) + ; // wait for it + *clr = pinMask; // Set output low + if (!(bitMask >>= 1)) { // Next bit for this byte...done? + if (ptr >= end) + break; // If last byte sent, exit loop + p = *ptr++; // Fetch next byte + bitMask = 0x80; // Reset bitmask + } + while (SysTick->VAL <= ticks) + ; // Wait for rollover to 'top' + } + + SysTick->LOAD = saveLoad; // Restore SysTick rollover to 1 ms + SysTick->VAL = saveVal; // Restore SysTick value + +#elif defined(ARDUINO_STM32_FEATHER) // FEATHER WICED (120MHz) + + // Tried this with a timer/counter, couldn't quite get adequate + // resolution. So yay, you get a load of goofball NOPs... + + uint8_t *ptr, *end, p, bitMask; + uint32_t pinMask; + + pinMask = BIT(PIN_MAP[pin].gpio_bit); + ptr = pixels; + end = ptr + numBytes; + p = *ptr++; + bitMask = 0x80; + + volatile uint16_t *set = &(PIN_MAP[pin].gpio_device->regs->BSRRL); + volatile uint16_t *clr = &(PIN_MAP[pin].gpio_device->regs->BSRRH); + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + for (;;) { + if (p & bitMask) { // ONE + // High 800ns + *set = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop;"); + // Low 450ns + *clr = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop;"); + } else { // ZERO + // High 400ns + *set = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop;"); + // Low 850ns + *clr = pinMask; + asm("nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop;"); + } + if (bitMask >>= 1) { + // Move on to the next pixel + asm("nop;"); + } else { + if (ptr >= end) + break; + p = *ptr++; + bitMask = 0x80; + } + } +#if defined(NEO_KHZ400) + } else { // 400 KHz bitstream + // ToDo! + } +#endif + +#elif defined(TARGET_LPC1768) + uint8_t *ptr, *end, p, bitMask; + ptr = pixels; + end = ptr + numBytes; + p = *ptr++; + bitMask = 0x80; + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + for (;;) { + if (p & bitMask) { + // data ONE high + // min: 550 typ: 700 max: 5,500 + gpio_set(pin); + time::delay_ns(550); + // min: 450 typ: 600 max: 5,000 + gpio_clear(pin); + time::delay_ns(450); + } else { + // data ZERO high + // min: 200 typ: 350 max: 500 + gpio_set(pin); + time::delay_ns(200); + // data low + // min: 450 typ: 600 max: 5,000 + gpio_clear(pin); + time::delay_ns(450); + } + if (bitMask >>= 1) { + // Move on to the next pixel + asm("nop;"); + } else { + if (ptr >= end) + break; + p = *ptr++; + bitMask = 0x80; + } + } +#if defined(NEO_KHZ400) + } else { // 400 KHz bitstream + // ToDo! + } +#endif +#elif defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_ARDUINO_CORE_STM32) + uint8_t *p = pixels, *end = p + numBytes, pix = *p++, mask = 0x80; + uint32_t cyc; + uint32_t saveLoad = SysTick->LOAD, saveVal = SysTick->VAL; +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + uint32_t top = (F_CPU / 800000); // 1.25µs + uint32_t t0 = top - (F_CPU / 2500000); // 0.4µs + uint32_t t1 = top - (F_CPU / 1250000); // 0.8µs + SysTick->LOAD = top - 1; // Config SysTick for NeoPixel bit freq + SysTick->VAL = 0; // Set to start value + for (;;) { + LL_GPIO_SetOutputPin(gpioPort, gpioPin); + cyc = (pix & mask) ? t1 : t0; + while (SysTick->VAL > cyc) + ; + LL_GPIO_ResetOutputPin(gpioPort, gpioPin); + if (!(mask >>= 1)) { + if (p >= end) + break; + pix = *p++; + mask = 0x80; + } + while (SysTick->VAL <= cyc) + ; + } +#if defined(NEO_KHZ400) + } else { // 400 kHz bitstream + uint32_t top = (F_CPU / 400000); // 2.5µs + uint32_t t0 = top - (F_CPU / 2000000); // 0.5µs + uint32_t t1 = top - (F_CPU / 833333); // 1.2µs + SysTick->LOAD = top - 1; // Config SysTick for NeoPixel bit freq + SysTick->VAL = 0; // Set to start value + for (;;) { + LL_GPIO_SetOutputPin(gpioPort, gpioPin); + cyc = (pix & mask) ? t1 : t0; + while (SysTick->VAL > cyc) + ; + LL_GPIO_ResetOutputPin(gpioPort, gpioPin); + if (!(mask >>= 1)) { + if (p >= end) + break; + pix = *p++; + mask = 0x80; + } + while (SysTick->VAL <= cyc) + ; + } + } +#endif // NEO_KHZ400 + SysTick->LOAD = saveLoad; // Restore SysTick rollover to 1 ms + SysTick->VAL = saveVal; // Restore SysTick value +#elif defined(NRF51) + uint8_t *p = pixels, pix, count, mask; + int32_t num = numBytes; + unsigned int bitmask = (1 << g_ADigitalPinMap[pin]); + // https://github.com/sandeepmistry/arduino-nRF5/blob/dc53980c8bac27898fca90d8ecb268e11111edc1/variants/BBCmicrobit/variant.cpp + + volatile unsigned int *reg = (unsigned int *)(0x50000000UL + 0x508); + + // https://github.com/sandeepmistry/arduino-nRF5/blob/dc53980c8bac27898fca90d8ecb268e11111edc1/cores/nRF5/SDK/components/device/nrf51.h + // http://www.iot-programmer.com/index.php/books/27-micro-bit-iot-in-c/chapters-micro-bit-iot-in-c/47-micro-bit-iot-in-c-fast-memory-mapped-gpio?showall=1 + // https://github.com/Microsoft/pxt-neopixel/blob/master/sendbuffer.asm + + asm volatile( + // "cpsid i" ; disable irq + + // b .start + "b L%=_start" + "\n\t" + // .nextbit: ; C0 + "L%=_nextbit:" + "\n\t" //; C0 + // str r1, [r3, #0] ; pin := hi C2 + "strb %[bitmask], [%[reg], #0]" + "\n\t" //; pin := hi C2 + // tst r6, r0 ; C3 + "tst %[mask], %[pix]" + "\n\t" // ; C3 + // bne .islate ; C4 + "bne L%=_islate" + "\n\t" //; C4 + // str r1, [r2, #0] ; pin := lo C6 + "strb %[bitmask], [%[reg], #4]" + "\n\t" //; pin := lo C6 + // .islate: + "L%=_islate:" + "\n\t" + // lsrs r6, r6, #1 ; r6 >>= 1 C7 + "lsr %[mask], %[mask], #1" + "\n\t" //; r6 >>= 1 C7 + // bne .justbit ; C8 + "bne L%=_justbit" + "\n\t" //; C8 + + // ; not just a bit - need new byte + // adds r4, #1 ; r4++ C9 + "add %[p], #1" + "\n\t" //; r4++ C9 + // subs r5, #1 ; r5-- C10 + "sub %[num], #1" + "\n\t" //; r5-- C10 + // bcc .stop ; if (r5<0) goto .stop C11 + "bcc L%=_stop" + "\n\t" //; if (r5<0) goto .stop C11 + // .start: + "L%=_start:" + // movs r6, #0x80 ; reset mask C12 + "movs %[mask], #0x80" + "\n\t" //; reset mask C12 + // nop ; C13 + "nop" + "\n\t" //; C13 + + // .common: ; C13 + "L%=_common:" + "\n\t" //; C13 + // str r1, [r2, #0] ; pin := lo C15 + "strb %[bitmask], [%[reg], #4]" + "\n\t" //; pin := lo C15 + // ; always re-load byte - it just fits with the cycles better this way + // ldrb r0, [r4, #0] ; r0 := *r4 C17 + "ldrb %[pix], [%[p], #0]" + "\n\t" //; r0 := *r4 C17 + // b .nextbit ; C20 + "b L%=_nextbit" + "\n\t" //; C20 + + // .justbit: ; C10 + "L%=_justbit:" + "\n\t" //; C10 + // ; no nops, branch taken is already 3 cycles + // b .common ; C13 + "b L%=_common" + "\n\t" //; C13 + + // .stop: + "L%=_stop:" + "\n\t" + // str r1, [r2, #0] ; pin := lo + "strb %[bitmask], [%[reg], #4]" + "\n\t" //; pin := lo + // cpsie i ; enable irq + + : [p] "+r"(p), [pix] "=&r"(pix), [count] "=&r"(count), [mask] "=&r"(mask), + [num] "+r"(num) + : [bitmask] "r"(bitmask), [reg] "r"(reg)); + +#elif defined(__SAM3X8E__) // Arduino Due + +#define SCALE VARIANT_MCK / 2UL / 1000000UL +#define INST (2UL * F_CPU / VARIANT_MCK) +#define TIME_800_0 ((int)(0.40 * SCALE + 0.5) - (5 * INST)) +#define TIME_800_1 ((int)(0.80 * SCALE + 0.5) - (5 * INST)) +#define PERIOD_800 ((int)(1.25 * SCALE + 0.5) - (5 * INST)) +#define TIME_400_0 ((int)(0.50 * SCALE + 0.5) - (5 * INST)) +#define TIME_400_1 ((int)(1.20 * SCALE + 0.5) - (5 * INST)) +#define PERIOD_400 ((int)(2.50 * SCALE + 0.5) - (5 * INST)) + + int pinMask, time0, time1, period, t; + Pio *port; + volatile WoReg *portSet, *portClear, *timeValue, *timeReset; + uint8_t *p, *end, pix, mask; + + pmc_set_writeprotect(false); + pmc_enable_periph_clk((uint32_t)TC3_IRQn); + TC_Configure(TC1, 0, + TC_CMR_WAVE | TC_CMR_WAVSEL_UP | TC_CMR_TCCLKS_TIMER_CLOCK1); + TC_Start(TC1, 0); + + pinMask = g_APinDescription[pin].ulPin; // Don't 'optimize' these into + port = g_APinDescription[pin].pPort; // declarations above. Want to + portSet = &(port->PIO_SODR); // burn a few cycles after + portClear = &(port->PIO_CODR); // starting timer to minimize + timeValue = &(TC1->TC_CHANNEL[0].TC_CV); // the initial 'while'. + timeReset = &(TC1->TC_CHANNEL[0].TC_CCR); + p = pixels; + end = p + numBytes; + pix = *p++; + mask = 0x80; + +#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled + if (is800KHz) { +#endif + time0 = TIME_800_0; + time1 = TIME_800_1; + period = PERIOD_800; +#if defined(NEO_KHZ400) + } else { // 400 KHz bitstream + time0 = TIME_400_0; + time1 = TIME_400_1; + period = PERIOD_400; + } +#endif + + for (t = time0;; t = time0) { + if (pix & mask) + t = time1; + while (*timeValue < (unsigned)period) + ; + *portSet = pinMask; + *timeReset = TC_CCR_CLKEN | TC_CCR_SWTRG; + while (*timeValue < (unsigned)t) + ; + *portClear = pinMask; + if (!(mask >>= 1)) { // This 'inside-out' loop logic utilizes + if (p >= end) + break; // idle time to minimize inter-byte delays. + pix = *p++; + mask = 0x80; + } + } + while (*timeValue < (unsigned)period) + ; // Wait for last bit + TC_Stop(TC1, 0); + +#endif // end Due + + // END ARM ---------------------------------------------------------------- + +#elif defined(ESP8266) || defined(ESP32) + + // ESP8266 ---------------------------------------------------------------- + + // ESP8266 show() is external to enforce ICACHE_RAM_ATTR execution + espShow(pin, pixels, numBytes, is800KHz); + +#elif defined(KENDRYTE_K210) + + k210Show(pin, pixels, numBytes, is800KHz); + +#elif defined(__ARDUINO_ARC__) + + // Arduino 101 ----------------------------------------------------------- + +#define NOPx7 \ + { \ + __builtin_arc_nop(); \ + __builtin_arc_nop(); \ + __builtin_arc_nop(); \ + __builtin_arc_nop(); \ + __builtin_arc_nop(); \ + __builtin_arc_nop(); \ + __builtin_arc_nop(); \ + } + + PinDescription *pindesc = &g_APinDescription[pin]; + register uint32_t loop = + 8 * numBytes; // one loop to handle all bytes and all bits + register uint8_t *p = pixels; + register uint32_t currByte = (uint32_t)(*p); + register uint32_t currBit = 0x80 & currByte; + register uint32_t bitCounter = 0; + register uint32_t first = 1; + + // The loop is unusual. Very first iteration puts all the way LOW to the wire + // - constant LOW does not affect NEOPIXEL, so there is no visible effect + // displayed. During that very first iteration CPU caches instructions in the + // loop. Because of the caching process, "CPU slows down". NEOPIXEL pulse is + // very time sensitive that's why we let the CPU cache first and we start + // regular pulse from 2nd iteration + if (pindesc->ulGPIOType == SS_GPIO) { + register uint32_t reg = pindesc->ulGPIOBase + SS_GPIO_SWPORTA_DR; + uint32_t reg_val = __builtin_arc_lr((volatile uint32_t)reg); + register uint32_t reg_bit_high = reg_val | (1 << pindesc->ulGPIOId); + register uint32_t reg_bit_low = reg_val & ~(1 << pindesc->ulGPIOId); + + loop += 1; // include first, special iteration + while (loop--) { + if (!first) { + currByte <<= 1; + bitCounter++; + } + + // 1 is >550ns high and >450ns low; 0 is 200..500ns high and >450ns low + __builtin_arc_sr(first ? reg_bit_low : reg_bit_high, + (volatile uint32_t)reg); + if (currBit) { // ~400ns HIGH (740ns overall) + NOPx7 NOPx7 + } + // ~340ns HIGH + NOPx7 __builtin_arc_nop(); + + // 820ns LOW; per spec, max allowed low here is 5000ns */ + __builtin_arc_sr(reg_bit_low, (volatile uint32_t)reg); + NOPx7 NOPx7 + + if (bitCounter >= 8) { + bitCounter = 0; + currByte = (uint32_t)(*++p); + } + + currBit = 0x80 & currByte; + first = 0; + } + } else if (pindesc->ulGPIOType == SOC_GPIO) { + register uint32_t reg = pindesc->ulGPIOBase + SOC_GPIO_SWPORTA_DR; + uint32_t reg_val = MMIO_REG_VAL(reg); + register uint32_t reg_bit_high = reg_val | (1 << pindesc->ulGPIOId); + register uint32_t reg_bit_low = reg_val & ~(1 << pindesc->ulGPIOId); + + loop += 1; // include first, special iteration + while (loop--) { + if (!first) { + currByte <<= 1; + bitCounter++; + } + MMIO_REG_VAL(reg) = first ? reg_bit_low : reg_bit_high; + if (currBit) { // ~430ns HIGH (740ns overall) + NOPx7 NOPx7 __builtin_arc_nop(); + } + // ~310ns HIGH + NOPx7 + + // 850ns LOW; per spec, max allowed low here is 5000ns */ + MMIO_REG_VAL(reg) = reg_bit_low; + NOPx7 NOPx7 + + if (bitCounter >= 8) { + bitCounter = 0; + currByte = (uint32_t)(*++p); + } + + currBit = 0x80 & currByte; + first = 0; + } + } + +#else +#error Architecture not supported +#endif + + // END ARCHITECTURE SELECT ------------------------------------------------ + +#if !(defined(NRF52) || defined(NRF52_SERIES) || defined(ESP32)) + interrupts(); +#endif + + endTime = micros(); // Save EOD time for latch on next call +} + +/*! + @brief Set/change the NeoPixel output pin number. Previous pin, + if any, is set to INPUT and the new pin is set to OUTPUT. + @param p Arduino pin number (-1 = no pin). +*/ +void Adafruit_NeoPixel::setPin(int16_t p) { + if (begun && (pin >= 0)) + pinMode(pin, INPUT); // Disable existing out pin + pin = p; + if (begun) { + pinMode(p, OUTPUT); + digitalWrite(p, LOW); + } +#if defined(__AVR__) + port = portOutputRegister(digitalPinToPort(p)); + pinMask = digitalPinToBitMask(p); +#endif +#if defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_ARDUINO_CORE_STM32) + gpioPort = digitalPinToPort(p); + gpioPin = STM_LL_GPIO_PIN(digitalPinToPinName(p)); +#endif +} + +/*! + @brief Set a pixel's color using separate red, green and blue + components. If using RGBW pixels, white will be set to 0. + @param n Pixel index, starting from 0. + @param r Red brightness, 0 = minimum (off), 255 = maximum. + @param g Green brightness, 0 = minimum (off), 255 = maximum. + @param b Blue brightness, 0 = minimum (off), 255 = maximum. +*/ +void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint8_t r, uint8_t g, + uint8_t b) { + + if (n < numLEDs) { + if (brightness) { // See notes in setBrightness() + r = (r * brightness) >> 8; + g = (g * brightness) >> 8; + b = (b * brightness) >> 8; + } + uint8_t *p; + if (wOffset == rOffset) { // Is an RGB-type strip + p = &pixels[n * 3]; // 3 bytes per pixel + } else { // Is a WRGB-type strip + p = &pixels[n * 4]; // 4 bytes per pixel + p[wOffset] = 0; // But only R,G,B passed -- set W to 0 + } + p[rOffset] = r; // R,G,B always stored + p[gOffset] = g; + p[bOffset] = b; + } +} + +/*! + @brief Set a pixel's color using separate red, green, blue and white + components (for RGBW NeoPixels only). + @param n Pixel index, starting from 0. + @param r Red brightness, 0 = minimum (off), 255 = maximum. + @param g Green brightness, 0 = minimum (off), 255 = maximum. + @param b Blue brightness, 0 = minimum (off), 255 = maximum. + @param w White brightness, 0 = minimum (off), 255 = maximum, ignored + if using RGB pixels. +*/ +void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint8_t r, uint8_t g, + uint8_t b, uint8_t w) { + + if (n < numLEDs) { + if (brightness) { // See notes in setBrightness() + r = (r * brightness) >> 8; + g = (g * brightness) >> 8; + b = (b * brightness) >> 8; + w = (w * brightness) >> 8; + } + uint8_t *p; + if (wOffset == rOffset) { // Is an RGB-type strip + p = &pixels[n * 3]; // 3 bytes per pixel (ignore W) + } else { // Is a WRGB-type strip + p = &pixels[n * 4]; // 4 bytes per pixel + p[wOffset] = w; // Store W + } + p[rOffset] = r; // Store R,G,B + p[gOffset] = g; + p[bOffset] = b; + } +} + +/*! + @brief Set a pixel's color using a 32-bit 'packed' RGB or RGBW value. + @param n Pixel index, starting from 0. + @param c 32-bit color value. Most significant byte is white (for RGBW + pixels) or ignored (for RGB pixels), next is red, then green, + and least significant byte is blue. +*/ +void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint32_t c) { + if (n < numLEDs) { + uint8_t *p, r = (uint8_t)(c >> 16), g = (uint8_t)(c >> 8), b = (uint8_t)c; + if (brightness) { // See notes in setBrightness() + r = (r * brightness) >> 8; + g = (g * brightness) >> 8; + b = (b * brightness) >> 8; + } + if (wOffset == rOffset) { + p = &pixels[n * 3]; + } else { + p = &pixels[n * 4]; + uint8_t w = (uint8_t)(c >> 24); + p[wOffset] = brightness ? ((w * brightness) >> 8) : w; + } + p[rOffset] = r; + p[gOffset] = g; + p[bOffset] = b; + } +} + +/*! + @brief Fill all or part of the NeoPixel strip with a color. + @param c 32-bit color value. Most significant byte is white (for + RGBW pixels) or ignored (for RGB pixels), next is red, + then green, and least significant byte is blue. If all + arguments are unspecified, this will be 0 (off). + @param first Index of first pixel to fill, starting from 0. Must be + in-bounds, no clipping is performed. 0 if unspecified. + @param count Number of pixels to fill, as a positive value. Passing + 0 or leaving unspecified will fill to end of strip. +*/ +void Adafruit_NeoPixel::fill(uint32_t c, uint16_t first, uint16_t count) { + uint16_t i, end; + + if (first >= numLEDs) { + return; // If first LED is past end of strip, nothing to do + } + + // Calculate the index ONE AFTER the last pixel to fill + if (count == 0) { + // Fill to end of strip + end = numLEDs; + } else { + // Ensure that the loop won't go past the last pixel + end = first + count; + if (end > numLEDs) + end = numLEDs; + } + + for (i = first; i < end; i++) { + this->setPixelColor(i, c); + } +} + +/*! + @brief Convert hue, saturation and value into a packed 32-bit RGB color + that can be passed to setPixelColor() or other RGB-compatible + functions. + @param hue An unsigned 16-bit value, 0 to 65535, representing one full + loop of the color wheel, which allows 16-bit hues to "roll + over" while still doing the expected thing (and allowing + more precision than the wheel() function that was common to + prior NeoPixel examples). + @param sat Saturation, 8-bit value, 0 (min or pure grayscale) to 255 + (max or pure hue). Default of 255 if unspecified. + @param val Value (brightness), 8-bit value, 0 (min / black / off) to + 255 (max or full brightness). Default of 255 if unspecified. + @return Packed 32-bit RGB with the most significant byte set to 0 -- the + white element of WRGB pixels is NOT utilized. Result is linearly + but not perceptually correct, so you may want to pass the result + through the gamma32() function (or your own gamma-correction + operation) else colors may appear washed out. This is not done + automatically by this function because coders may desire a more + refined gamma-correction function than the simplified + one-size-fits-all operation of gamma32(). Diffusing the LEDs also + really seems to help when using low-saturation colors. +*/ +uint32_t Adafruit_NeoPixel::ColorHSV(uint16_t hue, uint8_t sat, uint8_t val) { + + uint8_t r, g, b; + + // Remap 0-65535 to 0-1529. Pure red is CENTERED on the 64K rollover; + // 0 is not the start of pure red, but the midpoint...a few values above + // zero and a few below 65536 all yield pure red (similarly, 32768 is the + // midpoint, not start, of pure cyan). The 8-bit RGB hexcone (256 values + // each for red, green, blue) really only allows for 1530 distinct hues + // (not 1536, more on that below), but the full unsigned 16-bit type was + // chosen for hue so that one's code can easily handle a contiguous color + // wheel by allowing hue to roll over in either direction. + hue = (hue * 1530L + 32768) / 65536; + // Because red is centered on the rollover point (the +32768 above, + // essentially a fixed-point +0.5), the above actually yields 0 to 1530, + // where 0 and 1530 would yield the same thing. Rather than apply a + // costly modulo operator, 1530 is handled as a special case below. + + // So you'd think that the color "hexcone" (the thing that ramps from + // pure red, to pure yellow, to pure green and so forth back to red, + // yielding six slices), and with each color component having 256 + // possible values (0-255), might have 1536 possible items (6*256), + // but in reality there's 1530. This is because the last element in + // each 256-element slice is equal to the first element of the next + // slice, and keeping those in there this would create small + // discontinuities in the color wheel. So the last element of each + // slice is dropped...we regard only elements 0-254, with item 255 + // being picked up as element 0 of the next slice. Like this: + // Red to not-quite-pure-yellow is: 255, 0, 0 to 255, 254, 0 + // Pure yellow to not-quite-pure-green is: 255, 255, 0 to 1, 255, 0 + // Pure green to not-quite-pure-cyan is: 0, 255, 0 to 0, 255, 254 + // and so forth. Hence, 1530 distinct hues (0 to 1529), and hence why + // the constants below are not the multiples of 256 you might expect. + + // Convert hue to R,G,B (nested ifs faster than divide+mod+switch): + if (hue < 510) { // Red to Green-1 + b = 0; + if (hue < 255) { // Red to Yellow-1 + r = 255; + g = hue; // g = 0 to 254 + } else { // Yellow to Green-1 + r = 510 - hue; // r = 255 to 1 + g = 255; + } + } else if (hue < 1020) { // Green to Blue-1 + r = 0; + if (hue < 765) { // Green to Cyan-1 + g = 255; + b = hue - 510; // b = 0 to 254 + } else { // Cyan to Blue-1 + g = 1020 - hue; // g = 255 to 1 + b = 255; + } + } else if (hue < 1530) { // Blue to Red-1 + g = 0; + if (hue < 1275) { // Blue to Magenta-1 + r = hue - 1020; // r = 0 to 254 + b = 255; + } else { // Magenta to Red-1 + r = 255; + b = 1530 - hue; // b = 255 to 1 + } + } else { // Last 0.5 Red (quicker than % operator) + r = 255; + g = b = 0; + } + + // Apply saturation and value to R,G,B, pack into 32-bit result: + uint32_t v1 = 1 + val; // 1 to 256; allows >>8 instead of /255 + uint16_t s1 = 1 + sat; // 1 to 256; same reason + uint8_t s2 = 255 - sat; // 255 to 0 + return ((((((r * s1) >> 8) + s2) * v1) & 0xff00) << 8) | + (((((g * s1) >> 8) + s2) * v1) & 0xff00) | + (((((b * s1) >> 8) + s2) * v1) >> 8); +} + +/*! + @brief Query the color of a previously-set pixel. + @param n Index of pixel to read (0 = first). + @return 'Packed' 32-bit RGB or WRGB value. Most significant byte is white + (for RGBW pixels) or 0 (for RGB pixels), next is red, then green, + and least significant byte is blue. + @note If the strip brightness has been changed from the default value + of 255, the color read from a pixel may not exactly match what + was previously written with one of the setPixelColor() functions. + This gets more pronounced at lower brightness levels. +*/ +uint32_t Adafruit_NeoPixel::getPixelColor(uint16_t n) const { + if (n >= numLEDs) + return 0; // Out of bounds, return no color. + + uint8_t *p; + + if (wOffset == rOffset) { // Is RGB-type device + p = &pixels[n * 3]; + if (brightness) { + // Stored color was decimated by setBrightness(). Returned value + // attempts to scale back to an approximation of the original 24-bit + // value used when setting the pixel color, but there will always be + // some error -- those bits are simply gone. Issue is most + // pronounced at low brightness levels. + return (((uint32_t)(p[rOffset] << 8) / brightness) << 16) | + (((uint32_t)(p[gOffset] << 8) / brightness) << 8) | + ((uint32_t)(p[bOffset] << 8) / brightness); + } else { + // No brightness adjustment has been made -- return 'raw' color + return ((uint32_t)p[rOffset] << 16) | ((uint32_t)p[gOffset] << 8) | + (uint32_t)p[bOffset]; + } + } else { // Is RGBW-type device + p = &pixels[n * 4]; + if (brightness) { // Return scaled color + return (((uint32_t)(p[wOffset] << 8) / brightness) << 24) | + (((uint32_t)(p[rOffset] << 8) / brightness) << 16) | + (((uint32_t)(p[gOffset] << 8) / brightness) << 8) | + ((uint32_t)(p[bOffset] << 8) / brightness); + } else { // Return raw color + return ((uint32_t)p[wOffset] << 24) | ((uint32_t)p[rOffset] << 16) | + ((uint32_t)p[gOffset] << 8) | (uint32_t)p[bOffset]; + } + } +} + +/*! + @brief Adjust output brightness. Does not immediately affect what's + currently displayed on the LEDs. The next call to show() will + refresh the LEDs at this level. + @param b Brightness setting, 0=minimum (off), 255=brightest. + @note This was intended for one-time use in one's setup() function, + not as an animation effect in itself. Because of the way this + library "pre-multiplies" LED colors in RAM, changing the + brightness is often a "lossy" operation -- what you write to + pixels isn't necessary the same as what you'll read back. + Repeated brightness changes using this function exacerbate the + problem. Smart programs therefore treat the strip as a + write-only resource, maintaining their own state to render each + frame of an animation, not relying on read-modify-write. +*/ +void Adafruit_NeoPixel::setBrightness(uint8_t b) { + // Stored brightness value is different than what's passed. + // This simplifies the actual scaling math later, allowing a fast + // 8x8-bit multiply and taking the MSB. 'brightness' is a uint8_t, + // adding 1 here may (intentionally) roll over...so 0 = max brightness + // (color values are interpreted literally; no scaling), 1 = min + // brightness (off), 255 = just below max brightness. + uint8_t newBrightness = b + 1; + if (newBrightness != brightness) { // Compare against prior value + // Brightness has changed -- re-scale existing data in RAM, + // This process is potentially "lossy," especially when increasing + // brightness. The tight timing in the WS2811/WS2812 code means there + // aren't enough free cycles to perform this scaling on the fly as data + // is issued. So we make a pass through the existing color data in RAM + // and scale it (subsequent graphics commands also work at this + // brightness level). If there's a significant step up in brightness, + // the limited number of steps (quantization) in the old data will be + // quite visible in the re-scaled version. For a non-destructive + // change, you'll need to re-render the full strip data. C'est la vie. + uint8_t c, *ptr = pixels, + oldBrightness = brightness - 1; // De-wrap old brightness value + uint16_t scale; + if (oldBrightness == 0) + scale = 0; // Avoid /0 + else if (b == 255) + scale = 65535 / oldBrightness; + else + scale = (((uint16_t)newBrightness << 8) - 1) / oldBrightness; + for (uint16_t i = 0; i < numBytes; i++) { + c = *ptr; + *ptr++ = (c * scale) >> 8; + } + brightness = newBrightness; + } +} + +/*! + @brief Retrieve the last-set brightness value for the strip. + @return Brightness value: 0 = minimum (off), 255 = maximum. +*/ +uint8_t Adafruit_NeoPixel::getBrightness(void) const { return brightness - 1; } + +/*! + @brief Fill the whole NeoPixel strip with 0 / black / off. +*/ +void Adafruit_NeoPixel::clear(void) { memset(pixels, 0, numBytes); } + +// A 32-bit variant of gamma8() that applies the same function +// to all components of a packed RGB or WRGB value. +uint32_t Adafruit_NeoPixel::gamma32(uint32_t x) { + uint8_t *y = (uint8_t *)&x; + // All four bytes of a 32-bit value are filtered even if RGB (not WRGB), + // to avoid a bunch of shifting and masking that would be necessary for + // properly handling different endianisms (and each byte is a fairly + // trivial operation, so it might not even be wasting cycles vs a check + // and branch for the RGB case). In theory this might cause trouble *if* + // someone's storing information in the unused most significant byte + // of an RGB value, but this seems exceedingly rare and if it's + // encountered in reality they can mask values going in or coming out. + for (uint8_t i = 0; i < 4; i++) + y[i] = gamma8(y[i]); + return x; // Packed 32-bit return +} + +/*! + @brief Fill NeoPixel strip with one or more cycles of hues. + Everyone loves the rainbow swirl so much, now it's canon! + @param first_hue Hue of first pixel, 0-65535, representing one full + cycle of the color wheel. Each subsequent pixel will + be offset to complete one or more cycles over the + length of the strip. + @param reps Number of cycles of the color wheel over the length + of the strip. Default is 1. Negative values can be + used to reverse the hue order. + @param saturation Saturation (optional), 0-255 = gray to pure hue, + default = 255. + @param brightness Brightness/value (optional), 0-255 = off to max, + default = 255. This is distinct and in combination + with any configured global strip brightness. + @param gammify If true (default), apply gamma correction to colors + for better appearance. +*/ +void Adafruit_NeoPixel::rainbow(uint16_t first_hue, int8_t reps, + uint8_t saturation, uint8_t brightness, bool gammify) { + for (uint16_t i=0; i. + * + */ + +#ifndef ADAFRUIT_NEOPIXEL_H +#define ADAFRUIT_NEOPIXEL_H + +#ifdef ARDUINO +#if (ARDUINO >= 100) +#include +#else +#include +#include +#endif + +#ifdef USE_TINYUSB // For Serial when selecting TinyUSB +#include +#endif + +#endif + +#ifdef TARGET_LPC1768 +#include +#endif + +#if defined(ARDUINO_ARCH_RP2040) +#include +#include "hardware/pio.h" +#include "hardware/clocks.h" +#include "rp2040_pio.h" +#endif + +// The order of primary colors in the NeoPixel data stream can vary among +// device types, manufacturers and even different revisions of the same +// item. The third parameter to the Adafruit_NeoPixel constructor encodes +// the per-pixel byte offsets of the red, green and blue primaries (plus +// white, if present) in the data stream -- the following #defines provide +// an easier-to-use named version for each permutation. e.g. NEO_GRB +// indicates a NeoPixel-compatible device expecting three bytes per pixel, +// with the first byte transmitted containing the green value, second +// containing red and third containing blue. The in-memory representation +// of a chain of NeoPixels is the same as the data-stream order; no +// re-ordering of bytes is required when issuing data to the chain. +// Most of these values won't exist in real-world devices, but it's done +// this way so we're ready for it (also, if using the WS2811 driver IC, +// one might have their pixels set up in any weird permutation). + +// Bits 5,4 of this value are the offset (0-3) from the first byte of a +// pixel to the location of the red color byte. Bits 3,2 are the green +// offset and 1,0 are the blue offset. If it is an RGBW-type device +// (supporting a white primary in addition to R,G,B), bits 7,6 are the +// offset to the white byte...otherwise, bits 7,6 are set to the same value +// as 5,4 (red) to indicate an RGB (not RGBW) device. +// i.e. binary representation: +// 0bWWRRGGBB for RGBW devices +// 0bRRRRGGBB for RGB + +// RGB NeoPixel permutations; white and red offsets are always same +// Offset: W R G B +#define NEO_RGB ((0 << 6) | (0 << 4) | (1 << 2) | (2)) ///< Transmit as R,G,B +#define NEO_RBG ((0 << 6) | (0 << 4) | (2 << 2) | (1)) ///< Transmit as R,B,G +#define NEO_GRB ((1 << 6) | (1 << 4) | (0 << 2) | (2)) ///< Transmit as G,R,B +#define NEO_GBR ((2 << 6) | (2 << 4) | (0 << 2) | (1)) ///< Transmit as G,B,R +#define NEO_BRG ((1 << 6) | (1 << 4) | (2 << 2) | (0)) ///< Transmit as B,R,G +#define NEO_BGR ((2 << 6) | (2 << 4) | (1 << 2) | (0)) ///< Transmit as B,G,R + +// RGBW NeoPixel permutations; all 4 offsets are distinct +// Offset: W R G B +#define NEO_WRGB ((0 << 6) | (1 << 4) | (2 << 2) | (3)) ///< Transmit as W,R,G,B +#define NEO_WRBG ((0 << 6) | (1 << 4) | (3 << 2) | (2)) ///< Transmit as W,R,B,G +#define NEO_WGRB ((0 << 6) | (2 << 4) | (1 << 2) | (3)) ///< Transmit as W,G,R,B +#define NEO_WGBR ((0 << 6) | (3 << 4) | (1 << 2) | (2)) ///< Transmit as W,G,B,R +#define NEO_WBRG ((0 << 6) | (2 << 4) | (3 << 2) | (1)) ///< Transmit as W,B,R,G +#define NEO_WBGR ((0 << 6) | (3 << 4) | (2 << 2) | (1)) ///< Transmit as W,B,G,R + +#define NEO_RWGB ((1 << 6) | (0 << 4) | (2 << 2) | (3)) ///< Transmit as R,W,G,B +#define NEO_RWBG ((1 << 6) | (0 << 4) | (3 << 2) | (2)) ///< Transmit as R,W,B,G +#define NEO_RGWB ((2 << 6) | (0 << 4) | (1 << 2) | (3)) ///< Transmit as R,G,W,B +#define NEO_RGBW ((3 << 6) | (0 << 4) | (1 << 2) | (2)) ///< Transmit as R,G,B,W +#define NEO_RBWG ((2 << 6) | (0 << 4) | (3 << 2) | (1)) ///< Transmit as R,B,W,G +#define NEO_RBGW ((3 << 6) | (0 << 4) | (2 << 2) | (1)) ///< Transmit as R,B,G,W + +#define NEO_GWRB ((1 << 6) | (2 << 4) | (0 << 2) | (3)) ///< Transmit as G,W,R,B +#define NEO_GWBR ((1 << 6) | (3 << 4) | (0 << 2) | (2)) ///< Transmit as G,W,B,R +#define NEO_GRWB ((2 << 6) | (1 << 4) | (0 << 2) | (3)) ///< Transmit as G,R,W,B +#define NEO_GRBW ((3 << 6) | (1 << 4) | (0 << 2) | (2)) ///< Transmit as G,R,B,W +#define NEO_GBWR ((2 << 6) | (3 << 4) | (0 << 2) | (1)) ///< Transmit as G,B,W,R +#define NEO_GBRW ((3 << 6) | (2 << 4) | (0 << 2) | (1)) ///< Transmit as G,B,R,W + +#define NEO_BWRG ((1 << 6) | (2 << 4) | (3 << 2) | (0)) ///< Transmit as B,W,R,G +#define NEO_BWGR ((1 << 6) | (3 << 4) | (2 << 2) | (0)) ///< Transmit as B,W,G,R +#define NEO_BRWG ((2 << 6) | (1 << 4) | (3 << 2) | (0)) ///< Transmit as B,R,W,G +#define NEO_BRGW ((3 << 6) | (1 << 4) | (2 << 2) | (0)) ///< Transmit as B,R,G,W +#define NEO_BGWR ((2 << 6) | (3 << 4) | (1 << 2) | (0)) ///< Transmit as B,G,W,R +#define NEO_BGRW ((3 << 6) | (2 << 4) | (1 << 2) | (0)) ///< Transmit as B,G,R,W + +// Add NEO_KHZ400 to the color order value to indicate a 400 KHz device. +// All but the earliest v1 NeoPixels expect an 800 KHz data stream, this is +// the default if unspecified. Because flash space is very limited on ATtiny +// devices (e.g. Trinket, Gemma), v1 NeoPixels aren't handled by default on +// those chips, though it can be enabled by removing the ifndef/endif below, +// but code will be bigger. Conversely, can disable the NEO_KHZ400 line on +// other MCUs to remove v1 support and save a little space. + +#define NEO_KHZ800 0x0000 ///< 800 KHz data transmission +#ifndef __AVR_ATtiny85__ +#define NEO_KHZ400 0x0100 ///< 400 KHz data transmission +#endif + +// If 400 KHz support is enabled, the third parameter to the constructor +// requires a 16-bit value (in order to select 400 vs 800 KHz speed). +// If only 800 KHz is enabled (as is default on ATtiny), an 8-bit value +// is sufficient to encode pixel color order, saving some space. + +#ifdef NEO_KHZ400 +typedef uint16_t neoPixelType; ///< 3rd arg to Adafruit_NeoPixel constructor +#else +typedef uint8_t neoPixelType; ///< 3rd arg to Adafruit_NeoPixel constructor +#endif + +// These two tables are declared outside the Adafruit_NeoPixel class +// because some boards may require oldschool compilers that don't +// handle the C++11 constexpr keyword. + +/* A PROGMEM (flash mem) table containing 8-bit unsigned sine wave (0-255). + Copy & paste this snippet into a Python REPL to regenerate: +import math +for x in range(256): + print("{:3},".format(int((math.sin(x/128.0*math.pi)+1.0)*127.5+0.5))), + if x&15 == 15: print +*/ +static const uint8_t PROGMEM _NeoPixelSineTable[256] = { + 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 167, 170, + 173, 176, 179, 182, 185, 188, 190, 193, 196, 198, 201, 203, 206, 208, 211, + 213, 215, 218, 220, 222, 224, 226, 228, 230, 232, 234, 235, 237, 238, 240, + 241, 243, 244, 245, 246, 248, 249, 250, 250, 251, 252, 253, 253, 254, 254, + 254, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 253, 253, 252, 251, + 250, 250, 249, 248, 246, 245, 244, 243, 241, 240, 238, 237, 235, 234, 232, + 230, 228, 226, 224, 222, 220, 218, 215, 213, 211, 208, 206, 203, 201, 198, + 196, 193, 190, 188, 185, 182, 179, 176, 173, 170, 167, 165, 162, 158, 155, + 152, 149, 146, 143, 140, 137, 134, 131, 128, 124, 121, 118, 115, 112, 109, + 106, 103, 100, 97, 93, 90, 88, 85, 82, 79, 76, 73, 70, 67, 65, + 62, 59, 57, 54, 52, 49, 47, 44, 42, 40, 37, 35, 33, 31, 29, + 27, 25, 23, 21, 20, 18, 17, 15, 14, 12, 11, 10, 9, 7, 6, + 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9, 10, 11, + 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35, 37, + 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76, + 79, 82, 85, 88, 90, 93, 97, 100, 103, 106, 109, 112, 115, 118, 121, + 124}; + +/* Similar to above, but for an 8-bit gamma-correction table. + Copy & paste this snippet into a Python REPL to regenerate: +import math +gamma=2.6 +for x in range(256): + print("{:3},".format(int(math.pow((x)/255.0,gamma)*255.0+0.5))), + if x&15 == 15: print +*/ +static const uint8_t PROGMEM _NeoPixelGammaTable[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, + 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, + 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, + 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 34, 34, 35, + 36, 37, 38, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78, 80, 81, + 82, 84, 85, 86, 88, 89, 90, 92, 93, 94, 96, 97, 99, 100, 102, + 103, 105, 106, 108, 109, 111, 112, 114, 115, 117, 119, 120, 122, 124, 125, + 127, 129, 130, 132, 134, 136, 137, 139, 141, 143, 145, 146, 148, 150, 152, + 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, + 184, 186, 188, 191, 193, 195, 197, 199, 202, 204, 206, 209, 211, 213, 215, + 218, 220, 223, 225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 250, 252, + 255}; + +/*! + @brief Class that stores state and functions for interacting with + Adafruit NeoPixels and compatible devices. +*/ +class Adafruit_NeoPixel { + +public: + // Constructor: number of LEDs, pin number, LED type + Adafruit_NeoPixel(uint16_t n, int16_t pin = 6, + neoPixelType type = NEO_GRB + NEO_KHZ800); + Adafruit_NeoPixel(void); + ~Adafruit_NeoPixel(); + + void begin(void); + void show(void); + void setPin(int16_t p); + void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b); + void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w); + void setPixelColor(uint16_t n, uint32_t c); + void fill(uint32_t c = 0, uint16_t first = 0, uint16_t count = 0); + void setBrightness(uint8_t); + void clear(void); + void updateLength(uint16_t n); + void updateType(neoPixelType t); + /*! + @brief Check whether a call to show() will start sending data + immediately or will 'block' for a required interval. NeoPixels + require a short quiet time (about 300 microseconds) after the + last bit is received before the data 'latches' and new data can + start being received. Usually one's sketch is implicitly using + this time to generate a new frame of animation...but if it + finishes very quickly, this function could be used to see if + there's some idle time available for some low-priority + concurrent task. + @return 1 or true if show() will start sending immediately, 0 or false + if show() would block (meaning some idle time is available). + */ + bool canShow(void) { + // It's normal and possible for endTime to exceed micros() if the + // 32-bit clock counter has rolled over (about every 70 minutes). + // Since both are uint32_t, a negative delta correctly maps back to + // positive space, and it would seem like the subtraction below would + // suffice. But a problem arises if code invokes show() very + // infrequently...the micros() counter may roll over MULTIPLE times in + // that interval, the delta calculation is no longer correct and the + // next update may stall for a very long time. The check below resets + // the latch counter if a rollover has occurred. This can cause an + // extra delay of up to 300 microseconds in the rare case where a + // show() call happens precisely around the rollover, but that's + // neither likely nor especially harmful, vs. other code that might + // stall for 30+ minutes, or having to document and frequently remind + // and/or provide tech support explaining an unintuitive need for + // show() calls at least once an hour. + uint32_t now = micros(); + if (endTime > now) { + endTime = now; + } + return (now - endTime) >= 300L; + } + /*! + @brief Get a pointer directly to the NeoPixel data buffer in RAM. + Pixel data is stored in a device-native format (a la the NEO_* + constants) and is not translated here. Applications that access + this buffer will need to be aware of the specific data format + and handle colors appropriately. + @return Pointer to NeoPixel buffer (uint8_t* array). + @note This is for high-performance applications where calling + setPixelColor() on every single pixel would be too slow (e.g. + POV or light-painting projects). There is no bounds checking + on the array, creating tremendous potential for mayhem if one + writes past the ends of the buffer. Great power, great + responsibility and all that. + */ + uint8_t *getPixels(void) const { return pixels; }; + uint8_t getBrightness(void) const; + /*! + @brief Retrieve the pin number used for NeoPixel data output. + @return Arduino pin number (-1 if not set). + */ + int16_t getPin(void) const { return pin; }; + /*! + @brief Return the number of pixels in an Adafruit_NeoPixel strip object. + @return Pixel count (0 if not set). + */ + uint16_t numPixels(void) const { return numLEDs; } + uint32_t getPixelColor(uint16_t n) const; + /*! + @brief An 8-bit integer sine wave function, not directly compatible + with standard trigonometric units like radians or degrees. + @param x Input angle, 0-255; 256 would loop back to zero, completing + the circle (equivalent to 360 degrees or 2 pi radians). + One can therefore use an unsigned 8-bit variable and simply + add or subtract, allowing it to overflow/underflow and it + still does the expected contiguous thing. + @return Sine result, 0 to 255, or -128 to +127 if type-converted to + a signed int8_t, but you'll most likely want unsigned as this + output is often used for pixel brightness in animation effects. + */ + static uint8_t sine8(uint8_t x) { + return pgm_read_byte(&_NeoPixelSineTable[x]); // 0-255 in, 0-255 out + } + /*! + @brief An 8-bit gamma-correction function for basic pixel brightness + adjustment. Makes color transitions appear more perceptially + correct. + @param x Input brightness, 0 (minimum or off/black) to 255 (maximum). + @return Gamma-adjusted brightness, can then be passed to one of the + setPixelColor() functions. This uses a fixed gamma correction + exponent of 2.6, which seems reasonably okay for average + NeoPixels in average tasks. If you need finer control you'll + need to provide your own gamma-correction function instead. + */ + static uint8_t gamma8(uint8_t x) { + return pgm_read_byte(&_NeoPixelGammaTable[x]); // 0-255 in, 0-255 out + } + /*! + @brief Convert separate red, green and blue values into a single + "packed" 32-bit RGB color. + @param r Red brightness, 0 to 255. + @param g Green brightness, 0 to 255. + @param b Blue brightness, 0 to 255. + @return 32-bit packed RGB value, which can then be assigned to a + variable for later use or passed to the setPixelColor() + function. Packed RGB format is predictable, regardless of + LED strand color order. + */ + static uint32_t Color(uint8_t r, uint8_t g, uint8_t b) { + return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; + } + /*! + @brief Convert separate red, green, blue and white values into a + single "packed" 32-bit WRGB color. + @param r Red brightness, 0 to 255. + @param g Green brightness, 0 to 255. + @param b Blue brightness, 0 to 255. + @param w White brightness, 0 to 255. + @return 32-bit packed WRGB value, which can then be assigned to a + variable for later use or passed to the setPixelColor() + function. Packed WRGB format is predictable, regardless of + LED strand color order. + */ + static uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { + return ((uint32_t)w << 24) | ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; + } + static uint32_t ColorHSV(uint16_t hue, uint8_t sat = 255, uint8_t val = 255); + /*! + @brief A gamma-correction function for 32-bit packed RGB or WRGB + colors. Makes color transitions appear more perceptially + correct. + @param x 32-bit packed RGB or WRGB color. + @return Gamma-adjusted packed color, can then be passed in one of the + setPixelColor() functions. Like gamma8(), this uses a fixed + gamma correction exponent of 2.6, which seems reasonably okay + for average NeoPixels in average tasks. If you need finer + control you'll need to provide your own gamma-correction + function instead. + */ + static uint32_t gamma32(uint32_t x); + + void rainbow(uint16_t first_hue = 0, int8_t reps = 1, + uint8_t saturation = 255, uint8_t brightness = 255, + bool gammify = true); + + static neoPixelType str2order(const char *v); + +private: +#if defined(ARDUINO_ARCH_RP2040) + void rp2040Init(uint8_t pin, bool is800KHz); + void rp2040Show(uint8_t pin, uint8_t *pixels, uint32_t numBytes, bool is800KHz); +#endif + +protected: +#ifdef NEO_KHZ400 // If 400 KHz NeoPixel support enabled... + bool is800KHz; ///< true if 800 KHz pixels +#endif + bool begun; ///< true if begin() previously called + uint16_t numLEDs; ///< Number of RGB LEDs in strip + uint16_t numBytes; ///< Size of 'pixels' buffer below + int16_t pin; ///< Output pin number (-1 if not yet set) + uint8_t brightness; ///< Strip brightness 0-255 (stored as +1) + uint8_t *pixels; ///< Holds LED color values (3 or 4 bytes each) + uint8_t rOffset; ///< Red index within each 3- or 4-byte pixel + uint8_t gOffset; ///< Index of green byte + uint8_t bOffset; ///< Index of blue byte + uint8_t wOffset; ///< Index of white (==rOffset if no white) + uint32_t endTime; ///< Latch timing reference +#ifdef __AVR__ + volatile uint8_t *port; ///< Output PORT register + uint8_t pinMask; ///< Output PORT bitmask +#endif +#if defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_ARDUINO_CORE_STM32) + GPIO_TypeDef *gpioPort; ///< Output GPIO PORT + uint32_t gpioPin; ///< Output GPIO PIN +#endif +#if defined(ARDUINO_ARCH_RP2040) + PIO pio = pio0; + int sm = 0; + bool init = true; +#endif +}; + +#endif // ADAFRUIT_NEOPIXEL_H diff --git a/src/library/Adafruit_NeoPixel/CONTRIBUTING.md b/src/library/Adafruit_NeoPixel/CONTRIBUTING.md new file mode 100644 index 0000000..aa75389 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contribution Guidelines + +This library is the culmination of the expertise of many members of the open source community who have dedicated their time and hard work. The best way to ask for help or propose a new idea is to [create a new issue](https://github.com/adafruit/Adafruit_NeoPixel/issues/new) while creating a Pull Request with your code changes allows you to share your own innovations with the rest of the community. + +The following are some guidelines to observe when creating issues or PRs: + +- Be friendly; it is important that we can all enjoy a safe space as we are all working on the same project and it is okay for people to have different ideas + +- [Use code blocks](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code); it helps us help you when we can read your code! On that note also refrain from pasting more than 30 lines of code in a post, instead [create a gist](https://gist.github.com/) if you need to share large snippets + +- Use reasonable titles; refrain from using overly long or capitalized titles as they are usually annoying and do little to encourage others to help :smile: + +- Be detailed; refrain from mentioning code problems without sharing your source code and always give information regarding your board and version of the library diff --git a/src/library/Adafruit_NeoPixel/COPYING b/src/library/Adafruit_NeoPixel/COPYING new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/COPYING @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/src/library/Adafruit_NeoPixel/README.md b/src/library/Adafruit_NeoPixel/README.md new file mode 100644 index 0000000..62fef21 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/README.md @@ -0,0 +1,158 @@ +# Adafruit NeoPixel Library [![Build Status](https://github.com/adafruit/Adafruit_NeoPixel/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_NeoPixel/actions)[![Documentation](https://github.com/adafruit/ci-arduino/blob/master/assets/doxygen_badge.svg)](http://adafruit.github.io/Adafruit_NeoPixel/html/index.html) + +Arduino library for controlling single-wire-based LED pixels and strip such as the [Adafruit 60 LED/meter Digital LED strip][strip], the [Adafruit FLORA RGB Smart Pixel][flora], the [Adafruit Breadboard-friendly RGB Smart Pixel][pixel], the [Adafruit NeoPixel Stick][stick], and the [Adafruit NeoPixel Shield][shield]. + +After downloading, rename folder to 'Adafruit_NeoPixel' and install in Arduino Libraries folder. Restart Arduino IDE, then open File->Sketchbook->Library->Adafruit_NeoPixel->strandtest sketch. + +Compatibility notes: Port A is not supported on any AVR processors at this time + +[flora]: http://adafruit.com/products/1060 +[strip]: http://adafruit.com/products/1138 +[pixel]: http://adafruit.com/products/1312 +[stick]: http://adafruit.com/products/1426 +[shield]: http://adafruit.com/products/1430 + +--- + +## Installation + +### First Method + +![image](https://user-images.githubusercontent.com/36513474/68967967-3e37f480-0803-11ea-91d9-601848c306ee.png) + +1. In the Arduino IDE, navigate to Sketch > Include Library > Manage Libraries +1. Then the Library Manager will open and you will find a list of libraries that are already installed or ready for installation. +1. Then search for Neopixel strip using the search bar. +1. Click on the text area and then select the specific version and install it. + +### Second Method + +1. Navigate to the [Releases page](https://github.com/adafruit/Adafruit_NeoPixel/releases). +1. Download the latest release. +1. Extract the zip file +1. In the Arduino IDE, navigate to Sketch > Include Library > Add .ZIP Library + +## Features + +- ### Simple to use + + Controlling NeoPixels “from scratch” is quite a challenge, so we provide a library letting you focus on the fun and interesting bits. + +- ### Give back + + The library is free; you don’t have to pay for anything. Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! + +- ### Supported Chipsets + + We have included code for the following chips - sometimes these break for exciting reasons that we can't control in which case please open an issue! + + - AVR ATmega and ATtiny (any 8-bit) - 8 MHz, 12 MHz and 16 MHz + - Teensy 3.x and LC + - Arduino Due + - Arduino 101 + - ATSAMD21 (Arduino Zero/M0 and other SAMD21 boards) @ 48 MHz + - ATSAMD51 @ 120 MHz + - Adafruit STM32 Feather @ 120 MHz + - ESP8266 any speed + - ESP32 any speed + - Nordic nRF52 (Adafruit Feather nRF52), nRF51 (micro:bit) + - Infineon XMC1100 BootKit @ 32 MHz + - Infineon XMC1100 2Go @ 32 MHz + - Infineon XMC1300 BootKit @ 32 MHz + - Infineon XMC4700 RelaxKit, XMC4800 RelaxKit, XMC4800 IoT Amazon FreeRTOS Kit @ 144 MHz + + Check forks for other architectures not listed here! + +- ### GNU Lesser General Public License + + Adafruit_NeoPixel is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +## Functions + +- begin() +- updateLength() +- updateType() +- show() +- delay_ns() +- setPin() +- setPixelColor() +- fill() +- ColorHSV() +- getPixelColor() +- setBrightness() +- getBrightness() +- clear() +- gamma32() + +## Examples + +There are many examples implemented in this library. One of the examples is below. You can find other examples [here](https://github.com/adafruit/Adafruit_NeoPixel/tree/master/examples) + +### Simple + +```Cpp +#include +#ifdef __AVR__ + #include +#endif +#define PIN 6 +#define NUMPIXELS 16 + +Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); +#define DELAYVAL 500 + +void setup() { +#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000) + clock_prescale_set(clock_div_1); +#endif + + pixels.begin(); +} + +void loop() { + pixels.clear(); + + for(int i=0; i + +#if defined(ESP_IDF_VERSION) +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0) +#define HAS_ESP_IDF_4 +#endif +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) +#define HAS_ESP_IDF_5 +#endif +#endif + + + +#ifdef HAS_ESP_IDF_5 + +void espShow(uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz) { + rmt_data_t led_data[numBytes * 8]; + + if (!rmtInit(pin, RMT_TX_MODE, RMT_MEM_NUM_BLOCKS_1, 10000000)) { + log_e("Failed to init RMT TX mode on pin %d", pin); + return; + } + + int i=0; + for (int b=0; b < numBytes; b++) { + for (int bit=0; bit<8; bit++){ + if ( pixels[b] & (1<<(7-bit)) ) { + led_data[i].level0 = 1; + led_data[i].duration0 = 8; + led_data[i].level1 = 0; + led_data[i].duration1 = 4; + } else { + led_data[i].level0 = 1; + led_data[i].duration0 = 4; + led_data[i].level1 = 0; + led_data[i].duration1 = 8; + } + i++; + } + } + + //pinMode(pin, OUTPUT); // don't do this, will cause the rmt to disable! + rmtWrite(pin, led_data, numBytes * 8, RMT_WAIT_FOR_EVER); +} + + + +#else + +#include "driver/rmt.h" + + +// This code is adapted from the ESP-IDF v3.4 RMT "led_strip" example, altered +// to work with the Arduino version of the ESP-IDF (3.2) + +#define WS2812_T0H_NS (400) +#define WS2812_T0L_NS (850) +#define WS2812_T1H_NS (800) +#define WS2812_T1L_NS (450) + +#define WS2811_T0H_NS (500) +#define WS2811_T0L_NS (2000) +#define WS2811_T1H_NS (1200) +#define WS2811_T1L_NS (1300) + +static uint32_t t0h_ticks = 0; +static uint32_t t1h_ticks = 0; +static uint32_t t0l_ticks = 0; +static uint32_t t1l_ticks = 0; + +// Limit the number of RMT channels available for the Neopixels. Defaults to all +// channels (8 on ESP32, 4 on ESP32-S2 and S3). Redefining this value will free +// any channels with a higher number for other uses, such as IR send-and-recieve +// libraries. Redefine as 1 to restrict Neopixels to only a single channel. +#define ADAFRUIT_RMT_CHANNEL_MAX RMT_CHANNEL_MAX + +#define RMT_LL_HW_BASE (&RMT) + +bool rmt_reserved_channels[ADAFRUIT_RMT_CHANNEL_MAX]; + +static void IRAM_ATTR ws2812_rmt_adapter(const void *src, rmt_item32_t *dest, size_t src_size, + size_t wanted_num, size_t *translated_size, size_t *item_num) +{ + if (src == NULL || dest == NULL) { + *translated_size = 0; + *item_num = 0; + return; + } + const rmt_item32_t bit0 = {{{ t0h_ticks, 1, t0l_ticks, 0 }}}; //Logical 0 + const rmt_item32_t bit1 = {{{ t1h_ticks, 1, t1l_ticks, 0 }}}; //Logical 1 + size_t size = 0; + size_t num = 0; + uint8_t *psrc = (uint8_t *)src; + rmt_item32_t *pdest = dest; + while (size < src_size && num < wanted_num) { + for (int i = 0; i < 8; i++) { + // MSB first + if (*psrc & (1 << (7 - i))) { + pdest->val = bit1.val; + } else { + pdest->val = bit0.val; + } + num++; + pdest++; + } + size++; + psrc++; + } + *translated_size = size; + *item_num = num; +} + +void espShow(uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz) { + // Reserve channel + rmt_channel_t channel = ADAFRUIT_RMT_CHANNEL_MAX; + for (size_t i = 0; i < ADAFRUIT_RMT_CHANNEL_MAX; i++) { + if (!rmt_reserved_channels[i]) { + rmt_reserved_channels[i] = true; + channel = i; + break; + } + } + if (channel == ADAFRUIT_RMT_CHANNEL_MAX) { + // Ran out of channels! + return; + } + +#if defined(HAS_ESP_IDF_4) + rmt_config_t config = RMT_DEFAULT_CONFIG_TX(pin, channel); + config.clk_div = 2; +#else + // Match default TX config from ESP-IDF version 3.4 + rmt_config_t config = { + .rmt_mode = RMT_MODE_TX, + .channel = channel, + .gpio_num = pin, + .clk_div = 2, + .mem_block_num = 1, + .tx_config = { + .carrier_freq_hz = 38000, + .carrier_level = RMT_CARRIER_LEVEL_HIGH, + .idle_level = RMT_IDLE_LEVEL_LOW, + .carrier_duty_percent = 33, + .carrier_en = false, + .loop_en = false, + .idle_output_en = true, + } + }; +#endif + rmt_config(&config); + rmt_driver_install(config.channel, 0, 0); + + // Convert NS timings to ticks + uint32_t counter_clk_hz = 0; + +#if defined(HAS_ESP_IDF_4) + rmt_get_counter_clock(channel, &counter_clk_hz); +#else + // this emulates the rmt_get_counter_clock() function from ESP-IDF 3.4 + if (RMT_LL_HW_BASE->conf_ch[config.channel].conf1.ref_always_on == RMT_BASECLK_REF) { + uint32_t div_cnt = RMT_LL_HW_BASE->conf_ch[config.channel].conf0.div_cnt; + uint32_t div = div_cnt == 0 ? 256 : div_cnt; + counter_clk_hz = REF_CLK_FREQ / (div); + } else { + uint32_t div_cnt = RMT_LL_HW_BASE->conf_ch[config.channel].conf0.div_cnt; + uint32_t div = div_cnt == 0 ? 256 : div_cnt; + counter_clk_hz = APB_CLK_FREQ / (div); + } +#endif + + // NS to tick converter + float ratio = (float)counter_clk_hz / 1e9; + + if (is800KHz) { + t0h_ticks = (uint32_t)(ratio * WS2812_T0H_NS); + t0l_ticks = (uint32_t)(ratio * WS2812_T0L_NS); + t1h_ticks = (uint32_t)(ratio * WS2812_T1H_NS); + t1l_ticks = (uint32_t)(ratio * WS2812_T1L_NS); + } else { + t0h_ticks = (uint32_t)(ratio * WS2811_T0H_NS); + t0l_ticks = (uint32_t)(ratio * WS2811_T0L_NS); + t1h_ticks = (uint32_t)(ratio * WS2811_T1H_NS); + t1l_ticks = (uint32_t)(ratio * WS2811_T1L_NS); + } + + // Initialize automatic timing translator + rmt_translator_init(config.channel, ws2812_rmt_adapter); + + // Write and wait to finish + rmt_write_sample(config.channel, pixels, (size_t)numBytes, true); + rmt_wait_tx_done(config.channel, pdMS_TO_TICKS(100)); + + // Free channel again + rmt_driver_uninstall(config.channel); + rmt_reserved_channels[channel] = false; + + gpio_set_direction(pin, GPIO_MODE_OUTPUT); +} + +#endif // ifndef IDF5 + + +#endif // ifdef(ESP32) diff --git a/src/library/Adafruit_NeoPixel/esp8266.c b/src/library/Adafruit_NeoPixel/esp8266.c new file mode 100644 index 0000000..51c3f3c --- /dev/null +++ b/src/library/Adafruit_NeoPixel/esp8266.c @@ -0,0 +1,86 @@ +// This is a mash-up of the Due show() code + insights from Michael Miller's +// ESP8266 work for the NeoPixelBus library: github.com/Makuna/NeoPixelBus +// Needs to be a separate .c file to enforce ICACHE_RAM_ATTR execution. + +#if defined(ESP8266) + +#include +#ifdef ESP8266 +#include +#endif + +static uint32_t _getCycleCount(void) __attribute__((always_inline)); +static inline uint32_t _getCycleCount(void) { + uint32_t ccount; + __asm__ __volatile__("rsr %0,ccount":"=a" (ccount)); + return ccount; +} + +#ifdef ESP8266 +IRAM_ATTR void espShow( + uint8_t pin, uint8_t *pixels, uint32_t numBytes, __attribute__((unused)) boolean is800KHz) { +#else +void espShow( + uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz) { +#endif + +#define CYCLES_800_T0H (F_CPU / 2500001) // 0.4us +#define CYCLES_800_T1H (F_CPU / 1250001) // 0.8us +#define CYCLES_800 (F_CPU / 800001) // 1.25us per bit +#define CYCLES_400_T0H (F_CPU / 2000000) // 0.5uS +#define CYCLES_400_T1H (F_CPU / 833333) // 1.2us +#define CYCLES_400 (F_CPU / 400000) // 2.5us per bit + + uint8_t *p, *end, pix, mask; + uint32_t t, time0, time1, period, c, startTime; + +#ifdef ESP8266 + uint32_t pinMask; + pinMask = _BV(pin); +#endif + + p = pixels; + end = p + numBytes; + pix = *p++; + mask = 0x80; + startTime = 0; + +#ifdef NEO_KHZ400 + if(is800KHz) { +#endif + time0 = CYCLES_800_T0H; + time1 = CYCLES_800_T1H; + period = CYCLES_800; +#ifdef NEO_KHZ400 + } else { // 400 KHz bitstream + time0 = CYCLES_400_T0H; + time1 = CYCLES_400_T1H; + period = CYCLES_400; + } +#endif + + for(t = time0;; t = time0) { + if(pix & mask) t = time1; // Bit high duration + while(((c = _getCycleCount()) - startTime) < period); // Wait for bit start +#ifdef ESP8266 + GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, pinMask); // Set high +#else + gpio_set_level(pin, HIGH); +#endif + startTime = c; // Save start time + while(((c = _getCycleCount()) - startTime) < t); // Wait high duration +#ifdef ESP8266 + GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, pinMask); // Set low +#else + gpio_set_level(pin, LOW); +#endif + if(!(mask >>= 1)) { // Next bit/byte + if(p >= end) break; + pix = *p++; + mask = 0x80; + } + } + while((_getCycleCount() - startTime) < period); // Wait for last bit +} + +#endif // ESP8266 diff --git a/src/library/Adafruit_NeoPixel/kendyte_k210.c b/src/library/Adafruit_NeoPixel/kendyte_k210.c new file mode 100644 index 0000000..8033a36 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/kendyte_k210.c @@ -0,0 +1,74 @@ +// This is a mash-up of the Due show() code + insights from Michael Miller's +// ESP8266 work for the NeoPixelBus library: github.com/Makuna/NeoPixelBus +// Needs to be a separate .c file to enforce ICACHE_RAM_ATTR execution. +#if defined(K210) +#define KENDRYTE_K210 1 +#endif + +#if defined(KENDRYTE_K210) + +#include +#include "sysctl.h" + +void k210Show( + uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz) +{ + +#define CYCLES_800_T0H (sysctl_clock_get_freq(SYSCTL_CLOCK_CPU) / 2500000) // 0.4us +#define CYCLES_800_T1H (sysctl_clock_get_freq(SYSCTL_CLOCK_CPU) / 1250000) // 0.8us +#define CYCLES_800 (sysctl_clock_get_freq(SYSCTL_CLOCK_CPU) / 800000) // 1.25us per bit +#define CYCLES_400_T0H (sysctl_clock_get_freq(SYSCTL_CLOCK_CPU) / 2000000) // 0.5uS +#define CYCLES_400_T1H (sysctl_clock_get_freq(SYSCTL_CLOCK_CPU) / 833333) // 1.2us +#define CYCLES_400 (sysctl_clock_get_freq(SYSCTL_CLOCK_CPU) / 400000) // 2.5us per bit + + uint8_t *p, *end, pix, mask; + uint32_t t, time0, time1, period, c, startTime; + + p = pixels; + end = p + numBytes; + pix = *p++; + mask = 0x80; + startTime = 0; + +#ifdef NEO_KHZ400 + if (is800KHz) + { +#endif + time0 = CYCLES_800_T0H; + time1 = CYCLES_800_T1H; + period = CYCLES_800; +#ifdef NEO_KHZ400 + } + else + { // 400 KHz bitstream + time0 = CYCLES_400_T0H; + time1 = CYCLES_400_T1H; + period = CYCLES_400; + } +#endif + + for (t = time0;; t = time0) + { + if (pix & mask) + t = time1; // Bit high duration + while (((c = read_cycle()) - startTime) < period) + ; // Wait for bit start + digitalWrite(pin, HIGH); + startTime = c; // Save start time + while (((c = read_cycle()) - startTime) < t) + ; // Wait high duration + digitalWrite(pin, LOW); + + if (!(mask >>= 1)) + { // Next bit/byte + if (p >= end) + break; + pix = *p++; + mask = 0x80; + } + } + while ((read_cycle() - startTime) < period) + ; // Wait for last bit +} + +#endif // KENDRYTE_K210 diff --git a/src/library/Adafruit_NeoPixel/keywords.txt b/src/library/Adafruit_NeoPixel/keywords.txt new file mode 100644 index 0000000..4003ede --- /dev/null +++ b/src/library/Adafruit_NeoPixel/keywords.txt @@ -0,0 +1,72 @@ +####################################### +# Syntax Coloring Map For Adafruit_NeoPixel +####################################### +# Class +####################################### + +Adafruit_NeoPixel KEYWORD1 + +####################################### +# Methods and Functions +####################################### + +begin KEYWORD2 +show KEYWORD2 +setPin KEYWORD2 +setPixelColor KEYWORD2 +fill KEYWORD2 +setBrightness KEYWORD2 +clear KEYWORD2 +updateLength KEYWORD2 +updateType KEYWORD2 +canShow KEYWORD2 +getPixels KEYWORD2 +getBrightness KEYWORD2 +getPin KEYWORD2 +numPixels KEYWORD2 +getPixelColor KEYWORD2 +sine8 KEYWORD2 +gamma8 KEYWORD2 +Color KEYWORD2 +ColorHSV KEYWORD2 +gamma32 KEYWORD2 + +####################################### +# Constants +####################################### + +NEO_COLMASK LITERAL1 +NEO_SPDMASK LITERAL1 +NEO_KHZ800 LITERAL1 +NEO_KHZ400 LITERAL1 +NEO_RGB LITERAL1 +NEO_RBG LITERAL1 +NEO_GRB LITERAL1 +NEO_GBR LITERAL1 +NEO_BRG LITERAL1 +NEO_BGR LITERAL1 +NEO_WRGB LITERAL1 +NEO_WRBG LITERAL1 +NEO_WGRB LITERAL1 +NEO_WGBR LITERAL1 +NEO_WBRG LITERAL1 +NEO_WBGR LITERAL1 +NEO_RWGB LITERAL1 +NEO_RWBG LITERAL1 +NEO_RGWB LITERAL1 +NEO_RGBW LITERAL1 +NEO_RBWG LITERAL1 +NEO_RBGW LITERAL1 +NEO_GWRB LITERAL1 +NEO_GWBR LITERAL1 +NEO_GRWB LITERAL1 +NEO_GRBW LITERAL1 +NEO_GBWR LITERAL1 +NEO_GBRW LITERAL1 +NEO_BWRG LITERAL1 +NEO_BWGR LITERAL1 +NEO_BRWG LITERAL1 +NEO_BRGW LITERAL1 +NEO_BGWR LITERAL1 +NEO_BGRW LITERAL1 + diff --git a/src/library/Adafruit_NeoPixel/library.properties b/src/library/Adafruit_NeoPixel/library.properties new file mode 100644 index 0000000..e25f333 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/library.properties @@ -0,0 +1,10 @@ +name=Adafruit NeoPixel +version=1.12.0 +author=Adafruit +maintainer=Adafruit +sentence=Arduino library for controlling single-wire-based LED pixels and strip. +paragraph=Arduino library for controlling single-wire-based LED pixels and strip. +category=Display +url=https://github.com/adafruit/Adafruit_NeoPixel +architectures=* +includes=Adafruit_NeoPixel.h diff --git a/src/library/Adafruit_NeoPixel/rp2040_pio.h b/src/library/Adafruit_NeoPixel/rp2040_pio.h new file mode 100644 index 0000000..f7ccd46 --- /dev/null +++ b/src/library/Adafruit_NeoPixel/rp2040_pio.h @@ -0,0 +1,63 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +// Unless you know what you are doing... +// Lines 47 and 52 have been edited to set transmit bit count + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// ws2812 // +// ------ // + +#define ws2812_wrap_target 0 +#define ws2812_wrap 3 + +#define ws2812_T1 2 +#define ws2812_T2 5 +#define ws2812_T3 3 + +static const uint16_t ws2812_program_instructions[] = { + // .wrap_target + 0x6221, // 0: out x, 1 side 0 [2] + 0x1123, // 1: jmp !x, 3 side 1 [1] + 0x1400, // 2: jmp 0 side 1 [4] + 0xa442, // 3: nop side 0 [4] + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program ws2812_program = { + .instructions = ws2812_program_instructions, + .length = 4, + .origin = -1, +}; + +static inline pio_sm_config ws2812_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + ws2812_wrap_target, offset + ws2812_wrap); + sm_config_set_sideset(&c, 1, false, false); + return c; +} + +#include "hardware/clocks.h" +static inline void ws2812_program_init(PIO pio, uint sm, uint offset, uint pin, + float freq, uint bits) { + pio_gpio_init(pio, pin); + pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); + pio_sm_config c = ws2812_program_get_default_config(offset); + sm_config_set_sideset_pins(&c, pin); + sm_config_set_out_shift(&c, false, true, + bits); // <----<<< Length changed to "bits" + sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); + int cycles_per_bit = ws2812_T1 + ws2812_T2 + ws2812_T3; + float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit); + sm_config_set_clkdiv(&c, div); + pio_sm_init(pio, sm, offset, &c); + pio_sm_set_enabled(pio, sm, true); +} + +#endif diff --git a/src/library/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md b/src/library/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..f0e2614 --- /dev/null +++ b/src/library/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,46 @@ +Thank you for opening an issue on an Adafruit Arduino library repository. To +improve the speed of resolution please review the following guidelines and +common troubleshooting steps below before creating the issue: + +- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use + the forums at http://forums.adafruit.com to ask questions and troubleshoot why + something isn't working as expected. In many cases the problem is a common issue + that you will more quickly receive help from the forum community. GitHub issues + are meant for known defects in the code. If you don't know if there is a defect + in the code then start with troubleshooting on the forum first. + +- **If following a tutorial or guide be sure you didn't miss a step.** Carefully + check all of the steps and commands to run have been followed. Consult the + forum if you're unsure or have questions about steps in a guide/tutorial. + +- **For Arduino projects check these very common issues to ensure they don't apply**: + + - For uploading sketches or communicating with the board make sure you're using + a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes + very hard to tell the difference between a data and charge cable! Try using the + cable with other devices or swapping to another cable to confirm it is not + the problem. + + - **Be sure you are supplying adequate power to the board.** Check the specs of + your board and plug in an external power supply. In many cases just + plugging a board into your computer is not enough to power it and other + peripherals. + + - **Double check all soldering joints and connections.** Flakey connections + cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. + + - **Ensure you are using an official Arduino or Adafruit board.** We can't + guarantee a clone board will have the same functionality and work as expected + with this code and don't support them. + +If you're sure this issue is a defect in the code and checked the steps above +please fill in the following fields to provide enough troubleshooting information. +You may delete the guideline and text above to just leave the following details: + +- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** + +- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO + VERSION HERE** + +- List the steps to reproduce the problem below (if possible attach a sketch or + copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/src/library/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md b/src/library/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7b641eb --- /dev/null +++ b/src/library/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +Thank you for creating a pull request to contribute to Adafruit's GitHub code! +Before you open the request please review the following guidelines and tips to +help it be more easily integrated: + +- **Describe the scope of your change--i.e. what the change does and what parts + of the code were modified.** This will help us understand any risks of integrating + the code. + +- **Describe any known limitations with your change.** For example if the change + doesn't apply to a supported platform of the library please mention it. + +- **Please run any tests or examples that can exercise your modified code.** We + strive to not break users of the code and running tests/examples helps with this + process. + +Thank you again for contributing! We will try to test and integrate the change +as soon as we can, but be aware we have many GitHub repositories to manage and +can't immediately respond to every request. There is no need to bump or check in +on a pull request (it will clutter the discussion of the request). + +Also don't be worried if the request is closed or not integrated--sometimes the +priorities of Adafruit's GitHub code (education, ease of use) might not match the +priorities of the pull request. Don't fret, the open source community thrives on +forks and GitHub makes it easy to keep your changes in a forked repo. + +After reviewing the guidelines above you can delete this text from the pull request. diff --git a/src/library/Adafruit_SH110x/.github/workflows/githubci.yml b/src/library/Adafruit_SH110x/.github/workflows/githubci.yml new file mode 100644 index 0000000..b93250b --- /dev/null +++ b/src/library/Adafruit_SH110x/.github/workflows/githubci.yml @@ -0,0 +1,32 @@ +name: Arduino Library CI + +on: [pull_request, push, repository_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/setup-python@v4 + with: + python-version: '3.x' + - uses: actions/checkout@v3 + - uses: actions/checkout@v3 + with: + repository: adafruit/ci-arduino + path: ci + + - name: pre-install + run: bash ci/actions_install.sh + + - name: test platforms + run: python3 ci/build_platform.py main_platforms + + - name: clang + run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . + + - name: doxygen + env: + GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} + PRETTYNAME : "Adafruit SH110x Arduino Library" + run: bash ci/doxy_gen_and_deploy.sh diff --git a/src/library/Adafruit_SH110x/.gitignore b/src/library/Adafruit_SH110x/.gitignore new file mode 100644 index 0000000..c2a26c0 --- /dev/null +++ b/src/library/Adafruit_SH110x/.gitignore @@ -0,0 +1,4 @@ +# Our handy .gitignore for automation ease +Doxyfile* +doxygen_sqlite3.db +html diff --git a/src/library/Adafruit_SH110x/Adafruit_SH1106G.cpp b/src/library/Adafruit_SH110x/Adafruit_SH1106G.cpp new file mode 100644 index 0000000..9d1ac33 --- /dev/null +++ b/src/library/Adafruit_SH110x/Adafruit_SH1106G.cpp @@ -0,0 +1,177 @@ +/*! + * @file Adafruit_SH1106G.cpp + * + */ + +#include "Adafruit_SH110X.h" +#include "splash.h" + +// CONSTRUCTORS, DESTRUCTOR ------------------------------------------------ + +/*! + @brief Constructor for I2C-interfaced SH1106G displays. + @param w + Display width in pixels + @param h + Display height in pixels + @param twi + Pointer to an existing TwoWire instance (e.g. &Wire, the + microcontroller's primary I2C bus). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param clkDuring + Speed (in Hz) for Wire transmissions in SH110X library calls. + Defaults to 400000 (400 KHz), a known 'safe' value for most + microcontrollers, and meets the SH110X datasheet spec. + Some systems can operate I2C faster (800 KHz for ESP32, 1 MHz + for many other 32-bit MCUs), and some (perhaps not all) + SH110X's can work with this -- so it's optionally be specified + here and is not a default behavior. (Ignored if using pre-1.5.7 + Arduino software, which operates I2C at a fixed 100 KHz.) + @param clkAfter + Speed (in Hz) for Wire transmissions following SH110X library + calls. Defaults to 100000 (100 KHz), the default Arduino Wire + speed. This is done rather than leaving it at the 'during' speed + because other devices on the I2C bus might not be compatible + with the faster rate. (Ignored if using pre-1.5.7 Arduino + software, which operates I2C at a fixed 100 KHz.) + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH1106G::Adafruit_SH1106G(uint16_t w, uint16_t h, TwoWire *twi, + int8_t rst_pin, uint32_t clkDuring, + uint32_t clkAfter) + : Adafruit_SH110X(w, h, twi, rst_pin, clkDuring, clkAfter) {} + +/*! + @brief Constructor for SPI SH1106G displays, using software (bitbang) + SPI. + @param w + Display width in pixels + @param h + Display height in pixels + @param mosi_pin + MOSI (master out, slave in) pin (using Arduino pin numbering). + This transfers serial data from microcontroller to display. + @param sclk_pin + SCLK (serial clock) pin (using Arduino pin numbering). + This clocks each bit from MOSI. + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH1106G::Adafruit_SH1106G(uint16_t w, uint16_t h, int8_t mosi_pin, + int8_t sclk_pin, int8_t dc_pin, + int8_t rst_pin, int8_t cs_pin) + : Adafruit_SH110X(w, h, mosi_pin, sclk_pin, dc_pin, rst_pin, cs_pin) {} + +/*! + @brief Constructor for SPI SH1106G displays, using native hardware SPI. + @param w + Display width in pixels + @param h + Display height in pixels + @param spi + Pointer to an existing SPIClass instance (e.g. &SPI, the + microcontroller's primary SPI bus). + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @param bitrate + SPI clock rate for transfers to this display. Default if + unspecified is 8000000UL (8 MHz). + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH1106G::Adafruit_SH1106G(uint16_t w, uint16_t h, SPIClass *spi, + int8_t dc_pin, int8_t rst_pin, int8_t cs_pin, + uint32_t bitrate) + : Adafruit_SH110X(w, h, spi, dc_pin, rst_pin, cs_pin, bitrate) {} + +/*! + @brief Destructor for Adafruit_SH1106G object. +*/ +Adafruit_SH1106G::~Adafruit_SH1106G(void) {} + +/*! + @brief Allocate RAM for image buffer, initialize peripherals and pins. + @param addr + I2C address of corresponding SH110X display (or pass 0 to use + default of 0x3C for 128x32 display, 0x3D for all others). + SPI displays (hardware or software) do not use addresses, but + this argument is still required (pass 0 or any value really, + it will simply be ignored). Default if unspecified is 0. + @param reset + If true, and if the reset pin passed to the constructor is + valid, a hard reset will be performed before initializing the + display. If using multiple SH110X displays on the same bus, and + if they all share the same reset pin, you should only pass true + on the first display being initialized, false on all others, + else the already-initialized displays would be reset. Default if + unspecified is true. + @return true on successful allocation/init, false otherwise. + Well-behaved code should check the return value before + proceeding. + @note MUST call this function before any drawing or updates! +*/ +bool Adafruit_SH1106G::begin(uint8_t addr, bool reset) { + + Adafruit_GrayOLED::_init(addr, reset); + + _page_start_offset = + 2; // the SH1106 display we have found requires a small offset into memory + +#ifndef SH110X_NO_SPLASH + drawBitmap((WIDTH - splash2_width) / 2, (HEIGHT - splash2_height) / 2, + splash2_data, splash2_width, splash2_height, 1); +#endif + + // Init sequence, make sure its under 32 bytes, or split into multiples! + // clang-format off + static const uint8_t init[] = { + SH110X_DISPLAYOFF, // 0xAE + SH110X_SETDISPLAYCLOCKDIV, 0x80, // 0xD5, 0x80, + SH110X_SETMULTIPLEX, 0x3F, // 0xA8, 0x3F, + SH110X_SETDISPLAYOFFSET, 0x00, // 0xD3, 0x00, + SH110X_SETSTARTLINE, // 0x40 + SH110X_DCDC, 0x8B, // DC/DC on + SH110X_SEGREMAP + 1, // 0xA1 + SH110X_COMSCANDEC, // 0xC8 + SH110X_SETCOMPINS, 0x12, // 0xDA, 0x12, + SH110X_SETCONTRAST, 0xFF, // 0x81, 0xFF + SH110X_SETPRECHARGE, 0x1F, // 0xD9, 0x1F, + SH110X_SETVCOMDETECT, 0x40, // 0xDB, 0x40, + 0x33, // Set VPP to 9V + SH110X_NORMALDISPLAY, + SH110X_MEMORYMODE, 0x10, // 0x20, 0x00 + SH110X_DISPLAYALLON_RESUME, + }; + // clang-format on + + if (!oled_commandList(init, sizeof(init))) { + return false; + } + + delay(100); // 100ms delay recommended + oled_command(SH110X_DISPLAYON); // 0xaf + + return true; // Success +} diff --git a/src/library/Adafruit_SH110x/Adafruit_SH1107.cpp b/src/library/Adafruit_SH110x/Adafruit_SH1107.cpp new file mode 100644 index 0000000..6ef2d73 --- /dev/null +++ b/src/library/Adafruit_SH110x/Adafruit_SH1107.cpp @@ -0,0 +1,195 @@ +/*! + * @file Adafruit_SH1107.cpp + * + */ + +#include "Adafruit_SH110X.h" +#include "splash.h" + +// CONSTRUCTORS, DESTRUCTOR ------------------------------------------------ + +/*! + @brief Constructor for I2C-interfaced SH1107 displays. + @param w + Display width in pixels + @param h + Display height in pixels + @param twi + Pointer to an existing TwoWire instance (e.g. &Wire, the + microcontroller's primary I2C bus). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param clkDuring + Speed (in Hz) for Wire transmissions in SH110X library calls. + Defaults to 400000 (400 KHz), a known 'safe' value for most + microcontrollers, and meets the SH110X datasheet spec. + Some systems can operate I2C faster (800 KHz for ESP32, 1 MHz + for many other 32-bit MCUs), and some (perhaps not all) + SH110X's can work with this -- so it's optionally be specified + here and is not a default behavior. (Ignored if using pre-1.5.7 + Arduino software, which operates I2C at a fixed 100 KHz.) + @param clkAfter + Speed (in Hz) for Wire transmissions following SH110X library + calls. Defaults to 100000 (100 KHz), the default Arduino Wire + speed. This is done rather than leaving it at the 'during' speed + because other devices on the I2C bus might not be compatible + with the faster rate. (Ignored if using pre-1.5.7 Arduino + software, which operates I2C at a fixed 100 KHz.) + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH1107::Adafruit_SH1107(uint16_t w, uint16_t h, TwoWire *twi, + int8_t rst_pin, uint32_t clkDuring, + uint32_t clkAfter) + : Adafruit_SH110X(w, h, twi, rst_pin, clkDuring, clkAfter) {} + +/*! + @brief Constructor for SPI SH1107 displays, using software (bitbang) + SPI. + @param w + Display width in pixels + @param h + Display height in pixels + @param mosi_pin + MOSI (master out, slave in) pin (using Arduino pin numbering). + This transfers serial data from microcontroller to display. + @param sclk_pin + SCLK (serial clock) pin (using Arduino pin numbering). + This clocks each bit from MOSI. + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH1107::Adafruit_SH1107(uint16_t w, uint16_t h, int8_t mosi_pin, + int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin, + int8_t cs_pin) + : Adafruit_SH110X(w, h, mosi_pin, sclk_pin, dc_pin, rst_pin, cs_pin) {} + +/*! + @brief Constructor for SPI SH1107 displays, using native hardware SPI. + @param w + Display width in pixels + @param h + Display height in pixels + @param spi + Pointer to an existing SPIClass instance (e.g. &SPI, the + microcontroller's primary SPI bus). + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @param bitrate + SPI clock rate for transfers to this display. Default if + unspecified is 8000000UL (8 MHz). + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH1107::Adafruit_SH1107(uint16_t w, uint16_t h, SPIClass *spi, + int8_t dc_pin, int8_t rst_pin, int8_t cs_pin, + uint32_t bitrate) + : Adafruit_SH110X(w, h, spi, dc_pin, rst_pin, cs_pin, bitrate) {} + +/*! + @brief Destructor for Adafruit_SH1107 object. +*/ +Adafruit_SH1107::~Adafruit_SH1107(void) {} + +/*! + @brief Allocate RAM for image buffer, initialize peripherals and pins. + @param addr + I2C address of corresponding SH110X display (or pass 0 to use + default of 0x3C for 128x32 display, 0x3D for all others). + SPI displays (hardware or software) do not use addresses, but + this argument is still required (pass 0 or any value really, + it will simply be ignored). Default if unspecified is 0. + @param reset + If true, and if the reset pin passed to the constructor is + valid, a hard reset will be performed before initializing the + display. If using multiple SH110X displays on the same bus, and + if they all share the same reset pin, you should only pass true + on the first display being initialized, false on all others, + else the already-initialized displays would be reset. Default if + unspecified is true. + @return true on successful allocation/init, false otherwise. + Well-behaved code should check the return value before + proceeding. + @note MUST call this function before any drawing or updates! +*/ +bool Adafruit_SH1107::begin(uint8_t addr, bool reset) { + + Adafruit_GrayOLED::_init(addr, reset); + + setContrast(0x2F); + +#ifndef SH110X_NO_SPLASH + // the featherwing with 128x64 oled is 'rotated' so to make the splash right, + // rotate! + if (WIDTH == 64 && HEIGHT == 128) { + setRotation(1); + drawBitmap((HEIGHT - splash2_width) / 2, (WIDTH - splash2_height) / 2, + splash2_data, splash2_width, splash2_height, 1); + setRotation(0); + } + if (WIDTH == 128 && HEIGHT == 128) { + drawBitmap((HEIGHT - splash2_width) / 2, (WIDTH - splash2_height) / 2, + splash2_data, splash2_width, splash2_height, 1); + } +#endif + + // Init sequence, make sure its under 32 bytes, or split into multiples! + // clang-format off + static const uint8_t init[] = { + SH110X_DISPLAYOFF, // 0xAE + SH110X_SETDISPLAYCLOCKDIV, 0x51, // 0xd5, 0x51, + SH110X_MEMORYMODE, // 0x20 + SH110X_SETCONTRAST, 0x4F, // 0x81, 0x4F + SH110X_DCDC, 0x8A, // 0xAD, 0x8A + SH110X_SEGREMAP, // 0xA0 + SH110X_COMSCANINC, // 0xC0 + SH110X_SETDISPSTARTLINE, 0x0, // 0xDC 0x00 + SH110X_SETDISPLAYOFFSET, 0x60, // 0xd3, 0x60, + SH110X_SETPRECHARGE, 0x22, // 0xd9, 0x22, + SH110X_SETVCOMDETECT, 0x35, // 0xdb, 0x35, + SH110X_SETMULTIPLEX, 0x3F, // 0xa8, 0x3f, + // SH110X_SETPAGEADDR, // 0xb0 + // SH110X_SETCOMPINS, 0x12, // 0xda, 0x12, + SH110X_DISPLAYALLON_RESUME, // 0xa4 + SH110X_NORMALDISPLAY, // 0xa6 + }; + // clang-format on + + if (!oled_commandList(init, sizeof(init))) { + return false; + } + + if (WIDTH == 128 && HEIGHT == 128) { + static const uint8_t init_128x128[] = { + SH110X_SETDISPLAYOFFSET, 0x00, SH110X_SETMULTIPLEX, 0x7F, // 0xa8, 0x3f, + }; + if (!oled_commandList(init_128x128, sizeof(init_128x128))) { + return false; + } + } + + delay(100); // 100ms delay recommended + oled_command(SH110X_DISPLAYON); // 0xaf + + return true; // Success +} diff --git a/src/library/Adafruit_SH110x/Adafruit_SH110X.cpp b/src/library/Adafruit_SH110x/Adafruit_SH110X.cpp new file mode 100644 index 0000000..377defe --- /dev/null +++ b/src/library/Adafruit_SH110x/Adafruit_SH110X.cpp @@ -0,0 +1,250 @@ +/*! + * @file Adafruit_SH110X.cpp + * + * @mainpage Arduino library for monochrome OLEDs based on SH110X drivers. + * + * @section intro_sec Introduction + * + * This is documentation for Adafruit's SH110X library for monochrome + * OLED displays: http://www.adafruit.com/category/63_98 + * + * These displays use I2C or SPI to communicate. I2C requires 2 pins + * (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK, + * select, data/command) and optionally a reset pin. Hardware SPI or + * 'bitbang' software SPI are both supported. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * @section dependencies Dependencies + * + * This library depends on Adafruit_GFX + * being present on your system. Please make sure you have installed the latest + * version before using this library. + * + * @section author Author + * + * Written by Limor Fried/Ladyada for Adafruit Industries, with + * contributions from the open source community. + * + * @section license License + * + * BSD license, all text above, and the splash screen included below, + * must be included in any redistribution. + * + */ + +#include "Adafruit_SH110X.h" +#include "splash.h" + +// CONSTRUCTORS, DESTRUCTOR ------------------------------------------------ + +/*! + @brief Constructor for I2C-interfaced SH110X displays. + @param w + Display width in pixels + @param h + Display height in pixels + @param twi + Pointer to an existing TwoWire instance (e.g. &Wire, the + microcontroller's primary I2C bus). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param clkDuring + Speed (in Hz) for Wire transmissions in SH110X library calls. + Defaults to 400000 (400 KHz), a known 'safe' value for most + microcontrollers, and meets the SH110X datasheet spec. + Some systems can operate I2C faster (800 KHz for ESP32, 1 MHz + for many other 32-bit MCUs), and some (perhaps not all) + SH110X's can work with this -- so it's optionally be specified + here and is not a default behavior. (Ignored if using pre-1.5.7 + Arduino software, which operates I2C at a fixed 100 KHz.) + @param clkAfter + Speed (in Hz) for Wire transmissions following SH110X library + calls. Defaults to 100000 (100 KHz), the default Arduino Wire + speed. This is done rather than leaving it at the 'during' speed + because other devices on the I2C bus might not be compatible + with the faster rate. (Ignored if using pre-1.5.7 Arduino + software, which operates I2C at a fixed 100 KHz.) + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH110X::Adafruit_SH110X(uint16_t w, uint16_t h, TwoWire *twi, + int8_t rst_pin, uint32_t clkDuring, + uint32_t clkAfter) + : Adafruit_GrayOLED(1, w, h, twi, rst_pin, clkDuring, clkAfter) {} + +/*! + @brief Constructor for SPI SH110X displays, using software (bitbang) + SPI. + @param w + Display width in pixels + @param h + Display height in pixels + @param mosi_pin + MOSI (master out, slave in) pin (using Arduino pin numbering). + This transfers serial data from microcontroller to display. + @param sclk_pin + SCLK (serial clock) pin (using Arduino pin numbering). + This clocks each bit from MOSI. + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH110X::Adafruit_SH110X(uint16_t w, uint16_t h, int8_t mosi_pin, + int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin, + int8_t cs_pin) + : Adafruit_GrayOLED(1, w, h, mosi_pin, sclk_pin, dc_pin, rst_pin, cs_pin) {} + +/*! + @brief Constructor for SPI SH110X displays, using native hardware SPI. + @param w + Display width in pixels + @param h + Display height in pixels + @param spi + Pointer to an existing SPIClass instance (e.g. &SPI, the + microcontroller's primary SPI bus). + @param dc_pin + Data/command pin (using Arduino pin numbering), selects whether + display is receiving commands (low) or data (high). + @param rst_pin + Reset pin (using Arduino pin numbering), or -1 if not used + (some displays might be wired to share the microcontroller's + reset pin). + @param cs_pin + Chip-select pin (using Arduino pin numbering) for sharing the + bus with other devices. Active low. + @param bitrate + SPI clock rate for transfers to this display. Default if + unspecified is 8000000UL (8 MHz). + @note Call the object's begin() function before use -- buffer + allocation is performed there! +*/ +Adafruit_SH110X::Adafruit_SH110X(uint16_t w, uint16_t h, SPIClass *spi, + int8_t dc_pin, int8_t rst_pin, int8_t cs_pin, + uint32_t bitrate) + : Adafruit_GrayOLED(1, w, h, spi, dc_pin, rst_pin, cs_pin, bitrate) {} + +/*! + @brief Destructor for Adafruit_SH110X object. +*/ +Adafruit_SH110X::~Adafruit_SH110X(void) {} + +// REFRESH DISPLAY --------------------------------------------------------- + +/*! + @brief Push data currently in RAM to SH110X display. + @note Drawing operations are not visible until this function is + called. Call after each graphics command, or after a whole set + of graphics commands, as best needed by one's own application. +*/ +void Adafruit_SH110X::display(void) { + // ESP8266 needs a periodic yield() call to avoid watchdog reset. + // With the limited size of SH110X displays, and the fast bitrate + // being used (1 MHz or more), I think one yield() immediately before + // a screen write and one immediately after should cover it. But if + // not, if this becomes a problem, yields() might be added in the + // 32-byte transfer condition below. + yield(); + + // uint16_t count = WIDTH * ((HEIGHT + 7) / 8); + uint8_t *ptr = buffer; + uint8_t dc_byte = 0x40; + uint8_t pages = ((HEIGHT + 7) / 8); + + uint8_t bytes_per_page = WIDTH; + + /* + Serial.print("Window: ("); + Serial.print(window_x1); + Serial.print(", "); + Serial.print(window_y1); + Serial.print(" -> ("); + Serial.print(window_x2); + Serial.print(", "); + Serial.print(window_y2); + Serial.println(")"); + */ + + uint8_t first_page = window_y1 / 8; + // uint8_t last_page = (window_y2 + 7) / 8; + uint8_t page_start = min(bytes_per_page, (uint8_t)window_x1); + uint8_t page_end = (uint8_t)max((int)0, (int)window_x2); + /* + Serial.print("Pages: "); + Serial.print(first_page); + Serial.print(" -> "); + Serial.println(last_page); + pages = min(pages, last_page); + + Serial.print("Page addr: "); + Serial.print(page_start); + Serial.print(" -> "); + Serial.println(page_end); + */ + + for (uint8_t p = first_page; p < pages; p++) { + uint8_t bytes_remaining = bytes_per_page; + ptr = buffer + (uint16_t)p * (uint16_t)bytes_per_page; + // fast forward to dirty rectangle beginning + ptr += page_start; + bytes_remaining -= page_start; + // cut off end of dirty rectangle + bytes_remaining -= (WIDTH - 1) - page_end; + + if (i2c_dev) { // I2C + uint16_t maxbuff = i2c_dev->maxBufferSize() - 1; + + uint8_t cmd[] = { + 0x00, (uint8_t)(SH110X_SETPAGEADDR + p), + (uint8_t)(0x10 + ((page_start + _page_start_offset) >> 4)), + (uint8_t)((page_start + _page_start_offset) & 0xF)}; + + // Set high speed clk + i2c_dev->setSpeed(i2c_preclk); + + i2c_dev->write(cmd, 4); + + while (bytes_remaining) { + uint8_t to_write = min(bytes_remaining, (uint8_t)maxbuff); + i2c_dev->write(ptr, to_write, true, &dc_byte, 1); + ptr += to_write; + bytes_remaining -= to_write; + yield(); + } + + // Set low speed clk + i2c_dev->setSpeed(i2c_postclk); + + } else { // SPI + uint8_t cmd[] = { + (uint8_t)(SH110X_SETPAGEADDR + p), + (uint8_t)(0x10 + ((page_start + _page_start_offset) >> 4)), + (uint8_t)((page_start + _page_start_offset) & 0xF)}; + + digitalWrite(dcPin, LOW); + spi_dev->write(cmd, 3); + digitalWrite(dcPin, HIGH); + spi_dev->write(ptr, bytes_remaining); + } + } + // reset dirty window + window_x1 = 1024; + window_y1 = 1024; + window_x2 = -1; + window_y2 = -1; +} diff --git a/src/library/Adafruit_SH110x/Adafruit_SH110X.h b/src/library/Adafruit_SH110x/Adafruit_SH110X.h new file mode 100644 index 0000000..0ac0cc3 --- /dev/null +++ b/src/library/Adafruit_SH110x/Adafruit_SH110X.h @@ -0,0 +1,133 @@ +/*! + * @file Adafruit_SH110X.h + * + * This is part of for Adafruit's SH110X library for monochrome + * OLED displays: http://www.adafruit.com/category/63_98 + * + * These displays use I2C or SPI to communicate. I2C requires 2 pins + * (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK, + * select, data/command) and optionally a reset pin. Hardware SPI or + * 'bitbang' software SPI are both supported. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Written by Limor Fried/Ladyada for Adafruit Industries, with + * contributions from the open source community. + * + * BSD license, all text above, and the splash screen header file, + * must be included in any redistribution. + * + */ + +#ifndef _Adafruit_SH110X_H_ +#define _Adafruit_SH110X_H_ + +#include "../Adafruit-GFX-Library/Adafruit_GrayOLED.h" + +/// fit into the SH110X_ naming scheme +#define SH110X_BLACK 0 ///< Draw 'off' pixels +#define SH110X_WHITE 1 ///< Draw 'on' pixels +#define SH110X_INVERSE 2 ///< Invert pixels + +// Uncomment to disable Adafruit splash logo +//#define SH110X_NO_SPLASH + +#define SH110X_MEMORYMODE 0x20 ///< See datasheet +#define SH110X_COLUMNADDR 0x21 ///< See datasheet +#define SH110X_PAGEADDR 0x22 ///< See datasheet +#define SH110X_SETCONTRAST 0x81 ///< See datasheet +#define SH110X_CHARGEPUMP 0x8D ///< See datasheet +#define SH110X_SEGREMAP 0xA0 ///< See datasheet +#define SH110X_DISPLAYALLON_RESUME 0xA4 ///< See datasheet +#define SH110X_DISPLAYALLON 0xA5 ///< Not currently used +#define SH110X_NORMALDISPLAY 0xA6 ///< See datasheet +#define SH110X_INVERTDISPLAY 0xA7 ///< See datasheet +#define SH110X_SETMULTIPLEX 0xA8 ///< See datasheet +#define SH110X_DCDC 0xAD ///< See datasheet +#define SH110X_DISPLAYOFF 0xAE ///< See datasheet +#define SH110X_DISPLAYON 0xAF ///< See datasheet +#define SH110X_SETPAGEADDR \ + 0xB0 ///< Specify page address to load display RAM data to page address + ///< register +#define SH110X_COMSCANINC 0xC0 ///< Not currently used +#define SH110X_COMSCANDEC 0xC8 ///< See datasheet +#define SH110X_SETDISPLAYOFFSET 0xD3 ///< See datasheet +#define SH110X_SETDISPLAYCLOCKDIV 0xD5 ///< See datasheet +#define SH110X_SETPRECHARGE 0xD9 ///< See datasheet +#define SH110X_SETCOMPINS 0xDA ///< See datasheet +#define SH110X_SETVCOMDETECT 0xDB ///< See datasheet +#define SH110X_SETDISPSTARTLINE \ + 0xDC ///< Specify Column address to determine the initial display line or + ///< COM0. + +#define SH110X_SETLOWCOLUMN 0x00 ///< Not currently used +#define SH110X_SETHIGHCOLUMN 0x10 ///< Not currently used +#define SH110X_SETSTARTLINE 0x40 ///< See datasheet + +/*! + @brief Class that stores state and functions for interacting with + SH110X OLED displays. Not instantiatable - use a subclass! +*/ +class Adafruit_SH110X : public Adafruit_GrayOLED { +public: + // NEW CONSTRUCTORS -- recommended for new projects + Adafruit_SH110X(uint16_t w, uint16_t h, TwoWire *twi = &Wire, + int8_t rst_pin = -1, uint32_t preclk = 400000, + uint32_t postclk = 100000); + Adafruit_SH110X(uint16_t w, uint16_t h, int8_t mosi_pin, int8_t sclk_pin, + int8_t dc_pin, int8_t rst_pin, int8_t cs_pin); + Adafruit_SH110X(uint16_t w, uint16_t h, SPIClass *spi, int8_t dc_pin, + int8_t rst_pin, int8_t cs_pin, uint32_t bitrate = 8000000UL); + + virtual ~Adafruit_SH110X(void) = 0; + + void display(void); + +protected: + /*! some displays are 'inset' in memory, so we have to skip some memory to + * display */ + uint8_t _page_start_offset = 0; + +private: +}; + +/*! + @brief Class that stores state and functions for interacting with + SH1106G OLED displays. +*/ +class Adafruit_SH1106G : public Adafruit_SH110X { +public: + Adafruit_SH1106G(uint16_t w, uint16_t h, TwoWire *twi = &Wire, + int8_t rst_pin = -1, uint32_t preclk = 400000, + uint32_t postclk = 100000); + Adafruit_SH1106G(uint16_t w, uint16_t h, int8_t mosi_pin, int8_t sclk_pin, + int8_t dc_pin, int8_t rst_pin, int8_t cs_pin); + Adafruit_SH1106G(uint16_t w, uint16_t h, SPIClass *spi, int8_t dc_pin, + int8_t rst_pin, int8_t cs_pin, uint32_t bitrate = 8000000UL); + + ~Adafruit_SH1106G(void); + + bool begin(uint8_t i2caddr = 0x3C, bool reset = true); +}; + +/*! + @brief Class that stores state and functions for interacting with + SH1107 OLED displays. +*/ +class Adafruit_SH1107 : public Adafruit_SH110X { +public: + Adafruit_SH1107(uint16_t w, uint16_t h, TwoWire *twi = &Wire, + int8_t rst_pin = -1, uint32_t preclk = 400000, + uint32_t postclk = 100000); + Adafruit_SH1107(uint16_t w, uint16_t h, int8_t mosi_pin, int8_t sclk_pin, + int8_t dc_pin, int8_t rst_pin, int8_t cs_pin); + Adafruit_SH1107(uint16_t w, uint16_t h, SPIClass *spi, int8_t dc_pin, + int8_t rst_pin, int8_t cs_pin, uint32_t bitrate = 8000000UL); + + ~Adafruit_SH1107(void); + + bool begin(uint8_t i2caddr = 0x3C, bool reset = true); +}; +#endif // _Adafruit_SH110X_H_ diff --git a/src/library/Adafruit_SH110x/README.md b/src/library/Adafruit_SH110x/README.md new file mode 100644 index 0000000..6aa6016 --- /dev/null +++ b/src/library/Adafruit_SH110x/README.md @@ -0,0 +1,19 @@ +[![Build Status](https://github.com/adafruit/Adafruit_SH110X/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_SH110X/actions) + +This is a library for our Monochrome OLEDs based on SH110X drivers + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/category/63_98 + +These displays use I2C or SPI to communicate, 2 to 5 pins are required to interface. + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information. All text above must be included in any redistribution + +Preferred installation method is to use the Arduino IDE Library Manager. To download the source from Github instead, click "Clone or download" above, then "Download ZIP." After uncompressing, rename the resulting folder Adafruit_SH110X. Check that the Adafruit_SH110X folder contains Adafruit_SH110X.cpp and Adafruit_SH110X.h. + +You will also have to install the **Adafruit GFX library** which provides graphics primitves such as lines, circles, text, etc. This also can be found in the Arduino Library Manager, or you can get the source from https://github.com/adafruit/Adafruit-GFX-Library diff --git a/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino b/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino new file mode 100644 index 0000000..8c92358 --- /dev/null +++ b/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino @@ -0,0 +1,357 @@ +/********************************************************************* + This is an example for our Monochrome OLEDs based on SH110X drivers + + This example is for a 128x64 size display using SPi to communicate + 5 pins are required to interface + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + BSD license, check license.txt for more information + All text above, and the splash screen must be included in any redistribution + + SPi SH1106 modified by Rupert Hirst 12/09/21 +*********************************************************************/ + + + +#include +#include +#include +#include + + +#define OLED_MOSI 10 +#define OLED_CLK 8 +#define OLED_DC 7 +#define OLED_CS 5 +#define OLED_RST 9 + + +// Create the OLED display +Adafruit_SH1106G display = Adafruit_SH1106G(128, 64,OLED_MOSI, OLED_CLK, OLED_DC, OLED_RST, OLED_CS); + + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + + +#define LOGO16_GLCD_HEIGHT 16 +#define LOGO16_GLCD_WIDTH 16 +static const unsigned char PROGMEM logo16_glcd_bmp[] = +{ B00000000, B11000000, + B00000001, B11000000, + B00000001, B11000000, + B00000011, B11100000, + B11110011, B11100000, + B11111110, B11111000, + B01111110, B11111111, + B00110011, B10011111, + B00011111, B11111100, + B00001101, B01110000, + B00011011, B10100000, + B00111111, B11100000, + B00111111, B11110000, + B01111100, B11110000, + B01110000, B01110000, + B00000000, B00110000 +}; + + +void setup() { + Serial.begin(9600); + + //display.setContrast (0); // dim display + + // Start OLED + display.begin(0, true); // we dont use the i2c address but we will reset! + + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, SH110X_WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + // draw many lines + testdrawline(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw rectangles + testdrawrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw multiple rectangles + testfillrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw mulitple circles + testdrawcircle(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw a SH110X_WHITE circle, 10 pixel radius + display.fillCircle(display.width() / 2, display.height() / 2, 10, SH110X_WHITE); + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawroundrect(); + delay(2000); + display.clearDisplay(); + + testfillroundrect(); + delay(2000); + display.clearDisplay(); + + testdrawtriangle(); + delay(2000); + display.clearDisplay(); + + testfilltriangle(); + delay(2000); + display.clearDisplay(); + + // draw the first ~12 characters in the font + testdrawchar(); + display.display(); + delay(2000); + display.clearDisplay(); + + + // text display tests + display.setTextSize(1); + display.setTextColor(SH110X_WHITE); + display.setCursor(0, 0); + display.println("Failure is always an option"); + display.setTextColor(SH110X_BLACK, SH110X_WHITE); // 'inverted' text + display.println(3.141592); + display.setTextSize(2); + display.setTextColor(SH110X_WHITE); + display.print("0x"); display.println(0xDEADBEEF, HEX); + display.display(); + delay(2000); + display.clearDisplay(); + + // miniature bitmap display + display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); + display.display(); + delay(1); + + // invert the display + display.invertDisplay(true); + delay(1000); + display.invertDisplay(false); + delay(1000); + display.clearDisplay(); + + // draw a bitmap icon and 'animate' movement + testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); +} + + +void loop() { + +} + + +void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { + uint8_t icons[NUMFLAKES][3]; + + // initialize + for (uint8_t f = 0; f < NUMFLAKES; f++) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + + Serial.print("x: "); + Serial.print(icons[f][XPOS], DEC); + Serial.print(" y: "); + Serial.print(icons[f][YPOS], DEC); + Serial.print(" dy: "); + Serial.println(icons[f][DELTAY], DEC); + } + + while (1) { + // draw each icon + for (uint8_t f = 0; f < NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SH110X_WHITE); + } + display.display(); + delay(200); + + // then erase it + move it + for (uint8_t f = 0; f < NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SH110X_BLACK); + // move it + icons[f][YPOS] += icons[f][DELTAY]; + // if its gone, reinit + if (icons[f][YPOS] > display.height()) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + } + } + } +} + + +void testdrawchar(void) { + display.setTextSize(1); + display.setTextColor(SH110X_WHITE); + display.setCursor(0, 0); + + for (uint8_t i = 0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } + display.display(); + delay(1); +} + +void testdrawcircle(void) { + for (int16_t i = 0; i < display.height(); i += 2) { + display.drawCircle(display.width() / 2, display.height() / 2, i, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testfillrect(void) { + uint8_t color = 1; + for (int16_t i = 0; i < display.height() / 2; i += 3) { + // alternate colors + display.fillRect(i, i, display.width() - i * 2, display.height() - i * 2, color % 2); + display.display(); + delay(1); + color++; + } +} + +void testdrawtriangle(void) { + for (int16_t i = 0; i < min(display.width(), display.height()) / 2; i += 5) { + display.drawTriangle(display.width() / 2, display.height() / 2 - i, + display.width() / 2 - i, display.height() / 2 + i, + display.width() / 2 + i, display.height() / 2 + i, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testfilltriangle(void) { + uint8_t color = SH110X_WHITE; + for (int16_t i = min(display.width(), display.height()) / 2; i > 0; i -= 5) { + display.fillTriangle(display.width() / 2, display.height() / 2 - i, + display.width() / 2 - i, display.height() / 2 + i, + display.width() / 2 + i, display.height() / 2 + i, SH110X_WHITE); + if (color == SH110X_WHITE) color = SH110X_BLACK; + else color = SH110X_WHITE; + display.display(); + delay(1); + } +} + +void testdrawroundrect(void) { + for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) { + display.drawRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i, display.height() / 4, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testfillroundrect(void) { + uint8_t color = SH110X_WHITE; + for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) { + display.fillRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i, display.height() / 4, color); + if (color == SH110X_WHITE) color = SH110X_BLACK; + else color = SH110X_WHITE; + display.display(); + delay(1); + } +} + +void testdrawrect(void) { + for (int16_t i = 0; i < display.height() / 2; i += 2) { + display.drawRect(i, i, display.width() - 2 * i, display.height() - 2 * i, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testdrawline() { + for (int16_t i = 0; i < display.width(); i += 4) { + display.drawLine(0, 0, i, display.height() - 1, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = 0; i < display.height(); i += 4) { + display.drawLine(0, 0, display.width() - 1, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i = 0; i < display.width(); i += 4) { + display.drawLine(0, display.height() - 1, i, 0, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = display.height() - 1; i >= 0; i -= 4) { + display.drawLine(0, display.height() - 1, display.width() - 1, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i = display.width() - 1; i >= 0; i -= 4) { + display.drawLine(display.width() - 1, display.height() - 1, i, 0, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = display.height() - 1; i >= 0; i -= 4) { + display.drawLine(display.width() - 1, display.height() - 1, 0, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i = 0; i < display.height(); i += 4) { + display.drawLine(display.width() - 1, 0, 0, i, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = 0; i < display.width(); i += 4) { + display.drawLine(display.width() - 1, 0, i, display.height() - 1, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); +} diff --git a/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino b/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino new file mode 100644 index 0000000..c7f424f --- /dev/null +++ b/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino @@ -0,0 +1,356 @@ +/********************************************************************* + This is an example for our Monochrome OLEDs based on SH110X drivers + + This example is for a 128x64 size display using I2C to communicate + 3 pins are required to interface (2 I2C and one reset) + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + BSD license, check license.txt for more information + All text above, and the splash screen must be included in any redistribution + + i2c SH1106 modified by Rupert Hirst 12/09/21 +*********************************************************************/ + + + +#include +#include +#include +#include + +/* Uncomment the initialize the I2C address , uncomment only one, If you get a totally blank screen try the other*/ +#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's +//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's + +#define SCREEN_WIDTH 128 // OLED display width, in pixels +#define SCREEN_HEIGHT 64 // OLED display height, in pixels +#define OLED_RESET -1 // QT-PY / XIAO +Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + + +#define LOGO16_GLCD_HEIGHT 16 +#define LOGO16_GLCD_WIDTH 16 +static const unsigned char PROGMEM logo16_glcd_bmp[] = +{ B00000000, B11000000, + B00000001, B11000000, + B00000001, B11000000, + B00000011, B11100000, + B11110011, B11100000, + B11111110, B11111000, + B01111110, B11111111, + B00110011, B10011111, + B00011111, B11111100, + B00001101, B01110000, + B00011011, B10100000, + B00111111, B11100000, + B00111111, B11110000, + B01111100, B11110000, + B01110000, B01110000, + B00000000, B00110000 +}; + + +void setup() { + + Serial.begin(9600); + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + + delay(250); // wait for the OLED to power up + display.begin(i2c_Address, true); // Address 0x3C default + //display.setContrast (0); // dim display + + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, SH110X_WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + // draw many lines + testdrawline(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw rectangles + testdrawrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw multiple rectangles + testfillrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw mulitple circles + testdrawcircle(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw a SH110X_WHITE circle, 10 pixel radius + display.fillCircle(display.width() / 2, display.height() / 2, 10, SH110X_WHITE); + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawroundrect(); + delay(2000); + display.clearDisplay(); + + testfillroundrect(); + delay(2000); + display.clearDisplay(); + + testdrawtriangle(); + delay(2000); + display.clearDisplay(); + + testfilltriangle(); + delay(2000); + display.clearDisplay(); + + // draw the first ~12 characters in the font + testdrawchar(); + display.display(); + delay(2000); + display.clearDisplay(); + + + + // text display tests + display.setTextSize(1); + display.setTextColor(SH110X_WHITE); + display.setCursor(0, 0); + display.println("Failure is always an option"); + display.setTextColor(SH110X_BLACK, SH110X_WHITE); // 'inverted' text + display.println(3.141592); + display.setTextSize(2); + display.setTextColor(SH110X_WHITE); + display.print("0x"); display.println(0xDEADBEEF, HEX); + display.display(); + delay(2000); + display.clearDisplay(); + + // miniature bitmap display + display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); + display.display(); + delay(1); + + // invert the display + display.invertDisplay(true); + delay(1000); + display.invertDisplay(false); + delay(1000); + display.clearDisplay(); + + // draw a bitmap icon and 'animate' movement + testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); +} + + +void loop() { + +} + + +void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { + uint8_t icons[NUMFLAKES][3]; + + // initialize + for (uint8_t f = 0; f < NUMFLAKES; f++) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + + Serial.print("x: "); + Serial.print(icons[f][XPOS], DEC); + Serial.print(" y: "); + Serial.print(icons[f][YPOS], DEC); + Serial.print(" dy: "); + Serial.println(icons[f][DELTAY], DEC); + } + + while (1) { + // draw each icon + for (uint8_t f = 0; f < NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SH110X_WHITE); + } + display.display(); + delay(200); + + // then erase it + move it + for (uint8_t f = 0; f < NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SH110X_BLACK); + // move it + icons[f][YPOS] += icons[f][DELTAY]; + // if its gone, reinit + if (icons[f][YPOS] > display.height()) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + } + } + } +} + + +void testdrawchar(void) { + display.setTextSize(1); + display.setTextColor(SH110X_WHITE); + display.setCursor(0, 0); + + for (uint8_t i = 0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } + display.display(); + delay(1); +} + +void testdrawcircle(void) { + for (int16_t i = 0; i < display.height(); i += 2) { + display.drawCircle(display.width() / 2, display.height() / 2, i, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testfillrect(void) { + uint8_t color = 1; + for (int16_t i = 0; i < display.height() / 2; i += 3) { + // alternate colors + display.fillRect(i, i, display.width() - i * 2, display.height() - i * 2, color % 2); + display.display(); + delay(1); + color++; + } +} + +void testdrawtriangle(void) { + for (int16_t i = 0; i < min(display.width(), display.height()) / 2; i += 5) { + display.drawTriangle(display.width() / 2, display.height() / 2 - i, + display.width() / 2 - i, display.height() / 2 + i, + display.width() / 2 + i, display.height() / 2 + i, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testfilltriangle(void) { + uint8_t color = SH110X_WHITE; + for (int16_t i = min(display.width(), display.height()) / 2; i > 0; i -= 5) { + display.fillTriangle(display.width() / 2, display.height() / 2 - i, + display.width() / 2 - i, display.height() / 2 + i, + display.width() / 2 + i, display.height() / 2 + i, SH110X_WHITE); + if (color == SH110X_WHITE) color = SH110X_BLACK; + else color = SH110X_WHITE; + display.display(); + delay(1); + } +} + +void testdrawroundrect(void) { + for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) { + display.drawRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i, display.height() / 4, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testfillroundrect(void) { + uint8_t color = SH110X_WHITE; + for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) { + display.fillRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i, display.height() / 4, color); + if (color == SH110X_WHITE) color = SH110X_BLACK; + else color = SH110X_WHITE; + display.display(); + delay(1); + } +} + +void testdrawrect(void) { + for (int16_t i = 0; i < display.height() / 2; i += 2) { + display.drawRect(i, i, display.width() - 2 * i, display.height() - 2 * i, SH110X_WHITE); + display.display(); + delay(1); + } +} + +void testdrawline() { + for (int16_t i = 0; i < display.width(); i += 4) { + display.drawLine(0, 0, i, display.height() - 1, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = 0; i < display.height(); i += 4) { + display.drawLine(0, 0, display.width() - 1, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i = 0; i < display.width(); i += 4) { + display.drawLine(0, display.height() - 1, i, 0, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = display.height() - 1; i >= 0; i -= 4) { + display.drawLine(0, display.height() - 1, display.width() - 1, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i = display.width() - 1; i >= 0; i -= 4) { + display.drawLine(display.width() - 1, display.height() - 1, i, 0, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = display.height() - 1; i >= 0; i -= 4) { + display.drawLine(display.width() - 1, display.height() - 1, 0, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i = 0; i < display.height(); i += 4) { + display.drawLine(display.width() - 1, 0, 0, i, SH110X_WHITE); + display.display(); + delay(1); + } + for (int16_t i = 0; i < display.width(); i += 4) { + display.drawLine(display.width() - 1, 0, i, display.height() - 1, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); +} diff --git a/src/library/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino b/src/library/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino new file mode 100644 index 0000000..2de288c --- /dev/null +++ b/src/library/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino @@ -0,0 +1,79 @@ +#include +#include +#include +#include + +Adafruit_SH1107 display = Adafruit_SH1107(64, 128, &Wire); + +// OLED FeatherWing buttons map to different pins depending on board: +#if defined(ESP8266) + #define BUTTON_A 0 + #define BUTTON_B 16 + #define BUTTON_C 2 +#elif defined(ESP32) && !defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) + #define BUTTON_A 15 + #define BUTTON_B 32 + #define BUTTON_C 14 +#elif defined(ARDUINO_STM32_FEATHER) + #define BUTTON_A PA15 + #define BUTTON_B PC7 + #define BUTTON_C PC5 +#elif defined(TEENSYDUINO) + #define BUTTON_A 4 + #define BUTTON_B 3 + #define BUTTON_C 8 +#elif defined(ARDUINO_NRF52832_FEATHER) + #define BUTTON_A 31 + #define BUTTON_B 30 + #define BUTTON_C 27 +#else // 32u4, M0, M4, nrf52840, esp32-s2 and 328p + #define BUTTON_A 9 + #define BUTTON_B 6 + #define BUTTON_C 5 +#endif + +void setup() { + Serial.begin(115200); + + Serial.println("128x64 OLED FeatherWing test"); + delay(250); // wait for the OLED to power up + display.begin(0x3C, true); // Address 0x3C default + + Serial.println("OLED begun"); + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + display.display(); + delay(1000); + + // Clear the buffer. + display.clearDisplay(); + display.display(); + + display.setRotation(1); + Serial.println("Button test"); + + pinMode(BUTTON_A, INPUT_PULLUP); + pinMode(BUTTON_B, INPUT_PULLUP); + pinMode(BUTTON_C, INPUT_PULLUP); + + // text display tests + display.setTextSize(1); + display.setTextColor(SH110X_WHITE); + display.setCursor(0,0); + display.print("Connecting to SSID\n'adafruit':"); + display.print("connected!"); + display.println("IP: 10.0.1.23"); + display.println("Sending val #0"); + display.display(); // actually display all of the above +} + +void loop() { + if(!digitalRead(BUTTON_A)) display.print("A"); + if(!digitalRead(BUTTON_B)) display.print("B"); + if(!digitalRead(BUTTON_C)) display.print("C"); + delay(10); + yield(); + display.display(); +} diff --git a/src/library/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino b/src/library/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino new file mode 100644 index 0000000..20fbd23 --- /dev/null +++ b/src/library/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino @@ -0,0 +1,374 @@ +/********************************************************************* + This is an example for our Monochrome OLEDs based on SH1107 drivers + + This example is for a 128x128 size display using I2C to communicate + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + BSD license, check license.txt for more information + All text above, and the splash screen must be included in any redistribution +*********************************************************************/ + + + +#include +#include +#include +#include + +#define SCREEN_WIDTH 128 // OLED display width, in pixels +#define SCREEN_HEIGHT 128 // OLED display height, in pixels +#define OLED_RESET -1 // can set an oled reset pin if desired +Adafruit_SH1107 display = Adafruit_SH1107(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET, 1000000, 100000); + + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + + +#define LOGO_HEIGHT 16 +#define LOGO_WIDTH 16 +static const unsigned char PROGMEM logo_bmp[] = +{ 0b00000000, 0b11000000, + 0b00000001, 0b11000000, + 0b00000001, 0b11000000, + 0b00000011, 0b11100000, + 0b11110011, 0b11100000, + 0b11111110, 0b11111000, + 0b01111110, 0b11111111, + 0b00110011, 0b10011111, + 0b00011111, 0b11111100, + 0b00001101, 0b01110000, + 0b00011011, 0b10100000, + 0b00111111, 0b11100000, + 0b00111111, 0b11110000, + 0b01111100, 0b11110000, + 0b01110000, 0b01110000, + 0b00000000, 0b00110000 }; + + +void setup() { + + Serial.begin(9600); + + delay(250); // wait for the OLED to power up + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + + display.begin(0x3D, true); // Address 0x3D default + //display.setContrast (0); // dim display + + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, SH110X_WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawline(); // Draw many lines + + testdrawrect(); // Draw rectangles (outlines) + + testfillrect(); // Draw rectangles (filled) + + testdrawcircle(); // Draw circles (outlines) + + testfillcircle(); // Draw circles (filled) + + testdrawroundrect(); // Draw rounded rectangles (outlines) + + testfillroundrect(); // Draw rounded rectangles (filled) + + testdrawtriangle(); // Draw triangles (outlines) + + testfilltriangle(); // Draw triangles (filled) + + testdrawchar(); // Draw characters of the default font + + testdrawstyles(); // Draw 'stylized' characters + + testdrawbitmap(); // Draw a small bitmap image + + testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps +} + +void loop() { +} + +void testdrawline() { + int16_t i; + + display.clearDisplay(); // Clear display buffer + + for(i=0; i=0; i-=4) { + display.drawLine(0, display.height()-1, display.width()-1, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + + for(i=display.width()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, i, 0, SH110X_WHITE); + display.display(); + delay(1); + } + for(i=display.height()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, 0, i, SH110X_WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + + for(i=0; i0; i-=3) { + // The INVERSE color is used so circles alternate white/black + display.fillCircle(display.width() / 2, display.height() / 2, i, SH110X_INVERSE); + display.display(); // Update screen with each newly-drawn circle + delay(1); + } + + delay(2000); +} + +void testdrawroundrect(void) { + display.clearDisplay(); + + for(int16_t i=0; i0; i-=5) { + // The INVERSE color is used so triangles alternate white/black + display.fillTriangle( + display.width()/2 , display.height()/2-i, + display.width()/2-i, display.height()/2+i, + display.width()/2+i, display.height()/2+i, SH110X_INVERSE); + display.display(); + delay(1); + } + + delay(2000); +} + +void testdrawchar(void) { + display.clearDisplay(); + + display.setTextSize(1); // Normal 1:1 pixel scale + display.setTextColor(SH110X_WHITE); // Draw white text + display.setCursor(0, 0); // Start at top-left corner + display.cp437(true); // Use full 256 char 'Code Page 437' font + + // Not all the characters will fit on the display. This is normal. + // Library will draw what it can and the rest will be clipped. + for(int16_t i=0; i<256; i++) { + if(i == '\n') display.write(' '); + else display.write(i); + } + + display.display(); + delay(2000); +} + +void testdrawstyles(void) { + display.clearDisplay(); + + display.setTextSize(1); // Normal 1:1 pixel scale + display.setTextColor(SH110X_WHITE); // Draw white text + display.setCursor(0,0); // Start at top-left corner + display.println(F("Hello, world!")); + + display.setTextColor(SH110X_BLACK, SH110X_WHITE); // Draw 'inverse' text + display.println(3.141592); + + display.setTextSize(2); // Draw 2X-scale text + display.setTextColor(SH110X_WHITE); + display.print(F("0x")); display.println(0xDEADBEEF, HEX); + + display.display(); + delay(2000); +} + +void testdrawbitmap(void) { + display.clearDisplay(); + + display.drawBitmap( + (display.width() - LOGO_WIDTH ) / 2, + (display.height() - LOGO_HEIGHT) / 2, + logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1); + display.display(); + delay(1000); +} + +#define XPOS 0 // Indexes into the 'icons' array in function below +#define YPOS 1 +#define DELTAY 2 + +void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) { + int8_t f, icons[NUMFLAKES][3]; + + // Initialize 'snowflake' positions + for(f=0; f< NUMFLAKES; f++) { + icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width()); + icons[f][YPOS] = -LOGO_HEIGHT; + icons[f][DELTAY] = random(1, 6); + Serial.print(F("x: ")); + Serial.print(icons[f][XPOS], DEC); + Serial.print(F(" y: ")); + Serial.print(icons[f][YPOS], DEC); + Serial.print(F(" dy: ")); + Serial.println(icons[f][DELTAY], DEC); + } + + for(;;) { // Loop forever... + display.clearDisplay(); // Clear the display buffer + + // Draw each snowflake: + for(f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SH110X_WHITE); + } + + display.display(); // Show the display buffer on the screen + delay(200); // Pause for 1/10 second + + // Then update coordinates of each flake... + for(f=0; f< NUMFLAKES; f++) { + icons[f][YPOS] += icons[f][DELTAY]; + // If snowflake is off the bottom of the screen... + if (icons[f][YPOS] >= display.height()) { + // Reinitialize to a random position, just off the top + icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width()); + icons[f][YPOS] = -LOGO_HEIGHT; + icons[f][DELTAY] = random(1, 6); + } + } + } +} diff --git a/src/library/Adafruit_SH110x/library.properties b/src/library/Adafruit_SH110x/library.properties new file mode 100644 index 0000000..c504ac6 --- /dev/null +++ b/src/library/Adafruit_SH110x/library.properties @@ -0,0 +1,10 @@ +name=Adafruit SH110X +version=2.1.10 +author=Adafruit +maintainer=Adafruit +sentence=SH110X oled driver library for monochrome displays with SH1107 or SH1106G drivers +paragraph=SH110X oled driver library for monochrome displays with SH1107 or SH1106G drivers +category=Display +url=https://github.com/adafruit/Adafruit_SH110X +architectures=* +depends=Adafruit GFX Library, Adafruit BusIO diff --git a/src/library/Adafruit_SH110x/license.txt b/src/library/Adafruit_SH110x/license.txt new file mode 100644 index 0000000..ab5d9a1 --- /dev/null +++ b/src/library/Adafruit_SH110x/license.txt @@ -0,0 +1,26 @@ +Software License Agreement (BSD License) + +Copyright (c) 2012, Adafruit Industries +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holders nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/src/library/Adafruit_SH110x/splash.h b/src/library/Adafruit_SH110x/splash.h new file mode 100644 index 0000000..be92c06 --- /dev/null +++ b/src/library/Adafruit_SH110x/splash.h @@ -0,0 +1,210 @@ + +#define splash1_width 82 +#define splash1_height 64 + +const uint8_t PROGMEM splash1_data[] = { + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000001, + 0b10000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000011, 0b10000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000111, 0b11000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000111, 0b11000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00001111, 0b11000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00011111, 0b11100000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00011111, + 0b11100000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00111111, 0b11100000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00111111, 0b11110000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b01111111, 0b11110000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00011111, + 0b11111000, 0b01111111, 0b11110000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00111111, 0b11111110, + 0b01111111, 0b11110000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00111111, 0b11111111, 0b01111111, + 0b11110000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00011111, 0b11111111, 0b11111011, 0b11100000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00001111, 0b11111111, 0b11111001, 0b11111111, 0b11000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00001111, 0b11111111, 0b11111001, 0b11111111, 0b11111000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000111, + 0b11111111, 0b11110001, 0b11111111, 0b11111111, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000011, 0b11111100, + 0b01110011, 0b11111111, 0b11111111, 0b10000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b11111110, 0b00111111, + 0b11111111, 0b11111111, 0b10000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b11111111, 0b00011110, 0b00001111, + 0b11111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b01111111, 0b11111110, 0b00011111, 0b11111100, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00111111, 0b11111111, 0b11111111, 0b11111000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00001111, 0b11011111, 0b11111111, 0b11100000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00011111, + 0b00011001, 0b11111111, 0b11000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00111111, 0b00111100, + 0b11111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b01111110, 0b01111100, 0b11111000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b01111111, 0b11111110, 0b01111100, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b11111111, 0b11111111, 0b11111100, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b11111111, 0b11111111, 0b11111110, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111111, + 0b11111111, 0b11111110, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b11111111, 0b11101111, + 0b11111110, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000001, 0b11111111, 0b11001111, 0b11111110, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000011, 0b11111111, 0b00000111, 0b11111110, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000011, 0b11111100, 0b00000111, 0b11111110, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000011, + 0b11110000, 0b00000011, 0b11111110, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b10000000, + 0b00000000, 0b11111110, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b01111110, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00111110, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00001100, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000111, + 0b10000000, 0b00000000, 0b11111100, 0b00000000, 0b00000000, 0b00000011, + 0b11000000, 0b00000000, 0b00000000, 0b00000000, 0b00000111, 0b10000000, + 0b00000001, 0b11111100, 0b00000000, 0b00000000, 0b00000011, 0b11000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000111, 0b10000000, 0b00000001, + 0b11111100, 0b00000000, 0b00000000, 0b00000011, 0b11000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000111, 0b10000000, 0b00000001, 0b11100000, + 0b00000000, 0b00000000, 0b00000000, 0b00011110, 0b00000000, 0b00000000, + 0b00000000, 0b00000111, 0b10000000, 0b00000001, 0b11100000, 0b00000000, + 0b00000000, 0b00000000, 0b00011110, 0b00000000, 0b01111111, 0b11100011, + 0b11110111, 0b10011111, 0b11111001, 0b11111101, 0b11100111, 0b01111000, + 0b01111011, 0b11011111, 0b11000000, 0b11111111, 0b11110111, 0b11111111, + 0b10111111, 0b11111101, 0b11111101, 0b11111111, 0b01111000, 0b01111011, + 0b11011111, 0b11000000, 0b11111111, 0b11110111, 0b11111111, 0b10111111, + 0b11111101, 0b11111101, 0b11111111, 0b01111000, 0b01111011, 0b11011111, + 0b11000000, 0b11110000, 0b11110111, 0b10000111, 0b10111100, 0b00111101, + 0b11100001, 0b11111111, 0b01111000, 0b01111011, 0b11011110, 0b00000000, + 0b11110000, 0b11110111, 0b10000111, 0b10111100, 0b00111101, 0b11100001, + 0b11110000, 0b01111000, 0b01111011, 0b11011110, 0b00000000, 0b00000000, + 0b11110111, 0b10000111, 0b10000000, 0b00111101, 0b11100001, 0b11100000, + 0b01111000, 0b01111011, 0b11011110, 0b00000000, 0b01111111, 0b11110111, + 0b10000111, 0b10011111, 0b11111101, 0b11100001, 0b11100000, 0b01111000, + 0b01111011, 0b11011110, 0b00000000, 0b11111111, 0b11110111, 0b10000111, + 0b10111111, 0b11111101, 0b11100001, 0b11100000, 0b01111000, 0b01111011, + 0b11011110, 0b00000000, 0b11110000, 0b11110111, 0b10000111, 0b10111100, + 0b00111101, 0b11100001, 0b11100000, 0b01111000, 0b01111011, 0b11011110, + 0b00000000, 0b11110000, 0b11110111, 0b10000111, 0b10111100, 0b00111101, + 0b11100001, 0b11100000, 0b01111000, 0b01111011, 0b11011110, 0b00000000, + 0b11110000, 0b11110111, 0b10000111, 0b10111100, 0b00111101, 0b11100001, + 0b11100000, 0b01111000, 0b01111011, 0b11011110, 0b00000000, 0b11111111, + 0b11110111, 0b11111111, 0b10111111, 0b11111101, 0b11100001, 0b11100000, + 0b01111111, 0b11111011, 0b11011111, 0b11000000, 0b11111111, 0b11110111, + 0b11111111, 0b10111111, 0b11111101, 0b11100001, 0b11100000, 0b01111111, + 0b11111011, 0b11011111, 0b11000000, 0b01111100, 0b11110011, 0b11110011, + 0b10011111, 0b00111101, 0b11100001, 0b11100000, 0b00111110, 0b01111011, + 0b11001111, 0b11000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11000000, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111101, 0b01101000, + 0b11011011, 0b00010001, 0b00011010, 0b00110001, 0b11000000, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111101, 0b00101011, 0b01011010, + 0b11111011, 0b01101010, 0b11101111, 0b11000000, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111101, 0b01001011, 0b01011011, 0b00111011, + 0b00011010, 0b00110011, 0b11000000, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111101, 0b01101011, 0b01011011, 0b11011011, 0b01101010, + 0b11111101, 0b11000000, +}; + +#define splash2_width 115 +#define splash2_height 32 + +const uint8_t PROGMEM splash2_data[] = { + 0b00000000, 0b00000000, 0b01100000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11100000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000001, 0b11100000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b11110000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000011, 0b11110000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000111, 0b11110000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000111, 0b11111000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00001111, 0b11111000, + 0b00000000, 0b00000000, 0b00000000, 0b00000011, 0b11000000, 0b00000000, + 0b01111110, 0b00000000, 0b00000000, 0b00000001, 0b11100000, 0b00000000, + 0b01111111, 0b00001111, 0b11111000, 0b00000000, 0b00000000, 0b00000000, + 0b00000011, 0b11000000, 0b00000000, 0b11111110, 0b00000000, 0b00000000, + 0b00000001, 0b11100000, 0b00000000, 0b11111111, 0b11101111, 0b11111000, + 0b00000000, 0b00000000, 0b00000000, 0b00000011, 0b11000000, 0b00000000, + 0b11111110, 0b00000000, 0b00000000, 0b00000001, 0b11100000, 0b00000000, + 0b11111111, 0b11111111, 0b11111000, 0b00000000, 0b00000000, 0b00000000, + 0b00000011, 0b11000000, 0b00000000, 0b11110000, 0b00000000, 0b00000000, + 0b00000000, 0b00001111, 0b00000000, 0b01111111, 0b11111110, 0b01111111, + 0b11000000, 0b00000000, 0b00000000, 0b00000011, 0b11000000, 0b00000000, + 0b11110000, 0b00000000, 0b00000000, 0b00000000, 0b00001111, 0b00000000, + 0b00111111, 0b11111110, 0b01111111, 0b11111000, 0b00111111, 0b11110001, + 0b11111011, 0b11001111, 0b11111100, 0b11111110, 0b11110011, 0b10111100, + 0b00111101, 0b11101111, 0b11100000, 0b00011111, 0b11111110, 0b01111111, + 0b11111111, 0b01111111, 0b11111011, 0b11111111, 0b11011111, 0b11111110, + 0b11111110, 0b11111111, 0b10111100, 0b00111101, 0b11101111, 0b11100000, + 0b00011111, 0b11000110, 0b11111111, 0b11111111, 0b01111111, 0b11111011, + 0b11111111, 0b11011111, 0b11111110, 0b11111110, 0b11111111, 0b10111100, + 0b00111101, 0b11101111, 0b11100000, 0b00001111, 0b11100011, 0b11000111, + 0b11111110, 0b01111000, 0b01111011, 0b11000011, 0b11011110, 0b00011110, + 0b11110000, 0b11111111, 0b10111100, 0b00111101, 0b11101111, 0b00000000, + 0b00000111, 0b11111111, 0b10000111, 0b11111100, 0b01111000, 0b01111011, + 0b11000011, 0b11011110, 0b00011110, 0b11110000, 0b11111000, 0b00111100, + 0b00111101, 0b11101111, 0b00000000, 0b00000001, 0b11111111, 0b11111111, + 0b11110000, 0b00000000, 0b01111011, 0b11000011, 0b11000000, 0b00011110, + 0b11110000, 0b11110000, 0b00111100, 0b00111101, 0b11101111, 0b00000000, + 0b00000001, 0b11110011, 0b01111111, 0b11100000, 0b00111111, 0b11111011, + 0b11000011, 0b11001111, 0b11111110, 0b11110000, 0b11110000, 0b00111100, + 0b00111101, 0b11101111, 0b00000000, 0b00000011, 0b11100011, 0b00111111, + 0b10000000, 0b01111111, 0b11111011, 0b11000011, 0b11011111, 0b11111110, + 0b11110000, 0b11110000, 0b00111100, 0b00111101, 0b11101111, 0b00000000, + 0b00000111, 0b11100111, 0b00111100, 0b00000000, 0b01111000, 0b01111011, + 0b11000011, 0b11011110, 0b00011110, 0b11110000, 0b11110000, 0b00111100, + 0b00111101, 0b11101111, 0b00000000, 0b00000111, 0b11111111, 0b10111110, + 0b00000000, 0b01111000, 0b01111011, 0b11000011, 0b11011110, 0b00011110, + 0b11110000, 0b11110000, 0b00111100, 0b00111101, 0b11101111, 0b00000000, + 0b00000111, 0b11111111, 0b11111110, 0b00000000, 0b01111000, 0b01111011, + 0b11000011, 0b11011110, 0b00011110, 0b11110000, 0b11110000, 0b00111100, + 0b00111101, 0b11101111, 0b00000000, 0b00001111, 0b11111111, 0b11111110, + 0b00000000, 0b01111111, 0b11111011, 0b11111111, 0b11011111, 0b11111110, + 0b11110000, 0b11110000, 0b00111111, 0b11111101, 0b11101111, 0b11100000, + 0b00001111, 0b11111111, 0b11111111, 0b00000000, 0b01111111, 0b11111011, + 0b11111111, 0b11011111, 0b11111110, 0b11110000, 0b11110000, 0b00111111, + 0b11111101, 0b11101111, 0b11100000, 0b00001111, 0b11111001, 0b11111111, + 0b00000000, 0b00111110, 0b01111001, 0b11111001, 0b11001111, 0b10011110, + 0b11110000, 0b11110000, 0b00011111, 0b00111101, 0b11100111, 0b11100000, + 0b00011111, 0b11110001, 0b11111111, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00011111, 0b10000000, 0b11111111, + 0b00000000, 0b01111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11100000, + 0b00011100, 0b00000000, 0b01111111, 0b00000000, 0b01111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111110, 0b10110100, 0b01101101, 0b10001000, + 0b10001101, 0b00011000, 0b11100000, 0b00000000, 0b00000000, 0b00011111, + 0b00000000, 0b01111111, 0b11111111, 0b11111111, 0b11111111, 0b11111110, + 0b10010101, 0b10101101, 0b01111101, 0b10110101, 0b01110111, 0b11100000, + 0b00000000, 0b00000000, 0b00001111, 0b00000000, 0b01111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111110, 0b10100101, 0b10101101, 0b10011101, + 0b10001101, 0b00011001, 0b11100000, 0b00000000, 0b00000000, 0b00000110, + 0b00000000, 0b01111111, 0b11111111, 0b11111111, 0b11111111, 0b11111110, + 0b10110101, 0b10101101, 0b11101101, 0b10110101, 0b01111110, 0b11100000, +}; diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md b/src/library/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..f0e2614 --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,46 @@ +Thank you for opening an issue on an Adafruit Arduino library repository. To +improve the speed of resolution please review the following guidelines and +common troubleshooting steps below before creating the issue: + +- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use + the forums at http://forums.adafruit.com to ask questions and troubleshoot why + something isn't working as expected. In many cases the problem is a common issue + that you will more quickly receive help from the forum community. GitHub issues + are meant for known defects in the code. If you don't know if there is a defect + in the code then start with troubleshooting on the forum first. + +- **If following a tutorial or guide be sure you didn't miss a step.** Carefully + check all of the steps and commands to run have been followed. Consult the + forum if you're unsure or have questions about steps in a guide/tutorial. + +- **For Arduino projects check these very common issues to ensure they don't apply**: + + - For uploading sketches or communicating with the board make sure you're using + a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes + very hard to tell the difference between a data and charge cable! Try using the + cable with other devices or swapping to another cable to confirm it is not + the problem. + + - **Be sure you are supplying adequate power to the board.** Check the specs of + your board and plug in an external power supply. In many cases just + plugging a board into your computer is not enough to power it and other + peripherals. + + - **Double check all soldering joints and connections.** Flakey connections + cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. + + - **Ensure you are using an official Arduino or Adafruit board.** We can't + guarantee a clone board will have the same functionality and work as expected + with this code and don't support them. + +If you're sure this issue is a defect in the code and checked the steps above +please fill in the following fields to provide enough troubleshooting information. +You may delete the guideline and text above to just leave the following details: + +- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** + +- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO + VERSION HERE** + +- List the steps to reproduce the problem below (if possible attach a sketch or + copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md b/src/library/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7b641eb --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +Thank you for creating a pull request to contribute to Adafruit's GitHub code! +Before you open the request please review the following guidelines and tips to +help it be more easily integrated: + +- **Describe the scope of your change--i.e. what the change does and what parts + of the code were modified.** This will help us understand any risks of integrating + the code. + +- **Describe any known limitations with your change.** For example if the change + doesn't apply to a supported platform of the library please mention it. + +- **Please run any tests or examples that can exercise your modified code.** We + strive to not break users of the code and running tests/examples helps with this + process. + +Thank you again for contributing! We will try to test and integrate the change +as soon as we can, but be aware we have many GitHub repositories to manage and +can't immediately respond to every request. There is no need to bump or check in +on a pull request (it will clutter the discussion of the request). + +Also don't be worried if the request is closed or not integrated--sometimes the +priorities of Adafruit's GitHub code (education, ease of use) might not match the +priorities of the pull request. Don't fret, the open source community thrives on +forks and GitHub makes it easy to keep your changes in a forked repo. + +After reviewing the guidelines above you can delete this text from the pull request. diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp b/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp new file mode 100644 index 0000000..d9dd993 --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp @@ -0,0 +1,776 @@ +/********************************************************************* +This is a library for our Monochrome OLEDs based on SSD1306 drivers + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/category/63_98 + +These displays use SPI to communicate, 4 or 5 pins are required to +interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen below must be included in any redistribution +*********************************************************************/ + +#ifdef __AVR__ + #include +#elif defined(ESP8266) || defined(ESP32) + #include +#else + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#endif + +#if !defined(__ARM_ARCH) && !defined(ENERGIA) && !defined(ESP8266) && !defined(ESP32) && !defined(__arc__) + #include +#endif + +#include + +#include +#include "../Adafruit-GFX-Library/Adafruit_GFX.h" +#include "Adafruit_SSD1306.h" + +// the memory buffer for the LCD + +static uint8_t buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = { + +#if (SSD1306_LCDWIDTH == 64 && SSD1306_LCDHEIGHT == 48) +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, +0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, +0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0xC0, 0xFC, 0xFF, 0xFF, +0xFF, 0xFF, 0x7F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x87, 0x8F, 0x9F, 0x9F, 0xFF, 0xFF, +0xFF, 0xC1, 0xC0, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, +0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, +0xE0, 0xF1, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x0F, 0x87, 0xE7, 0xFF, 0xFF, +0xFF, 0x1F, 0x1F, 0x3F, 0xF9, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7E, 0x3F, 0x3F, 0x0F, 0x1F, 0xFF, 0xFF, +0xFF, 0xFC, 0xF0, 0xE0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, +0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +#else +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, +0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF, +#if (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH > 96*16) +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, +0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8, +0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, +0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01, +0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF, +0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00, +0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF, +0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF, +0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F, +0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, +0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03, +0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, +0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00, +0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03, +0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +#if (SSD1306_LCDWIDTH == 128 && SSD1306_LCDHEIGHT == 64) +0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F, +0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, +0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, +0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E, +0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC, +0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06, +0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8, +0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, +0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C, +0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, +0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, +0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07, +0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +#endif +#endif +#endif +}; + +#define ssd1306_swap(a, b) { int16_t t = a; a = b; b = t; } + +// the most basic function, set a single pixel +void Adafruit_SSD1306::drawPixel(int16_t x, int16_t y, uint16_t color) { + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) + return; + + // check rotation, move pixel around if necessary + switch (getRotation()) { + case 1: + ssd1306_swap(x, y); + x = WIDTH - x - 1; + break; + case 2: + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + break; + case 3: + ssd1306_swap(x, y); + y = HEIGHT - y - 1; + break; + } + + // x is which column + switch (color) + { + case WHITE: buffer[x+ (y/8)*SSD1306_LCDWIDTH] |= (1 << (y&7)); break; + case BLACK: buffer[x+ (y/8)*SSD1306_LCDWIDTH] &= ~(1 << (y&7)); break; + case INVERSE: buffer[x+ (y/8)*SSD1306_LCDWIDTH] ^= (1 << (y&7)); break; + } + +} + +// initializer for I2C - we only indicate the reset pin! +Adafruit_SSD1306::Adafruit_SSD1306(void) : +Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) { + sclk = dc = cs = sid = -1; + rst = -1; +} + +void Adafruit_SSD1306::begin(TwoWire& wire, uint8_t vccstate, uint8_t i2caddr) { + _vccstate = vccstate; + _i2caddr = i2caddr; + this->wire = &wire; + + // set pin directions + if (sid != -1){ +// pinMode(dc, OUTPUT); +// pinMode(cs, OUTPUT); +// #ifdef HAVE_PORTREG +// csport = portOutput(digitalPinToPort(cs)); +// cspinmask = digitalPinToBitMask(cs); +// dcport = portOutput(digitalPinToPort(dc)); +// dcpinmask = digitalPinToBitMask(dc); +// #endif +// if (!hwSPI){ +// // set pins for software-SPI +// pinMode(sid, OUTPUT); +// pinMode(sclk, OUTPUT); +// #ifdef HAVE_PORTREG +// clkport = portOutput(digitalPinToPort(sclk)); +// clkpinmask = digitalPinToBitMask(sclk); +// mosiport = portOutput(digitalPinToPort(sid)); +// mosipinmask = digitalPinToBitMask(sid); +// #endif +// } +// if (hwSPI){ +// SPI.begin(); +// #ifdef SPI_HAS_TRANSACTION +// SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); +// #else +// SPI.setClockDivider (4); +// #endif +// } + } + else + { + // I2C Init + // this->wire->begin(); +#ifdef __SAM3X8E__ + // Force 400 KHz I2C, rawr! (Uses pins 20, 21 for SDA, SCL) + TWI1->TWI_CWGR = 0; + TWI1->TWI_CWGR = ((VARIANT_MCK / (2 * 400000)) - 4) * 0x101; +#endif + } + // if ((reset) && (rst >= 0)) { + // // Setup reset pin direction (used by both SPI and I2C) + // pinMode(rst, OUTPUT); + // digitalWrite(rst, HIGH); + // // VDD (3.3V) goes high at start, lets just chill for a ms + // delay(1); + // // bring reset low + // digitalWrite(rst, LOW); + // // wait 10ms + // delay(10); + // // bring out of reset + // digitalWrite(rst, HIGH); + // // turn on VCC (9V?) + // } + + // Init sequence + ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE + ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5 + ssd1306_command(0x80); // the suggested ratio 0x80 + + ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8 + ssd1306_command(SSD1306_LCDHEIGHT - 1); + + ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3 + ssd1306_command(0x0); // no offset + ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0 + ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D + if (vccstate == SSD1306_EXTERNALVCC) + { ssd1306_command(0x10); } + else + { ssd1306_command(0x14); } + ssd1306_command(SSD1306_MEMORYMODE); // 0x20 horizontal addressing mode + ssd1306_command(0x00); // 0x0 act like ks0108 + ssd1306_command(SSD1306_SEGREMAP | 0x1); + ssd1306_command(SSD1306_COMSCANDEC); + + #if defined SSD1306_128_32 + ssd1306_command(SSD1306_SETCOMPINS); // 0xDA + ssd1306_command(0x02); + ssd1306_command(SSD1306_SETCONTRAST); // 0x81 + ssd1306_command(0x8F); + +#elif defined SSD1306_128_64 + ssd1306_command(SSD1306_SETCOMPINS); // 0xDA + ssd1306_command(0x12); + ssd1306_command(SSD1306_SETCONTRAST); // 0x81 + if (vccstate == SSD1306_EXTERNALVCC) + { ssd1306_command(0x9F); } + else + { ssd1306_command(0xCF); } + +#elif defined SSD1306_96_16 + ssd1306_command(SSD1306_SETCOMPINS); // 0xDA + ssd1306_command(0x2); //ada x12 + ssd1306_command(SSD1306_SETCONTRAST); // 0x81 + if (vccstate == SSD1306_EXTERNALVCC) + { ssd1306_command(0x10); } + else + { ssd1306_command(0xAF); } + +#elif defined SSD1306_64_48 + ssd1306_command(SSD1306_SETCOMPINS); // 0xDA + ssd1306_command(0x12); + ssd1306_command(SSD1306_SETCONTRAST); // 0x81 + if (vccstate == SSD1306_EXTERNALVCC) + { ssd1306_command(0x9F); } + else + { ssd1306_command(0xCF); } + +#endif + + ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9 + if (vccstate == SSD1306_EXTERNALVCC) + { ssd1306_command(0x22); } + else + { ssd1306_command(0xF1); } + ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB + ssd1306_command(0x40); + ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4 + ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6 + + ssd1306_command(SSD1306_DEACTIVATE_SCROLL); + + ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel +} + + +void Adafruit_SSD1306::invertDisplay(uint8_t i) { + if (i) { + ssd1306_command(SSD1306_INVERTDISPLAY); + } else { + ssd1306_command(SSD1306_NORMALDISPLAY); + } +} + +void Adafruit_SSD1306::ssd1306_command(uint8_t c) { + if (sid != -1) + { + // SPI +#ifdef HAVE_PORTREG + *csport |= cspinmask; + *dcport &= ~dcpinmask; + *csport &= ~cspinmask; +#else + digitalWrite(cs, HIGH); + digitalWrite(dc, LOW); + digitalWrite(cs, LOW); +#endif + fastSPIwrite(c); +#ifdef HAVE_PORTREG + *csport |= cspinmask; +#else + digitalWrite(cs, HIGH); +#endif + } + else + { + // I2C + uint8_t control = 0x00; // Co = 0, D/C = 0 + this->wire->beginTransmission(_i2caddr); + this->wire->write(control); + this->wire->write(c); + this->wire->endTransmission(); + } +} + +// startscrollright +// Activate a right handed scroll for rows start through stop +// Hint, the display is 16 rows tall. To scroll the whole display, run: +// display.scrollright(0x00, 0x0F) +void Adafruit_SSD1306::startscrollright(uint8_t start, uint8_t stop){ + ssd1306_command(SSD1306_RIGHT_HORIZONTAL_SCROLL); + ssd1306_command(0x00); + ssd1306_command(start); + ssd1306_command(0x00); + ssd1306_command(stop); + ssd1306_command(0x00); + ssd1306_command(0xFF); + ssd1306_command(SSD1306_ACTIVATE_SCROLL); +} + +// startscrollleft +// Activate a right handed scroll for rows start through stop +// Hint, the display is 16 rows tall. To scroll the whole display, run: +// display.scrollright(0x00, 0x0F) +void Adafruit_SSD1306::startscrollleft(uint8_t start, uint8_t stop){ + ssd1306_command(SSD1306_LEFT_HORIZONTAL_SCROLL); + ssd1306_command(0x00); + ssd1306_command(start); + ssd1306_command(0x00); + ssd1306_command(stop); + ssd1306_command(0x00); + ssd1306_command(0xFF); + ssd1306_command(SSD1306_ACTIVATE_SCROLL); +} + +// startscrolldiagright +// Activate a diagonal scroll for rows start through stop +// Hint, the display is 16 rows tall. To scroll the whole display, run: +// display.scrollright(0x00, 0x0F) +void Adafruit_SSD1306::startscrolldiagright(uint8_t start, uint8_t stop){ + ssd1306_command(SSD1306_SET_VERTICAL_SCROLL_AREA); + ssd1306_command(0x00); + ssd1306_command(SSD1306_LCDHEIGHT); + ssd1306_command(SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL); + ssd1306_command(0x00); + ssd1306_command(start); + ssd1306_command(0x00); + ssd1306_command(stop); + ssd1306_command(0x01); + ssd1306_command(SSD1306_ACTIVATE_SCROLL); +} + +// startscrolldiagleft +// Activate a diagonal scroll for rows start through stop +// Hint, the display is 16 rows tall. To scroll the whole display, run: +// display.scrollright(0x00, 0x0F) +void Adafruit_SSD1306::startscrolldiagleft(uint8_t start, uint8_t stop){ + ssd1306_command(SSD1306_SET_VERTICAL_SCROLL_AREA); + ssd1306_command(0x00); + ssd1306_command(SSD1306_LCDHEIGHT); + ssd1306_command(SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL); + ssd1306_command(0x00); + ssd1306_command(start); + ssd1306_command(0x00); + ssd1306_command(stop); + ssd1306_command(0x01); + ssd1306_command(SSD1306_ACTIVATE_SCROLL); +} + +void Adafruit_SSD1306::stopscroll(void){ + ssd1306_command(SSD1306_DEACTIVATE_SCROLL); +} + +// Dim the display +// dim = true: display is dimmed +// dim = false: display is normal +void Adafruit_SSD1306::dim(boolean dim) { + uint8_t contrast; + + if (dim) { + contrast = 0; // Dimmed display + } else { + if (_vccstate == SSD1306_EXTERNALVCC) { + contrast = 0x9F; + } else { + contrast = 0xCF; + } + } + // the range of contrast to too small to be really useful + // it is useful to dim the display + ssd1306_command(SSD1306_SETCONTRAST); + ssd1306_command(contrast); +} + +void Adafruit_SSD1306::setContrast(uint8_t value) +{ + if (_vccstate == SSD1306_EXTERNALVCC) + { + if (value = 0x9F) + { + value = 0x9F; + } + } + else + { + if (value = 0xCF) + { + value = 0xCF; + } + } + ssd1306_command(SSD1306_SETCONTRAST); + ssd1306_command(value); +} + +void Adafruit_SSD1306::display(void) { + ssd1306_command(SSD1306_COLUMNADDR); + #if SSD1306_LCDWIDTH == 64 && SSD1306_LCDHEIGHT == 48 + ssd1306_command(32); + ssd1306_command(32 + SSD1306_LCDWIDTH - 1); + #else + ssd1306_command(0); // Column start address (0 = reset) + ssd1306_command(SSD1306_LCDWIDTH-1); // Column end address (127 = reset) + #endif + + ssd1306_command(SSD1306_PAGEADDR); + ssd1306_command(0); // Page start address (0 = reset) + ssd1306_command((SSD1306_LCDHEIGHT / 8) - 1); // Page end address + /* + #if SSD1306_LCDWIDTH == 128 && SSD1306_LCDHEIGHT == 64 + ssd1306_command(7); // Page end address + #elif SSD1306_LCDWIDTH == 64 && SSD1306_LCDHEIGHT == 48 + ssd1306_command(5); // Page end address + #elif SSD1306_LCDWIDTH == 128 && SSD1306_LCDHEIGHT == 32 + ssd1306_command(3); // Page end address + #elif SSD1306_LCDWIDTH == 96 && SSD1306_LCDHEIGHT == 16 + ssd1306_command(1); // Page end address + #endif + */ + + if (sid != -1) + { + // SPI +#ifdef HAVE_PORTREG + *csport |= cspinmask; + *dcport |= dcpinmask; + *csport &= ~cspinmask; +#else + digitalWrite(cs, HIGH); + digitalWrite(dc, HIGH); + digitalWrite(cs, LOW); +#endif + + for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++) { + fastSPIwrite(buffer[i]); + } +#ifdef HAVE_PORTREG + *csport |= cspinmask; +#else + digitalWrite(cs, HIGH); +#endif + } + else + { + // save I2C bitrate +#ifdef TWBR + uint8_t twbrbackup = TWBR; + TWBR = 12; // upgrade to 400KHz! +#endif + + //Serial.println(TWBR, DEC); + //Serial.println(TWSR & 0x3, DEC); + + // I2C + for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++) { + // send a bunch of data in one xmission + this->wire->beginTransmission(_i2caddr); + WIRE_WRITE(0x40); + for (uint8_t x=0; x<16; x++) { + WIRE_WRITE(buffer[i]); + i++; + } + i--; + this->wire->endTransmission(); + } +#ifdef TWBR + TWBR = twbrbackup; +#endif + } +} + +// clear everything +void Adafruit_SSD1306::clearDisplay(void) { + memset(buffer, 0, (SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8)); +} + + +inline void Adafruit_SSD1306::fastSPIwrite(uint8_t d) { + + if(hwSPI) { + (void)SPI.transfer(d); + } else { + for(uint8_t bit = 0x80; bit; bit >>= 1) { +#ifdef HAVE_PORTREG + *clkport &= ~clkpinmask; + if(d & bit) *mosiport |= mosipinmask; + else *mosiport &= ~mosipinmask; + *clkport |= clkpinmask; +#else + digitalWrite(sclk, LOW); + if(d & bit) digitalWrite(sid, HIGH); + else digitalWrite(sid, LOW); + digitalWrite(sclk, HIGH); +#endif + } + } +} + +void Adafruit_SSD1306::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { + boolean bSwap = false; + switch(rotation) { + case 0: + // 0 degree rotation, do nothing + break; + case 1: + // 90 degree rotation, swap x & y for rotation, then invert x + bSwap = true; + ssd1306_swap(x, y); + x = WIDTH - x - 1; + break; + case 2: + // 180 degree rotation, invert x and y - then shift y around for height. + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + x -= (w-1); + break; + case 3: + // 270 degree rotation, swap x & y for rotation, then invert y and adjust y for w (not to become h) + bSwap = true; + ssd1306_swap(x, y); + y = HEIGHT - y - 1; + y -= (w-1); + break; + } + + if(bSwap) { + drawFastVLineInternal(x, y, w, color); + } else { + drawFastHLineInternal(x, y, w, color); + } +} + +void Adafruit_SSD1306::drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color) { + // Do bounds/limit checks + if(y < 0 || y >= HEIGHT) { return; } + + // make sure we don't try to draw below 0 + if(x < 0) { + w += x; + x = 0; + } + + // make sure we don't go off the edge of the display + if( (x + w) > WIDTH) { + w = (WIDTH - x); + } + + // if our width is now negative, punt + if(w <= 0) { return; } + + // set up the pointer for movement through the buffer + uint8_t *pBuf = buffer; + // adjust the buffer pointer for the current row + pBuf += ((y/8) * SSD1306_LCDWIDTH); + // and offset x columns in + pBuf += x; + + uint8_t mask = 1 << (y&7); + + switch (color) + { + case WHITE: while(w--) { *pBuf++ |= mask; }; break; + case BLACK: mask = ~mask; while(w--) { *pBuf++ &= mask; }; break; + case INVERSE: while(w--) { *pBuf++ ^= mask; }; break; + } +} + +void Adafruit_SSD1306::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { + bool bSwap = false; + switch(rotation) { + case 0: + break; + case 1: + // 90 degree rotation, swap x & y for rotation, then invert x and adjust x for h (now to become w) + bSwap = true; + ssd1306_swap(x, y); + x = WIDTH - x - 1; + x -= (h-1); + break; + case 2: + // 180 degree rotation, invert x and y - then shift y around for height. + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + y -= (h-1); + break; + case 3: + // 270 degree rotation, swap x & y for rotation, then invert y + bSwap = true; + ssd1306_swap(x, y); + y = HEIGHT - y - 1; + break; + } + + if(bSwap) { + drawFastHLineInternal(x, y, h, color); + } else { + drawFastVLineInternal(x, y, h, color); + } +} + + +void Adafruit_SSD1306::drawFastVLineInternal(int16_t x, int16_t __y, int16_t __h, uint16_t color) { + + // do nothing if we're off the left or right side of the screen + if(x < 0 || x >= WIDTH) { return; } + + // make sure we don't try to draw below 0 + if(__y < 0) { + // __y is negative, this will subtract enough from __h to account for __y being 0 + __h += __y; + __y = 0; + + } + + // make sure we don't go past the height of the display + if( (__y + __h) > HEIGHT) { + __h = (HEIGHT - __y); + } + + // if our height is now negative, punt + if(__h <= 0) { + return; + } + + // this display doesn't need ints for coordinates, use local byte s for faster juggling + uint8_t y = __y; + uint8_t h = __h; + + + // set up the pointer for fast movement through the buffer + uint8_t *pBuf = buffer; + // adjust the buffer pointer for the current row + pBuf += ((y/8) * SSD1306_LCDWIDTH); + // and offset x columns in + pBuf += x; + + // do the first partial byte, if necessary - this requires some masking + uint8_t mod = (y&7); + if(mod) { + // mask off the high n bits we want to set + mod = 8-mod; + + // note - lookup table results in a nearly 10% performance improvement in fill* functions + // uint8_t mask = ~(0xFF >> (mod)); + static uint8_t premask[8] = {0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE }; + uint8_t mask = premask[mod]; + + // adjust the mask if we're not going to reach the end of this byte + if( h < mod) { + mask &= (0xFF >> (mod-h)); + } + + switch (color) + { + case WHITE: *pBuf |= mask; break; + case BLACK: *pBuf &= ~mask; break; + case INVERSE: *pBuf ^= mask; break; + } + + // fast exit if we're done here! + if(h= 8) { + if (color == INVERSE) { // separate copy of the code so we don't impact performance of the black/white write version with an extra comparison per loop + do { + *pBuf=~(*pBuf); + + // adjust the buffer forward 8 rows worth of data + pBuf += SSD1306_LCDWIDTH; + + // adjust h & y (there's got to be a faster way for me to do this, but this should still help a fair bit for now) + h -= 8; + } while(h >= 8); + } + else { + // store a local value to work with + uint8_t val = (color == WHITE) ? 255 : 0; + + do { + // write our value in + *pBuf = val; + + // adjust the buffer forward 8 rows worth of data + pBuf += SSD1306_LCDWIDTH; + + // adjust h & y (there's got to be a faster way for me to do this, but this should still help a fair bit for now) + h -= 8; + } while(h >= 8); + } + } + + // now do the final partial byte, if necessary + if(h) { + mod = h & 7; + // this time we want to mask the low bits of the byte, vs the high bits we did above + // uint8_t mask = (1 << mod) - 1; + // note - lookup table results in a nearly 10% performance improvement in fill* functions + static uint8_t postmask[8] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F }; + uint8_t mask = postmask[mod]; + switch (color) + { + case WHITE: *pBuf |= mask; break; + case BLACK: *pBuf &= ~mask; break; + case INVERSE: *pBuf ^= mask; break; + } + } +} diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h b/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h new file mode 100644 index 0000000..3197b71 --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h @@ -0,0 +1,189 @@ +/********************************************************************* +This is a library for our Monochrome OLEDs based on SSD1306 drivers + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/category/63_98 + +These displays use SPI to communicate, 4 or 5 pins are required to +interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen must be included in any redistribution +*********************************************************************/ +#ifndef _Adafruit_SSD1306_H_ +#define _Adafruit_SSD1306_H_ + +#if ARDUINO >= 100 + #include "Arduino.h" + #define WIRE_WRITE Wire.write +#else + #include "WProgram.h" + #define WIRE_WRITE Wire.send +#endif + +#if defined(__SAM3X8E__) + typedef volatile RwReg PortReg; + typedef uint32_t PortMask; + #define HAVE_PORTREG +#elif defined(ARDUINO_ARCH_SAMD) +// not supported +#elif defined(ESP8266) || defined(ESP32) || defined(ARDUINO_STM32_FEATHER) || defined(__arc__) + typedef volatile uint32_t PortReg; + typedef uint32_t PortMask; +#elif defined(__AVR__) + typedef volatile uint8_t PortReg; + typedef uint8_t PortMask; + #define HAVE_PORTREG +#else + // chances are its 32 bit so assume that + typedef volatile uint32_t PortReg; + typedef uint32_t PortMask; +#endif + +#include +#include +#include "../Adafruit-GFX-Library/Adafruit_GFX.h" + +#define BLACK 0 +#define WHITE 1 +#define INVERSE 2 + +#define SSD1306_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D +// Address for 128x32 is 0x3C +// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded) + +/*========================================================================= + SSD1306 Displays + ----------------------------------------------------------------------- + The driver is used in multiple displays (128x64, 128x32, etc.). + Select the appropriate display below to create an appropriately + sized framebuffer, etc. + + SSD1306_128_64 128x64 pixel display + + SSD1306_128_32 128x32 pixel display + + SSD1306_96_16 + + -----------------------------------------------------------------------*/ +#define SSD1306_64_48 +// #define SSD1306_128_64 +// #define SSD1306_128_32 +// #define SSD1306_96_16 +/*=========================================================================*/ + +#if defined SSD1306_128_64 && defined SSD1306_128_32 + #error "Only one SSD1306 display can be specified at once in Adafruit_SSD1306.h" +#endif +#if !defined SSD1306_128_64 && !defined SSD1306_128_32 && !defined SSD1306_96_16 && !defined SSD1306_64_48 + #error "At least one SSD1306 display must be specified in Adafruit_SSD1306.h" +#endif + +#if defined SSD1306_128_64 + #define SSD1306_LCDWIDTH 128 + #define SSD1306_LCDHEIGHT 64 +#elif defined SSD1306_128_32 + #define SSD1306_LCDWIDTH 128 + #define SSD1306_LCDHEIGHT 32 +#elif defined SSD1306_96_16 + #define SSD1306_LCDWIDTH 96 + #define SSD1306_LCDHEIGHT 16 +#elif defined SSD1306_64_48 + #define SSD1306_LCDWIDTH 64 + #define SSD1306_LCDHEIGHT 48 +#endif + +#define SSD1306_SETCONTRAST 0x81 +#define SSD1306_DISPLAYALLON_RESUME 0xA4 +#define SSD1306_DISPLAYALLON 0xA5 +#define SSD1306_NORMALDISPLAY 0xA6 +#define SSD1306_INVERTDISPLAY 0xA7 +#define SSD1306_DISPLAYOFF 0xAE +#define SSD1306_DISPLAYON 0xAF + +#define SSD1306_SETDISPLAYOFFSET 0xD3 +#define SSD1306_SETCOMPINS 0xDA + +#define SSD1306_SETVCOMDETECT 0xDB + +#define SSD1306_SETDISPLAYCLOCKDIV 0xD5 +#define SSD1306_SETPRECHARGE 0xD9 + +#define SSD1306_SETMULTIPLEX 0xA8 + +#define SSD1306_SETLOWCOLUMN 0x00 +#define SSD1306_SETHIGHCOLUMN 0x10 + +#define SSD1306_SETSTARTLINE 0x40 + +#define SSD1306_MEMORYMODE 0x20 +#define SSD1306_COLUMNADDR 0x21 +#define SSD1306_PAGEADDR 0x22 + +#define SSD1306_COMSCANINC 0xC0 +#define SSD1306_COMSCANDEC 0xC8 + +#define SSD1306_SEGREMAP 0xA0 + +#define SSD1306_CHARGEPUMP 0x8D + +#define SSD1306_EXTERNALVCC 0x1 +#define SSD1306_SWITCHCAPVCC 0x2 + +// Scrolling #defines +#define SSD1306_ACTIVATE_SCROLL 0x2F +#define SSD1306_DEACTIVATE_SCROLL 0x2E +#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3 +#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26 +#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27 +#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 +#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A + +class Adafruit_SSD1306 : public Adafruit_GFX { + public: + Adafruit_SSD1306(void); + + void begin(TwoWire& wire, uint8_t switchvcc = SSD1306_SWITCHCAPVCC, uint8_t i2caddr = SSD1306_I2C_ADDRESS); + void ssd1306_command(uint8_t c); + + void clearDisplay(void); + void invertDisplay(uint8_t i); + void display(); + + void startscrollright(uint8_t start, uint8_t stop); + void startscrollleft(uint8_t start, uint8_t stop); + + void startscrolldiagright(uint8_t start, uint8_t stop); + void startscrolldiagleft(uint8_t start, uint8_t stop); + void stopscroll(void); + + void dim(boolean dim); + void setContrast(uint8_t value); + + void drawPixel(int16_t x, int16_t y, uint16_t color); + + virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + + private: + TwoWire* wire = nullptr; + int8_t _i2caddr, _vccstate, sid, sclk, dc, rst, cs; + void fastSPIwrite(uint8_t c); + + boolean hwSPI; +#ifdef HAVE_PORTREG + PortReg *mosiport, *clkport, *csport, *dcport; + PortMask mosipinmask, clkpinmask, cspinmask, dcpinmask; +#endif + + inline void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color) __attribute__((always_inline)); + inline void drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color) __attribute__((always_inline)); + +}; + +#endif /* _Adafruit_SSD1306_H_ */ diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/README.md b/src/library/Adafruit_SSD1306_Wemos_OLED/README.md new file mode 100644 index 0000000..d76bb28 --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/README.md @@ -0,0 +1,32 @@ +# Adafruit_SSD1306 + + +## Compatibility + +MCU | Tested Works | Doesn't Work | Not Tested | Notes +------------------ | :----------: | :----------: | :---------: | ----- +Atmega328 @ 16MHz | X | | | +Atmega328 @ 12MHz | X | | | +Atmega32u4 @ 16MHz | X | | | +Atmega32u4 @ 8MHz | X | | | +ESP8266 | X | | | change OLED_RESET to different pin if using default I2C pins D4/D5. +Atmega2560 @ 16MHz | X | | | +ATSAM3X8E | X | | | +ATSAM21D | X | | | +ATtiny85 @ 16MHz | | X | | +ATtiny85 @ 8MHz | | X | | +Intel Curie @ 32MHz | | | X | +STM32F2 | | | X | + + * ATmega328 @ 16MHz : Arduino UNO, Adafruit Pro Trinket 5V, Adafruit Metro 328, Adafruit Metro Mini + * ATmega328 @ 12MHz : Adafruit Pro Trinket 3V + * ATmega32u4 @ 16MHz : Arduino Leonardo, Arduino Micro, Arduino Yun, Teensy 2.0 + * ATmega32u4 @ 8MHz : Adafruit Flora, Bluefruit Micro + * ESP8266 : Adafruit Huzzah + * ATmega2560 @ 16MHz : Arduino Mega + * ATSAM3X8E : Arduino Due + * ATSAM21D : Arduino Zero, M0 Pro + * ATtiny85 @ 16MHz : Adafruit Trinket 5V + * ATtiny85 @ 8MHz : Adafruit Gemma, Arduino Gemma, Adafruit Trinket 3V + + diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/README.txt b/src/library/Adafruit_SSD1306_Wemos_OLED/README.txt new file mode 100644 index 0000000..420cc15 --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/README.txt @@ -0,0 +1,24 @@ +This is a library for our Monochrome OLEDs based on SSD1306 drivers + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/category/63_98 + +These displays use SPI to communicate, 4 or 5 pins are required to +interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +Scrolling code contributed by Michael Gregg +BSD license, check license.txt for more information +All text above must be included in any redistribution + +To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_SSD1306. Check that the Adafruit_SSD1306 folder contains Adafruit_SSD1306.cpp and Adafruit_SSD1306.h + +Place the Adafruit_SSD1306 library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE. + +You will also have to download the Adafruit GFX Graphics core which does all the circles, text, rectangles, etc. You can get it from +https://github.com/adafruit/Adafruit-GFX-Library +and download/install that library as well \ No newline at end of file diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino b/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino new file mode 100644 index 0000000..b3b8bfa --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino @@ -0,0 +1,375 @@ +/********************************************************************* +This is an example for our Monochrome OLEDs based on SSD1306 drivers + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/category/63_98 + +This example is for a 128x32 size display using I2C to communicate +3 pins are required to interface (2 I2C and one reset) + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen must be included in any redistribution +*********************************************************************/ + +#include +#include +#include +#include + +#define OLED_RESET 4 +Adafruit_SSD1306 display(OLED_RESET); + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + + +#define LOGO16_GLCD_HEIGHT 16 +#define LOGO16_GLCD_WIDTH 16 +static const unsigned char PROGMEM logo16_glcd_bmp[] = +{ B00000000, B11000000, + B00000001, B11000000, + B00000001, B11000000, + B00000011, B11100000, + B11110011, B11100000, + B11111110, B11111000, + B01111110, B11111111, + B00110011, B10011111, + B00011111, B11111100, + B00001101, B01110000, + B00011011, B10100000, + B00111111, B11100000, + B00111111, B11110000, + B01111100, B11110000, + B01110000, B01110000, + B00000000, B00110000 }; + +#if (SSD1306_LCDHEIGHT != 32) +#error("Height incorrect, please fix Adafruit_SSD1306.h!"); +#endif + +void setup() { + Serial.begin(9600); + + // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) + display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) + // init done + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + // draw many lines + testdrawline(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw rectangles + testdrawrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw multiple rectangles + testfillrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw mulitple circles + testdrawcircle(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw a white circle, 10 pixel radius + display.fillCircle(display.width()/2, display.height()/2, 10, WHITE); + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawroundrect(); + delay(2000); + display.clearDisplay(); + + testfillroundrect(); + delay(2000); + display.clearDisplay(); + + testdrawtriangle(); + delay(2000); + display.clearDisplay(); + + testfilltriangle(); + delay(2000); + display.clearDisplay(); + + // draw the first ~12 characters in the font + testdrawchar(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw scrolling text + testscrolltext(); + delay(2000); + display.clearDisplay(); + + // text display tests + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + display.println("Hello, world!"); + display.setTextColor(BLACK, WHITE); // 'inverted' text + display.println(3.141592); + display.setTextSize(2); + display.setTextColor(WHITE); + display.print("0x"); display.println(0xDEADBEEF, HEX); + display.display(); + delay(2000); + display.clearDisplay(); + + // miniature bitmap display + display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); + display.display(); + delay(1); + + // invert the display + display.invertDisplay(true); + delay(1000); + display.invertDisplay(false); + delay(1000); + display.clearDisplay(); + + // draw a bitmap icon and 'animate' movement + testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); +} + + +void loop() { + +} + + +void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { + uint8_t icons[NUMFLAKES][3]; + + // initialize + for (uint8_t f=0; f< NUMFLAKES; f++) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + + Serial.print("x: "); + Serial.print(icons[f][XPOS], DEC); + Serial.print(" y: "); + Serial.print(icons[f][YPOS], DEC); + Serial.print(" dy: "); + Serial.println(icons[f][DELTAY], DEC); + } + + while (1) { + // draw each icon + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE); + } + display.display(); + delay(200); + + // then erase it + move it + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK); + // move it + icons[f][YPOS] += icons[f][DELTAY]; + // if its gone, reinit + if (icons[f][YPOS] > display.height()) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + } + } + } +} + + +void testdrawchar(void) { + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + + for (uint8_t i=0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } + display.display(); + delay(1); +} + +void testdrawcircle(void) { + for (int16_t i=0; i0; i-=5) { + display.fillTriangle(display.width()/2, display.height()/2-i, + display.width()/2-i, display.height()/2+i, + display.width()/2+i, display.height()/2+i, WHITE); + if (color == WHITE) color = BLACK; + else color = WHITE; + display.display(); + delay(1); + } +} + +void testdrawroundrect(void) { + for (int16_t i=0; i=0; i-=4) { + display.drawLine(0, display.height()-1, display.width()-1, i, WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=display.width()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); + display.display(); + delay(1); + } + for (int16_t i=display.height()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=0; i http://www.adafruit.com/category/63_98 + +This example is for a 128x32 size display using SPI to communicate +4 or 5 pins are required to interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen must be included in any redistribution +*********************************************************************/ + +#include +#include +#include +#include + +// If using software SPI (the default case): +#define OLED_MOSI 9 +#define OLED_CLK 10 +#define OLED_DC 11 +#define OLED_CS 12 +#define OLED_RESET 13 +Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); + +/* Uncomment this block to use hardware SPI +#define OLED_DC 6 +#define OLED_CS 7 +#define OLED_RESET 8 +Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS); +*/ + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + +#define LOGO16_GLCD_HEIGHT 16 +#define LOGO16_GLCD_WIDTH 16 +static const unsigned char PROGMEM logo16_glcd_bmp[] = +{ B00000000, B11000000, + B00000001, B11000000, + B00000001, B11000000, + B00000011, B11100000, + B11110011, B11100000, + B11111110, B11111000, + B01111110, B11111111, + B00110011, B10011111, + B00011111, B11111100, + B00001101, B01110000, + B00011011, B10100000, + B00111111, B11100000, + B00111111, B11110000, + B01111100, B11110000, + B01110000, B01110000, + B00000000, B00110000 }; + +#if (SSD1306_LCDHEIGHT != 32) +#error("Height incorrect, please fix Adafruit_SSD1306.h!"); +#endif + +void setup() { + Serial.begin(9600); + + // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) + display.begin(SSD1306_SWITCHCAPVCC); + // init done + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + // draw many lines + testdrawline(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw rectangles + testdrawrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw multiple rectangles + testfillrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw mulitple circles + testdrawcircle(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw a white circle, 10 pixel radius + display.fillCircle(display.width()/2, display.height()/2, 10, WHITE); + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawroundrect(); + delay(2000); + display.clearDisplay(); + + testfillroundrect(); + delay(2000); + display.clearDisplay(); + + testdrawtriangle(); + delay(2000); + display.clearDisplay(); + + testfilltriangle(); + delay(2000); + display.clearDisplay(); + + // draw the first ~12 characters in the font + testdrawchar(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw scrolling text + testscrolltext(); + delay(2000); + display.clearDisplay(); + + // text display tests + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + display.println("Hello, world!"); + display.setTextColor(BLACK, WHITE); // 'inverted' text + display.println(3.141592); + display.setTextSize(2); + display.setTextColor(WHITE); + display.print("0x"); display.println(0xDEADBEEF, HEX); + display.display(); + delay(2000); + display.clearDisplay(); + + // miniature bitmap display + display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); + display.display(); + + // invert the display + display.invertDisplay(true); + delay(1000); + display.invertDisplay(false); + delay(1000); + display.clearDisplay(); + + // draw a bitmap icon and 'animate' movement + testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); +} + + +void loop() { + +} + + +void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { + uint8_t icons[NUMFLAKES][3]; + + // initialize + for (uint8_t f=0; f< NUMFLAKES; f++) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + + Serial.print("x: "); + Serial.print(icons[f][XPOS], DEC); + Serial.print(" y: "); + Serial.print(icons[f][YPOS], DEC); + Serial.print(" dy: "); + Serial.println(icons[f][DELTAY], DEC); + } + + while (1) { + // draw each icon + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE); + } + display.display(); + delay(200); + + // then erase it + move it + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK); + // move it + icons[f][YPOS] += icons[f][DELTAY]; + // if its gone, reinit + if (icons[f][YPOS] > display.height()) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + } + } + } +} + + +void testdrawchar(void) { + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + + for (uint8_t i=0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } + display.display(); +} + +void testdrawcircle(void) { + for (int16_t i=0; i0; i-=5) { + display.fillTriangle(display.width()/2, display.height()/2-i, + display.width()/2-i, display.height()/2+i, + display.width()/2+i, display.height()/2+i, WHITE); + if (color == WHITE) color = BLACK; + else color = WHITE; + display.display(); + } +} + +void testdrawroundrect(void) { + for (int16_t i=0; i=0; i-=4) { + display.drawLine(0, display.height()-1, display.width()-1, i, WHITE); + display.display(); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=display.width()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); + display.display(); + } + for (int16_t i=display.height()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE); + display.display(); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=0; i http://www.adafruit.com/category/63_98 + +This example is for a 128x64 size display using I2C to communicate +3 pins are required to interface (2 I2C and one reset) + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen must be included in any redistribution +*********************************************************************/ + +#include +#include +#include +#include + +#define OLED_RESET 4 +Adafruit_SSD1306 display(OLED_RESET); + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + + +#define LOGO16_GLCD_HEIGHT 16 +#define LOGO16_GLCD_WIDTH 16 +static const unsigned char PROGMEM logo16_glcd_bmp[] = +{ B00000000, B11000000, + B00000001, B11000000, + B00000001, B11000000, + B00000011, B11100000, + B11110011, B11100000, + B11111110, B11111000, + B01111110, B11111111, + B00110011, B10011111, + B00011111, B11111100, + B00001101, B01110000, + B00011011, B10100000, + B00111111, B11100000, + B00111111, B11110000, + B01111100, B11110000, + B01110000, B01110000, + B00000000, B00110000 }; + +#if (SSD1306_LCDHEIGHT != 64) +#error("Height incorrect, please fix Adafruit_SSD1306.h!"); +#endif + +void setup() { + Serial.begin(9600); + + // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) + display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128x64) + // init done + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + // draw many lines + testdrawline(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw rectangles + testdrawrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw multiple rectangles + testfillrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw mulitple circles + testdrawcircle(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw a white circle, 10 pixel radius + display.fillCircle(display.width()/2, display.height()/2, 10, WHITE); + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawroundrect(); + delay(2000); + display.clearDisplay(); + + testfillroundrect(); + delay(2000); + display.clearDisplay(); + + testdrawtriangle(); + delay(2000); + display.clearDisplay(); + + testfilltriangle(); + delay(2000); + display.clearDisplay(); + + // draw the first ~12 characters in the font + testdrawchar(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw scrolling text + testscrolltext(); + delay(2000); + display.clearDisplay(); + + // text display tests + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + display.println("Hello, world!"); + display.setTextColor(BLACK, WHITE); // 'inverted' text + display.println(3.141592); + display.setTextSize(2); + display.setTextColor(WHITE); + display.print("0x"); display.println(0xDEADBEEF, HEX); + display.display(); + delay(2000); + display.clearDisplay(); + + // miniature bitmap display + display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); + display.display(); + delay(1); + + // invert the display + display.invertDisplay(true); + delay(1000); + display.invertDisplay(false); + delay(1000); + display.clearDisplay(); + + // draw a bitmap icon and 'animate' movement + testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); +} + + +void loop() { + +} + + +void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { + uint8_t icons[NUMFLAKES][3]; + + // initialize + for (uint8_t f=0; f< NUMFLAKES; f++) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + + Serial.print("x: "); + Serial.print(icons[f][XPOS], DEC); + Serial.print(" y: "); + Serial.print(icons[f][YPOS], DEC); + Serial.print(" dy: "); + Serial.println(icons[f][DELTAY], DEC); + } + + while (1) { + // draw each icon + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE); + } + display.display(); + delay(200); + + // then erase it + move it + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK); + // move it + icons[f][YPOS] += icons[f][DELTAY]; + // if its gone, reinit + if (icons[f][YPOS] > display.height()) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + } + } + } +} + + +void testdrawchar(void) { + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + + for (uint8_t i=0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } + display.display(); + delay(1); +} + +void testdrawcircle(void) { + for (int16_t i=0; i0; i-=5) { + display.fillTriangle(display.width()/2, display.height()/2-i, + display.width()/2-i, display.height()/2+i, + display.width()/2+i, display.height()/2+i, WHITE); + if (color == WHITE) color = BLACK; + else color = WHITE; + display.display(); + delay(1); + } +} + +void testdrawroundrect(void) { + for (int16_t i=0; i=0; i-=4) { + display.drawLine(0, display.height()-1, display.width()-1, i, WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=display.width()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); + display.display(); + delay(1); + } + for (int16_t i=display.height()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=0; i http://www.adafruit.com/category/63_98 + +This example is for a 128x64 size display using SPI to communicate +4 or 5 pins are required to interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen must be included in any redistribution +*********************************************************************/ + +#include +#include +#include +#include + +// If using software SPI (the default case): +#define OLED_MOSI 9 +#define OLED_CLK 10 +#define OLED_DC 11 +#define OLED_CS 12 +#define OLED_RESET 13 +Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); + +/* Uncomment this block to use hardware SPI +#define OLED_DC 6 +#define OLED_CS 7 +#define OLED_RESET 8 +Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS); +*/ + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + +#define LOGO16_GLCD_HEIGHT 16 +#define LOGO16_GLCD_WIDTH 16 +static const unsigned char PROGMEM logo16_glcd_bmp[] = +{ B00000000, B11000000, + B00000001, B11000000, + B00000001, B11000000, + B00000011, B11100000, + B11110011, B11100000, + B11111110, B11111000, + B01111110, B11111111, + B00110011, B10011111, + B00011111, B11111100, + B00001101, B01110000, + B00011011, B10100000, + B00111111, B11100000, + B00111111, B11110000, + B01111100, B11110000, + B01110000, B01110000, + B00000000, B00110000 }; + +#if (SSD1306_LCDHEIGHT != 64) +#error("Height incorrect, please fix Adafruit_SSD1306.h!"); +#endif + +void setup() { + Serial.begin(9600); + + // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) + display.begin(SSD1306_SWITCHCAPVCC); + // init done + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + // draw many lines + testdrawline(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw rectangles + testdrawrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw multiple rectangles + testfillrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw mulitple circles + testdrawcircle(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw a white circle, 10 pixel radius + display.fillCircle(display.width()/2, display.height()/2, 10, WHITE); + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawroundrect(); + delay(2000); + display.clearDisplay(); + + testfillroundrect(); + delay(2000); + display.clearDisplay(); + + testdrawtriangle(); + delay(2000); + display.clearDisplay(); + + testfilltriangle(); + delay(2000); + display.clearDisplay(); + + // draw the first ~12 characters in the font + testdrawchar(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw scrolling text + testscrolltext(); + delay(2000); + display.clearDisplay(); + + // text display tests + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + display.println("Hello, world!"); + display.setTextColor(BLACK, WHITE); // 'inverted' text + display.println(3.141592); + display.setTextSize(2); + display.setTextColor(WHITE); + display.print("0x"); display.println(0xDEADBEEF, HEX); + display.display(); + delay(2000); + display.clearDisplay(); + + // miniature bitmap display + display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); + display.display(); + + // invert the display + display.invertDisplay(true); + delay(1000); + display.invertDisplay(false); + delay(1000); + display.clearDisplay(); + + // draw a bitmap icon and 'animate' movement + testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); +} + + +void loop() { + +} + + +void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { + uint8_t icons[NUMFLAKES][3]; + + // initialize + for (uint8_t f=0; f< NUMFLAKES; f++) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + + Serial.print("x: "); + Serial.print(icons[f][XPOS], DEC); + Serial.print(" y: "); + Serial.print(icons[f][YPOS], DEC); + Serial.print(" dy: "); + Serial.println(icons[f][DELTAY], DEC); + } + + while (1) { + // draw each icon + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE); + } + display.display(); + delay(200); + + // then erase it + move it + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK); + // move it + icons[f][YPOS] += icons[f][DELTAY]; + // if its gone, reinit + if (icons[f][YPOS] > display.height()) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + } + } + } +} + + +void testdrawchar(void) { + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + + for (uint8_t i=0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } + display.display(); +} + +void testdrawcircle(void) { + for (int16_t i=0; i0; i-=5) { + display.fillTriangle(display.width()/2, display.height()/2-i, + display.width()/2-i, display.height()/2+i, + display.width()/2+i, display.height()/2+i, WHITE); + if (color == WHITE) color = BLACK; + else color = WHITE; + display.display(); + } +} + +void testdrawroundrect(void) { + for (int16_t i=0; i=0; i-=4) { + display.drawLine(0, display.height()-1, display.width()-1, i, WHITE); + display.display(); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=display.width()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); + display.display(); + } + for (int16_t i=display.height()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE); + display.display(); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=0; i http://www.adafruit.com/category/63_98 + +This example is for a 64x48 size display using I2C to communicate +3 pins are required to interface (2 I2C and one reset) + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen must be included in any redistribution +*********************************************************************/ + +#include +#include +#include +#include + +// SCL GPIO5 +// SDA GPIO4 +#define OLED_RESET 0 // GPIO0 +Adafruit_SSD1306 display(OLED_RESET); + +#define NUMFLAKES 10 +#define XPOS 0 +#define YPOS 1 +#define DELTAY 2 + + +#define LOGO16_GLCD_HEIGHT 16 +#define LOGO16_GLCD_WIDTH 16 +static const unsigned char PROGMEM logo16_glcd_bmp[] = +{ B00000000, B11000000, + B00000001, B11000000, + B00000001, B11000000, + B00000011, B11100000, + B11110011, B11100000, + B11111110, B11111000, + B01111110, B11111111, + B00110011, B10011111, + B00011111, B11111100, + B00001101, B01110000, + B00011011, B10100000, + B00111111, B11100000, + B00111111, B11110000, + B01111100, B11110000, + B01110000, B01110000, + B00000000, B00110000 }; + +#if (SSD1306_LCDHEIGHT != 48) +#error("Height incorrect, please fix Adafruit_SSD1306.h!"); +#endif + +void setup() { + Serial.begin(9600); + + // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) + display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 64x48) + // init done + + // Show image buffer on the display hardware. + // Since the buffer is intialized with an Adafruit splashscreen + // internally, this will display the splashscreen. + display.display(); + delay(2000); + + // Clear the buffer. + display.clearDisplay(); + + // draw a single pixel + display.drawPixel(10, 10, WHITE); + // Show the display buffer on the hardware. + // NOTE: You _must_ call display after making any drawing commands + // to make them visible on the display hardware! + display.display(); + delay(2000); + display.clearDisplay(); + + // draw many lines + testdrawline(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw rectangles + testdrawrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw multiple rectangles + testfillrect(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw mulitple circles + testdrawcircle(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw a white circle, 10 pixel radius + display.fillCircle(display.width()/2, display.height()/2, 10, WHITE); + display.display(); + delay(2000); + display.clearDisplay(); + + testdrawroundrect(); + delay(2000); + display.clearDisplay(); + + testfillroundrect(); + delay(2000); + display.clearDisplay(); + + testdrawtriangle(); + delay(2000); + display.clearDisplay(); + + testfilltriangle(); + delay(2000); + display.clearDisplay(); + + // draw the first ~12 characters in the font + testdrawchar(); + display.display(); + delay(2000); + display.clearDisplay(); + + // draw scrolling text + testscrolltext(); + delay(2000); + display.clearDisplay(); + + // text display tests + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + display.println("Hello, world!"); + display.setTextColor(BLACK, WHITE); // 'inverted' text + display.println(3.141592); + display.setTextSize(2); + display.setTextColor(WHITE); + display.print("0x"); display.println(0xDEADBEEF, HEX); + display.display(); + delay(2000); + display.clearDisplay(); + + // miniature bitmap display + display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); + display.display(); + delay(1); + + // invert the display + display.invertDisplay(true); + delay(1000); + display.invertDisplay(false); + delay(1000); + display.clearDisplay(); + + // draw a bitmap icon and 'animate' movement + testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); +} + + +void loop() { + +} + + +void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { + uint8_t icons[NUMFLAKES][3]; + + // initialize + for (uint8_t f=0; f< NUMFLAKES; f++) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + + Serial.print("x: "); + Serial.print(icons[f][XPOS], DEC); + Serial.print(" y: "); + Serial.print(icons[f][YPOS], DEC); + Serial.print(" dy: "); + Serial.println(icons[f][DELTAY], DEC); + } + + while (1) { + // draw each icon + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE); + } + display.display(); + delay(200); + + // then erase it + move it + for (uint8_t f=0; f< NUMFLAKES; f++) { + display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK); + // move it + icons[f][YPOS] += icons[f][DELTAY]; + // if its gone, reinit + if (icons[f][YPOS] > display.height()) { + icons[f][XPOS] = random(display.width()); + icons[f][YPOS] = 0; + icons[f][DELTAY] = random(5) + 1; + } + } + } +} + + +void testdrawchar(void) { + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + + for (uint8_t i=0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } + display.display(); + delay(1); +} + +void testdrawcircle(void) { + for (int16_t i=0; i0; i-=5) { + display.fillTriangle(display.width()/2, display.height()/2-i, + display.width()/2-i, display.height()/2+i, + display.width()/2+i, display.height()/2+i, WHITE); + if (color == WHITE) color = BLACK; + else color = WHITE; + display.display(); + delay(1); + } +} + +void testdrawroundrect(void) { + for (int16_t i=0; i=0; i-=4) { + display.drawLine(0, display.height()-1, display.width()-1, i, WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=display.width()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); + display.display(); + delay(1); + } + for (int16_t i=display.height()-1; i>=0; i-=4) { + display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE); + display.display(); + delay(1); + } + delay(250); + + display.clearDisplay(); + for (int16_t i=0; i +sentence=SSD1306 oled driver library for Wemos D1 Mini OLED shield +paragraph=This is based on the Adafruit library, with additional code added to support the 64x48 display by mcauser. +category=Display +url=https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED.git +architectures=* diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/license.txt b/src/library/Adafruit_SSD1306_Wemos_OLED/license.txt new file mode 100644 index 0000000..f6a0f22 --- /dev/null +++ b/src/library/Adafruit_SSD1306_Wemos_OLED/license.txt @@ -0,0 +1,26 @@ +Software License Agreement (BSD License) + +Copyright (c) 2012, Adafruit Industries +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holders nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/library/SensirionCore/.clang-format b/src/library/SensirionCore/.clang-format new file mode 100644 index 0000000..047f2ad --- /dev/null +++ b/src/library/SensirionCore/.clang-format @@ -0,0 +1,14 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +IndentWidth: 4 +AlignAfterOpenBracket: Align +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: false +IndentCaseLabels: true +SpacesBeforeTrailingComments: 2 +PointerAlignment: Left +AlignEscapedNewlines: Left +ForEachMacros: ['TEST_GROUP', 'TEST'] +... diff --git a/src/library/SensirionCore/.editorconfig b/src/library/SensirionCore/.editorconfig new file mode 100644 index 0000000..334c9ab --- /dev/null +++ b/src/library/SensirionCore/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +trim_trailing_whitespace = true + +[*.bat] +end_of_line = crlf diff --git a/src/library/SensirionCore/.gitignore b/src/library/SensirionCore/.gitignore new file mode 100644 index 0000000..01fa01d --- /dev/null +++ b/src/library/SensirionCore/.gitignore @@ -0,0 +1,3 @@ +/examples/AllCommandsShdlc/build/ +/examples/AllCommandsI2c/build/ +.vscode diff --git a/src/library/SensirionCore/.gitlab-ci.yml b/src/library/SensirionCore/.gitlab-ci.yml new file mode 100644 index 0000000..650a1f8 --- /dev/null +++ b/src/library/SensirionCore/.gitlab-ci.yml @@ -0,0 +1,39 @@ +stages: + - validate + - test + +compile_test_shdlc: + stage: test + image: + name: registry.gitlab.sensirion.lokal/sensirion/docker/docker-arduino:0.5.0 + tags: [docker, linux] + script: + - tests/compile_test.py -s examples/AllCommandsShdlc/ + +compile_test_i2c: + stage: test + image: + name: registry.gitlab.sensirion.lokal/sensirion/docker/docker-arduino:0.5.0 + tags: [docker, linux] + script: + - tests/compile_test.py -s examples/AllCommandsI2c/ + +syntax_check: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/sensirion/docker/docker-python:3.8-20.04-2.7.0 + tags: [linux, docker] + before_script: + # For performance and stability reasons, use offline installation. + - pip install --no-index --find-links=/pip editorconfig-checker + - pip install flake8 + - apt-get update && apt-get install -yq clang-format-6.0 + script: + - tests/syntax_check.sh + +cppcheck: + stage: validate + image: registry.gitlab.sensirion.lokal/sensirion/docker/docker-cppcheck:1.0.0 + tags: [linux, docker] + script: + - tests/run_cppcheck.sh diff --git a/src/library/SensirionCore/CHANGELOG.rst b/src/library/SensirionCore/CHANGELOG.rst new file mode 100644 index 0000000..8d7aa66 --- /dev/null +++ b/src/library/SensirionCore/CHANGELOG.rst @@ -0,0 +1,161 @@ +Changelog +========= + +All notable changes to this project will be documented in this file. + +The format is based on `Keep a Changelog `_ +and this project adheres to `Semantic Versioning `_. + +`Unreleased`_ +------------- + + +`0.6.0`_ 2022-06-22 +------------------- + +- Fix compiler warnings in SensirionErrors.cpp +- Allow drivers to choose CRC function + +`0.5.3`_ 2021-10-19 +------------------- + +- Add support for sensor specific errors +- Update keywords.txt + + +`0.5.2`_ 2021-08-03 +------------------- + +Fixed +..... + +- Fix CRC insertion in ``SensirionI2CTxFrame`` when more then one parameter + is sent to the sensor. + +`0.5.1`_ 2021-07-08 +------------------- + +Changed +....... + +- Adjusted deprecation warnings + +`0.5.0`_ 2021-07-07 +------------------- + +Added +..... + +- Enable SensirionTxFrame to incorporate Uint8 and Uint16 commands + + +`0.4.3`_ 2021-02-12 +------------------- + +Added +..... + +- Added ``const`` modifier to functions which process MOSI array data. + +`0.4.2`_ 2021-01-29 +------------------- + +Changed +....... + +- Renamed the library header from ``SensirionCoreArduinoLibrary.h`` to ``SensirionCore.h``. + We keep the old header for legacy support. + +`0.4.1`_ 2021-01-28 +------------------- + +Fixed +..... + +- Properly handle I2C write errors + + +`0.4.0`_ 2021-01-20 +------------------- + +Added +..... + +- Documentation for all functions. + +Breaking +........ + +- Change interface of ``errorToString()`` function to include length of the + provided buffer. + +Removed +....... + +- Removed ``reset()`` function from ``SensirionI2CTxFrame`` since the + functionality is not needed. + + +`0.3.0`_ 2021-01-13 +------------------- + +Added +..... + +- Core implementation for I2C communication. This includes a RX and TX frame + and a I2C communication class. + +Changed +....... + +- SHDLC and I2C RX frame inherit from a RX frame base class. +- ESP8266 test board from esp8266:esp8266:arduino to esp8266:esp8266:generic. +- Sorted errors into general, SHDLC and I2C errors. +- Replace C style casts with ``static_cast``. + + +`0.2.0`_ 2021-01-11 +------------------- + +Added +..... + +- Explanation what SHDLC is in README. +- ``SensirionErrors.h`` to ``SensirionCoreArduinoLibrary.h``. +- ``sendAndReceiveFrame()`` function to ``SensirionShdlcCommunication``. This + function combines ``sendFrame()`` and ``receiveFrame()`` into one function and + adds additional error checking. + +Changed +....... + +- Rename DeviceError to ExecutionError. +- Move check for execution error after the whole frame is read and checksum is + checked. This prevents that a wrong checksum can't be displayed as an + execution error. + +Removed +....... + +- ``reset()`` function from ``SensirionShdlcTxFrame`` and ``SensirionShdlcRxFrame``, + since one can just create a new frame object which has the same effect. + +`0.1.0`_ 2021-01-07 +------------------- + +- Initial release + + +.. _Unreleased: https://github.com/Sensirion/arduino-core/compare/0.6.0...main +.. _0.6.0: https://github.com/Sensirion/arduino-core/compare/0.6.0...0.5.3 +.. _0.5.3: https://github.com/Sensirion/arduino-core/compare/0.5.2...0.5.3 +.. _0.5.2: https://github.com/Sensirion/arduino-core/compare/0.5.1...0.5.2 +.. _0.5.1: https://github.com/Sensirion/arduino-core/compare/0.5.0...0.5.1 +.. _0.5.0: https://github.com/Sensirion/arduino-core/compare/0.4.3...0.5.0 +.. _0.4.3: https://github.com/Sensirion/arduino-core/compare/0.4.2...0.4.3 +.. _0.4.2: https://github.com/Sensirion/arduino-core/compare/0.4.1...0.4.2 +.. _0.4.1: https://github.com/Sensirion/arduino-core/compare/0.4.0...0.4.1 +.. _0.4.0: https://github.com/Sensirion/arduino-core/compare/0.3.0...0.4.0 +.. _0.3.0: https://github.com/Sensirion/arduino-core/compare/0.2.0...0.3.0 +.. _0.2.0: https://github.com/Sensirion/arduino-core/compare/0.1.0...0.2.0 +.. _0.1.0: https://github.com/Sensirion/arduino-core/releases/tag/0.1.0 diff --git a/src/library/SensirionCore/LICENSE b/src/library/SensirionCore/LICENSE new file mode 100644 index 0000000..fad1acd --- /dev/null +++ b/src/library/SensirionCore/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2020, Sensirion AG +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/library/SensirionCore/README.md b/src/library/SensirionCore/README.md new file mode 100644 index 0000000..19ee401 --- /dev/null +++ b/src/library/SensirionCore/README.md @@ -0,0 +1,137 @@ +# Sensirion Arduino Core Library + +This library provides SHDLC and I2C protocol implementations for Sensirion +sensors. There shouldn't be a reason to use it directly, but is required by the +sensor driver libraries provided here: + +- [SCD4x](https://github.com/Sensirion/arduino-i2c-scd4x) +- [SVM40-I2C](https://github.com/Sensirion/arduino-i2c-svm40) +- [SVM40-UART](https://github.com/Sensirion/arduino-uart-svm40) +- [SFA3x-I2C](https://github.com/Sensirion/arduino-i2c-sfa3x) +- [SFA3x-UART](https://github.com/Sensirion/arduino-uart-sfa3x) + +# More Drivers + +Not looking for Arduino drivers? Check out our other drivers here: + +- [Embedded](https://github.com/Sensirion/info#repositories) +- [Python](https://github.com/Sensirion/info#python-drivers) + +# Usage + +## SHDLC + +SHDLC (Sensirion High-Level Data Link Control) is a byte-oriented master-slave +communication protocol based on [ISO +HDLC](https://en.wikipedia.org/wiki/High-Level_Data_Link_Control). It is used +to control some of Sensirion’s devices (for example mass flow controllers). The +detailed protocol documentation is not publicly available (yet). If you need +it, please contact our [customer +support](https://www.sensirion.com/en/about-us/contact/). + +This library provides the following classes for communication with Sensirion +Sensors using the SHDLC protocol. +- `SensirionShdlcTxFrame` +- `SensirionShdlcRxFrame` +- `SensirionShdlcCommunication` + +### Example Usage +First initialize an instance of `SensirionShdlcTxFrame` and +`SensirionShdlcRxFrame` with a properly sized buffer. A good worst case +estimation for the buffer size is `2 * (n+6)` where `n` is the number of bytes +you want to send. After that you can build your frame by first calling +`begin()`. Information about the correct COMMAND and ADDRESS can be found on +the data sheet of your sensor. Then you can add data to the frame by using +different add member functions. See the code below for examples. After adding +your data finish the frame by calling `finish()`. + +To send this frame to the sensor you first need to initialize the correct +Stream object (Serial,UART,...) to talk to your sensor. Don't forget to also +call the `.begin()` function with the right configuration. Then call the static +function `sendAndReceiveFrame()` from `SensirionShdlcCommunication` as shown +below. You need to replace `STREAMOBJECT` with the initialized Stream object of +your choice. Additionally you need to provide a timeout for to receive data +back, consult the data sheet of your sensor for information on the best timeout +value. + +You can decode the frame by using the different get members to convert the +received data to desired data types. + +All functions return a error code if an error occurs during execution and zero +otherwise. + +```cpp +uint8_t txBuffer[256]; +uint8_t rxBuffer[256]; + +SensirionShdlcTxFrame txFrame(txBuffer, 256); +SensirionShdlcRxFrame rxFrame(rxBuffer, 256); + +txFrame.begin(COMMAND, ADDRESS, DATALENGTH); + +txFrame.addUInt8(UINT8); +txFrame.addUInt32(UINT32); + +txFrame.finish(); + +SensirionShdlcCommunication::sendAndReceiveFrame(STREAMOBJECT, txFrame, rxFrame, TIMEOUT); + +rxFrame.getUInt16(UINT16); +rxFrame.getFloat(FLOAT); + +``` + +## I2C + +This library provides the following classes for communication with Sensirion +Sensors using the I2C protocol. +- `SensirionI2cTxFrame` +- `SensirionI2cRxFrame` +- `SensirionI2cCommunication` + +### Example Usage + +First initialize an instance of `SensirionI2CTxFrame` and `SensirionI2CRxFrame` +with a buffer sized the amount of data to read times 1.5. This is needed to +account for the CRC which is added after every second byte. After that you can +build your frame by first calling `addCommand()` to add the command at the +beginning of the frame. Information about the different COMMANDs can be found +on the data sheet of your sensor. Then you can add data to the frame by using +different add member functions. See the code below for examples. + +To send this frame to the sensor you first need to initialize a Wire object. +Don't forget to also call the `.begin()` function with the right configuration. +Then call the static function `sendFrame()` form `SensirionI2CCommunication` as +shown below. You can find the ADDRESS on the data sheet of the sensor. You also +need to replace `WIREOBJECT` with the initialized Wire object. Then wait the in +the data sheet documented `READ_DELAY` before receiving the reply from the +sensor by calling `receiveFrame()` with the same Wire object. + +You then can decode the frame by using the different get members to convert the +received data to desired data types. + +All functions return a error code if an error occurs during execution and zero +otherwise. + +```cpp +uint8_t txBuffer[256]; +uint8_t rxBuffer[256]; + +SensirionShdlcTxFrame txFrame(txBuffer, 256); +SensirionShdlcRxFrame rxFrame(rxBuffer, 256); + +txFrame.addCommand(COMMAND); + +txFrame.addUInt8(UINT8); +txFrame.addUInt32(UINT32); + +SensirionShdlcCommunication::sendFrame(ADDRESS, txFrame, WIREOBJECT); + +delay(READ_DELAY); + +SensirionShdlcCommunication::receiveFrame(ADDRESS, rxFrame, WIREOBJECT); + +rxFrame.getUInt16(UINT16); +rxFrame.getFloat(FLOAT); + +``` diff --git a/src/library/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino b/src/library/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino new file mode 100644 index 0000000..49b10d8 --- /dev/null +++ b/src/library/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino @@ -0,0 +1,62 @@ +#include +#include +#include + +uint8_t txBuffer[256]; +uint8_t rxBuffer[256]; + +SensirionI2CTxFrame txFrame(txBuffer, 256); +SensirionI2CRxFrame rxFrame(rxBuffer, 256); + +void setup() { + Wire.begin(); +} + +void loop() { + uint16_t mockCommand = 42; + uint16_t error = txFrame.addCommand(mockCommand); + + uint32_t mockUInt32 = 42; + error |= txFrame.addUInt32(mockUInt32); + + int32_t mockInt32 = 42; + error |= txFrame.addInt32(mockInt32); + + uint16_t mockUInt16 = 42; + error |= txFrame.addUInt16(mockUInt16); + + int16_t mockInt16 = 42; + error |= txFrame.addInt16(mockInt16); + + uint8_t mockUInt8 = 42; + error |= txFrame.addUInt8(mockUInt8); + + int8_t mockInt8 = 42; + error |= txFrame.addInt8(mockInt8); + + float mockFloat = 42.0f; + error |= txFrame.addFloat(mockFloat); + + bool mockBool = true; + error |= txFrame.addBool(mockBool); + + uint8_t mockBytes[] = {42, 42, 42, 42}; + error |= txFrame.addBytes(mockBytes, 4); + + uint8_t mockAddress = 42; + + error |= SensirionI2CCommunication::sendFrame(mockAddress, txFrame, Wire); + + size_t mockNumBytes = 42; + error |= SensirionI2CCommunication::receiveFrame(mockAddress, mockNumBytes, + rxFrame, Wire); + + error |= rxFrame.getUInt32(mockUInt32); + error |= rxFrame.getInt32(mockInt32); + error |= rxFrame.getUInt16(mockUInt16); + error |= rxFrame.getInt16(mockInt16); + error |= rxFrame.getUInt8(mockUInt8); + error |= rxFrame.getInt8(mockInt8); + error |= rxFrame.getFloat(mockFloat); + error |= rxFrame.getBytes(mockBytes, 4); +} diff --git a/src/library/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino b/src/library/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino new file mode 100644 index 0000000..2ff07bb --- /dev/null +++ b/src/library/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino @@ -0,0 +1,73 @@ +#include +#include + +uint8_t txBuffer[256]; +uint8_t rxBuffer[256]; + +SensirionShdlcTxFrame txFrame(txBuffer, 256); +SensirionShdlcRxFrame rxFrame(rxBuffer, 256); + +void setup() { + Serial.begin(115200); +} + +void loop() { + uint8_t mockCommand = 42; + uint8_t mockAddress = 42; + uint8_t mockDataLength = 42; + uint16_t error = txFrame.begin(mockCommand, mockAddress, mockDataLength); + + uint32_t mockUInt32 = 42; + error |= txFrame.addUInt32(mockUInt32); + + int32_t mockInt32 = 42; + error |= txFrame.addInt32(mockInt32); + + uint16_t mockUInt16 = 42; + error |= txFrame.addUInt16(mockUInt16); + + int16_t mockInt16 = 42; + error |= txFrame.addInt16(mockInt16); + + uint8_t mockUInt8 = 42; + error |= txFrame.addUInt8(mockUInt8); + + int8_t mockInt8 = 42; + error |= txFrame.addInt8(mockInt8); + + float mockFloat = 42.0f; + error |= txFrame.addFloat(mockFloat); + + bool mockBool = true; + error |= txFrame.addBool(mockBool); + + uint8_t mockBytes[] = {42, 42, 42, 42}; + error |= txFrame.addBytes(mockBytes, 4); + + error |= txFrame.finish(); + + error |= SensirionShdlcCommunication::sendFrame(txFrame, Serial); + + error |= SensirionShdlcCommunication::sendAndReceiveFrame( + Serial, txFrame, rxFrame, 10000000); + + error |= + SensirionShdlcCommunication::receiveFrame(rxFrame, Serial, 1000000); + + error |= rxFrame.getUInt32(mockUInt32); + error |= rxFrame.getInt32(mockInt32); + error |= rxFrame.getUInt16(mockUInt16); + error |= rxFrame.getInt16(mockInt16); + error |= rxFrame.getUInt8(mockUInt8); + error |= rxFrame.getInt8(mockInt8); + error |= rxFrame.getFloat(mockFloat); + error |= rxFrame.getBytes(mockBytes, 4); + + mockCommand = rxFrame.getCommand(); + mockAddress = rxFrame.getAddress(); + mockDataLength = rxFrame.getDataLength(); + uint8_t mockState = rxFrame.getState(); + if (mockState) { + // There is an error in the device. + } +} diff --git a/src/library/SensirionCore/keywords.txt b/src/library/SensirionCore/keywords.txt new file mode 100644 index 0000000..910b122 --- /dev/null +++ b/src/library/SensirionCore/keywords.txt @@ -0,0 +1,56 @@ +####################################### +# Syntax Coloring Map +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### +SensirionShdlcCommunication KEYWORD1 +SensirionShdlcRxFrame KEYWORD1 +SensirionShdlcTxFrame KEYWORD1 +SensirionI2CTxFrame KEYWORD1 +SensirionI2CRxFrame KEYWORD1 +SensirionI2CCommunication KEYWORD1 + +# SensirionErrors.h +HighLevelError KEYWORD1 +LowLevelError KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +sendFrame KEYWORD2 +receiveFrame KEYWORD2 +sendAndReceiveFrame KEYWORD2 +addUInt32 KEYWORD2 +addInt32 KEYWORD2 +addUInt16 KEYWORD2 +addInt16 KEYWORD2 +addUInt8 KEYWORD2 +addInt8 KEYWORD2 +addFloat KEYWORD2 +addBytes KEYWORD2 +addBool KEYWORD2 +addCommand KEYWORD2 +begin KEYWORD2 +finish KEYWORD2 +reset KEYWORD2 +getUInt32 KEYWORD2 +getInt32 KEYWORD2 +getUInt16 KEYWORD2 +getInt16 KEYWORD2 +getUInt8 KEYWORD2 +getInt8 KEYWORD2 +getFloat KEYWORD2 +getBytes KEYWORD2 +getCommand KEYWORD2 +getAddress KEYWORD2 +getDataLength KEYWORD2 +getState KEYWORD2 + +# SensirionErrors.h +errorToString KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/src/library/SensirionCore/library.properties b/src/library/SensirionCore/library.properties new file mode 100644 index 0000000..9c5934f --- /dev/null +++ b/src/library/SensirionCore/library.properties @@ -0,0 +1,9 @@ +name=Sensirion Core +version=0.6.0 +author=Sensirion +maintainer=Sensirion +sentence=Library containing code base for Sensirion Sensor Libraries. +paragraph=All Libraries for Sensirion Sensors use this library as a code base. In this library the Sensirion specific parts for I2C and UART communication are implemented. It provides dynamic frame construction, checksum calculation and buffer handling. +category=Communication +url=https://github.com/Sensirion/arduino-core/ +includes=SensirionCore.h diff --git a/src/library/SensirionCore/src/SensirionCore.h b/src/library/SensirionCore/src/SensirionCore.h new file mode 100644 index 0000000..9222b61 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionCore.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SENSIRION_CORE_H_ +#define _SENSIRION_CORE_H_ + +#include "SensirionCrc.h" +#include "SensirionErrors.h" +#include "SensirionRxFrame.h" + +#include "SensirionShdlcCommunication.h" +#include "SensirionShdlcRxFrame.h" +#include "SensirionShdlcTxFrame.h" + +#include "SensirionI2CCommunication.h" +#include "SensirionI2CRxFrame.h" +#include "SensirionI2CTxFrame.h" + +#endif /* _SENSIRION_CORE_H_ */ diff --git a/src/library/SensirionCore/src/SensirionCoreArduinoLibrary.h b/src/library/SensirionCore/src/SensirionCoreArduinoLibrary.h new file mode 100644 index 0000000..fcfeb6d --- /dev/null +++ b/src/library/SensirionCore/src/SensirionCoreArduinoLibrary.h @@ -0,0 +1,51 @@ +/* + * + * THIS IS A LEGACY FILE AND WILL BE REMOVED SOON. + * + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SENSIRION_CORE_ARDUINO_LIBRARY_H_ +#define _SENSIRION_CORE_ARDUINO_LIBRARY_H_ + +#pragma GCC warning \ + "Legacy file SensirionCoreArdunioLibrary.h included. Please include SensirionCore.h instead." + +#include "SensirionErrors.h" +#include "SensirionRxFrame.h" + +#include "SensirionShdlcCommunication.h" +#include "SensirionShdlcRxFrame.h" +#include "SensirionShdlcTxFrame.h" + +#include "SensirionI2CCommunication.h" +#include "SensirionI2CRxFrame.h" +#include "SensirionI2CTxFrame.h" + +#endif /* _SENSIRION_CORE_ARDUION_LIBRARY_H_ */ diff --git a/src/library/SensirionCore/src/SensirionCrc.cpp b/src/library/SensirionCore/src/SensirionCrc.cpp new file mode 100644 index 0000000..25b8234 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionCrc.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "SensirionCrc.h" + +uint8_t generateCRCGeneric(const uint8_t* data, size_t count, uint8_t init, + uint8_t polynomial) { + uint8_t crc = init; + + /* calculates 8-Bit checksum with given polynomial */ + for (size_t current_byte = 0; current_byte < count; ++current_byte) { + crc ^= (data[current_byte]); + for (uint8_t crc_bit = 8; crc_bit > 0; --crc_bit) { + if (crc & 0x80) + crc = (crc << 1) ^ polynomial; + else + crc = (crc << 1); + } + } + return crc; +} + +uint8_t generateCRC31_ff(const uint8_t* data, size_t count) { + return generateCRCGeneric(data, count, 0xff, 0x31); +} + +uint8_t generateCRC31_00(const uint8_t* data, size_t count) { + return generateCRCGeneric(data, count, 0x00, 0x31); +} + +uint8_t generateCRC(const uint8_t* data, size_t count, CrcPolynomial type) { + if (CRC31_00 == type) { + return generateCRC31_00(data, count); + } + return generateCRC31_ff(data, count); +} diff --git a/src/library/SensirionCore/src/SensirionCrc.h b/src/library/SensirionCore/src/SensirionCrc.h new file mode 100644 index 0000000..904fc92 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionCrc.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SENSIRION_CRC_H_ +#define _SENSIRION_CRC_H_ + +#include +#include + +enum CrcPolynomial : uint8_t { + CRC31_00 = 0x0, + CRC31_ff = 0x1, +}; + +uint8_t generateCRCGeneric(const uint8_t* data, size_t count, uint8_t init, + uint8_t polynomial); + +uint8_t generateCRC31_ff(const uint8_t* data, size_t count); + +uint8_t generateCRC31_00(const uint8_t* data, size_t count); + +/** + * @brief Generate a crc for data given a polynomial type + * + * @param data data to calculate CRC for + * @param count the array size of data + * @param poly CRC polynomal to use + */ +uint8_t generateCRC(const uint8_t* data, size_t count, CrcPolynomial type); + +#endif /* _SENSIRION_CRC_H_ */ diff --git a/src/library/SensirionCore/src/SensirionErrors.cpp b/src/library/SensirionCore/src/SensirionErrors.cpp new file mode 100644 index 0000000..b0d7ffe --- /dev/null +++ b/src/library/SensirionCore/src/SensirionErrors.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "SensirionErrors.h" + +#include +#include +#include + +void errorToString(uint16_t error, char errorMessage[], + size_t errorMessageSize) { + + uint16_t highLevelError = error & 0xFF00; + uint16_t lowLevelError = error & 0x00FF; + + if (error & HighLevelError::SensorSpecificError) { + snprintf(errorMessage, errorMessageSize, "Sensor specific error: 0x%2x", + lowLevelError); + return; + } + + switch (highLevelError) { + case HighLevelError::NoError: + if (!error) { + strncpy(errorMessage, "No error", errorMessageSize); + return; + } + break; + case HighLevelError::WriteError: + switch (lowLevelError) { + case LowLevelError::SerialWriteError: + strncpy(errorMessage, "Error writing to serial", + errorMessageSize); + return; + case LowLevelError::InternalBufferSizeError: + strncpy(errorMessage, + "Data too long to fit in transmit buffer", + errorMessageSize); + return; + case LowLevelError::I2cAddressNack: + strncpy(errorMessage, + "Received NACK on transmit of address", + errorMessageSize); + return; + case LowLevelError::I2cDataNack: + strncpy(errorMessage, "Received NACK on transmit of data", + errorMessageSize); + return; + case LowLevelError::I2cOtherError: + strncpy(errorMessage, "Error writing to I2C bus", + errorMessageSize); + return; + } + break; + case HighLevelError::ReadError: + switch (lowLevelError) { + case LowLevelError::NonemptyFrameError: + strncpy(errorMessage, "Frame already contains data", + errorMessageSize); + return; + case LowLevelError::TimeoutError: + strncpy(errorMessage, "Timeout while reading data", + errorMessageSize); + return; + case LowLevelError::ChecksumError: + strncpy(errorMessage, "Checksum is wrong", + errorMessageSize); + return; + case LowLevelError::CRCError: + strncpy(errorMessage, "Wrong CRC found", errorMessageSize); + return; + case LowLevelError::WrongNumberBytesError: + strncpy(errorMessage, "Number of bytes not a multiple of 3", + errorMessageSize); + return; + case LowLevelError::NotEnoughDataError: + strncpy(errorMessage, "Not enough data received", + errorMessageSize); + return; + case LowLevelError::InternalBufferSizeError: + strncpy(errorMessage, "Internal I2C buffer too small", + errorMessageSize); + return; + } + break; + case HighLevelError::ExecutionError: { + char format[] = "Execution error, status register: 0x%x"; + snprintf(errorMessage, errorMessageSize, format, lowLevelError); + return; + } + case HighLevelError::TxFrameError: + switch (lowLevelError) { + case LowLevelError::BufferSizeError: + strncpy(errorMessage, "Not enough space in buffer", + errorMessageSize); + return; + } + break; + case HighLevelError::RxFrameError: + switch (lowLevelError) { + case LowLevelError::BufferSizeError: + strncpy(errorMessage, "Not enough space in buffer", + errorMessageSize); + return; + case LowLevelError::NoDataError: + strncpy(errorMessage, "No more data in frame", + errorMessageSize); + return; + case LowLevelError::RxAddressError: + strncpy(errorMessage, "Wrong address in return frame", + errorMessageSize); + return; + case LowLevelError::RxCommandError: + strncpy(errorMessage, "Wrong command in return frame", + errorMessageSize); + return; + } + } + strncpy(errorMessage, "Error processing error", errorMessageSize); + return; +} diff --git a/src/library/SensirionCore/src/SensirionErrors.h b/src/library/SensirionCore/src/SensirionErrors.h new file mode 100644 index 0000000..268d975 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionErrors.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SENSIRION_ERRORS_H_ +#define _SENSIRION_ERRORS_H_ + +#include +#include + +enum HighLevelError : uint16_t { + // general errors + NoError = 0, + WriteError = 0x0100, + ReadError = 0x0200, + TxFrameError = 0x0300, + RxFrameError = 0x0400, + // shdlc errors + ExecutionError = 0x0500, + // i2c errors + + // Sensor specific errors. All errors higher than that are depending on the + // sensor used. + SensorSpecificError = 0x8000, +}; + +enum LowLevelError : uint16_t { + // general errors + NonemptyFrameError, + NoDataError, + BufferSizeError, + // shdlc errors + StopByteError, + ChecksumError, + TimeoutError, + RxCommandError, + RxAddressError, + SerialWriteError, + // i2c errors + WrongNumberBytesError, + CRCError, + I2cAddressNack, + I2cDataNack, + I2cOtherError, + NotEnoughDataError, + InternalBufferSizeError, +}; + +/** + * errorToString() - Convert error code to a human readable error message + * + * @param error Error code to be converted. + * @param errorMessage String where the error text can be + * stored. + * @param errorMessageSize Size in bytes of the string buffer for the error + * message. + */ +void errorToString(uint16_t error, char errorMessage[], + size_t errorMessageSize); + +#endif /* _SENSIRION_ERRORS_H_ */ diff --git a/src/library/SensirionCore/src/SensirionI2CCommunication.cpp b/src/library/SensirionCore/src/SensirionI2CCommunication.cpp new file mode 100644 index 0000000..2d8b7ac --- /dev/null +++ b/src/library/SensirionCore/src/SensirionI2CCommunication.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "SensirionI2CCommunication.h" + +#include +#include + +#include "Arduino.h" +#include "SensirionCrc.h" +#include "SensirionErrors.h" +#include "SensirionI2CRxFrame.h" +#include "SensirionI2CTxFrame.h" + +static void clearRxBuffer(TwoWire& i2cBus) { + while (i2cBus.available()) { + (void)i2cBus.read(); + } +} + +uint16_t SensirionI2CCommunication::sendFrame(uint8_t address, + SensirionI2CTxFrame& frame, + TwoWire& i2cBus) { + i2cBus.beginTransmission(address); + size_t writtenBytes = i2cBus.write(frame._buffer, frame._index); + uint8_t i2c_error = i2cBus.endTransmission(); + if (writtenBytes != frame._index) { + return WriteError | I2cOtherError; + } + // translate Arduino errors, see + // https://www.arduino.cc/en/Reference/WireEndTransmission + switch (i2c_error) { + case 0: + return NoError; + case 1: + return WriteError | InternalBufferSizeError; + case 2: + return WriteError | I2cAddressNack; + case 3: + return WriteError | I2cDataNack; + default: + return WriteError | I2cOtherError; + } +} + +uint16_t SensirionI2CCommunication::receiveFrame(uint8_t address, + size_t numBytes, + SensirionI2CRxFrame& frame, + TwoWire& i2cBus, + CrcPolynomial poly) { + size_t readAmount; + size_t i = 0; + +#ifdef I2C_BUFFER_LENGTH + const uint8_t sizeBuffer = + (static_cast(I2C_BUFFER_LENGTH) / static_cast(3)) * 3; +#elif defined(BUFFER_LENGTH) + const uint8_t sizeBuffer = + (static_cast(BUFFER_LENGTH) / static_cast(3)) * 3; +#else + const uint8_t sizeBuffer = 30; +#endif + + if (numBytes % 3) { + return ReadError | WrongNumberBytesError; + } + if ((numBytes / 3) * 2 > frame._bufferSize) { + return ReadError | BufferSizeError; + } + if (numBytes > sizeBuffer) { + return ReadError | InternalBufferSizeError; + } + + readAmount = i2cBus.requestFrom(address, static_cast(numBytes), + static_cast(true)); + if (numBytes != readAmount) { + return ReadError | NotEnoughDataError; + } + do { + frame._buffer[i++] = i2cBus.read(); + frame._buffer[i++] = i2cBus.read(); + uint8_t actualCRC = i2cBus.read(); + uint8_t expectedCRC = generateCRC(&frame._buffer[i - 2], 2, poly); + if (actualCRC != expectedCRC) { + clearRxBuffer(i2cBus); + return ReadError | CRCError; + } + readAmount -= 3; + } while (readAmount > 0); + frame._numBytes = i; + return NoError; +} diff --git a/src/library/SensirionCore/src/SensirionI2CCommunication.h b/src/library/SensirionCore/src/SensirionI2CCommunication.h new file mode 100644 index 0000000..33f3cb5 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionI2CCommunication.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SENSIRION_I2C_COMMUNICATION_H_ +#define SENSIRION_I2C_COMMUNICATION_H_ + +#include +#include + +#include "Arduino.h" +#include + +#include "SensirionI2CRxFrame.h" +#include "SensirionI2CTxFrame.h" + +class SensirionI2CTxFrame; +class SensirionI2CRxFrame; + +/* + * SensirionI2CCommunication - Class which is responsible for the communication + * via a I2C bus. It provides functionality to send and receive frames from a + * Sensirion sensor. The data is sent and received in a SensirionI2cTxFrame or + * SensirionI2cRxFrame respectively. + */ +class SensirionI2CCommunication { + public: + /** + * sendFrame() - Sends frame to sensor + * + * @param address I2C address of the sensor. + * @param frame Tx frame object containing a finished frame to send to + * the sensor. + * @param i2cBus TwoWire object to communicate with the sensor. + * + * @return NoError on success, an error code otherwise + */ + static uint16_t sendFrame(uint8_t address, SensirionI2CTxFrame& frame, + TwoWire& i2cBus); + + /** + * receiveFrame() - Receive Frame from sensor + * + * @param address I2C address of the sensor. + * @param numBytes Number of bytes to receive. + * @param frame Rx frame to store the received data in. + * @param i2cBus TwoWire object to communicate with the sensor. + * @param poly CRC polynomal to use. Defaults to 0x31 with init 0xFF + * + * @return NoError on success, an error code otherwise + */ + static uint16_t receiveFrame(uint8_t address, size_t numBytes, + SensirionI2CRxFrame& frame, TwoWire& i2cBus, + CrcPolynomial poly = CRC31_ff); +}; + +#endif /* SENSIRION_I2C_COMMUNICATION_H_ */ diff --git a/src/library/SensirionCore/src/SensirionI2CRxFrame.h b/src/library/SensirionCore/src/SensirionI2CRxFrame.h new file mode 100644 index 0000000..e15cfa2 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionI2CRxFrame.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SENSIRION_I2C_RX_FRAME_H_ +#define SENSIRION_I2C_RX_FRAME_H_ + +#include +#include + +#include "SensirionI2CCommunication.h" +#include "SensirionRxFrame.h" + +/** + * SenirionI2CRxFrame - Class which decodes the through I2C received data into + * common data types. It contains a buffer which is filled by the + * SensirionI2CCommunication class. By calling the different decode function + * inherited from the SensirionRxFrame base class the raw data can be decoded + * into different data types. + */ +class SensirionI2CRxFrame : public SensirionRxFrame { + + friend class SensirionI2CCommunication; + + public: + /** + * Constructor + * + * @param buffer Buffer in which the receive frame will be + * stored. + * @param bufferSize Number of bytes in the buffer for the receive frame. + * + */ + SensirionI2CRxFrame(uint8_t buffer[], size_t bufferSize) + : SensirionRxFrame(buffer, bufferSize){}; +}; + +#endif /* SENSIRION_I2C_RX_FRAME_H_ */ diff --git a/src/library/SensirionCore/src/SensirionI2CTxFrame.cpp b/src/library/SensirionCore/src/SensirionI2CTxFrame.cpp new file mode 100644 index 0000000..67999f8 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionI2CTxFrame.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "SensirionI2CTxFrame.h" + +#include +#include + +#include "SensirionCrc.h" +#include "SensirionErrors.h" + +SensirionI2CTxFrame::SensirionI2CTxFrame(uint8_t buffer[], size_t bufferSize, + size_t numCommandBytes, + CrcPolynomial poly) + : _buffer(buffer), _bufferSize(bufferSize), _index(numCommandBytes), + _numCommandBytes(numCommandBytes), _polynomial_type(poly) { +} + +SensirionI2CTxFrame::SensirionI2CTxFrame(uint8_t buffer[], size_t bufferSize, + CrcPolynomial poly) + : SensirionI2CTxFrame(buffer, bufferSize, 2, poly) { +} + +SensirionI2CTxFrame SensirionI2CTxFrame::createWithUInt8Command( + uint8_t command, uint8_t buffer[], size_t bufferSize, CrcPolynomial poly) { + SensirionI2CTxFrame instance = + SensirionI2CTxFrame(buffer, bufferSize, 1, poly); + instance._buffer[0] = command; + return instance; +} + +SensirionI2CTxFrame SensirionI2CTxFrame::createWithUInt16Command( + uint16_t command, uint8_t buffer[], size_t bufferSize, CrcPolynomial poly) { + SensirionI2CTxFrame instance = + SensirionI2CTxFrame(buffer, bufferSize, 2, poly); + instance._buffer[0] = static_cast((command & 0xFF00) >> 8); + instance._buffer[1] = static_cast((command & 0x00FF) >> 0); + return instance; +} + +uint16_t SensirionI2CTxFrame::addCommand(uint16_t command) { + if (_bufferSize < 2) { + return TxFrameError | BufferSizeError; + } + _buffer[0] = static_cast((command & 0xFF00) >> 8); + _buffer[1] = static_cast((command & 0x00FF) >> 0); + return NoError; +} + +uint16_t SensirionI2CTxFrame::addUInt32(uint32_t data) { + uint16_t error = _addByte(static_cast((data & 0xFF000000) >> 24)); + error |= _addByte(static_cast((data & 0x00FF0000) >> 16)); + error |= _addByte(static_cast((data & 0x0000FF00) >> 8)); + error |= _addByte(static_cast((data & 0x000000FF) >> 0)); + return error; +} + +uint16_t SensirionI2CTxFrame::addInt32(int32_t data) { + return addUInt32(static_cast(data)); +} + +uint16_t SensirionI2CTxFrame::addUInt16(uint16_t data) { + uint16_t error = _addByte(static_cast((data & 0xFF00) >> 8)); + error |= _addByte(static_cast((data & 0x00FF) >> 0)); + return error; +} + +uint16_t SensirionI2CTxFrame::addInt16(int16_t data) { + return addUInt16(static_cast(data)); +} + +uint16_t SensirionI2CTxFrame::addUInt8(uint8_t data) { + return _addByte(data); +} + +uint16_t SensirionI2CTxFrame::addInt8(int8_t data) { + return _addByte(static_cast(data)); +} + +uint16_t SensirionI2CTxFrame::addBool(bool data) { + return _addByte(static_cast(data)); +} + +uint16_t SensirionI2CTxFrame::addFloat(float data) { + union { + uint32_t uInt32Data; + float floatData; + } convert; + + convert.floatData = data; + return addUInt32(convert.uInt32Data); +} + +uint16_t SensirionI2CTxFrame::addBytes(const uint8_t data[], + size_t dataLength) { + uint16_t error = 0; + for (size_t i = 0; i < dataLength; i++) { + error |= _addByte(data[i]); + } + return error; +} + +uint16_t SensirionI2CTxFrame::_addByte(uint8_t data) { + if (_bufferSize <= _index) { + return TxFrameError | BufferSizeError; + } + _buffer[_index++] = data; + if ((_index - _numCommandBytes) % 3 == 2) { + if (_bufferSize <= _index) { + return TxFrameError | BufferSizeError; + } + uint8_t crc = generateCRC(&_buffer[_index - 2], 2, _polynomial_type); + _buffer[_index++] = crc; + } + return NoError; +} diff --git a/src/library/SensirionCore/src/SensirionI2CTxFrame.h b/src/library/SensirionCore/src/SensirionI2CTxFrame.h new file mode 100644 index 0000000..3e5cee3 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionI2CTxFrame.h @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SENSIRION_I2C_TX_FRAME_H_ +#define SENSIRION_I2C_TX_FRAME_H_ + +#include +#include + +#include "SensirionCrc.h" +#include "SensirionI2CCommunication.h" + +/* + * SensirionI2CTxFrame - Class which helps to build a correct I2C frame for + * Sensirion Sensors. The different addDatatype() functions add the frame data + * and the addCommand() function writes the command at the beginning. Using + * these functions one can easily construct a I2C frame for Sensirion sensors. + */ +class SensirionI2CTxFrame { + + friend class SensirionI2CCommunication; + + public: + /** + * Factory to create a SensirionI2CTxFrame using a UInt8 command. + * + * @param command Command to add to the send frame. + * @param buffer Buffer in which the send frame will be stored. + * @param bufferSize Number of bytes in the buffer for the send frame. + * @param poly CRC polynomal to use. Defaults to 0x31 with init 0xFF + * + * @return the constructed SensirionI2CTxFrame. + */ + static SensirionI2CTxFrame + createWithUInt8Command(uint8_t command, uint8_t buffer[], size_t bufferSize, + CrcPolynomial poly = CRC31_ff); + + /** + * Factory to create a SensirionI2CTxFrame using a UInt16 command. + * + * @param command Command to add to the send frame. + * @param buffer Buffer in which the send frame will be stored. + * @param bufferSize Number of bytes in the buffer for the send frame. + * @param poly CRC polynomal to use. Defaults to 0x31 with init 0xFF + * + * @return the constructed SensirionI2CTxFrame. + */ + static SensirionI2CTxFrame + createWithUInt16Command(uint16_t command, uint8_t buffer[], + size_t bufferSize, CrcPolynomial poly = CRC31_ff); + + /** + * Constructor + * + * @param buffer Buffer in which the send frame will be stored. + * @param bufferSize Number of bytes in the buffer for the send frame. + * @param poly CRC polynomal to use. Defaults to 0x31 with init 0xFF + * + * @deprecated Use createWithUInt16Command() instead + */ + SensirionI2CTxFrame(uint8_t buffer[], size_t bufferSize, + CrcPolynomial poly = CRC31_ff); + + /** + * addCommand() - Add command to the send frame. + * + * @param command Command to add to the send frame. + * + * @return NoError on success, an error code otherwise + * + * @deprecated Use createWithUInt16Command() instead + */ + uint16_t addCommand(uint16_t command); + + /** + * addUInt32() - Add unsigned 32bit integer to the send frame. + * + * @param data Unsigned 32bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addUInt32(uint32_t data); + + /** + * addInt32() - Add signed 32bit integer to the send frame. + * + * @param data Signed 32bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addInt32(int32_t data); + + /** + * addUInt16() - Add unsigned 16bit integer to the send frame. + * + * @param data Unsigned 16bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addUInt16(uint16_t data); + + /** + * addInt16() - Add signed 16bit integer to the send frame. + * + * @param data Signed 16bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addInt16(int16_t data); + + /** + * addUInt8() - Add unsigned 8bit integer to the send frame. + * + * @param data Unsigned 8bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addUInt8(uint8_t data); + + /** + * addInt8() - Add signed 8bit integer to the send frame. + * + * @param data Signed 8bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addInt8(int8_t data); + + /** + * addBool() - Add boolean to the send frame. + * + * @param data Boolean to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addBool(bool data); + + /** + * addFloat() - Add float to the send frame. + * + * @param data Float to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addFloat(float data); + + /** + * addBytes() - Add byte array to the send frame. + * + * @param data Byte array to add to the send frame. + * @param dataLength Number of bytes to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addBytes(const uint8_t data[], size_t dataLength); + + private: + SensirionI2CTxFrame(uint8_t buffer[], size_t bufferSize, + size_t numCommandBytes, CrcPolynomial poly = CRC31_ff); + + uint16_t _addByte(uint8_t data); + + uint8_t* _buffer; + size_t _bufferSize; + size_t _index; + size_t _numCommandBytes; + CrcPolynomial _polynomial_type; +}; + +#endif /* SENSIRION_I2C_TX_FRAME_H_ */ diff --git a/src/library/SensirionCore/src/SensirionRxFrame.cpp b/src/library/SensirionCore/src/SensirionRxFrame.cpp new file mode 100644 index 0000000..c653c25 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionRxFrame.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "SensirionRxFrame.h" + +#include +#include + +#include "SensirionErrors.h" + +SensirionRxFrame::SensirionRxFrame(uint8_t buffer[], size_t bufferSize) + : _buffer(buffer), _bufferSize(bufferSize), _index(0), _numBytes(0) { +} + +uint16_t SensirionRxFrame::getUInt32(uint32_t& data) { + if (_numBytes < 4) { + return RxFrameError | NoDataError; + } + data = static_cast(_buffer[_index++]) << 24; + data |= static_cast(_buffer[_index++]) << 16; + data |= static_cast(_buffer[_index++]) << 8; + data |= static_cast(_buffer[_index++]); + _numBytes -= 4; + return NoError; +} + +uint16_t SensirionRxFrame::getInt32(int32_t& data) { + uint32_t ret; + uint16_t error = getUInt32(ret); + data = static_cast(ret); + return error; +} + +uint16_t SensirionRxFrame::getUInt16(uint16_t& data) { + if (_numBytes < 2) { + return RxFrameError | NoDataError; + } + data = static_cast(_buffer[_index++]) << 8; + data |= static_cast(_buffer[_index++]); + _numBytes -= 2; + return NoError; +} + +uint16_t SensirionRxFrame::getInt16(int16_t& data) { + uint16_t ret; + uint16_t error = getUInt16(ret); + data = static_cast(ret); + return error; +} + +uint16_t SensirionRxFrame::getUInt8(uint8_t& data) { + if (_numBytes < 1) { + return RxFrameError | NoDataError; + } + data = _buffer[_index++]; + _numBytes -= 1; + return NoError; +} + +uint16_t SensirionRxFrame::getInt8(int8_t& data) { + if (_numBytes < 1) { + return RxFrameError | NoDataError; + } + data = static_cast(_buffer[_index++]); + _numBytes -= 1; + return NoError; +} + +uint16_t SensirionRxFrame::getBool(bool& data) { + if (_numBytes < 1) { + return RxFrameError | NoDataError; + } + data = static_cast(_buffer[_index++]); + _numBytes -= 1; + return NoError; +} + +uint16_t SensirionRxFrame::getFloat(float& data) { + union { + uint32_t uInt32Data; + float floatData; + } convert; + uint16_t error = getUInt32(convert.uInt32Data); + data = convert.floatData; + return error; +} + +uint16_t SensirionRxFrame::getBytes(uint8_t data[], size_t maxBytes) { + if (_numBytes < 1) { + return RxFrameError | NoDataError; + } + size_t readAmount = maxBytes; + if (_numBytes < maxBytes) { + readAmount = _numBytes; + } + for (size_t i = 0; i < readAmount; i++) { + data[i] = _buffer[_index++]; + } + _numBytes -= readAmount; + return NoError; +} diff --git a/src/library/SensirionCore/src/SensirionRxFrame.h b/src/library/SensirionCore/src/SensirionRxFrame.h new file mode 100644 index 0000000..a4384fb --- /dev/null +++ b/src/library/SensirionCore/src/SensirionRxFrame.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SENSIRION_RX_FRAME_H_ +#define SENSIRION_RX_FRAME_H_ + +#include +#include + +/** + * SenirionRxFrame - Base class for SensirionShdlcRxFrame and + * SensirionI2cRxFrame. It decodes received data into common data types. The + * data is contained in a buffer which is filled by the one of the two + * communication classes. By calling the different decode function the raw data + * can be decoded into different data types. + */ +class SensirionRxFrame { + + friend class SensirionI2CCommunication; + friend class SensirionShdlcCommunication; + + public: + /** + * Constructor + * + * @param buffer Buffer in which the receive frame will be stored. + * @param bufferSize Number of bytes in the buffer for the receive frame. + */ + SensirionRxFrame(uint8_t buffer[], size_t bufferSize); + + /** + * getUInt32() - Get unsigned 32bit integer from the received data. + * + * @param data Memory to store unsigned 32bit integer in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getUInt32(uint32_t& data); + + /** + * getInt32() - Get signed 32bit integer from the received data. + * + * @param data Memory to store signed 32bit integer in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getInt32(int32_t& data); + + /** + * getUInt16() - Get unsigned 16bit integer from the received data. + * + * @param data Memory to store unsigned 16bit integer in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getUInt16(uint16_t& data); + + /** + * getInt16() - Get signed 16bit integer from the received data. + * + * @param data Memory to store signed 16bit integer in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getInt16(int16_t& data); + + /** + * getUInt8() - Get unsigned 8bit integer from the received data. + * + * @param data Memory to store unsigned 8bit integer in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getUInt8(uint8_t& data); + + /** + * getInt8() - Get signed 8bit integer from the received data. + * + * @param data Memory to store signed 8bit integer in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getInt8(int8_t& data); + + /** + * getBool() - Get Boolean from the received data. + * + * @param data Memory to store boolean in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getBool(bool& data); + + /** + * getFloat() - Get float from the received data. + * + * @param data Memory to store float in. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getFloat(float& data); + + /** + * getBytes() - Get an array of bytes from the received data. + * + * @param data Buffer to store the bytes in. + * @param maxBytes Maximal amount of bytes to read from the received data. + * + * @return NoError on success, an error code otherwise + */ + uint16_t getBytes(uint8_t data[], size_t maxBytes); + + private: + uint8_t* _buffer = 0; + size_t _bufferSize = 0; + size_t _index = 0; + size_t _numBytes = 0; +}; + +#endif /* SENSIRION_RX_FRAME_H_ */ diff --git a/src/library/SensirionCore/src/SensirionShdlcCommunication.cpp b/src/library/SensirionCore/src/SensirionShdlcCommunication.cpp new file mode 100644 index 0000000..300546e --- /dev/null +++ b/src/library/SensirionCore/src/SensirionShdlcCommunication.cpp @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "SensirionShdlcCommunication.h" + +#include +#include + +#include "Arduino.h" +#include "SensirionErrors.h" +#include "SensirionShdlcRxFrame.h" +#include "SensirionShdlcTxFrame.h" + +static uint16_t readByte(uint8_t& data, Stream& serial, unsigned long startTime, + unsigned long timeoutMicros) { + do { + if (micros() - startTime > timeoutMicros) { + return ReadError | TimeoutError; + } + } while (!serial.available()); + data = serial.read(); + return NoError; +} + +static uint16_t unstuffByte(uint8_t& data, Stream& serial, + unsigned long startTime, + unsigned long timeoutMicros) { + uint16_t error = readByte(data, serial, startTime, timeoutMicros); + if (error) { + return error; + } + if (data == 0x7d) { + error = readByte(data, serial, startTime, timeoutMicros); + if (error) { + return error; + } + data = data ^ (1 << 5); + } + return NoError; +} + +uint16_t SensirionShdlcCommunication::sendFrame(SensirionShdlcTxFrame& frame, + Stream& serial) { + size_t writtenBytes = serial.write(&frame._buffer[0], frame._index); + if (writtenBytes != frame._index) { + return WriteError | SerialWriteError; + } + return NoError; +} + +uint16_t SensirionShdlcCommunication::receiveFrame( + SensirionShdlcRxFrame& frame, Stream& serial, unsigned long timeoutMicros) { + unsigned long startTime = micros(); + uint16_t error; + uint8_t dataLength; + uint8_t current = 0; + + if (frame._numBytes) { + return ReadError | NonemptyFrameError; + } + + // Wait for start byte and ignore all other bytes in case a partial frame + // is still in the receive buffer due to a previous error. + do { + error = readByte(current, serial, startTime, timeoutMicros); + if (error) { + return error; + } + } while (current != 0x7e); + + // Handle a repeated start byte which may happen + do { + error = unstuffByte(current, serial, startTime, timeoutMicros); + if (error) { + return error; + } + } while (current == 0x7e); + + frame._address = current; + error = unstuffByte(frame._command, serial, startTime, timeoutMicros); + if (error) { + return error; + } + error = unstuffByte(frame._state, serial, startTime, timeoutMicros); + if (error) { + return error; + } + error = unstuffByte(dataLength, serial, startTime, timeoutMicros); + if (error) { + return error; + } + + uint8_t checksum = + frame._address + frame._command + frame._state + dataLength; + + if (dataLength > frame._bufferSize) { + return RxFrameError | BufferSizeError; + } + + size_t i = 0; + while (i < dataLength) { + error = unstuffByte(current, serial, startTime, timeoutMicros); + if (error) { + return error; + } + frame._buffer[i] = current; + checksum += current; + i++; + } + + uint8_t expectedChecksum = ~checksum; + uint8_t actualChecksum; + error = unstuffByte(actualChecksum, serial, startTime, timeoutMicros); + if (error) { + return error; + } + if (expectedChecksum != actualChecksum) { + return ReadError | ChecksumError; + } + + uint8_t stop; + error = readByte(stop, serial, startTime, timeoutMicros); + if (error) { + return error; + } + if (stop != 0x7e) { + return ReadError | StopByteError; + } + if (frame._state & 0x7F) { + return ExecutionError | frame._state; + } + frame._dataLength = dataLength; + frame._numBytes = dataLength; + return NoError; +} + +uint16_t SensirionShdlcCommunication::sendAndReceiveFrame( + Stream& serial, SensirionShdlcTxFrame& txFrame, + SensirionShdlcRxFrame& rxFrame, unsigned long rxTimeoutMicros) { + uint16_t error; + error = SensirionShdlcCommunication::sendFrame(txFrame, serial); + if (error) { + return error; + } + error = SensirionShdlcCommunication::receiveFrame(rxFrame, serial, + rxTimeoutMicros); + if (error) { + return error; + } + if (rxFrame.getCommand() != txFrame.getCommand()) { + return RxFrameError | RxCommandError; + } + if (rxFrame.getAddress() != txFrame.getAddress()) { + return RxFrameError | RxAddressError; + } + return NoError; +} diff --git a/src/library/SensirionCore/src/SensirionShdlcCommunication.h b/src/library/SensirionCore/src/SensirionShdlcCommunication.h new file mode 100644 index 0000000..9d2dc35 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionShdlcCommunication.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SENSIRION_SHDLC_COMMUNICATION_H_ +#define SENSIRION_SHDLC_COMMUNICATION_H_ + +#include +#include + +#include "Arduino.h" + +#include "SensirionShdlcRxFrame.h" +#include "SensirionShdlcTxFrame.h" + +class SensirionShdlcTxFrame; +class SensirionShdlcRxFrame; + +/* + * SensirionShdlcCommunication - Class which is responsible for the + * communication via a UART (Serial) interface. It provides functionality to + * send and receive frames from a Sensirion sensor. The data is sent and + * received in a SensirionShdlcTxFrame or SensirionShdlcRxFrame respectively. + */ +class SensirionShdlcCommunication { + + public: + /** + * sendFrame() - Sends frame to sensor + * + * @param frame Tx frame object containing a finished frame to send to the + * sensor. + * @param serial Stream object to communicate with the sensor. + * + * @return NoError on success, an error code otherwise + */ + static uint16_t sendFrame(SensirionShdlcTxFrame& frame, Stream& serial); + + /** + * receiveFrame() - Receive Frame from sensor + * + * @param frame Rx frame to store the received data in. + * @param serial Stream object to communicate with the sensor. + * @param timeoutMicros Timeout in micro seconds for the receive operation. + * + * @return NoError on success, an error code otherwise + */ + static uint16_t receiveFrame(SensirionShdlcRxFrame& frame, Stream& serial, + unsigned long timeoutMicros); + + /** + * sendAndReceiveFrame() - Send and receive a frame from sensor. + * + * @param serial Stream object to communicate with the sensor. + * @param txFrame Tx frame object containing a finished frame to + * send to the sensor. + * @param rxFrame Rx frame to store the received data in. + * @param rxTimeoutMicros Timeout in micro seconds for the receive + * operation. + * + * @return NoError on success, an error code otherwise + */ + static uint16_t sendAndReceiveFrame(Stream& serial, + SensirionShdlcTxFrame& txFrame, + SensirionShdlcRxFrame& rxFrame, + unsigned long rxTimeoutMicros); +}; + +#endif /* SENSIRION_SHDLC_COMMUNICATION_H_ */ diff --git a/src/library/SensirionCore/src/SensirionShdlcRxFrame.h b/src/library/SensirionCore/src/SensirionShdlcRxFrame.h new file mode 100644 index 0000000..d4bca0e --- /dev/null +++ b/src/library/SensirionCore/src/SensirionShdlcRxFrame.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SENSIRION_SHDLC_RX_FRAME_H_ +#define SENSIRION_SHDLC_RX_FRAME_H_ + +#include +#include + +#include "SensirionRxFrame.h" +#include "SensirionShdlcCommunication.h" + +/** + * SenirionShdlcRxFrame - Class which decodes the through UART received data + * into common data types. It contains a buffer which is filled by the + * SensirionShdlcCommunication class. By calling the different decode function + * inherited from the SensirionRxFrame base class the raw data can be decoded + * into different data types. In addition to that it also stores the four + * header bytes defined by the SHDLC protocol state, command, address, + * datalength. These bytes can be read out by the corresponding getter method. + */ +class SensirionShdlcRxFrame : public SensirionRxFrame { + + friend class SensirionShdlcCommunication; + + public: + /** + * Constructor + * + * @param buffer Buffer in which the receive frame will be stored. + * @param bufferSize Number of bytes in the buffer for the receive frame. + */ + SensirionShdlcRxFrame(uint8_t buffer[], size_t bufferSize) + : SensirionRxFrame(buffer, bufferSize){}; + + uint8_t getAddress(void) const { + return _address; + }; + + uint8_t getCommand(void) const { + return _command; + }; + + uint8_t getState(void) const { + return _state; + }; + + uint8_t getDataLength(void) const { + return _dataLength; + }; + + private: + uint8_t _address = 0; + uint8_t _command = 0; + uint8_t _state = 0; + uint8_t _dataLength = 0; +}; + +#endif /* SENSIRION_SHDLC_RX_FRAME_H_ */ diff --git a/src/library/SensirionCore/src/SensirionShdlcTxFrame.cpp b/src/library/SensirionCore/src/SensirionShdlcTxFrame.cpp new file mode 100644 index 0000000..fc8c4c9 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionShdlcTxFrame.cpp @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "SensirionShdlcTxFrame.h" + +#include +#include + +#include "SensirionErrors.h" + +uint16_t SensirionShdlcTxFrame::begin(uint8_t command, uint8_t address, + uint8_t dataLength) { + _buffer[_index++] = 0x7e; + uint16_t error = addUInt8(address); + error |= addUInt8(command); + error |= addUInt8(dataLength); + _command = command; + _address = address; + return error; +} + +uint16_t SensirionShdlcTxFrame::finish(void) { + uint16_t error = addUInt8(~_checksum); + if (error) { + return error; + } + if (_index + 1 > _bufferSize) { + return TxFrameError | BufferSizeError; + } + _buffer[_index++] = 0x7e; + _isFinished = true; + return NoError; +} + +uint16_t SensirionShdlcTxFrame::addUInt32(uint32_t data) { + uint16_t error = addUInt8(static_cast((data & 0xFF000000) >> 24)); + error |= addUInt8(static_cast((data & 0x00FF0000) >> 16)); + error |= addUInt8(static_cast((data & 0x0000FF00) >> 8)); + error |= addUInt8(static_cast((data & 0x000000FF) >> 0)); + return error; +} + +uint16_t SensirionShdlcTxFrame::addInt32(int32_t data) { + return addUInt32(static_cast(data)); +} + +uint16_t SensirionShdlcTxFrame::addUInt16(uint16_t data) { + uint16_t error = addUInt8(static_cast((data & 0xFF00) >> 8)); + error |= addUInt8(static_cast((data & 0x00FF) >> 0)); + return error; +} + +uint16_t SensirionShdlcTxFrame::addInt16(int16_t data) { + return addUInt16(static_cast(data)); +} + +uint16_t SensirionShdlcTxFrame::addUInt8(uint8_t data) { + if (_index + 2 > _bufferSize) { + return TxFrameError | BufferSizeError; + } + switch (data) { + case 0x11: + case 0x13: + case 0x7d: + case 0x7e: + // byte stuffing is done by inserting 0x7d and inverting bit 5 + _buffer[_index++] = 0x7d; + _buffer[_index++] = data ^ (1 << 5); + break; + default: + _buffer[_index++] = data; + } + _checksum += data; + return NoError; +} + +uint16_t SensirionShdlcTxFrame::addInt8(int8_t data) { + return addUInt8(static_cast(data)); +} + +uint16_t SensirionShdlcTxFrame::addBool(bool data) { + return addUInt8(static_cast(data)); +} + +uint16_t SensirionShdlcTxFrame::addFloat(float data) { + union { + uint32_t uInt32Data; + float floatData; + } convert; + + convert.floatData = data; + return addUInt32(convert.uInt32Data); +} + +uint16_t SensirionShdlcTxFrame::addBytes(const uint8_t data[], + size_t dataLength) { + uint16_t error = 0; + for (size_t i = 0; i < dataLength; i++) { + error |= addUInt8(data[i]); + } + return error; +} diff --git a/src/library/SensirionCore/src/SensirionShdlcTxFrame.h b/src/library/SensirionCore/src/SensirionShdlcTxFrame.h new file mode 100644 index 0000000..eb2dbc6 --- /dev/null +++ b/src/library/SensirionCore/src/SensirionShdlcTxFrame.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2020, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SENSIRION_SHDLC_TX_FRAME_H_ +#define SENSIRION_SHDLC_TX_FRAME_H_ + +#include +#include + +#include "SensirionShdlcCommunication.h" + +/* + * SensirionShdlcTxFrame - Class which helps to build a correct SHDLC frame. + * The begin() functions writes the header. The different addDatatype() + * functions add the frame data and the finish() function writes the tail. + * Using these functions one can easily construct a SHDLC frame. + */ +class SensirionShdlcTxFrame { + + friend class SensirionShdlcCommunication; + + public: + /** + * Constructor + * + * @param buffer Buffer in which the send frame will be stored. + * @param bufferSize Number of bytes in the buffer for the send frame. + */ + SensirionShdlcTxFrame(uint8_t buffer[], size_t bufferSize) + : _buffer(buffer), _bufferSize(bufferSize) { + } + + /** + * begin() - Begin frame and write header. + * + * @note This function needs to be called before calling other + * data add functions to write the header at the beginning. + * + * @param command Command byte to add to the send frame. + * @param address Address byte to add to the send frame. + * @param dataLength Data length byte to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t begin(uint8_t command, uint8_t address, uint8_t dataLength); + + /** + * finish() - Finish frame and write tail. + * + * @note This function needs to be called last, after adding all + * data to frame and before sending the frame to the sensor. + * + * @return NoError on success, an error code otherwise + */ + uint16_t finish(void); + + /** + * addUInt32() - Add unsigned 32bit integer to the send frame. + * + * @param data Unsigned 32bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addUInt32(uint32_t data); + + /** + * addInt32() - Add signed 32bit integer to the send frame. + * + * @param data Signed 32bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addInt32(int32_t data); + + /** + * addUInt16() - Add unsigned 16bit integer to the send frame. + * + * @param data Unsigned 16bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addUInt16(uint16_t data); + + /** + * addInt16() - Add signed 16bit integer to the send frame. + * + * @param data Signed 16bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addInt16(int16_t data); + + /** + * addUInt8() - Add unsigned 8bit integer to the send frame. + * + * @param data Unsigned 8bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addUInt8(uint8_t data); + + /** + * addInt8() - Add signed 8bit integer to the send frame. + * + * @param data Signed 8bit integer to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addInt8(int8_t data); + + /** + * addBool() - Add boolean to the send frame. + * + * @param data Boolean to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addBool(bool data); + + /** + * addFloat() - Add float to the send frame. + * + * @param data Float to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addFloat(float data); + + /** + * addBytes() - Add byte array to the send frame. + * + * @param data Byte array to add to the send frame. + * @param dataLength Number of bytes to add to the send frame. + * + * @return NoError on success, an error code otherwise + */ + uint16_t addBytes(const uint8_t data[], size_t dataLength); + + uint8_t getCommand(void) const { + return _command; + }; + + uint8_t getAddress(void) const { + return _address; + } + + private: + uint8_t* _buffer; + size_t _bufferSize; + size_t _index = 0; + uint8_t _checksum = 0; + bool _isFinished = false; + uint8_t _command = 0; + uint8_t _address = 0; +}; + +#endif /* SENSIRION_SHDLC_TX_FRAME_H_ */ diff --git a/src/library/SensirionCore/tests/compile_test.py b/src/library/SensirionCore/tests/compile_test.py new file mode 100644 index 0000000..81c543a --- /dev/null +++ b/src/library/SensirionCore/tests/compile_test.py @@ -0,0 +1,45 @@ +#! /usr/bin/env python3 +import subprocess +import json +import argparse +import sys +import logging + + +def main(): + parser = argparse.ArgumentParser() + parser.description = u'Compile test a sketch for all available boards' + parser.add_argument(u'-s', u'--sketch', dest=u'sketch', + required=True, help=u'Path to sketch') + args = parser.parse_args() + test_all_boards(args.sketch) + + +def test_all_boards(sketch): + logging.basicConfig(level=logging.INFO, + format='%(asctime)s [%(levelname)s] %(message)s') + log = logging.getLogger('arduino-compile-test') + process = subprocess.run("arduino-cli board listall --format json".split(), + stdout=subprocess.PIPE) + board_list_json = process.stdout.decode('utf-8') + board_list = json.loads(board_list_json) + test_list = ["arduino:samd:mkrzero", "arduino:avr:mega", + "arduino:avr:nano", "arduino:avr:uno", + "esp32:esp32:esp32", "esp8266:esp8266:generic"] + for board in test_list: + if board in (b['fqbn'] for b in board_list['boards']): + log.info('Test compilation for board {}'.format(board)) + command = 'arduino-cli compile --libraries="." --warnings all'\ + ' --fqbn {board} {sketch}'.format(board=board, + sketch=sketch) + process = subprocess.run(command.split(), stdout=subprocess.PIPE) + if process.returncode: + log.error(process.stdout.decode('utf-8')) + sys.exit(process.returncode) + else: + log.error('Board not installed: {}'.format(board)) + sys.exit(-1) + + +if __name__ == '__main__': + main() diff --git a/src/library/SensirionCore/tests/run_cppcheck.sh b/src/library/SensirionCore/tests/run_cppcheck.sh new file mode 100644 index 0000000..60d620b --- /dev/null +++ b/src/library/SensirionCore/tests/run_cppcheck.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -euxo pipefail +cppcheck --std=c++11 --language=c++ --error-exitcode=1 --enable=warning,style,performance,portability src/* diff --git a/src/library/SensirionCore/tests/syntax_check.sh b/src/library/SensirionCore/tests/syntax_check.sh new file mode 100644 index 0000000..53aeaba --- /dev/null +++ b/src/library/SensirionCore/tests/syntax_check.sh @@ -0,0 +1,5 @@ +#! /bin/bash +set -euxo pipefail +editorconfig-checker +flake8 +find . -type f -iregex ".*\.\(c\|h\|cpp\|ino\)" -exec clang-format-6.0 -i -style=file {} \; && git diff --exit-code diff --git a/src/library/SensirionSGP41/.clang-format b/src/library/SensirionSGP41/.clang-format new file mode 100644 index 0000000..047f2ad --- /dev/null +++ b/src/library/SensirionSGP41/.clang-format @@ -0,0 +1,14 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +IndentWidth: 4 +AlignAfterOpenBracket: Align +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: false +IndentCaseLabels: true +SpacesBeforeTrailingComments: 2 +PointerAlignment: Left +AlignEscapedNewlines: Left +ForEachMacros: ['TEST_GROUP', 'TEST'] +... diff --git a/src/library/SensirionSGP41/.gitlab-ci.yml b/src/library/SensirionSGP41/.gitlab-ci.yml new file mode 100644 index 0000000..e0fe416 --- /dev/null +++ b/src/library/SensirionSGP41/.gitlab-ci.yml @@ -0,0 +1,44 @@ +stages: + - validate + - test + +compile_test: + stage: test + image: + name: registry.gitlab.sensirion.lokal/sensirion/docker/docker-arduino:0.4.0 + tags: [docker, linux] + before_script: + - rm -rf ../sensirion-core-arduino-library + script: + - git clone --depth 1 --branch 0.5.2 https://github.com/Sensirion/arduino-core.git ../sensirion-core-arduino-library + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:samd:mkrzero examples/exampleUsage + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:avr:mega examples/exampleUsage + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:avr:nano examples/exampleUsage + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:avr:uno examples/exampleUsage + - arduino-cli compile --libraries=".." --warnings all --fqbn esp32:esp32:esp32 examples/exampleUsage + - arduino-cli compile --libraries=".." --warnings all --fqbn esp8266:esp8266:generic examples/exampleUsage + +syntax_check: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.1.0 + tags: [linux, docker] + script: + - find . -type f -iregex ".*\.\(c\|h\|cpp\|ino\)" -exec clang-format-6.0 -i -style=file {} \; && git diff --exit-code + + +cppcheck: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.1.0 + tags: [linux, docker] + script: + - cppcheck --std=c++11 --language=c++ --error-exitcode=1 --enable=warning,style,performance,portability src/* + +TODO_check: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.1.0 + tags: [linux, docker] + script: + - '! grep -rnw --exclude=.gitlab-ci.yml --exclude-dir=.git . -e "TODO: DRIVER_GENERATOR"' diff --git a/src/library/SensirionSGP41/CHANGELOG.md b/src/library/SensirionSGP41/CHANGELOG.md new file mode 100644 index 0000000..0b65b5c --- /dev/null +++ b/src/library/SensirionSGP41/CHANGELOG.md @@ -0,0 +1,23 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## [Unreleased] + + +## [1.0.0] - 2023-10-27 + +### Changed + +- Remove unused parameter serialNumberSize from getSerialNumber + +## [0.1.0] - 2021-11-17 + +- Initial release + +[Unreleased]: https://github.com/Sensirion/arduino-i2c-sgp41/compare/1.0.0..master +[1.0.0]: https://github.com/Sensirion/arduino-i2c-sgp41/compare/0.1.0..1.0.0 +[0.1.0]: https://github.com/Sensirion/arduino-i2c-sgp41/releases/tag/0.1.0 diff --git a/src/library/SensirionSGP41/LICENSE b/src/library/SensirionSGP41/LICENSE new file mode 100644 index 0000000..ff20c41 --- /dev/null +++ b/src/library/SensirionSGP41/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2021, Sensirion AG +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/library/SensirionSGP41/README.md b/src/library/SensirionSGP41/README.md new file mode 100644 index 0000000..0a37446 --- /dev/null +++ b/src/library/SensirionSGP41/README.md @@ -0,0 +1,78 @@ +# Sensirion I2C SGP41 Arduino Library + +This is the Sensirion SGP41 library for Arduino using the +modules I2C interface. + +[
](https://www.sensirion.com/en/environmental-sensors/gas-sensors/sgp41) + +Click [here](https://www.sensirion.com/en/environmental-sensors/gas-sensors/sgp41) to learn more about the SGP41 sensor. + + +# Installation + +To install, download the latest release as .zip file and add it to your +[Arduino IDE](http://www.arduino.cc/en/main/software) via + + Sketch => Include Library => Add .ZIP Library... + +Don't forget to **install the dependencies** listed below the same way via `Add +.ZIP Library` + +Note: Installation via the Arduino Library Manager is coming soon. + +# Dependencies + +* [Sensirion Core](https://github.com/Sensirion/arduino-core) + + +# Quick Start + +1. Connect the SGP41 Sensor to your Arduino board's standard + I2C bus. Check the pinout of your Arduino board to find the correct pins. + The pinout of the SGP41 Sensor board can be found in the + data sheet. + + * **VDD** of the SEK-SGP41 to the **3.3V** of your Arduino board + * **GND** of the SEK-SGP41 to the **GND** of your Arduino board + * **SCL** of the SEK-SGP41 to the **SCL** of your Arduino board + * **SDA** of the SEK-SGP41 to the **SDA** of your Arduino board + +2. Open the `exampleUsage` sample project within the Arduino IDE + + File => Examples => Sensirion I2C SGP41 => exampleUsage + +3. Click the `Upload` button in the Arduino IDE or + + Sketch => Upload + +4. When the upload process has finished, open the `Serial Monitor` or `Serial + Plotter` via the `Tools` menu to observe the measurement values. Note that + the `Baud Rate` in the corresponding window has to be set to `115200 baud`. + +# Contributing + +**Contributions are welcome!** + +We develop and test this driver using our company internal tools (version +control, continuous integration, code review etc.) and automatically +synchronize the master branch with GitHub. But this doesn't mean that we don't +respond to issues or don't accept pull requests on GitHub. In fact, you're very +welcome to open issues or create pull requests :) + +This Sensirion library uses +[`clang-format`](https://releases.llvm.org/download.html) to standardize the +formatting of all our `.cpp` and `.h` files. Make sure your contributions are +formatted accordingly: + +The `-i` flag will apply the format changes to the files listed. + +```bash +clang-format -i src/*.cpp src/*.h +``` + +Note that differences from this formatting will result in a failed build until +they are fixed. + +# License + +See [LICENSE](LICENSE). diff --git a/src/library/SensirionSGP41/examples/exampleUsage/exampleUsage.ino b/src/library/SensirionSGP41/examples/exampleUsage/exampleUsage.ino new file mode 100644 index 0000000..f49a8ca --- /dev/null +++ b/src/library/SensirionSGP41/examples/exampleUsage/exampleUsage.ino @@ -0,0 +1,124 @@ +/* + * I2C-Generator: 0.3.0 + * Yaml Version: 0.1.0 + * Template Version: 0.7.0-62-g3d691f9 + */ +/* + * Copyright (c) 2021, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +SensirionI2CSgp41 sgp41; + +// time in seconds needed for NOx conditioning +uint16_t conditioning_s = 10; + +void setup() { + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + + Wire.begin(); + + uint16_t error; + char errorMessage[256]; + + sgp41.begin(Wire); + + uint8_t serialNumberSize = 3; + uint16_t serialNumber[serialNumberSize]; + + error = sgp41.getSerialNumber(serialNumber); + + if (error) { + Serial.print("Error trying to execute getSerialNumber(): "); + errorToString(error, errorMessage, 256); + Serial.println(errorMessage); + } else { + Serial.print("SerialNumber:"); + Serial.print("0x"); + for (size_t i = 0; i < serialNumberSize; i++) { + uint16_t value = serialNumber[i]; + Serial.print(value < 4096 ? "0" : ""); + Serial.print(value < 256 ? "0" : ""); + Serial.print(value < 16 ? "0" : ""); + Serial.print(value, HEX); + } + Serial.println(); + } + + uint16_t testResult; + error = sgp41.executeSelfTest(testResult); + if (error) { + Serial.print("Error trying to execute executeSelfTest(): "); + errorToString(error, errorMessage, 256); + Serial.println(errorMessage); + } else if (testResult != 0xD400) { + Serial.print("executeSelfTest failed with error: "); + Serial.println(testResult); + } +} + +void loop() { + uint16_t error; + char errorMessage[256]; + uint16_t defaultRh = 0x8000; + uint16_t defaultT = 0x6666; + uint16_t srawVoc = 0; + uint16_t srawNox = 0; + + delay(1000); + + if (conditioning_s > 0) { + // During NOx conditioning (10s) SRAW NOx will remain 0 + error = sgp41.executeConditioning(defaultRh, defaultT, srawVoc); + conditioning_s--; + } else { + // Read Measurement + error = sgp41.measureRawSignals(defaultRh, defaultT, srawVoc, srawNox); + } + + if (error) { + Serial.print("Error trying to execute measureRawSignals(): "); + errorToString(error, errorMessage, 256); + Serial.println(errorMessage); + } else { + Serial.print("SRAW_VOC:"); + Serial.print(srawVoc); + Serial.print("\t"); + Serial.print("SRAW_NOx:"); + Serial.println(srawNox); + } +} diff --git a/src/library/SensirionSGP41/images/SGP41.png b/src/library/SensirionSGP41/images/SGP41.png new file mode 100644 index 0000000000000000000000000000000000000000..a36e2d82e55279fe0137a33f2d7518ac3176d59a GIT binary patch literal 424504 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%0AS`8V+F6qceDX5~q)h1E5(=hkaoRXlU& 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­Ql`jU55wLGne#LxCT2S$mNJ z%|1;v)@>)N8!V^KIOtI9t(zEi?&dYWMK9z8wyxV0mHk@UIC6`gOlG0&BJZpd&C@+~ z8D`46bjyZiPCWf|$}!#PcOIpm=F?+&kiBl{&i`6>3f4}Lz0qa0$nw=8d$ai8-0K71 zJYUOH%`hkE^=77RjL~mqH4hu7Y+M{|;BK)QM4{U*%MNLZ4oDRq1`a;`i@r3yb=W-S2mC_uJf3gmkvT;nB9_ zUG@3e9Z#RlHh3a9J+5r#U7OXPiq-u#ui#*u5aU&chz*@=)(rK!XWpp` zx}H1vsO_DPX513q(AS5O^6t9n3N4eHncU9JEgsP45$4T$Zmz>aC9Z~t3++29)|`{| zy}EoSt4yTdCGH#Hi^DzB%4g`^TYgH0nVVh6FmdzD4@ZRkA6;2_*`ssq=?uZWF^5)L ztpEGBc8+B+o4WtJBVVt_o7=lx>ED0Op_L&w;Mo7;`ferJy0Q_c>$Ic!y4BcLoI3o5 zCpa`k-y)uA*S8t1!KasfvwRR;lJ%2u(Uq<@d0Pt(2`+3ruUeC%r@O*e@{7`Ei)Wd$ zo_#JkAzGk5&$v&!*kR^&4MHl^*6z|{oo;R~^ZCK*+ z1>4%VygG9qEPAoub%DLm#QM1Gv*~{Gr{3Kw>oc44`<>GAc1U(xUj<(?!TRMv_50(u z@7L*{n`75}-u5p~UtEnyJ3IT!J3Ec11oZ`Gg&SP_oheh_*HP!tcs=^PXn6U21LNS? zdyYMcwQ#YVxm3f!dF|2V%QoKs<95-^Mz7=9f+)A&%Ytt6+Uq|GXJk2~ctt7egT@ql zz2^%>Bi&Q9p5_Fo+`O{;*}9}W)kh!Y9(Jv)Q(kYEsBf*2A z^I*EMQP#Ff#NYm}$qdQqves>1tL`3XYZN-ew~AY-baVBIzixb4QQw0YblM#r8bt4E zDLOaf)Rje(jx7{>(4A0lx_U;FLfngn*|G^&st$x4IXLk+cXZA9f1(rbUfkXi{^a`c zZ(X9ZH}C#BEx|M)Y|58>U!5zJS_%zfwK>11r>Dm-ERI;N^~~b*$(TIv3o~v1N&S}Y zdNw0kF8oWFuD!A)|GkGt-)YQA%#k^MsWSEVWW%YM?`|p;yYe~bEx3`e;qBWWbDqoz zaOGf;Em8{%WSZEq$2-)X@z8tqXEE8Lf{f|Mlx@Ah^GRQ|#A_e6Lx(_qmHe;XCw@Jq zm~~$LJJ%IP|Bn8%KYI3c{=%Qq%v0F-X0NUJj7gJ@-c~vn?v-n3{c%#J!m^u{fjf@RQ+g$~N%{%Tfw=US zI#GVNfQM6@4L6F zbspE9(b&qwXHn$$xz~Qh(XUEn91;Mx%c7Mb;YMW>GNyX`TED~+UTWO@oV$^qdJZ=#TlS?1juf`-*#Hh`dZcTMVn8a z{^dc4Ve?a^O0myVl!Uv)F(^i9F^>pJTkd>9?9|Esd}nD)B6_n1`O zcoX$p?56O0k?iB50Rn92&oG*vS+=Y|HRy<2Wm{|aqF+Ca4g7^o%@L2mc9(DDmZQOqh(jtuugwJDfe|hlt`@*gVCm$c5XwfYE zxwJxA*wJfcRmuO1sC>TvPI7Jh#+Ta}?pX3v&UZX|DeTk{kEJ0!hZ#au%jXCzg|g?A^ayQ@Z{>4>;o|G4EmH-g)lK(d`%Clx$2Y?_NGNsc=Q& z35m9Yj-5G{%az#DCO_e*43y$qP|E&Oe67PBh1ODg)8_&gmYvXDoPD6^*TV0`l`KYc zi~}q3?r&Nj?8R0g!!^&MQpn%#tH`vq4hdb1|X z!ouRn!>YfNJRTa{NICrYc>m*Huh(xsS=ANBXLnrXqQmUQ{V9AqUElCKG`qVnUR5gd z(5>3}=0sO%&v%aRK@2lhUvSPyF<7c(I{ikH|H(%cHTK7r&yZYx<}*wY+@#%o*q9WmZhj3Qh{s z*Ia(fp()8&wCC^!)>*fBH-A@%+{42wBl>>-r@ovO42wQL*`+bBk25P&E9lgWWhei= zGhB78^9aw!zWG6`zUCzcdg+C&h`pO@>Mx;E-ZAyrKShZ*8~AjKIbJ^6`5|NW&WcIm z>#HSq-)cFSIV(y=f2Z-WCGW&$TkpNG{Kd^fiK`uC?@j)CX7l-nKcB}lG)R`{DmClx z`M{*N?}bL*u8+DAYs(5MDmeUlzCM)dxBd8}#)i9NYVon>cHb@Eynp-f-R^fs(l%$_ z_19ebY*`R%kl7EhY`ORG%TCU9juUwoVAxm4X*JDnyV%+_qBkEtO52?IJKW_!=WK2b zhLcr$@4ed8b?HyXchl?98-F}Cn8DqD_hqPxr?=G`Oxn*aQd`0YLx-nx0;JN^8et5Y_wVr-KZ{(L{+L3;Mu|9p9*wcb+6|B?Aqw&W90cX`h(xw5G1@{zm6mH|==CbfGbA`}HuLYqBYZ9SQ$rD%z(Vk6O)q z-D2LH;_iq`i#Y5=F7#Bq%bLBcX$F_%ddog#q2-lE$-ftzIk#Eyx#Sb8$;nAUqM{dF zT!b4=yFQ(*zxT?`z{}y9{1<%(kcB07u$op$~&*vzFzFP zYSo4;utn^r<|`&q_TP%Hn*EPx6nNZM2J*h(sIXWfRkKUx&^Hxuvrn zYg$zloqM({>zr2i#jSn1e!58+drl=+@p(KtW}WvT`sFtF`(By>_4^s5H>{a_&_e&c z+1ZUIuQg{mvegL9XViRe-ehJFl%0F|anx~vEsSjpc8sh_TH?oL??$p5y7!K+gM+=j z{q1v2RZwK7&MLUvn}6`@^_wmS&!%18)xXA^=f>T;tRfc0-`<4%4|?(9;^K-wo$4F5 zZ}0Zj-+5)7{@yKT;{NQd{kiwS+`Y3h%Wfb2a%|d*&)Jd&m#vTAe!bbc?+j!3Z06oO zGu=||W~wSo)CltP&|K^@`TH747f$xsRW~cD`QIPzdZG9;t@GTPh|e7@tNg1>!tXx% z!=#|av*A?CnfrF)+y_Jq_y3H!uuuHm?gB=(nCxajj@-KpXO@22cW+~Ow2R=b&<}DA z1v1CWdLKz$iF&(7_RmUxO`ab&6b#SI49m(qps%#ZFz4W%<}#gb2_?hLLWZ4P*P?_M z2sf^?uP>-LzW(2-|6lpCBWA8WCxK1Ew?$DBvv0)4Uux~I=R{>XS^+WN!|DqDsArNy+o(f59V>c0;gH>-qRIw~%EvH9@UX;Gyz$E6qkkXHJ-+*|Yh%-~&C{5y>{ z-q>rd+WnL{!ny1Sjnd3_HN!|LB>UkRVUx zhvQxM|D2zoB@-Z6s8x6Q{({akldpG0OgW?W_b1Et7iSOI@aF!Um8vCfv1iiV71b^} z4q-`c8hcdc-TKb?L{BV>A%~NB+C-ynO*WOla&}MVv}@AW(jGUi_-H))8vCs#OU5lO zBD<}vcYK-TydGNU(dy)#X(t!n3Uk~qdp4}b;9TZAtDN~)N>`K;q-NHzQu%4Se!cmi-52U2lXiCF#Um?agI$uN&8KO#dh0Xo+Ir2)CI9a2`?vRg zI;H*pd!})r9NT@-uHEnVar4`MdLjN(dLww;@%7Wye2}5yxQV|GG`~Ok?&t|*vH)WX8n&J>DObrJd&<0cK`n4&CTZWWmD{U9ylMVF=zbEB_bFY`m|6c_>-Sv ztILy4i(9vs{%YAFDK(+o&T{zylc{X-F3$`$iHjb?!F*5ubqu@6K~B4GIR{E z3Azz?IdO*QMsF3?g)?G94o~3C*s58vVN+gt&z5^y?DB=o_Rbnkemtf#uIIfwnSW?z zMw=G*1R*}D>J8Hys#^?yO?z-|b5s_yZ;z$Z4pHyuV_dgy@7R5G`7=Y~Z{NNZT)en= z#-D(X3tTNKXFU7d z|D5$oOj(ud`YCShBCfM%oV??I=Ultgl8bCnkG7sNnOUvBl&$}eqDb|nJGndemi^hg zW3js}*Yx6TKQekVWUM`k7;Y#n__lY3mBfT>Nl%}%ni&t=TsB1Y^18XQ$1uml&D&R^ zRrKiEN3m*6rRLAC&jp^)h!1~%IB4el%MFWf6;JY?8NwbW__6ohwx_0B_O07lQ7_RZ z)~?bYd~9FO%js`-CDyH-QZes_WS^7Ll&BT1BB68poEQ8mYdF{VAyCxQD(&yQBIbXp z^N-zrw^Lfa`o~2557DrQUJHw8!(IQY@Atm{v#tE$`I@t@9T@U<{LwhTIX$jMMb>tc z_hl1LugL7F+8qV|(}Mr$8UGJh`{`JawsByhn!)mrY}Jh%vPVm{&M{iar-tpq zhW*hiOGTEnC#&pgTyVgGukLZo-sA0i**Q4m`6gOs&p4Uj=hINEe%<2M*?Q4T)`t(h zIKw+uB%Sd7ex65yM<$`{$`7e!DR;v!zEw`jn^b5T_5T8sOpCF`wT8}#lS>0zKWnMl zv-ej%oiaQ57()Z&k~be$Uu$-`k~E274WIl6p~}pQTQ3;h$}nh^=FnQYV9KNOj?t@A zQ}q9}+}2X+wBBufLi6F3mzSekA239%{2hF}Ke@bI{CJ;i_GNDUlDUk=DJI)5{E-k? z=(Ch@{nHR92IDUr`m>y;f7``(HcDLVSx3|xcE6MAOlq&UeEL31Hv5v&yl4Zl+kP7l za^GR*C@khaxIaH&Qs?$X-MuGF#T5;Dlo>YdTXA$N&kw2jvh%N8pX0~qb9n8JnEMU! z&T_ZD>wbzzPuO9Ro=_IWLy3I^@}T;`ltR?d&p++GP>jE_ZgS>do23Ne{8c+%CTh}a&=3XAuB_}w?Wq? zR=K`teqYZK%91^^;L)4RCngt`%vyKz=EcoRGvp>sTUit9_0pd8%X5aB^tE5L)K)#t zni9mt=y9#{@kHg7g_nJ{hHct0(XxJ#bB0Vio7S6Sw_~L`K4tccFMU#L`&r~rho!IT zgKpb%kAfNHk8p1|ncwzMP{riC@9)D~zHZ&Zr);u7^!S!HFzY%xuFc5UL; zl7B6`wHI7V+iVyyY0dnsS!&H~nwB$4J(d@j&q~sp5q~HsE$?qmVO^qpw@1>B`8rWA ztB*VSiZ*#dFVDD<8AJlpA-vgq9yZ;jhYYq~Fezu{kac9Qsm>rr>t&bTEfb*Ode zD`$=sj+?*z%4F-mDBRW%y)S+SZ_U;l50lnDvWR*j@h;`_i3}NU&8agyg1uCfW(9Sv zt4?~f-=n4en9uxmizJUQDcz~O{kG!CMLAXQ8px`rtETS&uSDIe^YtMA9{JT*JC@u3 zwv4HI6J+!G=H?xbR@p9Tj9hi$;K5yd&WB{L$2rfh_*HyA%=NzglP|ev=9ph@IT91% zsB~z~j3TcrS^KF=x~g5aSf*Z^-Fti=N1;AnPB|~H{?VA)7r4OINh@3J*HFh3zcOi^SiF`u(j$vTM}ICpSV zo`}d-dopFi=FNxF_8tt;Zksc)_?U_B+rLK?FPQiiN1C4%ey+qPG5P(mi}!*}zXN{9PqyW--i93g}0Vgly>uE?cx^VQpKy!5Rhf=_Ci>q}mX9k)*}vwL-|iplsz zhtYeB=ReYYN^AafsuxyN{FtPX?8Uj)R=jR1G-)&Bv_@l=5O8;&j;V^6M_fc9WDsRkUkvJc3b($$bwS85zL-%3F@LO`M z7uL=H#d31a=J$7ZdTagK%Olify>Zgv>zA%+%}Eh=+W2(dy`uGjF4@`I?*2K>j4YSF zC0JZYI?JrUx`L~~ghz7r*)6R5r>!$jYxZ7r>CuwFZ}JWn*G@LvEmJXlw3khE>Cxor zzuiiH|GMO}Jiw;tjX}^|)>UHaE~<}?__QCM@ILIpyE748-HMCLF>myG0$c^u}L&I=UmFxdUmI4&q^P*^MAIw=6E@^1d7}EFm*(5whYhxzcdbe5(BX>ozWeL0@NXBx-3OJ# zB_~GD{vdJm&#tY@w`d)>vP@8^&fO>Ycg(hz6Ib06R0~{maSvPxxZHRf+JIO;VG<8@atxvmZ6xFGVqGPH$*L4BE) z7h`eICq1?KYGyn;E$1kGOObV{yZoB3KPsIgNg-k06|tvp)*hR==uGv##IxMfIU1g& zWvaepnc&-4vu#SBSIf85 zXUDTwtE1(`82Z=z6tOvTVfoIwj_nWpn|%uO``>qJiJm#Bv`{WlS!s6EOVuZhp+_Dj zS?rIxxMO{3gN)xDrGC`|(b4%?g4+wWY`vjS%p7m{wdh^d?8iNY^9ubmRddXwce`1d zR!AKew~Y#H+gFn8nm=7Xsd>_A(=*O&2fz90iaGl7B_8ffPpB%Jkz3lo(sFr|>!WSl6td$)DX)2HIb42fxf*S-HISM$ca?(gkuug~@yeD3c)VXOI6nMKQGjZ1>4 zr-D<`vKM~?Sv$FSEvp}Hv9_?-n)K%B*}C2x(NiVo1svclu6;5m?YX<3U1^>*Q(FCr z-}PzJ*`K#$&Wd_jswwueJLzkbcGlf@mp%Dh9^_4UVck^`wqY)tM$IhgsGjV35fZjx zYZtS(96szk$EuXeU)H|we9be%KmV57wch{z*FSM{}%9|^MD1ui?}6(*C`x`(LH(4 zN298bVaui;PYRC~RBrsPv$gcQ(%X((s$~xpjdv)PTfKe%mXYDyJloq|FEXE{TNFLv zm{;-0Gp6KXU`)};qbq_Y2Iu*$n6ugP+Kg?AvziwcY~H$%Vb2UR&)W<}T-U=NbNKaS z8s}QBcM-Mx_=(fFp|fMQ!~)4S#-(BXpCu=Bb#`uK`#4Yc)eF5fQQR}0e=6IZr_Wl% zs1@xq;pU@7CiDGemOB|fS!jDrO+M(g0eAS-EgRphOO&u#r(UdC-MmawBjL94$2v{v zmfo*?#}~c5Q+aFQ+-BF%T&o3JviJ8~5<0Pb(yb@1-CVayr)r%z{2<=^-1R#p-W6v} ztdA9)TM@;{mAW}G(@V4S1j~c0q&<(1%uN6PyHG~8FikBi?azKJDEKtz$*qQhLzW)Cl{(s%7e_!WZo_+l_@A4^K$0u7XbqPA_ zJ5eZDGnDbdxh&TPU#1?35R0`Nc4+o?R&Bk;#=Po=%K?qF`D(AXJt|YqHsAN`zyz_E zQM;lZ#7|$j6GA{iI>{cjobeS6?!(L=`?c5g1c=R1`FD^X>b$!i%o%yf1Xm zWk;&r`{&t`KChB(|JRfLkNE#RxEv4~Q+RZ0#jBOe3oZ&a+lp!X=sxn8A)Dj(34uieD9;{=5FnurG1nBJqcDgeDcb# zl{NiWqoU=fPu(FsCw0Cb$EJvkBeK)?M(V~LKWWb_!=}bQ?;5-42QOF0&YD^B57c|6 zOm24n9TUgVEq#$mAh+adVo33%gI#x&+a!c-^>t#mtBNj}^7oJ48{udH$As+pu2Z%h z6|MC+ys7)lw^_F4GWBdb-b5T~ye5+q_d)LCrGgCI>YE)6bK1W}uGw0(asMQ(E!Vs> zRZ}-d`?-9%`n%eFe_r|b6aPOQ39ertF1vS%1KZD8 zz5fb%yPt;Lsd~M3$H&+E(;S@)#40 zb2mu2J(;s%rrMRD4VyPVPQ4}iYJo=aC(o)kdZOKCoh~*8+kebuRLjeoP$*%e=C-z5 zJ1O-|f_l|Do@W*lf^skaYOq}9#waGB`ld&5**Di7L-mlA#f88W_I%yS9d3;M z%QWoEcbxF{*wLXJm4DU7^pc!%w?@*JZ4-C@e=|#!-LO;Qu*H^)Sc~adYjX=NlvbC` z6wgzg)vsN(;mWzwi)#4t@AR(75>`FDQuMj}^QCr64H)LWWzRf5P4>*ukL)^K=Z}A? zIzDe1Ye=_gmuCyZor6nrdzoyaL(EK%OPOz&zD=g2Z^By{S25dgIo2;*mF6lR*;8=b z)8_c~V{_7yNPC5P+BJ*wnX`htGMPS1JDXN}^0UE6EE$9a@031|t=QtP z4(Xb(u7Ea0>`V84-}n8&_PXEOKWgv)UE7>3%s6Q-}|q$=G~vln>TM>-2dx( z9moDp{q--SJ6||&y&^BXGGBP2vP(>n*Qx-$rJF<>j9s*rt!$ckGAsE)QnjF@cbv$( zJ4bmniWinKtJEEq4&2w^sZgPErfPB6YSApsfcl~@A7&gr{x3eyBHnAGN64ptimi)& z9ogIvqdBwqB*P6Quj97^S3J8{$aRK}_!U$)KLJfkXoqQPzEizh{{>;Agn!V~oN-MdFe zIw!x4+5T%opYh$9jIgx;G6z4O-`{XHt@(A_=UHY~1#?#(-Z(YdW>e~^KU%ApCl+M0 zdUVcE7tvicYm;Tqlh1R6O}=Svzh^91njX?H+0}k_)WQ98&9|3Mm9q7V^We{#zxCUW z7nQ{cA-B&b%|G|RKq2zujWwlNXFq5yc(>`lmW&_c3Z_khk@gWKRk;Vf=JQDXesSpa z)tKq`ESBBloL+p)fbVT>?xaNyCTgNd+}i{>KKISpFYdRB;rN-)a`%2+NP73T>-=q= zCub_tH}s!a7Or*Ugrabu>LTmnb5nwTnQBZDTDij4YtQ3v(H}ng|4{>vEANUs_lf~j zx~zWf?<-&N-?`$ouenp`NACLf&kvrlu(0sC9Fn2s+Ln0XGduhAcW>YA`yO8RQ~rO> z+OPH@SIt*?JUWtUb~K_)KYGuFM8=C2d`qJC`q;>XJ(THOnbTA#^Wgi>++VR-PcNUm z8(hq3Rr#DxaQlmxl}%3;G+HLUJMCEfZpjh3Ol6gRXVy8ZLId`0*O0M#_^xwyZt>(N zW~_yk$<|Xhb=2J4*|J&nj@8ZNkV2n^-HnT4?kp5z=xILsA2g`=?M`Hl*=#Y+9;PgT zhaVm=gvV7rWu3TIQg7n%&tZ?bRvkDwSv~jdo3o0GZrr_lv}*6M&*$y?U$3t}d&hl? zMhkz!)pJMH&GUSJey&L9N_J`JW{Ccfw_I`qtInB|>&zQq zQj%XTex~Je`nf$za$;NxF1m_8>{Oq3;NLyDzSuIJ%Ud!x9tpFN=iAhAP%z4}>cD}9 z(1Y8H{MJhA#JFyq#$Tyg>DCF+rDVFBj!z>mRojS{V zl<(NHKArN^oysTU=1c2r)yUZ)lU#8~Mn3gDM|UGrv5Ck%cDLwyrE}uf1OII1JG1f7 zoX^+3Zv0gBe&yxLM+*<;zITkaIJM?+UdD5GyUfkL2U4U19AqvghuUeL(%*m@HBq*%vx9EWRsz=4Ees#_Xsylo2`U%nSxW4D} z>jmfkI18_<{(mR_f8V{b*Se>U zM4kGw^|8f2_s+}bSGCGU(B&Ra1ieR&@n&yKG_9aaifo%2akk_g+o2x66&3 zWno!*e8P{|WL+fM-sp*D9^mR&^t@GCMMl3a@7WfE3W25Xf|eegA+(%rg-C|^yN4B0 zf7Gt#2S{(|{Qg*EZ#3KEY33gak4u|xJ;1ZUfh~8{?yL||fzt1yi8Ai(MK`Th)I`M> z1+cKj*%THro_%wpE%89-Wc9+2uI?K*Z%#JQTh3OMmOg_~McYArj#cR?SsMqJKi|H8 z|M;j=IAZ322ciDmuIxcR zCzHj+`N1D=yLndk}-8RQ*Ye9`}uV~yOiH%hJshm zv!8F>v5nic#boInr546LOl_|6Ar}@s`;_(k%{#?2eQV8BjT899KH7D0Ha}~+y=zHaO2I%C%T>~n@OGT{hBLyvNd?^v|Hcm zEp|`)omRP4c=@$#*FCW(Y#gH&a}aZe z-`0ZcgZ9mgUzxt0UC%n}6iaAB=gIy4t3LS&{#6nD`|f7(^G^?}bT!rQ6y9FDH`cXZDDb4_>W&WvJeqTS%Qmk$awckZfXk(4(ucP&$g;HV zo-btH?yFfU=(>6KlP8xMmY+<@Tbq9Tq4SO{tNh!T)6Bh(v@+zHudz&BA+_Pw&6^wj zq{}-(-gj)8o#`gWo*<~cB`Kr&-2@>om#<T&J9GerxmXqjU5Q zPY}QS_eA9_o7%$sa`xxv=O2DpmAiV$Ee2VJIo9=j;c{0JQ{pga$D-``ZCG; zpZ&LcHrF=2v3mde+P&X%toLke`=0gU)iM?1Njk32?l7xg3|u2|;>C^5=IARfmr~4k?_O24W|jH= z>ht%ipZ1%+DW2__!??)fR=S|=mFn+ztIyf}p7ZS2-uJ)7^z`%#DtG?UTK(|cIlgyy zclWP*UGVpoY519$Lg{l#Q!ga&Y~~3FTlmVOSEKmy57f<_tktw& z)tpm{N;ZAoUV7)|y+bc=N?v>YaP_ARzxJ^+SNvQ${o{|v|#Q(sBOrn%~b<|OHspKO@#cO_)2Jfre%CF?W7-f<-v>D3IscIFBtutt1Z zwCa!uclGuSe>Pfa@iQ}UD1`Q}JGgW~5Sl7x@ZRjH#$=A$ zC4pIHk^4<6oMSWMC-1%g>7vg;O|QLdkFwUfxbP@61bDpouwRbpZ@$PO?xj;gT+6r^ zgb&QhTD5Z7tXH$QsWq5h4GH!&y?T9%-Pca}gS+qj^fNGyv$u2ayWue5)<&MD-nF$NO1t!wCipZK zKV|n^VX5%&G81RXrU-@hWKVl_{>WVSRXrE?tl*Vi$hLoXleem@ohWa>R9|cTZ~ISv z*HM_Avg@XY&X-;0Za-@cV?+`F~)>x8?jj>cSFc5~KO z0j6)?$_i_WnyzNORq*BO-mrIX@A^F-MBlu7myll`Ueta;>d(eqC;z=Evp-m@#B({4uPBZ zux$C+;t{c+^26TO3%{(=+Y<0cph(c+WjjQZ3oLvWMrt@Rea{k|x+vNzbfuX4&TKP{1+vANl{qRuW0YMbLf82;YAij% z!ga><_!K3&mduBZ~6nGG@+Gv-a<%tGOlQkRJO^(bl*Krd%)5BZ6xS1{cR`O<9$r8

bx7IMfWIl>uP`Q>zUZ6*P{{XTs2>)q+`w|?ShGKsh#?JILRNpP{rL~xKbJ5%>B4ZnAsg8->}}ikJ~XSZvUa`O=-yn2NszAG~e5DB4YOP zlk2>XO?KGO5NPJ6bBuwVzxdp%M(3BaXRFS>9?-xT^yd4$1Rs@y4{ctYx0DocNa$pc zyQyt8J9WR+o1+5NMGcKXu1rODl$Y5oywVjU_9S!C&gd@2#k0@e`nDp~vO&~id1OOz zn3atT--07i-&pjO7+KHH{kgn4V3G?XqvuWLJ(tuQ-8TJexhc+jVQIU>>b+m}u7+3V zMoepNlv~=dKhf*tp9xj%OcO&7oCs?#EY;ueG4l8kmg937+8BcPSR@bYS}9!GT5w=V zZB9eck~#K2&i6jO%o`&&bK0EgEW3)t?tARqUU$V_Z)fR!%X^bUZCXyBdul10d&c7Z zG0XFXWo}A0gN*L!d^_OP7i-Sxp|;{#{DSgSM|i3x6K;@hP!q{4m5?(v_e_ZTjGzNmVfB{e(uhNke} zXJ@5nEaQ~7sZi)yeJ{l66_0=N#h0J+Q^fl3n{Rrxv%UX-Sp4bFk_UH3y`E5Deb2r$ zs8ztJ!|-3bVoSL*$H&d{|K{Ycg;baR9`HWsJy2fEi@pCKYyX4K^Z$p>`|JJx*8bm5 zHqWp7%6_lv^S9;M@7G?Hs&?RCblRa?P=9`DO~t)}!0?WRvzKJgd%n1y(Ow z@go*Lof~ieo``RmujuG=?B>mxvTYig!VFE5HswWL`&yN|esTJ=n*Tlg_J25LpJiLW z|DV;l^XH!`EMw2LjBw{>nyDzC%Kq$gNs7^$dnQsgE7}+s`h0SlH!WDQraCw+P>w0l zQpf*t&r+Qk>Zx)q2|C>i+6$_@Z!Da)No)&c{FeezTNR1RoG6>LMd9hWM z+s@iX**naagHP?FLQW71TW?kTyvDa>XIY|xx{j$SteC#JCS9{TwEXd%1wEQ=jeAqt zAN5tvy0XOX_79H>yKj8=zHd5x7fWJ5;3q++14R)5(~dr4ni+HX&39>~=Uprbse#`@ zC#|Upm!Gs`0mFK0Dev}4+U9Tcy&dPN+5CDTIM24a?n*n4loLnAXWvAjZBf2TnhW?3 zYNT6jsMnY(sT$~J-Wc+bTj1E$2$2Pu4|Lb`U9_=#Rl&i*%yywmIpV?EeSs3svN@(` z@7mIlp!=Pt$&V$9L*|1qN7UudOQ)q>Qd%dRe=bCsxnW=Ezpg&dMs{Wgk&Z=gx_&cD z%B3t}Nlhu78@fp``9M(Dx7G4rop{7*tS&5OWfPeo5Vmyl8xEi6FI`ub1Uxt{DJUat z6mu$wXUnbk-)EHURo)<1<*T zJht__B=4G7dE|NYrj3j5i!`pbIKz7`lF9K+`8m6FtW}dw8V4Tili)QuWqCU4&E0FK zf5<%jqw3x9dn@yTSCVPjC$x+7UMarFj+m$WrJlzzVj@eM#%{G6XKLrZp7J-z=vL!S z)z=pf8dc6a@h`MnC9ud#%TVls=dsI?+he%bJd64%BQ+!E*sV2puj&3aYH85CyxQ~N z=U1Mymg<nuG&{E=i*4G;=jD^z-B>TQI%-w> zGn^6DXZt7+GmW`yx9u{`$G5g-XY74=Z}0CN{|_>Uq#m8jXsx!#f-Siyfn|nG;sYM7 zcbdu*j(+dATk^j=N0*`YM?R0D4X0v_UCW0#zmJ^!|LTh0+sT(7$^V@cYz-P8`v3p- zwFaH0h`mb;K=haSe_EA)wb^Xh===I(QZPfpKxXZdCJi|63!0p-T ziWd(P+t~l6M)r7aid%n{MJ}K->Rg0~i9lM2!Th%6{`2KzJ&qricp&M}l(N<|CN@@* zx%>X+S?PQJehdHjDApw z6#MEF4nF04%s6SE{FIAJ(M~vN)qfXUN*_Xtg=T-ND|F9iHg6O#uHzp;h&%Rl? z@n0X?jt|AV*d9IJv24m2`;2*M>04c^@_X5ib8UJdrLbA&g-jZ^VZzc-ftTKGenm4` zBvQ5+N+@Tv+!LI%$?QsV>)NYYLRTa%YN_U)x^e0KjlAs&hYP0EFdT5a9w;r59r|~U zim?9c+^tcoKboc%9co#9^k&KzL#?d}Pg^R*H1jpNy&|WaywUl~n9?nK zx}YgkKKcG7=Dsui_jY~#9Mm;4__Oh%O}-pj(}Q{sUaG#VmHzIl%g&^L2dhGuHa}_& zUe)Z+;>a=Sy!OOpLO!XbJ5wVIEM$0C)E8epm}_2_w{>;-1P_tOgSy%FlN>$nuawxs zq`q|iCim@$_3PO>gg92;;y2pPe%|7yug@=DhR-@DS=kOMT6CY1n0;zl?6l@hWyi8s zo}FjdkmHKSxR1J&-6byV`|N}kN;xsz56|x zAv$$Jh-)fWFqd@CNzG!GLPK9^K!6?9JnyXNBeLw$(=@8%=s&Z>VTl_v}ODyt9+` zRs23T*ZTe6JLmt(cxl$AWY4{|a_+6;`{znP#%q^f`}fKIxAKomyT3CeXl}LLb7Si4 z`hVwZzV|#tkL z@G&HuS@m&)-vrhP%!ZBz+a~@E_A=bB%@DEvdRd1OhXd!S%jxGqtyhPYq1qcg1I{!Y zWx66V@rrx%ebej>?w^x5{dRl4n-q3B>B9c|@&@a}#5_K1;I}?=IXnGJt=FsRj0Rom z3&OiX`c7Li-(}{jn#U2Lod3n)r136AmeVhc3>HpjV@}`1xXiOAMkD*-jc4wp~LG<|VXUV%wo)uwvr2O?PA# zJcvcLis$ z8_%SN%kQ{cb2jUrb!~Ukl1N8ZMw?k-rpl|kUYlyJaAsJ`+v7R;<5xC~4zXY-J0k`0 z!yoxR8cSanJG;(1_to-}m_h@s)r}8!yb-+m%$vtVqx_kIqvzyg&18>tcbk2ijs!h$ zkg%1hf7d?6gq7v1U~zEixzC#ZYPXfOCqKLE>bRI;eVo)(!IPGbZCVHWE4LcOuiE%% zsX<~1pU=%D^ccW8)EwoOHxxTe@p-noi@hk3S#k=&?R*TjG`P z%U#XTez<9lM);S#v)@=WO}6YW(pl#pHX(#fN0{F-a#PEBwpmm9jjrCBq0q2a^*;Zu zw;z=k=$#j3nslpu&4dgcjnEH{DeEpz;n^{%C16{%>`c$Kho9to7rxhIW~{c3Iy`C3 zs}9W-Ci2JZu5m8jR`6wA(9S0eV!>_lQ&^9c9;iH9s{T9Ld~rR~DUK<>%&xr3(X46^ zjCuSouYsUXhMtk@%)D75 zoriSn?e{x)ac%?(@UEb!vUw*p-i_#U?Z!}Bp?mvHHqUF)QZ}_v-@>`luC@Y_q zoHEa+h~dibj`ST;6L zTVczCvfg^Xzjt`7&SYsKlu=THvZ^Lk&{~gCO&k${AdM(`2GF&-|K2@ zY=~jp!f+$IHSkhjlk(>}t|=|5+%7NmO=sQQ)bI4g=%oxhlSk1rxigK;%?V14f&uLf z4AEYkpR=Y-`XnV1bS%9HLFzLryby96?GrP@ zvJYyn-_!H9%$VhU9OGG|Us4>CC68ql8SZ-T)0Md+E|FV8;_8x3s!Xfbb7rfjC%Ol2 zn!TLo*Jl|Kp0uOprz(BouIvsy>s>j?VeKTx#i493SBH0do@MzFV&Ja5c?Ffz z_r~qN?l4)w$G9oqcmL$-n4nC_?>u599Ey($BA$FMJsbISlghu`r6N|JMf1U`aQc8kvMI^ ze)iAG-baOP-hI4&HQfK%6p!+q;S-+vyi5tJH)p?b_qKM+y6gkb)fpY{E#G*t=?$|F zpUzUgO`8wSUnk5{=x?^p{?z2f=i29}`<`H7{&;x`+kLbB_YOZSVA*hEvjbyg(?4Hf zE2cV5<4hASbGMDBF6{jNInp&OGFLY8xWk{7EE7&;F&lUVKhK<&!t=b-j&13u4S(he zc{TZ+u{;&-d?pXS1Y-^wyrK?SAuC{QJX?Ifu`0Tif5Mrm*eW zzqIVP@-OfI_Oz?WTK?^1mO8_0(9)lOA-Au_HJ#G0dC1N1;o|y#@9*FE4;qIJ-oD=V zdiGmgmLu!f#8Ou#&JtR;RCeEA6$QU+7CE`E{<2Nof+rT)Okl5*n~?Fquc4FizlPzH z#HpXOPNj2%?d7QZIKj=J_y64-vy8ou4>q&!DE_T_XGfvz?z?`*FS(a_rgZh=ffyH@68hi<;;cT-;T=NBQV&Cfk~?-tKn!tZq9)BAvaUI}m2fL{yRQ>9FW zpG>aKXZs`A!N|b!bIzPio??|d`go3+IQw7gI&n6F^@4Z5^!TQwmut+U7G( zGu}C6V8=Gn~r!%wzXd zrBg@cl)DMjf*O}6J}DX&&MiI*qO_ydMrdlcF~}d>9p;+kCdNHeBIo`6-RX^=UsxAe z=v2JCrh8{k>E%DSHIB>HJ`3tPaXE)U>!u^ivY@WCvin<%qEAV_I6Ff-<#h{#v3Ggq z^r|LBjRvjjJLA@?N`x<%<`|K!#eZh_vq9qb`WJIN3}rW3S~n*)&DUaoC(yt8lvY{EWe$mX%4gTj&ykw2aPcLB zcj7YlH%ho%_}!j%L(II$%iQPH*#0+!D^00&-+OA(W}Ur3i_hE7-hFIJ z$@=vMD*P7Pccf`V`%MXI{^#x)8JRobEw_MM+d>~__G@nZhH=ur+b@Nvxz^lYroZ$} z=VhD22Q5r%%sC^aC&|<-JF&N*?u*~EnMTJ%KDaCpG3Ut+J!5{dN2yq^Wd$em`V38m z)!|lima)A1A8Q{!-@|=h<)-QE)$fjI$R)hVR-4IH`=afCX}~GIGnY%Ae7rs-Ha8&P z{WqS-wP`ccYc=Ey-~4>k`c${AZ>-ve_0a zAw7TXVs(Y@PktQwE%T;m+02cB?R&pSRQzssm~l7w!)wXO6CD4npC_2Yq|EtXqQ1zaFe!R@Ozc=iEzMOx?^QH0n<1VJiWC7=$O7(8vuG{!p*zZ5^`T6+|&!qD+K0LG&OsTox%_XMd5&!XlS=!~s zJRWvtmnLbQ&6d_@dE=vV#SG3}*0FPwJ+|uM!U;JY_c%GktVJe0bz}3p+FTwU+0>wy z%HXx9C?vddLdpu)O@|yr6lYm(sw`RIAGZBfCeN`wUv~VTKF{Ud`@;=+Q*L<(i1($W zrKoIi^E|!e;QTM<2bGdNG_Bnu6ar=*d*Hb2`ys80X@%Dk)L3RLX%X_Up1|M!O+fik z!YSYNW*WB_iWw&JYf7$mZSq*TPW2KOT@-H=&ule9md%8g6$&{di-`9Na?5aHd z#G%3KTF{hL8PBdhI@sb}&{V6xH~Lwo+bPLZ%@s?Nu5FDzRV2c}>=3xYhhcfg(*gmp zQ&ZL^rLJ||`(V*V`y`Q-Q5}K4hiY|C?&@8za&O4_o@c!(2PZS^Y(MPS;KjP#VtJCt z{$+eCAGGrsYxOg8L`X+Q1}tz(UFdbl#5r$j#mPBk#(9Z;CM-s3A}wCb3>#*tGuDXg zcqk{~wBfoJgWdwql|hP==b5Jz74)96nc7evc%Xkx=*oiY4zJn`71^GhuiARZTHy)TA4H|*ne35U8vo9H`M*T{kjTgX9NPr7zcnWRZi=a5Nq6G; zW>+nDB*T95sf}H8JeU;Z-ZqDs>hCg{J1NPim*dNk6+M;~1;UHNH@UX=wl@6O_npn* zpb+~)_khWpj;(rg_1cm9r~Yn!QtTF{S9@~Dw;wy#nl2E2!4z>ejS*^Fu12P&pyq}VA>QuXR@-yvGa0`Ztp5(jIFC* z*qtbTeBu}Lh2)-v-~Z)hzfF(McCByIum5=(ywJzr4>riU{9fI+{Qq2WwJ)Xg*73dA zYyUs|e{cQki_7m<{9OC~_ZjW^Yu9RWul{~PFsVn@u+=(UR^IOJ;%6dM@h}jpnp7%wPK)Olw-#b^cN{?(xc=`2gTJrsw z#m62W_YcTE`g;A|v^ByXp9tO8o;;7mOLT6Z|FW>q$5~C5k5VUJRrZol*IB81b$M4) z-WiedM0&Is&&adb`EzTKpRq0>) z_xJY?um5*z{o`9(U+*aW+-7L-!ggwrTNmT+zl@scPi6$p`qFu)pJDpytEZl<{9M(` z&MzlnJR!UD^{ZQ3vv<_Kp7zH_yV3B4*#ejK({KJ?CYL`Yh?C*wna{a5H@4kN@pn9KQ(e?hd%QHp z>m!4t0vS=2j*XjT|Z0XciGnOA8H*{3m)xX z;r8)v?Fx(S8k!~Brp2?Db$78tZWyRii@6j|xY+xr_FP82#ss~y zPq%!w(QXL8+U)&&lVQyZMfN3$^B@1Ucwzs;SS#X)sfUGU(dFe+3WT-q`1`;mkRMy^kL~5?XuG&i*;4|2*5n)%Pp;&(E7L z-91sKTyl5veyweSbEGEc*+hTX!(gF(-tEYc;8vO{aV!Z^BEJ^ z58UrJ{P#UjZ^8dF=l}53y_{ahiCT-=iM@UFs)6CbXC>8|FZ}i2Ux(MfbhrC1y#C&; zdp0^tk4hv5=SHnGU7~TQ|GmxW6SG>`o-hSmhl6RE^|gxMoP-uxpNnO?{n{$fB5U`>m7xEcQu3`ycx^z z=75J~z^O+|MUoB_SuB|1`Zuoc?0VZDt+FhURei3}#o>mb%4S1ein{tOWHMaK*?{wje z4XI~LY*nsjU7s2ux<2U9v&a~SrtNDSr%d0OA9TxxC3(@ud5ffG%r04J&igM@BFFd) zll7+9A9FQTryg~zU)R$ra}BGzju&bzNX>!_Poc( zdS7$R^1Ki~RdiC2*@YIzMRxA%Iu2J=*Wxu`s6b@*+GhAUBp+ipJidOcpaET&vD zTJyBR`6&ks)hAxP8unCfO6~?7rRisbznv;ml#1>Q3T#)yR92v24 zCtnq(c$$5Ujar-b#Kv=}^VfvMOQue}|HAOtSEmmXudlnYs;}CBq2g4~&VYuUJ+9YV znD4|XIL;71d9Ca0-UW8{9c(PDGvBD4URpA()^(+Hym(vfB6HL0VFwN!uzHYDU!*og zI%cx>)Syf6y*AyyxMHtJ;=YyY0w-n!nXO=W7r;>3zo21Rv#-Ln1=nx)y1MtTzPGC} z;Sk^2ZT3a~-j!9qjZQ!N(e$#-%ewbR&A+wpt$4RmaGxrZz?w}<&Rk6T&3(PnFYZAz zD|gg;J8_1|F`v^}wK5&a|@U|0c=S<+NwD z#&(ejU7hm(?#`EH*=KP*xN92E!`hc$w*Jgz)qSvL-hwx3`kR<;7qhNuJ!cZJsY#(Q zF!+<_>ZUe^sW&aTI~N#DX86#5%gS~n?w`;=u z_e^f5Et}i8z{B0e$xJS#ccW1{v#Maivi*i?I_=G;dXG8plYY}@ue|$M?~=yKt#+Rp zBsZT_Jj7)7bFWnY@sxwpSRXa8DO_bbk?_E6OVP`eHU+#3Sb{_=|D*ukJlnxIMuXy@2yx{RM-qi}*WK=3r1e_`-d}$4_ zd3`o@^7(o8$KCtoWDR*Ldq3Mees}kJ|DUG~69XSaewri9*KV6}K=-?1fmmOe-aYM}y~i{!3f-TT^jV#S|HSjireDi?oRcqY z@Y0xb@&S(``-JCL*F2bhV$ZTnq5B&X|9;#j&RW&-_GZo<4R&GUOh%_gO>&#q8rk$W z9r%0vSzKUSNN%%;{tW#@FTwWIiPhJ&W-nH`RNJ~JESgtsrmBF~0gh|`nJ!%nU%R5v zLfdFsRL@Tp*N+iFz@ueOB+@g z+BGrlc(E-_li6fJ;e;%~2U5ZYTPOBvJ1C#Mv2@bI88H^q8Y~UopBFHCH7D@(vY#wU z$Cda}vVJ|c%3c%7`sb_N&Hf9v;s+g%Tx+$I`1<+o8(HR#(lb>`A2b=(o~}z4Iq-YN z)uly_x8?V&XpAr3@OR$#Bk#{2HdbWN(CTgJ%e`i6F7RMe>8&M)lzd+*N3JoMuzb7H znjPGdse#{}ZnEzVQxo-Hx9XF7)BUi{fSXsvpNngx9{eh84%+E1{c2 zc1M42@A=Sm`^BZdd%RQCv$xgLdgyTZ#IeKjKmJyjNgOQS*Z%p`JYI`$(VtKADYksr ztk{y@Cg9ZbQAN>aYw&NDZLkcu`rEJ5<^^>-*&DjQ%h~*Wu{8R+-S5BiE58=6{VJB! z!MKp!p0PdOmTj8cS%&HN!lv~1d@?(rT9e}c@qshj*}DDa{_1Rx^nYco4by(}z4|ww zku8V7o)a-$hO<;&AMJTKdAa{a9riunUac1M2>9#xppE@b(5hKi+72E+WIs7{PsIio zj)-qTnVGX(twn$Be%<$ZwKmvG@TMfA z&kk{(-%_$#^(QT4#FA%EJb2*2!OaIhzDVFJd3oE9Uxd@+<#VPJ&nJI9l%11x>}Dl_*wv z-g337cg5>j?_aM?j$3)&FF(w4V>x5#w8Kef{3dR+njxjTfPKN4^%8py&20#N6d&qk zxJ?Yw=R6maB5%VnTk8lH=Wp=mN@BavKyD=rqy3hExECH$&AkdJxBI(#RNfUTZR0b-^b=Wky{!RH|zN8NoER7=O`$utSI2MiKarsdd&ha0So`hwS0Sj-eA|O zo^n0x_WL=#uHW>RzPb~hvah>+KEsPCcDvrJeqrHzIp@6Ky6k=FfhW}usLdtQ84O%QBfx@!sG(bL^mYPhH5KFb4MrlJo7AFDN-oW!7LiP%3@jF2?@1 z(dsL6Ec!fd?+$&Q;x4>I@WS~vmt*!GpH^*s7s?u`D9G5JdN6Un`+KF!aqF*FeETDF z|IfAUAO8F~G|#hUTQ9@2inK>x1w5YZF}_g8u-Gl_YWF1j^bJ4l4u0;dUU)=80j%Nz3F@lKk>^N4~y(q`PH`(m@3k z>F8;Tcz78VT;$Yyrro>!;Jo7U8v;yWt4+mN_dW4HQngvGrm^p!soXP0{hhIHFK7PR z{$YdPw`&zAM2`hr*(adiC(s;f@c6gp%E=BPOLZ%a0$PK_*sJb%%+Aqgi{^>RTAeYq z?XUB+n7!F27D@A_b1w3o%(A)taNMRNjt;9T#oUfBN>(*evELG1;1T>(qJ6<7+weXI zM&>~G;L5b6v23S)&w4(SOWJV8dCB)RZ?k{g+8uvfd;OlI&$&Epd3SfU3NY>a*jwMT zzW%Rt#QJd1xh=+b)C5Aj4c$Z>RnwCg*-H?R14gzMZEsrvUm8yxGHrcb(I%agrETU*uPz%s!jewvcMTN*39 zn4%W$E)QCJ^uV$yo7OrT3$}~NS*&u1S}UJAf8uY|7n70>nRp*{UALcM!RuQF&sG?1 zlsGYaO?YD#)7O;c20zL#I4OOs+-hVtKX!9d*6OdP9Js&9H#HS&E-cq?I8f=K)_S5& zeI?uSV{d-{Jvd|9Ue4x82iAut@UVGIw7pjC9_ez;(%<;n>#e=Y*Zs~-uKwaUNg$~~ z_rCl3Ez8z8Z(86sf%_nH&b{k}t$}OT%(x`jF{Rke!Q?}$;inTOYqmDjMKYC$|E^2C zbZAKu%f7jli=X{J5GdbUox>53CeU2-y~@S9!WDY>@0h?R&QoN3{_ntGAz_U6h~n{}Rc#b?WXXZ9@J^<`#4L08<= zFEcusU%NB@e_B>_?v#Xd*L;@rn?c*WK3K4PU32L-Csz);MZxr|5SvO>5r# zR_y%w^B?DazjyrS&z&1WUw$-?v46gZ@$Rneg?IXHR$DO5y<_Ddk#=XYVS~T2ftk_v zC#lJXoPX@=#Ou@l#c$eP@^_wGa*txm{g}03_1ecIqO$*X$Ny3C1Dz{4`MMti_@t5A zH&Xl>{`zI22b#azTgCsq!e9SPf6enLQLkf9O;=uWRW+ zWY5;Ayuo1`2fs^-3FisJneEq1d{0CK z-@m*J-c#~iHD`OY%(rUJ1yf}oE!!cKGpoMu>vUsIm56B$>t813?Y^rey+lTq&AEU% z#D2@MhZi&shIla>d~{N~_Eb{ngMfgS=M2^)AAW{B23a--e=X%*U%Y(I{oSC&vw}G) zSExW+;=t>I$zM!ZbYFd3V&rzNGb&@k8`USAb1FmEb$zW$O-Ro^yJz}~)+<@g^ER<0 z1vFQt{@27Lk z+MajUX{~5}{nyny%KzJKyUiQ7>#tB!kJ0{TQyX|vCNEh0y0%rI@cqA9<2~}v-8EU) z@BOw))JdUOb?KS|%ZyS#J?On8Bk}ac#G}bV%3lv;y>d3))Oy0H$%`ji^Th?j_jeCW zlvpY>bB4FO9^cIQhH`7And8=aNl#h0XsX7-xL_^gM-iM6>I+1U7fs=rR4O#(?u$1~ zZCCdgxp{`S#jj=g(DE{=+DlXF1GA#4&#Q9fq6GH9lX4~vYW_?~egA9CrHT-kZ znc;9@SE%9U76nU`nfZfx-rz6;Ims`~L z-HdoxF|V1&W^TRVjQ*&Oiww^XZ&FxcG9kMvMN;x|c%%I73&Km!|J)fpiXG z%L3$gPb)sQJZ^XA^5@nJJNA74@UmV1{;qF#@BjDT^K0+YYuBp#w|=#IE+7}XpuS?N zvtL~9gg9G0*^X%w7prv4bltS(NBQYP%a){F{xom(YVF^D9~NxrYWcEX%6{_9M7bH$ zQ!OV+?5kk71L`5}Ir8)dg^=2u9P=MeR?o(n5Pg;q@NHR`Y zw!r(n$#S{geS5nm?}=+@RnDrnG25!Has6W8mOnMuv>F&9gP2}KJhiuoPTLywu;51X zCzDeO$CwM(ieA>aG;QO2&bCB`JI5wH`(l{b`H3$h%ywnWMkxjpxhD4oc}f9StzRTw z-BKmJi^YAdIrDLjD9!|{NCvNG;T(w{OfKn^madnO3f$djA%FQ$M8(Uc(+mFoGJUhI z>_&F0cbxh9x!?EQ%qjT%%r_<`=E2+YeQoaYwujb6Z!dWJOESps#@lr@YpD$!-L19%ikyMzFQTrILEq5bYuRH_S)l>wro~w%AS9}$lD@lT=Si|TkHV) z_lDpPAx)=PO4zS{dh%f7+1n2NdaMP_3=*{o8yO8a<(@y<6BYS?*_^<$Q+CO-R;4Ub zy&KLlC#!6J=?bP*9g{amGWGl|u#jPS(!jQ1@52TEDi-Hl-5-6^=%#kfw|jxR8|+>f zBp9?LJW!6`e*68K&C?Dq@{wSyOfx;T{7T{e``XI7FX!}|?Jqv(acYIq>!mub%mLFG zKJEX!=g=mB2Vr7<-xgf`^DxWxa^;q&^%L6)A3nc0e}iC{~*u zTcWVV*z&}iHCq!dDKW&H5A;1HsG(i9Y{7bIqXi0QHebu#zv#?H&Bd8v{|`>geepa0 z!r$9hdbp%|Hx;CMX&LwCtoYL8b6xdL%>9cE=6%;+G@kgV&~e&HjAa9pOof7j7z49= z^CX?8QI95u2r_sHKGR$69`r1`TKB}cEA`qdET5iSH(NpOd&sP(n|pP9njSj7uTA-1 zq|45;DX(X$=HHluJHI`WlX)QL!?Nti{`WI%P3+<=kH6jetJ>(2HIs_{<=lD)j;Pih zzqbT8EZ^34_Z`=1rSul*>+2u?c_efH&$I0xetZ;e5r~zFkI}N;w60?ApPxJ4f4Kkn z@17Gu-+zDEEO_7C=*kbBioki+ap$}L+U%?UBl*1H-|o|<%#LCY>!qB26os^WdQw{o znvTqYPDk36t=-zT{JHg+V7FXe`=8D8>;4?w|G$3T|0Ddh&yL@#czSHEtKVKjwlB}a zb@%+YNi_A|`B5-M>37!yQT}5M(ox^hO4-Jn~?t@p8dEl03`V-B@q3tf_E&*7qY&HF>Ac=bTT+1(>=*KU_9?U3unH z(4obu*B17OrtW(($7k6goqrN3oWTcZRNS>63F%y}$o_^bMaoN38Ly6OxFW�yEbftk@QUto`m)B``g0f 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�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 E0ArJ*pa1{> literal 0 HcmV?d00001 diff --git a/src/library/SensirionSGP41/keywords.txt b/src/library/SensirionSGP41/keywords.txt new file mode 100644 index 0000000..13e6ba2 --- /dev/null +++ b/src/library/SensirionSGP41/keywords.txt @@ -0,0 +1,27 @@ +####################################### +# Syntax Coloring Map +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +SensirionI2CSgp41 KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +executeConditioning KEYWORD2 +measureRawSignals KEYWORD2 +executeSelfTest KEYWORD2 +turnHeaterOff KEYWORD2 +getSerialNumber KEYWORD2 +####################################### +# Instances (KEYWORD2) +####################################### + +sgp41 KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/src/library/SensirionSGP41/library.properties b/src/library/SensirionSGP41/library.properties new file mode 100644 index 0000000..6ec6d24 --- /dev/null +++ b/src/library/SensirionSGP41/library.properties @@ -0,0 +1,10 @@ +name=Sensirion I2C SGP41 +version=1.0.0 +author=Sensirion +maintainer=Sensirion +sentence=Library for the SGP41 sensor family by Sensirion +paragraph=Enables you to use the SGP41 via I2C. +url=https://github.com/Sensirion/arduino-i2c-sgp41 +category=Sensors +depends=Sensirion Core +includes=SensirionI2CSgp41.h diff --git a/src/library/SensirionSGP41/src/SensirionI2CSgp41.cpp b/src/library/SensirionSGP41/src/SensirionI2CSgp41.cpp new file mode 100644 index 0000000..f17d79c --- /dev/null +++ b/src/library/SensirionSGP41/src/SensirionI2CSgp41.cpp @@ -0,0 +1,182 @@ +/* + * THIS FILE IS AUTOMATICALLY GENERATED + * + * I2C-Generator: 0.3.0 + * Yaml Version: 0.1.0 + * Template Version: 0.7.0-62-g3d691f9 + */ +/* + * Copyright (c) 2021, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "SensirionI2CSgp41.h" +#include "Arduino.h" +#include + +#define SGP41_I2C_ADDRESS 0x59 + +SensirionI2CSgp41::SensirionI2CSgp41() { +} + +void SensirionI2CSgp41::begin(TwoWire& i2cBus) { + _i2cBus = &i2cBus; +} + +uint16_t SensirionI2CSgp41::executeConditioning(uint16_t defaultRh, + uint16_t defaultT, + uint16_t& srawVoc) { + uint16_t error; + uint8_t buffer[8]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x2612, buffer, 8); + + error = txFrame.addUInt16(defaultRh); + error |= txFrame.addUInt16(defaultT); + if (error) { + return error; + } + + error = SensirionI2CCommunication::sendFrame(SGP41_I2C_ADDRESS, txFrame, + *_i2cBus); + if (error) { + return error; + } + + delay(50); + + SensirionI2CRxFrame rxFrame(buffer, 8); + error = SensirionI2CCommunication::receiveFrame(SGP41_I2C_ADDRESS, 3, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(srawVoc); + return error; +} + +uint16_t SensirionI2CSgp41::measureRawSignals(uint16_t relativeHumidity, + uint16_t temperature, + uint16_t& srawVoc, + uint16_t& srawNox) { + uint16_t error; + uint8_t buffer[8]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x2619, buffer, 8); + + error = txFrame.addUInt16(relativeHumidity); + error |= txFrame.addUInt16(temperature); + if (error) { + return error; + } + + error = SensirionI2CCommunication::sendFrame(SGP41_I2C_ADDRESS, txFrame, + *_i2cBus); + if (error) { + return error; + } + + delay(50); + + SensirionI2CRxFrame rxFrame(buffer, 8); + error = SensirionI2CCommunication::receiveFrame(SGP41_I2C_ADDRESS, 6, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(srawVoc); + error |= rxFrame.getUInt16(srawNox); + return error; +} + +uint16_t SensirionI2CSgp41::executeSelfTest(uint16_t& testResult) { + uint16_t error; + uint8_t buffer[3]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x280E, buffer, 3); + + error = SensirionI2CCommunication::sendFrame(SGP41_I2C_ADDRESS, txFrame, + *_i2cBus); + if (error) { + return error; + } + + delay(320); + + SensirionI2CRxFrame rxFrame(buffer, 3); + error = SensirionI2CCommunication::receiveFrame(SGP41_I2C_ADDRESS, 3, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(testResult); + return error; +} + +uint16_t SensirionI2CSgp41::turnHeaterOff() { + uint16_t error; + uint8_t buffer[2]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x3615, buffer, 2); + + error = SensirionI2CCommunication::sendFrame(SGP41_I2C_ADDRESS, txFrame, + *_i2cBus); + delay(1); + return error; +} + +uint16_t SensirionI2CSgp41::getSerialNumber(uint16_t serialNumber[]) { + uint16_t error; + uint8_t buffer[9]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x3682, buffer, 9); + + error = SensirionI2CCommunication::sendFrame(SGP41_I2C_ADDRESS, txFrame, + *_i2cBus); + if (error) { + return error; + } + + delay(1); + + SensirionI2CRxFrame rxFrame(buffer, 9); + error = SensirionI2CCommunication::receiveFrame(SGP41_I2C_ADDRESS, 9, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(serialNumber[0]); + error |= rxFrame.getUInt16(serialNumber[1]); + error |= rxFrame.getUInt16(serialNumber[2]); + return error; +} diff --git a/src/library/SensirionSGP41/src/SensirionI2CSgp41.h b/src/library/SensirionSGP41/src/SensirionI2CSgp41.h new file mode 100644 index 0000000..d621365 --- /dev/null +++ b/src/library/SensirionSGP41/src/SensirionI2CSgp41.h @@ -0,0 +1,140 @@ +/* + * THIS FILE IS AUTOMATICALLY GENERATED + * + * I2C-Generator: 0.3.0 + * Yaml Version: 0.1.0 + * Template Version: 0.7.0-62-g3d691f9 + */ +/* + * Copyright (c) 2021, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SENSIRIONI2CSGP41_H +#define SENSIRIONI2CSGP41_H + +#include + +#include "../../SensirionCore/src/SensirionCore.h" + +class SensirionI2CSgp41 { + + public: + SensirionI2CSgp41(); + /** + * begin() - Initializes the SensirionI2CSgp41 class. + * + * @param i2cBus Arduino stream object to use for communication. + * + */ + void begin(TwoWire& i2cBus); + + /** + * executeConditioning() - This command starts the conditioning, i.e., the + * VOC pixel will be operated at the same temperature as it is by calling + * the sgp41_measure_raw command while the NOx pixel will be operated at a + * different temperature for conditioning. This command returns only the + * measured raw signal of the VOC pixel SRAW_VOC as 2 bytes (+ 1 CRC byte). + * + * @param defaultRh Default conditions for relative humidty. + * + * @param defaultT Default conditions for temperature. + * + * @param srawVoc u16 unsigned integer directly provides the raw signal + * SRAW_VOC in ticks which is proportional to the logarithm of the + * resistance of the sensing element. + * + * @return 0 on success, an error code otherwise + */ + uint16_t executeConditioning(uint16_t defaultRh, uint16_t defaultT, + uint16_t& srawVoc); + + /** + * measureRawSignals() - This command starts/continues the VOC+NOx + * measurement mode + * + * @param relativeHumidity Leaves humidity compensation disabled by sending + * the default value 0x8000 (50%RH) or enables humidity compensation when + * sending the relative humidity in ticks (ticks = %RH * 65535 / 100) + * + * @param temperature Leaves humidity compensation disabled by sending the + * default value 0x6666 (25 degC) or enables humidity compensation when + * sending the temperature in ticks (ticks = (degC + 45) * 65535 / 175) + * + * @param srawVoc u16 unsigned integer directly provides the raw signal + * SRAW_VOC in ticks which is proportional to the logarithm of the + * resistance of the sensing element. + * + * @param srawNox u16 unsigned integer directly provides the raw signal + * SRAW_NOX in ticks which is proportional to the logarithm of the + * resistance of the sensing element. + * + * @return 0 on success, an error code otherwise + */ + uint16_t measureRawSignals(uint16_t relativeHumidity, uint16_t temperature, + uint16_t& srawVoc, uint16_t& srawNox); + + /** + * executeSelfTest() - This command triggers the built-in self-test checking + * for integrity of both hotplate and MOX material and returns the result of + * this test as 2 bytes + * + * @param testResult 0xXX 0xYY: ignore most significant byte 0xXX. The four + * least significant bits of the least significant byte 0xYY provide + * information if the self-test has or has not passed for each individual + * pixel. All zero mean all tests passed successfully. Check the datasheet + * for more detailed information. + * + * @return 0 on success, an error code otherwise + */ + uint16_t executeSelfTest(uint16_t& testResult); + + /** + * turnHeaterOff() - This command turns the hotplate off and stops the + * measurement. Subsequently, the sensor enters the idle mode. + * + * @return 0 on success, an error code otherwise + */ + uint16_t turnHeaterOff(void); + + /** + * getSerialNumber() - This command provides the decimal serial number of + * the SGP41 chip by returning 3x2 bytes. + * + * @param serialNumber 48-bit unique serial number + * + * @return 0 on success, an error code otherwise + */ + uint16_t getSerialNumber(uint16_t serialNumber[]); + + private: + TwoWire* _i2cBus = nullptr; +}; + +#endif /* SENSIRIONI2CSGP41_H */ diff --git a/src/library/SensirionSHT4x/.clang-format b/src/library/SensirionSHT4x/.clang-format new file mode 100644 index 0000000..047f2ad --- /dev/null +++ b/src/library/SensirionSHT4x/.clang-format @@ -0,0 +1,14 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +IndentWidth: 4 +AlignAfterOpenBracket: Align +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: false +IndentCaseLabels: true +SpacesBeforeTrailingComments: 2 +PointerAlignment: Left +AlignEscapedNewlines: Left +ForEachMacros: ['TEST_GROUP', 'TEST'] +... diff --git a/src/library/SensirionSHT4x/.gitignore b/src/library/SensirionSHT4x/.gitignore new file mode 100644 index 0000000..47ded03 --- /dev/null +++ b/src/library/SensirionSHT4x/.gitignore @@ -0,0 +1,70 @@ +app/bin/ +app/pde.jar +build/macosx/work/ +arduino-core/bin/ +arduino-core/arduino-core.jar +hardware/arduino/bootloaders/caterina_LUFA/Descriptors.o +hardware/arduino/bootloaders/caterina_LUFA/Descriptors.lst +hardware/arduino/bootloaders/caterina_LUFA/Caterina.sym +hardware/arduino/bootloaders/caterina_LUFA/Caterina.o +hardware/arduino/bootloaders/caterina_LUFA/Caterina.map +hardware/arduino/bootloaders/caterina_LUFA/Caterina.lst +hardware/arduino/bootloaders/caterina_LUFA/Caterina.lss +hardware/arduino/bootloaders/caterina_LUFA/Caterina.elf +hardware/arduino/bootloaders/caterina_LUFA/Caterina.eep +hardware/arduino/bootloaders/caterina_LUFA/.dep/ +build/*.zip +build/*.tar.bz2 +build/windows/work/ +build/windows/*.zip +build/windows/*.tgz +build/windows/*.tar.bz2 +build/windows/libastylej* +build/windows/liblistSerials* +build/windows/arduino-*.zip +build/windows/dist/*.tar.gz +build/windows/dist/*.tar.bz2 +build/windows/launch4j-*.tgz +build/windows/launch4j-*.zip +build/windows/launcher/launch4j +build/windows/WinAVR-*.zip +build/macosx/arduino-*.zip +build/macosx/dist/*.tar.gz +build/macosx/dist/*.tar.bz2 +build/macosx/*.tar.bz2 +build/macosx/libastylej* +build/macosx/appbundler*.jar +build/macosx/appbundler*.zip +build/macosx/appbundler +build/macosx/appbundler-1.0ea-arduino? +build/macosx/appbundler-1.0ea-arduino*.zip +build/macosx/appbundler-1.0ea-upstream*.zip +build/linux/work/ +build/linux/dist/*.tar.gz +build/linux/dist/*.tar.bz2 +build/linux/*.tgz +build/linux/*.tar.xz +build/linux/*.tar.bz2 +build/linux/*.zip +build/linux/libastylej* +build/linux/liblistSerials* +build/shared/arduino-examples* +build/shared/reference*.zip +build/shared/Edison*.zip +build/shared/Galileo*.zip +build/shared/WiFi101-Updater-ArduinoIDE-Plugin*.zip +test-bin +*.iml +.idea +.DS_Store +.directory +hardware/arduino/avr/libraries/Bridge/examples/XivelyClient/passwords.h +avr-toolchain-*.zip +/app/nbproject/private/ +/arduino-core/nbproject/private/ +/app/build/ +/arduino-core/build/ + +manifest.mf +nbbuild.xml +nbproject \ No newline at end of file diff --git a/src/library/SensirionSHT4x/.gitlab-ci.yml b/src/library/SensirionSHT4x/.gitlab-ci.yml new file mode 100644 index 0000000..2c74751 --- /dev/null +++ b/src/library/SensirionSHT4x/.gitlab-ci.yml @@ -0,0 +1,103 @@ +stages: + - validate + - test + +variables: + YQ_URL: https://github.com/mikefarah/yq/releases/download/v4.33.3/yq_linux_amd64 + +compile_test: + stage: test + image: + name: registry.gitlab.sensirion.lokal/sensirion/docker/docker-arduino:0.4.0 + tags: [docker, linux] + before_script: + - rm -rf ../sensirion-core-arduino-library + script: + - git clone --depth 1 --branch 0.5.2 https://github.com/Sensirion/arduino-core.git ../sensirion-core-arduino-library + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:samd:mkrzero ./examples/exampleUsage/exampleUsage.ino + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:avr:mega ./examples/exampleUsage/exampleUsage.ino + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:avr:nano ./examples/exampleUsage/exampleUsage.ino + - arduino-cli compile --libraries=".." --warnings all --fqbn arduino:avr:uno ./examples/exampleUsage/exampleUsage.ino + - arduino-cli compile --libraries=".." --warnings all --fqbn esp32:esp32:esp32 ./examples/exampleUsage/exampleUsage.ino + - arduino-cli compile --libraries=".." --warnings all --fqbn esp8266:esp8266:generic ./examples/exampleUsage/exampleUsage.ino + +arduino_lint: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.2.0 + tags: [linux, docker] + script: + - mkdir ~/arlint + - PATH=~/arlint:$PATH + - curl -fsSL https://raw.githubusercontent.com/arduino/arduino-lint/main/etc/install.sh | BINDIR=~/arlint sh + - arduino-lint --library-manager false + +syntax_check: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.2.0 + tags: [linux, docker] + script: + - find . -type f -iregex ".*\.\(c\|h\|cpp\|ino\)" -exec clang-format-6.0 -i -style=file {} \; && git diff --exit-code + + +cppcheck: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.2.0 + tags: [linux, docker] + script: + - cppcheck --std=c++11 --language=c++ --error-exitcode=1 --enable=warning,style,performance,portability --suppress=unreadVariable src/* + +TODO_check: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.2.0 + tags: [linux, docker] + script: + - '! grep -rnw --exclude=.gitlab-ci.yml --exclude-dir=.git . -e "TODO"' + +metadata_check: + stage: validate + image: + name: registry.gitlab.sensirion.lokal/mso-sw/drivers/docker-driver-generator:0.2.0 + tags: [linux, docker] + before_script: + - apt-get -qq update && apt-get -qq install -y wget + - if ! [ -d downloads/ ]; then mkdir downloads; fi + - if ! [ -e downloads/yq ]; then wget --no-verbose $YQ_URL -O downloads/yq; fi + - cp downloads/yq /usr/local/bin/yq && chmod +x /usr/local/bin/yq + script: + # check if metadata.yml exists + - > + if ! [ -f "metadata.yml" ]; then + echo "metadata.yml file not found" + exit 1 + fi + # check that dg_status is 'released' + - export DG_STATUS=$(yq ".dg_status.[]" ./metadata.yml) + - > + if [ $DG_STATUS != "released" ]; then + echo "dg_status in metadata.yml has to be 'released', not '$DG_STATUS'" + exit 1 + fi + # check that last_generated is not older than timestamp of last non-merge commit (+ 3 minutes) + - export IS_MANUALLY_MODIFIED=$(yq ".is_manually_modified" ./metadata.yml) + - > + if [ $IS_MANUALLY_MODIFIED = false ]; then + export LAST_GENERATED_TS=$(yq ".last_generated" ./metadata.yml) + export LAST_GENERATED_TS_EPOCH=$(date -d "$LAST_GENERATED_TS" +%s) + export LAST_NON_MERGE_COMMIT_TS=$(git log --format=%ad --date=iso-strict --no-merges -1) + export COMMIT_TS_EPOCH=$(date -d "$LAST_NON_MERGE_COMMIT_TS" +%s) + if [ $(($LAST_GENERATED_TS_EPOCH + 180)) -lt $COMMIT_TS_EPOCH ]; then + echo "'last_generated' timestamp in metadata.yml is older than commit timestamp ($LAST_GENERATED_TS vs $LAST_NON_MERGE_COMMIT_TS)" + exit 1 + fi + fi + # check that 'is_manually_modified' is set to true if commit is not from driver generator + - export LAST_NON_MERGE_COMMIT_AUTHOR=$(git log --format=%an --no-merges -1) + - > + if ! [ "$LAST_NON_MERGE_COMMIT_AUTHOR" = "Driver Generator 2" ] && [ "$IS_MANUALLY_MODIFIED" = false ]; then + echo "Last commit is not from Driver Generator. Please update 'is_manually_modified' in metadata.yml" + exit 1 + fi \ No newline at end of file diff --git a/src/library/SensirionSHT4x/CHANGELOG.md b/src/library/SensirionSHT4x/CHANGELOG.md new file mode 100644 index 0000000..163fd7f --- /dev/null +++ b/src/library/SensirionSHT4x/CHANGELOG.md @@ -0,0 +1,19 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## [Unreleased] + +Defined I2C addresses for different sensor models. +You must now pass the I2C address to use in the begin() method of SensirionI2cSht4x + +Improved README + +## [0.1.0] - 2021-07-27 + +Initial release + +[0.1.0]: https://github.com/Sensirion/arduino-i2c-sht4x/releases/tag/0.1.0 diff --git a/src/library/SensirionSHT4x/LICENSE b/src/library/SensirionSHT4x/LICENSE new file mode 100644 index 0000000..f95f5fe --- /dev/null +++ b/src/library/SensirionSHT4x/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2023, Sensirion AG +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/library/SensirionSHT4x/README.md b/src/library/SensirionSHT4x/README.md new file mode 100644 index 0000000..d42340d --- /dev/null +++ b/src/library/SensirionSHT4x/README.md @@ -0,0 +1,206 @@ +# Sensirion I²C SHT4X Arduino Library + +This is the Sensirion SHT4X library for Arduino allowing you to +communicate with a sensor of the SHT4X family over I²C. + + + +Click [here](https://sensirion.com/products/catalog/SEK-SHT40/) to learn more about the Sensirion SHT4X sensor family. + + + +## Supported sensor types + +| Sensor name | I²C Addresses | +| ------------- | -------------- | +|[SHT40](https://sensirion.com/products/catalog/SHT40/)| **0x44**, 0x45| +|[SHT41](https://sensirion.com/products/catalog/SHT41/)| **0x44**, 0x45| +|[SHT45](https://sensirion.com/products/catalog/SHT45/)| **0x44**, 0x45| + +The following instructions and examples use a *SHT40*. + + + +## Installation of the library + +This library can be installed using the Arduino Library manager: +Start the [Arduino IDE](http://www.arduino.cc/en/main/software) and open +the Library Manager via + +`Sketch` ➔ `Include Library` ➔ `Manage Libraries...` + +Search for the `Sensirion I2C SHT4X` library in the `Filter +your search...` field and install it by clicking the `install` button. + +If you cannot find it in the library manager, download the latest release as .zip file +and add it to your [Arduino IDE](http://www.arduino.cc/en/main/software) via + +`Sketch` ➔ `Include Library` ➔ `Add .ZIP Library...` + +Don't forget to **install the dependencies** listed below the same way via library +manager or `Add .ZIP Library` + +#### Dependencies +* [Sensirion Core](https://github.com/Sensirion/arduino-core) + +## Sensor wiring + +Use the following pin description to connect your SHT4X to the standard I²C bus of your Arduino board: + + + +| *Pin* | *Cable Color* | *Name* | *Description* | *Comments* | +|-------|---------------|:------:|----------------|------------| +| 1 | green | SDA | I2C: Serial data input / output | +| 2 | black | GND | Ground | +| 3 | yellow | SCL | I2C: Serial clock input | +| 4 | red | VDD | Supply Voltage | 1.1V to 3.6V + +The recommended voltage is 3.3V. + +Please refer to the datasheet for proper circuit setup. There are 3rd party boards for easy connection of the SHT4x sensor to your Arduino Board. + +### Board specific wiring +You will find pinout schematics for recommended board models below: + + + +
Arduino Uno +

+ +| *SHT4X* | *SHT4X Pin* | *Cable Color* | *Board Pin* | +| :---: | --- | --- | --- | +| SDA | 1 | green | D18/SDA | +| GND | 2 | black | GND | +| SCL | 3 | yellow | D19/SCL | +| VDD | 4 | red | 3.3V | + + + + +

+
+ + + +
Arduino Nano +

+ +| *SHT4X* | *SHT4X Pin* | *Cable Color* | *Board Pin* | +| :---: | --- | --- | --- | +| SDA | 1 | green | A4 | +| GND | 2 | black | GND | +| SCL | 3 | yellow | A5 | +| VDD | 4 | red | 3.3V | + + + + +

+
+ + + +
Arduino Micro +

+ +| *SHT4X* | *SHT4X Pin* | *Cable Color* | *Board Pin* | +| :---: | --- | --- | --- | +| SDA | 1 | green | D2/SDA | +| GND | 2 | black | GND | +| SCL | 3 | yellow | ~D3/SCL | +| VDD | 4 | red | 3.3V | + + + + +

+
+ + + +
Arduino Mega 2560 +

+ +| *SHT4X* | *SHT4X Pin* | *Cable Color* | *Board Pin* | +| :---: | --- | --- | --- | +| SDA | 1 | green | D20/SDA | +| GND | 2 | black | GND | +| SCL | 3 | yellow | D21/SCL | +| VDD | 4 | red | 3.3V | + + + + +

+
+ + + +
ESP32 DevKitC +

+ +| *SHT4X* | *SHT4X Pin* | *Cable Color* | *Board Pin* | +| :---: | --- | --- | --- | +| SDA | 1 | green | GPIO 21 | +| GND | 2 | black | GND | +| SCL | 3 | yellow | GPIO 22 | +| VDD | 4 | red | 3V3 | + + + + +

+
+ + +## Quick Start + +1. Install the libraries and dependencies according to [Installation of the library](#installation-of-the-library) + +2. Connect the SHT4X sensor to your Arduino as explained in [Sensor wiring](#sensor-wiring) + +3. Open the `exampleUsage` sample project within the Arduino IDE: + + `File` ➔ `Examples` ➔ `Sensirion I2C SHT4X` ➔ `exampleUsage` + + + The provided example is working with a SHT40, I²C address 0x44. + In order to use the code with another product or I²C address you need to change it in the code of `exampleUsage`. + You find the list with pre-defined addresses in `src/SensirionI2CSht4x.h`. + + +5. Click the `Upload` button in the Arduino IDE or `Sketch` ➔ `Upload` + +4. When the upload process has finished, open the `Serial Monitor` or `Serial + Plotter` via the `Tools` menu to observe the measurement values. Note that + the `Baud Rate` in the used tool has to be set to `115200 baud`. + +## Contributing + +**Contributions are welcome!** + +We develop and test this driver using our company internal tools (version +control, continuous integration, code review etc.) and automatically +synchronize the master branch with GitHub. But this doesn't mean that we don't +respond to issues or don't accept pull requests on GitHub. In fact, you're very +welcome to open issues or create pull requests :) + +This Sensirion library uses +[`clang-format`](https://releases.llvm.org/download.html) to standardize the +formatting of all our `.cpp` and `.h` files. Make sure your contributions are +formatted accordingly: + +The `-i` flag will apply the format changes to the files listed. + +```bash +clang-format -i src/*.cpp src/*.h +``` + +Note that differences from this formatting will result in a failed build until +they are fixed. + + +## License + +See [LICENSE](LICENSE). diff --git a/src/library/SensirionSHT4x/examples/exampleUsage/exampleUsage.ino b/src/library/SensirionSHT4x/examples/exampleUsage/exampleUsage.ino new file mode 100644 index 0000000..ced6c91 --- /dev/null +++ b/src/library/SensirionSHT4x/examples/exampleUsage/exampleUsage.ino @@ -0,0 +1,89 @@ +/* + * THIS FILE IS AUTOMATICALLY GENERATED + * + * Generator: sensirion-driver-generator 0.32.0 + * Product: sht4x + * Model-Version: 2.0.0 + */ +/* + * Copyright (c) 2023, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include + +SensirionI2CSht4x sensor; + +static char errorMessage[64]; +static int16_t error; + +void setup() { + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + Wire.begin(); + sensor.begin(Wire, SHT40_I2C_ADDR_44); + + sensor.softReset(); + delay(10); + uint32_t serialNumber = 0; + error = sensor.serialNumber(serialNumber); + if (error != NO_ERROR) { + Serial.print("Error trying to execute serialNumber(): "); + errorToString(error, errorMessage, sizeof errorMessage); + Serial.println(errorMessage); + return; + } + Serial.print("serialNumber: "); + Serial.print(serialNumber); + Serial.println(); +} + +void loop() { + + float aTemperature = 0.0; + float aHumidity = 0.0; + delay(20); + error = sensor.measureLowestPrecision(aTemperature, aHumidity); + if (error != NO_ERROR) { + Serial.print("Error trying to execute measureLowestPrecision(): "); + errorToString(error, errorMessage, sizeof errorMessage); + Serial.println(errorMessage); + return; + } + Serial.print("aTemperature: "); + Serial.print(aTemperature); + Serial.print("\t"); + Serial.print("aHumidity: "); + Serial.print(aHumidity); + Serial.println(); +} diff --git a/src/library/SensirionSHT4x/images/Arduino-Mega-2560-Rev3-i2c-pinout-3.3V.png b/src/library/SensirionSHT4x/images/Arduino-Mega-2560-Rev3-i2c-pinout-3.3V.png new file mode 100644 index 0000000000000000000000000000000000000000..942173dbdc7082393078ebc1d06c628c2a05fbdc GIT binary patch literal 415104 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≈9T7pWy`o-&d+~t0&a0fQe+iw%L{rg#Iu7}$nhwWLc{+r!({~n7u zAIp!st$TRx-_^+J_GU%8uXlaV-Dmjv)AQxejo8Hcdt(l}=bw}lli6%-kXBxhzHH9b zpoD_7GQL-NUpF-#6x+)6{%zjD^J>p8v$6H>WLABD&rE*WPGitP4N8lgI;xDX)jkzb zn_tOOZ2vdw)O$%09Uf5RM)uu57S^%MQLL$>%YGhg7Uj#W)$0#^PS1Ps_0QpQUCCKn zA8tAvdj0!H_T}dilHIe9y{k(uW3Q`Bw0Qk#uUPQ0cXjsyIP5J-)gFJ^zsI1b{7Xq{ z>_6-E^H1&hb2RbJ&HYxtKdt92OkcL=s#k)6(&-uV=ev7*dtYoksLgBgs&uVeC!_B# z`@31??>(z`9?m=ba$zv*T{-6F?rUGZF5bT0{_Xpw)m949TQ#Tir@v(JbaDB*w)+2M zgS)>Nj?MpN(PVt_x)U2K_hk;pgF)B2JEYndggM?c;%LoCGVEAk^1KCF;0RXQ6{F!#EDV%f|CSEuvsZ>o*XJF?rHXNk`L z=HT=jp%b{myk*(EMI~}Xn59(T8K+5Tmwva+)R&W%)wIyzFffp~eEWKTtYp@llZp+A z2icZ!utl(3YnGZ*_c<@;$8o_M{Wi@%0xKeOt_xHnls_mPuo&GSdUUJ_>#UJjU-z%M4kdU~_RzqT2 z^iLJVMLNf27`XyloUXDsUgmP#%q3u=!y`DA6{d4apeA-uZdH0W& zg_|yXDY&nswCIe482GRPrA0gH{~p}`;M-j5h1aDcdbF;2#Imm3w5j*e8IcF4%?^Fm zm|&^1qiK6+f0nI*#oKU))`yh4z<*`=`Q+5{mXWl$$^l?Z6- zFKEU_Bd;op>;KO~jD5=MisJ2SC%P&u64@#vvF90Y!l~Cs*L{1k&YXuQjE}kbYUWh0 zBWZJ2ElBO($^7Bu#IC&mX=}MwUrD-m+LuLj&e!%;j|>w64Em!C4IoENgp|Uaukyd} z!SNq^*}rYvoiJ5u*4BqNo|teux@2B0O87A8Hai0kPnaMZ+v?L=Q# zhaW4r`7lYbBO~(jXS0eu-HrBB6&#lP{JmG8V=zNPI%{LZg6rmMPm~>FYF_x^QN=~? zJo&zJH-gtmbMvffeKFr8xzVxP?=<_KGk)`I8dry}KUUwz%I19V$%QZ-gB5-pf_eA% z$!1^sva!Qe!!=-o%^bP*z39X5hy@ZS3K;tZ~t{EQmhFSuN^B6!9#z` zzRzp(H*ka=dG+<-%i{0|4y99(x~y#X_n6JQqBx=P;H$$25>lrq-`PH?@n8@eYjT*C z!HES4oY^N2K+diTJX*+O2nt_8!KJ1~HLUi34t|FgXsr8w9E;rHoG8}hb*T1#`>Abx z4_5W{oMyS6-xhs8E_A!9^z7HaHm;jG@ra`5v4`5qo(K24$$8ey_w4@NGwaL#KX;yA zjBL@<;X15$jFpcPZSO1iUXPU8wMDROMv_Cxz^Z!!= z9Y~UPiTr!_`TPUh=hulZIYpryM-%TmlT1 z#ejC|obGRQ%rbF&o$4WHow9%TlGmbJ*ffqjvVS+#xz43&scpT`*JqQ~xPRL%IMM5R zYP_PBVuttU@4P3I&%ge4Yu~|1S6e$eI#vXLc87r?Auvp?U%LMLPxTM2`n9b`BNE>Q zNX)nVr^fB*qI&Rv!c-yV=BE?$0|EqCUd*1g;9ACl$Q9KJ5-tV;4aZ-%>YTQ`pQg#w z{F9CKYL@AjD%&errY?>RDyKQvnm<(7eEgegxs;E`NMlElgv636(QVNWZR>gVT{M3v zFWc3AH|f8==+d3sv*z`>u6O^o`=Pw7R;Ggg<;{X##o?Y=k`nguo8AU>cxC)%^A-~0 z>6!0-BkyeX%zwx0ng2e!+x>iR{{LD25?Y+0@7*+bY&n0ce_tE5NI)b&WAQ~<$K<93 zne9%O4<8Z;ya^BP(^j9aW!5~8zJFl;pPTU;B(z@`A8$|i`YVD%No!^lFV8AbE{i{o zF&lOlEWSCTJR#`PwD3it zr3L$rXA1=M94?qR=IrC-x_CrMFwoNwmXa)go)@p{X>8njqxgNT&M~eZkEGKLLFrX1 zrFyc|?b#u!vClp8S3F4;>f{RSZala^9Y|OWA-=4mAUeHRH@^bT>GV7dePtSMS zWn4^DQV|tp(sK_8SbcTT=GD@5`{jeLot$;YJo!5#!@9n{DK&pzb*D>+Etw^@CGOar zgUf@Qni!g!T9X1MbV$Xz^f`R0RQT!VaOI_>l**z>NwCAZioR`C|IhfBnfZl$#Ob6d z7Y}aal#!X8ps00Xk%++p&A0P?*Rk9@*t5!gEi2phyt@n;iy7lIC0qnNIC;1hacp&z z=jY*SYPfgr-kQdPS*9`^j|1B7XV(Arx^-Ii+bPyFuQd%U%&eLg&-`}$>ug2o*_Z9& zv|R;Q*1USxrodsTzc_65##OtmmmgT*w@@QvcaiMuIoSaQFHLXC$lA~IPB6IsR%3hG zX36b$>)6e5?zE&8fBNx7^R-4?qx?76H+&&C;NKm4w->{VH}CAWF|gL~ii zn7{2vWq9%C)v@1lKN#}%)~eTiI@G^<)9nXsy|X{;W4GJzruIhZcey_=?$-rumKE;o zQv7{)hUJIUiu3Z`zpL3;xeqT;5Dcsmv~1c?%r$X>wAW|dh6Ra%9VG<^U z;|@s)9bq=s&Wxp3y%GW@rS|mpF5JF-dm>Zw)(+*))85Okrt#!IJ(OW^AZ@dv3}1N4 zZ(Z)=JxSBP`-YWk?Y`WijGF{I3LY3uPcwfVEkNLMs0nYtgp|}0m*g98yDE5ZC@92Sq zmxdY*{)|zk#t{}4ecSU?wYt@tDHp4*SzU3St7mIl0PagdG;*r%-OSRD`Ht4JLHqOmR`+T7^0;uR(2-! z{z=o6=@s+ueLwK~Svf&xtEUmeu`;WMdUK z(C~2C^6ANhmJ4^X1Ge5jnj{dI_ac<@qUz=pDpMIG22A%_2^+Q!$t>& z&6_vR*b=4aDb($1x-^WrS#7bPuC6YJmr%~TC+h;6G@SAcofiu{dblErlZP*3%8v6h z7J47K`+dpYiky-qT8Ek(a@pCcfB)L3?c8f@$+E^HA|Tu){9w?!#gn$LzMS>2X!q(* zm9z6t=q=m4T6%Zc`-2y?Bn<2BSJ!P{@N`R*ZrRQ7DNyyy`P&aZ>aqO`X=0db^mX^KjRz7`9&QrrX058d+?A8A zW00{i;=;v?j7x($)q2^)oU^WP4Y25OaOrF3PL^fcD%F>*wSBU>|ASXoSAU$J+<5SU zlZJtsm_&$r3&-~S`+cU_zaoyPPC4~x|L^$`&!;ZYyIAbEGAQ(E^5(?HY9_PKvg+@D z`z%_kPJY(eXFai|#T!dMh}n6reD~A6{ejKD#as3#2W&9t6%i5H(l#kaTrlv@-i^l@ zZ<-%+5(xbFd?qLc18Zj#SR1}BJt*AKcaw{ixnsj(-m8+W8cs{EIf%HvFtyrZD!K7g zLQ-Of)|tnJkKh0MEnM+rqkq!*z27$~RD$Y>!h)Qp))kCzb8{smBu>2CwMZlB@UO2D za&pJcywT})H(eTL#k20^YiAW9M+=!g_7$_l4taQ6^RyjGJhMCY#k+UMetdn+(R%pB z+qXxjo>peCskv}^#Wi;!;iok|QJ3Sdd^($EY_)rrVd~s9H)?NeC=3ofoxL?`&CA!v zuLjm7_KZ{NCb?^>IO3e)bxjK#&p=Nb=g`&Q=T=jSBAa%aaf@oAR)Id=B)UyPCx zHtafKWM84%es0|(XX9I3y&Z9TYGW_He(~Z}QpAK;-)-+)IJo8E#+at2zy1H!el1_j#1&X?lD%?r6C@zk5Y~Rrs&gX1^18+9}6HQsOr(cpIECMPPQc z;*2W6JvB}2TeKDmhzRh?3VeMX+>|GHlJll<&xUNhzyB_66Xf#spEda|!;=FnDfdNG z=BvMd8(986(#CD~IfXZKR{gSaQ<0qXTgK(GLb;aGslR_(KX#}jUFV39!R1yBcTasAinGv>`oGBlEywe_L%ev4BJ z5_lzFykCD}lgreQv&x;-RbuucU94<}IUSGXD0kW}RG1~^G$AYS$h@zAH@w(VbKrE3 za;LYl1W(veE3Sv%e|iNsGu(eawL2{M&&CZRjn0d*QmsGboJu`fCL;1RZARYR_Id5| zkL_ANr)gWhL2^LA1*r>r|9ftE|GVVYhIyCnw4URyx05S7EhZB4eQIzfbJePEb|vrY zh0JaKl-zn7tEX{e%g1vS0Ri83Z)RhieeL~;9kLEvE+@Q?|8MblTgoDn@`DCD#P9x| z@AACeet!6L$K3d$3&%=c?_2a;x=f@e=*2C?ExCc4Jbn1Tbu!n316M&y-jkC%wC4= zmk%Zh=sqm7Dk%EGq<1qdf@cwzl;pl9_y4c-KZ46>Z=2#eiGCSd&T@@2Nmn|)Z8OU- zX)RxOHN#|sPDzyVD$}bH5?dm4G|!)`VQ!wJ;jply?!l1*4^AZ}Y^dlwf4u4X!+P)x zPc9u_k@} zeiQX*e6i`^6TQDq#r9LOx25s)YqGGqOqM$}k8y?B9p=KTWf~=KZ8|~~Q(s$8a%!4* zfk)-KP&aTMM&p&n!*|xUx-EUw_soF6po@ zmg?>b)p`ZTl@{IUKMbxq-d5Ds%usY(^z@#Dx6r!C^@pF8KHN5sQLJT!lZ~ADzjyoX z8*i821C4*!FSsr(wM%ZgtX|E>-pxDS6cj#RVdxh8aW1=#7Sg1xSBsu>GYNqGM3;PMUmi~|{=03){?GiTyX~(Y z@_4k^o$v9BiH9@mpYQwc%u&96UBurQJ@Hw-Y8+09whSqeZKvO^yYbC>j$g!?XNTVJ zza6_ZdCK}YS=apd!n-YRMfq+`ReE8by4CE@>$K|XyoFN=vbAUN{MwY;9=GUZZE);~h7<;LF%73e4v6Z!hA$xYC_%KhMl z8$XxKcP%zP5_(&_{@pE($|ohqo+|IV`NK-Yi!mu(zUA4A*K3@v^KD$q{P5+KPBE@t zu1CDq6&F?&E%M`U&G51?o73{d^Us~vRw25~0wouZ$6Wa8tk|cdlxoM%b58G#eiPH8 zeW`^i>lZX$+9Y}K<>k}%`K7g)dfCk~t9oB*PO2Ac`sem8!DWgtc)%}@PrNN~wbraeE|*rI*hR@`-DN!_W%-28Qw7*q3AEg3#>(H*mA z&t9Ez}ti4ssg0Dq;jOYDZ_T~4&kK3N)HFh%EoJ?+idt&p)2aC4l z3oN?FvvjBS@&yYL3-YfC9@)4+p<&9oHt*d!Zm&PN?D@T5)n5Kv`wmWdy|i}imT1GT zhtDsn{y+I6!-CA?%>^?5zfU>WY}okmvuEOImu1o450*WdxkoO%PtI@i`rEPr8Tw8c zHyIS9egtc@Yr6I+Me5(RHyd)QxLY>JC0m1b zKe3$uYiIZkL$0ms>>pO9`c&_o^4GOb;ms^&0}*~6t&q0@rBxnw{?neXHG6B3vT&t% z!8NxC10kM*=Sqw2oDT;zq8Gh7zCa-`vB^&V-j=?N0xqJ@KJNGk>Qm4EIom%mWk;b? z@o}}~9~Z{UBnNCbHnYb~tdZkruZo$ux%2YNYfqFtGoEx~MbM+YcXb2wOEMpOJeqoV z;*r+PH*;7^*-Lib6@9D4;lf;hZRN^6%-x%Gl9P%yW$or-y13!~jTasVPs`VSG#A~^ zU$8=Cu~nwdCA&D!w#)C zXQG#Xd=dXw_1m3ldAm;+?Va4y(_`h5 znDgnS!Hq>>5BJ{H{c-b2O=zjap7TqN)*j=D^|b%~bBlO?Z{LIJ^L5+PzAevsYp^5x z`@B8YM`Xccq34dfcpPd-`)Pmk{FyTj(^5@l7rma8y!m$VyHn=0*oB+Hb1$C-Vy6|de>fvKLSQ(hgIe&eG4-O_1&k9teF zV)_=CrpP$X(bIS#FWc4ceC-?Wqqg?>$DSDXtG0?a8!!GSc+&fQ_O6KsHP@S8JI!%> z?Z*v|FU?}QxFF$1p6lzs{c5?h-=5fP@cte@gTcLB{0EK~uVZd*O0_x8-_p3i_?~LO z!mSJ*?|!KLZklksJ#tN!{kk?A0pWh%+-SjB){~9WEN&@o=(zo{_t^1IS|M+5&fm|e z+@bnkN5qR+WLB%+G|Mv6HC@j=Z|r?jtE$8V9z0)_C7h?8_Iz0+$0DVhxu0hkL~J;9 zV4|?g)dwHe^F92qp6_aG#stNKzrGxnuUY@1G^5n2EO6q)JN57J06BR}g5p zn$>!J_n+;*Zr{F@urWeGYwCuZIUAzZTHX!w_vbf};$>=NIClKFAcu~<*Yee?xy8C! z84RqAn`hpPe77fcQhvgP2@=1w91}kL|1;bFVOHPW-62|{?{>Y;n<4DB?c4hM4Y#NF zbga2{AVK+o$D@@04?j3-Yi!t?`IF(|ojWpnYTslgZ=6>`7gi!vfgcfe?1^z=bdkRzSmyesAy+i zSN%;#euB`2v;7NJpK)|#;J7{6*?(u>-Kl@`W|Z4c5qVQQuR?KsuHe_SFE)Qne73*S zez8x5jaArPApMnw#os@|2Ji35zt_sRw^#mH^!I~xPb4k;_e{9-&_GR0Ul#wQz{ugq3_b=KhSF8*`E?3?b1H8-6WKC^mKU0=(g%Js@Z zC60pJ+)`BxbJ7#DC%pNtEF{t2{!wIA*^1ro8sF?>IBDPQVbIVaqxq{$Dd^L0KgYFA zGCWHw|EcvWO#55s@knI~_igo8*Bw61S=V{X&56(9cx_Kdk%f3FXGcfJs_U+O{;FCp zKWARurK`gdDC)_>yYKbA^5oOka!o7k`+WT#|2&<{!+C9G{ojB4MfUcY*8T+zXstN; z`~H6%l-rvt~sg9Ngom|wD{x9wCfddS;Zi^lNF{8&VLPt!d%Jwt+JhjQ3 z(%07e?^-L?&6+>onqA>@Ztkrunwc?MPG+=ROkuibb6j?Z&nHfvDksGiE~+A385J3- z);w)aihI6X>h^3rIMG|2v7zyx)}aFlo1W)feD0>#=s5pA|9tyh^{=L}>`t2g{EtON z^T*qIS6n~;ePqFcU3>L4Jzmt!93 z&*bhmhie-YnwxHFns{}bT`Mq4JU&?IU7?HC4c-}A`X=>^tISG+#BChwllKTOc(b!% zL$=b=+XX=RwdeJ{-y5Fa`@P`0 z^s1`aYvbhk`g|Wf4_8n4`s;^6(A}ubX=jrv^gn*O7x&;y#;sJHwBn!ugJW9+OjgS>2Wt*BdVb&C)zoBoal>8vq{GL2 zZxlRMD=8~o2pQPFe9hA*a&5)mt>F(g++JNKUvlH^k9(W%ADy+YE@$u0X+LTi7Ac?4 zerP8!wd+m!bQ2AZ1u2e>3@?6m=j+e=ex@hs&&vMid-|^ZmUsRBPo2@lx$WJ;_=KzT z{{_e0-dMu2G5dvhWOI|@zl(}7H9O?*{+{2{|EG69`-RyTKeEqveqAkp@WkWq3I%U{ zBAc2R687Y7oW1DD#^bv!cg58!%88vZ>zd(s@XHnRz1pAkmogj*o*ub`O?;vaZ_b-2Ze!OUIKIClg(p>)GidhJt~5 z70;YpTtb!}d%i59g*7cV_}a&ft9jHGEM{MPuCga$y|R+0j?_}q_gffwxP?O3PJF2S zIi&& zG3M~!)9aydCMn>{j)$|FpHxaVE#qujC)|`48dMN)a}%>ha)LoA%g0Cee=Gg-)cCTj z^|8a-9wjxUQ>^FXK&9k`6~*&nS-CHyXEi!5J^1osw+`D<)pjR|(sPT?UpbT{5W4ev zTrKPRy}!6VsBB1mZI*Ml%y?VQ-EE5&cimlR(3bYRFzZ;`!boZ6rYjTfEHvQJ`uDTL zX!X+r57y{6+^=fBadnvO}?VnFBWOcnF z^`q=gu=)4r?f?J0z4Om5F|+mmw7IFb`|jW0#VLPdSEqG^<~hZ*U4;*KPThak=b^>T z_ihDMBGUWnG&MCWKK-!$xUOR7r+&VNzk=o6Ri3n8x)XY#Os!9$Y@Wr0;sArdf;5q0 z`@dSx>V924x~}QFJ(q&imF)Z9GkxqnM@;O0oZ;m=y-z{xOIk_IhmSwbcP7uA-lvon zP%txjceTyW^!>b>jx*j2K2-d2!Q|F;)Bn0cCeGRzd7Q79J7?aK;{T|5cDn=Lo}LaF z&39#&OlEq>IPzFBY&^N?$L0+cd~w=~J6L_K%Qcivah^{Ahx(T8zG%jLIJ)o!TzyW>s4 z!%25rPxFZ%ZggSj^Yu&4f4^$V>Grf-$>~3TUgdmq-(teIa(DG*#(L!iIZAJHWo2fc z*m34!=gXe$Uq7!Fu3-rG&}3>py^o*6OMwgV3e z6ndN`>z4n0tDUJ|ej~SZqkX6qWSUR1PCRD6>#V=hxqxrfCpyuCM9f z*V&+|PgE!{`@z2d&J&`nBY0Ltt@^f4bf;|Y{j(qcpROyvwIM-A2`?Q|&tFxYrw*OxQ1ev>>Og{d^xZm-U)rF7j z^P^XsRk#xST3}1uxy{SEw?Fm{o_|E}2t&fI()gM$AA&k%`6WfpJls?LrY7>*Y6Bg= zo{6=^IwieAS5_S@X7u#peBdd^uC(y_f~@`7iHy7~b2Z-^9`HP9X*t2{#dM1%i6*v1 znFgoJUZ1iP+L_^{TyCIr>TSV6&@f)8{QC2!m7bhvxSx5-U#reP_||IFaG8S;8Ncf-foz3+fYc zYyQ04m8RUoSzqI0^77-sSG{!>d0&4${;%#;a!FVx@`tk6v>E)TO~c#Q&)?UuPED5W zw%GpI`kN0ArT3-(Gr08X>%;E+IY;mBD=xnDG`{9>&NYE|*Zt!U>`GI@%}QqT)lVc+4f6!ri#2dT{8Db!tC#VHcojBYOAid{&(eg@jbKi zxAl)X=Yz%#K)dpn+(|R*bUb+BOom^hYwmpoaI59{#N+QhZ`QT0aLIUAbt%<*d#qY-( zWdtZhUpHP9b7M)yb;DxLYfmRD&(KW1zOtyO{ZPe|7oKaf&5j)xeE#W=m4#X3!bs^| zvlb<;iD}yTEzOEsOsX02VbYXpsl=A17^2Ku(9MGD| zv3!BU#`n{l77Dl>U$?M0fwyT@#*bA}%+0-h%AJ#^Y8mX9C%GOazSy&zjd8xn4Pg_r;$N&nMsS zmZ>y*nSS$qTYU*f_WlwjRgDbmPd?{vKbH68`z*=!U5)jRkUQ7uy6>Cj{^@Cc-}(Rk z&tHvq&K+JhIexb8Zh5a&Yn?)lS#yg0F`vAyG~@2?507%s^(?!R`H~~)c_;IS{(Uny zt&1pkX2_`gKL7B)OW!3$)-bfXac=xQtwlUbU1fQD>&mO28BR*_Z{_^OsNf6QD%Sd5 zzlmwpHQkfzcdxs0lG)o`!24bC%HtWn)ixy>FMcf)aO;w5kI`#d)@dy+__S``DR8+V z9zJ2=I;S5_r~4n@*-@42H9;?J>cN)Kw%H$k{V=$5?n&9VcL$P|yYKay{HeZoMazO9 zN50kzORgTPx1YYydC9>mJ-4ea^`ACgWqM<0Rcw%kp}1AEpmq52|H@L$O)Hz;Z1X5> zNMv2~>DIj^$G)kF)lKi*a^R@Y$emT9~vk6$>s zJz}wx+D<*E%)WW6wOxd-LZA-_K5b4Qo1zG>f=&-S77A6J>qi~kOXZPh*>6gbS~qJ03oDCq2b-;yRK zW+~NmERtc%*(%pY2|>0;L^3xU-ehWCDmF<)W}iuu?d#u?5^Iupc+{%TJzE{|V10zJ zBIo?sCD*Q)85=}I$=LdA^}2d*dU*N4r&e5L@9T};K7F^a88nvv=Xr$3y3EIOKL*79 zDb4@>Z^~&QU;F`>D|1eGWh{U1c3Xk}`=4w~zfH#rNQ*Np9vfjm_L3<+}fuU*1^OQ zYhSLXbV?Gu5;|0EI$!0KHLLepXD-RnsoDPHn7^pJGLMTpU;GRS*OZ03@7!1;TF$Fe z7rb`)R^yec;|&%%C+M76enq9<(9BfQ;PvN4Yfnn-*V(9?cxKwUs~`XGZepAxvsd7L z-|IykYgb=C_Wty*ZFzIf8S1PMoLa!jyu&2F^}77u%09-QxyqrUA^m1 z4P?P{i~l;eF!~4P_m!KmFkJ6EqdcWnykGrqj!X^zGrni?Vm%%YUp$t4azB@=PPVY$ zd6s0`o5#=9zbd5c=Ue)uIpfBZE35`jD;`=+HhZ)EPw_de8z0L&vUWKepGG)s~rXNMgQs-RBG=iOF^Q zY-(-gE-)`juF}7mw&9-8-))boysJ-fJcyjHF84?{L~BLJ$>jMyQL<^%bF!1%ofraM z&zfWP zFW(Pexx>?b_@Glz;&Dzkw(dg<6t05Sik>bLKO-Vi!uyx$-$nCaz3F01jo#K*b$Pkk zmbn}L{UcnN`~K3~D_?S2F3J2g+FJcW;m=}c1HN~y+ulF>ky~|cKhOK0$*0*^l^yFZ zd8Ax_&HicK@+TV~{|c5r{$+nXR#)Pc@;)gSOdM~|`m@&Z?j(VvoIM|l+S1i`77Lh4 zw25|ftPs1AQQ}eu zb8Z(7+s@0kTzO@1d{5j`&s}*|r&&MEsgvI@fjMM#$j8FN*JU?Hq#CG}@~|wL%Q1bj zh1ATju+1l1_!hUeo@l(7aN^hR>22#Dz4&moD|h~@OSc8?T>ame|6tl&*Y%5C*B*Mi zcG;BE5@8Bj>vf~Ii`Lg&zjw|l$a%AV%jPal9wiyxcYi<5|I6y)s8KcBCNoZ5QeqA7 zHH6l>x*yga|A6;nS9=6T1lni;`Ym$*Iztb>UhxUNK+Go!QVTNU0cN) zGXer`n@hY`i|DCoYTD_+!zEVAlQUs~f?#Ohr7N7RUG>FEirCloGQAGWl!oq4ZaevM0E^db5EcNa3quhB}oWahZ~;sycBh;@FGRvcMkAF=c8 z?758zvseGJsxlXiU+h^g;24<}(U{R%`_MaHvr5))I`{K)bCV5Ux2SLV)4qKv$L6cE zlbD-*KW}!p(f+S-tAS*%YySD{_50_2D`I2IK74YrI)lRV0}p<@@PG%yvRhVM`$`if z@?#~QF+010mJIxGzu!|nJA2E51WnMA$`G5t_0|-WxYB9&&o(;qzmYpJC&{t+sbFwyi%S&LSbP zhIiwEgg>@1(+(^+nd5fht)q$%47MM%GM@QQ#dopiO*Spwt?N2nH5NXs zw63eoT#~eXz5PF_DZ!6J=7tg+*15V ziK+Q+Z0rH28>{cEvNVu*7Z>}*Dy3O-pPc1s@yw!~YrWRJ{;@-p-%=(cFRxE;vZ8@T zhtd_c+FJ(}T)EX)ps>Bb&E@QMW-kjr1A`eKD-SJDFl_>@zB<#Wf7rHU!;b4IY^>bX z^N%f15H!_Tx>0md=7d&-MUVPa!D;bprm@Lmsl!dGk3a4ZoN(xZ&Yz9x-p{k^j7+7iEF@n_2}txG@j)@RqeyYjr8Rex8?GqfFEDa(Ag(V-^Akm1giYpok}63^MS zcZj@AS#c%f!tHCVd3!n6$L>9GAVG4A#H`4cAiModjy}6>MR(U8z9Tcm*f=y^y?UZ) zQn~V?Q=BZ#JlsK(wAbC~d)ef~=*GHu;mIl2kE%90wmKcSC|P~&`qmj~lR2fAsHQ!alexVUCh zP~!QeUuP?B-Qq0xr24zW%^Pz}-*|`k-}+uF^{aP(^GxP=Jq?*-3lbXNUz8A0S;V$P zfOUnA^nwdtHb}UHn1C02tO{6vvgx()5rZdb7}Ft}}HE9bq_5;>pU zZL6A`63e1k*5^h&=H4>tJUV4MJimhMbIzE={djwF^^V%JZ9j7JUcX?ps=AbSTGxEd z(N69B&x|@7w@xz?Ys}(1t|%1Rcl~kW$qbz=S-s_xTh}ND@4LgK*rdQU}jkj`ItP?BKxI7D*Ey<>y5uII-ZfO(ORzu+xVJg!sW;qc%SLw22Oz=sbNZ5 z7cB)qJB34PO%@4N?QLw;P~3jG@$%)9i@k1_{8~~lPg~+ZcDQ~TPv)<~C*^s53%e~n z`%BFFjL#0^`X3T}F8PPIE_v;+E7!90FPHodA>$ddCcp9t@lHx?J+k4T>UMtj^f#K< zds{`5NH8$*xlI%^DAHHU{|%R5`>rS51zKaw!zC2xym#9Q7Y*OJ0pvG(nY{_5Pq||LnW08!g_Izx@B%)Y`l^InLZ_cJzg%<_A~w?b|u) zYo)=%P3pbOe#hT_Rbgcmc4zV5@rFZBC%ZJApQVKv)TVDp3pU=xGi^y;t8kwBI_tED zkNo%7=2%LEe_`;v3Z4==cy<*G2@|Biq%i8Z|5);!0U znmZZKE&UyQrqA@^cP`K!-7c*`vvyzD_x>`2-Pxo7KbE<(To(xK{podYI?L8B)0Ib) zn~t%xu4s0;&D)xhZYJpQK#a|0e*3- zcm7^~UHXE(LBrbHd2aRp8LX^81LoUQUdzqedhpfPgRj0mzH-KG{)B#GG`ax+@K)9d%9Kn$7%ahGV_i9SAA3ZWqs@7{iJihc8PIU z{1j(u))n)PYjj+Hz5Dg!$D;MTX$c$lBsDr_%wlk1ZeIRerXqc|<;vL!dk!zi{`fH= z0d%ic*q54}_2S(QsSC6Ace^SmEjsgD0qp;;x2|1mo_?oq3168@$N|swZq2!}Z?rtV zE*42_z5b=@%Ap3Cz4sb)Z*NO{eJ%IKrqbw>O^q*kwnZ|yxC^|yZ^58&tF$2FTH9jb z%RKyM8yplGwx6GS*mt(sQyGaVDxCTAt-}M@jaStz&-Hur`fc1l85a?0Go2Ly8q;K* zc^HECIefW)^);jx>z1Ge zmY3t}UrUuI9G@k9;eOJw=zRkBKDAzW^ksREO586AMugA)f_noiPG!2NZd(`Ey?tG5 zV!{Lsf3CnI*REzS6s)}E{dMJv4NXz4yWj1S*5CUj=_(7`_ME$I<#&JQz1jJF->Nm+ z9hV-tcQ5qD?cH4O0wmavt9|(M)G%VN-Mb#%L$AL+T5Fts;odd2?xReTPl~)Z(eME-mq8x2?qd84X@5 zTl|(cpMKkR`l(aJL(9l@7xb)ouC*=weYwV#H`eM`RmUmdy1HpSMABV3`PO1A?dPbf@X~we2*`N)@esA8raw;w^ zzPg|7I8*b+1&UM8U;3*lCehQ%WNho^U}A9Neo~@fCwL=p#|k|I(5Ax>XOl%j<=^gh ztoxRyQ6%%)^@@kcA`s`!&2nXT{@}wW&DRvXUl$v&`YJ=1oq+^5XWfs*^&ETe1(^3c zhEL|J|9$T4kL};@bXxDW-VrQh+7Q01__f)z?B#o_CY-N5D<;Mg#2gniq0v!GhPfHC zJJ-bpylM67lG(R*EsDJyWi274;$)(7udK~X5ZQsA&?dEvqkjG+O;=6-}}Bc zBjLlhx#bUT-~apnm7dCuknqWT@iz*M_if9zzGf=DGg;{B#`pa3r{Bi7E^P3M{2!lk zVtMzY%-O<+_0Dg)-p#rvCsFcpqU7W_`*qfLHLrKGvb`;0xy*fC^tRQ5T%!aF0l(k* zN-CjGOlLHL_r^oQr$b8i_F4f!!K)g*D~@dIlY>nC`|N)6f&C8$JChEdDU0J$r^)L$ zW!;Q_`RM9!Tx^PnP&6zlI4S$~(3aJ)j+gC2$ z1aC&!mUH)7K>yK%*{uKfq_fwRr1JRB-_2C6aYlAa+ng^fhB6v≶F(Mc%M7e#-se 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�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 z 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%0AGGCsO_=gwld5?Vk1OYiL@s+OZ4O?;dR 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 OAik%opUXO@geCwv9GcDm literal 0 HcmV?d00001 diff --git a/src/library/SensirionSHT4x/images/Arduino-Micro-i2c-pinout-3.3V.png b/src/library/SensirionSHT4x/images/Arduino-Micro-i2c-pinout-3.3V.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9ba6cbd79ea77ae9856ab2c95a0a2f3f3822b3 GIT binary patch literal 329645 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 z

%_MK={ZNE`Lplr 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