From b410fc7bc1d22c0a5b13d700e37ccf21a3fa8b08 Mon Sep 17 00:00:00 2001 From: Gijs Noorlander Date: Mon, 23 Sep 2019 11:59:44 +0200 Subject: [PATCH] Split Diagnostic.h & ESPEasyWiFiEvent.h into .h/.cpp --- lib/NewPingESP8266/NewPingESP8266.cpp | 1 - platformio.ini | 5 +- src/ESPEasy-Globals.cpp | 99 +++++++-- src/ESPEasy-Globals.h | 257 +++++------------------- src/ESPEasy.ino | 48 ++--- src/ESPEasyWiFiEvent.cpp | 154 ++++++++++++++ src/ESPEasyWiFiEvent.h | 149 +++----------- src/ESPEasyWifi.ino | 1 + src/ESPEasyWifi_ProcessEvent.ino | 2 + src/ESPEasy_Log.ino | 1 + src/ESPEasy_fdwdecl.h | 2 +- src/Misc.ino | 14 +- src/Networking.ino | 1 + src/Scheduler.ino | 2 +- src/StringConverter.ino | 1 + src/WebServer.ino | 1 + src/WebServer_DevicesPage.ino | 2 + src/WebServer_Favicon.ino | 2 + src/WebServer_HTML_wrappers.ino | 2 + src/WebServer_Log.ino | 2 +- src/WebServer_SysInfoPage.ino | 1 + src/WebStaticData.h | 116 ----------- src/_CPlugin_Helper.cpp | 9 +- src/_P004_Dallas.ino | 6 + src/_P080_DallasIButton.ino | 7 + src/__Plugin.ino | 40 +--- src/src/Commands/Diagnostic.cpp | 30 ++- src/src/Commands/Diagnostic.h | 185 ++--------------- src/src/Commands/Networks.h | 2 +- src/src/Commands/Rules.h | 1 - src/src/DataStructs/PortStatusStruct.h | 2 +- src/src/DataStructs/SettingsType.h | 4 - src/src/Globals/ESPEasyWiFiEvent.cpp | 54 +++++ src/src/Globals/ESPEasyWiFiEvent.h | 112 +++++++++++ src/src/Globals/GlobalMapPortStatus.cpp | 3 + src/src/Globals/GlobalMapPortStatus.h | 9 + src/src/Globals/Logging.cpp | 5 +- src/src/Globals/Logging.h | 6 + src/src/Globals/MQTT.cpp | 17 ++ src/src/Globals/MQTT.h | 27 +++ src/src/Globals/Plugins.cpp | 44 ++-- src/src/Globals/Plugins.h | 1 - src/src/Globals/Services.cpp | 17 ++ src/src/Globals/Services.h | 43 ++++ src/src/Globals/Statistics.cpp | 28 +++ src/src/Globals/Statistics.h | 34 ++++ src/src/Static/WebStaticData.h | 114 +++++++++++ 47 files changed, 911 insertions(+), 752 deletions(-) create mode 100644 src/ESPEasyWiFiEvent.cpp delete mode 100644 src/WebStaticData.h create mode 100644 src/src/Globals/ESPEasyWiFiEvent.cpp create mode 100644 src/src/Globals/ESPEasyWiFiEvent.h create mode 100644 src/src/Globals/GlobalMapPortStatus.cpp create mode 100644 src/src/Globals/GlobalMapPortStatus.h create mode 100644 src/src/Globals/MQTT.cpp create mode 100644 src/src/Globals/MQTT.h create mode 100644 src/src/Globals/Services.cpp create mode 100644 src/src/Globals/Services.h create mode 100644 src/src/Globals/Statistics.cpp create mode 100644 src/src/Globals/Statistics.h create mode 100644 src/src/Static/WebStaticData.h diff --git a/lib/NewPingESP8266/NewPingESP8266.cpp b/lib/NewPingESP8266/NewPingESP8266.cpp index 392bfdddb..1f0c2b444 100644 --- a/lib/NewPingESP8266/NewPingESP8266.cpp +++ b/lib/NewPingESP8266/NewPingESP8266.cpp @@ -6,7 +6,6 @@ // --------------------------------------------------------------------------- #include "NewPingESP8266.h" -//#include "ESPEasy-Globals.h" // --------------------------------------------------------------------------- // NewPingESP8266 constructor // --------------------------------------------------------------------------- diff --git a/platformio.ini b/platformio.ini index 45202a0c8..c021cdf84 100644 --- a/platformio.ini +++ b/platformio.ini @@ -188,11 +188,14 @@ platform = espressif32@1.8.0 [core_esp32_1_9_0] platform = espressif32@1.9.0 +[core_esp32_1_10_0] +platform = espressif32@1.10.0 + [core_esp32_stage] platform = https://github.com/platformio/platform-espressif32.git#feature/stage [core_esp32] -platform = ${core_esp32_1_9_0.platform} +platform = ${core_esp32_1_10_0.platform} build_unflags = -Wall build_flags = -D BUILD_GIT='"${sysenv.TRAVIS_TAG}"' -DCONFIG_FREERTOS_ASSERT_DISABLE diff --git a/src/ESPEasy-Globals.cpp b/src/ESPEasy-Globals.cpp index 6e17d713c..e9b7feb81 100644 --- a/src/ESPEasy-Globals.cpp +++ b/src/ESPEasy-Globals.cpp @@ -1,31 +1,92 @@ #include -/*#include "ESPEasy-Globals.h" +#include "ESPEasy-Globals.h" + +NotificationStruct Notification[NPLUGIN_MAX]; + +#if defined(ESP32) + int8_t ledChannelPin[16]; +#endif -#include "src/DataStructs/ControllerSettingsStruct.h" -#include "src/DataStructs/DeviceModel.h" - -#include "src/DataStructs/ESPEasy_EventStruct.h" -#include "src/DataStructs/FactoryDefaultPref.h" -#include "src/DataStructs/NodeStruct.h" -#include "src/DataStructs/NotificationSettingsStruct.h" -#include "src/DataStructs/NotificationStruct.h" -#include "src/DataStructs/PortStatusStruct.h" -#include "src/DataStructs/ProtocolStruct.h" -#include "src/DataStructs/SettingsStruct.h" -#include "src/DataStructs/SettingsType.h" -#include "src/DataStructs/SystemTimerStruct.h" -#include "src/DataStructs/TimingStats.h" +I2Cdev i2cdev; -SettingsStruct Settings; -//NotificationStruct Notification[NPLUGIN_MAX]; +// Setup DNS, only used if the ESP has no valid WiFi config +const byte DNS_PORT = 53; +IPAddress apIP(DEFAULT_AP_IP); +DNSServer dnsServer; +bool dnsServerActive = false; -*/ +//NTP status +bool statusNTPInitialized = false; -unsigned long connectionFailures(0); +// udp protocol stuff (syslog, global sync, node info list, ntp time) +WiFiUDP portUDP; + +float customFloatVar[CUSTOM_VARS_MAX]; + +float UserVar[VARS_PER_TASK * TASKS_MAX]; + +int deviceCount = -1; +int protocolCount = -1; +int notificationCount = -1; + +boolean printToWeb = false; +String printWebString; +boolean printToWebJSON = false; + +rulesTimerStatus RulesTimer[RULES_TIMER_MAX]; + +msecTimerHandlerStruct msecTimerHandler; + +unsigned long timer_gratuitous_arp_interval = 5000; +unsigned long timermqtt_interval = 250; +unsigned long lastSend = 0; +unsigned long lastWeb = 0; +byte cmd_within_mainloop = 0; +unsigned long wdcounter = 0; +unsigned long timerAPoff = 0; // Timer to check whether the AP mode should be disabled (0 = disabled) +unsigned long timerAPstart = 0; // Timer to start AP mode, started when no valid network is detected. +unsigned long timerAwakeFromDeepSleep = 0; +unsigned long last_system_event_run = 0; + +#if FEATURE_ADC_VCC +float vcc = -1.0; +#endif + +boolean WebLoggedIn = false; +int WebLoggedInTimer = 300; + + +bool (*CPlugin_ptr[CPLUGIN_MAX])(byte, struct EventStruct*, String&); +byte CPlugin_id[CPLUGIN_MAX]; + +boolean (*NPlugin_ptr[NPLUGIN_MAX])(byte, struct EventStruct*, String&); +byte NPlugin_id[NPLUGIN_MAX]; + +String dummyString = ""; // FIXME @TD-er This may take a lot of memory over time, since long-lived Strings only tend to grow. + + + + + +bool webserverRunning(false); +bool webserver_init(false); + + +String eventBuffer; + + + + +bool shouldReboot(false); +bool firstLoop(true); + +boolean activeRuleSets[RULESETS_MAX]; + +boolean UseRTOSMultitasking(false); diff --git a/src/ESPEasy-Globals.h b/src/ESPEasy-Globals.h index c581671c5..8b9b18af6 100644 --- a/src/ESPEasy-Globals.h +++ b/src/ESPEasy-Globals.h @@ -92,10 +92,6 @@ -#define BOOT_CAUSE_MANUAL_REBOOT 0 -#define BOOT_CAUSE_COLD_BOOT 1 -#define BOOT_CAUSE_DEEP_SLEEP 2 -#define BOOT_CAUSE_EXT_WD 10 #include @@ -117,7 +113,7 @@ #include "src/DataStructs/NotificationSettingsStruct.h" #include "src/DataStructs/NotificationStruct.h" -NotificationStruct Notification[NPLUGIN_MAX]; +extern NotificationStruct Notification[NPLUGIN_MAX]; @@ -126,17 +122,7 @@ NotificationStruct Notification[NPLUGIN_MAX]; - - - -extern unsigned long connectionFailures; - - - - - #include "ESPEasy_Log.h" -#include "WebStaticData.h" #include "ESPEasyTimeTypes.h" #include "StringProviderTypes.h" #include "ESPeasySerial.h" @@ -149,7 +135,7 @@ extern unsigned long connectionFailures; #define FS_NO_GLOBALS #if defined(ESP8266) #include "core_version.h" - #define NODE_TYPE_ID NODE_TYPE_ID_ESP_EASYM_STD + #define NODE_TYPE_ID NODE_TYPE_ID_ESP_EASYM_STD #define FILE_CONFIG "config.dat" #define FILE_SECURITY "security.dat" #define FILE_NOTIFICATION "notification.dat" @@ -165,12 +151,8 @@ extern unsigned long connectionFailures; #endif #include //#include - #include - ESP8266WebServer WebServer(80); #include #include - #include - ESP8266HTTPUpdateServer httpUpdater(true); #ifndef LWIP_OPEN_SRC #define LWIP_OPEN_SRC #endif @@ -202,11 +184,6 @@ extern unsigned long connectionFailures; #endif #define SMALLEST_OTA_IMAGE 276848 // smallest known 2-step OTA image #define MAX_SKETCH_SIZE 1044464 - #ifdef FEATURE_ARDUINO_OTA - #include - #include - bool ArduinoOTAtriggered=false; - #endif #define PIN_D_MAX 16 #endif #if defined(ESP32) @@ -222,21 +199,14 @@ extern unsigned long connectionFailures; #define FILE_RULES "/rules1.txt" #include // #include "esp32_ping.h" - #include #include "SPIFFS.h" #include #include "esp_wifi.h" // Needed to call ESP-IDF functions like esp_wifi_.... - WebServer WebServer(80); #ifdef FEATURE_MDNS #include #endif - #ifdef FEATURE_ARDUINO_OTA - #include - #include - bool ArduinoOTAtriggered=false; - #endif #define PIN_D_MAX 39 - int8_t ledChannelPin[16]; + extern int8_t ledChannelPin[16]; #endif #include @@ -250,55 +220,25 @@ extern unsigned long connectionFailures; using namespace fs; #endif #include -#if FEATURE_ADC_VCC -ADC_MODE(ADC_VCC); -#endif -I2Cdev i2cdev; +extern I2Cdev i2cdev; -#ifdef USES_MQTT -#include -// MQTT client -WiFiClient mqtt; -PubSubClient MQTTclient(mqtt); -bool MQTTclient_should_reconnect = true; -bool MQTTclient_connected = false; -int mqtt_reconnect_count = 0; -#endif //USES_MQTT -#ifdef USES_P037 -// mqtt import status -bool P037_MQTTImport_connected = false; -#endif -#define ESPEASY_WIFI_DISCONNECTED 0 -#define ESPEASY_WIFI_CONNECTED 1 -#define ESPEASY_WIFI_GOT_IP 2 -#define ESPEASY_WIFI_SERVICES_INITIALIZED 4 -#if defined(ESP32) -void WiFiEvent(system_event_id_t event, system_event_info_t info); -#else -WiFiEventHandler stationConnectedHandler; -WiFiEventHandler stationDisconnectedHandler; -WiFiEventHandler stationGotIpHandler; -WiFiEventHandler stationModeDHCPTimeoutHandler; -WiFiEventHandler APModeStationConnectedHandler; -WiFiEventHandler APModeStationDisconnectedHandler; -#endif // Setup DNS, only used if the ESP has no valid WiFi config -const byte DNS_PORT = 53; -IPAddress apIP(DEFAULT_AP_IP); -DNSServer dnsServer; -bool dnsServerActive = false; +extern const byte DNS_PORT; +extern IPAddress apIP; +extern DNSServer dnsServer; +extern bool dnsServerActive; //NTP status -bool statusNTPInitialized = false; +extern bool statusNTPInitialized; // udp protocol stuff (syslog, global sync, node info list, ntp time) -WiFiUDP portUDP; +extern WiFiUDP portUDP; /*********************************************************************************************\ @@ -308,9 +248,10 @@ WiFiUDP portUDP; * let,1,10 * if %v1%=10 do ... \*********************************************************************************************/ -float customFloatVar[CUSTOM_VARS_MAX]; +extern float customFloatVar[CUSTOM_VARS_MAX]; + +extern float UserVar[VARS_PER_TASK * TASKS_MAX]; -float UserVar[VARS_PER_TASK * TASKS_MAX]; @@ -321,10 +262,6 @@ float UserVar[VARS_PER_TASK * TASKS_MAX]; -/*********************************************************************************************\ - * Buffer for outputting logs via serial port. -\*********************************************************************************************/ -std::deque serialWriteBuffer; @@ -351,13 +288,13 @@ struct pinStatesStruct */ -int deviceCount = -1; -int protocolCount = -1; -int notificationCount = -1; +extern int deviceCount; +extern int protocolCount; +extern int notificationCount; -boolean printToWeb = false; -String printWebString = ""; -boolean printToWebJSON = false; +extern boolean printToWeb; +extern String printWebString; +extern boolean printToWebJSON; /********************************************************************************************\ RTC_cache_struct @@ -385,36 +322,38 @@ struct rulesTimerStatus unsigned long timestamp; unsigned int interval; //interval in milliseconds boolean paused; -} RulesTimer[RULES_TIMER_MAX]; +}; -msecTimerHandlerStruct msecTimerHandler; +extern rulesTimerStatus RulesTimer[RULES_TIMER_MAX]; -unsigned long timer_gratuitous_arp_interval = 5000; -unsigned long timermqtt_interval = 250; -unsigned long lastSend = 0; -unsigned long lastWeb = 0; -byte cmd_within_mainloop = 0; -unsigned long wdcounter = 0; -unsigned long timerAPoff = 0; // Timer to check whether the AP mode should be disabled (0 = disabled) -unsigned long timerAPstart = 0; // Timer to start AP mode, started when no valid network is detected. -unsigned long timerAwakeFromDeepSleep = 0; -unsigned long last_system_event_run = 0; +extern msecTimerHandlerStruct msecTimerHandler; + +extern unsigned long timer_gratuitous_arp_interval; +extern unsigned long timermqtt_interval; +extern unsigned long lastSend; +extern unsigned long lastWeb; +extern byte cmd_within_mainloop; +extern unsigned long wdcounter; +extern unsigned long timerAPoff; // Timer to check whether the AP mode should be disabled (0 = disabled) +extern unsigned long timerAPstart; // Timer to start AP mode, started when no valid network is detected. +extern unsigned long timerAwakeFromDeepSleep; +extern unsigned long last_system_event_run; #if FEATURE_ADC_VCC -float vcc = -1.0; +extern float vcc; #endif -boolean WebLoggedIn = false; -int WebLoggedInTimer = 300; +extern boolean WebLoggedIn; +extern int WebLoggedInTimer; -bool (*CPlugin_ptr[CPLUGIN_MAX])(byte, struct EventStruct*, String&); -byte CPlugin_id[CPLUGIN_MAX]; +extern bool (*CPlugin_ptr[CPLUGIN_MAX])(byte, struct EventStruct*, String&); +extern byte CPlugin_id[CPLUGIN_MAX]; -boolean (*NPlugin_ptr[NPLUGIN_MAX])(byte, struct EventStruct*, String&); -byte NPlugin_id[NPLUGIN_MAX]; +extern boolean (*NPlugin_ptr[NPLUGIN_MAX])(byte, struct EventStruct*, String&); +extern byte NPlugin_id[NPLUGIN_MAX]; -String dummyString = ""; // FIXME @TD-er This may take a lot of memory over time, since long-lived Strings only tend to grow. +extern String dummyString; // FIXME @TD-er This may take a lot of memory over time, since long-lived Strings only tend to grow. enum PluginPtrType { TaskPluginEnum, @@ -427,119 +366,25 @@ unsigned long createSystemEventMixedId(PluginPtrType ptr_type, byte Index, byte unsigned long createSystemEventMixedId(PluginPtrType ptr_type, uint16_t crc16); -byte lastBootCause = BOOT_CAUSE_MANUAL_REBOOT; -unsigned long lastMixedSchedulerId_beforereboot = 0; - -#if defined(ESP32) -enum WiFiDisconnectReason -{ - WIFI_DISCONNECT_REASON_UNSPECIFIED = 1, - WIFI_DISCONNECT_REASON_AUTH_EXPIRE = 2, - WIFI_DISCONNECT_REASON_AUTH_LEAVE = 3, - WIFI_DISCONNECT_REASON_ASSOC_EXPIRE = 4, - WIFI_DISCONNECT_REASON_ASSOC_TOOMANY = 5, - WIFI_DISCONNECT_REASON_NOT_AUTHED = 6, - WIFI_DISCONNECT_REASON_NOT_ASSOCED = 7, - WIFI_DISCONNECT_REASON_ASSOC_LEAVE = 8, - WIFI_DISCONNECT_REASON_ASSOC_NOT_AUTHED = 9, - WIFI_DISCONNECT_REASON_DISASSOC_PWRCAP_BAD = 10, /* 11h */ - WIFI_DISCONNECT_REASON_DISASSOC_SUPCHAN_BAD = 11, /* 11h */ - WIFI_DISCONNECT_REASON_IE_INVALID = 13, /* 11i */ - WIFI_DISCONNECT_REASON_MIC_FAILURE = 14, /* 11i */ - WIFI_DISCONNECT_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, /* 11i */ - WIFI_DISCONNECT_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, /* 11i */ - WIFI_DISCONNECT_REASON_IE_IN_4WAY_DIFFERS = 17, /* 11i */ - WIFI_DISCONNECT_REASON_GROUP_CIPHER_INVALID = 18, /* 11i */ - WIFI_DISCONNECT_REASON_PAIRWISE_CIPHER_INVALID = 19, /* 11i */ - WIFI_DISCONNECT_REASON_AKMP_INVALID = 20, /* 11i */ - WIFI_DISCONNECT_REASON_UNSUPP_RSN_IE_VERSION = 21, /* 11i */ - WIFI_DISCONNECT_REASON_INVALID_RSN_IE_CAP = 22, /* 11i */ - WIFI_DISCONNECT_REASON_802_1X_AUTH_FAILED = 23, /* 11i */ - WIFI_DISCONNECT_REASON_CIPHER_SUITE_REJECTED = 24, /* 11i */ - - WIFI_DISCONNECT_REASON_BEACON_TIMEOUT = 200, - WIFI_DISCONNECT_REASON_NO_AP_FOUND = 201, - WIFI_DISCONNECT_REASON_AUTH_FAIL = 202, - WIFI_DISCONNECT_REASON_ASSOC_FAIL = 203, - WIFI_DISCONNECT_REASON_HANDSHAKE_TIMEOUT = 204 -}; -#endif -bool useStaticIP(); - -// WiFi related data -boolean wifiSetup = false; -boolean wifiSetupConnect = false; -uint8_t lastBSSID[6] = {0}; -uint8_t wifiStatus = ESPEASY_WIFI_DISCONNECTED; -unsigned long last_wifi_connect_attempt_moment = 0; -unsigned int wifi_connect_attempt = 0; -int wifi_reconnects = -1; // First connection attempt is not a reconnect. -uint8_t lastWiFiSettings = 0; -String last_ssid; -bool bssid_changed = false; -bool channel_changed = false; -uint8_t last_channel = 0; -WiFiDisconnectReason lastDisconnectReason = WIFI_DISCONNECT_REASON_UNSPECIFIED; -unsigned long lastConnectMoment = 0; -unsigned long lastDisconnectMoment = 0; -unsigned long lastGetIPmoment = 0; -unsigned long lastGetScanMoment = 0; -unsigned long lastConnectedDuration = 0; -bool intent_to_reboot = false; -uint8_t lastMacConnectedAPmode[6] = {0}; -uint8_t lastMacDisconnectedAPmode[6] = {0}; - -//uint32_t scan_done_status = 0; -uint8_t scan_done_number = 0; -//uint8_t scan_done_scan_id = 0; - -// Semaphore like booleans for processing data gathered from WiFi events. -volatile bool processedConnect = true; -volatile bool processedDisconnect = true; -volatile bool processedGotIP = true; -volatile bool processedDHCPTimeout = true; -volatile bool processedConnectAPmode = true; -volatile bool processedDisconnectAPmode = true; -volatile bool processedScanDone = true; -bool wifiConnectAttemptNeeded = true; -bool wifiConnectInProgress = false; - -bool webserverRunning = false; -bool webserver_init = false; - -unsigned long idle_msec_per_sec = 0; -unsigned long elapsed10ps = 0; -unsigned long elapsed10psU = 0; -unsigned long elapsed50ps = 0; -unsigned long loopCounter = 0; -unsigned long loopCounterLast = 0; -unsigned long loopCounterMax = 1; -unsigned long lastLoopStart = 0; -unsigned long shortestLoop = 10000000; -unsigned long longestLoop = 0; -unsigned long loopCounter_full = 1; -float loop_usec_duration_total = 0.0; -unsigned long dailyResetCounter = 0; -volatile unsigned long sw_watchdog_callback_count = 0; -String eventBuffer = ""; - -uint32_t lowestRAM = 0; -String lowestRAMfunction = ""; -uint32_t lowestFreeStack = 0; -String lowestFreeStackfunction = ""; +extern bool webserverRunning; +extern bool webserver_init; -bool shouldReboot=false; -bool firstLoop=true; +extern String eventBuffer; -boolean activeRuleSets[RULESETS_MAX]; -boolean UseRTOSMultitasking = false; +extern bool shouldReboot; +extern bool firstLoop; + +extern boolean activeRuleSets[RULESETS_MAX]; + +extern boolean UseRTOSMultitasking; + // void (*MainLoopCall_ptr)(void); //FIXME TD-er: No idea what this does. diff --git a/src/ESPEasy.ino b/src/ESPEasy.ino index 46c57a9a7..c3e35cd5c 100644 --- a/src/ESPEasy.ino +++ b/src/ESPEasy.ino @@ -91,35 +91,46 @@ #include "_CPlugin_Helper.h" #include "src/ControllerQueue/DelayQueueElements.h" - #include "src/DataStructs/ControllerSettingsStruct.h" #include "src/DataStructs/DeviceModel.h" #include "src/DataStructs/ESPEasy_EventStruct.h" #include "src/DataStructs/PortStatusStruct.h" #include "src/DataStructs/ProtocolStruct.h" +#include "src/DataStructs/RTCStruct.h" #include "src/DataStructs/SchedulerTimers.h" #include "src/DataStructs/SettingsType.h" #include "src/DataStructs/SystemTimerStruct.h" #include "src/DataStructs/TimingStats.h" +#include "src/Globals/Device.h" +#include "src/Globals/ESPEasyWiFiEvent.h" +#include "src/Globals/ExtraTaskSettings.h" +#include "src/Globals/GlobalMapPortStatus.h" +#include "src/Globals/MQTT.h" #include "src/Globals/Plugins.h" #include "src/Globals/RTC.h" -#include "src/DataStructs/RTCStruct.h" -#include "src/Globals/Device.h" -#include "src/Globals/Settings.h" #include "src/Globals/SecuritySettings.h" -#include "src/Globals/ExtraTaskSettings.h" +#include "src/Globals/Services.h" #include "src/Globals/Settings.h" +#include "src/Globals/Statistics.h" +#if FEATURE_ADC_VCC +ADC_MODE(ADC_VCC); +#endif + + +// FIXME TD-er: This must be moves to src/Globals/Services +// But right now, it seems hard to define WevServer in a .h/.cpp file +// error: 'WebServer' does not name a type +#ifdef ESP32 + #include + #include + WebServer WebServer(80); +#endif // Get functions to give access to global defined variables. // These are needed to get direct access to global defined variables, since they cannot be defined in .h files and included more than once. - -unsigned long& getConnectionFailures() { return connectionFailures; } - - - float& getUserVar(unsigned int varIndex) {return UserVar[varIndex]; } @@ -809,23 +820,6 @@ void runOncePerSecond() Wire.endTransmission(); } -/* - if (Settings.SerialLogLevel == LOG_LEVEL_DEBUG_DEV) - { - serialPrint(F("Plugin calls: 50 ps:")); - serialPrint(elapsed50ps); - serialPrint(F(" uS, 10 ps:")); - serialPrint(elapsed10ps); - serialPrint(F(" uS, 10 psU:")); - serialPrint(elapsed10psU); - serialPrint(F(" uS, 1 ps:")); - serialPrint(elapsed); - serialPrintln(F(" uS")); - elapsed50ps=0; - elapsed10ps=0; - elapsed10psU=0; - } - */ checkResetFactoryPin(); STOP_TIMER(PLUGIN_CALL_1PS); } diff --git a/src/ESPEasyWiFiEvent.cpp b/src/ESPEasyWiFiEvent.cpp new file mode 100644 index 000000000..5dc770b46 --- /dev/null +++ b/src/ESPEasyWiFiEvent.cpp @@ -0,0 +1,154 @@ +#include "ESPEasyWiFiEvent.h" +#include "src/Globals/ESPEasyWiFiEvent.h" +#include "ESPEasyTimeTypes.h" + +#ifdef ESP32 + void WiFi_Access_Static_IP::set_use_static_ip(bool enabled) { + _useStaticIp = enabled; + } +#endif +#ifdef ESP8266 + void WiFi_Access_Static_IP::set_use_static_ip(bool enabled) { + _useStaticIp = enabled; + } +#endif + + + +void setUseStaticIP(bool enabled) { + WiFi_Access_Static_IP tmp_wifi; + + tmp_wifi.set_use_static_ip(enabled); +} + +void markGotIP() { + lastGetIPmoment = millis(); + wifiStatus = ESPEASY_WIFI_GOT_IP; + processedGotIP = false; +} + +// ******************************************************************************** +// Functions called on events. +// Make sure not to call anything in these functions that result in delay() or yield() +// ******************************************************************************** +#ifdef ESP32 +void WiFiEvent(system_event_id_t event, system_event_info_t info) { + switch (event) { + case SYSTEM_EVENT_STA_CONNECTED: + lastConnectMoment = millis(); + processedConnect = false; + wifiStatus = ESPEASY_WIFI_CONNECTED; + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + lastDisconnectMoment = millis(); + + if (timeDiff(lastConnectMoment, last_wifi_connect_attempt_moment) > 0) { + // There was an unsuccessful connection attempt + lastConnectedDuration = timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment); + } else { + lastConnectedDuration = timeDiff(lastConnectMoment, lastDisconnectMoment); + } + processedDisconnect = false; + lastDisconnectReason = static_cast(info.disconnected.reason); + wifiStatus = ESPEASY_WIFI_DISCONNECTED; + break; + case SYSTEM_EVENT_STA_GOT_IP: + markGotIP(); + break; + case SYSTEM_EVENT_AP_STACONNECTED: + + for (byte i = 0; i < 6; ++i) { + lastMacConnectedAPmode[i] = info.sta_connected.mac[i]; + } + processedConnectAPmode = false; + break; + case SYSTEM_EVENT_AP_STADISCONNECTED: + + for (byte i = 0; i < 6; ++i) { + lastMacConnectedAPmode[i] = info.sta_disconnected.mac[i]; + } + processedDisconnectAPmode = false; + break; + case SYSTEM_EVENT_SCAN_DONE: + lastGetScanMoment = millis(); + + // scan_done_status = info.scan_done.status; + scan_done_number = info.scan_done.number; + + // scan_done_scan_id = info.scan_done.scan_id; + processedScanDone = false; + break; + default: + break; + } +} + +#endif + +#ifdef ESP8266 + +void onConnected(const WiFiEventStationModeConnected& event) { + lastConnectMoment = millis(); + processedConnect = false; + wifiStatus = ESPEASY_WIFI_CONNECTED; + channel_changed = last_channel != event.channel; + last_channel = event.channel; + last_ssid = event.ssid; + bssid_changed = false; + + for (byte i = 0; i < 6; ++i) { + if (lastBSSID[i] != event.bssid[i]) { + bssid_changed = true; + lastBSSID[i] = event.bssid[i]; + } + } +} + +void onDisconnect(const WiFiEventStationModeDisconnected& event) { + lastDisconnectMoment = millis(); + + if (timeDiff(lastConnectMoment, last_wifi_connect_attempt_moment) > 0) { + // There was an unsuccessful connection attempt + lastConnectedDuration = timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment); + } else { + lastConnectedDuration = timeDiff(lastConnectMoment, lastDisconnectMoment); + } + lastDisconnectReason = event.reason; + wifiStatus = ESPEASY_WIFI_DISCONNECTED; + + if (WiFi.status() == WL_CONNECTED) { + // See https://github.com/esp8266/Arduino/issues/5912 + WiFi.disconnect(); + } + processedDisconnect = false; +} + +void onGotIP(const WiFiEventStationModeGotIP& event) { + markGotIP(); +} + +void ICACHE_RAM_ATTR onDHCPTimeout() { + processedDHCPTimeout = false; +} + +void onConnectedAPmode(const WiFiEventSoftAPModeStationConnected& event) { + for (byte i = 0; i < 6; ++i) { + lastMacConnectedAPmode[i] = event.mac[i]; + } + processedConnectAPmode = false; +} + +void onDisonnectedAPmode(const WiFiEventSoftAPModeStationDisconnected& event) { + for (byte i = 0; i < 6; ++i) { + lastMacDisconnectedAPmode[i] = event.mac[i]; + } + processedDisconnectAPmode = false; +} + +void onScanFinished(int networksFound) { + lastGetScanMoment = millis(); + scan_done_number = networksFound; + processedScanDone = false; +} + +#endif \ No newline at end of file diff --git a/src/ESPEasyWiFiEvent.h b/src/ESPEasyWiFiEvent.h index 38928648b..cdc6857b2 100644 --- a/src/ESPEasyWiFiEvent.h +++ b/src/ESPEasyWiFiEvent.h @@ -1,161 +1,60 @@ #include "ESPEasy_common.h" +#include + // ******************************************************************************** // Work-around for setting _useStaticIP // See reported issue: https://github.com/esp8266/Arduino/issues/4114 // ******************************************************************************** #ifdef ESP32 +#include +#include class WiFi_Access_Static_IP : public WiFiSTAClass { public: - void set_use_static_ip(bool enabled) { - _useStaticIp = enabled; - } + void set_use_static_ip(bool enabled); }; -#else // ifdef ESP32 +#endif + +#ifdef ESP8266 +#include +#include class WiFi_Access_Static_IP : public ESP8266WiFiSTAClass { public: - void set_use_static_ip(bool enabled) { - _useStaticIp = enabled; - } + void set_use_static_ip(bool enabled); }; -#endif // ifdef ESP32 +#endif -void setUseStaticIP(bool enabled) { - WiFi_Access_Static_IP tmp_wifi; +void setUseStaticIP(bool enabled); - tmp_wifi.set_use_static_ip(enabled); -} - -void markGotIP() { - lastGetIPmoment = millis(); - wifiStatus = ESPEASY_WIFI_GOT_IP; - processedGotIP = false; -} +void markGotIP(); // ******************************************************************************** // Functions called on events. // Make sure not to call anything in these functions that result in delay() or yield() // ******************************************************************************** #ifdef ESP32 -void WiFiEvent(system_event_id_t event, system_event_info_t info) { - switch (event) { - case SYSTEM_EVENT_STA_CONNECTED: - lastConnectMoment = millis(); - processedConnect = false; - wifiStatus = ESPEASY_WIFI_CONNECTED; - break; - case SYSTEM_EVENT_STA_DISCONNECTED: - lastDisconnectMoment = millis(); +void WiFiEvent(system_event_id_t event, system_event_info_t info); - if (timeDiff(lastConnectMoment, last_wifi_connect_attempt_moment) > 0) { - // There was an unsuccessful connection attempt - lastConnectedDuration = timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment); - } else { - lastConnectedDuration = timeDiff(lastConnectMoment, lastDisconnectMoment); - } - processedDisconnect = false; - lastDisconnectReason = static_cast(info.disconnected.reason); - wifiStatus = ESPEASY_WIFI_DISCONNECTED; - break; - case SYSTEM_EVENT_STA_GOT_IP: - markGotIP(); - break; - case SYSTEM_EVENT_AP_STACONNECTED: +#endif - for (byte i = 0; i < 6; ++i) { - lastMacConnectedAPmode[i] = info.sta_connected.mac[i]; - } - processedConnectAPmode = false; - break; - case SYSTEM_EVENT_AP_STADISCONNECTED: +#ifdef ESP8266 - for (byte i = 0; i < 6; ++i) { - lastMacConnectedAPmode[i] = info.sta_disconnected.mac[i]; - } - processedDisconnectAPmode = false; - break; - case SYSTEM_EVENT_SCAN_DONE: - lastGetScanMoment = millis(); +void onConnected(const WiFiEventStationModeConnected& event); - // scan_done_status = info.scan_done.status; - scan_done_number = info.scan_done.number; +void onDisconnect(const WiFiEventStationModeDisconnected& event); - // scan_done_scan_id = info.scan_done.scan_id; - processedScanDone = false; - break; - default: - break; - } -} +void onGotIP(const WiFiEventStationModeGotIP& event); -#else // ifdef ESP32 +void ICACHE_RAM_ATTR onDHCPTimeout(); -void onConnected(const WiFiEventStationModeConnected& event) { - lastConnectMoment = millis(); - processedConnect = false; - wifiStatus = ESPEASY_WIFI_CONNECTED; - channel_changed = last_channel != event.channel; - last_channel = event.channel; - last_ssid = event.ssid; - bssid_changed = false; +void onConnectedAPmode(const WiFiEventSoftAPModeStationConnected& event); - for (byte i = 0; i < 6; ++i) { - if (lastBSSID[i] != event.bssid[i]) { - bssid_changed = true; - lastBSSID[i] = event.bssid[i]; - } - } -} +void onDisonnectedAPmode(const WiFiEventSoftAPModeStationDisconnected& event); -void onDisconnect(const WiFiEventStationModeDisconnected& event) { - lastDisconnectMoment = millis(); - - if (timeDiff(lastConnectMoment, last_wifi_connect_attempt_moment) > 0) { - // There was an unsuccessful connection attempt - lastConnectedDuration = timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment); - } else { - lastConnectedDuration = timeDiff(lastConnectMoment, lastDisconnectMoment); - } - lastDisconnectReason = event.reason; - wifiStatus = ESPEASY_WIFI_DISCONNECTED; - - if (WiFi.status() == WL_CONNECTED) { - // See https://github.com/esp8266/Arduino/issues/5912 - WiFi.disconnect(); - } - processedDisconnect = false; -} - -void onGotIP(const WiFiEventStationModeGotIP& event) { - markGotIP(); -} - -void ICACHE_RAM_ATTR onDHCPTimeout() { - processedDHCPTimeout = false; -} - -void onConnectedAPmode(const WiFiEventSoftAPModeStationConnected& event) { - for (byte i = 0; i < 6; ++i) { - lastMacConnectedAPmode[i] = event.mac[i]; - } - processedConnectAPmode = false; -} - -void onDisonnectedAPmode(const WiFiEventSoftAPModeStationDisconnected& event) { - for (byte i = 0; i < 6; ++i) { - lastMacDisconnectedAPmode[i] = event.mac[i]; - } - processedDisconnectAPmode = false; -} - -void onScanFinished(int networksFound) { - lastGetScanMoment = millis(); - scan_done_number = networksFound; - processedScanDone = false; -} +void onScanFinished(int networksFound); #endif // ifdef ESP32 diff --git a/src/ESPEasyWifi.ino b/src/ESPEasyWifi.ino index 7a6640739..73f7457f9 100644 --- a/src/ESPEasyWifi.ino +++ b/src/ESPEasyWifi.ino @@ -1,6 +1,7 @@ #define WIFI_RECONNECT_WAIT 20000 // in milliSeconds #define WIFI_AP_OFF_TIMER_DURATION 60000 // in milliSeconds +#include "src/Globals/ESPEasyWiFiEvent.h" // ******************************************************************************** // WiFi state diff --git a/src/ESPEasyWifi_ProcessEvent.ino b/src/ESPEasyWifi_ProcessEvent.ino index f01967be4..fe81957f6 100644 --- a/src/ESPEasyWifi_ProcessEvent.ino +++ b/src/ESPEasyWifi_ProcessEvent.ino @@ -1,3 +1,5 @@ +#include "src/Globals/ESPEasyWiFiEvent.h" + bool unprocessedWifiEvents() { if (processedConnect && processedDisconnect && processedGotIP && processedDHCPTimeout) { diff --git a/src/ESPEasy_Log.ino b/src/ESPEasy_Log.ino index 9bd98cf39..778617e90 100644 --- a/src/ESPEasy_Log.ino +++ b/src/ESPEasy_Log.ino @@ -1,5 +1,6 @@ #include "ESPEasy_Log.h" #include "src/Globals/Logging.h" +#include "src/Globals/ESPEasyWiFiEvent.h" #include "src/DataStructs/LogStruct.h" /********************************************************************************************\ diff --git a/src/ESPEasy_fdwdecl.h b/src/ESPEasy_fdwdecl.h index c56619135..a773bff2c 100644 --- a/src/ESPEasy_fdwdecl.h +++ b/src/ESPEasy_fdwdecl.h @@ -29,7 +29,6 @@ // Forward declaration to give access to global member variables -unsigned long & getConnectionFailures(); float & getUserVar(unsigned int varIndex); @@ -70,6 +69,7 @@ bool connectClient(WiFiClient& client, bool WiFiConnected(uint32_t timeout_ms); bool WiFiConnected(); +bool useStaticIP(); bool hostReachable(const IPAddress& ip); bool hostReachable(const String& hostname); void formatMAC(const uint8_t * mac, char (& strMAC)[20]); diff --git a/src/Misc.ino b/src/Misc.ino index 9232ddb16..eb1fedad7 100644 --- a/src/Misc.ino +++ b/src/Misc.ino @@ -1,18 +1,20 @@ -#include "src/Globals/RTC.h" +#include "src/DataStructs/Caches.h" +#include "src/DataStructs/NodeStruct.h" +#include "src/DataStructs/PinMode.h" #include "src/DataStructs/RTCStruct.h" -#include "src/Globals/ResetFactoryDefaultPref.h" + #include "src/Globals/CRCValues.h" +#include "src/Globals/Cache.h" #include "src/Globals/Device.h" +#include "src/Globals/RTC.h" +#include "src/Globals/ResetFactoryDefaultPref.h" +#include "src/Globals/Services.h" /*********************************************************************************************\ ESPEasy specific strings \*********************************************************************************************/ -#include "src/DataStructs/NodeStruct.h" -#include "src/DataStructs/PinMode.h" -#include "src/DataStructs/Caches.h" -#include "src/Globals/Cache.h" String getNodeTypeDisplayString(byte nodeType) { switch (nodeType) diff --git a/src/Networking.ino b/src/Networking.ino index b7b5ad92c..404b40fe1 100644 --- a/src/Networking.ino +++ b/src/Networking.ino @@ -1,4 +1,5 @@ #include "src/Globals/Nodes.h" +#include "src/Globals/ESPEasyWiFiEvent.h" // Generic Networking routines diff --git a/src/Scheduler.ino b/src/Scheduler.ino index 5abb567b5..030180ec1 100644 --- a/src/Scheduler.ino +++ b/src/Scheduler.ino @@ -391,7 +391,7 @@ void process_plugin_task_timer(unsigned long id) { // TD-er: Not sure if we have to keep original source for notifications. TempEvent.Source = VALUE_SOURCE_SYSTEM; - const int y = getPluginId(timer_data.TaskIndex); + const int y = getPluginId_from_TaskIndex(timer_data.TaskIndex); /* String log = F("proc_system_timer: Pluginid: "); diff --git a/src/StringConverter.ino b/src/StringConverter.ino index 48d43b49a..613785670 100644 --- a/src/StringConverter.ino +++ b/src/StringConverter.ino @@ -1,5 +1,6 @@ #include "src/Globals/CRCValues.h" #include "src/Globals/Device.h" +#include "src/Globals/ESPEasyWiFiEvent.h" /********************************************************************************************\ Convert a char string to integer diff --git a/src/WebServer.ino b/src/WebServer.ino index d153f995f..4410390d3 100644 --- a/src/WebServer.ino +++ b/src/WebServer.ino @@ -4,6 +4,7 @@ #include "src/Globals/Device.h" +#include "src/Static/WebStaticData.h" // ******************************************************************************** // Core part of WebServer, the chunked streaming buffer diff --git a/src/WebServer_DevicesPage.ino b/src/WebServer_DevicesPage.ino index 00c6e7733..9b1f14e18 100644 --- a/src/WebServer_DevicesPage.ino +++ b/src/WebServer_DevicesPage.ino @@ -1,5 +1,7 @@ #include "src/Globals/Nodes.h" #include "src/Globals/Device.h" +#include "src/Static/WebStaticData.h" + void handle_devices() { checkRAM(F("handle_devices")); diff --git a/src/WebServer_Favicon.ino b/src/WebServer_Favicon.ino index dae19f548..5a82ed28b 100644 --- a/src/WebServer_Favicon.ino +++ b/src/WebServer_Favicon.ino @@ -1,4 +1,6 @@ +#include "src/Static/WebStaticData.h" + void handle_favicon() { checkRAM(F("handle_favicon")); WebServer.send_P(200, PSTR("image/x-icon"), favicon_8b_ico, favicon_8b_ico_len); diff --git a/src/WebServer_HTML_wrappers.ino b/src/WebServer_HTML_wrappers.ino index 8053b2390..261e6edb5 100644 --- a/src/WebServer_HTML_wrappers.ino +++ b/src/WebServer_HTML_wrappers.ino @@ -1,3 +1,5 @@ +#include "src/Static/WebStaticData.h" + // ******************************************************************************** // HTML string re-use to keep the executable smaller diff --git a/src/WebServer_Log.ino b/src/WebServer_Log.ino index ce9deb981..a228323db 100644 --- a/src/WebServer_Log.ino +++ b/src/WebServer_Log.ino @@ -1,5 +1,5 @@ - #include "src/Globals/Logging.h" +#include "src/Static/WebStaticData.h" // ******************************************************************************** // Web Interface log page diff --git a/src/WebServer_SysInfoPage.ino b/src/WebServer_SysInfoPage.ino index 05acc34dc..ee224fe23 100644 --- a/src/WebServer_SysInfoPage.ino +++ b/src/WebServer_SysInfoPage.ino @@ -1,6 +1,7 @@ #include "src/Globals/RTC.h" #include "src/DataStructs/RTCStruct.h" #include "src/Globals/CRCValues.h" +#include "src/Static/WebStaticData.h" #ifdef WEBSERVER_NEW_UI diff --git a/src/WebStaticData.h b/src/WebStaticData.h deleted file mode 100644 index 17b0c166c..000000000 --- a/src/WebStaticData.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef WEBSTATICDATA_h -#define WEBSTATICDATA_h - -#define PGMT( pgm_ptr ) ( reinterpret_cast< const __FlashStringHelper * >( pgm_ptr ) ) - -/*********************************************************************************************\ - * ESP Easy logo Favicon.ico 16x16 8 bit -\*********************************************************************************************/ -// Generated using xxd: xxd -i favicon.ico > favicon.ino -static const char favicon_8b_ico[] PROGMEM = { - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0x70, 0x01, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x89, 0x50, - 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, - 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, - 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x01, 0x37, 0x49, - 0x44, 0x41, 0x54, 0x38, 0x8d, 0x9d, 0x93, 0xbd, 0x4e, 0xc3, 0x30, 0x14, - 0x85, 0x4f, 0x0a, 0x08, 0xc1, 0xd2, 0x64, 0xea, 0xab, 0xb0, 0x74, 0xe2, - 0x11, 0x32, 0x31, 0x31, 0x74, 0xaa, 0x3a, 0x97, 0x15, 0x77, 0x4c, 0x3a, - 0x87, 0x05, 0x31, 0x30, 0xb1, 0x98, 0x37, 0x70, 0xa5, 0x28, 0x5d, 0xc2, - 0xc0, 0xde, 0xbe, 0x40, 0x51, 0xc4, 0xe0, 0x86, 0x36, 0x55, 0x88, 0x91, - 0xcd, 0x10, 0xc5, 0x24, 0x10, 0xa5, 0x0d, 0x57, 0xf2, 0xf0, 0x59, 0x3a, - 0xf7, 0xe7, 0xe8, 0x5e, 0x38, 0x3e, 0xb7, 0x56, 0xb1, 0xa0, 0x49, 0x26, - 0x55, 0xf1, 0x8a, 0x68, 0xe2, 0x54, 0x48, 0xea, 0xf8, 0xdc, 0xc2, 0x2a, - 0x16, 0x54, 0xfd, 0x0a, 0x2f, 0x8c, 0x95, 0x17, 0xc6, 0x9a, 0xdd, 0x80, - 0xd7, 0x72, 0x2a, 0x24, 0xed, 0x74, 0xcf, 0x8e, 0x6c, 0x00, 0xd8, 0x09, - 0x05, 0x00, 0x98, 0xce, 0xd7, 0x18, 0xdd, 0xbf, 0xe1, 0x7d, 0x2b, 0x35, - 0xdf, 0x3c, 0x46, 0x9a, 0x27, 0xb3, 0x9c, 0x93, 0x4c, 0xe2, 0xf4, 0xd8, - 0xb0, 0x51, 0x6e, 0xd1, 0x0d, 0xb8, 0xc2, 0x60, 0xa1, 0x08, 0xe3, 0xb5, - 0x4c, 0x58, 0x95, 0x93, 0x4c, 0x2a, 0x9d, 0xa0, 0xad, 0x58, 0x27, 0x28, - 0x66, 0x6e, 0x23, 0x26, 0xec, 0xc7, 0x13, 0x9d, 0xa0, 0x8d, 0x18, 0x83, - 0x85, 0x72, 0x83, 0x9c, 0x1b, 0x3d, 0xd8, 0x27, 0x6e, 0xf4, 0x60, 0x9f, - 0xb8, 0xe2, 0xc1, 0x7f, 0x2a, 0xff, 0x31, 0xb1, 0x4d, 0xe5, 0x4a, 0x07, - 0x65, 0x0f, 0x0e, 0xa9, 0x4c, 0x18, 0x57, 0x84, 0x71, 0xbd, 0xd6, 0x3a, - 0xc1, 0x21, 0x95, 0x09, 0xe3, 0x0a, 0xc3, 0xa5, 0xc2, 0x70, 0xa9, 0xff, - 0x3b, 0xe7, 0x27, 0x06, 0xa6, 0xf3, 0x35, 0xc8, 0x53, 0x04, 0x72, 0xd5, - 0xc3, 0xed, 0xa5, 0x89, 0xc9, 0x2c, 0x67, 0xf7, 0xba, 0x87, 0x71, 0xdf, - 0xd4, 0x6b, 0x5e, 0x17, 0x46, 0x2a, 0x24, 0x7d, 0x78, 0xdd, 0xd8, 0x49, - 0x26, 0x31, 0xee, 0x9b, 0x00, 0x80, 0xbb, 0x97, 0x0f, 0x94, 0xb9, 0x88, - 0x9d, 0x50, 0xf0, 0xc2, 0x18, 0x00, 0x30, 0xba, 0xe8, 0x62, 0xfb, 0x29, - 0x9f, 0xe1, 0xf8, 0xdc, 0x4a, 0x85, 0xa4, 0xc5, 0x8c, 0x75, 0xe7, 0x5b, - 0x77, 0xea, 0xd1, 0xe6, 0x8b, 0x3a, 0x3e, 0xb7, 0xbe, 0x01, 0x4d, 0x0a, - 0x09, 0x35, 0x8e, 0xf2, 0xa6, 0xea, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, - 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 -}; -unsigned int favicon_8b_ico_len = 390; - -static const char githublogo[] PROGMEM = { - "" -}; - -const char DATA_GITHUB_CLIPBOARD_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x74,0x47,0x69,0x74,0x68,0x75,0x62,0x43,0x6c,0x69,0x70,0x62,0x6f,0x61,0x72,0x64,0x28,0x29,0x7b,0x76,0x61,0x72,0x20,0x65,0x3d,0x22,0x45,0x53,0x50,0x20,0x45,0x61,0x73,0x79,0x20,0x7c,0x20,0x49,0x6e,0x66,0x6f,0x72,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x20,0x7c,0x5c,0x6e,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x7c,0x2d,0x2d,0x2d,0x2d,0x2d,0x7c,0x5c,0x6e,0x22,0x3b,0x6d,0x61,0x78,0x5f,0x6c,0x6f,0x6f,0x70,0x3d,0x31,0x30,0x30,0x3b,0x66,0x6f,0x72,0x28,0x76,0x61,0x72,0x20,0x6f,0x3d,0x31,0x3b,0x6f,0x3c,0x6d,0x61,0x78,0x5f,0x6c,0x6f,0x6f,0x70,0x3b,0x6f,0x2b,0x2b,0x29,0x7b,0x76,0x61,0x72,0x20,0x6e,0x3d,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x22,0x2b,0x6f,0x2c,0x74,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x6e,0x29,0x3b,0x69,0x66,0x28,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x74,0x29,0x6f,0x3d,0x6d,0x61,0x78,0x5f,0x6c,0x6f,0x6f,0x70,0x2b,0x31,0x3b,0x65,0x6c,0x73,0x65,0x7b,0x76,0x61,0x72,0x20,0x61,0x3d,0x22,0x7c,0x22,0x3b,0x6f,0x25,0x32,0x3d,0x3d,0x30,0x26,0x26,0x28,0x61,0x2b,0x3d,0x22,0x5c,0x6e,0x22,0x29,0x2c,0x65,0x2b,0x3d,0x74,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2e,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x28,0x2f,0x3c,0x5b,0x42,0x62,0x5d,0x5b,0x52,0x72,0x5d,0x5c,0x73,0x2a,0x5c,0x2f,0x3f,0x3e,0x2f,0x67,0x69,0x6d,0x2c,0x22,0x5c,0x6e,0x22,0x29,0x2b,0x61,0x7d,0x7d,0x65,0x3d,0x28,0x65,0x3d,0x65,0x2e,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x28,0x2f,0x3c,0x5c,0x2f,0x5b,0x44,0x64,0x5d,0x5b,0x49,0x69,0x5d,0x5b,0x56,0x76,0x5d,0x5c,0x73,0x2a,0x5c,0x2f,0x3f,0x3e,0x2f,0x67,0x69,0x6d,0x2c,0x22,0x5c,0x6e,0x22,0x29,0x29,0x2e,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x28,0x2f,0x3c,0x5b,0x5e,0x3e,0x5d,0x2a,0x3e,0x2f,0x67,0x69,0x6d,0x2c,0x22,0x22,0x29,0x3b,0x76,0x61,0x72,0x20,0x6c,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x63,0x72,0x65,0x61,0x74,0x65,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x28,0x22,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x22,0x29,0x3b,0x6c,0x2e,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x20,0x2d,0x31,0x30,0x30,0x30,0x70,0x78,0x3b,0x20,0x74,0x6f,0x70,0x3a,0x20,0x2d,0x31,0x30,0x30,0x30,0x70,0x78,0x22,0x2c,0x6c,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x65,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x62,0x6f,0x64,0x79,0x2e,0x61,0x70,0x70,0x65,0x6e,0x64,0x43,0x68,0x69,0x6c,0x64,0x28,0x6c,0x29,0x2c,0x6c,0x2e,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x65,0x78,0x65,0x63,0x43,0x6f,0x6d,0x6d,0x61,0x6e,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x22,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x62,0x6f,0x64,0x79,0x2e,0x72,0x65,0x6d,0x6f,0x76,0x65,0x43,0x68,0x69,0x6c,0x64,0x28,0x6c,0x29,0x2c,0x61,0x6c,0x65,0x72,0x74,0x28,0x27,0x43,0x6f,0x70,0x69,0x65,0x64,0x3a,0x20,0x22,0x27,0x2b,0x65,0x2b,0x27,0x22,0x20,0x74,0x6f,0x20,0x63,0x6c,0x69,0x70,0x62,0x6f,0x61,0x72,0x64,0x21,0x27,0x29,0x7d, 0}; - - -const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = {0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x68,0x31,0x2c,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x7d,0x68,0x31,0x2c,0x68,0x36,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x27,0x27,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x6c,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x72,0x69,0x67,0x68,0x74,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2a,0x7b,0x62,0x6f,0x78,0x2d,0x73,0x69,0x7a,0x69,0x6e,0x67,0x3a,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x78,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x30,0x7d,0x68,0x31,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x38,0x70,0x78,0x20,0x30,0x7d,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x7d,0x68,0x32,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x20,0x2d,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x7d,0x68,0x33,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x45,0x45,0x45,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x31,0x36,0x70,0x78,0x20,0x2d,0x34,0x70,0x78,0x20,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x68,0x36,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x30,0x70,0x74,0x7d,0x63,0x6f,0x64,0x65,0x2c,0x6b,0x62,0x64,0x2c,0x70,0x72,0x65,0x2c,0x73,0x61,0x6d,0x70,0x2c,0x74,0x74,0x2c,0x78,0x6d,0x70,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x65,0x6d,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x2c,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x77,0x69,0x64,0x65,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x72,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x70,0x78,0x20,0x34,0x70,0x78,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x33,0x36,0x39,0x7d,0x69,0x6e,0x70,0x75,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2e,0x77,0x69,0x64,0x65,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2e,0x77,0x69,0x64,0x65,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x2e,0x77,0x69,0x64,0x65,0x6e,0x75,0x6d,0x62,0x65,0x72,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x33,0x35,0x70,0x78,0x3b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x79,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x35,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x2d,0x6d,0x73,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x30,0x20,0x33,0x70,0x78,0x20,0x33,0x70,0x78,0x20,0x30,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x31,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x37,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x33,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x70,0x78,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x2c,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x39,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x36,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x36,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x38,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x38,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x70,0x78,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x27,0x4c,0x75,0x63,0x69,0x64,0x61,0x20,0x43,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x27,0x2c,0x4d,0x6f,0x6e,0x61,0x63,0x6f,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x37,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x32,0x38,0x32,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x2d,0x31,0x32,0x35,0x70,0x78,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x36,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x68,0x69,0x64,0x64,0x65,0x6e,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2e,0x73,0x68,0x6f,0x77,0x7b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x76,0x69,0x73,0x69,0x62,0x6c,0x65,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x30,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x31,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x43,0x46,0x46,0x39,0x35,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x32,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x39,0x44,0x43,0x45,0x46,0x45,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x33,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x41,0x34,0x46,0x43,0x37,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x34,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x32,0x41,0x42,0x33,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x39,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x35,0x30,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x32,0x37,0x32,0x37,0x32,0x37,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x35,0x33,0x30,0x70,0x78,0x3b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x3a,0x61,0x75,0x74,0x6f,0x7d,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x68,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x68,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x38,0x38,0x38,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x3b,0x61,0x6c,0x69,0x67,0x6e,0x2d,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3a,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x32,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x72,0x7b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x3a,0x6e,0x74,0x68,0x2d,0x63,0x68,0x69,0x6c,0x64,0x28,0x65,0x76,0x65,0x6e,0x29,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x44,0x45,0x45,0x36,0x46,0x46,0x7d,0x2e,0x68,0x69,0x67,0x68,0x6c,0x69,0x67,0x68,0x74,0x20,0x74,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x64,0x62,0x66,0x66,0x30,0x30,0x37,0x35,0x7d,0x2e,0x61,0x70,0x68,0x65,0x61,0x64,0x65,0x72,0x2c,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x38,0x46,0x38,0x46,0x38,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x38,0x70,0x78,0x20,0x31,0x32,0x70,0x78,0x7d,0x2e,0x6e,0x6f,0x74,0x65,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x69,0x74,0x61,0x6c,0x69,0x63,0x7d,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x44,0x44,0x44,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x39,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x72,0x69,0x67,0x68,0x74,0x3a,0x30,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x2e,0x62,0x6f,0x64,0x79,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x39,0x36,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x62,0x61,0x72,0x7b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x69,0x6e,0x68,0x65,0x72,0x69,0x74,0x3b,0x74,0x6f,0x70,0x3a,0x35,0x35,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x20,0x34,0x70,0x78,0x20,0x30,0x20,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x70,0x78,0x20,0x31,0x70,0x78,0x20,0x31,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x68,0x69,0x74,0x65,0x2d,0x73,0x70,0x61,0x63,0x65,0x3a,0x6e,0x6f,0x77,0x72,0x61,0x70,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x2e,0x61,0x63,0x74,0x69,0x76,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x20,0x23,0x44,0x44,0x44,0x20,0x23,0x46,0x46,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x44,0x45,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6f,0x6e,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x65,0x6e,0x7d,0x2e,0x6f,0x66,0x66,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x38,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x32,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x70,0x78,0x20,0x31,0x30,0x70,0x78,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x2c,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x35,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x30,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x62,0x72,0x7b,0x63,0x6c,0x65,0x61,0x72,0x3a,0x62,0x6f,0x74,0x68,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x34,0x34,0x33,0x33,0x36,0x7d,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x63,0x61,0x31,0x37,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x32,0x32,0x70,0x78,0x3b,0x6c,0x69,0x6e,0x65,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x31,0x35,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x2e,0x33,0x73,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x7b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x2d,0x78,0x3a,0x61,0x75,0x74,0x6f,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x40,0x6d,0x65,0x64,0x69,0x61,0x20,0x73,0x63,0x72,0x65,0x65,0x6e,0x20,0x61,0x6e,0x64,0x20,0x28,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x39,0x36,0x30,0x70,0x78,0x29,0x7b,0x2e,0x73,0x68,0x6f,0x77,0x6d,0x65,0x6e,0x75,0x6c,0x61,0x62,0x65,0x6c,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x31,0x76,0x77,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x38,0x70,0x78,0x7d,0x7d,0x0a, 0}; - - -// JavaScript blobs - - -const char DATA_REBOOT_JS[] PROGMEM = {0x69,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x72,0x62,0x74,0x6d,0x73,0x67,0x22,0x29,0x2c,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x50,0x6c,0x65,0x61,0x73,0x65,0x20,0x72,0x65,0x62,0x6f,0x6f,0x74,0x3a,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x69,0x64,0x3d,0x27,0x72,0x65,0x62,0x6f,0x6f,0x74,0x27,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x27,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x6c,0x69,0x6e,0x6b,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x52,0x65,0x62,0x6f,0x6f,0x74,0x27,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x27,0x72,0x28,0x29,0x27,0x3e,0x22,0x3b,0x76,0x61,0x72,0x20,0x78,0x3d,0x6e,0x65,0x77,0x20,0x58,0x4d,0x4c,0x48,0x74,0x74,0x70,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x3b,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x64,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x22,0x2c,0x63,0x6c,0x65,0x61,0x72,0x54,0x69,0x6d,0x65,0x6f,0x75,0x74,0x28,0x74,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x63,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x2e,0x22,0x2c,0x78,0x2e,0x6f,0x6e,0x6c,0x6f,0x61,0x64,0x3d,0x64,0x2c,0x78,0x2e,0x6f,0x70,0x65,0x6e,0x28,0x22,0x47,0x45,0x54,0x22,0x2c,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2e,0x6f,0x72,0x69,0x67,0x69,0x6e,0x29,0x2c,0x78,0x2e,0x73,0x65,0x6e,0x64,0x28,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x62,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x52,0x65,0x62,0x6f,0x6f,0x74,0x69,0x6e,0x67,0x2e,0x2e,0x22,0x2c,0x74,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x63,0x2c,0x32,0x65,0x33,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x72,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x20,0x28,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x69,0x6e,0x67,0x29,0x22,0x2c,0x78,0x2e,0x6f,0x6e,0x6c,0x6f,0x61,0x64,0x3d,0x62,0x2c,0x78,0x2e,0x6f,0x70,0x65,0x6e,0x28,0x22,0x47,0x45,0x54,0x22,0x2c,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2e,0x6f,0x72,0x69,0x67,0x69,0x6e,0x2b,0x22,0x2f,0x3f,0x63,0x6d,0x64,0x3d,0x72,0x65,0x62,0x6f,0x6f,0x74,0x22,0x29,0x2c,0x78,0x2e,0x73,0x65,0x6e,0x64,0x28,0x29,0x7d, 0}; - -static const char jsToastMessageBegin[] PROGMEM = { - "" -}; - -static const char jsClipboardCopyPart1[] PROGMEM = { - "" -}; - -const char DATA_UPDATE_SENSOR_VALUES_DEVICE_PAGE_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x73,0x29,0x7b,0x76,0x61,0x72,0x20,0x61,0x2c,0x6c,0x2c,0x6f,0x3d,0x30,0x3b,0x69,0x73,0x4e,0x61,0x4e,0x28,0x73,0x29,0x26,0x26,0x28,0x73,0x3d,0x31,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x65,0x26,0x26,0x28,0x65,0x3d,0x31,0x65,0x33,0x29,0x3b,0x76,0x61,0x72,0x20,0x6e,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x6f,0x3e,0x30,0x3f,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x3a,0x2b,0x2b,0x73,0x3e,0x31,0x3f,0x6f,0x3d,0x31,0x3a,0x28,0x66,0x65,0x74,0x63,0x68,0x28,0x22,0x2f,0x6a,0x73,0x6f,0x6e,0x3f,0x76,0x69,0x65,0x77,0x3d,0x73,0x65,0x6e,0x73,0x6f,0x72,0x75,0x70,0x64,0x61,0x74,0x65,0x22,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x76,0x61,0x72,0x20,0x6f,0x3b,0x32,0x30,0x30,0x3d,0x3d,0x3d,0x73,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x3f,0x73,0x2e,0x6a,0x73,0x6f,0x6e,0x28,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x66,0x6f,0x72,0x28,0x65,0x3d,0x73,0x2e,0x54,0x54,0x4c,0x2c,0x61,0x3d,0x30,0x3b,0x61,0x3c,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x61,0x2b,0x2b,0x29,0x69,0x66,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x68,0x61,0x73,0x4f,0x77,0x6e,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x28,0x22,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x22,0x29,0x29,0x66,0x6f,0x72,0x28,0x6c,0x3d,0x30,0x3b,0x6c,0x3c,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x6c,0x2b,0x2b,0x29,0x74,0x72,0x79,0x7b,0x6f,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x7d,0x63,0x61,0x74,0x63,0x68,0x28,0x65,0x29,0x7b,0x6f,0x3d,0x65,0x2e,0x6e,0x61,0x6d,0x65,0x7d,0x66,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x7b,0x69,0x66,0x28,0x22,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x22,0x21,0x3d,0x3d,0x6f,0x29,0x7b,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x2c,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x56,0x61,0x6c,0x75,0x65,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x4e,0x72,0x44,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x2c,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x3d,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0x76,0x61,0x72,0x20,0x72,0x3d,0x22,0x76,0x61,0x6c,0x75,0x65,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2b,0x22,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2c,0x74,0x3d,0x22,0x76,0x61,0x6c,0x75,0x65,0x6e,0x61,0x6d,0x65,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2b,0x22,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2c,0x75,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x72,0x29,0x2c,0x63,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x74,0x29,0x3b,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x3d,0x75,0x26,0x26,0x28,0x75,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x3d,0x63,0x26,0x26,0x28,0x63,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x4e,0x61,0x6d,0x65,0x2b,0x22,0x3a,0x22,0x29,0x7d,0x7d,0x65,0x3d,0x73,0x2e,0x54,0x54,0x4c,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x3a,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x22,0x4c,0x6f,0x6f,0x6b,0x73,0x20,0x6c,0x69,0x6b,0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x77,0x61,0x73,0x20,0x61,0x20,0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0x2e,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x20,0x43,0x6f,0x64,0x65,0x3a,0x20,0x22,0x2b,0x73,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x29,0x7d,0x29,0x2e,0x63,0x61,0x74,0x63,0x68,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x73,0x2e,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x29,0x2c,0x65,0x3d,0x35,0x65,0x33,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x2c,0x6f,0x3d,0x31,0x29,0x7d,0x2c,0x65,0x29,0x7d,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x31,0x65,0x33,0x2c,0x30,0x29,0x3b, 0}; - - -const char DATA_FETCH_AND_PARSE_LOG_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x67,0x65,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x28,0x29,0x7b,0x76,0x61,0x72,0x20,0x65,0x2c,0x6f,0x3d,0x6e,0x61,0x76,0x69,0x67,0x61,0x74,0x6f,0x72,0x2e,0x75,0x73,0x65,0x72,0x41,0x67,0x65,0x6e,0x74,0x2c,0x74,0x3d,0x6f,0x2e,0x6d,0x61,0x74,0x63,0x68,0x28,0x2f,0x28,0x6f,0x70,0x65,0x72,0x61,0x7c,0x63,0x68,0x72,0x6f,0x6d,0x65,0x7c,0x73,0x61,0x66,0x61,0x72,0x69,0x7c,0x66,0x69,0x72,0x65,0x66,0x6f,0x78,0x7c,0x6d,0x73,0x69,0x65,0x7c,0x74,0x72,0x69,0x64,0x65,0x6e,0x74,0x28,0x3f,0x3d,0x5c,0x2f,0x29,0x29,0x5c,0x2f,0x3f,0x5c,0x73,0x2a,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x69,0x29,0x7c,0x7c,0x5b,0x5d,0x3b,0x72,0x65,0x74,0x75,0x72,0x6e,0x2f,0x74,0x72,0x69,0x64,0x65,0x6e,0x74,0x2f,0x69,0x2e,0x74,0x65,0x73,0x74,0x28,0x74,0x5b,0x31,0x5d,0x29,0x3f,0x7b,0x6e,0x61,0x6d,0x65,0x3a,0x22,0x49,0x45,0x22,0x2c,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x28,0x65,0x3d,0x2f,0x5c,0x62,0x72,0x76,0x5b,0x20,0x3a,0x5d,0x2b,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x67,0x2e,0x65,0x78,0x65,0x63,0x28,0x6f,0x29,0x7c,0x7c,0x5b,0x5d,0x29,0x5b,0x31,0x5d,0x7c,0x7c,0x22,0x22,0x7d,0x3a,0x22,0x43,0x68,0x72,0x6f,0x6d,0x65,0x22,0x3d,0x3d,0x3d,0x74,0x5b,0x31,0x5d,0x26,0x26,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x28,0x65,0x3d,0x6f,0x2e,0x6d,0x61,0x74,0x63,0x68,0x28,0x2f,0x5c,0x62,0x4f,0x50,0x52,0x7c,0x45,0x64,0x67,0x65,0x5c,0x2f,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x29,0x29,0x3f,0x7b,0x6e,0x61,0x6d,0x65,0x3a,0x22,0x4f,0x70,0x65,0x72,0x61,0x22,0x2c,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x65,0x5b,0x31,0x5d,0x7d,0x3a,0x28,0x74,0x3d,0x74,0x5b,0x32,0x5d,0x3f,0x5b,0x74,0x5b,0x31,0x5d,0x2c,0x74,0x5b,0x32,0x5d,0x5d,0x3a,0x5b,0x6e,0x61,0x76,0x69,0x67,0x61,0x74,0x6f,0x72,0x2e,0x61,0x70,0x70,0x4e,0x61,0x6d,0x65,0x2c,0x6e,0x61,0x76,0x69,0x67,0x61,0x74,0x6f,0x72,0x2e,0x61,0x70,0x70,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x2c,0x22,0x2d,0x3f,0x22,0x5d,0x2c,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x28,0x65,0x3d,0x6f,0x2e,0x6d,0x61,0x74,0x63,0x68,0x28,0x2f,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x5c,0x2f,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x69,0x29,0x29,0x26,0x26,0x74,0x2e,0x73,0x70,0x6c,0x69,0x63,0x65,0x28,0x31,0x2c,0x31,0x2c,0x65,0x5b,0x31,0x5d,0x29,0x2c,0x7b,0x6e,0x61,0x6d,0x65,0x3a,0x74,0x5b,0x30,0x5d,0x2c,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x74,0x5b,0x31,0x5d,0x7d,0x29,0x7d,0x76,0x61,0x72,0x20,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x3d,0x67,0x65,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x28,0x29,0x2c,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x3d,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x6e,0x61,0x6d,0x65,0x2b,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3b,0x28,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x6e,0x61,0x6d,0x65,0x3d,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3c,0x31,0x32,0x29,0x3f,0x74,0x65,0x78,0x74,0x54,0x6f,0x44,0x69,0x73,0x70,0x6c,0x61,0x79,0x3d,0x22,0x45,0x72,0x72,0x6f,0x72,0x3a,0x20,0x22,0x2b,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x2b,0x22,0x20,0x69,0x73,0x20,0x6e,0x6f,0x74,0x20,0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x65,0x64,0x21,0x20,0x50,0x6c,0x65,0x61,0x73,0x65,0x20,0x74,0x72,0x79,0x20,0x61,0x20,0x6d,0x6f,0x64,0x65,0x72,0x6e,0x20,0x77,0x65,0x62,0x20,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x22,0x3a,0x74,0x65,0x78,0x74,0x54,0x6f,0x44,0x69,0x73,0x70,0x6c,0x61,0x79,0x3d,0x22,0x46,0x65,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x6c,0x6f,0x67,0x20,0x65,0x6e,0x74,0x72,0x69,0x65,0x73,0x2e,0x2e,0x2e,0x22,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x74,0x65,0x78,0x74,0x54,0x6f,0x44,0x69,0x73,0x70,0x6c,0x61,0x79,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x31,0x65,0x33,0x2c,0x30,0x29,0x3b,0x76,0x61,0x72,0x20,0x6c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x3d,0x6e,0x65,0x77,0x20,0x41,0x72,0x72,0x61,0x79,0x28,0x22,0x55,0x6e,0x75,0x73,0x65,0x64,0x22,0x2c,0x22,0x45,0x72,0x72,0x6f,0x72,0x22,0x2c,0x22,0x49,0x6e,0x66,0x6f,0x22,0x2c,0x22,0x44,0x65,0x62,0x75,0x67,0x22,0x2c,0x22,0x44,0x65,0x62,0x75,0x67,0x20,0x4d,0x6f,0x72,0x65,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x44,0x65,0x62,0x75,0x67,0x20,0x44,0x65,0x76,0x22,0x29,0x3b,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x6f,0x29,0x7b,0x76,0x61,0x72,0x20,0x74,0x2c,0x6e,0x3b,0x69,0x73,0x4e,0x61,0x4e,0x28,0x6f,0x29,0x26,0x26,0x28,0x6f,0x3d,0x31,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x65,0x26,0x26,0x28,0x65,0x3d,0x31,0x65,0x33,0x29,0x2c,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x69,0x6e,0x67,0x5f,0x74,0x79,0x70,0x65,0x3d,0x65,0x3c,0x3d,0x35,0x30,0x30,0x3f,0x22,0x61,0x75,0x74,0x6f,0x22,0x3a,0x22,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x22,0x3b,0x76,0x61,0x72,0x20,0x72,0x3d,0x22,0x22,0x2c,0x6c,0x3d,0x30,0x2c,0x73,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x6c,0x3e,0x30,0x3f,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x73,0x29,0x3a,0x28,0x2b,0x2b,0x6f,0x3e,0x31,0x3f,0x6c,0x3d,0x31,0x3a,0x66,0x65,0x74,0x63,0x68,0x28,0x22,0x2f,0x6c,0x6f,0x67,0x6a,0x73,0x6f,0x6e,0x22,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x6f,0x29,0x7b,0x32,0x30,0x30,0x3d,0x3d,0x3d,0x6f,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x3f,0x6f,0x2e,0x6a,0x73,0x6f,0x6e,0x28,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x6f,0x29,0x7b,0x76,0x61,0x72,0x20,0x6c,0x3b,0x66,0x6f,0x72,0x28,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x6e,0x26,0x26,0x28,0x6e,0x3d,0x22,0x22,0x29,0x2c,0x74,0x3d,0x30,0x3b,0x74,0x3c,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x6e,0x72,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x3b,0x2b,0x2b,0x74,0x29,0x74,0x72,0x79,0x7b,0x6c,0x3d,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x7d,0x63,0x61,0x74,0x63,0x68,0x28,0x65,0x29,0x7b,0x6c,0x3d,0x65,0x2e,0x6e,0x61,0x6d,0x65,0x7d,0x66,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x7b,0x22,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x22,0x21,0x3d,0x3d,0x6c,0x26,0x26,0x28,0x72,0x3d,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x2c,0x6e,0x2b,0x3d,0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x22,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x2b,0x22,0x20,0x69,0x64,0x3d,0x22,0x2b,0x72,0x2b,0x27,0x3e,0x3c,0x66,0x6f,0x6e,0x74,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x67,0x72,0x61,0x79,0x22,0x3e,0x27,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x2b,0x22,0x3a,0x3c,0x2f,0x66,0x6f,0x6e,0x74,0x3e,0x20,0x22,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x65,0x78,0x74,0x2b,0x22,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x29,0x7d,0x65,0x3d,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x54,0x54,0x4c,0x2c,0x22,0x22,0x21,0x3d,0x3d,0x6e,0x26,0x26,0x28,0x22,0x46,0x65,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x6c,0x6f,0x67,0x20,0x65,0x6e,0x74,0x72,0x69,0x65,0x73,0x2e,0x2e,0x2e,0x22,0x3d,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x26,0x26,0x28,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x22,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x6e,0x29,0x2c,0x6e,0x3d,0x22,0x22,0x2c,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x5f,0x6f,0x6e,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x2c,0x31,0x3d,0x3d,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x5f,0x6f,0x6e,0x26,0x26,0x22,0x22,0x21,0x3d,0x3d,0x72,0x26,0x26,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x72,0x29,0x2e,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x49,0x6e,0x74,0x6f,0x56,0x69,0x65,0x77,0x28,0x7b,0x62,0x65,0x68,0x61,0x76,0x69,0x6f,0x72,0x3a,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x69,0x6e,0x67,0x5f,0x74,0x79,0x70,0x65,0x7d,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x6c,0x6f,0x67,0x6c,0x65,0x76,0x65,0x6c,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x4c,0x6f,0x67,0x67,0x69,0x6e,0x67,0x3a,0x20,0x22,0x2b,0x6c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x5b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x73,0x57,0x65,0x62,0x4c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x5d,0x2b,0x22,0x20,0x28,0x22,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x73,0x57,0x65,0x62,0x4c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x2b,0x22,0x29,0x22,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x73,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x3a,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x22,0x4c,0x6f,0x6f,0x6b,0x73,0x20,0x6c,0x69,0x6b,0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x77,0x61,0x73,0x20,0x61,0x20,0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0x2e,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x20,0x43,0x6f,0x64,0x65,0x3a,0x20,0x22,0x2b,0x6f,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x29,0x7d,0x29,0x2e,0x63,0x61,0x74,0x63,0x68,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x6f,0x29,0x7b,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x3c,0x64,0x69,0x76,0x3e,0x3e,0x3e,0x20,0x22,0x2b,0x6f,0x2e,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2b,0x22,0x20,0x3c,0x3c,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x2c,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x5f,0x6f,0x6e,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x65,0x3d,0x35,0x65,0x33,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x73,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x2c,0x6c,0x3d,0x31,0x29,0x7d,0x2c,0x65,0x29,0x7d, 0}; - -#endif // WEBSTATICDATA_h diff --git a/src/_CPlugin_Helper.cpp b/src/_CPlugin_Helper.cpp index 91d7ececf..ec4346883 100644 --- a/src/_CPlugin_Helper.cpp +++ b/src/_CPlugin_Helper.cpp @@ -15,6 +15,7 @@ #include "src/Globals/CRCValues.h" #include "src/Globals/Settings.h" #include "src/Globals/SecuritySettings.h" +#include "src/Globals/ESPEasyWiFiEvent.h" #include #include @@ -250,7 +251,7 @@ void log_connecting_fail(const String& prefix, int controller_number, Controller String log = prefix; log += get_formatted_Controller_number(controller_number); log += F(" connection failed ("); - log += getConnectionFailures(); + log += connectionFailures; log += F("/"); log += Settings.ConnectionFailuresThreshold; log += F(")"); @@ -261,14 +262,14 @@ void log_connecting_fail(const String& prefix, int controller_number, Controller bool count_connection_results(bool success, const String& prefix, int controller_number, ControllerSettingsStruct& ControllerSettings) { if (!success) { - getConnectionFailures()++; + connectionFailures++; log_connecting_fail(prefix, controller_number, ControllerSettings); return false; } statusLED(true); - if (getConnectionFailures()) { - getConnectionFailures()--; + if (connectionFailures) { + connectionFailures--; } return true; } diff --git a/src/_P004_Dallas.ino b/src/_P004_Dallas.ino index f1501c273..0c41a5119 100644 --- a/src/_P004_Dallas.ino +++ b/src/_P004_Dallas.ino @@ -800,4 +800,10 @@ boolean Plugin_004_DS_crc8(uint8_t *addr) return crc == *addr; // addr 8 } + +#if defined(ESP32) + #undef ESP32noInterrupts + #undef ESP32interrupts +#endif + #endif // USES_P004 diff --git a/src/_P080_DallasIButton.ino b/src/_P080_DallasIButton.ino index 58321f508..4d20d4c38 100644 --- a/src/_P080_DallasIButton.ino +++ b/src/_P080_DallasIButton.ino @@ -545,4 +545,11 @@ boolean Plugin_080_DS_crc8(uint8_t * addr) } return crc == *addr; // addr 8 } + +#if defined(ESP32) + #undef ESP32noInterrupts + #undef ESP32interrupts +#endif + + #endif // USES_P080 diff --git a/src/__Plugin.ino b/src/__Plugin.ino index 9a326893d..a7480e80e 100644 --- a/src/__Plugin.ino +++ b/src/__Plugin.ino @@ -1065,38 +1065,6 @@ void PluginInit(void) } -// TODO TD-er: Move to Plugins.cpp -int getPluginId(byte taskId) { - if (taskId < TASKS_MAX) { - int retry = 1; - while (retry >= 0) { - int plugin = Task_id_to_Plugin_id[taskId]; - if (plugin >= 0 && plugin < PLUGIN_MAX) { - if (Plugin_id[plugin] == Settings.TaskDeviceNumber[taskId]) - return plugin; - } - updateTaskPluginCache(); - --retry; - } - } - return -1; -} - -// TODO TD-er: Move to Plugins.cpp -void updateTaskPluginCache() { - ++countFindPluginId; // Used for statistics. - Task_id_to_Plugin_id.resize(TASKS_MAX); - for (byte y = 0; y < TASKS_MAX; ++y) { - Task_id_to_Plugin_id[y] = -1; - bool foundPlugin = false; - for (byte x = 0; x < PLUGIN_MAX && !foundPlugin; ++x) { - if (Plugin_id[x] != 0 && Plugin_id[x] == Settings.TaskDeviceNumber[y]) { - foundPlugin = true; - Task_id_to_Plugin_id[y] = x; - } - } - } -} int8_t getXFromPluginId(byte pluginID) { std::vector::iterator it; @@ -1177,7 +1145,7 @@ byte PluginCall(byte Function, struct EventStruct *event, String& str) { if (Settings.TaskDeviceDataFeed[y] == 0) // these calls only to tasks with local feed { - const int x = getPluginId(y); + const int x = getPluginId_from_TaskIndex(y); if (x >= 0) { byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[y]); TempEvent.TaskIndex = y; @@ -1217,7 +1185,7 @@ byte PluginCall(byte Function, struct EventStruct *event, String& str) { if (Settings.TaskDeviceEnabled[y] && Settings.TaskDeviceNumber[y] != 0) { - const int x = getPluginId(y); + const int x = getPluginId_from_TaskIndex(y); if (x >= 0) { byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[y]); TempEvent.TaskIndex = y; @@ -1256,7 +1224,7 @@ byte PluginCall(byte Function, struct EventStruct *event, String& str) { if (Settings.TaskDeviceDataFeed[y] == 0) // these calls only to tasks with local feed { - const int x = getPluginId(y); + const int x = getPluginId_from_TaskIndex(y); if (x >= 0) { byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[y]); TempEvent.TaskIndex = y; @@ -1296,7 +1264,7 @@ byte PluginCall(byte Function, struct EventStruct *event, String& str) case PLUGIN_GET_PACKED_RAW_DATA: case PLUGIN_SET_DEFAULTS: { - const int x = getPluginId(event->TaskIndex); + const int x = getPluginId_from_TaskIndex(event->TaskIndex); if (x >= 0) { if (Plugin_id[x] != 0 ) { if (Function == PLUGIN_INIT) { diff --git a/src/src/Commands/Diagnostic.cpp b/src/src/Commands/Diagnostic.cpp index e21e550b7..ea37a48a8 100644 --- a/src/src/Commands/Diagnostic.cpp +++ b/src/src/Commands/Diagnostic.cpp @@ -1,19 +1,35 @@ - -// FIXME TD-er Must make global variables available to complete this transition to .cpp file. -/* #include "Diagnostic.h" - +/* #include "Common.h" #include "../../ESPEasy_common.h" #include "../../ESPEasy_fdwdecl.h" #include "../DataStructs/ESPEasy_EventStruct.h" #include "../DataStructs/SettingsType.h" -#include "../DataStructs/PortStatusStruct.h" -#include "../../ESPEasy_Log.h" +*/ #include #include +#include "../../ESPEasy_common.h" +#include "src/Commands/Common.h" +#include "src/Globals/Settings.h" +#include "src/Globals/SecuritySettings.h" +#include "src/Globals/ExtraTaskSettings.h" +#include "src/Globals/Device.h" +#include "src/DataStructs/SettingsType.h" +#include "src/DataStructs/PortStatusStruct.h" +#include "src/Globals/GlobalMapPortStatus.h" +#include "../../ESPEasy_Log.h" +#include "../Globals/Statistics.h" + + +#include "ESPEasy_fdwdecl.h" + + +#ifndef BUILD_MINIMAL_OTA + bool showSettingsFileLayout = false; +#endif + String Command_Lowmem(struct EventStruct *event, const char* Line) { String result; @@ -175,5 +191,3 @@ String Command_logPortStatus(struct EventStruct *event, const char* Line) logPortStatus("Rules"); return return_command_success(); } - -*/ \ No newline at end of file diff --git a/src/src/Commands/Diagnostic.h b/src/src/Commands/Diagnostic.h index ecffd1a5a..91b4d443e 100644 --- a/src/src/Commands/Diagnostic.h +++ b/src/src/Commands/Diagnostic.h @@ -1,177 +1,34 @@ #ifndef COMMAND_DIAGNOSTIC_H #define COMMAND_DIAGNOSTIC_H -// FIXME TD-er Must complete moving these to the .cpp file +#include +#include -#include "../../ESPEasy_common.h" -#include "src/Globals/Settings.h" -#include "src/Globals/SecuritySettings.h" -#include "src/Globals/ExtraTaskSettings.h" -#include "src/Globals/Device.h" -#include "src/DataStructs/SettingsType.h" +class String; +struct portStatusStruct; -#include "ESPEasy_fdwdecl.h" -String Command_Lowmem(struct EventStruct *event, const char* Line) -{ - String result; - result += lowestRAM; - result += F(" : "); - result += lowestRAMfunction; - return return_result(event, result); -} +String Command_Lowmem(struct EventStruct *event, const char* Line); +String Command_Malloc(struct EventStruct *event, const char* Line); +String Command_SysLoad(struct EventStruct *event, const char* Line); +String Command_SerialFloat(struct EventStruct *event, const char* Line); +String Command_MemInfo(struct EventStruct *event, const char* Line); +String Command_MemInfo_detail(struct EventStruct *event, const char* Line); +String Command_Background(struct EventStruct *event, const char* Line); +String Command_Debug(struct EventStruct *event, const char* Line); +String Command_logentry(struct EventStruct *event, const char* Line); +String Command_JSONPortStatus(struct EventStruct *event, const char* Line); +void createLogPortStatus(std::map< uint32_t, portStatusStruct >::iterator it); +void debugPortStatus(std::map< uint32_t, portStatusStruct >::iterator it); +void logPortStatus(String from); +String Command_logPortStatus(struct EventStruct *event, const char* Line); -String Command_Malloc(struct EventStruct *event, const char* Line) -{ - char* ramtest; - ramtest = (char*)malloc(event->Par1); - if (ramtest == NULL) return F("failed"); - free(ramtest); - return return_command_success(); -} -String Command_SysLoad(struct EventStruct *event, const char* Line) -{ - String result = toString(getCPUload()); - result += F("% (LC="); - result += getLoopCountPerSec(); - result += ')'; - return return_result(event, result); -} - -String Command_SerialFloat(struct EventStruct *event, const char* Line) -{ - pinMode(1, INPUT); - pinMode(3, INPUT); - delay(60000); - return return_command_success(); -} - -String Command_MemInfo(struct EventStruct *event, const char* Line) -{ - serialPrint(F("SecurityStruct | ")); - serialPrintln(String(sizeof(SecuritySettings))); - serialPrint(F("SettingsStruct | ")); - serialPrintln(String(sizeof(Settings))); - serialPrint(F("ExtraTaskSettingsStruct| ")); - serialPrintln(String(sizeof(ExtraTaskSettings))); - serialPrint(F("DeviceStruct | ")); - serialPrintln(String(sizeof(Device))); - return return_see_serial(event); -} - -String Command_MemInfo_detail(struct EventStruct *event, const char* Line) -{ #ifndef BUILD_MINIMAL_OTA - showSettingsFileLayout = true; +// Show settings file layout in charts on sysinfo page. +// Will be enabled after running command "meminfodetail" +extern bool showSettingsFileLayout; #endif - Command_MemInfo(event, Line); - for (int st = 0; st < SettingsType_MAX; ++st) { - SettingsType settingsType = static_cast(st); - int max_index, offset, max_size; - int struct_size = 0; - serialPrintln(); - serialPrint(getSettingsTypeString(settingsType)); - serialPrintln(F(" | start | end | max_size | struct_size")); - serialPrintln(F("--- | --- | --- | --- | ---")); - getSettingsParameters(settingsType, 0, max_index, offset, max_size, struct_size); - for (int i = 0; i < max_index; ++i) { - getSettingsParameters(settingsType, i, offset, max_size); - serialPrint(String(i)); - serialPrint("|"); - serialPrint(String(offset)); - serialPrint("|"); - serialPrint(String(offset + max_size - 1)); - serialPrint("|"); - serialPrint(String(max_size)); - serialPrint("|"); - serialPrintln(String(struct_size)); - } - } - return return_see_serial(event); -} -String Command_Background(struct EventStruct *event, const char* Line) -{ - unsigned long timer = millis() + event->Par1; - serialPrintln(F("start")); - while (!timeOutReached(timer)) - backgroundtasks(); - serialPrintln(F("end")); - return return_see_serial(event); -} - -String Command_Debug(struct EventStruct *event, const char* Line) -{ - if (HasArgv(Line, 2)) { - setLogLevelFor(LOG_TO_SERIAL, event->Par1); - }else { - serialPrintln(); - serialPrint(F("Serial debug level: ")); - serialPrintln(String(Settings.SerialLogLevel)); - } - return return_see_serial(event); -} - -String Command_logentry(struct EventStruct *event, const char* Line) -{ - addLog(LOG_LEVEL_INFO,Line); - return return_command_success(); -} - - -String Command_JSONPortStatus(struct EventStruct *event, const char* Line) -{ - addLog(LOG_LEVEL_INFO,F("JSON Port Status: Command not implemented yet.")); - return return_command_success(); -} - -void createLogPortStatus(std::map::iterator it) -{ - String log = F("PortStatus detail: "); - log += F("Port="); - log += getPortFromKey(it->first); - log += F(" State="); - log += it->second.state; - log += F(" Output="); - log += it->second.output; - log += F(" Mode="); - log += it->second.mode; - log += F(" Task="); - log += it->second.task; - log += F(" Monitor="); - log += it->second.monitor; - log += F(" Command="); - log += it->second.command; - log += F(" Init="); - log += it->second.init; - log += F(" PreviousTask="); - log += it->second.previousTask; - addLog(LOG_LEVEL_INFO,log); -} - -void debugPortStatus(std::map::iterator it) -{ - createLogPortStatus(it); -} - -void logPortStatus(String from) { - String log; - log=F("PortStatus structure: Called from="); - log+=from; - log+=F(" Count="); - log+=globalMapPortStatus.size(); - addLog(LOG_LEVEL_INFO,log); - - for (std::map::iterator it=globalMapPortStatus.begin(); it!=globalMapPortStatus.end(); ++it) { - debugPortStatus(it); - } -} - -String Command_logPortStatus(struct EventStruct *event, const char* Line) -{ - logPortStatus("Rules"); - return return_command_success(); -} #endif // COMMAND_DIAGNOSTIC_H diff --git a/src/src/Commands/Networks.h b/src/src/Commands/Networks.h index a91c96e68..238493d47 100644 --- a/src/src/Commands/Networks.h +++ b/src/src/Commands/Networks.h @@ -2,7 +2,7 @@ #define COMMAND_NETWORKS_H -//#include "../ESPEasy-Globals.h" + String Command_AccessInfo_Ls(struct EventStruct *event, const char* Line) { diff --git a/src/src/Commands/Rules.h b/src/src/Commands/Rules.h index 8af5b37e5..48cbee63c 100644 --- a/src/src/Commands/Rules.h +++ b/src/src/Commands/Rules.h @@ -2,7 +2,6 @@ #define COMMAND_RULES_H -// #include "../ESPEasy-Globals.h" String Command_Rules_Execute(struct EventStruct *event, const char *Line) { diff --git a/src/src/DataStructs/PortStatusStruct.h b/src/src/DataStructs/PortStatusStruct.h index e08b22d49..ce4796eed 100644 --- a/src/src/DataStructs/PortStatusStruct.h +++ b/src/src/DataStructs/PortStatusStruct.h @@ -24,7 +24,7 @@ struct portStatusStruct { int8_t x; // used to synchronize the Plugin_prt vector index (x) with the PLUGIN_ID }; -std::map globalMapPortStatus; +typedef std::map MapPortStatus; #endif // DATASTRUCTS_PORTSTATUSSTRUCT_H diff --git a/src/src/DataStructs/SettingsType.h b/src/src/DataStructs/SettingsType.h index 8cbfdf120..381e2ed49 100644 --- a/src/src/DataStructs/SettingsType.h +++ b/src/src/DataStructs/SettingsType.h @@ -18,9 +18,5 @@ String getSettingsTypeString(SettingsType settingsType); bool getSettingsParameters(SettingsType settingsType, int index, int& offset, int& max_size); bool getSettingsParameters(SettingsType settingsType, int index, int& max_index, int& offset, int& max_size, int& struct_size); -#ifndef BUILD_MINIMAL_OTA -bool showSettingsFileLayout = false; -#endif - #endif // DATASTRUCTS_SETTINGSTYPE_H \ No newline at end of file diff --git a/src/src/Globals/ESPEasyWiFiEvent.cpp b/src/src/Globals/ESPEasyWiFiEvent.cpp new file mode 100644 index 000000000..71f4b6893 --- /dev/null +++ b/src/src/Globals/ESPEasyWiFiEvent.cpp @@ -0,0 +1,54 @@ +#include "../Globals/ESPEasyWiFiEvent.h" + +#include "../../ESPEasy_common.h" + + +unsigned long connectionFailures = 0; + +#ifdef ESP8266 +WiFiEventHandler stationConnectedHandler; +WiFiEventHandler stationDisconnectedHandler; +WiFiEventHandler stationGotIpHandler; +WiFiEventHandler stationModeDHCPTimeoutHandler; +WiFiEventHandler APModeStationConnectedHandler; +WiFiEventHandler APModeStationDisconnectedHandler; +#endif // ifdef ESP8266 + + +// WiFi related data +bool wifiSetup = false; +bool wifiSetupConnect = false; +uint8_t lastBSSID[6] = { 0 }; +uint8_t wifiStatus = ESPEASY_WIFI_DISCONNECTED; +unsigned long last_wifi_connect_attempt_moment = 0; +unsigned int wifi_connect_attempt = 0; +int wifi_reconnects = -1; // First connection attempt is not a reconnect. +uint8_t lastWiFiSettings = 0; +String last_ssid; +bool bssid_changed = false; +bool channel_changed = false; +uint8_t last_channel = 0; +WiFiDisconnectReason lastDisconnectReason = WIFI_DISCONNECT_REASON_UNSPECIFIED; +unsigned long lastConnectMoment = 0; +unsigned long lastDisconnectMoment = 0; +unsigned long lastGetIPmoment = 0; +unsigned long lastGetScanMoment = 0; +unsigned long lastConnectedDuration = 0; +bool intent_to_reboot = false; +uint8_t lastMacConnectedAPmode[6] = { 0 }; +uint8_t lastMacDisconnectedAPmode[6] = { 0 }; + +// uint32_t scan_done_status = 0; +// uint8_t scan_done_scan_id = 0; +uint8_t scan_done_number = 0; + +// Semaphore like bools for processing data gathered from WiFi events. +volatile bool processedConnect = true; +volatile bool processedDisconnect = true; +volatile bool processedGotIP = true; +volatile bool processedDHCPTimeout = true; +volatile bool processedConnectAPmode = true; +volatile bool processedDisconnectAPmode = true; +volatile bool processedScanDone = true; +bool wifiConnectAttemptNeeded = true; +bool wifiConnectInProgress = false; diff --git a/src/src/Globals/ESPEasyWiFiEvent.h b/src/src/Globals/ESPEasyWiFiEvent.h new file mode 100644 index 000000000..c6ba74086 --- /dev/null +++ b/src/src/Globals/ESPEasyWiFiEvent.h @@ -0,0 +1,112 @@ +#ifndef GLOBALS_ESPEASYWIFIEVENT_H +#define GLOBALS_ESPEASYWIFIEVENT_H + +#include +#include +#include + +// WifiStatus +#define ESPEASY_WIFI_DISCONNECTED 0 +#define ESPEASY_WIFI_CONNECTED 1 +#define ESPEASY_WIFI_GOT_IP 2 +#define ESPEASY_WIFI_SERVICES_INITIALIZED 4 + + +extern unsigned long connectionFailures; + + +#ifdef ESP32 +# include + + +enum WiFiDisconnectReason +{ + WIFI_DISCONNECT_REASON_UNSPECIFIED = 1, + WIFI_DISCONNECT_REASON_AUTH_EXPIRE = 2, + WIFI_DISCONNECT_REASON_AUTH_LEAVE = 3, + WIFI_DISCONNECT_REASON_ASSOC_EXPIRE = 4, + WIFI_DISCONNECT_REASON_ASSOC_TOOMANY = 5, + WIFI_DISCONNECT_REASON_NOT_AUTHED = 6, + WIFI_DISCONNECT_REASON_NOT_ASSOCED = 7, + WIFI_DISCONNECT_REASON_ASSOC_LEAVE = 8, + WIFI_DISCONNECT_REASON_ASSOC_NOT_AUTHED = 9, + WIFI_DISCONNECT_REASON_DISASSOC_PWRCAP_BAD = 10, /* 11h */ + WIFI_DISCONNECT_REASON_DISASSOC_SUPCHAN_BAD = 11, /* 11h */ + WIFI_DISCONNECT_REASON_IE_INVALID = 13, /* 11i */ + WIFI_DISCONNECT_REASON_MIC_FAILURE = 14, /* 11i */ + WIFI_DISCONNECT_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, /* 11i */ + WIFI_DISCONNECT_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, /* 11i */ + WIFI_DISCONNECT_REASON_IE_IN_4WAY_DIFFERS = 17, /* 11i */ + WIFI_DISCONNECT_REASON_GROUP_CIPHER_INVALID = 18, /* 11i */ + WIFI_DISCONNECT_REASON_PAIRWISE_CIPHER_INVALID = 19, /* 11i */ + WIFI_DISCONNECT_REASON_AKMP_INVALID = 20, /* 11i */ + WIFI_DISCONNECT_REASON_UNSUPP_RSN_IE_VERSION = 21, /* 11i */ + WIFI_DISCONNECT_REASON_INVALID_RSN_IE_CAP = 22, /* 11i */ + WIFI_DISCONNECT_REASON_802_1X_AUTH_FAILED = 23, /* 11i */ + WIFI_DISCONNECT_REASON_CIPHER_SUITE_REJECTED = 24, /* 11i */ + + WIFI_DISCONNECT_REASON_BEACON_TIMEOUT = 200, + WIFI_DISCONNECT_REASON_NO_AP_FOUND = 201, + WIFI_DISCONNECT_REASON_AUTH_FAIL = 202, + WIFI_DISCONNECT_REASON_ASSOC_FAIL = 203, + WIFI_DISCONNECT_REASON_HANDSHAKE_TIMEOUT = 204 +}; + +void WiFiEvent(system_event_id_t event, + system_event_info_t info); +#endif // ifdef ESP32 + +#ifdef ESP8266 +# include +# include +class IPAddress; + +extern WiFiEventHandler stationConnectedHandler; +extern WiFiEventHandler stationDisconnectedHandler; +extern WiFiEventHandler stationGotIpHandler; +extern WiFiEventHandler stationModeDHCPTimeoutHandler; +extern WiFiEventHandler APModeStationConnectedHandler; +extern WiFiEventHandler APModeStationDisconnectedHandler; +#endif // ifdef ESP8266 + + +// WiFi related data +extern bool wifiSetup; +extern bool wifiSetupConnect; +extern uint8_t lastBSSID[6]; +extern uint8_t wifiStatus; +extern unsigned long last_wifi_connect_attempt_moment; +extern unsigned int wifi_connect_attempt; +extern int wifi_reconnects; // First connection attempt is not a reconnect. +extern uint8_t lastWiFiSettings; +extern String last_ssid; +extern bool bssid_changed; +extern bool channel_changed; +extern uint8_t last_channel; +extern WiFiDisconnectReason lastDisconnectReason; +extern unsigned long lastConnectMoment; +extern unsigned long lastDisconnectMoment; +extern unsigned long lastGetIPmoment; +extern unsigned long lastGetScanMoment; +extern unsigned long lastConnectedDuration; +extern bool intent_to_reboot; +extern uint8_t lastMacConnectedAPmode[6]; +extern uint8_t lastMacDisconnectedAPmode[6]; + +// uint32_t scan_done_status = 0; +extern uint8_t scan_done_number; + +// uint8_t scan_done_scan_id = 0; + +// Semaphore like bools for processing data gathered from WiFi events. +extern volatile bool processedConnect; +extern volatile bool processedDisconnect; +extern volatile bool processedGotIP; +extern volatile bool processedDHCPTimeout; +extern volatile bool processedConnectAPmode; +extern volatile bool processedDisconnectAPmode; +extern volatile bool processedScanDone; +extern bool wifiConnectAttemptNeeded; +extern bool wifiConnectInProgress; + +#endif // GLOBALS_ESPEASYWIFIEVENT_H diff --git a/src/src/Globals/GlobalMapPortStatus.cpp b/src/src/Globals/GlobalMapPortStatus.cpp new file mode 100644 index 000000000..0b000be7b --- /dev/null +++ b/src/src/Globals/GlobalMapPortStatus.cpp @@ -0,0 +1,3 @@ +#include "src/Globals/GlobalMapPortStatus.h" + +MapPortStatus globalMapPortStatus; \ No newline at end of file diff --git a/src/src/Globals/GlobalMapPortStatus.h b/src/src/Globals/GlobalMapPortStatus.h new file mode 100644 index 000000000..3fbb91a50 --- /dev/null +++ b/src/src/Globals/GlobalMapPortStatus.h @@ -0,0 +1,9 @@ +#ifndef GLOBALS_GLOBAL_MAP_PORT_STATUS_H +#define GLOBALS_GLOBAL_MAP_PORT_STATUS_H + +#include "src/DataStructs/PortStatusStruct.h" + +extern MapPortStatus globalMapPortStatus; + + +#endif // GLOBALS_GLOBAL_MAP_PORT_STATUS_H \ No newline at end of file diff --git a/src/src/Globals/Logging.cpp b/src/src/Globals/Logging.cpp index 91496a827..daaf52c60 100644 --- a/src/src/Globals/Logging.cpp +++ b/src/src/Globals/Logging.cpp @@ -5,6 +5,7 @@ LogStruct Logging; +uint8_t highest_active_log_level = 0; +bool log_to_serial_disabled = false; -uint8_t highest_active_log_level(0); -bool log_to_serial_disabled(false); +std::deque serialWriteBuffer; \ No newline at end of file diff --git a/src/src/Globals/Logging.h b/src/src/Globals/Logging.h index 4018dc29d..a225b004b 100644 --- a/src/src/Globals/Logging.h +++ b/src/src/Globals/Logging.h @@ -3,6 +3,7 @@ #include +#include extern uint8_t highest_active_log_level; extern bool log_to_serial_disabled; @@ -10,4 +11,9 @@ extern bool log_to_serial_disabled; struct LogStruct; extern LogStruct Logging; +/*********************************************************************************************\ + * Buffer for outputting logs via serial port. +\*********************************************************************************************/ +extern std::deque serialWriteBuffer; + #endif // GLOBALS_LOGGING_H \ No newline at end of file diff --git a/src/src/Globals/MQTT.cpp b/src/src/Globals/MQTT.cpp new file mode 100644 index 000000000..6043f6b7a --- /dev/null +++ b/src/src/Globals/MQTT.cpp @@ -0,0 +1,17 @@ +#include "../Globals/MQTT.h" + +#ifdef USES_MQTT + +// MQTT client +WiFiClient mqtt; +PubSubClient MQTTclient(mqtt); +bool MQTTclient_should_reconnect = true; +bool MQTTclient_connected = false; +int mqtt_reconnect_count = 0; +#endif // USES_MQTT + +#ifdef USES_P037 + +// mqtt import status +bool P037_MQTTImport_connected = false; +#endif // ifdef USES_P037 diff --git a/src/src/Globals/MQTT.h b/src/src/Globals/MQTT.h new file mode 100644 index 000000000..000e7fa62 --- /dev/null +++ b/src/src/Globals/MQTT.h @@ -0,0 +1,27 @@ +#ifndef GLOBALS_MQTT_H +#define GLOBALS_MQTT_H + +#include "define_plugin_sets.h" + + +#ifdef USES_MQTT + +# include +# include + +// MQTT client +extern WiFiClient mqtt; +extern PubSubClient MQTTclient; +extern bool MQTTclient_should_reconnect; +extern bool MQTTclient_connected; +extern int mqtt_reconnect_count; +#endif // USES_MQTT + +#ifdef USES_P037 + +// mqtt import status +extern bool P037_MQTTImport_connected; +#endif // ifdef USES_P037 + + +#endif // GLOBALS_MQTT_H diff --git a/src/src/Globals/Plugins.cpp b/src/src/Globals/Plugins.cpp index b9e2974a9..e35dfb2d0 100644 --- a/src/src/Globals/Plugins.cpp +++ b/src/src/Globals/Plugins.cpp @@ -1,32 +1,8 @@ #include "Plugins.h" #include "src/DataStructs/ESPEasy_EventStruct.h" #include "ESPEasy_plugindefs.h" +#include "src/Globals/Settings.h" -int getPluginId_from_TaskIndex(byte taskIndex) { - if (taskIndex >= Task_id_to_Plugin_id.size()) - { - return 0; - } - return Task_id_to_Plugin_id[taskIndex]; -} - -/* -// TODO TD-er: Move from _Plugin.ino as soon as Settings is global defined. -int getPluginId(byte taskId) { - if (taskId < TASKS_MAX) { - int retry = 1; - while (retry >= 0) { - int plugin = Task_id_to_Plugin_id[taskId]; - if (plugin >= 0 && plugin < PLUGIN_MAX) { - if (Plugin_id[plugin] == Settings.TaskDeviceNumber[taskId]) - return plugin; - } - updateTaskPluginCache(); - --retry; - } - } - return -1; -} void updateTaskPluginCache() { ++countFindPluginId; // Used for statistics. @@ -42,7 +18,23 @@ void updateTaskPluginCache() { } } } -*/ + +int getPluginId_from_TaskIndex(byte taskIndex) { + if (taskIndex < TASKS_MAX) { + int retry = 1; + while (retry >= 0) { + int plugin = Task_id_to_Plugin_id[taskIndex]; + if (plugin >= 0 && plugin < PLUGIN_MAX) { + if (Plugin_id[plugin] == Settings.TaskDeviceNumber[taskIndex]) + return plugin; + } + updateTaskPluginCache(); + --retry; + } + } + return -1; +} + /********************************************************************************************\ diff --git a/src/src/Globals/Plugins.h b/src/src/Globals/Plugins.h index d69378f26..e344e762d 100644 --- a/src/src/Globals/Plugins.h +++ b/src/src/Globals/Plugins.h @@ -5,7 +5,6 @@ #include "src/DataStructs/ESPEasyLimits.h" -//int getPluginId(byte taskId); int getPluginId_from_TaskIndex(byte taskIndex); String getPluginNameFromDeviceIndex(byte deviceIndex); diff --git a/src/src/Globals/Services.cpp b/src/src/Globals/Services.cpp new file mode 100644 index 000000000..156e058ce --- /dev/null +++ b/src/src/Globals/Services.cpp @@ -0,0 +1,17 @@ +#include "../Globals/Services.h" + +#ifdef FEATURE_ARDUINO_OTA + bool ArduinoOTAtriggered=false; +#endif + + +#ifdef ESP8266 + ESP8266WebServer WebServer(80); + ESP8266HTTPUpdateServer httpUpdater(true); +#endif + +/* +#ifdef ESP32 + WebServer WebServer(80); +#endif +*/ \ No newline at end of file diff --git a/src/src/Globals/Services.h b/src/src/Globals/Services.h new file mode 100644 index 000000000..94adea227 --- /dev/null +++ b/src/src/Globals/Services.h @@ -0,0 +1,43 @@ +#ifndef GLOBALS_SERVICES_H +#define GLOBALS_SERVICES_H + +#include "ESPEasy_common.h" + +#ifdef FEATURE_ARDUINO_OTA + #include + #ifdef ESP8266 + #include + #endif + #ifdef ESP32 + #include + #endif + + extern bool ArduinoOTAtriggered; +#endif + + +#ifdef ESP8266 + + #include + #include + #include + + extern ESP8266WebServer WebServer; + extern ESP8266HTTPUpdateServer httpUpdater; + +#endif + +// FIXME TD-er: For now declared in ESPEasy.ino +/* +#ifdef ESP32 + + #include + #include + + extern WebServer WebServer; + +#endif +*/ + + +#endif // GLOBALS_SERVICES_H \ No newline at end of file diff --git a/src/src/Globals/Statistics.cpp b/src/src/Globals/Statistics.cpp new file mode 100644 index 000000000..a74491385 --- /dev/null +++ b/src/src/Globals/Statistics.cpp @@ -0,0 +1,28 @@ +#include "../Globals/Statistics.h" + +#include + +uint32_t lowestRAM = 0; +String lowestRAMfunction; +uint32_t lowestFreeStack = 0; +String lowestFreeStackfunction; + +uint8_t lastBootCause = BOOT_CAUSE_MANUAL_REBOOT; +unsigned long lastMixedSchedulerId_beforereboot = 0; + +unsigned long idle_msec_per_sec = 0; +unsigned long elapsed10ps = 0; +unsigned long elapsed10psU = 0; +unsigned long elapsed50ps = 0; +unsigned long loopCounter = 0; +unsigned long loopCounterLast = 0; +unsigned long loopCounterMax = 1; +unsigned long lastLoopStart = 0; +unsigned long shortestLoop = 10000000; +unsigned long longestLoop = 0; +unsigned long loopCounter_full = 1; +float loop_usec_duration_total = 0.0; + + +unsigned long dailyResetCounter = 0; +volatile unsigned long sw_watchdog_callback_count = 0; diff --git a/src/src/Globals/Statistics.h b/src/src/Globals/Statistics.h new file mode 100644 index 000000000..7ec4199e5 --- /dev/null +++ b/src/src/Globals/Statistics.h @@ -0,0 +1,34 @@ +#ifndef GLOBALS_STATISTICS_H +#define GLOBALS_STATISTICS_H + +#include + +class String; + +#define BOOT_CAUSE_MANUAL_REBOOT 0 +#define BOOT_CAUSE_COLD_BOOT 1 +#define BOOT_CAUSE_DEEP_SLEEP 2 +#define BOOT_CAUSE_EXT_WD 10 + +extern uint32_t lowestRAM; +extern String lowestRAMfunction; +extern uint32_t lowestFreeStack; +extern String lowestFreeStackfunction; + +extern uint8_t lastBootCause; +extern unsigned long lastMixedSchedulerId_beforereboot; + +extern unsigned long loopCounter; +extern unsigned long loopCounterLast; +extern unsigned long loopCounterMax; +extern unsigned long lastLoopStart; +extern unsigned long shortestLoop; +extern unsigned long longestLoop; +extern unsigned long loopCounter_full; +extern float loop_usec_duration_total; + +extern unsigned long dailyResetCounter; +extern volatile unsigned long sw_watchdog_callback_count; + + +#endif // GLOBALS_STATISTICS_H diff --git a/src/src/Static/WebStaticData.h b/src/src/Static/WebStaticData.h new file mode 100644 index 000000000..f47c1a088 --- /dev/null +++ b/src/src/Static/WebStaticData.h @@ -0,0 +1,114 @@ +#ifndef WEBSTATICDATA_h +#define WEBSTATICDATA_h + +#define PGMT( pgm_ptr ) ( reinterpret_cast< const __FlashStringHelper * >( pgm_ptr ) ) + +/*********************************************************************************************\ + * ESP Easy logo Favicon.ico 16x16 8 bit +\*********************************************************************************************/ +// Generated using xxd: xxd -i favicon.ico > favicon.ino +static const char favicon_8b_ico[] PROGMEM = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, + 0x20, 0x00, 0x70, 0x01, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x89, 0x50, + 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, + 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, + 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x01, 0x37, 0x49, + 0x44, 0x41, 0x54, 0x38, 0x8d, 0x9d, 0x93, 0xbd, 0x4e, 0xc3, 0x30, 0x14, + 0x85, 0x4f, 0x0a, 0x08, 0xc1, 0xd2, 0x64, 0xea, 0xab, 0xb0, 0x74, 0xe2, + 0x11, 0x32, 0x31, 0x31, 0x74, 0xaa, 0x3a, 0x97, 0x15, 0x77, 0x4c, 0x3a, + 0x87, 0x05, 0x31, 0x30, 0xb1, 0x98, 0x37, 0x70, 0xa5, 0x28, 0x5d, 0xc2, + 0xc0, 0xde, 0xbe, 0x40, 0x51, 0xc4, 0xe0, 0x86, 0x36, 0x55, 0x88, 0x91, + 0xcd, 0x10, 0xc5, 0x24, 0x10, 0xa5, 0x0d, 0x57, 0xf2, 0xf0, 0x59, 0x3a, + 0xf7, 0xe7, 0xe8, 0x5e, 0x38, 0x3e, 0xb7, 0x56, 0xb1, 0xa0, 0x49, 0x26, + 0x55, 0xf1, 0x8a, 0x68, 0xe2, 0x54, 0x48, 0xea, 0xf8, 0xdc, 0xc2, 0x2a, + 0x16, 0x54, 0xfd, 0x0a, 0x2f, 0x8c, 0x95, 0x17, 0xc6, 0x9a, 0xdd, 0x80, + 0xd7, 0x72, 0x2a, 0x24, 0xed, 0x74, 0xcf, 0x8e, 0x6c, 0x00, 0xd8, 0x09, + 0x05, 0x00, 0x98, 0xce, 0xd7, 0x18, 0xdd, 0xbf, 0xe1, 0x7d, 0x2b, 0x35, + 0xdf, 0x3c, 0x46, 0x9a, 0x27, 0xb3, 0x9c, 0x93, 0x4c, 0xe2, 0xf4, 0xd8, + 0xb0, 0x51, 0x6e, 0xd1, 0x0d, 0xb8, 0xc2, 0x60, 0xa1, 0x08, 0xe3, 0xb5, + 0x4c, 0x58, 0x95, 0x93, 0x4c, 0x2a, 0x9d, 0xa0, 0xad, 0x58, 0x27, 0x28, + 0x66, 0x6e, 0x23, 0x26, 0xec, 0xc7, 0x13, 0x9d, 0xa0, 0x8d, 0x18, 0x83, + 0x85, 0x72, 0x83, 0x9c, 0x1b, 0x3d, 0xd8, 0x27, 0x6e, 0xf4, 0x60, 0x9f, + 0xb8, 0xe2, 0xc1, 0x7f, 0x2a, 0xff, 0x31, 0xb1, 0x4d, 0xe5, 0x4a, 0x07, + 0x65, 0x0f, 0x0e, 0xa9, 0x4c, 0x18, 0x57, 0x84, 0x71, 0xbd, 0xd6, 0x3a, + 0xc1, 0x21, 0x95, 0x09, 0xe3, 0x0a, 0xc3, 0xa5, 0xc2, 0x70, 0xa9, 0xff, + 0x3b, 0xe7, 0x27, 0x06, 0xa6, 0xf3, 0x35, 0xc8, 0x53, 0x04, 0x72, 0xd5, + 0xc3, 0xed, 0xa5, 0x89, 0xc9, 0x2c, 0x67, 0xf7, 0xba, 0x87, 0x71, 0xdf, + 0xd4, 0x6b, 0x5e, 0x17, 0x46, 0x2a, 0x24, 0x7d, 0x78, 0xdd, 0xd8, 0x49, + 0x26, 0x31, 0xee, 0x9b, 0x00, 0x80, 0xbb, 0x97, 0x0f, 0x94, 0xb9, 0x88, + 0x9d, 0x50, 0xf0, 0xc2, 0x18, 0x00, 0x30, 0xba, 0xe8, 0x62, 0xfb, 0x29, + 0x9f, 0xe1, 0xf8, 0xdc, 0x4a, 0x85, 0xa4, 0xc5, 0x8c, 0x75, 0xe7, 0x5b, + 0x77, 0xea, 0xd1, 0xe6, 0x8b, 0x3a, 0x3e, 0xb7, 0xbe, 0x01, 0x4d, 0x0a, + 0x09, 0x35, 0x8e, 0xf2, 0xa6, 0xea, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, + 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +static const unsigned int favicon_8b_ico_len = 390; + +static const char githublogo[] PROGMEM = { + "" +}; + +static const char DATA_GITHUB_CLIPBOARD_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x74,0x47,0x69,0x74,0x68,0x75,0x62,0x43,0x6c,0x69,0x70,0x62,0x6f,0x61,0x72,0x64,0x28,0x29,0x7b,0x76,0x61,0x72,0x20,0x65,0x3d,0x22,0x45,0x53,0x50,0x20,0x45,0x61,0x73,0x79,0x20,0x7c,0x20,0x49,0x6e,0x66,0x6f,0x72,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x20,0x7c,0x5c,0x6e,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x7c,0x2d,0x2d,0x2d,0x2d,0x2d,0x7c,0x5c,0x6e,0x22,0x3b,0x6d,0x61,0x78,0x5f,0x6c,0x6f,0x6f,0x70,0x3d,0x31,0x30,0x30,0x3b,0x66,0x6f,0x72,0x28,0x76,0x61,0x72,0x20,0x6f,0x3d,0x31,0x3b,0x6f,0x3c,0x6d,0x61,0x78,0x5f,0x6c,0x6f,0x6f,0x70,0x3b,0x6f,0x2b,0x2b,0x29,0x7b,0x76,0x61,0x72,0x20,0x6e,0x3d,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x22,0x2b,0x6f,0x2c,0x74,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x6e,0x29,0x3b,0x69,0x66,0x28,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x74,0x29,0x6f,0x3d,0x6d,0x61,0x78,0x5f,0x6c,0x6f,0x6f,0x70,0x2b,0x31,0x3b,0x65,0x6c,0x73,0x65,0x7b,0x76,0x61,0x72,0x20,0x61,0x3d,0x22,0x7c,0x22,0x3b,0x6f,0x25,0x32,0x3d,0x3d,0x30,0x26,0x26,0x28,0x61,0x2b,0x3d,0x22,0x5c,0x6e,0x22,0x29,0x2c,0x65,0x2b,0x3d,0x74,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2e,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x28,0x2f,0x3c,0x5b,0x42,0x62,0x5d,0x5b,0x52,0x72,0x5d,0x5c,0x73,0x2a,0x5c,0x2f,0x3f,0x3e,0x2f,0x67,0x69,0x6d,0x2c,0x22,0x5c,0x6e,0x22,0x29,0x2b,0x61,0x7d,0x7d,0x65,0x3d,0x28,0x65,0x3d,0x65,0x2e,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x28,0x2f,0x3c,0x5c,0x2f,0x5b,0x44,0x64,0x5d,0x5b,0x49,0x69,0x5d,0x5b,0x56,0x76,0x5d,0x5c,0x73,0x2a,0x5c,0x2f,0x3f,0x3e,0x2f,0x67,0x69,0x6d,0x2c,0x22,0x5c,0x6e,0x22,0x29,0x29,0x2e,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x28,0x2f,0x3c,0x5b,0x5e,0x3e,0x5d,0x2a,0x3e,0x2f,0x67,0x69,0x6d,0x2c,0x22,0x22,0x29,0x3b,0x76,0x61,0x72,0x20,0x6c,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x63,0x72,0x65,0x61,0x74,0x65,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x28,0x22,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x22,0x29,0x3b,0x6c,0x2e,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x20,0x2d,0x31,0x30,0x30,0x30,0x70,0x78,0x3b,0x20,0x74,0x6f,0x70,0x3a,0x20,0x2d,0x31,0x30,0x30,0x30,0x70,0x78,0x22,0x2c,0x6c,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x65,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x62,0x6f,0x64,0x79,0x2e,0x61,0x70,0x70,0x65,0x6e,0x64,0x43,0x68,0x69,0x6c,0x64,0x28,0x6c,0x29,0x2c,0x6c,0x2e,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x65,0x78,0x65,0x63,0x43,0x6f,0x6d,0x6d,0x61,0x6e,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x22,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x62,0x6f,0x64,0x79,0x2e,0x72,0x65,0x6d,0x6f,0x76,0x65,0x43,0x68,0x69,0x6c,0x64,0x28,0x6c,0x29,0x2c,0x61,0x6c,0x65,0x72,0x74,0x28,0x27,0x43,0x6f,0x70,0x69,0x65,0x64,0x3a,0x20,0x22,0x27,0x2b,0x65,0x2b,0x27,0x22,0x20,0x74,0x6f,0x20,0x63,0x6c,0x69,0x70,0x62,0x6f,0x61,0x72,0x64,0x21,0x27,0x29,0x7d, 0}; + +static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = {0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x68,0x31,0x2c,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x7d,0x68,0x31,0x2c,0x68,0x36,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x27,0x27,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x6c,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x72,0x69,0x67,0x68,0x74,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2a,0x7b,0x62,0x6f,0x78,0x2d,0x73,0x69,0x7a,0x69,0x6e,0x67,0x3a,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x78,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x30,0x7d,0x68,0x31,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x38,0x70,0x78,0x20,0x30,0x7d,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x7d,0x68,0x32,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x20,0x2d,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x7d,0x68,0x33,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x45,0x45,0x45,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x31,0x36,0x70,0x78,0x20,0x2d,0x34,0x70,0x78,0x20,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x68,0x36,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x30,0x70,0x74,0x7d,0x63,0x6f,0x64,0x65,0x2c,0x6b,0x62,0x64,0x2c,0x70,0x72,0x65,0x2c,0x73,0x61,0x6d,0x70,0x2c,0x74,0x74,0x2c,0x78,0x6d,0x70,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x65,0x6d,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x2c,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x77,0x69,0x64,0x65,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x72,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x70,0x78,0x20,0x34,0x70,0x78,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x33,0x36,0x39,0x7d,0x69,0x6e,0x70,0x75,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2e,0x77,0x69,0x64,0x65,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2e,0x77,0x69,0x64,0x65,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x2e,0x77,0x69,0x64,0x65,0x6e,0x75,0x6d,0x62,0x65,0x72,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x33,0x35,0x70,0x78,0x3b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x79,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x35,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x2d,0x6d,0x73,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x30,0x20,0x33,0x70,0x78,0x20,0x33,0x70,0x78,0x20,0x30,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x31,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x37,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x33,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x70,0x78,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x2c,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x39,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x36,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x36,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x38,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x38,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x70,0x78,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x27,0x4c,0x75,0x63,0x69,0x64,0x61,0x20,0x43,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x27,0x2c,0x4d,0x6f,0x6e,0x61,0x63,0x6f,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x37,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x32,0x38,0x32,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x2d,0x31,0x32,0x35,0x70,0x78,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x36,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x68,0x69,0x64,0x64,0x65,0x6e,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2e,0x73,0x68,0x6f,0x77,0x7b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x76,0x69,0x73,0x69,0x62,0x6c,0x65,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x30,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x31,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x43,0x46,0x46,0x39,0x35,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x32,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x39,0x44,0x43,0x45,0x46,0x45,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x33,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x41,0x34,0x46,0x43,0x37,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x34,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x32,0x41,0x42,0x33,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x39,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x35,0x30,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x32,0x37,0x32,0x37,0x32,0x37,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x35,0x33,0x30,0x70,0x78,0x3b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x3a,0x61,0x75,0x74,0x6f,0x7d,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x68,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x68,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x38,0x38,0x38,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x3b,0x61,0x6c,0x69,0x67,0x6e,0x2d,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3a,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x32,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x72,0x7b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x3a,0x6e,0x74,0x68,0x2d,0x63,0x68,0x69,0x6c,0x64,0x28,0x65,0x76,0x65,0x6e,0x29,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x44,0x45,0x45,0x36,0x46,0x46,0x7d,0x2e,0x68,0x69,0x67,0x68,0x6c,0x69,0x67,0x68,0x74,0x20,0x74,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x64,0x62,0x66,0x66,0x30,0x30,0x37,0x35,0x7d,0x2e,0x61,0x70,0x68,0x65,0x61,0x64,0x65,0x72,0x2c,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x38,0x46,0x38,0x46,0x38,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x38,0x70,0x78,0x20,0x31,0x32,0x70,0x78,0x7d,0x2e,0x6e,0x6f,0x74,0x65,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x69,0x74,0x61,0x6c,0x69,0x63,0x7d,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x44,0x44,0x44,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x39,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x72,0x69,0x67,0x68,0x74,0x3a,0x30,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x2e,0x62,0x6f,0x64,0x79,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x39,0x36,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x62,0x61,0x72,0x7b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x69,0x6e,0x68,0x65,0x72,0x69,0x74,0x3b,0x74,0x6f,0x70,0x3a,0x35,0x35,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x20,0x34,0x70,0x78,0x20,0x30,0x20,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x70,0x78,0x20,0x31,0x70,0x78,0x20,0x31,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x68,0x69,0x74,0x65,0x2d,0x73,0x70,0x61,0x63,0x65,0x3a,0x6e,0x6f,0x77,0x72,0x61,0x70,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x2e,0x61,0x63,0x74,0x69,0x76,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x20,0x23,0x44,0x44,0x44,0x20,0x23,0x46,0x46,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x44,0x45,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6f,0x6e,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x65,0x6e,0x7d,0x2e,0x6f,0x66,0x66,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x38,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x32,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x70,0x78,0x20,0x31,0x30,0x70,0x78,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x2c,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x35,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x30,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x62,0x72,0x7b,0x63,0x6c,0x65,0x61,0x72,0x3a,0x62,0x6f,0x74,0x68,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x34,0x34,0x33,0x33,0x36,0x7d,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x63,0x61,0x31,0x37,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x32,0x32,0x70,0x78,0x3b,0x6c,0x69,0x6e,0x65,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x31,0x35,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x2e,0x33,0x73,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x7b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x2d,0x78,0x3a,0x61,0x75,0x74,0x6f,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x40,0x6d,0x65,0x64,0x69,0x61,0x20,0x73,0x63,0x72,0x65,0x65,0x6e,0x20,0x61,0x6e,0x64,0x20,0x28,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x39,0x36,0x30,0x70,0x78,0x29,0x7b,0x2e,0x73,0x68,0x6f,0x77,0x6d,0x65,0x6e,0x75,0x6c,0x61,0x62,0x65,0x6c,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x31,0x76,0x77,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x38,0x70,0x78,0x7d,0x7d,0x0a, 0}; + + +// JavaScript blobs + +static const char DATA_REBOOT_JS[] PROGMEM = {0x69,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x72,0x62,0x74,0x6d,0x73,0x67,0x22,0x29,0x2c,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x50,0x6c,0x65,0x61,0x73,0x65,0x20,0x72,0x65,0x62,0x6f,0x6f,0x74,0x3a,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x69,0x64,0x3d,0x27,0x72,0x65,0x62,0x6f,0x6f,0x74,0x27,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x27,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x6c,0x69,0x6e,0x6b,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x52,0x65,0x62,0x6f,0x6f,0x74,0x27,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x27,0x72,0x28,0x29,0x27,0x3e,0x22,0x3b,0x76,0x61,0x72,0x20,0x78,0x3d,0x6e,0x65,0x77,0x20,0x58,0x4d,0x4c,0x48,0x74,0x74,0x70,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x3b,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x64,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x22,0x2c,0x63,0x6c,0x65,0x61,0x72,0x54,0x69,0x6d,0x65,0x6f,0x75,0x74,0x28,0x74,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x63,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x2e,0x22,0x2c,0x78,0x2e,0x6f,0x6e,0x6c,0x6f,0x61,0x64,0x3d,0x64,0x2c,0x78,0x2e,0x6f,0x70,0x65,0x6e,0x28,0x22,0x47,0x45,0x54,0x22,0x2c,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2e,0x6f,0x72,0x69,0x67,0x69,0x6e,0x29,0x2c,0x78,0x2e,0x73,0x65,0x6e,0x64,0x28,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x62,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x52,0x65,0x62,0x6f,0x6f,0x74,0x69,0x6e,0x67,0x2e,0x2e,0x22,0x2c,0x74,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x63,0x2c,0x32,0x65,0x33,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x72,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x20,0x28,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x69,0x6e,0x67,0x29,0x22,0x2c,0x78,0x2e,0x6f,0x6e,0x6c,0x6f,0x61,0x64,0x3d,0x62,0x2c,0x78,0x2e,0x6f,0x70,0x65,0x6e,0x28,0x22,0x47,0x45,0x54,0x22,0x2c,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2e,0x6f,0x72,0x69,0x67,0x69,0x6e,0x2b,0x22,0x2f,0x3f,0x63,0x6d,0x64,0x3d,0x72,0x65,0x62,0x6f,0x6f,0x74,0x22,0x29,0x2c,0x78,0x2e,0x73,0x65,0x6e,0x64,0x28,0x29,0x7d, 0}; + +static const char jsToastMessageBegin[] PROGMEM = { + "" +}; + +static const char jsClipboardCopyPart1[] PROGMEM = { + "" +}; + +static const char DATA_UPDATE_SENSOR_VALUES_DEVICE_PAGE_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x73,0x29,0x7b,0x76,0x61,0x72,0x20,0x61,0x2c,0x6c,0x2c,0x6f,0x3d,0x30,0x3b,0x69,0x73,0x4e,0x61,0x4e,0x28,0x73,0x29,0x26,0x26,0x28,0x73,0x3d,0x31,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x65,0x26,0x26,0x28,0x65,0x3d,0x31,0x65,0x33,0x29,0x3b,0x76,0x61,0x72,0x20,0x6e,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x6f,0x3e,0x30,0x3f,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x3a,0x2b,0x2b,0x73,0x3e,0x31,0x3f,0x6f,0x3d,0x31,0x3a,0x28,0x66,0x65,0x74,0x63,0x68,0x28,0x22,0x2f,0x6a,0x73,0x6f,0x6e,0x3f,0x76,0x69,0x65,0x77,0x3d,0x73,0x65,0x6e,0x73,0x6f,0x72,0x75,0x70,0x64,0x61,0x74,0x65,0x22,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x76,0x61,0x72,0x20,0x6f,0x3b,0x32,0x30,0x30,0x3d,0x3d,0x3d,0x73,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x3f,0x73,0x2e,0x6a,0x73,0x6f,0x6e,0x28,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x66,0x6f,0x72,0x28,0x65,0x3d,0x73,0x2e,0x54,0x54,0x4c,0x2c,0x61,0x3d,0x30,0x3b,0x61,0x3c,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x61,0x2b,0x2b,0x29,0x69,0x66,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x68,0x61,0x73,0x4f,0x77,0x6e,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x28,0x22,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x22,0x29,0x29,0x66,0x6f,0x72,0x28,0x6c,0x3d,0x30,0x3b,0x6c,0x3c,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x6c,0x2b,0x2b,0x29,0x74,0x72,0x79,0x7b,0x6f,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x7d,0x63,0x61,0x74,0x63,0x68,0x28,0x65,0x29,0x7b,0x6f,0x3d,0x65,0x2e,0x6e,0x61,0x6d,0x65,0x7d,0x66,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x7b,0x69,0x66,0x28,0x22,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x22,0x21,0x3d,0x3d,0x6f,0x29,0x7b,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x2c,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x56,0x61,0x6c,0x75,0x65,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x4e,0x72,0x44,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x2c,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x3d,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0x76,0x61,0x72,0x20,0x72,0x3d,0x22,0x76,0x61,0x6c,0x75,0x65,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2b,0x22,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2c,0x74,0x3d,0x22,0x76,0x61,0x6c,0x75,0x65,0x6e,0x61,0x6d,0x65,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2b,0x22,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2c,0x75,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x72,0x29,0x2c,0x63,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x74,0x29,0x3b,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x3d,0x75,0x26,0x26,0x28,0x75,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x3d,0x63,0x26,0x26,0x28,0x63,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x4e,0x61,0x6d,0x65,0x2b,0x22,0x3a,0x22,0x29,0x7d,0x7d,0x65,0x3d,0x73,0x2e,0x54,0x54,0x4c,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x3a,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x22,0x4c,0x6f,0x6f,0x6b,0x73,0x20,0x6c,0x69,0x6b,0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x77,0x61,0x73,0x20,0x61,0x20,0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0x2e,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x20,0x43,0x6f,0x64,0x65,0x3a,0x20,0x22,0x2b,0x73,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x29,0x7d,0x29,0x2e,0x63,0x61,0x74,0x63,0x68,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x73,0x2e,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x29,0x2c,0x65,0x3d,0x35,0x65,0x33,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x2c,0x6f,0x3d,0x31,0x29,0x7d,0x2c,0x65,0x29,0x7d,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x31,0x65,0x33,0x2c,0x30,0x29,0x3b, 0}; + + +static const char DATA_FETCH_AND_PARSE_LOG_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x67,0x65,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x28,0x29,0x7b,0x76,0x61,0x72,0x20,0x65,0x2c,0x6f,0x3d,0x6e,0x61,0x76,0x69,0x67,0x61,0x74,0x6f,0x72,0x2e,0x75,0x73,0x65,0x72,0x41,0x67,0x65,0x6e,0x74,0x2c,0x74,0x3d,0x6f,0x2e,0x6d,0x61,0x74,0x63,0x68,0x28,0x2f,0x28,0x6f,0x70,0x65,0x72,0x61,0x7c,0x63,0x68,0x72,0x6f,0x6d,0x65,0x7c,0x73,0x61,0x66,0x61,0x72,0x69,0x7c,0x66,0x69,0x72,0x65,0x66,0x6f,0x78,0x7c,0x6d,0x73,0x69,0x65,0x7c,0x74,0x72,0x69,0x64,0x65,0x6e,0x74,0x28,0x3f,0x3d,0x5c,0x2f,0x29,0x29,0x5c,0x2f,0x3f,0x5c,0x73,0x2a,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x69,0x29,0x7c,0x7c,0x5b,0x5d,0x3b,0x72,0x65,0x74,0x75,0x72,0x6e,0x2f,0x74,0x72,0x69,0x64,0x65,0x6e,0x74,0x2f,0x69,0x2e,0x74,0x65,0x73,0x74,0x28,0x74,0x5b,0x31,0x5d,0x29,0x3f,0x7b,0x6e,0x61,0x6d,0x65,0x3a,0x22,0x49,0x45,0x22,0x2c,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x28,0x65,0x3d,0x2f,0x5c,0x62,0x72,0x76,0x5b,0x20,0x3a,0x5d,0x2b,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x67,0x2e,0x65,0x78,0x65,0x63,0x28,0x6f,0x29,0x7c,0x7c,0x5b,0x5d,0x29,0x5b,0x31,0x5d,0x7c,0x7c,0x22,0x22,0x7d,0x3a,0x22,0x43,0x68,0x72,0x6f,0x6d,0x65,0x22,0x3d,0x3d,0x3d,0x74,0x5b,0x31,0x5d,0x26,0x26,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x28,0x65,0x3d,0x6f,0x2e,0x6d,0x61,0x74,0x63,0x68,0x28,0x2f,0x5c,0x62,0x4f,0x50,0x52,0x7c,0x45,0x64,0x67,0x65,0x5c,0x2f,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x29,0x29,0x3f,0x7b,0x6e,0x61,0x6d,0x65,0x3a,0x22,0x4f,0x70,0x65,0x72,0x61,0x22,0x2c,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x65,0x5b,0x31,0x5d,0x7d,0x3a,0x28,0x74,0x3d,0x74,0x5b,0x32,0x5d,0x3f,0x5b,0x74,0x5b,0x31,0x5d,0x2c,0x74,0x5b,0x32,0x5d,0x5d,0x3a,0x5b,0x6e,0x61,0x76,0x69,0x67,0x61,0x74,0x6f,0x72,0x2e,0x61,0x70,0x70,0x4e,0x61,0x6d,0x65,0x2c,0x6e,0x61,0x76,0x69,0x67,0x61,0x74,0x6f,0x72,0x2e,0x61,0x70,0x70,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x2c,0x22,0x2d,0x3f,0x22,0x5d,0x2c,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x28,0x65,0x3d,0x6f,0x2e,0x6d,0x61,0x74,0x63,0x68,0x28,0x2f,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x5c,0x2f,0x28,0x5c,0x64,0x2b,0x29,0x2f,0x69,0x29,0x29,0x26,0x26,0x74,0x2e,0x73,0x70,0x6c,0x69,0x63,0x65,0x28,0x31,0x2c,0x31,0x2c,0x65,0x5b,0x31,0x5d,0x29,0x2c,0x7b,0x6e,0x61,0x6d,0x65,0x3a,0x74,0x5b,0x30,0x5d,0x2c,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x74,0x5b,0x31,0x5d,0x7d,0x29,0x7d,0x76,0x61,0x72,0x20,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x3d,0x67,0x65,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x28,0x29,0x2c,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x3d,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x6e,0x61,0x6d,0x65,0x2b,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3b,0x28,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x6e,0x61,0x6d,0x65,0x3d,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3c,0x31,0x32,0x29,0x3f,0x74,0x65,0x78,0x74,0x54,0x6f,0x44,0x69,0x73,0x70,0x6c,0x61,0x79,0x3d,0x22,0x45,0x72,0x72,0x6f,0x72,0x3a,0x20,0x22,0x2b,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x42,0x72,0x6f,0x77,0x73,0x65,0x72,0x2b,0x22,0x20,0x69,0x73,0x20,0x6e,0x6f,0x74,0x20,0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x65,0x64,0x21,0x20,0x50,0x6c,0x65,0x61,0x73,0x65,0x20,0x74,0x72,0x79,0x20,0x61,0x20,0x6d,0x6f,0x64,0x65,0x72,0x6e,0x20,0x77,0x65,0x62,0x20,0x62,0x72,0x6f,0x77,0x73,0x65,0x72,0x2e,0x22,0x3a,0x74,0x65,0x78,0x74,0x54,0x6f,0x44,0x69,0x73,0x70,0x6c,0x61,0x79,0x3d,0x22,0x46,0x65,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x6c,0x6f,0x67,0x20,0x65,0x6e,0x74,0x72,0x69,0x65,0x73,0x2e,0x2e,0x2e,0x22,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x74,0x65,0x78,0x74,0x54,0x6f,0x44,0x69,0x73,0x70,0x6c,0x61,0x79,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x31,0x65,0x33,0x2c,0x30,0x29,0x3b,0x76,0x61,0x72,0x20,0x6c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x3d,0x6e,0x65,0x77,0x20,0x41,0x72,0x72,0x61,0x79,0x28,0x22,0x55,0x6e,0x75,0x73,0x65,0x64,0x22,0x2c,0x22,0x45,0x72,0x72,0x6f,0x72,0x22,0x2c,0x22,0x49,0x6e,0x66,0x6f,0x22,0x2c,0x22,0x44,0x65,0x62,0x75,0x67,0x22,0x2c,0x22,0x44,0x65,0x62,0x75,0x67,0x20,0x4d,0x6f,0x72,0x65,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x55,0x6e,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x22,0x2c,0x22,0x44,0x65,0x62,0x75,0x67,0x20,0x44,0x65,0x76,0x22,0x29,0x3b,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x6f,0x29,0x7b,0x76,0x61,0x72,0x20,0x74,0x2c,0x6e,0x3b,0x69,0x73,0x4e,0x61,0x4e,0x28,0x6f,0x29,0x26,0x26,0x28,0x6f,0x3d,0x31,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x65,0x26,0x26,0x28,0x65,0x3d,0x31,0x65,0x33,0x29,0x2c,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x69,0x6e,0x67,0x5f,0x74,0x79,0x70,0x65,0x3d,0x65,0x3c,0x3d,0x35,0x30,0x30,0x3f,0x22,0x61,0x75,0x74,0x6f,0x22,0x3a,0x22,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x22,0x3b,0x76,0x61,0x72,0x20,0x72,0x3d,0x22,0x22,0x2c,0x6c,0x3d,0x30,0x2c,0x73,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x6c,0x3e,0x30,0x3f,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x73,0x29,0x3a,0x28,0x2b,0x2b,0x6f,0x3e,0x31,0x3f,0x6c,0x3d,0x31,0x3a,0x66,0x65,0x74,0x63,0x68,0x28,0x22,0x2f,0x6c,0x6f,0x67,0x6a,0x73,0x6f,0x6e,0x22,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x6f,0x29,0x7b,0x32,0x30,0x30,0x3d,0x3d,0x3d,0x6f,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x3f,0x6f,0x2e,0x6a,0x73,0x6f,0x6e,0x28,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x6f,0x29,0x7b,0x76,0x61,0x72,0x20,0x6c,0x3b,0x66,0x6f,0x72,0x28,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x6e,0x26,0x26,0x28,0x6e,0x3d,0x22,0x22,0x29,0x2c,0x74,0x3d,0x30,0x3b,0x74,0x3c,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x6e,0x72,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x3b,0x2b,0x2b,0x74,0x29,0x74,0x72,0x79,0x7b,0x6c,0x3d,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x7d,0x63,0x61,0x74,0x63,0x68,0x28,0x65,0x29,0x7b,0x6c,0x3d,0x65,0x2e,0x6e,0x61,0x6d,0x65,0x7d,0x66,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x7b,0x22,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x22,0x21,0x3d,0x3d,0x6c,0x26,0x26,0x28,0x72,0x3d,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x2c,0x6e,0x2b,0x3d,0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x22,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x2b,0x22,0x20,0x69,0x64,0x3d,0x22,0x2b,0x72,0x2b,0x27,0x3e,0x3c,0x66,0x6f,0x6e,0x74,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x67,0x72,0x61,0x79,0x22,0x3e,0x27,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x2b,0x22,0x3a,0x3c,0x2f,0x66,0x6f,0x6e,0x74,0x3e,0x20,0x22,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x45,0x6e,0x74,0x72,0x69,0x65,0x73,0x5b,0x74,0x5d,0x2e,0x74,0x65,0x78,0x74,0x2b,0x22,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x29,0x7d,0x65,0x3d,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x54,0x54,0x4c,0x2c,0x22,0x22,0x21,0x3d,0x3d,0x6e,0x26,0x26,0x28,0x22,0x46,0x65,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x6c,0x6f,0x67,0x20,0x65,0x6e,0x74,0x72,0x69,0x65,0x73,0x2e,0x2e,0x2e,0x22,0x3d,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x26,0x26,0x28,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x22,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x6e,0x29,0x2c,0x6e,0x3d,0x22,0x22,0x2c,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x5f,0x6f,0x6e,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x2c,0x31,0x3d,0x3d,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x5f,0x6f,0x6e,0x26,0x26,0x22,0x22,0x21,0x3d,0x3d,0x72,0x26,0x26,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x72,0x29,0x2e,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x49,0x6e,0x74,0x6f,0x56,0x69,0x65,0x77,0x28,0x7b,0x62,0x65,0x68,0x61,0x76,0x69,0x6f,0x72,0x3a,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x69,0x6e,0x67,0x5f,0x74,0x79,0x70,0x65,0x7d,0x29,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x6c,0x6f,0x67,0x6c,0x65,0x76,0x65,0x6c,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x4c,0x6f,0x67,0x67,0x69,0x6e,0x67,0x3a,0x20,0x22,0x2b,0x6c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x5b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x73,0x57,0x65,0x62,0x4c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x5d,0x2b,0x22,0x20,0x28,0x22,0x2b,0x6f,0x2e,0x4c,0x6f,0x67,0x2e,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x73,0x57,0x65,0x62,0x4c,0x6f,0x67,0x4c,0x65,0x76,0x65,0x6c,0x2b,0x22,0x29,0x22,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x73,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x3a,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x22,0x4c,0x6f,0x6f,0x6b,0x73,0x20,0x6c,0x69,0x6b,0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x77,0x61,0x73,0x20,0x61,0x20,0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0x2e,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x20,0x43,0x6f,0x64,0x65,0x3a,0x20,0x22,0x2b,0x6f,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x29,0x7d,0x29,0x2e,0x63,0x61,0x74,0x63,0x68,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x6f,0x29,0x7b,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x3c,0x64,0x69,0x76,0x3e,0x3e,0x3e,0x20,0x22,0x2b,0x6f,0x2e,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2b,0x22,0x20,0x3c,0x3c,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x2c,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x5f,0x6f,0x6e,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x61,0x75,0x74,0x6f,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x2c,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x63,0x6f,0x70,0x79,0x54,0x65,0x78,0x74,0x5f,0x31,0x22,0x29,0x2e,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x65,0x3d,0x35,0x65,0x33,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x73,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x2c,0x6c,0x3d,0x31,0x29,0x7d,0x2c,0x65,0x29,0x7d, 0}; + +#endif // WEBSTATICDATA_h