Reduce nRF52 infrastructure flash usage without trimming sensors

Keep Companion and Terminal Chat profiles unchanged; retain full-sensor and reduced-sensor OTA builds. Add compact crypto and OTA names, qualified display asset compression, font license packaging, and scope regression tests.
This commit is contained in:
mikecarper committed 2026-10-02 15:52:23 -07:00
1 parent 010374d7db
commit 8a69e73226
44 files changed
+11150 -14

No files matched your search

+18
View File
@@ -0,0 +1,18 @@
/* Keep the exact P-256 domain used by Bluefruit Secure Connections. The
* pinned CC310 archive's generic getter otherwise retains every legacy EC
* curve table. MeshCore identity signatures use Edwards25519 via a different
* API and are unaffected. Build-local linker wrapping is qualified by the
* SDK archive hash in scripts/nrf52_flash_trim.py, never by MCU name alone.
*/
#if defined(MESH_NRF52_FLASH_TRIM) && MESH_NRF52_FLASH_TRIM
#include <stddef.h>
#include "crys_ecpki_domain.h"
extern const CRYS_ECPKI_Domain_t *SaSi_ECPKI_GetSecp256r1DomainP(void);
const CRYS_ECPKI_Domain_t *__wrap_CRYS_ECPKI_GetEcDomain(
CRYS_ECPKI_DomainID_t domain_id) {
if (domain_id != CRYS_ECPKI_DomainID_secp256r1) return NULL;
return SaSi_ECPKI_GetSecp256r1DomainP();
}
#endif
+10
View File
@@ -242,7 +242,12 @@ bool handle_ota_command(const char* command, char* reply, mesh::MainBoard& board
state_word(fs), have, tot, pct, midhx, age);
}
const char* hw = (c.hw_id[0]) ? c.hw_id : "?";
#if OTA_TARGET_NAME_TABLE && OTA_TARGET_NAME_FRONT_CODED
char target_name[OTA_TARGET_ENV_NAME_CAPACITY];
const char* tenv = ota_target_env_name(c.manager.target(), target_name, sizeof target_name);
#else
const char* tenv = ota_target_env_name(c.manager.target()); // env name, or "?" if not in the table
#endif
#if defined(NRF52_PLATFORM)
// nRF52 applies via the bootloader - show (cached) whether it can, so `ota get`/`install` won't surprise.
// blrc = the bootloader's last apply code (diagnostic; 0xB8=success, see ota_delta.c).
@@ -390,7 +395,12 @@ bool handle_ota_command(const char* command, char* reply, mesh::MainBoard& board
// and flag the explicit legacy rescue path when an app-only internal-flash nRF52 has no valid EndF.
char hwbuf[16];
const char* fit;
#if OTA_TARGET_NAME_TABLE && OTA_TARGET_NAME_FRONT_CODED
char target_name[OTA_TARGET_ENV_NAME_CAPACITY];
const char* env = ota_target_env_name(h->target_id, target_name, sizeof target_name);
#else
const char* env = ota_target_env_name(h->target_id);
#endif
const bool boot_package = (h->flags & MFLAG_BOOTLOADER) != 0;
if (boot_package) {
bool installable = false;
+424 -2
View File
@@ -1,5 +1,6 @@
#pragma once
#include <stdint.h>
#include <stddef.h>
// AUTO-GENERATED by tools/mota/gen_targets.py - do not edit by hand.
// 634 OTA-capable build targets. Maps target_id (= sha2-256:4 of the target name, LE uint32)
@@ -8,12 +9,428 @@
// Size-constrained receivers can set OTA_TARGET_NAME_TABLE=0. They still match targets by ID;
// OTA_LOCAL_TARGET_ID + OTA_LOCAL_TARGET_NAME optionally retain the local human-readable name.
namespace mesh { namespace ota {
#ifndef OTA_TARGET_NAME_TABLE
#define OTA_TARGET_NAME_TABLE 1
#endif
#ifndef OTA_TARGET_NAME_FRONT_CODED
#define OTA_TARGET_NAME_FRONT_CODED 0
#endif
#if OTA_TARGET_NAME_TABLE && OTA_TARGET_NAME_FRONT_CODED
#include "tinf/tinf.h"
#endif
namespace mesh { namespace ota {
#if OTA_TARGET_NAME_TABLE && OTA_TARGET_NAME_FRONT_CODED
// All names retained. Front coding + Google Zopfli (1,000 iterations), raw DEFLATE.
// Reuses the existing OTA tinf decoder; local chunk/caller buffers, never the live OTA context.
// This is firmware-only storage compression: target IDs and the LoRa protocol are unchanged.
enum { OTA_TARGET_ENV_NAME_CAPACITY = 68 };
inline const char* ota_target_env_name(uint32_t target_id, char* buffer, size_t capacity) {
if (!buffer || !capacity) return nullptr;
buffer[0] = 0;
static const uint32_t IDS[] = {
0x149bcb23, 0x30d4e442, 0x263a8d80, 0x9070ae2c, 0xf190d834, 0x32890982, 0xacb599d5, 0x82d3b273,
0xe96a6af8, 0x180bbe1f, 0xf9986af5, 0x98519a1d, 0x06b71719, 0x6384719d, 0x4c0461c8, 0x4fa88992,
0xcd6604d0, 0xc54ea258, 0x217958b4, 0x03d9704a, 0x8456f753, 0xc8104197, 0xf5eb61ec, 0x70d2d590,
0xd5e04824, 0xa416bb20, 0x875f3744, 0xdaf349be, 0x93b93199, 0x710abb59, 0x5293da13, 0xc6dd7723,
0xf2eec98c, 0x48a986f1, 0xd2cf978c, 0x53626334, 0xefe4f19f, 0xfcaf3730, 0xd90deef7, 0x2d2a4089,
0x89ea5c4e, 0xc0eb712a, 0x67293f43, 0x3f364910, 0xac4b4eb5, 0x822e96ca, 0xe077fb8d, 0x2bbe7fd8,
0x9e40157c, 0xb12e6e01, 0xf6f835ec, 0x7fab017f, 0x9e23928a, 0xf310a4d1, 0xdd5953ec, 0x97574bc2,
0x2d918a3c, 0xd1755faa, 0x8a6ceaf0, 0x57f69746, 0xbc05d6a7, 0x5bad80f1, 0xb4f727a8, 0x112d34c4,
0xf10a26df, 0xc5409ced, 0xf9022545, 0x2023036d, 0x4abd24af, 0x35d42b35, 0x9f736ca7, 0x3fbb1498,
0x42b0818c, 0x80dc72a9, 0xafeed10c, 0x98411ac6, 0xa14d9f4a, 0x6494fda0, 0x32bcdd14, 0xfe937f14,
0x5b9b1933, 0x1b4399de, 0xf7e47568, 0xb1153422, 0x388f2804, 0x075ca3f9, 0x2f9f8e7d, 0xc9dc5d8c,
0x34b0e5f3, 0xb4d0ad97, 0xcfa0e233, 0x17d5e1ff, 0xc99313c6, 0xffb3854f, 0x21a73973, 0x3067f656,
0xfdb25057, 0x836e5931, 0x0f1767cd, 0x57172fcc, 0xa529b4f5, 0x85a8c944, 0x3c60586d, 0x0a9dbbf0,
0xb519a89f, 0xa3e8d8ce, 0xb16009a0, 0xdc780e80, 0x28b8007c, 0x4aa63180, 0x6fddcbf1, 0xf4fb5484,
0x2e5384e2, 0xb62a1e75, 0x9e64845d, 0x19232e8b, 0xfaf164f4, 0x38b948b4, 0x462ddb9b, 0xed21ca4f,
0x9f5f39a7, 0x081d2219, 0x7c498bc4, 0xc283ad60, 0x4fbdc1e1, 0xc797fd73, 0xab9871c8, 0x2075687c,
0x5d726067, 0x9969bbc9, 0x804f7a3a, 0x0823a21a, 0x22f900de, 0xaca0e153, 0x516c9c13, 0xcb1c2e65,
0xd1b29b18, 0x644bb68d, 0xd19a9759, 0xde40f56f, 0x6dc15ab3, 0xc59d294e, 0xceeddfaf, 0x21519537,
0x382bb181, 0xad1bcd63, 0x5a2980e6, 0x90581c83, 0x90a6a854, 0x356df17c, 0x99a084fc, 0x64c9dfc9,
0x2a2ffc92, 0x2c13b8e9, 0x1ee7d867, 0xb016979a, 0xb49b6b55, 0x01d8f124, 0x86fb85f0, 0xd33b0986,
0x1a4d0096, 0xa8f5940f, 0x1cf5e14c, 0x2707d3d1, 0x86ac3b1b, 0x7af848da, 0xd522a14f, 0x76657d76,
0x21ee03bd, 0x5977d941, 0xe2a1907b, 0xbb0ca8db, 0xf75feb3e, 0xb0a1e71f, 0xbc9cdc70, 0x19e31fc6,
0xa01b330e, 0x36c78d86, 0xdf722326, 0xfa901c87, 0xeebe3469, 0xb0f5aff6, 0x5729ad07, 0xaa2aef42,
0xb4cb035a, 0xbb429dde, 0x883e3edc, 0x4a9d1c6c, 0xa0965a6b, 0x59ea25fa, 0x1758bdb9, 0x1313f16d,
0x0372b0f1, 0xa2fb4192, 0xdd39457b, 0x7964461c, 0x1d1c0d92, 0x5fc52bcb, 0x0dacb683, 0xe792a051,
0x2d5ea842, 0x30c59b1d, 0xab74db9e, 0xeed78ce4, 0x7778b7e1, 0x0b6847ed, 0xab3e1ad3, 0x04a8b763,
0xc456437e, 0xb3ecafca, 0xf3afcde6, 0x87513d56, 0xca812b41, 0x18594231, 0x188f3ac1, 0x402055ec,
0x12393f1f, 0x16fbab07, 0xed3ef5b8, 0x8ea86381, 0x09f57289, 0x148aeaab, 0x6e9f7fec, 0x6a25d024,
0xc5a2cb41, 0xc4a11710, 0x753947a4, 0xe6fa98b4, 0xf8c27cf4, 0x90e227d9, 0x812f5e52, 0x61f961c5,
0x1ddd15c8, 0x49d67d0d, 0xbc003322, 0x835b70c0, 0xd7460575, 0x36acced5, 0x33e2c171, 0x5be91148,
0xa165ae99, 0x04c5c2b7, 0x6c1ca659, 0xa295fb04, 0x61c405ca, 0xe893fe91, 0x2b599d31, 0xf1442d25,
0x15082ede, 0x6ff350d1, 0xe03d0cd9, 0x82e1eb2c, 0x0ee19b12, 0x6c67ed89, 0xd1c05d0d, 0xb90150b0,
0x7285bdb3, 0x77cadc99, 0xc177e6cd, 0xf7a38993, 0x83762f33, 0x86cadda9, 0x7e49da49, 0x305d6f92,
0xbc6b870b, 0x78845fdd, 0x6d35f434, 0xa52d76a8, 0xd8de9639, 0x8ab5c51b, 0x80097676, 0xffe70df5,
0x3da80417, 0x47ca3c13, 0x28b499c7, 0xf1ab4c28, 0xe5331f02, 0xfba7177b, 0xde7dc472, 0x3625bb80,
0x69df7765, 0xe9fbc9be, 0x40818863, 0x65deac33, 0xd86cf67a, 0xed73ac03, 0xab0d550a, 0x1bd2a266,
0x3655c748, 0x9a5ae8fc, 0x1e9eb97a, 0x139536f4, 0x0716c724, 0x8de23fa7, 0xb92ec96b, 0x420ebc63,
0x967ccaee, 0x8021afa2, 0x5f7c7688, 0xbd04e6e7, 0x1aeac884, 0x07849209, 0x0c79b100, 0xbfb60e7c,
0x8a63de3a, 0x96036a68, 0xb76a745c, 0x43023193, 0xa7d97db7, 0x468a133e, 0xb59ea2ed, 0xbe372c6d,
0x6215e9eb, 0x07907102, 0x3898ea56, 0x2fb7e218, 0x8c61d4c8, 0x4f722e70, 0x694eed25, 0x85b8b9d7,
0xe8421e36, 0x82eaaf9e, 0x9f9caba4, 0xe4a2de74, 0x582c7826, 0xaeb637f1, 0x86813271, 0x67b2ff84,
0xd0e2e616, 0x3f9edfe3, 0xc23f8082, 0x0e74ae16, 0x8f256e56, 0xf1407f39, 0xe90a3181, 0x3b1b4237,
0x21c6d08d, 0x34302c14, 0x268d6fc1, 0xeabe3b40, 0x3c172d27, 0xf7c5d584, 0x81960cc0, 0x504020ea,
0x9d8b60ae, 0xa2ce002f, 0xba4f47f3, 0x6f16479e, 0x1018e5d1, 0xc0ab5040, 0xa2bf90bd, 0xe6bff8f9,
0xb9cd26cb, 0x9bc34bd5, 0x144504b0, 0xdbfe2675, 0xb00241d0, 0x88e77fee, 0xae2d9caa, 0xa0043e00,
0x26bbf4ed, 0xdcc0f158, 0xe3320463, 0x852b928a, 0x0ec870e9, 0x8f00c1f2, 0xcea95e20, 0xd45277ff,
0x2cad9a9d, 0x02a4a8c1, 0x4a709348, 0x35d960bd, 0x62977023, 0x17a7ed8c, 0x07f5f5b5, 0xfd0d4b8f,
0xf5afb7dd, 0x6ebf28cb, 0x2d589527, 0x77d0810c, 0x11b131e7, 0x54850763, 0x0fa61805, 0x8039574f,
0xa65555d6, 0x22b1804c, 0xa9f631b1, 0x49d11eca, 0xd41f0638, 0xe3105eb8, 0xf8259880, 0x063f1f00,
0x70d71f92, 0xa8a79da5, 0xc0d3815b, 0x966ac88e, 0x104b3f8b, 0x23b49348, 0xc42cc90d, 0xc24791c3,
0x15e11067, 0x2dbb2669, 0x90799c32, 0x881a6a48, 0xf26af51c, 0x8174cbdc, 0x0bf0f061, 0x2509dd80,
0x56293b24, 0x8c81078c, 0xbd6a1c97, 0xf4d98c12, 0xccac4283, 0xa68c09e9, 0x5f606274, 0x84923735,
0x2c0b8b05, 0xdba69401, 0xcb6555ee, 0xd60daf25, 0x410bd800, 0x9aca380e, 0xd8641710, 0x4d0b1601,
0xab2ac09e, 0xa17fc4f7, 0xe4b2bd22, 0x90c4eb3f, 0x19d9ce91, 0x121cc72f, 0xfa8510fa, 0xd34d8461,
0x98077550, 0x11628e29, 0x2ed959aa, 0xf1e7cadb, 0xced7e127, 0x6925aaf0, 0x2fa509c1, 0xa52ba3c8,
0xaf0b81dd, 0x9f4d58ac, 0x7a55dec3, 0x5e69738a, 0x48d3b5d4, 0x14e6965d, 0x76f3c984, 0x41e33a97,
0x29a0da19, 0x29bc38dc, 0x05f5ffae, 0xc62da371, 0xf1d3c5a8, 0xc6d55752, 0x60683191, 0x8a7cb79b,
0x4fa4ae55, 0xd1d61a8b, 0x9cb0b232, 0x51fa1a49, 0xdb73638b, 0xd904c2d5, 0x3a14aac7, 0x620569f4,
0x08483f6b, 0x0db48f35, 0x20532f6c, 0x293ced32, 0xb38ebf22, 0x7c89c73d, 0x2d7c11e8, 0x61b32037,
0xad1cd53d, 0x0e18b360, 0x3caf966e, 0xcb59ea4e, 0xe3a28284, 0x05747eb6, 0x75587f24, 0xf2128c81,
0x1b34e7b4, 0x8e549407, 0x6ca142f4, 0x1deac038, 0x2a2f303b, 0x0ba4453d, 0xf8d1958f, 0x75e85141,
0xd62ed92e, 0x7abaf0d5, 0x87edc08b, 0x3c49caf8, 0x58689ef9, 0x91878dd8, 0x72a93c45, 0x4dbf035e,
0xff4102d6, 0x2f9a9185, 0x000fc519, 0x7b071fa0, 0x3e55e34d, 0x54606a4f, 0x16482630, 0xce0f07ad,
0x01c43d49, 0x51fe3801, 0x857149e5, 0xd9d64938, 0xcb7da3f5, 0x9952fbe3, 0x3729cd74, 0xdc27c37c,
0x9b9f8775, 0xb27514a3, 0xe9ce038c, 0xe295a7a4, 0x189660b3, 0x99907475, 0x2082078d, 0x24a94c81,
0x3750e80d, 0xe4b49973, 0xe1372b52, 0x5a79bac1, 0x6f339514, 0x8eaa289e, 0x70e91bd9, 0x5a7e9c2d,
0x1211b151, 0x0a32044b, 0xa13fe853, 0x79b9ff01, 0xc3decea2, 0x3c012018, 0x6afd6f75, 0x7517d400,
0xd7598668, 0x61bdb52a, 0x413287d8, 0xe8cd2377, 0x3309bdaf, 0x7330afbb, 0x9df48ce6, 0xa5cb783a,
0x4b9f8283, 0x311846c9, 0x8b6b29b7, 0x37928233, 0x88ac45da, 0x087f99c0, 0xdf41affe, 0x2afe6c63,
0xf2d61a1c, 0x14b1b097, 0xec334f3f, 0x1da30414, 0xae8fe1c9, 0x67acd73f, 0xfb118ed8, 0xe4213729,
0x1298038d, 0x2c47acff, 0x7d641646, 0x51efdbfe, 0xf2aada5b, 0xe59c9373, 0x236f605c, 0x93994fed,
0x66c47cfd, 0x48061a01, 0x7ed7137d, 0xa01688a7, 0xa5f4a562, 0xef83222b, 0xc36ec867, 0xb932238e,
0x92f5bbea, 0x26d91ab2, 0x708ac4dc, 0xdc51bf13, 0xc27f8304, 0x7190df40, 0x609d50b3, 0x5718c7ea,
0x37443a5b, 0x603384a7, 0xce3ef40f, 0x475a2a6a, 0xf4175d2c, 0x3d831006, 0x556eb1bc, 0xb67370b3,
0x0c689b90, 0x91eac424, 0x7a84a8c4, 0x67843a5f, 0x0e83fd51, 0xfad357ab, 0x16af5c67, 0x8c105104,
0xa80042a0, 0x4bff0748, 0x77c8f2b5, 0x71ee0e15, 0x8824cd0c, 0xe5439198, 0xe90a6e74, 0x833e5cdc,
0x93145fbb, 0x8d3dd6d5, 0x33a154ff, 0x6658b418, 0x0cfb9c00, 0x964f4f5c, 0x0a5dc760, 0xd08496ce,
0x293ac2c8, 0x60ebfa87, 0x60f5fdc2, 0xe8f79d22, 0xb97bbb15, 0xd466590c, 0x9f27be15, 0x396fecc7,
0xf94e3407, 0xe1930103, 0xa4740508, 0x9f19bcd1, 0xfcebff61, 0xac5c1405, 0xccb734e2, 0x634ff632,
0xf967a300, 0xa0cc1c36,
};
static const uint16_t OFFSETS[] = {
0, 232, 452, 649, 874, 1085, 1312, 1549, 1773, 1968, 2187, 2428,
2687, 2908, 3130, 3377, 3609, 3823, 4039, 4264, 4347,
};
static const uint16_t RAW_LENGTHS[] = {
511, 505, 509, 512, 502, 500, 512, 510, 505, 489, 507, 507,
490, 502, 507, 511, 509, 510, 498, 102,
};
static const uint16_t FIRSTS[] = {
0, 28, 65, 94, 122, 156, 192, 226, 261, 293, 329, 361,
394, 425, 453, 484, 517, 552, 591, 628, 634,
};
// 4347 encoded bytes; 20 independent chunks, at most 512 decoded bytes.
static const uint8_t NAMES[] = {
0x8d, 0x90, 0x03, 0x6f, 0x40, 0x41, 0x0c, 0xc7, 0xbb, 0x60, 0xb6, 0x1d, 0xcc, 0x36, 0xe2, 0xd9,
0x66, 0xdc, 0x1c, 0x9a, 0x3c, 0xf7, 0xa5, 0x77, 0xd3, 0xa7, 0x9f, 0xed, 0xe8, 0xd8, 0x3f, 0x7e,
0xb0, 0xaa, 0x6f, 0x3c, 0xe1, 0x2a, 0x1f, 0xa9, 0x91, 0xe3, 0x29, 0x34, 0x9c, 0xe6, 0x2a, 0x0b,
0x39, 0x43, 0x51, 0x36, 0x64, 0xd4, 0x09, 0x41, 0xe7, 0x85, 0xd3, 0x50, 0x19, 0x87, 0xce, 0x61,
0xca, 0x96, 0x52, 0xa8, 0x3c, 0xa2, 0x9c, 0x94, 0x27, 0x81, 0x4a, 0x61, 0x4e, 0xd1, 0x91, 0x5c,
0x3e, 0x1c, 0x3c, 0x49, 0x1a, 0x66, 0x2a, 0x41, 0x13, 0x28, 0x0f, 0xb0, 0xbe, 0x78, 0x32, 0x33,
0x3b, 0x89, 0x53, 0xe3, 0xc7, 0xb8, 0x4b, 0x2e, 0xc0, 0xed, 0xd0, 0x7f, 0xab, 0xdf, 0xfd, 0xa0,
0x5f, 0xff, 0x4e, 0xbf, 0x5e, 0x9e, 0xf5, 0x31, 0x61, 0x51, 0xc8, 0x5e, 0x61, 0xc6, 0x48, 0xd7,
0x9e, 0xe4, 0x41, 0xdd, 0x51, 0xe6, 0x58, 0x1c, 0x34, 0xbc, 0xf3, 0x2e, 0x7a, 0x74, 0x58, 0x3d,
0x5b, 0xc2, 0x03, 0x61, 0xfc, 0x4e, 0x0b, 0xda, 0xff, 0xaf, 0x56, 0x7e, 0x22, 0xca, 0xc4, 0x24,
0x8f, 0x62, 0xdf, 0x45, 0xee, 0x7f, 0x88, 0xdc, 0xfc, 0xce, 0xa6, 0xf9, 0x7f, 0x91, 0x5b, 0xde,
0x9b, 0x9c, 0x2b, 0x6f, 0x82, 0x89, 0x6f, 0x99, 0x7f, 0xc0, 0x51, 0x40, 0x19, 0x49, 0x68, 0x70,
0x75, 0x72, 0xf2, 0x7d, 0xb3, 0x72, 0x77, 0x3d, 0x31, 0x79, 0xcf, 0xf7, 0xb5, 0x60, 0xcd, 0xfc,
0xdb, 0xbe, 0xe4, 0xf8, 0x60, 0x6f, 0xff, 0xfc, 0x51, 0xfa, 0x59, 0xf5, 0x21, 0x71, 0xd5, 0xd3,
0xbb, 0x40, 0xf5, 0x63, 0x8e, 0x4b, 0x81, 0x3b, 0x94, 0x51, 0xb5, 0x56, 0x05, 0x41, 0x0c, 0x1d,
0x1a, 0x74, 0xa8, 0x70, 0xff, 0x04, 0xdc, 0x5a, 0xdc, 0x5d, 0xca, 0xac, 0xe5, 0xb1, 0x39, 0x6f,
0xec, 0x24, 0xb3, 0xec, 0xe7, 0xe3, 0xee, 0x54, 0xa3, 0xb9, 0xaa, 0x36, 0xd1, 0x21, 0x53, 0x0e,
0xeb, 0xa7, 0x47, 0x07, 0x87, 0x97, 0x10, 0x91, 0x2d, 0xb9, 0xd4, 0x40, 0x5e, 0xa6, 0x51, 0xb5,
0xac, 0x1f, 0x9d, 0xac, 0xc2, 0x1e, 0xb9, 0x66, 0xc3, 0xf8, 0x1a, 0x96, 0xa7, 0xa6, 0x80, 0x31,
0x60, 0x1a, 0x91, 0x95, 0xda, 0x42, 0x13, 0x31, 0x87, 0x3c, 0x2e, 0xcc, 0x40, 0xee, 0x6d, 0x48,
0x1d, 0x79, 0x07, 0x9c, 0x16, 0xe4, 0x21, 0x33, 0xa8, 0x26, 0x20, 0x88, 0x1a, 0xad, 0x24, 0x53,
0xba, 0x49, 0x22, 0x60, 0x7d, 0x81, 0x56, 0xe9, 0x17, 0x80, 0x5e, 0xc8, 0x98, 0x8a, 0x2b, 0x04,
0x94, 0xe0, 0x7c, 0xad, 0xb4, 0xa0, 0x13, 0xcf, 0xaa, 0x6d, 0x7d, 0x66, 0x7a, 0xf6, 0x2b, 0xc4,
0xff, 0x80, 0x75, 0x7b, 0x6f, 0x41, 0x90, 0xaf, 0xef, 0xde, 0x3a, 0x96, 0xa7, 0x5e, 0xe1, 0x1e,
0x80, 0xfa, 0xef, 0x81, 0x86, 0x1e, 0xb6, 0xff, 0x87, 0x6b, 0xb3, 0x28, 0x25, 0x88, 0x37, 0x29,
0xbf, 0x49, 0xa3, 0x7c, 0x4c, 0x83, 0xf3, 0xd9, 0x99, 0xaf, 0xb5, 0x37, 0x2a, 0x63, 0x1e, 0x1d,
0x8c, 0xd6, 0xd4, 0xa0, 0xff, 0x13, 0xbf, 0x04, 0xa4, 0xdf, 0x97, 0xa4, 0x6b, 0x8a, 0xa5, 0xaf,
0x22, 0x14, 0x24, 0xc1, 0xa4, 0xb7, 0xab, 0xc4, 0x6a, 0xbd, 0x0e, 0xd8, 0x7a, 0x1d, 0x90, 0xf5,
0x3a, 0x60, 0xeb, 0x01, 0x4c, 0x4e, 0xc5, 0x95, 0xc3, 0x40, 0x0c, 0x55, 0x01, 0x2e, 0xc1, 0x7b,
0xf3, 0x7d, 0x99, 0x3a, 0x48, 0x17, 0xff, 0x0d, 0xc8, 0x31, 0x8e, 0xe6, 0x49, 0x13, 0xaa, 0x3e,
0x4c, 0x37, 0xe9, 0x33, 0x75, 0x3c, 0x15, 0x0e, 0xd0, 0xf0, 0xf9, 0x81, 0x4d, 0x5f, 0x3a, 0x59,
0x15, 0xc4, 0xde, 0xf2, 0xe4, 0x76, 0x50, 0xce, 0xec, 0x0a, 0x2b, 0x35, 0xf0, 0xda, 0xc7, 0x25,
0x83, 0x2d, 0x27, 0xd9, 0xd0, 0x8b, 0xc8, 0x0c, 0x63, 0x5d, 0xb3, 0x52, 0x6d, 0x9c, 0x4c, 0x94,
0x68, 0x71, 0x49, 0x2a, 0x6f, 0xff, 0x3f, 0x08, 0x32, 0x67, 0x97, 0x7a, 0x49, 0x50, 0x17, 0x7b,
0x81, 0x9f, 0x18, 0x2d, 0xcf, 0xd2, 0xb6, 0xd4, 0x24, 0xaa, 0x57, 0xe6, 0x9f, 0xde, 0x6a, 0xec,
0xcd, 0x30, 0x4b, 0xe4, 0x99, 0xaa, 0x5b, 0xe7, 0xad, 0x51, 0xed, 0xe3, 0xb8, 0x6c, 0x12, 0x75,
0x90, 0xe2, 0x90, 0x04, 0xbc, 0x2d, 0xac, 0xc9, 0x4d, 0xb8, 0x14, 0x1b, 0x1d, 0x26, 0x8a, 0x57,
0x96, 0x17, 0xc9, 0xad, 0x3c, 0x50, 0xb7, 0x72, 0x18, 0x1a, 0x9a, 0x60, 0x73, 0x23, 0xd8, 0x65,
0x44, 0xb8, 0x87, 0x0c, 0x2b, 0x79, 0xd0, 0x02, 0x17, 0xab, 0xf5, 0x3a, 0x20, 0xeb, 0x65, 0x10,
0xc1, 0x8e, 0x6a, 0xa9, 0x2a, 0x3e, 0x4b, 0x51, 0xe2, 0x84, 0x3d, 0xc4, 0xd0, 0xd2, 0x00, 0x6b,
0x24, 0x40, 0xc2, 0x9e, 0x41, 0x01, 0xcc, 0x06, 0x00, 0x62, 0xf0, 0x00, 0x34, 0x46, 0xd5, 0xe8,
0x0d, 0xc5, 0x30, 0x58, 0x53, 0x99, 0x99, 0x69, 0x2b, 0xc3, 0xd6, 0x7b, 0x74, 0xd7, 0x67, 0xd0,
0x6b, 0xfc, 0xc0, 0x8a, 0x21, 0x70, 0xfb, 0x30, 0xf3, 0x64, 0x8b, 0x7f, 0xa0, 0x3c, 0x92, 0xc2,
0xbf, 0xef, 0xdf, 0x2f, 0xcc, 0x4c, 0x08, 0x58, 0xb0, 0xa6, 0x02, 0x76, 0x3c, 0x95, 0x49, 0x44,
0xf2, 0x08, 0xa7, 0xd2, 0x1b, 0xfd, 0x4f, 0x48, 0xa1, 0x6c, 0xb9, 0xd6, 0x8a, 0x59, 0x06, 0xf2,
0xd5, 0x56, 0xa9, 0x70, 0x31, 0xc2, 0x2e, 0x73, 0x81, 0xbd, 0x04, 0x5c, 0x8c, 0xd7, 0xd6, 0xe3,
0x37, 0x0e, 0x16, 0xe5, 0xec, 0x05, 0x72, 0x14, 0x68, 0x19, 0xa9, 0xde, 0xca, 0x58, 0x91, 0x63,
0x20, 0x1b, 0xd8, 0x07, 0xd8, 0xe0, 0x1a, 0x79, 0xac, 0xfe, 0x0c, 0xda, 0xe1, 0x62, 0xf1, 0xc0,
0x41, 0xd0, 0x4a, 0x78, 0xbd, 0xe2, 0x7a, 0x28, 0x75, 0x69, 0x46, 0x2f, 0x54, 0xd6, 0x3e, 0xf4,
0x8d, 0x23, 0xc8, 0xc6, 0x41, 0x9f, 0x0e, 0x08, 0x4d, 0x56, 0x0e, 0x7e, 0x50, 0x71, 0x51, 0x16,
0xd6, 0xb0, 0x45, 0x2f, 0xb4, 0x61, 0x94, 0x39, 0x61, 0x42, 0x05, 0x27, 0x09, 0xbc, 0x58, 0x78,
0x4a, 0x2a, 0x79, 0xde, 0x89, 0x5b, 0xff, 0x4a, 0x90, 0xa3, 0xa5, 0x9a, 0x49, 0x4c, 0x3f, 0x7e,
0xb5, 0x70, 0x34, 0x22, 0xf6, 0xd1, 0x80, 0xf4, 0x15, 0x8e, 0x89, 0x0d, 0xd7, 0xe3, 0x00, 0x8e,
0x87, 0xd0, 0xe0, 0x76, 0x02, 0xdc, 0x51, 0x97, 0x2b, 0x1c, 0x45, 0xf2, 0x85, 0x69, 0x93, 0x57,
0x25, 0x11, 0xa1, 0x6f, 0x70, 0x75, 0x26, 0x76, 0x68, 0x02, 0x62, 0xf0, 0x00, 0x14, 0x42, 0x0d,
0xc8, 0x0e, 0x06, 0x31, 0x38, 0xc3, 0x72, 0xf0, 0x6c, 0x1d, 0xa1, 0xb8, 0x4f, 0x7e, 0x65, 0x5f,
0x33, 0xfd, 0x17, 0xdd, 0xa4, 0xb8, 0x7d, 0x6d, 0xae, 0xf9, 0x89, 0x4a, 0xa5, 0x1c, 0x47, 0x6d,
0xcc, 0xbd, 0x0d, 0xa9, 0x63, 0xef, 0x30, 0xa6, 0x05, 0x7b, 0xcc, 0x4a, 0xc2, 0x20, 0xf0, 0x3e,
0x94, 0x0c, 0xde, 0xc7, 0x6c, 0x18, 0xea, 0x7d, 0x16, 0x41, 0xeb, 0x0b, 0xb2, 0x50, 0x8f, 0x14,
0x28, 0x55, 0x8a, 0xd0, 0xf0, 0xde, 0xa2, 0x50, 0x1c, 0x51, 0x84, 0xba, 0x52, 0xb4, 0xec, 0xd2,
0x12, 0xf3, 0x5e, 0xaa, 0x50, 0xed, 0x9c, 0x43, 0x85, 0xaf, 0x25, 0xae, 0x19, 0x96, 0xe5, 0x3e,
0xfa, 0x37, 0xda, 0x81, 0xea, 0x05, 0x92, 0x7b, 0xcc, 0x22, 0x17, 0xff, 0x84, 0x24, 0xc1, 0xf9,
0x31, 0xbc, 0x47, 0x69, 0x77, 0xda, 0xf0, 0xe0, 0xb3, 0x15, 0xf3, 0xea, 0xef, 0x2f, 0x0a, 0xdb,
0x03, 0x41, 0x4f, 0x78, 0xf8, 0xa2, 0x2e, 0xe4, 0xc4, 0x9f, 0x08, 0x85, 0xde, 0x3a, 0x86, 0x2e,
0xb6, 0x17, 0xc3, 0xa9, 0xee, 0x85, 0x5a, 0x34, 0x64, 0xbd, 0x83, 0xfa, 0x59, 0x57, 0xcb, 0x4b,
0x63, 0xe0, 0x37, 0xc8, 0x66, 0xf9, 0xb9, 0xfd, 0xb4, 0xd8, 0xcc, 0x9d, 0x6e, 0xd7, 0x0b, 0xc3,
0x9b, 0xcd, 0xdf, 0x42, 0xd8, 0x66, 0xd3, 0xa4, 0xc9, 0x1c, 0x58, 0xd8, 0xbb, 0x3e, 0x2b, 0xaa,
0xd1, 0x6b, 0x54, 0xcd, 0x1b, 0xf7, 0xbf, 0xfb, 0xfc, 0xbf, 0x7b, 0xfc, 0x33, 0x6d, 0x90, 0x85,
0x8e, 0x04, 0x21, 0x0c, 0x86, 0x1b, 0xcf, 0xb9, 0xbb, 0x5b, 0xe4, 0xdc, 0xef, 0xde, 0xa6, 0x19,
0x29, 0x59, 0xc6, 0xe0, 0x4a, 0x57, 0x1e, 0xff, 0x06, 0xd6, 0xc9, 0xc6, 0x90, 0x9f, 0x7e, 0xfd,
0x0a, 0x74, 0xa8, 0x12, 0xca, 0xb0, 0xf7, 0x89, 0x1f, 0x28, 0x4a, 0x30, 0x33, 0xb5, 0x4d, 0x1a,
0x6d, 0x1a, 0xe4, 0x24, 0xd7, 0x06, 0xfb, 0x5a, 0x69, 0x54, 0x54, 0x1b, 0xa5, 0x60, 0x39, 0x0e,
0xd3, 0x8a, 0xe0, 0x2c, 0xa4, 0x0d, 0x9c, 0x5b, 0x37, 0xda, 0x1d, 0x77, 0x5d, 0x1a, 0x5f, 0xfb,
0xf2, 0xbb, 0x36, 0xf2, 0xb8, 0x51, 0x72, 0x51, 0xff, 0x89, 0x8c, 0xf6, 0xcb, 0x34, 0x68, 0xc1,
0xae, 0x25, 0x97, 0x5a, 0x90, 0xc9, 0x52, 0x22, 0xc4, 0x70, 0x81, 0x26, 0x75, 0xc4, 0x3d, 0x62,
0xf4, 0x8f, 0xe1, 0xd0, 0x98, 0x1a, 0x87, 0x17, 0x51, 0x72, 0x10, 0xbb, 0x8f, 0xf4, 0x46, 0xfc,
0x17, 0xeb, 0xe0, 0x41, 0x75, 0xab, 0x6a, 0xdc, 0xaf, 0xd4, 0xce, 0x61, 0x6d, 0x72, 0xaa, 0x61,
0xd9, 0x26, 0x2c, 0x5a, 0x7c, 0x59, 0xb0, 0xc8, 0x89, 0x61, 0x99, 0x7f, 0x17, 0xd1, 0xe0, 0x12,
0x5b, 0xd0, 0x99, 0x07, 0xc1, 0x59, 0x98, 0xd2, 0xcf, 0x03, 0x6b, 0x33, 0xb4, 0xb5, 0x89, 0xfc,
0x5e, 0xa4, 0xb8, 0x3e, 0x95, 0x87, 0xc3, 0x28, 0x5b, 0x73, 0xd4, 0x38, 0xc3, 0xb0, 0x26, 0xc4,
0xb5, 0x6e, 0x92, 0x0a, 0xb3, 0x4e, 0xd2, 0x96, 0x2c, 0x1e, 0x0a, 0xae, 0x82, 0xc1, 0x95, 0x37,
0xb8, 0x0a, 0x06, 0x5b, 0x33, 0x06, 0x5b, 0xd6, 0xb0, 0x70, 0x32, 0xf3, 0x8f, 0x51, 0xb3, 0x7f,
0x6c, 0x50, 0x35, 0x76, 0x04, 0x31, 0x0c, 0x55, 0x1b, 0x66, 0x86, 0x2e, 0x54, 0x07, 0x8f, 0x90,
0x2e, 0x9c, 0x94, 0x7a, 0x06, 0xcd, 0xae, 0x87, 0xec, 0xc8, 0x0a, 0x9d, 0x7e, 0x99, 0xc6, 0x2f,
0x95, 0x58, 0x1f, 0xa0, 0x4d, 0xa5, 0x90, 0xc1, 0xef, 0x2b, 0xe4, 0x3b, 0x94, 0x4c, 0x30, 0x78,
0x16, 0x56, 0x4e, 0x90, 0xbd, 0xaf, 0x30, 0x12, 0x7f, 0x13, 0xa3, 0xd7, 0xa3, 0xa4, 0xfa, 0x14,
0x81, 0x35, 0xa6, 0x40, 0x4a, 0x88, 0x61, 0x2f, 0x99, 0xac, 0x4f, 0x6f, 0xe0, 0x30, 0xbd, 0x8a,
0x54, 0x47, 0xcf, 0xb0, 0xd6, 0x3b, 0xac, 0x5c, 0xad, 0x4a, 0x34, 0x6d, 0x25, 0xb0, 0x30, 0xfe,
0xb5, 0x8e, 0x9a, 0x9d, 0x6d, 0x11, 0x52, 0x0c, 0xb5, 0xff, 0x81, 0x8d, 0x92, 0x5a, 0xca, 0xfc,
0x61, 0x50, 0x2c, 0x4e, 0x9c, 0xaf, 0x51, 0x28, 0x0a, 0x6c, 0x34, 0xbf, 0x2e, 0xcc, 0x20, 0x6e,
0x25, 0x88, 0xf3, 0x23, 0xc4, 0xf9, 0x04, 0xb1, 0xa7, 0xd2, 0xf8, 0x2a, 0xa8, 0xba, 0xff, 0x94,
0x95, 0x75, 0x1e, 0x75, 0x49, 0x98, 0x51, 0xe5, 0x6b, 0x38, 0xce, 0xbe, 0xca, 0x72, 0x9c, 0x7f,
0x45, 0x3d, 0x4e, 0x7f, 0x5c, 0xe6, 0x46, 0xf9, 0xf2, 0x44, 0xff, 0x76, 0xc2, 0x79, 0x65, 0x86,
0xcd, 0xf2, 0x08, 0x7d, 0xb9, 0x89, 0x0e, 0xf7, 0x43, 0xc7, 0x3f, 0x1c, 0x53, 0x49, 0x31, 0xe2,
0xa3, 0x0a, 0xc4, 0xff, 0x11, 0x82, 0x0b, 0x0c, 0x11, 0x4e, 0x7b, 0x1c, 0x60, 0xbb, 0x70, 0xbd,
0xcd, 0xca, 0x5b, 0xaa, 0x60, 0x7b, 0x82, 0x7e, 0x9c, 0xa0, 0xef, 0xcc, 0xa0, 0xaf, 0xbe, 0xb2,
0x32, 0x45, 0x77, 0x38, 0x0c, 0xd6, 0x06, 0x19, 0xac, 0x01, 0x32, 0x18, 0x00, 0x5c, 0x4d, 0x35,
0x42, 0xc4, 0x00, 0x10, 0xdc, 0x0e, 0xaf, 0x70, 0xe7, 0x0d, 0xc9, 0x23, 0xd0, 0x0a, 0x2d, 0x27,
0x36, 0xc7, 0x6d, 0x6c, 0xc3, 0x6e, 0xe0, 0x9e, 0x8f, 0x7b, 0x37, 0x3e, 0x72, 0xc2, 0x76, 0x64,
0x89, 0x3b, 0x75, 0xb6, 0x8c, 0xc0, 0xb5, 0xe7, 0x65, 0x43, 0x47, 0xa3, 0xaf, 0xa4, 0xb3, 0x8a,
0x9d, 0x6c, 0x39, 0x07, 0xe6, 0x23, 0x5d, 0x8e, 0x50, 0xb8, 0x56, 0xf7, 0x04, 0x63, 0xe8, 0x6d,
0x26, 0xdb, 0x66, 0x1d, 0x82, 0xfe, 0x44, 0x97, 0xf9, 0xab, 0x8b, 0x14, 0xa5, 0x75, 0x43, 0xde,
0xab, 0xf5, 0xf0, 0xbc, 0x52, 0x43, 0xd1, 0x52, 0x0e, 0x31, 0x84, 0xec, 0x3d, 0x46, 0x21, 0x7b,
0x33, 0x9d, 0xa8, 0x2c, 0x7f, 0xcf, 0xad, 0xfd, 0x9b, 0xdb, 0xf3, 0x48, 0xd2, 0x44, 0xd6, 0xad,
0xf8, 0xd8, 0x44, 0xf7, 0x30, 0x8e, 0xb2, 0xf2, 0xeb, 0x64, 0x13, 0x7f, 0xbd, 0xe5, 0x60, 0x1f,
0xe6, 0x22, 0xda, 0x58, 0x93, 0x63, 0x9a, 0xf7, 0xd5, 0x94, 0x6d, 0x85, 0xde, 0x27, 0x60, 0x92,
0x20, 0x7d, 0x99, 0x41, 0x4a, 0x52, 0x6e, 0xbc, 0x81, 0xa5, 0x19, 0x56, 0x97, 0x19, 0x82, 0x1c,
0xa5, 0x58, 0x94, 0x5f, 0x02, 0x74, 0x4d, 0x0a, 0x56, 0x15, 0x96, 0x20, 0x15, 0xb2, 0x70, 0x07,
0xcb, 0x21, 0x39, 0x45, 0x18, 0x29, 0x84, 0xd8, 0xf2, 0x12, 0xf3, 0xf2, 0xc1, 0x96, 0x1a, 0x19,
0x01, 0x2d, 0xc4, 0x6a, 0x94, 0x2a, 0xc8, 0x28, 0x51, 0x24, 0x4d, 0xa2, 0x70, 0x63, 0xc5, 0x90,
0x8c, 0xe5, 0x37, 0x36, 0xa0, 0xd0, 0x04, 0x01, 0x63, 0xa2, 0x0d, 0x00, 0x00, 0xa5, 0x4f, 0xb5,
0x56, 0x44, 0x41, 0x0c, 0x4d, 0x45, 0x85, 0x6b, 0x85, 0x4b, 0x85, 0xf3, 0x07, 0xb8, 0x95, 0xdb,
0xe7, 0x8c, 0x84, 0xb3, 0xf3, 0x24, 0x79, 0x27, 0x19, 0xec, 0xeb, 0x71, 0x67, 0xba, 0x6d, 0xaf,
0x5f, 0x48, 0xb5, 0xd4, 0x0e, 0xd9, 0xb1, 0x20, 0xeb, 0x0d, 0x1e, 0x1c, 0x44, 0xdf, 0xa2, 0x52,
0x47, 0x2e, 0x93, 0xc2, 0xac, 0x48, 0x8b, 0x46, 0x7a, 0x47, 0x0a, 0x43, 0x96, 0x53, 0xa8, 0xdf,
0x54, 0xfb, 0xfb, 0xaf, 0xaa, 0x20, 0x6d, 0xe7, 0x38, 0x09, 0xa3, 0xba, 0x98, 0x04, 0x7d, 0x43,
0xb0, 0x71, 0x6b, 0x1e, 0x66, 0xeb, 0x64, 0x86, 0xad, 0x44, 0x6a, 0x61, 0xf6, 0x2b, 0x6b, 0xee,
0x47, 0xd6, 0xf8, 0xc1, 0xee, 0x80, 0x09, 0x13, 0x07, 0x03, 0x06, 0xc0, 0x15, 0x51, 0x97, 0x89,
0xf8, 0xba, 0xb7, 0xf7, 0x7d, 0x78, 0x1a, 0x1b, 0x51, 0x87, 0x92, 0x1d, 0xb2, 0x20, 0x3d, 0x64,
0x52, 0x76, 0x0d, 0x1a, 0xb1, 0x89, 0x1a, 0xc0, 0x75, 0x6a, 0x1e, 0xcf, 0x04, 0x7b, 0x5b, 0x27,
0xa1, 0x2f, 0x5b, 0xd7, 0x29, 0x53, 0x71, 0xc3, 0xd4, 0x8f, 0xfa, 0x29, 0x7e, 0xa1, 0xac, 0x4f,
0x4d, 0x53, 0x94, 0x6e, 0xbd, 0xce, 0x9d, 0xfa, 0x1e, 0xf0, 0x63, 0xe2, 0x08, 0x1e, 0x39, 0x8d,
0x45, 0xd7, 0xea, 0x9b, 0xeb, 0x67, 0x4b, 0x31, 0x61, 0xb4, 0xe4, 0x5d, 0x78, 0xf5, 0x3e, 0x03,
0x8d, 0x8f, 0xb5, 0x7a, 0x03, 0x31, 0x10, 0x06, 0xb7, 0x0b, 0x33, 0x33, 0xa7, 0x0a, 0x63, 0x1d,
0x66, 0xa6, 0x72, 0x7d, 0xb0, 0x8e, 0xf5, 0x59, 0x74, 0x82, 0xc0, 0xd3, 0x87, 0xc1, 0x6c, 0xb7,
0x82, 0x7f, 0x66, 0xe0, 0x94, 0xf1, 0xd7, 0x03, 0x85, 0xb7, 0xf3, 0x7b, 0x51, 0x46, 0x61, 0x96,
0x59, 0x8b, 0x42, 0xc5, 0x24, 0xa0, 0xd5, 0x90, 0xa6, 0xc0, 0x91, 0x81, 0x36, 0xa5, 0x04, 0x5a,
0x32, 0x4f, 0x64, 0xa0, 0x7e, 0xf5, 0x66, 0x15, 0xed, 0xcb, 0xf2, 0xca, 0xc6, 0x0a, 0x46, 0x4a,
0xe8, 0x40, 0x32, 0x25, 0xd1, 0x04, 0x31, 0x53, 0x18, 0x72, 0x82, 0x59, 0xd4, 0x16, 0xa6, 0xbc,
0x0d, 0xa1, 0x2b, 0x67, 0xab, 0xeb, 0x6f, 0x6b, 0x08, 0x43, 0xc3, 0xe2, 0x47, 0x42, 0xb2, 0x5a,
0xaa, 0x67, 0x18, 0x56, 0xe1, 0xf7, 0x32, 0x8a, 0xc4, 0x39, 0xe8, 0xce, 0x41, 0x8d, 0x62, 0xfe,
0x5d, 0x97, 0x23, 0x23, 0x98, 0x0c, 0x38, 0x46, 0x99, 0xc0, 0x41, 0xfb, 0xe6, 0x46, 0x49, 0x83,
0xda, 0xe1, 0xb9, 0xb4, 0xc2, 0xf5, 0x7a, 0x3c, 0x12, 0xda, 0x73, 0x4b, 0x78, 0xc9, 0xbd, 0xc5,
0xbf, 0x89, 0xfa, 0x6d, 0x0a, 0x04, 0x2e, 0x3f, 0x94, 0x46, 0x7f, 0xc6, 0x8f, 0xa7, 0x3d, 0xe7,
0x30, 0xfe, 0x69, 0x31, 0xfe, 0xcc, 0xd2, 0x0c, 0xda, 0x73, 0x5c, 0xda, 0xff, 0x86, 0xfa, 0x0b,
0x5c, 0x06, 0xf2, 0x63, 0x3b, 0x72, 0xd4, 0x86, 0x30, 0xff, 0xae, 0x7e, 0x97, 0xa2, 0x6c, 0x49,
0x81, 0x91, 0x4f, 0x6a, 0x4b, 0x0e, 0xaf, 0xe5, 0x8f, 0xf7, 0x0e, 0x6c, 0x50, 0x83, 0x6e, 0x04,
0x41, 0x18, 0xfe, 0xeb, 0x86, 0xb5, 0xed, 0x36, 0xac, 0x1f, 0xa0, 0x66, 0x50, 0xc5, 0xf9, 0xb2,
0xf8, 0x9b, 0x9b, 0xd5, 0xec, 0xe0, 0xf4, 0xf4, 0x67, 0xdf, 0x8e, 0xf9, 0x89, 0x3e, 0x44, 0x54,
0x7e, 0x96, 0xf8, 0x79, 0xfc, 0x79, 0xc1, 0x63, 0x24, 0x2c, 0xc3, 0x94, 0x2e, 0x2e, 0x6f, 0x2f,
0xe1, 0xc9, 0x38, 0x75, 0x12, 0x21, 0x13, 0x68, 0xc7, 0x17, 0x12, 0x6e, 0xc4, 0x74, 0x96, 0x37,
0x2e, 0xad, 0x85, 0xc2, 0x18, 0xc4, 0xd2, 0xe7, 0x98, 0xd6, 0x34, 0xa7, 0xec, 0x58, 0xd6, 0xb4,
0x2e, 0x65, 0x0c, 0xc3, 0xba, 0x50, 0x5b, 0x4f, 0x47, 0x52, 0x3b, 0xb8, 0xbf, 0xcd, 0xc2, 0x00,
0xcd, 0xf6, 0xfc, 0x9f, 0x6d, 0xff, 0x07, 0xcd, 0x75, 0x01, 0x40, 0xd3, 0x1f, 0x75, 0x84, 0xbf,
0x4b, 0x5c, 0xd4, 0xea, 0x6d, 0xb6, 0x16, 0xa4, 0x86, 0x8e, 0xeb, 0x82, 0x8e, 0x8b, 0xe2, 0x5f,
0xd0, 0x72, 0x0f, 0xec, 0x72, 0x47, 0xd6, 0x36, 0xa4, 0xdb, 0x02, 0x8d, 0x95, 0xb5, 0xa0, 0x95,
0x1e, 0x9d, 0x7b, 0x83, 0x97, 0xcb, 0x96, 0x75, 0x2c, 0x12, 0x27, 0x82, 0x97, 0x73, 0x2c, 0xd1,
0xe7, 0xcd, 0xb7, 0x75, 0xbc, 0x10, 0xbf, 0x89, 0xb0, 0x35, 0x3f, 0x1f, 0x99, 0x42, 0xf6, 0xea,
0x1a, 0xe6, 0x7a, 0xd8, 0xe7, 0x3a, 0xec, 0xf3, 0x3d, 0x64, 0x23, 0x6c, 0x72, 0x48, 0xa5, 0x17,
0xb2, 0x45, 0xe7, 0xc1, 0x22, 0x1a, 0x51, 0x49, 0xeb, 0x20, 0x91, 0xe0, 0x52, 0xed, 0xac, 0xce,
0x6e, 0x38, 0x31, 0x52, 0x1b, 0x1a, 0x77, 0xfc, 0x02, 0x27, 0x36, 0xaf, 0x59, 0xa3, 0x3a, 0xdc,
0xd1, 0x02, 0x0e, 0x05, 0xec, 0xfe, 0x47, 0xf6, 0x2e, 0xba, 0xef, 0x00, 0x6d, 0xd0, 0xb5, 0x72,
0x03, 0x41, 0x0c, 0x06, 0x60, 0x85, 0xd3, 0x5d, 0x9a, 0x30, 0x75, 0x6e, 0xcd, 0xf0, 0x00, 0x61,
0xea, 0x52, 0x6b, 0x0e, 0x64, 0x7b, 0x27, 0x0b, 0x9e, 0xd5, 0x9a, 0xde, 0x3e, 0x3a, 0x33, 0x35,
0xcb, 0xfb, 0xeb, 0x1b, 0xc1, 0x37, 0x71, 0x37, 0xce, 0x06, 0x64, 0x43, 0xdf, 0x93, 0x47, 0x1e,
0x95, 0x2b, 0x8d, 0x16, 0xa6, 0xce, 0xf4, 0x62, 0xab, 0x9c, 0x45, 0x1f, 0x67, 0xca, 0x61, 0xa2,
0x09, 0x0a, 0x7d, 0x4e, 0xe0, 0xe2, 0x4f, 0x31, 0xa3, 0x71, 0x19, 0x19, 0xb8, 0xf0, 0xd4, 0xa3,
0x38, 0x90, 0x87, 0x4b, 0xe7, 0x0c, 0x32, 0xf9, 0x81, 0xac, 0x2f, 0xe4, 0xc0, 0x28, 0x1b, 0x6b,
0x4c, 0xbb, 0x71, 0x80, 0x43, 0x65, 0xd4, 0xae, 0x38, 0x84, 0xd3, 0xf9, 0x77, 0x04, 0x30, 0xa2,
0xb0, 0x4e, 0xbb, 0xce, 0x18, 0x87, 0xe5, 0xca, 0xce, 0xf2, 0x8f, 0xed, 0xbe, 0xd6, 0xf0, 0x98,
0x23, 0x1e, 0x87, 0xaa, 0xad, 0x20, 0x5a, 0xa1, 0x44, 0x4b, 0x0a, 0x26, 0x5e, 0x65, 0x1d, 0x42,
0xe2, 0x9e, 0x75, 0x43, 0x38, 0x5b, 0xa1, 0x45, 0x4c, 0x96, 0x9d, 0xcc, 0xeb, 0x44, 0xf8, 0x56,
0x96, 0x86, 0x4c, 0x02, 0x35, 0x54, 0xa9, 0x6b, 0x2e, 0x95, 0x71, 0x91, 0x77, 0x8b, 0xda, 0xf9,
0x18, 0x5d, 0x88, 0xd1, 0x3a, 0xa4, 0x91, 0x9c, 0xe5, 0x1f, 0xa7, 0x49, 0x0c, 0x7b, 0x9f, 0xcf,
0xc8, 0xd5, 0x9d, 0xe0, 0xcb, 0x9c, 0x7a, 0x39, 0xa1, 0x9e, 0x2c, 0xe2, 0xa2, 0x0d, 0xde, 0xa5,
0xe7, 0x4a, 0xb5, 0x02, 0xa7, 0x2b, 0xca, 0x93, 0x99, 0xf2, 0x64, 0x43, 0xf9, 0x13, 0x0b, 0xe0,
0xb5, 0x82, 0xbf, 0x3a, 0x08, 0x68, 0x91, 0x08, 0x56, 0x25, 0x52, 0x0e, 0x39, 0xf5, 0x44, 0x56,
0x24, 0xd6, 0x52, 0x1a, 0x76, 0xb7, 0xbc, 0x90, 0xf7, 0x50, 0x26, 0x91, 0x21, 0xfc, 0x03, 0x7d,
0xcf, 0x85, 0x71, 0xc5, 0x30, 0x0c, 0x06, 0x60, 0x1d, 0x94, 0x99, 0x99, 0x3b, 0x40, 0x61, 0x8d,
0xf2, 0x02, 0xba, 0x80, 0x5e, 0xeb, 0x80, 0x94, 0x93, 0x52, 0x9c, 0xbe, 0xf6, 0x63, 0x0e, 0x98,
0xed, 0xef, 0x37, 0xb0, 0x8b, 0xe3, 0x82, 0xd0, 0x12, 0x25, 0x62, 0x4c, 0x84, 0x99, 0x92, 0xda,
0xd7, 0x65, 0x15, 0xb1, 0x13, 0x46, 0x8d, 0x52, 0x27, 0xf8, 0xed, 0x1a, 0x0e, 0x61, 0x37, 0x77,
0x66, 0x58, 0x4a, 0x4a, 0xa5, 0xef, 0x28, 0x55, 0x14, 0xd5, 0xa4, 0x08, 0x67, 0xb1, 0xba, 0xf4,
0x9d, 0x90, 0xac, 0x62, 0xf9, 0x46, 0xd8, 0x13, 0x29, 0xd1, 0x48, 0xbf, 0xc2, 0xe4, 0xae, 0x5f,
0x52, 0x3a, 0x8e, 0x0a, 0x4c, 0x3e, 0xa2, 0x1a, 0x61, 0xee, 0x8f, 0x54, 0x26, 0x42, 0x21, 0x0b,
0x5c, 0x37, 0x3e, 0x8b, 0xc2, 0x57, 0x9f, 0x16, 0xfb, 0xb2, 0x65, 0x6f, 0xf7, 0xb8, 0x93, 0x21,
0x6e, 0xa7, 0x9f, 0xdb, 0x1e, 0xe2, 0xe0, 0x45, 0xe5, 0xd1, 0x25, 0x2a, 0xe3, 0x28, 0x38, 0xf0,
0x04, 0x2c, 0xf4, 0xae, 0x05, 0x0b, 0x1d, 0x06, 0x36, 0xb0, 0xcd, 0xa8, 0xdd, 0xdd, 0xdf, 0x85,
0xf3, 0x5d, 0x54, 0xdc, 0xc2, 0x66, 0x21, 0x1a, 0xa1, 0xd4, 0x11, 0xb2, 0x20, 0xfd, 0xf8, 0x95,
0xc1, 0x32, 0x62, 0x13, 0x35, 0x58, 0xec, 0x45, 0x81, 0x85, 0xd6, 0x20, 0x2c, 0x0c, 0x24, 0x02,
0x78, 0xbb, 0x7d, 0xa2, 0xf1, 0x69, 0x76, 0x43, 0x9a, 0xd9, 0xbe, 0x34, 0xb3, 0xdd, 0x34, 0xab,
0x38, 0xd5, 0x9d, 0xeb, 0x73, 0x67, 0xdb, 0xee, 0xec, 0xa0, 0xfb, 0x0f, 0x62, 0x08, 0x72, 0xf4,
0x06, 0x14, 0x42, 0x17, 0xe9, 0x0d, 0x03, 0x31, 0x14, 0x80, 0x55, 0xae, 0xbb, 0x2a, 0xc3, 0x01,
0xba, 0x36, 0xfb, 0x3a, 0xfa, 0x0c, 0x72, 0x33, 0x86, 0x91, 0x23, 0x29, 0x70, 0xfb, 0x32, 0x53,
0x96, 0x03, 0x82, 0xff, 0x61, 0x1a, 0xc7, 0x09, 0xd6, 0x3c, 0x4e, 0xa5, 0x77, 0xec, 0x51, 0xca,
0xc6, 0x31, 0x56, 0x03, 0xc1, 0x4d, 0xbb, 0x18, 0x06, 0xb8, 0x59, 0x68, 0x05, 0x37, 0x2b, 0xd7,
0x3a, 0x08, 0x7a, 0xa7, 0x8a, 0x23, 0x37, 0x34, 0x42, 0x20, 0x34, 0x51, 0x69, 0x24, 0x70, 0x82,
0x95, 0xb8, 0xe6, 0x8e, 0x90, 0x74, 0xf2, 0xbc, 0x82, 0x1b, 0xd1, 0x24, 0x4d, 0xe0, 0x94, 0x2b,
0x25, 0x59, 0x92, 0xe0, 0x38, 0x37, 0x83, 0x23, 0xe6, 0x11, 0x5f, 0x2e, 0xe0, 0x1c, 0xbf, 0xbe,
0x05, 0x4a, 0x5e, 0x59, 0x20, 0x30, 0x92, 0xd1, 0xf9, 0x72, 0xc0, 0x7a, 0x56, 0x1a, 0xec, 0x65,
0x51, 0x8c, 0x6f, 0x63, 0x70, 0x60, 0x29, 0x91, 0xad, 0x44, 0xcf, 0x48, 0x6b, 0x23, 0x79, 0xfa,
0xf7, 0x52, 0xa8, 0x70, 0x2a, 0x65, 0x1f, 0xa7, 0x69, 0x94, 0xe0, 0x2a, 0xc9, 0xe7, 0x71, 0xf1,
0xfe, 0x1b, 0x4e, 0x17, 0xde, 0xb5, 0x8e, 0x9a, 0x8f, 0x9b, 0xdd, 0xac, 0x48, 0xe3, 0xdf, 0xc1,
0x64, 0x33, 0x12, 0x4f, 0xf6, 0x89, 0xfe, 0x3b, 0xfa, 0x8d, 0xfc, 0x4c, 0x7d, 0x62, 0xb9, 0x72,
0x88, 0xff, 0x5f, 0xf1, 0x36, 0xd9, 0x40, 0xd8, 0x0c, 0xcc, 0xa3, 0x28, 0x46, 0x1d, 0xd8, 0xb0,
0xfe, 0x0f, 0x78, 0xfa, 0x2d, 0x83, 0xef, 0xb9, 0x3e, 0x00, 0xad, 0x90, 0x35, 0x77, 0xc3, 0x40,
0x0c, 0x80, 0xb5, 0x95, 0x99, 0x99, 0xb7, 0x62, 0x68, 0x2e, 0x33, 0xe3, 0xa8, 0x27, 0xc7, 0x17,
0xf7, 0x0c, 0x27, 0xbf, 0x3b, 0xa7, 0xce, 0xbf, 0x0f, 0x73, 0x32, 0x76, 0x11, 0xc3, 0x27, 0xc1,
0xfb, 0xd9, 0x03, 0xfe, 0x48, 0xf3, 0x24, 0xcc, 0x2f, 0x7e, 0x92, 0x83, 0x59, 0x0e, 0x42, 0x52,
0x92, 0x15, 0x6a, 0xb2, 0x25, 0xa3, 0xe5, 0x0b, 0xd8, 0xcc, 0x1b, 0x0b, 0x26, 0x3d, 0x69, 0x0c,
0x06, 0x6c, 0x8b, 0x00, 0x26, 0xb5, 0x08, 0x05, 0x45, 0x42, 0xc3, 0x22, 0xfa, 0xac, 0x09, 0x39,
0x22, 0x54, 0x8c, 0xa2, 0x50, 0x8e, 0x29, 0xf2, 0xd1, 0x08, 0x65, 0x58, 0x1b, 0x98, 0x62, 0x0e,
0xca, 0x8e, 0xfe, 0x2b, 0x97, 0x4e, 0xd6, 0x82, 0x00, 0x1f, 0x65, 0x2d, 0x2e, 0x28, 0xc4, 0x0f,
0xf6, 0x49, 0x63, 0x73, 0xd6, 0xe0, 0x9d, 0xb2, 0x65, 0x96, 0x22, 0xd6, 0x07, 0x57, 0x1f, 0xaf,
0xcf, 0x1c, 0x57, 0x61, 0xea, 0x1c, 0x15, 0x84, 0xe9, 0x47, 0x7e, 0xa7, 0x83, 0xe7, 0x93, 0xcc,
0x7b, 0xa2, 0x2b, 0x85, 0xb1, 0xcc, 0x49, 0x98, 0xef, 0x6e, 0xd8, 0xab, 0xc5, 0xc1, 0x54, 0x16,
0x15, 0x24, 0x31, 0x26, 0x8f, 0x3f, 0xfa, 0x9e, 0xb8, 0x5e, 0x29, 0x1f, 0x6f, 0x3b, 0x71, 0xbc,
0x89, 0x35, 0x8f, 0x96, 0x96, 0xb6, 0x23, 0x50, 0x9b, 0x44, 0x32, 0x01, 0x13, 0x6d, 0x27, 0x8d,
0x24, 0xff, 0x73, 0x1a, 0x7c, 0x44, 0x14, 0x55, 0x06, 0xdd, 0x24, 0xca, 0x5f, 0x75, 0x1c, 0xa9,
0x9c, 0xd6, 0x73, 0x56, 0x1a, 0x7d, 0xc2, 0x84, 0x8a, 0x63, 0x18, 0x69, 0x66, 0x66, 0xba, 0x32,
0x43, 0x49, 0x2c, 0xbf, 0x2f, 0x99, 0xe8, 0x4b, 0xb6, 0x95, 0xcb, 0xfb, 0x3e, 0x6c, 0x55, 0xf8,
0x4a, 0x7d, 0x50, 0x03, 0x6f, 0x05, 0x41, 0x10, 0x9e, 0x06, 0xb5, 0x6d, 0xdb, 0x8e, 0x51, 0xc7,
0x35, 0xc2, 0xc9, 0x61, 0x7a, 0x39, 0xec, 0xce, 0xea, 0xe1, 0xdf, 0xd7, 0x78, 0x0e, 0x87, 0x9f,
0xe0, 0xde, 0x79, 0x2e, 0x66, 0x89, 0x57, 0x07, 0x78, 0x71, 0x7f, 0x73, 0xb0, 0x8f, 0x01, 0x0b,
0xe5, 0xc9, 0xcf, 0x91, 0xf1, 0xc2, 0x98, 0xb1, 0x10, 0xbf, 0xc6, 0xd0, 0x97, 0xc6, 0xd6, 0xa2,
0xe0, 0x90, 0x04, 0xf4, 0x65, 0x1c, 0x45, 0xb1, 0x8c, 0xd0, 0x90, 0x22, 0xcf, 0x91, 0x81, 0x3e,
0xb3, 0xff, 0xdf, 0x4c, 0x22, 0xfb, 0x96, 0x4c, 0x9e, 0x0c, 0x0a, 0xed, 0x1c, 0x0c, 0x31, 0x0b,
0xfc, 0x1e, 0xc0, 0x4c, 0xc5, 0xae, 0xff, 0xf7, 0x69, 0xac, 0x72, 0xf1, 0xf7, 0x54, 0x0d, 0x08,
0x6e, 0x6f, 0x77, 0x77, 0x97, 0xaa, 0x84, 0xfa, 0x19, 0xc1, 0x48, 0xce, 0xfa, 0xd0, 0x52, 0x22,
0xb6, 0xe5, 0x4f, 0x57, 0x0f, 0x66, 0x6c, 0x3c, 0x64, 0xe7, 0xa1, 0x64, 0xa4, 0xe2, 0xc7, 0x4c,
0x7a, 0x19, 0x5a, 0x92, 0x96, 0x8d, 0x85, 0xd6, 0x12, 0xc6, 0x96, 0xef, 0x21, 0xc0, 0x03, 0x9e,
0x92, 0x27, 0xf0, 0xfe, 0x00, 0xef, 0x73, 0xca, 0x90, 0x20, 0xbc, 0x7f, 0xd9, 0xdb, 0x3f, 0xde,
0xaf, 0xc9, 0xbd, 0x89, 0xca, 0xc2, 0xda, 0x57, 0x5c, 0x63, 0x25, 0x0a, 0xc6, 0xfe, 0x14, 0xcc,
0xa1, 0x6f, 0xe2, 0x30, 0x22, 0x24, 0xab, 0x24, 0x17, 0x60, 0xbe, 0xdc, 0xd7, 0x78, 0x89, 0x82,
0xc5, 0x0a, 0xcf, 0x4d, 0xfe, 0xa7, 0x8e, 0x06, 0xe4, 0xb3, 0x9f, 0xe4, 0x5d, 0x25, 0xb4, 0x5d,
0x7f, 0xb4, 0x43, 0x15, 0x58, 0xdd, 0x25, 0x3c, 0xef, 0x95, 0x50, 0x35, 0x7a, 0x43, 0x31, 0x0c,
0x56, 0xc6, 0x32, 0x33, 0x1e, 0xa1, 0xdc, 0xee, 0x5d, 0xcb, 0xbc, 0xe9, 0x33, 0x28, 0x8d, 0x1f,
0x58, 0xaf, 0x92, 0x03, 0xb7, 0x2f, 0x33, 0x67, 0xb2, 0x45, 0x3f, 0xc1, 0x99, 0x25, 0x53, 0xe2,
0xe9, 0xd5, 0xea, 0xda, 0xd6, 0x1a, 0x0a, 0x73, 0x89, 0x4a, 0xd2, 0x22, 0x41, 0xb6, 0xcf, 0x9f,
0xf2, 0x26, 0x25, 0xe8, 0xdd, 0xde, 0x42, 0xc7, 0x65, 0x65, 0x62, 0xe0, 0x88, 0x62, 0x7c, 0x60,
0xb4, 0x05, 0xc1, 0x32, 0x56, 0x0a, 0x03, 0x79, 0x50, 0xc5, 0x92, 0x3d, 0x95, 0x30, 0x20, 0x54,
0x91, 0x49, 0x24, 0x30, 0xf1, 0x09, 0x62, 0xf0, 0x0d, 0x1c, 0xa6, 0x3f, 0xcd, 0x6a, 0x14, 0x35,
0x19, 0xc1, 0xdd, 0x75, 0xd4, 0xce, 0xa3, 0x94, 0x77, 0x90, 0xa3, 0xaf, 0x90, 0xb3, 0x68, 0x25,
0xf8, 0x6b, 0x42, 0xd2, 0x2a, 0x72, 0x1b, 0x86, 0x77, 0xfe, 0xb7, 0x57, 0x6b, 0x84, 0x98, 0x1f,
0xb0, 0x27, 0xdc, 0x5f, 0xfd, 0xd6, 0xc6, 0x42, 0x53, 0xed, 0xf7, 0x36, 0x3e, 0xc8, 0xee, 0x5b,
0xfb, 0xfe, 0xba, 0xde, 0x2c, 0x0a, 0x58, 0x50, 0x92, 0x60, 0x8a, 0x27, 0xac, 0x85, 0x76, 0xa8,
0x87, 0x8f, 0x88, 0x27, 0x6f, 0xc1, 0x7c, 0x54, 0x37, 0x20, 0xef, 0x28, 0x06, 0x12, 0x49, 0x19,
0xa2, 0x29, 0xd0, 0x35, 0x4c, 0x82, 0xbe, 0xf5, 0x6e, 0xf5, 0x4e, 0x60, 0xc1, 0x62, 0x90, 0x93,
0xc1, 0xc8, 0x48, 0x9d, 0x44, 0xf2, 0x80, 0xa6, 0x14, 0x95, 0x45, 0x3f, 0xd8, 0xb9, 0x03, 0x74,
0x8e, 0x45, 0x76, 0xc4, 0x30, 0x0c, 0x40, 0xb5, 0x1e, 0x5a, 0x95, 0xf9, 0x06, 0x65, 0x3a, 0x41,
0x99, 0x79, 0xa5, 0x17, 0xdb, 0x9a, 0x89, 0x42, 0x4a, 0x65, 0x4f, 0x73, 0xfc, 0x32, 0xd7, 0xdd,
0x98, 0xfd, 0xff, 0x87, 0xcb, 0x94, 0xab, 0xfc, 0x58, 0x1c, 0xe1, 0xd1, 0x3a, 0x5a, 0x29, 0xeb,
0xa4, 0x62, 0xa9, 0x50, 0x13, 0xc7, 0x82, 0xa6, 0x20, 0x58, 0xc0, 0xda, 0xc3, 0x6c, 0x7f, 0x58,
0x14, 0x30, 0xeb, 0x49, 0x39, 0x79, 0x9e, 0x87, 0xde, 0xc0, 0x6c, 0xc3, 0x7d, 0x86, 0x6e, 0xce,
0xde, 0x63, 0x29, 0x8e, 0x4a, 0xe8, 0x9e, 0x53, 0x4d, 0x49, 0x20, 0x85, 0x51, 0x34, 0xca, 0x6e,
0x40, 0x48, 0xbe, 0xae, 0xa4, 0x81, 0xae, 0x8a, 0x94, 0xe8, 0x49, 0x1f, 0x48, 0xa1, 0x1b, 0x48,
0x4b, 0xae, 0x92, 0x02, 0x6d, 0x9a, 0x04, 0x68, 0x6f, 0x44, 0xb5, 0x2f, 0x8e, 0x9f, 0x74, 0xfd,
0xa0, 0xf7, 0xbe, 0xc1, 0xda, 0x9b, 0xf1, 0xdf, 0x14, 0x52, 0xd2, 0x8a, 0xc2, 0x6b, 0xf9, 0xff,
0xc5, 0xfa, 0x55, 0x2c, 0xe6, 0x0d, 0x89, 0xe5, 0x7d, 0x08, 0x3f, 0x1c, 0x13, 0xbf, 0xee, 0xda,
0xdb, 0x31, 0x27, 0xbe, 0x4a, 0xf0, 0xcd, 0x82, 0x71, 0x0d, 0x7e, 0xe7, 0x22, 0xc0, 0xcd, 0xee,
0xdd, 0xca, 0xd2, 0xca, 0x3a, 0x9a, 0xc4, 0x0d, 0x28, 0x0e, 0xed, 0x7d, 0xfd, 0x85, 0x86, 0x05,
0x9b, 0x72, 0x79, 0x79, 0x79, 0x09, 0x3f, 0xc3, 0xe1, 0x86, 0xe5, 0x52, 0x13, 0x9b, 0x93, 0x3e,
0xcd, 0xc7, 0x90, 0xd4, 0x90, 0x04, 0x00, 0x85, 0x51, 0x03, 0x92, 0x44, 0x31, 0x10, 0xed, 0xb5,
0x6d, 0x5f, 0x61, 0x7d, 0x80, 0xb5, 0xad, 0x62, 0xd7, 0x47, 0xcf, 0x56, 0x3e, 0xd2, 0xa9, 0xce,
0x1f, 0xdc, 0x7e, 0x6c, 0x16, 0xe2, 0xc7, 0xc0, 0xaf, 0xe2, 0x2f, 0x71, 0xbc, 0x90, 0xe4, 0xe9,
0x08, 0x85, 0x0c, 0x39, 0x09, 0x09, 0x46, 0x2c, 0x0e, 0x72, 0xe2, 0xa0, 0x66, 0xa4, 0x5c, 0x42,
0xa2, 0x9d, 0x08, 0x2d, 0x69, 0xcb, 0x62, 0x61, 0x9e, 0x39, 0x2e, 0x6e, 0x24, 0x43, 0x02, 0xb3,
0xd7, 0x4a, 0x87, 0xe8, 0x71, 0x6c, 0x1c, 0xad, 0x58, 0xa3, 0x38, 0xbe, 0x62, 0x74, 0x23, 0x82,
0xa5, 0x50, 0x59, 0x8b, 0x31, 0xfb, 0x14, 0x03, 0xfc, 0x29, 0x87, 0xf1, 0xf2, 0xa4, 0xeb, 0xc3,
0x1d, 0x34, 0x16, 0x36, 0xd3, 0xd6, 0x85, 0xcd, 0xac, 0x4a, 0x29, 0x98, 0x6c, 0x02, 0x4e, 0xd6,
0x1c, 0xc1, 0x54, 0x93, 0xe8, 0xf8, 0x79, 0x37, 0x22, 0xec, 0x8e, 0x44, 0x18, 0xd3, 0x92, 0x3a,
0x3b, 0xee, 0xae, 0x5d, 0x92, 0x9d, 0x69, 0x82, 0xcd, 0xd4, 0x05, 0x57, 0xd0, 0x15, 0xe5, 0xff,
0x13, 0x8a, 0x3d, 0x3e, 0x39, 0x86, 0xd9, 0x26, 0xfd, 0xb1, 0xcf, 0x41, 0x49, 0xba, 0x67, 0x58,
0xac, 0x51, 0x92, 0x35, 0x9a, 0xb3, 0x2d, 0x99, 0x26, 0x2b, 0xed, 0xc2, 0xe4, 0xef, 0xfd, 0x6b,
0x57, 0xf2, 0x83, 0x12, 0xf9, 0x6e, 0x2a, 0x1d, 0x45, 0xb0, 0x5b, 0xc4, 0x28, 0xa7, 0x38, 0x97,
0xa4, 0x76, 0xcb, 0xa5, 0xcd, 0x36, 0x09, 0xce, 0x1a, 0x47, 0x12, 0x95, 0x94, 0xe0, 0x94, 0x33,
0x8e, 0xf6, 0x4b, 0xff, 0x54, 0x37, 0x51, 0x00, 0x62, 0x88, 0xc8, 0x4c, 0xcc, 0x8f, 0x0f, 0x36,
0x8e, 0x0f, 0xf7, 0xf4, 0x8f, 0x07, 0x54, 0x25, 0xd7, 0x06, 0x08, 0xc0, 0x40, 0x00, 0x00, 0x7f,
0x80, 0xd0, 0x21, 0xdb, 0xc5, 0xdd, 0x3d, 0xe3, 0xa3, 0x15, 0xed, 0x5d, 0x57, 0x55, 0xb1, 0xa9,
0x3a, 0xe1, 0xdd, 0x49, 0xa3, 0x88, 0x1a, 0x35, 0x97, 0x03, 0xb7, 0xc2, 0x87, 0xea, 0xfb, 0xed,
0xa9, 0xcd, 0x09, 0x97, 0x52, 0x12, 0xf9, 0x01, 0x3c, 0xc8, 0xff, 0xa1, 0xa1, 0xf2, 0x28, 0x1d,
0xd0, 0x54, 0x3d, 0xb9, 0xcc, 0x22, 0x11, 0x96, 0x4d, 0x78, 0x01,
};
for (unsigned i = 0; i < sizeof(IDS) / sizeof(IDS[0]); i++) {
if (IDS[i] != target_id) continue;
unsigned group = 0;
while (i >= FIRSTS[group + 1]) group++;
uint8_t raw[512];
unsigned int produced = sizeof raw;
if (tinf_uncompress_exact(raw, &produced, NAMES + OFFSETS[group],
OFFSETS[group + 1] - OFFSETS[group]) != TINF_OK ||
produced != RAW_LENGTHS[group]) return nullptr;
const uint8_t* record = raw;
const uint8_t* end = raw + produced;
size_t previous_length = 0;
for (unsigned row = FIRSTS[group]; row <= i; row++) {
if (record == end) { buffer[0] = 0; return nullptr; }
size_t length = *record++;
if (length > previous_length) { buffer[0] = 0; return nullptr; }
while (record < end && *record) {
if (length + 1 < capacity) buffer[length] = (char)*record;
length++; record++;
}
if (record == end) { buffer[0] = 0; return nullptr; }
record++;
buffer[length < capacity ? length : capacity - 1] = 0;
if (row == i && length >= capacity) { buffer[0] = 0; return nullptr; }
previous_length = length;
}
return buffer;
}
return nullptr;
}
#else
// target_id -> env name, or nullptr if unknown. Linear scan; lookups are rare.
inline const char* ota_target_env_name(uint32_t target_id) {
#if OTA_TARGET_NAME_TABLE
@@ -662,5 +1079,10 @@ inline const char* ota_target_env_name(uint32_t target_id) {
#endif
return nullptr;
}
// The original flash-string API remains unchanged when compression is disabled.
inline const char* ota_target_env_name(uint32_t target_id, char*, size_t) {
return ota_target_env_name(target_id);
}
#endif
} } // namespace mesh::ota
+3 -1
View File
@@ -3,7 +3,9 @@
* several extra kilobytes with the embedded toolchains used by MeshCore.
*/
#include "../CompanionReaderConfig.h"
#if defined(ENABLE_OTA) || defined(OTA_TRANSPORT_DEFLATE_TEST) || COMPANION_FEATURE_READER
#include "../ui/Nrf52FontConfig.h"
#if defined(ENABLE_OTA) || defined(OTA_TRANSPORT_DEFLATE_TEST) || COMPANION_FEATURE_READER \
|| MESHCORE_FONT_DEFLATE
#if defined(__GNUC__) && !defined(__clang__)
/* nRF52's Arduino recipe defaults to -Ofast, which more than doubles this
* decoder. Keep the size policy local to tinf instead of changing MeshCore. */
File diff suppressed because it is too large. Load diff
+626
View File
@@ -0,0 +1,626 @@
// Generated by scripts/generate_compact_noto.py; do not edit.
// MeshFontProduction9: lossless storage of the licensed MeshFontTrial7 bitmaps.
// All 224 slots/189 drawable glyphs preserved at 12/17 px H cap height;
// H tops 3/5 px, line boxes 19/28 px. The unused initial Arial10 is not stored.
// Google Zopfli 1000; glyph-aligned chunks decode to at most 512 bytes.
// Source rasterizer: Pillow 12.3.0 / FreeType 2.14.3, threshold 128.
// Nominal source sizes 16/24 px, baselines 15/22 px; existing mode7 placement.
// Normal builds need no compressor, rasterizer or source TrueType font.
#pragma once
#include <stddef.h>
#include <stdint.h>
#include "../ota/tinf/tinf.h"
namespace mesh { namespace ui { namespace noto {
static constexpr size_t kScratchSize = 512;
struct Font {
const uint8_t* descriptor;
const uint8_t* data;
const uint16_t* offsets;
const uint16_t* rawLengths;
uint16_t chunkCount;
uint16_t dataLength;
};
struct Glyph {
const uint8_t* data;
uint8_t width;
uint8_t length;
bool drawable;
bool valid;
};
/*
Compression derivative named MeshFontProduction9.
The following notice identifies the upstream rasterized font source.
Derived MeshFontTrial7; source Noto Sans Condensed, Version 2.000;GOOG;noto-source:20170915:90ef993387c0; ttfautohint (v1.7)
Source SHA256: 4efc2789b9fcaa87b6b55f19c25ac9a2919e4f9ca31d6b5b97bea7977d729d4f
Upstream: https://github.com/notofonts/noto-fonts
SPDX-License-Identifier: OFL-1.1
Full license/copyright follows; it applies to the bitmap font data.
Copyright 2015 Google Inc. All Rights Reserved.
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font Software,
subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
*/
// Authoritative raw bitmap SHA256: 0027b835b49dbf1745ad063814a2f3ea23aac9797f157a1ecc48adf09591668d
inline const Font& fontStorage1() {
static const uint8_t FONT_1_DATA[] = {
0x5d, 0xcb, 0x81, 0x86, 0x1b, 0x51, 0x14, 0x80, 0xe1, 0x6f, 0x92, 0xac, 0xdc, 0xc2, 0x76, 0x01,
0x17, 0xd1, 0xcc, 0xee, 0x13, 0x04, 0x54, 0x10, 0xc9, 0x4c, 0xb7, 0x5a, 0xe8, 0x43, 0xcc, 0x9a,
0x6a, 0x81, 0xda, 0x42, 0x0d, 0xb0, 0x03, 0xc8, 0x23, 0xe4, 0x51, 0x0a, 0xb8, 0x8f, 0x51, 0xc0,
0x3c, 0xc2, 0x2d, 0x30, 0x40, 0x7b, 0x11, 0x4a, 0xf9, 0x1c, 0xbf, 0x73, 0x1c, 0xcc, 0x5f, 0xcd,
0x4f, 0x18, 0x00, 0x06, 0x2b, 0xe3, 0x7b, 0xe3, 0xc9, 0x5c, 0xe2, 0xb3, 0xb4, 0xf5, 0xb3, 0xc4,
0x0a, 0xd3, 0xbd, 0xfa, 0xde, 0xfc, 0xc7, 0xee, 0x41, 0xfd, 0x96, 0x0d, 0xf2, 0x52, 0x58, 0x88,
0xbd, 0x29, 0xb2, 0x96, 0xd8, 0x1f, 0x69, 0xe9, 0xd9, 0xc0, 0xd1, 0xdc, 0x3b, 0x3f, 0xfa, 0xf5,
0xc1, 0xf3, 0x81, 0x3d, 0xdf, 0x68, 0x30, 0x20, 0xbd, 0x78, 0x4e, 0x55, 0x50, 0x21, 0xaa, 0xf2,
0x6f, 0xe3, 0x09, 0x35, 0x53, 0x65, 0x50, 0xa6, 0x1a, 0x16, 0x85, 0x69, 0x7b, 0x8d, 0xc2, 0xf5,
0xb6, 0xf2, 0x0f, 0x5d, 0xa1, 0x61, 0xe0, 0x56, 0xaa, 0x0c, 0x04, 0xe4, 0x93, 0xd8, 0x09, 0x4d,
0x99, 0xa5, 0xa5, 0xd7, 0xa8, 0xd9, 0x11, 0x99, 0x5f, 0x70, 0x57, 0xce, 0x83, 0xf0, 0x49, 0xfc,
0x28, 0xb7, 0x34, 0xd7, 0x5d, 0x5b, 0xb8, 0xf4, 0xf2, 0x91, 0x8d, 0xc0, 0xad, 0xf1, 0x95, 0x2e,
0xd8, 0x87, 0xf2, 0x48, 0xc0, 0xfc, 0x24, 0xb6, 0x42, 0xd1, 0x0b, 0x47, 0x36, 0x98, 0xb6, 0x76,
0xdf, 0x5d, 0x1a, 0xe7, 0xe2, 0xc4, 0x1b, 0x84, 0xa2, 0x13, 0x0e, 0xce, 0x6b, 0x33, 0x11, 0xf9,
0xe0, 0xd2, 0x0b, 0x8f, 0x85, 0xfc, 0x43, 0xb7, 0x41, 0x6e, 0xc5, 0xb2, 0x78, 0x27, 0x3e, 0xc8,
0x5b, 0x69, 0x8d, 0xd4, 0x15, 0x48, 0x53, 0x95, 0x6a, 0x58, 0xb2, 0x36, 0xde, 0x18, 0x83, 0x14,
0x34, 0x77, 0x18, 0x57, 0xff, 0xa3, 0x89, 0xc6, 0x50, 0x92, 0x1b, 0x96, 0x2c, 0x10, 0x8a, 0x2f,
0x2e, 0x95, 0xfc, 0x17, 0x65, 0x8f, 0x31, 0x6e, 0x83, 0x40, 0x10, 0x00, 0xe7, 0x4c, 0x14, 0xae,
0x0a, 0x94, 0x5b, 0x58, 0xe1, 0x0b, 0x2e, 0xa9, 0x30, 0x4e, 0x1a, 0x3f, 0x63, 0x95, 0x7c, 0x80,
0x74, 0x54, 0x0e, 0x4f, 0x48, 0x49, 0xe7, 0xaf, 0xdc, 0x33, 0x52, 0xf2, 0x04, 0xca, 0xeb, 0x1c,
0xaf, 0x40, 0x27, 0x11, 0x4b, 0xd3, 0xec, 0xdc, 0x68, 0x4f, 0x0b, 0x84, 0x23, 0xaa, 0x94, 0x81,
0xf1, 0xca, 0xf9, 0x87, 0xf3, 0xc8, 0xef, 0x95, 0xb2, 0x44, 0x85, 0x21, 0x47, 0xe1, 0x42, 0xc8,
0xe9, 0x9f, 0x8c, 0x90, 0x43, 0x83, 0x49, 0xe2, 0xb7, 0xe1, 0x4f, 0x86, 0x7c, 0x32, 0x37, 0xb0,
0x07, 0x42, 0x41, 0x57, 0x23, 0x8a, 0x6f, 0x0d, 0x69, 0x53, 0xba, 0x0a, 0xe5, 0x70, 0x60, 0xaa,
0xb6, 0x1b, 0x8c, 0x24, 0x76, 0x0b, 0x69, 0x59, 0xb9, 0x2c, 0x7b, 0x33, 0xe4, 0x02, 0x4d, 0x4a,
0x71, 0x24, 0x6c, 0xb4, 0x6e, 0xf9, 0x89, 0xdd, 0x9d, 0x78, 0xcb, 0xe2, 0x8d, 0x14, 0x67, 0x84,
0x9c, 0x6e, 0x8f, 0x74, 0x56, 0x24, 0xdd, 0x2e, 0x24, 0x31, 0x63, 0x77, 0xd3, 0x43, 0x07, 0xaf,
0x4c, 0x8e, 0x1e, 0xf3, 0xeb, 0xbb, 0xd9, 0xe0, 0xe0, 0x05, 0xea, 0xd5, 0x60, 0xf7, 0x6c, 0xae,
0x56, 0x1b, 0x43, 0xb1, 0xbd, 0x09, 0xc9, 0x98, 0x1d, 0x8f, 0xf5, 0xe4, 0xba, 0xda, 0xfd, 0xab,
0x9f, 0x91, 0x8a, 0xf9, 0x0b, 0x5a, 0x60, 0x56, 0xc6, 0x13, 0xfe, 0x1d, 0xff, 0x81, 0x34, 0xe0,
0x3d, 0x2c, 0x58, 0xcd, 0x0a, 0xb1, 0x22, 0x1e, 0x41, 0xa1, 0x35, 0xd0, 0xfb, 0x28, 0x10, 0x1d,
0x43, 0x05, 0xbd, 0x31, 0x14, 0x44, 0xf0, 0x7f, 0x6d, 0x8f, 0x81, 0x66, 0xc4, 0x60, 0x10, 0x84,
0xbf, 0x34, 0xe7, 0xf2, 0xa3, 0xae, 0x00, 0x41, 0xab, 0xd0, 0x07, 0xe8, 0x01, 0xa1, 0xb8, 0xe5,
0x4e, 0x5b, 0xf4, 0x19, 0x2a, 0xe8, 0x03, 0x04, 0x10, 0x94, 0x7f, 0x01, 0x7d, 0xac, 0x7d, 0x8c,
0x03, 0xe4, 0x31, 0x7e, 0x20, 0xed, 0x08, 0x41, 0x94, 0xb1, 0xec, 0xec, 0xec, 0x98, 0x69, 0xa1,
0xd4, 0x70, 0x82, 0x41, 0xb3, 0x54, 0x8c, 0x10, 0x0d, 0x7c, 0x0b, 0x71, 0xc7, 0x88, 0xd1, 0x0d,
0x4c, 0xf7, 0x78, 0x83, 0xf6, 0x8e, 0xd4, 0x27, 0x90, 0xac, 0x82, 0x4c, 0xd4, 0x8c, 0xd0, 0x62,
0xa4, 0x81, 0xf4, 0xc9, 0xcf, 0x99, 0x62, 0x74, 0x06, 0x94, 0xb9, 0x6a, 0xa9, 0xd2, 0x82, 0xf5,
0xe5, 0x00, 0x23, 0x98, 0x38, 0x74, 0xff, 0x53, 0x01, 0xd4, 0x4c, 0xf0, 0x0c, 0x83, 0x54, 0x5a,
0xa9, 0xfe, 0x03, 0xb7, 0xd0, 0x02, 0x0a, 0xf6, 0x81, 0x5d, 0x88, 0x27, 0x3c, 0x03, 0x25, 0x13,
0x2f, 0x98, 0x09, 0xd1, 0xe3, 0x27, 0xd0, 0x88, 0x5e, 0x84, 0xb0, 0xd9, 0xfd, 0xa8, 0x97, 0x85,
0xfb, 0x42, 0x46, 0x17, 0xfc, 0x0d, 0xf6, 0x06, 0x53, 0xd6, 0xed, 0x1d, 0x12, 0x12, 0xdc, 0x44,
0xbf, 0x33, 0x13, 0xfc, 0x58, 0x87, 0xe2, 0x52, 0x54, 0x1c, 0x43, 0x08, 0x96, 0x04, 0xd7, 0x0c,
0xbb, 0xeb, 0xdc, 0x2c, 0x67, 0x0e, 0xb0, 0xc7, 0x1f, 0x88, 0x01, 0x6c, 0xe1, 0x20, 0x32, 0xbe,
0xfe, 0x65, 0xfd, 0x05, 0xab, 0xc7, 0xf6, 0x2e, 0x6e, 0x93, 0x5a, 0x66, 0x8f, 0x40, 0xcc, 0x8d,
0x6f, 0xda, 0x6e, 0xda, 0x49, 0xb2, 0x1a, 0x06, 0x18, 0xe0, 0x67, 0xec, 0x55, 0x5d, 0xad, 0xfb,
0x05, 0x64, 0xcd, 0x25, 0xd4, 0x14, 0x51, 0x14, 0x00, 0xe0, 0x6f, 0x04, 0x77, 0x77, 0x6b, 0x34,
0xdc, 0xed, 0xe1, 0x14, 0xa4, 0xe1, 0x9a, 0x88, 0xd3, 0x70, 0x66, 0xe2, 0xf6, 0x44, 0x4f, 0xf4,
0x1e, 0xee, 0x21, 0x6d, 0x4f, 0x1b, 0x87, 0x46, 0x1c, 0x12, 0x6e, 0x0f, 0x87, 0xff, 0x9c, 0xef,
0xe9, 0xb5, 0x44, 0x7f, 0xc4, 0xd0, 0x4a, 0x09, 0x71, 0x84, 0x5b, 0x24, 0xd9, 0x56, 0xd1, 0x06,
0x31, 0x83, 0xc7, 0x34, 0xac, 0x17, 0x55, 0x10, 0x0b, 0xb8, 0x9f, 0xc5, 0x0c, 0x51, 0x70, 0x84,
0x86, 0xc3, 0xa2, 0x92, 0xc4, 0x2d, 0xdd, 0x06, 0xe6, 0xeb, 0x0e, 0x88, 0x5b, 0xa1, 0x8e, 0x19,
0xb5, 0x83, 0x95, 0xa1, 0x90, 0xcb, 0x25, 0xa9, 0x91, 0xae, 0x89, 0xd3, 0x22, 0x41, 0xad, 0xff,
0xe2, 0xed, 0xeb, 0x62, 0xa6, 0x02, 0xc0, 0xdb, 0x2f, 0x33, 0x30, 0x53, 0x31, 0x7c, 0x28, 0xfa,
0x96, 0x1a, 0x0a, 0x59, 0x45, 0x29, 0xab, 0x10, 0x1f, 0xab, 0x18, 0x2a, 0x74, 0x33, 0xf4, 0x1b,
0x6c, 0x5c, 0x68, 0x6f, 0x93, 0x77, 0xdc, 0x31, 0xb4, 0x56, 0x1e, 0x33, 0x33, 0x23, 0x21, 0x2d,
0xd7, 0xad, 0x12, 0x0b, 0xa5, 0x85, 0x79, 0x8f, 0x75, 0xd2, 0x62, 0xec, 0x5d, 0xac, 0x5f, 0x4c,
0x2b, 0x76, 0xb8, 0xbf, 0xd8, 0x4c, 0x00, 0x6f, 0x5f, 0xce, 0xc0, 0x70, 0xdc, 0xe4, 0x84, 0xd1,
0x37, 0x4f, 0xd8, 0x01, 0xcc, 0xe4, 0xcf, 0x25, 0x16, 0xe4, 0x91, 0x0b, 0x37, 0x9a, 0x9c, 0x77,
0xf7, 0x92, 0xcd, 0x17, 0xb2, 0xbd, 0x17, 0xf2, 0xcf, 0xd6, 0xad, 0x62, 0x2d, 0x5e, 0xf1, 0x9c,
0xb7, 0x30, 0x9f, 0x35, 0x6c, 0x62, 0x2e, 0xf9, 0x02, 0xe5, 0xbf, 0xd6, 0xab, 0xfd, 0xf1, 0xa7,
0xff, 0xca, 0x64, 0x7c, 0xde, 0x99, 0x63, 0xc6, 0xe7, 0x3c, 0xbb, 0xfc, 0xbb, 0x7f, 0xc9, 0x54,
0x1a, 0x46, 0xb2, 0x01, 0x8e, 0x66, 0xfd, 0xcd, 0xbc, 0xcb, 0x3a, 0x5e, 0xf0, 0x75, 0x8b, 0x18,
0x18, 0xe6, 0x01, 0x00, 0x45, 0xcd, 0x01, 0xa7, 0x14, 0x51, 0x14, 0xc0, 0xf1, 0xdf, 0xec, 0xdc,
0xde, 0xdc, 0x97, 0x65, 0x97, 0x92, 0x41, 0x12, 0x3d, 0x40, 0xd8, 0x80, 0x82, 0xcc, 0x0a, 0x02,
0x02, 0x10, 0x30, 0xe9, 0x0b, 0x0c, 0xa0, 0xf2, 0xbc, 0x5d, 0xfb, 0xa0, 0x8f, 0x75, 0xab, 0x3e,
0xd0, 0x10, 0x99, 0xf2, 0xb4, 0xed, 0x61, 0x58, 0xfe, 0xc6, 0x7f, 0xfe, 0xe7, 0x38, 0x17, 0x57,
0x55, 0x70, 0x57, 0x61, 0x4d, 0x46, 0x39, 0x36, 0x06, 0x3a, 0xc1, 0x46, 0xd9, 0x61, 0xac, 0x4d,
0x8d, 0xe0, 0x58, 0x67, 0xf1, 0x85, 0x3a, 0x90, 0xec, 0x53, 0x48, 0x98, 0x0b, 0xfe, 0x61, 0xe2,
0x6b, 0x60, 0x80, 0x17, 0x3c, 0x21, 0xcd, 0x62, 0x89, 0x35, 0x53, 0x4d, 0x4f, 0xcb, 0x85, 0x7d,
0xa5, 0xdf, 0x68, 0xaf, 0xd8, 0xf1, 0x74, 0x9e, 0xbf, 0x61, 0xe0, 0x31, 0x8d, 0x52, 0x19, 0x3a,
0xed, 0x07, 0xde, 0xf3, 0xce, 0xc2, 0xdb, 0xc0, 0xf4, 0x91, 0x57, 0x2c, 0xa9, 0x95, 0x8d, 0xcd,
0x73, 0xf9, 0xd9, 0x7c, 0xa2, 0x30, 0xd6, 0xda, 0x45, 0x59, 0x2e, 0xc4, 0x94, 0x3b, 0xb7, 0x2b,
0xbf, 0xb3, 0x31, 0xdb, 0xaf, 0xb8, 0xa6, 0x88, 0x1c, 0x7f, 0x63, 0x8e, 0xc9, 0xed, 0x9c, 0xf5,
0xdc, 0xf8, 0xde, 0xf8, 0x9c, 0x4e, 0x84, 0x78, 0x4d, 0x2f, 0xb2, 0x1f, 0x91, 0x7d, 0x89, 0xac,
0x3a, 0xe7, 0x6f, 0x8d, 0x4f, 0x29, 0x38, 0x89, 0x73, 0xfe, 0xd9, 0xb8, 0x89, 0xed, 0x10, 0x73,
0x76, 0x2d, 0x9e, 0xbc, 0xa7, 0x4d, 0xa6, 0x5d, 0x90, 0xb7, 0x33, 0x94, 0x95, 0xe1, 0xa5, 0xb6,
0x4f, 0xb9, 0xa4, 0xdc, 0x35, 0x6d, 0x87, 0xf1, 0xe8, 0xd7, 0xd1, 0xa3, 0x83, 0x75, 0x20, 0x42,
0xf0, 0xf0, 0x10, 0xed, 0xc1, 0x81, 0xb8, 0xf1, 0x77, 0xe7, 0x72, 0x1b, 0xdc, 0xdf, 0x12, 0xe1,
0xcf, 0x7c, 0x37, 0x1a, 0x97, 0x5d, 0x6c, 0xe4, 0x0e, 0x39, 0xf4, 0x14, 0xfe, 0x03, 0x6d, 0x8d,
0x81, 0x66, 0xc3, 0x50, 0x18, 0x46, 0x4f, 0x92, 0x6d, 0xbd, 0x9d, 0xda, 0x62, 0xa8, 0xb6, 0x43,
0x86, 0x3e, 0x40, 0x28, 0x04, 0xe8, 0xad, 0x45, 0x15, 0xc1, 0x30, 0x14, 0xd8, 0x7d, 0x84, 0x32,
0xb8, 0x18, 0xf9, 0x01, 0x05, 0x0c, 0xb0, 0xc7, 0xb9, 0x05, 0x0a, 0xd8, 0x03, 0x0c, 0x79, 0x84,
0x32, 0xc8, 0xc0, 0xe6, 0x67, 0x11, 0x63, 0x1c, 0xe1, 0x3b, 0x27, 0x7f, 0x72, 0x06, 0x37, 0xc2,
0xe7, 0x37, 0x63, 0x89, 0x60, 0x68, 0x69, 0x6b, 0x7d, 0x46, 0xb4, 0xb5, 0x62, 0x56, 0xca, 0xc4,
0x91, 0xe7, 0x34, 0x19, 0xfc, 0xea, 0x67, 0x38, 0x44, 0xc4, 0x57, 0xc4, 0x05, 0x5f, 0x6a, 0x80,
0xb0, 0xa4, 0xd9, 0xb1, 0x08, 0x8c, 0x85, 0x54, 0xc8, 0x83, 0x4e, 0xc9, 0xba, 0xa2, 0x22, 0x15,
0x8d, 0x8b, 0xbe, 0x34, 0x19, 0xbb, 0x82, 0x99, 0x63, 0x68, 0x95, 0x99, 0xd3, 0x19, 0xae, 0xbb,
0xc2, 0xad, 0x16, 0x2e, 0xff, 0x29, 0x53, 0x87, 0xb1, 0xca, 0xb4, 0x2f, 0x62, 0x90, 0x73, 0x48,
0x60, 0x80, 0x8c, 0xc0, 0x00, 0xcd, 0x13, 0x3b, 0xcf, 0xc4, 0x63, 0xd6, 0xec, 0x57, 0x78, 0x87,
0x2f, 0x38, 0xea, 0xdb, 0xa7, 0x25, 0xa7, 0x9a, 0x24, 0x70, 0x21, 0x20, 0x10, 0x74, 0x42, 0x9b,
0xd1, 0x2e, 0xc1, 0x11, 0x5b, 0x12, 0x0b, 0x4e, 0x67, 0xa7, 0x13, 0x47, 0x64, 0x95, 0xf8, 0x8f,
0x8e, 0x1c, 0x58, 0xb4, 0xa8, 0x36, 0xe0, 0x21, 0x44, 0xc4, 0x35, 0x87, 0x04, 0x0f, 0x13, 0xa0,
0xad, 0x95, 0x3b, 0xa3, 0xb8, 0x11, 0x61, 0x00, 0xfa, 0xc3, 0x02, 0x8c, 0x65, 0x7f, 0x4f, 0xbb,
0x26, 0x7f, 0x81, 0x14, 0xc0, 0x53, 0x55, 0x6c, 0x4b, 0xde, 0xe7, 0x48, 0x8d, 0x0a, 0x6c, 0xc5,
0x43, 0xc9, 0xb1, 0x17, 0xdb, 0x8a, 0x8d, 0x0a, 0x5e, 0x55, 0xa4, 0x9e, 0x4d, 0x77, 0xf2, 0xa6,
0x02, 0x15, 0xd8, 0x92, 0x30, 0x67, 0xdf, 0x9f, 0x3c, 0x96, 0x7c, 0xe8, 0x37, 0x7e, 0x00, 0x55,
0xce, 0x21, 0x6c, 0x83, 0x40, 0x14, 0x87, 0xf1, 0x8f, 0x40, 0xc6, 0x89, 0x09, 0x64, 0x67, 0x36,
0x33, 0x9f, 0xf9, 0x2d, 0xe1, 0x09, 0xb2, 0x21, 0x2a, 0x90, 0x95, 0x47, 0x82, 0xcf, 0xe4, 0xdc,
0x21, 0x2b, 0x2b, 0xeb, 0xbd, 0xd7, 0x4f, 0x9e, 0x98, 0x40, 0xe2, 0xf5, 0x44, 0xe5, 0x5c, 0x9b,
0x77, 0x29, 0x21, 0x24, 0x7f, 0xc3, 0x8f, 0x8f, 0x17, 0x00, 0x7e, 0x90, 0x3d, 0xd2, 0xa0, 0xaf,
0x8c, 0x35, 0x3a, 0x20, 0x8d, 0x6d, 0xfc, 0x82, 0x07, 0x48, 0xe6, 0x0b, 0xd1, 0x42, 0xa4, 0x14,
0xd2, 0xf3, 0xef, 0xc0, 0xa1, 0x61, 0xda, 0x36, 0x03, 0x5d, 0x43, 0xdc, 0xd8, 0x3c, 0xd0, 0x26,
0x3b, 0xad, 0x16, 0xd3, 0x7d, 0x6d, 0x38, 0x9a, 0x39, 0x98, 0x03, 0x15, 0x30, 0x05, 0x5c, 0x05,
0x31, 0xe0, 0xa0, 0x72, 0xa0, 0x01, 0xc0, 0x01, 0xd4, 0x9c, 0x7a, 0xce, 0x62, 0xfb, 0xeb, 0xed,
0x48, 0x7a, 0x7b, 0xce, 0x69, 0xa1, 0x83, 0x09, 0x8e, 0x61, 0xf9, 0x53, 0x5a, 0xa1, 0x13, 0xf4,
0x1b, 0x5e, 0x16, 0x33, 0x38, 0x6c, 0x6c, 0xb2, 0xce, 0x36, 0xad, 0x36, 0x2f, 0xdf, 0xce, 0xab,
0x45, 0x8f, 0x88, 0x2d, 0xde, 0x8d, 0xcc, 0xe6, 0x9f, 0x20, 0x5b, 0xc6, 0x78, 0xb5, 0xd3, 0xb2,
0x47, 0x3e, 0xd1, 0x1e, 0xb1, 0x4e, 0x6b, 0xf0, 0x38, 0xa1, 0x12, 0x78, 0x43, 0xc3, 0x62, 0x06,
0x3b, 0xc1, 0xad, 0x56, 0x59, 0x97, 0xd2, 0xd5, 0x9c, 0x07, 0x81, 0x7b, 0xa7, 0x14, 0x5a, 0x16,
0x7c, 0xe4, 0xbb, 0x4b, 0xf6, 0xf8, 0x8c, 0xe6, 0xc0, 0xff, 0xb5, 0xd4, 0x77, 0x44, 0x6c, 0xea,
0x19, 0x6b, 0xa5, 0x88, 0x29, 0xe2, 0x92, 0x39, 0x8b, 0x6e,
};
static const uint8_t FONT_1_DESCRIPTOR[] = {
0x10, 0x13, 0x20, 0xe0, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0d, 0x06,
0x00, 0x15, 0x17, 0x08, 0x00, 0x2c, 0x14, 0x08, 0x00, 0x40, 0x20, 0x0b, 0x00, 0x60, 0x1a, 0x09,
0x00, 0x7a, 0x04, 0x03, 0x00, 0x7e, 0x0c, 0x05, 0x00, 0x8a, 0x0b, 0x05, 0x00, 0x95, 0x10, 0x07,
0x00, 0xa5, 0x14, 0x08, 0x00, 0xb9, 0x08, 0x04, 0x00, 0xc1, 0x0b, 0x05, 0x00, 0xcc, 0x08, 0x04,
0x00, 0xd4, 0x10, 0x06, 0x00, 0xe4, 0x14, 0x08, 0x00, 0xf8, 0x0e, 0x08, 0x01, 0x06, 0x14, 0x08,
0x01, 0x1a, 0x14, 0x08, 0x01, 0x2e, 0x14, 0x08, 0x01, 0x42, 0x14, 0x08, 0x01, 0x56, 0x14, 0x08,
0x01, 0x6a, 0x13, 0x08, 0x01, 0x7d, 0x14, 0x08, 0x01, 0x91, 0x14, 0x08, 0x01, 0xa5, 0x08, 0x04,
0x01, 0xad, 0x08, 0x04, 0x01, 0xb5, 0x14, 0x08, 0x01, 0xc9, 0x14, 0x08, 0x01, 0xdd, 0x14, 0x08,
0x01, 0xf1, 0x0d, 0x06, 0x02, 0x00, 0x20, 0x0c, 0x02, 0x20, 0x17, 0x08, 0x02, 0x37, 0x17, 0x08,
0x02, 0x4e, 0x14, 0x08, 0x02, 0x62, 0x17, 0x09, 0x02, 0x79, 0x11, 0x07, 0x02, 0x8a, 0x11, 0x07,
0x02, 0x9b, 0x1a, 0x0a, 0x02, 0xb5, 0x17, 0x0a, 0x02, 0xcc, 0x0b, 0x05, 0x02, 0xd7, 0x0b, 0x05,
0x02, 0xe2, 0x17, 0x08, 0x02, 0xf9, 0x11, 0x07, 0x03, 0x0a, 0x20, 0x0c, 0x03, 0x2a, 0x1a, 0x0a,
0x03, 0x44, 0x1a, 0x0a, 0x03, 0x5e, 0x14, 0x08, 0x03, 0x72, 0x1a, 0x0a, 0x03, 0x8c, 0x17, 0x08,
0x03, 0xa3, 0x14, 0x07, 0x03, 0xb7, 0x13, 0x07, 0x03, 0xca, 0x17, 0x09, 0x03, 0xe1, 0x16, 0x08,
0x04, 0x00, 0x22, 0x0d, 0x04, 0x22, 0x14, 0x07, 0x04, 0x36, 0x13, 0x07, 0x04, 0x49, 0x11, 0x07,
0x04, 0x5a, 0x0f, 0x05, 0x04, 0x69, 0x11, 0x06, 0x04, 0x7a, 0x0c, 0x05, 0x04, 0x86, 0x14, 0x08,
0x04, 0x9a, 0x15, 0x07, 0x04, 0xaf, 0x07, 0x04, 0x04, 0xb6, 0x11, 0x07, 0x04, 0xc7, 0x14, 0x08,
0x04, 0xdb, 0x10, 0x06, 0x04, 0xeb, 0x14, 0x08, 0x04, 0xff, 0x14, 0x07, 0x05, 0x13, 0x0d, 0x05,
0x05, 0x20, 0x15, 0x08, 0x05, 0x35, 0x14, 0x08, 0x05, 0x49, 0x05, 0x04, 0x05, 0x4e, 0x06, 0x04,
0x05, 0x54, 0x14, 0x07, 0x05, 0x68, 0x05, 0x04, 0x05, 0x6d, 0x20, 0x0c, 0x05, 0x8d, 0x14, 0x08,
0x05, 0xa1, 0x14, 0x08, 0x05, 0xb5, 0x14, 0x08, 0x05, 0xc9, 0x15, 0x08, 0x05, 0xde, 0x0d, 0x05,
0x05, 0xeb, 0x0e, 0x06, 0x06, 0x00, 0x0b, 0x05, 0x06, 0x0b, 0x14, 0x08, 0x06, 0x1f, 0x11, 0x07,
0x06, 0x30, 0x1d, 0x0b, 0x06, 0x4d, 0x11, 0x07, 0x06, 0x5e, 0x11, 0x07, 0x06, 0x6f, 0x0e, 0x06,
0x06, 0x7d, 0x0f, 0x06, 0x06, 0x8c, 0x0c, 0x07, 0x06, 0x98, 0x0e, 0x06, 0x06, 0xa6, 0x14, 0x08,
0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x10,
0xff, 0xff, 0x00, 0x10, 0xff, 0xff, 0x00, 0x03, 0x06, 0xba, 0x09, 0x04, 0x06, 0xc3, 0x11, 0x08,
0x06, 0xd4, 0x14, 0x08, 0x06, 0xe8, 0x17, 0x09, 0x06, 0xff, 0x13, 0x08, 0x07, 0x12, 0x0c, 0x07,
0x07, 0x1e, 0x11, 0x07, 0x07, 0x2f, 0x10, 0x09, 0x07, 0x3f, 0x23, 0x0d, 0x07, 0x62, 0x0a, 0x05,
0x07, 0x6c, 0x14, 0x08, 0x07, 0x80, 0x14, 0x08, 0x07, 0x94, 0x0b, 0x05, 0x07, 0x9f, 0x23, 0x0d,
0x07, 0xc2, 0x13, 0x07, 0x07, 0xd5, 0x0d, 0x06, 0x07, 0xe2, 0x14, 0x08, 0x07, 0xf6, 0x0a, 0x05,
0x08, 0x00, 0x0b, 0x05, 0x08, 0x0b, 0x07, 0x04, 0x08, 0x12, 0x14, 0x08, 0x08, 0x26, 0x15, 0x09,
0x08, 0x3b, 0x08, 0x04, 0x08, 0x43, 0x09, 0x03, 0x08, 0x4c, 0x0a, 0x05, 0x08, 0x56, 0x0d, 0x05,
0x08, 0x63, 0x14, 0x08, 0x08, 0x77, 0x20, 0x0c, 0x08, 0x97, 0x20, 0x0c, 0x08, 0xb7, 0x23, 0x0c,
0x08, 0xda, 0x0f, 0x06, 0x08, 0xe9, 0x17, 0x08, 0x09, 0x00, 0x17, 0x08, 0x09, 0x17, 0x17, 0x08,
0x09, 0x2e, 0x17, 0x08, 0x09, 0x45, 0x17, 0x08, 0x09, 0x5c, 0x17, 0x08, 0x09, 0x73, 0x1d, 0x0b,
0x09, 0x90, 0x14, 0x08, 0x09, 0xa4, 0x11, 0x07, 0x09, 0xb5, 0x11, 0x07, 0x09, 0xc6, 0x11, 0x07,
0x09, 0xd7, 0x11, 0x07, 0x09, 0xe8, 0x0b, 0x05, 0x09, 0xf3, 0x0b, 0x05, 0x0a, 0x00, 0x0b, 0x05,
0x0a, 0x0b, 0x0b, 0x05, 0x0a, 0x16, 0x17, 0x09, 0x0a, 0x2d, 0x1a, 0x0a, 0x0a, 0x47, 0x1a, 0x0a,
0x0a, 0x61, 0x1a, 0x0a, 0x0a, 0x7b, 0x1a, 0x0a, 0x0a, 0x95, 0x1a, 0x0a, 0x0a, 0xaf, 0x1a, 0x0a,
0x0a, 0xc9, 0x14, 0x08, 0x0a, 0xdd, 0x1a, 0x0a, 0x0a, 0xf7, 0x17, 0x09, 0x0b, 0x0e, 0x17, 0x09,
0x0b, 0x25, 0x17, 0x09, 0x0b, 0x3c, 0x17, 0x09, 0x0b, 0x53, 0x13, 0x07, 0x0b, 0x66, 0x14, 0x08,
0x0b, 0x7a, 0x17, 0x08, 0x0b, 0x91, 0x11, 0x07, 0x0b, 0xa2, 0x11, 0x07, 0x0b, 0xb3, 0x11, 0x07,
0x0b, 0xc4, 0x11, 0x07, 0x0b, 0xd5, 0x11, 0x07, 0x0b, 0xe6, 0x11, 0x07, 0x0c, 0x00, 0x20, 0x0b,
0x0c, 0x20, 0x10, 0x06, 0x0c, 0x30, 0x14, 0x07, 0x0c, 0x44, 0x14, 0x07, 0x0c, 0x58, 0x14, 0x07,
0x0c, 0x6c, 0x14, 0x07, 0x0c, 0x80, 0x07, 0x04, 0x0c, 0x87, 0x07, 0x04, 0x0c, 0x8e, 0x0a, 0x04,
0x0c, 0x98, 0x0a, 0x04, 0x0c, 0xa2, 0x14, 0x08, 0x0c, 0xb6, 0x14, 0x08, 0x0c, 0xca, 0x14, 0x08,
0x0c, 0xde, 0x14, 0x08, 0x0c, 0xf2, 0x14, 0x08, 0x0d, 0x06, 0x14, 0x08, 0x0d, 0x1a, 0x14, 0x08,
0x0d, 0x2e, 0x14, 0x08, 0x0d, 0x42, 0x14, 0x08, 0x0d, 0x56, 0x14, 0x08, 0x0d, 0x6a, 0x14, 0x08,
0x0d, 0x7e, 0x14, 0x08, 0x0d, 0x92, 0x14, 0x08, 0x0d, 0xa6, 0x11, 0x07, 0x0d, 0xb7, 0x14, 0x08,
0x0d, 0xcb, 0x11, 0x07,
};
static const uint16_t FONT_1_OFFSETS[] = {
0, 276, 504, 737, 1012, 1278, 1551, 1786,
};
static const uint16_t FONT_1_LENGTHS[] = {
510, 503, 505, 512, 510, 503, 476,
};
static const Font FONT_1 = { FONT_1_DESCRIPTOR, FONT_1_DATA, FONT_1_OFFSETS, FONT_1_LENGTHS, 7, 1786 };
return FONT_1;
}
// Authoritative raw bitmap SHA256: de86a8dff7e9e25bed0bd0c782c9db31868b052b02001408a85e9d01bef3ab7f
inline const Font& fontStorage2() {
static const uint8_t FONT_2_DATA[] = {
0x65, 0xcf, 0x01, 0xc6, 0x15, 0x51, 0x18, 0x06, 0xe0, 0x67, 0x9a, 0x38, 0xc5, 0x5f, 0x07, 0xe0,
0xa6, 0x6a, 0xa6, 0x1d, 0x4c, 0xc0, 0xfc, 0xc4, 0x6c, 0x65, 0x76, 0x50, 0x3b, 0xb8, 0x07, 0x01,
0xca, 0xbf, 0x95, 0x96, 0x70, 0x08, 0x41, 0x8b, 0x38, 0x4b, 0x18, 0xc0, 0x45, 0xee, 0xf4, 0x5d,
0x18, 0x74, 0xf1, 0xf8, 0xde, 0xf7, 0x05, 0x3e, 0x80, 0xb6, 0x3f, 0x0a, 0x30, 0xa2, 0xa5, 0x00,
0x40, 0x74, 0x81, 0x8e, 0x6f, 0xe1, 0xfb, 0x23, 0x7f, 0x17, 0x6d, 0xef, 0xb4, 0x1f, 0xb7, 0xfe,
0x91, 0x3f, 0x8b, 0xb2, 0xf7, 0xda, 0xd3, 0xad, 0x87, 0xe7, 0x20, 0x3f, 0x28, 0xc3, 0x0b, 0xf5,
0xcd, 0x49, 0x9d, 0x4e, 0xb6, 0xfd, 0xac, 0xae, 0xa7, 0xf0, 0xa0, 0xd6, 0xac, 0x94, 0x04, 0x65,
0xa1, 0x9e, 0x59, 0xab, 0x30, 0x46, 0x9e, 0x63, 0xcb, 0xd4, 0x9e, 0x0d, 0x1f, 0x28, 0xbf, 0xb3,
0xb6, 0x0d, 0xc6, 0x69, 0x22, 0xd8, 0x16, 0x6a, 0x06, 0x25, 0x2b, 0xbf, 0x06, 0xf5, 0xcb, 0x6c,
0xfd, 0x3c, 0x59, 0xbf, 0x86, 0xcb, 0xa4, 0x3e, 0xbd, 0x55, 0xd2, 0x80, 0xd7, 0xd4, 0x25, 0x7c,
0xc2, 0x78, 0xff, 0xe4, 0x96, 0xb8, 0x2e, 0x4a, 0xbe, 0x68, 0x5d, 0xe9, 0x47, 0x9e, 0xc1, 0xed,
0x36, 0xa5, 0x8f, 0x9d, 0xeb, 0x99, 0x2d, 0x41, 0xe9, 0xc2, 0xcb, 0xf0, 0x9e, 0x9f, 0x89, 0xad,
0xa7, 0xe4, 0xf0, 0x2a, 0x74, 0x01, 0x4c, 0xff, 0xd9, 0x93, 0xc0, 0xe4, 0x00, 0xb5, 0xe3, 0x12,
0x66, 0x50, 0xba, 0x7b, 0x00, 0xb3, 0x70, 0x44, 0x03, 0x35, 0x71, 0x39, 0xa2, 0x06, 0xae, 0xbd,
0xb2, 0x67, 0xb5, 0x7b, 0x67, 0x35, 0x1d, 0x9a, 0x59, 0xdd, 0x07, 0xf6, 0xf4, 0x0f, 0x85, 0xcf,
0x01, 0x66, 0x03, 0x41, 0x18, 0x05, 0xe0, 0x6f, 0x3b, 0x24, 0x40, 0x36, 0x80, 0xa5, 0xd5, 0xf4,
0x08, 0x43, 0xd0, 0x05, 0x49, 0x8e, 0x32, 0x47, 0x08, 0x20, 0x28, 0x5d, 0x8a, 0x42, 0x0f, 0x35,
0x37, 0x28, 0x40, 0x00, 0x73, 0x84, 0x02, 0x16, 0xd5, 0x6d, 0x87, 0x15, 0x0b, 0x14, 0x1f, 0x3c,
0x8f, 0xf7, 0xff, 0x00, 0x02, 0x43, 0x43, 0x46, 0xf9, 0x39, 0x2a, 0xd3, 0x11, 0x4e, 0xa2, 0xac,
0x97, 0x1c, 0x24, 0xcf, 0xd2, 0xb0, 0x97, 0x4a, 0x54, 0x2e, 0x51, 0x3e, 0x46, 0xd6, 0x11, 0x4e,
0xb6, 0xb2, 0x28, 0xc5, 0x85, 0x73, 0x54, 0x5e, 0x3a, 0xf9, 0x73, 0xc7, 0x5b, 0x4b, 0x20, 0x07,
0x4a, 0xa0, 0x0f, 0x6c, 0x82, 0x21, 0x04, 0x59, 0x50, 0xc7, 0x2a, 0xc2, 0x0c, 0x5b, 0x65, 0x17,
0x95, 0xfb, 0x28, 0x75, 0x0b, 0xb1, 0x93, 0xbe, 0x76, 0xe4, 0x35, 0x18, 0x03, 0x53, 0x2b, 0xef,
0x1f, 0xe4, 0xed, 0xa2, 0xd6, 0xf7, 0xb5, 0x46, 0x69, 0x21, 0xdd, 0xcc, 0xaf, 0xe4, 0x56, 0x1a,
0x1b, 0xe9, 0x50, 0x1b, 0x94, 0x06, 0xf5, 0xca, 0x7a, 0xad, 0xf2, 0xdd, 0x4b, 0x97, 0xc5, 0x17,
0x63, 0xac, 0xb9, 0xe1, 0xbd, 0x05, 0x75, 0xfd, 0x35, 0x2a, 0x29, 0x4a, 0x79, 0x76, 0xea, 0xe4,
0xf4, 0x28, 0x4f, 0x2d, 0x53, 0x03, 0x60, 0xd3, 0x57, 0x40, 0x6e, 0x6c, 0xc6, 0x3f, 0x3d, 0x78,
0xc2, 0x79, 0x76, 0xc5, 0x47, 0xd5, 0xb0, 0xaa, 0x02, 0xe1, 0x0e, 0x35, 0xfa, 0x1f, 0xc2, 0x8a,
0x55, 0xa8, 0x6e, 0xb1, 0xab, 0x6a, 0x5e, 0xf9, 0x05, 0x65, 0xce, 0x01, 0x66, 0xc3, 0x50, 0x18,
0xc0, 0xf1, 0x5f, 0x94, 0x04, 0x58, 0x7a, 0x80, 0x91, 0x1e, 0xe1, 0x01, 0x32, 0x58, 0xc3, 0x2e,
0xf2, 0x76, 0x83, 0x02, 0x06, 0xc8, 0xec, 0x00, 0x3b, 0x42, 0xaf, 0xf2, 0x66, 0x0c, 0xa0, 0x47,
0xd8, 0x3b, 0x42, 0x01, 0x45, 0x35, 0x4b, 0x84, 0x2d, 0x16, 0xfc, 0x78, 0x92, 0xef, 0xfb, 0xfc,
0x3b, 0xc4, 0x89, 0xad, 0x98, 0x1f, 0xc4, 0xc3, 0x56, 0x6e, 0x49, 0x0d, 0x7d, 0x05, 0xce, 0x1b,
0x6e, 0x0d, 0x55, 0xab, 0x2f, 0x0e, 0xd2, 0xf9, 0x59, 0x77, 0xfd, 0x14, 0xef, 0xbe, 0xc4, 0x72,
0x32, 0xbe, 0x6f, 0x1f, 0xa3, 0x27, 0x49, 0xa9, 0x2f, 0x4a, 0xde, 0xa7, 0x9d, 0x82, 0x80, 0x47,
0x72, 0xc3, 0xb5, 0x90, 0x8e, 0x85, 0xfc, 0x36, 0x7a, 0x9d, 0xdf, 0xd3, 0x88, 0x5c, 0x63, 0x8f,
0x00, 0x90, 0x87, 0xbd, 0x49, 0x0c, 0xc1, 0x52, 0x7e, 0x09, 0xd2, 0xd0, 0xe8, 0x4f, 0x35, 0x36,
0xe0, 0x82, 0xa1, 0xd2, 0x1f, 0x6b, 0xa9, 0xb8, 0x97, 0xb5, 0xa2, 0x60, 0xa9, 0xb3, 0x5d, 0x5d,
0x16, 0x2c, 0x65, 0xad, 0x69, 0xbd, 0xff, 0xae, 0x19, 0x2a, 0x2e, 0xd6, 0x2d, 0x2b, 0x3b, 0xbb,
0xd5, 0x58, 0xb4, 0xb2, 0xb3, 0x0c, 0x3d, 0xcd, 0xa1, 0x69, 0x19, 0x1a, 0xff, 0xa4, 0xbc, 0xd7,
0xe5, 0xe6, 0xff, 0x5d, 0x81, 0xb5, 0xc5, 0x7f, 0x53, 0x8d, 0x28, 0xfc, 0x7e, 0x9a, 0xeb, 0xca,
0x99, 0x2a, 0x0f, 0xc3, 0x66, 0x54, 0xfc, 0x00, 0x84, 0xd0, 0x01, 0x66, 0x04, 0x31, 0x14, 0x80,
0xe1, 0x6f, 0x1a, 0x04, 0x90, 0x02, 0x8a, 0x65, 0x7a, 0x84, 0x01, 0x2c, 0x6a, 0xe7, 0x2a, 0x39,
0xc2, 0x9c, 0xa0, 0xe6, 0x06, 0xbd, 0x4a, 0x8f, 0x10, 0xa0, 0x97, 0x28, 0x72, 0x84, 0x05, 0x2c,
0xca, 0x34, 0x0c, 0x42, 0x83, 0xe2, 0x83, 0xe7, 0xe5, 0x7f, 0x04, 0xa0, 0x1e, 0xab, 0x86, 0x8c,
0x2b, 0x7e, 0xf0, 0x15, 0xec, 0x21, 0xa9, 0x6e, 0xb2, 0x2b, 0x5e, 0x87, 0x75, 0xcb, 0x68, 0x5c,
0xab, 0x81, 0x7d, 0x76, 0x56, 0x6b, 0xc4, 0x8a, 0xb7, 0x73, 0x78, 0x0f, 0xbc, 0x53, 0x22, 0x75,
0xd2, 0xd3, 0xc6, 0x44, 0xc2, 0x0d, 0x0f, 0xf4, 0x41, 0x7f, 0x82, 0x07, 0x8e, 0xa8, 0x7c, 0x24,
0xc5, 0x8b, 0x6c, 0x19, 0x94, 0xe9, 0x62, 0x3f, 0x12, 0x47, 0x64, 0xfb, 0x7b, 0x28, 0x17, 0x5d,
0xa6, 0x6c, 0xcd, 0x8a, 0xf9, 0xff, 0xfe, 0xd6, 0xdc, 0xa7, 0x32, 0x7d, 0x87, 0xd6, 0x0f, 0x8e,
0xf8, 0x64, 0xec, 0x67, 0xa7, 0xaa, 0x09, 0xca, 0x67, 0x52, 0xe6, 0x1b, 0xa9, 0xff, 0x70, 0x7c,
0x6e, 0xa3, 0x45, 0xb9, 0x2c, 0xf2, 0xd2, 0x6c, 0x4d, 0x6e, 0x6a, 0x3b, 0x58, 0x66, 0xf6, 0x98,
0xd1, 0xe9, 0xf5, 0xdf, 0x21, 0x8b, 0x03, 0x00, 0x8d, 0xcc, 0x01, 0x66, 0xc4, 0x40, 0x14, 0x80,
0xe1, 0x2f, 0x82, 0x00, 0x66, 0x4f, 0xd0, 0xe4, 0x08, 0x59, 0xd0, 0x60, 0x6d, 0x7a, 0x94, 0x39,
0xc2, 0x02, 0x8a, 0xa5, 0x41, 0xb5, 0x80, 0x5e, 0x69, 0x40, 0xcf, 0x31, 0x47, 0x28, 0x20, 0x58,
0xbb, 0x7d, 0x74, 0x5b, 0x01, 0x14, 0x9f, 0x91, 0xbc, 0xff, 0x3d, 0x80, 0x7a, 0x4b, 0xa1, 0xc7,
0x84, 0x11, 0x5b, 0x93, 0x98, 0x89, 0x26, 0xa3, 0xb6, 0x94, 0x19, 0x97, 0x96, 0xd2, 0xe3, 0x80,
0x23, 0x35, 0x71, 0x6d, 0xd4, 0x9e, 0xda, 0x30, 0x64, 0xd4, 0x8e, 0xf2, 0x82, 0x35, 0xb1, 0xcc,
0x38, 0x88, 0xe2, 0x27, 0x4c, 0x22, 0xdc, 0x1e, 0xbb, 0xcf, 0xe3, 0x75, 0xe9, 0xd4, 0x99, 0xda,
0x32, 0x30, 0xc8, 0xa6, 0x88, 0x8f, 0x96, 0xf7, 0x4e, 0x2c, 0xb3, 0x12, 0xaf, 0xe5, 0x23, 0x89,
0xff, 0x62, 0x8e, 0x61, 0x70, 0xbf, 0xd9, 0x61, 0xc6, 0x3a, 0x53, 0xc3, 0x19, 0x3d, 0xb5, 0x0d,
0x10, 0x7d, 0x88, 0xbd, 0xf2, 0x28, 0x7f, 0xed, 0xe5, 0xf3, 0x28, 0xf7, 0xa3, 0xda, 0x05, 0x23,
0x06, 0x80, 0x7a, 0xbb, 0xb5, 0x35, 0x64, 0xfe, 0x40, 0x45, 0xe9, 0xd0, 0x63, 0xdd, 0x7e, 0x4c,
0xb0, 0xcd, 0x7f, 0x4f, 0x80, 0x8c, 0x67, 0x3c, 0xb0, 0x74, 0x94, 0x26, 0xb4, 0x48, 0x38, 0xe0,
0x84, 0x27, 0x96, 0xe6, 0x7f, 0x04, 0x76, 0x18, 0x71, 0x42, 0x01, 0x12, 0xaf, 0x33, 0x6f, 0x7b,
0x3e, 0xc7, 0xbb, 0x1d, 0xd7, 0xc4, 0x65, 0xfe, 0x06, 0x8d, 0xd1, 0x01, 0x66, 0xc4, 0x40, 0x14,
0x80, 0xe1, 0xaf, 0x4d, 0x24, 0x10, 0x69, 0x00, 0xc5, 0xd8, 0xb9, 0x42, 0x00, 0x45, 0xd8, 0x2b,
0xed, 0x01, 0x5a, 0x3d, 0x4a, 0xaf, 0xb2, 0xa0, 0xa0, 0x7a, 0x86, 0x1c, 0x21, 0x80, 0x20, 0x92,
0x0e, 0x83, 0x41, 0x16, 0xc5, 0x07, 0x79, 0x2f, 0xef, 0x27, 0x01, 0x58, 0x8e, 0x6b, 0x12, 0xe9,
0x5e, 0x69, 0xc6, 0xa2, 0x7f, 0x63, 0x8b, 0x2c, 0x2d, 0x98, 0x5b, 0xd6, 0x48, 0x08, 0x79, 0x5c,
0x60, 0x40, 0xde, 0xdc, 0x22, 0x97, 0x89, 0x32, 0xa6, 0x1e, 0x2c, 0x1f, 0x31, 0x97, 0x12, 0x98,
0x2b, 0xd6, 0x17, 0x7e, 0x02, 0xdf, 0x63, 0xf1, 0x9b, 0x6c, 0xc9, 0x32, 0xa8, 0xd1, 0x70, 0xcf,
0x6f, 0x19, 0x1b, 0x99, 0x92, 0xaa, 0x85, 0xa9, 0x4b, 0x89, 0xa2, 0x1e, 0x7a, 0xef, 0x5f, 0xad,
0xfd, 0xa8, 0xec, 0x9f, 0x80, 0x52, 0xee, 0xd0, 0x14, 0xf6, 0x2b, 0x5b, 0x02, 0xdc, 0xf6, 0x94,
0x49, 0xe8, 0x32, 0xfd, 0x6d, 0x3f, 0xda, 0x31, 0x1d, 0x3b, 0x5d, 0xba, 0x63, 0x7e, 0x62, 0x6d,
0x09, 0x91, 0x66, 0xe2, 0x79, 0x3c, 0xad, 0x41, 0xe9, 0x3c, 0xec, 0xaf, 0xe7, 0xe7, 0x2e, 0xf2,
0xfe, 0xfc, 0xbf, 0x13, 0x5b, 0x82, 0x25, 0x7f, 0xd4, 0x87, 0xbf, 0x28, 0x84, 0x3c, 0x9b, 0xab,
0x3f, 0x45, 0xcf, 0x81, 0x06, 0xdb, 0x50, 0x14, 0x06, 0xe0, 0x2f, 0x49, 0xa5, 0x10, 0x4b, 0x01,
0xc3, 0x34, 0xaf, 0xd0, 0x82, 0x15, 0x91, 0xbc, 0xca, 0x1e, 0xa3, 0x98, 0xb6, 0xa0, 0xaf, 0xb1,
0x57, 0xb9, 0x60, 0xcf, 0x11, 0x30, 0x00, 0x05, 0x14, 0x91, 0xbb, 0xdb, 0x5d, 0x73, 0xf1, 0x39,
0x72, 0xce, 0xc9, 0x9f, 0x13, 0x00, 0x5b, 0xec, 0xad, 0x49, 0xf7, 0x95, 0xf6, 0x54, 0x7c, 0xb9,
0xb0, 0x0e, 0xbc, 0xf6, 0x90, 0x4a, 0x7e, 0xfc, 0x36, 0x52, 0xd6, 0xd8, 0x1d, 0xf8, 0xf9, 0xab,
0xb7, 0xc5, 0x0c, 0x60, 0x9b, 0x79, 0x27, 0x1d, 0xda, 0x02, 0xe3, 0xe7, 0x8d, 0x13, 0xbf, 0x33,
0xcf, 0x73, 0x32, 0xb0, 0x4b, 0xd0, 0x12, 0xe2, 0x90, 0xcc, 0xe5, 0x23, 0x80, 0x6d, 0xc8, 0xb9,
0x4e, 0x85, 0x03, 0xb9, 0xaf, 0xc6, 0x84, 0xb5, 0x22, 0x0c, 0x18, 0x31, 0x11, 0xfa, 0xdc, 0x9b,
0x50, 0xab, 0x71, 0xc3, 0xba, 0xe7, 0x31, 0x63, 0xcc, 0x75, 0x6d, 0x38, 0x62, 0xc2, 0xbb, 0xcc,
0x84, 0x99, 0xad, 0x61, 0x42, 0xbe, 0xe6, 0x38, 0x72, 0xed, 0x59, 0x9a, 0xec, 0xda, 0xe7, 0x5e,
0x9a, 0xd5, 0x3a, 0x53, 0xb2, 0x56, 0x9d, 0xd0, 0xef, 0x73, 0xea, 0x96, 0xcf, 0x29, 0x27, 0x40,
0x7b, 0x49, 0x26, 0x9e, 0xdf, 0xf9, 0x73, 0xe6, 0xf6, 0x09, 0x2e, 0xbf, 0x1b, 0x32, 0xf1, 0x2e,
0xcc, 0xb1, 0x5a, 0x3c, 0x9a, 0x1f, 0xfc, 0x03, 0x00, 0xf0, 0x8a, 0xb1, 0xff, 0x80, 0xff, 0x3b,
0xcb, 0xb0, 0x55, 0xe1, 0x1e, 0x2b, 0x4b, 0x25, 0x67, 0xfd, 0x05, 0x85, 0xc8, 0x01, 0x06, 0x14,
0x51, 0x1c, 0xc7, 0xf1, 0xcf, 0xf4, 0xc6, 0xdb, 0x8d, 0xd1, 0x06, 0xd8, 0xc0, 0xce, 0x11, 0x5e,
0x45, 0x2d, 0xc5, 0x2e, 0x1d, 0xa0, 0x23, 0xf4, 0x8e, 0x10, 0x20, 0xa0, 0x01, 0x81, 0x74, 0x86,
0x8e, 0x32, 0xa0, 0x20, 0x9d, 0x61, 0x8e, 0xb0, 0x20, 0x83, 0xd1, 0xf4, 0x06, 0xa3, 0x35, 0xa2,
0x2f, 0x1f, 0x7f, 0xff, 0x1f, 0xc8, 0x48, 0x77, 0x5a, 0xe4, 0x8d, 0xd6, 0xda, 0xcf, 0x39, 0x58,
0xac, 0x4d, 0x15, 0xf3, 0x8e, 0x10, 0x75, 0x55, 0x63, 0xa8, 0x5e, 0x2f, 0xb7, 0xa8, 0x41, 0x4e,
0xc5, 0x59, 0x37, 0x5f, 0xf4, 0xf3, 0x4b, 0x39, 0xa7, 0xbf, 0x24, 0xd7, 0x62, 0xed, 0x57, 0x64,
0x0a, 0x34, 0x45, 0x8c, 0x77, 0x02, 0x9f, 0x8b, 0xdf, 0x3b, 0x1e, 0xd4, 0x90, 0x31, 0xbc, 0x89,
0xba, 0xb7, 0x91, 0xa9, 0xb8, 0x5d, 0x18, 0x8b, 0x77, 0xb1, 0xec, 0xc5, 0xb5, 0xb6, 0xe9, 0x76,
0x1a, 0x0f, 0x0b, 0xe8, 0xcf, 0x8f, 0x0d, 0x1f, 0x93, 0xf4, 0xbd, 0xf8, 0x56, 0x7c, 0x7a, 0x2a,
0xfd, 0x78, 0x25, 0x8d, 0x27, 0x52, 0x6d, 0x53, 0xfe, 0xe7, 0x3f, 0x62, 0x0e, 0xba, 0x2a, 0xea,
0x35, 0xb2, 0xa3, 0x3c, 0x3d, 0xd1, 0x7e, 0x79, 0x2e, 0x85, 0xc5, 0x8b, 0x95, 0x36, 0x3c, 0x93,
0x1d, 0x5d, 0x8b, 0x5e, 0xa3, 0x0b, 0x91, 0x39, 0xf0, 0x01, 0x1c, 0xf8, 0xfa, 0xb0, 0xd8, 0x17,
0x35, 0xc3, 0x01, 0x74, 0x15, 0x43, 0xe0, 0xfd, 0x8e, 0x73, 0xc3, 0x7e, 0x4f, 0xbf, 0x6e, 0x8f,
0x38, 0x36, 0x20, 0xfd, 0xc7, 0x2d, 0x80, 0xae, 0xda, 0xfa, 0x03, 0x8d, 0xc8, 0x01, 0x46, 0x04,
0x51, 0x00, 0x80, 0xe1, 0x6f, 0xcc, 0x9a, 0x9d, 0xf4, 0xcc, 0x0c, 0x60, 0x04, 0xed, 0x11, 0x5e,
0x16, 0x05, 0x2a, 0x74, 0x90, 0xa1, 0x0b, 0x2c, 0x20, 0x44, 0x73, 0xb0, 0xf0, 0x0e, 0xd0, 0x21,
0xe6, 0x00, 0x61, 0x81, 0x42, 0xf6, 0x65, 0x3c, 0xd8, 0x80, 0xf0, 0xf1, 0xfb, 0xc1, 0x37, 0x72,
0x6d, 0xae, 0x1a, 0x49, 0x30, 0x19, 0xad, 0x76, 0x79, 0x2f, 0xae, 0x9e, 0x63, 0xf1, 0x75, 0x63,
0x77, 0xbf, 0x37, 0xb9, 0xf2, 0x68, 0x94, 0x04, 0x73, 0xdd, 0x90, 0x6b, 0x5e, 0x02, 0xfe, 0x4b,
0xaa, 0x58, 0x6a, 0x62, 0x43, 0xc1, 0x54, 0x97, 0x8f, 0x18, 0xff, 0xca, 0xb7, 0xc5, 0xf9, 0xa3,
0x0d, 0x84, 0x8e, 0xcd, 0x25, 0x1f, 0x17, 0xbc, 0xb6, 0xc4, 0x16, 0x42, 0xcb, 0x53, 0xe1, 0xb3,
0xe5, 0xbd, 0x67, 0xd8, 0xc2, 0x8c, 0x05, 0x07, 0x44, 0x00, 0xa7, 0xdc, 0x5b, 0x89, 0x28, 0x18,
0x38, 0x5d, 0x73, 0x7a, 0x00, 0x1d, 0xcb, 0x1b, 0xc7, 0x7c, 0x2e, 0x57, 0x11, 0x51, 0xe9, 0x15,
0x80, 0x83, 0x62, 0x83, 0x86, 0xd4, 0x30, 0x6f, 0x51, 0xc1, 0x80, 0x11, 0x01, 0x3f, 0x3d, 0xa4,
0x9e, 0x69, 0x64, 0x37, 0x14, 0x6b, 0xaf, 0x0f, 0x6d, 0xcb, 0x5d, 0xc7, 0x71, 0x4b, 0xaa, 0x99,
0x31, 0x06, 0x0e, 0x1d, 0x4b, 0x4d, 0xaa, 0x7e, 0x01, 0x6d, 0x8e, 0x01, 0x46, 0x05, 0x41, 0x1c,
0x87, 0xbf, 0x31, 0x6c, 0x93, 0x9e, 0xdd, 0x07, 0x08, 0xa9, 0x47, 0x17, 0x98, 0x14, 0x06, 0x54,
0x47, 0xd9, 0x23, 0xec, 0x05, 0xd2, 0xac, 0x3d, 0x48, 0x57, 0x19, 0xf0, 0x1e, 0xa4, 0x33, 0x0c,
0x91, 0x45, 0x12, 0x20, 0xac, 0xf4, 0x63, 0x27, 0xf6, 0xb1, 0xf8, 0xf8, 0xfd, 0xf9, 0xe6, 0x33,
0x00, 0x51, 0x24, 0xd1, 0x8a, 0xfc, 0xec, 0x81, 0x0b, 0x51, 0x43, 0xb4, 0x90, 0x81, 0x80, 0xce,
0x8d, 0xce, 0x86, 0xd4, 0x9f, 0xd2, 0xb6, 0x0e, 0xbe, 0x1f, 0x66, 0x70, 0x8b, 0x84, 0x9e, 0xef,
0x44, 0x28, 0x89, 0x13, 0x48, 0x06, 0xba, 0x72, 0x36, 0x10, 0xaf, 0x3d, 0xd9, 0x07, 0x76, 0xdb,
0x3b, 0xf0, 0xb7, 0x4a, 0xdc, 0x40, 0xf6, 0x00, 0xed, 0x23, 0xf8, 0x7d, 0xe1, 0xa0, 0xcc, 0x53,
0x20, 0x86, 0x4b, 0x88, 0xca, 0xe4, 0xff, 0x8c, 0x53, 0xb5, 0x56, 0xf5, 0x8c, 0x2e, 0x39, 0xb6,
0xdd, 0xf9, 0xe2, 0x17, 0x02, 0xe0, 0xc7, 0xc0, 0x64, 0xa1, 0xb2, 0xbc, 0x59, 0x81, 0x36, 0x02,
0x03, 0x1e, 0xb8, 0x87, 0x7c, 0x85, 0x9d, 0x0c, 0x87, 0x17, 0xc3, 0xd7, 0x60, 0x18, 0x7b, 0x43,
0xd2, 0xe6, 0x57, 0xe4, 0x06, 0x50, 0x12, 0xbf, 0xd4, 0x99, 0x66, 0x65, 0x94, 0xfe, 0xd9, 0xcf,
0x4f, 0xad, 0x74, 0xb3, 0xae, 0x3b, 0xe9, 0x7b, 0x29, 0xef, 0x83, 0xe8, 0xe7, 0xbd, 0x59, 0xaf,
0x3b, 0xe9, 0x75, 0xd1, 0x3f, 0x4a, 0xfd, 0x55, 0xbb, 0x96, 0x5e, 0xad, 0xd7, 0xab, 0xa2, 0xe7,
0x41, 0x94, 0x7a, 0x75, 0x5c, 0xff, 0x03, 0x6d, 0x90, 0x35, 0x5a, 0x03, 0x40, 0x14, 0x06, 0x27,
0xee, 0xd2, 0xe3, 0xee, 0xb0, 0x1d, 0x2e, 0x47, 0x89, 0x27, 0x15, 0x35, 0x1d, 0x4e, 0xcb, 0x11,
0x72, 0x05, 0x8e, 0x90, 0x93, 0xe0, 0xee, 0x1d, 0x2e, 0xef, 0xfb, 0x71, 0x29, 0x66, 0x75, 0xfe,
0xb7, 0x02, 0x0e, 0x98, 0x82, 0xed, 0x26, 0x78, 0xf4, 0xf0, 0x58, 0xf5, 0xb0, 0xbb, 0x6c, 0x2c,
0x7a, 0x78, 0xb6, 0x71, 0xf8, 0xd9, 0x03, 0xdb, 0x29, 0x60, 0xda, 0x70, 0x48, 0x9f, 0x80, 0x05,
0xd3, 0xaf, 0x7d, 0x60, 0xdb, 0xb5, 0x75, 0x0f, 0xdb, 0xa6, 0x67, 0x16, 0xac, 0x7f, 0x99, 0x16,
0x19, 0xe7, 0xfe, 0x00, 0x70, 0x6b, 0xbc, 0x84, 0x58, 0xa8, 0xa6, 0xa8, 0x79, 0xea, 0xd9, 0x66,
0x24, 0x98, 0xe1, 0xfa, 0x9d, 0x8d, 0x50, 0x06, 0xc7, 0x0c, 0x69, 0x00, 0x40, 0x95, 0xf6, 0x8c,
0xb2, 0xa5, 0x67, 0x8d, 0xca, 0xb7, 0x6a, 0xcd, 0x34, 0x7f, 0xd3, 0x44, 0x46, 0x8a, 0x54, 0x45,
0xb2, 0x7f, 0xb5, 0x73, 0xa3, 0x64, 0xcb, 0xf9, 0x37, 0x34, 0xae, 0xfc, 0xd5, 0x0e, 0x8d, 0xdc,
0xb7, 0xc3, 0x4a, 0x42, 0x9a, 0x07, 0x68, 0xb3, 0x41, 0x19, 0xa7, 0x6a, 0xc7, 0x86, 0xd2, 0xa8,
0xcb, 0xe0, 0xb4, 0x74, 0x69, 0x74, 0xd9, 0xdc, 0x17, 0x06, 0xfa, 0x91, 0xaf, 0xb7, 0x1c, 0x19,
0x36, 0x27, 0x0c, 0xd0, 0x89, 0x12, 0x1f, 0x2f, 0xd0, 0xdc, 0x0b, 0x80, 0xe3, 0xdf, 0xbf, 0x94,
0xcc, 0x88, 0x3e, 0x6f, 0x61, 0x2b, 0xa5, 0xcf, 0x64, 0xee, 0xf7, 0x47, 0x9c, 0xfb, 0x60, 0x2d,
0x05, 0xc1, 0x29, 0xf0, 0xdf, 0x42, 0x7c, 0xdb, 0x47, 0x7c, 0x21, 0x45, 0x90, 0xa9, 0x0f, 0xe7,
0x15, 0x7d, 0x8f, 0x01, 0x46, 0xc7, 0x60, 0x1c, 0x86, 0x9f, 0xb5, 0xec, 0x3f, 0x64, 0x03, 0x08,
0x53, 0x1d, 0x61, 0x09, 0x02, 0xba, 0xca, 0xc7, 0xd2, 0x20, 0xec, 0x08, 0x1d, 0x20, 0xba, 0x40,
0x87, 0xf9, 0x06, 0x19, 0x3a, 0x40, 0x80, 0x75, 0x83, 0x00, 0x01, 0xeb, 0xc1, 0xc7, 0x32, 0x33,
0x3c, 0xf8, 0xde, 0xdf, 0xfb, 0xbc, 0x33, 0x00, 0x7e, 0x65, 0x39, 0x11, 0xdf, 0x6a, 0x46, 0x2e,
0xe9, 0x68, 0xe9, 0xe5, 0x59, 0x42, 0x22, 0x66, 0x0d, 0x2f, 0x4b, 0x8d, 0x3d, 0x18, 0xb6, 0x56,
0xd4, 0x4a, 0x4d, 0xb4, 0x78, 0x92, 0x4e, 0xc6, 0x43, 0x6b, 0xd2, 0xb2, 0x4d, 0x2f, 0xff, 0xbf,
0x39, 0x1d, 0x5a, 0x9f, 0x5a, 0xee, 0x23, 0x3c, 0xa2, 0x91, 0xf8, 0x38, 0xb4, 0x62, 0xb2, 0xc2,
0x8a, 0xef, 0xdd, 0xff, 0x3a, 0x3f, 0x83, 0x2a, 0x87, 0xf7, 0xcc, 0x05, 0x4c, 0xe5, 0x47, 0xbe,
0x7c, 0xbf, 0x9a, 0x17, 0x42, 0x1a, 0xef, 0x1d, 0x7f, 0x20, 0x72, 0x45, 0xe0, 0x8e, 0x10, 0x6f,
0x09, 0x83, 0xe3, 0x4d, 0xcb, 0x5c, 0x39, 0x9e, 0x37, 0xcc, 0x8e, 0xdf, 0xac, 0xe3, 0x80, 0x89,
0x5c, 0x93, 0x71, 0xcf, 0x89, 0x96, 0x4a, 0x4a, 0x41, 0x30, 0xf3, 0x26, 0xf5, 0xb6, 0xee, 0x09,
0x52, 0xf5, 0x42, 0x54, 0xc9, 0xcd, 0xbe, 0xf7, 0xeb, 0xa5, 0xa7, 0x02, 0x2b, 0x89, 0x02, 0xb5,
0x75, 0xfd, 0x0f, 0x6d, 0xce, 0x01, 0x66, 0xc4, 0x40, 0x00, 0x46, 0xe1, 0xb7, 0x52, 0x09, 0x94,
0x0c, 0xa0, 0x08, 0xd9, 0x23, 0x4c, 0x81, 0xa0, 0x4c, 0xd1, 0x83, 0xe4, 0x00, 0xc5, 0x02, 0x8a,
0x22, 0xa5, 0x7a, 0x9e, 0x1e, 0x61, 0x40, 0x0a, 0xf4, 0x04, 0x45, 0x7a, 0x83, 0x05, 0x2c, 0x56,
0xda, 0x87, 0x21, 0x5d, 0x9a, 0xf8, 0x18, 0xf9, 0x9f, 0x11, 0xca, 0xb3, 0xfc, 0xb4, 0xea, 0xa9,
0x19, 0x14, 0xa1, 0xf0, 0xac, 0x01, 0x37, 0xb5, 0x7b, 0x4c, 0x77, 0x90, 0x1b, 0x20, 0xe9, 0x94,
0xb8, 0x5e, 0x12, 0xcd, 0x33, 0x54, 0x3d, 0x7c, 0x57, 0xee, 0xdb, 0x9d, 0x09, 0xb9, 0x54, 0x97,
0xe6, 0x1d, 0xac, 0x7a, 0x2a, 0x21, 0xb9, 0x94, 0x11, 0xe4, 0x7b, 0xa7, 0x35, 0xb2, 0x7c, 0xe8,
0x25, 0x01, 0xbd, 0x80, 0x16, 0x5e, 0x13, 0xe1, 0xed, 0x96, 0xc3, 0xec, 0xa4, 0x69, 0x0e, 0xb0,
0xb6, 0x70, 0x36, 0xdb, 0x12, 0x4c, 0x70, 0xce, 0x3a, 0x98, 0x44, 0x93, 0xb0, 0x25, 0x93, 0x49,
0x2e, 0xb7, 0xc4, 0x92, 0x64, 0x93, 0x69, 0x4b, 0xb2, 0xc9, 0x68, 0x32, 0x3a, 0xdf, 0x2b, 0x97,
0x64, 0xdc, 0x12, 0x4a, 0x82, 0xb3, 0x14, 0x18, 0x4d, 0xf6, 0x97, 0xc9, 0x60, 0xf2, 0xe8, 0xfc,
0x30, 0xcb, 0x64, 0xf8, 0xe7, 0x77, 0xe7, 0xbf, 0xb7, 0xdc, 0x38, 0xb7, 0xd2, 0x57, 0x57, 0xbe,
0x15, 0x9f, 0x3a, 0xeb, 0x18, 0x00, 0x58, 0x1a, 0x38, 0xf5, 0xd0, 0x75, 0x57, 0xd4, 0xb1, 0xa6,
0x3e, 0xea, 0xbd, 0xf1, 0x5c, 0x41, 0xf8, 0x05, 0x6d, 0xd0, 0x01, 0x66, 0xc4, 0x40, 0x14, 0x80,
0xe1, 0x9f, 0xb0, 0x85, 0x92, 0x00, 0x94, 0x20, 0x47, 0x18, 0x40, 0x81, 0x5c, 0x65, 0x8e, 0x30,
0x47, 0x98, 0x23, 0xf4, 0x48, 0x0f, 0x14, 0x54, 0xcf, 0x30, 0x47, 0x18, 0x40, 0xb1, 0xaa, 0x3f,
0xfb, 0xb0, 0xb5, 0x3b, 0x7c, 0x24, 0x6f, 0x7e, 0x2f, 0x04, 0x80, 0xb1, 0xc0, 0xcf, 0xca, 0xf6,
0xb5, 0xd3, 0x3e, 0x0b, 0x43, 0x5d, 0x7c, 0xeb, 0xaa, 0xb9, 0xdd, 0x67, 0x98, 0xe1, 0x75, 0xa8,
0xa9, 0x98, 0x6d, 0xff, 0xb3, 0x6e, 0x16, 0xb9, 0xad, 0x64, 0x16, 0x66, 0xfd, 0x71, 0x5b, 0xcd,
0x6d, 0xa4, 0x6a, 0x76, 0xdc, 0x32, 0x3b, 0x9a, 0xc6, 0xef, 0x49, 0x57, 0x9e, 0xf0, 0xb1, 0xc9,
0x86, 0xad, 0x03, 0x91, 0x5d, 0xc9, 0x8b, 0x00, 0x7a, 0x05, 0x0e, 0xe1, 0x00, 0x55, 0x40, 0xc0,
0x78, 0x81, 0xb9, 0xd2, 0xdf, 0x77, 0xe6, 0x6b, 0xa1, 0xa9, 0x6a, 0xbe, 0x15, 0x3e, 0xce, 0xdd,
0x78, 0x85, 0xb9, 0x90, 0xc7, 0x0f, 0x33, 0xae, 0xa7, 0x09, 0xd4, 0x0b, 0x44, 0x0a, 0xe7, 0xd5,
0x39, 0x58, 0xe7, 0xff, 0xdb, 0x77, 0xca, 0xc5, 0x8d, 0x0a, 0x21, 0x9c, 0xe1, 0x1d, 0x63, 0xb9,
0x4f, 0x71, 0x4c, 0x66, 0x55, 0x45, 0xdb, 0xf3, 0x34, 0x1c, 0x67, 0x22, 0x73, 0xf5, 0xc7, 0x34,
0x7c, 0xad, 0x99, 0x8a, 0x48, 0xc3, 0xd9, 0x71, 0x4b, 0xff, 0x00, 0x65, 0xcc, 0x01, 0x66, 0x03,
0x41, 0x14, 0x87, 0xf1, 0x5f, 0x12, 0x12, 0x88, 0x66, 0x00, 0xc5, 0xb2, 0x57, 0x18, 0x2d, 0x5a,
0xc4, 0xf6, 0x2a, 0xef, 0x08, 0xbd, 0x41, 0x03, 0x7a, 0xae, 0x3d, 0x4a, 0x40, 0x01, 0x2c, 0xa0,
0x58, 0xbb, 0x7d, 0x65, 0x0d, 0xc4, 0xf8, 0xf0, 0xfe, 0xf3, 0xf9, 0xc0, 0x74, 0xe0, 0xf7, 0x22,
0xba, 0x4e, 0x1c, 0x2b, 0x1b, 0x91, 0xe4, 0x26, 0xff, 0xb8, 0x1f, 0x40, 0x6d, 0xf0, 0xb2, 0xe7,
0xed, 0x24, 0xa1, 0xed, 0x5a, 0xf0, 0x8b, 0xee, 0xca, 0x71, 0xe0, 0xfb, 0x95, 0x9f, 0xca, 0x90,
0x5c, 0x3b, 0xd6, 0x16, 0x04, 0x4b, 0xaf, 0x2c, 0x1f, 0xaa, 0xea, 0x33, 0x19, 0x13, 0x8a, 0xdc,
0xc9, 0x1d, 0x68, 0x27, 0xd5, 0x2d, 0xb9, 0x4b, 0x5d, 0x51, 0x1e, 0xb5, 0x5b, 0x9e, 0xa1, 0xb6,
0x17, 0x8a, 0xf1, 0x51, 0x8b, 0x4d, 0x23, 0xd9, 0xb4, 0xd8, 0xb4, 0xbd, 0xb3, 0x21, 0x99, 0x77,
0x67, 0xe3, 0xe5, 0x34, 0x9a, 0x0f, 0x61, 0x51, 0xc7, 0x5e, 0x99, 0x77, 0x0c, 0xd8, 0x03, 0x4c,
0xeb, 0x7a, 0xf9, 0xc7, 0xf9, 0x99, 0x63, 0xd5, 0x78, 0x7a, 0x67, 0xee, 0x99, 0x4e, 0xb6, 0x60,
0x64, 0x30, 0x32, 0x28, 0x83, 0x2c, 0x22, 0x83, 0xd1, 0x82, 0x7f,
};
static const uint8_t FONT_2_DESCRIPTOR[] = {
0x18, 0x1c, 0x20, 0xe0, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x0f, 0x1e, 0x09,
0x00, 0x2d, 0x2e, 0x0c, 0x00, 0x5b, 0x27, 0x0b, 0x00, 0x82, 0x3f, 0x11, 0x00, 0xc1, 0x33, 0x0d,
0x00, 0xf4, 0x0d, 0x05, 0x01, 0x01, 0x18, 0x07, 0x01, 0x19, 0x17, 0x07, 0x01, 0x30, 0x25, 0x0b,
0x01, 0x55, 0x26, 0x0b, 0x01, 0x7b, 0x0f, 0x06, 0x01, 0x8a, 0x17, 0x07, 0x01, 0xa1, 0x0f, 0x06,
0x01, 0xb0, 0x1d, 0x09, 0x01, 0xcd, 0x27, 0x0b, 0x02, 0x00, 0x1b, 0x0b, 0x02, 0x1b, 0x27, 0x0b,
0x02, 0x42, 0x27, 0x0b, 0x02, 0x69, 0x2b, 0x0b, 0x02, 0x94, 0x27, 0x0b, 0x02, 0xbb, 0x27, 0x0b,
0x02, 0xe2, 0x26, 0x0b, 0x03, 0x08, 0x27, 0x0b, 0x03, 0x2f, 0x27, 0x0b, 0x03, 0x56, 0x0f, 0x06,
0x03, 0x65, 0x0f, 0x06, 0x03, 0x74, 0x27, 0x0b, 0x03, 0x9b, 0x27, 0x0b, 0x03, 0xc2, 0x26, 0x0b,
0x04, 0x00, 0x1e, 0x08, 0x04, 0x1e, 0x3f, 0x11, 0x04, 0x5d, 0x2f, 0x0c, 0x04, 0x8c, 0x2f, 0x0d,
0x04, 0xbb, 0x2b, 0x0c, 0x04, 0xe6, 0x32, 0x0e, 0x05, 0x18, 0x27, 0x0b, 0x05, 0x3f, 0x25, 0x0a,
0x05, 0x64, 0x33, 0x0e, 0x05, 0x97, 0x2f, 0x0e, 0x05, 0xc6, 0x17, 0x07, 0x05, 0xdd, 0x14, 0x07,
0x06, 0x00, 0x2f, 0x0c, 0x06, 0x2f, 0x27, 0x0a, 0x06, 0x56, 0x43, 0x13, 0x06, 0x99, 0x33, 0x0f,
0x06, 0xcc, 0x36, 0x0f, 0x07, 0x02, 0x2a, 0x0c, 0x07, 0x2c, 0x36, 0x0f, 0x07, 0x62, 0x2f, 0x0c,
0x07, 0x91, 0x27, 0x0b, 0x07, 0xb8, 0x25, 0x0a, 0x08, 0x00, 0x2f, 0x0e, 0x08, 0x2f, 0x2d, 0x0c,
0x08, 0x5c, 0x49, 0x13, 0x08, 0xa5, 0x2b, 0x0b, 0x08, 0xd0, 0x25, 0x0b, 0x08, 0xf5, 0x27, 0x0a,
0x09, 0x1c, 0x1c, 0x08, 0x09, 0x38, 0x1f, 0x09, 0x09, 0x57, 0x18, 0x08, 0x09, 0x6f, 0x2a, 0x0c,
0x09, 0x99, 0x2c, 0x0b, 0x09, 0xc5, 0x11, 0x06, 0x09, 0xd6, 0x23, 0x0b, 0x0a, 0x00, 0x2b, 0x0c,
0x0a, 0x2b, 0x23, 0x09, 0x0a, 0x4e, 0x2b, 0x0c, 0x0a, 0x79, 0x27, 0x0b, 0x0a, 0xa0, 0x19, 0x07,
0x0a, 0xb9, 0x2b, 0x0c, 0x0a, 0xe4, 0x27, 0x0c, 0x0b, 0x0b, 0x0f, 0x05, 0x0b, 0x1a, 0x14, 0x06,
0x0b, 0x2e, 0x27, 0x0b, 0x0b, 0x55, 0x0f, 0x05, 0x0b, 0x64, 0x43, 0x12, 0x0b, 0xa7, 0x27, 0x0c,
0x0b, 0xce, 0x2b, 0x0c, 0x0c, 0x00, 0x2b, 0x0c, 0x0c, 0x2b, 0x2c, 0x0c, 0x0c, 0x57, 0x1e, 0x08,
0x0c, 0x75, 0x1f, 0x09, 0x0c, 0x94, 0x17, 0x07, 0x0c, 0xab, 0x27, 0x0c, 0x0c, 0xd2, 0x26, 0x0a,
0x0c, 0xf8, 0x3a, 0x10, 0x0d, 0x32, 0x23, 0x0a, 0x0d, 0x55, 0x26, 0x0a, 0x0d, 0x7b, 0x1f, 0x08,
0x0d, 0x9a, 0x20, 0x09, 0x0d, 0xba, 0x18, 0x0b, 0x0d, 0xd2, 0x1e, 0x09, 0x0e, 0x00, 0x2a, 0x0b,
0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x18,
0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x00, 0x05, 0x0e, 0x2a, 0x10, 0x06, 0x0e, 0x3a, 0x23, 0x0b,
0x0e, 0x5d, 0x27, 0x0b, 0x0e, 0x84, 0x2f, 0x0d, 0x0e, 0xb3, 0x27, 0x0b, 0x0e, 0xda, 0x18, 0x0b,
0x0e, 0xf2, 0x23, 0x0a, 0x0f, 0x15, 0x21, 0x0d, 0x0f, 0x36, 0x4a, 0x14, 0x0f, 0x80, 0x16, 0x08,
0x0f, 0x96, 0x27, 0x0b, 0x0f, 0xbd, 0x27, 0x0b, 0x0f, 0xe4, 0x17, 0x07, 0x10, 0x00, 0x4a, 0x14,
0x10, 0x4a, 0x29, 0x0b, 0x10, 0x73, 0x1e, 0x09, 0x10, 0x91, 0x27, 0x0b, 0x10, 0xb8, 0x1a, 0x08,
0x10, 0xd2, 0x1a, 0x08, 0x10, 0xec, 0x11, 0x06, 0x10, 0xfd, 0x27, 0x0c, 0x11, 0x24, 0x2c, 0x0d,
0x11, 0x50, 0x0e, 0x06, 0x11, 0x5e, 0x14, 0x05, 0x11, 0x72, 0x12, 0x08, 0x11, 0x84, 0x1a, 0x08,
0x11, 0x9e, 0x27, 0x0b, 0x12, 0x00, 0x43, 0x11, 0x12, 0x43, 0x43, 0x12, 0x12, 0x86, 0x47, 0x12,
0x12, 0xcd, 0x20, 0x08, 0x12, 0xed, 0x2f, 0x0c, 0x13, 0x1c, 0x2f, 0x0c, 0x13, 0x4b, 0x2f, 0x0c,
0x13, 0x7a, 0x2f, 0x0c, 0x13, 0xa9, 0x2f, 0x0c, 0x14, 0x00, 0x2f, 0x0c, 0x14, 0x2f, 0x3b, 0x11,
0x14, 0x6a, 0x2b, 0x0c, 0x14, 0x95, 0x27, 0x0b, 0x14, 0xbc, 0x27, 0x0b, 0x14, 0xe3, 0x27, 0x0b,
0x15, 0x0a, 0x27, 0x0b, 0x15, 0x31, 0x17, 0x07, 0x15, 0x48, 0x19, 0x07, 0x15, 0x61, 0x19, 0x07,
0x15, 0x7a, 0x19, 0x07, 0x15, 0x93, 0x32, 0x0e, 0x15, 0xc5, 0x33, 0x0f, 0x16, 0x00, 0x36, 0x0f,
0x16, 0x36, 0x36, 0x0f, 0x16, 0x6c, 0x36, 0x0f, 0x16, 0xa2, 0x36, 0x0f, 0x16, 0xd8, 0x36, 0x0f,
0x17, 0x0e, 0x27, 0x0b, 0x17, 0x35, 0x36, 0x0f, 0x17, 0x6b, 0x2f, 0x0e, 0x17, 0x9a, 0x2f, 0x0e,
0x17, 0xc9, 0x2f, 0x0e, 0x18, 0x00, 0x2f, 0x0e, 0x18, 0x2f, 0x25, 0x0b, 0x18, 0x54, 0x2a, 0x0c,
0x18, 0x7e, 0x2b, 0x0c, 0x18, 0xa9, 0x23, 0x0b, 0x18, 0xcc, 0x23, 0x0b, 0x18, 0xef, 0x23, 0x0b,
0x19, 0x12, 0x23, 0x0b, 0x19, 0x35, 0x23, 0x0b, 0x19, 0x58, 0x23, 0x0b, 0x19, 0x7b, 0x3f, 0x11,
0x19, 0xba, 0x23, 0x09, 0x1a, 0x00, 0x27, 0x0b, 0x1a, 0x27, 0x27, 0x0b, 0x1a, 0x4e, 0x27, 0x0b,
0x1a, 0x75, 0x27, 0x0b, 0x1a, 0x9c, 0x0f, 0x05, 0x1a, 0xab, 0x15, 0x06, 0x1a, 0xc0, 0x19, 0x07,
0x1a, 0xd9, 0x15, 0x06, 0x1a, 0xee, 0x2b, 0x0c, 0x1b, 0x19, 0x27, 0x0c, 0x1b, 0x40, 0x2b, 0x0c,
0x1b, 0x6b, 0x2b, 0x0c, 0x1b, 0x96, 0x2b, 0x0c, 0x1b, 0xc1, 0x2b, 0x0c, 0x1c, 0x00, 0x2b, 0x0c,
0x1c, 0x2b, 0x26, 0x0b, 0x1c, 0x51, 0x2b, 0x0c, 0x1c, 0x7c, 0x27, 0x0c, 0x1c, 0xa3, 0x27, 0x0c,
0x1c, 0xca, 0x27, 0x0c, 0x1c, 0xf1, 0x27, 0x0c, 0x1d, 0x18, 0x26, 0x0a, 0x1d, 0x3e, 0x2b, 0x0c,
0x1d, 0x69, 0x26, 0x0a,
};
static const uint16_t FONT_2_OFFSETS[] = {
0, 238, 457, 664, 840, 1049, 1233, 1451, 1675, 1865, 2087, 2321, 2515, 2728, 2923, 3099,
};
static const uint16_t FONT_2_LENGTHS[] = {
500, 488, 497, 477, 505, 505, 496, 507, 453, 472, 504, 504, 477, 492, 399,
};
static const Font FONT_2 = { FONT_2_DESCRIPTOR, FONT_2_DATA, FONT_2_OFFSETS, FONT_2_LENGTHS, 15, 3099 };
return FONT_2;
}
inline const uint8_t* font(unsigned id) {
return id == 1 ? fontStorage1().descriptor : id == 2 ? fontStorage2().descriptor : nullptr;
}
inline int identify(const uint8_t* descriptor) {
return descriptor == fontStorage1().descriptor ? 1 : descriptor == fontStorage2().descriptor ? 2 : -1;
}
inline const Font* storage(const uint8_t* descriptor) {
const int id = identify(descriptor);
return id == 1 ? &fontStorage1() : id == 2 ? &fontStorage2() : nullptr;
}
// Caller-owned 512-byte scratch; no cache, heap or mutable global state.
inline Glyph glyph(const uint8_t* descriptor, uint8_t code, uint8_t* scratch, size_t capacity) {
const Font* f = storage(descriptor);
if (!f || code < descriptor[2] || unsigned(code - descriptor[2]) >= descriptor[3])
return { nullptr, 0, 0, false, false };
const unsigned slot = code - descriptor[2];
const uint8_t* record = descriptor + 4 + 4 * slot;
const unsigned location = (unsigned(record[0]) << 8) | record[1];
const uint8_t length = record[2], width = record[3];
if (!length) return { nullptr, width, 0, false, location == 0xffff };
const unsigned group = location >> 9;
const unsigned offset = location & 511;
if (group >= f->chunkCount) return { nullptr, width, 0, false, false };
const unsigned first = f->offsets[group], end = f->offsets[group + 1];
const unsigned expected = f->rawLengths[group];
if (!scratch || expected > kScratchSize || capacity < expected || offset + length > expected || first > end || end > f->dataLength)
return { nullptr, width, 0, false, false };
unsigned int produced = expected;
if (tinf_uncompress_exact(scratch, &produced, f->data + first, end - first) != TINF_OK || produced != expected)
return { nullptr, width, 0, false, false };
return { scratch + offset, width, length, true, true };
}
}}} // namespace mesh::ui::noto
File diff suppressed because it is too large. Load diff
+30
View File
@@ -0,0 +1,30 @@
#pragma once
// The infrastructure pre-script sets MESH_NRF52_FLASH_TRIM only for known
// non-Companion nRF52 roles. Other display drivers and platforms stay unchanged.
// This header is also read by the C tinf wrapper, so keep it preprocessor-only.
// 9 = Noto Sans Condensed 16/24, Zopfli 1000, no unused initial Arial10.
// MESH_NRF52_FONT_MODE=0 opts out of the font change without disabling other
// infrastructure trims. The old experiment switch remains for comparisons.
#if defined(NRF52_PLATFORM) && defined(MESH_NRF52_FLASH_TRIM) \
&& MESH_NRF52_FLASH_TRIM && defined(ST7789) \
&& !defined(COMPANION_RADIO_FULL)
#if defined(MESH_ARIAL_EXPERIMENT)
#define MESHCORE_ARIAL_FONT_MODE MESH_ARIAL_EXPERIMENT
#elif defined(MESH_NRF52_FONT_MODE)
#define MESHCORE_ARIAL_FONT_MODE MESH_NRF52_FONT_MODE
#else
#define MESHCORE_ARIAL_FONT_MODE 9
#endif
#else
#define MESHCORE_ARIAL_FONT_MODE 0
#endif
#if MESHCORE_ARIAL_FONT_MODE < 0 || MESHCORE_ARIAL_FONT_MODE > 9
#error "Unsupported nRF52 font mode (expected 0..9)"
#endif
#define MESHCORE_FONT_DEFLATE \
(MESHCORE_ARIAL_FONT_MODE == 3 || MESHCORE_ARIAL_FONT_MODE == 9)
#define MESHCORE_FONT_COMPRESSED \
(MESHCORE_ARIAL_FONT_MODE == 2 || MESHCORE_FONT_DEFLATE)
+21
View File
@@ -0,0 +1,21 @@
#pragma once
// Only the non-Companion nRF52 ST7735 renderer includes this configuration.
// Load the selected library setup first so its driver, bus and pin settings
// remain unchanged, then prevent TFT_eSPI from loading those settings again.
#if defined(NRF52_PLATFORM) && defined(MESH_NRF52_FLASH_TRIM) && MESH_NRF52_FLASH_TRIM
#include <User_Setup_Select.h>
#ifndef USER_SETUP_LOADED
#define USER_SETUP_LOADED
#endif
// ST7735Display uses the normal GLCD font and integer scaling. Keep GFXFF's
// no-argument setFreeFont() API; the numbered and smooth fonts are never used.
#undef LOAD_FONT2
#undef LOAD_FONT4
#undef LOAD_FONT6
#undef LOAD_FONT7
#undef LOAD_FONT8
#undef LOAD_FONT8N
#undef SMOOTH_FONT
#endif
+42 -2
View File
@@ -45,7 +45,11 @@ OLEDDisplay::OLEDDisplay() {
color = WHITE;
geometry = GEOMETRY_128_64;
textAlignment = TEXT_ALIGN_LEFT;
#if MESHCORE_ARIAL_FONT_MODE >= 1
fontData = ArialMT_Plain_16;
#else
fontData = ArialMT_Plain_10;
#endif
fontTableLookupFunction = DefaultFontTableLookup;
buffer = NULL;
#ifdef OLEDDISPLAY_DOUBLE_BUFFER
@@ -557,6 +561,10 @@ uint16_t OLEDDisplay::drawStringInternal(int16_t xMove, int16_t yMove, const cha
uint8_t textHeight = pgm_read_byte(fontData + HEIGHT_POS);
uint8_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS);
uint16_t sizeOfJumpTable = pgm_read_byte(fontData + CHAR_NUM_POS) * JUMPTABLE_BYTES;
#if MESHCORE_FONT_COMPRESSED
const bool compactFont = mesh::ui::active_compact_font::identify(fontData) >= 0;
uint8_t glyphScratch[mesh::ui::active_compact_font::kScratchSize];
#endif
uint16_t cursorX = 0;
uint16_t cursorY = 0;
@@ -594,7 +602,11 @@ uint16_t OLEDDisplay::drawStringInternal(int16_t xMove, int16_t yMove, const cha
continue;
} else
code = text[j];
#if MESHCORE_ARIAL_FONT_MODE >= 1
if (code >= firstChar && code - firstChar < pgm_read_byte(fontData + CHAR_NUM_POS)) {
#else
if (code >= firstChar) {
#endif
uint8_t charCode = code - firstChar;
// 4 Bytes per char code
@@ -605,9 +617,23 @@ uint16_t OLEDDisplay::drawStringInternal(int16_t xMove, int16_t yMove, const cha
// Test if the char is drawable
if (!(msbJumpToChar == 255 && lsbJumpToChar == 255)) {
#if MESHCORE_FONT_COMPRESSED
if (compactFont) {
const mesh::ui::active_compact_font::Glyph glyph = mesh::ui::active_compact_font::glyph(
fontData, code, glyphScratch, sizeof(glyphScratch));
// A zero byte count has a different meaning to drawInternal().
// Failed/blank glyphs must not enter the generic bitmap renderer.
if (glyph.valid && glyph.drawable && glyph.data && glyph.length)
drawInternal(xPos, yPos, currentCharWidth, textHeight,
glyph.data, 0, glyph.length);
} else {
#endif
// Get the position of the char data
uint16_t charDataPosition = JUMPTABLE_START + sizeOfJumpTable + ((msbJumpToChar << 8) + lsbJumpToChar);
drawInternal(xPos, yPos, currentCharWidth, textHeight, fontData, charDataPosition, charByteSize);
#if MESHCORE_FONT_COMPRESSED
}
#endif
}
cursorX += currentCharWidth;
@@ -678,10 +704,17 @@ uint16_t OLEDDisplay::drawStringMaxWidth(int16_t xMove, int16_t yMove, uint16_t
uint16_t drawStringResult = 1; // later tested for 0 == error, so initialize to 1
for (uint16_t i = 0; i < length; i++) {
#if MESHCORE_ARIAL_FONT_MODE >= 1
const uint8_t c = (this->fontTableLookupFunction)(text[i]);
#else
char c = (this->fontTableLookupFunction)(text[i]);
#endif
if (c == 0)
continue;
strWidth += pgm_read_byte(fontData + JUMPTABLE_START + (c - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH);
#if MESHCORE_ARIAL_FONT_MODE >= 1
if (c >= firstChar && c - firstChar < pgm_read_byte(fontData + CHAR_NUM_POS))
#endif
strWidth += pgm_read_byte(fontData + JUMPTABLE_START + (c - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH);
// Always break on newline
if (text[i] == '\n') {
@@ -737,13 +770,20 @@ uint16_t OLEDDisplay::getStringWidth(const char* text, uint16_t length, bool utf
uint16_t maxWidth = 0;
for (uint16_t i = 0; i < length; i++) {
#if MESHCORE_ARIAL_FONT_MODE >= 1
uint8_t c = text[i];
#else
char c = text[i];
#endif
if (utf8) {
c = (this->fontTableLookupFunction)(c);
if (c == 0)
continue;
}
stringWidth += pgm_read_byte(fontData + JUMPTABLE_START + (c - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH);
#if MESHCORE_ARIAL_FONT_MODE >= 1
if (c >= firstChar && c - firstChar < pgm_read_byte(fontData + CHAR_NUM_POS))
#endif
stringWidth += pgm_read_byte(fontData + JUMPTABLE_START + (c - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH);
if (c == 10) {
maxWidth = max(maxWidth, stringWidth);
stringWidth = 0;
+4
View File
@@ -1,5 +1,7 @@
#include "OLEDDisplayFonts.h"
#if MESHCORE_ARIAL_FONT_MODE == 0 || MESHCORE_ARIAL_FONT_MODE == 1
#if MESHCORE_ARIAL_FONT_MODE == 0
const uint8_t ArialMT_Plain_10[] PROGMEM = {
0x0A, // Width: 10
0x0D, // Height: 13
@@ -424,6 +426,7 @@ const uint8_t ArialMT_Plain_10[] PROGMEM = {
0x20,0x00,0xC8,0x09,0x00,0x06,0xC8,0x01,0x20 // 255
};
#endif
const uint8_t ArialMT_Plain_16[] PROGMEM = {
0x10, // Width: 16
0x13, // Height: 19
@@ -1271,3 +1274,4 @@ const uint8_t ArialMT_Plain_24[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x00,0x1C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x03, // 254
0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0xC0,0xF0,0x01,0x06,0xC0,0x80,0x0F,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC,0x00,0xC0,0xC0,0x1F,0x00,0xC0,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06 // 255
};
#endif // raw font storage
+24
View File
@@ -1,6 +1,13 @@
#ifndef OLEDDISPLAYFONTS_h
#define OLEDDISPLAYFONTS_h
// Qualified nRF52 infrastructure defaults to mode 9; Companions remain mode 0.
// Optional comparisons: 0 = original, 1 = omit unused Arial10, 2 = per-glyph RLE,
// 3 = Zopfli-1000 chunks, 4 = Liberation Sans, 5 = Noto Sans,
// 6 = DejaVu Sans, 7 = Noto Sans Condensed, 8 = DejaVu Sans Condensed.
// Family trials preserve the visible 12/17px cap heights.
#include "Nrf52FontConfig.h"
#ifdef ARDUINO
#include <Arduino.h>
#elif __MBED__
@@ -8,6 +15,23 @@
#endif
extern const uint8_t ArialMT_Plain_10[] PROGMEM;
#if MESHCORE_ARIAL_FONT_MODE == 9
#include "CompactNotoFonts.h"
namespace mesh { namespace ui { namespace active_compact_font = noto; } }
// Keep the display driver's existing font-selection API, with Noto glyphs.
#define ArialMT_Plain_16 (::mesh::ui::noto::font(1))
#define ArialMT_Plain_24 (::mesh::ui::noto::font(2))
#elif MESHCORE_ARIAL_FONT_MODE == 2 || MESHCORE_ARIAL_FONT_MODE == 3
#include "CompactArialFonts.h"
namespace mesh { namespace ui { namespace active_compact_font = arial; } }
#define ArialMT_Plain_16 (::mesh::ui::arial::font(1))
#define ArialMT_Plain_24 (::mesh::ui::arial::font(2))
#elif MESHCORE_ARIAL_FONT_MODE >= 4
#include "FontFamilyTrials.h"
#define ArialMT_Plain_16 (::mesh::ui::font_trials::font(1))
#define ArialMT_Plain_24 (::mesh::ui::font_trials::font(2))
#else
extern const uint8_t ArialMT_Plain_16[] PROGMEM;
extern const uint8_t ArialMT_Plain_24[] PROGMEM;
#endif
#endif
+3
View File
@@ -1,5 +1,8 @@
#include "ST7735Display.h"
#include "../UsbLogging.h"
#if defined(NRF52_PLATFORM) && defined(MESH_NRF52_FLASH_TRIM) && MESH_NRF52_FLASH_TRIM
#include "Nrf52TftFontTrim.h"
#endif
#include <TFT_eSPI.h>
#if defined(NRF52_PLATFORM)