Merge branch 'dev' into expand-1DEffects

This commit is contained in:
Ewowi
2022-09-08 15:56:42 +02:00
33 changed files with 18705 additions and 16098 deletions

View File

@@ -24,7 +24,7 @@
// #define MIC_LOGGER // MIC sampling & sound input debugging (serial plotter)
// #define FFT_SAMPLING_LOG // FFT result debugging
// #define SR_DEBUG // generic SR DEBUG messages
// #define NO_MIC_LOGGER // exclude MIC_LOGGER from SR_DEBUG
#ifdef SR_DEBUG
#define DEBUGSR_PRINT(x) Serial.print(x)
@@ -85,41 +85,51 @@ const float agcSampleSmooth[AGC_NUM_PRESETS] = { 1/12.f, 1/6.f, 1/16.f}; //
static AudioSource *audioSource = nullptr;
static volatile bool disableSoundProcessing = false; // if true, sound processing (FFT, filters, AGC) will be suspended. "volatile" as its shared between tasks.
// audioreactive variables shared with FFT task
static float micDataReal = 0.0f; // MicIn data with full 24bit resolution - lowest 8bit after decimal point
static float sampleReal = 0.0f; // "sampleRaw" as float, to provide bits that are lost otherwise (before amplification by sampleGain or inputLevel). Needed for AGC.
static float multAgc = 1.0f; // sample * multAgc = sampleAgc. Our AGC multiplier
static float sampleAvg = 0.0f; // Smoothed Average sample - sampleAvg < 1 means "quiet" (simple noise gate)
// peak detection
static bool samplePeak = false; // Boolean flag for peak - used in effects. Responding routine may reset this flag. Auto-reset after strip.getMinShowDelay()
static uint8_t maxVol = 10; // Reasonable value for constant volume for 'peak detector', as it won't always trigger (deprecated)
static uint8_t binNum = 8; // Used to select the bin for FFT based beat detection (deprecated)
static bool udpSamplePeak = false; // Boolean flag for peak. Set at the same tiem as samplePeak, but reset by transmitAudioData
static unsigned long timeOfPeak = 0; // time of last sample peak detection.
static void detectSamplePeak(void); // peak detection function (needs scaled FFT reasults in vReal[])
static void autoResetPeak(void); // peak auto-reset function
static int16_t sampleRaw = 0; // Current sample. Must only be updated ONCE!!! (amplified mic value by sampleGain and inputLevel)
static int16_t rawSampleAgc = 0; // not smoothed AGC sample
static float sampleAvg = 0.0f; // Smoothed Average sampleRaw
static float sampleAgc = 0.0f; // Smoothed AGC sample
////////////////////
// Begin FFT Code //
////////////////////
#ifdef UM_AUDIOREACTIVE_USE_NEW_FFT
// lib_deps += https://github.com/kosme/arduinoFFT#develop @ 1.9.2
#define FFT_SPEED_OVER_PRECISION // enables use of reciprocals (1/x etc), and an a few other speedups
#define FFT_SQRT_APPROXIMATION // enables "quake3" style inverse sqrt
#define sqrt(x) sqrtf(x) // little hack that reduces FFT time by 50% on ESP32 (as alternative to FFT_SQRT_APPROXIMATION)
#else
// lib_deps += https://github.com/blazoncek/arduinoFFT.git
#endif
#include "arduinoFFT.h"
// FFT Variables
// FFT Output variables shared with animations
#define NUM_GEQ_CHANNELS 16 // number of frequency channels. Don't change !!
static float FFT_MajorPeak = 1.0f; // FFT: strongest (peak) frequency
static float FFT_Magnitude = 0.0f; // FFT: volume (magnitude) of peak frequency
static uint8_t fftResult[NUM_GEQ_CHANNELS]= {0};// Our calculated freq. channel result table to be used by effects
// FFT Constants
constexpr uint16_t samplesFFT = 512; // Samples in an FFT batch - This value MUST ALWAYS be a power of 2
constexpr uint16_t samplesFFT_2 = 256; // meaningfull part of FFT results - only the "lower half" contains useful information.
static float FFT_MajorPeak = 1.0f;
static float FFT_Magnitude = 0.0f;
// These are the input and output vectors. Input vectors receive computed results from FFT.
static float vReal[samplesFFT] = {0.0f};
static float vImag[samplesFFT] = {0.0f};
static float fftBin[samplesFFT_2] = {0.0f};
static float vReal[samplesFFT] = {0.0f}; // FFT sample inputs / freq output - these are our raw result bins
static float vImag[samplesFFT] = {0.0f}; // imaginary parts
// the following are observed values, supported by a bit of "educated guessing"
//#define FFT_DOWNSCALE 0.65f // 20kHz - downscaling factor for FFT results - "Flat-Top" window @20Khz, old freq channels
#define FFT_DOWNSCALE 0.46f // downscaling factor for FFT results - for "Flat-Top" window @22Khz, new freq channels
#define LOG_256 5.54517744
@@ -128,13 +138,11 @@ static float windowWeighingFactors[samplesFFT] = {0.0f};
#endif
// Try and normalize fftBin values to a max of 4096, so that 4096/16 = 256.
// Oh, and bins 0,1,2 are no good, so we'll zero them out.
static float fftCalc[16] = {0.0f};
static uint8_t fftResult[16] = {0}; // Our calculated result table, which we feed to the animations.
static float fftCalc[NUM_GEQ_CHANNELS] = {0.0f};
static float fftAvg[NUM_GEQ_CHANNELS] = {0.0f}; // Calculated frequency channel results, with smoothing (used if dynamics limiter is ON)
#ifdef SR_DEBUG
static float fftResultMax[16] = {0.0f}; // A table used for testing to determine how our post-processing is working.
static float fftResultMax[NUM_GEQ_CHANNELS] = {0.0f}; // A table used for testing to determine how our post-processing is working.
#endif
static float fftAvg[16] = {0.0f};
#ifdef WLED_DEBUG
static unsigned long fftTime = 0;
@@ -142,7 +150,7 @@ static unsigned long sampleTime = 0;
#endif
// Table of multiplication factors so that we can even out the frequency response.
static float fftResultPink[16] = { 1.70f, 1.71f, 1.73f, 1.78f, 1.68f, 1.56f, 1.55f, 1.63f, 1.79f, 1.62f, 1.80f, 2.06f, 2.47f, 3.35f, 6.83f, 9.55f };
static float fftResultPink[NUM_GEQ_CHANNELS] = { 1.70f, 1.71f, 1.73f, 1.78f, 1.68f, 1.56f, 1.55f, 1.63f, 1.79f, 1.62f, 1.80f, 2.06f, 2.47f, 3.35f, 6.83f, 9.55f };
// Create FFT object
#ifdef UM_AUDIOREACTIVE_USE_NEW_FFT
@@ -161,12 +169,12 @@ static float mapf(float x, float in_min, float in_max, float out_min, float out_
static float fftAddAvg(int from, int to) {
float result = 0.0f;
for (int i = from; i <= to; i++) {
result += fftBin[i];
result += vReal[i];
}
return result / float(to - from + 1);
}
// FFT main code
// FFT main task
void FFTcode(void * parameter)
{
DEBUGSR_PRINT("FFT started on core: "); DEBUGSR_PRINTLN(xPortGetCoreID());
@@ -237,9 +245,9 @@ void FFTcode(void * parameter)
#endif
FFT_MajorPeak = constrain(FFT_MajorPeak, 1.0f, 11025.0f); // restrict value to range expected by effects
for (int i = 0; i < samplesFFT_2; i++) { // Values for bins 0 and 1 are WAY too large. Might as well start at 3.
for (int i = 0; i < samplesFFT; i++) {
float t = fabsf(vReal[i]); // just to be sure - values in fft bins should be positive any way
fftBin[i] = t / 16.0f; // Reduce magnitude. Want end result to be linear and ~4096 max.
vReal[i] = t / 16.0f; // Reduce magnitude. Want end result to be scaled linear and ~4096 max.
} // for()
// mapping of FFT result bins to frequency channels
@@ -292,14 +300,14 @@ void FFTcode(void * parameter)
// don't use the last bins from 216 to 255. They are usually contaminated by aliasing (aka noise)
#endif
} else { // noise gate closed - just decay old values
for (int i=0; i < 16; i++) {
for (int i=0; i < NUM_GEQ_CHANNELS; i++) {
fftCalc[i] *= 0.85f; // decay to zero
if (fftCalc[i] < 4.0f) fftCalc[i] = 0.0f;
}
}
// post-processing of frequency channels (pink noise adjustment, AGC, smooting, scaling)
for (int i=0; i < 16; i++) {
for (int i=0; i < NUM_GEQ_CHANNELS; i++) {
if (sampleAvg > 1) { // noise gate open
// Adjustment for frequency curves.
@@ -378,11 +386,43 @@ void FFTcode(void * parameter)
fftTime = (fftTimeInMillis*3 + fftTime*7)/10; // smooth
}
#endif
// run peak detection
autoResetPeak();
detectSamplePeak();
} // for(;;)
} // FFTcode()
} // for(;;)ever
} // FFTcode() task end
////////////////////
// Peak detection //
////////////////////
// peak detection is called from FFT task when vReal[] contains valid FFT results
static void detectSamplePeak(void) {
// Poor man's beat detection by seeing if sample > Average + some value.
if ((sampleAvg > 1) && (maxVol > 0) && (binNum > 1) && (vReal[binNum] > maxVol) && ((millis() - timeOfPeak) > 100)) {
// This goes through ALL of the 255 bins - but ignores stupid settings
// Then we got a peak, else we don't. The peak has to time out on its own in order to support UDP sound sync.
samplePeak = true;
timeOfPeak = millis();
udpSamplePeak = true;
}
}
static void autoResetPeak(void) {
uint16_t MinShowDelay = MAX(50, strip.getMinShowDelay()); // Fixes private class variable compiler error. Unsure if this is the correct way of fixing the root problem. -THATDONFC
if (millis() - timeOfPeak > MinShowDelay) { // Auto-reset of samplePeak after a complete frame has passed.
samplePeak = false;
if (audioSyncEnabled == 0) udpSamplePeak = false; // this is normally reset by transmitAudioData
}
}
////////////////////
// usermod class //
////////////////////
//class name. Use something descriptive and leave the ": public Usermod" part :)
class AudioReactive : public Usermod {
@@ -453,40 +493,36 @@ class AudioReactive : public Usermod {
double FFT_MajorPeak; // 08 Bytes
};
WiFiUDP fftUdp;
// set your config variables to their boot default value (this can also be done in readFromConfig() or a constructor if you prefer)
bool enabled = false;
bool initDone = false;
const uint16_t delayMs = 10; // I don't want to sample too often and overload WLED
// variables for UDP sound sync
WiFiUDP fftUdp; // UDP object for sound sync (from WiFi UDP, not Async UDP!)
bool udpSyncConnected = false;// UDP connection status -> true if connected to multicast group
unsigned long lastTime = 0; // last time of running UDP Microphone Sync
const uint16_t delayMs = 10; // I don't want to sample too often and overload WLED
uint16_t audioSyncPort= 11988;// default port for UDP sound sync
// used for AGC
int last_soundAgc = -1; // used to detect AGC mode change (for resetting AGC internal error buffers)
double control_integrated = 0.0; // persistent across calls to agcAvg(); "integrator control" = accumulated error
// variables used by getSample() and agcAvg()
int16_t micIn = 0; // Current sample starts with negative values and large values, which is why it's 16 bit signed
double sampleMax = 0.0; // Max sample over a few seconds. Needed for AGC controler.
float micLev = 0.0f; // Used to convert returned value to have '0' as minimum. A leveller
float expAdjF = 0.0f; // Used for exponential filter.
float sampleReal = 0.0f; // "sampleRaw" as float, to provide bits that are lost otherwise (before amplification by sampleGain or inputLevel). Needed for AGC.
int16_t sampleRaw = 0; // Current sample. Must only be updated ONCE!!! (amplified mic value by sampleGain and inputLevel)
int16_t rawSampleAgc = 0; // not smoothed AGC sample
float sampleAgc = 0.0f; // Smoothed AGC sample
// variables used in effects
uint8_t maxVol = 10; // Reasonable value for constant volume for 'peak detector', as it won't always trigger (deprecated)
uint8_t binNum = 8; // Used to select the bin for FFT based beat detection (deprecated)
bool samplePeak = 0; // Boolean flag for peak. Responding routine must reset this flag
float volumeSmth = 0.0f; // either sampleAvg or sampleAgc depending on soundAgc; smoothed sample
int16_t volumeRaw = 0; // either sampleRaw or rawSampleAgc depending on soundAgc
float my_magnitude =0.0f; // FFT_Magnitude, scaled by multAgc
bool udpSamplePeak = 0; // Boolean flag for peak. Set at the same tiem as samplePeak, but reset by transmitAudioData
int16_t micIn = 0; // Current sample starts with negative values and large values, which is why it's 16 bit signed
double sampleMax = 0.0; // Max sample over a few seconds. Needed for AGC controler.
uint32_t timeOfPeak = 0;
unsigned long lastTime = 0; // last time of running UDP Microphone Sync
float micLev = 0.0f; // Used to convert returned value to have '0' as minimum. A leveller
float expAdjF = 0.0f; // Used for exponential filter.
bool udpSyncConnected = false;
uint16_t audioSyncPort = 11988;
// used for AGC
uint8_t lastMode = 0; // last known effect mode
int last_soundAgc = -1;
double control_integrated = 0.0; // persistent across calls to agcAvg(); "integrator control" = accumulated error
unsigned long last_update_time = 0;
unsigned long last_kick_time = 0;
uint8_t last_user_inputLevel = 0;
// used to feed "Info" Page
unsigned long last_UDPTime = 0; // time of last valid UDP sound sync datapacket
float maxSample5sec = 0.0f; // max sample (after AGC) in last 5 seconds
@@ -503,6 +539,10 @@ class AudioReactive : public Usermod {
static const char UDP_SYNC_HEADER_v1[];
// private methods
////////////////////
// Debug support //
////////////////////
void logAudio()
{
#ifdef MIC_LOGGER
@@ -525,7 +565,7 @@ class AudioReactive : public Usermod {
#ifdef FFT_SAMPLING_LOG
#if 0
for(int i=0; i<16; i++) {
for(int i=0; i<NUM_GEQ_CHANNELS; i++) {
Serial.print(fftResult[i]);
Serial.print("\t");
}
@@ -551,11 +591,11 @@ class AudioReactive : public Usermod {
int maxVal = minimumMaxVal;
int minVal = 0;
for(int i = 0; i < 16; i++) {
for(int i = 0; i < NUM_GEQ_CHANNELS; i++) {
if(fftResult[i] > maxVal) maxVal = fftResult[i];
if(fftResult[i] < minVal) minVal = fftResult[i];
}
for(int i = 0; i < 16; i++) {
for(int i = 0; i < NUM_GEQ_CHANNELS; i++) {
Serial.print(i); Serial.print(":");
Serial.printf("%04ld ", map(fftResult[i], 0, (scaleValuesFromCurrentMaxVal ? maxVal : defaultScalingFromHighValue), (mapValuesToPlotterSpace*i*scalingToHighValue)+0, (mapValuesToPlotterSpace*i*scalingToHighValue)+scalingToHighValue-1));
}
@@ -574,6 +614,10 @@ class AudioReactive : public Usermod {
} // logAudio()
//////////////////////
// Audio Processing //
//////////////////////
/*
* A "PI controller" multiplier to automatically adjust sound sensitivity.
*
@@ -668,7 +712,7 @@ class AudioReactive : public Usermod {
last_soundAgc = soundAgc;
} // agcAvg()
// post-processing and filtering of MIC sample (micDataReal) from FFTcode()
void getSample()
{
float sampleAdj; // Gain adjusted sample value
@@ -729,24 +773,6 @@ class AudioReactive : public Usermod {
if (sampleMax < 0.5f) sampleMax = 0.0f;
sampleAvg = ((sampleAvg * 15.0f) + sampleAdj) / 16.0f; // Smooth it out over the last 16 samples.
// Fixes private class variable compiler error. Unsure if this is the correct way of fixing the root problem. -THATDONFC
uint16_t MinShowDelay = strip.getMinShowDelay();
if (millis() - timeOfPeak > MinShowDelay) { // Auto-reset of samplePeak after a complete frame has passed.
samplePeak = false;
udpSamplePeak = false;
}
//if (userVar1 == 0) samplePeak = 0;
// Poor man's beat detection by seeing if sample > Average + some value.
if ((maxVol > 0) && (binNum > 1) && (fftBin[binNum] > maxVol) && (millis() > (timeOfPeak + 100))) {
// This goes through ALL of the 255 bins - but ignores stupid settings
// Then we got a peak, else we don't. The peak has to time out on its own in order to support UDP sound sync.
samplePeak = true;
timeOfPeak = millis();
udpSamplePeak = true;
}
} // getSample()
@@ -781,6 +807,26 @@ class AudioReactive : public Usermod {
}
//////////////////////
// UDP Sound Sync //
//////////////////////
// try to establish UDP sound sync connection
void connectUDPSoundSync(void) {
// This function tries to establish a UDP sync connection if needed
// necessary as we also want to transmit in "AP Mode", but the standard "connected()" callback only reacts on STA connection
static unsigned long last_connection_attempt = 0;
if ((audioSyncPort <= 0) || ((audioSyncEnabled & 0x03) == 0)) return; // Sound Sync not enabled
if (udpSyncConnected) return; // already connected
if (!(apActive || interfacesInited)) return; // neither AP nor other connections availeable
if (millis() - last_connection_attempt < 15000) return; // only try once in 15 seconds
// if we arrive here, we need a UDP connection but don't have one
last_connection_attempt = millis();
connected(); // try to start UDP
}
void transmitAudioData()
{
if (!udpSyncConnected) return;
@@ -795,7 +841,7 @@ class AudioReactive : public Usermod {
udpSamplePeak = false; // Reset udpSamplePeak after we've transmitted it
transmitData.reserved1 = 0;
for (int i = 0; i < 16; i++) {
for (int i = 0; i < NUM_GEQ_CHANNELS; i++) {
transmitData.fftResult[i] = (uint8_t)constrain(fftResult[i], 0, 254);
}
@@ -808,12 +854,10 @@ class AudioReactive : public Usermod {
return;
} // transmitAudioData()
static bool isValidUdpSyncVersion(const char *header) {
return strncmp_P(header, PSTR(UDP_SYNC_HEADER), 6) == 0;
}
bool receiveAudioData() // check & process new data. return TRUE in case that new audio data was received.
{
if (!udpSyncConnected) return false;
@@ -839,13 +883,7 @@ class AudioReactive : public Usermod {
sampleAgc = volumeSmth;
multAgc = 1.0f;
// auto-reset sample peak. Need to do it here, because getSample() is not running
uint16_t MinShowDelay = strip.getMinShowDelay();
if (millis() - timeOfPeak > MinShowDelay) { // Auto-reset of samplePeak after a complete frame has passed.
samplePeak = false;
udpSamplePeak = false;
}
//if (userVar1 == 0) samplePeak = 0;
autoResetPeak();
// Only change samplePeak IF it's currently false.
// If it's true already, then the animation still needs to respond.
if (!samplePeak) {
@@ -855,7 +893,7 @@ class AudioReactive : public Usermod {
}
//These values are only available on the ESP32
for (int i = 0; i < 16; i++) fftResult[i] = receivedPacket->fftResult[i];
for (int i = 0; i < NUM_GEQ_CHANNELS; i++) fftResult[i] = receivedPacket->fftResult[i];
my_magnitude = fmaxf(receivedPacket->FFT_Magnitude, 0.0f);
FFT_Magnitude = my_magnitude;
@@ -869,6 +907,10 @@ class AudioReactive : public Usermod {
}
//////////////////////
// usermod functions//
//////////////////////
public:
//Functions called by WLED or other usermods
@@ -961,6 +1003,7 @@ class AudioReactive : public Usermod {
disableSoundProcessing = true;
}
if (enabled) connectUDPSoundSync();
initDone = true;
}
@@ -971,6 +1014,11 @@ class AudioReactive : public Usermod {
*/
void connected()
{
if (udpSyncConnected) { // clean-up: if open, close old UDP sync connection
udpSyncConnected = false;
fftUdp.stop();
}
if (audioSyncPort > 0 && (audioSyncEnabled & 0x03)) {
#ifndef ESP8266
udpSyncConnected = fftUdp.beginMulticast(IPAddress(239, 0, 0, 1), audioSyncPort);
@@ -1004,7 +1052,7 @@ class AudioReactive : public Usermod {
if (strip.isUpdating() && (millis() - lastUMRun < 2)) return; // be nice, but not too nice
// suspend local sound processing when "real time mode" is active (E131, UDP, ADALIGHT, ARTNET)
if ( (realtimeOverride == REALTIME_OVERRIDE_NONE) // please odd other orrides here if needed
if ( (realtimeOverride == REALTIME_OVERRIDE_NONE) // please add other overrides here if needed
&&( (realtimeMode == REALTIME_MODE_GENERIC)
||(realtimeMode == REALTIME_MODE_E131)
||(realtimeMode == REALTIME_MODE_UDP)
@@ -1020,7 +1068,7 @@ class AudioReactive : public Usermod {
disableSoundProcessing = true;
} else {
#ifdef WLED_DEBUG
if ((disableSoundProcessing == true) && (audioSyncEnabled == 0)) { // we just switched to "disabled"
if ((disableSoundProcessing == true) && (audioSyncEnabled == 0) && audioSource->isInitialized()) { // we just switched to "enabled"
DEBUG_PRINTLN("[AR userLoop] realtime mode ended - audio processing resumed.");
DEBUG_PRINTF( " RealtimeMode = %d; RealtimeOverride = %d\n", int(realtimeMode), int(realtimeOverride));
}
@@ -1067,9 +1115,13 @@ class AudioReactive : public Usermod {
if (soundAgc) my_magnitude *= multAgc;
if (volumeSmth < 1 ) my_magnitude = 0.001f; // noise gate closed - mute
limitSampleDynamics(); // optional - makes volumeSmth very smooth and fluent
}
limitSampleDynamics();
} // if (!disableSoundProcessing)
autoResetPeak(); // auto-reset sample peak after strip minShowDelay
if (!udpSyncConnected) udpSamplePeak = false; // reset UDP samplePeak while UDP is unconnected
connectUDPSoundSync(); // ensure we have a connection - if needed
// UDP Microphone Sync - receive mode
if ((audioSyncEnabled & 0x02) && udpSyncConnected) {
@@ -1092,7 +1144,7 @@ class AudioReactive : public Usermod {
}
#endif
// peak sample from last 5 seconds
// Info Page: keep max sample from last 5 seconds
if ((millis() - sampleMaxTimer) > CYCLE_SAMPLEMAX) {
sampleMaxTimer = millis();
maxSample5sec = (0.15 * maxSample5sec) + 0.85 *((soundAgc) ? sampleAgc : sampleAvg); // reset, and start with some smoothing
@@ -1100,6 +1152,7 @@ class AudioReactive : public Usermod {
} else {
if ((sampleAvg >= 1)) maxSample5sec = fmaxf(maxSample5sec, (soundAgc) ? rawSampleAgc : sampleRaw); // follow maximum volume
}
//UDP Microphone Sync - transmit mode
if ((audioSyncEnabled & 0x01) && (millis() - lastTime > 20)) {
// Only run the transmit code IF we're in Transmit mode
@@ -1137,8 +1190,9 @@ class AudioReactive : public Usermod {
memset(fftCalc, 0, sizeof(fftCalc));
memset(fftAvg, 0, sizeof(fftAvg));
memset(fftResult, 0, sizeof(fftResult));
for(int i=(init?0:1); i<16; i+=2) fftResult[i] = 16; // make a tiny pattern
for(int i=(init?0:1); i<NUM_GEQ_CHANNELS; i+=2) fftResult[i] = 16; // make a tiny pattern
inputLevel = 128; // resset level slider to default
autoResetPeak();
if (init && FFT_Task) {
vTaskSuspend(FFT_Task); // update is about to begin, disable task to prevent crash
@@ -1186,6 +1240,10 @@ class AudioReactive : public Usermod {
}
////////////////////////////
// Settings and Info Page //
////////////////////////////
/*
* addToJsonInfo() can be used to add custom entries to the /json/info part of the JSON API.
* Creating an "u" object allows you to add custom key/value pairs to the Info section of the WLED web UI.

View File

@@ -1927,10 +1927,7 @@ uint16_t mode_palette()
for (int i = 0; i < SEGLEN; i++)
{
uint8_t colorIndex = (i * 255 / SEGLEN) - counter;
if (noWrap) colorIndex = map(colorIndex, 0, 255, 0, 240); //cut off blend at palette "end"
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(colorIndex, false, true, 255));
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(colorIndex, false, noWrap, 255));
}
return FRAMETIME;
}
@@ -3528,7 +3525,7 @@ uint16_t mode_tetrix(void) {
drop->brick = 0; // reset brick size (no more growing)
if (drop->step > millis()) {
// allow fading of virtual strip
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(indexToVStrip(i, stripNr), SEGCOLOR(1), 25); // 10% blend with Bg color
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(indexToVStrip(i, stripNr), SEGCOLOR(1), 25); // 10% blend
} else {
drop->stack = 0; // reset brick stack size
drop->step = 0; // proceed with next brick
@@ -5842,12 +5839,13 @@ uint16_t mode_2Dscrollingtext(void) {
int letterWidth;
int letterHeight;
switch (map(SEGMENT.custom2, 0, 255, 1, 4)) {
switch (map(SEGMENT.custom2, 0, 255, 1, 5)) {
default:
case 1: letterWidth = 5; letterHeight = 8; break;
case 2: letterWidth = 6; letterHeight = 8; break;
case 3: letterWidth = 7; letterHeight = 9; break;
case 4: letterWidth = 5; letterHeight = 12; break;
case 1: letterWidth = 4; letterHeight = 6; break;
case 2: letterWidth = 5; letterHeight = 8; break;
case 3: letterWidth = 6; letterHeight = 8; break;
case 4: letterWidth = 7; letterHeight = 9; break;
case 5: letterWidth = 5; letterHeight = 12; break;
}
const int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-letterHeight)/2;
char text[33] = {'\0'};
@@ -5887,7 +5885,7 @@ uint16_t mode_2Dscrollingtext(void) {
return FRAMETIME;
}
static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size;!,!;!;ix=96,c1=0,rev=0,mi=0,rY=0,mY=0,2d";
static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size;!,!;!;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0,2d";
////////////////////////////
@@ -5924,7 +5922,6 @@ static const char _data_FX_MODE_2DDRIFTROSE[] PROGMEM = "Drift Rose@Fade,Blur;;;
#endif // WLED_DISABLE_2D
#ifndef WLED_DISABLE_AUDIO
///////////////////////////////////////////////////////////////////////////////
/******************** audio enhanced routines ************************/
///////////////////////////////////////////////////////////////////////////////
@@ -6251,7 +6248,7 @@ uint16_t mode_gravcentric(void) { // Gravcentric. By Andrew
return FRAMETIME;
} // mode_gravcentric()
static const char _data_FX_MODE_GRAVCENTRIC[] PROGMEM = "Gravcentric@Rate of fall,Sensitivity;!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin
static const char _data_FX_MODE_GRAVCENTRIC[] PROGMEM = "Gravcentric@Rate of fall,Sensitivity;!;!;ix=128,mp12=3,ssim=0,1d,vo"; // Corner, Beatsin
///////////////////////
@@ -6387,7 +6384,7 @@ uint16_t mode_midnoise(void) { // Midnoise. By Andrew Tuline.
return FRAMETIME;
} // mode_midnoise()
static const char _data_FX_MODE_MIDNOISE[] PROGMEM = "Midnoise@Fade rate,Maximum length;,!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin
static const char _data_FX_MODE_MIDNOISE[] PROGMEM = "Midnoise@Fade rate,Maximum length;,!;!;ix=128,mp12=1,ssim=0,1d,vo"; // Bar, Beatsin
//////////////////////
@@ -6512,7 +6509,7 @@ uint16_t mode_plasmoid(void) { // Plasmoid. By Andrew Tuline.
}
float volumeSmth = *(float*) um_data->u_data[0];
SEGMENT.fadeToBlackBy(64);
SEGMENT.fadeToBlackBy(32);
plasmoip->thisphase += beatsin8(6,-4,4); // You can change direction and speed individually.
plasmoip->thatphase += beatsin8(7,-4,4); // Two phase values to make a complex pattern. By Andrew Tuline.
@@ -6608,11 +6605,6 @@ uint16_t mode_puddles(void) { // Puddles. By Andrew Tuline.
static const char _data_FX_MODE_PUDDLES[] PROGMEM = "Puddles@Fade rate,Puddle size;!,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin
///////////////////////////////////////////////////////////////////////////////
/******************** audio only routines ************************/
///////////////////////////////////////////////////////////////////////////////
#ifdef USERMOD_AUDIOREACTIVE
//////////////////////
// * PIXELS //
//////////////////////
@@ -6664,7 +6656,8 @@ uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
SEGENV.aux0 = 0;
}
SEGMENT.fade_out(SEGMENT.speed);
int fadeoutDelay = (256 - SEGMENT.speed) / 32;
if ((fadeoutDelay <= 1 ) || ((SEGENV.call % fadeoutDelay) == 0)) SEGMENT.fade_out(SEGMENT.speed);
SEGENV.step += FRAMETIME;
if (SEGENV.step > SPEED_FORMULA_L) {
@@ -6732,7 +6725,9 @@ uint16_t mode_freqmap(void) { // Map FFT_MajorPeak to SEGLEN.
float my_magnitude = *(float*) um_data->u_data[5] / 4.0f;
if (FFT_MajorPeak < 1) FFT_MajorPeak = 1; // log10(0) is "forbidden" (throws exception)
SEGMENT.fade_out(SEGMENT.speed);
if (SEGENV.call == 0) SEGMENT.fill(BLACK);
int fadeoutDelay = (256 - SEGMENT.speed) / 32;
if ((fadeoutDelay <= 1 ) || ((SEGENV.call % fadeoutDelay) == 0)) SEGMENT.fade_out(SEGMENT.speed);
int locn = (log10f((float)FFT_MajorPeak) - 1.78f) * (float)SEGLEN/(MAX_FREQ_LOG10 - 1.78f); // log10 frequency range is from 1.78 to 3.71. Let's scale to SEGLEN.
if (locn < 1) locn = 0; // avoid underflow
@@ -6747,7 +6742,7 @@ uint16_t mode_freqmap(void) { // Map FFT_MajorPeak to SEGLEN.
return FRAMETIME;
} // mode_freqmap()
static const char _data_FX_MODE_FREQMAP[] PROGMEM = "Freqmap@Fade rate,Starting color;,!;!;mp12=2,ssim=0,1d,fr"; // Circle, Beatsin
static const char _data_FX_MODE_FREQMAP[] PROGMEM = "Freqmap@Fade rate,Starting color;,!;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
///////////////////////
@@ -6802,7 +6797,7 @@ uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Plesch
return FRAMETIME;
} // mode_freqmatrix()
static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;;mp12=3,ssim=0,1d,fr"; // Corner, Beatsin
//////////////////////
@@ -6823,7 +6818,10 @@ uint16_t mode_freqpixels(void) { // Freqpixel. By Andrew Tuline.
if (FFT_MajorPeak < 1) FFT_MajorPeak = 1; // log10(0) is "forbidden" (throws exception)
uint16_t fadeRate = 2*SEGMENT.speed - SEGMENT.speed*SEGMENT.speed/255; // Get to 255 as quick as you can.
SEGMENT.fade_out(fadeRate);
if (SEGENV.call == 0) SEGMENT.fill(BLACK);
int fadeoutDelay = (256 - SEGMENT.speed) / 64;
if ((fadeoutDelay <= 1 ) || ((SEGENV.call % fadeoutDelay) == 0)) SEGMENT.fade_out(fadeRate);
for (int i=0; i < SEGMENT.intensity/32+1; i++) {
uint16_t locn = random16(0,SEGLEN);
@@ -6955,7 +6953,7 @@ uint16_t mode_gravfreq(void) { // Gravfreq. By Andrew Tuline.
return FRAMETIME;
} // mode_gravfreq()
static const char _data_FX_MODE_GRAVFREQ[] PROGMEM = "Gravfreq@Rate of fall,Sensivity;,!;!;ix=128,mp12=2,ssim=0,1d,fr"; // Circle, Beatsin
static const char _data_FX_MODE_GRAVFREQ[] PROGMEM = "Gravfreq@Rate of fall,Sensivity;,!;!;ix=128,mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
//////////////////////
@@ -6969,7 +6967,10 @@ uint16_t mode_noisemove(void) { // Noisemove. By: Andrew Tuli
}
uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
SEGMENT.fade_out(224); // Just in case something doesn't get faded.
if (SEGENV.call == 0) SEGMENT.fill(BLACK);
//SEGMENT.fade_out(224); // Just in case something doesn't get faded.
int fadeoutDelay = (256 - SEGMENT.speed) / 96;
if ((fadeoutDelay <= 1 ) || ((SEGENV.call % fadeoutDelay) == 0)) SEGMENT.fadeToBlackBy(4+ SEGMENT.speed/4);
uint8_t numBins = map(SEGMENT.intensity,0,255,0,16); // Map slider to fftResult bins.
for (int i=0; i<numBins; i++) { // How many active bins are we using.
@@ -6995,13 +6996,16 @@ uint16_t mode_rocktaves(void) { // Rocktaves. Same note from eac
float FFT_MajorPeak = *(float*) um_data->u_data[4];
float my_magnitude = *(float*) um_data->u_data[5] / 16.0f;
SEGMENT.fadeToBlackBy(64); // Just in case something doesn't get faded.
if (SEGENV.call == 0) SEGMENT.fill(BLACK);
SEGMENT.fadeToBlackBy(16); // Just in case something doesn't get faded.
float frTemp = FFT_MajorPeak;
uint8_t octCount = 0; // Octave counter.
uint8_t volTemp = 0;
if (my_magnitude > 32) volTemp = 255; // We need to squelch out the background noise.
volTemp = 32.0f + my_magnitude * 1.5f; // brightness = volume (overflows are handled in next lines)
if (my_magnitude < 48) volTemp = 0; // We need to squelch out the background noise.
if (my_magnitude > 144) volTemp = 255; // everything above this is full brightness
while ( frTemp > 249 ) {
octCount++; // This should go up to 5.
@@ -7017,7 +7021,7 @@ uint16_t mode_rocktaves(void) { // Rocktaves. Same note from eac
return FRAMETIME;
} // mode_rocktaves()
static const char _data_FX_MODE_ROCKTAVES[] PROGMEM = "Rocktaves@;,!;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
static const char _data_FX_MODE_ROCKTAVES[] PROGMEM = "Rocktaves@;,!;!;mp12=1,ssim=0,1d,fr"; // Bar, Beatsin
///////////////////////
@@ -7101,10 +7105,13 @@ uint16_t mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud Wijma.
rippleTime = true;
}
SEGMENT.fadeToBlackBy(SEGMENT.speed);
if (SEGENV.call == 0) SEGMENT.fill(BLACK);
int fadeoutDelay = (256 - SEGMENT.speed) / 64;
if ((fadeoutDelay <= 1 ) || ((SEGENV.call % fadeoutDelay) == 0)) SEGMENT.fadeToBlackBy(SEGMENT.speed);
for (int x=0; x < cols; x++) {
uint8_t band = map(x, 0, cols-1, 0, NUM_BANDS - 1);
if (NUM_BANDS < 16) band = map(band, 0, NUM_BANDS - 1, 0, 15); // always use full range. comment out this line to get the previous behaviour.
band = constrain(band, 0, 15);
uint16_t colorIndex = band * 17;
uint16_t barHeight = map(fftResult[band], 0, 255, 0, rows); // do not subtract -1 from rows here
@@ -7186,14 +7193,7 @@ uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Wil
} // mode_2DFunkyPlank
static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;ssim=0,2d,fr"; // Beatsin
#endif // WLED_DISABLE_2D
//end audio only routines
#endif
#ifndef WLED_DISABLE_2D
/////////////////////////
// 2D Akemi //
/////////////////////////
@@ -7298,7 +7298,6 @@ uint16_t mode_2DAkemi(void) {
static const char _data_FX_MODE_2DAKEMI[] PROGMEM = "Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette;ssim=0,2d,fr"; //beatsin
#endif // WLED_DISABLE_2D
#endif // WLED_DISABLE_AUDIO
//////////////////////////////////////////////////////////////////////////////////////////
// mode data
@@ -7480,16 +7479,14 @@ void WS2812FX::setupEffectData() {
addEffect(FX_MODE_2DMETABALLS, &mode_2Dmetaballs, _data_FX_MODE_2DMETABALLS);
addEffect(FX_MODE_2DPULSER, &mode_2DPulser, _data_FX_MODE_2DPULSER);
addEffect(FX_MODE_2DDRIFT, &mode_2DDrift, _data_FX_MODE_2DDRIFT);
// --- 2D audio effects ---
#ifndef WLED_DISABLE_AUDIO
addEffect(FX_MODE_2DWAVERLY, &mode_2DWaverly, _data_FX_MODE_2DWAVERLY);
addEffect(FX_MODE_2DSWIRL, &mode_2DSwirl, _data_FX_MODE_2DSWIRL);
addEffect(FX_MODE_2DAKEMI, &mode_2DAkemi, _data_FX_MODE_2DAKEMI);
#endif
addEffect(FX_MODE_2DGEQ, &mode_2DGEQ, _data_FX_MODE_2DGEQ);
addEffect(FX_MODE_2DFUNKYPLANK, &mode_2DFunkyPlank, _data_FX_MODE_2DFUNKYPLANK);
#endif // WLED_DISABLE_2D
#ifndef WLED_DISABLE_AUDIO
// --- 1D audio effects ---
addEffect(FX_MODE_PIXELWAVE, &mode_pixelwave, _data_FX_MODE_PIXELWAVE);
addEffect(FX_MODE_JUGGLES, &mode_juggles, _data_FX_MODE_JUGGLES);
@@ -7504,29 +7501,15 @@ void WS2812FX::setupEffectData() {
addEffect(FX_MODE_RIPPLEPEAK, &mode_ripplepeak, _data_FX_MODE_RIPPLEPEAK);
addEffect(FX_MODE_GRAVCENTER, &mode_gravcenter, _data_FX_MODE_GRAVCENTER);
addEffect(FX_MODE_GRAVCENTRIC, &mode_gravcentric, _data_FX_MODE_GRAVCENTRIC);
#endif // WLED_DISABLE_AUDIO
#ifdef USERMOD_AUDIOREACTIVE
// --- WLED-SR audio reactive usermod only effects ---
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
#ifdef WLED_DISABLE_2D
#error AUDIOREACTIVE usermod requires 2D support.
#endif
addEffect(FX_MODE_PIXELS, &mode_pixels, _data_FX_MODE_PIXELS);
addEffect(FX_MODE_FREQWAVE, &mode_freqwave, _data_FX_MODE_FREQWAVE);
addEffect(FX_MODE_FREQMATRIX, &mode_freqmatrix, _data_FX_MODE_FREQMATRIX);
addEffect(FX_MODE_2DGEQ, &mode_2DGEQ, _data_FX_MODE_2DGEQ);
addEffect(FX_MODE_WATERFALL, &mode_waterfall, _data_FX_MODE_WATERFALL);
addEffect(FX_MODE_FREQPIXELS, &mode_freqpixels, _data_FX_MODE_FREQPIXELS);
addEffect(FX_MODE_NOISEMOVE, &mode_noisemove, _data_FX_MODE_NOISEMOVE);
addEffect(FX_MODE_FREQMAP, &mode_freqmap, _data_FX_MODE_FREQMAP);
addEffect(FX_MODE_GRAVFREQ, &mode_gravfreq, _data_FX_MODE_GRAVFREQ);
addEffect(FX_MODE_DJLIGHT, &mode_DJLight, _data_FX_MODE_DJLIGHT);
addEffect(FX_MODE_2DFUNKYPLANK, &mode_2DFunkyPlank, _data_FX_MODE_2DFUNKYPLANK);
addEffect(FX_MODE_BLURZ, &mode_blurz, _data_FX_MODE_BLURZ);
addEffect(FX_MODE_ROCKTAVES, &mode_rocktaves, _data_FX_MODE_ROCKTAVES);
//addEffect(FX_MODE_CUSTOMEFFECT, &mode_customEffect, _data_FX_MODE_CUSTOMEFFECT); //WLEDSR Custom Effects
#endif // USERMOD_AUDIOREACTIVE
}

View File

@@ -275,67 +275,39 @@
#define FX_MODE_2DMETABALLS 142 // non audio
#define FX_MODE_2DPULSER 143 // non audio
#define FX_MODE_2DDRIFT 144 // non audio
#endif
#ifndef WLED_DISABLE_AUDIO
#ifndef WLED_DISABLE_2D
#define FX_MODE_2DWAVERLY 145 // audio enhanced
#define FX_MODE_2DSWIRL 146 // audio enhanced
#define FX_MODE_2DAKEMI 147 // audio enhanced
// 148 & 149 reserved
#endif
#define FX_MODE_PIXELWAVE 150 // audio enhanced
#define FX_MODE_JUGGLES 151 // audio enhanced
#define FX_MODE_MATRIPIX 152 // audio enhanced
#define FX_MODE_GRAVIMETER 153 // audio enhanced
#define FX_MODE_PLASMOID 154 // audio enhanced
#define FX_MODE_PUDDLES 155 // audio enhanced
#define FX_MODE_MIDNOISE 156 // audio enhanced
#define FX_MODE_NOISEMETER 157 // audio enhanced
#define FX_MODE_NOISEFIRE 158 // audio enhanced
#define FX_MODE_PUDDLEPEAK 159 // audio enhanced
#define FX_MODE_RIPPLEPEAK 160 // audio enhanced
#define FX_MODE_GRAVCENTER 161 // audio enhanced
#define FX_MODE_GRAVCENTRIC 162 // audio enhanced
#endif
#define FX_MODE_2DWAVERLY 145 // audio enhanced
#define FX_MODE_2DSWIRL 146 // audio enhanced
#define FX_MODE_2DAKEMI 147 // audio enhanced
#define FX_MODE_2DGEQ 148 // audio enhanced
#define FX_MODE_2DFUNKYPLANK 149 // audio enhanced
#endif //WLED_DISABLE_2D
#define FX_MODE_PIXELWAVE 150 // audio enhanced
#define FX_MODE_JUGGLES 151 // audio enhanced
#define FX_MODE_MATRIPIX 152 // audio enhanced
#define FX_MODE_GRAVIMETER 153 // audio enhanced
#define FX_MODE_PLASMOID 154 // audio enhanced
#define FX_MODE_PUDDLES 155 // audio enhanced
#define FX_MODE_MIDNOISE 156 // audio enhanced
#define FX_MODE_NOISEMETER 157 // audio enhanced
#define FX_MODE_NOISEFIRE 158 // audio enhanced
#define FX_MODE_PUDDLEPEAK 159 // audio enhanced
#define FX_MODE_RIPPLEPEAK 160 // audio enhanced
#define FX_MODE_GRAVCENTER 161 // audio enhanced
#define FX_MODE_GRAVCENTRIC 162 // audio enhanced
#define FX_MODE_PIXELS 163 // audio enhanced
#define FX_MODE_FREQWAVE 164 // audio enhanced
#define FX_MODE_FREQMATRIX 165 // audio enhanced
#define FX_MODE_WATERFALL 166 // audio enhanced
#define FX_MODE_FREQPIXELS 167 // audio enhanced
#define FX_MODE_BINMAP 168 // audio enhanced
#define FX_MODE_NOISEMOVE 169 // audio enhanced
#define FX_MODE_FREQMAP 170 // audio enhanced
#define FX_MODE_GRAVFREQ 171 // audio enhanced
#define FX_MODE_DJLIGHT 172 // audio enhanced
#define FX_MODE_BLURZ 173 // audio enhanced
#define FX_MODE_ROCKTAVES 174 // audio enhanced
#ifndef USERMOD_AUDIOREACTIVE
#ifndef WLED_DISABLE_AUDIO
#define MODE_COUNT 163
#else
#ifndef WLED_DISABLE_2D
#define MODE_COUNT 145
#else
#define MODE_COUNT 118
#endif
#endif
#else
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
#ifdef WLED_DISABLE_2D
#error AUDIOREACTIVE usermod requires 2D support.
#endif
#define FX_MODE_2DGEQ 148
#define FX_MODE_2DFUNKYPLANK 149
#define FX_MODE_PIXELS 163
#define FX_MODE_FREQWAVE 164
#define FX_MODE_FREQMATRIX 165
#define FX_MODE_WATERFALL 166
#define FX_MODE_FREQPIXELS 167
#define FX_MODE_BINMAP 168
#define FX_MODE_NOISEMOVE 169
#define FX_MODE_FREQMAP 170
#define FX_MODE_GRAVFREQ 171
#define FX_MODE_DJLIGHT 172
#define FX_MODE_BLURZ 173
#define FX_MODE_ROCKTAVES 174
//#define FX_MODE_CUSTOMEFFECT 175 //WLEDSR Custom Effects
#define MODE_COUNT 175
#endif
#define MODE_COUNT 175
typedef enum mapping1D2D {
M12_Pixels = 0,
@@ -416,14 +388,31 @@ typedef struct Segment {
uint8_t _briT; // temporary brightness
uint8_t _cctT; // temporary CCT
CRGBPalette16 _palT; // temporary palette
uint8_t _prevPaletteBlends; // number of previous palette blends (there are max 128 belnds possible)
uint8_t _modeP; // previous mode/effect
//uint16_t _aux0, _aux1; // previous mode/effect runtime data
//uint32_t _step, _call; // previous mode/effect runtime data
//byte *_data; // previous mode/effect runtime data
uint32_t _start;
uint16_t _dur;
Transition(uint16_t dur=750) : _briT(255), _cctT(127), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(dur) {}
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(d) {
Transition(uint16_t dur=750)
: _briT(255)
, _cctT(127)
, _palT(CRGBPalette16(CRGB::Black))
, _prevPaletteBlends(0)
, _modeP(FX_MODE_STATIC)
, _start(millis())
, _dur(dur)
{}
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o)
: _briT(b)
, _cctT(c)
, _palT(CRGBPalette16(CRGB::Black))
, _prevPaletteBlends(0)
, _modeP(FX_MODE_STATIC)
, _start(millis())
, _dur(d)
{
for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = o[i];
}
} *_t;
@@ -647,8 +636,6 @@ class WS2812FX { // 96 bytes
public:
WS2812FX() :
gammaCorrectBri(false),
gammaCorrectCol(true),
paletteFade(0),
paletteBlend(0),
milliampsPerLed(55),
@@ -747,8 +734,6 @@ class WS2812FX { // 96 bytes
inline void appendSegment(const Segment &seg = Segment()) { _segments.push_back(seg); }
bool
gammaCorrectBri,
gammaCorrectCol,
checkSegmentAlignment(void),
hasRGBWBus(void),
hasCCTBus(void),

View File

@@ -459,14 +459,17 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint3
}
}
#include "console_font_5x8.h"
#include "console_font_5x12.h"
#include "console_font_6x8.h"
#include "console_font_7x9.h"
#include "src/font/console_font_4x6.h"
#include "src/font/console_font_5x8.h"
#include "src/font/console_font_5x12.h"
#include "src/font/console_font_6x8.h"
#include "src/font/console_font_7x9.h"
// draws a raster font character on canvas
// only supports 5x8=40, 5x12=60, 6x8=48 and 7x9=63 fonts ATM
void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color) {
if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported
chr -= 32; // align with font table entries
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
const int font = w*h;
@@ -478,6 +481,7 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w,
if (y0 >= rows) break; // drawing off-screen
uint8_t bits = 0;
switch (font) {
case 24: bits = pgm_read_byte_near(&console_font_4x6[(chr * h) + i]); break; // 5x8 font
case 40: bits = pgm_read_byte_near(&console_font_5x8[(chr * h) + i]); break; // 5x8 font
case 48: bits = pgm_read_byte_near(&console_font_6x8[(chr * h) + i]); break; // 6x8 font
case 63: bits = pgm_read_byte_near(&console_font_7x9[(chr * h) + i]); break; // 7x9 font

View File

@@ -208,6 +208,7 @@ void Segment::setUpLeds() {
CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
static unsigned long _lastPaletteChange = 0; // perhaps it should be per segment
static CRGBPalette16 randomPalette = CRGBPalette16(DEFAULT_COLOR);
byte tcp[72];
if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0;
if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0;
@@ -229,30 +230,31 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
targetPalette = PartyColors_p; break;
case 1: //periodically replace palette with a random one. Doesn't work with multiple FastLED segments
if (millis() - _lastPaletteChange > 5000 /*+ ((uint32_t)(255-intensity))*100*/) {
targetPalette = CRGBPalette16(
CHSV(random8(), 255, random8(128, 255)),
CHSV(random8(), 255, random8(128, 255)),
CHSV(random8(), 192, random8(128, 255)),
CHSV(random8(), 255, random8(128, 255)));
randomPalette = CRGBPalette16(
CHSV(random8(), random8(160, 255), random8(128, 255)),
CHSV(random8(), random8(160, 255), random8(128, 255)),
CHSV(random8(), random8(160, 255), random8(128, 255)),
CHSV(random8(), random8(160, 255), random8(128, 255)));
_lastPaletteChange = millis();
} break;
}
targetPalette = randomPalette; break;
case 2: {//primary color only
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB prim = gamma32(colors[0]);
targetPalette = CRGBPalette16(prim); break;}
case 3: {//primary + secondary
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
CRGB prim = gamma32(colors[0]);
CRGB sec = gamma32(colors[1]);
targetPalette = CRGBPalette16(prim,prim,sec,sec); break;}
case 4: {//primary + secondary + tertiary
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
CRGB prim = gamma32(colors[0]);
CRGB sec = gamma32(colors[1]);
CRGB ter = gamma32(colors[2]);
targetPalette = CRGBPalette16(ter,sec,prim); break;}
case 5: {//primary + secondary (+tert if not off), more distinct
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
CRGB prim = gamma32(colors[0]);
CRGB sec = gamma32(colors[1]);
if (colors[2]) {
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
CRGB ter = gamma32(colors[2]);
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,ter,ter,ter,ter,ter,prim);
} else {
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,sec,sec,sec);
@@ -339,8 +341,11 @@ CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal
loadPalette(targetPalette, pal);
if (transitional && _t && progress() < 0xFFFFU) {
// blend palettes
uint8_t blends = map(_t->_dur, 0, 0xFFFF, 48, 6); // do not blend palettes too quickly (0-65.5s)
nblendPaletteTowardPalette(_t->_palT, targetPalette, blends);
// there are about 255 blend passes of 48 "blends" to completely blend two palettes (in _dur time)
// minimum blend time is 100ms maximum is 65535ms
uint32_t timeMS = millis() - _t->_start;
uint16_t noOfBlends = (255U * timeMS / _t->_dur) - _t->_prevPaletteBlends;
for (int i=0; i<noOfBlends; i++, _t->_prevPaletteBlends++) nblendPaletteTowardPalette(_t->_palT, targetPalette, 48);
targetPalette = _t->_palT; // copy transitioning/temporary palette
}
return targetPalette;
@@ -823,7 +828,7 @@ uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_
// default palette or no RGB support on segment
if ((palette == 0 && mcol < NUM_COLORS) || !(_capabilities & 0x01)) {
uint32_t color = (transitional && _t) ? _t->_colorT[mcol] : colors[mcol];
color = strip.gammaCorrectCol ? gamma32(color) : color;
color = gamma32(color);
if (pbri == 255) return color;
return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri));
}

View File

@@ -170,6 +170,7 @@ class Bus {
static bool isRgbw(uint8_t type) {
if (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true;
if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true;
if (type == TYPE_NET_DDP_RGBW) return true;
return false;
}
virtual bool hasRGB() {
@@ -178,7 +179,7 @@ class Bus {
}
virtual bool hasWhite() {
if (_type == TYPE_SK6812_RGBW || _type == TYPE_TM1814 || _type == TYPE_WS2812_1CH || _type == TYPE_WS2812_WWA ||
_type == TYPE_ANALOG_1CH || _type == TYPE_ANALOG_2CH || _type == TYPE_ANALOG_4CH || _type == TYPE_ANALOG_5CH) return true;
_type == TYPE_ANALOG_1CH || _type == TYPE_ANALOG_2CH || _type == TYPE_ANALOG_4CH || _type == TYPE_ANALOG_5CH || _type == TYPE_NET_DDP_RGBW) return true;
return false;
}
static void setCCT(uint16_t cct) {
@@ -573,9 +574,9 @@ class BusNetwork : public Bus {
// _rgbw = false;
// _UDPtype = 0;
// break;
// default:
_rgbw = false;
_UDPtype = bc.type - TYPE_NET_DDP_RGB;
// default: // TYPE_NET_DDP_RGB / TYPE_NET_DDP_RGBW
_rgbw = bc.type == TYPE_NET_DDP_RGBW;
_UDPtype = 0;
// break;
// }
_UDPchannels = _rgbw ? 4 : 3;

View File

@@ -302,10 +302,10 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
float light_gc_bri = light["gc"]["bri"];
float light_gc_col = light["gc"]["col"]; // 2.8
if (light_gc_bri > 1.5) strip.gammaCorrectBri = true;
else if (light_gc_bri > 0.5) strip.gammaCorrectBri = false;
if (light_gc_col > 1.5) strip.gammaCorrectCol = true;
else if (light_gc_col > 0.5) strip.gammaCorrectCol = false;
if (light_gc_bri > 1.5) gammaCorrectBri = true;
else if (light_gc_bri > 0.5) gammaCorrectBri = false;
if (light_gc_col > 1.5) gammaCorrectCol = true;
else if (light_gc_col > 0.5) gammaCorrectCol = false;
JsonObject light_tr = light["tr"];
CJSON(fadeTransition, light_tr["mode"]);
@@ -759,8 +759,8 @@ void serializeConfig() {
light[F("aseg")] = autoSegments;
JsonObject light_gc = light.createNestedObject("gc");
light_gc["bri"] = (strip.gammaCorrectBri) ? 2.8 : 1.0;
light_gc["col"] = (strip.gammaCorrectCol) ? 2.8 : 1.0;
light_gc["bri"] = (gammaCorrectBri) ? 2.8 : 1.0;
light_gc["col"] = (gammaCorrectCol) ? 2.8 : 1.0;
JsonObject light_tr = light.createNestedObject("tr");
light_tr["mode"] = fadeTransition;

View File

@@ -358,7 +358,7 @@ uint8_t gamma8(uint8_t b)
uint32_t gamma32(uint32_t color)
{
//if (!strip.gammaCorrectCol) return color;
if (!gammaCorrectCol) return color;
uint8_t w = W(color);
uint8_t r = R(color);
uint8_t g = G(color);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -172,8 +172,9 @@
#define TYPE_LPD6803 54
//Network types (master broadcast) (80-95)
#define TYPE_NET_DDP_RGB 80 //network DDP RGB bus (master broadcast bus)
#define TYPE_NET_E131_RGB 81 //network E131 RGB bus (master broadcast bus)
#define TYPE_NET_ARTNET_RGB 82 //network ArtNet RGB bus (master broadcast bus)
#define TYPE_NET_E131_RGB 81 //network E131 RGB bus (master broadcast bus, unused)
#define TYPE_NET_ARTNET_RGB 82 //network ArtNet RGB bus (master broadcast bus, unused)
#define TYPE_NET_DDP_RGBW 88 //network DDP RGBW bus (master broadcast bus)
#define IS_DIGITAL(t) ((t) & 0x10) //digital are 16-31 and 48-63
#define IS_PWM(t) ((t) > 40 && (t) < 46)

View File

@@ -101,7 +101,7 @@ button {
position: fixed;
bottom: calc(var(--bh) + 6px);
right: 6px;
color: var(--c-d);
color: var(--c-d); /* must remain bright with dark shadow (see below) to be legible on gray background */
cursor: pointer;
writing-mode: vertical-rl;
transform: rotate(180deg);
@@ -1045,7 +1045,7 @@ textarea {
/*box-shadow: 0 0 0 5px var(--c-d);*/
}
.qcs, #namelabel {
.qcs, #namelabel { /* text shadow for name to be legible on grey backround */
text-shadow: -1px -1px 0 var(--c-4), 1px -1px 0 var(--c-4), -1px 1px 0 var(--c-4), 1px 1px 0 var(--c-4);
}

View File

@@ -611,13 +611,13 @@ function parseInfo(i) {
//gId("filter2D").classList.add("hide");
hideModes("2D");
}
if (i.noaudio) {
gId("filterVol").classList.add("hide");
gId("filterFreq").classList.add("hide");
}
// if (i.noaudio) {
// gId("filterVol").classList.add("hide");
// gId("filterFreq").classList.add("hide");
// }
// if (!i.u || !i.u.AudioReactive) {
//gId("filterVol").classList.add("hide"); hideModes(" ♪"); // hide volume reactive effects
//gId("filterFreq").classList.add("hide"); hideModes(" ♫"); // hide frequency reactive effects
// gId("filterVol").classList.add("hide"); hideModes(" ♪"); // hide volume reactive effects
// gId("filterFreq").classList.add("hide"); hideModes(" ♫"); // hide frequency reactive effects
// }
}
@@ -659,6 +659,7 @@ function populateInfo(i)
cn += `v${i.ver} "${vcn}"<br><br><table>
${urows}
${urows===""?'':'<tr><td colspan=2><hr style="height:1px;border-width:0;color:gray;background-color:gray"></td></tr>'}
${inforow("Build",i.vid)}
${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")}
${inforow("Uptime",getRuntimeStr(i.uptime))}
@@ -1042,7 +1043,7 @@ function updateLen(s)
let tPL = gId(`seg${s}lbtm`);
if (stop-start>1 && stopY-startY>1) {
// 2D segment
tPL.classList.remove("hide"); // unhide transpose checkbox
if (tPL) tPL.classList.remove("hide"); // unhide transpose checkbox
let sE = gId('fxlist').querySelector(`.lstI[data-id="${selectedFx}"]`);
if (sE) {
let sN = sE.querySelector(".lstIname").innerText;
@@ -1054,8 +1055,10 @@ function updateLen(s)
}
} else {
// 1D segment in 2D set-up
tPL.classList.add("hide"); // hide transpose checkbox
gId(`seg${s}tp`).checked = false; // and uncheck it
if (tPL) {
tPL.classList.add("hide"); // hide transpose checkbox
gId(`seg${s}tp`).checked = false; // and uncheck it
}
}
}
var out = "(delete)";
@@ -1995,15 +1998,15 @@ function setSeg(s)
var stopY = parseInt(gId(`seg${s}eY`).value);
obj.seg.startY = startY;
obj.seg.stopY = (cfg.comp.seglen?startY:0)+stopY;
obj.seg.tp = gId(`seg${s}tp`).checked;
}
if (gId(`seg${s}grp`)) {
if (gId(`seg${s}grp`)) { // advanced options, not present in new segment dialog (makeSeg())
var grp = parseInt(gId(`seg${s}grp`).value);
var spc = parseInt(gId(`seg${s}spc`).value);
var ofs = parseInt(gId(`seg${s}of` ).value);
obj.seg.grp = grp;
obj.seg.spc = spc;
obj.seg.of = ofs;
if (isM) obj.seg.tp = gId(`seg${s}tp`).checked;
}
requestJson(obj);
}

View File

@@ -177,7 +177,7 @@
if (t > 31 && t < 48) d.getElementsByName("LC"+n)[0].value = 1; // for sanity change analog count just to 1 LED
}
gId("rf"+n).onclick = (t == 31) ? (()=>{return false}) : (()=>{}); // prevent change for TM1814
isRGBW |= (t == 30 || t == 31 || (t > 40 && t < 46 && t != 43)); // RGBW checkbox, TYPE_xxxx values from const.h
isRGBW = (t == 30 || t == 31 || (t > 40 && t < 46 && t != 43) || t == 88); // RGBW checkbox, TYPE_xxxx values from const.h
gId("co"+n).style.display = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? "none":"inline"; // hide color order for PWM
gId("dig"+n+"w").style.display = (t == 30 || t == 31) ? "inline":"none"; // show swap channels dropdown
if (!(t == 30 || t == 31)) d.getElementsByName("WO"+n)[0].value = 0; // reset swapping
@@ -332,6 +332,7 @@ ${i+1}:
<option value="80">DDP RGB (network)</option>
<!--option value="81">E1.31 RGB (network)</option-->
<!--option value="82">ArtNet RGB (network)</option-->
<option value="88">DDP RGBW (network)</option>
</select><br>
<div id="co${i}" style="display:inline">Color Order:
<select name="CO${i}">

View File

@@ -25,9 +25,11 @@ void handleDDPPacket(e131_packet_t* p) {
}
}
uint32_t start = htonl(p->channelOffset) /3;
start += DMXAddress /3;
uint16_t stop = start + htons(p->dataLen) /3;
uint8_t ddpChannelsPerLed = (p->dataType == DDP_TYPE_RGBW32) ? 4 : 3; // data type 0x1A is RGBW (type 3, 8 bit/channel)
uint32_t start = htonl(p->channelOffset) / ddpChannelsPerLed;
start += DMXAddress / ddpChannelsPerLed;
uint16_t stop = start + htons(p->dataLen) / ddpChannelsPerLed;
uint8_t* data = p->data;
uint16_t c = 0;
if (p->flags & DDP_TIMECODE_FLAG) c = 4; //packet has timecode flag, we do not support it, but data starts 4 bytes later
@@ -36,8 +38,8 @@ void handleDDPPacket(e131_packet_t* p) {
if (!realtimeOverride || (realtimeMode && useMainSegmentOnly)) {
for (uint16_t i = start; i < stop; i++) {
setRealtimePixel(i, data[c], data[c+1], data[c+2], 0);
c+=3;
setRealtimePixel(i, data[c], data[c+1], data[c+2], ddpChannelsPerLed >3 ? data[c+3] : 0);
c += ddpChannelsPerLed;
}
}

View File

@@ -236,7 +236,7 @@ const uint8_t PAGE_settings_wifi[] PROGMEM = {
// Autogenerated from wled00/data/settings_leds.htm, do not edit!!
const uint16_t PAGE_settings_leds_length = 7357;
const uint16_t PAGE_settings_leds_length = 7368;
const uint8_t PAGE_settings_leds[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xed, 0x76, 0xe2, 0xc6,
0x92, 0xff, 0x79, 0x8a, 0x76, 0x27, 0x71, 0xa4, 0x8b, 0x0c, 0x12, 0x1f, 0x8e, 0x07, 0x10, 0xac,
@@ -359,345 +359,346 @@ const uint8_t PAGE_settings_leds[] PROGMEM = {
0x43, 0x32, 0x20, 0x3c, 0x6b, 0x38, 0xe5, 0xb2, 0x4a, 0xdc, 0x61, 0xc9, 0xb3, 0x97, 0x97, 0x26,
0xb0, 0xe8, 0x6a, 0x2e, 0xb7, 0x0a, 0x17, 0xac, 0x02, 0xc6, 0xee, 0xb4, 0xf5, 0x5c, 0x4a, 0x62,
0x42, 0x92, 0xa3, 0xe5, 0x11, 0xfa, 0x9e, 0x0d, 0x49, 0xc5, 0x83, 0xc9, 0xf1, 0x0d, 0xb0, 0x78,
0x3c, 0x30, 0x3a, 0xbc, 0x86, 0x5c, 0x6b, 0xde, 0x0b, 0x38, 0x58, 0x78, 0x2c, 0xa9, 0x71, 0x81,
0x70, 0x69, 0xb5, 0x40, 0x5a, 0xad, 0xe6, 0x01, 0x30, 0xc0, 0x51, 0xd9, 0x3e, 0x47, 0x55, 0x9c,
0x6f, 0x4e, 0xb4, 0x38, 0xd0, 0x94, 0x23, 0x4f, 0x06, 0x42, 0x10, 0x9d, 0x54, 0x70, 0x1c, 0xc5,
0xc4, 0x99, 0x01, 0x8e, 0x2a, 0x7d, 0xda, 0xb2, 0xcb, 0x3c, 0x07, 0x5b, 0x16, 0xd9, 0xd4, 0x81,
0x09, 0xf0, 0x3b, 0x06, 0xff, 0x53, 0x2e, 0x81, 0x8f, 0x37, 0x45, 0x09, 0xe8, 0x6a, 0x91, 0xa4,
0x4d, 0x4b, 0x58, 0x7f, 0x1b, 0xb7, 0x21, 0xdd, 0x33, 0xeb, 0xfd, 0x43, 0x23, 0xfa, 0xbf, 0x23,
0xb0, 0x69, 0x19, 0x1e, 0xe3, 0x18, 0x87, 0x36, 0x1b, 0x1c, 0x4f, 0x5b, 0x4f, 0xcc, 0xac, 0x2c,
0x23, 0x49, 0xf0, 0x58, 0x5b, 0x78, 0xa0, 0x10, 0x68, 0xa1, 0x78, 0xcb, 0xc7, 0x81, 0x67, 0xdb,
0xf6, 0x14, 0x19, 0xcb, 0x97, 0xde, 0x23, 0xa4, 0x62, 0x6c, 0x42, 0xa0, 0x8c, 0xc6, 0xea, 0xb4,
0x43, 0xef, 0x20, 0x6f, 0x04, 0xcf, 0x33, 0x21, 0x4a, 0xe8, 0xc7, 0x16, 0xbe, 0x32, 0x4e, 0xf4,
0xff, 0xfe, 0x2f, 0x35, 0xcd, 0x8c, 0x26, 0xfb, 0xf1, 0x4d, 0xd8, 0x37, 0x74, 0x0f, 0xbc, 0x5d,
0xd5, 0xa1, 0x6b, 0x74, 0x12, 0x21, 0x98, 0xf8, 0x3f, 0x96, 0x0c, 0xc2, 0x22, 0xf7, 0x9a, 0x7e,
0x78, 0xea, 0xba, 0x0a, 0xad, 0x3d, 0xc1, 0x8a, 0x6a, 0x4b, 0x33, 0x4c, 0xfc, 0x66, 0xe6, 0x4a,
0x97, 0xdc, 0x87, 0x86, 0xe8, 0xf8, 0x36, 0xe6, 0xba, 0x39, 0x49, 0xee, 0x84, 0x82, 0xd7, 0x4a,
0x6e, 0x6d, 0x61, 0xea, 0xda, 0x23, 0xb6, 0xd2, 0x00, 0x7d, 0x46, 0x26, 0xd8, 0x2a, 0xbf, 0x67,
0x66, 0xb0, 0xab, 0xfc, 0xf6, 0x4b, 0x5f, 0x25, 0x05, 0xcf, 0x19, 0x54, 0x0b, 0x33, 0x59, 0xb1,
0x60, 0xf1, 0x33, 0x4b, 0x8a, 0x9f, 0x99, 0xfa, 0x8a, 0xb9, 0x43, 0x50, 0x35, 0x79, 0x63, 0xa1,
0x5b, 0x32, 0x38, 0xa9, 0x9c, 0x66, 0x49, 0xe5, 0x24, 0x68, 0x28, 0xae, 0xf9, 0xa7, 0x0a, 0x1c,
0x55, 0x94, 0x37, 0xcf, 0x7c, 0x06, 0x48, 0x10, 0x22, 0xa4, 0x26, 0xbe, 0x38, 0x1e, 0x88, 0x25,
0xc8, 0x24, 0x6d, 0xfb, 0xae, 0x1f, 0x9a, 0xf4, 0xbb, 0xe9, 0x74, 0x4a, 0xbb, 0x69, 0x3d, 0x94,
0x0e, 0x6c, 0x36, 0xb3, 0x71, 0x47, 0x46, 0xae, 0x1b, 0xb0, 0x8f, 0xe7, 0xa4, 0xda, 0x9b, 0x25,
0xd5, 0xde, 0x2c, 0xa9, 0xf6, 0x66, 0x49, 0xb5, 0x37, 0x93, 0xdd, 0x80, 0x60, 0xab, 0x1b, 0x10,
0xe4, 0xba, 0x01, 0xb8, 0x44, 0xd8, 0xf3, 0xec, 0xe6, 0xda, 0x02, 0xa7, 0x61, 0x68, 0xad, 0x6a,
0x4e, 0xc4, 0xff, 0x26, 0xe5, 0xbc, 0x8a, 0x8b, 0xfc, 0x00, 0x8b, 0xfc, 0xd0, 0x93, 0x6d, 0x03,
0xb9, 0xd2, 0x0f, 0xb0, 0xd2, 0xab, 0x5a, 0xb0, 0x8c, 0xe6, 0x12, 0xf4, 0xd3, 0xc3, 0x67, 0x55,
0x16, 0xbb, 0x3a, 0x94, 0xba, 0x41, 0xbe, 0xd4, 0x05, 0x2a, 0xce, 0x81, 0xf9, 0x55, 0xd0, 0x9d,
0x02, 0x27, 0xaf, 0x95, 0xbc, 0xd3, 0x44, 0x08, 0xd3, 0x44, 0x08, 0xd3, 0x44, 0x08, 0xd3, 0x44,
0x08, 0xd3, 0x44, 0x08, 0xd3, 0x44, 0x08, 0xd3, 0x44, 0x08, 0xd3, 0x5c, 0xc9, 0x3b, 0x2d, 0x2d,
0x79, 0xaf, 0x4a, 0x99, 0x78, 0x6b, 0xc9, 0x7b, 0xb5, 0xaf, 0xe4, 0x15, 0xd2, 0xff, 0xba, 0x25,
0xfd, 0xec, 0x89, 0x94, 0x5b, 0x4a, 0x27, 0x7b, 0xc7, 0xbb, 0x2e, 0xeb, 0xf5, 0x4a, 0x34, 0x67,
0x98, 0xd9, 0x67, 0xb9, 0xe6, 0x4c, 0x50, 0x6c, 0xce, 0x0c, 0xb6, 0x95, 0x0d, 0x82, 0x2c, 0xed,
0x6c, 0x3d, 0xde, 0x81, 0xa0, 0xdf, 0x6c, 0x0e, 0xa8, 0x1f, 0x5a, 0xde, 0x0c, 0x9d, 0x00, 0xd7,
0xd3, 0xf5, 0x9a, 0xb9, 0x11, 0xe3, 0x02, 0xba, 0xdc, 0x35, 0xac, 0x9b, 0xef, 0xa2, 0x43, 0xa1,
0x96, 0xf5, 0xd0, 0x3f, 0xf9, 0x9f, 0x5f, 0x5e, 0x44, 0x40, 0x77, 0x23, 0xee, 0xdb, 0x44, 0xfc,
0x59, 0xc8, 0xf8, 0x23, 0x1f, 0x82, 0x0b, 0xc2, 0xf2, 0x07, 0xd2, 0x81, 0x3c, 0x26, 0xed, 0x12,
0xc2, 0x99, 0x62, 0x65, 0x54, 0xb7, 0xf0, 0xa8, 0x6a, 0xf5, 0xb2, 0xbf, 0x00, 0xa8, 0x85, 0x69,
0x55, 0x2f, 0x55, 0xed, 0xb2, 0x6f, 0xc3, 0x17, 0xdb, 0x84, 0x8f, 0x7f, 0xde, 0x8c, 0x7b, 0x18,
0x79, 0x94, 0xc7, 0x2a, 0x8c, 0x06, 0x79, 0x0b, 0x5a, 0x18, 0x17, 0xb1, 0x51, 0x7d, 0x26, 0x77,
0x40, 0x16, 0xd2, 0x51, 0x6f, 0x3d, 0x37, 0xcd, 0xc7, 0x01, 0x05, 0x99, 0x29, 0xb4, 0xfa, 0x58,
0xa5, 0x24, 0x98, 0xaf, 0x22, 0xc7, 0xb6, 0xdc, 0xc4, 0xb3, 0x2f, 0xf4, 0x42, 0x05, 0x14, 0x6b,
0x62, 0xff, 0x21, 0xae, 0x63, 0xda, 0xff, 0x17, 0x43, 0x97, 0x55, 0xf4, 0x64, 0x6c, 0x65, 0xe1,
0x74, 0x6c, 0xd9, 0x0f, 0xb3, 0xd0, 0x5f, 0x7a, 0x13, 0xf3, 0x0b, 0xba, 0x65, 0x2b, 0x3c, 0x9a,
0x85, 0xd6, 0xc4, 0xc1, 0xae, 0xfb, 0x3b, 0x7d, 0xc2, 0x66, 0x1a, 0xf9, 0xfe, 0x59, 0xb4, 0x13,
0x8e, 0xf5, 0x81, 0xf8, 0xf0, 0x0e, 0x12, 0x76, 0xbe, 0xe2, 0xb9, 0x55, 0xb4, 0x6d, 0x9b, 0xae,
0x89, 0x9e, 0x00, 0xaf, 0x7f, 0xd0, 0xc8, 0x77, 0xad, 0x56, 0x2b, 0xfb, 0x4e, 0x80, 0xfe, 0x0f,
0xea, 0x17, 0xb9, 0x22, 0x6c, 0xb2, 0xab, 0x3a, 0xb0, 0xfb, 0xd7, 0x56, 0x3c, 0x47, 0xf7, 0xa4,
0x70, 0xa7, 0xaa, 0x9d, 0xe8, 0xba, 0xfa, 0xf2, 0x22, 0x28, 0x9f, 0xe8, 0xe5, 0x31, 0xb2, 0x04,
0x9f, 0x50, 0xc1, 0x04, 0x9b, 0xf5, 0xad, 0x04, 0x9b, 0xa1, 0x6f, 0x4e, 0x44, 0x60, 0x7b, 0x82,
0x02, 0x34, 0xf2, 0xbd, 0x82, 0x30, 0x33, 0xfa, 0x27, 0xfa, 0x0f, 0xd8, 0x84, 0x07, 0x74, 0x35,
0x6c, 0xa6, 0x90, 0x05, 0x5b, 0xf8, 0xe1, 0x8a, 0x56, 0xb3, 0xa6, 0xcb, 0xe0, 0x0b, 0x51, 0x7a,
0xe3, 0xfe, 0xc5, 0xdd, 0xdd, 0xcd, 0x5d, 0x87, 0xfc, 0xca, 0x9b, 0x27, 0x3e, 0xc4, 0x64, 0x10,
0x06, 0xae, 0xc4, 0x7a, 0x78, 0xd0, 0xab, 0x8f, 0xfb, 0xea, 0x17, 0x48, 0xc1, 0xd5, 0x0e, 0xe0,
0xd3, 0x45, 0x53, 0x26, 0x00, 0x08, 0x19, 0xc4, 0x79, 0x50, 0x9c, 0x9b, 0x9c, 0x77, 0x9b, 0x39,
0xae, 0xa2, 0x00, 0xda, 0xea, 0xe3, 0x5f, 0x44, 0xa1, 0xa3, 0xd6, 0xdb, 0x30, 0x8b, 0x7a, 0xa3,
0x3b, 0x37, 0xe7, 0xfd, 0xf6, 0x20, 0x83, 0x9a, 0xab, 0x9d, 0x79, 0xd7, 0x32, 0x65, 0x66, 0x3f,
0xe6, 0x19, 0xdd, 0x66, 0x89, 0xad, 0x0d, 0xcd, 0x7c, 0x75, 0x95, 0x75, 0x32, 0xe6, 0x3d, 0xa3,
0xa6, 0x37, 0x0e, 0x0f, 0x0f, 0xc6, 0xf0, 0x6f, 0x38, 0x00, 0x34, 0x17, 0xa3, 0x5b, 0xd2, 0xfe,
0x0d, 0x3b, 0x90, 0xe4, 0xc9, 0x89, 0xe7, 0xc4, 0x38, 0x25, 0xbf, 0x8e, 0x86, 0x24, 0x5a, 0x06,
0x81, 0xbb, 0xa2, 0x1d, 0xc5, 0xaa, 0x9a, 0xe3, 0x01, 0x35, 0x1a, 0xbf, 0x11, 0xda, 0x19, 0x0e,
0xe8, 0xc7, 0x51, 0xe3, 0xc4, 0x68, 0x13, 0xf1, 0x9d, 0xc2, 0x40, 0xaa, 0x01, 0xc4, 0x1c, 0xff,
0x47, 0x4f, 0xe5, 0x28, 0xec, 0xad, 0x79, 0x90, 0x41, 0x40, 0x52, 0x12, 0xfb, 0x7c, 0xda, 0x54,
0x14, 0x6a, 0xa3, 0xdd, 0x93, 0x35, 0xc4, 0x6c, 0xb5, 0x0b, 0x93, 0x2a, 0xbc, 0x71, 0xe5, 0x47,
0x31, 0x61, 0xd3, 0x29, 0xa0, 0x89, 0x34, 0xf2, 0x9f, 0xb4, 0x7b, 0x51, 0x35, 0x47, 0xe6, 0xa8,
0x20, 0x89, 0x91, 0xda, 0x19, 0x69, 0x17, 0x9c, 0xb0, 0x13, 0x11, 0xe6, 0xf9, 0xcb, 0xd9, 0x5c,
0xed, 0x8d, 0xc3, 0x7e, 0xd6, 0x1e, 0x2a, 0x2c, 0xaf, 0x55, 0xe8, 0x1a, 0x65, 0xcf, 0x87, 0x68,
0x6f, 0x17, 0xe2, 0xe5, 0x57, 0xa1, 0x13, 0x45, 0x75, 0x3d, 0x91, 0x92, 0xbc, 0xbc, 0x97, 0x75,
0x2a, 0x4d, 0x34, 0x33, 0xb7, 0xc5, 0x65, 0x45, 0xf1, 0x85, 0x37, 0x91, 0xcd, 0x3e, 0xd6, 0x33,
0x92, 0x06, 0x9e, 0xde, 0x7d, 0x7c, 0xcd, 0x7f, 0x8c, 0x40, 0xb1, 0xd8, 0x11, 0x44, 0x8f, 0xcc,
0x87, 0x54, 0x5f, 0xef, 0x39, 0x6c, 0x0e, 0xe9, 0x8a, 0x02, 0xfd, 0x75, 0x5f, 0xb5, 0x35, 0x50,
0x72, 0xea, 0xf1, 0xf2, 0xc7, 0x13, 0xe5, 0x0f, 0x54, 0xe1, 0xaa, 0xe6, 0x44, 0xbf, 0x58, 0xbf,
0x28, 0x8f, 0xea, 0x40, 0xef, 0x3c, 0x66, 0x53, 0x85, 0xa2, 0x15, 0x17, 0x35, 0xdd, 0xce, 0x13,
0x7b, 0x19, 0x1b, 0xe4, 0xce, 0x92, 0x2d, 0x1d, 0x48, 0xef, 0x46, 0xf7, 0x90, 0xdc, 0x39, 0x66,
0x9c, 0x26, 0x72, 0x53, 0xe5, 0x40, 0x81, 0x0a, 0x04, 0xa2, 0x95, 0xd3, 0xc7, 0xb4, 0x6a, 0xf8,
0xf2, 0x72, 0x24, 0xbe, 0x83, 0x32, 0x3b, 0x6a, 0xd2, 0xbd, 0x16, 0x0e, 0x0f, 0xe6, 0xca, 0x23,
0x27, 0x02, 0x24, 0xf5, 0xf8, 0x97, 0xde, 0xc4, 0x79, 0x24, 0x7c, 0xdb, 0xc8, 0xe4, 0xf8, 0xfb,
0xbf, 0x7b, 0xbd, 0x39, 0x14, 0xba, 0xb8, 0x6e, 0x72, 0x77, 0xb9, 0xd3, 0x38, 0xd6, 0x83, 0x6f,
0xf8, 0xe6, 0xfb, 0x67, 0xa7, 0x6a, 0xac, 0x3b, 0x00, 0x22, 0x1a, 0x02, 0x44, 0xec, 0x1b, 0x5f,
0xdd, 0xc3, 0x8b, 0x35, 0x25, 0x50, 0xb4, 0xcd, 0xd1, 0x33, 0x98, 0xf4, 0xd7, 0x4b, 0x25, 0x0e,
0x41, 0x22, 0x1c, 0x9d, 0x1f, 0xf0, 0xd9, 0xca, 0x92, 0xb2, 0xd1, 0xa0, 0x44, 0x8c, 0x66, 0x93,
0x3e, 0xb7, 0x82, 0x6f, 0xbd, 0xba, 0x00, 0xd9, 0x06, 0x6e, 0xea, 0xb4, 0x3f, 0xfa, 0xdb, 0xf1,
0x89, 0xd1, 0x20, 0x77, 0x1f, 0x86, 0x1f, 0xf7, 0x00, 0x1a, 0xb4, 0x7f, 0x7f, 0x6d, 0x9c, 0x18,
0xad, 0xdd, 0x30, 0x8d, 0x16, 0x85, 0x42, 0x51, 0x7f, 0xf8, 0xf9, 0x3f, 0xf6, 0xc0, 0xb4, 0x05,
0x9e, 0xc6, 0xbb, 0xdd, 0x30, 0x6d, 0x60, 0x0a, 0x19, 0xd7, 0x8d, 0x3d, 0x30, 0xc0, 0xcf, 0xe9,
0xed, 0xa9, 0xa1, 0x37, 0xf6, 0xc0, 0x34, 0x68, 0xff, 0xea, 0xf6, 0xfc, 0xe4, 0x44, 0x3f, 0xde,
0x03, 0xd4, 0xe2, 0x40, 0xc7, 0x27, 0x7a, 0x73, 0x0f, 0x50, 0x93, 0xf6, 0x6f, 0xdf, 0x9d, 0x18,
0x7b, 0x40, 0x5a, 0xc0, 0xf4, 0x8d, 0x57, 0xbf, 0x99, 0x4e, 0xf7, 0xc0, 0x00, 0xd3, 0xb7, 0x1f,
0xaf, 0xc9, 0xc7, 0xb9, 0x13, 0xb3, 0x3d, 0x60, 0x0d, 0x01, 0x76, 0x76, 0x76, 0xbf, 0x07, 0xa8,
0x29, 0x80, 0x60, 0xd9, 0xf6, 0x00, 0xb5, 0x52, 0xa0, 0x3d, 0x6b, 0xdb, 0x6a, 0xa7, 0x50, 0xd5,
0x22, 0xcd, 0xdf, 0xbf, 0x35, 0xed, 0x83, 0xa3, 0xa3, 0x0d, 0xf0, 0xe3, 0x0c, 0xfc, 0x3c, 0x07,
0x7f, 0x74, 0x04, 0xe0, 0x6c, 0x0b, 0xfb, 0x09, 0x08, 0xe6, 0xfc, 0xfc, 0x16, 0xc1, 0x89, 0xe2,
0xb1, 0xf8, 0xc9, 0x0f, 0x1f, 0xd4, 0xd7, 0x68, 0x9c, 0x80, 0xa4, 0x2e, 0x8c, 0x5a, 0xd3, 0x28,
0x1f, 0x96, 0x90, 0x2a, 0x1f, 0x0b, 0xe2, 0x3b, 0x0d, 0xe3, 0x5f, 0x58, 0xbc, 0x7f, 0x70, 0xaf,
0x2e, 0xcc, 0xa4, 0x8f, 0x9e, 0x18, 0xbe, 0xa2, 0xa1, 0x3a, 0x13, 0x93, 0xda, 0xbe, 0xb0, 0x36,
0x69, 0xa2, 0xd2, 0xb7, 0x76, 0x64, 0xa4, 0xef, 0x9f, 0x61, 0x28, 0x27, 0x37, 0xe1, 0x84, 0x85,
0x5b, 0x86, 0x7a, 0x76, 0xc3, 0x87, 0x6e, 0x8b, 0x18, 0x64, 0xf0, 0xe1, 0x6e, 0xcf, 0x42, 0xc1,
0x74, 0xf7, 0x2e, 0x24, 0x4c, 0x69, 0x78, 0xf7, 0x61, 0x8f, 0x79, 0xc2, 0xf8, 0xe1, 0x9e, 0xf7,
0xa0, 0x07, 0xc3, 0x0f, 0x77, 0x7b, 0x14, 0x1c, 0xf8, 0x1b, 0x16, 0xde, 0xa7, 0xc2, 0xa9, 0x83,
0x5c, 0xf2, 0xe2, 0x99, 0x38, 0x33, 0x9c, 0xe4, 0xd3, 0x96, 0x80, 0x78, 0x9c, 0xe9, 0x8f, 0x9e,
0xac, 0xa0, 0x43, 0x8a, 0x62, 0xf9, 0x28, 0xc5, 0xb2, 0x2d, 0x94, 0x5f, 0x60, 0x4c, 0x4a, 0x75,
0x5b, 0x26, 0x1f, 0xc9, 0x21, 0x19, 0xee, 0x7a, 0xdf, 0x10, 0xef, 0x3f, 0xec, 0x7a, 0xdf, 0x14,
0xef, 0xb3, 0x59, 0x95, 0xce, 0x09, 0xff, 0x44, 0x81, 0xe5, 0xf1, 0xb9, 0x05, 0xd1, 0x44, 0x70,
0x2a, 0xda, 0x0d, 0x30, 0x00, 0xde, 0xf4, 0x49, 0x4f, 0xec, 0x74, 0xe2, 0x29, 0x0e, 0x93, 0x7a,
0xcb, 0xc5, 0x98, 0x85, 0x34, 0x71, 0xcd, 0x23, 0xa1, 0x2c, 0x38, 0xda, 0x8d, 0xc4, 0x67, 0xe9,
0xed, 0x5d, 0x22, 0xaa, 0x02, 0x4a, 0xb0, 0xba, 0x85, 0xd9, 0x62, 0x96, 0x86, 0xaa, 0xfd, 0xce,
0xa0, 0x09, 0x8f, 0xdf, 0x3f, 0x27, 0xe1, 0xd8, 0x51, 0xb9, 0x83, 0xe7, 0x94, 0x4c, 0x9a, 0xaf,
0x27, 0x10, 0xe9, 0x67, 0x13, 0xdd, 0x7d, 0x17, 0xfb, 0xff, 0x5d, 0x4a, 0x92, 0x56, 0x22, 0xa9,
0xf7, 0x0f, 0xbd, 0x71, 0x14, 0x74, 0xb7, 0x97, 0xc7, 0xde, 0xa9, 0xbf, 0x57, 0x3c, 0xb4, 0x75,
0xf6, 0x4e, 0xea, 0xac, 0x38, 0x11, 0x39, 0x03, 0x43, 0xce, 0x80, 0x27, 0x8e, 0xb7, 0xc3, 0x35,
0xcd, 0x56, 0x2a, 0x63, 0x29, 0x9d, 0x02, 0xf2, 0x4a, 0x81, 0x43, 0x21, 0x6c, 0x69, 0x63, 0xf5,
0x2d, 0x89, 0xeb, 0x52, 0xe2, 0xbc, 0x0f, 0xfc, 0x16, 0x81, 0xeb, 0x82, 0xb7, 0x82, 0x4c, 0x9b,
0xcd, 0x1c, 0x07, 0x92, 0xeb, 0x68, 0x23, 0x5e, 0xaa, 0xb4, 0x5e, 0xa4, 0x6c, 0x48, 0xca, 0x92,
0xe8, 0x3e, 0x9a, 0xc6, 0x0e, 0x9a, 0x6f, 0x25, 0xd5, 0x78, 0x3b, 0xa9, 0xc6, 0xbf, 0x48, 0xaa,
0xf9, 0x76, 0x52, 0xcd, 0x7f, 0x91, 0x54, 0xeb, 0xed, 0xa4, 0x5a, 0xff, 0x14, 0xa9, 0x0d, 0x9d,
0x0e, 0x77, 0xea, 0x34, 0x6a, 0x57, 0xc6, 0x18, 0xe4, 0xe9, 0x82, 0xb1, 0xa4, 0xf7, 0x28, 0x19,
0xdc, 0xd0, 0x79, 0xde, 0x53, 0x1f, 0xfb, 0xdf, 0x12, 0x26, 0xcf, 0x7e, 0x4b, 0xa6, 0x53, 0xee,
0xf1, 0xa2, 0xbd, 0xe4, 0x47, 0x0f, 0x4e, 0x40, 0xa6, 0x4e, 0x08, 0xd5, 0x00, 0xe6, 0x9c, 0x7b,
0xed, 0x6b, 0x74, 0x55, 0x22, 0x0e, 0xa8, 0x83, 0x68, 0xe6, 0x19, 0x37, 0xec, 0x68, 0x27, 0x53,
0xd3, 0xbd, 0x4c, 0x41, 0x36, 0x42, 0xee, 0xd8, 0x34, 0x64, 0x51, 0x66, 0xf0, 0x5c, 0x42, 0x53,
0xc1, 0x40, 0xb9, 0x20, 0xee, 0xde, 0xef, 0x17, 0x84, 0xb5, 0x97, 0xe6, 0xe9, 0x32, 0xf6, 0x8f,
0x6c, 0xcb, 0xb5, 0x97, 0xae, 0x15, 0x33, 0xf2, 0x84, 0xb9, 0x0e, 0x1e, 0xc8, 0x84, 0x2a, 0xc6,
0x25, 0xd3, 0xd0, 0x5f, 0x60, 0x54, 0xee, 0x88, 0x15, 0xcb, 0x07, 0x89, 0xd3, 0x8f, 0x65, 0x41,
0x42, 0xdf, 0x17, 0x22, 0x8c, 0xfe, 0x30, 0x74, 0x66, 0xf3, 0x98, 0x85, 0x3b, 0x00, 0x1a, 0xfd,
0x53, 0xdb, 0xc6, 0xa3, 0x69, 0xbb, 0x30, 0x34, 0xfb, 0xe7, 0x4b, 0xcb, 0xdd, 0x8e, 0x10, 0xc2,
0xad, 0xa6, 0x02, 0xe0, 0x7f, 0xbf, 0x74, 0x2d, 0xa8, 0xc5, 0x22, 0x16, 0xc6, 0xa7, 0x93, 0xaf,
0x96, 0x0d, 0xd5, 0x03, 0x16, 0x65, 0x0a, 0x1d, 0x33, 0xa8, 0x03, 0x19, 0xf3, 0x26, 0x54, 0xf3,
0xd5, 0xb5, 0x2c, 0x0f, 0x94, 0xf8, 0xd3, 0xd1, 0x91, 0xf3, 0xb9, 0x16, 0x42, 0x3d, 0xfe, 0xc8,
0x14, 0x55, 0x83, 0x6f, 0xb2, 0x01, 0x54, 0xdd, 0x2a, 0xdb, 0x9c, 0x1e, 0x96, 0x16, 0x47, 0x46,
0x79, 0x3b, 0xe1, 0x68, 0x1b, 0xbe, 0xbf, 0xdd, 0x79, 0xf0, 0x5e, 0x5e, 0xf8, 0xee, 0x70, 0xa1,
0xfa, 0x39, 0xbb, 0xb9, 0x56, 0x40, 0x86, 0x50, 0xfe, 0xf0, 0xcd, 0x50, 0x51, 0x94, 0x38, 0x7b,
0x2a, 0x20, 0xdb, 0x5f, 0xfc, 0x01, 0x0f, 0xc3, 0x15, 0xd0, 0xcc, 0xd7, 0x40, 0x50, 0xfd, 0x60,
0xb3, 0x4d, 0x96, 0x3b, 0x85, 0xa2, 0x26, 0x1b, 0xf2, 0x96, 0xd2, 0x86, 0x88, 0xc8, 0xba, 0xcf,
0x3a, 0xfe, 0x9e, 0x0b, 0xa9, 0xdf, 0xde, 0x14, 0x52, 0x8f, 0xdb, 0xed, 0x66, 0x3b, 0x17, 0x53,
0xd9, 0x7a, 0xc3, 0x7e, 0x72, 0x31, 0xd3, 0xa4, 0x34, 0x0d, 0x9a, 0x6f, 0x08, 0x85, 0x7f, 0x3f,
0xcb, 0x31, 0x63, 0xef, 0x0d, 0x8b, 0x9b, 0x5c, 0x78, 0xeb, 0x02, 0xd5, 0x4d, 0x8b, 0x96, 0x76,
0xf5, 0xa7, 0xb2, 0x4c, 0xce, 0x85, 0x4c, 0x4f, 0x25, 0x7f, 0xff, 0xff, 0x32, 0xce, 0xc4, 0xde,
0xb8, 0x8b, 0x90, 0x96, 0x27, 0xf7, 0x1b, 0x85, 0xa6, 0x39, 0x2c, 0xe2, 0x6d, 0x91, 0xbd, 0xa6,
0x68, 0x49, 0x6b, 0xfb, 0xe6, 0xd3, 0xaa, 0x93, 0xf4, 0x60, 0x63, 0x6d, 0x1c, 0x7b, 0x68, 0x14,
0xa0, 0x8b, 0xf2, 0x34, 0x45, 0x66, 0x2f, 0x60, 0xaa, 0xf8, 0x6a, 0xc7, 0xb1, 0xcb, 0x72, 0x23,
0x01, 0xcb, 0x4a, 0x4f, 0xb3, 0xe9, 0x07, 0x26, 0x6e, 0x9e, 0x29, 0xec, 0x93, 0x77, 0x64, 0xe4,
0x2c, 0x5f, 0x92, 0x84, 0x87, 0x82, 0xa4, 0x9a, 0x27, 0x19, 0xb1, 0x98, 0x1b, 0xa9, 0xfa, 0x8c,
0x4e, 0x63, 0xe3, 0xec, 0x35, 0x13, 0x5b, 0x09, 0x78, 0xb6, 0x83, 0x61, 0x97, 0xef, 0x4d, 0x2c,
0xa9, 0x2c, 0x25, 0xdd, 0x95, 0xa4, 0x0b, 0x67, 0x52, 0xc5, 0x23, 0x20, 0x98, 0xca, 0x14, 0x1c,
0xc5, 0xf6, 0xe1, 0xa4, 0x5e, 0x91, 0x97, 0x72, 0xd7, 0x84, 0xa3, 0x81, 0xd8, 0xf6, 0xe8, 0x6d,
0x07, 0x55, 0xf0, 0x4b, 0xc3, 0xd8, 0x13, 0x87, 0x62, 0x13, 0x8f, 0xc4, 0xb1, 0x01, 0x6b, 0x51,
0xbe, 0xdf, 0xa5, 0x59, 0x26, 0xee, 0x68, 0x54, 0x47, 0x7c, 0x5b, 0xa2, 0x86, 0xb1, 0xe3, 0x6c,
0x6e, 0x85, 0x67, 0xfe, 0x84, 0x29, 0xd8, 0xb8, 0xd2, 0x07, 0xad, 0x93, 0x4e, 0xbb, 0xad, 0x56,
0x41, 0x4e, 0x4e, 0xd5, 0xfc, 0x32, 0x5c, 0xc6, 0xb1, 0xcf, 0xcf, 0xc7, 0xad, 0xc5, 0xb1, 0x82,
0x72, 0xc3, 0xe6, 0x46, 0x7b, 0x94, 0x58, 0x2d, 0xd4, 0xed, 0xd2, 0x94, 0xbe, 0x7f, 0xb6, 0xd6,
0x5b, 0x79, 0x48, 0x62, 0xec, 0xdf, 0xa2, 0xa2, 0x65, 0xf7, 0xbf, 0x68, 0x48, 0x52, 0xc6, 0x89,
0x42, 0x20, 0xfb, 0xfe, 0x99, 0x0e, 0x2f, 0xde, 0xc4, 0x75, 0x8a, 0x66, 0xcb, 0x76, 0x61, 0x12,
0xba, 0x69, 0xc6, 0x03, 0x9a, 0x74, 0x72, 0xf0, 0x84, 0xc4, 0xba, 0x7f, 0x2e, 0x37, 0x0d, 0x52,
0xb3, 0x29, 0x1d, 0xde, 0xc0, 0xe1, 0x8d, 0x92, 0xe1, 0xb7, 0xcb, 0x68, 0x3e, 0xe6, 0x42, 0xda,
0x8f, 0xa0, 0x89, 0x08, 0x9a, 0x3b, 0x10, 0x10, 0x47, 0xee, 0xf1, 0xee, 0xc7, 0xd1, 0x42, 0x1c,
0xad, 0x12, 0x1c, 0x23, 0x7e, 0x96, 0x6c, 0xff, 0xe0, 0x36, 0x0e, 0x6e, 0x97, 0x31, 0x70, 0x79,
0x47, 0x22, 0xe6, 0x45, 0x7e, 0xb8, 0x1f, 0xc1, 0x31, 0x22, 0x38, 0x2e, 0x41, 0x70, 0xef, 0x2f,
0x5f, 0x23, 0xfe, 0x13, 0x8e, 0xfd, 0xa9, 0x64, 0xec, 0xa9, 0x67, 0xb9, 0xfe, 0x6c, 0xff, 0xe0,
0x13, 0x1c, 0x7c, 0xb2, 0x73, 0xf0, 0x0e, 0xe1, 0xd1, 0xd4, 0xf9, 0x51, 0x81, 0x94, 0xe7, 0xb2,
0x32, 0x34, 0x40, 0x02, 0x03, 0xf3, 0xed, 0x90, 0xc0, 0x77, 0x3c, 0x48, 0x75, 0xba, 0x5c, 0x47,
0xf9, 0xe1, 0x0d, 0x8a, 0x37, 0x1c, 0x7e, 0x44, 0xbd, 0xfd, 0x51, 0x4d, 0xa2, 0xda, 0xe1, 0x77,
0xdf, 0x1a, 0x3f, 0x19, 0xed, 0x6e, 0x92, 0x94, 0x83, 0x13, 0x95, 0xdb, 0x1c, 0x9b, 0xe6, 0x95,
0x3f, 0x72, 0x1e, 0xcf, 0xdc, 0x91, 0x83, 0x4e, 0x41, 0x29, 0xdc, 0x0e, 0x61, 0xea, 0xcb, 0x8b,
0x52, 0xbc, 0x1f, 0xb2, 0x79, 0x08, 0x2d, 0xbd, 0x6b, 0xf0, 0x8c, 0xae, 0x4a, 0xb8, 0xce, 0x03,
0x03, 0x33, 0x8e, 0x2e, 0x04, 0xb8, 0xfd, 0xad, 0xd6, 0xc4, 0x73, 0x7a, 0xb8, 0x5f, 0xbe, 0xbd,
0xe5, 0xc5, 0x5d, 0xa6, 0xfa, 0x27, 0xfa, 0xcc, 0x5e, 0xb1, 0x5d, 0x7c, 0x50, 0xb2, 0x8d, 0xe6,
0x25, 0xf8, 0xd0, 0x51, 0xe3, 0xe1, 0xc5, 0x7c, 0xa5, 0xed, 0x7d, 0xc6, 0x36, 0xb1, 0xdc, 0x07,
0x8b, 0x74, 0x0a, 0x40, 0xfa, 0x36, 0x12, 0xdc, 0xd7, 0xda, 0x8d, 0x43, 0xe7, 0x38, 0x84, 0xc4,
0x23, 0x27, 0x77, 0xba, 0x91, 0x69, 0x89, 0x90, 0x33, 0xe1, 0x2d, 0x03, 0xbc, 0x60, 0xf1, 0xde,
0x71, 0xf1, 0x46, 0x8a, 0x3c, 0xb7, 0xe6, 0xb1, 0x27, 0xf2, 0xf7, 0xeb, 0xab, 0x9f, 0xe3, 0x38,
0xb8, 0x83, 0xec, 0x81, 0x45, 0x71, 0xd7, 0xdb, 0x7d, 0xeb, 0x23, 0x77, 0x53, 0x21, 0xbb, 0x47,
0x11, 0xcf, 0x1d, 0x3c, 0x6f, 0x14, 0x05, 0x3e, 0xc4, 0xc8, 0x7b, 0xf6, 0x2d, 0xd6, 0xf8, 0x13,
0x60, 0x33, 0x5e, 0x46, 0x78, 0xbc, 0x02, 0x26, 0xa9, 0x42, 0xec, 0xda, 0x7d, 0x23, 0x24, 0xc3,
0xcb, 0xf2, 0x88, 0xf1, 0x8c, 0xaf, 0x65, 0x3f, 0x68, 0x07, 0x09, 0x02, 0x71, 0x61, 0xe7, 0xf6,
0x06, 0x56, 0x53, 0xa3, 0x75, 0x31, 0x1d, 0xb9, 0x87, 0x12, 0xf3, 0x99, 0xbc, 0xf7, 0xc3, 0x05,
0x9e, 0x15, 0x4b, 0xcf, 0x1a, 0xca, 0x1b, 0x2d, 0x0a, 0xc5, 0x13, 0xc6, 0xf2, 0xc8, 0x2b, 0x3f,
0x6c, 0x8c, 0x57, 0x4c, 0x22, 0x10, 0x1f, 0xde, 0x32, 0xf1, 0x6a, 0x11, 0xc2, 0xc4, 0xaa, 0x56,
0x72, 0x18, 0xf9, 0x60, 0xe3, 0xbe, 0xce, 0xd9, 0x74, 0x96, 0x4a, 0x4f, 0x8b, 0xbb, 0x34, 0x79,
0x49, 0xc1, 0x0a, 0xc1, 0xf1, 0x43, 0xdc, 0x94, 0xb7, 0x8b, 0x50, 0xce, 0x77, 0xcc, 0x82, 0x94,
0x6a, 0x00, 0x33, 0xe1, 0xf4, 0x06, 0x2c, 0xa5, 0x3b, 0x50, 0x30, 0x96, 0xa7, 0x5c, 0x28, 0x92,
0xff, 0x74, 0x0c, 0x9e, 0x99, 0x42, 0x72, 0x66, 0x5e, 0x34, 0x18, 0x9a, 0x71, 0x18, 0x28, 0x00,
0x28, 0x25, 0xca, 0x7c, 0xe9, 0xc6, 0x72, 0xfa, 0xfc, 0x66, 0x00, 0x57, 0x1e, 0xc5, 0xe3, 0xfb,
0x02, 0x71, 0x6d, 0xfe, 0xc4, 0x37, 0x5d, 0xf0, 0x03, 0xe8, 0xfe, 0x24, 0xb3, 0x19, 0x71, 0x80,
0xc4, 0xd0, 0xf9, 0xd1, 0x91, 0x64, 0xdb, 0x02, 0xb4, 0xb9, 0x9b, 0x80, 0x62, 0xba, 0x53, 0x03,
0xe8, 0x0b, 0xcb, 0x9e, 0x2b, 0x32, 0x76, 0x9a, 0xfd, 0xe7, 0x04, 0xd4, 0x10, 0x99, 0x42, 0x86,
0x8a, 0xd5, 0x02, 0xc7, 0xcb, 0x9f, 0x47, 0x29, 0xb3, 0x9a, 0x2f, 0xbc, 0x0e, 0xc5, 0x78, 0xf6,
0x25, 0x77, 0x50, 0x8a, 0x0f, 0xfd, 0xe4, 0x7c, 0xee, 0xee, 0xdc, 0x97, 0xf1, 0x0a, 0xd0, 0x28,
0x64, 0x6d, 0xe7, 0x7e, 0x51, 0x11, 0x96, 0x5b, 0x8a, 0xf6, 0x96, 0xd3, 0xa9, 0x22, 0xaf, 0x2a,
0x07, 0x3d, 0xbb, 0xd9, 0x04, 0xf5, 0x31, 0x51, 0xd6, 0xde, 0x72, 0x78, 0x15, 0x99, 0x80, 0x52,
0xbd, 0x1c, 0xf6, 0xee, 0x7d, 0x02, 0x9b, 0x5a, 0x2d, 0xac, 0xe9, 0x74, 0x07, 0x17, 0xbf, 0x95,
0x01, 0x3f, 0xae, 0xd5, 0x75, 0xb2, 0xc4, 0x90, 0x1e, 0x81, 0x8b, 0x48, 0x93, 0x3c, 0xbc, 0x84,
0x24, 0x9e, 0xa6, 0x2b, 0xc9, 0xc4, 0x1a, 0xf2, 0x8c, 0x4c, 0x0a, 0x47, 0xcc, 0x5b, 0x4e, 0x89,
0x9b, 0x19, 0x1f, 0x05, 0xde, 0x3b, 0x29, 0xbf, 0x92, 0xef, 0xdd, 0xe2, 0x59, 0x15, 0x5e, 0x9d,
0xaa, 0xc9, 0x61, 0xc2, 0x2d, 0x6f, 0x4f, 0xf1, 0xa0, 0xfc, 0x6e, 0x35, 0xc2, 0x94, 0x0c, 0xc9,
0xe2, 0xda, 0xa3, 0x11, 0xf2, 0x65, 0xc5, 0x3b, 0x4d, 0xa5, 0x73, 0xbf, 0xbf, 0xa7, 0x39, 0x91,
0x5a, 0xb5, 0x38, 0x5e, 0x73, 0xae, 0x9c, 0x70, 0xd7, 0x71, 0xbc, 0xcb, 0xbb, 0xfc, 0x08, 0x09,
0x8c, 0xd4, 0xca, 0x09, 0x5c, 0xde, 0x97, 0x81, 0x73, 0x9e, 0x84, 0x3c, 0x42, 0x06, 0x89, 0xe6,
0x2e, 0x62, 0x77, 0x57, 0x5b, 0xa3, 0x39, 0xfc, 0x6e, 0x7a, 0x77, 0xd7, 0xb4, 0xb0, 0x94, 0xb9,
0x31, 0x10, 0xb2, 0x93, 0x5a, 0x41, 0x43, 0x13, 0xb7, 0x26, 0xa7, 0x11, 0x3a, 0x55, 0xb0, 0x6a,
0xb5, 0x23, 0xaf, 0xc7, 0xdc, 0xba, 0x0c, 0x4f, 0x91, 0xcb, 0x3c, 0xd0, 0x22, 0x68, 0xfb, 0xfc,
0xd2, 0x9c, 0x68, 0x09, 0x1d, 0xd0, 0x14, 0xf2, 0x1e, 0x3c, 0x31, 0x19, 0x87, 0xfe, 0x13, 0x54,
0x2f, 0x64, 0xe2, 0xb3, 0x08, 0xaf, 0x09, 0xe1, 0x76, 0xb4, 0x1f, 0x42, 0xa2, 0x3a, 0x67, 0xe4,
0x0b, 0x77, 0x41, 0x5f, 0x48, 0x10, 0x82, 0x73, 0x85, 0x88, 0x82, 0x89, 0x3f, 0xc7, 0xc4, 0x73,
0xd9, 0x88, 0x5f, 0xb5, 0xc9, 0x8e, 0x8f, 0x66, 0x68, 0x99, 0x80, 0x3a, 0xbd, 0xbd, 0x24, 0x4e,
0x1e, 0x29, 0xef, 0xc9, 0x92, 0x38, 0x4f, 0x76, 0x05, 0xae, 0x2a, 0x7f, 0xa7, 0x72, 0x04, 0xd1,
0x83, 0xe2, 0xe8, 0x0e, 0xf8, 0x4c, 0xe9, 0x2c, 0x5d, 0xdf, 0xe6, 0xb7, 0x38, 0x6a, 0xc0, 0x47,
0xec, 0xdb, 0x3e, 0x9e, 0xb3, 0xe4, 0x37, 0x41, 0x75, 0x4d, 0xe1, 0xb7, 0x52, 0x4d, 0x84, 0x70,
0x47, 0xb1, 0x1f, 0x5a, 0x33, 0x86, 0x22, 0xbd, 0x8c, 0xd9, 0x02, 0xe3, 0x92, 0x7d, 0x19, 0x40,
0x15, 0x02, 0x89, 0x83, 0x00, 0x83, 0xf1, 0x8b, 0x00, 0x38, 0x44, 0x4f, 0x4a, 0xae, 0x21, 0x0b,
0xae, 0x11, 0x29, 0x2d, 0x86, 0xe9, 0x0c, 0xf9, 0x88, 0xc7, 0x16, 0x2e, 0x6f, 0x41, 0x44, 0x5a,
0x01, 0x63, 0x54, 0xc4, 0xa8, 0x71, 0x6c, 0xaa, 0x8a, 0x50, 0xfc, 0x8e, 0x26, 0xa2, 0x1f, 0xf0,
0xbb, 0xa7, 0x9d, 0x7a, 0x9d, 0x56, 0xf9, 0x6b, 0x3c, 0xc3, 0x50, 0xcd, 0xee, 0x8f, 0xd6, 0xa3,
0xda, 0xd7, 0x68, 0x10, 0x98, 0x0d, 0x0c, 0x1a, 0xea, 0xba, 0x02, 0x39, 0x91, 0xb8, 0x5b, 0xdb,
0xe3, 0xa9, 0x55, 0xff, 0xdf, 0x9c, 0x05, 0x17, 0xfb, 0x32, 0x74, 0x21, 0x58, 0x8b, 0x83, 0x1a,
0x11, 0x9e, 0x01, 0x00, 0x40, 0x0e, 0xd0, 0xab, 0x8b, 0x4b, 0xc5, 0x78, 0x15, 0x93, 0x48, 0xf7,
0x4f, 0x47, 0xbc, 0x1f, 0x07, 0x46, 0xb4, 0xa8, 0xf0, 0x82, 0x1c, 0x3f, 0xfd, 0x11, 0xa5, 0xbd,
0xbd, 0x29, 0x14, 0x16, 0x2c, 0x9e, 0xfb, 0xd8, 0x21, 0xf5, 0x23, 0xbc, 0xeb, 0x9b, 0x6b, 0x96,
0xc4, 0x3e, 0x88, 0xe3, 0xa9, 0xf8, 0x6c, 0xce, 0xdc, 0x60, 0x48, 0xfb, 0x95, 0x9e, 0x48, 0xcd,
0x65, 0xb5, 0x22, 0xbe, 0xe4, 0x72, 0xbd, 0x9f, 0x91, 0xec, 0xa0, 0x57, 0x17, 0x2f, 0xd2, 0xb6,
0x7a, 0xd9, 0x98, 0x4a, 0x3a, 0x68, 0x88, 0x83, 0x86, 0x10, 0xb2, 0xb3, 0x71, 0x85, 0x11, 0xf2,
0x8e, 0x41, 0x7f, 0x64, 0x3d, 0xb2, 0x0c, 0x64, 0x9e, 0x14, 0xde, 0xbd, 0x79, 0xa3, 0x5f, 0xc1,
0xf5, 0x39, 0xb4, 0x16, 0x41, 0x97, 0xfc, 0x6c, 0x85, 0x78, 0xb2, 0x05, 0xf5, 0x3c, 0x5e, 0x06,
0x20, 0x9c, 0x06, 0xe4, 0xd3, 0xb1, 0xe5, 0x26, 0x1d, 0xcf, 0xb4, 0x03, 0xeb, 0xda, 0x9c, 0x55,
0xd9, 0xcc, 0xcf, 0x3a, 0xc6, 0x36, 0x4e, 0x33, 0x4b, 0x4c, 0x7b, 0x4e, 0xff, 0x8e, 0x81, 0x3b,
0x04, 0x4b, 0x9c, 0x80, 0x9a, 0x06, 0xfe, 0x13, 0xe8, 0x83, 0x3c, 0x9a, 0x81, 0x67, 0x2b, 0xc6,
0xa2, 0xbb, 0x17, 0xc5, 0xa2, 0x8b, 0xd8, 0xe9, 0xd5, 0x1d, 0x31, 0x6e, 0x2c, 0xbb, 0xbd, 0x15,
0xb1, 0x69, 0xb3, 0xcc, 0xa8, 0xe1, 0x59, 0x96, 0x62, 0x37, 0x98, 0x9f, 0xa2, 0x90, 0xcd, 0x84,
0x94, 0x72, 0xe5, 0xc2, 0xc3, 0x42, 0x8a, 0x58, 0x4b, 0x48, 0x76, 0x41, 0xcf, 0x6d, 0x49, 0xcb,
0x63, 0x51, 0x44, 0x5c, 0xbc, 0xb5, 0xc9, 0xc2, 0x57, 0xda, 0xc5, 0xa7, 0x43, 0x26, 0x45, 0x2d,
0xeb, 0x45, 0x79, 0x77, 0x45, 0xf4, 0x8a, 0xf8, 0xd5, 0x16, 0x41, 0x35, 0xe9, 0x9e, 0xe2, 0x7d,
0xa1, 0xfe, 0xb5, 0xb8, 0x2b, 0x4e, 0xce, 0x96, 0x61, 0x08, 0xfa, 0x9f, 0xd2, 0x90, 0x37, 0xc4,
0xaf, 0x4f, 0xe9, 0x46, 0xb5, 0xba, 0xd1, 0x6c, 0x6a, 0xb4, 0xb3, 0xa6, 0x97, 0xae, 0x6f, 0xf5,
0x89, 0xd3, 0x86, 0x53, 0xbf, 0x42, 0x16, 0xa7, 0x45, 0xf2, 0xd9, 0x1d, 0x88, 0xb4, 0xb2, 0xc0,
0x26, 0x53, 0x47, 0x9c, 0x36, 0xea, 0x16, 0xb7, 0xf1, 0x2a, 0x87, 0xdf, 0xbd, 0x3b, 0x39, 0x39,
0xe9, 0x92, 0x7f, 0xf7, 0x97, 0x61, 0x71, 0x65, 0x40, 0x83, 0x1f, 0xb1, 0x25, 0x40, 0xe6, 0x20,
0x31, 0x62, 0x8b, 0x89, 0xd4, 0xb8, 0x54, 0xef, 0x7d, 0x02, 0x26, 0x05, 0xef, 0x19, 0x77, 0x65,
0x91, 0x35, 0x65, 0xc2, 0x81, 0xad, 0x10, 0x0b, 0xd7, 0x1a, 0x0d, 0x01, 0x03, 0xe1, 0x00, 0x96,
0x11, 0xc2, 0x81, 0xa2, 0x12, 0x1b, 0xe5, 0x15, 0xf1, 0x77, 0x95, 0x05, 0xa4, 0x50, 0x0e, 0x40,
0x48, 0xaa, 0x8e, 0xf7, 0x95, 0xc9, 0x7b, 0xb1, 0x58, 0x00, 0x45, 0xc4, 0xf2, 0x26, 0xe0, 0x61,
0xa7, 0x30, 0xf8, 0x20, 0x6b, 0x11, 0x81, 0x2a, 0x55, 0x4e, 0x93, 0xc5, 0xb4, 0x5c, 0x60, 0x93,
0xaf, 0x62, 0x94, 0x5f, 0xd7, 0xd8, 0xc7, 0xf6, 0xe1, 0x0a, 0x44, 0xea, 0x47, 0xfc, 0xba, 0x19,
0xf2, 0xc8, 0xc1, 0x04, 0xf7, 0x7f, 0x63, 0x2c, 0x20, 0x56, 0x4c, 0x0e, 0x21, 0x85, 0x33, 0x4e,
0x89, 0x33, 0x15, 0x1c, 0xe0, 0x81, 0x29, 0x7e, 0x24, 0x6a, 0x02, 0x82, 0xb5, 0x63, 0xd4, 0x4d,
0xec, 0x62, 0xe3, 0xe0, 0xec, 0x4c, 0x12, 0x67, 0xa5, 0x72, 0xc9, 0x67, 0xca, 0x2f, 0x47, 0xa6,
0xb7, 0xd4, 0x20, 0x52, 0xb0, 0x10, 0x8a, 0xbf, 0x82, 0x10, 0x35, 0xe9, 0xfc, 0x90, 0x43, 0xbc,
0x39, 0xed, 0xcd, 0x04, 0x0b, 0x8a, 0xd4, 0x0b, 0x02, 0x4a, 0x8f, 0xf7, 0x94, 0xc1, 0x2a, 0x96,
0x11, 0x78, 0xc3, 0xc4, 0xb8, 0xa4, 0x36, 0x04, 0xe8, 0x43, 0x96, 0xde, 0x83, 0xe7, 0x3f, 0x79,
0x52, 0xab, 0xd5, 0xcc, 0x38, 0x42, 0x61, 0xb3, 0x8f, 0xbe, 0x1b, 0xe3, 0x95, 0x6b, 0xe5, 0x1a,
0x0f, 0x87, 0xc9, 0x75, 0xe2, 0x76, 0x65, 0x11, 0x64, 0x0e, 0x24, 0x0c, 0x60, 0x6a, 0x49, 0x2b,
0x9e, 0x1f, 0xc4, 0xda, 0xd0, 0x6d, 0xbc, 0x76, 0xb6, 0xb5, 0x83, 0x8b, 0x5b, 0x16, 0x49, 0x99,
0x6b, 0x66, 0x05, 0x6f, 0x1f, 0x64, 0x22, 0x6f, 0x4c, 0x11, 0xa5, 0xdd, 0x5e, 0x9c, 0xaa, 0x95,
0x9d, 0x9b, 0xb4, 0x6d, 0x0e, 0xcd, 0xa6, 0x53, 0xc7, 0xc6, 0x63, 0x7e, 0x44, 0x69, 0x22, 0xfc,
0x4e, 0x70, 0x1d, 0x54, 0x13, 0xcf, 0x74, 0x29, 0x4d, 0x7d, 0x0f, 0x18, 0xee, 0xa5, 0xf4, 0xe5,
0x09, 0x30, 0xc5, 0x68, 0xec, 0x81, 0xc4, 0xb3, 0x26, 0x95, 0x33, 0x5e, 0xf3, 0x96, 0xec, 0x13,
0x17, 0x1c, 0x89, 0xb8, 0xf6, 0x55, 0xbe, 0xeb, 0x2d, 0x51, 0x88, 0x73, 0x78, 0x89, 0xa8, 0xf1,
0x08, 0x1d, 0x48, 0x38, 0xb5, 0xf1, 0x44, 0xb8, 0xb4, 0xac, 0x21, 0x55, 0xd8, 0x06, 0xe2, 0x7e,
0xcd, 0xb5, 0x76, 0x5b, 0x77, 0x62, 0xdc, 0xc9, 0xce, 0x5b, 0xa6, 0xbc, 0x89, 0xdc, 0x9d, 0x9c,
0x2a, 0x7a, 0xd1, 0x12, 0xfe, 0x58, 0x63, 0x1f, 0x98, 0xe0, 0x96, 0x88, 0xf4, 0xd1, 0x2c, 0x51,
0xad, 0x6b, 0xa9, 0xe2, 0x48, 0x97, 0xdf, 0xec, 0x57, 0xb6, 0x1c, 0x7d, 0x33, 0xf3, 0x23, 0x78,
0xcc, 0x89, 0xff, 0x70, 0x85, 0x38, 0x1d, 0x18, 0x75, 0x92, 0x71, 0xe5, 0x9d, 0xff, 0x1d, 0x61,
0x0d, 0x31, 0x55, 0x73, 0xd1, 0x2d, 0x2d, 0x64, 0x30, 0x52, 0xd3, 0x7e, 0x35, 0x0d, 0x46, 0x24,
0x19, 0x5f, 0xd9, 0x46, 0x70, 0x54, 0x82, 0xe0, 0x48, 0x62, 0x38, 0xca, 0x45, 0xbc, 0x90, 0xf3,
0x7b, 0xcd, 0x8f, 0x46, 0x92, 0x5f, 0x85, 0x3d, 0x55, 0xb2, 0x85, 0x5d, 0x80, 0x0e, 0xe8, 0x49,
0xb4, 0xaa, 0xe7, 0xe2, 0xd5, 0xc2, 0xc8, 0x85, 0xb1, 0x61, 0xc1, 0x9b, 0xf2, 0x63, 0xab, 0xa4,
0x52, 0xda, 0xbd, 0x3f, 0x1a, 0x43, 0x32, 0xf2, 0xd0, 0x15, 0x62, 0x30, 0x74, 0x10, 0x43, 0x77,
0xce, 0xd0, 0x0b, 0xc1, 0x17, 0xf8, 0x3c, 0xe6, 0x99, 0xfd, 0x11, 0x9e, 0x6b, 0x5d, 0x46, 0x9d,
0x06, 0x97, 0x92, 0x90, 0x61, 0xa5, 0x40, 0x22, 0x77, 0x8c, 0xf4, 0x4f, 0x3a, 0x6c, 0xd0, 0x28,
0xa0, 0x46, 0xc2, 0x25, 0x4c, 0xc3, 0x13, 0x5e, 0x6f, 0xec, 0xb8, 0x0e, 0xba, 0xe2, 0x90, 0xb8,
0xd6, 0x0c, 0x12, 0xc4, 0x68, 0xc9, 0x22, 0xee, 0x72, 0x7e, 0x05, 0x57, 0xe8, 0x72, 0xef, 0x08,
0xa6, 0x4e, 0x72, 0x61, 0x35, 0x39, 0x77, 0xda, 0x2f, 0x39, 0x12, 0x9a, 0xc8, 0x04, 0x9d, 0x09,
0xfa, 0xc1, 0x31, 0xc6, 0x68, 0xf6, 0x0d, 0x00, 0xc0, 0x86, 0xed, 0x82, 0x5f, 0x06, 0xb5, 0xa8,
0x94, 0xe9, 0xc5, 0xb5, 0xf5, 0xc0, 0xd0, 0x11, 0xb1, 0xd9, 0x22, 0x71, 0x4b, 0x0c, 0x8a, 0x12,
0x49, 0x60, 0x67, 0xec, 0x4d, 0xe2, 0xe4, 0x48, 0x04, 0x57, 0x69, 0x76, 0xe3, 0x65, 0x24, 0x76,
0x86, 0x60, 0xbe, 0x13, 0xc7, 0x66, 0xd1, 0xee, 0xf1, 0x99, 0x4f, 0x13, 0xed, 0x18, 0xde, 0x19,
0x91, 0x59, 0xbf, 0x8c, 0xdd, 0x91, 0x23, 0x90, 0xa3, 0x68, 0x66, 0xae, 0x3f, 0x16, 0x09, 0x0e,
0x10, 0x99, 0x4e, 0x73, 0x59, 0x41, 0xa5, 0x3c, 0x2d, 0xb8, 0x3a, 0x97, 0x61, 0x7f, 0x87, 0x3d,
0xf0, 0xe5, 0xad, 0x88, 0x73, 0x46, 0xb0, 0x98, 0x7f, 0x70, 0x65, 0xf8, 0x63, 0x61, 0x05, 0x01,
0x2e, 0x74, 0x7e, 0xdf, 0x87, 0x24, 0xcd, 0xf7, 0x4e, 0xee, 0x68, 0x52, 0xb6, 0x03, 0xf2, 0x9a,
0x80, 0x77, 0xdb, 0x5d, 0xd2, 0xf3, 0x2f, 0x18, 0x0f, 0x2f, 0x50, 0xc1, 0xf0, 0x2a, 0xdb, 0x96,
0x57, 0x8e, 0x01, 0xfb, 0xfe, 0x19, 0x86, 0x64, 0xf3, 0x64, 0xd3, 0xf0, 0x2a, 0xfb, 0xbd, 0x43,
0x3a, 0x33, 0x5e, 0xae, 0xca, 0x29, 0xf1, 0x1e, 0x2d, 0xe8, 0x15, 0x6e, 0x5b, 0xfb, 0xee, 0x64,
0x53, 0xe2, 0x1b, 0x99, 0xd1, 0xe6, 0x66, 0xa0, 0xa1, 0xa7, 0x1d, 0x7d, 0xa8, 0x52, 0x33, 0x97,
0x89, 0xdc, 0x5c, 0xde, 0x15, 0x36, 0x06, 0x2a, 0x6f, 0xdc, 0x19, 0x80, 0xda, 0x75, 0xcf, 0xbe,
0x40, 0x1a, 0x3c, 0xa5, 0x6e, 0x42, 0xe9, 0xba, 0x09, 0x5d, 0x72, 0xf2, 0xe9, 0x0e, 0xbc, 0x51,
0xcc, 0xc8, 0x64, 0xb3, 0xa3, 0x9f, 0x40, 0x56, 0xb2, 0x7d, 0xba, 0x46, 0xeb, 0xe8, 0x81, 0xad,
0x0a, 0x27, 0xfd, 0xb6, 0x37, 0xeb, 0x24, 0x10, 0x3f, 0x1a, 0x9d, 0x3b, 0xc3, 0xb7, 0x89, 0xae,
0x89, 0x47, 0x34, 0x39, 0xe4, 0x18, 0x7f, 0x5a, 0x62, 0x07, 0x3e, 0x3c, 0xc8, 0xb9, 0x9b, 0x68,
0x25, 0xdb, 0xc2, 0x6b, 0x18, 0xaf, 0xb1, 0x76, 0x4c, 0xfb, 0xc7, 0x92, 0x1e, 0x2f, 0x43, 0x76,
0xe0, 0xfa, 0x89, 0xf6, 0xdf, 0x71, 0xb0, 0xb0, 0x44, 0x16, 0x69, 0x6f, 0xbd, 0xcf, 0xeb, 0xea,
0x90, 0x8b, 0xae, 0x24, 0x5c, 0xa3, 0x53, 0xaa, 0x6c, 0xb4, 0xcd, 0x65, 0xd7, 0x3c, 0x53, 0xd5,
0x1f, 0xb1, 0x69, 0xce, 0xdb, 0x11, 0x3f, 0xee, 0x6e, 0x99, 0x57, 0x4e, 0x79, 0xaa, 0x0b, 0xfa,
0x22, 0xd6, 0x11, 0xb3, 0xc5, 0x85, 0xe5, 0x78, 0xa9, 0xbf, 0xc2, 0x5f, 0xbd, 0x78, 0xa5, 0x40,
0xb8, 0x1e, 0xdd, 0x64, 0x15, 0x80, 0x28, 0x15, 0xf9, 0xa1, 0xed, 0xf2, 0x0c, 0x22, 0xed, 0x18,
0x6c, 0x60, 0xe5, 0xbf, 0xbc, 0x23, 0x31, 0xf2, 0x96, 0x29, 0xa9, 0x58, 0xb6, 0xcd, 0x02, 0xc8,
0x09, 0x6a, 0x1c, 0xdd, 0x0e, 0x43, 0x4f, 0xac, 0x63, 0xe1, 0xe6, 0xea, 0xc1, 0x1f, 0x73, 0x0d,
0x67, 0x5a, 0x77, 0x42, 0x81, 0x01, 0x04, 0xf1, 0x2b, 0x7f, 0x5e, 0xb0, 0x5c, 0x69, 0xb8, 0x16,
0xa9, 0x80, 0x21, 0x4e, 0xcd, 0xd2, 0x5f, 0x79, 0xe2, 0xa2, 0x9d, 0x5a, 0xe0, 0x70, 0xe1, 0xe3,
0x34, 0x84, 0x8c, 0x61, 0x52, 0x87, 0xec, 0x86, 0x37, 0x43, 0x4d, 0xfa, 0x07, 0x2c, 0xb9, 0xf7,
0x40, 0xd1, 0xea, 0xe0, 0xad, 0xdf, 0xab, 0x5b, 0x42, 0xb6, 0x77, 0xd8, 0x56, 0x79, 0xfb, 0x0e,
0x1d, 0x9e, 0x13, 0x92, 0x07, 0x53, 0xae, 0xb6, 0xed, 0xb0, 0x92, 0x33, 0x44, 0x22, 0xae, 0x1f,
0xee, 0x5f, 0x96, 0xbb, 0x6b, 0x9a, 0x54, 0x8f, 0x6f, 0xd2, 0x14, 0xec, 0x25, 0xed, 0xd1, 0x94,
0xdd, 0xfe, 0x17, 0x92, 0x26, 0xf9, 0x73, 0x19, 0x11, 0xcf, 0xa0, 0xee, 0xb1, 0xff, 0xcd, 0x03,
0x29, 0x6e, 0x82, 0x4e, 0x31, 0xfd, 0x17, 0x25, 0xc1, 0x32, 0xa8, 0xf3, 0x1e, 0xe1, 0x6b, 0xa1,
0x65, 0x28, 0xf5, 0x49, 0x62, 0xcd, 0x95, 0x36, 0x1b, 0x29, 0xe6, 0x19, 0xa4, 0x98, 0xe5, 0xce,
0x72, 0x51, 0x96, 0x6d, 0x66, 0x59, 0xa5, 0xa2, 0x1f, 0xc1, 0x13, 0x35, 0x29, 0x23, 0x4e, 0x65,
0xbd, 0x87, 0xcc, 0x41, 0xc2, 0x94, 0x27, 0x31, 0xbc, 0xdd, 0x51, 0xa8, 0x6e, 0x53, 0xd0, 0x0b,
0x55, 0x29, 0xa4, 0xa8, 0x63, 0xdf, 0x87, 0x3c, 0x5f, 0xc7, 0xf2, 0x2f, 0x4a, 0xf2, 0xd5, 0x28,
0x25, 0x8a, 0x51, 0xf7, 0x83, 0xb5, 0x58, 0x58, 0xc4, 0xf6, 0xc3, 0x50, 0x96, 0x7e, 0x98, 0x1e,
0x88, 0xe4, 0xe7, 0x15, 0x19, 0x7d, 0x80, 0xe4, 0x94, 0x28, 0x51, 0x1c, 0xfa, 0x50, 0xe0, 0xa0,
0x37, 0x49, 0xdb, 0x0b, 0x9c, 0x40, 0x65, 0x27, 0xf6, 0x12, 0x61, 0xee, 0xa0, 0x80, 0xbd, 0x1a,
0xa2, 0xe0, 0xcf, 0xed, 0x6c, 0x62, 0xc7, 0x7f, 0xc3, 0xac, 0xde, 0x04, 0xc3, 0x88, 0x73, 0x1c,
0x4b, 0xc1, 0xbd, 0xdf, 0x14, 0x5c, 0x65, 0x43, 0x72, 0x46, 0xf9, 0xda, 0xfc, 0x80, 0x0a, 0x75,
0x0f, 0xa9, 0x5f, 0xe4, 0x20, 0xd3, 0x42, 0xa7, 0xce, 0x42, 0x3f, 0x8a, 0xa6, 0xd6, 0x84, 0xbd,
0x26, 0x97, 0xfb, 0xf7, 0x42, 0x77, 0x32, 0x04, 0x04, 0x7f, 0xed, 0x6a, 0x83, 0xb9, 0xfb, 0xf3,
0x5d, 0xcc, 0x7d, 0x73, 0xb7, 0xcf, 0xdc, 0xe0, 0xcf, 0xe5, 0x91, 0x45, 0x84, 0x68, 0x65, 0x3b,
0xe5, 0xd6, 0x72, 0x59, 0x0c, 0x51, 0x2d, 0xce, 0xd8, 0x7c, 0x8d, 0xb1, 0xdb, 0xf7, 0xc2, 0x54,
0x90, 0x9b, 0x09, 0x54, 0xe3, 0x20, 0x3c, 0x3e, 0xb3, 0x44, 0xc9, 0xcf, 0xe5, 0x2f, 0x8b, 0x6d,
0x76, 0x4a, 0xee, 0xaf, 0x5e, 0x51, 0xc0, 0x1d, 0x62, 0x84, 0x77, 0x5c, 0x11, 0x12, 0xfc, 0xf7,
0xdc, 0x59, 0xed, 0xb6, 0xa5, 0xfb, 0xe1, 0xeb, 0x8a, 0x5e, 0x29, 0x21, 0x84, 0x44, 0xb0, 0xdb,
0xb9, 0x79, 0x16, 0xfa, 0xfe, 0x63, 0x59, 0x36, 0xf0, 0xd1, 0x72, 0x62, 0xde, 0xd8, 0x00, 0x4b,
0xab, 0xec, 0x39, 0x10, 0xfd, 0x1e, 0x96, 0x7a, 0x4f, 0x12, 0x80, 0xaf, 0x09, 0x4f, 0x21, 0x53,
0xa0, 0xca, 0xf6, 0xb9, 0x9d, 0xd1, 0xd2, 0x0b, 0x9d, 0xa8, 0x2c, 0x80, 0x82, 0xdc, 0xf9, 0xdd,
0x04, 0xfc, 0x71, 0x1e, 0xa8, 0x92, 0x30, 0xd2, 0xf1, 0xc5, 0xa8, 0x88, 0xa7, 0x43, 0x0b, 0x1c,
0xba, 0xcd, 0x72, 0xa6, 0xf3, 0xda, 0x91, 0xca, 0xb3, 0xfb, 0xfc, 0xe1, 0xcc, 0x44, 0x99, 0x9e,
0x6c, 0xda, 0xff, 0x20, 0x12, 0x6b, 0x5f, 0xe6, 0xb8, 0xdc, 0x06, 0xcb, 0x8e, 0x0e, 0x96, 0x9e,
0x14, 0xa4, 0x5b, 0xd3, 0xe2, 0x15, 0xff, 0xf9, 0xae, 0x64, 0xea, 0x95, 0x03, 0xe7, 0xb9, 0x5c,
0xeb, 0x95, 0x03, 0x85, 0x28, 0xe4, 0x57, 0x8e, 0x14, 0xa2, 0x84, 0x2b, 0xe5, 0xa7, 0x0a, 0x79,
0xc5, 0x92, 0x4e, 0x0f, 0x84, 0x93, 0x9d, 0x87, 0x7c, 0xa5, 0xde, 0x39, 0xbb, 0x93, 0xf5, 0x0e,
0x8c, 0x81, 0x64, 0x1d, 0x4c, 0xeb, 0x11, 0xaa, 0x2e, 0x17, 0x5c, 0x0f, 0x54, 0x0d, 0x3b, 0xa2,
0xe8, 0x76, 0x7e, 0x5c, 0xd9, 0x4c, 0x90, 0xcf, 0x86, 0x45, 0x0f, 0x23, 0xc3, 0x1a, 0xac, 0xf8,
0xe9, 0xe4, 0x11, 0x97, 0x7a, 0xc2, 0x97, 0x3f, 0x31, 0xeb, 0x1c, 0x41, 0x31, 0xa3, 0x4a, 0x62,
0xc4, 0xc3, 0x32, 0xa5, 0xbe, 0xe2, 0x37, 0x38, 0x89, 0xf2, 0x14, 0x5a, 0x01, 0xf6, 0x23, 0x16,
0xfe, 0x23, 0x0c, 0x56, 0xf7, 0xa8, 0x77, 0x25, 0x19, 0x62, 0xb9, 0x4f, 0xd6, 0x2a, 0x22, 0x38,
0x52, 0xdd, 0xb3, 0x14, 0x09, 0xb8, 0x87, 0x07, 0x7d, 0x37, 0xa0, 0x4b, 0x14, 0x1f, 0x17, 0xbf,
0xc4, 0x73, 0x97, 0xae, 0x53, 0x45, 0x3a, 0x86, 0x50, 0x1c, 0x9f, 0xc5, 0x2e, 0x1d, 0x7b, 0x9b,
0xa0, 0x13, 0xc7, 0x63, 0x34, 0x52, 0x39, 0xbf, 0x87, 0x02, 0xa2, 0x92, 0x09, 0xfa, 0xfd, 0xed,
0xe8, 0xd5, 0x82, 0xc8, 0x9e, 0xf2, 0x6a, 0x10, 0x7f, 0x5b, 0x91, 0xc4, 0x6c, 0x11, 0xb8, 0x79,
0xfa, 0x95, 0xf2, 0xdc, 0xb0, 0x41, 0xc9, 0x3f, 0x9f, 0x1b, 0xd2, 0x64, 0x2f, 0x3d, 0xdd, 0x72,
0x6f, 0x40, 0xe1, 0xc2, 0x53, 0x80, 0xb2, 0xbc, 0x10, 0xf7, 0x08, 0xfe, 0x4f, 0x36, 0x1f, 0xea,
0xb8, 0x9f, 0x92, 0x2b, 0x93, 0xc5, 0x2f, 0x40, 0x26, 0x64, 0xeb, 0xb8, 0x15, 0x83, 0xfb, 0x32,
0xf8, 0x13, 0xb0, 0xff, 0x03, 0x4b, 0x74, 0xff, 0x24, 0x12, 0x56, 0x00, 0x00
0x3c, 0x30, 0x3a, 0xbc, 0x86, 0x5c, 0x43, 0x11, 0xd6, 0x84, 0xe0, 0xe0, 0x4a, 0x62, 0x5c, 0x1e,
0x5c, 0x58, 0x2d, 0x10, 0x56, 0xab, 0x79, 0x80, 0x8f, 0x4e, 0x4e, 0x90, 0x0d, 0x8e, 0xd0, 0xf6,
0x39, 0xc2, 0xe2, 0xac, 0x73, 0x02, 0xc6, 0xf1, 0xa6, 0x44, 0x70, 0x32, 0x10, 0xe2, 0xe8, 0xa4,
0xe2, 0xe3, 0x28, 0x26, 0xce, 0x0c, 0x70, 0x54, 0xe9, 0xd3, 0x96, 0x75, 0xe6, 0x19, 0xd9, 0xb2,
0xcb, 0xa6, 0x0e, 0xbc, 0x80, 0xf7, 0x31, 0xf8, 0x9f, 0x72, 0x39, 0x7c, 0xbc, 0x29, 0xca, 0x41,
0x57, 0x8b, 0x24, 0x6d, 0x5a, 0xc2, 0xfa, 0xdb, 0xb8, 0x0d, 0xe9, 0x9e, 0x59, 0xef, 0x1f, 0x1a,
0xd1, 0xff, 0x1d, 0x81, 0x4d, 0xcb, 0xf0, 0x18, 0xc7, 0x38, 0xb4, 0xd9, 0xe0, 0x78, 0xda, 0x7a,
0x62, 0x6c, 0x65, 0x79, 0x49, 0x82, 0xc7, 0xda, 0xc2, 0x03, 0xe5, 0x40, 0x0b, 0xc5, 0x5b, 0x3e,
0x0e, 0xfc, 0xdb, 0xb6, 0xbf, 0xc8, 0x58, 0xbe, 0xf4, 0x1e, 0x21, 0x21, 0x63, 0x13, 0x02, 0xc5,
0x34, 0xd6, 0xa8, 0x1d, 0x7a, 0x07, 0xd9, 0x23, 0xf8, 0x9f, 0x09, 0x51, 0x42, 0x3f, 0xb6, 0xf0,
0x95, 0x71, 0xa2, 0xff, 0xf7, 0x7f, 0xa9, 0x69, 0x7e, 0x34, 0xd9, 0x8f, 0x6f, 0xc2, 0xbe, 0xa1,
0x93, 0xe0, 0x4d, 0xab, 0x0e, 0x5d, 0xa3, 0xab, 0x08, 0xc1, 0xd0, 0xff, 0xb1, 0x64, 0x10, 0x1c,
0xb9, 0xef, 0xf4, 0xc3, 0x53, 0xd7, 0x55, 0x68, 0xed, 0x09, 0x56, 0x54, 0x5b, 0x9a, 0x61, 0xe2,
0x3d, 0x33, 0x87, 0xba, 0xe4, 0x9e, 0x34, 0x44, 0xf7, 0xb7, 0x31, 0xd7, 0xcd, 0x49, 0x72, 0x57,
0x14, 0xbc, 0x56, 0x78, 0x6b, 0x0b, 0x53, 0xd7, 0x1e, 0xb1, 0xa1, 0x06, 0xe8, 0x33, 0x32, 0xc1,
0x56, 0x11, 0x3e, 0x33, 0x83, 0x5d, 0x45, 0xb8, 0x5f, 0xfa, 0x2a, 0x29, 0x7b, 0xce, 0xa0, 0x66,
0x98, 0xc9, 0xba, 0x05, 0x4b, 0xa0, 0x59, 0x52, 0x02, 0xcd, 0xd4, 0x57, 0x8c, 0x1e, 0x42, 0xab,
0xc9, 0xdb, 0x0b, 0xdd, 0x92, 0xc1, 0x49, 0xfd, 0x34, 0x4b, 0xea, 0x27, 0x41, 0x43, 0x71, 0xcd,
0x3f, 0x55, 0xe6, 0xa8, 0xa2, 0xc8, 0x79, 0xe6, 0x33, 0x40, 0x82, 0x10, 0x27, 0x35, 0xf1, 0xc5,
0xf1, 0x40, 0x2c, 0x41, 0x26, 0x69, 0xdb, 0x77, 0xfd, 0xd0, 0xa4, 0xdf, 0x4d, 0xa7, 0x53, 0xda,
0x4d, 0xab, 0xa2, 0x74, 0x60, 0xb3, 0x99, 0x8d, 0x3b, 0x32, 0x72, 0x3d, 0x81, 0x7d, 0x3c, 0x27,
0x35, 0xdf, 0x2c, 0xa9, 0xf9, 0x66, 0x49, 0xcd, 0x37, 0x4b, 0x6a, 0xbe, 0x99, 0xec, 0x09, 0x04,
0x5b, 0x3d, 0x81, 0x20, 0xd7, 0x13, 0xc0, 0x25, 0xc2, 0xce, 0x67, 0x37, 0xd7, 0x1c, 0x38, 0x0d,
0x43, 0x6b, 0x55, 0x73, 0x22, 0xfe, 0x37, 0x29, 0xea, 0x55, 0x5c, 0xe4, 0x07, 0x58, 0xe4, 0x87,
0x9e, 0x6c, 0x1e, 0xc8, 0x95, 0x7e, 0x80, 0x95, 0x5e, 0xd5, 0x82, 0x65, 0x34, 0x97, 0xa0, 0x9f,
0x1e, 0x3e, 0xab, 0xb2, 0xe4, 0xd5, 0xa1, 0xe0, 0x0d, 0xf2, 0x05, 0x2f, 0x50, 0x71, 0x0e, 0xcc,
0xaf, 0x82, 0xee, 0x14, 0x38, 0x79, 0xad, 0xf0, 0x9d, 0x26, 0x42, 0x98, 0x26, 0x42, 0x98, 0x26,
0x42, 0x98, 0x26, 0x42, 0x98, 0x26, 0x42, 0x98, 0x26, 0x42, 0x98, 0x26, 0x42, 0x98, 0xe6, 0x0a,
0xdf, 0x69, 0x69, 0xe1, 0x7b, 0x55, 0xca, 0xc4, 0x5b, 0x0b, 0xdf, 0xab, 0x7d, 0x85, 0xaf, 0x90,
0xfe, 0xd7, 0x2d, 0xe9, 0x67, 0x4f, 0xa4, 0xdc, 0x52, 0x3a, 0xd9, 0x3b, 0xde, 0x7b, 0x59, 0xaf,
0x57, 0xa2, 0x45, 0xc3, 0xcc, 0x3e, 0xcb, 0xb5, 0x68, 0x82, 0x62, 0x8b, 0x66, 0xb0, 0xad, 0x6c,
0x10, 0x6a, 0x69, 0x67, 0xeb, 0xf1, 0x0e, 0x04, 0xfd, 0x66, 0x73, 0x40, 0xfd, 0xd0, 0xf2, 0x66,
0xe8, 0x04, 0xb8, 0x9e, 0xae, 0xd7, 0xcc, 0x8d, 0x18, 0x17, 0xd0, 0xe5, 0xae, 0x61, 0xdd, 0x7c,
0x2f, 0x1d, 0xca, 0xb5, 0xac, 0x93, 0xfe, 0xc9, 0xff, 0xfc, 0xf2, 0x22, 0xc2, 0xba, 0x1b, 0x71,
0xdf, 0x26, 0xe2, 0xcf, 0x42, 0xc6, 0x1f, 0xf9, 0x10, 0x5c, 0x10, 0x16, 0x41, 0x90, 0x14, 0xe4,
0x31, 0x69, 0x97, 0x10, 0xce, 0x14, 0x2b, 0xa3, 0xba, 0x85, 0x47, 0x55, 0xab, 0x97, 0xfd, 0x05,
0x40, 0x2d, 0x4c, 0xab, 0x7a, 0xa9, 0x6a, 0x97, 0x7d, 0x1b, 0xbe, 0xd8, 0x26, 0x7c, 0xfc, 0xf3,
0x66, 0xdc, 0xc3, 0xc8, 0xa3, 0x3c, 0x56, 0x61, 0x34, 0xc8, 0x5b, 0xd0, 0xc2, 0xb8, 0x88, 0xed,
0xea, 0x33, 0xb9, 0x0f, 0xb2, 0x90, 0x8e, 0x7a, 0xeb, 0xb9, 0x69, 0x3e, 0x0e, 0x28, 0xc8, 0x4c,
0xa1, 0xd5, 0xc7, 0x2a, 0x25, 0xc1, 0x7c, 0x15, 0x39, 0xb6, 0xe5, 0x26, 0x9e, 0x7d, 0xa1, 0x17,
0xea, 0xa0, 0x58, 0x13, 0xbb, 0x10, 0x71, 0x1d, 0x93, 0xff, 0xbf, 0x18, 0xba, 0xac, 0xa5, 0x27,
0x63, 0x2b, 0x0b, 0xa7, 0x63, 0xcb, 0x7e, 0x98, 0x85, 0xfe, 0xd2, 0x9b, 0x98, 0x5f, 0xd0, 0x2d,
0x5b, 0xe1, 0xd1, 0x2c, 0xb4, 0x26, 0x0e, 0xf6, 0xde, 0xdf, 0xe9, 0x13, 0x36, 0xd3, 0xc8, 0xf7,
0xcf, 0xa2, 0xa9, 0x70, 0xac, 0x0f, 0xc4, 0x87, 0x77, 0x90, 0xb6, 0xf3, 0x15, 0xcf, 0xad, 0xa2,
0x6d, 0xdb, 0x74, 0x4d, 0xf4, 0x04, 0x78, 0xfd, 0x83, 0x46, 0xbe, 0x6b, 0xb5, 0x5a, 0xd9, 0x77,
0x02, 0xf4, 0x7f, 0x50, 0xbf, 0xc8, 0x15, 0x61, 0x93, 0x5d, 0x35, 0x82, 0xdd, 0xbf, 0xb6, 0xe2,
0x39, 0xba, 0x27, 0x85, 0x3b, 0x55, 0xed, 0x44, 0xd7, 0xd5, 0x97, 0x17, 0x41, 0xf9, 0x44, 0x2f,
0x8f, 0x91, 0x25, 0xf8, 0x84, 0x0a, 0x26, 0xd8, 0xac, 0x6f, 0x25, 0xd8, 0x0c, 0x7d, 0x73, 0x22,
0x02, 0xdb, 0x13, 0x94, 0xa1, 0x91, 0xef, 0x15, 0x84, 0x99, 0xd1, 0x3f, 0xd1, 0x7f, 0xc0, 0x56,
0x3c, 0xa0, 0xab, 0x61, 0x4b, 0x85, 0x2c, 0xd8, 0xc2, 0x0f, 0x57, 0xb4, 0x9a, 0xb5, 0x5e, 0x06,
0x5f, 0x88, 0xd2, 0x1b, 0xf7, 0x2f, 0xee, 0xee, 0x6e, 0xee, 0x3a, 0xe4, 0x57, 0xde, 0x42, 0xf1,
0x21, 0x26, 0x83, 0x30, 0x70, 0x25, 0xd6, 0xc3, 0x83, 0x5e, 0x7d, 0xdc, 0x57, 0xbf, 0x40, 0x22,
0xae, 0x76, 0x00, 0x9f, 0x2e, 0x5a, 0x33, 0x01, 0x40, 0xc8, 0x20, 0xce, 0x83, 0xe2, 0xdc, 0xe4,
0xbc, 0xdb, 0xcc, 0x71, 0x15, 0x05, 0xd0, 0x56, 0x1f, 0xff, 0x22, 0xca, 0x1d, 0xb5, 0xde, 0x86,
0x59, 0xd4, 0x1b, 0xdd, 0xb9, 0x39, 0xef, 0xb7, 0x07, 0x19, 0xd4, 0x5c, 0xed, 0xcc, 0xbb, 0x96,
0x29, 0xf3, 0xfb, 0x21, 0xcf, 0xe8, 0x36, 0x0b, 0x6d, 0x6d, 0x6c, 0xe6, 0x6b, 0xac, 0xac, 0x9f,
0x31, 0xef, 0x19, 0x35, 0xbd, 0x71, 0x78, 0x78, 0x30, 0x84, 0x7f, 0xe3, 0x01, 0xa0, 0xb9, 0x18,
0xdd, 0x92, 0xf6, 0x6f, 0xd8, 0x87, 0x24, 0x4f, 0x4e, 0x3c, 0x27, 0xc6, 0x29, 0xf9, 0x75, 0x34,
0x24, 0xd1, 0x32, 0x08, 0xdc, 0x15, 0xed, 0x28, 0x56, 0xd5, 0x1c, 0x0e, 0xa8, 0xd1, 0xf8, 0x8d,
0xd0, 0xce, 0x78, 0x40, 0x3f, 0x8e, 0x1a, 0x27, 0x46, 0x9b, 0x88, 0xef, 0x14, 0x06, 0x52, 0x0d,
0x20, 0xe6, 0xf8, 0x3f, 0x7a, 0x2a, 0x47, 0x61, 0x87, 0xcd, 0x83, 0x0c, 0x02, 0x92, 0x92, 0xd8,
0xe7, 0xd3, 0xa6, 0xa2, 0x5c, 0x1b, 0xed, 0x9e, 0xac, 0x21, 0x66, 0xab, 0x5d, 0x98, 0x54, 0xe1,
0xed, 0x2b, 0x3f, 0x8a, 0x09, 0x9b, 0x4e, 0x01, 0x4d, 0xa4, 0x91, 0xff, 0xa4, 0xdd, 0x8b, 0xaa,
0x39, 0x32, 0x47, 0x05, 0x49, 0x8c, 0xd4, 0xce, 0x48, 0xbb, 0xe0, 0x84, 0x9d, 0x88, 0x30, 0xcf,
0x5f, 0xce, 0xe6, 0x6a, 0x6f, 0x1c, 0xf6, 0xb3, 0x26, 0x51, 0x61, 0x79, 0xad, 0x42, 0xef, 0x28,
0xb7, 0xec, 0x68, 0x6f, 0x17, 0xe2, 0xe5, 0x57, 0xa1, 0x13, 0x45, 0x75, 0x3d, 0x91, 0x92, 0xbc,
0xbc, 0x97, 0xd5, 0x2a, 0x4d, 0x34, 0x33, 0xb7, 0xd1, 0x65, 0x45, 0xf1, 0x85, 0x37, 0x91, 0x2d,
0x3f, 0xd6, 0x33, 0x92, 0x36, 0x9e, 0xde, 0x7d, 0x7c, 0xcd, 0x7f, 0x8c, 0x40, 0xb1, 0xd8, 0x11,
0x44, 0x8f, 0xcc, 0x87, 0x54, 0x5f, 0xef, 0x3c, 0x6c, 0x0e, 0xe9, 0x8a, 0x32, 0xfd, 0x75, 0x5f,
0xb5, 0x35, 0x50, 0x72, 0xea, 0xf1, 0x22, 0xc8, 0x13, 0x45, 0x10, 0xd4, 0xe2, 0xaa, 0xe6, 0x44,
0xbf, 0x58, 0xbf, 0x28, 0x8f, 0xea, 0x40, 0xef, 0x3c, 0x66, 0x53, 0x85, 0xd2, 0x15, 0x17, 0x35,
0xdd, 0xd4, 0x13, 0x3b, 0x1a, 0x1b, 0xe4, 0xce, 0x92, 0x8d, 0x1d, 0x48, 0xef, 0x46, 0xf7, 0x90,
0xdc, 0x39, 0x66, 0x9c, 0x26, 0x72, 0x53, 0xe5, 0x40, 0x81, 0x0a, 0x04, 0xa2, 0x95, 0xd3, 0xc7,
0xb4, 0x6a, 0xf8, 0xf2, 0x72, 0x24, 0xbe, 0x83, 0x32, 0x3b, 0x6a, 0xd2, 0xc3, 0x16, 0x0e, 0x0f,
0xe6, 0xca, 0x23, 0x27, 0x02, 0x24, 0x55, 0xf9, 0x97, 0xde, 0xc4, 0x79, 0x24, 0x7c, 0xf3, 0xc8,
0xe4, 0xf8, 0xfb, 0xbf, 0x7b, 0xbd, 0x39, 0x94, 0xbb, 0xb8, 0x6e, 0x72, 0x8f, 0xb9, 0xd3, 0x38,
0xd6, 0x83, 0x6f, 0xf8, 0xe6, 0xfb, 0x67, 0xa7, 0x6a, 0xac, 0x3b, 0x00, 0x22, 0xda, 0x02, 0x44,
0xec, 0x1e, 0x5f, 0xdd, 0xc3, 0x8b, 0x35, 0x25, 0x50, 0xba, 0xcd, 0xd1, 0x33, 0x98, 0xf4, 0xd7,
0x4b, 0x25, 0x0e, 0x41, 0x22, 0x1c, 0x9d, 0x1f, 0xf0, 0xd9, 0xca, 0xc2, 0xb2, 0xd1, 0xa0, 0x44,
0x8c, 0x66, 0x93, 0x3e, 0xb7, 0x82, 0x6f, 0xbd, 0xba, 0x00, 0xd9, 0x06, 0x6e, 0xea, 0xb4, 0x3f,
0xfa, 0xdb, 0xf1, 0x89, 0xd1, 0x20, 0x77, 0x1f, 0x86, 0x1f, 0xf7, 0x00, 0x1a, 0xb4, 0x7f, 0x7f,
0x6d, 0x9c, 0x18, 0xad, 0xdd, 0x30, 0x8d, 0x16, 0x85, 0x7a, 0x51, 0x7f, 0xf8, 0xf9, 0x3f, 0xf6,
0xc0, 0xb4, 0x05, 0x9e, 0xc6, 0xbb, 0xdd, 0x30, 0x6d, 0x60, 0x0a, 0x19, 0xd7, 0x8d, 0x3d, 0x30,
0xc0, 0xcf, 0xe9, 0xed, 0xa9, 0xa1, 0x37, 0xf6, 0xc0, 0x34, 0x68, 0xff, 0xea, 0xf6, 0xfc, 0xe4,
0x44, 0x3f, 0xde, 0x03, 0xd4, 0xe2, 0x40, 0xc7, 0x27, 0x7a, 0x73, 0x0f, 0x50, 0x93, 0xf6, 0x6f,
0xdf, 0x9d, 0x18, 0x7b, 0x40, 0x5a, 0xc0, 0xf4, 0x8d, 0x57, 0xbf, 0x99, 0x4e, 0xf7, 0xc0, 0x00,
0xd3, 0xb7, 0x1f, 0xaf, 0xc9, 0xc7, 0xb9, 0x13, 0xb3, 0x3d, 0x60, 0x0d, 0x01, 0x76, 0x76, 0x76,
0xbf, 0x07, 0xa8, 0x29, 0x80, 0x60, 0xd9, 0xf6, 0x00, 0xb5, 0x52, 0xa0, 0x3d, 0x6b, 0xdb, 0x6a,
0xa7, 0x50, 0xd5, 0x22, 0xcd, 0xdf, 0xbf, 0x35, 0xed, 0x83, 0xa3, 0xa3, 0x0d, 0xf0, 0xe3, 0x0c,
0xfc, 0x3c, 0x07, 0x7f, 0x74, 0x04, 0xe0, 0x6c, 0x0b, 0xfb, 0x09, 0x08, 0xe6, 0xfc, 0xfc, 0x16,
0xc1, 0x89, 0xe2, 0xb1, 0xf8, 0xc9, 0x0f, 0x1f, 0xd4, 0xd7, 0x68, 0x9c, 0x80, 0xa4, 0x2e, 0x8c,
0x5a, 0xd3, 0x28, 0x1f, 0x96, 0x90, 0x2a, 0x1f, 0x0b, 0xe2, 0x3b, 0x0d, 0xe3, 0x5f, 0x58, 0xbc,
0x7f, 0xf0, 0x26, 0x9f, 0x27, 0x29, 0x9f, 0x1f, 0x4b, 0x19, 0xed, 0xd5, 0x85, 0x59, 0xf5, 0xd1,
0x73, 0xc3, 0x57, 0x34, 0x6c, 0x67, 0x62, 0x52, 0xdb, 0x17, 0xd6, 0x29, 0x4d, 0x5a, 0xfa, 0xe2,
0x8e, 0xcc, 0x0c, 0xfa, 0x67, 0x18, 0xfa, 0xc9, 0x4d, 0x38, 0x61, 0xe1, 0x96, 0x61, 0x9f, 0xdd,
0xf0, 0xa1, 0xdb, 0x4b, 0x02, 0x32, 0xfb, 0x70, 0xb7, 0x67, 0x61, 0x41, 0x3c, 0x7b, 0x17, 0x1e,
0x44, 0x30, 0xbc, 0xfb, 0xb0, 0xc7, 0x9c, 0x61, 0xfc, 0x70, 0xcf, 0x7b, 0xd0, 0x9b, 0xe1, 0x87,
0xbb, 0x3d, 0x06, 0x01, 0xfc, 0x0d, 0xef, 0x4a, 0x85, 0x53, 0x07, 0xb9, 0xe4, 0xc5, 0x33, 0x71,
0x66, 0x38, 0xc9, 0xa7, 0x2d, 0x01, 0xf1, 0xb8, 0xd4, 0x1f, 0x3d, 0x59, 0x41, 0x87, 0x14, 0xc5,
0xf2, 0x51, 0x8a, 0x65, 0x5b, 0x28, 0xbf, 0xc0, 0x98, 0x94, 0xea, 0xb6, 0x4c, 0x3e, 0x92, 0x43,
0x32, 0xdc, 0xf5, 0xbe, 0x21, 0xde, 0x7f, 0xd8, 0xf5, 0xbe, 0x29, 0xde, 0x67, 0xb3, 0x2a, 0x9d,
0x13, 0xfe, 0x89, 0x02, 0xcb, 0xe3, 0x73, 0x0b, 0xa2, 0x89, 0xe0, 0x54, 0xb4, 0x27, 0x60, 0x00,
0xbc, 0xe9, 0x93, 0x9e, 0xd8, 0x1f, 0xc5, 0xb3, 0x1f, 0x26, 0xf5, 0x96, 0x8b, 0x31, 0x0b, 0x69,
0xe2, 0xca, 0x47, 0x42, 0x59, 0x70, 0xb4, 0x1b, 0x89, 0xcf, 0x32, 0x3a, 0xb8, 0x44, 0x54, 0x11,
0x94, 0x60, 0x35, 0x0c, 0xb3, 0xc5, 0xac, 0x0e, 0x4d, 0xe1, 0x9d, 0x41, 0x13, 0x1e, 0xbf, 0x7f,
0x4e, 0xc2, 0xb7, 0xa3, 0xf2, 0x80, 0xc0, 0x29, 0x99, 0x34, 0x5f, 0x7f, 0x20, 0xd2, 0xcf, 0x26,
0x86, 0x87, 0x2e, 0xee, 0x1a, 0x74, 0x29, 0x49, 0x1a, 0x90, 0xa4, 0xde, 0x3f, 0xf4, 0xc6, 0x51,
0xd0, 0xdd, 0x5e, 0x1e, 0x7b, 0xa7, 0xfe, 0x5e, 0xf1, 0x50, 0xd8, 0xd9, 0x3b, 0xa9, 0xb3, 0xe2,
0x44, 0xe4, 0x0c, 0x0c, 0x39, 0x03, 0x9e, 0x68, 0xde, 0x0e, 0xd7, 0x34, 0x5b, 0xa9, 0x8c, 0xa5,
0x74, 0x0a, 0xc8, 0x2b, 0x05, 0x0e, 0x85, 0xb0, 0xa5, 0x8d, 0xd5, 0xb7, 0x24, 0xae, 0x4b, 0x89,
0xf3, 0xee, 0xf1, 0x5b, 0x04, 0xae, 0x0b, 0xde, 0x0a, 0x32, 0x6d, 0x36, 0x73, 0x1c, 0x48, 0xae,
0xa3, 0x8d, 0xf8, 0xaa, 0xd2, 0x7a, 0x91, 0xb2, 0x21, 0x29, 0x4b, 0xa2, 0xfb, 0x68, 0x1a, 0x3b,
0x68, 0xbe, 0x95, 0x54, 0xe3, 0xed, 0xa4, 0x1a, 0xff, 0x22, 0xa9, 0xe6, 0xdb, 0x49, 0x35, 0xff,
0x45, 0x52, 0xad, 0xb7, 0x93, 0x6a, 0xfd, 0x53, 0xa4, 0x36, 0x74, 0x3a, 0xdc, 0xa9, 0xd3, 0xa8,
0x5d, 0x19, 0x63, 0x90, 0xd7, 0x0b, 0xc6, 0x92, 0x5e, 0xa5, 0x64, 0x70, 0x43, 0xe7, 0x79, 0x27,
0x7e, 0xec, 0x7f, 0x4b, 0x98, 0x3c, 0xfb, 0x2d, 0x99, 0x4e, 0xb9, 0xc7, 0x8b, 0xf6, 0x92, 0x1f,
0x3d, 0x38, 0x01, 0x99, 0x3a, 0x21, 0x54, 0x0f, 0x98, 0xa3, 0xee, 0xb5, 0xaf, 0xd1, 0x55, 0x89,
0x38, 0xa0, 0x6e, 0xa2, 0x99, 0x67, 0xdc, 0xb0, 0xa3, 0x9d, 0x4c, 0x4d, 0xf7, 0x32, 0x05, 0xd9,
0x0b, 0xb9, 0x63, 0xd3, 0x90, 0x45, 0x99, 0xc1, 0x73, 0x09, 0x4d, 0x05, 0x03, 0xe5, 0x82, 0xb8,
0x7b, 0xbf, 0x5f, 0x10, 0xd6, 0x5e, 0x9a, 0xa7, 0xcb, 0xd8, 0x3f, 0xb2, 0x2d, 0xd7, 0x5e, 0xba,
0x56, 0xcc, 0xc8, 0x13, 0xe6, 0x46, 0x78, 0x8c, 0x13, 0xaa, 0x1e, 0x97, 0x4c, 0x43, 0x7f, 0x81,
0x11, 0xb9, 0x23, 0x56, 0x2c, 0x1f, 0x24, 0x4e, 0x3f, 0x96, 0x05, 0x09, 0x7d, 0x5f, 0x88, 0x30,
0xfa, 0xc3, 0xd0, 0x99, 0xcd, 0x63, 0x16, 0xee, 0x00, 0x68, 0xf4, 0x4f, 0x6d, 0x1b, 0x0f, 0xb4,
0xed, 0xc2, 0xd0, 0xec, 0x9f, 0x2f, 0x2d, 0x77, 0x3b, 0x42, 0x08, 0xb7, 0x9a, 0x0a, 0x80, 0xff,
0xfd, 0xd2, 0xb5, 0xa0, 0x76, 0x8b, 0x58, 0x18, 0x9f, 0x4e, 0xbe, 0x5a, 0x36, 0x54, 0x1b, 0x58,
0xc4, 0x29, 0x74, 0xcc, 0xa0, 0x6e, 0x64, 0xcc, 0x9b, 0x50, 0xcd, 0x57, 0xd7, 0xb2, 0x9c, 0x50,
0xe2, 0x4f, 0x47, 0x47, 0xce, 0xe7, 0x5a, 0x08, 0xf5, 0xfb, 0x23, 0x53, 0x54, 0x0d, 0xbe, 0xc9,
0x86, 0x51, 0x75, 0xab, 0xcc, 0x73, 0x7a, 0x58, 0x8a, 0x1c, 0x19, 0xe5, 0xed, 0x87, 0xa3, 0x6d,
0xf8, 0xfe, 0x76, 0xa7, 0xc2, 0x7b, 0x79, 0xe1, 0x7b, 0xca, 0x85, 0x6a, 0xe9, 0xec, 0xe6, 0x5a,
0x01, 0x19, 0x42, 0xb9, 0xc4, 0xb7, 0x50, 0x45, 0x11, 0xe3, 0xec, 0xa9, 0x98, 0x6c, 0x7f, 0xf1,
0x07, 0x3c, 0x0c, 0x57, 0x40, 0x33, 0x5f, 0x33, 0x41, 0xb5, 0x84, 0xcd, 0x39, 0x59, 0x1e, 0x15,
0x8a, 0xa0, 0x6c, 0xc8, 0x5b, 0x4a, 0x21, 0x22, 0x22, 0xeb, 0x3e, 0xeb, 0xf8, 0x7b, 0x2e, 0xa4,
0x7e, 0x7b, 0x53, 0x48, 0x3d, 0x6e, 0xb7, 0x9b, 0xed, 0x5c, 0x4c, 0x65, 0xeb, 0x0d, 0xfb, 0xc9,
0xc5, 0x4c, 0x93, 0xd2, 0x34, 0x68, 0xbe, 0x21, 0x14, 0xfe, 0xfd, 0x2c, 0xc7, 0x8c, 0xbd, 0x37,
0x2c, 0x6e, 0x72, 0xe1, 0xad, 0x0b, 0x54, 0x37, 0x2d, 0x5a, 0xda, 0xd5, 0x9f, 0xca, 0x32, 0x39,
0x17, 0x32, 0x3d, 0x95, 0xfc, 0xfd, 0xff, 0xcb, 0x38, 0x13, 0x7b, 0xe3, 0x2e, 0x42, 0x5a, 0x9e,
0xdc, 0x9f, 0x14, 0x9a, 0xe6, 0xb0, 0x88, 0xb7, 0x51, 0xf6, 0x9a, 0xa2, 0x25, 0xad, 0xed, 0x9b,
0x4f, 0xab, 0x4e, 0xd2, 0xb3, 0x8d, 0xb5, 0x71, 0xec, 0xa1, 0x51, 0x80, 0x2e, 0xca, 0x33, 0x18,
0x99, 0xbd, 0x80, 0xa9, 0xe2, 0xab, 0x1d, 0x87, 0x35, 0xcb, 0x8d, 0x04, 0x2c, 0x2b, 0x3d, 0x03,
0xa7, 0x1f, 0x98, 0xb8, 0xd9, 0xa6, 0xb0, 0x4f, 0xde, 0x91, 0x91, 0xb3, 0x7c, 0x49, 0x12, 0x1e,
0x0a, 0x92, 0x6a, 0x9e, 0x64, 0xc4, 0x62, 0x6e, 0xa4, 0xea, 0x33, 0x3a, 0x8d, 0x8d, 0x13, 0xdb,
0x4c, 0x6c, 0x3d, 0xe0, 0x89, 0x10, 0x86, 0x5d, 0xc1, 0x37, 0xb1, 0xa4, 0xb2, 0x94, 0x74, 0x57,
0x92, 0x2e, 0x9c, 0x64, 0x15, 0x8f, 0x80, 0x60, 0x2a, 0x53, 0x70, 0x14, 0xdb, 0x47, 0x9a, 0x7a,
0x45, 0x5e, 0xca, 0x5d, 0x13, 0x8e, 0x06, 0x62, 0xdb, 0xa3, 0xb7, 0x1d, 0x54, 0xc1, 0x2f, 0x0d,
0x63, 0x4f, 0x1c, 0xa5, 0x4d, 0x3c, 0x12, 0xc7, 0x06, 0xac, 0x45, 0xf9, 0xfe, 0x98, 0x66, 0x99,
0xb8, 0x03, 0x52, 0x1d, 0xf1, 0x6d, 0x8c, 0x1a, 0xc6, 0x8e, 0xb3, 0xb9, 0x15, 0x9e, 0xf9, 0x13,
0xa6, 0x60, 0xa3, 0x4b, 0x1f, 0xb4, 0x4e, 0x3a, 0xed, 0xb6, 0x5a, 0x05, 0x39, 0x39, 0x55, 0xf3,
0xcb, 0x70, 0x19, 0xc7, 0x3e, 0x3f, 0x55, 0xb7, 0x16, 0x87, 0x11, 0xca, 0x0d, 0x9b, 0x1b, 0xed,
0x51, 0x62, 0xb5, 0x50, 0xe7, 0x4b, 0x53, 0xfa, 0xfe, 0xd9, 0x5a, 0x6f, 0xe5, 0x21, 0x89, 0xb1,
0x7f, 0x8b, 0x8a, 0x96, 0xdd, 0xff, 0xa2, 0x21, 0x49, 0x19, 0x27, 0x0a, 0x81, 0xec, 0xfb, 0x67,
0x3a, 0xbc, 0x78, 0x13, 0xd7, 0x29, 0x9a, 0x2d, 0xdb, 0x85, 0x49, 0xe8, 0xa6, 0x19, 0x0f, 0x68,
0xd2, 0xf9, 0xc1, 0x73, 0x15, 0xeb, 0xfe, 0xb9, 0xdc, 0x64, 0x48, 0xcd, 0xa6, 0x74, 0x78, 0x03,
0x87, 0x37, 0x4a, 0x86, 0xdf, 0x2e, 0xa3, 0xf9, 0x98, 0x0b, 0x69, 0x3f, 0x82, 0x26, 0x22, 0x68,
0xee, 0x40, 0x40, 0x1c, 0xb9, 0x27, 0xbc, 0x1f, 0x47, 0x0b, 0x71, 0xb4, 0x4a, 0x70, 0x8c, 0xf8,
0x09, 0xb4, 0xfd, 0x83, 0xdb, 0x38, 0xb8, 0x5d, 0xc6, 0xc0, 0xe5, 0x1d, 0x89, 0x98, 0x17, 0xf9,
0xe1, 0x7e, 0x04, 0xc7, 0x88, 0xe0, 0xb8, 0x04, 0xc1, 0xbd, 0xbf, 0x7c, 0x8d, 0xf8, 0x4f, 0x38,
0xf6, 0xa7, 0x92, 0xb1, 0xa7, 0x9e, 0xe5, 0xfa, 0xb3, 0xfd, 0x83, 0x4f, 0x70, 0xf0, 0xc9, 0xce,
0xc1, 0x3b, 0x84, 0x47, 0x53, 0xe7, 0x47, 0x05, 0x52, 0x9e, 0xcb, 0xca, 0xd0, 0x00, 0x09, 0x0c,
0xcc, 0xb7, 0x43, 0x02, 0xdf, 0xf1, 0x20, 0xd5, 0xe9, 0x72, 0x1d, 0xe5, 0x47, 0x3e, 0x28, 0xde,
0x8b, 0xf8, 0x11, 0xf5, 0xf6, 0x47, 0x35, 0x89, 0x6a, 0x87, 0xdf, 0x7d, 0x6b, 0xfc, 0x64, 0xb4,
0xbb, 0x49, 0x52, 0x0e, 0x4e, 0x54, 0x6e, 0x8b, 0x6c, 0x9a, 0x57, 0xfe, 0xa0, 0x7a, 0x3c, 0x73,
0x47, 0x0e, 0x3a, 0x05, 0xa5, 0x70, 0xa7, 0x84, 0xa9, 0x2f, 0x2f, 0x4a, 0xf1, 0x56, 0xc9, 0xe6,
0xd1, 0xb5, 0xf4, 0x86, 0xc2, 0x33, 0xba, 0x2a, 0xe1, 0x3a, 0x0f, 0x0c, 0xcc, 0x38, 0xba, 0x10,
0xe0, 0xf6, 0xb7, 0x66, 0x13, 0xcf, 0xe9, 0xe1, 0xfe, 0xfa, 0xf6, 0x16, 0x19, 0x77, 0x99, 0xea,
0x9f, 0xe8, 0x4b, 0x7b, 0xc5, 0xf6, 0xf2, 0x41, 0xc9, 0xb6, 0x9b, 0x97, 0xe0, 0x43, 0x47, 0x8d,
0x47, 0x1e, 0xf3, 0x95, 0xb6, 0xf7, 0x19, 0xdb, 0xca, 0x72, 0xdf, 0x2c, 0xd2, 0x29, 0x00, 0xe9,
0xdb, 0x48, 0x70, 0x1f, 0x6c, 0x37, 0x0e, 0x9d, 0xe3, 0x10, 0x12, 0x8f, 0x9c, 0xdc, 0x99, 0x48,
0xa6, 0x25, 0x42, 0xce, 0x84, 0xb7, 0x0c, 0xf0, 0x5a, 0xc6, 0x7b, 0xc7, 0xc5, 0x7b, 0x2c, 0xf2,
0xb4, 0x9b, 0xc7, 0x9e, 0xc8, 0xdf, 0xaf, 0xaf, 0x7e, 0x8e, 0xe3, 0xe0, 0x0e, 0xb2, 0x07, 0x16,
0xc5, 0x5d, 0x6f, 0xf7, 0x5d, 0x91, 0xdc, 0xfd, 0x86, 0xec, 0xf6, 0x45, 0x3c, 0x77, 0xf0, 0x94,
0x52, 0x14, 0xf8, 0x10, 0x23, 0xef, 0xd9, 0xb7, 0x58, 0xe3, 0x4f, 0x80, 0xcd, 0x78, 0x19, 0xe1,
0x71, 0x0c, 0x98, 0xa4, 0x0a, 0xb1, 0x6b, 0xf7, 0x3d, 0x92, 0x0c, 0x2f, 0xcb, 0x23, 0xc6, 0x93,
0xc1, 0x96, 0xfd, 0xa0, 0x1d, 0x24, 0x08, 0xc4, 0x35, 0x9f, 0xdb, 0x1b, 0x58, 0x4d, 0x8d, 0xd6,
0xc5, 0x74, 0xe4, 0x9e, 0x4b, 0xcc, 0x67, 0xf2, 0xde, 0x0f, 0x17, 0x78, 0xc2, 0x2c, 0x3d, 0xa1,
0x28, 0xef, 0xc1, 0x28, 0x14, 0xcf, 0x25, 0xcb, 0x83, 0xb2, 0xfc, 0x88, 0x32, 0x5e, 0x4c, 0x89,
0x40, 0x7c, 0x78, 0x37, 0xc5, 0xab, 0x45, 0x08, 0x13, 0xab, 0x5a, 0xc9, 0x11, 0xe6, 0x83, 0x8d,
0x5b, 0x3e, 0x67, 0xd3, 0x59, 0x2a, 0x3d, 0x2d, 0xee, 0xd2, 0xe4, 0x25, 0x05, 0x2b, 0x04, 0xc7,
0x0f, 0x71, 0x53, 0xde, 0x49, 0x42, 0x39, 0xdf, 0x31, 0x0b, 0x52, 0xaa, 0x01, 0xcc, 0x84, 0xd3,
0x1b, 0xb0, 0x94, 0xee, 0x40, 0xc1, 0x58, 0x9e, 0x72, 0xa1, 0x48, 0xfe, 0xd3, 0x31, 0x78, 0xd2,
0x0a, 0xc9, 0x99, 0x79, 0xd1, 0x60, 0x68, 0xc6, 0x61, 0xa0, 0x00, 0xa0, 0x94, 0x28, 0xf3, 0xa5,
0x1b, 0xcb, 0xe9, 0xf3, 0xfb, 0x04, 0x5c, 0x79, 0x14, 0x8f, 0xef, 0x23, 0xc4, 0xb5, 0xf9, 0x13,
0xdf, 0xa4, 0xc1, 0x0f, 0xa0, 0xfb, 0x93, 0xcc, 0x66, 0xc4, 0x81, 0x13, 0x43, 0xe7, 0x47, 0x4d,
0x92, 0x6d, 0x0e, 0xd0, 0xe6, 0x6e, 0x02, 0x8a, 0xe9, 0x4e, 0x0d, 0xa0, 0x2f, 0x2c, 0x7b, 0xae,
0xc8, 0xd8, 0x69, 0xf6, 0x9f, 0x13, 0x50, 0x43, 0x64, 0x0a, 0x19, 0x2a, 0x56, 0x0b, 0x1c, 0x2f,
0x7f, 0x7e, 0xa5, 0xcc, 0x6a, 0xbe, 0xf0, 0x3a, 0x14, 0xe3, 0xd9, 0x97, 0xdc, 0xc1, 0x2a, 0x3e,
0xf4, 0x93, 0xf3, 0xb9, 0xbb, 0x73, 0x1f, 0xc7, 0x2b, 0x40, 0xa3, 0x90, 0xb5, 0x9d, 0xfb, 0x4b,
0x45, 0x58, 0x6e, 0x29, 0xda, 0x5b, 0xce, 0xb4, 0x8a, 0xbc, 0xaa, 0x1c, 0xf4, 0xec, 0x66, 0x13,
0xd4, 0xc7, 0x44, 0x59, 0x7b, 0xcb, 0x91, 0x57, 0x64, 0x02, 0x4a, 0xf5, 0x72, 0xd8, 0xbb, 0xf7,
0x09, 0x6c, 0x6a, 0xb5, 0xb0, 0xa6, 0xd3, 0x1d, 0x5c, 0xfc, 0x56, 0x06, 0xfc, 0xb8, 0x56, 0xd7,
0xc9, 0x12, 0x43, 0x7a, 0x04, 0x2e, 0x22, 0x4d, 0xf2, 0xf0, 0xea, 0x92, 0x78, 0x9a, 0xae, 0x24,
0x13, 0x6b, 0xc8, 0x33, 0x32, 0x29, 0x1c, 0x31, 0x6f, 0x39, 0x25, 0x6e, 0x66, 0x7c, 0x14, 0x78,
0xef, 0xa4, 0xfc, 0x4a, 0xbe, 0x77, 0x8b, 0x67, 0x5b, 0x78, 0x75, 0xaa, 0x26, 0x47, 0x10, 0xb7,
0xbc, 0x3d, 0xc5, 0xe3, 0xf5, 0xbb, 0xd5, 0x08, 0x53, 0x32, 0x24, 0x8b, 0x6b, 0x8f, 0x46, 0xc8,
0x97, 0x15, 0x6f, 0x42, 0x95, 0xce, 0xfd, 0xfe, 0x9e, 0xe6, 0x44, 0x6a, 0xd5, 0xe2, 0x78, 0xcd,
0xb9, 0x72, 0xc2, 0x5d, 0xc7, 0xf7, 0x2e, 0xef, 0xf2, 0x23, 0x24, 0x30, 0x52, 0x2b, 0x27, 0x70,
0x79, 0x5f, 0x06, 0xce, 0x79, 0x12, 0xf2, 0x08, 0x19, 0x24, 0x9a, 0xbb, 0x88, 0xdd, 0x5d, 0x6d,
0x8d, 0xe6, 0xf0, 0xbb, 0xe9, 0xdd, 0x5d, 0xd3, 0xc2, 0x52, 0xe6, 0xc6, 0x40, 0xc8, 0x4e, 0x6a,
0x05, 0x0d, 0x4d, 0xdc, 0x9a, 0x9c, 0x46, 0xe8, 0x54, 0xc1, 0xaa, 0xd5, 0x8e, 0xbc, 0x54, 0x73,
0xeb, 0x32, 0x3c, 0x7b, 0x2e, 0xf3, 0x40, 0x8b, 0xa0, 0xed, 0xf3, 0xab, 0x76, 0xa2, 0x25, 0x74,
0x40, 0x53, 0xc8, 0x7b, 0xf0, 0xc4, 0x64, 0x1c, 0xfa, 0x4f, 0x50, 0xbd, 0x90, 0x89, 0xcf, 0x22,
0xbc, 0x5c, 0x84, 0xdb, 0xd7, 0x7e, 0x08, 0x89, 0xea, 0x9c, 0x91, 0x2f, 0xdc, 0x05, 0x7d, 0x21,
0x41, 0x08, 0xce, 0x15, 0x22, 0x0a, 0x26, 0xfe, 0x1c, 0x13, 0xcf, 0x65, 0x23, 0x7e, 0x41, 0x27,
0x3b, 0x74, 0x9a, 0xa1, 0x65, 0x02, 0xea, 0xf4, 0xf6, 0x92, 0x38, 0x79, 0xa4, 0xbc, 0x27, 0x4b,
0xe2, 0x3c, 0xd9, 0x15, 0xb8, 0xaa, 0xfc, 0x4d, 0xcc, 0x11, 0x44, 0x0f, 0x8a, 0xa3, 0x3b, 0xe0,
0x33, 0xa5, 0xb3, 0x74, 0x7d, 0x9b, 0xdf, 0xfd, 0xa8, 0x01, 0x1f, 0xb1, 0x6f, 0xfb, 0x78, 0x2e,
0x93, 0xdf, 0x1f, 0xd5, 0x35, 0x85, 0xdf, 0x65, 0x35, 0x11, 0xc2, 0x1d, 0xc5, 0x7e, 0x68, 0xcd,
0x18, 0x8a, 0xf4, 0x32, 0x66, 0x0b, 0x8c, 0x4b, 0xf6, 0x65, 0x00, 0x55, 0x08, 0x24, 0x0e, 0x02,
0x0c, 0xc6, 0x2f, 0x02, 0xe0, 0x10, 0x3d, 0x29, 0xb9, 0x86, 0x2c, 0xb8, 0x46, 0xa4, 0xb4, 0x18,
0xa6, 0x33, 0xe4, 0x23, 0x1e, 0x73, 0xb8, 0xbc, 0x05, 0x11, 0x69, 0x05, 0x8c, 0x51, 0x11, 0xa3,
0xc6, 0xb1, 0xa9, 0x2a, 0x42, 0xf1, 0x9b, 0x9d, 0x88, 0x7e, 0xc0, 0x6f, 0xac, 0x76, 0xea, 0x75,
0x5a, 0xe5, 0xaf, 0xf1, 0xcc, 0x43, 0x35, 0xbb, 0x75, 0x5a, 0x8f, 0x6a, 0x5f, 0xa3, 0x41, 0x60,
0x36, 0x30, 0x68, 0xa8, 0xeb, 0x0a, 0xe4, 0x44, 0xe2, 0x46, 0x6e, 0x8f, 0xa7, 0x56, 0xfd, 0x7f,
0x73, 0x16, 0x5c, 0xec, 0xcb, 0xd0, 0x85, 0x60, 0x2d, 0x0e, 0x76, 0x44, 0x78, 0x66, 0x00, 0x00,
0x39, 0x40, 0xaf, 0x2e, 0xae, 0x22, 0xe3, 0x05, 0x4e, 0x22, 0xdd, 0x3f, 0x1d, 0xf1, 0x7e, 0x1c,
0x18, 0xd1, 0xa2, 0xc2, 0x0b, 0x72, 0xfc, 0xf4, 0x47, 0x94, 0xf6, 0xf6, 0xa6, 0x50, 0x58, 0xb0,
0x78, 0xee, 0x63, 0x87, 0xd4, 0x8f, 0xf0, 0x86, 0x70, 0xae, 0x59, 0x12, 0xfb, 0x20, 0x8e, 0xa7,
0xe2, 0xb3, 0x39, 0x73, 0x83, 0x21, 0xed, 0x57, 0x7a, 0x22, 0x35, 0x97, 0xd5, 0x8a, 0xf8, 0x92,
0xcb, 0xf5, 0x7e, 0x46, 0xb2, 0x83, 0x5e, 0x5d, 0xbc, 0x48, 0xdb, 0xea, 0x65, 0x63, 0x2a, 0xe9,
0xa0, 0x21, 0x0e, 0x1a, 0x42, 0xc8, 0xce, 0xc6, 0x15, 0x46, 0xc8, 0x9b, 0x09, 0xfd, 0x91, 0xf5,
0xc8, 0x32, 0x90, 0x79, 0x52, 0x78, 0xf7, 0xe6, 0x8d, 0x7e, 0x05, 0xd7, 0xe7, 0xd0, 0x5a, 0x04,
0x5d, 0xf2, 0xb3, 0x15, 0xe2, 0x49, 0x18, 0xd4, 0xf3, 0x78, 0x19, 0x80, 0x70, 0x1a, 0x90, 0x4f,
0xc7, 0x96, 0x9b, 0x74, 0x3c, 0xd3, 0x0e, 0xac, 0x6b, 0x73, 0x56, 0x65, 0x33, 0x3f, 0xeb, 0x18,
0xdb, 0x38, 0xcd, 0x2c, 0x31, 0xed, 0x39, 0xfd, 0x3b, 0x06, 0xee, 0x10, 0x2c, 0x71, 0x02, 0x6a,
0x1a, 0xf8, 0x4f, 0xa0, 0x0f, 0xf2, 0x28, 0x07, 0x9e, 0xc5, 0x18, 0x8b, 0xee, 0x5e, 0x14, 0x8b,
0x2e, 0x62, 0xa7, 0x57, 0x77, 0xc4, 0xb8, 0xb1, 0xec, 0xf6, 0x56, 0xc4, 0xa6, 0xcd, 0x32, 0xa3,
0x86, 0x67, 0x5f, 0x8a, 0xdd, 0x60, 0x7e, 0xea, 0x42, 0x36, 0x13, 0x52, 0xca, 0x95, 0x0b, 0x0f,
0x0b, 0x29, 0x62, 0x2d, 0x21, 0xd9, 0x05, 0x3d, 0xb7, 0x25, 0x2d, 0x8f, 0x45, 0x11, 0x71, 0xf1,
0xae, 0x27, 0x0b, 0x5f, 0x69, 0x17, 0x9f, 0x0e, 0x99, 0x14, 0xb5, 0xac, 0x17, 0xe5, 0x8d, 0x17,
0xd1, 0x2b, 0xe2, 0x17, 0x62, 0x04, 0xd5, 0xa4, 0x7b, 0x8a, 0xb7, 0x8c, 0xfa, 0xd7, 0xe2, 0x86,
0x39, 0x39, 0x5b, 0x86, 0x21, 0xe8, 0x7f, 0x4a, 0x43, 0xde, 0x2b, 0xbf, 0x3e, 0xa5, 0x1b, 0xd5,
0xea, 0x46, 0xb3, 0xa9, 0xd1, 0xce, 0x9a, 0x5e, 0xba, 0xbe, 0xd5, 0x27, 0x4e, 0x1b, 0x4e, 0xfd,
0x0a, 0x59, 0x9c, 0x16, 0xc9, 0x67, 0x37, 0x27, 0xd2, 0xca, 0x02, 0x9b, 0x4c, 0x1d, 0x71, 0x3a,
0xa9, 0x5b, 0xdc, 0xc6, 0xab, 0x1c, 0x7e, 0xf7, 0xee, 0xe4, 0xe4, 0xa4, 0x4b, 0xfe, 0xdd, 0x5f,
0x86, 0xc5, 0x95, 0x01, 0x0d, 0x7e, 0xc4, 0x96, 0x00, 0x99, 0x83, 0xc4, 0x88, 0x2d, 0x26, 0x52,
0xe3, 0x52, 0xbd, 0xf7, 0x09, 0x98, 0x14, 0xbc, 0x67, 0xdc, 0x95, 0x45, 0xd6, 0x94, 0x09, 0x07,
0xb6, 0x42, 0x2c, 0x5c, 0x6b, 0x34, 0x04, 0x0c, 0x84, 0x03, 0x58, 0x46, 0x08, 0x07, 0x8a, 0x4a,
0x6c, 0x94, 0x57, 0xc4, 0xdf, 0x55, 0x16, 0x90, 0x42, 0x39, 0x00, 0x21, 0xa9, 0x3a, 0xde, 0x57,
0x26, 0x6f, 0xd3, 0x62, 0x01, 0x14, 0x11, 0xcb, 0x9b, 0x80, 0x87, 0x9d, 0xc2, 0xe0, 0x83, 0xac,
0x45, 0x04, 0xaa, 0x54, 0x39, 0x4d, 0x16, 0xd3, 0x72, 0x81, 0x4d, 0xbe, 0x8a, 0x51, 0x7e, 0x5d,
0x63, 0x1f, 0xdb, 0x87, 0x2b, 0x10, 0xa9, 0x1f, 0xf1, 0x4b, 0x6a, 0xc8, 0x23, 0x07, 0x13, 0xdc,
0xff, 0x8d, 0xb1, 0x80, 0x58, 0x31, 0x39, 0x84, 0x14, 0xce, 0x38, 0x25, 0xce, 0x54, 0x70, 0x80,
0x07, 0xac, 0xf8, 0x11, 0xaa, 0x09, 0x08, 0xd6, 0x8e, 0x51, 0x37, 0xb1, 0x8b, 0x8d, 0x83, 0xb3,
0x33, 0x4c, 0x9c, 0x95, 0xca, 0x25, 0x9f, 0x29, 0xbf, 0x52, 0x99, 0xde, 0x6d, 0x83, 0x48, 0xc1,
0x42, 0x28, 0xfe, 0x0a, 0x42, 0xd4, 0xa4, 0xf3, 0x43, 0x0e, 0xf1, 0xbe, 0xb5, 0x37, 0x13, 0x2c,
0x28, 0x52, 0x2f, 0x08, 0x28, 0x3d, 0xde, 0x6e, 0x06, 0xab, 0x58, 0x46, 0xe0, 0x0d, 0x13, 0xe3,
0x92, 0xda, 0x10, 0xa0, 0x0f, 0x59, 0x7a, 0x0f, 0x9e, 0xff, 0xe4, 0x49, 0xad, 0x56, 0x33, 0xe3,
0x08, 0x85, 0xcd, 0x3e, 0xfa, 0x6e, 0x8c, 0x17, 0xb5, 0x95, 0x6b, 0x3c, 0x4c, 0x26, 0xd7, 0x89,
0xdb, 0x95, 0x45, 0x90, 0x39, 0x90, 0x30, 0x80, 0xa9, 0x25, 0xad, 0x78, 0x7e, 0x70, 0x6b, 0x43,
0xb7, 0xf1, 0xb2, 0xda, 0xd6, 0x0e, 0x2e, 0x6e, 0x59, 0x24, 0x65, 0xae, 0x99, 0x15, 0xbc, 0x7d,
0x90, 0x89, 0xbc, 0x67, 0x45, 0x94, 0x76, 0x7b, 0x71, 0xaa, 0x56, 0x76, 0x6e, 0xd2, 0xb6, 0x39,
0x34, 0x9b, 0x4e, 0x1d, 0x1b, 0x8f, 0x05, 0x12, 0xa5, 0x89, 0xf0, 0x3b, 0xc1, 0x75, 0x50, 0x4d,
0x3c, 0x03, 0xa6, 0x34, 0xf5, 0x3d, 0x60, 0xb8, 0x97, 0xd2, 0x97, 0x27, 0xc6, 0x14, 0xa3, 0xb1,
0x07, 0x12, 0xcf, 0xa6, 0x54, 0xce, 0x78, 0xcd, 0x5b, 0xb2, 0x4f, 0x5c, 0x70, 0x24, 0xe2, 0xb2,
0x58, 0xf9, 0xae, 0xb7, 0x44, 0x21, 0xce, 0xed, 0x25, 0xa2, 0xc6, 0x23, 0x77, 0x20, 0xe1, 0xd4,
0xc6, 0x13, 0xe1, 0xd2, 0xb2, 0x86, 0x54, 0x61, 0x1b, 0x88, 0xfb, 0x35, 0xd7, 0xda, 0x6d, 0xdd,
0x89, 0x71, 0x27, 0x3b, 0x6f, 0x99, 0xf2, 0x26, 0x72, 0x77, 0x72, 0xaa, 0xe8, 0x45, 0x4b, 0xf8,
0x63, 0x8d, 0x7d, 0x60, 0x82, 0x5b, 0x22, 0xd2, 0x47, 0xb3, 0x44, 0xb5, 0xae, 0xa5, 0x8a, 0x23,
0x5d, 0x7e, 0xb3, 0x5f, 0xd9, 0x72, 0xf4, 0xcd, 0xcc, 0x8f, 0xe0, 0xb1, 0x28, 0xfe, 0x73, 0x17,
0xe2, 0x34, 0x61, 0xd4, 0x49, 0xc6, 0x95, 0x77, 0xfe, 0x77, 0x84, 0x35, 0xc4, 0x54, 0xcd, 0x45,
0xb7, 0xb4, 0x90, 0xc1, 0x48, 0x4d, 0xfb, 0xd5, 0x34, 0x18, 0x91, 0x64, 0x7c, 0x65, 0x1b, 0xc1,
0x51, 0x09, 0x82, 0x23, 0x89, 0xe1, 0x28, 0x17, 0xf1, 0x42, 0xce, 0xef, 0x35, 0x3f, 0x4a, 0x49,
0x7e, 0x15, 0xf6, 0x54, 0xc9, 0x16, 0x76, 0x01, 0x3a, 0xa0, 0x27, 0xd1, 0xaa, 0x9e, 0x8b, 0x57,
0x0b, 0x23, 0x17, 0xc6, 0x86, 0x05, 0x6f, 0xca, 0x8f, 0xb9, 0x92, 0x4a, 0x69, 0xf7, 0xfe, 0x68,
0x0c, 0xc9, 0xc8, 0x43, 0x57, 0x88, 0xc1, 0xd0, 0x41, 0x0c, 0xdd, 0x39, 0x43, 0x2f, 0x04, 0x5f,
0xe0, 0xf3, 0x98, 0x67, 0xf6, 0x47, 0x78, 0x0e, 0x76, 0x19, 0x75, 0x1a, 0x5c, 0x4a, 0x42, 0x86,
0x95, 0x02, 0x89, 0xdc, 0xb1, 0xd3, 0x3f, 0xe9, 0xb0, 0x41, 0xa3, 0x80, 0x1a, 0x09, 0x97, 0x30,
0x0d, 0x4f, 0x78, 0xbd, 0xb1, 0xe3, 0x3a, 0xe8, 0x8a, 0x43, 0xe2, 0x5a, 0x33, 0x48, 0x10, 0xa3,
0x25, 0x8b, 0xb8, 0xcb, 0xf9, 0x15, 0x5c, 0xa1, 0xcb, 0xbd, 0x23, 0x98, 0x3a, 0xc9, 0x85, 0xd5,
0xe4, 0x9c, 0x6a, 0xbf, 0xe4, 0x08, 0x69, 0x22, 0x13, 0x74, 0x26, 0xe8, 0x07, 0xc7, 0x18, 0xa3,
0xd9, 0x37, 0x00, 0x00, 0x1b, 0xb6, 0x0b, 0x7e, 0x19, 0xd4, 0xa2, 0x52, 0xa6, 0x17, 0xd7, 0xd6,
0x03, 0x43, 0x47, 0xc4, 0x66, 0x8b, 0xc4, 0x2d, 0x31, 0x28, 0x4a, 0x24, 0x81, 0x9d, 0xb1, 0x37,
0x89, 0x93, 0x23, 0x11, 0x5c, 0xa5, 0xd9, 0x8d, 0x97, 0x91, 0xd8, 0x19, 0x82, 0xf9, 0x4e, 0x1c,
0x9b, 0x45, 0xbb, 0xc7, 0x67, 0x3e, 0x4d, 0xb4, 0x63, 0x78, 0x67, 0x44, 0x66, 0xfd, 0x32, 0x76,
0x47, 0x8e, 0x40, 0x8e, 0xa2, 0x99, 0xb9, 0xfe, 0x58, 0x24, 0x38, 0x40, 0x64, 0x3a, 0xcd, 0x65,
0x05, 0x95, 0xf2, 0xb4, 0xe0, 0xea, 0x5c, 0x86, 0xfd, 0x1d, 0xf6, 0xc0, 0x97, 0xb7, 0x22, 0xce,
0x19, 0xc1, 0x62, 0xfe, 0xc1, 0x95, 0xe1, 0x8f, 0x85, 0x15, 0x04, 0xb8, 0xd0, 0xf9, 0x7d, 0x1f,
0x92, 0x34, 0xdf, 0x3b, 0xb9, 0xa3, 0x49, 0xd9, 0x0e, 0xc8, 0x6b, 0x02, 0xde, 0x6d, 0x77, 0x49,
0xcf, 0xbf, 0x60, 0x3c, 0xbc, 0x40, 0x05, 0xc3, 0xab, 0x6c, 0x5b, 0x5e, 0x39, 0x06, 0xec, 0xfb,
0x67, 0x18, 0x92, 0xcd, 0x93, 0x4d, 0xc3, 0xab, 0xec, 0xf7, 0x0e, 0xe9, 0xcc, 0x78, 0xb9, 0x2a,
0xa7, 0xc4, 0x7b, 0xb4, 0xa0, 0x57, 0xb8, 0x6d, 0xed, 0xbb, 0x93, 0x4d, 0x89, 0x6f, 0x64, 0x46,
0x9b, 0x9b, 0x81, 0x86, 0x9e, 0x76, 0xf4, 0xa1, 0x4a, 0xcd, 0x5c, 0x26, 0x72, 0x73, 0x79, 0x57,
0xd8, 0x18, 0xa8, 0xbc, 0x71, 0x67, 0x00, 0x6a, 0xd7, 0x3d, 0xfb, 0x02, 0x69, 0xf0, 0x94, 0xba,
0x09, 0xa5, 0xeb, 0x26, 0x74, 0xc9, 0xc9, 0xa7, 0x3b, 0xf0, 0x46, 0x31, 0x23, 0x93, 0xcd, 0x8e,
0x7e, 0x02, 0x59, 0xc9, 0xf6, 0xe9, 0x1a, 0xad, 0xa3, 0x07, 0xb6, 0x2a, 0x9c, 0x0c, 0xdc, 0xde,
0xac, 0x93, 0x40, 0xfc, 0x28, 0x75, 0xee, 0xcc, 0xdf, 0x26, 0xba, 0x26, 0x1e, 0xe9, 0xe4, 0x90,
0x63, 0xfc, 0x41, 0x8a, 0x1d, 0xf8, 0xf0, 0xe0, 0xe7, 0x6e, 0xa2, 0x95, 0x6c, 0x0b, 0xaf, 0x61,
0xbc, 0xc6, 0xda, 0x31, 0xed, 0x1f, 0x4b, 0x7a, 0xbc, 0x0c, 0xd9, 0x81, 0xeb, 0x27, 0xda, 0x7f,
0xc7, 0xc1, 0xc2, 0x12, 0x59, 0xa4, 0xbd, 0xf5, 0x3e, 0xaf, 0xab, 0x43, 0x2e, 0xba, 0x92, 0x70,
0x8d, 0x4e, 0xa9, 0xb2, 0xd1, 0x36, 0x97, 0x5d, 0xf3, 0x4c, 0x55, 0x7f, 0xc4, 0xa6, 0x39, 0x6f,
0x47, 0xfc, 0xb8, 0xbb, 0x65, 0x5e, 0x39, 0xe5, 0xa9, 0x2e, 0xe8, 0x8b, 0x58, 0x47, 0xcc, 0x16,
0x17, 0x96, 0xe3, 0xa5, 0xfe, 0x0a, 0x7f, 0x2b, 0xe3, 0x95, 0x02, 0xe1, 0x7a, 0x74, 0x93, 0x55,
0x00, 0xa2, 0x54, 0xe4, 0x87, 0xbc, 0xcb, 0x33, 0x88, 0xb4, 0x63, 0xb0, 0x81, 0x95, 0xff, 0x5e,
0x8f, 0xc4, 0xc8, 0x5b, 0xa6, 0xa4, 0x62, 0xd9, 0x36, 0x0b, 0x20, 0x27, 0xa8, 0x71, 0x74, 0x3b,
0x0c, 0x3d, 0xb1, 0x8e, 0x85, 0x9b, 0xab, 0x07, 0x7f, 0xcc, 0x35, 0x9c, 0x69, 0xdd, 0x09, 0x05,
0x06, 0x10, 0xc4, 0xaf, 0xfc, 0x79, 0xc1, 0x72, 0xa5, 0xe1, 0x5a, 0xa4, 0x02, 0x86, 0x38, 0x35,
0x4b, 0x7f, 0x1b, 0x8a, 0x8b, 0x76, 0x6a, 0x81, 0xc3, 0x85, 0x8f, 0xd3, 0x10, 0x32, 0x86, 0x49,
0x1d, 0xb2, 0x1b, 0xde, 0x0c, 0x35, 0xe9, 0x1f, 0xb0, 0xe4, 0xde, 0x03, 0x45, 0xab, 0x83, 0xb7,
0x7e, 0xaf, 0x6e, 0x09, 0xd9, 0xde, 0x61, 0x5b, 0xe5, 0xed, 0x3b, 0x74, 0x78, 0x4e, 0x48, 0x1e,
0x4c, 0xb9, 0xda, 0xb6, 0xc3, 0x4a, 0xce, 0x10, 0x89, 0xb8, 0xae, 0xb8, 0x7f, 0x59, 0xee, 0xae,
0x69, 0x52, 0x3d, 0xbe, 0x49, 0x53, 0xb0, 0x97, 0xb4, 0x47, 0x53, 0x76, 0xfb, 0x5f, 0x48, 0x9a,
0xe4, 0x8f, 0x6c, 0x44, 0x3c, 0x83, 0xba, 0xc7, 0xfe, 0x37, 0x0f, 0xa4, 0xb8, 0x09, 0x3a, 0xc5,
0xf4, 0x5f, 0x94, 0x04, 0xcb, 0xa0, 0xce, 0x7b, 0x84, 0xaf, 0x85, 0x96, 0xa1, 0xd4, 0x27, 0x89,
0x35, 0x57, 0xda, 0x6c, 0xa4, 0x98, 0x67, 0x90, 0x62, 0x96, 0x3b, 0xcb, 0x45, 0x59, 0xb6, 0x99,
0x65, 0x95, 0x8a, 0x7e, 0x04, 0x4f, 0xd4, 0xa4, 0x8c, 0x38, 0x95, 0xf5, 0x1e, 0x32, 0x07, 0x09,
0x53, 0x9e, 0xc4, 0xf0, 0x76, 0x47, 0xa1, 0xba, 0x4d, 0x41, 0x2f, 0x54, 0xa5, 0x90, 0xa2, 0x8e,
0x7d, 0x1f, 0xf2, 0x7c, 0x1d, 0xcb, 0xbf, 0x28, 0xc9, 0x57, 0xa3, 0x94, 0x28, 0x46, 0xdd, 0x0f,
0xd6, 0x62, 0x61, 0x11, 0xdb, 0x0f, 0x43, 0x59, 0xfa, 0x61, 0x7a, 0x20, 0x92, 0x9f, 0x57, 0x64,
0xf4, 0x01, 0x92, 0x53, 0xa2, 0x44, 0x71, 0xe8, 0x43, 0x81, 0x83, 0xde, 0x24, 0x6d, 0x2f, 0x70,
0x02, 0x95, 0x9d, 0xd8, 0x4b, 0x84, 0xb9, 0x83, 0x02, 0xf6, 0x6a, 0x88, 0x82, 0x3f, 0xd2, 0xb3,
0x89, 0x1d, 0xff, 0x0d, 0xb3, 0x7a, 0x13, 0x0c, 0x23, 0xce, 0x71, 0x2c, 0x05, 0xf7, 0x7e, 0x53,
0x70, 0x95, 0x0d, 0xc9, 0x19, 0xe5, 0x6b, 0xf3, 0x03, 0x2a, 0xd4, 0x3d, 0xa4, 0x7e, 0x91, 0x83,
0x4c, 0x0b, 0x9d, 0x3a, 0x0b, 0xfd, 0x28, 0x9a, 0x5a, 0x13, 0xf6, 0x9a, 0x5c, 0xee, 0xdf, 0x0b,
0xdd, 0xc9, 0x10, 0x10, 0xfc, 0x8d, 0xac, 0x0d, 0xe6, 0xee, 0xcf, 0x77, 0x31, 0xf7, 0xcd, 0xdd,
0x3e, 0x73, 0x83, 0x3f, 0xb2, 0x47, 0x16, 0x11, 0xa2, 0x95, 0xed, 0x94, 0x5b, 0xcb, 0x65, 0x31,
0x44, 0xb5, 0x38, 0x63, 0xf3, 0x35, 0xc6, 0x6e, 0xdf, 0x0b, 0x53, 0x41, 0x6e, 0x26, 0x50, 0x8d,
0x83, 0xf0, 0xf8, 0xcc, 0x12, 0x25, 0x3f, 0x97, 0xbf, 0x47, 0xb6, 0xd9, 0x29, 0xb9, 0xbf, 0x7a,
0x45, 0x01, 0x77, 0x88, 0x11, 0xde, 0x71, 0x45, 0x48, 0xf0, 0xdf, 0x73, 0x67, 0xb5, 0xdb, 0x96,
0xee, 0x87, 0xaf, 0x2b, 0x7a, 0xa5, 0x84, 0x10, 0x12, 0xc1, 0x6e, 0xe7, 0xe6, 0x59, 0xe8, 0xfb,
0x8f, 0x65, 0xd9, 0xc0, 0x47, 0xcb, 0x89, 0x79, 0x63, 0x03, 0x2c, 0xad, 0xb2, 0xe7, 0x40, 0xf4,
0x7b, 0x58, 0xea, 0x3d, 0x49, 0x00, 0xbe, 0x26, 0x3c, 0x85, 0x4c, 0x81, 0x2a, 0xdb, 0xe7, 0x76,
0x46, 0x4b, 0x2f, 0x74, 0xa2, 0xb2, 0x00, 0x0a, 0x72, 0xe7, 0x77, 0x19, 0xf0, 0x27, 0x7d, 0xa0,
0x4a, 0xc2, 0x48, 0xc7, 0x17, 0xa3, 0x22, 0x9e, 0x0e, 0x2d, 0x70, 0xe8, 0x36, 0xcb, 0x99, 0xce,
0x6b, 0x47, 0x2a, 0xcf, 0xee, 0xf3, 0x87, 0x33, 0x13, 0x65, 0x7a, 0xb2, 0x69, 0xff, 0x83, 0x48,
0xac, 0x7d, 0x99, 0xe3, 0x72, 0x1b, 0x2c, 0x3b, 0x3a, 0x58, 0x7a, 0x52, 0x90, 0x6e, 0x4d, 0x8b,
0x57, 0xfc, 0xe7, 0xbb, 0x92, 0xa9, 0x57, 0x0e, 0x9c, 0xe7, 0x72, 0xad, 0x57, 0x0e, 0x14, 0xa2,
0x90, 0x5f, 0x39, 0x52, 0x88, 0x12, 0xae, 0x94, 0x9f, 0x2a, 0xe4, 0x15, 0x4b, 0x3a, 0x3d, 0x10,
0x4e, 0x76, 0x1e, 0xf2, 0x95, 0x7a, 0xe7, 0xec, 0x4e, 0xd6, 0x3b, 0x30, 0x06, 0x92, 0x75, 0x30,
0xad, 0x47, 0xa8, 0xba, 0x5c, 0x70, 0x3d, 0x50, 0x35, 0xec, 0x88, 0xa2, 0xdb, 0xf9, 0x71, 0x65,
0x33, 0x41, 0x3e, 0x1b, 0x16, 0x3d, 0x8c, 0x0c, 0x6b, 0xb0, 0xe2, 0xa7, 0x93, 0x47, 0x5c, 0xea,
0x09, 0x5f, 0xfe, 0xc4, 0xac, 0x73, 0x04, 0xc5, 0x8c, 0x2a, 0x89, 0x11, 0x0f, 0xcb, 0x94, 0xfa,
0x8a, 0xdf, 0xf8, 0x24, 0xca, 0x53, 0x68, 0x05, 0xd8, 0x8f, 0x58, 0xf8, 0x8f, 0x30, 0x58, 0xdd,
0xa3, 0xde, 0x95, 0x64, 0x88, 0xe5, 0x3e, 0x59, 0xab, 0x88, 0xe0, 0x48, 0x75, 0xcf, 0x52, 0x24,
0xe0, 0x1e, 0x1e, 0xf4, 0xdd, 0x80, 0x2e, 0x51, 0x7c, 0x5c, 0xfc, 0x12, 0xcf, 0x5d, 0xba, 0x4e,
0x15, 0xe9, 0x18, 0x42, 0x71, 0x7c, 0x16, 0xbb, 0x74, 0xec, 0x6d, 0x82, 0x4e, 0x1c, 0x8f, 0xd1,
0x48, 0xe5, 0xfc, 0x1e, 0x0a, 0x88, 0x4a, 0x26, 0xe8, 0xf7, 0xb7, 0xa3, 0x57, 0x0b, 0x22, 0x7b,
0xca, 0xab, 0x41, 0xfc, 0x45, 0x46, 0x12, 0xb3, 0x45, 0xe0, 0xe6, 0xe9, 0x57, 0xca, 0x73, 0xc3,
0x06, 0x25, 0xff, 0x7c, 0x6e, 0x48, 0x93, 0xbd, 0xf4, 0x74, 0xcb, 0xbd, 0x01, 0x85, 0x0b, 0x4f,
0x01, 0xca, 0xf2, 0x42, 0xdc, 0x23, 0xf8, 0x3f, 0xd9, 0x7c, 0xa8, 0xe3, 0x7e, 0x4a, 0xae, 0x4c,
0x16, 0xbf, 0x1b, 0x99, 0x90, 0xad, 0xe3, 0x56, 0x0c, 0xee, 0xcb, 0xe0, 0x0f, 0xc7, 0xfe, 0x0f,
0x30, 0xf6, 0xeb, 0x92, 0x48, 0x56, 0x00, 0x00
};

File diff suppressed because it is too large Load Diff

View File

@@ -265,12 +265,9 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
}
if (set < 2) stop = start + 1;
uint32_t c = gamma32(RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3]));
for (int i = start; i < stop; i++) {
if (strip.gammaCorrectCol) {
seg.setPixelColor(i, gamma8(rgbw[0]), gamma8(rgbw[1]), gamma8(rgbw[2]), gamma8(rgbw[3]));
} else {
seg.setPixelColor(i, rgbw[0], rgbw[1], rgbw[2], rgbw[3]);
}
seg.setPixelColor(i, c);
}
if (!set) start++;
set = 0;
@@ -589,8 +586,6 @@ void serializeInfo(JsonObject root)
leds["fps"] = strip.getFps();
leds[F("maxpwr")] = (strip.currentMilliamps)? strip.ablMilliampsMax : 0;
leds[F("maxseg")] = strip.getMaxSegments();
//leds[F("actseg")] = strip.getActiveSegmentsNum();
//leds[F("seglock")] = false; //might be used in the future to prevent modifications to segment config
leds[F("cpal")] = strip.customPalettes.size(); //number of custom palettes
#ifndef WLED_DISABLE_2D
@@ -617,10 +612,6 @@ void serializeInfo(JsonObject root)
leds[F("wv")] = totalLC & 0x02; // deprecated, true if white slider should be displayed for any segment
leds["cct"] = totalLC & 0x04; // deprecated, use info.leds.lc
#ifdef WLED_DISABLE_AUDIO
root[F("noaudio")] = true;
#endif
#ifdef WLED_DEBUG
JsonArray i2c = root.createNestedArray(F("i2c"));
i2c.add(i2c_sda);

View File

@@ -184,8 +184,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
turnOnAtBoot = request->hasArg(F("BO"));
t = request->arg(F("BP")).toInt();
if (t <= 250) bootPreset = t;
strip.gammaCorrectBri = request->hasArg(F("GB"));
strip.gammaCorrectCol = request->hasArg(F("GC"));
gammaCorrectBri = request->hasArg(F("GB"));
gammaCorrectCol = request->hasArg(F("GC"));
fadeTransition = request->hasArg(F("TF"));
t = request->arg(F("TD")).toInt();

View File

@@ -53,6 +53,9 @@ typedef struct ip_addr ip4_addr_t;
#define DDP_PUSH_FLAG 0x01
#define DDP_TIMECODE_FLAG 0x10
#define DDP_TYPE_RGB24 0x0A
#define DDP_TYPE_RGBW32 0x1A
#define ARTNET_OPCODE_OPDMX 0x5000
#define P_E131 0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -564,7 +564,7 @@ void setRealtimePixel(uint16_t i, byte r, byte g, byte b, byte w)
{
uint16_t pix = i + arlsOffset;
if (pix < strip.getLengthTotal()) {
if (!arlsDisableGammaCorrection && strip.gammaCorrectCol) {
if (!arlsDisableGammaCorrection && gammaCorrectCol) {
r = gamma8(r);
g = gamma8(g);
b = gamma8(b);
@@ -665,9 +665,6 @@ void sendSysInfoUDP()
#define DDP_FLAGS1_STORAGE 0x08
#define DDP_FLAGS1_TIME 0x10
#define DDP_TYPE_RGB24 0x0A
#define DDP_TYPE_RGBW32 0x1A // proposal, this is still not an official part of the DDP spec
#define DDP_ID_DISPLAY 1
#define DDP_ID_CONFIG 250
#define DDP_ID_STATUS 251
@@ -695,7 +692,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
case 0: // DDP
{
// calculate the number of UDP packets we need to send
size_t channelCount = length * 3; // 1 channel for every R,G,B value
size_t channelCount = length * (isRGBW? 4:3); // 1 channel for every R,G,B value
size_t packetCount = ((channelCount-1) / DDP_CHANNELS_PER_PACKET) +1;
// there are 3 channels per RGB pixel
@@ -727,7 +724,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
// write the header
/*0*/ddpUdp.write(flags);
/*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings)
/*2*/ddpUdp.write(0); // data type, this is not fully defined by the DDP spec and thus left at "undefined" which is assumed to be 24-bit RGB
/*2*/ddpUdp.write(isRGBW ? DDP_TYPE_RGBW32 : DDP_TYPE_RGB24);
/*3*/ddpUdp.write(DDP_ID_DISPLAY);
// data offset in bytes, 32-bit number, MSB first
/*4*/ddpUdp.write(0xFF & (channel >> 24));
@@ -744,7 +741,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // R
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // G
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // B
if (isRGBW) bufferOffset++;
if (isRGBW) ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // W
}
if (!ddpUdp.endPacket()) {

View File

@@ -133,9 +133,6 @@
#endif
#ifdef USERMOD_AUDIOREACTIVE
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
#include "../usermods/audioreactive/audio_reactive.h"
#endif
@@ -260,9 +257,6 @@ void registerUsermods()
#endif
#ifdef USERMOD_AUDIOREACTIVE
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
usermods.add(new AudioReactive());
#endif
}

View File

@@ -390,7 +390,6 @@ uint16_t crc16(const unsigned char* data_p, size_t length) {
}
#ifndef WLED_DISABLE_AUDIO
///////////////////////////////////////////////////////////////////////////////
// Begin simulateSound (to enable audio enhanced effects to display something)
///////////////////////////////////////////////////////////////////////////////
@@ -402,7 +401,6 @@ typedef enum UM_SoundSimulations {
UMS_14_3
} um_soundSimulations_t;
// this is still work in progress
um_data_t* simulateSound(uint8_t simulationId)
{
static uint8_t samplePeak;
@@ -507,7 +505,6 @@ um_data_t* simulateSound(uint8_t simulationId)
return um_data;
}
#endif
void enumerateLedmaps() {

View File

@@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2208311
#define VERSION 2209061
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG
@@ -287,9 +287,11 @@ WLED_GLOBAL byte bootPreset _INIT(0); // save preset to load
//if true, a segment per bus will be created on boot and LED settings save
//if false, only one segment spanning the total LEDs is created,
//but not on LED settings save if there is more than one segment currently
WLED_GLOBAL bool autoSegments _INIT(false);
WLED_GLOBAL bool correctWB _INIT(false); //CCT color correction of RGB color
WLED_GLOBAL bool cctFromRgb _INIT(false); //CCT is calculated from RGB instead of using seg.cct
WLED_GLOBAL bool autoSegments _INIT(false);
WLED_GLOBAL bool correctWB _INIT(false); // CCT color correction of RGB color
WLED_GLOBAL bool cctFromRgb _INIT(false); // CCT is calculated from RGB instead of using seg.cct
WLED_GLOBAL bool gammaCorrectCol _INIT(false); // use gamma correction on colors
WLED_GLOBAL bool gammaCorrectBri _INIT(false); // use gamma correction on brightness
WLED_GLOBAL byte col[] _INIT_N(({ 255, 160, 0, 0 })); // current RGB(W) primary color. col[] should be updated if you want to change the color.
WLED_GLOBAL byte colSec[] _INIT_N(({ 0, 0, 0, 0 })); // current RGB(W) secondary color

View File

@@ -140,8 +140,8 @@ void loadSettingsFromEEPROM()
ntpEnabled = EEPROM.read(327);
currentTimezone = EEPROM.read(328);
useAMPM = EEPROM.read(329);
strip.gammaCorrectBri = EEPROM.read(330);
strip.gammaCorrectCol = EEPROM.read(331);
gammaCorrectBri = EEPROM.read(330);
gammaCorrectCol = EEPROM.read(331);
overlayCurrent = EEPROM.read(332);
alexaEnabled = EEPROM.read(333);

View File

@@ -394,8 +394,8 @@ void getSettingsJS(byte subPage, char* dest)
sappend('c',SET_F("BO"),turnOnAtBoot);
sappend('v',SET_F("BP"),bootPreset);
sappend('c',SET_F("GB"),strip.gammaCorrectBri);
sappend('c',SET_F("GC"),strip.gammaCorrectCol);
sappend('c',SET_F("GB"),gammaCorrectBri);
sappend('c',SET_F("GC"),gammaCorrectCol);
sappend('c',SET_F("TF"),fadeTransition);
sappend('v',SET_F("TD"),transitionDelayDefault);
sappend('c',SET_F("PF"),strip.paletteFade);