st7735 160 на 128 подсветка барахлит

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

А на С++ оверклокать вроде можно аж до 300 мегагерц, оценивал только по работающему или нет дисплею, скорость шины SPI снижал значительно, на порядок...
Осталось найти где в драйверах задаётся скорость шины, под микропитоном при инициализации SPI прямо в строке инициализации

коды цветов

/* 
 * BLACK = 0 
 * RED = TFTColor(0xFF, 0x00, 0x00)  
 * MAROON = TFTColor(0x80, 0x00, 0x00)  
 * ORANGE = TFTColor(0xFF,0x66,0x00)  
 * GOLD = TFTColor(0x80, 0x80, 0x80)  
 * GREEN = TFTColor(0x00, 0xFF, 0x00)  
 * FOREST = TFTColor(0x00, 0x80, 0x80)  
 * BLUE = TFTColor(0x00, 0x00, 0xFF)  
 * NAVY = TFTColor(0x00, 0x00, 0x80)  
 * CYAN = TFTColor(0x00, 0xFF, 0xFF)  
 * YELLOW = TFTColor(0xFF, 0xFF, 0x00)  
 * PURPLE = TFTColor(0xFF, 0x00, 0xFF)  
 * WHITE = TFTColor(0xFF, 0xFF, 0xFF)  
 * GRAY = TFTColor(0x80, 0x80, 0x80) 
 */

 

GOLD явно какой-то странный.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вот для AVR SPI 8 МГц вывод буфера из flash и ram на максимальной скорости:

void writebuff(const uint8_t buff[], uint16_t count) {
   while (count--) {
      SPDR=pgm_read_byte(buff++);
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0"); 
   }
}

void writebuff(uint8_t buff[], uint16_t count) {
   while (count--) {
      SPDR=buff++[0];
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0");
      asm volatile("NOP");
   }
}

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

GOLD явно какой-то странный.

выдрал в скетче на питоне, согласен, как-бы не яркий белый должен быть

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

andriano пишет:

GOLD явно какой-то странный.

выдрал в скетче на питоне, согласен, как-бы не яркий белый должен быть

Я бы еще, может, согласился на SILVER, но мне кажется, больше похоже на LEAD.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

и совпадает с GRAY из этой же таблицы ...

lilik
Offline
Зарегистрирован: 19.10.2017

Komandir пишет:

Вот для AVR SPI 8 МГц вывод буфера из flash и ram на максимальной скорости:

void writebuff(const uint8_t buff[], uint16_t count) {
   while (count--) {
      SPDR=pgm_read_byte(buff++);
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0"); 
   }
}

void writebuff(uint8_t buff[], uint16_t count) {
   while (count--) {
      SPDR=buff++[0];
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0");
      asm volatile("RJMP .+0");
      asm volatile("NOP");
   }
}

Это получается можно сделать ещё быстрее вывод картинки?

Я всё же не поленился и перемножил 9 кадров в секунду на ... и получил около 3 МГц :)

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

и совпадает с GRAY из этой же таблицы ...

мало ли в Бразилии Педров )))

ЗЫ с SPI почти разобрался (на 90% точно) ...сам был злобный буратино...всё регулируется если правильно библиотекой пользоваться... )))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

lilik пишет:
получил около 3 МГц :)

5 МГц съедают ваши раскраски и перевод из битов в байты цвета ...

Была бы MEGA - можно было бы весь кадр в цвете послать за раз на скорости ~8 МГц

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует

lilik
Offline
Зарегистрирован: 19.10.2017

ua6em пишет:

было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует

Можно, если размер кадра сдуть до 128*64 или 64*64.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

lilik пишет:

ua6em пишет:

было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует

Можно, если размер кадра сдуть до 128*64 или 64*64.

нашёл скетч под mbed  ядро там три картинки полноцветные, тестирование показало, что этот SPI самый медленный.
Итоги по скорости SPI (из коробки)
1. microPython - 22MHz
2. ядро Фила - 12MHz (было зажато в библиотеке GFX- удалось выжать 25MHz при частоте процессора 133MHz)
3. Mbed - софтовый 400KHz (хард привязан к SPI0 без переделки схемы не проверить, точнее изучать надо, пока не востребовано)

lilik
Offline
Зарегистрирован: 19.10.2017

:)

А я пытаюсь в функцию в качестве аргумента вставить функцию ... и не работает, но компилируется.

// РИСУНОК контур 4 цвета
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

extern const unsigned char ris_1[];
int i, j;// пришлось вынести из функции отрисовки картинки

void setup(void) {
  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
 tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.fillScreen(ST7735_BLACK);
 tft.setRotation(0);//ориентация экрана
 }
void loop() {
drawBitmap_(0,0,ris_1,128,160,COLor1(),COLor2(),COLor3(),COLor4());

delay(200);
 }
/////////////////////////////////////////////////////////////////////
void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(),const uint16_t (*COLor_2)(),const uint16_t (*COLor_3)(),const uint16_t (*COLor_4)()) {
 bool flag=true;//  
 if(x<0||x+w>128||y<0||y+h>160){return;} 
 tft.setAddrWindow(x,y,x+w-1,y+h-1);
 int  byteWidth = (w + 7) / 8;
  uint8_t byte_;uint8_t byte_st;
   //
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
 for(j=0; j<h; j++) {
    for(i=0; i<w; i++) {
      if(i & 7) {byte_ <<= 1;byte_st <<= 1;}
      else     { byte_   = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}}
      if(byte_ & 0x80)
      {
     if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3()>>8);SPI.transfer(COLor_3());}//цвет контура левого верхнего плана    
     else { SPI.transfer(COLor_1()>>8);SPI.transfer(COLor_1());}// цвет раскраски внутри контура 
   
      flag=false;
      }
     else {
       if(!flag||byte_st & 0x80){SPI.transfer(COLor_4()>>8);SPI.transfer(COLor_4());}//цвет контура правого нижнего плана
       else {SPI.transfer(COLor_2()>>8);SPI.transfer(COLor_2());} // цвет фона
      flag=true;  
     }
    }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 ///  
}
/////////////////////////////////////////////////////////////////////
const uint16_t COLor1(){//цвет раскраски изображения внутри контура
return tft.Color565(255-j,j,0);   
}
const uint16_t COLor2(){// цвет фона
return tft.Color565(235-j,j+50,0);   
}
const uint16_t COLor3(){//цвет контура левого верхнего плана 
return tft.Color565(255,255,155);   
}
const uint16_t COLor4(){//цвет контура правого нижнего плана
return tft.Color565(0,0,0);   
}
/////////////////////////////////////////////////////////////////////

Чего то сегодня олимпиада вспомнилась...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Честно говоря, как-то не вижу практического смысла в псевдораскраске монохромного изображения.

Если кто-то сможет объяснить - с удовольствием выслушаю.

А вот поднимавшийся в теме вопрос производительности, на мой взгляд, с практической точки зрения гораздо важнее.

Хочу показать один из возможных вариантов вывода картинки с перекодировкой одноразрядного цвета в 16-разрядный.

Дисплей, правда, какой оказался под рукой. А оказался 3.3-вольтовый 220х176 с параллельным интерфейсом. Параллельный, конечно, быстрее. Но, учитывая, что с одной стороны вся реализация протокола сугубо софтверная (против аппаратного SPI), а с другой - что у 328 при использовании COM-порта нет ни одного полного 8-разрядного порта, и "порт" приходится комбинировать из двух посредством битовых операций, разница с аппаратным SPI получается не очень большой. 

Ну а если учесть, что в связи с 3-вольтовостью дисплея был использован Pro Mini 3.3V 8 MHz, частоту вывода порядка 10 fps можно считать вполне приемлемой.

// Arduino Pro or Pro Mini
// Atmega328P (3.3 v, 8 MHz)
// 220x176

#include "UTFT.h"
#include "pictures.h"
extern uint8_t SmallFont[];

// GND               -- GND
// 3V3               -- 3.3V
// CS                -- A3
// RS                -- A2
// WR                -- A1
// RD                -- 3.3V
// RST               -- A0
// LED               -- GND
// DB0               -- 8
// DB1               -- 9
// DB2               -- 2
// DB3               -- 3
// DB4               -- 4
// DB5               -- 5
// DB6               -- 6
// DB7               -- 7

//
// Remember to change the model parameter to suit your display module!
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_RS A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RST A0 // 

UTFT tft(LGDP4524,LCD_RS,LCD_WR,LCD_CS,LCD_RST);

void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  delay(200);
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  Serial.begin(115200);
  Serial.println("Start LGDP4524");
  delay(100);
  randomSeed(analogRead(0));
  
  tft.InitLCD();
  tft.setFont(SmallFont);
}

uint16_t pattern1[] = { 0x0000, 0x0000, 0x0000, 0x0000,  // 0 = 0000
                        0x0000, 0x0000, 0x0000, 0xffff,  // 1 = 0001
                        0x0000, 0x0000, 0xffff, 0x0000,  // 2 = 0010
                        0x0000, 0x0000, 0xffff, 0xffff,  // 3 = 0011
                        0x0000, 0xffff, 0x0000, 0x0000,  // 4 = 0100
                        0x0000, 0xffff, 0x0000, 0xffff,  // 5 = 0101
                        0x0000, 0xffff, 0xffff, 0x0000,  // 6 = 0110
                        0x0000, 0xffff, 0xffff, 0xffff,  // 7 = 0111
                        0xffff, 0x0000, 0x0000, 0x0000,  // 8 = 1000
                        0xffff, 0x0000, 0x0000, 0xffff,  // 9 = 1001
                        0xffff, 0x0000, 0xffff, 0x0000,  // a = 1010
                        0xffff, 0x0000, 0xffff, 0xffff,  // b = 1011
                        0xffff, 0xffff, 0x0000, 0x0000,  // c = 1100
                        0xffff, 0xffff, 0x0000, 0xffff,  // d = 1101
                        0xffff, 0xffff, 0xffff, 0x0000,  // e = 1110
                        0xffff, 0xffff, 0xffff, 0xffff}; // f = 1111

void setPixel(word color)
{
      PORTB = (color>>8) & 0x3;  
      PORTD = (color>>8) & 0xFD;  
  PORTC &= 0xfd; // WR = A1 
  PORTC |= 0x02; // WR = A1 
      PORTB = (color&0xFF) & 0x3;  
      PORTD = (color&0xFF) & 0xFD;  
  PORTC &= 0xfd; // WR = A1 
  PORTC |= 0x02; // WR = A1 
}

void inline draw8pix(uint8_t b) {
  uint8_t register bb = (b >> 4) * 4;
    setPixel(pattern1[bb++]);
    setPixel(pattern1[bb++]);
    setPixel(pattern1[bb++]);
    setPixel(pattern1[bb]);
    bb = (b & 0x0f) * 4;
    setPixel(pattern1[bb++]);
    setPixel(pattern1[bb++]);
    setPixel(pattern1[bb++]);
    setPixel(pattern1[bb]);
}

void loop()
{
  static int n = 0;
  static int oldTime;
  Serial.print("Step "); Serial.print(n++);  Serial.print(", time: ");  Serial.println(millis() - oldTime - 1000);
  oldTime = millis();

  int t0 = millis();
  tft.clrScr();
  int t1 = millis();

  tft.print("ABCDEFGHIJKLMNOPQ",   1,   0);
  tft.print("ABCDEFGHIJKLMNOPQ",   9,  16);
  tft.print("ABCDEFGHIJKLMNOPQ",  17,  32);
  tft.print("ABCDEFGHIJKLMNOPQ",  25,  48);
  tft.print("ABCDEFGHIJKLMNOPQ",  33,  64);
  tft.print("ABCDEFGHIJKLMNOPQ",  41,  80);
  tft.print("ABCDEFGHIJKLMNOPQ",  49,  96);
  tft.print("ABCDEFGHIJKLMNOPQ",  57, 112);
  tft.print("ABCDEFGHIJKLMNOPQ",  65, 128);
  tft.print("ABCDEFGHIJKLMNOPQ",  73, 144);
  int t2 = millis();

  const unsigned char * ris;
  static int nn = 0;
  switch(n & 3) {
    case 0 : ris = ris_1; break;
    case 1 : ris = ris_2; break;
    case 2 : ris = ris_3; break;
    case 3 : ris = ris_4; break;
  }

  PORTC &= 0xf7; // CS = A3 
  tft.setXY(0, 0, 159, 127);
  for(int i = 0; i < (128*160)/8; i++) {
    draw8pix(pgm_read_byte(ris + i));        //&data[(ty*sx)+tx]));
  }
  PORTC |= 0x08; // CS = A3 

  int t3 = millis();
  tft.print("Clr:",      0, 161);
  tft.printNumI(t1-t0,  32, 161); // очистка экрана ~228мс (6 мкс/пиксель)
  tft.print(",Text:",   56, 161);
  tft.printNumI(t2-t1, 104, 161); // 10 строк по 18 символов ~527мс (2.93мс/символ ~30 мкс/пискель)
  tft.print(",Draw:",  128, 161);
  tft.printNumI(t3-t2, 176, 161); // 20480 пикселей за 102 мс - менее 40 тактов (5 мкс) на пиксель

  delay (1000);
}

Собственно вывод с перекодировкой осуществляется в строках 128-133 и 54-94.

Для сравнения приводится примерно такой же по количеству пикселей вывод текста стандартными средствами библиотеки. Занимает в 5 раз больше времени.

lilik
Offline
Зарегистрирован: 19.10.2017

andriano пишет:

Честно говоря, как-то не вижу практического смысла в псевдораскраске монохромного изображения.

Если кто-то сможет объяснить - с удовольствием выслушаю.

 

:)

 А как вы в про мини 168 сделаете электронную версию значка?, иными подходами.

// РИСУНОК контур 4 цвета
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

extern const unsigned char ris_1[];
int i, j;// пришлось вынести из функции отрисовки картинки

void setup(void) {
  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
 tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.fillScreen(ST7735_BLACK);
 tft.setRotation(0);//ориентация экрана
 }
void loop() {
drawBitmap_(0,0,ris_1,128,160);

delay(200);
 }
/////////////////////////////////////////////////////////////////////
void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h) {
 bool flag=true;//  
 if(x<0||x+w>128||y<0||y+h>160){return;} 
 tft.setAddrWindow(x,y,x+w-1,y+h-1);
 int  byteWidth = (w + 7) / 8;
  uint8_t byte_;uint8_t byte_st;
   //
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
 for(j=0; j<h; j++) {
    for(i=0; i<w; i++) {
      if(i & 7) {byte_ <<= 1;byte_st <<= 1;}
      else     { byte_   = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}}
      if(byte_ & 0x80)
      {
     if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3()>>8);SPI.transfer(COLor_3());}//цвет контура левого верхнего плана    
     else { SPI.transfer(COLor_1()>>8);SPI.transfer(COLor_1());}// цвет раскраски внутри контура 
   
      flag=false;
      }
     else {
       if(!flag||byte_st & 0x80){SPI.transfer(COLor_4()>>8);SPI.transfer(COLor_4());}//цвет контура правого нижнего плана
       else {SPI.transfer(COLor_2()>>8);SPI.transfer(COLor_2());} // цвет фона
      flag=true;  
     }
    }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 ///  
}
/////////////////////////////////////////////////////////////////////
const uint16_t COLor_1(){//цвет раскраски изображения внутри контура
return tft.Color565(150-i,100-i/1.5,50);   
}
const uint16_t COLor_2(){// цвет фона
if(i<35||i>84||j<75||j>145||(i>=35&&i<45&&j>135)){return tft.Color565(245-i,165-j/2,0);}
else{return tft.Color565(200-1.6*j,140,170);}   
}
const uint16_t COLor_3(){//цвет контура левого верхнего плана 
return tft.Color565(255,255,50);   
}
const uint16_t COLor_4(){//цвет контура правого нижнего плана
return tft.Color565(0,0,0);   
}
/////////////////////////////////////////////////////////////////////

Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

lilik пишет:

Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)

Ну вы не там ищете видимо ...

https://wokwi.com/projects/343480636730770003

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

lilik пишет:

Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)

Ну вы не там ищете видимо ...

https://wokwi.com/projects/343480636730770003

я еще кофе с утра не попил...не соображу никак )))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Если надо и параметры передать, то 

void red(unsigned long d) {
  digitalWrite(3, HIGH);
  delay(d);
  digitalWrite(3, LOW);
}

void green(unsigned long d) {
  digitalWrite(2, HIGH);
  delay(d);
  digitalWrite(2, LOW);
}

void blink(void userfunc(unsigned long), unsigned long d) {
  userfunc(d);
}

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}

void loop() {
  blink(red,200);
  blink(green,1000);
}

Евгений Петрович нас в угол поставит и скажет как писать АБСОЛЮТНО верно !

lilik
Offline
Зарегистрирован: 19.10.2017

Базовый пример заработал. Мне не хватило фантазии догадаться что в аргументах надо drawBitmap_(0,0,ris_1,128,160,COL1,COL1,COL3,COL3); я упрямо писал drawBitmap_(0,0,ris_1,128,160,COL1(),COL1(),COL3(),COL3());

// РИСУНОК контур - 4 цвета
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

extern const unsigned char ris_1[];
 int i, j;// пришлось вынести из функции отрисовки картинки


void setup(void) {
  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
 tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.fillScreen(ST7735_BLACK);
 tft.setRotation(0);//ориентация экрана
 }

void loop() {
    
drawBitmap_(0,0,ris_1,128,160,COL1,COL1,COL3,COL3);
delay(500);
drawBitmap_(0,0,ris_1,128,160,COL2,COL2,COL4,COL4);
delay(500);
 }
/////////////////////////////////////////////////////////////////////
void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(),const uint16_t (*COLor_2)(),const uint16_t (*COLor_3)(),const uint16_t (*COLor_4)()) {
 bool flag=true;//  
 if(x<0||x+w>128||y<0||y+h>160){return;} 
 tft.setAddrWindow(x,y,x+w-1,y+h-1);
 int  byteWidth = (w + 7) / 8;
  uint8_t byte_;uint8_t byte_st;
   //
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
 for(j=0; j<h; j++) {
    for(i=0; i<w; i++) {
      if(i & 7) {byte_ <<= 1;byte_st <<= 1;}
      else     { byte_   = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}}
      if(byte_ & 0x80)
      {
     if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3()>>8);SPI.transfer(COLor_3());}//цвет контура левого верхнего плана    
     else { SPI.transfer(COLor_1()>>8);SPI.transfer(COLor_1());}// цвет раскраски внутри контура 
   
      flag=false;
      }
     else {
       if(!flag||byte_st & 0x80){SPI.transfer(COLor_4()>>8);SPI.transfer(COLor_4());}//цвет контура правого нижнего плана
       else {SPI.transfer(COLor_2()>>8);SPI.transfer(COLor_2());} // цвет фона
      flag=true;  
     }
    }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 ///  
}
/////////////////////////////////////////////////////////////////////
//варианты функций - раскрасок
const uint16_t COL1(){// 1 позиция в аргументах - цвет раскраски изображения внутри контура
return tft.Color565(255-j,j,0);   
}
const uint16_t COL2(){// 2 позиция в аргументах - цвет фона
return tft.Color565(235-j,j+50,0);   
}
const uint16_t COL3(){//3 позиция в аргументах - цвет контура левого верхнего плана 
return tft.Color565(255,255,155);   
}
const uint16_t COL4(){//4 позиция в аргументах - цвет контура правого нижнего плана
return tft.Color565(0,0,0);   
}
 
/////////////////////////////////////////////////////////////////////

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Добавив () вы не указатель передали, а пытались вызвать именно в этом месте саму функцию ...

Все мы не с учебником по C/C++ в руках родились, но многие знают его почти наизусть ... 

lilik
Offline
Зарегистрирован: 19.10.2017

Это хорошо когда вокруг знающие и отзывчивые люди.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

lilik пишет:

Это хорошо когда вокруг знающие и отзывчивые люди.


для этого форумы и придумали, для тех, для кого это просто хобби )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

 А как вы в про мини 168 сделаете электронную версию значка?, иными подходами.

А что, с этим подходом получилось?

Вы хотите сказать, что два вышеприведенные изображения эквивалентны?

Цитата:

Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)

Отож!

Т.е. цель не достигается. Тогда зачем все это?

lilik
Offline
Зарегистрирован: 19.10.2017

andriano пишет:

[А что, с этим подходом получилось?

Вы хотите сказать, что два вышеприведенные изображения эквивалентны?

......

Отож!

Т.е. цель не достигается. Тогда зачем все это?

Они определённым образом имеют сходства. Изначально, цель из Ч/Б изображения получать цветное. - т.е. заведомо эквивалента нет. Но идея с расширением целей по мере увязания в болоте мне ясна :) Т.е. исходник берём цветной и как то его выводим на экран.

Что касается функций - все цели операции достигнуты, подсказали как правильно сделать.

lilik
Offline
Зарегистрирован: 19.10.2017

Более медведистый медведь.

lilik
Offline
Зарегистрирован: 19.10.2017

Оказывается можно значения локальных переменных одних функций передавать другим функциям (счётчики i и j - задание цвета от его положения)

// РИСУНОК контур 4 цвета
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

extern const unsigned char ris_1[];


void setup(void) {
  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
 tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.fillScreen(ST7735_BLACK);
 tft.setRotation(0);//ориентация экрана
 }
void loop() {
drawBitmap_(0,0,ris_1,128,160,COL1,COL2,COL3,COL4);
delay(500);

 }
/////////////////////////////////////////////////////////////////////
void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(int &i,int &j),const uint16_t (*COLor_2)(int &i,int &j),const uint16_t (*COLor_3)(int &i,int &j),const uint16_t (*COLor_4)(int &i,int &j)) {
 bool flag=true;//  
 if(x<0||x+w>128||y<0||y+h>160){return;} 
 tft.setAddrWindow(x,y,x+w-1,y+h-1);
 int  byteWidth = (w + 7) / 8;
 uint8_t byte_;uint8_t byte_st;
 
   //
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
 for(int j=0; j<h; j++) {
    for( int i=0; i<w; i++) {
      if(i & 7) {byte_ <<= 1;byte_st <<= 1;}
      else     { byte_   = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}}
      if(byte_ & 0x80)
      {
     if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3(i,j)>>8);SPI.transfer(COLor_3(i,j));}//цвет контура левого верхнего плана    
     else { SPI.transfer(COLor_1(i,j)>>8);SPI.transfer(COLor_1(i,j));}// цвет раскраски внутри контура 
   
      flag=false;
      }
     else {
       if(!flag||byte_st & 0x80){SPI.transfer(COLor_4(i,j)>>8);SPI.transfer(COLor_4(i,j));}//цвет контура правого нижнего плана
       else {SPI.transfer(COLor_2(i,j)>>8);SPI.transfer(COLor_2(i,j));} // цвет фона
      flag=true;  
     }
    }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 ///  
}
/////////////////////////////////////////////////////////////////////
//варианты функций - раскрасок
const uint16_t COL1(int &i,int &j){// 1 позиция в аргументах - цвет раскраски изображения внутри контура
return tft.Color565(255-j/2,190-j,0);   
}
const uint16_t COL2(int &i,int &j){// 2 позиция в аргументах -  цвет фона
return tft.Color565(225-i/2,160-i,0);   
}
const uint16_t COL3(int &i,int &j){// 3 позиция в аргументах - цвет контура левого верхнего плана 
return tft.Color565(200,200,100);   
}
const uint16_t COL4(int &i,int &j){// 4 позиция в аргументах - цвет контура правого нижнего плана
return tft.Color565(75,75,75);   
}
/////////////////////////////////////////////////////////////////////

Но самое смешное, что я в аргументах основной функции ссылаюсь или указываю на переменные которые только будут в ней объявлены. И это работает, хоть и алогично.

Argus19
Offline
Зарегистрирован: 08.05.2022

ua6em пишет:

было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует

 Если использовать, например, FM24C256-G с её 32 кБ памяти, в качестве места хранения картинок то может и получиться.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

IMHO намного проще на Меге 2560 попробовать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

IMHO намного проще на Меге 2560 попробовать.

у меня для этой самой штуки есть RP2040 )))

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ua6em пишет:

andriano пишет:

IMHO намного проще на Меге 2560 попробовать.

у меня для этой самой штуки есть RP2040 )))


Толку то, если частоту spi поднять никак не получается через библиотеки, тогда уж через sdk и напрямую к экрану обращаться.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:
ua6em пишет:

andriano пишет:

IMHO намного проще на Меге 2560 попробовать.

у меня для этой самой штуки есть RP2040 )))

Толку то, если частоту spi поднять никак не получается через библиотеки, тогда уж через sdk и напрямую к экрану обращаться.

как не получается, 25 мегагерц получается, мало?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Мало конечно) МК же может бОльше!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:
Мало конечно) МК же может бОльше!

я не пробовал больше, надо в библиотеке (Adafruit_GFX) частоту поправить, по идее должна работать и 33.250MHZ и на 66.5MHz
В ядре 2.5.4 изменили структуру каталогов, теперь установки хард SPI тут - arduino-1.8.19/portable/packages/rp2040/hardware/rp2040/2.5.4/ArduinoCore-API/api/

Скорость порта по умолчанию не изменилась - 4MHz

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:
Мало конечно) МК же может бОльше!

абстрактно - да, нагруженный - что-то уже сомневаюсь, падают уровни, довольно сильно, на 30 мегагерцах CLK уже порядка 2.2 вольта

И таки да, ядро не умеет быстрее 40 наносекунд, взял скетч прекрасно это делающий под ядром MBED, а вот под 2.5.4...

 

Учитывая, что изначально HARDWARE SPI заточен на частоту 4 Мегагерца, крутить кино на этой плате никто не собирался...
("не для того мама доченьку растила")

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

 

Учитывая, что изначально HARDWARE SPI заточен на частоту 4 Мегагерца, крутить кино на этой плате никто не собирался...

А какое вообще имеет SPI к "крутить кино"?

SPI - это последовательный интерфейс, если кто не знает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

SPI - это последовательный интерфейс, если кто не знает.

не думал, что это секрет )))

PS попробовал для RP2040 другую библиотеку TFT_eSPI, результат прежний CLK  40 наносекунд...
      значит дальнейшее ускорение через правку чего-то в ядре фила
Если кому-то понадобится конфигурационный файл User_Setup.h для  ST7735 1.8" SPI 128*160
 

// TO RP2040 & ST7735 (SPI1)
//
//                            USER DEFINED SETTINGS
//   Set driver type, fonts to be loaded, pins used and SPI control method etc
//
//   See the User_Setup_Select.h file if you wish to be able to define multiple
//   setups and then easily select which setup file is used by the compiler.
//
//   If this file is edited correctly then all the library example sketches should
//   run without the need to make any more changes for a particular hardware setup!
//   Note that some sketches are designed for a particular TFT pixel width/height

// User defined information reported by "Read_User_Setup" test & diagnostics example
#define USER_SETUP_INFO "User_Setup"

// Define to disable all #warnings in library (can be put in User_Setup_Select.h)
//#define DISABLE_ALL_LIBRARY_WARNINGS

// ##################################################################################
//
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################

// Define STM32 to invoke optimised processor support (only for STM32)
//#define STM32

// Defining the STM32 board allows the library to optimise the performance
// for UNO compatible "MCUfriend" style shields
//#define NUCLEO_64_TFT
//#define NUCLEO_144_TFT

// STM32 8 bit parallel only:
// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7
// then this will improve rendering performance by a factor of ~8x
//#define STM_PORTA_DATA_BUS
//#define STM_PORTB_DATA_BUS

// Tell the library to use parallel mode (otherwise SPI is assumed)
//#define TFT_PARALLEL_8_BIT
//#defined TFT_PARALLEL_16_BIT // **** 16 bit parallel ONLY for RP2040 processor ****

// Display type -  only define if RPi display
//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI

// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER       // Generic driver for common displays
//#define ILI9341_2_DRIVER     // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172
#define ST7735_DRIVER      // Define additional parameters below for this display
//#define ILI9163_DRIVER     // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER     // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
//#define ST7789_DRIVER      // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER    // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
//#define ST7796_DRIVER
//#define SSD1351_DRIVER
//#define SSD1963_480_DRIVER
//#define SSD1963_800_DRIVER
//#define SSD1963_800ALT_DRIVER
//#define ILI9225_DRIVER
//#define GC9A01_DRIVER

// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:

// #define TFT_SDA_READ      // This option is for ESP32 ONLY, tested with ST7789 and GC9A01 display only

// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display

  #define TFT_RGB_ORDER TFT_RGB  // Colour order Red-Green-Blue
//  #define TFT_RGB_ORDER TFT_BGR  // Colour order Blue-Green-Red

// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below

// #define M5STACK

// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH  80
 #define TFT_WIDTH  128
// #define TFT_WIDTH  172 // ST7789 172 x 320
// #define TFT_WIDTH  240 // ST7789 240 x 240 and 240 x 320
 #define TFT_HEIGHT 160
// #define TFT_HEIGHT 128
// #define TFT_HEIGHT 240 // ST7789 240 x 240
// #define TFT_HEIGHT 320 // ST7789 240 x 320
// #define TFT_HEIGHT 240 // GC9A01 240 x 240

// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or stray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:

// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128    // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
 #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80   // For 160 x 80 display with 24 pixel offset

// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.

// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF


// ##################################################################################
//
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################

// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);

// #define TFT_BL   32            // LED back-light control pin
// #define TFT_BACKLIGHT_ON HIGH  // Level to turn ON back-light (HIGH or LOW)



// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO  to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED       to NodeMCU pin VIN (or 5V, see below)
// Display SCK       to NodeMCU pin D5
// Display SDI/MOSI  to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET     to NodeMCU pin D4 (or RST, see below)
// Display CS        to NodeMCU pin D8 (or GND, see below)
// Display GND       to NodeMCU pin GND (0V)
// Display VCC       to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labelled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.


// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######

// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS   PIN_D8  // Chip select control pin D8
#define TFT_DC   PIN_D3  // Data Command control pin
#define TFT_RST  PIN_D4  // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST  -1    // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V

//#define TFT_BL PIN_D1  // LED back-light (only for ST7789 with backlight control pin)

//#define TOUCH_CS PIN_D2     // Chip select pin (T_CS) of touch screen

//#define TFT_WR PIN_D2       // Write strobe for modified Raspberry Pi TFT only


// ######  FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES  ######

// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions. It is best not to connect MISO as some displays
// do not tristate that line when chip select is high!
// Note: Only one SPI device can share the FLASH SPI lines, so a SPI touch controller
// cannot be connected as well to the same SPI signals.
// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// On NodeMCU V3  S0 =MISO, S1 =MOSI, S2 =SCLK
// In ESP8266 overlap mode the following must be defined

//#define TFT_SPI_OVERLAP

// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS   PIN_D3
//#define TFT_DC   PIN_D5  // Data Command control pin
//#define TFT_RST  PIN_D4  // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST  -1  // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V


// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP   ######

// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins

//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS   15  // Chip select control pin
//#define TFT_DC    2  // Data Command control pin
//#define TFT_RST   4  // Reset pin (could connect to RST pin)
//#define TFT_RST  -1  // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST

// For ESP32 Dev board (only tested with GC9A01 display)
// The hardware SPI can be mapped to any pins

//#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on.
//#define TFT_SCLK 14
//#define TFT_CS   5  // Chip select control pin
//#define TFT_DC   27  // Data Command control pin
//#define TFT_RST  33  // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL   22  // LED back-light

//#define TOUCH_CS 21     // Chip select pin (T_CS) of touch screen

//#define TFT_WR 22    // Write strobe for modified Raspberry Pi TFT only

// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS   14  // Chip select control pin
//#define TFT_DC   27  // Data Command control pin
//#define TFT_RST  33  // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL   32  // LED back-light (required for M5Stack)

// ######       EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP        ######

// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!

// Parallel bus is only supported for the STM32 and ESP32
// Example below is for ESP32 Parallel interface with UNO displays

// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)
//#define TFT_PARALLEL_8_BIT

// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS   33  // Chip select control pin (library pulls permanently low
//#define TFT_DC   15  // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST  32  // Reset pin, toggles on startup

//#define TFT_WR    4  // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD    2  // Read strobe control pin

//#define TFT_D0   12  // Must use pins in the range 0-31 for the data bus
//#define TFT_D1   13  // so a single register write sets/clears all bits.
//#define TFT_D2   26  // Pins can be randomly assigned, this does not affect
//#define TFT_D3   25  // TFT screen update performance.
//#define TFT_D4   17
//#define TFT_D5   16
//#define TFT_D6   27
//#define TFT_D7   14

// ######       EDIT THE PINs BELOW TO SUIT YOUR STM32 SPI TFT SETUP        ######

// The TFT can be connected to SPI port 1 or 2
//#define TFT_SPI_PORT 1 // SPI port 1 maximum clock rate is 55MHz
//#define TFT_MOSI PA7
//#define TFT_MISO PA6
//#define TFT_SCLK PA5

//#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz
//#define TFT_MOSI PB15
//#define TFT_MISO PB14
//#define TFT_SCLK PB13

// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select
//#define TFT_CS   D5 // Chip select control pin to TFT CS
//#define TFT_DC   D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select)
//#define TFT_RST  D7 // Reset pin to TFT RST (or RESET)
// OR alternatively, we can use STM32 port reference names PXnn
//#define TFT_CS   PE11 // Nucleo-F767ZI equivalent of D5
//#define TFT_DC   PE9  // Nucleo-F767ZI equivalent of D6
//#define TFT_RST  PF13 // Nucleo-F767ZI equivalent of D7

//#define TFT_RST  -1   // Set TFT_RST to -1 if the display RESET is connected to processor reset
                        // Use an Arduino pin for initial testing as connecting to processor reset
                        // may not work (pulse too short at power up?)

// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################

// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT


// ##################################################################################
//
// Section 4. Other options
//
// ##################################################################################

// For RP2040 processor and SPI displays, uncomment the following line to use the PIO interface.
//#define RP2040_PIO_SPI // Leave commented out to use standard RP2040 SPI port interface

// For the RP2040 processor define the SPI port channel used (default 0 if undefined)
#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used

#define TFT_MISO 12
#define TFT_MOSI 15
#define TFT_SCLK 14
#define TFT_CS   13  // Chip select control pin
#define TFT_DC   11  // Data Command control pin
#define TFT_RST  10  // Reset pin (could connect to RST pin)

// For the STM32 processor define the SPI port channel used (default 1 if undefined)
//#define TFT_SPI_PORT 2 // Set to 1 for SPI port 1, or 2 for SPI port 2

// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 27 MHz works OK.

// #define SPI_FREQUENCY   1000000
// #define SPI_FREQUENCY   5000000
// #define SPI_FREQUENCY  10000000
// #define SPI_FREQUENCY  20000000
// #define SPI_FREQUENCY  27000000
#define SPI_FREQUENCY  33000000
// #define SPI_FREQUENCY  40000000
// #define SPI_FREQUENCY  55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz)
// #define SPI_FREQUENCY  67000000 (на ядре Фила не отрабатывает)
// #define SPI_FREQUENCY  80000000

// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY  20000000

// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
#define SPI_TOUCH_FREQUENCY  2500000

// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
//#define USE_HSPI_PORT

// Comment out the following #define if "SPI Transactions" do not need to be
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!

// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.

// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect

// #define SUPPORT_TRANSACTIONS

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Код для AVR с флеш до 64K. Кварц 16 МГц. SPI на скорости 16/2=8 МГц.

Вывод из flash ~22 FPS для кадра размером 128х160:

void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[],
                    int16_t w, int16_t h, uint16_t color, uint16_t bg) {
  uint8_t b(0);
  uint8_t bc(0);
  uint16_t tc(0);
  int16_t c =  w * h;
  tft.startWrite();
  tft.setAddrWindow(x, y, w, h);
  asm volatile(
    "mloop_%=: \n"
    "   LPM %[b],%a[bm]+ \n"
    "   LDI %[bc],1 \n"
    "loop_%=: \n"
    "   SBRC %[b],7 \n"
    "   MOVW %[tc],%[color] \n"
    "   SBRS %[b],7 \n"
    "   MOVW %[tc],%[bg] \n"
    "   IN __tmp_reg__,%[spdr]-1 \n"
    "   OUT %[spdr],%B[tc] \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   IN __tmp_reg__,%[spdr]-1 \n"
    "   OUT %[spdr],%A[tc] \n"
    "   SBIW %[c],1 \n"
    "   BREQ exit_%= \n"
    "   NOP \n"
    "   LSL %[b] \n"
    "   LSL %[bc] \n"
    "   BRCS mloop_%= \n"
    "   RJMP .+0 \n"
    "   NOP \n"
    "   RJMP loop_%= \n"
    "exit_%=: \n"
  :
  : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg),
    [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c)
  : );
  tft.endWrite();
}

 

lilik
Offline
Зарегистрирован: 19.10.2017

Это многоцветный рисунок?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Тестировал на ваших ris_1..4.

2 цвета - один для установленных битов, второй для сброшенных.

lilik
Offline
Зарегистрирован: 19.10.2017

Ч\Б значит рисунок, я просто не понял почему 64К, у меня опыты на уно.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Для UNO этот код подходит!!! Там где >64К (мега и др.) - немного другая адресация памяти и надо менять код.

lilik
Offline
Зарегистрирован: 19.10.2017

Сейчас попробую тогда.

lilik
Offline
Зарегистрирован: 19.10.2017

Не, не пошло ругается на  tft.startWrite();, нет его видно в моей версии библиотеки.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/st7735-160-na-128-podsvetka-barakhlit?page=3#comment-666486

Надо CS подёргать

void Adafruit_SPITFT::startWrite(void) {
  SPI_BEGIN_TRANSACTION();
  if (_cs >= 0)
    SPI_CS_LOW();
}

/*!
    @brief  Call after issuing command(s) or data to display. Performs
            chip-deselect (if required) and ends an SPI transaction (if
            using hardware SPI and transactions are supported). Required
            for all display types; not an SPI-specific function.
*/
void Adafruit_SPITFT::endWrite(void) {
  if (_cs >= 0)
    SPI_CS_HIGH();
  SPI_END_TRANSACTION();
}

 

lilik
Offline
Зарегистрирован: 19.10.2017
void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[],
                    int16_t w, int16_t h, uint16_t color, uint16_t bg) {
  uint8_t b(0);
  uint8_t bc(0);
  uint16_t tc(0);
  int16_t c =  w * h;
 // tft.startWrite();
  tft.setAddrWindow(x, y, w, h);
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
  asm volatile(
    "mloop_%=: \n"
    "   LPM %[b],%a[bm]+ \n"
    "   LDI %[bc],1 \n"
    "loop_%=: \n"
    "   SBRC %[b],7 \n"
    "   MOVW %[tc],%[color] \n"
    "   SBRS %[b],7 \n"
    "   MOVW %[tc],%[bg] \n"
    "   OUT %[spdr],%B[tc] \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   OUT %[spdr],%A[tc] \n"
    "   SBIW %[c],1 \n"
    "   BREQ exit_%= \n"
    "   LSL %[b] \n"
    "   LSL %[bc] \n"
    "   NOP \n"
    "   BRCS mloop_%= \n"
    "   RJMP .+0 \n"
    "   NOP \n"
    "   RJMP loop_%= \n"
    "exit_%=: \n"
  :
  : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg),
    [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c)
  : );
//  tft.endWrite();
 digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction(); 
}

Вот так сделал и не прокатило, а раньше прокатывало :) - появилась очень быстрая череда чб полос.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Дернуть CS достаточно - у вас же уже инициализация дисплея уже прошла, значит SPI уже запущен.

tft.setAddrWindow(x, y, w, h); у вас оказался выше и не передался на устройство !!! и при этом напишите tft.setAddrWindow(x, y, w, h); в стиле вашей библиотеки = скопируйте из вашего скетча.

Почему вами используется не актуальная версия библиотеки ???

lilik
Offline
Зарегистрирован: 19.10.2017
void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[],
                    int16_t w, int16_t h, uint16_t color, uint16_t bg) {
  uint8_t b(0);
  uint8_t bc(0);
  uint16_t tc(0);
  int16_t c =  w * h;
 // tft.startWrite();
 // tft.setAddrWindow(x, y, w, h);
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW);
   tft.setAddrWindow(x, y, w, h); 
  asm volatile(
    "mloop_%=: \n"
    "   LPM %[b],%a[bm]+ \n"
    "   LDI %[bc],1 \n"
    "loop_%=: \n"
    "   SBRC %[b],7 \n"
    "   MOVW %[tc],%[color] \n"
    "   SBRS %[b],7 \n"
    "   MOVW %[tc],%[bg] \n"
    "   OUT %[spdr],%B[tc] \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   OUT %[spdr],%A[tc] \n"
    "   SBIW %[c],1 \n"
    "   BREQ exit_%= \n"
    "   LSL %[b] \n"
    "   LSL %[bc] \n"
    "   NOP \n"
    "   BRCS mloop_%= \n"
    "   RJMP .+0 \n"
    "   NOP \n"
    "   RJMP loop_%= \n"
    "exit_%=: \n"
  :
  : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg),
    [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c)
  : );
//  tft.endWrite();
 digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction(); 
}

Теперь просто белый экран. tft.setAddrWindow(x, y, w, h); он же вроде самодостаточен в рамках библиотеки. Старая библиотека... не  знаю откуда она у меня бралась. Как экранчик заработал так и пошло по накатанной.

lilik
Offline
Зарегистрирован: 19.10.2017

Кстати я сделал вывод пикселя независимо от библиотеки. Попиксельный вывод с этой функцией дал скорость 0.8 кадра в секунду :)

///////////////////////////////////////////////////////////////////// 
void pixel_(uint8_t x0, uint8_t y0,uint16_t COLor) 
{
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
   
  digitalWrite(TFT_DC, LOW);SPI.transfer(0x2A); // Column addr set
  digitalWrite(TFT_DC, HIGH); SPI.transfer(0x00);
  SPI.transfer(x0);     // XSTART 
  SPI.transfer(0x00);
 // SPI.transfer(x0+1);     // XEND

  digitalWrite(TFT_DC, LOW); SPI.transfer(0x2B); // Row addr set
  digitalWrite(TFT_DC, HIGH); SPI.transfer(0x00);
  SPI.transfer(y0);     // YSTART
  SPI.transfer(0x00);
 // SPI.transfer(y0+1);     // YEND

  digitalWrite(TFT_DC, LOW); SPI.transfer(0x2C); // write to RAM
  //
 digitalWrite(TFT_DC, HIGH); SPI.transfer(COLor>> 8);
 SPI.transfer(COLor);
  
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction(); 
}
//////////////////////////////////////////////////////////////////////  

 

nik182
Offline
Зарегистрирован: 04.05.2015

9 digitalWrite(); даёт заметную задержку. Попробуй использовать bitSet() и bitClear() Люк! https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bi... https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bi...

 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Добавил в коде #236 чтение=сброс битов в SPSR - попробуйте на досуге ...

Вот весь код:

const unsigned char ris_1[]PROGMEM = {
  0X00, 0X00, 0X00, 0X00, 0X80, 0X00, 0X00, 0X05, 0XB5, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X00, 0X5A, 0X40, 0X94, 0XA0, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X02, 0X14, 0X40, 0X02, 0XA8, 0X08, 0X55, 0X0E, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X08, 0X40, 0X01, 0X14, 0XB1, 0X03, 0X08, 0XA1, 0XA4, 0X80, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X80, 0X00, 0X04, 0X02, 0XC0, 0X2C, 0X52, 0X00, 0XC0, 0X08, 0X00, 0X00, 0X00,
  0X04, 0X88, 0X44, 0X14, 0X01, 0X20, 0X10, 0XAA, 0XB2, 0XAB, 0XAA, 0X28, 0X00, 0X88, 0X80, 0X00,
  0X10, 0X01, 0X00, 0X00, 0X08, 0X00, 0X0B, 0XC0, 0X55, 0X54, 0X90, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X10, 0X40, 0X04, 0X42, 0X93, 0X54, 0X82, 0X26, 0X12, 0X40, 0X00, 0X01, 0X00,
  0X80, 0X00, 0X00, 0X41, 0X01, 0X11, 0X0B, 0X45, 0XA9, 0X51, 0X01, 0X41, 0X02, 0X00, 0X00, 0X00,
  0X00, 0X08, 0X24, 0X00, 0X04, 0X00, 0X45, 0X4A, 0XA2, 0X0E, 0XD4, 0X80, 0X08, 0X00, 0X00, 0X00,
  0X00, 0X40, 0X80, 0X14, 0X20, 0XA1, 0X55, 0X76, 0XB5, 0XBB, 0XFA, 0X08, 0X80, 0X08, 0X00, 0X00,
  0X04, 0X00, 0X00, 0X80, 0X81, 0X08, 0X96, 0XAD, 0X56, 0XFF, 0XAF, 0XC0, 0X20, 0X20, 0X00, 0X00,
  0X40, 0X02, 0X08, 0X04, 0X14, 0XA2, 0X55, 0X5A, 0XAD, 0XF4, 0X48, 0X32, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X10, 0X01, 0X12, 0X8A, 0X89, 0X57, 0X6A, 0X5B, 0XAF, 0XB5, 0X5C, 0X24, 0X00, 0X00, 0X00,
  0X00, 0X80, 0X20, 0X00, 0X20, 0X6A, 0X57, 0X5B, 0X6F, 0X5A, 0XEA, 0XA5, 0X00, 0X00, 0X00, 0X00,
  0X04, 0X00, 0X84, 0X94, 0X0A, 0X95, 0X5A, 0XEA, 0XBA, 0XFF, 0XAD, 0X52, 0XC8, 0X40, 0X04, 0X00,
  0X80, 0X04, 0X00, 0X01, 0X55, 0X55, 0XB7, 0X55, 0XAD, 0X4B, 0XD5, 0X55, 0X41, 0X00, 0X00, 0X00,
  0X00, 0X10, 0X02, 0X48, 0X0A, 0XBA, 0XDB, 0XBA, 0XD6, 0XBE, 0XED, 0X54, 0X54, 0X00, 0X00, 0X00,
  0X10, 0X40, 0X90, 0X02, 0XB7, 0XED, 0X6D, 0X6D, 0X7A, 0XAB, 0X5F, 0XAB, 0X20, 0X00, 0X00, 0X00,
  0X01, 0X00, 0X02, 0XA8, 0X4A, 0XBB, 0X77, 0XD7, 0XAA, 0XAA, 0XEA, 0XE9, 0X49, 0X00, 0X00, 0X00,
  0X80, 0X02, 0X20, 0X02, 0XAD, 0XF5, 0XAD, 0X7D, 0XFF, 0X5A, 0XBF, 0X7D, 0X34, 0X20, 0X00, 0X00,
  0X04, 0X00, 0X09, 0X14, 0X2B, 0XDE, 0XDF, 0XD6, 0XB5, 0XEB, 0X55, 0XAB, 0X8E, 0X80, 0X00, 0X00,
  0X10, 0X10, 0X84, 0X42, 0XAF, 0X77, 0X7B, 0X7F, 0XEF, 0X5D, 0X55, 0X74, 0XF3, 0X00, 0X00, 0X00,
  0X40, 0X00, 0X21, 0X11, 0X55, 0XDB, 0XEF, 0XFB, 0X7D, 0XEB, 0XB5, 0X5E, 0X8D, 0XA2, 0X00, 0X00,
  0X00, 0X44, 0X04, 0X4A, 0X5B, 0XBE, 0XBD, 0XDF, 0XF7, 0X7D, 0X6A, 0XA3, 0X56, 0X40, 0X00, 0X00,
  0X00, 0X00, 0X81, 0X24, 0XAE, 0XEB, 0XF7, 0XFF, 0XDF, 0XD7, 0XD6, 0XBD, 0XD1, 0X50, 0X00, 0X00,
  0X82, 0X10, 0X10, 0X52, 0X57, 0XBF, 0XDF, 0XFF, 0XFF, 0XFD, 0X75, 0XA6, 0XB1, 0XA0, 0X04, 0X00,
  0X08, 0X40, 0X05, 0X09, 0XFA, 0XFD, 0XFF, 0X76, 0XFF, 0XF7, 0XBA, 0XBB, 0XFC, 0X50, 0X00, 0X04,
  0X00, 0X02, 0X40, 0XA5, 0X2F, 0XDF, 0X7B, 0XFF, 0XFD, 0XBF, 0XD7, 0XCD, 0X56, 0X20, 0X00, 0X00,
  0X20, 0X00, 0X0B, 0X4A, 0XF6, 0XF7, 0XDF, 0XFF, 0XEF, 0XFD, 0XFD, 0X75, 0XFD, 0X14, 0X00, 0X00,
  0X01, 0X00, 0X8A, 0X95, 0XDF, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0X6E, 0XDB, 0X57, 0X90, 0X00, 0X00,
  0X04, 0X12, 0X2B, 0X2F, 0X7D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XFB, 0XB7, 0XFE, 0XDA, 0X00, 0X00,
  0X40, 0X00, 0X0E, 0X2B, 0XFF, 0XBF, 0XFB, 0X6F, 0X7F, 0XDF, 0XDE, 0XED, 0X57, 0XA8, 0X00, 0X00,
  0X00, 0X40, 0XB8, 0X77, 0XDB, 0XF7, 0X7F, 0XFF, 0XFF, 0XFF, 0X77, 0X7B, 0XBD, 0XCE, 0X00, 0X00,
  0X01, 0X02, 0X59, 0X5D, 0X7F, 0XFF, 0XFF, 0XFF, 0XFD, 0XBF, 0XFD, 0XDE, 0XEE, 0XA5, 0X00, 0X00,
  0X04, 0X01, 0X69, 0XB7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XEB, 0X77, 0XF2, 0X80, 0X00,
  0X80, 0X14, 0XA2, 0XAF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0XF7, 0XEE, 0XBE, 0XBD, 0XB4, 0X40, 0X00,
  0X00, 0X02, 0XA5, 0X7F, 0XF7, 0X7F, 0XFF, 0XFF, 0XFF, 0XFD, 0XFB, 0XF7, 0XD7, 0XE9, 0X10, 0X00,
  0X10, 0X91, 0X04, 0XB6, 0XFF, 0XFF, 0XFD, 0XFF, 0XEE, 0XFF, 0X6F, 0XBD, 0X7F, 0X7D, 0X02, 0X00,
  0X00, 0X04, 0X53, 0XAF, 0XFF, 0XFF, 0XEF, 0XFF, 0XFF, 0XBF, 0XFE, 0XEF, 0XAB, 0XED, 0X00, 0X00,
  0X02, 0X42, 0X4A, 0XBF, 0XDE, 0XFF, 0X7F, 0XFF, 0XFF, 0XEF, 0X6F, 0XFA, 0XFF, 0XBA, 0X00, 0X02,
  0X08, 0X10, 0X05, 0X77, 0X7F, 0XFD, 0XFF, 0XFF, 0XFF, 0XFB, 0XFD, 0XAF, 0X5E, 0XFB, 0X80, 0X20,
  0X21, 0X4A, 0X49, 0XBF, 0XFF, 0XF7, 0XFF, 0XFF, 0XBF, 0XFE, 0XF7, 0XFD, 0XEF, 0XEC, 0X80, 0X00,
  0X04, 0XA0, 0X0A, 0XD7, 0XFF, 0XDF, 0XFF, 0XFD, 0XFF, 0X7F, 0XBF, 0XBF, 0XBF, 0X76, 0X40, 0X00,
  0X18, 0X04, 0X85, 0XBE, 0XFF, 0X7F, 0XFF, 0XFF, 0XFD, 0XEE, 0XFD, 0XFB, 0X77, 0XDF, 0X20, 0X00,
  0X50, 0X00, 0X16, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEF, 0XEF, 0XDF, 0XF2, 0X90, 0X00,
  0X42, 0X41, 0X02, 0XBB, 0XFF, 0XFF, 0XF6, 0XDB, 0XFF, 0XFF, 0XFF, 0XFE, 0XFD, 0XAD, 0X44, 0X08,
  0XA0, 0X11, 0X1A, 0XC1, 0X5B, 0XED, 0XBF, 0XE4, 0X55, 0XED, 0XB6, 0XFB, 0XBF, 0XF6, 0X80, 0X00,
  0X80, 0X82, 0X84, 0X05, 0X7F, 0X7F, 0XFD, 0XAA, 0XAA, 0X7F, 0XFF, 0XDF, 0XFF, 0XBA, 0XD4, 0X80,
  0X04, 0X01, 0X14, 0X05, 0X5F, 0XFF, 0XF7, 0XDD, 0X15, 0XBF, 0XF7, 0X7A, 0XDE, 0XED, 0X40, 0X00,
  0X01, 0X4A, 0X84, 0X17, 0XFD, 0XF7, 0X7F, 0XFE, 0XDF, 0XFE, 0XDD, 0XFF, 0XFF, 0XF5, 0X50, 0X00,
  0X12, 0X02, 0X08, 0X49, 0X5F, 0XDF, 0XFF, 0XFF, 0X7B, 0X7F, 0XFF, 0XF6, 0XBF, 0XDA, 0X90, 0X80,
  0X01, 0X45, 0X09, 0X77, 0XFF, 0XFF, 0XFF, 0XFB, 0XFF, 0XFD, 0XEF, 0XFF, 0XFF, 0X6D, 0X52, 0X00,
  0X04, 0X02, 0X8A, 0XDF, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XDD, 0XB7, 0XF5, 0X54, 0X00,
  0X41, 0X25, 0X15, 0XFA, 0XBF, 0XFF, 0XFD, 0XDF, 0XFE, 0XEF, 0XFB, 0X7F, 0XFF, 0XAD, 0X28, 0X90,
  0X14, 0X86, 0X8B, 0XEF, 0XFD, 0XFF, 0XFF, 0XFF, 0XF7, 0XFE, 0XAF, 0XF7, 0XAF, 0XFF, 0X8A, 0X00,
  0X02, 0X05, 0X0E, 0XFD, 0XAF, 0XFF, 0XFF, 0XFF, 0XBF, 0XFF, 0XFF, 0XFE, 0XFF, 0XED, 0X65, 0X40,
  0X54, 0X92, 0X97, 0XAB, 0XF6, 0XEF, 0XFF, 0XF5, 0XEF, 0XFF, 0XBB, 0X77, 0XFF, 0XBF, 0XA9, 0X54,
  0X00, 0X02, 0X16, 0XF5, 0X5B, 0XBF, 0XFF, 0XFE, 0X95, 0XFE, 0XDF, 0XFF, 0XDD, 0XFD, 0XB2, 0X50,
  0X15, 0X05, 0X1B, 0XAA, 0XAD, 0X7F, 0XF7, 0X75, 0XED, 0X7B, 0XEF, 0XDD, 0X7F, 0XFF, 0X5A, 0X94,
  0X00, 0X10, 0X8F, 0XD5, 0X75, 0X7F, 0XFF, 0XFE, 0XBA, 0XBF, 0XBB, 0X7F, 0XFF, 0XFB, 0XEA, 0X43,
  0X10, 0X42, 0X16, 0X4A, 0XBE, 0XBF, 0XDF, 0XB5, 0XDF, 0X7F, 0XDF, 0XF7, 0XEF, 0XEF, 0XD2, 0XA8,
  0X09, 0X04, 0X1B, 0X20, 0XAB, 0X2F, 0XFD, 0XF4, 0X2D, 0XDD, 0XB7, 0XBB, 0X7E, 0XFA, 0XB9, 0X51,
  0X00, 0X02, 0X16, 0X8F, 0X56, 0X9F, 0XFE, 0XAB, 0XD2, 0XEF, 0XFD, 0XFF, 0XFF, 0XFE, 0XD4, 0XA8,
  0X08, 0X08, 0X1A, 0X3C, 0X2B, 0X3F, 0X75, 0XD7, 0X01, 0X7F, 0XDF, 0X6B, 0XDF, 0XEB, 0X5E, 0XA4,
  0X08, 0X22, 0X4A, 0X78, 0X1A, 0X9F, 0XFF, 0X6F, 0X26, 0XB7, 0XF7, 0XFE, 0XFD, 0XFF, 0XD2, 0XAA,
  0X08, 0X84, 0X14, 0X28, 0X9B, 0X37, 0XD7, 0XDF, 0X03, 0X5E, 0XFF, 0XAF, 0XF7, 0XB5, 0X6D, 0X44,
  0X40, 0X0A, 0X16, 0XD0, 0X35, 0X3E, 0XFF, 0X7E, 0X82, 0XFF, 0XED, 0XFB, 0X7F, 0XDD, 0XAB, 0X69,
  0X10, 0X04, 0X2B, 0X28, 0X55, 0X5B, 0XED, 0XCB, 0X2B, 0X6D, 0XFF, 0XF7, 0XEE, 0XB6, 0XB4, 0XA0,
  0X08, 0X82, 0X0A, 0X57, 0X6E, 0X6F, 0XBF, 0X75, 0XBD, 0XBF, 0XFF, 0X7D, 0XBF, 0XDB, 0X5A, 0X5A,
  0X00, 0X08, 0X54, 0X0A, 0XDA, 0X3E, 0XF7, 0XBA, 0XA6, 0XD5, 0XED, 0XEF, 0XFF, 0X6D, 0XEB, 0X24,
  0X10, 0X00, 0X2A, 0XA5, 0X6C, 0XFB, 0XFD, 0XDF, 0X7B, 0X7F, 0X7F, 0XFA, 0XFA, 0XD5, 0X5D, 0X54,
  0X00, 0X04, 0X01, 0X4A, 0XD8, 0X2F, 0XB7, 0X6B, 0XDD, 0XD5, 0XFB, 0X5F, 0XDF, 0XBA, 0XD5, 0X95,
  0X14, 0X40, 0X55, 0XAD, 0XE8, 0XBE, 0XEF, 0XFE, 0XFF, 0XFF, 0XEF, 0XF5, 0X75, 0X68, 0X35, 0X54,
  0X00, 0X00, 0X22, 0XB7, 0X54, 0X7B, 0XBD, 0XF7, 0XF6, 0XAE, 0XFD, 0X5F, 0XDA, 0XDE, 0X8D, 0X6A,
  0X00, 0X00, 0X52, 0XDA, 0XF8, 0XDE, 0XFF, 0XDE, 0XBF, 0XEB, 0XBB, 0XF5, 0X6D, 0X6C, 0XC5, 0X56,
  0X20, 0X00, 0X4A, 0XB7, 0X51, 0X77, 0XB7, 0XFF, 0XFB, 0X7F, 0XFD, 0XBB, 0XB7, 0X3B, 0X42, 0XAB,
  0X00, 0X01, 0X2D, 0XFD, 0XF1, 0X7D, 0X7D, 0XFF, 0XFF, 0XFA, 0XDB, 0XDD, 0X6D, 0XAE, 0XD4, 0XDA,
  0X42, 0X00, 0X1B, 0X57, 0X55, 0XAF, 0XAF, 0XBE, 0XFF, 0XDF, 0XFE, 0XEB, 0XAE, 0XFA, 0X42, 0X6F,
  0X00, 0X08, 0X6D, 0XFD, 0XF2, 0XFA, 0XFB, 0XFF, 0XFF, 0XFF, 0XD7, 0X5D, 0X55, 0X3D, 0XA9, 0X5A,
  0X00, 0X20, 0X37, 0X57, 0XA5, 0XDF, 0X5F, 0X7F, 0XFD, 0XFF, 0XFD, 0XF6, 0XAD, 0X76, 0XA9, 0XB7,
  0X00, 0X00, 0X5D, 0XFD, 0XC7, 0X75, 0XD7, 0XFF, 0XFF, 0XFD, 0XF6, 0XAD, 0X55, 0XFF, 0X9D, 0X5A,
  0X00, 0X20, 0X5F, 0X57, 0X55, 0XFF, 0X5B, 0XEF, 0XFF, 0XFF, 0XDE, 0XF7, 0X1B, 0XBD, 0XD4, 0XFF,
  0X00, 0X80, 0X6B, 0XDF, 0XAF, 0XFF, 0XED, 0XFE, 0XEF, 0XDF, 0XFB, 0XAD, 0X5F, 0XFF, 0X6E, 0X57,
  0X04, 0X00, 0X3E, 0XEA, 0XCB, 0X6D, 0XB6, 0XFF, 0XFF, 0XFE, 0XFD, 0X75, 0X55, 0XED, 0XFE, 0X5D,
  0X00, 0X00, 0X5B, 0XBF, 0X9F, 0XFF, 0XDB, 0XFF, 0XFE, 0XFF, 0XEE, 0XAE, 0XBF, 0XFF, 0X6D, 0X3F,
  0X00, 0X00, 0X37, 0X6A, 0XCB, 0XFF, 0X6E, 0XBF, 0XFF, 0XF7, 0XF7, 0X75, 0X4B, 0XFD, 0XFF, 0X7F,
  0X00, 0X00, 0X5D, 0XBF, 0X97, 0XFF, 0XFD, 0XEF, 0XFB, 0XFF, 0X7A, 0XBA, 0XB7, 0XBE, 0XF6, 0XBA,
  0X00, 0X00, 0X2E, 0XD7, 0X4D, 0XFF, 0XB7, 0X7F, 0X7F, 0XBF, 0XEF, 0X56, 0XDB, 0X75, 0X7B, 0X3F,
  0X00, 0X00, 0X35, 0X7E, 0X07, 0X76, 0XFF, 0XBB, 0XFF, 0XFD, 0XFD, 0X7B, 0X4F, 0XFF, 0X5E, 0XBB,
  0X01, 0X00, 0X2F, 0XBB, 0X53, 0XDF, 0XBF, 0X6F, 0XFF, 0XF7, 0XDF, 0X55, 0X77, 0X6B, 0XBB, 0X7D,
  0X00, 0X00, 0X28, 0XEF, 0X01, 0X7A, 0XA5, 0XBE, 0XF7, 0X7F, 0XBA, 0XDA, 0X9F, 0XDA, 0XED, 0X3E,
  0X00, 0X08, 0X2B, 0XBE, 0X92, 0XDD, 0XFE, 0XFF, 0XBF, 0XFE, 0XFF, 0X6E, 0XDF, 0XB7, 0XEE, 0XF6,
  0X00, 0X00, 0X2A, 0XFF, 0XE0, 0XAB, 0XFB, 0XF6, 0XFF, 0XD7, 0XF5, 0X55, 0XAE, 0XEA, 0XB5, 0X5B,
  0X04, 0X40, 0X2B, 0X75, 0X5A, 0X7F, 0XBF, 0XBF, 0XBB, 0X7F, 0XFE, 0XBA, 0XBF, 0XB5, 0X7B, 0X7E,
  0X20, 0X00, 0X25, 0XDE, 0XFF, 0XED, 0XEE, 0XF7, 0XDF, 0XFD, 0XDB, 0X6F, 0X57, 0XA5, 0X55, 0XD5,
  0X04, 0X80, 0X32, 0XFB, 0XB7, 0XFE, 0XFB, 0XDE, 0XEF, 0XDF, 0XFE, 0XB5, 0XBD, 0X95, 0X5A, 0XBA,
  0X00, 0X00, 0X15, 0XAE, 0XFE, 0XF7, 0XFF, 0XF7, 0X5A, 0XF7, 0X7B, 0X6A, 0XAF, 0X6A, 0X8A, 0XCE,
  0X00, 0X00, 0X52, 0XFB, 0XFF, 0XDF, 0XDE, 0XDD, 0XF7, 0XDD, 0XFE, 0XBE, 0XBB, 0X95, 0X55, 0X4A,
  0X00, 0X00, 0X35, 0X57, 0X77, 0XFD, 0XF7, 0XFE, 0XBF, 0X7F, 0XEB, 0X55, 0XBE, 0XD0, 0XAA, 0X8A,
  0X00, 0X00, 0X29, 0XBB, 0XBE, 0XFF, 0XFF, 0XD7, 0XDB, 0XF7, 0XFD, 0X7E, 0XBB, 0X40, 0X55, 0X00,
  0X00, 0X00, 0X2A, 0XDE, 0XFF, 0XEF, 0XFB, 0X7E, 0XED, 0XBE, 0XF6, 0XAA, 0XAE, 0X80, 0XA2, 0X04,
  0X00, 0X10, 0X11, 0X2B, 0XEB, 0XFE, 0XDF, 0XEF, 0X5E, 0XFB, 0XFD, 0XDD, 0X4D, 0X00, 0X14, 0X10,
  0X00, 0X00, 0X35, 0XAE, 0XBF, 0XBB, 0XFA, 0XBB, 0XF7, 0XDF, 0XDA, 0X77, 0X40, 0X00, 0X00, 0X00,
  0X04, 0X00, 0X15, 0X55, 0XFB, 0XFF, 0XBF, 0XEE, 0XBA, 0XFB, 0XF7, 0XBA, 0X80, 0X00, 0X00, 0X00,
  0X10, 0X00, 0X0A, 0XA9, 0X5D, 0X6A, 0XE5, 0X3B, 0XDF, 0XEF, 0X7D, 0X5D, 0X40, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X15, 0XC5, 0X56, 0XB5, 0XB6, 0XD6, 0XED, 0X7F, 0XEE, 0XF6, 0X80, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X09, 0X68, 0X49, 0X4A, 0X9B, 0X59, 0X5F, 0XF7, 0XBA, 0XBA, 0X80, 0X00, 0X00, 0X00,
  0X00, 0X10, 0X15, 0XB4, 0X22, 0X51, 0X55, 0X25, 0X76, 0XDE, 0XFE, 0XED, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X08, 0XFA, 0X05, 0X6A, 0XAE, 0X90, 0X9F, 0XFB, 0XFA, 0XF4, 0X00, 0X00, 0X00, 0X00,
  0X40, 0X00, 0X0A, 0X7D, 0X4A, 0XBB, 0X7B, 0X60, 0XED, 0X7F, 0XFD, 0XBA, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X0A, 0XB7, 0X2B, 0XED, 0XDD, 0XA2, 0XBB, 0XEF, 0XD6, 0XE8, 0X00, 0X00, 0X00, 0X20,
  0X00, 0X80, 0X06, 0X7F, 0X8E, 0XBF, 0X77, 0XA2, 0XD6, 0XFB, 0XFD, 0XE0, 0X00, 0X04, 0X20, 0X80,
  0X00, 0X00, 0X05, 0X5E, 0XD7, 0XF5, 0XDE, 0XC5, 0XFD, 0XEF, 0XFB, 0X70, 0X02, 0X10, 0X00, 0X00,
  0X00, 0X00, 0X83, 0XBF, 0X9A, 0XBF, 0X76, 0X97, 0X7B, 0XFF, 0X6D, 0XC0, 0X00, 0X00, 0X00, 0X00,
  0X84, 0X00, 0X02, 0XAF, 0XCF, 0XEB, 0XDE, 0XAD, 0XFF, 0X57, 0XFB, 0XA0, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X01, 0X9F, 0X8B, 0X7D, 0X6E, 0XB7, 0XEB, 0XFF, 0XF7, 0X80, 0X10, 0X00, 0X00, 0X00,
  0X00, 0X04, 0X01, 0XDE, 0XCF, 0XD7, 0XBB, 0X5A, 0XFE, 0XEE, 0XDE, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X10, 0X00, 0X6B, 0XCF, 0X7D, 0XDE, 0X6F, 0XFD, 0XDF, 0XF6, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0XD7, 0XC7, 0XD6, 0XBD, 0X55, 0XDF, 0XFF, 0XDC, 0X00, 0X00, 0X00, 0X01, 0X02,
  0X20, 0X80, 0X00, 0X6F, 0XCD, 0XFB, 0XDA, 0XDF, 0XFF, 0XAD, 0XE8, 0X00, 0X40, 0X20, 0X08, 0X00,
  0X00, 0X00, 0X00, 0X37, 0XA7, 0X6E, 0XBD, 0X57, 0X7D, 0XFF, 0X50, 0X01, 0X00, 0X00, 0X40, 0X00,
  0X00, 0X00, 0X00, 0X37, 0XC7, 0XF6, 0XD5, 0X7E, 0XF7, 0XAF, 0XA0, 0X20, 0X00, 0X00, 0X00, 0X00,
  0X02, 0X00, 0X00, 0X1A, 0XC5, 0X5B, 0X7D, 0X5B, 0XFF, 0XFE, 0X80, 0X00, 0X00, 0X00, 0X00, 0X08,
  0X40, 0X00, 0X02, 0X1B, 0XE7, 0XF6, 0XB5, 0XFF, 0XFF, 0XBF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X0A, 0XC2, 0XEF, 0X7A, 0XB7, 0XBF, 0XF6, 0X00, 0X00, 0X00, 0X21, 0X00, 0X01,
  0X00, 0X00, 0X00, 0X0D, 0XE3, 0XB5, 0XAB, 0XFE, 0XFD, 0XBC, 0X80, 0X80, 0X00, 0X80, 0X00, 0X00,
  0X00, 0X04, 0X20, 0X05, 0X61, 0X6E, 0XF7, 0XDF, 0XFF, 0X7A, 0X02, 0X02, 0X00, 0X00, 0X00, 0X44,
  0X00, 0X20, 0X00, 0X04, 0XD1, 0XF5, 0XAA, 0XFF, 0XF7, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X02, 0X01,
  0X04, 0X00, 0X00, 0X02, 0XF0, 0XB6, 0XEF, 0XFF, 0XFE, 0XD0, 0X00, 0X00, 0X04, 0X00, 0X10, 0X11,
  0X00, 0X00, 0X00, 0X40, 0X50, 0XDB, 0XAF, 0XFB, 0XBF, 0X60, 0X00, 0X00, 0X00, 0X00, 0X80, 0X04,
  0X00, 0X00, 0X01, 0X00, 0X38, 0X6D, 0XAF, 0XEF, 0XFB, 0X80, 0X00, 0X00, 0X00, 0X04, 0X00, 0X22,
  0X00, 0X00, 0X04, 0X01, 0X2C, 0X2B, 0X5F, 0XFF, 0XED, 0X00, 0X04, 0X22, 0X20, 0X20, 0X00, 0X89,
  0X10, 0X00, 0X10, 0X00, 0X14, 0X5D, 0XBF, 0XBE, 0XFC, 0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X04,
  0X00, 0X41, 0X00, 0X00, 0X0E, 0X12, 0XBF, 0XFF, 0XD8, 0X00, 0X20, 0X00, 0X00, 0X00, 0X02, 0X51,
  0X00, 0X00, 0X00, 0X00, 0X03, 0X0A, 0X7F, 0XF7, 0X70, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X88,
  0X00, 0X00, 0X00, 0X00, 0X05, 0X01, 0XFE, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X80, 0X00, 0X48, 0X22,
  0X42, 0X04, 0X00, 0X00, 0X02, 0XC5, 0XFF, 0XFD, 0X80, 0X01, 0X00, 0X88, 0X04, 0X11, 0X02, 0X88,
  0X00, 0X00, 0X00, 0X00, 0X01, 0X7F, 0XDF, 0XEF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X40, 0X02, 0X52,
  0X10, 0X00, 0X00, 0X10, 0X80, 0XAB, 0X7B, 0XBC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0X09,
  0X00, 0X20, 0X11, 0X00, 0X00, 0X5D, 0XEE, 0XF8, 0X00, 0X08, 0X08, 0X02, 0X10, 0X00, 0X04, 0XA4,
  0X00, 0X00, 0X40, 0X00, 0X00, 0X27, 0X7B, 0XE0, 0X00, 0X00, 0X00, 0X88, 0X00, 0X00, 0XA2, 0X51,
  0X00, 0X01, 0X00, 0X00, 0X00, 0X09, 0XAD, 0X40, 0X00, 0X00, 0X00, 0X00, 0X01, 0X04, 0X19, 0X24,
  0X02, 0X00, 0X00, 0X00, 0X00, 0X02, 0X55, 0X00, 0X00, 0X40, 0X20, 0X00, 0X04, 0X11, 0X45, 0X49,
  0X08, 0X10, 0X00, 0X01, 0X08, 0X00, 0X10, 0X00, 0X01, 0X00, 0X00, 0X00, 0X40, 0X00, 0X14, 0X90,
  0X00, 0X00, 0X00, 0X08, 0X01, 0X00, 0X84, 0X00, 0X00, 0X00, 0X00, 0X44, 0X00, 0X05, 0X4A, 0X05,
  0X00, 0X00, 0X00, 0X20, 0X23, 0X02, 0XF8, 0X00, 0X00, 0X00, 0X81, 0X00, 0X00, 0X10, 0XA5, 0X68,
  0X00, 0X00, 0X00, 0X80, 0X07, 0XF0, 0X20, 0X00, 0X10, 0X00, 0X00, 0X00, 0X08, 0X85, 0X11, 0X01,
  0X00, 0X88, 0X80, 0X00, 0X87, 0XF0, 0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X80, 0X12, 0XAA, 0X48,
  0X10, 0X00, 0X04, 0X00, 0X27, 0X41, 0X80, 0X04, 0X00, 0X00, 0X00, 0X04, 0X00, 0X09, 0X15, 0X25,
  0X00, 0X00, 0X00, 0X02, 0X0C, 0X05, 0X00, 0X00, 0X00, 0X00, 0X08, 0X20, 0X04, 0XA5, 0X52, 0X90,
  0X00, 0X80, 0X00, 0X00, 0X9A, 0X42, 0X00, 0X00, 0X00, 0X01, 0X00, 0X80, 0X20, 0X29, 0X28, 0X44,
  0X02, 0X04, 0X00, 0X04, 0X10, 0X08, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0XAA, 0XA5, 0X22,
  0X08, 0X00, 0X40, 0X10, 0X31, 0X20, 0X00, 0X80, 0X00, 0X10, 0X00, 0X02, 0X02, 0X2A, 0X2A, 0XA9,
  0X00, 0X10, 0X02, 0X01, 0X20, 0X00, 0X00, 0X00, 0X00, 0X80, 0X08, 0X10, 0X04, 0XAA, 0XA4, 0X92,
  0X00, 0X00, 0X00, 0X08, 0X64, 0X80, 0X04, 0X00, 0X02, 0X00, 0X01, 0X00, 0X01, 0X55, 0X2A, 0X44,
  0X10, 0X00, 0X00, 0X22, 0X00, 0X00, 0X00, 0X00, 0X20, 0X00, 0X00, 0X00, 0X2A, 0XA4, 0XA2, 0X28,
  0X40, 0X81, 0X10, 0X80, 0X49, 0X00, 0X00, 0X00, 0X80, 0X00, 0X20, 0X24, 0X01, 0X2A, 0XA8, 0X82,
  0X00, 0X08, 0X00, 0X14, 0X00, 0X00, 0X20, 0X00, 0X00, 0X00, 0X02, 0X00, 0XAA, 0XA9, 0X4A, 0XA8,
  0X02, 0X00, 0X00, 0X40, 0X10, 0X04, 0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X02, 0X54, 0X44, 0X41
};
const unsigned char ris_2[]PROGMEM = {
  0X50, 0X00, 0X02, 0X10, 0X80, 0X08, 0X09, 0X24, 0X84, 0X81, 0X24, 0X80, 0X10, 0X00, 0X15, 0X40,
  0XA9, 0X02, 0XA8, 0XA5, 0X28, 0X24, 0X24, 0X92, 0X02, 0X51, 0X49, 0X28, 0XA5, 0X54, 0X49, 0X2A,
  0XA0, 0X00, 0X12, 0X12, 0X20, 0X12, 0X12, 0XAA, 0X85, 0X42, 0X24, 0X90, 0X08, 0X89, 0X25, 0X50,
  0X54, 0X81, 0X41, 0X48, 0X90, 0X28, 0X4A, 0X49, 0X44, 0XA1, 0X52, 0X48, 0X52, 0X20, 0X14, 0X92,
  0XA8, 0X00, 0X14, 0X25, 0X20, 0X04, 0X29, 0X25, 0X22, 0X82, 0X95, 0X24, 0X09, 0X4A, 0X45, 0X48,
  0XA2, 0X01, 0X49, 0X48, 0X90, 0X28, 0X4A, 0XAA, 0X82, 0X50, 0XA4, 0XA8, 0X52, 0X24, 0X88, 0XAA,
  0X58, 0X80, 0X22, 0X25, 0X20, 0X14, 0X29, 0X54, 0XA2, 0XA2, 0X92, 0X94, 0X08, 0X89, 0X02, 0X24,
  0XA1, 0X01, 0X14, 0X90, 0X81, 0X20, 0X4A, 0X4A, 0X82, 0X81, 0X54, 0XA2, 0X25, 0X24, 0X90, 0X52,
  0XA8, 0X00, 0X42, 0X4A, 0X50, 0X14, 0X29, 0X52, 0X42, 0X62, 0X4A, 0X48, 0X28, 0X92, 0X0F, 0XAC,
  0X52, 0X08, 0X94, 0X92, 0X82, 0X28, 0X55, 0X4A, 0XA2, 0X81, 0X55, 0X2A, 0X12, 0X4A, 0X8A, 0XDA,
  0XA8, 0X80, 0X22, 0X48, 0X40, 0X08, 0X4A, 0XAA, 0XA2, 0XA5, 0X45, 0XA4, 0X25, 0X22, 0X8D, 0X68,
  0XA2, 0X08, 0X49, 0X25, 0X44, 0X28, 0X54, 0XAA, 0X82, 0XAF, 0X28, 0XA8, 0X12, 0X40, 0X4F, 0X95,
  0X58, 0X80, 0X24, 0X95, 0X02, 0X24, 0X52, 0XAA, 0XA2, 0XB5, 0XD1, 0X64, 0X49, 0X22, 0X0D, 0XD0,
  0XA2, 0X08, 0X2A, 0X52, 0XA4, 0X14, 0X2A, 0XAA, 0XA2, 0XAE, 0XAE, 0X54, 0X2A, 0X90, 0X2A, 0X8A,
  0X50, 0X80, 0X41, 0X49, 0X02, 0X28, 0X55, 0X55, 0X42, 0XAA, 0XFF, 0XAA, 0X12, 0X42, 0XA5, 0X51,
  0X54, 0X0A, 0X14, 0X94, 0X88, 0X24, 0X55, 0X55, 0X42, 0XAB, 0XF7, 0XE8, 0X29, 0X21, 0X54, 0X48,
  0XA9, 0X00, 0X0A, 0X45, 0X06, 0X14, 0X55, 0X55, 0X62, 0XA5, 0XBE, 0XB4, 0X25, 0X40, 0X22, 0X85,
  0X50, 0X8A, 0X21, 0X29, 0X08, 0X28, 0X55, 0X55, 0X82, 0XCB, 0XFF, 0XD4, 0X2A, 0X43, 0X48, 0X50,
  0XA4, 0X00, 0X14, 0X94, 0X8A, 0X28, 0X55, 0X56, 0XA3, 0X49, 0X4C, 0XAA, 0X29, 0X20, 0X90, 0X8A,
  0X92, 0X8A, 0X0A, 0X4A, 0X14, 0X28, 0X55, 0X6A, 0XA2, 0X8B, 0X3A, 0XD4, 0X25, 0X45, 0X20, 0X20,
  0XA8, 0X01, 0X11, 0X52, 0X0A, 0X14, 0X55, 0XAA, 0XC2, 0XC9, 0X6E, 0X4A, 0X2A, 0X82, 0X94, 0X95,
  0X52, 0X8A, 0X04, 0X95, 0X14, 0X28, 0X56, 0XAD, 0X43, 0X05, 0XFF, 0XD4, 0X29, 0X44, 0X48, 0X22,
  0X54, 0X01, 0X0A, 0X48, 0X2A, 0X2C, 0X5A, 0XB6, 0XC5, 0X92, 0XD7, 0XD4, 0X25, 0X02, 0XA4, 0X49,
  0X51, 0X0A, 0X05, 0X55, 0X12, 0X28, 0X6A, 0XD5, 0X62, 0X91, 0X6E, 0XD4, 0X2A, 0X8A, 0X50, 0X12,
  0X48, 0X81, 0X08, 0X94, 0X2A, 0X14, 0X55, 0X5B, 0X43, 0X72, 0XFF, 0XB4, 0X2A, 0X85, 0X2A, 0X24,
  0XAA, 0X0A, 0X85, 0X52, 0X2A, 0X28, 0X56, 0XD5, 0XA2, 0X91, 0XCB, 0XEA, 0X2A, 0X09, 0X44, 0X11,
  0X51, 0X04, 0X42, 0X48, 0X2A, 0X2C, 0X5B, 0X5A, 0XC3, 0X72, 0XFD, 0X54, 0X2A, 0X8A, 0XA8, 0X24,
  0XA8, 0X89, 0X05, 0X28, 0X54, 0X28, 0X6A, 0XAE, 0XA2, 0XC1, 0XB7, 0XEC, 0X2A, 0X09, 0X24, 0X12,
  0XA5, 0X04, 0X82, 0XA8, 0X54, 0X28, 0X55, 0XEB, 0X43, 0X46, 0XFF, 0X34, 0X55, 0X15, 0X55, 0X14,
  0X90, 0X0A, 0X42, 0X54, 0XAA, 0X2C, 0X6E, 0XB5, 0XE5, 0XAD, 0XBD, 0XAA, 0X2A, 0X15, 0X24, 0X09,
  0X55, 0X01, 0X41, 0X50, 0X54, 0X28, 0X55, 0X5D, 0X42, 0XB7, 0XC2, 0X54, 0X2B, 0X00, 0X00, 0X24,
  0XA9, 0X0A, 0X52, 0XA8, 0XAA, 0X2C, 0X6D, 0XD6, 0XC3, 0X2F, 0XE9, 0XB6, 0X34, 0X00, 0X00, 0X12,
  0XA4, 0X89, 0X41, 0X40, 0XAD, 0X34, 0X5B, 0X6B, 0X62, 0X7B, 0XEA, 0XDA, 0X2A, 0X00, 0X00, 0X09,
  0X52, 0X05, 0X21, 0X31, 0X54, 0X14, 0X6D, 0XBD, 0XA1, 0X5F, 0XB6, 0XAA, 0X2C, 0X36, 0XED, 0X0A,
  0X54, 0X88, 0XA0, 0XA1, 0X6A, 0X34, 0X56, 0XD6, 0XC5, 0X6F, 0XE9, 0XB4, 0X34, 0X55, 0X2A, 0X85,
  0X22, 0X05, 0X51, 0X51, 0X56, 0X28, 0X7B, 0X6B, 0X62, 0XBD, 0XB7, 0X5A, 0X2A, 0X2A, 0XA5, 0X08,
  0XD4, 0X8A, 0X48, 0XA2, 0XAA, 0X2C, 0X55, 0XBD, 0X95, 0XAF, 0XDF, 0XEC, 0X2C, 0X55, 0X54, 0X85,
  0XF2, 0X05, 0X28, 0XA1, 0X6C, 0X34, 0X6E, 0XD6, 0XCE, 0XBF, 0X75, 0XB4, 0X54, 0X55, 0X55, 0X0A,
  0XB9, 0X09, 0X50, 0X42, 0XAA, 0X2C, 0X5B, 0X6D, 0X2B, 0X2D, 0XAF, 0XEC, 0X58, 0X55, 0X55, 0X41,
  0X7A, 0X85, 0X48, 0X43, 0X5A, 0X34, 0X6D, 0XB6, 0X9D, 0X7F, 0XFF, 0XB4, 0X6C, 0X5A, 0XAA, 0X85,
  0X28, 0X0A, 0X54, 0X45, 0X6C, 0X2A, 0X36, 0XDC, 0X6B, 0X2E, 0XAB, 0XEC, 0X28, 0XAA, 0XA9, 0X44,
  0XF2, 0X89, 0X54, 0X45, 0X56, 0X34, 0X3B, 0X75, 0X5E, 0X7B, 0XFE, 0XE8, 0X68, 0XAB, 0X55, 0X02,
  0XF5, 0X05, 0X28, 0X05, 0XB4, 0X2E, 0X2D, 0XD9, 0X76, 0X5E, 0XAF, 0XB4, 0XB0, 0XB5, 0X55, 0X45,
  0XB8, 0X8A, 0XAA, 0X0A, 0XAA, 0X35, 0X17, 0X65, 0XBD, 0X77, 0X7A, 0XD8, 0XD8, 0XD5, 0X55, 0X40,
  0XF5, 0X04, 0XAA, 0X0A, 0XDE, 0X2E, 0X1A, 0XD5, 0X6E, 0X5D, 0XDF, 0XA0, 0XA9, 0X5B, 0X55, 0X43,
  0X59, 0X0A, 0XA4, 0X0B, 0X6A, 0X35, 0X87, 0X66, 0XFA, 0X77, 0X75, 0XD1, 0XD0, 0XAA, 0XAA, 0XA1,
  0XF4, 0X8A, 0X9A, 0X0A, 0XAA, 0X2E, 0X81, 0X97, 0XBC, 0XBD, 0XDE, 0X82, 0XB1, 0XDA, 0XD5, 0X52,
  0X72, 0X04, 0XAA, 0X16, 0XDC, 0X35, 0XC0, 0X15, 0XEC, 0XEE, 0XF7, 0X07, 0X61, 0X6B, 0X5A, 0XA1,
  0X1A, 0X8A, 0XAB, 0X1A, 0XAA, 0X2E, 0XF0, 0X2F, 0X7A, 0X7B, 0X5B, 0X1A, 0XD1, 0XAD, 0X55, 0X50,
  0X54, 0X8A, 0XAA, 0X95, 0XB6, 0XB7, 0X5E, 0X5B, 0XD8, 0XB7, 0X76, 0XF7, 0X65, 0X55, 0X55, 0X45,
  0XFA, 0X54, 0XAA, 0X6A, 0XAD, 0X5A, 0XE9, 0X2F, 0X75, 0X7D, 0XDD, 0XAD, 0XBB, 0XB6, 0XD5, 0X5A,
  0XD1, 0X52, 0XAA, 0XAD, 0XDB, 0XED, 0XBA, 0X5D, 0XDC, 0XDB, 0X76, 0XF6, 0XD6, 0XDB, 0X5A, 0XA4,
  0XFA, 0X95, 0X55, 0XB6, 0X6D, 0X5B, 0X64, 0XB7, 0XF0, 0XFD, 0XED, 0X5B, 0X7A, 0XAA, 0XAA, 0XAA,
  0XDA, 0X55, 0X55, 0X55, 0XB6, 0XEE, 0XD2, 0X5E, 0XAD, 0X57, 0XDE, 0XED, 0XAD, 0XDB, 0X6A, 0XAA,
  0XE9, 0X4A, 0XAA, 0XAA, 0XDB, 0X5B, 0XAD, 0XB7, 0XF0, 0XFA, 0XEB, 0XB6, 0XD6, 0XB5, 0X55, 0X55,
  0XBA, 0XA9, 0X55, 0XB7, 0X55, 0XB6, 0XB6, 0XDA, 0X89, 0X6F, 0X5D, 0X6F, 0X7B, 0X6D, 0XAD, 0X54,
  0XF4, 0X55, 0X56, 0XAA, 0XEE, 0XDA, 0XAD, 0X6F, 0XE1, 0XF9, 0XD6, 0XDA, 0XD6, 0XD6, 0XD5, 0XAB,
  0X5A, 0XA5, 0X55, 0X5D, 0X5B, 0X75, 0XFF, 0XB5, 0X41, 0X5A, 0XBB, 0XB7, 0X6D, 0XBA, 0XB6, 0XA9,
  0X52, 0X95, 0X55, 0X6B, 0X6D, 0XAA, 0XAA, 0XDF, 0X82, 0XF5, 0X56, 0XED, 0XB6, 0XAB, 0X55, 0X55,
  0X49, 0X55, 0X55, 0XAD, 0XB6, 0XAB, 0XFF, 0XB5, 0X51, 0XB8, 0X5B, 0X76, 0XDA, 0XD5, 0XAA, 0XAA,
  0XAA, 0X55, 0X56, 0XB5, 0X5A, 0XAE, 0XDD, 0XEE, 0XC2, 0XE9, 0X77, 0XAB, 0X6D, 0XBE, 0X6D, 0X55,
  0X55, 0X4A, 0XAA, 0XD6, 0XEC, 0XAB, 0XFF, 0X75, 0X41, 0XD9, 0X5D, 0X6D, 0XAA, 0XA1, 0X92, 0XAA,
  0XA9, 0X2A, 0XAA, 0XAB, 0X52, 0XB7, 0XEB, 0XDB, 0X02, 0XF3, 0X77, 0XAA, 0XAA, 0XAD, 0X49, 0X55,
  0X54, 0XAA, 0XAD, 0X75, 0XB2, 0XAE, 0XDE, 0XE8, 0X81, 0XDA, 0XED, 0X76, 0XED, 0X56, 0XB6, 0XB5,
  0X4A, 0XA9, 0X55, 0X9E, 0XC9, 0X5B, 0XFB, 0X50, 0X12, 0XFB, 0XB7, 0XDB, 0X55, 0XAA, 0XAA, 0XD5,
  0X52, 0X55, 0X56, 0XE5, 0X45, 0X6F, 0XAE, 0XCA, 0X09, 0XDE, 0XED, 0X6D, 0X54, 0XD4, 0XAD, 0X55,
  0X55, 0X4A, 0XAA, 0XBB, 0XA2, 0XBE, 0XF5, 0X74, 0X2A, 0XF5, 0XFB, 0XBE, 0XAF, 0X5B, 0X55, 0X55,
  0X49, 0X2A, 0XB5, 0X4D, 0X09, 0X57, 0XAB, 0X50, 0X78, 0XB7, 0X56, 0XEB, 0XF5, 0XB5, 0XB6, 0XAA,
  0XAA, 0XAA, 0XAB, 0X75, 0X84, 0XBE, 0XD5, 0X49, 0XDA, 0XF5, 0XEF, 0X5D, 0X5A, 0XDA, 0XDA, 0XD5,
  0X54, 0XAA, 0XAD, 0XAE, 0X22, 0XAB, 0XAA, 0XA3, 0X69, 0XB7, 0X5B, 0XEB, 0XAF, 0X6F, 0X55, 0X55,
  0X52, 0XAA, 0XAA, 0XB5, 0X09, 0X5F, 0XE9, 0X0F, 0XFC, 0XDB, 0XFD, 0X7D, 0X69, 0X22, 0XB6, 0XAA,
  0X95, 0X4A, 0XB5, 0X57, 0X22, 0X5B, 0X74, 0X3D, 0X55, 0X6A, 0XAB, 0XAB, 0XAD, 0X5A, 0XD5, 0XB5,
  0X54, 0XAA, 0XAB, 0X6A, 0X04, 0XAF, 0XDD, 0XEF, 0XF9, 0XF7, 0XBE, 0XEE, 0XD5, 0XAD, 0X5A, 0XAA,
  0XAA, 0X55, 0X55, 0XBB, 0X00, 0X55, 0XFA, 0XB5, 0X55, 0X53, 0X6B, 0X55, 0X5A, 0XD2, 0XA5, 0X55,
  0X52, 0XAA, 0XAD, 0X56, 0X92, 0X8B, 0X7F, 0XBF, 0XBC, 0XED, 0XDD, 0XD6, 0XAA, 0XAA, 0X95, 0X6A,
  0X95, 0X4A, 0XAA, 0XDB, 0X00, 0X2B, 0XDA, 0XD5, 0X6D, 0XA7, 0X77, 0X55, 0X56, 0XD5, 0X6A, 0XAB,
  0X49, 0X2A, 0XB5, 0X6A, 0X85, 0X15, 0X7F, 0XEF, 0XF4, 0XED, 0XBB, 0XFB, 0X6A, 0XAD, 0X55, 0X55,
  0X2A, 0XAA, 0XAB, 0X5B, 0X40, 0X45, 0XB7, 0X6A, 0XBD, 0X56, 0XDD, 0X55, 0XAB, 0X55, 0X5B, 0X6A,
  0XA9, 0X55, 0X55, 0XAD, 0X88, 0X12, 0XDF, 0XF5, 0XD5, 0XCD, 0XEF, 0XBD, 0X5D, 0X2A, 0XAD, 0X55,
  0X4A, 0X4A, 0XAD, 0X6A, 0XC1, 0X44, 0XBB, 0XBC, 0XFC, 0XAD, 0X75, 0X6D, 0XD5, 0XDD, 0XAA, 0XAA,
  0XA9, 0X55, 0X55, 0XB7, 0X60, 0X09, 0X56, 0XF7, 0X2D, 0X6F, 0XAF, 0XDA, 0XAA, 0X54, 0XB6, 0XDB,
  0X4A, 0XAA, 0XAA, 0XAA, 0XD8, 0X21, 0X5F, 0XFE, 0XB6, 0XD5, 0XFA, 0XBE, 0XAB, 0X55, 0X55, 0X55,
  0X29, 0X2A, 0XB6, 0XDD, 0XB4, 0X84, 0X2B, 0X7F, 0XDC, 0XDB, 0X5F, 0XEB, 0X6D, 0XAA, 0XAD, 0XAA,
  0X95, 0X52, 0XAA, 0XAB, 0X6E, 0X01, 0X55, 0XED, 0XAA, 0XDD, 0XEA, 0XBD, 0XB6, 0XDB, 0X6A, 0XB5,
  0X52, 0XAA, 0XAB, 0X6D, 0XB5, 0X08, 0X2B, 0X7F, 0XE6, 0XF6, 0XBD, 0XD5, 0X55, 0X51, 0X2D, 0X55,
  0X4A, 0X4A, 0XAD, 0X56, 0XDE, 0XA1, 0X0A, 0XDF, 0XFA, 0XB5, 0XEB, 0X7B, 0X55, 0X55, 0XAB, 0X55,
  0X55, 0X2A, 0XAA, 0XB5, 0X6B, 0XC0, 0X52, 0XF5, 0XBA, 0XD7, 0X7E, 0XD7, 0XBB, 0XBE, 0XB5, 0XAA,
  0XA9, 0X55, 0X55, 0XAD, 0XB5, 0X70, 0X0A, 0X9F, 0XEC, 0XE9, 0XAB, 0XBA, 0XAC, 0XA5, 0X4A, 0XB5,
  0X54, 0XAA, 0XAA, 0XB6, 0XDE, 0XDC, 0X81, 0X6B, 0X7F, 0X7B, 0XFD, 0XE5, 0X52, 0X9A, 0XAA, 0XAA,
  0XAA, 0X95, 0X55, 0X55, 0X6B, 0X6A, 0X14, 0X9D, 0XFE, 0XB6, 0XAB, 0X5B, 0XB7, 0X6A, 0XAA, 0XD5,
  0X52, 0X52, 0XAD, 0XB7, 0X5B, 0XBF, 0X42, 0X57, 0X6F, 0XBD, 0XFE, 0XED, 0X6D, 0XBB, 0X6D, 0X55,
  0X55, 0X4A, 0XAA, 0XAA, 0XED, 0X6A, 0XC0, 0XAA, 0XFB, 0XDE, 0XAB, 0XBB, 0XB5, 0X55, 0XAA, 0XAA,
  0XA8, 0XAA, 0XAA, 0XDB, 0X56, 0XDD, 0XB8, 0X0B, 0X5F, 0X6B, 0XF6, 0XDE, 0XDE, 0XEE, 0XB6, 0XD5,
  0X55, 0X2A, 0X55, 0X55, 0X7B, 0X6B, 0XED, 0X25, 0XED, 0XFE, 0XAF, 0X6B, 0X6B, 0X5A, 0XD5, 0X55,
  0X52, 0XA5, 0X55, 0X5B, 0XAD, 0XBD, 0X5E, 0X85, 0X5F, 0XD6, 0XFA, 0XFB, 0XB5, 0XB5, 0X5A, 0XAA,
  0XA9, 0X2A, 0X04, 0XA4, 0X2A, 0X07, 0XB5, 0X41, 0X76, 0XFB, 0XAF, 0X84, 0X5E, 0XA2, 0XD4, 0XAA,
  0XAA, 0XA8, 0XF0, 0XD8, 0XDB, 0X1A, 0XEE, 0X70, 0XAF, 0XBB, 0XDA, 0XBB, 0XAB, 0X41, 0X56, 0XAA,
  0XA8, 0X92, 0X8C, 0XA8, 0X55, 0X1D, 0XBA, 0X6A, 0X35, 0X6A, 0XBD, 0X2E, 0X8D, 0XE0, 0XB4, 0XAA,
  0XA5, 0X41, 0X54, 0XA8, 0X6E, 0X16, 0XD4, 0X3C, 0X17, 0XFB, 0XEA, 0X75, 0XC6, 0XA8, 0X54, 0XAA,
  0XAA, 0X52, 0XAA, 0XA8, 0XB5, 0X1B, 0X7C, 0X57, 0X0A, 0XDB, 0X5C, 0X5E, 0XA3, 0X50, 0X6A, 0XAA,
  0XA9, 0X21, 0X54, 0XA8, 0X57, 0X16, 0XD4, 0X3A, 0X83, 0XF5, 0X68, 0X6B, 0X42, 0XCC, 0X2C, 0XAA,
  0XAA, 0X90, 0X95, 0X54, 0XB5, 0X1B, 0X6A, 0X1F, 0XC5, 0XBA, 0XB8, 0XB5, 0XE3, 0X6A, 0X16, 0XAA,
  0XA4, 0X50, 0X2A, 0XB0, 0X5A, 0X0D, 0XBA, 0X2A, 0X96, 0XEC, 0XE8, 0XDE, 0XA1, 0X54, 0X14, 0XAA,
  0XA9, 0X48, 0X02, 0XA8, 0XAD, 0X16, 0XD3, 0X1B, 0XCB, 0XF5, 0XB0, 0X6B, 0X41, 0XAB, 0X0A, 0XAA,
  0XAA, 0X50, 0X01, 0X54, 0X00, 0X1B, 0X6D, 0X0D, 0X17, 0X5B, 0X50, 0XB5, 0XE1, 0X55, 0X0A, 0X55,
  0X51, 0X2A, 0X00, 0X50, 0XFF, 0X15, 0XB6, 0X0E, 0XAD, 0XE9, 0XF0, 0XDE, 0XA1, 0XAA, 0X84, 0XA9,
  0X2A, 0X89, 0XA0, 0X58, 0X12, 0X1A, 0XD5, 0X8B, 0X37, 0XB4, 0XA8, 0X6A, 0XA1, 0X4D, 0X02, 0XA5,
  0X51, 0X54, 0X50, 0X48, 0XD5, 0X0E, 0XAB, 0X0C, 0X5E, 0XE8, 0X70, 0XB6, 0XC1, 0X6A, 0XC2, 0X55,
  0X54, 0X23, 0X2C, 0X50, 0X5A, 0X15, 0XA4, 0X86, 0X57, 0XB4, 0X58, 0X5B, 0X62, 0XAA, 0XA0, 0XAA,
  0XAA, 0X94, 0XA2, 0X58, 0X55, 0X1A, 0XDB, 0X44, 0XBD, 0XD4, 0X68, 0XD5, 0XA3, 0X4A, 0XA0, 0XA9,
  0X51, 0X42, 0X54, 0X24, 0XAB, 0X0B, 0X4D, 0X80, 0XAF, 0X68, 0X5C, 0X6D, 0X42, 0XAA, 0XA0, 0X95,
  0X54, 0X25, 0X2A, 0XA8, 0X55, 0X1A, 0XB5, 0X42, 0X7B, 0XB4, 0X6A, 0X36, 0X85, 0X6A, 0XA8, 0X52,
  0X49, 0X40, 0X90, 0X50, 0X55, 0X0B, 0X56, 0XE1, 0X5D, 0XA8, 0X2A, 0X55, 0XCD, 0XA5, 0X50, 0XA9,
  0X52, 0X22, 0X49, 0X48, 0X55, 0X15, 0X55, 0X40, 0XB7, 0X6C, 0X76, 0X2A, 0X15, 0X4A, 0XA8, 0X4A,
  0XA9, 0X44, 0XA2, 0XA0, 0X28, 0X0A, 0X0B, 0X22, 0XDD, 0XB4, 0X0B, 0X8D, 0X55, 0X25, 0X54, 0XA9,
  0X54, 0X29, 0X0A, 0X4A, 0X96, 0XA5, 0X55, 0XB8, 0XBE, 0XD5, 0X5D, 0X51, 0X24, 0X92, 0XAA, 0X95,
  0X49, 0X44, 0X52, 0X92, 0X10, 0X28, 0XA1, 0X52, 0XEB, 0X5A, 0X15, 0X4A, 0X82, 0XA2, 0X92, 0X49,
  0X24, 0X22, 0X89, 0X15, 0X14, 0XA8, 0XAA, 0XA1, 0X5E, 0XD4, 0X0A, 0XEA, 0XC5, 0X51, 0X55, 0X54,
  0XB2, 0X94, 0X54, 0X49, 0X4A, 0XA8, 0X51, 0X62, 0XFB, 0X6E, 0X8B, 0X2B, 0X42, 0XAA, 0X49, 0X22,
  0XA8, 0X42, 0X92, 0X25, 0X54, 0XA8, 0XAA, 0X81, 0X5D, 0X52, 0X05, 0XA5, 0X42, 0XA1, 0X54, 0X95,
  0X4A, 0X29, 0X24, 0X2A, 0X89, 0X50, 0XB5, 0X45, 0XB6, 0X2D, 0X82, 0XAA, 0X85, 0X55, 0X52, 0XA8,
  0XA1, 0X44, 0X92, 0X12, 0X55, 0X50, 0XAA, 0X82, 0XFB, 0X34, 0XA2, 0XAA, 0XA2, 0X94, 0X8A, 0X45,
  0X58, 0X12, 0X48, 0X09, 0X4A, 0X48, 0XAA, 0X82, 0XAC, 0X16, 0X81, 0X4A, 0X82, 0X52, 0XA9, 0X2A,
  0XA5, 0X48, 0X92, 0X00, 0XA9, 0X50, 0X55, 0X02, 0XF6, 0X14, 0XE1, 0X65, 0X42, 0X8A, 0X55, 0X50,
  0X90, 0X22, 0X25, 0X00, 0X15, 0X50, 0XAA, 0X05, 0XB4, 0X14, 0X90, 0X8A, 0XA1, 0X29, 0X44, 0X8A,
  0XAA, 0X89, 0X48, 0X80, 0X09, 0X28, 0XAA, 0X82, 0XEE, 0X16, 0X68, 0X6A, 0X84, 0X15, 0X2A, 0X52,
  0X50, 0X44, 0X12, 0X50, 0X05, 0X48, 0X52, 0X05, 0XB4, 0X14, 0XA8, 0X25, 0X42, 0X89, 0X51, 0X25,
  0X55, 0X29, 0X44, 0X95, 0X0A, 0X50, 0XAA, 0X86, 0XEA, 0X15, 0X50, 0X0A, 0X42, 0XA4, 0X8A, 0X90,
  0XA0, 0X02, 0X29, 0X24, 0X85, 0X28, 0X4A, 0X83, 0X5A, 0X14, 0XAC, 0X29, 0X42, 0X55, 0X24, 0X4A,
  0XAA, 0XA8, 0X82, 0X49, 0X08, 0XA0, 0XA9, 0X0D, 0XEA, 0X2A, 0X52, 0X05, 0X01, 0X20, 0XA9, 0X21,
  0X50, 0X02, 0X28, 0X24, 0X85, 0X50, 0X55, 0X45, 0X54, 0X2A, 0XAA, 0X0A, 0XC5, 0X55, 0X12, 0X4A,
  0X4A, 0XA8, 0X84, 0X92, 0X52, 0X08, 0X8A, 0X4B, 0XD8, 0X52, 0X49, 0X09, 0X01, 0X08, 0XA4, 0X91,
  0X28, 0X02, 0X50, 0X49, 0X09, 0X60, 0X51, 0X4A, 0XA8, 0X94, 0XA5, 0X04, 0XA2, 0X51, 0X11, 0X08,
  0XA1, 0X28, 0X0A, 0X04, 0X92, 0X10, 0XAA, 0X97, 0XD4, 0X52, 0X54, 0X8A, 0X41, 0X40, 0X88, 0X45,
  0X54, 0X02, 0XA0, 0X28, 0X09, 0X48, 0X14, 0X0A, 0XA1, 0X48, 0X92, 0X42, 0X82, 0X21, 0X25, 0X20,
  0X90, 0XA0, 0X08, 0X81, 0X52, 0X42, 0XA2, 0X97, 0X6A, 0XA5, 0X29, 0X08, 0X10, 0X88, 0X90, 0X94,
  0XA9, 0X0A, 0XA2, 0X24, 0X09, 0X28, 0X4A, 0X89, 0X89, 0X14, 0X85, 0X65, 0X4A, 0X24, 0X44, 0X02,
  0XA0, 0X20, 0X08, 0X89, 0X50, 0X95, 0X24, 0X56, 0X64, 0XAA, 0X54, 0X94, 0XA1, 0X49, 0X12, 0XA8,
  0X9A, 0X09, 0X22, 0X22, 0X25, 0X22, 0X92, 0X8A, 0XAA, 0XA2, 0XAA, 0X4A, 0X4C, 0X92, 0X48, 0X44,
  0XA0, 0XA0, 0X88, 0X91, 0X48, 0X94, 0X54, 0X5A, 0XD5, 0X2A, 0XA5, 0X51, 0X22, 0X49, 0X25, 0X22,
  0X94, 0X0A, 0X22, 0X4A, 0X12, 0X4A, 0XA9, 0XAE, 0X52, 0XAA, 0X55, 0X56, 0XAA, 0XA5, 0X52, 0X94,
  0XA9, 0X20, 0X89, 0X11, 0X4A, 0XA5, 0X22, 0XDA, 0X95, 0X55, 0XAA, 0XA9, 0X55, 0X55, 0X4A, 0X52,
  0X90, 0X44, 0X24, 0X48, 0XA4, 0X94, 0XA9, 0XAD, 0X6D, 0X55, 0X55, 0X56, 0XAA, 0XAA, 0XAA, 0XAA,
  0XA9, 0X12, 0X89, 0X25, 0X12, 0X55, 0X50, 0X06, 0X96, 0XED, 0X6A, 0XAA, 0XAD, 0X55, 0X55, 0X55,
  0X44, 0X00, 0X20, 0X92, 0X55, 0X55, 0X50, 0X05, 0X5B, 0X56, 0XB6, 0XDA, 0XB5, 0XBA, 0XDB, 0X6D,
  0X30, 0XAA, 0X8A, 0X49, 0X4A, 0XAA, 0XA0, 0X0E, 0XAD, 0XAD, 0XDB, 0X6D, 0XAE, 0XD5, 0XB6, 0XB6,
  0X92, 0X00, 0X21, 0X12, 0X29, 0X55, 0X58, 0X05, 0X76, 0XEB, 0X5D, 0X56, 0XB5, 0X7B, 0X6D, 0XDB,
  0X50, 0X55, 0X14, 0X49, 0X55, 0X2A, 0XD0, 0X02, 0X9F, 0XB9, 0XD6, 0XED, 0XB7, 0X96, 0XFB, 0X77,
  0X4A, 0X70, 0XA2, 0X92, 0X44, 0XAA, 0XB9, 0X15, 0X4A, 0XEE, 0XDE, 0XB5, 0XF5, 0XDB, 0XAF, 0XDD,
  0X28, 0X8A, 0X08, 0X49, 0X2A, 0XAA, 0XAA, 0X9D, 0X7F, 0XBD, 0XEB, 0XDF, 0X55, 0X77, 0XFD, 0XFF,
  0XA5, 0X25, 0X65, 0X24, 0X91, 0X2A, 0XA9, 0X03, 0X0D, 0XDF, 0X6E, 0XDA, 0XEF, 0XB5, 0XB7, 0X6B,
  0X2A, 0X94, 0X9A, 0XD5, 0X55, 0X4A, 0XAA, 0XC2, 0X6F, 0XF7, 0XFF, 0XFB, 0XBD, 0XFF, 0XFF, 0XFF,
  0X56, 0XEB, 0X56, 0XB6, 0XDA, 0XB5, 0X53, 0X03, 0X57, 0XFF, 0XDE, 0XDF, 0XFF, 0XB7, 0XFF, 0XFF,
  0X56, 0XA5, 0XDD, 0XDD, 0XB7, 0X55, 0X59, 0X61, 0XA9, 0XBD, 0X7B, 0XFD, 0XED, 0XFD, 0X5B, 0X6F,
  0X57, 0XE9, 0XDF, 0XFF, 0XFA, 0XEA, 0XA5, 0X61, 0X40, 0X3F, 0XF7, 0X56, 0XB7, 0XAF, 0XEF, 0XFF,
  0X56, 0X2C, 0X77, 0X77, 0X6F, 0XB5, 0X40, 0X00, 0X01, 0X07, 0XFD, 0XFF, 0XDE, 0XF5, 0X7F, 0XFF,
  0X57, 0XEF, 0X1F, 0XFF, 0XFF, 0XFD, 0X51, 0X20, 0X28, 0X0B, 0XFF, 0XDB, 0XFF, 0XFF, 0XFF, 0XFF,
  0X4F, 0XDD, 0XDF, 0XFD, 0XFF, 0XD6, 0X84, 0X10, 0X00, 0X1F, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB,
  0X57, 0X7B, 0XDE, 0XDF, 0XFD, 0XFF, 0XFB, 0XA4, 0X95, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XF7, 0XDF,
  0X5F, 0XF7, 0XDF, 0XFF, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0XFF, 0XFF, 0XFF
};
const unsigned char ris_3[]PROGMEM = {
  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0,
  0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0,
  0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X80, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0XFF, 0XC1, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XFF, 0X83, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XFF, 0X0F, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XFE, 0X1F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X03, 0XFC, 0X3F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X03, 0XF8, 0X7F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0XF0, 0XFF, 0XFF, 0X01, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0XE1, 0XFF, 0XFC, 0X07, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0XC3, 0XFF, 0XF8, 0X0F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0X83, 0XFF, 0XF0, 0X3F, 0XFF, 0X00, 0X00, 0X03, 0XE0, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0X07, 0XFF, 0XC0, 0X7F, 0XFE, 0X00, 0X80, 0X1F, 0XFC, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0X0F, 0XFF, 0X81, 0XFF, 0XFC, 0X07, 0XF8, 0X7F, 0XFF, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X06, 0X1F, 0XFF, 0X03, 0XFF, 0XF8, 0X1F, 0XF8, 0XFF, 0XFF, 0X80, 0X7C, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X3F, 0XFE, 0X07, 0XFF, 0XF0, 0X3F, 0XF0, 0XFF, 0XFF, 0XC0, 0X7E, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X7F, 0XF8, 0X1F, 0XFF, 0XE0, 0X7F, 0XF1, 0XFF, 0X7F, 0XC0, 0X7E, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X7F, 0XF0, 0X3F, 0XFF, 0XC0, 0XFF, 0XE1, 0XF8, 0X0F, 0XE0, 0X7F, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0XFF, 0XE0, 0X7F, 0XFF, 0X83, 0XFF, 0XE3, 0XF0, 0X03, 0XE0, 0X7F, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XFF, 0XC0, 0XFF, 0XFF, 0X07, 0XFF, 0XC3, 0XF0, 0X03, 0XF0, 0X7F, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XFE, 0X01, 0XFF, 0XFE, 0X0F, 0XFF, 0X87, 0XE3, 0XE1, 0XF8, 0X3F, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X7F, 0XF8, 0X3F, 0XFF, 0X87, 0XE7, 0XF0, 0XFC, 0X3F, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X1F, 0XE0, 0X7F, 0XFF, 0X0F, 0XCF, 0XF8, 0XFF, 0XFF, 0X01, 0XC0,
  0X03, 0X80, 0X03, 0XFE, 0X00, 0X00, 0X00, 0XFF, 0XFE, 0X0F, 0XCF, 0XF8, 0X7F, 0XFF, 0X01, 0XC0,
  0X03, 0X80, 0X0F, 0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XFE, 0X1F, 0XCF, 0XF8, 0X3F, 0XFE, 0X01, 0XC0,
  0X03, 0X80, 0X1F, 0XFF, 0XFF, 0X80, 0X03, 0XFF, 0XFC, 0X1F, 0XCF, 0XFC, 0X1F, 0XFC, 0X01, 0XC0,
  0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XF0, 0X03, 0XFF, 0XF8, 0X3F, 0X8F, 0XFC, 0X07, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XFE, 0X01, 0XFF, 0XF8, 0X3F, 0X87, 0XFE, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XF0, 0X7F, 0X87, 0XFF, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XE0, 0XFF, 0X87, 0XFF, 0X80, 0X1F, 0X01, 0XC0,
  0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XFF, 0XF8, 0X0F, 0XE0, 0XFF, 0X07, 0XFF, 0XC0, 0X7F, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X01, 0XFF, 0X07, 0XFF, 0XE0, 0X7F, 0X81, 0XC0,
  0X03, 0X80, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0XFE, 0X07, 0XFF, 0XF0, 0X7F, 0X81, 0XC0,
  0X03, 0X80, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X3C, 0X07, 0XFF, 0XF0, 0XFF, 0X81, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X07, 0XFF, 0XF0, 0XFF, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0X80, 0X00, 0X0F, 0XFF, 0XF0, 0XFF, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFE, 0X0F, 0X0F, 0XFF, 0XE0, 0X7F, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X3F, 0XF0, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XE0, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X7F, 0XFF, 0X80, 0X1F, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XC0, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X7F, 0XFF, 0XF8, 0X03, 0XFF, 0XFF, 0XFF, 0XC3, 0XFF, 0X80, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X7F, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XC0, 0XFC, 0X02, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0XFF, 0XFF, 0XFF, 0XE0, 0X07, 0XFF, 0XFF, 0XC0, 0X00, 0X0F, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X1F, 0XFF, 0X80, 0X00, 0X1F, 0X80, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0X80, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0XFF, 0X80, 0X7F, 0XFF, 0XF0, 0X00, 0X00, 0X07, 0X0F, 0X8F, 0XC0, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XFC, 0X00, 0X1F, 0XFF, 0XFC, 0X03, 0XF8, 0X07, 0X8F, 0X8F, 0XE0, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XF8, 0X00, 0X07, 0XFF, 0XFC, 0X0F, 0XFE, 0X07, 0X8F, 0XC7, 0XF0, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XF1, 0X80, 0X01, 0XFF, 0XFC, 0X1F, 0XFF, 0X07, 0X8F, 0XC7, 0XF0, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XF1, 0XF0, 0XF0, 0XFF, 0XFC, 0X3F, 0XFF, 0X87, 0X87, 0XC7, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X03, 0XE1, 0XE3, 0XFC, 0X7F, 0XF8, 0X7E, 0X3F, 0X87, 0X87, 0XE3, 0XFC, 0X01, 0XC0,
  0X03, 0X80, 0X03, 0XE1, 0XE7, 0XFE, 0X1F, 0XF8, 0X7C, 0X1F, 0X87, 0XC7, 0XE3, 0XFC, 0X01, 0XC0,
  0X03, 0X80, 0X03, 0XE3, 0XE7, 0XFE, 0X03, 0XE0, 0X7E, 0X0F, 0X87, 0XC7, 0XE3, 0XFE, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0XE3, 0XC7, 0XFE, 0X00, 0X00, 0X7E, 0X0F, 0X87, 0XC7, 0XE1, 0XFE, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0XE3, 0XC7, 0XFE, 0X00, 0X00, 0X3F, 0X0F, 0X87, 0XC7, 0XF1, 0XFF, 0X01, 0XC0,
  0X03, 0X80, 0X07, 0XE3, 0XE0, 0XFE, 0X00, 0X00, 0X3F, 0X0F, 0X87, 0XC3, 0XF0, 0XFF, 0X81, 0XC0,
  0X03, 0X80, 0X0F, 0XE1, 0XE0, 0X7C, 0X00, 0X00, 0X00, 0X1F, 0X87, 0XC3, 0XF0, 0XFF, 0X81, 0XC0,
  0X03, 0X80, 0X1F, 0XE1, 0XF0, 0X7C, 0X0F, 0XE0, 0X00, 0X3F, 0X07, 0XE3, 0XF0, 0XFF, 0X81, 0XC0,
  0X03, 0X80, 0X1F, 0XF1, 0XFF, 0XF8, 0X3F, 0XF8, 0X00, 0XFF, 0X07, 0XE3, 0XF8, 0XFF, 0XC1, 0XC0,
  0X03, 0X80, 0X3F, 0XF0, 0XFF, 0XF0, 0X7F, 0XF8, 0X03, 0XFE, 0X07, 0XE3, 0XF8, 0X7F, 0XC1, 0XC0,
  0X03, 0X80, 0X7F, 0XF8, 0X7F, 0XC1, 0XFF, 0XF8, 0X07, 0XFE, 0X07, 0XE3, 0XF8, 0X7F, 0XC1, 0XC0,
  0X03, 0X80, 0XFF, 0XFC, 0X1F, 0X03, 0XFF, 0XF0, 0X0F, 0XFC, 0X07, 0XE1, 0XFC, 0X7F, 0XE1, 0XC0,
  0X03, 0X81, 0XFF, 0XFE, 0X00, 0X0F, 0XFF, 0XF0, 0X1F, 0XF8, 0X03, 0XE1, 0XFC, 0X3F, 0XE1, 0XC0,
  0X03, 0X81, 0XFF, 0XFF, 0X80, 0X3F, 0XFF, 0XF0, 0X1F, 0XF8, 0X03, 0XE1, 0XFC, 0X3F, 0XE1, 0XC0,
  0X03, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XF0, 0X03, 0XF1, 0XFE, 0X3F, 0XE1, 0XC0,
  0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X03, 0XF1, 0XFE, 0X1F, 0XC1, 0XC0,
  0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X03, 0XF1, 0XFE, 0X1F, 0XC1, 0XC0,
  0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X3F, 0X00, 0X03, 0XF0, 0XFF, 0X0F, 0X81, 0XC0,
  0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0X03, 0XF0, 0XFF, 0X07, 0X01, 0XC0,
  0X03, 0X83, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, 0X83, 0XF0, 0XFF, 0X00, 0X01, 0XC0,
  0X03, 0X83, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X83, 0XF0, 0XFF, 0X80, 0X01, 0XC0,
  0X03, 0X87, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X83, 0XF8, 0XFF, 0X80, 0X01, 0XC0,
  0X03, 0X87, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0XC3, 0XF8, 0XFF, 0X80, 0X01, 0XC0,
  0X03, 0X87, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0,
  0X03, 0X87, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0X8F, 0XF0, 0X3F, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0,
  0X03, 0X87, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0X8F, 0XF0, 0X3F, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0,
  0X03, 0X87, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0X8F, 0XE0, 0X1F, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0,
  0X03, 0X87, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0X8F, 0XE0, 0X3F, 0XC3, 0XF8, 0X7F, 0XE0, 0X01, 0XC0,
  0X03, 0X80, 0X78, 0X00, 0X7F, 0XFF, 0XFF, 0X8F, 0XE0, 0X3F, 0XC3, 0XF8, 0X7F, 0XE0, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0X87, 0XF0, 0X7F, 0XC3, 0XF8, 0X3F, 0XE0, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0X87, 0XF0, 0XFF, 0XC3, 0XF8, 0X3F, 0XF0, 0X01, 0XC0,
  0X03, 0X80, 0X3F, 0XF8, 0X03, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X83, 0XFC, 0X3F, 0XF0, 0X01, 0XC0,
  0X03, 0X80, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X87, 0XFC, 0X3F, 0XF0, 0X01, 0XC0,
  0X03, 0X81, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0X87, 0XFF, 0XFF, 0X87, 0XFC, 0X3F, 0XF0, 0X01, 0XC0,
  0X03, 0X80, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0X83, 0XFF, 0XFF, 0X87, 0XFC, 0X3F, 0XF0, 0X01, 0XC0,
  0X03, 0X80, 0X7F, 0XFF, 0XFC, 0X1F, 0XFF, 0X83, 0XFF, 0XFF, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X01, 0XFF, 0XFE, 0X0F, 0XFF, 0X81, 0XFF, 0XFF, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X01, 0XFF, 0X07, 0XFF, 0X80, 0X00, 0XFE, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0XFF, 0X87, 0XFF, 0X80, 0X00, 0X00, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X7F, 0X83, 0XFF, 0X80, 0X00, 0X00, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X3F, 0XC3, 0XFF, 0XC3, 0XFF, 0X00, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X1F, 0XC0, 0X7F, 0XC3, 0XFF, 0XC3, 0XFF, 0XFC, 0X07, 0XFC, 0X0F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XC3, 0XFF, 0XC3, 0XFF, 0XFF, 0X07, 0XFC, 0X0F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XC1, 0XFF, 0XC3, 0XFF, 0XFE, 0X07, 0XFC, 0X0F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XC0, 0X7E, 0X0F, 0XFC, 0X0F, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XE0, 0X7E, 0X07, 0XF8, 0X07, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X03, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XF0, 0X7C, 0X07, 0XF8, 0X07, 0XF8, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X3F, 0XFF, 0XE1, 0XFF, 0XE0, 0XF0, 0XFC, 0X07, 0XF8, 0X03, 0XF0, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X0F, 0XFF, 0XE1, 0XFF, 0XE0, 0X7B, 0XF8, 0X07, 0XF8, 0X01, 0XE0, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X07, 0XFF, 0XE1, 0XFF, 0XE0, 0X7F, 0XF0, 0X07, 0XF0, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X01, 0XFF, 0XC1, 0XFF, 0XE0, 0X3F, 0XE0, 0X07, 0XF0, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X3E, 0X01, 0XFE, 0X00, 0X1F, 0XC0, 0X03, 0XE0, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0X80, 0X03, 0X80, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0,
  0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0,
  0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0,
  0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 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
};
const unsigned char ris_4[]PROGMEM = {
  0X00, 0X00, 0X00, 0X01, 0XE0, 0X00, 0X24, 0X07, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X03, 0X04, 0X00, 0X00, 0X1F, 0XF0, 0X98, 0XF8, 0X0C, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X02, 0X3F, 0X00, 0X42, 0XF8, 0X00, 0X3F, 0X9E, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X04, 0XC0, 0X00, 0X8E, 0XF0, 0X03, 0X98, 0X83, 0XC1, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X0C, 0X00, 0X00, 0X0C, 0XE1, 0X1C, 0X00, 0X01, 0XE0, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X1C, 0X01, 0X80, 0X18, 0XF2, 0X39, 0XFF, 0XF0, 0X78, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X10, 0X28, 0X98, 0X31, 0XE8, 0X7F, 0XFF, 0XFE, 0X2C, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X11, 0X40, 0X02, 0X03, 0XC1, 0XE9, 0XC0, 0X12, 0X06, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X18, 0X80, 0X01, 0X83, 0X81, 0XF0, 0X80, 0X01, 0X0B, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X18, 0X00, 0X30, 0XC3, 0XC7, 0X10, 0X03, 0XC0, 0X85, 0X80, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X00, 0X40, 0X60, 0X5B, 0X77, 0X13, 0X1F, 0XFE, 0X80, 0XC0, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X06, 0X30, 0X80, 0X8E, 0X3E, 0X3A, 0XFF, 0XFF, 0XC0, 0X40, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X06, 0X16, 0X1F, 0X8D, 0X96, 0X3E, 0X3F, 0XF8, 0X00, 0X70, 0X2C, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X19, 0X93, 0XEF, 0XC9, 0XB7, 0X1A, 0X3F, 0XC1, 0X72, 0X3C, 0X04, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X09, 0X00, 0X10, 0XF0, 0X37, 0X58, 0X7F, 0X06, 0XFF, 0X2F, 0X10, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0XC4, 0X00, 0X19, 0X37, 0XF9, 0XFE, 0X7F, 0X87, 0X81, 0XC8, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X06, 0X46, 0X1A, 0X09, 0XB7, 0X72, 0XD8, 0XFF, 0XF0, 0X59, 0XEC, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X88, 0X02, 0XEF, 0XFC, 0XFB, 0X12, 0X33, 0X1F, 0XCE, 0X1C, 0X70, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X81, 0X97, 0XFB, 0XFF, 0X7B, 0XFF, 0XB0, 0X08, 0XFF, 0XC3, 0X18, 0X40, 0X00, 0X00,
  0X00, 0X00, 0X03, 0X88, 0X07, 0XFA, 0X6D, 0X8F, 0XF0, 0X59, 0XFE, 0X70, 0X08, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X78, 0X30, 0X07, 0XF9, 0X2E, 0XFC, 0XFF, 0X9B, 0XFF, 0XFC, 0X3C, 0X30, 0X00, 0X00,
  0X00, 0X00, 0X31, 0X1E, 0X3F, 0XFD, 0X27, 0XDF, 0X7F, 0XE1, 0X1F, 0XFF, 0XEF, 0X10, 0X00, 0X00,
  0X00, 0X00, 0X9C, 0XC7, 0XBF, 0XFD, 0XFC, 0X87, 0X37, 0XBC, 0X0D, 0XFC, 0X73, 0X80, 0X00, 0X00,
  0X00, 0X00, 0XFE, 0XE1, 0XE7, 0XD7, 0XDE, 0XFF, 0X76, 0X3B, 0XF0, 0X06, 0X1D, 0XCC, 0X00, 0X00,
  0X00, 0X06, 0X00, 0XFC, 0X63, 0X8F, 0X8F, 0XFF, 0XFF, 0X1F, 0XEC, 0X03, 0X86, 0X60, 0X00, 0X00,
  0X00, 0X00, 0X03, 0XDC, 0X1F, 0XEF, 0XDF, 0XFF, 0XFF, 0XFF, 0XE6, 0X5E, 0XC1, 0XB0, 0X00, 0X00,
  0X00, 0X00, 0X18, 0X50, 0X3F, 0X3F, 0XFF, 0XFF, 0XFF, 0XF3, 0XE3, 0XFF, 0XF0, 0XF0, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X51, 0XE1, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XBA, 0X8F, 0XFC, 0X70, 0X00, 0X00,
  0X00, 0X00, 0X80, 0XC3, 0X0F, 0XFE, 0X9F, 0XFF, 0X7F, 0XFF, 0XDE, 0XE3, 0XFC, 0X38, 0X00, 0X00,
  0X00, 0X03, 0X83, 0XC2, 0X7E, 0X00, 0X0F, 0XFF, 0XE3, 0XFC, 0XFB, 0X70, 0X7F, 0X10, 0X00, 0X00,
  0X00, 0X06, 0X0B, 0X81, 0XE3, 0XFF, 0XFF, 0XFF, 0XFD, 0XFF, 0X3F, 0XBB, 0XEF, 0X8C, 0X00, 0X00,
  0X00, 0X00, 0X0F, 0X0F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XD9, 0XEB, 0XFF, 0XCC, 0X00, 0X00,
  0X00, 0X20, 0X0E, 0X1C, 0XFF, 0X7F, 0XFC, 0X9F, 0XBF, 0XF7, 0XEE, 0X7F, 0X3D, 0XFC, 0X00, 0X00,
  0X00, 0X00, 0X7C, 0X37, 0XE0, 0X3A, 0X7F, 0XFF, 0XF3, 0XFC, 0X73, 0X3F, 0XDE, 0XCE, 0X00, 0X00,
  0X00, 0X00, 0XFC, 0XDE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0X39, 0XBC, 0XC7, 0XE7, 0X00, 0X00,
  0X00, 0X01, 0XF9, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0X8E, 0XCE, 0X73, 0XB3, 0XC0, 0X00,
  0X00, 0X8F, 0XF3, 0X4F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC3, 0XF6, 0X6F, 0X1B, 0XF1, 0XC0, 0X00,
  0X00, 0X1F, 0XE2, 0X3E, 0XFF, 0XFF, 0XFF, 0X7F, 0X8F, 0XF8, 0XFF, 0X7C, 0XEF, 0XF9, 0X30, 0X00,
  0X00, 0X02, 0X64, 0X77, 0XFF, 0XFF, 0XFF, 0XFF, 0XFA, 0X7F, 0X35, 0XFE, 0XE7, 0XED, 0X10, 0X00,
  0X00, 0X08, 0X69, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0X9F, 0XDF, 0XFF, 0XFD, 0X80, 0X00,
  0X08, 0X03, 0X43, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XEE, 0X4F, 0X9F, 0XFE, 0X00, 0X00,
  0X08, 0X26, 0X56, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XF7, 0X6F, 0XCE, 0XF9, 0X80, 0X00,
  0X01, 0XFC, 0X0C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0XFE, 0XFB, 0XBF, 0XFE, 0X6D, 0XC0, 0X00,
  0X07, 0XF8, 0X09, 0XC0, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0X3D, 0X7F, 0XBF, 0XBF, 0XF4, 0X40, 0X00,
  0X1C, 0X05, 0X93, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0X9F, 0X9F, 0XB7, 0X20, 0X00,
  0X38, 0X00, 0X86, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XDF, 0X8B, 0X50, 0X00,
  0X60, 0X20, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XFF, 0XFF, 0X7B, 0XC5, 0X0C, 0X00,
  0XC0, 0X71, 0X9B, 0XC0, 0XFF, 0XFF, 0XFF, 0XC0, 0X7B, 0XFB, 0XFF, 0X7B, 0XBF, 0XF9, 0X8E, 0X00,
  0XC8, 0X03, 0X96, 0X00, 0X3F, 0XFF, 0XFD, 0X00, 0X20, 0X3D, 0XFF, 0XD3, 0XBF, 0XFC, 0XC7, 0X00,
  0X88, 0X03, 0X94, 0X07, 0X1F, 0XFF, 0XF9, 0X8C, 0X00, 0X36, 0XFB, 0XFF, 0XFF, 0XFF, 0X63, 0X00,
  0X1A, 0XC3, 0X8C, 0X07, 0XDF, 0X7F, 0XF3, 0XDE, 0X1F, 0XBE, 0XF7, 0XFF, 0XFF, 0XF2, 0X20, 0X80,
  0X13, 0X83, 0X88, 0X03, 0XFF, 0XFF, 0XF7, 0XFE, 0XFF, 0XFF, 0XF7, 0XFD, 0X3F, 0XFD, 0XD0, 0X40,
  0X05, 0X81, 0X88, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XBF, 0XDB, 0XFA, 0X40,
  0X85, 0XC3, 0X8D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0XDF, 0X9F, 0X80, 0X7D, 0X20,
  0X01, 0X07, 0X9D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XEF, 0XD7, 0X80, 0X0C, 0X80,
  0XD4, 0X87, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XFF, 0XDF, 0X9F, 0X8E, 0X00,
  0X5F, 0X87, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XAF, 0XFF, 0XC7, 0X84,
  0XDF, 0X87, 0X8F, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XF7, 0XFF, 0XFF, 0X61, 0XE0,
  0X15, 0X03, 0X9F, 0XE8, 0XE3, 0XFF, 0XFF, 0XF8, 0X01, 0XFF, 0X9F, 0XFF, 0XDF, 0XFE, 0XB0, 0X78,
  0X14, 0X87, 0X1F, 0XFC, 0X30, 0X7F, 0XFF, 0XF9, 0XD8, 0XFF, 0X9F, 0XFF, 0X7F, 0XF7, 0X1E, 0X1E,
  0X14, 0X03, 0X1F, 0XEF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFC, 0X3F, 0XDF, 0XFB, 0XFF, 0XFF, 0XCF, 0X07,
  0X98, 0XC7, 0X1F, 0XC7, 0XFE, 0X3F, 0XFF, 0XFC, 0XFF, 0X1F, 0XDF, 0XF3, 0XDF, 0XE7, 0XE3, 0XE1,
  0X98, 0X87, 0X1F, 0X80, 0XFF, 0X3F, 0XFE, 0XF0, 0X1F, 0XFF, 0X0F, 0XBB, 0XFF, 0XF8, 0XF8, 0XD9,
  0X98, 0X87, 0X1F, 0X0F, 0X77, 0X1F, 0XF8, 0XE1, 0XF3, 0XEF, 0XCF, 0XFB, 0XFF, 0XFE, 0X7C, 0X6C,
  0X08, 0X0B, 0X1E, 0X3E, 0X43, 0X1F, 0XF8, 0X07, 0X80, 0XEF, 0XDF, 0X7F, 0XDF, 0XFF, 0X1E, 0XFE,
  0X08, 0X86, 0X1E, 0X78, 0X19, 0X1F, 0XF2, 0X4F, 0X02, 0X7F, 0XFB, 0XE7, 0XFF, 0XF9, 0XC3, 0X8F,
  0X18, 0X86, 0X1E, 0X30, 0X9B, 0X1F, 0XF7, 0XFF, 0X23, 0X0E, 0XFB, 0XDF, 0XFF, 0XFD, 0XF6, 0XC7,
  0X18, 0X8E, 0X1E, 0X98, 0X1B, 0X3F, 0XF7, 0XBF, 0X03, 0XFF, 0XE7, 0X7F, 0XFF, 0XBE, 0X73, 0XB3,
  0X18, 0XCE, 0X3F, 0XD8, 0X73, 0X3F, 0XE7, 0XC7, 0X03, 0XFF, 0XFD, 0XF3, 0XEF, 0X9D, 0X18, 0XF9,
  0X18, 0X46, 0X0E, 0X7F, 0XF7, 0X7F, 0XF7, 0XCB, 0X7E, 0X7F, 0XFF, 0XF7, 0XFF, 0X2F, 0XDE, 0X6C,
  0X58, 0X04, 0X2E, 0X0F, 0XEE, 0X7F, 0XFB, 0X10, 0X30, 0X11, 0XFF, 0XFF, 0XFF, 0X0F, 0XE7, 0X34,
  0X18, 0X04, 0X2C, 0X80, 0X1C, 0X7F, 0XFD, 0X9C, 0X06, 0X38, 0XFD, 0XFD, 0XFF, 0XFD, 0XFF, 0X1E,
  0X00, 0X04, 0X09, 0X81, 0XF8, 0X7F, 0XFF, 0X87, 0XFF, 0XFC, 0XFF, 0XFD, 0XFF, 0XF0, 0XFF, 0X8E,
  0X00, 0X04, 0X33, 0XEF, 0XF8, 0X7F, 0XC7, 0XF3, 0XFF, 0XEF, 0XFF, 0XFF, 0XF9, 0XF0, 0X39, 0XCD,
  0X00, 0X00, 0X73, 0XBF, 0XB8, 0X7E, 0XF7, 0XF8, 0X7B, 0XCF, 0XFF, 0XFF, 0XF9, 0X7C, 0X1F, 0XE7,
  0X00, 0X00, 0X7A, 0X96, 0X78, 0X76, 0XFF, 0XFF, 0X0F, 0XC6, 0X79, 0XFB, 0X3C, 0X1E, 0XC6, 0XE7,
  0X00, 0X00, 0X48, 0X4E, 0X78, 0XFE, 0XFF, 0XFF, 0XF8, 0X70, 0X79, 0XFF, 0XFF, 0X1E, 0XC1, 0XF3,
  0X00, 0X00, 0X59, 0XFE, 0X79, 0XFE, 0X7F, 0XFC, 0XFF, 0X9E, 0XBF, 0XFB, 0XFF, 0X0E, 0XF4, 0XFF,
  0X00, 0X00, 0X1B, 0XEB, 0X71, 0XFF, 0XBD, 0XFF, 0XFF, 0XFF, 0XFD, 0XFF, 0XEE, 0X7C, 0X42, 0X7F,
  0X00, 0X00, 0X3F, 0X3F, 0XF3, 0XBF, 0XBE, 0X7F, 0XFF, 0XF7, 0XF6, 0XFF, 0X0E, 0X7E, 0XE9, 0X3B,
  0X00, 0X00, 0X3F, 0XFF, 0XE3, 0XF2, 0XBF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFD, 0X8C, 0X7E, 0X99, 0XBB,
  0X00, 0X00, 0X7F, 0XFF, 0XC7, 0XF2, 0X5F, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0X99, 0XFC, 0X9D, 0XBB,
  0X00, 0X00, 0X7E, 0XDF, 0XC7, 0XFF, 0XCD, 0XFF, 0XFF, 0XBF, 0XF4, 0XFF, 0X9B, 0XFD, 0XCC, 0XDF,
  0X00, 0X00, 0X7F, 0XCF, 0X4F, 0XFF, 0XC9, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0X19, 0XBD, 0XEE, 0XDF,
  0X00, 0X00, 0X7F, 0XDE, 0XCF, 0XFF, 0XC8, 0XFF, 0XFF, 0XFF, 0XFE, 0XDE, 0X1D, 0XBD, 0X6E, 0X5F,
  0X00, 0X00, 0X7F, 0XAD, 0XCF, 0XFF, 0XC8, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0X3F, 0XFF, 0XEE, 0X3F,
  0X00, 0X00, 0X7F, 0XFD, 0XDF, 0XFF, 0XCC, 0X7F, 0XFF, 0XFF, 0XF6, 0X3E, 0X1F, 0XFC, 0XF7, 0X3F,
  0X00, 0X00, 0X3F, 0XF7, 0X8F, 0XFF, 0XDE, 0X7F, 0XFF, 0XFF, 0XF6, 0X7E, 0X8F, 0XFC, 0XFF, 0X3B,
  0X00, 0X00, 0X3F, 0XEF, 0X8F, 0XFF, 0XFF, 0X37, 0XFF, 0XFF, 0XFE, 0X7E, 0XC3, 0X7A, 0X7B, 0X3F,
  0X00, 0X00, 0X3F, 0X3F, 0X07, 0XFF, 0XFF, 0XBB, 0XFF, 0XFF, 0XFF, 0X7F, 0XC3, 0X73, 0X3B, 0X3B,
  0X00, 0X00, 0X3F, 0X3F, 0X07, 0XFF, 0XFF, 0XBD, 0XFF, 0XFF, 0XFF, 0X3F, 0XCF, 0XB7, 0X3F, 0X3F,
  0X00, 0X00, 0X3E, 0XFF, 0X03, 0XFE, 0X03, 0X3E, 0XFF, 0XFF, 0X9F, 0X3C, 0XCF, 0XAB, 0XCE, 0X3F,
  0X00, 0X00, 0X3B, 0XFF, 0X01, 0XF8, 0XFC, 0X7E, 0X7F, 0XFF, 0XDF, 0X3B, 0X8F, 0X9B, 0XE6, 0X3F,
  0X00, 0X00, 0X39, 0XFF, 0XE0, 0X01, 0XFC, 0XFF, 0X3F, 0XEF, 0XFF, 0X7B, 0XDF, 0XB3, 0XFE, 0X7B,
  0X00, 0X00, 0X39, 0XFE, 0XF8, 0X0F, 0X9F, 0XFF, 0XBF, 0XFF, 0XFF, 0X37, 0X9F, 0XB7, 0X3F, 0X7F,
  0X00, 0X00, 0X31, 0XFA, 0X7F, 0XFC, 0XB7, 0XFF, 0XDF, 0XFF, 0XFE, 0X3F, 0X9F, 0XA4, 0X7F, 0X7F,
  0X00, 0X00, 0X3B, 0XFE, 0XFF, 0XF0, 0XF6, 0XBF, 0XCF, 0XFF, 0XFE, 0X7F, 0X9B, 0X84, 0X3B, 0XFE,
  0X00, 0X00, 0X31, 0XFD, 0XFF, 0XF3, 0XF7, 0XE0, 0XCF, 0XFF, 0XFF, 0X7B, 0X9B, 0XCF, 0X01, 0XEE,
  0X00, 0X00, 0X33, 0XF1, 0XFF, 0XF7, 0XFF, 0XF6, 0X77, 0XF9, 0XFE, 0X7B, 0XBF, 0XDF, 0X87, 0XCF,
  0X00, 0X00, 0X31, 0XB7, 0XFF, 0XF7, 0XFF, 0XFE, 0X7B, 0XFB, 0XFE, 0X7F, 0XBF, 0XF0, 0XFF, 0X8F,
  0X00, 0X00, 0X31, 0XF7, 0XBF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0X3F, 0XF0, 0XFF, 0X84,
  0X00, 0X00, 0X39, 0XDF, 0X7C, 0X7F, 0XB7, 0XCF, 0XA9, 0XFF, 0XFE, 0X7F, 0X3F, 0X84, 0XF7, 0X85,
  0X00, 0X00, 0X39, 0X9B, 0X71, 0XFD, 0XF7, 0XFF, 0X8D, 0X7F, 0XFC, 0X7F, 0X4F, 0X00, 0X1F, 0X05,
  0X00, 0X00, 0X3D, 0XBF, 0XFF, 0XFF, 0XEF, 0X7F, 0XFF, 0XFD, 0XFF, 0X3F, 0XC4, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X1D, 0X97, 0XFB, 0XFF, 0XFD, 0XFF, 0XFF, 0XFF, 0XF7, 0X7F, 0XC0, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X19, 0XCD, 0XFB, 0XFF, 0XE5, 0XBF, 0XDF, 0XFF, 0XFE, 0X7F, 0XE0, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X1D, 0XC1, 0XFF, 0XBF, 0XE3, 0X7F, 0XBE, 0X7F, 0XFE, 0X3F, 0X80, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X0D, 0XE0, 0X64, 0X00, 0X8F, 0X39, 0X7F, 0XFF, 0XFE, 0X7F, 0X80, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X0C, 0XF0, 0X00, 0X00, 0X08, 0X0F, 0XEE, 0XFF, 0XFE, 0X7F, 0X80, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X1C, 0XF8, 0X05, 0X70, 0X09, 0X10, 0X1E, 0XFF, 0XFE, 0XFB, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X0C, 0XFE, 0X0F, 0XF9, 0XBE, 0XF0, 0X5E, 0XFF, 0XFC, 0XFA, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X0E, 0X7F, 0X2E, 0X6F, 0XFF, 0XE1, 0XCC, 0XF7, 0XFC, 0XF8, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X0E, 0X7F, 0XCF, 0XFB, 0XFF, 0XE3, 0X31, 0XF7, 0XFD, 0XF0, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X07, 0X3F, 0XCF, 0XF3, 0XEF, 0XC3, 0XF9, 0XE7, 0XF9, 0XF0, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X07, 0XBD, 0XCF, 0XF7, 0XEF, 0X4F, 0XF9, 0XEF, 0XF9, 0XE0, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X03, 0X9F, 0XCF, 0X79, 0XCF, 0X0F, 0XF9, 0XEF, 0XFB, 0XC0, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X03, 0XDF, 0X8F, 0XFF, 0X8E, 0X3C, 0XF9, 0XEF, 0XF3, 0X80, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X01, 0XCF, 0XCF, 0XED, 0XCF, 0X79, 0XF9, 0XEF, 0XF7, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0XEF, 0XCF, 0X7C, 0XDE, 0X73, 0XFD, 0XCF, 0XF7, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0XE7, 0XCE, 0X32, 0XDC, 0X67, 0XFD, 0XCF, 0XEE, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X77, 0XCF, 0XD3, 0XDE, 0X4F, 0X7D, 0XCF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X77, 0XC7, 0XF7, 0X1C, 0XCF, 0X7F, 0XDF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X33, 0XC7, 0X77, 0X18, 0X9E, 0X7F, 0XDF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X3B, 0XE7, 0XF7, 0XD9, 0X3F, 0XFF, 0XDF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X1B, 0XE7, 0XE7, 0X39, 0X7A, 0XFF, 0X9F, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X19, 0XE7, 0XF7, 0X39, 0XFF, 0XFF, 0XBF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  0X00, 0X00, 0X00, 0X0D, 0XE3, 0XE7, 0X39, 0XEF, 0XFF, 0XBE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02,
  0X00, 0X00, 0X00, 0X0D, 0XE3, 0XE6, 0X73, 0XFF, 0XFF, 0X7C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01,
  0X00, 0X00, 0X00, 0X06, 0XF1, 0XF4, 0XF3, 0XFF, 0XFE, 0X78, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03,
  0X00, 0X00, 0X00, 0X06, 0XF1, 0XFF, 0XE7, 0XFF, 0XFE, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11,
  0X00, 0X00, 0X00, 0X02, 0X78, 0XF7, 0XC7, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X27,
  0X00, 0X00, 0X00, 0X01, 0X78, 0XF7, 0XCF, 0XFF, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F,
  0X00, 0X00, 0X00, 0X00, 0X3C, 0X7F, 0X9F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03,
  0X00, 0X00, 0X00, 0X00, 0X1C, 0X7F, 0X9F, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07,
  0X00, 0X00, 0X00, 0X00, 0X0E, 0X3F, 0X3F, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XE7,
  0X00, 0X00, 0X00, 0X00, 0X0F, 0X0C, 0X7F, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XAF,
  0X00, 0X00, 0X00, 0X00, 0X07, 0X80, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X02,
  0X00, 0X00, 0X00, 0X00, 0X03, 0XC1, 0XFF, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0X0A,
  0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0XDB,
  0X00, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X16, 0X9D,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X7D, 0XEF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0XF5,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X63, 0X33,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7D, 0XB3,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X1B, 0XBB,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X8C, 0X71,
  0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0XDF, 0X07,
  0X00, 0X00, 0X00, 0X00, 0X63, 0X01, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0XF9, 0XEB,
  0X00, 0X00, 0X00, 0X00, 0X23, 0XF0, 0X70, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0D, 0X53, 0XE1,
  0X00, 0X00, 0X00, 0X00, 0X67, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X17, 0X88, 0X0D,
  0X00, 0X00, 0X00, 0X02, 0X47, 0XC1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0X9E, 0XC9,
  0X00, 0X00, 0X00, 0X03, 0X0E, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X9A, 0X9B,
  0X00, 0X00, 0X00, 0X01, 0X8C, 0X0A, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X79, 0X48, 0X8B,
  0X00, 0X00, 0X00, 0X01, 0X18, 0X38, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X3D, 0X83,
  0X00, 0X00, 0X00, 0X02, 0X30, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3D, 0X15, 0X73,
  0X00, 0X00, 0X00, 0X0E, 0X31, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X05, 0XEA, 0X31, 0XB7,
  0X00, 0X00, 0X00, 0X0F, 0X27, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XEF, 0X3F, 0X4B,
  0X00, 0X00, 0X00, 0X0C, 0X67, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1B, 0X17, 0XE2, 0X4D,
  0X00, 0X00, 0X00, 0X16, 0X4E, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0X75, 0XAC, 0XC7,
  0X00, 0X00, 0X00, 0X7E, 0X5C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X7F, 0XFD, 0XFF, 0XFF,
  0X00, 0X00, 0X00, 0X7F, 0X38, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF
};

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS     10
#define TFT_RST    -1
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

long Y(0);

void setup(void) {
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(2);
  Serial.begin(9600);
  Y = millis();
  tft.fillScreen(ST7735_BLACK);
  Serial.println(millis()-Y);   //число миллисекунд на стирание
}
void loop() {
  Y = millis();
  drawBitmapFast(0, 0, ris_1, 128, 160, random(65536), random(65536));
  Serial.println(millis()-Y);   //число миллисекунд на кадр
  Y = millis();
  drawBitmapFast(0, 0, ris_2, 128, 160, random(65536), random(65536));
  Serial.println(millis()-Y);  //число миллисекунд на кадр
  Y = millis();
  drawBitmapFast(0, 0, ris_3, 128, 160, random(65536), random(65536));
  Serial.println(millis()-Y);  //число миллисекунд на кадр
  Y = millis();
  drawBitmapFast(0, 0, ris_4, 128, 160, random(65536), random(65536));
  Serial.println(millis()-Y);  //число миллисекунд на кадр
}

void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[],
                    int16_t w, int16_t h, uint16_t color, uint16_t bg) {
  uint8_t b(0);
  uint8_t bc(0);
  uint16_t tc(0);
  int16_t c =  w * h;
  tft.startWrite();
  tft.setAddrWindow(x, y, w, h);
  asm volatile(
    "mloop_%=: \n"
    "   LPM %[b],%a[bm]+ \n"
    "   LDI %[bc],1 \n"
    "loop_%=: \n"
    "   SBRC %[b],7 \n"
    "   MOVW %[tc],%[color] \n"
    "   SBRS %[b],7 \n"
    "   MOVW %[tc],%[bg] \n"
    "   IN __tmp_reg__,%[spdr]-1 \n"
    "   OUT %[spdr],%B[tc] \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   RJMP .+0 \n"
    "   IN __tmp_reg__,%[spdr]-1 \n"
    "   OUT %[spdr],%A[tc] \n"
    "   SBIW %[c],1 \n"
    "   BREQ exit_%= \n"
    "   NOP \n"
    "   LSL %[b] \n"
    "   LSL %[bc] \n"
    "   BRCS mloop_%= \n"
    "   RJMP .+0 \n"
    "   NOP \n"
    "   RJMP loop_%= \n"
    "exit_%=: \n"
  :
  : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg),
    [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c)
  : );
  tft.endWrite();
}

 

lilik
Offline
Зарегистрирован: 19.10.2017

Выдаёт ошибка платы ардуино генуино... с новой библиотекой. Так что не судьба. вернулся к старой версии.