Splitting the code into single files is done. \o/

This commit is contained in:
Fabian Schlenz 2019-05-30 00:49:54 +02:00
parent 76802ffa78
commit 2f58fd14d0
45 changed files with 1142 additions and 834 deletions

21
include/Effect.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef Effect_H
#define Effect_H
#include "prototypes.h"
#include "config.h"
#include <Arduino.h>
class Effect {
protected:
Window window = {0, 0, LED_WIDTH, LED_HEIGHT}; // Use a full screen window per default.
public:
virtual void loop() = 0;
boolean supports_window = false;
virtual boolean can_be_shown_with_clock() { return false; };
virtual boolean clock_as_mask() { return false; };
void setWindow(Window win) {
window = win;
};
};
#endif

11
include/EffectEntry.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef EffectEntry_H
#define EffectEntry_H
#include "Effect.h"
typedef struct {
char* name;
Effect* effect;
} EffectEntry;
#endif

98
include/NTPClient.h Normal file
View File

@ -0,0 +1,98 @@
#pragma once
#include "Arduino.h"
#include <Udp.h>
#define SEVENZYYEARS 2208988800UL
#define NTP_PACKET_SIZE 48
#define NTP_DEFAULT_LOCAL_PORT 1337
class NTPClient {
private:
UDP* _udp;
bool _udpSetup = false;
const char* _poolServerName = "pool.ntp.org"; // Default time server
int _port = NTP_DEFAULT_LOCAL_PORT;
long _timeOffset = 0;
unsigned long _updateInterval = 60000; // In ms
unsigned long _currentEpoc = 0; // In s
unsigned long _lastUpdate = 0; // In ms
byte _packetBuffer[NTP_PACKET_SIZE];
void sendNTPPacket();
public:
NTPClient(UDP& udp);
NTPClient(UDP& udp, long timeOffset);
NTPClient(UDP& udp, const char* poolServerName);
NTPClient(UDP& udp, const char* poolServerName, long timeOffset);
NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
/**
* Set time server name
*
* @param poolServerName
*/
void setPoolServerName(const char* poolServerName);
/**
* Starts the underlying UDP client with the default local port
*/
void begin();
/**
* Starts the underlying UDP client with the specified local port
*/
void begin(int port);
/**
* This should be called in the main loop of your application. By default an update from the NTP Server is only
* made every 60 seconds. This can be configured in the NTPClient constructor.
*
* @return true on success, false on failure
*/
bool update();
/**
* This will force the update from the NTP Server.
*
* @return true on success, false on failure
*/
bool forceUpdate();
int getDay() const;
int getHours() const;
int getMinutes() const;
int getSeconds() const;
/**
* Changes the time offset. Useful for changing timezones dynamically
*/
void setTimeOffset(int timeOffset);
/**
* Set the update interval to another frequency. E.g. useful when the
* timeOffset should not be set in the constructor
*/
void setUpdateInterval(unsigned long updateInterval);
/**
* @return time formatted like `hh:mm:ss`
*/
String getFormattedTime() const;
/**
* @return time in seconds since Jan. 1, 1970
*/
unsigned long getEpochTime() const;
/**
* Stops the underlying UDP client
*/
void end();
};

View File

@ -35,120 +35,9 @@
#include <Arduino.h>
#include "prototypes.h"
uint8_t animation_koopa_colors[] PROGMEM = {182, 154, 17, 0, 0, 0, 48, 48, 48, 142, 4, 6, 254, 252, 255, 3, 1, 138, 17, 239, 18};
uint8_t animation_koopa_data[] PROGMEM = {
255, 4, 1, 6, 255, 14, 1, 6, 6, 6, 255, 12, 1, 2, 6, 6, 6, 255, 11, 1, 2, 2, 3, 6, 6, 2, 255, 10, 1, 2, 2, 3, 6, 6, 2, 1, 1, 8, 8, 8, 6, 1, 1, 1, 2, 3, 2, 6, 6, 2, 2, 1, 8, 3, 8, 8, 3, 6, 1, 1, 255, 7, 2, 1, 8, 8, 3, 3, 8, 8, 6, 1, 2, 2, 2, 4, 2, 2, 4, 8, 8, 3, 8, 8, 3, 8, 6, 1, 2, 2, 4, 2, 2, 2, 7, 8, 3, 255, 4, 8, 3, 8, 1, 1, 1, 255, 4, 2, 7, 3, 8, 3, 8, 8, 3, 8, 3, 2, 1, 1, 1, 2, 2, 2, 7, 8, 8, 8, 3, 3, 8, 8, 8, 255, 5, 1, 2, 2, 7, 7, 8, 3, 8, 8, 3, 8, 7, 7, 1, 1, 1, 255, 4, 5, 7, 7, 255, 4, 8, 7, 7, 1, 1, 1, 5, 5, 5, 4, 2, 2, 255, 6, 7, 2, 255, 6, 1, 255, 4, 2, 1, 5, 5, 5, 2, 2, 255, 6, 1, 2, 2, 2, 255, 4, 1, 2, 2, 2, 1,
255, 4, 0, 1, 255, 14, 0, 1, 0, 1, 255, 12, 0, 1, 255, 14, 0, 1, 0, 6, 0, 0, 1, 255, 18, 0, 255, 4, 1, 0, 0, 0, 1, 2, 0, 3, 0, 6, 0, 0, 1, 8, 0, 0, 6, 1, 0, 0, 0, 3, 0, 6, 6, 255, 4, 0, 3, 8, 8, 3, 6, 1, 255, 4, 0, 2, 0, 0, 2, 1, 0, 8, 3, 3, 8, 255, 5, 0, 2, 4, 0, 0, 4, 0, 8, 3, 0, 0, 3, 8, 6, 0, 2, 2, 4, 255, 4, 0, 8, 3, 8, 0, 0, 8, 3, 8, 1, 0, 0, 2, 255, 4, 0, 3, 0, 3, 8, 8, 3, 0, 3, 2, 0, 0, 0, 2, 0, 0, 0, 8, 0, 8, 3, 3, 8, 0, 8, 1, 0, 0, 0, 1, 2, 2, 7, 0, 8, 3, 0, 0, 3, 8, 0, 7, 0, 0, 255, 4, 1, 5, 7, 0, 255, 4, 8, 0, 7, 255, 6, 0, 5, 0, 0, 255, 6, 7, 255, 6, 0, 5, 5, 0, 0, 2, 2, 0, 5, 5, 0, 0, 2,
255, 4, 0, 6, 255, 14, 0, 6, 0, 6, 255, 12, 0, 2, 255, 14, 0, 2, 0, 3, 0, 0, 2, 255, 25, 0, 2, 3, 0, 6, 0, 2, 255, 11, 0, 2, 0, 2, 2, 255, 17, 0, 1, 255, 11, 0, 1, 1, 0, 0, 1, 255, 9, 0, 255, 4, 1, 255, 14, 0, 1, 1, 255, 14, 0, 2, 255, 35, 0, 2, 255, 14, 0, 2, 255, 14, 0, 2, 2, 0, 0, 1, 1, 0, 1, 1, 255, 3, 0,
255, 73, 0, 8, 8, 8, 6, 255, 11, 0, 8, 3, 0, 0, 3, 6, 255, 11, 0, 8, 3, 3, 8, 8, 6, 255, 4, 0, 4, 0, 0, 4, 8, 0, 3, 8, 8, 3, 255, 5, 0, 4, 2, 0, 0, 7, 0, 3, 8, 0, 0, 8, 3, 8, 0, 0, 0, 2, 2, 0, 0, 0, 3, 8, 3, 0, 0, 3, 8, 3, 2, 0, 0, 0, 2, 0, 0, 0, 8, 0, 8, 3, 3, 8, 0, 8, 1, 0, 0, 1, 1, 0, 0, 0, 7, 0, 3, 8, 8, 3, 0, 7, 7, 255, 4, 0, 1, 1, 2, 0, 7, 8, 0, 0, 8, 7, 0, 1, 255, 4, 0, 2, 2, 0, 2, 0, 255, 4, 7, 0, 2, 255, 4, 0, 2, 2, 0, 0, 5, 5, 1, 1, 2, 2, 2, 5, 5, 255, 4, 0, 1, 1, 5, 5, 5, 255, 4, 0, 255, 3, 5,
255, 4, 0, 1, 255, 14, 0, 1, 0, 1, 255, 12, 0, 1, 255, 14, 0, 1, 0, 6, 0, 0, 1, 255, 18, 0, 255, 4, 1, 0, 0, 0, 1, 2, 0, 3, 0, 6, 0, 0, 1, 8, 0, 0, 6, 1, 0, 0, 0, 3, 0, 6, 6, 255, 4, 0, 3, 8, 8, 3, 6, 1, 255, 4, 0, 2, 0, 0, 2, 1, 0, 8, 3, 3, 8, 255, 5, 0, 2, 4, 0, 0, 4, 0, 8, 3, 0, 0, 3, 8, 6, 0, 2, 2, 4, 255, 4, 0, 8, 3, 8, 0, 0, 8, 3, 8, 1, 0, 0, 2, 255, 4, 0, 3, 0, 3, 8, 8, 3, 0, 3, 2, 0, 0, 0, 2, 0, 0, 0, 8, 0, 8, 3, 3, 8, 0, 8, 8, 255, 4, 0, 2, 2, 7, 0, 8, 3, 0, 0, 3, 8, 0, 7, 255, 4, 0, 1, 1, 0, 7, 0, 255, 4, 8, 0, 7, 255, 4, 0, 1, 0, 0, 0, 2, 255, 6, 7, 2, 255, 4, 0, 255, 4, 2, 255, 4, 0, 2, 2, 2, 0, 0,
255, 4, 0, 6, 255, 14, 0, 6, 0, 6, 255, 12, 0, 2, 255, 14, 0, 2, 0, 3, 0, 0, 2, 255, 25, 0, 2, 3, 0, 6, 0, 2, 255, 11, 0, 2, 0, 2, 2, 255, 17, 0, 1, 255, 11, 0, 1, 1, 0, 0, 1, 255, 9, 0, 255, 4, 1, 255, 14, 0, 1, 1, 255, 14, 0, 2, 255, 12, 0, 1, 255, 36, 0, 1, 255, 10, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 1, 0, 2, 2
};
uint16_t animation_koopa_delays[] = {100, 100, 100, 100, 100, 100};
uint16_t animation_koopa_offsets[] = {0, 199, 390, 479, 640, 832, 926};
AnimationData animation_koopa = {&animation_koopa_colors[0], &animation_koopa_data[0], &animation_koopa_offsets[0], &animation_koopa_delays[0], false, 7, 6, 16, 16};
uint8_t animation_couple_rain_colors[] PROGMEM = {0, 0, 0, 2, 139, 218, 181, 171, 255, 255, 255, 255, 255, 76, 11, 220, 206, 180, 49, 49, 49, 21, 1, 175, 100, 27, 0, 81, 66, 37, 51, 25, 253, 46, 12, 0, 218, 2, 86, 37, 175, 253, 128, 104, 60};
uint8_t animation_couple_rain_data[] PROGMEM = {
255, 6, 2, 3, 255, 7, 2, 3, 255, 14, 2, 3, 255, 8, 2, 3, 255, 7, 2, 3, 255, 14, 2, 3, 255, 25, 2, 3, 255, 5, 2, 3, 255, 12, 2, 3, 255, 12, 2, 3, 255, 18, 2, 3, 255, 12, 2, 3, 255, 18, 2, 3, 255, 12, 2, 3, 255, 18, 2, 3, 255, 12, 2, 3, 255, 10, 2, 3, 255, 7, 2, 3, 255, 23, 2, 3, 255, 11, 2, 3, 255, 19, 2, 3, 255, 11, 2, 3, 255, 15, 2, 3, 2, 2, 2, 3, 255, 11, 2, 3, 255, 5, 2, 15, 255, 9, 2, 3, 2, 2, 2, 3, 255, 11, 2, 3, 2, 2, 2, 3, 255, 11, 2, 3, 255, 15, 2, 3, 5, 2, 15, 3, 255, 7, 2, 3, 2, 2, 2, 3, 255, 8, 2, 3, 255, 4, 2, 255, 7, 5, 255, 7, 2, 3, 2, 2, 2, 3, 255, 8, 2, 3, 2, 2, 2, 5, 5, 12, 12, 5, 12, 12, 5, 5, 255, 6, 2, 3, 255, 12, 2, 3, 2, 2, 5, 5, 12, 12, 5, 5, 5, 12, 12, 5, 5, 255, 5, 2, 3, 255, 12, 2, 3, 2, 4, 4, 9, 9, 12, 5, 5, 5, 12, 9, 9, 4, 4, 255, 4, 2, 3, 255, 8, 2, 3, 2, 2, 2, 3, 2, 4, 4, 9, 9, 9, 4, 4, 4, 9, 9, 9, 4, 4, 255, 13, 2, 3, 255, 11, 2, 9, 255, 6, 2, 3, 255, 12, 2, 3, 255, 7, 2, 6, 6, 6, 2, 9, 255, 6, 2, 3, 255, 12, 2, 3, 255, 7, 2, 6, 6, 6, 2, 9, 2, 10, 10, 10, 2, 2, 3, 255, 12, 2, 3, 255, 7, 2, 10, 10, 10, 2, 9, 255, 5, 10, 2, 3, 255, 19, 2, 255, 5, 6, 12, 10, 7, 7, 7, 10, 2, 3, 255, 6, 2, 3, 255, 13, 2, 11, 7, 11, 2, 12, 10, 11, 7, 11, 10, 255, 8, 2, 3, 255, 13, 2, 7, 7, 7, 2, 7, 10, 7, 7, 7, 10, 255, 8, 2, 3, 255, 6, 2, 3, 255, 6, 2, 255, 5, 6, 13, 13, 16, 13, 13, 255, 8, 2, 3, 255, 6, 2, 3, 255, 5, 2, 255, 4, 6, 2, 2, 2, 14, 14, 14, 255, 9, 2, 3, 255, 6, 2, 3, 255, 5, 2, 7, 10, 10, 10, 2, 2, 7, 14, 14, 14, 7, 255, 15, 2, 3, 255, 6, 2, 6, 6, 6, 2, 2, 255, 5, 14, 2, 2, 2, 15, 255, 11, 2, 3, 255, 6, 2, 6, 2, 6, 2, 2, 2, 7, 2, 7, 255, 6, 2, 15, 255, 15, 2, 8, 8, 2, 8, 8, 2, 2, 8, 2, 8, 255, 6, 2, 3, 255, 37, 2,
255, 19, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 21, 0, 2, 15, 255, 8, 0, 2, 255, 14, 0, 15, 0, 0, 0, 15, 2, 255, 15, 0, 3, 255, 14, 0, 2, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 50, 0, 15, 255, 5, 0, 3, 255, 5, 0, 15, 255, 20, 0, 2, 0, 15, 0, 0, 3, 255, 7, 0, 15, 255, 20, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 37, 0,
255, 6, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 15, 0, 2, 15, 0, 15, 0, 0, 0, 2, 0, 3, 255, 18, 0, 3, 0, 0, 2, 2, 0, 0, 2, 255, 4, 0, 15, 255, 7, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 11, 0, 15, 0, 2, 255, 18, 0, 2, 0, 0, 15, 255, 8, 0, 2, 2, 0, 15, 255, 19, 0, 2, 255, 10, 0, 2, 255, 23, 0, 3, 255, 31, 0, 3, 255, 34, 0,
0, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 255, 18, 0, 15, 255, 26, 0, 15, 2, 0, 0, 2, 0, 2, 255, 16, 0, 2, 255, 19, 0, 2, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 255, 19, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 23, 0, 15, 0, 2, 0, 0, 0, 15, 2, 3, 255, 18, 0, 3, 0, 0, 0, 2, 0, 0, 2, 255, 8, 0, 2, 15, 255, 14, 0, 3, 255, 5, 0, 15, 255, 7, 0, 2, 255, 25, 0, 15, 255, 5, 0, 2, 255, 59, 0,
255, 10, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 2, 15, 255, 5, 0, 2, 255, 5, 0, 3, 255, 12, 0, 15, 2, 255, 17, 0, 3, 255, 45, 0, 15, 255, 22, 0, 2, 255, 6, 0, 15, 255, 13, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 255, 12, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 36, 0, 2, 255, 5, 0, 2, 255, 26, 0, 15, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 2, 2, 15, 255, 4, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 2, 255, 23, 0, 3, 255, 41, 0,
0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 29, 0, 2, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 15, 255, 4, 0, 2, 255, 14, 0, 3, 0, 0, 15, 2, 0, 15, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 15, 2, 255, 17, 0, 3, 255, 10, 0, 15, 2, 255, 56, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 15, 255, 11, 0, 3, 255, 14, 0, 2, 255, 5, 0, 2, 0, 0, 15, 255, 4, 0, 15, 255, 25, 0, 2, 0, 0, 0, 15, 255, 20, 0, 15, 255, 11, 0, 3, 255, 25, 0, 2, 255, 34, 0,
255, 6, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 20, 0, 2, 3, 255, 21, 0, 2, 15, 0, 2, 15, 255, 5, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 2, 0, 2, 255, 12, 0, 2, 255, 5, 0, 3, 255, 9, 0, 15, 0, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 28, 0, 2, 255, 7, 0, 2, 15, 255, 21, 0, 3, 255, 4, 0, 2, 0, 15, 0, 2, 2, 0, 0, 3, 255, 14, 0, 2, 0, 15, 0, 3, 255, 7, 0, 2, 255, 4, 0, 3, 255, 14, 0, 15, 2, 255, 72, 0,
255, 23, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 0, 0, 0, 15, 0, 15, 0, 2, 15, 255, 13, 0, 2, 255, 12, 0, 2, 0, 0, 2, 255, 15, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 2, 255, 15, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 10, 0, 15, 0, 2, 255, 22, 0, 3, 255, 5, 0, 2, 255, 20, 0, 15, 255, 4, 0, 3, 0, 15, 2, 255, 4, 0, 15, 255, 15, 0, 15, 0, 2, 255, 10, 0, 2, 255, 4, 0, 15, 255, 13, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 37, 0,
255, 16, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 7, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 5, 0, 15, 255, 8, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 0, 0, 2, 255, 20, 0, 2, 255, 7, 0, 3, 0, 0, 15, 0, 2, 255, 14, 0, 15, 0, 0, 2, 2, 255, 5, 0, 2, 255, 5, 0, 2, 15, 255, 14, 0, 2, 255, 7, 0, 3, 255, 9, 0, 2, 255, 16, 0, 15, 255, 4, 0, 3, 255, 65, 0,
0, 0, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 7, 0, 15, 2, 0, 15, 255, 12, 0, 3, 255, 16, 0, 2, 2, 255, 6, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 5, 0, 15, 2, 0, 15, 255, 14, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 255, 16, 0, 15, 0, 2, 0, 0, 15, 255, 4, 0, 3, 255, 4, 0, 2, 255, 17, 0, 2, 2, 15, 0, 0, 0, 15, 255, 7, 0, 2, 255, 22, 0, 3, 255, 33, 0,
255, 11, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 14, 0, 15, 255, 5, 0, 3, 0, 0, 0, 2, 255, 22, 0, 2, 0, 0, 2, 15, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 4, 0, 15, 255, 15, 0, 3, 255, 12, 0, 2, 0, 0, 2, 255, 21, 0, 15, 2, 255, 4, 0, 15, 255, 19, 0, 15, 2, 0, 0, 0, 15, 2, 2, 15, 0, 15, 255, 25, 0, 2, 0, 0, 0, 2, 0, 0, 3, 255, 23, 0, 2, 255, 37, 0,
255, 17, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 15, 2, 255, 12, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 5, 0, 2, 255, 4, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 8, 0, 15, 255, 11, 0, 3, 0, 0, 0, 2, 255, 13, 0, 15, 255, 13, 0, 3, 255, 18, 0, 3, 255, 55, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 41, 0, 2, 255, 20, 0, 15, 255, 5, 0, 2, 15, 255, 19, 0, 3, 255, 5, 0, 2, 0, 0, 0, 15, 2, 2, 255, 19, 0, 3, 255, 4, 0, 2, 15, 0, 2, 0, 2, 255, 28, 0, 2, 255, 31, 0, 2, 255, 33, 0,
0, 0, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 24, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 15, 255, 4, 0, 15, 255, 20, 0, 3, 0, 15, 0, 2, 2, 255, 4, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 6, 0, 2, 255, 17, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 6, 0, 15, 255, 22, 0, 15, 2, 3, 0, 0, 15, 0, 0, 2, 255, 29, 0, 2, 255, 27, 0, 2, 255, 4, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 40, 0,
0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 16, 0, 15, 2, 0, 15, 0, 0, 3, 255, 8, 0, 2, 255, 13, 0, 2, 15, 0, 0, 0, 2, 255, 5, 0, 2, 255, 15, 0, 15, 2, 255, 14, 0, 2, 255, 14, 0, 3, 0, 0, 0, 15, 255, 27, 0, 3, 0, 0, 0, 2, 255, 19, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 70, 0, 2, 15, 3, 255, 16, 0, 2, 0, 0, 0, 2, 255, 4, 0, 2, 255, 5, 0, 3, 255, 16, 0, 2, 15, 255, 4, 0, 3, 255, 31, 0, 3, 255, 24, 0, 15, 255, 73, 0,
255, 14, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 15, 255, 12, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 8, 0, 2, 0, 0, 2, 15, 255, 7, 0, 3, 255, 10, 0, 2, 255, 6, 0, 2, 0, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 8, 0, 2, 0, 0, 15, 255, 5, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 11, 0, 2, 255, 12, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 7, 0, 2, 255, 19, 0, 15, 255, 30, 0, 2, 255, 13, 0, 3, 255, 15, 0, 15, 2, 255, 14, 0, 3, 255, 15, 0, 2, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 34, 0,
255, 7, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 23, 0, 15, 2, 255, 6, 0, 2, 255, 21, 0, 3, 255, 7, 0, 2, 255, 15, 0, 3, 255, 7, 0, 3, 255, 8, 0, 15, 255, 6, 0, 3, 255, 7, 0, 3, 0, 0, 2, 0, 0, 0, 2, 255, 16, 0, 3, 255, 10, 0, 2, 255, 14, 0, 3, 255, 8, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 18, 0, 2, 15, 0, 0, 2, 255, 24, 0, 15, 255, 6, 0, 2, 255, 24, 0, 2, 255, 16, 0, 15, 255, 20, 0, 15, 255, 9, 0, 3, 255, 16, 0, 2, 255, 40, 0,
0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 30, 0, 2, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 8, 0, 15, 255, 6, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 14, 0, 3, 255, 8, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 23, 0, 2, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 4, 0, 3, 255, 9, 0, 15, 2, 15, 255, 19, 0, 15, 0, 2, 255, 9, 0, 2, 255, 20, 0, 2, 15, 255, 66, 0,
255, 10, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 15, 2, 255, 30, 0, 2, 2, 15, 255, 44, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 44, 0, 15, 0, 0, 15, 255, 26, 0, 3, 0, 0, 2, 0, 2, 255, 18, 0, 15, 3, 0, 15, 255, 4, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 2, 255, 8, 0, 2, 255, 22, 0, 2, 255, 34, 0,
255, 4, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 6, 0, 15, 0, 15, 255, 9, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 8, 0, 2, 0, 0, 15, 0, 0, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 4, 0, 2, 255, 25, 0, 2, 255, 31, 0, 2, 255, 45, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 5, 0, 15, 255, 14, 0, 3, 0, 0, 0, 2, 255, 7, 0, 15, 2, 0, 0, 2, 255, 15, 0, 3, 255, 5, 0, 15, 255, 27, 0, 15, 2, 0, 0, 2, 255, 5, 0, 15, 255, 24, 0, 15, 255, 5, 0, 3, 255, 24, 0, 3, 255, 36, 0,
255, 29, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 15, 0, 0, 3, 255, 11, 0, 3, 255, 14, 0, 15, 2, 2, 0, 2, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 15, 255, 14, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 2, 255, 23, 0, 2, 0, 2, 3, 0, 0, 0, 15, 15, 255, 19, 0, 3, 0, 2, 0, 15, 0, 15, 255, 5, 0, 2, 255, 19, 0, 3, 255, 4, 0, 2, 255, 67, 0,
255, 4, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 11, 0, 15, 255, 6, 0, 3, 255, 12, 0, 2, 255, 8, 0, 15, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 0, 2, 255, 13, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 0, 0, 2, 255, 8, 0, 3, 255, 19, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 10, 0, 15, 0, 15, 0, 3, 255, 20, 0, 15, 255, 6, 0, 2, 2, 0, 0, 3, 255, 17, 0, 15, 0, 0, 2, 0, 2, 3, 0, 0, 0, 2, 255, 19, 0, 15, 255, 4, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 36, 0,
255, 17, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 15, 0, 0, 0, 2, 0, 2, 255, 11, 0, 2, 255, 14, 0, 2, 255, 4, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 5, 0, 15, 255, 12, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 22, 0, 3, 255, 11, 0, 3, 255, 19, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 0, 0, 0, 15, 255, 23, 0, 15, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 15, 255, 17, 0, 2, 15, 0, 0, 2, 255, 26, 0, 15, 2, 2, 255, 13, 0, 3, 255, 15, 0, 2, 255, 6, 0, 15, 255, 8, 0, 3, 255, 23, 0, 3, 255, 33, 0,
0, 0, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 0, 0, 0, 15, 2, 255, 10, 0, 2, 255, 15, 0, 3, 0, 15, 0, 2, 255, 30, 0, 2, 15, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 15, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 6, 0, 2, 3, 0, 0, 2, 255, 18, 0, 15, 2, 3, 255, 9, 0, 2, 2, 255, 15, 0, 15, 0, 2, 255, 5, 0, 15, 255, 23, 0, 2, 255, 5, 0, 15, 0, 2, 255, 8, 0, 15, 255, 15, 0, 2, 255, 5, 0, 2, 255, 25, 0, 2, 255, 40, 0,
255, 67, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 16, 0, 2, 0, 0, 3, 255, 18, 0, 3, 255, 6, 0, 15, 2, 0, 0, 15, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 0, 0, 0, 2, 255, 6, 0, 15, 255, 4, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 6, 0, 2, 255, 31, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 15, 255, 10, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 93, 0, 2, 15, 0, 0, 0, 15, 255, 4, 0, 3, 255, 18, 0, 2, 255, 4, 0, 3, 0, 0, 2, 255, 4, 0, 3, 0, 0, 2, 15, 255, 19, 0, 3, 2, 255, 9, 0, 15, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 33, 0,
0, 0, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 5, 0, 15, 255, 12, 0, 3, 255, 13, 0, 2, 0, 0, 0, 2, 255, 5, 0, 15, 255, 7, 0, 3, 255, 12, 0, 15, 255, 6, 0, 3, 0, 0, 0, 2, 255, 14, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 12, 0, 15, 0, 0, 2, 255, 15, 0, 3, 255, 11, 0, 2, 255, 30, 0, 2, 255, 11, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 30, 0, 2, 0, 0, 0, 2, 255, 9, 0, 15, 255, 29, 0, 15, 2, 255, 27, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 36, 0,
255, 18, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 11, 0, 2, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 10, 0, 2, 255, 26, 0, 15, 255, 12, 0, 3, 255, 31, 0, 3, 255, 11, 0, 15, 255, 13, 0, 2, 15, 255, 11, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 0, 15, 255, 21, 0, 2, 0, 0, 3, 255, 4, 0, 15, 255, 4, 0, 2, 255, 17, 0, 15, 2, 255, 10, 0, 2, 255, 29, 0, 15, 255, 23, 0, 15, 255, 67, 0,
255, 7, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 12, 0, 15, 255, 4, 0, 15, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 5, 0, 2, 255, 5, 0, 2, 15, 255, 18, 0, 2, 0, 0, 0, 15, 0, 2, 15, 255, 29, 0, 2, 2, 255, 13, 0, 2, 255, 4, 0, 3, 255, 27, 0, 15, 0, 0, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 0, 15, 0, 2, 0, 3, 255, 17, 0, 15, 255, 9, 0, 2, 0, 0, 0, 3, 255, 18, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 0, 15, 255, 21, 0, 2, 15, 0, 3, 255, 4, 0, 2, 2, 255, 22, 0, 2, 2, 255, 67, 0,
0, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 51, 0, 15, 255, 24, 0, 3, 255, 6, 0, 2, 0, 3, 0, 15, 2, 0, 0, 15, 255, 10, 0, 2, 255, 5, 0, 3, 255, 8, 0, 15, 255, 4, 0, 2, 255, 4, 0, 3, 255, 6, 0, 2, 255, 9, 0, 15, 2, 0, 0, 2, 255, 5, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 14, 0, 2, 255, 35, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 4, 0, 15, 255, 26, 0, 2, 255, 4, 0, 2, 255, 20, 0, 15, 2, 255, 7, 0, 3, 255, 26, 0, 15, 255, 4, 0, 3, 0, 0, 0, 2, 15, 3, 255, 20, 0, 2, 255, 10, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 33, 0,
255, 30, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 0, 0, 2, 255, 11, 0, 2, 255, 23, 0, 2, 0, 0, 0, 2, 15, 255, 23, 0, 15, 3, 15, 255, 21, 0, 3, 0, 0, 15, 2, 255, 4, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 0, 2, 0, 0, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 16, 0, 2, 0, 3, 0, 0, 15, 2, 255, 29, 0, 2, 0, 2, 255, 7, 0, 2, 0, 15, 255, 24, 0, 3, 255, 4, 0, 15, 255, 24, 0, 15, 0, 3, 255, 5, 0, 3, 255, 56, 0,
0, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 31, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 0, 0, 15, 0, 15, 255, 6, 0, 2, 0, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 0, 0, 0, 2, 0, 2, 255, 8, 0, 2, 255, 15, 0, 2, 255, 60, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 27, 0, 2, 0, 0, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 10, 0, 15, 0, 15, 2, 255, 17, 0, 3, 0, 0, 0, 2, 15, 255, 6, 0, 2, 255, 23, 0, 15, 2, 255, 64, 0,
255, 34, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 31, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 13, 0, 15, 255, 17, 0, 3, 255, 10, 0, 15, 2, 0, 2, 255, 5, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 15, 255, 4, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 44, 0, 15, 255, 25, 0, 2, 0, 0, 15, 2, 0, 2, 255, 21, 0, 15, 0, 2, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 8, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 33, 0,
255, 10, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 31, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 8, 0, 15, 255, 6, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 4, 0, 2, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 0, 2, 255, 4, 0, 15, 255, 15, 0, 3, 255, 14, 0, 2, 255, 5, 0, 15, 255, 10, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 0, 0, 15, 255, 18, 0, 2, 255, 9, 0, 3, 0, 0, 2, 255, 18, 0, 2, 255, 9, 0, 2, 255, 23, 0, 15, 2, 255, 5, 0, 15, 255, 21, 0, 15, 255, 7, 0, 2, 255, 62, 0
};
uint16_t animation_couple_rain_delays[] = {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60};
uint16_t animation_couple_rain_offsets[] = {0, 475, 718, 961, 1222, 1476, 1734, 2002, 2276, 2528, 2787, 3050, 3304, 3567, 3824, 4106, 4382, 4650, 4916, 5208, 5459, 5731, 5988, 6243, 6497, 6769, 7004, 7263, 7543, 7790, 8035, 8288, 8522};
AnimationData animation_couple_rain = {&animation_couple_rain_colors[0], &animation_couple_rain_data[0], &animation_couple_rain_offsets[0], &animation_couple_rain_delays[0], false, 15, 32, 32, 32};
uint8_t animation_couple_snow_colors[] PROGMEM = {0, 0, 0, 255, 255, 255, 255, 60, 0, 248, 230, 196, 67, 47, 9, 34, 178, 10, 0, 142, 246, 246, 0, 73, 92, 0, 0, 27, 0, 255};
uint8_t animation_couple_snow_data[] PROGMEM = {
2, 3, 255, 39, 2, 3, 255, 14, 2, 3, 255, 11, 2, 3, 255, 10, 2, 3, 255, 45, 2, 3, 255, 24, 2, 3, 255, 47, 2, 3, 255, 6, 2, 3, 255, 36, 2, 3, 255, 10, 2, 3, 255, 4, 2, 3, 255, 21, 2, 3, 255, 16, 2, 3, 255, 84, 2, 3, 255, 20, 2, 3, 255, 18, 2, 3, 255, 7, 2, 3, 255, 40, 2, 3, 255, 42, 2, 3, 255, 25, 2, 3, 255, 12, 2, 3, 255, 9, 2, 3, 255, 27, 2, 3, 255, 8, 2, 3, 255, 6, 2, 3, 2, 2, 2, 3, 255, 9, 2, 5, 2, 2, 2, 5, 255, 25, 2, 4, 4, 4, 2, 2, 2, 9, 9, 9, 255, 22, 2, 255, 5, 4, 2, 255, 5, 9, 255, 4, 2, 3, 255, 16, 2, 255, 5, 4, 2, 9, 10, 10, 5, 9, 255, 16, 2, 3, 255, 4, 2, 4, 6, 5, 6, 4, 2, 9, 6, 5, 6, 9, 255, 12, 2, 3, 255, 9, 2, 5, 5, 5, 2, 2, 10, 5, 5, 5, 10, 255, 7, 2, 3, 255, 14, 2, 7, 7, 7, 2, 2, 2, 11, 11, 11, 255, 22, 2, 4, 4, 7, 4, 4, 2, 9, 9, 11, 9, 255, 4, 2, 3, 255, 17, 2, 4, 4, 7, 4, 4, 9, 9, 9, 11, 9, 9, 255, 8, 2, 3, 2, 2, 2, 3, 255, 8, 2, 5, 8, 8, 8, 2, 5, 2, 9, 9, 9, 5, 255, 18, 2, 3, 2, 2, 2, 8, 2, 8, 2, 2, 2, 8, 2, 8, 255, 22, 2, 6, 6, 2, 6, 6, 2, 2, 6, 2, 6, 255, 12, 2, 255, 32, 3,
0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 56, 0,
255, 15, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 56, 0,
255, 7, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 255, 34, 0,
0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 255, 34, 0,
0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 39, 0,
255, 12, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 35, 0,
255, 24, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 35, 0,
0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 58, 0,
0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 38, 0,
255, 5, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 38, 0,
255, 11, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 60, 0,
255, 11, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 255, 32, 0,
0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 255, 32, 0,
0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 5, 255, 24, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 35, 0,
255, 9, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 35, 0,
0, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 40, 0,
0, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 40, 0,
255, 23, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 57, 0,
255, 6, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 33, 0,
255, 6, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 33, 0,
255, 19, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 54, 0,
255, 30, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 39, 0,
255, 9, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 37, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 34, 0,
0, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 34, 0,
0, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 57, 0,
255, 6, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 41, 0,
255, 6, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 5, 255, 8, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 34, 0,
255, 22, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 34, 0,
255, 22, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 39, 0,
255, 4, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 39, 0,
255, 4, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 37, 0
};
uint16_t animation_couple_snow_delays[] = {110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110};
uint16_t animation_couple_snow_offsets[] = {0, 291, 580, 875, 1162, 1443, 1728, 2023, 2310, 2583, 2864, 3151, 3445, 3746, 4035, 4320, 4609, 4905, 5205, 5502, 5803, 6108, 6417, 6722, 7011, 7295, 7583, 7884, 8189, 8486, 8779, 9068, 9354};
AnimationData animation_couple_snow = {&animation_couple_snow_colors[0], &animation_couple_snow_data[0], &animation_couple_snow_offsets[0], &animation_couple_snow_delays[0], false, 10, 32, 32, 32};
uint8_t animation_heart_colors[] PROGMEM = {0, 0, 0, 171, 33, 33, 255, 30, 0, 255, 106, 7};
uint8_t animation_heart_data[] PROGMEM = {
255, 167, 2, 3, 255, 5, 4, 3, 255, 4, 2, 3, 255, 5, 4, 3, 255, 13, 2, 255, 9, 4, 2, 2, 255, 9, 4, 255, 11, 2, 4, 4, 4, 5, 5, 255, 17, 4, 255, 9, 2, 3, 4, 4, 255, 4, 5, 255, 16, 4, 3, 255, 8, 2, 4, 4, 4, 255, 4, 5, 255, 17, 4, 255, 7, 2, 3, 4, 4, 4, 255, 4, 5, 255, 17, 4, 3, 255, 6, 2, 3, 255, 4, 4, 5, 5, 255, 18, 4, 3, 255, 6, 2, 3, 255, 24, 4, 3, 255, 6, 2, 3, 255, 24, 4, 3, 255, 7, 2, 255, 24, 4, 255, 8, 2, 3, 255, 22, 4, 3, 255, 9, 2, 3, 255, 20, 4, 3, 255, 11, 2, 255, 20, 4, 255, 13, 2, 255, 18, 4, 255, 15, 2, 255, 16, 4, 255, 17, 2, 255, 14, 4, 255, 19, 2, 255, 12, 4, 255, 21, 2, 255, 10, 4, 255, 23, 2, 255, 8, 4, 255, 25, 2, 255, 6, 4, 255, 27, 2, 255, 4, 4, 255, 29, 2, 4, 4, 255, 175, 2,
255, 136, 0, 255, 5, 3, 255, 6, 0, 255, 5, 3, 255, 15, 0, 4, 255, 5, 0, 4, 255, 4, 0, 4, 255, 5, 0, 4, 255, 75, 0, 4, 255, 22, 0, 4, 255, 39, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 62, 0, 4, 255, 30, 0, 4, 255, 10, 0, 3, 255, 32, 0, 3, 255, 18, 0, 3, 255, 13, 0, 3, 255, 16, 0, 3, 255, 15, 0, 3, 255, 14, 0, 3, 255, 17, 0, 3, 255, 12, 0, 3, 255, 19, 0, 3, 255, 10, 0, 3, 255, 21, 0, 3, 255, 8, 0, 3, 255, 23, 0, 3, 255, 6, 0, 3, 255, 25, 0, 3, 255, 4, 0, 3, 255, 27, 0, 3, 0, 0, 3, 255, 174, 0,
255, 103, 0, 255, 6, 3, 255, 6, 0, 255, 6, 3, 255, 13, 0, 255, 7, 4, 3, 255, 4, 0, 3, 255, 6, 4, 3, 255, 11, 0, 4, 4, 255, 7, 0, 3, 0, 0, 3, 255, 7, 0, 4, 3, 255, 9, 0, 4, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 3, 255, 8, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 9, 0, 5, 0, 0, 0, 4, 255, 28, 0, 5, 0, 4, 255, 89, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 23, 0, 3, 255, 7, 0, 4, 4, 255, 21, 0, 4, 255, 9, 0, 4, 255, 20, 0, 4, 255, 10, 0, 4, 4, 255, 18, 0, 4, 4, 255, 11, 0, 4, 4, 255, 16, 0, 4, 4, 255, 12, 0, 4, 4, 4, 255, 14, 0, 4, 4, 4, 255, 13, 0, 4, 4, 4, 255, 12, 0, 4, 4, 4, 255, 15, 0, 4, 4, 4, 255, 10, 0, 4, 4, 4, 255, 17, 0, 4, 4, 4, 255, 8, 0, 4, 4, 4, 255, 19, 0, 4, 4, 4, 255, 6, 0, 4, 4, 4, 255, 21, 0, 4, 4, 4, 255, 4, 0, 4, 4, 4, 255, 23, 0, 4, 4, 4, 0, 0, 4, 4, 4, 255, 25, 0, 3, 255, 4, 4, 3, 255, 141, 0,
255, 103, 0, 255, 6, 2, 255, 6, 0, 255, 6, 2, 255, 13, 0, 2, 2, 255, 5, 3, 2, 255, 4, 0, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 2, 255, 7, 0, 2, 0, 0, 2, 255, 7, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 8, 0, 2, 0, 0, 4, 0, 5, 255, 17, 0, 2, 255, 7, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 6, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 9, 0, 4, 0, 0, 0, 5, 255, 28, 0, 4, 0, 5, 255, 89, 0, 2, 255, 24, 0, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 7, 0, 2, 3, 255, 20, 0, 3, 2, 255, 9, 0, 3, 255, 20, 0, 3, 255, 10, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 25, 0, 255, 6, 2, 255, 141, 0,
255, 136, 0, 255, 5, 2, 255, 6, 0, 255, 5, 2, 255, 15, 0, 3, 255, 5, 0, 3, 255, 4, 0, 3, 255, 5, 0, 3, 255, 75, 0, 3, 255, 22, 0, 3, 255, 39, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 104, 0, 2, 255, 20, 0, 2, 255, 11, 0, 2, 255, 18, 0, 2, 255, 13, 0, 2, 255, 16, 0, 2, 255, 15, 0, 2, 255, 14, 0, 2, 255, 17, 0, 2, 255, 12, 0, 2, 255, 19, 0, 2, 255, 10, 0, 2, 255, 21, 0, 2, 255, 8, 0, 2, 255, 23, 0, 2, 255, 6, 0, 2, 255, 25, 0, 2, 255, 4, 0, 2, 255, 27, 0, 2, 0, 0, 2, 255, 174, 0,
255, 135, 0, 3, 255, 5, 4, 3, 255, 4, 0, 3, 255, 5, 4, 3, 255, 13, 0, 3, 4, 255, 5, 0, 4, 3, 0, 0, 3, 4, 255, 5, 0, 4, 3, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 4, 0, 5, 0, 0, 0, 4, 255, 16, 0, 4, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 0, 5, 0, 4, 255, 18, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 3, 4, 255, 20, 0, 4, 3, 255, 9, 0, 4, 255, 20, 0, 4, 255, 11, 0, 4, 255, 18, 0, 4, 255, 12, 0, 3, 4, 255, 16, 0, 4, 3, 255, 13, 0, 3, 4, 255, 14, 0, 4, 3, 255, 15, 0, 3, 4, 255, 12, 0, 4, 3, 255, 17, 0, 3, 4, 255, 10, 0, 4, 3, 255, 19, 0, 3, 4, 255, 8, 0, 4, 3, 255, 21, 0, 3, 4, 255, 6, 0, 4, 3, 255, 23, 0, 3, 4, 255, 4, 0, 4, 3, 255, 26, 0, 4, 0, 0, 4, 255, 29, 0, 3, 3, 255, 143, 0,
255, 135, 0, 255, 7, 2, 255, 4, 0, 255, 7, 2, 255, 13, 0, 2, 2, 255, 6, 3, 2, 0, 0, 2, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 3, 255, 7, 0, 3, 2, 2, 3, 255, 7, 0, 2, 2, 255, 9, 0, 2, 3, 0, 4, 0, 5, 255, 5, 0, 3, 3, 255, 9, 0, 2, 2, 255, 7, 0, 2, 2, 0, 4, 0, 0, 0, 5, 255, 16, 0, 2, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 0, 4, 0, 5, 255, 17, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 7, 0, 2, 2, 255, 20, 0, 2, 2, 255, 9, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 26, 0, 2, 3, 3, 2, 255, 29, 0, 2, 2, 255, 143, 0,
255, 167, 0, 3, 255, 5, 4, 255, 5, 0, 3, 255, 5, 4, 3, 255, 13, 0, 4, 255, 7, 0, 4, 0, 0, 4, 255, 7, 0, 4, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 3, 255, 22, 0, 3, 255, 8, 0, 4, 255, 22, 0, 4, 255, 7, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 4, 255, 22, 0, 4, 255, 8, 0, 3, 255, 22, 0, 3, 255, 9, 0, 3, 255, 20, 0, 3, 255, 11, 0, 4, 255, 18, 0, 4, 255, 13, 0, 4, 255, 16, 0, 4, 255, 15, 0, 4, 255, 14, 0, 4, 255, 17, 0, 4, 255, 12, 0, 4, 255, 19, 0, 4, 255, 10, 0, 4, 255, 21, 0, 4, 255, 8, 0, 4, 255, 23, 0, 4, 255, 6, 0, 4, 255, 25, 0, 4, 255, 4, 0, 4, 255, 27, 0, 4, 0, 0, 4, 255, 29, 0, 4, 4, 255, 175, 0,
255, 136, 0, 255, 5, 3, 255, 6, 0, 255, 5, 3, 255, 15, 0, 4, 255, 5, 0, 4, 255, 4, 0, 4, 255, 5, 0, 4, 255, 75, 0, 4, 255, 22, 0, 4, 255, 39, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 62, 0, 4, 255, 30, 0, 4, 255, 10, 0, 3, 255, 32, 0, 3, 255, 18, 0, 3, 255, 13, 0, 3, 255, 16, 0, 3, 255, 15, 0, 3, 255, 14, 0, 3, 255, 17, 0, 3, 255, 12, 0, 3, 255, 19, 0, 3, 255, 10, 0, 3, 255, 21, 0, 3, 255, 8, 0, 3, 255, 23, 0, 3, 255, 6, 0, 3, 255, 25, 0, 3, 255, 4, 0, 3, 255, 27, 0, 3, 0, 0, 3, 255, 174, 0,
255, 103, 0, 255, 6, 3, 255, 6, 0, 255, 6, 3, 255, 13, 0, 255, 7, 4, 3, 255, 4, 0, 3, 255, 6, 4, 3, 255, 11, 0, 4, 4, 255, 7, 0, 3, 0, 0, 3, 255, 7, 0, 4, 3, 255, 9, 0, 4, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 3, 255, 8, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 9, 0, 5, 0, 0, 0, 4, 255, 28, 0, 5, 0, 4, 255, 89, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 23, 0, 3, 255, 7, 0, 4, 4, 255, 21, 0, 4, 255, 9, 0, 4, 255, 20, 0, 4, 255, 10, 0, 4, 4, 255, 18, 0, 4, 4, 255, 11, 0, 4, 4, 255, 16, 0, 4, 4, 255, 12, 0, 4, 4, 4, 255, 14, 0, 4, 4, 4, 255, 13, 0, 4, 4, 4, 255, 12, 0, 4, 4, 4, 255, 15, 0, 4, 4, 4, 255, 10, 0, 4, 4, 4, 255, 17, 0, 4, 4, 4, 255, 8, 0, 4, 4, 4, 255, 19, 0, 4, 4, 4, 255, 6, 0, 4, 4, 4, 255, 21, 0, 4, 4, 4, 255, 4, 0, 4, 4, 4, 255, 23, 0, 4, 4, 4, 0, 0, 4, 4, 4, 255, 25, 0, 3, 255, 4, 4, 3, 255, 141, 0,
255, 103, 0, 255, 6, 2, 255, 6, 0, 255, 6, 2, 255, 13, 0, 2, 2, 255, 5, 3, 2, 255, 4, 0, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 2, 255, 7, 0, 2, 0, 0, 2, 255, 7, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 8, 0, 2, 0, 0, 4, 0, 5, 255, 17, 0, 2, 255, 7, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 6, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 9, 0, 4, 0, 0, 0, 5, 255, 28, 0, 4, 0, 5, 255, 89, 0, 2, 255, 24, 0, 2, 255, 6, 0, 2, 3, 255, 23, 0, 2, 255, 7, 0, 2, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 20, 0, 2, 255, 10, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 25, 0, 255, 6, 2, 255, 141, 0,
255, 136, 0, 255, 5, 2, 255, 6, 0, 255, 5, 2, 255, 15, 0, 3, 255, 5, 0, 3, 255, 4, 0, 3, 255, 5, 0, 3, 255, 75, 0, 3, 255, 22, 0, 3, 255, 39, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 62, 0, 3, 255, 30, 0, 3, 255, 10, 0, 2, 255, 32, 0, 2, 255, 18, 0, 2, 255, 13, 0, 2, 255, 16, 0, 2, 255, 15, 0, 2, 255, 14, 0, 2, 255, 17, 0, 2, 255, 12, 0, 2, 255, 19, 0, 2, 255, 10, 0, 2, 255, 21, 0, 2, 255, 8, 0, 2, 255, 23, 0, 2, 255, 6, 0, 2, 255, 25, 0, 2, 255, 4, 0, 2, 255, 27, 0, 2, 0, 0, 2, 255, 174, 0,
255, 135, 0, 3, 255, 5, 4, 3, 255, 4, 0, 3, 255, 5, 4, 3, 255, 13, 0, 3, 4, 255, 5, 0, 4, 3, 0, 0, 3, 4, 255, 5, 0, 4, 3, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 4, 0, 5, 0, 0, 0, 4, 255, 16, 0, 4, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 0, 5, 0, 4, 255, 18, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 3, 4, 255, 20, 0, 4, 3, 255, 9, 0, 4, 255, 20, 0, 4, 255, 11, 0, 4, 255, 18, 0, 4, 255, 12, 0, 3, 4, 255, 16, 0, 4, 3, 255, 13, 0, 3, 4, 255, 14, 0, 4, 3, 255, 15, 0, 3, 4, 255, 12, 0, 4, 3, 255, 17, 0, 3, 4, 255, 10, 0, 4, 3, 255, 19, 0, 3, 4, 255, 8, 0, 4, 3, 255, 21, 0, 3, 4, 255, 6, 0, 4, 3, 255, 23, 0, 3, 4, 255, 4, 0, 4, 3, 255, 26, 0, 4, 0, 0, 4, 255, 29, 0, 3, 3, 255, 143, 0,
255, 135, 0, 255, 7, 2, 255, 4, 0, 255, 7, 2, 255, 13, 0, 2, 2, 255, 6, 3, 2, 0, 0, 2, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 3, 255, 7, 0, 3, 2, 2, 3, 255, 7, 0, 2, 2, 255, 9, 0, 2, 3, 0, 4, 0, 5, 255, 5, 0, 3, 3, 255, 9, 0, 2, 2, 255, 7, 0, 2, 2, 0, 4, 0, 0, 0, 5, 255, 16, 0, 2, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 0, 4, 0, 5, 255, 17, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 7, 0, 2, 2, 255, 20, 0, 2, 2, 255, 9, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 26, 0, 2, 3, 3, 2, 255, 29, 0, 2, 2, 255, 143, 0,
255, 167, 0, 3, 255, 5, 4, 255, 5, 0, 3, 255, 5, 4, 3, 255, 13, 0, 4, 255, 7, 0, 4, 0, 0, 4, 255, 7, 0, 4, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 3, 255, 22, 0, 3, 255, 8, 0, 4, 255, 22, 0, 4, 255, 7, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 4, 255, 22, 0, 4, 255, 8, 0, 3, 255, 22, 0, 3, 255, 9, 0, 3, 255, 20, 0, 3, 255, 11, 0, 4, 255, 18, 0, 4, 255, 13, 0, 4, 255, 16, 0, 4, 255, 15, 0, 4, 255, 14, 0, 4, 255, 17, 0, 4, 255, 12, 0, 4, 255, 19, 0, 4, 255, 10, 0, 4, 255, 21, 0, 4, 255, 8, 0, 4, 255, 23, 0, 4, 255, 6, 0, 4, 255, 25, 0, 4, 255, 4, 0, 4, 255, 27, 0, 4, 0, 0, 4, 255, 29, 0, 4, 4, 255, 175, 0
};
uint16_t animation_heart_delays[] = {100, 100, 100, 100, 100, 100, 100, 400, 100, 100, 100, 100, 100, 100, 200};
uint16_t animation_heart_offsets[] = {0, 190, 344, 608, 875, 1025, 1291, 1588, 1790, 1944, 2208, 2473, 2627, 2893, 3190, 3392};
AnimationData animation_heart = {&animation_heart_colors[0], &animation_heart_data[0], &animation_heart_offsets[0], &animation_heart_delays[0], false, 4, 15, 32, 32};
extern AnimationData animation_koopa;
extern AnimationData animation_couple_rain;
extern AnimationData animation_couple_snow;
extern AnimationData animation_heart;
#endif

View File

@ -0,0 +1,23 @@
#ifndef effect_animation_H
#define effect_animation_H
#include "Effect.h"
#include "prototypes.h"
#include "my_fastled.h"
class AnimationEffect : public Effect {
private:
AnimationData *animation;
int frame = 0;
CRGB background_color;
int xOffset, yOffset;
long frameSince = 0;
public:
AnimationEffect(AnimationData *anim);
AnimationEffect(AnimationData *anim, CRGB background_color);
AnimationEffect(AnimationData *anim, CRGB bg_color, int x, int y);
void loop();
void set(int i, CRGB* color);
uint16_t frameDelay(AnimationData* animation, int frame);
};
#endif

16
include/effect_bell.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef effect_bell_H
#define effect_bell_H
#include "Effect.h"
#include "functions.h"
class BellEffect : public Effect {
private:
CRGB color_on = CRGB(0xFFFF00);
CRGB color_off = CRGB(0x000000);
boolean invert = false;
public:
void loop();
};
#endif

View File

@ -0,0 +1,24 @@
#ifndef effect_big_clock_H
#define effect_big_clock_H
#include "Effect.h"
class BigClockEffect : public Effect {
private:
CRGB color_h = CRGB(0xFF0000);
CRGB color_m = CRGB(0x00FF00);
CRGB color_colon = CRGB(0xFFFF00);
void drawNumber(uint8_t number, int x, int y, CRGB color);
void drawText(char *text, int x, int y, CRGB color);
unsigned char* font_char(unsigned char* font, char c);
void drawSprite(unsigned char* sprite, int xOffset, int yOffset, CRGB color);
public:
void loop();
};
#endif

17
include/effect_clock.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef effect_clock_H
#define effect_clock_H
#include "Effect.h"
#include "prototypes.h"
#include <FastLED.h>
class ClockEffect : public Effect {
private:
Window window = {0, LED_HEIGHT - 6, LED_WIDTH, 6};
public:
void loop();
void loop(boolean invert, CRGB fg_color, CRGB bg_color);
};
#endif

20
include/effect_cycle.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef effect_cycle_H
#define effect_cycle_H
#include "Effect.h"
#include "effects.h"
class CycleEffect : public Effect {
private:
Effect* effect;
long effectSince = 0;
public:
void changeEffect();
boolean can_be_shown_with_clock();
boolean clock_as_mask();
void loop();
};
#endif

39
include/effect_matrix.h Normal file
View File

@ -0,0 +1,39 @@
#ifndef effect_matrix_H
#define effect_matrix_H
#include "prototypes.h"
#include "Effect.h"
#include "config.h"
#include "my_fastled.h"
class MatrixEffectColumn {
private:
int x, y;
int length;
Window* window;
int speed;
boolean running;
long last_move = 0;
public:
MatrixEffectColumn();
MatrixEffectColumn(Window* win, int xPos);
void start();
void advance();
void draw();
void loop();
};
class MatrixEffect : public Effect {
private:
MatrixEffectColumn columns[LED_WIDTH];
public:
boolean can_be_shown_with_clock();
MatrixEffect();
void loop();
};
#endif

View File

@ -0,0 +1,13 @@
#ifndef effect_multi_dynamic_H
#define effect_multi_dynamic_H
#include "effect_single_dynamic.h"
class MultiDynamicEffect : public SingleDynamicEffect {
protected:
int getLoopTime();
public:
void update();
};
#endif

View File

@ -0,0 +1,37 @@
#ifndef effect_sinematrix3_H
#define effect_sinematrix3_H
#include "prototypes.h"
#include "functions.h"
#include "Effect.h"
class Sinematrix3Effect : public Effect {
private:
double pangle = 0;
double angle = 0;
double sx = 0;
double sy = 0;
double tx = 0;
double ty = 0;
double cx = 0;
double cy = 0;
double rcx = 0;
double rcy = 0;
double angle2 = 0;
double sx2 = 0;
double sy2 = 0;
double tx2 = 0;
double ty2 = 0;
double basecol = 0;
double fx = 1.0 / (LED_WIDTH / PI);
double fy = 1.0 / (LED_HEIGHT / PI);
Matrix rotate;
public:
boolean supports_window = true;
boolean can_be_shown_with_clock();
boolean clock_as_mask();
void loop();
};
#endif

View File

@ -0,0 +1,21 @@
#ifndef effect_single_dynamic_H
#define effect_single_dynamic_H
#include "Effect.h"
#include "config.h"
class SingleDynamicEffect : public Effect {
protected:
static const int factor = 2;
static const int tile_count = LED_WIDTH/factor * LED_HEIGHT/factor;
virtual int getLoopTime();
CRGB tiles[tile_count];
CRGB old_tiles[tile_count];
uint8_t blend = 0;
public:
SingleDynamicEffect();
virtual void update();
boolean can_be_shown_with_clock();
virtual void loop();
};
#endif

16
include/effect_static.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef effect_static_H
#define effect_static_H
#include "Effect.h"
#include "my_fastled.h"
class StaticEffect : public Effect {
private:
CRGB color;
public:
StaticEffect(CRGB col);
boolean supports_window = true;
void loop();
};
#endif

16
include/effect_twirl.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef effect_twirl_H
#define effect_twirl_H
#include "Effect.h"
#include <Arduino.h>
class TwirlEffect : public Effect {
private:
uint8_t angleOffset = 0;
double center_x = 8;
double center_y = 8;
public:
void loop();
};
#endif

17
include/effects.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef effects_H
#define effects_H
#include <SimpleList.h>
#include "EffectEntry.h"
#include "Effect.h"
#include "effect_clock.h"
extern SimpleList<EffectEntry>* effects;
extern SimpleList<Effect*>* cycle_effects;
extern Effect* current_effect;
extern ClockEffect effect_clock;
void setup_effects();
#endif

51
include/functions.h Normal file
View File

@ -0,0 +1,51 @@
#ifndef functions_H
#define functions_H
#include "prototypes.h"
#include "my_fastled.h"
#include "config.h"
int XYsafe(int x, int y);
void setPixel(int x, int y, CRGB color);
void setPixel(int i, CRGB color);
void setPixel(Window win, int x, int y, CRGB color);
void clear(Window window, CRGB color);
void clear(Window window);
void clear();
inline double sines(double x, double y) {
return ((cos(x) * sin(y)) * 0.5) + 0.5;
}
inline double basefield(double x, double y) {
return (cos(x) * sin(y) * cos(sqrt((x*x) + (y*y))));
}
inline double addmod(double x, double mod, double delta) {
x = x + delta;
while( x >= mod ) x -= mod;
while( x < 0.0 ) x += mod;
return x;
}
inline double addmodpi(double x, double delta) {
return addmod(x, 2*PI, delta);
}
struct Matrix multiply(struct Matrix m1, struct Matrix m2);
struct Vector multiply(struct Matrix m, struct Vector v);
struct Vector add(struct Vector v1, struct Vector v2);
#endif

View File

@ -1,6 +1,7 @@
#ifndef my_fastled_H
#define my_fastled_H
#define FASTLED_INTERNAL
#include <FastLED.h>
#include "config.h"

15
include/my_mqtt.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef my_mqtt_H
#define my_mqtt_H
#include <PubSubClient.h>
//extern PubSubClient mqtt_client;
void mqtt_callback(char* complete_topic, byte* pl, unsigned int length);
boolean mqtt_connect();
void mqtt_setup();
void mqtt_loop();
#endif // mqtt_H

10
include/ntp.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef ntp_H
#define ntp_H
#include "NTPClient.h"
#include <WiFiUdp.h>
#include "config.h"
extern NTPClient ntpClient;
#endif

View File

@ -1,6 +1,8 @@
#ifndef prototypes_H
#define prototypes_H
#include <Arduino.h>
typedef struct {
uint8_t *colors;
uint8_t *data;
@ -13,4 +15,23 @@ typedef struct {
int h;
} AnimationData;
typedef struct {
uint8_t x;
uint8_t y;
uint8_t w;
uint8_t h;
} Window;
typedef struct Vector {
double x1;
double x2;
} Vector;
typedef struct Matrix {
double a11;
double a12;
double a21;
double a22;
} Matrix;
#endif

View File

@ -1,3 +1,8 @@
#ifndef text_H
#define text_H
#include "functions.h"
static unsigned char font5x7[] = {
0x00, 0x00, 0x00, 0x00, 0x00,// (space)
0x00, 0x00, 0x5F, 0x00, 0x00,// !
@ -123,26 +128,12 @@ static unsigned char numbers3x5[] = {
B11101, B10101, B11111, // 9
};
void drawTextSprite(Window window, unsigned char* sprite, int w, int h, int xPos, int yPos, CRGB color, boolean invert) {
for (byte y=0; y<h; y++) for (byte x=0; x<w; x++) {
bool on = (sprite[x]>>(h-1-y)&1)*255;
if (invert) on = !on;
if (on) setPixel(window, x+xPos, y+yPos, color);
}
}
void drawTextSprite(Window window, unsigned char* sprite, int w, int h, int xPos, int yPos, CRGB color, boolean invert);
void drawChar(Window window, unsigned char* font, int w, int h, int x, int y, char c, CRGB color) {
unsigned char* sprite = &font[(c-32)*w];
drawTextSprite(window, sprite, w, h, x, y, color, false);
}
void drawChar(Window window, unsigned char* font, int w, int h, int x, int y, char c, CRGB color);
void drawDigit(Window window, unsigned char* font, int w, int h, int x, int y, int digit, CRGB color, boolean invert) {
unsigned char* sprite = &font[digit*w];
drawTextSprite(window, sprite, w, h, x, y, color, invert);
}
void drawDigit(Window window, unsigned char* font, int w, int h, int x, int y, int digit, CRGB color, boolean invert);
void drawText(Window window, char *font, int w, int h, char *text, int x, int y, CRGB color) {
for (int i = 0; i < strlen(text); i++) {
drawChar(window, font5x7, 5, 7, x+i*(w+1), y, text[i], color);
}
}
void drawText(Window window, char *font, int w, int h, char *text, int x, int y, CRGB color);
#endif

View File

@ -10,9 +10,17 @@
[platformio]
lib_dir = lib
[env:esp07]
env_default = ota
[env:ota]
platform = espressif8266
board = esp07
framework = arduino
upload_port = 10.10.2.78
upload_protocol = espota
[env:local]
platform = espressif8266
board = esp07
framework = arduino
upload_port = /dev/cu.wchusbserial1420

View File

@ -1,102 +1,3 @@
#pragma once
#include "Arduino.h"
#include <Udp.h>
#define SEVENZYYEARS 2208988800UL
#define NTP_PACKET_SIZE 48
#define NTP_DEFAULT_LOCAL_PORT 1337
class NTPClient {
private:
UDP* _udp;
bool _udpSetup = false;
const char* _poolServerName = "pool.ntp.org"; // Default time server
int _port = NTP_DEFAULT_LOCAL_PORT;
long _timeOffset = 0;
unsigned long _updateInterval = 60000; // In ms
unsigned long _currentEpoc = 0; // In s
unsigned long _lastUpdate = 0; // In ms
byte _packetBuffer[NTP_PACKET_SIZE];
void sendNTPPacket();
public:
NTPClient(UDP& udp);
NTPClient(UDP& udp, long timeOffset);
NTPClient(UDP& udp, const char* poolServerName);
NTPClient(UDP& udp, const char* poolServerName, long timeOffset);
NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
/**
* Set time server name
*
* @param poolServerName
*/
void setPoolServerName(const char* poolServerName);
/**
* Starts the underlying UDP client with the default local port
*/
void begin();
/**
* Starts the underlying UDP client with the specified local port
*/
void begin(int port);
/**
* This should be called in the main loop of your application. By default an update from the NTP Server is only
* made every 60 seconds. This can be configured in the NTPClient constructor.
*
* @return true on success, false on failure
*/
bool update();
/**
* This will force the update from the NTP Server.
*
* @return true on success, false on failure
*/
bool forceUpdate();
int getDay() const;
int getHours() const;
int getMinutes() const;
int getSeconds() const;
/**
* Changes the time offset. Useful for changing timezones dynamically
*/
void setTimeOffset(int timeOffset);
/**
* Set the update interval to another frequency. E.g. useful when the
* timeOffset should not be set in the constructor
*/
void setUpdateInterval(unsigned long updateInterval);
/**
* @return time formatted like `hh:mm:ss`
*/
String getFormattedTime() const;
/**
* @return time in seconds since Jan. 1, 1970
*/
unsigned long getEpochTime() const;
/**
* Stops the underlying UDP client
*/
void end();
};
/**
* The MIT License (MIT)
* Copyright (c) 2015 by Fabrice Weinberg
@ -118,6 +19,9 @@ class NTPClient {
* SOFTWARE.
*/
#include "NTPClient.h"
#include "my_fastled.h"
NTPClient::NTPClient(UDP& udp) {
this->_udp = &udp;
}
@ -162,8 +66,6 @@ bool NTPClient::forceUpdate() {
Serial.println("Update from NTP Server");
#endif
while(this->_udp->parsePacket() != 0) this->_udp->flush();
this->sendNTPPacket();
// Wait till data is there or timeout...

118
src/animations.cpp Normal file
View File

@ -0,0 +1,118 @@
#include "animations.h"
#include "prototypes.h"
uint8_t animation_koopa_colors[] PROGMEM = {182, 154, 17, 0, 0, 0, 48, 48, 48, 142, 4, 6, 254, 252, 255, 3, 1, 138, 17, 239, 18};
uint8_t animation_koopa_data[] PROGMEM = {
255, 4, 1, 6, 255, 14, 1, 6, 6, 6, 255, 12, 1, 2, 6, 6, 6, 255, 11, 1, 2, 2, 3, 6, 6, 2, 255, 10, 1, 2, 2, 3, 6, 6, 2, 1, 1, 8, 8, 8, 6, 1, 1, 1, 2, 3, 2, 6, 6, 2, 2, 1, 8, 3, 8, 8, 3, 6, 1, 1, 255, 7, 2, 1, 8, 8, 3, 3, 8, 8, 6, 1, 2, 2, 2, 4, 2, 2, 4, 8, 8, 3, 8, 8, 3, 8, 6, 1, 2, 2, 4, 2, 2, 2, 7, 8, 3, 255, 4, 8, 3, 8, 1, 1, 1, 255, 4, 2, 7, 3, 8, 3, 8, 8, 3, 8, 3, 2, 1, 1, 1, 2, 2, 2, 7, 8, 8, 8, 3, 3, 8, 8, 8, 255, 5, 1, 2, 2, 7, 7, 8, 3, 8, 8, 3, 8, 7, 7, 1, 1, 1, 255, 4, 5, 7, 7, 255, 4, 8, 7, 7, 1, 1, 1, 5, 5, 5, 4, 2, 2, 255, 6, 7, 2, 255, 6, 1, 255, 4, 2, 1, 5, 5, 5, 2, 2, 255, 6, 1, 2, 2, 2, 255, 4, 1, 2, 2, 2, 1,
255, 4, 0, 1, 255, 14, 0, 1, 0, 1, 255, 12, 0, 1, 255, 14, 0, 1, 0, 6, 0, 0, 1, 255, 18, 0, 255, 4, 1, 0, 0, 0, 1, 2, 0, 3, 0, 6, 0, 0, 1, 8, 0, 0, 6, 1, 0, 0, 0, 3, 0, 6, 6, 255, 4, 0, 3, 8, 8, 3, 6, 1, 255, 4, 0, 2, 0, 0, 2, 1, 0, 8, 3, 3, 8, 255, 5, 0, 2, 4, 0, 0, 4, 0, 8, 3, 0, 0, 3, 8, 6, 0, 2, 2, 4, 255, 4, 0, 8, 3, 8, 0, 0, 8, 3, 8, 1, 0, 0, 2, 255, 4, 0, 3, 0, 3, 8, 8, 3, 0, 3, 2, 0, 0, 0, 2, 0, 0, 0, 8, 0, 8, 3, 3, 8, 0, 8, 1, 0, 0, 0, 1, 2, 2, 7, 0, 8, 3, 0, 0, 3, 8, 0, 7, 0, 0, 255, 4, 1, 5, 7, 0, 255, 4, 8, 0, 7, 255, 6, 0, 5, 0, 0, 255, 6, 7, 255, 6, 0, 5, 5, 0, 0, 2, 2, 0, 5, 5, 0, 0, 2,
255, 4, 0, 6, 255, 14, 0, 6, 0, 6, 255, 12, 0, 2, 255, 14, 0, 2, 0, 3, 0, 0, 2, 255, 25, 0, 2, 3, 0, 6, 0, 2, 255, 11, 0, 2, 0, 2, 2, 255, 17, 0, 1, 255, 11, 0, 1, 1, 0, 0, 1, 255, 9, 0, 255, 4, 1, 255, 14, 0, 1, 1, 255, 14, 0, 2, 255, 35, 0, 2, 255, 14, 0, 2, 255, 14, 0, 2, 2, 0, 0, 1, 1, 0, 1, 1, 255, 3, 0,
255, 73, 0, 8, 8, 8, 6, 255, 11, 0, 8, 3, 0, 0, 3, 6, 255, 11, 0, 8, 3, 3, 8, 8, 6, 255, 4, 0, 4, 0, 0, 4, 8, 0, 3, 8, 8, 3, 255, 5, 0, 4, 2, 0, 0, 7, 0, 3, 8, 0, 0, 8, 3, 8, 0, 0, 0, 2, 2, 0, 0, 0, 3, 8, 3, 0, 0, 3, 8, 3, 2, 0, 0, 0, 2, 0, 0, 0, 8, 0, 8, 3, 3, 8, 0, 8, 1, 0, 0, 1, 1, 0, 0, 0, 7, 0, 3, 8, 8, 3, 0, 7, 7, 255, 4, 0, 1, 1, 2, 0, 7, 8, 0, 0, 8, 7, 0, 1, 255, 4, 0, 2, 2, 0, 2, 0, 255, 4, 7, 0, 2, 255, 4, 0, 2, 2, 0, 0, 5, 5, 1, 1, 2, 2, 2, 5, 5, 255, 4, 0, 1, 1, 5, 5, 5, 255, 4, 0, 255, 3, 5,
255, 4, 0, 1, 255, 14, 0, 1, 0, 1, 255, 12, 0, 1, 255, 14, 0, 1, 0, 6, 0, 0, 1, 255, 18, 0, 255, 4, 1, 0, 0, 0, 1, 2, 0, 3, 0, 6, 0, 0, 1, 8, 0, 0, 6, 1, 0, 0, 0, 3, 0, 6, 6, 255, 4, 0, 3, 8, 8, 3, 6, 1, 255, 4, 0, 2, 0, 0, 2, 1, 0, 8, 3, 3, 8, 255, 5, 0, 2, 4, 0, 0, 4, 0, 8, 3, 0, 0, 3, 8, 6, 0, 2, 2, 4, 255, 4, 0, 8, 3, 8, 0, 0, 8, 3, 8, 1, 0, 0, 2, 255, 4, 0, 3, 0, 3, 8, 8, 3, 0, 3, 2, 0, 0, 0, 2, 0, 0, 0, 8, 0, 8, 3, 3, 8, 0, 8, 8, 255, 4, 0, 2, 2, 7, 0, 8, 3, 0, 0, 3, 8, 0, 7, 255, 4, 0, 1, 1, 0, 7, 0, 255, 4, 8, 0, 7, 255, 4, 0, 1, 0, 0, 0, 2, 255, 6, 7, 2, 255, 4, 0, 255, 4, 2, 255, 4, 0, 2, 2, 2, 0, 0,
255, 4, 0, 6, 255, 14, 0, 6, 0, 6, 255, 12, 0, 2, 255, 14, 0, 2, 0, 3, 0, 0, 2, 255, 25, 0, 2, 3, 0, 6, 0, 2, 255, 11, 0, 2, 0, 2, 2, 255, 17, 0, 1, 255, 11, 0, 1, 1, 0, 0, 1, 255, 9, 0, 255, 4, 1, 255, 14, 0, 1, 1, 255, 14, 0, 2, 255, 12, 0, 1, 255, 36, 0, 1, 255, 10, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 1, 0, 2, 2
};
uint16_t animation_koopa_delays[] = {100, 100, 100, 100, 100, 100};
uint16_t animation_koopa_offsets[] = {0, 199, 390, 479, 640, 832, 926};
AnimationData animation_koopa = {&animation_koopa_colors[0], &animation_koopa_data[0], &animation_koopa_offsets[0], &animation_koopa_delays[0], false, 7, 6, 16, 16};
uint8_t animation_couple_rain_colors[] PROGMEM = {0, 0, 0, 2, 139, 218, 181, 171, 255, 255, 255, 255, 255, 76, 11, 220, 206, 180, 49, 49, 49, 21, 1, 175, 100, 27, 0, 81, 66, 37, 51, 25, 253, 46, 12, 0, 218, 2, 86, 37, 175, 253, 128, 104, 60};
uint8_t animation_couple_rain_data[] PROGMEM = {
255, 6, 2, 3, 255, 7, 2, 3, 255, 14, 2, 3, 255, 8, 2, 3, 255, 7, 2, 3, 255, 14, 2, 3, 255, 25, 2, 3, 255, 5, 2, 3, 255, 12, 2, 3, 255, 12, 2, 3, 255, 18, 2, 3, 255, 12, 2, 3, 255, 18, 2, 3, 255, 12, 2, 3, 255, 18, 2, 3, 255, 12, 2, 3, 255, 10, 2, 3, 255, 7, 2, 3, 255, 23, 2, 3, 255, 11, 2, 3, 255, 19, 2, 3, 255, 11, 2, 3, 255, 15, 2, 3, 2, 2, 2, 3, 255, 11, 2, 3, 255, 5, 2, 15, 255, 9, 2, 3, 2, 2, 2, 3, 255, 11, 2, 3, 2, 2, 2, 3, 255, 11, 2, 3, 255, 15, 2, 3, 5, 2, 15, 3, 255, 7, 2, 3, 2, 2, 2, 3, 255, 8, 2, 3, 255, 4, 2, 255, 7, 5, 255, 7, 2, 3, 2, 2, 2, 3, 255, 8, 2, 3, 2, 2, 2, 5, 5, 12, 12, 5, 12, 12, 5, 5, 255, 6, 2, 3, 255, 12, 2, 3, 2, 2, 5, 5, 12, 12, 5, 5, 5, 12, 12, 5, 5, 255, 5, 2, 3, 255, 12, 2, 3, 2, 4, 4, 9, 9, 12, 5, 5, 5, 12, 9, 9, 4, 4, 255, 4, 2, 3, 255, 8, 2, 3, 2, 2, 2, 3, 2, 4, 4, 9, 9, 9, 4, 4, 4, 9, 9, 9, 4, 4, 255, 13, 2, 3, 255, 11, 2, 9, 255, 6, 2, 3, 255, 12, 2, 3, 255, 7, 2, 6, 6, 6, 2, 9, 255, 6, 2, 3, 255, 12, 2, 3, 255, 7, 2, 6, 6, 6, 2, 9, 2, 10, 10, 10, 2, 2, 3, 255, 12, 2, 3, 255, 7, 2, 10, 10, 10, 2, 9, 255, 5, 10, 2, 3, 255, 19, 2, 255, 5, 6, 12, 10, 7, 7, 7, 10, 2, 3, 255, 6, 2, 3, 255, 13, 2, 11, 7, 11, 2, 12, 10, 11, 7, 11, 10, 255, 8, 2, 3, 255, 13, 2, 7, 7, 7, 2, 7, 10, 7, 7, 7, 10, 255, 8, 2, 3, 255, 6, 2, 3, 255, 6, 2, 255, 5, 6, 13, 13, 16, 13, 13, 255, 8, 2, 3, 255, 6, 2, 3, 255, 5, 2, 255, 4, 6, 2, 2, 2, 14, 14, 14, 255, 9, 2, 3, 255, 6, 2, 3, 255, 5, 2, 7, 10, 10, 10, 2, 2, 7, 14, 14, 14, 7, 255, 15, 2, 3, 255, 6, 2, 6, 6, 6, 2, 2, 255, 5, 14, 2, 2, 2, 15, 255, 11, 2, 3, 255, 6, 2, 6, 2, 6, 2, 2, 2, 7, 2, 7, 255, 6, 2, 15, 255, 15, 2, 8, 8, 2, 8, 8, 2, 2, 8, 2, 8, 255, 6, 2, 3, 255, 37, 2,
255, 19, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 21, 0, 2, 15, 255, 8, 0, 2, 255, 14, 0, 15, 0, 0, 0, 15, 2, 255, 15, 0, 3, 255, 14, 0, 2, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 50, 0, 15, 255, 5, 0, 3, 255, 5, 0, 15, 255, 20, 0, 2, 0, 15, 0, 0, 3, 255, 7, 0, 15, 255, 20, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 37, 0,
255, 6, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 15, 0, 2, 15, 0, 15, 0, 0, 0, 2, 0, 3, 255, 18, 0, 3, 0, 0, 2, 2, 0, 0, 2, 255, 4, 0, 15, 255, 7, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 11, 0, 15, 0, 2, 255, 18, 0, 2, 0, 0, 15, 255, 8, 0, 2, 2, 0, 15, 255, 19, 0, 2, 255, 10, 0, 2, 255, 23, 0, 3, 255, 31, 0, 3, 255, 34, 0,
0, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 255, 18, 0, 15, 255, 26, 0, 15, 2, 0, 0, 2, 0, 2, 255, 16, 0, 2, 255, 19, 0, 2, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 255, 19, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 23, 0, 15, 0, 2, 0, 0, 0, 15, 2, 3, 255, 18, 0, 3, 0, 0, 0, 2, 0, 0, 2, 255, 8, 0, 2, 15, 255, 14, 0, 3, 255, 5, 0, 15, 255, 7, 0, 2, 255, 25, 0, 15, 255, 5, 0, 2, 255, 59, 0,
255, 10, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 2, 15, 255, 5, 0, 2, 255, 5, 0, 3, 255, 12, 0, 15, 2, 255, 17, 0, 3, 255, 45, 0, 15, 255, 22, 0, 2, 255, 6, 0, 15, 255, 13, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 255, 12, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 36, 0, 2, 255, 5, 0, 2, 255, 26, 0, 15, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 2, 2, 15, 255, 4, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 2, 255, 23, 0, 3, 255, 41, 0,
0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 29, 0, 2, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 15, 255, 4, 0, 2, 255, 14, 0, 3, 0, 0, 15, 2, 0, 15, 0, 3, 255, 8, 0, 2, 255, 5, 0, 3, 255, 12, 0, 15, 2, 255, 17, 0, 3, 255, 10, 0, 15, 2, 255, 56, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 36, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 15, 255, 11, 0, 3, 255, 14, 0, 2, 255, 5, 0, 2, 0, 0, 15, 255, 4, 0, 15, 255, 25, 0, 2, 0, 0, 0, 15, 255, 20, 0, 15, 255, 11, 0, 3, 255, 25, 0, 2, 255, 34, 0,
255, 6, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 14, 0, 2, 255, 31, 0, 2, 255, 20, 0, 2, 3, 255, 21, 0, 2, 15, 0, 2, 15, 255, 5, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 0, 2, 0, 2, 255, 12, 0, 2, 255, 5, 0, 3, 255, 9, 0, 15, 0, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 12, 0, 2, 255, 22, 0, 3, 255, 31, 0, 3, 255, 28, 0, 2, 255, 7, 0, 2, 15, 255, 21, 0, 3, 255, 4, 0, 2, 0, 15, 0, 2, 2, 0, 0, 3, 255, 14, 0, 2, 0, 15, 0, 3, 255, 7, 0, 2, 255, 4, 0, 3, 255, 14, 0, 15, 2, 255, 72, 0,
255, 23, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 0, 0, 0, 15, 0, 15, 0, 2, 15, 255, 13, 0, 2, 255, 12, 0, 2, 0, 0, 2, 255, 15, 0, 2, 255, 21, 0, 3, 255, 31, 0, 3, 255, 18, 0, 3, 2, 255, 15, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 255, 23, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 10, 0, 15, 0, 2, 255, 22, 0, 3, 255, 5, 0, 2, 255, 20, 0, 15, 255, 4, 0, 3, 0, 15, 2, 255, 4, 0, 15, 255, 15, 0, 15, 0, 2, 255, 10, 0, 2, 255, 4, 0, 15, 255, 13, 0, 2, 0, 0, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 37, 0,
255, 16, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 7, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 2, 255, 7, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 7, 0, 2, 255, 12, 0, 3, 255, 10, 0, 2, 255, 7, 0, 2, 255, 5, 0, 15, 255, 8, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 35, 0, 3, 0, 0, 2, 255, 20, 0, 2, 255, 7, 0, 3, 0, 0, 15, 0, 2, 255, 14, 0, 15, 0, 0, 2, 2, 255, 5, 0, 2, 255, 5, 0, 2, 15, 255, 14, 0, 2, 255, 7, 0, 3, 255, 9, 0, 2, 255, 16, 0, 15, 255, 4, 0, 3, 255, 65, 0,
0, 0, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 7, 0, 15, 2, 0, 15, 255, 12, 0, 3, 255, 16, 0, 2, 2, 255, 6, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 38, 0, 2, 255, 31, 0, 2, 255, 5, 0, 15, 2, 0, 15, 255, 14, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 255, 16, 0, 15, 0, 2, 0, 0, 15, 255, 4, 0, 3, 255, 4, 0, 2, 255, 17, 0, 2, 2, 15, 0, 0, 0, 15, 255, 7, 0, 2, 255, 22, 0, 3, 255, 33, 0,
255, 11, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 10, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 14, 0, 15, 255, 5, 0, 3, 0, 0, 0, 2, 255, 22, 0, 2, 0, 0, 2, 15, 3, 255, 18, 0, 3, 255, 31, 0, 3, 255, 8, 0, 2, 255, 14, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 4, 0, 15, 255, 15, 0, 3, 255, 12, 0, 2, 0, 0, 2, 255, 21, 0, 15, 2, 255, 4, 0, 15, 255, 19, 0, 15, 2, 0, 0, 0, 15, 2, 2, 15, 0, 15, 255, 25, 0, 2, 0, 0, 0, 2, 0, 0, 3, 255, 23, 0, 2, 255, 37, 0,
255, 17, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 2, 255, 5, 0, 15, 2, 255, 12, 0, 3, 0, 0, 0, 2, 255, 13, 0, 3, 255, 5, 0, 2, 255, 4, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 8, 0, 15, 255, 11, 0, 3, 0, 0, 0, 2, 255, 13, 0, 15, 255, 13, 0, 3, 255, 18, 0, 3, 255, 55, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 41, 0, 2, 255, 20, 0, 15, 255, 5, 0, 2, 15, 255, 19, 0, 3, 255, 5, 0, 2, 0, 0, 0, 15, 2, 2, 255, 19, 0, 3, 255, 4, 0, 2, 15, 0, 2, 0, 2, 255, 28, 0, 2, 255, 31, 0, 2, 255, 33, 0,
0, 0, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 17, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 24, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 0, 0, 0, 2, 0, 15, 255, 4, 0, 15, 255, 20, 0, 3, 0, 15, 0, 2, 2, 255, 4, 0, 3, 255, 13, 0, 3, 0, 0, 0, 2, 255, 6, 0, 2, 255, 17, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 72, 0, 3, 255, 16, 0, 2, 255, 14, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 6, 0, 15, 255, 22, 0, 15, 2, 3, 0, 0, 15, 0, 0, 2, 255, 29, 0, 2, 255, 27, 0, 2, 255, 4, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 20, 0, 3, 255, 40, 0,
0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 15, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 9, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 16, 0, 15, 2, 0, 15, 0, 0, 3, 255, 8, 0, 2, 255, 13, 0, 2, 15, 0, 0, 0, 2, 255, 5, 0, 2, 255, 15, 0, 15, 2, 255, 14, 0, 2, 255, 14, 0, 3, 0, 0, 0, 15, 255, 27, 0, 3, 0, 0, 0, 2, 255, 19, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 70, 0, 2, 15, 3, 255, 16, 0, 2, 0, 0, 0, 2, 255, 4, 0, 2, 255, 5, 0, 3, 255, 16, 0, 2, 15, 255, 4, 0, 3, 255, 31, 0, 3, 255, 24, 0, 15, 255, 73, 0,
255, 14, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 15, 255, 12, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 8, 0, 2, 0, 0, 2, 15, 255, 7, 0, 3, 255, 10, 0, 2, 255, 6, 0, 2, 0, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 8, 0, 2, 0, 0, 15, 255, 5, 0, 2, 255, 4, 0, 3, 255, 8, 0, 2, 255, 11, 0, 2, 255, 12, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 7, 0, 2, 255, 19, 0, 15, 255, 30, 0, 2, 255, 13, 0, 3, 255, 15, 0, 15, 2, 255, 14, 0, 3, 255, 15, 0, 2, 2, 255, 5, 0, 3, 255, 31, 0, 3, 255, 34, 0,
255, 7, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 23, 0, 15, 2, 255, 6, 0, 2, 255, 21, 0, 3, 255, 7, 0, 2, 255, 15, 0, 3, 255, 7, 0, 3, 255, 8, 0, 15, 255, 6, 0, 3, 255, 7, 0, 3, 0, 0, 2, 0, 0, 0, 2, 255, 16, 0, 3, 255, 10, 0, 2, 255, 14, 0, 3, 255, 8, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 18, 0, 2, 15, 0, 0, 2, 255, 24, 0, 15, 255, 6, 0, 2, 255, 24, 0, 2, 255, 16, 0, 15, 255, 20, 0, 15, 255, 9, 0, 3, 255, 16, 0, 2, 255, 40, 0,
0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 255, 30, 0, 2, 2, 255, 21, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 255, 8, 0, 15, 255, 6, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 14, 0, 3, 255, 8, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 74, 0, 3, 255, 23, 0, 2, 3, 255, 6, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 4, 0, 3, 255, 9, 0, 15, 2, 15, 255, 19, 0, 15, 0, 2, 255, 9, 0, 2, 255, 20, 0, 2, 15, 255, 66, 0,
255, 10, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 15, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 13, 0, 3, 255, 9, 0, 2, 255, 21, 0, 3, 0, 0, 15, 2, 255, 30, 0, 2, 2, 15, 255, 44, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 27, 0, 3, 255, 44, 0, 15, 0, 0, 15, 255, 26, 0, 3, 0, 0, 2, 0, 2, 255, 18, 0, 15, 3, 0, 15, 255, 4, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 2, 255, 8, 0, 2, 255, 22, 0, 2, 255, 34, 0,
255, 4, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 15, 0, 2, 0, 0, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 0, 0, 0, 2, 255, 6, 0, 15, 0, 15, 255, 9, 0, 3, 255, 4, 0, 2, 255, 7, 0, 2, 255, 8, 0, 2, 0, 0, 15, 0, 0, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 18, 0, 2, 255, 4, 0, 2, 255, 25, 0, 2, 255, 31, 0, 2, 255, 45, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 255, 23, 0, 3, 0, 0, 0, 2, 255, 24, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 5, 0, 15, 255, 14, 0, 3, 0, 0, 0, 2, 255, 7, 0, 15, 2, 0, 0, 2, 255, 15, 0, 3, 255, 5, 0, 15, 255, 27, 0, 15, 2, 0, 0, 2, 255, 5, 0, 15, 255, 24, 0, 15, 255, 5, 0, 3, 255, 24, 0, 3, 255, 36, 0,
255, 29, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 2, 15, 0, 0, 3, 255, 11, 0, 3, 255, 14, 0, 15, 2, 2, 0, 2, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 15, 255, 14, 0, 3, 0, 0, 0, 2, 255, 18, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 14, 0, 3, 255, 31, 0, 3, 0, 2, 255, 21, 0, 3, 0, 0, 0, 2, 2, 255, 23, 0, 2, 0, 2, 3, 0, 0, 0, 15, 15, 255, 19, 0, 3, 0, 2, 0, 15, 0, 15, 255, 5, 0, 2, 255, 19, 0, 3, 255, 4, 0, 2, 255, 67, 0,
255, 4, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 11, 0, 15, 255, 6, 0, 3, 255, 12, 0, 2, 255, 8, 0, 15, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 15, 0, 3, 0, 2, 255, 13, 0, 2, 255, 15, 0, 3, 0, 0, 2, 0, 0, 0, 3, 0, 0, 2, 255, 8, 0, 3, 255, 19, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 255, 31, 0, 2, 255, 24, 0, 2, 255, 31, 0, 2, 255, 10, 0, 15, 0, 15, 0, 3, 255, 20, 0, 15, 255, 6, 0, 2, 2, 0, 0, 3, 255, 17, 0, 15, 0, 0, 2, 0, 2, 3, 0, 0, 0, 2, 255, 19, 0, 15, 255, 4, 0, 2, 0, 0, 3, 0, 0, 0, 2, 255, 20, 0, 3, 0, 0, 0, 2, 255, 36, 0,
255, 17, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 15, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 15, 0, 0, 0, 2, 0, 2, 255, 11, 0, 2, 255, 14, 0, 2, 255, 4, 0, 2, 255, 11, 0, 2, 255, 5, 0, 2, 255, 5, 0, 15, 255, 12, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 22, 0, 3, 255, 11, 0, 3, 255, 19, 0, 3, 255, 11, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 23, 0, 2, 0, 0, 0, 15, 255, 23, 0, 15, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 15, 255, 17, 0, 2, 15, 0, 0, 2, 255, 26, 0, 15, 2, 2, 255, 13, 0, 3, 255, 15, 0, 2, 255, 6, 0, 15, 255, 8, 0, 3, 255, 23, 0, 3, 255, 33, 0,
0, 0, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 18, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 0, 0, 0, 15, 2, 255, 10, 0, 2, 255, 15, 0, 3, 0, 15, 0, 2, 255, 30, 0, 2, 15, 255, 6, 0, 2, 255, 11, 0, 2, 255, 19, 0, 15, 255, 11, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 103, 0, 3, 255, 23, 0, 3, 255, 6, 0, 2, 3, 0, 0, 2, 255, 18, 0, 15, 2, 3, 255, 9, 0, 2, 2, 255, 15, 0, 15, 0, 2, 255, 5, 0, 15, 255, 23, 0, 2, 255, 5, 0, 15, 0, 2, 255, 8, 0, 15, 255, 15, 0, 2, 255, 5, 0, 2, 255, 25, 0, 2, 255, 40, 0,
255, 67, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 18, 0, 3, 255, 31, 0, 3, 255, 16, 0, 2, 0, 0, 3, 255, 18, 0, 3, 255, 6, 0, 15, 2, 0, 0, 15, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 0, 0, 0, 2, 255, 6, 0, 15, 255, 4, 0, 2, 255, 15, 0, 3, 0, 0, 0, 2, 255, 6, 0, 2, 255, 31, 0, 2, 255, 11, 0, 2, 255, 19, 0, 2, 15, 255, 10, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 93, 0, 2, 15, 0, 0, 0, 15, 255, 4, 0, 3, 255, 18, 0, 2, 255, 4, 0, 3, 0, 0, 2, 255, 4, 0, 3, 0, 0, 2, 15, 255, 19, 0, 3, 2, 255, 9, 0, 15, 2, 255, 22, 0, 2, 255, 31, 0, 2, 255, 33, 0,
0, 0, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 12, 0, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 31, 0, 2, 255, 5, 0, 15, 255, 12, 0, 3, 255, 13, 0, 2, 0, 0, 0, 2, 255, 5, 0, 15, 255, 7, 0, 3, 255, 12, 0, 15, 255, 6, 0, 3, 0, 0, 0, 2, 255, 14, 0, 3, 255, 12, 0, 3, 255, 8, 0, 2, 255, 9, 0, 3, 255, 5, 0, 3, 255, 12, 0, 15, 0, 0, 2, 255, 15, 0, 3, 255, 11, 0, 2, 255, 30, 0, 2, 255, 11, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 255, 30, 0, 2, 0, 0, 0, 2, 255, 9, 0, 15, 255, 29, 0, 15, 2, 255, 27, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 7, 0, 3, 0, 0, 2, 255, 20, 0, 3, 255, 36, 0,
255, 18, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 19, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 11, 0, 2, 2, 255, 18, 0, 2, 255, 5, 0, 2, 255, 10, 0, 2, 255, 26, 0, 15, 255, 12, 0, 3, 255, 31, 0, 3, 255, 11, 0, 15, 255, 13, 0, 2, 15, 255, 11, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 255, 5, 0, 3, 255, 31, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 0, 15, 255, 21, 0, 2, 0, 0, 3, 255, 4, 0, 15, 255, 4, 0, 2, 255, 17, 0, 15, 2, 255, 10, 0, 2, 255, 29, 0, 15, 255, 23, 0, 15, 255, 67, 0,
255, 7, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 8, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 8, 0, 3, 255, 9, 0, 3, 255, 6, 0, 2, 255, 12, 0, 15, 255, 4, 0, 15, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 5, 0, 2, 255, 5, 0, 2, 15, 255, 18, 0, 2, 0, 0, 0, 15, 0, 2, 15, 255, 29, 0, 2, 2, 255, 13, 0, 2, 255, 4, 0, 3, 255, 27, 0, 15, 0, 0, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 31, 0, 2, 255, 34, 0, 3, 255, 31, 0, 3, 0, 15, 0, 2, 0, 3, 255, 17, 0, 15, 255, 9, 0, 2, 0, 0, 0, 3, 255, 18, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 0, 15, 255, 21, 0, 2, 15, 0, 3, 255, 4, 0, 2, 2, 255, 22, 0, 2, 2, 255, 67, 0,
0, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 51, 0, 15, 255, 24, 0, 3, 255, 6, 0, 2, 0, 3, 0, 15, 2, 0, 0, 15, 255, 10, 0, 2, 255, 5, 0, 3, 255, 8, 0, 15, 255, 4, 0, 2, 255, 4, 0, 3, 255, 6, 0, 2, 255, 9, 0, 15, 2, 0, 0, 2, 255, 5, 0, 2, 255, 4, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 14, 0, 2, 255, 35, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 4, 0, 15, 255, 26, 0, 2, 255, 4, 0, 2, 255, 20, 0, 15, 2, 255, 7, 0, 3, 255, 26, 0, 15, 255, 4, 0, 3, 0, 0, 0, 2, 15, 3, 255, 20, 0, 2, 255, 10, 0, 3, 255, 22, 0, 3, 255, 4, 0, 2, 255, 23, 0, 2, 0, 0, 3, 255, 33, 0,
255, 30, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 0, 0, 2, 255, 11, 0, 2, 255, 23, 0, 2, 0, 0, 0, 2, 15, 255, 23, 0, 15, 3, 15, 255, 21, 0, 3, 0, 0, 15, 2, 255, 4, 0, 3, 255, 16, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 31, 0, 2, 0, 2, 0, 0, 0, 2, 255, 18, 0, 3, 255, 12, 0, 2, 255, 16, 0, 2, 0, 3, 0, 0, 15, 2, 255, 29, 0, 2, 0, 2, 255, 7, 0, 2, 0, 15, 255, 24, 0, 3, 255, 4, 0, 15, 255, 24, 0, 15, 0, 3, 255, 5, 0, 3, 255, 56, 0,
0, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 31, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 31, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 255, 5, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 0, 0, 15, 0, 15, 255, 6, 0, 2, 0, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 0, 0, 0, 2, 0, 2, 255, 8, 0, 2, 255, 15, 0, 2, 255, 60, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 70, 0, 2, 255, 27, 0, 2, 0, 0, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 255, 10, 0, 15, 0, 15, 2, 255, 17, 0, 3, 0, 0, 0, 2, 15, 255, 6, 0, 2, 255, 23, 0, 15, 2, 255, 64, 0,
255, 34, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 31, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 15, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 6, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 255, 6, 0, 3, 255, 15, 0, 3, 255, 13, 0, 15, 255, 17, 0, 3, 255, 10, 0, 15, 2, 0, 2, 255, 5, 0, 3, 255, 16, 0, 2, 255, 8, 0, 2, 15, 255, 4, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 9, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 21, 0, 2, 255, 44, 0, 15, 255, 25, 0, 2, 0, 0, 15, 2, 0, 2, 255, 21, 0, 15, 0, 2, 0, 2, 255, 5, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 8, 0, 2, 255, 18, 0, 3, 0, 0, 0, 2, 255, 33, 0,
255, 10, 0, 2, 255, 18, 0, 3, 255, 68, 0, 2, 255, 20, 0, 3, 255, 10, 0, 2, 255, 7, 0, 3, 0, 0, 0, 2, 255, 8, 0, 3, 255, 18, 0, 3, 0, 0, 0, 2, 255, 15, 0, 2, 255, 31, 0, 2, 255, 19, 0, 2, 255, 15, 0, 3, 255, 8, 0, 15, 255, 6, 0, 2, 255, 7, 0, 2, 255, 7, 0, 3, 255, 4, 0, 2, 255, 4, 0, 2, 0, 3, 255, 11, 0, 2, 255, 12, 0, 2, 0, 2, 255, 4, 0, 15, 255, 15, 0, 3, 255, 14, 0, 2, 255, 5, 0, 15, 255, 10, 0, 3, 255, 19, 0, 3, 255, 16, 0, 2, 255, 22, 0, 3, 255, 8, 0, 2, 0, 0, 0, 3, 255, 14, 0, 2, 0, 0, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 76, 0, 3, 255, 25, 0, 2, 255, 5, 0, 3, 255, 18, 0, 3, 255, 6, 0, 2, 255, 24, 0, 3, 255, 13, 0, 2, 255, 31, 0, 2, 255, 56, 0, 3, 255, 31, 0, 3, 255, 38, 0, 3, 0, 0, 15, 255, 18, 0, 2, 255, 9, 0, 3, 0, 0, 2, 255, 18, 0, 2, 255, 9, 0, 2, 255, 23, 0, 15, 2, 255, 5, 0, 15, 255, 21, 0, 15, 255, 7, 0, 2, 255, 62, 0
};
uint16_t animation_couple_rain_delays[] = {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60};
uint16_t animation_couple_rain_offsets[] = {0, 475, 718, 961, 1222, 1476, 1734, 2002, 2276, 2528, 2787, 3050, 3304, 3567, 3824, 4106, 4382, 4650, 4916, 5208, 5459, 5731, 5988, 6243, 6497, 6769, 7004, 7263, 7543, 7790, 8035, 8288, 8522};
AnimationData animation_couple_rain = {&animation_couple_rain_colors[0], &animation_couple_rain_data[0], &animation_couple_rain_offsets[0], &animation_couple_rain_delays[0], false, 15, 32, 32, 32};
uint8_t animation_couple_snow_colors[] PROGMEM = {0, 0, 0, 255, 255, 255, 255, 60, 0, 248, 230, 196, 67, 47, 9, 34, 178, 10, 0, 142, 246, 246, 0, 73, 92, 0, 0, 27, 0, 255};
uint8_t animation_couple_snow_data[] PROGMEM = {
2, 3, 255, 39, 2, 3, 255, 14, 2, 3, 255, 11, 2, 3, 255, 10, 2, 3, 255, 45, 2, 3, 255, 24, 2, 3, 255, 47, 2, 3, 255, 6, 2, 3, 255, 36, 2, 3, 255, 10, 2, 3, 255, 4, 2, 3, 255, 21, 2, 3, 255, 16, 2, 3, 255, 84, 2, 3, 255, 20, 2, 3, 255, 18, 2, 3, 255, 7, 2, 3, 255, 40, 2, 3, 255, 42, 2, 3, 255, 25, 2, 3, 255, 12, 2, 3, 255, 9, 2, 3, 255, 27, 2, 3, 255, 8, 2, 3, 255, 6, 2, 3, 2, 2, 2, 3, 255, 9, 2, 5, 2, 2, 2, 5, 255, 25, 2, 4, 4, 4, 2, 2, 2, 9, 9, 9, 255, 22, 2, 255, 5, 4, 2, 255, 5, 9, 255, 4, 2, 3, 255, 16, 2, 255, 5, 4, 2, 9, 10, 10, 5, 9, 255, 16, 2, 3, 255, 4, 2, 4, 6, 5, 6, 4, 2, 9, 6, 5, 6, 9, 255, 12, 2, 3, 255, 9, 2, 5, 5, 5, 2, 2, 10, 5, 5, 5, 10, 255, 7, 2, 3, 255, 14, 2, 7, 7, 7, 2, 2, 2, 11, 11, 11, 255, 22, 2, 4, 4, 7, 4, 4, 2, 9, 9, 11, 9, 255, 4, 2, 3, 255, 17, 2, 4, 4, 7, 4, 4, 9, 9, 9, 11, 9, 9, 255, 8, 2, 3, 2, 2, 2, 3, 255, 8, 2, 5, 8, 8, 8, 2, 5, 2, 9, 9, 9, 5, 255, 18, 2, 3, 2, 2, 2, 8, 2, 8, 2, 2, 2, 8, 2, 8, 255, 22, 2, 6, 6, 2, 6, 6, 2, 2, 6, 2, 6, 255, 12, 2, 255, 32, 3,
0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 56, 0,
255, 15, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 56, 0,
255, 7, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 255, 34, 0,
0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 255, 34, 0,
0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 39, 0,
255, 12, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 35, 0,
255, 24, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 35, 0,
0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 58, 0,
0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 31, 0, 3, 255, 38, 0,
255, 5, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 53, 0, 2, 255, 38, 0,
255, 11, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 60, 0,
255, 11, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 20, 0, 3, 255, 6, 0, 3, 255, 32, 0,
0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 12, 0, 3, 255, 14, 0, 2, 255, 6, 0, 2, 255, 32, 0,
0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 5, 255, 24, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 18, 0, 3, 255, 35, 0,
255, 9, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 35, 0,
0, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 31, 0, 3, 255, 40, 0,
0, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 31, 0, 3, 255, 16, 0, 2, 255, 40, 0,
255, 23, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 7, 0, 2, 255, 57, 0,
255, 6, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 31, 0, 3, 255, 33, 0,
255, 6, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 33, 0,
255, 19, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 13, 0, 3, 255, 10, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 54, 0,
255, 30, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 26, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 39, 0,
255, 9, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 12, 0, 2, 255, 37, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 4, 0, 2, 255, 21, 0, 2, 255, 4, 0, 3, 255, 34, 0,
0, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 10, 0, 3, 255, 16, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 31, 0, 3, 255, 22, 0, 2, 255, 34, 0,
0, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 19, 0, 2, 255, 11, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 57, 0,
255, 6, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 41, 0,
255, 6, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 5, 0, 5, 255, 8, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 34, 0,
255, 22, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 13, 0, 3, 255, 8, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 11, 0, 3, 255, 24, 0, 2, 255, 34, 0,
255, 22, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 13, 0, 2, 255, 13, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 11, 0, 2, 255, 4, 0, 3, 255, 14, 0, 3, 255, 39, 0,
255, 4, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 17, 0, 3, 0, 0, 3, 255, 10, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 7, 0, 2, 255, 14, 0, 2, 255, 39, 0,
255, 4, 0, 2, 255, 4, 0, 3, 255, 5, 0, 2, 255, 8, 0, 3, 255, 11, 0, 3, 255, 10, 0, 3, 255, 13, 0, 2, 255, 24, 0, 2, 255, 6, 0, 3, 255, 24, 0, 3, 255, 15, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 6, 0, 3, 255, 4, 0, 2, 255, 10, 0, 2, 255, 4, 0, 2, 255, 15, 0, 3, 255, 5, 0, 2, 255, 4, 0, 3, 255, 4, 0, 3, 255, 6, 0, 2, 255, 14, 0, 3, 255, 16, 0, 3, 255, 52, 0, 2, 255, 20, 0, 2, 255, 10, 0, 3, 255, 7, 0, 2, 255, 7, 0, 2, 255, 4, 0, 3, 255, 18, 0, 3, 255, 7, 0, 3, 255, 8, 0, 2, 255, 31, 0, 3, 255, 10, 0, 2, 255, 25, 0, 2, 255, 5, 0, 3, 255, 6, 0, 2, 255, 9, 0, 2, 255, 8, 0, 3, 255, 12, 0, 3, 255, 5, 0, 2, 0, 0, 0, 3, 255, 4, 0, 2, 255, 6, 0, 2, 0, 0, 0, 2, 255, 11, 0, 3, 255, 8, 0, 3, 255, 6, 0, 3, 0, 0, 0, 3, 255, 39, 0, 2, 0, 0, 2, 255, 10, 0, 2, 255, 31, 0, 3, 255, 11, 0, 2, 255, 27, 0, 2, 0, 0, 0, 3, 255, 22, 0, 2, 255, 4, 0, 3, 255, 26, 0, 3, 255, 27, 0, 2, 255, 31, 0, 3, 255, 4, 0, 2, 0, 0, 0, 2, 255, 27, 0, 3, 0, 0, 0, 3, 255, 5, 0, 2, 255, 31, 0, 3, 255, 50, 0, 2, 255, 6, 0, 2, 255, 24, 0, 3, 255, 37, 0
};
uint16_t animation_couple_snow_delays[] = {110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110};
uint16_t animation_couple_snow_offsets[] = {0, 291, 580, 875, 1162, 1443, 1728, 2023, 2310, 2583, 2864, 3151, 3445, 3746, 4035, 4320, 4609, 4905, 5205, 5502, 5803, 6108, 6417, 6722, 7011, 7295, 7583, 7884, 8189, 8486, 8779, 9068, 9354};
AnimationData animation_couple_snow = {&animation_couple_snow_colors[0], &animation_couple_snow_data[0], &animation_couple_snow_offsets[0], &animation_couple_snow_delays[0], false, 10, 32, 32, 32};
uint8_t animation_heart_colors[] PROGMEM = {0, 0, 0, 171, 33, 33, 255, 30, 0, 255, 106, 7};
uint8_t animation_heart_data[] PROGMEM = {
255, 167, 2, 3, 255, 5, 4, 3, 255, 4, 2, 3, 255, 5, 4, 3, 255, 13, 2, 255, 9, 4, 2, 2, 255, 9, 4, 255, 11, 2, 4, 4, 4, 5, 5, 255, 17, 4, 255, 9, 2, 3, 4, 4, 255, 4, 5, 255, 16, 4, 3, 255, 8, 2, 4, 4, 4, 255, 4, 5, 255, 17, 4, 255, 7, 2, 3, 4, 4, 4, 255, 4, 5, 255, 17, 4, 3, 255, 6, 2, 3, 255, 4, 4, 5, 5, 255, 18, 4, 3, 255, 6, 2, 3, 255, 24, 4, 3, 255, 6, 2, 3, 255, 24, 4, 3, 255, 7, 2, 255, 24, 4, 255, 8, 2, 3, 255, 22, 4, 3, 255, 9, 2, 3, 255, 20, 4, 3, 255, 11, 2, 255, 20, 4, 255, 13, 2, 255, 18, 4, 255, 15, 2, 255, 16, 4, 255, 17, 2, 255, 14, 4, 255, 19, 2, 255, 12, 4, 255, 21, 2, 255, 10, 4, 255, 23, 2, 255, 8, 4, 255, 25, 2, 255, 6, 4, 255, 27, 2, 255, 4, 4, 255, 29, 2, 4, 4, 255, 175, 2,
255, 136, 0, 255, 5, 3, 255, 6, 0, 255, 5, 3, 255, 15, 0, 4, 255, 5, 0, 4, 255, 4, 0, 4, 255, 5, 0, 4, 255, 75, 0, 4, 255, 22, 0, 4, 255, 39, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 62, 0, 4, 255, 30, 0, 4, 255, 10, 0, 3, 255, 32, 0, 3, 255, 18, 0, 3, 255, 13, 0, 3, 255, 16, 0, 3, 255, 15, 0, 3, 255, 14, 0, 3, 255, 17, 0, 3, 255, 12, 0, 3, 255, 19, 0, 3, 255, 10, 0, 3, 255, 21, 0, 3, 255, 8, 0, 3, 255, 23, 0, 3, 255, 6, 0, 3, 255, 25, 0, 3, 255, 4, 0, 3, 255, 27, 0, 3, 0, 0, 3, 255, 174, 0,
255, 103, 0, 255, 6, 3, 255, 6, 0, 255, 6, 3, 255, 13, 0, 255, 7, 4, 3, 255, 4, 0, 3, 255, 6, 4, 3, 255, 11, 0, 4, 4, 255, 7, 0, 3, 0, 0, 3, 255, 7, 0, 4, 3, 255, 9, 0, 4, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 3, 255, 8, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 9, 0, 5, 0, 0, 0, 4, 255, 28, 0, 5, 0, 4, 255, 89, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 23, 0, 3, 255, 7, 0, 4, 4, 255, 21, 0, 4, 255, 9, 0, 4, 255, 20, 0, 4, 255, 10, 0, 4, 4, 255, 18, 0, 4, 4, 255, 11, 0, 4, 4, 255, 16, 0, 4, 4, 255, 12, 0, 4, 4, 4, 255, 14, 0, 4, 4, 4, 255, 13, 0, 4, 4, 4, 255, 12, 0, 4, 4, 4, 255, 15, 0, 4, 4, 4, 255, 10, 0, 4, 4, 4, 255, 17, 0, 4, 4, 4, 255, 8, 0, 4, 4, 4, 255, 19, 0, 4, 4, 4, 255, 6, 0, 4, 4, 4, 255, 21, 0, 4, 4, 4, 255, 4, 0, 4, 4, 4, 255, 23, 0, 4, 4, 4, 0, 0, 4, 4, 4, 255, 25, 0, 3, 255, 4, 4, 3, 255, 141, 0,
255, 103, 0, 255, 6, 2, 255, 6, 0, 255, 6, 2, 255, 13, 0, 2, 2, 255, 5, 3, 2, 255, 4, 0, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 2, 255, 7, 0, 2, 0, 0, 2, 255, 7, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 8, 0, 2, 0, 0, 4, 0, 5, 255, 17, 0, 2, 255, 7, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 6, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 9, 0, 4, 0, 0, 0, 5, 255, 28, 0, 4, 0, 5, 255, 89, 0, 2, 255, 24, 0, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 7, 0, 2, 3, 255, 20, 0, 3, 2, 255, 9, 0, 3, 255, 20, 0, 3, 255, 10, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 25, 0, 255, 6, 2, 255, 141, 0,
255, 136, 0, 255, 5, 2, 255, 6, 0, 255, 5, 2, 255, 15, 0, 3, 255, 5, 0, 3, 255, 4, 0, 3, 255, 5, 0, 3, 255, 75, 0, 3, 255, 22, 0, 3, 255, 39, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 104, 0, 2, 255, 20, 0, 2, 255, 11, 0, 2, 255, 18, 0, 2, 255, 13, 0, 2, 255, 16, 0, 2, 255, 15, 0, 2, 255, 14, 0, 2, 255, 17, 0, 2, 255, 12, 0, 2, 255, 19, 0, 2, 255, 10, 0, 2, 255, 21, 0, 2, 255, 8, 0, 2, 255, 23, 0, 2, 255, 6, 0, 2, 255, 25, 0, 2, 255, 4, 0, 2, 255, 27, 0, 2, 0, 0, 2, 255, 174, 0,
255, 135, 0, 3, 255, 5, 4, 3, 255, 4, 0, 3, 255, 5, 4, 3, 255, 13, 0, 3, 4, 255, 5, 0, 4, 3, 0, 0, 3, 4, 255, 5, 0, 4, 3, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 4, 0, 5, 0, 0, 0, 4, 255, 16, 0, 4, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 0, 5, 0, 4, 255, 18, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 3, 4, 255, 20, 0, 4, 3, 255, 9, 0, 4, 255, 20, 0, 4, 255, 11, 0, 4, 255, 18, 0, 4, 255, 12, 0, 3, 4, 255, 16, 0, 4, 3, 255, 13, 0, 3, 4, 255, 14, 0, 4, 3, 255, 15, 0, 3, 4, 255, 12, 0, 4, 3, 255, 17, 0, 3, 4, 255, 10, 0, 4, 3, 255, 19, 0, 3, 4, 255, 8, 0, 4, 3, 255, 21, 0, 3, 4, 255, 6, 0, 4, 3, 255, 23, 0, 3, 4, 255, 4, 0, 4, 3, 255, 26, 0, 4, 0, 0, 4, 255, 29, 0, 3, 3, 255, 143, 0,
255, 135, 0, 255, 7, 2, 255, 4, 0, 255, 7, 2, 255, 13, 0, 2, 2, 255, 6, 3, 2, 0, 0, 2, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 3, 255, 7, 0, 3, 2, 2, 3, 255, 7, 0, 2, 2, 255, 9, 0, 2, 3, 0, 4, 0, 5, 255, 5, 0, 3, 3, 255, 9, 0, 2, 2, 255, 7, 0, 2, 2, 0, 4, 0, 0, 0, 5, 255, 16, 0, 2, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 0, 4, 0, 5, 255, 17, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 7, 0, 2, 2, 255, 20, 0, 2, 2, 255, 9, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 26, 0, 2, 3, 3, 2, 255, 29, 0, 2, 2, 255, 143, 0,
255, 167, 0, 3, 255, 5, 4, 255, 5, 0, 3, 255, 5, 4, 3, 255, 13, 0, 4, 255, 7, 0, 4, 0, 0, 4, 255, 7, 0, 4, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 3, 255, 22, 0, 3, 255, 8, 0, 4, 255, 22, 0, 4, 255, 7, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 4, 255, 22, 0, 4, 255, 8, 0, 3, 255, 22, 0, 3, 255, 9, 0, 3, 255, 20, 0, 3, 255, 11, 0, 4, 255, 18, 0, 4, 255, 13, 0, 4, 255, 16, 0, 4, 255, 15, 0, 4, 255, 14, 0, 4, 255, 17, 0, 4, 255, 12, 0, 4, 255, 19, 0, 4, 255, 10, 0, 4, 255, 21, 0, 4, 255, 8, 0, 4, 255, 23, 0, 4, 255, 6, 0, 4, 255, 25, 0, 4, 255, 4, 0, 4, 255, 27, 0, 4, 0, 0, 4, 255, 29, 0, 4, 4, 255, 175, 0,
255, 136, 0, 255, 5, 3, 255, 6, 0, 255, 5, 3, 255, 15, 0, 4, 255, 5, 0, 4, 255, 4, 0, 4, 255, 5, 0, 4, 255, 75, 0, 4, 255, 22, 0, 4, 255, 39, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 62, 0, 4, 255, 30, 0, 4, 255, 10, 0, 3, 255, 32, 0, 3, 255, 18, 0, 3, 255, 13, 0, 3, 255, 16, 0, 3, 255, 15, 0, 3, 255, 14, 0, 3, 255, 17, 0, 3, 255, 12, 0, 3, 255, 19, 0, 3, 255, 10, 0, 3, 255, 21, 0, 3, 255, 8, 0, 3, 255, 23, 0, 3, 255, 6, 0, 3, 255, 25, 0, 3, 255, 4, 0, 3, 255, 27, 0, 3, 0, 0, 3, 255, 174, 0,
255, 103, 0, 255, 6, 3, 255, 6, 0, 255, 6, 3, 255, 13, 0, 255, 7, 4, 3, 255, 4, 0, 3, 255, 6, 4, 3, 255, 11, 0, 4, 4, 255, 7, 0, 3, 0, 0, 3, 255, 7, 0, 4, 3, 255, 9, 0, 4, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 3, 255, 8, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 9, 0, 5, 0, 0, 0, 4, 255, 28, 0, 5, 0, 4, 255, 89, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 23, 0, 3, 255, 7, 0, 4, 4, 255, 21, 0, 4, 255, 9, 0, 4, 255, 20, 0, 4, 255, 10, 0, 4, 4, 255, 18, 0, 4, 4, 255, 11, 0, 4, 4, 255, 16, 0, 4, 4, 255, 12, 0, 4, 4, 4, 255, 14, 0, 4, 4, 4, 255, 13, 0, 4, 4, 4, 255, 12, 0, 4, 4, 4, 255, 15, 0, 4, 4, 4, 255, 10, 0, 4, 4, 4, 255, 17, 0, 4, 4, 4, 255, 8, 0, 4, 4, 4, 255, 19, 0, 4, 4, 4, 255, 6, 0, 4, 4, 4, 255, 21, 0, 4, 4, 4, 255, 4, 0, 4, 4, 4, 255, 23, 0, 4, 4, 4, 0, 0, 4, 4, 4, 255, 25, 0, 3, 255, 4, 4, 3, 255, 141, 0,
255, 103, 0, 255, 6, 2, 255, 6, 0, 255, 6, 2, 255, 13, 0, 2, 2, 255, 5, 3, 2, 255, 4, 0, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 2, 255, 7, 0, 2, 0, 0, 2, 255, 7, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 9, 0, 2, 2, 255, 8, 0, 2, 0, 0, 4, 0, 5, 255, 17, 0, 2, 255, 7, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 6, 0, 2, 0, 0, 4, 0, 0, 0, 5, 255, 17, 0, 2, 255, 9, 0, 4, 0, 0, 0, 5, 255, 28, 0, 4, 0, 5, 255, 89, 0, 2, 255, 24, 0, 2, 255, 6, 0, 2, 3, 255, 23, 0, 2, 255, 7, 0, 2, 3, 255, 21, 0, 2, 255, 9, 0, 3, 255, 20, 0, 2, 255, 10, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 25, 0, 255, 6, 2, 255, 141, 0,
255, 136, 0, 255, 5, 2, 255, 6, 0, 255, 5, 2, 255, 15, 0, 3, 255, 5, 0, 3, 255, 4, 0, 3, 255, 5, 0, 3, 255, 75, 0, 3, 255, 22, 0, 3, 255, 39, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 6, 0, 3, 255, 24, 0, 3, 255, 62, 0, 3, 255, 30, 0, 3, 255, 10, 0, 2, 255, 32, 0, 2, 255, 18, 0, 2, 255, 13, 0, 2, 255, 16, 0, 2, 255, 15, 0, 2, 255, 14, 0, 2, 255, 17, 0, 2, 255, 12, 0, 2, 255, 19, 0, 2, 255, 10, 0, 2, 255, 21, 0, 2, 255, 8, 0, 2, 255, 23, 0, 2, 255, 6, 0, 2, 255, 25, 0, 2, 255, 4, 0, 2, 255, 27, 0, 2, 0, 0, 2, 255, 174, 0,
255, 135, 0, 3, 255, 5, 4, 3, 255, 4, 0, 3, 255, 5, 4, 3, 255, 13, 0, 3, 4, 255, 5, 0, 4, 3, 0, 0, 3, 4, 255, 5, 0, 4, 3, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 4, 0, 0, 5, 0, 4, 255, 17, 0, 4, 255, 7, 0, 3, 4, 0, 5, 0, 0, 0, 4, 255, 16, 0, 4, 3, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 5, 0, 0, 0, 4, 255, 17, 0, 4, 255, 6, 0, 4, 0, 0, 0, 5, 0, 4, 255, 18, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 4, 255, 24, 0, 4, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 3, 4, 255, 20, 0, 4, 3, 255, 9, 0, 4, 255, 20, 0, 4, 255, 11, 0, 4, 255, 18, 0, 4, 255, 12, 0, 3, 4, 255, 16, 0, 4, 3, 255, 13, 0, 3, 4, 255, 14, 0, 4, 3, 255, 15, 0, 3, 4, 255, 12, 0, 4, 3, 255, 17, 0, 3, 4, 255, 10, 0, 4, 3, 255, 19, 0, 3, 4, 255, 8, 0, 4, 3, 255, 21, 0, 3, 4, 255, 6, 0, 4, 3, 255, 23, 0, 3, 4, 255, 4, 0, 4, 3, 255, 26, 0, 4, 0, 0, 4, 255, 29, 0, 3, 3, 255, 143, 0,
255, 135, 0, 255, 7, 2, 255, 4, 0, 255, 7, 2, 255, 13, 0, 2, 2, 255, 6, 3, 2, 0, 0, 2, 2, 255, 5, 3, 2, 2, 255, 11, 0, 2, 3, 255, 7, 0, 3, 2, 2, 3, 255, 7, 0, 2, 2, 255, 9, 0, 2, 3, 0, 4, 0, 5, 255, 5, 0, 3, 3, 255, 9, 0, 2, 2, 255, 7, 0, 2, 2, 0, 4, 0, 0, 0, 5, 255, 16, 0, 2, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 4, 0, 0, 0, 5, 255, 16, 0, 3, 2, 255, 6, 0, 2, 3, 0, 0, 4, 0, 5, 255, 17, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 3, 255, 22, 0, 3, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 6, 0, 2, 2, 255, 22, 0, 2, 2, 255, 7, 0, 2, 2, 255, 20, 0, 2, 2, 255, 9, 0, 2, 3, 255, 18, 0, 3, 2, 255, 11, 0, 2, 3, 255, 16, 0, 3, 2, 255, 12, 0, 2, 2, 3, 255, 14, 0, 3, 2, 2, 255, 13, 0, 2, 2, 3, 255, 12, 0, 3, 2, 2, 255, 15, 0, 2, 2, 3, 255, 10, 0, 3, 2, 2, 255, 17, 0, 2, 2, 3, 255, 8, 0, 3, 2, 2, 255, 19, 0, 2, 2, 3, 255, 6, 0, 3, 2, 2, 255, 21, 0, 2, 2, 3, 255, 4, 0, 3, 2, 2, 255, 23, 0, 2, 2, 3, 0, 0, 3, 2, 2, 255, 26, 0, 2, 3, 3, 2, 255, 29, 0, 2, 2, 255, 143, 0,
255, 167, 0, 3, 255, 5, 4, 255, 5, 0, 3, 255, 5, 4, 3, 255, 13, 0, 4, 255, 7, 0, 4, 0, 0, 4, 255, 7, 0, 4, 255, 11, 0, 4, 255, 9, 0, 4, 4, 255, 9, 0, 4, 255, 9, 0, 3, 255, 22, 0, 3, 255, 8, 0, 4, 255, 22, 0, 4, 255, 7, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 6, 0, 3, 4, 255, 22, 0, 4, 3, 255, 7, 0, 4, 255, 22, 0, 4, 255, 8, 0, 3, 255, 22, 0, 3, 255, 9, 0, 3, 255, 20, 0, 3, 255, 11, 0, 4, 255, 18, 0, 4, 255, 13, 0, 4, 255, 16, 0, 4, 255, 15, 0, 4, 255, 14, 0, 4, 255, 17, 0, 4, 255, 12, 0, 4, 255, 19, 0, 4, 255, 10, 0, 4, 255, 21, 0, 4, 255, 8, 0, 4, 255, 23, 0, 4, 255, 6, 0, 4, 255, 25, 0, 4, 255, 4, 0, 4, 255, 27, 0, 4, 0, 0, 4, 255, 29, 0, 4, 4, 255, 175, 0
};
uint16_t animation_heart_delays[] = {100, 100, 100, 100, 100, 100, 100, 400, 100, 100, 100, 100, 100, 100, 200};
uint16_t animation_heart_offsets[] = {0, 190, 344, 608, 875, 1025, 1291, 1588, 1790, 1944, 2208, 2473, 2627, 2893, 3190, 3392};
AnimationData animation_heart = {&animation_heart_colors[0], &animation_heart_data[0], &animation_heart_offsets[0], &animation_heart_delays[0], false, 4, 15, 32, 32};

63
src/effect_animation.cpp Normal file
View File

@ -0,0 +1,63 @@
#include "effect_animation.h"
#include "functions.h"
AnimationEffect::AnimationEffect(AnimationData *anim) : AnimationEffect(anim, CRGB(0), 0, 0) {}
AnimationEffect::AnimationEffect(AnimationData *anim, CRGB background_color) : AnimationEffect(anim, background_color, 0, 0) {}
AnimationEffect::AnimationEffect(AnimationData *anim, CRGB bg_color, int x, int y) {
animation = anim;
background_color = bg_color;
xOffset = x;
yOffset = y;
}
void AnimationEffect::loop() {
Serial.printf("Animation.loop. Animation is %p.", (void *)animation);
CRGB colors[animation->color_count];
int led_index = 0;
uint8_t *color_data = new uint8_t[animation->color_count * 3];
memcpy_P(color_data, animation->colors, animation->color_count * 3);
for (int i = 0; i < animation->color_count; i++) colors[i] = CRGB(color_data[i * 3], color_data[i * 3 + 1], color_data[i * 3 + 2]);
free(color_data);
// Data is stored in progmem, so get it from there.
int length = animation->offsets[frame + 1] - animation->offsets[frame];
uint8_t *data = new uint8_t[length];
memcpy_P(data, animation->data + animation->offsets[frame], length);
for (int i = 0; i < length; i++) {
uint8_t color_index;
uint8_t count;
if (data[i] == 255) { // Run-length encoded data
color_index = data[i + 2];
count = data[i + 1];
i += 2;
} else {
color_index = data[i];
count = 1;
}
if (color_index == 0) { // color #0 = skip this pixels
led_index += count;
} else {
CRGB* color;
if (color_index == 1) {
color = &background_color;
} else if (color_index >= 2) {
color = &colors[color_index - 2];
}
for (int j = 0; j < count; j++) set(led_index++, color);
}
}
free(data);
if (frameSince == 0 || frameSince + frameDelay(animation, frame) < millis() || frameSince > millis()) {
frame = (frame + 1) % animation->frame_count;
frameSince = millis();
}
}
void AnimationEffect::set(int i, CRGB* color) {
setPixel(xOffset + (i % animation->w), yOffset + (i / animation->h), *color);
}
uint16_t AnimationEffect::frameDelay(AnimationData* animation, int frame) {
if (animation->individual_delays) return animation->delays[frame];
return animation->delays[0];
}

19
src/effect_bell.cpp Normal file
View File

@ -0,0 +1,19 @@
#include "Effect.h"
#include "functions.h"
#include "effect_bell.h"
#include "sprites.h"
void BellEffect::loop() {
Serial.println("This is Bell.loop()");
for (int y = 0; y < 16; y++) {
for (int x = 0; x < 2; x++) {
for (int z = 0; z < 8; z++) {
leds[XYsafe(x * 8 + z, y)] = sprite_bell[y * 2 + x] >> (7 - z) & 1 ^ invert ? color_on : color_off;
}
}
}
EVERY_N_MILLISECONDS(300) {
invert = !invert;
}
}

43
src/effect_big_clock.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "Effect.h"
#include "effect_big_clock.h"
#include "text.h"
#include "functions.h"
#include "ntp.h"
void BigClockEffect::drawNumber(uint8_t number, int x, int y, CRGB color) {
char buffer[7];
sprintf(buffer, "%02d", number);
drawText(buffer, x, y, color);
}
void BigClockEffect::drawText(char *text, int x, int y, CRGB color) {
for (int i = 0; i < strlen(text); i++) {
drawSprite(font_char(numbers4x7, text[i]), x + i * 4, y, color);
}
}
unsigned char* BigClockEffect::font_char(unsigned char* font, char c) {
return &font[(c - 48) * 4];
}
void BigClockEffect::drawSprite(unsigned char* sprite, int xOffset, int yOffset, CRGB color) {
for ( byte y = 0; y < 7; y++) {
for ( byte x = 0; x < 4; x++) {
bool on = (sprite[x] >> y & 1) * 255;
if (on) {
leds[ XYsafe(x + xOffset, y + yOffset) ] = color;
}
}
}
}
void BigClockEffect::loop() {
clear();
drawNumber(ntpClient.getHours(), 0, 0, color_h);
drawNumber(ntpClient.getMinutes(), 8, 0, color_m);
/*if (ntpClient.getSeconds() & 1) {
leds[XYsafe(13, 2)] = color_colon;
leds[XYsafe(13, 5)] = color_colon;
}*/
drawNumber(ntpClient.getSeconds(), 8, 8, color_colon);
}

30
src/effect_cycle.cpp Normal file
View File

@ -0,0 +1,30 @@
#include "effect_cycle.h"
void CycleEffect::changeEffect() {
Effect* new_effect;
do {
int new_id = random8(cycle_effects->size());
new_effect = cycle_effects->get(new_id);
} while (&new_effect == &effect);
effect = new_effect;
effectSince = millis();
}
boolean CycleEffect::can_be_shown_with_clock() {
return effect->can_be_shown_with_clock();
};
boolean CycleEffect::clock_as_mask() {
return effect->clock_as_mask();
};
void CycleEffect::loop() {
if (!effect) changeEffect(); // If this is the first run, we have to select an effect first!
effect->loop();
// Don't use EVERY_N_SECONDS(config_effect_cycle_time) here because that function isn't relly made
// to be used with changing values.
EVERY_N_SECONDS(1) {
if (effectSince + EFFECT_CYCLE_TIME*1000 < millis()) {
changeEffect();
}
}
}

60
src/effect_matrix.cpp Normal file
View File

@ -0,0 +1,60 @@
#include "effect_matrix.h"
#include "functions.h"
MatrixEffectColumn::MatrixEffectColumn() { }
MatrixEffectColumn::MatrixEffectColumn(Window* win, int xPos) {
window = win;
x = xPos;
start();
y = random8(0, win->h);
}
void MatrixEffectColumn::start() {
y=-1;
length = random8(EFFECT_MATRIX_LENGTH_MIN, EFFECT_MATRIX_LENGTH_MAX);
running = true;
speed = random8(EFFECT_MATRIX_SPEED_MIN, EFFECT_MATRIX_SPEED_MAX);
}
void MatrixEffectColumn::advance() {
y++;
if (y-length > window->h) running = false;
}
void MatrixEffectColumn::draw() {
for(int i=0; i<length; i++) {
CRGB color;
if (i==0) color=CHSV(85, 0, 192);
else color=CHSV(85, 255, 255/(length-1)*(length-i));
setPixel(*window, x, y-i, color);
}
}
void MatrixEffectColumn::loop() {
if (!running) {
if (random8() < 20) {
// Start the column again.
start();
}
} else {
if (millis() - last_move > speed) {
advance();
last_move = millis();
}
draw();
}
}
boolean MatrixEffect::can_be_shown_with_clock() { return true; };
MatrixEffect::MatrixEffect() {
for (int i=0; i<LED_WIDTH; i++) columns[i] = MatrixEffectColumn(&window, i);
}
void MatrixEffect::loop() {
clear(window);
for (int i=0; i<LED_WIDTH; i++) columns[i].loop();
}

View File

@ -0,0 +1,8 @@
#include "effect_multi_dynamic.h"
#include "effect_single_dynamic.h"
#include "config.h"
int MultiDynamicEffect::getLoopTime() { return EFFECT_MULTI_DYNAMIC_LOOP_TIME; }
void MultiDynamicEffect::update() {
for (int i=0; i<tile_count; i++) tiles[i] = CHSV(random8(), 180, 255);
}

View File

@ -0,0 +1,50 @@
#include "effect_sinematrix3.h"
#include "prototypes.h"
#include "functions.h"
#include "Effect.h"
boolean Sinematrix3Effect::can_be_shown_with_clock() { return true; };
boolean Sinematrix3Effect::clock_as_mask() { return true; };
void Sinematrix3Effect::loop() {
pangle = addmodpi( pangle, 0.0133 + (angle / 256) );
angle = cos(pangle) * PI;
sx = addmodpi( sx, 0.00673 );
sy = addmodpi( sy, 0.00437 );
tx = addmodpi( tx, 0.00239 );
ty = addmodpi( ty, 0.00293 );
cx = addmodpi( cx, 0.00197 );
cy = addmodpi( cy, 0.00227 );
rcx = (LED_WIDTH / 2) + (sin(cx) * LED_WIDTH);
rcy = (LED_HEIGHT / 2) + (sin(cy) * LED_HEIGHT);
angle2 = addmodpi( angle2, 0.0029 );
sx2 = addmodpi( sx2, 0.0041);
sy2 = addmodpi( sy2, 0.0031);
tx2 = addmodpi( tx2, 0.0011 );
ty2 = addmodpi( ty2, 0.0023 );
basecol = addmod( basecol, 1.0, 0.007 );
rotate = {
.a11 = cos(angle),
.a12 = -sin(angle),
.a21 = sin(angle),
.a22 = cos(angle)
};
Matrix zoom = {
.a11 = sin(sx) / 4.0 + 0.15,
.a12 = 0, //atan(cos(sx2)),
.a21 = 0, //atan(cos(sy2)),
.a22 = cos(sy) / 4.0 + 0.15
};
Vector translate = {
.x1 = sin(tx) * LED_WIDTH,
.x2 = sin(ty) * LED_HEIGHT
};
for ( int x = 0; x < LED_WIDTH; x++ ) {
for ( int y = 0; y < LED_HEIGHT; y++ ) {
Vector c = add(multiply( multiply(rotate, zoom), { .x1 = x - rcx, .x2 = y - rcy } ), translate);
int sat = (basecol + basefield(c.x1, c.x2)) * 255;
setPixel(window, x, y, CHSV(sat, 120, 255));
}
}
}

View File

@ -0,0 +1,26 @@
#include "effect_single_dynamic.h"
#include "functions.h"
SingleDynamicEffect::SingleDynamicEffect() {
for (int i=0; i<tile_count; i++) tiles[i] = CHSV(random8(), 180, 255);
}
int SingleDynamicEffect::getLoopTime() {
return EFFECT_SINGLE_DYNAMIC_LOOP_TIME;
}
void SingleDynamicEffect::update() {
tiles[random8(tile_count)] = CHSV(random8(), 180, 255);
}
boolean SingleDynamicEffect::can_be_shown_with_clock() { return true; }
void SingleDynamicEffect::loop() {
EVERY_N_MILLISECONDS(getLoopTime()) {
memcpy(old_tiles, tiles, tile_count*sizeof(CRGB));
blend = 0;
update();
}
for (int x=0; x<window.w; x++) for (int y=0; y<window.h; y++) {
int index = y/2 * window.w/2 + x/2;
setPixel(window, x, y, nblend(old_tiles[index], tiles[index], blend));
}
if (blend < 255) blend+=20;
}

13
src/effect_static.cpp Normal file
View File

@ -0,0 +1,13 @@
#include "effect_static.h"
#include "functions.h"
#include "my_fastled.h"
StaticEffect::StaticEffect(CRGB col) {
color = col;
}
void StaticEffect::loop() {
EVERY_N_SECONDS(1) {
clear(window, color);
}
}

11
src/effect_twirl.cpp Normal file
View File

@ -0,0 +1,11 @@
#include "effect_twirl.h"
#include "functions.h"
void TwirlEffect::loop() {
for (int x=0; x<window.w; x++) for (int y=0; y<window.h; y++) {
uint8_t angle = (x==center_x && y==center_y) ? 0 : atan2(y - center_y, x - center_x) / M_PI * 128 + 128 + angleOffset;
uint8_t brightness = sqrt16((center_x - x) * (center_x - x) + (center_y - y) * (center_y - y)) & 0xFF;
setPixel(window, x, y, CHSV(angle, (brightness<<5) & 0xFF, 255));
}
angleOffset += 1;
}

59
src/effects.cpp Normal file
View File

@ -0,0 +1,59 @@
#include "effects.h"
#include "animations.h"
#include "my_fastled.h"
#include "EffectEntry.h"
#include "effect_bell.h"
#include "effect_sinematrix3.h"
#include "effect_big_clock.h"
#include "effect_clock.h"
#include "effect_static.h"
#include "effect_animation.h"
#include "effect_single_dynamic.h"
#include "effect_multi_dynamic.h"
#include "effect_matrix.h"
#include "effect_twirl.h"
#include "effect_cycle.h"
SimpleList<EffectEntry>* effects;
SimpleList<Effect*>* cycle_effects;
ClockEffect effect_clock;
Sinematrix3Effect effect_sinematrix3;
BigClockEffect effect_big_clock;
//ClockEffect effect_clock; <-- generated as global variable in effects.h
BellEffect effect_bell;
StaticEffect effect_off(CRGB(0x000000));
AnimationEffect effect_anim_koopa(&animation_koopa, CRGB(0x000000), 0, 0);
AnimationEffect effect_anim_couple_rain(&animation_couple_rain, CRGB(0x000000), -8, -16);
SingleDynamicEffect effect_single_dynamic;
MultiDynamicEffect effect_multi_dynamic;
MatrixEffect effect_matrix;
CycleEffect effect_cycle;
TwirlEffect effect_twirl;
Effect* current_effect;
void setup_effects() {
effects = new SimpleList<EffectEntry>();
cycle_effects = new SimpleList<Effect*>();
effects->add((EffectEntry){"sinematrix3", (Effect *)&effect_sinematrix3});
effects->add((EffectEntry){"big_clock", (Effect *)&effect_big_clock});
effects->add((EffectEntry){"clock", (Effect *)&effect_clock});
effects->add((EffectEntry){"bell", (Effect *)&effect_bell});
effects->add((EffectEntry){"off", (Effect *)&effect_off});
effects->add((EffectEntry){"koopa", (Effect *)&effect_anim_koopa});
effects->add((EffectEntry){"couple_rain", (Effect *)&effect_anim_couple_rain});
effects->add((EffectEntry){"single_dynamic", (Effect *)&effect_single_dynamic});
effects->add((EffectEntry){"multi_dynamic", (Effect *)&effect_multi_dynamic});
effects->add((EffectEntry){"matrix", (Effect *)&effect_matrix});
effects->add((EffectEntry){"cycle", (Effect *)&effect_cycle});
effects->add((EffectEntry){"twirl", (Effect *)&effect_twirl});
cycle_effects->add(&effect_sinematrix3);
cycle_effects->add(&effect_single_dynamic);
cycle_effects->add(&effect_multi_dynamic);
cycle_effects->add(&effect_matrix);
current_effect = &effect_cycle;
}

View File

@ -1,436 +0,0 @@
#include <Arduino.h>
#include <FastLED.h>
#include "prototypes.h"
struct EffectEntry {
char* name;
Effect* effect;
};
class Bell : public Effect {
private:
CRGB color_on = CRGB(0xFFFF00);
CRGB color_off = CRGB(0x000000);
boolean invert = false;
public:
void loop() {
Serial.println("This is Bell.loop()");
for (int y = 0; y < 16; y++) {
for (int x = 0; x < 2; x++) {
for (int z = 0; z < 8; z++) {
leds[XYsafe(x * 8 + z, y)] = sprite_bell[y * 2 + x] >> (7 - z) & 1 ^ invert ? color_on : color_off;
}
}
}
EVERY_N_MILLISECONDS(300) {
invert = !invert;
}
}
};
class BigClock : public Effect {
private:
CRGB color_h = CRGB(0xFF0000);
CRGB color_m = CRGB(0x00FF00);
CRGB color_colon = CRGB(0xFFFF00);
void drawNumber(uint8_t number, int x, int y, CRGB color) {
char buffer[7];
sprintf(buffer, "%02d", number);
drawText(buffer, x, y, color);
}
void drawText(char *text, int x, int y, CRGB color) {
for (int i = 0; i < strlen(text); i++) {
drawSprite(font_char(numbers4x7, text[i]), x + i * 4, y, color);
}
}
unsigned char* font_char(unsigned char* font, char c) {
return &font[(c - 48) * 4];
}
void drawSprite(unsigned char* sprite, int xOffset, int yOffset, CRGB color) {
for ( byte y = 0; y < 7; y++) {
for ( byte x = 0; x < 4; x++) {
bool on = (sprite[x] >> y & 1) * 255;
if (on) {
leds[ XYsafe(x + xOffset, y + yOffset) ] = color;
}
}
}
}
public:
BigClock() {}
void loop() {
clear();
drawNumber(ntpClient.getHours(), 0, 0, color_h);
drawNumber(ntpClient.getMinutes(), 8, 0, color_m);
/*if (ntpClient.getSeconds() & 1) {
leds[XYsafe(13, 2)] = color_colon;
leds[XYsafe(13, 5)] = color_colon;
}*/
drawNumber(ntpClient.getSeconds(), 8, 8, color_colon);
}
};
class Clock : public Effect {
private:
Window window = {0, LED_HEIGHT - 6, LED_WIDTH, 6};
public:
Clock() {}
void loop() { loop(false, CRGB(0xFFFFFF), CRGB(0x000000)); }
void loop(boolean invert, CRGB fg_color, CRGB bg_color) {
if (!invert) {
clear(window, bg_color);
} else {
// Manually clear the needed parts
for(int i=0; i<window.w; i++) setPixel(window, i, 0, bg_color);
for(int y=0; y<6; y++) {
setPixel(window, 3, y, bg_color);
if (y!=2 && y!=4) {
setPixel(window, 7, y, bg_color);
}
setPixel(window, 8, y, bg_color);
setPixel(window, 12, y, bg_color);
}
fg_color = bg_color;
}
int h = ntpClient.getHours();
drawDigit(window, numbers3x5, 3, 5, 0, 1, h / 10, fg_color, invert);
drawDigit(window, numbers3x5, 3, 5, 4, 1, h % 10, fg_color, invert);
int m = ntpClient.getMinutes();
drawDigit(window, numbers3x5, 3, 5, 9, 1, m / 10, fg_color, invert);
drawDigit(window, numbers3x5, 3, 5, 13, 1, m % 10, fg_color, invert);
if (ntpClient.getSeconds() & 1) {
setPixel(window, 7, 2, fg_color);
setPixel(window, 7, 4, fg_color);
}
}
};
class Sinematrix3 : public Effect {
private:
double pangle = 0;
double angle = 0;
double sx = 0;
double sy = 0;
double tx = 0;
double ty = 0;
double cx = 0;
double cy = 0;
double rcx = 0;
double rcy = 0;
double angle2 = 0;
double sx2 = 0;
double sy2 = 0;
double tx2 = 0;
double ty2 = 0;
double basecol = 0;
double fx = 1.0 / (LED_WIDTH / PI);
double fy = 1.0 / (LED_HEIGHT / PI);
Matrix rotate;
public:
boolean supports_window = true;
boolean can_be_shown_with_clock() { return true; };
boolean clock_as_mask() { return true; };
Sinematrix3() {}
void loop() {
pangle = addmodpi( pangle, 0.0133 + (angle / 256) );
angle = cos(pangle) * PI;
sx = addmodpi( sx, 0.00673 );
sy = addmodpi( sy, 0.00437 );
tx = addmodpi( tx, 0.00239 );
ty = addmodpi( ty, 0.00293 );
cx = addmodpi( cx, 0.00197 );
cy = addmodpi( cy, 0.00227 );
rcx = (LED_WIDTH / 2) + (sin(cx) * LED_WIDTH);
rcy = (LED_HEIGHT / 2) + (sin(cy) * LED_HEIGHT);
angle2 = addmodpi( angle2, 0.0029 );
sx2 = addmodpi( sx2, 0.0041);
sy2 = addmodpi( sy2, 0.0031);
tx2 = addmodpi( tx2, 0.0011 );
ty2 = addmodpi( ty2, 0.0023 );
basecol = addmod( basecol, 1.0, 0.007 );
rotate = {
.a11 = cos(angle),
.a12 = -sin(angle),
.a21 = sin(angle),
.a22 = cos(angle)
};
Matrix zoom = {
.a11 = sin(sx) / 4.0 + 0.15,
.a12 = 0, //atan(cos(sx2)),
.a21 = 0, //atan(cos(sy2)),
.a22 = cos(sy) / 4.0 + 0.15
};
Vector translate = {
.x1 = sin(tx) * LED_WIDTH,
.x2 = sin(ty) * LED_HEIGHT
};
for ( int x = 0; x < LED_WIDTH; x++ ) {
for ( int y = 0; y < LED_HEIGHT; y++ ) {
Vector c = add(multiply( multiply(rotate, zoom), { .x1 = x - rcx, .x2 = y - rcy } ), translate);
int sat = (basecol + basefield(c.x1, c.x2)) * 255;
setPixel(window, x, y, CHSV(sat, 120, 255));
}
}
}
};
class Static : public Effect {
private:
CRGB color;
public:
Static(CRGB col) {
color = col;
}
boolean supports_window = true;
void loop() {
EVERY_N_SECONDS(1) {
clear(window, color);
}
}
};
class Animation : public Effect {
private:
AnimationData *animation;
int frame = 0;
CRGB background_color;
int xOffset, yOffset;
long frameSince = 0;
public:
Animation(AnimationData *anim) {
Animation(anim, CRGB(0), 0, 0);
}
Animation(AnimationData *anim, CRGB background_color) {
Animation(anim, background_color, 0, 0);
}
Animation(AnimationData *anim, CRGB bg_color, int x, int y) {
animation = anim;
background_color = bg_color;
xOffset = x;
yOffset = y;
}
void loop() {
Serial.printf("Animation.loop. Animation is %p.", (void *)animation);
CRGB colors[animation->color_count];
int led_index = 0;
uint8_t *color_data = new uint8_t[animation->color_count * 3];
memcpy_P(color_data, animation->colors, animation->color_count * 3);
for (int i = 0; i < animation->color_count; i++) colors[i] = CRGB(color_data[i * 3], color_data[i * 3 + 1], color_data[i * 3 + 2]);
free(color_data);
// Data is stored in progmem, so get it from there.
int length = animation->offsets[frame + 1] - animation->offsets[frame];
uint8_t *data = new uint8_t[length];
memcpy_P(data, animation->data + animation->offsets[frame], length);
for (int i = 0; i < length; i++) {
uint8_t color_index;
uint8_t count;
if (data[i] == 255) { // Run-length encoded data
color_index = data[i + 2];
count = data[i + 1];
i += 2;
} else {
color_index = data[i];
count = 1;
}
if (color_index == 0) { // color #0 = skip this pixels
led_index += count;
} else {
CRGB* color;
if (color_index == 1) {
color = &background_color;
} else if (color_index >= 2) {
color = &colors[color_index - 2];
}
for (int j = 0; j < count; j++) set(led_index++, color);
}
}
free(data);
if (frameSince == 0 || frameSince + frameDelay(animation, frame) < millis() || frameSince > millis()) {
frame = (frame + 1) % animation->frame_count;
frameSince = millis();
}
}
void set(int i, CRGB* color) {
setPixel(xOffset + (i % animation->w), yOffset + (i / animation->h), *color);
}
uint16_t frameDelay(AnimationData* animation, int frame) {
if (animation->individual_delays) return animation->delays[frame];
return animation->delays[0];
}
};
class SingleDynamic : public Effect {
protected:
static const int factor = 2;
static const int tile_count = LED_WIDTH/factor * LED_HEIGHT/factor;
virtual int getLoopTime() { return EFFECT_SINGLE_DYNAMIC_LOOP_TIME; }
CRGB tiles[tile_count];
CRGB old_tiles[tile_count];
uint8_t blend = 0;
public:
SingleDynamic() {
for (int i=0; i<tile_count; i++) tiles[i] = CHSV(random8(), 180, 255);
}
virtual void update() {
tiles[random8(tile_count)] = CHSV(random8(), 180, 255);
}
boolean can_be_shown_with_clock() { return true; }
virtual void loop() {
EVERY_N_MILLISECONDS(getLoopTime()) {
memcpy(old_tiles, tiles, tile_count*sizeof(CRGB));
blend = 0;
update();
}
for (int x=0; x<window.w; x++) for (int y=0; y<window.h; y++) {
int index = y/2 * window.w/2 + x/2;
setPixel(window, x, y, nblend(old_tiles[index], tiles[index], blend));
}
if (blend < 255) blend+=20;
}
};
class MultiDynamic : public SingleDynamic {
protected:
int getLoopTime() { return EFFECT_MULTI_DYNAMIC_LOOP_TIME; }
public:
void update() {
for (int i=0; i<tile_count; i++) tiles[i] = CHSV(random8(), 180, 255);
}
};
class MatrixColumn {
private:
int x, y;
int length;
Window* window;
int speed;
boolean running;
long last_move = 0;
public:
MatrixColumn() {}
MatrixColumn(Window* win, int xPos) {
window = win;
x = xPos;
start();
y = random8(0, win->h);
}
void start() {
y=-1;
length = random8(EFFECT_MATRIX_LENGTH_MIN, EFFECT_MATRIX_LENGTH_MAX);
running = true;
speed = random8(EFFECT_MATRIX_SPEED_MIN, EFFECT_MATRIX_SPEED_MAX);
}
void advance() {
y++;
if (y-length > window->h) running = false;
}
void draw() {
for(int i=0; i<length; i++) {
CRGB color;
if (i==0) color=CHSV(85, 0, 192);
else color=CHSV(85, 255, 255/(length-1)*(length-i));
setPixel(*window, x, y-i, color);
}
}
void loop() {
if (!running) {
if (random8() < 20) {
// Start the column again.
start();
}
} else {
if (millis() - last_move > speed) {
advance();
last_move = millis();
}
draw();
}
}
};
class MatrixEffect : public Effect {
private:
MatrixColumn columns[LED_WIDTH];
public:
boolean can_be_shown_with_clock() { return true; };
MatrixEffect() {
for (int i=0; i<LED_WIDTH; i++) columns[i]=MatrixColumn(&window, i);
}
void loop() {
clear(window);
for (int i=0; i<LED_WIDTH; i++) columns[i].loop();
}
};
class CycleEffect : public Effect {
private:
Effect* effect;
long effectSince = 0;
public:
void changeEffect() {
Effect* new_effect;
do {
int new_id = random8(cycle_effects->size());
new_effect = cycle_effects->get(new_id);
} while (&new_effect == &effect);
effect = new_effect;
effectSince = millis();
}
boolean can_be_shown_with_clock() {
return effect->can_be_shown_with_clock();
};
boolean clock_as_mask() {
return effect->clock_as_mask();
};
CycleEffect() {};
void loop() {
if (!effect) changeEffect(); // If this is the first run, we have to select an effect first!
effect->loop();
// Don't use EVERY_N_SECONDS(config_effect_cycle_time) here because that function isn't relly made
// to be used with changing values.
EVERY_N_SECONDS(1) {
if (effectSince + EFFECT_CYCLE_TIME*1000 < millis()) {
changeEffect();
}
}
}
};
class TwirlEffect : public Effect {
private:
uint8_t angleOffset = 0;
double center_x = 8;
double center_y = 8;
public:
void loop() {
for (int x=0; x<window.w; x++) for (int y=0; y<window.h; y++) {
uint8_t angle = (x==center_x && y==center_y) ? 0 : atan2(y - center_y, x - center_x) / M_PI * 128 + 128 + angleOffset;
uint8_t brightness = sqrt16((center_x - x) * (center_x - x) + (center_y - y) * (center_y - y)) & 0xFF;
setPixel(window, x, y, CHSV(angle, (brightness<<5) & 0xFF, 255));
}
angleOffset += 1;
}
};

37
src/efffect_clock.cpp Normal file
View File

@ -0,0 +1,37 @@
#include "effect_clock.h"
#include <FastLED.h>
#include "functions.h"
#include "text.h"
#include "ntp.h"
void ClockEffect::loop() {
loop(false, CRGB(0xFFFFFF), CRGB(0x000000));
}
void ClockEffect::loop(boolean invert, CRGB fg_color, CRGB bg_color) {
if (!invert) {
clear(window, bg_color);
} else {
// Manually clear the needed parts
for(int i=0; i<window.w; i++) setPixel(window, i, 0, bg_color);
for(int y=0; y<6; y++) {
setPixel(window, 3, y, bg_color);
if (y!=2 && y!=4) {
setPixel(window, 7, y, bg_color);
}
setPixel(window, 8, y, bg_color);
setPixel(window, 12, y, bg_color);
}
fg_color = bg_color;
}
int h = ntpClient.getHours();
drawDigit(window, numbers3x5, 3, 5, 0, 1, h / 10, fg_color, invert);
drawDigit(window, numbers3x5, 3, 5, 4, 1, h % 10, fg_color, invert);
int m = ntpClient.getMinutes();
drawDigit(window, numbers3x5, 3, 5, 9, 1, m / 10, fg_color, invert);
drawDigit(window, numbers3x5, 3, 5, 13, 1, m % 10, fg_color, invert);
if (ntpClient.getSeconds() & 1) {
setPixel(window, 7, 2, fg_color);
setPixel(window, 7, 4, fg_color);
}
}

View File

@ -1,3 +1,7 @@
#include "functions.h"
#include "prototypes.h"
#include "my_fastled.h"
int XYsafe(int x, int y) {
if ( x >= LED_WIDTH) return 0;
if ( y >= LED_HEIGHT) return 0;
@ -62,21 +66,30 @@ void clear() {
clear(w);
}
inline double sines(double x, double y) {
return ((cos(x) * sin(y)) * 0.5) + 0.5;
struct Matrix multiply(struct Matrix m1, struct Matrix m2) {
Matrix r = {
.a11 = m1.a11*m2.a11 + m1.a12*m2.a21,
.a12 = m1.a11*m2.a12 + m1.a12*m2.a22,
.a21 = m1.a21*m2.a11 + m1.a22*m2.a21,
.a22 = m1.a21*m2.a12 + m1.a22*m2.a22
};
return r;
};
struct Vector multiply(struct Matrix m, struct Vector v) {
Vector r = {
.x1 = (m.a11*v.x1) + (m.a12*v.x2),
.x2 = (m.a21*v.x1) + (m.a22*v.x2)
};
return r;
}
inline double basefield(double x, double y) {
return (cos(x) * sin(y) * cos(sqrt((x*x) + (y*y))));
}
inline double addmod(double x, double mod, double delta) {
x = x + delta;
while( x >= mod ) x -= mod;
while( x < 0.0 ) x += mod;
return x;
}
inline double addmodpi(double x, double delta) {
return addmod(x, 2*PI, delta);
struct Vector add(struct Vector v1, struct Vector v2) {
Vector r = {
.x1 = v1.x1 + v2.x2,
.x2 = v1.x2 + v2.x2
};
return r;
}

View File

@ -1,4 +1,13 @@
#ifdef MQTT_ENABLE
#include "my_mqtt.h"
#include "config.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "EffectEntry.h"
#include "Effect.h"
#include "effects.h"
#include "functions.h"
WiFiClient wifi;
PubSubClient mqtt_client(wifi);
long mqtt_last_reconnect_attempt = 0;
@ -9,11 +18,11 @@ void mqtt_callback(char* complete_topic, byte* pl, unsigned int length) {
// Here, payload is a char* (but has to be casted).
if(strcmp(topic, "mode")==0) {
for (int i=0; i<NUM_EFFECTS; i++) {
EffectEntry* e = &effects[i];
if (strcmp(e->name, payload)==0) {
for (int i=0; i<effects->size(); i++) {
EffectEntry e = effects->get(i);
if (strcmp(e.name, payload)==0) {
//Serial.printf("Effect found in mqtt_callback: %p\n", (void *)&e->effect);
current_effect = e->effect;
current_effect = e.effect;
clear();
return;
}
@ -26,7 +35,7 @@ void mqtt_callback(char* complete_topic, byte* pl, unsigned int length) {
if (strcmp(topic, "brightness")==0 && value > 0 && value <= 255) {
FastLED.setBrightness(value);
}
}
}
boolean mqtt_connect() {
@ -60,4 +69,3 @@ void mqtt_loop() {
mqtt_client.loop();
}
}
#endif // MQTT_ENABLE

4
src/ntp.cpp Normal file
View File

@ -0,0 +1,4 @@
#include "ntp.h"
WiFiUDP ntpUDP;
NTPClient ntpClient(ntpUDP, NTP_SERVER, NTP_OFFSET, NTP_INTERVAL);

View File

@ -1,120 +1,37 @@
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#define FASTLED_INTERNAL
#include <FastLED.h>
#include <SimpleList.h>
#include "ntp.h"
#include "ntp.h"
#include "config.h"
#include "animations.h"
#include "wifi.h"
#include "ota.h"
#include "my_fastled.h"
WiFiClient wifi;
WiFiUDP ntpUDP;
NTPClient ntpClient(ntpUDP, NTP_SERVER, NTP_OFFSET, NTP_INTERVAL);
typedef struct {
uint8_t x;
uint8_t y;
uint8_t w;
uint8_t h;
} Window;
class Effect {
protected:
Window window = {0, 0, LED_WIDTH, LED_HEIGHT}; // Use a full screen window per default.
public:
virtual void loop() = 0;
boolean supports_window = false;
virtual boolean can_be_shown_with_clock() { return false; };
virtual boolean clock_as_mask() { return false; };
void setWindow(Window win) {
window = win;
};
};
#include "EffectEntry.h"
#include "my_mqtt.h"
#include "functions.h"
#include "text.h"
#include "sprites.h"
#include "tools.h"
SimpleList<Effect*>* cycle_effects;
#include "effects.h"
#define NUM_EFFECTS 12
//EffectEntry effects[NUM_EFFECTS];
Sinematrix3 sinematrix3;
BigClock big_clock;
Clock effect_clock;
Bell bell;
Static off(CRGB(0x000000));
Animation anim_koopa(&animation_koopa, CRGB(0x000000), 0, 0);
Animation anim_couple_rain(&animation_couple_rain, CRGB(0x000000), -8, -16);
SingleDynamic single_dynamic;
MultiDynamic multi_dynamic;
MatrixEffect matrix;
CycleEffect effect_cycle;
TwirlEffect effect_twirl;
EffectEntry effects[NUM_EFFECTS] = {
{"sinematrix3", (Effect *)&sinematrix3},
{"big_clock", (Effect *)&big_clock},
{"clock", (Effect *)&effect_clock},
{"bell", (Effect *)&bell},
{"off", (Effect *)&off},
{"koopa", (Effect *)&anim_koopa},
{"couple_rain", (Effect *)&anim_couple_rain},
{"single_dynamic", (Effect *)&single_dynamic},
{"multi_dynamic", (Effect *)&multi_dynamic},
{"matrix", (Effect *)&matrix},
{"cycle", (Effect *)&effect_cycle},
{"twirl", (Effect *)&effect_twirl},
};
Effect* current_effect = &effect_clock;
#ifdef MQTT_ENABLE
#include <PubSubClient.h>
#include "mqtt.h"
#endif
void setup_cycle_effects() {
LOGln("Core * Setting up cycle_effects");
cycle_effects = new SimpleList<Effect*>();
cycle_effects->add(&sinematrix3);
cycle_effects->add(&single_dynamic);
cycle_effects->add(&multi_dynamic);
cycle_effects->add(&matrix);
}
void setup() {
Serial.begin(74880);
Serial.println("Core * Starting");
setup_cycle_effects();
wifi_setup();
ota_setup();
fastled_setup();
ntpClient.begin();
#ifdef MQTT_ENABLE
mqtt_setup();
#endif
Serial.println("Core * Setup complete");
}
uint8_t starting_up = OTA_STARTUP_DELAY;
int loop_timeouts = 0;
long loop_started_at = 0;
void setup() {
Serial.begin(74880);
Serial.println("Core * Starting");
setup_effects();
wifi_setup();
ota_setup();
fastled_setup();
ntpClient.begin();
mqtt_setup();
Serial.println("Core * Setup complete");
}
void loop() {
loop_started_at = millis();
ota_loop();
@ -133,13 +50,12 @@ void loop() {
}
ntpClient.update();
#ifdef MQTT_ENABLE
mqtt_loop();
#endif
mqtt_loop();
EVERY_N_MILLISECONDS(1000 / FPS) {
Serial.println("Core * loop running");
LOGln("Core * loop running");
current_effect->loop();
LOGln("Core * loop ran");
if (current_effect->can_be_shown_with_clock()) {
effect_clock.loop(current_effect->clock_as_mask(), CRGB(0xFFFFFF), CRGB(0x000000));

26
src/text.cpp Normal file
View File

@ -0,0 +1,26 @@
#include "functions.h"
#include "text.h"
void drawTextSprite(Window window, unsigned char* sprite, int w, int h, int xPos, int yPos, CRGB color, boolean invert) {
for (byte y=0; y<h; y++) for (byte x=0; x<w; x++) {
bool on = (sprite[x]>>(h-1-y)&1)*255;
if (invert) on = !on;
if (on) setPixel(window, x+xPos, y+yPos, color);
}
}
void drawChar(Window window, unsigned char* font, int w, int h, int x, int y, char c, CRGB color) {
unsigned char* sprite = &font[(c-32)*w];
drawTextSprite(window, sprite, w, h, x, y, color, false);
}
void drawDigit(Window window, unsigned char* font, int w, int h, int x, int y, int digit, CRGB color, boolean invert) {
unsigned char* sprite = &font[digit*w];
drawTextSprite(window, sprite, w, h, x, y, color, invert);
}
void drawText(Window window, char *font, int w, int h, char *text, int x, int y, CRGB color) {
for (int i = 0; i < strlen(text); i++) {
drawChar(window, font5x7, 5, 7, x+i*(w+1), y, text[i], color);
}
}

View File

@ -1,37 +0,0 @@
typedef struct Vector {
double x1;
double x2;
} Vector;
typedef struct Matrix {
double a11;
double a12;
double a21;
double a22;
} Matrix;
struct Matrix multiply(struct Matrix m1, struct Matrix m2) {
Matrix r = {
.a11 = m1.a11*m2.a11 + m1.a12*m2.a21,
.a12 = m1.a11*m2.a12 + m1.a12*m2.a22,
.a21 = m1.a21*m2.a11 + m1.a22*m2.a21,
.a22 = m1.a21*m2.a12 + m1.a22*m2.a22
};
return r;
};
struct Vector multiply(struct Matrix m, struct Vector v) {
Vector r = {
.x1 = (m.a11*v.x1) + (m.a12*v.x2),
.x2 = (m.a21*v.x1) + (m.a22*v.x2)
};
return r;
}
struct Vector add(struct Vector v1, struct Vector v2) {
Vector r = {
.x1 = v1.x1 + v2.x2,
.x2 = v1.x2 + v2.x2
};
return r;
}