Files
crosspoint-reader-mod/lib/EpdFont/builtinFonts/notosans_18_regular.h

5193 lines
408 KiB
C
Raw Normal View History

Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
/**
* generated by fontconvert.py
* name: notosans_18_regular
* size: 18
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
* mode: 2-bit compressed: true
* Command used: fontconvert.py notosans_18_regular 18 ../builtinFonts/source/NotoSans/NotoSans-Regular.ttf --2bit --compress
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
*/
#pragma once
#include "EpdFontData.h"
static const uint8_t notosans_18_regularBitmaps[48012] = {
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
0xD5, 0x5A, 0x3F, 0x8C, 0xDE, 0x46, 0x76, 0x1F, 0x92, 0x58, 0x13, 0x36, 0x8B, 0x71, 0x61, 0xA5,
0x88, 0x80, 0xF0, 0x8A, 0x14, 0x97, 0x0B, 0x70, 0x6C, 0xD3, 0x68, 0x49, 0x9D, 0x91, 0x18, 0x88,
0x0B, 0xA9, 0xD0, 0xEA, 0x0A, 0x17, 0x6A, 0x0F, 0x3E, 0x20, 0xDB, 0xA4, 0x48, 0x11, 0xED, 0x50,
0x76, 0xE1, 0xC2, 0x85, 0x04, 0x24, 0x4A, 0x93, 0x22, 0x57, 0xDC, 0x01, 0xF6, 0xBA, 0x50, 0x1D,
0x64, 0xB5, 0xA4, 0xA2, 0xE2, 0x0A, 0x15, 0x4B, 0x5B, 0x50, 0x5C, 0xB8, 0x10, 0x1D, 0xC9, 0x10,
0x6C, 0x17, 0x4B, 0x4B, 0xD4, 0x2D, 0xB5, 0xE2, 0x70, 0xEE, 0xF7, 0x7B, 0xC3, 0xEF, 0xDB, 0xD5,
0xEA, 0x24, 0x5B, 0xB6, 0x11, 0x20, 0xDF, 0x2E, 0x87, 0xC3, 0xE1, 0xFC, 0x79, 0xF3, 0xFE, 0xBF,
0x37, 0xCC, 0xAE, 0x8F, 0x39, 0xFE, 0xFF, 0x7B, 0xCC, 0xDE, 0x19, 0xF0, 0x9F, 0x5E, 0xE8, 0xD3,
0x93, 0x7D, 0x5A, 0xF4, 0xBA, 0xE8, 0xB4, 0x3A, 0xAD, 0x94, 0x5A, 0x89, 0x46, 0x73, 0xD3, 0xE6,
0xF5, 0x69, 0x13, 0x3E, 0x1A, 0x93, 0xBD, 0x2E, 0xFB, 0x8F, 0x72, 0x63, 0x35, 0x18, 0x86, 0xF8,
0x66, 0xAB, 0x4F, 0x15, 0x27, 0x4E, 0xA8, 0xAE, 0x8F, 0x6A, 0xA5, 0x7E, 0x8E, 0x3F, 0xA5, 0x72,
0xB5, 0x8A, 0x72, 0x55, 0xCA, 0xF3, 0xEA, 0x04, 0xCA, 0x2D, 0xF5, 0xCF, 0x52, 0x6E, 0xA1, 0x1C,
0xF1, 0xA7, 0xD4, 0x80, 0xBF, 0xC4, 0xE1, 0x37, 0x4A, 0x69, 0x5F, 0xFA, 0x68, 0xFF, 0xA3, 0xFD,
0x0F, 0x54, 0xD4, 0x45, 0x9D, 0x52, 0x51, 0x1B, 0xB5, 0x28, 0x9B, 0xA8, 0x51, 0x2A, 0xAE, 0x63,
0x94, 0x49, 0x9D, 0xD4, 0xEA, 0xD8, 0xB9, 0x5B, 0xE7, 0x6E, 0x9D, 0xCE, 0xD9, 0xBF, 0xF3, 0xA5,
0xCA, 0x8A, 0xB4, 0x50, 0x2A, 0xC3, 0x1F, 0x97, 0xCD, 0x97, 0xCB, 0xAE, 0xCA, 0xB2, 0xE7, 0xF1,
0xA7, 0xB0, 0xF4, 0xD6, 0x72, 0x71, 0xD9, 0x0C, 0x3B, 0x87, 0xDD, 0x5C, 0xA9, 0xDC, 0x80, 0xCB,
0xF5, 0x99, 0x7B, 0xEC, 0xA2, 0x21, 0x0B, 0x7E, 0x53, 0xE1, 0x55, 0xD2, 0xE2, 0xD5, 0x36, 0x2A,
0x71, 0x87, 0x4A, 0xFE, 0x49, 0xA7, 0x42, 0xE7, 0x00, 0x85, 0x7B, 0xC4, 0x62, 0x02, 0x54, 0xCE,
0x62, 0x78, 0xD5, 0x63, 0x1E, 0x53, 0x63, 0x9E, 0x11, 0x15, 0xDD, 0xA0, 0x62, 0x51, 0x49, 0x6F,
0x14, 0x59, 0x32, 0x60, 0x52, 0xC7, 0xBD, 0x95, 0xC7, 0x71, 0x1D, 0x59, 0x54, 0x2A, 0x87, 0x7E,
0xA6, 0x95, 0x76, 0x83, 0x35, 0x74, 0xA9, 0xF2, 0x37, 0x01, 0x41, 0xAD, 0xD2, 0x62, 0x4B, 0xC5,
0xAD, 0xD2, 0xB5, 0x2E, 0x81, 0x14, 0x60, 0xA6, 0x0D, 0x06, 0x22, 0x4E, 0x10, 0xB8, 0x8A, 0xCD,
0x9E, 0x67, 0x6F, 0x5D, 0xE7, 0x82, 0xB0, 0x2E, 0x2B, 0xE4, 0xA5, 0x2E, 0xCF, 0x90, 0x00, 0xC9,
0x35, 0xD7, 0x26, 0x75, 0xFA, 0xFA, 0xE7, 0x80, 0x76, 0xD0, 0xD7, 0x3B, 0xAB, 0x9B, 0x6C, 0xF7,
0xF3, 0x61, 0x55, 0x0D, 0x91, 0x6B, 0xC7, 0xB4, 0xC8, 0xD5, 0x9F, 0x97, 0xE7, 0x05, 0xAB, 0x2A,
0x0F, 0xBB, 0xA0, 0xC7, 0xFA, 0xC5, 0x28, 0x33, 0x62, 0x3E, 0xE0, 0x94, 0xAF, 0x80, 0xF8, 0xA8,
0x0D, 0xBB, 0x90, 0x8B, 0xE3, 0xD5, 0xA8, 0xB0, 0xBE, 0x2E, 0x57, 0x49, 0xC2, 0xB0, 0xCF, 0x0B,
0xF6, 0xCE, 0xB1, 0x35, 0xAE, 0xCF, 0x1D, 0x92, 0x4D, 0x0E, 0xB6, 0x94, 0x4A, 0x13, 0xD0, 0xD6,
0x70, 0xCF, 0xFB, 0x15, 0x16, 0x52, 0x93, 0xCA, 0xD1, 0x18, 0x77, 0xAA, 0x62, 0x87, 0x32, 0x20,
0x23, 0x18, 0x3E, 0x73, 0x4A, 0xBE, 0x8A, 0x86, 0x90, 0x6D, 0x71, 0x9F, 0x71, 0x54, 0xF2, 0xD8,
0x72, 0x26, 0x2D, 0x53, 0xA8, 0x8C, 0x6F, 0x80, 0xF8, 0x5E, 0x05, 0x67, 0x54, 0x75, 0x1B, 0xA0,
0x34, 0xC9, 0xA8, 0x07, 0x92, 0xBD, 0xD4, 0x18, 0x87, 0x91, 0x7A, 0xD0, 0x8D, 0x06, 0xC6, 0x06,
0xA3, 0x00, 0x9E, 0x7E, 0xDC, 0x83, 0x1C, 0xA0, 0x57, 0x1D, 0x01, 0x6F, 0x7A, 0x54, 0x09, 0x16,
0x32, 0x83, 0x4A, 0x7B, 0x00, 0x37, 0xA8, 0x6C, 0xFA, 0xC8, 0xDD, 0x18, 0x55, 0x06, 0xDA, 0x27,
0xA3, 0x3A, 0x0E, 0x82, 0xE2, 0xA6, 0xCE, 0x08, 0x39, 0x8C, 0xD9, 0x58, 0x5D, 0x5D, 0x3D, 0x01,
0xBE, 0x16, 0xDC, 0x6F, 0xAB, 0x94, 0x73, 0x18, 0xF0, 0x05, 0x66, 0x4C, 0xEB, 0x90, 0xD0, 0x46,
0x3D, 0x96, 0x06, 0xEC, 0xE6, 0x68, 0xC1, 0x17, 0x45, 0x88, 0x75, 0x6A, 0x74, 0x06, 0x38, 0xD2,
0x82, 0x87, 0x89, 0x68, 0x4C, 0xCB, 0xF3, 0x40, 0x71, 0xC0, 0x09, 0xD0, 0x79, 0xE2, 0xC4, 0x3D,
0x6E, 0x59, 0x8D, 0x27, 0x8B, 0x71, 0xBA, 0xC5, 0xC8, 0x6D, 0x95, 0x95, 0x89, 0xAF, 0x60, 0x6F,
0x4D, 0xD4, 0xA1, 0x3F, 0xAA, 0x45, 0x5A, 0x6B, 0x10, 0x3A, 0x1C, 0xF0, 0x68, 0xD5, 0x06, 0x00,
0x0D, 0x3E, 0x50, 0xCA, 0xE3, 0x2F, 0xAD, 0x05, 0x97, 0x22, 0x59, 0xE4, 0x07, 0x15, 0xDD, 0xD5,
0xC5, 0x86, 0x76, 0x1B, 0xD5, 0x68, 0x28, 0x29, 0xC7, 0xAE, 0xEC, 0xAF, 0xA1, 0x03, 0x85, 0x6B,
0x8F, 0xCC, 0x76, 0xAA, 0x51, 0xC1, 0x88, 0x41, 0xBA, 0xCD, 0x6B, 0xE5, 0x54, 0x55, 0xA8, 0x7F,
0x52, 0x4B, 0xA6, 0x7C, 0x6D, 0xC1, 0xA2, 0x64, 0x0F, 0x61, 0x58, 0x11, 0x9E, 0x27, 0x9A, 0x7E,
0xB6, 0x39, 0x6D, 0xFE, 0x96, 0x42, 0x78, 0x87, 0x45, 0xF9, 0x8C, 0x5E, 0x47, 0x9A, 0x82, 0xD3,
0x59, 0xED, 0xA2, 0x3E, 0xAD, 0x4D, 0xD8, 0xEB, 0x7A, 0x35, 0xE8, 0xD4, 0xDB, 0x9B, 0xFF, 0xEE,
0xA6, 0xCA, 0x7D, 0xBE, 0x76, 0x66, 0xA9, 0x62, 0xD0, 0xB5, 0x21, 0x43, 0x00, 0x09, 0xC4, 0x1C,
0x77, 0x05, 0xBC, 0xB3, 0x01, 0xF0, 0x86, 0x3D, 0x05, 0x5D, 0xF6, 0x6C, 0xC9, 0xAC, 0x0A, 0x58,
0x22, 0xB1, 0xD9, 0xB0, 0x2D, 0x0D, 0xE4, 0x2A, 0x34, 0x44, 0x73, 0x43, 0x23, 0x0D, 0x9C, 0xAA,
0x9B, 0x11, 0x24, 0xBF, 0x6C, 0xC2, 0x18, 0xC2, 0x6D, 0xF6, 0x5D, 0x19, 0x8D, 0xCA, 0x14, 0x59,
0x0D, 0xB6, 0xC4, 0x9C, 0x16, 0x53, 0x85, 0x03, 0x06, 0xC4, 0x1D, 0x57, 0xB8, 0xCE, 0x05, 0x81,
0x2D, 0x65, 0xC9, 0xE7, 0x03, 0xE6, 0x4A, 0xEE, 0x60, 0xA6, 0xEC, 0x22, 0xB6, 0xB3, 0xBD, 0x68,
0xD2, 0x37, 0x97, 0xBD, 0x64, 0x25, 0x43, 0x58, 0x31, 0x7A, 0x02, 0xA7, 0xC4, 0x1D, 0x59, 0xA7,
0x8C, 0xA7, 0x5F, 0x8F, 0xD4, 0x78, 0x35, 0x96, 0x25, 0x89, 0xCE, 0x78, 0xBC, 0xE4, 0x4D, 0xEC,
0x8A, 0xCA, 0xEA, 0xBD, 0x87, 0xEE, 0xD4, 0xCD, 0x2E, 0xFF, 0x3B, 0x40, 0x80, 0x3D, 0x03, 0x6A,
0x6C, 0xE1, 0x45, 0xAA, 0xF2, 0xAB, 0xB0, 0x29, 0xF0, 0x73, 0x1D, 0xBB, 0xAF, 0x5D, 0x9D, 0xB5,
0xAA, 0x2A, 0x7F, 0xAA, 0x44, 0xD6, 0xB8, 0x2F, 0xC1, 0x25, 0x7B, 0x0B, 0x7A, 0x04, 0x2B, 0x82,
0x57, 0xD1, 0x9A, 0x94, 0x10, 0x30, 0x21, 0x40, 0x62, 0x33, 0xA5, 0x2F, 0xB4, 0x87, 0x2B, 0x29,
0x2A, 0xC1, 0x53, 0x15, 0xB5, 0xA4, 0xFF, 0x45, 0x5C, 0x93, 0xC0, 0x10, 0x54, 0xAE, 0x80, 0x22,
0x73, 0xB5, 0x76, 0x5F, 0x01, 0x88, 0x4B, 0xAA, 0xAA, 0xFF, 0xF2, 0x4F, 0x03, 0xC1, 0xA7, 0x71,
0x5E, 0xF6, 0x2D, 0xCB, 0xC9, 0x40, 0x35, 0x87, 0x2D, 0xBC, 0xF2, 0x91, 0x23, 0xFB, 0x88, 0xCA,
0xA0, 0x56, 0xF0, 0x64, 0x5B, 0x8E, 0x16, 0x56, 0xAF, 0x04, 0xE8, 0x7F, 0xC4, 0xBB, 0x6B, 0xEE,
0x77, 0xEB, 0x16, 0xA4, 0x74, 0xCD, 0x4B, 0x8E, 0x98, 0x5D, 0x39, 0x2D, 0x70, 0xC8, 0xC0, 0x4C,
0x44, 0x63, 0x14, 0x25, 0xC2, 0xED, 0xDE, 0xC6, 0xD0, 0xF8, 0x1E, 0x85, 0xE0, 0x9B, 0x91, 0xB3,
0x61, 0xE2, 0x70, 0xE0, 0x7C, 0xA3, 0x30, 0x14, 0x71, 0xB2, 0xCD, 0xD5, 0x0C, 0x17, 0x11, 0xE9,
0xCE, 0x0A, 0x34, 0xA6, 0x60, 0x13, 0xB2, 0x16, 0xE4, 0xAF, 0x21, 0x3D, 0xB9, 0xE3, 0x81, 0xC5,
0x94, 0x7B, 0xE6, 0xF7, 0x32, 0x28, 0x28, 0xF5, 0xC0, 0x0A, 0x8C, 0x8B, 0x46, 0x0D, 0xFB, 0x46,
0x54, 0x35, 0xAC, 0x48, 0x27, 0x4C, 0x48, 0x65, 0xEA, 0x2B, 0x64, 0x69, 0x45, 0xED, 0x2D, 0x95,
0xFC, 0x6F, 0x4F, 0x03, 0x0B, 0x30, 0x34, 0x39, 0x77, 0xF3, 0xE5, 0x59, 0x47, 0x12, 0x01, 0x33,
0x1E, 0x57, 0x32, 0xAF, 0x5D, 0xA0, 0xD0, 0xCE, 0x2D, 0x42, 0x34, 0xF3, 0xF7, 0x78, 0xE8, 0xAA,
0xDF, 0x5D, 0x11, 0x8B, 0x0A, 0x15, 0x87, 0x41, 0xC1, 0x99, 0x05, 0xBF, 0x1F, 0xC7, 0x3C, 0x29,
0x48, 0x94, 0xB8, 0xCD, 0xDF, 0x84, 0xC4, 0x85, 0xC1, 0xCA, 0x50, 0x4E, 0x1E, 0x68, 0x32, 0x04,
0xE5, 0x43, 0x80, 0x4F, 0xDA, 0xE3, 0xBF, 0x55, 0xDB, 0x99, 0xEB, 0xF5, 0x67, 0xCE, 0xB5, 0xD0,
0xB7, 0xEE, 0x14, 0x14, 0xFE, 0x48, 0xDB, 0x74, 0x1B, 0x03, 0x26, 0xEA, 0xD4, 0xAF, 0xB1, 0xFC,
0x36, 0xC4, 0x2B, 0x21, 0x32, 0x27, 0x2A, 0xDB, 0x4F, 0xD8, 0x47, 0x43, 0xB5, 0x17, 0xE6, 0x8B,
0xAA, 0x0D, 0x08, 0x7C, 0x48, 0x23, 0x49, 0x46, 0xA7, 0x06, 0x7A, 0x48, 0x4C, 0xDD, 0x9B, 0xD1,
0x25, 0x1C, 0x44, 0x75, 0x7C, 0xC0, 0x8A, 0xB2, 0x21, 0xB3, 0x60, 0x45, 0xD9, 0xE7, 0xB6, 0x9A,
0xA1, 0xCA, 0x16, 0xBB, 0x5E, 0x0E, 0x91, 0x1D, 0x13, 0xFC, 0x23, 0x43, 0x9C, 0x58, 0x0F, 0x76,
0x7A, 0x62, 0x88, 0xFF, 0xAD, 0x63, 0x69, 0x4D, 0x83, 0x04, 0xCE, 0x6C, 0x12, 0x68, 0xE9, 0x1A,
0x53, 0xE5, 0x27, 0x49, 0x74, 0x91, 0x79, 0x50, 0x38, 0x69, 0xD9, 0x54, 0x98, 0x02, 0x53, 0x56,
0x25, 0x4C, 0x7B, 0xB5, 0x3B, 0x10, 0xFE, 0x02, 0x9B, 0x01, 0x7F, 0xE7, 0x5F, 0xBB, 0x22, 0x1E,
0x03, 0x57, 0x82, 0xBB, 0xAA, 0x5F, 0x60, 0x60, 0xA5, 0x67, 0xCD, 0x10, 0x2E, 0x35, 0x43, 0x7E,
0xAA, 0xA5, 0x6A, 0x05, 0xBA, 0xBB, 0xFC, 0xD1, 0x59, 0x47, 0x81, 0xEC, 0xC4, 0xBC, 0x28, 0xB5,
0xB6, 0x84, 0x64, 0x22, 0x47, 0x02, 0x1C, 0x40, 0x52, 0x02, 0x12, 0x20, 0xAD, 0x50, 0x15, 0x37,
0x65, 0x45, 0x61, 0x51, 0xAF, 0x74, 0xA2, 0x57, 0xBA, 0xA5, 0xF6, 0x81, 0x42, 0xEA, 0xC1, 0xF5,
0x79, 0xE3, 0xA0, 0x41, 0x4E, 0xBA, 0xAF, 0xAC, 0x05, 0x92, 0xA1, 0x77, 0x0C, 0xE1, 0xF6, 0x78,
0x10, 0x96, 0x7A, 0x12, 0x91, 0x44, 0x5D, 0x64, 0xD5, 0xCB, 0x67, 0xB1, 0xED, 0xDC, 0xCD, 0x52,
0x26, 0x80, 0xBC, 0x72, 0xA0, 0x6F, 0x9F, 0xF8, 0x2D, 0xF5, 0x70, 0x58, 0xE6, 0xD7, 0xDC, 0x1B,
0xA0, 0xE9, 0x8A, 0x7A, 0xEA, 0xB7, 0x52, 0xE4, 0x25, 0x14, 0x65, 0x56, 0xDB, 0xA8, 0x4B, 0xCB,
0xAD, 0xB0, 0x5D, 0xDA, 0x8D, 0x98, 0x3C, 0x45, 0x1A, 0xC3, 0xD2, 0xAA, 0x54, 0x5C, 0xA5, 0x12,
0x0D, 0x00, 0xCA, 0x80, 0x2E, 0xA9, 0x5D, 0x70, 0xF3, 0x44, 0x2A, 0x8A, 0x65, 0x37, 0x42, 0x3D,
0x27, 0xCF, 0x9C, 0xA7, 0x92, 0xE7, 0x61, 0x9E, 0x4B, 0xA9, 0xE2, 0xD8, 0xDA, 0xDA, 0xDA, 0x29,
0x3A, 0x89, 0xE4, 0x9E, 0x5B, 0x78, 0x38, 0xF3, 0x34, 0x40, 0xF4, 0xB6, 0x76, 0x16, 0x7D, 0xEA,
0x57, 0xD9, 0x44, 0x36, 0x88, 0xAC, 0xF8, 0x0C, 0x64, 0xB2, 0x43, 0x6B, 0x4D, 0xE2, 0x99, 0x50,
0x41, 0x54, 0x5C, 0x01, 0x9A, 0x52, 0x1E, 0x83, 0xAA, 0xF7, 0x3D, 0xB2, 0xC9, 0x03, 0x94, 0xB8,
0x4B, 0x40, 0x78, 0x3B, 0x1B, 0xD5, 0x60, 0xB9, 0x18, 0x79, 0x01, 0xE2, 0xD9, 0xE4, 0x93, 0xEB,
0x7E, 0xAE, 0xE2, 0x61, 0x66, 0xE1, 0x71, 0x66, 0xB9, 0xD1, 0x3F, 0x8B, 0xD7, 0xD1, 0x79, 0x56,
0x74, 0x5E, 0x7E, 0xF9, 0x48, 0x3E, 0xCD, 0x0A, 0x35, 0xBB, 0xAC, 0x4A, 0x1D, 0x3B, 0xB4, 0x8B,
0x97, 0x67, 0xC1, 0xA4, 0xEA, 0xE3, 0xC5, 0xFA, 0xCB, 0xF2, 0xE6, 0xD7, 0x5F, 0xFA, 0x85, 0x9D,
0xC7, 0x13, 0x4C, 0x26, 0x11, 0x79, 0x49, 0xC5, 0xD6, 0xF7, 0x8A, 0x7B, 0x4F, 0x78, 0xF1, 0x27,
0x84, 0x01, 0xB6, 0x55, 0xB0, 0x56, 0xD0, 0xCC, 0x06, 0x54, 0xC6, 0xEF, 0x80, 0xC9, 0x40, 0xFE,
0xAD, 0x1C, 0x3A, 0x3D, 0x69, 0xE2, 0xEB, 0x2D, 0x38, 0x7E, 0x4B, 0x9D, 0x38, 0xAF, 0xAE, 0xC2,
0x30, 0x47, 0x9F, 0xD5, 0xE0, 0xA1, 0x2D, 0xB5, 0xBA, 0x85, 0x8D, 0xEA, 0x3A, 0xDA, 0xAD, 0xA1,
0x97, 0x46, 0x75, 0x62, 0xA4, 0xC3, 0x57, 0xC7, 0x3B, 0xF0, 0x40, 0xF1, 0xB8, 0xB5, 0x85, 0x22,
0xAB, 0xF5, 0xFB, 0x75, 0xD2, 0xC6, 0x36, 0xEC, 0xCE, 0xAB, 0xFC, 0x7F, 0xFE, 0xF0, 0x68, 0x82,
0x5B, 0xEA, 0xAC, 0x86, 0x48, 0xA8, 0x10, 0x7E, 0xCC, 0x25, 0xE1, 0xC1, 0x05, 0x1B, 0xCE, 0xD2,
0x4A, 0xE4, 0x11, 0xDE, 0x57, 0xE9, 0x29, 0x5E, 0x5A, 0x81, 0xB3, 0x21, 0xBE, 0x7F, 0x2F, 0xB4,
0x71, 0x77, 0xA5, 0xC3, 0x2C, 0x1B, 0x62, 0x91, 0x04, 0x4F, 0x8A, 0x8E, 0x1A, 0x27, 0x10, 0xAD,
0xBA, 0x2A, 0xE5, 0x55, 0x3A, 0x3D, 0x8A, 0xE2, 0x41, 0x21, 0x21, 0x1B, 0xF5, 0x44, 0x67, 0xD4,
0x51, 0x04, 0x92, 0x96, 0x83, 0x75, 0x13, 0x77, 0x0B, 0x34, 0x64, 0xA5, 0x78, 0x07, 0x42, 0x8D,
0x6A, 0x6D, 0xCD, 0x7A, 0x83, 0x05, 0x58, 0x58, 0x86, 0xD3, 0xE6, 0x66, 0x45, 0x2F, 0x0E, 0x9D,
0x39, 0x44, 0x5C, 0x47, 0xA8, 0x0B, 0x4E, 0x48, 0xCE, 0x26, 0x01, 0xBD, 0xAA, 0xF1, 0xE6, 0x47,
0xCC, 0xDB, 0x64, 0xDC, 0xBE, 0x98, 0x37, 0x2B, 0x4A, 0xAD, 0x36, 0x60, 0x9A, 0xD6, 0x10, 0x60,
0x43, 0x1A, 0x98, 0xD9, 0xA8, 0x1C, 0x14, 0x89, 0xF8, 0x02, 0x8D, 0x59, 0x3B, 0xEB, 0x0A, 0xC3,
0x2D, 0xFB, 0xB1, 0x78, 0x6C, 0x16, 0xC3, 0x22, 0x2E, 0x20, 0xAB, 0x04, 0xF6, 0x89, 0x42, 0x5E,
0xC4, 0x2C, 0xB2, 0x8E, 0xAB, 0x35, 0x2C, 0x38, 0xCB, 0xDD, 0x03, 0xAD, 0xFE, 0x48, 0x58, 0xBF,
0xE7, 0xC6, 0x46, 0xB2, 0xF8, 0x3F, 0x28, 0xCF, 0xD7, 0xE5, 0xD2, 0x04, 0xD6, 0x0B, 0x4D, 0x29,
0x7A, 0xD1, 0xDB, 0x28, 0x31, 0xC7, 0xF2, 0x46, 0xD4, 0x63, 0x78, 0xA4, 0x51, 0x7A, 0x2A, 0xD9,
0xB0, 0xE8, 0xD1, 0x44, 0x9E, 0xDD, 0x92, 0x26, 0x14, 0x96, 0x15, 0x28, 0xB6, 0x4D, 0x57, 0x90,
0x23, 0x1B, 0x52, 0x13, 0x2B, 0xAC, 0x88, 0xAA, 0x07, 0x7E, 0x02, 0x21, 0x2E, 0x6D, 0x32, 0xBD,
0xE5, 0x60, 0xDD, 0x8A, 0x0F, 0x27, 0xA6, 0x2F, 0x16, 0x4B, 0x1B, 0x8B, 0xD1, 0x15, 0xDC, 0xA8,
0xF4, 0x63, 0xB1, 0x40, 0xEF, 0x11, 0x90, 0xCA, 0x5B, 0x33, 0x36, 0xC7, 0xDF, 0x88, 0xBD, 0xFB,
0xFD, 0x91, 0xE6, 0xE4, 0x9B, 0x65, 0xEF, 0xC0, 0xB2, 0x59, 0x50, 0xA8, 0xCC, 0x85, 0xE5, 0xDC,
0x55, 0x83, 0xE6, 0x75, 0x4F, 0x9F, 0x86, 0x90, 0x0C, 0x84, 0x84, 0xE2, 0x43, 0xD4, 0xE3, 0x9A,
0xE4, 0x9A, 0x95, 0xE4, 0x33, 0x2F, 0x68, 0x19, 0xF4, 0x1B, 0xE5, 0x62, 0xFD, 0xDB, 0xFA, 0xFB,
0xF9, 0xA7, 0x43, 0xD7, 0x77, 0x5F, 0xEB, 0xE8, 0x7A, 0x9B, 0x9B, 0x1F, 0x7C, 0xA7, 0x31, 0xEA,
0xB0, 0x47, 0x4B, 0xCF, 0xEB, 0xAE, 0xB7, 0xB5, 0x22, 0x5D, 0x83, 0xC2, 0x63, 0x5C, 0x6B, 0x4F,
0xDB, 0x72, 0xE1, 0x6D, 0x79, 0x0A, 0x7B, 0xE2, 0x7A, 0x3A, 0x8B, 0xE1, 0xF4, 0xD4, 0xF7, 0x8C,
0x90, 0x48, 0xB8, 0x7B, 0xA5, 0x66, 0xA8, 0x8B, 0xE6, 0xCC, 0xED, 0x8B, 0xB5, 0xBD, 0x27, 0x76,
0xF5, 0x22, 0x59, 0x69, 0xCA, 0x45, 0x3C, 0x60, 0xB4, 0xC0, 0x5A, 0xD4, 0x48, 0xF9, 0x05, 0x96,
0x13, 0x19, 0x03, 0x31, 0x9C, 0xDB, 0xDF, 0x74, 0x6D, 0xE0, 0x6D, 0xFD, 0xBA, 0xB0, 0x6B, 0xB0,
0xE6, 0x41, 0xD5, 0xA4, 0x67, 0x20, 0x94, 0x4C, 0x5F, 0xA8, 0xFA, 0x70, 0x6D, 0xED, 0xAC, 0x44,
0x32, 0xEE, 0xF7, 0x92, 0x35, 0x00, 0x8E, 0x36, 0xAF, 0x7C, 0xDF, 0xC9, 0x0E, 0xAA, 0xB5, 0x71,
0xF7, 0x9D, 0xBB, 0x56, 0x3D, 0x02, 0x74, 0x01, 0x7D, 0x75, 0x62, 0xE3, 0xC5, 0xAA, 0x2F, 0x4D,
0x27, 0x9D, 0xBB, 0xC1, 0xF4, 0x00, 0xCC, 0x55, 0x45, 0xE4, 0xFD, 0xC0, 0x82, 0x31, 0x66, 0xBE,
0x03, 0x07, 0x73, 0x4A, 0x68, 0x24, 0x95, 0x99, 0x59, 0x3D, 0x98, 0xC8, 0xDE, 0x13, 0xA5, 0xC8,
0xB1, 0xD1, 0x71, 0x7D, 0xE7, 0xC3, 0x69, 0x34, 0x56, 0xEC, 0x09, 0xD5, 0x8A, 0x3D, 0x31, 0x1C,
0x42, 0x81, 0x3D, 0xD2, 0x0E, 0xD3, 0x80, 0xA5, 0x34, 0xFD, 0xB1, 0x83, 0x4D, 0x09, 0x60, 0xD2,
0xA5, 0x67, 0x49, 0x77, 0xB6, 0xE7, 0x70, 0xC7, 0xE1, 0x29, 0x03, 0xD5, 0xD0, 0x8A, 0xE3, 0x4B,
0x7D, 0x18, 0x8D, 0x5C, 0xC8, 0x94, 0x94, 0x5C, 0x51, 0xB2, 0x4E, 0x94, 0x64, 0xF7, 0x22, 0x8C,
0xF9, 0xBD, 0xAE, 0xC3, 0x42, 0x44, 0x5E, 0x4B, 0x2C, 0xA3, 0x56, 0xA5, 0xAD, 0x11, 0xE7, 0xDF,
0x1A, 0x51, 0x00, 0x76, 0x63, 0xBE, 0xD1, 0x49, 0xBC, 0x6A, 0x37, 0x38, 0x74, 0xB4, 0x1B, 0x50,
0xD8, 0xC1, 0x60, 0x37, 0x24, 0x72, 0xB4, 0x1B, 0xB0, 0x0A, 0x51, 0x87, 0x1B, 0x14, 0x54, 0x6B,
0x0D, 0xE0, 0xD7, 0xB5, 0x35, 0x12, 0x8C, 0x5B, 0x03, 0xCB, 0x90, 0x15, 0xD0, 0xB2, 0x88, 0xC4,
0x15, 0x6E, 0x8C, 0xA7, 0x71, 0xE3, 0x33, 0x6E, 0xB9, 0xBF, 0x65, 0xB0, 0x9A, 0xB8, 0xA5, 0xD7,
0x3B, 0xDE, 0xF4, 0xA7, 0x2D, 0x6F, 0xF4, 0x7D, 0x71, 0x8B, 0x10, 0xA3, 0xC8, 0xAD, 0xE4, 0x8D,
0xE6, 0xCD, 0x0A, 0x4D, 0xE4, 0x76, 0x95, 0x37, 0xE6, 0x33, 0xEE, 0x59, 0x49, 0x27, 0x50, 0xE5,
0xED, 0x89, 0x53, 0x64, 0x48, 0x87, 0xBD, 0x5D, 0xC6, 0xA2, 0x1B, 0xE8, 0x11, 0xEF, 0xFD, 0x2F,
0xB1, 0xBC, 0x01, 0x83, 0x17, 0xEF, 0xB5, 0x68, 0x30, 0x1B, 0x0C, 0x19, 0xF7, 0x5A, 0x34, 0x18,
0x80, 0x53, 0xC4, 0x7B, 0x1D, 0xA3, 0x53, 0xAC, 0xDE, 0xA2, 0x8A, 0x06, 0x54, 0xA3, 0x91, 0x55,
0x44, 0xEE, 0x58, 0xA9, 0x7A, 0x7D, 0x8F, 0xB4, 0x62, 0x35, 0xBD, 0xB3, 0x47, 0xF5, 0x67, 0x68,
0x39, 0x1C, 0xAB, 0xA9, 0x23, 0x56, 0x2A, 0x56, 0x23, 0xA9, 0xA6, 0xDD, 0x81, 0x2B, 0x4C, 0xA1,
0x14, 0xDD, 0x1D, 0x4A, 0xE8, 0x46, 0xC9, 0x35, 0x1D, 0xB7, 0x01, 0x2B, 0xEE, 0x44, 0xF1, 0x53,
0xBA, 0x61, 0x02, 0x25, 0xDA, 0x12, 0x03, 0x92, 0x7E, 0x2A, 0x2E, 0x95, 0x68, 0x03, 0xE5, 0xBC,
0xB9, 0xD8, 0x15, 0xFB, 0xF0, 0x58, 0xAC, 0xC8, 0xE4, 0x55, 0xCD, 0xA1, 0x17, 0x9A, 0x6B, 0x63,
0x12, 0xC9, 0xE3, 0x58, 0x3F, 0x95, 0x18, 0x93, 0xBC, 0x74, 0x12, 0x5E, 0x12, 0xA2, 0xAC, 0x0D,
0x19, 0x32, 0x76, 0x62, 0x50, 0x3A, 0x81, 0xAA, 0x55, 0x3E, 0x38, 0x57, 0x3E, 0x82, 0x31, 0x50,
0xDF, 0xF1, 0x6C, 0xFB, 0x20, 0x04, 0x81, 0xA1, 0x65, 0x35, 0x10, 0x63, 0x31, 0x93, 0x9A, 0x31,
0x08, 0xF7, 0x97, 0x70, 0x35, 0x6A, 0x5B, 0xFD, 0x69, 0xE7, 0xCD, 0x45, 0xF5, 0xDE, 0xC3, 0xB3,
0x15, 0x6D, 0xE7, 0x10, 0x8B, 0xD9, 0xDD, 0xFC, 0x57, 0x1F, 0x94, 0x99, 0x45, 0x74, 0xF6, 0x2D,
0x15, 0xF5, 0xFF, 0x0F, 0x5F, 0xE7, 0xBA, 0xA5, 0xBB, 0x35, 0xC7, 0xBF, 0x2A, 0xF4, 0x0F, 0xB9,
0x3C, 0x44, 0x3E, 0x4C, 0x3F, 0x06, 0x5C, 0x7E, 0x29, 0x9E, 0x4C, 0xEF, 0x4D, 0x06, 0x14, 0x99,
0xA3, 0xB0, 0x63, 0x1F, 0x54, 0xEA, 0x8B, 0x42, 0x6C, 0x74, 0xB2, 0x7C, 0xD4, 0xCD, 0xDC, 0x25,
0x10, 0x62, 0x88, 0x95, 0x6D, 0x59, 0x30, 0x42, 0x4E, 0x1B, 0xA6, 0xC8, 0x24, 0x05, 0xC6, 0x64,
0x19, 0x18, 0xD9, 0xCC, 0xAA, 0x0A, 0x6C, 0x7B, 0x78, 0xE6, 0x64, 0xE9, 0xF6, 0x48, 0x20, 0x28,
0xA6, 0xEB, 0x92, 0x12, 0x7F, 0x0A, 0xAA, 0x5D, 0x0F, 0xEA, 0xF8, 0x49, 0xBB, 0xC8, 0x47, 0x48,
0x10, 0x53, 0xCE, 0xA6, 0x29, 0x95, 0x60, 0xB8, 0x16, 0x37, 0x92, 0x11, 0x94, 0x68, 0x36, 0x29,
0x98, 0x23, 0xA6, 0x09, 0x4A, 0xC6, 0x45, 0x6E, 0x62, 0x5A, 0x78, 0x37, 0xD5, 0xEC, 0x00, 0x05,
0xF6, 0x6F, 0x00, 0xC9, 0x75, 0xB7, 0x59, 0x31, 0x7B, 0x3C, 0x06, 0xF4, 0x87, 0x25, 0x5B, 0x20,
0x66, 0x65, 0x9D, 0xC5, 0x67, 0x4E, 0x3C, 0x17, 0x0F, 0xD5, 0xD3, 0x81, 0xFC, 0xFF, 0x49, 0x23,
0x5D, 0xDC, 0x94, 0xDC, 0x10, 0x93, 0x4B, 0x02, 0x61, 0x12, 0x53, 0xFD, 0xA8, 0x8D, 0x96, 0x8D,
0x95, 0x59, 0x98, 0xF3, 0xF4, 0x13, 0x26, 0xBA, 0x3A, 0xD8, 0x89, 0xB4, 0x8F, 0xDC, 0x57, 0x88,
0x82, 0x72, 0xC1, 0x82, 0xF0, 0x15, 0x1D, 0x73, 0x09, 0xC4, 0xFF, 0x20, 0xB9, 0x1A, 0xA6, 0xC3,
0xD4, 0x44, 0x74, 0x7A, 0xD7, 0x3B, 0x63, 0x0C, 0x0D, 0x5C, 0x33, 0xD0, 0xEB, 0x25, 0xD3, 0x26,
0x9E, 0xF7, 0x44, 0xD4, 0x7B, 0x0B, 0x09, 0x2A, 0x4A, 0xAA, 0x0A, 0x74, 0x40, 0x43, 0xC0, 0x10,
0x82, 0xFC, 0xC1, 0x2C, 0x42, 0x27, 0x26, 0xA5, 0xA6, 0x9F, 0x8A, 0x70, 0x92, 0x80, 0x0A, 0x56,
0xAC, 0x4F, 0x05, 0x4B, 0xE8, 0x26, 0x02, 0xA1, 0x77, 0xCB, 0x65, 0x02, 0x58, 0x8C, 0x81, 0x84,
0x90, 0x73, 0xDA, 0x63, 0x0E, 0xB6, 0x24, 0x59, 0x47, 0x67, 0xFE, 0xFA, 0xE0, 0x63, 0xB6, 0x2A,
0xA1, 0x6C, 0x70, 0xAD, 0xB4, 0x16, 0xDE, 0xD0, 0x0D, 0x63, 0xFB, 0x0D, 0x0E, 0x99, 0x30, 0x66,
0x04, 0x6F, 0x61, 0x06, 0xC6, 0xEC, 0x12, 0x33, 0xE4, 0x6F, 0xB6, 0xD0, 0xFB, 0xB0, 0x15, 0x63,
0x3A, 0xE7, 0x67, 0xDB, 0x9C, 0xC6, 0xB8, 0xA2, 0x9D, 0xC0, 0x16, 0xD0, 0x06, 0x93, 0x88, 0x32,
0xEA, 0xE3, 0x2E, 0xEA, 0x12, 0x6A, 0xE0, 0xAC, 0xC4, 0xA4, 0x25, 0x76, 0x64, 0xC1, 0xA3, 0x00,
0x20, 0x8F, 0x3A, 0xBF, 0x07, 0xCB, 0x00, 0x2A, 0x63, 0x76, 0xF2, 0x2A, 0x2E, 0x22, 0xE7, 0x01,
0xF0, 0xF1, 0x00, 0xF0, 0xE9, 0x9D, 0x5A, 0x2E, 0x95, 0x6F, 0xFB, 0x4B, 0x49, 0xD4, 0xD9, 0x2B,
0x01, 0xD6, 0x33, 0xF7, 0x44, 0x06, 0x57, 0x7E, 0x3F, 0xC9, 0x22, 0x8A, 0x27, 0x53, 0x53, 0x10,
0xD2, 0x0B, 0x96, 0xC8, 0x67, 0x88, 0x24, 0xF9, 0x74, 0x49, 0x47, 0x33, 0x0F, 0x28, 0x69, 0x75,
0x26, 0x89, 0x81, 0x18, 0xD2, 0x40, 0xB7, 0x24, 0xBB, 0x39, 0x45, 0x29, 0x92, 0x94, 0xA3, 0xE4,
0xC0, 0x94, 0x11, 0x46, 0x13, 0x0E, 0x77, 0x92, 0x5C, 0xA1, 0xDE, 0x90, 0x7C, 0x18, 0xE8, 0x2A,
0xA1, 0x13, 0xB3, 0xA7, 0x7D, 0x28, 0xB9, 0x30, 0x10, 0x9A, 0x4E, 0x0E, 0xD3, 0x21, 0xA1, 0xB8,
0x18, 0xBA, 0x25, 0x1C, 0x15, 0x63, 0xDB, 0x68, 0x14, 0xB6, 0x6A, 0xB9, 0x87, 0xF4, 0xBD, 0x7E,
0xA1, 0xFC, 0x24, 0x89, 0xAA, 0x1B, 0x3A, 0x91, 0xA3, 0x92, 0x6C, 0x4A, 0x28, 0xA9, 0x77, 0xDD,
0x06, 0xC2, 0x04, 0x39, 0x5D, 0x44, 0x1F, 0xA3, 0x51, 0x44, 0x27, 0x89, 0xB7, 0x1E, 0x10, 0xBE,
0xDC, 0xA9, 0x45, 0x9C, 0xEE, 0xBD, 0x56, 0x89, 0x1D, 0x7D, 0x3C, 0xFB, 0xA2, 0x55, 0x26, 0xE6,
0xFA, 0x43, 0xE9, 0xE9, 0x39, 0x7D, 0xD6, 0xCC, 0x71, 0x8C, 0x28, 0x06, 0x53, 0x1C, 0xCA, 0x40,
0x8A, 0xCC, 0xEB, 0x85, 0xBE, 0x58, 0xE6, 0x90, 0x0E, 0xA9, 0x9D, 0xE5, 0xB0, 0xF2, 0xF0, 0xB0,
0x69, 0x39, 0x8C, 0x76, 0x81, 0x8B, 0x3D, 0x96, 0x14, 0x84, 0x73, 0xC6, 0xDD, 0xA6, 0x19, 0xA6,
0x83, 0x81, 0x98, 0xFA, 0xFB, 0x54, 0xDC, 0x1E, 0xF3, 0x19, 0xC5, 0x86, 0x4F, 0x83, 0xD1, 0xB7,
0x19, 0x25, 0xC5, 0x4D, 0x81, 0x8C, 0x7D, 0x0B, 0xF5, 0x23, 0x5B, 0xEC, 0xDC, 0xE2, 0x35, 0x66,
0xEA, 0x5B, 0x18, 0x0F, 0xE7, 0x1E, 0x2B, 0x92, 0xE4, 0xF4, 0x2D, 0xC6, 0xB7, 0x90, 0x97, 0x38,
0x5D, 0x93, 0xBB, 0x9B, 0xCE, 0xE6, 0x40, 0xBB, 0x25, 0xF7, 0xFF, 0xA0, 0x62, 0x39, 0x95, 0x5A,
0xC6, 0x9A, 0x62, 0x6F, 0x62, 0x41, 0xDE, 0x0E, 0x53, 0x8E, 0x6F, 0x52, 0x69, 0xF0, 0x78, 0x6F,
0x95, 0xA7, 0x02, 0x4C, 0x38, 0xE0, 0x7F, 0x8B, 0xA9, 0xF0, 0x55, 0xEE, 0x32, 0x53, 0x71, 0x23,
0xA7, 0x5A, 0x2A, 0xA9, 0x53, 0xF0, 0x61, 0xCB, 0x1D, 0xF5, 0xD4, 0x89, 0xE3, 0xCF, 0xE0, 0xF2,
0xFF, 0xCB, 0x22, 0xE9, 0xDA, 0xBE, 0x5D, 0x68, 0x9E, 0x9F, 0x50, 0x5E, 0x89, 0x80, 0xD3, 0xA2,
0xA8, 0xE8, 0xE6, 0xE2, 0x6D, 0x9B, 0x7C, 0x71, 0x7C, 0x54, 0xA5, 0x04, 0xC0, 0x49, 0xB7, 0xC8,
0x71, 0x8A, 0x92, 0x7D, 0xA9, 0x72, 0x5D, 0x0A, 0xED, 0x9F, 0xED, 0x9F, 0x31, 0x19, 0x98, 0x7B,
0xA7, 0x15, 0xB1, 0x14, 0x95, 0x58, 0x91, 0x5B, 0x77, 0x20, 0xC1, 0xF7, 0xDD, 0xDA, 0x34, 0xE6,
0x6E, 0xCA, 0x42, 0x67, 0x93, 0x3A, 0xC0, 0xDC, 0xBF, 0x3A, 0x9C, 0x72, 0x7D, 0x66, 0x65, 0x4D,
0xE9, 0x8F, 0xE1, 0x1B, 0xD8, 0x0A, 0x46, 0xCC, 0xDD, 0x32, 0x1D, 0x10, 0x61, 0x2E, 0xF6, 0x8B,
0xDC, 0x29, 0x05, 0x76, 0xA2, 0x99, 0x22, 0x0D, 0xC4, 0x1D, 0x67, 0x52, 0x4C, 0x32, 0x64, 0x54,
0x57, 0xEC, 0x43, 0xBF, 0xD0, 0xF2, 0x30, 0x65, 0xC7, 0x42, 0xF0, 0xA7, 0xE9, 0x2D, 0xA7, 0x11,
0x59, 0xD4, 0x83, 0x18, 0xB9, 0x95, 0x42, 0xE2, 0x28, 0xA8, 0xE5, 0x26, 0x73, 0xEE, 0x17, 0xEE,
0xF2, 0x16, 0xF9, 0xD2, 0x79, 0x66, 0x25, 0x2F, 0x4E, 0x73, 0xCE, 0xA9, 0xF1, 0x22, 0x30, 0x3F,
0x12, 0x01, 0xE4, 0x7B, 0x72, 0x33, 0x64, 0xBF, 0xA8, 0xBE, 0xBC, 0x52, 0xD0, 0xF4, 0xAD, 0x63,
0xCE, 0x40, 0x92, 0x7F, 0xE1, 0xA5, 0x6F, 0xF3, 0x84, 0x56, 0x4E, 0xC7, 0x5D, 0xE2, 0x7A, 0x13,
0x39, 0x77, 0xAF, 0x73, 0xB7, 0xD6, 0x1D, 0x50, 0x67, 0x1E, 0x30, 0xC3, 0x4B, 0x93, 0x4E, 0x9B,
0xE2, 0x9E, 0xB3, 0xB3, 0x6A, 0x76, 0xCD, 0x1C, 0xB5, 0xD5, 0xFD, 0x09, 0xAD, 0x7A, 0x7A, 0xEB,
0x31, 0x8C, 0xB0, 0xCD, 0x61, 0x7B, 0x5F, 0xEF, 0x24, 0x05, 0x46, 0x47, 0x8F, 0xA7, 0xAA, 0x21,
0x4D, 0x4F, 0xF5, 0xB1, 0x69, 0x00, 0x33, 0xD5, 0x0C, 0xA2, 0x4C, 0xEC, 0xEE, 0x06, 0x2D, 0x07,
0xB8, 0x3E, 0x65, 0x8E, 0x6F, 0xA4, 0x80, 0xED, 0xEC, 0x23, 0x4A, 0x9E, 0x16, 0xB9, 0x8D, 0x27,
0x64, 0x96, 0xCE, 0xCF, 0x6B, 0xB1, 0xFB, 0xB7, 0xAA, 0x48, 0x39, 0x59, 0xC6, 0x24, 0x89, 0x9C,
0x0A, 0xBC, 0x7D, 0x09, 0x0F, 0x0D, 0x8F, 0x72, 0x75, 0xF7, 0x1A, 0xC7, 0x84, 0x87, 0xD0, 0x65,
0xE9, 0xE5, 0xF1, 0x20, 0xA1, 0x5F, 0x31, 0x97, 0xC5, 0x60, 0x89, 0x12, 0x3D, 0x78, 0xFB, 0x42,
0x8F, 0xB2, 0x20, 0x50, 0x96, 0x03, 0x65, 0x77, 0x80, 0x32, 0x53, 0xA5, 0x47, 0x51, 0x56, 0x3D,
0x1B, 0x65, 0xE6, 0x09, 0x94, 0x7D, 0x23, 0x28, 0xB3, 0xBF, 0xE4, 0xA9, 0x37, 0xDC, 0x5B, 0xE3,
0xDE, 0x20, 0xCA, 0x96, 0xE4, 0xD9, 0x9E, 0x19, 0x30, 0x1C, 0xFF, 0xA2, 0x50, 0xD5, 0x05, 0xE8,
0x1F, 0x72, 0x38, 0x9C, 0x28, 0x5C, 0x2F, 0xC0, 0xB7, 0xAE, 0x00, 0xDF, 0x5A, 0xBD, 0xFB, 0xC5,
0xBA, 0xE7, 0xDB, 0xC1, 0xF3, 0x6D, 0x0A, 0x81, 0x50, 0x23, 0xF3, 0xD5, 0x3B, 0x3C, 0x84, 0xA3,
0x6E, 0xDF, 0x69, 0x5E, 0xA0, 0x52, 0xBF, 0xA2, 0xEF, 0x8C, 0x93, 0x24, 0x31, 0xF3, 0x53, 0x37,
0x7B, 0xFB, 0xA7, 0x0A, 0x15, 0x96, 0x14, 0x65, 0xCA, 0x73, 0x58, 0x2C, 0x5C, 0xEE, 0x1F, 0xA6,
0x8B, 0x42, 0xC8, 0xEF, 0xBB, 0xAE, 0xCB, 0x3C, 0x0A, 0x48, 0x14, 0xEE, 0x55, 0xEC, 0x83, 0x7D,
0x46, 0x83, 0xB9, 0x88, 0x6D, 0xBF, 0xDB, 0x8B, 0x2B, 0x92, 0x97, 0x79, 0xC1, 0xA3, 0xD7, 0x1C,
0xDE, 0x0C, 0x58, 0x8A, 0xAE, 0x78, 0xBE, 0x0E, 0xC3, 0xBD, 0x3B, 0xF0, 0x70, 0xA6, 0x54, 0xEE,
0xFD, 0x5E, 0x7C, 0x72, 0xDD, 0xE8, 0x2E, 0xEA, 0x61, 0x04, 0xE0, 0x00, 0xC0, 0xBD, 0x88, 0x46,
0x9E, 0xC6, 0xC1, 0x47, 0x8A, 0xE9, 0xBD, 0x54, 0xC5, 0xAF, 0xEC, 0x73, 0x7E, 0xA2, 0xB1, 0x80,
0xFA, 0x6B, 0x90, 0x9D, 0xCA, 0x15, 0x63, 0xE5, 0x06, 0xD0, 0x57, 0xEF, 0x5E, 0xAE, 0x6E, 0x7B,
0x1A, 0xC0, 0x3C, 0x53, 0x7D, 0xC4, 0xF3, 0xE9, 0x0B, 0x59, 0x01, 0xC4, 0x00, 0xC8, 0x01, 0xE9,
0xC1, 0x43, 0x17, 0x90, 0x84, 0x96, 0x81, 0x88, 0xCE, 0x3D, 0xD2, 0x7F, 0xAC, 0xC7, 0x7A, 0x06,
0x4D, 0xE0, 0x02, 0x57, 0xDC, 0xFA, 0x91, 0xB9, 0x42, 0x32, 0x42, 0x81, 0x1C, 0x1C, 0x3B, 0x8A,
0xE4, 0xE5, 0xAA, 0x81, 0x80, 0xE4, 0xB5, 0x9B, 0x93, 0x7B, 0x15, 0x15, 0x1A, 0x73, 0xAE, 0xD1,
0x1E, 0x65, 0x74, 0x97, 0x92, 0xC5, 0xBC, 0x31, 0x35, 0x68, 0xB4, 0x3F, 0xF8, 0x18, 0x4F, 0xE5,
0x40, 0x77, 0x48, 0x3F, 0x0B, 0xC1, 0x70, 0xC9, 0x50, 0x03, 0x88, 0xA3, 0x3B, 0xCF, 0x63, 0x50,
0x7A, 0xFC, 0xA7, 0x7D, 0x66, 0x59, 0x50, 0x3C, 0x52, 0x2B, 0xEF, 0x2E, 0xB4, 0xF2, 0xF0, 0x6C,
0xAD, 0xDC, 0x7A, 0x41, 0x4C, 0x0E, 0x6B, 0xE5, 0x80, 0x5A, 0x39, 0xDF, 0x81, 0x5B, 0x3B, 0x38,
0x6A, 0x65, 0x04, 0x0A, 0xB5, 0x85, 0x56, 0xD6, 0xCD, 0x4A, 0xF1, 0x7C, 0xD9, 0x5A, 0x64, 0xC2,
0x9F, 0xD2, 0x07, 0x3F, 0x92, 0x0A, 0x7D, 0x5A, 0x1F, 0x3C, 0xBF, 0xB2, 0x36, 0x26, 0x6E, 0xCC,
0xA7, 0xD1, 0x7D, 0xC8, 0xAC, 0x71, 0x4D, 0x4F, 0xDA, 0x89, 0xAD, 0x98, 0x04, 0xDA, 0xE7, 0xFF,
0x33, 0xC5, 0x0B, 0xA2, 0xDD, 0x4D, 0xA0, 0x5F, 0xB2, 0x2F, 0xFE, 0xAC, 0x03, 0x0F, 0xBE, 0x9A,
0xCF, 0xB6, 0x95, 0x9A, 0x97, 0xA7, 0x36, 0x02, 0xB9, 0xD7, 0x6D, 0xF3, 0xA1, 0x4F, 0x3C, 0x1F,
0x88, 0xF8, 0xC3, 0x91, 0x9F, 0x00, 0xF3, 0xF9, 0xE5, 0x73, 0x3D, 0xED, 0xF4, 0x71, 0xEE, 0xF9,
0x18, 0xC8, 0xFA, 0x53, 0x39, 0x0F, 0x91, 0x7C, 0x0D, 0x5D, 0xAE, 0x44, 0x8E, 0x0A, 0x87, 0x73,
0x0F, 0xD7, 0xE8, 0x7F, 0x55, 0x62, 0xDE, 0xBC, 0x43, 0xF9, 0x8C, 0x07, 0xC9, 0x55, 0x41, 0x20,
0x1E, 0x9D, 0x09, 0x30, 0x25, 0xBF, 0x3D, 0xF1, 0xC7, 0x2A, 0xF2, 0xFD, 0x00, 0x3F, 0x0F, 0x78,
0xF0, 0x7D, 0x2A, 0x09, 0x2B, 0x0E, 0x1B, 0x4B, 0xEF, 0x5B, 0x51, 0xC1, 0x40, 0xB9, 0x81, 0xFF,
0x01, 0xB6, 0x98, 0xAD, 0xD6, 0x9C, 0x4A, 0x95, 0x64, 0x43, 0xD4, 0xCB, 0x77, 0x08, 0xC2, 0x8D,
0xFC, 0xB2, 0xA2, 0x11, 0xE7, 0x19, 0xC0, 0xCD, 0xDF, 0x8A, 0xF0, 0x48, 0x51, 0xC9, 0xA7, 0x1B,
0xF3, 0x49, 0xB3, 0x1C, 0x4E, 0x10, 0xC2, 0xFC, 0x0D, 0xDA, 0xE8, 0xF7, 0x5B, 0x1F, 0x1D, 0xA8,
0x84, 0xE1, 0x8E, 0x1C, 0x5A, 0x49, 0x14, 0x10, 0x4E, 0xCB, 0x34, 0x84, 0xE4, 0xE5, 0xFC, 0xD1,
0x47, 0x85, 0xC8, 0xEA, 0xDD, 0x41, 0x69, 0x7E, 0x03, 0x80, 0x25, 0x19, 0x85, 0x33, 0x8B, 0xC7,
0x00, 0x5C, 0x37, 0xD1, 0x7D, 0x7E, 0xFA, 0x82, 0xF0, 0x20, 0x85, 0x27, 0x85, 0x30, 0xAB, 0x65,
0xDC, 0x92, 0xAB, 0xAB, 0xBA, 0xCE, 0x00, 0x8B, 0xAE, 0xB7, 0xB1, 0x6A, 0x76, 0x01, 0x5E, 0x38,
0xCF, 0x46, 0xB2, 0x22, 0x67, 0x6A, 0xEC, 0x7A, 0x17, 0xF6, 0x30, 0x25, 0x76, 0x55, 0xA5, 0x50,
0x84, 0xC9, 0x3D, 0x38, 0x56, 0x44, 0xEA, 0x16, 0x64, 0xA4, 0x94, 0x6C, 0x17, 0x49, 0x99, 0xF7,
0x02, 0x13, 0x2D, 0x6C, 0x2E, 0xE9, 0xC0, 0x03, 0xE8, 0x00, 0x44, 0xCC, 0xA8, 0x44, 0xB7, 0xD8,
0x68, 0xC6, 0x10, 0x8A, 0x67, 0x9A, 0xC4, 0x4E, 0xFE, 0x0E, 0xBF, 0xDD, 0xA0, 0xBC, 0x0A, 0x4B,
0xC8, 0xC7, 0x42, 0x92, 0xA0, 0x60, 0x1E, 0x03, 0x1B, 0x65, 0x16, 0xFF, 0x6B, 0x26, 0x36, 0x18,
0xBA, 0x99, 0x40, 0x58, 0xAD, 0xE2, 0x46, 0xF3, 0x12, 0xD8, 0x4B, 0xE9, 0x09, 0x24, 0x1D, 0xC3,
0x86, 0x51, 0xCD, 0x99, 0x6A, 0x8F, 0xEF, 0x81, 0x67, 0xA2, 0x9D, 0x30, 0x00, 0x64, 0x0C, 0x21,
0x47, 0xEB, 0x8F, 0x72, 0x3C, 0xBE, 0x0B, 0x1F, 0xB0, 0x8C, 0x84, 0x60, 0x9B, 0x9E, 0xAE, 0x11,
0x7C, 0xBF, 0x4E, 0x67, 0x89, 0x1A, 0x46, 0xDF, 0x68, 0x17, 0x5F, 0x04, 0xEC, 0x4A, 0x46, 0xA1,
0x58, 0xA4, 0x4D, 0xA6, 0xC5, 0xE7, 0x06, 0xDE, 0x81, 0x1D, 0x16, 0xD2, 0x23, 0x9E, 0x06, 0xF5,
0xD2, 0x7F, 0xB1, 0x6F, 0x65, 0xE7, 0x0F, 0xB7, 0x7C, 0x72, 0x05, 0x6E, 0x09, 0xAF, 0x63, 0x6B,
0xBF, 0x1C, 0x7D, 0x77, 0x71, 0x06, 0x4A, 0x01, 0x97, 0x5B, 0x5A, 0xBA, 0x62, 0xF5, 0xD2, 0x3B,
0x93, 0xB8, 0xB5, 0xF7, 0xF3, 0x72, 0x5A, 0xE6, 0xFD, 0x11, 0x45, 0x8C, 0xBC, 0x94, 0xFA, 0x6B,
0x09, 0x06, 0x61, 0x03, 0xA8, 0x79, 0x98, 0xD6, 0x9D, 0xC3, 0x67, 0x25, 0x1F, 0x97, 0x1C, 0x7A,
0x90, 0x00, 0x34, 0xA2, 0xBD, 0x28, 0xE4, 0xB0, 0xCC, 0x48, 0x7C, 0xFD, 0x54, 0xB7, 0x83, 0x07,
0x5A, 0x0E, 0x86, 0xF7, 0x9D, 0x7C, 0x1A, 0xB1, 0xAE, 0xFE, 0x6A, 0xF5, 0xBB, 0xFC, 0xD4, 0x87,
0x42, 0x7E, 0x46, 0xD2, 0xA9, 0xFF, 0xFA, 0x06, 0x11, 0x04, 0x50, 0x4E, 0xAC, 0x6E, 0x1F, 0x79,
0xC0, 0x5A, 0x3C, 0x79, 0x05, 0x34, 0xC0, 0x68, 0xE8, 0x6A, 0x3C, 0xF8, 0x6F, 0x2B, 0x9E, 0x35,
0x86, 0x47, 0x73, 0x98, 0xBA, 0x24, 0x15, 0xFE, 0x93, 0x98, 0xFF, 0x50, 0xD2, 0x7E, 0x8D, 0x42,
0xF8, 0xB6, 0xBF, 0x7E, 0xB1, 0x30, 0xCE, 0xFE, 0x84, 0xEF, 0x05, 0xD7, 0x7F, 0x04, 0xD5, 0x5A,
0x4F, 0x8C, 0xDE, 0xC6, 0x75, 0x7F, 0xFC, 0xA8, 0x5D, 0xA6, 0x61, 0x01, 0xEA, 0xB0, 0x42, 0x12,
0x09, 0x05, 0x7D, 0xE8, 0xA1, 0x15, 0x50, 0xF1, 0xD2, 0xA3, 0xB4, 0xA4, 0xAD, 0x83, 0x8F, 0x51,
0x0A, 0xAD, 0x0A, 0x44, 0x07, 0xF7, 0xE0, 0x43, 0xAB, 0x00, 0xDD, 0xAB, 0x0F, 0xD2, 0x92, 0x49,
0x81, 0xFA, 0x28, 0x05, 0x88, 0x9D, 0x43, 0x2E, 0x39, 0x28, 0x80, 0xF5, 0x05, 0xC5, 0x5E, 0x95,
0x5A, 0xBB, 0xA4, 0xE3, 0x43, 0x0E, 0x3A, 0x2C, 0xDD, 0xD4, 0xF0, 0xC1, 0x07, 0x51, 0x91, 0x54,
0xC1, 0xF6, 0x61, 0x09, 0x99, 0xCA, 0x72, 0x25, 0x92, 0xD3, 0xDF, 0xEF, 0xCD, 0xF7, 0xED, 0x7E,
0xBB, 0x92, 0x5B, 0xAF, 0x13, 0x2F, 0xAC, 0x4F, 0x22, 0x39, 0x3B, 0xE4, 0xCC, 0xBC, 0x79, 0xF3,
0xDE, 0xEF, 0xFD, 0x99, 0x99, 0x73, 0xBB, 0xF8, 0xA3, 0x3E, 0x2E, 0x7E, 0x29, 0x22, 0x73, 0x52,
0x07, 0x52, 0x87, 0x2F, 0x37, 0xFC, 0xFF, 0x4A, 0x1B, 0xFD, 0x84, 0xFF, 0xE3, 0xF7, 0x3B, 0xFB,
0x5F, 0xF8, 0x73, 0xEA, 0xC9, 0xD5, 0x88, 0x9C, 0x30, 0xF7, 0xC5, 0x98, 0xCE, 0x33, 0x9B, 0x6D,
0xD0, 0xCA, 0xD1, 0xA8, 0x14, 0x89, 0x33, 0x5C, 0x89, 0x48, 0x8A, 0x4F, 0xF3, 0x7D, 0x57, 0x3A,
0xB9, 0xF8, 0x3E, 0x2E, 0x44, 0xC2, 0x4A, 0x24, 0xE8, 0x9D, 0xCB, 0x2E, 0xFA, 0x90, 0xDC, 0xB4,
0x32, 0x3F, 0x24, 0xBB, 0xFD, 0xE3, 0x92, 0x73, 0x32, 0xF9, 0xE5, 0x78, 0xE3, 0x1B, 0x53, 0x4B,
0xF4, 0x24, 0xAF, 0x24, 0xCD, 0x9C, 0x42, 0x7B, 0x94, 0x7E, 0xE7, 0xD6, 0x7D, 0xC1, 0xED, 0xC2,
0xB0, 0x74, 0x1E, 0x9D, 0xEB, 0x08, 0xB8, 0x7D, 0xE1, 0x77, 0x7A, 0x1B, 0xF1, 0xE6, 0x62, 0x66,
0x12, 0x96, 0x1C, 0xD5, 0xA0, 0x89, 0xD9, 0xB9, 0x1D, 0x01, 0x55, 0x6E, 0xF9, 0xC3, 0xA4, 0x4D,
0x53, 0x93, 0xFF, 0x18, 0x35, 0xB5, 0xDF, 0xA0, 0x45, 0x27, 0x7E, 0x19, 0x24, 0xB2, 0x38, 0xAA,
0x65, 0x54, 0x47, 0x68, 0x8A, 0x82, 0x53, 0x87, 0x22, 0x91, 0xB4, 0xE2, 0x55, 0x7E, 0xE5, 0x74,
0x62, 0x1E, 0xE4, 0x65, 0x8C, 0x16, 0xAF, 0xDE, 0xCD, 0xEF, 0x76, 0x7F, 0x23, 0xE2, 0xE9, 0xAC,
0x62, 0x5C, 0xD1, 0xF7, 0xC1, 0x85, 0xF0, 0x3D, 0x0C, 0x1C, 0x54, 0x51, 0x26, 0x5E, 0xED, 0xD6,
0xE2, 0xB6, 0xB2, 0x2E, 0x68, 0x15, 0x14, 0x98, 0xDB, 0xA8, 0x25, 0xD3, 0x62, 0x72, 0xCD, 0xAF,
0x42, 0xB0, 0xAD, 0x0F, 0x40, 0x5B, 0xF8, 0x3B, 0xF0, 0xC7, 0xDD, 0x22, 0xA9, 0x69, 0x2B, 0x72,
0x7C, 0xD5, 0x8C, 0xC9, 0x20, 0x53, 0x38, 0xE3, 0xFC, 0x53, 0x2C, 0x25, 0xBF, 0xB1, 0x33, 0x21,
0x7B, 0x46, 0x24, 0x76, 0xC2, 0x80, 0x9D, 0x4A, 0xBB, 0x10, 0xBB, 0x5F, 0xFE, 0xED, 0xE2, 0x9E,
0xDF, 0x94, 0xF5, 0x0B, 0xFB, 0xAB, 0x7F, 0x78, 0x43, 0x42, 0x63, 0x38, 0xFF, 0xA0, 0x92, 0x37,
0x40, 0x9B, 0x33, 0xE9, 0xD5, 0x07, 0x21, 0x81, 0x49, 0x70, 0x55, 0x62, 0xF2, 0x26, 0x28, 0xC3,
0x76, 0x51, 0xFC, 0xC7, 0x8D, 0xF8, 0x0F, 0x4B, 0x09, 0xEE, 0x14, 0xB2, 0x18, 0x17, 0x4E, 0x93,
0x56, 0x41, 0x11, 0x0F, 0x3D, 0xFA, 0x28, 0x41, 0x17, 0x06, 0xCF, 0x0B, 0x2B, 0x36, 0xEB, 0xA0,
0xF3, 0x09, 0x5A, 0xDF, 0xF9, 0xE4, 0x82, 0x01, 0xAF, 0xEA, 0xD0, 0x6C, 0x2B, 0x01, 0x47, 0xE4,
0x68, 0x2C, 0x5D, 0xEA, 0x74, 0xB8, 0xA3, 0x3C, 0xA5, 0x4B, 0xE6, 0xCD, 0x40, 0xFA, 0x41, 0x0B,
0x27, 0x13, 0x55, 0x2A, 0x4F, 0x13, 0xD9, 0x23, 0x67, 0xC1, 0xC8, 0x48, 0xE6, 0x6F, 0xA0, 0x1C,
0x82, 0xA4, 0xD6, 0xC5, 0x22, 0x05, 0x18, 0xF7, 0xB2, 0x57, 0x04, 0x95, 0x23, 0xC1, 0x2B, 0x95,
0xA7, 0x62, 0xD6, 0xB8, 0x94, 0xB4, 0xD3, 0xA7, 0x55, 0x00, 0x82, 0xC0, 0x36, 0xFD, 0x7D, 0x11,
0x80, 0x22, 0x69, 0x6A, 0x17, 0x7D, 0xCA, 0x99, 0xE9, 0xCB, 0x44, 0x5F, 0xFE, 0xB6, 0xF2, 0x4B,
0xB6, 0xBC, 0xAC, 0x5C, 0x6C, 0x83, 0x24, 0x7A, 0xF0, 0x1F, 0x72, 0xD9, 0xA9, 0xC1, 0xE5, 0x64,
0x11, 0xED, 0xFD, 0x21, 0x89, 0x44, 0x7B, 0x8D, 0x12, 0x49, 0x13, 0x25, 0xCA, 0xDD, 0x16, 0x27,
0x47, 0x31, 0x1A, 0x56, 0x07, 0x15, 0x68, 0x88, 0x3B, 0x7F, 0xC7, 0x12, 0x3B, 0x99, 0x68, 0x80,
0x16, 0xCC, 0xCB, 0x15, 0xF4, 0x27, 0x6E, 0xB5, 0x6C, 0xAE, 0x3E, 0x59, 0x5F, 0x93, 0xA7, 0x95,
0xBB, 0x99, 0x85, 0xAB, 0x6F, 0x0F, 0xF1, 0xF0, 0xC6, 0xF1, 0x24, 0x81, 0x7A, 0x1E, 0xC1, 0x4B,
0xBF, 0x74, 0x1B, 0xBF, 0x76, 0x5B, 0xAF, 0x1E, 0x75, 0x2E, 0x04, 0xD0, 0x6D, 0x1D, 0x5C, 0xD2,
0x43, 0x14, 0xD3, 0x64, 0x10, 0xBF, 0xC6, 0xB2, 0xE4, 0x4E, 0x0F, 0x79, 0x82, 0xB4, 0x0C, 0xA8,
0x0D, 0xCA, 0xA8, 0xC0, 0x27, 0x8D, 0xFC, 0xB5, 0xBC, 0x74, 0x72, 0x3C, 0x1E, 0x5F, 0xA7, 0x34,
0xDF, 0xE3, 0x8D, 0x73, 0x5C, 0xE1, 0xF0, 0x24, 0x46, 0xA7, 0xAA, 0xD3, 0x5E, 0xDC, 0x53, 0x25,
0x72, 0x69, 0xFC, 0x0B, 0x33, 0xE4, 0xE6, 0x2E, 0x34, 0xE9, 0x20, 0xCC, 0x77, 0xC6, 0xD7, 0x95,
0xF9, 0xB9, 0xA9, 0xC8, 0xFC, 0xC8, 0x28, 0xF3, 0xFD, 0x32, 0x2C, 0xC0, 0xFC, 0x11, 0xF8, 0x0E,
0xE6, 0xCB, 0x9A, 0xDC, 0x22, 0xF3, 0x23, 0xB0, 0x16, 0xCC, 0xF7, 0xCB, 0x38, 0x03, 0xF3, 0xC1,
0xC9, 0x02, 0xCC, 0x47, 0xCB, 0x8C, 0xCC, 0x8F, 0x7E, 0x5E, 0x93, 0xF9, 0x7E, 0xB9, 0x46, 0xE6,
0x8F, 0x9A, 0xA0, 0x20, 0xF3, 0xD7, 0xA0, 0x19, 0x64, 0x3E, 0x5A, 0x82, 0xF9, 0x7E, 0xE9, 0xD5,
0x60, 0x3E, 0x60, 0x69, 0xED, 0x60, 0xCC, 0xA7, 0x5A, 0x1A, 0xBD, 0x91, 0x37, 0x37, 0x88, 0x02,
0x26, 0x0B, 0x4D, 0x13, 0xBF, 0xDC, 0xDD, 0x92, 0xC5, 0x56, 0xA2, 0x56, 0x42, 0xDC, 0x51, 0x5E,
0x44, 0xD7, 0xA6, 0xF5, 0x20, 0xB3, 0x0B, 0xF8, 0x8A, 0xBC, 0x18, 0x71, 0x1C, 0xBF, 0xE0, 0x60,
0xEC, 0xEF, 0xD6, 0xFE, 0xAA, 0x93, 0xE3, 0x61, 0x0F, 0xB7, 0x9F, 0xFF, 0xD5, 0x4C, 0xD5, 0x7C,
0x66, 0xD9, 0xBB, 0x6F, 0x99, 0x1C, 0x73, 0x0D, 0x14, 0x45, 0x3F, 0xED, 0xBE, 0x45, 0x09, 0xC1,
0xF2, 0x5C, 0x61, 0x1B, 0xA7, 0xE5, 0x44, 0x01, 0x12, 0x31, 0xD1, 0x8B, 0xC5, 0x0C, 0xB3, 0xE9,
0xF1, 0xFF, 0xD8, 0xD2, 0xF9, 0x91, 0xB9, 0xE6, 0x9B, 0xDE, 0x6D, 0xC2, 0xE2, 0x28, 0xA1, 0x1A,
0x6D, 0xC2, 0x44, 0xC0, 0x79, 0x93, 0xB9, 0x50, 0x4F, 0x72, 0x86, 0x4C, 0xC2, 0xC0, 0xF1, 0x11,
0x09, 0xDF, 0xFC, 0x64, 0xF9, 0x3D, 0x63, 0xCA, 0xF9, 0x31, 0x18, 0x32, 0x96, 0x3C, 0x89, 0xB3,
0x38, 0x8B, 0xB2, 0x30, 0x73, 0x2C, 0x35, 0x84, 0x88, 0x0E, 0xEB, 0x1C, 0x6C, 0x1C, 0xB0, 0xE0,
0x74, 0xE0, 0x77, 0xB8, 0x51, 0x89, 0xDB, 0x19, 0x8C, 0xB9, 0xD1, 0x4A, 0xD0, 0x99, 0xED, 0x8B,
0x9B, 0x1B, 0x40, 0xA2, 0xAE, 0x4F, 0x7B, 0x7F, 0xA3, 0x3C, 0x6F, 0xB1, 0x48, 0x51, 0xE8, 0xFF,
0x28, 0xC8, 0xDC, 0xA5, 0xF1, 0x75, 0x0F, 0xBC, 0xA8, 0x72, 0x33, 0xAC, 0xBE, 0x89, 0xE7, 0x29,
0xAC, 0x59, 0xF6, 0x1B, 0x63, 0x86, 0xD1, 0x67, 0xC6, 0xB4, 0x7E, 0xCE, 0x2A, 0xF2, 0xEA, 0x5D,
0x56, 0x6D, 0xEE, 0xA9, 0xFA, 0x4F, 0x56, 0x3D, 0x64, 0xD5, 0x55, 0x56, 0x41, 0x68, 0xB3, 0x9B,
0x21, 0xAA, 0x2A, 0x1F, 0x55, 0x99, 0x8C, 0xAA, 0x53, 0x58, 0x8C, 0xEC, 0xA6, 0xC8, 0xA9, 0x11,
0x58, 0x73, 0xF3, 0x2B, 0x54, 0xFD, 0x95, 0x53, 0xCE, 0xB9, 0x5D, 0xFA, 0x7B, 0xD8, 0xD1, 0x73,
0x6E, 0x09, 0x84, 0x69, 0xE6, 0x7B, 0x62, 0xB6, 0xAC, 0xA4, 0x5D, 0x5A, 0xC9, 0x49, 0xC7, 0xF8,
0x26, 0x5E, 0x3D, 0x13, 0x1D, 0x8D, 0xE4, 0x79, 0xFF, 0x8E, 0x59, 0xA9, 0x0B, 0x20, 0x75, 0x72,
0xEB, 0xB2, 0x9C, 0xB9, 0x49, 0xA9, 0xA3, 0xE0, 0xDD, 0x54, 0xC1, 0x3B, 0x23, 0x57, 0xA2, 0xB7,
0x5B, 0x1F, 0xEB, 0xF6, 0x2F, 0x40, 0x80, 0x23, 0x58, 0x67, 0x88, 0x38, 0xF4, 0x1F, 0xB2, 0x9D,
0x03, 0x79, 0xA1, 0xEF, 0xA9, 0xA8, 0xE2, 0x97, 0x62, 0xA0, 0xF8, 0x51, 0x11, 0x27, 0x61, 0x11,
0x67, 0x61, 0x19, 0x17, 0xD4, 0x7D, 0x02, 0x81, 0x5F, 0x87, 0x50, 0x10, 0x7C, 0xF0, 0x92, 0xFC,
0x93, 0xD5, 0xF9, 0x56, 0xFC, 0x4E, 0x65, 0x10, 0x96, 0x01, 0x15, 0xE1, 0xC7, 0x05, 0x25, 0xE2,
0x74, 0xA4, 0x8A, 0x43, 0xBC, 0x6B, 0x65, 0x22, 0x5E, 0xBC, 0xAE, 0xA8, 0xB9, 0x52, 0xBD, 0xEA,
0x54, 0x66, 0x51, 0xA4, 0x12, 0x05, 0x05, 0xFE, 0x95, 0x78, 0x75, 0x05, 0x62, 0x23, 0x9D, 0x5B,
0x7B, 0x3D, 0x5E, 0x45, 0xB2, 0xD8, 0x48, 0xF0, 0x5E, 0x3B, 0x02, 0xF0, 0xCF, 0x05, 0x45, 0x08,
0xD1, 0xC3, 0x07, 0xCD, 0x1A, 0x11, 0xC5, 0xFF, 0x49, 0x43, 0xA9, 0xBF, 0x0C, 0x0C, 0x75, 0x00,
0xCA, 0x18, 0x2C, 0x28, 0x22, 0x2C, 0x0B, 0x90, 0x80, 0x6B, 0xE5, 0x56, 0xCE, 0xD2, 0xC5, 0xFB,
0x3A, 0x44, 0x94, 0x50, 0x72, 0x51, 0x4F, 0x1A, 0x46, 0x8D, 0x25, 0x0C, 0x0F, 0xA3, 0xB2, 0xEB,
0xE3, 0xE1, 0x61, 0xE4, 0x0D, 0x76, 0x20, 0xA7, 0x60, 0x81, 0xD9, 0x06, 0x8F, 0x15, 0xFB, 0x50,
0xC4, 0x4E, 0xD8, 0x0C, 0x0F, 0x8B, 0x6D, 0x89, 0x6A, 0x5C, 0x90, 0x84, 0xC9, 0x31, 0x3E, 0x62,
0x0F, 0xA3, 0x06, 0xC9, 0x5A, 0x0C, 0x38, 0x08, 0x92, 0xF6, 0x14, 0x9A, 0x04, 0x67, 0x6B, 0x52,
0x1A, 0xBC, 0x5A, 0xF2, 0x31, 0xC7, 0x81, 0x6F, 0x59, 0x1D, 0x6D, 0x55, 0x87, 0xC8, 0x00, 0x72,
0xAD, 0x54, 0xFF, 0x27, 0xB2, 0x4A, 0xB4, 0xA6, 0x6C, 0xE4, 0x48, 0x61, 0xA6, 0xB4, 0x42, 0x1F,
0xE3, 0xB7, 0xCE, 0x93, 0x67, 0x29, 0x30, 0xAF, 0xB5, 0x0F, 0xFB, 0x73, 0x4C, 0x43, 0xD3, 0xE1,
0x2A, 0xF6, 0xB6, 0xF2, 0x1B, 0xCF, 0x2A, 0x21, 0xBF, 0x25, 0xDD, 0x60, 0x54, 0x6C, 0x91, 0x81,
0x73, 0xF5, 0x2B, 0xAA, 0xB4, 0x0B, 0xC0, 0x21, 0xE1, 0xE8, 0xC3, 0x2B, 0xD5, 0x35, 0xD1, 0x65,
0x90, 0x4E, 0xE7, 0x86, 0xEF, 0xDB, 0x11, 0x0D, 0x6F, 0xD1, 0xC9, 0x30, 0x87, 0x26, 0x57, 0xC4,
0xFC, 0x78, 0x58, 0xAD, 0x63, 0x79, 0xB7, 0x4A, 0x0D, 0x56, 0xE2, 0x72, 0x2B, 0x97, 0x92, 0x20,
0x3B, 0xB3, 0xA8, 0xAB, 0x75, 0x8A, 0x00, 0xEF, 0x95, 0x21, 0x19, 0xE2, 0xD6, 0x98, 0x35, 0x81,
0x27, 0xC8, 0xF0, 0xD2, 0x01, 0xB2, 0xA9, 0x83, 0xE4, 0x60, 0x19, 0x48, 0xD0, 0xB1, 0x0B, 0x7D,
0xA2, 0xA6, 0x60, 0xD1, 0x72, 0x00, 0x2D, 0xB9, 0x8E, 0x6C, 0x09, 0xFC, 0x73, 0xD4, 0xAD, 0xC0,
0x9F, 0xB8, 0x1C, 0xA2, 0xEA, 0xEB, 0xB2, 0xFB, 0x3B, 0x3F, 0xC1, 0xB4, 0xCE, 0x5E, 0xA4, 0xCF,
0x07, 0xCD, 0x74, 0x10, 0xB9, 0x78, 0x44, 0x07, 0xFC, 0x49, 0x67, 0x46, 0x7D, 0x41, 0x99, 0xB9,
0x32, 0xFD, 0xEC, 0x72, 0x60, 0x56, 0x7B, 0x97, 0xC6, 0x25, 0x35, 0xD7, 0xB4, 0xCB, 0xD1, 0x3B,
0xCA, 0x3E, 0xC5, 0x6F, 0xC5, 0x75, 0x7C, 0xC7, 0xD5, 0x24, 0x93, 0xC4, 0x8A, 0x07, 0x7E, 0x47,
0x65, 0xDF, 0xCF, 0xBE, 0x0D, 0x94, 0x61, 0xA1, 0xE5, 0x97, 0x7A, 0x7B, 0x8B, 0x7A, 0x5F, 0x53,
0xE3, 0xD7, 0x71, 0x60, 0xB8, 0x17, 0x9C, 0x5C, 0x43, 0xA2, 0xC0, 0x98, 0x82, 0x4D, 0xD9, 0x38,
0x28, 0x3D, 0x25, 0x95, 0x0E, 0x4E, 0x94, 0x71, 0x26, 0xB1, 0x3A, 0x3C, 0xF9, 0xD2, 0x12, 0xA6,
0x41, 0x74, 0x16, 0x47, 0xEF, 0xA3, 0x61, 0x3C, 0xCE, 0x33, 0x7E, 0x16, 0x16, 0x6C, 0x12, 0x94,
0xD0, 0x4B, 0x4C, 0x9B, 0x1D, 0x7A, 0x35, 0x69, 0x75, 0x5B, 0x0E, 0x31, 0xEA, 0x52, 0x75, 0xC0,
0x74, 0x26, 0xBC, 0x1D, 0xD7, 0x09, 0xC6, 0x3A, 0x19, 0xA3, 0x93, 0x54, 0xDA, 0xEC, 0x22, 0x07,
0x5A, 0x3D, 0x27, 0x2F, 0xDE, 0xBC, 0xBE, 0xFD, 0x4B, 0x5D, 0x23, 0xA5, 0x2D, 0x25, 0x55, 0x4E,
0x9F, 0xEB, 0xB4, 0x42, 0x45, 0x14, 0x76, 0x35, 0x37, 0xE3, 0xE1, 0xBF, 0x30, 0xF3, 0x7A, 0x1D,
0x6E, 0x94, 0x78, 0x26, 0x79, 0x83, 0xCE, 0xEE, 0x1F, 0x39, 0x8A, 0x4F, 0x04, 0x3D, 0xAD, 0x7E,
0xEC, 0x82, 0xBC, 0x80, 0x2B, 0x95, 0x38, 0x32, 0x1D, 0xD1, 0xD3, 0xBB, 0x2D, 0xDB, 0x7A, 0x79,
0x11, 0x67, 0x34, 0x7F, 0x6D, 0x97, 0xAA, 0x6D, 0xA5, 0x07, 0x71, 0xED, 0xEE, 0x3D, 0x54, 0x27,
0x50, 0x21, 0x39, 0x6A, 0xBF, 0xC1, 0xC8, 0x00, 0x47, 0xC5, 0x0C, 0x53, 0x17, 0x95, 0x6A, 0x34,
0x79, 0x0E, 0x1A, 0x9D, 0x62, 0x30, 0x8B, 0x0E, 0x6E, 0x6B, 0x9F, 0x76, 0xF1, 0x18, 0x48, 0xDA,
0x27, 0xBC, 0x3D, 0x7D, 0x46, 0x99, 0x7D, 0xC6, 0x13, 0x34, 0xC9, 0x25, 0x78, 0xB0, 0xA4, 0x7E,
0x57, 0x40, 0xC4, 0x67, 0x84, 0xC0, 0x27, 0x08, 0xD4, 0x7A, 0xFF, 0xF1, 0xD2, 0x6B, 0x6A, 0x27,
0x19, 0x4E, 0xB2, 0xF9, 0xE4, 0x19, 0x7F, 0x3A, 0xA6, 0x88, 0xD3, 0xC3, 0xD7, 0x7E, 0x06, 0xFB,
0xE4, 0x94, 0x55, 0x68, 0x5A, 0xFB, 0xD4, 0x19, 0x52, 0xC5, 0x2B, 0xDB, 0x85, 0xAA, 0x3B, 0x5D,
0xEC, 0xCC, 0x3E, 0x27, 0x42, 0x74, 0x82, 0xD1, 0x1D, 0x3C, 0xB4, 0x86, 0x9C, 0x82, 0xCD, 0x29,
0xE5, 0x5F, 0x45, 0xE3, 0x91, 0x3C, 0x9B, 0x98, 0x01, 0x8B, 0xEF, 0xEC, 0x46, 0xBC, 0x66, 0x07,
0x16, 0xF3, 0x1D, 0xE4, 0xA7, 0x45, 0xB1, 0x11, 0xFB, 0x4C, 0xA5, 0x7E, 0xA9, 0xCC, 0xB3, 0x88,
0xEA, 0x37, 0x3B, 0xB0, 0xAA, 0x8B, 0x0C, 0x2F, 0x0B, 0xB0, 0x13, 0x99, 0xB1, 0x49, 0x18, 0x14,
0x97, 0x0C, 0x9A, 0x31, 0x82, 0xF7, 0xDF, 0x1C, 0xA0, 0xDA, 0x69, 0x7B, 0x42, 0x85, 0x5B, 0xE3,
0x20, 0x8D, 0x88, 0xB8, 0xDE, 0x23, 0xAA, 0xB9, 0xE4, 0x0C, 0xFD, 0x6E, 0x4C, 0xFA, 0xE4, 0x10,
0x74, 0x4F, 0x27, 0x7E, 0xD1, 0xAC, 0xFE, 0x63, 0xAD, 0x7A, 0x5C, 0x83, 0x5E, 0x33, 0xC9, 0x8F,
0xE7, 0x5E, 0x4B, 0x4B, 0xE7, 0xF1, 0x5D, 0xA7, 0x17, 0xCB, 0xFF, 0xDF, 0xF7, 0xB6, 0xFF, 0x61,
0x7A, 0x59, 0xB0, 0xA5, 0x75, 0x4D, 0x33, 0x9D, 0x00, 0x85, 0xD1, 0x03, 0xC9, 0x33, 0x0A, 0x7C,
0xA8, 0xF4, 0xCC, 0x33, 0x03, 0x01, 0x7E, 0xC4, 0xA0, 0x65, 0x88, 0xA1, 0x1B, 0x41, 0xE9, 0x97,
0xA3, 0x66, 0x6E, 0xC6, 0x40, 0x1F, 0x2A, 0x3D, 0xE7, 0x1C, 0x38, 0x82, 0x88, 0x9B, 0x5B, 0x1F,
0xD1, 0x23, 0x9C, 0xA8, 0x7D, 0xC8, 0x76, 0x98, 0xB4, 0x5C, 0x4A, 0x28, 0x39, 0x83, 0x86, 0x36,
0x36, 0x1D, 0x75, 0x6E, 0xE2, 0x18, 0x9A, 0xDB, 0xC6, 0xCC, 0x9B, 0xFB, 0x10, 0x73, 0xA8, 0x10,
0xB4, 0x26, 0x95, 0x03, 0x16, 0x4F, 0x6C, 0xC3, 0x83, 0x8B, 0xA8, 0xD1, 0xEF, 0x40, 0x18, 0x34,
0x03, 0x20, 0xEB, 0xF4, 0x19, 0x8F, 0xC8, 0x9F, 0x7D, 0x88, 0x4B, 0x58, 0xDC, 0x9A, 0xEB, 0x1B,
0x5F, 0x2D, 0xA3, 0xAC, 0x8F, 0x12, 0xFF, 0xC3, 0x9D, 0xC5, 0xC5, 0x27, 0x0C, 0xE0, 0x4F, 0xC0,
0x73, 0x4B, 0xD5, 0xCB, 0x43, 0x07, 0x54, 0xDE, 0xAF, 0xF8, 0xC7, 0xF2, 0x7D, 0x10, 0x5E, 0xE4,
0xA6, 0x5E, 0x90, 0x7F, 0x68, 0xFC, 0x3B, 0x55, 0xBC, 0x9A, 0xAC, 0x1D, 0x95, 0x64, 0x77, 0xF1,
0x1E, 0x19, 0xF3, 0x5E, 0xBE, 0x7D, 0xF0, 0xC9, 0x4C, 0x8B, 0xF3, 0xC3, 0xCB, 0xCA, 0x19, 0xF8,
0xB2, 0xE6, 0xBA, 0x28, 0x74, 0x37, 0x16, 0x74, 0x4B, 0x68, 0xB7, 0xB3, 0xDC, 0x6B, 0x76, 0x0B,
0x8A, 0x8F, 0x25, 0xF3, 0x3A, 0x9B, 0xE5, 0xC8, 0xA8, 0xF6, 0x7E, 0xCD, 0x17, 0x60, 0x74, 0xAF,
0x90, 0xC5, 0x17, 0x1A, 0x84, 0x01, 0x95, 0x7E, 0x3D, 0x8C, 0x33, 0x49, 0x99, 0xC6, 0x42, 0xFC,
0x4B, 0x74, 0x65, 0x00, 0xC6, 0x17, 0x9A, 0x7E, 0xCB, 0x67, 0x5A, 0x84, 0x25, 0x5B, 0x04, 0xDA,
0x95, 0xD7, 0xEE, 0x8E, 0xE1, 0xF7, 0x84, 0x16, 0x0E, 0x6E, 0x34, 0xC9, 0x82, 0x3B, 0x4D, 0x8C,
0x19, 0x68, 0xDB, 0x9C, 0x6B, 0x0C, 0xE3, 0x4C, 0x15, 0xB0, 0xE6, 0x21, 0xE2, 0xEB, 0x0F, 0xE8,
0xBA, 0xBF, 0xE1, 0xC0, 0xBB, 0xDE, 0x6F, 0xB4, 0x09, 0x09, 0xEE, 0x43, 0x8E, 0x97, 0xA6, 0x80,
0x29, 0x6F, 0x8B, 0x28, 0x9B, 0xA6, 0x1C, 0x67, 0x6B, 0x13, 0x15, 0xE9, 0x0A, 0xBE, 0xF0, 0xB6,
0xFE, 0x40, 0x66, 0xAF, 0xC0, 0xA8, 0x7B, 0x5B, 0x15, 0x2A, 0xD2, 0x15, 0x20, 0x2B, 0x8A, 0xA8,
0x48, 0x53, 0xF8, 0xDB, 0xDE, 0x56, 0xED, 0x76, 0x2C, 0x06, 0x15, 0x8A, 0xA8, 0x40, 0xD1, 0xED,
0x58, 0x0C, 0xAA, 0x18, 0x8B, 0x94, 0x9F, 0x45, 0xD1, 0xED, 0x58, 0x0C, 0xEF, 0xA1, 0x28, 0x39,
0x3E, 0x00, 0xE9, 0x2C, 0x86, 0x46, 0xB3, 0xC1, 0x2C, 0xBA, 0x5A, 0x0C, 0x6B, 0xA6, 0x19, 0x14,
0xB3, 0xD5, 0x90, 0x59, 0x10, 0xB7, 0xA0, 0x3F, 0xC9, 0x4F, 0xDA, 0xBC, 0x88, 0x38, 0xC9, 0x7E,
0xE7, 0x63, 0xD9, 0xDC, 0x57, 0x49, 0xD6, 0xEC, 0x21, 0x75, 0x9B, 0x88, 0x9E, 0xD6, 0x0E, 0x94,
0x6A, 0x34, 0x4C, 0x40, 0x99, 0xE1, 0x01, 0x4C, 0x2A, 0xF1, 0x3F, 0x57, 0xFB, 0x11, 0x7E, 0xC4,
0x4E, 0xDD, 0x27, 0x3A, 0x8E, 0xB1, 0xD6, 0x62, 0x53, 0xCD, 0xC3, 0x53, 0x35, 0x22, 0x83, 0xB5,
0x22, 0x33, 0x2F, 0x02, 0x52, 0x8B, 0x4E, 0x6C, 0x82, 0xD9, 0x76, 0xA5, 0xB6, 0x24, 0xCE, 0x8C,
0xD2, 0xCD, 0x39, 0x44, 0xD5, 0x08, 0x0C, 0x07, 0x57, 0x69, 0x4F, 0x6A, 0xA5, 0xAA, 0x52, 0xF1,
0xE7, 0x44, 0x9C, 0x49, 0xB2, 0xCC, 0xFA, 0xC1, 0x5E, 0x6B, 0x2D, 0xF5, 0xEE, 0x74, 0xAD, 0x39,
0x13, 0x9B, 0x89, 0x7A, 0xD6, 0x6F, 0x7C, 0xD1, 0xE6, 0x39, 0xBA, 0xAE, 0x13, 0x54, 0x4B, 0x6B,
0x2D, 0xE5, 0xA8, 0xCB, 0x75, 0x9A, 0xB4, 0x9D, 0x4E, 0xAB, 0xE1, 0xED, 0xD1, 0x67, 0x17, 0xF4,
0x45, 0x9B, 0xE7, 0x79, 0xF9, 0x0B, 0xB6, 0xAD, 0x7C, 0xA2, 0x80, 0xF9, 0x05, 0x3A, 0x5A, 0x64,
0x62, 0x46, 0x02, 0x26, 0x41, 0xE5, 0x39, 0x1E, 0xB3, 0x93, 0x33, 0x82, 0x65, 0xEA, 0x4A, 0xB7,
0x30, 0xA0, 0xC4, 0xFE, 0x80, 0xAE, 0x0B, 0x8F, 0x79, 0x84, 0xD6, 0x25, 0xA5, 0x4C, 0xDA, 0xD0,
0xD3, 0x31, 0xCA, 0x35, 0x55, 0x83, 0xF4, 0x35, 0x6A, 0x46, 0xF0, 0x99, 0x52, 0xFD, 0xEC, 0x74,
0x9E, 0x33, 0xCF, 0xF8, 0x8E, 0xCE, 0xF3, 0x9E, 0x72, 0xA6, 0xB1, 0x5D, 0xA9, 0x7A, 0x0D, 0x3A,
0x46, 0x9E, 0xA4, 0x05, 0x9D, 0x2B, 0xC0, 0x0A, 0x06, 0x97, 0x7C, 0xF8, 0x35, 0xEE, 0x9E, 0xCD,
0x01, 0x87, 0xEA, 0x65, 0xCA, 0xDC, 0x39, 0x1B, 0x42, 0x73, 0x89, 0x56, 0x9C, 0x56, 0x5D, 0x2A,
0x76, 0xED, 0x55, 0x61, 0xB6, 0xF3, 0xE2, 0x45, 0x9F, 0x20, 0x6D, 0x21, 0xD6, 0xCE, 0xFD, 0x5D,
0x03, 0x69, 0xC8, 0x13, 0xB7, 0xF3, 0x1B, 0x34, 0xCF, 0xCF, 0x02, 0xA1, 0xB7, 0x3A, 0x1B, 0xA9,
0x32, 0x2F, 0xE6, 0x32, 0x4F, 0x01, 0x33, 0xE0, 0x76, 0x7B, 0xBF, 0x69, 0xF0, 0x6E, 0xFD, 0x2F,
0x11, 0x61, 0xEC, 0xCE, 0xFF, 0x25, 0x15, 0xE2, 0xD8, 0x3A, 0xFB, 0x19, 0x85, 0xD8, 0x14, 0x14,
0xE2, 0xBC, 0xA2, 0x10, 0x83, 0x1C, 0x43, 0xEE, 0x50, 0x88, 0xDD, 0x2D, 0x0A, 0xB1, 0xDB, 0x50,
0x88, 0x47, 0x1D, 0x85, 0xD8, 0xE9, 0x54, 0x88, 0x7B, 0x15, 0xE2, 0x75, 0x9D, 0x7B, 0xAA, 0x73,
0x8F, 0x13, 0xCE, 0x1D, 0x9C, 0xC2, 0xDC, 0x61, 0xA4, 0xF0, 0x02, 0x3E, 0x35, 0x84, 0x18, 0x26,
0x01, 0x42, 0x4C, 0x95, 0xEA, 0x63, 0x6E, 0x01, 0xE5, 0x1E, 0xF7, 0x80, 0x20, 0xC4, 0xAD, 0x0A,
0x71, 0x37, 0x23, 0xC4, 0x46, 0x85, 0x38, 0x57, 0x21, 0x8E, 0x55, 0x88, 0xDD, 0xC4, 0xD9, 0xCD,
0xE0, 0x5B, 0x60, 0x1A, 0xF5, 0x3B, 0xAE, 0xB3, 0x05, 0x27, 0xE6, 0x9D, 0x6C, 0x2E, 0x7A, 0x2F,
0x28, 0x51, 0x04, 0x3C, 0x2E, 0x8A, 0xA3, 0x6B, 0x92, 0x72, 0x49, 0x42, 0x2E, 0xD5, 0x9F, 0xB1,
0x92, 0xB6, 0x21, 0xE2, 0x2A, 0x07, 0xF7, 0xE8, 0xC0, 0x36, 0x39, 0x58, 0xD6, 0x05, 0xAD, 0x78,
0xE0, 0xCF, 0x93, 0x55, 0x0D, 0x57, 0x7A, 0x6A, 0x5D, 0xBB, 0xBB, 0x71, 0x32, 0x9E, 0x9A, 0x38,
0xEB, 0xEE, 0xEB, 0x44, 0xC2, 0x62, 0x9A, 0x38, 0xD9, 0x8B, 0x36, 0xDF, 0xCC, 0x29, 0x9C, 0xD4,
0x4D, 0x08, 0xDD, 0xB0, 0xA0, 0x4C, 0x87, 0xB7, 0x35, 0xA8, 0x5C, 0x27, 0xB9, 0x70, 0xE1, 0x9D,
0xBD, 0xCB, 0xF0, 0x8D, 0x9C, 0x82, 0x43, 0xA5, 0xF2, 0x18, 0xCE, 0x3A, 0x9D, 0xA7, 0xC9, 0xE4,
0x76, 0x52, 0xB9, 0xEF, 0xB7, 0xF2, 0x35, 0x50, 0xBB, 0xAF, 0xB2, 0x57, 0x28, 0xD0, 0x5D, 0xE6,
0xAB, 0xDC, 0x58, 0xFD, 0x2F, 0xCD, 0x35, 0xC6, 0x15, 0xA2, 0x3F, 0xD7, 0x7C, 0x9A, 0x37, 0x74,
0xEB, 0x1A, 0xAA, 0x2A, 0xCD, 0xC8, 0xD2, 0xAE, 0x08, 0x71, 0xFB, 0x6A, 0xA2, 0x01, 0xEB, 0x53,
0x46, 0x4F, 0xB6, 0xBF, 0x16, 0x9E, 0x49, 0x7E, 0x38, 0xAD, 0x6E, 0x2C, 0xFD, 0x5B, 0x37, 0xF5,
0xF7, 0x7A, 0x46, 0xA0, 0x11, 0x33, 0x01, 0xF8, 0x1F, 0xE9, 0xDE, 0xF4, 0xC0, 0x2D, 0x64, 0x6E,
0xD3, 0x51, 0x3B, 0x75, 0x93, 0x54, 0x03, 0xE2, 0xBB, 0x4A, 0x34, 0x11, 0xD0, 0x55, 0x23, 0x19,
0xAA, 0xFE, 0x69, 0x7C, 0x6D, 0x1D, 0x1F, 0xDD, 0x93, 0x3D, 0x68, 0x31, 0x15, 0x1B, 0x77, 0xEF,
0x2B, 0x10, 0x8B, 0x11, 0x73, 0x30, 0xB1, 0x6B, 0x6A, 0xB8, 0xBC, 0xE6, 0x4D, 0xFA, 0x68, 0x8C,
0xDF, 0x1F, 0xE2, 0x1B, 0x86, 0x3A, 0xFE, 0xD6, 0xA4, 0xC0, 0x1A, 0xA7, 0xE7, 0xE6, 0x1D, 0x50,
0x25, 0x6C, 0xD2, 0x71, 0x3E, 0x28, 0xA2, 0xA7, 0x66, 0x48, 0x9E, 0xD3, 0xF3, 0xB4, 0x20, 0x72,
0x1C, 0xB1, 0xB0, 0x4F, 0x70, 0xA1, 0x09, 0x0F, 0xB6, 0x9D, 0x9C, 0x40, 0x97, 0xBE, 0x82, 0x69,
0x0F, 0x98, 0xB0, 0x26, 0x36, 0x82, 0x92, 0xEE, 0x2B, 0xD3, 0x0B, 0x60, 0x16, 0x30, 0x31, 0x4E,
0xF0, 0xA6, 0x07, 0x9F, 0xDD, 0x86, 0x95, 0xCC, 0x86, 0xC4, 0x49, 0xC8, 0xAA, 0x98, 0x5E, 0x70,
0xDC, 0x80, 0xA5, 0x91, 0x36, 0xA4, 0xB9, 0xF6, 0x09, 0x70, 0xC1, 0x26, 0xF7, 0xBC, 0x0D, 0x6D,
0x6E, 0xAF, 0x49, 0xF4, 0x05, 0x56, 0xAD, 0x2C, 0x99, 0x18, 0xAE, 0x7B, 0xD3, 0x73, 0xE7, 0xD5,
0x0A, 0xE3, 0xC9, 0x6C, 0x12, 0xF3, 0x9B, 0x69, 0xEE, 0xA0, 0x9B, 0x82, 0xC1, 0x34, 0xD5, 0xB8,
0xC4, 0x9E, 0x7A, 0x0A, 0x42, 0xE5, 0x3F, 0x38, 0xD1, 0x49, 0xA6, 0x8E, 0x27, 0xB3, 0x09, 0xEA,
0x92, 0xC5, 0x8A, 0x20, 0xF3, 0x39, 0x37, 0xA0, 0x4D, 0x17, 0x3D, 0x39, 0x9F, 0x72, 0x77, 0x73,
0xA3, 0x12, 0xEF, 0xF3, 0xC6, 0xCA, 0x57, 0x0E, 0xD2, 0xE2, 0x0D, 0x38, 0xC1, 0x8F, 0xCC, 0xD2,
0xD0, 0xC1, 0x23, 0x8F, 0x46, 0xA6, 0xF7, 0x0B, 0xE7, 0xDC, 0x34, 0x4F, 0xAD, 0xA0, 0x3A, 0x4C,
0xAE, 0x95, 0x49, 0x22, 0x61, 0x27, 0x87, 0xFB, 0xB5, 0x8E, 0x6F, 0x53, 0x13, 0xDC, 0x2D, 0xD0,
0x0F, 0x33, 0x59, 0x1F, 0xD1, 0xF5, 0x8A, 0x32, 0x68, 0x63, 0x72, 0x08, 0xE3, 0x7F, 0x0F, 0x96,
0x31, 0x6A, 0xDD, 0x22, 0x32, 0xFF, 0x53, 0x07, 0xFF, 0x6E, 0x1A, 0xB7, 0x08, 0xDB, 0x5D, 0xBF,
0x81, 0xE6, 0x27, 0xB5, 0x29, 0x9F, 0x2C, 0xFA, 0xD9, 0x72, 0x3D, 0xB2, 0x2C, 0x8A, 0x26, 0x69,
0x23, 0x5D, 0xAB, 0x54, 0x8E, 0xC3, 0x80, 0x42, 0x6C, 0xEB, 0xFC, 0x93, 0x1F, 0x74, 0x79, 0xA6,
0xDA, 0x12, 0x6E, 0x94, 0xC2, 0x60, 0x63, 0xC4, 0x9D, 0x45, 0x13, 0x17, 0x8E, 0xB9, 0xDD, 0xFF,
0xE3, 0xD3, 0x1A, 0xB2, 0x7D, 0xCB, 0x37, 0x4D, 0x24, 0x73, 0x89, 0x2A, 0xEA, 0x39, 0xE8, 0xED,
0x0A, 0xA6, 0x12, 0x15, 0x4E, 0x0B, 0xF0, 0x9C, 0x3D, 0x2D, 0xF0, 0x35, 0x8F, 0x2D, 0x5C, 0x76,
0x82, 0x4A, 0x73, 0xC5, 0xEE, 0x0D, 0xFE, 0x9D, 0x03, 0x8E, 0x65, 0x90, 0x44, 0xC2, 0x14, 0x73,
0x21, 0x3B, 0xB4, 0xC0, 0x0B, 0x01, 0xFE, 0x94, 0x2E, 0x9D, 0xDD, 0xF5, 0x1F, 0xE4, 0xC5, 0xB7,
0x2C, 0xEE, 0xE4, 0x13, 0xCB, 0xE5, 0xDA, 0x85, 0xF8, 0x91, 0x31, 0x74, 0x28, 0x7E, 0x6B, 0x7E,
0xF5, 0xEA, 0xA3, 0xC1, 0x6E, 0xA4, 0xA6, 0xE0, 0x7B, 0x08, 0x60, 0xF6, 0x3F, 0x6F, 0x74, 0x43,
0xD5, 0x33, 0xD1, 0xE3, 0xD7, 0x36, 0xDF, 0x37, 0xE6, 0x0F, 0x75, 0x64, 0xCA, 0x5B, 0xBA, 0x8B,
0xC8, 0x59, 0x2E, 0x51, 0x23, 0x7B, 0x07, 0xDD, 0x13, 0x01, 0x52, 0x48, 0x42, 0xFC, 0xD3, 0x74,
0xF3, 0xFE, 0x72, 0x05, 0x73, 0x08, 0x04, 0x54, 0x6F, 0x7A, 0xB0, 0x51, 0x08, 0x8C, 0xA6, 0x8E,
0xD9, 0xD9, 0xAD, 0x56, 0xFC, 0x09, 0x0D, 0xA5, 0xCB, 0x60, 0x7A, 0x75, 0x64, 0x40, 0xA7, 0x79,
0x70, 0x76, 0x18, 0x8F, 0x6F, 0x40, 0x08, 0x14, 0xB5, 0x5A, 0xFD, 0x98, 0xD0, 0x13, 0x5B, 0xCE,
0x79, 0xBD, 0xFD, 0x93, 0x70, 0x86, 0xB7, 0x51, 0x5E, 0xC8, 0x42, 0xF4, 0x78, 0xF9, 0xAE, 0xF9,
0x55, 0x9E, 0x59, 0xEC, 0x69, 0x21, 0x1E, 0xA0, 0x68, 0xD0, 0x7D, 0x21, 0x12, 0xE8, 0x2C, 0x29,
0x07, 0x22, 0x63, 0x5E, 0x31, 0x6F, 0xDD, 0x22, 0xF4, 0x1A, 0x9B, 0xB9, 0xE3, 0x62, 0x0C, 0x93,
0x54, 0x62, 0x69, 0xF1, 0x6D, 0xF2, 0x27, 0xC5, 0x93, 0x01, 0x34, 0x07, 0x85, 0x9F, 0x97, 0xE4,
0x9F, 0xAC, 0x26, 0x39, 0xBA, 0x5D, 0x06, 0xCF, 0x79, 0x1A, 0xE3, 0x8C, 0xDD, 0x1B, 0xA2, 0xC7,
0xC5, 0x9D, 0x27, 0x47, 0x93, 0xAD, 0x12, 0x73, 0xC5, 0xAE, 0x59, 0x88, 0x57, 0x54, 0x88, 0x26,
0x89, 0x4B, 0x0B, 0xA0, 0xBA, 0x1D, 0xB8, 0x30, 0x23, 0x1F, 0x1E, 0x7A, 0x1C, 0xD1, 0x40, 0xE4,
0x1F, 0xA4, 0x25, 0x86, 0xCB, 0x39, 0xDD, 0x16, 0x40, 0x17, 0xDD, 0x66, 0x3A, 0x82, 0x46, 0x79,
0x63, 0x7A, 0x1C, 0x68, 0xE3, 0xC9, 0x78, 0xFC, 0xCE, 0x30, 0x45, 0x99, 0x7C, 0x9A, 0x7B, 0x24,
0x81, 0xA4, 0x62, 0xC1, 0x33, 0x6F, 0xE7, 0x49, 0xC8, 0xCE, 0x22, 0xA6, 0x3A, 0xD5, 0xB9, 0xA6,
0xCB, 0xA5, 0x5B, 0x58, 0x7B, 0x34, 0x6E, 0x71, 0xD6, 0x53, 0x39, 0x04, 0x32, 0x34, 0x54, 0x23,
0x46, 0xD0, 0xE1, 0xF0, 0x1F, 0x75, 0x36, 0x46, 0x5B, 0x11, 0xDD, 0xEF, 0x5F, 0x38, 0x34, 0x32,
0x18, 0x4F, 0x50, 0x5D, 0x47, 0x74, 0x1A, 0x58, 0xD8, 0x17, 0x61, 0x1C, 0xD3, 0x08, 0xAB, 0x64,
0xFE, 0x39, 0xF1, 0xFB, 0xEF, 0xF4, 0x88, 0x21, 0xFC, 0x1A, 0x8C, 0x8B, 0xDF, 0xAC, 0x6D, 0x6C,
0x19, 0xDE, 0x86, 0x7F, 0x64, 0x47, 0x57, 0x32, 0xC6, 0xE3, 0x31, 0x6D, 0xBE, 0xAE, 0xAF, 0x26,
0x87, 0x55, 0xD2, 0x3B, 0x9B, 0x70, 0x70, 0x92, 0x74, 0xFB, 0x47, 0x0D, 0x55, 0x8A, 0x89, 0xDF,
0x6B, 0xAA, 0x25, 0x27, 0x33, 0x84, 0xE5, 0x39, 0xBF, 0x5D, 0xA7, 0x10, 0x59, 0x05, 0x85, 0x75,
0x2A, 0x21, 0x1D, 0xFD, 0x97, 0x2A, 0x40, 0xB2, 0xD2, 0x2C, 0x2E, 0x22, 0xEE, 0x82, 0x17, 0x93,
0x35, 0x3C, 0x40, 0xF3, 0xD8, 0x5A, 0x2C, 0xBF, 0xD7, 0x90, 0x39, 0x8D, 0x8A, 0xB0, 0xC8, 0xDD,
0xCA, 0xE9, 0x16, 0x76, 0xE5, 0x81, 0x82, 0xCA, 0x23, 0x2C, 0x7F, 0xDA, 0xE3, 0x8B, 0xCE, 0x50,
0x71, 0x0A, 0x5F, 0xF9, 0xBF, 0x3A, 0x78, 0x3C, 0xBF, 0xE3, 0x9A, 0xB0, 0xC1, 0x0C, 0x54, 0xFF,
0x4A, 0x8A, 0x55, 0x26, 0xDE, 0x00, 0xF4, 0x8C, 0xE8, 0x0B, 0xFC, 0xFD, 0xEE, 0x49, 0x3D, 0x48,
0xBB, 0x33, 0x3E, 0x4B, 0x08, 0x7E, 0x58, 0x71, 0x6F, 0xA3, 0xC0, 0xC2, 0x9A, 0xEF, 0x13, 0x42,
0x20, 0x54, 0x1E, 0x03, 0xA1, 0x60, 0x93, 0xC7, 0x88, 0x78, 0x56, 0x67, 0x9D, 0xFB, 0xCB, 0x4F,
0x69, 0xFA, 0x3F, 0x66, 0xD5, 0x6B, 0x74, 0x2E, 0xB1, 0xF8, 0x41, 0x85, 0x97, 0xB9, 0xE4, 0x0F,
0x96, 0x1B, 0x86, 0x36, 0x89, 0x02, 0x80, 0xA8, 0xE9, 0x79, 0x5D, 0xBE, 0x4B, 0xD3, 0x53, 0x7A,
0x66, 0xFB, 0x96, 0xB4, 0x91, 0x49, 0x34, 0x24, 0xDF, 0x95, 0x28, 0xC8, 0x5C, 0x17, 0x9A, 0x26,
0xB8, 0x0D, 0xE8, 0x19, 0xFA, 0x0B, 0x26, 0xE8, 0xC5, 0x6B, 0x79, 0x28, 0x67, 0x83, 0xD2, 0x6C,
0x78, 0x62, 0x05, 0x5D, 0x11, 0x68, 0x0F, 0x7C, 0xCE, 0x05, 0xC6, 0xE3, 0x52, 0x32, 0xDD, 0x67,
0x18, 0x9E, 0x73, 0x26, 0x71, 0xEA, 0x7B, 0x00, 0xF9, 0x08, 0x7D, 0x19, 0x85, 0xBA, 0x1C, 0x99,
0xB7, 0xF2, 0x12, 0xE8, 0x17, 0x17, 0x68, 0x47, 0xA9, 0x96, 0x9C, 0xF8, 0xC4, 0xFD, 0x1F, 0x44,
0x8A, 0x13, 0xA7, 0x47, 0x99, 0x31, 0xB0, 0xEA, 0x09, 0xAB, 0x3E, 0xC2, 0x57, 0x31, 0xB0, 0x11,
0xA1, 0x6F, 0xC1, 0xD4, 0x1B, 0xFC, 0x2E, 0x49, 0x1F, 0x2C, 0xD7, 0xF4, 0xF3, 0x12, 0xF4, 0x3A,
0x65, 0x86, 0xDD, 0x2F, 0x67, 0x78, 0x3C, 0x09, 0xBD, 0x27, 0x8E, 0xAD, 0x9E, 0x20, 0xD8, 0xF1,
0xCC, 0x0F, 0x8D, 0x1C, 0x87, 0xD4, 0xA8, 0x15, 0x64, 0xD8, 0xA0, 0x31, 0xFC, 0x3A, 0x44, 0x93,
0x9B, 0x02, 0x44, 0x9C, 0xE4, 0x90, 0xC9, 0xA1, 0x97, 0xE2, 0x9A, 0xEC, 0x34, 0xAA, 0xE0, 0xF7,
0x36, 0xA9, 0x49, 0xBC, 0x0C, 0x22, 0x3C, 0x13, 0xB1, 0x2C, 0x29, 0xF8, 0x54, 0x74, 0x6D, 0x1B,
0x95, 0x36, 0x20, 0x05, 0xE2, 0x88, 0xC2, 0x7A, 0xF0, 0x04, 0x40, 0x89, 0x19, 0x76, 0x2A, 0x39,
0x4F, 0x9B, 0x1D, 0x72, 0xB8, 0xFF, 0x02, 0x3E, 0xBB, 0x8F, 0x29, 0xCC, 0xEF, 0x33, 0x6D, 0xEC,
0xF3, 0x3C, 0x27, 0x5D, 0xDC, 0x22, 0xDC, 0xBE, 0xD8, 0x71, 0x4F, 0x8F, 0x9B, 0x4E, 0xED, 0xE4,
0x94, 0x04, 0x7D, 0x16, 0x6E, 0x4D, 0x58, 0x6A, 0xA3, 0x64, 0xED, 0x99, 0x3C, 0xCB, 0x61, 0x51,
0x22, 0x37, 0xA7, 0x69, 0x4A, 0x8D, 0x85, 0x34, 0x49, 0x33, 0x7B, 0xA6, 0xE3, 0xDB, 0x3C, 0x1D,
0xC7, 0xA4, 0x78, 0x6B, 0x6C, 0x5E, 0x6C, 0xCF, 0x4F, 0x33, 0x06, 0xDA, 0x50, 0x83, 0xF1, 0x7E,
0x56, 0xE8, 0xA1, 0x79, 0x3E, 0x8C, 0xC9, 0xB0, 0x42, 0x8D, 0xAD, 0xFD, 0xE1, 0x02, 0xC2, 0x8A,
0x6C, 0x64, 0x80, 0xCC, 0xE1, 0xC0, 0x23, 0x8A, 0xC0, 0x72, 0xFF, 0xDE, 0xE7, 0x08, 0x55, 0x82,
0x3B, 0x95, 0x5B, 0x63, 0x49, 0xE3, 0x64, 0xE8, 0x47, 0xAD, 0xFB, 0xB4, 0x0D, 0x8B, 0xE0, 0xB3,
0x0A, 0xEE, 0xCB, 0x32, 0x90, 0xBE, 0x8F, 0x89, 0xD4, 0x80, 0xC9, 0x38, 0x33, 0x89, 0xDB, 0x59,
0xF1, 0x60, 0x28, 0xDA, 0xE7, 0x26, 0x73, 0xCA, 0xB9, 0x29, 0xD3, 0x18, 0x01, 0xA8, 0x03, 0xAE,
0x1B, 0xD4, 0xF1, 0x94, 0x1A, 0xDD, 0xA2, 0x9B, 0x39, 0x47, 0xA1, 0x61, 0x13, 0x90, 0x91, 0x5E,
0xED, 0xC1, 0x0B, 0x74, 0xC1, 0xE8, 0x0B, 0x4A, 0xF8, 0x08, 0x28, 0x02, 0x28, 0xB9, 0xF8, 0xB4,
0x46, 0xA8, 0x14, 0x63, 0x86, 0x67, 0x6B, 0x75, 0xC4, 0xAC, 0x02, 0x72, 0x15, 0xA8, 0x7B, 0xEA,
0xE1, 0xAD, 0x4C, 0x77, 0x13, 0xCF, 0x1D, 0x1E, 0x19, 0x1A, 0x0F, 0x30, 0xBB, 0x10, 0xC0, 0xE0,
0x8F, 0x08, 0x6E, 0x2B, 0x08, 0x08, 0xC2, 0xCC, 0x27, 0x32, 0xCE, 0x1D, 0x1A, 0x19, 0x0B, 0x90,
0x6A, 0x4D, 0x23, 0xE6, 0xDC, 0x56, 0x60, 0xE1, 0xC8, 0xFE, 0xB3, 0x3A, 0x5F, 0x79, 0x74, 0x2D,
0x30, 0x26, 0x09, 0x3E, 0x87, 0x7D, 0x31, 0xC0, 0xBC, 0xB4, 0x36, 0x1F, 0xE6, 0x39, 0x3C, 0xCF,
0x7B, 0xB5, 0xCF, 0x23, 0x75, 0x33, 0x88, 0xA8, 0x5E, 0x60, 0xB0, 0x23, 0xE0, 0x3B, 0x87, 0x5F,
0xF7, 0x1E, 0x44, 0xC9, 0x27, 0x9B, 0xF1, 0x08, 0x5F, 0x33, 0xBB, 0x45, 0xAF, 0x71, 0x7E, 0x50,
0x82, 0x6D, 0xBA, 0x87, 0x1F, 0x73, 0x3B, 0x3F, 0x4E, 0x30, 0x99, 0x9C, 0x08, 0x3F, 0x10, 0x5C,
0x99, 0x3D, 0xD4, 0x53, 0x00, 0x67, 0xE9, 0xC9, 0x12, 0xB0, 0x82, 0xDB, 0xDC, 0xE7, 0x67, 0x2A,
0xC5, 0x63, 0x86, 0x82, 0x39, 0x45, 0xEB, 0xA1, 0xEE, 0xDA, 0x08, 0x75, 0x00, 0x55, 0x3A, 0x34,
0x08, 0x51, 0xCA, 0x08, 0x73, 0xEF, 0xF2, 0x5B, 0x3D, 0xA2, 0x90, 0xB2, 0xEA, 0x9F, 0xBF, 0xC4,
0x11, 0xC9, 0x1E, 0x2E, 0x4D, 0xF0, 0x01, 0xAC, 0x30, 0x14, 0xA2, 0x0B, 0xCC, 0x87, 0xE0, 0x02,
0x58, 0x71, 0xB5, 0xC5, 0x54, 0x68, 0xDC, 0xEE, 0xD4, 0x16, 0x29, 0x35, 0x5B, 0xAD, 0xDB, 0x3F,
0xB4, 0xD5, 0xE9, 0xC0, 0x42, 0xC5, 0xAD, 0x78, 0x22, 0x07, 0xBE, 0xE9, 0xD5, 0x24, 0xC2, 0xD7,
0x6A, 0xCD, 0x70, 0xD1, 0x04, 0x1F, 0xC3, 0x4C, 0xF7, 0xA1, 0xA9, 0x02, 0x6A, 0xD8, 0x97, 0x3A,
0xA9, 0x49, 0x48, 0xB3, 0xF9, 0x63, 0x2E, 0xB6, 0x2D, 0x1D, 0x79, 0xF6, 0x64, 0xD6, 0x37, 0x8E,
0xC7, 0xFF, 0x0B, 0xD5, 0x5C, 0x3D, 0x90, 0xDC, 0xC6, 0x95, 0x6E, 0x00, 0xDA, 0x45, 0x99, 0x08,
0xC0, 0x80, 0x3C, 0xD7, 0x51, 0x55, 0x86, 0x83, 0x0B, 0x64, 0x95, 0x6C, 0xA4, 0x0A, 0x64, 0x02,
0x32, 0xAB, 0x4E, 0x81, 0x03, 0xF2, 0xAE, 0x38, 0x52, 0xC0, 0x80, 0x0A, 0x2E, 0xB0, 0xE5, 0xAA,
0xDB, 0xC4, 0x81, 0x03, 0x99, 0x0D, 0x99, 0x81, 0x03, 0x07, 0xDC, 0xE0, 0x78, 0xE9, 0x31, 0x50,
0xB0, 0x5C, 0x05, 0xBA, 0xE0, 0x02, 0x57, 0x1D, 0x45, 0x40, 0x62, 0xA0, 0x80, 0x01, 0x47, 0x56,
0xB1, 0x14, 0x5C, 0x20, 0xD8, 0x22, 0x8B, 0x25, 0x29, 0x58, 0x48, 0x84, 0xBC, 0x58, 0x12, 0x40,
0xDF, 0xFB, 0xBE, 0x06, 0x66, 0x67, 0x96, 0x14, 0xFF, 0x97, 0x5A, 0x2D, 0x39, 0x18, 0x0C, 0x06,
0xE8, 0x7E, 0xFD, 0xFA, 0xF5, 0x7B, 0xDF, 0xFB, 0xE9, 0x51, 0x4B, 0x93, 0x49, 0xAA, 0x54, 0x60,
0xCC, 0x74, 0x3C, 0x3A, 0xBC, 0xB2, 0xF0, 0x17, 0x94, 0x38, 0x86, 0x15, 0x8E, 0x51, 0x8D, 0x63,
0xD2, 0xE2, 0x78, 0x98, 0xC7, 0xF7, 0x4E, 0xE1, 0xD8, 0x26, 0x72, 0x70, 0xDA, 0x44, 0x9E, 0xF5,
0xEA, 0xA8, 0x90, 0x63, 0x15, 0x16, 0x78, 0x14, 0x0F, 0x87, 0x53, 0x5F, 0x1E, 0x8E, 0x0A, 0x4F,
0x1E, 0x8E, 0x33, 0xB7, 0x91, 0x06, 0xE4, 0x5E, 0xA5, 0xF2, 0xC9, 0xA4, 0x53, 0xCA, 0xC8, 0x9F,
0x72, 0x78, 0x74, 0xFB, 0xF5, 0xF5, 0x3C, 0xC3, 0x6D, 0x51, 0x81, 0x47, 0xC2, 0x69, 0x28, 0x8F,
0x07, 0x15, 0x1A, 0xF4, 0xAB, 0x18, 0xCD, 0x36, 0xE8, 0xC2, 0x6D, 0x35, 0x3A, 0xED, 0x7A, 0x1C,
0x7B, 0x35, 0x99, 0x1C, 0x57, 0x89, 0x3C, 0x1E, 0x1A, 0x53, 0x08, 0xFD, 0xC7, 0x2C, 0xD9, 0x07,
0x53, 0xE5, 0x1B, 0x93, 0xCA, 0xC5, 0xC6, 0xDD, 0xFA, 0x67, 0xA3, 0x7E, 0xAC, 0xD0, 0x98, 0x0B,
0xA2, 0xF1, 0x74, 0xC8, 0x36, 0x9D, 0x77, 0x4D, 0x2B, 0x77, 0x99, 0xA0, 0x3F, 0x1B, 0x5D, 0x6E,
0x94, 0x7F, 0xB3, 0x11, 0xCA, 0x84, 0x28, 0x2D, 0xB7, 0xC4, 0x57, 0xA6, 0x2A, 0xBC, 0xD9, 0xAA,
0xA8, 0xCD, 0xAF, 0xEA, 0x5C, 0xDA, 0xF9, 0x53, 0x91, 0x9B, 0x5F, 0x54, 0xEA, 0x38, 0x78, 0xA2,
0x1C, 0x50, 0x96, 0x79, 0x72, 0xF4, 0xAF, 0xAF, 0x48, 0x5B, 0xAE, 0xF4, 0x25, 0x5F, 0xE4, 0x1D,
0xFA, 0x76, 0x94, 0xFA, 0xBE, 0x31, 0xB1, 0x54, 0x2F, 0xA8, 0x97, 0x54, 0xA8, 0x82, 0xEB, 0x2B,
0x99, 0x34, 0x57, 0x88, 0x3C, 0x64, 0x4A, 0x3D, 0x33, 0x90, 0xEF, 0xC8, 0xA0, 0xB5, 0xA9, 0xD1,
0x4F, 0x16, 0xFF, 0xC7, 0x4A, 0xE5, 0xE2, 0x11, 0x21, 0x84, 0x6D, 0x82, 0x74, 0x72, 0xF5, 0x90,
0x3C, 0xA7, 0x8D, 0xA9, 0xF2, 0xCF, 0xFF, 0xA5, 0xCD, 0x33, 0xA5, 0x93, 0x4C, 0x45, 0xC2, 0x44,
0x7F, 0xB3, 0x92, 0xDE, 0x40, 0x65, 0x52, 0x38, 0xE6, 0x72, 0xF7, 0xDA, 0xED, 0x4A, 0x26, 0xE5,
0x42, 0x60, 0xEA, 0x58, 0x2D, 0xA5, 0xDF, 0x0B, 0xEE, 0xE0, 0x8F, 0x74, 0x79, 0xA4, 0x34, 0x28,
0x48, 0x6F, 0xC6, 0x23, 0x47, 0x10, 0xDA, 0x2B, 0x86, 0xF7, 0x98, 0x71, 0xD6, 0x27, 0x8A, 0x32,
0xE8, 0x19, 0xD3, 0x2B, 0xB0, 0x4D, 0x65, 0x4A, 0x78, 0x62, 0x85, 0x10, 0x3D, 0x2A, 0x7B, 0x02,
0x29, 0x04, 0x79, 0x05, 0x18, 0x17, 0x97, 0x2A, 0xBA, 0xD4, 0xD8, 0x91, 0x46, 0x1F, 0x82, 0x73,
0x72, 0x92, 0x5C, 0x82, 0x1C, 0xC6, 0xDF, 0x9C, 0xDC, 0x28, 0xC0, 0x3A, 0xD7, 0x74, 0x42, 0xC2,
0x71, 0xD5, 0x80, 0x47, 0x23, 0x3D, 0xCD, 0x48, 0x4C, 0x3B, 0x52, 0x92, 0x54, 0x03, 0x1D, 0x87,
0xCE, 0x8D, 0xEC, 0xF5, 0x31, 0x0A, 0x6F, 0x76, 0x70, 0x38, 0xA8, 0xFD, 0x8B, 0xB2, 0xFA, 0xAC,
0xD9, 0x12, 0xCE, 0x19, 0x3B, 0xDD, 0x42, 0xD8, 0x54, 0xFD, 0xBB, 0x82, 0x30, 0xA8, 0x1C, 0x07,
0x0C, 0x80, 0x13, 0xCF, 0xF5, 0x64, 0x1B, 0x74, 0x38, 0x4F, 0xB9, 0x1A, 0xBF, 0x09, 0xD0, 0x95,
0xBB, 0xE3, 0x22, 0xEF, 0xB4, 0xBC, 0x4C, 0x78, 0x13, 0x3F, 0x9B, 0xD9, 0x9C, 0xBB, 0xD2, 0xC7,
0x92, 0x8A, 0xCD, 0xBA, 0x49, 0x65, 0x31, 0x49, 0xAF, 0xA2, 0x91, 0xA4, 0x87, 0x25, 0xAC, 0x37,
0xB5, 0x4F, 0x46, 0xA0, 0x33, 0x99, 0x1C, 0x36, 0x86, 0xFE, 0xC0, 0xFD, 0x03, 0x83, 0x74, 0x4E,
0x30, 0xBB, 0xD3, 0xD8, 0x98, 0x5F, 0x98, 0xB3, 0x17, 0xA2, 0x92, 0xAD, 0xA2, 0x3B, 0xF4, 0xDB,
0x2B, 0x3E, 0x15, 0x8A, 0x72, 0xC3, 0xC4, 0x0E, 0x1F, 0x41, 0x61, 0x34, 0xB5, 0x94, 0xE8, 0x42,
0xA5, 0xF9, 0xE7, 0xEF, 0xA6, 0xB9, 0xE9, 0xD4, 0x8A, 0x74, 0xE9, 0x1C, 0x1B, 0x3A, 0x54, 0x7E,
0xCF, 0xE9, 0x94, 0x06, 0xBD, 0xAD, 0x0E, 0x2C, 0x93, 0x56, 0xDC, 0x5A, 0xC9, 0xE9, 0x31, 0x21,
0x75, 0x8F, 0xF3, 0xCC, 0x7D, 0x9B, 0x12, 0xE0, 0x9A, 0x4A, 0xC5, 0x97, 0x4B, 0xA7, 0x0D, 0xCA,
0x28, 0xF3, 0xCB, 0xFD, 0xCA, 0x49, 0x77, 0x8B, 0x67, 0x4E, 0xB6, 0x38, 0x2E, 0x8A, 0x38, 0x2F,
0xEE, 0xFC, 0x5B, 0x31, 0xD7, 0x14, 0x09, 0x96, 0xA5, 0x61, 0x2A, 0xDF, 0xA4, 0xCE, 0x9F, 0x3D,
0x8C, 0xD2, 0xDD, 0x5E, 0x6F, 0x6C, 0x81, 0x8C, 0x43, 0x9F, 0x56, 0xCD, 0xB8, 0xF7, 0xE1, 0x19,
0xEF, 0x04, 0xA9, 0x03, 0x8F, 0x62, 0x7E, 0xE6, 0xF7, 0x1A, 0xA7, 0x41, 0x0F, 0x99, 0xC9, 0xFB,
0x77, 0x3A, 0x30, 0x4A, 0x14, 0xB6, 0x0C, 0x5F, 0x7A, 0x38, 0x28, 0xC4, 0x3B, 0xAB, 0xC3, 0x78,
0xE5, 0x33, 0x74, 0xF8, 0xEA, 0x36, 0xB1, 0x62, 0x11, 0x45, 0xF7, 0xC1, 0x3E, 0xE6, 0xD7, 0x57,
0xFC, 0x86, 0x0C, 0x70, 0x3A, 0xDB, 0x3B, 0x6E, 0xEF, 0xED, 0x62, 0x1A, 0x9F, 0xEE, 0x2D, 0x49,
0xE0, 0x25, 0x96, 0x5C, 0x54, 0xA9, 0xFD, 0xF1, 0xAD, 0xDF, 0x80, 0xD3, 0xE9, 0xB3, 0x46, 0x9E,
0x96, 0xB9, 0xD9, 0x97, 0xAA, 0xB7, 0x95, 0xD3, 0x80, 0x55, 0xD1, 0x07, 0x2D, 0x86, 0x0D, 0x1A,
0x63, 0x1C, 0x3C, 0x1A, 0x90, 0x83, 0x7B, 0x7D, 0x45, 0x2E, 0x67, 0x6A, 0x4D, 0x74, 0xA7, 0xFC,
0xEB, 0x54, 0xB8, 0x31, 0x55, 0x91, 0xB4, 0x12, 0x57, 0x33, 0xC2, 0x77, 0x41, 0xBA, 0xD6, 0xD4,
0xBE, 0x0C, 0xBA, 0x0D, 0x63, 0xE8, 0x20, 0x59, 0x4E, 0x0F, 0x56, 0x81, 0x19, 0xA3, 0xDC, 0x38,
0xC7, 0x16, 0xB8, 0x26, 0x14, 0x7C, 0x4E, 0x05, 0x2C, 0xB7, 0x44, 0x06, 0xDC, 0xD3, 0x6A, 0x29,
0xAF, 0xC1, 0x9A, 0xB8, 0xA6, 0xBD, 0xA0, 0xDA, 0x8F, 0x4A, 0xA8, 0xFA, 0xF8, 0x7D, 0xDA, 0xB0,
0x57, 0xC0, 0xA7, 0x1E, 0x97, 0xAD, 0x05, 0x08, 0xBE, 0xA2, 0x8A, 0xFE, 0x10, 0x97, 0xF5, 0xCE,
0xCB, 0xF1, 0x87, 0xB3, 0xBB, 0xFD, 0x1A, 0x97, 0x13, 0x34, 0xE2, 0xF4, 0xB3, 0xB6, 0x5D, 0x93,
0x6A, 0xE5, 0x48, 0x97, 0xB0, 0x3D, 0x29, 0x28, 0x29, 0x41, 0xC9, 0xDB, 0x24, 0xCF, 0x5D, 0xFD,
0x35, 0xE5, 0xFA, 0x22, 0x8F, 0xED, 0xF6, 0xF1, 0x2B, 0xF0, 0xDE, 0xFF, 0x9A, 0x73, 0xF9, 0x55,
0x36, 0xC8, 0xFE, 0xD2, 0x31, 0x1C, 0x73, 0x23, 0x04, 0xCA, 0x9A, 0xB9, 0x51, 0xA9, 0xB0, 0x7B,
0x15, 0x2B, 0xBB, 0x54, 0xBA, 0x82, 0x04, 0x08, 0xF3, 0x35, 0x05, 0x2E, 0xE7, 0xB1, 0x27, 0x43,
0x7B, 0x3E, 0xDB, 0xCD, 0x1D, 0xFB, 0xF1, 0x18, 0xF0, 0xCE, 0x60, 0x7C, 0x0A, 0xA6, 0x7A, 0x6C,
0x2D, 0xEC, 0x4F, 0xDC, 0x66, 0x2F, 0x1F, 0x57, 0xB0, 0xFA, 0x47, 0xAA, 0x81, 0xB3, 0x9E, 0xA5,
0x9C, 0x9C, 0x04, 0xE0, 0x12, 0xB6, 0x86, 0x53, 0x67, 0xA5, 0xA3, 0xF4, 0xE7, 0x53, 0xF6, 0xD0,
0x72, 0x4A, 0x75, 0x86, 0xC9, 0x0D, 0x2A, 0x7C, 0x21, 0x2B, 0xA5, 0xA3, 0x90, 0xE2, 0x8B, 0xA0,
0xC2, 0x17, 0x6E, 0xFB, 0x4E, 0xBF, 0x0E, 0x7C, 0x20, 0x6B, 0x5F, 0x10, 0x82, 0x88, 0x34, 0x2C,
0x30, 0xBF, 0xA0, 0x55, 0xCA, 0xE7, 0x9E, 0x88, 0xA6, 0x78, 0x22, 0x64, 0x53, 0xB2, 0xF6, 0x66,
0x7D, 0x04, 0x1D, 0x04, 0x08, 0x9D, 0x0B, 0x21, 0xD6, 0xC6, 0x63, 0x65, 0x9A, 0x7E, 0x75, 0x60,
0xEE, 0x6C, 0x11, 0xE8, 0x41, 0xDE, 0xC1, 0xFE, 0xCC, 0xE1, 0x1C, 0x1C, 0x9C, 0xE4, 0xC7, 0xAC,
0x7E, 0x72, 0xC0, 0xD6, 0xC8, 0x7C, 0xD4, 0xE2, 0x51, 0xAD, 0x92, 0xAD, 0x95, 0x8D, 0x82, 0x5C,
0x10, 0x9E, 0x04, 0x2D, 0x24, 0xD6, 0x60, 0xD5, 0x24, 0x05, 0x59, 0x26, 0x5C, 0x72, 0x5A, 0x2C,
0x32, 0x0D, 0x89, 0x8D, 0x0A, 0x72, 0x53, 0x2E, 0xBA, 0x2D, 0xA4, 0x37, 0x77, 0x78, 0x27, 0x59,
0x19, 0x34, 0x62, 0xAF, 0x95, 0xB9, 0x9E, 0xE7, 0x80, 0xA5, 0x47, 0x8B, 0x81, 0x8F, 0xC7, 0xB9,
0x36, 0x26, 0xC7, 0x84, 0xE8, 0x0A, 0xAF, 0x6D, 0xB8, 0x0A, 0x4E, 0x9B, 0x4E, 0x5E, 0x3D, 0x5F,
0x03, 0xDD, 0xDF, 0xFA, 0x12, 0xCC, 0x2B, 0xF7, 0xB5, 0x7C, 0xE1, 0xFC, 0x7E, 0xF7, 0xDB, 0xF6,
0xFB, 0xF1, 0xC5, 0x7E, 0x81, 0x99, 0x41, 0x84, 0xB0, 0x63, 0xA2, 0x66, 0xA0, 0x59, 0xEE, 0x9B,
0x42, 0x2F, 0xA6, 0x41, 0xF7, 0xC3, 0x4E, 0x26, 0x8F, 0xA3, 0x4E, 0xFE, 0x08, 0x20, 0x22, 0x02,
0x13, 0x5D, 0x96, 0xD5, 0xD8, 0x42, 0x9C, 0xAF, 0x40, 0x15, 0x99, 0xF5, 0xF5, 0xF5, 0x33, 0xE5,
0xA0, 0x44, 0xA8, 0x63, 0x74, 0x3A, 0x68, 0x5C, 0x11, 0x27, 0x27, 0xD5, 0x5B, 0xBF, 0xA1, 0xF0,
0x43, 0x7F, 0xAC, 0x5A, 0x3C, 0x94, 0xA9, 0xFF, 0xF6, 0x0A, 0xA7, 0xF2, 0xB6, 0x4E, 0x94, 0xC4,
0x99, 0x09, 0x1E, 0xDD, 0xF6, 0x39, 0x9E, 0x26, 0x17, 0xBC, 0x4C, 0xFD, 0x56, 0xFD, 0x5C, 0x40,
0x93, 0xBB, 0x75, 0x42, 0xC4, 0xDE, 0x40, 0x31, 0x80, 0x9A, 0x11, 0xF5, 0x3E, 0x05, 0x76, 0xD0,
0xEE, 0x60, 0x65, 0x43, 0xD4, 0xBC, 0xCA, 0x7E, 0x9E, 0xFB, 0x7B, 0x9A, 0xEC, 0xB0, 0x46, 0x8F,
0x00, 0xBB, 0x19, 0x4E, 0xD4, 0x02, 0x35, 0xBB, 0xCF, 0x8E, 0xA7, 0x3B, 0x5C, 0x17, 0x7C, 0x2F,
0x2C, 0x6A, 0x8E, 0x31, 0x62, 0x28, 0x0A, 0xE8, 0x1C, 0x18, 0xF7, 0x6E, 0xE6, 0xF8, 0xF8, 0xA2,
0x5F, 0x5C, 0x28, 0xBD, 0xFC, 0x23, 0x3D, 0x15, 0x35, 0x95, 0x0B, 0x7B, 0xBC, 0x06, 0x1E, 0xE2,
0x65, 0x19, 0x45, 0x2B, 0xFA, 0x3B, 0xB2, 0xC3, 0xC5, 0xB8, 0x6F, 0xAD, 0xAF, 0xAF, 0xF5, 0xA3,
0x29, 0xCE, 0x47, 0x23, 0x0B, 0xA3, 0xE6, 0x88, 0x09, 0x3C, 0xE0, 0x9B, 0xFF, 0xCC, 0xD3, 0x08,
0x8D, 0xC5, 0xA0, 0x60, 0xE9, 0x64, 0x36, 0xF8, 0x14, 0x6F, 0x8E, 0x0E, 0x45, 0x33, 0x7A, 0x13,
0x79, 0x35, 0x73, 0x25, 0xC4, 0xF2, 0xAD, 0xF9, 0x95, 0xB8, 0xAB, 0xAD, 0xA8, 0x2C, 0x2D, 0xAD,
0xC6, 0x42, 0x5D, 0xD8, 0x2C, 0x58, 0xBC, 0xA7, 0xC9, 0x3A, 0x58, 0x7F, 0x91, 0x0F, 0x91, 0x90,
0x4E, 0x94, 0xB0, 0x77, 0x1B, 0xEE, 0x14, 0x06, 0x9D, 0x17, 0x73, 0x24, 0xED, 0x26, 0xEB, 0xB6,
0x60, 0x10, 0xA1, 0xE6, 0xD7, 0x08, 0x56, 0x2C, 0xE2, 0xC3, 0xDD, 0xE1, 0x27, 0x38, 0x76, 0x1E,
0x5D, 0x3B, 0x1C, 0x0F, 0x0C, 0x78, 0x77, 0x1B, 0x15, 0xE4, 0x82, 0x3D, 0x31, 0x1A, 0x43, 0x0C,
0xD8, 0x28, 0xF9, 0xE8, 0x17, 0xA1, 0x85, 0x46, 0xD9, 0x0C, 0x2F, 0x12, 0x20, 0x59, 0x6C, 0x64,
0x61, 0x12, 0xC1, 0xAC, 0x05, 0x4F, 0x16, 0x47, 0x05, 0xC0, 0xD6, 0xE6, 0x5D, 0x78, 0xCA, 0x3D,
0xA6, 0xC4, 0xDC, 0xA2, 0xE3, 0x75, 0x83, 0x44, 0x5B, 0xB1, 0x4F, 0xE8, 0x4F, 0x42, 0xE8, 0xC3,
0x12, 0xE1, 0x81, 0xE4, 0x2D, 0x1C, 0x7B, 0xE0, 0x2A, 0xAF, 0x71, 0xCD, 0xAD, 0x75, 0x53, 0x12,
0x1A, 0x64, 0x82, 0x72, 0x40, 0x95, 0x33, 0x19, 0xC7, 0xA4, 0xE1, 0xD4, 0xCA, 0xCD, 0xDE, 0x37,
0x32, 0xD3, 0x9D, 0x28, 0x88, 0x44, 0x84, 0x42, 0x46, 0x32, 0x78, 0x3C, 0x18, 0xBC, 0xF8, 0xCF,
0x89, 0xA8, 0xEF, 0xCF, 0x2A, 0x73, 0x55, 0xE7, 0x02, 0xB1, 0xF4, 0xCD, 0x46, 0x08, 0x82, 0x39,
0xBF, 0x0D, 0x63, 0x04, 0x83, 0x05, 0xB4, 0xA6, 0x61, 0x32, 0x01, 0x92, 0x34, 0xAC, 0x15, 0xAF,
0xC0, 0xF0, 0x8B, 0x4F, 0x2E, 0xFE, 0xB8, 0x98, 0xAA, 0xAF, 0x7A, 0xB9, 0x1A, 0x76, 0xAF, 0x99,
0x8A, 0x16, 0x50, 0x03, 0x61, 0x1C, 0xE4, 0x8C, 0x13, 0x72, 0x03, 0x9D, 0x58, 0x9B, 0xFD, 0xA3,
0x54, 0xE5, 0x6F, 0x99, 0xDB, 0xA6, 0x8A, 0xC0, 0x35, 0x42, 0x59, 0x67, 0xAA, 0x5E, 0xC4, 0x12,
0xC2, 0x42, 0x0A, 0xAF, 0xE7, 0x58, 0x3A, 0xB8, 0x2C, 0x47, 0xF0, 0xDC, 0x49, 0xEF, 0x40, 0xFD,
0x5B, 0x8A, 0x48, 0xAC, 0x00, 0x9C, 0xEC, 0xC5, 0xDA, 0x2A, 0x31, 0x04, 0x16, 0xA9, 0x97, 0x33,
0xE8, 0x49, 0x45, 0x61, 0x41, 0xAD, 0xC3, 0x45, 0x48, 0x3A, 0x86, 0x09, 0x99, 0xF1, 0x3F, 0x37,
0x5F, 0x2E, 0xF2, 0xDF, 0xBA, 0x68, 0x2A, 0xFC, 0x8C, 0xBA, 0xEB, 0x8C, 0x45, 0x66, 0x53, 0xFA,
0xF3, 0x00, 0x10, 0xA5, 0x26, 0x3C, 0xCF, 0x4B, 0x4C, 0x6A, 0xDE, 0xAF, 0xE7, 0x0D, 0x65, 0xA0,
0x94, 0x81, 0x80, 0x2A, 0x80, 0x7C, 0x17, 0xA3, 0xF9, 0x99, 0x0A, 0x32, 0xD5, 0x9F, 0xA8, 0xD1,
0xEA, 0x30, 0x90, 0xA5, 0x39, 0x77, 0x5E, 0xFA, 0x3D, 0x02, 0x46, 0x25, 0xC2, 0xB1, 0xDB, 0x64,
0x1D, 0xB0, 0x17, 0x99, 0x99, 0x0F, 0x0C, 0xCF, 0xFB, 0x91, 0xE1, 0xDD, 0xC8, 0x70, 0x5C, 0xE1,
0xA4, 0x60, 0x76, 0x10, 0x63, 0x32, 0x98, 0x2F, 0x4C, 0x9C, 0x21, 0x98, 0xF3, 0x8D, 0xC0, 0x47,
0x42, 0x11, 0xBB, 0xD6, 0x18, 0x0F, 0xE9, 0x88, 0x4A, 0xAF, 0xA9, 0xA0, 0x89, 0x4C, 0x6E, 0x1C,
0xA2, 0x97, 0x9C, 0xA8, 0x5F, 0xBD, 0xBE, 0xCD, 0x27, 0xCB, 0x16, 0x62, 0x1C, 0x7B, 0xF9, 0x2E,
0xBE, 0xD6, 0x9E, 0xE6, 0xBA, 0x52, 0xE7, 0x86, 0x7E, 0xB8, 0xF0, 0xD8, 0xE1, 0xC2, 0x40, 0xF6,
0x0C, 0xD7, 0xBF, 0x17, 0xDA, 0x63, 0xF8, 0xDB, 0x47, 0xC3, 0x9D, 0xF0, 0x9C, 0xFD, 0xF9, 0x53,
0x35, 0x04, 0x8B, 0x94, 0xAA, 0xB6, 0x63, 0x94, 0xFF, 0x08, 0x92, 0xF1, 0xD5, 0x85, 0xC1, 0xFE,
0xB8, 0xF5, 0xF0, 0xDC, 0x4C, 0x8F, 0xEF, 0x11, 0x5D, 0xA3, 0x9E, 0x07, 0x7B, 0x03, 0xEB, 0xF3,
0x71, 0xCA, 0x10, 0x76, 0x0D, 0x0B, 0x0D, 0xDC, 0x04, 0xE4, 0xBD, 0x43, 0xD3, 0xDB, 0xB8, 0xA4,
0x1E, 0xBD, 0x37, 0xE7, 0xE1, 0x4E, 0x27, 0x93, 0xC9, 0xCA, 0x87, 0x60, 0x2E, 0x6C, 0xA4, 0x31,
0x1F, 0x8A, 0x6D, 0x5A, 0x7F, 0xE4, 0xC6, 0xB6, 0x4F, 0xED, 0x20, 0x5C, 0xAA, 0xC7, 0xC8, 0xD0,
0x45, 0xC9, 0xD5, 0x30, 0x0A, 0x99, 0x27, 0x4D, 0xA5, 0x79, 0x60, 0x36, 0x86, 0x43, 0x3C, 0x72,
0x39, 0xD2, 0x31, 0x22, 0x77, 0x06, 0x64, 0x76, 0xB7, 0xCB, 0x00, 0x68, 0x5D, 0x24, 0x86, 0xD0,
0xFB, 0x3B, 0xEC, 0x64, 0xB8, 0x71, 0x7D, 0x45, 0x2C, 0x47, 0x2D, 0x2E, 0x2E, 0xC2, 0x05, 0x71,
0x01, 0xE1, 0xD4, 0x8C, 0x4A, 0xB4, 0x58, 0xEA, 0x1E, 0x3D, 0xC1, 0x90, 0x51, 0xD3, 0x84, 0x8D,
0xD0, 0xB5, 0xF2, 0xE8, 0x2C, 0x3E, 0xF8, 0x65, 0xBA, 0x59, 0x36, 0xDE, 0x2A, 0xAD, 0x2F, 0xBE,
0xBD, 0xDA, 0x09, 0x27, 0xF5, 0x71, 0xB3, 0xF0, 0xC7, 0x8B, 0xF9, 0xE4, 0xAE, 0x0F, 0x38, 0xFC,
0xCE, 0x46, 0x6B, 0xCD, 0xEC, 0xAD, 0x17, 0xF6, 0xE7, 0x77, 0xEF, 0xE1, 0x71, 0xDF, 0xCE, 0xCD,
0x78, 0x49, 0xB6, 0x5A, 0xF0, 0x61, 0x51, 0x86, 0x80, 0x17, 0x47, 0x9F, 0x9D, 0x0C, 0xFC, 0xB5,
0xAC, 0xEE, 0x9C, 0xF5, 0x54, 0x25, 0xBF, 0x14, 0x3D, 0x1A, 0x7E, 0x2A, 0x8A, 0xCC, 0x33, 0xD7,
0xFC, 0x4E, 0xC1, 0x8D, 0xC9, 0x44, 0xE1, 0x05, 0x15, 0x79, 0xEB, 0x31, 0xFE, 0x4C, 0xD6, 0x92,
0xCB, 0xE4, 0x95, 0x65, 0x1B, 0x39, 0x48, 0xAE, 0xDD, 0xEF, 0xA2, 0x38, 0x02, 0xAF, 0x27, 0x8D,
0xF7, 0x81, 0x2C, 0x94, 0xF0, 0x15, 0x53, 0xFF, 0xCE, 0x31, 0xE9, 0x9C, 0x78, 0x8B, 0x33, 0x2B,
0x04, 0xB6, 0xB2, 0x34, 0x56, 0x95, 0x0D, 0x7D, 0x53, 0x87, 0x61, 0x50, 0x8F, 0xFB, 0x71, 0xE5,
0x9A, 0x88, 0x66, 0x2B, 0x3C, 0xA0, 0xBF, 0xFA, 0x4F, 0x51, 0xE7, 0x96, 0xA6, 0x5F, 0x09, 0xFE,
0x60, 0x9A, 0x97, 0x44, 0xC5, 0xCD, 0x87, 0x58, 0xC6, 0x08, 0x4E, 0x37, 0x17, 0x00, 0x7B, 0xB4,
0x8F, 0xE2, 0x81, 0x8A, 0x37, 0x2A, 0xFF, 0x67, 0xAE, 0xA8, 0x90, 0x20, 0xE3, 0x5B, 0x16, 0xBD,
0xA6, 0xD5, 0xE3, 0xFC, 0x77, 0xF2, 0x55, 0xDB, 0x94, 0xC0, 0x5C, 0x99, 0x50, 0xF9, 0x7F, 0x70,
0x72, 0x7C, 0xA0, 0xBF, 0x7B, 0xF4, 0xFF, 0xBF, 0x55, 0x41, 0xA4, 0xFC, 0x4B, 0xE2, 0xC4, 0x6A,
0xC4, 0x2F, 0xCB, 0xED, 0x94, 0x8F, 0xF4, 0x26, 0x96, 0x41, 0xAD, 0xF4, 0xA9, 0xC3, 0xD5, 0x06,
0xF6, 0xFA, 0x95, 0x7A, 0xC4, 0x0F, 0x42, 0xBE, 0x4C, 0xB5, 0x58, 0x8A, 0xE2, 0x05, 0xE5, 0x1F,
0x4D, 0xBD, 0x8F, 0xC4, 0x53, 0x4D, 0x4C, 0x8D, 0xA0, 0xEE, 0x76, 0x92, 0x49, 0xF8, 0x08, 0x18,
0x5E, 0x93, 0xB6, 0x47, 0xF8, 0xA0, 0xCD, 0xD7, 0xC6, 0xBC, 0x9F, 0x6F, 0xD9, 0x55, 0x81, 0x80,
0x48, 0xF1, 0x90, 0xA7, 0xCB, 0xFD, 0xCB, 0xC6, 0x5C, 0x46, 0x3C, 0xA1, 0x14, 0x4F, 0xCA, 0xA9,
0xE0, 0xC1, 0x1C, 0x86, 0x82, 0x70, 0x81, 0x3A, 0xA0, 0xF2, 0xB2, 0x24, 0x33, 0x62, 0xB5, 0xD2,
0x41, 0x70, 0x92, 0xB4, 0x43, 0x34, 0xFD, 0xDB, 0xDF, 0x82, 0xEC, 0x82, 0x5F, 0x24, 0xAA, 0xF1,
0xAA, 0xC0, 0x04, 0x58, 0xAA, 0xFF, 0x86, 0xCE, 0xE2, 0x29, 0xB8, 0xF3, 0xFA, 0x9C, 0xD3, 0xF3,
0xC4, 0x28, 0x57, 0xDD, 0x5D, 0xFE, 0x64, 0x72, 0x5D, 0x51, 0xA5, 0x45, 0xF8, 0x57, 0xE9, 0x23,
0xC9, 0xA4, 0xEF, 0x5E, 0x9E, 0xF5, 0x1A, 0x79, 0x3A, 0x2C, 0xA3, 0x62, 0x17, 0x2E, 0x2D, 0xF7,
0xA9, 0xB7, 0x85, 0x1E, 0xBF, 0x14, 0x9A, 0x08, 0xC7, 0xFA, 0x51, 0xF7, 0x44, 0x83, 0x27, 0x14,
0xDA, 0xF8, 0x9B, 0xB0, 0xD2, 0x94, 0x83, 0xB5, 0x17, 0x6D, 0x21, 0x0A, 0xE9, 0x63, 0xB1, 0x20,
0x47, 0x4B, 0xD5, 0xFE, 0x60, 0x31, 0x8A, 0x90, 0xA4, 0x5E, 0xD5, 0xA9, 0xF0, 0x52, 0xAD, 0x12,
0x99, 0xF2, 0xF6, 0x71, 0x3E, 0xDA, 0x18, 0x05, 0xDC, 0xD3, 0xC4, 0x02, 0x0B, 0x28, 0x0C, 0x64,
0xF5, 0x3A, 0x9A, 0xFB, 0xB0, 0x1B, 0x32, 0x35, 0xA5, 0x78, 0xAE, 0x53, 0x95, 0x9C, 0x9C, 0x22,
0x55, 0x07, 0xD7, 0x65, 0x3E, 0x5F, 0x12, 0x65, 0x44, 0x42, 0xC0, 0x41, 0x40, 0x9D, 0xC0, 0x4A,
0xBB, 0xF4, 0xD1, 0xC6, 0xF2, 0x45, 0x27, 0x0B, 0x48, 0xF2, 0x04, 0x44, 0x04, 0xFD, 0xA0, 0x42,
0x41, 0x64, 0x8E, 0x78, 0xB6, 0x88, 0x40, 0x5C, 0x20, 0xF1, 0x77, 0x58, 0xD8, 0x3B, 0x4F, 0xE4,
0x93, 0xD1, 0x6B, 0xDF, 0xF2, 0x51, 0x08, 0x0C, 0x85, 0x5D, 0x89, 0x4C, 0x26, 0xA0, 0x31, 0x94,
0x2F, 0x42, 0xDA, 0x36, 0x72, 0x0C, 0xA9, 0x10, 0x4C, 0xAE, 0x71, 0x90, 0x8B, 0x06, 0x3C, 0xA6,
0xED, 0xCB, 0x71, 0xA7, 0x38, 0x59, 0x51, 0x21, 0x98, 0xD0, 0xAF, 0xE4, 0x20, 0xD8, 0x42, 0x86,
0xA8, 0x93, 0x12, 0x6A, 0x87, 0xD8, 0x4B, 0x3C, 0x70, 0xC7, 0xBC, 0x42, 0x25, 0x22, 0x70, 0x34,
0x2A, 0xC2, 0x1A, 0x8F, 0x1B, 0x3C, 0x0E, 0xD8, 0xA6, 0xDC, 0x0E, 0x6D, 0x26, 0xC8, 0x7D, 0x7A,
0x2D, 0x95, 0x0D, 0xA4, 0x2E, 0x60, 0x42, 0xD5, 0x30, 0x21, 0x5A, 0xCD, 0x63, 0xEF, 0x43, 0xD9,
0x88, 0x8B, 0x3D, 0x5E, 0xA7, 0xA3, 0x0D, 0xA8, 0xA8, 0x7E, 0x4E, 0x68, 0x28, 0xAF, 0x5F, 0x0D,
0xCC, 0xC2, 0xD0, 0x28, 0xA6, 0xDD, 0xB7, 0x5C, 0xD0, 0x67, 0x64, 0xF1, 0x9E, 0x16, 0x41, 0xCA,
0x3A, 0xC6, 0x76, 0x93, 0x4C, 0x96, 0xBA, 0xA0, 0x09, 0x81, 0xB9, 0x9D, 0xBC, 0x12, 0x81, 0x73,
0xE1, 0x46, 0x83, 0x88, 0x64, 0xA6, 0xCC, 0x9F, 0x70, 0x9F, 0x41, 0x7A, 0xB6, 0xF2, 0x6A, 0xA7,
0x97, 0x36, 0x62, 0xD1, 0x0B, 0x5E, 0x2B, 0x8D, 0x26, 0x22, 0x8C, 0x7E, 0x23, 0x8D, 0xE6, 0xDB,
0xF6, 0xF0, 0xF9, 0x74, 0xC8, 0xE8, 0x97, 0x36, 0xAA, 0x43, 0x42, 0x5F, 0x9A, 0x0B, 0xE5, 0xC9,
0x4A, 0xD2, 0x82, 0xAA, 0xF5, 0xE9, 0x86, 0xB1, 0x5C, 0x44, 0x69, 0x93, 0x22, 0x2C, 0xE3, 0xA9,
0xD7, 0x88, 0xBB, 0xD2, 0x0B, 0x6F, 0x00, 0xBA, 0xC3, 0x8D, 0x76, 0xE8, 0xFF, 0x13, 0xE9, 0x7F,
0x9A, 0xCB, 0xC2, 0x94, 0xFE, 0x1B, 0xE9, 0xBF, 0x47, 0xFF, 0x99, 0x87, 0xE0, 0x6F, 0x72, 0xA9,
0x91, 0xFE, 0x7B, 0xF4, 0xEF, 0xAC, 0x5B, 0xC0, 0xEF, 0xCF, 0xCD, 0xF4, 0xEF, 0x77, 0x24, 0x54,
0xF5, 0x6E, 0xBF, 0xE6, 0x43, 0x5A, 0xEB, 0x32, 0x9F, 0x49, 0x11, 0x17, 0x61, 0xC1, 0x68, 0x01,
0x10, 0x64, 0x28, 0x6B, 0x50, 0xD8, 0x97, 0xA4, 0x8F, 0x76, 0xF2, 0x74, 0xE9, 0x9F, 0xB9, 0x59,
0x6F, 0x5B, 0xD9, 0x81, 0xD4, 0xC1, 0x73, 0x09, 0x86, 0x28, 0x9D, 0x4C, 0xE7, 0x21, 0x91, 0x98,
0x23, 0x0F, 0xF6, 0x1F, 0x0C, 0x58, 0x0B, 0xDF, 0x6F, 0x62, 0x6F, 0xFA, 0xA6, 0x83, 0xCE, 0x4E,
0xC9, 0xAB, 0xD3, 0xD6, 0x2D, 0x68, 0xC4, 0x0C, 0x54, 0xB2, 0x20, 0xA6, 0xBB, 0x31, 0x90, 0x5F,
0x2D, 0xFF, 0xD7, 0xB4, 0xEB, 0xC2, 0x2B, 0xD3, 0xA6, 0x8B, 0xC2, 0xBF, 0x94, 0xDD, 0x81, 0x10,
0xE9, 0x91, 0x87, 0x3F, 0x3C, 0x24, 0x11, 0xCB, 0xA9, 0x86, 0x76, 0x10, 0x3D, 0x68, 0xDF, 0x97,
0x1F, 0x8E, 0xE8, 0x7B, 0x48, 0xC2, 0xBE, 0xE4, 0xE8, 0xC6, 0xC7, 0xB7, 0xEB, 0xBE, 0xFB, 0xC1,
0x3D, 0xA4, 0xC5, 0x62, 0x6A, 0x3A, 0x5E, 0xF4, 0x77, 0xB5, 0xBA, 0xEF, 0xA5, 0xDF, 0xC9, 0x25,
0x51, 0x39, 0x4E, 0x2F, 0x8B, 0x8E, 0x0E, 0x23, 0x62, 0xAF, 0xF4, 0x8F, 0x34, 0xEE, 0x02, 0x06,
0x75, 0x4E, 0xDE, 0xAB, 0x2D, 0x38, 0xE1, 0x4C, 0xAC, 0x45, 0xF4, 0x84, 0xD7, 0x68, 0x95, 0xEE,
0xF5, 0x7F, 0xBF, 0xEA, 0x6A, 0x25, 0xF8, 0xD6, 0x94, 0xD2, 0x8D, 0x38, 0xEE, 0x49, 0xAB, 0x7E,
0xD6, 0xDE, 0xEF, 0x29, 0xA5, 0xDE, 0xC8, 0xC6, 0x12, 0x0A, 0x67, 0xCE, 0x59, 0x98, 0xCE, 0x6A,
0x28, 0x9E, 0x59, 0x88, 0xB9, 0xF8, 0xAC, 0xCC, 0x40, 0xF0, 0xC3, 0xDF, 0x04, 0xFC, 0xD1, 0xBA,
0xE1, 0x29, 0x5C, 0xE3, 0x53, 0x48, 0x85, 0x6E, 0xDE, 0x68, 0x70, 0x8A, 0xB4, 0xD4, 0x66, 0x69,
0x70, 0x2A, 0x8F, 0xC8, 0xA9, 0x5C, 0xD0, 0xA7, 0xA0, 0xF3, 0x37, 0x2B, 0x51, 0x2A, 0x5A, 0x43,
0x55, 0x6F, 0xC2, 0x4D, 0x93, 0x53, 0xBF, 0xC6, 0x69, 0x52, 0xA0, 0x38, 0xA9, 0xF7, 0xE4, 0x34,
0xA8, 0x13, 0x39, 0x4D, 0x2E, 0x6D, 0x82, 0x81, 0x38, 0x0D, 0x36, 0xE1, 0x6A, 0x27, 0x70, 0xCC,
0x1D, 0x83, 0xD3, 0xC0, 0x30, 0x2D, 0x89, 0x53, 0x20, 0x07, 0x98, 0x3D, 0xA6, 0x4A, 0x01, 0x2C,
0xE0, 0xE9, 0x38, 0x63, 0x05, 0xC9, 0xB6, 0xEB, 0x3C, 0x51, 0xE1, 0xFB, 0xC6, 0xA4, 0x6D, 0x6E,
0xBA, 0x70, 0xE3, 0xEA, 0x4A, 0x25, 0x34, 0xEB, 0x33, 0xE2, 0xED, 0xB7, 0x06, 0xC1, 0x5A, 0xB8,
0x37, 0x70, 0x6C, 0xAE, 0xC8, 0xC3, 0x28, 0xE9, 0x11, 0x11, 0x7F, 0x88, 0x93, 0x02, 0xE6, 0xCA,
0xBB, 0xD1, 0x91, 0x23, 0x15, 0x39, 0x02, 0xFB, 0xC5, 0xB0, 0xC1, 0xE6, 0x06, 0xB2, 0x8D, 0xA7,
0xE4, 0x0E, 0x7F, 0xF3, 0x6F, 0x30, 0x4C, 0xA7, 0x84, 0xDB, 0xC2, 0x11, 0xB9, 0xA0, 0x4F, 0x89,
0xC1, 0x94, 0x53, 0xB9, 0x20, 0x63, 0xD7, 0xA9, 0xB0, 0x41, 0xB4, 0xAE, 0x9C, 0x86, 0x25, 0x38,
0xA2, 0x53, 0x39, 0xF5, 0x5A, 0x9C, 0x86, 0x25, 0xD8, 0x90, 0x1F, 0xD9, 0x84, 0x79, 0xC3, 0x69,
0xF4, 0xD9, 0x26, 0x23, 0x40, 0x88, 0x12, 0x90, 0x23, 0x11, 0x39, 0x92, 0x6F, 0x32, 0xB8, 0xAE,
0x6D, 0x26, 0x62, 0xFE, 0xEF, 0xD7, 0xDB, 0xFE, 0x34, 0xE7, 0x3D, 0x02, 0x63, 0x68, 0x52, 0xAC,
0xC9, 0x73, 0x76, 0x9F, 0x49, 0x73, 0x51, 0x9C, 0x6C, 0x98, 0x22, 0x64, 0x25, 0x68, 0x81, 0x91,
0x26, 0x08, 0xB2, 0xC1, 0xC4, 0xFC, 0x04, 0x69, 0x4E, 0x5B, 0x46, 0xE0, 0x57, 0x88, 0x23, 0xC4,
0x1B, 0x63, 0xE2, 0x60, 0xA8, 0x23, 0x58, 0x4A, 0xF7, 0xBC, 0x54, 0xEE, 0x63, 0x2E, 0x01, 0x78,
0xB2, 0x13, 0x4B, 0xEC, 0x33, 0x97, 0xD0, 0x0D, 0xD1, 0xB4, 0xED, 0xF4, 0xC6, 0xAE, 0x32, 0xDC,
0x4E, 0xB7, 0x4E, 0x67, 0x29, 0xE3, 0x21, 0x18, 0x9A, 0x6E, 0x47, 0xCF, 0x4A, 0x90, 0x10, 0x1D,
0x29, 0x73, 0x93, 0x5D, 0x08, 0xAF, 0x88, 0xCF, 0x91, 0x26, 0xFD, 0x44, 0xD0, 0xA3, 0xFC, 0xCF,
0x53, 0x40, 0x80, 0x1E, 0xEB, 0xC9, 0x6D, 0x98, 0x9A, 0xAE, 0xF0, 0x50, 0x5C, 0x60, 0xC2, 0x72,
0xCC, 0xA7, 0x48, 0x6F, 0xA2, 0x1E, 0xF1, 0xF2, 0xFD, 0x57, 0x4C, 0xC2, 0x15, 0xD3, 0x6D, 0xAF,
0x98, 0x84, 0x2B, 0xA6, 0xDB, 0x5E, 0x31, 0x49, 0x26, 0x53, 0x24, 0x6A, 0x0B, 0x2B, 0xA6, 0xE2,
0x6C, 0x65, 0x1A, 0x91, 0x16, 0x9C, 0x06, 0x15, 0x67, 0xEB, 0x34, 0x66, 0xAB, 0xE3, 0x6C, 0xDD,
0xBC, 0xD7, 0x6C, 0xE9, 0x19, 0x77, 0xF4, 0xC8, 0x97, 0x21, 0xCE, 0x09, 0xEC, 0x1D, 0x32, 0x50,
0x47, 0x3B, 0x1E, 0xF6, 0x77, 0x68, 0x14, 0x6D, 0x7A, 0x44, 0xA4, 0xEA, 0x27, 0xBD, 0x58, 0x5A,
0xB5, 0xE3, 0xC4, 0x06, 0xA4, 0x0A, 0x59, 0xE0, 0x70, 0x94, 0x7A, 0x6B, 0x50, 0x86, 0x54, 0x3B,
0x8A, 0x0D, 0x58, 0xBD, 0x80, 0xD5, 0x71, 0x67, 0xB1, 0x2B, 0x2B, 0x6D, 0x60, 0x15, 0x6B, 0x46,
0x81, 0x84, 0xD9, 0x02, 0xD0, 0xA3, 0x16, 0x15, 0x29, 0x22, 0x91, 0x88, 0xC8, 0x86, 0xAC, 0x54,
0x50, 0x3D, 0x6D, 0x41, 0x7C, 0x09, 0x03, 0xF6, 0xBF, 0xE1, 0x62, 0xEB, 0x6D, 0xC9, 0x12, 0xD7,
0x60, 0x70, 0x9B, 0x05, 0x37, 0xBD, 0x0D, 0x0C, 0xDB, 0x92, 0x9B, 0xB9, 0x2F, 0xBC, 0x8E, 0x5F,
0xF4, 0x14, 0xB1, 0xE4, 0x28, 0x9B, 0xFA, 0x80, 0x81, 0xF4, 0x12, 0x7D, 0x04, 0xB5, 0x0F, 0x17,
0xA6, 0x81, 0x8F, 0x22, 0x9D, 0x07, 0xE6, 0x8B, 0xBC, 0x25, 0x55, 0x0D, 0x2D, 0x5E, 0x39, 0x86,
0xC5, 0x59, 0xFA, 0xCA, 0x14, 0x3E, 0x6A, 0x5F, 0xE7, 0xF2, 0xF8, 0x4B, 0xCC, 0xBD, 0xF5, 0x1C,
0x43, 0x1A, 0xF4, 0xAF, 0x9A, 0x54, 0xE4, 0xC8, 0x50, 0x4E, 0x51, 0x96, 0x82, 0xA0, 0xA3, 0xB7,
0x89, 0x1A, 0x9C, 0x4F, 0xA5, 0xAD, 0x04, 0x40, 0x1A, 0xC5, 0x34, 0xDE, 0x6D, 0x5C, 0xFA, 0x12,
0x97, 0x60, 0x73, 0x5B, 0xCA, 0x72, 0x0E, 0x6B, 0xD1, 0xC3, 0x5B, 0x30, 0x67, 0x73, 0xF1, 0xF4,
0xE0, 0x67, 0x30, 0x20, 0x4E, 0xDD, 0xE2, 0x65, 0xEA, 0x7F, 0x58, 0x1B, 0x09, 0xB0, 0x1D, 0x9F,
0xCD, 0x6D, 0x99, 0x08, 0x87, 0x6B, 0xD1, 0xDC, 0xFE, 0x9D, 0xE9, 0x08, 0x27, 0x47, 0xAE, 0xD7,
0x67, 0xF9, 0x95, 0x0D, 0xA1, 0x07, 0xBD, 0x0C, 0xAA, 0xB0, 0x23, 0x66, 0xF8, 0xDC, 0x38, 0x96,
0x15, 0x0C, 0x1C, 0xB4, 0x74, 0x82, 0xF5, 0x49, 0x30, 0x3D, 0xFC, 0x92, 0xCC, 0xFB, 0x36, 0xAE,
0x2E, 0xB0, 0x3B, 0xF9, 0x94, 0x15, 0x51, 0x9F, 0xD9, 0x5A, 0x47, 0xDB, 0x14, 0xEB, 0xC1, 0x7A,
0xF6, 0x91, 0xA7, 0x76, 0x4A, 0x83, 0x0E, 0x9D, 0xA3, 0x26, 0xCC, 0x0C, 0x25, 0x22, 0xB0, 0x11,
0xFD, 0x18, 0xF8, 0x76, 0xA6, 0xEA, 0x05, 0xE5, 0x17, 0x88, 0x68, 0xA0, 0x30, 0x16, 0x81, 0x31,
0x39, 0x64, 0xF3, 0x25, 0x0B, 0x13, 0x66, 0xC5, 0x4B, 0x0C, 0xA6, 0x56, 0xB9, 0xC8, 0xB7, 0xE8,
0xCC, 0xB0, 0x92, 0x69, 0x0C, 0xFF, 0xDA, 0xDA, 0x44, 0xA7, 0x4A, 0xB0, 0x8A, 0x51, 0x4B, 0xCA,
0x54, 0x29, 0xEA, 0xA5, 0x84, 0xE9, 0x28, 0x15, 0xBB, 0x28, 0x97, 0xBE, 0x41, 0x31, 0xE3, 0x25,
0xC8, 0x9B, 0x2C, 0x2C, 0xAF, 0x81, 0x87, 0x51, 0x44, 0x5B, 0x27, 0x5A, 0xE4, 0x6C, 0xE0, 0xA2,
0x42, 0xC2, 0x18, 0xB1, 0x7A, 0xFE, 0xAD, 0x35, 0x42, 0x1F, 0x43, 0x0B, 0x65, 0x33, 0x16, 0x09,
0x6B, 0x52, 0x69, 0x1E, 0x4A, 0x9A, 0xAA, 0x63, 0xCE, 0x5D, 0x8B, 0xED, 0x08, 0x94, 0xA6, 0xCA,
0x66, 0x80, 0x90, 0x41, 0xD0, 0x15, 0x00, 0x81, 0x80, 0x01, 0x16, 0x8A, 0x16, 0x4C, 0xCC, 0x37,
0xAC, 0x02, 0xCB, 0x19, 0x02, 0x8D, 0x98, 0x48, 0xF5, 0x98, 0x95, 0x60, 0x96, 0xE5, 0x1E, 0xAC,
0xB6, 0x5F, 0x84, 0x9B, 0x9C, 0x9C, 0x86, 0x6B, 0xA1, 0xB3, 0x4D, 0xB1, 0xA2, 0x0C, 0x8E, 0x1C,
0x6A, 0xF1, 0x60, 0x69, 0x63, 0xA0, 0x2E, 0x14, 0x19, 0xA1, 0xAA, 0xAC, 0x52, 0xB6, 0x1C, 0x07,
0x7C, 0xCF, 0x86, 0x8C, 0x31, 0x52, 0x17, 0xE2, 0x55, 0x19, 0x0F, 0x8E, 0xAB, 0x38, 0xF0, 0xC9,
0xCB, 0xAD, 0x72, 0x6B, 0x59, 0xD5, 0x61, 0x7A, 0x01, 0xD2, 0x34, 0xB2, 0x1D, 0xC9, 0x0E, 0x07,
0x8F, 0xC5, 0x32, 0x2E, 0x57, 0x44, 0x73, 0x0A, 0x1F, 0x0E, 0xBC, 0x41, 0x35, 0x82, 0xCA, 0xA1,
0x8E, 0xC8, 0x71, 0x8A, 0xB9, 0xE5, 0x38, 0xC4, 0x1C, 0x97, 0x6E, 0xE1, 0xD2, 0x27, 0x98, 0x17,
0xD4, 0x73, 0xB6, 0x72, 0x6B, 0x08, 0xA5, 0x29, 0x3E, 0x37, 0xE2, 0xE5, 0xDA, 0x16, 0x06, 0x96,
0x3B, 0xEA, 0xC9, 0x96, 0x19, 0x8A, 0x9E, 0xDA, 0x88, 0xB4, 0xC9, 0x62, 0xBE, 0xF5, 0xAE, 0x08,
0x73, 0x6E, 0x51, 0x04, 0xF3, 0x3A, 0xC6, 0xAA, 0xC7, 0xB1, 0xD4, 0x2D, 0xB1, 0x01, 0x89, 0xF9,
0x9A, 0xC0, 0x31, 0x4E, 0x31, 0xC4, 0x2A, 0x50, 0xA2, 0xFC, 0xAF, 0x2D, 0xEB, 0xC7, 0xCD, 0x65,
0x6A, 0x5B, 0x63, 0xF8, 0xF5, 0xD5, 0xC9, 0xF1, 0x5C, 0xCD, 0xC2, 0x19, 0xEE, 0x10, 0x6B, 0x09,
0x2A, 0x8B, 0x4E, 0xE6, 0x1B, 0xD7, 0xE9, 0x42, 0xDF, 0x98, 0xD7, 0xB8, 0xB0, 0x4A, 0x2F, 0x67,
0xB6, 0xE1, 0xD6, 0xBB, 0x60, 0xF3, 0x48, 0x39, 0xF5, 0x1A, 0x24, 0xDC, 0xB2, 0x9B, 0x6F, 0x4B,
0xB6, 0xB2, 0xC3, 0xB1, 0xE9, 0xFA, 0x46, 0xB4, 0x89, 0x2C, 0x8C, 0xD7, 0xFA, 0xF8, 0xFA, 0x4A,
0x29, 0xDA, 0x4E, 0xE7, 0x42, 0x39, 0xF2, 0x37, 0xAD, 0x2D, 0x7F, 0x13, 0xD4, 0xCC, 0xBC, 0x05,
0x66, 0x17, 0x3C, 0xF6, 0xC7, 0x77, 0xB4, 0xDB, 0xCD, 0xBD, 0xDF, 0x5A, 0x5F, 0x3F, 0xDF, 0x0F,
0x90, 0x7D, 0xB8, 0x8F, 0x55, 0x67, 0x8D, 0xCD, 0x31, 0x31, 0x6D, 0x86, 0x76, 0xB1, 0xDC, 0x10,
0x9E, 0x90, 0x35, 0x71, 0x20, 0xE8, 0xA5, 0xDF, 0xAD, 0x13, 0x8D, 0x90, 0xDB, 0x04, 0x50, 0x0F,
0xB1, 0xC8, 0x6D, 0x8E, 0xE9, 0x38, 0xAE, 0xE6, 0x4A, 0x73, 0x51, 0x53, 0x68, 0xE3, 0x63, 0xF9,
0x68, 0xB6, 0x59, 0x47, 0xB1, 0x98, 0x74, 0xD6, 0xE6, 0xF3, 0xD4, 0x6A, 0x73, 0xA6, 0xEC, 0xC4,
0x23, 0x32, 0x88, 0x77, 0x24, 0xC8, 0xB7, 0x84, 0xE5, 0x78, 0x08, 0x2A, 0x1C, 0x66, 0x1F, 0xB9,
0xB6, 0x70, 0x8B, 0x23, 0x6A, 0x13, 0xFA, 0x4E, 0x43, 0x48, 0x35, 0x58, 0xA7, 0x51, 0xA2, 0xA8,
0x6D, 0xD9, 0x9C, 0xD7, 0x20, 0x9E, 0xD2, 0xDA, 0x40, 0x0D, 0x62, 0xCD, 0xE9, 0x42, 0xCB, 0x6C,
0xD4, 0x6B, 0x19, 0xDB, 0x51, 0xCE, 0x79, 0xC4, 0x09, 0x02, 0xC6, 0x1C, 0x13, 0x46, 0x50, 0x06,
0xD1, 0x9A, 0xB4, 0x81, 0x69, 0x93, 0xBE, 0x35, 0xE7, 0x51, 0xDC, 0x29, 0x78, 0x22, 0xC5, 0x34,
0xF6, 0xFC, 0x7F, 0xDF, 0x30, 0xF4, 0x5E, 0x19, 0xDD, 0x4E, 0xF8, 0xDC, 0x8D, 0xB8, 0x89, 0xAE,
0x11, 0xC1, 0x33, 0x73, 0x8C, 0x56, 0x35, 0x1D, 0x3C, 0x5A, 0xE4, 0x37, 0x2B, 0xD3, 0xC8, 0x98,
0x93, 0x0E, 0x32, 0x00, 0xA8, 0x6A, 0x38, 0x99, 0xA2, 0x79, 0x1E, 0x24, 0x70, 0x3D, 0x06, 0x7D,
0xE8, 0x07, 0x06, 0x53, 0x22, 0x63, 0xF9, 0xF2, 0xCF, 0xD6, 0x0B, 0x63, 0x71, 0x8A, 0x57, 0xF3,
0xF6, 0x70, 0x5C, 0xF7, 0x14, 0x31, 0xC6, 0x91, 0x17, 0x8B, 0x44, 0xF7, 0x08, 0x0B, 0x7F, 0xA2,
0x96, 0xFF, 0xD0, 0xB8, 0x4D, 0x50, 0x5E, 0xA4, 0x61, 0x30, 0x15, 0xC3, 0x4A, 0x63, 0x34, 0xF2,
0xE0, 0x91, 0x2A, 0x6E, 0x93, 0xD0, 0x9C, 0xBE, 0xD9, 0xBF, 0x9D, 0x74, 0x2C, 0x0A, 0x4A, 0xA6,
0xBC, 0x23, 0xB1, 0x25, 0xF1, 0xC8, 0x1D, 0xD5, 0xF7, 0x7D, 0x9B, 0xD5, 0x96, 0x0C, 0xCE, 0xDF,
0xF6, 0x5E, 0x18, 0x2C, 0xA3, 0x63, 0x3B, 0x6D, 0xB4, 0xB1, 0xBB, 0x39, 0xDA, 0xB0, 0x51, 0xCF,
0xBE, 0xDC, 0x0D, 0x08, 0xCF, 0xA5, 0x37, 0x32, 0xDB, 0xC3, 0x80, 0x15, 0x67, 0x90, 0xA6, 0x86,
0x4D, 0x0F, 0xE9, 0xBF, 0xDB, 0x03, 0x37, 0x14, 0xA5, 0x03, 0xCB, 0x2D, 0x60, 0x1A, 0x91, 0x63,
0x3E, 0x64, 0xD9, 0x9C, 0xEE, 0x45, 0xE9, 0xFE, 0x92, 0x59, 0xCF, 0xAB, 0x04, 0x55, 0xCD, 0x28,
0xF6, 0xB5, 0x55, 0x3D, 0xEA, 0xD0, 0xEA, 0x4C, 0xBB, 0x39, 0x43, 0xCC, 0x19, 0x11, 0xA0, 0xA5,
0x6D, 0x74, 0x23, 0xDA, 0xE1, 0x1A, 0xB4, 0x43, 0x7C, 0xFD, 0x1F, 0x2A, 0x19, 0xDA, 0xFE, 0x64,
0xC8, 0x5A, 0xE3, 0x29, 0x94, 0x03, 0x31, 0x0B, 0x6D, 0xF3, 0xD2, 0xF0, 0x6E, 0x6A, 0x96, 0x8D,
0x5A, 0x35, 0x81, 0xA1, 0xB4, 0x3F, 0x06, 0xB0, 0x38, 0x7B, 0xB2, 0x96, 0x9E, 0xCB, 0x67, 0xA1,
0x0C, 0x91, 0x3A, 0x55, 0xE7, 0x87, 0x4D, 0x13, 0x88, 0x0B, 0x13, 0x24, 0x69, 0x19, 0x2F, 0xAA,
0xE6, 0xC5, 0xEC, 0x2C, 0xED, 0x19, 0xF6, 0x40, 0xFF, 0xC5, 0xB5, 0xCD, 0xB6, 0x77, 0x9A, 0xBB,
0x61, 0x42, 0x71, 0x1F, 0x96, 0xC6, 0x39, 0xDC, 0x35, 0xF6, 0x7C, 0xA7, 0x43, 0x5F, 0xAE, 0x06,
0x17, 0x9C, 0x5E, 0x2C, 0xBD, 0x76, 0xC0, 0x1E, 0xAA, 0x18, 0x3D, 0xEC, 0xD2, 0x48, 0xAE, 0xED,
0xD2, 0xF0, 0x7F, 0x38, 0xB5, 0x6E, 0x37, 0xA8, 0x5B, 0x6E, 0x87, 0x98, 0x09, 0x5E, 0xEF, 0x49,
0x3B, 0x2D, 0x73, 0x09, 0xCE, 0x39, 0x51, 0x48, 0x28, 0x88, 0x57, 0xC9, 0x91, 0xDA, 0xE2, 0x69,
0x1F, 0xA8, 0x06, 0x55, 0xF1, 0xEA, 0xF8, 0x9E, 0x59, 0x5C, 0xFB, 0x52, 0xE7, 0x1C, 0xF6, 0x4C,
0xB9, 0x8D, 0x74, 0x04, 0x34, 0x84, 0x9D, 0x56, 0xF0, 0x65, 0x46, 0xC3, 0xB9, 0x4B, 0xD2, 0xC3,
0x32, 0x8A, 0x15, 0x1C, 0xFE, 0xCF, 0xB0, 0x82, 0xDC, 0xDA, 0x0D, 0x3D, 0x2B, 0x8E, 0x21, 0x48,
0x98, 0xAB, 0xD8, 0xDE, 0xDD, 0x8B, 0x30, 0x16, 0x36, 0x43, 0x60, 0x37, 0x89, 0x38, 0xFD, 0x6C,
0x5F, 0x97, 0x33, 0x7B, 0x28, 0xA1, 0x1B, 0x82, 0x49, 0x79, 0x8E, 0x05, 0xA2, 0x82, 0x42, 0x3D,
0xE2, 0x3C, 0x61, 0xCE, 0x0D, 0xE1, 0xCF, 0xC9, 0x6F, 0x26, 0x2C, 0x8A, 0xE2, 0xEC, 0x05, 0x16,
0x01, 0xDE, 0xFD, 0x03, 0x33, 0x2D, 0x62, 0xC5, 0xB6, 0x8E, 0x3B, 0xC2, 0x0F, 0x38, 0x10, 0xDF,
0x30, 0x96, 0x23, 0xFA, 0x7B, 0xB9, 0xA3, 0x02, 0x46, 0xC3, 0x0D, 0x64, 0x09, 0x2B, 0x9B, 0x7B,
0x1D, 0xA2, 0x02, 0x29, 0xA1, 0x96, 0x5B, 0x14, 0x36, 0x88, 0xE7, 0x40, 0x68, 0x52, 0xDE, 0x61,
0xC3, 0xA2, 0x19, 0x57, 0xFF, 0x6E, 0x6C, 0x31, 0x3C, 0x43, 0x19, 0xDF, 0x01, 0x57, 0xED, 0x45,
0xB5, 0xBC, 0x3A, 0x48, 0x42, 0x68, 0xF7, 0xA5, 0x3D, 0xA7, 0x22, 0x61, 0xAD, 0x5B, 0x0A, 0x26,
0x38, 0xC0, 0x6B, 0xAE, 0x05, 0xBC, 0x2C, 0x06, 0xCB, 0x1C, 0x7D, 0xF5, 0xB8, 0x95, 0xF8, 0x78,
0xF8, 0xEA, 0x81, 0x4F, 0x9C, 0xD9, 0x02, 0x30, 0x67, 0xB1, 0xDD, 0xB3, 0x19, 0x9C, 0xB3, 0xA5,
0xC7, 0x96, 0x37, 0x8F, 0x8E, 0x89, 0xB1, 0xF8, 0x93, 0x60, 0xF9, 0xF1, 0x38, 0xF3, 0x60, 0x02,
0x24, 0x0B, 0x46, 0xA0, 0xF7, 0x07, 0xF9, 0x17, 0xE7, 0xEE, 0x2F, 0x40, 0x07, 0xB9, 0x64, 0x57,
0xA5, 0x29, 0xF1, 0xC0, 0x7D, 0xB3, 0x75, 0x41, 0xF0, 0x2F, 0xD6, 0x64, 0x85, 0x00, 0xEF, 0x0E,
0xAF, 0x1B, 0x1B, 0x28, 0x29, 0x43, 0xAC, 0x87, 0x73, 0xE8, 0xBB, 0xE9, 0xFC, 0x89, 0x5E, 0x64,
0x40, 0x23, 0xD7, 0x63, 0xF5, 0x5A, 0xF4, 0x17, 0x26, 0x5E, 0x45, 0x5A, 0xA3, 0xDA, 0x33, 0x5F,
0xE4, 0x35, 0xC6, 0x56, 0x8F, 0xC1, 0x8B, 0x09, 0x2B, 0xCF, 0x96, 0xE1, 0xF9, 0xD7, 0x32, 0x9E,
0x15, 0x75, 0x58, 0x34, 0x89, 0x57, 0x88, 0x5F, 0xB0, 0x40, 0xB8, 0xE8, 0x1E, 0xFF, 0x26, 0x0C,
0xDD, 0x23, 0x9D, 0xE4, 0x80, 0x8D, 0x37, 0xC5, 0x55, 0x31, 0xA8, 0x1A, 0xA8, 0xCC, 0xD5, 0x3C,
0xF7, 0x51, 0xC2, 0x86, 0x5A, 0x36, 0xBB, 0x82, 0x18, 0x2F, 0x09, 0xE1, 0x17, 0x7B, 0x0C, 0xF8,
0x6C, 0x57, 0x86, 0x8C, 0xB1, 0xAD, 0x5D, 0x61, 0xD5, 0xDC, 0x45, 0xC4, 0x28, 0x58, 0x1E, 0xE7,
0x21, 0xA1, 0xE8, 0x74, 0xD0, 0x45, 0xC6, 0x43, 0x3C, 0x24, 0x4D, 0xFA, 0x77, 0xB8, 0x73, 0x54,
0x14, 0xBD, 0x8D, 0x47, 0xD0, 0xF6, 0x23, 0xE0, 0xC3, 0x58, 0x0F, 0xE2, 0x58, 0x0B, 0xF1, 0xAB,
0xDD, 0x66, 0xD6, 0x8B, 0xCA, 0x97, 0x5B, 0x52, 0x01, 0xF2, 0xDC, 0x2D, 0x21, 0xF3, 0x59, 0x61,
0x11, 0x97, 0x77, 0x6C, 0x77, 0xDE, 0x8B, 0xC2, 0x56, 0xAA, 0x9F, 0xAA, 0x50, 0x79, 0x85, 0xBA,
0xF8, 0x6A, 0x6B, 0x03, 0x54, 0xDC, 0xDE, 0xEC, 0x3C, 0x45, 0x61, 0x63, 0x8E, 0x5A, 0x69, 0x86,
0xE0, 0x11, 0xA9, 0xF9, 0x11, 0xEC, 0x8C, 0x9F, 0xBD, 0x04, 0x83, 0xF3, 0x33, 0x35, 0xB8, 0x29,
0x1E, 0x2B, 0x03, 0x17, 0x72, 0x49, 0x8C, 0xFF, 0xEF, 0x9E, 0x04, 0xF2, 0x22, 0x24, 0xD0, 0x25,
0x53, 0x7B, 0xB8, 0xD4, 0xFA, 0x97, 0x70, 0x18, 0x0A, 0xB8, 0x33, 0xD3, 0xD0, 0xAC, 0xCB, 0xFA,
0x60, 0xF0, 0xC8, 0x46, 0x69, 0x6C, 0xD4, 0x60, 0x6D, 0x18, 0x4B, 0xF8, 0x8A, 0x20, 0x9F, 0x52,
0xE8, 0xFF, 0xA9, 0x53, 0xDA, 0x81, 0x84, 0x68, 0x31, 0xA9, 0x17, 0x43, 0x7F, 0xDE, 0x23, 0x33,
0x16, 0x27, 0x01, 0x4E, 0x8C, 0xA0, 0x8F, 0xE8, 0xEB, 0x8E, 0x05, 0xA4, 0x27, 0x6E, 0x57, 0xDA,
0xF4, 0x09, 0xCB, 0x82, 0xB9, 0xE5, 0xD0, 0x5D, 0xDB, 0xB7, 0x2A, 0x62, 0x01, 0x1C, 0x83, 0x62,
0x79, 0x75, 0x11, 0x1D, 0x1E, 0x46, 0x2D, 0xEB, 0x61, 0x78, 0x86, 0x4B, 0x8B, 0x7A, 0x05, 0x05,
0x28, 0xBB, 0x27, 0x9C, 0xF6, 0x22, 0xF7, 0x14, 0x62, 0x79, 0xB3, 0x34, 0xDA, 0xAF, 0x65, 0x76,
0x3D, 0xA0, 0x3D, 0x54, 0x0B, 0xDE, 0x7A, 0xB7, 0xC3, 0x22, 0xA6, 0x07, 0xDF, 0x0C, 0xFB, 0x6A,
0xD4, 0xBE, 0xD5, 0x37, 0x44, 0xE5, 0x23, 0xFA, 0xF7, 0x72, 0xCB, 0xC0, 0x9E, 0xD3, 0x08, 0x1C,
0x39, 0xEC, 0xA0, 0xD0, 0xEB, 0x99, 0xA7, 0xC6, 0xC9, 0xBD, 0xB4, 0x78, 0xC1, 0x9A, 0x09, 0x8B,
0x4D, 0xDE, 0x9C, 0xD5, 0x2E, 0xD3, 0x55, 0xB5, 0x9B, 0xF0, 0xDB, 0xD9, 0xEF, 0x04, 0x6C, 0x6F,
0xB8, 0xB7, 0xB8, 0x23, 0x42, 0x34, 0x55, 0x0B, 0x12, 0xE7, 0x26, 0x7A, 0xBF, 0x7A, 0xB8, 0x4B,
0x39, 0x62, 0x0D, 0x2D, 0x78, 0x54, 0xE5, 0xA9, 0x63, 0x0A, 0xAC, 0x65, 0x50, 0xD3, 0x5A, 0x26,
0x2D, 0xA5, 0xF1, 0x18, 0xD4, 0x60, 0xC0, 0xF5, 0xC2, 0x58, 0x1C, 0xC3, 0x2C, 0x52, 0x4C, 0x2C,
0x5F, 0xCF, 0x16, 0xEF, 0xDA, 0x58, 0x2A, 0xD9, 0x0E, 0x27, 0x1C, 0xD5, 0xAC, 0x62, 0x5E, 0x0D,
0xA2, 0x0A, 0xEC, 0x39, 0x75, 0xED, 0xC9, 0x81, 0xF9, 0xED, 0x70, 0x73, 0x7A, 0x60, 0x88, 0x00,
0x32, 0x54, 0x8C, 0xE2, 0x7A, 0x0D, 0x9C, 0x6F, 0x32, 0x1B, 0xC0, 0xF4, 0xCD, 0x10, 0x55, 0x88,
0x19, 0x22, 0x81, 0x67, 0x88, 0xDF, 0x10, 0xF0, 0xF0, 0x9B, 0x16, 0x15, 0x7E, 0x24, 0xA1, 0x52,
0xF1, 0x99, 0x42, 0xBE, 0x11, 0x48, 0xD2, 0x09, 0xF2, 0x6F, 0x59, 0x15, 0xA6, 0xED, 0x66, 0xD0,
0x28, 0x6B, 0xF1, 0xAB, 0x09, 0xAD, 0x7A, 0x8F, 0x69, 0x7C, 0xBF, 0xF2, 0x2A, 0xEC, 0x36, 0x92,
0x11, 0xC1, 0xB3, 0x8C, 0x51, 0x9A, 0x76, 0x51, 0xEE, 0x47, 0x3A, 0x41, 0x6E, 0x20, 0xC1, 0x6D,
0x58, 0x10, 0x9A, 0x7A, 0xF5, 0x29, 0x19, 0x3D, 0x62, 0x7A, 0x7F, 0xAB, 0x55, 0x80, 0x31, 0x45,
0x57, 0x0A, 0xFE, 0xEA, 0x83, 0x4A, 0x12, 0xFB, 0x52, 0x7D, 0x63, 0x5F, 0x00, 0xB0, 0xDC, 0xAE,
0x0B, 0x62, 0x39, 0x67, 0xC0, 0xD6, 0x36, 0x08, 0x38, 0x1D, 0x36, 0x23, 0xE4, 0x63, 0x22, 0xCE,
0xAA, 0xCB, 0x19, 0xE3, 0x5C, 0x63, 0xD3, 0xB4, 0xDA, 0x56, 0xD6, 0x47, 0xC5, 0x45, 0x6B, 0xA2,
0xA9, 0x1D, 0xD5, 0xFE, 0x3B, 0xF7, 0x9A, 0x28, 0x56, 0x38, 0xD9, 0xB9, 0xCD, 0x0B, 0x15, 0x9F,
0x6E, 0x50, 0x9D, 0xE6, 0xD5, 0xF2, 0x3C, 0x62, 0x35, 0xA8, 0x87, 0xD2, 0xDC, 0x8E, 0xEA, 0x7D,
0x8D, 0x31, 0xF7, 0x2A, 0x89, 0xB2, 0xB0, 0x08, 0x2A, 0xBF, 0x44, 0x59, 0x54, 0xA2, 0xDE, 0x93,
0x81, 0x67, 0x5E, 0x1D, 0x16, 0x18, 0x6E, 0xFC, 0x56, 0xE3, 0x57, 0xA8, 0x70, 0x8E, 0xD3, 0x04,
0x7C, 0xB9, 0x54, 0xB9, 0xB5, 0x10, 0xD0, 0x1D, 0x56, 0xD1, 0x99, 0xA9, 0x0A, 0x6E, 0x4C, 0x55,
0x0B, 0x7C, 0x76, 0x41, 0x85, 0x9F, 0x0A, 0x92, 0x47, 0x51, 0x59, 0x4D, 0x1D, 0x88, 0x41, 0x22,
0x1C, 0x9B, 0xD8, 0xC2, 0x2A, 0xBB, 0x4B, 0x99, 0x03, 0xE3, 0xB0, 0xEC, 0xA0, 0x72, 0xA8, 0x5C,
0x0E, 0xC8, 0x0E, 0x67, 0xC7, 0x60, 0x02, 0xA6, 0xE9, 0xC1, 0x93, 0xE4, 0x74, 0x3B, 0xEE, 0xA0,
0xED, 0x2C, 0x32, 0x14, 0xD2, 0x40, 0x5D, 0x81, 0x4F, 0x3D, 0x80, 0x70, 0x50, 0x31, 0x1C, 0x94,
0xB1, 0x9C, 0x17, 0xF2, 0xC1, 0x1C, 0x04, 0x7F, 0x89, 0x43, 0x88, 0xA1, 0xCC, 0x12, 0x06, 0xC3,
0xAD, 0x1C, 0x0A, 0x9A, 0x19, 0x18, 0x7A, 0xE8, 0x53, 0xE7, 0xFC, 0xB8, 0xEE, 0x42, 0xB4, 0x15,
0x23, 0x7B, 0x77, 0x51, 0x1C, 0x18, 0x19, 0xC0, 0x45, 0xB5, 0x18, 0x2D, 0xB1, 0x21, 0x6C, 0xCD,
0xFC, 0x42, 0x66, 0x7F, 0x64, 0x83, 0x83, 0x08, 0xA7, 0x32, 0x34, 0xFE, 0x0A, 0x47, 0x82, 0x1F,
0xE4, 0x48, 0x52, 0x97, 0x25, 0x6E, 0x2D, 0x9C, 0xD9, 0x8B, 0x58, 0xDD, 0x9A, 0xBF, 0xE3, 0x01,
0x67, 0x3A, 0x46, 0x48, 0x3F, 0xBC, 0x8C, 0x5F, 0xEA, 0x80, 0x4A, 0xF5, 0x37, 0x8A, 0xC1, 0x54,
0x3A, 0x66, 0x96, 0x7F, 0xEC, 0x66, 0x61, 0xE0, 0x66, 0x04, 0xDD, 0x4C, 0x64, 0x40, 0x60, 0xFE,
0x17, 0xF7, 0xF2, 0xA7, 0x59, 0x74, 0x69, 0x93, 0xF8, 0xCF, 0x80, 0xA9, 0x40, 0x78, 0x71, 0x91,
0x8F, 0xA7, 0xCE, 0x8E, 0x22, 0x0E, 0xBB, 0x3C, 0xC1, 0xB3, 0x3F, 0xD6, 0x63, 0x76, 0x84, 0x5B,
0x93, 0x85, 0x72, 0xC2, 0x73, 0xFC, 0x30, 0x07, 0xA8, 0x0E, 0x50, 0x78, 0x00, 0xFF, 0x22, 0xB7,
0x01, 0x39, 0x5B, 0x54, 0xDD, 0xCF, 0xF6, 0x86, 0xDF, 0x64, 0xBC, 0xDB, 0xCC, 0x76, 0xAB, 0x5B,
0x99, 0x7E, 0x34, 0xC6, 0x8F, 0x81, 0xBC, 0xF3, 0x63, 0x39, 0x8A, 0x19, 0x47, 0x9B, 0x8C, 0x8A,
0x68, 0xE1, 0x97, 0x29, 0xE0, 0xFC, 0x7C, 0x8C, 0xC3, 0x19, 0x1B, 0xF4, 0xB7, 0x0F, 0xCD, 0xF6,
0x61, 0xD2, 0x8B, 0xEA, 0xC6, 0xCB, 0x0B, 0x9B, 0xEE, 0xDC, 0x6D, 0xE7, 0x6A, 0xB6, 0x7D, 0x33,
0x9B, 0x7F, 0xAC, 0x5F, 0x78, 0xAC, 0x19, 0x1F, 0x43, 0x67, 0xB7, 0x71, 0xD8, 0x60, 0xED, 0x3E,
0xB7, 0x3C, 0xE0, 0x41, 0x63, 0x9B, 0x1C, 0x0B, 0x48, 0xE7, 0xA8, 0x44, 0x84, 0x02, 0xAF, 0x83,
0x93, 0xD7, 0x46, 0x25, 0x37, 0xFC, 0x96, 0x42, 0x6E, 0xA9, 0x9B, 0xFD, 0x3E, 0x40, 0x31, 0xFB,
0xC9, 0x00, 0x3A, 0x69, 0xB5, 0x9D, 0x63, 0x50, 0xA3, 0xD7, 0xD7, 0xD7, 0x72, 0x69, 0x23, 0x67,
0x82, 0xF7, 0xB9, 0x51, 0x0E, 0x48, 0x1F, 0xD3, 0x04, 0x07, 0x76, 0xCE, 0x2C, 0x76, 0xB0, 0xD7,
0x20, 0xF1, 0x33, 0x9B, 0x16, 0x19, 0x36, 0xA6, 0x2E, 0x0E, 0xF8, 0x81, 0xF9, 0x54, 0x3E, 0x08,
0x9F, 0x30, 0x05, 0x33, 0xF6, 0x14, 0xCA, 0x1D, 0x22, 0x4A, 0xE3, 0xCB, 0x4D, 0x77, 0x12, 0xF8,
0x44, 0xD9, 0xE2, 0x9C, 0x53, 0x87, 0x94, 0x5B, 0x8B, 0x99, 0xE1, 0x4A, 0x64, 0xB6, 0xD7, 0xC3,
0xC0, 0x11, 0xBD, 0x59, 0x2C, 0x15, 0xF9, 0xAE, 0xA5, 0xE6, 0x90, 0x72, 0xCE, 0x21, 0x96, 0xE6,
0xA1, 0x88, 0x8F, 0x51, 0xAA, 0xC6, 0xC6, 0xFC, 0xE6, 0xA8, 0x7C, 0xE2, 0x52, 0xF3, 0xC6, 0x6A,
0x64, 0x3E, 0x12, 0x0F, 0xBC, 0x3E, 0xA0, 0x11, 0x8B, 0x01, 0x14, 0x4B, 0x15, 0x7F, 0xDD, 0x00,
0x41, 0xBD, 0x87, 0x3D, 0x55, 0xFF, 0x0F, 0xED, 0x5C, 0x3D, 0x8C, 0xDD, 0x56, 0x76, 0xBE, 0x24,
0x35, 0x43, 0xC0, 0x2C, 0xA8, 0x42, 0xDA, 0x4D, 0x24, 0x60, 0xB9, 0x65, 0xA2, 0xC2, 0x6C, 0x13,
0x60, 0x2D, 0x32, 0x36, 0x10, 0x97, 0x56, 0x80, 0x79, 0x76, 0xE1, 0x62, 0x52, 0x6C, 0xE1, 0x38,
0xC5, 0x34, 0x69, 0x02, 0xAC, 0x86, 0x4F, 0xEB, 0xC2, 0xE5, 0x4E, 0x82, 0x75, 0xDA, 0xA8, 0xD0,
0x02, 0xD2, 0x4B, 0xE1, 0x66, 0x8B, 0x14, 0xD2, 0x90, 0x5E, 0x15, 0x2A, 0x5C, 0xE8, 0x39, 0x80,
0xE1, 0xC2, 0x85, 0xDF, 0xC6, 0x12, 0x0C, 0xDB, 0x85, 0xB8, 0xF6, 0xD3, 0x0E, 0x47, 0x22, 0x79,
0xF7, 0x7C, 0xDF, 0xB9, 0x7C, 0x3F, 0xB2, 0xE4, 0xC8, 0xD6, 0x5A, 0x96, 0x8C, 0x0C, 0x46, 0x24,
0x87, 0xBC, 0x24, 0xCF, 0x3D, 0xF7, 0xFC, 0x7E, 0xE7, 0x50, 0xC6, 0xE0, 0xE7, 0x9F, 0xB8, 0x35,
0x69, 0x65, 0x4E, 0xDA, 0x43, 0x13, 0xD7, 0xA6, 0xB0, 0x76, 0x1E, 0xCC, 0x4D, 0x69, 0xAD, 0x3D,
0xD7, 0x9A, 0x72, 0x66, 0x92, 0x3B, 0x9D, 0x29, 0x2A, 0x63, 0xCA, 0xCE, 0x64, 0xB2, 0x8B, 0x1B,
0x93, 0x4C, 0xE5, 0x8E, 0x1E, 0x83, 0x71, 0x63, 0xD0, 0xC8, 0x2E, 0x9C, 0x7B, 0x9D, 0xE1, 0xD9,
0x12, 0xBB, 0xAC, 0x92, 0x07, 0x1A, 0x13, 0xD5, 0x11, 0xC6, 0xF8, 0xAD, 0xDF, 0xE2, 0x6C, 0xA9,
0x17, 0xD3, 0xB5, 0x8B, 0x41, 0xEB, 0xB5, 0x7A, 0x67, 0x96, 0xE3, 0xCE, 0xDC, 0x3D, 0xD6, 0xC7,
0xF3, 0xE2, 0x19, 0xDF, 0x29, 0x03, 0x43, 0x19, 0x14, 0xC9, 0x9B, 0xCA, 0xA9, 0x89, 0x71, 0x68,
0x27, 0x25, 0x6E, 0x13, 0x6A, 0xF1, 0x7A, 0xCF, 0xDA, 0x19, 0xE7, 0x31, 0x32, 0x6B, 0x3F, 0x7C,
0x11, 0xDE, 0x3A, 0xCA, 0x85, 0xCC, 0xC2, 0xCE, 0xE2, 0x2A, 0x92, 0xF9, 0x09, 0x95, 0x37, 0x77,
0x6C, 0x1D, 0x36, 0x26, 0x96, 0xD7, 0x8E, 0xE5, 0x35, 0xA0, 0x21, 0xA9, 0x40, 0x50, 0x96, 0xCB,
0x09, 0xD3, 0x09, 0x3D, 0x26, 0x68, 0x84, 0x11, 0x72, 0x31, 0x96, 0xF9, 0x66, 0x63, 0x9C, 0xEE,
0xCD, 0xBE, 0x9C, 0x9E, 0x63, 0x3A, 0xF1, 0x34, 0xA8, 0xF1, 0x68, 0x21, 0x57, 0x1E, 0xAD, 0x84,
0x26, 0x87, 0xAF, 0x0A, 0xD5, 0x89, 0xB5, 0x53, 0x50, 0x08, 0xC2, 0xCC, 0xD6, 0x82, 0x96, 0x4B,
0xBA, 0xEB, 0x77, 0x0D, 0x5E, 0xD5, 0x81, 0x15, 0xC9, 0x3B, 0x2D, 0x77, 0x57, 0x1B, 0xEE, 0x3E,
0xAC, 0xB9, 0xB3, 0x15, 0x77, 0x1D, 0xB9, 0x95, 0x54, 0xDF, 0xC9, 0xAE, 0x50, 0xE6, 0x60, 0x27,
0xF3, 0xC2, 0xD4, 0x84, 0xFB, 0xA9, 0x90, 0x6D, 0xB9, 0xC2, 0xA1, 0x4C, 0x23, 0xB0, 0x9F, 0x95,
0x98, 0x82, 0x55, 0xDE, 0x9E, 0xB4, 0x3D, 0xE9, 0x3F, 0x9E, 0xAF, 0xB3, 0x18, 0xCC, 0xC1, 0xFA,
0x63, 0xEB, 0xB5, 0xF2, 0x94, 0xB0, 0xEE, 0xE5, 0x9C, 0xD7, 0x96, 0x60, 0x5E, 0x61, 0x73, 0x72,
0x04, 0x8F, 0x97, 0x31, 0xBC, 0x60, 0x78, 0x01, 0x3C, 0x06, 0x25, 0xBC, 0xE3, 0x6B, 0x2F, 0xF8,
0x7A, 0xC1, 0xF2, 0x57, 0x24, 0x51, 0xC8, 0x2C, 0x84, 0xE9, 0xF6, 0xE5, 0xBE, 0xC5, 0x0B, 0xFA,
0x4C, 0x24, 0xCC, 0x76, 0xB1, 0x2C, 0xB5, 0x77, 0x66, 0x85, 0xB0, 0xD7, 0xCC, 0xE6, 0x78, 0x10,
0x83, 0x3C, 0x1D, 0xA8, 0x8E, 0x67, 0xFD, 0x30, 0x20, 0xB8, 0xDB, 0x2C, 0x06, 0x3B, 0xF1, 0xC1,
0x4F, 0x51, 0x2D, 0x0E, 0x8F, 0x9B, 0x07, 0xFC, 0x14, 0xF6, 0x8E, 0x3C, 0x30, 0x16, 0xD6, 0x74,
0x22, 0x81, 0x9D, 0x1E, 0xF6, 0x72, 0x28, 0x2B, 0xAF, 0x87, 0x66, 0xA3, 0x24, 0x4B, 0x82, 0x56,
0x26, 0x14, 0x75, 0xCA, 0xA3, 0x02, 0x92, 0x4A, 0x2A, 0x6A, 0x70, 0xBE, 0x18, 0x73, 0x15, 0x8A,
0x41, 0x50, 0x8B, 0x1C, 0x87, 0xD4, 0x2E, 0xCB, 0xA5, 0x11, 0xA9, 0xC2, 0xEC, 0x0B, 0x6A, 0x0B,
0x99, 0x3C, 0x1C, 0x42, 0x51, 0xF1, 0xC8, 0x7A, 0xB1, 0x8C, 0x38, 0x2C, 0xF2, 0xC5, 0x00, 0x6B,
0x86, 0x43, 0x08, 0xAB, 0x3B, 0x14, 0x81, 0x1F, 0x9E, 0x0B, 0x2D, 0x73, 0x6F, 0xC3, 0xBB, 0x29,
0x08, 0x15, 0x29, 0x72, 0x94, 0x81, 0x4E, 0xA5, 0x97, 0xCA, 0xAB, 0xB3, 0xC0, 0x03, 0xE4, 0xD0,
0x93, 0xB9, 0x51, 0x4D, 0x75, 0xC6, 0xA9, 0x6C, 0xAD, 0x1C, 0x0A, 0x67, 0xDD, 0x61, 0xBF, 0xE7,
0x0E, 0x95, 0x5D, 0xFE, 0xDE, 0x60, 0x67, 0xCC, 0xAE, 0x29, 0x42, 0x6B, 0x2F, 0x90, 0x9E, 0x52,
0xD4, 0xD6, 0x82, 0x4B, 0x65, 0xE9, 0x9E, 0x24, 0xCC, 0x93, 0xA5, 0xF7, 0x76, 0xC0, 0x2F, 0x9B,
0x63, 0x4A, 0xA2, 0xEF, 0x66, 0x23, 0x87, 0x7A, 0x86, 0xAD, 0xB2, 0x7E, 0x60, 0x1C, 0x64, 0x44,
0x1E, 0xE2, 0xCB, 0x8D, 0x1F, 0xC8, 0x40, 0xB1, 0x3F, 0x62, 0xB3, 0x6E, 0xB7, 0x94, 0xE8, 0x8D,
0xD1, 0x2B, 0xED, 0xC0, 0x09, 0xD3, 0x61, 0x20, 0x27, 0x61, 0xC3, 0xDA, 0x3D, 0xA1, 0xA4, 0xD1,
0xC1, 0x85, 0x2C, 0x1F, 0x06, 0x66, 0xE3, 0x61, 0x60, 0x5A, 0x71, 0x60, 0x09, 0xF6, 0x78, 0xFA,
0x44, 0xF0, 0xCC, 0xF1, 0x4B, 0xC6, 0x62, 0xA0, 0x30, 0x20, 0xE4, 0x2F, 0xB8, 0x22, 0x02, 0xEA,
0x68, 0x0C, 0x9A, 0x81, 0x59, 0x3E, 0x6D, 0x8A, 0xC1, 0x64, 0xE4, 0x37, 0xB4, 0x14, 0x14, 0x3B,
0x99, 0xFC, 0xC6, 0xD2, 0x68, 0x65, 0x94, 0x18, 0x70, 0x0A, 0x12, 0x33, 0x26, 0x9B, 0xBC, 0xF3,
0xE6, 0x84, 0x4E, 0x32, 0x9A, 0x46, 0x53, 0x5D, 0xD5, 0xEC, 0x8D, 0xC6, 0xCD, 0xBB, 0xA7, 0xE8,
0x86, 0x90, 0xFD, 0xB1, 0x3B, 0x95, 0xD4, 0xEE, 0x94, 0x33, 0x34, 0x85, 0x72, 0x79, 0xE3, 0x0C,
0x27, 0x00, 0x2B, 0x24, 0x42, 0x27, 0x6F, 0x6A, 0x03, 0x6B, 0x3F, 0xA9, 0x65, 0x63, 0x2B, 0xFB,
0xFE, 0x8E, 0x35, 0xC7, 0x85, 0x41, 0xE9, 0x0C, 0x7A, 0x24, 0xF7, 0x08, 0xC9, 0xBE, 0xA5, 0x2A,
0x17, 0x9C, 0x96, 0xCC, 0xC1, 0x89, 0x90, 0xB0, 0xA0, 0x77, 0x02, 0x37, 0x85, 0x30, 0x16, 0xB8,
0xC6, 0xD9, 0xA8, 0xED, 0x9B, 0x2A, 0x11, 0x15, 0x46, 0x85, 0x83, 0x21, 0x04, 0xDF, 0xF4, 0x57,
0x39, 0x15, 0xF2, 0x59, 0x50, 0x61, 0x61, 0xA3, 0x10, 0x2C, 0x63, 0xFD, 0x5E, 0xF8, 0x41, 0xC1,
0x8B, 0xFB, 0x57, 0xEF, 0xD6, 0x41, 0x3F, 0x99, 0x8C, 0x33, 0xDB, 0x65, 0x10, 0x03, 0x91, 0x77,
0xFB, 0x42, 0x0D, 0x76, 0x55, 0x0B, 0x05, 0xE4, 0xB4, 0xAE, 0x70, 0xDB, 0x3D, 0x11, 0x5B, 0x08,
0xFB, 0xDA, 0x96, 0x64, 0xAE, 0x6C, 0xD5, 0xA9, 0x51, 0x66, 0x13, 0x5B, 0x73, 0x8B, 0xF5, 0x8C,
0xFB, 0x55, 0x33, 0xF2, 0x73, 0x3E, 0x8D, 0x92, 0xEA, 0x75, 0xCB, 0x63, 0x77, 0xDE, 0x7C, 0x65,
0xDB, 0x7E, 0xE7, 0x5B, 0xCC, 0x65, 0x6D, 0xCB, 0x97, 0x3F, 0x60, 0xAB, 0x73, 0x0C, 0xB0, 0x0D,
0xA9, 0xC7, 0x21, 0xCD, 0x68, 0x60, 0xF3, 0xD7, 0xE8, 0x17, 0x7E, 0xDE, 0x99, 0xF8, 0xA3, 0xA9,
0xD7, 0xC9, 0xEE, 0x3A, 0xFF, 0xA2, 0xC0, 0xE8, 0xAE, 0xD5, 0x93, 0x8F, 0xB2, 0xAB, 0x48, 0xC6,
0x72, 0x07, 0x72, 0xB2, 0x0A, 0x94, 0x14, 0x3D, 0x88, 0x80, 0x95, 0x08, 0xC4, 0x2F, 0x6F, 0xCF,
0x49, 0x6A, 0xFC, 0x81, 0x9A, 0xB4, 0xE0, 0x36, 0xA8, 0x14, 0xB9, 0xEC, 0x0A, 0x15, 0xE4, 0x6C,
0xBB, 0xAC, 0x74, 0xC0, 0x27, 0x8D, 0x0E, 0x80, 0x3B, 0xC6, 0x80, 0x5D, 0xD5, 0xF1, 0x6C, 0xFB,
0x5C, 0xAF, 0x03, 0x66, 0x34, 0xB6, 0x32, 0x40, 0x26, 0xCD, 0x27, 0x88, 0xC9, 0xE5, 0x80, 0x2A,
0xAE, 0x39, 0x00, 0xD2, 0x8D, 0x01, 0x72, 0x79, 0xAA, 0x03, 0x82, 0x56, 0x07, 0x88, 0xF0, 0xEB,
0x80, 0x68, 0x9E, 0x71, 0x80, 0xB1, 0x31, 0x07, 0x98, 0xE4, 0x63, 0x1D, 0xE0, 0x77, 0x3A, 0x40,
0xF4, 0x55, 0x07, 0x84, 0x56, 0x07, 0x98, 0x52, 0x07, 0x20, 0xF2, 0xE1, 0x00, 0x4F, 0xD5, 0x69,
0x45, 0xE6, 0xE4, 0xA6, 0xB5, 0x90, 0x47, 0xF6, 0xEA, 0xD1, 0x54, 0xF8, 0xF0, 0x2C, 0xDD, 0x7B,
0x2B, 0x9E, 0xCE, 0xFD, 0xFC, 0x65, 0x82, 0x53, 0x12, 0xD6, 0x5D, 0xEB, 0xD4, 0xF4, 0xDC, 0x96,
0xF7, 0xC2, 0x0C, 0xB7, 0x45, 0x43, 0x06, 0xFD, 0x45, 0x62, 0x73, 0x35, 0x6F, 0xB7, 0xD4, 0x6B,
0x78, 0x87, 0xBD, 0x1A, 0xCF, 0xDD, 0x94, 0xEA, 0x5D, 0x24, 0x6F, 0xB4, 0x18, 0x90, 0x5C, 0x9B,
0x09, 0xD3, 0x0B, 0x13, 0xFE, 0xA1, 0xA1, 0xEA, 0x7B, 0xED, 0xAE, 0x68, 0x3E, 0x07, 0x54, 0xB4,
0xA4, 0xC9, 0xB5, 0x3A, 0x68, 0x39, 0xA0, 0xA5, 0xB9, 0x95, 0x57, 0x88, 0x57, 0xD3, 0x01, 0xC6,
0xEA, 0x00, 0x31, 0x21, 0x19, 0x07, 0xF8, 0xE2, 0xD3, 0x31, 0xC0, 0x64, 0x57, 0x75, 0x40, 0xD8,
0xE8, 0x00, 0x53, 0xEA, 0x13, 0xC4, 0x70, 0xEA, 0x00, 0xCF, 0xEA, 0x00, 0x93, 0xBA, 0x01, 0x81,
0xD5, 0x01, 0xE2, 0xCC, 0x55, 0x48, 0x97, 0xA6, 0x91, 0x74, 0x0F, 0x46, 0x73, 0x29, 0xC5, 0x2B,
0x03, 0x32, 0x0D, 0x1B, 0x52, 0x5B, 0x39, 0x13, 0x3A, 0x73, 0x9C, 0xDB, 0x73, 0x03, 0xCE, 0xEB,
0x79, 0xBD, 0x3F, 0xD3, 0x51, 0xFB, 0x7A, 0xE9, 0xCC, 0x3D, 0xBC, 0x65, 0xB4, 0xD4, 0x26, 0x22,
0x93, 0xFE, 0xDD, 0x2F, 0xE0, 0xEC, 0xA2, 0x5B, 0xB7, 0xDE, 0xDF, 0xA9, 0x4D, 0x2A, 0x1E, 0x54,
0xD8, 0xBE, 0x2F, 0x86, 0x5C, 0x42, 0xDD, 0xBB, 0x74, 0xD1, 0x11, 0xB8, 0xDB, 0xCA, 0xA5, 0xB1,
0x91, 0xD0, 0x72, 0xBF, 0x87, 0x50, 0xFB, 0x77, 0x61, 0x36, 0xE5, 0xD2, 0x54, 0x2F, 0xE5, 0xBC,
0xD4, 0x7D, 0xAB, 0x4B, 0xEA, 0x8A, 0x35, 0xE6, 0x89, 0x74, 0x4E, 0xE9, 0x78, 0x85, 0xF8, 0x40,
0x2F, 0x31, 0xFE, 0x30, 0x77, 0xE9, 0xBA, 0x03, 0x95, 0x9A, 0x48, 0x68, 0x39, 0x91, 0x8B, 0x73,
0x82, 0x5B, 0x9A, 0x61, 0x24, 0x79, 0xA4, 0xFE, 0x28, 0x23, 0xFF, 0xD4, 0x11, 0x79, 0xF9, 0xBD,
0xC2, 0xA5, 0x2F, 0x62, 0xB0, 0x60, 0x92, 0xF9, 0x72, 0xFC, 0x69, 0x6E, 0xAF, 0xEC, 0xD2, 0x98,
0x64, 0x43, 0xEC, 0x28, 0x62, 0x8D, 0xE5, 0x09, 0x6A, 0x68, 0x75, 0x34, 0xC3, 0xCD, 0xF1, 0x14,
0x0B, 0x95, 0x54, 0x10, 0xF8, 0x74, 0x0C, 0xF2, 0x33, 0x2E, 0x59, 0x39, 0x1A, 0x75, 0x0C, 0x4E,
0x2D, 0xA2, 0x7F, 0xD9, 0xFA, 0xE2, 0x44, 0xCA, 0x31, 0x86, 0x25, 0x74, 0xDF, 0xEA, 0xB1, 0xA2,
0x1A, 0x0F, 0x0C, 0x6B, 0xA8, 0x85, 0x90, 0x9D, 0xC3, 0xC1, 0xAB, 0x0D, 0x27, 0xF1, 0xBD, 0x7F,
0xDE, 0x9C, 0x92, 0x27, 0x8A, 0x4A, 0x22, 0x3A, 0x2B, 0x84, 0x55, 0xA1, 0x08, 0xBB, 0x91, 0x35,
0x90, 0xB0, 0xC3, 0xCD, 0x61, 0x04, 0x35, 0xEA, 0xE0, 0x46, 0x67, 0xD1, 0xCD, 0x93, 0xAD, 0xD1,
0x80, 0x19, 0xEB, 0xAF, 0xC1, 0x01, 0x85, 0x6A, 0xB3, 0xB4, 0xB5, 0x44, 0xFE, 0x6D, 0x7A, 0x67,
0xAB, 0x10, 0xDD, 0x4B, 0xAE, 0xCF, 0x4C, 0xF8, 0xA5, 0x44, 0x05, 0x1D, 0x68, 0x95, 0xF7, 0x66,
0xD7, 0x45, 0x46, 0xBF, 0xB0, 0xA3, 0xBE, 0xCD, 0x6C, 0x9F, 0x4A, 0xC0, 0x1A, 0x55, 0x08, 0x57,
0x2F, 0x9A, 0x67, 0xB6, 0x2B, 0xC9, 0x03, 0x44, 0x41, 0x6E, 0x55, 0xBE, 0xF8, 0x88, 0x6C, 0xB6,
0x0C, 0x63, 0xC5, 0x09, 0x4A, 0x78, 0x53, 0x9D, 0x14, 0xC9, 0x53, 0x37, 0x2B, 0xF3, 0xF2, 0x5A,
0xF3, 0x6D, 0xFF, 0xD8, 0xB9, 0x21, 0x9C, 0xAA, 0x84, 0x4E, 0x09, 0x8D, 0xDF, 0x98, 0xFB, 0x73,
0xC4, 0xC2, 0x99, 0xCC, 0x54, 0x04, 0x1C, 0x8E, 0x6A, 0x19, 0xED, 0xD2, 0x57, 0xE7, 0x8F, 0xBA,
0x43, 0xFC, 0x7D, 0x91, 0x16, 0x8A, 0xA9, 0xDC, 0x54, 0x13, 0x44, 0x6E, 0x13, 0x32, 0xDF, 0xB7,
0x0F, 0x88, 0xB2, 0x77, 0xEC, 0x0D, 0xE6, 0x74, 0xC2, 0x0E, 0x84, 0x77, 0xBD, 0x6C, 0xC5, 0xAC,
0xD4, 0x88, 0x9D, 0x25, 0x72, 0xB0, 0xD4, 0xBA, 0x22, 0xE7, 0x82, 0x42, 0xFB, 0x4A, 0x2C, 0xB4,
0x49, 0x3E, 0x80, 0x78, 0x05, 0x77, 0x28, 0x58, 0x56, 0x33, 0xCD, 0x5B, 0x4C, 0x34, 0xEF, 0x32,
0x09, 0xED, 0x35, 0x07, 0x5D, 0xB9, 0x10, 0x1F, 0x30, 0x01, 0x6D, 0x48, 0x52, 0xA7, 0x8F, 0x8A,
0xE6, 0xB4, 0x00, 0x78, 0x47, 0x3A, 0x85, 0x50, 0xA7, 0x33, 0x5F, 0x04, 0x42, 0x02, 0xA5, 0xD4,
0x4E, 0x44, 0x1B, 0x3C, 0x4D, 0x87, 0x42, 0x8D, 0xD8, 0x3C, 0x44, 0x5D, 0x22, 0x42, 0x7F, 0x2D,
0x5C, 0x66, 0x30, 0x28, 0x5C, 0x0E, 0xF1, 0xBA, 0x08, 0x42, 0x14, 0x43, 0xA1, 0x16, 0x52, 0xE4,
0x8D, 0x38, 0xA7, 0x31, 0x02, 0xE3, 0xA9, 0x6F, 0xDF, 0x2A, 0xA7, 0x09, 0x92, 0x46, 0x79, 0x53,
0xF6, 0x26, 0x6C, 0x1A, 0x24, 0x14, 0x42, 0x19, 0x1C, 0xC8, 0x6D, 0x31, 0x54, 0x37, 0x13, 0x69,
0xA4, 0x92, 0x05, 0x77, 0x70, 0x8A, 0xAE, 0x81, 0xF9, 0x90, 0x0C, 0x15, 0x23, 0x89, 0x18, 0xBD,
0xB8, 0xB9, 0xC3, 0x94, 0x5D, 0x92, 0x37, 0x90, 0x45, 0xC9, 0x79, 0xCD, 0x3C, 0x33, 0x86, 0xF4,
0xC3, 0xD7, 0x62, 0xC3, 0x67, 0xA9, 0xDD, 0x4F, 0x31, 0xE1, 0xB5, 0x2C, 0xC9, 0x24, 0x63, 0x47,
0xB2, 0x47, 0x06, 0x15, 0x4C, 0x10, 0xC1, 0x9E, 0x3F, 0xE3, 0x49, 0x66, 0x38, 0x1F, 0xC1, 0x81,
0x7D, 0x0C, 0x8F, 0x32, 0x87, 0x41, 0x6A, 0x35, 0xCD, 0xB4, 0x77, 0xDE, 0xEE, 0x10, 0x00, 0x77,
0x48, 0x26, 0x1A, 0x67, 0x31, 0xA9, 0x94, 0x71, 0x25, 0x46, 0x20, 0x7B, 0x51, 0x54, 0xA8, 0x67,
0xF8, 0x9C, 0x3B, 0x9F, 0xB6, 0xCC, 0xA8, 0x35, 0x5F, 0x44, 0x9E, 0xF8, 0xE5, 0xB7, 0x39, 0x88,
0x70, 0x60, 0x91, 0xB6, 0x7F, 0x21, 0x99, 0x8D, 0x8D, 0x3B, 0x89, 0x44, 0x99, 0x4E, 0x96, 0x12,
0x7F, 0x2E, 0xA5, 0x32, 0x86, 0x18, 0x06, 0x4C, 0x54, 0x26, 0x93, 0x8B, 0x6B, 0x72, 0x3A, 0x0F,
0xA6, 0x2E, 0x95, 0x48, 0x90, 0xC5, 0xF9, 0x7B, 0xCF, 0xAC, 0xDA, 0xBF, 0xDD, 0xEF, 0x80, 0x93,
0xF7, 0x9C, 0x84, 0x71, 0x81, 0x37, 0x14, 0xC1, 0xF8, 0x15, 0x82, 0x9A, 0xFF, 0x81, 0xF9, 0xAF,
0xC5, 0x84, 0x24, 0x73, 0xA4, 0xEF, 0x73, 0xD8, 0xAC, 0xF9, 0x80, 0x8E, 0x00, 0x1B, 0x19, 0x8D,
0xB6, 0x30, 0x21, 0x71, 0xB6, 0x12, 0x67, 0x6F, 0x8C, 0x46, 0x2B, 0xF4, 0x9E, 0xF5, 0x1A, 0xB1,
0x69, 0x22, 0x5A, 0xFB, 0x62, 0x64, 0xBD, 0x7C, 0x63, 0x79, 0xE5, 0x5B, 0x73, 0x98, 0x07, 0x30,
0x7E, 0xF1, 0x97, 0x12, 0x1F, 0x58, 0x26, 0xEE, 0xF6, 0xFD, 0xB2, 0x14, 0xED, 0xF9, 0xB8, 0x96,
0xD4, 0x24, 0x1B, 0x64, 0x71, 0xB4, 0xF0, 0xA4, 0xDC, 0x30, 0x86, 0xA1, 0x9F, 0x8E, 0x87, 0x14,
0xDE, 0x3C, 0x67, 0xE6, 0x2E, 0x59, 0x0E, 0x69, 0xD2, 0x2F, 0xF8, 0x7B, 0x4F, 0xB8, 0x14, 0x8B,
0x40, 0x5C, 0x74, 0xC9, 0x2A, 0x0C, 0x14, 0x23, 0xB6, 0x2B, 0x78, 0xF0, 0x60, 0xDD, 0xA7, 0x42,
0x75, 0x29, 0x59, 0x62, 0x34, 0x13, 0x3F, 0x7C, 0x6C, 0x25, 0x76, 0xF8, 0xAE, 0xE5, 0x7A, 0xC5,
0x42, 0xF4, 0x09, 0xB3, 0x6E, 0x62, 0x0E, 0xD8, 0x24, 0xB3, 0xA7, 0x99, 0xE1, 0xC4, 0x7A, 0xC4,
0x10, 0xEF, 0x0B, 0x57, 0xFD, 0xD6, 0xC2, 0x0E, 0x23, 0xC5, 0x87, 0xD5, 0xBB, 0xF8, 0xBD, 0x8B,
0x39, 0x49, 0x24, 0x82, 0x62, 0x60, 0xD8, 0x5D, 0x00, 0xC9, 0x60, 0x24, 0x7C, 0x9A, 0xB9, 0x3E,
0x19, 0xA6, 0xC5, 0xC8, 0xB1, 0x18, 0xD2, 0x43, 0x7F, 0xFA, 0x7D, 0x8B, 0xF9, 0xF1, 0x2D, 0x04,
0x6E, 0x7D, 0x8E, 0x28, 0x71, 0x1C, 0x1C, 0xBE, 0x6C, 0xC7, 0x47, 0x1C, 0xEB, 0xED, 0x90, 0x39,
0x31, 0xE6, 0xE5, 0x42, 0x24, 0xBF, 0x9B, 0x4C, 0x26, 0x16, 0x50, 0x8C, 0x04, 0x68, 0xD6, 0xD6,
0x1D, 0x71, 0x59, 0x89, 0x8D, 0xE5, 0x2A, 0xA3, 0xD2, 0xB4, 0xCA, 0x2A, 0x4F, 0xA2, 0xC0, 0x9B,
0xC5, 0x0C, 0xA8, 0x23, 0x12, 0x84, 0xE9, 0x9A, 0x33, 0x8D, 0x1C, 0xEE, 0x8B, 0xED, 0xE6, 0x64,
0xB2, 0xB7, 0x1E, 0xD3, 0xF8, 0xB3, 0x68, 0x3C, 0x2C, 0xAA, 0x6E, 0xFD, 0x69, 0x94, 0x3F, 0x65,
0xD1, 0x32, 0xFD, 0x87, 0xB0, 0x87, 0x3E, 0xC4, 0x1B, 0x8D, 0x96, 0x93, 0x97, 0x55, 0xCE, 0x7D,
0x64, 0x7D, 0x50, 0xAB, 0x0D, 0x59, 0x66, 0x8D, 0x79, 0xB6, 0x20, 0x29, 0x73, 0x2E, 0x40, 0xFA,
0xEB, 0x9D, 0xDA, 0xC7, 0x33, 0xD4, 0xBE, 0x33, 0xFD, 0x52, 0x64, 0xF1, 0x84, 0x3C, 0x4C, 0x62,
0x98, 0xBA, 0xFC, 0xF4, 0x1F, 0x5A, 0x09, 0x47, 0x0B, 0xC0, 0x44, 0x92, 0xE3, 0x87, 0x07, 0x00,
0x2F, 0x3B, 0x2E, 0xB2, 0x67, 0xDF, 0xED, 0x5E, 0xB9, 0x5B, 0x5B, 0xDB, 0x5C, 0x16, 0x85, 0x4A,
0x35, 0xAA, 0x52, 0x26, 0xAF, 0xB2, 0x7D, 0xED, 0x27, 0x9C, 0x2E, 0x99, 0xA9, 0xDB, 0x70, 0x6A,
0x7E, 0x18, 0x0C, 0x7F, 0xD6, 0x69, 0x1B, 0x61, 0x77, 0x90, 0x7A, 0xC4, 0x3C, 0x0E, 0x86, 0x9B,
0x45, 0xC8, 0xC0, 0x18, 0x62, 0x65, 0xBF, 0x1E, 0x4A, 0xAC, 0x18, 0x2C, 0x86, 0xEF, 0x04, 0x3B,
0x09, 0x06, 0x17, 0x6E, 0xDF, 0x6B, 0x96, 0xE9, 0xB5, 0x71, 0xA5, 0xA9, 0xA7, 0xEE, 0xC3, 0x5A,
0xF7, 0xF1, 0x4C, 0xF7, 0x49, 0xA5, 0xFB, 0x74, 0xAC, 0xFB, 0xCC, 0xC4, 0xAE, 0xA2, 0x13, 0xDF,
0x14, 0xC6, 0x18, 0x5A, 0x23, 0x98, 0x7A, 0xDD, 0x0B, 0x77, 0x79, 0x3E, 0xBA, 0x3D, 0xDA, 0xAE,
0x94, 0x3A, 0x92, 0x97, 0xBA, 0x7D, 0xF6, 0xD9, 0xA4, 0xAC, 0xD4, 0x46, 0xF1, 0x39, 0xBD, 0xEE,
0x3D, 0x07, 0x23, 0xC1, 0x18, 0xC4, 0x8E, 0x53, 0xD8, 0x63, 0x81, 0xF0, 0x08, 0xA2, 0xBD, 0xB2,
0x47, 0xD6, 0x17, 0x93, 0xFE, 0x61, 0xBA, 0x78, 0xE9, 0x0A, 0x17, 0xB0, 0x58, 0x6B, 0xB9, 0xFF,
0x86, 0xAC, 0x57, 0x69, 0xA7, 0x89, 0x85, 0xC9, 0xB0, 0x6F, 0xCA, 0xB0, 0xE0, 0xF0, 0xC7, 0x7D,
0xFF, 0xF7, 0xBD, 0x28, 0x88, 0xA4, 0x08, 0x5C, 0x3E, 0x89, 0xD6, 0xB8, 0xFA, 0xAD, 0xCB, 0x26,
0x2B, 0xA2, 0x64, 0x40, 0xD5, 0x3A, 0x73, 0x12, 0xEC, 0xB2, 0x53, 0x42, 0xE9, 0xB6, 0x8B, 0xFB,
0x2D, 0x99, 0xC1, 0xE4, 0xDF, 0x7B, 0x35, 0x5B, 0x28, 0xDC, 0x54, 0xB4, 0xA2, 0x81, 0x43, 0xE8,
0x8B, 0x29, 0xFF, 0x8C, 0x99, 0x21, 0x8D, 0x01, 0x2B, 0x78, 0xCF, 0xDB, 0x97, 0xFB, 0xE4, 0xCE,
0xAB, 0x8D, 0x90, 0x38, 0x2E, 0x20, 0x14, 0xA2, 0x26, 0xA5, 0x90, 0x83, 0xF5, 0x5C, 0x29, 0xE5,
0x44, 0x30, 0x93, 0x5C, 0x1D, 0xC3, 0xD2, 0x1F, 0x93, 0xC2, 0x48, 0xC2, 0x44, 0xC6, 0x5F, 0xE5,
0x78, 0x89, 0x8B, 0xA4, 0x6E, 0x81, 0x06, 0x03, 0xBE, 0x00, 0x50, 0xCA, 0x01, 0x7E, 0xDA, 0x9C,
0x5C, 0x42, 0xD9, 0xC1, 0xDA, 0x5F, 0x42, 0x0F, 0xEC, 0x4C, 0x2E, 0x1C, 0x7F, 0xA5, 0xE1, 0x7D,
0x3D, 0x85, 0x30, 0x1B, 0x0B, 0xE3, 0x4F, 0xBD, 0x7D, 0x07, 0xB6, 0xDB, 0xDA, 0x77, 0xE7, 0xC8,
0xA6, 0x6A, 0xA5, 0x39, 0x61, 0xC1, 0x0D, 0xE9, 0x9E, 0x4C, 0x51, 0x32, 0xAE, 0xB7, 0x7B, 0x55,
0x9F, 0xB1, 0xD9, 0xB4, 0xF6, 0xD0, 0x65, 0x51, 0x86, 0x7C, 0xA5, 0x9D, 0x0F, 0xE0, 0x62, 0x63,
0x48, 0x2A, 0xD1, 0x6C, 0x02, 0xCC, 0x04, 0xB1, 0x89, 0x3E, 0x13, 0x95, 0xE6, 0xA6, 0x5B, 0x1C,
0x71, 0xC3, 0xAB, 0x1C, 0xC7, 0x3B, 0x78, 0xAF, 0x22, 0xD1, 0x80, 0xC9, 0x85, 0x0F, 0x2F, 0x4A,
0xA6, 0xA7, 0x18, 0x3A, 0xD1, 0x6B, 0xC8, 0x30, 0x79, 0xA3, 0xD2, 0x9B, 0x4C, 0x7F, 0x22, 0x29,
0x61, 0x95, 0xD8, 0xD2, 0x62, 0x06, 0xC2, 0xE6, 0x12, 0xE0, 0x90, 0x96, 0x39, 0xC2, 0x19, 0x6E,
0x89, 0x58, 0xCB, 0xD3, 0xD4, 0x33, 0xD6, 0x9A, 0x0F, 0x99, 0xB5, 0x71, 0x8F, 0x9A, 0xC8, 0x9D,
0x37, 0x1C, 0xE3, 0x23, 0xD6, 0x05, 0xE4, 0xCF, 0xB0, 0x8A, 0xDB, 0x05, 0xDB, 0xB9, 0xB6, 0x8E,
0xEB, 0xFD, 0xB2, 0xD4, 0x96, 0x54, 0x0B, 0x9E, 0x6B, 0x71, 0x55, 0x59, 0xFE, 0x76, 0x85, 0xA5,
0x2C, 0x21, 0xF2, 0x4C, 0x84, 0xE3, 0x4F, 0xE6, 0x43, 0x72, 0x60, 0x7A, 0x4A, 0x4B, 0x83, 0xC4,
0x39, 0x9E, 0x21, 0x9D, 0xCA, 0xCE, 0x61, 0xDB, 0x2B, 0xB7, 0x7D, 0x7B, 0x67, 0x62, 0x67, 0x8E,
0xD9, 0x3B, 0x96, 0x19, 0xF8, 0xC8, 0xCD, 0x29, 0x1D, 0x8B, 0xE7, 0x2E, 0xF1, 0x86, 0xBE, 0x75,
0xD3, 0xC9, 0xA6, 0x2B, 0x68, 0x17, 0x96, 0x03, 0x71, 0x0E, 0x57, 0xC3, 0xBE, 0x5F, 0x94, 0x12,
0x45, 0x16, 0x5F, 0xA2, 0xAA, 0x00, 0x1E, 0x83, 0x07, 0x65, 0xEF, 0x80, 0x34, 0x62, 0xAE, 0x30,
0xD5, 0x45, 0xEF, 0xF0, 0x62, 0x44, 0x21, 0x11, 0x32, 0x71, 0xE8, 0x57, 0xF2, 0x87, 0x9E, 0xBE,
0xFC, 0x15, 0x5B, 0x67, 0xA8, 0xA2, 0x71, 0x25, 0x8E, 0x2F, 0x0A, 0x5C, 0x44, 0xAA, 0xA0, 0x1E,
0x7E, 0x2B, 0x2B, 0x50, 0x9E, 0xB3, 0x77, 0x09, 0xBA, 0x34, 0xA2, 0x28, 0x12, 0xCC, 0x21, 0x6B,
0x44, 0xFD, 0x16, 0x08, 0x04, 0x4C, 0x29, 0xF3, 0x67, 0xAD, 0x95, 0xB0, 0xA8, 0xB7, 0xCE, 0x7B,
0x70, 0xB0, 0x78, 0x11, 0x80, 0xE6, 0x39, 0x00, 0xC7, 0x63, 0x00, 0x8D, 0x15, 0xEA, 0x8E, 0x30,
0xCF, 0x19, 0x70, 0x43, 0x82, 0xBD, 0xB2, 0x49, 0x2A, 0x09, 0xE9, 0xC4, 0x67, 0xA3, 0x46, 0x09,
0xBB, 0x55, 0x20, 0x48, 0x4E, 0xAE, 0x37, 0x84, 0x01, 0x72, 0x11, 0x50, 0xC2, 0xA2, 0xEF, 0x59,
0x3C, 0x53, 0x44, 0x29, 0xAC, 0x83, 0x0E, 0x4A, 0x81, 0x7A, 0x1A, 0x02, 0x23, 0x54, 0x5D, 0x11,
0x94, 0x12, 0x22, 0xD6, 0xCA, 0x5E, 0x32, 0x4B, 0x80, 0xF7, 0x62, 0x4A, 0xD9, 0x3B, 0x2D, 0x16,
0x99, 0xD5, 0xCA, 0x60, 0xEE, 0xCF, 0x87, 0x12, 0x65, 0xC6, 0xD5, 0x67, 0xE2, 0xA6, 0x95, 0xAF,
0x15, 0x98, 0xE4, 0xC4, 0x52, 0xF9, 0x58, 0x34, 0x7F, 0x98, 0x43, 0x21, 0x24, 0xCB, 0xBD, 0x1E,
0x87, 0x30, 0x1C, 0xB9, 0x68, 0x70, 0x30, 0x87, 0x1D, 0xC9, 0x72, 0x8B, 0x01, 0x10, 0x8E, 0xEC,
0x25, 0x60, 0xA7, 0x7F, 0xA4, 0x19, 0x2A, 0x91, 0xB2, 0x10, 0xE5, 0xC8, 0xFE, 0xB7, 0xA3, 0x85,
0xD6, 0xE2, 0x78, 0x25, 0x63, 0xE5, 0x31, 0x72, 0x18, 0xCD, 0xF9, 0x30, 0x56, 0x6A, 0xED, 0xE2,
0x15, 0xAC, 0x22, 0x3F, 0x6D, 0x30, 0x8E, 0x22, 0x9F, 0xBA, 0xBD, 0xCC, 0xED, 0x69, 0xCD, 0xFD,
0x69, 0xF2, 0x02, 0x45, 0x7A, 0x15, 0x0B, 0x8D, 0xDB, 0x15, 0xE5, 0x7D, 0x0C, 0x90, 0x0E, 0x24,
0xC2, 0xC4, 0xB9, 0xF3, 0xDD, 0x01, 0x73, 0xB4, 0xDC, 0xA1, 0x0B, 0x24, 0xC9, 0xB3, 0xD5, 0x82,
0x1C, 0xC6, 0x07, 0xEA, 0x94, 0x32, 0x5A, 0xAA, 0xFB, 0xF8, 0xE5, 0x93, 0xB4, 0xA3, 0x05, 0x01,
0x0D, 0x35, 0xF5, 0x68, 0xF2, 0x68, 0xB5, 0xC7, 0x63, 0xCC, 0x16, 0x8F, 0x5A, 0x3B, 0x3C, 0xB4,
0x13, 0xE3, 0x2A, 0xFB, 0x3B, 0x6E, 0x2B, 0x7A, 0xA7, 0xDD, 0x1D, 0x5F, 0xBF, 0x1E, 0x7A, 0x21,
0xE8, 0xB4, 0xAD, 0x43, 0xBB, 0x3A, 0x5E, 0xE2, 0xA3, 0x7E, 0xA7, 0x3D, 0x1D, 0x6C, 0xE9, 0x98,
0xBB, 0x8E, 0x8E, 0x72, 0x8A, 0x97, 0x47, 0xF6, 0xB3, 0xB2, 0x1D, 0xDA, 0x39, 0x86, 0x6E, 0x0E,
0x05, 0xE4, 0x35, 0x5D, 0x26, 0x07, 0xE0, 0x91, 0xF0, 0x4E, 0x5D, 0x8F, 0x2B, 0x7A, 0xB9, 0x53,
0x28, 0x71, 0x39, 0x4D, 0x78, 0x61, 0x91, 0xDC, 0x5A, 0xDD, 0xF2, 0xF1, 0xD1, 0xD0, 0x13, 0xB2,
0xB1, 0x85, 0x05, 0xEF, 0x39, 0xEB, 0x3C, 0xEA, 0x5F, 0x66, 0x85, 0xC8, 0xC2, 0xBE, 0xF6, 0xD0,
0x46, 0xB4, 0x62, 0xE8, 0x42, 0x7D, 0x34, 0x1B, 0x16, 0xAA, 0x73, 0x5D, 0x02, 0xF1, 0xE7, 0x38,
0x85, 0x98, 0x02, 0x61, 0x20, 0x6D, 0x3B, 0x9C, 0x58, 0xD0, 0x7A, 0xB2, 0xE8, 0x12, 0x2B, 0x21,
0x23, 0x2A, 0x21, 0x4A, 0x2C, 0xDA, 0x3E, 0x37, 0xC8, 0x0C, 0x89, 0x3E, 0x3B, 0x08, 0x58, 0x80,
0x85, 0x0A, 0xED, 0x90, 0x0F, 0xAC, 0xA3, 0x86, 0x91, 0xA2, 0x86, 0x83, 0x9F, 0x58, 0x33, 0x55,
0x58, 0xA5, 0x37, 0xA0, 0x40, 0xB1, 0x56, 0x8E, 0xB9, 0x54, 0x81, 0x0B, 0x16, 0x1E, 0x78, 0x40,
0xD0, 0xCF, 0x02, 0xCF, 0x86, 0xBB, 0x7F, 0x9D, 0xD2, 0xCB, 0x7A, 0x2F, 0x15, 0x94, 0xCE, 0xDC,
0x0E, 0xDE, 0x23, 0xAE, 0xDD, 0x29, 0xBF, 0xBD, 0x00, 0x85, 0xB7, 0x6F, 0xED, 0x58, 0xB8, 0xA3,
0xD9, 0x26, 0x5F, 0x78, 0xFC, 0x0C, 0xC1, 0xDC, 0xD7, 0xD4, 0xB8, 0x02, 0x54, 0x54, 0xAE, 0xF4,
0x8E, 0x96, 0x55, 0x44, 0x11, 0x35, 0xE6, 0x39, 0xC2, 0xBD, 0xE7, 0x27, 0x93, 0xB7, 0xB5, 0x2E,
0xAF, 0x46, 0x88, 0x18, 0x48, 0x63, 0x96, 0x01, 0x29, 0xD2, 0x2E, 0xED, 0x2D, 0xD8, 0x73, 0xED,
0x32, 0x25, 0x64, 0xD2, 0x2B, 0xA7, 0x8E, 0xB4, 0x60, 0xA8, 0xD1, 0x3B, 0x00, 0x79, 0xE5, 0x60,
0x08, 0x95, 0x44, 0x8E, 0xFE, 0xD5, 0x84, 0x7D, 0x68, 0x6F, 0x31, 0xBC, 0x99, 0x8A, 0xCD, 0xD9,
0x13, 0xF3, 0xE8, 0x9D, 0xCF, 0xF2, 0x34, 0x47, 0xE5, 0x1C, 0x66, 0x34, 0x6B, 0x94, 0xCC, 0xAD,
0xB5, 0x5C, 0x1F, 0xCF, 0x62, 0x7F, 0xCF, 0xF4, 0xCF, 0xFD, 0x27, 0xC3, 0xD1, 0x19, 0xCA, 0x78,
0x50, 0xAD, 0xFF, 0x6F, 0x16, 0x79, 0xD8, 0x66, 0x11, 0x65, 0xD4, 0x90, 0x36, 0xE4, 0x43, 0x09,
0xC4, 0x76, 0x43, 0x9D, 0xEE, 0x47, 0x2E, 0xC7, 0x5B, 0x70, 0x49, 0x9D, 0x78, 0x35, 0x94, 0xF3,
0x14, 0x5C, 0xA1, 0x6C, 0x94, 0x78, 0x64, 0xA7, 0x44, 0x43, 0x92, 0xB7, 0x35, 0xBE, 0x1F, 0x8D,
0x8A, 0x6B, 0xAE, 0xB5, 0xC3, 0xC4, 0xEF, 0xB5, 0x8E, 0x99, 0xCA, 0x61, 0x0D, 0xDB, 0x12, 0x97,
0x10, 0x04, 0xF3, 0xA1, 0x07, 0x24, 0x68, 0x3C, 0x37, 0x70, 0xC9, 0x5E, 0x91, 0xEA, 0xC4, 0x65,
0x0C, 0x3D, 0x6F, 0x84, 0x98, 0x97, 0xFA, 0x6A, 0xE5, 0xA6, 0xE3, 0x8C, 0x88, 0x83, 0xA3, 0x51,
0xD4, 0xCB, 0x35, 0xB4, 0xA4, 0x2C, 0x37, 0x6F, 0x62, 0xF9, 0xA7, 0x03, 0x5B, 0xE2, 0x3B, 0x93,
0xC9, 0x36, 0xAD, 0x31, 0x14, 0xE8, 0x13, 0x6B, 0x3F, 0xD5, 0xD6, 0xAB, 0x46, 0xDB, 0x67, 0xEE,
0x29, 0x51, 0x2E, 0x8A, 0x97, 0xDF, 0xF0, 0xD4, 0x0F, 0xAD, 0x2F, 0x04, 0x20, 0xC0, 0x85, 0x05,
0x76, 0xCC, 0x96, 0x41, 0xD7, 0x90, 0xC6, 0x43, 0x5A, 0xE3, 0x45, 0x6E, 0xFC, 0xB4, 0x84, 0xDC,
0x6E, 0x4E, 0xD6, 0xD1, 0xC0, 0x30, 0xAE, 0x23, 0xB2, 0x29, 0x9B, 0xFC, 0x89, 0x0A, 0xB9, 0x0B,
0x8D, 0x4F, 0xC0, 0x19, 0xB7, 0xF8, 0x99, 0x76, 0x0A, 0x38, 0x09, 0x08, 0x1E, 0x74, 0xB1, 0xD4,
0x8B, 0xC4, 0x19, 0x3B, 0xA5, 0x25, 0xCB, 0xFD, 0xAE, 0x1B, 0x8D, 0xB6, 0x71, 0x91, 0x7D, 0x61,
0xE9, 0x47, 0xD4, 0xFD, 0xE8, 0x40, 0x54, 0xA3, 0xCC, 0xD1, 0x1D, 0xF1, 0x35, 0x77, 0x7E, 0xF5,
0x62, 0xAF, 0x17, 0x53, 0x49, 0xB9, 0xD1, 0xBA, 0x30, 0xF7, 0x69, 0x0D, 0xEC, 0xE7, 0x43, 0x3A,
0xAF, 0xEA, 0xDD, 0xAF, 0xD5, 0xED, 0xCF, 0x7A, 0xE5, 0xA1, 0xD9, 0x15, 0xA9, 0xA8, 0x76, 0x45,
0x39, 0xEA, 0xE2, 0x8A, 0x49, 0x1A, 0xF4, 0x1A, 0xB6, 0x92, 0x59, 0x7B, 0x1D, 0x0C, 0x4D, 0x8F,
0xB5, 0xE4, 0x66, 0x1F, 0x8F, 0xE3, 0xA6, 0x5F, 0x6C, 0xF0, 0x0A, 0x76, 0x24, 0xC8, 0x9A, 0x3B,
0x1B, 0x4E, 0xDB, 0x92, 0x42, 0x83, 0x0A, 0x49, 0x31, 0x3C, 0xD8, 0xEA, 0x08, 0x66, 0x24, 0x13,
0xA3, 0xCC, 0x78, 0x38, 0x21, 0x9A, 0x4A, 0x3F, 0x81, 0x14, 0xFC, 0xC6, 0xA0, 0xAD, 0x0F, 0xBB,
0x59, 0xD5, 0x00, 0xD3, 0x2F, 0xD5, 0x5E, 0xC5, 0x75, 0xF7, 0xAB, 0x6D, 0x09, 0xB4, 0x92, 0xA7,
0x81, 0x15, 0x84, 0x07, 0x34, 0xDC, 0x6C, 0xF3, 0x38, 0xA0, 0x84, 0xEC, 0x5A, 0x1C, 0xB2, 0x0F,
0x86, 0xBD, 0x1D, 0x07, 0x33, 0x58, 0xB3, 0x5D, 0xB9, 0x45, 0x0E, 0xE1, 0x3C, 0xD8, 0xD0, 0x71,
0x50, 0xC3, 0xBB, 0x14, 0x48, 0x95, 0x0E, 0xD8, 0xF1, 0xC2, 0x2E, 0x8E, 0x03, 0xA4, 0x4D, 0x80,
0x8F, 0xFB, 0xE0, 0x80, 0x6D, 0x2E, 0x6C, 0xDD, 0x90, 0x43, 0xAF, 0xC7, 0x61, 0x74, 0xC0, 0xB5,
0xB2, 0xF4, 0x13, 0x07, 0x8C, 0x76, 0xE8, 0x48, 0x0E, 0xB4, 0xA1, 0x05, 0x28, 0xB2, 0x46, 0xED,
0x0E, 0x99, 0x51, 0xC1, 0x27, 0x4E, 0x73, 0x6C, 0x11, 0xDA, 0x99, 0xF8, 0x1D, 0xF1, 0x0C, 0x6D,
0x69, 0xBB, 0x18, 0x7D, 0x14, 0x42, 0x73, 0xF1, 0xAB, 0x46, 0xA1, 0xFE, 0xE4, 0x3A, 0xDA, 0x27,
0x00, 0xE9, 0x5C, 0x17, 0x66, 0x02, 0xC6, 0x42, 0xA3, 0xD0, 0xC3, 0x1F, 0x2C, 0xAA, 0x4F, 0x0A,
0x11, 0x6B, 0x3F, 0xB3, 0xE6, 0x50, 0x51, 0xB5, 0x92, 0x36, 0xF2, 0x4C, 0xC9, 0xAB, 0x73, 0xC6,
0xA6, 0x75, 0xBC, 0xDC, 0x36, 0xE9, 0x4A, 0x4B, 0xC4, 0x0A, 0x9E, 0xB8, 0xCB, 0x60, 0xF5, 0xF2,
0x12, 0x4F, 0xF4, 0x1B, 0xF4, 0x5E, 0x28, 0x92, 0x18, 0xCE, 0x60, 0xA8, 0xD6, 0x90, 0xC4, 0xDC,
0x23, 0x92, 0x88, 0x98, 0xBF, 0x24, 0x37, 0x96, 0x48, 0x62, 0x0E, 0x6B, 0x6D, 0xAB, 0x80, 0x83,
0x09, 0x41, 0xB2, 0x41, 0xF9, 0x81, 0x18, 0x62, 0xA9, 0xCE, 0x12, 0x2D, 0xBD, 0x58, 0xF9, 0x60,
0x28, 0x35, 0x9C, 0x82, 0xB4, 0xC9, 0x89, 0xD3, 0x92, 0x4E, 0x24, 0x9E, 0xF8, 0xFB, 0xF1, 0xCF,
0x8C, 0x57, 0x3F, 0xAB, 0xA1, 0x6F, 0x00, 0x59, 0x7C, 0x5C, 0xA0, 0xA2, 0xD0, 0xE2, 0xCA, 0x7C,
0xA5, 0x3B, 0xE1, 0xB4, 0xD2, 0x75, 0xA4, 0x0C, 0xDD, 0x2A, 0x2C, 0x7F, 0xDC, 0xCF, 0xA2, 0xFF,
0xB0, 0xC1, 0xC6, 0x05, 0x7B, 0x22, 0xED, 0xF9, 0xF2, 0xFA, 0xB5, 0x3E, 0x25, 0xC7, 0x1C, 0x97,
0xC3, 0xAE, 0xF3, 0x06, 0x2B, 0x37, 0x82, 0xA6, 0x75, 0x9E, 0x85, 0x95, 0xB7, 0x4D, 0x21, 0x94,
0x67, 0xFF, 0x56, 0xDC, 0xBA, 0xB1, 0x33, 0xF3, 0xC4, 0x9C, 0xCF, 0x0D, 0x13, 0xF0, 0x5E, 0x3D,
0x1A, 0x00, 0xB9, 0x6A, 0xC0, 0x1E, 0x1D, 0x14, 0xE9, 0x95, 0xC4, 0x1E, 0x7D, 0xAB, 0x50, 0xA4,
0xBD, 0xF9, 0x82, 0x38, 0xE5, 0x4B, 0x12, 0x23, 0xE0, 0xF5, 0x32, 0x09, 0x4D, 0x36, 0x72, 0xAA,
0x0E, 0x92, 0x19, 0x17, 0xEE, 0x5B, 0x86, 0x0B, 0x26, 0x15, 0x16, 0x1C, 0x4B, 0x6F, 0xEF, 0xFC,
0xDE, 0xFE, 0xA6, 0x1C, 0xCB, 0xEB, 0x41, 0x82, 0x0F, 0xA3, 0x8E, 0x85, 0xDA, 0x72, 0x0D, 0x14,
0xE6, 0x99, 0xF3, 0x0B, 0xBB, 0xE4, 0xD6, 0xDC, 0x5F, 0x69, 0x30, 0x74, 0x79, 0xF9, 0xB1, 0xF5,
0xC5, 0xFE, 0x29, 0xF1, 0x85, 0xCC, 0xC1, 0x83, 0x24, 0xAF, 0xF2, 0x99, 0xCC, 0x22, 0x6A, 0x16,
0x89, 0xB7, 0x6C, 0xA0, 0x93, 0xE9, 0x49, 0x52, 0x47, 0xD4, 0x02, 0xF8, 0x82, 0xDF, 0x02, 0x5F,
0xF0, 0x5A, 0xE2, 0x0B, 0x1D, 0xF1, 0x85, 0x7D, 0xA6, 0xAD, 0x05, 0x33, 0x30, 0xF1, 0x24, 0x3D,
0x3A, 0xD3, 0x90, 0xCF, 0xA2, 0xE4, 0x73, 0x0B, 0x22, 0x11, 0x1F, 0xD4, 0xC8, 0x78, 0x9A, 0x0E,
0x9C, 0xEE, 0x32, 0x36, 0xA0, 0x85, 0x07, 0x0C, 0x5B, 0x10, 0x9E, 0xA5, 0xD3, 0xA4, 0x5D, 0xC1,
0x17, 0x2C, 0xF1, 0x85, 0x92, 0xF8, 0x42, 0x46, 0x7C, 0x21, 0xC8, 0xBD, 0x55, 0x58, 0x98, 0x45,
0x61, 0xE4, 0x60, 0x5E, 0x37, 0x00, 0xA9, 0xFB, 0x43, 0x6D, 0xE2, 0xC8, 0x72, 0xE1, 0x7C, 0xA4,
0x95, 0xFF, 0x39, 0x16, 0x69, 0x6A, 0x07, 0x64, 0xA1, 0xAC, 0xC4, 0xF6, 0xDA, 0x37, 0x85, 0xCC,
0x32, 0xAD, 0xFC, 0x46, 0x6C, 0x5D, 0x72, 0x55, 0x12, 0xD6, 0x36, 0xBE, 0x35, 0x8D, 0xA7, 0xA2,
0xB5, 0xFB, 0xA6, 0xEF, 0xC3, 0x3A, 0xB8, 0xD3, 0x88, 0xE4, 0x7E, 0xF8, 0x85, 0xE4, 0x3E, 0x2F,
0xDD, 0xAA, 0xFC, 0x56, 0x0C, 0x90, 0xA4, 0xDC, 0x53, 0xE1, 0x47, 0x79, 0x73, 0x67, 0x8E, 0xF8,
0x29, 0xCF, 0x76, 0x84, 0xB8, 0x7F, 0x59, 0x64, 0x6D, 0xDE, 0x25, 0x2E, 0x80, 0x55, 0x38, 0xFA,
0x79, 0xCD, 0xBA, 0x48, 0xD3, 0x0C, 0xE6, 0xCC, 0xAB, 0x51, 0xB9, 0x32, 0x47, 0xBD, 0xA7, 0xAD,
0x5A, 0x75, 0x6A, 0x7C, 0x49, 0xFC, 0x92, 0x5C, 0x2D, 0x45, 0xA8, 0xA2, 0x99, 0x50, 0x72, 0x39,
0x00, 0xAA, 0x2D, 0xF9, 0xF9, 0x19, 0xEF, 0x31, 0xF4, 0x76, 0x19, 0x73, 0xE2, 0x82, 0x56, 0x09,
0x34, 0x2F, 0x06, 0xB1, 0x53, 0xAC, 0x73, 0x9C, 0x7B, 0x42, 0xFE, 0xC6, 0x32, 0x9A, 0x7B, 0x6A,
0xCA, 0x51, 0xDE, 0x04, 0x5A, 0xD5, 0x10, 0xF8, 0x0C, 0x66, 0x7E, 0x6D, 0x6A, 0xF3, 0x33, 0x73,
0xD4, 0x78, 0x8F, 0xC1, 0x51, 0x4C, 0xFC, 0x0B, 0xA6, 0x78, 0x01, 0xA8, 0xAC, 0x98, 0x8F, 0x69,
0x26, 0xD3, 0x16, 0x77, 0xD0, 0x08, 0x3B, 0x8F, 0x2D, 0xD9, 0x58, 0x68, 0x8E, 0xDD, 0xF3, 0xDF,
0xF0, 0xB1, 0xC0, 0x83, 0xFE, 0x8D, 0x46, 0x5B, 0x48, 0x2B, 0xF8, 0x0F, 0xC7, 0xFF, 0xD7, 0x78,
0x7D, 0x7E, 0x3F, 0xFC, 0x7B, 0x5D, 0x14, 0x39, 0x68, 0x08, 0x0F, 0xCB, 0x24, 0xF7, 0x85, 0x95,
0xFE, 0x5C, 0x16, 0x22, 0xAA, 0x4E, 0x43, 0x8F, 0xF3, 0x25, 0x47, 0x42, 0x91, 0x2F, 0x1F, 0x01,
0x6D, 0xF9, 0x5E, 0x31, 0x15, 0x57, 0x04, 0x69, 0x64, 0x7C, 0x98, 0xBE, 0x8B, 0xD6, 0xBC, 0x7D,
0x84, 0x2E, 0x28, 0x3B, 0x63, 0x5D, 0xAE, 0x4B, 0xAC, 0x7B, 0xB1, 0x1F, 0xEC, 0x42, 0x39, 0xE4,
0x1E, 0x30, 0xAE, 0x30, 0x6B, 0xC7, 0x42, 0xFB, 0x1F, 0x65, 0x9E, 0x30, 0x3A, 0x06, 0x8C, 0x87,
0x2C, 0x60, 0xF3, 0x22, 0xE8, 0x1A, 0xCB, 0xB2, 0x4E, 0xB1, 0x22, 0x61, 0x65, 0x6A, 0x59, 0x8E,
0xA3, 0xDF, 0x07, 0x4B, 0xCC, 0xE6, 0x25, 0x15, 0x0F, 0x03, 0xEB, 0x97, 0x9A, 0xC4, 0x04, 0x95,
0xF9, 0xAD, 0x2C, 0x90, 0xB7, 0xD2, 0x0E, 0x5B, 0x28, 0x08, 0x90, 0x47, 0xDD, 0x8F, 0x3B, 0x31,
0x81, 0x11, 0x4A, 0x30, 0x80, 0x4B, 0x09, 0xC0, 0x25, 0xEF, 0xCE, 0x84, 0x25, 0xE4, 0x04, 0x59,
0x32, 0x99, 0x4C, 0x34, 0x91, 0x1A, 0xCA, 0xF4, 0x74, 0x57, 0xAD, 0x36, 0x9C, 0x7A, 0x79, 0x71,
0xF8, 0xCF, 0x73, 0xC8, 0x73, 0x2E, 0xFC, 0xDD, 0xA3, 0x32, 0x9F, 0x3A, 0x77, 0x89, 0x52, 0x82,
0xAF, 0x8F, 0x80, 0xAF, 0xB7, 0xE1, 0x4C, 0x84, 0xA4, 0x32, 0xB9, 0xB7, 0x30, 0xAD, 0x22, 0x7E,
0x12, 0xE1, 0x4B, 0xFE, 0x7D, 0x43, 0x9B, 0x9A, 0x6B, 0x07, 0x23, 0x98, 0x47, 0xFE, 0xF3, 0xE4,
0x21, 0x14, 0x43, 0x66, 0xD7, 0x8A, 0x70, 0x04, 0x4D, 0x32, 0x8D, 0xAB, 0x52, 0xA2, 0xFC, 0xB9,
0x27, 0x82, 0x11, 0x8A, 0x5C, 0x1C, 0x59, 0x06, 0xE2, 0x8F, 0xDE, 0x5E, 0x89, 0xDD, 0x44, 0x1C,
0x5F, 0x87, 0x95, 0x6F, 0xCC, 0xE5, 0x5F, 0x98, 0xF8, 0xC8, 0xC2, 0xA2, 0x24, 0xB6, 0xC5, 0x1C,
0x77, 0xFA, 0xFC, 0x11, 0xFA, 0x45, 0x17, 0x7F, 0x78, 0xE5, 0x9E, 0x6B, 0x45, 0xF5, 0x26, 0x79,
0x8C, 0x3C, 0xB1, 0xBD, 0x62, 0xCE, 0xCE, 0xCD, 0xB3, 0x67, 0x16, 0x1E, 0xAB, 0x7B, 0x84, 0xDF,
0xD7, 0xFD, 0x0B, 0x94, 0xF8, 0x52, 0x83, 0x34, 0x36, 0x2A, 0x8E, 0xD9, 0x42, 0xA2, 0x11, 0x5A,
0x8A, 0x9E, 0x18, 0x59, 0xED, 0x23, 0x4F, 0x77, 0x9F, 0x28, 0x44, 0xD3, 0x14, 0x10, 0x5E, 0x7E,
0x1A, 0xC7, 0xEA, 0x0F, 0xC4, 0x93, 0xF2, 0xB9, 0x14, 0xD0, 0xC7, 0xD6, 0x27, 0x4A, 0x6D, 0x85,
0xA8, 0xCC, 0x18, 0xBD, 0xD2, 0xEA, 0x54, 0x20, 0x85, 0x4A, 0x8B, 0xA4, 0xF1, 0x3E, 0xC8, 0xC9,
0x9E, 0x42, 0x72, 0xB9, 0x83, 0x4E, 0x22, 0xD4, 0x67, 0x2B, 0x85, 0xF2, 0xA9, 0x96, 0xD6, 0x45,
0x35, 0x0A, 0x2D, 0x33, 0x44, 0x2D, 0xB6, 0xF9, 0xE5, 0xCB, 0xE7, 0x64, 0xE2, 0x83, 0xCA, 0x05,
0x6B, 0x6C, 0xCF, 0x3E, 0x22, 0xDB, 0x3F, 0xE6, 0x42, 0xCD, 0xF5, 0x51, 0x44, 0xAD, 0x7B, 0xBE,
0xA3, 0xCC, 0xB5, 0x56, 0x21, 0x41, 0x1E, 0x8A, 0x1F, 0x65, 0xFF, 0x5F, 0xB2, 0x0D, 0xF5, 0x23,
0xAA, 0x44, 0x3F, 0x53, 0x64, 0x81, 0xD8, 0x9F, 0x10, 0x3C, 0x27, 0xAD, 0xB9, 0x39, 0x2D, 0x72,
0xE4, 0xC1, 0x5D, 0x79, 0xCB, 0x7C, 0x78, 0x94, 0x6B, 0xEE, 0x1D, 0xD1, 0x3C, 0x23, 0x3C, 0x6A,
0x50, 0x13, 0x16, 0xB6, 0xFD, 0xBE, 0x55, 0xFB, 0x6C, 0x32, 0xC0, 0x9C, 0xE4, 0x37, 0x9A, 0xEA,
0x1D, 0xBF, 0xF1, 0x29, 0x28, 0xBE, 0x04, 0xC5, 0x57, 0x1A, 0xF1, 0x55, 0x14, 0x52, 0xD0, 0x25,
0xD4, 0xF0, 0x2B, 0xD0, 0xE4, 0xF0, 0xD5, 0x56, 0xBF, 0x01, 0xD5, 0x4F, 0x40, 0xB7, 0x9C, 0x80,
0x67, 0xBF, 0x64, 0x9F, 0x28, 0x50, 0x19, 0x84, 0x22, 0x2A, 0xDB, 0x97, 0x51, 0xD0, 0x39, 0xB6,
0x16, 0x07, 0x14, 0xF6, 0xD3, 0x5C, 0xCB, 0x33, 0x84, 0xA8, 0x0A, 0x31, 0x54, 0x5A, 0x9B, 0x44,
0x22, 0x31, 0x1B, 0x36, 0x2C, 0x5F, 0x47, 0x8B, 0x3F, 0x09, 0xD1, 0x61, 0x88, 0x67, 0x73, 0x82,
0xCC, 0x85, 0xD5, 0x9E, 0x03, 0x7C, 0x8E, 0x21, 0x3E, 0xA7, 0x80, 0xF5, 0x2C, 0x10, 0x5C, 0x17,
0x0E, 0xC5, 0x24, 0x68, 0x4C, 0x10, 0x79, 0xF9, 0x64, 0x3E, 0x94, 0x20, 0xB4, 0xD7, 0x9D, 0x7A,
0xFE, 0xA2, 0xB1, 0x83, 0x11, 0x8D, 0x66, 0x5E, 0x23, 0x31, 0x4D, 0x2D, 0x89, 0xF0, 0xD0, 0x31,
0xE7, 0x6D, 0x89, 0x71, 0xAB, 0xB3, 0xD8, 0x8E, 0x5B, 0x7B, 0x29, 0xB0, 0xFA, 0x59, 0x6E, 0xA6,
0x5F, 0x90, 0x32, 0xB7, 0x99, 0x7D, 0x03, 0xE0, 0x5C, 0x45, 0xB1, 0xC0, 0x02, 0x82, 0xEE, 0xA0,
0x96, 0x85, 0xA2, 0x14, 0x4A, 0xCC, 0x79, 0xF4, 0xC9, 0xE3, 0xCD, 0xC2, 0x0A, 0x9E, 0x35, 0x67,
0x7F, 0x6B, 0x7E, 0x72, 0xD4, 0x29, 0xCA, 0x48, 0x6C, 0x6E, 0x9B, 0xF5, 0xC2, 0x0F, 0xC4, 0x40,
0x95, 0xB1, 0xA8, 0x8B, 0xC2, 0x75, 0xF5, 0x0F, 0x61, 0x04, 0x37, 0xCF, 0x23, 0xCB, 0xEB, 0xA3,
0xDA, 0x05, 0xDF, 0x5E, 0x03, 0x1E, 0xA5, 0x79, 0x4B, 0x51, 0x19, 0xAF, 0xC4, 0x14, 0x4F, 0x6C,
0x27, 0x20, 0xE2, 0x6D, 0xAF, 0x43, 0xE9, 0x00, 0x3E, 0x9D, 0x26, 0x1C, 0x01, 0xB7, 0x90, 0x9F,
0x4B, 0xB0, 0x7B, 0xF4, 0xF1, 0xB5, 0x6D, 0xBF, 0xBE, 0x47, 0x13, 0x6A, 0x54, 0x9A, 0xCC, 0x65,
0xF3, 0x0B, 0x23, 0x7A, 0x1F, 0xE5, 0xF7, 0x86, 0xDC, 0x4F, 0x62, 0x87, 0xB6, 0xC8, 0x96, 0x41,
0xB2, 0x4E, 0xBE, 0xC6, 0x95, 0x68, 0x5C, 0x6D, 0x9E, 0x33, 0x47, 0x56, 0x09, 0xFF, 0xEE, 0xFB,
0xB1, 0x9D, 0xA9, 0xB7, 0x1A, 0xA9, 0x63, 0xCD, 0x4F, 0xFE, 0x5D, 0xE7, 0x22, 0x79, 0x7E, 0x41,
0x94, 0x8E, 0x5D, 0x8E, 0xCE, 0x7E, 0x61, 0x64, 0x36, 0x81, 0xE5, 0x97, 0xAC, 0x33, 0xE7, 0x50,
0x12, 0x6D, 0xCA, 0x13, 0xA2, 0xA3, 0x76, 0xA8, 0x53, 0x2D, 0x82, 0xB8, 0xD2, 0x05, 0xB8, 0x5E,
0xF7, 0x37, 0x42, 0xD8, 0x55, 0x3B, 0x11, 0x43, 0x22, 0xAF, 0x91, 0x77, 0x76, 0xCE, 0x74, 0xF3,
0xE7, 0xA2, 0x43, 0x31, 0x59, 0x02, 0xCF, 0x86, 0xEA, 0xF7, 0x7F, 0x83, 0x3A, 0x57, 0xCF, 0x15,
0xBE, 0xDD, 0x10, 0xDB, 0xDD, 0xA4, 0x37, 0x7F, 0x54, 0xCB, 0xB4, 0x8E, 0x66, 0x6E, 0x20, 0x7C,
0x74, 0xD2, 0x38, 0xD8, 0x5B, 0x81, 0x70, 0xA0, 0x9B, 0x73, 0xED, 0xA5, 0x60, 0x66, 0x87, 0xE9,
0xB4, 0x3F, 0x85, 0x8F, 0x7A, 0x6B, 0x1B, 0xF5, 0xCA, 0x19, 0x3F, 0x70, 0x1F, 0x5A, 0xA2, 0x60,
0xB0, 0x81, 0xB0, 0xC1, 0x3D, 0x03, 0xFD, 0x83, 0x02, 0x26, 0x9A, 0xA0, 0x13, 0x55, 0xDA, 0xC1,
0xE6, 0x43, 0x4B, 0x9C, 0x5A, 0x91, 0xC2, 0x62, 0x81, 0xB9, 0x32, 0xD5, 0x51, 0xE8, 0xE2, 0x31,
0x9C, 0x5C, 0xF9, 0xD9, 0x3C, 0xBF, 0xF8, 0xC0, 0xAB, 0x5D, 0xF4, 0x30, 0x24, 0x8B, 0xEA, 0x39,
0xF3, 0xF7, 0xBF, 0x42, 0x38, 0x05, 0xC0, 0x29, 0x60, 0xB1, 0x2F, 0x62, 0xAD, 0xA9, 0xD9, 0xBE,
0x3D, 0xF2, 0x15, 0x6A, 0x94, 0x15, 0x76, 0x65, 0xC0, 0xFB, 0xFF, 0xC1, 0xD0, 0x50, 0x04, 0xE8,
0x70, 0x0B, 0x42, 0x9A, 0x88, 0x0D, 0xD5, 0x5A, 0xCC, 0x33, 0x7B, 0x78, 0x22, 0x40, 0xA8, 0xCB,
0x7C, 0x71, 0x6C, 0x16, 0x41, 0xBF, 0x87, 0xCA, 0x78, 0x29, 0x1C, 0x4E, 0xEC, 0x67, 0x16, 0xE1,
0x48, 0x31, 0xFD, 0x47, 0x87, 0x5E, 0x95, 0x03, 0xD4, 0x13, 0x2D, 0x0A, 0xD0, 0x9D, 0xFB, 0x76,
0x31, 0x72, 0xAB, 0xC6, 0x08, 0x2A, 0xE9, 0xCA, 0xCA, 0xFC, 0xAD, 0x56, 0xFA, 0x8A, 0xE1, 0x46,
0x6D, 0xE0, 0x9D, 0x0F, 0xC9, 0x12, 0xDC, 0x89, 0x06, 0x1F, 0xB5, 0x2B, 0xE4, 0x50, 0xF2, 0x50,
0x4D, 0x4E, 0x3B, 0xB4, 0x3D, 0x4C, 0x59, 0xB2, 0xE0, 0x32, 0x97, 0x7D, 0x2E, 0x11, 0x47, 0xCE,
0x1C, 0x9C, 0x79, 0xC9, 0x19, 0xC6, 0x08, 0x10, 0x83, 0xF4, 0xD7, 0xC9, 0xFC, 0x08, 0x53, 0x0C,
0x6F, 0xE5, 0x9F, 0xDF, 0x6A, 0x26, 0x96, 0xD6, 0x8C, 0x31, 0x25, 0xA8, 0xA0, 0xCA, 0x36, 0xC0,
0xAC, 0x38, 0x81, 0xDE, 0xC1, 0x38, 0xA5, 0x3B, 0xEE, 0x75, 0x2A, 0x10, 0x37, 0x64, 0x2A, 0xF2,
0xF2, 0xC4, 0xF2, 0xFD, 0xEC, 0xAD, 0x93, 0xB0, 0xF5, 0x86, 0xFE, 0xEF, 0x1B, 0x9B, 0x63, 0x11,
0x6F, 0xBF, 0xB9, 0xA7, 0xEB, 0xA7, 0xBE, 0x5F, 0xD7, 0xCF, 0xB0, 0xE2, 0xCC, 0xC8, 0xF9, 0x99,
0xA3, 0xF7, 0xCD, 0x0E, 0x47, 0xA3, 0xD1, 0xCE, 0x35, 0xC8, 0x6C, 0x4B, 0x19, 0xBE, 0x26, 0xB9,
0xE6, 0xE4, 0x5B, 0x3F, 0x6C, 0x79, 0xA8, 0xFF, 0xD1, 0xC2, 0x15, 0xF6, 0x63, 0xF4, 0x5C, 0x0A,
0xFD, 0x30, 0x90, 0x26, 0x4D, 0x4B, 0xD8, 0xAB, 0x0D, 0x02, 0x27, 0x96, 0x9F, 0xAD, 0x2A, 0xBA,
0xAE, 0x05, 0x3B, 0xF6, 0x89, 0xDC, 0xEF, 0x34, 0x54, 0xB2, 0xC3, 0x17, 0x94, 0xC1, 0x1F, 0xA1,
0x6D, 0xF1, 0x2D, 0x84, 0xB2, 0x19, 0x3F, 0x9F, 0xE4, 0xD7, 0x93, 0x01, 0x93, 0x95, 0x98, 0xDF,
0x4E, 0x66, 0xFC, 0x74, 0x92, 0x48, 0x2B, 0xB3, 0x24, 0x3E, 0xA4, 0x65, 0xB6, 0x54, 0xF3, 0xC3,
0xE3, 0x87, 0x3E, 0xFD, 0x27, 0x9D, 0x56, 0x4F, 0x68, 0x1C, 0xD7, 0x19, 0xFF, 0xBD, 0x79, 0x2B,
0x4D, 0xE4, 0xA9, 0x35, 0x5B, 0x90, 0x8B, 0xEB, 0x6C, 0x34, 0x39, 0xF8, 0xE0, 0x0A, 0xCB, 0x43,
0xC1, 0x87, 0x1C, 0x66, 0x35, 0x93, 0x9A, 0x22, 0x68, 0x29, 0xD9, 0x43, 0x36, 0x3D, 0xA4, 0x60,
0x5D, 0x65, 0x28, 0xB2, 0xA9, 0x21, 0x5B, 0xBA, 0xDA, 0x99, 0xC4, 0x87, 0x5E, 0x4A, 0xAB, 0x42,
0x69, 0x0F, 0xB9, 0xA4, 0x90, 0x83, 0xB2, 0x14, 0xBC, 0x6D, 0x7D, 0x70, 0x89, 0x76, 0xE7, 0x29,
0xA2, 0xE8, 0xE0, 0x43, 0xC6, 0x2E, 0x89, 0x0F, 0xA5, 0x30, 0x44, 0x35, 0x09, 0xF8, 0xE0, 0x69,
0x3B, 0xA6, 0x43, 0x78, 0xB3, 0xAF, 0xDF, 0x9B, 0x5D, 0x45, 0x76, 0x94, 0x96, 0xD0, 0xF7, 0x67,
0xBE, 0x6F, 0xDF, 0xFB, 0xE6, 0xCD, 0xF7, 0xF7, 0xF7, 0xF6, 0x4A, 0x60, 0x67, 0x18, 0xC3, 0x4E,
0x20, 0x61, 0x0B, 0xB4, 0xD0, 0x47, 0x18, 0xF9, 0xC2, 0x15, 0x36, 0x75, 0x16, 0x00, 0x4B, 0x11,
0xCC, 0x31, 0x98, 0xCA, 0xE1, 0x5F, 0x16, 0x76, 0x12, 0xF2, 0x0C, 0x72, 0x01, 0x2C, 0x60, 0x5B,
0x58, 0xF3, 0x0B, 0xFE, 0x9E, 0x1A, 0x6F, 0xD8, 0xAB, 0x2A, 0xEF, 0x32, 0x15, 0x90, 0x34, 0x4E,
0xB5, 0x5F, 0x8E, 0xD5, 0x98, 0x06, 0x31, 0x57, 0xFA, 0xFD, 0x77, 0xD4, 0xB4, 0xD1, 0x16, 0x06,
0x98, 0xBF, 0x8D, 0x0B, 0xFE, 0x2B, 0xD2, 0x55, 0xB9, 0xA9, 0x12, 0x2C, 0xE0, 0x5C, 0xAC, 0x46,
0x0B, 0x35, 0xD4, 0x7D, 0xC8, 0x10, 0x92, 0x9E, 0xC4, 0x8F, 0x2E, 0xA9, 0x3F, 0x6F, 0x44, 0x3E,
0x8A, 0x8D, 0xF7, 0x0A, 0x2B, 0x5A, 0x04, 0x7B, 0x1B, 0x2A, 0x73, 0x5F, 0xDD, 0x13, 0x9E, 0xC7,
0xF7, 0x12, 0xCF, 0xB9, 0x19, 0xC5, 0x29, 0xEA, 0x60, 0xDB, 0x27, 0xDE, 0xF2, 0x5F, 0x97, 0x56,
0xE6, 0x07, 0xD2, 0x4A, 0x49, 0xDC, 0x14, 0x2B, 0xA8, 0x93, 0xC6, 0xDF, 0xC0, 0xEC, 0x1B, 0x85,
0x51, 0x58, 0xE9, 0x08, 0x7E, 0x1C, 0xD1, 0xBB, 0xE0, 0x12, 0x98, 0x01, 0xD6, 0x47, 0xBA, 0xAD,
0xAF, 0xCF, 0xBE, 0x99, 0x8E, 0x46, 0xD6, 0xC3, 0xE9, 0x63, 0x7D, 0x76, 0xEB, 0xCA, 0xB7, 0xB6,
0xA1, 0xCC, 0x1C, 0xA5, 0x99, 0x31, 0x3A, 0x8B, 0x15, 0x96, 0x60, 0x99, 0x25, 0x10, 0xD0, 0x4B,
0xE7, 0x80, 0x18, 0x20, 0xF5, 0x47, 0x18, 0x2C, 0x68, 0xF5, 0x7B, 0xBF, 0x3E, 0x52, 0x9F, 0xF5,
0x03, 0x5B, 0x65, 0xBE, 0x92, 0x9B, 0xD8, 0xBC, 0x85, 0xC5, 0x3A, 0x6A, 0x46, 0xB2, 0x69, 0x09,
0xE9, 0xDE, 0x28, 0xFC, 0xEF, 0x66, 0x6A, 0xA6, 0x65, 0xA7, 0x63, 0xE7, 0x1E, 0xFD, 0xCC, 0x7C,
0x33, 0xD9, 0x99, 0x09, 0x46, 0x56, 0x16, 0xF2, 0xDC, 0x7D, 0x5D, 0xDA, 0x62, 0xC8, 0xD3, 0x53,
0x16, 0xED, 0xDE, 0xA5, 0xDD, 0x7C, 0xB2, 0x7B, 0x25, 0xF0, 0x85, 0x93, 0x68, 0x1D, 0xD0, 0x43,
0x8D, 0xF5, 0xB9, 0x34, 0x73, 0x3B, 0xF1, 0x83, 0x4D, 0xB2, 0x16, 0x4D, 0x34, 0x97, 0x86, 0x61,
0xB9, 0x54, 0x6A, 0x0E, 0xE8, 0x52, 0xEF, 0x6D, 0x87, 0x65, 0xB8, 0xAD, 0x39, 0x8A, 0x52, 0xFF,
0xB7, 0x4A, 0xED, 0x6B, 0x37, 0x77, 0xC1, 0x32, 0x98, 0x02, 0xCE, 0x94, 0x35, 0x22, 0xAC, 0xC3,
0x17, 0x76, 0x6A, 0xE6, 0x5C, 0x5A, 0xD2, 0x96, 0xFC, 0xEF, 0x3A, 0x16, 0xCC, 0xBA, 0x73, 0x20,
0x32, 0xCF, 0x4A, 0x77, 0x18, 0xFD, 0xE2, 0x42, 0xF7, 0x57, 0x1F, 0x28, 0x15, 0x8F, 0xC9, 0x5A,
0x6A, 0x66, 0x32, 0x59, 0xD3, 0xFD, 0xFB, 0x1F, 0xE8, 0x15, 0xCD, 0x19, 0xD1, 0xA9, 0xF6, 0xAA,
0x2A, 0x7D, 0x25, 0xB0, 0xCD, 0x33, 0x5B, 0x50, 0xC4, 0x34, 0x09, 0xE3, 0x4F, 0xD5, 0x7E, 0xF1,
0xD4, 0x92, 0x1F, 0xC4, 0x85, 0x4A, 0xE3, 0x60, 0xCE, 0x3E, 0x28, 0xC6, 0x73, 0xF8, 0x5C, 0x8C,
0xFF, 0x4B, 0x4C, 0x4F, 0x6C, 0x49, 0xE7, 0x8D, 0x6C, 0xC5, 0x14, 0x75, 0xD2, 0xC8, 0x8C, 0xEC,
0x74, 0x56, 0x62, 0x85, 0xFA, 0x28, 0x96, 0x71, 0x82, 0x80, 0xA7, 0xB6, 0x70, 0xAA, 0x05, 0x1F,
0x2E, 0x59, 0xF2, 0x59, 0x48, 0xC9, 0x02, 0x4B, 0xE9, 0xAC, 0x53, 0x0F, 0x05, 0x56, 0x76, 0xC0,
0xA7, 0x24, 0xA5, 0x8D, 0x73, 0x46, 0x74, 0xCE, 0xE3, 0xC2, 0x73, 0x2F, 0x3F, 0x2E, 0x6C, 0xA5,
0x32, 0xF6, 0xF6, 0x99, 0xE0, 0xA9, 0x14, 0x11, 0x4F, 0xA4, 0x88, 0xCE, 0x76, 0xAB, 0xFC, 0x82,
0x6C, 0x9F, 0xA4, 0x6E, 0xEF, 0x95, 0xFF, 0x15, 0x7B, 0xAA, 0x88, 0x5F, 0xAA, 0x64, 0xD1, 0x57,
0xF7, 0xFF, 0xBA, 0xAB, 0x64, 0x6E, 0xA8, 0x99, 0xE3, 0xF5, 0xD0, 0xFF, 0x0D, 0x79, 0xB2, 0x0C,
0xE9, 0x91, 0xE8, 0x28, 0x1C, 0x56, 0x47, 0x9B, 0x1A, 0xA6, 0xED, 0xC9, 0xB5, 0xAA, 0xC8, 0x72,
0xBE, 0xA7, 0xCA, 0x9E, 0xB3, 0xAA, 0xB2, 0x5B, 0xD3, 0x22, 0xFB, 0x7C, 0x61, 0xC5, 0x15, 0x37,
0x9E, 0x12, 0xFD, 0x19, 0x12, 0x80, 0x56, 0x52, 0xC2, 0x92, 0x08, 0x53, 0x53, 0xC1, 0x25, 0x93,
0x22, 0x34, 0x0E, 0xBF, 0xB2, 0x40, 0x93, 0x6C, 0x46, 0x01, 0x18, 0x39, 0x25, 0x40, 0x06, 0x98,
0xA4, 0x12, 0x65, 0x3D, 0xEC, 0x08, 0x70, 0xE9, 0x33, 0x3E, 0x6D, 0xF7, 0x68, 0xEE, 0x4C, 0xC4,
0xD8, 0xA1, 0x58, 0x3A, 0x15, 0xA3, 0xE9, 0x4C, 0xC5, 0x56, 0xA6, 0x62, 0xF2, 0x48, 0x4C, 0x3B,
0xDF, 0x4A, 0x8E, 0x8B, 0xE9, 0xD6, 0xF2, 0xCD, 0xD4, 0xB3, 0xF9, 0x9D, 0x83, 0x54, 0x5B, 0xA3,
0x4F, 0x7B, 0x22, 0x68, 0x0F, 0x27, 0x96, 0xE8, 0xD8, 0xF9, 0x4A, 0x49, 0x3D, 0x3D, 0xC0, 0x3B,
0x9C, 0xCD, 0x76, 0xBB, 0xAB, 0xD7, 0x96, 0xFA, 0xFD, 0x6D, 0x8A, 0x65, 0xA4, 0x63, 0xEA, 0x5A,
0xD9, 0x6D, 0x1D, 0x63, 0x1D, 0x6B, 0xE0, 0xEC, 0xE9, 0x61, 0xCF, 0x97, 0x76, 0xE6, 0xE4, 0x61,
0xD9, 0x6D, 0xD6, 0x6B, 0x78, 0xB1, 0xF4, 0x7F, 0x9A, 0x34, 0x0D, 0xCA, 0xCA, 0xAE, 0x79, 0x4F,
0x86, 0x0C, 0x5F, 0xC6, 0xF5, 0x1A, 0x07, 0x5D, 0x61, 0x65, 0x46, 0x81, 0x21, 0xA5, 0x6F, 0x1F,
0x71, 0xE0, 0x47, 0x7E, 0xE4, 0x46, 0x4E, 0x44, 0x07, 0x7C, 0x61, 0xAC, 0x61, 0x17, 0x2A, 0x19,
0x52, 0x2D, 0x3B, 0x87, 0xE7, 0x61, 0xC1, 0xB9, 0x6B, 0x7E, 0x24, 0x65, 0xEC, 0xBF, 0x74, 0xFF,
0x20, 0x95, 0xB5, 0x2E, 0x03, 0xBD, 0xDC, 0x33, 0xD3, 0x9E, 0xF9, 0xD8, 0xCF, 0xC6, 0x64, 0x43,
0xFF, 0x86, 0xD2, 0x46, 0xF6, 0xFB, 0x37, 0xF7, 0xC8, 0x59, 0x5D, 0x2A, 0x6D, 0xB3, 0x62, 0x3C,
0x5D, 0x94, 0x5F, 0x46, 0xCF, 0xE3, 0x70, 0x46, 0xA8, 0x50, 0x2E, 0x0D, 0x2B, 0x9C, 0xD0, 0x9D,
0x45, 0xF8, 0x7A, 0x73, 0xCE, 0x51, 0xBB, 0x07, 0xAA, 0xDC, 0xDC, 0xF1, 0xD5, 0xFB, 0xAB, 0x8F,
0xB2, 0x16, 0x05, 0x49, 0xBB, 0xE1, 0x04, 0x45, 0x9F, 0x42, 0xEB, 0x46, 0x3A, 0x6C, 0xC7, 0x6C,
0x62, 0x74, 0x1D, 0xE8, 0x3D, 0x2D, 0xA2, 0x43, 0xD8, 0xD2, 0xDF, 0x0E, 0xE2, 0xC8, 0x73, 0xD5,
0x9B, 0x7B, 0x77, 0x55, 0xEE, 0xB1, 0xB1, 0x5E, 0x21, 0x60, 0xD9, 0xA5, 0x0B, 0x60, 0x65, 0x43,
0xDD, 0x10, 0x6E, 0x56, 0xD7, 0x68, 0x45, 0xAD, 0xC1, 0x03, 0xEB, 0x83, 0x1E, 0x27, 0xE3, 0x5C,
0xA5, 0xA2, 0x2E, 0x4F, 0x10, 0x3D, 0x3F, 0xD1, 0xDE, 0x88, 0xCC, 0xD4, 0x29, 0x9E, 0xFD, 0x84,
0x27, 0x93, 0x1E, 0xE6, 0x5C, 0x09, 0xA7, 0x9C, 0x92, 0x1F, 0xB7, 0xD0, 0xC6, 0xCC, 0x0F, 0x3B,
0x95, 0xE8, 0x72, 0xA7, 0xCA, 0x54, 0x22, 0xF3, 0xDE, 0x00, 0xCB, 0xC0, 0xFC, 0xC2, 0xA0, 0x82,
0xAB, 0xCA, 0x39, 0x04, 0x6D, 0x34, 0xF0, 0x0C, 0xAD, 0x9C, 0x45, 0xFD, 0x39, 0x22, 0x9D, 0x5A,
0xA7, 0x46, 0xA4, 0xBE, 0xDC, 0xD1, 0x4A, 0xD4, 0x96, 0x3B, 0x9E, 0x3E, 0x64, 0xB9, 0x73, 0x96,
0xC8, 0xE9, 0xE5, 0xE9, 0x99, 0x67, 0x2B, 0xC9, 0xD3, 0xD0, 0xE4, 0x22, 0xF9, 0x21, 0xD0, 0xE3,
0xF0, 0x4C, 0xF6, 0x3D, 0x5C, 0x0B, 0x30, 0xFD, 0x5E, 0xA7, 0xC2, 0xFF, 0xE5, 0x23, 0x5D, 0x34,
0x79, 0x5A, 0xDD, 0x3A, 0x0A, 0x63, 0x1C, 0xC4, 0x4C, 0x86, 0x07, 0xF9, 0x1C, 0x98, 0x79, 0xFF,
0xA3, 0xF4, 0xD6, 0x05, 0x33, 0xDD, 0x24, 0xEF, 0xB6, 0x09, 0x94, 0x52, 0x57, 0xC9, 0xDE, 0x8B,
0xC3, 0xDB, 0x58, 0x5C, 0xDB, 0x9C, 0xD3, 0xD7, 0x08, 0x8D, 0x61, 0x55, 0x7F, 0xF5, 0x66, 0xF7,
0x30, 0x49, 0xCF, 0x6B, 0x2D, 0x6B, 0xEC, 0x1F, 0xF1, 0x2F, 0x72, 0x82, 0x4D, 0xBA, 0x7B, 0xCD,
0x3A, 0x72, 0x3E, 0x66, 0xAA, 0x3A, 0xF5, 0x24, 0x82, 0xAA, 0x9A, 0xA4, 0x55, 0xF0, 0xDC, 0x28,
0x5D, 0x02, 0xF2, 0x7F, 0x8B, 0x78, 0xFF, 0xFD, 0x97, 0xD2, 0xA6, 0xF3, 0x02, 0x32, 0xAF, 0xE5,
0x9A, 0x59, 0xD3, 0xBA, 0x74, 0xFF, 0x9F, 0x59, 0x0B, 0x27, 0x26, 0x68, 0x6B, 0x44, 0x5C, 0xBC,
0xF6, 0xB7, 0x78, 0x7C, 0xF9, 0xB1, 0x93, 0xAF, 0xEC, 0x3C, 0xF3, 0xFC, 0x6C, 0xE1, 0x6E, 0x39,
0x4A, 0xE5, 0x4D, 0x2B, 0xED, 0xEA, 0x3A, 0xD1, 0x53, 0xF3, 0x7A, 0xCD, 0x2C, 0xDC, 0xA4, 0x46,
0xAE, 0xF5, 0xE0, 0x97, 0xA1, 0x24, 0xD2, 0xC1, 0xDA, 0x42, 0x65, 0x29, 0xBB, 0x94, 0x55, 0x54,
0x3A, 0x55, 0x22, 0xFA, 0x41, 0x48, 0xCE, 0x86, 0x9B, 0x30, 0xF5, 0x00, 0x33, 0x71, 0x0E, 0x43,
0xA7, 0xA0, 0x06, 0x06, 0x22, 0xB9, 0x96, 0x38, 0xD3, 0x6F, 0x4D, 0x80, 0xE5, 0xFF, 0x7D, 0xF7,
0x94, 0x4E, 0xE8, 0x97, 0x35, 0x3A, 0xAA, 0x52, 0xD7, 0x46, 0x7F, 0xFB, 0xF8, 0x0A, 0xCE, 0xFC,
0x4A, 0x9F, 0x1F, 0xD1, 0xDA, 0x16, 0xC1, 0x01, 0x99, 0xA0, 0x3E, 0x6D, 0x6F, 0xDC, 0xC8, 0x71,
0x86, 0xB8, 0x4C, 0xDF, 0x85, 0x1B, 0x93, 0x13, 0x27, 0x6D, 0xF6, 0xE6, 0x3B, 0x9A, 0x50, 0x0E,
0xAA, 0xA8, 0x02, 0x14, 0x45, 0x77, 0x97, 0x53, 0x06, 0xF8, 0x9A, 0x0A, 0xAC, 0x42, 0x67, 0xE3,
0x98, 0x69, 0x1C, 0x04, 0xCF, 0xFD, 0xEA, 0x05, 0x7B, 0x37, 0xF8, 0x0C, 0x20, 0x8F, 0x9A, 0x39,
0xD1, 0xAD, 0x3D, 0xB2, 0x26, 0x95, 0x27, 0x27, 0x58, 0xAB, 0x26, 0xB2, 0xA6, 0x98, 0x48, 0xAD,
0x1D, 0x8A, 0xB3, 0xD6, 0xE2, 0x0E, 0xE6, 0x31, 0xEF, 0xA8, 0xEB, 0xD6, 0xC0, 0xBE, 0xBE, 0xE1,
0x7C, 0xC8, 0x5A, 0xFC, 0x11, 0x8F, 0x7E, 0x9F, 0x34, 0x42, 0xF5, 0x03, 0xF0, 0x00, 0x7F, 0x3A,
0x3D, 0x5B, 0xE2, 0xAB, 0xBB, 0xB5, 0x6B, 0xFB, 0x0D, 0x1A, 0xAC, 0x65, 0x3E, 0x5A, 0x0D, 0xFE,
0x20, 0x4E, 0x66, 0xFC, 0x77, 0xF8, 0x18, 0xD7, 0xF3, 0x8E, 0x95, 0xD3, 0x2D, 0xD9, 0x60, 0xFB,
0xB8, 0x26, 0x1A, 0x57, 0x4D, 0xCD, 0x0C, 0xD2, 0x9D, 0x67, 0x0F, 0xE8, 0xE4, 0xDE, 0xC7, 0xC1,
0x79, 0x0C, 0x0C, 0x61, 0xC2, 0xFE, 0x36, 0x49, 0x19, 0x60, 0x02, 0x57, 0x67, 0x1A, 0x17, 0xDE,
0x7D, 0x8E, 0xDF, 0xC1, 0x8F, 0xA2, 0x46, 0x6A, 0x9E, 0x37, 0xF6, 0xEE, 0x66, 0xEE, 0xCF, 0xD6,
0x08, 0xED, 0x4D, 0xB0, 0xDD, 0xE0, 0x27, 0xA3, 0x45, 0x63, 0x1F, 0xDF, 0x14, 0x5F, 0xB9, 0xCA,
0x1B, 0xA8, 0x98, 0x7A, 0x6B, 0x86, 0xBF, 0xFB, 0x70, 0xE8, 0x59, 0xD1, 0xBF, 0xA2, 0xAB, 0xD6,
0x45, 0x13, 0x7F, 0x0C, 0x8E, 0x08, 0x27, 0x3B, 0xBE, 0x33, 0xBC, 0x6D, 0x61, 0x50, 0x8D, 0xB7,
0x74, 0x79, 0xB1, 0x07, 0xCE, 0x27, 0x27, 0xA9, 0x5A, 0x12, 0x1E, 0x9C, 0xA4, 0x1C, 0x71, 0xC9,
0xC4, 0xF3, 0xF8, 0x4B, 0x30, 0x18, 0x5C, 0x6C, 0x34, 0xF8, 0xCF, 0xF1, 0x1A, 0xC1, 0x3C, 0x4B,
0x48, 0xE3, 0x79, 0x1E, 0xDD, 0x13, 0x8B, 0xC2, 0xD0, 0x7F, 0x27, 0x0F, 0xA2, 0xEC, 0x85, 0xB5,
0x59, 0xFC, 0x07, 0xED, 0x7D, 0x4F, 0xAC, 0x1D, 0xD7, 0x79, 0xDF, 0x99, 0x19, 0x91, 0xD7, 0xF1,
0xA0, 0x19, 0x2D, 0x24, 0xA7, 0xB1, 0xD0, 0x4C, 0x16, 0xE9, 0xA2, 0x69, 0xEB, 0xE9, 0xC2, 0x8B,
0xA0, 0x48, 0x35, 0x23, 0x0B, 0x88, 0x17, 0x5E, 0x98, 0x01, 0x78, 0x25, 0x24, 0x02, 0xCA, 0x2C,
0xB2, 0x68, 0xE5, 0xA4, 0x6F, 0x93, 0x4D, 0x01, 0xFB, 0xCD, 0xC8, 0x42, 0xA1, 0x85, 0x17, 0x62,
0x80, 0x28, 0x59, 0x64, 0x61, 0x01, 0x55, 0x00, 0xF9, 0x12, 0x05, 0xB3, 0xC8, 0xC2, 0x68, 0xC4,
0x37, 0x23, 0x69, 0xC1, 0x85, 0x16, 0xBC, 0x8A, 0x62, 0x68, 0xE1, 0x85, 0xAE, 0x2D, 0x31, 0x84,
0xA8, 0x05, 0x47, 0xE6, 0xD0, 0x9C, 0xF7, 0xDE, 0xCC, 0x9C, 0x7E, 0xBF, 0xDF, 0x77, 0x66, 0xEE,
0x7D, 0x7F, 0x28, 0x3E, 0xD2, 0x92, 0x42, 0xB7, 0x7D, 0xE4, 0x9D, 0x7B, 0xEE, 0x99, 0x7F, 0xE7,
0xCF, 0x77, 0xBE, 0xFF, 0xDF, 0x77, 0xBC, 0x85, 0x31, 0xA6, 0xCC, 0x8C, 0x49, 0x2A, 0x63, 0xC2,
0x95, 0x31, 0x41, 0x2D, 0x15, 0x9D, 0x7C, 0x1E, 0x31, 0xE3, 0x5F, 0x6E, 0x6D, 0x2F, 0x9F, 0x81,
0x1F, 0xFC, 0xFE, 0xA4, 0xCF, 0x7C, 0x7E, 0x56, 0xAE, 0xEB, 0xF8, 0x41, 0xF9, 0x6E, 0xD7, 0xEB,
0xF3, 0x87, 0xF1, 0x63, 0xFE, 0xE8, 0x74, 0xE6, 0x75, 0xD1, 0xD2, 0x97, 0x8F, 0x7C, 0x57, 0xE6,
0x8F, 0xFC, 0xEC, 0x9F, 0xA3, 0x1D, 0xF2, 0xB1, 0xBD, 0x49, 0xE4, 0x68, 0xB3, 0x10, 0xC7, 0xA5,
0x31, 0xF1, 0x12, 0xAD, 0xE0, 0x00, 0xE9, 0x10, 0x19, 0x93, 0xF2, 0x28, 0xCD, 0x3C, 0x7A, 0xE2,
0x2C, 0x4E, 0x7C, 0x24, 0x0F, 0x31, 0x81, 0xDC, 0xDE, 0x18, 0x63, 0xF7, 0x2E, 0xDA, 0xCC, 0xA4,
0x99, 0x49, 0x6A, 0xDC, 0xE1, 0xF7, 0xBC, 0x23, 0x2D, 0x70, 0x47, 0x58, 0xE3, 0x51, 0x7E, 0xC7,
0x47, 0x95, 0x3C, 0x21, 0x13, 0x22, 0x27, 0xA2, 0x15, 0x4E, 0xCC, 0x1A, 0x9C, 0x98, 0x75, 0x72,
0xE2, 0x8B, 0x17, 0xE5, 0x89, 0xDD, 0x0C, 0xCF, 0x4D, 0x3D, 0xDB, 0xE2, 0x5D, 0xA7, 0xCE, 0xC8,
0xE1, 0xCB, 0xE7, 0xA5, 0x82, 0x37, 0x1B, 0xAF, 0xD3, 0xC6, 0x84, 0xF2, 0xD3, 0x33, 0x9B, 0xD3,
0xD8, 0x4D, 0x9F, 0x93, 0x0C, 0xC7, 0x2F, 0xF0, 0x71, 0x7F, 0x89, 0xDD, 0x95, 0x16, 0x59, 0x5B,
0x7B, 0x32, 0x04, 0x9D, 0x27, 0x83, 0xF8, 0xA7, 0xC6, 0x62, 0x3E, 0x79, 0xC8, 0x0B, 0xA3, 0x70,
0x87, 0x5E, 0xB2, 0x93, 0x1C, 0x02, 0xC3, 0x4E, 0x18, 0x0E, 0x7E, 0x8D, 0xB1, 0xEF, 0xFC, 0x61,
0xB1, 0x58, 0xB8, 0x4A, 0x5C, 0x3E, 0xE3, 0x48, 0xF7, 0x1C, 0x67, 0xFC, 0x0E, 0x71, 0xA7, 0xB1,
0x3C, 0x8F, 0x53, 0x81, 0x2D, 0xCC, 0x69, 0x93, 0xDA, 0x85, 0xAD, 0x7C, 0x3C, 0xC4, 0xC8, 0x53,
0xE4, 0x0D, 0xDE, 0x59, 0xD7, 0x2C, 0xAF, 0xB4, 0xE7, 0x8D, 0x9C, 0xA8, 0x30, 0x14, 0x51, 0x6B,
0x1E, 0x7B, 0xA2, 0x77, 0x8F, 0xF6, 0x31, 0xA0, 0x49, 0xE1, 0xDA, 0x11, 0xA3, 0x59, 0xB6, 0xC2,
0x03, 0x65, 0x74, 0x23, 0x3C, 0x23, 0xD6, 0x83, 0x40, 0x42, 0x88, 0x3E, 0x84, 0xBC, 0x0C, 0x70,
0x31, 0x18, 0xCE, 0xA2, 0xB6, 0x1D, 0xFD, 0xF1, 0xFA, 0xDF, 0x91, 0x2E, 0xBE, 0x69, 0x17, 0x65,
0x9D, 0xA2, 0xF3, 0x25, 0xA6, 0x0C, 0x53, 0x95, 0xC7, 0x97, 0x3F, 0xEE, 0x3E, 0xE9, 0x50, 0xFF,
0xCE, 0x6F, 0xA4, 0x2F, 0xBE, 0xF7, 0xFE, 0x5E, 0x73, 0xE9, 0x91, 0x87, 0xD8, 0xDE, 0xB8, 0x9A,
0xD5, 0x32, 0xA9, 0xF9, 0x7D, 0x15, 0xCC, 0x6C, 0x25, 0x6D, 0x92, 0xA6, 0xFD, 0x82, 0x87, 0x95,
0x0C, 0x78, 0x7A, 0xC5, 0xB6, 0x76, 0x08, 0x07, 0x2E, 0xC9, 0x19, 0x87, 0x16, 0xDD, 0x3E, 0x5A,
0x58, 0xB9, 0x39, 0x0A, 0x97, 0x6E, 0x59, 0x4C, 0x85, 0xE8, 0x13, 0x0A, 0xD5, 0x46, 0xE1, 0xD6,
0xDC, 0x15, 0xB0, 0x0E, 0x5D, 0x41, 0x86, 0x1D, 0x85, 0xBD, 0x85, 0x6D, 0xDC, 0xC5, 0x32, 0xFE,
0x31, 0x0B, 0x5E, 0xEF, 0x0A, 0x32, 0x11, 0x71, 0xC1, 0x42, 0x89, 0x89, 0x3C, 0x54, 0x90, 0xD5,
0xE7, 0x0A, 0xC6, 0x5D, 0x9C, 0xB3, 0x10, 0x74, 0x98, 0x40, 0x29, 0xC4, 0xED, 0xB8, 0x62, 0x57,
0x58, 0x5C, 0x28, 0x64, 0x98, 0x72, 0x29, 0x7C, 0x60, 0x1E, 0x9D, 0x96, 0x92, 0x7C, 0xB6, 0x1D,
0x20, 0x72, 0xD2, 0x73, 0x37, 0xF1, 0x9F, 0x4A, 0x85, 0xE5, 0xDF, 0x07, 0x58, 0xB0, 0xF8, 0x6B,
0x5C, 0x85, 0x5D, 0xE9, 0x15, 0xBE, 0xFD, 0xBA, 0xDE, 0x12, 0x74, 0xEE, 0x96, 0xF8, 0x5D, 0xF7,
0x8C, 0xDE, 0x55, 0x44, 0xD7, 0x5C, 0xC5, 0x30, 0x56, 0xB8, 0x2B, 0xBC, 0xF1, 0x96, 0xF4, 0xB2,
0x56, 0x24, 0x0D, 0x2B, 0x64, 0x90, 0xD9, 0x0E, 0x74, 0x57, 0x2B, 0x64, 0x8E, 0x7F, 0x71, 0x1C,
0xF8, 0xA8, 0xE2, 0xC0, 0xE1, 0x30, 0x0E, 0x2C, 0x8E, 0xC5, 0x81, 0x44, 0x75, 0xB2, 0x02, 0x0F,
0xE3, 0xC0, 0x3B, 0x22, 0xC7, 0xE9, 0x84, 0xF1, 0x5F, 0xC5, 0xCB, 0xBB, 0x09, 0x81, 0x74, 0x13,
0x82, 0xF8, 0x0E, 0x0E, 0x0F, 0x99, 0xCD, 0x3F, 0x01, 0x14, 0xB3, 0x8D, 0xEE, 0xA6, 0x4F, 0x74,
0x78, 0x79, 0x8E, 0xE7, 0x49, 0x65, 0xBC, 0x94, 0xCA, 0x68, 0x25, 0x6B, 0x46, 0x1E, 0x9C, 0x03,
0x1F, 0xC5, 0x55, 0xD0, 0xCA, 0x04, 0xC9, 0x33, 0xBD, 0x4E, 0x20, 0x4C, 0xA8, 0xCA, 0x80, 0xD5,
0x6F, 0x39, 0x49, 0x95, 0x00, 0xDD, 0xD3, 0x1D, 0xE6, 0x4D, 0x10, 0x59, 0x5C, 0x45, 0x35, 0xA6,
0xD2, 0x02, 0xFB, 0xCA, 0x20, 0xE5, 0x68, 0x8D, 0x3C, 0x33, 0x95, 0x45, 0x28, 0x4F, 0xC2, 0x3A,
0xB4, 0x98, 0xE1, 0xA8, 0x8E, 0x71, 0x1F, 0xDF, 0xFE, 0x3A, 0xF0, 0x74, 0x6B, 0x4E, 0xBF, 0x4A,
0xC4, 0xB5, 0x9C, 0x10, 0x1F, 0x91, 0x90, 0x1B, 0x50, 0x1D, 0xDC, 0x33, 0x9B, 0xCD, 0xE7, 0xCA,
0xE2, 0xC4, 0x26, 0x98, 0xE6, 0x19, 0x8B, 0x16, 0xC5, 0x04, 0xC5, 0xD9, 0x6D, 0x14, 0xFB, 0x6D,
0xF4, 0xEA, 0x7B, 0x52, 0x0C, 0xEA, 0x1D, 0x29, 0xF6, 0xA1, 0x14, 0xE3, 0x4A, 0x8A, 0x41, 0x8D,
0xE2, 0x60, 0x76, 0x80, 0x21, 0xA4, 0x28, 0xC3, 0x29, 0xC5, 0x1D, 0x23, 0x45, 0x69, 0xDA, 0x4E,
0x1E, 0x34, 0x28, 0xEE, 0x18, 0x29, 0xCA, 0xEF, 0xF0, 0xDA, 0xCD, 0x06, 0x45, 0xF9, 0x1D, 0x5E,
0x03, 0x2A, 0xDC, 0xC9, 0x1B, 0x16, 0x0D, 0x8A, 0xE0, 0x19, 0xAE, 0xA1, 0xB5, 0x72, 0xFB, 0x12,
0xF3, 0x32, 0xAB, 0x67, 0x58, 0x2C, 0xBB, 0x5B, 0xE8, 0x8D, 0xB5, 0x44, 0xF0, 0xBB, 0x07, 0x06,
0x9F, 0x60, 0xEE, 0xB7, 0x32, 0xE5, 0xD2, 0x77, 0xA0, 0xDC, 0x59, 0x0D, 0x6C, 0x19, 0xAD, 0x00,
0xAE, 0x1C, 0x6F, 0x99, 0x11, 0x4C, 0xA2, 0x2C, 0xD5, 0x81, 0x03, 0x52, 0x72, 0x26, 0xB5, 0x32,
0xE1, 0x05, 0xD1, 0x4A, 0x17, 0x0D, 0x6E, 0x0C, 0x5A, 0x4C, 0xA7, 0xDF, 0x01, 0x69, 0x9B, 0x21,
0x05, 0x66, 0x2A, 0x39, 0x8A, 0x29, 0xA7, 0x3F, 0x21, 0x24, 0x44, 0x24, 0x10, 0x11, 0x81, 0x93,
0x48, 0x5D, 0xE9, 0x06, 0xC9, 0x50, 0x00, 0xF0, 0x94, 0x63, 0xCB, 0x23, 0x67, 0xE1, 0xEC, 0xD8,
0xCE, 0xF8, 0xFB, 0xEC, 0xA1, 0xDC, 0xE7, 0xEF, 0x76, 0xEC, 0x31, 0x1E, 0xF9, 0xB9, 0x54, 0x62,
0xBD, 0x7D, 0x1F, 0x87, 0x6B, 0x38, 0xB4, 0x23, 0xB9, 0xCB, 0x14, 0x61, 0x4A, 0x53, 0x9B, 0x35,
0x0D, 0xCC, 0x1C, 0xCE, 0x5D, 0xF7, 0x91, 0x27, 0x53, 0xF6, 0xFD, 0x71, 0x1E, 0x2F, 0x6D, 0x73,
0x59, 0x00, 0x9C, 0xBC, 0x0E, 0x37, 0x04, 0x0D, 0xC6, 0x2D, 0xA8, 0x23, 0xF2, 0x7D, 0xB8, 0x39,
0x02, 0xF8, 0x63, 0x0A, 0x1A, 0x90, 0x40, 0x00, 0x61, 0x4A, 0x56, 0xA2, 0x9C, 0xCF, 0x7B, 0x4C,
0xA6, 0x80, 0xBD, 0xC7, 0x23, 0xC8, 0x71, 0x59, 0xE0, 0x32, 0x90, 0x18, 0xDC, 0x88, 0x89, 0x08,
0x01, 0x3E, 0x32, 0x9B, 0x98, 0xD3, 0xA0, 0xC5, 0x2B, 0x7C, 0x22, 0x1B, 0xD3, 0x63, 0x7C, 0x0D,
0x39, 0xAA, 0xE7, 0xE4, 0x33, 0x00, 0x9D, 0x71, 0xD2, 0x38, 0xC4, 0x78, 0x83, 0x82, 0xF4, 0x71,
0x55, 0x0E, 0x0D, 0xF6, 0xDE, 0xB0, 0x20, 0x86, 0x0A, 0x3B, 0xB9, 0x6A, 0xD6, 0x62, 0x21, 0x7D,
0x2C, 0x57, 0xC5, 0xC0, 0x62, 0x00, 0x53, 0xE2, 0xB5, 0x10, 0x55, 0x40, 0x6C, 0x7E, 0x2F, 0x55,
0x79, 0x8D, 0x37, 0xA2, 0xC5, 0xAB, 0x19, 0x1E, 0x23, 0xCF, 0xD9, 0x23, 0x4E, 0xEB, 0x89, 0xD8,
0xAA, 0x5C, 0xD8, 0x80, 0x15, 0x57, 0x24, 0x16, 0x0D, 0xD0, 0x60, 0x70, 0xF0, 0x10, 0xE2, 0x44,
0xBC, 0xCC, 0xE7, 0x4F, 0x09, 0x4E, 0x04, 0xF6, 0xD2, 0x7B, 0xE5, 0xE7, 0x72, 0xBC, 0x8D, 0x18,
0x98, 0xEF, 0xF6, 0x88, 0x7A, 0xFB, 0xB1, 0xC4, 0xAE, 0xCF, 0x70, 0x48, 0xD8, 0x8C, 0x65, 0x4E,
0xCC, 0xEA, 0xBA, 0xF3, 0xF9, 0xB1, 0x61, 0x1E, 0x51, 0x38, 0xF1, 0x7A, 0xA3, 0x1C, 0xD5, 0x12,
0x8B, 0x95, 0x74, 0xB0, 0x21, 0xF8, 0x80, 0xFA, 0x36, 0xAC, 0x00, 0x58, 0xE9, 0xBA, 0xC3, 0x4A,
0x76, 0x44, 0xB7, 0x21, 0x0A, 0x3A, 0x72, 0x2A, 0xD6, 0x53, 0x39, 0x4F, 0x11, 0x54, 0x32, 0x90,
0x78, 0x2E, 0x54, 0x7D, 0x74, 0xC7, 0x53, 0x58, 0xD4, 0x29, 0x99, 0x5E, 0x39, 0x45, 0xBE, 0xB4,
0x21, 0x73, 0x24, 0xA7, 0x4A, 0x42, 0x6E, 0x49, 0xCA, 0x36, 0x28, 0x81, 0xDB, 0xD7, 0xAF, 0x1B,
0x05, 0xD7, 0xDF, 0x0E, 0x3B, 0x30, 0x10, 0x19, 0xCE, 0xF6, 0x09, 0xDD, 0xF1, 0xE6, 0x29, 0xD3,
0x7D, 0x9E, 0x02, 0x41, 0x92, 0x19, 0x1F, 0x43, 0xF8, 0x5C, 0x47, 0x06, 0x71, 0x56, 0x4B, 0xD7,
0xD0, 0xF1, 0x81, 0xD4, 0x4C, 0xFE, 0x57, 0xD2, 0x3D, 0x1F, 0xD4, 0x82, 0x64, 0xB5, 0x00, 0xF2,
0x4A, 0xB1, 0x8A, 0x12, 0x40, 0xA7, 0x54, 0x28, 0xCA, 0x92, 0x0A, 0x2C, 0x87, 0xB4, 0x48, 0x0A,
0x2C, 0x14, 0xAF, 0xF3, 0x5B, 0xF2, 0xBD, 0xE1, 0xAD, 0xFC, 0x47, 0x5C, 0x27, 0x29, 0x60, 0xD3,
0x71, 0x01, 0x5C, 0xB9, 0xF6, 0xE9, 0xFE, 0x5C, 0x4D, 0xF6, 0x34, 0x29, 0x72, 0x2C, 0xDC, 0xD6,
0x6F, 0x49, 0xE4, 0xAC, 0x3C, 0x14, 0x63, 0x19, 0x2F, 0xE5, 0xA1, 0x72, 0x46, 0x30, 0x63, 0x52,
0x04, 0x24, 0x34, 0x20, 0xA2, 0x2B, 0x90, 0x21, 0x69, 0x47, 0x99, 0x05, 0x6C, 0x98, 0x1C, 0x4B,
0x36, 0x3D, 0x5E, 0xC5, 0x3A, 0x67, 0x65, 0xA0, 0x7D, 0x09, 0xBA, 0x52, 0x89, 0x8E, 0x12, 0x77,
0xF3, 0x98, 0x10, 0x7F, 0xD0, 0xEB, 0x2A, 0xB2, 0x17, 0x6D, 0xF5, 0x1B, 0x02, 0x44, 0x95, 0x13,
0x12, 0xD9, 0x76, 0x60, 0x60, 0xE5, 0xD8, 0x75, 0x91, 0x2B, 0xF1, 0x9A, 0x3F, 0xD3, 0x03, 0x95,
0x0A, 0x18, 0xE1, 0xF0, 0xE8, 0xB3, 0xBC, 0x07, 0x04, 0x42, 0x51, 0x6D, 0x3E, 0x62, 0x2B, 0xE2,
0x2D, 0x62, 0x30, 0x3C, 0x30, 0xE8, 0xFE, 0x58, 0xCE, 0xFD, 0x83, 0x30, 0xC9, 0x03, 0x60, 0x74,
0x39, 0x23, 0x9C, 0x3E, 0x7A, 0x46, 0x6F, 0x20, 0x1B, 0xE3, 0xEB, 0xD4, 0xA2, 0x18, 0xA1, 0xE8,
0x93, 0xD4, 0xE5, 0xA0, 0x6F, 0xD1, 0xBB, 0xD7, 0x30, 0x09, 0xC0, 0xA0, 0x29, 0x90, 0x67, 0xB4,
0x94, 0xA2, 0xD7, 0xA1, 0x98, 0x02, 0xAF, 0x0A, 0x51, 0xB9, 0x06, 0x16, 0x58, 0x8A, 0x29, 0xB0,
0xAB, 0x60, 0xB9, 0x9D, 0x1C, 0xE4, 0xFD, 0x5A, 0x2D, 0x4D, 0xDF, 0xC9, 0xE5, 0x77, 0x78, 0x0D,
0x48, 0x63, 0x27, 0x07, 0xFC, 0x5E, 0x03, 0x90, 0xED, 0xE4, 0x1D, 0xE9, 0x5B, 0x86, 0x22, 0xA6,
0xEC, 0x9A, 0xE2, 0xE3, 0x82, 0x18, 0x36, 0xCE, 0x22, 0x4C, 0x27, 0x20, 0x39, 0xBA, 0x85, 0x0E,
0xA4, 0x60, 0x0E, 0x4D, 0xF9, 0xC1, 0x03, 0x4F, 0xA0, 0x81, 0x99, 0x88, 0x75, 0xC9, 0x7B, 0x0C,
0x44, 0xEC, 0x18, 0xE4, 0x3C, 0x03, 0x97, 0x02, 0xE8, 0x24, 0x04, 0x93, 0x75, 0x01, 0xEC, 0x54,
0x21, 0xF8, 0x19, 0x81, 0x4D, 0x61, 0x72, 0x5A, 0x2C, 0x85, 0x6E, 0xE4, 0x7C, 0x6E, 0x9D, 0x03,
0x1F, 0xE9, 0x0D, 0x98, 0x23, 0x99, 0x5B, 0x21, 0x18, 0x1D, 0xBA, 0x9C, 0x8B, 0xDC, 0x0E, 0xF2,
0x93, 0x03, 0x00, 0x47, 0x6E, 0x2A, 0xE0, 0x50, 0xA5, 0x15, 0x51, 0x2C, 0xDE, 0x6E, 0x49, 0x30,
0x56, 0x04, 0xEF, 0x86, 0x08, 0x69, 0x05, 0xEE, 0xD3, 0x16, 0xBA, 0x96, 0x20, 0x26, 0x08, 0x18,
0x67, 0xB8, 0x84, 0x44, 0x1F, 0xE0, 0x32, 0x10, 0x49, 0xB5, 0x44, 0x44, 0x2B, 0xE2, 0xA1, 0x42,
0x79, 0x77, 0x20, 0xA8, 0x03, 0xD5, 0x33, 0xE5, 0xFF, 0x59, 0xBD, 0x8D, 0x6A, 0xA2, 0xA6, 0x02,
0xD4, 0x6D, 0x20, 0x62, 0x6A, 0x55, 0xA6, 0x26, 0xFB, 0x55, 0x80, 0x07, 0x19, 0xC8, 0xEE, 0xEF,
0x63, 0x16, 0xA3, 0x1B, 0x5C, 0x99, 0xFF, 0x83, 0xD4, 0x34, 0xC7, 0xB4, 0x86, 0x3D, 0x20, 0xC0,
0x44, 0x3D, 0x86, 0xD4, 0xC4, 0x3D, 0x40, 0x43, 0xF8, 0x8A, 0x6D, 0xF7, 0x05, 0x2C, 0x74, 0x89,
0xF3, 0x68, 0xBA, 0x7E, 0x5B, 0x1E, 0xEF, 0xB5, 0xFD, 0x36, 0xD6, 0x53, 0xD3, 0x6F, 0x53, 0x3C,
0x91, 0x2F, 0x41, 0x81, 0xAB, 0x3E, 0x07, 0x5F, 0x59, 0xF5, 0x98, 0xB9, 0x58, 0xBE, 0x80, 0x14,
0x32, 0xA1, 0x12, 0x9D, 0x34, 0x5D, 0xBE, 0x7A, 0x69, 0xAA, 0x7C, 0xE1, 0x77, 0x0F, 0x40, 0xE5,
0x57, 0xF2, 0xDD, 0x06, 0x5F, 0xF1, 0x9B, 0x35, 0xBE, 0xA2, 0x77, 0x57, 0xF8, 0x0A, 0x3F, 0x5A,
0xE2, 0x2B, 0x90, 0x69, 0xE6, 0x57, 0x81, 0x2F, 0xCF, 0x2A, 0xDD, 0x71, 0x5F, 0x97, 0x9C, 0x14,
0x10, 0x5D, 0xA6, 0x22, 0xE7, 0xDE, 0x8B, 0xB7, 0xE6, 0xF3, 0xA7, 0x3A, 0xB2, 0x1F, 0x97, 0x71,
0xE8, 0x72, 0x91, 0xBD, 0x2F, 0xDE, 0xEF, 0xC3, 0xD6, 0xC5, 0x6A, 0x5C, 0x1D, 0x5B, 0x14, 0xC5,
0x31, 0xE5, 0xC6, 0x27, 0x8E, 0xF3, 0x6D, 0xE1, 0x95, 0x15, 0xBA, 0x31, 0xEB, 0x28, 0xC4, 0xE7,
0xC4, 0x73, 0x51, 0x0D, 0xC4, 0xE1, 0xF5, 0xC4, 0x15, 0xE9, 0x0B, 0x78, 0x52, 0xF8, 0x33, 0xE5,
0xF0, 0xC9, 0xDF, 0xE5, 0x54, 0x05, 0xC4, 0x3F, 0xC6, 0x89, 0xD9, 0xCF, 0x71, 0xC2, 0xEB, 0x37,
0x4F, 0xF0, 0xDD, 0x61, 0x4D, 0x9C, 0xD3, 0x12, 0x07, 0xF5, 0xC4, 0xB4, 0xA5, 0x7B, 0x07, 0xF8,
0xC0, 0xBC, 0xF2, 0x65, 0xA1, 0x97, 0x82, 0x27, 0x87, 0x0B, 0x42, 0x19, 0x3D, 0xC5, 0xBD, 0xA1,
0xA5, 0x80, 0x4B, 0xB5, 0xCA, 0x9A, 0x0F, 0xBB, 0x8D, 0x43, 0x8F, 0xF7, 0x94, 0x64, 0x0D, 0xDF,
0x03, 0xB7, 0x73, 0xBB, 0xC6, 0x6B, 0x51, 0x99, 0x7F, 0x0E, 0x95, 0x32, 0x2D, 0x1F, 0x72, 0xE5,
0x80, 0x93, 0x18, 0x44, 0xBA, 0xCF, 0xC1, 0xA7, 0xE4, 0x97, 0x6B, 0x65, 0x3A, 0x88, 0x2E, 0x2D,
0x38, 0x97, 0xDB, 0x4E, 0xF4, 0x83, 0xD8, 0x47, 0x56, 0xA4, 0x7C, 0xE1, 0xD6, 0x53, 0x25, 0x38,
0x91, 0x76, 0x46, 0x26, 0x66, 0xF1, 0x17, 0x8A, 0xA5, 0xF2, 0x11, 0x5D, 0xDD, 0xA5, 0x70, 0x58,
0xA1, 0xD3, 0x4C, 0x0A, 0x9D, 0xFF, 0x76, 0x0F, 0x0A, 0x9D, 0x6A, 0xD4, 0x91, 0x1C, 0xAE, 0x54,
0x65, 0xC1, 0x70, 0x4F, 0x0A, 0x9D, 0x0F, 0x54, 0xA1, 0xC3, 0x09, 0xDA, 0xC2, 0xE1, 0xC7, 0x14,
0x96, 0xA1, 0x09, 0x18, 0x1B, 0x1D, 0x4F, 0xCF, 0x26, 0x4B, 0xF9, 0x39, 0x54, 0xFE, 0xB2, 0x08,
0x37, 0x07, 0xC5, 0xB1, 0xC3, 0x5F, 0xCF, 0x0A, 0x98, 0x4D, 0x4C, 0x63, 0xAE, 0x3C, 0xBF, 0x3D,
0x9F, 0x9F, 0x12, 0xFA, 0x4C, 0xC5, 0x52, 0x4D, 0x34, 0xCF, 0xC6, 0xE5, 0x68, 0x1D, 0xBE, 0x4C,
0x2F, 0xBD, 0xCE, 0xB5, 0x95, 0xEB, 0xAF, 0x9D, 0xF1, 0x97, 0x9E, 0x73, 0x57, 0x92, 0xC8, 0xF8,
0x1D, 0x9F, 0x32, 0x6B, 0xDD, 0x33, 0x7D, 0x61, 0x92, 0x4F, 0xCB, 0xF2, 0xD3, 0xF7, 0x8D, 0x6F,
0x37, 0xDF, 0x62, 0x5B, 0x8E, 0x6F, 0x27, 0xF5, 0x0B, 0x18, 0x9B, 0xF8, 0x39, 0x60, 0xF1, 0x26,
0xAA, 0x1D, 0x3F, 0x16, 0x83, 0x94, 0x81, 0xD5, 0xAC, 0xA9, 0xEB, 0x00, 0x89, 0xF3, 0x3B, 0x90,
0x92, 0x68, 0x45, 0xB6, 0xF3, 0x9B, 0x18, 0x55, 0x0E, 0x4A, 0x44, 0x20, 0xCB, 0x29, 0x51, 0x71,
0x4C, 0xAD, 0xCA, 0x1D, 0x98, 0xC1, 0x5B, 0xA4, 0xFC, 0x3A, 0x75, 0xE4, 0x6A, 0x7D, 0x12, 0x4D,
0x52, 0x47, 0x21, 0x77, 0x32, 0x59, 0x3E, 0x79, 0xAA, 0x68, 0x05, 0x1C, 0x95, 0x3F, 0xD9, 0x3A,
0x81, 0x40, 0x66, 0x81, 0xC7, 0x22, 0xA6, 0x6C, 0x85, 0xE9, 0xF4, 0x5B, 0x42, 0xCB, 0x0E, 0x1B,
0x9E, 0xFC, 0xB3, 0x9D, 0x20, 0x7B, 0x7D, 0x8E, 0xC7, 0x77, 0x55, 0xB7, 0x64, 0x26, 0x29, 0xD2,
0x89, 0x91, 0x91, 0x2A, 0x78, 0x0E, 0x9E, 0x80, 0xD8, 0x78, 0x29, 0x25, 0x0C, 0x9E, 0xF4, 0x90,
0xE9, 0xAC, 0xCB, 0x9C, 0xCB, 0x03, 0x07, 0x28, 0x59, 0x29, 0xF8, 0x0D, 0x40, 0x1C, 0x83, 0xB0,
0x98, 0xE7, 0x87, 0x69, 0xC9, 0x9F, 0xF8, 0xA0, 0xBA, 0x3A, 0x93, 0x52, 0xE0, 0x73, 0xE4, 0x05,
0x75, 0x14, 0x05, 0x2B, 0xA5, 0x34, 0xB3, 0x07, 0xFF, 0x02, 0xA7, 0xCE, 0x8B, 0xDD, 0xF7, 0x65,
0xF7, 0x0D, 0x81, 0x12, 0x9C, 0xCA, 0x25, 0xE3, 0x0A, 0xFD, 0xFF, 0x2D, 0x05, 0xD7, 0xC1, 0xEE,
0x68, 0x61, 0xC4, 0x42, 0xF7, 0x56, 0xC8, 0x95, 0xE9, 0xE6, 0x52, 0x2D, 0x9D, 0xC6, 0xB9, 0x9E,
0x38, 0xEF, 0xBB, 0x1D, 0xA9, 0x59, 0x16, 0x58, 0xDC, 0x55, 0x21, 0xAB, 0x32, 0xB3, 0xBD, 0x85,
0xA5, 0xF2, 0x2E, 0x24, 0x23, 0xEB, 0xF3, 0x28, 0x20, 0xB7, 0x3E, 0x96, 0x87, 0x6B, 0x84, 0xC8,
0x90, 0xBB, 0xC5, 0x31, 0x69, 0xF8, 0x1C, 0xE5, 0x69, 0x33, 0x43, 0x65, 0x03, 0xF1, 0x93, 0xB2,
0x3F, 0xCA, 0xFF, 0xDC, 0xF3, 0x8F, 0xF9, 0x19, 0xFC, 0x60, 0x2B, 0x29, 0xB3, 0xCA, 0x0F, 0x36,
0x93, 0xD4, 0xBC, 0x8A, 0xA8, 0xE5, 0xE0, 0x0F, 0xC1, 0x3E, 0x97, 0xD9, 0x2C, 0xAA, 0x40, 0x6A,
0xFE, 0x28, 0x37, 0xCE, 0x78, 0x7A, 0x59, 0xCA, 0x7B, 0xA4, 0xAD, 0x1D, 0xCD, 0x6C, 0x78, 0xB4,
0x34, 0x56, 0x7E, 0x40, 0x64, 0xAB, 0x4E, 0xCA, 0x07, 0x68, 0x41, 0xDA, 0xC6, 0xF1, 0x43, 0xBB,
0x38, 0x78, 0x68, 0x13, 0x5B, 0x74, 0x84, 0x0B, 0x29, 0xC7, 0x1A, 0x9C, 0x82, 0x6E, 0x26, 0x6E,
0x72, 0xA7, 0x03, 0xCA, 0x72, 0xE5, 0xB3, 0x94, 0x29, 0xDC, 0xA5, 0xE8, 0xDB, 0x53, 0x51, 0xDC,
0x9A, 0xDF, 0xC8, 0xBC, 0x72, 0x45, 0xFD, 0x45, 0x31, 0x2A, 0x76, 0x1D, 0x6D, 0x23, 0xF9, 0x9B,
0xA9, 0x7E, 0x6B, 0x7D, 0x2E, 0xA9, 0x68, 0x28, 0xA2, 0x28, 0x51, 0x9D, 0x5E, 0x2C, 0x2E, 0x74,
0x13, 0x6F, 0xA1, 0xBC, 0x86, 0x5E, 0xDB, 0x4C, 0x4F, 0x20, 0x83, 0xA2, 0xF7, 0xDA, 0xE2, 0xB7,
0xA4, 0xB2, 0x0E, 0x86, 0x85, 0xBC, 0x98, 0x6D, 0x50, 0x5B, 0x8D, 0x32, 0x80, 0x9B, 0x4A, 0xE3,
0x44, 0x66, 0x96, 0xE0, 0x20, 0x2F, 0x91, 0xB5, 0xAD, 0xCA, 0x15, 0xB0, 0xDE, 0x60, 0x60, 0xE5,
0x02, 0xCC, 0x7E, 0x27, 0x17, 0x40, 0x30, 0xCC, 0x9F, 0xEB, 0xF8, 0x52, 0xE8, 0x89, 0x62, 0x32,
0xB2, 0x14, 0xA9, 0xC8, 0xCA, 0x52, 0x82, 0x86, 0xB6, 0xAA, 0x67, 0xFB, 0xF2, 0x39, 0x65, 0xEB,
0x3C, 0xA6, 0x76, 0x46, 0x38, 0x57, 0xB5, 0xA2, 0xCC, 0x3E, 0x1E, 0x16, 0x64, 0x6B, 0x65, 0xFA,
0x52, 0xBD, 0xA0, 0x22, 0x76, 0x4E, 0x2E, 0xAF, 0x9F, 0x50, 0x92, 0xBD, 0x5D, 0xBF, 0x82, 0x27,
0xCA, 0x19, 0xE9, 0x1E, 0xDB, 0x00, 0x9A, 0x98, 0x43, 0xD9, 0x45, 0x46, 0x17, 0x72, 0x19, 0x58,
0x5D, 0x80, 0x30, 0xE4, 0x6D, 0xDA, 0x87, 0xAC, 0xD5, 0x69, 0xF0, 0xD8, 0x5F, 0xEF, 0x82, 0x8C,
0x63, 0x82, 0x9E, 0xA1, 0x7B, 0x81, 0x3D, 0x23, 0xA2, 0x29, 0xD4, 0x8F, 0x18, 0x31, 0x50, 0x6E,
0xD3, 0x53, 0x8A, 0xE4, 0x01, 0xCD, 0xD1, 0x13, 0xE0, 0xD8, 0xFA, 0x40, 0xE6, 0x53, 0x6F, 0xD3,
0x07, 0xD0, 0x76, 0x23, 0x2D, 0xEA, 0xD1, 0x8A, 0x1E, 0xB2, 0x65, 0x8F, 0x31, 0xE9, 0xC9, 0xF5,
0x80, 0x4F, 0xEB, 0x31, 0x03, 0x3D, 0x2D, 0x17, 0x98, 0xDD, 0x1E, 0x8C, 0x4B, 0x5F, 0xAA, 0xB2,
0x68, 0x0E, 0xD6, 0xA3, 0xE5, 0x58, 0xC7, 0x57, 0x9F, 0xE9, 0x7C, 0x88, 0xAA, 0x3A, 0x6F, 0x9C,
0x51, 0x12, 0xB9, 0xEA, 0xB4, 0x0C, 0x95, 0xBC, 0xAA, 0x4B, 0x86, 0x79, 0x99, 0x08, 0x5D, 0xBE,
0x22, 0xAB, 0xF0, 0x26, 0x00, 0x11, 0x6A, 0x10, 0xF0, 0x1E, 0x52, 0x91, 0xFF, 0xCC, 0xCE, 0xFB,
0x2E, 0xB5, 0x7D, 0x2A, 0x24, 0x3F, 0xAC, 0xDC, 0xAC, 0x7E, 0xE9, 0x6F, 0x31, 0x9F, 0x35, 0x7A,
0x2F, 0xCB, 0xC2, 0x7E, 0x28, 0xA3, 0x03, 0xB9, 0x64, 0x18, 0xC1, 0x84, 0xEA, 0x54, 0x4A, 0x2D,
0x51, 0xF5, 0xEC, 0x79, 0x13, 0x7F, 0x4F, 0x16, 0x4D, 0x22, 0xA0, 0x5B, 0xA5, 0x83, 0xC9, 0xEB,
0x54, 0x64, 0xF0, 0x26, 0x15, 0xA9, 0xB4, 0x4B, 0x81, 0xE6, 0xD9, 0x6E, 0x52, 0xBB, 0xF5, 0x21,
0x29, 0x94, 0xE1, 0xE1, 0x50, 0xC1, 0xA4, 0x2D, 0x17, 0x43, 0xA6, 0x6E, 0x60, 0x18, 0xA8, 0x3D,
0xFB, 0x92, 0xF2, 0x3A, 0xE0, 0x74, 0x1A, 0xC7, 0xCA, 0xA8, 0xFA, 0x67, 0x19, 0xC9, 0x08, 0x3E,
0x39, 0x2C, 0x4A, 0x91, 0x5D, 0x3C, 0x10, 0xD2, 0xE4, 0x8A, 0x48, 0x91, 0x22, 0xE5, 0x07, 0x6D,
0x2F, 0x7D, 0x97, 0x2B, 0x5A, 0xB9, 0xA2, 0xA5, 0x8D, 0x4A, 0x2A, 0x70, 0x45, 0x2C, 0x57, 0x04,
0xB7, 0x31, 0x05, 0x30, 0x52, 0xE4, 0xE8, 0xF7, 0xDE, 0x05, 0xFB, 0x0E, 0x66, 0xD8, 0xBA, 0x45,
0x26, 0xB7, 0xDD, 0xB0, 0x76, 0x7F, 0x58, 0xFC, 0xA0, 0x1F, 0xB5, 0x7D, 0x4E, 0x03, 0x78, 0xC2,
0x1F, 0xE3, 0x5F, 0x4A, 0x26, 0x9B, 0x9A, 0x44, 0x59, 0xFB, 0x32, 0x59, 0x31, 0x66, 0x54, 0x64,
0x58, 0xB9, 0xCE, 0x6B, 0xA9, 0xF4, 0x5B, 0xD2, 0xCA, 0x0D, 0x58, 0x10, 0x62, 0x26, 0xD5, 0x01,
0x54, 0x33, 0x18, 0x4C, 0xA8, 0x02, 0x9D, 0x26, 0x10, 0x5A, 0x8C, 0x15, 0xAA, 0xA9, 0x1E, 0x04,
0x1C, 0xF6, 0xFA, 0x32, 0xB5, 0x76, 0x91, 0xA3, 0xEF, 0xA9, 0x1D, 0xFC, 0x39, 0xF9, 0xB4, 0x1F,
0x53, 0xE1, 0xB4, 0x85, 0x65, 0xDC, 0x43, 0xF0, 0x0E, 0xB4, 0xFA, 0x6D, 0x4A, 0x6A, 0xF2, 0x99,
0x03, 0x59, 0x0C, 0xD0, 0x53, 0x0B, 0x8C, 0x7D, 0xB0, 0x55, 0x0B, 0x40, 0xA6, 0x95, 0xBC, 0xA9,
0x97, 0x29, 0x88, 0xDE, 0x87, 0xB6, 0x0B, 0x2A, 0x9E, 0x9B, 0x78, 0x20, 0x54, 0x6C, 0x37, 0xF7,
0x44, 0xAC, 0x55, 0x3D, 0xB8, 0xC3, 0x0E, 0x84, 0x2A, 0x72, 0xD1, 0x65, 0x61, 0xBE, 0xE0, 0xDB,
0xBF, 0xB9, 0x08, 0x9C, 0xD2, 0xA9, 0x34, 0x38, 0x99, 0x8E, 0x1D, 0xF7, 0x97, 0x66, 0x24, 0x00,
0x69, 0x41, 0x4E, 0x93, 0x8C, 0x7B, 0xAE, 0x1D, 0x94, 0x35, 0x0A, 0xE3, 0x27, 0xFE, 0x51, 0xCD,
0x12, 0x50, 0x41, 0x9E, 0x63, 0x5D, 0x7A, 0x43, 0x79, 0xBD, 0x33, 0x0E, 0xCF, 0x51, 0x9B, 0x02,
0x69, 0x33, 0x5A, 0xE5, 0xB3, 0x56, 0xD5, 0xE7, 0xD4, 0x92, 0xCC, 0xC0, 0x5D, 0x07, 0x60, 0xD9,
0x06, 0xB4, 0x29, 0x87, 0x5E, 0xA6, 0x57, 0x2D, 0x0B, 0x49, 0x4F, 0x9A, 0x95, 0x86, 0x26, 0xAA,
0x3C, 0x53, 0x5D, 0x8B, 0x11, 0x74, 0x9C, 0xA8, 0x4C, 0xB8, 0x4A, 0x5F, 0xDA, 0x6A, 0x1E, 0xA6,
0x86, 0x8E, 0x56, 0x31, 0x35, 0x30, 0x41, 0xED, 0x28, 0xE2, 0x76, 0x20, 0x6F, 0xF5, 0x89, 0x62,
0xB0, 0x9E, 0xC9, 0x12, 0xF6, 0x8E, 0xB5, 0xEA, 0x85, 0xBB, 0xED, 0x76, 0x5E, 0xDA, 0x6A, 0x65,
0xC0, 0x57, 0x5B, 0x54, 0xE0, 0x29, 0x4A, 0x90, 0x19, 0x99, 0x75, 0xD0, 0xFE, 0x0B, 0x80, 0x25,
0x1D, 0x56, 0xB4, 0x14, 0x2E, 0x49, 0x21, 0xBE, 0x72, 0x65, 0x19, 0xD4, 0x52, 0xD8, 0x8E, 0xAE,
0x2C, 0xA3, 0xAA, 0xEB, 0xFD, 0x46, 0x0A, 0xA9, 0xE9, 0x04, 0x27, 0x44, 0x57, 0xDE, 0x6E, 0xA5,
0x90, 0x9A, 0xE8, 0x8A, 0xCC, 0x5A, 0x27, 0x6B, 0x31, 0xBA, 0x02, 0x5A, 0x23, 0x24, 0x32, 0xBA,
0x22, 0xAF, 0xED, 0x04, 0xA9, 0x47, 0x55, 0xB0, 0xF2, 0x64, 0x8A, 0x68, 0x63, 0x08, 0x21, 0xD0,
0x41, 0x00, 0x1A, 0x0E, 0xD9, 0xEA, 0x00, 0xCD, 0xF2, 0xC2, 0xA8, 0x43, 0xCB, 0xA5, 0x90, 0x4A,
0x21, 0x7C, 0xEF, 0x8A, 0xA0, 0x2D, 0x29, 0xA4, 0xF2, 0xC2, 0xD9, 0x4A, 0x0A, 0x9D, 0x14, 0x92,
0xAC, 0xEB, 0x83, 0x5A, 0x0A, 0xF2, 0xB3, 0x8F, 0x8B, 0xE8, 0xCA, 0x3B, 0x42, 0x2A, 0x05, 0x50,
0xA2, 0x2B, 0x22, 0x3E, 0x77, 0xB0, 0x17, 0x5F, 0x19, 0xF0, 0x66, 0x01, 0x86, 0x2B, 0xAD, 0xE3,
0x25, 0x00, 0xA4, 0x2F, 0x2E, 0x4D, 0xFC, 0xA6, 0x9C, 0x95, 0xFB, 0xA2, 0x55, 0x9A, 0x09, 0xFD,
0x5C, 0x06, 0x8D, 0xFC, 0x13, 0xA4, 0x25, 0xA3, 0x97, 0xCA, 0x7C, 0x45, 0x02, 0x55, 0x01, 0x66,
0x6A, 0x90, 0x19, 0x10, 0x56, 0xB8, 0x88, 0x96, 0x61, 0x2D, 0x50, 0x63, 0x8D, 0xDE, 0x02, 0x4F,
0x15, 0x93, 0xBE, 0xA9, 0xCB, 0x93, 0x38, 0x8A, 0x44, 0x45, 0xD0, 0x8A, 0xEA, 0x50, 0xAF, 0x2F,
0xAC, 0x1A, 0x52, 0xC0, 0x2C, 0xC0, 0xC2, 0x5C, 0x45, 0x90, 0x82, 0x50, 0xE5, 0xB5, 0x6A, 0x30,
0x8B, 0xAB, 0x18, 0xF2, 0xD1, 0x36, 0xD4, 0xC1, 0x0D, 0x54, 0xCB, 0x4B, 0x48, 0x1C, 0x86, 0x2A,
0x21, 0x8E, 0x0E, 0x51, 0x74, 0x8C, 0x21, 0xCA, 0x65, 0xEC, 0xBC, 0x6E, 0x3D, 0x42, 0x01, 0xE4,
0x97, 0xF4, 0x46, 0x0F, 0xE8, 0x2F, 0xC1, 0x6E, 0x0E, 0xA0, 0x1D, 0xF9, 0xFE, 0xFE, 0xCA, 0x04,
0xFB, 0x37, 0xA4, 0xEF, 0xD1, 0x7B, 0xE5, 0x56, 0x66, 0x2E, 0x6D, 0xCB, 0x74, 0x04, 0x1F, 0xEF,
0x37, 0x32, 0x73, 0x2F, 0xDC, 0xC0, 0xF4, 0xC4, 0xE5, 0x93, 0xF2, 0xEA, 0xED, 0x3E, 0x5C, 0x26,
0x4F, 0xEC, 0x37, 0x32, 0x83, 0xB3, 0x1B, 0xCB, 0xF4, 0x1B, 0xCB, 0xB8, 0xCC, 0xB6, 0x53, 0xB3,
0xDD, 0x9B, 0xA1, 0xF5, 0xF6, 0x1B, 0xDF, 0x56, 0x52, 0x1D, 0x0C, 0x46, 0xAA, 0x65, 0x41, 0x6D,
0x03, 0x0E, 0xBD, 0xD6, 0x8D, 0xDD, 0x8C, 0x1A, 0x13, 0x48, 0x88, 0x30, 0x08, 0xD8, 0x23, 0x15,
0xD7, 0x17, 0x17, 0xED, 0xF8, 0x37, 0x1C, 0x7B, 0xC5, 0xE1, 0x8A, 0x8A, 0xCB, 0x58, 0x4E, 0xB4,
0x1C, 0x40, 0xE9, 0xDC, 0xBC, 0xAC, 0xE4, 0xBD, 0x31, 0x84, 0xE1, 0x59, 0x23, 0x2B, 0x59, 0xF0,
0x6D, 0xE1, 0x0C, 0x58, 0xFD, 0xB1, 0x87, 0x42, 0xA9, 0x88, 0x07, 0x3B, 0x51, 0xD0, 0xF1, 0x36,
0x59, 0x5D, 0x90, 0x2E, 0x81, 0x6F, 0xCB, 0xE3, 0xF0, 0x2D, 0xF0, 0x22, 0x10, 0xE3, 0x62, 0x00,
0xCA, 0x13, 0x84, 0x16, 0xDD, 0x10, 0x3C, 0xB4, 0x0F, 0xC5, 0xE3, 0x7D, 0x56, 0x14, 0xE8, 0x47,
0xF4, 0xBA, 0xF4, 0xBA, 0x2B, 0x6D, 0x17, 0xDD, 0xF8, 0x51, 0x5E, 0x4B, 0x3F, 0xCB, 0x17, 0x1B,
0x59, 0x91, 0xD2, 0x80, 0xE8, 0x3D, 0xE8, 0x23, 0x07, 0xB4, 0x44, 0x0A, 0x65, 0x0F, 0x12, 0x0C,
0x65, 0xD4, 0x54, 0x83, 0x6B, 0x6E, 0x80, 0x73, 0x93, 0xC9, 0x4E, 0x05, 0x6E, 0xC3, 0xD6, 0x0E,
0xCF, 0xD8, 0xE8, 0xC7, 0x02, 0x4E, 0x7D, 0x6C, 0x45, 0xDA, 0x3C, 0x45, 0xDC, 0xAA, 0xB2, 0xDA,
0x27, 0x14, 0xA4, 0x19, 0x00, 0x9B, 0x1E, 0xE6, 0x7C, 0x19, 0x80, 0xEF, 0xCC, 0x5A, 0x25, 0xA0,
0x18, 0x68, 0x34, 0x12, 0x43, 0xC6, 0x8F, 0x33, 0x34, 0x4F, 0xBF, 0x0B, 0xE5, 0x9D, 0x68, 0xD6,
0xA3, 0x17, 0xC4, 0x4B, 0xFF, 0xCB, 0x80, 0x27, 0xC2, 0xB3, 0xDC, 0xC8, 0xC5, 0x4E, 0x25, 0xD6,
0x2F, 0x2E, 0xEE, 0x2D, 0x14, 0x8B, 0xF6, 0xEE, 0x11, 0x78, 0xF7, 0xFD, 0x56, 0x38, 0xBD, 0x0F,
0x95, 0x56, 0x41, 0x93, 0x16, 0x6A, 0x50, 0xA4, 0x84, 0x4D, 0x33, 0x23, 0x2D, 0x8E, 0x54, 0x0B,
0xA7, 0x4E, 0xFA, 0x26, 0x17, 0x45, 0x7D, 0x76, 0x4E, 0x6D, 0xEF, 0x93, 0xB0, 0xD2, 0x40, 0x5D,
0x18, 0xBD, 0x05, 0xD5, 0x0B, 0xB5, 0x67, 0x37, 0xE8, 0xC3, 0x03, 0x6B, 0x85, 0x9D, 0xA4, 0xC9,
0x7E, 0x54, 0xE1, 0x90, 0x65, 0x22, 0x63, 0x4B, 0xA6, 0x10, 0x3A, 0xF3, 0x12, 0xD7, 0x62, 0x62,
0x54, 0x0F, 0x2C, 0x17, 0xBE, 0x7C, 0x32, 0x41, 0x79, 0x7D, 0xE2, 0xD7, 0x76, 0xD5, 0xFC, 0xE6,
0x7C, 0x1F, 0x64, 0xA5, 0xDB, 0xEF, 0xFF, 0x93, 0xAD, 0x02, 0x41, 0x94, 0x61, 0x27, 0x98, 0xE4,
0x92, 0x29, 0x9F, 0x10, 0x36, 0x29, 0x8B, 0xEA, 0x52, 0x08, 0xA6, 0x27, 0x90, 0x2B, 0x4B, 0x3F,
0x15, 0x74, 0x74, 0x49, 0xC8, 0x55, 0x23, 0x27, 0x7C, 0xE0, 0xBA, 0x25, 0xC8, 0x16, 0x4E, 0x08,
0x1F, 0x23, 0x27, 0x7E, 0x2A, 0xB4, 0x26, 0x0B, 0x9A, 0x3C, 0x0B, 0xE1, 0x20, 0x57, 0xFB, 0x8D,
0x27, 0xF2, 0x74, 0x76, 0x49, 0x7A, 0x15, 0xF7, 0xF9, 0x5F, 0x8F, 0xF6, 0x59, 0x33, 0x53, 0x02,
0x73, 0x6A, 0x38, 0x73, 0xE2, 0xE6, 0x1E, 0x38, 0xA1, 0x73, 0x90, 0x54, 0x83, 0x80, 0x20, 0xDC,
0x2E, 0x56, 0xB4, 0x1D, 0x05, 0x2D, 0x5D, 0x19, 0x64, 0x4E, 0xA8, 0x87, 0x8D, 0x40, 0xBC, 0x62,
0x3A, 0x4E, 0x8D, 0x6E, 0x52, 0x21, 0x0E, 0x79, 0x5E, 0x90, 0x23, 0x15, 0xF2, 0x4B, 0x42, 0x05,
0xED, 0xBD, 0x10, 0x30, 0x2B, 0xD3, 0xA5, 0x3E, 0x2B, 0x99, 0x63, 0xDF, 0xD5, 0x42, 0xF6, 0x69,
0x1F, 0x30, 0x02, 0x1F, 0x4E, 0x36, 0x45, 0xCE, 0xF4, 0xCE, 0x9D, 0x0E, 0x8F, 0x38, 0xC9, 0x00,
0xCB, 0x8F, 0xBE, 0x74, 0xF9, 0xA0, 0xBA, 0x1F, 0x56, 0xC0, 0xF2, 0x08, 0xB3, 0x4A, 0x2C, 0xD0,
0x33, 0xBB, 0xD9, 0x41, 0xEF, 0xBC, 0x77, 0xD1, 0x42, 0xCE, 0xA8, 0xB6, 0xEC, 0x5F, 0xD5, 0x0E,
0x7A, 0x72, 0x27, 0x1B, 0xCC, 0x0E, 0x57, 0x8C, 0xE3, 0xD9, 0x2B, 0x57, 0xF6, 0xB9, 0x7E, 0x29,
0xD2, 0x3D, 0xF4, 0x35, 0x52, 0x8C, 0x46, 0x59, 0x32, 0xAE, 0x28, 0xA1, 0xC3, 0x6A, 0x9E, 0x4D,
0x5D, 0x53, 0xBB, 0xCF, 0xE7, 0xB4, 0x36, 0x69, 0x2F, 0x3D, 0xD0, 0x42, 0xA7, 0x8D, 0x1A, 0x71,
0x97, 0x83, 0xCF, 0x09, 0x28, 0x83, 0x43, 0xA7, 0x4F, 0x39, 0x6B, 0x1B, 0x7B, 0x96, 0x83, 0xAF,
0x39, 0xBD, 0xE8, 0xD7, 0x17, 0x1C, 0x29, 0xEE, 0x2D, 0x32, 0x92, 0x15, 0x61, 0x3E, 0x28, 0xFB,
0xF6, 0xE6, 0xB1, 0x0E, 0x17, 0x50, 0x2C, 0x51, 0x23, 0x13, 0x9D, 0xDC, 0xB4, 0x18, 0xA1, 0x76,
0x26, 0x17, 0xD0, 0x63, 0x49, 0x7D, 0xCF, 0x2C, 0xDC, 0x00, 0xA7, 0xA6, 0x44, 0xEF, 0xD1, 0x32,
0x41, 0x8A, 0xDF, 0xD3, 0xCC, 0x70, 0xFB, 0x48, 0xB5, 0xB5, 0xAF, 0x48, 0x35, 0x5E, 0x17, 0xBD,
0x87, 0xA3, 0x54, 0x7B, 0x16, 0x57, 0x7B, 0x3D, 0xAE, 0x0E, 0x5A, 0x5C, 0x2D, 0x5C, 0x44, 0x0E,
0xA7, 0xA8, 0xA9, 0x5A, 0xE8, 0x9D, 0xBB, 0x1A, 0x63, 0xD2, 0x43, 0xD4, 0x5E, 0xBB, 0x7B, 0xDC,
0xE9, 0x63, 0x17, 0xAF, 0xD0, 0xA7, 0x11, 0xE3, 0x28, 0x24, 0xA3, 0xC3, 0xC3, 0x7A, 0x25, 0x48,
0x3B, 0xEE, 0xBB, 0x47, 0x8F, 0xEC, 0xC2, 0x36, 0x2A, 0x18, 0xEC, 0x92, 0x3E, 0x24, 0x2A, 0xF5,
0x66, 0x8F, 0xCF, 0xCB, 0xA5, 0x32, 0xC0, 0xC1, 0x01, 0xF6, 0x50, 0xA4, 0x69, 0x88, 0xEB, 0xFC,
0xB8, 0x85, 0x33, 0xE8, 0x39, 0xCF, 0xB1, 0x97, 0x71, 0xBD, 0xFD, 0x14, 0x3D, 0x1C, 0x32, 0x3C,
0x8B, 0x24, 0x9C, 0xC2, 0x33, 0xC6, 0x16, 0xED, 0x87, 0x2E, 0x57, 0x20, 0xC2, 0x07, 0x35, 0xA7,
0x00, 0x38, 0x80, 0x85, 0x92, 0x15, 0xD3, 0x53, 0xC8, 0x78, 0x71, 0x49, 0xF5, 0x2C, 0x30, 0x8D,
0xB0, 0x95, 0x7B, 0x25, 0xA8, 0x37, 0x3D, 0x5E, 0xE2, 0x2B, 0x96, 0xDC, 0xCE, 0xA0, 0x67, 0x96,
0x94, 0xA3, 0x7A, 0xBC, 0x55, 0x24, 0x22, 0xCA, 0x0A, 0x94, 0x24, 0x73, 0x61, 0xD9, 0x84, 0xC4,
0x8B, 0x2C, 0x14, 0xEF, 0x9E, 0x03, 0x33, 0x06, 0xA9, 0xAA, 0x77, 0x48, 0x7C, 0x22, 0xF4, 0x46,
0x44, 0xC5, 0x1E, 0xC6, 0x83, 0x65, 0xB9, 0xB7, 0x80, 0xCC, 0x1A, 0xFD, 0x03, 0x64, 0x0E, 0x10,
0x97, 0xA9, 0xB0, 0x1C, 0x20, 0x8D, 0x0E, 0x2F, 0x9D, 0x5B, 0x52, 0x7C, 0xDD, 0x82, 0x80, 0xDC,
0x53, 0x66, 0x15, 0xDA, 0x53, 0x93, 0x23, 0x14, 0x56, 0x5E, 0x20, 0x47, 0x7E, 0xE8, 0x5D, 0x39,
0x25, 0xA4, 0xDF, 0x2E, 0x9C, 0xE4, 0x48, 0xC4, 0xC6, 0xC5, 0x0F, 0x77, 0x1B, 0xBF, 0x5E, 0x43,
0xE9, 0xE7, 0x25, 0xA0, 0xC8, 0xDA, 0x12, 0x56, 0x92, 0x2A, 0x2C, 0x69, 0xC7, 0xAF, 0x9B, 0x97,
0x37, 0xB8, 0x69, 0x48, 0xBE, 0xF0, 0x5F, 0x15, 0x38, 0x16, 0x9E, 0xEE, 0xF7, 0x2C, 0x5D, 0x03,
0x30, 0x49, 0xE8, 0x0A, 0x84, 0x56, 0x08, 0x99, 0xD2, 0x0C, 0xBC, 0x9D, 0xCD, 0x90, 0x16, 0xFC,
0xCF, 0xC6, 0x2D, 0x44, 0x52, 0x49, 0x2A, 0x54, 0x40, 0x42, 0xC1, 0x15, 0x14, 0xC9, 0xDE, 0x1F,
0x52, 0xE3, 0x02, 0xBE, 0xEA, 0x03, 0x03, 0x91, 0xC1, 0x7B, 0x65, 0xC2, 0xAD, 0x10, 0x7F, 0xBD,
0x73, 0x57, 0xE7, 0x5C, 0x72, 0x2B, 0x40, 0x58, 0x6B, 0x4E, 0xE5, 0x2F, 0x9D, 0x75, 0x92, 0xB5,
0xFA, 0xB8, 0xED, 0x78, 0xB2, 0x26, 0x13, 0x88, 0xD6, 0xE1, 0x47, 0x72, 0x95, 0x6F, 0x3F, 0x98,
0xF5, 0x30, 0xC7, 0xA5, 0x45, 0xB2, 0x52, 0x17, 0x0B, 0xD3, 0xD1, 0x5C, 0x82, 0x67, 0x46, 0x15,
0xDD, 0x38, 0x71, 0x7B, 0xA7, 0xDE, 0x49, 0x27, 0xAF, 0x1C, 0x65, 0x79, 0xF5, 0x4F, 0xEC, 0x26,
0xCF, 0x3A, 0xCE, 0x15, 0x54, 0x0F, 0x11, 0xD8, 0xE6, 0x80, 0x18, 0x88, 0xCA, 0xC5, 0x05, 0xFD,
0x13, 0x14, 0x7D, 0xC9, 0xC3, 0x64, 0x50, 0xBD, 0x6C, 0x2D, 0x00, 0xFF, 0xC2, 0x92, 0xF4, 0x1F,
0x4C, 0x7C, 0x99, 0xF0, 0x56, 0x7F, 0x12, 0x1E, 0xC7, 0x97, 0x5D, 0x5F, 0xBC, 0x2C, 0x6F, 0xAA,
0xF9, 0x31, 0x27, 0xE4, 0xCB, 0x4E, 0x9D, 0xC5, 0x5A, 0x03, 0x0D, 0x8C, 0x76, 0x9F, 0xA2, 0x5B,
0x52, 0xAB, 0x94, 0x09, 0x77, 0x24, 0x8D, 0x4A, 0x58, 0xF0, 0x5E, 0x3E, 0x8D, 0xEE, 0x96, 0xB5,
0xD2, 0x6E, 0x3C, 0x92, 0x8E, 0x4B, 0xD2, 0xCF, 0x8F, 0x76, 0x9F, 0xB2, 0x02, 0xFC, 0x4D, 0x0C,
0x50, 0x95, 0xC9, 0xFB, 0x62, 0xF4, 0x7E, 0x37, 0xFC, 0x0A, 0xBB, 0xFD, 0xCD, 0x77, 0x9A, 0xFE,
0xB8, 0xC3, 0xAF, 0x7F, 0x31, 0xBA, 0xFC, 0xFE, 0xCF, 0xBB, 0x6E, 0xFB, 0x57, 0x4E, 0xAD, 0x49,
0x8C, 0xC0, 0x78, 0x06, 0x51, 0xEA, 0xEE, 0x05, 0xE3, 0xC3, 0x57, 0x26, 0x82, 0xC7, 0xC3, 0xDA,
0xD5, 0x9F, 0xD8, 0xF7, 0xBE, 0x0F, 0x50, 0x92, 0x3C, 0x6F, 0xEB, 0xA4, 0x5D, 0xC3, 0xBE, 0x7A,
0x3E, 0xA9, 0x3F, 0x2F, 0x9E, 0x7F, 0x5D, 0x49, 0x45, 0xEA, 0x10, 0x6B, 0xE7, 0x9C, 0xEA, 0x6A,
0xE7, 0x61, 0x57, 0x99, 0xF1, 0xB4, 0xDD, 0x3B, 0x4F, 0xB5, 0x06, 0x56, 0xDA, 0x8C, 0x70, 0xDC,
0xA9, 0xC6, 0x23, 0xEC, 0x54, 0xE7, 0x31, 0x6B, 0xFC, 0x46, 0x09, 0x86, 0xEA, 0x3D, 0xD2, 0x22,
0x75, 0x74, 0xBF, 0xD3, 0xD3, 0x21, 0xB5, 0x1F, 0x39, 0x44, 0xE0, 0xF4, 0x7A, 0xD9, 0xC1, 0x2B,
0x8F, 0x78, 0xBA, 0x50, 0xA7, 0xE2, 0x43, 0x7F, 0x32, 0xC7, 0x6A, 0x32, 0xE4, 0x8A, 0x0B, 0x5A,
0xC5, 0xB6, 0x83, 0x03, 0x8C, 0x4F, 0x3C, 0xA9, 0x6E, 0xC3, 0x8E, 0xB6, 0xBE, 0x29, 0x02, 0x8D,
0x5D, 0x5C, 0xEC, 0xF4, 0x64, 0x99, 0xF3, 0xCE, 0xE8, 0x06, 0xEF, 0xF4, 0xF7, 0xF5, 0xCE, 0x41,
0x4F, 0xA6, 0x7A, 0x12, 0xBA, 0xB2, 0x60, 0xB8, 0x60, 0xDF, 0x51, 0xE9, 0x0B, 0xC8, 0x30, 0x25,
0x6A, 0x39, 0xBA, 0xA8, 0x49, 0x10, 0x1B, 0x55, 0x64, 0xC8, 0xA2, 0x9E, 0x1F, 0xB3, 0xA8, 0x5F,
0x70, 0x8B, 0xBA, 0x5E, 0x2F, 0xEA, 0xEA, 0xB8, 0x45, 0xBD, 0xA4, 0xC3, 0x04, 0x0D, 0x05, 0xEA,
0x47, 0x76, 0xF2, 0x4A, 0x81, 0xCE, 0x97, 0x15, 0x23, 0xE2, 0x99, 0x81, 0xFB, 0x78, 0x98, 0xD0,
0x87, 0x37, 0x06, 0xF4, 0xB3, 0x91, 0xF2, 0x17, 0x23, 0xBA, 0x27, 0x4E, 0x84, 0xB6, 0xD5, 0xA7,
0xDA, 0xB0, 0x3A, 0x10, 0x3A, 0xF3, 0x59, 0x2A, 0x50, 0xCC, 0x0F, 0xE1, 0xDC, 0x4C, 0x1A, 0x9A,
0xD3, 0x7C, 0x8C, 0x35, 0x3D, 0xA3, 0xDF, 0xD5, 0xC3, 0x9B, 0x10, 0xF5, 0x00, 0x8A, 0x53, 0x8A,
0x10, 0x7F, 0x51, 0x31, 0x9B, 0x15, 0xCE, 0x6D, 0x90, 0xDC, 0x3E, 0xDD, 0xC8, 0x89, 0xD8, 0xA3,
0xEA, 0x60, 0x24, 0x93, 0x73, 0x4A, 0x8C, 0xDE, 0x69, 0x75, 0xAD, 0x40, 0x51, 0x40, 0x63, 0xFB,
0x54, 0x91, 0x54, 0x24, 0xB0, 0x24, 0xEB, 0x89, 0x53, 0x20, 0x78, 0x34, 0xD9, 0xA9, 0x93, 0xA4,
0x07, 0x65, 0x02, 0x88, 0x3C, 0xC4, 0x22, 0x78, 0x25, 0xF8, 0x2D, 0xC4, 0x19, 0xEB, 0x1C, 0xC8,
0x73, 0x70, 0xB6, 0xB0, 0x38, 0x5B, 0x68, 0x72, 0xC0, 0xE3, 0x40, 0x45, 0x27, 0x4F, 0x84, 0x67,
0x2F, 0x18, 0x4A, 0x30, 0x2B, 0xF2, 0x98, 0xC1, 0xE4, 0x61, 0x4D, 0xF5, 0x5D, 0xB8, 0xCA, 0xB1,
0x9E, 0xD2, 0xAC, 0x0B, 0x5A, 0x30, 0xC5, 0x6D, 0x5C, 0x25, 0xD0, 0x00, 0xC6, 0x6F, 0x08, 0x66,
0xA4, 0xC7, 0x52, 0x2A, 0x57, 0x75, 0xEA, 0xFB, 0x91, 0x6E, 0x55, 0x34, 0xFA, 0xFB, 0xA0, 0x50,
0x3E, 0xB4, 0x58, 0x18, 0xF9, 0x08, 0x5C, 0x03, 0xF0, 0x96, 0x7A, 0xFF, 0x1D, 0xFE, 0x83, 0xB2,
0xBF, 0x32, 0xE1, 0xFB, 0xB4, 0x6D, 0xF9, 0x6D, 0xC7, 0xFE, 0xF4, 0xAA, 0x83, 0x4D, 0xBF, 0xA9,
0x1C, 0xFA, 0x1B, 0x2D, 0x91, 0x14, 0x2C, 0x38, 0x3B, 0x86, 0x01, 0x57, 0xD2, 0xF9, 0x1D, 0x35,
0x9D, 0x63, 0xD9, 0xCD, 0xA0, 0xF2, 0x89, 0xAB, 0xC0, 0x16, 0xE1, 0x2A, 0x68, 0xBC, 0x7D, 0xAC,
0x89, 0x1D, 0x43, 0x2E, 0x2C, 0xAA, 0xBE, 0x13, 0x57, 0x97, 0xE0, 0xEE, 0x10, 0x80, 0x42, 0xA5,
0x71, 0xB6, 0x23, 0xFD, 0x09, 0xDF, 0xAB, 0x08, 0x24, 0x56, 0xF8, 0xBD, 0x25, 0x07, 0x2A, 0xAD,
0x49, 0x11, 0x68, 0xFC, 0x08, 0x97, 0x6B, 0xAE, 0x7C, 0xE3, 0x48, 0xB3, 0xCD, 0x81, 0xE3, 0xD1,
0x6B, 0xC6, 0xE3, 0x55, 0x06, 0x86, 0x90, 0x7B, 0x8D, 0x94, 0x9B, 0xA7, 0x5D, 0x0C, 0x9D, 0xA1,
0xF6, 0x39, 0xE8, 0x74, 0xBA, 0x78, 0x7D, 0xBF, 0x3E, 0x7A, 0x3C, 0x92, 0x85, 0x33, 0x33, 0x5E,
0x89, 0x18, 0x84, 0x91, 0xB1, 0xB7, 0x70, 0x5C, 0x9C, 0xB0, 0xB1, 0x5A, 0x0A, 0xF3, 0x83, 0x45,
0x06, 0x47, 0xD0, 0xF9, 0xC5, 0x9C, 0xBE, 0xB0, 0xB7, 0x38, 0x7A, 0xC1, 0x81, 0xA2, 0x85, 0xDF,
0x02, 0x4D, 0x6D, 0xF4, 0x77, 0xA6, 0xAB, 0xDD, 0x72, 0x36, 0x86, 0x9C, 0x84, 0x54, 0x0F, 0xD3,
0x54, 0x4F, 0x7F, 0x0F, 0x28, 0x7A, 0x17, 0x17, 0x6C, 0xA1, 0x86, 0xC4, 0x9C, 0xE1, 0x4A, 0x2E,
0x56, 0x89, 0x11, 0x46, 0x76, 0x77, 0x0C, 0xCF, 0x00, 0x58, 0x5A, 0x75, 0x1D, 0x16, 0xE1, 0xFB,
0xF4, 0x4F, 0x3A, 0x75, 0xF4, 0x80, 0x87, 0x99, 0x63, 0x3E, 0xE9, 0x85, 0x93, 0xAB, 0x71, 0x0B,
0xC3, 0xB0, 0xD2, 0x96, 0x39, 0x47, 0x15, 0x35, 0x87, 0xE5, 0xF3, 0x73, 0xB7, 0xE6, 0xF3, 0x33,
0x9E, 0xD2, 0x8A, 0xA5, 0x8B, 0x30, 0xC9, 0xE2, 0xEB, 0x17, 0xFA, 0xF9, 0xFC, 0x2C, 0x74, 0xD9,
0xCE, 0xC3, 0x65, 0x74, 0xCF, 0x29, 0xF5, 0xEE, 0xD1, 0xB9, 0x66, 0x7C, 0x38, 0x1D, 0x75, 0xF0,
0x6E, 0xE7, 0xC0, 0x9D, 0x38, 0x43, 0x61, 0x2A, 0xD0, 0xF8, 0xFB, 0xC0, 0xF1, 0x22, 0x6D, 0x20,
0x5A, 0x05, 0xFC, 0x34, 0x1D, 0x12, 0xC6, 0x9E, 0xCD, 0x33, 0xF7, 0xD5, 0xE3, 0x24, 0x31, 0xA4,
0x25, 0x7A, 0x7C, 0xE9, 0xB5, 0x9E, 0x3D, 0xA1, 0xB9, 0x48, 0xED, 0x45, 0x64, 0x14, 0x78, 0xA4,
0x98, 0x63, 0x17, 0x8B, 0xF3, 0x1A, 0x0F, 0xA3, 0x47, 0x0E, 0xA8, 0x3B, 0x3B, 0x5D, 0x59, 0xAC,
0x9F, 0x20, 0x4F, 0x7B, 0x08, 0x4F, 0xFE, 0xCB, 0x4B, 0x7C, 0x4B, 0xDF, 0x3B, 0x0D, 0xA3, 0x4A,
0x2A, 0xBE, 0x4A, 0x95, 0xF4, 0x54, 0x35, 0x91, 0x72, 0x67, 0x6A, 0x52, 0x4E, 0xD8, 0xE7, 0xE0,
0x67, 0xBC, 0x34, 0x27, 0xA7, 0x08, 0x02, 0x82, 0x7E, 0x73, 0xA2, 0x93, 0x42, 0xD9, 0x73, 0x52,
0xBD, 0x72, 0x8E, 0x15, 0x1A, 0x51, 0x46, 0xF2, 0x34, 0x0C, 0x2A, 0xFD, 0x68, 0x28, 0x81, 0x76,
0xD2, 0xAF, 0xC1, 0x6D, 0x84, 0xFE, 0xF6, 0xD1, 0x32, 0xCD, 0x06, 0xB9, 0x3F, 0x68, 0x88, 0x76,
0x85, 0xCE, 0x64, 0xB3, 0x9A, 0x7E, 0x25, 0x25, 0x79, 0x21, 0xB2, 0x45, 0x10, 0x77, 0x50, 0xAF,
0x68, 0xF9, 0x05, 0xAC, 0x43, 0x5F, 0xC8, 0x78, 0xD0, 0x4C, 0x92, 0xAF, 0x86, 0x9D, 0x19, 0xB5,
0x16, 0xD2, 0x02, 0x78, 0x93, 0xE3, 0x1E, 0xC3, 0x49, 0x75, 0x89, 0x73, 0x1D, 0x10, 0x48, 0x02,
0x4E, 0x24, 0xD8, 0xBB, 0xA0, 0x4E, 0x3C, 0x95, 0xF2, 0x30, 0x5E, 0x97, 0x7E, 0x63, 0x65, 0x92,
0xE7, 0x6B, 0x38, 0x9A, 0xA6, 0x82, 0x35, 0xCA, 0xA0, 0x86, 0x5D, 0x51, 0x64, 0x74, 0x18, 0x2B,
0xC2, 0x1A, 0xFC, 0x8B, 0xAC, 0xE8, 0xA0, 0xF6, 0xDB, 0x1D, 0x19, 0x53, 0x5A, 0x25, 0x48, 0xF8,
0x73, 0xE7, 0x59, 0xC4, 0xF8, 0xA0, 0x95, 0x7E, 0x5B, 0x75, 0x6E, 0xF0, 0xF6, 0xD4, 0x19, 0x9C,
0x2E, 0x33, 0xF4, 0xD2, 0xE8, 0x8D, 0xDA, 0xFF, 0x77, 0x9C, 0x93, 0x78, 0xCE, 0xEF, 0xB8, 0x52,
0x47, 0xA0, 0x14, 0xCE, 0xCF, 0xF9, 0x7C, 0x5E, 0xBE, 0xB4, 0xB5, 0x74, 0xEE, 0x01, 0xF5, 0xFA,
0x7B, 0x71, 0x61, 0x28, 0x3F, 0x6A, 0xD5, 0xC3, 0xE8, 0xBB, 0xB0, 0x80, 0x88, 0x2C, 0x53, 0xF4,
0xF4, 0x4B, 0x8D, 0x0B, 0x38, 0xAD, 0x46, 0xCB, 0xB8, 0xC8, 0x33, 0x58, 0x46, 0xE2, 0x02, 0xD8,
0x37, 0xCD, 0xE0, 0x6B, 0x03, 0x17, 0xCA, 0xB8, 0x88, 0x04, 0xAD, 0x22, 0x04, 0x2C, 0xAC, 0x73,
0x98, 0x4D, 0x8A, 0x59, 0x03, 0xE2, 0x18, 0x17, 0x41, 0x47, 0xF7, 0xCB, 0xC2, 0xEB, 0x04, 0x01,
0x83, 0x83, 0x1B, 0xD6, 0xA2, 0x3C, 0xC6, 0x66, 0xA9, 0xB8, 0x5C, 0x98, 0x85, 0x1D, 0xD5, 0x55,
0x28, 0xF7, 0xF6, 0x53, 0x8E, 0x7A, 0x4A, 0xC6, 0x90, 0x46, 0xBC, 0x9E, 0x6F, 0x0F, 0x86, 0x45,
0xB9, 0x28, 0x89, 0x38, 0x64, 0xC6, 0x53, 0xF5, 0x65, 0x10, 0x2E, 0x27, 0x7A, 0x13, 0x6C, 0x45,
0x93, 0xCE, 0x84, 0xC3, 0x88, 0xAB, 0x8E, 0xF3, 0x1D, 0xD4, 0x49, 0x01, 0xDB, 0x44, 0x95, 0x06,
0x0D, 0xA6, 0x64, 0x00, 0x14, 0x75, 0x32, 0x0F, 0x5F, 0x97, 0x41, 0x16, 0xB2, 0x20, 0x13, 0x5F,
0x85, 0x34, 0x16, 0x40, 0x4D, 0xA0, 0xAA, 0x9A, 0x54, 0xD5, 0x21, 0x32, 0x44, 0x73, 0x81, 0xCC,
0x52, 0x85, 0x3F, 0xAB, 0xCC, 0xC6, 0x30, 0x0A, 0xE7, 0x00, 0x07, 0xE9, 0xE3, 0x40, 0x90, 0xE4,
0x32, 0x77, 0xAE, 0x91, 0x2A, 0xC7, 0xF8, 0xCA, 0xEB, 0xE6, 0x44, 0x92, 0xB3, 0xE1, 0xDC, 0x55,
0x68, 0x93, 0x2B, 0x9A, 0x8F, 0xC0, 0x34, 0x08, 0x7B, 0x26, 0x6F, 0xF7, 0x3A, 0x4A, 0xB7, 0x5A,
0xC8, 0xE8, 0xA8, 0xD6, 0xCB, 0x5B, 0x1C, 0x4B, 0xA0, 0x24, 0x2B, 0x54, 0x10, 0x4C, 0xC1, 0x14,
0x43, 0x68, 0x07, 0x24, 0xBE, 0x4B, 0x8C, 0x4B, 0xBF, 0xB4, 0x31, 0x64, 0x4D, 0xB1, 0xC8, 0x52,
0xA3, 0x43, 0xD0, 0xAA, 0x1D, 0xE7, 0x01, 0x6F, 0x28, 0xEE, 0xBB, 0x88, 0x13, 0xF5, 0x4E, 0xF5,
0xD9, 0xB4, 0x84, 0x62, 0x7E, 0x79, 0x63, 0x1F, 0x8A, 0x46, 0xA1, 0x87, 0x59, 0xD0, 0x86, 0xAB,
0x44, 0x58, 0x92, 0x70, 0x25, 0x43, 0xB2, 0xC2, 0x3F, 0xB9, 0x75, 0x05, 0x51, 0x16, 0xD4, 0x47,
0x18, 0xB7, 0x95, 0x50, 0x1B, 0xF0, 0x9A, 0xDD, 0x0E, 0x8E, 0x43, 0x4E, 0x35, 0xB4, 0x95, 0xF5,
0xA8, 0x98, 0xAC, 0x5A, 0x57, 0x20, 0x6C, 0x65, 0x9E, 0x17, 0x8A, 0xAA, 0x88, 0x63, 0x65, 0x84,
0x68, 0x4F, 0xC3, 0x24, 0x97, 0xCE, 0x89, 0x83, 0x1E, 0x6C, 0x1C, 0x08, 0x22, 0x6F, 0xD2, 0xF6,
0xDC, 0xA8, 0x34, 0x3C, 0x13, 0x0C, 0xF9, 0x0C, 0x01, 0xDC, 0x5A, 0xA7, 0xC1, 0x75, 0x5A, 0xAA,
0x5C, 0x58, 0xEB, 0xBF, 0xBE, 0x55, 0x2E, 0xB9, 0x88, 0x73, 0xFA, 0x51, 0xC3, 0xDE, 0xC7, 0x55,
0x3D, 0xD0, 0x62, 0x97, 0x6B, 0x34, 0x4D, 0xE7, 0x42, 0x31, 0x01, 0xFF, 0xF4, 0x4E, 0xDE, 0xC1,
0x55, 0xBC, 0x3C, 0xE7, 0xD1, 0x08, 0x10, 0x30, 0xD8, 0xCC, 0x6F, 0x73, 0x8E, 0x2E, 0xFC, 0x56,
0xB5, 0x51, 0xBD, 0x4A, 0xF1, 0x8A, 0xBF, 0x95, 0x65, 0x42, 0x43, 0x04, 0xA6, 0xD8, 0x45, 0x01,
0x33, 0x0E, 0x34, 0x71, 0x1D, 0x50, 0x89, 0x3C, 0x37, 0x29, 0x68, 0x4F, 0x4D, 0x2A, 0xEA, 0xD9,
0x12, 0x0A, 0x31, 0xE0, 0x1C, 0x52, 0x98, 0x62, 0x3E, 0x50, 0x68, 0xB5, 0x2B, 0x40, 0x1A, 0x86,
0x5C, 0x56, 0xD4, 0xD7, 0x1A, 0x78, 0xB6, 0xA5, 0xD9, 0x25, 0xBF, 0x05, 0xBC, 0x26, 0x99, 0x80,
0xA8, 0xC0, 0x80, 0x70, 0x86, 0x02, 0xB0, 0xBE, 0xC0, 0x04, 0x70, 0xD7, 0x25, 0x30, 0x0B, 0x50,
0x55, 0x87, 0xEF, 0x37, 0x39, 0x74, 0xD5, 0x5D, 0x9F, 0x50, 0x59, 0x9D, 0x05, 0x2B, 0xB8, 0xC1,
0xD5, 0xE1, 0x80, 0xF8, 0x99, 0xCC, 0xCC, 0xF6, 0xC9, 0x80, 0x32, 0xBE, 0xB6, 0x00, 0xA1, 0x5C,
0x45, 0xF6, 0xBA, 0x48, 0xAF, 0xE7, 0x4D, 0xBA, 0xFA, 0xCD, 0x31, 0x0E, 0x20, 0xDB, 0x8C, 0x03,
0x20, 0x40, 0x00, 0x7E, 0xE3, 0xDA, 0xCC, 0x9F, 0x19, 0x28, 0xBC, 0x0A, 0x54, 0x88, 0xD0, 0xF1,
0xEC, 0x05, 0x62, 0x37, 0x3A, 0xE6, 0x91, 0x06, 0xD1, 0x81, 0xA3, 0x1C, 0xFD, 0x39, 0xD4, 0x93,
0x02, 0x4A, 0x91, 0x5E, 0x7D, 0x44, 0x9F, 0xBA, 0x68, 0x49, 0x36, 0x43, 0xD2, 0xDA, 0xAB, 0x99,
0x52, 0x28, 0x8D, 0x52, 0xE0, 0x7B, 0xAF, 0x5F, 0xB4, 0xE7, 0xAD, 0x8B, 0xF9, 0xB5, 0x70, 0x75,
0xF8, 0x97, 0x0A, 0xB9, 0xE7, 0x05, 0x4C, 0x2F, 0x09, 0x06, 0x88, 0x56, 0xC3, 0x19, 0xB2, 0x95,
0xF1, 0x00, 0x04, 0x4E, 0x07, 0xD7, 0x02, 0xE6, 0xD4, 0x31, 0xA4, 0xD7, 0x71, 0x94, 0xBE, 0xDA,
0x56, 0x23, 0x79, 0x4D, 0xA0, 0x76, 0xAA, 0xD1, 0x6D, 0x00, 0xCB, 0xD1, 0x6F, 0x9D, 0xA8, 0xE4,
0x44, 0xF5, 0xA7, 0xCA, 0x95, 0xCC, 0x16, 0x3E, 0x45, 0x74, 0xEB, 0x0C, 0x04, 0x48, 0xBD, 0x84,
0xAE, 0x0C, 0xA3, 0xB6, 0xEE, 0xF4, 0xE2, 0x07, 0x7F, 0xCA, 0xC6, 0x6C, 0x53, 0x00, 0xDD, 0x82,
0x49, 0x39, 0xFA, 0x31, 0x5D, 0x2C, 0x7F, 0xCE, 0x20, 0xC2, 0x9E, 0xE0, 0x7A, 0xB2, 0x13, 0xB7,
0x3A, 0x7A, 0x3F, 0x82, 0x80, 0x08, 0x3A, 0x42, 0x30, 0x63, 0x4A, 0x1C, 0x1A, 0x2F, 0xD3, 0x0A,
0x41, 0x8A, 0xB3, 0x5E, 0x44, 0x00, 0x45, 0xB6, 0x8D, 0xC6, 0xB9, 0x8A, 0x18, 0xA5, 0x3E, 0x02,
0xCA, 0xBE, 0x38, 0xEB, 0x62, 0x3E, 0x79, 0xBD, 0x1C, 0x7B, 0xE2, 0xF4, 0xF9, 0x75, 0xCC, 0xD9,
0x49, 0x8F, 0x58, 0xB9, 0xB2, 0x8A, 0xCD, 0xB8, 0x8A, 0xA5, 0x95, 0x5C, 0xCB, 0x1B, 0xC7, 0xFE,
0xC8, 0xF1, 0xD2, 0xC6, 0xB1, 0x07, 0x06, 0x70, 0xC7, 0x0E, 0x6E, 0xFD, 0x5E, 0x97, 0x00, 0x33,
0xB4, 0x11, 0x70, 0x45, 0x1D, 0x02, 0x7B, 0x08, 0x78, 0x5F, 0xDC, 0x17, 0x28, 0x52, 0xE5, 0xFF,
0x63, 0xCA, 0x6F, 0xC4, 0xAB, 0x7B, 0x6F, 0xED, 0xDA, 0x5F, 0xFD, 0x03, 0xE3, 0xFC, 0x1D, 0x7C,
0x3E, 0xD4, 0x07, 0x8B, 0x5F, 0xC3, 0x5F, 0xDD, 0x1F, 0xA8, 0x0C, 0x4B, 0x2B, 0x8D, 0xCB, 0x21,
0xA0, 0x95, 0x84, 0xB9, 0xF8, 0x5D, 0xC0, 0x4D, 0xB0, 0xA7, 0x74, 0x5A, 0x1D, 0x9D, 0x6F, 0x6C,
0xC4, 0x38, 0xB9, 0x80, 0x27, 0x77, 0x82, 0xAC, 0xC5, 0x6D, 0x3A, 0x3A, 0xB7, 0xE4, 0x40, 0x7A,
0x7D, 0x54, 0xA8, 0xAA, 0x3F, 0xCB, 0x08, 0x9B, 0x98, 0xDA, 0x1A, 0xF8, 0xAB, 0x0B, 0x43, 0x9D,
0x0C, 0xE0, 0x79, 0x3D, 0x9D, 0xBE, 0x99, 0x06, 0x5A, 0xAA, 0x0A, 0xD0, 0xA3, 0x9E, 0x91, 0xCB,
0x08, 0x2C, 0xF8, 0x4B, 0xE5, 0x52, 0x3A, 0x9F, 0x02, 0xAF, 0xD1, 0x87, 0x9E, 0xCE, 0xF1, 0x88,
0xC8, 0x0B, 0x6E, 0x0B, 0xFA, 0xB8, 0xC8, 0x36, 0x81, 0xE3, 0x86, 0x2A, 0x20, 0xD8, 0x03, 0xAE,
0x86, 0x43, 0x3D, 0x1C, 0x64, 0x89, 0xF0, 0x45, 0xF4, 0x2D, 0x10, 0xB8, 0x7A, 0x75, 0x8B, 0xE1,
0x6F, 0xD0, 0x16, 0xAF, 0xD4, 0x51, 0x88, 0xFA, 0x80, 0xF2, 0x22, 0x15, 0x82, 0x37, 0xA9, 0x36,
0x83, 0xAA, 0x41, 0xC3, 0x49, 0x0C, 0x31, 0x90, 0x0B, 0xF2, 0x02, 0x4E, 0xAB, 0x18, 0x80, 0xA4,
0xDA, 0xAF, 0xD2, 0x71, 0x02, 0x8C, 0x3C, 0x22, 0x1F, 0xEE, 0xDC, 0xEB, 0xA0, 0xB7, 0x31, 0xEA,
0x2E, 0xE4, 0x22, 0xB4, 0x21, 0xF3, 0x33, 0x9A, 0x50, 0x25, 0x49, 0x0A, 0x74, 0xD1, 0xDB, 0x8C,
0x01, 0x68, 0xF9, 0xFE, 0x5C, 0x35, 0x7B, 0x1C, 0x40, 0x5F, 0x39, 0xCB, 0x5C, 0xBD, 0xA1, 0x39,
0xF0, 0xBE, 0xA3, 0xF1, 0xE6, 0x21, 0x2C, 0x47, 0xF8, 0xC9, 0xCB, 0xD8, 0x81, 0xE1, 0xFC, 0x47,
0xA8, 0xF4, 0x18, 0x99, 0x0B, 0x72, 0x27, 0xB8, 0x8C, 0xF1, 0xC4, 0x01, 0x99, 0xE4, 0x01, 0x9E,
0x2B, 0x34, 0xD2, 0x07, 0xCA, 0xA4, 0x33, 0x32, 0xAA, 0xEA, 0x5C, 0x54, 0xA0, 0x81, 0x90, 0x23,
0x62, 0x38, 0x0C, 0x96, 0x9C, 0xB2, 0xBC, 0x1D, 0x19, 0x47, 0x4A, 0xC3, 0xDE, 0xAB, 0x50, 0x4A,
0x70, 0xD1, 0xA1, 0xEF, 0x44, 0x5B, 0x3B, 0xEA, 0x51, 0xB4, 0x64, 0x6B, 0x5F, 0x0B, 0xE8, 0xD8,
0x76, 0x50, 0x46, 0x57, 0x0E, 0xCB, 0x24, 0x1F, 0x11, 0xAF, 0x75, 0x34, 0x8B, 0x5A, 0xDC, 0xCB,
0x28, 0x1A, 0x43, 0xAA, 0x8C, 0x01, 0xD4, 0x60, 0x32, 0x95, 0x1D, 0x9C, 0x5E, 0x31, 0xA1, 0x94,
0x07, 0xEF, 0x45, 0x46, 0xB9, 0x30, 0x7A, 0xB3, 0x72, 0xA1, 0x76, 0xA5, 0x71, 0x81, 0x2F, 0x52,
0x45, 0x04, 0xD6, 0x10, 0x71, 0x0E, 0x14, 0x16, 0xD9, 0x27, 0xD7, 0x29, 0xED, 0x95, 0x89, 0xAF,
0x50, 0x49, 0xBA, 0xCF, 0xF5, 0x5E, 0x92, 0xF1, 0xA5, 0x85, 0x4F, 0xDD, 0x0C, 0xA8, 0x78, 0x36,
0x5F, 0x2E, 0x16, 0xA3, 0x77, 0x3B, 0x35, 0x04, 0xB3, 0x15, 0x9E, 0x7F, 0x49, 0x13, 0x4E, 0x3C,
0x0E, 0xE5, 0xC3, 0x46, 0xCE, 0x89, 0xCF, 0x73, 0xE4, 0x37, 0xFF, 0xFC, 0xB5, 0x6B, 0x61, 0xE2,
0x72, 0x12, 0xA8, 0x12, 0x70, 0xB4, 0x25, 0xD9, 0x6C, 0xBC, 0x07, 0x8A, 0x54, 0xE5, 0xFE, 0x29,
0xC5, 0xB8, 0x18, 0x38, 0xAA, 0x59, 0xF5, 0xBE, 0x94, 0xD6, 0xBD, 0xC9, 0xC7, 0x20, 0x68, 0xE9,
0x82, 0x90, 0x1B, 0xE7, 0x9E, 0x1F, 0xB4, 0x4A, 0x95, 0x98, 0xC6, 0x40, 0x8B, 0xF0, 0x67, 0x71,
0x45, 0xBA, 0x3E, 0x95, 0xC4, 0x9E, 0x00, 0xF6, 0x4A, 0x6B, 0x19, 0x10, 0xE8, 0x88, 0x59, 0x4F,
0x8F, 0x1E, 0xA3, 0xEA, 0x97, 0x9C, 0xE8, 0x15, 0x2A, 0x28, 0x99, 0x60, 0xA7, 0x76, 0x4F, 0x0B,
0xF5, 0x24, 0x44, 0x3C, 0xFA, 0xEB, 0x2A, 0x91, 0x41, 0xA5, 0xF8, 0x0F, 0x1A, 0x49, 0x29, 0xED,
0x85, 0x84, 0x8F, 0x5E, 0x48, 0x43, 0x83, 0xDB, 0xD0, 0xE1, 0xD1, 0xD9, 0x2F, 0xD8, 0x5F, 0x32,
0xDE, 0x9E, 0xAE, 0x21, 0x95, 0xF3, 0xDB, 0x82, 0xAF, 0x22, 0x4D, 0x21, 0xD9, 0xE8, 0x08, 0xA9,
0xEE, 0x70, 0xE5, 0x01, 0x9F, 0x9B, 0x4D, 0xD1, 0xD3, 0x8D, 0x67, 0x7B, 0x30, 0xBA, 0xCD, 0x29,
0x18, 0x26, 0x34, 0xF9, 0x1F, 0x6D, 0xB5, 0xF6, 0x0F, 0x5B, 0xAB, 0xDE, 0x9A, 0x11, 0x23, 0x8D,
0x19, 0x48, 0x56, 0xA0, 0xF6, 0x7E, 0xE7, 0x3B, 0xC7, 0x49, 0x81, 0xC7, 0xE1, 0x29, 0x9B, 0xC1,
0x99, 0xA4, 0x26, 0x9A, 0xA2, 0x72, 0x2A, 0x9D, 0x34, 0x54, 0xB9, 0x0B, 0x84, 0x48, 0x30, 0x6E,
0x4E, 0x68, 0x02, 0xA2, 0x6A, 0xC8, 0x9D, 0x0E, 0x0C, 0x86, 0xC4, 0xB0, 0xF5, 0x46, 0x43, 0xBB,
0x7A, 0x57, 0x1A, 0x3C, 0xCD, 0xE7, 0xD0, 0x12, 0x44, 0x77, 0xB8, 0x16, 0xA0, 0xC9, 0x52, 0x07,
0xF2, 0x84, 0x32, 0x15, 0x07, 0xF1, 0x2D, 0x3C, 0x9B, 0x9A, 0xD1, 0x2B, 0xFC, 0x92, 0x57, 0x43,
0xBB, 0x35, 0x93, 0x56, 0xA9, 0x8A, 0xCB, 0x23, 0xC8, 0x10, 0x56, 0x88, 0xFA, 0x54, 0x6C, 0x38,
0x7B, 0x60, 0xA0, 0xD6, 0xE3, 0xB4, 0x56, 0xC2, 0xAC, 0x47, 0x69, 0xE2, 0xDF, 0x5C, 0x58, 0x86,
0xFC, 0xFD, 0xBD, 0x1D, 0x81, 0xB3, 0x9C, 0x1E, 0x52, 0xAE, 0x36, 0x9F, 0xA5, 0xF8, 0xEB, 0x34,
0xA1, 0xD8, 0x57, 0xDD, 0x75, 0xEA, 0x7C, 0x8C, 0xBF, 0xD9, 0xE5, 0xD2, 0xFC, 0xD5, 0x17, 0xB3,
0xA4, 0x56, 0xE6, 0x67, 0x19, 0x2B, 0x97, 0xA3, 0xC1, 0x4F, 0x4F, 0xB2, 0x09, 0x96, 0x60, 0xEC,
0x02, 0xB0, 0x35, 0x3A, 0x4A, 0x31, 0xBB, 0x32, 0x84, 0x68, 0xBD, 0x4A, 0x0A, 0xEE, 0xD4, 0xBB,
0xAA, 0xB9, 0x38, 0xA7, 0x77, 0x11, 0x69, 0x45, 0xB5, 0x46, 0x9A, 0x3C, 0x37, 0x28, 0x20, 0xD3,
0x65, 0x6D, 0x25, 0x5F, 0x67, 0x84, 0xF4, 0xCD, 0x86, 0xA8, 0xCD, 0x6B, 0xE5, 0x88, 0xCD, 0xC8,
0x46, 0x08, 0xDB, 0xD7, 0xAE, 0x1B, 0xEF, 0x32, 0x1A, 0x1C, 0x4E, 0xBC, 0x40, 0xA5, 0x95, 0x30,
0x87, 0xEA, 0x43, 0x58, 0x79, 0x42, 0x7D, 0x3A, 0x63, 0x67, 0xAB, 0xBC, 0xB2, 0x54, 0x51, 0x42,
0x53, 0xC8, 0xC5, 0x07, 0x75, 0x63, 0x70, 0x1B, 0x17, 0x0F, 0x44, 0x87, 0x70, 0x0B, 0x85, 0xFE,
0x5A, 0xC9, 0x94, 0x8A, 0x11, 0x39, 0xA8, 0x47, 0xF2, 0x06, 0xD4, 0x74, 0xCB, 0xF4, 0xF5, 0x2E,
0xA6, 0x14, 0x55, 0x63, 0xA8, 0x60, 0xD0, 0x87, 0xB5, 0x36, 0x18, 0x36, 0xC2, 0x45, 0x9E, 0x9D,
0xC4, 0x95, 0x66, 0x32, 0xE5, 0xD0, 0x40, 0xE6, 0x35, 0xA7, 0x35, 0x38, 0x66, 0xF6, 0xFA, 0xCB,
0xDF, 0x3A, 0x34, 0x6D, 0xC9, 0x38, 0x6B, 0xF1, 0xD8, 0x8D, 0xBF, 0x1B, 0x2B, 0xC6, 0x59, 0xFC,
0xA3, 0x83, 0xDD, 0x84, 0x53, 0x13, 0x5D, 0xD9, 0x34, 0x7F, 0x4D, 0x21, 0x2C, 0x65, 0x59, 0xC5,
0x1F, 0x81, 0x29, 0xC9, 0x7E, 0xC5, 0x7C, 0x55, 0xB0, 0xA8, 0x7A, 0xAB, 0x63, 0xBD, 0xEB, 0x23,
0x06, 0xD5, 0xCA, 0x8C, 0x62, 0xDC, 0x38, 0x10, 0x68, 0xC6, 0x4F, 0x1C, 0x70, 0x25, 0x6F, 0x39,
0x88, 0xCA, 0x5D, 0x83, 0xBC, 0xCE, 0x2D, 0x5A, 0xA7, 0xA1, 0xC0, 0x90, 0xC9, 0x25, 0xA7, 0x32,
0x77, 0x49, 0xEE, 0x2E, 0xA1, 0x8B, 0x2F, 0x82, 0x0F, 0x28, 0xE0, 0xBC, 0xD9, 0xE8, 0x34, 0x0C,
0x91, 0x4A, 0xF0, 0x14, 0x13, 0x68, 0x52, 0xAD, 0xA8, 0x1D, 0x06, 0x2B, 0x5B, 0x16, 0x5C, 0x14,
0xB5, 0xE0, 0x0A, 0xDF, 0x2E, 0x3D, 0x5B, 0x78, 0x76, 0xCF, 0xDA, 0x3D, 0xA1, 0x07, 0x9E, 0x06,
0x43, 0x17, 0x98, 0xC0, 0xF3, 0xBA, 0x1E, 0xE4, 0x7D, 0xDE, 0x81, 0xF4, 0x14, 0xE5, 0xD2, 0x0D,
0x2D, 0x95, 0x69, 0xB3, 0xAB, 0x25, 0xF1, 0xC1, 0x6B, 0x86, 0xA1, 0x94, 0xA7, 0x9F, 0xAC, 0xD5,
0x1E, 0x9B, 0xEB, 0x54, 0x78, 0xAE, 0xE9, 0xA1, 0xFB, 0xE9, 0xFA, 0xF8, 0x43, 0x47, 0x3C, 0x0E,
0x0C, 0xEB, 0x1F, 0xC8, 0xED, 0x67, 0xE8, 0x1D, 0x15, 0xD3, 0xA0, 0x08, 0x99, 0xAF, 0x8A, 0x76,
0xFF, 0xB3, 0xF9, 0xD5, 0xA7, 0x06, 0xD5, 0x4B, 0xD1, 0x39, 0x45, 0x1D, 0xA4, 0x37, 0x47, 0xC8,
0x01, 0x3E, 0xCD, 0x1D, 0x78, 0x17, 0x80, 0x08, 0x1C, 0xCC, 0x40, 0xAA, 0x8B, 0x9F, 0x0C, 0x3E,
0xD5, 0xE8, 0xE8, 0xE8, 0x9A, 0xC6, 0x75, 0xF7, 0x6A, 0xF8, 0x4B, 0xDE, 0xEC, 0xB0, 0xAA, 0x05,
0xD3, 0xD7, 0x58, 0xA2, 0xD6, 0x94, 0xD2, 0xA1, 0xAB, 0xA5, 0xF0, 0x61, 0xB6, 0x56, 0x99, 0xB0,
0xF5, 0x81, 0x21, 0x30, 0x06, 0x07, 0x23, 0xAB, 0xC6, 0xF0, 0x86, 0xD0, 0x2A, 0x7B, 0x66, 0xBE,
0x3A, 0x33, 0x7F, 0x4B, 0x5C, 0x6A, 0x7E, 0xD3, 0x33, 0x47, 0xFF, 0x5C, 0x14, 0xFE, 0x31, 0xAA,
0xE9, 0xB1, 0xC2, 0xA9, 0xA6, 0x27, 0x5D, 0x35, 0xA8, 0x81, 0x19, 0x9D, 0x8B, 0x35, 0x2A, 0x7F,
0x20, 0x52, 0xF6, 0x01, 0x46, 0xC0, 0x59, 0x24, 0x32, 0x69, 0xED, 0x5C, 0x77, 0x98, 0x7D, 0x4A,
0x5E, 0x81, 0x66, 0xC3, 0x83, 0x1C, 0x7C, 0x53, 0x29, 0x4F, 0x44, 0xCA, 0x09, 0xC6, 0xDB, 0x42,
0x29, 0xDC, 0x53, 0x58, 0x2E, 0xF1, 0xDC, 0x12, 0xE2, 0x2A, 0x19, 0xB7, 0xA8, 0x82, 0x84, 0x29,
0xB8, 0xA0, 0xF3, 0x21, 0x5A, 0x0B, 0xDB, 0x9D, 0x45, 0x4B, 0xD8, 0x64, 0xDE, 0x87, 0x90, 0x41,
0xA7, 0x1F, 0x45, 0x25, 0x88, 0x31, 0x4B, 0x28, 0xDA, 0x77, 0x4E, 0x8D, 0x26, 0x7D, 0x0F, 0x7B,
0x67, 0x2B, 0x49, 0x8B, 0x8D, 0xFE, 0x7A, 0x22, 0x9F, 0x9F, 0x59, 0x8F, 0x53, 0xFC, 0xF4, 0x55,
0xA4, 0x6A, 0x09, 0xB2, 0xFF, 0x30, 0x33, 0xC7, 0xFF, 0x79, 0xAA, 0xC0, 0xDE, 0xA1, 0x63, 0xA4,
0x49, 0x5E, 0x24, 0xDF, 0x13, 0xBD, 0x43, 0xF7, 0x62, 0x68, 0xD7, 0xA9, 0xB5, 0xA1, 0x46, 0xDD,
0xE4, 0xCA, 0x0E, 0x81, 0x77, 0x90, 0x81, 0x0A, 0xC1, 0xA1, 0x58, 0xB5, 0x1D, 0xE5, 0x4B, 0x46,
0x6F, 0xA7, 0x2D, 0xE9, 0x6B, 0x0C, 0xB5, 0x5B, 0xB8, 0x8A, 0xE8, 0x5B, 0xD0, 0xCD, 0xDE, 0xEE,
0xC2, 0x25, 0x54, 0x63, 0x50, 0xF7, 0x04, 0x1F, 0x37, 0xE1, 0x4F, 0x65, 0xD4, 0x2F, 0x09, 0x55,
0xE9, 0xC8, 0x66, 0x24, 0x4A, 0x08, 0xD4, 0xE3, 0x32, 0xDB, 0x20, 0x99, 0x44, 0xD3, 0x40, 0x85,
0x85, 0x7A, 0x7A, 0x09, 0x74, 0xC6, 0x82, 0xA1, 0x1D, 0x6F, 0x31, 0xC6, 0x31, 0x56, 0x13, 0x7D,
0xC8, 0xD7, 0xC2, 0x56, 0xB9, 0x8E, 0x5D, 0x39, 0xBE, 0xC8, 0x6B, 0xF5, 0x36, 0x92, 0x0F, 0xBF,
0x5F, 0x07, 0xFB, 0x51, 0x38, 0xF6, 0x09, 0x5C, 0xA1, 0xDD, 0xFB, 0x21, 0x7D, 0xF2, 0x8A, 0x51,
0xB9, 0xE9, 0x71, 0x85, 0xB9, 0x3B, 0x4F, 0x52, 0x04, 0x99, 0xDE, 0x02, 0x34, 0xDB, 0x4E, 0x88,
0x72, 0x0B, 0xA2, 0x42, 0x6D, 0x5F, 0x66, 0x1C, 0x1B, 0x39, 0xF9, 0x7D, 0x4C, 0x6E, 0xC3, 0x83,
0x6B, 0xEB, 0xA8, 0x19, 0xC4, 0x3D, 0xE1, 0xF0, 0x97, 0x88, 0xD1, 0xAC, 0xE4, 0x59, 0x52, 0x73,
0xAE, 0x52, 0xC9, 0xF9, 0x93, 0x3E, 0x0E, 0xFC, 0xA9, 0xA6, 0x16, 0xB0, 0x45, 0x5D, 0xB8, 0x14,
0x4E, 0x30, 0x14, 0x01, 0x50, 0x30, 0x0E, 0x81, 0xA3, 0x33, 0xCE, 0xE2, 0x34, 0x03, 0x50, 0x45,
0x97, 0xB1, 0x74, 0xB3, 0xEF, 0xFC, 0x0B, 0x61, 0x02, 0x1E, 0x4A, 0xC1, 0x20, 0xC6, 0xBB, 0xF0,
0x59, 0x21, 0xC0, 0x25, 0xCD, 0x18, 0xD6, 0x97, 0x80, 0xA6, 0x6E, 0x87, 0x74, 0xF7, 0xFD, 0x5B,
0x45, 0x35, 0x6A, 0xFF, 0xDF, 0x20, 0x4C, 0x1E, 0x8C, 0x5A, 0x70, 0x94, 0xFF, 0xA6, 0xCC, 0x1C,
0xF8, 0xF3, 0x3F, 0x1E, 0x03, 0x0B, 0x13, 0xFB, 0xC4, 0x96, 0xB5, 0x91, 0x2D, 0xBE, 0x93, 0x9E,
0x37, 0x8A, 0xA6, 0xE2, 0x2B, 0x37, 0x9B, 0x1F, 0x46, 0xD9, 0x0F, 0xD1, 0x82, 0x66, 0x3B, 0xFA,
0xC6, 0x8B, 0x99, 0xE6, 0xD8, 0x38, 0x0F, 0x6C, 0x17, 0xFE, 0x93, 0x1D, 0x5A, 0x53, 0xFE, 0x3C,
0x73, 0x1E, 0x27, 0x0F, 0x6F, 0xD0, 0x83, 0x09, 0xEE, 0xA3, 0xB5, 0x62, 0xFF, 0x2B, 0xDE, 0xC4,
0x22, 0xFC, 0xAE, 0xF9, 0x33, 0x73, 0xE7, 0xBF, 0xD9, 0x30, 0xF1, 0xDE, 0x09, 0xD9, 0xAC, 0x00,
0xFD, 0xFC, 0x4F, 0x4F, 0xA3, 0x17, 0xE1, 0x4B, 0xD2, 0x98, 0x3F, 0x33, 0x78, 0xE8, 0xAF, 0xCA,
0x63, 0xDC, 0x4B, 0x1F, 0x3A, 0x84, 0x39, 0xEF, 0xE5, 0x6F, 0xC4, 0xE5, 0xA7, 0x04, 0xA6, 0xDC,
0x10, 0xD9, 0x55, 0xE2, 0xD8, 0xBB, 0xC0, 0xB6, 0xBF, 0xEB, 0x6B, 0x0F, 0xC2, 0xEC, 0xDB, 0x7F,
0x66, 0xB4, 0x07, 0x91, 0xF9, 0x57, 0xE6, 0x53, 0xF8, 0x3B, 0x33, 0x85, 0x74, 0xEA, 0x9B, 0xD5,
0x7E, 0xE4, 0x92, 0x61, 0xC8, 0xA4, 0xEA, 0x9B, 0xA3, 0xEC, 0xDB, 0xEB, 0x1E, 0xFF, 0xBB, 0x4F,
0x78, 0x5C, 0x60, 0xB3, 0xFB, 0x1A, 0xF5, 0x7F, 0xBF, 0x7E, 0xC2, 0x04, 0x9C, 0x42, 0xBE, 0xA6,
0x67, 0x4D, 0x73, 0xE9, 0x39, 0x26, 0xE2, 0x11, 0xC0, 0xE2, 0x78, 0x83, 0x4B, 0x80, 0x65, 0x1E,
0xD7, 0x55, 0xF1, 0x77, 0x93, 0x81, 0xA1, 0x9C, 0xA0, 0x9D, 0x9C, 0x9E, 0x8A, 0xAF, 0xF5, 0x08,
0x92, 0xCA, 0x5F, 0x7F, 0x05, 0x07, 0x3A, 0x5B, 0x98, 0xEC, 0xBE, 0x27, 0xEE, 0x21, 0x13, 0xEE,
0x4E, 0xAC, 0x7C, 0xEE, 0xE6, 0x30, 0x1A, 0xB2, 0xDC, 0xB5, 0xCC, 0x0E, 0x66, 0xCB, 0x9D, 0x7F,
0x6C, 0x65, 0x3E, 0x95, 0xBF, 0xAF, 0x12, 0x20, 0xD6, 0x4E, 0x36, 0x53, 0xF6, 0x2D, 0xDF, 0x8E,
0x21, 0xDF, 0x9E, 0xF2, 0x57, 0xF4, 0x62, 0x51, 0x62, 0x85, 0x1E, 0x17, 0xBC, 0x23, 0xAC, 0x26,
0x5E, 0xE0, 0x77, 0x1D, 0xB3, 0x33, 0x75, 0xDF, 0x5F, 0x4B, 0x1B, 0x8F, 0x1F, 0x37, 0x31, 0xBF,
0xA5, 0x5F, 0xFF, 0x95, 0x5E, 0x0A, 0xF0, 0xCF, 0xA0, 0x3B, 0x33, 0xA3, 0x5E, 0xFB, 0xDF, 0x1B,
0xD4, 0x52, 0x48, 0xC9, 0x76, 0x74, 0xDD, 0x9B, 0xFE, 0xB6, 0xCD, 0x68, 0x86, 0xF3, 0xAC, 0x62,
0x30, 0xFE, 0x88, 0xF8, 0x43, 0x50, 0x09, 0x83, 0x38, 0x2F, 0xD2, 0x7A, 0x71, 0xB3, 0xA6, 0xB6,
0x38, 0xA5, 0xF2, 0xF8, 0xF9, 0x9A, 0xF6, 0x2E, 0xFC, 0xF0, 0x7A, 0x0A, 0xAA, 0xB0, 0x98, 0xE4,
0x50, 0x22, 0xCB, 0x0F, 0x0F, 0x76, 0xA8, 0x9C, 0x19, 0x2A, 0xE8, 0xEA, 0x20, 0x3F, 0x3C, 0x24,
0x39, 0x9B, 0x41, 0x91, 0x92, 0x0A, 0x36, 0x42, 0xBE, 0x8F, 0xD9, 0x4F, 0x20, 0xBA, 0x9B, 0x6D,
0x10, 0xF6, 0x7A, 0x06, 0x99, 0x3F, 0xA5, 0x03, 0xBC, 0xFC, 0x40, 0x63, 0x53, 0x02, 0x46, 0x60,
0xAF, 0x91, 0xEF, 0xED, 0x81, 0xC8, 0x03, 0xB7, 0x00, 0x95, 0x19, 0x8C, 0x8B, 0x0D, 0x7F, 0x48,
0xE5, 0x6D, 0x1D, 0x47, 0x39, 0x1C, 0x64, 0x59, 0x3D, 0x22, 0xA3, 0x6D, 0x17, 0x83, 0x83, 0xD6,
0x53, 0x58, 0x20, 0xC5, 0xF5, 0x55, 0x16, 0x3E, 0xC0, 0xBB, 0xD1, 0x42, 0x4A, 0xE7, 0xB9, 0x94,
0x2E, 0x9C, 0x28, 0x7A, 0xF0, 0xDD, 0x33, 0x29, 0xD4, 0xD3, 0xE1, 0x3B, 0x35, 0xB2, 0x72, 0xC2,
0x2E, 0x90, 0xC2, 0xC7, 0x53, 0x08, 0xAB, 0x5A, 0x8D, 0x60, 0xE7, 0x48, 0x61, 0xB5, 0x46, 0x91,
0x69, 0x2D, 0xD2, 0x4C, 0x8A, 0x97, 0x91, 0xD1, 0xAD, 0xEF, 0xE8, 0xF0, 0x09, 0xAB, 0xB3, 0x85,
0xC1, 0x1C, 0x0E, 0x0C, 0x69, 0x47, 0xEF, 0x97, 0x6A, 0xE2, 0x00, 0x39, 0xE1, 0xC1, 0xDA, 0x7C,
0xAA, 0x0A, 0x38, 0xA5, 0x75, 0x95, 0xCA, 0x44, 0x14, 0x1E, 0x58, 0xF4, 0xB6, 0x7E, 0x74, 0x96,
0xBC, 0x3B, 0x93, 0x02, 0x4A, 0xCD, 0x6F, 0x0F, 0x8B, 0x62, 0xF3, 0x82, 0x03, 0xC5, 0x1F, 0xCD,
0xC7, 0x74, 0x13, 0xD0, 0x9B, 0x17, 0xDE, 0xB0, 0xB8, 0xC8, 0x14, 0x21, 0x31, 0x93, 0xB2, 0x21,
0x82, 0x47, 0x05, 0x72, 0xDA, 0xB9, 0x5D, 0x6E, 0x17, 0xA6, 0x83, 0xD3, 0xDC, 0x25, 0x65, 0xC1,
0x5C, 0x52, 0xB4, 0xB9, 0xE2, 0x09, 0xD4, 0x0E, 0xEF, 0x8E, 0x1E, 0xE1, 0x87, 0x93, 0x72, 0xB5,
0xAA, 0x70, 0xA8, 0xE8, 0xF2, 0x08, 0x57, 0x99, 0xB3, 0x47, 0x33, 0x75, 0x1D, 0x9B, 0xBE, 0x6B,
0xA3, 0x52, 0xDE, 0x71, 0x9E, 0xD2, 0x1E, 0x8D, 0x41, 0xB0, 0x17, 0xE8, 0x94, 0xB8, 0x20, 0x74,
0xE6, 0x62, 0xD2, 0xE4, 0x4B, 0x30, 0xB2, 0x15, 0xE9, 0xF5, 0x0B, 0xC8, 0xD4, 0x23, 0x2F, 0x0D,
0xAC, 0x66, 0xED, 0xFB, 0x30, 0xF3, 0x46, 0x73, 0x4C, 0x1D, 0x57, 0x9A, 0xE5, 0x2A, 0x85, 0xDA,
0x8C, 0x1A, 0xC0, 0x92, 0x1D, 0xCE, 0x9D, 0x50, 0x20, 0xAC, 0xF2, 0xAC, 0x18, 0xE4, 0xD1, 0x2F,
0x34, 0x02, 0xB5, 0xE5, 0xEB, 0xFD, 0xBC, 0xEC, 0x18, 0x15, 0x1B, 0xBB, 0x3C, 0x11, 0x1D, 0xD9,
0x2E, 0x98, 0xA8, 0x57, 0x18, 0x9E, 0xBB, 0xE7, 0xEC, 0x32, 0xEB, 0xE0, 0x87, 0x7C, 0x1D, 0xFC,
0x90, 0xBF, 0xD8, 0x8E, 0xC1, 0x0F, 0xF5, 0x46, 0xF0, 0x43, 0xBE, 0x19, 0xFC, 0x30, 0x73, 0xC1,
0x0F, 0x5F, 0x88, 0x6E, 0xD4, 0xC1, 0xAA, 0xB7, 0x45, 0x72, 0xF1, 0xCA, 0x60, 0xEC, 0x81, 0xE0,
0x87, 0x3E, 0x5A, 0x9E, 0x7A, 0x12, 0x9A, 0xA4, 0xF8, 0x45, 0x19, 0x87, 0x97, 0x3F, 0x31, 0xF8,
0x41, 0xD3, 0x0F, 0x6E, 0x7A, 0x82, 0x50, 0xA7, 0x88, 0xC8, 0xD7, 0x8F, 0xC7, 0x28, 0xE4, 0x63,
0x5D, 0xB7, 0x3F, 0xF5, 0x0A, 0xD5, 0xEF, 0x85, 0x2A, 0x68, 0xEC, 0x38, 0xB1, 0x83, 0xBA, 0xE0,
0x61, 0x98, 0xCF, 0xEF, 0xC7, 0x87, 0x10, 0x40, 0xE3, 0x72, 0x70, 0x4C, 0x87, 0x6E, 0x5A, 0x20,
0x77, 0x3F, 0xFC, 0xDB, 0x61, 0xF1, 0xAA, 0x3A, 0x65, 0xF2, 0xE0, 0xDF, 0xCB, 0xBD, 0x87, 0x0E,
0x4A, 0x6C, 0x11, 0x2A, 0x2A, 0x9F, 0x61, 0xF1, 0x03, 0xB4, 0xF0, 0xF0, 0xE7, 0xD7, 0x76, 0xE7,
0xF4, 0x14, 0xC5, 0x07, 0xE5, 0xE3, 0xAE, 0xD9, 0xFC, 0xD0, 0x48, 0xC3, 0x00, 0x39, 0x42, 0xF1,
0x3D, 0x27, 0xE5, 0x78, 0xF6, 0x07, 0xE4, 0x86, 0x7B, 0x8D, 0xCC, 0xF6, 0x7A, 0x61, 0xE5, 0xE8,
0x81, 0x01, 0xDB, 0x5A, 0xB0, 0xCE, 0xBE, 0xC8, 0xB4, 0x6F, 0x66, 0xA0, 0xCA, 0x9A, 0x09, 0x31,
0xB1, 0x24, 0x54, 0xB7, 0x97, 0xAF, 0x2B, 0xEB, 0x89, 0xA6, 0x0D, 0x13, 0x4B, 0x4E, 0x66, 0x3C,
0x59, 0x09, 0xC3, 0x05, 0x2F, 0x92, 0xEB, 0xC4, 0x6C, 0xF4, 0xA9, 0x24, 0x9D, 0x9B, 0xAF, 0x65,
0xC0, 0x82, 0x9F, 0xC5, 0x22, 0x3B, 0xCE, 0x67, 0x7B, 0x58, 0x9C, 0xC1, 0x72, 0xA7, 0x3F, 0xE0,
0xF0, 0x04, 0x02, 0x3E, 0xC3, 0x56, 0xA8, 0x45, 0xE7, 0x5C, 0xF9, 0xA1, 0xF8, 0x28, 0x37, 0x3F,
0x8E, 0xDF, 0x76, 0x3E, 0xD8, 0x10, 0x7A, 0x05, 0x49, 0x65, 0x61, 0xE3, 0x0F, 0x96, 0x21, 0x7E,
0xA3, 0x3E, 0x09, 0x0A, 0x35, 0xF8, 0xC0, 0x60, 0x5A, 0x69, 0x85, 0x8D, 0x28, 0x0F, 0xC1, 0xA7,
0xA7, 0x90, 0x0A, 0x54, 0x0F, 0xA8, 0x28, 0x29, 0x97, 0xED, 0x50, 0xE9, 0xA9, 0x96, 0x14, 0x8A,
0x2B, 0x3B, 0x14, 0x59, 0xD4, 0x18, 0xCB, 0xE5, 0xB4, 0xE3, 0x3C, 0x5B, 0xBE, 0xF1, 0x13, 0x3E,
0xDF, 0xEF, 0x76, 0x54, 0x94, 0x8B, 0xF6, 0x6F, 0xD4, 0x4E, 0xB3, 0xA7, 0x2F, 0x8E, 0x3E, 0xA2,
0x06, 0x1B, 0xD1, 0x84, 0xAA, 0xED, 0x2A, 0xC3, 0x95, 0x8A, 0x3F, 0xCB, 0x1D, 0x75, 0x0C, 0x13,
0x21, 0xCC, 0xE5, 0xCB, 0xDD, 0xD1, 0x14, 0x70, 0x78, 0xAD, 0xE6, 0xF2, 0xDC, 0x81, 0x14, 0x2A,
0x9D, 0x82, 0x98, 0x96, 0xB9, 0x96, 0x32, 0x74, 0x18, 0x4D, 0xB7, 0x6F, 0xBA, 0xBE, 0x74, 0x65,
0x86, 0x0A, 0x6F, 0xD2, 0x38, 0x8E, 0x30, 0x18, 0xDD, 0x7B, 0xC5, 0x5A, 0xBF, 0x09, 0x29, 0x11,
0x4A, 0xF2, 0x15, 0x12, 0x6D, 0xD5, 0x46, 0x8D, 0x4B, 0x98, 0xA4, 0x1D, 0xB4, 0x85, 0x16, 0x69,
0x8E, 0x91, 0xF6, 0x42, 0x7A, 0xA5, 0x99, 0xD0, 0x76, 0x74, 0x80, 0x3E, 0xBA, 0xA6, 0xAA, 0x35,
0x1D, 0x85, 0x70, 0xFF, 0xC6, 0x6A, 0x63, 0x94, 0xF2, 0x70, 0x45, 0xDD, 0x99, 0x8C, 0x22, 0xA1,
0x3B, 0x5C, 0x51, 0x01, 0xA3, 0xFD, 0xC7, 0x8B, 0x7C, 0x46, 0x69, 0x4B, 0xEF, 0xF7, 0xBE, 0xCB,
0x66, 0xA4, 0xD0, 0xCD, 0xED, 0x38, 0xFF, 0x8E, 0xB5, 0xA2, 0x31, 0x3A, 0xD1, 0xCF, 0xEE, 0xC1,
0x48, 0xE1, 0xF6, 0xA5, 0x66, 0x64, 0xDE, 0x28, 0xD8, 0x91, 0xC5, 0x4B, 0xC6, 0xF6, 0x69, 0x42,
0xDD, 0xC9, 0x31, 0xFE, 0x33, 0x08, 0x5F, 0x05, 0x87, 0x34, 0x5B, 0xBA, 0x16, 0xB4, 0xFA, 0x01,
0xA7, 0x01, 0xC6, 0x2A, 0x5F, 0x8E, 0x7C, 0x93, 0x3A, 0xF2, 0xC0, 0x49, 0x40, 0x44, 0x57, 0xE4,
0x73, 0x68, 0x35, 0xA2, 0x16, 0x3C, 0x5D, 0xA5, 0x4E, 0x50, 0xB3, 0x3A, 0xA0, 0x4B, 0x4B, 0x09,
0x20, 0x80, 0x46, 0x33, 0x87, 0x51, 0x6E, 0xF6, 0x31, 0x6D, 0x5D, 0xE0, 0xCC, 0x54, 0x97, 0x98,
0xAB, 0x91, 0x80, 0x99, 0xA5, 0x66, 0xD4, 0xB5, 0xC5, 0xB5, 0xCB, 0x0C, 0x3B, 0xAB, 0x7D, 0x3A,
0x15, 0x84, 0x74, 0x31, 0x48, 0x97, 0xD3, 0x2B, 0x02, 0x3A, 0x23, 0x44, 0x4C, 0x0C, 0x97, 0x0E,
0x64, 0x3A, 0x57, 0x93, 0xA7, 0x6D, 0x78, 0xB7, 0xE2, 0x34, 0xEB, 0x70, 0x50, 0x9C, 0x35, 0xF4,
0x4C, 0x51, 0x87, 0x6A, 0xA8, 0x72, 0x68, 0x58, 0x2B, 0x5D, 0x58, 0x03, 0xD4, 0x5F, 0x4C, 0xA2,
0x8C, 0xC5, 0x0A, 0xD3, 0xA2, 0x06, 0x3A, 0xD0, 0x09, 0x2E, 0x86, 0xDE, 0x27, 0x97, 0xBB, 0xFC,
0x9E, 0x81, 0x1A, 0xEF, 0x2D, 0x4D, 0x02, 0xD4, 0x63, 0xEF, 0x12, 0x5A, 0xC8, 0x4C, 0x97, 0xF4,
0x91, 0x1C, 0xA8, 0x34, 0xF4, 0x88, 0x52, 0xF2, 0xD3, 0x99, 0xA0, 0xED, 0x37, 0x56, 0xE8, 0xDF,
0x0F, 0x91, 0x0A, 0xF7, 0x2B, 0x16, 0x23, 0x86, 0xE0, 0xD5, 0x37, 0x10, 0xED, 0x59, 0x43, 0xA3,
0xDE, 0x61, 0xD8, 0x72, 0xC0, 0x15, 0x93, 0x69, 0x23, 0xB4, 0xCA, 0x85, 0xD0, 0xE7, 0xF0, 0x6B,
0x92, 0x2B, 0x61, 0xCE, 0x82, 0xB6, 0xB1, 0xFB, 0x8A, 0x08, 0xBD, 0x79, 0xF8, 0xBD, 0x46, 0x2A,
0x97, 0x36, 0x23, 0xDF, 0x7D, 0x30, 0x93, 0xAE, 0xE6, 0x93, 0x73, 0x59, 0x8F, 0x32, 0xE8, 0x83,
0x5F, 0xCE, 0x9F, 0x6C, 0xBE, 0x9D, 0x66, 0x7D, 0x2C, 0x1C, 0xE9, 0xD7, 0x6D, 0x11, 0xBD, 0x2D,
0x90, 0xD3, 0xC8, 0xCB, 0x30, 0x12, 0x50, 0x7D, 0xC3, 0xD1, 0x3F, 0xD8, 0xEF, 0x74, 0x20, 0xD2,
0xAF, 0xCB, 0x18, 0xE8, 0x15, 0x8D, 0xE9, 0xE3, 0x5C, 0x6E, 0x79, 0xAB, 0x89, 0xDE, 0xAE, 0xCB,
0xA0, 0x79, 0x84, 0xA9, 0xC3, 0xAC, 0xAA, 0x4F, 0x89, 0x0B, 0xA2, 0xA5, 0x32, 0x8C, 0xDF, 0x1A,
0x5E, 0x91, 0x95, 0x5B, 0xDA, 0xD6, 0x83, 0x03, 0x7F, 0x2B, 0x43, 0xFD, 0xA5, 0xFE, 0x0C, 0x73,
0x2B, 0x03, 0x8F, 0xD2, 0xA1, 0x06, 0x47, 0xAA, 0x5E, 0x81, 0xA2, 0x35, 0x81, 0x9E, 0x47, 0xF2,
0xE0, 0x8E, 0xCC, 0x1B, 0xAC, 0x39, 0xF4, 0x3C, 0xE6, 0x3C, 0xC3, 0x5D, 0xD5, 0xFA, 0x09, 0x11,
0x9F, 0x16, 0x50, 0xE1, 0xE5, 0x69, 0xE2, 0x4C, 0x6D, 0x49, 0x4A, 0x66, 0x38, 0x66, 0x4B, 0x74,
0x2C, 0x82, 0x96, 0x9C, 0x28, 0xD7, 0xA4, 0x1E, 0x54, 0xBF, 0x8E, 0x80, 0x53, 0x1C, 0x84, 0xDA,
0x66, 0x9B, 0x67, 0x01, 0x85, 0x70, 0x84, 0x82, 0xA7, 0x19, 0x9D, 0x46, 0xE0, 0xCF, 0x13, 0x50,
0xC9, 0xB7, 0x52, 0x6D, 0x70, 0xD0, 0x94, 0x66, 0xD4, 0xE6, 0x01, 0x61, 0xED, 0xD3, 0x00, 0x67,
0x9D, 0x03, 0x71, 0xD0, 0xC4, 0xB8, 0x6E, 0x06, 0x0F, 0x13, 0x8F, 0xBE, 0x40, 0x25, 0x5D, 0x4F,
0x2A, 0xBA, 0x78, 0x42, 0xD0, 0xE8, 0x4A, 0x4C, 0x6B, 0xF2, 0x3D, 0xC6, 0xDA, 0x36, 0xC8, 0xCF,
0xE2, 0x39, 0xB3, 0x2F, 0x6D, 0x2E, 0x98, 0xAC, 0xD2, 0xAD, 0x6B, 0xD2, 0x99, 0x92, 0xE8, 0x25,
0xAC, 0x35, 0xB4, 0x25, 0x50, 0xF7, 0x0E, 0xA2, 0xAA, 0x92, 0x26, 0x84, 0x70, 0x5F, 0xD3, 0x76,
0x10, 0x61, 0x84, 0xB7, 0x35, 0x75, 0x58, 0xAC, 0xD9, 0xDD, 0xA8, 0xE4, 0x2A, 0x7D, 0x4D, 0xBE,
0x1E, 0xAA, 0xAF, 0x06, 0xE4, 0xCB, 0xE9, 0xD1, 0x8E, 0xB4, 0x44, 0xB5, 0xB6, 0xA0, 0x62, 0x12,
0x6C, 0x4D, 0xBD, 0x25, 0xF0, 0x1F, 0xBA, 0x08, 0x08, 0x25, 0x61, 0xE8, 0x00, 0x8E, 0x71, 0xF5,
0xDB, 0x17, 0xD4, 0x56, 0xD4, 0x90, 0xC4, 0x36, 0xCA, 0x95, 0x30, 0x21, 0x17, 0x35, 0xCC, 0x41,
0x33, 0x4C, 0xB6, 0x13, 0x2A, 0x63, 0x9C, 0xA1, 0xC2, 0xD5, 0x37, 0xB9, 0xE6, 0xD7, 0x65, 0x4C,
0xAB, 0xE2, 0x7C, 0x7F, 0xB2, 0xC7, 0x62, 0xD8, 0x2B, 0x97, 0x9B, 0x8A, 0x6E, 0xBF, 0x9A, 0x1D,
0x4F, 0x93, 0xF1, 0x92, 0xCC, 0x2A, 0x23, 0x97, 0x9A, 0x7B, 0x39, 0xD1, 0xCF, 0xE7, 0xF3, 0x52,
0x1D, 0x95, 0x2A, 0xBA, 0x07, 0xD5, 0x33, 0xC4, 0x0F, 0xDD, 0xCF, 0xA3, 0x36, 0x4E, 0xD8, 0x73,
0x74, 0xF4, 0xA6, 0x71, 0xE8, 0xA4, 0xA9, 0xA2, 0x36, 0x69, 0xD1, 0x58, 0x05, 0xEF, 0x22, 0x67,
0x05, 0x4F, 0x0A, 0xA4, 0xA3, 0x5D, 0x1D, 0x5F, 0x79, 0x7D, 0x71, 0x01, 0xA9, 0x2D, 0x10, 0x14,
0x03, 0xAE, 0x69, 0xB8, 0xF3, 0x95, 0x63, 0x65, 0xB9, 0xCF, 0xA0, 0x16, 0xA6, 0xB8, 0x2D, 0xCC,
0xC1, 0x30, 0x84, 0xC9, 0xAA, 0xBE, 0x59, 0xA9, 0xFD, 0xD2, 0x2C, 0x5D, 0xB6, 0xDF, 0xFC, 0x5A,
0x8E, 0xAC, 0xFB, 0x3D, 0x7C, 0xC9, 0xA8, 0x6F, 0xB9, 0x8C, 0x65, 0xEB, 0x2F, 0xE4, 0x4B, 0xAC,
0xEE, 0xE3, 0x61, 0x77, 0xFF, 0x5A, 0x0F, 0xA8, 0x45, 0x18, 0x81, 0x2C, 0x09, 0x78, 0x5E, 0x24,
0xD7, 0x5F, 0xED, 0x35, 0x7B, 0x7A, 0xC6, 0xC4, 0xAF, 0xCC, 0xF0, 0xAB, 0x83, 0x65, 0xDC, 0x09,
0x0C, 0x2C, 0xFD, 0x8D, 0x18, 0xE4, 0x00, 0x46, 0x71, 0xB8, 0xCB, 0x1D, 0x77, 0x3A, 0xC1, 0x5E,
0x0E, 0x66, 0xCC, 0x8C, 0x78, 0xB0, 0x40, 0x20, 0xDC, 0xC8, 0x64, 0xFF, 0xA9, 0x14, 0x16, 0xAF,
0xB8, 0x02, 0xB0, 0x99, 0x2B, 0x74, 0x5A, 0x98, 0x3F, 0x63, 0xC7, 0x8B, 0xCB, 0xCA, 0x15, 0x12,
0x97, 0x25, 0x5F, 0xD3, 0x37, 0x73, 0xC5, 0xB5, 0x63, 0x61, 0x4C, 0x7E, 0xEF, 0x8F, 0x05, 0xEF,
0x44, 0x85, 0x35, 0x8F, 0xE8, 0x84, 0x9D, 0xEE, 0xB0, 0xB9, 0x37, 0xAC, 0x0F, 0x5A, 0xC4, 0x33,
0xAA, 0xFB, 0xC0, 0x9D, 0x5C, 0x74, 0x5A, 0xC8, 0xC9, 0xF3, 0xA0, 0x1C, 0x75, 0x91, 0xEB, 0x94,
0x22, 0x14, 0xF6, 0x97, 0xEA, 0x10, 0x06, 0x6C, 0x31, 0x2C, 0x16, 0x4E, 0x40, 0x70, 0x01, 0xF9,
0x98, 0x07, 0x27, 0xFA, 0x8D, 0x21, 0x64, 0x1B, 0x27, 0xAF, 0xBF, 0xA2, 0xDE, 0xAB, 0x76, 0x45,
0x5F, 0x56, 0x61, 0xA5, 0x70, 0xF2, 0xCF, 0xB7, 0x6A, 0xDE, 0xE9, 0x59, 0xBD, 0x33, 0x7E, 0x87,
0x77, 0xD2, 0xC1, 0x08, 0x94, 0x52, 0x1F, 0xCB, 0xC4, 0x31, 0x82, 0x85, 0x6E, 0x36, 0x53, 0xFC,
0xB0, 0x4B, 0xD7, 0xBC, 0x66, 0x97, 0x9D, 0x54, 0x3F, 0x8E, 0xC3, 0xB0, 0x11, 0x9C, 0x7B, 0x4A,
0x39, 0x43, 0x6F, 0x50, 0x56, 0x35, 0xD7, 0xAF, 0xD0, 0x16, 0x47, 0x2C, 0xBF, 0xEC, 0x75, 0x42,
0x38, 0x89, 0xD8, 0x59, 0xA7, 0x9E, 0xD5, 0x71, 0x02, 0xBD, 0xFB, 0xDF, 0x99, 0x4F, 0xFF, 0x6C,
0x3C, 0x32, 0xB5, 0xD0, 0x70, 0x84, 0x2D, 0x27, 0x73, 0x10, 0x76, 0xBB, 0x66, 0x5E, 0xF2, 0x12,
0x73, 0x90, 0x7E, 0xAF, 0xA6, 0x5B, 0x29, 0x69, 0x08, 0xAC, 0xA2, 0x48, 0x9E, 0xB8, 0xF9, 0xA3,
0xCD, 0x79, 0xD9, 0xF3, 0x4C, 0xDF, 0xDF, 0xD0, 0x6B, 0xB5, 0xA4, 0x1C, 0x11, 0xAD, 0x90, 0x71,
0xF0, 0x6B, 0x02, 0x3C, 0x95, 0x10, 0xA9, 0xC2, 0xB7, 0x59, 0xCC, 0x54, 0x92, 0xD7, 0x5D, 0x6E,
0x5B, 0x7B, 0xF5, 0x3C, 0x33, 0xD2, 0x0E, 0xF0, 0x8A, 0x08, 0x75, 0x9E, 0x4E, 0xFD, 0x85, 0x4E,
0x54, 0xAC, 0x2E, 0x14, 0x20, 0x6C, 0x57, 0xCF, 0x38, 0x2F, 0x11, 0x38, 0x26, 0x80, 0x6D, 0xCC,
0x2D, 0x9E, 0x79, 0xA3, 0xDE, 0x81, 0x77, 0x82, 0xC8, 0x5A, 0x95, 0x8C, 0xAA, 0x10, 0xD9, 0x9B,
0x50, 0x30, 0x75, 0xF0, 0x07, 0x4D, 0x91, 0x8D, 0x2F, 0x7E, 0xAB, 0x06, 0xEF, 0xDF, 0x01, 0x91,
0xA5, 0x55, 0xFC, 0x4E, 0x17, 0xB4, 0x3E, 0x00, 0xF9, 0x6A, 0xD9, 0x51, 0x4A, 0x5D, 0xF0, 0xDD,
0x85, 0x79, 0xD4, 0x2B, 0x0F, 0xA8, 0x65, 0x1F, 0x1B, 0x53, 0x6E, 0x9A, 0x8D, 0x94, 0x9B, 0x85,
0x33, 0x08, 0xA8, 0x11, 0xE7, 0x50, 0xCA, 0x4D, 0xEF, 0x44, 0x29, 0x37, 0x9B, 0x3B, 0xA6, 0xDC,
0x8C, 0x1B, 0x67, 0x57, 0x3A, 0x25, 0x4D, 0x5A, 0xC0, 0x53, 0x06, 0x33, 0xA6, 0xAE, 0xFB, 0xD1,
0x3F, 0x1A, 0xC7, 0x51, 0xAB, 0xF9, 0x9B, 0xDC, 0xBD, 0x99, 0x24, 0x71, 0x9D, 0xD5, 0xF5, 0xFC,
0x7B, 0x73, 0xB0, 0x3C, 0x08, 0xA7, 0xFD, 0x9A, 0x7D, 0xE9, 0x35, 0xEA, 0x1E, 0xF5, 0xD5, 0xEA,
0xC8, 0xAC, 0x76, 0xCD, 0xA5, 0x42, 0xD3, 0x30, 0x72, 0xFB, 0x3A, 0xBC, 0x64, 0x08, 0x2B, 0x93,
0x95, 0x1F, 0x5E, 0xCC, 0x4A, 0x46, 0xE3, 0xAE, 0x74, 0x21, 0x14, 0xFA, 0xEA, 0xC7, 0xF5, 0xBD,
0x60, 0xA4, 0x11, 0xBC, 0xD1, 0xBA, 0xD5, 0x75, 0x30, 0x1B, 0xE8, 0x7C, 0xDE, 0xCF, 0xCF, 0x7E,
0x9E, 0xD9, 0x40, 0x35, 0xB1, 0x4F, 0xA6, 0x4E, 0x00, 0x27, 0xD4, 0xFD, 0x99, 0xB5, 0x13, 0x35,
0x75, 0x52, 0x6F, 0x2C, 0xCA, 0xEB, 0xAF, 0x2A, 0x72, 0xD1, 0x4C, 0xA2, 0xF7, 0x55, 0x18, 0xCE,
0x6B, 0x9A, 0xD0, 0xE0, 0x6E, 0xAC, 0xFC, 0x25, 0x92, 0xCA, 0xF8, 0x85, 0x66, 0xF4, 0x61, 0x2C,
0x35, 0x2F, 0x7C, 0xC8, 0xB0, 0x14, 0xA2, 0x03, 0x9F, 0x5B, 0x62, 0x44, 0x2B, 0x65, 0xE4, 0x68,
0x8F, 0xD6, 0xBD, 0x02, 0x86, 0x51, 0x7D, 0x32, 0xBB, 0xD9, 0x8E, 0xBE, 0x3F, 0xAA, 0xEA, 0x8F,
0xBA, 0xA9, 0x7F, 0xDA, 0xDF, 0x7B, 0x2E, 0x3A, 0xF8, 0x1C, 0x63, 0xD7, 0xB2, 0x29, 0x76, 0xAD,
0xD2, 0xD8, 0xB5, 0x84, 0xB1, 0x6B, 0x19, 0xFD, 0xA9, 0xE9, 0xE5, 0xE3, 0x6D, 0xC4, 0xAE, 0x31,
0xD5, 0x2A, 0x77, 0x0A, 0x79, 0x61, 0xC5, 0xE0, 0x71, 0x43, 0x17, 0x1F, 0xC5, 0x4D, 0x94, 0x3D,
0xD5, 0x5B, 0xAF, 0x9F, 0xC0, 0xF7, 0x64, 0x87, 0xCF, 0x76, 0xA8, 0x4E, 0x3D, 0xBD, 0x3B, 0x37,
0x9A, 0xE1, 0x36, 0xA1, 0x9B, 0xF2, 0xA2, 0x5C, 0xBC, 0xFC, 0x29, 0x0C, 0x55, 0x3C, 0x0D, 0x55,
0xBA, 0x39, 0x54, 0xFD, 0x3A, 0xCC, 0x4F, 0x87, 0xAA, 0xBE, 0xCB, 0x50, 0x01, 0x44, 0xF5, 0xE0,
0x2F, 0x86, 0xC5, 0x5D, 0x86, 0x8A, 0x89, 0x59, 0x0B, 0x2E, 0xE5, 0x4C, 0x33, 0xB3, 0x06, 0x90,
0xE9, 0x30, 0x52, 0x24, 0x54, 0x6E, 0x73, 0x00, 0xF5, 0x17, 0x65, 0x12, 0x18, 0x26, 0x67, 0x9D,
0x35, 0x74, 0xF0, 0x54, 0x57, 0x22, 0x75, 0xDD, 0x53, 0xF7, 0x3C, 0x3D, 0xB2, 0x46, 0xCF, 0x32,
0xA5, 0xA6, 0xDC, 0x65, 0x8D, 0x53, 0x8E, 0xD3, 0xF7, 0xDD, 0x38, 0x3D, 0x52, 0x07, 0x3C, 0xA3,
0x39, 0x5A, 0x43, 0x4D, 0x0B, 0x0E, 0x8E, 0x89, 0xBE, 0x4D, 0x29, 0x1D, 0x43, 0xE2, 0x6E, 0x43,
0x61, 0x72, 0x92, 0xE3, 0x44, 0xEB, 0x99, 0xCE, 0x04, 0x51, 0x7D, 0xD0, 0xA0, 0xC1, 0xC1, 0x3F,
0x53, 0xF7, 0x19, 0xE7, 0x15, 0x79, 0x8E, 0x83, 0xB7, 0x1C, 0x43, 0xC9, 0x55, 0x54, 0xA1, 0x0F,
0x04, 0xF7, 0x92, 0xDA, 0xEB, 0x9C, 0x8F, 0x95, 0xD7, 0xCD, 0x48, 0x76, 0x4B, 0x0C, 0x86, 0x3E,
0xCB, 0x22, 0xAB, 0x57, 0x82, 0x93, 0xAA, 0x1F, 0x39, 0x36, 0x68, 0x7D, 0xB3, 0xB2, 0xD4, 0x00,
0x14, 0x45, 0x7C, 0xD0, 0x53, 0xB8, 0xEF, 0x47, 0xE7, 0xC3, 0x7C, 0xEE, 0x02, 0xA3, 0xCC, 0x03,
0xFD, 0x3D, 0x26, 0x27, 0x39, 0xFC, 0xCD, 0xBF, 0x4B, 0xF7, 0xF9, 0x3D, 0x92, 0x1F, 0xA6, 0x30,
0x64, 0x4A, 0xB9, 0x26, 0x5A, 0x7E, 0xF1, 0xC2, 0xB0, 0x28, 0xB8, 0x38, 0x8E, 0xEE, 0x61, 0xE1,
0x69, 0x52, 0xE6, 0x4F, 0xE5, 0x14, 0x32, 0x9B, 0xD0, 0x04, 0xE3, 0xF4, 0xCF, 0x4E, 0x74, 0x72,
0x52, 0x91, 0x5B, 0xB0, 0xFD, 0x66, 0x4E, 0x93, 0x83, 0xA7, 0x10, 0xA7, 0x66, 0x2E, 0x91, 0xDB,
0xA3, 0x90, 0x13, 0xAD, 0x34, 0xF8, 0x9F, 0xEA, 0xAE, 0x13, 0x57, 0x13, 0xDF, 0x80, 0xA5, 0x7A,
0xAC, 0x0D, 0x86, 0xF9, 0x16, 0x77, 0x41, 0xB1, 0x8C, 0x30, 0x6C, 0xE5, 0xD4, 0xB3, 0xAF, 0x28,
0xF3, 0xAA, 0xFE, 0x66, 0xAA, 0xCD, 0x1D, 0xD6, 0x3C, 0xED, 0x66, 0xB5, 0x5D, 0x8B, 0xB9, 0x91,
0x2A, 0x5D, 0xF3, 0x35, 0x3F, 0xA8, 0xCC, 0x61, 0x7C, 0x7C, 0xF5, 0x5A, 0xED, 0x4A, 0x47, 0x58,
0xA4, 0x25, 0xE5, 0x5A, 0xA7, 0xB4, 0x7F, 0x6C, 0x25, 0x02, 0x34, 0x91, 0x55, 0x95, 0x2E, 0xE7,
0x16, 0xF9, 0x2D, 0x3E, 0x02, 0x7F, 0x05, 0x67, 0xEA, 0xB3, 0x77, 0xE0, 0x68, 0xD4, 0xE4, 0x66,
0x5C, 0xF6, 0xA1, 0xE3, 0x99, 0x9D, 0x8D, 0xCA, 0xED, 0x7E, 0x1C, 0xE1, 0xE1, 0x6E, 0x87, 0x3F,
0xC6, 0xE1, 0xDB, 0x9B, 0x07, 0x8B, 0x43, 0x99, 0x7D, 0xDB, 0x1F, 0xD2, 0x5B, 0x3B, 0xE5, 0x10,
0x3B, 0x59, 0x75, 0x77, 0x30, 0x5F, 0x66, 0x1C, 0xD6, 0xB7, 0xEF, 0x74, 0x38, 0x3E, 0xA1, 0x31,
0x77, 0x31, 0x48, 0xD5, 0x8D, 0x6A, 0xB3, 0xE0, 0xBD, 0x2C, 0x85, 0x18, 0x85, 0x3A, 0x7A, 0xBF,
0x41, 0xE1, 0xB9, 0xBA, 0xFC, 0xA9, 0xDD, 0x2A, 0x07, 0xE1, 0x9D, 0xDF, 0x5B, 0x25, 0x88, 0x79,
0xFC, 0x12, 0xFC, 0x62, 0x63, 0x04, 0x83, 0x8D, 0x05, 0xF3, 0x72, 0x34, 0x3A, 0xA8, 0x46, 0xAB,
0x7B, 0xE6, 0x63, 0x84, 0x53, 0x9B, 0x7D, 0x0C, 0xA5, 0x96, 0xD5, 0xED, 0x6A, 0x3E, 0xBC, 0xD8,
0xC5, 0xC2, 0x78, 0xE6, 0x2F, 0x1C, 0x34, 0x8B, 0x20, 0xAD, 0xB1, 0x26, 0xA9, 0x55, 0xEC, 0x7B,
0xA2, 0xCA, 0xFA, 0xBF, 0x9C, 0x20, 0x59, 0x59, 0x0F, 0xB3, 0xE1, 0xDB, 0x90, 0x5E, 0x84, 0xDB,
0x8B, 0x6E, 0x5C, 0xDD, 0x3A, 0x60, 0x36, 0x8C, 0xAF, 0x20, 0x6D, 0xC0, 0x00, 0xD2, 0x84, 0xAC,
0x1E, 0xBD, 0x73, 0x04, 0x3F, 0x71, 0xA1, 0xDA, 0x40, 0xE0, 0x76, 0x77, 0xC3, 0x2F, 0x3C, 0x55,
0xE1, 0x35, 0xFD, 0xC0, 0x6C, 0xD5, 0xF4, 0x4D, 0x80, 0x76, 0x48, 0xED, 0x21, 0x46, 0x53, 0xB0,
0xEB, 0x60, 0x95, 0x89, 0x6E, 0x09, 0x78, 0x85, 0x84, 0x3C, 0xB8, 0x4D, 0x87, 0x70, 0xD3, 0x0F,
0x94, 0x04, 0x52, 0x97, 0xE9, 0xEE, 0x7D, 0xFD, 0x6A, 0x1F, 0x73, 0x49, 0xEF, 0x9C, 0xCC, 0x3E,
0x66, 0x2E, 0x1A, 0x0E, 0xF8, 0x01, 0x8F, 0x42, 0xA3, 0xAB, 0x75, 0xEE, 0xB2, 0x81, 0x43, 0x7D,
0xF9, 0x07, 0xC6, 0xFC, 0x09, 0x48, 0xC6, 0xF5, 0x8B, 0xD6, 0x4C, 0xDB, 0xC2, 0x78, 0xA5, 0x73,
0x6C, 0x77, 0xF1, 0xB3, 0x4C, 0xD3, 0x38, 0xB3, 0xCA, 0x50, 0x80, 0xED, 0xB4, 0x2F, 0x95, 0x74,
0x0E, 0x8C, 0xEA, 0xAF, 0x30, 0x08, 0xEC, 0x71, 0x38, 0x1C, 0xB4, 0x8F, 0x33, 0xF6, 0x0D, 0xEE,
0x7D, 0x5E, 0xC7, 0xFD, 0xDC, 0xBA, 0x48, 0x43, 0x16, 0xB7, 0xAE, 0x2F, 0x16, 0xAF, 0x1E, 0x8C,
0xAF, 0x5E, 0xAD, 0xD7, 0xAF, 0xE2, 0x02, 0x68, 0xD7, 0x7E, 0x53, 0x06, 0xE0, 0xC3, 0x6F, 0xD5,
0xE3, 0xA8, 0xF9, 0x9A, 0x09, 0xE9, 0x40, 0x82, 0x5C, 0x37, 0xAC, 0xA9, 0x0E, 0x6B, 0x3E, 0x0D,
0x6B, 0xB2, 0x1E, 0xD6, 0xE4, 0x81, 0x1F, 0xD6, 0xFE, 0x40, 0xE6, 0x29, 0x87, 0x96, 0xC7, 0xF7,
0x1C, 0x7B, 0xD2, 0xFD, 0xDD, 0x7D, 0x22, 0x66, 0xF7, 0x35, 0x11, 0xE1, 0xD1, 0x89, 0xB0, 0x1B,
0x13, 0x71, 0x5A, 0x27, 0xC2, 0xB9, 0xBD, 0x7E, 0xF2, 0x11, 0xAE, 0x01, 0x3F, 0xB3, 0xF6, 0xF5,
0x72, 0x17, 0xAE, 0x2B, 0x9D, 0x0B, 0xCC, 0xB9, 0xB7, 0xE2, 0xE9, 0xE1, 0x09, 0x6B, 0xDF, 0xE2,
0xD4, 0xFA, 0xB5, 0x73, 0xDE, 0x4D, 0x0A, 0x17, 0x06, 0x3A, 0x3C, 0x53, 0x6F, 0x64, 0xE4, 0x42,
0xE3, 0x87, 0xE3, 0xBC, 0x85, 0xB8, 0x8D, 0x12, 0xF4, 0x4B, 0x1A, 0x16, 0x04, 0xA6, 0x45, 0x3D,
0x6F, 0x61, 0x7E, 0xF4, 0xC9, 0xB0, 0x69, 0x74, 0x50, 0xCE, 0xDD, 0x0E, 0x5B, 0x97, 0xEE, 0x24,
0xE1, 0x1E, 0x09, 0x71, 0xE5, 0xB7, 0x4E, 0xE7, 0xA3, 0xBB, 0x1F, 0x4D, 0xDB, 0x21, 0xC5, 0x6E,
0x7F, 0x24, 0x53, 0x3E, 0xDD, 0x9F, 0x5B, 0xB9, 0x5C, 0x2F, 0xDD, 0xA8, 0xA0, 0xA2, 0x84, 0x7C,
0x2B, 0xFF, 0x11, 0x5B, 0x3E, 0x6E, 0xBA, 0x34, 0xEE, 0xC2, 0x14, 0xB9, 0x6D, 0x99, 0x84, 0xAF,
0x4B, 0x0A, 0x75, 0x54, 0x95, 0x8A, 0x94, 0x3E, 0xD0, 0xDC, 0xC9, 0x49, 0x4E, 0x48, 0x05, 0x33,
0x36, 0x31, 0x67, 0x43, 0xA5, 0x9B, 0x3F, 0x79, 0xF4, 0x3B, 0x86, 0x31, 0x1F, 0x7B, 0x95, 0x90,
0x8F, 0x86, 0x0B, 0xB6, 0x54, 0xA0, 0xFE, 0x3B, 0xEA, 0xCF, 0x45, 0xB7, 0x92, 0x91, 0x38, 0x8F,
0x1B, 0x06, 0x49, 0xE3, 0x9C, 0xBF, 0xFF, 0xD1, 0xF1, 0xD1, 0x10, 0xE9, 0x9E, 0x9B, 0xC5, 0x30,
0x9C, 0x94, 0xE1, 0xF7, 0x1A, 0xCA, 0xA7, 0x79, 0xD5, 0xB9, 0xC3, 0x01, 0x9F, 0x0B, 0xE1, 0x02,
0xB8, 0x2D, 0x7D, 0x82, 0x9E, 0xE3, 0xB3, 0x3D, 0x7B, 0xA1, 0x56, 0x9E, 0xAA, 0xD9, 0x58, 0x84,
0xCF, 0x75, 0x31, 0xD3, 0xFC, 0xE4, 0x6A, 0x3C, 0x10, 0x5E, 0xB9, 0xA2, 0x97, 0x6F, 0x00, 0x0D,
0x38, 0x4D, 0x15, 0xB3, 0x86, 0xE6, 0x2E, 0xE4, 0xD1, 0xAA, 0x98, 0x13, 0x05, 0x79, 0xCD, 0x5F,
0xD7, 0x44, 0xBD, 0xC0, 0xE6, 0x7E, 0x7F, 0xD0, 0x52, 0x36, 0x6B, 0x35, 0x60, 0xE7, 0x38, 0x4B,
0xD9, 0xB8, 0x09, 0x9C, 0xB3, 0x94, 0xF5, 0x6B, 0x4B, 0xD9, 0xB8, 0xA9, 0x64, 0x36, 0x83, 0xB5,
0x10, 0x4F, 0xD8, 0xA2, 0x70, 0x94, 0x2F, 0xC9, 0x08, 0xA2, 0xA8, 0x16, 0x79, 0x3A, 0xAA, 0xA8,
0x96, 0x8E, 0xFB, 0xB8, 0x78, 0x47, 0x8A, 0xC7, 0x66, 0xF6, 0x56, 0x4B, 0xF3, 0x0A, 0x2E, 0x70,
0x9D, 0x4C, 0x0E, 0x56, 0x78, 0xCC, 0xA9, 0x57, 0xAB, 0xBC, 0xCB, 0x69, 0x4B, 0xF5, 0x97, 0xAC,
0xC0, 0xFC, 0xC9, 0x86, 0x79, 0x7C, 0xE1, 0x13, 0x8D, 0x18, 0x68, 0xC4, 0x3C, 0x23, 0x3B, 0x35,
0x1C, 0xB5, 0x68, 0x28, 0xD2, 0x50, 0xD9, 0x4C, 0xDA, 0x2A, 0x22, 0x15, 0xF5, 0x68, 0xD1, 0xCD,
0x06, 0x29, 0xC8, 0x34, 0xBD, 0x1B, 0x92, 0x91, 0xF8, 0xD0, 0x3F, 0xEF, 0x28, 0x10, 0xE8, 0xF6,
0xC9, 0xED, 0x06, 0x6B, 0x9B, 0x16, 0x0F, 0xC9, 0xF0, 0x04, 0x7B, 0xF2, 0x76, 0xD5, 0xA0, 0x8C,
0x7A, 0x91, 0xD2, 0x8E, 0x9B, 0x8B, 0xD6, 0x2E, 0x0E, 0x94, 0xAC, 0x7D, 0x39, 0x39, 0x39, 0x6B,
0x80, 0x14, 0x77, 0xEB, 0xA2, 0x40, 0xA3, 0xD6, 0x08, 0xDD, 0x50, 0xA0, 0xD2, 0xFD, 0x05, 0x9C,
0xEB, 0x37, 0x4F, 0xD1, 0x27, 0xDB, 0xED, 0x4B, 0xC6, 0xCB, 0x37, 0xB8, 0x54, 0xBD, 0x28, 0x9D,
0x2E, 0x42, 0x4A, 0x10, 0xF5, 0xFD, 0xC7, 0x8E, 0x45, 0xDD, 0xA8, 0x44, 0x51, 0x21, 0x95, 0xA3,
0x99, 0x9B, 0xBF, 0x02, 0xBD, 0xB7, 0xB7, 0x35, 0xB8, 0xF0, 0x0A, 0x03, 0x74, 0x2D, 0x02, 0x0B,
0x46, 0x7F, 0xFD, 0xD0, 0xF1, 0xAB, 0x9B, 0x7A, 0x51, 0x17, 0xB9, 0xA0, 0x11, 0x0D, 0xC1, 0x61,
0x0B, 0x7B, 0xE9, 0x32, 0x6C, 0x20, 0x77, 0x0B, 0x92, 0x46, 0x47, 0x95, 0x6E, 0x12, 0x97, 0xBA,
0x22, 0xC3, 0xCF, 0x11, 0xA6, 0xDF, 0x60, 0x1D, 0x31, 0x7D, 0xB4, 0x26, 0x0B, 0x64, 0xBA, 0x12,
0x0D, 0xCF, 0xC6, 0x9E, 0x5D, 0x2E, 0x0D, 0x02, 0x33, 0x46, 0xE3, 0x2C, 0xDC, 0xBD, 0xCF, 0x41,
0x05, 0xF4, 0x11, 0x22, 0x1C, 0x99, 0x70, 0x41, 0x95, 0x90, 0xAF, 0x4D, 0x92, 0xD2, 0x9D, 0x3C,
0xCC, 0x1E, 0xA8, 0x5D, 0x92, 0x36, 0xC0, 0x5A, 0xD9, 0xB2, 0xE4, 0x50, 0xC2, 0xFA, 0xD8, 0x81,
0xB5, 0xAA, 0x94, 0x55, 0x87, 0xAA, 0xBA, 0xE4, 0x11, 0xAC, 0xA9, 0xAD, 0x87, 0x96, 0xFE, 0xC6,
0x27, 0x14, 0xF6, 0x16, 0x0B, 0xC6, 0x9E, 0xDE, 0x70, 0x31, 0x9F, 0x9F, 0x78, 0xF1, 0x58, 0x18,
0x1D, 0x56, 0x39, 0xC5, 0xBD, 0x1B, 0x57, 0x99, 0xF6, 0x2F, 0xC0, 0x2C, 0x3E, 0x94, 0x48, 0xA3,
0xD2, 0x39, 0xDD, 0x97, 0x1B, 0xDE, 0x07, 0xD5, 0xA0, 0xF5, 0xFD, 0x0D, 0x83, 0xD6, 0xE6, 0x56,
0xB5, 0x3B, 0x1B, 0x94, 0x5D, 0xB9, 0x0B, 0x05, 0x67, 0x9D, 0x00, 0xBF, 0x3B, 0xE4, 0x23, 0x29,
0xD7, 0x73, 0x5C, 0xEE, 0x5E, 0xC4, 0x78, 0x53, 0xA4, 0x5D, 0xA9, 0xF9, 0x65, 0x38, 0xC9, 0x6D,
0x6A, 0xDC, 0xE9, 0x26, 0xAB, 0x96, 0x7A, 0x1A, 0xA7, 0x66, 0x82, 0xE0, 0xED, 0x35, 0x9B, 0xE0,
0xFC, 0x1D, 0x4F, 0x2E, 0xD5, 0x1C, 0x3D, 0x50, 0x52, 0x94, 0x99, 0x3C, 0x3D, 0xA4, 0x57, 0x9F,
0xB2, 0x2A, 0xD5, 0xA8, 0x98, 0xF8, 0xE5, 0x1F, 0x9C, 0x60, 0x5F, 0x96, 0xF4, 0xD0, 0x21, 0xBB,
0xEB, 0x61, 0x4C, 0x55, 0x88, 0x64, 0x83, 0xD2, 0xC7, 0x9B, 0x9F, 0x50, 0x60, 0x42, 0x42, 0xA1,
0x30, 0x1F, 0x0B, 0x3F, 0x65, 0x29, 0x0E, 0xC6, 0x76, 0x55, 0x9A, 0x53, 0xD9, 0xB4, 0xD7, 0xF6,
0x58, 0xA0, 0xF7, 0x7F, 0x6C, 0xC7, 0x42, 0x35, 0xA6, 0xCE, 0x39, 0xA6, 0xE0, 0x36, 0x77, 0x33,
0x6E, 0x77, 0x37, 0xE3, 0xB6, 0x77, 0x33, 0x6E, 0x7F, 0x37, 0xB3, 0x3D, 0x7E, 0xEB, 0x0E, 0x6F,
0xC6, 0x6D, 0xF1, 0x66, 0xDC, 0x1E, 0x6F, 0x66, 0x1B, 0x01, 0x38, 0x0D, 0x52, 0x77, 0x71, 0x97,
0x37, 0x93, 0x0B, 0xB0, 0xC0, 0xC9, 0xC7, 0xED, 0xF3, 0x66, 0xDC, 0x46, 0x6F, 0xC6, 0xED, 0xF4,
0x66, 0xDC, 0x56, 0x6F, 0xC6, 0xED, 0xF5, 0x66, 0xDC, 0x66, 0x6F, 0xC6, 0xED, 0xF6, 0x66, 0xDC,
0x76, 0x6F, 0xC6, 0xED, 0xF7, 0x66, 0xDC, 0x86, 0x6F, 0xC6, 0xED, 0xF8, 0x66, 0xDC, 0x96, 0x6F,
0xC6, 0xED, 0xF9, 0x66, 0x74, 0xD3, 0x37, 0x5A, 0x31, 0xF1, 0xDD, 0xEA, 0xB6, 0x6F, 0x63, 0x50,
0xDB, 0xE8, 0x82, 0x3E, 0xCA, 0xE0, 0x63, 0x30, 0xFB, 0xC8, 0xB0, 0x8E, 0xDE, 0xC1, 0x63, 0x34,
0x4E, 0x7E, 0xC8, 0xD7, 0x3C, 0xA2, 0xE5, 0x9F, 0x09, 0x7D, 0xF3, 0x3A, 0xA2, 0xA7, 0x26, 0x17,
0x8B, 0xAD, 0xA3, 0x1B, 0x19, 0xF2, 0xCD, 0xC0, 0xA3, 0xF7, 0x76, 0x0D, 0x1D, 0x61, 0x2E, 0xED,
0xDF, 0xA6, 0x5B, 0xB0, 0xB4, 0xBB, 0x93, 0x1F, 0x49, 0x16, 0x3F, 0x2F, 0x0C, 0x49, 0x8B, 0x8C,
0x50, 0x5D, 0x54, 0xE5, 0x48, 0x7B, 0xB2, 0x8D, 0xC0, 0x67, 0x11, 0xF5, 0xE1, 0x27, 0x5C, 0x25,
0xE7, 0x0A, 0xF4, 0x79, 0xBF, 0xC6, 0x8F, 0x68, 0xE0, 0x00, 0xE4, 0xCB, 0xC0, 0x5E, 0x41, 0x7E,
0xFB, 0xB4, 0x43, 0x5C, 0x6C, 0xA0, 0x64, 0xD2, 0xB9, 0xD7, 0xA7, 0x9B, 0x7D, 0xDA, 0xDE, 0xEC,
0x88, 0xF3, 0x85, 0xAE, 0x3E, 0x4D, 0xAE, 0x36, 0xAA, 0x90, 0xA2, 0x41, 0xD7, 0x62, 0xB0, 0x8B,
0x48, 0x49, 0x4F, 0x63, 0x65, 0x93, 0x23, 0xE9, 0xB5, 0x1E, 0xF4, 0xFD, 0x76, 0x99, 0x1E, 0x2E,
0xC9, 0x92, 0x8C, 0x99, 0x40, 0xC1, 0x01, 0x51, 0xFD, 0x38, 0x46, 0x86, 0xE8, 0xDE, 0x69, 0x34,
0x2A, 0x15, 0xC9, 0x5F, 0x6C, 0xD5, 0xBE, 0x2E, 0xE6, 0xC4, 0xB9, 0xAE, 0x1A, 0x75, 0x5D, 0xFD,
0xB2, 0x26, 0xCC, 0xA8, 0xCB, 0x0F, 0x7F, 0xBF, 0x83, 0x2F, 0x0E, 0x38, 0x4F, 0x41, 0x4E, 0x48,
0x49, 0xE6, 0x33, 0x69, 0x53, 0x5A, 0x79, 0xF6, 0xAD, 0xFE, 0xE9, 0x7D, 0x04, 0xC3, 0xBD, 0x16,
0xDA, 0x26, 0x61, 0x00, 0xA2, 0x31, 0x99, 0x67, 0xC6, 0xDE, 0xF2, 0xFD, 0xAE, 0xAC, 0xF5, 0xC7,
0xFC, 0x3D, 0xF0, 0xA3, 0xF9, 0x88, 0x39, 0x23, 0xCF, 0x15, 0x60, 0x5F, 0x25, 0x95, 0xD7, 0x00,
0x4A, 0x36, 0x23, 0xF8, 0x3F, 0xE3, 0xD1, 0xA4, 0x75, 0x72, 0x70, 0xF2, 0xAA, 0xDD, 0xB0, 0xB9,
0xAB, 0x9C, 0xAC, 0x89, 0xDB, 0x54, 0xC8, 0x70, 0x09, 0x3B, 0x22, 0x47, 0xC4, 0xF4, 0x9B, 0x41,
0xF5, 0x64, 0x2A, 0xC6, 0x5D, 0xC5, 0x5D, 0x28, 0x0A, 0xD2, 0xA9, 0x9D, 0x65, 0x2E, 0x21, 0xEE,
0xC4, 0xD8, 0xE9, 0x37, 0x78, 0x2C, 0xD4, 0x87, 0xB7, 0xE6, 0xE7, 0x2A, 0x33, 0x71, 0xA8, 0xB4,
0x49, 0xD0, 0x1D, 0xF0, 0xFA, 0xA2, 0x74, 0x1E, 0x81, 0x91, 0xCB, 0xE0, 0x12, 0x39, 0xEC, 0x4A,
0x77, 0xEB, 0x56, 0xBF, 0x39, 0xBA, 0x2E, 0x5D, 0x69, 0xE4, 0x7C, 0xAD, 0xF1, 0xCD, 0x6D, 0x71,
0x38, 0x21, 0x67, 0xE9, 0x2A, 0x1B, 0xDA, 0xDE, 0xD3, 0x3C, 0x69, 0x2D, 0xB6, 0x19, 0x4D, 0xFF,
0x3C, 0xBF, 0xF1, 0xC1, 0xD6, 0xCA, 0xCB, 0x4C, 0xD9, 0x10, 0x39, 0x05, 0x83, 0x52, 0x60, 0x6E,
0x36, 0xAA, 0xBC, 0x65, 0xAF, 0x3F, 0xA3, 0xA5, 0x47, 0x85, 0x37, 0x13, 0xFB, 0x32, 0xA9, 0xF1,
0xD5, 0x27, 0x65, 0x7A, 0x7F, 0x20, 0x32, 0x80, 0x33, 0x86, 0x91, 0x11, 0x05, 0x0F, 0xA9, 0xED,
0x99, 0xB9, 0x84, 0xF3, 0x56, 0xD3, 0x1C, 0x27, 0xD2, 0x8D, 0x47, 0x92, 0x5B, 0x5B, 0x3F, 0xB1,
0x7F, 0x53, 0x16, 0xBA, 0x39, 0x22, 0xC3, 0x39, 0x43, 0x0C, 0xF6, 0x59, 0x4E, 0x6B, 0xB0, 0xF2,
0x6B, 0x66, 0xC3, 0x82, 0x50, 0x89, 0xEE, 0xC7, 0xEB, 0x00, 0xF9, 0xCF, 0x73, 0xFF, 0x61, 0xBF,
0x36, 0x0D, 0x97, 0x33, 0x37, 0x70, 0xA5, 0x88, 0x4D, 0x3B, 0xE3, 0xA9, 0x4D, 0x0D, 0x44, 0xCE,
0xF0, 0x4B, 0x9B, 0x85, 0xFD, 0xAF, 0x61, 0x7F, 0x1D, 0x24, 0xF3, 0xA2, 0x2C, 0xC5, 0xBC, 0x50,
0xF1, 0x5B, 0x2B, 0x66, 0x56, 0xB6, 0xF6, 0x0A, 0x38, 0x56, 0x2B, 0xEC, 0xD4, 0x8B, 0xA3, 0xC2,
0x90, 0x44, 0x94, 0x63, 0xDD, 0xA9, 0xC5, 0xC2, 0xCB, 0xF2, 0xDD, 0x6F, 0x31, 0x09, 0x4E, 0xA6,
0xCA, 0x9E, 0x29, 0x88, 0x5F, 0x46, 0xDC, 0xA5, 0xDE, 0x63, 0x26, 0x61, 0xEC, 0x4C, 0x75, 0x9E,
0x59, 0x7F, 0x26, 0x6B, 0xBE, 0xAA, 0x5C, 0x74, 0x2D, 0xAB, 0x99, 0xD9, 0xE9, 0x2F, 0xBA, 0xB5,
0x82, 0xD8, 0xEB, 0x17, 0xF8, 0xEB, 0x37, 0xF2, 0x7F, 0xF7, 0xC8, 0xD8, 0x34, 0xEF, 0xCB, 0x29,
0x72, 0x57, 0x79, 0x62, 0xBF, 0x9B, 0xB2, 0x2E, 0xB8, 0x55, 0x1A, 0xAF, 0x74, 0x53, 0xA3, 0x19,
0x1C, 0x42, 0x45, 0x30, 0xBB, 0x0E, 0xAF, 0x67, 0xA6, 0xCA, 0x86, 0x91, 0x3A, 0x1B, 0x59, 0xE2,
0x47, 0xCF, 0x62, 0x88, 0x06, 0xE6, 0x2A, 0x2D, 0x82, 0xDD, 0xA7, 0xAC, 0x48, 0x63, 0xEA, 0x02,
0x6B, 0x27, 0x4F, 0xD6, 0x76, 0xEC, 0x7B, 0xFC, 0x86, 0xB4, 0xC6, 0xB2, 0x3F, 0x58, 0x63, 0x8C,
0x30, 0x78, 0xB3, 0xD5, 0xED, 0xFF, 0x88, 0x6C, 0x12, 0x11, 0x9A, 0x11, 0xDC, 0x73, 0x35, 0x47,
0x7E, 0x3E, 0x28, 0xB3, 0xC0, 0x81, 0x33, 0xF4, 0xD9, 0x23, 0x52, 0x8D, 0x2A, 0xCD, 0x58, 0x42,
0x4B, 0x16, 0xCB, 0xDE, 0xF1, 0x61, 0x78, 0xBF, 0x34, 0x03, 0xF8, 0xB0, 0x81, 0xE7, 0x60, 0x88,
0x44, 0x0C, 0xD8, 0xE3, 0x1A, 0x3C, 0xC6, 0xC3, 0x07, 0x02, 0xD3, 0x4E, 0xCD, 0x29, 0xD5, 0x9F,
0xD7, 0x80, 0xFB, 0x61, 0x5E, 0xAE, 0x3C, 0xD7, 0x78, 0xEA, 0xE2, 0xD2, 0xD1, 0xDD, 0xD8, 0xD7,
0xE0, 0x10, 0x69, 0x6E, 0xF9, 0x26, 0x1A, 0xAA, 0xC3, 0x0C, 0xBB, 0x09, 0xC6, 0x11, 0xCA, 0x7D,
0xEE, 0xED, 0xCE, 0x6D, 0x25, 0xB3, 0x68, 0xF7, 0x5C, 0xAB, 0x91, 0xAC, 0xBA, 0x51, 0xC7, 0x59,
0x17, 0x4D, 0x39, 0xFA, 0xA4, 0xA4, 0xCE, 0x1B, 0xC5, 0xB1, 0x37, 0x63, 0xC5, 0xA1, 0xA6, 0x1D,
0xF9, 0xFB, 0x7F, 0x65, 0xFF, 0xEE, 0x87, 0x94, 0x2C, 0x29, 0x1C, 0xBA, 0x70, 0x21, 0x24, 0xDC,
0xAD, 0x35, 0x36, 0xF0, 0xE1, 0x3B, 0x8D, 0xCF, 0x03, 0xA7, 0x75, 0x12, 0x7A, 0x2B, 0x10, 0xB2,
0x8A, 0x0B, 0xCD, 0xFE, 0xB1, 0x0D, 0x31, 0xFE, 0xE8, 0x1C, 0x53, 0x01, 0xAA, 0x9B, 0xED, 0x7C,
0x24, 0x32, 0x62, 0xA1, 0x3C, 0xBD, 0xC2, 0x60, 0x71, 0xC0, 0xDB, 0x7D, 0x39, 0xCA, 0x0B, 0x8D,
0x79, 0xF4, 0x29, 0xA6, 0xF4, 0x3F, 0x0F, 0x0D, 0xCC, 0x79, 0x73, 0xEA, 0x0F, 0xCB, 0x7A, 0x34,
0xD3, 0x46, 0x53, 0x50, 0x53, 0x7A, 0x20, 0x51, 0x19, 0x1F, 0x68, 0x7F, 0x1D, 0xBC, 0x49, 0x79,
0xFD, 0xA2, 0xFD, 0xAE, 0xD5, 0x0C, 0x61, 0x3D, 0x53, 0x6E, 0x93, 0xAB, 0xC1, 0x88, 0x80, 0xD3,
0x09, 0x40, 0x72, 0x37, 0xB9, 0x9C, 0xCF, 0x68, 0x77, 0xA6, 0x64, 0x4C, 0x80, 0xF9, 0xBC, 0x63,
0x0D, 0xD8, 0x7E, 0x3B, 0xF6, 0xE1, 0x0E, 0x85, 0xC6, 0x79, 0x69, 0x79, 0x50, 0x40, 0x79, 0x7F,
0x58, 0x4E, 0xC1, 0xD5, 0x74, 0xFF, 0x59, 0xA7, 0x4B, 0x2B, 0x47, 0x1D, 0x0E, 0xAB, 0xCA, 0x7F,
0x83, 0xB4, 0x1D, 0xE5, 0xD5, 0x67, 0xEC, 0x1B, 0x50, 0xC3, 0x43, 0x5B, 0xEE, 0x3A, 0xEE, 0xD4,
0xAC, 0x0D, 0xA0, 0xFE, 0x6B, 0x8B, 0xC5, 0xC5, 0xDA, 0xB9, 0x54, 0xA8, 0x39, 0xDF, 0x0D, 0xFD,
0xC8, 0x09, 0x85, 0xF5, 0xB8, 0x77, 0xDB, 0x79, 0x20, 0x9A, 0x56, 0xD3, 0x80, 0x08, 0x3E, 0x5C,
0xBA, 0xE6, 0x05, 0xA3, 0x9C, 0x76, 0xD4, 0x3C, 0xE4, 0x39, 0x06, 0x40, 0x1A, 0xFA, 0xDF, 0xCD,
0x4C, 0xC4, 0xD3, 0x1B, 0xB6, 0xC8, 0x31, 0x5C, 0x5B, 0x20, 0x4E, 0xA7, 0xE6, 0x73, 0xA6, 0x6A,
0xE9, 0x46, 0x85, 0x9F, 0xA6, 0x16, 0x58, 0x13, 0x6A, 0xF3, 0x00, 0x6E, 0x26, 0xEF, 0xA1, 0x91,
0x29, 0xB7, 0x39, 0x12, 0x76, 0xE4, 0xD1, 0xF9, 0xFC, 0x40, 0x0E, 0x9E, 0xCF, 0x6A, 0xDF, 0x2B,
0x25, 0x4A, 0x6E, 0x5B, 0x32, 0x4C, 0x13, 0x51, 0xC3, 0xB1, 0xA4, 0xEA, 0x81, 0x1C, 0x35, 0xE2,
0x80, 0x58, 0x18, 0x71, 0xA6, 0x59, 0x42, 0xE1, 0x28, 0x56, 0xF8, 0x2C, 0xB7, 0x0D, 0xD3, 0x97,
0x11, 0x1B, 0x29, 0x62, 0x52, 0x1C, 0x75, 0x67, 0xFA, 0x23, 0xAB, 0xE5, 0xBC, 0x71, 0x7B, 0x83,
0x86, 0xCC, 0x0F, 0x11, 0x22, 0x86, 0xB4, 0x42, 0x98, 0x48, 0xD8, 0x12, 0xE4, 0x2D, 0xD7, 0x8C,
0x3A, 0xB2, 0xB8, 0xEC, 0x3B, 0x9A, 0x8A, 0x27, 0x62, 0x34, 0x55, 0x30, 0xA8, 0x39, 0x7B, 0x23,
0x5B, 0x5C, 0xC8, 0x14, 0x5D, 0xFE, 0xE6, 0x89, 0xF4, 0x3D, 0xB2, 0xEA, 0xEF, 0xAB, 0x97, 0xBF,
0x3E, 0x8A, 0x68, 0x6B, 0xE0, 0x3B, 0xCA, 0x8C, 0x99, 0xB8, 0x8B, 0xB0, 0x67, 0x30, 0x50, 0x39,
0x5C, 0x40, 0x98, 0x85, 0x75, 0x19, 0x23, 0x86, 0x29, 0x15, 0x14, 0xBA, 0xE1, 0x93, 0xE8, 0x23,
0x62, 0x39, 0xC9, 0x8E, 0x10, 0x7D, 0x9A, 0x1E, 0x91, 0xC9, 0x29, 0x04, 0xBA, 0x2F, 0xAF, 0x6E,
0x61, 0x83, 0x2D, 0x6E, 0xD6, 0xCE, 0x5C, 0x35, 0xCC, 0x53, 0x83, 0x8C, 0xF2, 0x9A, 0x65, 0x0E,
0xFA, 0x71, 0x28, 0xCA, 0x4D, 0x0A, 0x77, 0xC5, 0x61, 0xC7, 0xE5, 0x88, 0x8D, 0x90, 0x87, 0xA6,
0xA4, 0x6D, 0x92, 0x59, 0x97, 0xE2, 0xDD, 0x67, 0x18, 0x5D, 0xBB, 0x54, 0xBC, 0xB0, 0x99, 0x4A,
0xE5, 0xFF, 0xE7, 0xDF, 0x3B, 0x36, 0xFF, 0xDE, 0x3D, 0x41, 0xA2, 0x26, 0x92, 0x62, 0x40, 0xA4,
0x12, 0x0E, 0xE8, 0x33, 0x84, 0xE5, 0xD4, 0x3E, 0x71, 0xCF, 0x97, 0x4E, 0x2D, 0x62, 0xCF, 0x6B,
0xF8, 0x05, 0x73, 0xCA, 0xF6, 0x1A, 0xE9, 0xC8, 0x1C, 0x7F, 0x91, 0x03, 0x38, 0x37, 0x6E, 0x76,
0xD4, 0x21, 0xCB, 0x80, 0x6E, 0x40, 0xA2, 0xA5, 0xC8, 0x8C, 0x5D, 0xAC, 0x90, 0x55, 0x63, 0x1D,
0xC9, 0x21, 0xB3, 0xCC, 0x88, 0x7C, 0x37, 0x69, 0x09, 0x32, 0x4F, 0xCA, 0x3C, 0x5E, 0x77, 0x16,
0x1A, 0x06, 0x53, 0xA9, 0xC3, 0xD7, 0xC4, 0x78, 0xDE, 0x17, 0x0C, 0x16, 0x0A, 0x83, 0xF1, 0x1A,
0x06, 0x45, 0xCA, 0xB9, 0xB0, 0x3F, 0x35, 0x76, 0x82, 0x41, 0x84, 0x6E, 0x44, 0xEF, 0x40, 0xCB,
0x18, 0x6D, 0xC2, 0x60, 0x7F, 0x18, 0x06, 0xC1, 0x83, 0x28, 0x92, 0x21, 0xBA, 0xD1, 0xE2, 0xF1,
0x4B, 0xFD, 0xB4, 0x63, 0x28, 0xE4, 0xFE, 0x94, 0x81, 0xE6, 0x1F, 0x98, 0xC7, 0xB8, 0xAC, 0xE2,
0x75, 0xF6, 0x16, 0xE6, 0x09, 0xBD, 0x53, 0x66, 0x17, 0xB7, 0x7B, 0xAD, 0x6E, 0x64, 0xFB, 0xEC,
0x42, 0x45, 0x6C, 0xBF, 0x3B, 0x94, 0x3C, 0x86, 0x7C, 0x89, 0x3E, 0x61, 0xED, 0xBC, 0x1B, 0xB5,
0x3E, 0x90, 0x8B, 0x08, 0xE6, 0x17, 0x35, 0x09, 0xCD, 0x12, 0x99, 0x2F, 0xC7, 0x48, 0x54, 0x20,
0x77, 0xB0, 0xC9, 0xD8, 0x8E, 0x09, 0xDF, 0x07, 0x90, 0xFD, 0x67, 0xB5, 0x03, 0x10, 0x49, 0x32,
0xE4, 0x9B, 0x6A, 0x3C, 0x6A, 0xCD, 0x21, 0xFA, 0xE2, 0xB7, 0x2A, 0xA8, 0xAB, 0xA6, 0x44, 0x37,
0xB7, 0xD0, 0x1D, 0xD7, 0xE9, 0xC1, 0x49, 0x9B, 0xAF, 0x74, 0x59, 0x23, 0x76, 0x4A, 0xF5, 0x7B,
0x67, 0x25, 0xF7, 0xDC, 0xD4, 0xC4, 0xBE, 0x9A, 0x23, 0x4E, 0xB3, 0xF1, 0x01, 0xE9, 0x91, 0xEF,
0xE3, 0x38, 0x39, 0xCC, 0xC8, 0x35, 0x9D, 0x68, 0xA6, 0xB3, 0x66, 0x43, 0xCF, 0xB4, 0x5A, 0xBB,
0x0D, 0x80, 0xD8, 0x04, 0xEC, 0x5E, 0xA0, 0xBE, 0x85, 0x6A, 0x45, 0x52, 0x3C, 0x84, 0x94, 0xE8,
0x9A, 0x34, 0x81, 0x07, 0xFE, 0x5C, 0xE7, 0x79, 0x7A, 0xF0, 0xB6, 0x57, 0x20, 0xFB, 0xA9, 0xC8,
0x20, 0xA4, 0x46, 0xCB, 0x21, 0x86, 0xE3, 0x95, 0x6F, 0xBF, 0x34, 0xD3, 0x00, 0x15, 0x9C, 0xE2,
0xBB, 0x12, 0xAF, 0x66, 0xE9, 0x18, 0x89, 0xE6, 0x01, 0x9C, 0x90, 0xD3, 0xAF, 0x60, 0x8B, 0xA8,
0x88, 0xCE, 0x2D, 0x71, 0xC5, 0xFC, 0xC0, 0x4F, 0x74, 0xC6, 0x65, 0xCD, 0x34, 0x4D, 0x78, 0x9C,
0x66, 0xF4, 0x97, 0x66, 0x5A, 0xCC, 0xE2, 0xF4, 0xCB, 0xD0, 0x40, 0x3A, 0x45, 0x09, 0x92, 0x82,
0x98, 0xA8, 0x10, 0x9C, 0xFD, 0x38, 0x54, 0xF8, 0x8F, 0x1C, 0xC0, 0x95, 0x63, 0xF0, 0x0D, 0xB5,
0x11, 0x9C, 0x9B, 0x50, 0xF7, 0x8A, 0x0B, 0x0F, 0xCC, 0x4D, 0x36, 0xCE, 0x0D, 0xB3, 0x88, 0xDF,
0x61, 0x6E, 0xC2, 0x83, 0x73, 0xE3, 0xDD, 0x7D, 0x6E, 0x30, 0x8C, 0x7F, 0x7F, 0x68, 0x6E, 0x08,
0x40, 0xB0, 0x42, 0xD0, 0x17, 0x40, 0x4A, 0xAF, 0x1D, 0x0B, 0x54, 0x50, 0x32, 0x5C, 0x4A, 0x8D,
0xBA, 0xE9, 0x9D, 0xEC, 0x90, 0x4D, 0x3B, 0x41, 0x2F, 0x91, 0x6F, 0xAF, 0x15, 0x72, 0x00, 0x7E,
0x6B, 0xF0, 0xC8, 0xC5, 0x3C, 0x66, 0xCF, 0xDF, 0xDD, 0xB4, 0x76, 0xF4, 0x70, 0xC6, 0xCB, 0x08,
0xF8, 0x20, 0xF8, 0x5C, 0xD5, 0x87, 0x69, 0xD1, 0xE6, 0x0E, 0x86, 0x07, 0xB6, 0x34, 0xDC, 0x1F,
0xB7, 0x34, 0x2C, 0xD5, 0x9B, 0x2E, 0xFC, 0x99, 0xBD, 0x5E, 0xD2, 0x09, 0xC9, 0x2B, 0x87, 0x73,
0x9F, 0x9C, 0xC2, 0x82, 0x99, 0x32, 0x9C, 0xAD, 0xFB, 0xE3, 0xCF, 0x2E, 0x53, 0x46, 0xA7, 0x06,
0x3C, 0x75, 0x93, 0x3E, 0x90, 0xB3, 0xE3, 0x70, 0xC5, 0x3A, 0x70, 0xEA, 0x3D, 0x6B, 0x6F, 0xDF,
0xF3, 0x56, 0x5C, 0x7B, 0x19, 0x20, 0xD8, 0xDE, 0xF1, 0xD2, 0x91, 0xC4, 0x3B, 0x3D, 0x9E, 0xEA,
0x9A, 0x9C, 0xA6, 0xE9, 0x4E, 0x7C, 0x3E, 0x59, 0x1F, 0x35, 0xEB, 0xAB, 0x5D, 0xFF, 0x9E, 0x7F,
0x40, 0x66, 0x45, 0x76, 0x92, 0x5D, 0xFC, 0xA0, 0x5E, 0xF0, 0x32, 0xB7, 0x36, 0xC1, 0x65, 0x65,
0x85, 0xCB, 0xFC, 0x9E, 0x3F, 0x04, 0x9F, 0x5D, 0xA6, 0x4B, 0x7B, 0xA7, 0x09, 0x52, 0x2F, 0xAB,
0x1B, 0xED, 0x74, 0xC6, 0xD3, 0xCB, 0x52, 0xDE, 0x23, 0xCC, 0x56, 0xC7, 0x7D, 0x48, 0x98, 0xF8,
0x24, 0xC3, 0x0F, 0x84, 0xF8, 0x57, 0x8E, 0x0D, 0x48, 0x35, 0x31, 0x05, 0xFD, 0x87, 0x6B, 0x20,
0xA2, 0xE3, 0xB5, 0x96, 0x77, 0xD8, 0xDF, 0xF0, 0x68, 0x35, 0xB6, 0x3D, 0x81, 0x3A, 0x72, 0xC9,
0x6D, 0x0F, 0x97, 0xA8, 0xCE, 0x2B, 0x5C, 0x9D, 0x67, 0x4C, 0x69, 0x71, 0x78, 0xDB, 0x43, 0x56,
0xCF, 0xBA, 0xF1, 0x6A, 0x6E, 0x7E, 0xC0, 0x16, 0xF6, 0xFF, 0x6C, 0xE9, 0x4D, 0x34, 0x50, 0x7B,
0x3C, 0x28, 0xE0, 0x1D, 0x3C, 0x78, 0x70, 0x30, 0x63, 0x7E, 0x32, 0x9F, 0xEA, 0xD2, 0xB3, 0x9F,
0x66, 0x1A, 0x94, 0xA1, 0x20, 0x7E, 0x25, 0x8E, 0x0D, 0x37, 0x3E, 0x70, 0x8E, 0xDE, 0xAA, 0x98,
0x4D, 0x8E, 0xDA, 0xE2, 0x33, 0x63, 0x88, 0x05, 0xA6, 0x82, 0x11, 0x09, 0x11, 0xD3, 0xEB, 0xE6,
0x2E, 0xC2, 0x22, 0x60, 0xAE, 0x60, 0xEE, 0xEC, 0xA0, 0x58, 0xD6, 0x05, 0x58, 0xC4, 0xEF, 0x50,
0x45, 0x46, 0x99, 0x45, 0x8D, 0x6C, 0x8C, 0xAC, 0x50, 0xFC, 0xC9, 0xC4, 0x79, 0x22, 0x1D, 0x4E,
0xE1, 0x15, 0x94, 0x08, 0xBC, 0x4E, 0xF3, 0x79, 0x87, 0xB5, 0x8B, 0xAE, 0x80, 0xE5, 0x74, 0x49,
0xCD, 0x29, 0x37, 0x94, 0x49, 0x0B, 0x0D, 0xAE, 0x60, 0xD2, 0xD3, 0xFD, 0xDA, 0x8C, 0xD9, 0x39,
0xD2, 0xB5, 0xA1, 0x36, 0x58, 0x3B, 0x8A, 0xFF, 0xEB, 0x61, 0x0A, 0xE4, 0xD0, 0x78, 0xB1, 0x31,
0x81, 0xE8, 0xA7, 0x1A, 0x5A, 0x51, 0x1F, 0x0A, 0xAD, 0x18, 0x5E, 0xBE, 0x7B, 0x68, 0xC5, 0x29,
0x8C, 0x04, 0xE7, 0x55, 0xB3, 0xB4, 0x9D, 0x62, 0x0E, 0x50, 0x93, 0x3C, 0xC7, 0x30, 0x70, 0x0D,
0x62, 0xA1, 0x1A, 0x54, 0x47, 0x98, 0x0F, 0xD6, 0x10, 0x16, 0x5F, 0x47, 0x88, 0x03, 0x9C, 0x7F,
0xB3, 0x72, 0x21, 0x2A, 0xCF, 0x5E, 0xB4, 0x8B, 0xF3, 0x21, 0xF1, 0x7D, 0xC9, 0x44, 0x34, 0x73,
0x7B, 0xEB, 0xAC, 0x1B, 0x7B, 0x1D, 0xDE, 0x81, 0x39, 0xA7, 0x35, 0xB3, 0x93, 0xA6, 0x65, 0xD1,
0x0D, 0xE6, 0xB1, 0x17, 0x86, 0xE3, 0x50, 0x22, 0x26, 0x4C, 0x29, 0xB9, 0xE3, 0x9B, 0x06, 0xAE,
0xAC, 0x46, 0x3B, 0xFE, 0x0C, 0x6D, 0xA2, 0xDF, 0x24, 0xD5, 0xD7, 0x74, 0x98, 0x1C, 0x5C, 0xF2,
0xF1, 0xF8, 0xDD, 0x5A, 0xC7, 0xEA, 0x8B, 0x17, 0xEC, 0xF5, 0xF3, 0x4C, 0x25, 0x15, 0xB9, 0x14,
0xC2, 0x95, 0xD3, 0x2C, 0x24, 0xB0, 0x70, 0xE4, 0x9A, 0xE7, 0x84, 0xA1, 0xF2, 0x29, 0x32, 0xD3,
0xC6, 0x4B, 0xE4, 0x94, 0x86, 0x30, 0x15, 0x74, 0xFF, 0x07, 0xDD, 0x5B, 0xBF, 0x93, 0xDD, 0xD6,
0x75, 0xBE, 0x00, 0xC8, 0x45, 0x44, 0xCC, 0x04, 0xF4, 0x0C, 0x39, 0x16, 0xC5, 0x38, 0x70, 0xA9,
0x28, 0x71, 0xF0, 0x0F, 0x90, 0x04, 0x64, 0xCD, 0x58, 0x33, 0x69, 0x42, 0xCF, 0x70, 0x9D, 0x42,
0x85, 0x5C, 0xA8, 0xB1, 0x5D, 0x6C, 0x8A, 0x14, 0x29, 0x24, 0x02, 0x91, 0x66, 0xA2, 0x22, 0x85,
0xB7, 0x88, 0xD3, 0xA4, 0xA1, 0x13, 0x65, 0x46, 0x59, 0x15, 0x4C, 0xA1, 0xC2, 0x33, 0x21, 0x09,
0x98, 0x2A, 0x59, 0xF0, 0x25, 0x8E, 0xA3, 0xC2, 0x85, 0xA0, 0x48, 0x8C, 0x23, 0xAB, 0x10, 0x42,
0x41, 0x23, 0x2C, 0x09, 0xE0, 0xE6, 0x7C, 0xDF, 0xB9, 0x78, 0xEF, 0x2D, 0x65, 0x49, 0x94, 0x26,
0xA4, 0x76, 0xF7, 0x91, 0x0F, 0x04, 0xF1, 0xE3, 0xFE, 0xF8, 0xCE, 0xAF, 0xEF, 0x9C, 0x7B, 0x9F,
0x31, 0x51, 0x63, 0xE4, 0x13, 0xB7, 0x38, 0x26, 0x1D, 0x8E, 0xD9, 0x80, 0xE3, 0x39, 0x1E, 0xAF,
0x5E, 0xC4, 0x71, 0xC8, 0xE4, 0xE0, 0x0D, 0x59, 0x6E, 0x4C, 0xD0, 0x25, 0xB5, 0x1C, 0xDB, 0x58,
0x8E, 0x51, 0x83, 0x97, 0xE3, 0x45, 0x28, 0x2F, 0x27, 0x75, 0x20, 0x2F, 0xA7, 0xA5, 0xDF, 0x4B,
0x03, 0xF2, 0xAC, 0x31, 0xD5, 0xE6, 0xE6, 0x68, 0x8C, 0x95, 0x8F, 0xF1, 0x78, 0xF4, 0xA7, 0x9D,
0x9D, 0xAA, 0xC4, 0x63, 0x49, 0x8D, 0x57, 0xE2, 0x45, 0x2C, 0xAF, 0x47, 0x2D, 0x1A, 0x0C, 0xDB,
0x14, 0xCD, 0xF6, 0xE8, 0xC2, 0x1F, 0x0A, 0x74, 0x3A, 0x4E, 0x38, 0xF2, 0xB0, 0xFA, 0x78, 0x25,
0x8E, 0x51, 0xBB, 0x1A, 0xB3, 0x9E, 0xEB, 0xF5, 0x4D, 0x69, 0xDA, 0x8E, 0x26, 0xB3, 0xB6, 0x89,
0x6E, 0x9D, 0x1E, 0x4C, 0x69, 0xB2, 0x52, 0x9F, 0xC0, 0x80, 0x0C, 0x66, 0x91, 0xD4, 0x1B, 0x95,
0x6D, 0x13, 0x6B, 0x87, 0xF4, 0xCE, 0x85, 0x22, 0x6D, 0x4C, 0x72, 0xB3, 0x31, 0xE1, 0x87, 0x9D,
0xF1, 0x46, 0x8C, 0x59, 0xFA, 0xCF, 0x6E, 0xB6, 0xA6, 0xB8, 0x6D, 0x37, 0xA7, 0x21, 0xB3, 0x53,
0xEA, 0xDB, 0x31, 0xAA, 0xBD, 0xF3, 0x73, 0xF7, 0xDB, 0x18, 0x98, 0x7C, 0x0B, 0x19, 0x27, 0x20,
0xE0, 0x85, 0x74, 0x7B, 0x05, 0xDB, 0xD7, 0xAE, 0xF1, 0xC1, 0x73, 0xAB, 0xE3, 0x06, 0xAF, 0x2B,
0xCC, 0x91, 0x0E, 0x3F, 0x37, 0xF7, 0x7C, 0xF6, 0xBD, 0x10, 0x36, 0xDE, 0x93, 0xBE, 0xAD, 0x3C,
0x79, 0x12, 0x23, 0x4A, 0xE4, 0x81, 0x48, 0x1E, 0x4D, 0xD8, 0xB3, 0xBC, 0x22, 0xE7, 0xA6, 0x75,
0x73, 0x39, 0x7A, 0x1E, 0x5D, 0x2D, 0x02, 0x6B, 0x27, 0x73, 0xED, 0xBB, 0x55, 0xFD, 0x3B, 0xD2,
0xA2, 0x5C, 0xAE, 0x08, 0x3E, 0x46, 0x4D, 0x69, 0xFC, 0xC8, 0x5A, 0x0C, 0xE8, 0xBA, 0xFD, 0xA7,
0xA7, 0x6F, 0x4F, 0x72, 0x41, 0xFA, 0x29, 0xA4, 0xDF, 0xE4, 0xAD, 0xDA, 0x44, 0x22, 0x8D, 0x60,
0xB0, 0x26, 0xB4, 0xE9, 0x47, 0xCF, 0x7E, 0xF0, 0x86, 0xB5, 0xFF, 0xD5, 0xA6, 0x76, 0x71, 0xC5,
0x9C, 0xD4, 0xF6, 0x37, 0x88, 0x36, 0xA6, 0x2E, 0x53, 0x95, 0x81, 0x24, 0xED, 0x0B, 0xC4, 0xEB,
0xFB, 0x18, 0x2E, 0xD0, 0xF7, 0xBB, 0x04, 0x52, 0xAF, 0x83, 0xC5, 0x41, 0x43, 0x59, 0x3E, 0x17,
0x30, 0x01, 0x8C, 0x47, 0x70, 0xF2, 0x47, 0xE9, 0x3A, 0xB4, 0x7F, 0x62, 0x08, 0x8B, 0xC9, 0x00,
0x5D, 0x6F, 0xAE, 0x18, 0x93, 0x9B, 0x13, 0xF3, 0x9C, 0x36, 0xA1, 0x8C, 0x56, 0x00, 0x03, 0xDC,
0xFE, 0xEE, 0x77, 0xAC, 0x71, 0x5A, 0x6F, 0xD0, 0x0B, 0x11, 0x57, 0xAC, 0xE4, 0xEC, 0x31, 0x6B,
0x6B, 0x8C, 0xAF, 0x8E, 0xA6, 0x9F, 0x24, 0x35, 0x74, 0xBF, 0x96, 0x27, 0xE5, 0x20, 0xB8, 0xD7,
0x05, 0xDE, 0x80, 0xFA, 0xD7, 0x99, 0x3C, 0x54, 0x03, 0xFA, 0x3A, 0xB6, 0xF6, 0x6F, 0x6A, 0x5A,
0x80, 0x39, 0x2A, 0xA3, 0x3D, 0x46, 0xE4, 0x43, 0x35, 0xB8, 0x9E, 0xDD, 0x3F, 0x9F, 0xE0, 0x7F,
0xA7, 0x14, 0xC7, 0x75, 0xF4, 0xCB, 0x03, 0x87, 0x3E, 0xD4, 0x0B, 0xEF, 0x28, 0x5C, 0xE7, 0x22,
0x69, 0xFF, 0xA7, 0x56, 0x26, 0x91, 0x15, 0xB8, 0x34, 0x98, 0xA0, 0xF1, 0x5B, 0x73, 0xDC, 0x78,
0x6E, 0x3A, 0x27, 0x73, 0xAA, 0x39, 0xFA, 0x2D, 0xE9, 0x6C, 0xBE, 0x69, 0xD0, 0x0B, 0xF5, 0x9C,
0x10, 0x65, 0x7A, 0x22, 0x8A, 0x2E, 0x02, 0xB2, 0x2D, 0xDC, 0x8D, 0xB4, 0x19, 0xB6, 0xD0, 0x74,
0x31, 0x9A, 0xF0, 0x7F, 0x31, 0x74, 0x39, 0x89, 0x5B, 0xA8, 0x7A, 0x34, 0xFE, 0xD9, 0xDD, 0x16,
0x0E, 0xC7, 0x54, 0xF6, 0xDB, 0xAD, 0xD3, 0x75, 0x6F, 0x97, 0xC7, 0x8A, 0xFE, 0x22, 0x5C, 0xF3,
0x1D, 0x00, 0x2B, 0x69, 0xFF, 0x02, 0xB2, 0xEF, 0xBF, 0x39, 0x23, 0x1F, 0xB4, 0x30, 0x87, 0xB8,
0x0C, 0x0F, 0xA0, 0xDE, 0x3F, 0x86, 0x69, 0x55, 0xF5, 0x3C, 0xC1, 0x6F, 0x61, 0xBE, 0xE2, 0x97,
0xFB, 0x3F, 0x92, 0x19, 0x76, 0x7F, 0x6E, 0x82, 0x8F, 0x3B, 0xD5, 0x7F, 0x0A, 0xE1, 0x28, 0x2C,
0x60, 0xA9, 0xFE, 0x94, 0x02, 0x5C, 0x3E, 0xBD, 0xCD, 0xAC, 0xFD, 0x95, 0x71, 0x4E, 0x1F, 0x46,
0x03, 0xE5, 0x87, 0x1C, 0xE0, 0xF6, 0x7D, 0xF1, 0x38, 0x2D, 0x75, 0x1F, 0x82, 0x90, 0xA1, 0x7A,
0x83, 0xDC, 0x8D, 0x5A, 0xAA, 0x3E, 0x24, 0xE1, 0xC3, 0xF5, 0x07, 0xF0, 0x3A, 0xAA, 0xF9, 0x2A,
0x8A, 0xE3, 0xF2, 0x47, 0xBA, 0xCA, 0xA5, 0xB5, 0xC0, 0xDE, 0x15, 0x84, 0xA3, 0x17, 0xAD, 0x0C,
0xF7, 0x98, 0x79, 0x62, 0x85, 0xB3, 0x22, 0xAC, 0xD8, 0x4E, 0x7B, 0x3C, 0x51, 0x73, 0x00, 0x3D,
0x91, 0x89, 0xBA, 0x28, 0x8F, 0xEC, 0x9B, 0x75, 0xF0, 0x9F, 0xB6, 0xF1, 0x16, 0x91, 0x9B, 0x43,
0x22, 0x73, 0x4F, 0xA4, 0xA7, 0x58, 0x5C, 0x12, 0xCC, 0x22, 0x2E, 0x25, 0x3E, 0x02, 0x9F, 0xD9,
0x2A, 0x42, 0x6B, 0x73, 0x71, 0x1C, 0x3D, 0x9D, 0x91, 0x1A, 0x05, 0x1D, 0x5A, 0xE1, 0x4C, 0x2B,
0x6C, 0xBD, 0xCB, 0x76, 0x90, 0xA7, 0x2C, 0xDC, 0xD0, 0x0D, 0x31, 0x89, 0x0F, 0x7B, 0x19, 0xBB,
0x0C, 0xBB, 0x80, 0x0F, 0xBA, 0x29, 0x16, 0xF1, 0xE1, 0x20, 0x5D, 0x54, 0xBF, 0x2C, 0x2A, 0x3A,
0x20, 0x1A, 0x04, 0xFC, 0xA2, 0x39, 0x76, 0x89, 0x4E, 0x9F, 0x80, 0x15, 0x23, 0xC7, 0x5B, 0x98,
0x19, 0x9E, 0xB8, 0x86, 0xA8, 0x45, 0x37, 0xCE, 0x1F, 0x44, 0xB0, 0xEF, 0x93, 0xE1, 0xFC, 0xB3,
0x7C, 0xA1, 0x77, 0x15, 0xC9, 0x4A, 0x69, 0x0A, 0x19, 0xCD, 0x45, 0x93, 0x94, 0x47, 0x96, 0xD3,
0x7E, 0xF0, 0x1C, 0xA8, 0x74, 0x4D, 0xCD, 0x11, 0x5D, 0x47, 0x96, 0xF1, 0xA6, 0xB2, 0x1F, 0xC6,
0x06, 0x2A, 0x7D, 0xF8, 0xE4, 0x93, 0xA2, 0x2F, 0x21, 0x63, 0x71, 0xB0, 0xBB, 0x55, 0xD3, 0x5C,
0x29, 0xC4, 0xFE, 0xC0, 0x71, 0x20, 0xB3, 0x71, 0x49, 0xDD, 0x89, 0x2F, 0x6F, 0x7A, 0xF2, 0xBD,
0xF4, 0xFD, 0xC7, 0xCD, 0x59, 0x93, 0x98, 0xE8, 0x3F, 0xB6, 0x72, 0x69, 0x5F, 0xBC, 0x88, 0x15,
0x28, 0x8E, 0xCC, 0x38, 0x5D, 0xD0, 0xC8, 0x8C, 0x00, 0x91, 0xFE, 0xED, 0x56, 0xEB, 0xAB, 0xA8,
0xD3, 0xDA, 0xC5, 0x07, 0xB5, 0x09, 0xC4, 0x64, 0x84, 0x87, 0xEA, 0xBD, 0xEF, 0x0E, 0x95, 0xC8,
0x13, 0x01, 0x59, 0x4C, 0x20, 0xFC, 0x58, 0xC2, 0x3F, 0x6C, 0xC2, 0x22, 0x1A, 0xDF, 0x40, 0x70,
0x10, 0x93, 0xBA, 0x12, 0xD9, 0x2E, 0x65, 0x28, 0x9E, 0xE3, 0xEF, 0x55, 0xB3, 0xC2, 0x9E, 0xE4,
0xF2, 0x30, 0x01, 0xFE, 0x84, 0x46, 0x01, 0x9D, 0x25, 0xF8, 0x26, 0x00, 0x3F, 0xF3, 0x15, 0x01,
0xEE, 0x3E, 0x09, 0x41, 0x3B, 0x4A, 0xB8, 0xCC, 0x5F, 0xB2, 0x5B, 0x9E, 0x33, 0xE8, 0x86, 0xDF,
0xF6, 0x0E, 0x0D, 0xF8, 0x68, 0xD1, 0xBC, 0x86, 0x88, 0xFC, 0x3A, 0x78, 0x9E, 0xE6, 0x3D, 0x8F,
0x3F, 0x7E, 0x4C, 0x02, 0x74, 0x50, 0x7B, 0x1F, 0x7D, 0xBD, 0x11, 0x17, 0x23, 0x90, 0x21, 0x27,
0xF0, 0xD6, 0xC8, 0xE8, 0x83, 0xF5, 0x3D, 0xD2, 0xD0, 0x64, 0x18, 0x82, 0x7F, 0xDD, 0xFC, 0xB6,
0x10, 0x1C, 0xE6, 0x14, 0x40, 0x89, 0x84, 0x24, 0xF8, 0x68, 0x4D, 0x00, 0xC5, 0x01, 0x74, 0x37,
0x18, 0xE4, 0xBB, 0x61, 0x1E, 0xBA, 0x10, 0x6C, 0x1A, 0x17, 0x82, 0x8F, 0x19, 0x5F, 0x26, 0xE8,
0xB5, 0xE6, 0xEA, 0x77, 0x3A, 0x13, 0x5B, 0x74, 0x89, 0xD9, 0xE5, 0xE6, 0x21, 0x84, 0x60, 0x61,
0x67, 0x18, 0x7B, 0xE9, 0x37, 0xD4, 0x70, 0x01, 0xDB, 0xB7, 0xB0, 0x41, 0x17, 0x8E, 0xBD, 0xDC,
0x1C, 0xDE, 0xE0, 0xDB, 0x98, 0x6F, 0x88, 0xBB, 0x8F, 0xF3, 0xE8, 0x96, 0x28, 0xD6, 0x57, 0xE0,
0x7D, 0x1E, 0xC1, 0xA0, 0x80, 0xFB, 0xE0, 0x06, 0xFE, 0x08, 0x7A, 0xB4, 0xA3, 0x7C, 0x27, 0x7E,
0x9D, 0x84, 0x3F, 0xF5, 0xBB, 0xB9, 0x79, 0x41, 0x9E, 0x1B, 0xF8, 0xC5, 0xF9, 0xE7, 0x3D, 0xCF,
0xD4, 0xD2, 0xB5, 0x8D, 0xF4, 0x72, 0x1D, 0x25, 0xE0, 0x32, 0x7F, 0xC9, 0x08, 0x64, 0xFA, 0xA1,
0xD8, 0xBE, 0xA8, 0x43, 0x67, 0xAA, 0x7F, 0x2B, 0x16, 0xC2, 0x13, 0x2B, 0x49, 0xFC, 0x83, 0x1E,
0x1A, 0x75, 0xA3, 0x15, 0x99, 0x09, 0x37, 0x48, 0x6E, 0x0A, 0x3C, 0x03, 0xC4, 0x75, 0xF3, 0xCE,
0xCE, 0xCE, 0xAB, 0x93, 0x9B, 0x91, 0x26, 0x4D, 0xD0, 0x8E, 0x8C, 0x26, 0x6B, 0xCC, 0x89, 0xD0,
0xFE, 0x5D, 0x95, 0x27, 0x68, 0x2C, 0xB5, 0xBB, 0x2C, 0x2A, 0xB8, 0xEC, 0x7F, 0xE6, 0xF5, 0x00,
0x96, 0x27, 0xB8, 0x72, 0x5A, 0x22, 0x73, 0x2A, 0xF0, 0x1D, 0xC1, 0x98, 0x13, 0xDC, 0xA5, 0xA7,
0x60, 0x3E, 0x47, 0x5F, 0x50, 0x2F, 0x07, 0xFF, 0x50, 0x11, 0xDB, 0xF8, 0x1F, 0x4C, 0x0E, 0x74,
0x81, 0x89, 0xF8, 0xF3, 0x2E, 0x8E, 0x85, 0xBD, 0x2B, 0x23, 0xC5, 0x66, 0xAD, 0x70, 0xF2, 0x10,
0x20, 0x7C, 0xCE, 0x3C, 0x1A, 0xD8, 0xF2, 0x4C, 0x64, 0x77, 0x87, 0xF8, 0x69, 0xDB, 0xFD, 0xBE,
0x29, 0x16, 0x47, 0xD6, 0xD4, 0xFF, 0xA1, 0x62, 0xF3, 0x9C, 0xE8, 0x6F, 0xDA, 0xFB, 0x8B, 0xD0,
0xEE, 0x5E, 0x31, 0x7D, 0x6A, 0xCB, 0xD8, 0x48, 0x38, 0x58, 0x39, 0x10, 0xF1, 0x63, 0xF2, 0xC2,
0x42, 0x06, 0x6F, 0xF3, 0x68, 0xFC, 0xFA, 0xE8, 0x8D, 0xC8, 0xD2, 0x24, 0xA4, 0xBC, 0x0C, 0x5B,
0x91, 0xE9, 0x26, 0x37, 0x1A, 0x81, 0x84, 0x48, 0x10, 0x92, 0x9D, 0x9D, 0x9D, 0x1F, 0x37, 0xCE,
0x34, 0x68, 0xB6, 0x28, 0xD2, 0xD1, 0x58, 0x12, 0xC1, 0x2E, 0x2F, 0x76, 0x7F, 0xD4, 0xC1, 0x53,
0xE4, 0x82, 0xEF, 0xB6, 0x16, 0x4E, 0x94, 0xD2, 0x51, 0x12, 0x89, 0x10, 0x8A, 0xA7, 0x24, 0x8F,
0x1C, 0x9E, 0x33, 0xD1, 0xAF, 0xA5, 0x83, 0x4E, 0x3C, 0xD0, 0xF3, 0xE6, 0x8F, 0xF7, 0x62, 0x03,
0x8F, 0xD9, 0x60, 0xF0, 0xB4, 0xE8, 0x62, 0xCE, 0xF4, 0x3F, 0xE5, 0xE4, 0xA3, 0xCD, 0xCD, 0x1C,
0xE8, 0xE0, 0xAD, 0x1A, 0x10, 0xDD, 0xD7, 0x5B, 0xAD, 0xC3, 0x69, 0xD9, 0xD7, 0xAC, 0x1A, 0xAC,
0xB4, 0x81, 0x0A, 0x59, 0xE1, 0x1A, 0xF1, 0xF4, 0x07, 0x32, 0x51, 0xB9, 0x17, 0x2D, 0xE4, 0xCA,
0x15, 0xF3, 0x02, 0xFC, 0xFF, 0xF1, 0x35, 0xE4, 0x12, 0x11, 0x3B, 0x15, 0x29, 0xED, 0x9E, 0xED,
0x08, 0x9D, 0x68, 0x49, 0xDC, 0x40, 0x93, 0xAE, 0x0B, 0x24, 0x45, 0x04, 0xEC, 0x24, 0x50, 0xDB,
0x16, 0x00, 0xBE, 0x21, 0xBE, 0x73, 0x87, 0x6A, 0xB4, 0x4A, 0x9E, 0x81, 0x0A, 0xD1, 0x0B, 0xE5,
0x70, 0x9E, 0xCA, 0x24, 0x63, 0xA2, 0x7A, 0x6E, 0xB3, 0x8F, 0x1F, 0xEE, 0x2D, 0x98, 0xC4, 0x72,
0xFA, 0x0F, 0x28, 0x98, 0x5C, 0x93, 0x4E, 0x92, 0x72, 0x10, 0x4A, 0xE4, 0xB7, 0xAB, 0xC8, 0x2C,
0xBD, 0x2C, 0x56, 0xF3, 0xBA, 0x1F, 0x10, 0x80, 0x98, 0x55, 0x7F, 0x39, 0x28, 0x98, 0xF7, 0xF3,
0x96, 0xEB, 0xAB, 0x59, 0xF6, 0x75, 0x61, 0xF6, 0x18, 0xA4, 0xCC, 0x5E, 0x2B, 0xF6, 0xE1, 0xFD,
0x23, 0x88, 0x43, 0x7A, 0xB9, 0x14, 0x96, 0x93, 0x8A, 0x07, 0xCE, 0x13, 0x80, 0x77, 0x64, 0x55,
0xC0, 0xA4, 0x1D, 0x9A, 0x4A, 0x0E, 0xD0, 0x3C, 0x51, 0x24, 0x7F, 0xA0, 0x21, 0xB2, 0x52, 0x00,
0xD5, 0xBB, 0xDE, 0xA3, 0x8A, 0x03, 0xB5, 0x53, 0x0C, 0x05, 0xBE, 0x97, 0xFA, 0xD9, 0x14, 0x59,
0x79, 0x83, 0xF2, 0x19, 0x70, 0x0F, 0xDA, 0xA2, 0x67, 0x6F, 0x5D, 0x5E, 0x50, 0xFB, 0xA4, 0xD5,
0x77, 0x67, 0x7F, 0x86, 0xF2, 0xCE, 0x1F, 0xE2, 0x8D, 0x33, 0xCE, 0x6D, 0x65, 0x26, 0x18, 0x7F,
0x57, 0xD8, 0xCD, 0xF5, 0xDC, 0xDF, 0x1D, 0xA8, 0x84, 0x12, 0xE6, 0x7F, 0xB6, 0x47, 0x07, 0xC5,
0xA0, 0xED, 0xCB, 0xF2, 0x7D, 0x7B, 0x0E, 0xE8, 0x89, 0x8B, 0x30, 0xDE, 0x27, 0x2E, 0x8C, 0x9B,
0x9B, 0xE7, 0x01, 0x1E, 0x5E, 0x01, 0x80, 0x4F, 0x7E, 0xFE, 0x2B, 0x83, 0xD3, 0xBE, 0xB9, 0x17,
0x0C, 0xEE, 0x07, 0x4E, 0x07, 0x8C, 0xBF, 0x70, 0xA5, 0x19, 0x79, 0xBC, 0x78, 0x11, 0x4A, 0xF8,
0x7B, 0x5A, 0x99, 0x41, 0x99, 0x24, 0x95, 0x3F, 0xDE, 0x52, 0x07, 0x1F, 0x4A, 0x38, 0x38, 0x8E,
0x7A, 0x4C, 0x60, 0xEF, 0x36, 0xA1, 0x10, 0xC1, 0x68, 0xA6, 0x81, 0xD0, 0x43, 0x70, 0x0C, 0x51,
0x43, 0xD4, 0x5F, 0xC2, 0xDA, 0x6F, 0xBE, 0x12, 0xFF, 0x46, 0xAD, 0xEF, 0x82, 0xD2, 0xB3, 0xBB,
0x9D, 0x39, 0x97, 0x5A, 0x09, 0x42, 0x49, 0xA9, 0xE3, 0x60, 0x41, 0x1C, 0xD8, 0x66, 0x55, 0x4E,
0x0B, 0xF6, 0x5B, 0x91, 0xF3, 0x89, 0xF5, 0xDA, 0xE2, 0x83, 0x76, 0x7D, 0x1B, 0xAF, 0x08, 0x52,
0xF2, 0x40, 0x66, 0x59, 0x48, 0xF0, 0xFB, 0xB8, 0x11, 0x7B, 0xED, 0x56, 0x95, 0x9C, 0x7D, 0xC4,
0x2D, 0xFC, 0x57, 0x5C, 0xD5, 0x43, 0x40, 0x34, 0xE1, 0xED, 0x41, 0xA6, 0x2E, 0xB7, 0x50, 0xF6,
0x90, 0xE1, 0x9E, 0x78, 0x88, 0x0A, 0xF7, 0x69, 0xFC, 0x23, 0x98, 0x84, 0x87, 0xD3, 0x37, 0xF7,
0xF0, 0x7A, 0x16, 0xAE, 0xFA, 0x2C, 0xA2, 0x2D, 0x7D, 0x51, 0x6A, 0x87, 0xD3, 0x76, 0x5B, 0xCC,
0x0B, 0x66, 0x83, 0x77, 0xBE, 0xE0, 0xE9, 0xD6, 0xBB, 0x89, 0x1D, 0x24, 0x69, 0xBA, 0x58, 0xDA,
0xEE, 0xE4, 0x20, 0xCE, 0x7E, 0x88, 0xBA, 0x64, 0x3B, 0x51, 0xF2, 0x60, 0xB2, 0xFC, 0xFE, 0xFE,
0x14, 0xF6, 0xB6, 0xB5, 0x3F, 0xAF, 0x76, 0xBF, 0xD4, 0x10, 0x78, 0xBA, 0x31, 0x3D, 0x69, 0xED,
0x0D, 0xCD, 0xA7, 0x28, 0x18, 0xB9, 0x5A, 0xE1, 0x01, 0x39, 0x3D, 0x16, 0xBF, 0x33, 0x4C, 0x8F,
0x70, 0x3C, 0x7F, 0xFA, 0x8B, 0x6E, 0xFC, 0x6D, 0x07, 0xB9, 0xB7, 0x3D, 0x65, 0x37, 0x9B, 0xED,
0x59, 0xD4, 0x5B, 0x70, 0x84, 0x50, 0xCB, 0x05, 0xA4, 0x86, 0xE5, 0x0B, 0xE1, 0xD3, 0x45, 0x0B,
0xF8, 0xFD, 0x89, 0xAE, 0x33, 0xAB, 0xA9, 0xC7, 0x3D, 0xA4, 0x62, 0x2A, 0x4A, 0x2A, 0x79, 0x13,
0x62, 0x0A, 0xEE, 0x30, 0x7D, 0xB0, 0x15, 0x93, 0xEB, 0x0F, 0x58, 0x37, 0xBE, 0x0B, 0xBD, 0xF7,
0x27, 0xDE, 0xA8, 0xD6, 0x6E, 0xC4, 0x1F, 0xB7, 0x34, 0x39, 0xAD, 0x17, 0x6A, 0x53, 0x11, 0x65,
0x5D, 0xA2, 0x8F, 0x74, 0x81, 0x25, 0x8C, 0xB4, 0xF1, 0xC5, 0x35, 0x17, 0xAD, 0x48, 0x7B, 0x47,
0xD2, 0x5A, 0x4F, 0x5D, 0x5F, 0xA8, 0xB9, 0x0D, 0xA3, 0xAF, 0x59, 0x63, 0xE1, 0x2E, 0x16, 0x2B,
0x8F, 0x53, 0xFE, 0xE0, 0x6E, 0x78, 0x5A, 0x90, 0x2E, 0x61, 0xBA, 0xA2, 0x08, 0x3F, 0xA9, 0x16,
0x49, 0xC3, 0xBA, 0x32, 0x6D, 0xD7, 0x54, 0xD0, 0x1A, 0x64, 0x1E, 0xC1, 0xC7, 0xF2, 0x6A, 0xFC,
0xC1, 0x42, 0x5D, 0x00, 0x23, 0x79, 0x70, 0x07, 0x97, 0xDE, 0x94, 0xA7, 0x32, 0x69, 0xDD, 0x1F,
0xE4, 0xD1, 0xB8, 0x11, 0xA3, 0xB7, 0xA6, 0xB8, 0xB5, 0xD5, 0xC2, 0x5A, 0x72, 0x69, 0x15, 0xE9,
0xF6, 0x32, 0x1B, 0x7E, 0x74, 0x56, 0xC6, 0xA8, 0x9D, 0xD7, 0x7A, 0x1E, 0xE5, 0xE8, 0xB4, 0x00,
0x67, 0x17, 0x6B, 0x2B, 0x35, 0xA9, 0x8E, 0x9B, 0x1E, 0xA8, 0x58, 0x2E, 0x9E, 0xA1, 0x5A, 0xB1,
0x5C, 0xD8, 0x74, 0x9F, 0xD3, 0x50, 0x78, 0xF4, 0xD7, 0x21, 0x04, 0x62, 0x32, 0x55, 0x83, 0x92,
0x2F, 0xDE, 0xAA, 0x4A, 0x00, 0x18, 0xB7, 0xA8, 0x02, 0x9B, 0x89, 0x29, 0x52, 0xFA, 0x46, 0x4F,
0xB6, 0x43, 0x14, 0x26, 0x02, 0x9F, 0x7D, 0xB6, 0x44, 0xF4, 0x46, 0x30, 0x6A, 0xA1, 0x1C, 0x39,
0x99, 0x68, 0x0D, 0x9B, 0xBA, 0x4E, 0x52, 0xDC, 0xA0, 0x8F, 0xA8, 0x43, 0xCC, 0x89, 0x7A, 0x53,
0x2D, 0xD0, 0x79, 0x64, 0x7F, 0x83, 0x9A, 0xA7, 0x8C, 0xAA, 0x27, 0xC2, 0xCD, 0xBC, 0xF8, 0x65,
0xFC, 0xF7, 0x30, 0x77, 0x88, 0xF2, 0x6B, 0x57, 0xE7, 0xE2, 0x23, 0xAA, 0x31, 0x5E, 0x35, 0x5B,
0xF7, 0x59, 0xE3, 0xAA, 0x18, 0xEA, 0x5C, 0xCF, 0xE3, 0xF1, 0x1E, 0x3A, 0x37, 0x9A, 0x74, 0xF7,
0x99, 0x51, 0x12, 0x85, 0x60, 0x90, 0xA9, 0xD0, 0x55, 0x44, 0xB7, 0x59, 0xDB, 0x86, 0x6F, 0x2E,
0x04, 0xAB, 0x49, 0x06, 0x14, 0xDC, 0xED, 0x20, 0x2B, 0x5C, 0x12, 0xC6, 0xC0, 0x92, 0x73, 0xD0,
0x8E, 0x8E, 0x48, 0x4D, 0xE2, 0x63, 0xE2, 0x36, 0x9C, 0xBE, 0x87, 0xA5, 0x03, 0x72, 0x2E, 0x38,
0x15, 0xB7, 0x54, 0x49, 0xC7, 0xA5, 0x12, 0xD2, 0x04, 0x30, 0x6D, 0xAF, 0x60, 0xB0, 0xD3, 0xE3,
0x18, 0xDA, 0x5B, 0x0B, 0x72, 0xA7, 0xAB, 0x14, 0x4B, 0x58, 0xDF, 0x93, 0x38, 0x1F, 0x30, 0x29,
0xCC, 0x4B, 0x97, 0xBD, 0x2E, 0xB9, 0x04, 0xA3, 0x68, 0x5A, 0x64, 0x1F, 0x73, 0x4B, 0x97, 0x17,
0x43, 0x2E, 0x5D, 0xF6, 0xEB, 0x4B, 0x97, 0x9E, 0x2E, 0x5D, 0x36, 0x2A, 0x88, 0x48, 0x10, 0xCC,
0x69, 0x2B, 0x59, 0xAD, 0x3C, 0x95, 0x44, 0x2B, 0xE8, 0xA6, 0xF9, 0x00, 0x03, 0x76, 0x07, 0xFE,
0xF7, 0x1A, 0x6E, 0x50, 0x16, 0x32, 0xF6, 0xA8, 0xA5, 0xB9, 0xC4, 0x68, 0x80, 0xC2, 0xF0, 0xD0,
0xA8, 0xDA, 0x0B, 0x06, 0xE6, 0x5F, 0x5A, 0x2B, 0x4F, 0x47, 0xBA, 0x40, 0x76, 0x85, 0x6B, 0x97,
0x1B, 0x09, 0x83, 0x4F, 0xFC, 0xAB, 0x66, 0x5D, 0x1A, 0x8B, 0x03, 0x2D, 0x8D, 0x93, 0x1A, 0x18,
0x66, 0x6A, 0x1E, 0x34, 0xF0, 0x31, 0x3F, 0x45, 0x04, 0x45, 0xA1, 0x81, 0xCB, 0x36, 0xE6, 0x1C,
0x76, 0x27, 0x1C, 0xC7, 0x7A, 0x89, 0xAB, 0xDD, 0xE5, 0x6A, 0x16, 0x98, 0x5E, 0x4E, 0xCF, 0x15,
0x42, 0xB3, 0x69, 0x17, 0xE2, 0x59, 0xE8, 0x8F, 0xC4, 0x7D, 0x96, 0xEE, 0xC0, 0x21, 0xBA, 0x03,
0xFE, 0x9B, 0xE2, 0x06, 0x3C, 0xD0, 0x40, 0xE7, 0x15, 0xE1, 0x35, 0x9A, 0x86, 0x27, 0x4D, 0xD5,
0xEA, 0xBD, 0x22, 0x34, 0x3F, 0xDB, 0xC6, 0x45, 0xC5, 0x55, 0x33, 0x84, 0x6F, 0xA9, 0x73, 0xA2,
0x43, 0x42, 0x4B, 0xBE, 0x8D, 0xC8, 0x9C, 0xDF, 0x46, 0x65, 0x61, 0x24, 0x8A, 0x03, 0xA5, 0xD6,
0x33, 0x87, 0xDE, 0x53, 0xB2, 0xA9, 0x40, 0x69, 0x42, 0xAB, 0x1D, 0x00, 0x8A, 0x68, 0x92, 0x37,
0x6B, 0x45, 0x8A, 0x1C, 0xC8, 0x7A, 0x0A, 0xA1, 0xE5, 0xDA, 0x3A, 0x33, 0x9C, 0xE2, 0x59, 0x1A,
0xDF, 0xFB, 0x04, 0xFD, 0xD3, 0xA4, 0xB1, 0x47, 0x4C, 0xD9, 0x5B, 0x0C, 0x26, 0xEF, 0x30, 0xFC,
0x74, 0xDA, 0x54, 0x4A, 0x89, 0xB3, 0x8F, 0x2A, 0x57, 0x55, 0x88, 0x46, 0x74, 0x6E, 0xAA, 0xE9,
0x35, 0x5B, 0x73, 0x54, 0x25, 0x60, 0x9D, 0xE6, 0xBC, 0x42, 0x3E, 0x4F, 0x30, 0x31, 0x28, 0xE7,
0xEC, 0xFF, 0x8C, 0x2A, 0x64, 0xDC, 0xC9, 0x49, 0xD5, 0x5E, 0x52, 0x09, 0xC1, 0x5E, 0x82, 0x26,
0x68, 0x24, 0x27, 0x99, 0x4B, 0x6A, 0x0F, 0x33, 0xB2, 0x80, 0x02, 0xA6, 0xCD, 0x37, 0x70, 0xB4,
0x97, 0x31, 0xD0, 0x10, 0xE3, 0x0D, 0xF2, 0xC7, 0xD6, 0xCA, 0x7B, 0x45, 0xB9, 0xAA, 0xAB, 0x66,
0x4C, 0x76, 0x32, 0xAC, 0x8B, 0x88, 0x56, 0x25, 0xF7, 0xD6, 0x00, 0x0F, 0x62, 0xA0, 0xBF, 0x66,
0xFE, 0x45, 0xD4, 0xE9, 0xEF, 0x6B, 0x73, 0x76, 0x4B, 0x24, 0xBA, 0x88, 0x66, 0x87, 0x00, 0x91,
0x43, 0xC0, 0x26, 0x41, 0x9F, 0x58, 0x3A, 0x8E, 0x4B, 0x71, 0x75, 0x2B, 0x43, 0x3A, 0x4A, 0x22,
0x3A, 0xA9, 0x1D, 0xD1, 0xAB, 0x09, 0x52, 0x16, 0x3A, 0x32, 0xD1, 0x8C, 0xAA, 0x59, 0x44, 0x6F,
0x35, 0xB3, 0x88, 0x18, 0x63, 0x70, 0xE9, 0x7D, 0x5C, 0x7A, 0x16, 0xED, 0xD2, 0xA5, 0x55, 0x18,
0x3A, 0x82, 0x13, 0x6D, 0x48, 0x3D, 0x5A, 0x85, 0x81, 0x6A, 0x49, 0x50, 0xA3, 0x4B, 0x40, 0x3E,
0xE6, 0xDB, 0x96, 0x91, 0x46, 0x97, 0xBD, 0x51, 0x37, 0xF5, 0x7A, 0x9A, 0xD8, 0xF1, 0x4F, 0xD6,
0x64, 0x0F, 0x25, 0xEF, 0x7A, 0xD5, 0x68, 0x3E, 0x63, 0xE0, 0x63, 0xE2, 0x77, 0xE4, 0x70, 0x2D,
0xE8, 0xC4, 0xB0, 0x44, 0x27, 0x4F, 0x2C, 0x6B, 0xE3, 0xFB, 0x83, 0x9D, 0xB9, 0x65, 0x6C, 0x13,
0x75, 0x2E, 0x47, 0x5C, 0xE5, 0x84, 0x2E, 0x80, 0xCE, 0x8B, 0x4A, 0x6B, 0xC9, 0x98, 0xF1, 0x5E,
0xD1, 0x7F, 0x2B, 0x15, 0x60, 0xC6, 0x9D, 0x3C, 0x8B, 0x78, 0x41, 0x11, 0x86, 0x2D, 0x65, 0xF8,
0x7E, 0x47, 0x21, 0xA2, 0x0A, 0x0D, 0x9C, 0x1B, 0x4D, 0x03, 0x7B, 0xA3, 0xE0, 0x2B, 0x19, 0x4A,
0x16, 0xEC, 0x30, 0xE8, 0x7D, 0x15, 0xA5, 0x51, 0x91, 0xD5, 0x2C, 0x5A, 0x44, 0x2D, 0xC7, 0xEA,
0x0F, 0x7A, 0xB3, 0xDA, 0x73, 0x53, 0x68, 0x8E, 0x4A, 0x54, 0x81, 0x1F, 0xE7, 0x66, 0x9D, 0x50,
0xD9, 0xA7, 0x3C, 0xA8, 0x62, 0x35, 0x90, 0x6B, 0x86, 0xD3, 0x09, 0x82, 0x9D, 0x25, 0x3B, 0x8B,
0x76, 0x29, 0xDB, 0x0D, 0x4E, 0x8B, 0x2D, 0x69, 0x9F, 0x8C, 0xA2, 0xDA, 0x83, 0x1A, 0xDD, 0x09,
0x4D, 0xCF, 0x70, 0x5B, 0xE4, 0x17, 0x37, 0x10, 0x60, 0x06, 0x09, 0xFE, 0xA2, 0x87, 0x08, 0x6D,
0x0D, 0x19, 0xF6, 0x48, 0x7D, 0xB3, 0x12, 0x03, 0x2C, 0x98, 0x9A, 0x8D, 0x86, 0xC4, 0x01, 0xA8,
0x0A, 0x2D, 0x80, 0x24, 0x4B, 0x06, 0x2B, 0x5E, 0xEE, 0x81, 0x72, 0xBC, 0xC0, 0x5C, 0xB3, 0x3C,
0x86, 0x55, 0x1A, 0xB2, 0x0E, 0x37, 0x0B, 0x91, 0x68, 0x67, 0x54, 0xA4, 0x8E, 0x41, 0x38, 0xA1,
0xEE, 0xAC, 0x7C, 0xC0, 0x5C, 0x1C, 0x9B, 0x4B, 0x66, 0xAE, 0x14, 0xB6, 0x5C, 0x8C, 0x5D, 0x33,
0xBB, 0xC3, 0x29, 0xB9, 0x1F, 0xE6, 0xC6, 0x15, 0xB8, 0xE6, 0x55, 0x94, 0x71, 0x49, 0x73, 0xDD,
0x0E, 0x00, 0x73, 0x7E, 0xDF, 0x48, 0x2E, 0x7A, 0xC5, 0x55, 0x21, 0x55, 0x56, 0x4F, 0x3B, 0x59,
0x9D, 0x75, 0x8B, 0xBA, 0x2A, 0xAB, 0xAD, 0x7A, 0x5D, 0x9E, 0xCA, 0x46, 0x8C, 0xBF, 0x22, 0xE6,
0x2E, 0xFC, 0x49, 0xE7, 0x1B, 0x76, 0xCA, 0x45, 0xFC, 0x09, 0x5C, 0xF2, 0x88, 0x19, 0xA1, 0xA4,
0x99, 0x4A, 0xF2, 0x3F, 0x55, 0x39, 0x51, 0xB4, 0x39, 0x78, 0x60, 0x30, 0xB9, 0xAA, 0x42, 0x19,
0x38, 0x3F, 0x30, 0x69, 0x65, 0x55, 0xE3, 0x65, 0xE9, 0x84, 0xF3, 0x19, 0x92, 0xBB, 0x47, 0xAC,
0x96, 0x85, 0x13, 0x79, 0x93, 0x7E, 0x30, 0x5E, 0xCC, 0xCD, 0x56, 0xAA, 0x2D, 0xE8, 0x13, 0x60,
0xAB, 0x27, 0xC7, 0x46, 0x99, 0x80, 0x5A, 0xF5, 0x9B, 0xCB, 0x96, 0x39, 0x92, 0xF2, 0x90, 0xC2,
0xF6, 0xCB, 0x2A, 0x93, 0xD1, 0x25, 0x0A, 0x2E, 0x9E, 0xB8, 0xCD, 0x9D, 0xC6, 0xD3, 0x85, 0x2F,
0x9A, 0xE4, 0xB4, 0x32, 0xC9, 0x33, 0x46, 0x17, 0x2B, 0x74, 0x45, 0x4C, 0x46, 0x27, 0x89, 0xD4,
0x04, 0xCA, 0x18, 0xB4, 0x60, 0xF0, 0x32, 0x9B, 0xDD, 0x67, 0xEC, 0x80, 0x64, 0xCA, 0x96, 0x22,
0x10, 0x19, 0x4E, 0x81, 0xA2, 0x22, 0x06, 0xAE, 0x4B, 0x71, 0x59, 0x4E, 0xA6, 0x68, 0x48, 0xE1,
0x61, 0x2D, 0xE4, 0xEB, 0x80, 0x01, 0xDC, 0xD1, 0x90, 0xED, 0x43, 0x7D, 0xD2, 0x9A, 0xD1, 0xD2,
0x4D, 0x08, 0x6C, 0x3E, 0xD7, 0xDC, 0xCA, 0x25, 0x57, 0x8E, 0x41, 0x3E, 0xA7, 0x9E, 0xBF, 0x6A,
0xB8, 0x63, 0xAC, 0x40, 0xAC, 0xC6, 0xB6, 0x3D, 0x4A, 0x9D, 0x4B, 0x09, 0x6B, 0x0B, 0xD3, 0xCB,
0x6D, 0xA3, 0x84, 0x07, 0x8C, 0xD1, 0x2A, 0x65, 0xCC, 0x72, 0x72, 0xC6, 0xA4, 0x26, 0x69, 0xBC,
0xBC, 0x20, 0x6B, 0xB4, 0x8A, 0xAB, 0x2D, 0x1D, 0x6F, 0x34, 0xCA, 0xF6, 0x54, 0x31, 0x8A, 0x9C,
0x70, 0xC4, 0x0D, 0x71, 0x08, 0xEE, 0x47, 0x6A, 0xEE, 0x66, 0x56, 0xEB, 0x6E, 0xCC, 0x26, 0x50,
0x0E, 0x39, 0x37, 0xAB, 0x2C, 0x52, 0xDD, 0x49, 0x65, 0x5C, 0x4A, 0x61, 0xA2, 0xD1, 0xED, 0xF4,
0xB9, 0xF3, 0x1A, 0x89, 0xBB, 0x52, 0xC9, 0x99, 0x4B, 0x3A, 0x32, 0x79, 0x8A, 0xD5, 0x27, 0x5B,
0x9E, 0x81, 0xCA, 0x61, 0x49, 0xBC, 0x2B, 0x50, 0x22, 0x2B, 0xB1, 0xD2, 0x7A, 0x64, 0xAE, 0x44,
0xA3, 0xD1, 0xCD, 0x1C, 0xF2, 0xB0, 0x4D, 0x5C, 0xCB, 0x7C, 0x25, 0x9D, 0xAA, 0x6E, 0x6D, 0xD9,
0x16, 0x04, 0x7F, 0xC2, 0xAC, 0xC4, 0x34, 0x07, 0x44, 0x28, 0x35, 0x2B, 0x72, 0x7C, 0xB5, 0x36,
0x27, 0x25, 0x35, 0x42, 0x0A, 0x8F, 0x59, 0x97, 0xCA, 0x14, 0x5B, 0x61, 0x2A, 0xC3, 0x04, 0x81,
0x16, 0x28, 0x0E, 0x44, 0xB2, 0x69, 0xEA, 0x19, 0xF6, 0xC7, 0xA9, 0x96, 0xAD, 0x42, 0xF8, 0x0F,
0x9C, 0xF3, 0xAC, 0x99, 0x4C, 0xC5, 0x8C, 0x99, 0x9D, 0x74, 0x80, 0x74, 0xEA, 0xAF, 0x06, 0xE6,
0x53, 0x77, 0x46, 0x9D, 0xBD, 0x3A, 0xA8, 0xB8, 0x57, 0xCD, 0x9B, 0x74, 0x29, 0x56, 0xD4, 0x82,
0x49, 0x55, 0xE7, 0x69, 0x56, 0x35, 0x83, 0xFA, 0xF9, 0xEE, 0xCF, 0xDD, 0x14, 0x1E, 0xA5, 0xD9,
0x95, 0xA6, 0x46, 0x59, 0xEE, 0x9A, 0xF5, 0x9D, 0x94, 0x99, 0x61, 0xB5, 0xC6, 0xA5, 0x58, 0xC8,
0xB1, 0x62, 0x6A, 0xC3, 0x4E, 0xE5, 0xAA, 0xE2, 0x5C, 0x3F, 0x70, 0x69, 0xD6, 0x32, 0xEB, 0x75,
0xDA, 0x95, 0xAF, 0xC7, 0x00, 0x1D, 0xA1, 0x4B, 0xC1, 0x96, 0x37, 0xE7, 0xCF, 0x7E, 0x12, 0x0A,
0xEB, 0x99, 0x5A, 0x8E, 0x75, 0xF1, 0x57, 0xB7, 0xF7, 0x6E, 0x2C, 0x77, 0x99, 0x82, 0xCB, 0x85,
0xE0, 0x78, 0x1E, 0x29, 0x5E, 0x51, 0xFD, 0xBF, 0x5E, 0x64, 0xBE, 0x5B, 0xA1, 0xFB, 0x0C, 0x05,
0xEC, 0xE4, 0xDF, 0x47, 0x38, 0x44, 0x89, 0x7F, 0x49, 0x17, 0x48, 0x76, 0xDB, 0x61, 0x2F, 0x49,
0x37, 0x83, 0xBE, 0xB9, 0x17, 0x6E, 0x82, 0xED, 0x4D, 0x4B, 0xA0, 0x7D, 0x07, 0x33, 0xAE, 0x63,
0x2F, 0x39, 0x76, 0x95, 0x7C, 0xF1, 0x13, 0xEC, 0x3E, 0xC7, 0x32, 0xBC, 0x49, 0x6E, 0x8F, 0x62,
0x75, 0xF1, 0xF8, 0xCC, 0xDD, 0xB6, 0xB0, 0x53, 0x26, 0x7A, 0xFA, 0xD4, 0xBC, 0x2F, 0x97, 0x9B,
0x30, 0x1C, 0x65, 0x83, 0xD6, 0x90, 0xB4, 0x1D, 0x33, 0x73, 0x5E, 0xA7, 0x3B, 0x1C, 0x58, 0xEC,
0xE7, 0xEE, 0x53, 0x56, 0xE0, 0x74, 0x05, 0x85, 0xFA, 0xF1, 0x33, 0x35, 0x5D, 0xB7, 0x30, 0xD6,
0x3C, 0x20, 0x68, 0xD7, 0x2E, 0x22, 0x75, 0x8D, 0x40, 0xC7, 0x59, 0x3A, 0xF1, 0x46, 0x78, 0x1C,
0x1B, 0xC0, 0xE3, 0xE5, 0x99, 0x24, 0xAA, 0x79, 0xC0, 0xEC, 0x59, 0x5D, 0x0B, 0x1D, 0x8B, 0xBF,
0xEB, 0x72, 0x3B, 0xEF, 0xF4, 0xC2, 0x85, 0x49, 0x94, 0x44, 0x36, 0xE6, 0x9D, 0x07, 0x8C, 0x8D,
0xAF, 0xAF, 0xB4, 0xE8, 0xC1, 0x43, 0xAE, 0xD4, 0xCB, 0x57, 0xC3, 0x72, 0xFC, 0x3F, 0x56, 0x4B,
0x4C, 0xCB, 0xB5, 0x82, 0xC2, 0x1A, 0x63, 0xE6, 0x66, 0x49, 0x0C, 0x98, 0x7A, 0x5C, 0x8F, 0x84,
0xE2, 0xE7, 0x4C, 0x91, 0x92, 0x37, 0x7A, 0xFE, 0xF3, 0xAB, 0x96, 0xFF, 0xD8, 0x9A, 0xFF, 0x8C,
0xF3, 0x96, 0xC6, 0x07, 0xF1, 0x4F, 0xA1, 0x96, 0x5F, 0x28, 0xC1, 0x80, 0xDD, 0xCA, 0xCC, 0x29,
0x08, 0x7A, 0xBA, 0x10, 0x51, 0x51, 0x34, 0x9E, 0x2B, 0x43, 0xAA, 0xEE, 0xA7, 0x9D, 0xAB, 0x3F,
0xE9, 0x88, 0xC8, 0xAB, 0x44, 0x7A, 0x5C, 0x73, 0x30, 0xE3, 0xDA, 0x1E, 0xC0, 0x17, 0x78, 0x3C,
0x32, 0xFB, 0x20, 0xF7, 0x04, 0x76, 0x9A, 0x7B, 0x43, 0xF6, 0x12, 0x90, 0x4E, 0x6B, 0xFA, 0x81,
0x05, 0xA0, 0xB7, 0x35, 0x6E, 0x8C, 0x2A, 0x38, 0x36, 0x24, 0x43, 0xC4, 0x8D, 0xD6, 0xF0, 0x8D,
0xCF, 0xBE, 0x51, 0xF1, 0x86, 0x08, 0x2C, 0x23, 0x69, 0x14, 0x1A, 0x89, 0x1D, 0xC1, 0xF6, 0x97,
0x48, 0xFF, 0xC4, 0xD1, 0xFC, 0x18, 0x3E, 0x1C, 0xA2, 0x9B, 0x3D, 0xCD, 0xDE, 0x84, 0xC7, 0x77,
0xBC, 0x79, 0xDA, 0xE3, 0x24, 0xA3, 0xFA, 0x1E, 0xDA, 0x7C, 0xB8, 0xC4, 0xF7, 0x44, 0xB9, 0x86,
0x80, 0x5D, 0x57, 0x5F, 0x45, 0x43, 0x7F, 0xCF, 0x22, 0x8C, 0x79, 0x1F, 0x8A, 0xCF, 0x54, 0xCA,
0x9D, 0xAC, 0x8B, 0x6E, 0x4E, 0x7E, 0x57, 0xCC, 0xDA, 0xF8, 0x4F, 0xEB, 0x3D, 0xB7, 0xC2, 0x99,
0xAC, 0x9C, 0xE4, 0xA1, 0x92, 0x22, 0xFD, 0xA2, 0xDC, 0x63, 0x8C, 0xD4, 0xE5, 0x06, 0xB7, 0xA4,
0xA2, 0x3F, 0x77, 0xD1, 0x72, 0xA6, 0x0A, 0xD6, 0x6D, 0xFA, 0x7F, 0x7D, 0xD6, 0x70, 0x65, 0xD1,
0x21, 0x56, 0x0E, 0x64, 0xE6, 0x90, 0xC9, 0x6D, 0xD4, 0x4A, 0x3D, 0x3B, 0x52, 0x58, 0x03, 0x85,
0xB5, 0xB8, 0x7F, 0x29, 0xAE, 0xDF, 0x88, 0x78, 0x43, 0x18, 0x64, 0xA0, 0xEC, 0xBF, 0xCA, 0x51,
0xA3, 0xA2, 0x23, 0x45, 0xF0, 0xEC, 0xC9, 0x63, 0x3A, 0x64, 0xA6, 0x5A, 0x3A, 0x12, 0x2B, 0xE3,
0x0F, 0xD7, 0x7A, 0x2E, 0xE9, 0x3B, 0xEE, 0x8C, 0x3D, 0x38, 0x60, 0xF8, 0x4A, 0xFA, 0xD7, 0x39,
0xCB, 0xA1, 0x92, 0x21, 0x39, 0xB3, 0x4C, 0x1D, 0x12, 0x4B, 0xED, 0x7F, 0xA3, 0x1E, 0xFE, 0xD7,
0x96, 0xFB, 0xC4, 0x92, 0x79, 0x1B, 0xA5, 0xAB, 0x32, 0xA9, 0x25, 0x0E, 0x04, 0x7E, 0x22, 0xF0,
0x15, 0x81, 0xB7, 0x39, 0x2D, 0x91, 0x12, 0xE9, 0xBE, 0xA8, 0xA8, 0xF4, 0x86, 0xAF, 0x37, 0x2C,
0xFF, 0x0A, 0xE7, 0x95, 0xF1, 0x17, 0xC2, 0xD9, 0xEC, 0xF7, 0x26, 0x16, 0xF4, 0x25, 0xF6, 0x49,
0xB2, 0x33, 0xF2, 0x17, 0x86, 0xE7, 0x0F, 0x6B, 0x40, 0xDB, 0x53, 0xD8, 0x9B, 0xB3, 0xEE, 0x6C,
0x4F, 0x0E, 0xFE, 0xC8, 0x3D, 0xA5, 0xCB, 0xFD, 0x2A, 0x98, 0xB9, 0x3A, 0xD9, 0xAC, 0xD5, 0x85,
0xA6, 0xB5, 0x1B, 0x1A, 0x00, 0xF9, 0x3B, 0x2E, 0xBD, 0xAB, 0x4F, 0xAA, 0x63, 0x18, 0x3E, 0xB9,
0x73, 0x56, 0x0B, 0xB8, 0xA8, 0x12, 0x64, 0x2F, 0xC1, 0x76, 0x5B, 0x4C, 0x9C, 0xD2, 0x4C, 0xB1,
0x11, 0x56, 0xFE, 0xA6, 0x94, 0xC3, 0x04, 0x8F, 0x11, 0xB5, 0x20, 0xA2, 0x59, 0x59, 0x00, 0x13,
0x34, 0x1C, 0xEB, 0xDE, 0x20, 0x60, 0x18, 0xD0, 0x55, 0x25, 0x8C, 0x26, 0xB6, 0x5E, 0x66, 0x28,
0x59, 0xFE, 0x65, 0x4E, 0x19, 0xC3, 0x98, 0xAD, 0xC6, 0xED, 0xB2, 0x62, 0x39, 0x2C, 0x6B, 0x5E,
0x47, 0xD7, 0x67, 0x50, 0xB9, 0x8D, 0xB6, 0x41, 0x2F, 0xC3, 0xE0, 0xF6, 0x5B, 0x4E, 0x22, 0xC6,
0xEF, 0x88, 0xB8, 0x3F, 0x37, 0xC3, 0x56, 0xDD, 0x2C, 0x17, 0xBC, 0x2B, 0x34, 0x32, 0xA1, 0xE4,
0x0E, 0x88, 0xB9, 0xC3, 0xF7, 0x29, 0x6C, 0xF6, 0x45, 0x49, 0x36, 0xBE, 0x81, 0x3D, 0xBC, 0xE0,
0xAF, 0x21, 0x98, 0x6D, 0x80, 0xC2, 0x8E, 0x67, 0x97, 0xF0, 0x8E, 0xCB, 0x5F, 0x79, 0xF5, 0x73,
0xEA, 0xB2, 0xDC, 0x81, 0xF5, 0xAF, 0x78, 0xB6, 0xE2, 0x8F, 0x75, 0x1B, 0xB7, 0xF4, 0x97, 0xBC,
0xDC, 0xCD, 0x65, 0xED, 0x0A, 0xEF, 0xB2, 0x90, 0x84, 0xC4, 0x3E, 0xD7, 0x91, 0xC0, 0x8D, 0x36,
0x08, 0xBD, 0x15, 0x14, 0x30, 0xE8, 0x75, 0xE7, 0x31, 0x7A, 0x9A, 0xB8, 0x43, 0xEA, 0x43, 0x12,
0x7E, 0xDD, 0xD4, 0xB5, 0x98, 0x0B, 0xCE, 0x5F, 0x12, 0xCC, 0x99, 0xF7, 0xAC, 0x0A, 0xBC, 0xDB,
0xCB, 0xAB, 0xE1, 0xEA, 0x81, 0xE5, 0xC2, 0xFC, 0x43, 0x07, 0xF4, 0x14, 0x00, 0xC5, 0x6F, 0x1F,
0x1B, 0xD1, 0xC3, 0xB4, 0x2E, 0x00, 0xE8, 0xA9, 0x35, 0x40, 0xE7, 0x45, 0x2C, 0xBB, 0xDA, 0x64,
0xC0, 0x50, 0xA8, 0xDB, 0xEC, 0xEC, 0x72, 0x87, 0x81, 0x6E, 0xBF, 0x3A, 0xB5, 0x5A, 0x58, 0xD9,
0x8F, 0x72, 0x60, 0x60, 0x0F, 0x60, 0x21, 0x9A, 0xF1, 0xE8, 0x8F, 0x97, 0x16, 0x73, 0x51, 0x90,
0xD8, 0x74, 0x66, 0x6F, 0xD2, 0xB3, 0x0F, 0x95, 0x5C, 0x12, 0x63, 0xAF, 0xC4, 0x7A, 0xCE, 0x59,
0x17, 0xD5, 0xE3, 0x17, 0x11, 0xDA, 0x18, 0xD2, 0x8F, 0xDC, 0xE3, 0x4B, 0xF7, 0xA7, 0x20, 0x18,
0x9D, 0xAB, 0x26, 0x46, 0xAD, 0x6F, 0xCB, 0x04, 0x6F, 0xCB, 0xDC, 0x18, 0x98, 0xBD, 0xBD, 0x83,
0xDF, 0x77, 0xC8, 0xFF, 0x1F, 0xBD, 0x58, 0x3F, 0x6C, 0x26, 0xC5, 0x15, 0x7F, 0xBB, 0x6B, 0xDF,
0x8A, 0x5B, 0xC1, 0x50, 0x60, 0x89, 0x3F, 0x12, 0xDB, 0xD0, 0x80, 0x74, 0xDE, 0x36, 0x85, 0xED,
0x99, 0x3B, 0x94, 0x5C, 0x91, 0x02, 0x17, 0x98, 0x14, 0x14, 0xA1, 0xA0, 0x88, 0x2E, 0x52, 0x8E,
0x26, 0xD2, 0x45, 0xB2, 0xBD, 0x8B, 0x5C, 0xA4, 0x48, 0xC1, 0x49, 0x09, 0x55, 0x1A, 0x0A, 0x22,
0x1D, 0x9F, 0x04, 0x6E, 0x28, 0x4C, 0xF2, 0x7D, 0xB7, 0x0B, 0x56, 0x44, 0x41, 0xB3, 0xF8, 0x0A,
0x8A, 0x14, 0x6C, 0x0E, 0x14, 0x94, 0x9C, 0x94, 0x4C, 0x92, 0x25, 0x2C, 0xE7, 0xDD, 0x6F, 0xF2,
0x7B, 0x33, 0xBB, 0x9F, 0xFD, 0x99, 0x70, 0xB9, 0xF8, 0x08, 0x6B, 0x7F, 0x33, 0x3B, 0x6F, 0xE6,
0xBD, 0x79, 0xEF, 0xCD, 0x9B, 0xF7, 0x67, 0x69, 0x9D, 0xCE, 0x91, 0xFF, 0xE1, 0x68, 0x62, 0xCC,
0x38, 0x7C, 0x25, 0xDC, 0x79, 0x2F, 0xD3, 0xB4, 0x42, 0x82, 0x82, 0x82, 0xEE, 0xF6, 0xE5, 0x2C,
0x91, 0xA7, 0xBC, 0x0A, 0x7F, 0xB7, 0xDF, 0xC8, 0xCD, 0x07, 0x4A, 0xBF, 0xBD, 0x72, 0xF6, 0x7F,
0x22, 0xD0, 0xBF, 0x7C, 0xE7, 0xD2, 0xE8, 0xD7, 0x66, 0x9A, 0x9B, 0x3F, 0x6E, 0x3C, 0x7B, 0xF4,
0x96, 0x1A, 0x63, 0x6E, 0xE3, 0x67, 0xBE, 0xE0, 0xA6, 0xB8, 0x34, 0x1A, 0x8D, 0x12, 0xBC, 0xFC,
0x01, 0xBF, 0x7A, 0x63, 0x83, 0x57, 0xF6, 0x8F, 0xE9, 0x9F, 0xC3, 0xE1, 0xE5, 0xF7, 0x1B, 0xFD,
0x73, 0x17, 0x4B, 0x9E, 0xA4, 0x47, 0xD6, 0x48, 0x7E, 0x9B, 0xFF, 0xE4, 0x1E, 0x01, 0x2E, 0x6E,
0x0C, 0xB2, 0xF4, 0x30, 0x0A, 0x18, 0x80, 0x5F, 0xB7, 0x04, 0x28, 0x79, 0x5A, 0x14, 0xDB, 0x7E,
0x2D, 0x8A, 0x34, 0x68, 0x44, 0x95, 0xAA, 0x67, 0x29, 0xD2, 0xB2, 0x98, 0x06, 0x3A, 0x2E, 0xAE,
0x07, 0x5A, 0x64, 0x5B, 0xB4, 0x4E, 0xA2, 0x9A, 0xC6, 0x07, 0x6D, 0xB2, 0xA3, 0x65, 0x58, 0x8E,
0x17, 0x55, 0x7A, 0xBE, 0x0B, 0x9A, 0x08, 0x0B, 0xA4, 0x9A, 0x50, 0xE3, 0x6B, 0x1C, 0x8F, 0x0E,
0x33, 0x49, 0x4D, 0x58, 0xC5, 0x6A, 0x12, 0x80, 0x96, 0xF4, 0x5A, 0x50, 0xC9, 0xA6, 0x41, 0x13,
0x97, 0xE9, 0x85, 0xCE, 0x5B, 0x5F, 0x54, 0x91, 0x4E, 0x32, 0x13, 0xB4, 0xA2, 0x92, 0xE7, 0xDB,
0x10, 0xB8, 0x39, 0xF6, 0x2C, 0x25, 0xB5, 0x41, 0x25, 0xB2, 0x4D, 0x0F, 0x34, 0x96, 0xB0, 0x8D,
0xDC, 0x69, 0xE2, 0x0F, 0xBB, 0x50, 0xE7, 0x7E, 0x0B, 0x6C, 0xD0, 0x01, 0x1B, 0x2F, 0xD7, 0xD8,
0xD4, 0xD7, 0x4B, 0xE0, 0x23, 0xF5, 0xDA, 0xB0, 0x8E, 0x4B, 0x4C, 0xF9, 0x20, 0x14, 0x17, 0x29,
0xD0, 0x75, 0x54, 0x26, 0x6A, 0xCD, 0x03, 0x1B, 0xA2, 0x58, 0xA4, 0x87, 0xE8, 0x6C, 0x46, 0x94,
0x42, 0xCA, 0x16, 0x82, 0x6A, 0x68, 0xA0, 0x20, 0x5A, 0xC3, 0x70, 0x8F, 0x16, 0xFC, 0x72, 0x31,
0x37, 0x66, 0x0A, 0xC9, 0xFF, 0xF5, 0x9B, 0x77, 0x2E, 0x65, 0x7E, 0x49, 0x14, 0x61, 0xF1, 0xB2,
0x9D, 0xA5, 0xA0, 0xC2, 0x62, 0x0C, 0xE5, 0x3C, 0xEE, 0x89, 0x21, 0x28, 0x7B, 0x18, 0x86, 0x35,
0x51, 0x0C, 0x7C, 0xDE, 0x4C, 0xAA, 0xB9, 0x15, 0x89, 0x25, 0x27, 0x6F, 0x59, 0xAB, 0x82, 0x95,
0xED, 0x6A, 0x4B, 0xFD, 0x18, 0xB9, 0x6E, 0x7E, 0xB8, 0x47, 0x4B, 0x17, 0xAA, 0xE7, 0x7A, 0x93,
0xF9, 0x7C, 0x7D, 0x6F, 0x29, 0xF3, 0xAB, 0xAF, 0xEC, 0xCD, 0x9B, 0xAD, 0x53, 0x5E, 0xC5, 0x66,
0xC7, 0xB4, 0xD2, 0xEC, 0xF7, 0x4D, 0x6C, 0x54, 0x82, 0x19, 0xAF, 0xA4, 0x50, 0x53, 0xDC, 0x50,
0x3A, 0xF5, 0x8C, 0xB9, 0x68, 0xBA, 0xD8, 0x64, 0x69, 0xE5, 0x75, 0x14, 0x2A, 0x3E, 0xF0, 0x47,
0x92, 0x8F, 0x0F, 0xA7, 0xF9, 0xF7, 0x68, 0x11, 0x34, 0x64, 0x11, 0xB4, 0x69, 0x19, 0x74, 0x92,
0x7F, 0x78, 0x67, 0x18, 0xFF, 0xE8, 0x11, 0xA1, 0xC9, 0x50, 0xFC, 0x59, 0x47, 0x69, 0x11, 0xB5,
0x46, 0xC5, 0xDA, 0x37, 0xBC, 0x80, 0xD2, 0x97, 0x15, 0xD4, 0x7A, 0x46, 0x2D, 0x02, 0xF1, 0x06,
0x70, 0xD6, 0x2F, 0x8D, 0xA0, 0xC6, 0x53, 0x5C, 0x40, 0x7E, 0xF1, 0x0B, 0x1A, 0x8D, 0x52, 0x73,
0x0A, 0xCC, 0xFE, 0xE5, 0x81, 0xD4, 0x7C, 0x64, 0xBA, 0x13, 0x0D, 0x66, 0x04, 0x9D, 0xAA, 0x01,
0xFA, 0xE8, 0xDA, 0x4B, 0x14, 0x12, 0xD9, 0xE6, 0xA7, 0x1B, 0x17, 0xEF, 0x8D, 0xDA, 0xC1, 0xE8,
0x4D, 0xA2, 0x92, 0xEE, 0xB7, 0xCD, 0xD2, 0xC6, 0x3D, 0xF1, 0x76, 0xEC, 0xC1, 0xD1, 0x52, 0x54,
0xF0, 0x5B, 0x08, 0xDD, 0x51, 0x63, 0x81, 0x5D, 0x52, 0x58, 0x6B, 0xC3, 0xB4, 0x1A, 0x53, 0x58,
0xD9, 0xBB, 0xAD, 0x61, 0xC7, 0xAD, 0x05, 0x4A, 0xD8, 0x7D, 0x9C, 0x59, 0x60, 0x05, 0xB0, 0xA3,
0xC7, 0xAE, 0x61, 0x8B, 0x06, 0xA0, 0x28, 0x06, 0xA0, 0x5F, 0xCF, 0x80, 0x6B, 0xDE, 0x3A, 0xD1,
0xB3, 0x8C, 0x1E, 0xBD, 0x6B, 0x2A, 0x4A, 0x71, 0xB3, 0xC2, 0xB2, 0x49, 0x4D, 0x16, 0x1B, 0x5C,
0xD5, 0x56, 0x8A, 0xB2, 0x0B, 0x6A, 0xA9, 0xF2, 0xFC, 0xE7, 0x55, 0x13, 0x54, 0x6B, 0xD4, 0x04,
0xA6, 0x6A, 0x63, 0x05, 0xD7, 0x20, 0x8A, 0x33, 0xAF, 0xC5, 0x17, 0xB4, 0xAF, 0xC7, 0x34, 0x66,
0x56, 0x12, 0x8A, 0xBF, 0x5F, 0x84, 0xD8, 0x63, 0x12, 0x68, 0xAF, 0x6E, 0x79, 0x63, 0x5C, 0x69,
0x8A, 0x9F, 0x29, 0xC2, 0x92, 0x7C, 0xAC, 0xF3, 0xEA, 0x31, 0x6D, 0xF2, 0xFE, 0x09, 0x25, 0x51,
0x01, 0x01, 0x45, 0xE1, 0xD5, 0x81, 0xDE, 0x82, 0x04, 0x5E, 0x83, 0xDB, 0xB8, 0xC6, 0xCE, 0x81,
0xAF, 0xC1, 0x44, 0x94, 0xC9, 0xD3, 0x35, 0x01, 0x2D, 0x30, 0x0D, 0x99, 0xA9, 0xBD, 0x17, 0x62,
0x8A, 0x91, 0x15, 0x90, 0x2D, 0xDB, 0x53, 0x34, 0xFF, 0x78, 0x3C, 0xB7, 0x35, 0x8C, 0x22, 0xD6,
0x5B, 0x3B, 0x8C, 0xC4, 0x9F, 0xB0, 0x43, 0x3D, 0x8C, 0x12, 0xB8, 0xB1, 0x60, 0xA6, 0x6F, 0xD6,
0x5B, 0x54, 0x1E, 0x8D, 0xA4, 0x75, 0x0B, 0x34, 0x53, 0x5F, 0x32, 0xDB, 0x61, 0xDB, 0xAE, 0x3D,
0x3E, 0x6A, 0x8F, 0x8F, 0x8E, 0x36, 0x60, 0xBC, 0x40, 0x2F, 0x2A, 0x1A, 0x54, 0x0B, 0x65, 0xE5,
0x35, 0x25, 0x1D, 0xD8, 0x52, 0x09, 0x6D, 0x8B, 0x7D, 0xD8, 0x49, 0x8E, 0x57, 0x53, 0xC6, 0x45,
0x9B, 0x5C, 0xD4, 0xB9, 0xD7, 0xC1, 0xBB, 0x5E, 0xD4, 0xC2, 0x34, 0x6B, 0xA2, 0x48, 0x2E, 0xD4,
0x51, 0x39, 0xF1, 0x58, 0xD1, 0x63, 0x51, 0xC4, 0x3B, 0x38, 0xE3, 0x16, 0x5B, 0x5D, 0x52, 0x4D,
0x9C, 0x89, 0x7D, 0x1C, 0x59, 0xEB, 0xDC, 0x04, 0x46, 0xEF, 0x0F, 0xA3, 0xB0, 0x8C, 0x95, 0x1D,
0x35, 0x7C, 0x16, 0xC0, 0x3A, 0x36, 0x8A, 0xD5, 0x71, 0x3C, 0x96, 0xEF, 0x68, 0x34, 0xA1, 0x63,
0x3B, 0xC0, 0xD0, 0x8E, 0x76, 0xC7, 0x89, 0xC1, 0xCB, 0xE4, 0xE4, 0x38, 0x63, 0x7F, 0xE9, 0x3B,
0xAE, 0x61, 0x17, 0xD6, 0x5D, 0x39, 0x89, 0x42, 0xA3, 0x66, 0x47, 0x62, 0xA5, 0x85, 0x7A, 0xE3,
0x42, 0x94, 0x61, 0xC5, 0x46, 0x00, 0xA2, 0x9B, 0x6C, 0x97, 0x56, 0xEB, 0xF0, 0x57, 0x41, 0x4D,
0x70, 0xF7, 0x5E, 0x23, 0x0A, 0x66, 0x3F, 0x2C, 0x13, 0x50, 0x5A, 0xC5, 0xF4, 0x1E, 0x16, 0x69,
0xDA, 0x64, 0x1F, 0x8D, 0x75, 0x51, 0x19, 0xEA, 0x44, 0xB5, 0xD4, 0xC1, 0xA6, 0xC0, 0xFB, 0x98,
0xCD, 0x59, 0x64, 0x63, 0xDA, 0x82, 0xD3, 0xCF, 0x80, 0x00, 0x4B, 0xD2, 0x51, 0xB6, 0xCA, 0x38,
0x51, 0x16, 0x16, 0xE7, 0x80, 0xCA, 0x72, 0xF8, 0x0D, 0x84, 0xC3, 0xBD, 0x18, 0x43, 0x42, 0x4F,
0x63, 0x36, 0x28, 0x26, 0x18, 0xB6, 0x3C, 0x13, 0x67, 0x81, 0xE6, 0x49, 0x9C, 0x75, 0xC1, 0xF3,
0x0D, 0xC5, 0xBC, 0x04, 0xAE, 0x77, 0xC5, 0xAE, 0xDA, 0x06, 0xBE, 0x5B, 0xF8, 0x72, 0xC3, 0x87,
0x97, 0xF0, 0x5A, 0xC8, 0x3C, 0xEE, 0x97, 0x33, 0xC5, 0x1E, 0x63, 0x19, 0x74, 0x81, 0x64, 0xA5,
0x5E, 0x76, 0x2E, 0x3B, 0xC2, 0x0D, 0x5D, 0xD5, 0xE4, 0xDF, 0x84, 0x66, 0x30, 0xB3, 0x17, 0xA9,
0xA0, 0x10, 0x98, 0x64, 0xCE, 0x56, 0x10, 0x74, 0xEA, 0x55, 0xC4, 0x5D, 0x56, 0x11, 0x68, 0x2B,
0x51, 0xF9, 0x2D, 0xE5, 0x14, 0x17, 0x50, 0x46, 0xAA, 0xF0, 0x1E, 0x69, 0x92, 0x19, 0xC1, 0xBA,
0x6B, 0x00, 0xE9, 0xEA, 0x02, 0xEB, 0x1A, 0x80, 0xAE, 0x07, 0xE4, 0x04, 0xAF, 0x9C, 0x14, 0x50,
0x5B, 0x37, 0x60, 0x23, 0x2C, 0xCD, 0x6C, 0x94, 0x14, 0x9F, 0x86, 0x47, 0xB8, 0x2E, 0x0D, 0x05,
0xA5, 0x54, 0x1E, 0x28, 0x35, 0x40, 0x95, 0xE8, 0x80, 0xE0, 0x71, 0x87, 0x21, 0x77, 0x1C, 0xBC,
0xB8, 0xC3, 0x90, 0x3B, 0x6C, 0x6F, 0xBB, 0xB0, 0xB6, 0x1D, 0xA5, 0x4F, 0x37, 0x7C, 0x90, 0xE1,
0x17, 0x0D, 0x2D, 0x08, 0x76, 0x05, 0x14, 0xEF, 0xB7, 0x4C, 0x36, 0xAA, 0x11, 0x00, 0x8C, 0x82,
0x95, 0xAA, 0xE0, 0xB0, 0x66, 0xA9, 0x83, 0x26, 0xE5, 0x73, 0x0F, 0x1A, 0x0E, 0x8D, 0x4C, 0x2C,
0x75, 0x1D, 0xE2, 0x92, 0x25, 0x9D, 0xBA, 0x0E, 0x43, 0xB7, 0x11, 0x77, 0xCB, 0x18, 0xA2, 0x43,
0x6C, 0x4B, 0x61, 0x5E, 0x20, 0x1B, 0x56, 0x0F, 0xDB, 0xF0, 0xF8, 0x02, 0x07, 0x2D, 0x7B, 0x33,
0x8B, 0xF8, 0x93, 0xD6, 0x9B, 0xCA, 0x42, 0x7C, 0xD2, 0x12, 0x77, 0x07, 0x30, 0x82, 0x24, 0x13,
0x07, 0xCD, 0xD0, 0xB5, 0x30, 0xE5, 0x77, 0x61, 0x56, 0xB1, 0x8A, 0xD0, 0x8D, 0xD1, 0x15, 0xE8,
0x04, 0x3A, 0x8D, 0x8E, 0xC2, 0x62, 0x1D, 0xC1, 0x8B, 0x7A, 0x8B, 0x3C, 0xF3, 0x34, 0x88, 0xA5,
0x65, 0xF2, 0xCF, 0x8E, 0x63, 0x5B, 0x5C, 0xAD, 0xD3, 0x13, 0xCE, 0x53, 0x4C, 0x09, 0x59, 0x5F,
0x29, 0xCD, 0x0F, 0xEB, 0x05, 0x09, 0x75, 0x4A, 0x30, 0xC1, 0x7E, 0xD2, 0xFD, 0x26, 0xF8, 0x8D,
0xED, 0xE5, 0x96, 0xAC, 0x45, 0x28, 0x42, 0x42, 0x56, 0x98, 0x3A, 0x25, 0x9A, 0x59, 0xC4, 0x2F,
0x63, 0x33, 0x75, 0xBF, 0xC5, 0x13, 0x6E, 0x88, 0x61, 0x92, 0x33, 0x07, 0x0E, 0xE8, 0x99, 0x9D,
0x97, 0x1C, 0xE9, 0x6D, 0xF3, 0x14, 0xD2, 0xC6, 0x37, 0x1E, 0xE6, 0x65, 0xBF, 0x64, 0xFB, 0x79,
0x5C, 0xB0, 0xD2, 0x60, 0x60, 0x44, 0x35, 0x7B, 0xE4, 0x6D, 0x28, 0x9A, 0xD2, 0x8C, 0x62, 0x30,
0x47, 0xF4, 0x98, 0xB9, 0x8A, 0x89, 0x4B, 0xAF, 0xA3, 0xC9, 0x0D, 0xAB, 0xF4, 0xD5, 0xE7, 0x35,
0x7B, 0x78, 0xDC, 0x0E, 0xCC, 0xC6, 0x36, 0x62, 0x6C, 0x9E, 0x43, 0xE3, 0xDF, 0x64, 0x62, 0x0F,
0x1C, 0xE7, 0x62, 0xC5, 0xC5, 0x0F, 0x4E, 0x5B, 0xB0, 0x03, 0x96, 0x6F, 0xBA, 0xE4, 0x47, 0x5B,
0x93, 0xED, 0x01, 0x42, 0xB1, 0x55, 0xB2, 0xBF, 0x65, 0xF3, 0xC8, 0xE1, 0x8E, 0x57, 0xC9, 0xFF,
0xBB, 0xA6, 0x55, 0xD6, 0xE3, 0x1E, 0xD5, 0x41, 0x11, 0xD3, 0xB9, 0xA0, 0xF2, 0xF4, 0x0A, 0x2F,
0x65, 0xC5, 0xBD, 0x3E, 0xDB, 0x40, 0xCE, 0xEC, 0xCF, 0x6F, 0xE6, 0x64, 0xEF, 0x9D, 0xF1, 0x91,
0x2F, 0x8C, 0x67, 0x2E, 0xF2, 0xBC, 0x7E, 0xAC, 0xEC, 0x9D, 0xF3, 0xEE, 0xE5, 0xCE, 0x01, 0x91,
0x5A, 0x98, 0xCA, 0xBD, 0x3E, 0x97, 0xFF, 0x79, 0x7D, 0xF0, 0xDE, 0xDD, 0x8C, 0xD0, 0xE1, 0x91,
0xA3, 0x8E, 0x8B, 0xC1, 0x9D, 0x57, 0xD3, 0x61, 0xF3, 0x2E, 0x1C, 0x76, 0x92, 0x85, 0x1C, 0xE6,
0xDF, 0xF6, 0x1C, 0xC9, 0x47, 0x2D, 0x93, 0x4F, 0x91, 0x4B, 0xE2, 0x5C, 0x66, 0x45, 0x8E, 0x8A,
0xCD, 0x98, 0x8F, 0x80, 0xCE, 0xE5, 0x03, 0xF8, 0xA0, 0x0B, 0xB6, 0x00, 0x06, 0x9F, 0x8A, 0xF3,
0xD7, 0xB1, 0xD5, 0xB2, 0xD7, 0xCA, 0xE9, 0x6D, 0x84, 0x13, 0x73, 0x78, 0x68, 0xDE, 0xE7, 0x53,
0xB4, 0x69, 0x76, 0xEB, 0x3D, 0x3F, 0x85, 0xB3, 0x5B, 0xBC, 0xCC, 0x6D, 0x6A, 0x99, 0x34, 0xA0,
0x2C, 0x3E, 0x66, 0x4A, 0x12, 0xE6, 0xEF, 0xD7, 0x2C, 0x44, 0x74, 0x93, 0x4F, 0x8E, 0x6F, 0x85,
0xD7, 0x8A, 0x92, 0x53, 0x5E, 0xB6, 0x8B, 0x22, 0x27, 0xBF, 0xC5, 0x75, 0x76, 0x37, 0x2F, 0xCC,
0xF8, 0xEC, 0x22, 0x5A, 0x3D, 0x7E, 0x82, 0x47, 0x35, 0x8B, 0x0B, 0x28, 0x78, 0xD8, 0x4E, 0x2C,
0x7B, 0x96, 0x65, 0x36, 0x02, 0xEB, 0x87, 0x5D, 0x84, 0xDA, 0x1E, 0x04, 0xB2, 0xAA, 0xE7, 0xEC,
0xD6, 0x65, 0x10, 0x36, 0x25, 0xB0, 0xD2, 0x4E, 0x06, 0x74, 0xFF, 0x3F, 0xA0, 0xAF, 0xCD, 0xA3,
0xEB, 0x01, 0x5D, 0xCC, 0xD0, 0x87, 0x2C, 0x54, 0xB3, 0x63, 0xF9, 0xDA, 0xE6, 0xF6, 0x35, 0xB7,
0xEE, 0x0E, 0x4B, 0xD0, 0x8C, 0x6C, 0x56, 0x5B, 0x48, 0x14, 0x2B, 0x9D, 0x84, 0xAD, 0x77, 0x24,
0xBE, 0xB6, 0xB1, 0x4B, 0xD0, 0xDC, 0x61, 0x09, 0x9A, 0x19, 0xA9, 0xC1, 0x30, 0x70, 0xC7, 0xCF,
0x00, 0x09, 0xD7, 0xAE, 0x44, 0xD1, 0x57, 0xC8, 0xA9, 0xD1, 0x29, 0x7E, 0xF0, 0x41, 0xCD, 0x2A,
0x5F, 0x33, 0x6B, 0x12, 0x7E, 0xDB, 0x4B, 0xDD, 0xBA, 0x3C, 0x9D, 0x8E, 0x8D, 0xBD, 0xFE, 0xD7,
0xFB, 0x4B, 0x12, 0xDA, 0xFD, 0xDC, 0x01, 0xE2, 0xB4, 0xD9, 0x91, 0x10, 0xFB, 0x66, 0x76, 0x65,
0x6E, 0xBA, 0x72, 0xE6, 0x35, 0xF8, 0x07, 0xD9, 0x6B, 0x57, 0xF6, 0x3F, 0x56, 0xF2, 0x52, 0xFF,
0x3B, 0xF9, 0xDC, 0xD7, 0xFB, 0xC0, 0x94, 0xEB, 0x19, 0x65, 0xAF, 0x23, 0x71, 0x46, 0x33, 0xF4,
0x03, 0x7C, 0x58, 0xD7, 0x5F, 0x24, 0xB8, 0x53, 0x14, 0x7C, 0x88, 0xCB, 0xCF, 0x98, 0x1C, 0x16,
0xC5, 0xE2, 0xF1, 0x8D, 0xE0, 0x8A, 0x8B, 0x8F, 0x97, 0xBD, 0x32, 0x0A, 0x30, 0x96, 0x88, 0xCF,
0x34, 0xB4, 0x29, 0xA0, 0xCC, 0xA4, 0xE5, 0x9B, 0x93, 0x81, 0x82, 0x2D, 0xBD, 0x65, 0x43, 0x80,
0x4C, 0xD2, 0x4A, 0xD3, 0xB0, 0x0C, 0x30, 0xA0, 0x09, 0x9F, 0x3E, 0xDB, 0xCA, 0x9A, 0xB5, 0x93,
0x3D, 0x66, 0x7B, 0x3E, 0xEB, 0xF2, 0x31, 0x7A, 0x91, 0x39, 0x8B, 0x6A, 0x1F, 0xAA, 0x90, 0x55,
0xD4, 0x32, 0xB3, 0x31, 0x52, 0x85, 0x8E, 0x19, 0xF5, 0xAE, 0xF6, 0x97, 0x1C, 0xBE, 0xAC, 0x0A,
0xDA, 0x08, 0x75, 0xA8, 0xD0, 0x38, 0x91, 0x5A, 0x16, 0x3F, 0x83, 0xC2, 0x0C, 0xDB, 0xD7, 0x01,
0x33, 0x97, 0xFC, 0x82, 0xED, 0xF5, 0x3A, 0xEB, 0xCD, 0x6F, 0xAE, 0x5B, 0x30, 0x1B, 0x6A, 0xCE,
0x49, 0x6E, 0x54, 0xC7, 0xAC, 0x0E, 0xB5, 0xC5, 0xAF, 0x6C, 0x9D, 0xB9, 0x0A, 0x6D, 0xFD, 0x03,
0x9F, 0x04, 0x39, 0x56, 0x39, 0x75, 0x84, 0x5F, 0xE3, 0x5C, 0xB1, 0x60, 0x67, 0x03, 0x87, 0xFB,
0xD0, 0x7C, 0x62, 0xA8, 0xAC, 0x13, 0x2E, 0x70, 0x62, 0x9E, 0x51, 0x21, 0xC2, 0x6A, 0x47, 0xB1,
0xE6, 0x03, 0x03, 0xEC, 0x68, 0xB5, 0x6F, 0xFA, 0x0F, 0x01, 0xE6, 0xBB, 0x1B, 0x1B, 0xCF, 0x31,
0x57, 0xA2, 0x24, 0x57, 0x5B, 0xDA, 0xEB, 0xC0, 0xCC, 0x79, 0x33, 0x70, 0x3E, 0x80, 0xE5, 0x1C,
0x98, 0x79, 0x0F, 0x07, 0xB0, 0x3F, 0x03, 0xB3, 0xBB, 0x7A, 0x6A, 0xF4, 0x86, 0x42, 0xC5, 0x80,
0xB3, 0xDA, 0xDE, 0x35, 0x26, 0xBB, 0x12, 0xC2, 0xF1, 0x71, 0xA3, 0xB9, 0xA9, 0xB9, 0x69, 0xB8,
0x69, 0xEF, 0xD8, 0x34, 0xB3, 0xC5, 0x16, 0xAD, 0xE4, 0x46, 0xA1, 0x69, 0xE8, 0x4A, 0x88, 0x1D,
0xBF, 0x99, 0xA6, 0x4F, 0xA7, 0xC1, 0x1F, 0x7F, 0x2E, 0xD9, 0x41, 0x95, 0xBA, 0x8D, 0x43, 0xCB,
0xDE, 0x41, 0x79, 0xEB, 0xDF, 0x02, 0x0F, 0x11, 0x9C, 0x76, 0xB5, 0x8C, 0xA9, 0xEC, 0x77, 0x0C,
0xFA, 0xDB, 0x1C, 0xE8, 0xB7, 0x0C, 0xFA, 0x8C, 0x41, 0xAF, 0x30, 0x08, 0x71, 0x36, 0xDB, 0xE3,
0xD8, 0x57, 0xF1, 0x77, 0x96, 0x6C, 0x11, 0xF1, 0x6F, 0x50, 0x76, 0x19, 0xF1, 0x87, 0x89, 0xE5,
0x1F, 0x40, 0x96, 0x3D, 0xBC, 0xFE, 0x83, 0x57, 0x7C, 0x90, 0x81, 0xD0, 0x5B, 0x98, 0x9D, 0x32,
0x68, 0xCA, 0xA0, 0x43, 0x06, 0xFD, 0x95, 0x11, 0x66, 0xA0, 0x5B, 0x0C, 0xFA, 0x09, 0x40, 0x2D,
0x83, 0x6E, 0xF2, 0x99, 0x31, 0xAD, 0xEA, 0xD1, 0xD1, 0xE8, 0x57, 0xE0, 0xFC, 0xDA, 0x70, 0x08,
0xD6, 0xD5, 0xA7, 0x33, 0xAF, 0x59, 0xB1, 0x4F, 0x57, 0xDB, 0xC2, 0x6C, 0xE7, 0x2D, 0x4B, 0xA6,
0x97, 0x76, 0x6F, 0x6F, 0x38, 0xE7, 0x1D, 0x7C, 0x01, 0x4B, 0x4B, 0x9E, 0x29, 0x71, 0x94, 0x40,
0xB2, 0x5E, 0xDA, 0xC0, 0xD0, 0xE8, 0xCA, 0x50, 0x97, 0x9D, 0x25, 0x13, 0x76, 0xB1, 0x96, 0xC5,
0x43, 0x5F, 0xBD, 0xBA, 0x4B, 0xCA, 0xF8, 0x6D, 0x50, 0x8B, 0x2A, 0xC1, 0xC5, 0x1A, 0xA3, 0xA2,
0xA9, 0x4E, 0x1B, 0xB6, 0xBF, 0xFD, 0xC7, 0xE3, 0xF3, 0xBE, 0x6F, 0x85, 0xDF, 0x2A, 0xE6, 0x6C,
0x85, 0xBD, 0xBE, 0x50, 0xF0, 0x5E, 0xB8, 0x7B, 0xB8, 0x69, 0x0D, 0x1B, 0x02, 0x3C, 0xA3, 0x97,
0x7F, 0x49, 0xFF, 0x27, 0xD5, 0xF6, 0xF1, 0x6E, 0x88, 0xD2, 0x47, 0xE4, 0xD7, 0x7A, 0xF2, 0x5F,
0x06, 0x65, 0xBC, 0x63, 0x3E, 0xDE, 0x35, 0x31, 0xC7, 0xDD, 0xC5, 0x1F, 0x4F, 0x5F, 0x55, 0x14,
0x5B, 0x8F, 0xCD, 0x65, 0xF2, 0x8D, 0xDA, 0x05, 0xD8, 0xA0, 0xB1, 0x37, 0x3A, 0x29, 0xE9, 0x71,
0x4E, 0x7F, 0x86, 0x8F, 0x5F, 0x9A, 0xB6, 0xF2, 0x2C, 0xFA, 0x00, 0x99, 0x63, 0xAA, 0xE2, 0xF3,
0x8A, 0xEF, 0xEC, 0xB6, 0x8B, 0x6D, 0x2D, 0x57, 0x46, 0xF6, 0x12, 0x63, 0x23, 0xAE, 0x00, 0xEF,
0x0E, 0x80, 0xE2, 0x49, 0xFB, 0x53, 0xD4, 0xB0, 0xB7, 0x4A, 0x8E, 0xE0, 0x1E, 0x84, 0x9B, 0xB2,
0x9F, 0x0B, 0x55, 0x6E, 0xD3, 0xB6, 0xA0, 0xCC, 0x47, 0xC6, 0x7C, 0x0A, 0x34, 0xEC, 0x73, 0xD9,
0xDC, 0xDE, 0xD5, 0x5C, 0x24, 0x5C, 0x66, 0xDF, 0x67, 0x73, 0x12, 0x73, 0x75, 0x96, 0x2E, 0x71,
0xE6, 0x93, 0x4C, 0xB9, 0x9C, 0xAA, 0x90, 0x57, 0xB2, 0xD9, 0x48, 0xFE, 0x78, 0x44, 0x7B, 0x8F,
0x33, 0xE7, 0xFB, 0x36, 0xFE, 0x2E, 0xB8, 0x14, 0xDF, 0x05, 0x7F, 0x34, 0x3E, 0x8D, 0x7D, 0xAE,
0x61, 0xB8, 0x82, 0x1A, 0x23, 0x9D, 0x6F, 0xC7, 0x1D, 0xC7, 0x66, 0x0E, 0x50, 0xD8, 0x7D, 0xB4,
0x6B, 0xFE, 0x72, 0x8D, 0xEF, 0x43, 0xCB, 0x89, 0x55, 0x6B, 0x61, 0x6E, 0xB6, 0x1B, 0x73, 0x3D,
0x31, 0x96, 0x90, 0x83, 0x71, 0xD5, 0x38, 0x38, 0x46, 0x74, 0x78, 0x16, 0x7A, 0xD5, 0x0B, 0x2E,
0x17, 0xBA, 0xE1, 0x84, 0xBF, 0xFE, 0xE1, 0xE4, 0x37, 0xD2, 0xFD, 0x5A, 0x33, 0x64, 0x1B, 0xFF,
0xED, 0xE1, 0x73, 0x95, 0xA5, 0xDB, 0xC5, 0xFA, 0x48, 0xC4, 0xB3, 0xE4, 0x3C, 0x6A, 0xC2, 0x09,
0x17, 0x88, 0x49, 0x86, 0x9C, 0x3F, 0xAC, 0xA4, 0x5F, 0x73, 0x99, 0x38, 0xE1, 0x4F, 0x14, 0x31,
0x4A, 0xC2, 0x22, 0x2C, 0xA5, 0x2B, 0xFF, 0x36, 0x83, 0x2A, 0xC1, 0x3D, 0x02, 0x08, 0x15, 0xA0,
0xA7, 0x85, 0xDA, 0xA3, 0xCD, 0xA0, 0x5C, 0x76, 0xE6, 0xB4, 0x30, 0x44, 0x1C, 0xFB, 0xF4, 0xB5,
0x69, 0xDF, 0xA5, 0xA7, 0xB9, 0x20, 0x2E, 0xBF, 0x7F, 0xC2, 0xE5, 0x96, 0x53, 0xDB, 0x79, 0xC6,
0x75, 0xD3, 0x58, 0x9D, 0xD0, 0xDF, 0xDD, 0x3F, 0xDB, 0x3D, 0x83, 0x73, 0x7C, 0xF6, 0x5C, 0x73,
0x81, 0xE0, 0xD9, 0xB7, 0x07, 0x23, 0x2B, 0x94, 0xDC, 0xB1, 0xF9, 0xB0, 0x8B, 0x98, 0x88, 0xD1,
0x4E, 0xCB, 0xD7, 0x4F, 0x77, 0xE3, 0x97, 0x7B, 0xE3, 0x73, 0xA9, 0x92, 0x70, 0xE9, 0xB3, 0xDF,
0x7F, 0xC9, 0x78, 0xF2, 0x74, 0x34, 0x9D, 0x22, 0xF6, 0x84, 0xE5, 0x36, 0x75, 0xDC, 0x26, 0x95,
0xE5, 0x36, 0x6C, 0xCE, 0xDA, 0x25, 0x2F, 0x42, 0xA6, 0x46, 0xEE, 0x77, 0x49, 0xB1, 0x7E, 0x07,
0x42, 0xC9, 0x7E, 0x2B, 0x0F, 0xDA, 0x59, 0x4D, 0xE5, 0x35, 0x2E, 0xB3, 0x27, 0x97, 0x67, 0xF5,
0xAF, 0xB6, 0x5E, 0xBC, 0x3B, 0xEF, 0xC6, 0xF8, 0x2D, 0x23, 0x25, 0x37, 0xF8, 0x33, 0xEC, 0xD4,
0x56, 0x6F, 0xE5, 0x0B, 0x8E, 0x9F, 0xBB, 0x7B, 0xFC, 0xF6, 0x04, 0x0F, 0x89, 0xE5, 0xC1, 0x49,
0xF1, 0x23, 0xB7, 0x66, 0x72, 0xAC, 0x7B, 0x10, 0xDD, 0x02, 0xC1, 0x35, 0xC0, 0x9A, 0xC9, 0x9F,
0xA2, 0x33, 0xAA, 0xEF, 0xC8, 0x01, 0xFB, 0x25, 0x27, 0xF0, 0xE6, 0xBA, 0xD4, 0x7E, 0x1D, 0xEE,
0xF2, 0xB9, 0xEE, 0x4E, 0x08, 0x43, 0xD7, 0xA2, 0xBB, 0xDE, 0x6F, 0x3B, 0x74, 0x96, 0x17, 0xC3,
0x22, 0x4F, 0x5C, 0xB2, 0x33, 0x8F, 0xB7, 0xE5, 0xAA, 0x38, 0xF9, 0x7E, 0x27, 0xDF, 0x3D, 0x2A,
0xDB, 0x70, 0x54, 0xE9, 0x8D, 0xF6, 0xD1, 0x21, 0xDF, 0x9B, 0x7D, 0x0D, 0x3E, 0xBE, 0xF2, 0xEC,
0x0C, 0x08, 0xAD, 0xEC, 0xE0, 0xBD, 0xB5, 0x86, 0xF0, 0x1A, 0x2F, 0xB8, 0x81, 0x53, 0x4C, 0xCD,
0xC1, 0xEE, 0xB5, 0xA3, 0x6F, 0x9C, 0x4B, 0x9F, 0x5F, 0xBC, 0xD7, 0x6F, 0xB7, 0x6F, 0xBE, 0x44,
0x1F, 0xD1, 0xFD, 0xB6, 0xF9, 0xE9, 0xBD, 0x7D, 0x6D, 0x95, 0xE6, 0x3D, 0xD3, 0x08, 0x44, 0xA2,
0x8A, 0xBF, 0xAE, 0x64, 0xA7, 0x27, 0x34, 0x7C, 0xBB, 0x15, 0x5C, 0x3A, 0xC9, 0x02, 0xF9, 0xA5,
0xD1, 0x09, 0x7F, 0xB6, 0xBF, 0x07, 0x6A, 0xEB, 0xE0, 0x28, 0x7A, 0xCB, 0x2F, 0xAF, 0xAC, 0x04,
0xC5, 0xE7, 0x9A, 0xF3, 0xF3, 0x7B, 0xE0, 0x2D, 0xAD, 0xFC, 0x5D, 0xFA, 0xC6, 0x4E, 0xE1, 0xDF,
0xED, 0x54, 0x31, 0x6C, 0x1C, 0x45, 0x14, 0x7D, 0xB3, 0x6B, 0x7B, 0x11, 0x5B, 0x4C, 0x0A, 0xDC,
0x10, 0x89, 0x6D, 0x8C, 0x14, 0x45, 0xE2, 0xB6, 0x47, 0xB7, 0xB7, 0x03, 0x14, 0x29, 0x28, 0x6C,
0xA1, 0xB8, 0x8F, 0x04, 0xD5, 0x35, 0x6E, 0x28, 0x28, 0xCE, 0xBE, 0xED, 0x28, 0x73, 0x34, 0xB4,
0xB8, 0xA0, 0xC0, 0x4B, 0xE1, 0x86, 0xE2, 0xA2, 0x5C, 0x6E, 0x27, 0xB8, 0xA0, 0xCC, 0x88, 0x48,
0x34, 0x96, 0x60, 0x23, 0x11, 0x24, 0x92, 0x82, 0x21, 0x1E, 0xC8, 0x5A, 0xD9, 0xDB, 0xCF, 0x9F,
0xB3, 0x23, 0x8C, 0x14, 0x24, 0x44, 0x89, 0x98, 0x1D, 0x69, 0xFF, 0xFE, 0x3F, 0xF3, 0xFF, 0x9F,
0xF7, 0xDE, 0x2C, 0xAA, 0x42, 0xD0, 0x02, 0xDD, 0x8E, 0xBE, 0x23, 0x9A, 0x1C, 0xB9, 0x2C, 0xE2,
0xA3, 0x5A, 0xFC, 0xE6, 0xB0, 0xBB, 0x8B, 0x64, 0x53, 0x45, 0xF7, 0x6B, 0xE1, 0x1A, 0xCC, 0x38,
0x12, 0xD5, 0x69, 0x41, 0x95, 0x96, 0xA4, 0x31, 0x54, 0x58, 0xC9, 0x32, 0xA0, 0x7F, 0x61, 0x00,
0xC2, 0x01, 0x1D, 0x40, 0x05, 0xAA, 0x1A, 0x59, 0x83, 0x6C, 0x0F, 0x69, 0x52, 0x24, 0x51, 0x2D,
0xDF, 0x6A, 0xE2, 0x62, 0x2F, 0x7A, 0xB8, 0xF3, 0x29, 0x11, 0x55, 0xC4, 0x0B, 0xF6, 0x80, 0xA4,
0x40, 0x54, 0x03, 0x5B, 0xB8, 0x5A, 0xEE, 0x13, 0x1D, 0x3D, 0xDC, 0x96, 0x9C, 0x0F, 0xC2, 0x22,
0x7A, 0x34, 0x49, 0xC8, 0xBD, 0xB9, 0x63, 0x7D, 0x5C, 0x6A, 0xA4, 0xC0, 0x02, 0xD1, 0x2F, 0x3F,
0x55, 0x39, 0xD9, 0x57, 0x0F, 0x80, 0xCB, 0x2D, 0xC6, 0x84, 0xF1, 0x44, 0xE5, 0x9C, 0x04, 0x90,
0x05, 0xC2, 0x6F, 0x3B, 0x3C, 0x23, 0x9B, 0x9B, 0xB1, 0xD4, 0xD1, 0x7D, 0x03, 0xE7, 0x90, 0x0D,
0x90, 0x5C, 0x33, 0x52, 0x77, 0x3B, 0x26, 0xA6, 0xDA, 0x37, 0x5C, 0x96, 0x5F, 0x10, 0xB5, 0x65,
0xD9, 0x02, 0x0D, 0x02, 0x8B, 0xB0, 0x46, 0xA4, 0xFD, 0xEE, 0x44, 0x81, 0x33, 0xED, 0x02, 0x1C,
0x71, 0xE7, 0x91, 0x58, 0x63, 0x55, 0x01, 0xD5, 0x44, 0x50, 0x87, 0x45, 0x6C, 0x66, 0x68, 0x52,
0x0C, 0xA2, 0x3A, 0x51, 0x5D, 0x5A, 0x48, 0x2A, 0x42, 0xB2, 0xA1, 0xAB, 0xDE, 0xB6, 0xA1, 0x65,
0x6C, 0xB8, 0x94, 0xD4, 0xF2, 0x2E, 0x97, 0x4A, 0xCF, 0x4A, 0xF9, 0x31, 0xAE, 0x51, 0x91, 0x9A,
0x47, 0x76, 0x80, 0x41, 0xA2, 0xA2, 0x6F, 0xB4, 0xF8, 0x95, 0x31, 0x65, 0x18, 0xDF, 0x3D, 0xAD,
0x4C, 0xB5, 0xB0, 0xC1, 0xE7, 0x23, 0xF8, 0xA3, 0x49, 0xC5, 0x67, 0x7C, 0xFD, 0xD0, 0xC3, 0x1A,
0x94, 0xF0, 0x78, 0x04, 0x06, 0xB1, 0xC2, 0x1B, 0x58, 0xBF, 0xF5, 0x1E, 0xD1, 0x77, 0x87, 0x8F,
0xD8, 0xC4, 0x57, 0xE7, 0xDE, 0xF5, 0x6D, 0xEF, 0x2B, 0xCB, 0x3F, 0x0D, 0x3F, 0x02, 0xA2, 0x63,
0x22, 0xAE, 0x1B, 0xEB, 0x51, 0x58, 0x27, 0x68, 0x42, 0x93, 0x60, 0x16, 0xD4, 0x71, 0xD1, 0xC3,
0x34, 0xB0, 0x91, 0x96, 0x6A, 0x80, 0x11, 0x9C, 0xB0, 0x7C, 0x3A, 0xE6, 0x89, 0x5F, 0xA1, 0x89,
0x97, 0xDE, 0x99, 0xF0, 0x61, 0xF4, 0xFD, 0x2B, 0x3D, 0xDB, 0xE8, 0x38, 0xCB, 0x32, 0x2D, 0x1E,
0x90, 0x79, 0xF6, 0xD8, 0x2D, 0x30, 0x6B, 0xD0, 0x77, 0xE8, 0xDB, 0x17, 0x4D, 0xBF, 0xEE, 0x5F,
0x4A, 0x08, 0x57, 0x05, 0xC5, 0x94, 0x1F, 0x66, 0xE9, 0xA5, 0x14, 0x2F, 0x7A, 0xD6, 0x05, 0x79,
0x29, 0xA4, 0x9F, 0xB4, 0x2F, 0x79, 0x7E, 0x06, 0x4B, 0x96, 0x66, 0x10, 0x0D, 0x42, 0xEB, 0x95,
0x91, 0x7B, 0xCE, 0xBC, 0x59, 0x20, 0xA7, 0x05, 0xCF, 0xF5, 0xED, 0xEB, 0x01, 0x4D, 0x62, 0x5A,
0x84, 0x2E, 0xD1, 0x97, 0xBC, 0x1E, 0x79, 0x0F, 0xF3, 0x9B, 0xE8, 0x25, 0x67, 0x2C, 0xB7, 0xB1,
0xF2, 0x1B, 0x38, 0x09, 0xF2, 0x15, 0x24, 0x1F, 0xFF, 0xBC, 0x73, 0x97, 0xC8, 0xAC, 0x95, 0xEA,
0x7F, 0xF5, 0xFE, 0xB7, 0xD4, 0x2B, 0x4A, 0x95, 0x53, 0x31, 0x61, 0x74, 0x7A, 0xC0, 0x47, 0xAB,
0x5F, 0x3E, 0x20, 0xFA, 0x4C, 0xBD, 0xD6, 0xE0, 0xB6, 0x09, 0x1F, 0xEB, 0xF4, 0x26, 0x7D, 0x1F,
0xFF, 0xB8, 0x81, 0x21, 0x22, 0x62, 0x50, 0x9A, 0x3E, 0xFA, 0x23, 0x64, 0xF3, 0xF2, 0x4E, 0x45,
0x8B, 0x29, 0xB8, 0x16, 0xF8, 0xDF, 0x96, 0xAA, 0x95, 0x98, 0x5A, 0x1C, 0xEE, 0x33, 0x26, 0x01,
0x2D, 0x04, 0x27, 0x76, 0x98, 0x8D, 0x20, 0x7B, 0x08, 0x8F, 0x0B, 0xFC, 0xCE, 0x22, 0xE1, 0x0F,
0x89, 0xE8, 0x6B, 0x1B, 0x31, 0x74, 0x06, 0xF3, 0x02, 0xAF, 0x60, 0xD5, 0x37, 0xC6, 0x7A, 0x91,
0xD7, 0xB4, 0x78, 0xCA, 0xEC, 0x1B, 0x2F, 0xB7, 0xA0, 0x83, 0x38, 0x31, 0xB0, 0x23, 0xDF, 0xDD,
0x14, 0xCD, 0x15, 0xBC, 0x8C, 0xB5, 0x03, 0xD6, 0xAC, 0xDE, 0x08, 0xCE, 0xC4, 0xC8, 0xD7, 0x28,
0xE3, 0xE2, 0xE4, 0xEB, 0x73, 0x2F, 0xA3, 0x81, 0x70, 0x92, 0x8C, 0x98, 0xE3, 0x06, 0x60, 0x2F,
0xCE, 0xA1, 0x7A, 0x4A, 0xB6, 0x13, 0x4D, 0x8B, 0x91, 0xFB, 0x9B, 0x4B, 0xB9, 0x8F, 0x2B, 0x37,
0x10, 0xB2, 0x38, 0x96, 0x69, 0x59, 0x10, 0x5A, 0x6C, 0x22, 0xEB, 0x87, 0xC6, 0x66, 0xE1, 0x91,
0x91, 0xBB, 0xC8, 0x5B, 0xB4, 0x4D, 0xA8, 0x9D, 0x14, 0x8E, 0x91, 0xB3, 0xC1, 0x93, 0x22, 0x98,
0xBC, 0x7F, 0xAF, 0x7F, 0xF2, 0x7C, 0x3E, 0x29, 0xB6, 0x86, 0x18, 0xBE, 0xF3, 0x03, 0xDD, 0xA4,
0x7B, 0x75, 0x6A, 0x93, 0x31, 0x2B, 0xAC, 0xE7, 0x30, 0xC5, 0x58, 0x07, 0xB5, 0x20, 0x66, 0x32,
0x6A, 0x99, 0xD6, 0xC4, 0x32, 0xB1, 0xEC, 0x32, 0x17, 0x5C, 0xFB, 0xF8, 0x00, 0x1B, 0x5B, 0x43,
0x75, 0xF2, 0x0F, 0x9A, 0x5C, 0x2E, 0xAB, 0x9F, 0x2F, 0xCB, 0x2C, 0x7A, 0x67, 0x93, 0xED, 0x16,
0xFD, 0x0E, 0x0D, 0x5F, 0x0A, 0x3B, 0x57, 0xF6, 0xAF, 0x08, 0xAC, 0x1D, 0x84, 0xD4, 0x4E, 0xC5,
0xA6, 0x62, 0xD8, 0xC2, 0x53, 0x44, 0x1D, 0x02, 0xFE, 0x07, 0x18, 0xF4, 0xB6, 0xC2, 0x63, 0x6A,
0x2E, 0x9F, 0x7A, 0x45, 0x19, 0x7C, 0x88, 0xBD, 0xEB, 0x15, 0xB1, 0x9B, 0x93, 0xB1, 0x48, 0xCF,
0x8D, 0x58, 0x31, 0xDC, 0xB9, 0x0B, 0x9A, 0x3F, 0x00, 0xAD, 0x58, 0x3D, 0x8C, 0x1D, 0xD5, 0x15,
0x3E, 0x33, 0xC3, 0x32, 0x52, 0x46, 0xC9, 0xA4, 0x80, 0x14, 0xD9, 0x62, 0xEA, 0x10, 0x91, 0x49,
0x49, 0x81, 0xF7, 0x0E, 0x10, 0xC9, 0xA5, 0x57, 0xCA, 0x3E, 0x90, 0x42, 0xE1, 0x26, 0x45, 0x02,
0x8A, 0xB6, 0x4D, 0xB1, 0x30, 0x03, 0x96, 0x42, 0x41, 0x61, 0x4B, 0x89, 0xA3, 0x74, 0x50, 0xB8,
0x70, 0xD6, 0xC5, 0x36, 0x14, 0x14, 0xEB, 0x9D, 0x21, 0x96, 0x92, 0x82, 0xC2, 0x93, 0x58, 0x8E,
0x0B, 0x8A, 0x0C, 0x0A, 0xC8, 0x91, 0x29, 0x3C, 0xE0, 0x31, 0x1E, 0x3F, 0xCF, 0xCC, 0xCD, 0xF7,
0x9D, 0x3B, 0x6F, 0xBD, 0xEB, 0x90, 0x20, 0x45, 0x3C, 0xE9, 0x9D, 0x77, 0xFF, 0xEF, 0xF9, 0xFD,
0xCE, 0xB9, 0x4F, 0x84, 0x9F, 0xED, 0x29, 0x13, 0xDF, 0xDA, 0x4A, 0xA2, 0xF1, 0xE5, 0x42, 0x92,
0x06, 0x43, 0xA6, 0x20, 0xE1, 0x64, 0x4E, 0x72, 0xE0, 0xC8, 0x53, 0xBB, 0x17, 0x0F, 0xC4, 0xD8,
0x41, 0x49, 0x29, 0x26, 0xC3, 0x2C, 0x88, 0xC9, 0x40, 0xD2, 0x0A, 0x24, 0xEE, 0x40, 0x42, 0x6B,
0x6D, 0x2F, 0x25, 0xC9, 0x5A, 0xB9, 0x7B, 0x41, 0xB8, 0xE4, 0xBF, 0x90, 0xDD, 0x8B, 0xC2, 0xA3,
0x66, 0xB2, 0x96, 0x6D, 0x8A, 0xC4, 0xCF, 0xB7, 0x20, 0x01, 0x98, 0x48, 0x5E, 0xAA, 0xC5, 0xB3,
0xB6, 0x93, 0xC4, 0xDA, 0x49, 0xCA, 0xE9, 0xF4, 0xE0, 0xD9, 0xFD, 0xF8, 0x0F, 0xC1, 0xB0, 0x13,
0x67, 0x51, 0xBB, 0x1F, 0x4B, 0x5C, 0xF7, 0x09, 0xEE, 0xED, 0x52, 0xB0, 0xDB, 0x6E, 0x88, 0x79,
0xAE, 0x3D, 0x21, 0xE6, 0xF9, 0xE6, 0x59, 0x31, 0x41, 0xB3, 0x03, 0x52, 0xEF, 0x8B, 0x39, 0x59,
0xF5, 0x24, 0x9D, 0xA4, 0x6F, 0x17, 0xAD, 0x24, 0x57, 0xDF, 0x68, 0x25, 0xBE, 0x8D, 0x2B, 0x22,
0x8B, 0x2B, 0x02, 0x1B, 0xF0, 0x8A, 0x1B, 0xD5, 0x2F, 0x24, 0x27, 0xBB, 0x86, 0x64, 0x87, 0xEA,
0xC0, 0x15, 0x22, 0xEF, 0xC7, 0xE0, 0xB1, 0x4B, 0xE4, 0xE8, 0x27, 0xB2, 0xF7, 0xA9, 0x2B, 0x2B,
0x66, 0xDA, 0xEB, 0x83, 0x49, 0xFC, 0x2A, 0xA5, 0xBE, 0x26, 0x4E, 0xB5, 0xB3, 0x5C, 0xDE, 0xB0,
0xEA, 0xA5, 0xC5, 0x9A, 0x7F, 0x61, 0x92, 0xFD, 0xF2, 0x9F, 0x9D, 0xFF, 0xC0, 0x9E, 0xAD, 0xA3,
0xE9, 0x27, 0x26, 0xC3, 0x86, 0x51, 0x4A, 0xF1, 0x7B, 0xBF, 0xC7, 0xAA, 0xA8, 0x96, 0xA4, 0x4A,
0xA9, 0xC4, 0xCB, 0x22, 0xD6, 0xEF, 0xC4, 0x1B, 0x31, 0x14, 0x0C, 0x18, 0x0A, 0xC7, 0xCB, 0x92,
0x45, 0x76, 0x59, 0x52, 0xA5, 0x03, 0xAF, 0xC5, 0x55, 0x4F, 0xE2, 0x02, 0xDC, 0xDF, 0x05, 0x20,
0x75, 0x0C, 0x92, 0xA9, 0x2A, 0x79, 0x65, 0xC0, 0x2B, 0xE3, 0x6A, 0x65, 0xB9, 0xAF, 0x18, 0x1A,
0x17, 0x8B, 0x4D, 0x6E, 0x2C, 0x62, 0xAA, 0xD4, 0xEC, 0xC2, 0x3A, 0xC7, 0x56, 0xAD, 0xE5, 0x8B,
0x4D, 0xAA, 0xA2, 0xF2, 0x28, 0x22, 0x14, 0xFC, 0xD5, 0x67, 0xB9, 0x8F, 0x57, 0x42, 0x51, 0x91,
0xB5, 0xAD, 0xA4, 0x53, 0xD9, 0xC0, 0x06, 0xDE, 0x39, 0x88, 0x35, 0x2B, 0x03, 0x22, 0xFE, 0x07,
0x59, 0x4C, 0x8B, 0x2D, 0xFA, 0xC5, 0xE0, 0xC8, 0x23, 0xB3, 0x0F, 0x27, 0x74, 0x9D, 0x5E, 0xA9,
0xC4, 0xD7, 0xCB, 0x3B, 0x99, 0xF9, 0xC1, 0x12, 0x3B, 0xD8, 0x43, 0xC2, 0x55, 0xE1, 0xCC, 0x54,
0xEF, 0x7E, 0x92, 0x4C, 0x7F, 0x94, 0x5F, 0x59, 0xC8, 0x6B, 0x0B, 0x89, 0x3F, 0xB0, 0x13, 0x44,
0xCE, 0x86, 0xD2, 0xF6, 0x90, 0x3C, 0xBE, 0x7D, 0xBE, 0xB4, 0x9F, 0x6E, 0xB7, 0xB6, 0x16, 0x70,
0x9F, 0x9F, 0xED, 0x24, 0x84, 0x7A, 0x07, 0xAB, 0x7E, 0x9F, 0x5C, 0x6D, 0x79, 0x9B, 0x37, 0x4C,
0x6A, 0xCD, 0xF8, 0x6A, 0x23, 0x21, 0x4E, 0x1A, 0xC0, 0x23, 0x55, 0x72, 0x15, 0xF6, 0x72, 0xDD,
0x60, 0xEE, 0xE6, 0xAE, 0x1B, 0xBB, 0xAE, 0x77, 0xCF, 0x75, 0x53, 0xA3, 0xDD, 0xE0, 0x9A, 0xEB,
0xEE, 0xBB, 0x6E, 0xFC, 0x82, 0x76, 0xFD, 0xD6, 0xA8, 0x2A, 0x37, 0x66, 0xA7, 0x7A, 0x84, 0xFF,
0x63, 0x1E, 0xE7, 0x8F, 0xE2, 0x43, 0xC5, 0x50, 0x30, 0x3C, 0x80, 0x42, 0xA5, 0x9D, 0x36, 0x2B,
0x36, 0xF7, 0xD9, 0xBC, 0xD7, 0xB0, 0x69, 0xD8, 0xFC, 0xA2, 0x0B, 0xDA, 0xC7, 0xCB, 0xBD, 0x5B,
0xE5, 0x45, 0xAA, 0xC9, 0x7E, 0xA8, 0x2A, 0xC2, 0x6D, 0x5C, 0x10, 0xE0, 0x52, 0xBF, 0x4D, 0xCE,
0xB4, 0x91, 0x8E, 0xEA, 0x82, 0x0F, 0xF2, 0xF3, 0x65, 0xBE, 0xE5, 0xB7, 0xC1, 0x1D, 0x2C, 0x90,
0x74, 0x9B, 0x57, 0x4D, 0x6C, 0x42, 0x1A, 0x34, 0x73, 0x36, 0x03, 0x6D, 0xA6, 0x6C, 0x7A, 0xDA,
0x8C, 0x5B, 0x78, 0xFF, 0x39, 0x6A, 0x98, 0xC6, 0x67, 0xF0, 0x42, 0x91, 0xE0, 0x2C, 0xB4, 0xEA,
0x2E, 0x61, 0xAF, 0xBA, 0x4F, 0x2B, 0x76, 0x18, 0x0B, 0xE8, 0xC4, 0xF5, 0x13, 0x74, 0xA4, 0x31,
0x20, 0xD7, 0x71, 0xB5, 0xA3, 0x33, 0x11, 0x3B, 0xE6, 0xCD, 0x69, 0xCB, 0x48, 0xFC, 0xA5, 0xB5,
0xD7, 0xEE, 0xBE, 0x3A, 0x19, 0x3B, 0x1A, 0xBA, 0x67, 0x85, 0xA3, 0xCF, 0xC1, 0xFA, 0xE6, 0x8F,
0xB0, 0x40, 0xA5, 0x96, 0x1C, 0xD4, 0x13, 0xBF, 0xB6, 0x33, 0x6A, 0x27, 0xBA, 0xFB, 0x53, 0xC7,
0x19, 0x3B, 0x1E, 0xE3, 0x06, 0x3F, 0x9B, 0xE5, 0x32, 0x73, 0x5C, 0xB3, 0x1F, 0xCF, 0xCC, 0x67,
0xDB, 0x8D, 0x6E, 0x23, 0xBF, 0xB0, 0x3B, 0xA3, 0x09, 0x7E, 0x36, 0xC9, 0xDA, 0xA6, 0xC9, 0xFC,
0x3E, 0xB0, 0xFD, 0x28, 0x51, 0x63, 0xEC, 0x3D, 0x4C, 0x9D, 0x19, 0xD7, 0x61, 0xEF, 0x11, 0x86,
0x33, 0x40, 0xA0, 0x9C, 0xBB, 0xCA, 0xE7, 0x06, 0x1E, 0xD8, 0x07, 0x3D, 0x0F, 0x2C, 0xE2, 0x5E,
0xA1, 0x2C, 0x1E, 0x21, 0x6A, 0x87, 0x91, 0xA0, 0x8B, 0x88, 0x35, 0x71, 0x8D, 0x3D, 0xBE, 0x05,
0x50, 0x16, 0xB0, 0xE7, 0x48, 0x50, 0xF5, 0x1F, 0x74, 0x0C, 0x94, 0xF0, 0x76, 0x4D, 0xFF, 0x4E,
0xCB, 0x2C, 0xE8, 0x36, 0x05, 0x53, 0xD1, 0x17, 0xF7, 0x4F, 0xDF, 0xC1, 0xD6, 0x8F, 0xAC, 0x3D,
0x55, 0x8B, 0x79, 0xDB, 0x76, 0xEA, 0x05, 0x5B, 0xF0, 0x15, 0x9C, 0x98, 0x9C, 0xAA, 0xBC, 0x49,
0xA2, 0x2B, 0xAD, 0x94, 0x10, 0x77, 0xA0, 0x55, 0x80, 0x14, 0xF1, 0x20, 0x1B, 0x61, 0x13, 0xFC,
0x23, 0x4B, 0x8A, 0xDE, 0xBB, 0xD3, 0x84, 0xB5, 0x91, 0x9D, 0xDE, 0x6F, 0xE3, 0x2A, 0x4D, 0x05,
0xD6, 0x8F, 0xDF, 0xAA, 0x8C, 0x5C, 0x0E, 0x3E, 0xEE, 0xE2, 0x2A, 0xC9, 0xBA, 0x13, 0x41, 0xA3,
0xA6, 0xB7, 0x7B, 0x4A, 0xBF, 0x84, 0xB7, 0x4C, 0xE5, 0x85, 0xE8, 0x4A, 0x93, 0xC4, 0x95, 0xDF,
0xF6, 0xC1, 0xB5, 0x46, 0x5E, 0x3B, 0x21, 0x1D, 0xE4, 0x39, 0x2D, 0x1B, 0x27, 0x24, 0xB8, 0x59,
0x45, 0xEF, 0x64, 0xB2, 0x6C, 0xFD, 0x7B, 0x95, 0xA4, 0xEF, 0xCB, 0xEB, 0xAD, 0x84, 0x93, 0xE0,
0x46, 0xCF, 0x66, 0x01, 0x43, 0xA4, 0x12, 0x9B, 0xD1, 0x25, 0xD2, 0x9A, 0x91, 0x8A, 0x50, 0x29,
0x01, 0x91, 0xB2, 0x61, 0xA9, 0x65, 0xA3, 0x11, 0x6A, 0x10, 0x5C, 0x13, 0x29, 0xD3, 0x05, 0xC1,
0x3E, 0x23, 0x4D, 0x0A, 0x33, 0x04, 0xE0, 0xF1, 0x9B, 0xA4, 0x22, 0xAF, 0x2B, 0x3D, 0x20, 0xF5,
0x06, 0xD2, 0xB0, 0x1F, 0x82, 0xE5, 0x6E, 0xD9, 0x0E, 0xC4, 0xBD, 0x8A, 0xF4, 0xBE, 0x46, 0x15,
0xFD, 0x57, 0x81, 0xDA, 0x65, 0x38, 0x58, 0x9F, 0x79, 0xAB, 0xF0, 0x94, 0xEF, 0x27, 0x17, 0xE5,
0x26, 0x03, 0xB1, 0x82, 0xD3, 0x40, 0xA2, 0xC4, 0xFE, 0x15, 0x52, 0xD8, 0x09, 0xEC, 0xDF, 0xDF,
0xBE, 0x4D, 0xC4, 0xCF, 0x5B, 0x48, 0x1C, 0x0D, 0x61, 0x47, 0xCC, 0xA6, 0x48, 0xD5, 0x44, 0xC8,
0x87, 0x79, 0xBD, 0x21, 0x86, 0x3F, 0xE5, 0xF0, 0x07, 0x6C, 0xA7, 0x81, 0x39, 0xE8, 0x0F, 0x4C,
0x07, 0xA5, 0xA7, 0x2B, 0x89, 0x31, 0x6D, 0xD4, 0x4B, 0x32, 0x88, 0xFD, 0xB4, 0x2C, 0xE9, 0x37,
0xA7, 0x2A, 0xA0, 0x2E, 0xA1, 0x61, 0xEB, 0x58, 0xE8, 0x3F, 0xBE, 0xBB, 0xBB, 0x7B, 0x91, 0xD9,
0xC6, 0x2A, 0xEA, 0xAD, 0xA0, 0xD7, 0xB3, 0xC0, 0xA2, 0x90, 0xB9, 0x2A, 0x22, 0x8C, 0x47, 0x23,
0x10, 0x83, 0x41, 0x87, 0xAC, 0xC1, 0x59, 0x45, 0x54, 0x05, 0x62, 0xCD, 0xE2, 0x0A, 0x9A, 0xD8,
0x3D, 0xAA, 0x35, 0xB2, 0xB5, 0x72, 0xB1, 0xC8, 0x28, 0x99, 0x28, 0xAC, 0xC9, 0x0F, 0x27, 0x24,
0x61, 0xE6, 0x11, 0x51, 0x05, 0x39, 0xA0, 0x75, 0x09, 0x5F, 0x17, 0x05, 0x0A, 0x4A, 0xB9, 0x9E,
0xD4, 0x8B, 0x8F, 0xA3, 0x96, 0x7B, 0xD5, 0x1C, 0x3C, 0xB9, 0xFD, 0x44, 0x11, 0x56, 0x71, 0x3A,
0x45, 0xD4, 0x32, 0xEB, 0x0D, 0x54, 0x2B, 0x9A, 0x79, 0x86, 0x26, 0x74, 0x81, 0xB8, 0xEC, 0xB9,
0xA0, 0x64, 0x88, 0xF2, 0xC8, 0x81, 0x57, 0xC4, 0xD4, 0x8D, 0x0C, 0xE4, 0x30, 0xFE, 0x50, 0x8F,
0x82, 0xA7, 0xD0, 0x02, 0xB6, 0xFA, 0x9E, 0xB5, 0xD7, 0xB7, 0xE0, 0x51, 0x94, 0x63, 0xA4, 0xDE,
0x62, 0xAA, 0x0C, 0x27, 0x8C, 0x6C, 0x2A, 0x16, 0xD3, 0xEB, 0x70, 0xC5, 0xC4, 0x26, 0x6C, 0x80,
0x26, 0xEC, 0x37, 0x30, 0xF3, 0xA0, 0x89, 0x01, 0xB2, 0x53, 0x51, 0x5C, 0xFB, 0x0E, 0xC9, 0xBD,
0x39, 0x53, 0x68, 0x62, 0xD2, 0x74, 0xA9, 0x4A, 0x09, 0xBA, 0xC7, 0x78, 0x45, 0x8C, 0xC3, 0xCD,
0xE9, 0x86, 0x88, 0x40, 0x18, 0xA3, 0x9A, 0x3D, 0x8B, 0x31, 0x1F, 0x7E, 0x0D, 0x35, 0xD7, 0x3F,
0x96, 0xE8, 0x41, 0x97, 0xE3, 0xD8, 0xA9, 0xCC, 0x04, 0x48, 0xC0, 0xED, 0x9A, 0xEF, 0xA9, 0xED,
0x84, 0x5C, 0xA6, 0x5C, 0x69, 0x00, 0x0D, 0x12, 0x9F, 0x81, 0x6C, 0x5E, 0x36, 0x3E, 0x7A, 0xD1,
0x51, 0xA3, 0x12, 0xD9, 0xC4, 0xC1, 0xA6, 0x32, 0x84, 0xF4, 0xB9, 0xE7, 0x6C, 0xFB, 0x6D, 0xD1,
0x64, 0xE2, 0x72, 0xC2, 0xE0, 0x56, 0x9F, 0xF3, 0xDC, 0x22, 0x1C, 0x54, 0xBA, 0x46, 0xE5, 0x4E,
0xA6, 0x79, 0xD4, 0xC0, 0xD0, 0xBC, 0x82, 0x97, 0xDE, 0x98, 0xB8, 0x86, 0x3C, 0x6C, 0xB8, 0xA9,
0x7C, 0xD5, 0x38, 0xE0, 0x7A, 0x6F, 0x4B, 0x73, 0xAE, 0x29, 0x12, 0x08, 0xCA, 0xB8, 0xCC, 0x4A,
0xDB, 0xD2, 0x3B, 0x4B, 0x6F, 0x3A, 0xD9, 0xB3, 0x31, 0x05, 0x9D, 0x3F, 0xA0, 0x40, 0xF1, 0x87,
0x10, 0x13, 0x10, 0x20, 0xEC, 0xC1, 0x01, 0x03, 0x2A, 0x41, 0xAC, 0x79, 0x03, 0xE3, 0xBC, 0xA2,
0x69, 0xA3, 0x66, 0xDD, 0xE2, 0xB2, 0xA8, 0x8D, 0xE9, 0x90, 0xE9, 0xDD, 0xED, 0x86, 0x38, 0x28,
0x8A, 0xE2, 0x74, 0x0F, 0x93, 0x8F, 0x4E, 0xA0, 0x7C, 0xCD, 0xA5, 0x65, 0x79, 0x7D, 0xA5, 0x89,
0x83, 0x55, 0x63, 0x5C, 0x35, 0x86, 0x95, 0x87, 0xAF, 0x1A, 0xFE, 0x9C, 0x12, 0x1F, 0xAA, 0x30,
0x68, 0x1F, 0xAA, 0x52, 0xCD, 0x14, 0xD1, 0x13, 0x93, 0x9B, 0x58, 0x98, 0x66, 0x8C, 0x2F, 0x51,
0x32, 0x1E, 0xB6, 0x14, 0x70, 0xE8, 0x10, 0x6F, 0x30, 0x24, 0xFF, 0x44, 0xDF, 0xBB, 0x42, 0xA7,
0xBA, 0x51, 0xD3, 0xBA, 0x04, 0x7D, 0x67, 0xEC, 0x99, 0x91, 0xEF, 0x92, 0x3C, 0xC3, 0xDC, 0xBE,
0x13, 0xC2, 0xAC, 0xA8, 0x15, 0x0A, 0xDF, 0x6E, 0x9F, 0x62, 0x42, 0x8A, 0xEA, 0xE8, 0x06, 0x04,
0x8F, 0xAF, 0xF4, 0x41, 0x9B, 0x3E, 0xD7, 0xFA, 0x7D, 0x2E, 0xEF, 0x7A, 0x87, 0x65, 0x8A, 0x23,
0x97, 0x0F, 0xC9, 0x30, 0xCB, 0x11, 0x5C, 0x62, 0x3E, 0x64, 0xCA, 0x09, 0x6C, 0xE6, 0xD9, 0x25,
0x2E, 0x4B, 0x98, 0x30, 0x89, 0x34, 0xB4, 0x17, 0xC2, 0x97, 0x01, 0xD3, 0xAE, 0x6D, 0x5F, 0x5F,
0x94, 0xBF, 0x53, 0x68, 0xFE, 0xF3, 0xDE, 0xAD, 0xDD, 0xF2, 0x5F, 0x18, 0x85, 0xF8, 0xB0, 0x23,
0xEC, 0xC5, 0xE6, 0x91, 0xB4, 0xCD, 0x38, 0xB2, 0xDC, 0x86, 0x38, 0x48, 0x6E, 0x95, 0x1D, 0x0F,
0x1B, 0x79, 0xEE, 0xC8, 0xF8, 0xCF, 0x56, 0xB1, 0xEB, 0x98, 0xFB, 0xDA, 0x26, 0x3E, 0x9B, 0xAA,
0xDA, 0x7A, 0xE5, 0x9E, 0x9E, 0xC6, 0x4B, 0x4A, 0x2C, 0x0C, 0xEC, 0x6F, 0xEB, 0x44, 0x4C, 0x8B,
0x82, 0x18, 0x20, 0x7E, 0x42, 0x08, 0xF5, 0x1D, 0xF1, 0x05, 0xAB, 0x99, 0xF4, 0x20, 0x42, 0xCD,
0x61, 0x38, 0x58, 0xC7, 0x04, 0x80, 0x61, 0xC4, 0x6C, 0xCC, 0x07, 0x01, 0x21, 0xB3, 0x24, 0xF6,
0x2C, 0x35, 0x47, 0x7E, 0xC6, 0x61, 0xF3, 0x0E, 0x57, 0x4F, 0x70, 0xDC, 0x2E, 0xE8, 0x81, 0x39,
0x75, 0xFC, 0xF1, 0xC8, 0xE1, 0x33, 0x23, 0x87, 0xC3, 0x91, 0xC3, 0xD1, 0x84, 0xE1, 0x26, 0xB2,
0xB7, 0x2F, 0xD9, 0x82, 0x90, 0x30, 0xA1, 0xD4, 0xD4, 0xA0, 0x09, 0x3F, 0xD1, 0x00, 0x50, 0x3F,
0x3A, 0x71, 0x28, 0x84, 0xD0, 0x7E, 0x5A, 0x8D, 0xC1, 0xC8, 0xEA, 0x4A, 0x13, 0xBD, 0x26, 0xBC,
0xA3, 0x15, 0xF8, 0x59, 0x0A, 0x35, 0x22, 0x44, 0x00, 0x77, 0xB9, 0x06, 0xCB, 0xA8, 0x48, 0x6F,
0xED, 0x36, 0xC9, 0xF8, 0x4A, 0x79, 0x6B, 0x6F, 0x79, 0xC1, 0xE5, 0x7F, 0x30, 0x6E, 0xB2, 0xB5,
0xFC, 0xFC, 0x62, 0xDA, 0x52, 0x35, 0x7F, 0xA9, 0xEB, 0x6A, 0x30, 0x1B, 0x6B, 0x74, 0xD0, 0xCD,
0xC5, 0x3D, 0x77, 0x1C, 0x98, 0x7B, 0x8A, 0xEB, 0x41, 0xCF, 0x81, 0xE8, 0x73, 0xC5, 0x83, 0xAB,
0x87, 0xCF, 0x27, 0x55, 0xE6, 0x44, 0x74, 0x70, 0x48, 0x8D, 0xE4, 0xD2, 0x69, 0xED, 0x28, 0x2E,
0xA4, 0x75, 0x51, 0xD4, 0x1C, 0x62, 0xEC, 0xA8, 0x06, 0xFE, 0x42, 0xB9, 0x5A, 0x2C, 0x5E, 0xB6,
0xD7, 0x45, 0xD6, 0x09, 0x2C, 0x0C, 0x20, 0x2D, 0x61, 0x5E, 0xB5, 0xB7, 0x76, 0x77, 0x69, 0x14,
0xFB, 0x77, 0x8B, 0xCC, 0xF0, 0xAE, 0x03, 0x98, 0xEA, 0x30, 0x28, 0x1C, 0xEA, 0x54, 0x33, 0x78,
0xFC, 0x1A, 0x48, 0x7D, 0x69, 0x52, 0x68, 0x2F, 0x00, 0xAF, 0xA8, 0xD5, 0xF5, 0xED, 0xC0, 0x3A,
0x88, 0x74, 0xDF, 0xB1, 0x97, 0x91, 0x3D, 0x97, 0x1A, 0xC4, 0x74, 0xFB, 0xEB, 0x85, 0x69, 0x52,
0xB0, 0xDC, 0xA0, 0x24, 0x8D, 0x5B, 0xD4, 0x7A, 0x90, 0x6F, 0x9F, 0xFC, 0xA5, 0xCC, 0x2B, 0x18,
0xCC, 0xB5, 0x16, 0xAC, 0x30, 0x18, 0xB1, 0x20, 0x84, 0xC1, 0x31, 0x58, 0x1E, 0x1F, 0x74, 0x2B,
0x4D, 0xE1, 0x4A, 0xC5, 0x7D, 0x56, 0xB0, 0x29, 0x19, 0xC3, 0x60, 0x88, 0x72, 0x04, 0xBA, 0x6B,
0xF6, 0x3D, 0x3C, 0x6C, 0xEC, 0x5E, 0x4D, 0xDC, 0xEF, 0xF8, 0xB2, 0xE9, 0x57, 0x61, 0x93, 0xAE,
0x0A, 0xE2, 0x67, 0xE4, 0x3B, 0xE0, 0xB5, 0x95, 0x1D, 0x76, 0xB9, 0xCB, 0xA8, 0xAC, 0x03, 0x3D,
0x4D, 0x4D, 0x77, 0x86, 0x64, 0x5A, 0x2B, 0x7F, 0xB6, 0x77, 0x7D, 0xCB, 0xD3, 0xE1, 0x70, 0xB6,
0x12, 0x73, 0x44, 0xAE, 0xD9, 0xFB, 0xFF, 0x1A, 0xA6, 0x22, 0x93, 0x2A, 0x98, 0x5E, 0x44, 0x37,
0xB4, 0x03, 0x86, 0x43, 0x2D, 0x15, 0x8F, 0x66, 0x67, 0x4F, 0x15, 0xEA, 0xA9, 0x72, 0x25, 0x9F,
0xC8, 0x7F, 0xDC, 0xC9, 0xFA, 0xFC, 0x5A, 0x99, 0xC1, 0x7F, 0x85, 0x5A, 0x73, 0xC7, 0x61, 0x59,
0x5A, 0xCB, 0xA1, 0xD3, 0xC2, 0x2D, 0xF4, 0x27, 0x71, 0x29, 0x21, 0xB5, 0xB5, 0xFB, 0xD1, 0xC1,
0x75, 0xEB, 0xF0, 0x7E, 0xDE, 0x56, 0xFD, 0xFC, 0x5B, 0xC5, 0x2F, 0x65, 0x34, 0x37, 0x6D, 0xDA,
0x47, 0xD7, 0xCE, 0xD6, 0xF6, 0x64, 0x75, 0xF9, 0x99, 0x3E, 0xAC, 0x9F, 0x8E, 0xAF, 0x5D, 0xCD,
0x9E, 0xF5, 0xEB, 0x21, 0xE9, 0x82, 0xEA, 0x69, 0x53, 0xE4, 0x9F, 0x3C, 0xEB, 0xC3, 0x5B, 0xAC,
0xBE, 0xC2, 0xE3, 0x3D, 0x55, 0x6D, 0x17, 0x5E, 0xFF, 0x15, 0x03, 0x07, 0xCB, 0x44, 0xDE, 0xC3,
0x32, 0x97, 0x70, 0x27, 0x12, 0xAB, 0x44, 0x8E, 0x7F, 0x1E, 0x4E, 0xCC, 0xB3, 0xF9, 0x61, 0xA5,
0xF4, 0xCD, 0x12, 0x3A, 0xDE, 0x29, 0x7C, 0xFF, 0xB6, 0x67, 0xF1, 0x18, 0x35, 0xF5, 0xAC, 0x40,
0x93, 0x79, 0x8B, 0xD3, 0x9F, 0x6E, 0x32, 0x14, 0xB4, 0x6A, 0xD1, 0x60, 0x61, 0x2E, 0x85, 0x43,
0xC9, 0x36, 0x2B, 0xEB, 0x0E, 0x11, 0x5F, 0xBB, 0x3A, 0x87, 0x05, 0x97, 0x22, 0x19, 0x17, 0xA9,
0xCA, 0x57, 0xA3, 0xFE, 0x6A, 0x94, 0x85, 0x9A, 0xD8, 0x79, 0xD4, 0xC8, 0xF1, 0xB8, 0x19, 0xE4,
0x09, 0x0C, 0x7A, 0x48, 0x47, 0xA8, 0xBA, 0x0B, 0x9C, 0x7B, 0x9F, 0xCA, 0xAF, 0xC9, 0x1C, 0x6D,
0x73, 0xBB, 0x5A, 0x2F, 0xFC, 0xE0, 0x73, 0x3C, 0x71, 0x45, 0x1F, 0x3A, 0xE5, 0x48, 0xBB, 0x35,
0xA2, 0x5E, 0x11, 0xDC, 0x6D, 0x86, 0xF9, 0xD1, 0xA1, 0xFE, 0x99, 0xF0, 0x15, 0xA2, 0x55, 0x10,
0xDF, 0x12, 0x73, 0x29, 0x34, 0xF1, 0x22, 0x9C, 0x35, 0x30, 0xCB, 0x98, 0x3D, 0xD6, 0xCB, 0x04,
0x86, 0xC0, 0xF6, 0x8F, 0xA8, 0xBD, 0x2C, 0x9C, 0x6F, 0x39, 0x1F, 0x1A, 0x52, 0xED, 0xEE, 0xF8,
0xAD, 0x7B, 0x15, 0xBE, 0xE6, 0xDE, 0xBA, 0xEE, 0x79, 0x3B, 0x04, 0x8D, 0xF3, 0x15, 0x7C, 0x96,
0x5A, 0xBB, 0xD1, 0xD2, 0xEB, 0xFA, 0x8B, 0x2A, 0x0E, 0x93, 0x8F, 0xF7, 0xEE, 0x45, 0x89, 0x88,
0xDA, 0x70, 0xE8, 0x1E, 0x17, 0x19, 0x51, 0x3A, 0x68, 0xDE, 0x8F, 0xE4, 0x47, 0x98, 0xB4, 0x67,
0x09, 0xEB, 0x54, 0x70, 0x80, 0x70, 0x1F, 0xD2, 0x6B, 0x14, 0x68, 0x08, 0x6A, 0xBC, 0x2A, 0x54,
0x73, 0x9B, 0xAE, 0x06, 0xC2, 0xDE, 0x07, 0x2E, 0xEB, 0xBE, 0x37, 0xA7, 0xEC, 0xB8, 0x99, 0x83,
0xE0, 0xD6, 0x9E, 0x73, 0x5F, 0x57, 0xBF, 0x94, 0xEE, 0xA1, 0x25, 0x4F, 0xBA, 0xD9, 0xD9, 0x71,
0x8B, 0x23, 0x89, 0xFC, 0xEB, 0x3A, 0xAF, 0xF2, 0x5D, 0xC9, 0xA8, 0xEA, 0xB4, 0x66, 0x05, 0x3F,
0xE6, 0x7E, 0xFA, 0x1B, 0x5B, 0xC5, 0xBD, 0xDF, 0xFB, 0x16, 0xC0, 0x92, 0x16, 0x61, 0x67, 0x2A,
0xEC, 0x31, 0x57, 0x3A, 0x4D, 0x8C, 0x39, 0x0F, 0x88, 0x3F, 0x6A, 0x79, 0xC0, 0xC1, 0x01, 0x3B,
0xD1, 0x83, 0x86, 0x9D, 0x7C, 0x22, 0x07, 0xA1, 0x63, 0x29, 0x57, 0xC4, 0xFD, 0x1F, 0x9D, 0x16,
0x97, 0x5E, 0x50, 0xBF, 0x6F, 0x28, 0x8E, 0xCD, 0x42, 0xBE, 0x7E, 0x3D, 0x7D, 0xB9, 0x68, 0xED,
0x04, 0x7C, 0x08, 0x5B, 0x42, 0xC5, 0xA8, 0x55, 0x7C, 0x96, 0x13, 0x23, 0x12, 0xE6, 0x8C, 0x90,
0x8F, 0x0C, 0x0C, 0x46, 0xC3, 0xF7, 0xED, 0xD2, 0x2A, 0x8A, 0x0F, 0xBE, 0x3E, 0x23, 0x5C, 0x29,
0x9E, 0xAF, 0x32, 0x95, 0x77, 0x69, 0xB9, 0xAB, 0xFF, 0x5F, 0x54, 0x34, 0x5B, 0x2B, 0x47, 0xAA,
0xF0, 0x23, 0x2F, 0x11, 0x97, 0xD3, 0xDC, 0x3F, 0x50, 0x92, 0xA8, 0x95, 0xC3, 0xEB, 0x9A, 0xD0,
0x14, 0x6B, 0x12, 0xCD, 0xF4, 0xA9, 0x7D, 0x09, 0xE7, 0xA7, 0x37, 0xAB, 0xE5, 0x24, 0xC9, 0xC7,
0xED, 0x46, 0x82, 0x84, 0xB9, 0x13, 0xBF, 0x89, 0x74, 0x84, 0x1D, 0xE6, 0x4C, 0x1F, 0x56, 0x7D,
0xD4, 0x8E, 0x5E, 0xBB, 0x41, 0x05, 0xED, 0xC4, 0x85, 0x39, 0x5D, 0x61, 0x22, 0xFE, 0xAC, 0xC5,
0x44, 0xB0, 0x1C, 0xBC, 0x16, 0xC9, 0xD6, 0x95, 0x93, 0xEE, 0xBA, 0xB9, 0xAA, 0x1A, 0x67, 0xA8,
0x39, 0x82, 0x5D, 0xE5, 0x51, 0x83, 0x1F, 0x45, 0xA4, 0x57, 0xD4, 0xD3, 0xB4, 0xC8, 0x66, 0xED,
0xA7, 0x05, 0xF6, 0x85, 0x1F, 0x60, 0xF6, 0x05, 0xAC, 0xED, 0x36, 0x5C, 0x23, 0xB7, 0x07, 0xE4,
0x7B, 0xA2, 0x62, 0x59, 0x49, 0x96, 0x0D, 0x64, 0xB4, 0xD4, 0x18, 0x93, 0xB1, 0x39, 0xC9, 0xBF,
0x5A, 0xD0, 0xC8, 0x43, 0x06, 0x4D, 0x0E, 0x85, 0x85, 0x77, 0x5F, 0xB4, 0x19, 0x16, 0x17, 0x6E,
0xD7, 0x62, 0x7B, 0x0C, 0x99, 0x45, 0xB8, 0xF8, 0x2D, 0x7A, 0x25, 0x6D, 0xF1, 0x97, 0x23, 0x8D,
0x80, 0x8D, 0xF2, 0x2D, 0xFE, 0x3F, 0x81, 0x5D, 0x23, 0x33, 0x3B, 0xB7, 0x67, 0xC7, 0xD9, 0x50,
0xC6, 0xF0, 0x52, 0x41, 0xB1, 0x02, 0x36, 0xC1, 0x4A, 0x60, 0x7F, 0xBF, 0x1F, 0xF5, 0x4E, 0x2E,
0xFD, 0xA3, 0xA2, 0x70, 0x28, 0xAD, 0xDF, 0xF9, 0x4F, 0xAF, 0xC3, 0x7E, 0xE1, 0xD6, 0x70, 0x2D,
0xF6, 0x3C, 0xC6, 0xBD, 0x3C, 0x03, 0x67, 0xF5, 0xEE, 0xF5, 0x23, 0xAB, 0x7A, 0x9E, 0x60, 0x35,
0x3E, 0x85, 0x47, 0xDB, 0xBF, 0x01, 0xD3, 0x5A, 0xB5, 0x6A, 0xD5, 0x92, 0xFF, 0x40, 0xF0, 0x18,
0x44, 0x34, 0x30, 0x00, 0x01, 0x00, 0xD5, 0x53, 0xBB, 0x4E, 0xC3, 0x40, 0x10, 0x1C, 0xDB, 0x82,
0x14, 0x2E, 0x4C, 0x01, 0x0D, 0x14, 0x34, 0x54, 0x34, 0xF9, 0x04, 0x5F, 0x95, 0x16, 0x10, 0x41,
0x29, 0xD3, 0x22, 0x9A, 0x7C, 0x82, 0xF3, 0x09, 0x34, 0xA9, 0x69, 0x68, 0xF8, 0x09, 0x1C, 0x89,
0x1F, 0x38, 0x2A, 0x4A, 0x2C, 0xA4, 0xF4, 0x2E, 0x0C, 0x02, 0x29, 0x77, 0xC3, 0xEE, 0x39, 0x84,
0x87, 0xA0, 0x41, 0x22, 0x12, 0xCD, 0xEE, 0x4D, 0x32, 0xBB, 0x37, 0xB3, 0x7B, 0x06, 0xCE, 0xCE,
0xB1, 0x7D, 0x89, 0x94, 0x4D, 0x4C, 0x87, 0x2E, 0xEB, 0x94, 0x73, 0xE4, 0xD3, 0xC3, 0xAC, 0xDA,
0x44, 0x09, 0x74, 0xA7, 0xC0, 0x35, 0x90, 0x8F, 0x01, 0x27, 0xC9, 0x7C, 0x49, 0x3B, 0x64, 0x8F,
0xB4, 0x05, 0x39, 0x92, 0xB4, 0xE5, 0x4F, 0xD6, 0x8A, 0x89, 0xF9, 0x96, 0xB9, 0x82, 0xA4, 0x56,
0xD4, 0xC8, 0x9E, 0xDA, 0x70, 0x6A, 0xC2, 0xAB, 0x05, 0xA7, 0x06, 0xF6, 0x94, 0x84, 0xF7, 0x20,
0xC2, 0x8D, 0x2B, 0x34, 0x88, 0x68, 0xF9, 0xC5, 0xE1, 0x0F, 0x82, 0x08, 0x3A, 0x55, 0x41, 0x6E,
0x29, 0xC8, 0x2D, 0x05, 0x7D, 0x25, 0xAF, 0x4A, 0x90, 0x2E, 0x1B, 0xBA, 0xEA, 0x92, 0x3D, 0x13,
0x93, 0x92, 0x6F, 0x1A, 0x30, 0x32, 0xF9, 0xF8, 0xC8, 0x2F, 0x36, 0x9E, 0x9B, 0xEE, 0x18, 0x59,
0x85, 0xD8, 0x64, 0x16, 0x49, 0x23, 0xE3, 0xD2, 0xF0, 0x36, 0x3B, 0x1D, 0xF5, 0x3A, 0x79, 0x5B,
0xB2, 0xC9, 0xEE, 0xC8, 0x27, 0xD2, 0x25, 0xCD, 0xE0, 0xA5, 0xBF, 0xD4, 0x2D, 0x84, 0xDC, 0x48,
0x90, 0xE2, 0xCC, 0xB6, 0x1D, 0x92, 0x66, 0xD1, 0x61, 0xA5, 0x84, 0x85, 0xDF, 0xFD, 0x85, 0xDF,
0x03, 0xFB, 0xD9, 0x6F, 0xBB, 0x8D, 0x0F, 0x7E, 0x7F, 0x6E, 0xD5, 0xFB, 0x1F, 0x7E, 0x75, 0xB7,
0xC8, 0xF9, 0x0C, 0x64, 0x64, 0x8D, 0xC4, 0x45, 0xE5, 0x14, 0x85, 0x89, 0x1C, 0xD2, 0x5A, 0x6B,
0xBD, 0xB2, 0x43, 0x0F, 0xAD, 0xF1, 0x9A, 0x4B, 0x3A, 0x7D, 0x9E, 0xBC, 0xB7, 0xD1, 0x70, 0xD6,
0x77, 0x9F, 0x08, 0xBF, 0x3C, 0x86, 0xBE, 0x72, 0xA1, 0xCA, 0x9A, 0x5D, 0x58, 0x9D, 0xBE, 0x1C,
0x3B, 0xB4, 0x22, 0x2E, 0x3A, 0x94, 0x10, 0x5F, 0xE9, 0x53, 0x42, 0xC2, 0xF0, 0xA4, 0x40, 0x15,
0x2C, 0x8B, 0xB0, 0x85, 0x32, 0x92, 0x5A, 0x65, 0x4A, 0x29, 0xD2, 0x4A, 0x52, 0xA7, 0xD2, 0xAF,
0xE5, 0x0D, 0xAE, 0x0D, 0x6A, 0x85, 0xBB, 0xE4, 0xB8, 0xA4, 0x4F, 0xA5, 0x52, 0x8E, 0x0F, 0xFE,
0x68, 0x84, 0xE1, 0x63, 0x5F, 0x06, 0xB0, 0x21, 0xFF, 0x4A, 0x03, 0x28, 0x39, 0xD7, 0x32, 0x81,
0xF3, 0x16, 0xEE, 0x3E, 0x07, 0x88, 0xC2, 0x05, 0x88, 0xD2, 0x07, 0x88, 0xD2, 0xB5, 0x17, 0x15,
0x4D, 0x7B, 0x51, 0x31, 0x0D, 0x30, 0x9A, 0xB7, 0x30, 0xB3, 0x01, 0x62, 0x2E, 0x6F, 0x25, 0xD6,
0xD7, 0xD2, 0x69, 0x90, 0x4F, 0x86, 0x12, 0x66, 0xC7, 0xA4, 0x47, 0x44, 0xBF, 0x23, 0x49, 0xEC,
0x55, 0x51, 0x3F, 0x18, 0x7C, 0x05, 0x45, 0xD0, 0xB1, 0x0D, 0x02, 0x31, 0x0C, 0x05, 0x50, 0xDB,
0x57, 0x50, 0x66, 0x84, 0x8C, 0xC0, 0x08, 0xC7, 0x3C, 0x34, 0x8C, 0x10, 0x36, 0x63, 0x05, 0x36,
0x20, 0xA2, 0xA4, 0x72, 0x41, 0x03, 0x8A, 0x62, 0xBE, 0x13, 0x47, 0x44, 0x72, 0xEE, 0xE5, 0xCB,
0x76, 0x71, 0x44, 0xFF, 0xC3, 0x35, 0x90, 0x03, 0x6C, 0x81, 0x1C, 0x60, 0x0B, 0xE4, 0x00, 0xDB,
0x77, 0x02, 0x23, 0x47, 0x07, 0x37, 0xA2, 0xE4, 0xC8, 0x3A, 0xF7, 0xB0, 0xDD, 0xCF, 0xB4, 0x57,
0x1F, 0x79, 0x74, 0x42, 0x33, 0x76, 0x58, 0xDB, 0x00, 0xEC, 0xB0, 0x9A, 0xAC, 0x7A, 0x60, 0x54,
0xAC, 0x8E, 0x60, 0x43, 0xE1, 0xDB, 0x69, 0x37, 0x7B, 0x02, 0x7A, 0xC0, 0x25, 0xA8, 0x53, 0xC1,
0x43, 0xC6, 0x2C, 0xDA, 0x01, 0x4D, 0x28, 0xC7, 0xEB, 0x86, 0xC0, 0xE1, 0xED, 0x0B, 0xE4, 0x78,
0x27, 0x0F, 0x80, 0x6B, 0xF6, 0x80, 0xA4, 0x53, 0xD1, 0x81, 0x26, 0x23, 0x20, 0xF9, 0x5C, 0x74,
0xC2, 0x66, 0x00, 0xE8, 0x42, 0xFC, 0x0E, 0xD1, 0x85, 0x71, 0xFF, 0x00,
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
};
static const EpdGlyph notosans_18_regularGlyphs[] = {
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0, 0, 0, 0, 0, 0, 0 }, // U+0000
{ 0, 0, 10, 0, 0, 0, 0 }, // U+000D
{ 0, 0, 10, 0, 0, 0, 0 }, // U+0020
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
{ 6, 28, 10, 2, 27, 42, 0 }, // !
{ 11, 10, 15, 2, 27, 28, 42 }, // "
{ 24, 27, 24, 0, 27, 162, 70 }, // #
{ 18, 32, 21, 2, 29, 144, 232 }, // $
{ 29, 29, 31, 1, 28, 211, 376 }, // %
{ 27, 29, 27, 1, 28, 196, 587 }, // &
{ 4, 10, 8, 2, 27, 10, 783 }, // '
{ 10, 33, 11, 1, 27, 83, 793 }, // (
{ 9, 33, 11, 1, 27, 75, 876 }, // )
{ 19, 18, 21, 1, 29, 86, 951 }, // *
{ 19, 19, 21, 1, 23, 91, 1037 }, // +
{ 7, 10, 10, 1, 5, 18, 1128 }, // ,
{ 10, 4, 12, 1, 12, 10, 1146 }, // -
{ 6, 6, 10, 2, 5, 9, 1156 }, // .
{ 14, 27, 14, 0, 27, 95, 1165 }, // /
{ 19, 29, 21, 1, 28, 138, 1260 }, // 0
{ 11, 27, 21, 3, 27, 75, 1398 }, // 1
{ 19, 28, 21, 1, 28, 133, 1473 }, // 2
{ 19, 29, 21, 1, 28, 138, 1606 }, // 3
{ 21, 27, 21, 0, 27, 142, 1744 }, // 4
{ 18, 28, 21, 2, 27, 126, 1886 }, // 5
{ 18, 29, 21, 2, 28, 131, 2012 }, // 6
{ 19, 27, 21, 1, 27, 129, 2143 }, // 7
{ 19, 29, 21, 1, 28, 138, 2272 }, // 8
{ 19, 29, 21, 1, 28, 138, 2410 }, // 9
{ 6, 22, 10, 2, 21, 33, 2548 }, // :
{ 7, 26, 10, 1, 21, 46, 2581 }, // ;
{ 19, 19, 21, 1, 23, 91, 2627 }, // <
{ 18, 11, 21, 2, 19, 50, 2718 }, // =
{ 19, 19, 21, 1, 23, 91, 2768 }, // >
{ 16, 29, 16, 0, 28, 116, 2859 }, // ?
{ 30, 31, 34, 2, 27, 233, 2975 }, // @
{ 24, 27, 24, 0, 27, 162, 3208 }, // A
{ 20, 27, 24, 3, 27, 135, 3370 }, // B
{ 21, 29, 24, 2, 28, 153, 3505 }, // C
{ 23, 27, 27, 3, 27, 156, 3658 }, // D
{ 16, 27, 21, 3, 27, 108, 3814 }, // E
{ 16, 27, 19, 3, 27, 108, 3922 }, // F
{ 23, 29, 27, 2, 28, 167, 4030 }, // G
{ 22, 27, 28, 3, 27, 149, 4197 }, // H
{ 11, 27, 13, 1, 27, 75, 4346 }, // I
{ 10, 35, 10, -3, 27, 88, 4421 }, // J
{ 21, 27, 23, 3, 27, 142, 4509 }, // K
{ 16, 27, 20, 3, 27, 108, 4651 }, // L
{ 28, 27, 34, 3, 27, 189, 4759 }, // M
{ 22, 27, 29, 3, 27, 149, 4948 }, // N
{ 25, 29, 29, 2, 28, 182, 5097 }, // O
{ 18, 27, 23, 3, 27, 122, 5279 }, // P
{ 25, 35, 29, 2, 28, 219, 5401 }, // Q
{ 20, 27, 23, 3, 27, 135, 5620 }, // R
{ 18, 29, 21, 1, 28, 131, 5755 }, // S
{ 21, 27, 21, 0, 27, 142, 5886 }, // T
{ 21, 28, 27, 3, 27, 147, 6028 }, // U
{ 23, 27, 23, 0, 27, 156, 6175 }, // V
{ 35, 27, 35, 0, 27, 237, 6331 }, // W
{ 22, 27, 22, 0, 27, 149, 6568 }, // X
{ 22, 27, 21, 0, 27, 149, 6717 }, // Y
{ 19, 27, 21, 1, 27, 129, 6866 }, // Z
{ 9, 33, 12, 3, 27, 75, 6995 }, // [
{ 14, 27, 14, 0, 27, 95, 7070 }, // <backslash>
{ 10, 33, 12, 0, 27, 83, 7165 }, // ]
{ 20, 17, 21, 1, 27, 85, 7248 }, // ^
{ 18, 3, 17, -1, -3, 14, 7333 }, // _
{ 9, 7, 11, 1, 29, 16, 7347 }, // `
{ 17, 22, 21, 1, 21, 94, 7363 }, // a
{ 18, 30, 23, 3, 29, 135, 7457 }, // b
{ 15, 22, 18, 2, 21, 83, 7592 }, // c
{ 18, 30, 23, 2, 29, 135, 7675 }, // d
{ 18, 22, 21, 2, 21, 99, 7810 }, // e
{ 15, 29, 13, 0, 29, 109, 7909 }, // f
{ 18, 30, 23, 2, 21, 135, 8018 }, // g
{ 18, 29, 23, 3, 29, 131, 8153 }, // h
{ 5, 28, 10, 2, 28, 35, 8284 }, // i
{ 10, 37, 10, -3, 28, 93, 8319 }, // j
{ 17, 29, 20, 3, 29, 124, 8412 }, // k
{ 4, 29, 10, 3, 29, 29, 8536 }, // l
{ 30, 21, 35, 3, 21, 158, 8565 }, // m
{ 18, 21, 23, 3, 21, 95, 8723 }, // n
{ 19, 22, 23, 2, 21, 105, 8818 }, // o
{ 18, 30, 23, 3, 21, 135, 8923 }, // p
{ 18, 30, 23, 2, 21, 135, 9058 }, // q
{ 12, 21, 15, 3, 21, 63, 9193 }, // r
{ 16, 22, 18, 1, 21, 88, 9256 }, // s
{ 13, 26, 14, 0, 25, 85, 9344 }, // t
{ 18, 22, 23, 2, 21, 99, 9429 }, // u
{ 20, 21, 19, 0, 21, 105, 9528 }, // v
{ 30, 21, 29, 0, 21, 158, 9633 }, // w
{ 20, 21, 20, 0, 21, 105, 9791 }, // x
{ 20, 30, 19, 0, 21, 150, 9896 }, // y
{ 16, 21, 18, 1, 21, 84, 10046 }, // z
{ 13, 33, 14, 1, 27, 108, 10130 }, // {
{ 4, 39, 21, 8, 29, 39, 10238 }, // |
{ 13, 33, 14, 1, 27, 108, 10277 }, // }
{ 19, 6, 21, 1, 16, 29, 10385 }, // ~
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0, 0, 10, 0, 0, 0, 0 }, // U+00A0
{ 6, 28, 10, 2, 21, 42, 0 }, // U+00A1
{ 16, 29, 21, 3, 28, 116, 42 }, // U+00A2
{ 20, 28, 21, 1, 28, 140, 158 }, // U+00A3
{ 18, 18, 21, 2, 22, 81, 298 }, // U+00A4
{ 21, 27, 21, 0, 27, 142, 379 }, // U+00A5
{ 4, 39, 21, 8, 29, 39, 521 }, // U+00A6
{ 15, 30, 19, 2, 29, 113, 560 }, // U+00A7
{ 12, 5, 22, 5, 28, 15, 673 }, // U+00A8
{ 29, 29, 31, 1, 28, 211, 688 }, // U+00A9
{ 11, 14, 13, 1, 28, 39, 899 }, // U+00AA
{ 17, 16, 19, 1, 18, 68, 938 }, // U+00AB
{ 19, 11, 21, 1, 15, 53, 1006 }, // U+00AC
{ 10, 4, 12, 1, 12, 10, 1059 }, // U+00AD
{ 29, 29, 31, 1, 28, 211, 1069 }, // U+00AE
{ 20, 3, 19, -1, 31, 15, 1280 }, // U+00AF
{ 12, 13, 16, 2, 28, 39, 1295 }, // U+00B0
{ 19, 23, 21, 1, 23, 110, 1334 }, // U+00B1
{ 12, 17, 13, 0, 32, 51, 1444 }, // U+00B2
{ 13, 17, 13, 0, 32, 56, 1495 }, // U+00B3
{ 9, 7, 11, 1, 29, 16, 1551 }, // U+00B4
{ 18, 30, 23, 3, 21, 135, 1567 }, // U+00B5
{ 19, 34, 25, 2, 29, 162, 1702 }, // U+00B6
{ 6, 6, 10, 2, 16, 9, 1864 }, // U+00B7
{ 8, 9, 8, 0, 0, 18, 1873 }, // U+00B8
{ 8, 17, 13, 1, 32, 34, 1891 }, // U+00B9
{ 12, 14, 14, 1, 28, 42, 1925 }, // U+00BA
{ 17, 16, 19, 1, 18, 68, 1967 }, // U+00BB
{ 27, 27, 28, 1, 27, 183, 2035 }, // U+00BC
{ 28, 27, 29, 0, 27, 189, 2218 }, // U+00BD
{ 29, 28, 29, 0, 28, 203, 2407 }, // U+00BE
{ 16, 29, 16, 0, 21, 116, 2610 }, // U+00BF
{ 24, 36, 24, 0, 36, 216, 2726 }, // U+00C0
{ 24, 36, 24, 0, 36, 216, 2942 }, // U+00C1
{ 24, 36, 24, 0, 36, 216, 3158 }, // U+00C2
{ 24, 35, 24, 0, 35, 210, 3374 }, // U+00C3
{ 24, 35, 24, 0, 35, 210, 3584 }, // U+00C4
{ 24, 33, 24, 0, 33, 198, 3794 }, // U+00C5
{ 32, 27, 33, -1, 27, 216, 3992 }, // U+00C6
{ 21, 37, 24, 2, 28, 195, 4208 }, // U+00C7
{ 16, 36, 21, 3, 36, 144, 4403 }, // U+00C8
{ 16, 36, 21, 3, 36, 144, 4547 }, // U+00C9
{ 16, 36, 21, 3, 36, 144, 4691 }, // U+00CA
{ 16, 35, 21, 3, 35, 140, 4835 }, // U+00CB
{ 11, 36, 13, 1, 36, 99, 4975 }, // U+00CC
{ 11, 36, 13, 1, 36, 99, 5074 }, // U+00CD
{ 13, 36, 13, 0, 36, 117, 5173 }, // U+00CE
{ 11, 35, 13, 1, 35, 97, 5290 }, // U+00CF
{ 25, 27, 27, 1, 27, 169, 5387 }, // U+00D0
{ 22, 35, 29, 3, 35, 193, 5556 }, // U+00D1
{ 25, 37, 29, 2, 36, 232, 5749 }, // U+00D2
{ 25, 37, 29, 2, 36, 232, 5981 }, // U+00D3
{ 25, 37, 29, 2, 36, 232, 6213 }, // U+00D4
{ 25, 36, 29, 2, 35, 225, 6445 }, // U+00D5
{ 25, 36, 29, 2, 35, 225, 6670 }, // U+00D6
{ 17, 18, 21, 2, 22, 77, 6895 }, // U+00D7
{ 25, 30, 29, 2, 28, 188, 6972 }, // U+00D8
{ 21, 37, 27, 3, 36, 195, 7160 }, // U+00D9
{ 21, 37, 27, 3, 36, 195, 7355 }, // U+00DA
{ 21, 37, 27, 3, 36, 195, 7550 }, // U+00DB
{ 21, 36, 27, 3, 35, 189, 7745 }, // U+00DC
{ 22, 36, 21, 0, 36, 198, 7934 }, // U+00DD
{ 18, 27, 23, 3, 27, 122, 8132 }, // U+00DE
{ 19, 30, 24, 3, 29, 143, 8254 }, // U+00DF
{ 17, 30, 21, 1, 29, 128, 8397 }, // U+00E0
{ 17, 30, 21, 1, 29, 128, 8525 }, // U+00E1
{ 17, 30, 21, 1, 29, 128, 8653 }, // U+00E2
{ 17, 29, 21, 1, 28, 124, 8781 }, // U+00E3
{ 17, 29, 21, 1, 28, 124, 8905 }, // U+00E4
{ 17, 32, 21, 1, 31, 136, 9029 }, // U+00E5
{ 30, 22, 32, 1, 21, 165, 9165 }, // U+00E6
{ 15, 30, 18, 2, 21, 113, 9330 }, // U+00E7
{ 18, 30, 21, 2, 29, 135, 9443 }, // U+00E8
{ 18, 30, 21, 2, 29, 135, 9578 }, // U+00E9
{ 18, 30, 21, 2, 29, 135, 9713 }, // U+00EA
{ 18, 29, 21, 2, 28, 131, 9848 }, // U+00EB
{ 9, 29, 10, -1, 29, 66, 9979 }, // U+00EC
{ 9, 29, 10, 2, 29, 66, 10045 }, // U+00ED
{ 14, 29, 10, -2, 29, 102, 10111 }, // U+00EE
{ 12, 28, 10, -1, 28, 84, 10213 }, // U+00EF
{ 19, 30, 23, 2, 29, 143, 10297 }, // U+00F0
{ 18, 28, 23, 3, 28, 126, 10440 }, // U+00F1
{ 19, 30, 23, 2, 29, 143, 10566 }, // U+00F2
{ 19, 30, 23, 2, 29, 143, 10709 }, // U+00F3
{ 19, 30, 23, 2, 29, 143, 10852 }, // U+00F4
{ 19, 29, 23, 2, 28, 138, 10995 }, // U+00F5
{ 19, 29, 23, 2, 28, 138, 11133 }, // U+00F6
{ 19, 18, 21, 1, 22, 86, 11271 }, // U+00F7
{ 19, 24, 23, 2, 22, 114, 11357 }, // U+00F8
{ 18, 30, 23, 2, 29, 135, 11471 }, // U+00F9
{ 18, 30, 23, 2, 29, 135, 11606 }, // U+00FA
{ 18, 30, 23, 2, 29, 135, 11741 }, // U+00FB
{ 18, 29, 23, 2, 28, 131, 11876 }, // U+00FC
{ 20, 38, 19, 0, 29, 190, 12007 }, // U+00FD
{ 18, 38, 23, 3, 29, 171, 12197 }, // U+00FE
{ 20, 37, 19, 0, 28, 185, 12368 }, // U+00FF
{ 24, 33, 24, 0, 33, 198, 0 }, // U+0100
{ 17, 27, 21, 1, 26, 115, 198 }, // U+0101
{ 24, 35, 24, 0, 35, 210, 313 }, // U+0102
{ 17, 29, 21, 1, 28, 124, 523 }, // U+0103
{ 24, 36, 24, 0, 27, 216, 647 }, // U+0104
{ 18, 30, 21, 1, 21, 135, 863 }, // U+0105
{ 21, 37, 24, 2, 36, 195, 998 }, // U+0106
{ 15, 30, 18, 2, 29, 113, 1193 }, // U+0107
{ 21, 37, 24, 2, 36, 195, 1306 }, // U+0108
{ 15, 30, 18, 2, 29, 113, 1501 }, // U+0109
{ 21, 36, 24, 2, 35, 189, 1614 }, // U+010A
{ 15, 29, 18, 2, 28, 109, 1803 }, // U+010B
{ 21, 37, 24, 2, 36, 195, 1912 }, // U+010C
{ 15, 30, 18, 2, 29, 113, 2107 }, // U+010D
{ 23, 36, 27, 3, 36, 207, 2220 }, // U+010E
{ 24, 30, 23, 2, 29, 180, 2427 }, // U+010F
{ 25, 27, 27, 1, 27, 169, 2607 }, // U+0110
{ 21, 30, 23, 2, 29, 158, 2776 }, // U+0111
{ 16, 33, 21, 3, 33, 132, 2934 }, // U+0112
{ 18, 27, 21, 2, 26, 122, 3066 }, // U+0113
{ 16, 35, 21, 3, 35, 140, 3188 }, // U+0114
{ 18, 29, 21, 2, 28, 131, 3328 }, // U+0115
{ 16, 35, 21, 3, 35, 140, 3459 }, // U+0116
{ 18, 29, 21, 2, 28, 131, 3599 }, // U+0117
{ 16, 36, 21, 3, 27, 144, 3730 }, // U+0118
{ 18, 30, 21, 2, 21, 135, 3874 }, // U+0119
{ 16, 36, 21, 3, 36, 144, 4009 }, // U+011A
{ 18, 30, 21, 2, 29, 135, 4153 }, // U+011B
{ 23, 37, 27, 2, 36, 213, 4288 }, // U+011C
{ 18, 38, 23, 2, 29, 171, 4501 }, // U+011D
{ 23, 36, 27, 2, 35, 207, 4672 }, // U+011E
{ 18, 37, 23, 2, 28, 167, 4879 }, // U+011F
{ 23, 36, 27, 2, 35, 207, 5046 }, // U+0120
{ 18, 37, 23, 2, 28, 167, 5253 }, // U+0121
{ 23, 37, 27, 2, 28, 213, 5420 }, // U+0122
{ 18, 38, 23, 2, 29, 171, 5633 }, // U+0123
{ 22, 36, 28, 3, 36, 198, 5804 }, // U+0124
{ 23, 37, 23, -2, 37, 213, 6002 }, // U+0125
{ 28, 27, 28, 0, 27, 189, 6215 }, // U+0126
{ 21, 29, 23, 0, 29, 153, 6404 }, // U+0127
{ 15, 35, 13, -1, 35, 132, 6557 }, // U+0128
{ 15, 28, 10, -3, 28, 105, 6689 }, // U+0129
{ 12, 33, 13, 0, 33, 99, 6794 }, // U+012A
{ 12, 26, 10, -1, 26, 78, 6893 }, // U+012B
{ 13, 35, 13, 0, 35, 114, 6971 }, // U+012C
{ 13, 28, 10, -2, 28, 91, 7085 }, // U+012D
{ 11, 36, 13, 1, 27, 99, 7176 }, // U+012E
{ 7, 37, 10, 1, 28, 65, 7275 }, // U+012F
{ 11, 35, 13, 1, 35, 97, 7340 }, // U+0130
{ 4, 21, 10, 3, 21, 21, 7437 }, // U+0131
{ 19, 35, 23, 1, 27, 167, 7458 }, // U+0132
{ 15, 37, 19, 2, 28, 139, 7625 }, // U+0133
{ 15, 44, 10, -3, 36, 165, 7764 }, // U+0134
{ 15, 38, 10, -3, 29, 143, 7929 }, // U+0135
{ 21, 36, 23, 3, 27, 189, 8072 }, // U+0136
{ 17, 38, 20, 3, 29, 162, 8261 }, // U+0137
{ 17, 21, 20, 3, 21, 90, 8423 }, // U+0138
{ 16, 36, 20, 3, 36, 144, 8513 }, // U+0139
{ 9, 37, 10, 2, 37, 84, 8657 }, // U+013A
{ 16, 36, 20, 3, 27, 144, 8741 }, // U+013B
{ 6, 38, 10, 2, 29, 57, 8885 }, // U+013C
{ 16, 27, 20, 3, 27, 108, 8942 }, // U+013D
{ 10, 29, 10, 3, 29, 73, 9050 }, // U+013E
{ 16, 27, 20, 3, 27, 108, 9123 }, // U+013F
{ 9, 29, 10, 3, 29, 66, 9231 }, // U+0140
{ 19, 27, 20, 0, 27, 129, 9297 }, // U+0141
{ 12, 29, 10, -1, 29, 87, 9426 }, // U+0142
{ 22, 36, 29, 3, 36, 198, 9513 }, // U+0143
{ 18, 29, 23, 3, 29, 131, 9711 }, // U+0144
{ 22, 36, 29, 3, 27, 198, 9842 }, // U+0145
{ 18, 30, 23, 3, 21, 135, 10040 }, // U+0146
{ 22, 36, 29, 3, 36, 198, 10175 }, // U+0147
{ 18, 29, 23, 3, 29, 131, 10373 }, // U+0148
{ 23, 27, 26, 0, 27, 156, 10504 }, // U+0149
{ 22, 35, 29, 3, 27, 193, 10660 }, // U+014A
{ 18, 30, 23, 3, 21, 135, 10853 }, // U+014B
{ 25, 34, 29, 2, 33, 213, 10988 }, // U+014C
{ 19, 27, 23, 2, 26, 129, 11201 }, // U+014D
{ 25, 36, 29, 2, 35, 225, 11330 }, // U+014E
{ 19, 29, 23, 2, 28, 138, 11555 }, // U+014F
{ 25, 37, 29, 2, 36, 232, 11693 }, // U+0150
{ 19, 30, 23, 2, 29, 143, 11925 }, // U+0151
{ 31, 29, 35, 2, 28, 225, 12068 }, // U+0152
{ 32, 22, 35, 2, 21, 176, 12293 }, // U+0153
{ 20, 36, 23, 3, 36, 180, 12469 }, // U+0154
{ 12, 29, 15, 3, 29, 87, 12649 }, // U+0155
{ 20, 36, 23, 3, 27, 180, 12736 }, // U+0156
{ 13, 30, 15, 2, 21, 98, 12916 }, // U+0157
{ 20, 36, 23, 3, 36, 180, 13014 }, // U+0158
{ 14, 29, 15, 2, 29, 102, 13194 }, // U+0159
{ 18, 37, 21, 1, 36, 167, 13296 }, // U+015A
{ 16, 30, 18, 1, 29, 120, 13463 }, // U+015B
{ 18, 37, 21, 1, 36, 167, 13583 }, // U+015C
{ 16, 30, 18, 1, 29, 120, 13750 }, // U+015D
{ 18, 37, 21, 1, 28, 167, 13870 }, // U+015E
{ 16, 30, 18, 1, 21, 120, 14037 }, // U+015F
{ 18, 37, 21, 1, 36, 167, 14157 }, // U+0160
{ 16, 30, 18, 1, 29, 120, 14324 }, // U+0161
{ 21, 36, 21, 0, 27, 189, 14444 }, // U+0162
{ 13, 34, 14, 0, 25, 111, 14633 }, // U+0163
{ 21, 36, 21, 0, 36, 189, 14744 }, // U+0164
{ 18, 30, 14, 0, 29, 135, 14933 }, // U+0165
{ 21, 27, 21, 0, 27, 142, 15068 }, // U+0166
{ 13, 26, 14, 0, 25, 85, 15210 }, // U+0167
{ 21, 36, 27, 3, 35, 189, 15295 }, // U+0168
{ 18, 29, 23, 2, 28, 131, 15484 }, // U+0169
{ 21, 34, 27, 3, 33, 179, 15615 }, // U+016A
{ 18, 27, 23, 2, 26, 122, 15794 }, // U+016B
{ 21, 36, 27, 3, 35, 189, 15916 }, // U+016C
{ 18, 29, 23, 2, 28, 131, 16105 }, // U+016D
{ 21, 39, 27, 3, 38, 205, 16236 }, // U+016E
{ 18, 32, 23, 2, 31, 144, 16441 }, // U+016F
{ 21, 37, 27, 3, 36, 195, 16585 }, // U+0170
{ 18, 30, 23, 2, 29, 135, 16780 }, // U+0171
{ 21, 36, 27, 3, 27, 189, 16915 }, // U+0172
{ 19, 30, 23, 2, 21, 143, 17104 }, // U+0173
{ 35, 36, 35, 0, 36, 315, 17247 }, // U+0174
{ 30, 29, 29, 0, 29, 218, 17562 }, // U+0175
{ 22, 36, 21, 0, 36, 198, 17780 }, // U+0176
{ 20, 38, 19, 0, 29, 190, 17978 }, // U+0177
{ 22, 35, 21, 0, 35, 193, 18168 }, // U+0178
{ 19, 36, 21, 1, 36, 171, 18361 }, // U+0179
{ 16, 29, 18, 1, 29, 116, 18532 }, // U+017A
{ 19, 35, 21, 1, 35, 167, 18648 }, // U+017B
{ 16, 28, 18, 1, 28, 112, 18815 }, // U+017C
{ 19, 36, 21, 1, 36, 171, 18927 }, // U+017D
{ 16, 29, 18, 1, 29, 116, 19098 }, // U+017E
{ 11, 29, 12, 3, 29, 80, 19214 }, // U+017F
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 29, 30, 29, 2, 29, 218, 0 }, // U+01A0
{ 23, 25, 23, 2, 24, 144, 218 }, // U+01A1
{ 28, 30, 29, 3, 29, 210, 362 }, // U+01AF
{ 25, 25, 25, 2, 24, 157, 572 }, // U+01B0
{ 44, 36, 48, 3, 36, 396, 729 }, // U+01C4
{ 41, 29, 45, 3, 29, 298, 1125 }, // U+01C5
{ 38, 30, 41, 2, 29, 285, 1423 }, // U+01C6
{ 24, 35, 30, 3, 27, 210, 1708 }, // U+01C7
{ 24, 37, 29, 3, 28, 222, 1918 }, // U+01C8
{ 14, 38, 19, 3, 29, 133, 2140 }, // U+01C9
{ 33, 35, 39, 3, 27, 289, 2273 }, // U+01CA
{ 33, 37, 38, 3, 28, 306, 2562 }, // U+01CB
{ 27, 37, 33, 3, 28, 250, 2868 }, // U+01CC
{ 24, 36, 24, 0, 36, 216, 3118 }, // U+01CD
{ 17, 30, 21, 1, 29, 128, 3334 }, // U+01CE
{ 13, 36, 13, 0, 36, 117, 3462 }, // U+01CF
{ 14, 29, 10, -2, 29, 102, 3579 }, // U+01D0
{ 25, 37, 29, 2, 36, 232, 3681 }, // U+01D1
{ 19, 30, 23, 2, 29, 143, 3913 }, // U+01D2
{ 21, 37, 27, 3, 36, 195, 4056 }, // U+01D3
{ 18, 30, 23, 2, 29, 135, 4251 }, // U+01D4
{ 21, 40, 27, 3, 39, 210, 4386 }, // U+01D5
{ 18, 33, 23, 2, 32, 149, 4596 }, // U+01D6
{ 21, 41, 27, 3, 40, 216, 4745 }, // U+01D7
{ 18, 34, 23, 2, 33, 153, 4961 }, // U+01D8
{ 21, 41, 27, 3, 40, 216, 5114 }, // U+01D9
{ 18, 35, 23, 2, 34, 158, 5330 }, // U+01DA
{ 21, 41, 27, 3, 40, 216, 5488 }, // U+01DB
{ 18, 34, 23, 2, 33, 153, 5704 }, // U+01DC
{ 19, 22, 21, 1, 21, 105, 5857 }, // U+01DD
{ 24, 39, 24, 0, 39, 234, 5962 }, // U+01DE
{ 17, 33, 21, 1, 32, 141, 6196 }, // U+01DF
{ 24, 38, 24, 0, 38, 228, 6337 }, // U+01E0
{ 17, 33, 21, 1, 32, 141, 6565 }, // U+01E1
{ 32, 33, 33, -1, 33, 264, 6706 }, // U+01E2
{ 30, 27, 32, 1, 26, 203, 6970 }, // U+01E3
{ 25, 29, 27, 2, 28, 182, 7173 }, // U+01E4
{ 20, 30, 23, 2, 21, 150, 7355 }, // U+01E5
{ 23, 37, 27, 2, 36, 213, 7505 }, // U+01E6
{ 18, 38, 23, 2, 29, 171, 7718 }, // U+01E7
{ 21, 36, 23, 3, 36, 189, 7889 }, // U+01E8
{ 22, 37, 20, -2, 37, 204, 8078 }, // U+01E9
{ 25, 37, 29, 2, 28, 232, 8282 }, // U+01EA
{ 19, 30, 23, 2, 21, 143, 8514 }, // U+01EB
{ 25, 42, 29, 2, 33, 263, 8657 }, // U+01EC
{ 19, 35, 23, 2, 26, 167, 8920 }, // U+01ED
{ 19, 37, 22, 1, 36, 176, 9087 }, // U+01EE
{ 18, 38, 19, 0, 29, 171, 9263 }, // U+01EF
{ 15, 38, 10, -3, 29, 143, 9434 }, // U+01F0
{ 44, 27, 48, 3, 27, 297, 9577 }, // U+01F1
{ 41, 27, 45, 3, 27, 277, 9874 }, // U+01F2
{ 38, 30, 41, 2, 29, 285, 10151 }, // U+01F3
{ 23, 37, 27, 2, 36, 213, 10436 }, // U+01F4
{ 18, 38, 23, 2, 29, 171, 10649 }, // U+01F5
{ 29, 28, 35, 3, 27, 203, 10820 }, // U+01F6
{ 20, 37, 25, 3, 28, 185, 11023 }, // U+01F7
{ 22, 36, 29, 3, 36, 198, 11208 }, // U+01F8
{ 18, 29, 23, 3, 29, 131, 11406 }, // U+01F9
{ 24, 36, 24, 0, 36, 216, 11537 }, // U+01FA
{ 17, 37, 21, 1, 36, 158, 11753 }, // U+01FB
{ 32, 36, 33, -1, 36, 288, 11911 }, // U+01FC
{ 30, 30, 32, 1, 29, 225, 12199 }, // U+01FD
{ 25, 38, 29, 2, 36, 238, 12424 }, // U+01FE
{ 19, 31, 23, 2, 29, 148, 12662 }, // U+01FF
{ 24, 36, 24, 0, 36, 216, 12810 }, // U+0200
{ 17, 30, 21, 1, 29, 128, 13026 }, // U+0201
{ 24, 35, 24, 0, 35, 210, 13154 }, // U+0202
{ 17, 29, 21, 1, 28, 124, 13364 }, // U+0203
{ 16, 36, 21, 3, 36, 144, 13488 }, // U+0204
{ 18, 30, 21, 2, 29, 135, 13632 }, // U+0205
{ 16, 35, 21, 3, 35, 140, 13767 }, // U+0206
{ 18, 29, 21, 2, 28, 131, 13907 }, // U+0207
{ 15, 36, 13, -3, 36, 135, 14038 }, // U+0208
{ 14, 29, 10, -4, 29, 102, 14173 }, // U+0209
{ 13, 35, 13, 0, 35, 114, 14275 }, // U+020A
{ 12, 28, 10, -1, 28, 84, 14389 }, // U+020B
{ 25, 37, 29, 2, 36, 232, 14473 }, // U+020C
{ 19, 30, 23, 2, 29, 143, 14705 }, // U+020D
{ 25, 36, 29, 2, 35, 225, 14848 }, // U+020E
{ 19, 29, 23, 2, 28, 138, 15073 }, // U+020F
{ 20, 36, 23, 3, 36, 180, 15211 }, // U+0210
{ 15, 29, 15, 0, 29, 109, 15391 }, // U+0211
{ 20, 35, 23, 3, 35, 175, 15500 }, // U+0212
{ 12, 28, 15, 3, 28, 84, 15675 }, // U+0213
{ 21, 37, 27, 3, 36, 195, 15759 }, // U+0214
{ 18, 30, 23, 2, 29, 135, 15954 }, // U+0215
{ 21, 36, 27, 3, 35, 189, 16089 }, // U+0216
{ 18, 29, 23, 2, 28, 131, 16278 }, // U+0217
{ 18, 37, 21, 1, 28, 167, 16409 }, // U+0218
{ 16, 30, 18, 1, 21, 120, 16576 }, // U+0219
{ 21, 36, 21, 0, 27, 189, 16696 }, // U+021A
{ 13, 34, 14, 0, 25, 111, 16885 }, // U+021B
{ 19, 35, 22, 1, 28, 167, 16996 }, // U+021C
{ 16, 30, 19, 1, 21, 120, 17163 }, // U+021D
{ 22, 36, 28, 3, 36, 198, 17283 }, // U+021E
{ 23, 37, 23, -2, 37, 213, 17481 }, // U+021F
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 9, 7, 0, -19, 29, 16, 0 }, // U+0300
{ 9, 7, 0, -13, 29, 16, 16 }, // U+0301
{ 14, 7, 0, -7, 29, 25, 32 }, // U+0302
{ 15, 6, 0, -19, 28, 23, 57 }, // U+0303
{ 12, 4, 0, -6, 26, 12, 80 }, // U+0304
{ 16, 4, 0, -8, 32, 16, 92 }, // U+0305
{ 12, 6, 0, -6, 28, 18, 108 }, // U+0306
{ 4, 5, 0, -2, 28, 5, 126 }, // U+0307
{ 12, 5, 0, -6, 28, 15, 131 }, // U+0308
{ 7, 9, 0, -14, 31, 16, 146 }, // U+0309
{ 10, 9, 0, -5, 31, 23, 162 }, // U+030A
{ 14, 7, 0, -5, 29, 25, 185 }, // U+030B
{ 14, 7, 0, -7, 29, 25, 210 }, // U+030C
{ 4, 7, 0, -2, 29, 7, 235 }, // U+030D
{ 10, 7, 0, -5, 29, 18, 242 }, // U+030E
{ 15, 7, 0, -20, 29, 27, 260 }, // U+030F
{ 12, 10, 0, -6, 32, 30, 287 }, // U+0310
{ 12, 6, 0, -6, 28, 18, 317 }, // U+0311
{ 6, 10, 0, -3, 27, 15, 335 }, // U+0312
{ 6, 10, 0, -3, 27, 15, 350 }, // U+0313
{ 6, 10, 0, -3, 27, 15, 365 }, // U+0314
{ 6, 10, 0, -3, 27, 15, 380 }, // U+0315
{ 8, 7, 0, -4, -1, 14, 395 }, // U+0316
{ 8, 7, 0, -4, -1, 14, 409 }, // U+0317
{ 8, 8, 0, -4, -1, 16, 423 }, // U+0318
{ 8, 8, 0, -4, -1, 16, 439 }, // U+0319
{ 11, 10, 12, 0, 29, 28, 455 }, // U+031A
{ 9, 9, 0, -4, 29, 21, 483 }, // U+031B
{ 5, 9, 0, -2, 0, 12, 504 }, // U+031C
{ 8, 7, 0, -4, -1, 14, 516 }, // U+031D
{ 8, 7, 0, -4, -1, 14, 530 }, // U+031E
{ 8, 8, 0, -4, -1, 16, 544 }, // U+031F
{ 10, 3, 0, -5, -3, 8, 560 }, // U+0320
{ 7, 11, 0, -7, 2, 20, 568 }, // U+0321
{ 7, 11, 0, 0, 2, 20, 588 }, // U+0322
{ 5, 5, 0, -14, -2, 7, 608 }, // U+0323
{ 12, 5, 0, -6, -2, 15, 615 }, // U+0324
{ 10, 9, 0, -5, 0, 23, 630 }, // U+0325
{ 6, 7, 0, -3, -2, 11, 653 }, // U+0326
{ 8, 9, 0, -4, 0, 18, 664 }, // U+0327
{ 8, 10, 0, -4, 1, 20, 682 }, // U+0328
{ 4, 7, 0, -2, -1, 7, 702 }, // U+0329
{ 14, 8, 0, -7, -1, 28, 709 }, // U+032A
{ 16, 5, 0, -8, -2, 20, 737 }, // U+032B
{ 14, 7, 0, -7, -1, 25, 757 }, // U+032C
{ 14, 7, 0, -7, -1, 25, 782 }, // U+032D
{ 12, 6, 0, -6, -2, 18, 807 }, // U+032E
{ 12, 6, 0, -6, -2, 18, 825 }, // U+032F
{ 14, 6, 0, -7, -2, 21, 843 }, // U+0330
{ 12, 4, 0, -6, -2, 12, 864 }, // U+0331
{ 18, 3, 0, -9, -3, 14, 876 }, // U+0332
{ 16, 9, 0, -8, 0, 36, 890 }, // U+0333
{ 15, 6, 0, -7, 13, 23, 926 }, // U+0334
{ 16, 4, 0, -8, 13, 16, 949 }, // U+0335
{ 28, 3, 0, -14, 12, 21, 965 }, // U+0336
{ 12, 9, 0, -6, 15, 27, 986 }, // U+0337
{ 16, 32, 0, -8, 29, 128, 1013 }, // U+0338
{ 5, 9, 0, -2, 0, 12, 1141 }, // U+0339
{ 14, 8, 0, -7, -1, 28, 1153 }, // U+033A
{ 16, 8, 0, -8, -1, 32, 1181 }, // U+033B
{ 16, 5, 0, -8, -2, 20, 1213 }, // U+033C
{ 8, 9, 0, -4, 30, 18, 1233 }, // U+033D
{ 6, 12, 0, -3, 33, 18, 1251 }, // U+033E
{ 16, 9, 0, -8, 37, 36, 1269 }, // U+033F
{ 8, 7, 0, -6, 29, 14, 1305 }, // U+0340
{ 9, 7, 0, -2, 29, 16, 1319 }, // U+0341
{ 14, 6, 0, -7, 28, 21, 1335 }, // U+0342
{ 6, 8, 0, -3, 30, 12, 1356 }, // U+0343
{ 14, 8, 0, -6, 30, 28, 1368 }, // U+0344
{ 6, 6, 0, -2, -3, 9, 1396 }, // U+0345
{ 18, 7, 0, -9, 29, 32, 1405 }, // U+0346
{ 16, 9, 0, -8, 0, 36, 1437 }, // U+0347
{ 10, 7, 0, -5, -1, 18, 1473 }, // U+0348
{ 8, 7, 0, -4, -2, 14, 1491 }, // U+0349
{ 14, 8, 0, -7, 29, 28, 1505 }, // U+034A
{ 14, 14, 0, -7, 35, 49, 1533 }, // U+034B
{ 14, 11, 0, -7, 33, 39, 1582 }, // U+034C
{ 14, 8, 0, -7, -1, 28, 1621 }, // U+034D
{ 8, 9, 0, -4, 0, 18, 1649 }, // U+034E
{ 28, 27, 0, -14, 27, 189, 1667 }, // U+034F
{ 7, 8, 0, -4, 30, 14, 1856 }, // U+0350
{ 5, 9, 0, -2, 31, 12, 1870 }, // U+0351
{ 12, 10, 0, -6, 32, 30, 1882 }, // U+0352
{ 8, 8, 0, -4, -1, 16, 1912 }, // U+0353
{ 7, 8, 0, -4, -1, 14, 1928 }, // U+0354
{ 7, 8, 0, -4, -1, 14, 1942 }, // U+0355
{ 15, 8, 0, -7, -1, 30, 1956 }, // U+0356
{ 5, 9, 0, -2, 31, 12, 1986 }, // U+0357
{ 5, 5, 0, 4, 28, 7, 1998 }, // U+0358
{ 8, 8, 0, -4, -1, 16, 2005 }, // U+0359
{ 16, 8, 0, -8, -1, 32, 2021 }, // U+035A
{ 8, 8, 0, -4, 30, 16, 2053 }, // U+035B
{ 30, 8, 0, -15, -1, 60, 2069 }, // U+035C
{ 30, 8, 0, -15, 30, 60, 2129 }, // U+035D
{ 24, 3, 0, -12, 26, 18, 2189 }, // U+035E
{ 24, 3, 0, -12, -2, 18, 2207 }, // U+035F
{ 30, 6, 0, -15, 28, 45, 2225 }, // U+0360
{ 30, 8, 0, -15, 32, 60, 2270 }, // U+0361
{ 30, 8, 0, -14, -1, 60, 2330 }, // U+0362
{ 8, 9, 0, -4, 32, 18, 2390 }, // U+0363
{ 9, 9, 0, -4, 32, 21, 2408 }, // U+0364
{ 3, 12, 0, -1, 35, 9, 2429 }, // U+0365
{ 9, 9, 0, -4, 32, 21, 2438 }, // U+0366
{ 9, 9, 0, -4, 32, 21, 2459 }, // U+0367
{ 7, 9, 0, -3, 32, 16, 2480 }, // U+0368
{ 9, 12, 0, -4, 35, 27, 2496 }, // U+0369
{ 9, 12, 0, -4, 35, 27, 2523 }, // U+036A
{ 14, 9, 0, -7, 32, 32, 2550 }, // U+036B
{ 6, 9, 0, -2, 32, 14, 2582 }, // U+036C
{ 7, 11, 0, -3, 34, 20, 2596 }, // U+036D
{ 9, 9, 0, -4, 32, 21, 2616 }, // U+036E
{ 9, 9, 0, -4, 32, 21, 2637 }, // U+036F
{ 16, 36, 21, 3, 36, 144, 0 }, // U+0400
{ 16, 34, 21, 3, 34, 136, 144 }, // U+0401
{ 25, 28, 27, 0, 27, 175, 280 }, // U+0402
{ 16, 36, 19, 3, 36, 144, 455 }, // U+0403
{ 21, 29, 24, 2, 28, 153, 599 }, // U+0404
{ 18, 29, 21, 1, 28, 131, 752 }, // U+0405
{ 5, 27, 11, 3, 27, 34, 883 }, // U+0406
{ 9, 34, 11, 1, 34, 77, 917 }, // U+0407
{ 10, 35, 10, -3, 27, 88, 994 }, // U+0408
{ 36, 28, 38, 0, 27, 252, 1082 }, // U+0409
{ 34, 27, 39, 3, 27, 230, 1334 }, // U+040A
{ 25, 27, 27, 0, 27, 169, 1564 }, // U+040B
{ 21, 36, 23, 3, 36, 189, 1733 }, // U+040C
{ 22, 36, 28, 3, 36, 198, 1922 }, // U+040D
{ 24, 35, 23, 0, 34, 210, 2120 }, // U+040E
{ 21, 33, 27, 3, 27, 174, 2330 }, // U+040F
{ 24, 27, 24, 0, 27, 162, 2504 }, // U+0410
{ 19, 27, 23, 3, 27, 129, 2666 }, // U+0411
{ 20, 27, 24, 3, 27, 135, 2795 }, // U+0412
{ 16, 27, 19, 3, 27, 108, 2930 }, // U+0413
{ 27, 33, 27, 0, 27, 223, 3038 }, // U+0414
{ 16, 27, 21, 3, 27, 108, 3261 }, // U+0415
{ 34, 27, 34, 0, 27, 230, 3369 }, // U+0416
{ 19, 29, 22, 1, 28, 138, 3599 }, // U+0417
{ 22, 27, 28, 3, 27, 149, 3737 }, // U+0418
{ 22, 34, 28, 3, 34, 187, 3886 }, // U+0419
{ 21, 27, 23, 3, 27, 142, 4073 }, // U+041A
{ 23, 28, 26, 0, 27, 161, 4215 }, // U+041B
{ 28, 27, 34, 3, 27, 189, 4376 }, // U+041C
{ 22, 27, 28, 3, 27, 149, 4565 }, // U+041D
{ 25, 29, 29, 2, 28, 182, 4714 }, // U+041E
{ 21, 27, 27, 3, 27, 142, 4896 }, // U+041F
{ 18, 27, 23, 3, 27, 122, 5038 }, // U+0420
{ 21, 29, 24, 2, 28, 153, 5160 }, // U+0421
{ 21, 27, 21, 0, 27, 142, 5313 }, // U+0422
{ 24, 28, 23, 0, 27, 168, 5455 }, // U+0423
{ 28, 29, 31, 1, 28, 203, 5623 }, // U+0424
{ 22, 27, 22, 0, 27, 149, 5826 }, // U+0425
{ 25, 33, 28, 3, 27, 207, 5975 }, // U+0426
{ 20, 27, 25, 2, 27, 135, 6182 }, // U+0427
{ 33, 27, 39, 3, 27, 223, 6317 }, // U+0428
{ 36, 33, 38, 3, 27, 297, 6540 }, // U+0429
{ 24, 27, 26, 0, 27, 162, 6837 }, // U+042A
{ 26, 27, 32, 3, 27, 176, 6999 }, // U+042B
{ 18, 27, 23, 3, 27, 122, 7175 }, // U+042C
{ 22, 29, 24, 1, 28, 160, 7297 }, // U+042D
{ 33, 29, 37, 3, 28, 240, 7457 }, // U+042E
{ 20, 27, 24, 1, 27, 135, 7697 }, // U+042F
{ 17, 22, 21, 1, 21, 94, 7832 }, // U+0430
{ 20, 30, 22, 1, 29, 150, 7926 }, // U+0431
{ 17, 21, 21, 3, 21, 90, 8076 }, // U+0432
{ 13, 21, 16, 3, 21, 69, 8166 }, // U+0433
{ 23, 27, 23, 0, 21, 156, 8235 }, // U+0434
{ 18, 22, 21, 1, 21, 99, 8391 }, // U+0435
{ 29, 21, 28, 0, 21, 153, 8490 }, // U+0436
{ 16, 22, 18, 1, 21, 88, 8643 }, // U+0437
{ 18, 21, 23, 3, 21, 95, 8731 }, // U+0438
{ 18, 28, 23, 3, 28, 126, 8826 }, // U+0439
{ 17, 21, 20, 3, 21, 90, 8952 }, // U+043A
{ 19, 22, 22, 0, 21, 105, 9042 }, // U+043B
{ 23, 21, 29, 3, 21, 121, 9147 }, // U+043C
{ 17, 21, 23, 3, 21, 90, 9268 }, // U+043D
{ 20, 22, 22, 1, 21, 110, 9358 }, // U+043E
{ 17, 21, 23, 3, 21, 90, 9468 }, // U+043F
{ 18, 30, 23, 3, 21, 135, 9558 }, // U+0440
{ 16, 22, 18, 1, 21, 88, 9693 }, // U+0441
{ 17, 21, 17, 0, 21, 90, 9781 }, // U+0442
{ 20, 30, 19, 0, 21, 150, 9871 }, // U+0443
{ 25, 38, 28, 1, 29, 238, 10021 }, // U+0444
{ 19, 21, 19, 0, 21, 100, 10259 }, // U+0445
{ 20, 27, 23, 3, 21, 135, 10359 }, // U+0446
{ 17, 21, 22, 2, 21, 90, 10494 }, // U+0447
{ 28, 21, 34, 3, 21, 147, 10584 }, // U+0448
{ 31, 27, 34, 3, 21, 210, 10731 }, // U+0449
{ 22, 21, 23, 0, 21, 116, 10941 }, // U+044A
{ 23, 21, 28, 3, 21, 121, 11057 }, // U+044B
{ 16, 21, 20, 3, 21, 84, 11178 }, // U+044C
{ 16, 22, 19, 1, 21, 88, 11262 }, // U+044D
{ 26, 22, 30, 3, 21, 143, 11350 }, // U+044E
{ 18, 21, 22, 1, 21, 95, 11493 }, // U+044F
{ 18, 30, 21, 1, 29, 135, 11588 }, // U+0450
{ 18, 29, 21, 1, 28, 131, 11723 }, // U+0451
{ 21, 38, 23, 0, 29, 200, 11854 }, // U+0452
{ 13, 29, 16, 3, 29, 95, 12054 }, // U+0453
{ 16, 22, 18, 1, 21, 88, 12149 }, // U+0454
{ 15, 22, 18, 1, 21, 83, 12237 }, // U+0455
{ 5, 28, 10, 2, 28, 35, 12320 }, // U+0456
{ 9, 28, 10, 0, 28, 63, 12355 }, // U+0457
{ 10, 37, 10, -3, 28, 93, 12418 }, // U+0458
{ 31, 22, 32, 0, 21, 171, 12511 }, // U+0459
{ 29, 21, 33, 3, 21, 153, 12682 }, // U+045A
{ 21, 29, 23, 0, 29, 153, 12835 }, // U+045B
{ 17, 29, 20, 3, 29, 124, 12988 }, // U+045C
{ 18, 29, 23, 3, 29, 131, 13112 }, // U+045D
{ 20, 37, 19, 0, 28, 185, 13243 }, // U+045E
{ 17, 27, 23, 3, 21, 115, 13428 }, // U+045F
{ 34, 28, 34, 0, 27, 238, 13543 }, // U+0460
{ 29, 21, 30, 0, 21, 153, 13781 }, // U+0461
{ 24, 27, 25, 0, 27, 162, 13934 }, // U+0462
{ 22, 25, 24, 0, 25, 138, 14096 }, // U+0463
{ 31, 29, 35, 3, 28, 225, 14234 }, // U+0464
{ 24, 22, 28, 3, 21, 132, 14459 }, // U+0465
{ 26, 27, 26, 0, 27, 176, 14591 }, // U+0466
{ 22, 21, 21, 0, 21, 116, 14767 }, // U+0467
{ 32, 27, 35, 3, 27, 216, 14883 }, // U+0468
{ 27, 21, 29, 3, 21, 142, 15099 }, // U+0469
{ 27, 27, 27, 0, 27, 183, 15241 }, // U+046A
{ 24, 21, 24, 0, 21, 126, 15424 }, // U+046B
{ 34, 27, 37, 3, 27, 230, 15550 }, // U+046C
{ 29, 21, 32, 3, 21, 153, 15780 }, // U+046D
{ 19, 41, 22, 1, 32, 195, 15933 }, // U+046E
{ 17, 33, 18, 0, 25, 141, 16128 }, // U+046F
{ 25, 27, 30, 3, 27, 169, 16269 }, // U+0470
{ 24, 38, 29, 2, 29, 228, 16438 }, // U+0471
{ 25, 29, 29, 2, 28, 182, 16666 }, // U+0472
{ 19, 22, 23, 2, 21, 105, 16848 }, // U+0473
{ 25, 27, 24, 0, 27, 169, 16953 }, // U+0474
{ 21, 21, 19, 0, 21, 111, 17122 }, // U+0475
{ 25, 36, 24, 0, 36, 225, 17233 }, // U+0476
{ 21, 29, 19, 0, 29, 153, 17458 }, // U+0477
{ 44, 37, 46, 2, 28, 407, 17611 }, // U+0478
{ 40, 30, 41, 2, 21, 300, 18018 }, // U+0479
{ 27, 32, 31, 2, 29, 216, 18318 }, // U+047A
{ 21, 25, 25, 2, 23, 132, 18534 }, // U+047B
{ 35, 40, 38, 2, 39, 350, 18666 }, // U+047C
{ 30, 35, 34, 2, 34, 263, 19016 }, // U+047D
{ 34, 35, 34, 0, 34, 298, 19279 }, // U+047E
{ 29, 27, 30, 0, 27, 196, 19577 }, // U+047F
{ 22, 37, 24, 2, 28, 204, 19773 }, // U+0480
{ 16, 30, 18, 2, 21, 120, 19977 }, // U+0481
{ 20, 25, 23, 1, 24, 125, 20097 }, // U+0482
{ 15, 6, 0, -18, 27, 23, 20222 }, // U+0483
{ 15, 6, 0, -18, 28, 23, 20245 }, // U+0484
{ 5, 8, 0, -13, 30, 10, 20268 }, // U+0485
{ 5, 8, 0, -13, 30, 10, 20278 }, // U+0486
{ 14, 6, 0, -7, 34, 21, 20288 }, // U+0487
{ 44, 40, 0, -22, 30, 440, 20309 }, // U+0488
{ 42, 42, 0, -21, 31, 441, 20749 }, // U+0489
{ 26, 43, 29, 3, 35, 280, 21190 }, // U+048A
{ 22, 36, 25, 3, 29, 198, 21470 }, // U+048B
{ 22, 27, 23, 0, 27, 149, 21668 }, // U+048C
{ 21, 29, 22, 0, 29, 153, 21817 }, // U+048D
{ 19, 27, 23, 3, 27, 129, 21970 }, // U+048E
{ 18, 30, 23, 3, 21, 135, 22099 }, // U+048F
{ 17, 33, 20, 3, 33, 141, 22234 }, // U+0490
{ 13, 26, 16, 3, 26, 85, 22375 }, // U+0491
{ 20, 27, 20, 0, 27, 135, 22460 }, // U+0492
{ 16, 21, 16, 0, 21, 84, 22595 }, // U+0493
{ 21, 37, 24, 3, 27, 195, 22679 }, // U+0494
{ 16, 31, 20, 3, 21, 124, 22874 }, // U+0495
{ 34, 35, 34, 0, 27, 298, 22998 }, // U+0496
{ 30, 28, 30, 0, 21, 210, 23296 }, // U+0497
{ 19, 37, 22, 1, 28, 176, 23506 }, // U+0498
{ 16, 30, 18, 1, 21, 120, 23682 }, // U+0499
{ 22, 35, 25, 3, 27, 193, 23802 }, // U+049A
{ 18, 28, 21, 3, 21, 126, 23995 }, // U+049B
{ 21, 27, 23, 3, 27, 142, 24121 }, // U+049C
{ 17, 21, 20, 3, 21, 90, 24263 }, // U+049D
{ 24, 27, 23, 0, 27, 162, 24353 }, // U+049E
{ 20, 29, 20, 0, 29, 145, 24515 }, // U+049F
{ 26, 27, 26, 0, 27, 176, 24660 }, // U+04A0
{ 24, 21, 23, 0, 21, 126, 24836 }, // U+04A1
{ 25, 35, 28, 3, 27, 219, 24962 }, // U+04A2
{ 21, 28, 25, 3, 21, 147, 25181 }, // U+04A3
{ 28, 27, 31, 3, 27, 189, 25328 }, // U+04A4
{ 25, 21, 28, 3, 21, 132, 25517 }, // U+04A5
{ 36, 37, 40, 3, 27, 333, 25649 }, // U+04A6
{ 29, 31, 32, 3, 21, 225, 25982 }, // U+04A7
{ 26, 30, 29, 2, 28, 195, 26207 }, // U+04A8
{ 21, 23, 24, 2, 21, 121, 26402 }, // U+04A9
{ 21, 37, 24, 2, 28, 195, 26523 }, // U+04AA
{ 15, 30, 18, 2, 21, 113, 26718 }, // U+04AB
{ 21, 35, 21, 0, 27, 184, 26831 }, // U+04AC
{ 18, 28, 18, 0, 21, 126, 27015 }, // U+04AD
{ 22, 27, 21, 0, 27, 149, 27141 }, // U+04AE
{ 20, 30, 19, 0, 21, 150, 27290 }, // U+04AF
{ 22, 27, 21, 0, 27, 149, 27440 }, // U+04B0
{ 20, 30, 19, 0, 21, 150, 27589 }, // U+04B1
{ 24, 35, 24, 0, 27, 210, 27739 }, // U+04B2
{ 21, 28, 21, 0, 21, 147, 27949 }, // U+04B3
{ 32, 35, 32, 0, 27, 280, 28096 }, // U+04B4
{ 27, 28, 27, 0, 21, 189, 28376 }, // U+04B5
{ 23, 35, 26, 3, 27, 202, 28565 }, // U+04B6
{ 21, 28, 23, 2, 21, 147, 28767 }, // U+04B7
{ 20, 27, 26, 3, 27, 135, 28914 }, // U+04B8
{ 18, 21, 23, 2, 21, 95, 29049 }, // U+04B9
{ 21, 27, 26, 3, 27, 142, 29144 }, // U+04BA
{ 18, 29, 23, 3, 29, 131, 29286 }, // U+04BB
{ 29, 29, 32, 1, 28, 211, 29417 }, // U+04BC
{ 24, 22, 25, 0, 21, 132, 29628 }, // U+04BD
{ 29, 36, 32, 1, 28, 261, 29760 }, // U+04BE
{ 24, 28, 25, 0, 21, 168, 30021 }, // U+04BF
{ 11, 27, 13, 1, 27, 75, 30189 }, // U+04C0
{ 34, 34, 34, 0, 34, 289, 30264 }, // U+04C1
{ 29, 28, 28, 0, 28, 203, 30553 }, // U+04C2
{ 22, 37, 26, 3, 27, 204, 30756 }, // U+04C3
{ 17, 31, 21, 3, 21, 132, 30960 }, // U+04C4
{ 27, 35, 27, 0, 27, 237, 31092 }, // U+04C5
{ 22, 28, 22, 0, 21, 154, 31329 }, // U+04C6
{ 22, 37, 27, 3, 27, 204, 31483 }, // U+04C7
{ 18, 31, 23, 3, 21, 140, 31687 }, // U+04C8
{ 25, 35, 28, 3, 27, 219, 31827 }, // U+04C9
{ 22, 28, 25, 3, 21, 154, 32046 }, // U+04CA
{ 20, 35, 26, 3, 27, 175, 32200 }, // U+04CB
{ 18, 28, 23, 2, 21, 126, 32375 }, // U+04CC
{ 32, 35, 34, 3, 27, 280, 32501 }, // U+04CD
{ 26, 28, 28, 3, 21, 182, 32781 }, // U+04CE
{ 11, 27, 13, 1, 27, 75, 32963 }, // U+04CF
{ 24, 34, 24, 0, 34, 204, 33038 }, // U+04D0
{ 17, 29, 21, 1, 28, 124, 33242 }, // U+04D1
{ 24, 35, 24, 0, 35, 210, 33366 }, // U+04D2
{ 17, 29, 21, 1, 28, 124, 33576 }, // U+04D3
{ 32, 27, 33, -1, 27, 216, 33700 }, // U+04D4
{ 30, 22, 32, 1, 21, 165, 33916 }, // U+04D5
{ 16, 34, 21, 3, 34, 136, 34081 }, // U+04D6
{ 18, 29, 21, 2, 28, 131, 34217 }, // U+04D7
{ 24, 29, 28, 2, 28, 174, 34348 }, // U+04D8
{ 19, 22, 21, 1, 21, 105, 34522 }, // U+04D9
{ 24, 36, 28, 2, 35, 216, 34627 }, // U+04DA
{ 19, 29, 21, 1, 28, 138, 34843 }, // U+04DB
{ 34, 35, 34, 0, 35, 298, 34981 }, // U+04DC
{ 29, 28, 28, 0, 28, 203, 35279 }, // U+04DD
{ 19, 36, 22, 1, 35, 171, 35482 }, // U+04DE
{ 16, 29, 18, 1, 28, 116, 35653 }, // U+04DF
{ 19, 28, 22, 1, 27, 133, 35769 }, // U+04E0
{ 18, 30, 19, 0, 21, 135, 35902 }, // U+04E1
{ 22, 33, 28, 3, 33, 182, 36037 }, // U+04E2
{ 18, 26, 23, 3, 26, 117, 36219 }, // U+04E3
{ 22, 35, 28, 3, 35, 193, 36336 }, // U+04E4
{ 18, 28, 23, 3, 28, 126, 36529 }, // U+04E5
{ 25, 36, 29, 2, 35, 225, 36655 }, // U+04E6
{ 19, 29, 23, 2, 28, 138, 36880 }, // U+04E7
{ 25, 29, 29, 2, 28, 182, 37018 }, // U+04E8
{ 19, 22, 23, 2, 21, 105, 37200 }, // U+04E9
{ 25, 35, 29, 2, 34, 219, 37305 }, // U+04EA
{ 19, 29, 23, 2, 28, 138, 37524 }, // U+04EB
{ 22, 36, 24, 1, 35, 198, 37662 }, // U+04EC
{ 16, 29, 19, 1, 28, 116, 37860 }, // U+04ED
{ 24, 34, 23, 0, 33, 204, 37976 }, // U+04EE
{ 20, 35, 19, 0, 26, 175, 38180 }, // U+04EF
{ 24, 36, 23, 0, 35, 216, 38355 }, // U+04F0
{ 20, 37, 19, 0, 28, 185, 38571 }, // U+04F1
{ 24, 37, 23, 0, 36, 222, 38756 }, // U+04F2
{ 20, 38, 19, 0, 29, 190, 38978 }, // U+04F3
{ 20, 35, 25, 2, 35, 175, 39168 }, // U+04F4
{ 17, 28, 22, 2, 28, 119, 39343 }, // U+04F5
{ 17, 35, 20, 3, 27, 149, 39462 }, // U+04F6
{ 13, 28, 16, 3, 21, 91, 39611 }, // U+04F7
{ 26, 35, 32, 3, 35, 228, 39702 }, // U+04F8
{ 23, 28, 28, 3, 28, 161, 39930 }, // U+04F9
{ 20, 35, 20, 0, 27, 175, 40091 }, // U+04FA
{ 16, 29, 16, 0, 21, 116, 40266 }, // U+04FB
{ 23, 35, 24, 0, 27, 202, 40382 }, // U+04FC
{ 21, 29, 21, 0, 21, 153, 40584 }, // U+04FD
{ 22, 27, 22, 0, 27, 149, 40737 }, // U+04FE
{ 20, 21, 20, 0, 21, 105, 40886 }, // U+04FF
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 24, 34, 24, 0, 27, 204, 0 }, // U+1EA0
{ 17, 28, 21, 1, 21, 119, 204 }, // U+1EA1
{ 24, 38, 24, 0, 38, 228, 323 }, // U+1EA2
{ 17, 32, 21, 1, 31, 136, 551 }, // U+1EA3
{ 24, 37, 24, 0, 37, 222, 687 }, // U+1EA4
{ 20, 32, 21, 1, 31, 160, 909 }, // U+1EA5
{ 24, 37, 24, 0, 37, 222, 1069 }, // U+1EA6
{ 18, 32, 21, 0, 31, 144, 1291 }, // U+1EA7
{ 24, 39, 24, 0, 39, 234, 1435 }, // U+1EA8
{ 19, 34, 21, 1, 33, 162, 1669 }, // U+1EA9
{ 24, 40, 24, 0, 40, 240, 1831 }, // U+1EAA
{ 17, 35, 21, 1, 34, 149, 2071 }, // U+1EAB
{ 24, 43, 24, 0, 36, 258, 2220 }, // U+1EAC
{ 17, 36, 21, 1, 29, 153, 2478 }, // U+1EAD
{ 24, 38, 24, 0, 38, 228, 2631 }, // U+1EAE
{ 17, 33, 21, 1, 32, 141, 2859 }, // U+1EAF
{ 24, 38, 24, 0, 38, 228, 3000 }, // U+1EB0
{ 17, 33, 21, 1, 32, 141, 3228 }, // U+1EB1
{ 24, 40, 24, 0, 40, 240, 3369 }, // U+1EB2
{ 17, 34, 21, 1, 33, 145, 3609 }, // U+1EB3
{ 24, 40, 24, 0, 40, 240, 3754 }, // U+1EB4
{ 17, 35, 21, 1, 34, 149, 3994 }, // U+1EB5
{ 24, 42, 24, 0, 35, 252, 4143 }, // U+1EB6
{ 17, 35, 21, 1, 28, 149, 4395 }, // U+1EB7
{ 16, 34, 21, 3, 27, 136, 4544 }, // U+1EB8
{ 18, 28, 21, 2, 21, 126, 4680 }, // U+1EB9
{ 16, 38, 21, 3, 38, 152, 4806 }, // U+1EBA
{ 18, 32, 21, 2, 31, 144, 4958 }, // U+1EBB
{ 16, 35, 21, 3, 35, 140, 5102 }, // U+1EBC
{ 18, 29, 21, 2, 28, 131, 5242 }, // U+1EBD
{ 18, 37, 21, 3, 37, 167, 5373 }, // U+1EBE
{ 19, 32, 21, 2, 31, 152, 5540 }, // U+1EBF
{ 18, 37, 21, 1, 37, 167, 5692 }, // U+1EC0
{ 19, 32, 21, 1, 31, 152, 5859 }, // U+1EC1
{ 17, 39, 21, 3, 39, 166, 6011 }, // U+1EC2
{ 18, 34, 21, 2, 33, 153, 6177 }, // U+1EC3
{ 16, 40, 21, 3, 40, 160, 6330 }, // U+1EC4
{ 18, 35, 21, 2, 34, 158, 6490 }, // U+1EC5
{ 16, 43, 21, 3, 36, 172, 6648 }, // U+1EC6
{ 18, 36, 21, 2, 29, 162, 6820 }, // U+1EC7
{ 11, 37, 13, 1, 37, 102, 6982 }, // U+1EC8
{ 8, 31, 10, 2, 31, 62, 7084 }, // U+1EC9
{ 11, 34, 13, 1, 27, 94, 7146 }, // U+1ECA
{ 5, 35, 10, 2, 28, 44, 7240 }, // U+1ECB
{ 25, 35, 29, 2, 28, 219, 7284 }, // U+1ECC
{ 19, 28, 23, 2, 21, 133, 7503 }, // U+1ECD
{ 25, 38, 29, 2, 37, 238, 7636 }, // U+1ECE
{ 19, 32, 23, 2, 31, 152, 7874 }, // U+1ECF
{ 25, 38, 29, 2, 37, 238, 8026 }, // U+1ED0
{ 20, 32, 23, 2, 31, 160, 8264 }, // U+1ED1
{ 25, 38, 29, 2, 37, 238, 8424 }, // U+1ED2
{ 20, 32, 23, 1, 31, 160, 8662 }, // U+1ED3
{ 25, 40, 29, 2, 39, 250, 8822 }, // U+1ED4
{ 19, 34, 23, 2, 33, 162, 9072 }, // U+1ED5
{ 25, 41, 29, 2, 40, 257, 9234 }, // U+1ED6
{ 19, 35, 23, 2, 34, 167, 9491 }, // U+1ED7
{ 25, 43, 29, 2, 36, 269, 9658 }, // U+1ED8
{ 19, 36, 23, 2, 29, 171, 9927 }, // U+1ED9
{ 29, 37, 29, 2, 36, 269, 10098 }, // U+1EDA
{ 23, 30, 23, 2, 29, 173, 10367 }, // U+1EDB
{ 29, 37, 29, 2, 36, 269, 10540 }, // U+1EDC
{ 23, 30, 23, 2, 29, 173, 10809 }, // U+1EDD
{ 29, 39, 29, 2, 38, 283, 10982 }, // U+1EDE
{ 23, 32, 23, 2, 31, 184, 11265 }, // U+1EDF
{ 29, 36, 29, 2, 35, 261, 11449 }, // U+1EE0
{ 23, 29, 23, 2, 28, 167, 11710 }, // U+1EE1
{ 29, 36, 29, 2, 29, 261, 11877 }, // U+1EE2
{ 23, 31, 23, 2, 24, 179, 12138 }, // U+1EE3
{ 21, 34, 27, 3, 27, 179, 12317 }, // U+1EE4
{ 18, 28, 23, 2, 21, 126, 12496 }, // U+1EE5
{ 21, 38, 27, 3, 37, 200, 12622 }, // U+1EE6
{ 18, 32, 23, 2, 31, 144, 12822 }, // U+1EE7
{ 28, 37, 29, 3, 36, 259, 12966 }, // U+1EE8
{ 25, 30, 25, 2, 29, 188, 13225 }, // U+1EE9
{ 28, 37, 29, 3, 36, 259, 13413 }, // U+1EEA
{ 25, 30, 25, 2, 29, 188, 13672 }, // U+1EEB
{ 28, 38, 29, 3, 37, 266, 13860 }, // U+1EEC
{ 25, 32, 25, 2, 31, 200, 14126 }, // U+1EED
{ 28, 36, 29, 3, 35, 252, 14326 }, // U+1EEE
{ 25, 29, 25, 2, 28, 182, 14578 }, // U+1EEF
{ 28, 36, 29, 3, 29, 252, 14760 }, // U+1EF0
{ 25, 31, 25, 2, 24, 194, 15012 }, // U+1EF1
{ 22, 36, 21, 0, 36, 198, 15206 }, // U+1EF2
{ 20, 38, 19, 0, 29, 190, 15404 }, // U+1EF3
{ 22, 34, 21, 0, 27, 187, 15594 }, // U+1EF4
{ 20, 30, 19, 0, 21, 150, 15781 }, // U+1EF5
{ 22, 37, 21, 0, 37, 204, 15931 }, // U+1EF6
{ 20, 40, 19, 0, 31, 200, 16135 }, // U+1EF7
{ 22, 35, 21, 0, 35, 193, 16335 }, // U+1EF8
{ 20, 37, 19, 0, 28, 185, 16528 }, // U+1EF9
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0, 0, 19, 0, 0, 0, 0 }, // U+2000
{ 0, 0, 38, 0, 0, 0, 0 }, // U+2001
{ 0, 0, 19, 0, 0, 0, 0 }, // U+2002
{ 0, 0, 38, 0, 0, 0, 0 }, // U+2003
{ 0, 0, 12, 0, 0, 0, 0 }, // U+2004
{ 0, 0, 9, 0, 0, 0, 0 }, // U+2005
{ 0, 0, 6, 0, 0, 0, 0 }, // U+2006
{ 0, 0, 21, 0, 0, 0, 0 }, // U+2007
{ 0, 0, 10, 0, 0, 0, 0 }, // U+2008
{ 0, 0, 6, 0, 0, 0, 0 }, // U+2009
{ 0, 0, 4, 0, 0, 0, 0 }, // U+200A
{ 0, 0, 0, 0, 0, 0, 0 }, // U+200B
{ 0, 0, 0, 0, 0, 0, 0 }, // U+200C
{ 0, 0, 0, 0, 0, 0, 0 }, // U+200D
{ 9, 31, 0, -1, 26, 70, 0 }, // U+200E
{ 9, 31, 0, -8, 26, 70, 70 }, // U+200F
{ 10, 4, 12, 1, 12, 10, 140 }, // U+2010
{ 10, 4, 12, 1, 12, 10, 150 }, // U+2011
{ 19, 3, 21, 1, 15, 15, 160 }, // U+2012
{ 17, 4, 19, 1, 12, 17, 175 }, // U+2013
{ 35, 4, 38, 1, 12, 35, 192 }, // U+2014
{ 35, 4, 38, 1, 12, 35, 227 }, // U+2015
{ 12, 39, 21, 4, 29, 117, 262 }, // U+2016
{ 17, 9, 15, -1, 0, 39, 379 }, // U+2017
{ 7, 10, 7, 0, 27, 18, 418 }, // U+2018
{ 7, 10, 7, 0, 27, 18, 436 }, // U+2019
{ 6, 10, 9, 1, 5, 15, 454 }, // U+201A
{ 7, 10, 7, 0, 27, 18, 469 }, // U+201B
{ 14, 10, 13, 0, 27, 35, 487 }, // U+201C
{ 14, 10, 13, 0, 27, 35, 522 }, // U+201D
{ 13, 10, 16, 1, 5, 33, 557 }, // U+201E
{ 14, 10, 13, 0, 27, 35, 590 }, // U+201F
{ 15, 29, 19, 2, 29, 109, 625 }, // U+2020
{ 15, 29, 19, 2, 29, 109, 734 }, // U+2021
{ 10, 10, 14, 2, 19, 25, 843 }, // U+2022
{ 11, 12, 14, 2, 20, 33, 868 }, // U+2023
{ 5, 6, 19, 7, 5, 8, 901 }, // U+2024
{ 16, 6, 20, 2, 5, 24, 909 }, // U+2025
{ 25, 6, 30, 2, 5, 38, 933 }, // U+2026
{ 6, 6, 10, 2, 12, 9, 971 }, // U+2027
{ 0, 0, 23, 0, 0, 0, 980 }, // U+2028
{ 0, 0, 23, 0, 0, 0, 980 }, // U+2029
{ 9, 28, 0, -1, 23, 63, 980 }, // U+202A
{ 9, 28, 0, -8, 23, 63, 1043 }, // U+202B
{ 10, 31, 0, -5, 26, 78, 1106 }, // U+202C
{ 10, 31, 0, -5, 26, 78, 1184 }, // U+202D
{ 10, 31, 0, -5, 26, 78, 1262 }, // U+202E
{ 0, 0, 6, 0, 0, 0, 1340 }, // U+202F
{ 42, 29, 44, 1, 28, 305, 1340 }, // U+2030
{ 56, 29, 58, 1, 28, 406, 1645 }, // U+2031
{ 9, 10, 9, 1, 27, 23, 2051 }, // U+2032
{ 16, 10, 15, 1, 27, 40, 2074 }, // U+2033
{ 22, 10, 22, 1, 27, 55, 2114 }, // U+2034
{ 9, 10, 9, -1, 27, 23, 2169 }, // U+2035
{ 15, 10, 17, -1, 27, 38, 2192 }, // U+2036
{ 21, 10, 23, -1, 27, 53, 2230 }, // U+2037
{ 15, 13, 15, 0, 4, 49, 2283 }, // U+2038
{ 10, 16, 12, 1, 18, 40, 2332 }, // U+2039
{ 10, 16, 12, 1, 18, 40, 2372 }, // U+203A
{ 29, 29, 31, 1, 28, 211, 2412 }, // U+203B
{ 14, 28, 19, 2, 27, 98, 2623 }, // U+203C
{ 16, 29, 17, 0, 28, 116, 2721 }, // U+203D
{ 20, 3, 19, -1, 31, 15, 2837 }, // U+203E
{ 22, 8, 23, 0, -1, 44, 2852 }, // U+203F
{ 22, 9, 23, 0, 30, 50, 2896 }, // U+2040
{ 14, 25, 14, 0, 16, 88, 2946 }, // U+2041
{ 42, 35, 42, 0, 29, 368, 3034 }, // U+2042
{ 10, 4, 12, 1, 12, 10, 3402 }, // U+2043
{ 20, 27, 5, -8, 27, 135, 3412 }, // U+2044
{ 10, 33, 12, 2, 27, 83, 3547 }, // U+2045
{ 10, 33, 12, 0, 27, 83, 3630 }, // U+2046
{ 32, 29, 32, 0, 28, 232, 3713 }, // U+2047
{ 23, 29, 25, 0, 28, 167, 3945 }, // U+2048
{ 23, 29, 26, 2, 28, 167, 4112 }, // U+2049
{ 19, 21, 21, 1, 21, 100, 4279 }, // U+204A
{ 20, 34, 25, 3, 29, 170, 4379 }, // U+204B
{ 19, 20, 24, 2, 21, 95, 4549 }, // U+204C
{ 19, 20, 24, 3, 21, 95, 4644 }, // U+204D
{ 19, 18, 21, 1, 10, 86, 4739 }, // U+204E
{ 7, 26, 9, 1, 21, 46, 4825 }, // U+204F
{ 22, 39, 23, 0, 30, 215, 4871 }, // U+2050
{ 19, 37, 21, 1, 29, 176, 5086 }, // U+2051
{ 14, 29, 14, 0, 28, 102, 5262 }, // U+2052
{ 33, 6, 38, 2, 14, 50, 5364 }, // U+2053
{ 22, 9, 23, 0, 0, 50, 5414 }, // U+2054
{ 20, 20, 21, 1, 19, 100, 5464 }, // U+2055
{ 17, 29, 19, 1, 28, 124, 5564 }, // U+2056
{ 28, 10, 28, 1, 27, 70, 5688 }, // U+2057
{ 28, 29, 31, 1, 28, 203, 5758 }, // U+2058
{ 29, 29, 31, 1, 28, 211, 5961 }, // U+2059
{ 6, 29, 8, 1, 28, 44, 6172 }, // U+205A
{ 22, 30, 25, 1, 29, 165, 6216 }, // U+205B
{ 28, 29, 30, 1, 28, 203, 6381 }, // U+205C
{ 6, 28, 10, 2, 27, 42, 6584 }, // U+205D
{ 6, 29, 10, 2, 28, 44, 6626 }, // U+205E
{ 0, 0, 8, 0, 0, 0, 6670 }, // U+205F
{ 0, 0, 23, 0, 0, 0, 6670 }, // U+2060
{ 0, 0, 23, 0, 0, 0, 6670 }, // U+2061
{ 0, 0, 23, 0, 0, 0, 6670 }, // U+2062
{ 0, 0, 23, 0, 0, 0, 6670 }, // U+2063
{ 0, 0, 23, 0, 0, 0, 6670 }, // U+2064
{ 0, 0, 0, 0, 0, 0, 6670 }, // U+2066
{ 0, 0, 0, 0, 0, 0, 6670 }, // U+2067
{ 0, 0, 0, 0, 0, 0, 6670 }, // U+2068
{ 0, 0, 0, 0, 0, 0, 6670 }, // U+2069
{ 10, 31, 0, -5, 26, 78, 6670 }, // U+206A
{ 10, 31, 0, -5, 26, 78, 6748 }, // U+206B
{ 10, 31, 0, -5, 26, 78, 6826 }, // U+206C
{ 10, 31, 0, -5, 26, 78, 6904 }, // U+206D
{ 10, 31, 0, -5, 26, 78, 6982 }, // U+206E
{ 10, 31, 0, -5, 26, 78, 7060 }, // U+206F
{ 13, 17, 13, 0, 32, 56, 0 }, // U+2070
{ 4, 18, 6, 1, 28, 18, 56 }, // U+2071
{ 13, 17, 13, 0, 32, 56, 74 }, // U+2074
{ 11, 17, 13, 1, 32, 47, 130 }, // U+2075
{ 13, 17, 13, 0, 32, 56, 177 }, // U+2076
{ 12, 17, 13, 1, 32, 51, 233 }, // U+2077
{ 13, 17, 13, 0, 32, 56, 284 }, // U+2078
{ 13, 18, 13, 0, 33, 59, 340 }, // U+2079
{ 11, 11, 13, 1, 28, 31, 399 }, // U+207A
{ 11, 3, 13, 1, 24, 9, 430 }, // U+207B
{ 11, 7, 13, 1, 26, 20, 439 }, // U+207C
{ 7, 22, 8, 2, 35, 39, 459 }, // U+207D
{ 7, 22, 8, 0, 35, 39, 498 }, // U+207E
{ 12, 14, 15, 2, 24, 42, 537 }, // U+207F
{ 13, 17, 13, 0, 12, 56, 579 }, // U+2080
{ 8, 17, 13, 1, 12, 34, 635 }, // U+2081
{ 12, 17, 13, 0, 12, 51, 669 }, // U+2082
{ 13, 17, 13, 0, 12, 56, 720 }, // U+2083
{ 13, 17, 13, 0, 12, 56, 776 }, // U+2084
{ 11, 17, 13, 1, 12, 47, 832 }, // U+2085
{ 13, 17, 13, 0, 12, 56, 879 }, // U+2086
{ 12, 17, 13, 1, 12, 51, 935 }, // U+2087
{ 13, 17, 13, 0, 12, 56, 986 }, // U+2088
{ 13, 18, 13, 0, 13, 59, 1042 }, // U+2089
{ 11, 11, 13, 1, 8, 31, 1101 }, // U+208A
{ 11, 3, 13, 1, 4, 9, 1132 }, // U+208B
{ 11, 7, 13, 1, 6, 20, 1141 }, // U+208C
{ 7, 22, 8, 2, 14, 39, 1161 }, // U+208D
{ 7, 22, 8, 0, 14, 39, 1200 }, // U+208E
{ 11, 13, 14, 1, 9, 36, 1239 }, // U+2090
{ 12, 13, 14, 1, 9, 39, 1275 }, // U+2091
{ 13, 13, 15, 1, 9, 43, 1314 }, // U+2092
{ 13, 13, 13, 0, 9, 43, 1357 }, // U+2093
{ 12, 13, 14, 1, 9, 39, 1400 }, // U+2094
{ 12, 18, 15, 2, 14, 54, 1439 }, // U+2095
{ 11, 18, 13, 2, 14, 50, 1493 }, // U+2096
{ 3, 18, 6, 2, 14, 14, 1543 }, // U+2097
{ 19, 13, 23, 2, 9, 62, 1557 }, // U+2098
{ 12, 13, 15, 2, 9, 39, 1619 }, // U+2099
{ 12, 18, 15, 2, 9, 54, 1658 }, // U+209A
{ 10, 13, 12, 1, 9, 33, 1712 }, // U+209B
{ 9, 16, 9, 0, 12, 36, 1745 }, // U+209C
{ 20, 28, 21, 1, 28, 140, 0 }, // U+20A0
{ 20, 32, 21, 1, 29, 160, 140 }, // U+20A1
{ 19, 29, 21, 2, 28, 138, 300 }, // U+20A2
{ 19, 27, 21, 1, 27, 129, 438 }, // U+20A3
{ 20, 28, 21, 1, 28, 140, 567 }, // U+20A4
{ 30, 30, 35, 3, 25, 225, 707 }, // U+20A5
{ 22, 27, 21, 0, 27, 149, 932 }, // U+20A6
{ 26, 28, 29, 2, 27, 182, 1081 }, // U+20A7
{ 27, 28, 31, 3, 27, 189, 1263 }, // U+20A8
{ 25, 27, 25, 0, 27, 169, 1452 }, // U+20A9
{ 24, 27, 30, 3, 27, 162, 1621 }, // U+20AA
{ 21, 35, 23, 2, 29, 184, 1783 }, // U+20AB
{ 21, 29, 21, 0, 28, 153, 1967 }, // U+20AC
{ 22, 27, 21, 0, 27, 149, 2120 }, // U+20AD
{ 21, 27, 21, 0, 27, 142, 2269 }, // U+20AE
{ 36, 37, 36, 0, 28, 333, 2411 }, // U+20AF
{ 20, 37, 21, 0, 28, 185, 2744 }, // U+20B0
{ 22, 27, 21, 0, 27, 149, 2929 }, // U+20B1
{ 23, 32, 27, 2, 29, 184, 3078 }, // U+20B2
{ 23, 27, 23, 0, 27, 156, 3262 }, // U+20B3
{ 21, 29, 21, 0, 28, 153, 3418 }, // U+20B4
{ 21, 32, 24, 2, 29, 168, 3571 }, // U+20B5
{ 23, 26, 23, 0, 25, 150, 3739 }, // U+20B6
{ 26, 31, 27, 0, 28, 202, 3889 }, // U+20B7
{ 20, 27, 20, 0, 27, 135, 4091 }, // U+20B8
{ 17, 27, 21, 2, 27, 115, 4226 }, // U+20B9
{ 21, 28, 21, 0, 27, 147, 4341 }, // U+20BA
{ 29, 29, 29, 0, 28, 211, 4488 }, // U+20BB
{ 26, 27, 30, 2, 27, 176, 4699 }, // U+20BC
{ 21, 27, 22, 0, 27, 142, 4875 }, // U+20BD
{ 25, 29, 29, 2, 29, 182, 5017 }, // U+20BE
{ 18, 35, 21, 3, 31, 158, 5199 }, // U+20BF
{ 16, 27, 18, 1, 21, 108, 5357 }, // U+20C0
{ 19, 4, 21, 1, 15, 19, 0 }, // U+2212
{ 28, 29, 26, 0, 29, 203, 0 }, // U+FB00
{ 20, 29, 23, 0, 29, 145, 203 }, // U+FB01
{ 20, 29, 23, 0, 29, 145, 348 }, // U+FB02
{ 33, 29, 35, 0, 29, 240, 493 }, // U+FB03
{ 33, 29, 35, 0, 29, 240, 733 }, // U+FB04
{ 22, 30, 25, 3, 29, 165, 973 }, // U+FB05
{ 30, 30, 32, 1, 29, 225, 1138 }, // U+FB06
{ 35, 35, 38, 1, 29, 307, 0 }, // U+FFFD
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
};
static const EpdUnicodeInterval notosans_18_regularIntervals[] = {
{ 0x0, 0x0, 0x0 },
{ 0xD, 0xD, 0x1 },
{ 0x20, 0x7E, 0x2 },
{ 0xA0, 0xFF, 0x61 },
{ 0x100, 0x17F, 0xC1 },
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x1A0, 0x1A1, 0x141 },
{ 0x1AF, 0x1B0, 0x143 },
{ 0x1C4, 0x21F, 0x145 },
{ 0x300, 0x36F, 0x1A1 },
{ 0x400, 0x4FF, 0x211 },
{ 0x1EA0, 0x1EF9, 0x311 },
{ 0x2000, 0x2064, 0x36B },
{ 0x2066, 0x206F, 0x3D0 },
{ 0x2070, 0x2071, 0x3DA },
{ 0x2074, 0x208E, 0x3DC },
{ 0x2090, 0x209C, 0x3F7 },
{ 0x20A0, 0x20C0, 0x404 },
{ 0x2212, 0x2212, 0x425 },
{ 0xFB00, 0xFB06, 0x426 },
{ 0xFFFD, 0xFFFD, 0x42D },
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
};
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
static const EpdFontGroup notosans_18_regularGroups[] = {
{ 0, 4510, 10414, 97, 0 },
{ 4510, 4453, 12553, 96, 97 },
{ 8963, 6052, 19294, 128, 193 },
{ 15015, 5678, 17694, 96, 321 },
{ 20693, 1598, 2658, 112, 417 },
{ 22291, 14247, 40991, 256, 529 },
{ 36538, 4427, 16713, 90, 785 },
{ 40965, 2891, 7138, 111, 875 },
{ 43856, 841, 1781, 42, 986 },
{ 44697, 2733, 5465, 33, 1028 },
{ 47430, 16, 19, 1, 1061 },
{ 47446, 416, 1363, 7, 1062 },
{ 47862, 150, 307, 1, 1069 },
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
};
static const EpdKernClassEntry notosans_18_regularKernLeftClasses[] = {
{ 0x0022, 1 }, // "
{ 0x0026, 2 }, // &
{ 0x0027, 1 }, // '
{ 0x0028, 3 }, // (
{ 0x002C, 4 }, // ,
{ 0x002D, 5 }, // -
{ 0x002E, 4 }, // .
{ 0x003A, 6 }, // :
{ 0x0041, 7 }, // A
{ 0x0042, 8 }, // B
{ 0x0043, 9 }, // C
{ 0x0044, 10 }, // D
{ 0x0045, 11 }, // E
{ 0x0046, 12 }, // F
{ 0x004B, 9 }, // K
{ 0x004C, 13 }, // L
{ 0x004F, 10 }, // O
{ 0x0050, 14 }, // P
{ 0x0051, 10 }, // Q
{ 0x0052, 15 }, // R
{ 0x0054, 16 }, // T
{ 0x0055, 17 }, // U
{ 0x0056, 18 }, // V
{ 0x0057, 18 }, // W
{ 0x0058, 9 }, // X
{ 0x0059, 19 }, // Y
{ 0x005A, 9 }, // Z
{ 0x005B, 3 }, // [
{ 0x005F, 20 }, // _
{ 0x0061, 21 }, // a
{ 0x0062, 22 }, // b
{ 0x0065, 22 }, // e
{ 0x0066, 23 }, // f
{ 0x0068, 21 }, // h
{ 0x006D, 21 }, // m
{ 0x006E, 21 }, // n
{ 0x006F, 22 }, // o
{ 0x0070, 22 }, // p
{ 0x0072, 24 }, // r
{ 0x0076, 25 }, // v
{ 0x0077, 25 }, // w
{ 0x0078, 26 }, // x
{ 0x0079, 25 }, // y
{ 0x007B, 3 }, // {
{ 0x00A1, 27 }, // U+00A1
{ 0x00AB, 28 }, // U+00AB
{ 0x00BB, 29 }, // U+00BB
{ 0x00BF, 30 }, // U+00BF
{ 0x00C0, 7 }, // U+00C0
{ 0x00C1, 7 }, // U+00C1
{ 0x00C2, 7 }, // U+00C2
{ 0x00C3, 7 }, // U+00C3
{ 0x00C4, 7 }, // U+00C4
{ 0x00C5, 7 }, // U+00C5
{ 0x00C6, 11 }, // U+00C6
{ 0x00C7, 9 }, // U+00C7
{ 0x00C8, 11 }, // U+00C8
{ 0x00C9, 11 }, // U+00C9
{ 0x00CA, 11 }, // U+00CA
{ 0x00CB, 11 }, // U+00CB
{ 0x00D0, 10 }, // U+00D0
{ 0x00D2, 10 }, // U+00D2
{ 0x00D3, 10 }, // U+00D3
{ 0x00D4, 10 }, // U+00D4
{ 0x00D5, 10 }, // U+00D5
{ 0x00D6, 10 }, // U+00D6
{ 0x00D8, 10 }, // U+00D8
{ 0x00D9, 17 }, // U+00D9
{ 0x00DA, 17 }, // U+00DA
{ 0x00DB, 17 }, // U+00DB
{ 0x00DC, 17 }, // U+00DC
{ 0x00DD, 19 }, // U+00DD
{ 0x00DE, 14 }, // U+00DE
{ 0x00E0, 21 }, // U+00E0
{ 0x00E1, 21 }, // U+00E1
{ 0x00E2, 21 }, // U+00E2
{ 0x00E3, 21 }, // U+00E3
{ 0x00E4, 21 }, // U+00E4
{ 0x00E5, 21 }, // U+00E5
{ 0x00E6, 22 }, // U+00E6
{ 0x00E8, 22 }, // U+00E8
{ 0x00E9, 22 }, // U+00E9
{ 0x00EA, 22 }, // U+00EA
{ 0x00EB, 22 }, // U+00EB
{ 0x00EE, 31 }, // U+00EE
{ 0x00EF, 31 }, // U+00EF
{ 0x00F0, 22 }, // U+00F0
{ 0x00F2, 22 }, // U+00F2
{ 0x00F3, 22 }, // U+00F3
{ 0x00F4, 22 }, // U+00F4
{ 0x00F5, 22 }, // U+00F5
{ 0x00F6, 22 }, // U+00F6
{ 0x00F8, 22 }, // U+00F8
{ 0x00FD, 25 }, // U+00FD
{ 0x00FE, 22 }, // U+00FE
{ 0x00FF, 25 }, // U+00FF
{ 0x0100, 7 }, // U+0100
{ 0x0101, 21 }, // U+0101
{ 0x0102, 7 }, // U+0102
{ 0x0103, 21 }, // U+0103
{ 0x0104, 32 }, // U+0104
{ 0x0105, 21 }, // U+0105
{ 0x0106, 9 }, // U+0106
{ 0x0108, 9 }, // U+0108
{ 0x010A, 9 }, // U+010A
{ 0x010C, 9 }, // U+010C
{ 0x010E, 10 }, // U+010E
{ 0x010F, 33 }, // U+010F
{ 0x0110, 10 }, // U+0110
{ 0x0112, 11 }, // U+0112
{ 0x0113, 22 }, // U+0113
{ 0x0114, 11 }, // U+0114
{ 0x0115, 22 }, // U+0115
{ 0x0116, 11 }, // U+0116
{ 0x0117, 22 }, // U+0117
{ 0x0118, 11 }, // U+0118
{ 0x0119, 22 }, // U+0119
{ 0x011A, 11 }, // U+011A
{ 0x011B, 22 }, // U+011B
{ 0x0125, 21 }, // U+0125
{ 0x0129, 34 }, // U+0129
{ 0x012B, 31 }, // U+012B
{ 0x012E, 35 }, // U+012E
{ 0x0136, 9 }, // U+0136
{ 0x0138, 26 }, // U+0138
{ 0x0139, 13 }, // U+0139
{ 0x013B, 13 }, // U+013B
{ 0x013D, 13 }, // U+013D
{ 0x013E, 33 }, // U+013E
{ 0x013F, 13 }, // U+013F
{ 0x0141, 13 }, // U+0141
{ 0x0144, 21 }, // U+0144
{ 0x0146, 21 }, // U+0146
{ 0x0149, 21 }, // U+0149
{ 0x014B, 21 }, // U+014B
{ 0x014C, 10 }, // U+014C
{ 0x014D, 22 }, // U+014D
{ 0x014E, 10 }, // U+014E
{ 0x014F, 22 }, // U+014F
{ 0x0150, 10 }, // U+0150
{ 0x0151, 22 }, // U+0151
{ 0x0152, 11 }, // U+0152
{ 0x0153, 22 }, // U+0153
{ 0x0155, 24 }, // U+0155
{ 0x0157, 24 }, // U+0157
{ 0x0159, 24 }, // U+0159
{ 0x0162, 16 }, // U+0162
{ 0x0164, 16 }, // U+0164
{ 0x0165, 36 }, // U+0165
{ 0x0166, 16 }, // U+0166
{ 0x0168, 17 }, // U+0168
{ 0x016A, 17 }, // U+016A
{ 0x016C, 17 }, // U+016C
{ 0x016E, 17 }, // U+016E
{ 0x0170, 17 }, // U+0170
{ 0x0172, 17 }, // U+0172
{ 0x0174, 18 }, // U+0174
{ 0x0175, 25 }, // U+0175
{ 0x0176, 19 }, // U+0176
{ 0x0177, 25 }, // U+0177
{ 0x0178, 19 }, // U+0178
{ 0x0179, 9 }, // U+0179
{ 0x017B, 9 }, // U+017B
{ 0x017D, 9 }, // U+017D
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x01A0, 37 }, // U+01A0
{ 0x01A1, 38 }, // U+01A1
{ 0x01AF, 39 }, // U+01AF
{ 0x01B0, 38 }, // U+01B0
{ 0x01FA, 7 }, // U+01FA
{ 0x01FB, 21 }, // U+01FB
{ 0x01FC, 11 }, // U+01FC
{ 0x01FD, 22 }, // U+01FD
{ 0x01FE, 10 }, // U+01FE
{ 0x020B, 31 }, // U+020B
{ 0x021A, 16 }, // U+021A
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0400, 40 }, // U+0400
{ 0x0401, 40 }, // U+0401
{ 0x0402, 41 }, // U+0402
{ 0x0403, 42 }, // U+0403
{ 0x0404, 43 }, // U+0404
{ 0x0405, 44 }, // U+0405
{ 0x0409, 45 }, // U+0409
{ 0x040A, 45 }, // U+040A
{ 0x040B, 41 }, // U+040B
{ 0x040C, 46 }, // U+040C
{ 0x040E, 47 }, // U+040E
{ 0x0410, 48 }, // U+0410
{ 0x0411, 49 }, // U+0411
{ 0x0412, 50 }, // U+0412
{ 0x0413, 42 }, // U+0413
{ 0x0414, 51 }, // U+0414
{ 0x0415, 40 }, // U+0415
{ 0x0416, 46 }, // U+0416
{ 0x0417, 50 }, // U+0417
{ 0x041A, 46 }, // U+041A
{ 0x041E, 52 }, // U+041E
{ 0x0420, 53 }, // U+0420
{ 0x0421, 43 }, // U+0421
{ 0x0422, 42 }, // U+0422
{ 0x0423, 47 }, // U+0423
{ 0x0424, 54 }, // U+0424
{ 0x0425, 46 }, // U+0425
{ 0x0426, 51 }, // U+0426
{ 0x0429, 51 }, // U+0429
{ 0x042A, 45 }, // U+042A
{ 0x042C, 45 }, // U+042C
{ 0x042D, 52 }, // U+042D
{ 0x042E, 52 }, // U+042E
{ 0x0430, 55 }, // U+0430
{ 0x0431, 56 }, // U+0431
{ 0x0432, 57 }, // U+0432
{ 0x0433, 58 }, // U+0433
{ 0x0434, 59 }, // U+0434
{ 0x0435, 60 }, // U+0435
{ 0x0436, 61 }, // U+0436
{ 0x0437, 57 }, // U+0437
{ 0x0438, 62 }, // U+0438
{ 0x0439, 62 }, // U+0439
{ 0x043A, 61 }, // U+043A
{ 0x043B, 62 }, // U+043B
{ 0x043C, 62 }, // U+043C
{ 0x043D, 62 }, // U+043D
{ 0x043E, 60 }, // U+043E
{ 0x043F, 62 }, // U+043F
{ 0x0440, 60 }, // U+0440
{ 0x0441, 63 }, // U+0441
{ 0x0442, 58 }, // U+0442
{ 0x0443, 64 }, // U+0443
{ 0x0444, 60 }, // U+0444
{ 0x0445, 61 }, // U+0445
{ 0x0446, 59 }, // U+0446
{ 0x0447, 62 }, // U+0447
{ 0x0448, 62 }, // U+0448
{ 0x0449, 59 }, // U+0449
{ 0x044A, 65 }, // U+044A
{ 0x044B, 62 }, // U+044B
{ 0x044C, 65 }, // U+044C
{ 0x044D, 60 }, // U+044D
{ 0x044E, 60 }, // U+044E
{ 0x044F, 62 }, // U+044F
{ 0x0450, 60 }, // U+0450
{ 0x0451, 60 }, // U+0451
{ 0x0452, 66 }, // U+0452
{ 0x0453, 58 }, // U+0453
{ 0x0454, 63 }, // U+0454
{ 0x0455, 67 }, // U+0455
{ 0x0457, 68 }, // U+0457
{ 0x0458, 40 }, // U+0458
{ 0x0459, 65 }, // U+0459
{ 0x045A, 65 }, // U+045A
{ 0x045B, 69 }, // U+045B
{ 0x045C, 61 }, // U+045C
{ 0x045D, 62 }, // U+045D
{ 0x045E, 64 }, // U+045E
{ 0x045F, 62 }, // U+045F
{ 0x0460, 52 }, // U+0460
{ 0x0461, 70 }, // U+0461
{ 0x0462, 71 }, // U+0462
{ 0x0463, 65 }, // U+0463
{ 0x0464, 43 }, // U+0464
{ 0x0465, 63 }, // U+0465
{ 0x0466, 48 }, // U+0466
{ 0x0467, 72 }, // U+0467
{ 0x0468, 48 }, // U+0468
{ 0x0469, 72 }, // U+0469
{ 0x046E, 73 }, // U+046E
{ 0x0471, 60 }, // U+0471
{ 0x0472, 52 }, // U+0472
{ 0x0473, 60 }, // U+0473
{ 0x0474, 47 }, // U+0474
{ 0x0475, 70 }, // U+0475
{ 0x0476, 47 }, // U+0476
{ 0x0477, 70 }, // U+0477
{ 0x0478, 64 }, // U+0478
{ 0x0479, 64 }, // U+0479
{ 0x047A, 52 }, // U+047A
{ 0x047B, 60 }, // U+047B
{ 0x047C, 52 }, // U+047C
{ 0x047D, 60 }, // U+047D
{ 0x047E, 52 }, // U+047E
{ 0x047F, 70 }, // U+047F
{ 0x0480, 43 }, // U+0480
{ 0x048A, 51 }, // U+048A
{ 0x048B, 59 }, // U+048B
{ 0x048C, 71 }, // U+048C
{ 0x048D, 65 }, // U+048D
{ 0x048E, 53 }, // U+048E
{ 0x048F, 60 }, // U+048F
{ 0x0490, 74 }, // U+0490
{ 0x0491, 75 }, // U+0491
{ 0x0492, 76 }, // U+0492
{ 0x0493, 77 }, // U+0493
{ 0x0496, 78 }, // U+0496
{ 0x0497, 79 }, // U+0497
{ 0x0498, 73 }, // U+0498
{ 0x0499, 57 }, // U+0499
{ 0x049A, 78 }, // U+049A
{ 0x049B, 79 }, // U+049B
{ 0x049C, 46 }, // U+049C
{ 0x049D, 61 }, // U+049D
{ 0x049E, 46 }, // U+049E
{ 0x049F, 61 }, // U+049F
{ 0x04A0, 46 }, // U+04A0
{ 0x04A1, 61 }, // U+04A1
{ 0x04A2, 51 }, // U+04A2
{ 0x04A3, 59 }, // U+04A3
{ 0x04A4, 76 }, // U+04A4
{ 0x04A5, 75 }, // U+04A5
{ 0x04A9, 60 }, // U+04A9
{ 0x04AA, 43 }, // U+04AA
{ 0x04AB, 63 }, // U+04AB
{ 0x04AC, 74 }, // U+04AC
{ 0x04AD, 75 }, // U+04AD
{ 0x04AE, 80 }, // U+04AE
{ 0x04AF, 70 }, // U+04AF
{ 0x04B0, 80 }, // U+04B0
{ 0x04B1, 70 }, // U+04B1
{ 0x04B2, 78 }, // U+04B2
{ 0x04B3, 79 }, // U+04B3
{ 0x04B4, 51 }, // U+04B4
{ 0x04B5, 59 }, // U+04B5
{ 0x04B6, 51 }, // U+04B6
{ 0x04B7, 59 }, // U+04B7
{ 0x04BC, 81 }, // U+04BC
{ 0x04BD, 82 }, // U+04BD
{ 0x04BE, 81 }, // U+04BE
{ 0x04BF, 82 }, // U+04BF
{ 0x04C1, 46 }, // U+04C1
{ 0x04C2, 61 }, // U+04C2
{ 0x04C5, 51 }, // U+04C5
{ 0x04C6, 59 }, // U+04C6
{ 0x04C9, 51 }, // U+04C9
{ 0x04CA, 59 }, // U+04CA
{ 0x04CD, 51 }, // U+04CD
{ 0x04CE, 59 }, // U+04CE
{ 0x04D0, 48 }, // U+04D0
{ 0x04D1, 55 }, // U+04D1
{ 0x04D2, 48 }, // U+04D2
{ 0x04D3, 55 }, // U+04D3
{ 0x04D4, 40 }, // U+04D4
{ 0x04D5, 82 }, // U+04D5
{ 0x04D6, 40 }, // U+04D6
{ 0x04D7, 82 }, // U+04D7
{ 0x04D8, 52 }, // U+04D8
{ 0x04D9, 60 }, // U+04D9
{ 0x04DA, 52 }, // U+04DA
{ 0x04DB, 60 }, // U+04DB
{ 0x04DC, 46 }, // U+04DC
{ 0x04DD, 61 }, // U+04DD
{ 0x04DE, 73 }, // U+04DE
{ 0x04DF, 57 }, // U+04DF
{ 0x04E3, 62 }, // U+04E3
{ 0x04E5, 62 }, // U+04E5
{ 0x04E6, 52 }, // U+04E6
{ 0x04E7, 60 }, // U+04E7
{ 0x04E8, 52 }, // U+04E8
{ 0x04E9, 60 }, // U+04E9
{ 0x04EA, 52 }, // U+04EA
{ 0x04EB, 60 }, // U+04EB
{ 0x04EC, 52 }, // U+04EC
{ 0x04ED, 60 }, // U+04ED
{ 0x04EE, 47 }, // U+04EE
{ 0x04EF, 64 }, // U+04EF
{ 0x04F0, 47 }, // U+04F0
{ 0x04F1, 64 }, // U+04F1
{ 0x04F2, 47 }, // U+04F2
{ 0x04F3, 64 }, // U+04F3
{ 0x04F5, 62 }, // U+04F5
{ 0x04F6, 74 }, // U+04F6
{ 0x04F7, 75 }, // U+04F7
{ 0x04F9, 62 }, // U+04F9
{ 0x04FA, 76 }, // U+04FA
{ 0x04FB, 77 }, // U+04FB
{ 0x04FC, 78 }, // U+04FC
{ 0x04FD, 79 }, // U+04FD
{ 0x04FE, 46 }, // U+04FE
{ 0x04FF, 79 }, // U+04FF
{ 0x1EA0, 7 }, // U+1EA0
{ 0x1EA1, 21 }, // U+1EA1
{ 0x1EA2, 7 }, // U+1EA2
{ 0x1EA3, 21 }, // U+1EA3
{ 0x1EA4, 7 }, // U+1EA4
{ 0x1EA5, 21 }, // U+1EA5
{ 0x1EA6, 7 }, // U+1EA6
{ 0x1EA7, 21 }, // U+1EA7
{ 0x1EA8, 7 }, // U+1EA8
{ 0x1EA9, 21 }, // U+1EA9
{ 0x1EAA, 7 }, // U+1EAA
{ 0x1EAB, 21 }, // U+1EAB
{ 0x1EAC, 7 }, // U+1EAC
{ 0x1EAD, 21 }, // U+1EAD
{ 0x1EAE, 7 }, // U+1EAE
{ 0x1EAF, 21 }, // U+1EAF
{ 0x1EB0, 7 }, // U+1EB0
{ 0x1EB1, 21 }, // U+1EB1
{ 0x1EB2, 7 }, // U+1EB2
{ 0x1EB3, 21 }, // U+1EB3
{ 0x1EB4, 7 }, // U+1EB4
{ 0x1EB5, 21 }, // U+1EB5
{ 0x1EB6, 7 }, // U+1EB6
{ 0x1EB7, 21 }, // U+1EB7
{ 0x1EB8, 11 }, // U+1EB8
{ 0x1EB9, 22 }, // U+1EB9
{ 0x1EBA, 11 }, // U+1EBA
{ 0x1EBB, 22 }, // U+1EBB
{ 0x1EBC, 11 }, // U+1EBC
{ 0x1EBD, 22 }, // U+1EBD
{ 0x1EBE, 11 }, // U+1EBE
{ 0x1EBF, 22 }, // U+1EBF
{ 0x1EC0, 11 }, // U+1EC0
{ 0x1EC1, 22 }, // U+1EC1
{ 0x1EC2, 11 }, // U+1EC2
{ 0x1EC3, 22 }, // U+1EC3
{ 0x1EC4, 11 }, // U+1EC4
{ 0x1EC5, 22 }, // U+1EC5
{ 0x1EC6, 11 }, // U+1EC6
{ 0x1EC7, 22 }, // U+1EC7
{ 0x1ECC, 10 }, // U+1ECC
{ 0x1ECD, 22 }, // U+1ECD
{ 0x1ECE, 10 }, // U+1ECE
{ 0x1ECF, 22 }, // U+1ECF
{ 0x1ED0, 10 }, // U+1ED0
{ 0x1ED1, 22 }, // U+1ED1
{ 0x1ED2, 10 }, // U+1ED2
{ 0x1ED3, 22 }, // U+1ED3
{ 0x1ED4, 10 }, // U+1ED4
{ 0x1ED5, 22 }, // U+1ED5
{ 0x1ED6, 10 }, // U+1ED6
{ 0x1ED7, 22 }, // U+1ED7
{ 0x1ED8, 10 }, // U+1ED8
{ 0x1ED9, 22 }, // U+1ED9
{ 0x1EDA, 37 }, // U+1EDA
{ 0x1EDB, 38 }, // U+1EDB
{ 0x1EDC, 37 }, // U+1EDC
{ 0x1EDD, 38 }, // U+1EDD
{ 0x1EDE, 37 }, // U+1EDE
{ 0x1EDF, 38 }, // U+1EDF
{ 0x1EE0, 37 }, // U+1EE0
{ 0x1EE1, 38 }, // U+1EE1
{ 0x1EE2, 37 }, // U+1EE2
{ 0x1EE3, 38 }, // U+1EE3
{ 0x1EE4, 17 }, // U+1EE4
{ 0x1EE6, 17 }, // U+1EE6
{ 0x1EE8, 39 }, // U+1EE8
{ 0x1EE9, 38 }, // U+1EE9
{ 0x1EEA, 39 }, // U+1EEA
{ 0x1EEB, 38 }, // U+1EEB
{ 0x1EEC, 39 }, // U+1EEC
{ 0x1EED, 38 }, // U+1EED
{ 0x1EEE, 39 }, // U+1EEE
{ 0x1EEF, 38 }, // U+1EEF
{ 0x1EF0, 39 }, // U+1EF0
{ 0x1EF1, 38 }, // U+1EF1
{ 0x1EF2, 19 }, // U+1EF2
{ 0x1EF3, 25 }, // U+1EF3
{ 0x1EF4, 19 }, // U+1EF4
{ 0x1EF5, 25 }, // U+1EF5
{ 0x1EF6, 19 }, // U+1EF6
{ 0x1EF7, 25 }, // U+1EF7
{ 0x1EF8, 19 }, // U+1EF8
{ 0x1EF9, 25 }, // U+1EF9
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x2013, 5 }, // U+2013
{ 0x2014, 5 }, // U+2014
{ 0x2015, 5 }, // U+2015
{ 0x2018, 1 }, // U+2018
{ 0x2019, 1 }, // U+2019
{ 0x201A, 4 }, // U+201A
{ 0x201C, 1 }, // U+201C
{ 0x201D, 1 }, // U+201D
{ 0x201E, 4 }, // U+201E
{ 0x2039, 28 }, // U+2039
{ 0x203A, 29 }, // U+203A
{ 0xFB00, 23 }, // U+FB00
};
static const EpdKernClassEntry notosans_18_regularKernRightClasses[] = {
{ 0x0021, 1 }, // !
{ 0x0022, 2 }, // "
{ 0x0026, 3 }, // &
{ 0x0027, 2 }, // '
{ 0x0029, 4 }, // )
{ 0x002C, 5 }, // ,
{ 0x002D, 6 }, // -
{ 0x002E, 5 }, // .
{ 0x003A, 7 }, // :
{ 0x003B, 7 }, // ;
{ 0x003F, 8 }, // ?
{ 0x0041, 9 }, // A
{ 0x0043, 10 }, // C
{ 0x0047, 10 }, // G
{ 0x004A, 11 }, // J
{ 0x004F, 10 }, // O
{ 0x0051, 10 }, // Q
{ 0x0054, 12 }, // T
{ 0x0055, 13 }, // U
{ 0x0056, 14 }, // V
{ 0x0057, 14 }, // W
{ 0x0058, 15 }, // X
{ 0x0059, 16 }, // Y
{ 0x005A, 17 }, // Z
{ 0x005D, 4 }, // ]
{ 0x0061, 18 }, // a
{ 0x0062, 19 }, // b
{ 0x0063, 20 }, // c
{ 0x0064, 20 }, // d
{ 0x0065, 20 }, // e
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0066, 21 }, // f
{ 0x0067, 22 }, // g
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0068, 19 }, // h
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x006A, 23 }, // j
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x006B, 19 }, // k
{ 0x006C, 19 }, // l
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x006D, 24 }, // m
{ 0x006E, 24 }, // n
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x006F, 20 }, // o
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0070, 24 }, // p
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0071, 20 }, // q
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0072, 24 }, // r
{ 0x0073, 25 }, // s
{ 0x0074, 21 }, // t
{ 0x0075, 24 }, // u
{ 0x0076, 26 }, // v
{ 0x0077, 26 }, // w
{ 0x0078, 26 }, // x
{ 0x0079, 26 }, // y
{ 0x007A, 27 }, // z
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x007D, 4 }, // }
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x00AB, 28 }, // U+00AB
{ 0x00BB, 29 }, // U+00BB
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x00C0, 9 }, // U+00C0
{ 0x00C1, 9 }, // U+00C1
{ 0x00C2, 9 }, // U+00C2
{ 0x00C3, 9 }, // U+00C3
{ 0x00C4, 9 }, // U+00C4
{ 0x00C5, 9 }, // U+00C5
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x00C6, 30 }, // U+00C6
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x00C7, 10 }, // U+00C7
{ 0x00D2, 10 }, // U+00D2
{ 0x00D3, 10 }, // U+00D3
{ 0x00D4, 10 }, // U+00D4
{ 0x00D5, 10 }, // U+00D5
{ 0x00D6, 10 }, // U+00D6
{ 0x00D8, 10 }, // U+00D8
{ 0x00D9, 13 }, // U+00D9
{ 0x00DA, 13 }, // U+00DA
{ 0x00DB, 13 }, // U+00DB
{ 0x00DC, 13 }, // U+00DC
{ 0x00DD, 16 }, // U+00DD
{ 0x00E0, 20 }, // U+00E0
{ 0x00E1, 18 }, // U+00E1
{ 0x00E2, 18 }, // U+00E2
{ 0x00E3, 18 }, // U+00E3
{ 0x00E4, 18 }, // U+00E4
{ 0x00E5, 18 }, // U+00E5
{ 0x00E6, 18 }, // U+00E6
{ 0x00E7, 20 }, // U+00E7
{ 0x00E8, 20 }, // U+00E8
{ 0x00E9, 20 }, // U+00E9
{ 0x00EA, 20 }, // U+00EA
{ 0x00EB, 20 }, // U+00EB
{ 0x00F2, 20 }, // U+00F2
{ 0x00F3, 20 }, // U+00F3
{ 0x00F4, 20 }, // U+00F4
{ 0x00F5, 20 }, // U+00F5
{ 0x00F6, 20 }, // U+00F6
{ 0x00F8, 20 }, // U+00F8
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x00F9, 24 }, // U+00F9
{ 0x00FA, 24 }, // U+00FA
{ 0x00FB, 24 }, // U+00FB
{ 0x00FC, 24 }, // U+00FC
{ 0x00FD, 26 }, // U+00FD
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x00FE, 19 }, // U+00FE
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x00FF, 26 }, // U+00FF
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0100, 9 }, // U+0100
{ 0x0101, 18 }, // U+0101
{ 0x0102, 9 }, // U+0102
{ 0x0103, 18 }, // U+0103
{ 0x0104, 9 }, // U+0104
{ 0x0105, 18 }, // U+0105
{ 0x0106, 10 }, // U+0106
{ 0x0107, 20 }, // U+0107
{ 0x0108, 10 }, // U+0108
{ 0x0109, 20 }, // U+0109
{ 0x010A, 10 }, // U+010A
{ 0x010B, 20 }, // U+010B
{ 0x010C, 10 }, // U+010C
{ 0x010D, 20 }, // U+010D
{ 0x010F, 20 }, // U+010F
{ 0x0111, 20 }, // U+0111
{ 0x0113, 20 }, // U+0113
{ 0x0115, 20 }, // U+0115
{ 0x0117, 20 }, // U+0117
{ 0x0119, 20 }, // U+0119
{ 0x011B, 20 }, // U+011B
{ 0x011C, 10 }, // U+011C
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x011D, 22 }, // U+011D
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x011E, 10 }, // U+011E
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x011F, 22 }, // U+011F
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0120, 10 }, // U+0120
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0121, 22 }, // U+0121
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0122, 10 }, // U+0122
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0123, 22 }, // U+0123
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0125, 19 }, // U+0125
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0127, 31 }, // U+0127
{ 0x0129, 32 }, // U+0129
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0137, 19 }, // U+0137
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0138, 24 }, // U+0138
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x013A, 19 }, // U+013A
{ 0x013C, 19 }, // U+013C
{ 0x013E, 19 }, // U+013E
{ 0x0140, 19 }, // U+0140
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0144, 24 }, // U+0144
{ 0x0146, 24 }, // U+0146
{ 0x014B, 24 }, // U+014B
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x014C, 10 }, // U+014C
{ 0x014D, 20 }, // U+014D
{ 0x014E, 10 }, // U+014E
{ 0x014F, 20 }, // U+014F
{ 0x0150, 10 }, // U+0150
{ 0x0151, 20 }, // U+0151
{ 0x0152, 10 }, // U+0152
{ 0x0153, 20 }, // U+0153
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0155, 24 }, // U+0155
{ 0x0157, 24 }, // U+0157
{ 0x015B, 25 }, // U+015B
{ 0x015F, 25 }, // U+015F
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0162, 12 }, // U+0162
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0163, 21 }, // U+0163
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0164, 12 }, // U+0164
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0165, 21 }, // U+0165
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0166, 12 }, // U+0166
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0167, 21 }, // U+0167
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0168, 13 }, // U+0168
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0169, 24 }, // U+0169
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x016A, 13 }, // U+016A
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x016B, 24 }, // U+016B
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x016C, 13 }, // U+016C
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x016D, 24 }, // U+016D
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x016E, 13 }, // U+016E
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x016F, 24 }, // U+016F
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0170, 13 }, // U+0170
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0171, 24 }, // U+0171
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0172, 13 }, // U+0172
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0173, 24 }, // U+0173
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0174, 14 }, // U+0174
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0175, 26 }, // U+0175
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0176, 16 }, // U+0176
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0177, 26 }, // U+0177
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x0178, 16 }, // U+0178
{ 0x0179, 17 }, // U+0179
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x017A, 27 }, // U+017A
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x017B, 17 }, // U+017B
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x017C, 27 }, // U+017C
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x017D, 17 }, // U+017D
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x017E, 27 }, // U+017E
{ 0x01A0, 10 }, // U+01A0
{ 0x01A1, 20 }, // U+01A1
{ 0x01AF, 13 }, // U+01AF
{ 0x01B0, 24 }, // U+01B0
{ 0x01FA, 9 }, // U+01FA
{ 0x01FB, 18 }, // U+01FB
{ 0x01FC, 30 }, // U+01FC
{ 0x01FD, 18 }, // U+01FD
{ 0x01FE, 10 }, // U+01FE
{ 0x01FF, 20 }, // U+01FF
{ 0x0219, 25 }, // U+0219
{ 0x021A, 12 }, // U+021A
{ 0x021B, 21 }, // U+021B
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x0402, 33 }, // U+0402
{ 0x0404, 34 }, // U+0404
{ 0x0405, 35 }, // U+0405
{ 0x0408, 36 }, // U+0408
{ 0x0409, 37 }, // U+0409
{ 0x040B, 33 }, // U+040B
{ 0x040E, 38 }, // U+040E
{ 0x0410, 39 }, // U+0410
{ 0x0414, 40 }, // U+0414
{ 0x0416, 41 }, // U+0416
{ 0x0417, 42 }, // U+0417
{ 0x041B, 37 }, // U+041B
{ 0x041E, 34 }, // U+041E
{ 0x0421, 34 }, // U+0421
{ 0x0422, 33 }, // U+0422
{ 0x0423, 38 }, // U+0423
{ 0x0424, 43 }, // U+0424
{ 0x0425, 41 }, // U+0425
{ 0x0427, 44 }, // U+0427
{ 0x042A, 33 }, // U+042A
{ 0x042D, 42 }, // U+042D
{ 0x042F, 45 }, // U+042F
{ 0x0430, 46 }, // U+0430
{ 0x0431, 47 }, // U+0431
{ 0x0432, 48 }, // U+0432
{ 0x0433, 48 }, // U+0433
{ 0x0434, 49 }, // U+0434
{ 0x0435, 50 }, // U+0435
{ 0x0436, 51 }, // U+0436
{ 0x0437, 52 }, // U+0437
{ 0x0438, 48 }, // U+0438
{ 0x0439, 48 }, // U+0439
{ 0x043A, 48 }, // U+043A
{ 0x043B, 53 }, // U+043B
{ 0x043C, 48 }, // U+043C
{ 0x043D, 48 }, // U+043D
{ 0x043E, 50 }, // U+043E
{ 0x043F, 48 }, // U+043F
{ 0x0440, 48 }, // U+0440
{ 0x0441, 50 }, // U+0441
{ 0x0442, 54 }, // U+0442
{ 0x0443, 55 }, // U+0443
{ 0x0444, 50 }, // U+0444
{ 0x0445, 51 }, // U+0445
{ 0x0446, 48 }, // U+0446
{ 0x0447, 56 }, // U+0447
{ 0x0448, 48 }, // U+0448
{ 0x0449, 48 }, // U+0449
{ 0x044A, 54 }, // U+044A
{ 0x044B, 48 }, // U+044B
{ 0x044C, 48 }, // U+044C
{ 0x044D, 52 }, // U+044D
{ 0x044E, 48 }, // U+044E
{ 0x044F, 57 }, // U+044F
{ 0x0450, 50 }, // U+0450
{ 0x0451, 50 }, // U+0451
{ 0x0452, 58 }, // U+0452
{ 0x0453, 48 }, // U+0453
{ 0x0454, 50 }, // U+0454
{ 0x0455, 59 }, // U+0455
{ 0x0457, 60 }, // U+0457
{ 0x0458, 61 }, // U+0458
{ 0x0459, 53 }, // U+0459
{ 0x045A, 48 }, // U+045A
{ 0x045B, 58 }, // U+045B
{ 0x045C, 48 }, // U+045C
{ 0x045D, 48 }, // U+045D
{ 0x045E, 55 }, // U+045E
{ 0x045F, 48 }, // U+045F
{ 0x0460, 62 }, // U+0460
{ 0x0461, 63 }, // U+0461
{ 0x0462, 64 }, // U+0462
{ 0x0465, 65 }, // U+0465
{ 0x0466, 39 }, // U+0466
{ 0x0467, 49 }, // U+0467
{ 0x0469, 65 }, // U+0469
{ 0x046D, 65 }, // U+046D
{ 0x046E, 42 }, // U+046E
{ 0x0470, 44 }, // U+0470
{ 0x0472, 62 }, // U+0472
{ 0x0473, 46 }, // U+0473
{ 0x0474, 66 }, // U+0474
{ 0x0475, 63 }, // U+0475
{ 0x0476, 66 }, // U+0476
{ 0x0477, 63 }, // U+0477
{ 0x0478, 62 }, // U+0478
{ 0x0479, 46 }, // U+0479
{ 0x047A, 62 }, // U+047A
{ 0x047B, 46 }, // U+047B
{ 0x047C, 62 }, // U+047C
{ 0x047D, 46 }, // U+047D
{ 0x047E, 62 }, // U+047E
{ 0x047F, 63 }, // U+047F
{ 0x0480, 62 }, // U+0480
{ 0x0481, 46 }, // U+0481
{ 0x048B, 65 }, // U+048B
{ 0x048C, 64 }, // U+048C
{ 0x048D, 58 }, // U+048D
{ 0x048F, 65 }, // U+048F
{ 0x0491, 65 }, // U+0491
{ 0x0492, 64 }, // U+0492
{ 0x0495, 65 }, // U+0495
{ 0x0496, 41 }, // U+0496
{ 0x0497, 51 }, // U+0497
{ 0x0498, 42 }, // U+0498
{ 0x0499, 52 }, // U+0499
{ 0x049B, 65 }, // U+049B
{ 0x049D, 65 }, // U+049D
{ 0x049F, 58 }, // U+049F
{ 0x04A0, 67 }, // U+04A0
{ 0x04A1, 54 }, // U+04A1
{ 0x04A3, 65 }, // U+04A3
{ 0x04A5, 65 }, // U+04A5
{ 0x04A7, 65 }, // U+04A7
{ 0x04A8, 62 }, // U+04A8
{ 0x04A9, 46 }, // U+04A9
{ 0x04AA, 62 }, // U+04AA
{ 0x04AB, 46 }, // U+04AB
{ 0x04AC, 33 }, // U+04AC
{ 0x04AD, 54 }, // U+04AD
{ 0x04AE, 68 }, // U+04AE
{ 0x04AF, 69 }, // U+04AF
{ 0x04B0, 68 }, // U+04B0
{ 0x04B1, 69 }, // U+04B1
{ 0x04B2, 41 }, // U+04B2
{ 0x04B3, 51 }, // U+04B3
{ 0x04B4, 67 }, // U+04B4
{ 0x04B5, 54 }, // U+04B5
{ 0x04B6, 44 }, // U+04B6
{ 0x04B7, 56 }, // U+04B7
{ 0x04B8, 44 }, // U+04B8
{ 0x04B9, 56 }, // U+04B9
{ 0x04BB, 65 }, // U+04BB
{ 0x04BC, 70 }, // U+04BC
{ 0x04BD, 71 }, // U+04BD
{ 0x04BE, 70 }, // U+04BE
{ 0x04BF, 71 }, // U+04BF
{ 0x04C1, 41 }, // U+04C1
{ 0x04C2, 51 }, // U+04C2
{ 0x04C4, 65 }, // U+04C4
{ 0x04C5, 72 }, // U+04C5
{ 0x04C6, 49 }, // U+04C6
{ 0x04C8, 65 }, // U+04C8
{ 0x04CA, 65 }, // U+04CA
{ 0x04CB, 44 }, // U+04CB
{ 0x04CC, 56 }, // U+04CC
{ 0x04CE, 65 }, // U+04CE
{ 0x04D0, 39 }, // U+04D0
{ 0x04D1, 73 }, // U+04D1
{ 0x04D2, 39 }, // U+04D2
{ 0x04D3, 73 }, // U+04D3
{ 0x04D4, 39 }, // U+04D4
{ 0x04D5, 73 }, // U+04D5
{ 0x04D7, 46 }, // U+04D7
{ 0x04D8, 74 }, // U+04D8
{ 0x04D9, 73 }, // U+04D9
{ 0x04DA, 74 }, // U+04DA
{ 0x04DB, 73 }, // U+04DB
{ 0x04DC, 41 }, // U+04DC
{ 0x04DD, 51 }, // U+04DD
{ 0x04DE, 42 }, // U+04DE
{ 0x04DF, 52 }, // U+04DF
{ 0x04E3, 48 }, // U+04E3
{ 0x04E5, 48 }, // U+04E5
{ 0x04E6, 62 }, // U+04E6
{ 0x04E7, 46 }, // U+04E7
{ 0x04E8, 62 }, // U+04E8
{ 0x04E9, 46 }, // U+04E9
{ 0x04EA, 62 }, // U+04EA
{ 0x04EB, 46 }, // U+04EB
{ 0x04EC, 42 }, // U+04EC
{ 0x04ED, 52 }, // U+04ED
{ 0x04EE, 38 }, // U+04EE
{ 0x04EF, 55 }, // U+04EF
{ 0x04F0, 38 }, // U+04F0
{ 0x04F1, 55 }, // U+04F1
{ 0x04F2, 38 }, // U+04F2
{ 0x04F3, 55 }, // U+04F3
{ 0x04F4, 44 }, // U+04F4
{ 0x04F5, 56 }, // U+04F5
{ 0x04F7, 65 }, // U+04F7
{ 0x04F9, 48 }, // U+04F9
{ 0x04FA, 64 }, // U+04FA
{ 0x04FC, 41 }, // U+04FC
{ 0x04FD, 51 }, // U+04FD
{ 0x04FE, 41 }, // U+04FE
{ 0x04FF, 51 }, // U+04FF
{ 0x1EA0, 9 }, // U+1EA0
{ 0x1EA1, 18 }, // U+1EA1
{ 0x1EA2, 9 }, // U+1EA2
{ 0x1EA3, 18 }, // U+1EA3
{ 0x1EA4, 9 }, // U+1EA4
{ 0x1EA5, 18 }, // U+1EA5
{ 0x1EA6, 9 }, // U+1EA6
{ 0x1EA7, 18 }, // U+1EA7
{ 0x1EA8, 9 }, // U+1EA8
{ 0x1EA9, 18 }, // U+1EA9
{ 0x1EAA, 9 }, // U+1EAA
{ 0x1EAB, 18 }, // U+1EAB
{ 0x1EAC, 9 }, // U+1EAC
{ 0x1EAD, 18 }, // U+1EAD
{ 0x1EAE, 9 }, // U+1EAE
{ 0x1EAF, 18 }, // U+1EAF
{ 0x1EB0, 9 }, // U+1EB0
{ 0x1EB1, 18 }, // U+1EB1
{ 0x1EB2, 9 }, // U+1EB2
{ 0x1EB3, 18 }, // U+1EB3
{ 0x1EB4, 9 }, // U+1EB4
{ 0x1EB5, 18 }, // U+1EB5
{ 0x1EB6, 9 }, // U+1EB6
{ 0x1EB7, 18 }, // U+1EB7
{ 0x1EB9, 20 }, // U+1EB9
{ 0x1EBB, 20 }, // U+1EBB
{ 0x1EBD, 20 }, // U+1EBD
{ 0x1EBF, 20 }, // U+1EBF
{ 0x1EC1, 20 }, // U+1EC1
{ 0x1EC3, 20 }, // U+1EC3
{ 0x1EC5, 20 }, // U+1EC5
{ 0x1EC7, 20 }, // U+1EC7
{ 0x1ECC, 10 }, // U+1ECC
{ 0x1ECD, 20 }, // U+1ECD
{ 0x1ECE, 10 }, // U+1ECE
{ 0x1ECF, 20 }, // U+1ECF
{ 0x1ED0, 10 }, // U+1ED0
{ 0x1ED1, 20 }, // U+1ED1
{ 0x1ED2, 10 }, // U+1ED2
{ 0x1ED3, 20 }, // U+1ED3
{ 0x1ED4, 10 }, // U+1ED4
{ 0x1ED5, 20 }, // U+1ED5
{ 0x1ED6, 10 }, // U+1ED6
{ 0x1ED7, 20 }, // U+1ED7
{ 0x1ED8, 10 }, // U+1ED8
{ 0x1ED9, 20 }, // U+1ED9
{ 0x1EDA, 10 }, // U+1EDA
{ 0x1EDB, 20 }, // U+1EDB
{ 0x1EDC, 10 }, // U+1EDC
{ 0x1EDD, 20 }, // U+1EDD
{ 0x1EDE, 10 }, // U+1EDE
{ 0x1EDF, 20 }, // U+1EDF
{ 0x1EE0, 10 }, // U+1EE0
{ 0x1EE1, 20 }, // U+1EE1
{ 0x1EE2, 10 }, // U+1EE2
{ 0x1EE3, 20 }, // U+1EE3
{ 0x1EE4, 13 }, // U+1EE4
{ 0x1EE5, 24 }, // U+1EE5
{ 0x1EE6, 13 }, // U+1EE6
{ 0x1EE7, 24 }, // U+1EE7
{ 0x1EE8, 13 }, // U+1EE8
{ 0x1EE9, 24 }, // U+1EE9
{ 0x1EEA, 13 }, // U+1EEA
{ 0x1EEB, 24 }, // U+1EEB
{ 0x1EEC, 13 }, // U+1EEC
{ 0x1EED, 24 }, // U+1EED
{ 0x1EEE, 13 }, // U+1EEE
{ 0x1EEF, 24 }, // U+1EEF
{ 0x1EF0, 13 }, // U+1EF0
{ 0x1EF1, 24 }, // U+1EF1
{ 0x1EF2, 16 }, // U+1EF2
{ 0x1EF4, 16 }, // U+1EF4
{ 0x1EF5, 26 }, // U+1EF5
{ 0x1EF6, 16 }, // U+1EF6
{ 0x1EF7, 26 }, // U+1EF7
{ 0x1EF8, 16 }, // U+1EF8
{ 0x1EF9, 26 }, // U+1EF9
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x2013, 6 }, // U+2013
{ 0x2014, 6 }, // U+2014
{ 0x2015, 6 }, // U+2015
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x2018, 75 }, // U+2018
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x2019, 2 }, // U+2019
{ 0x201A, 5 }, // U+201A
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x201C, 75 }, // U+201C
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
{ 0x201D, 2 }, // U+201D
{ 0x201E, 5 }, // U+201E
{ 0x2026, 5 }, // U+2026
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
{ 0x2039, 28 }, // U+2039
{ 0x203A, 29 }, // U+203A
{ 0xFB00, 21 }, // U+FB00
{ 0xFB01, 21 }, // U+FB01
{ 0xFB02, 21 }, // U+FB02
{ 0xFB03, 21 }, // U+FB03
{ 0xFB04, 21 }, // U+FB04
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
};
static const int8_t notosans_18_regularKernMatrix[] = {
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -3, 0, -2, 0, -2, -2, 0, 0, 0, 0, -3, 0, 2, 0, 0, 0, 0, -2, 0, -3, -3, 0, 0, -1, 0, 0, -2, 0, 0, -3, 0, 0, 0, -2, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, -1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, -1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -3, -1, -3, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 2, 0, -1, 0, 0, 0, 0, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -3, 0, 0, 0, 0, 0, -2, 0, 0, 0, -3, -3, -3, 0, -3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -3, 0, 0, 0, 0, 0, 0, 0, -1, 1, -3, 0, -2, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, -2, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -3, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -3, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, -1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -1, 0, -5, 0, 0, 0, -2, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -1, 0, -3, -2, 0, 0, -3, -1, 0, 0, 0, 0, 0, 0, 0, -3, 0, -3, 0, -3, 0, -2, -3, -1, -2, -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -2, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -2, 0, -3, 0, 0, 0, -3, -1, 0, 0, 0, 0, 0, 0, 0, -2, 0, -2, 0, -2, 0, -2, -2, 0, -1, -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, -1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, -2, -1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -2, 0, -2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -3, 0, 0, 0, 0, 0, 0, 0, -1, 4, -3, 0, -2, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 4, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 2, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 2, 0, 2, 1, 2, 0, -2, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -2, -3, -2, -1, 0, 0, 0, 0, 0, -2,
0, 0, 0, 0, -2, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, -1, 0, 0, -1, 0, -3, -1, 0, 0, -2, 0, 0, -2, -1, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, -3,
0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, -1, -1, 0, 0, -1, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0,
0, 0, 0, 0, -3, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, -2, -1, 0, -4, 0, -5, -4, 0, 0, -2, 0, -2, -2, -2, -1, -4, -3, -2, -1, -2, 0, 0, -1, -2, 1, -2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, 0, 0, 0,
0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -3, -1, 0, 1, 0, -2, 0, 0, 0, 0, -2, -3, 0, 0, 0, 0, 0, -1, 0, 0, 0, -2, -1, -2, 0, 0, 0, 0, 0, 0, 0, -1, 0, -2, -2, -3, 0, -2, 0, 0, 0, -1, -2,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 0, 1, 0, 0, 0, 1, -1, 1, -1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, -2, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, 0, 0, 0,
0, 0, 0, 0, -5, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, -3, -1, -2, -3, -1, 0, -1, 0, 0, -1, 0, 0, -2, -1, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0,
0, -1, 0, -2, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, -1, -2, -2, -2, -2, -2, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -2, -1, 0, -2, 0, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, -1, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -2, -2, -1, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, -2, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, -1, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -2, -1, 0, 0, 0, 0, -1, 0, 0, -2, -2, 0, 0, -2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, -3, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -1, -1, 0, -1, 0, -1, -3, -1, 0, 0, 0, 0, 0, -1, 0, 0, -3, -2, -2, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, -2,
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, -2, 0, 0, 0, 0, 0, 0, 0,
0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0,
0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, -2, 0, 0, 0, 0, -1, 0, 0, -2, 0, -3, -2, 0, 0, -2, 0, 0, -3, 0, 0, -3, 0, -1, -1, 0, -2, -2, -2, 0, 0, 0, 0, 0, -1, -1, 0, -2, 0, 0, 0, -2, -2, -3, -2, -3, 0, 0,
0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, -1, 0, 0, -2, -1, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, -2, 0, 0, -2, 0, -1, -1, 0, 0, 0, -2, 0, 0, 0, 0, 0, -1, 0, 0, -2, 0, 0, 0, 0, -1, -2, -2, 0, 0, 0,
0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -2, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, -2, 0, 0, -2, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, -1, 0, 0, -2, 0, 0, 0, 0, 0, -2, -2, -2, -1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
};
static const EpdLigaturePair notosans_18_regularLigaturePairs[] = {
{ 0x00660066, 0xFB00 }, // f f -> U+FB00
{ 0x00660069, 0xFB01 }, // f i -> U+FB01
{ 0x0066006C, 0xFB02 }, // f l -> U+FB02
{ 0xFB000069, 0xFB03 }, // U+FB00 i -> U+FB03
{ 0xFB00006C, 0xFB04 }, // U+FB00 l -> U+FB04
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
};
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
static const EpdFontData notosans_18_regular = {
notosans_18_regularBitmaps,
notosans_18_regularGlyphs,
notosans_18_regularIntervals,
20,
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
51,
41,
-11,
true,
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
notosans_18_regularGroups,
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
13,
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
notosans_18_regularKernLeftClasses,
notosans_18_regularKernRightClasses,
notosans_18_regularKernMatrix,
473,
473,
feat: Vietnamese glyphs support (#1147) ## Summary * **What is the goal of this PR?** Add Vietnamese glyphs support for the reader's built-in fonts, enabling proper rendering of Vietnamese text in EPUB content. * **What changes are included?** - Added 3 new Unicode intervals to `fontconvert.py` covering Vietnamese characters: - **Latin Extended-B** (Vietnamese subset only): `U+01A0–U+01B0` — Ơ/ơ, Ư/ư - **Vietnamese Extended**: `U+1EA0–U+1EF9` — All precomposed Vietnamese characters with tone marks (Ả, Ấ, Ầ, Ẩ, Ẫ, Ậ, Ắ, …, Ỹ) - Re-generated all 54 built-in font header files (Bookerly, Noto Sans, OpenDyslexic, Ubuntu across all sizes and styles) to include the new Vietnamese glyphs. ## Additional Context * **Scope**: This PR only covers the **reader** fonts. The outer UI still uses the Ubuntu font which does not fully support Vietnamese — UI and i18n will be addressed in a follow-up PR (per discussion in PR #1124). * **Memory impact**: | Metric | Before | After | Delta | |---|---|---|---| | Flash Data (`.rodata`) | 2,971,028 B | 3,290,748 B | **+319,720 B (+10.8%)** | | Total image size | 4,663,235 B | 4,982,955 B | **+319,720 B (+6.9%)** | | Flash usage | 69.1% | 74.0% | **+4.9 pp** | | RAM usage | 29.0% | 29.0% | **No change** | * **Risk**: Low — this is a data-only change (font glyph tables in `.rodata`). No logic changes, no RAM impact. Flash headroom remains comfortable at 74%. --- ### AI Usage Did you use AI tools to help write this code? _**PARTIALLY**_ AI was used to identify the minimal set of Unicode ranges needed for Vietnamese support and to assist with the PR description. --------- Co-authored-by: danoooob <danoooob@example.com>
2026-02-25 00:21:39 +07:00
82,
75,
feat: Support for kerning and ligatures (#873) ## Summary **What is the goal of this PR?** Improved typesetting, including [kerning](https://en.wikipedia.org/wiki/Kerning) and [ligatures](https://en.wikipedia.org/wiki/Ligature_(writing)#Latin_alphabet). **What changes are included?** - The script to convert built-in fonts now adds kerning and ligature information to the generated font headers. - Epub page layout calculates proper kerning spaces and makes ligature substitutions according to the selected font. ![3U1B1808](https://github.com/user-attachments/assets/1accb16f-2f1a-41e5-adca-89f1f1348494) ![3U1B1810](https://github.com/user-attachments/assets/2f6bd007-490e-420f-b774-3380b4add7ea) ![3U1B1815](https://github.com/user-attachments/assets/1986bb77-2db0-46e2-a5d6-8315dae9eb19) ## Additional Context - I am not a typography expert. - The implementation has been reworked from the earlier version, so it is no longer necessary to omit Open Dyslexic, and kerning data now covers all fonts, styles, and codepoints for which we include bitmap data. - Claude Opus 4.6 helped with a lot of this. - There's an included test epub document with lots of kerning and ligature examples, shown in the photos. **_After some time to mature, I think this change is in decent shape to merge and get people testing._** After opening this PR I came across #660, which overlaps in adding ligature support. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES, Claude Opus 4.6**_ --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-24 02:31:43 -06:00
notosans_18_regularLigaturePairs,
5,
Aleo, Noto Sans, Open Dyslexic fonts (#163) ## Summary * Swap out Bookerly font due to licensing issues, replace default font with Aleo * I did a bunch of searching around for a nice replacement font, and this trumped several other like Literata, Merriwether, Vollkorn, etc * Add Noto Sans, and Open Dyslexic as font options * They can be selected in the settings screen * Add font size options (Small, Medium, Large, Extra Large) * Adjustable in settings * Swap out uses of reader font in headings and replaced with slightly larger Ubuntu font * Replaced PixelArial14 font as it was difficult to track down, replace with Space Grotesk * Remove auto formatting on generated font files * Massively speeds up formatting step now that there is a lot more CPP font source * Include fonts with their licenses in the repo ## Additional Context Line compression setting will follow | Font | Small | Medium | Large | X Large | | --- | --- | --- | --- | --- | | Aleo | ![IMG_5704](https://github.com/user-attachments/assets/7acb054f-ddef-4080-b3c8-590cfaf13115) | ![IMG_5705](https://github.com/user-attachments/assets/d4819036-5c89-486e-92c3-86094fa4d89a) | ![IMG_5706](https://github.com/user-attachments/assets/35caf622-d126-4396-9c3e-f927eba1e1f4) | ![IMG_5707](https://github.com/user-attachments/assets/af32370a-6244-400f-bea9-5c27db040b5b) | | Noto Sans | ![IMG_5708](https://github.com/user-attachments/assets/1f9264a5-c069-4e22-9099-a082bfcaabc5) | ![IMG_5709](https://github.com/user-attachments/assets/ef6b07fe-8d87-403a-b152-05f50b69b78e) | ![IMG_5710](https://github.com/user-attachments/assets/112a5d20-262c-4dc0-b67d-980b237e4607) | ![IMG_5711](https://github.com/user-attachments/assets/d25e0e1d-2ace-450d-96dd-618e4efd4805) | | Open Dyslexic | ![IMG_5712](https://github.com/user-attachments/assets/ead64690-f261-4fae-a4a2-0becd1162e2d) | ![IMG_5713](https://github.com/user-attachments/assets/59d60f7d-5142-4591-96b0-c04e0a4c6436) | ![IMG_5714](https://github.com/user-attachments/assets/bb6652cd-1790-46a3-93ea-2b8f70d0d36d) | ![IMG_5715](https://github.com/user-attachments/assets/496e7eb4-c81a-4232-83e9-9ba9148fdea4) |
2025-12-30 18:21:47 +10:00
};