Support for ESP-NOW Wireless Remote Control (#3237)

* Initial checkin for ESP-NOW remote feature

* cleanup irrelevant comment

* don't bring in espnow package includes when feature disabled

* Formatting and removing inaccurate call mode hardcoding

* Fork ESP Now code by platform (8266 v. esp32)

* compiled html update

* Disable ESP-NOW remote by default on ESP32 until tested

* Enable ESP-NOW remote for ESP32

* Rename ESP NOW define

---------

Co-authored-by: cschwinne <dev.aircoookie@gmail.com>
This commit is contained in:
Clayton Sims 2023-06-22 04:06:19 -04:00 committed by GitHub
parent cf48ad06ed
commit e4ee392c27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 446 additions and 159 deletions

View File

@ -443,6 +443,13 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
CJSON(retainMqttMsg, if_mqtt[F("rtn")]);
#endif
#ifndef WLED_DISABLE_ESPNOW
JsonObject remote = doc["remote"];
CJSON(enable_espnow_remote, remote[F("remote_enabled")]);
getStringFromJson(linked_remote, remote[F("linked_remote")], 13);
#endif
#ifndef WLED_DISABLE_HUESYNC
JsonObject if_hue = interfaces["hue"];
CJSON(huePollingEnabled, if_hue["en"]);
@ -895,6 +902,13 @@ void serializeConfig() {
if_mqtt_topics[F("group")] = mqttGroupTopic;
#endif
#ifndef WLED_DISABLE_ESPNOW
JsonObject remote = doc.createNestedObject(F("remote"));
remote[F("remote_enabled")] = enable_espnow_remote;
remote[F("linked_remote")] = linked_remote;
#endif
#ifndef WLED_DISABLE_HUESYNC
JsonObject if_hue = interfaces.createNestedObject("hue");
if_hue["en"] = huePollingEnabled;

View File

@ -193,6 +193,17 @@
Disable WiFi sleep: <input type="checkbox" name="WS"><br>
<i>Can help with connectivity issues.<br>
Do not enable if WiFi is working correctly, increases power consumption.</i>
<div id="remd">
<h3>Wireless Remote</h3>
<i>Listen for events over ESP-NOW<br>
Keep disabled if not using a remote, increases power consumption.<br></i>
Enable Remote: <input type="checkbox" name="RE"><br>
Hardware MAC: <input type="text" name="RMAC"><br>
Last Seen: <span class="rlid">None</span> <br>
</div>
<div id="ethd">
<h3>Ethernet Type</h3>
<select name="ETH">

View File

@ -200,12 +200,16 @@ void serializePlaylist(JsonObject obj);
void initPresetsFile();
void handlePresets();
bool applyPreset(byte index, byte callMode = CALL_MODE_DIRECT_CHANGE);
void applyPresetWithFallback(uint8_t presetID, uint8_t callMode, uint8_t effectID = 0, uint8_t paletteID = 0);
inline bool applyTemporaryPreset() {return applyPreset(255);};
void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = JsonObject());
inline void saveTemporaryPreset() {savePreset(255);};
void deletePreset(byte index);
bool getPresetName(byte index, String& name);
//remote.cpp
void handleRemote();
//set.cpp
bool isAsterisksOnly(const char* str, byte maxLen);
void handleSettingsSet(AsyncWebServerRequest *request, byte subPage);

View File

@ -8,7 +8,7 @@
// Autogenerated from wled00/data/style.css, do not edit!!
const uint16_t PAGE_settingsCss_length = 888;
const uint8_t PAGE_settingsCss[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x51, 0x8b, 0xab, 0x38,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0x51, 0x8b, 0xab, 0x38,
0x14, 0xfe, 0x2b, 0x2e, 0x65, 0x60, 0x2e, 0x54, 0x51, 0xab, 0x9d, 0xde, 0xc8, 0xc2, 0xb2, 0xef,
0xf7, 0x6d, 0x58, 0x16, 0x96, 0x79, 0x88, 0xe6, 0x58, 0x43, 0x63, 0x22, 0x49, 0xbc, 0xb5, 0x23,
0xfe, 0xf7, 0x4d, 0xa2, 0x8e, 0xb6, 0x23, 0x73, 0x5f, 0x2e, 0xa5, 0x25, 0xe6, 0xc4, 0xe4, 0x3b,
@ -70,7 +70,7 @@ const uint8_t PAGE_settingsCss[] PROGMEM = {
// Autogenerated from wled00/data/settings.htm, do not edit!!
const uint16_t PAGE_settings_length = 1115;
const uint8_t PAGE_settings[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x56, 0xdb, 0x52, 0xe3, 0x46,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x56, 0xdb, 0x52, 0xe3, 0x46,
0x10, 0x7d, 0xf7, 0x57, 0x0c, 0xb3, 0x15, 0x56, 0x2a, 0x64, 0xf9, 0x42, 0x2a, 0x95, 0xc8, 0x96,
0xa9, 0x2c, 0x97, 0x8d, 0x53, 0x50, 0x4b, 0x05, 0x58, 0x92, 0x4a, 0xf2, 0x30, 0xd6, 0xb4, 0xac,
0x59, 0xa4, 0x19, 0xd5, 0x4c, 0xcb, 0xe0, 0xb0, 0xfc, 0x7b, 0x7a, 0x64, 0x63, 0x60, 0xe1, 0x21,
@ -144,157 +144,165 @@ const uint8_t PAGE_settings[] PROGMEM = {
// Autogenerated from wled00/data/settings_wifi.htm, do not edit!!
const uint16_t PAGE_settings_wifi_length = 2269;
const uint16_t PAGE_settings_wifi_length = 2387;
const uint8_t PAGE_settings_wifi[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x58, 0x6d, 0x73, 0xdb, 0xb8,
0x11, 0xfe, 0xae, 0x5f, 0x01, 0xa3, 0x1d, 0x0f, 0x39, 0xa6, 0x29, 0xc9, 0x4a, 0x72, 0xa9, 0x2c,
0x2a, 0xf5, 0x8b, 0x2e, 0x76, 0xeb, 0x73, 0xd4, 0xca, 0xbd, 0x4c, 0x27, 0xcd, 0xdc, 0xd1, 0xe4,
0x4a, 0x42, 0x4c, 0x01, 0x2c, 0x01, 0x4a, 0xf6, 0xd8, 0xfe, 0xef, 0xdd, 0x05, 0x48, 0xbd, 0xd9,
0x4e, 0x3b, 0x19, 0x77, 0x32, 0x49, 0x48, 0x60, 0xb1, 0xfb, 0xec, 0xdb, 0x83, 0xa5, 0x7a, 0x3b,
0xa7, 0x9f, 0x4e, 0xae, 0xfe, 0x39, 0x1c, 0xb0, 0xa9, 0x99, 0x65, 0xfd, 0x1e, 0xfd, 0xcb, 0xb2,
0x58, 0x4e, 0x22, 0x0e, 0x92, 0xe3, 0x3b, 0xc4, 0x69, 0xbf, 0x37, 0x03, 0x13, 0xb3, 0x64, 0x1a,
0x17, 0x1a, 0x4c, 0xc4, 0x4b, 0x33, 0xde, 0x7f, 0xcf, 0xab, 0xd5, 0x86, 0x8c, 0x67, 0x10, 0xf1,
0xb9, 0x80, 0x45, 0xae, 0x0a, 0xc3, 0x59, 0xa2, 0xa4, 0x01, 0x89, 0x62, 0x0b, 0x91, 0x9a, 0x69,
0xf4, 0xb6, 0xd5, 0x5a, 0x8a, 0x6e, 0x6d, 0xa5, 0x30, 0x17, 0x09, 0xec, 0xdb, 0x97, 0x40, 0x48,
0x61, 0x44, 0x9c, 0xed, 0xeb, 0x24, 0xce, 0x20, 0x6a, 0x07, 0xb3, 0xf8, 0x56, 0xcc, 0xca, 0xd9,
0xf2, 0xbd, 0xd4, 0x50, 0xd8, 0x97, 0xf8, 0x1a, 0xdf, 0xa5, 0xe2, 0x4f, 0x2c, 0xf7, 0x7b, 0x46,
0x98, 0x0c, 0xfa, 0x9f, 0xc5, 0xcf, 0x82, 0x8d, 0xc0, 0x18, 0x21, 0x27, 0xba, 0xd7, 0x74, 0x8b,
0x3d, 0x9d, 0x14, 0x22, 0x37, 0xfd, 0xc6, 0x3c, 0x2e, 0x58, 0xa6, 0x12, 0x91, 0x07, 0x69, 0x94,
0xaa, 0xa4, 0x9c, 0x21, 0xa0, 0x00, 0x17, 0xa2, 0x9d, 0x36, 0xfd, 0x97, 0x17, 0xca, 0xa8, 0x88,
0x4f, 0x8d, 0xc9, 0xbb, 0x3c, 0x40, 0x7b, 0xf2, 0x42, 0xa9, 0x5c, 0x47, 0xad, 0x20, 0x2f, 0x60,
0x84, 0xaf, 0xa3, 0xd1, 0xf9, 0x69, 0xc4, 0xf9, 0xe1, 0xb8, 0x94, 0x89, 0x11, 0x4a, 0xb2, 0xc9,
0x79, 0xea, 0x19, 0xff, 0xbe, 0x00, 0x53, 0x16, 0x92, 0xa5, 0xe1, 0x04, 0xcc, 0x20, 0x03, 0x52,
0x7b, 0x7c, 0x67, 0xb7, 0x1e, 0x97, 0xa2, 0xc9, 0x60, 0x43, 0x32, 0x29, 0x20, 0x36, 0x50, 0x09,
0x6f, 0x08, 0x9e, 0x79, 0xfe, 0xfd, 0x42, 0xc8, 0x54, 0x2d, 0x42, 0x95, 0x83, 0xf4, 0x2c, 0x1e,
0xdd, 0x6d, 0x36, 0x6f, 0xa4, 0x0a, 0x17, 0x19, 0x90, 0x95, 0xe6, 0x18, 0x4f, 0x97, 0x05, 0xe8,
0xa6, 0xae, 0x7c, 0x6d, 0xfe, 0x61, 0x21, 0xc6, 0x62, 0xbf, 0x7e, 0xe5, 0x6b, 0x0a, 0x8f, 0xb7,
0x14, 0x22, 0xc8, 0x7f, 0xfc, 0xfd, 0xc2, 0xe3, 0xcd, 0x95, 0x70, 0xc0, 0x7f, 0xd3, 0x90, 0x8d,
0xd7, 0x4f, 0x5d, 0xe2, 0x29, 0xcc, 0x99, 0x36, 0xcc, 0x44, 0xe4, 0x26, 0xa7, 0x78, 0x70, 0xff,
0xd0, 0x84, 0xa9, 0xd0, 0x94, 0x87, 0x34, 0xda, 0x69, 0x05, 0x26, 0x34, 0x70, 0x6b, 0x4e, 0xea,
0xdc, 0x52, 0x90, 0x24, 0xaa, 0x0c, 0xc3, 0x90, 0x07, 0x63, 0x30, 0xc9, 0x74, 0x65, 0xed, 0x9b,
0x56, 0xb2, 0x29, 0xc1, 0x70, 0xdf, 0x0f, 0xcd, 0x14, 0x71, 0x98, 0xa8, 0x6f, 0x42, 0x5a, 0xf5,
0xd6, 0x56, 0x3e, 0x5d, 0x7f, 0x83, 0xc4, 0x84, 0xb1, 0xd6, 0x62, 0x22, 0xbd, 0xfb, 0xc7, 0xe0,
0x1e, 0x8f, 0x2c, 0x54, 0x71, 0xa3, 0xbb, 0x5f, 0xbe, 0x3e, 0x06, 0xc6, 0x0f, 0xeb, 0xf7, 0x50,
0x63, 0xe2, 0x3d, 0xcf, 0x04, 0xe0, 0x47, 0x7d, 0x08, 0x0b, 0x3c, 0xb1, 0x6f, 0xec, 0x7f, 0x7e,
0x58, 0x40, 0x5a, 0x26, 0x50, 0x6f, 0x7a, 0x06, 0x65, 0x67, 0xe0, 0x0c, 0xe2, 0x7e, 0x1a, 0x45,
0x11, 0xd8, 0x07, 0xff, 0xe1, 0xc1, 0x84, 0x79, 0xa9, 0xa7, 0x1e, 0xf8, 0xa8, 0x3b, 0xf8, 0xf2,
0xb5, 0x86, 0x02, 0x51, 0xff, 0x5e, 0x8c, 0xbd, 0x96, 0x15, 0xcd, 0x40, 0x4e, 0xcc, 0x74, 0x77,
0x77, 0x59, 0x12, 0xbd, 0x76, 0xcb, 0xaf, 0x52, 0xb9, 0x5c, 0xdb, 0xdb, 0x0b, 0xe6, 0x4a, 0xa4,
0x0c, 0xa3, 0x7a, 0x25, 0x66, 0xa0, 0x4a, 0xe3, 0x5d, 0x06, 0x6d, 0xe8, 0xf8, 0x87, 0x6b, 0x95,
0x74, 0x98, 0x81, 0x61, 0xd2, 0x05, 0xf4, 0x64, 0x84, 0xe1, 0x44, 0x1b, 0xd2, 0xbf, 0xa7, 0x55,
0x13, 0x61, 0x89, 0x70, 0x4c, 0x03, 0xfa, 0x6f, 0xe3, 0x8c, 0x8a, 0x8e, 0x8c, 0x29, 0xc4, 0x75,
0x69, 0xc0, 0xe3, 0x22, 0xe5, 0x81, 0x3d, 0x12, 0x6c, 0xef, 0x50, 0x2b, 0xbc, 0xb4, 0xa7, 0x24,
0x76, 0xae, 0x9c, 0xd0, 0xfe, 0x95, 0xe7, 0xa3, 0xc0, 0x7a, 0x25, 0xcb, 0x70, 0x1e, 0x67, 0x25,
0x1c, 0x8e, 0x55, 0xe1, 0x11, 0x02, 0x40, 0x7c, 0xd0, 0x33, 0x61, 0x32, 0x15, 0x59, 0x5a, 0x80,
0xac, 0xfc, 0x3e, 0x84, 0xbd, 0x3d, 0x1f, 0x23, 0x0b, 0x33, 0x35, 0x87, 0x13, 0xda, 0xf3, 0x56,
0x32, 0x5f, 0xe0, 0xab, 0xbf, 0x54, 0xa0, 0x50, 0x81, 0xea, 0xd5, 0xf1, 0x3a, 0x54, 0x78, 0xae,
0xaa, 0x21, 0x61, 0x9d, 0x53, 0x39, 0x95, 0x16, 0x79, 0xbd, 0x05, 0xd3, 0xe2, 0xe0, 0x01, 0x7c,
0x51, 0x5f, 0x5d, 0x5e, 0x02, 0xb1, 0x51, 0x58, 0xbf, 0xff, 0xf1, 0x7e, 0xb9, 0xf7, 0xc8, 0xbc,
0xea, 0x8d, 0x72, 0xfd, 0xc8, 0xd2, 0xe3, 0x99, 0xff, 0xfb, 0xea, 0x28, 0x26, 0xac, 0xf2, 0x6b,
0x77, 0x77, 0xdb, 0x8c, 0x0b, 0x2e, 0x50, 0x24, 0x97, 0x8f, 0x14, 0xb3, 0x38, 0xc7, 0xbe, 0x48,
0x9d, 0x6b, 0xc2, 0x7f, 0x74, 0x90, 0xd5, 0x26, 0x64, 0xf5, 0x3c, 0x64, 0xbe, 0x73, 0x42, 0xfd,
0xa3, 0x36, 0xfb, 0xe0, 0x13, 0xd6, 0x50, 0xc1, 0xaa, 0x4a, 0xb5, 0xcd, 0xb0, 0x69, 0x44, 0xf9,
0x81, 0xc4, 0x80, 0xe6, 0x59, 0x9c, 0xc0, 0x67, 0x61, 0xa6, 0x44, 0x00, 0xeb, 0x8d, 0xd5, 0x7e,
0xae, 0xb1, 0xf8, 0xe3, 0x5a, 0x7b, 0x62, 0x36, 0xab, 0xaa, 0xd9, 0xa8, 0xa5, 0x1d, 0xf3, 0xf0,
0x60, 0x21, 0xed, 0x44, 0xc6, 0x45, 0xa1, 0xaa, 0xd3, 0x43, 0x97, 0x60, 0x72, 0x49, 0xc8, 0xbc,
0xa4, 0x0a, 0x83, 0xd0, 0xdc, 0xe5, 0x48, 0xa2, 0x64, 0x08, 0x63, 0x1f, 0x62, 0xec, 0x48, 0x0f,
0x3e, 0x39, 0x72, 0x75, 0xcf, 0x9b, 0x5e, 0x23, 0x33, 0xbb, 0xe4, 0xf2, 0xa0, 0x73, 0xe0, 0xe3,
0xb6, 0xb5, 0x11, 0xad, 0x55, 0x55, 0x60, 0x36, 0x1c, 0x83, 0x35, 0xcc, 0x99, 0x8a, 0xd3, 0xbf,
0x8c, 0xa8, 0x29, 0x91, 0x3a, 0x1c, 0x7c, 0xe9, 0x8a, 0xde, 0xf2, 0x33, 0x42, 0x92, 0xdb, 0x09,
0x2b, 0x12, 0x4e, 0x7d, 0xb9, 0xbd, 0x4e, 0xc0, 0x31, 0xf6, 0x84, 0xbc, 0xf9, 0x2d, 0x9e, 0xc7,
0xb5, 0x82, 0x27, 0x82, 0xb1, 0xbe, 0x93, 0xa8, 0x02, 0xbb, 0x3b, 0x0d, 0xaf, 0x55, 0x7a, 0xb7,
0x91, 0x05, 0x49, 0xf2, 0x71, 0x9a, 0x0e, 0xe6, 0x18, 0xe3, 0x0b, 0xa1, 0x31, 0xd4, 0x50, 0x78,
0x9c, 0x60, 0xf2, 0xc0, 0x43, 0xe2, 0xb8, 0xff, 0x08, 0xe6, 0x57, 0xcf, 0x7f, 0x7c, 0x5e, 0x0e,
0x8a, 0x42, 0x15, 0x08, 0x0f, 0xe5, 0xa8, 0x62, 0x54, 0x86, 0x85, 0xaf, 0x26, 0x1e, 0x1f, 0xd0,
0x3a, 0xab, 0xfc, 0x45, 0x32, 0x64, 0x63, 0x91, 0x81, 0x75, 0x03, 0x6f, 0x33, 0xa4, 0x2c, 0x7e,
0x51, 0xad, 0xab, 0x31, 0x5d, 0x98, 0x63, 0x31, 0x29, 0x8b, 0xd8, 0x06, 0xc8, 0xb9, 0xc1, 0xc6,
0xb1, 0x20, 0x9a, 0xff, 0x97, 0x3c, 0x97, 0x89, 0x9a, 0xe5, 0x18, 0x27, 0x60, 0x79, 0x3c, 0x01,
0x96, 0xc6, 0x26, 0xde, 0x41, 0x92, 0x5e, 0x8b, 0xe9, 0x68, 0x59, 0x07, 0x15, 0xc5, 0xe3, 0x3d,
0x66, 0x95, 0x51, 0x35, 0x70, 0xb2, 0xdc, 0xe5, 0x11, 0xd6, 0x82, 0xbd, 0xdb, 0x12, 0x95, 0xf9,
0xf6, 0xba, 0x6b, 0x05, 0x9e, 0xbd, 0x07, 0x23, 0x92, 0xce, 0x46, 0x46, 0x15, 0xa8, 0x9e, 0x6e,
0xaf, 0x73, 0x03, 0x33, 0x8a, 0x40, 0x72, 0x9e, 0x23, 0x4f, 0x3f, 0x3c, 0x54, 0x62, 0x78, 0x7a,
0x96, 0x23, 0xf2, 0x9f, 0x51, 0x1f, 0xfb, 0x45, 0xa5, 0x10, 0xb2, 0x61, 0x06, 0xb1, 0x06, 0x86,
0x11, 0xc1, 0x4a, 0xff, 0x7c, 0x31, 0x38, 0x65, 0xe7, 0x43, 0xc4, 0x16, 0x6c, 0x68, 0xd4, 0x9b,
0x1a, 0x03, 0xab, 0xcd, 0xc7, 0xd2, 0xcb, 0x34, 0xdc, 0xbb, 0x8a, 0x44, 0x68, 0xb1, 0x99, 0x52,
0xc5, 0x05, 0x92, 0x58, 0x39, 0xc3, 0xb1, 0xc0, 0x6b, 0x63, 0x65, 0x61, 0x9a, 0xb4, 0x2d, 0x21,
0xde, 0xe4, 0xfe, 0x87, 0xfd, 0x76, 0xd7, 0xb2, 0x6b, 0xcb, 0x0f, 0x75, 0x9e, 0x09, 0x63, 0x57,
0x0f, 0x6b, 0x8a, 0xea, 0x1f, 0xec, 0xee, 0x7a, 0xcb, 0x1b, 0x7c, 0xe5, 0x6d, 0x50, 0x79, 0xeb,
0xbc, 0x30, 0xe1, 0x54, 0x69, 0x43, 0xa6, 0xf6, 0x90, 0xc1, 0x68, 0x6e, 0xf8, 0xc0, 0xbb, 0x7c,
0xcf, 0x3d, 0x76, 0x39, 0xf7, 0xf7, 0x50, 0xe9, 0x9e, 0xfc, 0xd2, 0xfa, 0xea, 0x3f, 0x56, 0xb5,
0xfa, 0xe4, 0xae, 0x6c, 0x6a, 0xbc, 0xb2, 0x3e, 0xe4, 0x51, 0x1b, 0x5d, 0xdd, 0x69, 0x5b, 0x77,
0xd1, 0x74, 0x1a, 0x8e, 0xc6, 0x61, 0x6c, 0x33, 0x12, 0x3d, 0x3d, 0x42, 0x37, 0x33, 0x46, 0x73,
0x95, 0xb4, 0x4a, 0x64, 0x39, 0x0f, 0x10, 0xf4, 0x0f, 0x35, 0x7c, 0x04, 0x81, 0x28, 0x2c, 0x62,
0x8b, 0xc9, 0x3c, 0x36, 0x7a, 0xcd, 0x6a, 0x82, 0xe9, 0x69, 0x73, 0x87, 0x03, 0xcd, 0x9f, 0xc5,
0x8c, 0x20, 0xb3, 0xb2, 0xc8, 0xb0, 0x47, 0x68, 0x29, 0x4c, 0x34, 0xd2, 0xd0, 0x21, 0x0a, 0x5a,
0x81, 0x5e, 0xd3, 0xcd, 0x6e, 0x54, 0xf2, 0x58, 0x89, 0xe4, 0x0c, 0x72, 0x08, 0x5e, 0x00, 0xfd,
0x1e, 0x72, 0xf5, 0xac, 0xc1, 0xa8, 0xd7, 0xe9, 0xe9, 0x37, 0xcd, 0x99, 0xeb, 0xf6, 0xd1, 0x98,
0x33, 0x9c, 0xd4, 0xa6, 0x0a, 0x77, 0x72, 0x0c, 0x13, 0x8a, 0xa6, 0x62, 0xce, 0x92, 0x0c, 0xaf,
0x62, 0xe4, 0x08, 0x85, 0xd8, 0x16, 0x9b, 0x6b, 0x53, 0xc8, 0xf2, 0x63, 0xde, 0x6f, 0xf4, 0xb0,
0xd5, 0x0c, 0x7a, 0xe5, 0xd8, 0xc4, 0xbd, 0x70, 0xb4, 0x9a, 0x60, 0x2a, 0x6f, 0x22, 0x7e, 0x46,
0x66, 0x3f, 0xf4, 0x9a, 0x6e, 0x03, 0xa1, 0xa1, 0x8a, 0xfe, 0xf3, 0x67, 0x1a, 0xcb, 0x43, 0xc7,
0x74, 0xe8, 0x38, 0x4e, 0x6e, 0x56, 0xe7, 0x36, 0x4e, 0xe8, 0xf2, 0x7a, 0x26, 0x10, 0xe3, 0x28,
0x9e, 0x03, 0xdb, 0x65, 0xc8, 0x93, 0x12, 0xe9, 0x7c, 0x25, 0x3c, 0x2d, 0x10, 0x97, 0xb3, 0x34,
0x3d, 0x70, 0x53, 0x21, 0xa6, 0xa3, 0xcc, 0x31, 0x30, 0x07, 0xb8, 0xd4, 0xe9, 0x57, 0x27, 0x98,
0x51, 0x0c, 0x6e, 0xb1, 0xa5, 0xa9, 0x1f, 0x2b, 0xbe, 0x46, 0x99, 0xce, 0xd2, 0x5c, 0x63, 0x13,
0x21, 0xc5, 0xcd, 0x0e, 0x42, 0x2b, 0xff, 0x2e, 0x09, 0x2a, 0xb1, 0xdf, 0x1a, 0x54, 0xb4, 0x7e,
0xe9, 0x94, 0xd9, 0xe8, 0x32, 0xcf, 0x32, 0x23, 0x03, 0x6c, 0xa2, 0x3b, 0x32, 0x29, 0x95, 0xa1,
0xd6, 0x27, 0x04, 0x7e, 0x97, 0xc4, 0x7b, 0x96, 0x94, 0xd9, 0x1a, 0x21, 0xb3, 0x8a, 0x8e, 0xeb,
0x51, 0x97, 0x1e, 0x97, 0xec, 0x1b, 0xf1, 0xce, 0x01, 0xb7, 0x76, 0x6a, 0x33, 0x39, 0xa6, 0x04,
0x1f, 0xd2, 0xa7, 0xda, 0xea, 0x9d, 0x95, 0xa6, 0xe1, 0x86, 0xa6, 0x77, 0x1d, 0xa7, 0x69, 0x64,
0x90, 0x37, 0x12, 0xec, 0x62, 0x86, 0x77, 0x39, 0x85, 0x35, 0x36, 0xac, 0x15, 0xda, 0x3f, 0x0c,
0x4b, 0x85, 0x9d, 0x9e, 0x9d, 0x0c, 0x37, 0xc0, 0x56, 0xea, 0xce, 0x5b, 0xbc, 0xb2, 0x24, 0xcb,
0xd9, 0x35, 0x14, 0xbc, 0xae, 0x0f, 0x2c, 0xad, 0x99, 0x90, 0x11, 0x6f, 0x59, 0x73, 0x11, 0x3f,
0x78, 0xfb, 0x96, 0xb3, 0x02, 0xfe, 0x5d, 0x0a, 0x1c, 0xcf, 0xfa, 0x2c, 0x64, 0x5b, 0x7a, 0xda,
0xaf, 0xa4, 0xe7, 0xe0, 0x95, 0xf4, 0x74, 0x7e, 0x48, 0xcf, 0x5a, 0x28, 0x27, 0x38, 0xe1, 0x2f,
0xe2, 0xbb, 0x6e, 0x63, 0x2d, 0x68, 0x4e, 0xf7, 0xc7, 0x1f, 0x8e, 0x59, 0x63, 0x53, 0xcf, 0x2b,
0xc5, 0xec, 0xe3, 0x2b, 0xc5, 0xec, 0xe3, 0x8f, 0xc7, 0xac, 0x51, 0x05, 0x0d, 0x3b, 0x1b, 0xfb,
0x10, 0xa5, 0xf4, 0x4d, 0xf7, 0x49, 0xdc, 0x46, 0xff, 0x43, 0xdc, 0x1a, 0xdf, 0x05, 0x5a, 0xe9,
0x69, 0xbf, 0x92, 0x9e, 0x83, 0x57, 0xd2, 0xd3, 0xf9, 0x31, 0x3d, 0x14, 0xa0, 0xd9, 0xe9, 0xe5,
0x88, 0xe1, 0x74, 0x82, 0x5f, 0x83, 0xba, 0x6e, 0x5d, 0x47, 0x34, 0xd4, 0xb5, 0x52, 0x31, 0x12,
0x70, 0x8d, 0x6b, 0xbf, 0x6c, 0x9b, 0xcd, 0xca, 0x76, 0x63, 0x83, 0x6e, 0x2a, 0x6e, 0xf8, 0xe5,
0x09, 0xcb, 0x30, 0x3b, 0x52, 0x64, 0x74, 0xfe, 0x24, 0x13, 0x78, 0xdf, 0x23, 0x45, 0x74, 0x59,
0x4f, 0xe7, 0xb1, 0x5c, 0xa2, 0x14, 0x39, 0xde, 0x03, 0x97, 0x2b, 0x52, 0x83, 0x14, 0x6f, 0x22,
0x14, 0xb0, 0x00, 0x2b, 0xba, 0xb5, 0x73, 0x0e, 0xb0, 0xa3, 0x24, 0x21, 0xa0, 0x43, 0x25, 0xa4,
0xb1, 0x4c, 0xdb, 0x38, 0x1a, 0x32, 0xa2, 0xc7, 0x67, 0xb1, 0x1f, 0x0d, 0x5f, 0xe4, 0x47, 0x07,
0xf8, 0xe8, 0x29, 0x2d, 0xda, 0x76, 0x3b, 0x13, 0x29, 0xda, 0x1a, 0x5a, 0xa9, 0x2e, 0xdb, 0x38,
0x9e, 0x4c, 0x21, 0xb9, 0xb9, 0x56, 0xb7, 0x4b, 0x15, 0x67, 0x8e, 0x00, 0x09, 0x48, 0x4d, 0x96,
0x4f, 0xc1, 0xd0, 0xa7, 0xb3, 0xff, 0x3d, 0x76, 0xad, 0x94, 0x0d, 0x5d, 0xa6, 0xd6, 0xd8, 0x15,
0x95, 0x1a, 0x1c, 0x92, 0x30, 0x8b, 0x5e, 0x78, 0xff, 0x3e, 0x78, 0xd7, 0x79, 0xf4, 0x1f, 0xf0,
0xce, 0x60, 0xf6, 0xc7, 0x89, 0x88, 0x0f, 0xac, 0x09, 0xb4, 0x80, 0x89, 0x0e, 0xd9, 0x7b, 0xfb,
0x53, 0x0b, 0x8e, 0x12, 0x50, 0xe8, 0x1a, 0xd6, 0x5a, 0xc4, 0x98, 0xbd, 0xca, 0xe8, 0x9b, 0x4e,
0x42, 0xd6, 0xdd, 0x2c, 0xa2, 0xa3, 0x93, 0x17, 0x8a, 0xe8, 0xb6, 0xae, 0xa2, 0x76, 0x5d, 0x45,
0xed, 0xce, 0x56, 0x11, 0xa1, 0xeb, 0xe4, 0xa0, 0xa6, 0xc4, 0xda, 0x2f, 0xa3, 0x5a, 0x27, 0x5e,
0xf0, 0x3d, 0xf7, 0x0d, 0xc4, 0xdc, 0xa8, 0x8f, 0xa5, 0x48, 0xa9, 0xae, 0x33, 0x4d, 0x1b, 0xf1,
0x98, 0x66, 0xc0, 0x6b, 0xa5, 0x30, 0xa1, 0x4e, 0x76, 0xfb, 0x4c, 0x9b, 0xf7, 0x4f, 0x85, 0x5e,
0x2b, 0x8e, 0x2d, 0xb1, 0x46, 0x25, 0x87, 0xd9, 0x3b, 0xca, 0x90, 0x32, 0xf5, 0x4b, 0x8a, 0xf0,
0xae, 0xba, 0x84, 0x39, 0x5a, 0xf3, 0xe8, 0x0a, 0x2d, 0x00, 0xe7, 0xe3, 0x19, 0x0e, 0x8a, 0x90,
0xfa, 0xcb, 0x13, 0x34, 0x2d, 0x59, 0x17, 0x6a, 0xc7, 0x9e, 0x2f, 0x57, 0xaa, 0x56, 0x9a, 0xd8,
0xe6, 0xb0, 0x55, 0xaa, 0x83, 0xdb, 0x1c, 0x0a, 0x41, 0x3f, 0xcb, 0x60, 0xd1, 0xdb, 0x02, 0x3d,
0x75, 0xdf, 0x65, 0x2e, 0xf6, 0x3a, 0x03, 0xc8, 0xff, 0x4b, 0x45, 0x7d, 0x1e, 0xb9, 0xd4, 0xf5,
0x44, 0xbf, 0x71, 0x82, 0x76, 0x69, 0x52, 0x62, 0x0b, 0x9c, 0x65, 0x97, 0x51, 0x9b, 0x0b, 0xcc,
0xb9, 0xd0, 0xba, 0x04, 0x1d, 0xda, 0x24, 0x9f, 0xba, 0xa1, 0x00, 0xa4, 0xb5, 0x24, 0xc6, 0xce,
0x98, 0xd0, 0x8c, 0x6e, 0x77, 0x1a, 0x4e, 0x12, 0x55, 0xa0, 0xbb, 0x26, 0xbb, 0x0b, 0x98, 0x90,
0xf4, 0xeb, 0x91, 0x06, 0xcd, 0x72, 0xb5, 0xc0, 0x58, 0xd0, 0xd7, 0x47, 0x39, 0xb3, 0xde, 0x87,
0xbd, 0xa6, 0xb0, 0x43, 0x9a, 0x1b, 0xf1, 0x70, 0x9e, 0x4b, 0xb9, 0xf3, 0x8a, 0xbe, 0x48, 0x89,
0x58, 0xaf, 0x10, 0xb1, 0x9b, 0x70, 0x36, 0x12, 0x3d, 0xb8, 0x3a, 0x7b, 0x2e, 0xd3, 0x97, 0x4a,
0x42, 0xe3, 0xa5, 0x64, 0xfc, 0x09, 0xb3, 0x75, 0x7c, 0xb2, 0xe3, 0xa6, 0xff, 0x5f, 0xdf, 0x74,
0x70, 0x10, 0xa3, 0xef, 0x15, 0xa4, 0x71, 0xf4, 0xe1, 0xa5, 0x43, 0xd4, 0xa0, 0x83, 0xd1, 0xb0,
0x73, 0xb0, 0x3f, 0xfc, 0x34, 0x78, 0x49, 0xe8, 0x1d, 0xef, 0x5b, 0x99, 0x53, 0x28, 0x6f, 0x5f,
0x92, 0xf9, 0x89, 0xf7, 0xff, 0x7a, 0x7e, 0xb5, 0xff, 0xeb, 0xe0, 0x45, 0x7c, 0xef, 0x79, 0xff,
0x6f, 0xa5, 0x90, 0x88, 0x6e, 0xff, 0x54, 0x4c, 0xf6, 0x3f, 0x25, 0x26, 0x46, 0x88, 0x57, 0xfb,
0xe8, 0xeb, 0xb3, 0xc6, 0xeb, 0x2a, 0x7c, 0xb3, 0x3a, 0x67, 0x51, 0xbc, 0x58, 0xd5, 0x18, 0xa0,
0x11, 0x14, 0x93, 0x9f, 0xde, 0x90, 0xca, 0x67, 0xe4, 0x6a, 0x85, 0x6f, 0x79, 0xff, 0x6a, 0x21,
0x32, 0x31, 0x99, 0x9a, 0x0b, 0xe4, 0x8a, 0xef, 0x6b, 0xc5, 0x12, 0xff, 0xfc, 0xbc, 0x40, 0x63,
0xd5, 0x4d, 0x9f, 0xaf, 0x30, 0x80, 0x68, 0xb4, 0xd5, 0x5e, 0x49, 0xad, 0x97, 0xbd, 0xfd, 0x5b,
0xcd, 0xbf, 0xc5, 0xff, 0x7d, 0xda, 0x6e, 0xd2, 0xa7, 0x04, 0x35, 0x1e, 0x7d, 0x6f, 0xd0, 0xc7,
0x07, 0xfd, 0x9c, 0xfc, 0x1f, 0x82, 0xf2, 0xab, 0x04, 0x5e, 0x16, 0x00, 0x00
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x58, 0xff, 0x53, 0xdb, 0x3a,
0x12, 0xff, 0x3d, 0x7f, 0x85, 0xd0, 0xdd, 0x30, 0xf6, 0xe0, 0x38, 0x09, 0x69, 0xfb, 0x7a, 0x21,
0x4e, 0x0f, 0x42, 0x5e, 0xe1, 0x1e, 0x85, 0x5c, 0xc3, 0x95, 0xb9, 0xe1, 0x3a, 0xef, 0x19, 0x5b,
0x49, 0x54, 0x1c, 0xc9, 0xcf, 0x92, 0x13, 0x18, 0xc8, 0xff, 0x7e, 0xbb, 0x92, 0x9d, 0xc4, 0x01,
0xda, 0x9b, 0x0e, 0x37, 0x9d, 0x29, 0xb6, 0xb5, 0xda, 0xfd, 0xec, 0xb7, 0x8f, 0x56, 0xe9, 0xee,
0x1c, 0x5f, 0xf4, 0x2f, 0xff, 0x3d, 0x1c, 0x90, 0xa9, 0x9e, 0x25, 0xbd, 0x2e, 0xfe, 0x4f, 0x92,
0x50, 0x4c, 0x02, 0xca, 0x04, 0x85, 0x77, 0x16, 0xc6, 0xbd, 0xee, 0x8c, 0xe9, 0x90, 0x44, 0xd3,
0x30, 0x53, 0x4c, 0x07, 0x34, 0xd7, 0xe3, 0xfa, 0x7b, 0x5a, 0x7c, 0xad, 0x89, 0x70, 0xc6, 0x02,
0x3a, 0xe7, 0x6c, 0x91, 0xca, 0x4c, 0x53, 0x12, 0x49, 0xa1, 0x99, 0x00, 0xb1, 0x05, 0x8f, 0xf5,
0x34, 0x78, 0xdb, 0x6c, 0xae, 0x44, 0xb7, 0x96, 0x62, 0x36, 0xe7, 0x11, 0xab, 0x9b, 0x17, 0x8f,
0x0b, 0xae, 0x79, 0x98, 0xd4, 0x55, 0x14, 0x26, 0x2c, 0x68, 0x79, 0xb3, 0xf0, 0x8e, 0xcf, 0xf2,
0xd9, 0xea, 0x3d, 0x57, 0x2c, 0x33, 0x2f, 0xe1, 0x0d, 0xbc, 0x0b, 0x49, 0x9f, 0x58, 0xee, 0x75,
0x35, 0xd7, 0x09, 0xeb, 0x5d, 0xf1, 0x5f, 0x39, 0x19, 0x31, 0xad, 0xb9, 0x98, 0xa8, 0x6e, 0xc3,
0x7e, 0xec, 0xaa, 0x28, 0xe3, 0xa9, 0xee, 0xd5, 0xe6, 0x61, 0x46, 0x12, 0x19, 0xf1, 0xd4, 0x8b,
0x83, 0x58, 0x46, 0xf9, 0x0c, 0x00, 0x79, 0xf0, 0x21, 0xd8, 0x69, 0xe1, 0x9f, 0x34, 0x93, 0x5a,
0x06, 0x74, 0xaa, 0x75, 0xda, 0xa1, 0x1e, 0xd8, 0x13, 0x67, 0x52, 0xa6, 0x2a, 0x68, 0x7a, 0x69,
0xc6, 0x46, 0xf0, 0x3a, 0x1a, 0x9d, 0x1e, 0x07, 0x94, 0x1e, 0x8c, 0x73, 0x11, 0x69, 0x2e, 0x05,
0x99, 0x9c, 0xc6, 0x8e, 0x76, 0x1f, 0x32, 0xa6, 0xf3, 0x4c, 0x90, 0xd8, 0x9f, 0x30, 0x3d, 0x48,
0x18, 0xaa, 0x3d, 0xba, 0x37, 0x4b, 0xcb, 0x95, 0x68, 0x34, 0xa8, 0x48, 0x46, 0x19, 0x0b, 0x35,
0x2b, 0x84, 0x2b, 0x82, 0x27, 0x8e, 0xfb, 0xb0, 0xe0, 0x22, 0x96, 0x0b, 0x5f, 0xa6, 0x4c, 0x38,
0x06, 0x8f, 0xea, 0x34, 0x1a, 0xb7, 0x42, 0xfa, 0x8b, 0x84, 0xa1, 0x95, 0xc6, 0x18, 0x76, 0xe7,
0x19, 0x53, 0x0d, 0x55, 0xf8, 0xda, 0xf8, 0xcb, 0x82, 0x8f, 0x79, 0xbd, 0x7c, 0xa5, 0x1b, 0x0a,
0x8f, 0xb6, 0x14, 0x02, 0xc8, 0x7f, 0x7d, 0x3e, 0x73, 0x68, 0x63, 0x2d, 0xec, 0xd1, 0xdf, 0x15,
0x4b, 0xc6, 0x9b, 0xbb, 0xce, 0x61, 0x17, 0xe4, 0x4c, 0x69, 0xa2, 0x03, 0x74, 0x93, 0x62, 0x3c,
0xa8, 0x7b, 0xa0, 0xfd, 0x98, 0x2b, 0xcc, 0x43, 0x1c, 0xec, 0x34, 0x3d, 0xed, 0x6b, 0x76, 0xa7,
0xfb, 0x65, 0x6e, 0x31, 0x48, 0x02, 0x54, 0xfa, 0xbe, 0x4f, 0xbd, 0x31, 0xd3, 0xd1, 0x74, 0x6d,
0xed, 0x9b, 0x92, 0xa2, 0x21, 0x98, 0xa6, 0xae, 0xeb, 0xeb, 0x29, 0xe0, 0xd0, 0x41, 0x4f, 0xfb,
0xf8, 0xd5, 0xd9, 0xf8, 0x72, 0x71, 0xf3, 0x8d, 0x45, 0xda, 0x0f, 0x95, 0xe2, 0x13, 0xe1, 0x3c,
0x2c, 0xbd, 0x07, 0xd8, 0xb2, 0x90, 0xd9, 0xad, 0xea, 0x5c, 0x7f, 0x5d, 0x7a, 0xda, 0xf5, 0xcb,
0x77, 0x5f, 0x41, 0xe2, 0x1d, 0x47, 0x7b, 0xcc, 0x0d, 0x7a, 0xcc, 0xcf, 0x60, 0x47, 0x5d, 0x9b,
0x3f, 0xae, 0x9f, 0xb1, 0x38, 0x8f, 0x58, 0xb9, 0xe8, 0x68, 0x90, 0x9d, 0x31, 0x6b, 0x10, 0xd6,
0xe3, 0x20, 0x08, 0x98, 0x79, 0x70, 0x1f, 0x1f, 0xb5, 0x9f, 0xe6, 0x6a, 0xea, 0x30, 0x17, 0x74,
0x7b, 0xd7, 0x5f, 0x4b, 0x28, 0x2c, 0xe8, 0x3d, 0xf0, 0xb1, 0xd3, 0x34, 0xa2, 0x09, 0x13, 0x13,
0x3d, 0xdd, 0xdd, 0x5d, 0x95, 0x44, 0xb7, 0xd5, 0x74, 0x8b, 0x54, 0xae, 0xbe, 0xed, 0xed, 0x79,
0x73, 0xc9, 0x63, 0x02, 0x51, 0xbd, 0xe4, 0x33, 0x26, 0x73, 0xed, 0x9c, 0x7b, 0x2d, 0xd6, 0x76,
0x0f, 0x36, 0x2a, 0xe9, 0x20, 0x61, 0x9a, 0x08, 0x1b, 0xd0, 0xfe, 0x08, 0xc2, 0x09, 0x36, 0x84,
0xfb, 0x80, 0x5f, 0x75, 0x00, 0x25, 0x42, 0x21, 0x0d, 0xe0, 0xbf, 0x89, 0x33, 0x28, 0x3a, 0xd4,
0x3a, 0xe3, 0x37, 0xb9, 0x66, 0x0e, 0xe5, 0x31, 0xf5, 0xcc, 0x16, 0x6f, 0x7b, 0x05, 0x5b, 0xe1,
0xa5, 0x35, 0x29, 0xa0, 0x73, 0xc5, 0x04, 0xd7, 0x2f, 0x1d, 0x17, 0x04, 0x36, 0x2b, 0x59, 0xf8,
0xf3, 0x30, 0xc9, 0xd9, 0xc1, 0x58, 0x66, 0x0e, 0x22, 0x60, 0x80, 0x8f, 0x75, 0xb5, 0x1f, 0x4d,
0x79, 0x12, 0x67, 0x4c, 0x14, 0x7e, 0x1f, 0xb0, 0xbd, 0x3d, 0x17, 0x22, 0xcb, 0x66, 0x72, 0xce,
0xfa, 0xb8, 0xe6, 0xac, 0x65, 0xae, 0xd9, 0x57, 0x77, 0xa5, 0x40, 0x82, 0x02, 0xd9, 0x2d, 0xe3,
0x75, 0x20, 0x61, 0x5f, 0x51, 0x43, 0xdc, 0x38, 0x27, 0x53, 0x2c, 0x2d, 0xf4, 0x7a, 0x0b, 0xa6,
0xc1, 0x41, 0x3d, 0x76, 0x2d, 0xbf, 0xda, 0xbc, 0x78, 0xbc, 0x52, 0x58, 0x7f, 0xfc, 0xf5, 0x61,
0xb5, 0xb6, 0x24, 0x4e, 0xf1, 0x86, 0xb9, 0x5e, 0x92, 0xf8, 0x68, 0xe6, 0xfe, 0xb1, 0xde, 0x0a,
0x09, 0x2b, 0xfc, 0xda, 0xdd, 0xdd, 0x36, 0x63, 0x83, 0xcb, 0x30, 0x92, 0xab, 0x47, 0x8c, 0x59,
0x98, 0x42, 0x5f, 0xc4, 0xd6, 0x35, 0xee, 0x2e, 0x2d, 0x64, 0x59, 0x85, 0x2c, 0x9f, 0x87, 0x4c,
0x77, 0xfa, 0xd8, 0x3f, 0xb2, 0xda, 0x07, 0x17, 0x50, 0x43, 0x19, 0x29, 0x2a, 0xd5, 0x34, 0x43,
0xd5, 0x88, 0x74, 0x3d, 0x01, 0x01, 0x4d, 0x93, 0x30, 0x62, 0x57, 0x5c, 0x4f, 0x91, 0x00, 0x36,
0x1b, 0xab, 0xf5, 0x5c, 0x63, 0xd1, 0xe5, 0x46, 0x7b, 0x42, 0x36, 0x8b, 0xaa, 0xa9, 0xd4, 0xd2,
0x8e, 0x7e, 0x7c, 0x34, 0x90, 0x76, 0x02, 0x6d, 0xa3, 0x50, 0xd4, 0xe9, 0x81, 0x4d, 0x30, 0xba,
0xc4, 0x45, 0x9a, 0x63, 0x85, 0x31, 0x5f, 0xdf, 0xa7, 0x40, 0xa2, 0x68, 0x08, 0x62, 0xef, 0x43,
0xec, 0x50, 0x0f, 0x3c, 0x59, 0x72, 0xb5, 0xcf, 0x55, 0xaf, 0x81, 0x99, 0x6d, 0x72, 0xa9, 0xd7,
0xde, 0x77, 0x61, 0xd9, 0xd8, 0x08, 0x36, 0xaa, 0xca, 0xd3, 0x15, 0xc7, 0xd8, 0x06, 0xe6, 0x44,
0x86, 0xf1, 0x3f, 0x46, 0xd8, 0x94, 0x40, 0x1d, 0x16, 0xbe, 0xb0, 0x45, 0x6f, 0xf8, 0x19, 0x20,
0x89, 0xed, 0x84, 0x65, 0x11, 0xc5, 0xbe, 0xdc, 0xfe, 0x8e, 0xc0, 0x21, 0xf6, 0x88, 0xbc, 0xf1,
0x2d, 0x9c, 0x87, 0xa5, 0x82, 0x27, 0x82, 0xa1, 0xba, 0x17, 0xa0, 0x02, 0xba, 0x3b, 0xf6, 0x6f,
0x64, 0x7c, 0x5f, 0xc9, 0x82, 0x40, 0xf9, 0x30, 0x8e, 0x07, 0x73, 0x88, 0xf1, 0x19, 0x57, 0x10,
0x6a, 0x96, 0x39, 0x14, 0x61, 0x52, 0xcf, 0x01, 0xe2, 0x78, 0xf8, 0xc8, 0xf4, 0x17, 0xc7, 0x5d,
0x3e, 0x2f, 0xc7, 0xb2, 0x4c, 0x66, 0x00, 0x0f, 0xe4, 0xb0, 0x62, 0x64, 0x02, 0x85, 0x2f, 0x27,
0x0e, 0x1d, 0xe0, 0x77, 0x52, 0xf8, 0x0b, 0x64, 0x48, 0xc6, 0x3c, 0x61, 0xc6, 0x0d, 0x38, 0xcd,
0x80, 0xb2, 0xe8, 0x59, 0xf1, 0x5d, 0x8e, 0xf1, 0xc0, 0x1c, 0xf3, 0x49, 0x9e, 0x85, 0x26, 0x40,
0xd6, 0x0d, 0x32, 0x0e, 0x39, 0xd2, 0xfc, 0x7f, 0xc4, 0xa9, 0x88, 0xe4, 0x2c, 0x85, 0x38, 0x31,
0x92, 0x86, 0x13, 0x46, 0xe2, 0x50, 0x87, 0x3b, 0x40, 0xd2, 0x1b, 0x31, 0x1d, 0xad, 0xea, 0xa0,
0xa0, 0x78, 0x38, 0xc7, 0x8c, 0x32, 0xac, 0x06, 0x8a, 0x96, 0x3b, 0x34, 0x80, 0x5a, 0x30, 0x67,
0x5b, 0x24, 0x13, 0xd7, 0x1c, 0x77, 0x4d, 0xcf, 0x31, 0xe7, 0x60, 0x80, 0xd2, 0xc9, 0x48, 0xcb,
0x0c, 0xd4, 0xe3, 0xe9, 0x75, 0xaa, 0xd9, 0x0c, 0x23, 0x10, 0x9d, 0xa6, 0xc0, 0xd3, 0x8f, 0x8f,
0x85, 0x18, 0xec, 0x9e, 0xa5, 0x80, 0xfc, 0x57, 0xd0, 0x47, 0x3e, 0xc9, 0x98, 0xf9, 0x64, 0x98,
0xb0, 0x50, 0x31, 0x02, 0x11, 0x81, 0x4a, 0xbf, 0x3a, 0x1b, 0x1c, 0x93, 0xd3, 0x21, 0x60, 0xf3,
0x2a, 0x1a, 0x55, 0x55, 0xa3, 0x67, 0xb4, 0xb9, 0x50, 0x7a, 0x89, 0x62, 0x0f, 0xb6, 0x22, 0x01,
0x5a, 0xa8, 0xa7, 0x58, 0x71, 0x9e, 0x40, 0x56, 0x4e, 0x60, 0x2c, 0x70, 0x5a, 0x50, 0x59, 0x90,
0x26, 0x65, 0x4a, 0x88, 0x36, 0xa8, 0xfb, 0xa1, 0xde, 0xea, 0x18, 0x76, 0x6d, 0xba, 0xbe, 0x4a,
0x13, 0xae, 0xcd, 0xd7, 0x83, 0x92, 0xa2, 0x7a, 0xfb, 0xbb, 0xbb, 0xce, 0xea, 0x04, 0x5f, 0x7b,
0xeb, 0x15, 0xde, 0x5a, 0x2f, 0xb4, 0x3f, 0x95, 0x4a, 0xa3, 0xa9, 0x3d, 0x60, 0x30, 0x9c, 0x1b,
0x3e, 0xd0, 0x0e, 0xdd, 0xb3, 0x8f, 0x1d, 0x4a, 0xdd, 0x3d, 0x50, 0xba, 0x27, 0xae, 0x9b, 0x5f,
0xdd, 0x65, 0x51, 0xab, 0x4f, 0xce, 0xca, 0x86, 0x82, 0x23, 0xeb, 0x43, 0x1a, 0xb4, 0xc0, 0xd5,
0x9d, 0x96, 0x71, 0x17, 0x4c, 0xc7, 0xfe, 0x68, 0xec, 0x87, 0x26, 0x23, 0xc1, 0xd3, 0x2d, 0x78,
0x32, 0x43, 0x34, 0xd7, 0x49, 0x2b, 0x44, 0x56, 0xf3, 0x00, 0x42, 0xff, 0x50, 0xc2, 0x07, 0x10,
0x80, 0xc2, 0x20, 0x36, 0x98, 0xf4, 0xb2, 0xd6, 0x6d, 0x14, 0x13, 0x4c, 0x57, 0xe9, 0x7b, 0x18,
0x68, 0xfe, 0xce, 0x67, 0x08, 0x99, 0xe4, 0x59, 0x02, 0x3d, 0x82, 0x9f, 0xfc, 0x48, 0x01, 0x0d,
0x1d, 0x80, 0xa0, 0x11, 0xe8, 0x36, 0xec, 0xec, 0x86, 0x25, 0x0f, 0x95, 0x88, 0xce, 0x00, 0x87,
0xc0, 0x01, 0xd0, 0xeb, 0x02, 0x57, 0xcf, 0x6a, 0x04, 0x7b, 0x1d, 0x9f, 0x7e, 0x57, 0x94, 0xd8,
0x6e, 0x1f, 0x8d, 0x29, 0x81, 0x49, 0x6d, 0x2a, 0x61, 0x25, 0x85, 0x30, 0x81, 0x68, 0xcc, 0xe7,
0x24, 0x4a, 0xe0, 0x28, 0x06, 0x8e, 0x90, 0x80, 0x6d, 0x51, 0xfd, 0x36, 0x65, 0x49, 0x7a, 0x44,
0x7b, 0xb5, 0x2e, 0xb4, 0x9a, 0x06, 0xaf, 0x2c, 0x9b, 0xd8, 0x17, 0x0a, 0x56, 0x23, 0x48, 0xe5,
0x6d, 0x40, 0x4f, 0xd0, 0xec, 0x87, 0x6e, 0xc3, 0x2e, 0x00, 0x34, 0x50, 0xd1, 0x7b, 0x7e, 0x4f,
0x6d, 0xb5, 0xe9, 0x08, 0x37, 0x1d, 0x85, 0xd1, 0xed, 0x7a, 0x5f, 0x65, 0x87, 0xca, 0x6f, 0x66,
0x1c, 0x30, 0x8e, 0xc2, 0x39, 0x23, 0xbb, 0x04, 0x78, 0x52, 0x00, 0x9d, 0xaf, 0x85, 0xa7, 0x19,
0xe0, 0xb2, 0x96, 0xa6, 0xfb, 0x76, 0x2a, 0x84, 0x74, 0xe4, 0x29, 0x04, 0x66, 0x1f, 0x3e, 0xb5,
0x7b, 0xc5, 0x0e, 0xa2, 0x25, 0x61, 0x77, 0xd0, 0xd2, 0xd8, 0x8f, 0x05, 0x5f, 0x83, 0x4c, 0x7b,
0x65, 0xae, 0x56, 0x45, 0x88, 0x71, 0x33, 0x83, 0xd0, 0xda, 0xbf, 0x73, 0x84, 0x8a, 0xec, 0xb7,
0x01, 0x15, 0xac, 0x9f, 0x5b, 0x65, 0x26, 0xba, 0xc4, 0x31, 0xcc, 0x48, 0x18, 0x34, 0xd1, 0x3d,
0x9a, 0x14, 0x52, 0x63, 0xeb, 0x23, 0x02, 0xb7, 0x83, 0xe2, 0x5d, 0x43, 0xca, 0x64, 0x83, 0x90,
0x49, 0x41, 0xc7, 0xe5, 0xa8, 0x8b, 0x8f, 0x2b, 0xf6, 0x0d, 0x68, 0x7b, 0x9f, 0x1a, 0x3b, 0xa5,
0x99, 0x14, 0x52, 0x02, 0x0f, 0xf1, 0x53, 0x6d, 0xe5, 0xca, 0x5a, 0xd3, 0xb0, 0xa2, 0xe9, 0x5d,
0xdb, 0x6a, 0x1a, 0x69, 0xe0, 0x8d, 0x08, 0xba, 0x98, 0xc0, 0x59, 0x8e, 0x61, 0x0d, 0x35, 0x69,
0xfa, 0xe6, 0x1f, 0x81, 0x52, 0x21, 0xc7, 0x27, 0xfd, 0x61, 0x05, 0x6c, 0xa1, 0xee, 0xb4, 0x49,
0x0b, 0x4b, 0x22, 0x9f, 0xdd, 0xb0, 0x8c, 0x96, 0xf5, 0x01, 0xa5, 0x35, 0xe3, 0x22, 0xa0, 0x4d,
0x63, 0x2e, 0xa0, 0xfb, 0x6f, 0xdf, 0x52, 0x92, 0xb1, 0x3f, 0x73, 0x0e, 0xe3, 0x59, 0x8f, 0xf8,
0x64, 0x4b, 0x4f, 0xeb, 0x95, 0xf4, 0xec, 0xbf, 0x92, 0x9e, 0xf6, 0x4f, 0xe9, 0xd9, 0x08, 0xe5,
0x04, 0x26, 0xfc, 0x45, 0x78, 0xdf, 0xa9, 0x6d, 0x04, 0xcd, 0xea, 0xfe, 0xf8, 0xd3, 0x31, 0xab,
0x55, 0xf5, 0xbc, 0x52, 0xcc, 0x3e, 0xbe, 0x52, 0xcc, 0x3e, 0xfe, 0x7c, 0xcc, 0x6a, 0x45, 0xd0,
0xa0, 0xb3, 0xa1, 0x0f, 0x41, 0x4a, 0xdd, 0x76, 0x9e, 0xc4, 0x6d, 0xf4, 0x3f, 0xc4, 0xad, 0xf6,
0x5d, 0xa0, 0x85, 0x9e, 0xd6, 0x2b, 0xe9, 0xd9, 0x7f, 0x25, 0x3d, 0xed, 0x9f, 0xd3, 0x83, 0x01,
0x9a, 0x1d, 0x9f, 0x8f, 0x08, 0x4c, 0x27, 0x70, 0x1b, 0x54, 0x65, 0xeb, 0x5a, 0xa2, 0xc1, 0xae,
0x15, 0x92, 0xa0, 0x80, 0x6d, 0x5c, 0x73, 0xb3, 0x6d, 0x34, 0x0a, 0xdb, 0xb5, 0x0a, 0xdd, 0x14,
0xdc, 0xf0, 0xe9, 0x09, 0xcb, 0x10, 0x33, 0x52, 0x24, 0xb8, 0xbf, 0x9f, 0x70, 0x38, 0xef, 0x81,
0x22, 0x3a, 0xa4, 0xab, 0xd2, 0x50, 0xac, 0x50, 0xf2, 0x14, 0xce, 0x81, 0xf3, 0x35, 0xa9, 0xb1,
0x18, 0x4e, 0x22, 0x10, 0x30, 0x00, 0x0b, 0xba, 0x35, 0x73, 0x0e, 0x23, 0x87, 0x51, 0x84, 0x40,
0x87, 0x92, 0x0b, 0x6d, 0x98, 0xb6, 0x76, 0x38, 0x24, 0x48, 0x8f, 0xcf, 0x62, 0x3f, 0x1c, 0xbe,
0xc8, 0x8f, 0x16, 0xf0, 0xe1, 0x53, 0x5a, 0x34, 0xed, 0x76, 0xc2, 0x63, 0xb0, 0x35, 0x34, 0x52,
0x1d, 0x52, 0xd9, 0x1e, 0x4d, 0x59, 0x74, 0x7b, 0x23, 0xef, 0x56, 0x2a, 0x4e, 0x2c, 0x01, 0x22,
0x90, 0x92, 0x2c, 0x9f, 0x82, 0xc1, 0xab, 0xb3, 0xfb, 0x3d, 0x76, 0x2d, 0x94, 0x0d, 0x6d, 0xa6,
0x36, 0xd8, 0x15, 0x94, 0x6a, 0x18, 0x92, 0x20, 0x8b, 0x8e, 0xff, 0xf0, 0xde, 0x7b, 0xd7, 0x5e,
0xba, 0x8f, 0x70, 0x66, 0x10, 0xf3, 0xe3, 0x44, 0x40, 0x07, 0xc6, 0x04, 0x58, 0x80, 0x44, 0xfb,
0xe4, 0xbd, 0xf9, 0xa9, 0x05, 0x46, 0x09, 0x96, 0xa9, 0x12, 0xd6, 0x46, 0xc4, 0x88, 0x39, 0xca,
0xf0, 0x4e, 0x27, 0x58, 0xd2, 0xa9, 0x16, 0xd1, 0x61, 0xff, 0x85, 0x22, 0xba, 0x2b, 0xab, 0xa8,
0x55, 0x56, 0x51, 0xab, 0xbd, 0x55, 0x44, 0xe0, 0x3a, 0x3a, 0xa8, 0x30, 0xb1, 0xe6, 0x66, 0x54,
0xea, 0x84, 0x03, 0xbe, 0x6b, 0xef, 0x40, 0xc4, 0x8e, 0xfa, 0x50, 0x8a, 0x98, 0xea, 0x32, 0xd3,
0xb8, 0x10, 0x8e, 0x71, 0x06, 0xbc, 0x91, 0x12, 0x12, 0x6a, 0x65, 0xb7, 0xf7, 0xb4, 0x68, 0xef,
0x98, 0xab, 0x8d, 0xe2, 0xd8, 0x12, 0xab, 0x15, 0x72, 0x90, 0xbd, 0xc3, 0x04, 0x28, 0x53, 0xbd,
0xa4, 0x08, 0xce, 0xaa, 0x73, 0x36, 0x07, 0x6b, 0x0e, 0x1e, 0xa1, 0x19, 0x83, 0xf9, 0x78, 0x06,
0x83, 0x22, 0x8b, 0xdd, 0xd5, 0x0e, 0x9c, 0x96, 0x8c, 0x0b, 0xa5, 0x63, 0xcf, 0x97, 0x2b, 0x56,
0x2b, 0x4e, 0x6c, 0x73, 0xb6, 0x55, 0xaa, 0x83, 0xbb, 0x94, 0x65, 0x1c, 0x7f, 0x96, 0x81, 0xa2,
0x37, 0x05, 0x7a, 0x6c, 0xef, 0x65, 0x36, 0xf6, 0x2a, 0x61, 0x2c, 0xfd, 0x41, 0x45, 0x5d, 0x8d,
0x6c, 0xea, 0xba, 0xbc, 0x57, 0xeb, 0x83, 0x5d, 0x9c, 0x94, 0xc8, 0x02, 0x66, 0xd9, 0x55, 0xd4,
0xe6, 0x1c, 0x72, 0xce, 0x95, 0xca, 0x99, 0xf2, 0x4d, 0x92, 0x8f, 0xed, 0x50, 0xc0, 0x84, 0xb1,
0xc4, 0xc7, 0xd6, 0x18, 0x57, 0x04, 0x4f, 0x77, 0x1c, 0x4e, 0x22, 0x99, 0x81, 0xbb, 0x3a, 0xb9,
0xf7, 0x08, 0x17, 0xf8, 0xeb, 0x91, 0x62, 0x8a, 0xa4, 0x72, 0x01, 0xb1, 0xc0, 0xdb, 0x47, 0x3e,
0x33, 0xde, 0xfb, 0xdd, 0x06, 0x37, 0x43, 0x9a, 0x1d, 0xf1, 0xe0, 0xce, 0x1e, 0x53, 0xe3, 0xd5,
0x15, 0xa4, 0x3a, 0xc1, 0x32, 0xfa, 0x0c, 0xd7, 0x78, 0xcd, 0xec, 0x8c, 0xc3, 0x7b, 0xf6, 0x36,
0x63, 0x0a, 0x9c, 0xe1, 0xed, 0x46, 0x11, 0x89, 0xd1, 0x1d, 0x8c, 0x86, 0xf5, 0xf3, 0x8b, 0x2b,
0x83, 0xec, 0x37, 0xf0, 0x97, 0x94, 0x57, 0x53, 0x44, 0x86, 0x38, 0x73, 0x85, 0x98, 0x42, 0x92,
0x19, 0x6d, 0x3f, 0x80, 0x84, 0x91, 0x00, 0x58, 0xb5, 0x81, 0x75, 0xce, 0x22, 0xf8, 0x41, 0x08,
0x3f, 0x0f, 0x6c, 0x08, 0x4f, 0xc2, 0x2c, 0x5e, 0x84, 0xc0, 0x1b, 0x9f, 0x0e, 0xfb, 0xab, 0x2d,
0xb5, 0xa7, 0x3c, 0xf0, 0x19, 0xd6, 0xed, 0x8e, 0xb3, 0x10, 0x2e, 0xef, 0x23, 0xc6, 0xc4, 0x56,
0xd6, 0xb3, 0x84, 0xc7, 0x98, 0x76, 0x51, 0x49, 0xb8, 0x99, 0x11, 0x6b, 0x66, 0xac, 0xc5, 0x80,
0xc1, 0x00, 0x5c, 0x04, 0x6c, 0x80, 0x57, 0x78, 0x3c, 0x89, 0x2e, 0xc1, 0x96, 0x0d, 0x57, 0xa5,
0x33, 0x06, 0x97, 0x27, 0xcf, 0xb5, 0x06, 0xea, 0xaf, 0xbd, 0x54, 0xbd, 0x7f, 0x83, 0xf2, 0x3e,
0xea, 0xef, 0xd8, 0xeb, 0xd2, 0x97, 0x37, 0x6d, 0x98, 0x5c, 0xf1, 0x82, 0x07, 0xe7, 0x1e, 0xc4,
0xe5, 0xa5, 0x4d, 0xc8, 0x68, 0x90, 0x8f, 0xf6, 0x7e, 0x7d, 0x78, 0x31, 0x78, 0x49, 0xe8, 0x1d,
0xed, 0x19, 0x99, 0x63, 0x96, 0xdf, 0xbd, 0x24, 0xf3, 0x0b, 0xed, 0xfd, 0x76, 0x7a, 0x59, 0xff,
0x32, 0x78, 0x11, 0xdf, 0x7b, 0xda, 0xfb, 0x67, 0xce, 0x05, 0xa0, 0xab, 0x1f, 0xf3, 0x49, 0xfd,
0x22, 0xd2, 0x21, 0x40, 0xbc, 0xac, 0x83, 0xaf, 0xcf, 0x1a, 0x2f, 0xdb, 0xf6, 0xcd, 0x7a, 0x9f,
0x41, 0xf1, 0x22, 0x0d, 0x40, 0x80, 0x46, 0x2c, 0x9b, 0xfc, 0xf2, 0x06, 0x55, 0x3e, 0x23, 0x57,
0x2a, 0x7c, 0x4b, 0x7b, 0x97, 0x0b, 0x9e, 0xf0, 0xc9, 0x54, 0x9f, 0x01, 0xb9, 0x7e, 0x5f, 0x2b,
0x70, 0xc2, 0xd5, 0xf3, 0x02, 0xb5, 0x35, 0xfd, 0x5c, 0x5d, 0x42, 0x00, 0xc1, 0x68, 0xb3, 0xb5,
0x96, 0xda, 0xe4, 0x89, 0x75, 0x31, 0xe0, 0xdd, 0xe1, 0xff, 0x7d, 0x3d, 0x69, 0xe0, 0xdd, 0x0b,
0x99, 0x0a, 0x2f, 0x68, 0x78, 0x5b, 0xc3, 0xdf, 0xdf, 0xff, 0x0b, 0x68, 0xad, 0xac, 0xd2, 0x8f,
0x17, 0x00, 0x00
};
// Autogenerated from wled00/data/settings_leds.htm, do not edit!!
const uint16_t PAGE_settings_leds_length = 8389;
const uint8_t PAGE_settings_leds[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x7d, 0xeb, 0x76, 0xdb, 0x38,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x7d, 0xeb, 0x76, 0xdb, 0x38,
0xd2, 0xe0, 0x7f, 0x3d, 0x05, 0x8d, 0xee, 0x76, 0xc8, 0x16, 0x25, 0x91, 0xb2, 0x95, 0x76, 0x24,
0x51, 0x5e, 0x5f, 0x92, 0xb4, 0xbf, 0xb1, 0x63, 0x1f, 0xdb, 0xe9, 0xcc, 0x77, 0xd2, 0xd9, 0x0e,
0x44, 0x41, 0x12, 0x63, 0x8a, 0xd4, 0x90, 0x94, 0x2f, 0x6b, 0x7b, 0x9f, 0x69, 0x9f, 0x61, 0x9f,
@ -825,7 +833,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = {
// Autogenerated from wled00/data/settings_dmx.htm, do not edit!!
const uint16_t PAGE_settings_dmx_length = 1751;
const uint8_t PAGE_settings_dmx[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0x5b, 0x73, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x57, 0x5b, 0x73, 0xdb, 0x36,
0x16, 0x7e, 0xd7, 0xaf, 0x40, 0xf0, 0x50, 0x93, 0x63, 0x86, 0x94, 0x9c, 0x55, 0xb7, 0x91, 0x44,
0x7a, 0x63, 0xc7, 0x6b, 0x7b, 0xc7, 0x76, 0x3d, 0x51, 0xd2, 0x74, 0xa7, 0xe9, 0x74, 0x20, 0x12,
0x12, 0x51, 0x93, 0x04, 0x17, 0x00, 0x25, 0xbb, 0x69, 0xfe, 0xfb, 0x7e, 0x00, 0xa9, 0x8b, 0x6f,
@ -941,7 +949,7 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = {
// Autogenerated from wled00/data/settings_ui.htm, do not edit!!
const uint16_t PAGE_settings_ui_length = 3327;
const uint8_t PAGE_settings_ui[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x5a, 0x6b, 0x73, 0xdb, 0xb8,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x5a, 0x6b, 0x73, 0xdb, 0xb8,
0x15, 0xfd, 0xae, 0x5f, 0x81, 0x60, 0x77, 0xbc, 0xe2, 0x98, 0xa1, 0xe5, 0x6c, 0x3b, 0x4d, 0x24,
0x51, 0x6e, 0xe2, 0x64, 0x37, 0xee, 0x78, 0x37, 0x69, 0xe4, 0x74, 0xdb, 0x49, 0x33, 0x5e, 0x88,
0x84, 0x24, 0x6c, 0x28, 0x82, 0x25, 0x40, 0x3f, 0xaa, 0xd5, 0x7f, 0xef, 0xb9, 0x00, 0x29, 0x51,
@ -1155,7 +1163,7 @@ const uint8_t PAGE_settings_ui[] PROGMEM = {
// Autogenerated from wled00/data/settings_sync.htm, do not edit!!
const uint16_t PAGE_settings_sync_length = 3474;
const uint8_t PAGE_settings_sync[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x1a, 0x6b, 0x53, 0xdb, 0x48,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x1a, 0x6b, 0x53, 0xdb, 0x48,
0xf2, 0xbb, 0x7e, 0xc5, 0x44, 0x57, 0x95, 0xb5, 0x17, 0xe3, 0x07, 0x60, 0x42, 0xc0, 0x52, 0x0e,
0x30, 0x01, 0xdf, 0x41, 0xe2, 0xd8, 0xb0, 0xc9, 0xd6, 0xdd, 0xd5, 0xd6, 0x58, 0x1a, 0xdb, 0x03,
0x92, 0x46, 0xab, 0x19, 0xf1, 0xa8, 0x6c, 0xfe, 0xfb, 0x75, 0xcf, 0x48, 0xb2, 0x2d, 0xfc, 0xca,
@ -1379,7 +1387,7 @@ const uint8_t PAGE_settings_sync[] PROGMEM = {
// Autogenerated from wled00/data/settings_time.htm, do not edit!!
const uint16_t PAGE_settings_time_length = 3444;
const uint8_t PAGE_settings_time[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38,
0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x18, 0x7b, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0x6c, 0x08,
0x69, 0xa1, 0x4d, 0x02, 0xa7, 0x49, 0x87, 0xdd, 0x3e, 0xce, 0x54, 0x89, 0x95, 0xc4, 0xe0, 0x48,
0x59, 0x5b, 0x26, 0xb0, 0x94, 0xff, 0xbe, 0x57, 0x92, 0xe3, 0x3c, 0x0d, 0x6d, 0x67, 0xf6, 0xc3,
@ -1601,7 +1609,7 @@ const uint8_t PAGE_settings_time[] PROGMEM = {
// Autogenerated from wled00/data/settings_sec.htm, do not edit!!
const uint16_t PAGE_settings_sec_length = 2563;
const uint8_t PAGE_settings_sec[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x58, 0x6d, 0x73, 0xdb, 0xb8,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x58, 0x6d, 0x73, 0xdb, 0xb8,
0x11, 0xfe, 0xae, 0x5f, 0x01, 0xe1, 0x66, 0x72, 0x64, 0x43, 0x53, 0xb2, 0x93, 0xde, 0xe4, 0x6c,
0x51, 0xae, 0x1d, 0x3b, 0x8d, 0x3b, 0x76, 0xec, 0xb1, 0xe4, 0x4b, 0x3b, 0x69, 0x26, 0x43, 0x91,
0x90, 0x88, 0x88, 0x22, 0x78, 0x00, 0x68, 0x45, 0xcd, 0xe5, 0xbf, 0xf7, 0x59, 0x90, 0xd4, 0x8b,
@ -1768,7 +1776,7 @@ const uint8_t PAGE_settings_sec[] PROGMEM = {
// Autogenerated from wled00/data/settings_um.htm, do not edit!!
const uint16_t PAGE_settings_um_length = 3306;
const uint8_t PAGE_settings_um[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6d, 0x73, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x59, 0x6d, 0x73, 0xdb, 0x36,
0x12, 0xfe, 0xee, 0x5f, 0x41, 0xa3, 0x19, 0x99, 0x1c, 0xd1, 0x94, 0x9c, 0xb6, 0x33, 0x39, 0x49,
0x94, 0x2e, 0x76, 0xdc, 0x46, 0x97, 0x17, 0x7b, 0xe2, 0xa4, 0x99, 0x1b, 0xc7, 0x17, 0x53, 0x22,
0x24, 0x21, 0xa6, 0x08, 0x96, 0x00, 0xed, 0xf8, 0x64, 0xfd, 0xf7, 0x7b, 0x16, 0x20, 0x29, 0xca,
@ -1981,7 +1989,7 @@ const uint8_t PAGE_settings_um[] PROGMEM = {
// Autogenerated from wled00/data/settings_2D.htm, do not edit!!
const uint16_t PAGE_settings_2D_length = 3296;
const uint8_t PAGE_settings_2D[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xc5, 0x5a, 0x5b, 0x77, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xc5, 0x5a, 0x5b, 0x77, 0xdb, 0x36,
0x12, 0x7e, 0xd7, 0xaf, 0x80, 0xb1, 0x5d, 0x97, 0xb4, 0xa8, 0x9b, 0x9b, 0xf4, 0xb4, 0x92, 0x28,
0x35, 0x8e, 0xd3, 0xd8, 0x7b, 0xec, 0x44, 0xc7, 0x72, 0xed, 0xe4, 0xb4, 0x3d, 0x0d, 0x4d, 0x42,
0x12, 0x12, 0x0a, 0x60, 0x09, 0xd0, 0x97, 0x3a, 0xfe, 0xef, 0x3b, 0x03, 0xf0, 0xa6, 0x8b, 0x9d,
@ -2193,7 +2201,7 @@ const uint8_t PAGE_settings_2D[] PROGMEM = {
// Autogenerated from wled00/data/settings_pin.htm, do not edit!!
const uint16_t PAGE_settings_pin_length = 473;
const uint8_t PAGE_settings_pin[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0xdd, 0x50, 0x81, 0x04, 0xaa, 0xbd, 0x42,
0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x82, 0xaa, 0xaa, 0x72, 0xec, 0xd9, 0xc4, 0xaa, 0x3f, 0x16,
0xdb, 0x9b, 0x10, 0x2a, 0xfe, 0x3b, 0xe3, 0xdd, 0x50, 0x50, 0x2f, 0x6b, 0xbf, 0x99, 0xf1, 0x9b,

View File

@ -70,13 +70,9 @@ void decBrightness()
}
}
// apply preset or fallback to a effect and palette if it doesn't exist
void presetFallback(uint8_t presetID, uint8_t effectID, uint8_t paletteID)
{
applyPreset(presetID, CALL_MODE_BUTTON_PRESET);
//these two will be overwritten if preset exists in handlePresets()
effectCurrent = effectID;
effectPalette = paletteID;
applyPresetWithFallback(presetID, CALL_MODE_BUTTON_PRESET, effectID, paletteID);
}
byte relativeChange(byte property, int8_t amount, byte lowerBoundary, byte higherBoundary)

View File

@ -120,6 +120,15 @@ bool applyPreset(byte index, byte callMode)
return true;
}
// apply preset or fallback to a effect and palette if it doesn't exist
void applyPresetWithFallback(uint8_t index, uint8_t callMode, uint8_t effectID, uint8_t paletteID)
{
applyPreset(index, callMode);
//these two will be overwritten if preset exists in handlePresets()
effectCurrent = effectID;
effectPalette = paletteID;
}
void handlePresets()
{
if (presetToSave) {

200
wled00/remote.cpp Normal file
View File

@ -0,0 +1,200 @@
#include "wled.h"
#define ESP_NOW_STATE_UNINIT 0
#define ESP_NOW_STATE_ON 1
#define ESP_NOW_STATE_ERROR 2
#define NIGHT_MODE_DEACTIVATED -1
#define NIGHT_MODE_BRIGHTNESS 5
#define WIZMOTE_BUTTON_ON 1
#define WIZMOTE_BUTTON_OFF 2
#define WIZMOTE_BUTTON_NIGHT 3
#define WIZMOTE_BUTTON_ONE 16
#define WIZMOTE_BUTTON_TWO 17
#define WIZMOTE_BUTTON_THREE 18
#define WIZMOTE_BUTTON_FOUR 19
#define WIZMOTE_BUTTON_BRIGHT_UP 9
#define WIZMOTE_BUTTON_BRIGHT_DOWN 8
#ifdef WLED_DISABLE_ESPNOW
void handleRemote(){}
#else
// This is kind of an esoteric strucure because it's pulled from the "Wizmote"
// product spec. That remote is used as the baseline for behavior and availability
// since it's broadly commercially available and works out of the box as a drop-in
typedef struct message_structure {
uint8_t program; // 0x91 for ON button, 0x81 for all others
uint8_t seq[4]; // Incremetal sequence number 32 bit unsigned integer LSB first
uint8_t byte5 = 32; // Unknown
uint8_t button; // Identifies which button is being pressed
uint8_t byte8 = 1; // Unknown, but always 0x01
uint8_t byte9 = 100; // Unnkown, but always 0x64
uint8_t byte10; // Unknown, maybe checksum
uint8_t byte11; // Unknown, maybe checksum
uint8_t byte12; // Unknown, maybe checksum
uint8_t byte13; // Unknown, maybe checksum
} message_structure;
static int esp_now_state = ESP_NOW_STATE_UNINIT;
static uint32_t last_seq = -1;
static int brightnessBeforeNightMode = NIGHT_MODE_DEACTIVATED;
static message_structure incoming;
// Pulled from the IR Remote logic but reduced to 10 steps with a constant of 3
const byte brightnessSteps[] = {
6, 9, 14, 22, 33, 50, 75, 113, 170, 255
};
const size_t numBrightnessSteps = sizeof(brightnessSteps) / sizeof(uint8_t);
bool nightModeActive() {
return brightnessBeforeNightMode != NIGHT_MODE_DEACTIVATED;
}
void activateNightMode() {
brightnessBeforeNightMode = bri;
bri = NIGHT_MODE_BRIGHTNESS;
}
bool resetNightMode() {
if (!nightModeActive()) {
return false;
}
bri = brightnessBeforeNightMode;
brightnessBeforeNightMode = NIGHT_MODE_DEACTIVATED;
return true;
}
// increment `bri` to the next `brightnessSteps` value
void brightnessUp() {
if (nightModeActive()) { return; }
// dumb incremental search is efficient enough for so few items
for (uint8_t index = 0; index < numBrightnessSteps; ++index) {
if (brightnessSteps[index] > bri) {
bri = brightnessSteps[index];
break;
}
}
}
// decrement `bri` to the next `brightnessSteps` value
void brightnessDown() {
if (nightModeActive()) { return; }
// dumb incremental search is efficient enough for so few items
for (int index = numBrightnessSteps - 1; index >= 0; --index) {
if (brightnessSteps[index] < bri) {
bri = brightnessSteps[index];
break;
}
}
}
void setOn() {
if (resetNightMode()) {
stateUpdated(CALL_MODE_BUTTON);
}
if (!bri) {
toggleOnOff();
}
}
void setOff() {
if (resetNightMode()) {
stateUpdated(CALL_MODE_BUTTON);
}
if (bri) {
toggleOnOff();
}
}
void presetWithFallback(uint8_t presetID, uint8_t effectID, uint8_t paletteID) {
applyPresetWithFallback(presetID, CALL_MODE_BUTTON_PRESET, effectID, paletteID);
}
// Callback function that will be executed when data is received
#ifdef ESP8266
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
#else
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
#endif
sprintf (last_signal_src, "%02x%02x%02x%02x%02x%02x",
mac [0], mac [1], mac [2], mac [3], mac [4], mac [5]);
if (strcmp(last_signal_src, linked_remote) != 0) {
DEBUG_PRINT(F("ESP Now Message Received from Unlinked Sender: "));
DEBUG_PRINTLN(last_signal_src);
return;
}
if (len != sizeof(incoming)) {
DEBUG_PRINT(F("Unknown incoming ESP Now message received of length "));
DEBUG_PRINTLN(len);
return;
}
memcpy(&(incoming.program), incomingData, sizeof(incoming));
uint32_t cur_seq = incoming.seq[0] | (incoming.seq[1] << 8) | (incoming.seq[2] << 16) | (incoming.seq[3] << 24);
if (cur_seq == last_seq) {
return;
}
DEBUG_PRINT(F("Incoming ESP Now Packet["));
DEBUG_PRINT(cur_seq);
DEBUG_PRINT(F("] from sender["));
DEBUG_PRINT(last_signal_src);
DEBUG_PRINT(F("] button: "));
DEBUG_PRINTLN(incoming.button);
switch (incoming.button) {
case WIZMOTE_BUTTON_ON : setOn(); stateUpdated(CALL_MODE_BUTTON); break;
case WIZMOTE_BUTTON_OFF : setOff(); stateUpdated(CALL_MODE_BUTTON); break;
case WIZMOTE_BUTTON_ONE : presetWithFallback(1, FX_MODE_STATIC, 0); resetNightMode(); break;
case WIZMOTE_BUTTON_TWO : presetWithFallback(2, FX_MODE_BREATH, 0); resetNightMode(); break;
case WIZMOTE_BUTTON_THREE : presetWithFallback(3, FX_MODE_FIRE_FLICKER, 0); resetNightMode(); break;
case WIZMOTE_BUTTON_FOUR : presetWithFallback(4, FX_MODE_RAINBOW, 0); resetNightMode(); break;
case WIZMOTE_BUTTON_NIGHT : activateNightMode(); stateUpdated(CALL_MODE_BUTTON); break;
case WIZMOTE_BUTTON_BRIGHT_UP : brightnessUp(); stateUpdated(CALL_MODE_BUTTON); break;
case WIZMOTE_BUTTON_BRIGHT_DOWN : brightnessDown(); stateUpdated(CALL_MODE_BUTTON); break;
default: break;
}
last_seq = cur_seq;
}
void handleRemote() {
if (enable_espnow_remote) {
if (esp_now_state == ESP_NOW_STATE_UNINIT) {
DEBUG_PRINTLN(F("Initializing ESP_NOW listener"));
// Init ESP-NOW
if (esp_now_init() != 0) {
DEBUG_PRINTLN(F("Error initializing ESP-NOW"));
esp_now_state = ESP_NOW_STATE_ERROR;
}
#ifdef ESP8266
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
#endif
esp_now_register_recv_cb(OnDataRecv);
esp_now_state = ESP_NOW_STATE_ON;
}
} else {
if (esp_now_state == ESP_NOW_STATE_ON) {
DEBUG_PRINTLN(F("Disabling ESP-NOW Remote Listener"));
if (esp_now_deinit() != 0) {
DEBUG_PRINTLN(F("Error de-initializing ESP-NOW"));
}
esp_now_state = ESP_NOW_STATE_UNINIT;
} else if (esp_now_state == ESP_NOW_STATE_ERROR) {
//Clear any error states (allows retrying by cycling)
esp_now_state = ESP_NOW_STATE_UNINIT;
}
}
}
#endif

View File

@ -34,6 +34,14 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
noWifiSleep = request->hasArg(F("WS"));
#ifndef WLED_DISABLE_ESPNOW
enable_espnow_remote = request->hasArg(F("RE"));
strlcpy(linked_remote,request->arg(F("RMAC")).c_str(), 13);
//Normalize MAC format to lowercase
strlcpy(linked_remote,strlwr(linked_remote), 13);
#endif
#ifdef WLED_USE_ETHERNET
ethernetType = request->arg(F("ETH")).toInt();
WLED::instance().initEthernet();

View File

@ -46,6 +46,7 @@ void WLED::loop()
handleIR(); // 2nd call to function needed for ESP32 to return valid results -- should be good for ESP8266, too
#endif
handleConnection();
handleRemote();
handleSerial();
handleNotifications();
handleTransitions();

View File

@ -44,6 +44,8 @@
#define WLED_ENABLE_WEBSOCKETS
#endif
//#define WLED_DISABLE_ESPNOW // Removes dependence on esp now
#define WLED_ENABLE_FS_EDITOR // enable /edit page for editing FS content. Will also be disabled with OTA lock
// to toggle usb serial debug (un)comment the following line
@ -73,6 +75,9 @@
{
#include <user_interface.h>
}
#ifndef WLED_DISABLE_ESPNOW
#include <espnow.h>
#endif
#else // ESP32
#include <HardwareSerial.h> // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT)
#include <WiFi.h>
@ -89,6 +94,10 @@
#include <LittleFS.h>
#endif
#include "esp_task_wdt.h"
#ifndef WLED_DISABLE_ESPNOW
#include <esp_now.h>
#endif
#endif
#include <Wire.h>
#include <SPI.h>
@ -444,6 +453,12 @@ WLED_GLOBAL bool hueApplyColor _INIT(true);
WLED_GLOBAL uint16_t serialBaud _INIT(1152); // serial baud rate, multiply by 100
#ifndef WLED_DISABLE_ESPNOW
WLED_GLOBAL bool enable_espnow_remote _INIT(false);
WLED_GLOBAL char linked_remote[13] _INIT("");
WLED_GLOBAL char last_signal_src[13] _INIT("");
#endif
// Time CONFIG
WLED_GLOBAL bool ntpEnabled _INIT(false); // get internet time. Only required if you use clock overlays or time-activated macros
WLED_GLOBAL bool useAMPM _INIT(false); // 12h/24h clock format

View File

@ -328,6 +328,14 @@ void getSettingsJS(byte subPage, char* dest)
sappend('v',SET_F("AC"),apChannel);
sappend('c',SET_F("WS"),noWifiSleep);
#ifndef WLED_DISABLE_ESPNOW
sappend('c',SET_F("RE"),enable_espnow_remote);
sappends('s',SET_F("RMAC"),linked_remote);
#else
//hide remote settings if not compiled
oappend(SET_F("document.getElementById('remd').style.display='none';"));
#endif
#ifdef WLED_USE_ETHERNET
sappend('v',SET_F("ETH"),ethernetType);
#else
@ -360,6 +368,19 @@ void getSettingsJS(byte subPage, char* dest)
{
sappends('m',SET_F("(\"sip\")[1]"),(char*)F("Not active"));
}
#ifndef WLED_DISABLE_ESPNOW
if (last_signal_src[0] != 0) //Have seen an ESP-NOW Remote
{
sappends('m',SET_F("(\"rlid\")[0]"),last_signal_src);
} else if (!enable_espnow_remote)
{
sappends('m',SET_F("(\"rlid\")[0]"),(char*)F("(Enable remote to listen)"));
} else
{
sappends('m',SET_F("(\"rlid\")[0]"),(char*)F("None"));
}
#endif
}
if (subPage == SUBPAGE_LEDS)