diff --git a/examples/companion_radio/ui-new/DiagnosticsScreen.h b/examples/companion_radio/ui-new/DiagnosticsScreen.h index 36a73bed..afb9b887 100644 --- a/examples/companion_radio/ui-new/DiagnosticsScreen.h +++ b/examples/companion_radio/ui-new/DiagnosticsScreen.h @@ -3,30 +3,50 @@ #include #include #include +#include #include "icons.h" #include "PopupMenu.h" +#include "TabBar.h" #include "../MyMesh.h" extern MyMesh the_mesh; -// Single-screen device diagnostics: uptime, packet counts by category (RX/TX), -// forwarded-packet count, heap and stack headroom, radio signal (noise floor, -// RSSI/SNR), packet-pool/outbound-queue depth, and radio error flags. The packet -// counts are built from Dispatcher's per-type counters (Mesh.h/Dispatcher.cpp) — -// grouped into a handful of categories rather than all 16 raw PAYLOAD_TYPE_* -// values, so they stay readable on a 128x64 OLED without the full type list. -// Falls back to scrolling (same drawList-style indicator as every other screen) -// on screens too small to show every row at once. Hold Enter resets the counters. +// Device diagnostics, organised as a circular tab carousel (shared TabBar.h, +// same idiom as BotScreen/NearbyScreen). LEFT/RIGHT switches tabs; UP/DOWN +// scrolls within the active tab: +// Live — live counters: uptime, packet counts by category (RX/TX), +// forwarded count, heap/stack headroom, radio signal, pool/queue +// depth, error flags. Hold Enter resets the counters. +// System — static device identity: firmware version + build date, device +// model, node name, and the active radio parameters. +// Font — a rendering test card: one sample line per script the UI font +// claims to cover (Latin, diacritics, Greek, Cyrillic, digits, +// symbols), so the on-device font can be eyeballed for coverage. +// The packet counts are built from Dispatcher's per-type counters — grouped +// into a handful of categories rather than all 16 raw PAYLOAD_TYPE_* values, +// so they stay readable on a 128x64 OLED. Every tab falls back to scrolling on +// screens too small to show its rows at once. class DiagnosticsScreen : public UIScreen { UITask* _task; int _scroll = 0; - PopupMenu _reset_menu; // Hold Enter → 1-item "Reset counters" action menu (Back dismisses) + uint8_t _tab = 0; // persists across visits (like BotScreen's _tab) + PopupMenu _reset_menu; // Live tab, Hold Enter → 1-item "Reset counters" action menu (Back dismisses) + + enum Tab : uint8_t { TAB_LIVE, TAB_SYSTEM, TAB_FONT, TAB_COUNT }; + static const char* const TAB_LABELS[TAB_COUNT]; struct Row { const char* label; char value[20]; }; static const int MAX_ROWS = 14; Row _rows[MAX_ROWS]; int _row_count = 0; + // Full-width text lines (System / Font tabs) — long values (device model, + // node name) don't fit the Live tab's narrow right-aligned value column, so + // these tabs draw one ellipsized line each instead of a label/value pair. + static const int MAX_LINES = 15; + char _lines[MAX_LINES][40]; + int _line_count = 0; + void addRow(const char* label, const char* value) { if (_row_count >= MAX_ROWS) return; _rows[_row_count].label = label; @@ -44,6 +64,14 @@ class DiagnosticsScreen : public UIScreen { addRow(label, buf); } + void addLine(const char* fmt, ...) { + if (_line_count >= MAX_LINES) return; + va_list ap; va_start(ap, fmt); + vsnprintf(_lines[_line_count], sizeof(_lines[_line_count]), fmt, ap); + va_end(ap); + _line_count++; + } + static uint32_t sumByTypes(bool recv, const uint8_t* types, int n) { uint32_t total = 0; for (int i = 0; i < n; i++) @@ -51,7 +79,7 @@ class DiagnosticsScreen : public UIScreen { return total; } - void buildRows() { + void buildLiveRows() { _row_count = 0; uint32_t up_secs = millis() / 1000; @@ -117,23 +145,63 @@ class DiagnosticsScreen : public UIScreen { addRow("Errors", buf); } -public: - DiagnosticsScreen(UITask* task) : _task(task) {} + void buildSystemLines() { + _line_count = 0; - int render(DisplayDriver& display) override { - buildRows(); - display.setTextSize(1); - display.setColor(DisplayDriver::LIGHT); - display.drawCenteredHeader("DIAGNOSTICS"); + // Firmware version, minus the commit-hash suffix build.sh appends as the + // LAST dash-segment (v1.16-solo.0-abcdef -> v1.16-solo.0) — same strip the + // boot screen does; the last dash, not the first, since a tag like + // v1.21-rc1 has a dash of its own before the hash. + const char* ver = FIRMWARE_VERSION; + const char* dash = strrchr(ver, '-'); + int plen = dash ? (int)(dash - ver) : (int)strlen(ver); + char sv[24]; + if (plen >= (int)sizeof(sv)) plen = sizeof(sv) - 1; + memcpy(sv, ver, plen); sv[plen] = '\0'; + addLine("FW %s", sv); + addLine("Built %s", FIRMWARE_BUILD_DATE); + addLine("Dev %s", board.getManufacturerName()); + addLine("Node %s", the_mesh.getNodeName()); + + NodePrefs* p = the_mesh.getNodePrefs(); + if (p) { + addLine("Freq %.3f MHz", p->freq); + addLine("SF%u BW%.0f CR%u", (unsigned)p->sf, p->bw, (unsigned)p->cr); + addLine("TX %d dBm", (int)p->tx_power_dbm); + } + } + + // One sample line per script/keyboard alphabet the UI font claims to cover + // (all inside the U+0020-04FF glyph range the OLED misc-fixed / e-ink Lemon + // fonts carry), so the font's coverage can be checked by eye on real + // hardware. Per-language lines use the same 2-letter codes as + // KeyboardWidget::altAlphabetHint and each shows that language's own + // non-ASCII letters (see KeyboardWidget.h's KB_*_CHARS tables). + void buildFontLines() { + _line_count = 0; + addLine("Latin ABCabc xyz"); + addLine("PL ąćęłńóśźż"); + addLine("CZ áčďéěíňóřš"); + addLine("SK áäčďíĺľňôŕ"); + addLine("DE äöüß"); + addLine("FR àâçéèêëîïœ"); + addLine("ES áéíñóúü"); + addLine("PT áàâãçéêíóôõú"); + addLine("ND åäæöø"); + addLine("Grk ΑΒΓ αβγξω"); // ΑΒΓ αβγξω + addLine("Cyr АБВ абвжя"); // АБВ абвжя + addLine("Num 0123456789"); + addLine("Sym @#&*()[]{}/\\+="); + } + + // Shared scrollable renderer for the label/value Live tab. + void renderRows(DisplayDriver& display) { const int item_h = display.lineStep(); const int start_y = display.listStart(); int visible = display.listVisible(item_h); if (visible < 1) visible = 1; - int max_scroll = _row_count - visible; - if (max_scroll < 0) max_scroll = 0; - if (_scroll > max_scroll) _scroll = max_scroll; - if (_scroll < 0) _scroll = 0; + clampScroll(_row_count, visible); const int reserve = scrollIndicatorReserve(display, _row_count, visible); for (int i = 0; i < visible && (_scroll + i) < _row_count; i++) { @@ -144,9 +212,51 @@ public: display.drawTextRightAlign(display.width() - reserve - 2, y, r.value); } drawScrollIndicator(display, start_y, visible * item_h, _row_count, visible, _scroll); + } + + // Shared scrollable renderer for the full-width System / Font tabs. + void renderLines(DisplayDriver& display) { + const int item_h = display.lineStep(); + const int start_y = display.listStart(); + int visible = display.listVisible(item_h); + if (visible < 1) visible = 1; + clampScroll(_line_count, visible); + + const int reserve = scrollIndicatorReserve(display, _line_count, visible); + for (int i = 0; i < visible && (_scroll + i) < _line_count; i++) { + int y = start_y + i * item_h; + display.drawTextEllipsized(2, y, display.width() - reserve - 4, _lines[_scroll + i]); + } + drawScrollIndicator(display, start_y, visible * item_h, _line_count, visible, _scroll); + } + + void clampScroll(int total, int visible) { + int max_scroll = total - visible; + if (max_scroll < 0) max_scroll = 0; + if (_scroll > max_scroll) _scroll = max_scroll; + if (_scroll < 0) _scroll = 0; + } + +public: + DiagnosticsScreen(UITask* task) : _task(task) {} + + int render(DisplayDriver& display) override { + display.setTextSize(1); + display.setColor(DisplayDriver::LIGHT); + tabbar::draw(display, TAB_LABELS, TAB_COUNT, _tab); + + switch (_tab) { + case TAB_SYSTEM: buildSystemLines(); renderLines(display); break; + case TAB_FONT: buildFontLines(); renderLines(display); break; + default: buildLiveRows(); renderRows(display); break; + } + display.setColor(DisplayDriver::LIGHT); if (_reset_menu.active) _reset_menu.render(display); - return _reset_menu.active ? 50 : 1000; // popup wants snappier redraw; stats otherwise refresh once a second + // Live counters refresh once a second; the static System/Font cards don't + // change, so they can idle. The reset popup wants a snappier redraw. + if (_reset_menu.active) return 50; + return _tab == TAB_LIVE ? 1000 : 2000; } bool handleInput(char c) override { @@ -158,9 +268,11 @@ public: } return true; } + if (keyIsPrev(c)) { _tab = (_tab + TAB_COUNT - 1) % TAB_COUNT; _scroll = 0; return true; } + if (keyIsNext(c)) { _tab = (_tab + 1) % TAB_COUNT; _scroll = 0; return true; } if (c == KEY_UP) { if (_scroll > 0) _scroll--; return true; } - if (c == KEY_DOWN) { _scroll++; return true; } // clamped to max_scroll in render() - if (c == KEY_CONTEXT_MENU) { // Hold Enter — same action-menu gesture as the rest of the UI + if (c == KEY_DOWN) { _scroll++; return true; } // clamped in render() + if (c == KEY_CONTEXT_MENU && _tab == TAB_LIVE) { // Hold Enter — reset the live counters _reset_menu.begin("Diagnostics", 1); _reset_menu.addItem("Reset counters"); return true; @@ -169,3 +281,5 @@ public: return false; } }; + +const char* const DiagnosticsScreen::TAB_LABELS[DiagnosticsScreen::TAB_COUNT] = { "Live", "System", "Font" }; diff --git a/examples/companion_radio/ui-new/KeyboardWidget.h b/examples/companion_radio/ui-new/KeyboardWidget.h index d140d7c7..9ff91a0a 100644 --- a/examples/companion_radio/ui-new/KeyboardWidget.h +++ b/examples/companion_radio/ui-new/KeyboardWidget.h @@ -461,17 +461,8 @@ struct KeyboardWidget { // on the same cell from being treated as a continued cycle. if (t9_cell >= 0 && millis() - t9_last_ms > KB_T9_TIMEOUT_MS) t9_cell = -1; - // Lemon is the only font that can draw the alt-alphabet page (or any - // already-typed non-ASCII bytes sitting in buf, e.g. Cyrillic composed - // earlier, now viewed from the Latin/symbols page) — force it on for just - // this render() call if the user's own font choice wouldn't otherwise show - // it, then restore exactly the state found on entry. Self-contained: never - // leaks a forced font into whatever renders next frame. - bool want_lemon = pageIsAltAlphabet(page); - if (!want_lemon) for (int i = 0; i < len; i++) if ((uint8_t)buf[i] >= 0x80) { want_lemon = true; break; } - bool had_lemon = display.isLemonFont(); - if (want_lemon && !had_lemon) display.setLemonFont(true); - + // Single UI font (misc-fixed 5x7) covers Latin/Greek/Cyrillic — the keyboard + // renders in it directly, no per-render font switching or headroom padding. display.setTextSize(1); display.setColor(DisplayDriver::LIGHT); @@ -485,16 +476,7 @@ struct KeyboardWidget { const int preview_h = display.height() - kb_h - display.sepH(); const int prev_lines = (preview_h / lh) > 1 ? (preview_h / lh) : 1; const int sep_y = prev_lines * lh; - // Lemon's tallest glyphs (accented capitals like Ć/Š/Ž, needed once caps - // is on) draw up to 3px above the nominal cursor y on SH1106 — its Lemon - // baseline offset is tuned for the shorter plain-ASCII/Cyrillic/Greek - // glyphs this keyboard used before the per-language Latin alphabets, and - // wasn't tall enough for these. Padding the first char row down by 3px - // (only while Lemon is actually in use) gives every accented glyph enough - // headroom that it can't bleed into the separator bar above; harmless on - // e-ink, which already has more headroom than it needs here. - const int lemon_pad = want_lemon ? 3 : 0; - const int chars_y = sep_y + display.sepH() + lemon_pad; + const int chars_y = sep_y + display.sepH(); const int cell_h = (display.height() - chars_y) / (rows + 1); const int spec_y = chars_y + rows * cell_h; const int spec_w = display.width() / KB_SPECIAL; @@ -608,8 +590,6 @@ struct KeyboardWidget { // placeholder picker overlay (drawn on top of keyboard) if (_ph_menu.active) _ph_menu.render(display); - - if (want_lemon && !had_lemon) display.setLemonFont(false); // restore exactly what we found return 50; } diff --git a/src/helpers/ui/MiscFixedFont.h b/src/helpers/ui/MiscFixedFont.h new file mode 100644 index 00000000..d88da4cc --- /dev/null +++ b/src/helpers/ui/MiscFixedFont.h @@ -0,0 +1,1537 @@ +// MiscFixed font, converted from 6x9.bdf by bdf2gfx.py +// Range: U+0020-U+04FF (618 glyphs defined, rest placeholders) +// Metrics: ascent=7 descent=2 yAdvance=9 +#pragma once +#include + +static const uint8_t MiscFixedBitmaps[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x20, 0x02, 0x00, 0x00, 0x01, 0x45, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x3E, 0x53, 0xE5, 0x14, 0x00, 0x21, 0xCA, 0xA8, 0x70, + 0xAA, 0x9C, 0x20, 0x42, 0xA4, 0x84, 0x21, 0x25, 0x42, 0x00, 0x01, 0x89, 0x24, 0x62, 0x69, 0x1A, + 0x00, 0x00, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0x20, 0x82, 0x04, 0x00, 0x00, + 0x81, 0x04, 0x10, 0x41, 0x08, 0x00, 0x00, 0x08, 0x94, 0xF9, 0x48, 0x80, 0x00, 0x00, 0x02, 0x08, + 0xF8, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x04, 0x20, 0x00, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x20, 0x84, 0x21, 0x04, 0x00, 0x00, + 0x00, 0xC4, 0x92, 0x49, 0x23, 0x00, 0x00, 0x00, 0x86, 0x08, 0x20, 0x87, 0x00, 0x00, 0x00, 0xC4, + 0x82, 0x10, 0x87, 0x80, 0x00, 0x01, 0xE1, 0x0C, 0x08, 0x27, 0x00, 0x00, 0x00, 0x43, 0x14, 0x93, + 0xE1, 0x00, 0x00, 0x01, 0xE4, 0x1C, 0x08, 0x27, 0x00, 0x00, 0x00, 0xC4, 0x1C, 0x49, 0x23, 0x00, + 0x00, 0x01, 0xE0, 0x82, 0x10, 0x82, 0x00, 0x00, 0x00, 0xC4, 0x8C, 0x49, 0x23, 0x00, 0x00, 0x00, + 0xC4, 0x92, 0x38, 0x23, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x03, 0x0C, + 0x00, 0xC1, 0x04, 0x20, 0x00, 0x01, 0x98, 0x81, 0x81, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x03, 0xE0, + 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x08, 0xCC, 0x00, 0x00, 0x31, 0x20, 0x8C, 0x20, 0x02, 0x00, 0x00, + 0x01, 0xC9, 0x2A, 0xB2, 0x07, 0x00, 0x00, 0x00, 0x85, 0x22, 0xFA, 0x28, 0x80, 0x00, 0x03, 0xC8, + 0xBC, 0x8A, 0x2F, 0x00, 0x00, 0x00, 0xC4, 0x90, 0x41, 0x23, 0x00, 0x00, 0x01, 0xC4, 0x92, 0x49, + 0x27, 0x00, 0x00, 0x01, 0xE4, 0x1C, 0x41, 0x07, 0x80, 0x00, 0x01, 0xE4, 0x1C, 0x41, 0x04, 0x00, + 0x00, 0x00, 0xC4, 0x90, 0x59, 0x23, 0x00, 0x00, 0x01, 0x24, 0x9E, 0x49, 0x24, 0x80, 0x00, 0x01, + 0xC2, 0x08, 0x20, 0x87, 0x00, 0x00, 0x00, 0xE1, 0x04, 0x12, 0x46, 0x00, 0x00, 0x01, 0x25, 0x18, + 0x51, 0x24, 0x80, 0x00, 0x01, 0x04, 0x10, 0x41, 0x07, 0x80, 0x00, 0x02, 0x2D, 0xAA, 0xAA, 0x28, + 0x80, 0x00, 0x01, 0x26, 0x96, 0x49, 0x24, 0x80, 0x00, 0x01, 0xC8, 0xA2, 0x8A, 0x27, 0x00, 0x00, + 0x01, 0xC4, 0x92, 0x71, 0x04, 0x00, 0x00, 0x00, 0xC4, 0x92, 0x69, 0x63, 0x02, 0x00, 0x01, 0xC4, + 0x92, 0x71, 0x24, 0x80, 0x00, 0x00, 0xC4, 0x88, 0x11, 0x23, 0x00, 0x00, 0x03, 0xE2, 0x08, 0x20, + 0x82, 0x00, 0x00, 0x01, 0x24, 0x92, 0x49, 0x23, 0x00, 0x00, 0x01, 0x24, 0x92, 0x78, 0xC3, 0x00, + 0x00, 0x02, 0x28, 0xAA, 0xAB, 0x68, 0x80, 0x00, 0x02, 0x25, 0x08, 0x21, 0x48, 0x80, 0x00, 0x02, + 0x28, 0x94, 0x20, 0x82, 0x00, 0x00, 0x01, 0xE0, 0x84, 0x21, 0x07, 0x80, 0x00, 0x01, 0xC4, 0x10, + 0x41, 0x07, 0x00, 0x00, 0x01, 0x04, 0x08, 0x10, 0x20, 0x80, 0x00, 0x01, 0xC1, 0x04, 0x10, 0x47, + 0x00, 0x00, 0x00, 0x85, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x49, 0x23, 0x80, 0x00, 0x01, 0x04, + 0x1C, 0x49, 0x27, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x41, 0x03, 0x80, 0x00, 0x00, 0x20, 0x8E, 0x49, + 0x23, 0x80, 0x00, 0x00, 0x00, 0x0C, 0x59, 0x83, 0x80, 0x00, 0x00, 0x42, 0x88, 0x70, 0x82, 0x00, + 0x00, 0x00, 0x00, 0x0C, 0x49, 0x23, 0x82, 0x30, 0x01, 0x04, 0x1C, 0x49, 0x24, 0x80, 0x00, 0x00, + 0x80, 0x18, 0x20, 0x87, 0x00, 0x00, 0x00, 0x40, 0x0C, 0x10, 0x41, 0x14, 0x20, 0x01, 0x04, 0x14, + 0x61, 0x44, 0x80, 0x00, 0x01, 0x82, 0x08, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, 0x34, 0xAA, 0xA8, + 0x80, 0x00, 0x00, 0x00, 0x1C, 0x49, 0x24, 0x80, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x1C, 0x49, 0x27, 0x10, 0x40, 0x00, 0x00, 0x0E, 0x49, 0x23, 0x82, 0x08, 0x00, 0x00, + 0x14, 0x69, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x60, 0x67, 0x00, 0x00, 0x00, 0x82, 0x1C, 0x20, + 0xA1, 0x00, 0x00, 0x00, 0x00, 0x12, 0x49, 0x23, 0x80, 0x00, 0x00, 0x00, 0x12, 0x48, 0xC3, 0x00, + 0x00, 0x00, 0x00, 0x22, 0xAA, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x12, 0x30, 0xC4, 0x80, 0x00, 0x00, + 0x00, 0x12, 0x49, 0x23, 0x92, 0x30, 0x00, 0x00, 0x1E, 0x10, 0x87, 0x80, 0x00, 0x10, 0x82, 0x10, + 0x20, 0x81, 0x00, 0x00, 0x00, 0x82, 0x08, 0x20, 0x82, 0x08, 0x00, 0x40, 0x82, 0x04, 0x20, 0x84, + 0x00, 0x00, 0x00, 0x02, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x08, 0x20, 0x82, 0x00, 0x00, 0x00, 0x01, 0x0E, 0x51, 0x43, 0x84, 0x00, 0x00, 0xC4, + 0x90, 0xF1, 0x04, 0x3E, 0x00, 0x00, 0x0A, 0x94, 0x89, 0x4A, 0x80, 0x00, 0x02, 0x25, 0x3E, 0x23, + 0xE2, 0x00, 0x00, 0x00, 0x82, 0x08, 0x00, 0x82, 0x08, 0x00, 0x00, 0xE4, 0x0C, 0x48, 0xC0, 0x9C, + 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x19, 0x69, 0x96, 0x17, 0x80, 0x00, 0x00, + 0xC5, 0x0C, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x02, 0x94, 0xA1, 0x42, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7A, 0x1B, 0x69, 0xA6, 0x17, + 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x12, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x82, 0x3E, 0x20, 0x80, 0x3E, 0x00, 0x00, 0x85, 0x04, 0x21, 0xC0, 0x00, 0x00, 0x01, 0x81, + 0x08, 0x11, 0x80, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x49, + 0x66, 0x90, 0x00, 0x01, 0xEE, 0xBA, 0x68, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x86, 0x08, 0x21, 0xC0, 0x00, 0x00, 0x00, + 0x85, 0x08, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x0A, 0x14, 0x29, 0x4A, 0x00, 0x00, 0x43, 0x04, 0x14, + 0x70, 0xC7, 0x84, 0x00, 0x43, 0x04, 0x14, 0x68, 0x21, 0x0E, 0x00, 0xC0, 0x84, 0x0C, 0xF0, 0xC7, + 0x84, 0x00, 0x10, 0x01, 0x0C, 0x41, 0x23, 0x00, 0x00, 0x40, 0x82, 0x14, 0x72, 0x28, 0x80, 0x00, + 0x10, 0x82, 0x14, 0x72, 0x28, 0x80, 0x00, 0x21, 0x42, 0x14, 0x72, 0x28, 0x80, 0x00, 0x29, 0x42, + 0x14, 0x72, 0x28, 0x80, 0x00, 0x50, 0x02, 0x14, 0x72, 0x28, 0x80, 0x00, 0x21, 0x42, 0x14, 0x72, + 0x28, 0x80, 0x00, 0x01, 0xEA, 0x3C, 0xA2, 0x8B, 0x80, 0x00, 0x00, 0xC4, 0x90, 0x41, 0x23, 0x04, + 0x20, 0x20, 0x47, 0x90, 0x71, 0x07, 0x80, 0x00, 0x10, 0x87, 0x90, 0x71, 0x07, 0x80, 0x00, 0x10, + 0xA7, 0x90, 0x71, 0x07, 0x80, 0x00, 0x28, 0x07, 0x90, 0x71, 0x07, 0x80, 0x00, 0x40, 0x87, 0x08, + 0x20, 0x87, 0x00, 0x00, 0x10, 0x87, 0x08, 0x20, 0x87, 0x00, 0x00, 0x21, 0x47, 0x08, 0x20, 0x87, + 0x00, 0x00, 0x50, 0x07, 0x08, 0x20, 0x87, 0x00, 0x00, 0x01, 0xC4, 0xBA, 0x49, 0x27, 0x00, 0x00, + 0x29, 0x44, 0x9A, 0x59, 0x24, 0x80, 0x00, 0x20, 0x43, 0x12, 0x49, 0x23, 0x00, 0x00, 0x10, 0x83, + 0x12, 0x49, 0x23, 0x00, 0x00, 0x10, 0xA3, 0x12, 0x49, 0x23, 0x00, 0x00, 0x29, 0x43, 0x12, 0x49, + 0x23, 0x00, 0x00, 0x28, 0x03, 0x12, 0x49, 0x23, 0x00, 0x00, 0x00, 0x08, 0x94, 0x21, 0x48, 0x80, + 0x00, 0x08, 0xE5, 0x96, 0x69, 0xA7, 0x10, 0x00, 0x20, 0x44, 0x92, 0x49, 0x23, 0x00, 0x00, 0x10, + 0x84, 0x92, 0x49, 0x23, 0x00, 0x00, 0x10, 0xA4, 0x92, 0x49, 0x23, 0x00, 0x00, 0x28, 0x04, 0x92, + 0x49, 0x23, 0x00, 0x00, 0x10, 0x88, 0x94, 0x20, 0x82, 0x00, 0x00, 0x01, 0x07, 0x12, 0x49, 0xC4, + 0x00, 0x00, 0x00, 0xC4, 0x94, 0x51, 0x25, 0x00, 0x00, 0x20, 0x40, 0x0E, 0x49, 0x23, 0x80, 0x00, + 0x10, 0x80, 0x0E, 0x49, 0x23, 0x80, 0x00, 0x10, 0xA0, 0x0E, 0x49, 0x23, 0x80, 0x00, 0x29, 0x40, + 0x0E, 0x49, 0x23, 0x80, 0x00, 0x00, 0xA0, 0x0E, 0x49, 0x23, 0x80, 0x00, 0x10, 0xA1, 0x0E, 0x49, + 0x23, 0x80, 0x00, 0x00, 0x00, 0x1C, 0xAA, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x41, 0x03, 0x84, + 0x20, 0x20, 0x40, 0x0C, 0x59, 0x83, 0x80, 0x00, 0x10, 0x80, 0x0C, 0x59, 0x83, 0x80, 0x00, 0x10, + 0xA0, 0x0C, 0x59, 0x83, 0x80, 0x00, 0x00, 0xA0, 0x0C, 0x59, 0x83, 0x80, 0x00, 0x40, 0x80, 0x18, + 0x20, 0x87, 0x00, 0x00, 0x10, 0x80, 0x18, 0x20, 0x87, 0x00, 0x00, 0x21, 0x40, 0x18, 0x20, 0x87, + 0x00, 0x00, 0x01, 0x40, 0x18, 0x20, 0x87, 0x00, 0x00, 0x18, 0xC0, 0x8E, 0x49, 0x23, 0x00, 0x00, + 0x29, 0x40, 0x1C, 0x49, 0x24, 0x80, 0x00, 0x20, 0x40, 0x0C, 0x49, 0x23, 0x00, 0x00, 0x10, 0x80, + 0x0C, 0x49, 0x23, 0x00, 0x00, 0x10, 0xA0, 0x0C, 0x49, 0x23, 0x00, 0x00, 0x29, 0x40, 0x0C, 0x49, + 0x23, 0x00, 0x00, 0x00, 0xA0, 0x0C, 0x49, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0xF8, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x0E, 0x59, 0xA7, 0x00, 0x00, 0x20, 0x40, 0x12, 0x49, 0x23, 0x80, 0x00, 0x10, + 0x80, 0x12, 0x49, 0x23, 0x80, 0x00, 0x10, 0xA0, 0x12, 0x49, 0x23, 0x80, 0x00, 0x00, 0xA0, 0x12, + 0x49, 0x23, 0x80, 0x00, 0x10, 0x80, 0x12, 0x49, 0x23, 0x92, 0x30, 0x01, 0x04, 0x1C, 0x49, 0x27, + 0x10, 0x40, 0x00, 0xA0, 0x12, 0x49, 0x23, 0x92, 0x30, 0x70, 0x02, 0x14, 0x72, 0x28, 0x80, 0x00, + 0x00, 0xE0, 0x0E, 0x49, 0x23, 0x80, 0x00, 0x91, 0x82, 0x14, 0x72, 0x28, 0x80, 0x00, 0x48, 0xC0, + 0x0E, 0x49, 0x23, 0x80, 0x00, 0x00, 0x85, 0x22, 0xFA, 0x28, 0x84, 0x08, 0x00, 0x00, 0x0E, 0x49, + 0x23, 0x84, 0x08, 0x10, 0x83, 0x12, 0x41, 0x23, 0x00, 0x00, 0x10, 0x80, 0x0E, 0x41, 0x03, 0x80, + 0x00, 0x10, 0xA3, 0x12, 0x41, 0x23, 0x00, 0x00, 0x10, 0xA0, 0x0E, 0x41, 0x03, 0x80, 0x00, 0x10, + 0x03, 0x12, 0x41, 0x23, 0x00, 0x00, 0x00, 0x40, 0x0E, 0x41, 0x03, 0x80, 0x00, 0x28, 0x43, 0x12, + 0x41, 0x23, 0x00, 0x00, 0x28, 0x40, 0x0E, 0x41, 0x03, 0x80, 0x00, 0x28, 0x47, 0x12, 0x49, 0x27, + 0x00, 0x00, 0x50, 0xA0, 0x8E, 0x49, 0x23, 0x80, 0x00, 0x01, 0xC4, 0xBA, 0x49, 0x27, 0x00, 0x00, + 0x00, 0x43, 0x9C, 0x92, 0x47, 0x00, 0x00, 0x78, 0x07, 0x90, 0x71, 0x07, 0x80, 0x00, 0x01, 0xE0, + 0x0C, 0x59, 0x83, 0x80, 0x00, 0x48, 0xC7, 0x90, 0x71, 0x07, 0x80, 0x00, 0x48, 0xC0, 0x0C, 0x59, + 0x83, 0x80, 0x00, 0x20, 0x07, 0x90, 0x71, 0x07, 0x80, 0x00, 0x00, 0x80, 0x0C, 0x59, 0x83, 0x80, + 0x00, 0x01, 0xE4, 0x1C, 0x41, 0x07, 0x88, 0x10, 0x00, 0x00, 0x0C, 0x59, 0x83, 0x88, 0x10, 0x28, + 0x47, 0x90, 0x71, 0x07, 0x80, 0x00, 0x28, 0x40, 0x0C, 0x59, 0x83, 0x80, 0x00, 0x10, 0xA3, 0x90, + 0x59, 0x23, 0x00, 0x00, 0x10, 0xA0, 0x0C, 0x49, 0x23, 0x82, 0x30, 0x48, 0xC3, 0x90, 0x59, 0x23, + 0x00, 0x00, 0x48, 0xC0, 0x0C, 0x49, 0x23, 0x82, 0x30, 0x10, 0x03, 0x90, 0x59, 0x23, 0x00, 0x00, + 0x00, 0x40, 0x0C, 0x49, 0x23, 0x82, 0x30, 0x00, 0xC4, 0x90, 0x59, 0x23, 0x04, 0x20, 0x00, 0x42, + 0x0C, 0x49, 0x23, 0x82, 0x30, 0x10, 0xA0, 0x12, 0x79, 0x24, 0x80, 0x00, 0x12, 0xA8, 0x38, 0x92, + 0x49, 0x00, 0x00, 0x01, 0x4F, 0x94, 0x71, 0x45, 0x00, 0x00, 0x01, 0x0E, 0x1C, 0x49, 0x24, 0x80, + 0x00, 0x29, 0x43, 0x84, 0x10, 0x43, 0x80, 0x00, 0x29, 0x40, 0x0C, 0x10, 0x43, 0x80, 0x00, 0x70, + 0x07, 0x08, 0x20, 0x87, 0x00, 0x00, 0x01, 0xC0, 0x18, 0x20, 0x87, 0x00, 0x00, 0x48, 0xC0, 0x0E, + 0x10, 0x43, 0x80, 0x00, 0x48, 0xC0, 0x0C, 0x10, 0x43, 0x80, 0x00, 0x01, 0xC2, 0x08, 0x20, 0x87, + 0x08, 0x10, 0x00, 0x80, 0x18, 0x20, 0x87, 0x08, 0x10, 0x20, 0x07, 0x08, 0x20, 0x87, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x20, 0x87, 0x00, 0x00, 0x02, 0xE8, 0xA2, 0x8A, 0xA9, 0x00, 0x00, 0x02, 0x20, + 0x26, 0x8A, 0x28, 0x8A, 0x10, 0x10, 0xA3, 0x84, 0x12, 0x46, 0x00, 0x00, 0x10, 0xA0, 0x0C, 0x10, + 0x41, 0x14, 0x20, 0x01, 0x25, 0x18, 0x51, 0x24, 0x88, 0x40, 0x01, 0x04, 0x14, 0x61, 0x44, 0x88, + 0x40, 0x00, 0x00, 0x16, 0x61, 0x44, 0x80, 0x00, 0x08, 0x44, 0x10, 0x41, 0x07, 0x80, 0x00, 0x21, + 0x06, 0x08, 0x20, 0x87, 0x00, 0x00, 0x01, 0x04, 0x10, 0x41, 0x07, 0x84, 0x20, 0x01, 0x82, 0x08, + 0x20, 0x87, 0x08, 0x40, 0x28, 0x44, 0x10, 0x41, 0x07, 0x80, 0x00, 0x50, 0x86, 0x08, 0x20, 0x87, + 0x00, 0x00, 0x01, 0x04, 0x14, 0x41, 0x07, 0x80, 0x00, 0x01, 0x82, 0x0A, 0x20, 0x87, 0x00, 0x00, + 0x01, 0x04, 0x18, 0xC1, 0x07, 0x80, 0x00, 0x01, 0x82, 0x0C, 0x60, 0x87, 0x00, 0x00, 0x10, 0x84, + 0x9A, 0x59, 0x24, 0x80, 0x00, 0x10, 0x80, 0x1C, 0x49, 0x24, 0x80, 0x00, 0x01, 0x26, 0x96, 0x49, + 0x24, 0x88, 0x40, 0x00, 0x00, 0x1C, 0x49, 0x24, 0x88, 0x40, 0x28, 0x44, 0x9A, 0x59, 0x24, 0x80, + 0x00, 0x50, 0x80, 0x1C, 0x49, 0x24, 0x80, 0x00, 0x03, 0x04, 0x2C, 0x28, 0xA2, 0x80, 0x00, 0x01, + 0x26, 0x96, 0x49, 0x24, 0x82, 0x10, 0x00, 0x00, 0x1C, 0x49, 0x24, 0x82, 0x10, 0xF8, 0x07, 0x22, + 0x8A, 0x27, 0x00, 0x00, 0x01, 0xE0, 0x0C, 0x49, 0x23, 0x00, 0x00, 0x89, 0xC7, 0x22, 0x8A, 0x27, + 0x00, 0x00, 0x48, 0xC0, 0x0C, 0x49, 0x23, 0x00, 0x00, 0x4A, 0x47, 0x22, 0x8A, 0x27, 0x00, 0x00, + 0x4A, 0x40, 0x18, 0x92, 0x46, 0x00, 0x00, 0x01, 0xEA, 0x2C, 0xA2, 0x87, 0x80, 0x00, 0x00, 0x00, + 0x14, 0xAA, 0xC5, 0x80, 0x00, 0x10, 0x87, 0x12, 0x71, 0x44, 0x80, 0x00, 0x10, 0x80, 0x14, 0x69, + 0x04, 0x00, 0x00, 0x01, 0xC4, 0x92, 0x71, 0x24, 0x88, 0x40, 0x00, 0x00, 0x14, 0x69, 0x04, 0x08, + 0x40, 0x50, 0x87, 0x12, 0x71, 0x44, 0x80, 0x00, 0x50, 0x80, 0x14, 0x69, 0x04, 0x00, 0x00, 0x10, + 0x83, 0x90, 0x30, 0x27, 0x00, 0x00, 0x10, 0x80, 0x0E, 0x60, 0x67, 0x00, 0x00, 0x10, 0xA3, 0x90, + 0x30, 0x27, 0x00, 0x00, 0x10, 0xA0, 0x0E, 0x60, 0x67, 0x00, 0x00, 0x00, 0xC4, 0x88, 0x11, 0x23, + 0x04, 0x20, 0x00, 0x00, 0x0E, 0x60, 0x67, 0x04, 0x20, 0x28, 0x43, 0x90, 0x30, 0x27, 0x00, 0x00, + 0x28, 0x40, 0x0E, 0x60, 0x67, 0x00, 0x00, 0x03, 0xE2, 0x08, 0x20, 0x82, 0x04, 0x20, 0x00, 0x82, + 0x1C, 0x20, 0xA1, 0x04, 0x20, 0x50, 0x8F, 0x88, 0x20, 0x82, 0x00, 0x00, 0x28, 0x42, 0x1C, 0x20, + 0xA1, 0x00, 0x00, 0x03, 0xE2, 0x08, 0x70, 0x82, 0x00, 0x00, 0x00, 0x82, 0x1C, 0x70, 0xA1, 0x00, + 0x00, 0x29, 0x40, 0x12, 0x49, 0x23, 0x00, 0x00, 0x29, 0x40, 0x12, 0x49, 0x23, 0x80, 0x00, 0x78, + 0x04, 0x92, 0x49, 0x23, 0x00, 0x00, 0x01, 0xE0, 0x12, 0x49, 0x23, 0x80, 0x00, 0x48, 0xC0, 0x12, + 0x49, 0x23, 0x00, 0x00, 0x48, 0xC0, 0x12, 0x49, 0x23, 0x80, 0x00, 0x31, 0x23, 0x12, 0x49, 0x23, + 0x00, 0x00, 0x31, 0x23, 0x12, 0x49, 0x23, 0x80, 0x00, 0x4A, 0x40, 0x24, 0x92, 0x46, 0x00, 0x00, + 0x4A, 0x40, 0x24, 0x92, 0x47, 0x00, 0x00, 0x01, 0x24, 0x92, 0x49, 0x23, 0x08, 0x10, 0x00, 0x00, + 0x12, 0x49, 0x23, 0x88, 0x10, 0x21, 0x40, 0x22, 0xAB, 0x68, 0x80, 0x00, 0x21, 0x40, 0x22, 0xAA, + 0xA5, 0x00, 0x00, 0x21, 0x40, 0x22, 0x50, 0x82, 0x00, 0x00, 0x10, 0xA0, 0x12, 0x49, 0x23, 0x92, + 0x30, 0x50, 0x08, 0x94, 0x20, 0x82, 0x00, 0x00, 0x10, 0x87, 0x84, 0x21, 0x07, 0x80, 0x00, 0x10, + 0x80, 0x1E, 0x10, 0x87, 0x80, 0x00, 0x10, 0x07, 0x84, 0x21, 0x07, 0x80, 0x00, 0x00, 0x40, 0x1E, + 0x10, 0x87, 0x80, 0x00, 0x28, 0x47, 0x84, 0x21, 0x07, 0x80, 0x00, 0x28, 0x40, 0x1E, 0x10, 0x87, + 0x80, 0x00, 0x00, 0x42, 0x98, 0x20, 0x82, 0x00, 0x00, 0x00, 0xC4, 0x82, 0x79, 0x23, 0x00, 0x00, + 0x00, 0x42, 0x88, 0x70, 0x82, 0x08, 0x40, 0x01, 0x99, 0x66, 0x92, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x49, 0x23, 0x00, 0x00, 0x01, 0x55, 0x56, 0x51, 0x42, 0x00, 0x00, 0x00, 0x00, 0x15, 0x59, + 0x43, 0x00, 0x00, 0x01, 0xE0, 0x9E, 0x21, 0x07, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x87, 0x80, + 0x00, 0x28, 0x43, 0x12, 0x49, 0x23, 0x00, 0x00, 0x28, 0x40, 0x0C, 0x49, 0x23, 0x00, 0x00, 0x28, + 0x43, 0x90, 0x59, 0x23, 0x00, 0x00, 0x28, 0x40, 0x0C, 0x49, 0x23, 0x82, 0x30, 0x10, 0x85, 0x08, + 0x51, 0xC5, 0x00, 0x00, 0x08, 0x42, 0x8E, 0x49, 0x23, 0x80, 0x00, 0x10, 0x87, 0xA8, 0xF2, 0x8B, + 0x80, 0x00, 0x10, 0x80, 0x1C, 0xAA, 0xC7, 0x80, 0x00, 0x08, 0x43, 0x96, 0x69, 0xA7, 0x00, 0x00, + 0x10, 0x80, 0x0E, 0x59, 0xA7, 0x00, 0x00, 0x00, 0xC4, 0x88, 0x11, 0x23, 0x04, 0x20, 0x00, 0x00, + 0x0E, 0x60, 0x67, 0x04, 0x20, 0x03, 0xE2, 0x08, 0x20, 0x82, 0x04, 0x20, 0x00, 0x82, 0x1C, 0x20, + 0xA1, 0x04, 0x20, 0x00, 0x00, 0x0C, 0x68, 0x67, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x19, 0xA3, 0x00, + 0x00, 0x00, 0x42, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC2, 0x04, 0x00, 0x00, 0x00, 0x00, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x03, 0x0C, 0x00, 0xC1, + 0x04, 0x20, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x82, 0xC4, 0x92, 0x79, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x82, 0xE2, + 0x0C, 0x20, 0x83, 0x80, 0x00, 0x82, 0xA2, 0x8E, 0x28, 0xA2, 0x80, 0x00, 0x82, 0xE1, 0x04, 0x10, + 0x43, 0x80, 0x00, 0x82, 0xC4, 0x92, 0x49, 0x23, 0x00, 0x00, 0x82, 0xA2, 0x8A, 0x10, 0x41, 0x00, + 0x00, 0x82, 0xC4, 0x92, 0x48, 0xC7, 0x80, 0x00, 0x22, 0xA0, 0x08, 0x20, 0x81, 0x00, 0x00, 0x00, + 0x85, 0x22, 0xFA, 0x28, 0x80, 0x00, 0x03, 0xC8, 0xBC, 0x8A, 0x2F, 0x00, 0x00, 0x01, 0xE4, 0x10, + 0x41, 0x04, 0x00, 0x00, 0x00, 0x82, 0x14, 0x52, 0x2F, 0x80, 0x00, 0x01, 0xE4, 0x1C, 0x41, 0x07, + 0x80, 0x00, 0x01, 0xE0, 0x84, 0x21, 0x07, 0x80, 0x00, 0x01, 0x24, 0x9E, 0x49, 0x24, 0x80, 0x00, + 0x01, 0xC8, 0xBE, 0x8A, 0x27, 0x00, 0x00, 0x01, 0xC2, 0x08, 0x20, 0x87, 0x00, 0x00, 0x01, 0x25, + 0x18, 0x51, 0x24, 0x80, 0x00, 0x00, 0x82, 0x14, 0x52, 0x28, 0x80, 0x00, 0x02, 0x2D, 0xAA, 0xAA, + 0x28, 0x80, 0x00, 0x01, 0x26, 0x96, 0x49, 0x24, 0x80, 0x00, 0x01, 0xE0, 0x0C, 0x00, 0x07, 0x80, + 0x00, 0x01, 0xC8, 0xA2, 0x8A, 0x27, 0x00, 0x00, 0x01, 0xE4, 0x92, 0x49, 0x24, 0x80, 0x00, 0x01, + 0xC4, 0x92, 0x71, 0x04, 0x00, 0x00, 0x01, 0xE4, 0x08, 0x21, 0x07, 0x80, 0x00, 0x03, 0xE2, 0x08, + 0x20, 0x82, 0x00, 0x00, 0x02, 0x28, 0x94, 0x20, 0x82, 0x00, 0x00, 0x00, 0x87, 0x2A, 0xA9, 0xC2, + 0x00, 0x00, 0x02, 0x25, 0x08, 0x21, 0x48, 0x80, 0x00, 0x02, 0xAA, 0xAA, 0x70, 0x82, 0x00, 0x00, + 0x01, 0xC8, 0xA2, 0x89, 0x4D, 0x80, 0x00, 0x50, 0x07, 0x08, 0x20, 0x87, 0x00, 0x00, 0x50, 0x08, + 0x94, 0x20, 0x82, 0x00, 0x00, 0x08, 0x40, 0x0E, 0x49, 0x23, 0x80, 0x00, 0x08, 0x40, 0x0C, 0x59, + 0x83, 0x80, 0x00, 0x10, 0x80, 0x2C, 0xCA, 0x28, 0x82, 0x08, 0x21, 0x00, 0x10, 0x41, 0x42, 0x00, + 0x00, 0x22, 0xA0, 0x22, 0x8A, 0x27, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x49, 0x23, 0x80, 0x00, 0x00, + 0xC4, 0x9C, 0x49, 0x27, 0x10, 0x40, 0x00, 0x00, 0x22, 0x89, 0x45, 0x08, 0x20, 0x01, 0xC8, 0x1C, + 0x8A, 0x27, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x59, 0x83, 0x80, 0x00, 0x03, 0xE2, 0x10, 0x40, 0xC0, + 0x8C, 0x00, 0x00, 0x00, 0x2C, 0xCA, 0x28, 0x82, 0x08, 0x00, 0xC4, 0x9E, 0x49, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x41, 0x42, 0x00, 0x00, 0x00, 0x00, 0x12, 0x51, 0x85, 0x80, 0x00, 0x01, 0xC8, + 0x82, 0x6A, 0x68, 0x80, 0x00, 0x00, 0x00, 0x22, 0x8A, 0x6E, 0xA0, 0x80, 0x00, 0x00, 0x22, 0x89, + 0x42, 0x00, 0x00, 0x03, 0xE2, 0x10, 0x72, 0x07, 0x02, 0x10, 0x00, 0x00, 0x0C, 0x49, 0x23, 0x00, + 0x00, 0x00, 0x00, 0x3E, 0x51, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x8A, 0x2F, 0x20, 0x80, 0x00, + 0x00, 0x1C, 0x8A, 0x07, 0x02, 0x30, 0x00, 0x00, 0x1E, 0x92, 0x27, 0x00, 0x00, 0x00, 0x00, 0x1E, + 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x22, 0x8A, 0x27, 0x00, 0x00, 0x00, 0x00, 0x24, 0xAA, 0xA7, + 0x08, 0x20, 0x00, 0x00, 0x22, 0x50, 0x85, 0x22, 0x88, 0x00, 0x00, 0x2A, 0xAA, 0xA7, 0x08, 0x20, + 0x00, 0x00, 0x14, 0x8A, 0xA5, 0x00, 0x00, 0x01, 0x40, 0x08, 0x20, 0xA1, 0x00, 0x00, 0x01, 0x40, + 0x22, 0x8A, 0x27, 0x00, 0x00, 0x10, 0x80, 0x1C, 0x8A, 0x27, 0x00, 0x00, 0x10, 0x80, 0x22, 0x8A, + 0x27, 0x00, 0x00, 0x10, 0x80, 0x14, 0x8A, 0xA5, 0x00, 0x00, 0x01, 0x89, 0x24, 0xF2, 0x27, 0x00, + 0x00, 0x00, 0x85, 0x0E, 0xD1, 0x42, 0x00, 0x00, 0x02, 0x4A, 0x90, 0x41, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x98, 0xA0, 0x82, 0x00, 0x00, 0xA0, 0x09, 0x2A, 0x41, 0x04, 0x00, 0x00, 0x00, 0x82, 0x1C, + 0xAA, 0xA7, 0x08, 0x20, 0x00, 0x00, 0x3E, 0x8A, 0xA5, 0x00, 0x00, 0x10, 0x80, 0x22, 0x49, 0xC8, + 0x82, 0x30, 0x00, 0xC4, 0xA0, 0x82, 0x07, 0x02, 0x10, 0x00, 0x00, 0x9C, 0x82, 0x07, 0x02, 0x30, + 0x03, 0xE8, 0x20, 0xE2, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x41, 0x07, 0x10, 0x40, 0x02, 0x08, + 0xA6, 0xAB, 0x20, 0x80, 0x00, 0x00, 0x84, 0x20, 0xF8, 0x21, 0x08, 0x20, 0x00, 0x85, 0x14, 0x9A, + 0xAA, 0x80, 0x00, 0x03, 0x81, 0x0C, 0x48, 0x62, 0x82, 0x08, 0x02, 0xAA, 0xAA, 0xA9, 0xE0, 0xBC, + 0x00, 0x00, 0x00, 0x2A, 0xA9, 0xE0, 0xBC, 0x00, 0x01, 0x2A, 0xA2, 0x78, 0x20, 0x80, 0x00, 0x00, + 0x00, 0x0A, 0x48, 0xE0, 0x80, 0x00, 0x02, 0x08, 0x2C, 0xCA, 0x20, 0xBC, 0x00, 0x00, 0x87, 0x2A, + 0x48, 0x2F, 0x00, 0x00, 0x01, 0xC8, 0x82, 0x72, 0x07, 0x80, 0x00, 0x00, 0x07, 0x22, 0x72, 0x07, + 0x80, 0x00, 0x01, 0x4A, 0x88, 0x52, 0x2F, 0x80, 0x00, 0x00, 0x05, 0x2A, 0x21, 0x47, 0x00, 0x00, + 0x00, 0x27, 0x20, 0xF2, 0x27, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x83, 0x67, 0x00, 0x00, 0x01, 0xC2, + 0x3E, 0xA8, 0x87, 0x00, 0x00, 0x00, 0x83, 0x08, 0xFA, 0x82, 0x18, 0x20, 0x00, 0x00, 0x22, 0x49, + 0xC8, 0x80, 0x00, 0x00, 0x00, 0x1C, 0x8A, 0x2F, 0x20, 0x78, 0x00, 0x00, 0x1C, 0x8A, 0x07, 0x80, + 0x00, 0x00, 0x20, 0x06, 0x08, 0x24, 0x92, 0x30, 0x01, 0xC8, 0xBE, 0x8A, 0x27, 0x00, 0x00, 0x00, + 0x00, 0x0E, 0x71, 0x03, 0x80, 0x00, 0x20, 0x47, 0x90, 0x71, 0x07, 0x80, 0x00, 0x28, 0x07, 0x90, + 0x71, 0x07, 0x80, 0x00, 0x03, 0xE2, 0x0C, 0x28, 0xA2, 0x82, 0x10, 0x10, 0x87, 0x90, 0x41, 0x04, + 0x00, 0x00, 0x01, 0xC8, 0xB8, 0x82, 0x27, 0x00, 0x00, 0x00, 0xC4, 0x88, 0x11, 0x23, 0x00, 0x00, + 0x01, 0xC2, 0x08, 0x20, 0x87, 0x00, 0x00, 0x50, 0x07, 0x08, 0x20, 0x87, 0x00, 0x00, 0x00, 0xE1, + 0x04, 0x12, 0x46, 0x00, 0x00, 0x01, 0x8A, 0x2C, 0xAA, 0xAB, 0x00, 0x00, 0x02, 0x8A, 0x3C, 0xAA, + 0xAB, 0x00, 0x00, 0x03, 0xE2, 0x0C, 0x28, 0xA2, 0x80, 0x00, 0x08, 0x44, 0x94, 0x61, 0x44, 0x80, + 0x00, 0x40, 0x88, 0xA6, 0xAB, 0x28, 0x80, 0x00, 0x48, 0xC8, 0xA2, 0x78, 0x27, 0x00, 0x00, 0x02, + 0x28, 0xA2, 0x8A, 0x2F, 0x88, 0x20, 0x00, 0x85, 0x22, 0xFA, 0x28, 0x80, 0x00, 0x03, 0xC8, 0x3C, + 0x8A, 0x2F, 0x00, 0x00, 0x03, 0xC8, 0xBC, 0x8A, 0x2F, 0x00, 0x00, 0x01, 0xE4, 0x10, 0x41, 0x04, + 0x00, 0x00, 0x00, 0xC5, 0x14, 0x51, 0x4F, 0xA2, 0x00, 0x01, 0xE4, 0x1C, 0x41, 0x07, 0x80, 0x00, + 0x02, 0xAA, 0x9C, 0xAA, 0xAA, 0x80, 0x00, 0x01, 0xC8, 0x8C, 0x0A, 0x27, 0x00, 0x00, 0x01, 0x25, + 0x9A, 0x49, 0x24, 0x80, 0x00, 0x48, 0xC4, 0x96, 0x69, 0x24, 0x80, 0x00, 0x01, 0x25, 0x18, 0x51, + 0x24, 0x80, 0x00, 0x00, 0xE4, 0x92, 0x49, 0x28, 0x80, 0x00, 0x02, 0x2D, 0xAA, 0xAA, 0x28, 0x80, + 0x00, 0x01, 0x24, 0x9E, 0x49, 0x24, 0x80, 0x00, 0x01, 0xC8, 0xA2, 0x8A, 0x27, 0x00, 0x00, 0x03, + 0xE8, 0xA2, 0x8A, 0x28, 0x80, 0x00, 0x01, 0xC4, 0x92, 0x71, 0x04, 0x00, 0x00, 0x00, 0xC4, 0x90, + 0x41, 0x23, 0x00, 0x00, 0x03, 0xE2, 0x08, 0x20, 0x82, 0x00, 0x00, 0x02, 0x28, 0xA2, 0x78, 0x27, + 0x00, 0x00, 0x00, 0x87, 0x2A, 0xA9, 0xC2, 0x00, 0x00, 0x02, 0x25, 0x08, 0x21, 0x48, 0x80, 0x00, + 0x02, 0x49, 0x24, 0x92, 0x4F, 0x82, 0x10, 0x02, 0x28, 0xA2, 0x78, 0x20, 0x80, 0x00, 0x02, 0xAA, + 0xAA, 0xAA, 0xAF, 0x80, 0x00, 0x02, 0xAA, 0xAA, 0xAA, 0xAF, 0x82, 0x10, 0x03, 0x04, 0x1C, 0x49, + 0x27, 0x00, 0x00, 0x02, 0x28, 0xBA, 0x9A, 0x6E, 0x80, 0x00, 0x01, 0x04, 0x1C, 0x49, 0x27, 0x00, + 0x00, 0x01, 0xC8, 0x8E, 0x0A, 0x27, 0x00, 0x00, 0x02, 0x4A, 0xBA, 0xEA, 0xA9, 0x00, 0x00, 0x00, + 0xE4, 0x92, 0x39, 0x24, 0x80, 0x00, 0x00, 0x00, 0x1C, 0x92, 0x47, 0x80, 0x00, 0x08, 0xC4, 0x1C, + 0x49, 0x23, 0x00, 0x00, 0x00, 0x00, 0x18, 0x51, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x41, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x0C, 0x51, 0x4F, 0xA2, 0x00, 0x00, 0x00, 0x18, 0x93, 0x87, 0x00, 0x00, + 0x00, 0x00, 0x2A, 0x71, 0xCA, 0x80, 0x00, 0x00, 0x00, 0x0C, 0x28, 0x67, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x9A, 0xAC, 0x80, 0x00, 0x89, 0xC0, 0x22, 0x9A, 0xAC, 0x80, 0x00, 0x00, 0x00, 0x12, 0x51, + 0xC4, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x49, 0x28, 0x80, 0x00, 0x00, 0x00, 0x22, 0xDA, 0xA8, 0x80, + 0x00, 0x00, 0x00, 0x22, 0xFA, 0x28, 0x80, 0x00, 0x00, 0x00, 0x1C, 0x8A, 0x27, 0x00, 0x00, 0x00, + 0x00, 0x3E, 0x8A, 0x28, 0x80, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0x2F, 0x20, 0x80, 0x00, 0x00, 0x1C, + 0x8A, 0x07, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, 0x22, 0x8A, 0x27, + 0x82, 0x70, 0x00, 0x82, 0x1C, 0xAA, 0xA7, 0x08, 0x20, 0x00, 0x00, 0x12, 0x30, 0xC4, 0x80, 0x00, + 0x00, 0x00, 0x24, 0x92, 0x4F, 0x82, 0x10, 0x00, 0x00, 0x22, 0x89, 0xE0, 0x80, 0x00, 0x00, 0x00, + 0x2A, 0xAA, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x2A, 0xAA, 0xAF, 0x82, 0x10, 0x00, 0x00, 0x30, 0x71, + 0x27, 0x00, 0x00, 0x00, 0x00, 0x22, 0xEA, 0x6E, 0x80, 0x00, 0x00, 0x00, 0x10, 0x71, 0x27, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x50, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x24, 0xEB, 0xA9, 0x00, 0x00, 0x00, + 0x00, 0x1C, 0x91, 0xC9, 0x00, 0x00, 0x20, 0x40, 0x0C, 0x49, 0xC3, 0x80, 0x00, 0x01, 0x40, 0x0C, + 0x49, 0xC3, 0x80, 0x00, 0x01, 0x0E, 0x10, 0x71, 0x24, 0x82, 0x10, 0x10, 0x80, 0x1E, 0x41, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x0E, 0x51, 0x83, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x60, 0x67, 0x00, 0x00, + 0x00, 0x80, 0x18, 0x20, 0x87, 0x00, 0x00, 0x01, 0x40, 0x18, 0x20, 0x87, 0x00, 0x00, 0x00, 0x20, + 0x06, 0x08, 0x20, 0x92, 0x30, 0x00, 0x00, 0x18, 0xB2, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF2, + 0xAB, 0x00, 0x00, 0x01, 0x0E, 0x10, 0x71, 0x24, 0x80, 0x00, 0x10, 0x80, 0x12, 0x51, 0xC4, 0x80, + 0x00, 0x40, 0x80, 0x22, 0x9A, 0xAC, 0x80, 0x00, 0x01, 0x23, 0x00, 0x8A, 0x27, 0x82, 0x70, 0x00, + 0x00, 0x22, 0x8A, 0x2F, 0x88, 0x20, 0x43, 0x84, 0x1C, 0x49, 0x27, 0x00, 0x00, 0x01, 0x04, 0x38, + 0x71, 0x27, 0x00, 0x00, 0x02, 0xAA, 0xAA, 0x70, 0x82, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xA9, 0xC2, + 0x00, 0x00, 0x01, 0xC8, 0xBE, 0x8A, 0x27, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAB, 0x67, 0x00, 0x00, + 0x01, 0x04, 0x96, 0x70, 0x82, 0x00, 0x00, 0x00, 0x00, 0x10, 0x58, 0xC2, 0x00, 0x00, 0x09, 0xE4, + 0x10, 0x41, 0x04, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x41, 0x04, 0x00, 0x00, 0x01, 0xE4, 0x3C, 0x41, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x43, 0x84, 0x00, 0x00, 0x02, 0xAA, 0x9C, 0xAA, 0xAA, 0xC1, + 0x04, 0x00, 0x00, 0x2A, 0x71, 0xCA, 0x81, 0x04, 0x01, 0x25, 0x18, 0x51, 0x24, 0x81, 0x04, 0x00, + 0x00, 0x12, 0x51, 0xC4, 0x81, 0x04, 0x02, 0x28, 0x94, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, 0x22, + 0x89, 0x42, 0x08, 0x20, 0x02, 0x28, 0x94, 0xF8, 0x82, 0x00, 0x00, 0x00, 0x00, 0x22, 0x89, 0x4F, + 0x88, 0x20, 0x02, 0x25, 0x08, 0x21, 0x48, 0x81, 0x04, 0x00, 0x00, 0x12, 0x30, 0xC4, 0x81, 0x04, + 0x02, 0x08, 0x3C, 0x8A, 0x28, 0x80, 0x00, 0x01, 0x04, 0x1C, 0x49, 0x24, 0x80, 0x00, 0x00, 0xC4, + 0x82, 0x79, 0x23, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x19, 0xA3, 0x00, 0x00, 0x70, 0x07, 0x08, 0x20, + 0x87, 0x00, 0x00, 0x01, 0xC0, 0x18, 0x20, 0x87, 0x00, 0x00, 0x01, 0xC8, 0xBE, 0x8A, 0x27, 0x00, + 0x00, 0x00, 0x00, 0x0C, 0x79, 0x23, 0x00, 0x00, 0x78, 0x04, 0x92, 0x49, 0x23, 0x00, 0x00, 0x01, + 0xE0, 0x12, 0x49, 0x23, 0x80, 0x00, +}; + +static const GFXglyph MiscFixedGlyphs[] PROGMEM = { + { 0, 6, 9, 6, 0, -7 }, // U+0020 + { 7, 6, 9, 6, 0, -7 }, // U+0021 + { 14, 6, 9, 6, 0, -7 }, // U+0022 + { 21, 6, 9, 6, 0, -7 }, // U+0023 + { 28, 6, 9, 6, 0, -7 }, // U+0024 + { 35, 6, 9, 6, 0, -7 }, // U+0025 + { 42, 6, 9, 6, 0, -7 }, // U+0026 + { 49, 6, 9, 6, 0, -7 }, // U+0027 + { 56, 6, 9, 6, 0, -7 }, // U+0028 + { 63, 6, 9, 6, 0, -7 }, // U+0029 + { 70, 6, 9, 6, 0, -7 }, // U+002A + { 77, 6, 9, 6, 0, -7 }, // U+002B + { 84, 6, 9, 6, 0, -7 }, // U+002C + { 91, 6, 9, 6, 0, -7 }, // U+002D + { 98, 6, 9, 6, 0, -7 }, // U+002E + { 105, 6, 9, 6, 0, -7 }, // U+002F + { 112, 6, 9, 6, 0, -7 }, // U+0030 + { 119, 6, 9, 6, 0, -7 }, // U+0031 + { 126, 6, 9, 6, 0, -7 }, // U+0032 + { 133, 6, 9, 6, 0, -7 }, // U+0033 + { 140, 6, 9, 6, 0, -7 }, // U+0034 + { 147, 6, 9, 6, 0, -7 }, // U+0035 + { 154, 6, 9, 6, 0, -7 }, // U+0036 + { 161, 6, 9, 6, 0, -7 }, // U+0037 + { 168, 6, 9, 6, 0, -7 }, // U+0038 + { 175, 6, 9, 6, 0, -7 }, // U+0039 + { 182, 6, 9, 6, 0, -7 }, // U+003A + { 189, 6, 9, 6, 0, -7 }, // U+003B + { 196, 6, 9, 6, 0, -7 }, // U+003C + { 203, 6, 9, 6, 0, -7 }, // U+003D + { 210, 6, 9, 6, 0, -7 }, // U+003E + { 217, 6, 9, 6, 0, -7 }, // U+003F + { 224, 6, 9, 6, 0, -7 }, // U+0040 + { 231, 6, 9, 6, 0, -7 }, // U+0041 + { 238, 6, 9, 6, 0, -7 }, // U+0042 + { 245, 6, 9, 6, 0, -7 }, // U+0043 + { 252, 6, 9, 6, 0, -7 }, // U+0044 + { 259, 6, 9, 6, 0, -7 }, // U+0045 + { 266, 6, 9, 6, 0, -7 }, // U+0046 + { 273, 6, 9, 6, 0, -7 }, // U+0047 + { 280, 6, 9, 6, 0, -7 }, // U+0048 + { 287, 6, 9, 6, 0, -7 }, // U+0049 + { 294, 6, 9, 6, 0, -7 }, // U+004A + { 301, 6, 9, 6, 0, -7 }, // U+004B + { 308, 6, 9, 6, 0, -7 }, // U+004C + { 315, 6, 9, 6, 0, -7 }, // U+004D + { 322, 6, 9, 6, 0, -7 }, // U+004E + { 329, 6, 9, 6, 0, -7 }, // U+004F + { 336, 6, 9, 6, 0, -7 }, // U+0050 + { 343, 6, 9, 6, 0, -7 }, // U+0051 + { 350, 6, 9, 6, 0, -7 }, // U+0052 + { 357, 6, 9, 6, 0, -7 }, // U+0053 + { 364, 6, 9, 6, 0, -7 }, // U+0054 + { 371, 6, 9, 6, 0, -7 }, // U+0055 + { 378, 6, 9, 6, 0, -7 }, // U+0056 + { 385, 6, 9, 6, 0, -7 }, // U+0057 + { 392, 6, 9, 6, 0, -7 }, // U+0058 + { 399, 6, 9, 6, 0, -7 }, // U+0059 + { 406, 6, 9, 6, 0, -7 }, // U+005A + { 413, 6, 9, 6, 0, -7 }, // U+005B + { 420, 6, 9, 6, 0, -7 }, // U+005C + { 427, 6, 9, 6, 0, -7 }, // U+005D + { 434, 6, 9, 6, 0, -7 }, // U+005E + { 441, 6, 9, 6, 0, -7 }, // U+005F + { 448, 6, 9, 6, 0, -7 }, // U+0060 + { 455, 6, 9, 6, 0, -7 }, // U+0061 + { 462, 6, 9, 6, 0, -7 }, // U+0062 + { 469, 6, 9, 6, 0, -7 }, // U+0063 + { 476, 6, 9, 6, 0, -7 }, // U+0064 + { 483, 6, 9, 6, 0, -7 }, // U+0065 + { 490, 6, 9, 6, 0, -7 }, // U+0066 + { 497, 6, 9, 6, 0, -7 }, // U+0067 + { 504, 6, 9, 6, 0, -7 }, // U+0068 + { 511, 6, 9, 6, 0, -7 }, // U+0069 + { 518, 6, 9, 6, 0, -7 }, // U+006A + { 525, 6, 9, 6, 0, -7 }, // U+006B + { 532, 6, 9, 6, 0, -7 }, // U+006C + { 539, 6, 9, 6, 0, -7 }, // U+006D + { 546, 6, 9, 6, 0, -7 }, // U+006E + { 553, 6, 9, 6, 0, -7 }, // U+006F + { 560, 6, 9, 6, 0, -7 }, // U+0070 + { 567, 6, 9, 6, 0, -7 }, // U+0071 + { 574, 6, 9, 6, 0, -7 }, // U+0072 + { 581, 6, 9, 6, 0, -7 }, // U+0073 + { 588, 6, 9, 6, 0, -7 }, // U+0074 + { 595, 6, 9, 6, 0, -7 }, // U+0075 + { 602, 6, 9, 6, 0, -7 }, // U+0076 + { 609, 6, 9, 6, 0, -7 }, // U+0077 + { 616, 6, 9, 6, 0, -7 }, // U+0078 + { 623, 6, 9, 6, 0, -7 }, // U+0079 + { 630, 6, 9, 6, 0, -7 }, // U+007A + { 637, 6, 9, 6, 0, -7 }, // U+007B + { 644, 6, 9, 6, 0, -7 }, // U+007C + { 651, 6, 9, 6, 0, -7 }, // U+007D + { 658, 6, 9, 6, 0, -7 }, // U+007E + { 665, 0, 0, 6, 0, 0 }, // U+007F (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0080 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0081 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0082 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0083 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0084 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0085 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0086 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0087 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0088 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0089 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+008A (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+008B (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+008C (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+008D (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+008E (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+008F (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0090 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0091 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0092 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0093 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0094 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0095 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0096 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0097 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0098 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+0099 (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+009A (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+009B (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+009C (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+009D (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+009E (placeholder) + { 665, 0, 0, 6, 0, 0 }, // U+009F (placeholder) + { 665, 6, 9, 6, 0, -7 }, // U+00A0 + { 672, 6, 9, 6, 0, -7 }, // U+00A1 + { 679, 6, 9, 6, 0, -7 }, // U+00A2 + { 686, 6, 9, 6, 0, -7 }, // U+00A3 + { 693, 6, 9, 6, 0, -7 }, // U+00A4 + { 700, 6, 9, 6, 0, -7 }, // U+00A5 + { 707, 6, 9, 6, 0, -7 }, // U+00A6 + { 714, 6, 9, 6, 0, -7 }, // U+00A7 + { 721, 6, 9, 6, 0, -7 }, // U+00A8 + { 728, 6, 9, 6, 0, -7 }, // U+00A9 + { 735, 6, 9, 6, 0, -7 }, // U+00AA + { 742, 6, 9, 6, 0, -7 }, // U+00AB + { 749, 6, 9, 6, 0, -7 }, // U+00AC + { 756, 6, 9, 6, 0, -7 }, // U+00AD + { 763, 6, 9, 6, 0, -7 }, // U+00AE + { 770, 6, 9, 6, 0, -7 }, // U+00AF + { 777, 6, 9, 6, 0, -7 }, // U+00B0 + { 784, 6, 9, 6, 0, -7 }, // U+00B1 + { 791, 6, 9, 6, 0, -7 }, // U+00B2 + { 798, 6, 9, 6, 0, -7 }, // U+00B3 + { 805, 6, 9, 6, 0, -7 }, // U+00B4 + { 812, 6, 9, 6, 0, -7 }, // U+00B5 + { 819, 6, 9, 6, 0, -7 }, // U+00B6 + { 826, 6, 9, 6, 0, -7 }, // U+00B7 + { 833, 6, 9, 6, 0, -7 }, // U+00B8 + { 840, 6, 9, 6, 0, -7 }, // U+00B9 + { 847, 6, 9, 6, 0, -7 }, // U+00BA + { 854, 6, 9, 6, 0, -7 }, // U+00BB + { 861, 6, 9, 6, 0, -7 }, // U+00BC + { 868, 6, 9, 6, 0, -7 }, // U+00BD + { 875, 6, 9, 6, 0, -7 }, // U+00BE + { 882, 6, 9, 6, 0, -7 }, // U+00BF + { 889, 6, 9, 6, 0, -7 }, // U+00C0 + { 896, 6, 9, 6, 0, -7 }, // U+00C1 + { 903, 6, 9, 6, 0, -7 }, // U+00C2 + { 910, 6, 9, 6, 0, -7 }, // U+00C3 + { 917, 6, 9, 6, 0, -7 }, // U+00C4 + { 924, 6, 9, 6, 0, -7 }, // U+00C5 + { 931, 6, 9, 6, 0, -7 }, // U+00C6 + { 938, 6, 9, 6, 0, -7 }, // U+00C7 + { 945, 6, 9, 6, 0, -7 }, // U+00C8 + { 952, 6, 9, 6, 0, -7 }, // U+00C9 + { 959, 6, 9, 6, 0, -7 }, // U+00CA + { 966, 6, 9, 6, 0, -7 }, // U+00CB + { 973, 6, 9, 6, 0, -7 }, // U+00CC + { 980, 6, 9, 6, 0, -7 }, // U+00CD + { 987, 6, 9, 6, 0, -7 }, // U+00CE + { 994, 6, 9, 6, 0, -7 }, // U+00CF + { 1001, 6, 9, 6, 0, -7 }, // U+00D0 + { 1008, 6, 9, 6, 0, -7 }, // U+00D1 + { 1015, 6, 9, 6, 0, -7 }, // U+00D2 + { 1022, 6, 9, 6, 0, -7 }, // U+00D3 + { 1029, 6, 9, 6, 0, -7 }, // U+00D4 + { 1036, 6, 9, 6, 0, -7 }, // U+00D5 + { 1043, 6, 9, 6, 0, -7 }, // U+00D6 + { 1050, 6, 9, 6, 0, -7 }, // U+00D7 + { 1057, 6, 9, 6, 0, -7 }, // U+00D8 + { 1064, 6, 9, 6, 0, -7 }, // U+00D9 + { 1071, 6, 9, 6, 0, -7 }, // U+00DA + { 1078, 6, 9, 6, 0, -7 }, // U+00DB + { 1085, 6, 9, 6, 0, -7 }, // U+00DC + { 1092, 6, 9, 6, 0, -7 }, // U+00DD + { 1099, 6, 9, 6, 0, -7 }, // U+00DE + { 1106, 6, 9, 6, 0, -7 }, // U+00DF + { 1113, 6, 9, 6, 0, -7 }, // U+00E0 + { 1120, 6, 9, 6, 0, -7 }, // U+00E1 + { 1127, 6, 9, 6, 0, -7 }, // U+00E2 + { 1134, 6, 9, 6, 0, -7 }, // U+00E3 + { 1141, 6, 9, 6, 0, -7 }, // U+00E4 + { 1148, 6, 9, 6, 0, -7 }, // U+00E5 + { 1155, 6, 9, 6, 0, -7 }, // U+00E6 + { 1162, 6, 9, 6, 0, -7 }, // U+00E7 + { 1169, 6, 9, 6, 0, -7 }, // U+00E8 + { 1176, 6, 9, 6, 0, -7 }, // U+00E9 + { 1183, 6, 9, 6, 0, -7 }, // U+00EA + { 1190, 6, 9, 6, 0, -7 }, // U+00EB + { 1197, 6, 9, 6, 0, -7 }, // U+00EC + { 1204, 6, 9, 6, 0, -7 }, // U+00ED + { 1211, 6, 9, 6, 0, -7 }, // U+00EE + { 1218, 6, 9, 6, 0, -7 }, // U+00EF + { 1225, 6, 9, 6, 0, -7 }, // U+00F0 + { 1232, 6, 9, 6, 0, -7 }, // U+00F1 + { 1239, 6, 9, 6, 0, -7 }, // U+00F2 + { 1246, 6, 9, 6, 0, -7 }, // U+00F3 + { 1253, 6, 9, 6, 0, -7 }, // U+00F4 + { 1260, 6, 9, 6, 0, -7 }, // U+00F5 + { 1267, 6, 9, 6, 0, -7 }, // U+00F6 + { 1274, 6, 9, 6, 0, -7 }, // U+00F7 + { 1281, 6, 9, 6, 0, -7 }, // U+00F8 + { 1288, 6, 9, 6, 0, -7 }, // U+00F9 + { 1295, 6, 9, 6, 0, -7 }, // U+00FA + { 1302, 6, 9, 6, 0, -7 }, // U+00FB + { 1309, 6, 9, 6, 0, -7 }, // U+00FC + { 1316, 6, 9, 6, 0, -7 }, // U+00FD + { 1323, 6, 9, 6, 0, -7 }, // U+00FE + { 1330, 6, 9, 6, 0, -7 }, // U+00FF + { 1337, 6, 9, 6, 0, -7 }, // U+0100 + { 1344, 6, 9, 6, 0, -7 }, // U+0101 + { 1351, 6, 9, 6, 0, -7 }, // U+0102 + { 1358, 6, 9, 6, 0, -7 }, // U+0103 + { 1365, 6, 9, 6, 0, -7 }, // U+0104 + { 1372, 6, 9, 6, 0, -7 }, // U+0105 + { 1379, 6, 9, 6, 0, -7 }, // U+0106 + { 1386, 6, 9, 6, 0, -7 }, // U+0107 + { 1393, 6, 9, 6, 0, -7 }, // U+0108 + { 1400, 6, 9, 6, 0, -7 }, // U+0109 + { 1407, 6, 9, 6, 0, -7 }, // U+010A + { 1414, 6, 9, 6, 0, -7 }, // U+010B + { 1421, 6, 9, 6, 0, -7 }, // U+010C + { 1428, 6, 9, 6, 0, -7 }, // U+010D + { 1435, 6, 9, 6, 0, -7 }, // U+010E + { 1442, 6, 9, 6, 0, -7 }, // U+010F + { 1449, 6, 9, 6, 0, -7 }, // U+0110 + { 1456, 6, 9, 6, 0, -7 }, // U+0111 + { 1463, 6, 9, 6, 0, -7 }, // U+0112 + { 1470, 6, 9, 6, 0, -7 }, // U+0113 + { 1477, 6, 9, 6, 0, -7 }, // U+0114 + { 1484, 6, 9, 6, 0, -7 }, // U+0115 + { 1491, 6, 9, 6, 0, -7 }, // U+0116 + { 1498, 6, 9, 6, 0, -7 }, // U+0117 + { 1505, 6, 9, 6, 0, -7 }, // U+0118 + { 1512, 6, 9, 6, 0, -7 }, // U+0119 + { 1519, 6, 9, 6, 0, -7 }, // U+011A + { 1526, 6, 9, 6, 0, -7 }, // U+011B + { 1533, 6, 9, 6, 0, -7 }, // U+011C + { 1540, 6, 9, 6, 0, -7 }, // U+011D + { 1547, 6, 9, 6, 0, -7 }, // U+011E + { 1554, 6, 9, 6, 0, -7 }, // U+011F + { 1561, 6, 9, 6, 0, -7 }, // U+0120 + { 1568, 6, 9, 6, 0, -7 }, // U+0121 + { 1575, 6, 9, 6, 0, -7 }, // U+0122 + { 1582, 6, 9, 6, 0, -7 }, // U+0123 + { 1589, 6, 9, 6, 0, -7 }, // U+0124 + { 1596, 6, 9, 6, 0, -7 }, // U+0125 + { 1603, 6, 9, 6, 0, -7 }, // U+0126 + { 1610, 6, 9, 6, 0, -7 }, // U+0127 + { 1617, 6, 9, 6, 0, -7 }, // U+0128 + { 1624, 6, 9, 6, 0, -7 }, // U+0129 + { 1631, 6, 9, 6, 0, -7 }, // U+012A + { 1638, 6, 9, 6, 0, -7 }, // U+012B + { 1645, 6, 9, 6, 0, -7 }, // U+012C + { 1652, 6, 9, 6, 0, -7 }, // U+012D + { 1659, 6, 9, 6, 0, -7 }, // U+012E + { 1666, 6, 9, 6, 0, -7 }, // U+012F + { 1673, 6, 9, 6, 0, -7 }, // U+0130 + { 1680, 6, 9, 6, 0, -7 }, // U+0131 + { 1687, 6, 9, 6, 0, -7 }, // U+0132 + { 1694, 6, 9, 6, 0, -7 }, // U+0133 + { 1701, 6, 9, 6, 0, -7 }, // U+0134 + { 1708, 6, 9, 6, 0, -7 }, // U+0135 + { 1715, 6, 9, 6, 0, -7 }, // U+0136 + { 1722, 6, 9, 6, 0, -7 }, // U+0137 + { 1729, 6, 9, 6, 0, -7 }, // U+0138 + { 1736, 6, 9, 6, 0, -7 }, // U+0139 + { 1743, 6, 9, 6, 0, -7 }, // U+013A + { 1750, 6, 9, 6, 0, -7 }, // U+013B + { 1757, 6, 9, 6, 0, -7 }, // U+013C + { 1764, 6, 9, 6, 0, -7 }, // U+013D + { 1771, 6, 9, 6, 0, -7 }, // U+013E + { 1778, 6, 9, 6, 0, -7 }, // U+013F + { 1785, 6, 9, 6, 0, -7 }, // U+0140 + { 1792, 6, 9, 6, 0, -7 }, // U+0141 + { 1799, 6, 9, 6, 0, -7 }, // U+0142 + { 1806, 6, 9, 6, 0, -7 }, // U+0143 + { 1813, 6, 9, 6, 0, -7 }, // U+0144 + { 1820, 6, 9, 6, 0, -7 }, // U+0145 + { 1827, 6, 9, 6, 0, -7 }, // U+0146 + { 1834, 6, 9, 6, 0, -7 }, // U+0147 + { 1841, 6, 9, 6, 0, -7 }, // U+0148 + { 1848, 6, 9, 6, 0, -7 }, // U+0149 + { 1855, 6, 9, 6, 0, -7 }, // U+014A + { 1862, 6, 9, 6, 0, -7 }, // U+014B + { 1869, 6, 9, 6, 0, -7 }, // U+014C + { 1876, 6, 9, 6, 0, -7 }, // U+014D + { 1883, 6, 9, 6, 0, -7 }, // U+014E + { 1890, 6, 9, 6, 0, -7 }, // U+014F + { 1897, 6, 9, 6, 0, -7 }, // U+0150 + { 1904, 6, 9, 6, 0, -7 }, // U+0151 + { 1911, 6, 9, 6, 0, -7 }, // U+0152 + { 1918, 6, 9, 6, 0, -7 }, // U+0153 + { 1925, 6, 9, 6, 0, -7 }, // U+0154 + { 1932, 6, 9, 6, 0, -7 }, // U+0155 + { 1939, 6, 9, 6, 0, -7 }, // U+0156 + { 1946, 6, 9, 6, 0, -7 }, // U+0157 + { 1953, 6, 9, 6, 0, -7 }, // U+0158 + { 1960, 6, 9, 6, 0, -7 }, // U+0159 + { 1967, 6, 9, 6, 0, -7 }, // U+015A + { 1974, 6, 9, 6, 0, -7 }, // U+015B + { 1981, 6, 9, 6, 0, -7 }, // U+015C + { 1988, 6, 9, 6, 0, -7 }, // U+015D + { 1995, 6, 9, 6, 0, -7 }, // U+015E + { 2002, 6, 9, 6, 0, -7 }, // U+015F + { 2009, 6, 9, 6, 0, -7 }, // U+0160 + { 2016, 6, 9, 6, 0, -7 }, // U+0161 + { 2023, 6, 9, 6, 0, -7 }, // U+0162 + { 2030, 6, 9, 6, 0, -7 }, // U+0163 + { 2037, 6, 9, 6, 0, -7 }, // U+0164 + { 2044, 6, 9, 6, 0, -7 }, // U+0165 + { 2051, 6, 9, 6, 0, -7 }, // U+0166 + { 2058, 6, 9, 6, 0, -7 }, // U+0167 + { 2065, 6, 9, 6, 0, -7 }, // U+0168 + { 2072, 6, 9, 6, 0, -7 }, // U+0169 + { 2079, 6, 9, 6, 0, -7 }, // U+016A + { 2086, 6, 9, 6, 0, -7 }, // U+016B + { 2093, 6, 9, 6, 0, -7 }, // U+016C + { 2100, 6, 9, 6, 0, -7 }, // U+016D + { 2107, 6, 9, 6, 0, -7 }, // U+016E + { 2114, 6, 9, 6, 0, -7 }, // U+016F + { 2121, 6, 9, 6, 0, -7 }, // U+0170 + { 2128, 6, 9, 6, 0, -7 }, // U+0171 + { 2135, 6, 9, 6, 0, -7 }, // U+0172 + { 2142, 6, 9, 6, 0, -7 }, // U+0173 + { 2149, 6, 9, 6, 0, -7 }, // U+0174 + { 2156, 6, 9, 6, 0, -7 }, // U+0175 + { 2163, 6, 9, 6, 0, -7 }, // U+0176 + { 2170, 6, 9, 6, 0, -7 }, // U+0177 + { 2177, 6, 9, 6, 0, -7 }, // U+0178 + { 2184, 6, 9, 6, 0, -7 }, // U+0179 + { 2191, 6, 9, 6, 0, -7 }, // U+017A + { 2198, 6, 9, 6, 0, -7 }, // U+017B + { 2205, 6, 9, 6, 0, -7 }, // U+017C + { 2212, 6, 9, 6, 0, -7 }, // U+017D + { 2219, 6, 9, 6, 0, -7 }, // U+017E + { 2226, 6, 9, 6, 0, -7 }, // U+017F + { 2233, 0, 0, 6, 0, 0 }, // U+0180 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0181 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0182 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0183 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0184 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0185 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0186 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0187 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0188 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+0189 (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+018A (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+018B (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+018C (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+018D (placeholder) + { 2233, 0, 0, 6, 0, 0 }, // U+018E (placeholder) + { 2233, 6, 9, 6, 0, -7 }, // U+018F + { 2240, 0, 0, 6, 0, 0 }, // U+0190 (placeholder) + { 2240, 0, 0, 6, 0, 0 }, // U+0191 (placeholder) + { 2240, 6, 9, 6, 0, -7 }, // U+0192 + { 2247, 0, 0, 6, 0, 0 }, // U+0193 (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+0194 (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+0195 (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+0196 (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+0197 (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+0198 (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+0199 (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+019A (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+019B (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+019C (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+019D (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+019E (placeholder) + { 2247, 0, 0, 6, 0, 0 }, // U+019F (placeholder) + { 2247, 6, 9, 6, 0, -7 }, // U+01A0 + { 2254, 6, 9, 6, 0, -7 }, // U+01A1 + { 2261, 0, 0, 6, 0, 0 }, // U+01A2 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01A3 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01A4 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01A5 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01A6 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01A7 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01A8 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01A9 (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01AA (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01AB (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01AC (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01AD (placeholder) + { 2261, 0, 0, 6, 0, 0 }, // U+01AE (placeholder) + { 2261, 6, 9, 6, 0, -7 }, // U+01AF + { 2268, 6, 9, 6, 0, -7 }, // U+01B0 + { 2275, 0, 0, 6, 0, 0 }, // U+01B1 (placeholder) + { 2275, 0, 0, 6, 0, 0 }, // U+01B2 (placeholder) + { 2275, 0, 0, 6, 0, 0 }, // U+01B3 (placeholder) + { 2275, 0, 0, 6, 0, 0 }, // U+01B4 (placeholder) + { 2275, 6, 9, 6, 0, -7 }, // U+01B5 + { 2282, 6, 9, 6, 0, -7 }, // U+01B6 + { 2289, 0, 0, 6, 0, 0 }, // U+01B7 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01B8 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01B9 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01BA (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01BB (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01BC (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01BD (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01BE (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01BF (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C0 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C1 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C2 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C3 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C4 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C5 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C6 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C7 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C8 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01C9 (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01CA (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01CB (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01CC (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01CD (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01CE (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01CF (placeholder) + { 2289, 0, 0, 6, 0, 0 }, // U+01D0 (placeholder) + { 2289, 6, 9, 6, 0, -7 }, // U+01D1 + { 2296, 6, 9, 6, 0, -7 }, // U+01D2 + { 2303, 0, 0, 6, 0, 0 }, // U+01D3 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01D4 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01D5 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01D6 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01D7 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01D8 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01D9 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01DA (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01DB (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01DC (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01DD (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01DE (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01DF (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01E0 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01E1 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01E2 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01E3 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01E4 (placeholder) + { 2303, 0, 0, 6, 0, 0 }, // U+01E5 (placeholder) + { 2303, 6, 9, 6, 0, -7 }, // U+01E6 + { 2310, 6, 9, 6, 0, -7 }, // U+01E7 + { 2317, 0, 0, 6, 0, 0 }, // U+01E8 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01E9 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01EA (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01EB (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01EC (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01ED (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01EE (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01EF (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F0 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F1 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F2 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F3 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F4 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F5 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F6 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F7 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F8 (placeholder) + { 2317, 0, 0, 6, 0, 0 }, // U+01F9 (placeholder) + { 2317, 6, 9, 6, 0, -7 }, // U+01FA + { 2324, 6, 9, 6, 0, -7 }, // U+01FB + { 2331, 6, 9, 6, 0, -7 }, // U+01FC + { 2338, 6, 9, 6, 0, -7 }, // U+01FD + { 2345, 6, 9, 6, 0, -7 }, // U+01FE + { 2352, 6, 9, 6, 0, -7 }, // U+01FF + { 2359, 0, 0, 6, 0, 0 }, // U+0200 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0201 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0202 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0203 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0204 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0205 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0206 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0207 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0208 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0209 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+020A (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+020B (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+020C (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+020D (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+020E (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+020F (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0210 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0211 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0212 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0213 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0214 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0215 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0216 (placeholder) + { 2359, 0, 0, 6, 0, 0 }, // U+0217 (placeholder) + { 2359, 6, 9, 6, 0, -7 }, // U+0218 + { 2366, 6, 9, 6, 0, -7 }, // U+0219 + { 2373, 6, 9, 6, 0, -7 }, // U+021A + { 2380, 6, 9, 6, 0, -7 }, // U+021B + { 2387, 0, 0, 6, 0, 0 }, // U+021C (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+021D (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+021E (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+021F (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0220 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0221 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0222 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0223 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0224 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0225 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0226 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0227 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0228 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0229 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+022A (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+022B (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+022C (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+022D (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+022E (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+022F (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0230 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0231 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0232 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0233 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0234 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0235 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0236 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0237 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0238 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0239 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+023A (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+023B (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+023C (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+023D (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+023E (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+023F (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0240 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0241 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0242 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0243 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0244 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0245 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0246 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0247 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0248 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0249 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+024A (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+024B (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+024C (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+024D (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+024E (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+024F (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0250 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0251 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0252 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0253 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0254 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0255 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0256 (placeholder) + { 2387, 0, 0, 6, 0, 0 }, // U+0257 (placeholder) + { 2387, 6, 9, 6, 0, -7 }, // U+0258 + { 2394, 6, 9, 6, 0, -7 }, // U+0259 + { 2401, 0, 0, 6, 0, 0 }, // U+025A (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+025B (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+025C (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+025D (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+025E (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+025F (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0260 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0261 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0262 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0263 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0264 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0265 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0266 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0267 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0268 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0269 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+026A (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+026B (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+026C (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+026D (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+026E (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+026F (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0270 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0271 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0272 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0273 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0274 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0275 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0276 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0277 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0278 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0279 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+027A (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+027B (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+027C (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+027D (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+027E (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+027F (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0280 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0281 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0282 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0283 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0284 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0285 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0286 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0287 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0288 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0289 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+028A (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+028B (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+028C (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+028D (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+028E (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+028F (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0290 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0291 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0292 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0293 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0294 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0295 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0296 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0297 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0298 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+0299 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+029A (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+029B (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+029C (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+029D (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+029E (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+029F (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A0 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A1 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A2 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A3 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A4 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A5 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A6 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A7 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A8 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02A9 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02AA (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02AB (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02AC (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02AD (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02AE (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02AF (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B0 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B1 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B2 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B3 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B4 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B5 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B6 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B7 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B8 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02B9 (placeholder) + { 2401, 0, 0, 6, 0, 0 }, // U+02BA (placeholder) + { 2401, 6, 9, 6, 0, -7 }, // U+02BB + { 2408, 6, 9, 6, 0, -7 }, // U+02BC + { 2415, 6, 9, 6, 0, -7 }, // U+02BD + { 2422, 0, 0, 6, 0, 0 }, // U+02BE (placeholder) + { 2422, 0, 0, 6, 0, 0 }, // U+02BF (placeholder) + { 2422, 0, 0, 6, 0, 0 }, // U+02C0 (placeholder) + { 2422, 0, 0, 6, 0, 0 }, // U+02C1 (placeholder) + { 2422, 0, 0, 6, 0, 0 }, // U+02C2 (placeholder) + { 2422, 0, 0, 6, 0, 0 }, // U+02C3 (placeholder) + { 2422, 0, 0, 6, 0, 0 }, // U+02C4 (placeholder) + { 2422, 0, 0, 6, 0, 0 }, // U+02C5 (placeholder) + { 2422, 6, 9, 6, 0, -7 }, // U+02C6 + { 2429, 6, 9, 6, 0, -7 }, // U+02C7 + { 2436, 0, 0, 6, 0, 0 }, // U+02C8 (placeholder) + { 2436, 6, 9, 6, 0, -7 }, // U+02C9 + { 2443, 0, 0, 6, 0, 0 }, // U+02CA (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02CB (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02CC (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02CD (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02CE (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02CF (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D0 (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D1 (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D2 (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D3 (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D4 (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D5 (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D6 (placeholder) + { 2443, 0, 0, 6, 0, 0 }, // U+02D7 (placeholder) + { 2443, 6, 9, 6, 0, -7 }, // U+02D8 + { 2450, 6, 9, 6, 0, -7 }, // U+02D9 + { 2457, 6, 9, 6, 0, -7 }, // U+02DA + { 2464, 6, 9, 6, 0, -7 }, // U+02DB + { 2471, 6, 9, 6, 0, -7 }, // U+02DC + { 2478, 6, 9, 6, 0, -7 }, // U+02DD + { 2485, 0, 0, 6, 0, 0 }, // U+02DE (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02DF (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E0 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E1 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E2 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E3 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E4 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E5 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E6 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E7 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E8 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02E9 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02EA (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02EB (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02EC (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02ED (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02EE (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02EF (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F0 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F1 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F2 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F3 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F4 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F5 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F6 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F7 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F8 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02F9 (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02FA (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02FB (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02FC (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02FD (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02FE (placeholder) + { 2485, 0, 0, 6, 0, 0 }, // U+02FF (placeholder) + { 2485, 6, 9, 6, 0, -7 }, // U+0300 + { 2492, 6, 9, 6, 0, -7 }, // U+0301 + { 2499, 6, 9, 6, 0, -7 }, // U+0302 + { 2506, 6, 9, 6, 0, -7 }, // U+0303 + { 2513, 6, 9, 6, 0, -7 }, // U+0304 + { 2520, 6, 9, 6, 0, -7 }, // U+0305 + { 2527, 6, 9, 6, 0, -7 }, // U+0306 + { 2534, 6, 9, 6, 0, -7 }, // U+0307 + { 2541, 6, 9, 6, 0, -7 }, // U+0308 + { 2548, 6, 9, 6, 0, -7 }, // U+0309 + { 2555, 6, 9, 6, 0, -7 }, // U+030A + { 2562, 6, 9, 6, 0, -7 }, // U+030B + { 2569, 6, 9, 6, 0, -7 }, // U+030C + { 2576, 6, 9, 6, 0, -7 }, // U+030D + { 2583, 6, 9, 6, 0, -7 }, // U+030E + { 2590, 6, 9, 6, 0, -7 }, // U+030F + { 2597, 6, 9, 6, 0, -7 }, // U+0310 + { 2604, 6, 9, 6, 0, -7 }, // U+0311 + { 2611, 6, 9, 6, 0, -7 }, // U+0312 + { 2618, 6, 9, 6, 0, -7 }, // U+0313 + { 2625, 6, 9, 6, 0, -7 }, // U+0314 + { 2632, 0, 0, 6, 0, 0 }, // U+0315 (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+0316 (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+0317 (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+0318 (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+0319 (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+031A (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+031B (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+031C (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+031D (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+031E (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+031F (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+0320 (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+0321 (placeholder) + { 2632, 0, 0, 6, 0, 0 }, // U+0322 (placeholder) + { 2632, 6, 9, 6, 0, -7 }, // U+0323 + { 2639, 6, 9, 6, 0, -7 }, // U+0324 + { 2646, 0, 0, 6, 0, 0 }, // U+0325 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0326 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0327 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0328 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0329 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+032A (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+032B (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+032C (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+032D (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+032E (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+032F (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0330 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0331 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0332 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0333 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0334 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0335 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0336 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0337 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0338 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0339 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+033A (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+033B (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+033C (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+033D (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+033E (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+033F (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0340 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0341 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0342 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0343 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0344 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0345 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0346 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0347 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0348 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0349 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+034A (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+034B (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+034C (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+034D (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+034E (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+034F (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0350 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0351 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0352 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0353 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0354 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0355 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0356 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0357 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0358 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0359 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+035A (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+035B (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+035C (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+035D (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+035E (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+035F (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0360 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0361 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0362 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0363 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0364 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0365 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0366 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0367 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0368 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0369 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+036A (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+036B (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+036C (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+036D (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+036E (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+036F (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0370 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0371 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0372 (placeholder) + { 2646, 0, 0, 6, 0, 0 }, // U+0373 (placeholder) + { 2646, 6, 9, 6, 0, -7 }, // U+0374 + { 2653, 6, 9, 6, 0, -7 }, // U+0375 + { 2660, 0, 0, 6, 0, 0 }, // U+0376 (placeholder) + { 2660, 0, 0, 6, 0, 0 }, // U+0377 (placeholder) + { 2660, 0, 0, 6, 0, 0 }, // U+0378 (placeholder) + { 2660, 0, 0, 6, 0, 0 }, // U+0379 (placeholder) + { 2660, 6, 9, 6, 0, -7 }, // U+037A + { 2667, 0, 0, 6, 0, 0 }, // U+037B (placeholder) + { 2667, 0, 0, 6, 0, 0 }, // U+037C (placeholder) + { 2667, 0, 0, 6, 0, 0 }, // U+037D (placeholder) + { 2667, 6, 9, 6, 0, -7 }, // U+037E + { 2674, 0, 0, 6, 0, 0 }, // U+037F (placeholder) + { 2674, 0, 0, 6, 0, 0 }, // U+0380 (placeholder) + { 2674, 0, 0, 6, 0, 0 }, // U+0381 (placeholder) + { 2674, 0, 0, 6, 0, 0 }, // U+0382 (placeholder) + { 2674, 0, 0, 6, 0, 0 }, // U+0383 (placeholder) + { 2674, 6, 9, 6, 0, -7 }, // U+0384 + { 2681, 6, 9, 6, 0, -7 }, // U+0385 + { 2688, 6, 9, 6, 0, -7 }, // U+0386 + { 2695, 6, 9, 6, 0, -7 }, // U+0387 + { 2702, 6, 9, 6, 0, -7 }, // U+0388 + { 2709, 6, 9, 6, 0, -7 }, // U+0389 + { 2716, 6, 9, 6, 0, -7 }, // U+038A + { 2723, 0, 0, 6, 0, 0 }, // U+038B (placeholder) + { 2723, 6, 9, 6, 0, -7 }, // U+038C + { 2730, 0, 0, 6, 0, 0 }, // U+038D (placeholder) + { 2730, 6, 9, 6, 0, -7 }, // U+038E + { 2737, 6, 9, 6, 0, -7 }, // U+038F + { 2744, 6, 9, 6, 0, -7 }, // U+0390 + { 2751, 6, 9, 6, 0, -7 }, // U+0391 + { 2758, 6, 9, 6, 0, -7 }, // U+0392 + { 2765, 6, 9, 6, 0, -7 }, // U+0393 + { 2772, 6, 9, 6, 0, -7 }, // U+0394 + { 2779, 6, 9, 6, 0, -7 }, // U+0395 + { 2786, 6, 9, 6, 0, -7 }, // U+0396 + { 2793, 6, 9, 6, 0, -7 }, // U+0397 + { 2800, 6, 9, 6, 0, -7 }, // U+0398 + { 2807, 6, 9, 6, 0, -7 }, // U+0399 + { 2814, 6, 9, 6, 0, -7 }, // U+039A + { 2821, 6, 9, 6, 0, -7 }, // U+039B + { 2828, 6, 9, 6, 0, -7 }, // U+039C + { 2835, 6, 9, 6, 0, -7 }, // U+039D + { 2842, 6, 9, 6, 0, -7 }, // U+039E + { 2849, 6, 9, 6, 0, -7 }, // U+039F + { 2856, 6, 9, 6, 0, -7 }, // U+03A0 + { 2863, 6, 9, 6, 0, -7 }, // U+03A1 + { 2870, 0, 0, 6, 0, 0 }, // U+03A2 (placeholder) + { 2870, 6, 9, 6, 0, -7 }, // U+03A3 + { 2877, 6, 9, 6, 0, -7 }, // U+03A4 + { 2884, 6, 9, 6, 0, -7 }, // U+03A5 + { 2891, 6, 9, 6, 0, -7 }, // U+03A6 + { 2898, 6, 9, 6, 0, -7 }, // U+03A7 + { 2905, 6, 9, 6, 0, -7 }, // U+03A8 + { 2912, 6, 9, 6, 0, -7 }, // U+03A9 + { 2919, 6, 9, 6, 0, -7 }, // U+03AA + { 2926, 6, 9, 6, 0, -7 }, // U+03AB + { 2933, 6, 9, 6, 0, -7 }, // U+03AC + { 2940, 6, 9, 6, 0, -7 }, // U+03AD + { 2947, 6, 9, 6, 0, -7 }, // U+03AE + { 2954, 6, 9, 6, 0, -7 }, // U+03AF + { 2961, 6, 9, 6, 0, -7 }, // U+03B0 + { 2968, 6, 9, 6, 0, -7 }, // U+03B1 + { 2975, 6, 9, 6, 0, -7 }, // U+03B2 + { 2982, 6, 9, 6, 0, -7 }, // U+03B3 + { 2989, 6, 9, 6, 0, -7 }, // U+03B4 + { 2996, 6, 9, 6, 0, -7 }, // U+03B5 + { 3003, 6, 9, 6, 0, -7 }, // U+03B6 + { 3010, 6, 9, 6, 0, -7 }, // U+03B7 + { 3017, 6, 9, 6, 0, -7 }, // U+03B8 + { 3024, 6, 9, 6, 0, -7 }, // U+03B9 + { 3031, 6, 9, 6, 0, -7 }, // U+03BA + { 3038, 6, 9, 6, 0, -7 }, // U+03BB + { 3045, 6, 9, 6, 0, -7 }, // U+03BC + { 3052, 6, 9, 6, 0, -7 }, // U+03BD + { 3059, 6, 9, 6, 0, -7 }, // U+03BE + { 3066, 6, 9, 6, 0, -7 }, // U+03BF + { 3073, 6, 9, 6, 0, -7 }, // U+03C0 + { 3080, 6, 9, 6, 0, -7 }, // U+03C1 + { 3087, 6, 9, 6, 0, -7 }, // U+03C2 + { 3094, 6, 9, 6, 0, -7 }, // U+03C3 + { 3101, 6, 9, 6, 0, -7 }, // U+03C4 + { 3108, 6, 9, 6, 0, -7 }, // U+03C5 + { 3115, 6, 9, 6, 0, -7 }, // U+03C6 + { 3122, 6, 9, 6, 0, -7 }, // U+03C7 + { 3129, 6, 9, 6, 0, -7 }, // U+03C8 + { 3136, 6, 9, 6, 0, -7 }, // U+03C9 + { 3143, 6, 9, 6, 0, -7 }, // U+03CA + { 3150, 6, 9, 6, 0, -7 }, // U+03CB + { 3157, 6, 9, 6, 0, -7 }, // U+03CC + { 3164, 6, 9, 6, 0, -7 }, // U+03CD + { 3171, 6, 9, 6, 0, -7 }, // U+03CE + { 3178, 0, 0, 6, 0, 0 }, // U+03CF (placeholder) + { 3178, 6, 9, 6, 0, -7 }, // U+03D0 + { 3185, 6, 9, 6, 0, -7 }, // U+03D1 + { 3192, 6, 9, 6, 0, -7 }, // U+03D2 + { 3199, 6, 9, 6, 0, -7 }, // U+03D3 + { 3206, 6, 9, 6, 0, -7 }, // U+03D4 + { 3213, 6, 9, 6, 0, -7 }, // U+03D5 + { 3220, 6, 9, 6, 0, -7 }, // U+03D6 + { 3227, 6, 9, 6, 0, -7 }, // U+03D7 + { 3234, 0, 0, 6, 0, 0 }, // U+03D8 (placeholder) + { 3234, 0, 0, 6, 0, 0 }, // U+03D9 (placeholder) + { 3234, 6, 9, 6, 0, -7 }, // U+03DA + { 3241, 6, 9, 6, 0, -7 }, // U+03DB + { 3248, 6, 9, 6, 0, -7 }, // U+03DC + { 3255, 6, 9, 6, 0, -7 }, // U+03DD + { 3262, 6, 9, 6, 0, -7 }, // U+03DE + { 3269, 6, 9, 6, 0, -7 }, // U+03DF + { 3276, 6, 9, 6, 0, -7 }, // U+03E0 + { 3283, 6, 9, 6, 0, -7 }, // U+03E1 + { 3290, 6, 9, 6, 0, -7 }, // U+03E2 + { 3297, 6, 9, 6, 0, -7 }, // U+03E3 + { 3304, 6, 9, 6, 0, -7 }, // U+03E4 + { 3311, 6, 9, 6, 0, -7 }, // U+03E5 + { 3318, 6, 9, 6, 0, -7 }, // U+03E6 + { 3325, 6, 9, 6, 0, -7 }, // U+03E7 + { 3332, 6, 9, 6, 0, -7 }, // U+03E8 + { 3339, 6, 9, 6, 0, -7 }, // U+03E9 + { 3346, 6, 9, 6, 0, -7 }, // U+03EA + { 3353, 6, 9, 6, 0, -7 }, // U+03EB + { 3360, 6, 9, 6, 0, -7 }, // U+03EC + { 3367, 6, 9, 6, 0, -7 }, // U+03ED + { 3374, 6, 9, 6, 0, -7 }, // U+03EE + { 3381, 6, 9, 6, 0, -7 }, // U+03EF + { 3388, 6, 9, 6, 0, -7 }, // U+03F0 + { 3395, 6, 9, 6, 0, -7 }, // U+03F1 + { 3402, 6, 9, 6, 0, -7 }, // U+03F2 + { 3409, 6, 9, 6, 0, -7 }, // U+03F3 + { 3416, 6, 9, 6, 0, -7 }, // U+03F4 + { 3423, 6, 9, 6, 0, -7 }, // U+03F5 + { 3430, 0, 0, 6, 0, 0 }, // U+03F6 (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03F7 (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03F8 (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03F9 (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03FA (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03FB (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03FC (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03FD (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03FE (placeholder) + { 3430, 0, 0, 6, 0, 0 }, // U+03FF (placeholder) + { 3430, 6, 9, 6, 0, -7 }, // U+0400 + { 3437, 6, 9, 6, 0, -7 }, // U+0401 + { 3444, 6, 9, 6, 0, -7 }, // U+0402 + { 3451, 6, 9, 6, 0, -7 }, // U+0403 + { 3458, 6, 9, 6, 0, -7 }, // U+0404 + { 3465, 6, 9, 6, 0, -7 }, // U+0405 + { 3472, 6, 9, 6, 0, -7 }, // U+0406 + { 3479, 6, 9, 6, 0, -7 }, // U+0407 + { 3486, 6, 9, 6, 0, -7 }, // U+0408 + { 3493, 6, 9, 6, 0, -7 }, // U+0409 + { 3500, 6, 9, 6, 0, -7 }, // U+040A + { 3507, 6, 9, 6, 0, -7 }, // U+040B + { 3514, 6, 9, 6, 0, -7 }, // U+040C + { 3521, 6, 9, 6, 0, -7 }, // U+040D + { 3528, 6, 9, 6, 0, -7 }, // U+040E + { 3535, 6, 9, 6, 0, -7 }, // U+040F + { 3542, 6, 9, 6, 0, -7 }, // U+0410 + { 3549, 6, 9, 6, 0, -7 }, // U+0411 + { 3556, 6, 9, 6, 0, -7 }, // U+0412 + { 3563, 6, 9, 6, 0, -7 }, // U+0413 + { 3570, 6, 9, 6, 0, -7 }, // U+0414 + { 3577, 6, 9, 6, 0, -7 }, // U+0415 + { 3584, 6, 9, 6, 0, -7 }, // U+0416 + { 3591, 6, 9, 6, 0, -7 }, // U+0417 + { 3598, 6, 9, 6, 0, -7 }, // U+0418 + { 3605, 6, 9, 6, 0, -7 }, // U+0419 + { 3612, 6, 9, 6, 0, -7 }, // U+041A + { 3619, 6, 9, 6, 0, -7 }, // U+041B + { 3626, 6, 9, 6, 0, -7 }, // U+041C + { 3633, 6, 9, 6, 0, -7 }, // U+041D + { 3640, 6, 9, 6, 0, -7 }, // U+041E + { 3647, 6, 9, 6, 0, -7 }, // U+041F + { 3654, 6, 9, 6, 0, -7 }, // U+0420 + { 3661, 6, 9, 6, 0, -7 }, // U+0421 + { 3668, 6, 9, 6, 0, -7 }, // U+0422 + { 3675, 6, 9, 6, 0, -7 }, // U+0423 + { 3682, 6, 9, 6, 0, -7 }, // U+0424 + { 3689, 6, 9, 6, 0, -7 }, // U+0425 + { 3696, 6, 9, 6, 0, -7 }, // U+0426 + { 3703, 6, 9, 6, 0, -7 }, // U+0427 + { 3710, 6, 9, 6, 0, -7 }, // U+0428 + { 3717, 6, 9, 6, 0, -7 }, // U+0429 + { 3724, 6, 9, 6, 0, -7 }, // U+042A + { 3731, 6, 9, 6, 0, -7 }, // U+042B + { 3738, 6, 9, 6, 0, -7 }, // U+042C + { 3745, 6, 9, 6, 0, -7 }, // U+042D + { 3752, 6, 9, 6, 0, -7 }, // U+042E + { 3759, 6, 9, 6, 0, -7 }, // U+042F + { 3766, 6, 9, 6, 0, -7 }, // U+0430 + { 3773, 6, 9, 6, 0, -7 }, // U+0431 + { 3780, 6, 9, 6, 0, -7 }, // U+0432 + { 3787, 6, 9, 6, 0, -7 }, // U+0433 + { 3794, 6, 9, 6, 0, -7 }, // U+0434 + { 3801, 6, 9, 6, 0, -7 }, // U+0435 + { 3808, 6, 9, 6, 0, -7 }, // U+0436 + { 3815, 6, 9, 6, 0, -7 }, // U+0437 + { 3822, 6, 9, 6, 0, -7 }, // U+0438 + { 3829, 6, 9, 6, 0, -7 }, // U+0439 + { 3836, 6, 9, 6, 0, -7 }, // U+043A + { 3843, 6, 9, 6, 0, -7 }, // U+043B + { 3850, 6, 9, 6, 0, -7 }, // U+043C + { 3857, 6, 9, 6, 0, -7 }, // U+043D + { 3864, 6, 9, 6, 0, -7 }, // U+043E + { 3871, 6, 9, 6, 0, -7 }, // U+043F + { 3878, 6, 9, 6, 0, -7 }, // U+0440 + { 3885, 6, 9, 6, 0, -7 }, // U+0441 + { 3892, 6, 9, 6, 0, -7 }, // U+0442 + { 3899, 6, 9, 6, 0, -7 }, // U+0443 + { 3906, 6, 9, 6, 0, -7 }, // U+0444 + { 3913, 6, 9, 6, 0, -7 }, // U+0445 + { 3920, 6, 9, 6, 0, -7 }, // U+0446 + { 3927, 6, 9, 6, 0, -7 }, // U+0447 + { 3934, 6, 9, 6, 0, -7 }, // U+0448 + { 3941, 6, 9, 6, 0, -7 }, // U+0449 + { 3948, 6, 9, 6, 0, -7 }, // U+044A + { 3955, 6, 9, 6, 0, -7 }, // U+044B + { 3962, 6, 9, 6, 0, -7 }, // U+044C + { 3969, 6, 9, 6, 0, -7 }, // U+044D + { 3976, 6, 9, 6, 0, -7 }, // U+044E + { 3983, 6, 9, 6, 0, -7 }, // U+044F + { 3990, 6, 9, 6, 0, -7 }, // U+0450 + { 3997, 6, 9, 6, 0, -7 }, // U+0451 + { 4004, 6, 9, 6, 0, -7 }, // U+0452 + { 4011, 6, 9, 6, 0, -7 }, // U+0453 + { 4018, 6, 9, 6, 0, -7 }, // U+0454 + { 4025, 6, 9, 6, 0, -7 }, // U+0455 + { 4032, 6, 9, 6, 0, -7 }, // U+0456 + { 4039, 6, 9, 6, 0, -7 }, // U+0457 + { 4046, 6, 9, 6, 0, -7 }, // U+0458 + { 4053, 6, 9, 6, 0, -7 }, // U+0459 + { 4060, 6, 9, 6, 0, -7 }, // U+045A + { 4067, 6, 9, 6, 0, -7 }, // U+045B + { 4074, 6, 9, 6, 0, -7 }, // U+045C + { 4081, 6, 9, 6, 0, -7 }, // U+045D + { 4088, 6, 9, 6, 0, -7 }, // U+045E + { 4095, 6, 9, 6, 0, -7 }, // U+045F + { 4102, 0, 0, 6, 0, 0 }, // U+0460 (placeholder) + { 4102, 0, 0, 6, 0, 0 }, // U+0461 (placeholder) + { 4102, 6, 9, 6, 0, -7 }, // U+0462 + { 4109, 6, 9, 6, 0, -7 }, // U+0463 + { 4116, 0, 0, 6, 0, 0 }, // U+0464 (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+0465 (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+0466 (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+0467 (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+0468 (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+0469 (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+046A (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+046B (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+046C (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+046D (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+046E (placeholder) + { 4116, 0, 0, 6, 0, 0 }, // U+046F (placeholder) + { 4116, 6, 9, 6, 0, -7 }, // U+0470 + { 4123, 6, 9, 6, 0, -7 }, // U+0471 + { 4130, 6, 9, 6, 0, -7 }, // U+0472 + { 4137, 6, 9, 6, 0, -7 }, // U+0473 + { 4144, 6, 9, 6, 0, -7 }, // U+0474 + { 4151, 6, 9, 6, 0, -7 }, // U+0475 + { 4158, 0, 0, 6, 0, 0 }, // U+0476 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0477 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0478 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0479 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+047A (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+047B (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+047C (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+047D (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+047E (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+047F (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0480 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0481 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0482 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0483 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0484 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0485 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0486 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0487 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0488 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+0489 (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+048A (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+048B (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+048C (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+048D (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+048E (placeholder) + { 4158, 0, 0, 6, 0, 0 }, // U+048F (placeholder) + { 4158, 6, 9, 6, 0, -7 }, // U+0490 + { 4165, 6, 9, 6, 0, -7 }, // U+0491 + { 4172, 6, 9, 6, 0, -7 }, // U+0492 + { 4179, 6, 9, 6, 0, -7 }, // U+0493 + { 4186, 0, 0, 6, 0, 0 }, // U+0494 (placeholder) + { 4186, 0, 0, 6, 0, 0 }, // U+0495 (placeholder) + { 4186, 6, 9, 6, 0, -7 }, // U+0496 + { 4193, 6, 9, 6, 0, -7 }, // U+0497 + { 4200, 0, 0, 6, 0, 0 }, // U+0498 (placeholder) + { 4200, 0, 0, 6, 0, 0 }, // U+0499 (placeholder) + { 4200, 6, 9, 6, 0, -7 }, // U+049A + { 4207, 6, 9, 6, 0, -7 }, // U+049B + { 4214, 0, 0, 6, 0, 0 }, // U+049C (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+049D (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+049E (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+049F (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A0 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A1 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A2 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A3 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A4 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A5 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A6 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A7 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A8 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04A9 (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04AA (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04AB (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04AC (placeholder) + { 4214, 0, 0, 6, 0, 0 }, // U+04AD (placeholder) + { 4214, 6, 9, 6, 0, -7 }, // U+04AE + { 4221, 6, 9, 6, 0, -7 }, // U+04AF + { 4228, 6, 9, 6, 0, -7 }, // U+04B0 + { 4235, 6, 9, 6, 0, -7 }, // U+04B1 + { 4242, 6, 9, 6, 0, -7 }, // U+04B2 + { 4249, 6, 9, 6, 0, -7 }, // U+04B3 + { 4256, 0, 0, 6, 0, 0 }, // U+04B4 (placeholder) + { 4256, 0, 0, 6, 0, 0 }, // U+04B5 (placeholder) + { 4256, 0, 0, 6, 0, 0 }, // U+04B6 (placeholder) + { 4256, 0, 0, 6, 0, 0 }, // U+04B7 (placeholder) + { 4256, 0, 0, 6, 0, 0 }, // U+04B8 (placeholder) + { 4256, 0, 0, 6, 0, 0 }, // U+04B9 (placeholder) + { 4256, 6, 9, 6, 0, -7 }, // U+04BA + { 4263, 6, 9, 6, 0, -7 }, // U+04BB + { 4270, 0, 0, 6, 0, 0 }, // U+04BC (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04BD (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04BE (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04BF (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C0 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C1 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C2 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C3 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C4 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C5 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C6 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C7 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C8 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04C9 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04CA (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04CB (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04CC (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04CD (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04CE (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04CF (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D0 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D1 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D2 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D3 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D4 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D5 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D6 (placeholder) + { 4270, 0, 0, 6, 0, 0 }, // U+04D7 (placeholder) + { 4270, 6, 9, 6, 0, -7 }, // U+04D8 + { 4277, 6, 9, 6, 0, -7 }, // U+04D9 + { 4284, 0, 0, 6, 0, 0 }, // U+04DA (placeholder) + { 4284, 0, 0, 6, 0, 0 }, // U+04DB (placeholder) + { 4284, 0, 0, 6, 0, 0 }, // U+04DC (placeholder) + { 4284, 0, 0, 6, 0, 0 }, // U+04DD (placeholder) + { 4284, 0, 0, 6, 0, 0 }, // U+04DE (placeholder) + { 4284, 0, 0, 6, 0, 0 }, // U+04DF (placeholder) + { 4284, 0, 0, 6, 0, 0 }, // U+04E0 (placeholder) + { 4284, 0, 0, 6, 0, 0 }, // U+04E1 (placeholder) + { 4284, 6, 9, 6, 0, -7 }, // U+04E2 + { 4291, 6, 9, 6, 0, -7 }, // U+04E3 + { 4298, 0, 0, 6, 0, 0 }, // U+04E4 (placeholder) + { 4298, 0, 0, 6, 0, 0 }, // U+04E5 (placeholder) + { 4298, 0, 0, 6, 0, 0 }, // U+04E6 (placeholder) + { 4298, 0, 0, 6, 0, 0 }, // U+04E7 (placeholder) + { 4298, 6, 9, 6, 0, -7 }, // U+04E8 + { 4305, 6, 9, 6, 0, -7 }, // U+04E9 + { 4312, 0, 0, 6, 0, 0 }, // U+04EA (placeholder) + { 4312, 0, 0, 6, 0, 0 }, // U+04EB (placeholder) + { 4312, 0, 0, 6, 0, 0 }, // U+04EC (placeholder) + { 4312, 0, 0, 6, 0, 0 }, // U+04ED (placeholder) + { 4312, 6, 9, 6, 0, -7 }, // U+04EE + { 4319, 6, 9, 6, 0, -7 }, // U+04EF + { 4326, 0, 0, 6, 0, 0 }, // U+04F0 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F1 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F2 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F3 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F4 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F5 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F6 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F7 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F8 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04F9 (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04FA (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04FB (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04FC (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04FD (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04FE (placeholder) + { 4326, 0, 0, 6, 0, 0 }, // U+04FF (placeholder) +}; + +static const GFXfont MiscFixed PROGMEM = { + (uint8_t*)MiscFixedBitmaps, + (GFXglyph*)MiscFixedGlyphs, + 0x0020, 0x04FF, + 9 // yAdvance +}; diff --git a/src/helpers/ui/SH1106Display.cpp b/src/helpers/ui/SH1106Display.cpp index 60f6b9e9..f8afb372 100644 --- a/src/helpers/ui/SH1106Display.cpp +++ b/src/helpers/ui/SH1106Display.cpp @@ -1,7 +1,7 @@ #include "SH1106Display.h" #include #include "Adafruit_SH110X.h" -#include "LemonFont.h" +#include "MiscFixedFont.h" #include "LemonIcons.h" bool SH1106Display::i2c_probe(TwoWire &wire, uint8_t addr) @@ -90,11 +90,13 @@ int16_t SH1106Display::drawLemonChar(int16_t x, int16_t y, uint32_t cp) { } } - if (cp < Lemon.first || cp > Lemon.last) { + // Font glyphs come from misc-fixed 6x9 (full Latin/Greek/Cyrillic, ascent 7) — + // baseline +7. The custom UI icons above keep +6, so they sit 1px higher. + if (cp < MiscFixed.first || cp > MiscFixed.last) { if (cp >= 0x20) display.fillRect(x + sz, y - sz, 4*sz, 6*sz, _color); return x + 6 * sz; } - const GFXglyph* g = &lemonGlyphs[cp - Lemon.first]; + const GFXglyph* g = &MiscFixedGlyphs[cp - MiscFixed.first]; uint8_t w = pgm_read_byte(&g->width), h = pgm_read_byte(&g->height); int8_t xo = (int8_t)pgm_read_byte(&g->xOffset), yo = (int8_t)pgm_read_byte(&g->yOffset); uint8_t xa = pgm_read_byte(&g->xAdvance); @@ -102,10 +104,10 @@ int16_t SH1106Display::drawLemonChar(int16_t x, int16_t y, uint32_t cp) { uint8_t bits = 0, bit = 0; for (uint8_t row = 0; row < h; row++) for (uint8_t col = 0; col < w; col++) { - if (!bit) { bits = pgm_read_byte(&lemonBitmaps[bo++]); bit = 0x80; } + if (!bit) { bits = pgm_read_byte(&MiscFixedBitmaps[bo++]); bit = 0x80; } if (bits & bit) { - if (sz == 1) display.drawPixel(x + xo + col, y + 6 + yo + row, _color); - else display.fillRect(x + xo*sz + col*sz, y + 6*sz + yo*sz + row*sz, sz, sz, _color); + if (sz == 1) display.drawPixel(x + xo + col, y + 7 + yo + row, _color); + else display.fillRect(x + xo*sz + col*sz, y + 7*sz + yo*sz + row*sz, sz, sz, _color); } bit >>= 1; } @@ -114,8 +116,8 @@ int16_t SH1106Display::drawLemonChar(int16_t x, int16_t y, uint32_t cp) { uint8_t SH1106Display::lemonXAdvance(uint32_t cp) { uint8_t xa; - if (cp < Lemon.first || cp > Lemon.last) xa = 6; - else xa = pgm_read_byte(&lemonGlyphs[cp - Lemon.first].xAdvance); + if (cp < MiscFixed.first || cp > MiscFixed.last) xa = 6; + else xa = pgm_read_byte(&MiscFixedGlyphs[cp - MiscFixed.first].xAdvance); return xa * _text_sz; } @@ -139,7 +141,7 @@ void SH1106Display::print(const char *str) const uint8_t* p = (const uint8_t*)str; while (*p) { uint32_t cp = decodeCodepoint(p); - if (cp == '\n') { cy += Lemon.yAdvance; cx = 0; } + if (cp == '\n') { cy += MiscFixed.yAdvance; cx = 0; } else { cx = drawLemonChar(cx, cy, cp); } } display.setCursor(cx, cy); diff --git a/src/helpers/ui/SH1106Display.h b/src/helpers/ui/SH1106Display.h index d444370a..9d6eb102 100644 --- a/src/helpers/ui/SH1106Display.h +++ b/src/helpers/ui/SH1106Display.h @@ -21,7 +21,7 @@ class SH1106Display : public DisplayDriver uint8_t _color; uint8_t _contrast; uint8_t _precharge; - bool _use_lemon = false; + bool _use_lemon = true; // OLED is single-font (misc-fixed 5x7); the Lemon/default switch is retired here int _text_sz; // Frame-skip: endFrame() hashes the GFX buffer (FNV-1a, no external dep — the // CRC32 lib is only wired into e-ink builds) and skips the I²C flush when it's @@ -57,13 +57,13 @@ public: if (_use_lemon) return lemonXAdvance(cp); return 6 * _text_sz; // built-in 5x7 font: 6 px advance per glyph } - int getCharWidth() const override { return (_use_lemon ? 5 : 6) * _text_sz; } - int getLineHeight() const override { return (_use_lemon ? 9 : 8) * _text_sz; } + int getCharWidth() const override { return (_use_lemon ? 6 : 6) * _text_sz; } // misc-fixed 6x9 is 6px wide + int getLineHeight() const override { return (_use_lemon ? 9 : 8) * _text_sz; } // misc-fixed 6x9 box height // Only the built-in classic font pads every measured string by one trailing // advance column (see DisplayDriver::textWidthTrailingGap()); the lemon // font's width comes from its own glyph table (ink-tight, no padding). int textWidthTrailingGap() const override { return _use_lemon ? 0 : 1; } - void setLemonFont(bool enabled) override { _use_lemon = enabled; _vw_dirty = true; } + void setLemonFont(bool) override { } // single-font: ignore toggles, stay misc-fixed 5x7 bool isLemonFont() const override { return _use_lemon; } void translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) override; void setBrightness(uint8_t level) override; diff --git a/tools/bdf2gfx.py b/tools/bdf2gfx.py new file mode 100644 index 00000000..76339a47 --- /dev/null +++ b/tools/bdf2gfx.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +"""bdf2gfx.py — convert a BDF bitmap font to an Adafruit-GFX header in the +LemonFont.h layout: a *contiguous* glyph table over [FIRST, LAST], with empty +placeholder glyphs for codepoints the BDF doesn't define, so the renderer can +index by `cp - first`. Recreates the lost bdf2lemon.py. + +Usage: bdf2gfx.py > out.h +""" +import sys + +def parse_bdf(path): + glyphs = {} # codepoint -> dict(bbx=(w,h,xo,yo), dwidth=int, bitmap=[int rows]) + asc = desc = None + with open(path, 'r', errors='replace') as f: + cur = None + reading_bits = False + for line in f: + p = line.split() + if not p: + continue + k = p[0] + if k == 'FONT_ASCENT': asc = int(p[1]) + elif k == 'FONT_DESCENT': desc = int(p[1]) + elif k == 'STARTCHAR': + cur = {'cp': None, 'bbx': None, 'dwidth': None, 'bitmap': []} + elif k == 'ENCODING': + cur['cp'] = int(p[1]) + elif k == 'DWIDTH': + cur['dwidth'] = int(p[1]) + elif k == 'BBX': + cur['bbx'] = (int(p[1]), int(p[2]), int(p[3]), int(p[4])) + elif k == 'BITMAP': + reading_bits = True + elif k == 'ENDCHAR': + reading_bits = False + if cur['cp'] is not None and cur['cp'] >= 0: + glyphs[cur['cp']] = cur + cur = None + elif reading_bits and cur is not None: + cur['bitmap'].append(int(k, 16)) + return glyphs, asc, desc + +def pack_glyph_bits(g): + """Return a flat MSB-first, row-major bitstream of exactly w*h bits.""" + w, h, xo, yo = g['bbx'] + out = bytearray() + acc = 0; nbits = 0 + for row in range(h): + rowval = g['bitmap'][row] if row < len(g['bitmap']) else 0 + # BDF rows are left-justified, padded to a multiple of 8 bits. + rowbits = ((len(bin(rowval)) - 2 + 7)//8*8) if rowval else 8 + rowbytes = max(1, (w + 7)//8) + for col in range(w): + byte_i = col // 8 + bit_i = 7 - (col % 8) + shift = (rowbytes - 1 - byte_i) * 8 + bit_i + bit = (rowval >> shift) & 1 + acc = (acc << 1) | bit + nbits += 1 + if nbits == 8: + out.append(acc); acc = 0; nbits = 0 + if nbits: + out.append(acc << (8 - nbits)) + return out + +def main(): + bdf, first_s, last_s, prefix = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4] + first = int(first_s, 16); last = int(last_s, 16) + glyphs, asc, desc = parse_bdf(bdf) + + bitmaps = bytearray() + table = [] # (bitmapOffset, w, h, xadv, xo, yo, cp, present) + present = 0 + for cp in range(first, last + 1): + g = glyphs.get(cp) + if g and g['bbx'] and g['bbx'][0] > 0 and g['bbx'][1] > 0: + w, h, xo, yo = g['bbx'] + off = len(bitmaps) + bitmaps += pack_glyph_bits(g) + xadv = g['dwidth'] if g['dwidth'] is not None else w + yoff_gfx = -(yo + h) # baseline->top, y-down (Adafruit convention) + table.append((off, w, h, xadv, xo, yoff_gfx, cp, True)) + present += 1 + else: + # placeholder: zero-size, advance = a space width + table.append((len(bitmaps), 0, 0, (glyphs.get(0x20)['dwidth'] if 0x20 in glyphs else 4), 0, 0, cp, False)) + + yadv = (asc or 0) + (desc or 0) + o = [] + o.append(f"// {prefix} font, converted from {bdf.split('/')[-1]} by bdf2gfx.py") + o.append(f"// Range: U+{first:04X}-U+{last:04X} ({present} glyphs defined, rest placeholders)") + o.append(f"// Metrics: ascent={asc} descent={desc} yAdvance={yadv}") + o.append("#pragma once") + o.append("#include ") + o.append("") + o.append(f"static const uint8_t {prefix}Bitmaps[] PROGMEM = {{") + for i in range(0, len(bitmaps), 16): + o.append(" " + ", ".join(f"0x{b:02X}" for b in bitmaps[i:i+16]) + ",") + o.append("};") + o.append("") + o.append(f"static const GFXglyph {prefix}Glyphs[] PROGMEM = {{") + for off, w, h, xadv, xo, yo, cp, pres in table: + tag = "" if pres else " (placeholder)" + o.append(f" {{ {off:5d}, {w:3d}, {h:3d}, {xadv:3d}, {xo:3d}, {yo:4d} }}, // U+{cp:04X}{tag}") + o.append("};") + o.append("") + o.append(f"static const GFXfont {prefix} PROGMEM = {{") + o.append(f" (uint8_t*){prefix}Bitmaps,") + o.append(f" (GFXglyph*){prefix}Glyphs,") + o.append(f" 0x{first:04X}, 0x{last:04X},") + o.append(f" {yadv} // yAdvance") + o.append("};") + sys.stderr.write(f"defined={present} total={last-first+1} bitmap_bytes={len(bitmaps)} ascent={asc} descent={desc} yAdv={yadv}\n") + print("\n".join(o)) + +if __name__ == '__main__': + main()