From ee24c8c86284e46f3ec4b6894964bad595e48e26 Mon Sep 17 00:00:00 2001 From: Ralf Ramsauer Date: Sun, 10 May 2015 22:18:22 +0000 Subject: [PATCH] Initial commit --- CMakeLists.txt | 30 ++ config.h.in | 16 + door.cpp | 42 ++ door.h | 25 ++ epaper.cpp | 53 +++ epaper.h | 31 ++ epaper/Display_COG_Process.c | 650 +++++++++++++++++++++++++++++++ epaper/Display_COG_Process.h | 120 ++++++ epaper/Display_Controller.c | 40 ++ epaper/Display_Controller.h | 34 ++ epaper/Display_Hardware_Driver.c | 258 ++++++++++++ epaper/Display_Hardware_Driver.h | 102 +++++ epaper/Image_EAlogo.h | 234 +++++++++++ epaper/Image_PDlogo.h | 425 ++++++++++++++++++++ epaper/bsp.c | 243 ++++++++++++ epaper/bsp.h | 61 +++ logger.cpp | 192 +++++++++ logger.h | 60 +++ logic.cpp | 236 +++++++++++ logic.h | 56 +++ main.cpp | 31 ++ template.h | 486 +++++++++++++++++++++++ util.cpp | 112 ++++++ util.h | 25 ++ 24 files changed, 3562 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 config.h.in create mode 100644 door.cpp create mode 100644 door.h create mode 100644 epaper.cpp create mode 100644 epaper.h create mode 100644 epaper/Display_COG_Process.c create mode 100644 epaper/Display_COG_Process.h create mode 100644 epaper/Display_Controller.c create mode 100644 epaper/Display_Controller.h create mode 100644 epaper/Display_Hardware_Driver.c create mode 100644 epaper/Display_Hardware_Driver.h create mode 100644 epaper/Image_EAlogo.h create mode 100644 epaper/Image_PDlogo.h create mode 100644 epaper/bsp.c create mode 100644 epaper/bsp.h create mode 100644 logger.cpp create mode 100644 logger.h create mode 100644 logic.cpp create mode 100644 logic.h create mode 100644 main.cpp create mode 100644 template.h create mode 100644 util.cpp create mode 100644 util.h diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2618ac6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) +project(doorlockd) + +option(USE_COLORIZED_LOGS "Colorized logging" ON) + +add_definitions(-std=c++11) + +configure_file ( + "${PROJECT_SOURCE_DIR}/config.h.in" + "${PROJECT_BINARY_DIR}/config.h" +) + +include_directories("${PROJECT_BINARY_DIR}") + +set(SRCS +main.cpp +logger.cpp +door.cpp +epaper.cpp +logic.cpp +util.cpp +epaper/Display_COG_Process.c +epaper/Display_Controller.c +epaper/Display_Hardware_Driver.c +epaper/bsp.c +) + +add_executable(doorlockd ${SRCS}) + +target_link_libraries(doorlockd wiringPi jsoncpp) diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..4e8542d --- /dev/null +++ b/config.h.in @@ -0,0 +1,16 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#cmakedefine USE_COLORIZED_LOGS + +#ifdef DEBUG +#define DEFAULT_LOG_LEVEL LogLevel::debug2 +#else +#define DEFAULT_LOG_LEVEL LogLevel::info +#endif + +#define TOKEN_TIMEOUT 15 +#define LOCKPAGE_PREFIX "https://lock.binary.kitchen/" +#define FIFO_LOCATION "/tmp/fifo" + +#endif diff --git a/door.cpp b/door.cpp new file mode 100644 index 0000000..50c705b --- /dev/null +++ b/door.cpp @@ -0,0 +1,42 @@ +#include +#include + +#include "logger.h" +#include "door.h" + +using namespace std; + + +constexpr int LOCKPIN = 10; + +Door::Door() : _l(Logger::get()) +{ + _l(LogLevel::info, "Initializing Raspberry Pi GPIOs"); + wiringPiSetup(); + pinMode(LOCKPIN, OUTPUT); + + lock(); +} + +Door::~Door() +{ + +} + +Door &Door::get() +{ + static Door d; + return d; +} + +void Door::lock() +{ + _l(LogLevel::info, "Door closed"); + digitalWrite(LOCKPIN, HIGH); +} + +void Door::unlock() +{ + _l(LogLevel::info, "Door opened"); + digitalWrite(LOCKPIN, LOW); +} diff --git a/door.h b/door.h new file mode 100644 index 0000000..0a9e36a --- /dev/null +++ b/door.h @@ -0,0 +1,25 @@ +#ifndef DOOR_H +#define DOOR_H + +#include + +#include "logger.h" + +class Door { + +public: + static Door &get(); + + ~Door(); + + void lock(); + void unlock(); + +private: + + Door(); + + const Logger &_l; +}; + +#endif diff --git a/epaper.cpp b/epaper.cpp new file mode 100644 index 0000000..0cb4279 --- /dev/null +++ b/epaper.cpp @@ -0,0 +1,53 @@ +#include +#include +#include + +#include "logger.h" + +extern "C" { +#include "epaper/bsp.h" +#include "epaper/Display_Controller.h" +} + +#include "epaper.h" + +#include "template.h" + +using namespace std; + +Epaper::Epaper() : + _logger(Logger::get()) +{ + memset(_prevImg, 0xFF, ARRAY_SIZE); + bsp_init(); +} + +Epaper::~Epaper() +{ +} + +Epaper &Epaper::get() +{ + static Epaper e; + return e; +} + +void Epaper::draw(const string &uri) +{ + unsigned char buffer[ARRAY_SIZE]; + snprintf((char*)buffer, ARRAY_SIZE, "qrencode -l M -d 100 -s 5 \"%s\" -o /tmp/qr.png", uri.c_str()); + system((char*)buffer); + + FILE* f = popen("composite -geometry +90+0 /tmp/qr.png /tmp/template.png -colorspace gray -depth 1 gray:-", "r"); + int i = fread(buffer, ARRAY_SIZE, 1, f); + if (i != 1) + { + _logger(LogLevel::error, "Image format error"); + pclose(f); + return; + } + pclose(f); + + epd_DisplayImg(EPDType_270, buffer, _prevImg); + memcpy(_prevImg, buffer, ARRAY_SIZE); +} diff --git a/epaper.h b/epaper.h new file mode 100644 index 0000000..c0826f8 --- /dev/null +++ b/epaper.h @@ -0,0 +1,31 @@ +#ifndef EPAPER_H +#define EPAPER_H + +#include +#include + +#include "logger.h" + +class Epaper { +public: + + constexpr static int HEIGHT = 176; // In Pixel + constexpr static int WIDTH = 33; // In Byte + + constexpr static int ARRAY_SIZE = HEIGHT * WIDTH; + + static Epaper &get(); + ~Epaper(); + + void draw(const std::string &uri); + +private: + + Epaper(); + + uint8_t _prevImg[ARRAY_SIZE]; + + const Logger &_logger; +}; + +#endif diff --git a/epaper/Display_COG_Process.c b/epaper/Display_COG_Process.c new file mode 100644 index 0000000..ef8c600 --- /dev/null +++ b/epaper/Display_COG_Process.c @@ -0,0 +1,650 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +/****************************************************************************** + * Includes + *****************************************************************************/ +//#include "driver_config.h" +//#include "target_config.h" +//#include "type.h" +//#include "gpio.h" +#include "Display_COG_Process.h" +#include "Display_Hardware_Driver.h" +#include "Display_Controller.h" + + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ +#define _GaugeFrameTimeMark 0 + +const COG_Parameters_t COG_Parameters[3]= { + { //for 1.44" + {0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0x00}, + 0x03, + (128/8), + 96, + (((128+96)*2)/8), + (43), + 480 + }, + { //for 2.0" + {0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0x00}, + 0x03, + (200/8), + 96, + (((200+96)*2)/8)+1, + (53), + 480 + }, + { //for 2.7" + {0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00}, + 0x00, + (264/8), + 176, + (((264+176)*2)/8)+1, + 105, + 630 + }, +}; + +const uint8_t ScanTable[4] = {0xC0, 0x30, 0x0C, 0x03}; + + +/****************************************************************************** + * Local variables + *****************************************************************************/ +static uint32_t StageTime = 480; +static COG_LineDataPacket_t COG_Line; +static uint16_t EPD_Type_Index = 0; +static uint16_t cnt = 0; +static uint32_t Currentframe; +static uint8_t *DataLineEven; +static uint8_t *DataLineOdd; +static uint8_t *DataLineScan; +static uint8_t *DisplayOrgPtr; + + +/****************************************************************************** + * Local functions + *****************************************************************************/ +static void SetTemperature_Factor(uint8_t EPD_Type_Index) +{ + int16_t Temperature; + + //Get current temperature + Temperature = epd_get_temperature(); + + if (Temperature < -10) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 17; + } + else if (Temperature < -5) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 12; + } + else if (Temperature < 5) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 8; + } + else if (Temperature < 10) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 4; + } + else if (Temperature < 15) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 3; + } + else if (Temperature < 20) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 2; + } + else if (Temperature < 40) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 1; + } + else + { + StageTime = (COG_Parameters[EPD_Type_Index].StageTime * 7)/10; + } +} + +static void Driver_TypeSelect(uint8_t typeIndex) +{ + switch(typeIndex) + { + case EPDType_144: + DataLineEven=&COG_Line.LineDatas.COG_144LineData.Even[0]; + DataLineOdd=&COG_Line.LineDatas.COG_144LineData.Odd[0]; + DataLineScan=&COG_Line.LineDatas.COG_144LineData.Scan[0]; + break; + case EPDType_200: + DataLineEven=&COG_Line.LineDatas.COG_20LineData.Even[0]; + DataLineOdd=&COG_Line.LineDatas.COG_20LineData.Odd[0]; + DataLineScan=&COG_Line.LineDatas.COG_20LineData.Scan[0]; + break; + case EPDType_270: + DataLineEven=&COG_Line.LineDatas.COG_27LineData.Even[0]; + DataLineOdd=&COG_Line.LineDatas.COG_27LineData.Odd[0]; + DataLineScan=&COG_Line.LineDatas.COG_27LineData.Scan[0]; + break; + } +} + +//#pragma GCC optimize ("-O3") +static void Display_Stage_1 (uint8_t *PreviousPicture) +{ + uint16_t i,j,k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (PreviousPicture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = PreviousPicture; +#endif + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; +//TestPinTrigger(); + cnt = 0; + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + PreviousPicture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = PreviousPicture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, ...) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // check every bit in the line + { + TempByte = (*PreviousPicture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? BLACK3 : WHITE3) + | ((TempByte & 0x20) ? BLACK2 : WHITE2) + | ((TempByte & 0x08) ? BLACK1 : WHITE1) + | ((TempByte & 0x02) ? BLACK0 : WHITE0); + + DataLineOdd[k--] = ((TempByte & 0x01) ? BLACK3 : WHITE3) + | ((TempByte & 0x04) ? BLACK2 : WHITE2) + | ((TempByte & 0x10) ? BLACK1 : WHITE1) + | ((TempByte & 0x40) ? BLACK0 : WHITE0); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? BLACK3 : WHITE3) + | ((TempByte & 0x20) ? BLACK2 : WHITE2) + | ((TempByte & 0x08) ? BLACK1 : WHITE1) + | ((TempByte & 0x02) ? BLACK0 : WHITE0); + + DataLineEven[k--] = ((TempByte & 0x01) ? BLACK3 : WHITE3) + | ((TempByte & 0x04) ? BLACK2 : WHITE2) + | ((TempByte & 0x10) ? BLACK1 : WHITE1) + | ((TempByte & 0x40) ? BLACK0 : WHITE0); +#endif + } +#ifdef DISPLAY_180_DEGREE + PreviousPicture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + // SPI (0x02, 0x25) + epd_SPI_Send_Byte(0x02, 0x2F); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + +//#pragma GCC optimize ("-O3") +static void Display_Stage_2 (uint8_t *PreviousPicture) +{ + uint16_t i, j, k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (PreviousPicture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = PreviousPicture; +#endif + +// TestPinTrigger(); + cnt = 0; + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + PreviousPicture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = PreviousPicture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, ...) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // make every bit in the line black + { + TempByte =(*PreviousPicture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? WHITE3 : NOTHING) + | ((TempByte & 0x20) ? WHITE2 : NOTHING) + | ((TempByte & 0x08) ? WHITE1 : NOTHING) + | ((TempByte & 0x02) ? WHITE0 : NOTHING); + DataLineOdd[k--] = ((TempByte & 0x01) ? WHITE3 : NOTHING) + | ((TempByte & 0x04) ? WHITE2 : NOTHING) + | ((TempByte & 0x10) ? WHITE1 : NOTHING) + | ((TempByte & 0x40) ? WHITE0 : NOTHING); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? WHITE3 : NOTHING) + | ((TempByte & 0x20) ? WHITE2 : NOTHING) + | ((TempByte & 0x08) ? WHITE1 : NOTHING) + | ((TempByte & 0x02) ? WHITE0 : NOTHING); + DataLineEven[k--] = ((TempByte & 0x01) ? WHITE3 : NOTHING) + | ((TempByte & 0x04) ? WHITE2 : NOTHING) + | ((TempByte & 0x10) ? WHITE1 : NOTHING) + | ((TempByte & 0x40) ? WHITE0 : NOTHING); +#endif + } + +#ifdef DISPLAY_180_DEGREE + PreviousPicture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x25); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + + +//#pragma GCC optimize ("-O3") +static void Display_Stage_3 (uint8_t *Picture) +{ + uint16_t i, j,k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (Picture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = Picture; +#endif + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; + cnt = 0; +// TestPinTrigger(); + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + Picture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = Picture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, 0x03) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // check every bit in the line + { + TempByte = (*Picture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? BLACK3 : NOTHING) + | ((TempByte & 0x20) ? BLACK2 : NOTHING ) + | ((TempByte & 0x08) ? BLACK1 : NOTHING ) + | ((TempByte & 0x02) ? BLACK0 : NOTHING ); + + DataLineOdd[k--] = ((TempByte & 0x01) ? BLACK3 : NOTHING) + | ((TempByte & 0x04) ? BLACK2 : NOTHING ) + | ((TempByte & 0x10) ? BLACK1 : NOTHING ) + | ((TempByte & 0x40) ? BLACK0 : NOTHING ); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? BLACK3 : NOTHING) + | ((TempByte & 0x20) ? BLACK2 : NOTHING ) + | ((TempByte & 0x08) ? BLACK1 : NOTHING ) + | ((TempByte & 0x02) ? BLACK0 : NOTHING ); + + DataLineEven[k--] = ((TempByte & 0x01) ? BLACK3 : NOTHING) + | ((TempByte & 0x04) ? BLACK2 : NOTHING ) + | ((TempByte & 0x10) ? BLACK1 : NOTHING ) + | ((TempByte & 0x40) ? BLACK0 : NOTHING ); +#endif + } +#ifdef DISPLAY_180_DEGREE + Picture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + +//#pragma GCC optimize ("-O3") +static void Display_Stage_4 (uint8_t *Picture) +{ + uint16_t i, j,k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (Picture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = Picture; +#endif + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; + cnt = 0; +// TestPinTrigger(); + + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + Picture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = Picture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, ...) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // check every bit in the line + { + TempByte =(*Picture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x20) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x08) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x02) ? WHITE0 : BLACK0 ); + + DataLineOdd[k--] = ((TempByte & 0x01) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x04) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x10) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x40) ? WHITE0 : BLACK0 ); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x20) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x08) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x02) ? WHITE0 : BLACK0 ); + + DataLineEven[k--] = ((TempByte & 0x01) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x04) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x10) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x40) ? WHITE0 : BLACK0 ); +#endif + } +#ifdef DISPLAY_180_DEGREE + Picture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); + +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + +static void Display_Nothing (void) +{ + uint16_t i; // general counters + + for (i = 0; i < COG_Parameters[EPD_Type_Index].HORIZONTAL; i++) // make every bit in the line white + { + DataLineEven[i] = 0x00; + DataLineOdd[i] = 0x00; + } + + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + epd_SPI_Send_Byte(0x04, 0x03); + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); + } +} + +static void Dummy_line(void) +{ + uint16_t i; + + for (i = 0; i < COG_Parameters[EPD_Type_Index].DataLineSize; i++) + { + COG_Line.uint8[i] = 0x00; + } + + epd_SPI_Send_Byte(0x04, 0x03); + + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); +} + + +/****************************************************************************** + * Public functions + *****************************************************************************/ +void epd_HwInit(void) +{ + epd_InitDisplayHardware(); +} + +void epd_PowerOn(void) +{ + epd_discharge_low(); + epd_rst_low(); + epd_cs_low(); + epd_spi_init(); + + epd_pwm_active(5); + + epd_panelon_on(); + + epd_pwm_active(10); + + epd_cs_high(); + + //epd_border_high(); + + epd_rst_high(); + + epd_pwm_active(5); + + epd_rst_low(); + + epd_pwm_active(5); + + epd_rst_high(); + + epd_pwm_active(5); +} + +void epd_InitializeDriver(uint8_t EPDIndex) +{ + uint8_t SendBuffer[2]; + uint16_t k; + + EPD_Type_Index = EPDIndex; + + //Data Line Clear + for (k = 0; k <= __LineDataSize; k ++) + { + COG_Line.uint8[k] = 0x00; + } + Driver_TypeSelect(EPDIndex); + k = 0; + + SetTemperature_Factor(EPDIndex); + + /*while (DRIVERBUSY_Get()) + { + delayT32B0Us(500); + if((k++)>=1000) return;//wait 500 ms + } + */ + + // SPI (0x01, 0x0000, 0x0000, 0x01ff, 0xe000) + epd_SPI_Send(0x01, (uint8_t *)&COG_Parameters[EPDIndex].ChannelSelect, 8); + + epd_SPI_Send_Byte(0x06, 0xff); + epd_SPI_Send_Byte(0x07, 0x9d); + epd_SPI_Send_Byte(0x08, 0x00); + + // SPI (0x09, 0xd000) + SendBuffer[0] = 0xd0; + SendBuffer[1] = 0x00; + epd_SPI_Send(0x09, SendBuffer, 2); + + epd_SPI_Send_Byte(0x04,COG_Parameters[EPDIndex].VoltageLevel); + + epd_SPI_Send_Byte(0x03, 0x01); + epd_SPI_Send_Byte(0x03, 0x00); + + epd_pwm_active(5); + + epd_SPI_Send_Byte(0x05, 0x01); + + epd_pwm_active(30); + + epd_SPI_Send_Byte(0x05, 0x03); + epd_delay_ms(30); + epd_SPI_Send_Byte(0x05, 0x0f); + epd_delay_ms(30); + epd_SPI_Send_Byte(0x02, 0x24); +} + +void epd_Display (uint8_t *pNewImg, uint8_t *pPrevImg) +{ + //COG Process - update display in four steps + Display_Stage_1(pPrevImg); + Display_Stage_2(pPrevImg); + Display_Stage_3(pNewImg); + Display_Stage_4(pNewImg); +} + +void epd_PowerOff (void) +{ + Display_Nothing(); + Dummy_line(); + epd_delay_ms(25); + + //border_low(); + //epd_delay_ms(_30ms); + //border_high(); + + epd_SPI_Send_Byte(0x03, 0x01); + epd_SPI_Send_Byte(0x02, 0x05); + epd_SPI_Send_Byte(0x05, 0x0E); + epd_SPI_Send_Byte(0x05, 0x02); + epd_SPI_Send_Byte(0x04, 0x0C); + epd_delay_ms(120); + epd_SPI_Send_Byte(0x05, 0x00); + epd_SPI_Send_Byte(0x07, 0x0D); + epd_SPI_Send_Byte(0x04, 0x50); + epd_delay_ms(40); + epd_SPI_Send_Byte(0x04, 0xA0); + epd_delay_ms(40); + epd_SPI_Send_Byte(0x04, 0x00); + + epd_rst_low(); + epd_cs_low(); + epd_spi_detach(); + epd_panelon_off(); + + //epd_border_low(); + + epd_discharge_high(); + epd_delay_ms(150); + epd_discharge_low(); +} + + + diff --git a/epaper/Display_COG_Process.h b/epaper/Display_COG_Process.h new file mode 100644 index 0000000..bf4f97f --- /dev/null +++ b/epaper/Display_COG_Process.h @@ -0,0 +1,120 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __Display_COG_Process_H_ +#define __Display_COG_Process_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ + + #include "bsp.h" + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ +#define BLACK0 (0x03) +#define BLACK1 (0x0C) +#define BLACK2 (0x30) +#define BLACK3 (0xc0) +#define WHITE0 (0x02) +#define WHITE1 (0x08) +#define WHITE2 (0x20) +#define WHITE3 (0x80) + +#define NOTHING (0x00) +#define SCANON (0xC0) +#define __LineDataSize 111 + +/* +enum +{ + _5ms, + _10ms, + _25ms, + _30ms, + _40ms, + _120ms, + _150ms, + _300ms +}; +*/ + +typedef enum +{ + EPDType_144 = 0, //1.44" display + EPDType_200 = 1, //2.0" display + EPDType_270 = 2 //2.7" display +} EPDType_t; +#define EPD_TYPE_144 0 +#define EPD_TYPE_200 1 +#define EPD_TYPE_270 2 + +typedef struct +{ + uint8_t Even[16]; + uint8_t Scan[24]; + uint8_t Odd [16]; +} COG_144_LineData_t; + +typedef struct +{ + uint8_t Even[25]; + uint8_t Scan[24]; + uint8_t Odd [25]; + uint8_t DummyData; +} COG_20_LineData_t; + +typedef struct +{ + uint8_t Even[33]; + uint8_t Scan[44]; + uint8_t Odd [33]; + uint8_t DummyData; +} COG_27_LineData_t; + +typedef union +{ + union + { + COG_144_LineData_t COG_144LineData; + COG_20_LineData_t COG_20LineData; + COG_27_LineData_t COG_27LineData; + } LineDatas; + uint8_t uint8[__LineDataSize]; +} COG_LineDataPacket_t; + +typedef struct +{ + uint8_t ChannelSelect[8]; + uint8_t VoltageLevel; + uint16_t HORIZONTAL; + uint16_t VERTICAL; + uint8_t DataLineSize; + uint16_t FrameTime; + uint16_t StageTime; +} COG_Parameters_t; + +extern const COG_Parameters_t COG_Parameters[3]; + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +void epd_HwInit(void); +void epd_PowerOn(void); +void epd_InitializeDriver(uint8_t EPDIndex); +void epd_Display(uint8_t *pNewImg, uint8_t *pPrevImg); +void epd_PowerOff(void); + +#endif //__Display_COG_Process_H_ diff --git a/epaper/Display_Controller.c b/epaper/Display_Controller.c new file mode 100644 index 0000000..9aa5be5 --- /dev/null +++ b/epaper/Display_Controller.c @@ -0,0 +1,40 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +/****************************************************************************** + * Includes + *****************************************************************************/ +//#include "driver_config.h" +//#include "type.h" +//#include "gpio.h" +#include "Display_Controller.h" + +/****************************************************************************** + * Global Functions + *****************************************************************************/ + +void epd_DisplayImg(EPDType_t EPDType, uint8_t *pNewImg, uint8_t *pPrevImg) +{ + //always initialize display (has been powered off before) + epd_HwInit(); + epd_PowerOn(); + epd_InitializeDriver(EPDType); + + //display new picture, but first remove old one + epd_Display(pNewImg, pPrevImg); + + //power down display - picture still displayed + epd_PowerOff(); +} + diff --git a/epaper/Display_Controller.h b/epaper/Display_Controller.h new file mode 100644 index 0000000..8f304e2 --- /dev/null +++ b/epaper/Display_Controller.h @@ -0,0 +1,34 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __Display_Controller_H_ +#define __Display_Controller_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "bsp.h" +#include "Display_COG_Process.h" + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ +#define DISPLAY_IN_USE EPD_TYPE_270 + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +void epd_DisplayImg(EPDType_t EPDType, uint8_t *pNewImg, uint8_t *pPrevImg); + +#endif //__Display_Controller_H_ diff --git a/epaper/Display_Hardware_Driver.c b/epaper/Display_Hardware_Driver.c new file mode 100644 index 0000000..04ff563 --- /dev/null +++ b/epaper/Display_Hardware_Driver.c @@ -0,0 +1,258 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "Display_Hardware_Driver.h" + + +/****************************************************************************** + * Public functions + *****************************************************************************/ +void epd_cs_high(void) +{ + // CS_SET_HIGH; + bsp_pinOut(BSP_PIN_6, 1); +} + +void epd_cs_low(void) +{ + // CS_SET_LOW; + bsp_pinOut(BSP_PIN_6, 0); +} + +void epd_rst_high(void) +{ + // RST_SET_HIGH; + bsp_pinOut(BSP_PIN_12, 1); +} + +void epd_rst_low(void) +{ + // RST_SET_LOW; + bsp_pinOut(BSP_PIN_12, 0); +} + +void epd_discharge_high(void) +{ + // DISCHARGE_SET_HIGH; + bsp_pinOut(BSP_PIN_14, 1); +} + +void epd_discharge_low(void) +{ + // DISCHARGE_SET_LOW; + bsp_pinOut(BSP_PIN_14, 0); +} + +void epd_panelon_off(void) +{ + // PANELON_SET_LOW; + bsp_pinOut(BSP_PIN_13, 0); +} + +void epd_panelon_on(void) +{ + // PANELON_SET_HIGH; + bsp_pinOut(BSP_PIN_13, 1); +} + +void epd_border_high(void) +{ + // BORDER_SET_HIGH; +} + +void epd_border_low(void) +{ + // BORDER_SET_LOW; +} + +void epd_delay_ms(uint32_t Time) +{ + bsp_delayMs(Time); +} + +int16_t epd_get_temperature(void) +{ + return bsp_getTemp(); +} + +uint32_t epd_GetCurrentTimeTick(void) +{ + return bsp_getMsTicks(); +} + +//****************************************************************** +//PWM Configuration/Control +//****************************************************************** +#if 0 +volatile uint32_t period = 500; //96Khz PWM frequency + +void epd_pwm_disable(void) +{ + disable_timer16(1); + LPC_IOCON->PIO1_9 &= 0xFC;//Disable PWM,set general IO + PWM_DIR_OUT(); + PWM_SET_LOW(); +} + +void epd_pwm_active(void) +{ + PWM_SET_HIGH(); + /* Initialize the PWM in timer32_1 enabling match0 output */ + init_timer16PWM(1, period, MATCH0,0); + setMatch_timer16PWM (1, 1, period/8); + enable_timer16(1); +} +#endif +void epd_pwm_active(uint16_t delayInMs) +{ + uint16_t numOfIterations; + + numOfIterations = delayInMs * 100; + // PWM_DIR_OUT; + bsp_pinMode(BSP_PIN_11, BSP_PINMODE_OUTPUT); + for(; numOfIterations > 0; numOfIterations--) + { + // PWM_SET_HIGH; + bsp_pinOut(BSP_PIN_11, 1); + bsp_delayUs(5); //100kHz (96kHz ideal) + // PWM_SET_LOW; + bsp_pinOut(BSP_PIN_11, 0); + bsp_delayUs(5); + } +} + + +//****************************************************************** +//SPI Configuration +//****************************************************************** +void epd_spi_detach(void) +{ +#if 0 + LPC_IOCON->PIO0_8 &= 0xFC;; /* SSP I/O config */ + SPIMISO_DIR_OUT(); + SPIMISO_Set(Low); + + LPC_IOCON->PIO0_9 &= 0xFC; /* SSP MOSI */ + SPIMOSI_DIR_OUT(); + SPIMOSI_Set(Low); + + LPC_IOCON->PIO2_11 &= 0xFC; + SPICLK_DIR_OUT(); + SPICLK_Set(Low); +#endif +} +void epd_spi_init (void) +{ + bsp_spiInit(); +//SSP_IOConfig( SSP_PORT ); /* initialize SSP port */ +//SSP_Init( SSP_PORT ); +} + +void epd_SPI_Send (unsigned char Register, unsigned char *Data, unsigned Length) +{ + uint8_t buf[2]; + + epd_cs_low(); + buf[0] = 0x70; + buf[1] = Register; + bsp_writeToDisplay(buf, 2); + epd_cs_high(); + bsp_delayUs(10); + + epd_cs_low(); + buf[0] = 0x72; + bsp_writeToDisplay(buf, 1); + bsp_writeToDisplay(Data, Length); + epd_cs_high(); + bsp_delayUs(10); +} + + + +void epd_SPI_Send_Byte (uint8_t Register, uint8_t Data) +{ + uint8_t buf[2]; + + epd_cs_low(); + buf[0] = 0x70; + buf[1] = Register; + bsp_writeToDisplay(buf, 2); + epd_cs_high(); + bsp_delayUs(10); + + epd_cs_low(); + buf[0] = 0x72; + buf[1] = Data; + bsp_writeToDisplay(buf, 2); + epd_cs_high(); + bsp_delayUs(10); +} + +void epd_InitDisplayHardware(void) +{ + // RST_DIR_OUT; + bsp_pinMode(BSP_PIN_12, BSP_PINMODE_OUTPUT); + // DISCHARGE_DIR_OUT; + bsp_pinMode(BSP_PIN_14, BSP_PINMODE_OUTPUT); + // CS_DIR_OUT; + bsp_pinMode(BSP_PIN_6, BSP_PINMODE_OUTPUT); + // PANELON_DIR_OUT; + bsp_pinMode(BSP_PIN_13, BSP_PINMODE_OUTPUT); + // DRIVERBUSY_DIR_IN; + bsp_pinMode(BSP_PIN_7, BSP_PINMODE_INPUT); + // BORDER_DIR_OUT; + + + epd_panelon_off(); + epd_spi_init(); + epd_cs_low(); + // epd_pwm_low(); + epd_pwm_active(0); //set output low + epd_rst_low(); + epd_discharge_low(); + +// TESTPin_DIR_OUT(); +// TESTPin2_DIR_OUT(); +} + +//************************************************************************ +void TestPinLow(void) +{ +// TESTPin_Set(0); +} +void TestPinHigh(void) +{ +// TESTPin_Set(1); +} +void TestPinTrigger(void) +{ +// if(TESTPin_Get())TestPinLow(); +// else TestPinHigh(); +} +void TestPin2Low(void) +{ +// TESTPin2_Set(0); +} +void TestPin2High(void) +{ +// TESTPin2_Set(1); +} +void TestPin2Trigger(void) +{ +// if(TESTPin2_Get())TestPin2Low(); +// else TestPin2High(); +} diff --git a/epaper/Display_Hardware_Driver.h b/epaper/Display_Hardware_Driver.h new file mode 100644 index 0000000..a84cf35 --- /dev/null +++ b/epaper/Display_Hardware_Driver.h @@ -0,0 +1,102 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __DISPLAY_HARDWARE_DRIVER_H_ +#define __DISPLAY_HARDWARE_DRIVER_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ + +#include "bsp.h" + + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ + +//Pin 12 on Serial Expansion Connector +// #define RST_DIR_OUT SEC14_PIN12_SET_OUTP +// #define RST_SET_HIGH SEC14_PIN12_SET_HIGH +// #define RST_SET_LOW SEC14_PIN12_SET_LOW + +//Pin 14 on Serial Expansion Connector +// #define DISCHARGE_DIR_OUT SEC14_PIN14_SET_OUTP +// #define DISCHARGE_SET_HIGH SEC14_PIN14_SET_HIGH +// #define DISCHARGE_SET_LOW SEC14_PIN14_SET_LOW + +//Pin 6 on Serial Expansion Connector +// #define CS_DIR_OUT SEC14_PIN6_SET_OUTP +// #define CS_SET_HIGH SEC14_PIN6_SET_HIGH +// #define CS_SET_LOW SEC14_PIN6_SET_LOW + +//Pin 13 on Serial Expansion Connector +// #define PANELON_DIR_OUT SEC14_PIN13_SET_OUTP +// #define PANELON_SET_HIGH SEC14_PIN13_SET_HIGH +// #define PANELON_SET_LOW SEC14_PIN13_SET_LOW + +//Pin 7 on Serial Expansion Connector +// #define DRIVERBUSY_DIR_IN SEC14_PIN7_SET_INP +// #define DRIVERBUSY_GET SEC14_PIN7_INP + +//Not implemented +// #define BORDER_DIR_OUT +// #define BORDER_SET_HIGH +// #define BORDER_SET_LOW + +//Pin 11 on Serial Expansion Connector +// #define PWM_DIR_OUT SEC14_PIN11_SET_OUTP +// #define PWM_SET_HIGH SEC14_PIN11_SET_HIGH +// #define PWM_SET_LOW SEC14_PIN11_SET_LOW + + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +void epd_cs_high(void); +void epd_cs_low(void); +void epd_rst_high(void); +void epd_rst_low(void); +void epd_discharge_high(void); +void epd_discharge_low(void); +void epd_panelon_off(void); +void epd_panelon_on(void); + +void epd_pwm_active(uint16_t delayInMs); + +void epd_border_high(void); +void epd_border_low(void); + +void epd_TestPinLow(void); +void epd_TestPinHigh(void); +void epd_TestPinTrigger(void); + +void epd_TestPin2Low(void); +void epd_TestPin2High(void); +void epd_TestPin2Trigger(void); + +void epd_delay_ms(uint32_t Time); +int16_t epd_get_temperature(void); +uint32_t epd_GetCurrentTimeTick(void); + +/***************************************************************************/ +void epd_spi_detach(void); +void epd_spi_init (void); +void epd_SPI_Send (unsigned char Register, unsigned char *Data, unsigned Length); +void epd_SPI_Send_Byte (uint8_t Register, uint8_t Data); +void epd_InitDisplayHardware (void); + +/****************************************************************************/ + +#endif //__DISPLAY_HARDWARE_DRIVER_H_ diff --git a/epaper/Image_EAlogo.h b/epaper/Image_EAlogo.h new file mode 100644 index 0000000..8419150 --- /dev/null +++ b/epaper/Image_EAlogo.h @@ -0,0 +1,234 @@ +/***************************************************************************** + * + * Copyright(C) 2012, Embedded Artists AB + * All rights reserved. + * + ****************************************************************************** + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * products. This software is supplied "AS IS" without any warranties. + * Embedded Artists AB assumes no responsibility or liability for the + * use of the software, conveys no license or title under any patent, + * copyright, or mask work right to the product. Embedded Artists AB + * reserves the right to make changes in the software without + * notification. Embedded Artists AB also make no representation or + * warranty that such application will be suitable for the specified + * use without further testing or modification. + *****************************************************************************/ +#ifndef __IMAGE_EALOGO_H_ +#define __IMAGE_EALOGO_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "Display_Controller.h" + +//White=>1 +//Black=>0 + +#if(DISPLAY_IN_USE == EPD_TYPE_144) +unsigned char const ImageDataEA[96][16]= +{ + 0 //Does not exist +}; +unsigned char PreloadImage[96][16]; + +#endif + + +#if(DISPLAY_IN_USE == EPD_TYPE_200) +unsigned char const ImageDataEA[96][25] = +{ +0 //Does not exist +}; + +unsigned char PreloadImage[96][32]; + +#endif + +#if(DISPLAY_IN_USE == EPD_TYPE_270) +unsigned char const ImageDataEA[176][33]= +{ + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0xF3, 0xF3, 0xFF, 0xE7, 0xF1, 0xFF, 0xB3, 0xFF, 0x7F, 0x9F, 0x8F, 0xC1, 0x27, 0xC0, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0x79, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0xF3, 0xF3, 0xFF, 0xE7, 0xF1, 0xFF, 0x33, 0xFE, 0x7F, 0x9F, 0x07, 0xC1, 0x27, 0xC0, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xF0, 0x39, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xFF, 0xFF, 0x9F, 0xFF, 0xF3, 0xF3, 0xFF, 0xE7, 0xF1, 0xFF, 0x3F, 0xFE, 0x7F, 0x9E, 0x67, 0xF9, 0x27, 0xCF, 0xFC, 0xE7, 0xFF, 0xFF, 0xFF, 0xF3, 0x1F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF8, 0x33, 0x83, 0xC7, 0x93, 0x93, 0x8F, 0x27, 0xE4, 0xE4, 0x13, 0x8C, 0x31, 0x9E, 0x67, 0xFB, 0x27, 0xCF, 0xFC, 0xE4, 0x39, 0x3C, 0x72, 0xF3, 0x99, 0xC7, 0x27, 0x30, 0xCE, 0x7F, 0xFF}, + {0xFF, 0xFC, 0x08, 0x01, 0x81, 0x93, 0x03, 0x03, 0x26, 0x07, 0xE4, 0xE0, 0x13, 0x04, 0x20, 0xFF, 0xE7, 0xF3, 0xFF, 0xC0, 0xFC, 0xE0, 0x18, 0x19, 0x30, 0xF3, 0x99, 0x83, 0x03, 0x20, 0x4E, 0x7F, 0xFF}, + {0xFF, 0xFC, 0x09, 0x99, 0x99, 0x93, 0x33, 0x33, 0x26, 0x67, 0xE4, 0xE7, 0x33, 0x36, 0x66, 0xFF, 0xCF, 0xF3, 0xFF, 0xC0, 0xFC, 0x01, 0x99, 0x99, 0x33, 0xF3, 0x99, 0x9B, 0x33, 0x26, 0x64, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF9, 0x99, 0x99, 0x83, 0x33, 0x33, 0x06, 0x67, 0xCE, 0x67, 0x33, 0x0E, 0x61, 0xFF, 0x8F, 0xF7, 0xFF, 0xCF, 0x84, 0x0E, 0x19, 0x98, 0x33, 0xF3, 0x99, 0x87, 0x33, 0x38, 0x64, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF9, 0x99, 0x99, 0x9F, 0x33, 0x33, 0x3E, 0x67, 0xC0, 0x67, 0x33, 0xC6, 0x78, 0xFF, 0x1F, 0xE7, 0xFF, 0xCF, 0x84, 0xF8, 0x19, 0x99, 0xF3, 0xF3, 0x99, 0xE3, 0x33, 0x20, 0x64, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF9, 0x99, 0x99, 0x93, 0x33, 0x33, 0x26, 0x67, 0xC0, 0x67, 0x33, 0x66, 0x6C, 0xFF, 0x3F, 0xE7, 0xFF, 0xCF, 0xFC, 0xF9, 0x99, 0x99, 0x33, 0xF3, 0x19, 0xB3, 0x33, 0x26, 0x75, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x09, 0x99, 0x81, 0x93, 0x03, 0x03, 0x26, 0x07, 0x9F, 0x27, 0x13, 0x06, 0x20, 0xFE, 0x04, 0xE7, 0xFF, 0xC0, 0xFC, 0xF8, 0x18, 0x19, 0x33, 0xF0, 0x39, 0x83, 0x03, 0x20, 0x71, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x09, 0x99, 0x93, 0xC7, 0x93, 0x93, 0x8F, 0x27, 0x9F, 0x27, 0x93, 0x8F, 0x31, 0xFE, 0x04, 0xE7, 0xFF, 0xC0, 0xFC, 0xFC, 0x99, 0x3C, 0x73, 0xF0, 0x79, 0xC7, 0x27, 0x32, 0x71, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xF3, 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, 0xE7, 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, 0xCF, 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, 0xDF, 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, 0xBF, 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, 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, 0xFE, 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, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xF9, 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, 0xF1, 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, 0xF3, 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, 0xE3, 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, 0xC7, 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, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0xC3, 0x3C, 0x0C, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0xC3, 0x3C, 0x0C, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0x33, 0x3C, 0xF3, 0x3F, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0x33, 0x3C, 0xF3, 0x3F, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFE, 0x3F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0x30, 0x0C, 0x0C, 0x0F, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFC, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0x30, 0x0C, 0x0C, 0x0F, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0x3F, 0xC0, 0x3C, 0xC3, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0x3F, 0xC0, 0x3C, 0xC3, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0xF3, 0xF3, 0x00, 0xFF, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0xF3, 0xF3, 0x00, 0xFF, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0xFC, 0x0F, 0x30, 0xC3, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0xFC, 0x0F, 0x30, 0xC3, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x83, 0xE0, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0xC3, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0xC3, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x0F, 0xF0, 0x0F, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xF1, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x3F, 0xCC, 0xF3, 0xCF, 0x0F, 0x33, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0F, 0xF0, 0x0F, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xF1, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x3F, 0xCC, 0xF3, 0xCF, 0x0F, 0x33, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x03, 0xE0, 0xFF, 0x80, 0x10, 0x03, 0x80, 0x07, 0xF0, 0x1F, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xF1, 0xFF, 0xFC, 0x7F, 0xFF, 0xF3, 0x33, 0xFC, 0xCC, 0xF3, 0x33, 0xCC, 0xC0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x07, 0xE1, 0xFF, 0xF0, 0x1E, 0x01, 0x80, 0x07, 0xF1, 0xFF, 0x9C, 0xE2, 0x7C, 0x3E, 0x47, 0x91, 0xC3, 0xE4, 0x7F, 0xFF, 0xF3, 0x33, 0xFC, 0xCC, 0xF3, 0x33, 0xCC, 0xC0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x07, 0xE1, 0xFF, 0xF8, 0x1F, 0x01, 0xC0, 0x07, 0xF1, 0xF8, 0x00, 0x60, 0x38, 0x1C, 0x07, 0x01, 0x81, 0xC0, 0x7F, 0xFF, 0xF3, 0x0C, 0x33, 0xCF, 0x03, 0xC0, 0xFC, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x07, 0xE1, 0xFF, 0xFC, 0x0F, 0x81, 0xC0, 0x03, 0xF0, 0x18, 0x00, 0x60, 0x10, 0x8C, 0x07, 0x01, 0x08, 0xC0, 0x7F, 0xFF, 0xF3, 0x0C, 0x33, 0xCF, 0x03, 0xC0, 0xFC, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x07, 0xE1, 0xFF, 0xFC, 0x0F, 0xC0, 0xE0, 0x03, 0xF0, 0x18, 0xC4, 0x63, 0x11, 0x88, 0x46, 0x21, 0x18, 0x84, 0x7F, 0xFF, 0xFC, 0xFF, 0xF0, 0xFF, 0x00, 0xF3, 0x30, 0xCC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xC0, 0xE0, 0x03, 0xF0, 0x18, 0xC4, 0x63, 0x10, 0x08, 0xC6, 0x21, 0x00, 0x8C, 0x7F, 0xFF, 0xFC, 0xFF, 0xF0, 0xFF, 0x00, 0xF3, 0x30, 0xCC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xC0, 0xF0, 0x03, 0xF0, 0xF8, 0xC4, 0x63, 0x10, 0x08, 0xC6, 0x31, 0x00, 0x8C, 0x7F, 0xFF, 0xF3, 0xF3, 0x30, 0x33, 0x30, 0xCC, 0x33, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xC0, 0xF0, 0x03, 0xF1, 0xF8, 0xC4, 0x63, 0x10, 0xF8, 0xC6, 0x31, 0x1F, 0x8C, 0x7F, 0xFF, 0xF3, 0xF3, 0x30, 0x33, 0x30, 0xCC, 0x33, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFC, 0x00, 0x00, 0xF0, 0x03, 0xF1, 0xF8, 0xC4, 0x63, 0x11, 0xF8, 0xC6, 0x31, 0x1F, 0x8C, 0x7F, 0xFF, 0xF0, 0x3C, 0xFF, 0xFC, 0xC3, 0x00, 0x0F, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xF8, 0x00, 0x00, 0xF0, 0x03, 0xF0, 0x38, 0xC4, 0x63, 0x11, 0x88, 0x46, 0x21, 0x18, 0x84, 0x7F, 0xFF, 0xF0, 0x3C, 0xFF, 0xFC, 0xC3, 0x00, 0x0F, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE1, 0xFF, 0xF0, 0x00, 0x00, 0xF8, 0x03, 0xF0, 0x08, 0xC4, 0x60, 0x30, 0x0C, 0x07, 0x01, 0x00, 0xC0, 0x7F, 0xFF, 0xFF, 0x30, 0x3F, 0xF3, 0x00, 0xC3, 0x33, 0xF3, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE1, 0xFF, 0xC0, 0x00, 0x00, 0xF8, 0x03, 0xF0, 0x08, 0xC4, 0x60, 0x38, 0x1C, 0x07, 0x01, 0x81, 0xC0, 0x7F, 0xFF, 0xFF, 0x30, 0x3F, 0xF3, 0x00, 0xC3, 0x33, 0xF3, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE1, 0xFE, 0x00, 0x1F, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0x7C, 0x3E, 0x7F, 0x9F, 0xC3, 0xE7, 0xFF, 0xFF, 0xFC, 0xFF, 0xCC, 0xF3, 0x30, 0xF3, 0xC3, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE0, 0x00, 0x00, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xCC, 0xF3, 0x30, 0xF3, 0xC3, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x3F, 0x0C, 0x0C, 0x33, 0x30, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x07, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xE3, 0x8F, 0xFC, 0x7F, 0xFF, 0xFF, 0xF3, 0x00, 0x3F, 0x0C, 0x0C, 0x33, 0x30, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xC7, 0x1F, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x0F, 0xFF, 0x00, 0x0F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0xFC, 0x0F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xC7, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x0F, 0xFF, 0x00, 0x0F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x01, 0xE0, 0xFC, 0x0F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE2, 0x03, 0x1C, 0x18, 0x30, 0x7F, 0xFF, 0xFF, 0x0F, 0x33, 0xF3, 0xFF, 0x00, 0xC3, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x01, 0xE0, 0xFC, 0x1F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x03, 0x18, 0x10, 0x20, 0x3F, 0xFF, 0xFF, 0x0F, 0x33, 0xF3, 0xFF, 0x00, 0xC3, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x01, 0xE0, 0xFC, 0x0F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xE0, 0x87, 0x11, 0x98, 0x66, 0x3F, 0xFF, 0xF0, 0x3C, 0xF3, 0x33, 0xC0, 0xC3, 0xC0, 0xFC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0xE0, 0x7C, 0x0F, 0xFF, 0xE0, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0xE3, 0x8E, 0x31, 0xB8, 0xC7, 0x7F, 0xFF, 0xF0, 0x3C, 0xF3, 0x33, 0xC0, 0xC3, 0xC0, 0xFC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0xE0, 0x3E, 0x07, 0xFF, 0xE0, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0xC7, 0x8E, 0x30, 0x78, 0xC1, 0xFF, 0xFF, 0xFF, 0x30, 0x30, 0xC3, 0xF3, 0x33, 0x03, 0xC0, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0x70, 0x1E, 0x03, 0xFF, 0xE0, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xC7, 0x8E, 0x30, 0x38, 0xE0, 0x7F, 0xFF, 0xFF, 0x30, 0x30, 0xC3, 0xF3, 0x33, 0x03, 0xC0, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0x30, 0x03, 0x00, 0x7F, 0xE0, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xC7, 0x8E, 0x3C, 0x10, 0xF0, 0x7F, 0xFF, 0xF0, 0x30, 0xCC, 0xCF, 0xF3, 0xC3, 0x33, 0xC0, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xC7, 0x8E, 0x3E, 0x11, 0xFC, 0x7F, 0xFF, 0xF0, 0x30, 0xCC, 0xCF, 0xF3, 0xC3, 0x33, 0xC0, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0x38, 0xC7, 0x0C, 0x63, 0x31, 0x8C, 0x7F, 0xFF, 0xF3, 0x33, 0x3C, 0xF3, 0x0C, 0x3C, 0x3F, 0xC0, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0x38, 0x8F, 0x04, 0x60, 0x30, 0x80, 0x7F, 0xFF, 0xF3, 0x33, 0x3C, 0xF3, 0x0C, 0x3C, 0x3F, 0xC0, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x38, 0x8F, 0x8C, 0x60, 0x70, 0xC0, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0x0C, 0xC3, 0xF3, 0xCF, 0xC3, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0x0C, 0xC3, 0xF3, 0xCF, 0xC3, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0x0C, 0xCF, 0xCC, 0x33, 0xF0, 0x00, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0x0C, 0xCF, 0xCC, 0x33, 0xF0, 0x00, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC0, 0x33, 0x00, 0x33, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC0, 0x33, 0x00, 0x33, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3C, 0x30, 0xC0, 0xFF, 0x03, 0x33, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3C, 0x30, 0xC0, 0xFF, 0x03, 0x33, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x33, 0xCC, 0x0C, 0x03, 0xF0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x33, 0xCC, 0x0C, 0x03, 0xF0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0x00, 0xFF, 0xFC, 0x30, 0x03, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0x00, 0xFF, 0xFC, 0x30, 0x03, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0xCF, 0x03, 0xC0, 0xF3, 0xC3, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0xCF, 0x03, 0xC0, 0xF3, 0xC3, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0xCC, 0xCC, 0x30, 0xF3, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0xCC, 0xCC, 0x30, 0xF3, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3C, 0xFC, 0xC0, 0xCF, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3C, 0xFC, 0xC0, 0xCF, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xC3, 0x03, 0x3C, 0x00, 0xFF, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xC3, 0x03, 0x3C, 0x00, 0xFF, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 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, 0x9F, 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, 0xBF, 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, 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, 0xFE, 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, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 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, 0xFB, 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, 0xF7, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; + +unsigned char PreloadImage[176][33]; + +#endif + +#endif //__IMAGE_EALOGO_H_ diff --git a/epaper/Image_PDlogo.h b/epaper/Image_PDlogo.h new file mode 100644 index 0000000..be03a5c --- /dev/null +++ b/epaper/Image_PDlogo.h @@ -0,0 +1,425 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __IMAGE_PDLOGO_H_ +#define __IMAGE_PDLOGO_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "Display_Controller.h" + +//White=>1 +//Black=>0 + +#if(DISPLAY_IN_USE == EPD_TYPE_144) + +unsigned char const ImageDataPD[96][16]= +{ + {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, 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, 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, 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}, + {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, 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, 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, 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}, + {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, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xE0, 0xC1, 0x81, 0x9F, 0x77, 0xC1, 0x93, 0xE4, 0x1C, 0x07, 0x38, 0x60, 0xCF, 0xF3, 0x3E, 0xC7}, + {0xE6, 0x4F, 0x98, 0x8E, 0x67, 0x99, 0x9B, 0xEC, 0xFC, 0xF3, 0x33, 0xE6, 0x4F, 0xF3, 0x9C, 0xBB}, + {0xE7, 0x4F, 0x9C, 0x8E, 0x63, 0x9F, 0x99, 0xCC, 0xFC, 0xF9, 0x37, 0xE7, 0x4F, 0xF1, 0x9D, 0xBF}, + {0xE7, 0x4F, 0x9C, 0xCE, 0xC3, 0x8F, 0x99, 0xCC, 0xFC, 0xF9, 0x33, 0xE7, 0x4F, 0xED, 0xC9, 0x9F}, + {0xE6, 0x41, 0x99, 0xC4, 0xD1, 0xC7, 0x9C, 0xDC, 0x1C, 0xFD, 0x38, 0xE4, 0x4F, 0xEC, 0xE3, 0xC7}, + {0xE0, 0xCF, 0x83, 0xE5, 0x99, 0xE3, 0x9C, 0xDC, 0xFC, 0xFD, 0x3C, 0x61, 0xCF, 0xC0, 0xF7, 0xF3}, + {0xE7, 0xCF, 0x81, 0xE1, 0x81, 0xF3, 0x9C, 0x9C, 0xFC, 0xF9, 0x3F, 0x27, 0xCF, 0xDC, 0xF7, 0xFB}, + {0xE7, 0xCF, 0x99, 0xE1, 0x3C, 0xF9, 0x9E, 0x3C, 0xFC, 0xF9, 0x3F, 0x27, 0xCF, 0x9E, 0x77, 0xFB}, + {0xE7, 0xCF, 0x98, 0xF3, 0x3C, 0x99, 0x9E, 0x3C, 0xFC, 0xF3, 0x37, 0x67, 0xCF, 0xBE, 0x77, 0xBB}, + {0xE7, 0xC1, 0x9C, 0xF3, 0x7E, 0xC3, 0x9F, 0x7C, 0x1C, 0x07, 0x30, 0xE7, 0xC0, 0xBF, 0x37, 0xC7}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x9F, 0xFF, 0xCF, 0xFF, 0xFC, 0xFE, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x9F, 0xFF, 0xCF, 0xFF, 0xFC, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0xFF, 0xCF, 0xFF, 0xFC, 0xFE, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0xC1, 0xC8, 0xFC, 0x3C, 0xFE, 0x7E, 0x78, 0x79, 0x18, 0xFC, 0x3F, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0x80, 0xC0, 0x78, 0x1C, 0xFE, 0x7E, 0x70, 0x38, 0x00, 0x78, 0x1F, 0xFF}, + {0xFF, 0xC0, 0xFF, 0x9F, 0xBC, 0xC6, 0x31, 0x8C, 0xFE, 0x7E, 0x63, 0x18, 0xC6, 0x71, 0x8F, 0xFF}, + {0xFF, 0xC0, 0xE1, 0x9F, 0xFC, 0xCF, 0x33, 0xCC, 0xFE, 0x7E, 0x67, 0x99, 0xCE, 0x73, 0xCF, 0xFF}, + {0xFF, 0xCF, 0xE1, 0x9F, 0xC0, 0xCF, 0x30, 0x0C, 0xFE, 0x7E, 0x60, 0x19, 0xCE, 0x73, 0xCF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0x9C, 0xCF, 0x33, 0xFC, 0xFE, 0x7E, 0x67, 0xF9, 0xCE, 0x73, 0xCF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0x9C, 0xC6, 0x31, 0xEC, 0xFE, 0x7C, 0xE3, 0xD9, 0xCE, 0x71, 0x8F, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x80, 0x80, 0xC0, 0x78, 0x0C, 0xFE, 0x00, 0xF0, 0x19, 0xCE, 0x78, 0x1F, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x80, 0xC4, 0xC8, 0xFC, 0x1C, 0xFE, 0x03, 0xF8, 0x39, 0xCE, 0x7C, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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} +}; +unsigned char PreloadImage[96][16]; + +#endif + + + +#if(DISPLAY_IN_USE == EPD_TYPE_200) + +unsigned char const ImageDataPD[96][25] = +{ + // 5 10 15 20 25 + {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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 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}, + {0xFE, 0x03, 0xE0, 0x1C, 0x0E, 0x0F, 0xE3, 0xBF, 0xE0, 0xF1, 0x07, 0xF1, 0x00, 0xF0, 0x07, 0xFF, 0xE1, 0xF0, 0x1E, 0x3F, 0xFE, 0xF1, 0xF9, 0xC3, 0xFF}, + {0xFE, 0x00, 0xE0, 0x1C, 0x03, 0x0F, 0xC7, 0x3F, 0x80, 0x71, 0x87, 0xE3, 0x00, 0xF0, 0x00, 0xF1, 0xC0, 0x73, 0x0E, 0x3F, 0xFC, 0xF1, 0xF9, 0x80, 0xFF}, + {0xFE, 0x38, 0x63, 0xFC, 0x61, 0x07, 0xC7, 0x1F, 0x0E, 0x31, 0x83, 0xE3, 0x1F, 0xF1, 0xF0, 0x71, 0x8E, 0x73, 0xC6, 0x3F, 0xFC, 0x78, 0xF3, 0x1C, 0xFF}, + {0xFE, 0x3C, 0x63, 0xFC, 0x71, 0x87, 0xCE, 0x1F, 0x1E, 0x31, 0xC3, 0xE7, 0x1F, 0xF1, 0xFC, 0x71, 0x9F, 0x73, 0xE6, 0x3F, 0xF8, 0x78, 0xF3, 0x3E, 0xFF}, + {0xFE, 0x3C, 0x63, 0xFC, 0x71, 0x87, 0x8E, 0x0F, 0x1F, 0xF1, 0xC3, 0xC7, 0x1F, 0xF1, 0xFC, 0x31, 0x9F, 0xF3, 0xE6, 0x3F, 0xF8, 0x3C, 0x67, 0x3F, 0xFF}, + {0xFE, 0x3C, 0x63, 0xFC, 0x71, 0xC3, 0x9C, 0xCF, 0x0F, 0xF1, 0xE1, 0xCF, 0x1F, 0xF1, 0xFE, 0x31, 0x8F, 0xF3, 0xE6, 0x3F, 0xF3, 0x3E, 0x67, 0x1F, 0xFF}, + {0xFE, 0x38, 0x63, 0xFC, 0x61, 0xC3, 0x9C, 0xC7, 0x87, 0xF1, 0xE1, 0xCF, 0x1F, 0xF1, 0xFE, 0x31, 0x83, 0xF3, 0xC6, 0x3F, 0xF3, 0x3E, 0x0F, 0x07, 0xFF}, + {0xFE, 0x00, 0x60, 0x1C, 0x03, 0xE1, 0x3D, 0xE7, 0xC3, 0xF1, 0xF0, 0x9F, 0x00, 0xF1, 0xFE, 0x31, 0xC0, 0xF3, 0x0E, 0x3F, 0xF7, 0x9F, 0x0F, 0x81, 0xFF}, + {0xFE, 0x00, 0xE0, 0x1C, 0x0F, 0xE1, 0x39, 0xE3, 0xE0, 0xF1, 0xF0, 0x9F, 0x00, 0xF1, 0xFE, 0x31, 0xE0, 0x70, 0x1E, 0x3F, 0xE0, 0x1F, 0x9F, 0xC0, 0xFF}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x07, 0xE0, 0x38, 0x03, 0xF0, 0x71, 0xF0, 0x1F, 0x1F, 0xF1, 0xFE, 0x31, 0xF8, 0x33, 0xFE, 0x3F, 0xE0, 0x0F, 0x9F, 0xF0, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x03, 0xF0, 0x70, 0x03, 0xFC, 0x31, 0xF8, 0x3F, 0x1F, 0xF1, 0xFE, 0x31, 0xFE, 0x33, 0xFE, 0x3F, 0xCF, 0x8F, 0x9F, 0xFC, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x43, 0xF0, 0x71, 0xE1, 0x3E, 0x31, 0xF8, 0x3F, 0x1F, 0xF1, 0xFC, 0x31, 0xFE, 0x33, 0xFE, 0x3F, 0xCF, 0x8F, 0x9F, 0xFC, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x61, 0xF8, 0xF3, 0xE1, 0x1E, 0x31, 0xFC, 0x7F, 0x1F, 0xF1, 0xF8, 0x71, 0xBE, 0x33, 0xFE, 0x3F, 0xDF, 0xC7, 0x9F, 0x7C, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x70, 0xF8, 0xE3, 0xE0, 0x06, 0x31, 0xFC, 0x7F, 0x1F, 0xF1, 0xF0, 0xF1, 0x1C, 0x73, 0xFE, 0x3F, 0x9F, 0xC7, 0x9E, 0x38, 0xFF}, + {0xFE, 0x3F, 0xE0, 0x1C, 0x78, 0x7D, 0xE3, 0xF0, 0x80, 0x71, 0xFE, 0x7F, 0x00, 0xF0, 0x01, 0xF1, 0x00, 0x73, 0xFE, 0x01, 0x9F, 0xE3, 0x9E, 0x00, 0xFF}, + {0xFE, 0x3F, 0xE0, 0x1C, 0x7C, 0x7D, 0xE3, 0xF0, 0xE0, 0xF1, 0xFF, 0xFF, 0x00, 0xF0, 0x0F, 0xF1, 0x81, 0xF3, 0xFE, 0x01, 0xBF, 0xE3, 0x9F, 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, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x7F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x3E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0xE0, 0x7C, 0x61, 0xFE, 0x0F, 0xC7, 0xFE, 0x3F, 0x8F, 0xE0, 0xFC, 0x61, 0xE1, 0xFE, 0x07, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0x80, 0x3C, 0x00, 0x78, 0x07, 0xC7, 0xFE, 0x3F, 0x87, 0x80, 0x7C, 0x00, 0x80, 0xF8, 0x03, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFC, 0x7F, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC7, 0xFE, 0x3F, 0xC7, 0x00, 0x3C, 0x00, 0x00, 0x70, 0x01, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFC, 0x7F, 0x9F, 0x1C, 0x3C, 0x31, 0xE1, 0xC7, 0xFE, 0x3F, 0xC7, 0x1E, 0x1C, 0x38, 0x38, 0x71, 0xF0, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFC, 0x7F, 0xFF, 0x1C, 0x7E, 0x23, 0xF1, 0xC7, 0xFE, 0x3F, 0xC6, 0x3F, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x0C, 0x7F, 0xE0, 0x1C, 0x7E, 0x23, 0xF1, 0xC7, 0xFE, 0x3F, 0xC6, 0x3F, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x0C, 0x7F, 0x80, 0x1C, 0x7E, 0x20, 0x01, 0xC7, 0xFE, 0x3F, 0xC6, 0x00, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x0C, 0x7F, 0x07, 0x1C, 0x7E, 0x20, 0x01, 0xC7, 0xFE, 0x3F, 0x86, 0x00, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0x1F, 0x1C, 0x7E, 0x23, 0xFF, 0xC7, 0xFE, 0x3F, 0x8E, 0x3F, 0xFC, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0x1E, 0x1C, 0x3C, 0x21, 0xF3, 0xC7, 0xFE, 0x3E, 0x0E, 0x1F, 0x3C, 0x7C, 0x7C, 0x61, 0xF1, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0x00, 0x1C, 0x00, 0x70, 0x03, 0xC7, 0xFE, 0x00, 0x1F, 0x00, 0x3C, 0x7C, 0x7C, 0x70, 0x01, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0x80, 0x1C, 0x00, 0xF8, 0x03, 0xC7, 0xFE, 0x00, 0x3F, 0x80, 0x3C, 0x7C, 0x7C, 0x78, 0x03, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0xC1, 0x1C, 0x41, 0xFC, 0x0F, 0xC7, 0xFE, 0x00, 0xFF, 0xC0, 0xFC, 0x7C, 0x7C, 0x7C, 0x0F, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; + +unsigned char PreloadImage[96][32]; + +#endif + +#if(DISPLAY_IN_USE == EPD_TYPE_270) +unsigned char const ImageDataPD[176][33]= +{ + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 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}, + {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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 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, 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, 0x03, 0xF0, 0x03, 0xC0, 0x0F, 0x83, 0xFF, 0x9F, 0x3F, 0xFC, 0x07, 0xE3, 0x83, 0xFF, 0x9C, 0x00, 0xFE, 0x00, 0x1F, 0xFF, 0xFC, 0x07, 0xC0, 0x1F, 0x8F, 0xFF, 0xFC, 0xFC, 0x7F, 0xF7, 0xC0, 0xFF}, + {0xF8, 0x00, 0xF0, 0x03, 0xC0, 0x03, 0x83, 0xFF, 0x1E, 0x1F, 0xF8, 0x03, 0xE3, 0x81, 0xFF, 0x1C, 0x00, 0xFE, 0x00, 0x07, 0xF1, 0xF8, 0x03, 0xC0, 0x07, 0x8F, 0xFF, 0xFC, 0xFC, 0x7F, 0xE3, 0x80, 0x7F}, + {0xF8, 0x60, 0x70, 0x03, 0xC1, 0x81, 0x81, 0xFF, 0x3E, 0x1F, 0xF0, 0xE3, 0xE3, 0xC1, 0xFF, 0x1C, 0x00, 0xFE, 0x3F, 0xC1, 0xF1, 0xF1, 0xE3, 0xC7, 0xC3, 0x8F, 0xFF, 0xF8, 0x7E, 0x3F, 0xC7, 0x1E, 0x3F}, + {0xF8, 0x70, 0x70, 0xFF, 0xC3, 0xC1, 0xC1, 0xFE, 0x3C, 0x1F, 0xF1, 0xF3, 0xE3, 0xC1, 0xFE, 0x3C, 0x3F, 0xFE, 0x3F, 0xF0, 0xF1, 0xE3, 0xFF, 0xC7, 0xE3, 0x8F, 0xFF, 0xF8, 0x7E, 0x3F, 0xCE, 0x3F, 0x3F}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xC1, 0xFE, 0x7C, 0x0F, 0xE1, 0xFF, 0xE3, 0xC0, 0xFE, 0x3C, 0x3F, 0xFE, 0x3F, 0xF8, 0xF1, 0xE3, 0xFF, 0xC7, 0xF1, 0x8F, 0xFF, 0xF0, 0x7F, 0x1F, 0x8E, 0x3F, 0xFF}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xE0, 0xFC, 0x7C, 0x0F, 0xE1, 0xFF, 0xE3, 0xE0, 0xFE, 0x7C, 0x3F, 0xFE, 0x3F, 0xF8, 0x71, 0xE3, 0xFF, 0xC7, 0xF1, 0x8F, 0xFF, 0xF2, 0x3F, 0x0F, 0x9E, 0x3F, 0xFF}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xE0, 0xFC, 0x78, 0x0F, 0xE0, 0xFF, 0xE3, 0xE0, 0xFC, 0x7C, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xE3, 0xFF, 0xC7, 0xF1, 0x8F, 0xFF, 0xF2, 0x3F, 0x8F, 0x3E, 0x3F, 0xFF}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xE0, 0xFC, 0xF9, 0x07, 0xE0, 0x7F, 0xE3, 0xF0, 0x7C, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xE1, 0xFF, 0xC7, 0xE3, 0x8F, 0xFF, 0xE7, 0x1F, 0x87, 0x3E, 0x1F, 0xFF}, + {0xF8, 0x70, 0x70, 0xFF, 0xC3, 0xC1, 0xF0, 0x78, 0xF1, 0x87, 0xE0, 0x1F, 0xE3, 0xF0, 0x7C, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xF0, 0x7F, 0xC7, 0xE3, 0x8F, 0xFF, 0xE7, 0x1F, 0xC6, 0x7F, 0x07, 0xFF}, + {0xF8, 0x60, 0xF0, 0x01, 0xC1, 0x83, 0xF0, 0x79, 0xF3, 0x83, 0xF0, 0x07, 0xE3, 0xF0, 0x78, 0xFC, 0x00, 0xFE, 0x3F, 0xFC, 0x71, 0xF8, 0x1F, 0xC7, 0xC7, 0x8F, 0xFF, 0xCF, 0x9F, 0xE2, 0x7F, 0x81, 0xFF}, + {0xF8, 0x01, 0xF0, 0x01, 0xC0, 0x0F, 0xF8, 0x79, 0xF3, 0x83, 0xF8, 0x03, 0xE3, 0xF8, 0x39, 0xFC, 0x00, 0xFE, 0x3F, 0xFC, 0x71, 0xFC, 0x07, 0xC0, 0x0F, 0x8F, 0xFF, 0xCF, 0x8F, 0xE0, 0xFF, 0xC0, 0x7F}, + {0xF8, 0x07, 0xF0, 0xFF, 0xC0, 0x1F, 0xF8, 0x31, 0xE3, 0xC3, 0xFC, 0x01, 0xE3, 0xF8, 0x31, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xFF, 0x03, 0xC0, 0x7F, 0x8F, 0xFF, 0xC0, 0x0F, 0xF1, 0xFF, 0xF0, 0x3F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC0, 0x0F, 0xF8, 0x33, 0xE7, 0xC1, 0xFF, 0x01, 0xE3, 0xFC, 0x33, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xFF, 0xC3, 0xC7, 0xFF, 0x8F, 0xFF, 0x80, 0x07, 0xF1, 0xFF, 0xFC, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x07, 0xFC, 0x23, 0xC0, 0x01, 0xFF, 0xC1, 0xE3, 0xFC, 0x13, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xFF, 0xE1, 0xC7, 0xFF, 0x8F, 0xFF, 0x9F, 0xC7, 0xF1, 0xFF, 0xFE, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x07, 0xFC, 0x07, 0xC0, 0x00, 0xFF, 0xE1, 0xE3, 0xFC, 0x03, 0xFC, 0x3F, 0xFE, 0x3F, 0xF8, 0x71, 0xFF, 0xF1, 0xC7, 0xFF, 0x8F, 0xFF, 0x3F, 0xC7, 0xF1, 0xFF, 0xFF, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x83, 0xFC, 0x07, 0xCF, 0xE0, 0xFF, 0xF1, 0xE3, 0xFE, 0x07, 0xFC, 0x3F, 0xFE, 0x3F, 0xF8, 0xF1, 0xFF, 0xF1, 0xC7, 0xFF, 0x8F, 0xFF, 0x3F, 0xE3, 0xF1, 0xFF, 0xFF, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x81, 0xFE, 0x07, 0x8F, 0xE0, 0xFF, 0xF1, 0xE3, 0xFE, 0x07, 0xFC, 0x3F, 0xFE, 0x3F, 0xF0, 0xF1, 0xFF, 0xF3, 0xC7, 0xFF, 0x8F, 0xFE, 0x7F, 0xE3, 0xF1, 0xFF, 0xFF, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0xC1, 0xFE, 0x0F, 0x9F, 0xF0, 0x67, 0xE1, 0xE3, 0xFF, 0x0F, 0xFC, 0x3F, 0xFE, 0x3F, 0xE1, 0xF1, 0xFF, 0xF3, 0xC7, 0xFF, 0x8F, 0xFE, 0x7F, 0xF1, 0xF1, 0xFE, 0x7F, 0x1F}, + {0xF8, 0x7F, 0xF0, 0x03, 0xC3, 0xC0, 0xFF, 0x0F, 0x1F, 0xF0, 0x63, 0xC3, 0xE3, 0xFF, 0x0F, 0xFC, 0x00, 0xFE, 0x3F, 0xC3, 0xF1, 0xE7, 0xE7, 0xC7, 0xFF, 0x8F, 0xFC, 0x7F, 0xF1, 0xF1, 0xFE, 0x1E, 0x3F}, + {0xF8, 0x7F, 0xF0, 0x03, 0xC3, 0xE0, 0x7F, 0x0F, 0x1F, 0xF8, 0x60, 0x07, 0xE3, 0xFF, 0x0F, 0xFC, 0x00, 0xFE, 0x00, 0x0F, 0xF1, 0xE0, 0x0F, 0xC7, 0xFF, 0x80, 0x0C, 0xFF, 0xF0, 0xF1, 0xFE, 0x00, 0x7F}, + {0xF8, 0x7F, 0xF0, 0x03, 0xC3, 0xF0, 0x7F, 0x9F, 0x3F, 0xF8, 0x70, 0x1F, 0xE3, 0xFF, 0x9F, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0xF1, 0xF0, 0x1F, 0xCF, 0xFF, 0x80, 0x0C, 0xFF, 0xF8, 0xF9, 0xFF, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 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, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xFE, 0x00, 0xFE, 0x0C, 0x1F, 0xFE, 0x03, 0xFC, 0x1F, 0xFF, 0x07, 0xF8, 0x3F, 0xC0, 0x7F, 0x87, 0x03, 0xE0, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF8, 0x00, 0x7E, 0x08, 0x07, 0xF8, 0x01, 0xFC, 0x1F, 0xFF, 0x07, 0xF8, 0x1F, 0x00, 0x3F, 0x86, 0x01, 0x80, 0x7F, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF8, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0xFC, 0x1F, 0xFF, 0x07, 0xFC, 0x1E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0xFF, 0x07, 0xFC, 0x1C, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xF8, 0xF8, 0x1E, 0x03, 0x83, 0xE0, 0xF0, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x1C, 0x1E, 0x07, 0x80, 0xE0, 0x18, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x1E, 0x0F, 0x81, 0xC1, 0xF8, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x3F, 0x07, 0x81, 0xF0, 0x3C, 0x1C, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x80, 0x3C, 0x1F, 0xFF, 0xFC, 0x1E, 0x0F, 0xC1, 0xC1, 0xF8, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x3F, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0x80, 0x3C, 0x1F, 0xFF, 0x00, 0x1E, 0x0F, 0xC1, 0xC0, 0x00, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x00, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0x80, 0x3C, 0x1F, 0xFC, 0x00, 0x1E, 0x0F, 0xC1, 0xC0, 0x00, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x00, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0x80, 0x3C, 0x1F, 0xF8, 0x00, 0x1E, 0x0F, 0xC1, 0xC0, 0x00, 0x3C, 0x1F, 0xFF, 0x07, 0xF8, 0x18, 0x00, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF0, 0x3C, 0x1E, 0x0F, 0xC1, 0xC1, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xF8, 0x38, 0x3F, 0xFF, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF0, 0x7C, 0x1E, 0x0F, 0x81, 0xC1, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xF0, 0x38, 0x3F, 0xFF, 0x83, 0xF0, 0x7C, 0x1C, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF0, 0x78, 0x1E, 0x03, 0x83, 0xE0, 0xFE, 0x7C, 0x1F, 0xFF, 0x07, 0xC0, 0x7C, 0x1F, 0xCF, 0x83, 0xF0, 0x7C, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0xFF, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0x83, 0xF0, 0x7C, 0x1E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x07, 0xF0, 0x00, 0x7C, 0x1F, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x18, 0x02, 0x1E, 0x10, 0x0F, 0xF8, 0x00, 0x7C, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x1E, 0x06, 0x1E, 0x1C, 0x1F, 0xFE, 0x01, 0xFC, 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x3F, 0x83, 0xF0, 0x7C, 0x1F, 0xE0, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; + +unsigned char PreloadImage[176][33]; + +#endif + +#endif //__IMAGE_PDLOGO_H_ diff --git a/epaper/bsp.c b/epaper/bsp.c new file mode 100644 index 0000000..ca01073 --- /dev/null +++ b/epaper/bsp.c @@ -0,0 +1,243 @@ +/***************************************************************************** + * + * Copyright(C) 2012, Embedded Artists AB + * All rights reserved. + * + ****************************************************************************** + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * products. This software is supplied "AS IS" without any warranties. + * Embedded Artists AB assumes no responsibility or liability for the + * use of the software, conveys no license or title under any patent, + * copyright, or mask work right to the product. Embedded Artists AB + * reserves the right to make changes in the software without + * notification. Embedded Artists AB also make no representation or + * warranty that such application will be suitable for the specified + * use without further testing or modification. + *****************************************************************************/ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "bsp.h" +#include +#include +#include + +#include + +/****************************************************************************** + * Typedefs and defines + *****************************************************************************/ + +#define LM75A_I2C_ADDR 0x49 //(0x49 << 1) +#define LM75A_CMD_TEMP 0x00 +#define DISPLAY_BUF_SZ (256) + +/****************************************************************************** + * Local variables + *****************************************************************************/ + +// I2C device handle +static int gI2cFd = -1; + +// mapping between Serial Expansion connector and Raspberry Pi +// GPIOs. Raspberry Pi GPIO numbering according to wiringPi +static int pinMap[BSP_PIN_SZ*2] = +{ + // [SEC] | [PI GPIO#] + BSP_PIN_6, 6, // CS + BSP_PIN_7, 0, // Busy + BSP_PIN_8, -1, // Not Used + BSP_PIN_11, 1, // PWM + BSP_PIN_12, 5, // RST + BSP_PIN_13, 3, // PWR_Ctrl + BSP_PIN_14, 4, // DISCHARGE +}; + +// buffer used when writing to display via SPI +static uint8_t displayBuf[DISPLAY_BUF_SZ]; + +/****************************************************************************** + * Local functions + *****************************************************************************/ + +static int32_t lm75a_readTemp(void) +{ + uint8_t temp[2]; + int16_t t = 0; + + wiringPiI2CWrite(gI2cFd, LM75A_CMD_TEMP); + temp[0] = wiringPiI2CRead(gI2cFd); + temp[1] = wiringPiI2CRead(gI2cFd); + + + // 11 MSB bits used. Celcius is calculated as Temp data * 1/8 + t = ((temp[0] << 8) | (temp[1])); + + return ((t * 100) >> 8); +} + + +/****************************************************************************** + * Public functions + *****************************************************************************/ + + +/****************************************************************************** + * + * Description: + * BSP initialize function. Must be called before any other BSP related + * functions. + * + *****************************************************************************/ +int bsp_init(void) +{ + + if (wiringPiSetup() < 0) { + printf("bsp_init: failed to initialize wiringPi\n"); + return -1; + } + + if ((gI2cFd = wiringPiI2CSetup(LM75A_I2C_ADDR)) < 0) { + printf("bsp_init: failed to initialize I2C\n"); + return -1; + } + + if (wiringPiSPISetup(0, 1000000) < 0) { + printf("bsp_init: failed to initialize SPI\n"); + return -1; + } + + return 0; +} + +/****************************************************************************** + * + * Description: + * Get number of milliseconds + * + *****************************************************************************/ +uint32_t bsp_getMsTicks(void) +{ + return millis(); +} + +/****************************************************************************** + * + * Description: + * Initialize SPI + * + *****************************************************************************/ +void bsp_spiInit(void) +{ + // initialized in bsp_init +} + +/****************************************************************************** + * + * Description: + * Write data to the display + * + *****************************************************************************/ +void bsp_writeToDisplay(uint8_t* data, uint16_t len) +{ + if (len > DISPLAY_BUF_SZ) { + printf("bsp_writeToDisplay: ERROR len=%d > %d\n", len, DISPLAY_BUF_SZ); + return; + } + + memcpy(displayBuf, data, len); + wiringPiSPIDataRW(0, displayBuf, len); + +} + +/****************************************************************************** + * + * Description: + * Delay specified number of milliseconds + * + * Params: + * [in] ms - number of milliseconds to delay + * + *****************************************************************************/ +void bsp_delayMs(uint32_t ms) +{ + delay(ms); +} + +/****************************************************************************** + * + * Description: + * Delay specified number of microseconds + * + * Params: + * [in] us - number of microseconds to delay + * + *****************************************************************************/ +void bsp_delayUs(uint32_t us) +{ + delayMicroseconds(us); +} + +/****************************************************************************** + * + * Description: + * Read temperature + * + * Params: + * [out] temperature - (int16_t) temperature in Celsius + * + *****************************************************************************/ +int16_t bsp_getTemp(void) +{ + lm75a_readTemp(); + bsp_delayMs(5); + return (int16_t)(lm75a_readTemp()/100); +} + +/****************************************************************************** + * + * Description: + * Set the PIN mode of a specific pin + * + *****************************************************************************/ +void bsp_pinMode(bsp_pin_t pin, bps_pinMode_t mode) +{ + int m = INPUT; + int p = 0; + + if (pin >= BSP_PIN_SZ) return; + + if (mode == BSP_PINMODE_OUTPUT) { + m = OUTPUT; + } + + p = pinMap[pin*2+1]; + + pinMode(p, m); +} + +/****************************************************************************** + * + * Description: + * Set PIN to high (1) of low (0) value + * + *****************************************************************************/ +void bsp_pinOut(bsp_pin_t pin, int value) +{ + int p = 0; + int v = LOW; + + if (pin >= BSP_PIN_SZ) return; + + if (value != 0) { + v = HIGH; + } + + p = pinMap[pin*2+1]; + + digitalWrite(p, v); +} + + diff --git a/epaper/bsp.h b/epaper/bsp.h new file mode 100644 index 0000000..c0fbb8a --- /dev/null +++ b/epaper/bsp.h @@ -0,0 +1,61 @@ +/***************************************************************************** + * + * Copyright(C) 2012, Embedded Artists AB + * All rights reserved. + * + ****************************************************************************** + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * products. This software is supplied "AS IS" without any warranties. + * Embedded Artists AB assumes no responsibility or liability for the + * use of the software, conveys no license or title under any patent, + * copyright, or mask work right to the product. Embedded Artists AB + * reserves the right to make changes in the software without + * notification. Embedded Artists AB also make no representation or + * warranty that such application will be suitable for the specified + * use without further testing or modification. + *****************************************************************************/ +#ifndef __BSP_H__ +#define __BSP_H__ + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ + +#include +#include +#include + +// pin numbering is for the Serial Expansion Connector +typedef enum +{ + BSP_PIN_6 = 0, + BSP_PIN_7, + BSP_PIN_8, + BSP_PIN_11, + BSP_PIN_12, + BSP_PIN_13, + BSP_PIN_14, + BSP_PIN_SZ // must be last +} bsp_pin_t; + +typedef enum +{ + BSP_PINMODE_INPUT = 0, + BSP_PINMODE_OUTPUT +} bps_pinMode_t; + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +int bsp_init(void); +void bsp_spiInit(void); +void bsp_writeToDisplay(uint8_t* data, uint16_t len); +uint32_t bsp_getMsTicks(void); +void bsp_delayMs(uint32_t ms); +void bsp_delayUs(uint32_t us); +int16_t bsp_getTemp(void); +void bsp_pinMode(bsp_pin_t pin, bps_pinMode_t mode); +void bsp_pinOut(bsp_pin_t pin, int value); + +#endif //__BSP_H__ diff --git a/logger.cpp b/logger.cpp new file mode 100644 index 0000000..0f2735c --- /dev/null +++ b/logger.cpp @@ -0,0 +1,192 @@ +// (c) 2015 Ralf Ramsauer - Logger class from the sdfs project + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif + +#include "config.h" +#include "logger.h" + +using std::map; +using std::string; +using std::mutex; +using std::lock_guard; +using std::move; + +using std::cerr; +using std::endl; + +#ifdef USE_COLORIZED_LOGS +#ifdef _WIN32 // If Windows, Use Windows Terminal coloring +const static map colorAttribute = { + {LogLevel::error, FOREGROUND_RED }, + {LogLevel::warning, FOREGROUND_RED | FOREGROUND_GREEN }, + {LogLevel::notice, FOREGROUND_BLUE }, + {LogLevel::info, FOREGROUND_GREEN }, + {LogLevel::debug, FOREGROUND_BLUE | FOREGROUND_RED }, + {LogLevel::debug2, FOREGROUND_BLUE | FOREGROUND_RED }, +}; +#else // Use ANSI Escape sequences +const static map prefix_ansicolor = { + {LogLevel::error, "\x1b[1m\x1b[31m" }, + {LogLevel::warning, "\x1b[1m\x1b[33m" }, + {LogLevel::notice, "\x1b[1m\x1b[34m" }, + {LogLevel::info, "\x1b[1m\x1b[32m" }, + {LogLevel::debug, "\x1b[1m\x1b[35m" }, + {LogLevel::debug2, "\x1b[1m\x1b[36m" }, +}; + +const static string suffix_ansireset = "\x1b[0m"; +#endif +#endif + +const static map logLevel = { + {LogLevel::error, "ERROR " }, + {LogLevel::warning, "WARNING" }, + {LogLevel::notice, "NOTICE " }, + {LogLevel::info, "INFO " }, + {LogLevel::debug, "DEBUG " }, + {LogLevel::debug2, "DEBUG2 " }, +}; + +Logger::Logger(const LogLevel level) : + _level(level), + _ostreamMutex() +{ +} + +Logger::~Logger() +{ +} + +Logger &Logger::get() +{ + static Logger l(DEFAULT_LOG_LEVEL); + return l; +} + +void Logger::operator ()(const std::string &message, const LogLevel level) const +{ + if(level > _level) + { + return; + } + + std::ostringstream prefix; + + auto t = std::time(nullptr); + auto tm = *std::localtime(&t); + +#if defined(USE_COLORIZED_LOGS) && !defined(_WIN32) + prefix << prefix_ansicolor.at(level); +#endif + + // GCC does not support put_time :-( + /*stringstream ss; + ss << std::put_time(&tm, "%d-%m-%Y %H-%M-%S"); + prefix = "[" + ss.str() + "] ";*/ + + const size_t BUFFER_SIZE = 80; + char timeBuffer[BUFFER_SIZE]; + std::strftime(timeBuffer, BUFFER_SIZE, "%Y-%m-%d %H:%M:%S", &tm); + prefix << "[" << timeBuffer << "] -- " << logLevel.at(level) << " :: "; + + // Critical section + { + lock_guard lock(_ostreamMutex); + +#if defined(USE_COLORIZED_LOGS) && !defined(_WIN32) + cerr << prefix.str() << message << suffix_ansireset << endl; + cerr.flush(); +#elif defined(USE_COLORIZED_LOGS) && defined(_WIN32) + + // taken from GTEST + const HANDLE stdout_handle = GetStdHandle(STD_ERROR_HANDLE); + + // Gets the current text color. + CONSOLE_SCREEN_BUFFER_INFO buffer_info; + GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); + const WORD old_color_attrs = buffer_info.wAttributes; + + // We need to flush the stream buffers into the console before each + // SetConsoleTextAttribute call lest it affect the text that is already + // printed but has not yet reached the console. + cerr.flush(); + SetConsoleTextAttribute(stdout_handle, + colorAttribute.at(level) | FOREGROUND_INTENSITY); + + cerr << prefix.str() << message << endl; + cerr.flush(); + + // Restores the text color. + SetConsoleTextAttribute(stdout_handle, old_color_attrs); + +#else + cerr << prefix.str() << message << endl; + cerr.flush(); +#endif + } +} + +void Logger::operator ()(const std::ostringstream &message, const LogLevel level) const +{ + (*this)(message.str(), level); +} + +void Logger::operator ()(const LogLevel level, const char* format, ...) const +{ + if(level > _level) + { + return; + } + + va_list argp; + char* message = nullptr; + + // determine buffer length + va_start(argp, format); + int size = vsnprintf(nullptr, 0, format, argp) + 1; + va_end(argp); + + if (size >= 0) + { + message = (char*)malloc(size); + if (message == nullptr) + { + (*this)("[LOGGER] CRITICAL: MEMORY ALLOCATION ERROR", + LogLevel::error); + } + + va_start(argp,format); + vsnprintf(message, size, format, argp); + va_end(argp); + + (*this)(string(message), level); + + free(message); + } else { + (*this)("[LOGGER] CRITICAL: VSNPRINTF ERROR", + LogLevel::error); + } +} + +void Logger::level(const LogLevel level) +{ + _level = level; +} + +LogLevel Logger::level() const +{ + return _level; +} + +void foo(void) { +} diff --git a/logger.h b/logger.h new file mode 100644 index 0000000..fe560fa --- /dev/null +++ b/logger.h @@ -0,0 +1,60 @@ +#ifndef LOGGER_H +#define LOGGER_H + +#include +#include +#include +#include + +/** + * @brief The LogLevel enum + */ +enum class LogLevel : unsigned char +{ + off, /// disable logging + error, /// error conditions + warning, /// warning conditions + notice, /// normal but significant conditions + info, /// informational messages + debug, /// debug-level messages + debug2 /// more debug-level messages +}; + +/** + * @brief The Logger class + * + * The logger class is a thread-safe class which is used for formatting and forwarding + * log messages. + */ +class Logger final { + +public: + static Logger &get(); + + /// Log a string + void operator() (const std::string &message, const LogLevel level = LogLevel::debug) const; + + /// Log a ostringstream + void operator() (const std::ostringstream &message, const LogLevel level = LogLevel::debug) const; + + /// Log a format string + void operator() (const LogLevel level, const char* format, ...) const; + + /// Set minimum required log level to generate output + void level(const LogLevel level); + /// Get minimum required log level to generate output + LogLevel level() const; + +private: + + /** + * @brief Constructor + * @param level Minimum required log level to generate output + */ + Logger(const LogLevel level); + ~Logger(); + + LogLevel _level; + mutable std::mutex _ostreamMutex; +}; +#endif diff --git a/logic.cpp b/logic.cpp new file mode 100644 index 0000000..64ec4d3 --- /dev/null +++ b/logic.cpp @@ -0,0 +1,236 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "util.h" +#include "logic.h" + +using namespace std; + +const string Logic::_lockPagePrefix = LOCKPAGE_PREFIX; +const string Logic::_fifoLocation = FIFO_LOCATION; + +Logic &Logic::get() +{ + static Logic l; + return l; +} + +Logic::Logic() : + _logger(Logger::get()), + _door(Door::get()), + _epaper(Epaper::get()) +{ + srand(time(NULL)); + + _logger(LogLevel::debug, "Creating Fifo file"); + if (access(_fifoLocation.c_str(), F_OK) == 0) + { + _logger(LogLevel::warning, "Fifo file aready existing, trying to delete"); + if (unlink(_fifoLocation.c_str()) != 0) + { + throw("Unable to delete Fifo file"); + } + } + if (mkfifo(_fifoLocation.c_str(), 0660) != 0) + { + throw("Unable to create Fifo"); + } + + _fifoHandle = open(_fifoLocation.c_str(), O_RDWR | O_NONBLOCK); + if (_fifoHandle == -1) + { + throw("Unable to open Fifo"); + } + + _createNewToken(false); +} + +Logic::~Logic() +{ + if (_fifoHandle != -1) + { + close(_fifoHandle); + } + + _logger(LogLevel::debug, "Removing Fifo file"); + if (unlink(_fifoLocation.c_str()) != 0) + { + throw("Unable to delete Fifo file"); + } +} + +void Logic::_parseRequest(const string &str) +{ + _logger("Parsing request..."); + Json::Reader reader; + Json::Value root; + + bool suc = reader.parse(str, root, false); + if (!suc) + { + _logger(LogLevel::error, "Request ist not valid JSON!"); + return; + } + + string action, user, password, host, token; + bool authenticated; + try { + action = getJsonOrFail(root, "action"); + host = getJsonOrFail(root, "host"); + authenticated = getJsonOrFail(root, "authenticated"); + string user, password; + if (authenticated == true) + { + user = getJsonOrFail(root, "user"); + password = getJsonOrFail(root, "password"); + token = getJsonOrFail(root, "token"); + } + } + catch (...) + { + _logger(LogLevel::warning, "Error parsing JSON"); + return; + } + + printf("Action: %s\nAuthenticated: %d\nHost: %s\n",action.c_str(), authenticated, host.c_str()); + printf("User: %s\nPassword: %s\nToken: %s\n",user.c_str(), password.c_str(), token.c_str()); + + if (authenticated == true) + { + if (_checkToken(token) == false) + { + _logger(LogLevel::error, "User provided invalid token"); + return; + } + + if (_checkLDAP(user, password) == false) + { + _logger(LogLevel::error, "invalid LDAP credentials"); + return; + } + } + + if (action == "lock") + { + _lock(); + } else if (action == "unlock") { + _unlock(); + } else { + _logger(LogLevel::error, "Unknown Action: %s", action.c_str()); + } +} + +void Logic::_lock() +{ + if (_state == LOCKED) + { + _logger(LogLevel::warning, "Unable to lock: already locked"); + return; + } + _door.lock(); + _state = LOCKED; + _createNewToken(false); +} + +void Logic::_unlock() +{ + if (_state == UNLOCKED) + { + _logger(LogLevel::warning, "Unable to unlock: already unlocked"); + return; + } + _door.unlock(); + _state = UNLOCKED; + _createNewToken(false); +} + +void Logic::run() +{ + struct timeval tv; + fd_set set; + + for (;;) + { + FD_ZERO(&set); + FD_SET(_fifoHandle, &set); + tv.tv_sec = _tokenTimeout; + tv.tv_usec = 0; + + int i = select(_fifoHandle+1, &set, nullptr, nullptr, &tv); + if (i == 0) + { + _createNewToken(true); + continue; + } else if (i == -1) { + throw "Fifo select() failed"; + } + + if (!FD_ISSET(_fifoHandle, &set)) + { + _logger(LogLevel::warning, "select(): Not my fd"); + continue; + } + + string payload; + for (;;) + { + constexpr int BUFSIZE = 2; + char tmp[BUFSIZE]; + i = read(_fifoHandle, tmp, BUFSIZE); + if (i > 0) { + payload += string(tmp, i); + } else { + if (errno == EWOULDBLOCK) + { + break; + } + throw "read() fifo failed"; + } + } + _parseRequest(payload); + } +} + +bool Logic::_checkToken(const string &strToken) +{ + try { + uint64_t token = toUint64(strToken); + if (token == _curToken || (_prevValid == true && token == _prevToken)) + { + _logger(LogLevel::info, "Token check successful"); + return true; + } + } + catch (const char* const &ex) + { + _logger(LogLevel::error, "Check Token failed for token \"%s\" (expected %s): %s", strToken.c_str(), toHexString(_curToken).c_str(), ex); + } + return false; +} + +bool Logic::_checkLDAP(const string &user, const string &password) +{ + return true; +} + +void Logic::_createNewToken(const bool stillValid) +{ + _prevToken = _curToken; + _prevValid = stillValid; + + _curToken = (((uint64_t)rand())<<32) | ((uint64_t)rand()); + + _epaper.draw(_lockPagePrefix + toHexString(_curToken)); + + ostringstream message; + message << "New Token generated: " << toHexString(_curToken) << " old Token: " << toHexString(_prevToken) << " is " << (_prevValid?"still":"not") << " valid"; + _logger(message, LogLevel::info); +} diff --git a/logic.h b/logic.h new file mode 100644 index 0000000..d519c95 --- /dev/null +++ b/logic.h @@ -0,0 +1,56 @@ +#ifndef LOGIC_H +#define LOGIC_H + +#include +#include +#include + +#include "config.h" +#include "epaper.h" +#include "door.h" +#include "logger.h" + +class Logic +{ +public: + + static Logic &get(); + ~Logic(); + + void run(); + +private: + + Logic(); + void _parseRequest(const std::string &str); + + void _lock(); + void _unlock(); + + bool _checkToken(const std::string &token); + bool _checkLDAP(const std::string &user, const std::string &password); + + void _createNewToken(const bool stillValid); + + const Logger &_logger; + Door &_door; + Epaper &_epaper; + + using Token = uint64_t; + + Token _curToken; + bool _prevValid = { false }; + Token _prevToken; + + + const static std::string _lockPagePrefix; + const static std::string _fifoLocation; + + int _fifoHandle = {-1}; + + static constexpr int _tokenTimeout = TOKEN_TIMEOUT; + + enum {LOCKED, UNLOCKED} _state = { LOCKED }; +}; + +#endif diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..942c7b9 --- /dev/null +++ b/main.cpp @@ -0,0 +1,31 @@ +#include +#include +#include + +#include + +#include "logic.h" + +using namespace std; + +const static Logger &l = Logger::get(); + +int main(void) +{ + l(LogLevel::notice, "Starting doorlockd"); + + + try { + Logic &logic = Logic::get(); + logic.run(); + } + catch (const char* const &ex) { + ostringstream str; + str << "FATAL ERROR: " << ex; + l(str, LogLevel::error); + } + + Door::get().lock(); + l(LogLevel::notice, "Doorlockd stopped"); + return 0; +} diff --git a/template.h b/template.h new file mode 100644 index 0000000..bf453b2 --- /dev/null +++ b/template.h @@ -0,0 +1,486 @@ +static char template_lock[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, + 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, + 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, + 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xFC, + 0xF1, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x7C, 0xC0, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x7C, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x3C, + 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x1C, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x3F, 0x1C, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x1C, + 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x3F, 0x3C, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x7C, + 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x7C, 0xC0, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xE0, 0x3F, 0xFC, 0xE1, 0x3F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, + 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, + 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x3E, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, + 0x00, 0xE0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD0, 0xF8, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xC7, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xBC, 0xFF, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xFC, 0xE3, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFC, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF3, 0x9F, + 0x1F, 0x00, 0x00, 0x00, 0x38, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC7, 0x7F, 0x1C, 0x00, 0x00, + 0x00, 0x78, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0xF3, 0x00, 0x00, 0x00, 0x78, 0xF8, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF8, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC7, + 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xF8, 0x03, 0x00, 0xC0, 0xFF, 0x3F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xFB, 0x0F, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x7E, 0x00, 0xFC, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xF8, 0x01, + 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xC0, 0xEF, 0xFF, 0xFF, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFE, 0xFF, 0x8F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, + 0xFF, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0xFF, 0xF3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x7F, + 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x7C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xE1, 0xFF, 0x03, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, + 0xC6, 0xFF, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE4, 0x3F, 0x00, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xBC, 0x07, 0x00, 0x00, 0x00, 0xF8, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x3E, 0x0C, 0x8C, 0xFF, 0xF1, + 0x0F, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x70, 0x80, 0x7F, 0x0C, 0x86, 0xFF, 0xF1, 0x1F, 0xFC, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x78, + 0xC0, 0x41, 0x0C, 0x87, 0x01, 0x30, 0x38, 0x0E, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x78, 0xC0, 0x00, 0x8C, + 0x81, 0x01, 0x30, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x78, 0xE0, 0x00, 0xCC, 0x81, 0x01, 0x30, + 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x6C, 0x60, 0x00, 0x6C, 0x80, 0x01, 0x30, 0x30, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xDC, + 0x60, 0x00, 0x7C, 0x80, 0xFF, 0x30, 0x18, 0x7C, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xCC, 0x60, 0x00, 0xFC, + 0x80, 0xFF, 0xF0, 0x1F, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0xCC, 0x60, 0x00, 0xDC, 0x81, 0x01, 0xF0, + 0x0F, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0xFE, 0x61, 0x00, 0x8C, 0x81, 0x01, 0x30, 0x1C, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xFE, + 0x61, 0x00, 0x8C, 0x83, 0x01, 0x30, 0x18, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x86, 0xC1, 0x00, 0x0C, + 0x87, 0x01, 0x30, 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x86, 0xC1, 0x61, 0x0C, 0x86, 0x01, 0x30, + 0x30, 0x82, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x83, 0x83, 0x7F, 0x0C, 0x8C, 0xFF, 0x31, 0x60, 0xFE, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x03, + 0x03, 0x3E, 0x0C, 0x9C, 0xFF, 0x31, 0xE0, 0xFC, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x03, 0x07, 0x63, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x07, + 0x63, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0C, 0x0F, 0x63, 0x00, 0x1C, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x1C, 0x0F, 0x63, 0x00, 0x18, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x1B, 0x63, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1B, + 0x63, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x13, 0x63, 0x00, 0xE0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x33, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x33, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x63, + 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x63, 0x63, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x0C, 0xC3, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x0E, 0xC3, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x83, + 0xE3, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x83, 0xE3, 0x7F, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; diff --git a/util.cpp b/util.cpp new file mode 100644 index 0000000..822955b --- /dev/null +++ b/util.cpp @@ -0,0 +1,112 @@ +#include "util.h" + +using namespace std; + +template <> +int getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isInt()) + return val.asInt(); + throw "Json Type error"; +} + +template <> +string getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isString()) + return val.asString(); + throw "Json Type error"; +} + +template <> +size_t getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isInt()) + return val.asUInt64(); + throw "Json Type error"; +} + +template <> +bool getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isBool()) + return val.asBool(); + throw "Json Type error"; +} + +template <> +Json::Value getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + return val; +} + +static char nibble2hex(unsigned char input) +{ + input &= 0xf; + + if(input <= 9) + { + return input + '0'; + } + + return input - 0xA + 'A'; +} + +string toHexString(const uint64_t c) +{ + string retval; + + retval = nibble2hex((c>>60) & 0xF); + retval += nibble2hex((c>>56) & 0xF); + retval += nibble2hex((c>>52) & 0xF); + retval += nibble2hex((c>>48) & 0xF); + retval += nibble2hex((c>>44) & 0xF); + retval += nibble2hex((c>>40) & 0xF); + retval += nibble2hex((c>>36) & 0xF); + retval += nibble2hex((c>>32) & 0xF); + retval += nibble2hex((c>>28) & 0xF); + retval += nibble2hex((c>>24) & 0xF); + retval += nibble2hex((c>>20) & 0xF); + retval += nibble2hex((c>>16) & 0xF); + retval += nibble2hex((c>>12) & 0xF); + retval += nibble2hex((c>> 8) & 0xF); + retval += nibble2hex((c>> 4) & 0xF); + retval += nibble2hex((c ) & 0xF); + + return retval; +} + +unsigned char hex2uchar(const char input) +{ + if(input >= '0' && input <= '9') { + return input - '0'; + } else if(input >= 'A' && input <= 'F') { + return input - 'A' + 10; + } else if(input >= 'a' && input <= 'f') { + return input - 'a' + 10; + } + throw("Malformed hexadecimal input"); +} + +uint64_t toUint64(const string &s) +{ + if (s.length() != (64/4)) + { + throw("Hex string has invalid length"); + } + + uint64_t retval = 0; + + for (int i = 0 ; i < (64/4) ; i++) + { + retval <<= 4; + retval |= hex2uchar(s.at(i))&0xf; + } + + return retval; +} diff --git a/util.h b/util.h new file mode 100644 index 0000000..d9a8026 --- /dev/null +++ b/util.h @@ -0,0 +1,25 @@ +#ifndef UTIL_H +#define UTIL_H + +#include +#include + +template +T getJson(const Json::Value &root, const std::string &key); + +template +T getJsonOrFail(const Json::Value &root, const std::string &key) +{ + const auto members = root.getMemberNames(); + if (std::find(members.begin(), members.end(), key) == members.end()) + { + throw "Json key not existing"; + } + + return getJson(root, key); +} + +std::string toHexString(uint64_t c); +uint64_t toUint64(const std::string &s); + +#endif