Initial commit

This commit is contained in:
Djuri Baars 2023-06-10 21:23:31 +02:00
commit 56569b8ed2
85 changed files with 39036 additions and 0 deletions

10
.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
data/build
data/.yarn
data/node_modules
src/config.h
.vscode/c_cpp_properties.json

10
.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,10 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

22
README.md Normal file
View file

@ -0,0 +1,22 @@
# BTClock v2
Improved code for BTClock with many features.
## Software
- [PlatformIO](https://platformio.org/platformio-ide).
- [Node.js](https://nodejs.org/en) and [yarn](https://yarnpkg.com/).
## Hardware
- MCU: ESP32 or ESP32-S3 ([Wemos S3 mini](https://www.wemos.cc/en/latest/s3/s3_mini.html) recommended)<br>
**The ESP32 S2 is not supported, it does not have enough RAM**
- Seven eInk displays
- [MCP23017](https://www.microchip.com/en-us/product/mcp23017) I2C Port Expander
- 4x WS2812B leds (optional)
- 5x push buttons (optional)
Recommended to use the BTClock PCB.
## Schematic
![Schematic](doc/schematic.png)

50
data/esbuild.mjs Normal file
View file

@ -0,0 +1,50 @@
import esbuild from "esbuild";
import { sassPlugin } from "esbuild-sass-plugin";
import htmlPlugin from '@chialab/esbuild-plugin-html';
import handlebarsPlugin from "esbuild-plugin-handlebars";
import { clean } from 'esbuild-plugin-clean';
import postcss from "postcss";
import autoprefixer from "autoprefixer";
const hbsOptions = {
additionalHelpers: { splitText: "helpers.js" },
additionalPartials: {},
precompileOptions: {}
}
esbuild
.build({
entryPoints: ["src/css/style.scss", "src/js/script.ts", "src/index.html", "src/js/helpers.js"],
outdir: "build",
bundle: true,
loader: {
".png": "dataurl",
".woff": "dataurl",
".woff2": "dataurl",
".eot": "dataurl",
".ttf": "dataurl",
".svg": "dataurl",
},
plugins: [
clean({
patterns: ['./build/*']
}),
htmlPlugin(),
sassPlugin({
async transform(source) {
const { css } = await postcss([autoprefixer]).process(
source
, { from: undefined });
return css;
},
}),
handlebarsPlugin(hbsOptions),
],
minify: true,
metafile: false,
sourcemap: false
})
.then(() => console.log("⚡ Build complete! ⚡"))
.catch(() => process.exit(1));

23
data/package.json Normal file
View file

@ -0,0 +1,23 @@
{
"name": "data",
"packageManager": "yarn@3.2.1",
"scripts": {
"build": "node esbuild.mjs"
},
"dependencies": {
"esbuild": "0.18.0"
},
"devDependencies": {
"@chialab/esbuild-plugin-html": "^0.17.2",
"@craftamap/esbuild-plugin-html": "^0.5.0",
"@esbuilder/html": "^0.0.6",
"autoprefixer": "^10.4.14",
"bootstrap": "^5.3.0",
"esbuild-plugin-clean": "^1.0.1",
"esbuild-plugin-handlebars": "^1.0.2",
"esbuild-sass-plugin": "^2.9.0",
"handlebars": "^4.7.7",
"postcss": "^8.4.24",
"typescript": "^5.1.3"
}
}

BIN
data/src/css/oswald.woff Normal file

Binary file not shown.

BIN
data/src/css/oswald.woff2 Normal file

Binary file not shown.

110
data/src/css/style.scss Normal file
View file

@ -0,0 +1,110 @@
// @import "../node_modules/bootstrap/scss/bootstrap";
@import "../node_modules/bootstrap/scss/functions";
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/variables-dark";
@import "../node_modules/bootstrap/scss/mixins";
@import "../node_modules/bootstrap/scss/maps";
@import "../node_modules/bootstrap/scss/utilities";
@import "../node_modules/bootstrap/scss/root";
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
@import "../node_modules/bootstrap/scss/containers";
@import "../node_modules/bootstrap/scss/grid";
@import "../node_modules/bootstrap/scss/forms";
@import "../node_modules/bootstrap/scss/buttons";
@import "../node_modules/bootstrap/scss/navbar";
@import "../node_modules/bootstrap/scss/nav";
@import "../node_modules/bootstrap/scss/card";
@import "../node_modules/bootstrap/scss/helpers";
@import "../node_modules/bootstrap/scss/utilities/api";
@font-face {
font-display: swap;
/* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'Oswald';
font-style: normal;
font-weight: 400;
src: url('oswald.woff2') format('woff2'),
/* Chrome 36+, Opera 23+, Firefox 39+ */
url('oswald.woff') format('woff');
/* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
nav {
margin-bottom: 15px;
}
.splitText div:first-child::after {
display: block;
content: '';
margin-top: 0px;
border-bottom: 2px solid;
margin-bottom: 3px;
}
#btcclock-wrapper {
margin: 0 auto;
}
.btclock {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: space-between;
align-items: center;
align-content: stretch;
font-family: 'Oswald', sans-serif;
}
.btclock>div {
padding: 5px;
}
.fg-ffff .btclock>div {
color: #fff;
border-color: #fff;
}
.bg-ffff .btclock>div {
background: #fff;
}
.fg-f800 .btclock>div {
color: #f00;
border-color: #f00;
}
.bg-f800 .btclock>div {
background: #f00;
}
.fg-0 .btclock>div {
color: #000;
border-color: #000;
}
.bg-0 .btclock>div {
background: #000;
}
.splitText {
font-size: 2.2rem;
padding-top: 5px;
padding-bottom: 5px;
text-align: center;
}
.digit {
font-size: 5rem;
padding-left: 10px;
padding-right: 10px;
}
.digit-blank {
content: "abc";
}

0
data/src/font/oswald.css Normal file
View file

150
data/src/index.html Normal file
View file

@ -0,0 +1,150 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<link href="/css/style.css" rel="stylesheet">
<title>&#8383;TClock</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.min.js"
integrity="sha512-RNLkV3d+aLtfcpEyFG8jRbnWHxUqVZozacROI4J2F1sTaDqo1dPQYs01OMi1t1w9Y2FdbSCDSQ2ZVdAC8bzgAg=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
<nav class="navbar navbar-light bg-light">
<div class="container-fluid">
<span class="navbar-brand mb-0 h1">&#8383;TClock</span>
</div>
</nav>
<script id="entry-template" type="text/x-handlebars-template">
<div class="entry">
<h1>Status</h1>
<div class="body">
<div class="btn-group" role="group" aria-label="Basic radio toggle button group">
{{#each screens }}
<input type="radio" class="btn-check" name="btnradio" id="btnradio{{ @index }}" autocomplete="off" {{#ifEquals @index ../currentScreen }} checked {{/ifEquals}} onclick="changeScreen({{ @index }})">
<label class="btn btn-outline-primary" for="btnradio{{ @index }}">{{ this }}</label>
{{/each}}
</div>
<p>Rendered:</p>
{{#if rendered }}
<div class="btcclock-wrapper" id="btcclock-wrapper">
<div class="btclock">
{{#each data }}
{{{splitText this}}}
{{/each}}
</div></div>
{{/if}}
{{#if ledStatus }}
<p>LED status:</p>
{{#each ledStatus }}
<div style="background: #{{ this }}">&nbsp;</div>
{{/each}}
{{/if}}
</div>
</div>
</script>
<div class="container-fluid">
<div class="row">
<div class="col">
<div class="h-100 p-3 border bg-light">
<h1>Custom text</h1>
<form name="customText" id="customTextForm">
<div class="row">
<label for="customText" class="col-sm-4 col-form-label">Text</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="customText" name="customText" maxlength="7">
</div>
</div>
<footer>
<button type="submit" class="btn btn-primary">Show Text</button>
</footer>
</form>
<hr>
<h2>LEDs</h2>
<form id="ledsForm" name="ledsForm">
<div class="row">
<label for="ledColorPicker" class="col-sm-6 col-form-label">LEDs color</label>
<div class="col-sm-6">
<input type="color" id="ledColorPicker" name="pickedColor" value="#ff8800">
</div>
</div>
<button type="button" class="btn btn-secondary" id="turnOffLedsBtn">Turn off</button>
<button type="submit" class="btn btn-primary">Set color</button>
</form>
</div>
</div>
<div class="col">
<div id="output" class="p-3 border bg-light"></div>
</div>
<div class="col">
<div class="h-100 p-3 border bg-light">
<h1>Settings</h1>
<form method="post" action="/api/settings" name="settings" id="settingsForm">
<div class="row">
<label for="fgColor" class="col-sm-6 col-form-label">Text color</label>
<div class="col-sm-6">
<select class="form-select" id="fgColor" name="fgColor">
<option value="0xF800">Red</option>
<option value="0xFFFF">White</option>
<option value="0x0">Black</option>
</select>
</div>
</div>
<div class="row">
<label for="bgColor" class="col-sm-6 col-form-label">Background color</label>
<div class="col-sm-6">
<select class="form-select" id="bgColor" name="bgColor">
<option value="0xF800">Red</option>
<option value="0xFFFF">White</option>
<option value="0x0">Black</option>
</select>
</div>
</div>
<div class="row">
<label for="timePerScreen" class="col-sm-6 col-form-label">Time per screen</label>
<div class="col-sm-6">
<div class="input-group mb-3">
<input type="text" name="timePerScreen" id="timePerScreen">
<span class="input-group-text" id="basic-addon2">minutes</span>
</div>
</div>
</div>
<div class="row">
<div class=" col-sm-6">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="ledFlashOnUpdate" name="ledFlashOnUpd" value="1">
<label class="form-check-label" for="ledFlashOnUpdate">LED flash on update</label>
</div>
</div>
</div>
<script id="screens-template" type="text/x-handlebars-template">
{{#each screens }}
<div class="row">
<div class=" col-sm-6">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="screen{{id}}" name="screen[{{id}}]" value="1" {{#if enabled}}checked{{/if}}>
<label class="form-check-label" for="screen{{id}}">{{name}}</label>
</div>
</div>
{{/each}}
</script>
<h3>Screens</h3>
<div id="outputScreens"></div>
<button type="submit" class="btn btn-secondary">Reset</button>
<button type="submit" class="btn btn-primary">Save</button>
</form>
</div>
</div>
</div>
</div>
<script src="/js/script.js"></script>
</body>
</html>

17
data/src/js/helpers.js Normal file
View file

@ -0,0 +1,17 @@
//import "handlebars/dist/handlebars.js";
Handlebars.registerHelper('splitText', function (aString) {
if (aString.includes("/")) {
var c = aString.split("/").map((el) => { return "<div class=\"flex-items\">" + el + "</div>"; }).join('');
return "<div class=\"splitText\">" + c + "</div>";
}
if (aString.length == 0 || aString === " ") {
aString = "&nbsp;&nbsp;";
}
//return aString;
return "<div class=\"digit\">" + aString + "</div>";
});
Handlebars.registerHelper('ifEquals', function(arg1, arg2, options) {
return (arg1 == arg2) ? options.fn(this) : options.inverse(this);
});

113
data/src/js/script.ts Normal file
View file

@ -0,0 +1,113 @@
//import "./handlebars.js";
import './helpers.js';
var screens = ["Block Height", "Moscow Time", "Ticker", "Time", "Halving countdown"];
getBcStatus = () => {
fetch('http://btclock3.local/api/status', {
method: 'get'
})
.then(response => response.json())
.then(jsonData => {
var source = document.getElementById("entry-template").innerHTML;
var template = Handlebars.compile(source);
var context = { currentScreen: jsonData.currentScreen, rendered: jsonData.rendered, data: jsonData.data, screens: screens, ledStatus: jsonData.ledStatus ? jsonData.ledStatus.map((t) => (t).toString(16)) : [] };
document.getElementById('output').innerHTML = template(context);
})
.catch(err => {
//error block
});
}
interval = setInterval(getBcStatus, 2500);
getBcStatus();
fetch('http://btclock3.local/api/settings', {
method: 'get'
})
.then(response => response.json())
.then(jsonData => {
var fgColor = ("0x" + jsonData.fgColor.toString(16).toUpperCase());
if (jsonData.epdColors == 2) {
document.getElementById('fgColor').querySelector('[value="0xF800"]').remove();
document.getElementById('bgColor').querySelector('[value="0xF800"]').remove();
}
document.getElementById('output').classList.add("fg-" + jsonData.fgColor.toString(16));
document.getElementById('output').classList.add("bg-" + jsonData.bgColor.toString(16));
document.getElementById('fgColor').value = fgColor;
document.getElementById('bgColor').value = "0x" + jsonData.bgColor.toString(16).toUpperCase();
if (jsonData.ledFlashOnUpdate)
document.getElementById('ledFlashOnUpdate').checked = true;
document.getElementById('timePerScreen').value = jsonData.timerSeconds / 60;
var source = document.getElementById("screens-template").innerHTML;
var template = Handlebars.compile(source);
var context = { screens: jsonData.screens };
document.getElementById('outputScreens').innerHTML = template(context);
})
.catch(err => {
console.log('error', err);
});
var settingsForm = document.querySelector('#settingsForm');
settingsForm.onsubmit = (event) => {
var formData = new FormData(settingsForm);
fetch("http://btclock3.local/api/settings",
{
body: formData,
method: "post"
}).then(() => {
console.log('Submitted');
});
return false;
}
var ledsForm = document.querySelector('#ledsForm');
ledsForm.onsubmit = (event) => {
var formData = new FormData(ledsForm);
fetch('/api/lights/' + encodeURIComponent(formData.get('pickedColor').substring(1)), {
method: 'get'
})
return false;
}
turnOffLedsBtn.onclick = (event) => {
fetch('/api/lights/off', {
method: 'get'
})
return false;
}
var textForm = document.querySelector('#customTextForm');
textForm.onsubmit = (event) => {
var formData = new FormData(textForm);
fetch('/api/show/text/' + encodeURIComponent(formData.get('customText')), {
method: 'get'
})
.then(response => response.json())
.catch(err => {
//error block
});
return false;
}
changeScreen = (id) => {
fetch('/api/show/screen/' + encodeURIComponent(id), {
method: 'get'
})
.then(response => response.json())
.catch(err => {
//error block
});
}

48
data/src/wifi.html Normal file
View file

@ -0,0 +1,48 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<link href="/css/style.css" rel="stylesheet">
<title>&#8383;TClock WiFi Settings</title>
</head>
<body>
<nav class="navbar navbar-light bg-light">
<div class="container-fluid">
<span class="navbar-brand mb-0 h1">&#8383;TClock WiFi Settings</span>
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col">
<div class="h-100 p-3 border bg-light">
<h1>WiFi Settings</h1>
<form name="customText" id="customTextForm" method="post" action="/setup/wifi">
<div class="row">
<label for="ssid" class="col-sm-4 col-form-label">SSID</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="ssid" name="ssid" required>
</div>
</div>
<div class="row">
<label for="password" class="col-sm-4 col-form-label">Password</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="password" name="password" required>
</div>
</div>
<footer>
<button type="submit" class="btn btn-primary">Save and connect</button>
<p><small>The BTClock will restart and connect to your network. If it doesn't, reset to factory settings by holding the red button while booting to retry.</small></p>
</footer>
</form>
</div>
</div>
</div>
</div>
</body>
</html>

6
data/tsconfig.json Normal file
View file

@ -0,0 +1,6 @@
{
"files": ["src/js/**.ts"],
"compilerOptions": {
"noImplicitAny": true,
}
}

2640
data/yarn.lock Normal file

File diff suppressed because it is too large Load diff

BIN
doc/schematic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

260
include/FreeRTOSConfig.h Normal file
View file

@ -0,0 +1,260 @@
/*
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#include "sdkconfig.h"
/* for likely and unlikely */
#include "esp_compiler.h"
// The arch-specific FreeRTOSConfig_arch.h in port/<arch>/include.
#include "freertos/FreeRTOSConfig_arch.h"
#if !(defined(FREERTOS_CONFIG_XTENSA_H) \
|| defined(FREERTOS_CONFIG_RISCV_H) \
|| defined(FREERTOS_CONFIG_LINUX_H))
#error "Needs architecture-speific FreeRTOSConfig.h!"
#endif
#ifndef CONFIG_FREERTOS_UNICORE
#define portNUM_PROCESSORS 2
#else
#define portNUM_PROCESSORS 1
#endif
#define portUSING_MPU_WRAPPERS 0
#define configUSE_MUTEX 1
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS
#define configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS 1
/* configASSERT behaviour */
#ifndef __ASSEMBLER__
#include <assert.h>
// If CONFIG_FREERTOS_ASSERT_DISABLE is set then configASSERT is defined empty later in FreeRTOS.h and the macro
// configASSERT_DEFINED remains unset (meaning some warnings are avoided)
#if defined(CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE)
#define configASSERT(a) if (unlikely(!(a))) { \
esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__, \
__FUNCTION__); \
}
#elif defined(CONFIG_FREERTOS_ASSERT_FAIL_ABORT)
#define configASSERT(a) assert(a)
#endif
#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION
#define UNTESTED_FUNCTION() { esp_rom_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0)
#else
#define UNTESTED_FUNCTION()
#endif
#endif /* def __ASSEMBLER__ */
/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* Note that the default heap size is deliberately kept small so that
* the build is more likely to succeed for configurations with limited
* memory.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*----------------------------------------------------------*/
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configRECORD_STACK_HIGH_ADDRESS 1
#define configTICK_RATE_HZ ( CONFIG_FREERTOS_HZ )
/* This has impact on speed of search for highest priority */
#define configMAX_PRIORITIES ( 25 )
/* Various things that impact minimum stack sizes */
/* Higher stack checker modes cause overhead on each function call */
#if CONFIG_STACK_CHECK_ALL || CONFIG_STACK_CHECK_STRONG
#define configSTACK_OVERHEAD_CHECKER 256
#else
#define configSTACK_OVERHEAD_CHECKER 0
#endif
/* with optimizations disabled, scheduler uses additional stack */
#if CONFIG_COMPILER_OPTIMIZATION_NONE
#define configSTACK_OVERHEAD_OPTIMIZATION 320
#else
#define configSTACK_OVERHEAD_OPTIMIZATION 0
#endif
/* apptrace mdule increases minimum stack usage */
#if CONFIG_APPTRACE_ENABLE
#define configSTACK_OVERHEAD_APPTRACE 1280
#else
#define configSTACK_OVERHEAD_APPTRACE 0
#endif
/* Stack watchpoint decreases minimum usable stack size by up to 60 bytes.
See FreeRTOS FREERTOS_WATCHPOINT_END_OF_STACK option in Kconfig. */
#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
#define configSTACK_OVERHEAD_WATCHPOINT 60
#else
#define configSTACK_OVERHEAD_WATCHPOINT 0
#endif
#define configSTACK_OVERHEAD_TOTAL ( \
configSTACK_OVERHEAD_CHECKER + \
configSTACK_OVERHEAD_OPTIMIZATION + \
configSTACK_OVERHEAD_APPTRACE + \
configSTACK_OVERHEAD_WATCHPOINT \
)
#define configMINIMAL_STACK_SIZE (768 + configSTACK_OVERHEAD_TOTAL)
#ifndef configIDLE_TASK_STACK_SIZE
#define configIDLE_TASK_STACK_SIZE CONFIG_FREERTOS_IDLE_TASK_STACKSIZE
#endif
/* Minimal heap size to make sure examples can run on memory limited
configs. Adjust this to suit your system. */
//We define the heap to span all of the non-statically-allocated shared RAM. ToDo: Make sure there
//is some space left for the app and main cpu when running outside of a thread.
#define configAPPLICATION_ALLOCATED_HEAP 1
#define configTOTAL_HEAP_SIZE (&_heap_end - &_heap_start)//( ( size_t ) (64 * 1024) )
#define configMAX_TASK_NAME_LEN ( CONFIG_FREERTOS_MAX_TASK_NAME_LEN )
#ifdef CONFIG_FREERTOS_USE_TRACE_FACILITY
#define configUSE_TRACE_FACILITY 1 /* Used by uxTaskGetSystemState(), and other trace facility functions */
#endif
#ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS
#define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* Used by vTaskList() */
#endif
#ifdef CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID
#define configTASKLIST_INCLUDE_COREID 1
#endif
#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS
#define configGENERATE_RUN_TIME_STATS 1 /* Used by vTaskGetRunTimeStats() */
#endif
#define configBENCHMARK 0
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 0
#define configQUEUE_REGISTRY_SIZE CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_COUNTING_SEMAPHORES 1
#if CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE
#define configCHECK_FOR_STACK_OVERFLOW 0
#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL
#define configCHECK_FOR_STACK_OVERFLOW 1
#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY
#define configCHECK_FOR_STACK_OVERFLOW 2
#endif
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
#define INCLUDE_pcTaskGetTaskName 1
#define INCLUDE_xTaskGetIdleTaskHandle 1
#define INCLUDE_pxTaskGetStackStart 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTaskAbortDelay 1
#define INCLUDE_xTaskGetHandle 1
#define INCLUDE_xSemaphoreGetMutexHolder 1
#define INCLUDE_xTimerPendFunctionCall 1
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 //Currently there is no need for this API
/* The priority at which the tick interrupt runs. This should probably be
kept at 1. */
#define configKERNEL_INTERRUPT_PRIORITY 1
#if !CONFIG_IDF_TARGET_LINUX
#define configUSE_NEWLIB_REENTRANT 1
#endif
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configSUPPORT_STATIC_ALLOCATION 1
#ifndef __ASSEMBLER__
#if CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP
extern void vPortCleanUpTCB ( void *pxTCB );
#define portCLEAN_UP_TCB( pxTCB ) vPortCleanUpTCB( pxTCB )
#endif
#endif
/* Test FreeRTOS timers (with timer task) and more. */
/* Some files don't compile if this flag is disabled */
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY CONFIG_FREERTOS_TIMER_TASK_PRIORITY
#define configTIMER_QUEUE_LENGTH CONFIG_FREERTOS_TIMER_QUEUE_LENGTH
#define configTIMER_TASK_STACK_DEPTH CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH
#define configUSE_QUEUE_SETS 1
#define configUSE_TICKLESS_IDLE CONFIG_FREERTOS_USE_TICKLESS_IDLE
#if configUSE_TICKLESS_IDLE
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP
#endif //configUSE_TICKLESS_IDLE
#if CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT
#define configENABLE_TASK_SNAPSHOT 1
#endif
#ifndef configENABLE_TASK_SNAPSHOT
#define configENABLE_TASK_SNAPSHOT 0
#endif
#if CONFIG_SYSVIEW_ENABLE
#ifndef __ASSEMBLER__
#include "SEGGER_SYSVIEW_FreeRTOS.h"
#undef INLINE // to avoid redefinition
#endif /* def __ASSEMBLER__ */
#endif
#if CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER
#define configCHECK_MUTEX_GIVEN_BY_OWNER 1
#else
#define configCHECK_MUTEX_GIVEN_BY_OWNER 0
#endif
#define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 1
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1
// backward compatibility for 4.4
#define xTaskRemoveFromUnorderedEventList vTaskRemoveFromUnorderedEventList
#define configNUM_CORES portNUM_PROCESSORS
#endif /* FREERTOS_CONFIG_H */

1028
lib/qrcode/qrcodegen.c Normal file

File diff suppressed because it is too large Load diff

385
lib/qrcode/qrcodegen.h Normal file
View file

@ -0,0 +1,385 @@
/*
* QR Code generator library (C)
*
* Copyright (c) Project Nayuki. (MIT License)
* https://www.nayuki.io/page/qr-code-generator-library
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
* - The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* - The Software is provided "as is", without warranty of any kind, express or
* implied, including but not limited to the warranties of merchantability,
* fitness for a particular purpose and noninfringement. In no event shall the
* authors or copyright holders be liable for any claim, damages or other
* liability, whether in an action of contract, tort or otherwise, arising from,
* out of or in connection with the Software or the use or other dealings in the
* Software.
*/
#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* This library creates QR Code symbols, which is a type of two-dimension barcode.
* Invented by Denso Wave and described in the ISO/IEC 18004 standard.
* A QR Code structure is an immutable square grid of dark and light cells.
* The library provides functions to create a QR Code from text or binary data.
* The library covers the QR Code Model 2 specification, supporting all versions (sizes)
* from 1 to 40, all 4 error correction levels, and 4 character encoding modes.
*
* Ways to create a QR Code object:
* - High level: Take the payload data and call qrcodegen_encodeText() or qrcodegen_encodeBinary().
* - Low level: Custom-make the list of segments and call
* qrcodegen_encodeSegments() or qrcodegen_encodeSegmentsAdvanced().
* (Note that all ways require supplying the desired error correction level and various byte buffers.)
*/
/*---- Enum and struct types----*/
/*
* The error correction level in a QR Code symbol.
*/
enum qrcodegen_Ecc {
// Must be declared in ascending order of error protection
// so that an internal qrcodegen function works properly
qrcodegen_Ecc_LOW = 0 , // The QR Code can tolerate about 7% erroneous codewords
qrcodegen_Ecc_MEDIUM , // The QR Code can tolerate about 15% erroneous codewords
qrcodegen_Ecc_QUARTILE, // The QR Code can tolerate about 25% erroneous codewords
qrcodegen_Ecc_HIGH , // The QR Code can tolerate about 30% erroneous codewords
};
/*
* The mask pattern used in a QR Code symbol.
*/
enum qrcodegen_Mask {
// A special value to tell the QR Code encoder to
// automatically select an appropriate mask pattern
qrcodegen_Mask_AUTO = -1,
// The eight actual mask patterns
qrcodegen_Mask_0 = 0,
qrcodegen_Mask_1,
qrcodegen_Mask_2,
qrcodegen_Mask_3,
qrcodegen_Mask_4,
qrcodegen_Mask_5,
qrcodegen_Mask_6,
qrcodegen_Mask_7,
};
/*
* Describes how a segment's data bits are interpreted.
*/
enum qrcodegen_Mode {
qrcodegen_Mode_NUMERIC = 0x1,
qrcodegen_Mode_ALPHANUMERIC = 0x2,
qrcodegen_Mode_BYTE = 0x4,
qrcodegen_Mode_KANJI = 0x8,
qrcodegen_Mode_ECI = 0x7,
};
/*
* A segment of character/binary/control data in a QR Code symbol.
* The mid-level way to create a segment is to take the payload data
* and call a factory function such as qrcodegen_makeNumeric().
* The low-level way to create a segment is to custom-make the bit buffer
* and initialize a qrcodegen_Segment struct with appropriate values.
* Even in the most favorable conditions, a QR Code can only hold 7089 characters of data.
* Any segment longer than this is meaningless for the purpose of generating QR Codes.
* Moreover, the maximum allowed bit length is 32767 because
* the largest QR Code (version 40) has 31329 modules.
*/
struct qrcodegen_Segment {
// The mode indicator of this segment.
enum qrcodegen_Mode mode;
// The length of this segment's unencoded data. Measured in characters for
// numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode.
// Always zero or positive. Not the same as the data's bit length.
int numChars;
// The data bits of this segment, packed in bitwise big endian.
// Can be null if the bit length is zero.
uint8_t *data;
// The number of valid data bits used in the buffer. Requires
// 0 <= bitLength <= 32767, and bitLength <= (capacity of data array) * 8.
// The character count (numChars) must agree with the mode and the bit buffer length.
int bitLength;
};
/*---- Macro constants and functions ----*/
#define qrcodegen_VERSION_MIN 1 // The minimum version number supported in the QR Code Model 2 standard
#define qrcodegen_VERSION_MAX 40 // The maximum version number supported in the QR Code Model 2 standard
// Calculates the number of bytes needed to store any QR Code up to and including the given version number,
// as a compile-time constant. For example, 'uint8_t buffer[qrcodegen_BUFFER_LEN_FOR_VERSION(25)];'
// can store any single QR Code from version 1 to 25 (inclusive). The result fits in an int (or int16).
// Requires qrcodegen_VERSION_MIN <= n <= qrcodegen_VERSION_MAX.
#define qrcodegen_BUFFER_LEN_FOR_VERSION(n) ((((n) * 4 + 17) * ((n) * 4 + 17) + 7) / 8 + 1)
// The worst-case number of bytes needed to store one QR Code, up to and including
// version 40. This value equals 3918, which is just under 4 kilobytes.
// Use this more convenient value to avoid calculating tighter memory bounds for buffers.
#define qrcodegen_BUFFER_LEN_MAX qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX)
/*---- Functions (high level) to generate QR Codes ----*/
/*
* Encodes the given text string to a QR Code, returning true if successful.
* If the data is too long to fit in any version in the given range
* at the given ECC level, then false is returned.
*
* The input text must be encoded in UTF-8 and contain no NULs.
* Requires 1 <= minVersion <= maxVersion <= 40.
*
* The smallest possible QR Code version within the given range is automatically
* chosen for the output. Iff boostEcl is true, then the ECC level of the result
* may be higher than the ecl argument if it can be done without increasing the
* version. The mask is either between qrcodegen_Mask_0 to 7 to force that mask, or
* qrcodegen_Mask_AUTO to automatically choose an appropriate mask (which may be slow).
*
* About the arrays, letting len = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion):
* - Before calling the function:
* - The array ranges tempBuffer[0 : len] and qrcode[0 : len] must allow
* reading and writing; hence each array must have a length of at least len.
* - The two ranges must not overlap (aliasing).
* - The initial state of both ranges can be uninitialized
* because the function always writes before reading.
* - After the function returns:
* - Both ranges have no guarantee on which elements are initialized and what values are stored.
* - tempBuffer contains no useful data and should be treated as entirely uninitialized.
* - If successful, qrcode can be passed into qrcodegen_getSize() and qrcodegen_getModule().
*
* If successful, the resulting QR Code may use numeric,
* alphanumeric, or byte mode to encode the text.
*
* In the most optimistic case, a QR Code at version 40 with low ECC
* can hold any UTF-8 string up to 2953 bytes, or any alphanumeric string
* up to 4296 characters, or any digit string up to 7089 characters.
* These numbers represent the hard upper limit of the QR Code standard.
*
* Please consult the QR Code specification for information on
* data capacities per version, ECC level, and text encoding mode.
*/
bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[],
enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl);
/*
* Encodes the given binary data to a QR Code, returning true if successful.
* If the data is too long to fit in any version in the given range
* at the given ECC level, then false is returned.
*
* Requires 1 <= minVersion <= maxVersion <= 40.
*
* The smallest possible QR Code version within the given range is automatically
* chosen for the output. Iff boostEcl is true, then the ECC level of the result
* may be higher than the ecl argument if it can be done without increasing the
* version. The mask is either between qrcodegen_Mask_0 to 7 to force that mask, or
* qrcodegen_Mask_AUTO to automatically choose an appropriate mask (which may be slow).
*
* About the arrays, letting len = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion):
* - Before calling the function:
* - The array ranges dataAndTemp[0 : len] and qrcode[0 : len] must allow
* reading and writing; hence each array must have a length of at least len.
* - The two ranges must not overlap (aliasing).
* - The input array range dataAndTemp[0 : dataLen] should normally be
* valid UTF-8 text, but is not required by the QR Code standard.
* - The initial state of dataAndTemp[dataLen : len] and qrcode[0 : len]
* can be uninitialized because the function always writes before reading.
* - After the function returns:
* - Both ranges have no guarantee on which elements are initialized and what values are stored.
* - dataAndTemp contains no useful data and should be treated as entirely uninitialized.
* - If successful, qrcode can be passed into qrcodegen_getSize() and qrcodegen_getModule().
*
* If successful, the resulting QR Code will use byte mode to encode the data.
*
* In the most optimistic case, a QR Code at version 40 with low ECC can hold any byte
* sequence up to length 2953. This is the hard upper limit of the QR Code standard.
*
* Please consult the QR Code specification for information on
* data capacities per version, ECC level, and text encoding mode.
*/
bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[],
enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl);
/*---- Functions (low level) to generate QR Codes ----*/
/*
* Encodes the given segments to a QR Code, returning true if successful.
* If the data is too long to fit in any version at the given ECC level,
* then false is returned.
*
* The smallest possible QR Code version is automatically chosen for
* the output. The ECC level of the result may be higher than the
* ecl argument if it can be done without increasing the version.
*
* About the byte arrays, letting len = qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX):
* - Before calling the function:
* - The array ranges tempBuffer[0 : len] and qrcode[0 : len] must allow
* reading and writing; hence each array must have a length of at least len.
* - The two ranges must not overlap (aliasing).
* - The initial state of both ranges can be uninitialized
* because the function always writes before reading.
* - The input array segs can contain segments whose data buffers overlap with tempBuffer.
* - After the function returns:
* - Both ranges have no guarantee on which elements are initialized and what values are stored.
* - tempBuffer contains no useful data and should be treated as entirely uninitialized.
* - Any segment whose data buffer overlaps with tempBuffer[0 : len]
* must be treated as having invalid values in that array.
* - If successful, qrcode can be passed into qrcodegen_getSize() and qrcodegen_getModule().
*
* Please consult the QR Code specification for information on
* data capacities per version, ECC level, and text encoding mode.
*
* This function allows the user to create a custom sequence of segments that switches
* between modes (such as alphanumeric and byte) to encode text in less space.
* This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary().
*/
bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len,
enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]);
/*
* Encodes the given segments to a QR Code, returning true if successful.
* If the data is too long to fit in any version in the given range
* at the given ECC level, then false is returned.
*
* Requires 1 <= minVersion <= maxVersion <= 40.
*
* The smallest possible QR Code version within the given range is automatically
* chosen for the output. Iff boostEcl is true, then the ECC level of the result
* may be higher than the ecl argument if it can be done without increasing the
* version. The mask is either between qrcodegen_Mask_0 to 7 to force that mask, or
* qrcodegen_Mask_AUTO to automatically choose an appropriate mask (which may be slow).
*
* About the byte arrays, letting len = qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX):
* - Before calling the function:
* - The array ranges tempBuffer[0 : len] and qrcode[0 : len] must allow
* reading and writing; hence each array must have a length of at least len.
* - The two ranges must not overlap (aliasing).
* - The initial state of both ranges can be uninitialized
* because the function always writes before reading.
* - The input array segs can contain segments whose data buffers overlap with tempBuffer.
* - After the function returns:
* - Both ranges have no guarantee on which elements are initialized and what values are stored.
* - tempBuffer contains no useful data and should be treated as entirely uninitialized.
* - Any segment whose data buffer overlaps with tempBuffer[0 : len]
* must be treated as having invalid values in that array.
* - If successful, qrcode can be passed into qrcodegen_getSize() and qrcodegen_getModule().
*
* Please consult the QR Code specification for information on
* data capacities per version, ECC level, and text encoding mode.
*
* This function allows the user to create a custom sequence of segments that switches
* between modes (such as alphanumeric and byte) to encode text in less space.
* This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary().
*/
bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl,
int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]);
/*
* Tests whether the given string can be encoded as a segment in numeric mode.
* A string is encodable iff each character is in the range 0 to 9.
*/
bool qrcodegen_isNumeric(const char *text);
/*
* Tests whether the given string can be encoded as a segment in alphanumeric mode.
* A string is encodable iff each character is in the following set: 0 to 9, A to Z
* (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.
*/
bool qrcodegen_isAlphanumeric(const char *text);
/*
* Returns the number of bytes (uint8_t) needed for the data buffer of a segment
* containing the given number of characters using the given mode. Notes:
* - Returns SIZE_MAX on failure, i.e. numChars > INT16_MAX or the internal
* calculation of the number of needed bits exceeds INT16_MAX (i.e. 32767).
* - Otherwise, all valid results are in the range [0, ceil(INT16_MAX / 8)], i.e. at most 4096.
* - It is okay for the user to allocate more bytes for the buffer than needed.
* - For byte mode, numChars measures the number of bytes, not Unicode code points.
* - For ECI mode, numChars must be 0, and the worst-case number of bytes is returned.
* An actual ECI segment can have shorter data. For non-ECI modes, the result is exact.
*/
size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars);
/*
* Returns a segment representing the given binary data encoded in
* byte mode. All input byte arrays are acceptable. Any text string
* can be converted to UTF-8 bytes and encoded as a byte mode segment.
*/
struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]);
/*
* Returns a segment representing the given string of decimal digits encoded in numeric mode.
*/
struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]);
/*
* Returns a segment representing the given text string encoded in alphanumeric mode.
* The characters allowed are: 0 to 9, A to Z (uppercase only), space,
* dollar, percent, asterisk, plus, hyphen, period, slash, colon.
*/
struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]);
/*
* Returns a segment representing an Extended Channel Interpretation
* (ECI) designator with the given assignment value.
*/
struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]);
/*---- Functions to extract raw data from QR Codes ----*/
/*
* Returns the side length of the given QR Code, assuming that encoding succeeded.
* The result is in the range [21, 177]. Note that the length of the array buffer
* is related to the side length - every 'uint8_t qrcode[]' must have length at least
* qrcodegen_BUFFER_LEN_FOR_VERSION(version), which equals ceil(size^2 / 8 + 1).
*/
int qrcodegen_getSize(const uint8_t qrcode[]);
/*
* Returns the color of the module (pixel) at the given coordinates, which is false
* for light or true for dark. The top left corner has the coordinates (x=0, y=0).
* If the given coordinates are out of bounds, then false (light) is returned.
*/
bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y);
#ifdef __cplusplus
}
#endif

7
partition.csv Normal file
View file

@ -0,0 +1,7 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 36K, 20K,
otadata, data, ota, 56K, 8K,
app0, app, ota_0, 64K, 3200K,
#app1, app, ota_1, , 1600K,
spiffs, data, spiffs, , 600K,
coredump, data, coredump,, 64K,
1 # Name Type SubType Offset Size Flags
2 nvs data nvs 36K 20K
3 otadata data ota 56K 8K
4 app0 app ota_0 64K 3200K
5 #app1 app ota_1 1600K
6 spiffs data spiffs 600K
7 coredump data coredump 64K

99
platformio.ini Normal file
View file

@ -0,0 +1,99 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[platformio]
data_dir = data/build
[env]
platform = espressif32
framework = arduino
monitor_speed = 115200
upload_speed = 921600
monitor_filters = esp32_exception_decoder, colorize
extra_scripts = post:scripts/extra_script.py
lib_deps =
bblanchon/ArduinoJson@^6.21.2
fbiego/ESP32Time@^2.0.0
zinggjm/GxEPD2@^1.5.2
adafruit/Adafruit MCP23017 Arduino Library@^2.3.0
adafruit/Adafruit NeoPixel@^1.11.0
https://github.com/me-no-dev/ESPAsyncWebServer.git
https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2
[env:esp32doit-devkit-v1]
board = esp32doit-devkit-v1
board_build.partitions = partition.csv
build_flags =
-D IS_BW
-D NO_MCP
-D CONFIG_FREERTOS_USE_TRACE_FACILITY
-D ASYNCWEBSERVER_REGEX
-D CONFIG_ASYNC_TCP_PRIORITY=500
[env:esp32doit-devkit-v1_3C]
board = esp32doit-devkit-v1
board_build.partitions = partition.csv
build_flags =
-D IS_3C
-D CONFIG_FREERTOS_USE_TRACE_FACILITY
[env:esp32wemos-s3-mini_BW]
platform = espressif32
framework = arduino
board = lolin_s3_mini
board_build.partitions = partition.csv
build_flags =
-D IS_S3
-D IS_BW
-D CONFIG_FREERTOS_USE_TRACE_FACILITY
-D WITH_RGB_LED
-D NEOPIXEL_COUNT=4
-DASYNCWEBSERVER_REGEX
; -D WITH_BUTTONS
-D ARDUINO_USB_CDC_ON_BOOT
-D HOSTNAME="\"btclock3\""
-D CONFIG_ASYNC_TCP_PRIORITY=500
[env:esp32wemos-s3-mini_3C]
platform = espressif32
framework = arduino
board = lolin_s3_mini
board_build.partitions = partition.csv
build_flags =
-D IS_3C
-D IS_S3
-D CONFIG_FREERTOS_USE_TRACE_FACILITY
-D WITH_RGB_LED
-D WITH_BUTTONS
-D HOSTNAME="\"btclock3c\""
-D CONFIG_ASYNC_TCP_PRIORITY=500
[env:esp32doit-devkit-v1_nodisp]
board = esp32doit-devkit-v1
board_build.partitions = partition.csv
build_flags =
-D NO_DISPLAY
-D CONFIG_FREERTOS_USE_TRACE_FACILITY
[env:esp32_s3_devkit]
platform = espressif32
board = esp32-s3-devkitc-1
board_build.partitions = partition.csv
;upload_protocol = esp-builtin
build_flags =
-D NO_DISPLAY
-D NO_MCP
-D IS_BW
-D WITH_RGB_LED
-D NEOPIXEL_COUNT=1
-D NEOPIXEL_PIN=38
-D CONFIG_ASYNC_TCP_PRIORITY=500
-DASYNCWEBSERVER_REGEX
-D HOSTNAME="\"btclocks3d\""

7
scripts/extra_script.py Normal file
View file

@ -0,0 +1,7 @@
Import("env")
# Build web interface before building FS
def before_buildfs(source, target, env):
env.Execute("cd data && yarn && yarn build")
env.AddPreAction("$BUILD_DIR/spiffs.bin", before_buildfs)

22
src/config.h.example Normal file
View file

@ -0,0 +1,22 @@
#pragma once
#define NTP_SERVER "nl.pool.ntp.org"
#define FONT_SMALL Antonio_SemiBold20pt7b
#define FONT_BIG Antonio_SemiBold90pt7b
#define TIME_OFFSET_SECONDS 3600
#define OTA_PASSWORD "changeme"
#ifndef HOSTNAME
#define HOSTNAME "btclock"
#endif
#define BITCOIND_HOST ""
#define BITCOIND_PORT 8332
#define BITCOIND_RPC_USER ""
#define BITCOIND_RPC_PASS ""
#define DEFAULT_FG_COLOR GxEPD_WHITE
#define DEFAULT_BG_COLOR GxEPD_BLACK

View file

@ -0,0 +1,482 @@
const uint8_t Antonio_SemiBold20pt7bBitmaps[] PROGMEM = {
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x66, 0x66,
0x66, 0x66, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7B, 0xDE, 0xF7,
0x98, 0xC6, 0x00, 0x03, 0x8F, 0x01, 0xC7, 0x80, 0xE3, 0x80, 0xF1, 0xC0,
0x70, 0xE0, 0x38, 0x70, 0x1C, 0x78, 0x0E, 0x3C, 0x07, 0x1C, 0x07, 0x8E,
0x03, 0x87, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x38, 0xE0, 0x3C,
0x70, 0x1E, 0x38, 0x0E, 0x1C, 0x07, 0x0E, 0x03, 0x8F, 0x0F, 0xFF, 0xF7,
0xFF, 0xF8, 0xF1, 0xC0, 0x70, 0xE0, 0x38, 0x70, 0x1C, 0x78, 0x0E, 0x3C,
0x0F, 0x1C, 0x07, 0x8E, 0x03, 0x87, 0x01, 0xC3, 0x80, 0xE3, 0xC0, 0x71,
0xE0, 0x78, 0xE0, 0x00, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60,
0x1F, 0xC1, 0xFF, 0x9F, 0xFC, 0xFB, 0xF7, 0x87, 0xBC, 0x3D, 0xE1, 0xEF,
0x0F, 0x78, 0x7B, 0xE3, 0xDF, 0x00, 0x7C, 0x01, 0xF8, 0x0F, 0xE0, 0x3F,
0x80, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x3E, 0xF0, 0xF7, 0x87, 0xFC, 0x3F,
0xE1, 0xFF, 0x0F, 0xFC, 0x7B, 0xFF, 0xCF, 0xFE, 0x3F, 0xE0, 0xFE, 0x01,
0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x1F, 0x80, 0x01, 0xC0,
0x07, 0xFE, 0x00, 0x3C, 0x00, 0x7F, 0xE0, 0x03, 0xC0, 0x0F, 0x9F, 0x00,
0x38, 0x00, 0xF0, 0xF0, 0x07, 0x80, 0x0F, 0x0F, 0x00, 0x70, 0x00, 0xF0,
0xF0, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x0E, 0x00,
0x0F, 0x0F, 0x01, 0xE0, 0x00, 0xF0, 0xF0, 0x1C, 0x00, 0x0F, 0x0F, 0x03,
0xC0, 0x60, 0xF0, 0xF0, 0x3C, 0x3F, 0xCF, 0x0F, 0x03, 0x87, 0xFE, 0xF0,
0xF0, 0x78, 0xFF, 0xEF, 0x0F, 0x07, 0x8F, 0x0E, 0xF0, 0xF0, 0xF0, 0xF0,
0xFF, 0x0F, 0x0F, 0x0E, 0x0F, 0xF0, 0xF0, 0xE0, 0xE0, 0xF7, 0xDF, 0x1E,
0x0E, 0x0F, 0x7F, 0xE1, 0xE0, 0xE0, 0xF3, 0xFC, 0x1C, 0x0E, 0x0F, 0x1F,
0x83, 0xC0, 0xE0, 0xF0, 0x00, 0x38, 0x0E, 0x0F, 0x00, 0x07, 0x80, 0xE0,
0xF0, 0x00, 0x78, 0x0E, 0x0F, 0x00, 0x07, 0x00, 0xE0, 0xF0, 0x00, 0xF0,
0x0E, 0x0F, 0x00, 0x0E, 0x00, 0xE0, 0xF0, 0x01, 0xE0, 0x0F, 0x0F, 0x00,
0x1E, 0x00, 0xF1, 0xE0, 0x01, 0xC0, 0x0F, 0xFE, 0x00, 0x3C, 0x00, 0x7F,
0xC0, 0x03, 0x80, 0x03, 0xF8, 0x03, 0xE0, 0x03, 0xFE, 0x00, 0xFF, 0x80,
0x7C, 0xF0, 0x1E, 0x1C, 0x07, 0x87, 0x01, 0xE1, 0xC0, 0x78, 0x70, 0x1E,
0x1C, 0x07, 0x8F, 0x00, 0xF3, 0x80, 0x3D, 0xE0, 0x0F, 0x78, 0x01, 0xFC,
0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x03, 0xF0, 0x00, 0xFE, 0x08,
0x7F, 0x86, 0x3F, 0xE3, 0x8F, 0x3C, 0xF7, 0x8F, 0x79, 0xE1, 0xFC, 0x78,
0x7F, 0x3C, 0x1F, 0x8F, 0x03, 0xE3, 0xC0, 0xF0, 0xF0, 0x3E, 0x1E, 0x1F,
0x87, 0xFF, 0xF1, 0xFF, 0xFC, 0x3F, 0xE7, 0x87, 0xF1, 0xE0, 0xFF, 0xFF,
0xF7, 0x76, 0x66, 0x66, 0x3E, 0xFF, 0xFF, 0xCF, 0x1E, 0x3C, 0x78, 0xF1,
0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C,
0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xFB, 0xF7,
0xE1, 0xC0, 0xF1, 0xF3, 0xF1, 0xE3, 0xC7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9,
0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E,
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7B, 0xF7, 0xEF, 0x98, 0x00,
0x07, 0x00, 0x1C, 0x04, 0x71, 0x39, 0xCE, 0xFB, 0x7D, 0xFF, 0xC1, 0xFC,
0x03, 0xE0, 0x3F, 0xE3, 0xEF, 0xFF, 0x73, 0x99, 0xC6, 0x07, 0x08, 0x1C,
0x00, 0x70, 0x00, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF,
0x8C, 0xE7, 0x31, 0x9C, 0xC0, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x00,
0xF8, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C,
0x01, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x03, 0xC0, 0x1E, 0x00,
0xF0, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0x78,
0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01,
0xE0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x00, 0x0F, 0xC1, 0xFF, 0x9F, 0xFC,
0xFF, 0xF7, 0x8F, 0xFC, 0x3F, 0xE1, 0xFF, 0x0F, 0xF8, 0x7F, 0xC3, 0xFE,
0x1F, 0xF0, 0xFF, 0x87, 0xFC, 0x3F, 0xE1, 0xFF, 0x0F, 0xF8, 0x7F, 0xC3,
0xFE, 0x1F, 0xF0, 0xFF, 0x87, 0xFC, 0x3F, 0xE1, 0xFF, 0x0F, 0xF8, 0x7F,
0xC3, 0xFE, 0x1F, 0xF0, 0xFF, 0x87, 0xBC, 0x7D, 0xF7, 0xEF, 0xFE, 0x3F,
0xF0, 0xFF, 0x00, 0x03, 0x83, 0xC3, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F,
0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3,
0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8,
0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC0, 0x0F, 0x81, 0xFF, 0x1F, 0xF8, 0xFF,
0xEF, 0x8F, 0x7C, 0x7B, 0xC3, 0xDE, 0x1E, 0xF0, 0xFF, 0x87, 0xFC, 0x3F,
0xE1, 0xEF, 0x0F, 0x78, 0x78, 0x07, 0xC0, 0x3C, 0x03, 0xE0, 0x1E, 0x01,
0xF0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x7C, 0x07, 0xC0, 0x3E, 0x03, 0xE0,
0x1F, 0x00, 0xF0, 0x07, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0xFE, 0xFF, 0xF7,
0xFF, 0x80, 0x0F, 0xC0, 0xFF, 0x87, 0xFF, 0x1F, 0xFE, 0x78, 0xFB, 0xE1,
0xEF, 0x87, 0xBC, 0x1E, 0xF0, 0x7B, 0xC1, 0xE0, 0x07, 0x80, 0x1E, 0x00,
0x78, 0x03, 0xE0, 0x3F, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0x0F, 0x00,
0x3E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0xBC, 0x1E, 0xF0, 0x7F, 0xC1, 0xFF,
0x07, 0xBC, 0x1E, 0xF0, 0x7B, 0xE1, 0xE7, 0xDF, 0x9F, 0xFC, 0x3F, 0xE0,
0x7F, 0x00, 0x01, 0xF0, 0x07, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x1F,
0xC0, 0x7F, 0x01, 0xFC, 0x06, 0xF0, 0x3B, 0xC0, 0xEF, 0x03, 0xBC, 0x1C,
0xF0, 0x73, 0xC1, 0xCF, 0x0F, 0x3C, 0x38, 0xF0, 0xE3, 0xC7, 0x8F, 0x1C,
0x3C, 0x70, 0xF1, 0xC3, 0xCF, 0x0F, 0x38, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0,
0x03, 0xC0, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F, 0x00, 0xF0,
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF3, 0x0F, 0xFC, 0xFF, 0xEF, 0xFE, 0xF9,
0xEF, 0x1F, 0xF0, 0xF1, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1F, 0xFB,
0xEF, 0xFE, 0x7F, 0xC3, 0xF8, 0x0F, 0xC0, 0xFF, 0x83, 0xFF, 0x1F, 0xFC,
0x78, 0xF9, 0xE1, 0xEF, 0x87, 0xBE, 0x1E, 0xF8, 0x7B, 0xE1, 0xEF, 0x80,
0x3E, 0x00, 0xF8, 0x03, 0xEF, 0x8F, 0xFF, 0x3F, 0xFE, 0xFF, 0xFB, 0xE1,
0xEF, 0x87, 0xBE, 0x1E, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8,
0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x79, 0xE1, 0xE7, 0xFF, 0x9F,
0xFE, 0x3F, 0xF0, 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x7C, 0x01, 0xE0, 0x0F, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0xC0, 0x1E,
0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0xC0, 0x1E,
0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0xC0, 0x1F,
0x00, 0x7C, 0x01, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
0x80, 0x3E, 0x00, 0xF8, 0x00, 0x1F, 0xC1, 0xFF, 0x1F, 0xFC, 0xFB, 0xFF,
0x8F, 0xFC, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
0xFF, 0x87, 0xBC, 0x79, 0xFF, 0xC7, 0xFC, 0x3F, 0xE3, 0xFF, 0x9E, 0x3D,
0xF1, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC,
0x1F, 0xE0, 0xFF, 0x07, 0xFC, 0x3F, 0xF7, 0xEF, 0xFE, 0x3F, 0xF0, 0xFE,
0x00, 0x1F, 0x81, 0xFF, 0x1F, 0xFD, 0xFF, 0xEF, 0x8F, 0x78, 0x7F, 0xC3,
0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F,
0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC7, 0xDF, 0xFE, 0xFF, 0xF3, 0xFF, 0x80,
0x3C, 0x01, 0xE0, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x0F,
0xFC, 0x79, 0xF7, 0xCF, 0xFE, 0x3F, 0xE0, 0xFE, 0x00, 0xFF, 0xFF, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF3, 0x9C, 0xCE, 0x73, 0x98,
0x00, 0x20, 0x0C, 0x07, 0x81, 0xF0, 0xFE, 0x3F, 0x9F, 0xC7, 0xF0, 0xF8,
0x1C, 0x03, 0xE0, 0x7E, 0x07, 0xF0, 0x3F, 0x03, 0xF8, 0x1F, 0x01, 0xE0,
0x0C, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF,
0xFF, 0xFF, 0xC0, 0x80, 0x18, 0x03, 0x80, 0x7C, 0x0F, 0xC0, 0xFE, 0x07,
0xF0, 0x7F, 0x03, 0xE0, 0x3C, 0x0F, 0x83, 0xF1, 0xFC, 0xFE, 0x3F, 0x87,
0xC0, 0xF0, 0x18, 0x02, 0x00, 0x00, 0x1F, 0x87, 0xFC, 0x7F, 0xEF, 0xFE,
0xF1, 0xEF, 0x1F, 0xF1, 0xFF, 0x1F, 0xF1, 0xFF, 0x1F, 0xF1, 0xFF, 0x1F,
0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0xFC, 0x3F, 0x83, 0xF0,
0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x00, 0x3F, 0x80,
0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xFC, 0x00, 0xF8, 0x0F, 0x00, 0xF0, 0x03,
0xC0, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0x38, 0x78, 0x00, 0x1C, 0x38, 0x1F,
0x87, 0x3C, 0x3F, 0xE3, 0x9E, 0x1E, 0xF1, 0xCE, 0x1C, 0x38, 0xE7, 0x0E,
0x1C, 0x77, 0x8E, 0x0E, 0x1F, 0xC7, 0x07, 0x0F, 0xE3, 0x83, 0x87, 0xF1,
0xC1, 0xC3, 0xF8, 0xE0, 0xE1, 0xFC, 0x70, 0x70, 0xFE, 0x38, 0x38, 0x7F,
0x1C, 0x1C, 0x77, 0x8E, 0x0E, 0x39, 0xC7, 0x07, 0x1C, 0xE3, 0xC7, 0xCE,
0x70, 0xF6, 0xFE, 0x3C, 0x7F, 0x3F, 0x1E, 0x1F, 0x0F, 0x07, 0x81, 0x00,
0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x80,
0x70, 0x07, 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x07,
0xC0, 0x07, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F,
0xE0, 0x0F, 0xF0, 0x0E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E,
0xF0, 0x1E, 0x70, 0x1E, 0x78, 0x1C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C,
0x78, 0x3C, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x7C, 0x3C, 0x78, 0x3C, 0x7F,
0xFC, 0x7F, 0xFC, 0x7F, 0xFE, 0x7F, 0xFE, 0x78, 0x1E, 0xF8, 0x1E, 0xF8,
0x1E, 0xF0, 0x1E, 0xF0, 0x1F, 0xF0, 0x1F, 0xFF, 0x03, 0xFF, 0x8F, 0xFF,
0x3F, 0xFC, 0xF0, 0xFB, 0xC3, 0xEF, 0x07, 0xBC, 0x1E, 0xF0, 0x7B, 0xC1,
0xEF, 0x07, 0xBC, 0x3E, 0xF0, 0xFB, 0xC3, 0xCF, 0xFF, 0x3F, 0xF8, 0xFF,
0xF3, 0xFF, 0xCF, 0x0F, 0xBC, 0x1E, 0xF0, 0x7B, 0xC1, 0xEF, 0x07, 0xFC,
0x1F, 0xF0, 0x7F, 0xC1, 0xFF, 0x07, 0xBC, 0x1E, 0xF0, 0x7B, 0xC3, 0xEF,
0xFF, 0xBF, 0xFC, 0xFF, 0xE3, 0xFF, 0x00, 0x0F, 0xC0, 0x7F, 0xC3, 0xFF,
0x9F, 0xFE, 0x7C, 0x79, 0xE1, 0xFF, 0x87, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0,
0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8,
0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE,
0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x1F, 0x78, 0x7D, 0xE1, 0xE7,
0xEF, 0x8F, 0xFE, 0x3F, 0xF0, 0x3F, 0x80, 0xFF, 0x07, 0xFF, 0x3F, 0xFD,
0xFF, 0xEF, 0x0F, 0xF8, 0x7F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC,
0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83,
0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x7F, 0xFF, 0xDF, 0xFE, 0xFF,
0xE7, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x0F, 0x03,
0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
0xC0, 0xF0, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0xF0,
0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
0x03, 0xC0, 0xF0, 0x3C, 0x00, 0x0F, 0xE0, 0x7F, 0xC3, 0xFF, 0x9F, 0xFE,
0x7C, 0x7D, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83,
0xFE, 0x0F, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF9, 0xFF, 0xE7,
0xFF, 0x9F, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8,
0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0x78, 0x3D, 0xE1, 0xF7, 0xEF, 0xCF,
0xFF, 0x3F, 0xEC, 0x3F, 0x30, 0xF0, 0x7F, 0xC1, 0xFF, 0x07, 0xFC, 0x1F,
0xF0, 0x7F, 0xC1, 0xFF, 0x07, 0xFC, 0x1F, 0xF0, 0x7F, 0xC1, 0xFF, 0x07,
0xFC, 0x1F, 0xF0, 0x7F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x07, 0xFC, 0x1F, 0xF0, 0x7F, 0xC1, 0xFF, 0x07, 0xFC, 0x1F, 0xF0,
0x7F, 0xC1, 0xFF, 0x07, 0xFC, 0x1F, 0xF0, 0x7F, 0xC1, 0xFF, 0x07, 0xFC,
0x1F, 0xF0, 0x7F, 0xC1, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF8,
0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00,
0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F,
0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0xF8, 0x7F, 0xC3, 0xFE,
0x1F, 0xF0, 0xFF, 0x87, 0xFC, 0x3F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0xF7,
0xCF, 0xFC, 0x7F, 0xE1, 0xFE, 0x00, 0xF0, 0x3D, 0xE0, 0xFB, 0xC1, 0xE7,
0x83, 0xCF, 0x0F, 0x9E, 0x1E, 0x3C, 0x3C, 0x78, 0xF8, 0xF1, 0xE1, 0xE7,
0xC3, 0xCF, 0x87, 0x9E, 0x0F, 0x7C, 0x1E, 0xF8, 0x3D, 0xE0, 0x7F, 0xC0,
0xFF, 0x01, 0xFE, 0x03, 0xFE, 0x07, 0xBC, 0x0F, 0x7C, 0x1E, 0xF8, 0x3C,
0xF0, 0x79, 0xF0, 0xF1, 0xE1, 0xE3, 0xC3, 0xC7, 0xC7, 0x87, 0x8F, 0x0F,
0x9E, 0x1F, 0x3C, 0x1E, 0x78, 0x3E, 0xF0, 0x7D, 0xE0, 0x7C, 0xF0, 0x3C,
0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0,
0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x03,
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0,
0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFE, 0xE0, 0x7F, 0xEE,
0x0F, 0xFE, 0xF0, 0xFF, 0xEF, 0x0E, 0xFE, 0x70, 0xEF, 0xE7, 0x0E, 0xFE,
0x70, 0xEF, 0xE7, 0x1E, 0xFE, 0x79, 0xCF, 0xE3, 0x9C, 0xFF, 0x39, 0xCF,
0xF3, 0x9C, 0xFF, 0x3B, 0xCF, 0xF3, 0xF8, 0xFF, 0x1F, 0x8F, 0xF1, 0xF8,
0xFF, 0x1F, 0x8F, 0xF1, 0xF8, 0xFF, 0x1F, 0x8F, 0xF0, 0xF0, 0xFF, 0x0F,
0x0F, 0xF0, 0xF0, 0xFF, 0x0F, 0x0F, 0xE0, 0x3F, 0x80, 0xFF, 0x03, 0xFC,
0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFF, 0x0F, 0xFC, 0x3F, 0xF0, 0xFF,
0xE3, 0xFF, 0x8F, 0xFE, 0x3F, 0xFC, 0xFF, 0xF3, 0xFD, 0xCF, 0xF7, 0xBF,
0xDE, 0xFF, 0x3B, 0xFC, 0xFF, 0xF3, 0xDF, 0xC7, 0x7F, 0x1F, 0xFC, 0x7F,
0xF0, 0xFF, 0xC3, 0xFF, 0x0F, 0xFC, 0x1F, 0xF0, 0x7F, 0xC1, 0xFF, 0x03,
0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0x70, 0x0F, 0xE0, 0x7F, 0xC3, 0xFF, 0x9F,
0xFE, 0x7C, 0x7D, 0xE1, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF,
0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F,
0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F,
0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0x78, 0x7D, 0xE1, 0xF7, 0xFF,
0x8F, 0xFE, 0x3F, 0xF0, 0x3F, 0x80, 0xFF, 0x87, 0xFF, 0x3F, 0xFD, 0xFF,
0xEF, 0x0F, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x1F, 0xF0, 0xFF, 0xFF, 0xBF,
0xFD, 0xFF, 0xCF, 0xF8, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80,
0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
0x80, 0x00, 0x0F, 0xE0, 0x7F, 0xC3, 0xFF, 0x9F, 0xFE, 0x7C, 0x7D, 0xE1,
0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8,
0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE,
0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF,
0x83, 0xFE, 0x0F, 0x78, 0x7D, 0xE1, 0xF7, 0xFF, 0x8F, 0xFE, 0x3F, 0xF0,
0x3F, 0x80, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03, 0x00, 0xFF,
0x83, 0xFF, 0x8F, 0xFF, 0x3F, 0xFE, 0xF0, 0xFB, 0xC1, 0xEF, 0x07, 0xBC,
0x1E, 0xF0, 0x7B, 0xC1, 0xEF, 0x07, 0xBC, 0x1E, 0xF0, 0x7B, 0xC3, 0xEF,
0x1F, 0x3F, 0xFC, 0xFF, 0xE3, 0xFF, 0xCF, 0x0F, 0xBC, 0x1E, 0xF0, 0x7B,
0xC1, 0xEF, 0x07, 0xBC, 0x1E, 0xF0, 0x7B, 0xC1, 0xEF, 0x07, 0xBC, 0x1E,
0xF0, 0x7B, 0xC1, 0xEF, 0x07, 0xBC, 0x1E, 0xF0, 0x7B, 0xC1, 0xF0, 0x0F,
0xC0, 0xFF, 0xC3, 0xFF, 0x1F, 0xFE, 0x78, 0x79, 0xE1, 0xEF, 0x87, 0xBE,
0x1F, 0xF8, 0x7D, 0xE1, 0xF7, 0x87, 0xDF, 0x1F, 0x7E, 0x00, 0xFC, 0x01,
0xF8, 0x03, 0xF0, 0x0F, 0xE0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xF9,
0xE1, 0xF7, 0x87, 0xDE, 0x0F, 0x78, 0x3D, 0xE0, 0xF7, 0x83, 0xDE, 0x0F,
0x78, 0x3D, 0xE1, 0xF7, 0xEF, 0x8F, 0xFE, 0x3F, 0xF0, 0x3F, 0x80, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
0x80, 0xF8, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0,
0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8,
0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE,
0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF,
0x83, 0xFE, 0x0F, 0x78, 0x3D, 0xE1, 0xF7, 0xEF, 0xCF, 0xFE, 0x3F, 0xF8,
0x7F, 0x80, 0xF0, 0x1F, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF8, 0x1E,
0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x7C, 0x3C,
0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78,
0x1E, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x1E, 0x70, 0x1E, 0xF0,
0x0E, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xE0,
0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0xF0, 0x3C,
0x0F, 0xF0, 0x3C, 0x0F, 0xF0, 0x3C, 0x0F, 0xF0, 0x3C, 0x1E, 0xF0, 0x3C,
0x1E, 0x78, 0x3E, 0x1E, 0x78, 0x7E, 0x1E, 0x78, 0x7E, 0x1E, 0x78, 0x7E,
0x1E, 0x78, 0x7E, 0x1E, 0x78, 0x7E, 0x1E, 0x78, 0x7E, 0x1E, 0x38, 0x7F,
0x1C, 0x38, 0xF7, 0x1C, 0x3C, 0xF7, 0x3C, 0x3C, 0xE7, 0x3C, 0x3C, 0xE7,
0x3C, 0x3C, 0xE7, 0x3C, 0x3C, 0xE7, 0x3C, 0x3C, 0xE7, 0xBC, 0x1D, 0xE3,
0xB8, 0x1D, 0xC3, 0xB8, 0x1D, 0xC3, 0xB8, 0x1F, 0xC3, 0xB8, 0x1F, 0xC3,
0xB8, 0x1F, 0xC3, 0xF8, 0x1F, 0xC3, 0xF8, 0x1F, 0xC1, 0xF8, 0x0F, 0x81,
0xF8, 0x0F, 0x81, 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0x81,
0xF0, 0x0F, 0x81, 0xF0, 0xF0, 0x3F, 0xC0, 0xF7, 0x07, 0x9E, 0x1E, 0x78,
0x78, 0xE3, 0xE3, 0xCF, 0x0F, 0x3C, 0x3C, 0xF0, 0x7F, 0x81, 0xFE, 0x07,
0xF8, 0x0F, 0xE0, 0x3F, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0x80, 0x3E, 0x00,
0xF8, 0x03, 0xF0, 0x0F, 0xC0, 0x7F, 0x01, 0xFE, 0x07, 0xF8, 0x3F, 0xE0,
0xF3, 0xC3, 0xCF, 0x0F, 0x3C, 0x78, 0x71, 0xE1, 0xE7, 0x87, 0x9E, 0x0E,
0xF0, 0x3F, 0xC0, 0xF0, 0xF8, 0x0F, 0x78, 0x1F, 0x78, 0x1E, 0x7C, 0x1E,
0x3C, 0x1E, 0x3C, 0x3E, 0x3C, 0x3C, 0x3E, 0x3C, 0x1E, 0x3C, 0x1E, 0x78,
0x1E, 0x78, 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF0, 0x0F, 0xF0, 0x07, 0xF0,
0x07, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0,
0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0,
0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0,
0x7F, 0xF7, 0xFF, 0x7F, 0xF7, 0xFF, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x3E,
0x03, 0xE0, 0x3C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x78, 0x0F, 0x80, 0xF8,
0x0F, 0x80, 0xF0, 0x1F, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x3E, 0x03, 0xE0,
0x3C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x78, 0x0F, 0x80, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF,
0xFF, 0xFF, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x07, 0x00, 0xF0, 0x1E, 0x03,
0xC0, 0x78, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x07, 0x80, 0xF0,
0x1E, 0x01, 0xC0, 0x3C, 0x07, 0x80, 0xF0, 0x0E, 0x01, 0xE0, 0x3C, 0x07,
0x80, 0xF0, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0x78, 0x0F, 0x01, 0xE0,
0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF,
0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x80, 0x7F, 0x01, 0xFE, 0x03, 0xDC, 0x07,
0xBC, 0x0E, 0x78, 0x3C, 0xF0, 0x79, 0xE0, 0xF1, 0xE1, 0xE3, 0xC7, 0x87,
0x8F, 0x0F, 0x1E, 0x0F, 0x3C, 0x1E, 0xF8, 0x3D, 0xE0, 0x7C, 0xFF, 0xFF,
0xFF, 0xFF, 0xF0, 0xF9, 0xE7, 0x8E, 0x38, 0x71, 0xC3, 0x0F, 0xC0, 0xFF,
0xC3, 0xFF, 0x1F, 0xFE, 0x78, 0x79, 0xE1, 0xEF, 0x87, 0xBE, 0x1E, 0xF8,
0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x7F, 0x0F, 0xFC, 0x7F, 0xF3, 0xE7, 0xDE,
0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF,
0x87, 0xFE, 0x1F, 0xF8, 0x7D, 0xE3, 0xF7, 0xFF, 0xDF, 0xFF, 0x3F, 0x7C,
0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x79, 0xE3, 0xDF, 0x9F,
0xFE, 0xFF, 0xFF, 0xC7, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1,
0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F,
0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xFC,
0x7F, 0xF7, 0xFF, 0xFE, 0xF7, 0xF7, 0x9F, 0x00, 0x0F, 0xC1, 0xFF, 0x8F,
0xFC, 0xFF, 0xF7, 0x87, 0xBC, 0x3F, 0xE1, 0xFF, 0x0F, 0xF8, 0x7F, 0xC3,
0xFE, 0x1F, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07,
0xC0, 0x3E, 0x1F, 0xF0, 0xFF, 0x87, 0xFC, 0x3F, 0xE1, 0xEF, 0x0F, 0x78,
0x7B, 0xE7, 0xDF, 0xFC, 0x7F, 0xE1, 0xFE, 0x00, 0x00, 0x7C, 0x01, 0xF0,
0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x7D, 0xF3, 0xFF, 0xDF, 0xFF, 0x7F, 0xFD,
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F,
0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87,
0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7D, 0xE1,
0xF7, 0xDF, 0xDF, 0xFF, 0x3F, 0xFC, 0x7D, 0xF0, 0x0F, 0xC0, 0x7F, 0xC3,
0xFF, 0x1F, 0xFE, 0x78, 0x79, 0xE1, 0xEF, 0x87, 0xBE, 0x1E, 0xF8, 0x7B,
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00,
0xF8, 0x03, 0xE0, 0x0F, 0x87, 0xBE, 0x1E, 0xF8, 0x7B, 0xE1, 0xEF, 0x87,
0x9E, 0x1E, 0x78, 0x79, 0xF3, 0xE7, 0xFF, 0x0F, 0xFC, 0x1F, 0xE0, 0x07,
0xC3, 0xF1, 0xFC, 0x7C, 0x1E, 0x07, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1,
0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78,
0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07,
0x81, 0xE0, 0x78, 0x1E, 0x07, 0x80, 0x1F, 0x7C, 0xFF, 0xF7, 0xFF, 0xDF,
0xFF, 0x78, 0x7D, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF,
0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F,
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7D, 0xE1, 0xF7, 0xCF, 0xDF, 0xFF,
0x3F, 0xFC, 0x7D, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x79, 0xC3, 0xE7, 0xFF,
0xBF, 0xFC, 0x3F, 0xC0, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
0x79, 0xF3, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFC, 0x1F, 0xE0, 0xFF,
0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xC0,
0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x78, 0xF1, 0xE0, 0x00, 0x0F,
0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3,
0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C,
0xF9, 0xFF, 0xDF, 0xBE, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00,
0xF0, 0x03, 0xC1, 0xFF, 0x07, 0xBC, 0x1E, 0xF0, 0xFB, 0xC3, 0xCF, 0x1F,
0x3C, 0x78, 0xF1, 0xE3, 0xCF, 0x8F, 0x3C, 0x3D, 0xF0, 0xF7, 0x83, 0xDE,
0x0F, 0xF8, 0x3F, 0xC0, 0xFF, 0x83, 0xDE, 0x0F, 0x78, 0x3D, 0xF0, 0xF3,
0xC3, 0xCF, 0x8F, 0x1E, 0x3C, 0x7C, 0xF0, 0xF3, 0xC3, 0xCF, 0x0F, 0xBC,
0x1E, 0xF0, 0x7F, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xE1,
0xF3, 0xDF, 0xCF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFC, 0x3F,
0xC1, 0xE0, 0xFF, 0x07, 0x83, 0xFC, 0x1E, 0x0F, 0xF0, 0x78, 0x3F, 0xC1,
0xE0, 0xFF, 0x07, 0x83, 0xFC, 0x1E, 0x0F, 0xF0, 0x78, 0x3F, 0xC1, 0xE0,
0xFF, 0x07, 0x83, 0xFC, 0x1E, 0x0F, 0xF0, 0x78, 0x3F, 0xC1, 0xE0, 0xFF,
0x07, 0x83, 0xFC, 0x1E, 0x0F, 0xF0, 0x78, 0x3F, 0xC1, 0xE0, 0xFF, 0x07,
0x83, 0xFC, 0x1E, 0x0F, 0xF0, 0x78, 0x3F, 0xC1, 0xE0, 0xFF, 0x07, 0x83,
0xFC, 0x1E, 0x0F, 0xF0, 0x78, 0x3C, 0xF3, 0xE7, 0xBF, 0xBF, 0xFF, 0xFF,
0xFF, 0x87, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC,
0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83,
0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x80, 0x0F, 0xC0, 0x7F, 0x83, 0xFF, 0x1F,
0xFE, 0x78, 0x79, 0xE1, 0xEF, 0x87, 0xBE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF,
0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F,
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xDE, 0x1E,
0x78, 0x79, 0xF3, 0xE7, 0xFF, 0x0F, 0xFC, 0x1F, 0xE0, 0xF3, 0xC7, 0xBF,
0xBF, 0xFD, 0xFF, 0xFF, 0x8F, 0xF8, 0x7F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0,
0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F,
0xF8, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xEF, 0x7E, 0x78, 0x03, 0xC0, 0x1E,
0x00, 0xF0, 0x07, 0x80, 0x00, 0x1E, 0x7C, 0xFF, 0xF7, 0xFF, 0xDF, 0xFF,
0x78, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87,
0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1,
0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x78,
0x7D, 0xF7, 0xF7, 0xFF, 0xCF, 0xFF, 0x1F, 0x7C, 0x01, 0xF0, 0x07, 0xC0,
0x1F, 0x00, 0x7C, 0x01, 0xF0, 0xF3, 0xFB, 0xFF, 0xFF, 0xFF, 0xC7, 0x83,
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0,
0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
0x0F, 0x00, 0x1F, 0x83, 0xFE, 0x1F, 0xF9, 0xFF, 0xCF, 0x0F, 0x78, 0x7B,
0xC3, 0xDE, 0x1E, 0xF0, 0xF7, 0xC7, 0xBE, 0x00, 0xF8, 0x07, 0xE0, 0x1F,
0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7D, 0xE1, 0xEF, 0x0F,
0xF8, 0x7F, 0xC3, 0xFE, 0x1F, 0xF0, 0xF7, 0xEF, 0x9F, 0xFC, 0xFF, 0xC1,
0xFC, 0x00, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x8F, 0xFF, 0xFF,
0xFF, 0xCF, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F,
0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0,
0xF8, 0x3E, 0x0F, 0x83, 0xF0, 0xFF, 0x1F, 0xC3, 0xF0, 0xF8, 0x3F, 0xE0,
0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8,
0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE,
0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF,
0x83, 0xFE, 0x0F, 0x78, 0x7D, 0xF3, 0xF7, 0xFF, 0xCF, 0xEF, 0x1F, 0x3C,
0xF0, 0x7F, 0xC1, 0xEF, 0x07, 0xBC, 0x1E, 0x78, 0x79, 0xE1, 0xE7, 0x87,
0x9E, 0x1C, 0x78, 0x71, 0xE3, 0xC7, 0x8F, 0x0E, 0x3C, 0x3C, 0xF0, 0xF3,
0xC3, 0xCE, 0x0F, 0x38, 0x3C, 0xE0, 0xF3, 0x81, 0xDE, 0x07, 0x78, 0x1F,
0xE0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
0xF0, 0x0F, 0x80, 0xF0, 0x78, 0x7F, 0x87, 0xC3, 0xFC, 0x3E, 0x1F, 0xE1,
0xF0, 0xF7, 0x0F, 0x87, 0xB8, 0x7C, 0x39, 0xC3, 0xE1, 0xCE, 0x1F, 0x8E,
0x79, 0xDC, 0x73, 0xCE, 0xE7, 0x9E, 0x77, 0x3C, 0xF3, 0xB9, 0xE3, 0x9D,
0xCF, 0x1C, 0xE6, 0x70, 0xE7, 0x3B, 0x87, 0x71, 0xDC, 0x3B, 0x8E, 0xE1,
0xDC, 0x77, 0x0F, 0xE3, 0xB8, 0x7F, 0x1D, 0xC3, 0xF8, 0xFE, 0x0F, 0x83,
0xE0, 0x7C, 0x1F, 0x03, 0xE0, 0xF8, 0x1F, 0x07, 0xC0, 0xF8, 0x3E, 0x07,
0xC1, 0xF0, 0x3E, 0x0F, 0x81, 0xE0, 0x7C, 0x00, 0xF0, 0x7B, 0xC1, 0xE7,
0x87, 0x9E, 0x3C, 0x78, 0xF0, 0xF3, 0xC3, 0xCE, 0x0F, 0x78, 0x1F, 0xE0,
0x7F, 0x01, 0xFC, 0x03, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0,
0x0F, 0x80, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x3D, 0xE0, 0xF7, 0x83, 0xDE,
0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xCF, 0x07, 0xBC, 0x1E, 0xF0, 0x7C, 0xF0,
0x3F, 0xC0, 0xFF, 0x07, 0xFE, 0x1E, 0x78, 0x79, 0xE1, 0xE7, 0x87, 0x9E,
0x1E, 0x78, 0x79, 0xE1, 0xC3, 0x87, 0x0F, 0x3C, 0x3C, 0xF0, 0xF3, 0xC3,
0xCF, 0x0F, 0x3C, 0x1C, 0xE0, 0x73, 0x81, 0xCE, 0x07, 0xB8, 0x1F, 0xE0,
0x7F, 0x80, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0,
0x07, 0x80, 0x1E, 0x00, 0xF8, 0x1F, 0xE0, 0x7F, 0x01, 0xFC, 0x00, 0x7F,
0xEF, 0xFD, 0xFF, 0xBF, 0xF0, 0x1E, 0x07, 0xC0, 0xF0, 0x1E, 0x07, 0xC0,
0xF0, 0x1E, 0x03, 0xC0, 0xF8, 0x1E, 0x03, 0xC0, 0xF8, 0x1E, 0x03, 0xC0,
0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x1F, 0x03, 0xC0, 0x78, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x07, 0xC3, 0xF1, 0xFC, 0x7E, 0x1E, 0x07, 0x81, 0xE0,
0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xF8, 0x7E,
0x3F, 0x0F, 0x83, 0xF0, 0xFE, 0x0F, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81,
0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0xC1, 0xFC, 0x3F,
0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x3F, 0x0F,
0xC1, 0xF8, 0x3E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78,
0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1F, 0x83, 0xF0, 0x7C, 0x3F, 0x1F, 0xC7,
0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0,
0x78, 0x3E, 0x0F, 0x8F, 0xC3, 0xF0, 0xF8, 0x00, 0x1E, 0x07, 0x9F, 0xF3,
0xDF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xE1, 0x03, 0xE0 };
const GFXglyph Antonio_SemiBold20pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 8, 0, 0 }, // 0x20 ' '
{ 1, 4, 34, 10, 3, -33 }, // 0x21 '!'
{ 18, 5, 13, 16, 6, -33 }, // 0x22 '"'
{ 27, 17, 34, 20, 2, -33 }, // 0x23 '#'
{ 100, 13, 39, 16, 2, -33 }, // 0x24 '$'
{ 164, 36, 34, 42, 3, -33 }, // 0x25 '%'
{ 317, 18, 34, 19, 1, -33 }, // 0x26 '&'
{ 394, 4, 12, 8, 2, -33 }, // 0x27 '''
{ 400, 7, 38, 11, 3, -33 }, // 0x28 '('
{ 434, 7, 38, 11, 2, -33 }, // 0x29 ')'
{ 468, 14, 15, 17, 2, -32 }, // 0x2A '*'
{ 495, 12, 12, 14, 1, -20 }, // 0x2B '+'
{ 513, 5, 12, 9, 2, -4 }, // 0x2C ','
{ 521, 9, 3, 13, 2, -16 }, // 0x2D '-'
{ 525, 4, 4, 10, 3, -3 }, // 0x2E '.'
{ 527, 13, 34, 15, 1, -33 }, // 0x2F '/'
{ 583, 13, 34, 18, 2, -33 }, // 0x30 '0'
{ 639, 9, 34, 15, 2, -33 }, // 0x31 '1'
{ 678, 13, 34, 17, 3, -33 }, // 0x32 '2'
{ 734, 14, 34, 17, 2, -33 }, // 0x33 '3'
{ 794, 14, 34, 17, 2, -33 }, // 0x34 '4'
{ 854, 12, 34, 17, 3, -33 }, // 0x35 '5'
{ 905, 14, 34, 17, 2, -33 }, // 0x36 '6'
{ 965, 14, 34, 17, 2, -33 }, // 0x37 '7'
{ 1025, 13, 34, 17, 2, -33 }, // 0x38 '8'
{ 1081, 13, 34, 17, 2, -33 }, // 0x39 '9'
{ 1137, 4, 20, 10, 3, -24 }, // 0x3A ':'
{ 1147, 5, 27, 11, 3, -24 }, // 0x3B ';'
{ 1164, 11, 19, 14, 1, -23 }, // 0x3C '<'
{ 1191, 10, 9, 14, 2, -19 }, // 0x3D '='
{ 1203, 11, 19, 14, 2, -23 }, // 0x3E '>'
{ 1230, 12, 34, 17, 3, -33 }, // 0x3F '?'
{ 1281, 25, 35, 29, 2, -33 }, // 0x40 '@'
{ 1391, 16, 34, 18, 1, -33 }, // 0x41 'A'
{ 1459, 14, 34, 18, 3, -33 }, // 0x42 'B'
{ 1519, 14, 34, 18, 2, -33 }, // 0x43 'C'
{ 1579, 13, 34, 19, 3, -33 }, // 0x44 'D'
{ 1635, 10, 34, 15, 3, -33 }, // 0x45 'E'
{ 1678, 10, 34, 15, 3, -33 }, // 0x46 'F'
{ 1721, 14, 34, 18, 2, -33 }, // 0x47 'G'
{ 1781, 14, 34, 19, 3, -33 }, // 0x48 'H'
{ 1841, 4, 34, 10, 3, -33 }, // 0x49 'I'
{ 1858, 13, 34, 17, 2, -33 }, // 0x4A 'J'
{ 1914, 15, 34, 18, 3, -33 }, // 0x4B 'K'
{ 1978, 10, 34, 14, 3, -33 }, // 0x4C 'L'
{ 2021, 20, 34, 26, 3, -33 }, // 0x4D 'M'
{ 2106, 14, 34, 20, 3, -33 }, // 0x4E 'N'
{ 2166, 14, 34, 19, 2, -33 }, // 0x4F 'O'
{ 2226, 13, 34, 17, 3, -33 }, // 0x50 'P'
{ 2282, 14, 39, 19, 2, -33 }, // 0x51 'Q'
{ 2351, 14, 34, 18, 3, -33 }, // 0x52 'R'
{ 2411, 14, 34, 16, 1, -33 }, // 0x53 'S'
{ 2471, 12, 34, 13, 0, -33 }, // 0x54 'T'
{ 2522, 14, 34, 19, 2, -33 }, // 0x55 'U'
{ 2582, 16, 34, 17, 1, -33 }, // 0x56 'V'
{ 2650, 24, 34, 26, 1, -33 }, // 0x57 'W'
{ 2752, 14, 34, 16, 1, -33 }, // 0x58 'X'
{ 2812, 16, 34, 16, 0, -33 }, // 0x59 'Y'
{ 2880, 12, 34, 14, 1, -33 }, // 0x5A 'Z'
{ 2931, 8, 35, 13, 3, -33 }, // 0x5B '['
{ 2966, 11, 34, 15, 2, -33 }, // 0x5C '\'
{ 3013, 8, 35, 13, 2, -33 }, // 0x5D ']'
{ 3048, 15, 18, 18, 2, -33 }, // 0x5E '^'
{ 3082, 12, 3, 14, 1, 2 }, // 0x5F '_'
{ 3087, 6, 8, 8, 1, -38 }, // 0x60 '`'
{ 3093, 14, 29, 18, 2, -28 }, // 0x61 'a'
{ 3144, 13, 34, 18, 3, -33 }, // 0x62 'b'
{ 3200, 13, 29, 17, 2, -28 }, // 0x63 'c'
{ 3248, 14, 34, 18, 2, -33 }, // 0x64 'd'
{ 3308, 14, 29, 17, 2, -28 }, // 0x65 'e'
{ 3359, 10, 34, 13, 1, -33 }, // 0x66 'f'
{ 3402, 14, 33, 18, 2, -28 }, // 0x67 'g'
{ 3460, 13, 34, 19, 3, -33 }, // 0x68 'h'
{ 3516, 4, 35, 10, 3, -34 }, // 0x69 'i'
{ 3534, 7, 39, 10, 1, -34 }, // 0x6A 'j'
{ 3569, 14, 34, 18, 3, -33 }, // 0x6B 'k'
{ 3629, 4, 34, 10, 3, -33 }, // 0x6C 'l'
{ 3646, 22, 29, 28, 3, -28 }, // 0x6D 'm'
{ 3726, 13, 29, 19, 3, -28 }, // 0x6E 'n'
{ 3774, 14, 29, 18, 2, -28 }, // 0x6F 'o'
{ 3825, 13, 34, 18, 3, -28 }, // 0x70 'p'
{ 3881, 14, 34, 18, 2, -28 }, // 0x71 'q'
{ 3941, 9, 29, 13, 3, -28 }, // 0x72 'r'
{ 3974, 13, 29, 16, 2, -28 }, // 0x73 's'
{ 4022, 10, 34, 12, 1, -33 }, // 0x74 't'
{ 4065, 14, 29, 19, 2, -28 }, // 0x75 'u'
{ 4116, 14, 29, 15, 1, -28 }, // 0x76 'v'
{ 4167, 21, 29, 23, 1, -28 }, // 0x77 'w'
{ 4244, 14, 29, 15, 1, -28 }, // 0x78 'x'
{ 4295, 14, 34, 16, 1, -28 }, // 0x79 'y'
{ 4355, 11, 29, 13, 1, -28 }, // 0x7A 'z'
{ 4395, 10, 37, 14, 2, -33 }, // 0x7B '{'
{ 4442, 4, 37, 10, 3, -34 }, // 0x7C '|'
{ 4461, 10, 37, 14, 2, -33 }, // 0x7D '}'
{ 4508, 17, 6, 21, 2, -21 } }; // 0x7E '~'
const GFXfont Antonio_SemiBold20pt7b PROGMEM = {
(uint8_t *)Antonio_SemiBold20pt7bBitmaps,
(GFXglyph *)Antonio_SemiBold20pt7bGlyphs,
0x20, 0x7E, 51 };
// Approx. 5193 bytes

View file

@ -0,0 +1,954 @@
const uint8_t Antonio_SemiBold30pt7bBitmaps[] PROGMEM = {
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE7,
0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9,
0xF3, 0xE3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x00, 0x00,
0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xBF, 0x7E, 0xFC, 0xF9, 0xF3, 0xE7, 0x8F, 0x1E, 0x3C, 0x78,
0xF1, 0xE0, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x07, 0xC0, 0x07, 0xC1, 0xF0,
0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC1,
0xF0, 0x01, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F,
0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3C, 0x1F, 0x00,
0x1F, 0x07, 0xC0, 0x07, 0xC1, 0xF0, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF,
0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xE0, 0xF8, 0x00, 0xF8,
0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00,
0xF0, 0x3C, 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC1, 0xF0,
0x3F, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
0xFF, 0x83, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F,
0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, 0x00,
0x1F, 0x07, 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F,
0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0xF8,
0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x00, 0x00, 0x70, 0x00,
0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00,
0x03, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xF8, 0x3F, 0xFF,
0xC7, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xE0,
0x7E, 0xFE, 0x07, 0xEF, 0xE0, 0x7E, 0x7E, 0x07, 0xE7, 0xE0, 0x7E, 0x7F,
0x07, 0xE7, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xF0, 0x00,
0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x00, 0x0F, 0xF8,
0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFE, 0x00, 0x0F,
0xE7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0,
0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7F, 0x07, 0xF7, 0xF0, 0x7F, 0x3F,
0xDF, 0xE3, 0xFF, 0xFE, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x0F, 0xFF, 0x00,
0x3F, 0xE0, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00,
0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0xFC, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xFF, 0xF8,
0x00, 0x03, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7F,
0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF0, 0x00,
0x07, 0xE0, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x01, 0xF8, 0x00, 0x3E,
0x00, 0x00, 0xFC, 0x07, 0xE0, 0x00, 0xF8, 0x00, 0x03, 0xF0, 0x1F, 0x80,
0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x01,
0xF8, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x03, 0xE0, 0x00, 0x03,
0xF0, 0x1F, 0x80, 0x0F, 0x80, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x7E, 0x00,
0x00, 0x3F, 0x01, 0xF8, 0x01, 0xF0, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x07,
0xC0, 0x00, 0x03, 0xF0, 0x1F, 0x80, 0x3F, 0x00, 0xFE, 0x0F, 0xC0, 0x7E,
0x00, 0xF8, 0x1F, 0xFE, 0x3F, 0x01, 0xF8, 0x07, 0xE0, 0xFF, 0xFC, 0xFC,
0x07, 0xE0, 0x1F, 0x07, 0xFF, 0xFB, 0xF0, 0x1F, 0x80, 0x7C, 0x1F, 0xFF,
0xEF, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x1F, 0xFF, 0x01, 0xF8, 0x0F, 0x83,
0xF0, 0x3F, 0xFC, 0x07, 0xE0, 0x7E, 0x0F, 0xC0, 0xFF, 0xF0, 0x1F, 0x81,
0xF0, 0x3F, 0x03, 0xF7, 0xC0, 0x7E, 0x07, 0xC0, 0xFC, 0x07, 0xDF, 0x81,
0xF0, 0x3F, 0x03, 0xF0, 0x1F, 0x7E, 0x0F, 0xC0, 0xF8, 0x0F, 0xC0, 0x7D,
0xFF, 0xFF, 0x07, 0xE0, 0x3F, 0x01, 0xF3, 0xFF, 0xF8, 0x1F, 0x00, 0xFC,
0x07, 0xCF, 0xFF, 0xE0, 0x7C, 0x03, 0xF0, 0x1F, 0x1F, 0xFF, 0x03, 0xF0,
0x0F, 0xC0, 0x7C, 0x1F, 0xF0, 0x0F, 0x80, 0x3F, 0x01, 0xF0, 0x00, 0x00,
0x7E, 0x00, 0xFC, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x03, 0xF0, 0x1F, 0x00,
0x00, 0x07, 0xC0, 0x0F, 0xC0, 0x7C, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x01,
0xF0, 0x00, 0x00, 0xF8, 0x00, 0xFC, 0x07, 0xC0, 0x00, 0x07, 0xE0, 0x03,
0xF0, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x7C, 0x00, 0x00, 0x7C,
0x00, 0x3F, 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0xFC, 0x0F, 0xC0, 0x00,
0x0F, 0x80, 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0xFC,
0x00, 0x01, 0xF8, 0x00, 0x3F, 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x7F,
0x3F, 0x80, 0x00, 0x3F, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xF8, 0x00,
0x03, 0xFF, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x1F,
0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x7F, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFF, 0xC0,
0x07, 0xFF, 0xF0, 0x03, 0xF8, 0x7C, 0x00, 0xFC, 0x1F, 0x80, 0x3F, 0x03,
0xE0, 0x0F, 0xC0, 0xF8, 0x03, 0xF0, 0x3E, 0x00, 0xFC, 0x0F, 0x80, 0x3F,
0x03, 0xE0, 0x0F, 0xC0, 0xF8, 0x03, 0xF0, 0x7C, 0x00, 0xFE, 0x1F, 0x00,
0x1F, 0x8F, 0xC0, 0x07, 0xE3, 0xE0, 0x01, 0xF9, 0xF8, 0x00, 0x3F, 0x7C,
0x00, 0x0F, 0xFF, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xE0, 0x00, 0x1F,
0xF0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00,
0x3F, 0xE0, 0x00, 0x1F, 0xF8, 0x04, 0x0F, 0xFF, 0x01, 0x03, 0xFF, 0xC0,
0xE1, 0xFF, 0xF8, 0x7C, 0x7E, 0x7E, 0x1F, 0x3F, 0x1F, 0x8F, 0xCF, 0xC3,
0xF7, 0xE7, 0xE0, 0xFD, 0xF1, 0xF8, 0x1F, 0xFC, 0x7E, 0x07, 0xFE, 0x3F,
0x01, 0xFF, 0x8F, 0xC0, 0x3F, 0xC3, 0xF0, 0x0F, 0xF0, 0xFC, 0x01, 0xF8,
0x3F, 0x00, 0x7E, 0x0F, 0xC0, 0x3F, 0xC3, 0xF0, 0x1F, 0xF0, 0xFE, 0x07,
0xFC, 0x1F, 0xC7, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFE, 0xFC, 0x3F,
0xFF, 0x3F, 0x07, 0xFF, 0x87, 0xE0, 0x7F, 0x81, 0xF8, 0x07, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0x7D, 0xF7, 0xDE, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x8E,
0x30, 0xC0, 0x00, 0xC3, 0xF3, 0xFD, 0xFF, 0x7F, 0xDF, 0xEF, 0xE3, 0xF8,
0xFE, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F,
0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3,
0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC,
0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F,
0xC3, 0xF0, 0xFC, 0x3F, 0x8F, 0xE3, 0xF8, 0x7F, 0x9F, 0xF7, 0xFC, 0xFF,
0x0F, 0xC0, 0x70, 0xE0, 0x1F, 0xC3, 0xFC, 0x7F, 0xCF, 0xFC, 0xFF, 0x83,
0xF0, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8,
0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F,
0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F,
0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1,
0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC,
0x3F, 0x87, 0xE3, 0xFD, 0xFF, 0xBF, 0xE7, 0xFC, 0xFE, 0x1C, 0x00, 0x00,
0x7C, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x81, 0x0C, 0x1E, 0x0C, 0x38, 0x78,
0x71, 0xF9, 0xE7, 0xEF, 0xF7, 0xBF, 0xCF, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0,
0x0F, 0xFC, 0x00, 0x1F, 0xE0, 0x01, 0xFF, 0xE0, 0x1F, 0xFF, 0xE3, 0xFF,
0xFF, 0xE7, 0xF7, 0xBF, 0xDF, 0x1E, 0x3E, 0x38, 0x78, 0x70, 0x41, 0xE0,
0xC0, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x01,
0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x81,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3E,
0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00,
0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x1E,
0x1E, 0x1E, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00,
0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7C,
0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7E, 0x00,
0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
0xC0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0,
0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xE0, 0x01,
0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC,
0x00, 0x3F, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00,
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F,
0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0,
0x00, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F,
0xFF, 0xE7, 0xFF, 0xFE, 0x7F, 0x0F, 0xE7, 0xE0, 0x7F, 0x7E, 0x07, 0xFF,
0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F,
0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07,
0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0,
0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE,
0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF,
0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F,
0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0x7E, 0x07,
0xF7, 0xE0, 0x7F, 0x7F, 0x07, 0xE7, 0xF0, 0xFE, 0x7F, 0xFF, 0xE3, 0xFF,
0xFC, 0x1F, 0xFF, 0xC1, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x06, 0x00, 0x00,
0xF8, 0x0F, 0xC0, 0xFE, 0x0F, 0xF1, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFD, 0xFF, 0xCF, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0,
0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07,
0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC,
0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80,
0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F,
0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x03, 0xFC, 0x01,
0xFF, 0xC0, 0x7F, 0xFC, 0x0F, 0xFF, 0xC3, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F,
0xC3, 0xF3, 0xF0, 0x7F, 0x7E, 0x07, 0xEF, 0xC0, 0xFD, 0xF8, 0x1F, 0xBF,
0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xFF, 0x81, 0xFF, 0xF0, 0x3F, 0xFE,
0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x1F, 0xFF, 0x07, 0xF0, 0x00, 0xFE, 0x00,
0x1F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x01,
0xFC, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x1F,
0xC0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, 0xFC,
0x00, 0x3F, 0x80, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0,
0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xFF,
0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x03,
0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0xFF, 0xE7,
0xFF, 0xFE, 0x7F, 0x0F, 0xE7, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F,
0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03,
0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00,
0x7E, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x01, 0xFF, 0xC0, 0x1F, 0xF8, 0x01,
0xFF, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x0F, 0xE0,
0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x3F,
0x00, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03,
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0xFE, 0x07, 0xF7, 0xE0,
0x7F, 0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x3F,
0xFF, 0x81, 0xFF, 0xF8, 0x07, 0xFE, 0x00, 0x07, 0x00, 0x00, 0x1F, 0xE0,
0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00,
0x07, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xE0, 0x00,
0xFF, 0xC0, 0x03, 0xDF, 0x80, 0x07, 0xBF, 0x00, 0x0F, 0x7E, 0x00, 0x3E,
0xFC, 0x00, 0x79, 0xF8, 0x00, 0xF3, 0xF0, 0x03, 0xE7, 0xE0, 0x07, 0xCF,
0xC0, 0x0F, 0x1F, 0x80, 0x3E, 0x3F, 0x00, 0x7C, 0x7E, 0x00, 0xF0, 0xFC,
0x01, 0xE1, 0xF8, 0x07, 0xC3, 0xF0, 0x0F, 0x87, 0xE0, 0x1E, 0x0F, 0xC0,
0x7C, 0x1F, 0x80, 0xF8, 0x3F, 0x01, 0xF0, 0x7E, 0x07, 0xC0, 0xFC, 0x0F,
0x81, 0xF8, 0x1F, 0x03, 0xF0, 0x7E, 0x07, 0xE0, 0xF8, 0x0F, 0xC1, 0xF0,
0x1F, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x1F,
0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8,
0x00, 0x03, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0xFF, 0xFF, 0x9F,
0xFF, 0xF3, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F,
0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E,
0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x04, 0x07, 0xEF, 0xF0, 0xFF,
0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xF1, 0xFD, 0xFC,
0x1F, 0xBF, 0x03, 0xF7, 0xE0, 0x7E, 0xFC, 0x0F, 0xC0, 0x01, 0xF8, 0x00,
0x3F, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00,
0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0xC0,
0xFF, 0xF8, 0x1F, 0xBF, 0x03, 0xF7, 0xE0, 0x7E, 0xFC, 0x0F, 0xDF, 0x81,
0xFB, 0xF0, 0x3F, 0x7F, 0x07, 0xEF, 0xF1, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF,
0xE1, 0xFF, 0xF8, 0x1F, 0xFF, 0x01, 0xFF, 0x80, 0x07, 0x00, 0x00, 0x01,
0xFC, 0x00, 0x7F, 0xF8, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFC,
0x1F, 0xFF, 0xF1, 0xFC, 0x1F, 0x8F, 0xC0, 0xFC, 0x7E, 0x07, 0xE3, 0xF0,
0x3F, 0x1F, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB,
0xF8, 0x0F, 0xDF, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80,
0x01, 0xFC, 0x30, 0x0F, 0xEF, 0xF0, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F,
0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xF8, 0x3F, 0xBF, 0x81, 0xFD, 0xFC, 0x07,
0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE,
0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xFF, 0xE0, 0x3F,
0xFF, 0x01, 0xFB, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF3, 0xF0,
0x1F, 0x9F, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0, 0x7F, 0x3F, 0xC7, 0xF8,
0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0x7F, 0xFC, 0x01, 0xFF,
0xC0, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
0xFE, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0x80,
0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x3F,
0x80, 0x01, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xE0, 0x00,
0x3F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xE0,
0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F,
0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00,
0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x01, 0xFC,
0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x01,
0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0,
0x00, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83,
0xFF, 0xFC, 0x7F, 0xFF, 0xE7, 0xF9, 0xFE, 0x7E, 0x07, 0xEF, 0xE0, 0x7F,
0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07,
0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0,
0x7F, 0x7E, 0x07, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3, 0xF9, 0xFC, 0x1F,
0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x9F, 0xC7,
0xF0, 0xFE, 0x7E, 0x0F, 0xEF, 0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xE0, 0x7F,
0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07,
0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0,
0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xE7, 0xF0, 0xFE, 0x7F,
0xFF, 0xE3, 0xFF, 0xFC, 0x3F, 0xFF, 0xC1, 0xFF, 0xF8, 0x07, 0xFE, 0x00,
0x06, 0x00, 0x07, 0xFC, 0x03, 0xFF, 0xE0, 0xFF, 0xFE, 0x1F, 0xFF, 0xC7,
0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0x83, 0xFF, 0xE0, 0x7F, 0xFC, 0x07, 0xFF,
0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF,
0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE,
0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x3F, 0xFC,
0x07, 0xFF, 0xC0, 0xFD, 0xFE, 0xFF, 0xBF, 0xFF, 0xF7, 0xFF, 0xFE, 0x7F,
0xFF, 0xC7, 0xFF, 0xF8, 0x3F, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00,
0x1F, 0x80, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xE0,
0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF8, 0x1F, 0xBF, 0x03, 0xF7, 0xE0,
0xFE, 0xFE, 0x1F, 0x9F, 0xFF, 0xF1, 0xFF, 0xFE, 0x3F, 0xFF, 0x83, 0xFF,
0xE0, 0x3F, 0xF8, 0x00, 0x20, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7,
0x9F, 0x3E, 0x78, 0xF1, 0xE7, 0x8F, 0x1E, 0x3C, 0xF0, 0x00, 0x01, 0x00,
0x03, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0xFF, 0x01, 0xFF, 0x07,
0xFF, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xE0, 0xFF, 0x80, 0xFE, 0x00, 0xFC,
0x00, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0x7F, 0xE0, 0x3F,
0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0x00, 0xFF, 0x00, 0x3F, 0x00,
0x1F, 0x00, 0x07, 0x00, 0x03, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
0x00, 0xC0, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF,
0x80, 0xFF, 0xE0, 0x3F, 0xF0, 0x0F, 0xFC, 0x07, 0xFE, 0x01, 0xFF, 0x00,
0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0xFF, 0x01, 0xFF, 0x07,
0xFE, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xE0, 0xFF, 0x80, 0xFF, 0x00, 0xFC,
0x00, 0xF8, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x07, 0xF8, 0x07,
0xFF, 0x83, 0xFF, 0xF0, 0xFF, 0xFE, 0x7F, 0xFF, 0x9F, 0xFF, 0xE7, 0xE1,
0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF8, 0x7F,
0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF,
0x87, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xE0, 0x03,
0xF8, 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xF0, 0x3F, 0xF8,
0x1F, 0xFC, 0x07, 0xFC, 0x01, 0xFC, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07,
0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x7E, 0x00,
0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07,
0xE0, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x7F, 0xFF,
0x00, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x0F,
0xFC, 0x7F, 0xE0, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x00, 0x7E,
0x00, 0xFC, 0x00, 0x01, 0xF0, 0x0F, 0xC0, 0x00, 0x07, 0xC0, 0x7C, 0x00,
0x00, 0x1E, 0x07, 0xE0, 0x00, 0x00, 0xF8, 0x3E, 0x00, 0x00, 0x03, 0xC3,
0xF0, 0x0F, 0xF8, 0x1E, 0x1F, 0x00, 0xFF, 0xF0, 0xF8, 0xF8, 0x0F, 0xFF,
0x83, 0xC7, 0xC0, 0xFF, 0xFC, 0x1E, 0x7E, 0x0F, 0xC1, 0xE0, 0xF3, 0xE0,
0x7C, 0x0F, 0x07, 0xDF, 0x03, 0xC0, 0x78, 0x3E, 0xF8, 0x3E, 0x03, 0xC1,
0xF7, 0xC1, 0xE0, 0x1E, 0x0F, 0xBE, 0x0F, 0x00, 0xF0, 0x7D, 0xF0, 0x78,
0x07, 0x83, 0xFF, 0x87, 0xC0, 0x3C, 0x1F, 0xFC, 0x3E, 0x01, 0xE0, 0xFF,
0xE1, 0xF0, 0x0F, 0x07, 0xFF, 0x0F, 0x80, 0x78, 0x3F, 0xF8, 0x7C, 0x03,
0xC1, 0xFF, 0xC3, 0xE0, 0x1E, 0x0F, 0xFE, 0x1F, 0x00, 0xF0, 0x7F, 0xF0,
0xF8, 0x07, 0x83, 0xEF, 0x87, 0xC0, 0x3C, 0x1E, 0x7C, 0x1E, 0x01, 0xE0,
0xF3, 0xE0, 0xF0, 0x1F, 0x87, 0x9F, 0x07, 0xC0, 0xFC, 0x3C, 0xF8, 0x3E,
0x0F, 0xE3, 0xC7, 0xE0, 0xF8, 0x6F, 0xBE, 0x1F, 0x07, 0xFF, 0x3F, 0xF0,
0xF8, 0x1F, 0xF1, 0xFF, 0x07, 0xC0, 0x7F, 0x87, 0xF0, 0x1F, 0x01, 0xF8,
0x0E, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x1F,
0x80, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00,
0x00, 0x0F, 0xE0, 0x00, 0x0C, 0x00, 0x3F, 0xE0, 0x07, 0xE0, 0x00, 0xFF,
0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0xC0,
0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x01, 0xFF,
0x00, 0x01, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF,
0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x03, 0xFF, 0x80, 0x03, 0xFF,
0x80, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xC0, 0x03, 0xEF,
0xC0, 0x03, 0xE7, 0xC0, 0x07, 0xE7, 0xC0, 0x07, 0xE7, 0xE0, 0x07, 0xE7,
0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xC3,
0xE0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3,
0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x1F, 0xC1, 0xF8, 0x1F, 0x81,
0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81,
0xF8, 0x1F, 0x81, 0xF8, 0x3F, 0x80, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF,
0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF,
0xFE, 0x7F, 0x00, 0x7E, 0x7F, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00,
0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0xFE, 0x00,
0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1,
0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0x07, 0xF3, 0xF8, 0x1F, 0xDF, 0xC0,
0xFE, 0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0xBF, 0x81, 0xFD, 0xFC, 0x0F, 0xEF,
0xE0, 0x7F, 0x7F, 0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x07,
0xF7, 0xF0, 0x3F, 0x3F, 0x81, 0xF9, 0xFC, 0x1F, 0xCF, 0xFF, 0xFC, 0x7F,
0xFF, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC7, 0xF0, 0xFF,
0x3F, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, 0xF8,
0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF,
0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0,
0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xBF, 0x81, 0xFD, 0xFC, 0x0F, 0xEF,
0xE1, 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, 0xFF, 0xFF,
0x87, 0xFF, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0,
0x3F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF, 0xE0,
0x7E, 0x7F, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFE, 0xFC, 0x07, 0xFF,
0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03,
0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x00, 0x7F,
0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00,
0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8,
0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF,
0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0,
0x7F, 0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFE, 0xFE, 0x07, 0xE7,
0xF0, 0x7F, 0x1F, 0xC7, 0xF8, 0xFF, 0xFF, 0x83, 0xFF, 0xFC, 0x1F, 0xFF,
0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0xFF, 0xFE, 0x07,
0xFF, 0xFC, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0x07,
0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF,
0x80, 0xFD, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F,
0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC,
0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0,
0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01,
0xFF, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF7, 0xF0, 0x3F, 0xBF,
0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE1, 0xFE, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF,
0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
0xFE, 0xFF, 0xFE, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF,
0xF0, 0x3F, 0xFF, 0xC3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF,
0xE0, 0x7F, 0x7F, 0x03, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x7F, 0xFC, 0x03,
0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE,
0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x00, 0x0F, 0xE0, 0x00,
0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xFF, 0xF0,
0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0xFF,
0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80,
0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xEF,
0xC0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x07,
0xF7, 0xF0, 0x3F, 0x9F, 0xC3, 0xFC, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F,
0xFF, 0x78, 0x7F, 0xF1, 0xC0, 0xFF, 0x0E, 0xFE, 0x03, 0xFF, 0xF0, 0x1F,
0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8,
0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF,
0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0,
0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF,
0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF,
0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F,
0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8,
0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF,
0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0,
0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00,
0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00,
0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0,
0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F,
0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07,
0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00,
0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xFF, 0xE0, 0x7F, 0xFE,
0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF,
0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F,
0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x7F, 0x8F, 0xE3, 0xFF, 0xFC, 0x3F, 0xFF,
0xC1, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x7F, 0xE0, 0x00, 0x60, 0x00, 0xFE,
0x01, 0xFD, 0xFC, 0x07, 0xF3, 0xF8, 0x0F, 0xE7, 0xF0, 0x1F, 0x8F, 0xE0,
0x7F, 0x1F, 0xC0, 0xFE, 0x3F, 0x81, 0xF8, 0x7F, 0x07, 0xF0, 0xFE, 0x0F,
0xE1, 0xFC, 0x1F, 0x83, 0xF8, 0x7F, 0x07, 0xF0, 0xFE, 0x0F, 0xE3, 0xF8,
0x1F, 0xC7, 0xF0, 0x3F, 0x8F, 0xC0, 0x7F, 0x3F, 0x80, 0xFE, 0x7F, 0x01,
0xFC, 0xFC, 0x03, 0xFB, 0xF8, 0x07, 0xF7, 0xF0, 0x0F, 0xEF, 0xC0, 0x1F,
0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x01, 0xFF,
0xF0, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xEF, 0xC0, 0x1F, 0xDF,
0xC0, 0x3F, 0xBF, 0x80, 0x7F, 0x3F, 0x80, 0xFE, 0x7F, 0x01, 0xFC, 0xFE,
0x03, 0xF8, 0xFE, 0x07, 0xF1, 0xFC, 0x0F, 0xE1, 0xF8, 0x1F, 0xC3, 0xF8,
0x3F, 0x87, 0xF0, 0x7F, 0x07, 0xF0, 0xFE, 0x0F, 0xE1, 0xFC, 0x1F, 0xC3,
0xF8, 0x1F, 0xC7, 0xF0, 0x3F, 0x8F, 0xE0, 0x3F, 0x1F, 0xC0, 0x7F, 0x3F,
0x80, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x01, 0xFD, 0xFC, 0x03, 0xFC, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE,
0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFE,
0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF0,
0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xC0,
0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFE, 0x00,
0x7F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x7C, 0x01, 0xFF, 0xFE, 0xF8, 0x03,
0xFF, 0xFD, 0xF0, 0x07, 0xFF, 0xFB, 0xE0, 0x1F, 0xFF, 0xF7, 0xC0, 0x3E,
0xFF, 0xE7, 0xC0, 0x7D, 0xFF, 0xEF, 0x80, 0xFB, 0xFF, 0xDF, 0x01, 0xF7,
0xFF, 0xBE, 0x03, 0xEF, 0xFF, 0x7C, 0x0F, 0x9F, 0xFE, 0x7C, 0x1F, 0x3F,
0xFC, 0xF8, 0x3E, 0x7F, 0xF9, 0xF0, 0x7C, 0xFF, 0xF3, 0xE0, 0xF9, 0xFF,
0xE7, 0xC3, 0xE3, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF,
0x1F, 0x1F, 0x1F, 0xFE, 0x3E, 0x3E, 0x3F, 0xFC, 0x7C, 0x78, 0x7F, 0xF8,
0x7D, 0xF0, 0xFF, 0xF0, 0xFB, 0xE1, 0xFF, 0xE1, 0xF7, 0xC3, 0xFF, 0xC3,
0xEF, 0x87, 0xFF, 0x87, 0xDE, 0x0F, 0xFF, 0x07, 0xFC, 0x1F, 0xFE, 0x0F,
0xF8, 0x3F, 0xFC, 0x1F, 0xF0, 0x7F, 0xF8, 0x3F, 0xE0, 0xFF, 0xF0, 0x7F,
0x81, 0xFF, 0xE0, 0x7F, 0x03, 0xFF, 0xC0, 0xFE, 0x07, 0xFF, 0x81, 0xFC,
0x0F, 0xFF, 0x03, 0xF8, 0x1F, 0xFE, 0x07, 0xE0, 0x3F, 0xFC, 0x07, 0xC0,
0x7F, 0xF8, 0x0F, 0x80, 0xFC, 0xF8, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xC0,
0x0F, 0xFF, 0x80, 0x3F, 0xFE, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x0F,
0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x0F, 0xFF,
0xE0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8,
0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x0F, 0xFF, 0x7C, 0x3F,
0xFD, 0xF0, 0xFF, 0xF7, 0xE3, 0xFF, 0xCF, 0x8F, 0xFF, 0x3E, 0x3F, 0xFC,
0xFC, 0xFF, 0xF1, 0xF3, 0xFF, 0xC7, 0xCF, 0xFF, 0x1F, 0xBF, 0xFC, 0x3E,
0xFF, 0xF0, 0xFB, 0xFF, 0xC3, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0xFF,
0xF0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0,
0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x0F,
0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0x7F, 0xFC, 0x01, 0xFF, 0xF0, 0x07, 0xFF,
0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x01, 0xF0, 0x01,
0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, 0xFF, 0xC3, 0xFF, 0xFF,
0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF, 0xE0, 0x7F, 0x7F, 0x03, 0xFB, 0xF0,
0x1F, 0xDF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF,
0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80,
0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF,
0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03,
0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE,
0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F,
0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0,
0x1F, 0xDF, 0x80, 0xFE, 0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0x1F, 0xC7, 0xF8,
0xFF, 0xFF, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0xFF,
0xC0, 0x00, 0x70, 0x00, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1,
0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0x07, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0,
0xFE, 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xEF,
0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03,
0xFF, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xEF, 0xE0, 0x3F, 0x7F,
0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x1F, 0xE7, 0xFF, 0xFF,
0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0x03, 0xF8,
0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01,
0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0,
0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F,
0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00,
0x07, 0xF0, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0,
0x3F, 0xFF, 0xC3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF, 0xE0,
0x7F, 0x7F, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0x7F, 0xFC, 0x03, 0xFF,
0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01,
0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF,
0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F,
0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8,
0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F,
0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0,
0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFE, 0xFE, 0x07, 0xF7,
0xF0, 0x3F, 0x1F, 0xC7, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF,
0xE0, 0x7F, 0xFE, 0x00, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00,
0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x0E,
0x00, 0x00, 0x20, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x3F, 0xFF, 0xF9, 0xFF,
0xFF, 0xCF, 0xFF, 0xFF, 0x7F, 0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0x7E,
0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xFF, 0xE0,
0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF7,
0xF0, 0x1F, 0xBF, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE0, 0xFE, 0x7F, 0xFF,
0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xE0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x3F,
0x83, 0xF9, 0xFC, 0x0F, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, 0xF8, 0x0F,
0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC,
0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0,
0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
0xF0, 0x1F, 0xC0, 0x03, 0xFC, 0x00, 0x7F, 0xF8, 0x07, 0xFF, 0xE0, 0x7F,
0xFF, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, 0xFC, 0x3F, 0x8F, 0xC0, 0xFC,
0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xEF, 0xE0,
0x3F, 0x7F, 0x01, 0xFB, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0x7F, 0x03, 0xF3,
0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFF, 0x00, 0x0F, 0xFC,
0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00,
0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F,
0x80, 0x01, 0xFE, 0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0xBF, 0x80, 0xFD, 0xFC,
0x07, 0xEF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F,
0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0,
0x7F, 0x3F, 0xC7, 0xF8, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0,
0x7F, 0xFC, 0x01, 0xFF, 0xC0, 0x00, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x80, 0x1F, 0xC0, 0x0F,
0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00,
0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC,
0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x07,
0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80,
0x1F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFE,
0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03,
0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0,
0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x00, 0xFC, 0x03, 0xFF, 0xE0, 0x1F,
0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0,
0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF,
0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80,
0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF,
0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03,
0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE,
0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F,
0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFB, 0xF0,
0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x81, 0xFD,
0xFC, 0x0F, 0xE7, 0xF0, 0xFF, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x87, 0xFF,
0xF8, 0x1F, 0xFF, 0x80, 0x3F, 0xF8, 0x00, 0x18, 0x00, 0xFE, 0x00, 0x7F,
0xFE, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E,
0x7E, 0x00, 0x7E, 0x7F, 0x00, 0x7E, 0x7F, 0x00, 0xFE, 0x3F, 0x00, 0xFC,
0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC,
0x3F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8,
0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0xC1, 0xF8, 0x0F, 0xC1, 0xF8,
0x0F, 0xC1, 0xF8, 0x0F, 0xC1, 0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0,
0x0F, 0xC3, 0xF0, 0x0F, 0xE3, 0xF0, 0x07, 0xE3, 0xF0, 0x07, 0xE3, 0xE0,
0x07, 0xE3, 0xE0, 0x07, 0xE3, 0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xE7, 0xE0,
0x03, 0xF7, 0xE0, 0x03, 0xF7, 0xE0, 0x03, 0xF7, 0xC0, 0x03, 0xF7, 0xC0,
0x03, 0xF7, 0xC0, 0x03, 0xF7, 0xC0, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xC0,
0x01, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80,
0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80,
0x00, 0xFF, 0x00, 0xFE, 0x00, 0xF8, 0x03, 0xF7, 0xE0, 0x0F, 0xC0, 0x3F,
0x7E, 0x01, 0xFC, 0x03, 0xF7, 0xE0, 0x1F, 0xC0, 0x3F, 0x7E, 0x01, 0xFC,
0x03, 0xF7, 0xE0, 0x1F, 0xC0, 0x3F, 0x7E, 0x01, 0xFC, 0x03, 0xE7, 0xE0,
0x1F, 0xC0, 0x7E, 0x3E, 0x01, 0xFE, 0x07, 0xE3, 0xF0, 0x3F, 0xE0, 0x7E,
0x3F, 0x03, 0xFE, 0x07, 0xE3, 0xF0, 0x3F, 0xE0, 0x7E, 0x3F, 0x03, 0xFE,
0x07, 0xE3, 0xF0, 0x3F, 0xE0, 0x7E, 0x3F, 0x03, 0xFE, 0x07, 0xE1, 0xF0,
0x3F, 0xF0, 0x7C, 0x1F, 0x07, 0xDF, 0x07, 0xC1, 0xF0, 0x7D, 0xF0, 0xFC,
0x1F, 0x87, 0xDF, 0x0F, 0xC1, 0xF8, 0x7D, 0xF0, 0xFC, 0x1F, 0x87, 0xCF,
0x0F, 0xC1, 0xF8, 0x7C, 0xF0, 0xFC, 0x1F, 0x87, 0xCF, 0x8F, 0xC0, 0xF8,
0xF8, 0xF8, 0xF8, 0x0F, 0x8F, 0x8F, 0x8F, 0x80, 0xF8, 0xF8, 0xF8, 0xF8,
0x0F, 0x8F, 0x8F, 0x8F, 0x80, 0xFC, 0xF8, 0x78, 0xF8, 0x0F, 0xCF, 0x87,
0x9F, 0x80, 0xFC, 0xF0, 0x7D, 0xF8, 0x0F, 0xDF, 0x07, 0xDF, 0x80, 0x7D,
0xF0, 0x7D, 0xF8, 0x07, 0xDF, 0x07, 0xDF, 0x00, 0x7D, 0xF0, 0x7D, 0xF0,
0x07, 0xDF, 0x03, 0xDF, 0x00, 0x7D, 0xF0, 0x3D, 0xF0, 0x07, 0xFE, 0x03,
0xFF, 0x00, 0x7F, 0xE0, 0x3F, 0xF0, 0x07, 0xFE, 0x03, 0xFF, 0x00, 0x3F,
0xE0, 0x3F, 0xF0, 0x03, 0xFE, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x1F, 0xE0,
0x03, 0xFE, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x1F, 0xE0, 0x03, 0xFC, 0x01,
0xFE, 0x00, 0x3F, 0xC0, 0x1F, 0xE0, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0x1F,
0xC0, 0x1F, 0xE0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x0F, 0xC0,
0xFC, 0x01, 0xF9, 0xF8, 0x07, 0xE7, 0xE0, 0x3F, 0x8F, 0x80, 0xFC, 0x3F,
0x03, 0xF0, 0xFC, 0x0F, 0xC1, 0xF0, 0x7E, 0x07, 0xE1, 0xF8, 0x1F, 0x87,
0xE0, 0x7E, 0x1F, 0x80, 0xF8, 0xFC, 0x03, 0xF3, 0xF0, 0x0F, 0xCF, 0xC0,
0x1F, 0x3E, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x0F,
0xFC, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xF8,
0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00,
0x1F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F,
0xF0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xF8,
0x03, 0xF3, 0xE0, 0x0F, 0xCF, 0xC0, 0x3F, 0x3F, 0x01, 0xFC, 0xFC, 0x07,
0xE1, 0xF8, 0x1F, 0x87, 0xE0, 0x7E, 0x1F, 0x83, 0xF8, 0x3E, 0x0F, 0xC0,
0xFC, 0x3F, 0x03, 0xF1, 0xFC, 0x07, 0xC7, 0xE0, 0x1F, 0x9F, 0x80, 0x7E,
0x7E, 0x00, 0xFB, 0xF8, 0x03, 0xF0, 0xFE, 0x00, 0x7F, 0x7E, 0x00, 0x7E,
0x7F, 0x00, 0x7E, 0x3F, 0x00, 0xFE, 0x3F, 0x00, 0xFE, 0x3F, 0x80, 0xFC,
0x3F, 0x80, 0xFC, 0x1F, 0x81, 0xFC, 0x1F, 0x81, 0xF8, 0x1F, 0xC1, 0xF8,
0x0F, 0xC1, 0xF8, 0x0F, 0xC3, 0xF8, 0x0F, 0xE3, 0xF0, 0x07, 0xE3, 0xF0,
0x07, 0xE3, 0xF0, 0x07, 0xE7, 0xF0, 0x07, 0xF7, 0xE0, 0x03, 0xF7, 0xE0,
0x03, 0xF7, 0xE0, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xC0,
0x01, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80,
0x00, 0xFF, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
0x7F, 0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xF7, 0xFF, 0xF8, 0x01,
0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0,
0x0F, 0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xFC,
0x00, 0xFE, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x0F,
0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x01, 0xFC, 0x00,
0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0,
0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x01, 0xFC, 0x00, 0xFE,
0x00, 0x7F, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01,
0xF8, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F,
0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x03, 0xE0,
0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x7E, 0x00,
0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03,
0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E,
0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xC0,
0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00,
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x80, 0x07,
0xE0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0,
0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0,
0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0,
0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0,
0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0,
0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xF0,
0x00, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7D, 0xF8, 0x01,
0xF7, 0xE0, 0x0F, 0xCF, 0x80, 0x3F, 0x3F, 0x00, 0xFC, 0xFC, 0x03, 0xE3,
0xF0, 0x1F, 0x87, 0xC0, 0x7E, 0x1F, 0x81, 0xF8, 0x7E, 0x07, 0xE1, 0xF8,
0x3F, 0x07, 0xE0, 0xFC, 0x0F, 0xC3, 0xF0, 0x3F, 0x0F, 0xC0, 0xFC, 0x7E,
0x03, 0xF1, 0xF8, 0x0F, 0xE7, 0xE0, 0x1F, 0xBF, 0x80, 0x7E, 0xFE, 0x01,
0xFB, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x1F, 0xC3, 0xF0, 0xFC, 0x1F, 0x07, 0xE0,
0xF8, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x00, 0x20, 0x00, 0x7F, 0xF0, 0x0F,
0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0x8F, 0xE7,
0xF0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x03, 0xF7, 0xE0, 0x3F,
0x7E, 0x03, 0xF7, 0xE0, 0x3F, 0x7E, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07,
0xF0, 0x01, 0xFF, 0x00, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFB, 0xF1, 0xFE,
0x3F, 0x3F, 0xC3, 0xF7, 0xF0, 0x3F, 0x7F, 0x03, 0xF7, 0xE0, 0x3F, 0xFE,
0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF,
0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F,
0xFE, 0x07, 0xF7, 0xE0, 0x7F, 0x7F, 0x0F, 0xF7, 0xFF, 0xFF, 0x7F, 0xFB,
0xF3, 0xFF, 0xBF, 0x1F, 0xF3, 0xF0, 0xFE, 0x3F, 0xFE, 0x00, 0x0F, 0xE0,
0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE,
0x00, 0x0F, 0xE0, 0x80, 0xFE, 0x7F, 0x0F, 0xEF, 0xFC, 0xFF, 0xFF, 0xCF,
0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xF0, 0xFE, 0xFF, 0x07, 0xFF, 0xE0, 0x7F,
0xFE, 0x07, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03,
0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0,
0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE,
0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF,
0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F,
0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x07,
0xFF, 0xF0, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xEF,
0xF8, 0xFE, 0x7F, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0x81,
0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0x8F, 0xE7, 0xF0, 0x7F,
0x7E, 0x07, 0xF7, 0xE0, 0x3F, 0x7E, 0x03, 0xF7, 0xE0, 0x3F, 0xFE, 0x03,
0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0,
0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE,
0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F,
0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F,
0xFE, 0x03, 0xF7, 0xE0, 0x3F, 0x7E, 0x03, 0xF7, 0xE0, 0x7F, 0x7E, 0x07,
0xF7, 0xF0, 0x7E, 0x7F, 0x8F, 0xE3, 0xFF, 0xFE, 0x3F, 0xFF, 0xC1, 0xFF,
0xFC, 0x0F, 0xFF, 0x80, 0x7F, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x03, 0xF8,
0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01,
0xFC, 0x00, 0x0F, 0xE0, 0x18, 0x7F, 0x07, 0xF3, 0xF8, 0xFF, 0xDF, 0xC7,
0xFF, 0xFE, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0xBF, 0xC7, 0xFD, 0xFC, 0x1F,
0xEF, 0xE0, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC,
0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0,
0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01,
0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFB, 0xF0, 0x1F, 0xDF,
0x80, 0xFE, 0xFC, 0x0F, 0xF7, 0xF0, 0x7F, 0xBF, 0xC7, 0xFD, 0xFF, 0xFF,
0xE7, 0xFF, 0xFF, 0x3F, 0xFB, 0xF8, 0xFF, 0xDF, 0xC3, 0xF8, 0xFE, 0x00,
0x20, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3,
0xFF, 0xFE, 0x7F, 0x0F, 0xE7, 0xF0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F,
0x7E, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03,
0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0xFE,
0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x03, 0xFF,
0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xF7, 0xE0, 0x3F,
0x7E, 0x03, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xF0, 0x7F, 0x7F, 0x0F,
0xE3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF, 0x80, 0x7F,
0xF0, 0x00, 0x60, 0x00, 0x01, 0xFE, 0x07, 0xFC, 0x1F, 0xF8, 0x7F, 0xF0,
0xFF, 0xE1, 0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x83, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xF0, 0x07, 0xE0, 0x0F, 0xC0,
0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07,
0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8,
0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00,
0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F,
0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0,
0x1F, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x3F, 0x9F, 0xC7, 0xFE, 0xFE,
0x3F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xFD, 0xFE, 0x3F, 0xEF, 0xE0,
0xFF, 0x7E, 0x07, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFF, 0xFC, 0x07, 0xFF,
0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03,
0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF,
0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F,
0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFD, 0xF8,
0x0F, 0xEF, 0xC0, 0x7F, 0x7F, 0x07, 0xFB, 0xF8, 0x3F, 0xDF, 0xF3, 0xFE,
0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x8F, 0xFD, 0xFC, 0x3F, 0xCF, 0xE0, 0x7C,
0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x40, 0x0F, 0xE3,
0x80, 0xFF, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, 0x7F, 0xFF,
0x80, 0xFF, 0xF0, 0x00, 0x38, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F,
0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00,
0x1F, 0xC1, 0xC0, 0xFE, 0x3F, 0x87, 0xF3, 0xFF, 0x3F, 0xBF, 0xF9, 0xFF,
0xFF, 0xEF, 0xFF, 0xFF, 0x7F, 0xC7, 0xFB, 0xFC, 0x1F, 0xDF, 0xC0, 0x7F,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0,
0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01,
0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF,
0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F,
0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC,
0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xC0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x3F, 0x9F, 0xCF, 0xE7, 0xF3,
0xF9, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E,
0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F,
0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1,
0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E,
0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
0xBF, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80,
0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00,
0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F, 0x3F, 0x81, 0xFC, 0xFE,
0x07, 0xF3, 0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x3F, 0x83, 0xF0, 0xFE, 0x1F,
0xC3, 0xF8, 0x7E, 0x0F, 0xE3, 0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x3F, 0x03,
0xF9, 0xFC, 0x0F, 0xE7, 0xE0, 0x3F, 0x9F, 0x80, 0xFE, 0xFE, 0x03, 0xFB,
0xF0, 0x0F, 0xFF, 0xC0, 0x3F, 0xFE, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xE0,
0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0xFE, 0xFC, 0x03, 0xFB, 0xF0, 0x0F,
0xEF, 0xE0, 0x3F, 0x9F, 0x80, 0xFE, 0x7F, 0x03, 0xF8, 0xFC, 0x0F, 0xE3,
0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x1F, 0x83, 0xF8, 0x7F, 0x0F, 0xE0, 0xFC,
0x3F, 0x83, 0xF8, 0xFE, 0x0F, 0xE3, 0xF8, 0x1F, 0xCF, 0xE0, 0x7F, 0x3F,
0x80, 0xFC, 0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x1F, 0xC0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x04, 0x00, 0x30,
0x3F, 0x9F, 0xE0, 0x7F, 0x8F, 0xEF, 0xFC, 0x7F, 0xF3, 0xFF, 0xFF, 0xBF,
0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xEF, 0xF8, 0xFF,
0xC3, 0xFF, 0xFC, 0x1F, 0xE0, 0x7F, 0xFE, 0x03, 0xF8, 0x1F, 0xFF, 0x80,
0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE,
0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF,
0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03,
0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0,
0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F,
0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0,
0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF,
0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F,
0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00,
0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC,
0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03,
0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8,
0x0F, 0xC0, 0x3F, 0x00, 0x04, 0x07, 0xF1, 0xFC, 0x3F, 0xBF, 0xF9, 0xFD,
0xFF, 0xCF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFB, 0xFC, 0x1F, 0xDF, 0xC0, 0xFE,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0,
0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01,
0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF,
0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F,
0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC,
0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xF0, 0x00,
0x70, 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE,
0x1F, 0xFF, 0xF1, 0xFE, 0x3F, 0x8F, 0xE0, 0xFE, 0x7E, 0x07, 0xF3, 0xF0,
0x1F, 0x9F, 0x80, 0xFD, 0xFC, 0x07, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB,
0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80,
0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF,
0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07,
0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE,
0x03, 0xF3, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0, 0x7F,
0x3F, 0x83, 0xF9, 0xFE, 0x3F, 0xC7, 0xFF, 0xFC, 0x3F, 0xFF, 0xE0, 0xFF,
0xFE, 0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x06, 0x00, 0x00, 0xFE, 0x7F,
0x0F, 0xEF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xF0,
0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE,
0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF,
0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F,
0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03,
0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0,
0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFE,
0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x07, 0xFF, 0xF0, 0xFE, 0xFF, 0xFF, 0xEF,
0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xEF, 0xF8, 0xFE, 0x7F, 0x0F, 0xE1, 0x80,
0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00,
0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF3, 0xF8, 0xFF, 0xDF, 0xCF,
0xFF, 0xFE, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0xBF, 0x87, 0xFD, 0xFC, 0x1F,
0xEF, 0xC0, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC,
0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F,
0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0,
0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01,
0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFB, 0xF0, 0x1F, 0xDF,
0x80, 0xFE, 0xFC, 0x0F, 0xF7, 0xF0, 0x7F, 0xBF, 0x87, 0xFC, 0xFF, 0xFF,
0xE7, 0xFF, 0xFF, 0x1F, 0xFF, 0xF8, 0xFF, 0xDF, 0xC1, 0xFC, 0xFE, 0x01,
0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F,
0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF8, 0xFF,
0xE7, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xC0, 0xFE, 0x03,
0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80,
0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0,
0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8,
0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE,
0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F,
0x80, 0x00, 0x40, 0x00, 0x7F, 0xE0, 0x1F, 0xFF, 0x03, 0xFF, 0xF8, 0x3F,
0xFF, 0xC7, 0xFF, 0xFC, 0x7F, 0x0F, 0xC7, 0xE0, 0xFE, 0x7E, 0x07, 0xEF,
0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xE0, 0x7E, 0x7E, 0x07, 0xE7, 0xE0, 0x7E,
0x7F, 0x07, 0xE7, 0xF0, 0x7E, 0x3F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0,
0x01, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F,
0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00,
0x0F, 0xE7, 0xE0, 0xFE, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7,
0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xF0, 0x7F,
0x7F, 0x8F, 0xE3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF,
0x80, 0x7F, 0xF0, 0x00, 0x60, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80,
0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0,
0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03,
0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE,
0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80,
0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F,
0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFF, 0xC3, 0xFF, 0x83, 0xFF,
0x07, 0xFE, 0x07, 0xFC, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F,
0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03,
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0,
0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC,
0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F,
0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07,
0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xBF, 0x7F, 0xFB, 0xF3, 0xFF,
0x3F, 0x1F, 0xE3, 0xF0, 0x30, 0x00, 0xFE, 0x01, 0xFB, 0xF0, 0x0F, 0xDF,
0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0, 0x3F, 0x3F, 0x01, 0xF9, 0xF8, 0x0F,
0xCF, 0xC0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x0F, 0xC1, 0xF8, 0x7E,
0x0F, 0xC3, 0xF0, 0x7E, 0x1F, 0x83, 0xF0, 0xFC, 0x1F, 0x83, 0xF0, 0xFC,
0x1F, 0x87, 0xC0, 0xFC, 0x3E, 0x07, 0xE1, 0xF0, 0x3F, 0x1F, 0x81, 0xF8,
0xFC, 0x0F, 0xC7, 0xE0, 0x3E, 0x3F, 0x01, 0xF9, 0xF0, 0x0F, 0xCF, 0x80,
0x7E, 0x7C, 0x03, 0xF3, 0xE0, 0x1F, 0x9F, 0x00, 0x7C, 0xF8, 0x03, 0xEF,
0x80, 0x1F, 0x7C, 0x00, 0xFB, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xF8, 0x01,
0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF8,
0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x80, 0xFC,
0x07, 0xE0, 0x1F, 0x7C, 0x07, 0xE0, 0x3F, 0x7C, 0x07, 0xF0, 0x3F, 0x7C,
0x07, 0xF0, 0x3F, 0x7E, 0x07, 0xF0, 0x3F, 0x7E, 0x07, 0xF0, 0x3E, 0x7E,
0x0F, 0xF0, 0x3E, 0x7E, 0x0F, 0xF0, 0x3E, 0x3E, 0x0F, 0xF0, 0x3E, 0x3E,
0x0F, 0xF8, 0x3E, 0x3E, 0x0F, 0x78, 0x3E, 0x3E, 0x0F, 0x78, 0x7E, 0x3E,
0x0F, 0x78, 0x7E, 0x3E, 0x1F, 0x78, 0x7C, 0x3F, 0x1F, 0x78, 0x7C, 0x3F,
0x1F, 0x7C, 0x7C, 0x1F, 0x1F, 0x7C, 0x7C, 0x1F, 0x1E, 0x7C, 0x7C, 0x1F,
0x1E, 0x3C, 0x7C, 0x1F, 0x1E, 0x3C, 0x7C, 0x1F, 0x3E, 0x3C, 0x7C, 0x1F,
0x3E, 0x3C, 0xF8, 0x1F, 0x3E, 0x3E, 0xF8, 0x1F, 0x3C, 0x3E, 0xF8, 0x0F,
0xBC, 0x3E, 0xF8, 0x0F, 0xBC, 0x1E, 0xF8, 0x0F, 0xBC, 0x1E, 0xF8, 0x0F,
0xBC, 0x1E, 0xF8, 0x0F, 0xFC, 0x1E, 0xF8, 0x0F, 0xFC, 0x1E, 0xF0, 0x0F,
0xF8, 0x1F, 0xF0, 0x0F, 0xF8, 0x1F, 0xF0, 0x07, 0xF8, 0x1F, 0xF0, 0x07,
0xF8, 0x0F, 0xF0, 0x07, 0xF8, 0x0F, 0xF0, 0x07, 0xF8, 0x0F, 0xF0, 0x07,
0xF8, 0x0F, 0xF0, 0x07, 0xF0, 0x0F, 0xE0, 0x07, 0xF0, 0x0F, 0xE0, 0x07,
0xF0, 0x0F, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03,
0xF0, 0x07, 0xE0, 0xFC, 0x03, 0xF3, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0xFC,
0x0F, 0xC3, 0xF0, 0x7E, 0x1F, 0x83, 0xF0, 0xFC, 0x1F, 0x03, 0xF1, 0xF8,
0x1F, 0x8F, 0xC0, 0xFC, 0x7C, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x00, 0x7D,
0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00,
0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC,
0x00, 0x07, 0xF0, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x01,
0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x80, 0x3F, 0x7E,
0x01, 0xF3, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0x7E, 0x07, 0xC3, 0xF0, 0x7E,
0x1F, 0x83, 0xF0, 0xFE, 0x1F, 0x83, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xFE,
0x7E, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x00, 0xFE, 0xFE, 0x01, 0xFB, 0xF0,
0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x01, 0xFD,
0xFC, 0x0F, 0xC7, 0xE0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0,
0xFC, 0x7E, 0x07, 0xE3, 0xF0, 0x3E, 0x0F, 0x83, 0xF0, 0x7E, 0x1F, 0x83,
0xF0, 0xFC, 0x1F, 0x87, 0xE0, 0xFC, 0x3F, 0x07, 0xE1, 0xF0, 0x1F, 0x0F,
0x80, 0xF8, 0x7C, 0x07, 0xC3, 0xE0, 0x3F, 0x3F, 0x01, 0xF9, 0xF8, 0x0F,
0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF3, 0xE0, 0x0F, 0x9F, 0x00, 0x7C, 0xF8,
0x03, 0xE7, 0xC0, 0x1F, 0x3C, 0x00, 0x7D, 0xE0, 0x03, 0xFF, 0x00, 0x1F,
0xF8, 0x00, 0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00,
0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F,
0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x03, 0xFE, 0x00, 0xFF, 0xF0, 0x07,
0xFF, 0x00, 0x3F, 0xF8, 0x01, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0x7F, 0xFF,
0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x00, 0x7F, 0x00, 0x7E,
0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0xFC, 0x01, 0xFC,
0x01, 0xF8, 0x01, 0xF8, 0x03, 0xF8, 0x03, 0xF8, 0x03, 0xF0, 0x07, 0xF0,
0x07, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xC0,
0x1F, 0xC0, 0x1F, 0xC0, 0x1F, 0x80, 0x1F, 0x80, 0x3F, 0x80, 0x3F, 0x80,
0x3F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7E,
0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xF0, 0x7F, 0xE0, 0xFE, 0x03, 0xF8, 0x07,
0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC,
0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00,
0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xE0, 0x1F, 0xC1, 0xFF, 0x83, 0xFE,
0x07, 0xF8, 0x0F, 0xE0, 0x1F, 0xF0, 0x3F, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0,
0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07,
0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC,
0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x1F, 0xC0, 0x3F, 0xF0,
0x7F, 0xE0, 0x7F, 0xC0, 0x7F, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFC, 0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0xC0, 0x7F, 0x01,
0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0,
0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0,
0x0F, 0xC0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xF0, 0x1F, 0xF0, 0x3F,
0xC0, 0x7F, 0x01, 0xFC, 0x0F, 0xF0, 0x7F, 0xC3, 0xFC, 0x0F, 0xE0, 0x3F,
0x80, 0xFE, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
0xF0, 0x0F, 0xC0, 0x7F, 0x01, 0xFC, 0x3F, 0xF0, 0xFF, 0x83, 0xFE, 0x0F,
0xF0, 0x3F, 0x00, 0x00, 0x00, 0x08, 0x01, 0xF0, 0x03, 0xF1, 0xFF, 0x80,
0xF8, 0xFF, 0xFE, 0x7E, 0x3F, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xC7, 0xFF,
0xFF, 0xF3, 0xFF, 0xFF, 0xF8, 0x7C, 0x1F, 0xFC, 0x06, 0x00, 0xFE, 0x00 };
const GFXglyph Antonio_SemiBold30pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 13, 0, 0 }, // 0x20 ' '
{ 1, 7, 50, 15, 4, -49 }, // 0x21 '!'
{ 45, 7, 19, 24, 9, -49 }, // 0x22 '"'
{ 62, 26, 50, 30, 2, -49 }, // 0x23 '#'
{ 225, 20, 57, 24, 2, -49 }, // 0x24 '$'
{ 368, 54, 52, 63, 4, -50 }, // 0x25 '%'
{ 719, 26, 52, 29, 2, -50 }, // 0x26 '&'
{ 888, 6, 18, 12, 3, -49 }, // 0x27 '''
{ 902, 10, 58, 17, 4, -51 }, // 0x28 '('
{ 975, 11, 58, 17, 2, -51 }, // 0x29 ')'
{ 1055, 22, 21, 26, 2, -48 }, // 0x2A '*'
{ 1113, 17, 19, 21, 2, -31 }, // 0x2B '+'
{ 1154, 8, 17, 14, 3, -6 }, // 0x2C ','
{ 1171, 13, 4, 20, 3, -24 }, // 0x2D '-'
{ 1178, 5, 6, 15, 5, -5 }, // 0x2E '.'
{ 1182, 18, 51, 22, 2, -50 }, // 0x2F '/'
{ 1297, 20, 52, 26, 3, -50 }, // 0x30 '0'
{ 1427, 13, 50, 22, 3, -49 }, // 0x31 '1'
{ 1509, 19, 51, 26, 4, -50 }, // 0x32 '2'
{ 1631, 20, 52, 26, 3, -50 }, // 0x33 '3'
{ 1761, 23, 50, 26, 2, -49 }, // 0x34 '4'
{ 1905, 19, 51, 26, 4, -49 }, // 0x35 '5'
{ 2027, 21, 52, 26, 3, -50 }, // 0x36 '6'
{ 2164, 21, 50, 26, 3, -49 }, // 0x37 '7'
{ 2296, 20, 52, 26, 3, -50 }, // 0x38 '8'
{ 2426, 19, 52, 26, 3, -50 }, // 0x39 '9'
{ 2550, 7, 30, 15, 4, -37 }, // 0x3A ':'
{ 2577, 7, 41, 16, 5, -37 }, // 0x3B ';'
{ 2613, 16, 29, 21, 2, -35 }, // 0x3C '<'
{ 2671, 16, 14, 21, 3, -29 }, // 0x3D '='
{ 2699, 16, 29, 21, 3, -35 }, // 0x3E '>'
{ 2757, 18, 51, 25, 4, -50 }, // 0x3F '?'
{ 2872, 37, 53, 43, 3, -50 }, // 0x40 '@'
{ 3118, 24, 50, 26, 1, -49 }, // 0x41 'A'
{ 3268, 21, 50, 27, 4, -49 }, // 0x42 'B'
{ 3400, 21, 52, 27, 3, -50 }, // 0x43 'C'
{ 3537, 21, 50, 28, 4, -49 }, // 0x44 'D'
{ 3669, 16, 50, 22, 4, -49 }, // 0x45 'E'
{ 3769, 16, 50, 22, 4, -49 }, // 0x46 'F'
{ 3869, 21, 51, 28, 3, -50 }, // 0x47 'G'
{ 4003, 21, 50, 29, 4, -49 }, // 0x48 'H'
{ 4135, 7, 50, 15, 4, -49 }, // 0x49 'I'
{ 4179, 20, 51, 26, 2, -49 }, // 0x4A 'J'
{ 4307, 23, 50, 27, 4, -49 }, // 0x4B 'K'
{ 4451, 16, 50, 21, 4, -49 }, // 0x4C 'L'
{ 4551, 31, 50, 39, 4, -49 }, // 0x4D 'M'
{ 4745, 22, 50, 30, 4, -49 }, // 0x4E 'N'
{ 4883, 21, 52, 28, 3, -50 }, // 0x4F 'O'
{ 5020, 21, 50, 26, 4, -49 }, // 0x50 'P'
{ 5152, 21, 59, 28, 3, -50 }, // 0x51 'Q'
{ 5307, 21, 50, 28, 4, -49 }, // 0x52 'R'
{ 5439, 21, 52, 24, 2, -50 }, // 0x53 'S'
{ 5576, 17, 50, 19, 1, -49 }, // 0x54 'T'
{ 5683, 21, 51, 28, 4, -49 }, // 0x55 'U'
{ 5817, 24, 50, 26, 1, -49 }, // 0x56 'V'
{ 5967, 36, 50, 39, 1, -49 }, // 0x57 'W'
{ 6192, 22, 50, 24, 1, -49 }, // 0x58 'X'
{ 6330, 24, 50, 24, 0, -49 }, // 0x59 'Y'
{ 6480, 17, 50, 20, 2, -49 }, // 0x5A 'Z'
{ 6587, 12, 52, 20, 5, -49 }, // 0x5B '['
{ 6665, 18, 50, 23, 2, -49 }, // 0x5C '\'
{ 6778, 12, 52, 20, 3, -49 }, // 0x5D ']'
{ 6856, 22, 26, 28, 3, -49 }, // 0x5E '^'
{ 6928, 19, 5, 21, 1, 2 }, // 0x5F '_'
{ 6940, 10, 11, 12, 1, -57 }, // 0x60 '`'
{ 6954, 20, 44, 27, 3, -43 }, // 0x61 'a'
{ 7064, 20, 51, 28, 4, -50 }, // 0x62 'b'
{ 7192, 20, 45, 26, 3, -43 }, // 0x63 'c'
{ 7305, 21, 51, 28, 3, -50 }, // 0x64 'd'
{ 7439, 20, 45, 26, 3, -43 }, // 0x65 'e'
{ 7552, 15, 51, 19, 2, -50 }, // 0x66 'f'
{ 7648, 21, 51, 27, 3, -43 }, // 0x67 'g'
{ 7782, 21, 51, 28, 4, -50 }, // 0x68 'h'
{ 7916, 7, 53, 15, 4, -52 }, // 0x69 'i'
{ 7963, 9, 59, 15, 2, -52 }, // 0x6A 'j'
{ 8030, 22, 51, 26, 4, -50 }, // 0x6B 'k'
{ 8171, 7, 51, 15, 4, -50 }, // 0x6C 'l'
{ 8216, 34, 44, 42, 4, -43 }, // 0x6D 'm'
{ 8403, 21, 44, 28, 4, -43 }, // 0x6E 'n'
{ 8519, 21, 45, 27, 3, -43 }, // 0x6F 'o'
{ 8638, 20, 51, 28, 4, -42 }, // 0x70 'p'
{ 8766, 21, 51, 28, 3, -42 }, // 0x71 'q'
{ 8900, 14, 44, 19, 4, -43 }, // 0x72 'r'
{ 8977, 20, 45, 24, 2, -43 }, // 0x73 's'
{ 9090, 15, 50, 18, 1, -49 }, // 0x74 't'
{ 9184, 20, 44, 28, 4, -42 }, // 0x75 'u'
{ 9294, 21, 43, 23, 1, -42 }, // 0x76 'v'
{ 9407, 32, 43, 35, 1, -42 }, // 0x77 'w'
{ 9579, 21, 43, 23, 1, -42 }, // 0x78 'x'
{ 9692, 21, 50, 23, 1, -42 }, // 0x79 'y'
{ 9824, 16, 43, 20, 2, -42 }, // 0x7A 'z'
{ 9910, 15, 56, 21, 3, -50 }, // 0x7B '{'
{ 10015, 6, 56, 15, 5, -52 }, // 0x7C '|'
{ 10057, 14, 56, 21, 3, -50 }, // 0x7D '}'
{ 10155, 26, 10, 32, 3, -33 } }; // 0x7E '~'
const GFXfont Antonio_SemiBold30pt7b PROGMEM = {
(uint8_t *)Antonio_SemiBold30pt7bBitmaps,
(GFXglyph *)Antonio_SemiBold30pt7bGlyphs,
0x20, 0x7E, 76 };
// Approx. 10860 bytes

File diff suppressed because it is too large Load diff

11
src/fonts/fonts.hpp Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "antonio-semibold20.h"
#include "antonio-semibold30.h"
#include "antonio-semibold90.h"
#include "oswald-20.h"
#include "oswald-30.h"
#include "oswald-90.h"
#include "ubuntu-italic40.h"
#include "ubuntu-italic60.h"
#include "ubuntu-italic70.h"

488
src/fonts/oswald-20.h Normal file
View file

@ -0,0 +1,488 @@
const uint8_t Oswald_Regular20pt7bBitmaps[] PROGMEM = {
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66,
0x66, 0x60, 0x00, 0xFF, 0xFF, 0xF7, 0xF3, 0xF9, 0xFC, 0xFE, 0x77, 0x3B,
0x9D, 0x8E, 0xC7, 0x63, 0x80, 0x07, 0x87, 0x83, 0xC7, 0xC1, 0xE3, 0xC1,
0xF1, 0xE0, 0xF0, 0xF0, 0x78, 0x78, 0x3C, 0x3C, 0x1E, 0x1E, 0x0F, 0x1F,
0x07, 0x8F, 0x07, 0xC7, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78,
0x78, 0x3C, 0x7C, 0x1E, 0x3C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF9, 0xE3, 0xE0, 0xF1, 0xF0, 0x78, 0xF0, 0x7C, 0x78, 0x3C, 0x3C,
0x1E, 0x1E, 0x0F, 0x0F, 0x07, 0x8F, 0x83, 0xC7, 0xC1, 0xE3, 0xC1, 0xF1,
0xE0, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0F, 0xE0, 0x3F, 0xF0, 0x7F,
0xF8, 0xFE, 0xFC, 0xF0, 0x3C, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0,
0x1C, 0xF0, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F,
0x80, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x00, 0xFC, 0x00,
0x7E, 0x00, 0x3E, 0x20, 0x1E, 0xF0, 0x1E, 0xF0, 0x1F, 0xF0, 0x1F, 0xF0,
0x1E, 0xF8, 0x1E, 0x7C, 0x3E, 0x3F, 0xFC, 0x3F, 0xF8, 0x0F, 0xF0, 0x00,
0x80, 0x00, 0x80, 0x00, 0x80, 0x0F, 0x80, 0x1E, 0x00, 0x3F, 0xE0, 0x1C,
0x00, 0x7F, 0xF0, 0x3C, 0x00, 0x78, 0xF0, 0x3C, 0x00, 0x78, 0x70, 0x38,
0x00, 0xF0, 0x78, 0x38, 0x00, 0xF0, 0x78, 0x78, 0x00, 0xF0, 0x78, 0x78,
0x00, 0xF0, 0x78, 0x70, 0x00, 0xF0, 0x78, 0x70, 0x00, 0xF0, 0x78, 0xF0,
0x00, 0x70, 0x78, 0xF0, 0x00, 0x78, 0x70, 0xE0, 0x00, 0x78, 0xF1, 0xE0,
0x00, 0x7F, 0xF1, 0xE0, 0x00, 0x3F, 0xE1, 0xC0, 0xF8, 0x1F, 0xC1, 0xC3,
0xFE, 0x00, 0x03, 0xC7, 0xFE, 0x00, 0x03, 0xC7, 0x9F, 0x00, 0x03, 0x87,
0x0F, 0x00, 0x07, 0x8F, 0x07, 0x00, 0x07, 0x8F, 0x07, 0x00, 0x07, 0x8F,
0x07, 0x00, 0x07, 0x0F, 0x07, 0x00, 0x0F, 0x0F, 0x07, 0x00, 0x0F, 0x0F,
0x07, 0x00, 0x0E, 0x0F, 0x07, 0x00, 0x0E, 0x0F, 0x0F, 0x00, 0x1E, 0x07,
0x8F, 0x00, 0x1E, 0x07, 0xFF, 0x00, 0x1C, 0x03, 0xFE, 0x00, 0x3C, 0x01,
0xFC, 0x07, 0xE0, 0x00, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xF7, 0xC0, 0x3C,
0x3E, 0x03, 0xC1, 0xE0, 0x7C, 0x1E, 0x07, 0xC1, 0xE0, 0x3C, 0x3E, 0x03,
0xC3, 0xC0, 0x3C, 0x3C, 0x01, 0xE7, 0x80, 0x1E, 0x70, 0x00, 0xEF, 0x00,
0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xFC, 0x1F, 0x1F, 0xC1,
0xE3, 0xDE, 0x1E, 0x7D, 0xF1, 0xE7, 0x8F, 0x1E, 0x78, 0x7B, 0xCF, 0x87,
0xFC, 0xF8, 0x3F, 0xCF, 0x01, 0xF8, 0xF8, 0x1F, 0x87, 0x83, 0xFC, 0x7C,
0x7F, 0xF7, 0xFF, 0xFF, 0x3F, 0xF9, 0xF0, 0xFE, 0x0F, 0xFE, 0xEE, 0xEE,
0xEC, 0xCC, 0x07, 0x1F, 0x1F, 0x3C, 0x78, 0x78, 0x78, 0x70, 0xF0, 0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x78, 0x78,
0x78, 0x38, 0x3E, 0x1F, 0x0F, 0x01, 0xE0, 0xF0, 0xF8, 0x3C, 0x3C, 0x1E,
0x1E, 0x1E, 0x1E, 0x1E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0E,
0x1E, 0x1E, 0x1E, 0x1E, 0x1C, 0x3C, 0x7C, 0xF8, 0xF0, 0x80, 0x07, 0x00,
0x38, 0x01, 0xC1, 0x0E, 0x2E, 0x73, 0x7F, 0x7D, 0xFF, 0xC1, 0xF0, 0x0F,
0x80, 0xEC, 0x0E, 0x70, 0x71, 0xC7, 0x0E, 0x08, 0x40, 0x07, 0x80, 0x1E,
0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFC, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01,
0xE0, 0xFF, 0xFF, 0xF3, 0x36, 0xEC, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
0xF0, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0E, 0x00, 0xE0, 0x1E, 0x01, 0xE0,
0x1C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x38, 0x07, 0x80, 0x78, 0x07, 0x00,
0x70, 0x0F, 0x00, 0xF0, 0x0E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x1C, 0x03,
0xC0, 0x3C, 0x03, 0xC0, 0x38, 0x07, 0x80, 0x78, 0x07, 0x00, 0x70, 0x0F,
0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x3F, 0x7E, 0x7C, 0x1E, 0x78,
0x1E, 0xF8, 0x1F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8,
0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8,
0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8,
0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0x78, 0x1F, 0x78, 0x1E, 0x7E, 0x3E, 0x3F,
0xFC, 0x1F, 0xF8, 0x0F, 0xF0, 0x01, 0xC1, 0xF0, 0xFD, 0xFF, 0xFF, 0xFF,
0xFC, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x07, 0xE0, 0x3F,
0xF0, 0xFF, 0xF3, 0xFF, 0xE7, 0x83, 0xFF, 0x03, 0xFC, 0x07, 0xF8, 0x0F,
0xF0, 0x1F, 0xE0, 0x3C, 0x00, 0x78, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0x80,
0x1F, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1E, 0x00, 0x7C,
0x01, 0xF0, 0x03, 0xC0, 0x0F, 0x80, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x03,
0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xE0, 0x7F,
0xE1, 0xFF, 0xF3, 0xF7, 0xEF, 0x83, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F,
0xF0, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xF0, 0x07, 0xC0, 0x7F, 0x00,
0xFC, 0x01, 0xF8, 0x03, 0xF8, 0x01, 0xF8, 0x00, 0xF0, 0x01, 0xF0, 0x01,
0xE0, 0x03, 0xC0, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F,
0xC1, 0xFF, 0xC7, 0xCF, 0xFF, 0x8F, 0xFE, 0x0F, 0xF0, 0x00, 0xF8, 0x01,
0xF8, 0x01, 0xF8, 0x03, 0xF8, 0x03, 0xF8, 0x03, 0xF8, 0x07, 0x78, 0x07,
0x78, 0x0F, 0x78, 0x0E, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x78, 0x3C,
0x78, 0x3C, 0x78, 0x78, 0x78, 0x78, 0x78, 0xF0, 0x78, 0xF0, 0x78, 0xF0,
0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x78, 0x00,
0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00,
0x78, 0x7F, 0xFC, 0xFF, 0xF9, 0xFF, 0xF3, 0xFF, 0xE7, 0x00, 0x0E, 0x00,
0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x84, 0x07,
0x7F, 0x0F, 0xFF, 0x1F, 0xFF, 0x3C, 0x1F, 0x78, 0x1E, 0x00, 0x3C, 0x00,
0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xF8, 0x0F, 0xF0, 0x1F,
0xE0, 0x3F, 0xC0, 0x7F, 0xC1, 0xF7, 0xC7, 0xCF, 0xFF, 0x8F, 0xFE, 0x0F,
0xF0, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x3F, 0xFE, 0x7C, 0x1E, 0x78,
0x1F, 0x78, 0x1F, 0x78, 0x0F, 0xF8, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0,
0x00, 0xF0, 0x00, 0xF3, 0xF0, 0xF7, 0xFC, 0xFF, 0xFE, 0xFC, 0x3E, 0xF8,
0x1E, 0xF0, 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF8, 0x0F, 0x78, 0x1F, 0x78, 0x1E, 0x78, 0x1E, 0x3E, 0x3E, 0x3F,
0xFC, 0x1F, 0xF8, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03,
0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x01, 0xE0,
0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03,
0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x07, 0xE0, 0x1F,
0xF8, 0x3F, 0xFC, 0x7E, 0x7C, 0x78, 0x3E, 0x78, 0x1E, 0xF8, 0x1E, 0xF0,
0x1E, 0xF0, 0x1E, 0xF8, 0x1E, 0x78, 0x1E, 0x78, 0x3E, 0x7C, 0x3C, 0x3F,
0xFC, 0x1F, 0xF8, 0x0F, 0xF0, 0x3F, 0xF8, 0x7E, 0x7C, 0x78, 0x3E, 0xF8,
0x1E, 0xF0, 0x1E, 0xF0, 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xF0,
0x1E, 0xF0, 0x1E, 0x78, 0x1E, 0x7C, 0x3E, 0x7F, 0xFC, 0x3F, 0xF8, 0x0F,
0xF0, 0x07, 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xF7, 0xE7, 0x83, 0xDF, 0x03,
0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF,
0x01, 0xFE, 0x03, 0xFE, 0x07, 0xFC, 0x1F, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F,
0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0xF0, 0x1F,
0xE0, 0x3F, 0xC0, 0x7F, 0xC1, 0xE7, 0xC7, 0xCF, 0xFF, 0x0F, 0xFE, 0x07,
0xF0, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF8,
0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFE,
0x33, 0x9B, 0xC8, 0x00, 0x20, 0x04, 0x01, 0x80, 0xF0, 0x3E, 0x1F, 0x87,
0xE1, 0xF8, 0xFC, 0x1F, 0x03, 0x80, 0x7C, 0x0F, 0xC0, 0xFC, 0x07, 0xE0,
0x7E, 0x03, 0xE0, 0x3C, 0x03, 0x80, 0x10, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
0x0C, 0x00, 0xE0, 0x0F, 0x80, 0xFC, 0x07, 0xE0, 0x1F, 0x80, 0xFC, 0x03,
0xF0, 0x1F, 0x00, 0xF0, 0x1F, 0x03, 0xF0, 0xFC, 0x1F, 0x87, 0xE0, 0xFC,
0x0F, 0x80, 0xE0, 0x0C, 0x00, 0x80, 0x00, 0x0F, 0xE0, 0x3F, 0xF0, 0xFF,
0xF3, 0xFF, 0xEF, 0x83, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F,
0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x1F, 0x00,
0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0,
0x03, 0xC0, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00,
0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xE0, 0x03,
0xF8, 0x01, 0xF0, 0x07, 0xE0, 0x00, 0xF8, 0x0F, 0xC0, 0x00, 0x7C, 0x0F,
0x00, 0x00, 0x3C, 0x1F, 0x00, 0x60, 0x1C, 0x1E, 0x03, 0xFF, 0x1E, 0x3C,
0x07, 0xFF, 0x0E, 0x3C, 0x0F, 0xFF, 0x0E, 0x78, 0x1F, 0x0F, 0x0F, 0x78,
0x1E, 0x0E, 0x07, 0x78, 0x3E, 0x1E, 0x07, 0x78, 0x3C, 0x1E, 0x07, 0x70,
0x3C, 0x1E, 0x07, 0xF0, 0x78, 0x1E, 0x07, 0xF0, 0x78, 0x1E, 0x0E, 0xF0,
0x78, 0x1C, 0x0E, 0xF0, 0x78, 0x1C, 0x0E, 0xF0, 0x78, 0x3C, 0x0E, 0xF0,
0x78, 0x3C, 0x1C, 0xF0, 0x78, 0x7C, 0x1C, 0x70, 0x7C, 0xFC, 0x38, 0x78,
0x3F, 0xDC, 0xF0, 0x78, 0x1F, 0xDF, 0xE0, 0x78, 0x0F, 0x8F, 0x80, 0x3C,
0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1F,
0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x07, 0xF8, 0x03, 0x00, 0x03,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x03,
0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x01, 0xFC,
0x00, 0x7F, 0x00, 0x1D, 0xC0, 0x07, 0x78, 0x01, 0xDE, 0x00, 0xF7, 0x80,
0x3C, 0xE0, 0x0F, 0x38, 0x03, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF0, 0x1E,
0x3C, 0x07, 0x87, 0x01, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0xFF,
0x83, 0xFF, 0xF0, 0xFF, 0xFC, 0x78, 0x0F, 0x1E, 0x03, 0xC7, 0x80, 0xF1,
0xE0, 0x1E, 0xF8, 0x07, 0xBC, 0x01, 0xEF, 0x00, 0x7B, 0xC0, 0x1F, 0xFF,
0xE0, 0x7F, 0xFC, 0x3F, 0xFF, 0x1F, 0xFF, 0xCF, 0x81, 0xF7, 0xC0, 0x7B,
0xE0, 0x3D, 0xF0, 0x1E, 0xF8, 0x0F, 0x7C, 0x07, 0xBE, 0x03, 0xDF, 0x01,
0xEF, 0x81, 0xE7, 0xC7, 0xF3, 0xFF, 0xE1, 0xFF, 0xF0, 0xFF, 0xFE, 0x7C,
0x1F, 0xBE, 0x03, 0xDF, 0x01, 0xFF, 0x80, 0x7F, 0xC0, 0x3F, 0xE0, 0x1F,
0xF0, 0x0F, 0xF8, 0x07, 0xFC, 0x03, 0xFE, 0x03, 0xFF, 0x01, 0xEF, 0x83,
0xF7, 0xFF, 0xF3, 0xFF, 0xF1, 0xFF, 0xE0, 0x07, 0xF0, 0x1F, 0xFC, 0x3F,
0xFE, 0x7F, 0x7E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xF0,
0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0xF8,
0x0F, 0x78, 0x1F, 0x7E, 0x3E, 0x3F, 0xFE, 0x1F, 0xFC, 0x0F, 0xF8, 0xFF,
0xC0, 0x7F, 0xFC, 0x3F, 0xFF, 0x9F, 0xFF, 0xCF, 0x81, 0xF7, 0xC0, 0x7B,
0xE0, 0x3D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01,
0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC,
0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F,
0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xBE, 0x03, 0xDF, 0x03, 0xEF, 0x83,
0xE7, 0xFF, 0xF3, 0xFF, 0xF1, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E,
0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xFF, 0x9F, 0xFC, 0xFF, 0xE7, 0xC0,
0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07,
0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00,
0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xFF, 0x9F,
0xFC, 0xFF, 0xE7, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0,
0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03,
0xE0, 0x1F, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0xEF, 0xE7,
0x81, 0xF7, 0xC0, 0x7B, 0xE0, 0x3D, 0xE0, 0x1F, 0xF0, 0x0F, 0xF8, 0x07,
0xFC, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0,
0x00, 0xF0, 0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE, 0x00, 0xFF, 0x00, 0x7F,
0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xFC, 0x03, 0xFE, 0x03,
0xEF, 0x01, 0xF7, 0xE3, 0xF9, 0xFF, 0xDC, 0x7F, 0xCE, 0x1F, 0xC7, 0xF8,
0x07, 0xFC, 0x03, 0xFE, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x7F, 0xC0, 0x3F,
0xE0, 0x1F, 0xF0, 0x0F, 0xF8, 0x07, 0xFC, 0x03, 0xFE, 0x01, 0xFF, 0x00,
0xFF, 0x80, 0x7F, 0xC0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
0x03, 0xFE, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x7F, 0xC0, 0x3F, 0xE0, 0x1F,
0xF0, 0x0F, 0xF8, 0x07, 0xFC, 0x03, 0xFE, 0x01, 0xFF, 0x00, 0xFF, 0x80,
0x7F, 0xC0, 0x3F, 0xE0, 0x1F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0,
0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C,
0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0xFB, 0xFF, 0xFD, 0xFC, 0xF8,
0x00, 0xF8, 0x0F, 0x7C, 0x07, 0xBE, 0x07, 0x9F, 0x03, 0xCF, 0x83, 0xC7,
0xC1, 0xE3, 0xE1, 0xF1, 0xF0, 0xF0, 0xF8, 0xF8, 0x7C, 0x78, 0x3E, 0x7C,
0x1F, 0x3C, 0x0F, 0xBE, 0x07, 0xDE, 0x03, 0xFF, 0x01, 0xFF, 0xC0, 0xFF,
0xE0, 0x7F, 0xF0, 0x3F, 0x7C, 0x1F, 0x9E, 0x0F, 0x8F, 0x87, 0xC3, 0xC3,
0xE1, 0xE1, 0xF0, 0x78, 0xF8, 0x3C, 0x7C, 0x1F, 0x3E, 0x07, 0x9F, 0x03,
0xCF, 0x80, 0xF7, 0xC0, 0x7B, 0xE0, 0x3F, 0xF0, 0x0F, 0xF8, 0x07, 0xC0,
0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07,
0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8,
0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00,
0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7F, 0xFF, 0xFF, 0xFF,
0xFF, 0x78, 0x00, 0xFB, 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x01, 0xF7,
0xC0, 0x0F, 0xBE, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0xC0, 0x3F, 0x7E, 0x01,
0xFB, 0xF0, 0x0D, 0xDD, 0xC0, 0xEE, 0xEE, 0x07, 0x77, 0x70, 0x3B, 0xBB,
0x81, 0xDD, 0xCC, 0x1C, 0xEE, 0x70, 0xE7, 0x73, 0x87, 0x3B, 0x9C, 0x39,
0xDC, 0x61, 0x8E, 0xE3, 0x9C, 0x77, 0x1C, 0xE3, 0xB8, 0xE7, 0x1D, 0xC7,
0x30, 0xEE, 0x1B, 0x87, 0x70, 0xFC, 0x3B, 0x87, 0xE1, 0xFC, 0x3E, 0x0F,
0xE0, 0xF0, 0x7F, 0x07, 0x83, 0xF8, 0x3C, 0x1F, 0xC1, 0xE0, 0xFE, 0x06,
0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xFC,
0x0F, 0xFC, 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFF, 0x0F, 0xF7,
0x0F, 0xF7, 0x8F, 0xF3, 0x8F, 0xF3, 0xCF, 0xF3, 0xCF, 0xF1, 0xCF, 0xF1,
0xEF, 0xF0, 0xEF, 0xF0, 0xFF, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0,
0x3F, 0xF0, 0x3F, 0xF0, 0x1F, 0xF0, 0x1F, 0xF0, 0x1F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x07, 0xF0, 0x07, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F,
0xEF, 0xE7, 0xC0, 0xF7, 0xC0, 0x7F, 0xE0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07,
0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0,
0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF,
0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xFC, 0x03,
0xFE, 0x03, 0xEF, 0x01, 0xE7, 0xE1, 0xF1, 0xFF, 0xF0, 0x7F, 0xF0, 0x1F,
0xF0, 0xFF, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xF9, 0xFE, 0xF8, 0x1E, 0xF8,
0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8,
0x0F, 0xF8, 0x1F, 0xF8, 0x3E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF0, 0xF8,
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
0x00, 0xF8, 0x00, 0xF8, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F,
0xEF, 0xE7, 0xC0, 0xF7, 0xC0, 0x7F, 0xE0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07,
0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0,
0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF,
0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xFC, 0x03,
0xFE, 0x03, 0xEF, 0x01, 0xE7, 0xE1, 0xF1, 0xFF, 0xF0, 0x7F, 0xF0, 0x1F,
0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x60,
0x00, 0x10, 0xFF, 0xC0, 0x7F, 0xFC, 0x3F, 0xFF, 0x1F, 0x3F, 0xCF, 0x81,
0xE7, 0xC0, 0xFB, 0xE0, 0x3D, 0xF0, 0x1E, 0xF8, 0x0F, 0x7C, 0x07, 0xBE,
0x03, 0xDF, 0x03, 0xEF, 0x81, 0xF7, 0xC3, 0xF3, 0xFF, 0xF9, 0xFF, 0xF8,
0xFF, 0xF0, 0x7C, 0x7C, 0x3E, 0x1E, 0x1F, 0x0F, 0x0F, 0x87, 0xC7, 0xC1,
0xE3, 0xE0, 0xF1, 0xF0, 0x78, 0xF8, 0x3E, 0x7C, 0x0F, 0x3E, 0x07, 0x9F,
0x03, 0xCF, 0x80, 0xF7, 0xC0, 0x7B, 0xE0, 0x3D, 0xF0, 0x1F, 0x0F, 0xC0,
0x3F, 0xF0, 0x7F, 0xF8, 0xFC, 0xFC, 0xF0, 0x3C, 0xF0, 0x3E, 0xF0, 0x1E,
0xF0, 0x1E, 0xF0, 0x1C, 0xF0, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00,
0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xF8,
0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3E, 0x20, 0x1E, 0xF0, 0x1E, 0xF0, 0x1F,
0xF0, 0x1F, 0xF0, 0x1E, 0xF8, 0x1E, 0x7C, 0x3E, 0x3F, 0xFC, 0x3F, 0xF8,
0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x78, 0x00,
0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C,
0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00,
0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07,
0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0,
0x03, 0xC0, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00,
0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC,
0x01, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F,
0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80,
0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF8, 0x07, 0xFC, 0x03, 0xDE, 0x03, 0xEF,
0x81, 0xE7, 0xE1, 0xF1, 0xFF, 0xF0, 0x7F, 0xF8, 0x1F, 0xF0, 0xF0, 0x03,
0xFC, 0x00, 0xFF, 0x80, 0x79, 0xE0, 0x1E, 0x78, 0x07, 0x9E, 0x01, 0xE7,
0x80, 0x78, 0xF0, 0x3C, 0x3C, 0x0F, 0x0F, 0x03, 0xC3, 0xC0, 0xF0, 0xF0,
0x38, 0x1E, 0x1E, 0x07, 0x87, 0x81, 0xE1, 0xE0, 0x78, 0x78, 0x0F, 0x1C,
0x03, 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x38, 0x01, 0xFE, 0x00,
0x7F, 0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0x80, 0xF0, 0x0E,
0x03, 0xDC, 0x03, 0x80, 0xF7, 0x01, 0xE0, 0x3D, 0xE0, 0x78, 0x0F, 0x78,
0x1F, 0x03, 0x9E, 0x07, 0xC0, 0xE7, 0x81, 0xF0, 0x38, 0xE0, 0xFC, 0x1E,
0x38, 0x3F, 0x07, 0x8E, 0x0E, 0xE1, 0xE3, 0xC3, 0xB8, 0x78, 0xF0, 0xEE,
0x1C, 0x3C, 0x7B, 0x87, 0x07, 0x1C, 0xE1, 0xC1, 0xC7, 0x1C, 0xF0, 0x71,
0xC7, 0x3C, 0x1E, 0x71, 0xCF, 0x07, 0x9C, 0x73, 0x81, 0xEF, 0x1C, 0xE0,
0x3B, 0x87, 0xB8, 0x0E, 0xE0, 0xEE, 0x03, 0xB8, 0x3F, 0x80, 0xEE, 0x0F,
0xE0, 0x3F, 0x83, 0xF0, 0x0F, 0xC0, 0xFC, 0x01, 0xF0, 0x1F, 0x00, 0x7C,
0x07, 0xC0, 0x1F, 0x01, 0xF0, 0x07, 0xC0, 0x7C, 0x01, 0xE0, 0x1E, 0x00,
0x78, 0x03, 0x80, 0x1E, 0x00, 0xE0, 0xF0, 0x07, 0xF8, 0x07, 0xDE, 0x03,
0xCF, 0x01, 0xE7, 0xC1, 0xE1, 0xE0, 0xF0, 0xF0, 0xF0, 0x3C, 0x78, 0x1E,
0x3C, 0x07, 0xBC, 0x03, 0xDE, 0x01, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x00,
0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xF0, 0x01, 0xFC, 0x01, 0xFE,
0x00, 0xFF, 0x00, 0x7B, 0xC0, 0x79, 0xE0, 0x3C, 0x78, 0x3C, 0x3C, 0x1E,
0x1F, 0x0F, 0x07, 0x8F, 0x03, 0xC7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1F,
0xE0, 0x0F, 0xF8, 0x03, 0xDE, 0x00, 0xF7, 0x80, 0x3C, 0xF0, 0x1E, 0x3C,
0x07, 0x8F, 0x01, 0xE1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x03, 0xC7,
0x80, 0xF1, 0xE0, 0x3C, 0x78, 0x07, 0x3C, 0x01, 0xEF, 0x00, 0x7B, 0xC0,
0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01,
0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C,
0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00,
0x07, 0xC0, 0x7F, 0xFE, 0xFF, 0xFD, 0xFF, 0xF0, 0x01, 0xE0, 0x07, 0xC0,
0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F,
0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x0F, 0x00,
0x3E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x3C,
0x00, 0x78, 0x01, 0xF0, 0x03, 0xC0, 0x07, 0x80, 0x1F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8,
0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F,
0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3,
0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xFF, 0xFE, 0xF0, 0x0F,
0x00, 0x70, 0x07, 0x80, 0x78, 0x03, 0x80, 0x38, 0x03, 0xC0, 0x3C, 0x01,
0xC0, 0x1C, 0x01, 0xE0, 0x1E, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
0x70, 0x07, 0x80, 0x78, 0x03, 0x80, 0x38, 0x03, 0xC0, 0x3C, 0x01, 0xC0,
0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x07, 0xFF, 0xFF,
0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0,
0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E,
0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87,
0xC3, 0xE1, 0xF0, 0xFF, 0xFF, 0xFE, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80,
0x7F, 0x00, 0xEF, 0x03, 0xDE, 0x07, 0x9C, 0x0E, 0x3C, 0x3C, 0x78, 0x78,
0x79, 0xE0, 0xF3, 0xC0, 0xEF, 0x01, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0xF0, 0xF1, 0xE1, 0xC1, 0xC3, 0x83, 0x06, 0x0F, 0x81, 0xFF, 0x1F, 0xFD,
0xF3, 0xEF, 0x0F, 0x78, 0x7F, 0xC1, 0xE2, 0x0F, 0x00, 0x78, 0x0F, 0xC1,
0xFE, 0x3E, 0xF3, 0xE7, 0xBC, 0x3F, 0xE1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83,
0xFC, 0x3F, 0xF3, 0xFF, 0xF7, 0xBF, 0xBC, 0xF9, 0xE0, 0xF0, 0x03, 0xC0,
0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0,
0x03, 0xCF, 0x8F, 0x7F, 0x3F, 0xFE, 0xFC, 0xFB, 0xC1, 0xEF, 0x07, 0xFC,
0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF,
0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x07, 0xFC, 0x1E, 0xF8, 0x7B,
0xFF, 0xEF, 0x7F, 0x3C, 0xF8, 0x1F, 0x81, 0xFF, 0x1F, 0xFD, 0xF1, 0xEF,
0x0F, 0x78, 0x3B, 0xC1, 0xDE, 0x0F, 0xF0, 0x7F, 0x80, 0x3C, 0x01, 0xE0,
0x0F, 0x00, 0x78, 0x03, 0xC1, 0xFE, 0x0F, 0xF0, 0x77, 0x83, 0xBC, 0x3D,
0xF1, 0xE7, 0xFF, 0x3F, 0xF0, 0xFF, 0x00, 0x00, 0x78, 0x03, 0xC0, 0x1E,
0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0xF3, 0xCF,
0xFE, 0xFF, 0xFF, 0xDF, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83,
0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x8F, 0xBF, 0xFD, 0xFF, 0xE7, 0xEF, 0x1F,
0x81, 0xFF, 0x1F, 0xFD, 0xF1, 0xEF, 0x0F, 0x78, 0x3F, 0xC1, 0xFE, 0x0F,
0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1E,
0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x3F, 0xF1, 0xE7, 0xFF, 0x3F, 0xF0, 0x7F,
0x00, 0x01, 0x83, 0xF1, 0xFC, 0x7F, 0x1E, 0x0F, 0x83, 0xE0, 0xF8, 0xFF,
0xFF, 0xFF, 0xFC, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83,
0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8,
0x3E, 0x0F, 0x83, 0xE0, 0x07, 0xC3, 0x0F, 0xF3, 0x8F, 0xFF, 0xEF, 0x0F,
0x87, 0x87, 0x83, 0xC1, 0xC1, 0xC0, 0xE0, 0xE0, 0x70, 0x70, 0x38, 0x38,
0x1C, 0x1E, 0x0E, 0x0F, 0x0F, 0x07, 0x87, 0x81, 0xFF, 0x80, 0x7F, 0x80,
0x3F, 0x80, 0x38, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x0F, 0xFE, 0x07, 0xFF,
0xC0, 0xFF, 0xE1, 0xC0, 0xF9, 0xE0, 0x3C, 0xE0, 0x0E, 0x78, 0x0F, 0x3E,
0x0F, 0x9F, 0xFF, 0x87, 0xFF, 0x80, 0xFF, 0x00, 0xF0, 0x07, 0x80, 0x3C,
0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x87,
0xBC, 0xFF, 0xEF, 0xFF, 0xEF, 0xFC, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0,
0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F,
0xFF, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x0F, 0x0F, 0x0F, 0x00,
0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x1F, 0xBF, 0xFE, 0xFC, 0x70, 0xF0, 0x01, 0xE0, 0x03, 0xC0,
0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01,
0xE0, 0x7F, 0xC0, 0xF7, 0x83, 0xEF, 0x07, 0x9E, 0x1E, 0x3C, 0x7C, 0x78,
0xF0, 0xF3, 0xE1, 0xEF, 0x83, 0xDF, 0x07, 0xFE, 0x0F, 0xFC, 0x1F, 0xBC,
0x3E, 0x78, 0x78, 0xF8, 0xF0, 0xF1, 0xE1, 0xE3, 0xC1, 0xE7, 0x83, 0xCF,
0x07, 0x9E, 0x07, 0xBC, 0x0F, 0x78, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF1, 0xE0, 0xF9, 0xEF, 0xE7, 0xFB, 0xFF, 0xFF, 0xF7,
0xC3, 0xF1, 0xEF, 0x07, 0x81, 0xFE, 0x0F, 0x03, 0xFC, 0x1E, 0x07, 0xF8,
0x3C, 0x0F, 0xF0, 0x78, 0x1F, 0xE0, 0xF0, 0x3F, 0xC1, 0xE0, 0x7F, 0x83,
0xC0, 0xFF, 0x07, 0x81, 0xFE, 0x0F, 0x03, 0xFC, 0x1E, 0x07, 0xF8, 0x3C,
0x0F, 0xF0, 0x78, 0x1F, 0xE0, 0xF0, 0x3F, 0xC1, 0xE0, 0x7F, 0x83, 0xC0,
0xFF, 0x07, 0x81, 0xFE, 0x0F, 0x03, 0xFC, 0x1E, 0x07, 0x80, 0xF1, 0xF7,
0x9F, 0xFF, 0xFF, 0xFD, 0xFF, 0x87, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0,
0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F,
0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xE0,
0x1F, 0x81, 0xFF, 0x1F, 0xFD, 0xF1, 0xEF, 0x0F, 0x78, 0x3F, 0xC1, 0xFE,
0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1,
0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x3F, 0xF1, 0xE7, 0xFF, 0x3F, 0xF0,
0x7F, 0x00, 0xF1, 0xE3, 0xDF, 0xCF, 0xFF, 0xBF, 0x3E, 0xF0, 0x7B, 0xC1,
0xFF, 0x07, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0,
0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x7F, 0xC1, 0xFF, 0x07, 0xBE,
0x1E, 0xFF, 0xFB, 0xFF, 0xCF, 0x3E, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F,
0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x00, 0x1E, 0x79, 0xFF, 0xDF, 0xFE,
0xFB, 0xFF, 0x87, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC,
0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83,
0xFC, 0x1F, 0xF1, 0xF7, 0xFF, 0xBF, 0xFC, 0xFD, 0xE0, 0x0F, 0x00, 0x78,
0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0xF0, 0xFC, 0xFF, 0x7F,
0xFF, 0xFE, 0x7E, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0,
0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
0x00, 0x0F, 0x81, 0xFE, 0x1F, 0xF8, 0xF1, 0xE7, 0x07, 0x38, 0x39, 0xC1,
0x8F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x80, 0x7E, 0x01, 0xF0,
0x07, 0xC0, 0x1E, 0x30, 0x7F, 0x83, 0xFC, 0x1E, 0xF1, 0xE7, 0xFF, 0x1F,
0xF0, 0x7F, 0x00, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x0F, 0xFF,
0xFF, 0xFF, 0xCF, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x81,
0xFC, 0x7F, 0x0F, 0xC0, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07,
0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF,
0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xF1,
0xFF, 0xFF, 0xFF, 0xBD, 0xF9, 0xE0, 0xF0, 0x7F, 0xC1, 0xEF, 0x07, 0xBC,
0x1E, 0xF0, 0x79, 0xE1, 0xE7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC3,
0x8F, 0x0F, 0x38, 0x3C, 0xE0, 0xF7, 0x83, 0xDE, 0x07, 0x78, 0x1D, 0xC0,
0x77, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xC0, 0x3E, 0x00, 0xF8, 0x00, 0xF0,
0x70, 0x7F, 0x83, 0x83, 0xFC, 0x3E, 0x1E, 0xE1, 0xF0, 0xE7, 0x0F, 0x87,
0x38, 0x7C, 0x39, 0xC3, 0xE1, 0xCF, 0x1B, 0x1E, 0x79, 0xDC, 0xF1, 0xCE,
0xE7, 0x0E, 0x77, 0x38, 0x73, 0xB9, 0xC3, 0x9C, 0xCE, 0x1C, 0xC7, 0x70,
0xFE, 0x3F, 0x83, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x07, 0xC1,
0xF0, 0x3E, 0x0F, 0x81, 0xF0, 0x7C, 0x0F, 0x83, 0xC0, 0x3C, 0x0E, 0x00,
0xF8, 0x1E, 0xF0, 0x79, 0xE0, 0xF1, 0xE3, 0xC3, 0xC7, 0x83, 0xCE, 0x07,
0xBC, 0x07, 0xF8, 0x0F, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0x7C,
0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x1E, 0xF0, 0x3D, 0xE0, 0xF1, 0xE1,
0xE3, 0xC7, 0x83, 0xCF, 0x07, 0xBE, 0x07, 0x80, 0xF8, 0x1E, 0xF0, 0x7D,
0xE0, 0xF3, 0xC1, 0xE7, 0x83, 0xC7, 0x87, 0x8F, 0x0F, 0x1E, 0x3C, 0x3C,
0x78, 0x38, 0xF0, 0x79, 0xE0, 0xF3, 0x81, 0xE7, 0x01, 0xDE, 0x03, 0xBC,
0x07, 0x78, 0x0F, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7C, 0x00,
0xF8, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xF0,
0x03, 0x00, 0x00, 0x7F, 0xF7, 0xFF, 0x7F, 0xF7, 0xFE, 0x01, 0xE0, 0x3E,
0x03, 0xC0, 0x3C, 0x07, 0x80, 0x78, 0x0F, 0x80, 0xF0, 0x1F, 0x01, 0xE0,
0x1E, 0x03, 0xC0, 0x3C, 0x07, 0xC0, 0x78, 0x07, 0x80, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0x0F, 0x8F, 0xCF, 0xE7, 0xC3, 0xC1, 0xE0, 0xF0, 0x78, 0x3C,
0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x3E, 0x3E, 0x1E,
0x0F, 0x83, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0,
0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xF9, 0xFC, 0x7E, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7E, 0x3F, 0x07, 0xC3, 0xE1, 0xF0,
0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x1E,
0x0F, 0x07, 0xE1, 0xF0, 0xF8, 0xF8, 0x78, 0x7C, 0x3E, 0x1F, 0x0F, 0x87,
0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xCF, 0xC7, 0xE3,
0xE0, 0x0C, 0x00, 0x7E, 0x09, 0xFF, 0xFF, 0xFF, 0xE6, 0x1F, 0x80, 0x0E,
0x00 };
const GFXglyph Oswald_Regular20pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
{ 1, 4, 32, 8, 2, -31 }, // 0x21 '!'
{ 17, 9, 10, 10, 1, -31 }, // 0x22 '"'
{ 29, 17, 32, 19, 1, -31 }, // 0x23 '#'
{ 97, 16, 38, 19, 2, -34 }, // 0x24 '$'
{ 173, 32, 32, 35, 1, -31 }, // 0x25 '%'
{ 301, 20, 32, 24, 2, -31 }, // 0x26 '&'
{ 381, 4, 10, 5, 1, -31 }, // 0x27 '''
{ 386, 8, 40, 12, 3, -31 }, // 0x28 '('
{ 426, 8, 40, 10, 1, -31 }, // 0x29 ')'
{ 466, 13, 14, 16, 2, -31 }, // 0x2A '*'
{ 489, 14, 16, 16, 1, -23 }, // 0x2B '+'
{ 517, 4, 10, 7, 2, -4 }, // 0x2C ','
{ 522, 9, 3, 13, 2, -12 }, // 0x2D '-'
{ 526, 4, 5, 7, 2, -4 }, // 0x2E '.'
{ 529, 12, 32, 14, 1, -31 }, // 0x2F '/'
{ 577, 16, 32, 20, 2, -31 }, // 0x30 '0'
{ 641, 10, 32, 16, 1, -31 }, // 0x31 '1'
{ 681, 15, 32, 19, 2, -31 }, // 0x32 '2'
{ 741, 15, 32, 19, 2, -31 }, // 0x33 '3'
{ 801, 16, 32, 19, 2, -31 }, // 0x34 '4'
{ 865, 15, 32, 19, 2, -31 }, // 0x35 '5'
{ 925, 16, 32, 20, 2, -31 }, // 0x36 '6'
{ 989, 13, 32, 15, 1, -31 }, // 0x37 '7'
{ 1041, 16, 32, 20, 2, -31 }, // 0x38 '8'
{ 1105, 15, 32, 20, 2, -31 }, // 0x39 '9'
{ 1165, 5, 17, 8, 2, -20 }, // 0x3A ':'
{ 1176, 5, 24, 8, 2, -21 }, // 0x3B ';'
{ 1191, 11, 21, 15, 1, -21 }, // 0x3C '<'
{ 1220, 12, 10, 16, 2, -20 }, // 0x3D '='
{ 1235, 12, 21, 15, 2, -21 }, // 0x3E '>'
{ 1267, 15, 32, 19, 2, -31 }, // 0x3F '?'
{ 1327, 32, 37, 35, 2, -31 }, // 0x40 '@'
{ 1475, 18, 32, 19, 1, -31 }, // 0x41 'A'
{ 1547, 17, 32, 21, 2, -31 }, // 0x42 'B'
{ 1615, 16, 32, 20, 2, -31 }, // 0x43 'C'
{ 1679, 17, 32, 21, 2, -31 }, // 0x44 'D'
{ 1747, 13, 32, 16, 2, -31 }, // 0x45 'E'
{ 1799, 13, 32, 15, 2, -31 }, // 0x46 'F'
{ 1851, 17, 32, 21, 2, -31 }, // 0x47 'G'
{ 1919, 17, 32, 22, 2, -31 }, // 0x48 'H'
{ 1987, 4, 32, 10, 3, -31 }, // 0x49 'I'
{ 2003, 9, 33, 12, 0, -31 }, // 0x4A 'J'
{ 2041, 17, 32, 19, 2, -31 }, // 0x4B 'K'
{ 2109, 13, 32, 16, 2, -31 }, // 0x4C 'L'
{ 2161, 21, 32, 26, 2, -31 }, // 0x4D 'M'
{ 2245, 16, 32, 21, 2, -31 }, // 0x4E 'N'
{ 2309, 17, 32, 21, 2, -31 }, // 0x4F 'O'
{ 2377, 16, 32, 19, 2, -31 }, // 0x50 'P'
{ 2441, 17, 38, 21, 2, -31 }, // 0x51 'Q'
{ 2522, 17, 32, 20, 2, -31 }, // 0x52 'R'
{ 2590, 16, 32, 19, 2, -31 }, // 0x53 'S'
{ 2654, 15, 32, 16, 1, -31 }, // 0x54 'T'
{ 2714, 17, 32, 21, 2, -31 }, // 0x55 'U'
{ 2782, 18, 32, 20, 1, -31 }, // 0x56 'V'
{ 2854, 26, 32, 29, 1, -31 }, // 0x57 'W'
{ 2958, 17, 32, 19, 1, -31 }, // 0x58 'X'
{ 3026, 18, 32, 19, 0, -31 }, // 0x59 'Y'
{ 3098, 15, 32, 16, 1, -31 }, // 0x5A 'Z'
{ 3158, 9, 39, 13, 2, -31 }, // 0x5B '['
{ 3202, 12, 32, 14, 1, -31 }, // 0x5C '\'
{ 3250, 9, 39, 12, 1, -31 }, // 0x5D ']'
{ 3294, 15, 13, 17, 1, -31 }, // 0x5E '^'
{ 3319, 13, 3, 13, 0, 3 }, // 0x5F '_'
{ 3324, 7, 8, 11, 2, -31 }, // 0x60 '`'
{ 3331, 13, 23, 17, 2, -22 }, // 0x61 'a'
{ 3369, 14, 32, 18, 2, -31 }, // 0x62 'b'
{ 3425, 13, 23, 16, 2, -22 }, // 0x63 'c'
{ 3463, 13, 32, 17, 2, -31 }, // 0x64 'd'
{ 3515, 13, 23, 16, 2, -22 }, // 0x65 'e'
{ 3553, 10, 31, 11, 1, -30 }, // 0x66 'f'
{ 3592, 17, 30, 17, 1, -22 }, // 0x67 'g'
{ 3656, 13, 32, 17, 2, -31 }, // 0x68 'h'
{ 3708, 5, 30, 9, 2, -29 }, // 0x69 'i'
{ 3727, 8, 36, 9, -1, -29 }, // 0x6A 'j'
{ 3763, 15, 32, 17, 2, -31 }, // 0x6B 'k'
{ 3823, 5, 32, 9, 2, -31 }, // 0x6C 'l'
{ 3843, 23, 23, 27, 2, -22 }, // 0x6D 'm'
{ 3910, 13, 23, 17, 2, -22 }, // 0x6E 'n'
{ 3948, 13, 23, 17, 2, -22 }, // 0x6F 'o'
{ 3986, 14, 30, 17, 2, -22 }, // 0x70 'p'
{ 4039, 13, 30, 17, 2, -22 }, // 0x71 'q'
{ 4088, 10, 23, 13, 2, -22 }, // 0x72 'r'
{ 4117, 13, 23, 15, 1, -22 }, // 0x73 's'
{ 4155, 10, 29, 12, 1, -28 }, // 0x74 't'
{ 4192, 13, 23, 17, 2, -22 }, // 0x75 'u'
{ 4230, 14, 23, 15, 1, -22 }, // 0x76 'v'
{ 4271, 21, 23, 23, 1, -22 }, // 0x77 'w'
{ 4332, 15, 23, 15, 0, -22 }, // 0x78 'x'
{ 4376, 15, 29, 15, 0, -22 }, // 0x79 'y'
{ 4431, 12, 23, 14, 1, -22 }, // 0x7A 'z'
{ 4466, 9, 39, 12, 2, -31 }, // 0x7B '{'
{ 4510, 4, 38, 9, 3, -31 }, // 0x7C '|'
{ 4529, 9, 39, 13, 2, -31 }, // 0x7D '}'
{ 4573, 15, 6, 18, 1, -19 } }; // 0x7E '~'
const GFXfont Oswald_Regular20pt7b PROGMEM = {
(uint8_t *)Oswald_Regular20pt7bBitmaps,
(GFXglyph *)Oswald_Regular20pt7bGlyphs,
0x20, 0x7E, 58 };
// Approx. 5257 bytes

959
src/fonts/oswald-30.h Normal file
View file

@ -0,0 +1,959 @@
const uint8_t Oswald_Regular30pt7bBitmaps[] PROGMEM = {
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x7D, 0xF7,
0xDE, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE3,
0x8E, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFE, 0x3F, 0xF8, 0xFB, 0xE3, 0xEF,
0x8F, 0xBE, 0x3E, 0xF8, 0xFB, 0xC3, 0xEF, 0x0F, 0x3C, 0x3C, 0xF0, 0xF3,
0xC3, 0xCF, 0x0F, 0x00, 0x01, 0xF8, 0x3F, 0x80, 0xFC, 0x1F, 0x80, 0xFE,
0x0F, 0xC0, 0x7F, 0x07, 0xE0, 0x3F, 0x83, 0xF0, 0x1F, 0x81, 0xF8, 0x0F,
0xC1, 0xFC, 0x07, 0xE0, 0xFE, 0x03, 0xF0, 0x7E, 0x03, 0xF8, 0x3F, 0x01,
0xFC, 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x3F, 0x07, 0xF0,
0x1F, 0x83, 0xF8, 0x0F, 0xC1, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7E, 0x0F,
0xE0, 0x3F, 0x07, 0xE0, 0x3F, 0x83, 0xF0, 0x1F, 0xC1, 0xF8, 0x0F, 0xC0,
0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F,
0x81, 0xF8, 0x0F, 0xC1, 0xFC, 0x07, 0xE0, 0xFE, 0x03, 0xF0, 0x7E, 0x03,
0xF8, 0x3F, 0x01, 0xFC, 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0,
0x3F, 0x07, 0xF0, 0x1F, 0x83, 0xF8, 0x0F, 0xC1, 0xF8, 0x0F, 0xE0, 0xFC,
0x07, 0xF0, 0x7E, 0x03, 0xF8, 0x3F, 0x01, 0xF8, 0x3F, 0x80, 0x00, 0x18,
0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0xFF,
0x00, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF,
0xF8, 0x3F, 0xC3, 0xFC, 0x7F, 0x00, 0xFC, 0x7E, 0x00, 0xFE, 0x7E, 0x00,
0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x3E, 0xFE, 0x00,
0x3F, 0x7E, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80,
0x00, 0x3F, 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x0F, 0xFC,
0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF,
0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x07,
0xFC, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00,
0x7F, 0x04, 0x00, 0x7F, 0x7C, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7F, 0x00,
0x3F, 0x3F, 0x80, 0x7F, 0x3F, 0xC0, 0xFE, 0x1F, 0xFF, 0xFE, 0x1F, 0xFF,
0xFC, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xC0, 0x00, 0x06,
0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06,
0x00, 0x03, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0x80,
0x00, 0x1F, 0xFF, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x1F, 0x80,
0x00, 0x7F, 0xFF, 0x80, 0x1F, 0x00, 0x00, 0x7E, 0x0F, 0xC0, 0x1F, 0x00,
0x00, 0x7C, 0x0F, 0xC0, 0x3F, 0x00, 0x00, 0xFC, 0x07, 0xC0, 0x3F, 0x00,
0x00, 0xFC, 0x07, 0xC0, 0x3E, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x3E, 0x00,
0x00, 0xFC, 0x07, 0xE0, 0x7E, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x7C, 0x00,
0x00, 0xFC, 0x07, 0xE0, 0x7C, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0xFC, 0x00,
0x00, 0xFC, 0x07, 0xE0, 0xFC, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0xF8, 0x00,
0x00, 0xFC, 0x07, 0xC0, 0xF8, 0x00, 0x00, 0xFC, 0x07, 0xC1, 0xF8, 0x00,
0x00, 0xFC, 0x0F, 0xC1, 0xF8, 0x00, 0x00, 0x7E, 0x0F, 0xC1, 0xF0, 0x00,
0x00, 0x7F, 0x1F, 0xC1, 0xF0, 0x00, 0x00, 0x3F, 0xFF, 0x83, 0xF0, 0x00,
0x00, 0x3F, 0xFF, 0x83, 0xE0, 0x00, 0x00, 0x1F, 0xFF, 0x03, 0xE0, 0x3F,
0xF0, 0x0F, 0xFC, 0x07, 0xE0, 0x7F, 0xF8, 0x01, 0xE0, 0x07, 0xE0, 0xFF,
0xFC, 0x00, 0x00, 0x07, 0xC1, 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xC1, 0xFF,
0xFE, 0x00, 0x00, 0x0F, 0xC3, 0xF0, 0x3F, 0x00, 0x00, 0x0F, 0xC3, 0xF0,
0x3F, 0x00, 0x00, 0x0F, 0x83, 0xF0, 0x3F, 0x00, 0x00, 0x0F, 0x83, 0xF0,
0x3F, 0x00, 0x00, 0x1F, 0x83, 0xF0, 0x1F, 0x00, 0x00, 0x1F, 0x03, 0xF0,
0x1F, 0x00, 0x00, 0x1F, 0x03, 0xF0, 0x1F, 0x00, 0x00, 0x3F, 0x03, 0xF0,
0x1F, 0x00, 0x00, 0x3F, 0x03, 0xF0, 0x1F, 0x00, 0x00, 0x3E, 0x03, 0xF0,
0x1F, 0x00, 0x00, 0x3E, 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x7E, 0x03, 0xF0,
0x3F, 0x00, 0x00, 0x7E, 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x7C, 0x03, 0xF0,
0x3F, 0x00, 0x00, 0xFC, 0x01, 0xF8, 0x7F, 0x00, 0x00, 0xFC, 0x01, 0xFF,
0xFE, 0x00, 0x00, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xF8, 0x00, 0xFF,
0xFC, 0x00, 0x01, 0xF8, 0x00, 0x7F, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x1F,
0xE0, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFF, 0xFC, 0x00,
0x1F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xF1, 0xFE, 0x00, 0x7F,
0x07, 0xF0, 0x07, 0xF0, 0x1F, 0x80, 0x3F, 0x80, 0xFC, 0x01, 0xFC, 0x07,
0xE0, 0x0F, 0xC0, 0x3F, 0x00, 0x7E, 0x01, 0xF8, 0x03, 0xF8, 0x0F, 0xC0,
0x1F, 0xC0, 0xFE, 0x00, 0x7E, 0x07, 0xE0, 0x03, 0xF0, 0x3F, 0x00, 0x1F,
0xC3, 0xF0, 0x00, 0x7E, 0x1F, 0x00, 0x03, 0xF1, 0xF8, 0x00, 0x0F, 0xDF,
0x80, 0x00, 0x7E, 0xF8, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00,
0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01,
0xFF, 0x80, 0x7E, 0x1F, 0xFC, 0x03, 0xF1, 0xFF, 0xF0, 0x1F, 0x8F, 0xDF,
0xC0, 0xFC, 0xFE, 0x7E, 0x0F, 0xE7, 0xE1, 0xF8, 0x7E, 0x7F, 0x0F, 0xE3,
0xF3, 0xF0, 0x3F, 0x1F, 0x9F, 0x80, 0xFD, 0xF8, 0xFC, 0x07, 0xFF, 0xCF,
0xE0, 0x1F, 0xFC, 0x7F, 0x00, 0x7F, 0xE3, 0xF8, 0x03, 0xFE, 0x1F, 0xC0,
0x0F, 0xF0, 0x7E, 0x00, 0xFF, 0xC3, 0xF0, 0x0F, 0xFF, 0x1F, 0xC0, 0xFF,
0xFE, 0x7F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0x3F, 0x8F, 0xFF, 0xF0, 0xFC,
0x3F, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x0F, 0x00, 0x60, 0x00, 0x00, 0xFF,
0xFF, 0xFE, 0xFB, 0xEF, 0xBE, 0xFB, 0xCF, 0x3C, 0xF3, 0xCF, 0x00, 0x00,
0x70, 0x1F, 0x07, 0xF0, 0xFF, 0x0F, 0xE1, 0xF8, 0x1F, 0x83, 0xF0, 0x3F,
0x03, 0xF0, 0x3E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E,
0x07, 0xE0, 0x7C, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x07, 0xC0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E,
0x03, 0xE0, 0x3F, 0x03, 0xF0, 0x1F, 0x01, 0xF8, 0x0F, 0xC0, 0xFF, 0x07,
0xF0, 0x3F, 0x00, 0xF0, 0xE0, 0x1F, 0x03, 0xF0, 0x7F, 0x07, 0xF0, 0x7E,
0x07, 0xE0, 0xFC, 0x0F, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0x7C, 0x0F, 0x81,
0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8,
0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F,
0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF0, 0x7E, 0x0F, 0xC1,
0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x3E, 0x0F, 0xC7, 0xF0, 0xFE, 0x1F, 0x03,
0xC0, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00,
0x1E, 0x00, 0x81, 0xC0, 0x9C, 0x38, 0x77, 0xE7, 0x3F, 0xFF, 0xFF, 0xEF,
0xFF, 0xF8, 0x7F, 0xFC, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x0F, 0x78, 0x01,
0xEF, 0x00, 0x78, 0xF0, 0x1F, 0x1F, 0x07, 0xC1, 0xF0, 0xF8, 0x3E, 0x06,
0x03, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E,
0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00,
0x00, 0x78, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78,
0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00,
0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x87, 0x0E, 0x3C, 0x73, 0xEF, 0x8E, 0x10, 0x00, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F,
0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0,
0x03, 0xE0, 0x00, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x03,
0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF8,
0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00,
0x7E, 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x3F,
0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x1F, 0x00,
0x07, 0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07,
0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xE0,
0x00, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x0F, 0xFF,
0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xC3, 0xFC, 0x3F, 0x80, 0xFE, 0x7F, 0x00,
0xFE, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0xFE, 0x00,
0x7F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0xFE, 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0x7E, 0x00,
0x7E, 0x7F, 0x00, 0x7E, 0x3F, 0x00, 0xFE, 0x3F, 0x81, 0xFC, 0x1F, 0xFF,
0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x01, 0xFF,
0x80, 0x00, 0x08, 0x00, 0x00, 0x7C, 0x01, 0xF0, 0x1F, 0xC0, 0xFF, 0x1F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xF0, 0x0F, 0xC0,
0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0,
0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC,
0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F,
0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF,
0xF0, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xE3, 0xFE, 0x3F, 0x80,
0xFE, 0x3F, 0x80, 0x7E, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00,
0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00,
0x7F, 0x7E, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7E, 0x00, 0x00,
0xFE, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x03,
0xF8, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F,
0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F,
0x00, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8,
0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0,
0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00,
0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
0xFE, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF,
0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x3F, 0xC3, 0xFC, 0x7F, 0x00,
0xFE, 0x7F, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0x00,
0x7F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x01,
0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0x3F,
0x80, 0x00, 0x3F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xF8, 0x00, 0x03,
0xFC, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00,
0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7F, 0x00, 0xFE, 0x7F, 0x81,
0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x07, 0xFF,
0xE0, 0x03, 0xFF, 0x80, 0x00, 0x30, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x03,
0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00,
0x07, 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xF0,
0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xBF, 0x00, 0x03, 0xEF, 0xC0, 0x01, 0xFB,
0xF0, 0x00, 0x7C, 0xFC, 0x00, 0x1F, 0x3F, 0x00, 0x0F, 0xCF, 0xC0, 0x03,
0xE3, 0xF0, 0x01, 0xF8, 0xFC, 0x00, 0x7C, 0x3F, 0x00, 0x3F, 0x0F, 0xC0,
0x0F, 0xC3, 0xF0, 0x07, 0xE0, 0xFC, 0x01, 0xF8, 0x3F, 0x00, 0x7E, 0x0F,
0xC0, 0x3F, 0x03, 0xF0, 0x0F, 0xC0, 0xFC, 0x07, 0xF0, 0x3F, 0x01, 0xF8,
0x0F, 0xC0, 0xFE, 0x03, 0xF0, 0x3F, 0x00, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00,
0x3F, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00,
0x00, 0x3F, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0xC0, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF,
0xF1, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF,
0x1F, 0xFF, 0xFE, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01,
0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F,
0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x7C, 0x01, 0xF3,
0xFF, 0x03, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x1F, 0xE0,
0xFF, 0x3F, 0x80, 0xFE, 0x7E, 0x00, 0xFC, 0xF8, 0x01, 0xFC, 0x00, 0x03,
0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F,
0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xFF,
0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x3F, 0x7F,
0x00, 0x7E, 0xFE, 0x00, 0xFC, 0xFC, 0x03, 0xF9, 0xFC, 0x07, 0xE3, 0xFF,
0xFF, 0xC3, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x01, 0xFF,
0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x0F, 0xFF,
0xF8, 0x1F, 0xFF, 0xFC, 0x1F, 0xC3, 0xFC, 0x3F, 0x80, 0xFE, 0x3F, 0x00,
0x7E, 0x7F, 0x00, 0x7E, 0x7E, 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0x7E, 0x00,
0x7F, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x1F,
0x00, 0xFE, 0x7F, 0xE0, 0xFE, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF,
0xFC, 0xFF, 0xC1, 0xFC, 0xFF, 0x00, 0xFE, 0xFE, 0x00, 0x7E, 0xFE, 0x00,
0x7E, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
0x3F, 0x7E, 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0x7E, 0x00, 0x7E, 0x7E, 0x00,
0x7E, 0x7F, 0x00, 0xFE, 0x3F, 0x00, 0xFC, 0x3F, 0x81, 0xFC, 0x1F, 0xFF,
0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x01, 0xFF,
0x80, 0x00, 0x08, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00,
0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00,
0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03,
0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F,
0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x3F,
0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFC,
0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x00, 0xFF,
0x00, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0x87, 0xF0, 0x7F, 0x1F, 0xC0, 0x7F, 0x3F, 0x80, 0x7E, 0x7E, 0x00, 0xFC,
0xFC, 0x01, 0xFD, 0xF8, 0x03, 0xFB, 0xF0, 0x03, 0xF7, 0xE0, 0x0F, 0xEF,
0xC0, 0x1F, 0xDF, 0x80, 0x3F, 0xBF, 0x00, 0x7E, 0x7E, 0x00, 0xFC, 0xFE,
0x01, 0xF8, 0xFC, 0x07, 0xE1, 0xFE, 0x1F, 0xC1, 0xFF, 0xFF, 0x01, 0xFF,
0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF,
0xF0, 0xFE, 0x0F, 0xE3, 0xF8, 0x0F, 0xE7, 0xE0, 0x0F, 0xCF, 0xC0, 0x1F,
0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xF8, 0x00, 0xFF,
0xF0, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFF,
0x00, 0x1F, 0xFF, 0x00, 0x3F, 0x7E, 0x00, 0xFE, 0xFC, 0x01, 0xF9, 0xFC,
0x07, 0xF1, 0xFF, 0x7F, 0xE3, 0xFF, 0xFF, 0x83, 0xFF, 0xFE, 0x03, 0xFF,
0xF8, 0x01, 0xFF, 0xC0, 0x00, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xFF,
0x00, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x07, 0xF8, 0xFF,
0x1F, 0xC0, 0x7E, 0x3F, 0x00, 0xFE, 0xFE, 0x00, 0xFD, 0xF8, 0x01, 0xFB,
0xF0, 0x03, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFF,
0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xF8, 0x00, 0xFF, 0xF0,
0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x1F, 0xFF, 0x80,
0x3F, 0xBF, 0x80, 0xFF, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC, 0x7F, 0xFD,
0xF8, 0x7F, 0xF3, 0xF0, 0x7F, 0xC7, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F,
0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8,
0x00, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x3F, 0x7E,
0x00, 0x7E, 0xFE, 0x00, 0xFD, 0xFC, 0x03, 0xF9, 0xFC, 0x0F, 0xE3, 0xFF,
0xFF, 0xC3, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x01, 0xFF,
0x80, 0x00, 0x18, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xE1, 0xC3, 0x8F, 0x3D, 0xF9, 0xE3, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0,
0x01, 0xE0, 0x03, 0xF0, 0x03, 0xF8, 0x07, 0xFC, 0x07, 0xFC, 0x07, 0xFC,
0x0F, 0xF8, 0x0F, 0xF8, 0x1F, 0xF0, 0x1F, 0xF0, 0x0F, 0xF0, 0x07, 0xE0,
0x03, 0xE0, 0x01, 0xF0, 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3F, 0xF0, 0x07,
0xFC, 0x01, 0xFF, 0x00, 0x3F, 0xE0, 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0x7F,
0x80, 0x1F, 0xC0, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x18, 0x00, 0x04, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
0x00, 0x70, 0x00, 0x3C, 0x00, 0x1F, 0x80, 0x0F, 0xE0, 0x07, 0xFC, 0x01,
0xFF, 0x00, 0x7F, 0xC0, 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0x7F, 0xC0, 0x1F,
0xF0, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x3F, 0x80,
0x3F, 0xC0, 0x7F, 0xE0, 0x7F, 0xC0, 0x7F, 0xC0, 0xFF, 0x80, 0xFF, 0x80,
0xFF, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x0C, 0x00,
0x04, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x80,
0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x8F, 0xFD, 0xFF, 0x9F, 0xC0, 0x7F, 0x3F,
0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0,
0x03, 0xFF, 0xE0, 0x07, 0xEF, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00,
0x3F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F,
0xE0, 0x00, 0x3F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0,
0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00,
0x1F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01,
0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80,
0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00,
0x30, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0xF8, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF,
0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x8F, 0xFF, 0x80, 0x00, 0x7F, 0xF0,
0x00, 0x7F, 0xC0, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x01, 0xFF, 0x00,
0x00, 0x07, 0xE0, 0x01, 0xFE, 0x00, 0x00, 0x03, 0xF0, 0x03, 0xF8, 0x00,
0x00, 0x01, 0xF8, 0x07, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0x07, 0xF0, 0x00,
0x00, 0x00, 0xFC, 0x0F, 0xE0, 0x01, 0xFD, 0xF0, 0x7C, 0x0F, 0xC0, 0x07,
0xFF, 0xF0, 0x7C, 0x1F, 0xC0, 0x0F, 0xFF, 0xF0, 0x3E, 0x1F, 0x80, 0x1F,
0xFF, 0xF0, 0x3E, 0x3F, 0x80, 0x3F, 0xE3, 0xF0, 0x3E, 0x3F, 0x00, 0x7F,
0x83, 0xE0, 0x1E, 0x3F, 0x00, 0x7E, 0x03, 0xE0, 0x1E, 0x3F, 0x00, 0xFE,
0x07, 0xE0, 0x1E, 0x7E, 0x00, 0xFC, 0x07, 0xE0, 0x1F, 0x7E, 0x01, 0xF8,
0x07, 0xE0, 0x1F, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x7E, 0x03, 0xF0,
0x07, 0xC0, 0x1F, 0x7E, 0x03, 0xF0, 0x07, 0xC0, 0x1E, 0x7C, 0x03, 0xF0,
0x07, 0xC0, 0x1E, 0x7C, 0x03, 0xF0, 0x0F, 0xC0, 0x1E, 0x7C, 0x07, 0xE0,
0x0F, 0xC0, 0x1E, 0xFC, 0x07, 0xE0, 0x0F, 0xC0, 0x3E, 0xFC, 0x07, 0xE0,
0x0F, 0x80, 0x3E, 0xFC, 0x07, 0xE0, 0x0F, 0x80, 0x3C, 0xFC, 0x07, 0xE0,
0x0F, 0x80, 0x7C, 0x7C, 0x07, 0xE0, 0x1F, 0x80, 0x7C, 0x7C, 0x03, 0xF0,
0x1F, 0x80, 0xF8, 0x7C, 0x03, 0xF0, 0x3F, 0x80, 0xF0, 0x7E, 0x03, 0xF8,
0x7F, 0x81, 0xF0, 0x7E, 0x03, 0xFF, 0xEF, 0x83, 0xE0, 0x7E, 0x01, 0xFF,
0xEF, 0x8F, 0xC0, 0x7E, 0x00, 0xFF, 0xEF, 0xFF, 0x80, 0x3F, 0x00, 0x7F,
0xC7, 0xFF, 0x00, 0x3F, 0x00, 0x3F, 0x03, 0xFC, 0x00, 0x3F, 0x80, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00,
0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0xF0,
0x01, 0xF0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xFF,
0xFF, 0xF8, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x01, 0xFF,
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x3F, 0x80,
0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07,
0xFC, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFE, 0x00,
0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xFC, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x7D,
0xF0, 0x00, 0x0F, 0xBE, 0x00, 0x03, 0xF7, 0xC0, 0x00, 0x7E, 0xFC, 0x00,
0x0F, 0x8F, 0x80, 0x01, 0xF1, 0xF0, 0x00, 0x3E, 0x3E, 0x00, 0x0F, 0xC7,
0xC0, 0x01, 0xF8, 0xFC, 0x00, 0x3F, 0x1F, 0x80, 0x07, 0xC1, 0xF0, 0x00,
0xF8, 0x3E, 0x00, 0x3F, 0x07, 0xE0, 0x07, 0xE0, 0xFC, 0x00, 0xFC, 0x1F,
0x80, 0x1F, 0x01, 0xF0, 0x07, 0xE0, 0x3E, 0x00, 0xFC, 0x07, 0xE0, 0x1F,
0x80, 0xFC, 0x03, 0xF0, 0x1F, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFE,
0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x81, 0xF8,
0x03, 0xF0, 0x7E, 0x00, 0x3F, 0x0F, 0xC0, 0x07, 0xE1, 0xF8, 0x00, 0xFC,
0x3F, 0x00, 0x1F, 0x8F, 0xE0, 0x03, 0xF1, 0xF8, 0x00, 0x3F, 0x3F, 0x00,
0x07, 0xE7, 0xE0, 0x00, 0xFC, 0xFC, 0x00, 0x1F, 0xBF, 0x80, 0x03, 0xF7,
0xE0, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF8,
0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x87, 0xE1, 0xFF, 0xE3, 0xF0, 0x07,
0xF1, 0xF8, 0x01, 0xFC, 0xFC, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x3F, 0x00,
0x1F, 0x9F, 0x80, 0x07, 0xCF, 0xC0, 0x03, 0xE7, 0xE0, 0x01, 0xF3, 0xF0,
0x01, 0xF9, 0xF8, 0x00, 0xFC, 0xFC, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x3F,
0x00, 0x3F, 0x1F, 0x80, 0x3F, 0x8F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x03,
0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x7E, 0x07, 0xFE,
0x3F, 0x00, 0x7F, 0x9F, 0x80, 0x1F, 0xCF, 0xC0, 0x07, 0xF7, 0xE0, 0x03,
0xFB, 0xF0, 0x00, 0xFD, 0xF8, 0x00, 0x7E, 0xFC, 0x00, 0x3F, 0xFE, 0x00,
0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xE0,
0x01, 0xFB, 0xF0, 0x00, 0xFD, 0xF8, 0x00, 0x7E, 0xFC, 0x00, 0x7F, 0x7E,
0x00, 0x7F, 0x3F, 0x00, 0x7F, 0x9F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xC7,
0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0x81, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0x80,
0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xE1, 0xFE, 0x0F, 0xF1, 0xFC, 0x01, 0xFC, 0xFE, 0x00, 0xFE, 0x7E, 0x00,
0x3F, 0x7F, 0x00, 0x1F, 0xBF, 0x80, 0x0F, 0xDF, 0xC0, 0x07, 0xFF, 0xE0,
0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE,
0x00, 0x3F, 0xFF, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F,
0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00,
0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00,
0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xFC, 0x00,
0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0,
0x07, 0xFF, 0xE0, 0x03, 0xF7, 0xF0, 0x01, 0xFB, 0xF8, 0x00, 0xFC, 0xFC,
0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x3F, 0x87,
0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0,
0x03, 0xFF, 0xC0, 0x00, 0x08, 0x00, 0x00, 0xFF, 0xE8, 0x00, 0xFF, 0xFF,
0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0xFC, 0x0F,
0xFC, 0xFC, 0x01, 0xFE, 0xFC, 0x00, 0xFE, 0xFC, 0x00, 0x7E, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00,
0x7F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0xFE, 0xFC, 0x00,
0xFE, 0xFC, 0x03, 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF,
0xF0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF,
0xFC, 0xFF, 0xFF, 0x3F, 0xFF, 0xCF, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0xFF, 0x8F, 0xFF, 0xE3, 0xFF,
0xF8, 0xFF, 0xFE, 0x3F, 0xFF, 0x8F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x00, 0xFF, 0x80, 0x03, 0xFF,
0xF8, 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xE1, 0xFE,
0x0F, 0xF1, 0xFC, 0x01, 0xFC, 0xFE, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7F,
0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x01, 0xFF,
0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00,
0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x07,
0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0,
0x7F, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC,
0x00, 0x1F, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x03, 0xFF,
0xE0, 0x01, 0xFF, 0xF0, 0x00, 0xFF, 0xF8, 0x00, 0x7E, 0xFC, 0x00, 0x7F,
0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x3F, 0xCF, 0xE0, 0x3F, 0xE7, 0xFF, 0xFE,
0xF1, 0xFF, 0xFF, 0x78, 0x7F, 0xFF, 0x3C, 0x1F, 0xFF, 0x1E, 0x07, 0xFF,
0x0F, 0x00, 0x18, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x0F, 0xFF,
0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0xFF,
0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x0F,
0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00,
0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x1F, 0xFE, 0x00,
0x0F, 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF,
0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x1F,
0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01,
0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00,
0x1F, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0,
0x01, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F,
0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F,
0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07,
0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01,
0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0,
0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0,
0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x3F, 0x81, 0xFE, 0xFF, 0xFB,
0xFF, 0xCF, 0xFF, 0x3F, 0xF8, 0xFF, 0x00, 0xFC, 0x00, 0x7E, 0x7E, 0x00,
0x3F, 0x3F, 0x00, 0x3F, 0x9F, 0x80, 0x1F, 0x8F, 0xC0, 0x1F, 0xC7, 0xE0,
0x0F, 0xC3, 0xF0, 0x0F, 0xE1, 0xF8, 0x07, 0xE0, 0xFC, 0x07, 0xF0, 0x7E,
0x03, 0xF0, 0x3F, 0x03, 0xF8, 0x1F, 0x81, 0xF8, 0x0F, 0xC1, 0xFC, 0x07,
0xE0, 0xFE, 0x03, 0xF0, 0xFE, 0x01, 0xF8, 0x7F, 0x00, 0xFC, 0x7F, 0x00,
0x7E, 0x3F, 0x80, 0x3F, 0x3F, 0x80, 0x1F, 0x9F, 0xC0, 0x0F, 0xDF, 0xC0,
0x07, 0xEF, 0xE0, 0x03, 0xF7, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0xFF, 0xFE,
0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xEF, 0xC0, 0x1F, 0xE7, 0xF0, 0x0F, 0xF1,
0xF8, 0x07, 0xF0, 0xFC, 0x03, 0xF8, 0x7F, 0x01, 0xF8, 0x1F, 0x80, 0xFC,
0x0F, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x01, 0xF8, 0x1F, 0x80, 0xFE, 0x0F,
0xC0, 0x3F, 0x07, 0xE0, 0x1F, 0xC3, 0xF0, 0x07, 0xE1, 0xF8, 0x03, 0xF0,
0xFC, 0x01, 0xFC, 0x7E, 0x00, 0x7E, 0x3F, 0x00, 0x3F, 0x9F, 0x80, 0x0F,
0xCF, 0xC0, 0x07, 0xF7, 0xE0, 0x03, 0xFB, 0xF0, 0x00, 0xFD, 0xF8, 0x00,
0x7F, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0,
0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80,
0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00,
0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00,
0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00,
0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00,
0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00,
0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xFD, 0xFC,
0x00, 0x01, 0xFB, 0xF8, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x0F, 0xEF, 0xF0,
0x00, 0x1F, 0xDF, 0xE0, 0x00, 0x3F, 0xBF, 0xC0, 0x00, 0xFF, 0x7F, 0xC0,
0x01, 0xFE, 0xFF, 0x80, 0x03, 0xFD, 0xFF, 0x00, 0x07, 0xFB, 0xFE, 0x00,
0x0F, 0xF7, 0xFC, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, 0x00,
0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFB, 0xC0, 0x0F,
0xFF, 0xF7, 0xC0, 0x1E, 0xFF, 0xE7, 0x80, 0x3D, 0xFF, 0xCF, 0x00, 0x7B,
0xFF, 0x9E, 0x01, 0xF7, 0xFF, 0x3E, 0x03, 0xCF, 0xFE, 0x3C, 0x07, 0x9F,
0xFC, 0x78, 0x0F, 0x3F, 0xF8, 0xF0, 0x1E, 0x7F, 0xF1, 0xE0, 0x7C, 0x7F,
0xE1, 0xE0, 0xF0, 0xFF, 0xC3, 0xC1, 0xE1, 0xFF, 0x87, 0x83, 0xC3, 0xFF,
0x0F, 0x0F, 0x87, 0xFE, 0x1F, 0x1E, 0x0F, 0xFC, 0x1E, 0x3C, 0x1F, 0xF8,
0x3C, 0x78, 0x3F, 0xF0, 0x78, 0xF0, 0x7F, 0xE0, 0xF3, 0xC0, 0xFF, 0xC0,
0xF7, 0x81, 0xFF, 0x81, 0xEF, 0x03, 0xFF, 0x03, 0xDE, 0x07, 0xFE, 0x07,
0xF8, 0x0F, 0xFC, 0x07, 0xF0, 0x1F, 0xF8, 0x0F, 0xE0, 0x3F, 0xF0, 0x1F,
0xC0, 0x7F, 0xE0, 0x3F, 0x80, 0xFF, 0xC0, 0x7E, 0x01, 0xFF, 0x80, 0x7C,
0x03, 0xFF, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xF0, 0x0F, 0xFC, 0x03, 0xC0,
0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0xE0, 0x01,
0xFF, 0xC0, 0x03, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1F,
0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF,
0xF8, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFB,
0xE0, 0x3F, 0xF7, 0xE0, 0x7F, 0xE7, 0xC0, 0xFF, 0xCF, 0x81, 0xFF, 0x9F,
0x83, 0xFF, 0x1F, 0x07, 0xFE, 0x3F, 0x0F, 0xFC, 0x3E, 0x1F, 0xF8, 0x7E,
0x3F, 0xF0, 0x7C, 0x7F, 0xE0, 0xF8, 0xFF, 0xC1, 0xF9, 0xFF, 0x81, 0xF3,
0xFF, 0x03, 0xF7, 0xFE, 0x03, 0xEF, 0xFC, 0x07, 0xFF, 0xF8, 0x0F, 0xFF,
0xF0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF,
0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xF0,
0x01, 0xFF, 0xE0, 0x01, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0x03, 0xFF, 0x00,
0x07, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0x00, 0xFF, 0x80, 0x00, 0xFF,
0xFC, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x0F,
0xF0, 0x7F, 0xC7, 0xF0, 0x07, 0xF1, 0xFC, 0x00, 0xFE, 0x7E, 0x00, 0x3F,
0xBF, 0x80, 0x07, 0xEF, 0xE0, 0x01, 0xFB, 0xF8, 0x00, 0x7F, 0xFE, 0x00,
0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE,
0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F,
0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00,
0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8,
0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF,
0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01,
0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0,
0x01, 0xF9, 0xF8, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x9F, 0xC0, 0x0F, 0xC3,
0xF8, 0x0F, 0xF0, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF,
0x00, 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0xFF,
0xF4, 0x01, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F, 0xFF,
0xFF, 0x9F, 0x80, 0xFF, 0xBF, 0x00, 0x7F, 0x7E, 0x00, 0x7E, 0xFC, 0x00,
0xFF, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07,
0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7F,
0xF8, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xE0, 0x0F, 0xEF, 0xC0, 0x3F, 0xDF,
0xFF, 0xFF, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC1, 0xFF,
0xFC, 0x03, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80,
0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00,
0x03, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00,
0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03,
0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F,
0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00,
0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFE, 0x0F, 0xF0, 0x7F,
0xC7, 0xF0, 0x07, 0xF1, 0xFC, 0x00, 0xFE, 0x7E, 0x00, 0x1F, 0xBF, 0x80,
0x07, 0xEF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF,
0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F,
0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00,
0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE,
0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F,
0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00,
0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8,
0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xF9,
0xF8, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x9F, 0xC0, 0x0F, 0xE3, 0xF8, 0x0F,
0xF0, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00, 0x7F,
0xFF, 0x80, 0x07, 0xFF, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7E, 0x00,
0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F,
0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x06, 0x00, 0x00,
0x00, 0x80, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0xFF,
0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFC, 0x0F, 0xFC, 0xFC, 0x01, 0xFC, 0xFC,
0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFC, 0x00, 0x7E, 0xFC,
0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC,
0x00, 0x7E, 0xFC, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFC,
0x01, 0xFC, 0xFC, 0x07, 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF,
0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
0x0F, 0xC0, 0xFC, 0x0F, 0xE0, 0xFC, 0x07, 0xE0, 0xFC, 0x07, 0xE0, 0xFC,
0x07, 0xE0, 0xFC, 0x07, 0xF0, 0xFC, 0x03, 0xF0, 0xFC, 0x03, 0xF0, 0xFC,
0x03, 0xF8, 0xFC, 0x01, 0xF8, 0xFC, 0x01, 0xF8, 0xFC, 0x01, 0xF8, 0xFC,
0x01, 0xFC, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0xFE, 0xFC,
0x00, 0xFE, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7F, 0xFC,
0x00, 0x3F, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F,
0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F, 0x83, 0xFC, 0x7F, 0x00, 0xFC, 0x7E,
0x00, 0xFE, 0x7E, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC,
0x00, 0x3E, 0xFE, 0x00, 0x3F, 0x7E, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x7F,
0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x1F,
0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01,
0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00,
0x0F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00,
0x00, 0xFE, 0x00, 0x00, 0x7F, 0x04, 0x00, 0x7F, 0x7C, 0x00, 0x3F, 0xFC,
0x00, 0x3F, 0xFE, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7E,
0x00, 0x3F, 0x7F, 0x00, 0x3F, 0x3F, 0x80, 0x7F, 0x3F, 0xC0, 0xFE, 0x1F,
0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x01,
0xFF, 0xC0, 0x00, 0x18, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF8, 0x00, 0x0F, 0xE0,
0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00,
0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F,
0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80,
0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00,
0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE,
0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00,
0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03,
0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8,
0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00,
0x0F, 0xE0, 0x00, 0x3F, 0x80, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF,
0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07,
0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80,
0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF,
0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F,
0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00,
0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE,
0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F,
0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00,
0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8,
0x00, 0x7E, 0x7E, 0x00, 0x1F, 0x9F, 0x80, 0x07, 0xE7, 0xE0, 0x01, 0xF9,
0xF8, 0x00, 0xFE, 0x7F, 0x00, 0x3F, 0x8F, 0xE0, 0x1F, 0xC3, 0xFC, 0x0F,
0xF0, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00, 0x7F,
0xFF, 0x80, 0x07, 0xFF, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xFE, 0x00, 0x07,
0xEF, 0xC0, 0x00, 0xFD, 0xF8, 0x00, 0x1F, 0xBF, 0x00, 0x03, 0xF7, 0xE0,
0x00, 0xFC, 0xFE, 0x00, 0x1F, 0x8F, 0xC0, 0x03, 0xF1, 0xF8, 0x00, 0x7E,
0x3F, 0x00, 0x0F, 0xC7, 0xF0, 0x03, 0xF0, 0x7E, 0x00, 0x7E, 0x0F, 0xC0,
0x0F, 0xC1, 0xF8, 0x01, 0xF8, 0x3F, 0x00, 0x3E, 0x07, 0xF0, 0x0F, 0xC0,
0x7E, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xE0, 0x3F, 0x00,
0xF8, 0x03, 0xF0, 0x3F, 0x00, 0x7E, 0x07, 0xE0, 0x0F, 0xC0, 0xFC, 0x01,
0xF8, 0x1F, 0x00, 0x1F, 0x83, 0xE0, 0x03, 0xF0, 0xFC, 0x00, 0x7E, 0x1F,
0x80, 0x0F, 0xC3, 0xF0, 0x01, 0xF8, 0x7C, 0x00, 0x1F, 0x8F, 0x80, 0x03,
0xF3, 0xF0, 0x00, 0x7E, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xF9, 0xF0,
0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F,
0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x00,
0x00, 0x7F, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F,
0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xE0, 0x00,
0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0xF8, 0x00,
0xFF, 0xF0, 0x01, 0xF0, 0x01, 0xF3, 0xE0, 0x03, 0xE0, 0x03, 0xE7, 0xC0,
0x0F, 0xE0, 0x07, 0xCF, 0x80, 0x1F, 0xC0, 0x0F, 0x9F, 0x80, 0x3F, 0x80,
0x3F, 0x3F, 0x00, 0x7F, 0x00, 0x7E, 0x7E, 0x00, 0xFE, 0x00, 0xF8, 0x7C,
0x03, 0xFE, 0x01, 0xF0, 0xF8, 0x07, 0xFC, 0x03, 0xE1, 0xF0, 0x0F, 0xF8,
0x07, 0xC3, 0xE0, 0x1F, 0xF0, 0x0F, 0x87, 0xE0, 0x3D, 0xE0, 0x3F, 0x0F,
0xC0, 0x7B, 0xC0, 0x7C, 0x0F, 0x81, 0xF7, 0xC0, 0xF8, 0x1F, 0x03, 0xEF,
0x81, 0xF0, 0x3E, 0x07, 0xCF, 0x03, 0xE0, 0x7C, 0x0F, 0x9E, 0x07, 0xC0,
0xF8, 0x1E, 0x3C, 0x0F, 0x81, 0xF8, 0x7C, 0x7C, 0x3F, 0x01, 0xF0, 0xF8,
0xF8, 0x7C, 0x03, 0xE1, 0xF1, 0xF0, 0xF8, 0x07, 0xC3, 0xE1, 0xE1, 0xF0,
0x0F, 0x87, 0x83, 0xC3, 0xE0, 0x1F, 0x1F, 0x07, 0xC7, 0xC0, 0x3F, 0x3E,
0x0F, 0x8F, 0x80, 0x3E, 0x7C, 0x1F, 0x3E, 0x00, 0x7C, 0xF8, 0x1E, 0x7C,
0x00, 0xF9, 0xE0, 0x3C, 0xF8, 0x01, 0xF3, 0xC0, 0x7D, 0xF0, 0x03, 0xEF,
0x80, 0xFB, 0xE0, 0x07, 0xDF, 0x01, 0xF7, 0xC0, 0x07, 0xFE, 0x01, 0xFF,
0x00, 0x0F, 0xFC, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x07, 0xFC, 0x00, 0x3F,
0xE0, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x3F,
0xE0, 0x01, 0xFF, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x03,
0xF8, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x03,
0xF8, 0x00, 0x1F, 0xC0, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x00,
0x3E, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x0F,
0xDF, 0xC0, 0x03, 0xF9, 0xF8, 0x00, 0x7E, 0x3F, 0x00, 0x0F, 0xC3, 0xF0,
0x03, 0xF0, 0x7E, 0x00, 0x7E, 0x07, 0xE0, 0x0F, 0x80, 0xFC, 0x03, 0xF0,
0x1F, 0xC0, 0x7E, 0x01, 0xF8, 0x1F, 0x80, 0x3F, 0x03, 0xF0, 0x03, 0xF0,
0x7C, 0x00, 0x7E, 0x1F, 0x80, 0x07, 0xE3, 0xE0, 0x00, 0xFC, 0xFC, 0x00,
0x1F, 0xDF, 0x80, 0x01, 0xFB, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x03, 0xFF,
0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x1F, 0xE0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xF0,
0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x03,
0xFF, 0xC0, 0x00, 0x7D, 0xF8, 0x00, 0x1F, 0xBF, 0x00, 0x03, 0xF3, 0xF0,
0x00, 0x7C, 0x7E, 0x00, 0x1F, 0x87, 0xE0, 0x03, 0xF0, 0xFC, 0x00, 0xFC,
0x1F, 0xC0, 0x1F, 0x81, 0xF8, 0x03, 0xE0, 0x3F, 0x00, 0xFC, 0x03, 0xF0,
0x1F, 0x80, 0x7E, 0x07, 0xE0, 0x07, 0xE0, 0xFC, 0x00, 0xFC, 0x1F, 0x80,
0x1F, 0xC7, 0xE0, 0x01, 0xF8, 0xFC, 0x00, 0x3F, 0x3F, 0x80, 0x03, 0xF7,
0xE0, 0x00, 0x7F, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x01, 0xFB, 0xF8, 0x00,
0x3F, 0x3F, 0x00, 0x0F, 0xE7, 0xE0, 0x01, 0xF8, 0xFC, 0x00, 0x3F, 0x0F,
0xC0, 0x0F, 0xE1, 0xF8, 0x01, 0xF8, 0x3F, 0x00, 0x3F, 0x03, 0xF0, 0x0F,
0xE0, 0x7E, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x07, 0xE0, 0x1F,
0x81, 0xF8, 0x03, 0xF0, 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x07, 0xE1, 0xF8,
0x00, 0xFC, 0x3F, 0x00, 0x0F, 0xC7, 0xE0, 0x01, 0xF9, 0xF8, 0x00, 0x3F,
0x3F, 0x00, 0x03, 0xF7, 0xE0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00,
0x00, 0xFF, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x3F,
0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xE0, 0x00,
0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00,
0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0,
0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x7F, 0xFF, 0xFB,
0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x80, 0x01,
0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00,
0x03, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7E,
0x00, 0x07, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xC0, 0x00,
0xFC, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80,
0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xE0, 0x00, 0x3F,
0x00, 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00,
0x7E, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xC0,
0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F,
0x80, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7E,
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F,
0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8,
0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01,
0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F,
0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0,
0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xF0, 0x00,
0x7C, 0x00, 0x1F, 0x00, 0x07, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F,
0xC0, 0x03, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xE0, 0x01, 0xF8,
0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00,
0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00,
0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0x0F,
0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF8,
0x00, 0x7E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00,
0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00,
0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0x81,
0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F,
0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0,
0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07,
0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE,
0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0,
0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F,
0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x00, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00,
0x7F, 0x80, 0x03, 0xFF, 0x00, 0x0F, 0xFC, 0x00, 0x7E, 0xF8, 0x01, 0xF3,
0xE0, 0x07, 0xCF, 0xC0, 0x3E, 0x1F, 0x00, 0xF8, 0x7C, 0x07, 0xE1, 0xF8,
0x1F, 0x03, 0xE0, 0xFC, 0x0F, 0xC3, 0xF0, 0x3F, 0x0F, 0x80, 0x7C, 0x7E,
0x01, 0xF9, 0xF8, 0x07, 0xEF, 0xC0, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFE, 0x1F, 0x87,
0xE0, 0xFC, 0x1F, 0x07, 0xC0, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x07,
0x03, 0xFF, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC3, 0xF8,
0xFE, 0x3F, 0x83, 0xF9, 0xF8, 0x0F, 0xCF, 0xC0, 0x7E, 0x7E, 0x03, 0xF3,
0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x07,
0xF8, 0x00, 0xFF, 0xC0, 0x1F, 0xFE, 0x03, 0xFF, 0xF0, 0x3F, 0x9F, 0x87,
0xF8, 0xFC, 0x3F, 0x07, 0xE3, 0xF0, 0x3F, 0x3F, 0x81, 0xF9, 0xF8, 0x0F,
0xCF, 0xC0, 0x7E, 0x7E, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFC, 0xFC,
0x0F, 0xE7, 0xF0, 0xFF, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xC7, 0xFF, 0x3E,
0x1F, 0xF1, 0xF8, 0x7F, 0x0F, 0xC0, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F,
0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00,
0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC,
0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF9, 0xFE, 0x1F, 0xDF, 0xF8,
0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0xFF, 0xFD, 0xFE, 0x0F, 0xEF, 0xE0,
0x3F, 0x7F, 0x01, 0xFB, 0xF8, 0x0F, 0xDF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01,
0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF,
0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F,
0xFF, 0xC0, 0x7E, 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x81, 0xFD, 0xFF,
0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0xFF, 0xE3, 0xFB, 0xFF, 0x1F, 0xCF, 0xE0,
0x0F, 0xFE, 0x03, 0xFF, 0xE0, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xF1, 0xFD,
0xFC, 0x1F, 0xBF, 0x01, 0xF7, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF,
0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07,
0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F,
0xC0, 0x01, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF,
0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xEF, 0xE0, 0xFC, 0xFE, 0x3F, 0x9F,
0xFF, 0xF1, 0xFF, 0xFC, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x00, 0x03, 0xF0,
0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F,
0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03,
0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x0F, 0xE3, 0xF1, 0xFF,
0xBF, 0x3F, 0xFF, 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFE,
0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F,
0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03,
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0,
0x3F, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x07, 0xF7, 0xFB, 0xFF, 0x7F,
0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFB, 0xF0, 0xFE, 0x3F, 0x07, 0xFE, 0x03,
0xFF, 0xE0, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xF1, 0xFD, 0xFC, 0x1F, 0xBF,
0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE,
0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8,
0x00, 0x3F, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0,
0x1F, 0xFE, 0x03, 0xFF, 0xE0, 0xFC, 0xFE, 0x3F, 0x9F, 0xFF, 0xF1, 0xFF,
0xFC, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x00, 0xFF, 0x01, 0xFF, 0x03, 0xFF,
0x07, 0xFF, 0x07, 0xFF, 0x07, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xC0,
0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0,
0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0,
0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0,
0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0,
0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0,
0x0F, 0xC0, 0x00, 0x00, 0x01, 0x00, 0xFF, 0x83, 0x81, 0xFF, 0xE3, 0xE1,
0xFF, 0xFB, 0xF1, 0xFF, 0xFF, 0xF8, 0xFC, 0x3F, 0xE0, 0xFC, 0x0F, 0xC0,
0x7E, 0x03, 0xE0, 0x3E, 0x01, 0xF0, 0x1F, 0x00, 0xF8, 0x0F, 0x80, 0x7C,
0x07, 0xC0, 0x3E, 0x03, 0xE0, 0x1F, 0x81, 0xF0, 0x0F, 0xC0, 0xF8, 0x07,
0xE0, 0x7C, 0x03, 0xE0, 0x3E, 0x01, 0xF0, 0x1F, 0x80, 0xF8, 0x0F, 0xC0,
0xFC, 0x03, 0xF0, 0x7C, 0x01, 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x1F,
0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0x30, 0x00, 0x0F, 0x00, 0x00, 0x0F,
0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00,
0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x0F, 0x9F, 0xFE,
0x0F, 0x80, 0x3F, 0x8F, 0x80, 0x07, 0xC7, 0xC0, 0x03, 0xE7, 0xC0, 0x01,
0xF3, 0xF0, 0x00, 0xF9, 0xF8, 0x00, 0xFC, 0xFF, 0xC7, 0xFC, 0x3F, 0xFF,
0xFE, 0x1F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x00, 0xFF, 0xFC, 0x00, 0x01,
0x00, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00,
0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00,
0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0,
0x00, 0xFE, 0x1F, 0xCF, 0xE7, 0xFE, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xF0, 0x7F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF,
0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F,
0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03,
0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0,
0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE,
0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF,
0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0,
0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC,
0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F,
0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x0F, 0xE3, 0xFF, 0xFF, 0xFF,
0xEF, 0xF9, 0xFE, 0x1C, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0,
0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00,
0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F,
0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x1F, 0xFF, 0x80,
0x7E, 0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xCF, 0xE0, 0x7F, 0x3F, 0x83, 0xF8,
0xFE, 0x0F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE3, 0xF8, 0x3F, 0x8F, 0xE0, 0xFE,
0x7F, 0x03, 0xF9, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F, 0xFF, 0x00, 0xFF, 0xFE,
0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x3F, 0xEF, 0xC0, 0xFF, 0x3F, 0x03,
0xFC, 0x7E, 0x0F, 0xE1, 0xF8, 0x3F, 0x87, 0xE0, 0xFE, 0x0F, 0xC3, 0xF8,
0x3F, 0x0F, 0xE0, 0xFE, 0x3F, 0x81, 0xF8, 0xFE, 0x07, 0xE3, 0xF8, 0x1F,
0xCF, 0xE0, 0x3F, 0x3F, 0x80, 0xFC, 0xFE, 0x01, 0xFB, 0xF8, 0x07, 0xEF,
0xE0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x04, 0x00, 0x10, 0x3F, 0x0F, 0xF0,
0x7F, 0x8F, 0xCF, 0xFE, 0x3F, 0xF3, 0xF7, 0xFF, 0x9F, 0xFE, 0xFF, 0xFF,
0xEF, 0xFF, 0xBF, 0xC1, 0xFF, 0x07, 0xFF, 0xE0, 0x3F, 0x80, 0xFF, 0xF0,
0x0F, 0xC0, 0x3F, 0xFC, 0x03, 0xF0, 0x0F, 0xFF, 0x00, 0xFC, 0x03, 0xFF,
0xC0, 0x3F, 0x00, 0xFF, 0xF0, 0x0F, 0xC0, 0x3F, 0xFC, 0x03, 0xF0, 0x0F,
0xFF, 0x00, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0x00, 0xFF, 0xF0, 0x0F, 0xC0,
0x3F, 0xFC, 0x03, 0xF0, 0x0F, 0xFF, 0x00, 0xFC, 0x03, 0xFF, 0xC0, 0x3F,
0x00, 0xFF, 0xF0, 0x0F, 0xC0, 0x3F, 0xFC, 0x03, 0xF0, 0x0F, 0xFF, 0x00,
0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0x00, 0xFF, 0xF0, 0x0F, 0xC0, 0x3F, 0xFC,
0x03, 0xF0, 0x0F, 0xFF, 0x00, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0x00, 0xFF,
0xF0, 0x0F, 0xC0, 0x3F, 0xFC, 0x03, 0xF0, 0x0F, 0xFF, 0x00, 0xFC, 0x03,
0xFF, 0xC0, 0x3F, 0x00, 0xFF, 0xF0, 0x0F, 0xC0, 0x3F, 0xFC, 0x03, 0xF0,
0x0F, 0xFF, 0x00, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0x00, 0xFC, 0xFC, 0x1F,
0xCF, 0xC7, 0xFE, 0xFD, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0,
0x7F, 0xFE, 0x07, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC,
0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F,
0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03,
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0,
0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0x07,
0xFC, 0x03, 0xFF, 0xE0, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xF1, 0xFD, 0xFC,
0x1F, 0xBF, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0,
0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xE0,
0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0,
0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80,
0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xE0, 0xFE, 0xFE, 0x3F, 0x9F, 0xFF,
0xF1, 0xFF, 0xFC, 0x1F, 0xFF, 0x01, 0xFF, 0x80, 0xFC, 0x7F, 0x07, 0xE7,
0xFE, 0x3F, 0x7F, 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0x83, 0xFB,
0xF0, 0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03, 0xF7, 0xE0, 0x1F, 0xFF, 0x00,
0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF,
0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07,
0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC,
0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0xE0, 0x7F,
0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, 0xFC, 0xFF, 0x87, 0xE3,
0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03,
0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00,
0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0xE3, 0xF1, 0xFF, 0xBF,
0x3F, 0xFF, 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xE0, 0x7F, 0xFE, 0x03,
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0,
0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC,
0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F,
0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x07, 0xF7, 0xFF, 0xFF, 0x7F, 0xFF,
0xF3, 0xFF, 0xFF, 0x1F, 0xFB, 0xF0, 0xFF, 0x3F, 0x00, 0x03, 0xF0, 0x00,
0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00,
0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0,
0xFE, 0x1F, 0xFC, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xE0, 0xFF, 0x80, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0,
0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07,
0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC,
0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00,
0xFE, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x01, 0xFF, 0xE0, 0x7F, 0xFC, 0x1F,
0xFF, 0xC3, 0xF8, 0xFC, 0x7E, 0x0F, 0x9F, 0x80, 0xF3, 0xF0, 0x1F, 0x7E,
0x03, 0xEF, 0xC0, 0x60, 0xFC, 0x00, 0x1F, 0xC0, 0x03, 0xFC, 0x00, 0x3F,
0xC0, 0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x03,
0xFC, 0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x20,
0x3F, 0x3C, 0x03, 0xFF, 0x80, 0x7D, 0xF0, 0x0F, 0xBF, 0x01, 0xF7, 0xF0,
0x7E, 0x7F, 0x1F, 0xCF, 0xFF, 0xF0, 0xFF, 0xFE, 0x0F, 0xFF, 0x80, 0x7F,
0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F,
0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F,
0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F,
0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F,
0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F,
0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF1, 0x07, 0xFF, 0x07,
0xFF, 0x03, 0xFF, 0x01, 0xFF, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07,
0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0,
0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC,
0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF,
0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F,
0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07,
0xFF, 0xC0, 0x7F, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF,
0x7F, 0x7F, 0xE7, 0xF3, 0xF8, 0x7F, 0xFC, 0x01, 0xFF, 0xE0, 0x1F, 0xBF,
0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0, 0x3F, 0x3F, 0x01, 0xF9, 0xF8, 0x0F,
0xCF, 0xC0, 0xFC, 0x3F, 0x07, 0xE1, 0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x7E,
0x0F, 0xC3, 0xF0, 0x7C, 0x0F, 0x83, 0xE0, 0x7C, 0x3F, 0x03, 0xF1, 0xF8,
0x1F, 0x8F, 0xC0, 0xFC, 0x7C, 0x03, 0xE3, 0xE0, 0x1F, 0x1F, 0x00, 0xF9,
0xF8, 0x07, 0xCF, 0xC0, 0x3F, 0x7C, 0x00, 0xFB, 0xE0, 0x07, 0xDF, 0x00,
0x3E, 0xF8, 0x01, 0xF7, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xE0, 0x01, 0xFF,
0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x00,
0xF8, 0x07, 0xC0, 0x3F, 0xF0, 0x0F, 0x80, 0x7F, 0xE0, 0x3F, 0x01, 0xFF,
0xC0, 0x7E, 0x03, 0xEF, 0x80, 0xFC, 0x07, 0xCF, 0x81, 0xFC, 0x0F, 0x9F,
0x03, 0xF8, 0x1F, 0x3E, 0x0F, 0xF0, 0x3E, 0x7C, 0x1F, 0xE0, 0x7C, 0xF8,
0x3F, 0xC1, 0xF1, 0xF0, 0x7F, 0xC3, 0xE3, 0xE0, 0xF7, 0x87, 0xC3, 0xE1,
0xEF, 0x0F, 0x87, 0xC7, 0xDE, 0x1F, 0x0F, 0x8F, 0x3C, 0x3E, 0x1F, 0x1E,
0x78, 0x78, 0x3E, 0x3C, 0x79, 0xF0, 0x7C, 0x78, 0xF3, 0xE0, 0x78, 0xF1,
0xE7, 0xC0, 0xFB, 0xE3, 0xCF, 0x81, 0xF7, 0x87, 0x9F, 0x03, 0xEF, 0x07,
0xBC, 0x07, 0xDE, 0x0F, 0x78, 0x0F, 0xBC, 0x1F, 0xF0, 0x0F, 0xF8, 0x3F,
0xE0, 0x1F, 0xE0, 0x7F, 0xC0, 0x3F, 0xC0, 0x7F, 0x80, 0x7F, 0x80, 0xFE,
0x00, 0xFF, 0x01, 0xFC, 0x01, 0xFE, 0x03, 0xF8, 0x01, 0xF8, 0x07, 0xF0,
0x03, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x0F, 0xC0, 0x0F, 0xC0, 0x1F, 0x00,
0xFC, 0x01, 0xFF, 0xE0, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE3, 0xF0,
0x7E, 0x1F, 0x83, 0xF0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x0F, 0xCF, 0x80,
0x7E, 0xFC, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x01, 0xFF,
0x00, 0x0F, 0xF8, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00,
0xFF, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x3F, 0xFC,
0x01, 0xFB, 0xF0, 0x0F, 0x9F, 0x80, 0xFC, 0xFC, 0x07, 0xC3, 0xF0, 0x7E,
0x1F, 0x83, 0xF0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x0F, 0xCF, 0x80, 0x7E,
0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xC0, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF,
0x00, 0x7E, 0xFC, 0x07, 0xF7, 0xE0, 0x3F, 0x3F, 0x01, 0xF9, 0xF8, 0x0F,
0xCF, 0xC0, 0x7E, 0x3F, 0x03, 0xE1, 0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x7E,
0x0F, 0xC1, 0xF0, 0x7E, 0x0F, 0x83, 0xE0, 0x7E, 0x1F, 0x03, 0xF1, 0xF8,
0x0F, 0x8F, 0xC0, 0x7C, 0x7C, 0x03, 0xE3, 0xE0, 0x1F, 0x9F, 0x00, 0x7D,
0xF8, 0x03, 0xEF, 0xC0, 0x1F, 0x7C, 0x00, 0xFB, 0xE0, 0x07, 0xDF, 0x00,
0x1F, 0xF8, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0xFF,
0x00, 0x07, 0xF8, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00,
0x3F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0xFF, 0xC0,
0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x01, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x7F,
0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xF7, 0xFF, 0xF8, 0x01, 0xF8,
0x00, 0xFC, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x3F,
0x80, 0x1F, 0x80, 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x03,
0xF0, 0x01, 0xF8, 0x01, 0xFC, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00,
0x7F, 0x00, 0x3F, 0x80, 0x1F, 0x80, 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0,
0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
0x00, 0xFC, 0x0F, 0xF0, 0x7F, 0xC3, 0xFF, 0x0F, 0xFC, 0x3F, 0x80, 0xFE,
0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F,
0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x7F, 0x01, 0xFC, 0x3F,
0xE0, 0xFF, 0x03, 0xF8, 0x0F, 0xF0, 0x3F, 0xE0, 0x1F, 0xC0, 0x7F, 0x00,
0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0,
0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0,
0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xE0, 0x3F, 0x80, 0xFF,
0x83, 0xFF, 0x07, 0xFC, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0xFC, 0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0xC0,
0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0,
0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC,
0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F,
0x80, 0xFE, 0x01, 0xFF, 0x07, 0xFC, 0x07, 0xF0, 0x3F, 0xC1, 0xFF, 0x0F,
0xE0, 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00,
0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0,
0x7F, 0x0F, 0xFC, 0x3F, 0xE0, 0xFF, 0x83, 0xFC, 0x0F, 0xE0, 0x00, 0x03,
0x80, 0x00, 0x3F, 0x80, 0x43, 0xFF, 0x83, 0x9F, 0xFF, 0xBF, 0xFF, 0xFF,
0xFD, 0xF3, 0xFF, 0xE7, 0x03, 0xFF, 0x08, 0x03, 0xF0, 0x00, 0x03, 0x80 };
const GFXglyph Oswald_Regular30pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 13, 0, 0 }, // 0x20 ' '
{ 1, 6, 48, 12, 3, -47 }, // 0x21 '!'
{ 37, 14, 15, 16, 1, -47 }, // 0x22 '"'
{ 64, 25, 48, 29, 2, -47 }, // 0x23 '#'
{ 214, 24, 57, 29, 2, -51 }, // 0x24 '$'
{ 385, 48, 48, 52, 2, -47 }, // 0x25 '%'
{ 673, 29, 49, 36, 3, -47 }, // 0x26 '&'
{ 851, 6, 15, 7, 1, -47 }, // 0x27 '''
{ 863, 12, 59, 18, 4, -47 }, // 0x28 '('
{ 952, 11, 59, 15, 2, -47 }, // 0x29 ')'
{ 1034, 19, 20, 23, 3, -47 }, // 0x2A '*'
{ 1082, 22, 24, 24, 1, -35 }, // 0x2B '+'
{ 1148, 7, 15, 11, 2, -6 }, // 0x2C ','
{ 1162, 13, 5, 19, 3, -19 }, // 0x2D '-'
{ 1171, 6, 7, 11, 3, -6 }, // 0x2E '.'
{ 1177, 18, 48, 22, 2, -47 }, // 0x2F '/'
{ 1285, 24, 49, 30, 3, -47 }, // 0x30 '0'
{ 1432, 14, 48, 23, 2, -47 }, // 0x31 '1'
{ 1516, 24, 48, 28, 2, -47 }, // 0x32 '2'
{ 1660, 24, 49, 28, 2, -47 }, // 0x33 '3'
{ 1807, 26, 48, 28, 2, -47 }, // 0x34 '4'
{ 1963, 23, 48, 28, 3, -47 }, // 0x35 '5'
{ 2101, 24, 49, 30, 3, -47 }, // 0x36 '6'
{ 2248, 19, 48, 23, 1, -47 }, // 0x37 '7'
{ 2362, 23, 49, 29, 3, -47 }, // 0x38 '8'
{ 2503, 23, 49, 30, 3, -47 }, // 0x39 '9'
{ 2644, 6, 25, 12, 4, -30 }, // 0x3A ':'
{ 2663, 7, 36, 13, 3, -32 }, // 0x3B ';'
{ 2695, 17, 30, 22, 2, -31 }, // 0x3C '<'
{ 2759, 18, 16, 24, 3, -31 }, // 0x3D '='
{ 2795, 17, 30, 22, 3, -31 }, // 0x3E '>'
{ 2859, 23, 48, 29, 3, -47 }, // 0x3F '?'
{ 2997, 48, 56, 53, 3, -47 }, // 0x40 '@'
{ 3333, 27, 48, 29, 1, -47 }, // 0x41 'A'
{ 3495, 25, 48, 31, 4, -47 }, // 0x42 'B'
{ 3645, 25, 49, 30, 3, -47 }, // 0x43 'C'
{ 3799, 24, 48, 31, 4, -47 }, // 0x44 'D'
{ 3943, 18, 48, 24, 4, -47 }, // 0x45 'E'
{ 4051, 18, 48, 23, 4, -47 }, // 0x46 'F'
{ 4159, 25, 49, 31, 3, -47 }, // 0x47 'G'
{ 4313, 25, 48, 33, 4, -47 }, // 0x48 'H'
{ 4463, 7, 48, 15, 4, -47 }, // 0x49 'I'
{ 4505, 14, 49, 18, 0, -47 }, // 0x4A 'J'
{ 4591, 25, 48, 29, 4, -47 }, // 0x4B 'K'
{ 4741, 19, 48, 23, 4, -47 }, // 0x4C 'L'
{ 4855, 31, 48, 39, 4, -47 }, // 0x4D 'M'
{ 5041, 23, 48, 31, 4, -47 }, // 0x4E 'N'
{ 5179, 26, 49, 32, 3, -47 }, // 0x4F 'O'
{ 5339, 23, 48, 28, 4, -47 }, // 0x50 'P'
{ 5477, 26, 58, 32, 3, -47 }, // 0x51 'Q'
{ 5666, 24, 48, 30, 4, -47 }, // 0x52 'R'
{ 5810, 24, 49, 28, 2, -47 }, // 0x53 'S'
{ 5957, 22, 48, 24, 1, -47 }, // 0x54 'T'
{ 6089, 26, 49, 32, 3, -47 }, // 0x55 'U'
{ 6249, 27, 48, 30, 1, -47 }, // 0x56 'V'
{ 6411, 39, 48, 43, 2, -47 }, // 0x57 'W'
{ 6645, 27, 48, 28, 1, -47 }, // 0x58 'X'
{ 6807, 27, 48, 28, 1, -47 }, // 0x59 'Y'
{ 6969, 21, 48, 25, 2, -47 }, // 0x5A 'Z'
{ 7095, 13, 59, 20, 4, -47 }, // 0x5B '['
{ 7191, 18, 48, 22, 2, -47 }, // 0x5C '\'
{ 7299, 13, 59, 18, 2, -47 }, // 0x5D ']'
{ 7395, 22, 19, 26, 2, -47 }, // 0x5E '^'
{ 7448, 20, 5, 20, 0, 4 }, // 0x5F '_'
{ 7461, 10, 12, 16, 3, -47 }, // 0x60 '`'
{ 7476, 21, 34, 25, 2, -33 }, // 0x61 'a'
{ 7566, 21, 48, 26, 3, -47 }, // 0x62 'b'
{ 7692, 19, 34, 24, 3, -33 }, // 0x63 'c'
{ 7773, 20, 48, 26, 3, -47 }, // 0x64 'd'
{ 7893, 19, 34, 25, 3, -33 }, // 0x65 'e'
{ 7974, 16, 46, 17, 1, -45 }, // 0x66 'f'
{ 8066, 25, 46, 26, 1, -34 }, // 0x67 'g'
{ 8210, 20, 48, 26, 3, -47 }, // 0x68 'h'
{ 8330, 6, 46, 13, 4, -45 }, // 0x69 'i'
{ 8365, 11, 55, 14, -1, -45 }, // 0x6A 'j'
{ 8441, 22, 48, 25, 3, -47 }, // 0x6B 'k'
{ 8573, 6, 48, 13, 4, -47 }, // 0x6C 'l'
{ 8609, 34, 35, 40, 3, -34 }, // 0x6D 'm'
{ 8758, 20, 34, 26, 3, -33 }, // 0x6E 'n'
{ 8843, 19, 34, 25, 3, -33 }, // 0x6F 'o'
{ 8924, 21, 45, 26, 3, -33 }, // 0x70 'p'
{ 9043, 20, 45, 26, 3, -33 }, // 0x71 'q'
{ 9156, 15, 34, 19, 3, -33 }, // 0x72 'r'
{ 9220, 19, 34, 22, 1, -33 }, // 0x73 's'
{ 9301, 16, 44, 18, 1, -43 }, // 0x74 't'
{ 9389, 20, 34, 26, 3, -33 }, // 0x75 'u'
{ 9474, 21, 34, 23, 1, -33 }, // 0x76 'v'
{ 9564, 31, 34, 35, 2, -33 }, // 0x77 'w'
{ 9696, 21, 34, 23, 1, -33 }, // 0x78 'x'
{ 9786, 21, 43, 23, 1, -33 }, // 0x79 'y'
{ 9899, 17, 34, 20, 2, -33 }, // 0x7A 'z'
{ 9972, 14, 59, 18, 2, -47 }, // 0x7B '{'
{ 10076, 6, 57, 14, 4, -47 }, // 0x7C '|'
{ 10119, 14, 59, 19, 3, -47 }, // 0x7D '}'
{ 10223, 22, 9, 26, 2, -29 } }; // 0x7E '~'
const GFXfont Oswald_Regular30pt7b PROGMEM = {
(uint8_t *)Oswald_Regular30pt7bBitmaps,
(GFXglyph *)Oswald_Regular30pt7bGlyphs,
0x20, 0x7E, 87 };
// Approx. 10920 bytes

7817
src/fonts/oswald-90.h Normal file

File diff suppressed because it is too large Load diff

296
src/fonts/ubuntu-italic12.h Normal file
View file

@ -0,0 +1,296 @@
const uint8_t Ubuntu_Italic12pt7bBitmaps[] PROGMEM = {
0x00, 0x0C, 0x31, 0x86, 0x18, 0x63, 0x0C, 0x30, 0x86, 0x00, 0x00, 0x0E,
0x38, 0xE0, 0x66, 0xCF, 0x36, 0x6C, 0xD1, 0x00, 0x01, 0x83, 0x03, 0x06,
0x03, 0x06, 0x03, 0x06, 0x7F, 0xFF, 0x7F, 0xFF, 0x0C, 0x18, 0x0C, 0x18,
0x1C, 0x38, 0x18, 0x30, 0x18, 0x30, 0xFF, 0xFE, 0xFF, 0xFE, 0x60, 0xC0,
0x60, 0xC0, 0x60, 0xC0, 0xC1, 0x80, 0x00, 0x60, 0x07, 0x00, 0x30, 0x07,
0xE0, 0xFF, 0x86, 0x08, 0x60, 0x03, 0x00, 0x18, 0x00, 0xE0, 0x03, 0xC0,
0x0F, 0x00, 0x1C, 0x00, 0x70, 0x01, 0x80, 0x0C, 0x00, 0x62, 0x0E, 0x3F,
0xF0, 0xFE, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x00, 0x1E, 0x03, 0x23, 0x06,
0x63, 0x0C, 0xC3, 0x18, 0xC3, 0x30, 0xC3, 0x70, 0xC6, 0x60, 0xC4, 0xC0,
0x79, 0x9E, 0x03, 0x23, 0x06, 0x63, 0x0E, 0xC3, 0x0C, 0xC3, 0x18, 0xC3,
0x30, 0xC6, 0x60, 0xC4, 0xC0, 0x78, 0x03, 0xE0, 0x1F, 0xC0, 0xE3, 0x03,
0x0C, 0x0C, 0x30, 0x31, 0x80, 0xCE, 0x01, 0xF0, 0x0F, 0x00, 0xFC, 0x27,
0x39, 0xD8, 0x66, 0xC0, 0xF3, 0x01, 0xCC, 0x06, 0x38, 0x7C, 0x7F, 0xB0,
0xF8, 0x60, 0x6F, 0x6D, 0x00, 0x01, 0x01, 0xC1, 0xC1, 0xC0, 0xC0, 0xC0,
0xE0, 0x60, 0x70, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0,
0x60, 0x30, 0x18, 0x06, 0x03, 0x01, 0x00, 0x02, 0x06, 0x06, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x0C, 0x0C,
0x18, 0x18, 0x30, 0x70, 0xE0, 0x40, 0x1C, 0x0E, 0x37, 0x7D, 0x77, 0xF0,
0xE0, 0xD8, 0xEE, 0x22, 0x00, 0x03, 0x00, 0x60, 0x18, 0x03, 0x00, 0x61,
0xFF, 0xFF, 0xF8, 0x60, 0x0C, 0x01, 0x80, 0x60, 0x0C, 0x00, 0x18, 0xCC,
0x67, 0x33, 0x00, 0xFF, 0xF0, 0xFF, 0x80, 0x00, 0x07, 0x00, 0x06, 0x00,
0x0E, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00,
0x60, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x00, 0x06,
0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x70,
0x00, 0x60, 0x00, 0xE0, 0x00, 0x03, 0xC0, 0xFE, 0x1C, 0x73, 0x83, 0x30,
0x37, 0x03, 0x60, 0x36, 0x03, 0xC0, 0x3C, 0x06, 0xC0, 0x6C, 0x0E, 0xC0,
0xCC, 0x1C, 0xE3, 0x87, 0xF0, 0x3C, 0x00, 0x06, 0x3C, 0xF7, 0xEC, 0xC1,
0x86, 0x0C, 0x18, 0x30, 0xE1, 0x83, 0x06, 0x0C, 0x30, 0x60, 0x07, 0xC0,
0xFE, 0x1C, 0x71, 0x03, 0x00, 0x30, 0x03, 0x00, 0x60, 0x0E, 0x01, 0xC0,
0x38, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x60, 0x0F, 0xFC, 0xFF, 0xC0,
0x07, 0xC0, 0xFE, 0x08, 0x70, 0x03, 0x00, 0x30, 0x07, 0x00, 0xE0, 0x7C,
0x07, 0xC0, 0x0E, 0x00, 0x60, 0x06, 0x00, 0x60, 0x0E, 0x41, 0xCF, 0xF8,
0x7E, 0x00, 0x00, 0x38, 0x03, 0x80, 0x3C, 0x03, 0x60, 0x33, 0x03, 0x38,
0x31, 0x83, 0x8C, 0x18, 0x61, 0x87, 0x18, 0x30, 0xFF, 0xEF, 0xFF, 0x00,
0x60, 0x03, 0x00, 0x30, 0x01, 0x80, 0x03, 0xF8, 0x1F, 0xC1, 0x80, 0x0C,
0x00, 0xC0, 0x06, 0x00, 0x3C, 0x03, 0xF8, 0x01, 0xC0, 0x07, 0x00, 0x18,
0x00, 0xC0, 0x06, 0x00, 0x71, 0x07, 0x1F, 0xF0, 0x7E, 0x00, 0x00, 0xF0,
0x3F, 0x0F, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x6F, 0x87, 0xFC, 0xF0, 0xEC,
0x06, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xE1, 0xC7, 0xF8, 0x3E, 0x00,
0x7F, 0xF7, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x38, 0x07, 0x00, 0x60,
0x0C, 0x01, 0xC0, 0x18, 0x03, 0x00, 0x30, 0x06, 0x00, 0x60, 0x0E, 0x00,
0xC0, 0x00, 0x07, 0xE0, 0x7F, 0x87, 0x0E, 0x70, 0x33, 0x01, 0x98, 0x0C,
0xE0, 0xC3, 0xFC, 0x1F, 0x81, 0xCE, 0x18, 0x39, 0x80, 0xCC, 0x06, 0x60,
0x73, 0x87, 0x0F, 0xF0, 0x3F, 0x00, 0x03, 0xE0, 0x7F, 0x87, 0x0E, 0x30,
0x33, 0x01, 0x98, 0x0C, 0xC0, 0x67, 0x07, 0x1F, 0xF8, 0x7F, 0x80, 0x0C,
0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x1E, 0x1F, 0xC0, 0xF8, 0x00, 0x39, 0xCE,
0x00, 0x00, 0x00, 0x00, 0x39, 0xCE, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0xC3, 0x06, 0x1C, 0x30, 0xC0, 0x00, 0x10,
0x0F, 0x07, 0xE1, 0xF0, 0xF8, 0x0E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80,
0x1C, 0x00, 0x00, 0x7F, 0xF7, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE,
0xFF, 0xE0, 0x00, 0x03, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x06, 0x03,
0xE0, 0xF8, 0x7E, 0x0F, 0x00, 0x80, 0x00, 0x1F, 0x1F, 0xC8, 0x60, 0x30,
0x18, 0x18, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x01,
0xC0, 0xE0, 0x70, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF8, 0x07, 0x81, 0xC0,
0xE0, 0x0E, 0x1C, 0x00, 0x73, 0x87, 0xC3, 0x31, 0xFE, 0x36, 0x38, 0x63,
0x63, 0x0C, 0x3C, 0x60, 0xC3, 0xC6, 0x0C, 0x3C, 0x61, 0x86, 0xC6, 0x18,
0x6C, 0x71, 0x8E, 0xC3, 0xFF, 0xCC, 0x1E, 0xF0, 0x60, 0x00, 0x07, 0x00,
0x00, 0x38, 0x10, 0x01, 0xFF, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x30, 0x01,
0xC0, 0x0F, 0x80, 0x36, 0x01, 0xD8, 0x06, 0x60, 0x31, 0x81, 0xC6, 0x06,
0x18, 0x38, 0x61, 0xC1, 0x87, 0xFF, 0x3F, 0xFC, 0xC0, 0x36, 0x00, 0xD8,
0x03, 0xC0, 0x0C, 0x0F, 0xF0, 0x3F, 0xE1, 0x81, 0xC6, 0x03, 0x18, 0x0C,
0x60, 0x33, 0x03, 0x8F, 0xFC, 0x3F, 0xF0, 0xC0, 0xE3, 0x01, 0x98, 0x06,
0x60, 0x19, 0x80, 0xE6, 0x0F, 0x3F, 0xF8, 0xFF, 0x00, 0x01, 0xF8, 0x1F,
0xF1, 0xE0, 0x8E, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0,
0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x80, 0x07, 0x06, 0x0F,
0xF8, 0x1F, 0xC0, 0x0F, 0xE0, 0x1F, 0xF0, 0x60, 0x70, 0xC0, 0x61, 0x80,
0x63, 0x00, 0xCE, 0x01, 0x98, 0x03, 0x30, 0x06, 0x60, 0x0C, 0xC0, 0x33,
0x00, 0x66, 0x01, 0x8C, 0x07, 0x18, 0x3C, 0x7F, 0xE0, 0xFF, 0x00, 0x0F,
0xF8, 0x7F, 0xC6, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0xE0, 0x07, 0xF8,
0x3F, 0xC1, 0x80, 0x0C, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x1F,
0xF8, 0xFF, 0xC0, 0x0F, 0xFC, 0x3F, 0xF1, 0x80, 0x06, 0x00, 0x18, 0x00,
0x60, 0x03, 0x00, 0x0F, 0xF8, 0x3F, 0xE0, 0xC0, 0x03, 0x00, 0x18, 0x00,
0x60, 0x01, 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x01, 0xFC, 0x0F,
0xFC, 0x78, 0x11, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x70, 0x00,
0xC0, 0x01, 0x80, 0x33, 0x00, 0xE6, 0x01, 0x8C, 0x03, 0x1C, 0x06, 0x1C,
0x18, 0x1F, 0xF0, 0x1F, 0xC0, 0x0C, 0x03, 0x0C, 0x03, 0x18, 0x06, 0x18,
0x06, 0x18, 0x06, 0x18, 0x06, 0x38, 0x0C, 0x3F, 0xFC, 0x3F, 0xFC, 0x30,
0x0C, 0x30, 0x1C, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0xC0,
0x30, 0xC0, 0x30, 0x0C, 0x31, 0x86, 0x18, 0x63, 0x0C, 0x30, 0xC7, 0x18,
0x61, 0x86, 0x30, 0xC0, 0x00, 0x18, 0x00, 0xC0, 0x0C, 0x00, 0x60, 0x03,
0x00, 0x38, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x06, 0x00, 0x30, 0x01, 0x80,
0x0C, 0x00, 0xC1, 0x0E, 0x1F, 0xE0, 0x7E, 0x00, 0x0C, 0x07, 0x0C, 0x0E,
0x18, 0x3C, 0x18, 0x70, 0x18, 0xE0, 0x19, 0xC0, 0x3B, 0x80, 0x3F, 0x00,
0x3E, 0x00, 0x37, 0x00, 0x33, 0x80, 0x61, 0xC0, 0x61, 0xC0, 0x60, 0xE0,
0x60, 0x70, 0xC0, 0x30, 0xC0, 0x38, 0x0C, 0x03, 0x01, 0x80, 0x60, 0x18,
0x06, 0x03, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x01, 0x80, 0x60, 0x18, 0x06,
0x03, 0xFF, 0xFF, 0xC0, 0x06, 0x00, 0xE1, 0xC0, 0x1C, 0x3C, 0x07, 0x87,
0x81, 0xF1, 0xF0, 0x3E, 0x36, 0x0D, 0xC6, 0xE1, 0xB1, 0xCC, 0x66, 0x31,
0x8C, 0xC6, 0x33, 0x18, 0xC6, 0xC3, 0x30, 0xD8, 0xE6, 0x0E, 0x18, 0xC1,
0xC3, 0x38, 0x30, 0x66, 0x00, 0x0C, 0xC0, 0x01, 0x80, 0x0C, 0x01, 0x87,
0x00, 0xC7, 0x80, 0xC3, 0xE0, 0x61, 0xB0, 0x30, 0xDC, 0x18, 0xE6, 0x18,
0x63, 0x8C, 0x30, 0xC6, 0x18, 0x73, 0x0C, 0x1B, 0x8C, 0x0D, 0x86, 0x03,
0xC3, 0x01, 0xE1, 0x80, 0xF1, 0x80, 0x30, 0xC0, 0x18, 0x00, 0x03, 0xF0,
0x1F, 0xF0, 0x78, 0x71, 0xC0, 0x73, 0x00, 0x6C, 0x00, 0xD8, 0x01, 0xE0,
0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x36, 0x00, 0x6C, 0x01, 0x9C, 0x07,
0x1C, 0x3C, 0x1F, 0xF0, 0x1F, 0x80, 0x0F, 0xE0, 0x3F, 0xE1, 0x81, 0xC6,
0x03, 0x18, 0x0C, 0x60, 0x33, 0x80, 0xCC, 0x06, 0x30, 0x78, 0xFF, 0x83,
0xF8, 0x18, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x00,
0x03, 0xF0, 0x1F, 0xF0, 0x78, 0x71, 0xC0, 0x73, 0x00, 0x6C, 0x00, 0xD8,
0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x36, 0x00, 0x6C, 0x01,
0x9C, 0x07, 0x1C, 0x3C, 0x1F, 0xF0, 0x1F, 0x80, 0x0C, 0x00, 0x1E, 0x00,
0x1F, 0x00, 0x0E, 0x00, 0x0F, 0xE0, 0x3F, 0xE1, 0x81, 0xC6, 0x03, 0x18,
0x0C, 0x60, 0x33, 0x81, 0xCC, 0x1E, 0x3F, 0xF0, 0xFF, 0x83, 0x0C, 0x18,
0x18, 0x60, 0x61, 0x80, 0xC6, 0x03, 0x30, 0x0C, 0xC0, 0x18, 0x03, 0xF0,
0x7F, 0xC3, 0x04, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x70, 0x01, 0xE0, 0x07,
0x80, 0x0E, 0x00, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x31, 0x07, 0x1F, 0xF0,
0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x0C,
0x01, 0xC0, 0x18, 0x01, 0x80, 0x18, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30,
0x06, 0x00, 0x60, 0x00, 0x18, 0x06, 0x30, 0x1C, 0xC0, 0x31, 0x80, 0x63,
0x00, 0xC6, 0x03, 0x18, 0x06, 0x30, 0x0C, 0x60, 0x39, 0xC0, 0x63, 0x00,
0xC6, 0x01, 0x8C, 0x06, 0x18, 0x0C, 0x38, 0x70, 0x3F, 0xE0, 0x3F, 0x00,
0xC0, 0x0F, 0x00, 0x6C, 0x01, 0xB0, 0x0C, 0xC0, 0x33, 0x01, 0x8E, 0x0E,
0x18, 0x30, 0x61, 0xC1, 0x86, 0x06, 0x30, 0x19, 0xC0, 0x66, 0x01, 0xB0,
0x07, 0xC0, 0x0E, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xC0,
0xC0, 0x6C, 0x0C, 0x06, 0xC1, 0xC0, 0xCC, 0x1C, 0x0C, 0xC3, 0x41, 0x8C,
0x36, 0x18, 0xC6, 0x63, 0x8C, 0x66, 0x30, 0xCC, 0x67, 0x0D, 0x86, 0x60,
0xD8, 0x6E, 0x0F, 0x06, 0xC0, 0xF0, 0x7C, 0x0E, 0x03, 0x80, 0xE0, 0x38,
0x00, 0x0C, 0x01, 0xC1, 0x80, 0xE0, 0x60, 0x30, 0x0C, 0x18, 0x03, 0x0C,
0x00, 0x66, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x78, 0x00,
0x33, 0x00, 0x18, 0xC0, 0x0C, 0x18, 0x06, 0x06, 0x03, 0x00, 0xC1, 0x80,
0x30, 0xC0, 0x06, 0x00, 0xC0, 0x1F, 0x01, 0x98, 0x18, 0xC0, 0xC3, 0x0C,
0x18, 0xC0, 0xE6, 0x03, 0x60, 0x1E, 0x00, 0x70, 0x03, 0x00, 0x18, 0x01,
0x80, 0x0C, 0x00, 0x60, 0x07, 0x00, 0x30, 0x00, 0x0F, 0xFE, 0x1F, 0xFC,
0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03,
0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0E, 0x00, 0x38, 0x00,
0x7F, 0xF8, 0xFF, 0xF0, 0x03, 0xE0, 0x7C, 0x18, 0x03, 0x00, 0x60, 0x0C,
0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x60, 0x0C, 0x01, 0x80, 0x70, 0x0C,
0x01, 0x80, 0x30, 0x0E, 0x01, 0x80, 0x30, 0x06, 0x01, 0xF8, 0x3F, 0x00,
0xC6, 0x31, 0x86, 0x31, 0x8C, 0x63, 0x18, 0xC3, 0x18, 0xC6, 0x31, 0x8C,
0x31, 0x8C, 0x60, 0x07, 0xE0, 0xFC, 0x03, 0x00, 0x60, 0x0C, 0x03, 0x80,
0x60, 0x0C, 0x01, 0x80, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x0C, 0x01, 0x80,
0x30, 0x06, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC1, 0xF0, 0x3E, 0x00, 0x01,
0x80, 0x38, 0x06, 0xC0, 0xCC, 0x1C, 0xC3, 0x86, 0x30, 0x66, 0x07, 0x40,
0x20, 0xFF, 0xFF, 0xFF, 0x67, 0x1C, 0x71, 0x00, 0x03, 0xE0, 0xFF, 0x3C,
0x33, 0x06, 0x60, 0x6E, 0x06, 0xC0, 0x6C, 0x0C, 0xC0, 0xCC, 0x0C, 0xE1,
0xC7, 0xFC, 0x3E, 0xC0, 0x0C, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x18, 0x01,
0xBC, 0x1F, 0xE3, 0x87, 0x30, 0x33, 0x03, 0x30, 0x36, 0x03, 0x60, 0x76,
0x06, 0x60, 0xEC, 0x3C, 0xFF, 0x87, 0xE0, 0x07, 0xE3, 0xFC, 0xE1, 0x38,
0x06, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x82, 0x3F, 0xC1,
0xF0, 0x00, 0x0C, 0x00, 0x70, 0x01, 0x80, 0x06, 0x00, 0x18, 0x0F, 0xC0,
0xFF, 0x0F, 0x0C, 0x30, 0x61, 0x81, 0x86, 0x06, 0x30, 0x38, 0xC0, 0xC3,
0x03, 0x0C, 0x0C, 0x38, 0x70, 0x7F, 0xC0, 0xF3, 0x00, 0x07, 0xC3, 0xFC,
0xE1, 0xB0, 0x36, 0x07, 0x83, 0xBF, 0xE7, 0xF0, 0xC0, 0x18, 0x03, 0x82,
0x3F, 0xC3, 0xF0, 0x00, 0x7C, 0x07, 0xE0, 0x18, 0x00, 0xE0, 0x03, 0x00,
0x0F, 0xC0, 0x7F, 0x01, 0x80, 0x06, 0x00, 0x18, 0x00, 0xC0, 0x03, 0x00,
0x0C, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x00,
0x0C, 0x00, 0x60, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0xF0, 0xF0, 0xC3,
0x06, 0x18, 0x18, 0x60, 0x63, 0x01, 0x8C, 0x0C, 0x30, 0x30, 0xC0, 0xC3,
0x8F, 0x07, 0xF8, 0x0F, 0x60, 0x03, 0x84, 0x1C, 0x3F, 0xF0, 0x7F, 0x00,
0x0C, 0x01, 0x80, 0x70, 0x0C, 0x01, 0x80, 0x3F, 0x07, 0xF1, 0x87, 0x30,
0x66, 0x0C, 0xC1, 0xB8, 0x36, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0xC1, 0x98,
0x30, 0x0C, 0x30, 0x00, 0x18, 0x63, 0x0C, 0x30, 0xC7, 0x18, 0x61, 0x8E,
0x30, 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x80, 0x60,
0x0C, 0x01, 0x80, 0x30, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x01, 0x80, 0x30,
0x06, 0x01, 0xC0, 0x30, 0x7E, 0x0F, 0x00, 0x0C, 0x00, 0xC0, 0x18, 0x01,
0x80, 0x18, 0x01, 0x83, 0x10, 0xC3, 0x18, 0x33, 0x03, 0x60, 0x2C, 0x07,
0xC0, 0x6C, 0x06, 0x60, 0x63, 0x06, 0x38, 0xC1, 0x8C, 0x1C, 0x18, 0xCE,
0x63, 0x18, 0xCC, 0x63, 0x19, 0xCC, 0x63, 0x18, 0xF3, 0x80, 0x0F, 0xCF,
0x07, 0xFF, 0xE1, 0x8F, 0x1C, 0xC1, 0x83, 0x30, 0x60, 0xCC, 0x18, 0x33,
0x06, 0x0D, 0x83, 0x06, 0x60, 0xC1, 0x98, 0x30, 0x66, 0x0C, 0x1B, 0x06,
0x0C, 0xC1, 0x83, 0x00, 0x0F, 0x83, 0xF8, 0x63, 0x98, 0x33, 0x06, 0x60,
0xCC, 0x1B, 0x06, 0x60, 0xCC, 0x19, 0x83, 0x60, 0xCC, 0x18, 0x0F, 0x83,
0xF8, 0xE3, 0xB8, 0x36, 0x07, 0xC0, 0xF0, 0x1E, 0x07, 0xC0, 0xD8, 0x3B,
0x8E, 0x3F, 0x83, 0xE0, 0x07, 0xE0, 0x7F, 0x83, 0x0E, 0x30, 0x31, 0x81,
0x8C, 0x0C, 0x60, 0x66, 0x07, 0x30, 0x31, 0x83, 0x8C, 0x78, 0xFF, 0x87,
0xF0, 0x30, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x00, 0x03, 0xE0, 0xFF, 0x3C,
0x33, 0x06, 0x60, 0x6E, 0x06, 0xC0, 0x6C, 0x0C, 0xC0, 0xCC, 0x0C, 0xE1,
0xC7, 0xF8, 0x3D, 0x80, 0x18, 0x03, 0x80, 0x30, 0x03, 0x00, 0x0F, 0x8F,
0xC6, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x0C,
0x00, 0x0F, 0x87, 0xF3, 0x88, 0xC0, 0x30, 0x0F, 0x01, 0xF0, 0x1E, 0x01,
0x80, 0x64, 0x3B, 0xFC, 0x7E, 0x00, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0xF9,
0xFD, 0x80, 0xC0, 0x60, 0x70, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x11, 0xF8,
0x78, 0x00, 0x30, 0x66, 0x0D, 0x83, 0x30, 0x66, 0x0D, 0x81, 0xB0, 0x36,
0x0C, 0xC1, 0x98, 0x33, 0x8E, 0x3F, 0xC7, 0xD8, 0xE0, 0x6C, 0x1D, 0x83,
0x30, 0x66, 0x18, 0xC7, 0x18, 0xC3, 0x38, 0x66, 0x0D, 0xC1, 0xF0, 0x3C,
0x03, 0x00, 0xC0, 0xC0, 0xF0, 0x30, 0x7C, 0x0C, 0x1B, 0x07, 0x06, 0xC1,
0xC3, 0x30, 0xF0, 0xCE, 0x24, 0x63, 0x99, 0x98, 0x6C, 0x6C, 0x1B, 0x1F,
0x07, 0x87, 0x81, 0xE1, 0xE0, 0x70, 0x70, 0x00, 0x18, 0x70, 0xC6, 0x0C,
0xC0, 0x7C, 0x07, 0x80, 0x70, 0x07, 0x00, 0xF8, 0x1D, 0x81, 0x9C, 0x30,
0xC6, 0x0C, 0xE0, 0x60, 0x0C, 0x0C, 0x30, 0x70, 0xC1, 0x83, 0x06, 0x0C,
0x38, 0x38, 0xC0, 0x63, 0x01, 0x98, 0x06, 0x60, 0x1B, 0x00, 0x7C, 0x01,
0xE0, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x3F, 0x00, 0xF0, 0x00, 0x1F, 0xF1,
0xFF, 0x00, 0x60, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07,
0x00, 0xE0, 0x0F, 0xFC, 0xFF, 0xC0, 0x03, 0x83, 0xC3, 0x81, 0x80, 0xC0,
0x60, 0x60, 0x30, 0x18, 0x18, 0x38, 0x1C, 0x06, 0x03, 0x01, 0x80, 0xC0,
0x60, 0x60, 0x30, 0x18, 0x0C, 0x07, 0x81, 0xC0, 0x03, 0x03, 0x06, 0x06,
0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30,
0x30, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x03, 0x80, 0x78, 0x03, 0x00,
0x60, 0x0C, 0x01, 0x80, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x03, 0x80, 0xF0,
0x18, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC1,
0xF8, 0x3C, 0x00, 0x3C, 0x1B, 0xF1, 0xF8, 0xFD, 0x83, 0xC0 };
const GFXglyph Ubuntu_Italic12pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 6, 0, 0 }, // 0x20 ' '
{ 1, 6, 17, 6, 2, -16 }, // 0x21 '!'
{ 14, 7, 6, 10, 6, -17 }, // 0x22 '"'
{ 20, 16, 17, 16, 2, -16 }, // 0x23 '#'
{ 54, 13, 23, 14, 2, -19 }, // 0x24 '$'
{ 92, 16, 17, 20, 4, -16 }, // 0x25 '%'
{ 126, 14, 18, 15, 2, -17 }, // 0x26 '&'
{ 158, 3, 6, 6, 6, -17 }, // 0x27 '''
{ 161, 9, 23, 8, 4, -18 }, // 0x28 '('
{ 187, 8, 23, 8, -1, -18 }, // 0x29 ')'
{ 210, 9, 9, 11, 4, -16 }, // 0x2A '*'
{ 221, 11, 12, 14, 3, -12 }, // 0x2B '+'
{ 238, 5, 7, 6, 0, -2 }, // 0x2C ','
{ 243, 6, 2, 7, 2, -7 }, // 0x2D '-'
{ 245, 3, 3, 6, 2, -2 }, // 0x2E '.'
{ 247, 16, 23, 9, -2, -18 }, // 0x2F '/'
{ 293, 12, 17, 14, 3, -16 }, // 0x30 '0'
{ 319, 7, 17, 14, 6, -16 }, // 0x31 '1'
{ 334, 12, 17, 14, 3, -16 }, // 0x32 '2'
{ 360, 12, 17, 14, 3, -16 }, // 0x33 '3'
{ 386, 13, 17, 14, 2, -16 }, // 0x34 '4'
{ 414, 13, 17, 14, 2, -16 }, // 0x35 '5'
{ 442, 12, 17, 14, 3, -16 }, // 0x36 '6'
{ 468, 12, 17, 14, 4, -16 }, // 0x37 '7'
{ 494, 13, 17, 14, 3, -16 }, // 0x38 '8'
{ 522, 13, 17, 14, 2, -16 }, // 0x39 '9'
{ 550, 5, 13, 6, 2, -12 }, // 0x3A ':'
{ 559, 7, 17, 6, 0, -12 }, // 0x3B ';'
{ 574, 12, 11, 14, 3, -12 }, // 0x3C '<'
{ 591, 12, 7, 14, 3, -10 }, // 0x3D '='
{ 602, 12, 11, 14, 3, -12 }, // 0x3E '>'
{ 619, 9, 18, 9, 3, -17 }, // 0x3F '?'
{ 640, 20, 21, 22, 3, -16 }, // 0x40 '@'
{ 693, 14, 17, 15, 0, -16 }, // 0x41 'A'
{ 723, 14, 17, 15, 2, -16 }, // 0x42 'B'
{ 753, 14, 17, 14, 3, -16 }, // 0x43 'C'
{ 783, 15, 17, 17, 3, -16 }, // 0x44 'D'
{ 815, 13, 17, 13, 2, -16 }, // 0x45 'E'
{ 843, 14, 17, 13, 2, -16 }, // 0x46 'F'
{ 873, 15, 17, 16, 3, -16 }, // 0x47 'G'
{ 905, 16, 17, 16, 2, -16 }, // 0x48 'H'
{ 939, 6, 17, 6, 2, -16 }, // 0x49 'I'
{ 952, 13, 17, 12, 1, -16 }, // 0x4A 'J'
{ 980, 16, 17, 15, 2, -16 }, // 0x4B 'K'
{ 1014, 10, 17, 12, 2, -16 }, // 0x4C 'L'
{ 1036, 19, 17, 20, 2, -16 }, // 0x4D 'M'
{ 1077, 17, 17, 17, 2, -16 }, // 0x4E 'N'
{ 1114, 15, 17, 18, 4, -16 }, // 0x4F 'O'
{ 1146, 14, 17, 14, 2, -16 }, // 0x50 'P'
{ 1176, 15, 21, 18, 4, -16 }, // 0x51 'Q'
{ 1216, 14, 17, 15, 2, -16 }, // 0x52 'R'
{ 1246, 13, 17, 12, 1, -16 }, // 0x53 'S'
{ 1274, 12, 17, 13, 4, -16 }, // 0x54 'T'
{ 1300, 15, 17, 16, 3, -16 }, // 0x55 'U'
{ 1332, 14, 17, 15, 4, -16 }, // 0x56 'V'
{ 1362, 20, 17, 22, 5, -16 }, // 0x57 'W'
{ 1405, 18, 17, 15, 0, -16 }, // 0x58 'X'
{ 1444, 13, 17, 14, 4, -16 }, // 0x59 'Y'
{ 1472, 15, 17, 13, 1, -16 }, // 0x5A 'Z'
{ 1504, 11, 23, 8, 1, -18 }, // 0x5B '['
{ 1536, 5, 23, 9, 3, -18 }, // 0x5C '\'
{ 1551, 11, 23, 8, -1, -18 }, // 0x5D ']'
{ 1583, 12, 9, 14, 3, -16 }, // 0x5E '^'
{ 1597, 12, 2, 12, -1, 3 }, // 0x5F '_'
{ 1600, 5, 5, 9, 5, -18 }, // 0x60 '`'
{ 1604, 12, 13, 13, 2, -12 }, // 0x61 'a'
{ 1624, 12, 18, 13, 2, -17 }, // 0x62 'b'
{ 1651, 11, 13, 11, 2, -12 }, // 0x63 'c'
{ 1669, 14, 18, 13, 2, -17 }, // 0x64 'd'
{ 1701, 11, 13, 12, 2, -12 }, // 0x65 'e'
{ 1719, 14, 22, 9, 0, -17 }, // 0x66 'f'
{ 1758, 14, 17, 13, 0, -12 }, // 0x67 'g'
{ 1788, 11, 18, 13, 2, -17 }, // 0x68 'h'
{ 1813, 6, 17, 6, 2, -16 }, // 0x69 'i'
{ 1826, 11, 21, 6, -3, -16 }, // 0x6A 'j'
{ 1855, 12, 18, 12, 2, -17 }, // 0x6B 'k'
{ 1882, 5, 18, 7, 3, -17 }, // 0x6C 'l'
{ 1894, 18, 13, 20, 2, -12 }, // 0x6D 'm'
{ 1924, 11, 13, 13, 2, -12 }, // 0x6E 'n'
{ 1942, 11, 13, 13, 2, -12 }, // 0x6F 'o'
{ 1960, 13, 17, 13, 1, -12 }, // 0x70 'p'
{ 1988, 12, 17, 13, 2, -12 }, // 0x71 'q'
{ 2014, 9, 13, 9, 2, -12 }, // 0x72 'r'
{ 2029, 10, 13, 10, 1, -12 }, // 0x73 's'
{ 2046, 9, 17, 9, 3, -16 }, // 0x74 't'
{ 2066, 11, 13, 13, 3, -12 }, // 0x75 'u'
{ 2084, 11, 13, 12, 3, -12 }, // 0x76 'v'
{ 2102, 18, 13, 19, 3, -12 }, // 0x77 'w'
{ 2132, 12, 13, 11, 1, -12 }, // 0x78 'x'
{ 2152, 14, 17, 11, -1, -12 }, // 0x79 'y'
{ 2182, 12, 13, 11, 1, -12 }, // 0x7A 'z'
{ 2202, 9, 23, 8, 3, -18 }, // 0x7B '{'
{ 2228, 8, 23, 7, 1, -18 }, // 0x7C '|'
{ 2251, 11, 23, 8, -1, -18 }, // 0x7D '}'
{ 2283, 13, 4, 14, 2, -8 } }; // 0x7E '~'
const GFXfont Ubuntu_Italic12pt7b PROGMEM = {
(uint8_t *)Ubuntu_Italic12pt7bBitmaps,
(GFXglyph *)Ubuntu_Italic12pt7bGlyphs,
0x20, 0x7E, 27 };
// Approx. 2962 bytes

2087
src/fonts/ubuntu-italic40.h Normal file

File diff suppressed because it is too large Load diff

4672
src/fonts/ubuntu-italic60.h Normal file

File diff suppressed because it is too large Load diff

6260
src/fonts/ubuntu-italic70.h Normal file

File diff suppressed because it is too large Load diff

0
src/lib/epd.cpp Normal file
View file

0
src/lib/epd.hpp Normal file
View file

216
src/lib/functions.cpp Normal file
View file

@ -0,0 +1,216 @@
#include "functions.hpp"
Preferences preferences;
uint timerSeconds;
uint currentScreen;
std::map<int, std::string> screenNameMap;
#ifndef NO_MCP
Adafruit_MCP23X17 mcp;
#endif
bool timerRunning = true;
int fgColor;
int bgColor;
uint wifiConnectionLostCount = 0;
#ifdef WITH_RGB_LED
#ifndef NEOPIXEL_PIN
#define NEOPIXEL_PIN 34
#endif
#ifndef NEOPIXEL_COUNT
#define NEOPIXEL_COUNT 3
#endif
Adafruit_NeoPixel pixels(NEOPIXEL_COUNT, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);
#endif
String softAP_SSID;
String softAP_password;
WiFiManager wm;
bool screenVisible[5];
void setupSoftAP()
{
byte mac[6];
WiFi.macAddress(mac);
softAP_SSID = String("BTClock" + String(mac[3], 16) + String(mac[1], 16));
softAP_password = base64::encode(String(mac[2]) + String(mac[4]) + String(mac[5])).substring(2, 12);
}
void setupComponents()
{
#ifndef NO_MCP
if (!mcp.begin_I2C())
{
Serial.println("Error MCP23017");
while (1)
;
}
else
{
Serial.println("MCP23017 ok");
}
#endif
#ifdef WITH_RGB_LED
pixels.begin();
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
pixels.setPixelColor(1, pixels.Color(0, 255, 0));
pixels.setPixelColor(2, pixels.Color(0, 0, 255));
pixels.setPixelColor(3, pixels.Color(255, 255, 255));
pixels.show();
#endif
#ifdef WITH_BUTTONS
for (int i = 0; i < 4; i++)
{
mcp.pinMode(i, INPUT_PULLUP);
}
#endif
}
void synchronizeTime()
{
configTime(3600, 0, NTP_SERVER);
struct tm timeinfo;
while (!getLocalTime(&timeinfo))
{
configTime(3600, 0, NTP_SERVER);
delay(500);
Serial.println("Retry set time");
}
rtc.setTimeStruct(timeinfo);
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
void setupWifi()
{
setupSoftAP();
wm.setAPCallback([&](WiFiManager *wifiManager)
{
showSetupQr(softAP_SSID, softAP_password);
Serial.printf("Entered config mode:ip=%s, ssid='%s', pass='%s'\n",
WiFi.softAPIP().toString().c_str(),
wifiManager->getConfigPortalSSID().c_str(),
softAP_password.c_str()); });
bool ac = wm.autoConnect(softAP_SSID.c_str(), softAP_password.c_str());
}
void setupPreferences()
{
preferences.begin("btclock", false);
timerSeconds = preferences.getUInt("timerSeconds", 1800);
currentScreen = preferences.getUInt("currentScreen", 0);
// handleScreenTasks(currentScreen);
fgColor = preferences.getUInt("fgColor", DEFAULT_FG_COLOR);
bgColor = preferences.getUInt("bgColor", DEFAULT_BG_COLOR);
preferences.getBool("ledFlashOnUpd", false);
// screenNameMap = {{SCREEN_BLOCK_HEIGHT, "Block Height"};
screenNameMap = {{SCREEN_BLOCK_HEIGHT, "Block Height"},
{SCREEN_MSCW_TIME, "Sats per dollar"},
{SCREEN_BTC_TICKER, "Ticker"},
{SCREEN_TIME, "Time"},
{SCREEN_HALVING_COUNTDOWN, "Halving countdown"}};
for (int i = 0; i < screenNameMap.size() ; i++) {
String key = "screen" + String(i) + "Visible";
screenVisible[i] = preferences.getBool(key.c_str(), true); // Default to true if not set
}
xTaskCreate(timebasedChangeTask, "tbc", 5000, NULL, 15, NULL);
}
uint getCurrentScreen()
{
return currentScreen;
}
void setCurrentScreen(uint screen)
{
preferences.putUInt("currentScreen", screen);
currentScreen = screen;
handleScreenTasks(screen);
}
void handleScreenTasks(uint screen)
{
if (blockNotifyTaskHandle)
vTaskSuspend(blockNotifyTaskHandle);
if (getPriceTaskHandle)
vTaskSuspend(getPriceTaskHandle);
if (minuteTaskHandle)
vTaskSuspend(minuteTaskHandle);
switch (currentScreen)
{
case SCREEN_BLOCK_HEIGHT:
if (blockNotifyTaskHandle)
vTaskResume(blockNotifyTaskHandle);
break;
case SCREEN_HALVING_COUNTDOWN:
if (blockNotifyTaskHandle)
vTaskResume(blockNotifyTaskHandle);
break;
case SCREEN_BTC_TICKER:
if (getPriceTaskHandle)
vTaskResume(getPriceTaskHandle);
break;
case SCREEN_MSCW_TIME:
if (getPriceTaskHandle)
vTaskResume(getPriceTaskHandle);
break;
case SCREEN_TIME:
if (minuteTaskHandle)
vTaskResume(minuteTaskHandle);
break;
}
}
int getBgColor()
{
return bgColor;
}
int getFgColor()
{
return fgColor;
}
void timebasedChangeTask(void *parameter)
{
uint32_t moment = millis();
for (;;)
{
if (millis() - moment > timerSeconds * 1000 && timerRunning)
{
int newCurrentScreen = (getCurrentScreen() + 1) % screenCount;
String key = "screen" + String(newCurrentScreen) + "Visible";
while (!preferences.getBool(key.c_str(), true)) {
newCurrentScreen = (newCurrentScreen + 1) % screenCount;
key = "screen" + String(newCurrentScreen) + "Visible";
}
setCurrentScreen(newCurrentScreen);
moment = millis();
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setLights(int r, int g, int b)
{
#ifdef WITH_RGB_LED
for (int i = 0; i < NEOPIXEL_COUNT; i++)
{
pixels.setPixelColor(i, pixels.Color(r, g, b));
}
pixels.show();
#endif
}

30
src/lib/functions.hpp Normal file
View file

@ -0,0 +1,30 @@
#include <ESP32Time.h>
#include <WiFi.h>
#include <Arduino.h>
#include <WiFiManager.h>
#include "config.h"
#include "shared.hpp"
#include "Adafruit_GFX.h"
#include "tasks/blocknotify.hpp"
#include "tasks/minute.hpp"
#include "tasks/get_price.hpp"
#include "tasks/epd.hpp"
void setupComponents();
void setupWifi();
void synchronizeTime();
void setupPreferences();
void setLights(int r, int g, int b);
uint getCurrentScreen();
void setCurrentScreen(uint screen);
void handleScreenTasks(uint screen);
void timebasedChangeTask(void *parameter);
GFXfont getFont(uint size);
int getBgColor();
int getFgColor();
void setupSoftAP();

View file

View file

@ -0,0 +1,6 @@
#include "universal_pin.hpp"
class MCP23017_Pin : public UniversalPin
{
};

View file

View file

@ -0,0 +1,6 @@
#include "universal_pin.hpp"
class Native_Pin : public UniversalPin
{
};

View file

View file

@ -0,0 +1,6 @@
#include "universal_pin.hpp"
class PCF8575_Pin : public UniversalPin
{
};

View file

@ -0,0 +1,5 @@
#include "universal_pin.hpp"
UniversalPin::UniversalPin(uint pinNumber) {
this->pinNumber = pinNumber;
}

View file

@ -0,0 +1,12 @@
#include <Arduino.h>
class UniversalPin
{
public:
UniversalPin(uint pinNumber);
virtual void pinMode(uint8_t mode);
virtual uint8_t digitalRead();
virtual void digitalWrite(uint8_t value);
protected:
uint pinNumber;
};

356
src/lib/webserver.cpp Normal file
View file

@ -0,0 +1,356 @@
#include "webserver.hpp"
#include "webserver/OneParamRewrite.hpp"
#include <string>
AsyncWebServer server(80);
void setupWebserver()
{
// Initialize SPIFFS
if (!SPIFFS.begin(true))
{
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
server.serveStatic("/css", SPIFFS, "/css/");
server.serveStatic("/js", SPIFFS, "/js/");
server.serveStatic("/font", SPIFFS, "/font/");
server.on("/", HTTP_GET, onIndex);
server.on("/api/action/pause", HTTP_GET, onApiActionPause);
server.on("/api/action/timer_restart", HTTP_GET, onApiActionTimerRestart);
server.on("/api/action/update", HTTP_GET, onApiActionUpdate);
server.on("/api/full_refresh", HTTP_GET, onApiFullRefresh);
server.on("/api/status", HTTP_GET, onApiStatus);
server.on("/api/settings", HTTP_GET, onApiSettingsGet);
server.on("/api/settings", HTTP_POST, onApiSettingsPost);
server.on("/api/show/screen", HTTP_GET, onApiShowScreen);
server.on("/api/show/text", HTTP_GET, onApiShowText);
// server.on("/api/show/custom", HTTP_GET, onApiShowTextAdvanced);
AsyncCallbackJsonWebHandler *handler = new AsyncCallbackJsonWebHandler("/api/show/custom", onApiShowTextAdvanced);
server.addHandler(handler);
server.on("/api/wifi/scan", HTTP_GET, onApiWifiScan);
server.on("/api/restart", HTTP_GET, onApiRestart);
server.on("/api/countdown", HTTP_GET, onApiCountdown);
server.on("/api/lights/off", HTTP_GET, onApiLightsOff);
server.on("/api/lights/flash", HTTP_GET, onApiLightsFlash);
server.on("/api/lights/color", HTTP_GET, onApiLightsSetColor);
server.on("^\\/api\\/lights\\/([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", HTTP_GET, onApiLightsSetColor);
server.addRewrite(new OneParamRewrite("/api/show/screen/{s}", "/api/show/screen?s={s}"));
server.addRewrite(new OneParamRewrite("/api/show/text/{text}", "/api/show/text?t={text}"));
server.addRewrite(new OneParamRewrite("/api/show/number/{number}", "/api/show/text?t={text}"));
// server.addRewrite(new OneParamRewrite("/api/lights/{color}", "/api/lights/color?c={color}"));
server.onNotFound(onNotFound);
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
// Start server
server.begin();
if (!MDNS.begin(HOSTNAME))
{
Serial.println("Error setting up MDNS responder!");
while (1)
{
delay(1000);
}
}
MDNS.addService("http", "tcp", 80);
Serial.println("Webserver should be running");
}
void onApiStatus(AsyncWebServerRequest *request)
{
AsyncResponseStream *response = request->beginResponseStream("application/json");
DynamicJsonDocument root(1024);
root["currentScreen"] = String(getCurrentScreen());
JsonArray data = root.createNestedArray("data");
JsonArray rendered = root.createNestedArray("rendered");
String epdContent[7];
#ifdef WITH_RGB_LED
uint32_t pixelColors[NEOPIXEL_COUNT];
JsonArray ledStatus = root.createNestedArray("ledStatus");
for (int i = 0; i < NEOPIXEL_COUNT; i++)
{
pixelColors[i] = pixels.getPixelColor(i);
}
copyArray(pixelColors, ledStatus);
#endif
std::copy(std::begin(getCurrentEpdContent()), std::end(getCurrentEpdContent()), epdContent);
copyArray(epdContent, data);
copyArray(epdContent, rendered);
serializeJson(root, *response);
request->send(response);
}
void onApiActionPause(AsyncWebServerRequest *request)
{
timerRunning = false;
Serial.println("Update timer paused");
request->send(200);
};
void onApiFullRefresh(AsyncWebServerRequest *request)
{
xTaskCreate(fullRefresh, "Full Refresh", 10000, NULL, 5, NULL); // create task
request->send(200);
}
void onApiActionTimerRestart(AsyncWebServerRequest *request)
{
// moment = millis();
timerRunning = true;
Serial.println("Update timer restarted");
request->send(200);
}
void onApiActionUpdate(AsyncWebServerRequest *request)
{
if (request->hasParam("rate"))
{
AsyncWebParameter *p = request->getParam("rate");
timerSeconds = p->value().toInt() * 60;
preferences.putUInt("timerSeconds", timerSeconds);
}
timerRunning = true;
request->send(200);
}
void onApiSettingsGet(AsyncWebServerRequest *request)
{
DynamicJsonDocument root(1024);
root["fgColor"] = getFgColor();
root["bgColor"] = getBgColor();
root["timerSeconds"] = timerSeconds;
root["timerRunning"] = timerRunning;
#ifdef IS_BW
root["epdColors"] = 2;
#else
root["epdColors"] = 3;
#endif
root["ledFlashOnUpdate"] = preferences.getBool("ledFlashOnUpd", false);
JsonArray screens = root.createNestedArray("screens");
for (int i = 0; i < screenNameMap.size(); i++)
{
JsonObject o = screens.createNestedObject();
String key = "screen" + String(i) + "Visible";
o["id"] = i;
o["name"] = screenNameMap[i];
o["enabled"] = preferences.getBool(key.c_str(), true);
}
String responseText;
serializeJson(root, responseText);
request->send(200, "application/json", responseText);
}
void onApiSettingsPost(AsyncWebServerRequest *request)
{
int params = request->params();
bool settingsChanged = false;
if (request->hasParam("fgColor", true))
{
AsyncWebParameter *fgColor = request->getParam("fgColor", true);
preferences.putUInt("fgColor", strtol(fgColor->value().c_str(), NULL, 16));
Serial.print("Setting foreground color to ");
Serial.println(fgColor->value().c_str());
settingsChanged = true;
}
if (request->hasParam("bgColor", true))
{
AsyncWebParameter *bgColor = request->getParam("bgColor", true);
preferences.putUInt("bgColor", strtol(bgColor->value().c_str(), NULL, 16));
Serial.print("Setting background color to ");
Serial.println(bgColor->value().c_str());
settingsChanged = true;
}
if (request->hasParam("ledFlashOnUpd", true))
{
AsyncWebParameter *ledFlashOnUpdate = request->getParam("ledFlashOnUpd", true);
preferences.putBool("ledFlashOnUpd", ledFlashOnUpdate->value().toInt());
Serial.print("Setting led flash on update to ");
Serial.println(ledFlashOnUpdate->value().c_str());
settingsChanged = true;
}
else
{
preferences.putBool("ledFlashOnUpd", 0);
Serial.print("Setting led flash on update to false");
settingsChanged = true;
}
for (int i = 0; i < screenNameMap.size(); i++)
{
String key = "screen[" + String(i) + "]";
String prefKey = "screen" + String(i) + "Visible";
bool visible = false;
if (request->hasParam(key, true))
{
AsyncWebParameter *screenParam = request->getParam(key, true);
visible = screenParam->value().toInt();
}
Serial.print("Setting screen " + String(i) + " to ");
Serial.println(visible);
preferences.putBool(prefKey.c_str(), visible);
}
if (request->hasParam("timePerScreen", true))
{
AsyncWebParameter *p = request->getParam("timePerScreen", true);
timerSeconds = p->value().toInt() * 60;
preferences.putUInt("timerSeconds", timerSeconds);
settingsChanged = true;
}
request->send(200);
if (settingsChanged)
{
Serial.println("Settings changed");
}
}
void onApiShowScreen(AsyncWebServerRequest *request)
{
if (request->hasParam("s"))
{
AsyncWebParameter *p = request->getParam("s");
uint currentScreen = p->value().toInt();
setCurrentScreen(currentScreen);
}
request->send(200);
}
void onApiShowTextAdvanced(AsyncWebServerRequest *request, JsonVariant &json)
{
// JsonObject& jsonObj = json.as<JsonObject>();
// serializeJson(json, Serial);
JsonArray screens = json.as<JsonArray>();
std::array<String, 7> epdContent;
int i = 0;
for (JsonVariant s : screens)
{
epdContent[i] = s.as<String>();
Serial.println(s.as<String>());
i++;
}
CustomTextScreen::setText(epdContent);
setCurrentScreen(SCREEN_CUSTOM);
request->send(200);
}
void onApiShowText(AsyncWebServerRequest *request)
{
if (request->hasParam("t"))
{
AsyncWebParameter *p = request->getParam("t");
String t = p->value();
CustomTextScreen::setSimpleText(t);
}
setCurrentScreen(SCREEN_CUSTOM);
request->send(200);
}
void onApiRestart(AsyncWebServerRequest *request)
{
request->send(200);
esp_restart();
}
void onApiWifiScan(AsyncWebServerRequest *request)
{
WiFi.scanNetworks(true);
int n = WiFi.scanComplete();
DynamicJsonDocument doc(1024);
for (int i = 0; i < n; ++i)
{
JsonObject wifi = doc.createNestedObject(WiFi.BSSID(i));
Serial.println(WiFi.SSID(i));
wifi["ssid"] = WiFi.SSID(i);
wifi["rssi"] = WiFi.RSSI(i);
wifi["encryptionType"] = WiFi.encryptionType(i);
}
String responseText;
serializeJson(doc, responseText);
request->send(200, "application/json", responseText);
}
void onApiCountdown(AsyncWebServerRequest *request)
{
if (request->hasParam("s"))
{
AsyncWebParameter *p = request->getParam("s");
uint seconds = p->value().toInt();
CountdownScreen::setCountdownSeconds(seconds);
}
timerRunning = false;
setCurrentScreen(SCREEN_COUNTDOWN);
xTaskCreate(CountdownScreen::countdownTask, "Countdown", 4096, NULL, 50, NULL);
request->send(200);
}
void onIndex(AsyncWebServerRequest *request) { request->send(SPIFFS, "/index.html", String(), false); }
void onNotFound(AsyncWebServerRequest *request)
{
if (request->method() == HTTP_OPTIONS)
{
request->send(200);
}
else
{
request->send(404);
}
};
void onApiLightsOff(AsyncWebServerRequest *request)
{
setLights(0, 0, 0);
request->send(200);
}
void onApiLightsFlash(AsyncWebServerRequest *request)
{
setLights(255, 0, 0);
request->send(200);
}
void onApiLightsSetColor(AsyncWebServerRequest *request)
{
String rgbColor = request->pathArg(0);
int r, g, b;
sscanf(rgbColor.c_str(), "%02x%02x%02x", &r, &g, &b);
setLights(r, g, b);
request->send(200, "text/plain", rgbColor);
}

34
src/lib/webserver.hpp Normal file
View file

@ -0,0 +1,34 @@
#include "SPIFFS.h"
#include <WebServer.h>
#include "ESPAsyncWebServer.h"
#include <ArduinoJson.h>
#include "AsyncJson.h"
#include <ESPmDNS.h>
#include "lib/functions.hpp"
#include <string>
#include "tasks/epd.hpp"
#include "shared.hpp"
void setupWebserver();
void onApiStatus(AsyncWebServerRequest *request);
void onApiActionPause(AsyncWebServerRequest *request);
void onApiActionTimerRestart(AsyncWebServerRequest *request);
void onApiActionUpdate(AsyncWebServerRequest *request);
void onApiSettingsGet(AsyncWebServerRequest *request);
void onApiSettingsPost(AsyncWebServerRequest *request);
void onApiShowScreen(AsyncWebServerRequest *request);
void onApiShowText(AsyncWebServerRequest *request);
void onApiShowTextAdvanced(AsyncWebServerRequest *request, JsonVariant &json);
void onApiFullRefresh(AsyncWebServerRequest *request);
void onApiCountdown(AsyncWebServerRequest *request);
void onApiWifiScan(AsyncWebServerRequest *request);
void onApiRestart(AsyncWebServerRequest *request);
void onApiLightsOff(AsyncWebServerRequest *request);
void onApiLightsFlash(AsyncWebServerRequest *request);
void onApiLightsSetColor(AsyncWebServerRequest *request);
void onIndex(AsyncWebServerRequest *request);
void onNotFound(AsyncWebServerRequest *request);

View file

@ -0,0 +1,43 @@
#include "OneParamRewrite.hpp"
OneParamRewrite::OneParamRewrite(const char *from, const char *to)
: AsyncWebRewrite(from, to)
{
_paramIndex = _from.indexOf('{');
if (_paramIndex >= 0 && _from.endsWith("}"))
{
_urlPrefix = _from.substring(0, _paramIndex);
int index = _params.indexOf('{');
if (index >= 0)
{
_params = _params.substring(0, index);
}
}
else
{
_urlPrefix = _from;
}
_paramsBackup = _params;
}
bool OneParamRewrite::match(AsyncWebServerRequest *request)
{
if (request->url().startsWith(_urlPrefix))
{
if (_paramIndex >= 0)
{
_params = _paramsBackup + request->url().substring(_paramIndex);
}
else
{
_params = _paramsBackup;
}
return true;
}
else
{
return false;
}
};

View file

@ -0,0 +1,15 @@
#pragma once
#include "ESPAsyncWebServer.h"
class OneParamRewrite : public AsyncWebRewrite
{
protected:
String _urlPrefix;
int _paramIndex;
String _paramsBackup;
public:
OneParamRewrite(const char *from, const char *to);
bool match(AsyncWebServerRequest *request) override;
};

89
src/main.cpp Normal file
View file

@ -0,0 +1,89 @@
#include <Arduino.h>
#include <config.h>
#include <shared.hpp>
#include <WiFi.h>
#include <WiFiClientSecure.h>
//#include <ESP32Time.h>
#include <WiFiManager.h>
#ifdef CONFIG_BT_ENABLED
#include "esp_bt.h"
#include "esp_bt_main.h"
#endif
#include "lib/functions.hpp"
#include "lib/webserver.hpp"
#include "screens/time.hpp"
#include "screens/blockheight.hpp"
#include "screens/ticker.hpp"
#include "screens/time.hpp"
#include "screens/sats_per_dollar.hpp"
#include "screens/halvingcountdown.hpp"
#include "tasks/ha.hpp"
#include "tasks/epd.hpp"
#include "tasks/button.hpp"
#include "tasks/led_handler.hpp"
WiFiClient wifiClientInsecure;
WiFiClientSecure wifiClient;
ESP32Time rtc(3600);
void setup()
{
Serial.begin(115200);
#ifdef ARDUINO_LOLIN_S3
delay(2500);
#endif
#ifdef ARDUINO_ESP32S3_DEV
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
#endif
#ifdef CONFIG_BT_ENABLED
esp_bluedroid_disable();
esp_bluedroid_deinit();
esp_bt_controller_disable();
esp_bt_controller_deinit();
#endif
setupComponents();
setupPreferences();
#ifndef NO_DISPLAY
resetAllDisplays();
initDisplays();
#endif
setupWifi();
synchronizeTime();
setupWebserver();
TimeScreen::init();
BlockHeightScreen::init();
TickerScreen::init();
SatsPerDollarScreen::init();
#ifdef WITH_BUTTONS
setupButtonTask();
#endif
#ifdef WITH_RGB_LED
setLights(0,0,0);
setupLedHandlerTask();
#endif
registerNewMinuteCallback(TimeScreen::onNewMinute);
registerNewBlockCallback(BlockHeightScreen::onNewBlock);
registerNewBlockCallback(HalvingCountdownScreen::onNewBlock);
registerNewPriceCallback(TickerScreen::onPriceUpdate);
registerNewPriceCallback(SatsPerDollarScreen::onPriceUpdate);
setupDisplays();
}
void loop()
{
// put your main code here, to run repeatedly:
}

7
src/screens/base.cpp Normal file
View file

@ -0,0 +1,7 @@
#include "base.hpp"
//std::array<String, 7> BcScreen::epdContent = { "", "", "", "", "", "", "" };
std::array<String, 7> BcScreen::getEpdContent() {
return BcScreen::epdContent;
}

13
src/screens/base.hpp Normal file
View file

@ -0,0 +1,13 @@
#pragma once
#include "config.h"
#include "shared.hpp"
class BcScreen
{
protected:
std::array<String, 7> epdContent;
public:
void init();
void showScreen();
std::array<String, 7> getEpdContent();
};

View file

@ -0,0 +1,33 @@
#include "blockheight.hpp"
uint BlockHeightScreen::blockNr = 0;
std::array<String, 7> BlockHeightScreen::epdContent = { "", "", "", "", "", "", "" };
void BlockHeightScreen::init()
{
BlockHeightScreen::blockNr = preferences.getUInt("blockHeight", 789000);
setupBlockNotify();
BlockHeightScreen::showScreen();
}
void BlockHeightScreen::showScreen()
{
std::string blockNrString = String(BlockHeightScreen::blockNr).c_str();
blockNrString.insert(blockNrString.begin(), 7 - blockNrString.length(), ' ');
epdContent[0] = "BLOCK/HEIGHT";
for (uint i = 1; i < 7; i++)
{
BlockHeightScreen::epdContent[i] = blockNrString[i];
}
}
void BlockHeightScreen::onNewBlock(uint blockNr)
{
BlockHeightScreen::blockNr = blockNr;
BlockHeightScreen::showScreen();
}
std::array<String, 7> BlockHeightScreen::getEpdContent() {
return BlockHeightScreen::epdContent;
}

View file

@ -0,0 +1,18 @@
#pragma once
#include "base.hpp"
#include "config.h"
#include "shared.hpp"
#include "tasks/epd.hpp"
#include "tasks/blocknotify.hpp"
class BlockHeightScreen {
protected:
static uint blockNr;
static std::array<String, 7> epdContent;
public:
static void init();
static void showScreen();
static void onNewBlock(uint blockNr);
static std::array<String, 7> getEpdContent();
};

43
src/screens/countdown.cpp Normal file
View file

@ -0,0 +1,43 @@
#include "countdown.hpp"
uint CountdownScreen::countdownMinutes = 1;
uint CountdownScreen::countdownSeconds = 0;
std::array<String, 7> CountdownScreen::epdContent = {"COUNT/DOWN", "", "", "", "", "", ""};
void CountdownScreen::init()
{
CountdownScreen::showScreen();
}
void CountdownScreen::showScreen()
{
}
std::array<String, 7> CountdownScreen::getEpdContent()
{
return CountdownScreen::epdContent;
}
void CountdownScreen::setCountdownSeconds(uint sec) {
countdownSeconds = sec;
}
void CountdownScreen::countdownTask(void *pvParameters)
{
for (int i = CountdownScreen::countdownSeconds; i >= 0; i--)
{
char countdownString[7];
sprintf(countdownString, "%02d:%02d", i / 60, i % 60);
std::string timeString = countdownString;
timeString.insert(timeString.begin(), 7 - timeString.length(), ' ');
CountdownScreen::epdContent[0] = "COUNT/DOWN";
for (uint i = 1; i < 7; i++)
{
CountdownScreen::epdContent[i] = timeString[i];
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
Serial.println("Countdown finished!");
vTaskDelete(NULL);
}

21
src/screens/countdown.hpp Normal file
View file

@ -0,0 +1,21 @@
#pragma once
#include "base.hpp"
#include "config.h"
#include "shared.hpp"
#include <string>
#include <iostream>
#include "tasks/epd.hpp"
class CountdownScreen {
protected:
static uint countdownMinutes;
static uint countdownSeconds;
static std::array<String, 7> epdContent;
public:
static void init();
static void showScreen();
static std::array<String, 7> getEpdContent();
static void setCountdownSeconds(uint sec);
static void countdownTask(void *pvParameters);
};

View file

@ -0,0 +1,36 @@
#include "custom_text.hpp"
std::string CustomTextScreen::customText = "";
std::array<String, 7> CustomTextScreen::epdContent = {"", "", "", "", "", "", ""};
void CustomTextScreen::init()
{
CustomTextScreen::showScreen();
}
void CustomTextScreen::showScreen()
{
}
void CustomTextScreen::setSimpleText(String text)
{
customText = text.c_str();
customText.insert(customText.begin(), 7 - customText.length(), ' ');
for (uint i = 0; i < 7; i++)
{
CustomTextScreen::epdContent[i] = customText[i];
}
}
void CustomTextScreen::setText(std::array<String, 7> customContent)
{
epdContent = customContent;
}
std::array<String, 7> CustomTextScreen::getEpdContent()
{
return CustomTextScreen::epdContent;
}

View file

@ -0,0 +1,20 @@
#pragma once
#include "base.hpp"
#include "config.h"
#include "shared.hpp"
#include <string>
#include <iostream>
#include "tasks/epd.hpp"
class CustomTextScreen {
protected:
static std::string customText;
static std::array<String, 7> epdContent;
public:
static void init();
static void showScreen();
static std::array<String, 7> getEpdContent();
static void setSimpleText(String text);
static void setText(std::array<String, 7> customContent);
};

View file

@ -0,0 +1,50 @@
#include "halvingcountdown.hpp"
uint HalvingCountdownScreen::currentBlockNr = 0;
uint HalvingCountdownScreen::halvingBlockNr = 0;
std::array<String, 7> HalvingCountdownScreen::epdContent = {"", "", "", "", "", "", ""};
void HalvingCountdownScreen::init()
{
HalvingCountdownScreen::currentBlockNr = preferences.getUInt("blockHeight", 789000);
setupBlockNotify();
HalvingCountdownScreen::showScreen();
}
void HalvingCountdownScreen::showScreen()
{
uint minutesToHalving = HalvingCountdownScreen::getNextHalvingBlockNr() * 10;
int years = floor(minutesToHalving / 525600);
int days = floor((minutesToHalving - (years * 525600)) / (24*60));
int hours = floor((minutesToHalving - (years * 525600) - (days * (24*60))) / 60);
int mins = floor(minutesToHalving - (years * 525600) - (days * (24*60)) - (hours * 60));
// int secs = floor((minutesToHalving - (years * 525600) - (days * (24*60)) - (hours * 60) - mins) * 60);
epdContent[0] = "BIT/HALV";
epdContent[1] = "COIN/ING";
epdContent[2] = String(years) + "/YRS";
epdContent[3] = String(days) + "/DAYS";
epdContent[4] = String(hours) + "/HRS";
epdContent[5] = String(mins) + "/MINS";
epdContent[6] = "TO/GO";
}
uint HalvingCountdownScreen::getNextHalvingBlockNr()
{
return 210000 - (HalvingCountdownScreen::currentBlockNr % 210000);
}
void HalvingCountdownScreen::onNewBlock(uint blockNr)
{
HalvingCountdownScreen::currentBlockNr = blockNr;
HalvingCountdownScreen::showScreen();
}
std::array<String, 7> HalvingCountdownScreen::getEpdContent()
{
return HalvingCountdownScreen::epdContent;
}

View file

@ -0,0 +1,20 @@
#pragma once
#include "base.hpp"
#include "config.h"
#include "shared.hpp"
#include "tasks/epd.hpp"
#include "tasks/blocknotify.hpp"
class HalvingCountdownScreen {
protected:
static uint currentBlockNr;
static uint halvingBlockNr;
static std::array<String, 7> epdContent;
public:
static void init();
static void showScreen();
static void onNewBlock(uint blockNr);
static uint getNextHalvingBlockNr();
static std::array<String, 7> getEpdContent();
};

View file

@ -0,0 +1,30 @@
#include "sats_per_dollar.hpp"
uint SatsPerDollarScreen::satsPerDollar = 0;
std::array<String, 7> SatsPerDollarScreen::epdContent = { "", "", "", "", "", "", "" };
void SatsPerDollarScreen::init() {
SatsPerDollarScreen::satsPerDollar = int(round(1 / preferences.getFloat("btcPrice", 12345) * 10e7));
setupGetPriceTask();
SatsPerDollarScreen::showScreen();
}
void SatsPerDollarScreen::showScreen() {
std::string satsPerDollarString = String(SatsPerDollarScreen::satsPerDollar).c_str();
satsPerDollarString.insert(satsPerDollarString.begin(), 7 - satsPerDollarString.length(), ' ');
epdContent[0] = "MSCW/TIME";
for (uint i = 1; i < 7; i++)
{
SatsPerDollarScreen::epdContent[i] = satsPerDollarString[i];
}
}
void SatsPerDollarScreen::onPriceUpdate(uint price) {
SatsPerDollarScreen::satsPerDollar = int(round(1 / float(price) * 10e7));
SatsPerDollarScreen::showScreen();
}
std::array<String, 7> SatsPerDollarScreen::getEpdContent() {
return SatsPerDollarScreen::epdContent;
}

View file

@ -0,0 +1,17 @@
#pragma once
#include "base.hpp"
#include "config.h"
#include "shared.hpp"
#include "tasks/epd.hpp"
class SatsPerDollarScreen {
protected:
static uint satsPerDollar;
static std::array<String, 7> epdContent;
public:
static void init();
static void showScreen();
static void onPriceUpdate(uint price);
static std::array<String, 7> getEpdContent();
};

29
src/screens/ticker.cpp Normal file
View file

@ -0,0 +1,29 @@
#include "ticker.hpp"
uint TickerScreen::price = 12345;
std::array<String, 7> TickerScreen::epdContent = { "", "", "", "", "", "", "" };
void TickerScreen::init() {
TickerScreen::price = preferences.getFloat("btcPrice", 12345);;
setupGetPriceTask();
TickerScreen::showScreen();
}
void TickerScreen::showScreen() {
std::string priceString = ("$" + String(TickerScreen::price)).c_str();
priceString.insert(priceString.begin(), 7 - priceString.length(), ' ');
epdContent[0] = "BTC/USD";
for (uint i = 1; i < 7; i++)
{
TickerScreen::epdContent[i] = priceString[i];
}
}
void TickerScreen::onPriceUpdate(uint price) {
TickerScreen::price = price;
TickerScreen::showScreen();
}
std::array<String, 7> TickerScreen::getEpdContent() {
return TickerScreen::epdContent;
}

19
src/screens/ticker.hpp Normal file
View file

@ -0,0 +1,19 @@
#pragma once
#include "base.hpp"
#include "config.h"
#include "shared.hpp"
#include "tasks/epd.hpp"
class TickerScreen
{
protected:
static uint price;
static std::array<String, 7> epdContent;
public:
static void init();
static void showScreen();
static void onPriceUpdate(uint price);
static std::array<String, 7> getEpdContent();
};

39
src/screens/time.cpp Normal file
View file

@ -0,0 +1,39 @@
#include "time.hpp"
String TimeScreen::timeString = "";
String TimeScreen::dateString = "";
std::array<String, 7> TimeScreen::epdContent = { "", "", "", "", "", "", "" };
void TimeScreen::init() {
setupMinuteEvent();
TimeScreen::showScreen();
}
void TimeScreen::showScreen() {
TimeScreen::dateString = String(rtc.getDay()) + "/" + String(rtc.getMonth() + 1);
TimeScreen::timeString = rtc.getTime("%H:%M").c_str();
std::string timeString = TimeScreen::timeString.c_str();
timeString.insert(timeString.begin(), 7 - timeString.length(), ' ');
TimeScreen::epdContent[0] = TimeScreen::dateString;
for (uint i = 1; i < 7; i++)
{
TimeScreen::epdContent[i] = timeString[i];
}
}
void TimeScreen::onNewMinute() {
TimeScreen::showScreen();
}
std::array<String, 7> TimeScreen::getEpdContent() {
return TimeScreen::epdContent;
}
TimeScreen* TimeScreen::getInstance() {
if (instance_ == nullptr) {
instance_ = new TimeScreen;
}
return instance_;
}

20
src/screens/time.hpp Normal file
View file

@ -0,0 +1,20 @@
#pragma once
#include "base.hpp"
#include "config.h"
#include "shared.hpp"
#include "tasks/epd.hpp"
class TimeScreen {
protected:
static String timeString;
static String dateString;
static std::array<String, 7> epdContent;
static TimeScreen* instance_;
public:
static void init();
static void showScreen();
static void onNewMinute();
static std::array<String, 7> getEpdContent();
static TimeScreen* getInstance();
};

52
src/shared.hpp Normal file
View file

@ -0,0 +1,52 @@
#pragma once
#include <Arduino.h>
//##include <Crypto.h>
#include <WiFi.h>
#include <map>
#include <WiFiClientSecure.h>
#ifndef NO_MCP
#include <Adafruit_MCP23X17.h>
#endif
#ifdef WITH_RGB_LED
#include <Adafruit_NeoPixel.h>
#endif
#include <ESP32Time.h>
#include <Preferences.h>
typedef std::function<void()> EventCallback;
typedef std::function<void(uint number)> EventCallbackWithNumber;
extern WiFiClient wifiClientInsecure;
extern WiFiClientSecure wifiClient;
extern ESP32Time rtc;
extern Preferences preferences;
extern String softAP_SSID;
extern String softAP_password;
extern bool timerRunning;
extern uint timerSeconds;
extern uint32_t moment;
#ifndef NO_MCP
extern Adafruit_MCP23X17 mcp;
#endif
#ifdef WITH_RGB_LED
extern Adafruit_NeoPixel pixels;
#endif
extern std::map<int, std::string> screenNameMap;
const int SCREEN_BLOCK_HEIGHT = 0;
const int SCREEN_MSCW_TIME = 1;
const int SCREEN_BTC_TICKER = 2;
const int SCREEN_TIME = 3;
const int SCREEN_HALVING_COUNTDOWN = 4;
const int SCREEN_COUNTDOWN = 98;
const int SCREEN_CUSTOM = 99;
const int screens[5] = { SCREEN_BLOCK_HEIGHT, SCREEN_MSCW_TIME, SCREEN_BTC_TICKER, SCREEN_TIME, SCREEN_HALVING_COUNTDOWN };
const uint screenCount = sizeof(screens) / sizeof(int);

116
src/tasks/blocknotify.cpp Normal file
View file

@ -0,0 +1,116 @@
#include "blocknotify.hpp"
int currentBlockHeight = 789000;
QueueHandle_t bitcoinQueue;
BitcoinEvent bitcoinEvent;
const String NEW_BLOCK_MINED_EVENT = "new_block_mined";
std::vector<EventCallbackWithNumber> blockEventCallbacks;
TaskHandle_t blockNotifyTaskHandle;
#ifdef IS_3C
#define BLOCKNOTIFY_WAIT_TIME 300000
#else
#define BLOCKNOTIFY_WAIT_TIME 60000
#endif
bool useBitcoind = true;
void checkBitcoinBlock(void *pvParameters)
{
int blockHeight = preferences.getUInt("blockHeight", currentBlockHeight);
HTTPClient http;
http.setReuse(true);
useBitcoind = wifiClientInsecure.connect(BITCOIND_HOST, BITCOIND_PORT);
if (useBitcoind)
Serial.println("bitcoind node is reachable, using this for blocks.");
else
Serial.println("bitcoind node is not reachable, using mempool API instead.");
for (;;)
{
if (useBitcoind)
{
StaticJsonDocument<200> jsonDoc;
http.begin(BITCOIND_HOST, BITCOIND_PORT);
http.addHeader("Content-Type", "application/json");
String payload = "{\"jsonrpc\":\"1.0\",\"id\":\"current_block_height\",\"method\":\"getblockcount\",\"params\":[]}";
String auth = String(BITCOIND_RPC_USER) + ":" + String(BITCOIND_RPC_PASS);
String authEncoded = base64::encode(auth);
http.addHeader("Authorization", "Basic " + authEncoded);
int httpCode = http.POST(payload);
if (httpCode > 0)
{
String response = http.getString();
deserializeJson(jsonDoc, response);
blockHeight = jsonDoc["result"];
}
else
{
Serial.println("Error in HTTP request to bitcoind");
}
http.end();
}
else
{
http.begin("https://mempool.bitcoin.nl/api/blocks/tip/height");
int httpCode = http.GET();
if (httpCode > 0 && httpCode == HTTP_CODE_OK)
{
String blockHeightStr = http.getString();
blockHeight = blockHeightStr.toInt();
}
else
{
Serial.println("Error in HTTP request to mempool API");
}
http.end();
}
if (blockHeight > currentBlockHeight)
{
for (auto &callback : blockEventCallbacks)
{ // Loop through all the event callbacks and call them
callback(blockHeight);
}
currentBlockHeight = blockHeight;
preferences.putUInt("blockHeight", currentBlockHeight);
}
vTaskDelay(pdMS_TO_TICKS(BLOCKNOTIFY_WAIT_TIME)); // wait 1 minute before checking again
}
}
// void bitcoinEventHandler(void *pvParameters)
// {
// for (;;)
// {
// BitcoinEvent event;
// xQueueReceive(bitcoinQueue, &event, portMAX_DELAY);
// if (event.event == "new_block_mined")
// {
// Serial.println("New Bitcoin block mined at height: " + String(event.blockHeight));
// Serial.println("Event: " + event.event);
// }
// // add your event handling logic here
// vTaskDelay(pdMS_TO_TICKS(1000));
// }
// }
void setupBlockNotify()
{
// bitcoinQueue = xQueueCreate(10, sizeof(BitcoinEvent) * 2);
if (blockNotifyTaskHandle == nullptr) {
xTaskCreate(checkBitcoinBlock, "checkBitcoinBlock", 4096, NULL, 1, &blockNotifyTaskHandle);
vTaskSuspend(blockNotifyTaskHandle);
}
// xTaskCreate(bitcoinEventHandler, "bitcoinEventHandler", 10000, NULL, 110, NULL);
}
void registerNewBlockCallback(EventCallbackWithNumber cb)
{
blockEventCallbacks.push_back(cb);
}

26
src/tasks/blocknotify.hpp Normal file
View file

@ -0,0 +1,26 @@
#pragma once
#include <WiFi.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "base64.h"
#include "shared.hpp"
#include "config.h"
typedef struct {
String event;
int blockHeight;
} BitcoinEvent;
extern TaskHandle_t blockNotifyTaskHandle;
void checkBitcoinBlock(void *pvParameters);
//void bitcoinEventHandler(void *pvParameters);
void setupBlockNotify();
void registerNewBlockCallback(EventCallbackWithNumber cb);
int getBlockFromBitcoind();
int getBlockFromMempoolSpace();

34
src/tasks/button.cpp Normal file
View file

@ -0,0 +1,34 @@
#include "button.hpp"
#ifndef NO_MCP
TaskHandle_t buttonTaskHandle = NULL;
// Define a type for the event callback
std::vector<EventCallback> buttonEventCallbacks; // Define a vector to hold multiple event callbacks
void buttonTask(void *parameter)
{
while (1)
{
for (int i = 0; i < 4; i++)
{
if (!mcp.digitalRead(i))
{
Serial.println("Button " + String(i) + " Pressed!");
delay(250);
}
}
vTaskDelay(pdMS_TO_TICKS(250));
}
}
void setupButtonTask()
{
xTaskCreate(buttonTask, "MinuteTask", 2048, NULL, 1, &buttonTaskHandle); // Create the FreeRTOS task
}
void registerNewButtonCallback(EventCallback cb)
{
buttonEventCallbacks.push_back(cb);
}
#endif

17
src/tasks/button.hpp Normal file
View file

@ -0,0 +1,17 @@
#pragma once
#ifndef NO_MCP
#include <Arduino.h>
#include <Wire.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <vector>
#include "shared.hpp"
extern TaskHandle_t buttonTaskHandle;
void buttonTask(void *pvParameters);
void setupButtonTask();
void registerNewButtonCallback(EventCallback cb);
#endif

451
src/tasks/epd.cpp Normal file
View file

@ -0,0 +1,451 @@
#include "epd.hpp"
#ifdef IS_S3
// reversed
const int EPD_CS[7] = {17, 21, 33, 10, 6, 4, 2};
const int EPD_BUSY[7] = {16, 18, 37, 9, 7, 5, 3};
const int EPD_RESET_MPD[7] = {14, 13, 12, 11, 10, 9, 8};
//const int EPD_CS[7] = {2, 4, 6, 10, 33, 21, 17};
//const int EPD_BUSY[7] = {3, 5, 7, 9, 37, 18, 16};
//const int EPD_RESET_MPD[7] = {8, 9, 10, 11, 12, 13, 14};
// const int EPD_CS[7] = {2, 4, 10, 38, 34, 21, 17};
// const int EPD_BUSY[7] = {3, 5, 9, 36, 35, 18, 16};
const int EPD_DC = 14;
const int RST_PIN = 15;
#elif defined(IS_S2)
// reversed
const int EPD_CS[7] = {17, 21, 33, 10, 6, 4, 2};
const int EPD_BUSY[7] = {16, 18, 37, 9, 7, 5, 3};
const int EPD_RESET_MPD[7] = {14, 13, 12, 11, 10, 9, 8};
// const int EPD_CS[7] = {1, 4, 6, 8, 10, 13, 40};
// const int EPD_BUSY[7] = {3, 5, 7, 9, 11, 12, 39};
const int EPD_DC = 14;
const int RST_PIN = 15;
#elif defined(ARDUINO_ESP32S3_DEV)
const int EPD_CS[7] = {40, 39, 9, 10, 3, 8, 18};
const int EPD_BUSY[7] = {4, 5, 6, 7, 15, 16, 17};
const int EPD_RESET_MPD[7] = {8, 9, 10, 11, 12, 13, 14};
const int EPD_DC = 1;
const int RST_PIN = 2;
#else
const int EPD_CS[7] = {21, 13, 5, 17, 4, 2, 15};
const int EPD_BUSY[7] = {36, 39, 34, 35, 32, 33, 25};
// const int EPD_CS[7] = {4, 14, 5, 17, 16, 4, 15};
// const int EPD_BUSY[7] = {5, 27, 34, 35, 32, 33, 25};
const int EPD_RESET_MPD[7] = {8, 9, 10, 11, 12, 13, 14};
const int EPD_DC = 22;
const int RST_PIN = 12;
#endif
#ifdef IS_BW
GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> displays[7] = {
GxEPD2_213_B74(EPD_CS[0], EPD_DC, /*RST=*/-1, EPD_BUSY[0]),
GxEPD2_213_B74(EPD_CS[1], EPD_DC, /*RST=*/-1, EPD_BUSY[1]),
GxEPD2_213_B74(EPD_CS[2], EPD_DC, /*RST=*/-1, EPD_BUSY[2]),
GxEPD2_213_B74(EPD_CS[3], EPD_DC, /*RST=*/-1, EPD_BUSY[3]),
GxEPD2_213_B74(EPD_CS[4], EPD_DC, /*RST=*/-1, EPD_BUSY[4]),
GxEPD2_213_B74(EPD_CS[5], EPD_DC, /*RST=*/-1, EPD_BUSY[5]),
GxEPD2_213_B74(EPD_CS[6], EPD_DC, /*RST=*/-1, EPD_BUSY[6]),
};
const int SEM_WAIT_TIME = 10000;
#else
GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> displays[7] = {
GxEPD2_213_Z98c(EPD_CS[0], EPD_DC, /*RST=*/-1, EPD_BUSY[0]),
GxEPD2_213_Z98c(EPD_CS[1], EPD_DC, /*RST=*/-1, EPD_BUSY[1]),
GxEPD2_213_Z98c(EPD_CS[2], EPD_DC, /*RST=*/-1, EPD_BUSY[2]),
GxEPD2_213_Z98c(EPD_CS[3], EPD_DC, /*RST=*/-1, EPD_BUSY[3]),
GxEPD2_213_Z98c(EPD_CS[4], EPD_DC, /*RST=*/-1, EPD_BUSY[4]),
GxEPD2_213_Z98c(EPD_CS[5], EPD_DC, /*RST=*/-1, EPD_BUSY[5]),
GxEPD2_213_Z98c(EPD_CS[6], EPD_DC, /*RST=*/-1, EPD_BUSY[6]),
};
const int SEM_WAIT_TIME = 30000;
#endif
const uint displaySize = 7;
uint32_t lastFullRefresh[displaySize];
std::array<String, 7> currentEpdContent;
std::array<String, 7> epdContent;
TaskHandle_t tasks[displaySize];
SemaphoreHandle_t epdUpdateSemaphore[displaySize];
uint8_t qrcode[qrcodegen_BUFFER_LEN_MAX];
void setupDisplays()
{
handleScreenTasks(getCurrentScreen());
xTaskCreate(taskEpd, "epd_task", 2048, NULL, 1, NULL);
}
void resetAllDisplays()
{
digitalWrite(RST_PIN, HIGH);
pinMode(RST_PIN, OUTPUT);
delay(20);
digitalWrite(RST_PIN, LOW);
delay(20);
digitalWrite(RST_PIN, HIGH);
delay(200);
// for (int i = 8; i < 16; i++) {
// mcp.digitalWrite(i, HIGH);
// mcp.pinMode(i, OUTPUT);
// delay(20);
// mcp.digitalWrite(i, LOW);
// delay(20);
// mcp.digitalWrite(i, HIGH);
// delay(200);
// }
}
void resetSingleDisplay(int i)
{
#ifndef NO_MCP
mcp.digitalWrite(EPD_RESET_MPD[i], HIGH);
delay(20);
mcp.digitalWrite(EPD_RESET_MPD[i], LOW);
delay(20);
mcp.digitalWrite(EPD_RESET_MPD[i], HIGH);
delay(200);
#endif
}
void initDisplays()
{
for (uint i = 0; i < displaySize; i++)
{
#ifndef NO_MCP
mcp.pinMode(EPD_RESET_MPD[i], OUTPUT);
#endif
displays[i].init();
#ifndef NO_MCP
resetSingleDisplay(i);
#endif
// displays[i].epd2.init(SW_SCK, SW_MOSI, 115200, true, 20, false);
}
std::string text = "BTClock";
for (uint i = 0; i < displaySize; i++)
{
epdUpdateSemaphore[i] = xSemaphoreCreateBinary();
xSemaphoreGive(epdUpdateSemaphore[i]);
// Allocate memory for the task parameter
int *taskParam = new int;
*taskParam = i;
xTaskCreate(updateDisplay, "EpdUpd" + char(i), 2048, taskParam, 1, &tasks[i]); // create task
// delay(1000);
}
epdContent = {"B", "T", "C", "L", "O", "C", "K"};
for (uint i = 0; i < displaySize; i++)
{
xTaskNotifyGive(tasks[i]);
}
vTaskDelay(pdMS_TO_TICKS(displays[0].epd2.full_refresh_time));
}
void taskEpd(void *pvParameters)
{
while (1)
{
switch (getCurrentScreen())
{
case SCREEN_BLOCK_HEIGHT:
epdContent = BlockHeightScreen::getEpdContent();
break;
case SCREEN_BTC_TICKER:
epdContent = TickerScreen::getEpdContent();
break;
case SCREEN_MSCW_TIME:
epdContent = SatsPerDollarScreen::getEpdContent();
break;
case SCREEN_TIME:
epdContent = TimeScreen::getEpdContent();
break;
case SCREEN_HALVING_COUNTDOWN:
epdContent = HalvingCountdownScreen::getEpdContent();
break;
case SCREEN_COUNTDOWN:
epdContent = CountdownScreen::getEpdContent();
break;
case SCREEN_CUSTOM:
epdContent = CustomTextScreen::getEpdContent();
break;
}
bool updatedThisCycle = false;
for (uint i = 0; i < displaySize; i++)
{
if (epdContent[i].compareTo(currentEpdContent[i]) != 0)
{
if (!updatedThisCycle)
{
#ifdef NO_MCP
resetAllDisplays();
#endif
updatedThisCycle = true;
}
#ifndef NO_DISPLAY
if (xSemaphoreTake(epdUpdateSemaphore[i], pdMS_TO_TICKS(SEM_WAIT_TIME)) == pdTRUE)
{
xTaskNotifyGive(tasks[i]);
}
else
{
Serial.println("Couldnt get screen" + String(i));
}
#else
currentEpdContent[i] = epdContent[i];
#endif
}
}
#ifdef WITH_RGB_LED
if (updatedThisCycle && preferences.getBool("ledFlashOnUpd", false))
{
xTaskNotifyGive(ledHandlerTaskHandle);
Serial.println("Flash leds");
}
#endif
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
std::array<String, 7> getCurrentEpdContent()
{
return currentEpdContent;
}
void setEpdContent(std::array<String, 7> newEpdContent)
{
epdContent = newEpdContent;
}
void splitText(uint dispNum, String top, String bottom, bool partial)
{
displays[dispNum].setRotation(2);
displays[dispNum].setFont(&FONT_SMALL);
displays[dispNum].setTextColor(getFgColor());
// Top text
int16_t ttbx, ttby;
uint16_t ttbw, ttbh;
displays[dispNum].getTextBounds(top, 0, 0, &ttbx, &ttby, &ttbw, &ttbh);
uint16_t tx = ((displays[dispNum].width() - ttbw) / 2) - ttbx;
uint16_t ty = ((displays[dispNum].height() - ttbh) / 2) - ttby - ttbh / 2 - 12;
// Bottom text
int16_t tbbx, tbby;
uint16_t tbbw, tbbh;
displays[dispNum].getTextBounds(bottom, 0, 0, &tbbx, &tbby, &tbbw, &tbbh);
uint16_t bx = ((displays[dispNum].width() - tbbw) / 2) - tbbx;
uint16_t by = ((displays[dispNum].height() - tbbh) / 2) - tbby + tbbh / 2 + 12;
// Make separator as wide as the shortest text.
uint16_t lineWidth, lineX;
if (tbbw < ttbh)
lineWidth = tbbw;
else
lineWidth = ttbw;
lineX = round((displays[dispNum].width() - lineWidth) / 2);
displays[dispNum].fillScreen(getBgColor());
displays[dispNum].setCursor(tx, ty);
displays[dispNum].print(top);
displays[dispNum].fillRoundRect(lineX, displays[dispNum].height() / 2 - 3, lineWidth, 6, 3, getFgColor());
displays[dispNum].setCursor(bx, by);
displays[dispNum].print(bottom);
}
void showDigit(uint dispNum, char chr, bool partial, const GFXfont *font)
{
String str(chr);
displays[dispNum].setRotation(2);
displays[dispNum].setFont(font);
displays[dispNum].setTextColor(getFgColor());
int16_t tbx, tby;
uint16_t tbw, tbh;
displays[dispNum].getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh);
// center the bounding box by transposition of the origin:
uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx;
uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby;
displays[dispNum].fillScreen(getBgColor());
displays[dispNum].setCursor(x, y);
displays[dispNum].print(str);
}
void fullRefresh(void *pvParameters)
{
resetAllDisplays();
for (uint i = 0; i < displaySize; i++)
{
lastFullRefresh[i] = NULL;
}
vTaskDelete(NULL);
}
void updateDisplay(void *pvParameters)
{
const int epdIndex = *(int *)pvParameters;
delete (int *)pvParameters;
for (;;)
{
// Wait for the task notification
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
if (epdContent[epdIndex].compareTo(currentEpdContent[epdIndex]) != 0)
{
currentEpdContent[epdIndex] = epdContent[epdIndex];
// resetSingleDisplay(epdIndex);
#ifndef NO_MCP
displays[epdIndex].init(0, false);
delay(displays[epdIndex].epd2.power_on_time);
resetSingleDisplay(epdIndex);
#endif
// displays[epdIndex].init(0, false);
bool updatePartial = true;
if (!lastFullRefresh[epdIndex])
{
updatePartial = false;
lastFullRefresh[epdIndex] = millis();
}
#ifndef NO_DISPLAY
if (strstr(epdContent[epdIndex].c_str(), "/") != NULL)
{
String top = epdContent[epdIndex].substring(0, epdContent[epdIndex].indexOf("/"));
String bottom = epdContent[epdIndex].substring(epdContent[epdIndex].indexOf("/") + 1);
splitText(epdIndex, top, bottom, updatePartial);
}
else
{
showDigit(epdIndex, epdContent[epdIndex].c_str()[0], updatePartial, &FONT_BIG);
}
displays[epdIndex].display(updatePartial);
// displays[epdIndex].powerOff();
displays[epdIndex].hibernate();
#endif
}
xSemaphoreGive(epdUpdateSemaphore[epdIndex]);
}
}
void showSetupQr(String ssid, String password)
{
int displayIndex = 6;
const String text = "WIFI:S:" + ssid + ";T:WPA;P:" + password + ";;"; // User-supplied text
// genQrCode(text, &qrcode);
uint8_t tempBuffer[qrcodegen_BUFFER_LEN_MAX];
bool ok = qrcodegen_encodeText(text.c_str(), tempBuffer, qrcode, qrcodegen_Ecc_LOW,
qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, qrcodegen_Mask_AUTO, true);
const int size = qrcodegen_getSize(qrcode);
const int padding = floor(float(displays[displayIndex].width() - (size * 4)) / 2);
const int paddingY = floor(float(displays[displayIndex].height() - (size * 4)) / 2);
// displays[displayIndex].setRotation(0);
// displays[displayIndex].setFullWindow();
displays[displayIndex].setPartialWindow(0, 0, displays[displayIndex].width(), displays[displayIndex].height());
displays[displayIndex].firstPage();
displays[displayIndex].fillScreen(GxEPD_WHITE);
int border = 0;
do
{
for (int y = -border; y < size * 4 + border; y++)
{
for (int x = -border; x < size * 4 + border; x++)
{
displays[displayIndex].drawPixel(padding + x, paddingY + y, qrcodegen_getModule(qrcode, floor(float(x) / 4), floor(float(y) / 4)) ? GxEPD_BLACK : GxEPD_WHITE);
}
}
} while (displays[displayIndex].nextPage());
displayIndex = 4;
displays[displayIndex].setPartialWindow(0, 0, displays[displayIndex].width(), displays[displayIndex].height());
displays[displayIndex].firstPage();
displays[displayIndex].fillScreen(GxEPD_WHITE);
do
{
displays[displayIndex].setTextColor(GxEPD_BLACK);
displays[displayIndex].setCursor(0, 50);
displays[displayIndex].setFont(&FreeSansBold9pt7b);
displays[displayIndex].println("SSID:");
displays[displayIndex].setFont(&FreeSans9pt7b);
displays[displayIndex].println(ssid);
displays[displayIndex].println("");
displays[displayIndex].setFont(&FreeSansBold9pt7b);
displays[displayIndex].println("Password:");
displays[displayIndex].setFont(&FreeSans9pt7b);
displays[displayIndex].println(password);
} while (displays[displayIndex].nextPage());
displayIndex = 2;
displays[displayIndex].setPartialWindow(0, 0, displays[displayIndex].width(), displays[displayIndex].height());
displays[displayIndex].firstPage();
displays[displayIndex].fillScreen(GxEPD_WHITE);
do
{
displays[displayIndex].setTextColor(GxEPD_BLACK);
displays[displayIndex].setCursor(0, 50);
displays[displayIndex].setFont(&FreeSans9pt7b);
displays[displayIndex].println("To setup");
displays[displayIndex].println("scan QR or");
displays[displayIndex].println("connect");
displays[displayIndex].println("manually");
} while (displays[displayIndex].nextPage());
displayIndex = 0;
displays[displayIndex].setPartialWindow(0, 0, displays[displayIndex].width(), displays[displayIndex].height());
displays[displayIndex].firstPage();
displays[displayIndex].fillScreen(GxEPD_WHITE);
do
{
displays[displayIndex].setTextColor(GxEPD_BLACK);
displays[displayIndex].setCursor(0, 50);
displays[displayIndex].setFont(&FreeSansBold9pt7b);
displays[displayIndex].println("Welcome!");
} while (displays[displayIndex].nextPage());
for (int i = 1; i < displaySize; (i = i+2)) {
displays[i].setPartialWindow(0, 0, displays[i].width(), displays[i].height());
// displays[i].firstPage();
displays[i].fillScreen(GxEPD_WHITE);
displays[i].display(true);
}
for (int i = 0; i < displaySize; i++) {
displays[i].hibernate();
}
}

50
src/tasks/epd.hpp Normal file
View file

@ -0,0 +1,50 @@
#pragma once
#ifdef IS_BW
#include <GxEPD2_BW.h>
#else
#include <GxEPD2_3C.h>
#endif
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/FreeSans9pt7b.h>
#include <string>
#include "screens/blockheight.hpp"
#include "screens/ticker.hpp"
#include "screens/time.hpp"
#include "screens/sats_per_dollar.hpp"
#include "screens/countdown.hpp"
#include "screens/custom_text.hpp"
#include "screens/halvingcountdown.hpp"
#include "qrcodegen.h"
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "fonts/fonts.hpp"
#include "lib/functions.hpp"
#include "tasks/led_handler.hpp"
typedef struct {
uint dispNum;
bool partial;
} UpdateEpdData;
void setupDisplays();
void initDisplays();
void taskEpd(void *pvParameters);
void resetAllDisplays();
void resetSingleDisplay(int i);
std::array<String, 7> getCurrentEpdContent();
void setEpdContent(std::array<String, 7> newEpdContent);
void splitText(uint dispNum, String top, String bottom, bool partial);
void showDigit(uint dispNum, char chr, bool partial, const GFXfont *font);
void refreshDisplay(void *pvParameters);
void fullRefresh(void *pvParameters);
void updateDisplay(void *pvParameters);
//void genQrCode(String text, uint8_t *qrcode[qrcodegen_BUFFER_LEN_MAX]);
void showSetupQr(String ssid, String password);

63
src/tasks/get_price.cpp Normal file
View file

@ -0,0 +1,63 @@
#include "get_price.hpp"
const char *apiUrl = "https://api.coindesk.com/v1/bpi/currentprice/USD.json";
std::vector<EventCallbackWithNumber> priceEventCallbacks; // Define a vector to hold multiple event callbacks
TaskHandle_t getPriceTaskHandle;
#ifdef IS_3C
#define PRICE_WAIT_TIME 300000
#else
#define PRICE_WAIT_TIME 60000
#endif
void taskGetPrice(void *pvParameters)
{
HTTPClient http;
for (;;)
{
// Send HTTP request to CoinDesk API
http.begin(apiUrl);
int httpCode = http.GET();
// Parse JSON response and extract average price
float price;
if (httpCode == 200)
{
String payload = http.getString();
//Serial.println(payload);
StaticJsonDocument<768> doc;
deserializeJson(doc, payload);
JsonObject bpi = doc["bpi"];
price = bpi["USD"]["rate_float"];
for(auto &callback : priceEventCallbacks) { // Loop through all the event callbacks and call them
callback(price);
}
preferences.putFloat("btcPrice", price);
}
else
{
Serial.print("Error retrieving BTC/USD price. HTTP status code: ");
Serial.println(httpCode);
}
// Disconnect from Wi-Fi network and wait for 60 seconds
http.end();
vTaskDelay(pdMS_TO_TICKS(PRICE_WAIT_TIME));
}
}
void setupGetPriceTask()
{
if (getPriceTaskHandle == nullptr) {
xTaskCreate(taskGetPrice, "getPrice", 8192, NULL, 1, &getPriceTaskHandle);
vTaskSuspend(getPriceTaskHandle);
}
}
void registerNewPriceCallback(EventCallbackWithNumber cb)
{
priceEventCallbacks.push_back(cb);
}

14
src/tasks/get_price.hpp Normal file
View file

@ -0,0 +1,14 @@
#pragma once
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "shared.hpp"
#include "config.h"
extern TaskHandle_t getPriceTaskHandle;
void taskGetPrice(void *pvParameters);
void setupGetPriceTask();
void registerNewPriceCallback(EventCallbackWithNumber cb);

82
src/tasks/ha.cpp Normal file
View file

@ -0,0 +1,82 @@
// #include "ha.hpp"
// WebSocketsClient webSocket;
// TaskHandle_t websocket_task_handle = NULL;
// const uint32_t WEBSOCKET_TASK_STACK_SIZE = 4096;
// const uint32_t WEBSOCKET_TASK_PRIORITY = 1;
// // WebSocket connection and subscription messages
// String auth_msg = String("{\"type\": \"auth\",\"access_token\": \"") + String(HA_AUTH_TOKEN) + String("\"}");
// String subscribe_msg = String("{\"id\": 1,\"type\": \"subscribe_events\",\"event_type\": \"state_changed\"}");
// void websocket_task(void *pvParameters)
// {
// // Connect to WiFi network
// // Connect to Home Assistant WebSocket API
// webSocket.begin(HA_SERVER, 8123, "/api/websocket");
// webSocket.setReconnectInterval(5000);
// // Authenticate and subscribe to entity state changes
// webSocket.onEvent([&](WStype_t type, uint8_t *payload, size_t length)
// {
// switch (type)
// {
// case WStype_DISCONNECTED:
// Serial.printf("[WebSocket] disconnected\n");
// break;
// case WStype_CONNECTED:
// Serial.printf("[WebSocket] connected, sending authentication message...\n");
// webSocket.sendTXT(auth_msg);
// break;
// case WStype_TEXT:
// if (strstr((char *)payload, "auth_ok") != NULL)
// {
// Serial.printf("[WebSocket] authentication successful, subscribing to entity state changes...\n");
// webSocket.sendTXT(subscribe_msg);
// }
// else if (strstr((char *)payload, "auth_invalid") != NULL)
// {
// Serial.printf("[WebSocket] authentication failed, disconnecting...\n");
// webSocket.disconnect();
// }
// else
// {
// StaticJsonDocument<1536> jsonDoc;
// DeserializationError err = deserializeJson(jsonDoc, (char *)payload);
// if (!err)
// {
// const char *event_type = jsonDoc["event"]["event_type"];
// const char *entity_id = jsonDoc["event"]["data"]["entity_id"];
// if (event_type && entity_id && strcmp(event_type, "state_changed") != 0)
// return;
// if (event_type && entity_id && strcmp(event_type, "state_changed") == 0 && strcmp(entity_id, HA_ENTITY_ID) == 0)
// {
// const char *new_state = jsonDoc["event"]["data"]["new_state"]["state"];
// if (new_state)
// {
// Serial.printf("[WebSocket] entity state changed: %s\n", new_state);
// /* Emit event for state change */
// // TODO: Add your custom event handling code here
// }
// }
// } else {
// Serial.printf("[WebSocket] error deserializing JSON: %s\n", err.c_str());
// }
// }
// break;
// default:
// break;
// }
// });
// // Main event loop
// while (true)
// {
// webSocket.loop();
// vTaskDelay(pdMS_TO_TICKS(10));
// }
// }

14
src/tasks/ha.hpp Normal file
View file

@ -0,0 +1,14 @@
// #pragma once
// #include <ArduinoJson.h>
// #include <WebSocketsClient.h>
// #include "config.h"
// #include "shared.hpp"
// void websocket_task(void *pvParameters);
// // // FreeRTOS task parameters
// extern TaskHandle_t websocket_task_handle;
// extern const uint32_t WEBSOCKET_TASK_STACK_SIZE;
// extern const uint32_t WEBSOCKET_TASK_PRIORITY;

33
src/tasks/led_handler.cpp Normal file
View file

@ -0,0 +1,33 @@
#include "led_handler.hpp"
#ifdef WITH_RGB_LED
TaskHandle_t ledHandlerTaskHandle = NULL;
void ledHandlerTask(void *parameter)
{
int dir = 5;
int bright = 0;
while (1)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
for (int i = 0; i < 3; i++) {
pixels.fill(pixels.Color(224, 67, 0));
pixels.show();
vTaskDelay(pdMS_TO_TICKS(600));
pixels.fill(pixels.Color(8, 2, 0));
pixels.show();
vTaskDelay(pdMS_TO_TICKS(400));
}
pixels.fill(pixels.Color(0,0,0));
pixels.show();
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void setupLedHandlerTask()
{
xTaskCreate(ledHandlerTask, "LedHandlerTask", 2048, NULL, 1, &ledHandlerTaskHandle); // Create the FreeRTOS task
}
#endif

14
src/tasks/led_handler.hpp Normal file
View file

@ -0,0 +1,14 @@
#pragma once
#ifdef WITH_RGB_LED
#include <Arduino.h>
#include <Wire.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <vector>
#include "shared.hpp"
extern TaskHandle_t ledHandlerTaskHandle;
void ledHandlerTask(void *pvParameters);
void setupLedHandlerTask();
#endif

44
src/tasks/minute.cpp Normal file
View file

@ -0,0 +1,44 @@
#include "minute.hpp"
TaskHandle_t minuteTaskHandle = NULL;
// Define a type for the event callback
std::vector<EventCallback> minuteEventCallbacks; // Define a vector to hold multiple event callbacks
bool eventTriggered = false; // Initialize the event triggered flag to false
void minuteTask(void * parameter) {
while(1) {
#ifdef IS_3C // wait 5 minutes in case of a 3 color screen otherwise it keeps refreshing
if(rtc.getMinute() % 5 == 0 && !eventTriggered) {
eventTriggered = true;
for(auto &callback : minuteEventCallbacks) { // Loop through all the event callbacks and call them
callback();
}
}
if(rtc.getMinute() % 5 != 0 && eventTriggered) { // Reset the event triggered flag if the second is not 0
eventTriggered = false;
}
vTaskDelay(pdMS_TO_TICKS(1000)); // Sleep for 1000 milliseconds to avoid busy waiting
#else
if(rtc.getSecond() == 0 && !eventTriggered) {
eventTriggered = true;
for(auto &callback : minuteEventCallbacks) { // Loop through all the event callbacks and call them
callback();
}
}
if(rtc.getSecond() != 0) { // Reset the event triggered flag if the second is not 0
eventTriggered = false;
}
vTaskDelay(pdMS_TO_TICKS(500)); // Sleep for 500 milliseconds to avoid busy waiting
#endif
}
}
void setupMinuteEvent()
{
xTaskCreate(minuteTask, "MinuteTask", 2048, NULL, 1, &minuteTaskHandle); // Create the FreeRTOS task
}
void registerNewMinuteCallback(EventCallback cb)
{
minuteEventCallbacks.push_back(cb);
}

14
src/tasks/minute.hpp Normal file
View file

@ -0,0 +1,14 @@
#pragma once
#include <Arduino.h>
#include <Wire.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <vector>
#include "shared.hpp"
extern TaskHandle_t minuteTaskHandle;
void minuteTask(void *pvParameters);
void setupMinuteEvent();
void registerNewMinuteCallback(EventCallback cb);

30
src/tasks/mqtt.cpp Normal file
View file

@ -0,0 +1,30 @@
// #include "mqtt.hpp"
// // Define the event that will be emitted when the property is changed
// //EventHandle_t property_changed_event;
// // Define the MQTT client object
// AsyncMqttClient mqtt_client;
// // Define the FreeRTOS task that will handle the MQTT client
// void mqtt_task(void* pvParameters) {
// // Connect to the MQTT broker
// mqtt_client.setServer(MQTT_HOST, 1883);
// #ifdef MQTT_PASSWORD
// mqtt_client.setCredentials(MQTT_USERNAME, MQTT_PASSWORD);
// #endif
// mqtt_client.connect();
// while (!mqtt_client.connected()) {
// delay(1000);
// }
// // Subscribe to the MQTT topic
// mqtt_client.subscribe(MQTT_TOPIC, 0);
// while (1) {
// // Check for incoming MQTT messages
// vTaskDelay(pdMS_TO_TICKS(100));
// }
// }

7
src/tasks/mqtt.hpp Normal file
View file

@ -0,0 +1,7 @@
// #include <AsyncMqttClient.h>
// #include <ArduinoJson.h>
// #include "config.h"
// #include "shared.hpp"
// #include "esp_event.h"
// void mqtt_task(void* pvParameters);

11
test/README Normal file
View file

@ -0,0 +1,11 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html